shopizer-memoizeit
Changes
.idea/libraries/Maven__com_shopizer_shopizer_shipping_canadapost_module_2_5_0_SNAPSHOT.xml 13(+0 -13)
.idea/libraries/Maven__com_shopizer_shopizer_shipping_distance_processor_2_5_0_SNAPSHOT.xml 13(+0 -13)
.idea/libraries/Maven__org_hibernate_common_hibernate_commons_annotations_4_0_5_Final.xml 13(+0 -13)
.idea/libraries/Maven__org_hibernate_javax_persistence_hibernate_jpa_2_1_api_1_0_0_Final.xml 13(+0 -13)
.idea/libraries/Maven__org_jboss_spec_javax_transaction_jboss_transaction_api_1_1_spec_1_0_1_Final.xml 13(+0 -13)
.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_1_3_5_RELEASE.xml 13(+0 -13)
.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_aop_1_3_5_RELEASE.xml 13(+0 -13)
.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_data_jpa_1_3_5_RELEASE.xml 13(+0 -13)
.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_jdbc_1_3_5_RELEASE.xml 13(+0 -13)
.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_1_3_5_RELEASE.xml 13(+0 -13)
.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_security_1_3_5_RELEASE.xml 13(+0 -13)
.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_test_1_3_5_RELEASE.xml 13(+0 -13)
.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_1_3_5_RELEASE.xml 13(+0 -13)
.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_validation_1_3_5_RELEASE.xml 13(+0 -13)
.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_1_3_5_RELEASE.xml 13(+0 -13)
.idea/libraries/Maven__org_springframework_security_spring_security_config_4_0_4_RELEASE.xml 13(+0 -13)
.idea/libraries/Maven__org_springframework_security_spring_security_core_4_0_4_RELEASE.xml 13(+0 -13)
.idea/libraries/Maven__org_springframework_security_spring_security_web_4_0_4_RELEASE.xml 13(+0 -13)
LICENSE.md 246(+29 -217)
pom.xml 26(+12 -14)
postman-tests/shopizer.postman_collection.json 2067(+2067 -0)
README.md 5(+3 -2)
RELEASE-NOTES.md 12(+6 -6)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/common/CcAddressDetailsType.java 231(+0 -231)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/common/CcDetailsType.java 210(+0 -210)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/common/CcType.java 53(+0 -53)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/common/LinkType.java 154(+0 -154)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/common/ObjectFactory.java 84(+0 -84)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/discovery/CcAddressDetailsType.java 231(+0 -231)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/discovery/CcDetailsType.java 210(+0 -210)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/discovery/CcType.java 53(+0 -53)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/discovery/Link.java 156(+0 -156)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/discovery/Links.java 78(+0 -78)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/discovery/NumberRangeType.java 93(+0 -93)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/discovery/ObjectFactory.java 175(+0 -175)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/discovery/Option.java 372(+0 -372)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/discovery/Options.java 226(+0 -226)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/discovery/package-info.java 9(+0 -9)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/discovery/RelType.java 58(+0 -58)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/discovery/Service.java 866(+0 -866)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/discovery/Services.java 205(+0 -205)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/messages/Messages.java 177(+0 -177)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/messages/ObjectFactory.java 55(+0 -55)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/messages/package-info.java 9(+0 -9)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/rating/CcAddressDetailsType.java 231(+0 -231)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/rating/CcDetailsType.java 210(+0 -210)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/rating/CcType.java 53(+0 -53)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/rating/Link.java 156(+0 -156)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/rating/MailingScenario.java 1264(+0 -1264)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/rating/ObjectFactory.java 255(+0 -255)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/rating/package-info.java 9(+0 -9)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/rating/PriceQuotes.java 1775(+0 -1775)
shopizer-canadapost/src/main/java/ca/canadapost/cpcdp/rating/generated/rating/TaxType.java 95(+0 -95)
shopizer-canadapost/src/main/java/com/shopizer/modules/shipping/canadapost/CanadaPostQuoteModule.java 361(+0 -361)
shopizer-canadapost/src/test/java/com/shopizer/modules/shipping/canadapost/test/ShippingCanadaPostTestCase.java 186(+0 -186)
shopizer-canadapost/src/test/resources/spring/.svn/text-base/settings_product.json.svn-base 11(+0 -11)
shopizer-canadapost/src/test/resources/spring/.svn/text-base/settings_product_fr.json.svn-base 11(+0 -11)
shopizer-canadapost/src/test/resources/spring/.svn/text-base/shopizer-search.xml.svn-base 188(+0 -188)
shopizer-canadapost/src/test/resources/spring/.svn/text-base/spring-context-test.xml.svn-base 21(+0 -21)
shopizer-shipping-distance-module/src/main/java/com/shopizer/modules/shipping/distance/ShippingDistancePreProcessorImpl.java 238(+0 -238)
shopizer-shipping-distance-module/src/test/java/com/shopizer/modules/shipping/distance/test/ShippingDistanceProcessorTestCase.java 69(+0 -69)
shopizer-shipping-distance-module/src/test/resources/spring/.svn/text-base/product.json.svn-base 14(+0 -14)
shopizer-shipping-distance-module/src/test/resources/spring/.svn/text-base/product_fr.json.svn-base 14(+0 -14)
shopizer-shipping-distance-module/src/test/resources/spring/.svn/text-base/settings_product.json.svn-base 11(+0 -11)
shopizer-shipping-distance-module/src/test/resources/spring/.svn/text-base/settings_product_fr.json.svn-base 11(+0 -11)
shopizer-shipping-distance-module/src/test/resources/spring/.svn/text-base/shopizer-search.xml.svn-base 188(+0 -188)
shopizer-shipping-distance-module/src/test/resources/spring/.svn/text-base/spring-context-test.xml.svn-base 21(+0 -21)
shopizer-shipping-distance-module/src/test/resources/spring/processors/shopizer-core-shipping-processors.xml 25(+0 -25)
sm-core/.classpath 78(+39 -39)
sm-core/.gitignore 1(+1 -0)
sm-core/.project 72(+36 -36)
sm-core/.settings/org.eclipse.jdt.core.prefs 26(+13 -13)
sm-core/pom.xml 432(+221 -211)
sm-core/src/main/java/com/salesmanager/core/business/configuration/CoreApplicationConfiguration.java 32(+16 -16)
sm-core/src/main/java/com/salesmanager/core/business/modules/cms/common/ImageRemove.java 22(+11 -11)
sm-core/src/main/java/com/salesmanager/core/business/modules/cms/common/StaticContentData.java 104(+52 -52)
sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/ContentImageGet.java 30(+15 -15)
sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/ContentImageRemove.java 28(+14 -14)
sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/FileRemove.java 38(+19 -19)
sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/infinispan/CmsStaticContentFileManagerImpl.java 896(+448 -448)
sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/local/CmsStaticContentFileManagerImpl.java 1048(+524 -524)
sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/StaticContentFileManager.java 26(+13 -13)
sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/StaticContentFileManagerImpl.java 222(+111 -111)
sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/CacheManagerImpl.java 130(+65 -65)
sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/LocalCacheManagerImpl.java 38(+19 -19)
sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/StaticContentCacheManagerImpl.java 84(+42 -42)
sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/StoreCacheManagerImpl.java 84(+42 -42)
sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/VendorCacheManager.java 82(+41 -41)
sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/infinispan/CmsImageFileManagerImpl.java 1046(+523 -523)
sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/local/CmsImageFileManagerImpl.java 654(+327 -327)
sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductFileManager.java 22(+11 -11)
sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductFileManagerImpl.java 719(+363 -356)
sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductImageGet.java 56(+28 -28)
sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductImagePut.java 28(+14 -14)
sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductImageRemove.java 34(+17 -17)
sm-core/src/main/java/com/salesmanager/core/business/modules/email/HtmlEmailSenderImpl.java 390(+195 -195)
sm-core/src/main/java/com/salesmanager/core/business/modules/integration/IntegrationException.java 124(+62 -62)
sm-core/src/main/java/com/salesmanager/core/business/modules/integration/payment/impl/BeanStreamPayment.java 1502(+751 -751)
sm-core/src/main/java/com/salesmanager/core/business/modules/integration/payment/impl/BraintreePayment.java 469(+469 -0)
sm-core/src/main/java/com/salesmanager/core/business/modules/integration/payment/impl/MoneyOrderPayment.java 238(+119 -119)
sm-core/src/main/java/com/salesmanager/core/business/modules/integration/payment/impl/PayPalExpressCheckoutPayment.java 3(+3 -0)
sm-core/src/main/java/com/salesmanager/core/business/modules/integration/payment/impl/StripePayment.java 1104(+552 -552)
sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/CustomWeightBasedShippingQuote.java 322(+161 -161)
sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/DefaultPackagingImpl.java 872(+436 -436)
sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/StorePickupShippingQuote.java 362(+181 -181)
sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/UPSShippingQuote.java 1442(+721 -721)
sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/USPSShippingQuote.java 1506(+753 -753)
sm-core/src/main/java/com/salesmanager/core/business/modules/utils/EncryptionImpl.java 214(+107 -107)
sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/category/CategoryRepository.java 137(+67 -70)
sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/category/CategoryRepositoryCustom.java 30(+15 -15)
sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/category/CategoryRepositoryImpl.java 192(+96 -96)
sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/attribute/ProductAttributeRepository.java 52(+26 -26)
sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/attribute/ProductOptionRepository.java 62(+31 -31)
sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/attribute/ProductOptionValueRepository.java 64(+32 -32)
sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/availability/ProductAvailabilityRepository.java 18(+9 -9)
sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/file/DigitalProductRepository.java 34(+17 -17)
sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/image/ProductImageRepository.java 30(+15 -15)
sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/manufacturer/ManufacturerRepository.java 58(+29 -29)
sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/price/ProductPriceRepository.java 30(+15 -15)
sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/ProductRepository.java 20(+10 -10)
sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/ProductRepositoryCustom.java 88(+44 -44)
sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/ProductRepositoryImpl.java 1880(+977 -903)
sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/relationship/ProductRelationshipRepository.java 20(+10 -10)
sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/relationship/ProductRelationshipRepositoryCustom.java 62(+31 -31)
sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/relationship/ProductRelationshipRepositoryImpl.java 604(+305 -299)
sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/review/ProductReviewRepository.java 64(+32 -32)
sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/type/ProductTypeRepository.java 20(+10 -10)
sm-core/src/main/java/com/salesmanager/core/business/repositories/content/ContentRepository.java 78(+39 -39)
sm-core/src/main/java/com/salesmanager/core/business/repositories/content/ContentRepositoryCustom.java 38(+19 -19)
sm-core/src/main/java/com/salesmanager/core/business/repositories/content/ContentRepositoryImpl.java 211(+106 -105)
sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/attribute/CustomerAttributeRepository.java 54(+27 -27)
sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/attribute/CustomerOptionRepository.java 44(+22 -22)
sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/attribute/CustomerOptionSetRepository.java 50(+25 -25)
sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/attribute/CustomerOptionValueRepository.java 46(+23 -23)
sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/CustomerRepository.java 54(+27 -27)
sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/CustomerRepositoryCustom.java 28(+14 -14)
sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/CustomerRepositoryImpl.java 299(+151 -148)
sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/review/CustomerReviewRepository.java 36(+36 -0)
sm-core/src/main/java/com/salesmanager/core/business/repositories/merchant/MerchantRepository.java 27(+12 -15)
sm-core/src/main/java/com/salesmanager/core/business/repositories/order/orderaccount/OrderAccountRepository.java 20(+10 -10)
sm-core/src/main/java/com/salesmanager/core/business/repositories/order/orderproduct/OrderProductDownloadRepository.java 36(+18 -18)
sm-core/src/main/java/com/salesmanager/core/business/repositories/order/orderproduct/OrderProductRepository.java 20(+10 -10)
sm-core/src/main/java/com/salesmanager/core/business/repositories/order/OrderRepository.java 24(+12 -12)
sm-core/src/main/java/com/salesmanager/core/business/repositories/order/OrderRepositoryCustom.java 30(+15 -15)
sm-core/src/main/java/com/salesmanager/core/business/repositories/order/OrderRepositoryImpl.java 272(+136 -136)
sm-core/src/main/java/com/salesmanager/core/business/repositories/order/OrderTotalRepository.java 20(+10 -10)
sm-core/src/main/java/com/salesmanager/core/business/repositories/payments/TransactionRepository.java 36(+22 -14)
sm-core/src/main/java/com/salesmanager/core/business/repositories/reference/country/CountryRepository.java 40(+20 -20)
sm-core/src/main/java/com/salesmanager/core/business/repositories/reference/currency/CurrencyRepository.java 22(+11 -11)
sm-core/src/main/java/com/salesmanager/core/business/repositories/reference/language/LanguageRepository.java 28(+14 -14)
sm-core/src/main/java/com/salesmanager/core/business/repositories/reference/zone/ZoneRepository.java 42(+21 -21)
sm-core/src/main/java/com/salesmanager/core/business/repositories/shipping/ShippingOriginRepository.java 24(+12 -12)
sm-core/src/main/java/com/salesmanager/core/business/repositories/shipping/ShippingQuoteRepository.java 16(+16 -0)
sm-core/src/main/java/com/salesmanager/core/business/repositories/shoppingcart/ShoppingCartAttributeRepository.java 18(+9 -9)
sm-core/src/main/java/com/salesmanager/core/business/repositories/shoppingcart/ShoppingCartItemRepository.java 18(+9 -9)
sm-core/src/main/java/com/salesmanager/core/business/repositories/shoppingcart/ShoppingCartRepository.java 48(+24 -24)
sm-core/src/main/java/com/salesmanager/core/business/repositories/system/CustomerOptinRepository.java 28(+14 -14)
sm-core/src/main/java/com/salesmanager/core/business/repositories/system/MerchantConfigurationRepository.java 50(+25 -25)
sm-core/src/main/java/com/salesmanager/core/business/repositories/system/MerchantLogRepository.java 26(+13 -13)
sm-core/src/main/java/com/salesmanager/core/business/repositories/system/ModuleConfigurationRepository.java 32(+16 -16)
sm-core/src/main/java/com/salesmanager/core/business/repositories/system/OptinRepository.java 28(+14 -14)
sm-core/src/main/java/com/salesmanager/core/business/repositories/system/SystemConfigurationRepository.java 24(+12 -12)
sm-core/src/main/java/com/salesmanager/core/business/repositories/system/SystemNotificationRepository.java 20(+10 -10)
sm-core/src/main/java/com/salesmanager/core/business/repositories/tax/TaxClassRepository.java 42(+21 -21)
sm-core/src/main/java/com/salesmanager/core/business/repositories/tax/TaxRateRepository.java 62(+31 -31)
sm-core/src/main/java/com/salesmanager/core/business/repositories/user/GroupRepository.java 58(+30 -28)
sm-core/src/main/java/com/salesmanager/core/business/repositories/user/PermissionRepository.java 44(+22 -22)
sm-core/src/main/java/com/salesmanager/core/business/repositories/user/PermissionRepositoryCustom.java 28(+14 -14)
sm-core/src/main/java/com/salesmanager/core/business/repositories/user/PermissionRepositoryImpl.java 188(+94 -94)
sm-core/src/main/java/com/salesmanager/core/business/repositories/user/UserRepository.java 46(+23 -23)
sm-core/src/main/java/com/salesmanager/core/business/services/catalog/category/CategoryService.java 9(+9 -0)
sm-core/src/main/java/com/salesmanager/core/business/services/catalog/category/CategoryServiceImpl.java 5(+5 -0)
sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/manufacturer/ManufacturerServiceImpl.java 2(+1 -1)
sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/PricingService.java 17(+17 -0)
sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/PricingServiceImpl.java 17(+17 -0)
sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/ProductServiceImpl.java 14(+11 -3)
sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/review/ProductReviewServiceImpl.java 21(+18 -3)
sm-core/src/main/java/com/salesmanager/core/business/services/common/generic/SalesManagerEntityService.java 152(+76 -76)
sm-core/src/main/java/com/salesmanager/core/business/services/customer/CustomerService.java 80(+40 -40)
sm-core/src/main/java/com/salesmanager/core/business/services/customer/CustomerServiceImpl.java 230(+115 -115)
sm-core/src/main/java/com/salesmanager/core/business/services/customer/review/CustomerReviewService.java 34(+34 -0)
sm-core/src/main/java/com/salesmanager/core/business/services/customer/review/CustomerReviewServiceImpl.java 109(+109 -0)
sm-core/src/main/java/com/salesmanager/core/business/services/merchant/MerchantStoreService.java 32(+16 -16)
sm-core/src/main/java/com/salesmanager/core/business/services/merchant/MerchantStoreServiceImpl.java 285(+141 -144)
sm-core/src/main/java/com/salesmanager/core/business/services/order/orderproduct/OrderProductDownloadService.java 36(+18 -18)
sm-core/src/main/java/com/salesmanager/core/business/services/order/orderproduct/OrderProductDownloadServiceImpl.java 76(+38 -38)
sm-core/src/main/java/com/salesmanager/core/business/services/order/OrderService.java 237(+122 -115)
sm-core/src/main/java/com/salesmanager/core/business/services/order/OrderServiceImpl.java 1121(+600 -521)
sm-core/src/main/java/com/salesmanager/core/business/services/order/ordertotal/OrderTotalServiceImpl.java 2(+1 -1)
sm-core/src/main/java/com/salesmanager/core/business/services/payments/PaymentService.java 224(+122 -102)
sm-core/src/main/java/com/salesmanager/core/business/services/payments/PaymentServiceImpl.java 1506(+798 -708)
sm-core/src/main/java/com/salesmanager/core/business/services/payments/TransactionService.java 59(+31 -28)
sm-core/src/main/java/com/salesmanager/core/business/services/payments/TransactionServiceImpl.java 319(+160 -159)
sm-core/src/main/java/com/salesmanager/core/business/services/reference/init/InitializationDatabaseImpl.java 30(+23 -7)
sm-core/src/main/java/com/salesmanager/core/business/services/reference/language/LanguageService.java 3(+2 -1)
sm-core/src/main/java/com/salesmanager/core/business/services/reference/language/LanguageServiceImpl.java 20(+18 -2)
sm-core/src/main/java/com/salesmanager/core/business/services/reference/loader/ConfigurationModulesLoader.java 214(+107 -107)
sm-core/src/main/java/com/salesmanager/core/business/services/reference/loader/IntegrationModulesLoader.java 380(+190 -190)
sm-core/src/main/java/com/salesmanager/core/business/services/reference/loader/ZonesLoader.java 286(+143 -143)
sm-core/src/main/java/com/salesmanager/core/business/services/reference/zone/ZoneServiceImpl.java 13(+11 -2)
sm-core/src/main/java/com/salesmanager/core/business/services/reference/zone/ZoneTransient.java 56(+28 -28)
sm-core/src/main/java/com/salesmanager/core/business/services/search/SearchService.java 116(+58 -58)
sm-core/src/main/java/com/salesmanager/core/business/services/search/SearchServiceImpl.java 628(+318 -310)
sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingOriginService.java 38(+19 -19)
sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingOriginServiceImpl.java 80(+40 -40)
sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingQuoteService.java 39(+39 -0)
sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingQuoteServiceImpl.java 77(+77 -0)
sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingService.java 423(+216 -207)
sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingServiceImpl.java 1805(+934 -871)
sm-core/src/main/java/com/salesmanager/core/business/services/shoppingcart/ShoppingCartCalculationService.java 96(+48 -48)
sm-core/src/main/java/com/salesmanager/core/business/services/shoppingcart/ShoppingCartCalculationServiceImpl.java 242(+121 -121)
sm-core/src/main/java/com/salesmanager/core/business/services/shoppingcart/ShoppingCartService.java 170(+85 -85)
sm-core/src/main/java/com/salesmanager/core/business/services/shoppingcart/ShoppingCartServiceImpl.java 1112(+556 -556)
sm-core/src/main/java/com/salesmanager/core/business/services/system/EmailServiceImpl.java 128(+64 -64)
sm-core/src/main/java/com/salesmanager/core/business/services/user/GroupServiceImpl.java 106(+56 -50)
sm-core/src/main/java/com/salesmanager/core/business/services/user/PermissionService.java 66(+33 -33)
sm-core/src/main/java/com/salesmanager/core/business/services/user/PermissionServiceImpl.java 180(+90 -90)
sm-core/src/main/java/com/salesmanager/core/business/services/user/UserServiceImpl.java 160(+80 -80)
sm-core/src/main/java/com/salesmanager/core/business/services/user/UserServiceLDAPImpl.java 198(+99 -99)
sm-core/src/main/java/com/salesmanager/core/business/utils/ApplicationContextListenerUtils.java 40(+20 -20)
sm-core/src/main/java/com/salesmanager/core/business/utils/ProductImageCropUtils.java 464(+232 -232)
sm-core/src/main/java/com/salesmanager/core/business/utils/ProductImageSizeUtils.java 302(+151 -151)
sm-core/src/main/java/com/salesmanager/core/business/utils/query/ProductQueryBuilder.java 134(+67 -67)
sm-core/src/main/resources/configs.properties 35(+19 -16)
sm-core/src/main/resources/reference/zoneconfig.json 3774(+1887 -1887)
sm-core/src/main/resources/search/product.json 28(+14 -14)
sm-core/src/main/resources/spring/shopizer-search.xml 406(+203 -203)
sm-core/src/main/resources/templates/email/email_template_password_reset_customer.ftl 666(+333 -333)
sm-core/src/test/java/com/salesmanager/test/common/AbstractSalesManagerCoreTestCase.java 338(+169 -169)
sm-core-model/.classpath 54(+27 -27)
sm-core-model/.gitignore 1(+1 -0)
sm-core-model/.project 72(+36 -36)
sm-core-model/pom.xml 10(+9 -1)
sm-core-model/src/main/java/com/salesmanager/core/business/exception/ConversionException.java 62(+31 -31)
sm-core-model/src/main/java/com/salesmanager/core/model/catalog/category/CategoryDescription.java 2(+1 -1)
sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/AttributeCriteria.java 52(+26 -26)
sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductAttribute.java 482(+241 -241)
sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductOption.java 302(+151 -151)
sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductOptionDescription.java 102(+51 -51)
sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductOptionType.java 14(+7 -7)
sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductOptionValueDescription.java 2(+1 -1)
sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/availability/ProductAvailability.java 366(+183 -183)
sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/description/ProductDescription.java 2(+1 -1)
sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/file/ProductImageSize.java 20(+10 -10)
sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/image/ProductImage.java 298(+149 -149)
sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/image/ProductImageDescription.java 96(+48 -48)
sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/manufacturer/ManufacturerDescription.java 2(+1 -1)
sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/price/FinalPrice.java 214(+107 -107)
sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/price/ProductPriceDescription.java 2(+1 -1)
sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/price/ProductPriceType.java 14(+7 -7)
sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/ProductCondition.java 7(+7 -0)
sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/ProductCriteria.java 20(+20 -0)
sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/relationship/ProductRelationshipType.java 14(+7 -7)
sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/review/ProductReview.java 307(+157 -150)
sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/review/ProductReviewDescription.java 2(+1 -1)
sm-core-model/src/main/java/com/salesmanager/core/model/common/description/Description.java 113(+113 -0)
sm-core-model/src/main/java/com/salesmanager/core/model/content/ContentDescription.java 198(+99 -99)
sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerAttribute.java 208(+104 -104)
sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOption.java 364(+182 -182)
sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOptionDescription.java 116(+58 -58)
sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOptionSet.java 184(+92 -92)
sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOptionType.java 14(+7 -7)
sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOptionValueDescription.java 2(+1 -1)
sm-core-model/src/main/java/com/salesmanager/core/model/customer/connection/AbstractUserConnection.java 105(+105 -0)
sm-core-model/src/main/java/com/salesmanager/core/model/customer/connection/AbstractUserConnectionWithCompositeKey.java 59(+59 -0)
sm-core-model/src/main/java/com/salesmanager/core/model/customer/connection/RemoteUser.java 53(+53 -0)
sm-core-model/src/main/java/com/salesmanager/core/model/customer/connection/UserConnection.java 13(+13 -0)
sm-core-model/src/main/java/com/salesmanager/core/model/customer/connection/UserConnectionPK.java 63(+63 -0)
sm-core-model/src/main/java/com/salesmanager/core/model/customer/review/CustomerReview.java 159(+159 -0)
sm-core-model/src/main/java/com/salesmanager/core/model/customer/review/CustomerReviewDescription.java 58(+58 -0)
sm-core-model/src/main/java/com/salesmanager/core/model/order/attributes/OrderAttribute.java 81(+81 -0)
sm-core-model/src/main/java/com/salesmanager/core/model/order/filehistory/FileHistory.java 268(+134 -134)
sm-core-model/src/main/java/com/salesmanager/core/model/order/orderaccount/OrderAccount.java 212(+106 -106)
sm-core-model/src/main/java/com/salesmanager/core/model/order/orderaccount/OrderAccountProduct.java 332(+166 -166)
sm-core-model/src/main/java/com/salesmanager/core/model/order/orderproduct/OrderProduct.java 280(+140 -140)
sm-core-model/src/main/java/com/salesmanager/core/model/order/orderproduct/OrderProductAttribute.java 264(+132 -132)
sm-core-model/src/main/java/com/salesmanager/core/model/order/orderproduct/OrderProductDownload.java 178(+89 -89)
sm-core-model/src/main/java/com/salesmanager/core/model/order/orderproduct/OrderProductPrice.java 276(+138 -138)
sm-core-model/src/main/java/com/salesmanager/core/model/order/orderstatus/OrderStatusHistory.java 212(+106 -106)
sm-core-model/src/main/java/com/salesmanager/core/model/payments/CreditCardPayment.java 106(+53 -53)
sm-core-model/src/main/java/com/salesmanager/core/model/reference/country/CountryDescription.java 2(+1 -1)
sm-core-model/src/main/java/com/salesmanager/core/model/reference/geozone/GeoZoneDescription.java 2(+1 -1)
sm-core-model/src/main/java/com/salesmanager/core/model/reference/zone/ZoneDescription.java 2(+1 -1)
sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingConfiguration.java 718(+359 -359)
sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingOptionPriceType.java 14(+7 -7)
sm-core-model/src/main/java/com/salesmanager/core/model/shoppingcart/ShoppingCart.java 295(+148 -147)
sm-core-model/src/main/java/com/salesmanager/core/model/system/CustomIntegrationConfiguration.java 28(+14 -14)
sm-core-model/src/main/java/com/salesmanager/core/model/system/IntegrationConfiguration.java 368(+184 -184)
sm-core-model/src/main/java/com/salesmanager/core/model/system/MerchantConfigurationType.java 18(+9 -9)
sm-core-model/src/main/java/com/salesmanager/core/model/tax/taxrate/TaxRateDescription.java 104(+52 -52)
sm-core-modules/.classpath 54(+27 -27)
sm-core-modules/.gitignore 1(+1 -0)
sm-core-modules/pom.xml 2(+1 -1)
sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/IntegrationException.java 122(+61 -61)
sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/payment/model/PaymentModule.java 103(+54 -49)
sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/CustomShippingQuoteItem.java 44(+22 -22)
sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/CustomShippingQuotesConfiguration.java 170(+85 -85)
sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/CustomShippingQuotesRegion.java 176(+88 -88)
sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/CustomShippingQuoteWeightItem.java 78(+39 -39)
sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/Packaging.java 36(+18 -18)
sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/ShippingQuoteModule.java 52(+26 -26)
sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/ShippingQuotePrePostProcessModule.java 80(+40 -40)
sm-core-modules/src/main/java/com/salesmanager/core/modules/order/total/OrderTotalPostProcessorModule.java 14(+7 -7)
sm-search/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources 0(+0 -0)
sm-search/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.core.resources.prefs 2(+0 -2)
sm-search/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.jst.j2ee.webservice.ui.prefs 2(+0 -2)
sm-search/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.m2e.discovery.prefs 2(+0 -2)
sm-search/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.context.core.prefs 2(+0 -2)
sm-search/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.monitor.ui.prefs 2(+0 -2)
sm-search/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.mylyn.tasks.ui.prefs 3(+0 -3)
sm-search/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.team.cvs.ui.prefs 2(+0 -2)
sm-search/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.ui.workbench.prefs 4(+0 -4)
sm-search/.metadata/.plugins/org.eclipse.m2e.logback.configuration/logback.1.4.0.20130601-0317.xml 41(+0 -41)
sm-search/.metadata/.plugins/org.eclipse.rse.core/initializerMarks/org.eclipse.rse.internal.core.RSELocalConnectionInitializer.mark 0(+0 -0)
sm-search/.metadata/.plugins/org.eclipse.rse.core/profiles/PRF.canl-1fpkn32_3900/FP.local.files_0/node.properties 57(+0 -57)
sm-search/.metadata/.plugins/org.eclipse.rse.core/profiles/PRF.canl-1fpkn32_3900/H.local_16/node.properties 25(+0 -25)
sm-search/.metadata/.plugins/org.eclipse.rse.core/profiles/PRF.canl-1fpkn32_3900/node.properties 7(+0 -7)
sm-shop/.classpath 72(+36 -36)
sm-shop/.gitignore 1(+1 -0)
sm-shop/.project 82(+41 -41)
sm-shop/.settings/.jsdtscope 24(+12 -12)
sm-shop/.settings/org.eclipse.jdt.core.prefs 21(+13 -8)
sm-shop/docker-compose.yml 6(+6 -0)
sm-shop/Dockerfile 16(+16 -0)
sm-shop/pom.xml 351(+184 -167)
sm-shop/SALESMANAGER.h2.db 0(+0 -0)
sm-shop/SALESMANAGER.lock.db 4(+2 -2)
sm-shop/SALESMANAGER.trace.db 81(+81 -0)
sm-shop/service.yml.txt 14(+14 -0)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/configurations/CacheController.java 230(+115 -115)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/configurations/ConfigurationController.java 452(+226 -226)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/content/ContentPagesController.java 1(+1 -0)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/ControllerConstants.java 218(+109 -109)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/customers/CustomerController.java 65(+53 -12)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/merchant/MerchantStoreController.java 1(+0 -1)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/payments/PaymentsController.java 2(+1 -1)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/CustomProductGroupsController.java 930(+465 -465)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/FeaturedItemsController.java 546(+273 -273)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/ManufacturerController.java 1002(+501 -501)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/OptionsValueController.java 16(+10 -6)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/ProductAttributeController.java 1060(+530 -530)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/ProductImagesController.java 1004(+502 -502)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/ProductReviewController.java 462(+231 -231)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/RelatedItemsController.java 662(+331 -331)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/CustomShippingMethodsController.java 1542(+771 -771)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingConfigsController.java 468(+234 -234)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingMethodsController.java 364(+182 -182)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingOptionsController.java 352(+176 -176)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingOriginController.java 336(+168 -168)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingPackagingController.java 280(+140 -140)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/tax/TaxClassController.java 624(+312 -312)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/tax/TaxConfigurationController.java 174(+87 -87)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/tax/TaxRatesController.java 950(+475 -475)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/user/GroupsController.java 197(+179 -18)
sm-shop/src/main/java/com/salesmanager/shop/admin/controller/user/UserController.java 1729(+858 -871)
sm-shop/src/main/java/com/salesmanager/shop/admin/model/customer/attribute/CustomerOption.java 134(+67 -67)
sm-shop/src/main/java/com/salesmanager/shop/admin/model/customer/attribute/CustomerOptionValue.java 48(+24 -24)
sm-shop/src/main/java/com/salesmanager/shop/admin/model/merchant/StoreLandingDescription.java 136(+68 -68)
sm-shop/src/main/java/com/salesmanager/shop/admin/security/UserAuthenticationSuccessHandler.java 151(+75 -76)
sm-shop/src/main/java/com/salesmanager/shop/application/ShopApplicationConfiguration.java 98(+97 -1)
sm-shop/src/main/java/com/salesmanager/shop/application/ShopApplicationUserSecurityConfiguration.java 80(+80 -0)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/category/CategoryDescription.java 32(+16 -16)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/category/PersistableCategory.java 58(+29 -29)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/category/ReadableCategory.java 78(+39 -39)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/Manufacturer.java 44(+22 -22)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/ManufacturerDescription.java 32(+16 -16)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/ManufacturerEntity.java 46(+23 -23)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/PersistableManufacturer.java 42(+21 -21)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/ReadableManufacturer.java 40(+20 -20)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/PersistableProductAttribute.java 26(+13 -13)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/PersistableProductOption.java 42(+21 -21)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/PersistableProductOptionValue.java 46(+23 -23)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductAttribute.java 56(+28 -28)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductAttributeEntity.java 86(+43 -43)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOption.java 44(+22 -22)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionDescription.java 32(+16 -16)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionEntity.java 56(+28 -28)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionValue.java 44(+22 -22)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionValueDescription.java 30(+15 -15)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionValueEntity.java 42(+21 -21)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ReadableProductAttribute.java 24(+12 -12)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ReadableProductOption.java 20(+20 -0)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ReadableProductOptionValue.java 20(+20 -0)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/PersistableImage.java 153(+84 -69)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/PersistableProduct.java 149(+79 -70)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ProductDescription.java 24(+12 -12)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ProductPriceEntity.java 156(+78 -78)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ReadableProduct.java 184(+100 -84)
sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ReadableProductList.java 53(+24 -29)
sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerAttributeEntity.java 44(+22 -22)
sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOption.java 36(+18 -18)
sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionDescription.java 32(+16 -16)
sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionEntity.java 68(+34 -34)
sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionValue.java 32(+16 -16)
sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionValueDescription.java 30(+15 -15)
sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionValueEntity.java 54(+27 -27)
sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/PersistableCustomerAttribute.java 50(+25 -25)
sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/PersistableCustomerOption.java 46(+23 -23)
sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/PersistableCustomerOptionValue.java 46(+23 -23)
sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/ReadableCustomerAttribute.java 52(+26 -26)
sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/ReadableCustomerOption.java 44(+22 -22)
sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/ReadableCustomerOptionValue.java 44(+22 -22)
sm-shop/src/main/java/com/salesmanager/shop/model/customer/PersistableCustomerReview.java 19(+19 -0)
sm-shop/src/main/java/com/salesmanager/shop/model/customer/UserAlreadyExistException.java 13(+13 -0)
sm-shop/src/main/java/com/salesmanager/shop/model/order/shipping/ReadableShippingSummary.java 113(+113 -0)
sm-shop/src/main/java/com/salesmanager/shop/model/order/transaction/PersistablePayment.java 41(+41 -0)
sm-shop/src/main/java/com/salesmanager/shop/model/order/transaction/PersistableTransaction.java 42(+42 -0)
sm-shop/src/main/java/com/salesmanager/shop/model/order/transaction/ReadableTransaction.java 31(+31 -0)
sm-shop/src/main/java/com/salesmanager/shop/model/order/transaction/TransactionEntity.java 50(+50 -0)
sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/CartModificationException.java 31(+31 -0)
sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/PersistableShoppingCartItem.java 41(+41 -0)
sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ReadableShoppingCart.java 144(+144 -0)
sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ReadableShoppingCartAttribute.java 27(+27 -0)
sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ReadableShoppingCartAttributeOption.java 12(+12 -0)
sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ReadableShoppingCartAttributeOptionValue.java 12(+12 -0)
sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ReadableShoppingCartItem.java 47(+47 -0)
sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ShoppingCartAttribute.java 100(+50 -50)
sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableCategoryPopulator.java 291(+146 -145)
sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableImagePopulator.java 52(+52 -0)
sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableProductOptionPopulator.java 154(+77 -77)
sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableProductOptionValuePopulator.java 168(+84 -84)
sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableProductPopulator.java 750(+399 -351)
sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableProductReviewPopulator.java 14(+9 -5)
sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/ReadableCategoryPopulator.java 8(+8 -0)
sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/ReadableProductPopulator.java 521(+296 -225)
sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/ReadableProductReviewPopulator.java 1(+1 -0)
sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerBillingAddressPopulator.java 104(+52 -52)
sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerDeliveryAddressPopulator.java 160(+80 -80)
sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerEntityPopulator.java 230(+119 -111)
sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerOptionPopulator.java 156(+78 -78)
sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerPopulator.java 565(+294 -271)
sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerBillingAddressPopulator.java 124(+62 -62)
sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerOptionPopulator.java 162(+81 -81)
sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerOptionValuePopulator.java 148(+74 -74)
sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerPopulator.java 202(+106 -96)
sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerReviewPopulator.java 108(+108 -0)
sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerShippingAddressPopulator.java 194(+97 -97)
sm-shop/src/main/java/com/salesmanager/shop/populator/customer/ReadableCustomerDeliveryAddressPopulator.java 288(+144 -144)
sm-shop/src/main/java/com/salesmanager/shop/populator/customer/ReadableCustomerPopulator.java 240(+126 -114)
sm-shop/src/main/java/com/salesmanager/shop/populator/customer/ReadableCustomerReviewPopulator.java 86(+86 -0)
sm-shop/src/main/java/com/salesmanager/shop/populator/customer/ReadableProductReviewPopulator.java 25(+25 -0)
sm-shop/src/main/java/com/salesmanager/shop/populator/manufacturer/PersistableManufacturerPopulator.java 171(+87 -84)
sm-shop/src/main/java/com/salesmanager/shop/populator/manufacturer/ReadableManufacturerPopulator.java 111(+56 -55)
sm-shop/src/main/java/com/salesmanager/shop/populator/order/OrderProductPopulator.java 380(+190 -190)
sm-shop/src/main/java/com/salesmanager/shop/populator/order/PersistableOrderApiPopulator.java 198(+198 -0)
sm-shop/src/main/java/com/salesmanager/shop/populator/order/PersistableOrderPopulator.java 461(+235 -226)
sm-shop/src/main/java/com/salesmanager/shop/populator/order/PersistableOrderProductPopulator.java 332(+166 -166)
sm-shop/src/main/java/com/salesmanager/shop/populator/order/ReadableOrderPopulator.java 334(+175 -159)
sm-shop/src/main/java/com/salesmanager/shop/populator/order/ReadableOrderSummaryPopulator.java 97(+97 -0)
sm-shop/src/main/java/com/salesmanager/shop/populator/order/ReadableOrderTotalPopulator.java 2(+1 -1)
sm-shop/src/main/java/com/salesmanager/shop/populator/order/ReadableShippingSummaryPopulator.java 2(+1 -1)
sm-shop/src/main/java/com/salesmanager/shop/populator/order/ShoppingCartItemPopulator.java 174(+87 -87)
sm-shop/src/main/java/com/salesmanager/shop/populator/order/transaction/PersistablePaymentPopulator.java 67(+67 -0)
sm-shop/src/main/java/com/salesmanager/shop/populator/order/transaction/PersistableTransactionPopulator.java 89(+89 -0)
sm-shop/src/main/java/com/salesmanager/shop/populator/order/transaction/ReadableTransactionPopulator.java 83(+83 -0)
sm-shop/src/main/java/com/salesmanager/shop/populator/shoppingCart/ReadableShoppingCartPopulator.java 249(+249 -0)
sm-shop/src/main/java/com/salesmanager/shop/populator/shoppingCart/ShoppingCartDataPopulator.java 425(+228 -197)
sm-shop/src/main/java/com/salesmanager/shop/populator/shoppingCart/ShoppingCartModelPopulator.java 550(+275 -275)
sm-shop/src/main/java/com/salesmanager/shop/store/api/v0/category/ShoppingCategoryRESTController.java 48(+22 -26)
sm-shop/src/main/java/com/salesmanager/shop/store/api/v0/customer/CustomerRESTController.java 774(+387 -387)
sm-shop/src/main/java/com/salesmanager/shop/store/api/v0/order/OrderRESTController.java 577(+306 -271)
sm-shop/src/main/java/com/salesmanager/shop/store/api/v0/product/ProductItemsRESTController.java 512(+259 -253)
sm-shop/src/main/java/com/salesmanager/shop/store/api/v0/product/ShopProductRESTController.java 1698(+849 -849)
sm-shop/src/main/java/com/salesmanager/shop/store/api/v0/search/SearchRESTController.java 71(+71 -0)
sm-shop/src/main/java/com/salesmanager/shop/store/api/v0/store/StoreContactRESTController.java 2(+1 -1)
sm-shop/src/main/java/com/salesmanager/shop/store/api/v0/system/SystemRESTController.java 156(+156 -0)
sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/customer/AuthenticateCustomerApi.java 185(+185 -0)
sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/customer/CustomerReviewApi.java 227(+227 -0)
sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/shoppingCart/ShoppingCartApi.java 123(+123 -0)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/category/facade/CategoryFacade.java 9(+8 -1)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/category/facade/CategoryFacadeImpl.java 121(+112 -9)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/category/ShoppingCategoryController.java 1442(+721 -721)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/content/ShopContentController.java 154(+77 -77)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerAccountController.java 1144(+572 -572)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerDashboardController.java 266(+133 -133)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerLoginController.java 418(+211 -207)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerProductReviewController.java 464(+232 -232)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerRegistrationController.java 703(+356 -347)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/facade/CustomerFacade.java 221(+131 -90)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/facade/CustomerFacadeImpl.java 1280(+727 -553)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/items/facade/ProductItemsFacade.java 36(+36 -0)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/items/facade/ProductItemsFacadeImpl.java 84(+78 -6)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/facade/OrderFacade.java 263(+154 -109)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/facade/OrderFacadeImpl.java 2265(+1299 -966)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/ShoppingOrderConfirmationController.java 390(+195 -195)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/ShoppingOrderController.java 2511(+1261 -1250)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/ShoppingOrderDownloadController.java 226(+113 -113)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/ShoppingOrderPaymentController.java 488(+244 -244)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/product/facade/ProductFacade.java 125(+125 -0)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/product/facade/ProductFacadeImpl.java 300(+292 -8)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/product/ShopProductController.java 818(+420 -398)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/search/facade/SearchFacade.java 55(+39 -16)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/search/facade/SearchFacadeImpl.java 225(+182 -43)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/search/SearchController.java 143(+29 -114)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/shoppingCart/facade/ShoppingCartFacade.java 133(+84 -49)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/shoppingCart/facade/ShoppingCartFacadeImpl.java 1339(+793 -546)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/shoppingCart/MiniCartController.java 186(+94 -92)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/shoppingCart/ShoppingCartController.java 876(+448 -428)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/store/facade/StoreFacade.java 20(+20 -0)
sm-shop/src/main/java/com/salesmanager/shop/store/controller/store/facade/StoreFacadeImple.java 21(+21 -0)
sm-shop/src/main/java/com/salesmanager/shop/store/security/AbstractCustomerServices.java 100(+100 -0)
sm-shop/src/main/java/com/salesmanager/shop/store/security/AuthenticationTokenFilter.java 71(+71 -0)
sm-shop/src/main/java/com/salesmanager/shop/store/security/manager/CustomAuthenticationException.java 16(+16 -0)
sm-shop/src/main/java/com/salesmanager/shop/store/security/manager/CustomAuthenticationManager.java 93(+93 -0)
sm-shop/src/main/java/com/salesmanager/shop/store/security/manager/FacebookCustomerAuthenticationManager.java 330(+330 -0)
sm-shop/src/main/java/com/salesmanager/shop/store/security/manager/JWTCustomerAuthenticationManager.java 90(+90 -0)
sm-shop/src/main/java/com/salesmanager/shop/store/security/RestAuthenticationEntryPoint.java 41(+41 -0)
sm-shop/src/main/java/com/salesmanager/shop/store/security/ServicesAuthenticationEntryPoint.java 52(+35 -17)
sm-shop/src/main/java/com/salesmanager/shop/store/security/ServicesAuthenticationSuccessHandler.java 83(+42 -41)
sm-shop/src/main/java/com/salesmanager/shop/store/security/SocialCustomerServicesImpl.java 28(+28 -0)
sm-shop/src/main/java/com/salesmanager/shop/store/security/user/FacebookSocialUserDetailsService.java 64(+64 -0)
sm-shop/src/main/java/com/salesmanager/shop/store/security/user/FacebookTokenUserDetails.java 49(+49 -0)
sm-shop/src/main/java/com/salesmanager/shop/store/services/search/SearchRESTController.java 71(+0 -71)
sm-shop/src/main/java/com/salesmanager/shop/store/services/system/SystemRESTController.java 156(+0 -156)
sm-shop/src/main/java/com/salesmanager/shop/store/services/utility/CallbackController.java 58(+0 -58)
sm-shop/src/main/resources/admin/menu.json 623(+313 -310)
sm-shop/src/main/resources/bundles/messages.properties 426(+215 -211)
sm-shop/src/main/resources/bundles/messages_fr.properties 426(+215 -211)
sm-shop/src/main/resources/bundles/shipping.properties 286(+144 -142)
sm-shop/src/main/webapp/common/adminLinks.jsp 72(+36 -36)
sm-shop/src/main/webapp/pages/admin/categories/category.jsp 542(+271 -271)
sm-shop/src/main/webapp/pages/admin/categories/hierarchy.jsp 344(+172 -172)
sm-shop/src/main/webapp/pages/admin/components/list.jsp 283(+142 -141)
sm-shop/src/main/webapp/pages/admin/configuration/email.jsp 232(+116 -116)
sm-shop/src/main/webapp/pages/admin/configuration/system.jsp 272(+136 -136)
sm-shop/src/main/webapp/pages/admin/customers/option.jsp 344(+172 -172)
sm-shop/src/main/webapp/pages/admin/customers/optionsset.jsp 284(+142 -142)
sm-shop/src/main/webapp/pages/admin/home.jsp 170(+85 -85)
sm-shop/src/main/webapp/pages/admin/merchant/branding.jsp 266(+133 -133)
sm-shop/src/main/webapp/pages/admin/merchant/merchant.jsp 694(+347 -347)
sm-shop/src/main/webapp/pages/admin/orders/order.jsp 1442(+721 -721)
sm-shop/src/main/webapp/pages/admin/products/attribute.jsp 526(+263 -263)
sm-shop/src/main/webapp/pages/admin/products/option.jsp 274(+137 -137)
sm-shop/src/main/webapp/pages/admin/products/optionValue.jsp 268(+134 -134)
sm-shop/src/main/webapp/pages/admin/products/price.jsp 408(+204 -204)
sm-shop/src/main/webapp/pages/admin/products/product.jsp 962(+481 -481)
sm-shop/src/main/webapp/pages/admin/products/products.jsp 426(+213 -213)
sm-shop/src/main/webapp/pages/admin/profile/permission.jsp 256(+128 -128)
sm-shop/src/main/webapp/pages/admin/shipping/canadapost.jsp 202(+101 -101)
sm-shop/src/main/webapp/pages/admin/shipping/packaging.jsp 240(+120 -120)
sm-shop/src/main/webapp/pages/admin/shipping/ups.jsp 152(+76 -76)
sm-shop/src/main/webapp/pages/admin/tax/taxClass.jsp 184(+92 -92)
sm-shop/src/main/webapp/pages/admin/tax/taxRateDetails.jsp 500(+250 -250)
sm-shop/src/main/webapp/pages/admin/tax/taxRates.jsp 524(+262 -262)
sm-shop/src/main/webapp/pages/shop/common/cart/cart.jsp 356(+196 -160)
sm-shop/src/main/webapp/pages/shop/common/customer/order.jsp 404(+202 -202)
sm-shop/src/main/webapp/resources/css/sm.css 55(+53 -2)
sm-shop/src/main/webapp/resources/js/address.js 140(+70 -70)
sm-shop/src/main/webapp/resources/js/ckeditor/ckeditor.js 304(+152 -152)
sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/_translationstatus.txt 50(+25 -25)
sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/_translationstatus.txt 56(+28 -28)
sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/_translationstatus.txt 54(+27 -27)
sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/_translationstatus.txt 44(+22 -22)
sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/_translationstatus.txt 56(+28 -28)
sm-shop/src/main/webapp/resources/js/registration.js 128(+64 -64)
sm-shop/src/main/webapp/resources/js/shop-account.js 165(+83 -82)
sm-shop/src/main/webapp/resources/js/shop-minicart.js 746(+376 -370)
sm-shop/src/main/webapp/resources/js/shopping-cart.js 798(+399 -399)
sm-shop/src/main/webapp/resources/templates/generic/css/montserrat-extralight-webfont.woff2 0(+0 -0)
sm-shop/src/main/webapp/WEB-INF/shopizer-tags.tld 648(+324 -324)
sm-shop/src/main/webapp/WEB-INF/tiles/tiles-admin.xml 598(+301 -297)
sm-shop/src/main/webapp/WEB-INF/tiles/tiles-shop.xml 438(+235 -203)
sm-shop/src/main/webapp/WEB-INF/views/admin/logon.jsp 1062(+531 -531)
sm-shop/src/main/webapp/WEB-INF/views/admin/unauthorized.jsp 206(+103 -103)
sm-shop/src/test/java/com/salesmanager/test/shop/controller/category/rest/CategoryManagementAPITest.java 568(+284 -284)
sm-shop/src/test/java/com/salesmanager/test/shop/controller/customer/rest/CustomerRESTControllerTest.java 357(+179 -178)
sm-shop/src/test/java/com/salesmanager/test/shop/controller/product/rest/ProductManagementAPITest.java 912(+459 -453)
sm-shop/src/test/java/com/salesmanager/test/shop/controller/product/rest/SearchProductAPITest.java 62(+62 -0)
Details
LICENSE.md 246(+29 -217)
diff --git a/LICENSE.md b/LICENSE.md
index 3ba6a2b..490b5c7 100644
--- a/LICENSE.md
+++ b/LICENSE.md
@@ -1,241 +1,53 @@
-GNU GENERAL PUBLIC LICENSE
+Apache License
-Version 3, 29 June 2007
+Version 2.0, January 2004
-Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/>
+http://www.apache.org/licenses/
-Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-Preamble
+1. Definitions.
-The GNU General Public License is a free, copyleft license for software and other kinds of works.
+"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
-The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.
+"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
-When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.
+"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the 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.
-To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.
+"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
-For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
+"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
-Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.
+"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
-For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.
+"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
-Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.
+"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
-Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.
+"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
-The precise terms and conditions for copying, distribution and modification follow.
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
-TERMS AND CONDITIONS
+2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
-0. Definitions.
+3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
-“This License” refers to version 3 of the GNU General Public License.
+4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
-“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
+You must give any other recipients of the Work or Derivative Works a copy of this License; and
+You must cause any modified files to carry prominent notices stating that You changed the files; and
+You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
+If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
-“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.
+You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
+5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
-To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.
+6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
-A “covered work” means either the unmodified Program or a work based on the Program.
+7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
-To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.
+8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
-To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.
+9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
-An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.
-
-1. Source Code.
-
-The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.
-
-A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.
-
-The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.
-
-The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.
-
-The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.
-
-The Corresponding Source for a work in source code form is that same work.
-
-2. Basic Permissions.
-
-All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.
-
-You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.
-
-Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
-
-3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
-No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.
-
-When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.
-
-4. Conveying Verbatim Copies.
-
-You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.
-
-You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.
-
-5. Conveying Modified Source Versions.
-
-You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:
-
-a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
-b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.
-c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
-d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.
-A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.
-
-6. Conveying Non-Source Forms.
-
-You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:
-
-a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
-b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
-c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
-d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
-e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.
-A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.
-
-A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.
-
-“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.
-
-If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).
-
-The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.
-
-Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.
-
-7. Additional Terms.
-
-“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.
-
-When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.
-
-Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:
-
-a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
-b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
-c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
-d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
-e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
-f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.
-All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.
-
-If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.
-
-Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.
-
-8. Termination.
-
-You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).
-
-However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.
-
-Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.
-
-Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
-
-9. Acceptance Not Required for Having Copies.
-
-You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.
-
-10. Automatic Licensing of Downstream Recipients.
-
-Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.
-
-An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.
-
-You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
-
-11. Patents.
-
-A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”.
-
-A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.
-
-Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.
-
-In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.
-
-If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.
-
-If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.
-
-A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.
-
-Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.
-
-12. No Surrender of Others' Freedom.
-
-If 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 convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.
-
-13. Use with the GNU Affero General Public License.
-
-Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.
-
-14. Revised Versions of this License.
-
-The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.
-
-If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.
-
-Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
-
-15. Disclaimer of Warranty.
-
-THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-16. Limitation of Liability.
-
-IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-17. Interpretation of Sections 15 and 16.
-
-If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.
-
-END OF TERMS AND CONDITIONS
-
-How to Apply These Terms to Your New Programs
-
-If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
-
-To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state 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 program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- 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 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-Also add information on how to contact you by electronic and paper mail.
-
-If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:
-
- <program> Copyright (C) <year> <name of author>
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”.
-
-You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <http://www.gnu.org/licenses/>.
-
-The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <http://www.gnu.org/philosophy/why-not-lgpl.html>.
+END OF TERMS AND CONDITIONS
\ No newline at end of file
pom.xml 26(+12 -14)
diff --git a/pom.xml b/pom.xml
index de4c89e..806a595 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
<groupId>com.shopizer</groupId>
<artifactId>shopizer</artifactId>
- <version>2.0.5-SNAPSHOT</version>
+ <version>2.2.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>shopizer</name>
@@ -21,10 +21,10 @@
<properties>
<java.version>1.8</java.version>
- <shopizer.version>2.0.5-SNAPSHOT</shopizer.version>
- <shopizer.search.version>2.0.5-SNAPSHOT</shopizer.search.version>
- <shopizer-canadapost.version>2.0.5-SNAPSHOT</shopizer-canadapost.version>
- <shopizer-shipping-distance.version>2.0.5-SNAPSHOT</shopizer-shipping-distance.version>
+ <shopizer.version>2.2.0-SNAPSHOT</shopizer.version>
+ <shopizer.search.version>2.2.0.1</shopizer.search.version>
+ <shopizer-canadapost.version>2.2.0</shopizer-canadapost.version>
+ <shopizer-shipping-distance.version>2.2.0</shopizer-shipping-distance.version>
<jackson-version>2.7.4</jackson-version>
<commons-collections4.version>4.0</commons-collections4.version>
@@ -42,12 +42,7 @@
</properties>
<dependencies>
-
-<!-- <dependency>
- <groupId>javax.el</groupId>
- <artifactId>javax.el-api</artifactId>
- <version>${javax.el.version}</version>
- </dependency> -->
+
<!-- https://mvnrepository.com/artifact/javax.inject/javax.inject -->
<dependency>
@@ -142,10 +137,7 @@
<module>sm-core-model</module>
<module>sm-core-modules</module>
<module>sm-core</module>
- <module>sm-search</module>
<module>sm-shop</module>
- <module>shopizer-canadapost</module>
- <module>shopizer-shipping-distance-module</module>
</modules>
<repositories>
@@ -154,6 +146,12 @@
<name>Spring Releases</name>
<url>https://repo.spring.io/libs-release</url>
</repository>
+ <!-- Milestone repo -->
+ <repository>
+ <id>spring-milestone</id>
+ <name>Spring Milestone</name>
+ <url>https://repo.spring.io/milestone/</url>
+ </repository>
<repository>
<id>org.jboss.repository.releases</id>
<name>JBoss Maven Release Repository</name>
postman-tests/shopizer.postman_collection.json 2067(+2067 -0)
diff --git a/postman-tests/shopizer.postman_collection.json b/postman-tests/shopizer.postman_collection.json
new file mode 100644
index 0000000..45f8d8e
--- /dev/null
+++ b/postman-tests/shopizer.postman_collection.json
@@ -0,0 +1,2067 @@
+{
+ "id": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "name": "shopizer",
+ "description": "",
+ "order": [],
+ "folders": [
+ {
+ "name": "Admin",
+ "description": "",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "order": [
+ "80674bcf-b0af-eaa8-507a-a5194feaa9db"
+ ],
+ "owner": "1350207",
+ "folders_order": [
+ "d2d710ef-35d4-67b9-259e-5f79e3cd31f6",
+ "7b72249f-ad93-f830-befb-cc432829f5b3",
+ "b9d229d5-34ae-f67a-ccbb-10191c7da262",
+ "5bcca65d-6d40-d64c-6d60-e842260f16d3",
+ "7b91c544-0b63-7781-6fbb-cb08d1d1a4b7"
+ ],
+ "id": "08dac1ef-e0bd-275b-1c44-60674745f9dd"
+ },
+ {
+ "owner": "1350207",
+ "lastUpdatedBy": "1350207",
+ "lastRevision": 2265812938,
+ "folder": null,
+ "id": "7a1df60f-761b-9df6-f95b-e7062f2486ed",
+ "name": "Authentication",
+ "description": "",
+ "order": [
+ "ea899dba-4d4e-368c-8b81-fda7a66454f5",
+ "4698e684-6f23-4ba0-f93c-908aa59d5672"
+ ],
+ "folders_order": [
+ "857235ff-53ce-0939-ea85-1e8af96e30cd"
+ ],
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7"
+ },
+ {
+ "name": "Category",
+ "description": "",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "order": [
+ "c381e2b3-10cc-87e5-2ca0-44f861d502c1"
+ ],
+ "owner": "1350207",
+ "folder": "08dac1ef-e0bd-275b-1c44-60674745f9dd",
+ "folders_order": [],
+ "id": "d2d710ef-35d4-67b9-259e-5f79e3cd31f6"
+ },
+ {
+ "name": "Category",
+ "description": "",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "order": [
+ "f4ac8665-acad-f3a5-a33b-c65de705f5dc",
+ "daab2dd9-266f-9d60-81fd-a4985ef98544"
+ ],
+ "owner": "1350207",
+ "folder": "d33d1d8e-c034-e506-3201-c996c2099fe7",
+ "folders_order": [],
+ "id": "672123c5-93ab-8101-3da3-709c43a30fc9"
+ },
+ {
+ "name": "Customer",
+ "description": "",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "order": [],
+ "owner": "1350207",
+ "folder": "d33d1d8e-c034-e506-3201-c996c2099fe7",
+ "folders_order": [],
+ "id": "8adfe786-eb86-409c-d062-04d500d6db9f"
+ },
+ {
+ "owner": "1350207",
+ "lastUpdatedBy": "1350207",
+ "lastRevision": 2265797930,
+ "folder": "08dac1ef-e0bd-275b-1c44-60674745f9dd",
+ "id": "7b72249f-ad93-f830-befb-cc432829f5b3",
+ "name": "Customers",
+ "description": "Manage customers and customer reviews",
+ "order": [
+ "faf566bd-bc4e-8eee-c3dd-5760c74b0233",
+ "8fe74ae2-d104-76be-3544-45f2a9040d46",
+ "1d21e38f-ee3b-3ab0-3ba6-24e7cd4e5000",
+ "1082d10d-9522-3142-5255-7f9aac6a6755",
+ "d87f1f4e-8fe5-d079-f749-e6871539b56c"
+ ],
+ "folders_order": [],
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7"
+ },
+ {
+ "name": "Manufacturer",
+ "description": "",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "order": [
+ "fff0eb99-a0d7-4ed5-9266-5e276fb36e95"
+ ],
+ "owner": "1350207",
+ "folder": "d33d1d8e-c034-e506-3201-c996c2099fe7",
+ "folders_order": [],
+ "id": "ea184b94-7c56-9a2a-9061-d3e24c71d880"
+ },
+ {
+ "name": "Manufacturer",
+ "description": "",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "order": [
+ "9de73cd0-51a5-e17f-5940-feeabfa77faf"
+ ],
+ "owner": "1350207",
+ "folder": "08dac1ef-e0bd-275b-1c44-60674745f9dd",
+ "folders_order": [],
+ "id": "b9d229d5-34ae-f67a-ccbb-10191c7da262"
+ },
+ {
+ "name": "Product",
+ "description": "",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "order": [
+ "a670e5e6-e9e1-1a2f-17ab-62f68d58fc96",
+ "fbdb3a7a-21f1-148e-6512-d004d3b53fed",
+ "cccf1aa5-0621-f972-560f-f1aca9e1a04d",
+ "14d47131-3959-98f2-3929-8eb33b722fc3",
+ "b16b7252-b7ab-1796-368f-3844eb162598"
+ ],
+ "owner": "1350207",
+ "folder": "d33d1d8e-c034-e506-3201-c996c2099fe7",
+ "folders_order": [],
+ "id": "869901fd-ebbd-566c-4458-9ef2d787f781"
+ },
+ {
+ "owner": "1350207",
+ "lastUpdatedBy": "1350207",
+ "lastRevision": 2314489588,
+ "folder": "08dac1ef-e0bd-275b-1c44-60674745f9dd",
+ "id": "7b91c544-0b63-7781-6fbb-cb08d1d1a4b7",
+ "name": "Product",
+ "description": "",
+ "order": [
+ "5395f9cf-3797-e226-092c-80ae5dd24353",
+ "1b4b6f7c-bb74-775c-d2c0-7f2476fbb2e6",
+ "fc1e5dca-9ed7-dcdc-e625-f5b38132a736",
+ "ad55afb5-8fc9-b4ba-b319-d50ad401d896",
+ "5e3f6a0e-6bb8-e8d3-75a7-f8d2b17a4aa1",
+ "e6e29485-e2c6-71df-7b6e-a0fcccbdc83a"
+ ],
+ "folders_order": []
+ },
+ {
+ "name": "Product grouping",
+ "description": "",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "order": [
+ "b113b1fc-faa8-01d8-9f3e-31445ff5c798"
+ ],
+ "owner": "1350207",
+ "folder": "08dac1ef-e0bd-275b-1c44-60674745f9dd",
+ "folders_order": [],
+ "id": "5bcca65d-6d40-d64c-6d60-e842260f16d3"
+ },
+ {
+ "name": "Products",
+ "description": "",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "order": [
+ "d5903412-6d11-7403-0ca2-9a1e9ebd9525",
+ "3d6d4e5f-9501-0f67-1828-314051ff51e8"
+ ],
+ "owner": "1350207",
+ "folder": "7a1df60f-761b-9df6-f95b-e7062f2486ed",
+ "folders_order": [],
+ "id": "857235ff-53ce-0939-ea85-1e8af96e30cd"
+ },
+ {
+ "name": "Public",
+ "description": "",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "order": [],
+ "owner": "1350207",
+ "folders_order": [
+ "672123c5-93ab-8101-3da3-709c43a30fc9",
+ "8adfe786-eb86-409c-d062-04d500d6db9f",
+ "ea184b94-7c56-9a2a-9061-d3e24c71d880",
+ "869901fd-ebbd-566c-4458-9ef2d787f781",
+ "675d7679-0ecd-929b-1c44-c0db279226e0"
+ ],
+ "id": "d33d1d8e-c034-e506-3201-c996c2099fe7"
+ },
+ {
+ "name": "ShoppingCart",
+ "description": "",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "order": [
+ "39d888df-9b21-5cb2-c557-85a9fa127aa3",
+ "bb820890-0743-d59b-64b8-66ca92e66213"
+ ],
+ "owner": "1350207",
+ "folder": "d33d1d8e-c034-e506-3201-c996c2099fe7",
+ "folders_order": [],
+ "id": "675d7679-0ecd-929b-1c44-c0db279226e0"
+ }
+ ],
+ "folders_order": [
+ "7a1df60f-761b-9df6-f95b-e7062f2486ed",
+ "08dac1ef-e0bd-275b-1c44-60674745f9dd",
+ "d33d1d8e-c034-e506-3201-c996c2099fe7"
+ ],
+ "timestamp": 1503421437787,
+ "owner": "1350207",
+ "public": false,
+ "requests": [
+ {
+ "id": "1082d10d-9522-3142-5255-7f9aac6a6755",
+ "headers": "Authorization: Basic YWRtaW46cGFzc3dvcmQ=\nAccept: \nContent-Type: application/json\n",
+ "headerData": [
+ {
+ "key": "Authorization",
+ "value": "Basic YWRtaW46cGFzc3dvcmQ=",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Accept",
+ "value": "",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ }
+ ],
+ "url": "localhost:8080/api/v1/private/customers/1",
+ "queryParams": [],
+ "pathVariables": {},
+ "pathVariableData": [],
+ "preRequestScript": null,
+ "method": "GET",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "data": [],
+ "dataMode": "raw",
+ "name": "localhost:8080/api/v1/private/customers/{id}",
+ "description": "Get a customer by id",
+ "descriptionFormat": "html",
+ "time": 1506094318359,
+ "version": 2,
+ "responses": [],
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "folder": "7b72249f-ad93-f830-befb-cc432829f5b3",
+ "rawModeData": "{\n\"emailAddress\":\"carl@csticonsulting.com\",\n\"gender\":\"M\",\n\"language\":\"en\",\n\"userName\":\"testuser\",\n\"clearPassword\":\"password\",\n\"billing\":{\n \"address\":\"352 Du Languedoc\",\n \"city\":\"Boucherville\",\n \"postalCode\":\"J4B 8J9\",\n \"country\":\"CA\",\n \"zone\":\"QC\",\n \"firstName\":\"Carl\",\n \"lastName\":\"Samson\"\n }\n}"
+ },
+ {
+ "id": "14d47131-3959-98f2-3929-8eb33b722fc3",
+ "headers": "Accept: application/json\nContent-Type: application/json\nAuthorization: Basic YWRtaW46cGFzc3dvcmQ=\n",
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Authorization",
+ "value": "Basic YWRtaW46cGFzc3dvcmQ=",
+ "description": "",
+ "enabled": true
+ }
+ ],
+ "url": "localhost:8080/api/v1/products/group/FEATURED_ITEM",
+ "folder": "869901fd-ebbd-566c-4458-9ef2d787f781",
+ "queryParams": [],
+ "preRequestScript": null,
+ "pathVariables": {},
+ "pathVariableData": [],
+ "method": "GET",
+ "data": [],
+ "dataMode": "raw",
+ "version": 2,
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "time": 1506357147335,
+ "name": "localhost:8080/api/v1/products/{productId}/group/{code}",
+ "description": "Find items belonging to a group\n\nFor instance FEATURED",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "responses": [],
+ "rawModeData": "{\r\n \"price\" : 25.99,\r\n \"quantity\" : 5,\r\n \"sku\" : \"abcdef\",\r\n \"quantityOrderMaximum\" : 2,\r\n \"quantityOrderMinimum\" : 1,\r\n \"productIsFree\" : false,\r\n \"available\" : true,\r\n \"visible\" : true,\r\n \"productLength\" : 20,\r\n \"productWidth\" : 20,\r\n \"productHeight\" : 20,\r\n \"productWeight\" : 20,\r\n \"rating\" : 0.0,\r\n \"ratingCount\" : 0,\r\n \"sortOrder\" : 0,\r\n \"dateAvailable\" : null,\r\n \"condition\" : null,\r\n \"rentalDuration\" : 0,\r\n \"rentalStatus\" : null,\r\n \"descriptions\" : [ {\r\n \"language\" : \"en\",\r\n \"name\" : \"Buddha Head\",\r\n \"description\" : \"Buddha Head\",\r\n \"keyWords\" : null,\r\n \"highlights\" : \"Short description\",\r\n \"title\" : \"Buddha Head\"\r\n }],\r\n \"categories\" : null,\r\n \"relatedProducts\" : null,\r\n \"manufacturer\" : null,\r\n \"owner\" : {\r\n \r\n \"id\":1\r\n }\r\n}"
+ },
+ {
+ "id": "1b4b6f7c-bb74-775c-d2c0-7f2476fbb2e6",
+ "folder": "7b91c544-0b63-7781-6fbb-cb08d1d1a4b7",
+ "name": "localhost:8080/api/v1/private/products - second item",
+ "dataMode": "raw",
+ "data": [],
+ "descriptionFormat": null,
+ "description": "API for the creation of a product using customer authentication API. Requires a valid customer created",
+ "headers": "Accept: application/json\nContent-Type: application/json\nAuthorization: Basic YWRtaW46cGFzc3dvcmQ=\n",
+ "method": "POST",
+ "pathVariables": {},
+ "url": "localhost:8080/api/v1/private/products",
+ "preRequestScript": null,
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "queryParams": [],
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ },
+ {
+ "key": "Authorization",
+ "value": "Basic YWRtaW46cGFzc3dvcmQ=",
+ "enabled": true,
+ "description": ""
+ }
+ ],
+ "pathVariableData": [],
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "responses": [
+ {
+ "owner": "1350207",
+ "lastUpdatedBy": "1350207",
+ "lastRevision": 2260508392,
+ "request": {},
+ "id": "349ec807-9777-f73e-998f-e226e388bb69",
+ "name": "localhost:8080/api/v1/private/products",
+ "status": "",
+ "responseCode": {
+ "code": 200,
+ "name": "OK"
+ },
+ "time": "0",
+ "headers": [],
+ "cookies": [],
+ "mime": "",
+ "text": "",
+ "language": "",
+ "rawDataType": "",
+ "state": null,
+ "previewType": "parsed",
+ "searchResultScrolledTo": "-1",
+ "version": null,
+ "requestObject": "5395f9cf-3797-e226-092c-80ae5dd24353",
+ "createdAt": "2017-09-22T15:34:13.000Z",
+ "updatedAt": "2017-09-22T15:34:13.000Z",
+ "write": true
+ },
+ {
+ "owner": "1350207",
+ "lastUpdatedBy": "1350207",
+ "lastRevision": 2314406357,
+ "request": {
+ "url": "localhost:8080/api/v1/private/products",
+ "pathVariables": {},
+ "pathVariableData": [],
+ "queryParams": [],
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ },
+ {
+ "key": "Authorization",
+ "value": "Basic YWRtaW46cGFzc3dvcmQ=",
+ "enabled": true,
+ "description": ""
+ }
+ ],
+ "headers": "Accept: application/json\nContent-Type: application/json\nAuthorization: Basic YWRtaW46cGFzc3dvcmQ=\n",
+ "data": "{\r\n \"price\" : 1450.99,\r\n \"quantity\" : 5,\r\n \"sku\" : \"123456\",\r\n \"quantityOrderMaximum\" : 2,\r\n \"quantityOrderMinimum\" : 1,\r\n \"productIsFree\" : false,\r\n \"available\" : true,\r\n \"visible\" : true,\r\n \"productLength\" : 20,\r\n \"productWidth\" : 20,\r\n \"productHeight\" : 20,\r\n \"productWeight\" : 20,\r\n \"rating\" : 0.0,\r\n \"ratingCount\" : 0,\r\n \"sortOrder\" : 0,\r\n \"dateAvailable\" : null,\r\n \"condition\" : null,\r\n \"rentalDuration\" : 0,\r\n \"rentalStatus\" : null,\r\n \"descriptions\" : [ {\r\n \"language\" : \"en\",\r\n \"name\" : \"Tag watch\",\r\n \"description\" : \"Tag watch\",\r\n \"keyWords\" : null,\r\n \"highlights\" : \"Formula 1 Tag watch\",\r\n \"title\" : \"Formula 1 Tag watch !\"\r\n }],\r\n \"categories\" : null,\r\n \"relatedProducts\" : null,\r\n \"manufacturer\" : null,\r\n \"owner\" : {\r\n \"id\":1\r\n }\r\n}",
+ "method": "POST",
+ "dataMode": "raw"
+ },
+ "id": "82b0750c-0f4e-2952-7f8f-ec55e859bbc9",
+ "name": "localhost:8080/api/v1/private/products - second item",
+ "status": "",
+ "responseCode": {
+ "code": 201,
+ "name": "Created"
+ },
+ "time": "220",
+ "headers": [
+ {
+ "name": "cache-control",
+ "key": "cache-control",
+ "value": "no-cache, no-store, max-age=0, must-revalidate",
+ "description": ""
+ },
+ {
+ "name": "content-type",
+ "key": "content-type",
+ "value": "application/json;charset=UTF-8",
+ "description": ""
+ },
+ {
+ "name": "date",
+ "key": "date",
+ "value": "Tue, 03 Oct 2017 01:09:52 GMT",
+ "description": ""
+ },
+ {
+ "name": "expires",
+ "key": "expires",
+ "value": "0",
+ "description": ""
+ },
+ {
+ "name": "pragma",
+ "key": "pragma",
+ "value": "no-cache",
+ "description": ""
+ },
+ {
+ "name": "server",
+ "key": "server",
+ "value": "Apache-Coyote/1.1",
+ "description": ""
+ },
+ {
+ "name": "transfer-encoding",
+ "key": "transfer-encoding",
+ "value": "chunked",
+ "description": ""
+ },
+ {
+ "name": "x-content-type-options",
+ "key": "x-content-type-options",
+ "value": "nosniff",
+ "description": ""
+ },
+ {
+ "name": "x-frame-options",
+ "key": "x-frame-options",
+ "value": "DENY",
+ "description": ""
+ },
+ {
+ "name": "x-xss-protection",
+ "key": "x-xss-protection",
+ "value": "1; mode=block",
+ "description": ""
+ }
+ ],
+ "cookies": [],
+ "mime": "",
+ "text": "{\n \"id\": 2,\n \"price\": 1450.99,\n \"quantity\": 5,\n \"sku\": \"123456\",\n \"productShipeable\": false,\n \"preOrder\": false,\n \"productVirtual\": false,\n \"quantityOrderMaximum\": 2,\n \"quantityOrderMinimum\": 1,\n \"productIsFree\": false,\n \"available\": true,\n \"visible\": true,\n \"productLength\": 20,\n \"productWidth\": 20,\n \"productHeight\": 20,\n \"productWeight\": 20,\n \"rating\": 0,\n \"ratingCount\": 0,\n \"sortOrder\": 0,\n \"dateAvailable\": null,\n \"refSku\": null,\n \"condition\": null,\n \"rentalDuration\": 0,\n \"rentalStatus\": null,\n \"descriptions\": [\n {\n \"id\": 0,\n \"language\": \"en\",\n \"name\": \"Tag watch\",\n \"description\": \"Tag watch\",\n \"friendlyUrl\": null,\n \"keyWords\": null,\n \"highlights\": \"Formula 1 Tag watch\",\n \"metaDescription\": null,\n \"title\": \"Formula 1 Tag watch !\"\n }\n ],\n \"attributes\": null,\n \"images\": null,\n \"productPrices\": null,\n \"categories\": null,\n \"relatedProducts\": null,\n \"manufacturer\": {\n \"id\": 2\n },\n \"owner\": {\n \"id\": 1,\n \"firstName\": null,\n \"lastName\": null,\n \"address\": null,\n \"emailAddress\": null\n }\n}",
+ "language": "json",
+ "rawDataType": "text",
+ "state": null,
+ "previewType": "text",
+ "searchResultScrolledTo": "-1",
+ "version": null,
+ "requestObject": "{\"url\":\"localhost:8080/api/v1/private/products\",\"pathVariables\":{},\"pathVariableData\":[],\"queryParams\":[],\"headerData\":[{\"key\":\"Accept\",\"value\":\"application/json\",\"enabled\":true,\"description\":\"\"},{\"key\":\"Content-Type\",\"value\":\"application/json\",\"enabled\":true,\"description\":\"\"},{\"key\":\"Authorization\",\"value\":\"Basic YWRtaW46cGFzc3dvcmQ=\",\"enabled\":true,\"description\":\"\"}],\"headers\":\"Accept: application/json\\nContent-Type: application/json\\nAuthorization: Basic YWRtaW46cGFzc3dvcmQ=\\n\",\"data\":\"{\\r\\n \\\"price\\\" : 1450.99,\\r\\n \\\"quantity\\\" : 5,\\r\\n \\\"sku\\\" : \\\"123456\\\",\\r\\n \\\"quantityOrderMaximum\\\" : 2,\\r\\n \\\"quantityOrderMinimum\\\" : 1,\\r\\n \\\"productIsFree\\\" : false,\\r\\n \\\"available\\\" : true,\\r\\n \\\"visible\\\" : true,\\r\\n \\\"productLength\\\" : 20,\\r\\n \\\"productWidth\\\" : 20,\\r\\n \\\"productHeight\\\" : 20,\\r\\n \\\"productWeight\\\" : 20,\\r\\n \\\"rating\\\" : 0.0,\\r\\n \\\"ratingCount\\\" : 0,\\r\\n \\\"sortOrder\\\" : 0,\\r\\n \\\"dateAvailable\\\" : null,\\r\\n \\\"condition\\\" : null,\\r\\n \\\"rentalDuration\\\" : 0,\\r\\n \\\"rentalStatus\\\" : null,\\r\\n \\\"descriptions\\\" : [ {\\r\\n \\\"language\\\" : \\\"en\\\",\\r\\n \\\"name\\\" : \\\"Tag watch\\\",\\r\\n \\\"description\\\" : \\\"Tag watch\\\",\\r\\n \\\"keyWords\\\" : null,\\r\\n \\\"highlights\\\" : \\\"Formula 1 Tag watch\\\",\\r\\n \\\"title\\\" : \\\"Formula 1 Tag watch !\\\"\\r\\n }],\\r\\n \\\"categories\\\" : null,\\r\\n \\\"relatedProducts\\\" : null,\\r\\n \\\"manufacturer\\\" : null,\\r\\n \\\"owner\\\" : {\\r\\n \\\"id\\\":1\\r\\n }\\r\\n}\",\"method\":\"POST\",\"dataMode\":\"raw\"}",
+ "createdAt": "2017-10-03T01:10:36.000Z",
+ "updatedAt": "2017-10-03T01:10:36.000Z",
+ "write": true
+ }
+ ],
+ "isFromCollection": true,
+ "rawModeData": "{\r\n \"price\" : 1450.99,\r\n \"quantity\" : 5,\r\n \"sku\" : \"123456\",\r\n \"quantityOrderMaximum\" : 2,\r\n \"quantityOrderMinimum\" : 1,\r\n \"productIsFree\" : false,\r\n \"available\" : true,\r\n \"visible\" : true,\r\n \"productLength\" : 20,\r\n \"productWidth\" : 20,\r\n \"productHeight\" : 20,\r\n \"productWeight\" : 20,\r\n \"rating\" : 0.0,\r\n \"ratingCount\" : 0,\r\n \"sortOrder\" : 0,\r\n \"dateAvailable\" : null,\r\n \"condition\" : null,\r\n \"rentalDuration\" : 0,\r\n \"rentalStatus\" : null,\r\n \"descriptions\" : [ {\r\n \"language\" : \"en\",\r\n \"name\" : \"Tag watch\",\r\n \"description\" : \"Tag watch\",\r\n \"keyWords\" : null,\r\n \"highlights\" : \"Formula 1 Tag watch\",\r\n \"title\" : \"Formula 1 Tag watch !\"\r\n }],\r\n \"categories\" : null,\r\n \"relatedProducts\" : null,\r\n \"manufacturer\" : null,\r\n \"owner\" : {\r\n \"id\":1\r\n }\r\n}"
+ },
+ {
+ "id": "1d21e38f-ee3b-3ab0-3ba6-24e7cd4e5000",
+ "headers": "Accept: \nContent-Type: application/json\nAuthorization: Basic YWRtaW46cGFzc3dvcmQ=\n",
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Authorization",
+ "value": "Basic YWRtaW46cGFzc3dvcmQ=",
+ "description": "",
+ "enabled": true
+ }
+ ],
+ "url": "localhost:8080/api/v1/private/customers",
+ "folder": "7b72249f-ad93-f830-befb-cc432829f5b3",
+ "queryParams": [],
+ "preRequestScript": null,
+ "pathVariables": {},
+ "pathVariableData": [],
+ "method": "GET",
+ "data": [],
+ "dataMode": "raw",
+ "version": 2,
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "time": 1506532458419,
+ "name": "localhost:8080/api/v1/private/customers",
+ "description": "Get all customers\n\nadd paging controls (not required)\n\n?start=0\n&count=10\n\nwill start at the first item and retrieve only 10 entry",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "responses": [],
+ "rawModeData": "{\n\"emailAddress\":\"carl@csticonsulting.com\",\n\"gender\":\"M\",\n\"language\":\"en\",\n\"userName\":\"testuser\",\n\"clearPassword\":\"password\",\n\"billing\":{\n \"address\":\"352 Du Languedoc\",\n \"city\":\"Boucherville\",\n \"postalCode\":\"J4B 8J9\",\n \"country\":\"CA\",\n \"zone\":\"QC\",\n \"firstName\":\"Carl\",\n \"lastName\":\"Samson\"\n }\n}"
+ },
+ {
+ "id": "39d888df-9b21-5cb2-c557-85a9fa127aa3",
+ "headers": "Accept: application/json\nContent-Type: application/json\n",
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ }
+ ],
+ "url": "localhost:8080/api/v1/customers/1/cart",
+ "folder": "5b079195-2288-1184-d07a-2697ce2068e9",
+ "queryParams": [],
+ "preRequestScript": null,
+ "pathVariables": {},
+ "pathVariableData": [],
+ "method": "POST",
+ "data": [],
+ "dataMode": "raw",
+ "version": 2,
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "time": 1507135148548,
+ "name": "localhost:8080/api/v1/customers/{customerId}/cart",
+ "description": "Add a product to shopping cart that belongs to a given customer\n\n\nReturns the content of the shopping cart",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "responses": [],
+ "rawModeData": "{\r\n \"product\" : 1,\r\n \"quantity\": 1\r\n\r\n}"
+ },
+ {
+ "folder": "857235ff-53ce-0939-ea85-1e8af96e30cd",
+ "id": "3d6d4e5f-9501-0f67-1828-314051ff51e8",
+ "name": "localhost:8080/api/v1/auth/products - fourth item",
+ "dataMode": "raw",
+ "data": [],
+ "descriptionFormat": null,
+ "description": "API for the creation of a product using customer authentication API. Requires a valid customer created",
+ "headers": "Accept: application/json\nContent-Type: application/json\nAuthorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJjYXJsQGNzdGljb25zdWx0aW5nLmNvbSIsImF1ZCI6InVua25vd24iLCJleHAiOjE1MDc2MDA5MjAsImlhdCI6MTUwNjk5NjEyMH0._Af16M_ZX1jCTRaiwbL5DAlkMo2EL_3nc6yBPxhK7oaCyaa_SX-6z8842Y2c9CHCfNFXqBmE1dgXUBdJ1P0t4g\n",
+ "method": "POST",
+ "pathVariables": {},
+ "url": "localhost:8080/api/v1/auth/products",
+ "preRequestScript": null,
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "queryParams": [],
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Authorization",
+ "value": "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJjYXJsQGNzdGljb25zdWx0aW5nLmNvbSIsImF1ZCI6InVua25vd24iLCJleHAiOjE1MDc2MDA5MjAsImlhdCI6MTUwNjk5NjEyMH0._Af16M_ZX1jCTRaiwbL5DAlkMo2EL_3nc6yBPxhK7oaCyaa_SX-6z8842Y2c9CHCfNFXqBmE1dgXUBdJ1P0t4g",
+ "description": "",
+ "enabled": true
+ }
+ ],
+ "pathVariableData": [],
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "responses": [
+ {
+ "owner": "1350207",
+ "lastUpdatedBy": "1350207",
+ "lastRevision": 2314488566,
+ "request": {
+ "url": "localhost:8080/api/v1/private/products",
+ "pathVariables": {},
+ "pathVariableData": [],
+ "queryParams": [],
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ },
+ {
+ "key": "Authorization",
+ "value": "Basic YWRtaW46cGFzc3dvcmQ=",
+ "enabled": true,
+ "description": ""
+ }
+ ],
+ "headers": "Accept: application/json\nContent-Type: application/json\nAuthorization: Basic YWRtaW46cGFzc3dvcmQ=\n",
+ "data": "{\r\n \"price\" : 1450.99,\r\n \"quantity\" : 5,\r\n \"sku\" : \"123456\",\r\n \"quantityOrderMaximum\" : 2,\r\n \"quantityOrderMinimum\" : 1,\r\n \"productIsFree\" : false,\r\n \"available\" : true,\r\n \"visible\" : true,\r\n \"productLength\" : 20,\r\n \"productWidth\" : 20,\r\n \"productHeight\" : 20,\r\n \"productWeight\" : 20,\r\n \"rating\" : 0.0,\r\n \"ratingCount\" : 0,\r\n \"sortOrder\" : 0,\r\n \"dateAvailable\" : null,\r\n \"condition\" : null,\r\n \"rentalDuration\" : 0,\r\n \"rentalStatus\" : null,\r\n \"descriptions\" : [ {\r\n \"language\" : \"en\",\r\n \"name\" : \"Tag watch\",\r\n \"description\" : \"Tag watch\",\r\n \"keyWords\" : null,\r\n \"highlights\" : \"Formula 1 Tag watch\",\r\n \"title\" : \"Formula 1 Tag watch !\"\r\n }],\r\n \"categories\" : null,\r\n \"relatedProducts\" : null,\r\n \"manufacturer\" : null,\r\n \"owner\" : {\r\n \"id\":1\r\n }\r\n}",
+ "method": "POST",
+ "dataMode": "raw"
+ },
+ "id": "599a0d3d-ed37-367e-5199-524d482652d7",
+ "name": "localhost:8080/api/v1/private/products - second item",
+ "status": "",
+ "responseCode": {
+ "code": 201,
+ "name": "Created",
+ "detail": "The request has been fulfilled and resulted in a new resource being created."
+ },
+ "time": "220",
+ "headers": [
+ {
+ "name": "cache-control",
+ "key": "cache-control",
+ "value": "no-cache, no-store, max-age=0, must-revalidate",
+ "description": "Tells all caching mechanisms from server to client whether they may cache this object. It is measured in seconds"
+ },
+ {
+ "name": "content-type",
+ "key": "content-type",
+ "value": "application/json;charset=UTF-8",
+ "description": "The mime type of this content"
+ },
+ {
+ "name": "date",
+ "key": "date",
+ "value": "Tue, 03 Oct 2017 01:09:52 GMT",
+ "description": "The date and time that the message was sent"
+ },
+ {
+ "name": "expires",
+ "key": "expires",
+ "value": "0",
+ "description": "Gives the date/time after which the response is considered stale"
+ },
+ {
+ "name": "pragma",
+ "key": "pragma",
+ "value": "no-cache",
+ "description": "Implementation-specific headers that may have various effects anywhere along the request-response chain."
+ },
+ {
+ "name": "server",
+ "key": "server",
+ "value": "Apache-Coyote/1.1",
+ "description": "A name for the server"
+ },
+ {
+ "name": "transfer-encoding",
+ "key": "transfer-encoding",
+ "value": "chunked",
+ "description": "The form of encoding used to safely transfer the entity to the user. Currently defined methods are: chunked, compress, deflate, gzip, identity."
+ },
+ {
+ "name": "x-content-type-options",
+ "key": "x-content-type-options",
+ "value": "nosniff",
+ "description": "The only defined value, \"nosniff\", prevents Internet Explorer from MIME-sniffing a response away from the declared content-type"
+ },
+ {
+ "name": "x-frame-options",
+ "key": "x-frame-options",
+ "value": "DENY",
+ "description": "Clickjacking protection: \"deny\" - no rendering within a frame, \"sameorigin\" - no rendering if origin mismatch"
+ },
+ {
+ "name": "x-xss-protection",
+ "key": "x-xss-protection",
+ "value": "1; mode=block",
+ "description": "Cross-site scripting (XSS) filter"
+ }
+ ],
+ "cookies": [],
+ "mime": "",
+ "text": "{\n \"id\": 2,\n \"price\": 1450.99,\n \"quantity\": 5,\n \"sku\": \"123456\",\n \"productShipeable\": false,\n \"preOrder\": false,\n \"productVirtual\": false,\n \"quantityOrderMaximum\": 2,\n \"quantityOrderMinimum\": 1,\n \"productIsFree\": false,\n \"available\": true,\n \"visible\": true,\n \"productLength\": 20,\n \"productWidth\": 20,\n \"productHeight\": 20,\n \"productWeight\": 20,\n \"rating\": 0,\n \"ratingCount\": 0,\n \"sortOrder\": 0,\n \"dateAvailable\": null,\n \"refSku\": null,\n \"condition\": null,\n \"rentalDuration\": 0,\n \"rentalStatus\": null,\n \"descriptions\": [\n {\n \"id\": 0,\n \"language\": \"en\",\n \"name\": \"Tag watch\",\n \"description\": \"Tag watch\",\n \"friendlyUrl\": null,\n \"keyWords\": null,\n \"highlights\": \"Formula 1 Tag watch\",\n \"metaDescription\": null,\n \"title\": \"Formula 1 Tag watch !\"\n }\n ],\n \"attributes\": null,\n \"images\": null,\n \"productPrices\": null,\n \"categories\": null,\n \"relatedProducts\": null,\n \"manufacturer\": {\n \"id\": 2\n },\n \"owner\": {\n \"id\": 1,\n \"firstName\": null,\n \"lastName\": null,\n \"address\": null,\n \"emailAddress\": null\n }\n}",
+ "language": "json",
+ "rawDataType": "text",
+ "state": null,
+ "previewType": "text",
+ "searchResultScrolledTo": "-1",
+ "version": null,
+ "requestObject": "{\"url\":\"localhost:8080/api/v1/private/products\",\"pathVariables\":{},\"pathVariableData\":[],\"queryParams\":[],\"headerData\":[{\"key\":\"Accept\",\"value\":\"application/json\",\"enabled\":true,\"description\":\"\"},{\"key\":\"Content-Type\",\"value\":\"application/json\",\"enabled\":true,\"description\":\"\"},{\"key\":\"Authorization\",\"value\":\"Basic YWRtaW46cGFzc3dvcmQ=\",\"enabled\":true,\"description\":\"\"}],\"headers\":\"Accept: application/json\\nContent-Type: application/json\\nAuthorization: Basic YWRtaW46cGFzc3dvcmQ=\\n\",\"data\":\"{\\r\\n \\\"price\\\" : 1450.99,\\r\\n \\\"quantity\\\" : 5,\\r\\n \\\"sku\\\" : \\\"123456\\\",\\r\\n \\\"quantityOrderMaximum\\\" : 2,\\r\\n \\\"quantityOrderMinimum\\\" : 1,\\r\\n \\\"productIsFree\\\" : false,\\r\\n \\\"available\\\" : true,\\r\\n \\\"visible\\\" : true,\\r\\n \\\"productLength\\\" : 20,\\r\\n \\\"productWidth\\\" : 20,\\r\\n \\\"productHeight\\\" : 20,\\r\\n \\\"productWeight\\\" : 20,\\r\\n \\\"rating\\\" : 0.0,\\r\\n \\\"ratingCount\\\" : 0,\\r\\n \\\"sortOrder\\\" : 0,\\r\\n \\\"dateAvailable\\\" : null,\\r\\n \\\"condition\\\" : null,\\r\\n \\\"rentalDuration\\\" : 0,\\r\\n \\\"rentalStatus\\\" : null,\\r\\n \\\"descriptions\\\" : [ {\\r\\n \\\"language\\\" : \\\"en\\\",\\r\\n \\\"name\\\" : \\\"Tag watch\\\",\\r\\n \\\"description\\\" : \\\"Tag watch\\\",\\r\\n \\\"keyWords\\\" : null,\\r\\n \\\"highlights\\\" : \\\"Formula 1 Tag watch\\\",\\r\\n \\\"title\\\" : \\\"Formula 1 Tag watch !\\\"\\r\\n }],\\r\\n \\\"categories\\\" : null,\\r\\n \\\"relatedProducts\\\" : null,\\r\\n \\\"manufacturer\\\" : null,\\r\\n \\\"owner\\\" : {\\r\\n \\\"id\\\":1\\r\\n }\\r\\n}\",\"method\":\"POST\",\"dataMode\":\"raw\"}",
+ "createdAt": "2017-10-03T02:02:52.000Z",
+ "updatedAt": "2017-10-03T02:02:52.000Z",
+ "write": true
+ },
+ {
+ "owner": "1350207",
+ "lastUpdatedBy": "1350207",
+ "lastRevision": 2314488564,
+ "request": {},
+ "id": "35077ba2-0b45-0c8b-fb26-92661eadb9a0",
+ "name": "localhost:8080/api/v1/private/products",
+ "status": "",
+ "responseCode": {
+ "code": 200,
+ "name": "OK"
+ },
+ "time": "0",
+ "headers": [],
+ "cookies": [],
+ "mime": "",
+ "text": "",
+ "language": "",
+ "rawDataType": "",
+ "state": null,
+ "previewType": "parsed",
+ "searchResultScrolledTo": "-1",
+ "version": null,
+ "requestObject": "5395f9cf-3797-e226-092c-80ae5dd24353",
+ "createdAt": "2017-10-03T02:02:52.000Z",
+ "updatedAt": "2017-10-03T02:02:52.000Z",
+ "write": true
+ }
+ ],
+ "isFromCollection": true,
+ "collectionRequestId": "3d6d4e5f-9501-0f67-1828-314051ff51e8",
+ "rawModeData": "{\r\n \"price\" : 14.99,\r\n \"quantity\" : 5,\r\n \"sku\" : \"1234ee\",\r\n \"quantityOrderMaximum\" : 2,\r\n \"quantityOrderMinimum\" : 1,\r\n \"productIsFree\" : false,\r\n \"available\" : true,\r\n \"visible\" : true,\r\n \"productLength\" : 20,\r\n \"productWidth\" : 20,\r\n \"productHeight\" : 20,\r\n \"productWeight\" : 20,\r\n \"rating\" : 0.0,\r\n \"ratingCount\" : 0,\r\n \"sortOrder\" : 0,\r\n \"dateAvailable\" : null,\r\n \"condition\" : null,\r\n \"rentalDuration\" : 0,\r\n \"rentalStatus\" : null,\r\n \"descriptions\" : [ {\r\n \"language\" : \"en\",\r\n \"name\" : \"Test auth\",\r\n \"description\" : \"Test auth\",\r\n \"keyWords\" : null,\r\n \"highlights\" : \"Test test test\",\r\n \"title\" : \"Test !\"\r\n }],\r\n \"categories\" : null,\r\n \"relatedProducts\" : null,\r\n \"manufacturer\" : null,\r\n \"owner\" : {\r\n \"id\":1\r\n }\r\n}"
+ },
+ {
+ "id": "4698e684-6f23-4ba0-f93c-908aa59d5672",
+ "headers": "Content-Type: application/json\n",
+ "headerData": [
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ }
+ ],
+ "url": "localhost:8080/api/v1/auth/login",
+ "folder": "7a1df60f-761b-9df6-f95b-e7062f2486ed",
+ "queryParams": [],
+ "preRequestScript": null,
+ "pathVariables": {},
+ "pathVariableData": [],
+ "method": "POST",
+ "data": [],
+ "dataMode": "raw",
+ "version": 2,
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "time": 1507048991868,
+ "name": "localhost:8080/api/v1/auth/login",
+ "description": "Login as a Customer",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "responses": [],
+ "rawModeData": "{\n\t\"username\":\"carl@csticonsulting.com\",\n\t\"password\":\"password\"\n}"
+ },
+ {
+ "id": "5395f9cf-3797-e226-092c-80ae5dd24353",
+ "headers": "Accept: application/json\nContent-Type: application/json\nAuthorization: Basic YWRtaW46cGFzc3dvcmQ=\n",
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ },
+ {
+ "key": "Authorization",
+ "value": "Basic YWRtaW46cGFzc3dvcmQ=",
+ "enabled": true,
+ "description": ""
+ }
+ ],
+ "url": "localhost:8080/api/v1/private/products",
+ "folder": "7b91c544-0b63-7781-6fbb-cb08d1d1a4b7",
+ "queryParams": [],
+ "preRequestScript": null,
+ "pathVariables": {},
+ "pathVariableData": [],
+ "method": "POST",
+ "data": [],
+ "dataMode": "raw",
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": "{}",
+ "time": 1506013984209,
+ "name": "localhost:8080/api/v1/private/products",
+ "description": "API for the creation of a product",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "responses": [
+ {
+ "owner": "1350207",
+ "lastUpdatedBy": "1350207",
+ "lastRevision": 2135946655,
+ "request": {
+ "url": "localhost:8080/api/v1/private/products",
+ "pathVariables": {},
+ "pathVariableData": [],
+ "queryParams": [],
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ }
+ ],
+ "headers": "Accept: application/json\nContent-Type: application/json\n",
+ "data": "{\r\n \"price\" : 25.99,\r\n \"quantity\" : 5,\r\n \"sku\" : \"abcdef\",\r\n \"quantityOrderMaximum\" : 2,\r\n \"quantityOrderMinimum\" : 1,\r\n \"productIsFree\" : false,\r\n \"available\" : true,\r\n \"visible\" : true,\r\n \"productLength\" : 20,\r\n \"productWidth\" : 20,\r\n \"productHeight\" : 20,\r\n \"productWeight\" : 20,\r\n \"rating\" : 0.0,\r\n \"ratingCount\" : 0,\r\n \"sortOrder\" : 0,\r\n \"dateAvailable\" : null,\r\n \"condition\" : null,\r\n \"rentalDuration\" : 0,\r\n \"rentalStatus\" : null,\r\n \"descriptions\" : [ {\r\n \"language\" : \"en\",\r\n \"name\" : \"Buddha Head\",\r\n \"description\" : \"Buddha Head\",\r\n \"keyWords\" : null,\r\n \"highlights\" : \"Short description\",\r\n \"title\" : \"Buddha Head\"\r\n }],\r\n \"categories\" : null,\r\n \"relatedProducts\" : null,\r\n \"manufacturer\" : null,\r\n \"owner\" : {\r\n \r\n \"id\":1\r\n }\r\n}",
+ "method": "POST",
+ "dataMode": "raw"
+ },
+ "id": "a24e76eb-e468-bb8a-d762-13846b0190d5",
+ "name": "localhost:8080/api/v1/private/products",
+ "status": "",
+ "responseCode": {
+ "code": 200,
+ "name": "OK"
+ },
+ "time": "0",
+ "headers": [],
+ "cookies": [],
+ "mime": "",
+ "text": "",
+ "language": "",
+ "rawDataType": "",
+ "state": null,
+ "previewType": "parsed",
+ "searchResultScrolledTo": "-1",
+ "version": null,
+ "requestObject": "{\"url\":\"localhost:8080/api/v1/private/products\",\"pathVariables\":{},\"pathVariableData\":[],\"queryParams\":[],\"headerData\":[{\"key\":\"Accept\",\"value\":\"application/json\",\"enabled\":true,\"description\":\"\"},{\"key\":\"Content-Type\",\"value\":\"application/json\",\"enabled\":true,\"description\":\"\"}],\"headers\":\"Accept: application/json\\nContent-Type: application/json\\n\",\"data\":\"{\\r\\n \\\"price\\\" : 25.99,\\r\\n \\\"quantity\\\" : 5,\\r\\n \\\"sku\\\" : \\\"abcdef\\\",\\r\\n \\\"quantityOrderMaximum\\\" : 2,\\r\\n \\\"quantityOrderMinimum\\\" : 1,\\r\\n \\\"productIsFree\\\" : false,\\r\\n \\\"available\\\" : true,\\r\\n \\\"visible\\\" : true,\\r\\n \\\"productLength\\\" : 20,\\r\\n \\\"productWidth\\\" : 20,\\r\\n \\\"productHeight\\\" : 20,\\r\\n \\\"productWeight\\\" : 20,\\r\\n \\\"rating\\\" : 0.0,\\r\\n \\\"ratingCount\\\" : 0,\\r\\n \\\"sortOrder\\\" : 0,\\r\\n \\\"dateAvailable\\\" : null,\\r\\n \\\"condition\\\" : null,\\r\\n \\\"rentalDuration\\\" : 0,\\r\\n \\\"rentalStatus\\\" : null,\\r\\n \\\"descriptions\\\" : [ {\\r\\n \\\"language\\\" : \\\"en\\\",\\r\\n \\\"name\\\" : \\\"Buddha Head\\\",\\r\\n \\\"description\\\" : \\\"Buddha Head\\\",\\r\\n \\\"keyWords\\\" : null,\\r\\n \\\"highlights\\\" : \\\"Short description\\\",\\r\\n \\\"title\\\" : \\\"Buddha Head\\\"\\r\\n }],\\r\\n \\\"categories\\\" : null,\\r\\n \\\"relatedProducts\\\" : null,\\r\\n \\\"manufacturer\\\" : null,\\r\\n \\\"owner\\\" : {\\r\\n \\r\\n \\\"id\\\":1\\r\\n }\\r\\n}\",\"method\":\"POST\",\"dataMode\":\"raw\"}",
+ "createdAt": "2017-09-03T20:59:15.000Z",
+ "updatedAt": "2017-09-03T20:59:15.000Z",
+ "write": true
+ }
+ ],
+ "isFromCollection": true,
+ "collectionRequestId": "5395f9cf-3797-e226-092c-80ae5dd24353",
+ "timestamp": null,
+ "rawModeData": "{\r\n \"price\" : 25.99,\r\n \"quantity\" : 5,\r\n \"sku\" : \"abcdefg\",\r\n \"quantityOrderMaximum\" : 2,\r\n \"quantityOrderMinimum\" : 1,\r\n \"productIsFree\" : false,\r\n \"available\" : true,\r\n \"visible\" : true,\r\n \"productLength\" : 20,\r\n \"productWidth\" : 20,\r\n \"productHeight\" : 20,\r\n \"productWeight\" : 20,\r\n \"rating\" : 0.0,\r\n \"ratingCount\" : 0,\r\n \"sortOrder\" : 0,\r\n \"dateAvailable\" : null,\r\n \"condition\" : null,\r\n \"rentalDuration\" : 0,\r\n \"rentalStatus\" : null,\r\n \"descriptions\" : [ {\r\n \"language\" : \"en\",\r\n \"name\" : \"My Second Item\",\r\n \"description\" : \"This is the description for my second item\",\r\n \"keyWords\" : null,\r\n \"highlights\" : \"Short description\",\r\n \"title\" : \"Second item !\"\r\n }],\r\n \"categories\" : null,\r\n \"relatedProducts\" : null,\r\n \"manufacturer\" : null,\r\n \"owner\" : {\r\n\t\"id\":1\r\n }\r\n}"
+ },
+ {
+ "id": "5e3f6a0e-6bb8-e8d3-75a7-f8d2b17a4aa1",
+ "headers": "Accept: application/json\nContent-Type: application/json\n",
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ }
+ ],
+ "url": "localhost:8080/api/v1/private/products/1/images",
+ "folder": "7b91c544-0b63-7781-6fbb-cb08d1d1a4b7",
+ "queryParams": [],
+ "preRequestScript": null,
+ "pathVariables": {},
+ "pathVariableData": [],
+ "method": "POST",
+ "data": [],
+ "dataMode": "raw",
+ "version": 2,
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": "{}",
+ "time": 1506439743090,
+ "name": "localhost:8080/api/v1/private/products/{id}/images",
+ "description": "",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "responses": [],
+ "timestamp": null,
+ "rawModeData": "{\n\t\n\t\"defaultImage\":true,\n\t\"imageName\":\"My item image\",\n\t\"bytes\":\"1fe3frdfgjelf\",\n\t\"contentType\":\"image/jpeg\"\n\t\n}"
+ },
+ {
+ "folder": "08dac1ef-e0bd-275b-1c44-60674745f9dd",
+ "id": "80674bcf-b0af-eaa8-507a-a5194feaa9db",
+ "name": "localhost:8080/api/v1/customers/{id}/reviews",
+ "dataMode": "raw",
+ "data": [],
+ "descriptionFormat": "html",
+ "description": "Get reviews created for customer id specified",
+ "headers": "Authorization: Basic YWRtaW46cGFzc3dvcmQ=\nAccept: application/json\nContent-Type: application/json\n",
+ "method": "GET",
+ "pathVariables": {},
+ "url": "localhost:8080/api/v1/customers/2/reviews",
+ "preRequestScript": null,
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "queryParams": [],
+ "headerData": [
+ {
+ "key": "Authorization",
+ "value": "Basic YWRtaW46cGFzc3dvcmQ=",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ }
+ ],
+ "pathVariableData": [],
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "rawModeData": "{\n\"emailAddress\":\"carl@csticonsulting.com\",\n\"gender\":\"M\",\n\"language\":\"en\",\n\"userName\":\"testuser\",\n\"clearPassword\":\"password\",\n\"billing\":{\n \"address\":\"352 Du Languedoc\",\n \"city\":\"Boucherville\",\n \"postalCode\":\"J4B 8J9\",\n \"country\":\"CA\",\n \"zone\":\"QC\",\n \"firstName\":\"Carl\",\n \"lastName\":\"Samson\"\n }\n}"
+ },
+ {
+ "folder": "7b72249f-ad93-f830-befb-cc432829f5b3",
+ "id": "8fe74ae2-d104-76be-3544-45f2a9040d46",
+ "name": "localhost:8080/api/v1/private/customers - second customer",
+ "dataMode": "raw",
+ "data": [],
+ "descriptionFormat": "html",
+ "description": "",
+ "headers": "Content-Type: application/json\nAccept: application/json\nAuthorization: Basic YWRtaW46cGFzc3dvcmQ=\n",
+ "method": "POST",
+ "pathVariables": {},
+ "url": "localhost:8080/api/v1/private/customers",
+ "preRequestScript": null,
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "queryParams": [],
+ "headerData": [
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Authorization",
+ "value": "Basic YWRtaW46cGFzc3dvcmQ=",
+ "description": "",
+ "enabled": true
+ }
+ ],
+ "pathVariableData": [],
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "rawModeData": "{\n\"emailAddress\":\"john@acme.com\",\n\"gender\":\"M\",\n\"language\":\"en\",\n\"userName\":\"testuser2\",\n\"clearPassword\":\"password2\",\n\"billing\":{\n \"address\":\"123 that street\",\n \"city\":\"Boucherville\",\n \"postalCode\":\"99945\",\n \"country\":\"US\",\n \"zone\":\"CA\",\n \"firstName\":\"John\",\n \"lastName\":\"Doe\"\n }\n}"
+ },
+ {
+ "id": "9de73cd0-51a5-e17f-5940-feeabfa77faf",
+ "headers": "Accept: application/json\nContent-Type: application/json\nAuthorization: Basic YWRtaW46cGFzc3dvcmQ=\n",
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Authorization",
+ "value": "Basic YWRtaW46cGFzc3dvcmQ=",
+ "description": "",
+ "enabled": true
+ }
+ ],
+ "url": "localhost:8080/api/v1/private/manufacturers",
+ "folder": "b9d229d5-34ae-f67a-ccbb-10191c7da262",
+ "queryParams": [],
+ "preRequestScript": null,
+ "pathVariables": {},
+ "pathVariableData": [],
+ "method": "POST",
+ "data": [],
+ "dataMode": "raw",
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "time": 1505933084699,
+ "name": "localhost:8080/api/v1/private/manufacturers",
+ "description": "API for creating a manufacturer",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "responses": [
+ {
+ "owner": "1350207",
+ "lastUpdatedBy": "1350207",
+ "lastRevision": 2245383501,
+ "request": {
+ "url": "localhost:8080/api/v1/private/manufacturers",
+ "pathVariables": {},
+ "pathVariableData": [],
+ "queryParams": [],
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ },
+ {
+ "key": "Authorization",
+ "name": "Authorization",
+ "value": "Basic YWRtaW46cGFzc3dvcmQ=",
+ "description": "",
+ "enabled": true
+ }
+ ],
+ "headers": "Accept: application/json\nContent-Type: application/json\nAuthorization: Basic YWRtaW46cGFzc3dvcmQ=\n",
+ "data": "{\r\n \"code\" : \"taghueur\",\r\n \"order\" : 1,\r\n \"descriptions\" : [ {\r\n \"language\" : \"en\",\r\n \"name\" : \"Tag Heuer\",\r\n \"friendlyUrl\" : \"tag-watches\",\r\n \"title\" : \"Tag Heuer\"\r\n } ]\r\n}",
+ "method": "POST",
+ "dataMode": "raw"
+ },
+ "id": "77da6a99-fc09-ee54-7826-b0e83b8bc382",
+ "name": "localhost:8080/api/v1/private/manufacturers",
+ "status": "",
+ "responseCode": {
+ "code": 201,
+ "name": "Created"
+ },
+ "time": "52970",
+ "headers": [
+ {
+ "name": "cache-control",
+ "key": "cache-control",
+ "value": "no-cache, no-store, max-age=0, must-revalidate",
+ "description": ""
+ },
+ {
+ "name": "content-type",
+ "key": "content-type",
+ "value": "application/json;charset=UTF-8",
+ "description": ""
+ },
+ {
+ "name": "date",
+ "key": "date",
+ "value": "Wed, 20 Sep 2017 18:44:38 GMT",
+ "description": ""
+ },
+ {
+ "name": "expires",
+ "key": "expires",
+ "value": "0",
+ "description": ""
+ },
+ {
+ "name": "pragma",
+ "key": "pragma",
+ "value": "no-cache",
+ "description": ""
+ },
+ {
+ "name": "server",
+ "key": "server",
+ "value": "Apache-Coyote/1.1",
+ "description": ""
+ },
+ {
+ "name": "transfer-encoding",
+ "key": "transfer-encoding",
+ "value": "chunked",
+ "description": ""
+ },
+ {
+ "name": "x-content-type-options",
+ "key": "x-content-type-options",
+ "value": "nosniff",
+ "description": ""
+ },
+ {
+ "name": "x-frame-options",
+ "key": "x-frame-options",
+ "value": "DENY",
+ "description": ""
+ },
+ {
+ "name": "x-xss-protection",
+ "key": "x-xss-protection",
+ "value": "1; mode=block",
+ "description": ""
+ }
+ ],
+ "cookies": [],
+ "mime": "",
+ "text": "{\"id\":100,\"code\":\"taghueur\",\"order\":1,\"descriptions\":[{\"id\":0,\"language\":\"en\",\"name\":\"Tag Heuer\",\"description\":null,\"friendlyUrl\":\"tag-watches\",\"keyWords\":null,\"highlights\":null,\"metaDescription\":null,\"title\":\"Tag Heuer\"}]}",
+ "language": "json",
+ "rawDataType": "text",
+ "state": null,
+ "previewType": "text",
+ "searchResultScrolledTo": "-1",
+ "version": null,
+ "requestObject": "{\"url\":\"localhost:8080/api/v1/private/manufacturers\",\"pathVariables\":{},\"pathVariableData\":[],\"queryParams\":[],\"headerData\":[{\"key\":\"Accept\",\"value\":\"application/json\",\"enabled\":true,\"description\":\"\"},{\"key\":\"Content-Type\",\"value\":\"application/json\",\"enabled\":true,\"description\":\"\"},{\"key\":\"Authorization\",\"name\":\"Authorization\",\"value\":\"Basic YWRtaW46cGFzc3dvcmQ=\",\"description\":\"\",\"enabled\":true}],\"headers\":\"Accept: application/json\\nContent-Type: application/json\\nAuthorization: Basic YWRtaW46cGFzc3dvcmQ=\\n\",\"data\":\"{\\r\\n \\\"code\\\" : \\\"taghueur\\\",\\r\\n \\\"order\\\" : 1,\\r\\n \\\"descriptions\\\" : [ {\\r\\n \\\"language\\\" : \\\"en\\\",\\r\\n \\\"name\\\" : \\\"Tag Heuer\\\",\\r\\n \\\"friendlyUrl\\\" : \\\"tag-watches\\\",\\r\\n \\\"title\\\" : \\\"Tag Heuer\\\"\\r\\n } ]\\r\\n}\",\"method\":\"POST\",\"dataMode\":\"raw\"}",
+ "createdAt": "2017-09-20T19:03:44.000Z",
+ "updatedAt": "2017-09-20T19:03:44.000Z",
+ "write": true
+ }
+ ],
+ "rawModeData": "{\r\n \"code\" : \"taghueur\",\r\n \"order\" : 1,\r\n \"descriptions\" : [ {\r\n \"language\" : \"en\",\r\n \"name\" : \"Tag Heuer\",\r\n \"friendlyUrl\" : \"tag-watches\",\r\n \"title\" : \"Tag Heuer\"\r\n } ]\r\n}"
+ },
+ {
+ "id": "a670e5e6-e9e1-1a2f-17ab-62f68d58fc96",
+ "headers": "",
+ "headerData": [],
+ "url": "localhost:8080/api/v1/products/1",
+ "folder": "869901fd-ebbd-566c-4458-9ef2d787f781",
+ "queryParams": [],
+ "preRequestScript": null,
+ "pathVariables": {},
+ "pathVariableData": [],
+ "method": "GET",
+ "data": [],
+ "dataMode": "raw",
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "time": 1506452415578,
+ "name": "localhost:8080/api/v1/products/{id}",
+ "description": "Ge a product by id",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "rawModeData": "{\r\n \"price\" : 25.99,\r\n \"quantity\" : 5,\r\n \"sku\" : \"abcdef\",\r\n \"quantityOrderMaximum\" : 2,\r\n \"quantityOrderMinimum\" : 1,\r\n \"productIsFree\" : false,\r\n \"available\" : true,\r\n \"visible\" : true,\r\n \"productLength\" : 20,\r\n \"productWidth\" : 20,\r\n \"productHeight\" : 20,\r\n \"productWeight\" : 20,\r\n \"rating\" : 0.0,\r\n \"ratingCount\" : 0,\r\n \"sortOrder\" : 0,\r\n \"dateAvailable\" : null,\r\n \"condition\" : null,\r\n \"rentalDuration\" : 0,\r\n \"rentalStatus\" : null,\r\n \"descriptions\" : [ {\r\n \"language\" : \"en\",\r\n \"name\" : \"Buddha Head\",\r\n \"description\" : \"Buddha Head\",\r\n \"keyWords\" : null,\r\n \"highlights\" : \"Short description\",\r\n \"title\" : \"Buddha Head\"\r\n }],\r\n \"categories\" : null,\r\n \"relatedProducts\" : null,\r\n \"manufacturer\" : null,\r\n \"owner\" : {\r\n \r\n \"id\":1\r\n }\r\n}"
+ },
+ {
+ "id": "ad55afb5-8fc9-b4ba-b319-d50ad401d896",
+ "headers": "Accept: application/json\nContent-Type: application/json\n",
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ }
+ ],
+ "url": "localhost:8080/api/v1/products/1/reviews",
+ "folder": "7b91c544-0b63-7781-6fbb-cb08d1d1a4b7",
+ "queryParams": [],
+ "preRequestScript": null,
+ "pathVariables": {},
+ "pathVariableData": [],
+ "method": "GET",
+ "data": [],
+ "dataMode": "raw",
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "time": 1505134953407,
+ "name": "localhost:8080/api/v1/private/products/{id}/reviews",
+ "description": "API for creating a product review",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "responses": [
+ {
+ "owner": "1350207",
+ "lastUpdatedBy": "1350207",
+ "lastRevision": 2281116925,
+ "request": {
+ "url": "localhost:8080/api/v1/private/products",
+ "pathVariables": {},
+ "pathVariableData": [],
+ "queryParams": [],
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ }
+ ],
+ "headers": "Accept: application/json\nContent-Type: application/json\n",
+ "data": "{\r\n \"price\" : 25.99,\r\n \"quantity\" : 5,\r\n \"sku\" : \"abcdef\",\r\n \"quantityOrderMaximum\" : 2,\r\n \"quantityOrderMinimum\" : 1,\r\n \"productIsFree\" : false,\r\n \"available\" : true,\r\n \"visible\" : true,\r\n \"productLength\" : 20,\r\n \"productWidth\" : 20,\r\n \"productHeight\" : 20,\r\n \"productWeight\" : 20,\r\n \"rating\" : 0.0,\r\n \"ratingCount\" : 0,\r\n \"sortOrder\" : 0,\r\n \"dateAvailable\" : null,\r\n \"condition\" : null,\r\n \"rentalDuration\" : 0,\r\n \"rentalStatus\" : null,\r\n \"descriptions\" : [ {\r\n \"language\" : \"en\",\r\n \"name\" : \"Buddha Head\",\r\n \"description\" : \"Buddha Head\",\r\n \"keyWords\" : null,\r\n \"highlights\" : \"Short description\",\r\n \"title\" : \"Buddha Head\"\r\n }],\r\n \"categories\" : null,\r\n \"relatedProducts\" : null,\r\n \"manufacturer\" : null,\r\n \"owner\" : {\r\n \r\n \"id\":1\r\n }\r\n}",
+ "method": "POST",
+ "dataMode": "raw"
+ },
+ "id": "57463716-76f6-062e-a35c-e511e38fc9b9",
+ "name": "localhost:8080/api/v1/private/products",
+ "status": "",
+ "responseCode": {
+ "code": 200,
+ "name": "OK"
+ },
+ "time": "0",
+ "headers": [],
+ "cookies": [],
+ "mime": "",
+ "text": "",
+ "language": "",
+ "rawDataType": "",
+ "state": null,
+ "previewType": "parsed",
+ "searchResultScrolledTo": "-1",
+ "version": null,
+ "requestObject": "{\"url\":\"localhost:8080/api/v1/private/products\",\"pathVariables\":{},\"pathVariableData\":[],\"queryParams\":[],\"headerData\":[{\"key\":\"Accept\",\"value\":\"application/json\",\"enabled\":true,\"description\":\"\"},{\"key\":\"Content-Type\",\"value\":\"application/json\",\"enabled\":true,\"description\":\"\"}],\"headers\":\"Accept: application/json\\nContent-Type: application/json\\n\",\"data\":\"{\\r\\n \\\"price\\\" : 25.99,\\r\\n \\\"quantity\\\" : 5,\\r\\n \\\"sku\\\" : \\\"abcdef\\\",\\r\\n \\\"quantityOrderMaximum\\\" : 2,\\r\\n \\\"quantityOrderMinimum\\\" : 1,\\r\\n \\\"productIsFree\\\" : false,\\r\\n \\\"available\\\" : true,\\r\\n \\\"visible\\\" : true,\\r\\n \\\"productLength\\\" : 20,\\r\\n \\\"productWidth\\\" : 20,\\r\\n \\\"productHeight\\\" : 20,\\r\\n \\\"productWeight\\\" : 20,\\r\\n \\\"rating\\\" : 0.0,\\r\\n \\\"ratingCount\\\" : 0,\\r\\n \\\"sortOrder\\\" : 0,\\r\\n \\\"dateAvailable\\\" : null,\\r\\n \\\"condition\\\" : null,\\r\\n \\\"rentalDuration\\\" : 0,\\r\\n \\\"rentalStatus\\\" : null,\\r\\n \\\"descriptions\\\" : [ {\\r\\n \\\"language\\\" : \\\"en\\\",\\r\\n \\\"name\\\" : \\\"Buddha Head\\\",\\r\\n \\\"description\\\" : \\\"Buddha Head\\\",\\r\\n \\\"keyWords\\\" : null,\\r\\n \\\"highlights\\\" : \\\"Short description\\\",\\r\\n \\\"title\\\" : \\\"Buddha Head\\\"\\r\\n }],\\r\\n \\\"categories\\\" : null,\\r\\n \\\"relatedProducts\\\" : null,\\r\\n \\\"manufacturer\\\" : null,\\r\\n \\\"owner\\\" : {\\r\\n \\r\\n \\\"id\\\":1\\r\\n }\\r\\n}\",\"method\":\"POST\",\"dataMode\":\"raw\"}",
+ "createdAt": "2017-09-26T18:48:22.000Z",
+ "updatedAt": "2017-09-26T18:48:22.000Z",
+ "write": true
+ }
+ ],
+ "descriptionFormat": null,
+ "isFromCollection": true,
+ "rawModeData": "{\r\n \"rating\":3.5,\r\n \"description\" : \"Seems to be a good item compared to similar ones i wanted to test but the price was unfotunately above my budget. Thanks to the team !\",\r\n \"productId\" : 1,\r\n \"customerId\" : 1\r\n}"
+ },
+ {
+ "id": "b113b1fc-faa8-01d8-9f3e-31445ff5c798",
+ "headers": "Accept: application/json\nContent-Type: application/json\nAuthorization: Basic YWRtaW46cGFzc3dvcmQ=\n",
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ },
+ {
+ "key": "Authorization",
+ "value": "Basic YWRtaW46cGFzc3dvcmQ=",
+ "enabled": true,
+ "description": ""
+ }
+ ],
+ "url": "localhost:8080/api/v1/private/products/1/group/FEATURED_ITEM",
+ "folder": "5bcca65d-6d40-d64c-6d60-e842260f16d3",
+ "queryParams": [],
+ "preRequestScript": null,
+ "pathVariables": {},
+ "pathVariableData": [],
+ "method": "POST",
+ "data": [],
+ "dataMode": "raw",
+ "version": 2,
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": "{}",
+ "time": 1506357150078,
+ "name": "localhost:8080/api/v1/private/products/{productId}/group/{code}",
+ "description": "Add a product to a group\n\nThis url adds product ID 251 to group FEATURED\n\n*** Returns the groupo list",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "responses": [],
+ "descriptionFormat": "html",
+ "rawModeData": "{\r\n \"price\" : 25.99,\r\n \"quantity\" : 5,\r\n \"sku\" : \"abcdef\",\r\n \"quantityOrderMaximum\" : 2,\r\n \"quantityOrderMinimum\" : 1,\r\n \"productIsFree\" : false,\r\n \"available\" : true,\r\n \"visible\" : true,\r\n \"productLength\" : 20,\r\n \"productWidth\" : 20,\r\n \"productHeight\" : 20,\r\n \"productWeight\" : 20,\r\n \"rating\" : 0.0,\r\n \"ratingCount\" : 0,\r\n \"sortOrder\" : 0,\r\n \"dateAvailable\" : null,\r\n \"condition\" : null,\r\n \"rentalDuration\" : 0,\r\n \"rentalStatus\" : null,\r\n \"descriptions\" : [ {\r\n \"language\" : \"en\",\r\n \"name\" : \"Buddha Head\",\r\n \"description\" : \"Buddha Head\",\r\n \"keyWords\" : null,\r\n \"highlights\" : \"Short description\",\r\n \"title\" : \"Buddha Head\"\r\n }],\r\n \"categories\" : null,\r\n \"relatedProducts\" : null,\r\n \"manufacturer\" : null,\r\n \"owner\" : {\r\n \r\n \"id\":1\r\n }\r\n}"
+ },
+ {
+ "id": "b16b7252-b7ab-1796-368f-3844eb162598",
+ "headers": "Accept: application/json\nContent-Type: application/json\n",
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ }
+ ],
+ "url": "localhost:8080/api/v1/products/1/reviews",
+ "folder": "869901fd-ebbd-566c-4458-9ef2d787f781",
+ "queryParams": [],
+ "preRequestScript": null,
+ "pathVariables": {},
+ "pathVariableData": [],
+ "method": "GET",
+ "data": [],
+ "dataMode": "raw",
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "time": 1506452284235,
+ "name": "localhost:8080/api/v1/products/{id}/reviews",
+ "description": "API for getting a product reviews",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "responses": [
+ {
+ "owner": "1350207",
+ "lastUpdatedBy": "1350207",
+ "lastRevision": 2147483647,
+ "request": {
+ "url": "localhost:8080/api/v1/private/products",
+ "pathVariables": {},
+ "pathVariableData": [],
+ "queryParams": [],
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ }
+ ],
+ "headers": "Accept: application/json\nContent-Type: application/json\n",
+ "data": "{\r\n \"price\" : 25.99,\r\n \"quantity\" : 5,\r\n \"sku\" : \"abcdef\",\r\n \"quantityOrderMaximum\" : 2,\r\n \"quantityOrderMinimum\" : 1,\r\n \"productIsFree\" : false,\r\n \"available\" : true,\r\n \"visible\" : true,\r\n \"productLength\" : 20,\r\n \"productWidth\" : 20,\r\n \"productHeight\" : 20,\r\n \"productWeight\" : 20,\r\n \"rating\" : 0.0,\r\n \"ratingCount\" : 0,\r\n \"sortOrder\" : 0,\r\n \"dateAvailable\" : null,\r\n \"condition\" : null,\r\n \"rentalDuration\" : 0,\r\n \"rentalStatus\" : null,\r\n \"descriptions\" : [ {\r\n \"language\" : \"en\",\r\n \"name\" : \"Buddha Head\",\r\n \"description\" : \"Buddha Head\",\r\n \"keyWords\" : null,\r\n \"highlights\" : \"Short description\",\r\n \"title\" : \"Buddha Head\"\r\n }],\r\n \"categories\" : null,\r\n \"relatedProducts\" : null,\r\n \"manufacturer\" : null,\r\n \"owner\" : {\r\n \r\n \"id\":1\r\n }\r\n}",
+ "method": "POST",
+ "dataMode": "raw"
+ },
+ "id": "b3fcf95e-c134-a471-1b9c-bc0cd466500d",
+ "name": "localhost:8080/api/v1/private/products",
+ "status": "",
+ "responseCode": {
+ "code": 200,
+ "name": "OK"
+ },
+ "time": "0",
+ "headers": [],
+ "cookies": [],
+ "mime": "",
+ "text": "",
+ "language": "",
+ "rawDataType": "",
+ "state": null,
+ "previewType": "parsed",
+ "searchResultScrolledTo": "-1",
+ "version": null,
+ "requestObject": "{\"url\":\"localhost:8080/api/v1/private/products\",\"pathVariables\":{},\"pathVariableData\":[],\"queryParams\":[],\"headerData\":[{\"key\":\"Accept\",\"value\":\"application/json\",\"enabled\":true,\"description\":\"\"},{\"key\":\"Content-Type\",\"value\":\"application/json\",\"enabled\":true,\"description\":\"\"}],\"headers\":\"Accept: application/json\\nContent-Type: application/json\\n\",\"data\":\"{\\r\\n \\\"price\\\" : 25.99,\\r\\n \\\"quantity\\\" : 5,\\r\\n \\\"sku\\\" : \\\"abcdef\\\",\\r\\n \\\"quantityOrderMaximum\\\" : 2,\\r\\n \\\"quantityOrderMinimum\\\" : 1,\\r\\n \\\"productIsFree\\\" : false,\\r\\n \\\"available\\\" : true,\\r\\n \\\"visible\\\" : true,\\r\\n \\\"productLength\\\" : 20,\\r\\n \\\"productWidth\\\" : 20,\\r\\n \\\"productHeight\\\" : 20,\\r\\n \\\"productWeight\\\" : 20,\\r\\n \\\"rating\\\" : 0.0,\\r\\n \\\"ratingCount\\\" : 0,\\r\\n \\\"sortOrder\\\" : 0,\\r\\n \\\"dateAvailable\\\" : null,\\r\\n \\\"condition\\\" : null,\\r\\n \\\"rentalDuration\\\" : 0,\\r\\n \\\"rentalStatus\\\" : null,\\r\\n \\\"descriptions\\\" : [ {\\r\\n \\\"language\\\" : \\\"en\\\",\\r\\n \\\"name\\\" : \\\"Buddha Head\\\",\\r\\n \\\"description\\\" : \\\"Buddha Head\\\",\\r\\n \\\"keyWords\\\" : null,\\r\\n \\\"highlights\\\" : \\\"Short description\\\",\\r\\n \\\"title\\\" : \\\"Buddha Head\\\"\\r\\n }],\\r\\n \\\"categories\\\" : null,\\r\\n \\\"relatedProducts\\\" : null,\\r\\n \\\"manufacturer\\\" : null,\\r\\n \\\"owner\\\" : {\\r\\n \\r\\n \\\"id\\\":1\\r\\n }\\r\\n}\",\"method\":\"POST\",\"dataMode\":\"raw\"}",
+ "createdAt": "2017-09-06T16:45:59.000Z",
+ "updatedAt": "2017-09-06T16:45:59.000Z",
+ "write": true
+ }
+ ],
+ "rawModeData": "{\r\n \"rating\":3.5,\r\n \"description\" : \"Seems to be a good item compared to similar ones i wanted to test but the price was unfotunately above my budget. Thanks to the team !\",\r\n \"productId\" : 1,\r\n \"customerId\" : 1\r\n}"
+ },
+ {
+ "id": "bb820890-0743-d59b-64b8-66ca92e66213",
+ "headers": "Accept: application/json\nContent-Type: application/json\n",
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ }
+ ],
+ "url": "localhost:8080/api/v1/customers/2/cart",
+ "folder": "675d7679-0ecd-929b-1c44-c0db279226e0",
+ "queryParams": [],
+ "preRequestScript": null,
+ "pathVariables": {},
+ "pathVariableData": [],
+ "method": "GET",
+ "data": [],
+ "dataMode": "raw",
+ "version": 2,
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "time": 1506436021782,
+ "name": "localhost:8080/api/v1/customers/{customerId}/cart",
+ "description": "Get a customer shopping cart",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "responses": [],
+ "rawModeData": "{\r\n \"product\" : 2,\r\n \"quantity\": 1\r\n\r\n}"
+ },
+ {
+ "id": "c381e2b3-10cc-87e5-2ca0-44f861d502c1",
+ "headers": "Accept: application/json\nContent-Type: application/json\nAuthorization: Basic YWRtaW46cGFzc3dvcmQ=\n",
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ },
+ {
+ "key": "Authorization",
+ "value": "Basic YWRtaW46cGFzc3dvcmQ=",
+ "enabled": true,
+ "description": ""
+ }
+ ],
+ "url": "localhost:8080/api/v1/private/category",
+ "folder": "d2d710ef-35d4-67b9-259e-5f79e3cd31f6",
+ "queryParams": [],
+ "preRequestScript": null,
+ "pathVariables": {},
+ "pathVariableData": [],
+ "method": "POST",
+ "data": [],
+ "dataMode": "raw",
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "time": 1506094427212,
+ "name": "localhost:8080/api/v1/private/category",
+ "description": "",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "responses": [
+ {
+ "owner": "1350207",
+ "lastUpdatedBy": "1350207",
+ "lastRevision": 2260503866,
+ "request": {
+ "url": "localhost:8080/api/v1/private/category",
+ "pathVariables": {},
+ "pathVariableData": [],
+ "queryParams": [],
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Authorization",
+ "value": "Basic YWRtaW46cGFzc3dvcmQ=",
+ "description": "",
+ "enabled": true
+ }
+ ],
+ "headers": "Accept: application/json\nContent-Type: application/json\nAuthorization: Basic YWRtaW46cGFzc3dvcmQ=\n",
+ "data": "{\r\n \"id\" : 0,\r\n \"code\" : \"dining-room\",\r\n \"sortOrder\" : 0,\r\n \"visible\" : true,\r\n \"lineage\" : null,\r\n \"depth\" : 0,\r\n \"parent\" : null,\r\n \"descriptions\" : [ {\r\n \"id\" : 0,\r\n \"language\" : \"en\",\r\n \"name\" : \"Dining room\",\r\n \"description\" : null,\r\n \"friendlyUrl\" : \"dining-room\",\r\n \"keyWords\" : null,\r\n \"highlights\" : null,\r\n \"metaDescription\" : null,\r\n \"title\" : \"Dining room\"\r\n } ],\r\n \"children\" : [ \r\n {\r\n \"id\" : 0,\r\n \"code\" : \"tables\",\r\n \"sortOrder\" : 1,\r\n \"visible\" : true,\r\n \"lineage\" : null,\r\n \"depth\" : 0,\r\n \"parent\" : {\r\n \"id\" : 0,\r\n \"code\" : \"dining-room\"\r\n },\r\n \"descriptions\" : [ {\r\n \"id\" : 0,\r\n \"language\" : \"en\",\r\n \"name\" : \"Tables\",\r\n \"description\" : null,\r\n \"friendlyUrl\" : \"tables\",\r\n \"keyWords\" : null,\r\n \"highlights\" : null,\r\n \"metaDescription\" : null,\r\n \"title\" : \"Nice tables !\"\r\n }],\r\n \"children\" : [ ]\r\n }, \r\n {\r\n \"id\" : 0,\r\n \"code\" : \"bench\",\r\n \"sortOrder\" : 4,\r\n \"visible\" : true,\r\n \"lineage\" : null,\r\n \"depth\" : 0,\r\n \"parent\" : {\r\n \"id\" : 0,\r\n \"code\" : \"dining-room\"\r\n },\r\n \"descriptions\" : [ {\r\n \"id\" : 0,\r\n \"language\" : \"en\",\r\n \"name\" : \"Benches\",\r\n \"description\" : null,\r\n \"friendlyUrl\" : \"benches\",\r\n \"keyWords\" : null,\r\n \"highlights\" : null,\r\n \"metaDescription\" : null,\r\n \"title\" : \"Benches\"\r\n }],\r\n \"children\" : [ ]\r\n }\r\n ]\r\n}",
+ "method": "POST",
+ "dataMode": "raw"
+ },
+ "id": "f848df53-38dd-51b9-7b41-20541a508568",
+ "name": "localhost:8080/api/v1/private/category",
+ "status": "",
+ "responseCode": {
+ "code": 201,
+ "name": "Created"
+ },
+ "time": "254",
+ "headers": [
+ {
+ "name": "cache-control",
+ "key": "cache-control",
+ "value": "no-cache, no-store, max-age=0, must-revalidate",
+ "description": ""
+ },
+ {
+ "name": "content-type",
+ "key": "content-type",
+ "value": "application/json;charset=UTF-8",
+ "description": ""
+ },
+ {
+ "name": "date",
+ "key": "date",
+ "value": "Fri, 22 Sep 2017 15:33:32 GMT",
+ "description": ""
+ },
+ {
+ "name": "expires",
+ "key": "expires",
+ "value": "0",
+ "description": ""
+ },
+ {
+ "name": "pragma",
+ "key": "pragma",
+ "value": "no-cache",
+ "description": ""
+ },
+ {
+ "name": "server",
+ "key": "server",
+ "value": "Apache-Coyote/1.1",
+ "description": ""
+ },
+ {
+ "name": "transfer-encoding",
+ "key": "transfer-encoding",
+ "value": "chunked",
+ "description": ""
+ },
+ {
+ "name": "x-content-type-options",
+ "key": "x-content-type-options",
+ "value": "nosniff",
+ "description": ""
+ },
+ {
+ "name": "x-frame-options",
+ "key": "x-frame-options",
+ "value": "DENY",
+ "description": ""
+ },
+ {
+ "name": "x-xss-protection",
+ "key": "x-xss-protection",
+ "value": "1; mode=block",
+ "description": ""
+ }
+ ],
+ "cookies": [],
+ "mime": "",
+ "text": "{\"id\":1,\"code\":\"dining-room\",\"sortOrder\":0,\"visible\":true,\"featured\":false,\"lineage\":null,\"depth\":0,\"parent\":null,\"descriptions\":[{\"id\":0,\"language\":\"en\",\"name\":\"Dining room\",\"description\":null,\"friendlyUrl\":\"dining-room\",\"keyWords\":null,\"highlights\":null,\"metaDescription\":null,\"title\":\"Dining room\"}],\"children\":[{\"id\":0,\"code\":\"tables\",\"sortOrder\":1,\"visible\":true,\"featured\":false,\"lineage\":null,\"depth\":0,\"parent\":{\"id\":0,\"code\":\"dining-room\"},\"descriptions\":[{\"id\":0,\"language\":\"en\",\"name\":\"Tables\",\"description\":null,\"friendlyUrl\":\"tables\",\"keyWords\":null,\"highlights\":null,\"metaDescription\":null,\"title\":\"Nice tables !\"}],\"children\":[]},{\"id\":0,\"code\":\"bench\",\"sortOrder\":4,\"visible\":true,\"featured\":false,\"lineage\":null,\"depth\":0,\"parent\":{\"id\":0,\"code\":\"dining-room\"},\"descriptions\":[{\"id\":0,\"language\":\"en\",\"name\":\"Benches\",\"description\":null,\"friendlyUrl\":\"benches\",\"keyWords\":null,\"highlights\":null,\"metaDescription\":null,\"title\":\"Benches\"}],\"children\":[]}]}",
+ "language": "json",
+ "rawDataType": "text",
+ "state": null,
+ "previewType": "text",
+ "searchResultScrolledTo": "-1",
+ "version": null,
+ "requestObject": "{\"url\":\"localhost:8080/api/v1/private/category\",\"pathVariables\":{},\"pathVariableData\":[],\"queryParams\":[],\"headerData\":[{\"key\":\"Accept\",\"value\":\"application/json\",\"description\":\"\",\"enabled\":true},{\"key\":\"Content-Type\",\"value\":\"application/json\",\"description\":\"\",\"enabled\":true},{\"key\":\"Authorization\",\"value\":\"Basic YWRtaW46cGFzc3dvcmQ=\",\"description\":\"\",\"enabled\":true}],\"headers\":\"Accept: application/json\\nContent-Type: application/json\\nAuthorization: Basic YWRtaW46cGFzc3dvcmQ=\\n\",\"data\":\"{\\r\\n \\\"id\\\" : 0,\\r\\n \\\"code\\\" : \\\"dining-room\\\",\\r\\n \\\"sortOrder\\\" : 0,\\r\\n \\\"visible\\\" : true,\\r\\n \\\"lineage\\\" : null,\\r\\n \\\"depth\\\" : 0,\\r\\n \\\"parent\\\" : null,\\r\\n \\\"descriptions\\\" : [ {\\r\\n \\\"id\\\" : 0,\\r\\n \\\"language\\\" : \\\"en\\\",\\r\\n \\\"name\\\" : \\\"Dining room\\\",\\r\\n \\\"description\\\" : null,\\r\\n \\\"friendlyUrl\\\" : \\\"dining-room\\\",\\r\\n \\\"keyWords\\\" : null,\\r\\n \\\"highlights\\\" : null,\\r\\n \\\"metaDescription\\\" : null,\\r\\n \\\"title\\\" : \\\"Dining room\\\"\\r\\n } ],\\r\\n \\\"children\\\" : [ \\r\\n {\\r\\n \\\"id\\\" : 0,\\r\\n \\\"code\\\" : \\\"tables\\\",\\r\\n \\\"sortOrder\\\" : 1,\\r\\n \\\"visible\\\" : true,\\r\\n \\\"lineage\\\" : null,\\r\\n \\\"depth\\\" : 0,\\r\\n \\\"parent\\\" : {\\r\\n \\\"id\\\" : 0,\\r\\n \\\"code\\\" : \\\"dining-room\\\"\\r\\n },\\r\\n \\\"descriptions\\\" : [ {\\r\\n \\\"id\\\" : 0,\\r\\n \\\"language\\\" : \\\"en\\\",\\r\\n \\\"name\\\" : \\\"Tables\\\",\\r\\n \\\"description\\\" : null,\\r\\n \\\"friendlyUrl\\\" : \\\"tables\\\",\\r\\n \\\"keyWords\\\" : null,\\r\\n \\\"highlights\\\" : null,\\r\\n \\\"metaDescription\\\" : null,\\r\\n \\\"title\\\" : \\\"Nice tables !\\\"\\r\\n }],\\r\\n \\\"children\\\" : [ ]\\r\\n }, \\r\\n {\\r\\n \\\"id\\\" : 0,\\r\\n \\\"code\\\" : \\\"bench\\\",\\r\\n \\\"sortOrder\\\" : 4,\\r\\n \\\"visible\\\" : true,\\r\\n \\\"lineage\\\" : null,\\r\\n \\\"depth\\\" : 0,\\r\\n \\\"parent\\\" : {\\r\\n \\\"id\\\" : 0,\\r\\n \\\"code\\\" : \\\"dining-room\\\"\\r\\n },\\r\\n \\\"descriptions\\\" : [ {\\r\\n \\\"id\\\" : 0,\\r\\n \\\"language\\\" : \\\"en\\\",\\r\\n \\\"name\\\" : \\\"Benches\\\",\\r\\n \\\"description\\\" : null,\\r\\n \\\"friendlyUrl\\\" : \\\"benches\\\",\\r\\n \\\"keyWords\\\" : null,\\r\\n \\\"highlights\\\" : null,\\r\\n \\\"metaDescription\\\" : null,\\r\\n \\\"title\\\" : \\\"Benches\\\"\\r\\n }],\\r\\n \\\"children\\\" : [ ]\\r\\n }\\r\\n ]\\r\\n}\",\"method\":\"POST\",\"dataMode\":\"raw\"}",
+ "createdAt": "2017-09-22T15:33:22.000Z",
+ "updatedAt": "2017-09-22T15:33:22.000Z",
+ "write": true
+ }
+ ],
+ "descriptionFormat": null,
+ "rawModeData": "{\r\n \"code\" : \"dining-room\",\r\n \"sortOrder\" : 0,\r\n \"visible\" : true,\r\n \"lineage\" : null,\r\n \"depth\" : 0,\r\n \"parent\" : null,\r\n \"descriptions\" : [ {\r\n \"id\" : 0,\r\n \"language\" : \"en\",\r\n \"name\" : \"Dining room\",\r\n \"description\" : null,\r\n \"friendlyUrl\" : \"dining-room\",\r\n \"keyWords\" : null,\r\n \"highlights\" : null,\r\n \"metaDescription\" : null,\r\n \"title\" : \"Dining room\"\r\n } ],\r\n \"children\" : [ \r\n {\r\n \"id\" : 0,\r\n \"code\" : \"tables\",\r\n \"sortOrder\" : 1,\r\n \"visible\" : true,\r\n \"lineage\" : null,\r\n \"depth\" : 0,\r\n \"parent\" : {\r\n \"id\" : 0,\r\n \"code\" : \"dining-room\"\r\n },\r\n \"descriptions\" : [ {\r\n \"id\" : 0,\r\n \"language\" : \"en\",\r\n \"name\" : \"Tables\",\r\n \"description\" : null,\r\n \"friendlyUrl\" : \"tables\",\r\n \"keyWords\" : null,\r\n \"highlights\" : null,\r\n \"metaDescription\" : null,\r\n \"title\" : \"Nice tables !\"\r\n }],\r\n \"children\" : [ ]\r\n }, \r\n {\r\n \"id\" : 0,\r\n \"code\" : \"bench\",\r\n \"sortOrder\" : 4,\r\n \"visible\" : true,\r\n \"lineage\" : null,\r\n \"depth\" : 0,\r\n \"parent\" : {\r\n \"id\" : 0,\r\n \"code\" : \"dining-room\"\r\n },\r\n \"descriptions\" : [ {\r\n \"id\" : 0,\r\n \"language\" : \"en\",\r\n \"name\" : \"Benches\",\r\n \"description\" : null,\r\n \"friendlyUrl\" : \"benches\",\r\n \"keyWords\" : null,\r\n \"highlights\" : null,\r\n \"metaDescription\" : null,\r\n \"title\" : \"Benches\"\r\n }],\r\n \"children\" : [ ]\r\n }\r\n ]\r\n}"
+ },
+ {
+ "id": "cccf1aa5-0621-f972-560f-f1aca9e1a04d",
+ "headers": "Accept: application/json\nContent-Type: application/json\n",
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ }
+ ],
+ "url": "localhost:8080/api/v1/search",
+ "folder": "869901fd-ebbd-566c-4458-9ef2d787f781",
+ "queryParams": [],
+ "preRequestScript": null,
+ "pathVariables": {},
+ "pathVariableData": [],
+ "method": "POST",
+ "data": [],
+ "dataMode": "raw",
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "time": 1504621228065,
+ "name": "localhost:8080/api/v1/search",
+ "description": "API for the creation of a product\n\n{\n \"query\":\"test\"\n}\n\nor when paging is required\n\n{\n \"query\":\"test\",\n \"start\":0,\n \"count\":10 \n}\n\nNeed to have Elastic search server running",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "responses": [
+ {
+ "owner": "1350207",
+ "lastUpdatedBy": "1350207",
+ "lastRevision": 2147483647,
+ "request": {
+ "url": "localhost:8080/api/v1/private/products",
+ "pathVariables": {},
+ "pathVariableData": [],
+ "queryParams": [],
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ }
+ ],
+ "headers": "Accept: application/json\nContent-Type: application/json\n",
+ "data": "{\r\n \"price\" : 25.99,\r\n \"quantity\" : 5,\r\n \"sku\" : \"abcdef\",\r\n \"quantityOrderMaximum\" : 2,\r\n \"quantityOrderMinimum\" : 1,\r\n \"productIsFree\" : false,\r\n \"available\" : true,\r\n \"visible\" : true,\r\n \"productLength\" : 20,\r\n \"productWidth\" : 20,\r\n \"productHeight\" : 20,\r\n \"productWeight\" : 20,\r\n \"rating\" : 0.0,\r\n \"ratingCount\" : 0,\r\n \"sortOrder\" : 0,\r\n \"dateAvailable\" : null,\r\n \"condition\" : null,\r\n \"rentalDuration\" : 0,\r\n \"rentalStatus\" : null,\r\n \"descriptions\" : [ {\r\n \"language\" : \"en\",\r\n \"name\" : \"Buddha Head\",\r\n \"description\" : \"Buddha Head\",\r\n \"keyWords\" : null,\r\n \"highlights\" : \"Short description\",\r\n \"title\" : \"Buddha Head\"\r\n }],\r\n \"categories\" : null,\r\n \"relatedProducts\" : null,\r\n \"manufacturer\" : null,\r\n \"owner\" : {\r\n \r\n \"id\":1\r\n }\r\n}",
+ "method": "POST",
+ "dataMode": "raw"
+ },
+ "id": "70b0fb45-6a80-c2f2-156c-470198377621",
+ "name": "localhost:8080/api/v1/private/products",
+ "status": "",
+ "responseCode": {
+ "code": 200,
+ "name": "OK"
+ },
+ "time": "0",
+ "headers": [],
+ "cookies": [],
+ "mime": "",
+ "text": "",
+ "language": "",
+ "rawDataType": "",
+ "state": null,
+ "previewType": "parsed",
+ "searchResultScrolledTo": "-1",
+ "version": null,
+ "requestObject": "{\"url\":\"localhost:8080/api/v1/private/products\",\"pathVariables\":{},\"pathVariableData\":[],\"queryParams\":[],\"headerData\":[{\"key\":\"Accept\",\"value\":\"application/json\",\"enabled\":true,\"description\":\"\"},{\"key\":\"Content-Type\",\"value\":\"application/json\",\"enabled\":true,\"description\":\"\"}],\"headers\":\"Accept: application/json\\nContent-Type: application/json\\n\",\"data\":\"{\\r\\n \\\"price\\\" : 25.99,\\r\\n \\\"quantity\\\" : 5,\\r\\n \\\"sku\\\" : \\\"abcdef\\\",\\r\\n \\\"quantityOrderMaximum\\\" : 2,\\r\\n \\\"quantityOrderMinimum\\\" : 1,\\r\\n \\\"productIsFree\\\" : false,\\r\\n \\\"available\\\" : true,\\r\\n \\\"visible\\\" : true,\\r\\n \\\"productLength\\\" : 20,\\r\\n \\\"productWidth\\\" : 20,\\r\\n \\\"productHeight\\\" : 20,\\r\\n \\\"productWeight\\\" : 20,\\r\\n \\\"rating\\\" : 0.0,\\r\\n \\\"ratingCount\\\" : 0,\\r\\n \\\"sortOrder\\\" : 0,\\r\\n \\\"dateAvailable\\\" : null,\\r\\n \\\"condition\\\" : null,\\r\\n \\\"rentalDuration\\\" : 0,\\r\\n \\\"rentalStatus\\\" : null,\\r\\n \\\"descriptions\\\" : [ {\\r\\n \\\"language\\\" : \\\"en\\\",\\r\\n \\\"name\\\" : \\\"Buddha Head\\\",\\r\\n \\\"description\\\" : \\\"Buddha Head\\\",\\r\\n \\\"keyWords\\\" : null,\\r\\n \\\"highlights\\\" : \\\"Short description\\\",\\r\\n \\\"title\\\" : \\\"Buddha Head\\\"\\r\\n }],\\r\\n \\\"categories\\\" : null,\\r\\n \\\"relatedProducts\\\" : null,\\r\\n \\\"manufacturer\\\" : null,\\r\\n \\\"owner\\\" : {\\r\\n \\r\\n \\\"id\\\":1\\r\\n }\\r\\n}\",\"method\":\"POST\",\"dataMode\":\"raw\"}",
+ "createdAt": "2017-09-05T14:14:40.000Z",
+ "updatedAt": "2017-09-05T14:14:40.000Z",
+ "write": true
+ }
+ ],
+ "descriptionFormat": null,
+ "rawModeData": "{\r\n \"query\":\"tag\",\r\n \"start\":0,\r\n \"count\":10\r\n}"
+ },
+ {
+ "id": "d5903412-6d11-7403-0ca2-9a1e9ebd9525",
+ "headers": "Accept: application/json\nContent-Type: application/json\nAuthorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJqb2huQGNzdGljb25zdWx0aW5nLmNvbSIsImF1ZCI6InVua25vd24iLCJleHAiOjE1MDc2NTMwMzQsImlhdCI6MTUwNzA0ODIzNH0.b-N0Amr_CPVMCdI4Svc7oZnKMQrICx1f9LoaD4i5-FCDypHlBUj7_l84ehSyW7q6HrJ7pCMSX370U1M4yD4zIw\n",
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Authorization",
+ "value": "Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJqb2huQGNzdGljb25zdWx0aW5nLmNvbSIsImF1ZCI6InVua25vd24iLCJleHAiOjE1MDc2NTMwMzQsImlhdCI6MTUwNzA0ODIzNH0.b-N0Amr_CPVMCdI4Svc7oZnKMQrICx1f9LoaD4i5-FCDypHlBUj7_l84ehSyW7q6HrJ7pCMSX370U1M4yD4zIw",
+ "description": "",
+ "enabled": true
+ }
+ ],
+ "url": "localhost:8080/api/v1/auth/products",
+ "folder": "7b91c544-0b63-7781-6fbb-cb08d1d1a4b7",
+ "queryParams": [],
+ "preRequestScript": null,
+ "pathVariables": {},
+ "pathVariableData": [],
+ "method": "POST",
+ "data": [],
+ "dataMode": "raw",
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "time": 1507048545797,
+ "name": "localhost:8080/api/v1/auth/products - third item",
+ "description": "API for the creation of a product using customer authentication API. Requires a valid customer created",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "responses": [
+ {
+ "owner": "1350207",
+ "lastUpdatedBy": "1350207",
+ "lastRevision": 2312911615,
+ "request": {},
+ "id": "950173a8-e094-07b9-67b4-b5dc35c68158",
+ "name": "localhost:8080/api/v1/private/products",
+ "status": "",
+ "responseCode": {
+ "code": 200,
+ "name": "OK"
+ },
+ "time": "0",
+ "headers": [],
+ "cookies": [],
+ "mime": "",
+ "text": "",
+ "language": "",
+ "rawDataType": "",
+ "state": null,
+ "previewType": "parsed",
+ "searchResultScrolledTo": "-1",
+ "version": null,
+ "requestObject": "5395f9cf-3797-e226-092c-80ae5dd24353",
+ "createdAt": "2017-10-02T17:45:21.000Z",
+ "updatedAt": "2017-10-02T17:45:21.000Z",
+ "write": true
+ }
+ ],
+ "rawModeData": "{\r\n \"price\" : 49.99,\r\n \"quantity\" : 1,\r\n \"sku\" : \"001unique\",\r\n \"quantityOrderMaximum\" : 1,\r\n \"quantityOrderMinimum\" : 1,\r\n \"productIsFree\" : false,\r\n \"available\" : true,\r\n \"visible\" : true,\r\n \"productLength\" : 0,\r\n \"productWidth\" : 0,\r\n \"productHeight\" : 0,\r\n \"productWeight\" : 0,\r\n \"rating\" : 0.0,\r\n \"ratingCount\" : 0,\r\n \"sortOrder\" : 0,\r\n \"dateAvailable\" : \"2017-11-01\",\r\n \"condition\" : \"NEW\",\r\n \"rentalDuration\" : 10,\r\n \"rentalPeriod\" : 3,\r\n \"rentalStatus\" : \"AVAILABLE\",\r\n \"descriptions\" : [ {\r\n \"language\" : \"en\",\r\n \"name\" : \"Jeep Cherokeel\",\r\n \"description\" : \"Jeep Cherokee 2013, perfect condition, non smoker\",\r\n \"keyWords\" : null,\r\n \"highlights\" : \"Jeep Cherokee 2013\"\r\n }],\r\n \"categories\" : null,\r\n \"relatedProducts\" : null,\r\n \"manufacturer\" : null,\r\n \"owner\" : {\r\n \"id\":1\r\n }\r\n}"
+ },
+ {
+ "id": "d87f1f4e-8fe5-d079-f749-e6871539b56c",
+ "headers": "Authorization: Basic YWRtaW46cGFzc3dvcmQ=\nAccept: \nContent-Type: application/json\n",
+ "headerData": [
+ {
+ "key": "Authorization",
+ "value": "Basic YWRtaW46cGFzc3dvcmQ=",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Accept",
+ "value": "",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ }
+ ],
+ "url": "localhost:8080/api/v1/private/customers/2/reviews",
+ "folder": "7b72249f-ad93-f830-befb-cc432829f5b3",
+ "queryParams": [],
+ "preRequestScript": null,
+ "pathVariables": {},
+ "pathVariableData": [],
+ "method": "POST",
+ "data": [],
+ "dataMode": "raw",
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "time": 1506436278189,
+ "name": "localhost:8080/api/v1/private/customers/{id}/reviews",
+ "description": "Create a customer review\n\nThis requires having 2 customers customer 1 reviews customer 2\n\n/api/v1/private/customers/{reviewed customer id}/reviews",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "rawModeData": "{\r\n \"rating\":4.5,\r\n \"description\" : \"Always on time, always premium quality !\",\r\n \"customerId\" : 1\r\n}"
+ },
+ {
+ "folder": "672123c5-93ab-8101-3da3-709c43a30fc9",
+ "id": "daab2dd9-266f-9d60-81fd-a4985ef98544",
+ "name": "localhost:8080/api/v1/category",
+ "dataMode": "raw",
+ "data": [],
+ "descriptionFormat": null,
+ "description": "Ge all category. This returns the complete hierarchy",
+ "headers": "",
+ "method": "GET",
+ "pathVariables": {},
+ "url": "localhost:8080/api/v1/products/251",
+ "preRequestScript": null,
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "queryParams": [],
+ "headerData": [],
+ "pathVariableData": [],
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "rawModeData": "{\r\n \"price\" : 25.99,\r\n \"quantity\" : 5,\r\n \"sku\" : \"abcdef\",\r\n \"quantityOrderMaximum\" : 2,\r\n \"quantityOrderMinimum\" : 1,\r\n \"productIsFree\" : false,\r\n \"available\" : true,\r\n \"visible\" : true,\r\n \"productLength\" : 20,\r\n \"productWidth\" : 20,\r\n \"productHeight\" : 20,\r\n \"productWeight\" : 20,\r\n \"rating\" : 0.0,\r\n \"ratingCount\" : 0,\r\n \"sortOrder\" : 0,\r\n \"dateAvailable\" : null,\r\n \"condition\" : null,\r\n \"rentalDuration\" : 0,\r\n \"rentalStatus\" : null,\r\n \"descriptions\" : [ {\r\n \"language\" : \"en\",\r\n \"name\" : \"Buddha Head\",\r\n \"description\" : \"Buddha Head\",\r\n \"keyWords\" : null,\r\n \"highlights\" : \"Short description\",\r\n \"title\" : \"Buddha Head\"\r\n }],\r\n \"categories\" : null,\r\n \"relatedProducts\" : null,\r\n \"manufacturer\" : null,\r\n \"owner\" : {\r\n \r\n \"id\":1\r\n }\r\n}"
+ },
+ {
+ "folder": "7b91c544-0b63-7781-6fbb-cb08d1d1a4b7",
+ "id": "e6e29485-e2c6-71df-7b6e-a0fcccbdc83a",
+ "name": "localhost:8080/api/v1/private/products/{id}/reviews",
+ "dataMode": "raw",
+ "data": [],
+ "descriptionFormat": "html",
+ "description": "API for the creation of a review associated with a product",
+ "headers": "Accept: application/json\nContent-Type: application/json\nAuthorization: Basic YWRtaW46cGFzc3dvcmQ=\n",
+ "method": "POST",
+ "pathVariables": {},
+ "url": "localhost:8080/api/v1/private/products/1/reviews",
+ "preRequestScript": null,
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "queryParams": [],
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Authorization",
+ "value": "Basic YWRtaW46cGFzc3dvcmQ=",
+ "description": "",
+ "enabled": true
+ }
+ ],
+ "pathVariableData": [],
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "rawModeData": "{\r\n \"rating\":3.5,\r\n \"description\" : \"Seems to be a good item compared to similar ones i wanted to test but the price was unfotunately above my budget. Thanks to the team !\",\r\n \"productId\" : 1,\r\n \"customerId\" : 1\r\n}"
+ },
+ {
+ "id": "ea899dba-4d4e-368c-8b81-fda7a66454f5",
+ "headers": "Content-Type: application/json\n",
+ "headerData": [
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ }
+ ],
+ "url": "localhost:8080/api/v1/auth/register",
+ "folder": "7a1df60f-761b-9df6-f95b-e7062f2486ed",
+ "queryParams": [],
+ "preRequestScript": null,
+ "pathVariables": {},
+ "pathVariableData": [],
+ "method": "POST",
+ "data": [],
+ "dataMode": "raw",
+ "version": 2,
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "time": 1507048995661,
+ "name": "localhost:8080/api/v1/auth/register.",
+ "description": "Register a new Customer to the system. This is a self serve service done by a Customer wanting to register to the system.\n\nTjis action ends up by the creation of a Customer with only reqyired fields.",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "responses": [],
+ "rawModeData": "{\n\"emailAddress\":\"john@csticonsulting.com\",\n\"gender\":\"M\",\n\"language\":\"en\",\n\"userName\":\"john@csticonsulting.com\",\n\"clearPassword\":\"password\",\n\"billing\":{\n \"address\":\"123 E Street\",\n \"city\":\"Toronto\",\n \"postalCode\":\"J4B 8J9\",\n \"country\":\"CA\",\n \"zone\":\"ON\",\n \"firstName\":\"John\",\n \"lastName\":\"Lastname\"\n }\n}"
+ },
+ {
+ "id": "f4ac8665-acad-f3a5-a33b-c65de705f5dc",
+ "headers": "",
+ "headerData": [],
+ "url": "localhost:8080/api/v1/category/150",
+ "folder": "672123c5-93ab-8101-3da3-709c43a30fc9",
+ "queryParams": [],
+ "preRequestScript": null,
+ "pathVariables": {},
+ "pathVariableData": [],
+ "method": "GET",
+ "data": [],
+ "dataMode": "raw",
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "name": "localhost:8080/api/v1/category/{id}",
+ "description": "Ge a category by id",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "descriptionFormat": null,
+ "rawModeData": "{\r\n \"price\" : 25.99,\r\n \"quantity\" : 5,\r\n \"sku\" : \"abcdef\",\r\n \"quantityOrderMaximum\" : 2,\r\n \"quantityOrderMinimum\" : 1,\r\n \"productIsFree\" : false,\r\n \"available\" : true,\r\n \"visible\" : true,\r\n \"productLength\" : 20,\r\n \"productWidth\" : 20,\r\n \"productHeight\" : 20,\r\n \"productWeight\" : 20,\r\n \"rating\" : 0.0,\r\n \"ratingCount\" : 0,\r\n \"sortOrder\" : 0,\r\n \"dateAvailable\" : null,\r\n \"condition\" : null,\r\n \"rentalDuration\" : 0,\r\n \"rentalStatus\" : null,\r\n \"descriptions\" : [ {\r\n \"language\" : \"en\",\r\n \"name\" : \"Buddha Head\",\r\n \"description\" : \"Buddha Head\",\r\n \"keyWords\" : null,\r\n \"highlights\" : \"Short description\",\r\n \"title\" : \"Buddha Head\"\r\n }],\r\n \"categories\" : null,\r\n \"relatedProducts\" : null,\r\n \"manufacturer\" : null,\r\n \"owner\" : {\r\n \r\n \"id\":1\r\n }\r\n}"
+ },
+ {
+ "id": "faf566bd-bc4e-8eee-c3dd-5760c74b0233",
+ "headers": "Content-Type: application/json\nAccept: application/json\nAuthorization: Basic YWRtaW46cGFzc3dvcmQ=\n",
+ "headerData": [
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "description": "",
+ "enabled": true
+ },
+ {
+ "key": "Authorization",
+ "value": "Basic YWRtaW46cGFzc3dvcmQ=",
+ "description": "",
+ "enabled": true
+ }
+ ],
+ "url": "localhost:8080/api/v1/private/customers",
+ "queryParams": [],
+ "pathVariables": {},
+ "pathVariableData": [],
+ "preRequestScript": null,
+ "method": "POST",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "data": [],
+ "dataMode": "raw",
+ "name": "localhost:8080/api/v1/private/customers",
+ "description": "",
+ "descriptionFormat": "html",
+ "time": 1506094100897,
+ "version": 2,
+ "responses": [],
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "folder": "7b72249f-ad93-f830-befb-cc432829f5b3",
+ "rawModeData": "{\n\"emailAddress\":\"carl@csticonsulting.com\",\n\"gender\":\"M\",\n\"language\":\"en\",\n\"userName\":\"testuser\",\n\"clearPassword\":\"password\",\n\"billing\":{\n \"address\":\"352 Du Languedoc\",\n \"city\":\"Boucherville\",\n \"postalCode\":\"J4B 8J9\",\n \"country\":\"CA\",\n \"zone\":\"QC\",\n \"firstName\":\"Carl\",\n \"lastName\":\"Samson\"\n }\n}"
+ },
+ {
+ "id": "fbdb3a7a-21f1-148e-6512-d004d3b53fed",
+ "headers": "",
+ "headerData": [],
+ "url": "localhost:8080/api/v1/products",
+ "folder": "869901fd-ebbd-566c-4458-9ef2d787f781",
+ "queryParams": [],
+ "preRequestScript": null,
+ "pathVariables": {},
+ "pathVariableData": [],
+ "method": "GET",
+ "data": [],
+ "dataMode": "raw",
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "time": 1504708554002,
+ "name": "localhost:8080/api/v1/products",
+ "description": "List all products\n\ncriterias can be allplied\n\n?category={id}\n&manufacturer={}\n&status={status}\n&owner={id}\n&start={start index (by default 0)}\n&count={max count}",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "descriptionFormat": null,
+ "rawModeData": "{\r\n \"price\" : 25.99,\r\n \"quantity\" : 5,\r\n \"sku\" : \"abcdef\",\r\n \"quantityOrderMaximum\" : 2,\r\n \"quantityOrderMinimum\" : 1,\r\n \"productIsFree\" : false,\r\n \"available\" : true,\r\n \"visible\" : true,\r\n \"productLength\" : 20,\r\n \"productWidth\" : 20,\r\n \"productHeight\" : 20,\r\n \"productWeight\" : 20,\r\n \"rating\" : 0.0,\r\n \"ratingCount\" : 0,\r\n \"sortOrder\" : 0,\r\n \"dateAvailable\" : null,\r\n \"condition\" : null,\r\n \"rentalDuration\" : 0,\r\n \"rentalStatus\" : null,\r\n \"descriptions\" : [ {\r\n \"language\" : \"en\",\r\n \"name\" : \"Buddha Head\",\r\n \"description\" : \"Buddha Head\",\r\n \"keyWords\" : null,\r\n \"highlights\" : \"Short description\",\r\n \"title\" : \"Buddha Head\"\r\n }],\r\n \"categories\" : null,\r\n \"relatedProducts\" : null,\r\n \"manufacturer\" : null,\r\n \"owner\" : {\r\n \r\n \"id\":1\r\n }\r\n}"
+ },
+ {
+ "id": "fc1e5dca-9ed7-dcdc-e625-f5b38132a736",
+ "headers": "Accept: application/json\nContent-Type: application/json\nAuthorization: Basic YWRtaW46cGFzc3dvcmQ=\n",
+ "headerData": [
+ {
+ "key": "Accept",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ },
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "enabled": true,
+ "description": ""
+ },
+ {
+ "key": "Authorization",
+ "value": "Basic YWRtaW46cGFzc3dvcmQ=",
+ "enabled": true,
+ "description": ""
+ }
+ ],
+ "url": "localhost:8080/api/v1/private/products/2/category/2",
+ "folder": "7b91c544-0b63-7781-6fbb-cb08d1d1a4b7",
+ "queryParams": [],
+ "preRequestScript": null,
+ "pathVariables": {},
+ "pathVariableData": [],
+ "method": "POST",
+ "data": [],
+ "dataMode": "raw",
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": "{}",
+ "time": 1506014367002,
+ "name": "localhost:8080/api/v1/private/products/{productId}/category/{categoryId}",
+ "description": "Add a product to a category\n\nThis url adds product ID 251 to category 100\n\n*** Return object has no category",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "responses": [],
+ "descriptionFormat": null,
+ "rawModeData": "{\r\n \"price\" : 25.99,\r\n \"quantity\" : 5,\r\n \"sku\" : \"abcdef\",\r\n \"quantityOrderMaximum\" : 2,\r\n \"quantityOrderMinimum\" : 1,\r\n \"productIsFree\" : false,\r\n \"available\" : true,\r\n \"visible\" : true,\r\n \"productLength\" : 20,\r\n \"productWidth\" : 20,\r\n \"productHeight\" : 20,\r\n \"productWeight\" : 20,\r\n \"rating\" : 0.0,\r\n \"ratingCount\" : 0,\r\n \"sortOrder\" : 0,\r\n \"dateAvailable\" : null,\r\n \"condition\" : null,\r\n \"rentalDuration\" : 0,\r\n \"rentalStatus\" : null,\r\n \"descriptions\" : [ {\r\n \"language\" : \"en\",\r\n \"name\" : \"Buddha Head\",\r\n \"description\" : \"Buddha Head\",\r\n \"keyWords\" : null,\r\n \"highlights\" : \"Short description\",\r\n \"title\" : \"Buddha Head\"\r\n }],\r\n \"categories\" : null,\r\n \"relatedProducts\" : null,\r\n \"manufacturer\" : null,\r\n \"owner\" : {\r\n \r\n \"id\":1\r\n }\r\n}"
+ },
+ {
+ "id": "fff0eb99-a0d7-4ed5-9266-5e276fb36e95",
+ "headers": "",
+ "headerData": [],
+ "url": "localhost:8080/api/v1/manufacturers/1",
+ "folder": "ea184b94-7c56-9a2a-9061-d3e24c71d880",
+ "queryParams": [],
+ "preRequestScript": null,
+ "pathVariables": {},
+ "pathVariableData": [],
+ "method": "GET",
+ "data": [],
+ "dataMode": "raw",
+ "tests": null,
+ "currentHelper": "normal",
+ "helperAttributes": {},
+ "time": 1505321205846,
+ "name": "localhost:8080/api/v1/manufacturers/{id}",
+ "description": "Ge a manufacturer by id",
+ "collectionId": "2915ed8c-5bd6-3955-ccae-b4937e431de7",
+ "rawModeData": "{\r\n \"price\" : 25.99,\r\n \"quantity\" : 5,\r\n \"sku\" : \"abcdef\",\r\n \"quantityOrderMaximum\" : 2,\r\n \"quantityOrderMinimum\" : 1,\r\n \"productIsFree\" : false,\r\n \"available\" : true,\r\n \"visible\" : true,\r\n \"productLength\" : 20,\r\n \"productWidth\" : 20,\r\n \"productHeight\" : 20,\r\n \"productWeight\" : 20,\r\n \"rating\" : 0.0,\r\n \"ratingCount\" : 0,\r\n \"sortOrder\" : 0,\r\n \"dateAvailable\" : null,\r\n \"condition\" : null,\r\n \"rentalDuration\" : 0,\r\n \"rentalStatus\" : null,\r\n \"descriptions\" : [ {\r\n \"language\" : \"en\",\r\n \"name\" : \"Buddha Head\",\r\n \"description\" : \"Buddha Head\",\r\n \"keyWords\" : null,\r\n \"highlights\" : \"Short description\",\r\n \"title\" : \"Buddha Head\"\r\n }],\r\n \"categories\" : null,\r\n \"relatedProducts\" : null,\r\n \"manufacturer\" : null,\r\n \"owner\" : {\r\n \r\n \"id\":1\r\n }\r\n}"
+ }
+ ]
+}
\ No newline at end of file
README.md 5(+3 -2)
diff --git a/README.md b/README.md
index 66e8a46..9b383fb 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-Shopizer 2.0.5 (for java 1.8)
+Shopizer 2.2.0 (for java 1.8 +)
-------------------
Java open source e-commerce software
@@ -8,6 +8,7 @@ Java open source e-commerce software
- Search
- Checkout
- Administration
+- REST API
To get the code:
@@ -29,7 +30,7 @@ From the command line with Maven installed:
Run the application from Tomcat
-------------------
-copy sm-shop/target/sm-shop.war to tomcat or any other application server deployment dir
+copy sm-shop/target/ROOT.war to tomcat or any other application server deployment dir
Increase heap space to 1024 m or at least 512 m
RELEASE-NOTES.md 12(+6 -6)
diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index 2d4dcdb..b99e17e 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -1,9 +1,9 @@
-Release changes in version 2.0.5
+Release changes in version 2.2.0
-- Spring Data JPA
-- Removal of QueryDSL
-- Upgrade of Infinispan
-- Upgrade to Spring 4.2.1
-- Spring Boot
+- New Template
+- Bug fixing
+- Braintree payments
+- Complete REST API
- UI improvements
+- Apache 2 Licence
sm-core/.classpath 78(+39 -39)
diff --git a/sm-core/.classpath b/sm-core/.classpath
index 7108320..7430f62 100644
--- a/sm-core/.classpath
+++ b/sm-core/.classpath
@@ -1,39 +1,39 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="src" output="target/classes" path="src/main/java">
- <attributes>
- <attribute name="optional" value="true"/>
- <attribute name="maven.pomderived" value="true"/>
- </attributes>
- </classpathentry>
- <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
- <attributes>
- <attribute name="maven.pomderived" value="true"/>
- </attributes>
- </classpathentry>
- <classpathentry kind="src" output="target/test-classes" path="src/test/java">
- <attributes>
- <attribute name="optional" value="true"/>
- <attribute name="maven.pomderived" value="true"/>
- </attributes>
- </classpathentry>
- <classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
- <attributes>
- <attribute name="maven.pomderived" value="true"/>
- </attributes>
- </classpathentry>
- <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
- <attributes>
- <attribute name="maven.pomderived" value="true"/>
- <attribute name="org.eclipse.jst.component.nondependency" value=""/>
- </attributes>
- </classpathentry>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
- <attributes>
- <attribute name="maven.pomderived" value="true"/>
- </attributes>
- </classpathentry>
- <classpathentry kind="src" path="/sm-core-modules"/>
- <classpathentry combineaccessrules="false" kind="src" path="/sm-core-model"/>
- <classpathentry kind="output" path="target/classes"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" output="target/classes" path="src/main/java">
+ <attributes>
+ <attribute name="optional" value="true"/>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
+ <attributes>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="src" output="target/test-classes" path="src/test/java">
+ <attributes>
+ <attribute name="optional" value="true"/>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
+ <attributes>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+ <attributes>
+ <attribute name="maven.pomderived" value="true"/>
+ <attribute name="org.eclipse.jst.component.nondependency" value=""/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
+ <attributes>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="src" path="/sm-core-modules"/>
+ <classpathentry combineaccessrules="false" kind="src" path="/sm-core-model"/>
+ <classpathentry kind="output" path="target/classes"/>
+</classpath>
sm-core/.gitignore 1(+1 -0)
diff --git a/sm-core/.gitignore b/sm-core/.gitignore
index 62ba893..44adf99 100644
--- a/sm-core/.gitignore
+++ b/sm-core/.gitignore
@@ -1,2 +1,3 @@
/SALESMANAGER-TEST.h2.db
/SALESMANAGER-TEST.trace.db
+/target/
sm-core/.project 72(+36 -36)
diff --git a/sm-core/.project b/sm-core/.project
index 28b4f11..3ddb5d7 100644
--- a/sm-core/.project
+++ b/sm-core/.project
@@ -1,36 +1,36 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>sm-core</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.wst.common.project.facet.core.builder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.wst.validation.validationbuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.m2e.core.maven2Builder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
- <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
- <nature>org.eclipse.jdt.core.javanature</nature>
- <nature>org.eclipse.m2e.core.maven2Nature</nature>
- <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
- </natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>sm-core</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.wst.common.project.facet.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.wst.validation.validationbuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.m2e.core.maven2Builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+ <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.m2e.core.maven2Nature</nature>
+ <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+ </natures>
+</projectDescription>
diff --git a/sm-core/.settings/org.eclipse.core.resources.prefs b/sm-core/.settings/org.eclipse.core.resources.prefs
index 04cfa2c..29abf99 100644
--- a/sm-core/.settings/org.eclipse.core.resources.prefs
+++ b/sm-core/.settings/org.eclipse.core.resources.prefs
@@ -1,6 +1,6 @@
-eclipse.preferences.version=1
-encoding//src/main/java=UTF-8
-encoding//src/main/resources=UTF-8
-encoding//src/test/java=UTF-8
-encoding//src/test/resources=UTF-8
-encoding/<project>=UTF-8
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
+encoding//src/main/resources=UTF-8
+encoding//src/test/java=UTF-8
+encoding//src/test/resources=UTF-8
+encoding/<project>=UTF-8
sm-core/.settings/org.eclipse.jdt.core.prefs 26(+13 -13)
diff --git a/sm-core/.settings/org.eclipse.jdt.core.prefs b/sm-core/.settings/org.eclipse.jdt.core.prefs
index 529ef07..13b3428 100644
--- a/sm-core/.settings/org.eclipse.jdt.core.prefs
+++ b/sm-core/.settings/org.eclipse.jdt.core.prefs
@@ -1,13 +1,13 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.source=1.8
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/sm-core/.settings/org.eclipse.m2e.core.prefs b/sm-core/.settings/org.eclipse.m2e.core.prefs
index 14b697b..f897a7f 100644
--- a/sm-core/.settings/org.eclipse.m2e.core.prefs
+++ b/sm-core/.settings/org.eclipse.m2e.core.prefs
@@ -1,4 +1,4 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/sm-core/.settings/org.eclipse.wst.common.project.facet.core.xml b/sm-core/.settings/org.eclipse.wst.common.project.facet.core.xml
index 6302d3e..fb95c45 100644
--- a/sm-core/.settings/org.eclipse.wst.common.project.facet.core.xml
+++ b/sm-core/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<faceted-project>
- <installed facet="java" version="1.8"/>
- <installed facet="jst.utility" version="1.0"/>
-</faceted-project>
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <installed facet="java" version="1.8"/>
+ <installed facet="jst.utility" version="1.0"/>
+</faceted-project>
sm-core/pom.xml 432(+221 -211)
diff --git a/sm-core/pom.xml b/sm-core/pom.xml
index 64cfd49..a487b54 100644
--- a/sm-core/pom.xml
+++ b/sm-core/pom.xml
@@ -1,211 +1,221 @@
-<?xml version="1.0"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>com.shopizer</groupId>
- <artifactId>shopizer</artifactId>
- <version>2.0.5-SNAPSHOT</version>
- </parent>
-
- <artifactId>sm-core</artifactId>
- <packaging>jar</packaging>
-
- <name>sm-core</name>
- <url>http://www.shopizer.com</url>
-
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-
- <!-- testing properties -->
- <!--<dbh2.version>1.4.187</dbh2.version>-->
- <geoip2.version>2.7.0</geoip2.version>
- <javax.inject.version>1</javax.inject.version>
- <javax.el.version>2.2.4</javax.el.version>
- <drools.version>5.6.0.Final</drools.version>
- <jackson-version>2.7.4</jackson-version>
- </properties>
-
- <dependencies>
-
- <!-- sm-core-model -->
- <dependency>
- <groupId>com.shopizer</groupId>
- <artifactId>sm-core-model</artifactId>
- <version>${shopizer.version}</version>
- </dependency>
-
-
- <!-- sm-core-modules -->
- <dependency>
- <groupId>com.shopizer</groupId>
- <artifactId>sm-core-modules</artifactId>
- <version>${shopizer.version}</version>
- </dependency>
-
- <!-- sm-search -->
- <dependency>
- <groupId>com.shopizer</groupId>
- <artifactId>sm-search</artifactId>
- <version>${shopizer.search.version}</version>
- </dependency>
-
- <!-- shipping rules -->
- <!-- shipping distance pre-processor -->
- <dependency>
- <groupId>com.shopizer</groupId>
- <artifactId>shopizer-shipping-distance-processor</artifactId>
- <version>${shopizer-shipping-distance.version}</version>
- </dependency>
-
- <!-- canadapost -->
- <dependency>
- <groupId>com.shopizer</groupId>
- <artifactId>shopizer-shipping-canadapost-module</artifactId>
- <version>${shopizer-canadapost.version}</version>
- </dependency>
-
- <!-- Rules engine -->
- <dependency>
- <groupId>org.drools</groupId>
- <artifactId>drools-spring</artifactId>
- <version>${drools.version}</version>
- </dependency>
-
-
- <!-- Infinispan -->
- <dependency>
- <groupId>org.infinispan</groupId>
- <artifactId>infinispan-core</artifactId>
- <version>${infinispan.version}</version>
- </dependency>
-
- <dependency>
- <groupId>org.infinispan</groupId>
- <artifactId>infinispan-cachestore-jdbc</artifactId>
- <version>${infinispan.version}</version>
- </dependency>
-
- <dependency>
- <groupId>org.infinispan</groupId>
- <artifactId>infinispan-tree</artifactId>
- <version>${infinispan.version}</version>
- </dependency>
-
- <!-- tests dependencies -->
- <!-- http://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- </dependency>
- <!-- H2 DB -->
- <dependency>
- <groupId>com.h2database</groupId>
- <artifactId>h2</artifactId>
- <!--<version>${dbh2.version}</version>-->
- </dependency>
-
- <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
- <dependency>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-collections4</artifactId>
- <version>${commons-collections4.version}</version>
- </dependency>
-
- <!-- Jackson JSON Processor -->
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- <version>${jackson-version}</version>
- </dependency>
-
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-core</artifactId>
- <version>${jackson-version}</version>
- </dependency>
-
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-annotations</artifactId>
- <version>${jackson-version}</version>
- </dependency>
-
-
- <!-- https://mvnrepository.com/artifact/commons-validator/commons-validator -->
- <dependency>
- <groupId>commons-validator</groupId>
- <artifactId>commons-validator</artifactId>
- <version>${commons-validator.version}</version>
-
- <exclusions>
- <exclusion>
- <groupId>commons-collections</groupId>
- <artifactId>commons-collections</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
-
-
- <!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
- <dependency>
- <groupId>org.freemarker</groupId>
- <artifactId>freemarker</artifactId>
- </dependency>
-
- <!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context-support</artifactId>
- </dependency>
-
- <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
- <dependency>
- <groupId>org.apache.httpcomponents</groupId>
- <artifactId>httpclient</artifactId>
- <version>${org.apache.httpcomponent.version}</version>
- </dependency>
-
-
- <!-- Payment dependencies -->
- <dependency>
- <groupId>com.paypal.sdk</groupId>
- <artifactId>merchantsdk</artifactId>
- <version>2.6.109</version>
- </dependency>
-
-
- <dependency>
- <groupId>com.stripe</groupId>
- <artifactId>stripe-java</artifactId>
- <version>1.33.0</version>
- </dependency>
-
- <!-- Invoices -->
- <dependency>
- <groupId>com.itextpdf</groupId>
- <artifactId>itextpdf</artifactId>
- <version>5.5.6</version>
- </dependency>
-
- <dependency>
- <groupId>org.jopendocument</groupId>
- <artifactId>jOpenDocument</artifactId>
- <version>1.3b1</version>
- </dependency>
-
- <!-- https://mvnrepository.com/artifact/com.maxmind.geoip2/geoip2 -->
- <dependency>
- <groupId>com.maxmind.geoip2</groupId>
- <artifactId>geoip2</artifactId>
- <version>${geoip2.version}</version>
- </dependency>
-
- </dependencies>
-
-
-
-
-
-</project>
+<?xml version="1.0"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>com.shopizer</groupId>
+ <artifactId>shopizer</artifactId>
+ <version>2.2.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>sm-core</artifactId>
+ <packaging>jar</packaging>
+
+ <name>sm-core</name>
+ <url>http://www.shopizer.com</url>
+
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+
+ <!-- testing properties -->
+ <!--<dbh2.version>1.4.187</dbh2.version>-->
+ <geoip2.version>2.7.0</geoip2.version>
+ <javax.inject.version>1</javax.inject.version>
+ <javax.el.version>2.2.4</javax.el.version>
+ <drools.version>5.6.0.Final</drools.version>
+ <jackson-version>2.7.4</jackson-version>
+ </properties>
+
+ <dependencies>
+
+ <!-- sm-core-model -->
+ <dependency>
+ <groupId>com.shopizer</groupId>
+ <artifactId>sm-core-model</artifactId>
+ <version>${shopizer.version}</version>
+ </dependency>
+
+
+ <!-- sm-core-modules -->
+ <dependency>
+ <groupId>com.shopizer</groupId>
+ <artifactId>sm-core-modules</artifactId>
+ <version>${shopizer.version}</version>
+ </dependency>
+
+ <!-- sm-search -->
+ <dependency>
+ <groupId>com.shopizer</groupId>
+ <artifactId>sm-search</artifactId>
+ <version>${shopizer.search.version}</version>
+ </dependency>
+
+ <!-- shipping rules -->
+ <!-- shipping distance pre-processor -->
+ <dependency>
+ <groupId>com.shopizer</groupId>
+ <artifactId>shopizer-shipping-distance-processor</artifactId>
+ <version>${shopizer-shipping-distance.version}</version>
+ </dependency>
+
+ <!-- canadapost -->
+ <dependency>
+ <groupId>com.shopizer</groupId>
+ <artifactId>shopizer-shipping-canadapost-module</artifactId>
+ <version>${shopizer-canadapost.version}</version>
+ </dependency>
+
+ <!-- Rules engine -->
+ <dependency>
+ <groupId>org.drools</groupId>
+ <artifactId>drools-spring</artifactId>
+ <version>${drools.version}</version>
+ </dependency>
+
+
+ <!-- Infinispan -->
+ <dependency>
+ <groupId>org.infinispan</groupId>
+ <artifactId>infinispan-core</artifactId>
+ <version>${infinispan.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.infinispan</groupId>
+ <artifactId>infinispan-cachestore-jdbc</artifactId>
+ <version>${infinispan.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.infinispan</groupId>
+ <artifactId>infinispan-tree</artifactId>
+ <version>${infinispan.version}</version>
+ </dependency>
+
+ <!-- tests dependencies -->
+ <!-- http://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-test</artifactId>
+ </dependency>
+ <!-- H2 DB -->
+ <dependency>
+ <groupId>com.h2database</groupId>
+ <artifactId>h2</artifactId>
+ <!--<version>${dbh2.version}</version>-->
+ </dependency>
+
+ <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
+ <dependency>
+ <groupId>org.apache.commons</groupId>
+ <artifactId>commons-collections4</artifactId>
+ <version>${commons-collections4.version}</version>
+ </dependency>
+
+ <!-- Jackson JSON Processor -->
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ <version>${jackson-version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-core</artifactId>
+ <version>${jackson-version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-annotations</artifactId>
+ <version>${jackson-version}</version>
+ </dependency>
+
+
+ <!-- https://mvnrepository.com/artifact/commons-validator/commons-validator -->
+ <dependency>
+ <groupId>commons-validator</groupId>
+ <artifactId>commons-validator</artifactId>
+ <version>${commons-validator.version}</version>
+
+ <exclusions>
+ <exclusion>
+ <groupId>commons-collections</groupId>
+ <artifactId>commons-collections</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
+
+ <!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
+ <dependency>
+ <groupId>org.freemarker</groupId>
+ <artifactId>freemarker</artifactId>
+ </dependency>
+
+ <!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support -->
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-context-support</artifactId>
+ </dependency>
+
+ <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpclient</artifactId>
+ <version>${org.apache.httpcomponent.version}</version>
+ </dependency>
+
+
+ <!-- Payment dependencies -->
+
+ <!-- Paypal -->
+ <dependency>
+ <groupId>com.paypal.sdk</groupId>
+ <artifactId>merchantsdk</artifactId>
+ <version>2.6.109</version>
+ </dependency>
+
+ <!-- Stripe -->
+ <dependency>
+ <groupId>com.stripe</groupId>
+ <artifactId>stripe-java</artifactId>
+ <version>1.33.0</version>
+ </dependency>
+
+ <!-- Braintree -->
+ <dependency>
+ <groupId>com.braintreepayments.gateway</groupId>
+ <artifactId>braintree-java</artifactId>
+ <version>2.73.0</version>
+ </dependency>
+
+
+ <!-- Invoices -->
+ <dependency>
+ <groupId>com.itextpdf</groupId>
+ <artifactId>itextpdf</artifactId>
+ <version>5.5.6</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.jopendocument</groupId>
+ <artifactId>jOpenDocument</artifactId>
+ <version>1.3b1</version>
+ </dependency>
+
+ <!-- https://mvnrepository.com/artifact/com.maxmind.geoip2/geoip2 -->
+ <dependency>
+ <groupId>com.maxmind.geoip2</groupId>
+ <artifactId>geoip2</artifactId>
+ <version>${geoip2.version}</version>
+ </dependency>
+
+ </dependencies>
+
+
+
+
+
+</project>
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/configuration/CoreApplicationConfiguration.java b/sm-core/src/main/java/com/salesmanager/core/business/configuration/CoreApplicationConfiguration.java
index e1965e1..20695fc 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/configuration/CoreApplicationConfiguration.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/configuration/CoreApplicationConfiguration.java
@@ -1,16 +1,16 @@
-package com.salesmanager.core.business.configuration;
-
-import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
-import org.springframework.boot.orm.jpa.EntityScan;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.ImportResource;
-
-@Configuration
-@EnableAutoConfiguration
-@EntityScan(basePackages = {"com.salesmanager.core.model"})
-@ComponentScan({"com.salesmanager.core.business.services","com.salesmanager.core.business.utils"})
-@ImportResource("classpath:/spring/shopizer-core-context.xml")
-public class CoreApplicationConfiguration {
-
-}
+package com.salesmanager.core.business.configuration;
+
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.orm.jpa.EntityScan;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.ImportResource;
+
+@Configuration
+@EnableAutoConfiguration
+@EntityScan(basePackages = {"com.salesmanager.core.model"})
+@ComponentScan({"com.salesmanager.core.business.services","com.salesmanager.core.business.utils"})
+@ImportResource("classpath:/spring/shopizer-core-context.xml")
+public class CoreApplicationConfiguration {
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/constants/Constants.java b/sm-core/src/main/java/com/salesmanager/core/business/constants/Constants.java
index 20c137f..24c3476 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/constants/Constants.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/constants/Constants.java
@@ -1,38 +1,41 @@
-package com.salesmanager.core.business.constants;
-
-import java.util.Currency;
-import java.util.Locale;
-
-public class Constants {
-
- public final static String TEST_ENVIRONMENT= "TEST";
- public final static String PRODUCTION_ENVIRONMENT= "PROD";
- public final static String SHOP_URI = "/shop";
-
- public static final String ALL_REGIONS = "*";
-
-
- public final static String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
- public final static String DEFAULT_DATE_FORMAT_YEAR = "yyyy";
- public final static String DEFAULT_LANGUAGE = "en";
-
- public final static String EMAIL_CONFIG = "EMAIL_CONFIG";
- //public final static String MERCHANT_CONFIG = "MERCHANT_CONFIG";
-
- public final static String UNDERSCORE = "_";
- public final static String SLASH = "/";
- public final static String TRUE = "true";
- public final static String FALSE = "false";
- public final static String OT_ITEM_PRICE_MODULE_CODE = "itemprice";
- public final static String OT_SUBTOTAL_MODULE_CODE = "subtotal";
- public final static String OT_TOTAL_MODULE_CODE = "total";
- public final static String OT_SHIPPING_MODULE_CODE = "shipping";
- public final static String OT_HANDLING_MODULE_CODE = "handling";
- public final static String OT_TAX_MODULE_CODE = "tax";
- public final static String OT_REFUND_MODULE_CODE = "refund";
- public final static String OT_DISCOUNT_TITLE = "order.total.discount";
-
- public final static Locale DEFAULT_LOCALE = Locale.US;
- public final static Currency DEFAULT_CURRENCY = Currency.getInstance(Locale.US);
-
-}
+package com.salesmanager.core.business.constants;
+
+import java.util.Currency;
+import java.util.Locale;
+
+public class Constants {
+
+ public final static String TEST_ENVIRONMENT= "TEST";
+ public final static String PRODUCTION_ENVIRONMENT= "PROD";
+ public final static String SHOP_URI = "/shop";
+
+ public static final String ALL_REGIONS = "*";
+
+
+ public final static String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
+ public final static String DEFAULT_DATE_FORMAT_YEAR = "yyyy";
+ public final static String DEFAULT_LANGUAGE = "en";
+ public final static String DEFAULT_COUNTRY = "CA";
+
+ public final static String EMAIL_CONFIG = "EMAIL_CONFIG";
+ //public final static String MERCHANT_CONFIG = "MERCHANT_CONFIG";
+
+ public final static String UNDERSCORE = "_";
+ public final static String SLASH = "/";
+ public final static String TRUE = "true";
+ public final static String FALSE = "false";
+ public final static String OT_ITEM_PRICE_MODULE_CODE = "itemprice";
+ public final static String OT_SUBTOTAL_MODULE_CODE = "subtotal";
+ public final static String OT_TOTAL_MODULE_CODE = "total";
+ public final static String OT_SHIPPING_MODULE_CODE = "shipping";
+ public final static String OT_HANDLING_MODULE_CODE = "handling";
+ public final static String OT_TAX_MODULE_CODE = "tax";
+ public final static String OT_REFUND_MODULE_CODE = "refund";
+ public final static String OT_DISCOUNT_TITLE = "order.total.discount";
+
+ public final static String DEFAULT_STORE = "DEFAULT";
+
+ public final static Locale DEFAULT_LOCALE = Locale.US;
+ public final static Currency DEFAULT_CURRENCY = Currency.getInstance(Locale.US);
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/common/ImageGet.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/common/ImageGet.java
index f487cc8..cdc18be 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/common/ImageGet.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/common/ImageGet.java
@@ -1,15 +1,15 @@
-package com.salesmanager.core.business.modules.cms.common;
-
-import java.util.List;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.model.content.FileContentType;
-import com.salesmanager.core.model.content.OutputContentFile;
-
-public interface ImageGet
-{
-
- public List<OutputContentFile> getImages( final String merchantStoreCode, FileContentType imageContentType )
- throws ServiceException;
-
-}
+package com.salesmanager.core.business.modules.cms.common;
+
+import java.util.List;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.model.content.FileContentType;
+import com.salesmanager.core.model.content.OutputContentFile;
+
+public interface ImageGet
+{
+
+ public List<OutputContentFile> getImages( final String merchantStoreCode, FileContentType imageContentType )
+ throws ServiceException;
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/common/ImageRemove.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/common/ImageRemove.java
index d7d84a2..db5aefc 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/common/ImageRemove.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/common/ImageRemove.java
@@ -1,11 +1,11 @@
-package com.salesmanager.core.business.modules.cms.common;
-
-import com.salesmanager.core.business.exception.ServiceException;
-
-
-public interface ImageRemove {
-
-
- public void removeImages(final String merchantStoreCode) throws ServiceException;
-
-}
+package com.salesmanager.core.business.modules.cms.common;
+
+import com.salesmanager.core.business.exception.ServiceException;
+
+
+public interface ImageRemove {
+
+
+ public void removeImages(final String merchantStoreCode) throws ServiceException;
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/common/StaticContentData.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/common/StaticContentData.java
index 916d69c..7871ac0 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/common/StaticContentData.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/common/StaticContentData.java
@@ -1,52 +1,52 @@
-/**
- *
- */
-package com.salesmanager.core.business.modules.cms.common;
-
-import java.io.Serializable;
-
-import com.salesmanager.core.model.content.FileContentType;
-
-
-/**
- * Abstract class for Static content data containing common attributes
- * for handling static content data.
- *
- * @author Umesh Awasthi
- *@since 1.2
- */
-public abstract class StaticContentData implements Serializable
-{
-
-
- private static final long serialVersionUID = 1L;
- private String fileName;
- private FileContentType contentType = FileContentType.STATIC_FILE;
- private String fileContentType;
-
- public String getFileName()
- {
- return fileName;
- }
- public void setFileName( String fileName )
- {
- this.fileName = fileName;
- }
-
- public String getFileContentType()
- {
- return fileContentType;
- }
- public void setFileContentType( String fileContentType )
- {
- this.fileContentType = fileContentType;
- }
- public void setContentType(FileContentType contentType) {
- this.contentType = contentType;
- }
- public FileContentType getContentType() {
- return contentType;
- }
-
-
-}
+/**
+ *
+ */
+package com.salesmanager.core.business.modules.cms.common;
+
+import java.io.Serializable;
+
+import com.salesmanager.core.model.content.FileContentType;
+
+
+/**
+ * Abstract class for Static content data containing common attributes
+ * for handling static content data.
+ *
+ * @author Umesh Awasthi
+ *@since 1.2
+ */
+public abstract class StaticContentData implements Serializable
+{
+
+
+ private static final long serialVersionUID = 1L;
+ private String fileName;
+ private FileContentType contentType = FileContentType.STATIC_FILE;
+ private String fileContentType;
+
+ public String getFileName()
+ {
+ return fileName;
+ }
+ public void setFileName( String fileName )
+ {
+ this.fileName = fileName;
+ }
+
+ public String getFileContentType()
+ {
+ return fileContentType;
+ }
+ public void setFileContentType( String fileContentType )
+ {
+ this.fileContentType = fileContentType;
+ }
+ public void setContentType(FileContentType contentType) {
+ this.contentType = contentType;
+ }
+ public FileContentType getContentType() {
+ return contentType;
+ }
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/ContentImageGet.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/ContentImageGet.java
index 3919c51..84ad4bf 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/ContentImageGet.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/ContentImageGet.java
@@ -1,15 +1,15 @@
-package com.salesmanager.core.business.modules.cms.content;
-
-import java.util.List;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.modules.cms.common.ImageGet;
-import com.salesmanager.core.model.content.FileContentType;
-import com.salesmanager.core.model.content.OutputContentFile;
-
-public interface ContentImageGet extends ImageGet {
-
- public OutputContentFile getImage(final String merchantStoreCode, String imageName,FileContentType imageContentType) throws ServiceException;
- public List<String> getImageNames(final String merchantStoreCode, FileContentType imageContentType) throws ServiceException;
-
-}
+package com.salesmanager.core.business.modules.cms.content;
+
+import java.util.List;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.modules.cms.common.ImageGet;
+import com.salesmanager.core.model.content.FileContentType;
+import com.salesmanager.core.model.content.OutputContentFile;
+
+public interface ContentImageGet extends ImageGet {
+
+ public OutputContentFile getImage(final String merchantStoreCode, String imageName,FileContentType imageContentType) throws ServiceException;
+ public List<String> getImageNames(final String merchantStoreCode, FileContentType imageContentType) throws ServiceException;
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/ContentImageRemove.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/ContentImageRemove.java
index 90d105d..6351232 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/ContentImageRemove.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/ContentImageRemove.java
@@ -1,14 +1,14 @@
-package com.salesmanager.core.business.modules.cms.content;
-
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.modules.cms.common.ImageRemove;
-import com.salesmanager.core.model.content.FileContentType;
-
-public interface ContentImageRemove extends ImageRemove {
-
-
-
- public void removeImage(final String merchantStoreCode,final FileContentType imageContentType, final String imageName) throws ServiceException;
-
-}
+package com.salesmanager.core.business.modules.cms.content;
+
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.modules.cms.common.ImageRemove;
+import com.salesmanager.core.model.content.FileContentType;
+
+public interface ContentImageRemove extends ImageRemove {
+
+
+
+ public void removeImage(final String merchantStoreCode,final FileContentType imageContentType, final String imageName) throws ServiceException;
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/FileGet.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/FileGet.java
index 6b3be9e..dac2265 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/FileGet.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/FileGet.java
@@ -1,21 +1,21 @@
-package com.salesmanager.core.business.modules.cms.content;
-
-import java.util.List;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.model.content.FileContentType;
-import com.salesmanager.core.model.content.OutputContentFile;
-
-
-/**
- * Methods to retrieve the static content from the CMS
- * @author Carl Samson
- *
- */
-public interface FileGet
-{
-
- public OutputContentFile getFile(final String merchantStoreCode, FileContentType fileContentType, String contentName) throws ServiceException;
- public List<String> getFileNames(final String merchantStoreCode,FileContentType fileContentType) throws ServiceException;
- public List<OutputContentFile> getFiles(final String merchantStoreCode, FileContentType fileContentType) throws ServiceException;
-}
+package com.salesmanager.core.business.modules.cms.content;
+
+import java.util.List;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.model.content.FileContentType;
+import com.salesmanager.core.model.content.OutputContentFile;
+
+
+/**
+ * Methods to retrieve the static content from the CMS
+ * @author Carl Samson
+ *
+ */
+public interface FileGet
+{
+
+ public OutputContentFile getFile(final String merchantStoreCode, FileContentType fileContentType, String contentName) throws ServiceException;
+ public List<String> getFileNames(final String merchantStoreCode,FileContentType fileContentType) throws ServiceException;
+ public List<OutputContentFile> getFiles(final String merchantStoreCode, FileContentType fileContentType) throws ServiceException;
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/FilePut.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/FilePut.java
index fe01ac0..9053508 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/FilePut.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/FilePut.java
@@ -1,20 +1,20 @@
-/**
- *
- */
-package com.salesmanager.core.business.modules.cms.content;
-
-import java.util.List;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.model.content.InputContentFile;
-
-
-/**
- * @author Umesh Awasthi
- *
- */
-public interface FilePut
-{
- public void addFile(final String merchantStoreCode, InputContentFile inputStaticContentData) throws ServiceException;
- public void addFiles(final String merchantStoreCode, List<InputContentFile> inputStaticContentDataList) throws ServiceException;
-}
+/**
+ *
+ */
+package com.salesmanager.core.business.modules.cms.content;
+
+import java.util.List;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.model.content.InputContentFile;
+
+
+/**
+ * @author Umesh Awasthi
+ *
+ */
+public interface FilePut
+{
+ public void addFile(final String merchantStoreCode, InputContentFile inputStaticContentData) throws ServiceException;
+ public void addFiles(final String merchantStoreCode, List<InputContentFile> inputStaticContentDataList) throws ServiceException;
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/FileRemove.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/FileRemove.java
index e89ba54..f6e6a5d 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/FileRemove.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/FileRemove.java
@@ -1,19 +1,19 @@
-/**
- *
- */
-package com.salesmanager.core.business.modules.cms.content;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.model.content.FileContentType;
-
-
-/**
- * @author Umesh Awasthi
- *
- */
-public interface FileRemove
-{
- public void removeFile(String merchantStoreCode, FileContentType staticContentType, String fileName) throws ServiceException;
- public void removeFiles(String merchantStoreCode) throws ServiceException;
-
-}
+/**
+ *
+ */
+package com.salesmanager.core.business.modules.cms.content;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.model.content.FileContentType;
+
+
+/**
+ * @author Umesh Awasthi
+ *
+ */
+public interface FileRemove
+{
+ public void removeFile(String merchantStoreCode, FileContentType staticContentType, String fileName) throws ServiceException;
+ public void removeFiles(String merchantStoreCode) throws ServiceException;
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/ImagePut.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/ImagePut.java
index 3cdb86b..33135d8 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/ImagePut.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/ImagePut.java
@@ -1,14 +1,14 @@
-package com.salesmanager.core.business.modules.cms.content;
-
-import java.util.List;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.model.content.InputContentFile;
-
-public interface ImagePut {
-
-
- public void addImage(final String merchantStoreCode, InputContentFile image) throws ServiceException;
- public void addImages(final String merchantStoreCode, List<InputContentFile> imagesList) throws ServiceException;
-
-}
+package com.salesmanager.core.business.modules.cms.content;
+
+import java.util.List;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.model.content.InputContentFile;
+
+public interface ImagePut {
+
+
+ public void addImage(final String merchantStoreCode, InputContentFile image) throws ServiceException;
+ public void addImages(final String merchantStoreCode, List<InputContentFile> imagesList) throws ServiceException;
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/infinispan/CmsStaticContentFileManagerImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/infinispan/CmsStaticContentFileManagerImpl.java
index 4e37d72..98649de 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/infinispan/CmsStaticContentFileManagerImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/infinispan/CmsStaticContentFileManagerImpl.java
@@ -1,448 +1,448 @@
-/**
- *
- */
-package com.salesmanager.core.business.modules.cms.content.infinispan;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.net.FileNameMap;
-import java.net.URLConnection;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.commons.io.IOUtils;
-import org.infinispan.tree.Fqn;
-import org.infinispan.tree.Node;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.modules.cms.content.FileGet;
-import com.salesmanager.core.business.modules.cms.content.FilePut;
-import com.salesmanager.core.business.modules.cms.content.FileRemove;
-import com.salesmanager.core.business.modules.cms.impl.CacheManager;
-import com.salesmanager.core.model.content.FileContentType;
-import com.salesmanager.core.model.content.InputContentFile;
-import com.salesmanager.core.model.content.OutputContentFile;
-
-
-
-/**
- * Manages
- * - Images
- * - Files (js, pdf, css...) on infinispan
- * @author Umesh Awasthi
- * @since 1.2
- *
- */
-public class CmsStaticContentFileManagerImpl implements FilePut,FileGet,FileRemove
-{
-
- private static final Logger LOGGER = LoggerFactory.getLogger( CmsStaticContentFileManagerImpl.class );
- private static CmsStaticContentFileManagerImpl fileManager = null;
- private static final String ROOT_NAME="static-merchant-";
-
- private String rootName = ROOT_NAME;
-
- private CacheManager cacheManager;
-
- public void stopFileManager()
- {
-
- try
- {
- cacheManager.getManager().stop();
- LOGGER.info( "Stopping CMS" );
- }
- catch ( final Exception e )
- {
- LOGGER.error( "Error while stopping CmsStaticContentFileManager", e );
- }
- }
-
- public static CmsStaticContentFileManagerImpl getInstance()
- {
-
- if ( fileManager == null )
- {
- fileManager = new CmsStaticContentFileManagerImpl();
- }
-
- return fileManager;
-
- }
-
-
- /**
- * <p>Method to add static content data for given merchant.Static content data can be of following type
- * <pre>
- * 1. CSS and JS files
- * 2. Digital Data like audio or video
- * </pre>
- * </p>
- * <p>
- * Merchant store code will be used to create cache node where merchant data will be stored,input data will
- * contain name, file as well type of data being stored.
- * @see FileContentType
- * </p>
- *
- * @param merchantStoreCode merchant store for whom data is being stored
- * @param inputStaticContentData data object being stored
- * @throws ServiceException
- *
- */
- @Override
- public void addFile( final String merchantStoreCode, final InputContentFile inputStaticContentData )
- throws ServiceException
- {
- if ( cacheManager.getTreeCache() == null )
- {
- LOGGER.error( "Unable to find cacheManager.getTreeCache() in Infinispan.." );
- throw new ServiceException( "CmsStaticContentFileManagerInfinispanImpl has a null cacheManager.getTreeCache()" );
- }
- try
- {
-
- String nodePath = this.getNodePath(merchantStoreCode, inputStaticContentData.getFileContentType());
-
- final Node<String, Object> merchantNode = this.getNode(nodePath);
-
- merchantNode.put(inputStaticContentData.getFileName(), IOUtils.toByteArray( inputStaticContentData.getFile() ));
-
- LOGGER.info( "Content data added successfully." );
- }
- catch ( final Exception e )
- {
- LOGGER.error( "Error while saving static content data", e );
- throw new ServiceException( e );
-
- }
-
- }
-
- /**
- * <p>
- * Method to add files for given store.Files will be stored in Infinispan and will be retrieved based on
- * the storeID. Following steps will be performed to store static content files
- * </p>
- * <li>Merchant Node will be retrieved from the cacheTree if it exists else new node will be created.</li> <li>
- * Files will be stored in StaticContentCacheAttribute , which eventually will be stored in Infinispan</li>
- *
- * @param merchantStoreCode Merchant store for which files are getting stored in Infinispan.
- * @param inputStaticContentDataList input static content file list which will get {@link InputContentImage} stored
- * @throws ServiceException if content file storing process fail.
- * @see InputStaticContentData
- * @see StaticContentCacheAttribute
- */
- @Override
- public void addFiles( final String merchantStoreCode, final List<InputContentFile> inputStaticContentDataList )
- throws ServiceException
- {
- if ( cacheManager.getTreeCache() == null )
- {
- LOGGER.error( "Unable to find cacheManager.getTreeCache() in Infinispan.." );
- throw new ServiceException( "CmsStaticContentFileManagerInfinispanImpl has a null cacheManager.getTreeCache()" );
- }
- try
- {
-
- for(final InputContentFile inputStaticContentData:inputStaticContentDataList){
-
-
- String nodePath = this.getNodePath(merchantStoreCode, inputStaticContentData.getFileContentType());
- final Node<String, Object> merchantNode = this.getNode(nodePath);
- merchantNode.put(inputStaticContentData.getFileName(), IOUtils.toByteArray( inputStaticContentData.getFile() ));
-
-
- }
-
-
-
- LOGGER.info( "Total {} files added successfully.",inputStaticContentDataList.size() );
-
- }
- catch ( final Exception e )
- {
- LOGGER.error( "Error while saving content image", e );
- throw new ServiceException( e );
-
- }
- }
-
-
- /**
- * Method to return static data for given Merchant store based on the file name. Content data will be searched
- * in underlying Infinispan cache tree and {@link OutputStaticContentData} will be returned on finding an associated
- * file. In case of no file, null be returned.
- *
- * @param store Merchant store
- * @param contentFileName name of file being requested
- * @return {@link OutputStaticContentData}
- * @throws ServiceException
- */
- @Override
- public OutputContentFile getFile( final String merchantStoreCode, final FileContentType fileContentType, final String contentFileName )
- throws ServiceException
- {
-
- if ( cacheManager.getTreeCache() == null )
- {
- throw new ServiceException( "CmsStaticContentFileManagerInfinispan has a null cacheManager.getTreeCache()" );
- }
- OutputContentFile outputStaticContentData=null;
- InputStream input = null;
- try
- {
-
-
- String nodePath = this.getNodePath(merchantStoreCode, fileContentType);
-
- final Node<String, Object> merchantNode = this.getNode(nodePath);
-
-
- final byte[] fileBytes= (byte[]) merchantNode.get( contentFileName );
-
- if ( fileBytes == null )
- {
- LOGGER.warn( "file byte is null, no file found" );
- return null;
- }
-
- input=new ByteArrayInputStream( fileBytes );
-
- final ByteArrayOutputStream output = new ByteArrayOutputStream();
- IOUtils.copy( input, output );
-
- outputStaticContentData=new OutputContentFile();
- outputStaticContentData.setFile( output );
- outputStaticContentData.setMimeType( URLConnection.getFileNameMap().getContentTypeFor(contentFileName) );
- outputStaticContentData.setFileName( contentFileName );
- outputStaticContentData.setFileContentType( fileContentType );
-
- }
- catch ( final Exception e )
- {
- LOGGER.error( "Error while fetching file for {} merchant ", merchantStoreCode);
- throw new ServiceException( e );
- }
- return outputStaticContentData != null ? outputStaticContentData : null;
- }
-
-
- @Override
- public List<OutputContentFile> getFiles(
- final String merchantStoreCode, final FileContentType staticContentType) throws ServiceException {
-
-
-
- if ( cacheManager.getTreeCache() == null )
- {
- throw new ServiceException( "CmsStaticContentFileManagerInfinispan has a null cacheManager.getTreeCache()" );
- }
- List<OutputContentFile> images = new ArrayList<OutputContentFile>();
- try
- {
-
- FileNameMap fileNameMap = URLConnection.getFileNameMap();
- String nodePath = this.getNodePath(merchantStoreCode, staticContentType);
-
- final Node<String, Object> merchantNode = this.getNode(nodePath);
-
- for(String key : merchantNode.getKeys()) {
-
- byte[] imageBytes = (byte[])merchantNode.get( key );
-
- OutputContentFile contentImage = new OutputContentFile();
-
- InputStream input = new ByteArrayInputStream( imageBytes );
- ByteArrayOutputStream output = new ByteArrayOutputStream();
- IOUtils.copy( input, output );
-
- String contentType = fileNameMap.getContentTypeFor( key );
-
- contentImage.setFile( output );
- contentImage.setMimeType( contentType );
- contentImage.setFileName( key );
-
- images.add( contentImage );
-
-
- }
-
-
-
- }
- catch ( final Exception e )
- {
- LOGGER.error( "Error while fetching file for {} merchant ", merchantStoreCode);
- throw new ServiceException( e );
- }
-
-
- return images;
-
-
- }
-
-
-
- @Override
- public void removeFile( final String merchantStoreCode, final FileContentType staticContentType, final String fileName )
- throws ServiceException
- {
-
-
- if ( cacheManager.getTreeCache() == null )
- {
- throw new ServiceException( "CmsStaticContentFileManagerInfinispan has a null cacheManager.getTreeCache()" );
- }
-
- try
- {
-
-
- String nodePath = this.getNodePath(merchantStoreCode, staticContentType);
- final Node<String, Object> merchantNode = this.getNode(nodePath);
-
- merchantNode.remove(fileName);
-
- }
- catch ( final Exception e )
- {
- LOGGER.error( "Error while fetching file for {} merchant ", merchantStoreCode);
- throw new ServiceException( e );
- }
-
-
- }
-
- /**
- * Removes the data in a given merchant node
- */
- @SuppressWarnings("unchecked")
- @Override
- public void removeFiles( final String merchantStoreCode )
- throws ServiceException
- {
-
- LOGGER.info( "Removing all images for {} merchant ",merchantStoreCode);
- if ( cacheManager.getTreeCache() == null )
- {
- LOGGER.error( "Unable to find cacheManager.getTreeCache() in Infinispan.." );
- throw new ServiceException( "CmsImageFileManagerInfinispan has a null cacheManager.getTreeCache()" );
- }
-
- try
- {
-
-
- final StringBuilder merchantPath = new StringBuilder();
- merchantPath.append( getRootName()).append(merchantStoreCode );
- cacheManager.getTreeCache().getRoot().remove(merchantPath.toString());
-
-
-
-
- }
- catch ( final Exception e )
- {
- LOGGER.error( "Error while deleting content image for {} merchant ", merchantStoreCode);
- throw new ServiceException( e );
- }
-
- }
-
- @SuppressWarnings({ "unchecked"})
- private Node<String, Object> getNode( final String node )
- {
- LOGGER.debug( "Fetching node for store {} from Infinispan", node );
- final StringBuilder merchantPath = new StringBuilder();
- merchantPath.append( getRootName() ).append(node);
-
- Fqn contentFilesFqn = Fqn.fromString(merchantPath.toString());
-
- Node<String,Object> nd = cacheManager.getTreeCache().getRoot().getChild(contentFilesFqn);
-
- if(nd==null) {
-
- cacheManager.getTreeCache().getRoot().addChild(contentFilesFqn);
- nd = cacheManager.getTreeCache().getRoot().getChild(contentFilesFqn);
-
- }
-
- return nd;
-
- }
-
- private String getNodePath(final String storeCode,final FileContentType contentType) {
-
- StringBuilder nodePath = new StringBuilder();
- nodePath.append(storeCode).append("/").append(contentType.name());
-
- return nodePath.toString();
-
- }
-
-
-
- public CacheManager getCacheManager() {
- return cacheManager;
- }
-
- public void setCacheManager(CacheManager cacheManager) {
- this.cacheManager = cacheManager;
- }
-
-
- /**
- * Queries the CMS to retrieve all static content files. Only the name of the file will be returned to the client
- * @param merchantStoreCode
- * @return
- * @throws ServiceException
- */
- @Override
- public List<String> getFileNames(final String merchantStoreCode, final FileContentType staticContentType)
- throws ServiceException {
-
-
-
- if ( cacheManager.getTreeCache() == null )
- {
- throw new ServiceException( "CmsStaticContentFileManagerInfinispan has a null cacheManager.getTreeCache()" );
- }
-
- try
- {
-
-
-
- String nodePath = this.getNodePath(merchantStoreCode, staticContentType);
- final Node<String, Object> objectNode = this.getNode(nodePath);
-
- if(objectNode.getKeys().isEmpty()) {
- LOGGER.warn( "Unable to find content attribute for given merchant" );
- return Collections.<String> emptyList();
- }
- return new ArrayList<String>(objectNode.getKeys());
-
- }
- catch ( final Exception e )
- {
- LOGGER.error( "Error while fetching file for {} merchant ", merchantStoreCode);
- throw new ServiceException( e );
- }
-
- }
-
- public void setRootName(String rootName) {
- this.rootName = rootName;
- }
-
- public String getRootName() {
- return rootName;
- }
-
-
-}
+/**
+ *
+ */
+package com.salesmanager.core.business.modules.cms.content.infinispan;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.net.FileNameMap;
+import java.net.URLConnection;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.commons.io.IOUtils;
+import org.infinispan.tree.Fqn;
+import org.infinispan.tree.Node;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.modules.cms.content.FileGet;
+import com.salesmanager.core.business.modules.cms.content.FilePut;
+import com.salesmanager.core.business.modules.cms.content.FileRemove;
+import com.salesmanager.core.business.modules.cms.impl.CacheManager;
+import com.salesmanager.core.model.content.FileContentType;
+import com.salesmanager.core.model.content.InputContentFile;
+import com.salesmanager.core.model.content.OutputContentFile;
+
+
+
+/**
+ * Manages
+ * - Images
+ * - Files (js, pdf, css...) on infinispan
+ * @author Umesh Awasthi
+ * @since 1.2
+ *
+ */
+public class CmsStaticContentFileManagerImpl implements FilePut,FileGet,FileRemove
+{
+
+ private static final Logger LOGGER = LoggerFactory.getLogger( CmsStaticContentFileManagerImpl.class );
+ private static CmsStaticContentFileManagerImpl fileManager = null;
+ private static final String ROOT_NAME="static-merchant-";
+
+ private String rootName = ROOT_NAME;
+
+ private CacheManager cacheManager;
+
+ public void stopFileManager()
+ {
+
+ try
+ {
+ cacheManager.getManager().stop();
+ LOGGER.info( "Stopping CMS" );
+ }
+ catch ( final Exception e )
+ {
+ LOGGER.error( "Error while stopping CmsStaticContentFileManager", e );
+ }
+ }
+
+ public static CmsStaticContentFileManagerImpl getInstance()
+ {
+
+ if ( fileManager == null )
+ {
+ fileManager = new CmsStaticContentFileManagerImpl();
+ }
+
+ return fileManager;
+
+ }
+
+
+ /**
+ * <p>Method to add static content data for given merchant.Static content data can be of following type
+ * <pre>
+ * 1. CSS and JS files
+ * 2. Digital Data like audio or video
+ * </pre>
+ * </p>
+ * <p>
+ * Merchant store code will be used to create cache node where merchant data will be stored,input data will
+ * contain name, file as well type of data being stored.
+ * @see FileContentType
+ * </p>
+ *
+ * @param merchantStoreCode merchant store for whom data is being stored
+ * @param inputStaticContentData data object being stored
+ * @throws ServiceException
+ *
+ */
+ @Override
+ public void addFile( final String merchantStoreCode, final InputContentFile inputStaticContentData )
+ throws ServiceException
+ {
+ if ( cacheManager.getTreeCache() == null )
+ {
+ LOGGER.error( "Unable to find cacheManager.getTreeCache() in Infinispan.." );
+ throw new ServiceException( "CmsStaticContentFileManagerInfinispanImpl has a null cacheManager.getTreeCache()" );
+ }
+ try
+ {
+
+ String nodePath = this.getNodePath(merchantStoreCode, inputStaticContentData.getFileContentType());
+
+ final Node<String, Object> merchantNode = this.getNode(nodePath);
+
+ merchantNode.put(inputStaticContentData.getFileName(), IOUtils.toByteArray( inputStaticContentData.getFile() ));
+
+ LOGGER.info( "Content data added successfully." );
+ }
+ catch ( final Exception e )
+ {
+ LOGGER.error( "Error while saving static content data", e );
+ throw new ServiceException( e );
+
+ }
+
+ }
+
+ /**
+ * <p>
+ * Method to add files for given store.Files will be stored in Infinispan and will be retrieved based on
+ * the storeID. Following steps will be performed to store static content files
+ * </p>
+ * <li>Merchant Node will be retrieved from the cacheTree if it exists else new node will be created.</li> <li>
+ * Files will be stored in StaticContentCacheAttribute , which eventually will be stored in Infinispan</li>
+ *
+ * @param merchantStoreCode Merchant store for which files are getting stored in Infinispan.
+ * @param inputStaticContentDataList input static content file list which will get {@link InputContentImage} stored
+ * @throws ServiceException if content file storing process fail.
+ * @see InputStaticContentData
+ * @see StaticContentCacheAttribute
+ */
+ @Override
+ public void addFiles( final String merchantStoreCode, final List<InputContentFile> inputStaticContentDataList )
+ throws ServiceException
+ {
+ if ( cacheManager.getTreeCache() == null )
+ {
+ LOGGER.error( "Unable to find cacheManager.getTreeCache() in Infinispan.." );
+ throw new ServiceException( "CmsStaticContentFileManagerInfinispanImpl has a null cacheManager.getTreeCache()" );
+ }
+ try
+ {
+
+ for(final InputContentFile inputStaticContentData:inputStaticContentDataList){
+
+
+ String nodePath = this.getNodePath(merchantStoreCode, inputStaticContentData.getFileContentType());
+ final Node<String, Object> merchantNode = this.getNode(nodePath);
+ merchantNode.put(inputStaticContentData.getFileName(), IOUtils.toByteArray( inputStaticContentData.getFile() ));
+
+
+ }
+
+
+
+ LOGGER.info( "Total {} files added successfully.",inputStaticContentDataList.size() );
+
+ }
+ catch ( final Exception e )
+ {
+ LOGGER.error( "Error while saving content image", e );
+ throw new ServiceException( e );
+
+ }
+ }
+
+
+ /**
+ * Method to return static data for given Merchant store based on the file name. Content data will be searched
+ * in underlying Infinispan cache tree and {@link OutputStaticContentData} will be returned on finding an associated
+ * file. In case of no file, null be returned.
+ *
+ * @param store Merchant store
+ * @param contentFileName name of file being requested
+ * @return {@link OutputStaticContentData}
+ * @throws ServiceException
+ */
+ @Override
+ public OutputContentFile getFile( final String merchantStoreCode, final FileContentType fileContentType, final String contentFileName )
+ throws ServiceException
+ {
+
+ if ( cacheManager.getTreeCache() == null )
+ {
+ throw new ServiceException( "CmsStaticContentFileManagerInfinispan has a null cacheManager.getTreeCache()" );
+ }
+ OutputContentFile outputStaticContentData=null;
+ InputStream input = null;
+ try
+ {
+
+
+ String nodePath = this.getNodePath(merchantStoreCode, fileContentType);
+
+ final Node<String, Object> merchantNode = this.getNode(nodePath);
+
+
+ final byte[] fileBytes= (byte[]) merchantNode.get( contentFileName );
+
+ if ( fileBytes == null )
+ {
+ LOGGER.warn( "file byte is null, no file found" );
+ return null;
+ }
+
+ input=new ByteArrayInputStream( fileBytes );
+
+ final ByteArrayOutputStream output = new ByteArrayOutputStream();
+ IOUtils.copy( input, output );
+
+ outputStaticContentData=new OutputContentFile();
+ outputStaticContentData.setFile( output );
+ outputStaticContentData.setMimeType( URLConnection.getFileNameMap().getContentTypeFor(contentFileName) );
+ outputStaticContentData.setFileName( contentFileName );
+ outputStaticContentData.setFileContentType( fileContentType );
+
+ }
+ catch ( final Exception e )
+ {
+ LOGGER.error( "Error while fetching file for {} merchant ", merchantStoreCode);
+ throw new ServiceException( e );
+ }
+ return outputStaticContentData != null ? outputStaticContentData : null;
+ }
+
+
+ @Override
+ public List<OutputContentFile> getFiles(
+ final String merchantStoreCode, final FileContentType staticContentType) throws ServiceException {
+
+
+
+ if ( cacheManager.getTreeCache() == null )
+ {
+ throw new ServiceException( "CmsStaticContentFileManagerInfinispan has a null cacheManager.getTreeCache()" );
+ }
+ List<OutputContentFile> images = new ArrayList<OutputContentFile>();
+ try
+ {
+
+ FileNameMap fileNameMap = URLConnection.getFileNameMap();
+ String nodePath = this.getNodePath(merchantStoreCode, staticContentType);
+
+ final Node<String, Object> merchantNode = this.getNode(nodePath);
+
+ for(String key : merchantNode.getKeys()) {
+
+ byte[] imageBytes = (byte[])merchantNode.get( key );
+
+ OutputContentFile contentImage = new OutputContentFile();
+
+ InputStream input = new ByteArrayInputStream( imageBytes );
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ IOUtils.copy( input, output );
+
+ String contentType = fileNameMap.getContentTypeFor( key );
+
+ contentImage.setFile( output );
+ contentImage.setMimeType( contentType );
+ contentImage.setFileName( key );
+
+ images.add( contentImage );
+
+
+ }
+
+
+
+ }
+ catch ( final Exception e )
+ {
+ LOGGER.error( "Error while fetching file for {} merchant ", merchantStoreCode);
+ throw new ServiceException( e );
+ }
+
+
+ return images;
+
+
+ }
+
+
+
+ @Override
+ public void removeFile( final String merchantStoreCode, final FileContentType staticContentType, final String fileName )
+ throws ServiceException
+ {
+
+
+ if ( cacheManager.getTreeCache() == null )
+ {
+ throw new ServiceException( "CmsStaticContentFileManagerInfinispan has a null cacheManager.getTreeCache()" );
+ }
+
+ try
+ {
+
+
+ String nodePath = this.getNodePath(merchantStoreCode, staticContentType);
+ final Node<String, Object> merchantNode = this.getNode(nodePath);
+
+ merchantNode.remove(fileName);
+
+ }
+ catch ( final Exception e )
+ {
+ LOGGER.error( "Error while fetching file for {} merchant ", merchantStoreCode);
+ throw new ServiceException( e );
+ }
+
+
+ }
+
+ /**
+ * Removes the data in a given merchant node
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public void removeFiles( final String merchantStoreCode )
+ throws ServiceException
+ {
+
+ LOGGER.info( "Removing all images for {} merchant ",merchantStoreCode);
+ if ( cacheManager.getTreeCache() == null )
+ {
+ LOGGER.error( "Unable to find cacheManager.getTreeCache() in Infinispan.." );
+ throw new ServiceException( "CmsImageFileManagerInfinispan has a null cacheManager.getTreeCache()" );
+ }
+
+ try
+ {
+
+
+ final StringBuilder merchantPath = new StringBuilder();
+ merchantPath.append( getRootName()).append(merchantStoreCode );
+ cacheManager.getTreeCache().getRoot().remove(merchantPath.toString());
+
+
+
+
+ }
+ catch ( final Exception e )
+ {
+ LOGGER.error( "Error while deleting content image for {} merchant ", merchantStoreCode);
+ throw new ServiceException( e );
+ }
+
+ }
+
+ @SuppressWarnings({ "unchecked"})
+ private Node<String, Object> getNode( final String node )
+ {
+ LOGGER.debug( "Fetching node for store {} from Infinispan", node );
+ final StringBuilder merchantPath = new StringBuilder();
+ merchantPath.append( getRootName() ).append(node);
+
+ Fqn contentFilesFqn = Fqn.fromString(merchantPath.toString());
+
+ Node<String,Object> nd = cacheManager.getTreeCache().getRoot().getChild(contentFilesFqn);
+
+ if(nd==null) {
+
+ cacheManager.getTreeCache().getRoot().addChild(contentFilesFqn);
+ nd = cacheManager.getTreeCache().getRoot().getChild(contentFilesFqn);
+
+ }
+
+ return nd;
+
+ }
+
+ private String getNodePath(final String storeCode,final FileContentType contentType) {
+
+ StringBuilder nodePath = new StringBuilder();
+ nodePath.append(storeCode).append("/").append(contentType.name());
+
+ return nodePath.toString();
+
+ }
+
+
+
+ public CacheManager getCacheManager() {
+ return cacheManager;
+ }
+
+ public void setCacheManager(CacheManager cacheManager) {
+ this.cacheManager = cacheManager;
+ }
+
+
+ /**
+ * Queries the CMS to retrieve all static content files. Only the name of the file will be returned to the client
+ * @param merchantStoreCode
+ * @return
+ * @throws ServiceException
+ */
+ @Override
+ public List<String> getFileNames(final String merchantStoreCode, final FileContentType staticContentType)
+ throws ServiceException {
+
+
+
+ if ( cacheManager.getTreeCache() == null )
+ {
+ throw new ServiceException( "CmsStaticContentFileManagerInfinispan has a null cacheManager.getTreeCache()" );
+ }
+
+ try
+ {
+
+
+
+ String nodePath = this.getNodePath(merchantStoreCode, staticContentType);
+ final Node<String, Object> objectNode = this.getNode(nodePath);
+
+ if(objectNode.getKeys().isEmpty()) {
+ LOGGER.warn( "Unable to find content attribute for given merchant" );
+ return Collections.<String> emptyList();
+ }
+ return new ArrayList<String>(objectNode.getKeys());
+
+ }
+ catch ( final Exception e )
+ {
+ LOGGER.error( "Error while fetching file for {} merchant ", merchantStoreCode);
+ throw new ServiceException( e );
+ }
+
+ }
+
+ public void setRootName(String rootName) {
+ this.rootName = rootName;
+ }
+
+ public String getRootName() {
+ return rootName;
+ }
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/local/CmsStaticContentFileManagerImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/local/CmsStaticContentFileManagerImpl.java
index cb5a43f..a579c6a 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/local/CmsStaticContentFileManagerImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/local/CmsStaticContentFileManagerImpl.java
@@ -1,524 +1,524 @@
-/**
- *
- */
-package com.salesmanager.core.business.modules.cms.content.local;
-
-import java.io.IOException;
-import java.net.URLConnection;
-import java.nio.file.DirectoryStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.StandardCopyOption;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.salesmanager.core.business.constants.Constants;
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.modules.cms.content.FileGet;
-import com.salesmanager.core.business.modules.cms.content.FilePut;
-import com.salesmanager.core.business.modules.cms.content.FileRemove;
-import com.salesmanager.core.business.modules.cms.impl.LocalCacheManagerImpl;
-import com.salesmanager.core.model.content.FileContentType;
-import com.salesmanager.core.model.content.InputContentFile;
-import com.salesmanager.core.model.content.OutputContentFile;
-
-
-
-/**
- * Manages
- * - Images
- * - Files (js, pdf, css...) on a local web server
- * @author Carl Samson
- * @since 1.0.3
- *
- */
-public class CmsStaticContentFileManagerImpl implements FilePut,FileGet,FileRemove
-{
-
- private static final Logger LOGGER = LoggerFactory.getLogger( CmsStaticContentFileManagerImpl.class );
- private static CmsStaticContentFileManagerImpl fileManager = null;
- private static final String ROOT_NAME="static";
-
- private static final String ROOT_CONTAINER = "files";
-
- private String rootName = ROOT_NAME;
-
- private LocalCacheManagerImpl cacheManager;
-
-
-
- public static CmsStaticContentFileManagerImpl getInstance()
- {
-
- if ( fileManager == null )
- {
- fileManager = new CmsStaticContentFileManagerImpl();
- }
-
- return fileManager;
-
- }
-
-
- /**
- * <p>Method to add static content data for given merchant.Static content data can be of following type
- * <pre>
- * 1. CSS and JS files
- * 2. Digital Data like audio or video
- * </pre>
- * </p>
- * <p>
- * Merchant store code will be used to create cache node where merchant data will be stored,input data will
- * contain name, file as well type of data being stored.
- * @see FileContentType
- * </p>
- *
- * @param merchantStoreCode merchant store for whom data is being stored
- * @param inputStaticContentData data object being stored
- * @throws ServiceException
- *
- */
- @Override
- public void addFile( final String merchantStoreCode, final InputContentFile inputStaticContentData )
- throws ServiceException
- {
-/* if ( cacheManager.getTreeCache() == null )
- {
- LOGGER.error( "Unable to find cacheManager.getTreeCache() in Infinispan.." );
- throw new ServiceException( "CmsStaticContentFileManagerInfinispanImpl has a null cacheManager.getTreeCache()" );
- }*/
- try
- {
-
-
-
- //base path
- String rootPath = this.buildRootPath();
- Path confDir = Paths.get(rootPath);
- this.createDirectoryIfNorExist(confDir);
-
- //node path
- StringBuilder nodePath = new StringBuilder();
- nodePath
- .append(rootPath)
- .append(merchantStoreCode);
- Path merchantPath = Paths.get(nodePath.toString());
- this.createDirectoryIfNorExist(merchantPath);
-
- //file path
- nodePath.append(Constants.SLASH).append( inputStaticContentData.getFileContentType()).append(Constants.SLASH);
- Path dirPath = Paths.get(nodePath.toString());
- this.createDirectoryIfNorExist(dirPath);
-
- //file creation
- nodePath.append(inputStaticContentData.getFileName());
-
-
- Path path = Paths.get(nodePath.toString());
-
-
- //file creation
- //nodePath.append(Constants.SLASH).append(contentImage.getFileName());
-
-
- //Path path = Paths.get(nodePath.toString());
-
-
- Files.copy(inputStaticContentData.getFile(), path, StandardCopyOption.REPLACE_EXISTING);
-
-
-
-
-
- //String nodePath = this.getNodePath(merchantStoreCode, inputStaticContentData.getFileContentType());
-
- //final Node<String, Object> merchantNode = this.getNode(nodePath);
-
- //merchantNode.put(inputStaticContentData.getFileName(), IOUtils.toByteArray( inputStaticContentData.getFile() ));
-
- LOGGER.info( "Content data added successfully." );
- }
- catch ( final Exception e )
- {
- LOGGER.error( "Error while saving static content data", e );
- throw new ServiceException( e );
-
- }
-
- }
-
- /**
- * <p>
- * Method to add files for given store.Files will be stored in Infinispan and will be retrieved based on
- * the storeID. Following steps will be performed to store static content files
- * </p>
- * <li>Merchant Node will be retrieved from the cacheTree if it exists else new node will be created.</li> <li>
- * Files will be stored in StaticContentCacheAttribute , which eventually will be stored in Infinispan</li>
- *
- * @param merchantStoreCode Merchant store for which files are getting stored in Infinispan.
- * @param inputStaticContentDataList input static content file list which will get {@link InputContentImage} stored
- * @throws ServiceException if content file storing process fail.
- * @see InputStaticContentData
- * @see StaticContentCacheAttribute
- */
- @Override
- public void addFiles( final String merchantStoreCode, final List<InputContentFile> inputStaticContentDataList )
- throws ServiceException
- {
-/* if ( cacheManager.getTreeCache() == null )
- {
- LOGGER.error( "Unable to find cacheManager.getTreeCache() in Infinispan.." );
- throw new ServiceException( "CmsStaticContentFileManagerInfinispanImpl has a null cacheManager.getTreeCache()" );
- }*/
- try
- {
-
-
- //base path
- String rootPath = this.buildRootPath();
- Path confDir = Paths.get(rootPath);
- this.createDirectoryIfNorExist(confDir);
-
- //node path
- StringBuilder nodePath = new StringBuilder();
- nodePath
- .append(rootPath)
- .append(merchantStoreCode);
- Path merchantPath = Paths.get(nodePath.toString());
- this.createDirectoryIfNorExist(merchantPath);
-
-
-
- for(final InputContentFile inputStaticContentData:inputStaticContentDataList){
-
-
- //file path
- nodePath.append(Constants.SLASH).append( inputStaticContentData.getFileContentType()).append(Constants.SLASH);
- Path dirPath = Paths.get(nodePath.toString());
- this.createDirectoryIfNorExist(dirPath);
-
- //file creation
- nodePath.append(Constants.SLASH).append(inputStaticContentData.getFileName());
-
-
- Path path = Paths.get(nodePath.toString());
-
- Files.copy(inputStaticContentData.getFile(), path, StandardCopyOption.REPLACE_EXISTING);
-
-
- //String nodePath = this.getNodePath(merchantStoreCode, inputStaticContentData.getFileContentType());
-
- //final Node<String, Object> merchantNode = this.getNode(nodePath);
- //merchantNode.put(inputStaticContentData.getFileName(), IOUtils.toByteArray( inputStaticContentData.getFile() ));
-
-
- }
-
-
-
- LOGGER.info( "Total {} files added successfully.",inputStaticContentDataList.size() );
-
- }
- catch ( final Exception e )
- {
- LOGGER.error( "Error while saving content image", e );
- throw new ServiceException( e );
-
- }
- }
-
-
- /**
- * Method to return static data for given Merchant store based on the file name. Content data will be searched
- * in underlying Infinispan cache tree and {@link OutputStaticContentData} will be returned on finding an associated
- * file. In case of no file, null be returned.
- *
- * @param store Merchant store
- * @param contentFileName name of file being requested
- * @return {@link OutputStaticContentData}
- * @throws ServiceException
- */
- @Override
- public OutputContentFile getFile( final String merchantStoreCode, final FileContentType fileContentType, final String contentFileName )
- throws ServiceException
- {
-
-/* if ( cacheManager.getTreeCache() == null )
- {
- throw new ServiceException( "CmsStaticContentFileManagerInfinispan has a null cacheManager.getTreeCache()" );
- }
- OutputContentFile outputStaticContentData=null;
- InputStream input = null;
- try
- {
-
-
- String nodePath = this.getNodePath(merchantStoreCode, fileContentType);
-
- final Node<String, Object> merchantNode = this.getNode(nodePath);
-
-
- final byte[] fileBytes= (byte[]) merchantNode.get( contentFileName );
-
- if ( fileBytes == null )
- {
- LOGGER.warn( "file byte is null, no file found" );
- return null;
- }
-
- input=new ByteArrayInputStream( fileBytes );
-
- final ByteArrayOutputStream output = new ByteArrayOutputStream();
- IOUtils.copy( input, output );
-
- outputStaticContentData=new OutputContentFile();
- outputStaticContentData.setFile( output );
- outputStaticContentData.setMimeType( URLConnection.getFileNameMap().getContentTypeFor(contentFileName) );
- outputStaticContentData.setFileName( contentFileName );
- outputStaticContentData.setFileContentType( fileContentType );
-
- }
- catch ( final Exception e )
- {
- LOGGER.error( "Error while fetching file for {} merchant ", merchantStoreCode);
- throw new ServiceException( e );
- }
- return outputStaticContentData != null ? outputStaticContentData : null;*/
-
-
- return null;
-
- }
-
-
- @Override
- public List<OutputContentFile> getFiles(
- final String merchantStoreCode, final FileContentType staticContentType) throws ServiceException {
-
-
-/*
- if ( cacheManager.getTreeCache() == null )
- {
- throw new ServiceException( "CmsStaticContentFileManagerInfinispan has a null cacheManager.getTreeCache()" );
- }
- List<OutputContentFile> images = new ArrayList<OutputContentFile>();
- try
- {
-
- FileNameMap fileNameMap = URLConnection.getFileNameMap();
- String nodePath = this.getNodePath(merchantStoreCode, staticContentType);
-
- final Node<String, Object> merchantNode = this.getNode(nodePath);
-
- for(String key : merchantNode.getKeys()) {
-
- byte[] imageBytes = (byte[])merchantNode.get( key );
-
- OutputContentFile contentImage = new OutputContentFile();
-
- InputStream input = new ByteArrayInputStream( imageBytes );
- ByteArrayOutputStream output = new ByteArrayOutputStream();
- IOUtils.copy( input, output );
-
- String contentType = fileNameMap.getContentTypeFor( key );
-
- contentImage.setFile( output );
- contentImage.setMimeType( contentType );
- contentImage.setFileName( key );
-
- images.add( contentImage );
-
-
- }
-
-
-
- }
- catch ( final Exception e )
- {
- LOGGER.error( "Error while fetching file for {} merchant ", merchantStoreCode);
- throw new ServiceException( e );
- }
-
-
- return images;*/
-
- return null;
-
-
- }
-
-
-
- @Override
- public void removeFile( final String merchantStoreCode, final FileContentType staticContentType, final String fileName )
- throws ServiceException
- {
-
- try
- {
-
-
- StringBuilder merchantPath = new StringBuilder();
- merchantPath.append(buildRootPath())
- .append(Constants.SLASH)
- .append(merchantStoreCode)
- .append(Constants.SLASH)
- .append(staticContentType)
- .append(Constants.SLASH)
- .append(fileName);
-
- Path path = Paths.get(merchantPath.toString());
-
- Files.deleteIfExists(path);
-
-
-
- }
- catch ( final Exception e )
- {
- LOGGER.error( "Error while deleting files for {} merchant ", merchantStoreCode);
- throw new ServiceException( e );
- }
-
-
- }
-
- /**
- * Removes the data in a given merchant node
- */
- @SuppressWarnings("unchecked")
- @Override
- public void removeFiles( final String merchantStoreCode )
- throws ServiceException
- {
-
- LOGGER.debug( "Removing all images for {} merchant ",merchantStoreCode);
-
- try
- {
-
-
- StringBuilder merchantPath = new StringBuilder();
- merchantPath.append(buildRootPath())
- .append(Constants.SLASH)
- .append(merchantStoreCode);
-
- Path path = Paths.get(merchantPath.toString());
-
- Files.deleteIfExists(path);
-
-
-
-
- }
- catch ( final Exception e )
- {
- LOGGER.error( "Error while deleting content image for {} merchant ", merchantStoreCode);
- throw new ServiceException( e );
- }
-
- }
-
-
-
- /**
- * Queries the CMS to retrieve all static content files. Only the name of the file will be returned to the client
- * @param merchantStoreCode
- * @return
- * @throws ServiceException
- */
- @Override
- public List<String> getFileNames(final String merchantStoreCode, final FileContentType staticContentType)
- throws ServiceException {
-
-
-
- try
- {
-
- StringBuilder merchantPath = new StringBuilder();
- merchantPath.append(buildRootPath())
- .append(merchantStoreCode)
- .append(Constants.SLASH)
- .append(staticContentType);
-
- Path path = Paths.get(merchantPath.toString());
-
- List<String> fileNames = null;
-
- if(Files.exists(path)) {
-
- fileNames = new ArrayList<String>();
- DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path);
- for (Path dirPath : directoryStream) {
-
- String fileName = dirPath.getFileName().toString();
-
- if(staticContentType.name().equals(FileContentType.IMAGE.name())) {
- //File f = new File(fileName);
- String mimetype = URLConnection.guessContentTypeFromName(fileName);
- //String mimetype= new MimetypesFileTypeMap().getContentType(f);
- if(!StringUtils.isBlank(mimetype)) {
- String type = mimetype.split("/")[0];
- if(type.equals("image")) {
- fileNames.add(fileName);
- }
- }
- //fileNames.add(fileName);
-
- } else {
- fileNames.add(fileName);
- }
-
- }
- }
-
- return fileNames;
-
- } catch ( final Exception e ) {
- LOGGER.error( "Error while fetching file for {} merchant ", merchantStoreCode);
- throw new ServiceException( e );
- }
-
- }
-
- public void setRootName(String rootName) {
- this.rootName = rootName;
- }
-
- public String getRootName() {
- return rootName;
- }
-
- private String buildRootPath() {
- return new StringBuilder().append(getRootName()).append(Constants.SLASH).append(ROOT_CONTAINER).append(Constants.SLASH).toString();
-
- }
-
-
- private void createDirectoryIfNorExist(Path path) throws IOException {
-
- if (Files.notExists(path)) {
- Files.createDirectory(path);
- }
- }
-
-
- public LocalCacheManagerImpl getCacheManager() {
- return cacheManager;
- }
-
-
- public void setCacheManager(LocalCacheManagerImpl cacheManager) {
- this.cacheManager = cacheManager;
- }
-
-
-
-}
+/**
+ *
+ */
+package com.salesmanager.core.business.modules.cms.content.local;
+
+import java.io.IOException;
+import java.net.URLConnection;
+import java.nio.file.DirectoryStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.salesmanager.core.business.constants.Constants;
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.modules.cms.content.FileGet;
+import com.salesmanager.core.business.modules.cms.content.FilePut;
+import com.salesmanager.core.business.modules.cms.content.FileRemove;
+import com.salesmanager.core.business.modules.cms.impl.LocalCacheManagerImpl;
+import com.salesmanager.core.model.content.FileContentType;
+import com.salesmanager.core.model.content.InputContentFile;
+import com.salesmanager.core.model.content.OutputContentFile;
+
+
+
+/**
+ * Manages
+ * - Images
+ * - Files (js, pdf, css...) on a local web server
+ * @author Carl Samson
+ * @since 1.0.3
+ *
+ */
+public class CmsStaticContentFileManagerImpl implements FilePut,FileGet,FileRemove
+{
+
+ private static final Logger LOGGER = LoggerFactory.getLogger( CmsStaticContentFileManagerImpl.class );
+ private static CmsStaticContentFileManagerImpl fileManager = null;
+ private static final String ROOT_NAME="static";
+
+ private static final String ROOT_CONTAINER = "files";
+
+ private String rootName = ROOT_NAME;
+
+ private LocalCacheManagerImpl cacheManager;
+
+
+
+ public static CmsStaticContentFileManagerImpl getInstance()
+ {
+
+ if ( fileManager == null )
+ {
+ fileManager = new CmsStaticContentFileManagerImpl();
+ }
+
+ return fileManager;
+
+ }
+
+
+ /**
+ * <p>Method to add static content data for given merchant.Static content data can be of following type
+ * <pre>
+ * 1. CSS and JS files
+ * 2. Digital Data like audio or video
+ * </pre>
+ * </p>
+ * <p>
+ * Merchant store code will be used to create cache node where merchant data will be stored,input data will
+ * contain name, file as well type of data being stored.
+ * @see FileContentType
+ * </p>
+ *
+ * @param merchantStoreCode merchant store for whom data is being stored
+ * @param inputStaticContentData data object being stored
+ * @throws ServiceException
+ *
+ */
+ @Override
+ public void addFile( final String merchantStoreCode, final InputContentFile inputStaticContentData )
+ throws ServiceException
+ {
+/* if ( cacheManager.getTreeCache() == null )
+ {
+ LOGGER.error( "Unable to find cacheManager.getTreeCache() in Infinispan.." );
+ throw new ServiceException( "CmsStaticContentFileManagerInfinispanImpl has a null cacheManager.getTreeCache()" );
+ }*/
+ try
+ {
+
+
+
+ //base path
+ String rootPath = this.buildRootPath();
+ Path confDir = Paths.get(rootPath);
+ this.createDirectoryIfNorExist(confDir);
+
+ //node path
+ StringBuilder nodePath = new StringBuilder();
+ nodePath
+ .append(rootPath)
+ .append(merchantStoreCode);
+ Path merchantPath = Paths.get(nodePath.toString());
+ this.createDirectoryIfNorExist(merchantPath);
+
+ //file path
+ nodePath.append(Constants.SLASH).append( inputStaticContentData.getFileContentType()).append(Constants.SLASH);
+ Path dirPath = Paths.get(nodePath.toString());
+ this.createDirectoryIfNorExist(dirPath);
+
+ //file creation
+ nodePath.append(inputStaticContentData.getFileName());
+
+
+ Path path = Paths.get(nodePath.toString());
+
+
+ //file creation
+ //nodePath.append(Constants.SLASH).append(contentImage.getFileName());
+
+
+ //Path path = Paths.get(nodePath.toString());
+
+
+ Files.copy(inputStaticContentData.getFile(), path, StandardCopyOption.REPLACE_EXISTING);
+
+
+
+
+
+ //String nodePath = this.getNodePath(merchantStoreCode, inputStaticContentData.getFileContentType());
+
+ //final Node<String, Object> merchantNode = this.getNode(nodePath);
+
+ //merchantNode.put(inputStaticContentData.getFileName(), IOUtils.toByteArray( inputStaticContentData.getFile() ));
+
+ LOGGER.info( "Content data added successfully." );
+ }
+ catch ( final Exception e )
+ {
+ LOGGER.error( "Error while saving static content data", e );
+ throw new ServiceException( e );
+
+ }
+
+ }
+
+ /**
+ * <p>
+ * Method to add files for given store.Files will be stored in Infinispan and will be retrieved based on
+ * the storeID. Following steps will be performed to store static content files
+ * </p>
+ * <li>Merchant Node will be retrieved from the cacheTree if it exists else new node will be created.</li> <li>
+ * Files will be stored in StaticContentCacheAttribute , which eventually will be stored in Infinispan</li>
+ *
+ * @param merchantStoreCode Merchant store for which files are getting stored in Infinispan.
+ * @param inputStaticContentDataList input static content file list which will get {@link InputContentImage} stored
+ * @throws ServiceException if content file storing process fail.
+ * @see InputStaticContentData
+ * @see StaticContentCacheAttribute
+ */
+ @Override
+ public void addFiles( final String merchantStoreCode, final List<InputContentFile> inputStaticContentDataList )
+ throws ServiceException
+ {
+/* if ( cacheManager.getTreeCache() == null )
+ {
+ LOGGER.error( "Unable to find cacheManager.getTreeCache() in Infinispan.." );
+ throw new ServiceException( "CmsStaticContentFileManagerInfinispanImpl has a null cacheManager.getTreeCache()" );
+ }*/
+ try
+ {
+
+
+ //base path
+ String rootPath = this.buildRootPath();
+ Path confDir = Paths.get(rootPath);
+ this.createDirectoryIfNorExist(confDir);
+
+ //node path
+ StringBuilder nodePath = new StringBuilder();
+ nodePath
+ .append(rootPath)
+ .append(merchantStoreCode);
+ Path merchantPath = Paths.get(nodePath.toString());
+ this.createDirectoryIfNorExist(merchantPath);
+
+
+
+ for(final InputContentFile inputStaticContentData:inputStaticContentDataList){
+
+
+ //file path
+ nodePath.append(Constants.SLASH).append( inputStaticContentData.getFileContentType()).append(Constants.SLASH);
+ Path dirPath = Paths.get(nodePath.toString());
+ this.createDirectoryIfNorExist(dirPath);
+
+ //file creation
+ nodePath.append(Constants.SLASH).append(inputStaticContentData.getFileName());
+
+
+ Path path = Paths.get(nodePath.toString());
+
+ Files.copy(inputStaticContentData.getFile(), path, StandardCopyOption.REPLACE_EXISTING);
+
+
+ //String nodePath = this.getNodePath(merchantStoreCode, inputStaticContentData.getFileContentType());
+
+ //final Node<String, Object> merchantNode = this.getNode(nodePath);
+ //merchantNode.put(inputStaticContentData.getFileName(), IOUtils.toByteArray( inputStaticContentData.getFile() ));
+
+
+ }
+
+
+
+ LOGGER.info( "Total {} files added successfully.",inputStaticContentDataList.size() );
+
+ }
+ catch ( final Exception e )
+ {
+ LOGGER.error( "Error while saving content image", e );
+ throw new ServiceException( e );
+
+ }
+ }
+
+
+ /**
+ * Method to return static data for given Merchant store based on the file name. Content data will be searched
+ * in underlying Infinispan cache tree and {@link OutputStaticContentData} will be returned on finding an associated
+ * file. In case of no file, null be returned.
+ *
+ * @param store Merchant store
+ * @param contentFileName name of file being requested
+ * @return {@link OutputStaticContentData}
+ * @throws ServiceException
+ */
+ @Override
+ public OutputContentFile getFile( final String merchantStoreCode, final FileContentType fileContentType, final String contentFileName )
+ throws ServiceException
+ {
+
+/* if ( cacheManager.getTreeCache() == null )
+ {
+ throw new ServiceException( "CmsStaticContentFileManagerInfinispan has a null cacheManager.getTreeCache()" );
+ }
+ OutputContentFile outputStaticContentData=null;
+ InputStream input = null;
+ try
+ {
+
+
+ String nodePath = this.getNodePath(merchantStoreCode, fileContentType);
+
+ final Node<String, Object> merchantNode = this.getNode(nodePath);
+
+
+ final byte[] fileBytes= (byte[]) merchantNode.get( contentFileName );
+
+ if ( fileBytes == null )
+ {
+ LOGGER.warn( "file byte is null, no file found" );
+ return null;
+ }
+
+ input=new ByteArrayInputStream( fileBytes );
+
+ final ByteArrayOutputStream output = new ByteArrayOutputStream();
+ IOUtils.copy( input, output );
+
+ outputStaticContentData=new OutputContentFile();
+ outputStaticContentData.setFile( output );
+ outputStaticContentData.setMimeType( URLConnection.getFileNameMap().getContentTypeFor(contentFileName) );
+ outputStaticContentData.setFileName( contentFileName );
+ outputStaticContentData.setFileContentType( fileContentType );
+
+ }
+ catch ( final Exception e )
+ {
+ LOGGER.error( "Error while fetching file for {} merchant ", merchantStoreCode);
+ throw new ServiceException( e );
+ }
+ return outputStaticContentData != null ? outputStaticContentData : null;*/
+
+
+ return null;
+
+ }
+
+
+ @Override
+ public List<OutputContentFile> getFiles(
+ final String merchantStoreCode, final FileContentType staticContentType) throws ServiceException {
+
+
+/*
+ if ( cacheManager.getTreeCache() == null )
+ {
+ throw new ServiceException( "CmsStaticContentFileManagerInfinispan has a null cacheManager.getTreeCache()" );
+ }
+ List<OutputContentFile> images = new ArrayList<OutputContentFile>();
+ try
+ {
+
+ FileNameMap fileNameMap = URLConnection.getFileNameMap();
+ String nodePath = this.getNodePath(merchantStoreCode, staticContentType);
+
+ final Node<String, Object> merchantNode = this.getNode(nodePath);
+
+ for(String key : merchantNode.getKeys()) {
+
+ byte[] imageBytes = (byte[])merchantNode.get( key );
+
+ OutputContentFile contentImage = new OutputContentFile();
+
+ InputStream input = new ByteArrayInputStream( imageBytes );
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ IOUtils.copy( input, output );
+
+ String contentType = fileNameMap.getContentTypeFor( key );
+
+ contentImage.setFile( output );
+ contentImage.setMimeType( contentType );
+ contentImage.setFileName( key );
+
+ images.add( contentImage );
+
+
+ }
+
+
+
+ }
+ catch ( final Exception e )
+ {
+ LOGGER.error( "Error while fetching file for {} merchant ", merchantStoreCode);
+ throw new ServiceException( e );
+ }
+
+
+ return images;*/
+
+ return null;
+
+
+ }
+
+
+
+ @Override
+ public void removeFile( final String merchantStoreCode, final FileContentType staticContentType, final String fileName )
+ throws ServiceException
+ {
+
+ try
+ {
+
+
+ StringBuilder merchantPath = new StringBuilder();
+ merchantPath.append(buildRootPath())
+ .append(Constants.SLASH)
+ .append(merchantStoreCode)
+ .append(Constants.SLASH)
+ .append(staticContentType)
+ .append(Constants.SLASH)
+ .append(fileName);
+
+ Path path = Paths.get(merchantPath.toString());
+
+ Files.deleteIfExists(path);
+
+
+
+ }
+ catch ( final Exception e )
+ {
+ LOGGER.error( "Error while deleting files for {} merchant ", merchantStoreCode);
+ throw new ServiceException( e );
+ }
+
+
+ }
+
+ /**
+ * Removes the data in a given merchant node
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public void removeFiles( final String merchantStoreCode )
+ throws ServiceException
+ {
+
+ LOGGER.debug( "Removing all images for {} merchant ",merchantStoreCode);
+
+ try
+ {
+
+
+ StringBuilder merchantPath = new StringBuilder();
+ merchantPath.append(buildRootPath())
+ .append(Constants.SLASH)
+ .append(merchantStoreCode);
+
+ Path path = Paths.get(merchantPath.toString());
+
+ Files.deleteIfExists(path);
+
+
+
+
+ }
+ catch ( final Exception e )
+ {
+ LOGGER.error( "Error while deleting content image for {} merchant ", merchantStoreCode);
+ throw new ServiceException( e );
+ }
+
+ }
+
+
+
+ /**
+ * Queries the CMS to retrieve all static content files. Only the name of the file will be returned to the client
+ * @param merchantStoreCode
+ * @return
+ * @throws ServiceException
+ */
+ @Override
+ public List<String> getFileNames(final String merchantStoreCode, final FileContentType staticContentType)
+ throws ServiceException {
+
+
+
+ try
+ {
+
+ StringBuilder merchantPath = new StringBuilder();
+ merchantPath.append(buildRootPath())
+ .append(merchantStoreCode)
+ .append(Constants.SLASH)
+ .append(staticContentType);
+
+ Path path = Paths.get(merchantPath.toString());
+
+ List<String> fileNames = null;
+
+ if(Files.exists(path)) {
+
+ fileNames = new ArrayList<String>();
+ DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path);
+ for (Path dirPath : directoryStream) {
+
+ String fileName = dirPath.getFileName().toString();
+
+ if(staticContentType.name().equals(FileContentType.IMAGE.name())) {
+ //File f = new File(fileName);
+ String mimetype = URLConnection.guessContentTypeFromName(fileName);
+ //String mimetype= new MimetypesFileTypeMap().getContentType(f);
+ if(!StringUtils.isBlank(mimetype)) {
+ String type = mimetype.split("/")[0];
+ if(type.equals("image")) {
+ fileNames.add(fileName);
+ }
+ }
+ //fileNames.add(fileName);
+
+ } else {
+ fileNames.add(fileName);
+ }
+
+ }
+ }
+
+ return fileNames;
+
+ } catch ( final Exception e ) {
+ LOGGER.error( "Error while fetching file for {} merchant ", merchantStoreCode);
+ throw new ServiceException( e );
+ }
+
+ }
+
+ public void setRootName(String rootName) {
+ this.rootName = rootName;
+ }
+
+ public String getRootName() {
+ return rootName;
+ }
+
+ private String buildRootPath() {
+ return new StringBuilder().append(getRootName()).append(Constants.SLASH).append(ROOT_CONTAINER).append(Constants.SLASH).toString();
+
+ }
+
+
+ private void createDirectoryIfNorExist(Path path) throws IOException {
+
+ if (Files.notExists(path)) {
+ Files.createDirectory(path);
+ }
+ }
+
+
+ public LocalCacheManagerImpl getCacheManager() {
+ return cacheManager;
+ }
+
+
+ public void setCacheManager(LocalCacheManagerImpl cacheManager) {
+ this.cacheManager = cacheManager;
+ }
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/StaticContentFileManager.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/StaticContentFileManager.java
index 2f0a6c4..c50dd08 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/StaticContentFileManager.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/StaticContentFileManager.java
@@ -1,13 +1,13 @@
-/**
- *
- */
-package com.salesmanager.core.business.modules.cms.content;
-
-/**
- * @author Umesh Awasthi
- *
- */
-public abstract class StaticContentFileManager implements FileGet,FilePut,FileRemove
-{
-
-}
+/**
+ *
+ */
+package com.salesmanager.core.business.modules.cms.content;
+
+/**
+ * @author Umesh Awasthi
+ *
+ */
+public abstract class StaticContentFileManager implements FileGet,FilePut,FileRemove
+{
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/StaticContentFileManagerImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/StaticContentFileManagerImpl.java
index bd09f4c..4385d96 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/StaticContentFileManagerImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/content/StaticContentFileManagerImpl.java
@@ -1,111 +1,111 @@
-/**
- *
- */
-package com.salesmanager.core.business.modules.cms.content;
-
-import java.util.List;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.modules.cms.content.infinispan.CmsStaticContentFileManagerImpl;
-import com.salesmanager.core.model.content.FileContentType;
-import com.salesmanager.core.model.content.InputContentFile;
-import com.salesmanager.core.model.content.OutputContentFile;
-
-
-/**
- * @author Umesh Awasthi
- *
- */
-public class StaticContentFileManagerImpl extends StaticContentFileManager
-{
-
- private FilePut uploadFile;
- private FileGet getFile;
- private FileRemove removeFile;
-
-
-
- @Override
- public void addFile( final String merchantStoreCode, final InputContentFile inputStaticContentData )
- throws ServiceException
- {
- uploadFile.addFile( merchantStoreCode, inputStaticContentData );
-
- }
-
- /**
- * Implementation for add static data files. This method will called respected add files method of underlying
- * CMSStaticContentManager. For CMS Content files {@link CmsStaticContentFileManagerImpl} will take care of adding
- * given content images with Infinispan cache.
- *
- * @param merchantStoreCode merchant store.
- * @param inputStaticContentDataList Input content images
- * @throws ServiceException
- */
- @Override
- public void addFiles( final String merchantStoreCode, final List<InputContentFile> inputStaticContentDataList )
- throws ServiceException
- {
- uploadFile.addFiles( merchantStoreCode, inputStaticContentDataList );
- }
- @Override
- public void removeFile( final String merchantStoreCode, final FileContentType staticContentType, final String fileName)
- throws ServiceException
- {
- removeFile.removeFile(merchantStoreCode, staticContentType, fileName);
-
- }
-
-
- @Override
- public OutputContentFile getFile(String merchantStoreCode,
- FileContentType fileContentType, String contentName)
- throws ServiceException {
- return getFile.getFile(merchantStoreCode, fileContentType, contentName);
- }
-
- @Override
- public List<String> getFileNames(String merchantStoreCode,
- FileContentType fileContentType) throws ServiceException {
- return getFile.getFileNames(merchantStoreCode, fileContentType);
- }
-
- @Override
- public List<OutputContentFile> getFiles(String merchantStoreCode,
- FileContentType fileContentType) throws ServiceException {
- return getFile.getFiles(merchantStoreCode, fileContentType);
- }
-
- @Override
- public void removeFiles(String merchantStoreCode) throws ServiceException {
- removeFile.removeFiles(merchantStoreCode);
- }
-
-
-
- public void setRemoveFile(FileRemove removeFile) {
- this.removeFile = removeFile;
- }
-
- public FileRemove getRemoveFile() {
- return removeFile;
- }
-
- public void setGetFile(FileGet getFile) {
- this.getFile = getFile;
- }
-
- public FileGet getGetFile() {
- return getFile;
- }
-
- public void setUploadFile(FilePut uploadFile) {
- this.uploadFile = uploadFile;
- }
-
- public FilePut getUploadFile() {
- return uploadFile;
- }
-
-
-}
+/**
+ *
+ */
+package com.salesmanager.core.business.modules.cms.content;
+
+import java.util.List;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.modules.cms.content.infinispan.CmsStaticContentFileManagerImpl;
+import com.salesmanager.core.model.content.FileContentType;
+import com.salesmanager.core.model.content.InputContentFile;
+import com.salesmanager.core.model.content.OutputContentFile;
+
+
+/**
+ * @author Umesh Awasthi
+ *
+ */
+public class StaticContentFileManagerImpl extends StaticContentFileManager
+{
+
+ private FilePut uploadFile;
+ private FileGet getFile;
+ private FileRemove removeFile;
+
+
+
+ @Override
+ public void addFile( final String merchantStoreCode, final InputContentFile inputStaticContentData )
+ throws ServiceException
+ {
+ uploadFile.addFile( merchantStoreCode, inputStaticContentData );
+
+ }
+
+ /**
+ * Implementation for add static data files. This method will called respected add files method of underlying
+ * CMSStaticContentManager. For CMS Content files {@link CmsStaticContentFileManagerImpl} will take care of adding
+ * given content images with Infinispan cache.
+ *
+ * @param merchantStoreCode merchant store.
+ * @param inputStaticContentDataList Input content images
+ * @throws ServiceException
+ */
+ @Override
+ public void addFiles( final String merchantStoreCode, final List<InputContentFile> inputStaticContentDataList )
+ throws ServiceException
+ {
+ uploadFile.addFiles( merchantStoreCode, inputStaticContentDataList );
+ }
+ @Override
+ public void removeFile( final String merchantStoreCode, final FileContentType staticContentType, final String fileName)
+ throws ServiceException
+ {
+ removeFile.removeFile(merchantStoreCode, staticContentType, fileName);
+
+ }
+
+
+ @Override
+ public OutputContentFile getFile(String merchantStoreCode,
+ FileContentType fileContentType, String contentName)
+ throws ServiceException {
+ return getFile.getFile(merchantStoreCode, fileContentType, contentName);
+ }
+
+ @Override
+ public List<String> getFileNames(String merchantStoreCode,
+ FileContentType fileContentType) throws ServiceException {
+ return getFile.getFileNames(merchantStoreCode, fileContentType);
+ }
+
+ @Override
+ public List<OutputContentFile> getFiles(String merchantStoreCode,
+ FileContentType fileContentType) throws ServiceException {
+ return getFile.getFiles(merchantStoreCode, fileContentType);
+ }
+
+ @Override
+ public void removeFiles(String merchantStoreCode) throws ServiceException {
+ removeFile.removeFiles(merchantStoreCode);
+ }
+
+
+
+ public void setRemoveFile(FileRemove removeFile) {
+ this.removeFile = removeFile;
+ }
+
+ public FileRemove getRemoveFile() {
+ return removeFile;
+ }
+
+ public void setGetFile(FileGet getFile) {
+ this.getFile = getFile;
+ }
+
+ public FileGet getGetFile() {
+ return getFile;
+ }
+
+ public void setUploadFile(FilePut uploadFile) {
+ this.uploadFile = uploadFile;
+ }
+
+ public FilePut getUploadFile() {
+ return uploadFile;
+ }
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/CacheManager.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/CacheManager.java
index 67679ed..c214c6c 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/CacheManager.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/CacheManager.java
@@ -1,13 +1,13 @@
-package com.salesmanager.core.business.modules.cms.impl;
-
-import org.infinispan.manager.EmbeddedCacheManager;
-import org.infinispan.tree.TreeCache;
-
-public interface CacheManager {
-
- public EmbeddedCacheManager getManager();
-
- @SuppressWarnings("rawtypes")
- public TreeCache getTreeCache();
-
-}
+package com.salesmanager.core.business.modules.cms.impl;
+
+import org.infinispan.manager.EmbeddedCacheManager;
+import org.infinispan.tree.TreeCache;
+
+public interface CacheManager {
+
+ public EmbeddedCacheManager getManager();
+
+ @SuppressWarnings("rawtypes")
+ public TreeCache getTreeCache();
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/CacheManagerImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/CacheManagerImpl.java
index c617e63..4fc2489 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/CacheManagerImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/CacheManagerImpl.java
@@ -1,65 +1,65 @@
-package com.salesmanager.core.business.modules.cms.impl;
-
-import org.infinispan.Cache;
-import org.infinispan.manager.EmbeddedCacheManager;
-import org.infinispan.tree.TreeCache;
-import org.infinispan.tree.TreeCacheFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public abstract class CacheManagerImpl implements CacheManager {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(CacheManagerImpl.class);
-
- @SuppressWarnings("rawtypes")
- private TreeCache treeCache = null;
-
- @SuppressWarnings("unchecked")
- protected void init(String namedCache) {
-
-
- try {
-
-
- //manager = new DefaultCacheManager(repositoryFileName);
-
- VendorCacheManager cacheManager = VendorCacheManager.getInstance();
-
- @SuppressWarnings("rawtypes")
- Cache cache = cacheManager.getManager().getCache(namedCache);
- cache.getCacheConfiguration().invocationBatching().enabled();
-
- TreeCacheFactory f = new TreeCacheFactory();
-
- treeCache = f.createTreeCache(cache);
-
- cache.start();
-
- LOGGER.debug("CMS started");
-
-
-
- } catch (Exception e) {
- LOGGER.error("Error while instantiating CmsImageFileManager",e);
- } finally {
-
- }
-
-
-
-
-
- }
-
- public EmbeddedCacheManager getManager() {
- return VendorCacheManager.getInstance().getManager();
- }
-
- @SuppressWarnings("rawtypes")
- public TreeCache getTreeCache() {
- return treeCache;
- }
-
-
-
-}
+package com.salesmanager.core.business.modules.cms.impl;
+
+import org.infinispan.Cache;
+import org.infinispan.manager.EmbeddedCacheManager;
+import org.infinispan.tree.TreeCache;
+import org.infinispan.tree.TreeCacheFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class CacheManagerImpl implements CacheManager {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(CacheManagerImpl.class);
+
+ @SuppressWarnings("rawtypes")
+ private TreeCache treeCache = null;
+
+ @SuppressWarnings("unchecked")
+ protected void init(String namedCache) {
+
+
+ try {
+
+
+ //manager = new DefaultCacheManager(repositoryFileName);
+
+ VendorCacheManager cacheManager = VendorCacheManager.getInstance();
+
+ @SuppressWarnings("rawtypes")
+ Cache cache = cacheManager.getManager().getCache(namedCache);
+ cache.getCacheConfiguration().invocationBatching().enabled();
+
+ TreeCacheFactory f = new TreeCacheFactory();
+
+ treeCache = f.createTreeCache(cache);
+
+ cache.start();
+
+ LOGGER.debug("CMS started");
+
+
+
+ } catch (Exception e) {
+ LOGGER.error("Error while instantiating CmsImageFileManager",e);
+ } finally {
+
+ }
+
+
+
+
+
+ }
+
+ public EmbeddedCacheManager getManager() {
+ return VendorCacheManager.getInstance().getManager();
+ }
+
+ @SuppressWarnings("rawtypes")
+ public TreeCache getTreeCache() {
+ return treeCache;
+ }
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/LocalCacheManagerImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/LocalCacheManagerImpl.java
index 37877c4..dca85f3 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/LocalCacheManagerImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/LocalCacheManagerImpl.java
@@ -1,19 +1,19 @@
-package com.salesmanager.core.business.modules.cms.impl;
-
-
-public class LocalCacheManagerImpl {
-
- private static LocalCacheManagerImpl cacheManager = null;
- public static LocalCacheManagerImpl getInstance() {
-
- if(cacheManager==null) {
- cacheManager = new LocalCacheManagerImpl();
- }
-
- return cacheManager;
-
-
- }
-
-
-}
+package com.salesmanager.core.business.modules.cms.impl;
+
+
+public class LocalCacheManagerImpl {
+
+ private static LocalCacheManagerImpl cacheManager = null;
+ public static LocalCacheManagerImpl getInstance() {
+
+ if(cacheManager==null) {
+ cacheManager = new LocalCacheManagerImpl();
+ }
+
+ return cacheManager;
+
+
+ }
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/StaticContentCacheManagerImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/StaticContentCacheManagerImpl.java
index db91515..732be46 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/StaticContentCacheManagerImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/StaticContentCacheManagerImpl.java
@@ -1,42 +1,42 @@
-/**
- *
- */
-package com.salesmanager.core.business.modules.cms.impl;
-
-/**
- * Cache manager to handle static content data in Infinispan cache.
- * static content data can be of following type
- * <pre>
- * 1. CSS files.
- * 2. JS Files.
- * 3. Digital Data.
- * </pre>
- * @author Umesh Awasthi
- * @version 1.2
- *
- *
- */
-public class StaticContentCacheManagerImpl extends CacheManagerImpl
-{
- private static StaticContentCacheManagerImpl cacheManager = null;
- private final static String NAMED_CACHE = "FilesRepository";
-
-
- private StaticContentCacheManagerImpl() {
-
- super.init(NAMED_CACHE);
-
-
- }
-
- public static StaticContentCacheManagerImpl getInstance() {
-
- if(cacheManager==null) {
- cacheManager = new StaticContentCacheManagerImpl();
- }
-
- return cacheManager;
-
-
- }
-}
+/**
+ *
+ */
+package com.salesmanager.core.business.modules.cms.impl;
+
+/**
+ * Cache manager to handle static content data in Infinispan cache.
+ * static content data can be of following type
+ * <pre>
+ * 1. CSS files.
+ * 2. JS Files.
+ * 3. Digital Data.
+ * </pre>
+ * @author Umesh Awasthi
+ * @version 1.2
+ *
+ *
+ */
+public class StaticContentCacheManagerImpl extends CacheManagerImpl
+{
+ private static StaticContentCacheManagerImpl cacheManager = null;
+ private final static String NAMED_CACHE = "FilesRepository";
+
+
+ private StaticContentCacheManagerImpl() {
+
+ super.init(NAMED_CACHE);
+
+
+ }
+
+ public static StaticContentCacheManagerImpl getInstance() {
+
+ if(cacheManager==null) {
+ cacheManager = new StaticContentCacheManagerImpl();
+ }
+
+ return cacheManager;
+
+
+ }
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/StoreCacheManagerImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/StoreCacheManagerImpl.java
index d9b730d..b2e43b0 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/StoreCacheManagerImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/StoreCacheManagerImpl.java
@@ -1,42 +1,42 @@
-package com.salesmanager.core.business.modules.cms.impl;
-
-
-
-/**
- * Used for managing images
- * @author casams1
- *
- */
-public class StoreCacheManagerImpl extends CacheManagerImpl {
-
-
- private static StoreCacheManagerImpl cacheManager = null;
- private final static String NAMED_CACHE = "StoreRepository";
-
-
-
-
- private StoreCacheManagerImpl() {
-
- super.init(NAMED_CACHE);
-
-
- }
-
-
- public static StoreCacheManagerImpl getInstance() {
-
- if(cacheManager==null) {
- cacheManager = new StoreCacheManagerImpl();
-
- }
-
- return cacheManager;
-
-
- }
-
-
-
-}
-
+package com.salesmanager.core.business.modules.cms.impl;
+
+
+
+/**
+ * Used for managing images
+ * @author casams1
+ *
+ */
+public class StoreCacheManagerImpl extends CacheManagerImpl {
+
+
+ private static StoreCacheManagerImpl cacheManager = null;
+ private final static String NAMED_CACHE = "StoreRepository";
+
+
+
+
+ private StoreCacheManagerImpl() {
+
+ super.init(NAMED_CACHE);
+
+
+ }
+
+
+ public static StoreCacheManagerImpl getInstance() {
+
+ if(cacheManager==null) {
+ cacheManager = new StoreCacheManagerImpl();
+
+ }
+
+ return cacheManager;
+
+
+ }
+
+
+
+}
+
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/VendorCacheManager.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/VendorCacheManager.java
index 9e28563..b0cd687 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/VendorCacheManager.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/impl/VendorCacheManager.java
@@ -1,41 +1,41 @@
-package com.salesmanager.core.business.modules.cms.impl;
-
-import org.infinispan.manager.DefaultCacheManager;
-import org.infinispan.manager.EmbeddedCacheManager;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class VendorCacheManager {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(VendorCacheManager.class);
- private EmbeddedCacheManager manager = null;
- private static VendorCacheManager vendorCacheManager = null;
- private String repositoryFileName = "cms/infinispan_configuration.xml";
-
-
-
- private VendorCacheManager(){
-
- try {
- manager = new DefaultCacheManager(repositoryFileName);
- } catch (Exception e) {
- LOGGER.error("Cannot start manager " + e.toString());
- }
-
- }
-
-
- public static VendorCacheManager getInstance() {
- if(vendorCacheManager==null) {
- vendorCacheManager = new VendorCacheManager();
-
- }
- return vendorCacheManager;
- }
-
-
- public EmbeddedCacheManager getManager() {
- return manager;
- }
-
-}
+package com.salesmanager.core.business.modules.cms.impl;
+
+import org.infinispan.manager.DefaultCacheManager;
+import org.infinispan.manager.EmbeddedCacheManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class VendorCacheManager {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(VendorCacheManager.class);
+ private EmbeddedCacheManager manager = null;
+ private static VendorCacheManager vendorCacheManager = null;
+ private String repositoryFileName = "cms/infinispan_configuration.xml";
+
+
+
+ private VendorCacheManager(){
+
+ try {
+ manager = new DefaultCacheManager(repositoryFileName);
+ } catch (Exception e) {
+ LOGGER.error("Cannot start manager " + e.toString());
+ }
+
+ }
+
+
+ public static VendorCacheManager getInstance() {
+ if(vendorCacheManager==null) {
+ vendorCacheManager = new VendorCacheManager();
+
+ }
+ return vendorCacheManager;
+ }
+
+
+ public EmbeddedCacheManager getManager() {
+ return manager;
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/infinispan/CmsImageFileManagerImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/infinispan/CmsImageFileManagerImpl.java
index 3d62e42..46ae282 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/infinispan/CmsImageFileManagerImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/infinispan/CmsImageFileManagerImpl.java
@@ -1,523 +1,523 @@
-package com.salesmanager.core.business.modules.cms.product.infinispan;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.net.FileNameMap;
-import java.net.URLConnection;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.commons.io.IOUtils;
-import org.infinispan.tree.Fqn;
-import org.infinispan.tree.Node;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.salesmanager.core.business.constants.Constants;
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.modules.cms.impl.CacheManager;
-import com.salesmanager.core.business.modules.cms.product.ProductImageGet;
-import com.salesmanager.core.business.modules.cms.product.ProductImagePut;
-import com.salesmanager.core.business.modules.cms.product.ProductImageRemove;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.file.ProductImageSize;
-import com.salesmanager.core.model.catalog.product.image.ProductImage;
-import com.salesmanager.core.model.content.FileContentType;
-import com.salesmanager.core.model.content.ImageContentFile;
-import com.salesmanager.core.model.content.OutputContentFile;
-import com.salesmanager.core.model.merchant.MerchantStore;
-
-/**
- * Manager for storing in retrieving image files from the CMS This is a layer on top of Infinispan
- * https://docs.jboss.org/author/display/ISPN/Tree+API+Module
- *
- * Manages
- * - Product images
- * @author Carl Samson
- */
-public class CmsImageFileManagerImpl
- implements ProductImagePut, ProductImageGet, ProductImageRemove
-{
-
- private static final Logger LOGGER = LoggerFactory.getLogger( CmsImageFileManagerImpl.class );
-
- private static CmsImageFileManagerImpl fileManager = null;
-
- private final static String ROOT_NAME = "product-merchant";
-
- private final static String SMALL = "SMALL";
- private final static String LARGE = "LARGE";
-
- private String rootName = ROOT_NAME;
-
- private CacheManager cacheManager;
-
- /**
- * Requires to stop the engine when image servlet un-deploys
- */
- public void stopFileManager()
- {
-
- try
- {
- cacheManager.getManager().stop();
- LOGGER.info( "Stopping CMS" );
- }
- catch ( Exception e )
- {
- LOGGER.error( "Error while stopping CmsImageFileManager", e );
- }
- }
-
- public static CmsImageFileManagerImpl getInstance()
- {
-
- if ( fileManager == null )
- {
- fileManager = new CmsImageFileManagerImpl();
- }
-
- return fileManager;
-
- }
-
- private CmsImageFileManagerImpl()
- {
-
- }
-
- /**
- * root -productFiles -merchant-id PRODUCT-ID(key) -> CacheAttribute(value) - image 1 - image 2 - image 3
- */
-
- @Override
- public void addProductImage( ProductImage productImage,
- ImageContentFile contentImage )
- throws ServiceException
- {
-
- if ( cacheManager.getTreeCache() == null )
- {
- throw new ServiceException( "CmsImageFileManagerInfinispan has a null cacheManager.getTreeCache()" );
- }
-
- try
- {
-
- // node
- StringBuilder nodePath = new StringBuilder();
- nodePath.append(productImage.getProduct().getMerchantStore().getCode()).append(Constants.SLASH).append(productImage.getProduct().getSku()).append(Constants.SLASH);
-
-
- if(contentImage.getFileContentType().name().equals(FileContentType.PRODUCT.name())) {
- nodePath.append(SMALL);
- } else if(contentImage.getFileContentType().name().equals(FileContentType.PRODUCTLG.name())) {
- nodePath.append(LARGE);
- }
-
- Node<String, Object> productNode = this.getNode(nodePath.toString());
-
-
- InputStream isFile = contentImage.getFile();
-
- ByteArrayOutputStream output = new ByteArrayOutputStream();
- IOUtils.copy( isFile, output );
-
-
- // object for a given product containing all images
- productNode.put(contentImage.getFileName(), output.toByteArray());
-
-
-
- }
- catch ( Exception e )
- {
-
- throw new ServiceException( e );
-
- }
-
- }
-
- @Override
- public OutputContentFile getProductImage( ProductImage productImage )
- throws ServiceException
- {
-
- return getProductImage(productImage.getProduct().getMerchantStore().getCode(),productImage.getProduct().getSku(),productImage.getProductImage());
-
- }
-
-
- public List<OutputContentFile> getImages( MerchantStore store, FileContentType imageContentType )
- throws ServiceException
- {
-
- return getImages(store.getCode(),imageContentType);
-
- }
-
- @Override
- public List<OutputContentFile> getImages( Product product )
- throws ServiceException
- {
-
- if ( cacheManager.getTreeCache() == null )
- {
- throw new ServiceException( "CmsImageFileManagerInfinispan has a null cacheManager.getTreeCache()" );
- }
-
- List<OutputContentFile> images = new ArrayList<OutputContentFile>();
-
-
- try
- {
-
-
- FileNameMap fileNameMap = URLConnection.getFileNameMap();
- StringBuilder nodePath = new StringBuilder();
- nodePath.append(product.getMerchantStore().getCode());
-
- Node<String, Object> merchantNode = this.getNode(nodePath.toString());
-
- if ( merchantNode == null )
- {
- return null;
- }
-
-
- for(String key : merchantNode.getKeys()) {
-
- byte[] imageBytes = (byte[])merchantNode.get( key );
-
- OutputContentFile contentImage = new OutputContentFile();
-
- InputStream input = new ByteArrayInputStream( imageBytes );
- ByteArrayOutputStream output = new ByteArrayOutputStream();
- IOUtils.copy( input, output );
-
- String contentType = fileNameMap.getContentTypeFor( key );
-
- contentImage.setFile( output );
- contentImage.setMimeType( contentType );
- contentImage.setFileName( key );
-
- images.add( contentImage );
-
-
- }
-
-
- }
-
- catch ( Exception e )
- {
- throw new ServiceException( e );
- }
- finally
- {
-
- }
-
- return images;
- }
-
-
-
- @SuppressWarnings("unchecked")
- @Override
- public void removeImages( final String merchantStoreCode )
- throws ServiceException
- {
- if ( cacheManager.getTreeCache() == null )
- {
- throw new ServiceException( "CmsImageFileManagerInfinispan has a null cacheManager.getTreeCache()" );
- }
-
- try
- {
-
-
- final StringBuilder merchantPath = new StringBuilder();
- merchantPath.append( getRootName()).append(merchantStoreCode );
- cacheManager.getTreeCache().getRoot().remove(merchantPath.toString());
-
-
-
- }
- catch ( Exception e )
- {
- throw new ServiceException( e );
- }
- finally
- {
-
- }
-
- }
-
-
- @Override
- public void removeProductImage( ProductImage productImage )
- throws ServiceException
- {
-
- if ( cacheManager.getTreeCache() == null )
- {
- throw new ServiceException( "CmsImageFileManagerInfinispan has a null cacheManager.getTreeCache()" );
- }
-
- try
- {
-
-
- StringBuilder nodePath = new StringBuilder();
- nodePath.append(productImage.getProduct().getMerchantStore().getCode()).append(Constants.SLASH).append(productImage.getProduct().getSku());
-
-
- Node<String, Object> productNode = this.getNode(nodePath.toString());
- productNode.remove(productImage.getProductImage());
-
-
-
-
-
- }
- catch ( Exception e )
- {
- throw new ServiceException( e );
- }
- finally
- {
-
- }
-
- }
-
- @Override
- public void removeProductImages( Product product )
- throws ServiceException
- {
-
- if ( cacheManager.getTreeCache() == null )
- {
- throw new ServiceException( "CmsImageFileManagerInfinispan has a null cacheManager.getTreeCache()" );
- }
-
- try
- {
-
-
- StringBuilder nodePath = new StringBuilder();
- nodePath.append(product.getMerchantStore().getCode());
-
-
- Node<String, Object> merchantNode = this.getNode(nodePath.toString());
-
- merchantNode.remove(product.getSku());
-
-
-
-
- }
- catch ( Exception e )
- {
- throw new ServiceException( e );
- }
- finally
- {
-
- }
-
- }
-
-
- @Override
- public List<OutputContentFile> getImages(final String merchantStoreCode,
- FileContentType imageContentType) throws ServiceException {
- if ( cacheManager.getTreeCache() == null )
- {
- throw new ServiceException( "CmsImageFileManagerInfinispan has a null cacheManager.getTreeCache()" );
- }
- List<OutputContentFile> images = new ArrayList<OutputContentFile>();
- FileNameMap fileNameMap = URLConnection.getFileNameMap();
-
- try
- {
-
-
- StringBuilder nodePath = new StringBuilder();
- nodePath.append(merchantStoreCode);
-
-
- Node<String, Object> merchantNode = this.getNode(nodePath.toString());
-
- Set<Node<String,Object>> childs = merchantNode.getChildren();
-
- Iterator<Node<String,Object>> iterator = childs.iterator();
- //TODO image sizes
- while(iterator.hasNext()) {
-
- Node<String,Object> node = iterator.next();
-
- for(String key : node.getKeys()) {
-
-
- byte[] imageBytes = (byte[])merchantNode.get( key );
-
- OutputContentFile contentImage = new OutputContentFile();
-
- InputStream input = new ByteArrayInputStream( imageBytes );
- ByteArrayOutputStream output = new ByteArrayOutputStream();
- IOUtils.copy( input, output );
-
- String contentType = fileNameMap.getContentTypeFor( key );
-
- contentImage.setFile( output );
- contentImage.setMimeType( contentType );
- contentImage.setFileName( key );
-
- images.add( contentImage );
-
-
- }
-
- }
-
-
-
-
- }
- catch ( Exception e )
- {
- throw new ServiceException( e );
- }
- finally
- {
-
- }
-
- return images;
- }
-
- @Override
- public OutputContentFile getProductImage(String merchantStoreCode,
- String productCode, String imageName) throws ServiceException {
- return getProductImage(merchantStoreCode, productCode, imageName, ProductImageSize.SMALL.name());
- }
-
- @Override
- public OutputContentFile getProductImage(String merchantStoreCode,
- String productCode, String imageName, ProductImageSize size)
- throws ServiceException {
- return getProductImage(merchantStoreCode, productCode, imageName, size.name());
- }
-
- private OutputContentFile getProductImage(String merchantStoreCode,
- String productCode, String imageName, String size) throws ServiceException {
-
- if ( cacheManager.getTreeCache() == null )
- {
- throw new ServiceException( "CmsImageFileManagerInfinispan has a null cacheManager.getTreeCache()" );
- }
- InputStream input = null;
- OutputContentFile contentImage = new OutputContentFile();
- try
- {
-
- FileNameMap fileNameMap = URLConnection.getFileNameMap();
-
- //SMALL by default
- StringBuilder nodePath = new StringBuilder();
- nodePath.append(merchantStoreCode).append(Constants.SLASH).append(productCode).append(Constants.SLASH).append(size);
-
- Node<String,Object> productNode = this.getNode(nodePath.toString());
-
-
- byte[] imageBytes = (byte[])productNode.get( imageName );
-
- if(imageBytes==null) {
- LOGGER.warn("Image " + imageName + " does not exist");
- return null;//no post processing will occur
- }
-
- input = new ByteArrayInputStream( imageBytes );
- ByteArrayOutputStream output = new ByteArrayOutputStream();
- IOUtils.copy( input, output );
-
- String contentType = fileNameMap.getContentTypeFor( imageName );
-
- contentImage.setFile( output );
- contentImage.setMimeType( contentType );
- contentImage.setFileName( imageName );
-
-
-
- }
- catch ( Exception e )
- {
- throw new ServiceException( e );
- }
- finally
- {
- if ( input != null )
- {
- try
- {
- input.close();
- }
- catch ( Exception ignore )
- {
- }
- }
- }
-
- return contentImage;
-
- }
-
-
- @SuppressWarnings("unchecked")
- private Node<String, Object> getNode( final String node )
- {
- LOGGER.debug( "Fetching node for store {} from Infinispan", node );
- final StringBuilder merchantPath = new StringBuilder();
- merchantPath.append( getRootName() ).append(node);
-
- Fqn contentFilesFqn = Fqn.fromString(merchantPath.toString());
-
- Node<String,Object> nd = cacheManager.getTreeCache().getRoot().getChild(contentFilesFqn);
-
- if(nd==null) {
-
- cacheManager.getTreeCache().getRoot().addChild(contentFilesFqn);
- nd = cacheManager.getTreeCache().getRoot().getChild(contentFilesFqn);
-
- }
-
- return nd;
-
- }
-
- public CacheManager getCacheManager() {
- return cacheManager;
- }
-
- public void setCacheManager(CacheManager cacheManager) {
- this.cacheManager = cacheManager;
- }
-
- public void setRootName(String rootName) {
- this.rootName = rootName;
- }
-
- public String getRootName() {
- return rootName;
- }
-
-
-
-}
+package com.salesmanager.core.business.modules.cms.product.infinispan;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.net.FileNameMap;
+import java.net.URLConnection;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.io.IOUtils;
+import org.infinispan.tree.Fqn;
+import org.infinispan.tree.Node;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.salesmanager.core.business.constants.Constants;
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.modules.cms.impl.CacheManager;
+import com.salesmanager.core.business.modules.cms.product.ProductImageGet;
+import com.salesmanager.core.business.modules.cms.product.ProductImagePut;
+import com.salesmanager.core.business.modules.cms.product.ProductImageRemove;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.file.ProductImageSize;
+import com.salesmanager.core.model.catalog.product.image.ProductImage;
+import com.salesmanager.core.model.content.FileContentType;
+import com.salesmanager.core.model.content.ImageContentFile;
+import com.salesmanager.core.model.content.OutputContentFile;
+import com.salesmanager.core.model.merchant.MerchantStore;
+
+/**
+ * Manager for storing in retrieving image files from the CMS This is a layer on top of Infinispan
+ * https://docs.jboss.org/author/display/ISPN/Tree+API+Module
+ *
+ * Manages
+ * - Product images
+ * @author Carl Samson
+ */
+public class CmsImageFileManagerImpl
+ implements ProductImagePut, ProductImageGet, ProductImageRemove
+{
+
+ private static final Logger LOGGER = LoggerFactory.getLogger( CmsImageFileManagerImpl.class );
+
+ private static CmsImageFileManagerImpl fileManager = null;
+
+ private final static String ROOT_NAME = "product-merchant";
+
+ private final static String SMALL = "SMALL";
+ private final static String LARGE = "LARGE";
+
+ private String rootName = ROOT_NAME;
+
+ private CacheManager cacheManager;
+
+ /**
+ * Requires to stop the engine when image servlet un-deploys
+ */
+ public void stopFileManager()
+ {
+
+ try
+ {
+ cacheManager.getManager().stop();
+ LOGGER.info( "Stopping CMS" );
+ }
+ catch ( Exception e )
+ {
+ LOGGER.error( "Error while stopping CmsImageFileManager", e );
+ }
+ }
+
+ public static CmsImageFileManagerImpl getInstance()
+ {
+
+ if ( fileManager == null )
+ {
+ fileManager = new CmsImageFileManagerImpl();
+ }
+
+ return fileManager;
+
+ }
+
+ private CmsImageFileManagerImpl()
+ {
+
+ }
+
+ /**
+ * root -productFiles -merchant-id PRODUCT-ID(key) -> CacheAttribute(value) - image 1 - image 2 - image 3
+ */
+
+ @Override
+ public void addProductImage( ProductImage productImage,
+ ImageContentFile contentImage )
+ throws ServiceException
+ {
+
+ if ( cacheManager.getTreeCache() == null )
+ {
+ throw new ServiceException( "CmsImageFileManagerInfinispan has a null cacheManager.getTreeCache()" );
+ }
+
+ try
+ {
+
+ // node
+ StringBuilder nodePath = new StringBuilder();
+ nodePath.append(productImage.getProduct().getMerchantStore().getCode()).append(Constants.SLASH).append(productImage.getProduct().getSku()).append(Constants.SLASH);
+
+
+ if(contentImage.getFileContentType().name().equals(FileContentType.PRODUCT.name())) {
+ nodePath.append(SMALL);
+ } else if(contentImage.getFileContentType().name().equals(FileContentType.PRODUCTLG.name())) {
+ nodePath.append(LARGE);
+ }
+
+ Node<String, Object> productNode = this.getNode(nodePath.toString());
+
+
+ InputStream isFile = contentImage.getFile();
+
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ IOUtils.copy( isFile, output );
+
+
+ // object for a given product containing all images
+ productNode.put(contentImage.getFileName(), output.toByteArray());
+
+
+
+ }
+ catch ( Exception e )
+ {
+
+ throw new ServiceException( e );
+
+ }
+
+ }
+
+ @Override
+ public OutputContentFile getProductImage( ProductImage productImage )
+ throws ServiceException
+ {
+
+ return getProductImage(productImage.getProduct().getMerchantStore().getCode(),productImage.getProduct().getSku(),productImage.getProductImage());
+
+ }
+
+
+ public List<OutputContentFile> getImages( MerchantStore store, FileContentType imageContentType )
+ throws ServiceException
+ {
+
+ return getImages(store.getCode(),imageContentType);
+
+ }
+
+ @Override
+ public List<OutputContentFile> getImages( Product product )
+ throws ServiceException
+ {
+
+ if ( cacheManager.getTreeCache() == null )
+ {
+ throw new ServiceException( "CmsImageFileManagerInfinispan has a null cacheManager.getTreeCache()" );
+ }
+
+ List<OutputContentFile> images = new ArrayList<OutputContentFile>();
+
+
+ try
+ {
+
+
+ FileNameMap fileNameMap = URLConnection.getFileNameMap();
+ StringBuilder nodePath = new StringBuilder();
+ nodePath.append(product.getMerchantStore().getCode());
+
+ Node<String, Object> merchantNode = this.getNode(nodePath.toString());
+
+ if ( merchantNode == null )
+ {
+ return null;
+ }
+
+
+ for(String key : merchantNode.getKeys()) {
+
+ byte[] imageBytes = (byte[])merchantNode.get( key );
+
+ OutputContentFile contentImage = new OutputContentFile();
+
+ InputStream input = new ByteArrayInputStream( imageBytes );
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ IOUtils.copy( input, output );
+
+ String contentType = fileNameMap.getContentTypeFor( key );
+
+ contentImage.setFile( output );
+ contentImage.setMimeType( contentType );
+ contentImage.setFileName( key );
+
+ images.add( contentImage );
+
+
+ }
+
+
+ }
+
+ catch ( Exception e )
+ {
+ throw new ServiceException( e );
+ }
+ finally
+ {
+
+ }
+
+ return images;
+ }
+
+
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void removeImages( final String merchantStoreCode )
+ throws ServiceException
+ {
+ if ( cacheManager.getTreeCache() == null )
+ {
+ throw new ServiceException( "CmsImageFileManagerInfinispan has a null cacheManager.getTreeCache()" );
+ }
+
+ try
+ {
+
+
+ final StringBuilder merchantPath = new StringBuilder();
+ merchantPath.append( getRootName()).append(merchantStoreCode );
+ cacheManager.getTreeCache().getRoot().remove(merchantPath.toString());
+
+
+
+ }
+ catch ( Exception e )
+ {
+ throw new ServiceException( e );
+ }
+ finally
+ {
+
+ }
+
+ }
+
+
+ @Override
+ public void removeProductImage( ProductImage productImage )
+ throws ServiceException
+ {
+
+ if ( cacheManager.getTreeCache() == null )
+ {
+ throw new ServiceException( "CmsImageFileManagerInfinispan has a null cacheManager.getTreeCache()" );
+ }
+
+ try
+ {
+
+
+ StringBuilder nodePath = new StringBuilder();
+ nodePath.append(productImage.getProduct().getMerchantStore().getCode()).append(Constants.SLASH).append(productImage.getProduct().getSku());
+
+
+ Node<String, Object> productNode = this.getNode(nodePath.toString());
+ productNode.remove(productImage.getProductImage());
+
+
+
+
+
+ }
+ catch ( Exception e )
+ {
+ throw new ServiceException( e );
+ }
+ finally
+ {
+
+ }
+
+ }
+
+ @Override
+ public void removeProductImages( Product product )
+ throws ServiceException
+ {
+
+ if ( cacheManager.getTreeCache() == null )
+ {
+ throw new ServiceException( "CmsImageFileManagerInfinispan has a null cacheManager.getTreeCache()" );
+ }
+
+ try
+ {
+
+
+ StringBuilder nodePath = new StringBuilder();
+ nodePath.append(product.getMerchantStore().getCode());
+
+
+ Node<String, Object> merchantNode = this.getNode(nodePath.toString());
+
+ merchantNode.remove(product.getSku());
+
+
+
+
+ }
+ catch ( Exception e )
+ {
+ throw new ServiceException( e );
+ }
+ finally
+ {
+
+ }
+
+ }
+
+
+ @Override
+ public List<OutputContentFile> getImages(final String merchantStoreCode,
+ FileContentType imageContentType) throws ServiceException {
+ if ( cacheManager.getTreeCache() == null )
+ {
+ throw new ServiceException( "CmsImageFileManagerInfinispan has a null cacheManager.getTreeCache()" );
+ }
+ List<OutputContentFile> images = new ArrayList<OutputContentFile>();
+ FileNameMap fileNameMap = URLConnection.getFileNameMap();
+
+ try
+ {
+
+
+ StringBuilder nodePath = new StringBuilder();
+ nodePath.append(merchantStoreCode);
+
+
+ Node<String, Object> merchantNode = this.getNode(nodePath.toString());
+
+ Set<Node<String,Object>> childs = merchantNode.getChildren();
+
+ Iterator<Node<String,Object>> iterator = childs.iterator();
+ //TODO image sizes
+ while(iterator.hasNext()) {
+
+ Node<String,Object> node = iterator.next();
+
+ for(String key : node.getKeys()) {
+
+
+ byte[] imageBytes = (byte[])merchantNode.get( key );
+
+ OutputContentFile contentImage = new OutputContentFile();
+
+ InputStream input = new ByteArrayInputStream( imageBytes );
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ IOUtils.copy( input, output );
+
+ String contentType = fileNameMap.getContentTypeFor( key );
+
+ contentImage.setFile( output );
+ contentImage.setMimeType( contentType );
+ contentImage.setFileName( key );
+
+ images.add( contentImage );
+
+
+ }
+
+ }
+
+
+
+
+ }
+ catch ( Exception e )
+ {
+ throw new ServiceException( e );
+ }
+ finally
+ {
+
+ }
+
+ return images;
+ }
+
+ @Override
+ public OutputContentFile getProductImage(String merchantStoreCode,
+ String productCode, String imageName) throws ServiceException {
+ return getProductImage(merchantStoreCode, productCode, imageName, ProductImageSize.SMALL.name());
+ }
+
+ @Override
+ public OutputContentFile getProductImage(String merchantStoreCode,
+ String productCode, String imageName, ProductImageSize size)
+ throws ServiceException {
+ return getProductImage(merchantStoreCode, productCode, imageName, size.name());
+ }
+
+ private OutputContentFile getProductImage(String merchantStoreCode,
+ String productCode, String imageName, String size) throws ServiceException {
+
+ if ( cacheManager.getTreeCache() == null )
+ {
+ throw new ServiceException( "CmsImageFileManagerInfinispan has a null cacheManager.getTreeCache()" );
+ }
+ InputStream input = null;
+ OutputContentFile contentImage = new OutputContentFile();
+ try
+ {
+
+ FileNameMap fileNameMap = URLConnection.getFileNameMap();
+
+ //SMALL by default
+ StringBuilder nodePath = new StringBuilder();
+ nodePath.append(merchantStoreCode).append(Constants.SLASH).append(productCode).append(Constants.SLASH).append(size);
+
+ Node<String,Object> productNode = this.getNode(nodePath.toString());
+
+
+ byte[] imageBytes = (byte[])productNode.get( imageName );
+
+ if(imageBytes==null) {
+ LOGGER.warn("Image " + imageName + " does not exist");
+ return null;//no post processing will occur
+ }
+
+ input = new ByteArrayInputStream( imageBytes );
+ ByteArrayOutputStream output = new ByteArrayOutputStream();
+ IOUtils.copy( input, output );
+
+ String contentType = fileNameMap.getContentTypeFor( imageName );
+
+ contentImage.setFile( output );
+ contentImage.setMimeType( contentType );
+ contentImage.setFileName( imageName );
+
+
+
+ }
+ catch ( Exception e )
+ {
+ throw new ServiceException( e );
+ }
+ finally
+ {
+ if ( input != null )
+ {
+ try
+ {
+ input.close();
+ }
+ catch ( Exception ignore )
+ {
+ }
+ }
+ }
+
+ return contentImage;
+
+ }
+
+
+ @SuppressWarnings("unchecked")
+ private Node<String, Object> getNode( final String node )
+ {
+ LOGGER.debug( "Fetching node for store {} from Infinispan", node );
+ final StringBuilder merchantPath = new StringBuilder();
+ merchantPath.append( getRootName() ).append(node);
+
+ Fqn contentFilesFqn = Fqn.fromString(merchantPath.toString());
+
+ Node<String,Object> nd = cacheManager.getTreeCache().getRoot().getChild(contentFilesFqn);
+
+ if(nd==null) {
+
+ cacheManager.getTreeCache().getRoot().addChild(contentFilesFqn);
+ nd = cacheManager.getTreeCache().getRoot().getChild(contentFilesFqn);
+
+ }
+
+ return nd;
+
+ }
+
+ public CacheManager getCacheManager() {
+ return cacheManager;
+ }
+
+ public void setCacheManager(CacheManager cacheManager) {
+ this.cacheManager = cacheManager;
+ }
+
+ public void setRootName(String rootName) {
+ this.rootName = rootName;
+ }
+
+ public String getRootName() {
+ return rootName;
+ }
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/local/CmsImageFileManagerImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/local/CmsImageFileManagerImpl.java
index 233dd44..3ace37e 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/local/CmsImageFileManagerImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/local/CmsImageFileManagerImpl.java
@@ -1,327 +1,327 @@
-package com.salesmanager.core.business.modules.cms.product.local;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.StandardCopyOption;
-import java.util.List;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.salesmanager.core.business.constants.Constants;
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.modules.cms.impl.LocalCacheManagerImpl;
-import com.salesmanager.core.business.modules.cms.product.ProductImageGet;
-import com.salesmanager.core.business.modules.cms.product.ProductImagePut;
-import com.salesmanager.core.business.modules.cms.product.ProductImageRemove;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.file.ProductImageSize;
-import com.salesmanager.core.model.catalog.product.image.ProductImage;
-import com.salesmanager.core.model.content.FileContentType;
-import com.salesmanager.core.model.content.ImageContentFile;
-import com.salesmanager.core.model.content.OutputContentFile;
-import com.salesmanager.core.model.merchant.MerchantStore;
-
-/**
- * Manager for storing and deleting image files from the CMS which is a web server
- *
- * Manages
- * - Product images
- * @author Carl Samson
- */
-public class CmsImageFileManagerImpl
- implements ProductImagePut, ProductImageGet, ProductImageRemove
-{
-
- private static final Logger LOGGER = LoggerFactory.getLogger( CmsImageFileManagerImpl.class );
-
- private static CmsImageFileManagerImpl fileManager = null;
-
- private final static String ROOT_NAME = "";
-
- private final static String SMALL = "SMALL";
- private final static String LARGE = "LARGE";
-
- private static final String ROOT_CONTAINER = "products";
-
- private String rootName = ROOT_NAME;
-
- private LocalCacheManagerImpl cacheManager;
-
-
- public static CmsImageFileManagerImpl getInstance()
- {
-
- if ( fileManager == null )
- {
- fileManager = new CmsImageFileManagerImpl();
- }
-
- return fileManager;
-
- }
-
- private CmsImageFileManagerImpl()
- {
-
- }
-
- /**
- * root/products/<merchant id>/<product id>/1.jpg
- */
-
- @Override
- public void addProductImage( ProductImage productImage,
- ImageContentFile contentImage )
- throws ServiceException
- {
-
-
- try
- {
-
- //base path
- String rootPath = this.buildRootPath();
- Path confDir = Paths.get(rootPath);
- this.createDirectoryIfNorExist(confDir);
-
- //node path
- StringBuilder nodePath = new StringBuilder();
- nodePath
- .append(rootPath)
- .append(productImage.getProduct().getMerchantStore().getCode());
- Path merchantPath = Paths.get(nodePath.toString());
- this.createDirectoryIfNorExist(merchantPath);
-
- //product path
- nodePath.append(Constants.SLASH).append(productImage.getProduct().getSku()).append(Constants.SLASH);
- Path dirPath = Paths.get(nodePath.toString());
- this.createDirectoryIfNorExist(dirPath);
-
- //small large
- if(contentImage.getFileContentType().name().equals(FileContentType.PRODUCT.name())) {
- nodePath.append(SMALL);
- } else if(contentImage.getFileContentType().name().equals(FileContentType.PRODUCTLG.name())) {
- nodePath.append(LARGE);
- }
- Path sizePath = Paths.get(nodePath.toString());
- this.createDirectoryIfNorExist(sizePath);
-
-
- //file creation
- nodePath.append(Constants.SLASH).append(contentImage.getFileName());
-
-
- Path path = Paths.get(nodePath.toString());
- InputStream isFile = contentImage.getFile();
-
- Files.copy(isFile, path, StandardCopyOption.REPLACE_EXISTING);
-
-
- }
- catch ( Exception e )
- {
-
- throw new ServiceException( e );
-
- }
-
- }
-
- @Override
- public OutputContentFile getProductImage( ProductImage productImage )
- throws ServiceException
- {
-
- //the web server takes care of the images
- return null;
-
- }
-
-
- public List<OutputContentFile> getImages( MerchantStore store, FileContentType imageContentType )
- throws ServiceException
- {
-
- //the web server takes care of the images
-
- return null;
-
- }
-
- @Override
- public List<OutputContentFile> getImages( Product product )
- throws ServiceException
- {
-
- //the web server takes care of the images
-
- return null;
- }
-
-
-
- @Override
- public void removeImages( final String merchantStoreCode )
- throws ServiceException
- {
-
- try
- {
-
-
- StringBuilder merchantPath = new StringBuilder();
- merchantPath.append(buildRootPath())
- .append(Constants.SLASH)
- .append(merchantStoreCode);
-
- Path path = Paths.get(merchantPath.toString());
-
- Files.deleteIfExists(path);
-
-
- }
- catch ( Exception e )
- {
- throw new ServiceException( e );
- }
-
-
- }
-
-
- @Override
- public void removeProductImage( ProductImage productImage )
- throws ServiceException
- {
-
-
- try
- {
-
-
- StringBuilder nodePath = new StringBuilder();
- nodePath.append(buildRootPath())
- .append(Constants.SLASH)
- .append(productImage.getProduct().getMerchantStore().getCode()).append(Constants.SLASH).append(productImage.getProduct().getSku());
-
- //delete small
- StringBuilder smallPath = new StringBuilder(nodePath);
- smallPath.append(Constants.SLASH).append(SMALL).append(Constants.SLASH).append(productImage.getProductImage());
-
-
- Path path = Paths.get(smallPath.toString());
-
- Files.deleteIfExists(path);
-
- //delete large
- StringBuilder largePath = new StringBuilder(nodePath);
- largePath.append(Constants.SLASH).append(LARGE).append(Constants.SLASH).append(productImage.getProductImage());
-
-
- path = Paths.get(largePath.toString());
-
- Files.deleteIfExists(path);
-
- }
- catch ( Exception e )
- {
- throw new ServiceException( e );
- }
-
-
- }
-
- @Override
- public void removeProductImages( Product product )
- throws ServiceException
- {
-
- try
- {
-
-
- StringBuilder nodePath = new StringBuilder();
- nodePath.append(buildRootPath())
- .append(Constants.SLASH)
- .append(product.getMerchantStore().getCode()).append(Constants.SLASH).append(product.getSku());
-
-
- Path path = Paths.get(nodePath.toString());
-
- Files.deleteIfExists(path);
-
- }
- catch ( Exception e )
- {
- throw new ServiceException( e );
- }
-
- }
-
-
- @Override
- public List<OutputContentFile> getImages(final String merchantStoreCode,
- FileContentType imageContentType) throws ServiceException {
-
- //the web server taks care of the images
-
- return null;
- }
-
- @Override
- public OutputContentFile getProductImage(String merchantStoreCode,
- String productCode, String imageName) throws ServiceException {
- return getProductImage(merchantStoreCode, productCode, imageName, ProductImageSize.SMALL.name());
- }
-
- @Override
- public OutputContentFile getProductImage(String merchantStoreCode,
- String productCode, String imageName, ProductImageSize size)
- throws ServiceException {
- return getProductImage(merchantStoreCode, productCode, imageName, size.name());
- }
-
- private OutputContentFile getProductImage(String merchantStoreCode,
- String productCode, String imageName, String size) throws ServiceException {
-
- return null;
-
- }
-
-
- private String buildRootPath() {
- return new StringBuilder().append(getRootName()).append(Constants.SLASH).append(ROOT_CONTAINER).append(Constants.SLASH).toString();
-
- }
-
-
- private void createDirectoryIfNorExist(Path path) throws IOException {
-
- if (Files.notExists(path)) {
- Files.createDirectory(path);
- }
- }
-
- public void setRootName(String rootName) {
- this.rootName = rootName;
- }
-
- public String getRootName() {
- return rootName;
- }
-
- public LocalCacheManagerImpl getCacheManager() {
- return cacheManager;
- }
-
- public void setCacheManager(LocalCacheManagerImpl cacheManager) {
- this.cacheManager = cacheManager;
- }
-
-
-
-}
+package com.salesmanager.core.business.modules.cms.product.local;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.salesmanager.core.business.constants.Constants;
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.modules.cms.impl.LocalCacheManagerImpl;
+import com.salesmanager.core.business.modules.cms.product.ProductImageGet;
+import com.salesmanager.core.business.modules.cms.product.ProductImagePut;
+import com.salesmanager.core.business.modules.cms.product.ProductImageRemove;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.file.ProductImageSize;
+import com.salesmanager.core.model.catalog.product.image.ProductImage;
+import com.salesmanager.core.model.content.FileContentType;
+import com.salesmanager.core.model.content.ImageContentFile;
+import com.salesmanager.core.model.content.OutputContentFile;
+import com.salesmanager.core.model.merchant.MerchantStore;
+
+/**
+ * Manager for storing and deleting image files from the CMS which is a web server
+ *
+ * Manages
+ * - Product images
+ * @author Carl Samson
+ */
+public class CmsImageFileManagerImpl
+ implements ProductImagePut, ProductImageGet, ProductImageRemove
+{
+
+ private static final Logger LOGGER = LoggerFactory.getLogger( CmsImageFileManagerImpl.class );
+
+ private static CmsImageFileManagerImpl fileManager = null;
+
+ private final static String ROOT_NAME = "";
+
+ private final static String SMALL = "SMALL";
+ private final static String LARGE = "LARGE";
+
+ private static final String ROOT_CONTAINER = "products";
+
+ private String rootName = ROOT_NAME;
+
+ private LocalCacheManagerImpl cacheManager;
+
+
+ public static CmsImageFileManagerImpl getInstance()
+ {
+
+ if ( fileManager == null )
+ {
+ fileManager = new CmsImageFileManagerImpl();
+ }
+
+ return fileManager;
+
+ }
+
+ private CmsImageFileManagerImpl()
+ {
+
+ }
+
+ /**
+ * root/products/<merchant id>/<product id>/1.jpg
+ */
+
+ @Override
+ public void addProductImage( ProductImage productImage,
+ ImageContentFile contentImage )
+ throws ServiceException
+ {
+
+
+ try
+ {
+
+ //base path
+ String rootPath = this.buildRootPath();
+ Path confDir = Paths.get(rootPath);
+ this.createDirectoryIfNorExist(confDir);
+
+ //node path
+ StringBuilder nodePath = new StringBuilder();
+ nodePath
+ .append(rootPath)
+ .append(productImage.getProduct().getMerchantStore().getCode());
+ Path merchantPath = Paths.get(nodePath.toString());
+ this.createDirectoryIfNorExist(merchantPath);
+
+ //product path
+ nodePath.append(Constants.SLASH).append(productImage.getProduct().getSku()).append(Constants.SLASH);
+ Path dirPath = Paths.get(nodePath.toString());
+ this.createDirectoryIfNorExist(dirPath);
+
+ //small large
+ if(contentImage.getFileContentType().name().equals(FileContentType.PRODUCT.name())) {
+ nodePath.append(SMALL);
+ } else if(contentImage.getFileContentType().name().equals(FileContentType.PRODUCTLG.name())) {
+ nodePath.append(LARGE);
+ }
+ Path sizePath = Paths.get(nodePath.toString());
+ this.createDirectoryIfNorExist(sizePath);
+
+
+ //file creation
+ nodePath.append(Constants.SLASH).append(contentImage.getFileName());
+
+
+ Path path = Paths.get(nodePath.toString());
+ InputStream isFile = contentImage.getFile();
+
+ Files.copy(isFile, path, StandardCopyOption.REPLACE_EXISTING);
+
+
+ }
+ catch ( Exception e )
+ {
+
+ throw new ServiceException( e );
+
+ }
+
+ }
+
+ @Override
+ public OutputContentFile getProductImage( ProductImage productImage )
+ throws ServiceException
+ {
+
+ //the web server takes care of the images
+ return null;
+
+ }
+
+
+ public List<OutputContentFile> getImages( MerchantStore store, FileContentType imageContentType )
+ throws ServiceException
+ {
+
+ //the web server takes care of the images
+
+ return null;
+
+ }
+
+ @Override
+ public List<OutputContentFile> getImages( Product product )
+ throws ServiceException
+ {
+
+ //the web server takes care of the images
+
+ return null;
+ }
+
+
+
+ @Override
+ public void removeImages( final String merchantStoreCode )
+ throws ServiceException
+ {
+
+ try
+ {
+
+
+ StringBuilder merchantPath = new StringBuilder();
+ merchantPath.append(buildRootPath())
+ .append(Constants.SLASH)
+ .append(merchantStoreCode);
+
+ Path path = Paths.get(merchantPath.toString());
+
+ Files.deleteIfExists(path);
+
+
+ }
+ catch ( Exception e )
+ {
+ throw new ServiceException( e );
+ }
+
+
+ }
+
+
+ @Override
+ public void removeProductImage( ProductImage productImage )
+ throws ServiceException
+ {
+
+
+ try
+ {
+
+
+ StringBuilder nodePath = new StringBuilder();
+ nodePath.append(buildRootPath())
+ .append(Constants.SLASH)
+ .append(productImage.getProduct().getMerchantStore().getCode()).append(Constants.SLASH).append(productImage.getProduct().getSku());
+
+ //delete small
+ StringBuilder smallPath = new StringBuilder(nodePath);
+ smallPath.append(Constants.SLASH).append(SMALL).append(Constants.SLASH).append(productImage.getProductImage());
+
+
+ Path path = Paths.get(smallPath.toString());
+
+ Files.deleteIfExists(path);
+
+ //delete large
+ StringBuilder largePath = new StringBuilder(nodePath);
+ largePath.append(Constants.SLASH).append(LARGE).append(Constants.SLASH).append(productImage.getProductImage());
+
+
+ path = Paths.get(largePath.toString());
+
+ Files.deleteIfExists(path);
+
+ }
+ catch ( Exception e )
+ {
+ throw new ServiceException( e );
+ }
+
+
+ }
+
+ @Override
+ public void removeProductImages( Product product )
+ throws ServiceException
+ {
+
+ try
+ {
+
+
+ StringBuilder nodePath = new StringBuilder();
+ nodePath.append(buildRootPath())
+ .append(Constants.SLASH)
+ .append(product.getMerchantStore().getCode()).append(Constants.SLASH).append(product.getSku());
+
+
+ Path path = Paths.get(nodePath.toString());
+
+ Files.deleteIfExists(path);
+
+ }
+ catch ( Exception e )
+ {
+ throw new ServiceException( e );
+ }
+
+ }
+
+
+ @Override
+ public List<OutputContentFile> getImages(final String merchantStoreCode,
+ FileContentType imageContentType) throws ServiceException {
+
+ //the web server taks care of the images
+
+ return null;
+ }
+
+ @Override
+ public OutputContentFile getProductImage(String merchantStoreCode,
+ String productCode, String imageName) throws ServiceException {
+ return getProductImage(merchantStoreCode, productCode, imageName, ProductImageSize.SMALL.name());
+ }
+
+ @Override
+ public OutputContentFile getProductImage(String merchantStoreCode,
+ String productCode, String imageName, ProductImageSize size)
+ throws ServiceException {
+ return getProductImage(merchantStoreCode, productCode, imageName, size.name());
+ }
+
+ private OutputContentFile getProductImage(String merchantStoreCode,
+ String productCode, String imageName, String size) throws ServiceException {
+
+ return null;
+
+ }
+
+
+ private String buildRootPath() {
+ return new StringBuilder().append(getRootName()).append(Constants.SLASH).append(ROOT_CONTAINER).append(Constants.SLASH).toString();
+
+ }
+
+
+ private void createDirectoryIfNorExist(Path path) throws IOException {
+
+ if (Files.notExists(path)) {
+ Files.createDirectory(path);
+ }
+ }
+
+ public void setRootName(String rootName) {
+ this.rootName = rootName;
+ }
+
+ public String getRootName() {
+ return rootName;
+ }
+
+ public LocalCacheManagerImpl getCacheManager() {
+ return cacheManager;
+ }
+
+ public void setCacheManager(LocalCacheManagerImpl cacheManager) {
+ this.cacheManager = cacheManager;
+ }
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductFileManager.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductFileManager.java
index 50f1b6a..6878e9c 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductFileManager.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductFileManager.java
@@ -1,11 +1,11 @@
-package com.salesmanager.core.business.modules.cms.product;
-
-
-
-
-public abstract class ProductFileManager implements ProductImagePut, ProductImageGet, ProductImageRemove {
-
-
-
-
-}
+package com.salesmanager.core.business.modules.cms.product;
+
+
+
+
+public abstract class ProductFileManager implements ProductImagePut, ProductImageGet, ProductImageRemove {
+
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductFileManagerImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductFileManagerImpl.java
index bdd1568..8dd9448 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductFileManagerImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductFileManagerImpl.java
@@ -1,356 +1,363 @@
-package com.salesmanager.core.business.modules.cms.product;
-
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.net.FileNameMap;
-import java.net.URLConnection;
-import java.util.List;
-
-import javax.imageio.ImageIO;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.salesmanager.core.business.constants.Constants;
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.utils.CoreConfiguration;
-import com.salesmanager.core.business.utils.ProductImageCropUtils;
-import com.salesmanager.core.business.utils.ProductImageSizeUtils;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.file.ProductImageSize;
-import com.salesmanager.core.model.catalog.product.image.ProductImage;
-import com.salesmanager.core.model.content.FileContentType;
-import com.salesmanager.core.model.content.ImageContentFile;
-import com.salesmanager.core.model.content.OutputContentFile;
-
-
-public class ProductFileManagerImpl extends ProductFileManager {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ProductFileManagerImpl.class);
-
-
- private ProductImagePut uploadImage;
- private ProductImageGet getImage;
- private ProductImageRemove removeImage;
-
- private CoreConfiguration configuration;
-
- private final static String PRODUCT_IMAGE_HEIGHT_SIZE = "PRODUCT_IMAGE_HEIGHT_SIZE";
- private final static String PRODUCT_IMAGE_WIDTH_SIZE = "PRODUCT_IMAGE_WIDTH_SIZE";
- private final static String CROP_UPLOADED_IMAGES ="CROP_UPLOADED_IMAGES";
-
-
- public CoreConfiguration getConfiguration() {
- return configuration;
- }
-
-
- public void setConfiguration(CoreConfiguration configuration) {
- this.configuration = configuration;
- }
-
-
- public ProductImageRemove getRemoveImage() {
- return removeImage;
- }
-
-
- public void setRemoveImage(ProductImageRemove removeImage) {
- this.removeImage = removeImage;
- }
-
-
- public void addProductImage(ProductImage productImage, ImageContentFile contentImage)
- throws ServiceException {
-
-
- try {
-
- /** copy to input stream **/
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- // Fake code simulating the copy
- // You can generally do better with nio if you need...
- // And please, unlike me, do something about the Exceptions :D
- byte[] buffer = new byte[1024];
- int len;
- while ((len = contentImage.getFile().read(buffer)) > -1 ) {
- baos.write(buffer, 0, len);
- }
- baos.flush();
-
- // Open new InputStreams using the recorded bytes
- // Can be repeated as many times as you wish
- InputStream is1 = new ByteArrayInputStream(baos.toByteArray());
- InputStream is2 = new ByteArrayInputStream(baos.toByteArray());
-
- BufferedImage bufferedImage = ImageIO.read(is2);
- //contentImage.setBufferedImage(bufferedImage);
- contentImage.setFile(is1);
-
-
- //upload original -- L
- contentImage.setFileContentType(FileContentType.PRODUCTLG);
- uploadImage.addProductImage(productImage, contentImage);
-
-/* //default large
- InputContentImage largeContentImage = new InputContentImage(ImageContentType.PRODUCT);
- largeContentImage.setFile(contentImage.getFile());
- largeContentImage.setDefaultImage(productImage.isDefaultImage());
- largeContentImage.setImageName(new StringBuilder().append("L-").append(productImage.getProductImage()).toString());
-
-
- uploadImage.uploadProductImage(configuration, productImage, largeContentImage);*/
-
-/* //default small
- InputContentImage smallContentImage = new InputContentImage(ImageContentType.PRODUCT);
- smallContentImage.setFile(contentImage.getFile());
- smallContentImage.setDefaultImage(productImage.isDefaultImage());
- smallContentImage.setImageName(new StringBuilder().append("S-").append(productImage.getProductImage()).toString());
-
- uploadImage.uploadProductImage(configuration, productImage, smallContentImage);*/
-
-
- //get template properties file
-
- String slargeImageHeight = configuration.getProperty(PRODUCT_IMAGE_HEIGHT_SIZE);
- String slargeImageWidth = configuration.getProperty(PRODUCT_IMAGE_WIDTH_SIZE);
-
- //String ssmallImageHeight = configuration.getProperty("SMALL_IMAGE_HEIGHT_SIZE");
- //String ssmallImageWidth = configuration.getProperty("SMALL_IMAGE_WIDTH_SIZE");
-
-
- if(!StringUtils.isBlank(slargeImageHeight) && !StringUtils.isBlank(slargeImageWidth)) { //&& !StringUtils.isBlank(ssmallImageHeight) && !StringUtils.isBlank(ssmallImageWidth)) {
-
-
- FileNameMap fileNameMap = URLConnection.getFileNameMap();
-
- String contentType = fileNameMap.getContentTypeFor(contentImage.getFileName());
- String extension = null;
- if(contentType!=null) {
- extension = contentType.substring(contentType.indexOf("/")+1,contentType.length());
- }
-
- if(extension==null){
- extension="jpeg";
- }
-
-
- int largeImageHeight = Integer.parseInt(slargeImageHeight);
- int largeImageWidth = Integer.parseInt(slargeImageWidth);
-
- if(largeImageHeight<=0 || largeImageWidth<=0) {
- String sizeMsg = "Image configuration set to an invalid value [PRODUCT_IMAGE_HEIGHT_SIZE] " + largeImageHeight + " , [PRODUCT_IMAGE_WIDTH_SIZE] " + largeImageWidth;
- LOGGER.error(sizeMsg);
- throw new ServiceException(sizeMsg);
- }
-
- if(!StringUtils.isBlank(configuration.getProperty(CROP_UPLOADED_IMAGES)) && configuration.getProperty(CROP_UPLOADED_IMAGES).equals(Constants.TRUE)) {
- //crop image
- ProductImageCropUtils utils = new ProductImageCropUtils(bufferedImage, largeImageWidth, largeImageHeight);
- if(utils.isCropeable()) {
- bufferedImage = utils.getCroppedImage();
- }
- }
-
-
- //TODO print cropped image
-
-
- //do not keep a large image for now, just take care of the regular image and a small image
-
- //resize large
- //ByteArrayOutputStream output = new ByteArrayOutputStream();
- BufferedImage largeResizedImage = ProductImageSizeUtils.resizeWithRatio(bufferedImage, largeImageWidth, largeImageHeight);
-
-
- File tempLarge = File.createTempFile(new StringBuilder().append(productImage.getProduct().getId()).append("tmpLarge").toString(), "." + extension );
- ImageIO.write(largeResizedImage, extension, tempLarge);
-
- FileInputStream isLarge = new FileInputStream(tempLarge);
-
-
- //IOUtils.copy(isLarge, output);
-
-
- ImageContentFile largeContentImage = new ImageContentFile();
- largeContentImage.setFileContentType(FileContentType.PRODUCT);
- largeContentImage.setFileName(productImage.getProductImage());
- largeContentImage.setFile(isLarge);
-
-
- //largeContentImage.setBufferedImage(bufferedImage);
-
- //largeContentImage.setFile(output);
- //largeContentImage.setDefaultImage(false);
- //largeContentImage.setImageName(new StringBuilder().append("L-").append(productImage.getProductImage()).toString());
-
-
- uploadImage.addProductImage(productImage, largeContentImage);
-
- //output.flush();
- //output.close();
-
- tempLarge.delete();
-
- //now upload original
-
-
-
-/* //resize small
- BufferedImage smallResizedImage = ProductImageSizeUtils.resize(cropped, smallImageWidth, smallImageHeight);
- File tempSmall = File.createTempFile(new StringBuilder().append(productImage.getProduct().getId()).append("tmpSmall").toString(), "." + extension );
- ImageIO.write(smallResizedImage, extension, tempSmall);
-
- //byte[] is = IOUtils.toByteArray(new FileInputStream(tempSmall));
-
- FileInputStream isSmall = new FileInputStream(tempSmall);
-
- output = new ByteArrayOutputStream();
- IOUtils.copy(isSmall, output);
-
-
- smallContentImage = new InputContentImage(ImageContentType.PRODUCT);
- smallContentImage.setFile(output);
- smallContentImage.setDefaultImage(false);
- smallContentImage.setImageName(new StringBuilder().append("S-").append(productImage.getProductImage()).toString());
-
- uploadImage.uploadProductImage(configuration, productImage, smallContentImage);
-
- output.flush();
- output.close();
-
- tempSmall.delete();*/
-
-
-
- } else {
- //small will be the same as the original
- contentImage.setFileContentType(FileContentType.PRODUCT);
- uploadImage.addProductImage(productImage, contentImage);
- }
-
-
-
-
-
-
-
- } catch (Exception e) {
- throw new ServiceException(e);
- } finally {
- try {
- productImage.getImage().close();
- } catch(Exception ignore) {}
- }
-
-}
-
-
- public OutputContentFile getProductImage(ProductImage productImage) throws ServiceException {
- //will return original
- return getImage.getProductImage(productImage);
- }
-
-
- @Override
- public List<OutputContentFile> getImages(final String merchantStoreCode, FileContentType imageContentType)
- throws ServiceException {
- //will return original
- return getImage.getImages(merchantStoreCode,FileContentType.PRODUCT);
- }
-
- @Override
- public List<OutputContentFile> getImages(Product product)
- throws ServiceException {
- return getImage.getImages(product);
- }
-
-
-
-
-
-
- @Override
- public void removeProductImage(ProductImage productImage)
- throws ServiceException {
-
- this.removeImage.removeProductImage(productImage);
-
-/* ProductImage large = new ProductImage();
- large.setProduct(productImage.getProduct());
- large.setProductImage("L" + productImage.getProductImage());
-
- this.removeImage.removeProductImage(large);
-
- ProductImage small = new ProductImage();
- small.setProduct(productImage.getProduct());
- small.setProductImage("S" + productImage.getProductImage());
-
- this.removeImage.removeProductImage(small);*/
-
- }
-
-
- @Override
- public void removeProductImages(Product product) throws ServiceException {
-
- this.removeImage.removeProductImages(product);
-
- }
-
-
- @Override
- public void removeImages(final String merchantStoreCode) throws ServiceException {
-
- this.removeImage.removeImages(merchantStoreCode);
-
- }
-
-
- public ProductImagePut getUploadImage() {
- return uploadImage;
- }
-
-
- public void setUploadImage(ProductImagePut uploadImage) {
- this.uploadImage = uploadImage;
- }
-
-
-
-
- public ProductImageGet getGetImage() {
- return getImage;
- }
-
-
- public void setGetImage(ProductImageGet getImage) {
- this.getImage = getImage;
- }
-
-
- @Override
- public OutputContentFile getProductImage(String merchantStoreCode,
- String productCode, String imageName) throws ServiceException {
- return getImage.getProductImage(merchantStoreCode, productCode, imageName);
- }
-
-
-
- @Override
- public OutputContentFile getProductImage(String merchantStoreCode,
- String productCode, String imageName, ProductImageSize size)
- throws ServiceException {
- return getImage.getProductImage(merchantStoreCode, productCode, imageName, size);
- }
-
-
-
-
-
-}
+package com.salesmanager.core.business.modules.cms.product;
+
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.net.FileNameMap;
+import java.net.URLConnection;
+import java.util.List;
+
+import javax.imageio.ImageIO;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.salesmanager.core.business.constants.Constants;
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.utils.CoreConfiguration;
+import com.salesmanager.core.business.utils.ProductImageCropUtils;
+import com.salesmanager.core.business.utils.ProductImageSizeUtils;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.file.ProductImageSize;
+import com.salesmanager.core.model.catalog.product.image.ProductImage;
+import com.salesmanager.core.model.content.FileContentType;
+import com.salesmanager.core.model.content.ImageContentFile;
+import com.salesmanager.core.model.content.OutputContentFile;
+
+
+public class ProductFileManagerImpl extends ProductFileManager {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ProductFileManagerImpl.class);
+
+
+ private ProductImagePut uploadImage;
+ private ProductImageGet getImage;
+ private ProductImageRemove removeImage;
+
+ private CoreConfiguration configuration;
+
+ private final static String PRODUCT_IMAGE_HEIGHT_SIZE = "PRODUCT_IMAGE_HEIGHT_SIZE";
+ private final static String PRODUCT_IMAGE_WIDTH_SIZE = "PRODUCT_IMAGE_WIDTH_SIZE";
+ private final static String CROP_UPLOADED_IMAGES ="CROP_UPLOADED_IMAGES";
+
+
+ public CoreConfiguration getConfiguration() {
+ return configuration;
+ }
+
+
+ public void setConfiguration(CoreConfiguration configuration) {
+ this.configuration = configuration;
+ }
+
+
+ public ProductImageRemove getRemoveImage() {
+ return removeImage;
+ }
+
+
+ public void setRemoveImage(ProductImageRemove removeImage) {
+ this.removeImage = removeImage;
+ }
+
+
+ public void addProductImage(ProductImage productImage, ImageContentFile contentImage)
+ throws ServiceException {
+
+
+ try {
+
+ /** copy to input stream **/
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ // Fake code simulating the copy
+ // You can generally do better with nio if you need...
+ // And please, unlike me, do something about the Exceptions :D
+ byte[] buffer = new byte[1024];
+ int len;
+ while ((len = contentImage.getFile().read(buffer)) > -1 ) {
+ baos.write(buffer, 0, len);
+ }
+ baos.flush();
+
+ // Open new InputStreams using the recorded bytes
+ // Can be repeated as many times as you wish
+ InputStream is1 = new ByteArrayInputStream(baos.toByteArray());
+ InputStream is2 = new ByteArrayInputStream(baos.toByteArray());
+
+ BufferedImage bufferedImage = ImageIO.read(is2);
+
+
+ if(bufferedImage == null) {
+ LOGGER.error("Cannot read image format for " + productImage.getProductImage());
+ throw new Exception("Cannot read image format " + productImage.getProductImage());
+ }
+
+ //contentImage.setBufferedImage(bufferedImage);
+ contentImage.setFile(is1);
+
+
+ //upload original -- L
+ contentImage.setFileContentType(FileContentType.PRODUCTLG);
+ uploadImage.addProductImage(productImage, contentImage);
+
+/* //default large
+ InputContentImage largeContentImage = new InputContentImage(ImageContentType.PRODUCT);
+ largeContentImage.setFile(contentImage.getFile());
+ largeContentImage.setDefaultImage(productImage.isDefaultImage());
+ largeContentImage.setImageName(new StringBuilder().append("L-").append(productImage.getProductImage()).toString());
+
+
+ uploadImage.uploadProductImage(configuration, productImage, largeContentImage);*/
+
+/* //default small
+ InputContentImage smallContentImage = new InputContentImage(ImageContentType.PRODUCT);
+ smallContentImage.setFile(contentImage.getFile());
+ smallContentImage.setDefaultImage(productImage.isDefaultImage());
+ smallContentImage.setImageName(new StringBuilder().append("S-").append(productImage.getProductImage()).toString());
+
+ uploadImage.uploadProductImage(configuration, productImage, smallContentImage);*/
+
+
+ //get template properties file
+
+ String slargeImageHeight = configuration.getProperty(PRODUCT_IMAGE_HEIGHT_SIZE);
+ String slargeImageWidth = configuration.getProperty(PRODUCT_IMAGE_WIDTH_SIZE);
+
+ //String ssmallImageHeight = configuration.getProperty("SMALL_IMAGE_HEIGHT_SIZE");
+ //String ssmallImageWidth = configuration.getProperty("SMALL_IMAGE_WIDTH_SIZE");
+
+
+ if(!StringUtils.isBlank(slargeImageHeight) && !StringUtils.isBlank(slargeImageWidth)) { //&& !StringUtils.isBlank(ssmallImageHeight) && !StringUtils.isBlank(ssmallImageWidth)) {
+
+
+ FileNameMap fileNameMap = URLConnection.getFileNameMap();
+
+ String contentType = fileNameMap.getContentTypeFor(contentImage.getFileName());
+ String extension = null;
+ if(contentType!=null) {
+ extension = contentType.substring(contentType.indexOf("/")+1,contentType.length());
+ }
+
+ if(extension==null){
+ extension="jpeg";
+ }
+
+
+ int largeImageHeight = Integer.parseInt(slargeImageHeight);
+ int largeImageWidth = Integer.parseInt(slargeImageWidth);
+
+ if(largeImageHeight<=0 || largeImageWidth<=0) {
+ String sizeMsg = "Image configuration set to an invalid value [PRODUCT_IMAGE_HEIGHT_SIZE] " + largeImageHeight + " , [PRODUCT_IMAGE_WIDTH_SIZE] " + largeImageWidth;
+ LOGGER.error(sizeMsg);
+ throw new ServiceException(sizeMsg);
+ }
+
+ if(!StringUtils.isBlank(configuration.getProperty(CROP_UPLOADED_IMAGES)) && configuration.getProperty(CROP_UPLOADED_IMAGES).equals(Constants.TRUE)) {
+ //crop image
+ ProductImageCropUtils utils = new ProductImageCropUtils(bufferedImage, largeImageWidth, largeImageHeight);
+ if(utils.isCropeable()) {
+ bufferedImage = utils.getCroppedImage();
+ }
+ }
+
+
+ //TODO print cropped image
+
+
+ //do not keep a large image for now, just take care of the regular image and a small image
+
+ //resize large
+ //ByteArrayOutputStream output = new ByteArrayOutputStream();
+ BufferedImage largeResizedImage = ProductImageSizeUtils.resizeWithRatio(bufferedImage, largeImageWidth, largeImageHeight);
+
+
+ File tempLarge = File.createTempFile(new StringBuilder().append(productImage.getProduct().getId()).append("tmpLarge").toString(), "." + extension );
+ ImageIO.write(largeResizedImage, extension, tempLarge);
+
+ FileInputStream isLarge = new FileInputStream(tempLarge);
+
+
+ //IOUtils.copy(isLarge, output);
+
+
+ ImageContentFile largeContentImage = new ImageContentFile();
+ largeContentImage.setFileContentType(FileContentType.PRODUCT);
+ largeContentImage.setFileName(productImage.getProductImage());
+ largeContentImage.setFile(isLarge);
+
+
+ //largeContentImage.setBufferedImage(bufferedImage);
+
+ //largeContentImage.setFile(output);
+ //largeContentImage.setDefaultImage(false);
+ //largeContentImage.setImageName(new StringBuilder().append("L-").append(productImage.getProductImage()).toString());
+
+
+ uploadImage.addProductImage(productImage, largeContentImage);
+
+ //output.flush();
+ //output.close();
+
+ tempLarge.delete();
+
+ //now upload original
+
+
+
+/* //resize small
+ BufferedImage smallResizedImage = ProductImageSizeUtils.resize(cropped, smallImageWidth, smallImageHeight);
+ File tempSmall = File.createTempFile(new StringBuilder().append(productImage.getProduct().getId()).append("tmpSmall").toString(), "." + extension );
+ ImageIO.write(smallResizedImage, extension, tempSmall);
+
+ //byte[] is = IOUtils.toByteArray(new FileInputStream(tempSmall));
+
+ FileInputStream isSmall = new FileInputStream(tempSmall);
+
+ output = new ByteArrayOutputStream();
+ IOUtils.copy(isSmall, output);
+
+
+ smallContentImage = new InputContentImage(ImageContentType.PRODUCT);
+ smallContentImage.setFile(output);
+ smallContentImage.setDefaultImage(false);
+ smallContentImage.setImageName(new StringBuilder().append("S-").append(productImage.getProductImage()).toString());
+
+ uploadImage.uploadProductImage(configuration, productImage, smallContentImage);
+
+ output.flush();
+ output.close();
+
+ tempSmall.delete();*/
+
+
+
+ } else {
+ //small will be the same as the original
+ contentImage.setFileContentType(FileContentType.PRODUCT);
+ uploadImage.addProductImage(productImage, contentImage);
+ }
+
+
+
+
+
+
+
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ } finally {
+ try {
+ productImage.getImage().close();
+ } catch(Exception ignore) {}
+ }
+
+}
+
+
+ public OutputContentFile getProductImage(ProductImage productImage) throws ServiceException {
+ //will return original
+ return getImage.getProductImage(productImage);
+ }
+
+
+ @Override
+ public List<OutputContentFile> getImages(final String merchantStoreCode, FileContentType imageContentType)
+ throws ServiceException {
+ //will return original
+ return getImage.getImages(merchantStoreCode,FileContentType.PRODUCT);
+ }
+
+ @Override
+ public List<OutputContentFile> getImages(Product product)
+ throws ServiceException {
+ return getImage.getImages(product);
+ }
+
+
+
+
+
+
+ @Override
+ public void removeProductImage(ProductImage productImage)
+ throws ServiceException {
+
+ this.removeImage.removeProductImage(productImage);
+
+/* ProductImage large = new ProductImage();
+ large.setProduct(productImage.getProduct());
+ large.setProductImage("L" + productImage.getProductImage());
+
+ this.removeImage.removeProductImage(large);
+
+ ProductImage small = new ProductImage();
+ small.setProduct(productImage.getProduct());
+ small.setProductImage("S" + productImage.getProductImage());
+
+ this.removeImage.removeProductImage(small);*/
+
+ }
+
+
+ @Override
+ public void removeProductImages(Product product) throws ServiceException {
+
+ this.removeImage.removeProductImages(product);
+
+ }
+
+
+ @Override
+ public void removeImages(final String merchantStoreCode) throws ServiceException {
+
+ this.removeImage.removeImages(merchantStoreCode);
+
+ }
+
+
+ public ProductImagePut getUploadImage() {
+ return uploadImage;
+ }
+
+
+ public void setUploadImage(ProductImagePut uploadImage) {
+ this.uploadImage = uploadImage;
+ }
+
+
+
+
+ public ProductImageGet getGetImage() {
+ return getImage;
+ }
+
+
+ public void setGetImage(ProductImageGet getImage) {
+ this.getImage = getImage;
+ }
+
+
+ @Override
+ public OutputContentFile getProductImage(String merchantStoreCode,
+ String productCode, String imageName) throws ServiceException {
+ return getImage.getProductImage(merchantStoreCode, productCode, imageName);
+ }
+
+
+
+ @Override
+ public OutputContentFile getProductImage(String merchantStoreCode,
+ String productCode, String imageName, ProductImageSize size)
+ throws ServiceException {
+ return getImage.getProductImage(merchantStoreCode, productCode, imageName, size);
+ }
+
+
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductImageGet.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductImageGet.java
index 7c3b874..6ba96b7 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductImageGet.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductImageGet.java
@@ -1,28 +1,28 @@
-package com.salesmanager.core.business.modules.cms.product;
-
-import java.util.List;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.modules.cms.common.ImageGet;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.file.ProductImageSize;
-import com.salesmanager.core.model.catalog.product.image.ProductImage;
-import com.salesmanager.core.model.content.OutputContentFile;
-
-public interface ProductImageGet extends ImageGet{
-
- /**
- * Used for accessing the path directly
- * @param merchantStoreCode
- * @param product
- * @param imageName
- * @return
- * @throws ServiceException
- */
- public OutputContentFile getProductImage(final String merchantStoreCode, final String productCode, final String imageName) throws ServiceException;
- public OutputContentFile getProductImage(final String merchantStoreCode, final String productCode, final String imageName, final ProductImageSize size) throws ServiceException;
- public OutputContentFile getProductImage(ProductImage productImage) throws ServiceException;
- public List<OutputContentFile> getImages(Product product) throws ServiceException;
-
-
-}
+package com.salesmanager.core.business.modules.cms.product;
+
+import java.util.List;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.modules.cms.common.ImageGet;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.file.ProductImageSize;
+import com.salesmanager.core.model.catalog.product.image.ProductImage;
+import com.salesmanager.core.model.content.OutputContentFile;
+
+public interface ProductImageGet extends ImageGet{
+
+ /**
+ * Used for accessing the path directly
+ * @param merchantStoreCode
+ * @param product
+ * @param imageName
+ * @return
+ * @throws ServiceException
+ */
+ public OutputContentFile getProductImage(final String merchantStoreCode, final String productCode, final String imageName) throws ServiceException;
+ public OutputContentFile getProductImage(final String merchantStoreCode, final String productCode, final String imageName, final ProductImageSize size) throws ServiceException;
+ public OutputContentFile getProductImage(ProductImage productImage) throws ServiceException;
+ public List<OutputContentFile> getImages(Product product) throws ServiceException;
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductImagePut.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductImagePut.java
index 60d4837..c969cd3 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductImagePut.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductImagePut.java
@@ -1,14 +1,14 @@
-package com.salesmanager.core.business.modules.cms.product;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.model.catalog.product.image.ProductImage;
-import com.salesmanager.core.model.content.ImageContentFile;
-
-
-public interface ProductImagePut {
-
-
- public void addProductImage(ProductImage productImage, ImageContentFile contentImage) throws ServiceException;
-
-
-}
+package com.salesmanager.core.business.modules.cms.product;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.model.catalog.product.image.ProductImage;
+import com.salesmanager.core.model.content.ImageContentFile;
+
+
+public interface ProductImagePut {
+
+
+ public void addProductImage(ProductImage productImage, ImageContentFile contentImage) throws ServiceException;
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductImageRemove.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductImageRemove.java
index a928d0e..f8ed670 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductImageRemove.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/cms/product/ProductImageRemove.java
@@ -1,17 +1,17 @@
-package com.salesmanager.core.business.modules.cms.product;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.modules.cms.common.ImageRemove;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.image.ProductImage;
-
-
-public interface ProductImageRemove extends ImageRemove {
-
-
- public void removeProductImage(ProductImage productImage) throws ServiceException;
- public void removeProductImages(Product product) throws ServiceException;
-
-
-
-}
+package com.salesmanager.core.business.modules.cms.product;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.modules.cms.common.ImageRemove;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.image.ProductImage;
+
+
+public interface ProductImageRemove extends ImageRemove {
+
+
+ public void removeProductImage(ProductImage productImage) throws ServiceException;
+ public void removeProductImages(Product product) throws ServiceException;
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/email/Email.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/email/Email.java
index fbd5328..f51aacd 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/email/Email.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/email/Email.java
@@ -1,70 +1,70 @@
-package com.salesmanager.core.business.modules.email;
-
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Map;
-
-public class Email implements Serializable {
-
-
- /**
- *
- */
- private static final long serialVersionUID = 6481794982612826257L;
- private String from;
- private String fromEmail;
- private String to;
- private String subject;
- private String templateName;
-
- private Map<String,String> templateTokens = new HashMap<String,String>();
-
- public String getFrom() {
- return from;
- }
-
- public void setFrom(String from) {
- this.from = from;
- }
-
- public String getTo() {
- return to;
- }
-
- public void setTo(String to) {
- this.to = to;
- }
-
- public String getSubject() {
- return subject;
- }
-
- public void setSubject(String subject) {
- this.subject = subject;
- }
-
- public String getTemplateName() {
- return templateName;
- }
-
- public void setTemplateName(String templateName) {
- this.templateName = templateName;
- }
-
- public Map<String, String> getTemplateTokens() {
- return templateTokens;
- }
-
- public void setTemplateTokens(Map<String, String> templateTokens) {
- this.templateTokens = templateTokens;
- }
-
- public void setFromEmail(String fromEmail) {
- this.fromEmail = fromEmail;
- }
-
- public String getFromEmail() {
- return fromEmail;
- }
-
-}
+package com.salesmanager.core.business.modules.email;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+
+public class Email implements Serializable {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 6481794982612826257L;
+ private String from;
+ private String fromEmail;
+ private String to;
+ private String subject;
+ private String templateName;
+
+ private Map<String,String> templateTokens = new HashMap<String,String>();
+
+ public String getFrom() {
+ return from;
+ }
+
+ public void setFrom(String from) {
+ this.from = from;
+ }
+
+ public String getTo() {
+ return to;
+ }
+
+ public void setTo(String to) {
+ this.to = to;
+ }
+
+ public String getSubject() {
+ return subject;
+ }
+
+ public void setSubject(String subject) {
+ this.subject = subject;
+ }
+
+ public String getTemplateName() {
+ return templateName;
+ }
+
+ public void setTemplateName(String templateName) {
+ this.templateName = templateName;
+ }
+
+ public Map<String, String> getTemplateTokens() {
+ return templateTokens;
+ }
+
+ public void setTemplateTokens(Map<String, String> templateTokens) {
+ this.templateTokens = templateTokens;
+ }
+
+ public void setFromEmail(String fromEmail) {
+ this.fromEmail = fromEmail;
+ }
+
+ public String getFromEmail() {
+ return fromEmail;
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/email/EmailConfig.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/email/EmailConfig.java
index ee29976..ec8ee92 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/email/EmailConfig.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/email/EmailConfig.java
@@ -1,113 +1,113 @@
-package com.salesmanager.core.business.modules.email;
-
-import org.json.simple.JSONAware;
-import org.json.simple.JSONObject;
-
-public class EmailConfig implements JSONAware {
-
- private String host;
- private String port;
- private String protocol;
- private String username;
- private String password;
- private boolean smtpAuth = false;
- private boolean starttls = false;
-
- private String emailTemplatesPath = null;
-
- @SuppressWarnings("unchecked")
- @Override
- public String toJSONString() {
- JSONObject data = new JSONObject();
- data.put("host", this.getHost());
- data.put("port", this.getPort());
- data.put("protocol", this.getProtocol());
- data.put("username", this.getUsername());
- data.put("smtpAuth", this.isSmtpAuth());
- data.put("starttls", this.isStarttls());
- data.put("password", this.getPassword());
- return data.toJSONString();
- }
-
-
-
- public boolean isSmtpAuth() {
- return smtpAuth;
- }
- public void setSmtpAuth(boolean smtpAuth) {
- this.smtpAuth = smtpAuth;
- }
- public boolean isStarttls() {
- return starttls;
- }
- public void setStarttls(boolean starttls) {
- this.starttls = starttls;
- }
- public void setEmailTemplatesPath(String emailTemplatesPath) {
- this.emailTemplatesPath = emailTemplatesPath;
- }
- public String getEmailTemplatesPath() {
- return emailTemplatesPath;
- }
-
-
-
- public String getHost() {
- return host;
- }
-
-
-
- public void setHost(String host) {
- this.host = host;
- }
-
-
-
- public String getPort() {
- return port;
- }
-
-
-
- public void setPort(String port) {
- this.port = port;
- }
-
-
-
- public String getProtocol() {
- return protocol;
- }
-
-
-
- public void setProtocol(String protocol) {
- this.protocol = protocol;
- }
-
-
-
- public String getUsername() {
- return username;
- }
-
-
-
- public void setUsername(String username) {
- this.username = username;
- }
-
-
-
- public String getPassword() {
- return password;
- }
-
-
-
- public void setPassword(String password) {
- this.password = password;
- }
-
-}
+package com.salesmanager.core.business.modules.email;
+
+import org.json.simple.JSONAware;
+import org.json.simple.JSONObject;
+
+public class EmailConfig implements JSONAware {
+
+ private String host;
+ private String port;
+ private String protocol;
+ private String username;
+ private String password;
+ private boolean smtpAuth = false;
+ private boolean starttls = false;
+
+ private String emailTemplatesPath = null;
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public String toJSONString() {
+ JSONObject data = new JSONObject();
+ data.put("host", this.getHost());
+ data.put("port", this.getPort());
+ data.put("protocol", this.getProtocol());
+ data.put("username", this.getUsername());
+ data.put("smtpAuth", this.isSmtpAuth());
+ data.put("starttls", this.isStarttls());
+ data.put("password", this.getPassword());
+ return data.toJSONString();
+ }
+
+
+
+ public boolean isSmtpAuth() {
+ return smtpAuth;
+ }
+ public void setSmtpAuth(boolean smtpAuth) {
+ this.smtpAuth = smtpAuth;
+ }
+ public boolean isStarttls() {
+ return starttls;
+ }
+ public void setStarttls(boolean starttls) {
+ this.starttls = starttls;
+ }
+ public void setEmailTemplatesPath(String emailTemplatesPath) {
+ this.emailTemplatesPath = emailTemplatesPath;
+ }
+ public String getEmailTemplatesPath() {
+ return emailTemplatesPath;
+ }
+
+
+
+ public String getHost() {
+ return host;
+ }
+
+
+
+ public void setHost(String host) {
+ this.host = host;
+ }
+
+
+
+ public String getPort() {
+ return port;
+ }
+
+
+
+ public void setPort(String port) {
+ this.port = port;
+ }
+
+
+
+ public String getProtocol() {
+ return protocol;
+ }
+
+
+
+ public void setProtocol(String protocol) {
+ this.protocol = protocol;
+ }
+
+
+
+ public String getUsername() {
+ return username;
+ }
+
+
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+
+
+ public String getPassword() {
+ return password;
+ }
+
+
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/email/HtmlEmailSender.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/email/HtmlEmailSender.java
index 7f5cfe5..a046356 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/email/HtmlEmailSender.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/email/HtmlEmailSender.java
@@ -1,10 +1,10 @@
-package com.salesmanager.core.business.modules.email;
-
-
-public interface HtmlEmailSender {
-
- public void send(final Email email) throws Exception;
-
- public void setEmailConfig(EmailConfig emailConfig);
-
-}
+package com.salesmanager.core.business.modules.email;
+
+
+public interface HtmlEmailSender {
+
+ public void send(final Email email) throws Exception;
+
+ public void setEmailConfig(EmailConfig emailConfig);
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/email/HtmlEmailSenderImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/email/HtmlEmailSenderImpl.java
index deb4317..3cbe08a 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/email/HtmlEmailSenderImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/email/HtmlEmailSenderImpl.java
@@ -1,195 +1,195 @@
-package com.salesmanager.core.business.modules.email;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.StringWriter;
-import java.util.Map;
-import java.util.Properties;
-
-import javax.mail.BodyPart;
-import javax.mail.Message;
-import javax.mail.MessagingException;
-import javax.mail.Multipart;
-import javax.mail.internet.InternetAddress;
-import javax.mail.internet.MimeBodyPart;
-import javax.mail.internet.MimeMessage;
-import javax.mail.internet.MimeMultipart;
-
-import org.springframework.mail.MailPreparationException;
-import org.springframework.mail.javamail.JavaMailSender;
-import org.springframework.mail.javamail.JavaMailSenderImpl;
-import org.springframework.mail.javamail.MimeMessagePreparator;
-
-import freemarker.template.Configuration;
-import freemarker.template.Template;
-import freemarker.template.TemplateException;
-
-
-public class HtmlEmailSenderImpl implements HtmlEmailSender {
-
- private static final String CHARSET = "UTF-8";
- private Configuration freemarkerMailConfiguration;
- private JavaMailSender mailSender;
- private EmailConfig emailConfig;
-
- private final static String TEMPLATE_PATH = "templates/email";
-
- @Override
- public void send(Email email)
- throws Exception {
-
- final String eml = email.getFrom();
- final String from = email.getFromEmail();
- final String to = email.getTo();
- final String subject = email.getSubject();
- final String tmpl = email.getTemplateName();
- final Map<String,String> templateTokens = email.getTemplateTokens();
-
- MimeMessagePreparator preparator = new MimeMessagePreparator() {
- public void prepare(MimeMessage mimeMessage)
- throws MessagingException, IOException {
-
- JavaMailSenderImpl impl = (JavaMailSenderImpl)mailSender;
- // if email configuration is present in Database, use the same
- if(emailConfig != null) {
- impl.setProtocol(emailConfig.getProtocol());
- impl.setHost(emailConfig.getHost());
- impl.setPort(Integer.parseInt(emailConfig.getPort()));
- impl.setUsername(emailConfig.getUsername());
- impl.setPassword(emailConfig.getPassword());
-
- Properties prop = new Properties();
- prop.put("mail.smtp.auth", emailConfig.isSmtpAuth());
- prop.put("mail.smtp.starttls.enable", emailConfig.isStarttls());
- impl.setJavaMailProperties(prop);
- }
-
- mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
-
- InternetAddress inetAddress = new InternetAddress();
-
- inetAddress.setPersonal(eml);
- inetAddress.setAddress(from);
-
- mimeMessage.setFrom(inetAddress);
- mimeMessage.setSubject(subject);
-
- Multipart mp = new MimeMultipart("alternative");
-
- // Create a "text" Multipart message
- BodyPart textPart = new MimeBodyPart();
- freemarkerMailConfiguration.setClassForTemplateLoading(HtmlEmailSenderImpl.class, "/");
- Template textTemplate = freemarkerMailConfiguration.getTemplate(new StringBuilder(TEMPLATE_PATH).append("").append("/").append(tmpl).toString());
- final StringWriter textWriter = new StringWriter();
- try {
- textTemplate.process(templateTokens, textWriter);
- } catch (TemplateException e) {
- throw new MailPreparationException(
- "Can't generate text mail", e);
- }
- textPart.setDataHandler(new javax.activation.DataHandler(
- new javax.activation.DataSource() {
- public InputStream getInputStream()
- throws IOException {
- //return new StringBufferInputStream(textWriter
- // .toString());
- return new ByteArrayInputStream(textWriter
- .toString().getBytes(CHARSET));
- }
-
- public OutputStream getOutputStream()
- throws IOException {
- throw new IOException("Read-only data");
- }
-
- public String getContentType() {
- return "text/plain";
- }
-
- public String getName() {
- return "main";
- }
- }));
- mp.addBodyPart(textPart);
-
- // Create a "HTML" Multipart message
- Multipart htmlContent = new MimeMultipart("related");
- BodyPart htmlPage = new MimeBodyPart();
- freemarkerMailConfiguration.setClassForTemplateLoading(HtmlEmailSenderImpl.class, "/");
- Template htmlTemplate = freemarkerMailConfiguration.getTemplate(new StringBuilder(TEMPLATE_PATH).append("").append("/").append(tmpl).toString());
- final StringWriter htmlWriter = new StringWriter();
- try {
- htmlTemplate.process(templateTokens, htmlWriter);
- } catch (TemplateException e) {
- throw new MailPreparationException(
- "Can't generate HTML mail", e);
- }
- htmlPage.setDataHandler(new javax.activation.DataHandler(
- new javax.activation.DataSource() {
- public InputStream getInputStream()
- throws IOException {
- //return new StringBufferInputStream(htmlWriter
- // .toString());
- return new ByteArrayInputStream(textWriter
- .toString().getBytes(CHARSET));
- }
-
- public OutputStream getOutputStream()
- throws IOException {
- throw new IOException("Read-only data");
- }
-
- public String getContentType() {
- return "text/html";
- }
-
- public String getName() {
- return "main";
- }
- }));
- htmlContent.addBodyPart(htmlPage);
- BodyPart htmlPart = new MimeBodyPart();
- htmlPart.setContent(htmlContent);
- mp.addBodyPart(htmlPart);
-
- mimeMessage.setContent(mp);
-
- // if(attachment!=null) {
- // MimeMessageHelper messageHelper = new
- // MimeMessageHelper(mimeMessage, true);
- // messageHelper.addAttachment(attachmentFileName, attachment);
- // }
-
- }
- };
-
- mailSender.send(preparator);
- }
-
- public Configuration getFreemarkerMailConfiguration() {
- return freemarkerMailConfiguration;
- }
-
- public void setFreemarkerMailConfiguration(Configuration freemarkerMailConfiguration) {
- this.freemarkerMailConfiguration = freemarkerMailConfiguration;
- }
-
- public JavaMailSender getMailSender() {
- return mailSender;
- }
-
- public void setMailSender(JavaMailSender mailSender) {
- this.mailSender = mailSender;
- }
-
- public EmailConfig getEmailConfig() {
- return emailConfig;
- }
-
- public void setEmailConfig(EmailConfig emailConfig) {
- this.emailConfig = emailConfig;
- }
-
-}
+package com.salesmanager.core.business.modules.email;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.StringWriter;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.mail.BodyPart;
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.Multipart;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeBodyPart;
+import javax.mail.internet.MimeMessage;
+import javax.mail.internet.MimeMultipart;
+
+import org.springframework.mail.MailPreparationException;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.mail.javamail.JavaMailSenderImpl;
+import org.springframework.mail.javamail.MimeMessagePreparator;
+
+import freemarker.template.Configuration;
+import freemarker.template.Template;
+import freemarker.template.TemplateException;
+
+
+public class HtmlEmailSenderImpl implements HtmlEmailSender {
+
+ private static final String CHARSET = "UTF-8";
+ private Configuration freemarkerMailConfiguration;
+ private JavaMailSender mailSender;
+ private EmailConfig emailConfig;
+
+ private final static String TEMPLATE_PATH = "templates/email";
+
+ @Override
+ public void send(Email email)
+ throws Exception {
+
+ final String eml = email.getFrom();
+ final String from = email.getFromEmail();
+ final String to = email.getTo();
+ final String subject = email.getSubject();
+ final String tmpl = email.getTemplateName();
+ final Map<String,String> templateTokens = email.getTemplateTokens();
+
+ MimeMessagePreparator preparator = new MimeMessagePreparator() {
+ public void prepare(MimeMessage mimeMessage)
+ throws MessagingException, IOException {
+
+ JavaMailSenderImpl impl = (JavaMailSenderImpl)mailSender;
+ // if email configuration is present in Database, use the same
+ if(emailConfig != null) {
+ impl.setProtocol(emailConfig.getProtocol());
+ impl.setHost(emailConfig.getHost());
+ impl.setPort(Integer.parseInt(emailConfig.getPort()));
+ impl.setUsername(emailConfig.getUsername());
+ impl.setPassword(emailConfig.getPassword());
+
+ Properties prop = new Properties();
+ prop.put("mail.smtp.auth", emailConfig.isSmtpAuth());
+ prop.put("mail.smtp.starttls.enable", emailConfig.isStarttls());
+ impl.setJavaMailProperties(prop);
+ }
+
+ mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
+
+ InternetAddress inetAddress = new InternetAddress();
+
+ inetAddress.setPersonal(eml);
+ inetAddress.setAddress(from);
+
+ mimeMessage.setFrom(inetAddress);
+ mimeMessage.setSubject(subject);
+
+ Multipart mp = new MimeMultipart("alternative");
+
+ // Create a "text" Multipart message
+ BodyPart textPart = new MimeBodyPart();
+ freemarkerMailConfiguration.setClassForTemplateLoading(HtmlEmailSenderImpl.class, "/");
+ Template textTemplate = freemarkerMailConfiguration.getTemplate(new StringBuilder(TEMPLATE_PATH).append("").append("/").append(tmpl).toString());
+ final StringWriter textWriter = new StringWriter();
+ try {
+ textTemplate.process(templateTokens, textWriter);
+ } catch (TemplateException e) {
+ throw new MailPreparationException(
+ "Can't generate text mail", e);
+ }
+ textPart.setDataHandler(new javax.activation.DataHandler(
+ new javax.activation.DataSource() {
+ public InputStream getInputStream()
+ throws IOException {
+ //return new StringBufferInputStream(textWriter
+ // .toString());
+ return new ByteArrayInputStream(textWriter
+ .toString().getBytes(CHARSET));
+ }
+
+ public OutputStream getOutputStream()
+ throws IOException {
+ throw new IOException("Read-only data");
+ }
+
+ public String getContentType() {
+ return "text/plain";
+ }
+
+ public String getName() {
+ return "main";
+ }
+ }));
+ mp.addBodyPart(textPart);
+
+ // Create a "HTML" Multipart message
+ Multipart htmlContent = new MimeMultipart("related");
+ BodyPart htmlPage = new MimeBodyPart();
+ freemarkerMailConfiguration.setClassForTemplateLoading(HtmlEmailSenderImpl.class, "/");
+ Template htmlTemplate = freemarkerMailConfiguration.getTemplate(new StringBuilder(TEMPLATE_PATH).append("").append("/").append(tmpl).toString());
+ final StringWriter htmlWriter = new StringWriter();
+ try {
+ htmlTemplate.process(templateTokens, htmlWriter);
+ } catch (TemplateException e) {
+ throw new MailPreparationException(
+ "Can't generate HTML mail", e);
+ }
+ htmlPage.setDataHandler(new javax.activation.DataHandler(
+ new javax.activation.DataSource() {
+ public InputStream getInputStream()
+ throws IOException {
+ //return new StringBufferInputStream(htmlWriter
+ // .toString());
+ return new ByteArrayInputStream(textWriter
+ .toString().getBytes(CHARSET));
+ }
+
+ public OutputStream getOutputStream()
+ throws IOException {
+ throw new IOException("Read-only data");
+ }
+
+ public String getContentType() {
+ return "text/html";
+ }
+
+ public String getName() {
+ return "main";
+ }
+ }));
+ htmlContent.addBodyPart(htmlPage);
+ BodyPart htmlPart = new MimeBodyPart();
+ htmlPart.setContent(htmlContent);
+ mp.addBodyPart(htmlPart);
+
+ mimeMessage.setContent(mp);
+
+ // if(attachment!=null) {
+ // MimeMessageHelper messageHelper = new
+ // MimeMessageHelper(mimeMessage, true);
+ // messageHelper.addAttachment(attachmentFileName, attachment);
+ // }
+
+ }
+ };
+
+ mailSender.send(preparator);
+ }
+
+ public Configuration getFreemarkerMailConfiguration() {
+ return freemarkerMailConfiguration;
+ }
+
+ public void setFreemarkerMailConfiguration(Configuration freemarkerMailConfiguration) {
+ this.freemarkerMailConfiguration = freemarkerMailConfiguration;
+ }
+
+ public JavaMailSender getMailSender() {
+ return mailSender;
+ }
+
+ public void setMailSender(JavaMailSender mailSender) {
+ this.mailSender = mailSender;
+ }
+
+ public EmailConfig getEmailConfig() {
+ return emailConfig;
+ }
+
+ public void setEmailConfig(EmailConfig emailConfig) {
+ this.emailConfig = emailConfig;
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/IntegrationException.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/IntegrationException.java
index e1b7ea8..8374f14 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/IntegrationException.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/IntegrationException.java
@@ -1,62 +1,62 @@
-package com.salesmanager.core.business.modules.integration;
-
-import java.util.List;
-
-import com.salesmanager.core.business.exception.ServiceException;
-
-
-public class IntegrationException extends ServiceException {
-
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public static final int ERROR_VALIDATION_SAVE = 100;
- public static final int TRANSACTION_EXCEPTION = 99;
-
- private List<String> errorFields;
-
- private int errorCode = 0;
-
- public int getErrorCode() {
- return errorCode;
- }
-
- public void setErrorCode(int errorCode) {
- this.errorCode = errorCode;
- }
-
- public IntegrationException(Exception e) {
- super(e);
- }
-
- public IntegrationException(String message, Exception e) {
- super(message,e);
- }
-
- public IntegrationException(int code, String message) {
-
- super(message);
- this.errorCode = code;
- }
-
- public IntegrationException(int code) {
-
- this.errorCode = code;
- }
-
- public IntegrationException(String message) {
- super(message);
- }
-
- public void setErrorFields(List<String> errorFields) {
- this.errorFields = errorFields;
- }
-
- public List<String> getErrorFields() {
- return errorFields;
- }
-
-}
+package com.salesmanager.core.business.modules.integration;
+
+import java.util.List;
+
+import com.salesmanager.core.business.exception.ServiceException;
+
+
+public class IntegrationException extends ServiceException {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public static final int ERROR_VALIDATION_SAVE = 100;
+ public static final int TRANSACTION_EXCEPTION = 99;
+
+ private List<String> errorFields;
+
+ private int errorCode = 0;
+
+ public int getErrorCode() {
+ return errorCode;
+ }
+
+ public void setErrorCode(int errorCode) {
+ this.errorCode = errorCode;
+ }
+
+ public IntegrationException(Exception e) {
+ super(e);
+ }
+
+ public IntegrationException(String message, Exception e) {
+ super(message,e);
+ }
+
+ public IntegrationException(int code, String message) {
+
+ super(message);
+ this.errorCode = code;
+ }
+
+ public IntegrationException(int code) {
+
+ this.errorCode = code;
+ }
+
+ public IntegrationException(String message) {
+ super(message);
+ }
+
+ public void setErrorFields(List<String> errorFields) {
+ this.errorFields = errorFields;
+ }
+
+ public List<String> getErrorFields() {
+ return errorFields;
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/payment/impl/BeanStreamPayment.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/payment/impl/BeanStreamPayment.java
index ba0194b..2ee445c 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/payment/impl/BeanStreamPayment.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/payment/impl/BeanStreamPayment.java
@@ -1,751 +1,751 @@
-package com.salesmanager.core.business.modules.integration.payment.impl;
-
-import java.io.BufferedReader;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.InputStreamReader;
-import java.math.BigDecimal;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.net.URLDecoder;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
-import java.util.UUID;
-
-import javax.inject.Inject;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.salesmanager.core.business.services.system.MerchantLogService;
-import com.salesmanager.core.business.utils.CreditCardUtils;
-import com.salesmanager.core.business.utils.ProductPriceUtils;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.Order;
-import com.salesmanager.core.model.payments.CreditCardPayment;
-import com.salesmanager.core.model.payments.Payment;
-import com.salesmanager.core.model.payments.PaymentType;
-import com.salesmanager.core.model.payments.Transaction;
-import com.salesmanager.core.model.payments.TransactionType;
-import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
-import com.salesmanager.core.model.system.IntegrationConfiguration;
-import com.salesmanager.core.model.system.IntegrationModule;
-import com.salesmanager.core.model.system.MerchantLog;
-import com.salesmanager.core.model.system.ModuleConfig;
-import com.salesmanager.core.modules.integration.IntegrationException;
-import com.salesmanager.core.modules.integration.payment.model.PaymentModule;
-
-
-public class BeanStreamPayment implements PaymentModule {
-
- @Inject
- private ProductPriceUtils productPriceUtils;
-
- @Inject
- private MerchantLogService merchantLogService;
-
-
-
- private static final Logger LOGGER = LoggerFactory.getLogger(BeanStreamPayment.class);
-
- @Override
- public Transaction initTransaction(MerchantStore store, Customer customer,
- BigDecimal amount, Payment payment,
- IntegrationConfiguration configuration, IntegrationModule module)
- throws IntegrationException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public Transaction authorize(MerchantStore store, Customer customer,
- List<ShoppingCartItem> items, BigDecimal amount, Payment payment,
- IntegrationConfiguration configuration, IntegrationModule module)
- throws IntegrationException {
- return processTransaction(store, customer, TransactionType.AUTHORIZE,
- amount,
- payment,
- configuration,
- module);
- }
-
- @Override
- public Transaction capture(MerchantStore store, Customer customer,
- Order order, Transaction capturableTransaction,
- IntegrationConfiguration configuration, IntegrationModule module)
- throws IntegrationException {
-
-
- try {
-
-
-
- //authorize a preauth
-
-
- String trnID = capturableTransaction.getTransactionDetails().get("TRANSACTIONID");
-
- String amnt = productPriceUtils.getAdminFormatedAmount(store, order.getTotal());
-
- /**
- merchant_id=123456789&requestType=BACKEND
- &trnType=PAC&username=user1234&password=pass1234&trnID=1000
- 2115 --> requires also adjId [not documented]
- **/
-
- StringBuilder messageString = new StringBuilder();
- messageString.append("requestType=BACKEND&");
- messageString.append("merchant_id=").append(configuration.getIntegrationKeys().get("merchantid")).append("&");
- messageString.append("trnType=").append("PAC").append("&");
- messageString.append("username=").append(configuration.getIntegrationKeys().get("username")).append("&");
- messageString.append("password=").append(configuration.getIntegrationKeys().get("password")).append("&");
- messageString.append("trnAmount=").append(amnt).append("&");
- messageString.append("adjId=").append(trnID).append("&");
- messageString.append("trnID=").append(trnID);
-
- LOGGER.debug("REQUEST SENT TO BEANSTREAM -> " + messageString.toString());
-
-
-
- Transaction response = this.sendTransaction(null, store, messageString.toString(), "PAC", TransactionType.CAPTURE, PaymentType.CREDITCARD, order.getTotal(), configuration, module);
-
- return response;
-
- } catch(Exception e) {
-
- if(e instanceof IntegrationException)
- throw (IntegrationException)e;
- throw new IntegrationException("Error while processing BeanStream transaction",e);
-
- }
-
- }
-
- @Override
- public Transaction authorizeAndCapture(MerchantStore store, Customer customer,
- List<ShoppingCartItem> items, BigDecimal amount, Payment payment,
- IntegrationConfiguration configuration, IntegrationModule module)
- throws IntegrationException {
- return processTransaction(
- store,
- customer,
- TransactionType.AUTHORIZECAPTURE,
- amount,
- payment,
- configuration,
- module);
- }
-
- @Override
- public Transaction refund(boolean partial, MerchantStore store, Transaction transaction,
- Order order, BigDecimal amount,
- IntegrationConfiguration configuration, IntegrationModule module)
- throws IntegrationException {
-
-
-
-
- HttpURLConnection conn = null;
-
- try {
-
-
- boolean bSandbox = false;
- if (configuration.getEnvironment().equals("TEST")) {// sandbox
- bSandbox = true;
- }
-
- String server = "";
-
-
- ModuleConfig configs = module.getModuleConfigs().get("PROD");
-
- if (bSandbox == true) {
- configs = module.getModuleConfigs().get("TEST");
- }
-
- if(configs==null) {
- throw new IntegrationException("Module not configured for TEST or PROD");
- }
-
-
- server = new StringBuffer().append(
-
- configs.getScheme()).append("://")
- .append(configs.getHost())
- .append(":")
- .append(configs.getPort())
- .append(configs.getUri()).toString();
-
- String trnID = transaction.getTransactionDetails().get("TRANSACTIONID");
-
- String amnt = productPriceUtils.getAdminFormatedAmount(store, amount);
-
- /**
- merchant_id=123456789&requestType=BACKEND
- &trnType=R&username=user1234&password=pass1234
- &trnOrderNumber=1234&trnAmount=1.00&adjId=1000
- 2115
- **/
- StringBuilder messageString = new StringBuilder();
-
-
-
- messageString.append("requestType=BACKEND&");
- messageString.append("merchant_id=").append(configuration.getIntegrationKeys().get("merchantid")).append("&");
- messageString.append("trnType=").append("R").append("&");
- messageString.append("username=").append(configuration.getIntegrationKeys().get("username")).append("&");
- messageString.append("password=").append(configuration.getIntegrationKeys().get("password")).append("&");
- messageString.append("trnOrderNumber=").append(transaction.getTransactionDetails().get("TRNORDERNUMBER")).append("&");
- messageString.append("trnAmount=").append(amnt).append("&");
- messageString.append("adjId=").append(trnID);
-
- LOGGER.debug("REQUEST SENT TO BEANSTREAM -> " + messageString.toString());
-
-
-
-
- URL postURL = new URL(server.toString());
- conn = (HttpURLConnection) postURL.openConnection();
-
-
-
-
- Transaction response = this.sendTransaction(null, store, messageString.toString(), "R", TransactionType.REFUND, PaymentType.CREDITCARD, amount, configuration, module);
-
- return response;
-
- } catch(Exception e) {
-
- if(e instanceof IntegrationException)
- throw (IntegrationException)e;
- throw new IntegrationException("Error while processing BeanStream transaction",e);
-
- } finally {
-
-
- if (conn != null) {
- try {
- conn.disconnect();
- } catch (Exception ignore) {
- // TODO: handle exception
- }
- }
- }
-
-
-
- }
-
-
- private Transaction sendTransaction(
- String orderNumber,
- MerchantStore store,
- String transaction,
- String beanstreamType,
- TransactionType transactionType,
- PaymentType paymentType,
- BigDecimal amount,
- IntegrationConfiguration configuration,
- IntegrationModule module
- ) throws IntegrationException {
-
- String agent = "Mozilla/4.0";
- String respText = "";
- Map<String,String> nvp = null;
- DataOutputStream output = null;
- DataInputStream in = null;
- BufferedReader is = null;
- HttpURLConnection conn =null;
- try {
-
- //transaction = "requestType=BACKEND&merchant_id=300200260&trnType=P&username=carlito&password=shopizer001&orderNumber=caa71106-7e3f-4975-a657-a35904dc32a0&trnCardOwner=Carl Samson&trnCardNumber=5100000020002000&trnExpMonth=10&trnExpYear=14&trnCardCvd=123&trnAmount=77.01&ordName=Carl S&ordAddress1=358 Du Languedoc&ordCity=Victoria&ordProvince=BC&ordPostalCode=V8T2E7&ordCountry=CA&ordPhoneNumber=(444) 555-6666&ordEmailAddress=csamson777@yahoo.com";
- /**
- requestType=BACKEND&merchant_id=300200260
- &trnType=P
- &username=carlito&password=shopizer001
- &orderNumber=caa71106-7e3f-4975-a657-a35904dc32a0
- &trnCardOwner=Carl Samson
- &trnCardNumber=5100000020002000
- &trnExpMonth=10
- &trnExpYear=14
- &trnCardCvd=123
- &trnAmount=77.01
- &ordName=Carl S
- &ordAddress1=378 Du Languedoc
- &ordCity=Boucherville
- &ordProvince=QC
- &ordPostalCode=J4B8J9
- &ordCountry=CA
- &ordPhoneNumber=(444) 555-6666
- &ordEmailAddress=test@yahoo.com
- **/
-
- /**
- merchant_id=123456789&requestType=BACKEND
- &trnType=P&trnOrderNumber=1234TEST&trnAmount=5.00&trnCardOwner=Joe+Test
- &trnCardNumber=4030000010001234
- &trnExpMonth=10
- &trnExpYear=16
- &ordName=Joe+Test
- &ordAddress1=123+Test+Street
- &ordCity=Victoria
- &ordProvince=BC
- &ordCountry=CA
- &ordPostalCode=V8T2E7
- &ordPhoneNumber=5555555555
- &ordEmailAddress=joe%40testemail.com
- **/
-
-
-
- boolean bSandbox = false;
- if (configuration.getEnvironment().equals("TEST")) {// sandbox
- bSandbox = true;
- }
-
- String server = "";
-
- ModuleConfig configs = module.getModuleConfigs().get("PROD");
-
- if (bSandbox == true) {
- configs = module.getModuleConfigs().get("TEST");
- }
-
- if(configs==null) {
- throw new IntegrationException("Module not configured for TEST or PROD");
- }
-
-
- server = new StringBuffer().append(
-
- configs.getScheme()).append("://")
- .append(configs.getHost())
- .append(":")
- .append(configs.getPort())
- .append(configs.getUri()).toString();
-
-
-
- URL postURL = new URL(server.toString());
- conn = (HttpURLConnection) postURL.openConnection();
-
-
- // Set connection parameters. We need to perform input and output,
- // so set both as true.
- conn.setDoInput(true);
- conn.setDoOutput(true);
-
- // Set the content type we are POSTing. We impersonate it as
- // encoded form data
- conn.setRequestProperty("Content-Type",
- "application/x-www-form-urlencoded");
- conn.setRequestProperty("User-Agent", agent);
-
- conn.setRequestProperty("Content-Length", String
- .valueOf(transaction.length()));
- conn.setRequestMethod("POST");
-
- // get the output stream to POST to.
- output = new DataOutputStream(conn.getOutputStream());
- output.writeBytes(transaction);
- output.flush();
-
-
- // Read input from the input stream.
- in = new DataInputStream(conn.getInputStream());
- int rc = conn.getResponseCode();
- if (rc != -1) {
- is = new BufferedReader(new InputStreamReader(conn
- .getInputStream()));
- String _line = null;
- while (((_line = is.readLine()) != null)) {
- respText = respText + _line;
- }
-
- LOGGER.debug("BeanStream response -> " + respText.trim());
-
- nvp = formatUrlResponse(respText.trim());
- } else {
- throw new IntegrationException("Invalid response from BeanStream, return code is " + rc);
- }
-
- //check
- //trnApproved=1&trnId=10003067&messageId=1&messageText=Approved&trnOrderNumber=E40089&authCode=TEST&errorType=N&errorFields=
-
- String transactionApproved = (String)nvp.get("TRNAPPROVED");
- String transactionId = (String)nvp.get("TRNID");
- String messageId = (String)nvp.get("MESSAGEID");
- String messageText = (String)nvp.get("MESSAGETEXT");
- String orderId = (String)nvp.get("TRNORDERNUMBER");
- String authCode = (String)nvp.get("AUTHCODE");
- String errorType = (String)nvp.get("ERRORTYPE");
- String errorFields = (String)nvp.get("ERRORFIELDS");
- if(!StringUtils.isBlank(orderNumber)) {
- nvp.put("INTERNALORDERID", orderNumber);
- }
-
- if(StringUtils.isBlank(transactionApproved)) {
- throw new IntegrationException("Required field transactionApproved missing from BeanStream response");
- }
-
- //errors
- if(transactionApproved.equals("0")) {
-
- merchantLogService.save(
- new MerchantLog(store,
- "Can't process BeanStream message "
- + messageText + " return code id " + messageId));
-
- IntegrationException te = new IntegrationException(
- "Can't process BeanStream message " + messageText);
- te.setExceptionType(IntegrationException.EXCEPTION_PAYMENT_DECLINED);
- te.setMessageCode("message.payment.beanstream." + messageId);
- te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
- throw te;
- }
-
- //create transaction object
-
- //return parseResponse(type,transaction,respText,nvp,order);
- return this.parseResponse(transactionType, paymentType, nvp, amount);
-
-
- } catch(Exception e) {
- if(e instanceof IntegrationException) {
- throw (IntegrationException)e;
- }
-
- throw new IntegrationException("Error while processing BeanStream transaction",e);
-
- } finally {
- if (is != null) {
- try {
- is.close();
- } catch (Exception ignore) {
- // TODO: handle exception
- }
- }
-
- if (in != null) {
- try {
- in.close();
- } catch (Exception ignore) {
- // TODO: handle exception
- }
- }
-
- if (output != null) {
- try {
- output.close();
- } catch (Exception ignore) {
- // TODO: handle exception
- }
- }
-
- if (conn != null) {
- try {
- conn.disconnect();
- } catch (Exception ignore) {
- // TODO: handle exception
- }
- }
-
- }
-
-
- }
-
-
-
- private Transaction processTransaction(MerchantStore store, Customer customer, TransactionType type,
- BigDecimal amount, Payment payment,
- IntegrationConfiguration configuration, IntegrationModule module) throws IntegrationException {
-
-
-
-
-
- boolean bSandbox = false;
- if (configuration.getEnvironment().equals("TEST")) {// sandbox
- bSandbox = true;
- }
-
- String server = "";
-
- ModuleConfig configs = module.getModuleConfigs().get("PROD");
-
- if (bSandbox == true) {
- configs = module.getModuleConfigs().get("TEST");
- }
-
- if(configs==null) {
- throw new IntegrationException("Module not configured for TEST or PROD");
- }
-
-
- server = new StringBuffer().append(
-
- configs.getScheme()).append("://")
- .append(configs.getHost())
- .append(":")
- .append(configs.getPort())
- .append(configs.getUri()).toString();
-
- HttpURLConnection conn = null;
-
- try {
-
- String uniqueId = UUID.randomUUID().toString();//TODO
-
- String orderNumber = uniqueId;
-
- String amnt = productPriceUtils.getAdminFormatedAmount(store, amount);
-
-
- StringBuilder messageString = new StringBuilder();
-
- String transactionType = "P";
- if(type == TransactionType.AUTHORIZE) {
- transactionType = "PA";
- } else if(type == TransactionType.AUTHORIZECAPTURE) {
- transactionType = "P";
- }
-
- CreditCardPayment creditCardPayment = (CreditCardPayment)payment;
-
- messageString.append("requestType=BACKEND&");
- messageString.append("merchant_id=").append(configuration.getIntegrationKeys().get("merchantid")).append("&");
- messageString.append("trnType=").append(transactionType).append("&");
- messageString.append("username=").append(configuration.getIntegrationKeys().get("username")).append("&");
- messageString.append("password=").append(configuration.getIntegrationKeys().get("password")).append("&");
- messageString.append("orderNumber=").append(orderNumber).append("&");
- messageString.append("trnCardOwner=").append(creditCardPayment.getCardOwner()).append("&");
- messageString.append("trnCardNumber=").append(creditCardPayment.getCreditCardNumber()).append("&");
- messageString.append("trnExpMonth=").append(creditCardPayment.getExpirationMonth()).append("&");
- messageString.append("trnExpYear=").append(creditCardPayment.getExpirationYear().substring(2)).append("&");
- messageString.append("trnCardCvd=").append(creditCardPayment.getCredidCardValidationNumber()).append("&");
- messageString.append("trnAmount=").append(amnt).append("&");
-
- StringBuilder nm = new StringBuilder();
- nm.append(customer.getBilling().getFirstName()).append(" ").append(customer.getBilling().getLastName());
-
-
- messageString.append("ordName=").append(nm.toString()).append("&");
- messageString.append("ordAddress1=").append(customer.getBilling().getAddress()).append("&");
- messageString.append("ordCity=").append(customer.getBilling().getCity()).append("&");
-
- String stateProvince = customer.getBilling().getState();
- if(customer.getBilling().getZone()!=null) {
- stateProvince = customer.getBilling().getZone().getCode();
- }
-
- String countryName = customer.getBilling().getCountry().getIsoCode();
-
- messageString.append("ordProvince=").append(stateProvince).append("&");
- messageString.append("ordPostalCode=").append(customer.getBilling().getPostalCode().replaceAll("\\s","")).append("&");
- messageString.append("ordCountry=").append(countryName).append("&");
- messageString.append("ordPhoneNumber=").append(customer.getBilling().getTelephone()).append("&");
- messageString.append("ordEmailAddress=").append(customer.getEmailAddress());
-
-
-
-
- /**
- * purchase (P)
- * -----------
- REQUEST -> merchant_id=123456789&requestType=BACKEND&trnType=P&trnOrderNumber=1234TEST&trnAmount=5.00&trnCardOwner=Joe+Test&trnCardNumber=4030000010001234&trnExpMonth=10&trnExpYear=10&ordName=Joe+Test&ordAddress1=123+Test+Street&ordCity=Victoria&ordProvince=BC&ordCountry=CA&ordPostalCode=V8T2E7&ordPhoneNumber=5555555555&ordEmailAddress=joe%40testemail.com
- RESPONSE-> trnApproved=1&trnId=10003067&messageId=1&messageText=Approved&trnOrderNumber=E40089&authCode=TEST&errorType=N&errorFields=&responseType=T&trnAmount=10%2E00&trnDate=1%2F17%2F2008+11%3A36%3A34+AM&avsProcessed=0&avsId=0&avsResult=0&avsAddrMatch=0&avsPostalMatch=0&avsMessage=Address+Verification+not+performed+for+this+transaction%2E&rspCodeCav=0&rspCavResult=0&rspCodeCredit1=0&rspCodeCredit2=0&rspCodeCredit3=0&rspCodeCredit4=0&rspCodeAddr1=0&rspCodeAddr2=0&rspCodeAddr3=0&rspCodeAddr4=0&rspCodeDob=0&rspCustomerDec=&trnType=P&paymentMethod=CC&ref1=&ref2=&ref3=&ref4=&ref5=
-
- pre authorization (PA)
- ----------------------
-
- Prior to processing a pre-authorization through the API, you must modify the transaction settings in your Beanstream merchant member area to allow for this transaction type.
- - Log in to the Beanstream online member area at www.beanstream.com/admin/sDefault.asp.
- - Navigate to administration - account admin - order settings in the left menu.
- Under the heading �Restrict Internet Transaction Processing Types,� select either of the last two options. The �Purchases or Pre-Authorization Only� option will allow you to process both types of transaction through your web interface. De-selecting the �Restrict Internet Transaction Processing Types� checkbox will allow you to process all types of transactions including returns, voids and pre-auth completions.
-
- capture (PAC) -> requires trnId
- -------------
-
- refund (R)
- -------------
- REQUEST -> merchant_id=123456789&requestType=BACKEND&trnType=R&username=user1234&password=pass1234&trnOrderNumber=1234&trnAmount=1.00&adjId=10002115
- RESPONSE-> trnApproved=1&trnId=10002118&messageId=1&messageText=Approved&trnOrderNumber=1234R&authCode=TEST&errorType=N&errorFields=&responseType=T&trnAmount=1%2E00&trnDate=8%2F17%2F2009+1%3A44%3A56+PM&avsProcessed=0&avsId=0&avsResult=0&avsAddrMatch=0&avsPostalMatch=0&avsMessage=Address+Verification+not+performed+for+this+transaction%2E&cardType=VI&trnType=R&paymentMethod=CC&ref1=&ref2=&ref3=&ref4=&ref5=
-
-
- //notes
- //On receipt of the transaction response, the merchant must display order amount, transaction ID number, bank authorization code (authCode), currency, date and �messageText� to the customer on a confirmation page.
- */
-
-
- //String agent = "Mozilla/4.0";
- //String respText = "";
- //Map nvp = null;
-
-
- /** debug **/
-
-
-
- StringBuffer messageLogString = new StringBuffer();
-
-
- messageLogString.append("requestType=BACKEND&");
- messageLogString.append("merchant_id=").append(configuration.getIntegrationKeys().get("merchantid")).append("&");
- messageLogString.append("trnType=").append(type).append("&");
- messageLogString.append("orderNumber=").append(orderNumber).append("&");
- messageLogString.append("trnCardOwner=").append(creditCardPayment.getCardOwner()).append("&");
- messageLogString.append("trnCardNumber=").append(CreditCardUtils.maskCardNumber(creditCardPayment.getCreditCardNumber())).append("&");
- messageLogString.append("trnExpMonth=").append(creditCardPayment.getExpirationMonth()).append("&");
- messageLogString.append("trnExpYear=").append(creditCardPayment.getExpirationYear()).append("&");
- messageLogString.append("trnCardCvd=").append(creditCardPayment.getCredidCardValidationNumber()).append("&");
- messageLogString.append("trnAmount=").append(amnt).append("&");
-
- messageLogString.append("ordName=").append(nm.toString()).append("&");
- messageLogString.append("ordAddress1=").append(customer.getBilling().getAddress()).append("&");
- messageLogString.append("ordCity=").append(customer.getBilling().getCity()).append("&");
-
-
-
- messageLogString.append("ordProvince=").append(stateProvince).append("&");
- messageLogString.append("ordPostalCode=").append(customer.getBilling().getPostalCode()).append("&");
- messageLogString.append("ordCountry=").append(customer.getBilling().getCountry().getName()).append("&");
- messageLogString.append("ordPhoneNumber=").append(customer.getBilling().getTelephone()).append("&");
- messageLogString.append("ordEmailAddress=").append(customer.getEmailAddress());
-
-
-
-
- /** debug **/
-
-
- LOGGER.debug("REQUEST SENT TO BEANSTREAM -> " + messageLogString.toString());
-
-
- URL postURL = new URL(server.toString());
- conn = (HttpURLConnection) postURL.openConnection();
-
-
-
- Transaction response = this.sendTransaction(orderNumber, store, messageString.toString(), transactionType, type, payment.getPaymentType(), amount, configuration, module);
-
- return response;
-
-
-
- } catch(Exception e) {
-
- if(e instanceof IntegrationException)
- throw (IntegrationException)e;
- throw new IntegrationException("Error while processing BeanStream transaction",e);
-
- } finally {
-
-
- if (conn != null) {
- try {
- conn.disconnect();
- } catch (Exception ignore) {}
- }
- }
-
- }
-
-
-
- private Transaction parseResponse(TransactionType transactionType,
- PaymentType paymentType, Map<String,String> nvp,
- BigDecimal amount) throws Exception {
-
-
- Transaction transaction = new Transaction();
- transaction.setAmount(amount);
- //transaction.setOrder(order);
- transaction.setTransactionDate(new Date());
- transaction.setTransactionType(transactionType);
- transaction.setPaymentType(PaymentType.CREDITCARD);
- transaction.getTransactionDetails().put("TRANSACTIONID", (String)nvp.get("TRNID"));
- transaction.getTransactionDetails().put("TRNAPPROVED", (String)nvp.get("TRNAPPROVED"));
- transaction.getTransactionDetails().put("TRNORDERNUMBER", (String)nvp.get("TRNORDERNUMBER"));
- transaction.getTransactionDetails().put("MESSAGETEXT", (String)nvp.get("MESSAGETEXT"));
- if(nvp.get("INTERNALORDERID")!=null) {
- transaction.getTransactionDetails().put("INTERNALORDERID", (String)nvp.get("INTERNALORDERID"));
- }
- return transaction;
-
- }
-
- private Map formatUrlResponse(String payload) throws Exception {
- HashMap<String,String> nvp = new HashMap<String,String> ();
- StringTokenizer stTok = new StringTokenizer(payload, "&");
- while (stTok.hasMoreTokens()) {
- StringTokenizer stInternalTokenizer = new StringTokenizer(stTok
- .nextToken(), "=");
- if (stInternalTokenizer.countTokens() == 2) {
- String key = URLDecoder.decode(stInternalTokenizer.nextToken(),
- "UTF-8");
- String value = URLDecoder.decode(stInternalTokenizer
- .nextToken(), "UTF-8");
- nvp.put(key.toUpperCase(), value);
- }
- }
- return nvp;
- }
-
- @Override
- public void validateModuleConfiguration(
- IntegrationConfiguration integrationConfiguration,
- MerchantStore store) throws IntegrationException {
-
-
- List<String> errorFields = null;
-
-
- Map<String,String> keys = integrationConfiguration.getIntegrationKeys();
-
- //validate integrationKeys['merchantid']
- if(keys==null || StringUtils.isBlank(keys.get("merchantid"))) {
- errorFields = new ArrayList<String>();
- errorFields.add("merchantid");
- }
-
- //validate integrationKeys['username']
- if(keys==null || StringUtils.isBlank(keys.get("username"))) {
- if(errorFields==null) {
- errorFields = new ArrayList<String>();
- }
- errorFields.add("username");
- }
-
-
- //validate integrationKeys['password']
- if(keys==null || StringUtils.isBlank(keys.get("password"))) {
- if(errorFields==null) {
- errorFields = new ArrayList<String>();
- }
- errorFields.add("password");
- }
-
-
-
- if(errorFields!=null) {
- IntegrationException ex = new IntegrationException(IntegrationException.ERROR_VALIDATION_SAVE);
- ex.setErrorFields(errorFields);
- throw ex;
-
- }
-
-
-
- }
-
-
-
-}
+package com.salesmanager.core.business.modules.integration.payment.impl;
+
+import java.io.BufferedReader;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.InputStreamReader;
+import java.math.BigDecimal;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+import java.util.UUID;
+
+import javax.inject.Inject;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.salesmanager.core.business.services.system.MerchantLogService;
+import com.salesmanager.core.business.utils.CreditCardUtils;
+import com.salesmanager.core.business.utils.ProductPriceUtils;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.payments.CreditCardPayment;
+import com.salesmanager.core.model.payments.Payment;
+import com.salesmanager.core.model.payments.PaymentType;
+import com.salesmanager.core.model.payments.Transaction;
+import com.salesmanager.core.model.payments.TransactionType;
+import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
+import com.salesmanager.core.model.system.IntegrationConfiguration;
+import com.salesmanager.core.model.system.IntegrationModule;
+import com.salesmanager.core.model.system.MerchantLog;
+import com.salesmanager.core.model.system.ModuleConfig;
+import com.salesmanager.core.modules.integration.IntegrationException;
+import com.salesmanager.core.modules.integration.payment.model.PaymentModule;
+
+
+public class BeanStreamPayment implements PaymentModule {
+
+ @Inject
+ private ProductPriceUtils productPriceUtils;
+
+ @Inject
+ private MerchantLogService merchantLogService;
+
+
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(BeanStreamPayment.class);
+
+ @Override
+ public Transaction initTransaction(MerchantStore store, Customer customer,
+ BigDecimal amount, Payment payment,
+ IntegrationConfiguration configuration, IntegrationModule module)
+ throws IntegrationException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Transaction authorize(MerchantStore store, Customer customer,
+ List<ShoppingCartItem> items, BigDecimal amount, Payment payment,
+ IntegrationConfiguration configuration, IntegrationModule module)
+ throws IntegrationException {
+ return processTransaction(store, customer, TransactionType.AUTHORIZE,
+ amount,
+ payment,
+ configuration,
+ module);
+ }
+
+ @Override
+ public Transaction capture(MerchantStore store, Customer customer,
+ Order order, Transaction capturableTransaction,
+ IntegrationConfiguration configuration, IntegrationModule module)
+ throws IntegrationException {
+
+
+ try {
+
+
+
+ //authorize a preauth
+
+
+ String trnID = capturableTransaction.getTransactionDetails().get("TRANSACTIONID");
+
+ String amnt = productPriceUtils.getAdminFormatedAmount(store, order.getTotal());
+
+ /**
+ merchant_id=123456789&requestType=BACKEND
+ &trnType=PAC&username=user1234&password=pass1234&trnID=1000
+ 2115 --> requires also adjId [not documented]
+ **/
+
+ StringBuilder messageString = new StringBuilder();
+ messageString.append("requestType=BACKEND&");
+ messageString.append("merchant_id=").append(configuration.getIntegrationKeys().get("merchantid")).append("&");
+ messageString.append("trnType=").append("PAC").append("&");
+ messageString.append("username=").append(configuration.getIntegrationKeys().get("username")).append("&");
+ messageString.append("password=").append(configuration.getIntegrationKeys().get("password")).append("&");
+ messageString.append("trnAmount=").append(amnt).append("&");
+ messageString.append("adjId=").append(trnID).append("&");
+ messageString.append("trnID=").append(trnID);
+
+ LOGGER.debug("REQUEST SENT TO BEANSTREAM -> " + messageString.toString());
+
+
+
+ Transaction response = this.sendTransaction(null, store, messageString.toString(), "PAC", TransactionType.CAPTURE, PaymentType.CREDITCARD, order.getTotal(), configuration, module);
+
+ return response;
+
+ } catch(Exception e) {
+
+ if(e instanceof IntegrationException)
+ throw (IntegrationException)e;
+ throw new IntegrationException("Error while processing BeanStream transaction",e);
+
+ }
+
+ }
+
+ @Override
+ public Transaction authorizeAndCapture(MerchantStore store, Customer customer,
+ List<ShoppingCartItem> items, BigDecimal amount, Payment payment,
+ IntegrationConfiguration configuration, IntegrationModule module)
+ throws IntegrationException {
+ return processTransaction(
+ store,
+ customer,
+ TransactionType.AUTHORIZECAPTURE,
+ amount,
+ payment,
+ configuration,
+ module);
+ }
+
+ @Override
+ public Transaction refund(boolean partial, MerchantStore store, Transaction transaction,
+ Order order, BigDecimal amount,
+ IntegrationConfiguration configuration, IntegrationModule module)
+ throws IntegrationException {
+
+
+
+
+ HttpURLConnection conn = null;
+
+ try {
+
+
+ boolean bSandbox = false;
+ if (configuration.getEnvironment().equals("TEST")) {// sandbox
+ bSandbox = true;
+ }
+
+ String server = "";
+
+
+ ModuleConfig configs = module.getModuleConfigs().get("PROD");
+
+ if (bSandbox == true) {
+ configs = module.getModuleConfigs().get("TEST");
+ }
+
+ if(configs==null) {
+ throw new IntegrationException("Module not configured for TEST or PROD");
+ }
+
+
+ server = new StringBuffer().append(
+
+ configs.getScheme()).append("://")
+ .append(configs.getHost())
+ .append(":")
+ .append(configs.getPort())
+ .append(configs.getUri()).toString();
+
+ String trnID = transaction.getTransactionDetails().get("TRANSACTIONID");
+
+ String amnt = productPriceUtils.getAdminFormatedAmount(store, amount);
+
+ /**
+ merchant_id=123456789&requestType=BACKEND
+ &trnType=R&username=user1234&password=pass1234
+ &trnOrderNumber=1234&trnAmount=1.00&adjId=1000
+ 2115
+ **/
+ StringBuilder messageString = new StringBuilder();
+
+
+
+ messageString.append("requestType=BACKEND&");
+ messageString.append("merchant_id=").append(configuration.getIntegrationKeys().get("merchantid")).append("&");
+ messageString.append("trnType=").append("R").append("&");
+ messageString.append("username=").append(configuration.getIntegrationKeys().get("username")).append("&");
+ messageString.append("password=").append(configuration.getIntegrationKeys().get("password")).append("&");
+ messageString.append("trnOrderNumber=").append(transaction.getTransactionDetails().get("TRNORDERNUMBER")).append("&");
+ messageString.append("trnAmount=").append(amnt).append("&");
+ messageString.append("adjId=").append(trnID);
+
+ LOGGER.debug("REQUEST SENT TO BEANSTREAM -> " + messageString.toString());
+
+
+
+
+ URL postURL = new URL(server.toString());
+ conn = (HttpURLConnection) postURL.openConnection();
+
+
+
+
+ Transaction response = this.sendTransaction(null, store, messageString.toString(), "R", TransactionType.REFUND, PaymentType.CREDITCARD, amount, configuration, module);
+
+ return response;
+
+ } catch(Exception e) {
+
+ if(e instanceof IntegrationException)
+ throw (IntegrationException)e;
+ throw new IntegrationException("Error while processing BeanStream transaction",e);
+
+ } finally {
+
+
+ if (conn != null) {
+ try {
+ conn.disconnect();
+ } catch (Exception ignore) {
+ // TODO: handle exception
+ }
+ }
+ }
+
+
+
+ }
+
+
+ private Transaction sendTransaction(
+ String orderNumber,
+ MerchantStore store,
+ String transaction,
+ String beanstreamType,
+ TransactionType transactionType,
+ PaymentType paymentType,
+ BigDecimal amount,
+ IntegrationConfiguration configuration,
+ IntegrationModule module
+ ) throws IntegrationException {
+
+ String agent = "Mozilla/4.0";
+ String respText = "";
+ Map<String,String> nvp = null;
+ DataOutputStream output = null;
+ DataInputStream in = null;
+ BufferedReader is = null;
+ HttpURLConnection conn =null;
+ try {
+
+ //transaction = "requestType=BACKEND&merchant_id=300200260&trnType=P&username=carlito&password=shopizer001&orderNumber=caa71106-7e3f-4975-a657-a35904dc32a0&trnCardOwner=Carl Samson&trnCardNumber=5100000020002000&trnExpMonth=10&trnExpYear=14&trnCardCvd=123&trnAmount=77.01&ordName=Carl S&ordAddress1=358 Du Languedoc&ordCity=Victoria&ordProvince=BC&ordPostalCode=V8T2E7&ordCountry=CA&ordPhoneNumber=(444) 555-6666&ordEmailAddress=csamson777@yahoo.com";
+ /**
+ requestType=BACKEND&merchant_id=300200260
+ &trnType=P
+ &username=carlito&password=shopizer001
+ &orderNumber=caa71106-7e3f-4975-a657-a35904dc32a0
+ &trnCardOwner=Carl Samson
+ &trnCardNumber=5100000020002000
+ &trnExpMonth=10
+ &trnExpYear=14
+ &trnCardCvd=123
+ &trnAmount=77.01
+ &ordName=Carl S
+ &ordAddress1=378 Du Languedoc
+ &ordCity=Boucherville
+ &ordProvince=QC
+ &ordPostalCode=J4B8J9
+ &ordCountry=CA
+ &ordPhoneNumber=(444) 555-6666
+ &ordEmailAddress=test@yahoo.com
+ **/
+
+ /**
+ merchant_id=123456789&requestType=BACKEND
+ &trnType=P&trnOrderNumber=1234TEST&trnAmount=5.00&trnCardOwner=Joe+Test
+ &trnCardNumber=4030000010001234
+ &trnExpMonth=10
+ &trnExpYear=16
+ &ordName=Joe+Test
+ &ordAddress1=123+Test+Street
+ &ordCity=Victoria
+ &ordProvince=BC
+ &ordCountry=CA
+ &ordPostalCode=V8T2E7
+ &ordPhoneNumber=5555555555
+ &ordEmailAddress=joe%40testemail.com
+ **/
+
+
+
+ boolean bSandbox = false;
+ if (configuration.getEnvironment().equals("TEST")) {// sandbox
+ bSandbox = true;
+ }
+
+ String server = "";
+
+ ModuleConfig configs = module.getModuleConfigs().get("PROD");
+
+ if (bSandbox == true) {
+ configs = module.getModuleConfigs().get("TEST");
+ }
+
+ if(configs==null) {
+ throw new IntegrationException("Module not configured for TEST or PROD");
+ }
+
+
+ server = new StringBuffer().append(
+
+ configs.getScheme()).append("://")
+ .append(configs.getHost())
+ .append(":")
+ .append(configs.getPort())
+ .append(configs.getUri()).toString();
+
+
+
+ URL postURL = new URL(server.toString());
+ conn = (HttpURLConnection) postURL.openConnection();
+
+
+ // Set connection parameters. We need to perform input and output,
+ // so set both as true.
+ conn.setDoInput(true);
+ conn.setDoOutput(true);
+
+ // Set the content type we are POSTing. We impersonate it as
+ // encoded form data
+ conn.setRequestProperty("Content-Type",
+ "application/x-www-form-urlencoded");
+ conn.setRequestProperty("User-Agent", agent);
+
+ conn.setRequestProperty("Content-Length", String
+ .valueOf(transaction.length()));
+ conn.setRequestMethod("POST");
+
+ // get the output stream to POST to.
+ output = new DataOutputStream(conn.getOutputStream());
+ output.writeBytes(transaction);
+ output.flush();
+
+
+ // Read input from the input stream.
+ in = new DataInputStream(conn.getInputStream());
+ int rc = conn.getResponseCode();
+ if (rc != -1) {
+ is = new BufferedReader(new InputStreamReader(conn
+ .getInputStream()));
+ String _line = null;
+ while (((_line = is.readLine()) != null)) {
+ respText = respText + _line;
+ }
+
+ LOGGER.debug("BeanStream response -> " + respText.trim());
+
+ nvp = formatUrlResponse(respText.trim());
+ } else {
+ throw new IntegrationException("Invalid response from BeanStream, return code is " + rc);
+ }
+
+ //check
+ //trnApproved=1&trnId=10003067&messageId=1&messageText=Approved&trnOrderNumber=E40089&authCode=TEST&errorType=N&errorFields=
+
+ String transactionApproved = (String)nvp.get("TRNAPPROVED");
+ String transactionId = (String)nvp.get("TRNID");
+ String messageId = (String)nvp.get("MESSAGEID");
+ String messageText = (String)nvp.get("MESSAGETEXT");
+ String orderId = (String)nvp.get("TRNORDERNUMBER");
+ String authCode = (String)nvp.get("AUTHCODE");
+ String errorType = (String)nvp.get("ERRORTYPE");
+ String errorFields = (String)nvp.get("ERRORFIELDS");
+ if(!StringUtils.isBlank(orderNumber)) {
+ nvp.put("INTERNALORDERID", orderNumber);
+ }
+
+ if(StringUtils.isBlank(transactionApproved)) {
+ throw new IntegrationException("Required field transactionApproved missing from BeanStream response");
+ }
+
+ //errors
+ if(transactionApproved.equals("0")) {
+
+ merchantLogService.save(
+ new MerchantLog(store,
+ "Can't process BeanStream message "
+ + messageText + " return code id " + messageId));
+
+ IntegrationException te = new IntegrationException(
+ "Can't process BeanStream message " + messageText);
+ te.setExceptionType(IntegrationException.EXCEPTION_PAYMENT_DECLINED);
+ te.setMessageCode("message.payment.beanstream." + messageId);
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ throw te;
+ }
+
+ //create transaction object
+
+ //return parseResponse(type,transaction,respText,nvp,order);
+ return this.parseResponse(transactionType, paymentType, nvp, amount);
+
+
+ } catch(Exception e) {
+ if(e instanceof IntegrationException) {
+ throw (IntegrationException)e;
+ }
+
+ throw new IntegrationException("Error while processing BeanStream transaction",e);
+
+ } finally {
+ if (is != null) {
+ try {
+ is.close();
+ } catch (Exception ignore) {
+ // TODO: handle exception
+ }
+ }
+
+ if (in != null) {
+ try {
+ in.close();
+ } catch (Exception ignore) {
+ // TODO: handle exception
+ }
+ }
+
+ if (output != null) {
+ try {
+ output.close();
+ } catch (Exception ignore) {
+ // TODO: handle exception
+ }
+ }
+
+ if (conn != null) {
+ try {
+ conn.disconnect();
+ } catch (Exception ignore) {
+ // TODO: handle exception
+ }
+ }
+
+ }
+
+
+ }
+
+
+
+ private Transaction processTransaction(MerchantStore store, Customer customer, TransactionType type,
+ BigDecimal amount, Payment payment,
+ IntegrationConfiguration configuration, IntegrationModule module) throws IntegrationException {
+
+
+
+
+
+ boolean bSandbox = false;
+ if (configuration.getEnvironment().equals("TEST")) {// sandbox
+ bSandbox = true;
+ }
+
+ String server = "";
+
+ ModuleConfig configs = module.getModuleConfigs().get("PROD");
+
+ if (bSandbox == true) {
+ configs = module.getModuleConfigs().get("TEST");
+ }
+
+ if(configs==null) {
+ throw new IntegrationException("Module not configured for TEST or PROD");
+ }
+
+
+ server = new StringBuffer().append(
+
+ configs.getScheme()).append("://")
+ .append(configs.getHost())
+ .append(":")
+ .append(configs.getPort())
+ .append(configs.getUri()).toString();
+
+ HttpURLConnection conn = null;
+
+ try {
+
+ String uniqueId = UUID.randomUUID().toString();//TODO
+
+ String orderNumber = uniqueId;
+
+ String amnt = productPriceUtils.getAdminFormatedAmount(store, amount);
+
+
+ StringBuilder messageString = new StringBuilder();
+
+ String transactionType = "P";
+ if(type == TransactionType.AUTHORIZE) {
+ transactionType = "PA";
+ } else if(type == TransactionType.AUTHORIZECAPTURE) {
+ transactionType = "P";
+ }
+
+ CreditCardPayment creditCardPayment = (CreditCardPayment)payment;
+
+ messageString.append("requestType=BACKEND&");
+ messageString.append("merchant_id=").append(configuration.getIntegrationKeys().get("merchantid")).append("&");
+ messageString.append("trnType=").append(transactionType).append("&");
+ messageString.append("username=").append(configuration.getIntegrationKeys().get("username")).append("&");
+ messageString.append("password=").append(configuration.getIntegrationKeys().get("password")).append("&");
+ messageString.append("orderNumber=").append(orderNumber).append("&");
+ messageString.append("trnCardOwner=").append(creditCardPayment.getCardOwner()).append("&");
+ messageString.append("trnCardNumber=").append(creditCardPayment.getCreditCardNumber()).append("&");
+ messageString.append("trnExpMonth=").append(creditCardPayment.getExpirationMonth()).append("&");
+ messageString.append("trnExpYear=").append(creditCardPayment.getExpirationYear().substring(2)).append("&");
+ messageString.append("trnCardCvd=").append(creditCardPayment.getCredidCardValidationNumber()).append("&");
+ messageString.append("trnAmount=").append(amnt).append("&");
+
+ StringBuilder nm = new StringBuilder();
+ nm.append(customer.getBilling().getFirstName()).append(" ").append(customer.getBilling().getLastName());
+
+
+ messageString.append("ordName=").append(nm.toString()).append("&");
+ messageString.append("ordAddress1=").append(customer.getBilling().getAddress()).append("&");
+ messageString.append("ordCity=").append(customer.getBilling().getCity()).append("&");
+
+ String stateProvince = customer.getBilling().getState();
+ if(customer.getBilling().getZone()!=null) {
+ stateProvince = customer.getBilling().getZone().getCode();
+ }
+
+ String countryName = customer.getBilling().getCountry().getIsoCode();
+
+ messageString.append("ordProvince=").append(stateProvince).append("&");
+ messageString.append("ordPostalCode=").append(customer.getBilling().getPostalCode().replaceAll("\\s","")).append("&");
+ messageString.append("ordCountry=").append(countryName).append("&");
+ messageString.append("ordPhoneNumber=").append(customer.getBilling().getTelephone()).append("&");
+ messageString.append("ordEmailAddress=").append(customer.getEmailAddress());
+
+
+
+
+ /**
+ * purchase (P)
+ * -----------
+ REQUEST -> merchant_id=123456789&requestType=BACKEND&trnType=P&trnOrderNumber=1234TEST&trnAmount=5.00&trnCardOwner=Joe+Test&trnCardNumber=4030000010001234&trnExpMonth=10&trnExpYear=10&ordName=Joe+Test&ordAddress1=123+Test+Street&ordCity=Victoria&ordProvince=BC&ordCountry=CA&ordPostalCode=V8T2E7&ordPhoneNumber=5555555555&ordEmailAddress=joe%40testemail.com
+ RESPONSE-> trnApproved=1&trnId=10003067&messageId=1&messageText=Approved&trnOrderNumber=E40089&authCode=TEST&errorType=N&errorFields=&responseType=T&trnAmount=10%2E00&trnDate=1%2F17%2F2008+11%3A36%3A34+AM&avsProcessed=0&avsId=0&avsResult=0&avsAddrMatch=0&avsPostalMatch=0&avsMessage=Address+Verification+not+performed+for+this+transaction%2E&rspCodeCav=0&rspCavResult=0&rspCodeCredit1=0&rspCodeCredit2=0&rspCodeCredit3=0&rspCodeCredit4=0&rspCodeAddr1=0&rspCodeAddr2=0&rspCodeAddr3=0&rspCodeAddr4=0&rspCodeDob=0&rspCustomerDec=&trnType=P&paymentMethod=CC&ref1=&ref2=&ref3=&ref4=&ref5=
+
+ pre authorization (PA)
+ ----------------------
+
+ Prior to processing a pre-authorization through the API, you must modify the transaction settings in your Beanstream merchant member area to allow for this transaction type.
+ - Log in to the Beanstream online member area at www.beanstream.com/admin/sDefault.asp.
+ - Navigate to administration - account admin - order settings in the left menu.
+ Under the heading �Restrict Internet Transaction Processing Types,� select either of the last two options. The �Purchases or Pre-Authorization Only� option will allow you to process both types of transaction through your web interface. De-selecting the �Restrict Internet Transaction Processing Types� checkbox will allow you to process all types of transactions including returns, voids and pre-auth completions.
+
+ capture (PAC) -> requires trnId
+ -------------
+
+ refund (R)
+ -------------
+ REQUEST -> merchant_id=123456789&requestType=BACKEND&trnType=R&username=user1234&password=pass1234&trnOrderNumber=1234&trnAmount=1.00&adjId=10002115
+ RESPONSE-> trnApproved=1&trnId=10002118&messageId=1&messageText=Approved&trnOrderNumber=1234R&authCode=TEST&errorType=N&errorFields=&responseType=T&trnAmount=1%2E00&trnDate=8%2F17%2F2009+1%3A44%3A56+PM&avsProcessed=0&avsId=0&avsResult=0&avsAddrMatch=0&avsPostalMatch=0&avsMessage=Address+Verification+not+performed+for+this+transaction%2E&cardType=VI&trnType=R&paymentMethod=CC&ref1=&ref2=&ref3=&ref4=&ref5=
+
+
+ //notes
+ //On receipt of the transaction response, the merchant must display order amount, transaction ID number, bank authorization code (authCode), currency, date and �messageText� to the customer on a confirmation page.
+ */
+
+
+ //String agent = "Mozilla/4.0";
+ //String respText = "";
+ //Map nvp = null;
+
+
+ /** debug **/
+
+
+
+ StringBuffer messageLogString = new StringBuffer();
+
+
+ messageLogString.append("requestType=BACKEND&");
+ messageLogString.append("merchant_id=").append(configuration.getIntegrationKeys().get("merchantid")).append("&");
+ messageLogString.append("trnType=").append(type).append("&");
+ messageLogString.append("orderNumber=").append(orderNumber).append("&");
+ messageLogString.append("trnCardOwner=").append(creditCardPayment.getCardOwner()).append("&");
+ messageLogString.append("trnCardNumber=").append(CreditCardUtils.maskCardNumber(creditCardPayment.getCreditCardNumber())).append("&");
+ messageLogString.append("trnExpMonth=").append(creditCardPayment.getExpirationMonth()).append("&");
+ messageLogString.append("trnExpYear=").append(creditCardPayment.getExpirationYear()).append("&");
+ messageLogString.append("trnCardCvd=").append(creditCardPayment.getCredidCardValidationNumber()).append("&");
+ messageLogString.append("trnAmount=").append(amnt).append("&");
+
+ messageLogString.append("ordName=").append(nm.toString()).append("&");
+ messageLogString.append("ordAddress1=").append(customer.getBilling().getAddress()).append("&");
+ messageLogString.append("ordCity=").append(customer.getBilling().getCity()).append("&");
+
+
+
+ messageLogString.append("ordProvince=").append(stateProvince).append("&");
+ messageLogString.append("ordPostalCode=").append(customer.getBilling().getPostalCode()).append("&");
+ messageLogString.append("ordCountry=").append(customer.getBilling().getCountry().getName()).append("&");
+ messageLogString.append("ordPhoneNumber=").append(customer.getBilling().getTelephone()).append("&");
+ messageLogString.append("ordEmailAddress=").append(customer.getEmailAddress());
+
+
+
+
+ /** debug **/
+
+
+ LOGGER.debug("REQUEST SENT TO BEANSTREAM -> " + messageLogString.toString());
+
+
+ URL postURL = new URL(server.toString());
+ conn = (HttpURLConnection) postURL.openConnection();
+
+
+
+ Transaction response = this.sendTransaction(orderNumber, store, messageString.toString(), transactionType, type, payment.getPaymentType(), amount, configuration, module);
+
+ return response;
+
+
+
+ } catch(Exception e) {
+
+ if(e instanceof IntegrationException)
+ throw (IntegrationException)e;
+ throw new IntegrationException("Error while processing BeanStream transaction",e);
+
+ } finally {
+
+
+ if (conn != null) {
+ try {
+ conn.disconnect();
+ } catch (Exception ignore) {}
+ }
+ }
+
+ }
+
+
+
+ private Transaction parseResponse(TransactionType transactionType,
+ PaymentType paymentType, Map<String,String> nvp,
+ BigDecimal amount) throws Exception {
+
+
+ Transaction transaction = new Transaction();
+ transaction.setAmount(amount);
+ //transaction.setOrder(order);
+ transaction.setTransactionDate(new Date());
+ transaction.setTransactionType(transactionType);
+ transaction.setPaymentType(PaymentType.CREDITCARD);
+ transaction.getTransactionDetails().put("TRANSACTIONID", (String)nvp.get("TRNID"));
+ transaction.getTransactionDetails().put("TRNAPPROVED", (String)nvp.get("TRNAPPROVED"));
+ transaction.getTransactionDetails().put("TRNORDERNUMBER", (String)nvp.get("TRNORDERNUMBER"));
+ transaction.getTransactionDetails().put("MESSAGETEXT", (String)nvp.get("MESSAGETEXT"));
+ if(nvp.get("INTERNALORDERID")!=null) {
+ transaction.getTransactionDetails().put("INTERNALORDERID", (String)nvp.get("INTERNALORDERID"));
+ }
+ return transaction;
+
+ }
+
+ private Map formatUrlResponse(String payload) throws Exception {
+ HashMap<String,String> nvp = new HashMap<String,String> ();
+ StringTokenizer stTok = new StringTokenizer(payload, "&");
+ while (stTok.hasMoreTokens()) {
+ StringTokenizer stInternalTokenizer = new StringTokenizer(stTok
+ .nextToken(), "=");
+ if (stInternalTokenizer.countTokens() == 2) {
+ String key = URLDecoder.decode(stInternalTokenizer.nextToken(),
+ "UTF-8");
+ String value = URLDecoder.decode(stInternalTokenizer
+ .nextToken(), "UTF-8");
+ nvp.put(key.toUpperCase(), value);
+ }
+ }
+ return nvp;
+ }
+
+ @Override
+ public void validateModuleConfiguration(
+ IntegrationConfiguration integrationConfiguration,
+ MerchantStore store) throws IntegrationException {
+
+
+ List<String> errorFields = null;
+
+
+ Map<String,String> keys = integrationConfiguration.getIntegrationKeys();
+
+ //validate integrationKeys['merchantid']
+ if(keys==null || StringUtils.isBlank(keys.get("merchantid"))) {
+ errorFields = new ArrayList<String>();
+ errorFields.add("merchantid");
+ }
+
+ //validate integrationKeys['username']
+ if(keys==null || StringUtils.isBlank(keys.get("username"))) {
+ if(errorFields==null) {
+ errorFields = new ArrayList<String>();
+ }
+ errorFields.add("username");
+ }
+
+
+ //validate integrationKeys['password']
+ if(keys==null || StringUtils.isBlank(keys.get("password"))) {
+ if(errorFields==null) {
+ errorFields = new ArrayList<String>();
+ }
+ errorFields.add("password");
+ }
+
+
+
+ if(errorFields!=null) {
+ IntegrationException ex = new IntegrationException(IntegrationException.ERROR_VALIDATION_SAVE);
+ ex.setErrorFields(errorFields);
+ throw ex;
+
+ }
+
+
+
+ }
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/payment/impl/BraintreePayment.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/payment/impl/BraintreePayment.java
new file mode 100644
index 0000000..f4503dd
--- /dev/null
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/payment/impl/BraintreePayment.java
@@ -0,0 +1,469 @@
+package com.salesmanager.core.business.modules.integration.payment.impl;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang.Validate;
+import org.apache.commons.lang3.StringUtils;
+
+import com.braintreegateway.BraintreeGateway;
+import com.braintreegateway.Environment;
+import com.braintreegateway.TransactionRequest;
+import com.braintreegateway.ValidationError;
+import com.braintreegateway.Result;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.payments.Payment;
+import com.salesmanager.core.model.payments.PaymentType;
+import com.salesmanager.core.model.payments.Transaction;
+import com.salesmanager.core.model.payments.TransactionType;
+import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
+import com.salesmanager.core.model.system.IntegrationConfiguration;
+import com.salesmanager.core.model.system.IntegrationModule;
+import com.salesmanager.core.modules.integration.IntegrationException;
+import com.salesmanager.core.modules.integration.payment.model.PaymentModule;
+
+public class BraintreePayment implements PaymentModule {
+
+ @Override
+ public void validateModuleConfiguration(IntegrationConfiguration integrationConfiguration, MerchantStore store)
+ throws IntegrationException {
+ List<String> errorFields = null;
+
+
+ Map<String,String> keys = integrationConfiguration.getIntegrationKeys();
+
+ //validate integrationKeys['merchant_id']
+ if(keys==null || StringUtils.isBlank(keys.get("merchant_id"))) {
+ errorFields = new ArrayList<String>();
+ errorFields.add("merchant_id");
+ }
+
+ //validate integrationKeys['public_key']
+ if(keys==null || StringUtils.isBlank(keys.get("public_key"))) {
+ if(errorFields==null) {
+ errorFields = new ArrayList<String>();
+ }
+ errorFields.add("public_key");
+ }
+
+ //validate integrationKeys['private_key']
+ if(keys==null || StringUtils.isBlank(keys.get("private_key"))) {
+ if(errorFields==null) {
+ errorFields = new ArrayList<String>();
+ }
+ errorFields.add("private_key");
+ }
+
+ //validate integrationKeys['tokenization_key']
+ if(keys==null || StringUtils.isBlank(keys.get("tokenization_key"))) {
+ if(errorFields==null) {
+ errorFields = new ArrayList<String>();
+ }
+ errorFields.add("tokenization_key");
+ }
+
+
+ if(errorFields!=null) {
+ IntegrationException ex = new IntegrationException(IntegrationException.ERROR_VALIDATION_SAVE);
+ ex.setErrorFields(errorFields);
+ throw ex;
+
+ }
+
+ }
+
+ @Override
+ public Transaction initTransaction(MerchantStore store, Customer customer, BigDecimal amount, Payment payment,
+ IntegrationConfiguration configuration, IntegrationModule module) throws IntegrationException {
+
+ Validate.notNull(configuration,"Configuration cannot be null");
+
+ String merchantId = configuration.getIntegrationKeys().get("merchant_id");
+ String publicKey = configuration.getIntegrationKeys().get("public_key");
+ String privateKey = configuration.getIntegrationKeys().get("private_key");
+
+ Validate.notNull(merchantId,"merchant_id cannot be null");
+ Validate.notNull(publicKey,"public_key cannot be null");
+ Validate.notNull(privateKey,"private_key cannot be null");
+
+ Environment environment= Environment.PRODUCTION;
+ if (configuration.getEnvironment().equals("TEST")) {// sandbox
+ environment= Environment.SANDBOX;
+ }
+
+ BraintreeGateway gateway = new BraintreeGateway(
+ environment,
+ merchantId,
+ publicKey,
+ privateKey
+ );
+
+ String clientToken = gateway.clientToken().generate();
+
+ Transaction transaction = new Transaction();
+ transaction.setAmount(amount);
+ transaction.setDetails(clientToken);
+ transaction.setPaymentType(payment.getPaymentType());
+ transaction.setTransactionDate(new Date());
+ transaction.setTransactionType(payment.getTransactionType());
+
+ return transaction;
+ }
+
+ @Override
+ public Transaction authorize(MerchantStore store, Customer customer, List<ShoppingCartItem> items,
+ BigDecimal amount, Payment payment, IntegrationConfiguration configuration, IntegrationModule module)
+ throws IntegrationException {
+
+
+ Validate.notNull(configuration,"Configuration cannot be null");
+
+ String merchantId = configuration.getIntegrationKeys().get("merchant_id");
+ String publicKey = configuration.getIntegrationKeys().get("public_key");
+ String privateKey = configuration.getIntegrationKeys().get("private_key");
+
+ Validate.notNull(merchantId,"merchant_id cannot be null");
+ Validate.notNull(publicKey,"public_key cannot be null");
+ Validate.notNull(privateKey,"private_key cannot be null");
+
+ String nonce = payment.getPaymentMetaData().get("paymentToken");
+
+ if(StringUtils.isBlank(nonce)) {
+ IntegrationException te = new IntegrationException(
+ "Can't process Braintree, missing authorization nounce");
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ throw te;
+ }
+
+ Environment environment= Environment.PRODUCTION;
+ if (configuration.getEnvironment().equals("TEST")) {// sandbox
+ environment= Environment.SANDBOX;
+ }
+
+ BraintreeGateway gateway = new BraintreeGateway(
+ environment,
+ merchantId,
+ publicKey,
+ privateKey
+ );
+
+
+
+ TransactionRequest request = new TransactionRequest()
+ .amount(amount)
+ .paymentMethodNonce(nonce);
+
+ Result<com.braintreegateway.Transaction> result = gateway.transaction().sale(request);
+
+ String authorizationId = null;
+
+ if (result.isSuccess()) {
+ com.braintreegateway.Transaction transaction = result.getTarget();
+ authorizationId = transaction.getId();
+ } else if (result.getTransaction() != null) {
+ com.braintreegateway.Transaction transaction = result.getTransaction();
+ authorizationId = transaction.getAuthorizedTransactionId();
+ } else {
+ String errorString = "";
+ for (ValidationError error : result.getErrors().getAllDeepValidationErrors()) {
+ errorString += "Error: " + error.getCode() + ": " + error.getMessage() + "\n";
+ }
+
+ IntegrationException te = new IntegrationException(
+ "Can't process Braintree authorization " + errorString);
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ throw te;
+
+ }
+
+ if(StringUtils.isBlank(authorizationId)) {
+ IntegrationException te = new IntegrationException(
+ "Can't process Braintree, missing authorizationId");
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ throw te;
+ }
+
+ Transaction trx = new Transaction();
+ trx.setAmount(amount);
+ trx.setTransactionDate(new Date());
+ trx.setTransactionType(TransactionType.AUTHORIZE);
+ trx.setPaymentType(PaymentType.CREDITCARD);
+ trx.getTransactionDetails().put("TRANSACTIONID", authorizationId);
+ trx.getTransactionDetails().put("TRNAPPROVED", null);
+ trx.getTransactionDetails().put("TRNORDERNUMBER", authorizationId);
+ trx.getTransactionDetails().put("MESSAGETEXT", null);
+
+ return trx;
+
+ }
+
+ @Override
+ public Transaction capture(MerchantStore store, Customer customer, Order order, Transaction capturableTransaction,
+ IntegrationConfiguration configuration, IntegrationModule module) throws IntegrationException {
+ Validate.notNull(configuration,"Configuration cannot be null");
+
+ String merchantId = configuration.getIntegrationKeys().get("merchant_id");
+ String publicKey = configuration.getIntegrationKeys().get("public_key");
+ String privateKey = configuration.getIntegrationKeys().get("private_key");
+
+ Validate.notNull(merchantId,"merchant_id cannot be null");
+ Validate.notNull(publicKey,"public_key cannot be null");
+ Validate.notNull(privateKey,"private_key cannot be null");
+
+ String auth = capturableTransaction.getTransactionDetails().get("TRANSACTIONID");
+
+ if(StringUtils.isBlank(auth)) {
+ IntegrationException te = new IntegrationException(
+ "Can't process Braintree, missing authorization id");
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ throw te;
+ }
+
+ Environment environment= Environment.PRODUCTION;
+ if (configuration.getEnvironment().equals("TEST")) {// sandbox
+ environment= Environment.SANDBOX;
+ }
+
+ BraintreeGateway gateway = new BraintreeGateway(
+ environment,
+ merchantId,
+ publicKey,
+ privateKey
+ );
+
+
+ BigDecimal amount = order.getTotal();
+
+ Result<com.braintreegateway.Transaction> result = gateway.transaction().submitForSettlement(auth, amount);
+
+ String trxId = null;
+
+ if (result.isSuccess()) {
+ com.braintreegateway.Transaction settledTransaction = result.getTarget();
+ trxId = settledTransaction.getId();
+ } else {
+ String errorString = "";
+ for (ValidationError error : result.getErrors().getAllDeepValidationErrors()) {
+ errorString += "Error: " + error.getCode() + ": " + error.getMessage() + "\n";
+ }
+
+ IntegrationException te = new IntegrationException(
+ "Can't process Braintree refund " + errorString);
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ throw te;
+
+ }
+
+ if(StringUtils.isBlank(trxId)) {
+ IntegrationException te = new IntegrationException(
+ "Can't process Braintree, missing original transaction");
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ throw te;
+ }
+
+ Transaction trx = new Transaction();
+ trx.setAmount(amount);
+ trx.setTransactionDate(new Date());
+ trx.setTransactionType(TransactionType.CAPTURE);
+ trx.setPaymentType(PaymentType.CREDITCARD);
+ trx.getTransactionDetails().put("TRANSACTIONID", trxId);
+ trx.getTransactionDetails().put("TRNAPPROVED", null);
+ trx.getTransactionDetails().put("TRNORDERNUMBER", trxId);
+ trx.getTransactionDetails().put("MESSAGETEXT", null);
+
+ return trx;
+
+
+ }
+
+ @Override
+ public Transaction authorizeAndCapture(MerchantStore store, Customer customer, List<ShoppingCartItem> items,
+ BigDecimal amount, Payment payment, IntegrationConfiguration configuration, IntegrationModule module)
+ throws IntegrationException {
+
+ Validate.notNull(configuration,"Configuration cannot be null");
+
+ String merchantId = configuration.getIntegrationKeys().get("merchant_id");
+ String publicKey = configuration.getIntegrationKeys().get("public_key");
+ String privateKey = configuration.getIntegrationKeys().get("private_key");
+
+ Validate.notNull(merchantId,"merchant_id cannot be null");
+ Validate.notNull(publicKey,"public_key cannot be null");
+ Validate.notNull(privateKey,"private_key cannot be null");
+
+ String nonce = payment.getPaymentMetaData().get("nonce");
+
+ if(StringUtils.isBlank(nonce)) {
+ IntegrationException te = new IntegrationException(
+ "Can't process Braintree, missing authorization nounce");
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ throw te;
+ }
+
+ Environment environment= Environment.PRODUCTION;
+ if (configuration.getEnvironment().equals("TEST")) {// sandbox
+ environment= Environment.SANDBOX;
+ }
+
+ BraintreeGateway gateway = new BraintreeGateway(
+ environment,
+ merchantId,
+ publicKey,
+ privateKey
+ );
+
+
+
+ TransactionRequest request = new TransactionRequest()
+ .amount(amount)
+ .paymentMethodNonce(nonce);
+
+ Result<com.braintreegateway.Transaction> result = gateway.transaction().sale(request);
+
+ String trxId = null;
+
+ if (result.isSuccess()) {
+ com.braintreegateway.Transaction transaction = result.getTarget();
+ trxId = transaction.getId();
+ } else {
+ String errorString = "";
+ for (ValidationError error : result.getErrors().getAllDeepValidationErrors()) {
+ errorString += "Error: " + error.getCode() + ": " + error.getMessage() + "\n";
+ }
+
+ IntegrationException te = new IntegrationException(
+ "Can't process Braintree auth + capture " + errorString);
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ throw te;
+
+ }
+
+ if(StringUtils.isBlank(trxId)) {
+ IntegrationException te = new IntegrationException(
+ "Can't process Braintree, missing trxId");
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ throw te;
+ }
+
+ Transaction trx = new Transaction();
+ trx.setAmount(amount);
+ trx.setTransactionDate(new Date());
+ trx.setTransactionType(TransactionType.AUTHORIZECAPTURE);
+ trx.setPaymentType(PaymentType.CREDITCARD);
+ trx.getTransactionDetails().put("TRANSACTIONID", trxId);
+ trx.getTransactionDetails().put("TRNAPPROVED", null);
+ trx.getTransactionDetails().put("TRNORDERNUMBER", result.getTransaction().getId());
+ trx.getTransactionDetails().put("MESSAGETEXT", null);
+
+ return trx;
+
+
+ }
+
+ @Override
+ public Transaction refund(boolean partial, MerchantStore store, Transaction transaction, Order order,
+ BigDecimal amount, IntegrationConfiguration configuration, IntegrationModule module)
+ throws IntegrationException {
+
+
+ String merchantId = configuration.getIntegrationKeys().get("merchant_id");
+ String publicKey = configuration.getIntegrationKeys().get("public_key");
+ String privateKey = configuration.getIntegrationKeys().get("private_key");
+
+ Validate.notNull(merchantId,"merchant_id cannot be null");
+ Validate.notNull(publicKey,"public_key cannot be null");
+ Validate.notNull(privateKey,"private_key cannot be null");
+
+ String auth = transaction.getTransactionDetails().get("TRANSACTIONID");
+
+ if(StringUtils.isBlank(auth)) {
+ IntegrationException te = new IntegrationException(
+ "Can't process Braintree refund, missing transaction id");
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ throw te;
+ }
+
+ Environment environment= Environment.PRODUCTION;
+ if (configuration.getEnvironment().equals("TEST")) {// sandbox
+ environment= Environment.SANDBOX;
+ }
+
+ BraintreeGateway gateway = new BraintreeGateway(
+ environment,
+ merchantId,
+ publicKey,
+ privateKey
+ );
+
+
+ Result<com.braintreegateway.Transaction> result = gateway.transaction().refund(auth, amount);
+
+ String trxId = null;
+
+ if (result.isSuccess()) {
+ com.braintreegateway.Transaction settledTransaction = result.getTarget();
+ trxId = settledTransaction.getId();
+ } else {
+ String errorString = "";
+ for (ValidationError error : result.getErrors().getAllDeepValidationErrors()) {
+ errorString += "Error: " + error.getCode() + ": " + error.getMessage() + "\n";
+ }
+
+ IntegrationException te = new IntegrationException(
+ "Can't process Braintree refund " + errorString);
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ throw te;
+
+ }
+
+ if(StringUtils.isBlank(trxId)) {
+ IntegrationException te = new IntegrationException(
+ "Can't process Braintree refund, missing original transaction");
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ throw te;
+ }
+
+ Transaction trx = new Transaction();
+ trx.setAmount(amount);
+ trx.setTransactionDate(new Date());
+ trx.setTransactionType(TransactionType.REFUND);
+ trx.setPaymentType(PaymentType.CREDITCARD);
+ trx.getTransactionDetails().put("TRANSACTIONID", trxId);
+ trx.getTransactionDetails().put("TRNAPPROVED", null);
+ trx.getTransactionDetails().put("TRNORDERNUMBER", trxId);
+ trx.getTransactionDetails().put("MESSAGETEXT", null);
+
+ return trx;
+
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/payment/impl/MoneyOrderPayment.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/payment/impl/MoneyOrderPayment.java
index bccdbd1..5d9fb51 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/payment/impl/MoneyOrderPayment.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/payment/impl/MoneyOrderPayment.java
@@ -1,119 +1,119 @@
-package com.salesmanager.core.business.modules.integration.payment.impl;
-
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.commons.lang3.StringUtils;
-
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.Order;
-import com.salesmanager.core.model.payments.Payment;
-import com.salesmanager.core.model.payments.PaymentType;
-import com.salesmanager.core.model.payments.Transaction;
-import com.salesmanager.core.model.payments.TransactionType;
-import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
-import com.salesmanager.core.model.system.IntegrationConfiguration;
-import com.salesmanager.core.model.system.IntegrationModule;
-import com.salesmanager.core.modules.integration.IntegrationException;
-import com.salesmanager.core.modules.integration.payment.model.PaymentModule;
-
-public class MoneyOrderPayment implements PaymentModule {
-
- @Override
- public void validateModuleConfiguration(
- IntegrationConfiguration integrationConfiguration,
- MerchantStore store) throws IntegrationException {
-
- List<String> errorFields = null;
-
-
- Map<String,String> keys = integrationConfiguration.getIntegrationKeys();
-
- //validate integrationKeys['address']
- if(keys==null || StringUtils.isBlank(keys.get("address"))) {
- errorFields = new ArrayList<String>();
- errorFields.add("address");
- }
-
- if(errorFields!=null) {
- IntegrationException ex = new IntegrationException(IntegrationException.ERROR_VALIDATION_SAVE);
- ex.setErrorFields(errorFields);
- throw ex;
-
- }
-
-
-
- return;
-
- }
-
- @Override
- public Transaction initTransaction(MerchantStore store, Customer customer,
- BigDecimal amount, Payment payment,
- IntegrationConfiguration configuration, IntegrationModule module)
- throws IntegrationException {
- //NOT REQUIRED
- return null;
- }
-
- @Override
- public Transaction authorize(MerchantStore store, Customer customer,
- List<ShoppingCartItem> items, BigDecimal amount, Payment payment,
- IntegrationConfiguration configuration, IntegrationModule module)
- throws IntegrationException {
- //NOT REQUIRED
- return null;
- }
-
-/* @Override
- public Transaction capture(MerchantStore store, Customer customer,
- List<ShoppingCartItem> items, BigDecimal amount, Payment payment, Transaction transaction,
- IntegrationConfiguration configuration, IntegrationModule module)
- throws IntegrationException {
- //NOT REQUIRED
- return null;
- }*/
-
- @Override
- public Transaction authorizeAndCapture(MerchantStore store, Customer customer,
- List<ShoppingCartItem> items, BigDecimal amount, Payment payment,
- IntegrationConfiguration configuration, IntegrationModule module)
- throws IntegrationException {
-
-
- Transaction transaction = new Transaction();
- transaction.setAmount(amount);
- transaction.setTransactionDate(new Date());
- transaction.setTransactionType(TransactionType.AUTHORIZECAPTURE);
- transaction.setPaymentType(PaymentType.MONEYORDER);
-
-
- return transaction;
-
-
-
- }
-
- @Override
- public Transaction refund(boolean partial, MerchantStore store, Transaction transaction,
- Order order, BigDecimal amount,
- IntegrationConfiguration configuration, IntegrationModule module)
- throws IntegrationException {
- throw new IntegrationException("Transaction not supported");
- }
-
- @Override
- public Transaction capture(MerchantStore store, Customer customer,
- Order order, Transaction capturableTransaction,
- IntegrationConfiguration configuration, IntegrationModule module)
- throws IntegrationException {
- // TODO Auto-generated method stub
- return null;
- }
-
-}
+package com.salesmanager.core.business.modules.integration.payment.impl;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.payments.Payment;
+import com.salesmanager.core.model.payments.PaymentType;
+import com.salesmanager.core.model.payments.Transaction;
+import com.salesmanager.core.model.payments.TransactionType;
+import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
+import com.salesmanager.core.model.system.IntegrationConfiguration;
+import com.salesmanager.core.model.system.IntegrationModule;
+import com.salesmanager.core.modules.integration.IntegrationException;
+import com.salesmanager.core.modules.integration.payment.model.PaymentModule;
+
+public class MoneyOrderPayment implements PaymentModule {
+
+ @Override
+ public void validateModuleConfiguration(
+ IntegrationConfiguration integrationConfiguration,
+ MerchantStore store) throws IntegrationException {
+
+ List<String> errorFields = null;
+
+
+ Map<String,String> keys = integrationConfiguration.getIntegrationKeys();
+
+ //validate integrationKeys['address']
+ if(keys==null || StringUtils.isBlank(keys.get("address"))) {
+ errorFields = new ArrayList<String>();
+ errorFields.add("address");
+ }
+
+ if(errorFields!=null) {
+ IntegrationException ex = new IntegrationException(IntegrationException.ERROR_VALIDATION_SAVE);
+ ex.setErrorFields(errorFields);
+ throw ex;
+
+ }
+
+
+
+ return;
+
+ }
+
+ @Override
+ public Transaction initTransaction(MerchantStore store, Customer customer,
+ BigDecimal amount, Payment payment,
+ IntegrationConfiguration configuration, IntegrationModule module)
+ throws IntegrationException {
+ //NOT REQUIRED
+ return null;
+ }
+
+ @Override
+ public Transaction authorize(MerchantStore store, Customer customer,
+ List<ShoppingCartItem> items, BigDecimal amount, Payment payment,
+ IntegrationConfiguration configuration, IntegrationModule module)
+ throws IntegrationException {
+ //NOT REQUIRED
+ return null;
+ }
+
+/* @Override
+ public Transaction capture(MerchantStore store, Customer customer,
+ List<ShoppingCartItem> items, BigDecimal amount, Payment payment, Transaction transaction,
+ IntegrationConfiguration configuration, IntegrationModule module)
+ throws IntegrationException {
+ //NOT REQUIRED
+ return null;
+ }*/
+
+ @Override
+ public Transaction authorizeAndCapture(MerchantStore store, Customer customer,
+ List<ShoppingCartItem> items, BigDecimal amount, Payment payment,
+ IntegrationConfiguration configuration, IntegrationModule module)
+ throws IntegrationException {
+
+
+ Transaction transaction = new Transaction();
+ transaction.setAmount(amount);
+ transaction.setTransactionDate(new Date());
+ transaction.setTransactionType(TransactionType.AUTHORIZECAPTURE);
+ transaction.setPaymentType(PaymentType.MONEYORDER);
+
+
+ return transaction;
+
+
+
+ }
+
+ @Override
+ public Transaction refund(boolean partial, MerchantStore store, Transaction transaction,
+ Order order, BigDecimal amount,
+ IntegrationConfiguration configuration, IntegrationModule module)
+ throws IntegrationException {
+ throw new IntegrationException("Transaction not supported");
+ }
+
+ @Override
+ public Transaction capture(MerchantStore store, Customer customer,
+ Order order, Transaction capturableTransaction,
+ IntegrationConfiguration configuration, IntegrationModule module)
+ throws IntegrationException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/payment/impl/PayPalExpressCheckoutPayment.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/payment/impl/PayPalExpressCheckoutPayment.java
index 85c9973..4ad59c8 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/payment/impl/PayPalExpressCheckoutPayment.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/payment/impl/PayPalExpressCheckoutPayment.java
@@ -151,6 +151,9 @@ public class PayPalExpressCheckoutPayment implements PaymentModule {
IntegrationConfiguration configuration, IntegrationModule module)
throws IntegrationException {
+ Validate.notNull(configuration, "Configuration must not be null");
+ Validate.notNull(payment, "Payment must not be null");
+ Validate.notNull(summary, "OrderTotalSummary must not be null");
try {
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/payment/impl/StripePayment.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/payment/impl/StripePayment.java
index adaadfe..f21ea36 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/payment/impl/StripePayment.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/payment/impl/StripePayment.java
@@ -1,552 +1,552 @@
-package com.salesmanager.core.business.modules.integration.payment.impl;
-
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.inject.Inject;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.salesmanager.core.business.utils.ProductPriceUtils;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.Order;
-import com.salesmanager.core.model.payments.Payment;
-import com.salesmanager.core.model.payments.PaymentType;
-import com.salesmanager.core.model.payments.Transaction;
-import com.salesmanager.core.model.payments.TransactionType;
-import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
-import com.salesmanager.core.model.system.IntegrationConfiguration;
-import com.salesmanager.core.model.system.IntegrationModule;
-import com.salesmanager.core.modules.integration.IntegrationException;
-import com.salesmanager.core.modules.integration.payment.model.PaymentModule;
-import com.stripe.Stripe;
-import com.stripe.exception.APIConnectionException;
-import com.stripe.exception.AuthenticationException;
-import com.stripe.exception.CardException;
-import com.stripe.exception.InvalidRequestException;
-import com.stripe.exception.StripeException;
-import com.stripe.model.Charge;
-import com.stripe.model.Refund;
-
-public class StripePayment implements PaymentModule {
-
- @Inject
- private ProductPriceUtils productPriceUtils;
-
-
- private final static String AUTHORIZATION = "Authorization";
- private final static String TRANSACTION = "Transaction";
-
- private static final Logger LOGGER = LoggerFactory.getLogger(StripePayment.class);
-
- @Override
- public void validateModuleConfiguration(
- IntegrationConfiguration integrationConfiguration,
- MerchantStore store) throws IntegrationException {
-
-
- List<String> errorFields = null;
-
-
- Map<String,String> keys = integrationConfiguration.getIntegrationKeys();
-
- //validate integrationKeys['secretKey']
- if(keys==null || StringUtils.isBlank(keys.get("secretKey"))) {
- errorFields = new ArrayList<String>();
- errorFields.add("secretKey");
- }
-
- //validate integrationKeys['publishableKey']
- if(keys==null || StringUtils.isBlank(keys.get("publishableKey"))) {
- if(errorFields==null) {
- errorFields = new ArrayList<String>();
- }
- errorFields.add("publishableKey");
- }
-
-
- if(errorFields!=null) {
- IntegrationException ex = new IntegrationException(IntegrationException.ERROR_VALIDATION_SAVE);
- ex.setErrorFields(errorFields);
- throw ex;
-
- }
-
-
-
- }
-
-
- @Override
- public Transaction initTransaction(MerchantStore store, Customer customer,
- BigDecimal amount, Payment payment,
- IntegrationConfiguration configuration, IntegrationModule module)
- throws IntegrationException {
- // Not supported
- return null;
- }
-
- @Override
- public Transaction authorize(MerchantStore store, Customer customer,
- List<ShoppingCartItem> items, BigDecimal amount, Payment payment,
- IntegrationConfiguration configuration, IntegrationModule module)
- throws IntegrationException {
-
- Transaction transaction = new Transaction();
- try {
-
-
- String apiKey = configuration.getIntegrationKeys().get("secretKey");
-
- if(payment.getPaymentMetaData()==null || StringUtils.isBlank(apiKey)) {
- IntegrationException te = new IntegrationException(
- "Can't process Stripe, missing payment.metaData");
- te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
- te.setMessageCode("message.payment.error");
- te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
- throw te;
- }
-
- String token = payment.getPaymentMetaData().get("stripe_token");
-
- if(StringUtils.isBlank(token)) {
- IntegrationException te = new IntegrationException(
- "Can't process Stripe, missing stripe token");
- te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
- te.setMessageCode("message.payment.error");
- te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
- throw te;
- }
-
-
- String amnt = productPriceUtils.getAdminFormatedAmount(store, amount);
-
- //stripe does not support floating point
- //so amnt * 100 or remove floating point
- //553.47 = 55347
-
- String strAmount = String.valueOf(amnt);
- strAmount = strAmount.replace(".","");
-
- Map<String, Object> chargeParams = new HashMap<String, Object>();
- chargeParams.put("amount", strAmount);
- chargeParams.put("capture", false);
- chargeParams.put("currency", store.getCurrency().getCode());
- chargeParams.put("source", token); // obtained with Stripe.js
- chargeParams.put("description", new StringBuilder().append(TRANSACTION).append(" - ").append(store.getStorename()).toString());
-
- Stripe.apiKey = apiKey;
-
-
- Charge ch = Charge.create(chargeParams);
-
- //Map<String,String> metadata = ch.getMetadata();
-
-
- transaction.setAmount(amount);
- //transaction.setOrder(order);
- transaction.setTransactionDate(new Date());
- transaction.setTransactionType(TransactionType.AUTHORIZE);
- transaction.setPaymentType(PaymentType.CREDITCARD);
- transaction.getTransactionDetails().put("TRANSACTIONID", token);
- transaction.getTransactionDetails().put("TRNAPPROVED", ch.getStatus());
- transaction.getTransactionDetails().put("TRNORDERNUMBER", ch.getId());
- transaction.getTransactionDetails().put("MESSAGETEXT", null);
-
- } catch (Exception e) {
-
- throw buildException(e);
-
- }
-
- return transaction;
-
-
- }
-
- @Override
- public Transaction capture(MerchantStore store, Customer customer,
- Order order, Transaction capturableTransaction,
- IntegrationConfiguration configuration, IntegrationModule module)
- throws IntegrationException {
-
-
- Transaction transaction = new Transaction();
- try {
-
-
- String apiKey = configuration.getIntegrationKeys().get("secretKey");
-
- if(StringUtils.isBlank(apiKey)) {
- IntegrationException te = new IntegrationException(
- "Can't process Stripe, missing payment.metaData");
- te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
- te.setMessageCode("message.payment.error");
- te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
- throw te;
- }
-
- String chargeId = capturableTransaction.getTransactionDetails().get("TRNORDERNUMBER");
-
- if(StringUtils.isBlank(chargeId)) {
- IntegrationException te = new IntegrationException(
- "Can't process Stripe capture, missing TRNORDERNUMBER");
- te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
- te.setMessageCode("message.payment.error");
- te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
- throw te;
- }
-
-
- Stripe.apiKey = apiKey;
-
- Charge ch = Charge.retrieve(chargeId);
- ch.capture();
-
-
- transaction.setAmount(order.getTotal());
- transaction.setOrder(order);
- transaction.setTransactionDate(new Date());
- transaction.setTransactionType(TransactionType.CAPTURE);
- transaction.setPaymentType(PaymentType.CREDITCARD);
- transaction.getTransactionDetails().put("TRANSACTIONID", capturableTransaction.getTransactionDetails().get("TRANSACTIONID"));
- transaction.getTransactionDetails().put("TRNAPPROVED", ch.getStatus());
- transaction.getTransactionDetails().put("TRNORDERNUMBER", ch.getId());
- transaction.getTransactionDetails().put("MESSAGETEXT", null);
-
- //authorize a preauth
-
-
- return transaction;
-
- } catch (Exception e) {
-
- throw buildException(e);
-
- }
-
- }
-
- @Override
- public Transaction authorizeAndCapture(MerchantStore store, Customer customer,
- List<ShoppingCartItem> items, BigDecimal amount, Payment payment,
- IntegrationConfiguration configuration, IntegrationModule module)
- throws IntegrationException {
-
- String apiKey = configuration.getIntegrationKeys().get("secretKey");
-
- if(payment.getPaymentMetaData()==null || StringUtils.isBlank(apiKey)) {
- IntegrationException te = new IntegrationException(
- "Can't process Stripe, missing payment.metaData");
- te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
- te.setMessageCode("message.payment.error");
- te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
- throw te;
- }
-
- String token = payment.getPaymentMetaData().get("stripe_token");
-
- if(StringUtils.isBlank(token)) {
- IntegrationException te = new IntegrationException(
- "Can't process Stripe, missing stripe token");
- te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
- te.setMessageCode("message.payment.error");
- te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
- throw te;
- }
-
-
-
- Transaction transaction = new Transaction();
- try {
-
- String amnt = productPriceUtils.getAdminFormatedAmount(store, amount);
-
- //stripe does not support floating point
- //so amnt * 100 or remove floating point
- //553.47 = 55347
-
-
- String strAmount = String.valueOf(amnt);
- strAmount = strAmount.replace(".","");
-
- Map<String, Object> chargeParams = new HashMap<String, Object>();
- chargeParams.put("amount", strAmount);
- chargeParams.put("capture", true);
- chargeParams.put("currency", store.getCurrency().getCode());
- chargeParams.put("source", token); // obtained with Stripe.js
- chargeParams.put("description", new StringBuilder().append(TRANSACTION).append(" - ").append(store.getStorename()).toString());
-
- Stripe.apiKey = apiKey;
-
-
- Charge ch = Charge.create(chargeParams);
-
- //Map<String,String> metadata = ch.getMetadata();
-
-
- transaction.setAmount(amount);
- //transaction.setOrder(order);
- transaction.setTransactionDate(new Date());
- transaction.setTransactionType(TransactionType.AUTHORIZE);
- transaction.setPaymentType(PaymentType.CREDITCARD);
- transaction.getTransactionDetails().put("TRANSACTIONID", token);
- transaction.getTransactionDetails().put("TRNAPPROVED", ch.getStatus());
- transaction.getTransactionDetails().put("TRNORDERNUMBER", ch.getId());
- transaction.getTransactionDetails().put("MESSAGETEXT", null);
-
- } catch (Exception e) {
-
- throw buildException(e);
-
- }
-
- return transaction;
-
- }
-
- @Override
- public Transaction refund(boolean partial, MerchantStore store, Transaction transaction,
- Order order, BigDecimal amount,
- IntegrationConfiguration configuration, IntegrationModule module)
- throws IntegrationException {
-
-
-
- String apiKey = configuration.getIntegrationKeys().get("secretKey");
-
- if(StringUtils.isBlank(apiKey)) {
- IntegrationException te = new IntegrationException(
- "Can't process Stripe, missing payment.metaData");
- te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
- te.setMessageCode("message.payment.error");
- te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
- throw te;
- }
-
- try {
-
-
- String trnID = transaction.getTransactionDetails().get("TRNORDERNUMBER");
-
- String amnt = productPriceUtils.getAdminFormatedAmount(store, amount);
-
- Stripe.apiKey = apiKey;
-
- //stripe does not support floating point
- //so amnt * 100 or remove floating point
- //553.47 = 55347
-
- String strAmount = String.valueOf(amnt);
- strAmount = strAmount.replace(".","");
-
- Map params = new HashMap();
- //TODO amount
- params.put("amount", strAmount);
- Charge ch = Charge.retrieve(trnID);
- Refund re = ch.getRefunds().create(params);
-
- transaction = new Transaction();
- transaction.setAmount(order.getTotal());
- transaction.setOrder(order);
- transaction.setTransactionDate(new Date());
- transaction.setTransactionType(TransactionType.CAPTURE);
- transaction.setPaymentType(PaymentType.CREDITCARD);
- transaction.getTransactionDetails().put("TRANSACTIONID", transaction.getTransactionDetails().get("TRANSACTIONID"));
- transaction.getTransactionDetails().put("TRNAPPROVED", re.getReason());
- transaction.getTransactionDetails().put("TRNORDERNUMBER", re.getId());
- transaction.getTransactionDetails().put("MESSAGETEXT", null);
-
- return transaction;
-
-
- } catch(Exception e) {
-
- throw buildException(e);
-
- }
-
-
-
- }
-
- private IntegrationException buildException(Exception ex) {
-
-
- if(ex instanceof CardException) {
- CardException e = (CardException)ex;
- // Since it's a decline, CardException will be caught
- //System.out.println("Status is: " + e.getCode());
- //System.out.println("Message is: " + e.getMessage());
-
-
- /**
- *
- invalid_number The card number is not a valid credit card number.
- invalid_expiry_month The card's expiration month is invalid.
- invalid_expiry_year The card's expiration year is invalid.
- invalid_cvc The card's security code is invalid.
- incorrect_number The card number is incorrect.
- expired_card The card has expired.
- incorrect_cvc The card's security code is incorrect.
- incorrect_zip The card's zip code failed validation.
- card_declined The card was declined.
- missing There is no card on a customer that is being charged.
- processing_error An error occurred while processing the card.
- rate_limit An error occurred due to requests hitting the API too quickly. Please let us know if you're consistently running into this error.
- */
-
-
- String declineCode = e.getDeclineCode();
-
- if("card_declined".equals(declineCode)) {
- IntegrationException te = new IntegrationException(
- "Can't process stripe message " + e.getMessage());
- te.setExceptionType(IntegrationException.EXCEPTION_PAYMENT_DECLINED);
- te.setMessageCode("message.payment.declined");
- te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
- return te;
- }
-
- if("invalid_number".equals(declineCode)) {
- IntegrationException te = new IntegrationException(
- "Can't process stripe message " + e.getMessage());
- te.setExceptionType(IntegrationException.EXCEPTION_VALIDATION);
- te.setMessageCode("messages.error.creditcard.number");
- te.setErrorCode(IntegrationException.EXCEPTION_VALIDATION);
- return te;
- }
-
- if("invalid_expiry_month".equals(declineCode)) {
- IntegrationException te = new IntegrationException(
- "Can't process stripe message " + e.getMessage());
- te.setExceptionType(IntegrationException.EXCEPTION_VALIDATION);
- te.setMessageCode("messages.error.creditcard.dateformat");
- te.setErrorCode(IntegrationException.EXCEPTION_VALIDATION);
- return te;
- }
-
- if("invalid_expiry_year".equals(declineCode)) {
- IntegrationException te = new IntegrationException(
- "Can't process stripe message " + e.getMessage());
- te.setExceptionType(IntegrationException.EXCEPTION_VALIDATION);
- te.setMessageCode("messages.error.creditcard.dateformat");
- te.setErrorCode(IntegrationException.EXCEPTION_VALIDATION);
- return te;
- }
-
- if("invalid_cvc".equals(declineCode)) {
- IntegrationException te = new IntegrationException(
- "Can't process stripe message " + e.getMessage());
- te.setExceptionType(IntegrationException.EXCEPTION_VALIDATION);
- te.setMessageCode("messages.error.creditcard.cvc");
- te.setErrorCode(IntegrationException.EXCEPTION_VALIDATION);
- return te;
- }
-
- if("incorrect_number".equals(declineCode)) {
- IntegrationException te = new IntegrationException(
- "Can't process stripe message " + e.getMessage());
- te.setExceptionType(IntegrationException.EXCEPTION_VALIDATION);
- te.setMessageCode("messages.error.creditcard.number");
- te.setErrorCode(IntegrationException.EXCEPTION_VALIDATION);
- return te;
- }
-
- if("incorrect_cvc".equals(declineCode)) {
- IntegrationException te = new IntegrationException(
- "Can't process stripe message " + e.getMessage());
- te.setExceptionType(IntegrationException.EXCEPTION_VALIDATION);
- te.setMessageCode("messages.error.creditcard.cvc");
- te.setErrorCode(IntegrationException.EXCEPTION_VALIDATION);
- return te;
- }
-
-
-
- } else if (ex instanceof InvalidRequestException) {
- LOGGER.error("InvalidRequest error with stripe", ex.getMessage());
- InvalidRequestException e =(InvalidRequestException)ex;
- IntegrationException te = new IntegrationException(
- "Can't process Stripe, missing invalid payment parameters");
- te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
- te.setMessageCode("message.payment.error");
- te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
- return te;
-
- } else if (ex instanceof AuthenticationException) {
- LOGGER.error("Authentication error with stripe", ex.getMessage());
- AuthenticationException e = (AuthenticationException)ex;
- // Authentication with Stripe's API failed
- // (maybe you changed API keys recently)
- IntegrationException te = new IntegrationException(
- "Can't process Stripe, missing invalid payment parameters");
- te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
- te.setMessageCode("message.payment.error");
- te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
- return te;
-
- } else if (ex instanceof APIConnectionException) {
- LOGGER.error("API connection error with stripe", ex.getMessage());
- APIConnectionException e = (APIConnectionException)ex;
- // Network communication with Stripe failed
- IntegrationException te = new IntegrationException(
- "Can't process Stripe, missing invalid payment parameters");
- te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
- te.setMessageCode("message.payment.error");
- te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
- return te;
- } else if (ex instanceof StripeException) {
- LOGGER.error("Error with stripe", ex.getMessage());
- StripeException e = (StripeException)ex;
- // Display a very generic error to the user, and maybe send
- // yourself an email
- IntegrationException te = new IntegrationException(
- "Can't process Stripe authorize, missing invalid payment parameters");
- te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
- te.setMessageCode("message.payment.error");
- te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
- return te;
-
-
-
- } else if (ex instanceof Exception) {
- LOGGER.error("Stripe module error", ex.getMessage());
- if(ex instanceof IntegrationException) {
- return (IntegrationException)ex;
- } else {
- IntegrationException te = new IntegrationException(
- "Can't process Stripe authorize, exception", ex);
- te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
- te.setMessageCode("message.payment.error");
- te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
- return te;
- }
-
-
- } else {
- LOGGER.error("Stripe module error", ex.getMessage());
- IntegrationException te = new IntegrationException(
- "Can't process Stripe authorize, exception", ex);
- te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
- te.setMessageCode("message.payment.error");
- te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
- return te;
- }
- return null;
-
-
- }
-
-
-
-
-
-}
+package com.salesmanager.core.business.modules.integration.payment.impl;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.salesmanager.core.business.utils.ProductPriceUtils;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.payments.Payment;
+import com.salesmanager.core.model.payments.PaymentType;
+import com.salesmanager.core.model.payments.Transaction;
+import com.salesmanager.core.model.payments.TransactionType;
+import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
+import com.salesmanager.core.model.system.IntegrationConfiguration;
+import com.salesmanager.core.model.system.IntegrationModule;
+import com.salesmanager.core.modules.integration.IntegrationException;
+import com.salesmanager.core.modules.integration.payment.model.PaymentModule;
+import com.stripe.Stripe;
+import com.stripe.exception.APIConnectionException;
+import com.stripe.exception.AuthenticationException;
+import com.stripe.exception.CardException;
+import com.stripe.exception.InvalidRequestException;
+import com.stripe.exception.StripeException;
+import com.stripe.model.Charge;
+import com.stripe.model.Refund;
+
+public class StripePayment implements PaymentModule {
+
+ @Inject
+ private ProductPriceUtils productPriceUtils;
+
+
+ private final static String AUTHORIZATION = "Authorization";
+ private final static String TRANSACTION = "Transaction";
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(StripePayment.class);
+
+ @Override
+ public void validateModuleConfiguration(
+ IntegrationConfiguration integrationConfiguration,
+ MerchantStore store) throws IntegrationException {
+
+
+ List<String> errorFields = null;
+
+
+ Map<String,String> keys = integrationConfiguration.getIntegrationKeys();
+
+ //validate integrationKeys['secretKey']
+ if(keys==null || StringUtils.isBlank(keys.get("secretKey"))) {
+ errorFields = new ArrayList<String>();
+ errorFields.add("secretKey");
+ }
+
+ //validate integrationKeys['publishableKey']
+ if(keys==null || StringUtils.isBlank(keys.get("publishableKey"))) {
+ if(errorFields==null) {
+ errorFields = new ArrayList<String>();
+ }
+ errorFields.add("publishableKey");
+ }
+
+
+ if(errorFields!=null) {
+ IntegrationException ex = new IntegrationException(IntegrationException.ERROR_VALIDATION_SAVE);
+ ex.setErrorFields(errorFields);
+ throw ex;
+
+ }
+
+
+
+ }
+
+
+ @Override
+ public Transaction initTransaction(MerchantStore store, Customer customer,
+ BigDecimal amount, Payment payment,
+ IntegrationConfiguration configuration, IntegrationModule module)
+ throws IntegrationException {
+ // Not supported
+ return null;
+ }
+
+ @Override
+ public Transaction authorize(MerchantStore store, Customer customer,
+ List<ShoppingCartItem> items, BigDecimal amount, Payment payment,
+ IntegrationConfiguration configuration, IntegrationModule module)
+ throws IntegrationException {
+
+ Transaction transaction = new Transaction();
+ try {
+
+
+ String apiKey = configuration.getIntegrationKeys().get("secretKey");
+
+ if(payment.getPaymentMetaData()==null || StringUtils.isBlank(apiKey)) {
+ IntegrationException te = new IntegrationException(
+ "Can't process Stripe, missing payment.metaData");
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ throw te;
+ }
+
+ String token = payment.getPaymentMetaData().get("stripe_token");
+
+ if(StringUtils.isBlank(token)) {
+ IntegrationException te = new IntegrationException(
+ "Can't process Stripe, missing stripe token");
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ throw te;
+ }
+
+
+ String amnt = productPriceUtils.getAdminFormatedAmount(store, amount);
+
+ //stripe does not support floating point
+ //so amnt * 100 or remove floating point
+ //553.47 = 55347
+
+ String strAmount = String.valueOf(amnt);
+ strAmount = strAmount.replace(".","");
+
+ Map<String, Object> chargeParams = new HashMap<String, Object>();
+ chargeParams.put("amount", strAmount);
+ chargeParams.put("capture", false);
+ chargeParams.put("currency", store.getCurrency().getCode());
+ chargeParams.put("source", token); // obtained with Stripe.js
+ chargeParams.put("description", new StringBuilder().append(TRANSACTION).append(" - ").append(store.getStorename()).toString());
+
+ Stripe.apiKey = apiKey;
+
+
+ Charge ch = Charge.create(chargeParams);
+
+ //Map<String,String> metadata = ch.getMetadata();
+
+
+ transaction.setAmount(amount);
+ //transaction.setOrder(order);
+ transaction.setTransactionDate(new Date());
+ transaction.setTransactionType(TransactionType.AUTHORIZE);
+ transaction.setPaymentType(PaymentType.CREDITCARD);
+ transaction.getTransactionDetails().put("TRANSACTIONID", token);
+ transaction.getTransactionDetails().put("TRNAPPROVED", ch.getStatus());
+ transaction.getTransactionDetails().put("TRNORDERNUMBER", ch.getId());
+ transaction.getTransactionDetails().put("MESSAGETEXT", null);
+
+ } catch (Exception e) {
+
+ throw buildException(e);
+
+ }
+
+ return transaction;
+
+
+ }
+
+ @Override
+ public Transaction capture(MerchantStore store, Customer customer,
+ Order order, Transaction capturableTransaction,
+ IntegrationConfiguration configuration, IntegrationModule module)
+ throws IntegrationException {
+
+
+ Transaction transaction = new Transaction();
+ try {
+
+
+ String apiKey = configuration.getIntegrationKeys().get("secretKey");
+
+ if(StringUtils.isBlank(apiKey)) {
+ IntegrationException te = new IntegrationException(
+ "Can't process Stripe, missing payment.metaData");
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ throw te;
+ }
+
+ String chargeId = capturableTransaction.getTransactionDetails().get("TRNORDERNUMBER");
+
+ if(StringUtils.isBlank(chargeId)) {
+ IntegrationException te = new IntegrationException(
+ "Can't process Stripe capture, missing TRNORDERNUMBER");
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ throw te;
+ }
+
+
+ Stripe.apiKey = apiKey;
+
+ Charge ch = Charge.retrieve(chargeId);
+ ch.capture();
+
+
+ transaction.setAmount(order.getTotal());
+ transaction.setOrder(order);
+ transaction.setTransactionDate(new Date());
+ transaction.setTransactionType(TransactionType.CAPTURE);
+ transaction.setPaymentType(PaymentType.CREDITCARD);
+ transaction.getTransactionDetails().put("TRANSACTIONID", capturableTransaction.getTransactionDetails().get("TRANSACTIONID"));
+ transaction.getTransactionDetails().put("TRNAPPROVED", ch.getStatus());
+ transaction.getTransactionDetails().put("TRNORDERNUMBER", ch.getId());
+ transaction.getTransactionDetails().put("MESSAGETEXT", null);
+
+ //authorize a preauth
+
+
+ return transaction;
+
+ } catch (Exception e) {
+
+ throw buildException(e);
+
+ }
+
+ }
+
+ @Override
+ public Transaction authorizeAndCapture(MerchantStore store, Customer customer,
+ List<ShoppingCartItem> items, BigDecimal amount, Payment payment,
+ IntegrationConfiguration configuration, IntegrationModule module)
+ throws IntegrationException {
+
+ String apiKey = configuration.getIntegrationKeys().get("secretKey");
+
+ if(payment.getPaymentMetaData()==null || StringUtils.isBlank(apiKey)) {
+ IntegrationException te = new IntegrationException(
+ "Can't process Stripe, missing payment.metaData");
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ throw te;
+ }
+
+ String token = payment.getPaymentMetaData().get("stripe_token");
+
+ if(StringUtils.isBlank(token)) {
+ IntegrationException te = new IntegrationException(
+ "Can't process Stripe, missing stripe token");
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ throw te;
+ }
+
+
+
+ Transaction transaction = new Transaction();
+ try {
+
+ String amnt = productPriceUtils.getAdminFormatedAmount(store, amount);
+
+ //stripe does not support floating point
+ //so amnt * 100 or remove floating point
+ //553.47 = 55347
+
+
+ String strAmount = String.valueOf(amnt);
+ strAmount = strAmount.replace(".","");
+
+ Map<String, Object> chargeParams = new HashMap<String, Object>();
+ chargeParams.put("amount", strAmount);
+ chargeParams.put("capture", true);
+ chargeParams.put("currency", store.getCurrency().getCode());
+ chargeParams.put("source", token); // obtained with Stripe.js
+ chargeParams.put("description", new StringBuilder().append(TRANSACTION).append(" - ").append(store.getStorename()).toString());
+
+ Stripe.apiKey = apiKey;
+
+
+ Charge ch = Charge.create(chargeParams);
+
+ //Map<String,String> metadata = ch.getMetadata();
+
+
+ transaction.setAmount(amount);
+ //transaction.setOrder(order);
+ transaction.setTransactionDate(new Date());
+ transaction.setTransactionType(TransactionType.AUTHORIZE);
+ transaction.setPaymentType(PaymentType.CREDITCARD);
+ transaction.getTransactionDetails().put("TRANSACTIONID", token);
+ transaction.getTransactionDetails().put("TRNAPPROVED", ch.getStatus());
+ transaction.getTransactionDetails().put("TRNORDERNUMBER", ch.getId());
+ transaction.getTransactionDetails().put("MESSAGETEXT", null);
+
+ } catch (Exception e) {
+
+ throw buildException(e);
+
+ }
+
+ return transaction;
+
+ }
+
+ @Override
+ public Transaction refund(boolean partial, MerchantStore store, Transaction transaction,
+ Order order, BigDecimal amount,
+ IntegrationConfiguration configuration, IntegrationModule module)
+ throws IntegrationException {
+
+
+
+ String apiKey = configuration.getIntegrationKeys().get("secretKey");
+
+ if(StringUtils.isBlank(apiKey)) {
+ IntegrationException te = new IntegrationException(
+ "Can't process Stripe, missing payment.metaData");
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ throw te;
+ }
+
+ try {
+
+
+ String trnID = transaction.getTransactionDetails().get("TRNORDERNUMBER");
+
+ String amnt = productPriceUtils.getAdminFormatedAmount(store, amount);
+
+ Stripe.apiKey = apiKey;
+
+ //stripe does not support floating point
+ //so amnt * 100 or remove floating point
+ //553.47 = 55347
+
+ String strAmount = String.valueOf(amnt);
+ strAmount = strAmount.replace(".","");
+
+ Map params = new HashMap();
+ //TODO amount
+ params.put("amount", strAmount);
+ Charge ch = Charge.retrieve(trnID);
+ Refund re = ch.getRefunds().create(params);
+
+ transaction = new Transaction();
+ transaction.setAmount(order.getTotal());
+ transaction.setOrder(order);
+ transaction.setTransactionDate(new Date());
+ transaction.setTransactionType(TransactionType.CAPTURE);
+ transaction.setPaymentType(PaymentType.CREDITCARD);
+ transaction.getTransactionDetails().put("TRANSACTIONID", transaction.getTransactionDetails().get("TRANSACTIONID"));
+ transaction.getTransactionDetails().put("TRNAPPROVED", re.getReason());
+ transaction.getTransactionDetails().put("TRNORDERNUMBER", re.getId());
+ transaction.getTransactionDetails().put("MESSAGETEXT", null);
+
+ return transaction;
+
+
+ } catch(Exception e) {
+
+ throw buildException(e);
+
+ }
+
+
+
+ }
+
+ private IntegrationException buildException(Exception ex) {
+
+
+ if(ex instanceof CardException) {
+ CardException e = (CardException)ex;
+ // Since it's a decline, CardException will be caught
+ //System.out.println("Status is: " + e.getCode());
+ //System.out.println("Message is: " + e.getMessage());
+
+
+ /**
+ *
+ invalid_number The card number is not a valid credit card number.
+ invalid_expiry_month The card's expiration month is invalid.
+ invalid_expiry_year The card's expiration year is invalid.
+ invalid_cvc The card's security code is invalid.
+ incorrect_number The card number is incorrect.
+ expired_card The card has expired.
+ incorrect_cvc The card's security code is incorrect.
+ incorrect_zip The card's zip code failed validation.
+ card_declined The card was declined.
+ missing There is no card on a customer that is being charged.
+ processing_error An error occurred while processing the card.
+ rate_limit An error occurred due to requests hitting the API too quickly. Please let us know if you're consistently running into this error.
+ */
+
+
+ String declineCode = e.getDeclineCode();
+
+ if("card_declined".equals(declineCode)) {
+ IntegrationException te = new IntegrationException(
+ "Can't process stripe message " + e.getMessage());
+ te.setExceptionType(IntegrationException.EXCEPTION_PAYMENT_DECLINED);
+ te.setMessageCode("message.payment.declined");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ return te;
+ }
+
+ if("invalid_number".equals(declineCode)) {
+ IntegrationException te = new IntegrationException(
+ "Can't process stripe message " + e.getMessage());
+ te.setExceptionType(IntegrationException.EXCEPTION_VALIDATION);
+ te.setMessageCode("messages.error.creditcard.number");
+ te.setErrorCode(IntegrationException.EXCEPTION_VALIDATION);
+ return te;
+ }
+
+ if("invalid_expiry_month".equals(declineCode)) {
+ IntegrationException te = new IntegrationException(
+ "Can't process stripe message " + e.getMessage());
+ te.setExceptionType(IntegrationException.EXCEPTION_VALIDATION);
+ te.setMessageCode("messages.error.creditcard.dateformat");
+ te.setErrorCode(IntegrationException.EXCEPTION_VALIDATION);
+ return te;
+ }
+
+ if("invalid_expiry_year".equals(declineCode)) {
+ IntegrationException te = new IntegrationException(
+ "Can't process stripe message " + e.getMessage());
+ te.setExceptionType(IntegrationException.EXCEPTION_VALIDATION);
+ te.setMessageCode("messages.error.creditcard.dateformat");
+ te.setErrorCode(IntegrationException.EXCEPTION_VALIDATION);
+ return te;
+ }
+
+ if("invalid_cvc".equals(declineCode)) {
+ IntegrationException te = new IntegrationException(
+ "Can't process stripe message " + e.getMessage());
+ te.setExceptionType(IntegrationException.EXCEPTION_VALIDATION);
+ te.setMessageCode("messages.error.creditcard.cvc");
+ te.setErrorCode(IntegrationException.EXCEPTION_VALIDATION);
+ return te;
+ }
+
+ if("incorrect_number".equals(declineCode)) {
+ IntegrationException te = new IntegrationException(
+ "Can't process stripe message " + e.getMessage());
+ te.setExceptionType(IntegrationException.EXCEPTION_VALIDATION);
+ te.setMessageCode("messages.error.creditcard.number");
+ te.setErrorCode(IntegrationException.EXCEPTION_VALIDATION);
+ return te;
+ }
+
+ if("incorrect_cvc".equals(declineCode)) {
+ IntegrationException te = new IntegrationException(
+ "Can't process stripe message " + e.getMessage());
+ te.setExceptionType(IntegrationException.EXCEPTION_VALIDATION);
+ te.setMessageCode("messages.error.creditcard.cvc");
+ te.setErrorCode(IntegrationException.EXCEPTION_VALIDATION);
+ return te;
+ }
+
+
+
+ } else if (ex instanceof InvalidRequestException) {
+ LOGGER.error("InvalidRequest error with stripe", ex.getMessage());
+ InvalidRequestException e =(InvalidRequestException)ex;
+ IntegrationException te = new IntegrationException(
+ "Can't process Stripe, missing invalid payment parameters");
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ return te;
+
+ } else if (ex instanceof AuthenticationException) {
+ LOGGER.error("Authentication error with stripe", ex.getMessage());
+ AuthenticationException e = (AuthenticationException)ex;
+ // Authentication with Stripe's API failed
+ // (maybe you changed API keys recently)
+ IntegrationException te = new IntegrationException(
+ "Can't process Stripe, missing invalid payment parameters");
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ return te;
+
+ } else if (ex instanceof APIConnectionException) {
+ LOGGER.error("API connection error with stripe", ex.getMessage());
+ APIConnectionException e = (APIConnectionException)ex;
+ // Network communication with Stripe failed
+ IntegrationException te = new IntegrationException(
+ "Can't process Stripe, missing invalid payment parameters");
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ return te;
+ } else if (ex instanceof StripeException) {
+ LOGGER.error("Error with stripe", ex.getMessage());
+ StripeException e = (StripeException)ex;
+ // Display a very generic error to the user, and maybe send
+ // yourself an email
+ IntegrationException te = new IntegrationException(
+ "Can't process Stripe authorize, missing invalid payment parameters");
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ return te;
+
+
+
+ } else if (ex instanceof Exception) {
+ LOGGER.error("Stripe module error", ex.getMessage());
+ if(ex instanceof IntegrationException) {
+ return (IntegrationException)ex;
+ } else {
+ IntegrationException te = new IntegrationException(
+ "Can't process Stripe authorize, exception", ex);
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ return te;
+ }
+
+
+ } else {
+ LOGGER.error("Stripe module error", ex.getMessage());
+ IntegrationException te = new IntegrationException(
+ "Can't process Stripe authorize, exception", ex);
+ te.setExceptionType(IntegrationException.TRANSACTION_EXCEPTION);
+ te.setMessageCode("message.payment.error");
+ te.setErrorCode(IntegrationException.TRANSACTION_EXCEPTION);
+ return te;
+ }
+ return null;
+
+
+ }
+
+
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/CustomWeightBasedShippingQuote.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/CustomWeightBasedShippingQuote.java
index ba418f0..2411f2b 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/CustomWeightBasedShippingQuote.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/CustomWeightBasedShippingQuote.java
@@ -1,161 +1,161 @@
-package com.salesmanager.core.business.modules.integration.shipping.impl;
-
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
-import javax.inject.Inject;
-
-import org.apache.commons.lang3.StringUtils;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.system.MerchantConfigurationService;
-import com.salesmanager.core.business.utils.ProductPriceUtils;
-import com.salesmanager.core.model.common.Delivery;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.shipping.PackageDetails;
-import com.salesmanager.core.model.shipping.ShippingBasisType;
-import com.salesmanager.core.model.shipping.ShippingConfiguration;
-import com.salesmanager.core.model.shipping.ShippingOption;
-import com.salesmanager.core.model.shipping.ShippingOrigin;
-import com.salesmanager.core.model.shipping.ShippingQuote;
-import com.salesmanager.core.model.system.CustomIntegrationConfiguration;
-import com.salesmanager.core.model.system.IntegrationConfiguration;
-import com.salesmanager.core.model.system.IntegrationModule;
-import com.salesmanager.core.model.system.MerchantConfiguration;
-import com.salesmanager.core.modules.integration.IntegrationException;
-import com.salesmanager.core.modules.integration.shipping.model.CustomShippingQuoteWeightItem;
-import com.salesmanager.core.modules.integration.shipping.model.CustomShippingQuotesConfiguration;
-import com.salesmanager.core.modules.integration.shipping.model.CustomShippingQuotesRegion;
-import com.salesmanager.core.modules.integration.shipping.model.ShippingQuoteModule;
-
-
-public class CustomWeightBasedShippingQuote implements ShippingQuoteModule {
-
- public final static String MODULE_CODE = "weightBased";
- private final static String CUSTOM_WEIGHT = "CUSTOM_WEIGHT";
-
- @Inject
- private MerchantConfigurationService merchantConfigurationService;
-
- @Inject
- private ProductPriceUtils productPriceUtils;
-
-
- @Override
- public void validateModuleConfiguration(
- IntegrationConfiguration integrationConfiguration,
- MerchantStore store) throws IntegrationException {
-
-
- //not used, it has its own controller with complex validators
-
- }
-
-
- @Override
- public CustomIntegrationConfiguration getCustomModuleConfiguration(
- MerchantStore store) throws IntegrationException {
-
- try {
-
- MerchantConfiguration configuration = merchantConfigurationService.getMerchantConfiguration(MODULE_CODE, store);
-
- if(configuration!=null) {
- String value = configuration.getValue();
- ObjectMapper mapper = new ObjectMapper();
- try {
- CustomShippingQuotesConfiguration config = mapper.readValue(value, CustomShippingQuotesConfiguration.class);
- return config;
- } catch(Exception e) {
- throw new ServiceException("Cannot parse json string " + value);
- }
-
- } else {
- CustomShippingQuotesConfiguration custom = new CustomShippingQuotesConfiguration();
- custom.setModuleCode(MODULE_CODE);
- return custom;
- }
-
- } catch (Exception e) {
- throw new IntegrationException(e);
- }
-
-
- }
-
- @Override
- public List<ShippingOption> getShippingQuotes(
- ShippingQuote shippingQuote,
- List<PackageDetails> packages, BigDecimal orderTotal,
- Delivery delivery, ShippingOrigin origin, MerchantStore store,
- IntegrationConfiguration configuration, IntegrationModule module,
- ShippingConfiguration shippingConfiguration, Locale locale)
- throws IntegrationException {
-
- if(StringUtils.isBlank(delivery.getPostalCode())) {
- return null;
- }
-
- //get configuration
- CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)this.getCustomModuleConfiguration(store);
-
-
- List<CustomShippingQuotesRegion> regions = customConfiguration.getRegions();
-
- ShippingBasisType shippingType = shippingConfiguration.getShippingBasisType();
- ShippingOption shippingOption = null;
- try {
-
-
- for(CustomShippingQuotesRegion region : customConfiguration.getRegions()) {
-
- for(String countryCode : region.getCountries()) {
- if(countryCode.equals(delivery.getCountry().getIsoCode())) {
-
-
- //determine shipping weight
- double weight = 0;
- for(PackageDetails packageDetail : packages) {
- weight = weight + packageDetail.getShippingWeight();
- }
-
- //see the price associated with the width
- List<CustomShippingQuoteWeightItem> quoteItems = region.getQuoteItems();
- for(CustomShippingQuoteWeightItem quoteItem : quoteItems) {
- if(weight<= quoteItem.getMaximumWeight()) {
- shippingOption = new ShippingOption();
- shippingOption.setOptionCode(new StringBuilder().append(CUSTOM_WEIGHT).toString());
- shippingOption.setOptionId(new StringBuilder().append(CUSTOM_WEIGHT).append("_").append(region.getCustomRegionName()).toString());
- shippingOption.setOptionPrice(quoteItem.getPrice());
- shippingOption.setOptionPriceText(productPriceUtils.getStoreFormatedAmountWithCurrency(store, quoteItem.getPrice()));
- break;
- }
- }
-
- }
-
-
- }
-
- }
-
- if(shippingOption!=null) {
- List<ShippingOption> options = new ArrayList<ShippingOption>();
- options.add(shippingOption);
- return options;
- }
-
- return null;
-
- } catch (Exception e) {
- throw new IntegrationException(e);
- }
-
- }
-
-
-
-}
+package com.salesmanager.core.business.modules.integration.shipping.impl;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+import javax.inject.Inject;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.system.MerchantConfigurationService;
+import com.salesmanager.core.business.utils.ProductPriceUtils;
+import com.salesmanager.core.model.common.Delivery;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.shipping.PackageDetails;
+import com.salesmanager.core.model.shipping.ShippingBasisType;
+import com.salesmanager.core.model.shipping.ShippingConfiguration;
+import com.salesmanager.core.model.shipping.ShippingOption;
+import com.salesmanager.core.model.shipping.ShippingOrigin;
+import com.salesmanager.core.model.shipping.ShippingQuote;
+import com.salesmanager.core.model.system.CustomIntegrationConfiguration;
+import com.salesmanager.core.model.system.IntegrationConfiguration;
+import com.salesmanager.core.model.system.IntegrationModule;
+import com.salesmanager.core.model.system.MerchantConfiguration;
+import com.salesmanager.core.modules.integration.IntegrationException;
+import com.salesmanager.core.modules.integration.shipping.model.CustomShippingQuoteWeightItem;
+import com.salesmanager.core.modules.integration.shipping.model.CustomShippingQuotesConfiguration;
+import com.salesmanager.core.modules.integration.shipping.model.CustomShippingQuotesRegion;
+import com.salesmanager.core.modules.integration.shipping.model.ShippingQuoteModule;
+
+
+public class CustomWeightBasedShippingQuote implements ShippingQuoteModule {
+
+ public final static String MODULE_CODE = "weightBased";
+ private final static String CUSTOM_WEIGHT = "CUSTOM_WEIGHT";
+
+ @Inject
+ private MerchantConfigurationService merchantConfigurationService;
+
+ @Inject
+ private ProductPriceUtils productPriceUtils;
+
+
+ @Override
+ public void validateModuleConfiguration(
+ IntegrationConfiguration integrationConfiguration,
+ MerchantStore store) throws IntegrationException {
+
+
+ //not used, it has its own controller with complex validators
+
+ }
+
+
+ @Override
+ public CustomIntegrationConfiguration getCustomModuleConfiguration(
+ MerchantStore store) throws IntegrationException {
+
+ try {
+
+ MerchantConfiguration configuration = merchantConfigurationService.getMerchantConfiguration(MODULE_CODE, store);
+
+ if(configuration!=null) {
+ String value = configuration.getValue();
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ CustomShippingQuotesConfiguration config = mapper.readValue(value, CustomShippingQuotesConfiguration.class);
+ return config;
+ } catch(Exception e) {
+ throw new ServiceException("Cannot parse json string " + value);
+ }
+
+ } else {
+ CustomShippingQuotesConfiguration custom = new CustomShippingQuotesConfiguration();
+ custom.setModuleCode(MODULE_CODE);
+ return custom;
+ }
+
+ } catch (Exception e) {
+ throw new IntegrationException(e);
+ }
+
+
+ }
+
+ @Override
+ public List<ShippingOption> getShippingQuotes(
+ ShippingQuote shippingQuote,
+ List<PackageDetails> packages, BigDecimal orderTotal,
+ Delivery delivery, ShippingOrigin origin, MerchantStore store,
+ IntegrationConfiguration configuration, IntegrationModule module,
+ ShippingConfiguration shippingConfiguration, Locale locale)
+ throws IntegrationException {
+
+ if(StringUtils.isBlank(delivery.getPostalCode())) {
+ return null;
+ }
+
+ //get configuration
+ CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)this.getCustomModuleConfiguration(store);
+
+
+ List<CustomShippingQuotesRegion> regions = customConfiguration.getRegions();
+
+ ShippingBasisType shippingType = shippingConfiguration.getShippingBasisType();
+ ShippingOption shippingOption = null;
+ try {
+
+
+ for(CustomShippingQuotesRegion region : customConfiguration.getRegions()) {
+
+ for(String countryCode : region.getCountries()) {
+ if(countryCode.equals(delivery.getCountry().getIsoCode())) {
+
+
+ //determine shipping weight
+ double weight = 0;
+ for(PackageDetails packageDetail : packages) {
+ weight = weight + packageDetail.getShippingWeight();
+ }
+
+ //see the price associated with the width
+ List<CustomShippingQuoteWeightItem> quoteItems = region.getQuoteItems();
+ for(CustomShippingQuoteWeightItem quoteItem : quoteItems) {
+ if(weight<= quoteItem.getMaximumWeight()) {
+ shippingOption = new ShippingOption();
+ shippingOption.setOptionCode(new StringBuilder().append(CUSTOM_WEIGHT).toString());
+ shippingOption.setOptionId(new StringBuilder().append(CUSTOM_WEIGHT).append("_").append(region.getCustomRegionName()).toString());
+ shippingOption.setOptionPrice(quoteItem.getPrice());
+ shippingOption.setOptionPriceText(productPriceUtils.getStoreFormatedAmountWithCurrency(store, quoteItem.getPrice()));
+ break;
+ }
+ }
+
+ }
+
+
+ }
+
+ }
+
+ if(shippingOption!=null) {
+ List<ShippingOption> options = new ArrayList<ShippingOption>();
+ options.add(shippingOption);
+ return options;
+ }
+
+ return null;
+
+ } catch (Exception e) {
+ throw new IntegrationException(e);
+ }
+
+ }
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/DefaultPackagingImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/DefaultPackagingImpl.java
index 7f4d1a0..40d4d77 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/DefaultPackagingImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/DefaultPackagingImpl.java
@@ -1,436 +1,436 @@
-package com.salesmanager.core.business.modules.integration.shipping.impl;
-
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-import javax.inject.Inject;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.shipping.ShippingService;
-import com.salesmanager.core.business.services.system.MerchantLogService;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.shipping.PackageDetails;
-import com.salesmanager.core.model.shipping.ShippingConfiguration;
-import com.salesmanager.core.model.shipping.ShippingProduct;
-import com.salesmanager.core.model.system.MerchantLog;
-import com.salesmanager.core.modules.integration.shipping.model.Packaging;
-
-public class DefaultPackagingImpl implements Packaging {
-
-
- @Inject
- private ShippingService shippingService;
-
- @Inject
- private MerchantLogService merchantLogService;
-
- /** default dimensions **/
- private final static Double defaultWeight = 1D;
- private final static Double defaultHeight = 4D;
- private final static Double defaultLength = 4D;
- private final static Double defaultWidth = 4D;
-
- @Override
- public List<PackageDetails> getBoxPackagesDetails(
- List<ShippingProduct> products, MerchantStore store)
- throws ServiceException {
-
-
- if (products == null) {
- throw new ServiceException("Product list cannot be null !!");
- }
-
- double width = 0;
- double length = 0;
- double height = 0;
- double weight = 0;
- double maxweight = 0;
-
- //int treshold = 0;
-
-
- ShippingConfiguration shippingConfiguration = shippingService.getShippingConfiguration(store);
- if(shippingConfiguration==null) {
- throw new ServiceException("ShippingConfiguration not found for merchant " + store.getCode());
- }
-
- width = new Double(shippingConfiguration.getBoxWidth()).doubleValue();
- length = new Double(shippingConfiguration.getBoxLength()).doubleValue();
- height = new Double(shippingConfiguration.getBoxHeight()).doubleValue();
- weight = new Double(shippingConfiguration.getBoxWeight()).doubleValue();
- maxweight = new Double(shippingConfiguration.getMaxWeight()).doubleValue();
-
-
-
- List<PackageDetails> boxes = new ArrayList<PackageDetails>();
-
- // maximum number of boxes
- int maxBox = 100;
- int iterCount = 0;
-
- List<Product> individualProducts = new ArrayList<Product>();
-
- // need to put items individually
- for(ShippingProduct shippingProduct : products){
-
- Product product = shippingProduct.getProduct();
- if (product.isProductVirtual()) {
- continue;
- }
-
- int qty = shippingProduct.getQuantity();
-
- Set<ProductAttribute> attrs = shippingProduct.getProduct().getAttributes();
-
- // set attributes values
- BigDecimal w = product.getProductWeight();
- BigDecimal h = product.getProductHeight();
- BigDecimal l = product.getProductLength();
- BigDecimal wd = product.getProductWidth();
- if(w==null) {
- w = new BigDecimal(defaultWeight);
- }
- if(h==null) {
- h = new BigDecimal(defaultHeight);
- }
- if(l==null) {
- l = new BigDecimal(defaultLength);
- }
- if(wd==null) {
- wd = new BigDecimal(defaultWidth);
- }
- if (attrs != null && attrs.size() > 0) {
- for(ProductAttribute attribute : attrs) {
- if(attribute.getProductAttributeWeight()!=null) {
- w = w.add(attribute.getProductAttributeWeight());
- }
- }
- }
-
-
-
- if (qty > 1) {
-
- for (int i = 1; i <= qty; i++) {
- Product temp = new Product();
- temp.setProductHeight(h);
- temp.setProductLength(l);
- temp.setProductWidth(wd);
- temp.setProductWeight(w);
- temp.setAttributes(product.getAttributes());
- temp.setDescriptions(product.getDescriptions());
- individualProducts.add(temp);
- }
- } else {
- Product temp = new Product();
- temp.setProductHeight(h);
- temp.setProductLength(l);
- temp.setProductWidth(wd);
- temp.setProductWeight(w);
- temp.setAttributes(product.getAttributes());
- temp.setDescriptions(product.getDescriptions());
- individualProducts.add(temp);
- }
- iterCount++;
- }
-
- if (iterCount == 0) {
- return null;
- }
-
- int productCount = individualProducts.size();
-
- List<PackingBox> boxesList = new ArrayList<PackingBox>();
-
- //start the creation of boxes
- PackingBox box = new PackingBox();
- // set box max volume
- double maxVolume = width * length * height;
-
- if (maxVolume == 0 || maxweight == 0) {
-
- merchantLogService.save(new MerchantLog(store,"shipping","Check shipping box configuration, it has a volume of "
- + maxVolume + " and a maximum weight of "
- + maxweight
- + ". Those values must be greater than 0."));
-
- throw new ServiceException("Product configuration exceeds box configuraton");
-
-
- }
-
-
- box.setVolumeLeft(maxVolume);
- box.setWeightLeft(maxweight);
-
- boxesList.add(box);//assign first box
-
- //int boxCount = 1;
- List<Product> assignedProducts = new ArrayList<Product>();
-
- // calculate the volume for the next object
- if (assignedProducts.size() > 0) {
- individualProducts.removeAll(assignedProducts);
- assignedProducts = new ArrayList<Product>();
- }
-
- boolean productAssigned = false;
-
- for(Product p : individualProducts) {
-
- //Set<ProductAttribute> attributes = p.getAttributes();
- productAssigned = false;
-
- double productWeight = p.getProductWeight().doubleValue();
-
-
- // validate if product fits in the box
- if (p.getProductWidth().doubleValue() > width
- || p.getProductHeight().doubleValue() > height
- || p.getProductLength().doubleValue() > length) {
- // log message to customer
- merchantLogService.save(new MerchantLog(store,"shipping","Product "
- + p.getSku()
- + " has a demension larger than the box size specified. Will use per item calculation."));
- throw new ServiceException("Product configuration exceeds box configuraton");
-
- }
-
- if (productWeight > maxweight) {
- merchantLogService.save(new MerchantLog(store,"shipping","Product "
- + p.getSku()
- + " has a weight larger than the box maximum weight specified. Will use per item calculation."));
-
- throw new ServiceException("Product configuration exceeds box configuraton");
-
- }
-
- double productVolume = (p.getProductWidth().doubleValue()
- * p.getProductHeight().doubleValue() * p
- .getProductLength().doubleValue());
-
- if (productVolume == 0) {
-
- merchantLogService.save(new MerchantLog(store,"shipping","Product "
- + p.getSku()
- + " has one of the dimension set to 0 and therefore cannot calculate the volume"));
-
- throw new ServiceException("Product configuration exceeds box configuraton");
-
-
- }
-
- if (productVolume > maxVolume) {
-
- throw new ServiceException("Product configuration exceeds box configuraton");
-
- }
-
- //List boxesList = boxesList;
-
- // try each box
- //Iterator boxIter = boxesList.iterator();
- for (PackingBox pbox : boxesList) {
- double volumeLeft = pbox.getVolumeLeft();
- double weightLeft = pbox.getWeightLeft();
-
- if ((volumeLeft * .75) >= productVolume
- && pbox.getWeightLeft() >= productWeight) {// fit the item
- // in this
- // box
- // fit in the current box
- volumeLeft = volumeLeft - productVolume;
- pbox.setVolumeLeft(volumeLeft);
- weightLeft = weightLeft - productWeight;
- pbox.setWeightLeft(weightLeft);
-
- assignedProducts.add(p);
- productCount--;
-
- double w = pbox.getWeight();
- w = w + productWeight;
- pbox.setWeight(w);
- productAssigned = true;
- maxBox--;
- break;
-
- }
-
- }
-
- if (!productAssigned) {// create a new box
-
- box = new PackingBox();
- // set box max volume
- box.setVolumeLeft(maxVolume);
- box.setWeightLeft(maxweight);
-
- boxesList.add(box);
-
- double volumeLeft = box.getVolumeLeft() - productVolume;
- box.setVolumeLeft(volumeLeft);
- double weightLeft = box.getWeightLeft() - productWeight;
- box.setWeightLeft(weightLeft);
- assignedProducts.add(p);
- productCount--;
- double w = box.getWeight();
- w = w + productWeight;
- box.setWeight(w);
- maxBox--;
- }
-
- }
-
- // now prepare the shipping info
-
- // number of boxes
-
- //Iterator ubIt = usedBoxesList.iterator();
-
- System.out.println("###################################");
- System.out.println("Number of boxes " + boxesList.size());
- System.out.println("###################################");
-
- for(PackingBox pb : boxesList) {
- PackageDetails details = new PackageDetails();
- details.setShippingHeight(height);
- details.setShippingLength(length);
- details.setShippingWeight(weight + box.getWeight());
- details.setShippingWidth(width);
- details.setItemName(store.getCode());
- boxes.add(details);
- }
-
- return boxes;
-
- }
-
- @Override
- public List<PackageDetails> getItemPackagesDetails(
- List<ShippingProduct> products, MerchantStore store)
- throws ServiceException {
-
-
- List<PackageDetails> packages = new ArrayList<PackageDetails>();
- for(ShippingProduct shippingProduct : products) {
- Product product = shippingProduct.getProduct();
-
- if (product.isProductVirtual()) {
- continue;
- }
-
- //BigDecimal weight = product.getProductWeight();
- Set<ProductAttribute> attributes = product.getAttributes();
- // set attributes values
- BigDecimal w = product.getProductWeight();
- BigDecimal h = product.getProductHeight();
- BigDecimal l = product.getProductLength();
- BigDecimal wd = product.getProductWidth();
- if(w==null) {
- w = new BigDecimal(defaultWeight);
- }
- if(h==null) {
- h = new BigDecimal(defaultHeight);
- }
- if(l==null) {
- l = new BigDecimal(defaultLength);
- }
- if(wd==null) {
- wd = new BigDecimal(defaultWidth);
- }
- if (attributes != null && attributes.size() > 0) {
- for(ProductAttribute attribute : attributes) {
- if(attribute.getAttributeAdditionalWeight()!=null) {
- w = w.add(attribute.getProductAttributeWeight());
- }
- }
- }
-
-
-
- if (shippingProduct.getQuantity() == 1) {
- PackageDetails detail = new PackageDetails();
-
-
- detail.setShippingHeight(h
- .doubleValue());
- detail.setShippingLength(l
- .doubleValue());
- detail.setShippingWeight(w.doubleValue());
- detail.setShippingWidth(wd.doubleValue());
- detail.setShippingQuantity(shippingProduct.getQuantity());
- String description = "item";
- if(product.getDescriptions().size()>0) {
- description = product.getDescriptions().iterator().next().getName();
- }
- detail.setItemName(description);
-
- packages.add(detail);
- } else if (shippingProduct.getQuantity() > 1) {
- for (int i = 0; i < shippingProduct.getQuantity(); i++) {
- PackageDetails detail = new PackageDetails();
- detail.setShippingHeight(h
- .doubleValue());
- detail.setShippingLength(l
- .doubleValue());
- detail.setShippingWeight(w.doubleValue());
- detail.setShippingWidth(wd
- .doubleValue());
- detail.setShippingQuantity(shippingProduct.getQuantity());
- String description = "item";
- if(product.getDescriptions().size()>0) {
- description = product.getDescriptions().iterator().next().getName();
- }
- detail.setItemName(description);
-
- packages.add(detail);
- }
- }
- }
-
- return packages;
-
-
-
- }
-
-
-}
-
-
-class PackingBox {
-
- private double volumeLeft;
- private double weightLeft;
- private double weight;
-
- public double getVolumeLeft() {
- return volumeLeft;
- }
-
- public void setVolumeLeft(double volumeLeft) {
- this.volumeLeft = volumeLeft;
- }
-
- public double getWeight() {
- return weight;
- }
-
- public void setWeight(double weight) {
- this.weight = weight;
- }
-
- public double getWeightLeft() {
- return weightLeft;
- }
-
- public void setWeightLeft(double weightLeft) {
- this.weightLeft = weightLeft;
- }
-
-}
-
+package com.salesmanager.core.business.modules.integration.shipping.impl;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import javax.inject.Inject;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.shipping.ShippingService;
+import com.salesmanager.core.business.services.system.MerchantLogService;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.shipping.PackageDetails;
+import com.salesmanager.core.model.shipping.ShippingConfiguration;
+import com.salesmanager.core.model.shipping.ShippingProduct;
+import com.salesmanager.core.model.system.MerchantLog;
+import com.salesmanager.core.modules.integration.shipping.model.Packaging;
+
+public class DefaultPackagingImpl implements Packaging {
+
+
+ @Inject
+ private ShippingService shippingService;
+
+ @Inject
+ private MerchantLogService merchantLogService;
+
+ /** default dimensions **/
+ private final static Double defaultWeight = 1D;
+ private final static Double defaultHeight = 4D;
+ private final static Double defaultLength = 4D;
+ private final static Double defaultWidth = 4D;
+
+ @Override
+ public List<PackageDetails> getBoxPackagesDetails(
+ List<ShippingProduct> products, MerchantStore store)
+ throws ServiceException {
+
+
+ if (products == null) {
+ throw new ServiceException("Product list cannot be null !!");
+ }
+
+ double width = 0;
+ double length = 0;
+ double height = 0;
+ double weight = 0;
+ double maxweight = 0;
+
+ //int treshold = 0;
+
+
+ ShippingConfiguration shippingConfiguration = shippingService.getShippingConfiguration(store);
+ if(shippingConfiguration==null) {
+ throw new ServiceException("ShippingConfiguration not found for merchant " + store.getCode());
+ }
+
+ width = new Double(shippingConfiguration.getBoxWidth()).doubleValue();
+ length = new Double(shippingConfiguration.getBoxLength()).doubleValue();
+ height = new Double(shippingConfiguration.getBoxHeight()).doubleValue();
+ weight = new Double(shippingConfiguration.getBoxWeight()).doubleValue();
+ maxweight = new Double(shippingConfiguration.getMaxWeight()).doubleValue();
+
+
+
+ List<PackageDetails> boxes = new ArrayList<PackageDetails>();
+
+ // maximum number of boxes
+ int maxBox = 100;
+ int iterCount = 0;
+
+ List<Product> individualProducts = new ArrayList<Product>();
+
+ // need to put items individually
+ for(ShippingProduct shippingProduct : products){
+
+ Product product = shippingProduct.getProduct();
+ if (product.isProductVirtual()) {
+ continue;
+ }
+
+ int qty = shippingProduct.getQuantity();
+
+ Set<ProductAttribute> attrs = shippingProduct.getProduct().getAttributes();
+
+ // set attributes values
+ BigDecimal w = product.getProductWeight();
+ BigDecimal h = product.getProductHeight();
+ BigDecimal l = product.getProductLength();
+ BigDecimal wd = product.getProductWidth();
+ if(w==null) {
+ w = new BigDecimal(defaultWeight);
+ }
+ if(h==null) {
+ h = new BigDecimal(defaultHeight);
+ }
+ if(l==null) {
+ l = new BigDecimal(defaultLength);
+ }
+ if(wd==null) {
+ wd = new BigDecimal(defaultWidth);
+ }
+ if (attrs != null && attrs.size() > 0) {
+ for(ProductAttribute attribute : attrs) {
+ if(attribute.getProductAttributeWeight()!=null) {
+ w = w.add(attribute.getProductAttributeWeight());
+ }
+ }
+ }
+
+
+
+ if (qty > 1) {
+
+ for (int i = 1; i <= qty; i++) {
+ Product temp = new Product();
+ temp.setProductHeight(h);
+ temp.setProductLength(l);
+ temp.setProductWidth(wd);
+ temp.setProductWeight(w);
+ temp.setAttributes(product.getAttributes());
+ temp.setDescriptions(product.getDescriptions());
+ individualProducts.add(temp);
+ }
+ } else {
+ Product temp = new Product();
+ temp.setProductHeight(h);
+ temp.setProductLength(l);
+ temp.setProductWidth(wd);
+ temp.setProductWeight(w);
+ temp.setAttributes(product.getAttributes());
+ temp.setDescriptions(product.getDescriptions());
+ individualProducts.add(temp);
+ }
+ iterCount++;
+ }
+
+ if (iterCount == 0) {
+ return null;
+ }
+
+ int productCount = individualProducts.size();
+
+ List<PackingBox> boxesList = new ArrayList<PackingBox>();
+
+ //start the creation of boxes
+ PackingBox box = new PackingBox();
+ // set box max volume
+ double maxVolume = width * length * height;
+
+ if (maxVolume == 0 || maxweight == 0) {
+
+ merchantLogService.save(new MerchantLog(store,"shipping","Check shipping box configuration, it has a volume of "
+ + maxVolume + " and a maximum weight of "
+ + maxweight
+ + ". Those values must be greater than 0."));
+
+ throw new ServiceException("Product configuration exceeds box configuraton");
+
+
+ }
+
+
+ box.setVolumeLeft(maxVolume);
+ box.setWeightLeft(maxweight);
+
+ boxesList.add(box);//assign first box
+
+ //int boxCount = 1;
+ List<Product> assignedProducts = new ArrayList<Product>();
+
+ // calculate the volume for the next object
+ if (assignedProducts.size() > 0) {
+ individualProducts.removeAll(assignedProducts);
+ assignedProducts = new ArrayList<Product>();
+ }
+
+ boolean productAssigned = false;
+
+ for(Product p : individualProducts) {
+
+ //Set<ProductAttribute> attributes = p.getAttributes();
+ productAssigned = false;
+
+ double productWeight = p.getProductWeight().doubleValue();
+
+
+ // validate if product fits in the box
+ if (p.getProductWidth().doubleValue() > width
+ || p.getProductHeight().doubleValue() > height
+ || p.getProductLength().doubleValue() > length) {
+ // log message to customer
+ merchantLogService.save(new MerchantLog(store,"shipping","Product "
+ + p.getSku()
+ + " has a demension larger than the box size specified. Will use per item calculation."));
+ throw new ServiceException("Product configuration exceeds box configuraton");
+
+ }
+
+ if (productWeight > maxweight) {
+ merchantLogService.save(new MerchantLog(store,"shipping","Product "
+ + p.getSku()
+ + " has a weight larger than the box maximum weight specified. Will use per item calculation."));
+
+ throw new ServiceException("Product configuration exceeds box configuraton");
+
+ }
+
+ double productVolume = (p.getProductWidth().doubleValue()
+ * p.getProductHeight().doubleValue() * p
+ .getProductLength().doubleValue());
+
+ if (productVolume == 0) {
+
+ merchantLogService.save(new MerchantLog(store,"shipping","Product "
+ + p.getSku()
+ + " has one of the dimension set to 0 and therefore cannot calculate the volume"));
+
+ throw new ServiceException("Product configuration exceeds box configuraton");
+
+
+ }
+
+ if (productVolume > maxVolume) {
+
+ throw new ServiceException("Product configuration exceeds box configuraton");
+
+ }
+
+ //List boxesList = boxesList;
+
+ // try each box
+ //Iterator boxIter = boxesList.iterator();
+ for (PackingBox pbox : boxesList) {
+ double volumeLeft = pbox.getVolumeLeft();
+ double weightLeft = pbox.getWeightLeft();
+
+ if ((volumeLeft * .75) >= productVolume
+ && pbox.getWeightLeft() >= productWeight) {// fit the item
+ // in this
+ // box
+ // fit in the current box
+ volumeLeft = volumeLeft - productVolume;
+ pbox.setVolumeLeft(volumeLeft);
+ weightLeft = weightLeft - productWeight;
+ pbox.setWeightLeft(weightLeft);
+
+ assignedProducts.add(p);
+ productCount--;
+
+ double w = pbox.getWeight();
+ w = w + productWeight;
+ pbox.setWeight(w);
+ productAssigned = true;
+ maxBox--;
+ break;
+
+ }
+
+ }
+
+ if (!productAssigned) {// create a new box
+
+ box = new PackingBox();
+ // set box max volume
+ box.setVolumeLeft(maxVolume);
+ box.setWeightLeft(maxweight);
+
+ boxesList.add(box);
+
+ double volumeLeft = box.getVolumeLeft() - productVolume;
+ box.setVolumeLeft(volumeLeft);
+ double weightLeft = box.getWeightLeft() - productWeight;
+ box.setWeightLeft(weightLeft);
+ assignedProducts.add(p);
+ productCount--;
+ double w = box.getWeight();
+ w = w + productWeight;
+ box.setWeight(w);
+ maxBox--;
+ }
+
+ }
+
+ // now prepare the shipping info
+
+ // number of boxes
+
+ //Iterator ubIt = usedBoxesList.iterator();
+
+ System.out.println("###################################");
+ System.out.println("Number of boxes " + boxesList.size());
+ System.out.println("###################################");
+
+ for(PackingBox pb : boxesList) {
+ PackageDetails details = new PackageDetails();
+ details.setShippingHeight(height);
+ details.setShippingLength(length);
+ details.setShippingWeight(weight + box.getWeight());
+ details.setShippingWidth(width);
+ details.setItemName(store.getCode());
+ boxes.add(details);
+ }
+
+ return boxes;
+
+ }
+
+ @Override
+ public List<PackageDetails> getItemPackagesDetails(
+ List<ShippingProduct> products, MerchantStore store)
+ throws ServiceException {
+
+
+ List<PackageDetails> packages = new ArrayList<PackageDetails>();
+ for(ShippingProduct shippingProduct : products) {
+ Product product = shippingProduct.getProduct();
+
+ if (product.isProductVirtual()) {
+ continue;
+ }
+
+ //BigDecimal weight = product.getProductWeight();
+ Set<ProductAttribute> attributes = product.getAttributes();
+ // set attributes values
+ BigDecimal w = product.getProductWeight();
+ BigDecimal h = product.getProductHeight();
+ BigDecimal l = product.getProductLength();
+ BigDecimal wd = product.getProductWidth();
+ if(w==null) {
+ w = new BigDecimal(defaultWeight);
+ }
+ if(h==null) {
+ h = new BigDecimal(defaultHeight);
+ }
+ if(l==null) {
+ l = new BigDecimal(defaultLength);
+ }
+ if(wd==null) {
+ wd = new BigDecimal(defaultWidth);
+ }
+ if (attributes != null && attributes.size() > 0) {
+ for(ProductAttribute attribute : attributes) {
+ if(attribute.getAttributeAdditionalWeight()!=null) {
+ w = w.add(attribute.getProductAttributeWeight());
+ }
+ }
+ }
+
+
+
+ if (shippingProduct.getQuantity() == 1) {
+ PackageDetails detail = new PackageDetails();
+
+
+ detail.setShippingHeight(h
+ .doubleValue());
+ detail.setShippingLength(l
+ .doubleValue());
+ detail.setShippingWeight(w.doubleValue());
+ detail.setShippingWidth(wd.doubleValue());
+ detail.setShippingQuantity(shippingProduct.getQuantity());
+ String description = "item";
+ if(product.getDescriptions().size()>0) {
+ description = product.getDescriptions().iterator().next().getName();
+ }
+ detail.setItemName(description);
+
+ packages.add(detail);
+ } else if (shippingProduct.getQuantity() > 1) {
+ for (int i = 0; i < shippingProduct.getQuantity(); i++) {
+ PackageDetails detail = new PackageDetails();
+ detail.setShippingHeight(h
+ .doubleValue());
+ detail.setShippingLength(l
+ .doubleValue());
+ detail.setShippingWeight(w.doubleValue());
+ detail.setShippingWidth(wd
+ .doubleValue());
+ detail.setShippingQuantity(shippingProduct.getQuantity());
+ String description = "item";
+ if(product.getDescriptions().size()>0) {
+ description = product.getDescriptions().iterator().next().getName();
+ }
+ detail.setItemName(description);
+
+ packages.add(detail);
+ }
+ }
+ }
+
+ return packages;
+
+
+
+ }
+
+
+}
+
+
+class PackingBox {
+
+ private double volumeLeft;
+ private double weightLeft;
+ private double weight;
+
+ public double getVolumeLeft() {
+ return volumeLeft;
+ }
+
+ public void setVolumeLeft(double volumeLeft) {
+ this.volumeLeft = volumeLeft;
+ }
+
+ public double getWeight() {
+ return weight;
+ }
+
+ public void setWeight(double weight) {
+ this.weight = weight;
+ }
+
+ public double getWeightLeft() {
+ return weightLeft;
+ }
+
+ public void setWeightLeft(double weightLeft) {
+ this.weightLeft = weightLeft;
+ }
+
+}
+
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/StorePickupShippingQuote.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/StorePickupShippingQuote.java
index 4604821..5e77b69 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/StorePickupShippingQuote.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/StorePickupShippingQuote.java
@@ -1,181 +1,181 @@
-package com.salesmanager.core.business.modules.integration.shipping.impl;
-
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import javax.inject.Inject;
-
-import org.apache.commons.lang.Validate;
-
-import com.salesmanager.core.business.services.system.MerchantConfigurationService;
-import com.salesmanager.core.business.utils.ProductPriceUtils;
-import com.salesmanager.core.model.common.Delivery;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.shipping.PackageDetails;
-import com.salesmanager.core.model.shipping.ShippingConfiguration;
-import com.salesmanager.core.model.shipping.ShippingOption;
-import com.salesmanager.core.model.shipping.ShippingOrigin;
-import com.salesmanager.core.model.shipping.ShippingQuote;
-import com.salesmanager.core.model.system.CustomIntegrationConfiguration;
-import com.salesmanager.core.model.system.IntegrationConfiguration;
-import com.salesmanager.core.model.system.IntegrationModule;
-import com.salesmanager.core.modules.integration.IntegrationException;
-import com.salesmanager.core.modules.integration.shipping.model.ShippingQuoteModule;
-import com.salesmanager.core.modules.integration.shipping.model.ShippingQuotePrePostProcessModule;
-
-
-/**
- * Store pick up shipping module
- *
- * Requires a configuration of a message note to be printed to the client
- * and a price for calculation (should be configured to 0)
- *
- * Calculates a ShippingQuote with a price set to the price configured
- * @author carlsamson
- *
- */
-public class StorePickupShippingQuote implements ShippingQuoteModule, ShippingQuotePrePostProcessModule {
-
-
- public final static String MODULE_CODE = "storePickUp";
-
- @Inject
- private MerchantConfigurationService merchantConfigurationService;
-
- @Inject
- private ProductPriceUtils productPriceUtils;
-
-
- @Override
- public void validateModuleConfiguration(
- IntegrationConfiguration integrationConfiguration,
- MerchantStore store) throws IntegrationException {
-
-
-
-
- List<String> errorFields = null;
-
- //validate integrationKeys['account']
- Map<String,String> keys = integrationConfiguration.getIntegrationKeys();
- //if(keys==null || StringUtils.isBlank(keys.get("price"))) {
- if(keys==null) {
- errorFields = new ArrayList<String>();
- errorFields.add("price");
- } else {
- //validate it can be parsed to BigDecimal
- try {
- BigDecimal price = new BigDecimal(keys.get("price"));
- } catch(Exception e) {
- errorFields = new ArrayList<String>();
- errorFields.add("price");
- }
- }
-
- //if(keys==null || StringUtils.isBlank(keys.get("note"))) {
- if(keys==null) {
- errorFields = new ArrayList<String>();
- errorFields.add("note");
- }
-
-
-
- if(errorFields!=null) {
- IntegrationException ex = new IntegrationException(IntegrationException.ERROR_VALIDATION_SAVE);
- ex.setErrorFields(errorFields);
- throw ex;
-
- }
-
- }
-
- @Override
- public List<ShippingOption> getShippingQuotes(
- ShippingQuote shippingQuote,
- List<PackageDetails> packages, BigDecimal orderTotal,
- Delivery delivery, ShippingOrigin origin, MerchantStore store,
- IntegrationConfiguration configuration, IntegrationModule module,
- ShippingConfiguration shippingConfiguration, Locale locale)
- throws IntegrationException {
-
- // TODO Auto-generated method stub
- return null;
-
- }
-
- @Override
- public CustomIntegrationConfiguration getCustomModuleConfiguration(
- MerchantStore store) throws IntegrationException {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public void prePostProcessShippingQuotes(ShippingQuote quote,
- List<PackageDetails> packages, BigDecimal orderTotal,
- Delivery delivery, ShippingOrigin origin, MerchantStore store,
- IntegrationConfiguration globalShippingConfiguration,
- IntegrationModule currentModule,
- ShippingConfiguration shippingConfiguration,
- List<IntegrationModule> allModules, Locale locale)
- throws IntegrationException {
-
- Validate.notNull(globalShippingConfiguration, "IntegrationConfiguration must not be null for StorePickUp");
-
-
- try {
-
- String region = null;
-
- String price = globalShippingConfiguration.getIntegrationKeys().get("price");
-
-
- if(delivery.getZone()!=null) {
- region = delivery.getZone().getCode();
- } else {
- region = delivery.getState();
- }
-
- ShippingOption shippingOption = new ShippingOption();
- shippingOption.setShippingModuleCode(MODULE_CODE);
- shippingOption.setOptionCode(MODULE_CODE);
- shippingOption.setOptionId(new StringBuilder().append(MODULE_CODE).append("_").append(region).toString());
-
- shippingOption.setOptionPrice(productPriceUtils.getAmount(price));
-
- shippingOption.setOptionPriceText(productPriceUtils.getStoreFormatedAmountWithCurrency(store, productPriceUtils.getAmount(price)));
-
- List<ShippingOption> options = quote.getShippingOptions();
-
- if(options == null) {
- options = new ArrayList<ShippingOption>();
- quote.setShippingOptions(options);
- }
-
- options.add(shippingOption);
-
- if(quote.getSelectedShippingOption()==null) {
- quote.setSelectedShippingOption(shippingOption);
- }
-
-
- } catch (Exception e) {
- throw new IntegrationException(e);
- }
-
-
-
- }
-
- @Override
- public String getModuleCode() {
- // TODO Auto-generated method stub
- return MODULE_CODE;
- }
-
-
-
-}
+package com.salesmanager.core.business.modules.integration.shipping.impl;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.apache.commons.lang.Validate;
+
+import com.salesmanager.core.business.services.system.MerchantConfigurationService;
+import com.salesmanager.core.business.utils.ProductPriceUtils;
+import com.salesmanager.core.model.common.Delivery;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.shipping.PackageDetails;
+import com.salesmanager.core.model.shipping.ShippingConfiguration;
+import com.salesmanager.core.model.shipping.ShippingOption;
+import com.salesmanager.core.model.shipping.ShippingOrigin;
+import com.salesmanager.core.model.shipping.ShippingQuote;
+import com.salesmanager.core.model.system.CustomIntegrationConfiguration;
+import com.salesmanager.core.model.system.IntegrationConfiguration;
+import com.salesmanager.core.model.system.IntegrationModule;
+import com.salesmanager.core.modules.integration.IntegrationException;
+import com.salesmanager.core.modules.integration.shipping.model.ShippingQuoteModule;
+import com.salesmanager.core.modules.integration.shipping.model.ShippingQuotePrePostProcessModule;
+
+
+/**
+ * Store pick up shipping module
+ *
+ * Requires a configuration of a message note to be printed to the client
+ * and a price for calculation (should be configured to 0)
+ *
+ * Calculates a ShippingQuote with a price set to the price configured
+ * @author carlsamson
+ *
+ */
+public class StorePickupShippingQuote implements ShippingQuoteModule, ShippingQuotePrePostProcessModule {
+
+
+ public final static String MODULE_CODE = "storePickUp";
+
+ @Inject
+ private MerchantConfigurationService merchantConfigurationService;
+
+ @Inject
+ private ProductPriceUtils productPriceUtils;
+
+
+ @Override
+ public void validateModuleConfiguration(
+ IntegrationConfiguration integrationConfiguration,
+ MerchantStore store) throws IntegrationException {
+
+
+
+
+ List<String> errorFields = null;
+
+ //validate integrationKeys['account']
+ Map<String,String> keys = integrationConfiguration.getIntegrationKeys();
+ //if(keys==null || StringUtils.isBlank(keys.get("price"))) {
+ if(keys==null) {
+ errorFields = new ArrayList<String>();
+ errorFields.add("price");
+ } else {
+ //validate it can be parsed to BigDecimal
+ try {
+ BigDecimal price = new BigDecimal(keys.get("price"));
+ } catch(Exception e) {
+ errorFields = new ArrayList<String>();
+ errorFields.add("price");
+ }
+ }
+
+ //if(keys==null || StringUtils.isBlank(keys.get("note"))) {
+ if(keys==null) {
+ errorFields = new ArrayList<String>();
+ errorFields.add("note");
+ }
+
+
+
+ if(errorFields!=null) {
+ IntegrationException ex = new IntegrationException(IntegrationException.ERROR_VALIDATION_SAVE);
+ ex.setErrorFields(errorFields);
+ throw ex;
+
+ }
+
+ }
+
+ @Override
+ public List<ShippingOption> getShippingQuotes(
+ ShippingQuote shippingQuote,
+ List<PackageDetails> packages, BigDecimal orderTotal,
+ Delivery delivery, ShippingOrigin origin, MerchantStore store,
+ IntegrationConfiguration configuration, IntegrationModule module,
+ ShippingConfiguration shippingConfiguration, Locale locale)
+ throws IntegrationException {
+
+ // TODO Auto-generated method stub
+ return null;
+
+ }
+
+ @Override
+ public CustomIntegrationConfiguration getCustomModuleConfiguration(
+ MerchantStore store) throws IntegrationException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void prePostProcessShippingQuotes(ShippingQuote quote,
+ List<PackageDetails> packages, BigDecimal orderTotal,
+ Delivery delivery, ShippingOrigin origin, MerchantStore store,
+ IntegrationConfiguration globalShippingConfiguration,
+ IntegrationModule currentModule,
+ ShippingConfiguration shippingConfiguration,
+ List<IntegrationModule> allModules, Locale locale)
+ throws IntegrationException {
+
+ Validate.notNull(globalShippingConfiguration, "IntegrationConfiguration must not be null for StorePickUp");
+
+
+ try {
+
+ String region = null;
+
+ String price = globalShippingConfiguration.getIntegrationKeys().get("price");
+
+
+ if(delivery.getZone()!=null) {
+ region = delivery.getZone().getCode();
+ } else {
+ region = delivery.getState();
+ }
+
+ ShippingOption shippingOption = new ShippingOption();
+ shippingOption.setShippingModuleCode(MODULE_CODE);
+ shippingOption.setOptionCode(MODULE_CODE);
+ shippingOption.setOptionId(new StringBuilder().append(MODULE_CODE).append("_").append(region).toString());
+
+ shippingOption.setOptionPrice(productPriceUtils.getAmount(price));
+
+ shippingOption.setOptionPriceText(productPriceUtils.getStoreFormatedAmountWithCurrency(store, productPriceUtils.getAmount(price)));
+
+ List<ShippingOption> options = quote.getShippingOptions();
+
+ if(options == null) {
+ options = new ArrayList<ShippingOption>();
+ quote.setShippingOptions(options);
+ }
+
+ options.add(shippingOption);
+
+ if(quote.getSelectedShippingOption()==null) {
+ quote.setSelectedShippingOption(shippingOption);
+ }
+
+
+ } catch (Exception e) {
+ throw new IntegrationException(e);
+ }
+
+
+
+ }
+
+ @Override
+ public String getModuleCode() {
+ // TODO Auto-generated method stub
+ return MODULE_CODE;
+ }
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/UPSShippingQuote.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/UPSShippingQuote.java
index a79950a..6c11fcd 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/UPSShippingQuote.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/UPSShippingQuote.java
@@ -1,721 +1,721 @@
-package com.salesmanager.core.business.modules.integration.shipping.impl;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.digester.Digester;
-import org.apache.commons.lang.Validate;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.ResponseHandler;
-import org.apache.http.client.methods.HttpPost;
-import org.apache.http.entity.ContentType;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.util.EntityUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.salesmanager.core.business.utils.DataUtils;
-import com.salesmanager.core.model.common.Delivery;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.shipping.PackageDetails;
-import com.salesmanager.core.model.shipping.ShippingConfiguration;
-import com.salesmanager.core.model.shipping.ShippingOption;
-import com.salesmanager.core.model.shipping.ShippingOrigin;
-import com.salesmanager.core.model.shipping.ShippingQuote;
-import com.salesmanager.core.model.system.CustomIntegrationConfiguration;
-import com.salesmanager.core.model.system.IntegrationConfiguration;
-import com.salesmanager.core.model.system.IntegrationModule;
-import com.salesmanager.core.model.system.ModuleConfig;
-import com.salesmanager.core.modules.integration.IntegrationException;
-import com.salesmanager.core.modules.integration.shipping.model.ShippingQuoteModule;
-
-
-/**
- * Integrates with UPS online API
- * @author casams1
- *
- */
-public class UPSShippingQuote implements ShippingQuoteModule {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(UPSShippingQuote.class);
-
-
- @Override
- public void validateModuleConfiguration(
- IntegrationConfiguration integrationConfiguration,
- MerchantStore store) throws IntegrationException {
-
-
- List<String> errorFields = null;
-
- //validate integrationKeys['accessKey']
- Map<String,String> keys = integrationConfiguration.getIntegrationKeys();
- if(keys==null || StringUtils.isBlank(keys.get("accessKey"))) {
- errorFields = new ArrayList<String>();
- errorFields.add("accessKey");
- }
-
- if(keys==null || StringUtils.isBlank(keys.get("userId"))) {
- errorFields = new ArrayList<String>();
- errorFields.add("userId");
- }
-
- if(keys==null || StringUtils.isBlank(keys.get("password"))) {
- errorFields = new ArrayList<String>();
- errorFields.add("password");
- }
-
- //validate at least one integrationOptions['packages']
- Map<String,List<String>> options = integrationConfiguration.getIntegrationOptions();
- if(options==null) {
- errorFields = new ArrayList<String>();
- errorFields.add("packages");
- }
-
- List<String> packages = options.get("packages");
- if(packages==null || packages.size()==0) {
- if(errorFields==null) {
- errorFields = new ArrayList<String>();
- }
- errorFields.add("packages");
- }
-
-/* List<String> services = options.get("services");
- if(services==null || services.size()==0) {
- if(errorFields==null) {
- errorFields = new ArrayList<String>();
- }
- errorFields.add("services");
- }
-
- if(services!=null && services.size()>3) {
- if(errorFields==null) {
- errorFields = new ArrayList<String>();
- }
- errorFields.add("services");
- }*/
-
- if(errorFields!=null) {
- IntegrationException ex = new IntegrationException(IntegrationException.ERROR_VALIDATION_SAVE);
- ex.setErrorFields(errorFields);
- throw ex;
-
- }
-
-
-
- }
-
- @Override
- public List<ShippingOption> getShippingQuotes(
- ShippingQuote shippingQuote,
- List<PackageDetails> packages, BigDecimal orderTotal,
- Delivery delivery, ShippingOrigin origin, MerchantStore store,
- IntegrationConfiguration configuration, IntegrationModule module,
- ShippingConfiguration shippingConfiguration, Locale locale)
- throws IntegrationException {
-
- Validate.notNull(configuration, "IntegrationConfiguration must not be null for USPS shipping module");
-
-
- if(StringUtils.isBlank(delivery.getPostalCode())) {
- return null;
- }
-
- BigDecimal total = orderTotal;
-
- if (packages == null) {
- return null;
- }
-
- List<ShippingOption> options = null;
-
- // only applies to Canada and US
- Country country = delivery.getCountry();
-
-
-
- if(!(country.getIsoCode().equals("US") || country.getIsoCode().equals("CA"))) {
- return null;
- //throw new IntegrationException("UPS Not configured for shipping in country " + country.getIsoCode());
- }
-
- // supports en and fr
- String language = locale.getLanguage();
- if (!language.equals(Locale.FRENCH.getLanguage())
- && !language.equals(Locale.ENGLISH.getLanguage())) {
- language = Locale.ENGLISH.getLanguage();
- }
-
- String pack = configuration.getIntegrationOptions().get("packages").get(0);
- Map<String,String> keys = configuration.getIntegrationKeys();
-
- String accessKey = keys.get("accessKey");
- String userId = keys.get("userId");
- String password = keys.get("password");
-
-
- String host = null;
- String protocol = null;
- String port = null;
- String url = null;
-
- StringBuilder xmlbuffer = new StringBuilder();
- HttpPost httppost = null;
- BufferedReader reader = null;
-
- try {
- String env = configuration.getEnvironment();
-
- Set<String> regions = module.getRegionsSet();
- if(!regions.contains(store.getCountry().getIsoCode())) {
- throw new IntegrationException("Can't use the service for store country code ");
- }
-
- Map<String, ModuleConfig> moduleConfigsMap = module.getModuleConfigs();
- for(String key : moduleConfigsMap.keySet()) {
-
- ModuleConfig moduleConfig = (ModuleConfig)moduleConfigsMap.get(key);
- if(moduleConfig.getEnv().equals(env)) {
- host = moduleConfig.getHost();
- protocol = moduleConfig.getScheme();
- port = moduleConfig.getPort();
- url = moduleConfig.getUri();
- }
- }
-
-
- StringBuilder xmlreqbuffer = new StringBuilder();
- xmlreqbuffer.append("<?xml version=\"1.0\"?>");
- xmlreqbuffer.append("<AccessRequest>");
- xmlreqbuffer.append("<AccessLicenseNumber>");
- xmlreqbuffer.append(accessKey);
- xmlreqbuffer.append("</AccessLicenseNumber>");
- xmlreqbuffer.append("<UserId>");
- xmlreqbuffer.append(userId);
- xmlreqbuffer.append("</UserId>");
- xmlreqbuffer.append("<Password>");
- xmlreqbuffer.append(password);
- xmlreqbuffer.append("</Password>");
- xmlreqbuffer.append("</AccessRequest>");
-
- String xmlhead = xmlreqbuffer.toString();
-
-
- String weightCode = store.getWeightunitcode();
- String measureCode = store.getSeizeunitcode();
-
- if (weightCode.equals("KG")) {
- weightCode = "KGS";
- } else {
- weightCode = "LBS";
- }
-
- String xml = "<?xml version=\"1.0\"?><RatingServiceSelectionRequest><Request><TransactionReference><CustomerContext>Shopizer</CustomerContext><XpciVersion>1.0001</XpciVersion></TransactionReference><RequestAction>Rate</RequestAction><RequestOption>Shop</RequestOption></Request>";
- StringBuffer xmldatabuffer = new StringBuffer();
-
- /**
- * <Shipment>
- *
- * <Shipper> <Address> <City></City>
- * <StateProvinceCode>QC</StateProvinceCode>
- * <CountryCode>CA</CountryCode> <PostalCode></PostalCode>
- * </Address> </Shipper>
- *
- * <ShipTo> <Address> <City>Redwood Shores</City>
- * <StateProvinceCode>CA</StateProvinceCode>
- * <CountryCode>US</CountryCode> <PostalCode></PostalCode>
- * <ResidentialAddressIndicator/> </Address> </ShipTo>
- *
- * <Package> <PackagingType> <Code>21</Code> </PackagingType>
- * <PackageWeight> <UnitOfMeasurement> <Code>LBS</Code>
- * </UnitOfMeasurement> <Weight>1.1</Weight> </PackageWeight>
- * <PackageServiceOptions> <InsuredValue>
- * <CurrencyCode>CAD</CurrencyCode>
- * <MonetaryValue>100</MonetaryValue> </InsuredValue>
- * </PackageServiceOptions> </Package>
- *
- *
- * </Shipment>
- *
- * <CustomerClassification> <Code>03</Code>
- * </CustomerClassification> </RatingServiceSelectionRequest>
- * **/
-
- /**Map countriesMap = (Map) RefCache.getAllcountriesmap(LanguageUtil
- .getLanguageNumberCode(locale.getLanguage()));
- Map zonesMap = (Map) RefCache.getAllZonesmap(LanguageUtil
- .getLanguageNumberCode(locale.getLanguage()));
-
- Country storeCountry = (Country) countriesMap.get(store
- .getCountry());
-
- Country customerCountry = (Country) countriesMap.get(customer
- .getCustomerCountryId());
-
- int sZone = -1;
- try {
- sZone = Integer.parseInt(store.getZone());
- } catch (Exception e) {
- // TODO: handle exception
- }
-
- Zone storeZone = (Zone) zonesMap.get(sZone);
- Zone customerZone = (Zone) zonesMap.get(customer
- .getCustomerZoneId());**/
-
-
-
- xmldatabuffer.append("<PickupType><Code>03</Code></PickupType>");
- // xmldatabuffer.append("<Description>Daily Pickup</Description>");
- xmldatabuffer.append("<Shipment><Shipper>");
- xmldatabuffer.append("<Address>");
- xmldatabuffer.append("<City>");
- xmldatabuffer.append(store.getStorecity());
- xmldatabuffer.append("</City>");
- // if(!StringUtils.isBlank(store.getStorestateprovince())) {
- if (store.getZone() != null) {
- xmldatabuffer.append("<StateProvinceCode>");
- xmldatabuffer.append(store.getZone().getCode());// zone code
- xmldatabuffer.append("</StateProvinceCode>");
- }
- xmldatabuffer.append("<CountryCode>");
- xmldatabuffer.append(store.getCountry().getIsoCode());
- xmldatabuffer.append("</CountryCode>");
- xmldatabuffer.append("<PostalCode>");
- xmldatabuffer.append(DataUtils
- .trimPostalCode(store.getStorepostalcode()));
- xmldatabuffer.append("</PostalCode></Address></Shipper>");
-
- // ship to
- xmldatabuffer.append("<ShipTo>");
- xmldatabuffer.append("<Address>");
- xmldatabuffer.append("<City>");
- xmldatabuffer.append(delivery.getCity());
- xmldatabuffer.append("</City>");
- // if(!StringUtils.isBlank(customer.getCustomerState())) {
- if (delivery.getZone() != null) {
- xmldatabuffer.append("<StateProvinceCode>");
- xmldatabuffer.append(delivery.getZone().getCode());// zone code
- xmldatabuffer.append("</StateProvinceCode>");
- }
- xmldatabuffer.append("<CountryCode>");
- xmldatabuffer.append(delivery.getCountry().getIsoCode());
- xmldatabuffer.append("</CountryCode>");
- xmldatabuffer.append("<PostalCode>");
- xmldatabuffer.append(DataUtils
- .trimPostalCode(delivery.getPostalCode()));
- xmldatabuffer.append("</PostalCode></Address></ShipTo>");
- // xmldatabuffer.append("<Service><Code>11</Code></Service>");//TODO service codes (next day ...)
-
-
- for(PackageDetails packageDetail : packages){
-
- xmldatabuffer.append("<Package>");
- xmldatabuffer.append("<PackagingType>");
- xmldatabuffer.append("<Code>");
- xmldatabuffer.append(pack);
- xmldatabuffer.append("</Code>");
- xmldatabuffer.append("</PackagingType>");
-
- // weight
- xmldatabuffer.append("<PackageWeight>");
- xmldatabuffer.append("<UnitOfMeasurement>");
- xmldatabuffer.append("<Code>");
- xmldatabuffer.append(weightCode);
- xmldatabuffer.append("</Code>");
- xmldatabuffer.append("</UnitOfMeasurement>");
- xmldatabuffer.append("<Weight>");
- xmldatabuffer.append(new BigDecimal(packageDetail.getShippingWeight())
- .setScale(1, BigDecimal.ROUND_HALF_UP));
- xmldatabuffer.append("</Weight>");
- xmldatabuffer.append("</PackageWeight>");
-
- // dimension
- xmldatabuffer.append("<Dimensions>");
- xmldatabuffer.append("<UnitOfMeasurement>");
- xmldatabuffer.append("<Code>");
- xmldatabuffer.append(measureCode);
- xmldatabuffer.append("</Code>");
- xmldatabuffer.append("</UnitOfMeasurement>");
- xmldatabuffer.append("<Length>");
- xmldatabuffer.append(new BigDecimal(packageDetail.getShippingLength())
- .setScale(2, BigDecimal.ROUND_HALF_UP));
- xmldatabuffer.append("</Length>");
- xmldatabuffer.append("<Width>");
- xmldatabuffer.append(new BigDecimal(packageDetail.getShippingWidth())
- .setScale(2, BigDecimal.ROUND_HALF_UP));
- xmldatabuffer.append("</Width>");
- xmldatabuffer.append("<Height>");
- xmldatabuffer.append(new BigDecimal(packageDetail.getShippingHeight())
- .setScale(2, BigDecimal.ROUND_HALF_UP));
- xmldatabuffer.append("</Height>");
- xmldatabuffer.append("</Dimensions>");
- xmldatabuffer.append("</Package>");
-
- }
-
- xmldatabuffer.append("</Shipment>");
- xmldatabuffer.append("</RatingServiceSelectionRequest>");
-
- xmlbuffer.append(xmlhead).append(xml).append(
- xmldatabuffer.toString());
-
-
-
- LOGGER.debug("UPS QUOTE REQUEST " + xmlbuffer.toString());
-
-
- CloseableHttpClient httpclient = HttpClients.createDefault();
- //HttpClient client = new HttpClient();
- httppost = new HttpPost(protocol + "://" + host + ":" + port
- + url);
-
- StringEntity entity = new StringEntity(xmlbuffer.toString(),ContentType.APPLICATION_ATOM_XML);
-
- //RequestEntity entity = new StringRequestEntity(
- // xmlbuffer.toString(), "text/plain", "UTF-8");
- httppost.setEntity(entity);
-
- // Create a custom response handler
- ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
-
- @Override
- public String handleResponse(
- final HttpResponse response) throws ClientProtocolException, IOException {
- int status = response.getStatusLine().getStatusCode();
- if (status >= 200 && status < 300) {
- HttpEntity entity = response.getEntity();
- return entity != null ? EntityUtils.toString(entity) : null;
- } else {
- LOGGER.error("Communication Error with ups quote " + status);
- throw new ClientProtocolException("UPS quote communication error " + status);
- }
- }
-
- };
-
- String data = httpclient.execute(httppost, responseHandler);
-
- //int result = response.getStatusLine().getStatusCode();
- //int result = client.executeMethod(httppost);
-/* if (result != 200) {
- LOGGER.error("Communication Error with ups quote " + result + " "
- + protocol + "://" + host + ":" + port + url);
- throw new Exception("UPS quote communication error " + result);
- }*/
-
- LOGGER.debug("ups quote response " + data);
-
- UPSParsedElements parsed = new UPSParsedElements();
-
- Digester digester = new Digester();
- digester.push(parsed);
- digester.addCallMethod(
- "RatingServiceSelectionResponse/Response/Error",
- "setErrorCode", 0);
- digester.addCallMethod(
- "RatingServiceSelectionResponse/Response/ErrorDescriprion",
- "setError", 0);
- digester
- .addCallMethod(
- "RatingServiceSelectionResponse/Response/ResponseStatusCode",
- "setStatusCode", 0);
- digester
- .addCallMethod(
- "RatingServiceSelectionResponse/Response/ResponseStatusDescription",
- "setStatusMessage", 0);
- digester
- .addCallMethod(
- "RatingServiceSelectionResponse/Response/Error/ErrorDescription",
- "setError", 0);
-
- digester.addObjectCreate(
- "RatingServiceSelectionResponse/RatedShipment",
- ShippingOption.class);
- // digester.addSetProperties(
- // "RatingServiceSelectionResponse/RatedShipment", "sequence",
- // "optionId" );
- digester
- .addCallMethod(
- "RatingServiceSelectionResponse/RatedShipment/Service/Code",
- "setOptionId", 0);
- digester
- .addCallMethod(
- "RatingServiceSelectionResponse/RatedShipment/TotalCharges/MonetaryValue",
- "setOptionPriceText", 0);
- //digester
- // .addCallMethod(
- // "RatingServiceSelectionResponse/RatedShipment/TotalCharges/CurrencyCode",
- // "setCurrency", 0);
- digester
- .addCallMethod(
- "RatingServiceSelectionResponse/RatedShipment/Service/Code",
- "setOptionCode", 0);
- digester
- .addCallMethod(
- "RatingServiceSelectionResponse/RatedShipment/GuaranteedDaysToDelivery",
- "setEstimatedNumberOfDays", 0);
- digester.addSetNext("RatingServiceSelectionResponse/RatedShipment",
- "addOption");
-
- // <?xml
- // version="1.0"?><AddressValidationResponse><Response><TransactionReference><CustomerContext>SalesManager
- // Data</CustomerContext><XpciVersion>1.0</XpciVersion></TransactionReference><ResponseStatusCode>0</ResponseStatusCode><ResponseStatusDescription>Failure</ResponseStatusDescription><Error><ErrorSeverity>Hard</ErrorSeverity><ErrorCode>10002</ErrorCode><ErrorDescription>The
- // XML document is well formed but the document is not
- // valid</ErrorDescription><ErrorLocation><ErrorLocationElementName>AddressValidationRequest</ErrorLocationElementName></ErrorLocation></Error></Response></AddressValidationResponse>
-
- Reader xmlreader = new StringReader(data);
-
- digester.parse(xmlreader);
-
- if (!StringUtils.isBlank(parsed.getErrorCode())) {
-
-
- LOGGER.error("Can't process UPS statusCode="
- + parsed.getErrorCode() + " message= "
- + parsed.getError());
- throw new IntegrationException(parsed.getError());
- }
- if (!StringUtils.isBlank(parsed.getStatusCode())
- && !parsed.getStatusCode().equals("1")) {
-
- throw new IntegrationException(parsed.getError());
- }
-
- if (parsed.getOptions() == null || parsed.getOptions().size() == 0) {
-
- throw new IntegrationException("No shipping options available for the configuration");
- }
-
- /*String carrier = getShippingMethodDescription(locale);
- // cost is in CAD, need to do conversion
-
-
- boolean requiresCurrencyConversion = false; String storeCurrency
- = store.getCurrency();
- if(!storeCurrency.equals(Constants.CURRENCY_CODE_CAD)) {
- requiresCurrencyConversion = true; }
-
-
- LabelUtil labelUtil = LabelUtil.getInstance();
- Map serviceMap = com.salesmanager.core.util.ShippingUtil
- .buildServiceMap("upsxml", locale);
-
- *//** Details on whit RT quote information to display **//*
- MerchantConfiguration rtdetails = config
- .getMerchantConfiguration(ShippingConstants.MODULE_SHIPPING_DISPLAY_REALTIME_QUOTES);
- int displayQuoteDeliveryTime = ShippingConstants.NO_DISPLAY_RT_QUOTE_TIME;
-
-
- if (rtdetails != null) {
-
- if (!StringUtils.isBlank(rtdetails.getConfigurationValue1())) {// display
- // or
- // not
- // quotes
- try {
- displayQuoteDeliveryTime = Integer.parseInt(rtdetails
- .getConfigurationValue1());
-
- } catch (Exception e) {
- log.error("Display quote is not an integer value ["
- + rtdetails.getConfigurationValue1() + "]");
- }
- }
- }*/
-
-
- List<ShippingOption> shippingOptions = parsed.getOptions();
-
- if(shippingOptions!=null) {
-
- Map<String,String> details = module.getDetails();
-
- for(ShippingOption option : shippingOptions) {
-
- String name = details.get(option.getOptionCode());
- option.setOptionName(name);
- if(option.getOptionPrice()==null) {
- String priceText = option.getOptionPriceText();
- if(StringUtils.isBlank(priceText)) {
- throw new IntegrationException("Price text is null for option " + name);
- }
-
- try {
- BigDecimal price = new BigDecimal(priceText);
- option.setOptionPrice(price);
- } catch(Exception e) {
- throw new IntegrationException("Can't convert to numeric price " + priceText);
- }
-
- }
-
-
- }
-
-
- }
-
-/* if (options != null) {
-
- Map selectedintlservices = (Map) config
- .getConfiguration("service-global-upsxml");
-
- Iterator i = options.iterator();
- while (i.hasNext()) {
- ShippingOption option = (ShippingOption) i.next();
- // option.setCurrency(store.getCurrency());
- StringBuffer description = new StringBuffer();
-
- String code = option.getOptionCode();
- option.setOptionCode(code);
- // get description
- String label = (String) serviceMap.get(code);
- if (label == null) {
- log
- .warn("UPSXML cannot find description for service code "
- + code);
- }
-
- option.setOptionName(label);
-
- description.append(option.getOptionName());
- if (displayQuoteDeliveryTime == ShippingConstants.DISPLAY_RT_QUOTE_TIME) {
- if (!StringUtils.isBlank(option
- .getEstimatedNumberOfDays())) {
- description.append(" (").append(
- option.getEstimatedNumberOfDays()).append(
- " ").append(
- labelUtil.getText(locale,
- "label.generic.days.lowercase"))
- .append(")");
- }
- }
- option.setDescription(description.toString());
-
- // get currency
- if (!option.getCurrency().equals(store.getCurrency())) {
- option.setOptionPrice(CurrencyUtil.convertToCurrency(
- option.getOptionPrice(), option.getCurrency(),
- store.getCurrency()));
- }
-
- if (!selectedintlservices.containsKey(option
- .getOptionCode())) {
- if (returnColl == null) {
- returnColl = new ArrayList();
- }
- returnColl.add(option);
- // options.remove(option);
- }
-
- }
-
- if (options.size() == 0) {
- LogMerchantUtil
- .log(
- store.getMerchantId(),
- " none of the service code returned by UPS ["
- + selectedintlservices
- .keySet()
- .toArray(
- new String[selectedintlservices
- .size()])
- + "] for this shipping is in your selection list");
- }
- }*/
-
-
-
- return shippingOptions;
-
- } catch (Exception e1) {
- LOGGER.error("UPS quote error",e1);
- throw new IntegrationException(e1);
- } finally {
- if (reader != null) {
- try {
- reader.close();
- } catch (Exception ignore) {
- }
- }
-
- if (httppost != null) {
- httppost.releaseConnection();
- }
- }
-}
-
-
- @Override
- public CustomIntegrationConfiguration getCustomModuleConfiguration(
- MerchantStore store) throws IntegrationException {
- //nothing to do
- return null;
- }}
-
-
-class UPSParsedElements {
-
- private String statusCode;
- private String statusMessage;
- private String error = "";
- private String errorCode = "";
- private List<ShippingOption> options = new ArrayList<ShippingOption>();
-
- public void addOption(ShippingOption option) {
- options.add(option);
- }
-
- public List<ShippingOption> getOptions() {
- return options;
- }
-
- public String getStatusCode() {
- return statusCode;
- }
-
- public void setStatusCode(String statusCode) {
- this.statusCode = statusCode;
- }
-
- public String getStatusMessage() {
- return statusMessage;
- }
-
- public void setStatusMessage(String statusMessage) {
- this.statusMessage = statusMessage;
- }
-
- public String getError() {
- return error;
- }
-
- public void setError(String error) {
- this.error = error;
- }
-
- public String getErrorCode() {
- return errorCode;
- }
-
- public void setErrorCode(String errorCode) {
- this.errorCode = errorCode;
- }
-
-}
+package com.salesmanager.core.business.modules.integration.shipping.impl;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.digester.Digester;
+import org.apache.commons.lang.Validate;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.salesmanager.core.business.utils.DataUtils;
+import com.salesmanager.core.model.common.Delivery;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.shipping.PackageDetails;
+import com.salesmanager.core.model.shipping.ShippingConfiguration;
+import com.salesmanager.core.model.shipping.ShippingOption;
+import com.salesmanager.core.model.shipping.ShippingOrigin;
+import com.salesmanager.core.model.shipping.ShippingQuote;
+import com.salesmanager.core.model.system.CustomIntegrationConfiguration;
+import com.salesmanager.core.model.system.IntegrationConfiguration;
+import com.salesmanager.core.model.system.IntegrationModule;
+import com.salesmanager.core.model.system.ModuleConfig;
+import com.salesmanager.core.modules.integration.IntegrationException;
+import com.salesmanager.core.modules.integration.shipping.model.ShippingQuoteModule;
+
+
+/**
+ * Integrates with UPS online API
+ * @author casams1
+ *
+ */
+public class UPSShippingQuote implements ShippingQuoteModule {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(UPSShippingQuote.class);
+
+
+ @Override
+ public void validateModuleConfiguration(
+ IntegrationConfiguration integrationConfiguration,
+ MerchantStore store) throws IntegrationException {
+
+
+ List<String> errorFields = null;
+
+ //validate integrationKeys['accessKey']
+ Map<String,String> keys = integrationConfiguration.getIntegrationKeys();
+ if(keys==null || StringUtils.isBlank(keys.get("accessKey"))) {
+ errorFields = new ArrayList<String>();
+ errorFields.add("accessKey");
+ }
+
+ if(keys==null || StringUtils.isBlank(keys.get("userId"))) {
+ errorFields = new ArrayList<String>();
+ errorFields.add("userId");
+ }
+
+ if(keys==null || StringUtils.isBlank(keys.get("password"))) {
+ errorFields = new ArrayList<String>();
+ errorFields.add("password");
+ }
+
+ //validate at least one integrationOptions['packages']
+ Map<String,List<String>> options = integrationConfiguration.getIntegrationOptions();
+ if(options==null) {
+ errorFields = new ArrayList<String>();
+ errorFields.add("packages");
+ }
+
+ List<String> packages = options.get("packages");
+ if(packages==null || packages.size()==0) {
+ if(errorFields==null) {
+ errorFields = new ArrayList<String>();
+ }
+ errorFields.add("packages");
+ }
+
+/* List<String> services = options.get("services");
+ if(services==null || services.size()==0) {
+ if(errorFields==null) {
+ errorFields = new ArrayList<String>();
+ }
+ errorFields.add("services");
+ }
+
+ if(services!=null && services.size()>3) {
+ if(errorFields==null) {
+ errorFields = new ArrayList<String>();
+ }
+ errorFields.add("services");
+ }*/
+
+ if(errorFields!=null) {
+ IntegrationException ex = new IntegrationException(IntegrationException.ERROR_VALIDATION_SAVE);
+ ex.setErrorFields(errorFields);
+ throw ex;
+
+ }
+
+
+
+ }
+
+ @Override
+ public List<ShippingOption> getShippingQuotes(
+ ShippingQuote shippingQuote,
+ List<PackageDetails> packages, BigDecimal orderTotal,
+ Delivery delivery, ShippingOrigin origin, MerchantStore store,
+ IntegrationConfiguration configuration, IntegrationModule module,
+ ShippingConfiguration shippingConfiguration, Locale locale)
+ throws IntegrationException {
+
+ Validate.notNull(configuration, "IntegrationConfiguration must not be null for USPS shipping module");
+
+
+ if(StringUtils.isBlank(delivery.getPostalCode())) {
+ return null;
+ }
+
+ BigDecimal total = orderTotal;
+
+ if (packages == null) {
+ return null;
+ }
+
+ List<ShippingOption> options = null;
+
+ // only applies to Canada and US
+ Country country = delivery.getCountry();
+
+
+
+ if(!(country.getIsoCode().equals("US") || country.getIsoCode().equals("CA"))) {
+ return null;
+ //throw new IntegrationException("UPS Not configured for shipping in country " + country.getIsoCode());
+ }
+
+ // supports en and fr
+ String language = locale.getLanguage();
+ if (!language.equals(Locale.FRENCH.getLanguage())
+ && !language.equals(Locale.ENGLISH.getLanguage())) {
+ language = Locale.ENGLISH.getLanguage();
+ }
+
+ String pack = configuration.getIntegrationOptions().get("packages").get(0);
+ Map<String,String> keys = configuration.getIntegrationKeys();
+
+ String accessKey = keys.get("accessKey");
+ String userId = keys.get("userId");
+ String password = keys.get("password");
+
+
+ String host = null;
+ String protocol = null;
+ String port = null;
+ String url = null;
+
+ StringBuilder xmlbuffer = new StringBuilder();
+ HttpPost httppost = null;
+ BufferedReader reader = null;
+
+ try {
+ String env = configuration.getEnvironment();
+
+ Set<String> regions = module.getRegionsSet();
+ if(!regions.contains(store.getCountry().getIsoCode())) {
+ throw new IntegrationException("Can't use the service for store country code ");
+ }
+
+ Map<String, ModuleConfig> moduleConfigsMap = module.getModuleConfigs();
+ for(String key : moduleConfigsMap.keySet()) {
+
+ ModuleConfig moduleConfig = (ModuleConfig)moduleConfigsMap.get(key);
+ if(moduleConfig.getEnv().equals(env)) {
+ host = moduleConfig.getHost();
+ protocol = moduleConfig.getScheme();
+ port = moduleConfig.getPort();
+ url = moduleConfig.getUri();
+ }
+ }
+
+
+ StringBuilder xmlreqbuffer = new StringBuilder();
+ xmlreqbuffer.append("<?xml version=\"1.0\"?>");
+ xmlreqbuffer.append("<AccessRequest>");
+ xmlreqbuffer.append("<AccessLicenseNumber>");
+ xmlreqbuffer.append(accessKey);
+ xmlreqbuffer.append("</AccessLicenseNumber>");
+ xmlreqbuffer.append("<UserId>");
+ xmlreqbuffer.append(userId);
+ xmlreqbuffer.append("</UserId>");
+ xmlreqbuffer.append("<Password>");
+ xmlreqbuffer.append(password);
+ xmlreqbuffer.append("</Password>");
+ xmlreqbuffer.append("</AccessRequest>");
+
+ String xmlhead = xmlreqbuffer.toString();
+
+
+ String weightCode = store.getWeightunitcode();
+ String measureCode = store.getSeizeunitcode();
+
+ if (weightCode.equals("KG")) {
+ weightCode = "KGS";
+ } else {
+ weightCode = "LBS";
+ }
+
+ String xml = "<?xml version=\"1.0\"?><RatingServiceSelectionRequest><Request><TransactionReference><CustomerContext>Shopizer</CustomerContext><XpciVersion>1.0001</XpciVersion></TransactionReference><RequestAction>Rate</RequestAction><RequestOption>Shop</RequestOption></Request>";
+ StringBuffer xmldatabuffer = new StringBuffer();
+
+ /**
+ * <Shipment>
+ *
+ * <Shipper> <Address> <City></City>
+ * <StateProvinceCode>QC</StateProvinceCode>
+ * <CountryCode>CA</CountryCode> <PostalCode></PostalCode>
+ * </Address> </Shipper>
+ *
+ * <ShipTo> <Address> <City>Redwood Shores</City>
+ * <StateProvinceCode>CA</StateProvinceCode>
+ * <CountryCode>US</CountryCode> <PostalCode></PostalCode>
+ * <ResidentialAddressIndicator/> </Address> </ShipTo>
+ *
+ * <Package> <PackagingType> <Code>21</Code> </PackagingType>
+ * <PackageWeight> <UnitOfMeasurement> <Code>LBS</Code>
+ * </UnitOfMeasurement> <Weight>1.1</Weight> </PackageWeight>
+ * <PackageServiceOptions> <InsuredValue>
+ * <CurrencyCode>CAD</CurrencyCode>
+ * <MonetaryValue>100</MonetaryValue> </InsuredValue>
+ * </PackageServiceOptions> </Package>
+ *
+ *
+ * </Shipment>
+ *
+ * <CustomerClassification> <Code>03</Code>
+ * </CustomerClassification> </RatingServiceSelectionRequest>
+ * **/
+
+ /**Map countriesMap = (Map) RefCache.getAllcountriesmap(LanguageUtil
+ .getLanguageNumberCode(locale.getLanguage()));
+ Map zonesMap = (Map) RefCache.getAllZonesmap(LanguageUtil
+ .getLanguageNumberCode(locale.getLanguage()));
+
+ Country storeCountry = (Country) countriesMap.get(store
+ .getCountry());
+
+ Country customerCountry = (Country) countriesMap.get(customer
+ .getCustomerCountryId());
+
+ int sZone = -1;
+ try {
+ sZone = Integer.parseInt(store.getZone());
+ } catch (Exception e) {
+ // TODO: handle exception
+ }
+
+ Zone storeZone = (Zone) zonesMap.get(sZone);
+ Zone customerZone = (Zone) zonesMap.get(customer
+ .getCustomerZoneId());**/
+
+
+
+ xmldatabuffer.append("<PickupType><Code>03</Code></PickupType>");
+ // xmldatabuffer.append("<Description>Daily Pickup</Description>");
+ xmldatabuffer.append("<Shipment><Shipper>");
+ xmldatabuffer.append("<Address>");
+ xmldatabuffer.append("<City>");
+ xmldatabuffer.append(store.getStorecity());
+ xmldatabuffer.append("</City>");
+ // if(!StringUtils.isBlank(store.getStorestateprovince())) {
+ if (store.getZone() != null) {
+ xmldatabuffer.append("<StateProvinceCode>");
+ xmldatabuffer.append(store.getZone().getCode());// zone code
+ xmldatabuffer.append("</StateProvinceCode>");
+ }
+ xmldatabuffer.append("<CountryCode>");
+ xmldatabuffer.append(store.getCountry().getIsoCode());
+ xmldatabuffer.append("</CountryCode>");
+ xmldatabuffer.append("<PostalCode>");
+ xmldatabuffer.append(DataUtils
+ .trimPostalCode(store.getStorepostalcode()));
+ xmldatabuffer.append("</PostalCode></Address></Shipper>");
+
+ // ship to
+ xmldatabuffer.append("<ShipTo>");
+ xmldatabuffer.append("<Address>");
+ xmldatabuffer.append("<City>");
+ xmldatabuffer.append(delivery.getCity());
+ xmldatabuffer.append("</City>");
+ // if(!StringUtils.isBlank(customer.getCustomerState())) {
+ if (delivery.getZone() != null) {
+ xmldatabuffer.append("<StateProvinceCode>");
+ xmldatabuffer.append(delivery.getZone().getCode());// zone code
+ xmldatabuffer.append("</StateProvinceCode>");
+ }
+ xmldatabuffer.append("<CountryCode>");
+ xmldatabuffer.append(delivery.getCountry().getIsoCode());
+ xmldatabuffer.append("</CountryCode>");
+ xmldatabuffer.append("<PostalCode>");
+ xmldatabuffer.append(DataUtils
+ .trimPostalCode(delivery.getPostalCode()));
+ xmldatabuffer.append("</PostalCode></Address></ShipTo>");
+ // xmldatabuffer.append("<Service><Code>11</Code></Service>");//TODO service codes (next day ...)
+
+
+ for(PackageDetails packageDetail : packages){
+
+ xmldatabuffer.append("<Package>");
+ xmldatabuffer.append("<PackagingType>");
+ xmldatabuffer.append("<Code>");
+ xmldatabuffer.append(pack);
+ xmldatabuffer.append("</Code>");
+ xmldatabuffer.append("</PackagingType>");
+
+ // weight
+ xmldatabuffer.append("<PackageWeight>");
+ xmldatabuffer.append("<UnitOfMeasurement>");
+ xmldatabuffer.append("<Code>");
+ xmldatabuffer.append(weightCode);
+ xmldatabuffer.append("</Code>");
+ xmldatabuffer.append("</UnitOfMeasurement>");
+ xmldatabuffer.append("<Weight>");
+ xmldatabuffer.append(new BigDecimal(packageDetail.getShippingWeight())
+ .setScale(1, BigDecimal.ROUND_HALF_UP));
+ xmldatabuffer.append("</Weight>");
+ xmldatabuffer.append("</PackageWeight>");
+
+ // dimension
+ xmldatabuffer.append("<Dimensions>");
+ xmldatabuffer.append("<UnitOfMeasurement>");
+ xmldatabuffer.append("<Code>");
+ xmldatabuffer.append(measureCode);
+ xmldatabuffer.append("</Code>");
+ xmldatabuffer.append("</UnitOfMeasurement>");
+ xmldatabuffer.append("<Length>");
+ xmldatabuffer.append(new BigDecimal(packageDetail.getShippingLength())
+ .setScale(2, BigDecimal.ROUND_HALF_UP));
+ xmldatabuffer.append("</Length>");
+ xmldatabuffer.append("<Width>");
+ xmldatabuffer.append(new BigDecimal(packageDetail.getShippingWidth())
+ .setScale(2, BigDecimal.ROUND_HALF_UP));
+ xmldatabuffer.append("</Width>");
+ xmldatabuffer.append("<Height>");
+ xmldatabuffer.append(new BigDecimal(packageDetail.getShippingHeight())
+ .setScale(2, BigDecimal.ROUND_HALF_UP));
+ xmldatabuffer.append("</Height>");
+ xmldatabuffer.append("</Dimensions>");
+ xmldatabuffer.append("</Package>");
+
+ }
+
+ xmldatabuffer.append("</Shipment>");
+ xmldatabuffer.append("</RatingServiceSelectionRequest>");
+
+ xmlbuffer.append(xmlhead).append(xml).append(
+ xmldatabuffer.toString());
+
+
+
+ LOGGER.debug("UPS QUOTE REQUEST " + xmlbuffer.toString());
+
+
+ CloseableHttpClient httpclient = HttpClients.createDefault();
+ //HttpClient client = new HttpClient();
+ httppost = new HttpPost(protocol + "://" + host + ":" + port
+ + url);
+
+ StringEntity entity = new StringEntity(xmlbuffer.toString(),ContentType.APPLICATION_ATOM_XML);
+
+ //RequestEntity entity = new StringRequestEntity(
+ // xmlbuffer.toString(), "text/plain", "UTF-8");
+ httppost.setEntity(entity);
+
+ // Create a custom response handler
+ ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
+
+ @Override
+ public String handleResponse(
+ final HttpResponse response) throws ClientProtocolException, IOException {
+ int status = response.getStatusLine().getStatusCode();
+ if (status >= 200 && status < 300) {
+ HttpEntity entity = response.getEntity();
+ return entity != null ? EntityUtils.toString(entity) : null;
+ } else {
+ LOGGER.error("Communication Error with ups quote " + status);
+ throw new ClientProtocolException("UPS quote communication error " + status);
+ }
+ }
+
+ };
+
+ String data = httpclient.execute(httppost, responseHandler);
+
+ //int result = response.getStatusLine().getStatusCode();
+ //int result = client.executeMethod(httppost);
+/* if (result != 200) {
+ LOGGER.error("Communication Error with ups quote " + result + " "
+ + protocol + "://" + host + ":" + port + url);
+ throw new Exception("UPS quote communication error " + result);
+ }*/
+
+ LOGGER.debug("ups quote response " + data);
+
+ UPSParsedElements parsed = new UPSParsedElements();
+
+ Digester digester = new Digester();
+ digester.push(parsed);
+ digester.addCallMethod(
+ "RatingServiceSelectionResponse/Response/Error",
+ "setErrorCode", 0);
+ digester.addCallMethod(
+ "RatingServiceSelectionResponse/Response/ErrorDescriprion",
+ "setError", 0);
+ digester
+ .addCallMethod(
+ "RatingServiceSelectionResponse/Response/ResponseStatusCode",
+ "setStatusCode", 0);
+ digester
+ .addCallMethod(
+ "RatingServiceSelectionResponse/Response/ResponseStatusDescription",
+ "setStatusMessage", 0);
+ digester
+ .addCallMethod(
+ "RatingServiceSelectionResponse/Response/Error/ErrorDescription",
+ "setError", 0);
+
+ digester.addObjectCreate(
+ "RatingServiceSelectionResponse/RatedShipment",
+ ShippingOption.class);
+ // digester.addSetProperties(
+ // "RatingServiceSelectionResponse/RatedShipment", "sequence",
+ // "optionId" );
+ digester
+ .addCallMethod(
+ "RatingServiceSelectionResponse/RatedShipment/Service/Code",
+ "setOptionId", 0);
+ digester
+ .addCallMethod(
+ "RatingServiceSelectionResponse/RatedShipment/TotalCharges/MonetaryValue",
+ "setOptionPriceText", 0);
+ //digester
+ // .addCallMethod(
+ // "RatingServiceSelectionResponse/RatedShipment/TotalCharges/CurrencyCode",
+ // "setCurrency", 0);
+ digester
+ .addCallMethod(
+ "RatingServiceSelectionResponse/RatedShipment/Service/Code",
+ "setOptionCode", 0);
+ digester
+ .addCallMethod(
+ "RatingServiceSelectionResponse/RatedShipment/GuaranteedDaysToDelivery",
+ "setEstimatedNumberOfDays", 0);
+ digester.addSetNext("RatingServiceSelectionResponse/RatedShipment",
+ "addOption");
+
+ // <?xml
+ // version="1.0"?><AddressValidationResponse><Response><TransactionReference><CustomerContext>SalesManager
+ // Data</CustomerContext><XpciVersion>1.0</XpciVersion></TransactionReference><ResponseStatusCode>0</ResponseStatusCode><ResponseStatusDescription>Failure</ResponseStatusDescription><Error><ErrorSeverity>Hard</ErrorSeverity><ErrorCode>10002</ErrorCode><ErrorDescription>The
+ // XML document is well formed but the document is not
+ // valid</ErrorDescription><ErrorLocation><ErrorLocationElementName>AddressValidationRequest</ErrorLocationElementName></ErrorLocation></Error></Response></AddressValidationResponse>
+
+ Reader xmlreader = new StringReader(data);
+
+ digester.parse(xmlreader);
+
+ if (!StringUtils.isBlank(parsed.getErrorCode())) {
+
+
+ LOGGER.error("Can't process UPS statusCode="
+ + parsed.getErrorCode() + " message= "
+ + parsed.getError());
+ throw new IntegrationException(parsed.getError());
+ }
+ if (!StringUtils.isBlank(parsed.getStatusCode())
+ && !parsed.getStatusCode().equals("1")) {
+
+ throw new IntegrationException(parsed.getError());
+ }
+
+ if (parsed.getOptions() == null || parsed.getOptions().size() == 0) {
+
+ throw new IntegrationException("No shipping options available for the configuration");
+ }
+
+ /*String carrier = getShippingMethodDescription(locale);
+ // cost is in CAD, need to do conversion
+
+
+ boolean requiresCurrencyConversion = false; String storeCurrency
+ = store.getCurrency();
+ if(!storeCurrency.equals(Constants.CURRENCY_CODE_CAD)) {
+ requiresCurrencyConversion = true; }
+
+
+ LabelUtil labelUtil = LabelUtil.getInstance();
+ Map serviceMap = com.salesmanager.core.util.ShippingUtil
+ .buildServiceMap("upsxml", locale);
+
+ *//** Details on whit RT quote information to display **//*
+ MerchantConfiguration rtdetails = config
+ .getMerchantConfiguration(ShippingConstants.MODULE_SHIPPING_DISPLAY_REALTIME_QUOTES);
+ int displayQuoteDeliveryTime = ShippingConstants.NO_DISPLAY_RT_QUOTE_TIME;
+
+
+ if (rtdetails != null) {
+
+ if (!StringUtils.isBlank(rtdetails.getConfigurationValue1())) {// display
+ // or
+ // not
+ // quotes
+ try {
+ displayQuoteDeliveryTime = Integer.parseInt(rtdetails
+ .getConfigurationValue1());
+
+ } catch (Exception e) {
+ log.error("Display quote is not an integer value ["
+ + rtdetails.getConfigurationValue1() + "]");
+ }
+ }
+ }*/
+
+
+ List<ShippingOption> shippingOptions = parsed.getOptions();
+
+ if(shippingOptions!=null) {
+
+ Map<String,String> details = module.getDetails();
+
+ for(ShippingOption option : shippingOptions) {
+
+ String name = details.get(option.getOptionCode());
+ option.setOptionName(name);
+ if(option.getOptionPrice()==null) {
+ String priceText = option.getOptionPriceText();
+ if(StringUtils.isBlank(priceText)) {
+ throw new IntegrationException("Price text is null for option " + name);
+ }
+
+ try {
+ BigDecimal price = new BigDecimal(priceText);
+ option.setOptionPrice(price);
+ } catch(Exception e) {
+ throw new IntegrationException("Can't convert to numeric price " + priceText);
+ }
+
+ }
+
+
+ }
+
+
+ }
+
+/* if (options != null) {
+
+ Map selectedintlservices = (Map) config
+ .getConfiguration("service-global-upsxml");
+
+ Iterator i = options.iterator();
+ while (i.hasNext()) {
+ ShippingOption option = (ShippingOption) i.next();
+ // option.setCurrency(store.getCurrency());
+ StringBuffer description = new StringBuffer();
+
+ String code = option.getOptionCode();
+ option.setOptionCode(code);
+ // get description
+ String label = (String) serviceMap.get(code);
+ if (label == null) {
+ log
+ .warn("UPSXML cannot find description for service code "
+ + code);
+ }
+
+ option.setOptionName(label);
+
+ description.append(option.getOptionName());
+ if (displayQuoteDeliveryTime == ShippingConstants.DISPLAY_RT_QUOTE_TIME) {
+ if (!StringUtils.isBlank(option
+ .getEstimatedNumberOfDays())) {
+ description.append(" (").append(
+ option.getEstimatedNumberOfDays()).append(
+ " ").append(
+ labelUtil.getText(locale,
+ "label.generic.days.lowercase"))
+ .append(")");
+ }
+ }
+ option.setDescription(description.toString());
+
+ // get currency
+ if (!option.getCurrency().equals(store.getCurrency())) {
+ option.setOptionPrice(CurrencyUtil.convertToCurrency(
+ option.getOptionPrice(), option.getCurrency(),
+ store.getCurrency()));
+ }
+
+ if (!selectedintlservices.containsKey(option
+ .getOptionCode())) {
+ if (returnColl == null) {
+ returnColl = new ArrayList();
+ }
+ returnColl.add(option);
+ // options.remove(option);
+ }
+
+ }
+
+ if (options.size() == 0) {
+ LogMerchantUtil
+ .log(
+ store.getMerchantId(),
+ " none of the service code returned by UPS ["
+ + selectedintlservices
+ .keySet()
+ .toArray(
+ new String[selectedintlservices
+ .size()])
+ + "] for this shipping is in your selection list");
+ }
+ }*/
+
+
+
+ return shippingOptions;
+
+ } catch (Exception e1) {
+ LOGGER.error("UPS quote error",e1);
+ throw new IntegrationException(e1);
+ } finally {
+ if (reader != null) {
+ try {
+ reader.close();
+ } catch (Exception ignore) {
+ }
+ }
+
+ if (httppost != null) {
+ httppost.releaseConnection();
+ }
+ }
+}
+
+
+ @Override
+ public CustomIntegrationConfiguration getCustomModuleConfiguration(
+ MerchantStore store) throws IntegrationException {
+ //nothing to do
+ return null;
+ }}
+
+
+class UPSParsedElements {
+
+ private String statusCode;
+ private String statusMessage;
+ private String error = "";
+ private String errorCode = "";
+ private List<ShippingOption> options = new ArrayList<ShippingOption>();
+
+ public void addOption(ShippingOption option) {
+ options.add(option);
+ }
+
+ public List<ShippingOption> getOptions() {
+ return options;
+ }
+
+ public String getStatusCode() {
+ return statusCode;
+ }
+
+ public void setStatusCode(String statusCode) {
+ this.statusCode = statusCode;
+ }
+
+ public String getStatusMessage() {
+ return statusMessage;
+ }
+
+ public void setStatusMessage(String statusMessage) {
+ this.statusMessage = statusMessage;
+ }
+
+ public String getError() {
+ return error;
+ }
+
+ public void setError(String error) {
+ this.error = error;
+ }
+
+ public String getErrorCode() {
+ return errorCode;
+ }
+
+ public void setErrorCode(String errorCode) {
+ this.errorCode = errorCode;
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/USPSShippingQuote.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/USPSShippingQuote.java
index fa42856..116e9d4 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/USPSShippingQuote.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/integration/shipping/impl/USPSShippingQuote.java
@@ -1,753 +1,753 @@
-package com.salesmanager.core.business.modules.integration.shipping.impl;
-
-import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-import java.math.BigDecimal;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import javax.inject.Inject;
-
-import org.apache.commons.digester.Digester;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.client.ClientProtocolException;
-import org.apache.http.client.ResponseHandler;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.http.util.EntityUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.salesmanager.core.business.constants.Constants;
-import com.salesmanager.core.business.services.reference.country.CountryService;
-import com.salesmanager.core.business.utils.DataUtils;
-import com.salesmanager.core.business.utils.ProductPriceUtils;
-import com.salesmanager.core.constants.MeasureUnit;
-import com.salesmanager.core.model.common.Delivery;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.shipping.PackageDetails;
-import com.salesmanager.core.model.shipping.ShippingConfiguration;
-import com.salesmanager.core.model.shipping.ShippingOption;
-import com.salesmanager.core.model.shipping.ShippingOrigin;
-import com.salesmanager.core.model.shipping.ShippingQuote;
-import com.salesmanager.core.model.system.CustomIntegrationConfiguration;
-import com.salesmanager.core.model.system.IntegrationConfiguration;
-import com.salesmanager.core.model.system.IntegrationModule;
-import com.salesmanager.core.model.system.ModuleConfig;
-import com.salesmanager.core.modules.integration.IntegrationException;
-import com.salesmanager.core.modules.integration.shipping.model.ShippingQuoteModule;
-
-
-/**
- * Integrates with USPS online API
- * @author casams1
- *
- */
-public class USPSShippingQuote implements ShippingQuoteModule {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(USPSShippingQuote.class);
-
-
- @Inject
- private ProductPriceUtils productPriceUtils;
-
- @Inject
- private CountryService countryService;
-
-
- @Override
- public void validateModuleConfiguration(
- IntegrationConfiguration integrationConfiguration,
- MerchantStore store) throws IntegrationException {
-
-
- List<String> errorFields = null;
-
- //validate integrationKeys['account']
- Map<String,String> keys = integrationConfiguration.getIntegrationKeys();
- if(keys==null || StringUtils.isBlank(keys.get("account"))) {
- errorFields = new ArrayList<String>();
- errorFields.add("identifier");
- }
-
- //validate at least one integrationOptions['packages']
- Map<String,List<String>> options = integrationConfiguration.getIntegrationOptions();
- if(options==null) {
- errorFields = new ArrayList<String>();
- errorFields.add("identifier");
- }
-
- List<String> packages = options.get("packages");
- if(packages==null || packages.size()==0) {
- if(errorFields==null) {
- errorFields = new ArrayList<String>();
- }
- errorFields.add("packages");
- }
-
-/* List<String> services = options.get("services");
- if(services==null || services.size()==0) {
- if(errorFields==null) {
- errorFields = new ArrayList<String>();
- }
- errorFields.add("services");
- }
-
- if(services!=null && services.size()>3) {
- if(errorFields==null) {
- errorFields = new ArrayList<String>();
- }
- errorFields.add("services");
- }*/
-
- if(errorFields!=null) {
- IntegrationException ex = new IntegrationException(IntegrationException.ERROR_VALIDATION_SAVE);
- ex.setErrorFields(errorFields);
- throw ex;
-
- }
-
-
-
- }
-
- @Override
- public List<ShippingOption> getShippingQuotes(
- ShippingQuote shippingQuote,
- List<PackageDetails> packages, BigDecimal orderTotal,
- Delivery delivery, ShippingOrigin origin, MerchantStore store,
- IntegrationConfiguration configuration, IntegrationModule module,
- ShippingConfiguration shippingConfiguration, Locale locale)
- throws IntegrationException {
-
-
-
- if (packages == null) {
- return null;
- }
-
- if(StringUtils.isBlank(delivery.getPostalCode())) {
- return null;
- }
-
-
-
- // only applies to Canada and US
-/* Country country = delivery.getCountry();
- if(!country.getIsoCode().equals("US") || !country.getIsoCode().equals("US")){
- throw new IntegrationException("USPS Not configured for shipping in country " + country.getIsoCode());
- }*/
-
-
-
- // supports en and fr
- String language = locale.getLanguage();
- if (!language.equals(Locale.FRENCH.getLanguage())
- && !language.equals(Locale.ENGLISH.getLanguage())) {
- language = Locale.ENGLISH.getLanguage();
- }
-
-
- // if store is not CAD /** maintained in the currency **/
-/* if (!store.getCurrency().equals(Constants.CURRENCY_CODE_CAD)) {
- total = CurrencyUtil.convertToCurrency(total, store.getCurrency(),
- Constants.CURRENCY_CODE_CAD);
- }*/
-
- Language lang = store.getDefaultLanguage();
-
-
-
- HttpGet httpget = null;
- Reader xmlreader = null;
- String pack = configuration.getIntegrationOptions().get("packages").get(0);
-
- try {
-
- Map<String,Country> countries = countryService.getCountriesMap(lang);
-
- Country destination = countries.get(delivery.getCountry().getIsoCode());
-
-
-
- Map<String,String> keys = configuration.getIntegrationKeys();
- if(keys==null || StringUtils.isBlank(keys.get("account"))) {
- return null;//TODO can we return null
- }
-
-
- String host = null;
- String protocol = null;
- String port = null;
- String url = null;
-
-
-
- //against which environment are we using the service
- String env = configuration.getEnvironment();
-
- //must be US
- if(!store.getCountry().getIsoCode().equals("US")) {
- throw new IntegrationException("Can't use the service for store country code ");
- }
-
- Map<String, ModuleConfig> moduleConfigsMap = module.getModuleConfigs();
- for(String key : moduleConfigsMap.keySet()) {
-
- ModuleConfig moduleConfig = (ModuleConfig)moduleConfigsMap.get(key);
- if(moduleConfig.getEnv().equals(env)) {
- host = moduleConfig.getHost();
- protocol = moduleConfig.getScheme();
- port = moduleConfig.getPort();
- url = moduleConfig.getUri();
- }
- }
-
-
- StringBuilder xmlheader = new StringBuilder();
- if(store.getCountry().getIsoCode().equals(delivery.getCountry().getIsoCode())) {
- xmlheader.append("<RateV3Request USERID=\"").append(keys.get("account")).append("\">");
- } else {
- xmlheader.append("<IntlRateRequest USERID=\"").append(keys.get("account")).append("\">");
- }
-
-
-
- StringBuilder xmldatabuffer = new StringBuilder();
-
-
- double totalW = 0;
- double totalH = 0;
- double totalL = 0;
- double totalG = 0;
- double totalP = 0;
-
- for (PackageDetails detail : packages) {
-
-
- // need size in inch
- double w = DataUtils.getMeasure(detail.getShippingWidth(),
- store, MeasureUnit.IN.name());
- double h = DataUtils.getMeasure(detail.getShippingHeight(),
- store, MeasureUnit.IN.name());
- double l = DataUtils.getMeasure(detail.getShippingLength(),
- store, MeasureUnit.IN.name());
-
- totalW = totalW + w;
- totalH = totalH + h;
- totalL = totalL + l;
-
- // Girth = Length + (Width x 2) + (Height x 2)
- double girth = l + (w * 2) + (h * 2);
-
- totalG = totalG + girth;
-
- // need weight in pounds
- double p = DataUtils.getWeight(detail.getShippingWeight(), store, MeasureUnit.LB.name());
-
- totalP = totalP + p;
-
- }
-
-/* BigDecimal convertedOrderTotal = CurrencyUtil.convertToCurrency(
- orderTotal, store.getCurrency(),
- Constants.CURRENCY_CODE_USD);*/
-
- // calculate total shipping volume
-
- // ship date is 3 days from here
-
- Calendar c = Calendar.getInstance();
- c.setTime(new Date());
- c.add(Calendar.DATE, 3);
- Date newDate = c.getTime();
-
- SimpleDateFormat format = new SimpleDateFormat(Constants.DEFAULT_DATE_FORMAT);
- String shipDate = format.format(newDate);
-
-
-
- int i = 1;
-
- // need pounds and ounces
- int pounds = (int) totalP;
- String ouncesString = String.valueOf(totalP - pounds);
- int ouncesIndex = ouncesString.indexOf(".");
- String ounces = "00";
- if (ouncesIndex > -1) {
- ounces = ouncesString.substring(ouncesIndex + 1);
- }
-
- String size = "REGULAR";
-
- if (totalL + totalG <= 64) {
- size = "REGULAR";
- } else if (totalL + totalG <= 108) {
- size = "LARGE";
- } else {
- size = "OVERSIZE";
- }
-
- /**
- * Domestic <Package ID="1ST"> <Service>ALL</Service>
- * <ZipOrigination>90210</ZipOrigination>
- * <ZipDestination>96698</ZipDestination> <Pounds>8</Pounds>
- * <Ounces>32</Ounces> <Container/> <Size>REGULAR</Size>
- * <Machinable>true</Machinable> </Package>
- *
- * //MAXWEIGHT=70 lbs
- *
- *
- * //domestic container default=VARIABLE whiteSpace=collapse
- * enumeration=VARIABLE enumeration=FLAT RATE BOX enumeration=FLAT
- * RATE ENVELOPE enumeration=LG FLAT RATE BOX
- * enumeration=RECTANGULAR enumeration=NONRECTANGULAR
- *
- * //INTL enumeration=Package enumeration=Postcards or aerogrammes
- * enumeration=Matter for the blind enumeration=Envelope
- *
- * Size May be left blank in situations that do not Size. Defined as
- * follows: REGULAR: package plus girth is 84 inches or less; LARGE:
- * package length plus girth measure more than 84 inches not more
- * than 108 inches; OVERSIZE: package length plus girth is more than
- * 108 but not 130 inches. For example: <Size>REGULAR</Size>
- *
- * International <Package ID="1ST"> <Machinable>true</Machinable>
- * <MailType>Envelope</MailType> <Country>Canada</Country>
- * <Length>0</Length> <Width>0</Width> <Height>0</Height>
- * <ValueOfContents>250</ValueOfContents> </Package>
- *
- * <Package ID="2ND"> <Pounds>4</Pounds> <Ounces>3</Ounces>
- * <MailType>Package</MailType> <GXG> <Length>46</Length>
- * <Width>14</Width> <Height>15</Height> <POBoxFlag>N</POBoxFlag>
- * <GiftFlag>N</GiftFlag> </GXG>
- * <ValueOfContents>250</ValueOfContents> <Country>Japan</Country>
- * </Package>
- */
-
- xmldatabuffer.append("<Package ID=\"").append(i).append("\">");
-
-
- if(store.getCountry().getIsoCode().equals(delivery.getCountry().getIsoCode())) {
-
- xmldatabuffer.append("<Service>");
- xmldatabuffer.append("ALL");
- xmldatabuffer.append("</Service>");
- xmldatabuffer.append("<ZipOrigination>");
- xmldatabuffer.append(DataUtils
- .trimPostalCode(store.getStorepostalcode()));
- xmldatabuffer.append("</ZipOrigination>");
- xmldatabuffer.append("<ZipDestination>");
- xmldatabuffer.append(DataUtils
- .trimPostalCode(delivery.getPostalCode()));
- xmldatabuffer.append("</ZipDestination>");
- xmldatabuffer.append("<Pounds>");
- xmldatabuffer.append(pounds);
- xmldatabuffer.append("</Pounds>");
- xmldatabuffer.append("<Ounces>");
- xmldatabuffer.append(ounces);
- xmldatabuffer.append("</Ounces>");
- xmldatabuffer.append("<Container>");
- xmldatabuffer.append(pack);
- xmldatabuffer.append("</Container>");
- xmldatabuffer.append("<Size>");
- xmldatabuffer.append(size);
- xmldatabuffer.append("</Size>");
- xmldatabuffer.append("<Machinable>true</Machinable>");//TODO must be changed if not machinable
- xmldatabuffer.append("<ShipDate>");
- xmldatabuffer.append(shipDate);
- xmldatabuffer.append("</ShipDate>");
- } else {
- // if international
- xmldatabuffer.append("<Pounds>");
- xmldatabuffer.append(pounds);
- xmldatabuffer.append("</Pounds>");
- xmldatabuffer.append("<Ounces>");
- xmldatabuffer.append(ounces);
- xmldatabuffer.append("</Ounces>");
- xmldatabuffer.append("<MailType>");
- xmldatabuffer.append(pack);
- xmldatabuffer.append("</MailType>");
- xmldatabuffer.append("<ValueOfContents>");
- xmldatabuffer.append(productPriceUtils.getAdminFormatedAmount(store, orderTotal));
- xmldatabuffer.append("</ValueOfContents>");
- xmldatabuffer.append("<Country>");
- xmldatabuffer.append(destination.getName());
- xmldatabuffer.append("</Country>");
- }
-
- // if international & CXG
- /*
- * xmldatabuffer.append("<CXG>"); xmldatabuffer.append("<Length>");
- * xmldatabuffer.append(""); xmldatabuffer.append("</Length>");
- * xmldatabuffer.append("<Width>"); xmldatabuffer.append("");
- * xmldatabuffer.append("</Width>");
- * xmldatabuffer.append("<Height>"); xmldatabuffer.append("");
- * xmldatabuffer.append("</Height>");
- * xmldatabuffer.append("<POBoxFlag>"); xmldatabuffer.append("");
- * xmldatabuffer.append("</POBoxFlag>");
- * xmldatabuffer.append("<GiftFlag>"); xmldatabuffer.append("");
- * xmldatabuffer.append("</GiftFlag>");
- * xmldatabuffer.append("</CXG>");
- */
-
- /*
- * xmldatabuffer.append("<Width>"); xmldatabuffer.append(totalW);
- * xmldatabuffer.append("</Width>");
- * xmldatabuffer.append("<Length>"); xmldatabuffer.append(totalL);
- * xmldatabuffer.append("</Length>");
- * xmldatabuffer.append("<Height>"); xmldatabuffer.append(totalH);
- * xmldatabuffer.append("</Height>");
- * xmldatabuffer.append("<Girth>"); xmldatabuffer.append(totalG);
- * xmldatabuffer.append("</Girth>");
- */
-
- xmldatabuffer.append("</Package>");
-
- String xmlfooter = "</RateV3Request>";
- if(!store.getCountry().getIsoCode().equals(delivery.getCountry().getIsoCode())) {
- xmlfooter = "</IntlRateRequest>";
- }
-
- StringBuilder xmlbuffer = new StringBuilder().append(xmlheader.toString()).append(
- xmldatabuffer.toString()).append(xmlfooter.toString());
-
- LOGGER.debug("USPS QUOTE REQUEST " + xmlbuffer.toString());
-
-
-
- //HttpClient client = new HttpClient();
- CloseableHttpClient httpclient = HttpClients.createDefault();
-
- @SuppressWarnings("deprecation")
- String encoded = java.net.URLEncoder.encode(xmlbuffer.toString());
-
- String completeUri = url + "?API=RateV3&XML=" + encoded;
- if(!store.getCountry().getIsoCode().equals(delivery.getCountry().getIsoCode())) {
- completeUri = url + "?API=IntlRate&XML=" + encoded;
- }
-
- // ?API=RateV3
-
- httpget = new HttpGet(protocol + "://" + host + ":" + port
- + completeUri);
- // RequestEntity entity = new
- // StringRequestEntity(xmlbuffer.toString(),"text/plain","UTF-8");
- // httpget.setRequestEntity(entity);
-
- ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
-
- @Override
- public String handleResponse(
- final HttpResponse response) throws ClientProtocolException, IOException {
- int status = response.getStatusLine().getStatusCode();
- if (status >= 200 && status < 300) {
- HttpEntity entity = response.getEntity();
- return entity != null ? EntityUtils.toString(entity) : null;
- } else {
- LOGGER.error("Communication Error with ups quote " + status);
- throw new ClientProtocolException("UPS quote communication error " + status);
- }
- }
-
- };
-
- String data = httpclient.execute(httpget, responseHandler);
-/* int result = client.executeMethod(httpget);
- if (result != 200) {
- LOGGER.error("Communication Error with usps quote " + result + " "
- + protocol + "://" + host + ":" + port + url);
- throw new Exception("USPS quote communication error " + result);
- }*/
- //data = httpget.getResponseBodyAsString();
- LOGGER.debug("usps quote response " + data);
-
- USPSParsedElements parsed = new USPSParsedElements();
-
- /**
- * <RateV3Response> <Package ID="1ST">
- * <ZipOrigination>44106</ZipOrigination>
- * <ZipDestination>20770</ZipDestination>
- */
-
- Digester digester = new Digester();
- digester.push(parsed);
-
- if(store.getCountry().getIsoCode().equals(delivery.getCountry().getIsoCode())) {
-
- digester.addCallMethod("Error/Description",
- "setError", 0);
- digester.addCallMethod("RateV3Response/Package/Error/Description",
- "setError", 0);
- digester
- .addObjectCreate(
- "RateV3Response/Package/Postage",
- ShippingOption.class);
- digester.addSetProperties("RateV3Response/Package/Postage",
- "CLASSID", "optionId");
- digester.addCallMethod(
- "RateV3Response/Package/Postage/MailService",
- "setOptionName", 0);
- digester.addCallMethod(
- "RateV3Response/Package/Postage/MailService",
- "setOptionCode", 0);
- digester.addCallMethod("RateV3Response/Package/Postage/Rate",
- "setOptionPriceText", 0);
- //digester
- // .addCallMethod(
- // "RateV3Response/Package/Postage/Commitment/CommitmentDate",
- // "estimatedNumberOfDays", 0);
- digester.addSetNext("RateV3Response/Package/Postage",
- "addOption");
-
- } else {
-
- digester.addCallMethod("Error/Description",
- "setError", 0);
- digester.addCallMethod("IntlRateResponse/Package/Error/Description",
- "setError", 0);
- digester
- .addObjectCreate(
- "IntlRateResponse/Package/Service",
- ShippingOption.class);
- digester.addSetProperties("IntlRateResponse/Package/Service",
- "ID", "optionId");
- digester.addCallMethod(
- "IntlRateResponse/Package/Service/SvcDescription",
- "setOptionName", 0);
- digester.addCallMethod(
- "IntlRateResponse/Package/Service/SvcDescription",
- "setOptionCode", 0);
- digester.addCallMethod(
- "IntlRateResponse/Package/Service/Postage",
- "setOptionPriceText", 0);
- //digester.addCallMethod(
- // "IntlRateResponse/Package/Service/SvcCommitments",
- // "setEstimatedNumberOfDays", 0);
- digester.addSetNext("IntlRateResponse/Package/Service",
- "addOption");
-
- }
-
- // <?xml
- // version="1.0"?><AddressValidationResponse><Response><TransactionReference><CustomerContext>SalesManager
- // Data</CustomerContext><XpciVersion>1.0</XpciVersion></TransactionReference><ResponseStatusCode>0</ResponseStatusCode><ResponseStatusDescription>Failure</ResponseStatusDescription><Error><ErrorSeverity>Hard</ErrorSeverity><ErrorCode>10002</ErrorCode><ErrorDescription>The
- // XML document is well formed but the document is not
- // valid</ErrorDescription><ErrorLocation><ErrorLocationElementName>AddressValidationRequest</ErrorLocationElementName></ErrorLocation></Error></Response></AddressValidationResponse>
-
-
- //<?xml version="1.0"?>
- //<IntlRateResponse><Package ID="1"><Error><Number>-2147218046</Number>
- //<Source>IntlPostage;clsIntlPostage.GetCountryAndRestirctedServiceId;clsIntlPostage.CalcAllPostageDimensionsXML;IntlRate.ProcessRequest</Source>
- //<Description>Invalid Country Name</Description><HelpFile></HelpFile><HelpContext>1000440</HelpContext></Error></Package></IntlRateResponse>
-
-
- xmlreader = new StringReader(data);
- digester.parse(xmlreader);
-
- if (!StringUtils.isBlank(parsed.getError())) {
- LOGGER.error("Can't process USPS message= "
- + parsed.getError());
- throw new IntegrationException(parsed.getError());
- }
- if (!StringUtils.isBlank(parsed.getStatusCode())
- && !parsed.getStatusCode().equals("1")) {
- LOGGER.error("Can't process USPS statusCode="
- + parsed.getStatusCode() + " message= "
- + parsed.getError());
- throw new IntegrationException(parsed.getError());
- }
-
- if (parsed.getOptions() == null || parsed.getOptions().size() == 0) {
- LOGGER.warn("No options returned from USPS");
- throw new IntegrationException(parsed.getError());
- }
-
-
-
-/* String carrier = getShippingMethodDescription(locale);
- // cost is in USD, need to do conversion
-
- MerchantConfiguration rtdetails = config
- .getMerchantConfiguration(ShippingConstants.MODULE_SHIPPING_DISPLAY_REALTIME_QUOTES);
- int displayQuoteDeliveryTime = ShippingConstants.NO_DISPLAY_RT_QUOTE_TIME;
- if (rtdetails != null) {
-
- if (!StringUtils.isBlank(rtdetails.getConfigurationValue1())) {// display
- // or
- // not
- // quotes
- try {
- displayQuoteDeliveryTime = Integer.parseInt(rtdetails
- .getConfigurationValue1());
-
- } catch (Exception e) {
- log.error("Display quote is not an integer value ["
- + rtdetails.getConfigurationValue1() + "]");
- }
- }
- }
-
- LabelUtil labelUtil = LabelUtil.getInstance();*/
- // Map serviceMap =
- // com.salesmanager.core.util.ShippingUtil.buildServiceMap("usps",locale);
-
- @SuppressWarnings("unchecked")
- List<ShippingOption> shippingOptions = parsed.getOptions();
-
-/* List<ShippingOption> returnOptions = null;
-
- if (shippingOptions != null && shippingOptions.size() > 0) {
-
- returnOptions = new ArrayList<ShippingOption>();
- // Map selectedintlservices =
- // (Map)config.getConfiguration("service-global-usps");
- // need to create a Map of LABEL - LABLEL
- // Iterator servicesIterator =
- // selectedintlservices.keySet().iterator();
- // Map services = new HashMap();
-
- // ResourceBundle bundle = ResourceBundle.getBundle("usps",
- // locale);
-
- // while(servicesIterator.hasNext()) {
- // String key = (String)servicesIterator.next();
- // String value =
- // bundle.getString("shipping.quote.services.label." + key);
- // services.put(value, key);
- // }
-
- for(ShippingOption option : shippingOptions) {
-
- StringBuilder description = new StringBuilder();
- description.append(option.getOptionName());
- //if (displayQuoteDeliveryTime == ShippingConstants.DISPLAY_RT_QUOTE_TIME) {
- if (shippingConfiguration.getShippingDescription()==ShippingDescription.LONG_DESCRIPTION) {
- if (option.getEstimatedNumberOfDays()>0) {
- description.append(" (").append(
- option.getEstimatedNumberOfDays()).append(
- " ").append(
- " d")
- .append(")");
- }
- }
- option.setDescription(description.toString());
-
- // get currency
- if (!option.getCurrency().equals(store.getCurrency())) {
- option.setOptionPrice(CurrencyUtil.convertToCurrency(
- option.getOptionPrice(), option.getCurrency(),
- store.getCurrency()));
- }
-
- // if(!services.containsKey(option.getOptionCode())) {
- // if(returnColl==null) {
- // returnColl = new ArrayList();
- // }
- // returnColl.add(option);
- // }
- returnOptions.add(option);
- }
-
- // if(options.size()==0) {
- // CommonService.logServiceMessage(store.getMerchantId(),
- // " none of the service code returned by UPS [" +
- // selectedintlservices.keySet().toArray(new
- // String[selectedintlservices.size()]) +
- // "] for this shipping is in your selection list");
- // }
-
- }*/
-
- return shippingOptions;
-
- } catch (Exception e1) {
- LOGGER.error("Error in USPS shipping quote ",e1);
- throw new IntegrationException(e1);
- } finally {
- if (xmlreader != null) {
- try {
- xmlreader.close();
- } catch (Exception ignore) {
- }
- }
- if (httpget != null) {
- httpget.releaseConnection();
- }
- }
-
-
- }
-
-
-
- @Override
- public CustomIntegrationConfiguration getCustomModuleConfiguration(
- MerchantStore store) throws IntegrationException {
- //nothing to do
- return null;
- }
-
-}
-
-
-class USPSParsedElements {
-
- private String statusCode;
- private String statusMessage;
- private String error = "";
- private String errorCode = "";
- private List<ShippingOption> options = new ArrayList<ShippingOption>();
-
- public void addOption(ShippingOption option) {
- options.add(option);
- }
-
- public List getOptions() {
- return options;
- }
-
- public String getStatusCode() {
- return statusCode;
- }
-
- public void setStatusCode(String statusCode) {
- this.statusCode = statusCode;
- }
-
- public String getStatusMessage() {
- return statusMessage;
- }
-
- public void setStatusMessage(String statusMessage) {
- this.statusMessage = statusMessage;
- }
-
- public String getError() {
- return error;
- }
-
- public void setError(String error) {
- this.error = error;
- }
-
- public String getErrorCode() {
- return errorCode;
- }
-
- public void setErrorCode(String errorCode) {
- this.errorCode = errorCode;
- }
-
-}
+package com.salesmanager.core.business.modules.integration.shipping.impl;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.StringReader;
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.apache.commons.digester.Digester;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.salesmanager.core.business.constants.Constants;
+import com.salesmanager.core.business.services.reference.country.CountryService;
+import com.salesmanager.core.business.utils.DataUtils;
+import com.salesmanager.core.business.utils.ProductPriceUtils;
+import com.salesmanager.core.constants.MeasureUnit;
+import com.salesmanager.core.model.common.Delivery;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.shipping.PackageDetails;
+import com.salesmanager.core.model.shipping.ShippingConfiguration;
+import com.salesmanager.core.model.shipping.ShippingOption;
+import com.salesmanager.core.model.shipping.ShippingOrigin;
+import com.salesmanager.core.model.shipping.ShippingQuote;
+import com.salesmanager.core.model.system.CustomIntegrationConfiguration;
+import com.salesmanager.core.model.system.IntegrationConfiguration;
+import com.salesmanager.core.model.system.IntegrationModule;
+import com.salesmanager.core.model.system.ModuleConfig;
+import com.salesmanager.core.modules.integration.IntegrationException;
+import com.salesmanager.core.modules.integration.shipping.model.ShippingQuoteModule;
+
+
+/**
+ * Integrates with USPS online API
+ * @author casams1
+ *
+ */
+public class USPSShippingQuote implements ShippingQuoteModule {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(USPSShippingQuote.class);
+
+
+ @Inject
+ private ProductPriceUtils productPriceUtils;
+
+ @Inject
+ private CountryService countryService;
+
+
+ @Override
+ public void validateModuleConfiguration(
+ IntegrationConfiguration integrationConfiguration,
+ MerchantStore store) throws IntegrationException {
+
+
+ List<String> errorFields = null;
+
+ //validate integrationKeys['account']
+ Map<String,String> keys = integrationConfiguration.getIntegrationKeys();
+ if(keys==null || StringUtils.isBlank(keys.get("account"))) {
+ errorFields = new ArrayList<String>();
+ errorFields.add("identifier");
+ }
+
+ //validate at least one integrationOptions['packages']
+ Map<String,List<String>> options = integrationConfiguration.getIntegrationOptions();
+ if(options==null) {
+ errorFields = new ArrayList<String>();
+ errorFields.add("identifier");
+ }
+
+ List<String> packages = options.get("packages");
+ if(packages==null || packages.size()==0) {
+ if(errorFields==null) {
+ errorFields = new ArrayList<String>();
+ }
+ errorFields.add("packages");
+ }
+
+/* List<String> services = options.get("services");
+ if(services==null || services.size()==0) {
+ if(errorFields==null) {
+ errorFields = new ArrayList<String>();
+ }
+ errorFields.add("services");
+ }
+
+ if(services!=null && services.size()>3) {
+ if(errorFields==null) {
+ errorFields = new ArrayList<String>();
+ }
+ errorFields.add("services");
+ }*/
+
+ if(errorFields!=null) {
+ IntegrationException ex = new IntegrationException(IntegrationException.ERROR_VALIDATION_SAVE);
+ ex.setErrorFields(errorFields);
+ throw ex;
+
+ }
+
+
+
+ }
+
+ @Override
+ public List<ShippingOption> getShippingQuotes(
+ ShippingQuote shippingQuote,
+ List<PackageDetails> packages, BigDecimal orderTotal,
+ Delivery delivery, ShippingOrigin origin, MerchantStore store,
+ IntegrationConfiguration configuration, IntegrationModule module,
+ ShippingConfiguration shippingConfiguration, Locale locale)
+ throws IntegrationException {
+
+
+
+ if (packages == null) {
+ return null;
+ }
+
+ if(StringUtils.isBlank(delivery.getPostalCode())) {
+ return null;
+ }
+
+
+
+ // only applies to Canada and US
+/* Country country = delivery.getCountry();
+ if(!country.getIsoCode().equals("US") || !country.getIsoCode().equals("US")){
+ throw new IntegrationException("USPS Not configured for shipping in country " + country.getIsoCode());
+ }*/
+
+
+
+ // supports en and fr
+ String language = locale.getLanguage();
+ if (!language.equals(Locale.FRENCH.getLanguage())
+ && !language.equals(Locale.ENGLISH.getLanguage())) {
+ language = Locale.ENGLISH.getLanguage();
+ }
+
+
+ // if store is not CAD /** maintained in the currency **/
+/* if (!store.getCurrency().equals(Constants.CURRENCY_CODE_CAD)) {
+ total = CurrencyUtil.convertToCurrency(total, store.getCurrency(),
+ Constants.CURRENCY_CODE_CAD);
+ }*/
+
+ Language lang = store.getDefaultLanguage();
+
+
+
+ HttpGet httpget = null;
+ Reader xmlreader = null;
+ String pack = configuration.getIntegrationOptions().get("packages").get(0);
+
+ try {
+
+ Map<String,Country> countries = countryService.getCountriesMap(lang);
+
+ Country destination = countries.get(delivery.getCountry().getIsoCode());
+
+
+
+ Map<String,String> keys = configuration.getIntegrationKeys();
+ if(keys==null || StringUtils.isBlank(keys.get("account"))) {
+ return null;//TODO can we return null
+ }
+
+
+ String host = null;
+ String protocol = null;
+ String port = null;
+ String url = null;
+
+
+
+ //against which environment are we using the service
+ String env = configuration.getEnvironment();
+
+ //must be US
+ if(!store.getCountry().getIsoCode().equals("US")) {
+ throw new IntegrationException("Can't use the service for store country code ");
+ }
+
+ Map<String, ModuleConfig> moduleConfigsMap = module.getModuleConfigs();
+ for(String key : moduleConfigsMap.keySet()) {
+
+ ModuleConfig moduleConfig = (ModuleConfig)moduleConfigsMap.get(key);
+ if(moduleConfig.getEnv().equals(env)) {
+ host = moduleConfig.getHost();
+ protocol = moduleConfig.getScheme();
+ port = moduleConfig.getPort();
+ url = moduleConfig.getUri();
+ }
+ }
+
+
+ StringBuilder xmlheader = new StringBuilder();
+ if(store.getCountry().getIsoCode().equals(delivery.getCountry().getIsoCode())) {
+ xmlheader.append("<RateV3Request USERID=\"").append(keys.get("account")).append("\">");
+ } else {
+ xmlheader.append("<IntlRateRequest USERID=\"").append(keys.get("account")).append("\">");
+ }
+
+
+
+ StringBuilder xmldatabuffer = new StringBuilder();
+
+
+ double totalW = 0;
+ double totalH = 0;
+ double totalL = 0;
+ double totalG = 0;
+ double totalP = 0;
+
+ for (PackageDetails detail : packages) {
+
+
+ // need size in inch
+ double w = DataUtils.getMeasure(detail.getShippingWidth(),
+ store, MeasureUnit.IN.name());
+ double h = DataUtils.getMeasure(detail.getShippingHeight(),
+ store, MeasureUnit.IN.name());
+ double l = DataUtils.getMeasure(detail.getShippingLength(),
+ store, MeasureUnit.IN.name());
+
+ totalW = totalW + w;
+ totalH = totalH + h;
+ totalL = totalL + l;
+
+ // Girth = Length + (Width x 2) + (Height x 2)
+ double girth = l + (w * 2) + (h * 2);
+
+ totalG = totalG + girth;
+
+ // need weight in pounds
+ double p = DataUtils.getWeight(detail.getShippingWeight(), store, MeasureUnit.LB.name());
+
+ totalP = totalP + p;
+
+ }
+
+/* BigDecimal convertedOrderTotal = CurrencyUtil.convertToCurrency(
+ orderTotal, store.getCurrency(),
+ Constants.CURRENCY_CODE_USD);*/
+
+ // calculate total shipping volume
+
+ // ship date is 3 days from here
+
+ Calendar c = Calendar.getInstance();
+ c.setTime(new Date());
+ c.add(Calendar.DATE, 3);
+ Date newDate = c.getTime();
+
+ SimpleDateFormat format = new SimpleDateFormat(Constants.DEFAULT_DATE_FORMAT);
+ String shipDate = format.format(newDate);
+
+
+
+ int i = 1;
+
+ // need pounds and ounces
+ int pounds = (int) totalP;
+ String ouncesString = String.valueOf(totalP - pounds);
+ int ouncesIndex = ouncesString.indexOf(".");
+ String ounces = "00";
+ if (ouncesIndex > -1) {
+ ounces = ouncesString.substring(ouncesIndex + 1);
+ }
+
+ String size = "REGULAR";
+
+ if (totalL + totalG <= 64) {
+ size = "REGULAR";
+ } else if (totalL + totalG <= 108) {
+ size = "LARGE";
+ } else {
+ size = "OVERSIZE";
+ }
+
+ /**
+ * Domestic <Package ID="1ST"> <Service>ALL</Service>
+ * <ZipOrigination>90210</ZipOrigination>
+ * <ZipDestination>96698</ZipDestination> <Pounds>8</Pounds>
+ * <Ounces>32</Ounces> <Container/> <Size>REGULAR</Size>
+ * <Machinable>true</Machinable> </Package>
+ *
+ * //MAXWEIGHT=70 lbs
+ *
+ *
+ * //domestic container default=VARIABLE whiteSpace=collapse
+ * enumeration=VARIABLE enumeration=FLAT RATE BOX enumeration=FLAT
+ * RATE ENVELOPE enumeration=LG FLAT RATE BOX
+ * enumeration=RECTANGULAR enumeration=NONRECTANGULAR
+ *
+ * //INTL enumeration=Package enumeration=Postcards or aerogrammes
+ * enumeration=Matter for the blind enumeration=Envelope
+ *
+ * Size May be left blank in situations that do not Size. Defined as
+ * follows: REGULAR: package plus girth is 84 inches or less; LARGE:
+ * package length plus girth measure more than 84 inches not more
+ * than 108 inches; OVERSIZE: package length plus girth is more than
+ * 108 but not 130 inches. For example: <Size>REGULAR</Size>
+ *
+ * International <Package ID="1ST"> <Machinable>true</Machinable>
+ * <MailType>Envelope</MailType> <Country>Canada</Country>
+ * <Length>0</Length> <Width>0</Width> <Height>0</Height>
+ * <ValueOfContents>250</ValueOfContents> </Package>
+ *
+ * <Package ID="2ND"> <Pounds>4</Pounds> <Ounces>3</Ounces>
+ * <MailType>Package</MailType> <GXG> <Length>46</Length>
+ * <Width>14</Width> <Height>15</Height> <POBoxFlag>N</POBoxFlag>
+ * <GiftFlag>N</GiftFlag> </GXG>
+ * <ValueOfContents>250</ValueOfContents> <Country>Japan</Country>
+ * </Package>
+ */
+
+ xmldatabuffer.append("<Package ID=\"").append(i).append("\">");
+
+
+ if(store.getCountry().getIsoCode().equals(delivery.getCountry().getIsoCode())) {
+
+ xmldatabuffer.append("<Service>");
+ xmldatabuffer.append("ALL");
+ xmldatabuffer.append("</Service>");
+ xmldatabuffer.append("<ZipOrigination>");
+ xmldatabuffer.append(DataUtils
+ .trimPostalCode(store.getStorepostalcode()));
+ xmldatabuffer.append("</ZipOrigination>");
+ xmldatabuffer.append("<ZipDestination>");
+ xmldatabuffer.append(DataUtils
+ .trimPostalCode(delivery.getPostalCode()));
+ xmldatabuffer.append("</ZipDestination>");
+ xmldatabuffer.append("<Pounds>");
+ xmldatabuffer.append(pounds);
+ xmldatabuffer.append("</Pounds>");
+ xmldatabuffer.append("<Ounces>");
+ xmldatabuffer.append(ounces);
+ xmldatabuffer.append("</Ounces>");
+ xmldatabuffer.append("<Container>");
+ xmldatabuffer.append(pack);
+ xmldatabuffer.append("</Container>");
+ xmldatabuffer.append("<Size>");
+ xmldatabuffer.append(size);
+ xmldatabuffer.append("</Size>");
+ xmldatabuffer.append("<Machinable>true</Machinable>");//TODO must be changed if not machinable
+ xmldatabuffer.append("<ShipDate>");
+ xmldatabuffer.append(shipDate);
+ xmldatabuffer.append("</ShipDate>");
+ } else {
+ // if international
+ xmldatabuffer.append("<Pounds>");
+ xmldatabuffer.append(pounds);
+ xmldatabuffer.append("</Pounds>");
+ xmldatabuffer.append("<Ounces>");
+ xmldatabuffer.append(ounces);
+ xmldatabuffer.append("</Ounces>");
+ xmldatabuffer.append("<MailType>");
+ xmldatabuffer.append(pack);
+ xmldatabuffer.append("</MailType>");
+ xmldatabuffer.append("<ValueOfContents>");
+ xmldatabuffer.append(productPriceUtils.getAdminFormatedAmount(store, orderTotal));
+ xmldatabuffer.append("</ValueOfContents>");
+ xmldatabuffer.append("<Country>");
+ xmldatabuffer.append(destination.getName());
+ xmldatabuffer.append("</Country>");
+ }
+
+ // if international & CXG
+ /*
+ * xmldatabuffer.append("<CXG>"); xmldatabuffer.append("<Length>");
+ * xmldatabuffer.append(""); xmldatabuffer.append("</Length>");
+ * xmldatabuffer.append("<Width>"); xmldatabuffer.append("");
+ * xmldatabuffer.append("</Width>");
+ * xmldatabuffer.append("<Height>"); xmldatabuffer.append("");
+ * xmldatabuffer.append("</Height>");
+ * xmldatabuffer.append("<POBoxFlag>"); xmldatabuffer.append("");
+ * xmldatabuffer.append("</POBoxFlag>");
+ * xmldatabuffer.append("<GiftFlag>"); xmldatabuffer.append("");
+ * xmldatabuffer.append("</GiftFlag>");
+ * xmldatabuffer.append("</CXG>");
+ */
+
+ /*
+ * xmldatabuffer.append("<Width>"); xmldatabuffer.append(totalW);
+ * xmldatabuffer.append("</Width>");
+ * xmldatabuffer.append("<Length>"); xmldatabuffer.append(totalL);
+ * xmldatabuffer.append("</Length>");
+ * xmldatabuffer.append("<Height>"); xmldatabuffer.append(totalH);
+ * xmldatabuffer.append("</Height>");
+ * xmldatabuffer.append("<Girth>"); xmldatabuffer.append(totalG);
+ * xmldatabuffer.append("</Girth>");
+ */
+
+ xmldatabuffer.append("</Package>");
+
+ String xmlfooter = "</RateV3Request>";
+ if(!store.getCountry().getIsoCode().equals(delivery.getCountry().getIsoCode())) {
+ xmlfooter = "</IntlRateRequest>";
+ }
+
+ StringBuilder xmlbuffer = new StringBuilder().append(xmlheader.toString()).append(
+ xmldatabuffer.toString()).append(xmlfooter.toString());
+
+ LOGGER.debug("USPS QUOTE REQUEST " + xmlbuffer.toString());
+
+
+
+ //HttpClient client = new HttpClient();
+ CloseableHttpClient httpclient = HttpClients.createDefault();
+
+ @SuppressWarnings("deprecation")
+ String encoded = java.net.URLEncoder.encode(xmlbuffer.toString());
+
+ String completeUri = url + "?API=RateV3&XML=" + encoded;
+ if(!store.getCountry().getIsoCode().equals(delivery.getCountry().getIsoCode())) {
+ completeUri = url + "?API=IntlRate&XML=" + encoded;
+ }
+
+ // ?API=RateV3
+
+ httpget = new HttpGet(protocol + "://" + host + ":" + port
+ + completeUri);
+ // RequestEntity entity = new
+ // StringRequestEntity(xmlbuffer.toString(),"text/plain","UTF-8");
+ // httpget.setRequestEntity(entity);
+
+ ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
+
+ @Override
+ public String handleResponse(
+ final HttpResponse response) throws ClientProtocolException, IOException {
+ int status = response.getStatusLine().getStatusCode();
+ if (status >= 200 && status < 300) {
+ HttpEntity entity = response.getEntity();
+ return entity != null ? EntityUtils.toString(entity) : null;
+ } else {
+ LOGGER.error("Communication Error with ups quote " + status);
+ throw new ClientProtocolException("UPS quote communication error " + status);
+ }
+ }
+
+ };
+
+ String data = httpclient.execute(httpget, responseHandler);
+/* int result = client.executeMethod(httpget);
+ if (result != 200) {
+ LOGGER.error("Communication Error with usps quote " + result + " "
+ + protocol + "://" + host + ":" + port + url);
+ throw new Exception("USPS quote communication error " + result);
+ }*/
+ //data = httpget.getResponseBodyAsString();
+ LOGGER.debug("usps quote response " + data);
+
+ USPSParsedElements parsed = new USPSParsedElements();
+
+ /**
+ * <RateV3Response> <Package ID="1ST">
+ * <ZipOrigination>44106</ZipOrigination>
+ * <ZipDestination>20770</ZipDestination>
+ */
+
+ Digester digester = new Digester();
+ digester.push(parsed);
+
+ if(store.getCountry().getIsoCode().equals(delivery.getCountry().getIsoCode())) {
+
+ digester.addCallMethod("Error/Description",
+ "setError", 0);
+ digester.addCallMethod("RateV3Response/Package/Error/Description",
+ "setError", 0);
+ digester
+ .addObjectCreate(
+ "RateV3Response/Package/Postage",
+ ShippingOption.class);
+ digester.addSetProperties("RateV3Response/Package/Postage",
+ "CLASSID", "optionId");
+ digester.addCallMethod(
+ "RateV3Response/Package/Postage/MailService",
+ "setOptionName", 0);
+ digester.addCallMethod(
+ "RateV3Response/Package/Postage/MailService",
+ "setOptionCode", 0);
+ digester.addCallMethod("RateV3Response/Package/Postage/Rate",
+ "setOptionPriceText", 0);
+ //digester
+ // .addCallMethod(
+ // "RateV3Response/Package/Postage/Commitment/CommitmentDate",
+ // "estimatedNumberOfDays", 0);
+ digester.addSetNext("RateV3Response/Package/Postage",
+ "addOption");
+
+ } else {
+
+ digester.addCallMethod("Error/Description",
+ "setError", 0);
+ digester.addCallMethod("IntlRateResponse/Package/Error/Description",
+ "setError", 0);
+ digester
+ .addObjectCreate(
+ "IntlRateResponse/Package/Service",
+ ShippingOption.class);
+ digester.addSetProperties("IntlRateResponse/Package/Service",
+ "ID", "optionId");
+ digester.addCallMethod(
+ "IntlRateResponse/Package/Service/SvcDescription",
+ "setOptionName", 0);
+ digester.addCallMethod(
+ "IntlRateResponse/Package/Service/SvcDescription",
+ "setOptionCode", 0);
+ digester.addCallMethod(
+ "IntlRateResponse/Package/Service/Postage",
+ "setOptionPriceText", 0);
+ //digester.addCallMethod(
+ // "IntlRateResponse/Package/Service/SvcCommitments",
+ // "setEstimatedNumberOfDays", 0);
+ digester.addSetNext("IntlRateResponse/Package/Service",
+ "addOption");
+
+ }
+
+ // <?xml
+ // version="1.0"?><AddressValidationResponse><Response><TransactionReference><CustomerContext>SalesManager
+ // Data</CustomerContext><XpciVersion>1.0</XpciVersion></TransactionReference><ResponseStatusCode>0</ResponseStatusCode><ResponseStatusDescription>Failure</ResponseStatusDescription><Error><ErrorSeverity>Hard</ErrorSeverity><ErrorCode>10002</ErrorCode><ErrorDescription>The
+ // XML document is well formed but the document is not
+ // valid</ErrorDescription><ErrorLocation><ErrorLocationElementName>AddressValidationRequest</ErrorLocationElementName></ErrorLocation></Error></Response></AddressValidationResponse>
+
+
+ //<?xml version="1.0"?>
+ //<IntlRateResponse><Package ID="1"><Error><Number>-2147218046</Number>
+ //<Source>IntlPostage;clsIntlPostage.GetCountryAndRestirctedServiceId;clsIntlPostage.CalcAllPostageDimensionsXML;IntlRate.ProcessRequest</Source>
+ //<Description>Invalid Country Name</Description><HelpFile></HelpFile><HelpContext>1000440</HelpContext></Error></Package></IntlRateResponse>
+
+
+ xmlreader = new StringReader(data);
+ digester.parse(xmlreader);
+
+ if (!StringUtils.isBlank(parsed.getError())) {
+ LOGGER.error("Can't process USPS message= "
+ + parsed.getError());
+ throw new IntegrationException(parsed.getError());
+ }
+ if (!StringUtils.isBlank(parsed.getStatusCode())
+ && !parsed.getStatusCode().equals("1")) {
+ LOGGER.error("Can't process USPS statusCode="
+ + parsed.getStatusCode() + " message= "
+ + parsed.getError());
+ throw new IntegrationException(parsed.getError());
+ }
+
+ if (parsed.getOptions() == null || parsed.getOptions().size() == 0) {
+ LOGGER.warn("No options returned from USPS");
+ throw new IntegrationException(parsed.getError());
+ }
+
+
+
+/* String carrier = getShippingMethodDescription(locale);
+ // cost is in USD, need to do conversion
+
+ MerchantConfiguration rtdetails = config
+ .getMerchantConfiguration(ShippingConstants.MODULE_SHIPPING_DISPLAY_REALTIME_QUOTES);
+ int displayQuoteDeliveryTime = ShippingConstants.NO_DISPLAY_RT_QUOTE_TIME;
+ if (rtdetails != null) {
+
+ if (!StringUtils.isBlank(rtdetails.getConfigurationValue1())) {// display
+ // or
+ // not
+ // quotes
+ try {
+ displayQuoteDeliveryTime = Integer.parseInt(rtdetails
+ .getConfigurationValue1());
+
+ } catch (Exception e) {
+ log.error("Display quote is not an integer value ["
+ + rtdetails.getConfigurationValue1() + "]");
+ }
+ }
+ }
+
+ LabelUtil labelUtil = LabelUtil.getInstance();*/
+ // Map serviceMap =
+ // com.salesmanager.core.util.ShippingUtil.buildServiceMap("usps",locale);
+
+ @SuppressWarnings("unchecked")
+ List<ShippingOption> shippingOptions = parsed.getOptions();
+
+/* List<ShippingOption> returnOptions = null;
+
+ if (shippingOptions != null && shippingOptions.size() > 0) {
+
+ returnOptions = new ArrayList<ShippingOption>();
+ // Map selectedintlservices =
+ // (Map)config.getConfiguration("service-global-usps");
+ // need to create a Map of LABEL - LABLEL
+ // Iterator servicesIterator =
+ // selectedintlservices.keySet().iterator();
+ // Map services = new HashMap();
+
+ // ResourceBundle bundle = ResourceBundle.getBundle("usps",
+ // locale);
+
+ // while(servicesIterator.hasNext()) {
+ // String key = (String)servicesIterator.next();
+ // String value =
+ // bundle.getString("shipping.quote.services.label." + key);
+ // services.put(value, key);
+ // }
+
+ for(ShippingOption option : shippingOptions) {
+
+ StringBuilder description = new StringBuilder();
+ description.append(option.getOptionName());
+ //if (displayQuoteDeliveryTime == ShippingConstants.DISPLAY_RT_QUOTE_TIME) {
+ if (shippingConfiguration.getShippingDescription()==ShippingDescription.LONG_DESCRIPTION) {
+ if (option.getEstimatedNumberOfDays()>0) {
+ description.append(" (").append(
+ option.getEstimatedNumberOfDays()).append(
+ " ").append(
+ " d")
+ .append(")");
+ }
+ }
+ option.setDescription(description.toString());
+
+ // get currency
+ if (!option.getCurrency().equals(store.getCurrency())) {
+ option.setOptionPrice(CurrencyUtil.convertToCurrency(
+ option.getOptionPrice(), option.getCurrency(),
+ store.getCurrency()));
+ }
+
+ // if(!services.containsKey(option.getOptionCode())) {
+ // if(returnColl==null) {
+ // returnColl = new ArrayList();
+ // }
+ // returnColl.add(option);
+ // }
+ returnOptions.add(option);
+ }
+
+ // if(options.size()==0) {
+ // CommonService.logServiceMessage(store.getMerchantId(),
+ // " none of the service code returned by UPS [" +
+ // selectedintlservices.keySet().toArray(new
+ // String[selectedintlservices.size()]) +
+ // "] for this shipping is in your selection list");
+ // }
+
+ }*/
+
+ return shippingOptions;
+
+ } catch (Exception e1) {
+ LOGGER.error("Error in USPS shipping quote ",e1);
+ throw new IntegrationException(e1);
+ } finally {
+ if (xmlreader != null) {
+ try {
+ xmlreader.close();
+ } catch (Exception ignore) {
+ }
+ }
+ if (httpget != null) {
+ httpget.releaseConnection();
+ }
+ }
+
+
+ }
+
+
+
+ @Override
+ public CustomIntegrationConfiguration getCustomModuleConfiguration(
+ MerchantStore store) throws IntegrationException {
+ //nothing to do
+ return null;
+ }
+
+}
+
+
+class USPSParsedElements {
+
+ private String statusCode;
+ private String statusMessage;
+ private String error = "";
+ private String errorCode = "";
+ private List<ShippingOption> options = new ArrayList<ShippingOption>();
+
+ public void addOption(ShippingOption option) {
+ options.add(option);
+ }
+
+ public List getOptions() {
+ return options;
+ }
+
+ public String getStatusCode() {
+ return statusCode;
+ }
+
+ public void setStatusCode(String statusCode) {
+ this.statusCode = statusCode;
+ }
+
+ public String getStatusMessage() {
+ return statusMessage;
+ }
+
+ public void setStatusMessage(String statusMessage) {
+ this.statusMessage = statusMessage;
+ }
+
+ public String getError() {
+ return error;
+ }
+
+ public void setError(String error) {
+ this.error = error;
+ }
+
+ public String getErrorCode() {
+ return errorCode;
+ }
+
+ public void setErrorCode(String errorCode) {
+ this.errorCode = errorCode;
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/modules/utils/EncryptionImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/modules/utils/EncryptionImpl.java
index 7965216..5316664 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/modules/utils/EncryptionImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/modules/utils/EncryptionImpl.java
@@ -1,107 +1,107 @@
-package com.salesmanager.core.business.modules.utils;
-
-import javax.crypto.Cipher;
-import javax.crypto.spec.IvParameterSpec;
-import javax.crypto.spec.SecretKeySpec;
-
-import org.apache.commons.lang3.StringUtils;
-
-import com.salesmanager.core.modules.utils.Encryption;
-
-public final class EncryptionImpl implements Encryption {
-
- private final static String IV_P = "fedcba9876543210";
- private final static String KEY_SPEC = "AES";
- private final static String CYPHER_SPEC = "AES/CBC/PKCS5Padding";
-
-
-
- private String secretKey;
-
-
-
- @Override
- public String encrypt(String value) throws Exception {
-
-
- // value = StringUtils.rightPad(value, 16,"*");
- // Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
- // NEED TO UNDERSTAND WHY PKCS5Padding DOES NOT WORK
- Cipher cipher = Cipher.getInstance(CYPHER_SPEC);
- SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(), KEY_SPEC);
- IvParameterSpec ivSpec = new IvParameterSpec(IV_P
- .getBytes());
- cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
- byte[] inpbytes = value.getBytes();
- byte[] encrypted = cipher.doFinal(inpbytes);
- return new String(bytesToHex(encrypted));
-
-
- }
-
- @Override
- public String decrypt(String value) throws Exception {
-
-
- if (StringUtils.isBlank(value))
- throw new Exception("Nothing to encrypt");
-
- // NEED TO UNDERSTAND WHY PKCS5Padding DOES NOT WORK
- // Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
- Cipher cipher = Cipher.getInstance(CYPHER_SPEC);
- SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(), KEY_SPEC);
- IvParameterSpec ivSpec = new IvParameterSpec(IV_P
- .getBytes());
- cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
- byte[] outText;
- outText = cipher.doFinal(hexToBytes(value));
- return new String(outText);
-
-
- }
-
-
- private String bytesToHex(byte[] data) {
- if (data == null) {
- return null;
- } else {
- int len = data.length;
- String str = "";
- for (int i = 0; i < len; i++) {
- if ((data[i] & 0xFF) < 16) {
- str = str + "0"
- + java.lang.Integer.toHexString(data[i] & 0xFF);
- } else {
- str = str + java.lang.Integer.toHexString(data[i] & 0xFF);
- }
-
- }
- return str;
- }
- }
-
- private static byte[] hexToBytes(String str) {
- if (str == null) {
- return null;
- } else if (str.length() < 2) {
- return null;
- } else {
- int len = str.length() / 2;
- byte[] buffer = new byte[len];
- for (int i = 0; i < len; i++) {
- buffer[i] = (byte) Integer.parseInt(str.substring(i * 2,
- i * 2 + 2), 16);
- }
- return buffer;
- }
- }
-
- public String getSecretKey() {
- return secretKey;
- }
-
- public void setSecretKey(String secretKey) {
- this.secretKey = secretKey;
- }
-
-}
+package com.salesmanager.core.business.modules.utils;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.salesmanager.core.modules.utils.Encryption;
+
+public final class EncryptionImpl implements Encryption {
+
+ private final static String IV_P = "fedcba9876543210";
+ private final static String KEY_SPEC = "AES";
+ private final static String CYPHER_SPEC = "AES/CBC/PKCS5Padding";
+
+
+
+ private String secretKey;
+
+
+
+ @Override
+ public String encrypt(String value) throws Exception {
+
+
+ // value = StringUtils.rightPad(value, 16,"*");
+ // Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
+ // NEED TO UNDERSTAND WHY PKCS5Padding DOES NOT WORK
+ Cipher cipher = Cipher.getInstance(CYPHER_SPEC);
+ SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(), KEY_SPEC);
+ IvParameterSpec ivSpec = new IvParameterSpec(IV_P
+ .getBytes());
+ cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
+ byte[] inpbytes = value.getBytes();
+ byte[] encrypted = cipher.doFinal(inpbytes);
+ return new String(bytesToHex(encrypted));
+
+
+ }
+
+ @Override
+ public String decrypt(String value) throws Exception {
+
+
+ if (StringUtils.isBlank(value))
+ throw new Exception("Nothing to encrypt");
+
+ // NEED TO UNDERSTAND WHY PKCS5Padding DOES NOT WORK
+ // Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
+ Cipher cipher = Cipher.getInstance(CYPHER_SPEC);
+ SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(), KEY_SPEC);
+ IvParameterSpec ivSpec = new IvParameterSpec(IV_P
+ .getBytes());
+ cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
+ byte[] outText;
+ outText = cipher.doFinal(hexToBytes(value));
+ return new String(outText);
+
+
+ }
+
+
+ private String bytesToHex(byte[] data) {
+ if (data == null) {
+ return null;
+ } else {
+ int len = data.length;
+ String str = "";
+ for (int i = 0; i < len; i++) {
+ if ((data[i] & 0xFF) < 16) {
+ str = str + "0"
+ + java.lang.Integer.toHexString(data[i] & 0xFF);
+ } else {
+ str = str + java.lang.Integer.toHexString(data[i] & 0xFF);
+ }
+
+ }
+ return str;
+ }
+ }
+
+ private static byte[] hexToBytes(String str) {
+ if (str == null) {
+ return null;
+ } else if (str.length() < 2) {
+ return null;
+ } else {
+ int len = str.length() / 2;
+ byte[] buffer = new byte[len];
+ for (int i = 0; i < len; i++) {
+ buffer[i] = (byte) Integer.parseInt(str.substring(i * 2,
+ i * 2 + 2), 16);
+ }
+ return buffer;
+ }
+ }
+
+ public String getSecretKey() {
+ return secretKey;
+ }
+
+ public void setSecretKey(String secretKey) {
+ this.secretKey = secretKey;
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/category/CategoryRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/category/CategoryRepository.java
index d4b5152..d7e09e8 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/category/CategoryRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/category/CategoryRepository.java
@@ -1,70 +1,67 @@
-package com.salesmanager.core.business.repositories.catalog.category;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.catalog.category.Category;
-
-
-public interface CategoryRepository extends JpaRepository<Category, Long>, CategoryRepositoryCustom {
-
-
- @Query("select c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where cd.seUrl like ?2 and cm.id = ?1 order by c.sortOrder asc")
- List<Category> listByFriendlyUrl(Integer storeId, String friendlyUrl);
-
- @Query("select c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where cd.seUrl=?2 and cm.id = ?1")
- Category findByFriendlyUrl(Integer storeId, String friendlyUrl);
-
- @Query("select c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where cd.name like %?2% and cdl.id=?3 and cm.id = ?1 order by c.sortOrder asc")
- List<Category> findByName(Integer storeId, String name, Integer languageId);
-
- @Query("select c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where c.code=?2 and cm.id = ?1")
- Category findByCode(Integer storeId, String code);
-
- @Query("select c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where c.code in (?2) and cdl.id=?3 and cm.id = ?1 order by c.sortOrder asc")
- List<Category> findByCodes(Integer storeId, List<String> codes, Integer languageId);
-
- @Query("select c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where c.id in (?2) and cdl.id=?3 and cm.id = ?1 order by c.sortOrder asc")
- List<Category> findByIds(Integer storeId, List<Long> ids, Integer languageId);
-
- @Query("select c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where cdl.id=?2 and c.id = ?1")
- Category findById(Long categoryId, Integer languageId);
-
- //@Query("select c from Category c left join fetch c.descriptions cd join fetch c.merchantStore cm where cd.language.id=?2 and c.id = ?1")
- //List<Category> findById(Long categoryId, Integer languageId);
-
- @Query("select c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where cm.code=?1 and c.code=?2")
- public Category findByCode(String merchantStoreCode, String code);
-
- @Query("select c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where c.id=?1")
- public Category findOne(Long categoryId);
-
- @Query("select distinct c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where cm.id=?1 and c.lineage like %?2% order by c.lineage, c.sortOrder asc")
- public List<Category> findByLineage(Integer merchantId, String linenage);
-
- @Query("select distinct c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where cm.code= ?1 and c.lineage like %?2% order by c.lineage, c.sortOrder asc")
- public List<Category> findByLineage(String storeCode, String linenage);
-
- @Query("select distinct c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where cm.id=?1 and c.depth >= ?2 order by c.lineage, c.sortOrder asc")
- public List<Category> findByDepth(Integer merchantId, int depth);
-
- @Query("select distinct c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where cm.id=?1 and cdl.id=?3 and c.depth >= ?2 order by c.lineage, c.sortOrder asc")
- public List<Category> findByDepth(Integer merchantId, int depth, Integer languageId);
-
- //@Query("select distinct c from Category c left join fetch c.descriptions cd join fetch c.merchantStore cm left join fetch c.parent cp where cm.id=?1 and cp.id=?2 and cd.language.id=?3 order by c.lineage, c.sortOrder asc")
- //public List<Category> findByParent(Integer merchantId, Long parentId, Integer languageId);
-
- @Query("select distinct c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm left join fetch c.parent cp where cp.id=?1 and cdl.id=?2 order by c.lineage, c.sortOrder asc")
- public List<Category> findByParent(Long parentId, Integer languageId);
-
- @Query("select distinct c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where cm.id=?1 and cdl.id=?2 order by c.lineage, c.sortOrder asc")
- public List<Category> findByStore(Integer merchantId, Integer languageId);
-
- @Query("select distinct c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where cm.id=?1 order by c.lineage, c.sortOrder asc")
- public List<Category> findByStore(Integer merchantId);
-
-
-
-}
+package com.salesmanager.core.business.repositories.catalog.category;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.catalog.category.Category;
+
+
+public interface CategoryRepository extends JpaRepository<Category, Long>, CategoryRepositoryCustom {
+
+
+ @Query("select c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where cd.seUrl like ?2 and cm.id = ?1 order by c.sortOrder asc")
+ List<Category> listByFriendlyUrl(Integer storeId, String friendlyUrl);
+
+ @Query("select c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where cd.seUrl=?2 and cm.id = ?1")
+ Category findByFriendlyUrl(Integer storeId, String friendlyUrl);
+
+ @Query("select c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where cd.name like %?2% and cdl.id=?3 and cm.id = ?1 order by c.sortOrder asc")
+ List<Category> findByName(Integer storeId, String name, Integer languageId);
+
+ @Query("select c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where c.code=?2 and cm.id = ?1")
+ Category findByCode(Integer storeId, String code);
+
+ @Query("select c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where c.code in (?2) and cdl.id=?3 and cm.id = ?1 order by c.sortOrder asc")
+ List<Category> findByCodes(Integer storeId, List<String> codes, Integer languageId);
+
+ @Query("select c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where c.id in (?2) and cdl.id=?3 and cm.id = ?1 order by c.sortOrder asc")
+ List<Category> findByIds(Integer storeId, List<Long> ids, Integer languageId);
+
+ @Query("select c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where cdl.id=?2 and c.id = ?1")
+ Category findById(Long categoryId, Integer languageId);
+
+ @Query("select c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where cm.code=?1 and c.code=?2")
+ public Category findByCode(String merchantStoreCode, String code);
+
+ @Query("select c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where c.id=?1")
+ public Category findOne(Long categoryId);
+
+ @Query("select distinct c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where cm.id=?1 and c.lineage like %?2% order by c.lineage, c.sortOrder asc")
+ public List<Category> findByLineage(Integer merchantId, String linenage);
+
+ @Query("select distinct c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where cm.code= ?1 and c.lineage like %?2% order by c.lineage, c.sortOrder asc")
+ public List<Category> findByLineage(String storeCode, String linenage);
+
+ @Query("select distinct c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where cm.id=?1 and c.depth >= ?2 order by c.lineage, c.sortOrder asc")
+ public List<Category> findByDepth(Integer merchantId, int depth);
+
+ @Query("select distinct c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where cm.id=?1 and cdl.id=?3 and c.depth >= ?2 order by c.lineage, c.sortOrder asc")
+ public List<Category> findByDepth(Integer merchantId, int depth, Integer languageId);
+
+ @Query("select distinct c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where cm.id=?1 and cdl.id=?3 and c.depth >= ?2 and c.featured=true order by c.lineage, c.sortOrder asc")
+ public List<Category> findByDepthFilterByFeatured(Integer merchantId, int depth, Integer languageId);
+
+ @Query("select distinct c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm left join fetch c.parent cp where cp.id=?1 and cdl.id=?2 order by c.lineage, c.sortOrder asc")
+ public List<Category> findByParent(Long parentId, Integer languageId);
+
+ @Query("select distinct c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where cm.id=?1 and cdl.id=?2 order by c.lineage, c.sortOrder asc")
+ public List<Category> findByStore(Integer merchantId, Integer languageId);
+
+ @Query("select distinct c from Category c left join fetch c.descriptions cd join fetch cd.language cdl join fetch c.merchantStore cm where cm.id=?1 order by c.lineage, c.sortOrder asc")
+ public List<Category> findByStore(Integer merchantId);
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/category/CategoryRepositoryCustom.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/category/CategoryRepositoryCustom.java
index 530f66a..3331429 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/category/CategoryRepositoryCustom.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/category/CategoryRepositoryCustom.java
@@ -1,15 +1,15 @@
-package com.salesmanager.core.business.repositories.catalog.category;
-
-import java.util.List;
-
-import com.salesmanager.core.model.catalog.category.Category;
-import com.salesmanager.core.model.merchant.MerchantStore;
-
-public interface CategoryRepositoryCustom {
-
- List<Object[]> countProductsByCategories(MerchantStore store,
- List<Long> categoryIds);
-
- List<Category> listByStoreAndParent(MerchantStore store, Category category);
-
-}
+package com.salesmanager.core.business.repositories.catalog.category;
+
+import java.util.List;
+
+import com.salesmanager.core.model.catalog.category.Category;
+import com.salesmanager.core.model.merchant.MerchantStore;
+
+public interface CategoryRepositoryCustom {
+
+ List<Object[]> countProductsByCategories(MerchantStore store,
+ List<Long> categoryIds);
+
+ List<Category> listByStoreAndParent(MerchantStore store, Category category);
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/category/CategoryRepositoryImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/category/CategoryRepositoryImpl.java
index 1052d5b..dac2b64 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/category/CategoryRepositoryImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/category/CategoryRepositoryImpl.java
@@ -1,96 +1,96 @@
-package com.salesmanager.core.business.repositories.catalog.category;
-
-import java.util.Date;
-import java.util.List;
-
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-
-import com.salesmanager.core.model.catalog.category.Category;
-import com.salesmanager.core.model.merchant.MerchantStore;
-
-
-public class CategoryRepositoryImpl implements CategoryRepositoryCustom {
-
- @PersistenceContext
- private EntityManager em;
-
- @Override
- public List<Object[]> countProductsByCategories(MerchantStore store, List<Long> categoryIds) {
-
-
- StringBuilder qs = new StringBuilder();
- qs.append("select categories, count(product.id) from Product product ");
- qs.append("inner join product.categories categories ");
- qs.append("where categories.id in (:cid) ");
- qs.append("and product.available=true and product.dateAvailable<=:dt ");
- qs.append("group by categories.id");
-
- String hql = qs.toString();
- Query q = this.em.createQuery(hql);
-
- q.setParameter("cid", categoryIds);
- q.setParameter("dt", new Date());
-
-
-
- @SuppressWarnings("unchecked")
- List<Object[]> counts = q.getResultList();
-
-
- return counts;
-
-
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public List<Category> listByStoreAndParent(MerchantStore store, Category category) {
-
- StringBuilder queryBuilder = new StringBuilder();
- queryBuilder.append("select c from Category c join fetch c.merchantStore cm ");
-
- if (store == null) {
- if (category == null) {
- //query.from(qCategory)
- queryBuilder.append(" where c.parent IsNull ");
- //.where(qCategory.parent.isNull())
- //.orderBy(qCategory.sortOrder.asc(),qCategory.id.desc());
- } else {
- //query.from(qCategory)
- queryBuilder.append(" join fetch c.parent cp where cp.id =:cid ");
- //.where(qCategory.parent.eq(category))
- //.orderBy(qCategory.sortOrder.asc(),qCategory.id.desc());
- }
- } else {
- if (category == null) {
- //query.from(qCategory)
- queryBuilder.append(" where c.parent IsNull and cm.id=:mid ");
- //.where(qCategory.parent.isNull()
- // .and(qCategory.merchantStore.eq(store)))
- //.orderBy(qCategory.sortOrder.asc(),qCategory.id.desc());
- } else {
- //query.from(qCategory)
- queryBuilder.append(" join fetch c.parent cp where cp.id =:cId and cm.id=:mid ");
- //.where(qCategory.parent.eq(category)
- // .and(qCategory.merchantStore.eq(store)))
- //.orderBy(qCategory.sortOrder.asc(),qCategory.id.desc());
- }
- }
-
- queryBuilder.append(" order by c.sortOrder asc");
-
- String hql = queryBuilder.toString();
- Query q = this.em.createQuery(hql);
-
- q.setParameter("cid", category.getId());
- if (store != null) {
- q.setParameter("mid", store.getId());
- }
-
-
- return q.getResultList();
- }
-
-}
+package com.salesmanager.core.business.repositories.catalog.category;
+
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
+import com.salesmanager.core.model.catalog.category.Category;
+import com.salesmanager.core.model.merchant.MerchantStore;
+
+
+public class CategoryRepositoryImpl implements CategoryRepositoryCustom {
+
+ @PersistenceContext
+ private EntityManager em;
+
+ @Override
+ public List<Object[]> countProductsByCategories(MerchantStore store, List<Long> categoryIds) {
+
+
+ StringBuilder qs = new StringBuilder();
+ qs.append("select categories, count(product.id) from Product product ");
+ qs.append("inner join product.categories categories ");
+ qs.append("where categories.id in (:cid) ");
+ qs.append("and product.available=true and product.dateAvailable<=:dt ");
+ qs.append("group by categories.id");
+
+ String hql = qs.toString();
+ Query q = this.em.createQuery(hql);
+
+ q.setParameter("cid", categoryIds);
+ q.setParameter("dt", new Date());
+
+
+
+ @SuppressWarnings("unchecked")
+ List<Object[]> counts = q.getResultList();
+
+
+ return counts;
+
+
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public List<Category> listByStoreAndParent(MerchantStore store, Category category) {
+
+ StringBuilder queryBuilder = new StringBuilder();
+ queryBuilder.append("select c from Category c join fetch c.merchantStore cm ");
+
+ if (store == null) {
+ if (category == null) {
+ //query.from(qCategory)
+ queryBuilder.append(" where c.parent IsNull ");
+ //.where(qCategory.parent.isNull())
+ //.orderBy(qCategory.sortOrder.asc(),qCategory.id.desc());
+ } else {
+ //query.from(qCategory)
+ queryBuilder.append(" join fetch c.parent cp where cp.id =:cid ");
+ //.where(qCategory.parent.eq(category))
+ //.orderBy(qCategory.sortOrder.asc(),qCategory.id.desc());
+ }
+ } else {
+ if (category == null) {
+ //query.from(qCategory)
+ queryBuilder.append(" where c.parent IsNull and cm.id=:mid ");
+ //.where(qCategory.parent.isNull()
+ // .and(qCategory.merchantStore.eq(store)))
+ //.orderBy(qCategory.sortOrder.asc(),qCategory.id.desc());
+ } else {
+ //query.from(qCategory)
+ queryBuilder.append(" join fetch c.parent cp where cp.id =:cId and cm.id=:mid ");
+ //.where(qCategory.parent.eq(category)
+ // .and(qCategory.merchantStore.eq(store)))
+ //.orderBy(qCategory.sortOrder.asc(),qCategory.id.desc());
+ }
+ }
+
+ queryBuilder.append(" order by c.sortOrder asc");
+
+ String hql = queryBuilder.toString();
+ Query q = this.em.createQuery(hql);
+
+ q.setParameter("cid", category.getId());
+ if (store != null) {
+ q.setParameter("mid", store.getId());
+ }
+
+
+ return q.getResultList();
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/attribute/ProductAttributeRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/attribute/ProductAttributeRepository.java
index 556ce2f..df1ee37 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/attribute/ProductAttributeRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/attribute/ProductAttributeRepository.java
@@ -1,26 +1,26 @@
-package com.salesmanager.core.business.repositories.catalog.product.attribute;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
-
-public interface ProductAttributeRepository extends JpaRepository<ProductAttribute, Long> {
-
- @Query("select p from ProductAttribute p join fetch p.product pr left join fetch p.productOption po left join fetch p.productOptionValue pov left join fetch po.descriptions pod left join fetch pov.descriptions povd left join fetch po.merchantStore where p.id = ?1")
- ProductAttribute findOne(Long id);
-
- @Query("select p from ProductAttribute p join fetch p.product pr left join fetch p.productOption po left join fetch p.productOptionValue pov left join fetch po.descriptions pod left join fetch pov.descriptions povd left join fetch po.merchantStore pom where pom.id = ?1 and po.id = ?2")
- List<ProductAttribute> findByOptionId(Integer storeId, Long id);
-
- @Query("select p from ProductAttribute p join fetch p.product pr left join fetch p.productOption po left join fetch p.productOptionValue pov left join fetch po.descriptions pod left join fetch pov.descriptions povd left join fetch po.merchantStore pom where pom.id = ?1 and po.id = ?2")
- List<ProductAttribute> findByOptionValueId(Integer storeId, Long id);
-
- @Query("select p from ProductAttribute p join fetch p.product pr left join fetch p.productOption po left join fetch p.productOptionValue pov left join fetch po.descriptions pod left join fetch pov.descriptions povd left join fetch pov.merchantStore povm where povm.id = ?1 and pr.id = ?2 and p.id in ?3")
- List<ProductAttribute> findByAttributeIds(Integer storeId, Long productId, List<Long> ids);
-
- @Query("select p from ProductAttribute p join fetch p.product pr left join fetch p.productOption po left join fetch p.productOptionValue pov left join fetch po.descriptions pod left join fetch pov.descriptions povd left join fetch po.merchantStore pom where pom.id = ?1 and pr.id = ?2 and povd.language.id = ?3")
- List<ProductAttribute> findByProductId(Integer storeId, Long productId, Integer languageId);
-}
+package com.salesmanager.core.business.repositories.catalog.product.attribute;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
+
+public interface ProductAttributeRepository extends JpaRepository<ProductAttribute, Long> {
+
+ @Query("select p from ProductAttribute p join fetch p.product pr left join fetch p.productOption po left join fetch p.productOptionValue pov left join fetch po.descriptions pod left join fetch pov.descriptions povd left join fetch po.merchantStore where p.id = ?1")
+ ProductAttribute findOne(Long id);
+
+ @Query("select p from ProductAttribute p join fetch p.product pr left join fetch p.productOption po left join fetch p.productOptionValue pov left join fetch po.descriptions pod left join fetch pov.descriptions povd left join fetch po.merchantStore pom where pom.id = ?1 and po.id = ?2")
+ List<ProductAttribute> findByOptionId(Integer storeId, Long id);
+
+ @Query("select distinct p from ProductAttribute p join fetch p.product pr left join fetch p.productOption po left join fetch p.productOptionValue pov left join fetch po.descriptions pod left join fetch pov.descriptions povd left join fetch po.merchantStore pom where pom.id = ?1 and po.id = ?2")
+ List<ProductAttribute> findByOptionValueId(Integer storeId, Long id);
+
+ @Query("select distinct p from ProductAttribute p join fetch p.product pr left join fetch p.productOption po left join fetch p.productOptionValue pov left join fetch po.descriptions pod left join fetch pov.descriptions povd left join fetch pov.merchantStore povm where povm.id = ?1 and pr.id = ?2 and p.id in ?3")
+ List<ProductAttribute> findByAttributeIds(Integer storeId, Long productId, List<Long> ids);
+
+ @Query("select distinct p from ProductAttribute p join fetch p.product pr left join fetch p.productOption po left join fetch p.productOptionValue pov left join fetch po.descriptions pod left join fetch pov.descriptions povd left join fetch po.merchantStore pom where pom.id = ?1 and pr.id = ?2 and povd.language.id = ?3")
+ List<ProductAttribute> findByProductId(Integer storeId, Long productId, Integer languageId);
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/attribute/ProductOptionRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/attribute/ProductOptionRepository.java
index bd8030f..39e4d79 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/attribute/ProductOptionRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/attribute/ProductOptionRepository.java
@@ -1,31 +1,31 @@
-package com.salesmanager.core.business.repositories.catalog.product.attribute;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.catalog.product.attribute.ProductOption;
-
-public interface ProductOptionRepository extends JpaRepository<ProductOption, Long> {
-
- @Query("select p from ProductOption p join fetch p.merchantStore pm left join fetch p.descriptions pd where p.id = ?1")
- ProductOption findOne(Long id);
-
- @Query("select p from ProductOption p join fetch p.merchantStore pm left join fetch p.descriptions pd where p.id = ?2 and pm.id = ?1")
- ProductOption findOne(Integer storeId, Long id);
-
- @Query("select distinct p from ProductOption p join fetch p.merchantStore pm left join fetch p.descriptions pd where pm.id = ?1 and pd.language.id = ?2")
- List<ProductOption> findByStoreId(Integer storeId, Integer languageId);
-
- @Query("select p from ProductOption p join fetch p.merchantStore pm left join fetch p.descriptions pd where pm.id = ?1 and pd.name like %?2% and pd.language.id = ?3")
- public List<ProductOption> findByName(Integer storeId, String name, Integer languageId);
-
- @Query("select p from ProductOption p join fetch p.merchantStore pm left join fetch p.descriptions pd where pm.id = ?1 and p.code = ?2")
- public ProductOption findByCode(Integer storeId, String optionCode);
-
- @Query("select distinct p from ProductOption p join fetch p.merchantStore pm left join fetch p.descriptions pd where pm.id = ?1 and p.code = ?2 and p.readOnly = ?3")
- public List<ProductOption> findByReadOnly(Integer storeId, Integer languageId, boolean readOnly);
-
-
-}
+package com.salesmanager.core.business.repositories.catalog.product.attribute;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.catalog.product.attribute.ProductOption;
+
+public interface ProductOptionRepository extends JpaRepository<ProductOption, Long> {
+
+ @Query("select p from ProductOption p join fetch p.merchantStore pm left join fetch p.descriptions pd where p.id = ?1")
+ ProductOption findOne(Long id);
+
+ @Query("select p from ProductOption p join fetch p.merchantStore pm left join fetch p.descriptions pd where p.id = ?2 and pm.id = ?1")
+ ProductOption findOne(Integer storeId, Long id);
+
+ @Query("select distinct p from ProductOption p join fetch p.merchantStore pm left join fetch p.descriptions pd where pm.id = ?1 and pd.language.id = ?2")
+ List<ProductOption> findByStoreId(Integer storeId, Integer languageId);
+
+ @Query("select p from ProductOption p join fetch p.merchantStore pm left join fetch p.descriptions pd where pm.id = ?1 and pd.name like %?2% and pd.language.id = ?3")
+ public List<ProductOption> findByName(Integer storeId, String name, Integer languageId);
+
+ @Query("select p from ProductOption p join fetch p.merchantStore pm left join fetch p.descriptions pd where pm.id = ?1 and p.code = ?2")
+ public ProductOption findByCode(Integer storeId, String optionCode);
+
+ @Query("select distinct p from ProductOption p join fetch p.merchantStore pm left join fetch p.descriptions pd where pm.id = ?1 and p.code = ?2 and p.readOnly = ?3")
+ public List<ProductOption> findByReadOnly(Integer storeId, Integer languageId, boolean readOnly);
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/attribute/ProductOptionValueRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/attribute/ProductOptionValueRepository.java
index 986d75a..33810e3 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/attribute/ProductOptionValueRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/attribute/ProductOptionValueRepository.java
@@ -1,32 +1,32 @@
-package com.salesmanager.core.business.repositories.catalog.product.attribute;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValue;
-
-public interface ProductOptionValueRepository extends JpaRepository<ProductOptionValue, Long> {
-
- @Query("select p from ProductOptionValue p join fetch p.merchantStore pm left join fetch p.descriptions pd where p.id = ?1")
- ProductOptionValue findOne(Long id);
-
- @Query("select p from ProductOptionValue p join fetch p.merchantStore pm left join fetch p.descriptions pd where p.id = ?2 and pm.id = ?1")
- ProductOptionValue findOne(Integer storeId, Long id);
-
- @Query("select distinct p from ProductOptionValue p join fetch p.merchantStore pm left join fetch p.descriptions pd where pm.id = ?1 and pd.language.id = ?2")
- List<ProductOptionValue> findByStoreId(Integer storeId, Integer languageId);
-
- @Query("select p from ProductOptionValue p join fetch p.merchantStore pm left join fetch p.descriptions pd where pm.id = ?1 and p.code = ?2")
- public ProductOptionValue findByCode(Integer storeId, String optionValueCode);
-
- @Query("select p from ProductOptionValue p join fetch p.merchantStore pm left join fetch p.descriptions pd where pm.id = ?1 and pd.name like %?2% and pd.language.id = ?3")
- public List<ProductOptionValue> findByName(Integer storeId, String name, Integer languageId);
-
-
- @Query("select distinct p from ProductOptionValue p join fetch p.merchantStore pm left join fetch p.descriptions pd where pm.id = ?1 and pd.language.id = ?2 and p.productOptionDisplayOnly = ?3")
- public List<ProductOptionValue> findByReadOnly(Integer storeId, Integer languageId, boolean readOnly);
-
-
-}
+package com.salesmanager.core.business.repositories.catalog.product.attribute;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValue;
+
+public interface ProductOptionValueRepository extends JpaRepository<ProductOptionValue, Long> {
+
+ @Query("select p from ProductOptionValue p join fetch p.merchantStore pm left join fetch p.descriptions pd where p.id = ?1")
+ ProductOptionValue findOne(Long id);
+
+ @Query("select p from ProductOptionValue p join fetch p.merchantStore pm left join fetch p.descriptions pd where p.id = ?2 and pm.id = ?1")
+ ProductOptionValue findOne(Integer storeId, Long id);
+
+ @Query("select distinct p from ProductOptionValue p join fetch p.merchantStore pm left join fetch p.descriptions pd where pm.id = ?1 and pd.language.id = ?2")
+ List<ProductOptionValue> findByStoreId(Integer storeId, Integer languageId);
+
+ @Query("select p from ProductOptionValue p join fetch p.merchantStore pm left join fetch p.descriptions pd where pm.id = ?1 and p.code = ?2")
+ public ProductOptionValue findByCode(Integer storeId, String optionValueCode);
+
+ @Query("select p from ProductOptionValue p join fetch p.merchantStore pm left join fetch p.descriptions pd where pm.id = ?1 and pd.name like %?2% and pd.language.id = ?3")
+ public List<ProductOptionValue> findByName(Integer storeId, String name, Integer languageId);
+
+
+ @Query("select distinct p from ProductOptionValue p join fetch p.merchantStore pm left join fetch p.descriptions pd where pm.id = ?1 and pd.language.id = ?2 and p.productOptionDisplayOnly = ?3")
+ public List<ProductOptionValue> findByReadOnly(Integer storeId, Integer languageId, boolean readOnly);
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/availability/ProductAvailabilityRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/availability/ProductAvailabilityRepository.java
index 1cb1336..03b3d1b 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/availability/ProductAvailabilityRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/availability/ProductAvailabilityRepository.java
@@ -1,9 +1,9 @@
-package com.salesmanager.core.business.repositories.catalog.product.availability;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import com.salesmanager.core.model.catalog.product.availability.ProductAvailability;
-
-public interface ProductAvailabilityRepository extends JpaRepository<ProductAvailability, Long> {
-
-}
+package com.salesmanager.core.business.repositories.catalog.product.availability;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import com.salesmanager.core.model.catalog.product.availability.ProductAvailability;
+
+public interface ProductAvailabilityRepository extends JpaRepository<ProductAvailability, Long> {
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/file/DigitalProductRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/file/DigitalProductRepository.java
index c4012f0..ccfeb46 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/file/DigitalProductRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/file/DigitalProductRepository.java
@@ -1,17 +1,17 @@
-package com.salesmanager.core.business.repositories.catalog.product.file;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.catalog.product.file.DigitalProduct;
-
-public interface DigitalProductRepository extends JpaRepository<DigitalProduct, Long> {
-
- @Query("select p from DigitalProduct p inner join fetch p.product pp inner join fetch pp.merchantStore ppm where ppm.id =?1 and pp.id = ?2")
- DigitalProduct findByProduct(Integer storeId, Long productId);
-
- @Query("select p from DigitalProduct p inner join fetch p.product pp inner join fetch pp.merchantStore ppm where p.id = ?1")
- DigitalProduct findOne(Long id);
-
-
-}
+package com.salesmanager.core.business.repositories.catalog.product.file;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.catalog.product.file.DigitalProduct;
+
+public interface DigitalProductRepository extends JpaRepository<DigitalProduct, Long> {
+
+ @Query("select p from DigitalProduct p inner join fetch p.product pp inner join fetch pp.merchantStore ppm where ppm.id =?1 and pp.id = ?2")
+ DigitalProduct findByProduct(Integer storeId, Long productId);
+
+ @Query("select p from DigitalProduct p inner join fetch p.product pp inner join fetch pp.merchantStore ppm where p.id = ?1")
+ DigitalProduct findOne(Long id);
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/image/ProductImageRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/image/ProductImageRepository.java
index f335f52..19eeb3d 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/image/ProductImageRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/image/ProductImageRepository.java
@@ -1,15 +1,15 @@
-package com.salesmanager.core.business.repositories.catalog.product.image;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.catalog.product.image.ProductImage;
-
-public interface ProductImageRepository extends JpaRepository<ProductImage, Long> {
-
-
- @Query("select p from ProductImage p left join fetch p.descriptions pd inner join fetch p.product pp inner join fetch pp.merchantStore ppm where p.id = ?1")
- ProductImage findOne(Long id);
-
-
-}
+package com.salesmanager.core.business.repositories.catalog.product.image;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.catalog.product.image.ProductImage;
+
+public interface ProductImageRepository extends JpaRepository<ProductImage, Long> {
+
+
+ @Query("select p from ProductImage p left join fetch p.descriptions pd inner join fetch p.product pp inner join fetch pp.merchantStore ppm where p.id = ?1")
+ ProductImage findOne(Long id);
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/manufacturer/ManufacturerRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/manufacturer/ManufacturerRepository.java
index 163478e..c3d32d1 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/manufacturer/ManufacturerRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/manufacturer/ManufacturerRepository.java
@@ -1,29 +1,29 @@
-package com.salesmanager.core.business.repositories.catalog.product.manufacturer;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer;
-
-public interface ManufacturerRepository extends JpaRepository<Manufacturer, Long> {
-
- @Query("select count(distinct p) from Product as p where p.manufacturer.id=?1")
- Long countByProduct(Long manufacturerId);
-
- @Query("select m from Manufacturer m left join m.descriptions md join fetch m.merchantStore ms where ms.id=?1 and md.language.id=?2")
- List<Manufacturer> findByStoreAndLanguage(Integer storeId, Integer languageId);
-
- @Query("select m from Manufacturer m left join m.descriptions md join fetch m.merchantStore ms where m.id=?1")
- Manufacturer findOne(Long id);
-
- @Query("select m from Manufacturer m left join m.descriptions md join fetch m.merchantStore ms where ms.id=?1")
- List<Manufacturer> findByStore(Integer storeId);
-
- @Query("select distinct manufacturer from Product as p join p.manufacturer manufacturer join manufacturer.descriptions md join p.categories categs where categs.id in (?1) and md.language.id=?2")
- List<Manufacturer> findByCategoriesAndLanguage(List<Long> categoryIds, Integer languageId);
-
- @Query("select m from Manufacturer m left join m.descriptions md join fetch m.merchantStore ms where m.code=?1 and ms.id=?2")
- Manufacturer findByCodeAndMerchandStore(String code, Integer storeId);
-}
+package com.salesmanager.core.business.repositories.catalog.product.manufacturer;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer;
+
+public interface ManufacturerRepository extends JpaRepository<Manufacturer, Long> {
+
+ @Query("select count(distinct p) from Product as p where p.manufacturer.id=?1")
+ Long countByProduct(Long manufacturerId);
+
+ @Query("select m from Manufacturer m left join m.descriptions md join fetch m.merchantStore ms where ms.id=?1 and md.language.id=?2")
+ List<Manufacturer> findByStoreAndLanguage(Integer storeId, Integer languageId);
+
+ @Query("select m from Manufacturer m left join m.descriptions md join fetch m.merchantStore ms where m.id=?1")
+ Manufacturer findOne(Long id);
+
+ @Query("select m from Manufacturer m left join m.descriptions md join fetch m.merchantStore ms where ms.id=?1")
+ List<Manufacturer> findByStore(Integer storeId);
+
+ @Query("select distinct manufacturer from Product as p join p.manufacturer manufacturer join manufacturer.descriptions md join p.categories categs where categs.id in (?1) and md.language.id=?2")
+ List<Manufacturer> findByCategoriesAndLanguage(List<Long> categoryIds, Integer languageId);
+
+ @Query("select m from Manufacturer m left join m.descriptions md join fetch m.merchantStore ms where m.code=?1 and ms.id=?2")
+ Manufacturer findByCodeAndMerchandStore(String code, Integer storeId);
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/price/ProductPriceRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/price/ProductPriceRepository.java
index e3af034..f736aaa 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/price/ProductPriceRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/price/ProductPriceRepository.java
@@ -1,15 +1,15 @@
-package com.salesmanager.core.business.repositories.catalog.product.price;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.catalog.product.price.ProductPrice;
-
-public interface ProductPriceRepository extends JpaRepository<ProductPrice, Long> {
-
-
- @Query("select p from ProductPrice p left join fetch p.descriptions pd inner join fetch p.productAvailability pa inner join fetch pa.product pap inner join fetch pap.merchantStore papm where p.id = ?1")
- ProductPrice findOne(Long id);
-
-
-}
+package com.salesmanager.core.business.repositories.catalog.product.price;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.catalog.product.price.ProductPrice;
+
+public interface ProductPriceRepository extends JpaRepository<ProductPrice, Long> {
+
+
+ @Query("select p from ProductPrice p left join fetch p.descriptions pd inner join fetch p.productAvailability pa inner join fetch pa.product pap inner join fetch pap.merchantStore papm where p.id = ?1")
+ ProductPrice findOne(Long id);
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/ProductRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/ProductRepository.java
index 395d802..c8f2b36 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/ProductRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/ProductRepository.java
@@ -1,10 +1,10 @@
-package com.salesmanager.core.business.repositories.catalog.product;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import com.salesmanager.core.model.catalog.product.Product;
-
-
-public interface ProductRepository extends JpaRepository<Product, Long>, ProductRepositoryCustom {
-
-}
+package com.salesmanager.core.business.repositories.catalog.product;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import com.salesmanager.core.model.catalog.product.Product;
+
+
+public interface ProductRepository extends JpaRepository<Product, Long>, ProductRepositoryCustom {
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/ProductRepositoryCustom.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/ProductRepositoryCustom.java
index 1b1b8c5..44f66bb 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/ProductRepositoryCustom.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/ProductRepositoryCustom.java
@@ -1,44 +1,44 @@
-package com.salesmanager.core.business.repositories.catalog.product;
-
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.ProductCriteria;
-import com.salesmanager.core.model.catalog.product.ProductList;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.tax.taxclass.TaxClass;
-
-public interface ProductRepositoryCustom {
-
-
-
-
-
- ProductList listByStore(MerchantStore store, Language language,
- ProductCriteria criteria);
-
- Product getByFriendlyUrl(MerchantStore store,String seUrl, Locale locale);
-
- List<Product> getProductsListByCategories(@SuppressWarnings("rawtypes") Set categoryIds);
-
- List<Product> getProductsListByCategories(Set<Long> categoryIds,
- Language language);
-
- List<Product> listByTaxClass(TaxClass taxClass);
-
- List<Product> listByStore(MerchantStore store);
-
- Product getProductForLocale(long productId, Language language,
- Locale locale);
-
- Product getById(Long productId);
-
- Product getByCode(String productCode, Language language);
-
- List<Product> getProductsForLocale(MerchantStore store,
- Set<Long> categoryIds, Language language, Locale locale);
-
-}
+package com.salesmanager.core.business.repositories.catalog.product;
+
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.ProductCriteria;
+import com.salesmanager.core.model.catalog.product.ProductList;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.tax.taxclass.TaxClass;
+
+public interface ProductRepositoryCustom {
+
+
+
+
+
+ ProductList listByStore(MerchantStore store, Language language,
+ ProductCriteria criteria);
+
+ Product getByFriendlyUrl(MerchantStore store,String seUrl, Locale locale);
+
+ List<Product> getProductsListByCategories(@SuppressWarnings("rawtypes") Set categoryIds);
+
+ List<Product> getProductsListByCategories(Set<Long> categoryIds,
+ Language language);
+
+ List<Product> listByTaxClass(TaxClass taxClass);
+
+ List<Product> listByStore(MerchantStore store);
+
+ Product getProductForLocale(long productId, Language language,
+ Locale locale);
+
+ Product getById(Long productId);
+
+ Product getByCode(String productCode, Language language);
+
+ List<Product> getProductsForLocale(MerchantStore store,
+ Set<Long> categoryIds, Language language, Locale locale);
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/ProductRepositoryImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/ProductRepositoryImpl.java
index 84bbdcd..8df0e02 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/ProductRepositoryImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/ProductRepositoryImpl.java
@@ -1,903 +1,977 @@
-package com.salesmanager.core.business.repositories.catalog.product;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-
-import com.salesmanager.core.business.constants.Constants;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.ProductCriteria;
-import com.salesmanager.core.model.catalog.product.ProductList;
-import com.salesmanager.core.model.catalog.product.attribute.AttributeCriteria;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.tax.taxclass.TaxClass;
-
-
-public class ProductRepositoryImpl implements ProductRepositoryCustom {
-
-
- @PersistenceContext
- private EntityManager em;
-
- @Override
- public Product getById(Long productId) {
-
- try {
-
-
-
- StringBuilder qs = new StringBuilder();
- qs.append("select distinct p from Product as p ");
- qs.append("join fetch p.availabilities pa ");
- qs.append("join fetch p.merchantStore merch ");
- qs.append("join fetch p.descriptions pd ");
- qs.append("left join fetch p.categories categs ");
- qs.append("left join fetch pa.prices pap ");
- qs.append("left join fetch pap.descriptions papd ");
- qs.append("left join fetch categs.descriptions categsd ");
-
- //images
- qs.append("left join fetch p.images images ");
- //options
- qs.append("left join fetch p.attributes pattr ");
- qs.append("left join fetch pattr.productOption po ");
- qs.append("left join fetch po.descriptions pod ");
- qs.append("left join fetch pattr.productOptionValue pov ");
- qs.append("left join fetch pov.descriptions povd ");
- qs.append("left join fetch p.relationships pr ");
- //other lefts
- qs.append("left join fetch p.manufacturer manuf ");
- qs.append("left join fetch manuf.descriptions manufd ");
- qs.append("left join fetch p.type type ");
- qs.append("left join fetch p.taxClass tx ");
-
- qs.append("where p.id=:pid");
-
-
- String hql = qs.toString();
- Query q = this.em.createQuery(hql);
-
- q.setParameter("pid", productId);
-
-
- Product p = (Product)q.getSingleResult();
-
-
- return p;
-
- } catch(javax.persistence.NoResultException ers) {
- return null;
- }
-
- }
-
-
- @Override
- public Product getByCode(String productCode, Language language) {
-
- try {
-
-
-
- StringBuilder qs = new StringBuilder();
- qs.append("select distinct p from Product as p ");
- qs.append("join fetch p.availabilities pa ");
- qs.append("join fetch p.descriptions pd ");
- qs.append("join fetch p.merchantStore pm ");
- qs.append("left join fetch pa.prices pap ");
- qs.append("left join fetch pap.descriptions papd ");
-
-
-
-
- //images
- qs.append("left join fetch p.images images ");
- //options
- qs.append("left join fetch p.attributes pattr ");
- qs.append("left join fetch pattr.productOption po ");
- qs.append("left join fetch po.descriptions pod ");
- qs.append("left join fetch pattr.productOptionValue pov ");
- qs.append("left join fetch pov.descriptions povd ");
- qs.append("left join fetch p.relationships pr ");
- //other lefts
- qs.append("left join fetch p.manufacturer manuf ");
- qs.append("left join fetch manuf.descriptions manufd ");
- qs.append("left join fetch p.type type ");
- qs.append("left join fetch p.taxClass tx ");
-
- qs.append("where p.sku=:code ");
- qs.append("and pd.language.id=:lang and papd.language.id=:lang");
- //this cannot be done on child elements from left join
- //qs.append("and pod.languageId=:lang and povd.languageId=:lang");
-
- String hql = qs.toString();
- Query q = this.em.createQuery(hql);
-
- q.setParameter("code", productCode);
- q.setParameter("lang", language.getId());
-
- Product p = (Product)q.getSingleResult();
-
-
- return p;
-
- } catch(javax.persistence.NoResultException ers) {
- return null;
- }
-
- }
-
- public Product getByFriendlyUrl(MerchantStore store,String seUrl, Locale locale) {
-
-
- List regionList = new ArrayList();
- regionList.add("*");
- regionList.add(locale.getCountry());
-
-
- StringBuilder qs = new StringBuilder();
- qs.append("select distinct p from Product as p ");
- qs.append("join fetch p.availabilities pa ");
- qs.append("join fetch p.descriptions pd ");
- qs.append("join fetch p.merchantStore pm ");
- qs.append("left join fetch pa.prices pap ");
- qs.append("left join fetch pap.descriptions papd ");
-
-
- //images
- qs.append("left join fetch p.images images ");
- //options
- qs.append("left join fetch p.attributes pattr ");
- qs.append("left join fetch pattr.productOption po ");
- qs.append("left join fetch po.descriptions pod ");
- qs.append("left join fetch pattr.productOptionValue pov ");
- qs.append("left join fetch pov.descriptions povd ");
- qs.append("left join fetch p.relationships pr ");
- //other lefts
- qs.append("left join fetch p.manufacturer manuf ");
- qs.append("left join fetch manuf.descriptions manufd ");
- qs.append("left join fetch p.type type ");
- qs.append("left join fetch p.taxClass tx ");
-
- qs.append("where pa.region in (:lid) ");
- qs.append("and pd.seUrl=:seUrl ");
- qs.append("and p.available=true and p.dateAvailable<=:dt ");
- qs.append("order by pattr.productOptionSortOrder ");
-
-
- String hql = qs.toString();
- Query q = this.em.createQuery(hql);
-
-
- q.setParameter("lid", regionList);
- q.setParameter("dt", new Date());
- q.setParameter("seUrl", seUrl);
-
- Product p = null;
-
- try {
- p = (Product)q.getSingleResult();
- } catch(javax.persistence.NoResultException ignore) {
-
- }
-
-
-
-
- return p;
-
- }
-
- @Override
- public List<Product> getProductsForLocale(MerchantStore store, Set<Long> categoryIds, Language language, Locale locale) {
-
- ProductList products = this.getProductsListForLocale(store, categoryIds, language, locale, 0, -1);
-
- return products.getProducts();
- }
-
- @Override
- public Product getProductForLocale(long productId, Language language, Locale locale) {
-
-
-
- List regionList = new ArrayList();
- regionList.add("*");
- regionList.add(locale.getCountry());
-
-
- StringBuilder qs = new StringBuilder();
- qs.append("select distinct p from Product as p ");
- qs.append("join fetch p.availabilities pa ");
- qs.append("join fetch p.descriptions pd ");
- qs.append("join fetch p.merchantStore pm ");
- qs.append("left join fetch pa.prices pap ");
- qs.append("left join fetch pap.descriptions papd ");
-
-
-
-
- //images
- qs.append("left join fetch p.images images ");
- //options
- qs.append("left join fetch p.attributes pattr ");
- qs.append("left join fetch pattr.productOption po ");
- qs.append("left join fetch po.descriptions pod ");
- qs.append("left join fetch pattr.productOptionValue pov ");
- qs.append("left join fetch pov.descriptions povd ");
- qs.append("left join fetch p.relationships pr ");
- //other lefts
- qs.append("left join fetch p.manufacturer manuf ");
- qs.append("left join fetch manuf.descriptions manufd ");
- qs.append("left join fetch p.type type ");
- qs.append("left join fetch p.taxClass tx ");
-
- qs.append("where p.id=:pid and pa.region in (:lid) ");
- qs.append("and pd.language.id=:lang and papd.language.id=:lang ");
- qs.append("and p.available=true and p.dateAvailable<=:dt ");
- //this cannot be done on child elements from left join
- //qs.append("and pod.languageId=:lang and povd.languageId=:lang");
-
- String hql = qs.toString();
- Query q = this.em.createQuery(hql);
-
- q.setParameter("pid", productId);
- q.setParameter("lid", regionList);
- q.setParameter("dt", new Date());
- q.setParameter("lang", language.getId());
-
- Product p = (Product)q.getSingleResult();
-
-
- return p;
-
- }
-
- @SuppressWarnings("rawtypes")
- @Override
- public List<Product> getProductsListByCategories(Set categoryIds) {
-
-
- //List regionList = new ArrayList();
- //regionList.add("*");
- //regionList.add(locale.getCountry());
-
-
- //TODO Test performance
- /**
- * Testing in debug mode takes a long time with this query
- * running in normal mode is fine
- */
-
-
- StringBuilder qs = new StringBuilder();
- qs.append("select distinct p from Product as p ");
- qs.append("join fetch p.merchantStore merch ");
- qs.append("join fetch p.availabilities pa ");
- qs.append("left join fetch pa.prices pap ");
-
- qs.append("join fetch p.descriptions pd ");
- qs.append("join fetch p.categories categs ");
-
-
-
- qs.append("left join fetch pap.descriptions papd ");
-
-
- //images
- qs.append("left join fetch p.images images ");
-
- //options (do not need attributes for listings)
- qs.append("left join fetch p.attributes pattr ");
- qs.append("left join fetch pattr.productOption po ");
- qs.append("left join fetch po.descriptions pod ");
- qs.append("left join fetch pattr.productOptionValue pov ");
- qs.append("left join fetch pov.descriptions povd ");
-
- //other lefts
- qs.append("left join fetch p.manufacturer manuf ");
- qs.append("left join fetch p.type type ");
- qs.append("left join fetch p.taxClass tx ");
-
- //qs.append("where pa.region in (:lid) ");
- qs.append("where categs.id in (:cid)");
-
-
-
- String hql = qs.toString();
- Query q = this.em.createQuery(hql);
-
- q.setParameter("cid", categoryIds);
-
-
-
- @SuppressWarnings("unchecked")
- List<Product> products = q.getResultList();
-
-
- return products;
-
-
- }
-
- @Override
- public List<Product> getProductsListByCategories(Set<Long> categoryIds, Language language) {
-
-
- //List regionList = new ArrayList();
- //regionList.add("*");
- //regionList.add(locale.getCountry());
-
-
- //TODO Test performance
- /**
- * Testing in debug mode takes a long time with this query
- * running in normal mode is fine
- */
-
-
- StringBuilder qs = new StringBuilder();
- qs.append("select distinct p from Product as p ");
- qs.append("join fetch p.merchantStore merch ");
- qs.append("join fetch p.availabilities pa ");
- qs.append("left join fetch pa.prices pap ");
-
- qs.append("join fetch p.descriptions pd ");
- qs.append("join fetch p.categories categs ");
-
-
-
- qs.append("left join fetch pap.descriptions papd ");
-
-
- //images
- qs.append("left join fetch p.images images ");
-
- //options (do not need attributes for listings)
- qs.append("left join fetch p.attributes pattr ");
- qs.append("left join fetch pattr.productOption po ");
- qs.append("left join fetch po.descriptions pod ");
- qs.append("left join fetch pattr.productOptionValue pov ");
- qs.append("left join fetch pov.descriptions povd ");
-
- //other lefts
- qs.append("left join fetch p.manufacturer manuf ");
- qs.append("left join fetch manuf.descriptions manufd ");
- qs.append("left join fetch p.type type ");
- qs.append("left join fetch p.taxClass tx ");
-
- //qs.append("where pa.region in (:lid) ");
- qs.append("where categs.id in (:cid) ");
- //qs.append("and pd.language.id=:lang and papd.language.id=:lang and manufd.language.id=:lang ");
- qs.append("and pd.language.id=:lang and papd.language.id=:lang ");
- qs.append("and p.available=true and p.dateAvailable<=:dt ");
-
-
-
- String hql = qs.toString();
- Query q = this.em.createQuery(hql);
-
- q.setParameter("cid", categoryIds);
- q.setParameter("lang", language.getId());
- q.setParameter("dt", new Date());
-
-
- @SuppressWarnings("unchecked")
- List<Product> products = q.getResultList();
-
-
- return products;
-
-
- }
-
- /**
- * This query is used for category listings. All collections are not fully loaded, only the required objects
- * so the listing page can display everything related to all products
- */
- @SuppressWarnings({ "rawtypes", "unchecked", "unused" })
- private ProductList getProductsListForLocale(MerchantStore store, Set categoryIds, Language language, Locale locale, int first, int max) {
-
-
- List regionList = new ArrayList();
- regionList.add(Constants.ALL_REGIONS);
- if(locale!=null) {
- regionList.add(locale.getCountry());
- }
-
- ProductList productList = new ProductList();
-
-
- Query countQ = this.em.createQuery(
- "select count(p) from Product as p INNER JOIN p.availabilities pa INNER JOIN p.categories categs where p.merchantStore.id=:mId and categs.id in (:cid) and pa.region in (:lid) and p.available=1 and p.dateAvailable<=:dt");
- //"select p from Product as p join fetch p.availabilities pa join fetch p.categories categs where categs.id in (:cid) and pa.region in (:lid) and p.available=1 and p.dateAvailable<=:dt");
-
- countQ.setParameter("cid", categoryIds);
- countQ.setParameter("lid", regionList);
- countQ.setParameter("dt", new Date());
- countQ.setParameter("mId", store.getId());
-
- //List<Product> ps = countQ.getResultList();
-
- Number count = (Number) countQ.getSingleResult ();
-
-
- productList.setTotalCount(count.intValue());
-
- if(count.intValue()==0)
- return productList;
-
-
-
-
- StringBuilder qs = new StringBuilder();
- qs.append("select p from Product as p ");
- qs.append("join fetch p.merchantStore merch ");
- qs.append("join fetch p.availabilities pa ");
- qs.append("left join fetch pa.prices pap ");
-
- qs.append("join fetch p.descriptions pd ");
- qs.append("join fetch p.categories categs ");
-
-
-
- //not necessary
- //qs.append("join fetch pap.descriptions papd ");
-
-
- //images
- qs.append("left join fetch p.images images ");
-
- //options (do not need attributes for listings)
- //qs.append("left join fetch p.attributes pattr ");
- //qs.append("left join fetch pattr.productOption po ");
- //qs.append("left join fetch po.descriptions pod ");
- //qs.append("left join fetch pattr.productOptionValue pov ");
- //qs.append("left join fetch pov.descriptions povd ");
-
- //other lefts
- qs.append("left join fetch p.manufacturer manuf ");
- qs.append("left join fetch manuf.descriptions manufd ");
- qs.append("left join fetch p.type type ");
- qs.append("left join fetch p.taxClass tx ");
-
- //qs.append("where pa.region in (:lid) ");
- qs.append("where p.merchantStore.id=mId and categs.id in (:cid) and pa.region in (:lid) ");
- //qs.append("and p.available=true and p.dateAvailable<=:dt and pd.language.id=:lang and manufd.language.id=:lang");
- qs.append("and p.available=true and p.dateAvailable<=:dt and pd.language.id=:lang");
- qs.append(" order by p.sortOrder asc");
-
-
- String hql = qs.toString();
- Query q = this.em.createQuery(hql);
-
- q.setParameter("cid", categoryIds);
- q.setParameter("lid", regionList);
- q.setParameter("dt", new Date());
- q.setParameter("lang", language.getId());
- q.setParameter("mId", store.getId());
-
-
- q.setFirstResult(first);
- if(max>0) {
- int maxCount = first + max;
-
- if(maxCount < count.intValue()) {
- q.setMaxResults(maxCount);
- } else {
- q.setMaxResults(count.intValue());
- }
- }
-
- List<Product> products = q.getResultList();
- productList.setProducts(products);
-
- return productList;
-
-
- }
-
- /**
- * Used for all purpose !
- * @param store
- * @param first
- * @param max
- * @return
- */
- @Override
- public ProductList listByStore(MerchantStore store, Language language, ProductCriteria criteria) {
-
- ProductList productList = new ProductList();
-
-
- StringBuilder countBuilderSelect = new StringBuilder();
- countBuilderSelect.append("select count(distinct p) from Product as p");
-
- StringBuilder countBuilderWhere = new StringBuilder();
- countBuilderWhere.append(" where p.merchantStore.id=:mId");
-
- if(!CollectionUtils.isEmpty(criteria.getProductIds())) {
- countBuilderWhere.append(" and p.id in (:pId)");
- }
-
- countBuilderSelect.append(" inner join p.descriptions pd");
- countBuilderWhere.append(" and pd.language.id=:lang");
-
- if(!StringUtils.isBlank(criteria.getProductName())) {
- countBuilderWhere.append(" and lower(pd.name) like:nm");
- }
-
-
- if(!CollectionUtils.isEmpty(criteria.getCategoryIds())) {
- countBuilderSelect.append(" INNER JOIN p.categories categs");
- countBuilderWhere.append(" and categs.id in (:cid)");
- }
-
- if(criteria.getManufacturerId()!=null) {
- countBuilderSelect.append(" INNER JOIN p.manufacturer manuf");
- countBuilderWhere.append(" and manuf.id = :manufid");
- }
-
- if(!StringUtils.isBlank(criteria.getCode())) {
-
- countBuilderWhere.append(" and lower(p.sku) like :sku");
- }
-
- if(!CollectionUtils.isEmpty(criteria.getAttributeCriteria())) {
-
- countBuilderSelect.append(" INNER JOIN p.attributes pattr");
- countBuilderSelect.append(" INNER JOIN pattr.productOption po");
- countBuilderSelect.append(" INNER JOIN pattr.productOptionValue pov ");
- countBuilderSelect.append(" INNER JOIN pov.descriptions povd ");
- int count = 0;
- for(AttributeCriteria attributeCriteria : criteria.getAttributeCriteria()) {
- if(count==0) {
- countBuilderWhere.append(" and po.code =:").append(attributeCriteria.getAttributeCode());
- countBuilderWhere.append(" and povd.description like :").append("val").append(count).append(attributeCriteria.getAttributeCode());
- }
- count++;
- }
- countBuilderWhere.append(" and povd.language.id=:lang");
-
- }
-
-
- if(criteria.getAvailable()!=null) {
- if(criteria.getAvailable().booleanValue()) {
- countBuilderWhere.append(" and p.available=true and p.dateAvailable<=:dt");
- } else {
- countBuilderWhere.append(" and p.available=false or p.dateAvailable>:dt");
- }
- }
-
- Query countQ = this.em.createQuery(
- countBuilderSelect.toString() + countBuilderWhere.toString());
-
- countQ.setParameter("mId", store.getId());
-
-
- if(!CollectionUtils.isEmpty(criteria.getCategoryIds())) {
- countQ.setParameter("cid", criteria.getCategoryIds());
- }
-
-
- if(criteria.getAvailable()!=null) {
- countQ.setParameter("dt", new Date());
- }
-
- if(!StringUtils.isBlank(criteria.getCode())) {
- countQ.setParameter("sku", new StringBuilder().append("%").append(criteria.getCode().toLowerCase()).append("%").toString());
- }
-
- if(criteria.getManufacturerId()!=null) {
- countQ.setParameter("manufid", criteria.getManufacturerId());
- }
-
- if(!CollectionUtils.isEmpty(criteria.getAttributeCriteria())) {
- int count = 0;
- for(AttributeCriteria attributeCriteria : criteria.getAttributeCriteria()) {
- countQ.setParameter(attributeCriteria.getAttributeCode(),attributeCriteria.getAttributeCode());
- countQ.setParameter("val" + count + attributeCriteria.getAttributeCode(),"%" + attributeCriteria.getAttributeValue() + "%");
- count ++;
- }
- }
-
- countQ.setParameter("lang", language.getId());
-
- if(!StringUtils.isBlank(criteria.getProductName())) {
- countQ.setParameter("nm", new StringBuilder().append("%").append(criteria.getProductName().toLowerCase()).append("%").toString());
- }
-
- if(!CollectionUtils.isEmpty(criteria.getProductIds())) {
- countQ.setParameter("pId", criteria.getProductIds());
- }
-
- Number count = (Number) countQ.getSingleResult ();
-
- productList.setTotalCount(count.intValue());
-
- if(count.intValue()==0)
- return productList;
-
-
- StringBuilder qs = new StringBuilder();
- qs.append("select distinct p from Product as p ");
- qs.append("join fetch p.merchantStore merch ");
- qs.append("join fetch p.availabilities pa ");
- qs.append("left join fetch pa.prices pap ");
-
- qs.append("join fetch p.descriptions pd ");
- qs.append("left join fetch p.categories categs ");
-
-
- //images
- qs.append("left join fetch p.images images ");
-
-
- //other lefts
- qs.append("left join fetch p.manufacturer manuf ");
- qs.append("left join fetch manuf.descriptions manufd ");
- qs.append("left join fetch p.type type ");
- qs.append("left join fetch p.taxClass tx ");
-
-
- //attributes
- if(!CollectionUtils.isEmpty(criteria.getAttributeCriteria())) {
- qs.append(" inner join p.attributes pattr");
- qs.append(" inner join pattr.productOption po");
- qs.append(" inner join po.descriptions pod");
- qs.append(" inner join pattr.productOptionValue pov ");
- qs.append(" inner join pov.descriptions povd");
- } else {
- qs.append(" left join fetch p.attributes pattr");
- qs.append(" left join fetch pattr.productOption po");
- qs.append(" left join fetch po.descriptions pod");
- qs.append(" left join fetch pattr.productOptionValue pov");
- qs.append(" left join fetch pov.descriptions povd");
- }
-
- qs.append(" left join fetch p.relationships pr");
-
-
- qs.append(" where merch.id=:mId");
- qs.append(" and pd.language.id=:lang");
-
- if(!CollectionUtils.isEmpty(criteria.getProductIds())) {
- qs.append(" and p.id in (:pId)");
- }
-
- if(!CollectionUtils.isEmpty(criteria.getCategoryIds())) {
- qs.append(" and categs.id in (:cid)");
- }
-
- if(criteria.getManufacturerId()!=null) {
- qs.append(" and manuf.id = :manufid");
- }
-
-
- if(criteria.getAvailable()!=null) {
- if(criteria.getAvailable().booleanValue()) {
- qs.append(" and p.available=true and p.dateAvailable<=:dt");
- } else {
- qs.append(" and p.available=false and p.dateAvailable>:dt");
- }
- }
-
- if(!StringUtils.isBlank(criteria.getProductName())) {
- qs.append(" and lower(pd.name) like :nm");
- }
-
- if(!StringUtils.isBlank(criteria.getCode())) {
- qs.append(" and lower(p.sku) like :sku");
- }
-
- if(!CollectionUtils.isEmpty(criteria.getAttributeCriteria())) {
- int cnt = 0;
- for(AttributeCriteria attributeCriteria : criteria.getAttributeCriteria()) {
- qs.append(" and po.code =:").append(attributeCriteria.getAttributeCode());
- qs.append(" and povd.description like :").append("val").append(cnt).append(attributeCriteria.getAttributeCode());
- cnt++;
- }
- qs.append(" and povd.language.id=:lang");
-
- }
- qs.append(" order by p.sortOrder asc");
-
-
- String hql = qs.toString();
- Query q = this.em.createQuery(hql);
-
-
- q.setParameter("lang", language.getId());
- q.setParameter("mId", store.getId());
-
- if(!CollectionUtils.isEmpty(criteria.getCategoryIds())) {
- q.setParameter("cid", criteria.getCategoryIds());
- }
-
- if(!CollectionUtils.isEmpty(criteria.getProductIds())) {
- q.setParameter("pId", criteria.getProductIds());
- }
-
- if(criteria.getAvailable()!=null) {
- q.setParameter("dt", new Date());
- }
-
- if(criteria.getManufacturerId()!=null) {
- q.setParameter("manufid", criteria.getManufacturerId());
- }
-
- if(!StringUtils.isBlank(criteria.getCode())) {
- q.setParameter("sku", new StringBuilder().append("%").append(criteria.getCode().toLowerCase()).append("%").toString());
- }
-
- if(!CollectionUtils.isEmpty(criteria.getAttributeCriteria())) {
- int cnt = 0;
- for(AttributeCriteria attributeCriteria : criteria.getAttributeCriteria()) {
- q.setParameter(attributeCriteria.getAttributeCode(),attributeCriteria.getAttributeCode());
- q.setParameter("val" + cnt + attributeCriteria.getAttributeCode(),"%" + attributeCriteria.getAttributeValue() + "%");
- cnt++;
- }
- }
-
- if(!StringUtils.isBlank(criteria.getProductName())) {
- q.setParameter("nm", new StringBuilder().append("%").append(criteria.getProductName().toLowerCase()).append("%").toString());
- }
-
- if(criteria.getMaxCount()>0) {
-
-
- q.setFirstResult(criteria.getStartIndex());
- if(criteria.getMaxCount()<count.intValue()) {
- q.setMaxResults(criteria.getMaxCount());
- }
- else {
- q.setMaxResults(count.intValue());
- }
- }
-
- @SuppressWarnings("unchecked")
- List<Product> products = q.getResultList();
- productList.setProducts(products);
-
- return productList;
-
-
-
-
- }
-
- @Override
- public List<Product> listByStore(MerchantStore store) {
-
-
- /**
- * Testing in debug mode takes a long time with this query
- * running in normal mode is fine
- */
-
-
- StringBuilder qs = new StringBuilder();
- qs.append("select p from Product as p ");
- qs.append("join fetch p.merchantStore merch ");
- qs.append("join fetch p.availabilities pa ");
- qs.append("left join fetch pa.prices pap ");
-
- qs.append("join fetch p.descriptions pd ");
- qs.append("join fetch p.categories categs ");
-
-
-
- qs.append("left join fetch pap.descriptions papd ");
-
-
- //images
- qs.append("left join fetch p.images images ");
-
- //options (do not need attributes for listings)
- qs.append("left join fetch p.attributes pattr ");
- qs.append("left join fetch pattr.productOption po ");
- qs.append("left join fetch po.descriptions pod ");
- qs.append("left join fetch pattr.productOptionValue pov ");
- qs.append("left join fetch pov.descriptions povd ");
-
- //other lefts
- qs.append("left join fetch p.manufacturer manuf ");
- qs.append("left join fetch manuf.descriptions manufd ");
- qs.append("left join fetch p.type type ");
- qs.append("left join fetch p.taxClass tx ");
-
- //qs.append("where pa.region in (:lid) ");
- qs.append("where merch.id=:mid");
-
-
-
- String hql = qs.toString();
- Query q = this.em.createQuery(hql);
-
- q.setParameter("mid", store.getId());
-
-
-
- @SuppressWarnings("unchecked")
- List<Product> products = q.getResultList();
-
-
- return products;
-
-
- }
-
-
- @Override
- public List<Product> listByTaxClass(TaxClass taxClass) {
-
-
- /**
- * Testing in debug mode takes a long time with this query
- * running in normal mode is fine
- */
-
-
- StringBuilder qs = new StringBuilder();
- qs.append("select p from Product as p ");
- qs.append("join fetch p.merchantStore merch ");
- qs.append("join fetch p.availabilities pa ");
- qs.append("left join fetch pa.prices pap ");
-
- qs.append("join fetch p.descriptions pd ");
- qs.append("join fetch p.categories categs ");
-
-
-
- qs.append("left join fetch pap.descriptions papd ");
-
-
- //images
- qs.append("left join fetch p.images images ");
-
- //options (do not need attributes for listings)
- qs.append("left join fetch p.attributes pattr ");
- qs.append("left join fetch pattr.productOption po ");
- qs.append("left join fetch po.descriptions pod ");
- qs.append("left join fetch pattr.productOptionValue pov ");
- qs.append("left join fetch pov.descriptions povd ");
-
- //other lefts
- qs.append("left join fetch p.manufacturer manuf ");
- qs.append("left join fetch manuf.descriptions manufd ");
- qs.append("left join fetch p.type type ");
- qs.append("left join fetch p.taxClass tx ");
-
- //qs.append("where pa.region in (:lid) ");
- qs.append("where tx.id=:tid");
-
-
-
- String hql = qs.toString();
- Query q = this.em.createQuery(hql);
-
- q.setParameter("tid", taxClass.getId());
-
-
-
- @SuppressWarnings("unchecked")
- List<Product> products = q.getResultList();
-
-
- return products;
-
-
- }
-
-}
+package com.salesmanager.core.business.repositories.catalog.product;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+
+import javax.persistence.EntityManager;
+import javax.persistence.NonUniqueResultException;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import com.salesmanager.core.business.constants.Constants;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.ProductCriteria;
+import com.salesmanager.core.model.catalog.product.ProductList;
+import com.salesmanager.core.model.catalog.product.attribute.AttributeCriteria;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.tax.taxclass.TaxClass;
+
+
+public class ProductRepositoryImpl implements ProductRepositoryCustom {
+
+
+ @PersistenceContext
+ private EntityManager em;
+
+ @Override
+ public Product getById(Long productId) {
+
+ try {
+
+
+
+ StringBuilder qs = new StringBuilder();
+ qs.append("select distinct p from Product as p ");
+ qs.append("join fetch p.availabilities pa ");
+ qs.append("join fetch p.merchantStore merch ");
+ qs.append("join fetch p.descriptions pd ");
+
+ qs.append("left join fetch p.categories categs ");
+ qs.append("left join fetch categs.descriptions categsd ");
+
+ qs.append("left join fetch pa.prices pap ");
+ qs.append("left join fetch pap.descriptions papd ");
+
+
+ //images
+ qs.append("left join fetch p.images images ");
+ //options
+ qs.append("left join fetch p.attributes pattr ");
+ qs.append("left join fetch pattr.productOption po ");
+ qs.append("left join fetch po.descriptions pod ");
+ qs.append("left join fetch pattr.productOptionValue pov ");
+ qs.append("left join fetch pov.descriptions povd ");
+ qs.append("left join fetch p.relationships pr ");
+ //other lefts
+ qs.append("left join fetch p.manufacturer manuf ");
+ qs.append("left join fetch manuf.descriptions manufd ");
+ qs.append("left join fetch p.type type ");
+ qs.append("left join fetch p.taxClass tx ");
+
+ //RENTAL
+ qs.append("left join fetch p.owner owner ");
+
+ qs.append("where p.id=:pid");
+
+
+ String hql = qs.toString();
+ Query q = this.em.createQuery(hql);
+
+ q.setParameter("pid", productId);
+
+
+ Product p = (Product)q.getSingleResult();
+
+
+ return p;
+
+ } catch(javax.persistence.NoResultException ers) {
+ return null;
+ }
+
+ }
+
+
+ @Override
+ public Product getByCode(String productCode, Language language) {
+
+ try {
+
+
+
+ StringBuilder qs = new StringBuilder();
+ qs.append("select distinct p from Product as p ");
+ qs.append("join fetch p.availabilities pa ");
+ qs.append("join fetch p.descriptions pd ");
+ qs.append("join fetch p.merchantStore pm ");
+ qs.append("left join fetch pa.prices pap ");
+ qs.append("left join fetch pap.descriptions papd ");
+
+ qs.append("left join fetch p.categories categs ");
+ qs.append("left join fetch categs.descriptions categsd ");
+
+
+ //images
+ qs.append("left join fetch p.images images ");
+ //options
+ qs.append("left join fetch p.attributes pattr ");
+ qs.append("left join fetch pattr.productOption po ");
+ qs.append("left join fetch po.descriptions pod ");
+ qs.append("left join fetch pattr.productOptionValue pov ");
+ qs.append("left join fetch pov.descriptions povd ");
+ qs.append("left join fetch p.relationships pr ");
+ //other lefts
+ qs.append("left join fetch p.manufacturer manuf ");
+ qs.append("left join fetch manuf.descriptions manufd ");
+ qs.append("left join fetch p.type type ");
+ qs.append("left join fetch p.taxClass tx ");
+
+ //RENTAL
+ qs.append("left join fetch p.owner owner ");
+
+ qs.append("where p.sku=:code ");
+ qs.append("and pd.language.id=:lang and papd.language.id=:lang");
+ //this cannot be done on child elements from left join
+ //qs.append("and pod.languageId=:lang and povd.languageId=:lang");
+
+ String hql = qs.toString();
+ Query q = this.em.createQuery(hql);
+
+ q.setParameter("code", productCode);
+ q.setParameter("lang", language.getId());
+
+ Product p = (Product)q.getSingleResult();
+
+
+ return p;
+
+ } catch(javax.persistence.NoResultException ers) {
+ return null;
+ }
+
+ }
+
+ public Product getByFriendlyUrl(MerchantStore store,String seUrl, Locale locale) {
+
+
+ List regionList = new ArrayList();
+ regionList.add("*");
+ regionList.add(locale.getCountry());
+
+
+ StringBuilder qs = new StringBuilder();
+ qs.append("select distinct p from Product as p ");
+ qs.append("join fetch p.availabilities pa ");
+ qs.append("join fetch p.descriptions pd ");
+ qs.append("join fetch p.merchantStore pm ");
+ qs.append("left join fetch pa.prices pap ");
+ qs.append("left join fetch pap.descriptions papd ");
+
+ qs.append("left join fetch p.categories categs ");
+ qs.append("left join fetch categs.descriptions categsd ");
+
+
+ //images
+ qs.append("left join fetch p.images images ");
+ //options
+ qs.append("left join fetch p.attributes pattr ");
+ qs.append("left join fetch pattr.productOption po ");
+ qs.append("left join fetch po.descriptions pod ");
+ qs.append("left join fetch pattr.productOptionValue pov ");
+ qs.append("left join fetch pov.descriptions povd ");
+ qs.append("left join fetch p.relationships pr ");
+ //other lefts
+ qs.append("left join fetch p.manufacturer manuf ");
+ qs.append("left join fetch manuf.descriptions manufd ");
+ qs.append("left join fetch p.type type ");
+ qs.append("left join fetch p.taxClass tx ");
+
+ //RENTAL
+ qs.append("left join fetch p.owner owner ");
+
+ qs.append("where pa.region in (:lid) ");
+ qs.append("and pd.seUrl=:seUrl ");
+ qs.append("and p.available=true and p.dateAvailable<=:dt ");
+ qs.append("order by pattr.productOptionSortOrder ");
+
+
+ String hql = qs.toString();
+ Query q = this.em.createQuery(hql);
+
+
+ q.setParameter("lid", regionList);
+ q.setParameter("dt", new Date());
+ q.setParameter("seUrl", seUrl);
+
+ Product p = null;
+
+ try {
+ p = (Product)q.getSingleResult();
+ } catch(javax.persistence.NoResultException ignore) {
+
+ }
+
+
+
+
+ return p;
+
+ }
+
+ @Override
+ public List<Product> getProductsForLocale(MerchantStore store, Set<Long> categoryIds, Language language, Locale locale) {
+
+ ProductList products = this.getProductsListForLocale(store, categoryIds, language, locale, 0, -1);
+
+ return products.getProducts();
+ }
+
+ @Override
+ public Product getProductForLocale(long productId, Language language, Locale locale) {
+
+
+
+ List regionList = new ArrayList();
+ regionList.add("*");
+ regionList.add(locale.getCountry());
+
+
+ StringBuilder qs = new StringBuilder();
+ qs.append("select distinct p from Product as p ");
+ qs.append("join fetch p.availabilities pa ");
+ qs.append("join fetch p.descriptions pd ");
+ qs.append("join fetch p.merchantStore pm ");
+ qs.append("left join fetch pa.prices pap ");
+ qs.append("left join fetch pap.descriptions papd ");
+
+
+
+
+ //images
+ qs.append("left join fetch p.images images ");
+ //options
+ qs.append("left join fetch p.attributes pattr ");
+ qs.append("left join fetch pattr.productOption po ");
+ qs.append("left join fetch po.descriptions pod ");
+ qs.append("left join fetch pattr.productOptionValue pov ");
+ qs.append("left join fetch pov.descriptions povd ");
+ qs.append("left join fetch p.relationships pr ");
+ //other lefts
+ qs.append("left join fetch p.manufacturer manuf ");
+ qs.append("left join fetch manuf.descriptions manufd ");
+ qs.append("left join fetch p.type type ");
+ qs.append("left join fetch p.taxClass tx ");
+
+ //RENTAL
+ qs.append("left join fetch p.owner owner ");
+
+ qs.append("where p.id=:pid and pa.region in (:lid) ");
+ qs.append("and pd.language.id=:lang and papd.language.id=:lang ");
+ qs.append("and p.available=true and p.dateAvailable<=:dt ");
+ //this cannot be done on child elements from left join
+ //qs.append("and pod.languageId=:lang and povd.languageId=:lang");
+
+ String hql = qs.toString();
+ Query q = this.em.createQuery(hql);
+
+ q.setParameter("pid", productId);
+ q.setParameter("lid", regionList);
+ q.setParameter("dt", new Date());
+ q.setParameter("lang", language.getId());
+
+ @SuppressWarnings("unchecked")
+ List<Product> results = q.getResultList();
+ if (results.isEmpty()) return null;
+ else if (results.size() == 1) return (Product) results.get(0);
+ throw new NonUniqueResultException();
+
+
+ }
+
+ @SuppressWarnings("rawtypes")
+ @Override
+ public List<Product> getProductsListByCategories(Set categoryIds) {
+
+
+ //List regionList = new ArrayList();
+ //regionList.add("*");
+ //regionList.add(locale.getCountry());
+
+
+ //TODO Test performance
+ /**
+ * Testing in debug mode takes a long time with this query
+ * running in normal mode is fine
+ */
+
+
+ StringBuilder qs = new StringBuilder();
+ qs.append("select distinct p from Product as p ");
+ qs.append("join fetch p.merchantStore merch ");
+ qs.append("join fetch p.availabilities pa ");
+ qs.append("left join fetch pa.prices pap ");
+
+ qs.append("join fetch p.descriptions pd ");
+ qs.append("join fetch p.categories categs ");
+
+
+
+ qs.append("left join fetch pap.descriptions papd ");
+
+
+ //images
+ qs.append("left join fetch p.images images ");
+
+ //options (do not need attributes for listings)
+ qs.append("left join fetch p.attributes pattr ");
+ qs.append("left join fetch pattr.productOption po ");
+ qs.append("left join fetch po.descriptions pod ");
+ qs.append("left join fetch pattr.productOptionValue pov ");
+ qs.append("left join fetch pov.descriptions povd ");
+
+ //other lefts
+ qs.append("left join fetch p.manufacturer manuf ");
+ qs.append("left join fetch p.type type ");
+ qs.append("left join fetch p.taxClass tx ");
+
+ //RENTAL
+ qs.append("left join fetch p.owner owner ");
+
+ //qs.append("where pa.region in (:lid) ");
+ qs.append("where categs.id in (:cid)");
+
+
+
+ String hql = qs.toString();
+ Query q = this.em.createQuery(hql);
+
+ q.setParameter("cid", categoryIds);
+
+
+
+ @SuppressWarnings("unchecked")
+ List<Product> products = q.getResultList();
+
+
+ return products;
+
+
+ }
+
+ @Override
+ public List<Product> getProductsListByCategories(Set<Long> categoryIds, Language language) {
+
+
+ //List regionList = new ArrayList();
+ //regionList.add("*");
+ //regionList.add(locale.getCountry());
+
+
+ //TODO Test performance
+ /**
+ * Testing in debug mode takes a long time with this query
+ * running in normal mode is fine
+ */
+
+
+ StringBuilder qs = new StringBuilder();
+ qs.append("select distinct p from Product as p ");
+ qs.append("join fetch p.merchantStore merch ");
+ qs.append("join fetch p.availabilities pa ");
+ qs.append("left join fetch pa.prices pap ");
+
+ qs.append("join fetch p.descriptions pd ");
+ qs.append("join fetch p.categories categs ");
+
+
+
+ qs.append("left join fetch pap.descriptions papd ");
+
+
+ //images
+ qs.append("left join fetch p.images images ");
+
+ //options (do not need attributes for listings)
+ qs.append("left join fetch p.attributes pattr ");
+ qs.append("left join fetch pattr.productOption po ");
+ qs.append("left join fetch po.descriptions pod ");
+ qs.append("left join fetch pattr.productOptionValue pov ");
+ qs.append("left join fetch pov.descriptions povd ");
+
+ //other lefts
+ qs.append("left join fetch p.manufacturer manuf ");
+ qs.append("left join fetch manuf.descriptions manufd ");
+ qs.append("left join fetch p.type type ");
+ qs.append("left join fetch p.taxClass tx ");
+
+ //RENTAL
+ qs.append("left join fetch p.owner owner ");
+
+ //qs.append("where pa.region in (:lid) ");
+ qs.append("where categs.id in (:cid) ");
+ //qs.append("and pd.language.id=:lang and papd.language.id=:lang and manufd.language.id=:lang ");
+ qs.append("and pd.language.id=:lang and papd.language.id=:lang ");
+ qs.append("and p.available=true and p.dateAvailable<=:dt ");
+
+
+
+ String hql = qs.toString();
+ Query q = this.em.createQuery(hql);
+
+ q.setParameter("cid", categoryIds);
+ q.setParameter("lang", language.getId());
+ q.setParameter("dt", new Date());
+
+
+ @SuppressWarnings("unchecked")
+ List<Product> products = q.getResultList();
+
+
+ return products;
+
+
+ }
+
+ /**
+ * This query is used for category listings. All collections are not fully loaded, only the required objects
+ * so the listing page can display everything related to all products
+ */
+ @SuppressWarnings({ "rawtypes", "unchecked", "unused" })
+ private ProductList getProductsListForLocale(MerchantStore store, Set categoryIds, Language language, Locale locale, int first, int max) {
+
+
+ List regionList = new ArrayList();
+ regionList.add(Constants.ALL_REGIONS);
+ if(locale!=null) {
+ regionList.add(locale.getCountry());
+ }
+
+ ProductList productList = new ProductList();
+
+
+ Query countQ = this.em.createQuery(
+ "select count(p) from Product as p INNER JOIN p.availabilities pa INNER JOIN p.categories categs where p.merchantStore.id=:mId and categs.id in (:cid) and pa.region in (:lid) and p.available=1 and p.dateAvailable<=:dt");
+
+ countQ.setParameter("cid", categoryIds);
+ countQ.setParameter("lid", regionList);
+ countQ.setParameter("dt", new Date());
+ countQ.setParameter("mId", store.getId());
+
+ Number count = (Number) countQ.getSingleResult ();
+
+
+ productList.setTotalCount(count.intValue());
+
+ if(count.intValue()==0)
+ return productList;
+
+
+
+
+ StringBuilder qs = new StringBuilder();
+ qs.append("select p from Product as p ");
+ qs.append("join fetch p.merchantStore merch ");
+ qs.append("join fetch p.availabilities pa ");
+ qs.append("left join fetch pa.prices pap ");
+
+ qs.append("join fetch p.descriptions pd ");
+ qs.append("join fetch p.categories categs ");
+
+
+
+ //not necessary
+ //qs.append("join fetch pap.descriptions papd ");
+
+
+ //images
+ qs.append("left join fetch p.images images ");
+
+ //options (do not need attributes for listings)
+ //qs.append("left join fetch p.attributes pattr ");
+ //qs.append("left join fetch pattr.productOption po ");
+ //qs.append("left join fetch po.descriptions pod ");
+ //qs.append("left join fetch pattr.productOptionValue pov ");
+ //qs.append("left join fetch pov.descriptions povd ");
+
+ //other lefts
+ qs.append("left join fetch p.manufacturer manuf ");
+ qs.append("left join fetch manuf.descriptions manufd ");
+ qs.append("left join fetch p.type type ");
+ qs.append("left join fetch p.taxClass tx ");
+
+ //RENTAL
+ qs.append("left join fetch p.owner owner ");
+
+ //qs.append("where pa.region in (:lid) ");
+ qs.append("where p.merchantStore.id=mId and categs.id in (:cid) and pa.region in (:lid) ");
+ //qs.append("and p.available=true and p.dateAvailable<=:dt and pd.language.id=:lang and manufd.language.id=:lang");
+ qs.append("and p.available=true and p.dateAvailable<=:dt and pd.language.id=:lang");
+ qs.append(" order by p.sortOrder asc");
+
+
+ String hql = qs.toString();
+ Query q = this.em.createQuery(hql);
+
+ q.setParameter("cid", categoryIds);
+ q.setParameter("lid", regionList);
+ q.setParameter("dt", new Date());
+ q.setParameter("lang", language.getId());
+ q.setParameter("mId", store.getId());
+
+
+ q.setFirstResult(first);
+ if(max>0) {
+ int maxCount = first + max;
+
+ if(maxCount < count.intValue()) {
+ q.setMaxResults(maxCount);
+ } else {
+ q.setMaxResults(count.intValue());
+ }
+ }
+
+ List<Product> products = q.getResultList();
+ productList.setProducts(products);
+
+ return productList;
+
+
+ }
+
+ /**
+ * This query is used for filtering products based on criterias
+ * @param store
+ * @param first
+ * @param max
+ * @return
+ */
+ @Override
+ public ProductList listByStore(MerchantStore store, Language language, ProductCriteria criteria) {
+
+ ProductList productList = new ProductList();
+
+
+ StringBuilder countBuilderSelect = new StringBuilder();
+ countBuilderSelect.append("select count(distinct p) from Product as p");
+
+ StringBuilder countBuilderWhere = new StringBuilder();
+ countBuilderWhere.append(" where p.merchantStore.id=:mId");
+
+ if(!CollectionUtils.isEmpty(criteria.getProductIds())) {
+ countBuilderWhere.append(" and p.id in (:pId)");
+ }
+
+ countBuilderSelect.append(" inner join p.descriptions pd");
+ countBuilderWhere.append(" and pd.language.id=:lang");
+
+ if(!StringUtils.isBlank(criteria.getProductName())) {
+ countBuilderWhere.append(" and lower(pd.name) like:nm");
+ }
+
+
+ if(!CollectionUtils.isEmpty(criteria.getCategoryIds())) {
+ countBuilderSelect.append(" INNER JOIN p.categories categs");
+ countBuilderWhere.append(" and categs.id in (:cid)");
+ }
+
+ if(criteria.getManufacturerId()!=null) {
+ countBuilderSelect.append(" INNER JOIN p.manufacturer manuf");
+ countBuilderWhere.append(" and manuf.id = :manufid");
+ }
+
+ if(!StringUtils.isBlank(criteria.getCode())) {
+ countBuilderWhere.append(" and lower(p.sku) like :sku");
+ }
+
+ //RENTAL
+ if(!StringUtils.isBlank(criteria.getStatus())) {
+ countBuilderWhere.append(" and p.rentalStatus = :status");
+ }
+
+ if(criteria.getOwnerId()!=null) {
+ countBuilderSelect.append(" INNER JOIN p.owner owner");
+ countBuilderWhere.append(" and owner.id = :ownerid");
+ }
+
+ if(!CollectionUtils.isEmpty(criteria.getAttributeCriteria())) {
+
+ countBuilderSelect.append(" INNER JOIN p.attributes pattr");
+ countBuilderSelect.append(" INNER JOIN pattr.productOption po");
+ countBuilderSelect.append(" INNER JOIN pattr.productOptionValue pov ");
+ countBuilderSelect.append(" INNER JOIN pov.descriptions povd ");
+ int count = 0;
+ for(AttributeCriteria attributeCriteria : criteria.getAttributeCriteria()) {
+ if(count==0) {
+ countBuilderWhere.append(" and po.code =:").append(attributeCriteria.getAttributeCode());
+ countBuilderWhere.append(" and povd.description like :").append("val").append(count).append(attributeCriteria.getAttributeCode());
+ }
+ count++;
+ }
+ countBuilderWhere.append(" and povd.language.id=:lang");
+
+ }
+
+
+ if(criteria.getAvailable()!=null) {
+ if(criteria.getAvailable().booleanValue()) {
+ countBuilderWhere.append(" and p.available=true and p.dateAvailable<=:dt");
+ } else {
+ countBuilderWhere.append(" and p.available=false or p.dateAvailable>:dt");
+ }
+ }
+
+ Query countQ = this.em.createQuery(
+ countBuilderSelect.toString() + countBuilderWhere.toString());
+
+ countQ.setParameter("mId", store.getId());
+
+
+ if(!CollectionUtils.isEmpty(criteria.getCategoryIds())) {
+ countQ.setParameter("cid", criteria.getCategoryIds());
+ }
+
+
+ if(criteria.getAvailable()!=null) {
+ countQ.setParameter("dt", new Date());
+ }
+
+ if(!StringUtils.isBlank(criteria.getCode())) {
+ countQ.setParameter("sku", new StringBuilder().append("%").append(criteria.getCode().toLowerCase()).append("%").toString());
+ }
+
+ if(criteria.getManufacturerId()!=null) {
+ countQ.setParameter("manufid", criteria.getManufacturerId());
+ }
+
+ if(!CollectionUtils.isEmpty(criteria.getAttributeCriteria())) {
+ int count = 0;
+ for(AttributeCriteria attributeCriteria : criteria.getAttributeCriteria()) {
+ countQ.setParameter(attributeCriteria.getAttributeCode(),attributeCriteria.getAttributeCode());
+ countQ.setParameter("val" + count + attributeCriteria.getAttributeCode(),"%" + attributeCriteria.getAttributeValue() + "%");
+ count ++;
+ }
+ }
+
+ countQ.setParameter("lang", language.getId());
+
+ if(!StringUtils.isBlank(criteria.getProductName())) {
+ countQ.setParameter("nm", new StringBuilder().append("%").append(criteria.getProductName().toLowerCase()).append("%").toString());
+ }
+
+ if(!CollectionUtils.isEmpty(criteria.getProductIds())) {
+ countQ.setParameter("pId", criteria.getProductIds());
+ }
+
+ //RENTAL
+ if(!StringUtils.isBlank(criteria.getStatus())) {
+ countQ.setParameter("status", criteria.getStatus());
+ }
+
+ if(criteria.getOwnerId()!=null) {
+ countQ.setParameter("ownerid", criteria.getOwnerId());
+ }
+
+ Number count = (Number) countQ.getSingleResult ();
+
+ productList.setTotalCount(count.intValue());
+
+ if(count.intValue()==0)
+ return productList;
+
+
+ StringBuilder qs = new StringBuilder();
+ qs.append("select distinct p from Product as p ");
+ qs.append("join fetch p.merchantStore merch ");
+ qs.append("join fetch p.availabilities pa ");
+ qs.append("left join fetch pa.prices pap ");
+
+ qs.append("join fetch p.descriptions pd ");
+ qs.append("left join fetch p.categories categs ");
+ qs.append("left join fetch categs.descriptions cd ");
+
+
+ //images
+ qs.append("left join fetch p.images images ");
+
+
+ //other lefts
+ qs.append("left join fetch p.manufacturer manuf ");
+ qs.append("left join fetch manuf.descriptions manufd ");
+ qs.append("left join fetch p.type type ");
+ qs.append("left join fetch p.taxClass tx ");
+
+ //RENTAL
+ qs.append("left join fetch p.owner owner ");
+
+
+ //attributes
+ if(!CollectionUtils.isEmpty(criteria.getAttributeCriteria())) {
+ qs.append(" inner join p.attributes pattr");
+ qs.append(" inner join pattr.productOption po");
+ qs.append(" inner join po.descriptions pod");
+ qs.append(" inner join pattr.productOptionValue pov ");
+ qs.append(" inner join pov.descriptions povd");
+ } else {
+ qs.append(" left join fetch p.attributes pattr");
+ qs.append(" left join fetch pattr.productOption po");
+ qs.append(" left join fetch po.descriptions pod");
+ qs.append(" left join fetch pattr.productOptionValue pov");
+ qs.append(" left join fetch pov.descriptions povd");
+ }
+
+ qs.append(" left join fetch p.relationships pr");
+
+
+ qs.append(" where merch.id=:mId");
+ qs.append(" and pd.language.id=:lang");
+
+ if(!CollectionUtils.isEmpty(criteria.getProductIds())) {
+ qs.append(" and p.id in (:pId)");
+ }
+
+ if(!CollectionUtils.isEmpty(criteria.getCategoryIds())) {
+ qs.append(" and categs.id in (:cid)");
+ }
+
+ if(criteria.getManufacturerId()!=null) {
+ qs.append(" and manuf.id = :manufid");
+ }
+
+
+ if(criteria.getAvailable()!=null) {
+ if(criteria.getAvailable().booleanValue()) {
+ qs.append(" and p.available=true and p.dateAvailable<=:dt");
+ } else {
+ qs.append(" and p.available=false and p.dateAvailable>:dt");
+ }
+ }
+
+ if(!StringUtils.isBlank(criteria.getProductName())) {
+ qs.append(" and lower(pd.name) like :nm");
+ }
+
+ if(!StringUtils.isBlank(criteria.getCode())) {
+ qs.append(" and lower(p.sku) like :sku");
+ }
+
+ //RENTAL
+ if(!StringUtils.isBlank(criteria.getStatus())) {
+ qs.append(" and p.rentalStatus = :status");
+ }
+
+ if(criteria.getOwnerId()!=null) {
+ qs.append(" and owner.id = :ownerid");
+ }
+
+ if(!CollectionUtils.isEmpty(criteria.getAttributeCriteria())) {
+ int cnt = 0;
+ for(AttributeCriteria attributeCriteria : criteria.getAttributeCriteria()) {
+ qs.append(" and po.code =:").append(attributeCriteria.getAttributeCode());
+ qs.append(" and povd.description like :").append("val").append(cnt).append(attributeCriteria.getAttributeCode());
+ cnt++;
+ }
+ qs.append(" and povd.language.id=:lang");
+
+ }
+ qs.append(" order by p.sortOrder asc");
+
+
+ String hql = qs.toString();
+ Query q = this.em.createQuery(hql);
+
+
+ q.setParameter("lang", language.getId());
+ q.setParameter("mId", store.getId());
+
+ if(!CollectionUtils.isEmpty(criteria.getCategoryIds())) {
+ q.setParameter("cid", criteria.getCategoryIds());
+ }
+
+ if(!CollectionUtils.isEmpty(criteria.getProductIds())) {
+ q.setParameter("pId", criteria.getProductIds());
+ }
+
+ if(criteria.getAvailable()!=null) {
+ q.setParameter("dt", new Date());
+ }
+
+ if(criteria.getManufacturerId()!=null) {
+ q.setParameter("manufid", criteria.getManufacturerId());
+ }
+
+ if(!StringUtils.isBlank(criteria.getCode())) {
+ q.setParameter("sku", new StringBuilder().append("%").append(criteria.getCode().toLowerCase()).append("%").toString());
+ }
+
+ if(!CollectionUtils.isEmpty(criteria.getAttributeCriteria())) {
+ int cnt = 0;
+ for(AttributeCriteria attributeCriteria : criteria.getAttributeCriteria()) {
+ q.setParameter(attributeCriteria.getAttributeCode(),attributeCriteria.getAttributeCode());
+ q.setParameter("val" + cnt + attributeCriteria.getAttributeCode(),"%" + attributeCriteria.getAttributeValue() + "%");
+ cnt++;
+ }
+ }
+
+ //RENTAL
+ if(!StringUtils.isBlank(criteria.getStatus())) {
+ q.setParameter("status", criteria.getStatus());
+ }
+
+ if(criteria.getOwnerId()!=null) {
+ q.setParameter("ownerid", criteria.getOwnerId());
+ }
+
+ if(!StringUtils.isBlank(criteria.getProductName())) {
+ q.setParameter("nm", new StringBuilder().append("%").append(criteria.getProductName().toLowerCase()).append("%").toString());
+ }
+
+ if(criteria.getMaxCount()>0) {
+
+
+ q.setFirstResult(criteria.getStartIndex());
+ if(criteria.getMaxCount()<count.intValue()) {
+ q.setMaxResults(criteria.getMaxCount());
+ }
+ else {
+ q.setMaxResults(count.intValue());
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ List<Product> products = q.getResultList();
+ productList.setProducts(products);
+
+ return productList;
+
+
+
+
+ }
+
+ @Override
+ public List<Product> listByStore(MerchantStore store) {
+
+
+ /**
+ * Testing in debug mode takes a long time with this query
+ * running in normal mode is fine
+ */
+
+
+ StringBuilder qs = new StringBuilder();
+ qs.append("select p from Product as p ");
+ qs.append("join fetch p.merchantStore merch ");
+ qs.append("join fetch p.availabilities pa ");
+ qs.append("left join fetch pa.prices pap ");
+
+ qs.append("join fetch p.descriptions pd ");
+ qs.append("left join fetch p.categories categs ");
+
+
+
+ qs.append("left join fetch pap.descriptions papd ");
+
+
+ //images
+ qs.append("left join fetch p.images images ");
+
+ //options (do not need attributes for listings)
+ qs.append("left join fetch p.attributes pattr ");
+ qs.append("left join fetch pattr.productOption po ");
+ qs.append("left join fetch po.descriptions pod ");
+ qs.append("left join fetch pattr.productOptionValue pov ");
+ qs.append("left join fetch pov.descriptions povd ");
+
+ //other lefts
+ qs.append("left join fetch p.manufacturer manuf ");
+ qs.append("left join fetch manuf.descriptions manufd ");
+ qs.append("left join fetch p.type type ");
+ qs.append("left join fetch p.taxClass tx ");
+
+ //RENTAL
+ qs.append("left join fetch p.owner owner ");
+
+ //qs.append("where pa.region in (:lid) ");
+ qs.append("where merch.id=:mid");
+
+
+
+ String hql = qs.toString();
+ Query q = this.em.createQuery(hql);
+
+ q.setParameter("mid", store.getId());
+
+
+
+ @SuppressWarnings("unchecked")
+ List<Product> products = q.getResultList();
+
+
+ return products;
+
+
+ }
+
+
+ @Override
+ public List<Product> listByTaxClass(TaxClass taxClass) {
+
+
+ /**
+ * Testing in debug mode takes a long time with this query
+ * running in normal mode is fine
+ */
+
+
+ StringBuilder qs = new StringBuilder();
+ qs.append("select p from Product as p ");
+ qs.append("join fetch p.merchantStore merch ");
+ qs.append("join fetch p.availabilities pa ");
+ qs.append("left join fetch pa.prices pap ");
+
+ qs.append("join fetch p.descriptions pd ");
+ qs.append("join fetch p.categories categs ");
+
+
+
+ qs.append("left join fetch pap.descriptions papd ");
+
+
+ //images
+ qs.append("left join fetch p.images images ");
+
+ //options (do not need attributes for listings)
+ qs.append("left join fetch p.attributes pattr ");
+ qs.append("left join fetch pattr.productOption po ");
+ qs.append("left join fetch po.descriptions pod ");
+ qs.append("left join fetch pattr.productOptionValue pov ");
+ qs.append("left join fetch pov.descriptions povd ");
+
+ //other lefts
+ qs.append("left join fetch p.manufacturer manuf ");
+ qs.append("left join fetch manuf.descriptions manufd ");
+ qs.append("left join fetch p.type type ");
+ qs.append("left join fetch p.taxClass tx ");
+
+ //RENTAL
+ qs.append("left join fetch p.owner owner ");
+
+ //qs.append("where pa.region in (:lid) ");
+ qs.append("where tx.id=:tid");
+
+
+
+ String hql = qs.toString();
+ Query q = this.em.createQuery(hql);
+
+ q.setParameter("tid", taxClass.getId());
+
+
+
+ @SuppressWarnings("unchecked")
+ List<Product> products = q.getResultList();
+
+
+ return products;
+
+
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/relationship/ProductRelationshipRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/relationship/ProductRelationshipRepository.java
index 269f8bc..ce28f74 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/relationship/ProductRelationshipRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/relationship/ProductRelationshipRepository.java
@@ -1,10 +1,10 @@
-package com.salesmanager.core.business.repositories.catalog.product.relationship;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import com.salesmanager.core.model.catalog.product.relationship.ProductRelationship;
-
-
-public interface ProductRelationshipRepository extends JpaRepository<ProductRelationship, Long>, ProductRelationshipRepositoryCustom {
-
-}
+package com.salesmanager.core.business.repositories.catalog.product.relationship;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import com.salesmanager.core.model.catalog.product.relationship.ProductRelationship;
+
+
+public interface ProductRelationshipRepository extends JpaRepository<ProductRelationship, Long>, ProductRelationshipRepositoryCustom {
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/relationship/ProductRelationshipRepositoryCustom.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/relationship/ProductRelationshipRepositoryCustom.java
index 2bd6ab5..80e2c04 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/relationship/ProductRelationshipRepositoryCustom.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/relationship/ProductRelationshipRepositoryCustom.java
@@ -1,31 +1,31 @@
-package com.salesmanager.core.business.repositories.catalog.product.relationship;
-
-import java.util.List;
-
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.relationship.ProductRelationship;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-
-
-public interface ProductRelationshipRepositoryCustom {
-
- List<ProductRelationship> getByType(MerchantStore store, String type,
- Language language);
-
- List<ProductRelationship> getByType(MerchantStore store, String type,
- Product product, Language language);
-
- List<ProductRelationship> getByGroup(MerchantStore store, String group);
-
- List<ProductRelationship> getGroups(MerchantStore store);
-
- List<ProductRelationship> getByType(MerchantStore store, String type);
-
- List<ProductRelationship> listByProducts(Product product);
-
- List<ProductRelationship> getByType(MerchantStore store, String type,
- Product product);
-
-
-}
+package com.salesmanager.core.business.repositories.catalog.product.relationship;
+
+import java.util.List;
+
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.relationship.ProductRelationship;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+
+
+public interface ProductRelationshipRepositoryCustom {
+
+ List<ProductRelationship> getByType(MerchantStore store, String type,
+ Language language);
+
+ List<ProductRelationship> getByType(MerchantStore store, String type,
+ Product product, Language language);
+
+ List<ProductRelationship> getByGroup(MerchantStore store, String group);
+
+ List<ProductRelationship> getGroups(MerchantStore store);
+
+ List<ProductRelationship> getByType(MerchantStore store, String type);
+
+ List<ProductRelationship> listByProducts(Product product);
+
+ List<ProductRelationship> getByType(MerchantStore store, String type,
+ Product product);
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/relationship/ProductRelationshipRepositoryImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/relationship/ProductRelationshipRepositoryImpl.java
index 1a943ff..331e30d 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/relationship/ProductRelationshipRepositoryImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/relationship/ProductRelationshipRepositoryImpl.java
@@ -1,299 +1,305 @@
-package com.salesmanager.core.business.repositories.catalog.product.relationship;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.relationship.ProductRelationship;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-
-
-public class ProductRelationshipRepositoryImpl implements ProductRelationshipRepositoryCustom {
-
-
- @PersistenceContext
- private EntityManager em;
-
- @Override
- public List<ProductRelationship> getByType(MerchantStore store, String type, Product product, Language language) {
-
- StringBuilder qs = new StringBuilder();
- qs.append("select distinct pr from ProductRelationship as pr ");
- qs.append("left join fetch pr.product p ");
- qs.append("join fetch pr.relatedProduct rp ");
- qs.append("left join fetch rp.descriptions rpd ");
-
- qs.append("where pr.code=:code ");
- qs.append("and pr.store.id=:storeId ");
- qs.append("and p.id=:id ");
- qs.append("and rpd.language.id=:langId");
-
-
-
- String hql = qs.toString();
- Query q = em.createQuery(hql);
-
- q.setParameter("code", type);
- q.setParameter("id", product.getId());
- q.setParameter("storeId", store.getId());
- qs.append("and pr.store.id=:storeId ");
- q.setParameter("langId", language.getId());
-
-
-
- @SuppressWarnings("unchecked")
- List<ProductRelationship> relations = q.getResultList();
-
-
- return relations;
-
-
- }
-
- @Override
- public List<ProductRelationship> getByType(MerchantStore store, String type, Language language) {
-
- StringBuilder qs = new StringBuilder();
- qs.append("select distinct pr from ProductRelationship as pr ");
- qs.append("left join fetch pr.product p ");
- qs.append("join fetch pr.relatedProduct rp ");
-
- qs.append("left join fetch rp.attributes pattr ");
- qs.append("left join fetch rp.categories rpc ");
- qs.append("left join fetch rp.descriptions rpd ");
- qs.append("left join fetch rp.images pd ");
- qs.append("left join fetch rp.merchantStore rpm ");
- qs.append("left join fetch rpm.currency rpmc ");
- qs.append("left join fetch rp.availabilities pa ");
- qs.append("left join fetch rp.manufacturer m ");
- qs.append("left join fetch m.descriptions md ");
- qs.append("left join fetch pa.prices pap ");
- qs.append("left join fetch pap.descriptions papd ");
-
- qs.append("where pr.code=:code ");
- qs.append("and rp.available=:available ");
- qs.append("and pr.store.id=:storeId ");
- qs.append("and rpd.language.id=:langId");
-
-
-
- String hql = qs.toString();
- Query q = em.createQuery(hql);
-
- q.setParameter("code", type);
- q.setParameter("langId", language.getId());
- q.setParameter("storeId", store.getId());
- q.setParameter("available", true);
-
-
-
- @SuppressWarnings("unchecked")
- List<ProductRelationship> relations = q.getResultList();
-
-
- return relations;
-
-
- }
-
- @Override
- public List<ProductRelationship> getByGroup(MerchantStore store, String group) {
-
- StringBuilder qs = new StringBuilder();
- qs.append("select distinct pr from ProductRelationship as pr ");
- qs.append("left join fetch pr.product p ");
- qs.append("left join fetch pr.relatedProduct rp ");
-
- qs.append("left join fetch rp.attributes pattr ");
- qs.append("left join fetch rp.categories rpc ");
- qs.append("left join fetch rp.descriptions rpd ");
- qs.append("left join fetch rp.images pd ");
- qs.append("left join fetch rp.merchantStore rpm ");
- qs.append("left join fetch rpm.currency rpmc ");
- qs.append("left join fetch rp.availabilities pa ");
- qs.append("left join fetch pa.prices pap ");
- qs.append("left join fetch pap.descriptions papd ");
- qs.append("left join fetch rp.manufacturer manuf ");
- qs.append("left join fetch manuf.descriptions manufd ");
- qs.append("left join fetch rp.type type ");
-
- qs.append("where pr.code=:code ");
- qs.append("and pr.store.id=:storeId ");
-
-
-
-
- String hql = qs.toString();
- Query q = em.createQuery(hql);
-
- q.setParameter("code", group);
- q.setParameter("storeId", store.getId());
-
-
-
-
- @SuppressWarnings("unchecked")
- List<ProductRelationship> relations = q.getResultList();
-
-
- return relations;
-
-
- }
-
- @Override
- public List<ProductRelationship> getGroups(MerchantStore store) {
-
- StringBuilder qs = new StringBuilder();
- qs.append("select distinct pr from ProductRelationship as pr ");
- qs.append("where pr.store.id=:store ");
-
- qs.append("and pr.product=null");
-
-
-
- String hql = qs.toString();
- Query q = em.createQuery(hql);
-
- q.setParameter("store", store.getId());
-
-
-
- @SuppressWarnings("unchecked")
- List<ProductRelationship> relations = q.getResultList();
-
- Map<String,ProductRelationship> relationMap = new HashMap<String,ProductRelationship>();
- for(ProductRelationship relationship : relations) {
- if(!relationMap.containsKey(relationship.getCode())) {
- relationMap.put(relationship.getCode(), relationship);
- }
- }
-
- List<ProductRelationship> returnList = new ArrayList<ProductRelationship>(relationMap.values());
-
-
- return returnList;
-
-
- }
-
-
- @Override
- public List<ProductRelationship> getByType(MerchantStore store, String type) {
-
- StringBuilder qs = new StringBuilder();
- qs.append("select distinct pr from ProductRelationship as pr ");
- qs.append("left join fetch pr.product p ");
- qs.append("join fetch pr.relatedProduct rp ");
- qs.append("left join fetch rp.descriptions rpd ");
-
- qs.append("where pr.code=:code ");
- qs.append("and pr.store.id=:storeId ");
-
-
-
-
- String hql = qs.toString();
- Query q = em.createQuery(hql);
-
- q.setParameter("code", type);
- q.setParameter("storeId", store.getId());
-
-
- @SuppressWarnings("unchecked")
- List<ProductRelationship> relations = q.getResultList();
-
-
- return relations;
-
-
- }
-
- @Override
- public List<ProductRelationship> listByProducts(Product product) {
-
- StringBuilder qs = new StringBuilder();
- qs.append("select pr from ProductRelationship as pr ");
- qs.append("left join fetch pr.product p ");
- qs.append("left join fetch pr.relatedProduct rp ");
- qs.append("left join fetch rp.attributes pattr ");
- qs.append("left join fetch rp.categories rpc ");
- qs.append("left join fetch p.descriptions pd ");
- qs.append("left join fetch rp.descriptions rpd ");
-
- qs.append("where p.id=:id");
- qs.append(" or rp.id=:id");
-
-
-
-
- String hql = qs.toString();
- Query q = em.createQuery(hql);
-
- q.setParameter("id", product.getId());
-
-
- @SuppressWarnings("unchecked")
- List<ProductRelationship> relations = q.getResultList();
-
-
- return relations;
-
-
- }
-
- @Override
- public List<ProductRelationship> getByType(MerchantStore store, String type, Product product) {
-
- StringBuilder qs = new StringBuilder();
-
- qs.append("select distinct pr from ProductRelationship as pr ");
- qs.append("left join fetch pr.product p ");
- qs.append("left join fetch pr.relatedProduct rp ");
-
- qs.append("left join fetch rp.attributes pattr ");
- qs.append("left join fetch rp.categories rpc ");
- qs.append("left join fetch rp.descriptions rpd ");
- qs.append("left join fetch rp.images pd ");
- qs.append("left join fetch rp.merchantStore rpm ");
- qs.append("left join fetch rpm.currency rpmc ");
- qs.append("left join fetch rp.availabilities pa ");
- qs.append("left join fetch pa.prices pap ");
- qs.append("left join fetch pap.descriptions papd ");
-
- qs.append("left join fetch rp.manufacturer manuf ");
- qs.append("left join fetch manuf.descriptions manufd ");
- qs.append("left join fetch rp.type type ");
-
- qs.append("where pr.code=:code ");
- qs.append("and rp.available=:available ");
- qs.append("and p.id=:pId");
-
-
-
-
- String hql = qs.toString();
- Query q = em.createQuery(hql);
-
- q.setParameter("code", type);
- q.setParameter("available", true);
- q.setParameter("pId", product.getId());
-
-
- @SuppressWarnings("unchecked")
- List<ProductRelationship> relations = q.getResultList();
-
-
- return relations;
-
-
- }
-
-}
+package com.salesmanager.core.business.repositories.catalog.product.relationship;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.relationship.ProductRelationship;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+
+
+public class ProductRelationshipRepositoryImpl implements ProductRelationshipRepositoryCustom {
+
+
+ @PersistenceContext
+ private EntityManager em;
+
+ @Override
+ public List<ProductRelationship> getByType(MerchantStore store, String type, Product product, Language language) {
+
+ StringBuilder qs = new StringBuilder();
+ qs.append("select distinct pr from ProductRelationship as pr ");
+ qs.append("left join fetch pr.product p ");
+ qs.append("join fetch pr.relatedProduct rp ");
+ qs.append("left join fetch rp.descriptions rpd ");
+
+ qs.append("where pr.code=:code ");
+ qs.append("and pr.store.id=:storeId ");
+ qs.append("and p.id=:id ");
+ qs.append("and rpd.language.id=:langId");
+
+
+
+ String hql = qs.toString();
+ Query q = em.createQuery(hql);
+
+ q.setParameter("code", type);
+ q.setParameter("id", product.getId());
+ q.setParameter("storeId", store.getId());
+ qs.append("and pr.store.id=:storeId ");
+ q.setParameter("langId", language.getId());
+
+
+
+ @SuppressWarnings("unchecked")
+ List<ProductRelationship> relations = q.getResultList();
+
+
+ return relations;
+
+
+ }
+
+ @Override
+ public List<ProductRelationship> getByType(MerchantStore store, String type, Language language) {
+
+ StringBuilder qs = new StringBuilder();
+ qs.append("select distinct pr from ProductRelationship as pr ");
+ qs.append("left join fetch pr.product p ");
+ qs.append("join fetch pr.relatedProduct rp ");
+
+ qs.append("left join fetch rp.attributes pattr ");
+ qs.append("left join fetch rp.categories rpc ");
+ qs.append("left join fetch rpc.descriptions rpcd ");
+ qs.append("left join fetch rp.descriptions rpd ");
+ qs.append("left join fetch rp.owner rpo ");
+ qs.append("left join fetch rp.images pd ");
+ qs.append("left join fetch rp.merchantStore rpm ");
+ qs.append("left join fetch rpm.currency rpmc ");
+ qs.append("left join fetch rp.availabilities pa ");
+ qs.append("left join fetch rp.manufacturer m ");
+ qs.append("left join fetch m.descriptions md ");
+ qs.append("left join fetch pa.prices pap ");
+ qs.append("left join fetch pap.descriptions papd ");
+
+ qs.append("where pr.code=:code ");
+ qs.append("and rp.available=:available ");
+ qs.append("and pr.store.id=:storeId ");
+ qs.append("and rpd.language.id=:langId");
+
+
+
+ String hql = qs.toString();
+ Query q = em.createQuery(hql);
+
+ q.setParameter("code", type);
+ q.setParameter("langId", language.getId());
+ q.setParameter("storeId", store.getId());
+ q.setParameter("available", true);
+
+
+
+ @SuppressWarnings("unchecked")
+ List<ProductRelationship> relations = q.getResultList();
+
+
+ return relations;
+
+
+ }
+
+ @Override
+ public List<ProductRelationship> getByGroup(MerchantStore store, String group) {
+
+ StringBuilder qs = new StringBuilder();
+ qs.append("select distinct pr from ProductRelationship as pr ");
+ qs.append("left join fetch pr.product p ");
+ qs.append("left join fetch pr.relatedProduct rp ");
+
+ qs.append("left join fetch rp.attributes pattr ");
+ qs.append("left join fetch rp.categories rpc ");
+ qs.append("left join fetch rpc.descriptions rpcd ");
+ qs.append("left join fetch rp.descriptions rpd ");
+ qs.append("left join fetch rp.owner rpo ");
+ qs.append("left join fetch rp.images pd ");
+ qs.append("left join fetch rp.merchantStore rpm ");
+ qs.append("left join fetch rpm.currency rpmc ");
+ qs.append("left join fetch rp.availabilities pa ");
+ qs.append("left join fetch pa.prices pap ");
+ qs.append("left join fetch pap.descriptions papd ");
+ qs.append("left join fetch rp.manufacturer manuf ");
+ qs.append("left join fetch manuf.descriptions manufd ");
+ qs.append("left join fetch rp.type type ");
+
+ qs.append("where pr.code=:code ");
+ qs.append("and pr.store.id=:storeId ");
+
+
+
+
+ String hql = qs.toString();
+ Query q = em.createQuery(hql);
+
+ q.setParameter("code", group);
+ q.setParameter("storeId", store.getId());
+
+
+
+
+ @SuppressWarnings("unchecked")
+ List<ProductRelationship> relations = q.getResultList();
+
+
+ return relations;
+
+
+ }
+
+ @Override
+ public List<ProductRelationship> getGroups(MerchantStore store) {
+
+ StringBuilder qs = new StringBuilder();
+ qs.append("select distinct pr from ProductRelationship as pr ");
+ qs.append("where pr.store.id=:store ");
+
+ qs.append("and pr.product=null");
+
+
+
+ String hql = qs.toString();
+ Query q = em.createQuery(hql);
+
+ q.setParameter("store", store.getId());
+
+
+
+ @SuppressWarnings("unchecked")
+ List<ProductRelationship> relations = q.getResultList();
+
+ Map<String,ProductRelationship> relationMap = new HashMap<String,ProductRelationship>();
+ for(ProductRelationship relationship : relations) {
+ if(!relationMap.containsKey(relationship.getCode())) {
+ relationMap.put(relationship.getCode(), relationship);
+ }
+ }
+
+ List<ProductRelationship> returnList = new ArrayList<ProductRelationship>(relationMap.values());
+
+
+ return returnList;
+
+
+ }
+
+
+ @Override
+ public List<ProductRelationship> getByType(MerchantStore store, String type) {
+
+ StringBuilder qs = new StringBuilder();
+ qs.append("select distinct pr from ProductRelationship as pr ");
+ qs.append("left join fetch pr.product p ");
+ qs.append("join fetch pr.relatedProduct rp ");
+ qs.append("left join fetch rp.descriptions rpd ");
+
+ qs.append("where pr.code=:code ");
+ qs.append("and pr.store.id=:storeId ");
+
+
+
+
+ String hql = qs.toString();
+ Query q = em.createQuery(hql);
+
+ q.setParameter("code", type);
+ q.setParameter("storeId", store.getId());
+
+
+ @SuppressWarnings("unchecked")
+ List<ProductRelationship> relations = q.getResultList();
+
+
+ return relations;
+
+
+ }
+
+ @Override
+ public List<ProductRelationship> listByProducts(Product product) {
+
+ StringBuilder qs = new StringBuilder();
+ qs.append("select pr from ProductRelationship as pr ");
+ qs.append("left join fetch pr.product p ");
+ qs.append("left join fetch pr.relatedProduct rp ");
+ qs.append("left join fetch rp.attributes pattr ");
+ qs.append("left join fetch rp.categories rpc ");
+ qs.append("left join fetch p.descriptions pd ");
+ qs.append("left join fetch rp.descriptions rpd ");
+
+ qs.append("where p.id=:id");
+ qs.append(" or rp.id=:id");
+
+
+
+
+ String hql = qs.toString();
+ Query q = em.createQuery(hql);
+
+ q.setParameter("id", product.getId());
+
+
+ @SuppressWarnings("unchecked")
+ List<ProductRelationship> relations = q.getResultList();
+
+
+ return relations;
+
+
+ }
+
+ @Override
+ public List<ProductRelationship> getByType(MerchantStore store, String type, Product product) {
+
+ StringBuilder qs = new StringBuilder();
+
+ qs.append("select distinct pr from ProductRelationship as pr ");
+ qs.append("left join fetch pr.product p ");
+ qs.append("left join fetch pr.relatedProduct rp ");
+
+ qs.append("left join fetch rp.attributes pattr ");
+ qs.append("left join fetch rp.categories rpc ");
+ qs.append("left join fetch rpc.descriptions rpcd ");
+ qs.append("left join fetch rp.descriptions rpd ");
+ qs.append("left join fetch rp.owner rpo ");
+ qs.append("left join fetch rp.images pd ");
+ qs.append("left join fetch rp.merchantStore rpm ");
+ qs.append("left join fetch rpm.currency rpmc ");
+ qs.append("left join fetch rp.availabilities pa ");
+ qs.append("left join fetch pa.prices pap ");
+ qs.append("left join fetch pap.descriptions papd ");
+
+ qs.append("left join fetch rp.manufacturer manuf ");
+ qs.append("left join fetch manuf.descriptions manufd ");
+ qs.append("left join fetch rp.type type ");
+
+ qs.append("where pr.code=:code ");
+ qs.append("and rp.available=:available ");
+ qs.append("and p.id=:pId");
+
+
+
+
+ String hql = qs.toString();
+ Query q = em.createQuery(hql);
+
+ q.setParameter("code", type);
+ q.setParameter("available", true);
+ q.setParameter("pId", product.getId());
+
+
+ @SuppressWarnings("unchecked")
+ List<ProductRelationship> relations = q.getResultList();
+
+
+ return relations;
+
+
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/review/ProductReviewRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/review/ProductReviewRepository.java
index 742c09a..6ef483a 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/review/ProductReviewRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/review/ProductReviewRepository.java
@@ -1,32 +1,32 @@
-package com.salesmanager.core.business.repositories.catalog.product.review;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.catalog.product.review.ProductReview;
-
-public interface ProductReviewRepository extends JpaRepository<ProductReview, Long> {
-
-
- @Query("select p from ProductReview p join fetch p.customer pc join fetch p.product pp join fetch pp.merchantStore ppm left join fetch p.descriptions pd where p.id = ?1")
- ProductReview findOne(Long id);
-
- @Query("select p from ProductReview p join fetch p.customer pc join fetch p.product pp join fetch pp.merchantStore ppm left join fetch p.descriptions pd where pc.id = ?1")
- List<ProductReview> findByCustomer(Long customerId);
-
- @Query("select p from ProductReview p left join fetch p.descriptions pd join fetch p.customer pc join fetch pc.merchantStore pcm left join fetch pc.defaultLanguage pcl left join fetch pc.attributes pca left join fetch pca.customerOption pcao left join fetch pca.customerOptionValue pcav left join fetch pcao.descriptions pcaod left join fetch pcav.descriptions pcavd join fetch p.product pp join fetch pp.merchantStore ppm join fetch p.product pp join fetch pp.merchantStore ppm left join fetch p.descriptions pd where pp.id = ?1")
- List<ProductReview> findByProduct(Long productId);
-
- @Query("select p from ProductReview p join fetch p.product pp join fetch pp.merchantStore ppm where pp.id = ?1")
- List<ProductReview> findByProductNoCustomers(Long productId);
-
- @Query("select p from ProductReview p left join fetch p.descriptions pd join fetch p.customer pc join fetch pc.merchantStore pcm left join fetch pc.defaultLanguage pcl left join fetch pc.attributes pca left join fetch pca.customerOption pcao left join fetch pca.customerOptionValue pcav left join fetch pcao.descriptions pcaod left join fetch pcav.descriptions pcavd join fetch p.product pp join fetch pp.merchantStore ppm join fetch p.product pp join fetch pp.merchantStore ppm left join fetch p.descriptions pd where pp.id = ?1 and pd.language.id =?2")
- List<ProductReview> findByProduct(Long productId, Integer languageId);
-
- @Query("select p from ProductReview p left join fetch p.descriptions pd join fetch p.customer pc join fetch pc.merchantStore pcm left join fetch pc.defaultLanguage pcl left join fetch pc.attributes pca left join fetch pca.customerOption pcao left join fetch pca.customerOptionValue pcav left join fetch pcao.descriptions pcaod left join fetch pcav.descriptions pcavd join fetch p.product pp join fetch pp.merchantStore ppm join fetch p.product pp join fetch pp.merchantStore ppm left join fetch p.descriptions pd where pp.id = ?1 and pc.id = ?2")
- ProductReview findByProductAndCustomer(Long productId, Long customerId);
-
-
-}
+package com.salesmanager.core.business.repositories.catalog.product.review;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.catalog.product.review.ProductReview;
+
+public interface ProductReviewRepository extends JpaRepository<ProductReview, Long> {
+
+
+ @Query("select p from ProductReview p join fetch p.customer pc join fetch p.product pp join fetch pp.merchantStore ppm left join fetch p.descriptions pd where p.id = ?1")
+ ProductReview findOne(Long id);
+
+ @Query("select p from ProductReview p join fetch p.customer pc join fetch p.product pp join fetch pp.merchantStore ppm left join fetch p.descriptions pd where pc.id = ?1")
+ List<ProductReview> findByCustomer(Long customerId);
+
+ @Query("select p from ProductReview p left join fetch p.descriptions pd join fetch p.customer pc join fetch pc.merchantStore pcm left join fetch pc.defaultLanguage pcl left join fetch pc.attributes pca left join fetch pca.customerOption pcao left join fetch pca.customerOptionValue pcav left join fetch pcao.descriptions pcaod left join fetch pcav.descriptions pcavd join fetch p.product pp join fetch pp.merchantStore ppm join fetch p.product pp join fetch pp.merchantStore ppm left join fetch p.descriptions pd where pp.id = ?1")
+ List<ProductReview> findByProduct(Long productId);
+
+ @Query("select p from ProductReview p join fetch p.product pp join fetch pp.merchantStore ppm where pp.id = ?1")
+ List<ProductReview> findByProductNoCustomers(Long productId);
+
+ @Query("select p from ProductReview p left join fetch p.descriptions pd join fetch p.customer pc join fetch pc.merchantStore pcm left join fetch pc.defaultLanguage pcl left join fetch pc.attributes pca left join fetch pca.customerOption pcao left join fetch pca.customerOptionValue pcav left join fetch pcao.descriptions pcaod left join fetch pcav.descriptions pcavd join fetch p.product pp join fetch pp.merchantStore ppm join fetch p.product pp join fetch pp.merchantStore ppm left join fetch p.descriptions pd where pp.id = ?1 and pd.language.id =?2")
+ List<ProductReview> findByProduct(Long productId, Integer languageId);
+
+ @Query("select p from ProductReview p left join fetch p.descriptions pd join fetch p.customer pc join fetch pc.merchantStore pcm left join fetch pc.defaultLanguage pcl left join fetch pc.attributes pca left join fetch pca.customerOption pcao left join fetch pca.customerOptionValue pcav left join fetch pcao.descriptions pcaod left join fetch pcav.descriptions pcavd join fetch p.product pp join fetch pp.merchantStore ppm join fetch p.product pp join fetch pp.merchantStore ppm left join fetch p.descriptions pd where pp.id = ?1 and pc.id = ?2")
+ ProductReview findByProductAndCustomer(Long productId, Long customerId);
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/type/ProductTypeRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/type/ProductTypeRepository.java
index 238617a..7bc8805 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/type/ProductTypeRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/catalog/product/type/ProductTypeRepository.java
@@ -1,10 +1,10 @@
-package com.salesmanager.core.business.repositories.catalog.product.type;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import com.salesmanager.core.model.catalog.product.type.ProductType;
-
-public interface ProductTypeRepository extends JpaRepository<ProductType, Long> {
-
- ProductType findByCode(String code);
-}
+package com.salesmanager.core.business.repositories.catalog.product.type;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import com.salesmanager.core.model.catalog.product.type.ProductType;
+
+public interface ProductTypeRepository extends JpaRepository<ProductType, Long> {
+
+ ProductType findByCode(String code);
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/content/ContentRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/content/ContentRepository.java
index cfbbc73..2588f04 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/content/ContentRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/content/ContentRepository.java
@@ -1,39 +1,39 @@
-package com.salesmanager.core.business.repositories.content;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.content.Content;
-import com.salesmanager.core.model.content.ContentType;
-
-public interface ContentRepository extends JpaRepository<Content, Long>, ContentRepositoryCustom {
-
-
- @Query("select c from Content c left join fetch c.descriptions cd join fetch c.merchantStore cm where c.contentType = ?1 and cm.id = ?2 and cd.language.id = ?3 order by c.sortOrder asc")
- List<Content> findByType(ContentType contentType, Integer storeId, Integer languageId);
-
- @Query("select c from Content c left join fetch c.descriptions cd join fetch c.merchantStore cm where c.contentType = ?1 and cm.id = ?2 order by c.sortOrder asc")
- List<Content> findByType(ContentType contentType, Integer storeId);
-
- @Query("select c from Content c left join fetch c.descriptions cd join fetch c.merchantStore cm where c.contentType in (?1) and cm.id = ?2 and cd.language.id = ?3 order by c.sortOrder asc")
- List<Content> findByTypes(List<ContentType> contentTypes, Integer storeId, Integer languageId);
-
- @Query("select c from Content c left join fetch c.descriptions cd join fetch c.merchantStore cm where c.contentType in (?1) and cm.id = ?2 order by c.sortOrder asc")
- List<Content> findByTypes(List<ContentType> contentTypes, Integer storeId);
-
- @Query("select c from Content c left join fetch c.descriptions cd join fetch c.merchantStore cm where c.code = ?1 and cm.id = ?2")
- Content findByCode(String code, Integer storeId);
-
- @Query("select c from Content c left join fetch c.descriptions cd join fetch c.merchantStore cm where c.code = ?1 and cm.id = ?2 and cd.language.id = ?3")
- Content findByCode(String code, Integer storeId, Integer languageId);
-
- @Query("select c from Content c left join fetch c.descriptions cd join fetch c.merchantStore cm where c.id = ?1 and cd.language.id = ?2")
- Content findByIdAndLanguage(Long contentId, Integer languageId);
-
- @Query("select c from Content c left join fetch c.descriptions cd join fetch c.merchantStore cm where c.id = ?1")
- Content findOne(Long contentId);
-
-
-}
+package com.salesmanager.core.business.repositories.content;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.content.Content;
+import com.salesmanager.core.model.content.ContentType;
+
+public interface ContentRepository extends JpaRepository<Content, Long>, ContentRepositoryCustom {
+
+
+ @Query("select c from Content c left join fetch c.descriptions cd join fetch c.merchantStore cm where c.contentType = ?1 and cm.id = ?2 and cd.language.id = ?3 order by c.sortOrder asc")
+ List<Content> findByType(ContentType contentType, Integer storeId, Integer languageId);
+
+ @Query("select c from Content c left join fetch c.descriptions cd join fetch c.merchantStore cm where c.contentType = ?1 and cm.id = ?2 order by c.sortOrder asc")
+ List<Content> findByType(ContentType contentType, Integer storeId);
+
+ @Query("select c from Content c left join fetch c.descriptions cd join fetch c.merchantStore cm where c.contentType in (?1) and cm.id = ?2 and cd.language.id = ?3 order by c.sortOrder asc")
+ List<Content> findByTypes(List<ContentType> contentTypes, Integer storeId, Integer languageId);
+
+ @Query("select c from Content c left join fetch c.descriptions cd join fetch c.merchantStore cm where c.contentType in (?1) and cm.id = ?2 order by c.sortOrder asc")
+ List<Content> findByTypes(List<ContentType> contentTypes, Integer storeId);
+
+ @Query("select c from Content c left join fetch c.descriptions cd join fetch c.merchantStore cm where c.code = ?1 and cm.id = ?2")
+ Content findByCode(String code, Integer storeId);
+
+ @Query("select c from Content c left join fetch c.descriptions cd join fetch c.merchantStore cm where c.code = ?1 and cm.id = ?2 and cd.language.id = ?3")
+ Content findByCode(String code, Integer storeId, Integer languageId);
+
+ @Query("select c from Content c left join fetch c.descriptions cd join fetch c.merchantStore cm where c.id = ?1 and cd.language.id = ?2")
+ Content findByIdAndLanguage(Long contentId, Integer languageId);
+
+ @Query("select c from Content c left join fetch c.descriptions cd join fetch c.merchantStore cm where c.id = ?1")
+ Content findOne(Long contentId);
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/content/ContentRepositoryCustom.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/content/ContentRepositoryCustom.java
index c04191b..4a4a41e 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/content/ContentRepositoryCustom.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/content/ContentRepositoryCustom.java
@@ -1,19 +1,19 @@
-package com.salesmanager.core.business.repositories.content;
-
-import java.util.List;
-
-import com.salesmanager.core.model.content.ContentDescription;
-import com.salesmanager.core.model.content.ContentType;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-
-
-public interface ContentRepositoryCustom {
-
- List<ContentDescription> listNameByType(List<ContentType> contentType,
- MerchantStore store, Language language);
-
- ContentDescription getBySeUrl(MerchantStore store, String seUrl);
-
-
-}
+package com.salesmanager.core.business.repositories.content;
+
+import java.util.List;
+
+import com.salesmanager.core.model.content.ContentDescription;
+import com.salesmanager.core.model.content.ContentType;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+
+
+public interface ContentRepositoryCustom {
+
+ List<ContentDescription> listNameByType(List<ContentType> contentType,
+ MerchantStore store, Language language);
+
+ ContentDescription getBySeUrl(MerchantStore store, String seUrl);
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/content/ContentRepositoryImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/content/ContentRepositoryImpl.java
index 40a2e16..3fdc147 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/content/ContentRepositoryImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/content/ContentRepositoryImpl.java
@@ -1,106 +1,107 @@
-package com.salesmanager.core.business.repositories.content;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-
-import com.salesmanager.core.model.content.Content;
-import com.salesmanager.core.model.content.ContentDescription;
-import com.salesmanager.core.model.content.ContentType;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-
-
-public class ContentRepositoryImpl implements ContentRepositoryCustom {
-
-
- @PersistenceContext
- private EntityManager em;
-
- @Override
- public List<ContentDescription> listNameByType(List<ContentType> contentType, MerchantStore store, Language language) {
-
-
-
- StringBuilder qs = new StringBuilder();
-
- qs.append("select c from Content c ");
- qs.append("left join fetch c.descriptions cd join fetch c.merchantStore cm ");
- qs.append("where c.contentType in (:ct) ");
- qs.append("and cm.id =:cm ");
- qs.append("and cd.language.id =:cl ");
- qs.append("order by c.sortOrder");
-
- String hql = qs.toString();
- Query q = this.em.createQuery(hql);
-
- q.setParameter("ct", contentType);
- q.setParameter("cm", store.getId());
- q.setParameter("cl", language.getId());
-
-
- @SuppressWarnings("unchecked")
- List<Content> contents = q.getResultList();
-
- List<ContentDescription> descriptions = new ArrayList<ContentDescription>();
- for(Content c : contents) {
- String name = c.getDescription().getName();
- String url = c.getDescription().getSeUrl();
- ContentDescription contentDescription = new ContentDescription();
- contentDescription.setName(name);
- contentDescription.setSeUrl(url);
- descriptions.add(contentDescription);
- }
-
- return descriptions;
-
- }
-
- @Override
- public ContentDescription getBySeUrl(MerchantStore store,String seUrl) {
-
- StringBuilder qs = new StringBuilder();
-
- qs.append("select c from Content c ");
- qs.append("left join fetch c.descriptions cd join fetch c.merchantStore cm ");
- qs.append("where c.contentType in (:ct) ");
- qs.append("where cm.id =:cm ");
- qs.append("and cd.seUrl =:se ");
-
-
- String hql = qs.toString();
- Query q = this.em.createQuery(hql);
-
- q.setParameter("cm", store.getId());
- q.setParameter("se", seUrl);
-
-
- Content content = (Content)q.getSingleResult();
-
-
- if(content!=null) {
- return content.getDescription();
- }
-
- @SuppressWarnings("unchecked")
- List<Content> results = q.getResultList();
- if (results.isEmpty()) {
- return null;
- } else if (results.size() >= 1) {
- content = results.get(0);
- }
-
- if(content!=null) {
- return content.getDescription();
- }
-
-
- return null;
-
- }
-
-
+package com.salesmanager.core.business.repositories.content;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
+import com.salesmanager.core.model.content.Content;
+import com.salesmanager.core.model.content.ContentDescription;
+import com.salesmanager.core.model.content.ContentType;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+
+
+public class ContentRepositoryImpl implements ContentRepositoryCustom {
+
+
+ @PersistenceContext
+ private EntityManager em;
+
+ @Override
+ public List<ContentDescription> listNameByType(List<ContentType> contentType, MerchantStore store, Language language) {
+
+
+
+ StringBuilder qs = new StringBuilder();
+
+ qs.append("select c from Content c ");
+ qs.append("left join fetch c.descriptions cd join fetch c.merchantStore cm ");
+ qs.append("where c.contentType in (:ct) ");
+ qs.append("and cm.id =:cm ");
+ qs.append("and cd.language.id =:cl ");
+ qs.append("order by c.sortOrder");
+
+ String hql = qs.toString();
+ Query q = this.em.createQuery(hql);
+
+ q.setParameter("ct", contentType);
+ q.setParameter("cm", store.getId());
+ q.setParameter("cl", language.getId());
+
+
+ @SuppressWarnings("unchecked")
+ List<Content> contents = q.getResultList();
+
+ List<ContentDescription> descriptions = new ArrayList<ContentDescription>();
+ for(Content c : contents) {
+ String name = c.getDescription().getName();
+ String url = c.getDescription().getSeUrl();
+ ContentDescription contentDescription = new ContentDescription();
+ contentDescription.setName(name);
+ contentDescription.setSeUrl(url);
+ contentDescription.setContent(c);
+ descriptions.add(contentDescription);
+
+ }
+
+ return descriptions;
+
+ }
+
+ @Override
+ public ContentDescription getBySeUrl(MerchantStore store,String seUrl) {
+
+ StringBuilder qs = new StringBuilder();
+
+ qs.append("select c from Content c ");
+ qs.append("left join fetch c.descriptions cd join fetch c.merchantStore cm ");
+ qs.append("where cm.id =:cm ");
+ qs.append("and cd.seUrl =:se ");
+
+
+ String hql = qs.toString();
+ Query q = this.em.createQuery(hql);
+
+ q.setParameter("cm", store.getId());
+ q.setParameter("se", seUrl);
+
+
+ Content content = (Content)q.getSingleResult();
+
+
+ if(content!=null) {
+ return content.getDescription();
+ }
+
+ @SuppressWarnings("unchecked")
+ List<Content> results = q.getResultList();
+ if (results.isEmpty()) {
+ return null;
+ } else if (results.size() >= 1) {
+ content = results.get(0);
+ }
+
+ if(content!=null) {
+ return content.getDescription();
+ }
+
+
+ return null;
+
+ }
+
+
}
\ No newline at end of file
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/attribute/CustomerAttributeRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/attribute/CustomerAttributeRepository.java
index 638ea5a..4a1942e 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/attribute/CustomerAttributeRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/attribute/CustomerAttributeRepository.java
@@ -1,27 +1,27 @@
-package com.salesmanager.core.business.repositories.customer.attribute;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.customer.attribute.CustomerAttribute;
-
-public interface CustomerAttributeRepository extends JpaRepository<CustomerAttribute, Long> {
-
-
- @Query("select a from CustomerAttribute a left join fetch a.customerOption aco left join fetch a.customerOptionValue acov left join fetch aco.descriptions acod left join fetch acov.descriptions acovd where a.id = ?1")
- CustomerAttribute findOne(Long id);
-
- @Query("select a from CustomerAttribute a join fetch a.customer ac left join fetch a.customerOption aco join fetch aco.merchantStore acom left join fetch a.customerOptionValue acov left join fetch aco.descriptions acod left join fetch acov.descriptions acovd where acom.id = ?1 and ac.id = ?2 and aco.id = ?3")
- CustomerAttribute findByOptionId(Integer merchantId,Long customerId,Long id);
-
- @Query("select a from CustomerAttribute a join fetch a.customer ac left join fetch a.customerOption aco join fetch aco.merchantStore acom left join fetch a.customerOptionValue acov left join fetch aco.descriptions acod left join fetch acov.descriptions acovd where acom.id = ?1 and aco.id = ?2")
- List<CustomerAttribute> findByOptionId(Integer merchantId,Long id);
-
- @Query("select distinct a from CustomerAttribute a join fetch a.customer ac left join fetch a.customerOption aco join fetch aco.merchantStore acom left join fetch a.customerOptionValue acov left join fetch aco.descriptions acod left join fetch acov.descriptions acovd where acom.id = ?1 and ac.id = ?2")
- List<CustomerAttribute> findByCustomerId(Integer merchantId,Long customerId);
-
- @Query("select a from CustomerAttribute a join fetch a.customer ac left join fetch a.customerOption aco join fetch aco.merchantStore acom left join fetch a.customerOptionValue acov left join fetch aco.descriptions acod left join fetch acov.descriptions acovd where acom.id = ?1 and acov.id = ?2")
- List<CustomerAttribute> findByOptionValueId(Integer merchantId,Long Id);
-}
+package com.salesmanager.core.business.repositories.customer.attribute;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.customer.attribute.CustomerAttribute;
+
+public interface CustomerAttributeRepository extends JpaRepository<CustomerAttribute, Long> {
+
+
+ @Query("select a from CustomerAttribute a left join fetch a.customerOption aco left join fetch a.customerOptionValue acov left join fetch aco.descriptions acod left join fetch acov.descriptions acovd where a.id = ?1")
+ CustomerAttribute findOne(Long id);
+
+ @Query("select a from CustomerAttribute a join fetch a.customer ac left join fetch a.customerOption aco join fetch aco.merchantStore acom left join fetch a.customerOptionValue acov left join fetch aco.descriptions acod left join fetch acov.descriptions acovd where acom.id = ?1 and ac.id = ?2 and aco.id = ?3")
+ CustomerAttribute findByOptionId(Integer merchantId,Long customerId,Long id);
+
+ @Query("select a from CustomerAttribute a join fetch a.customer ac left join fetch a.customerOption aco join fetch aco.merchantStore acom left join fetch a.customerOptionValue acov left join fetch aco.descriptions acod left join fetch acov.descriptions acovd where acom.id = ?1 and aco.id = ?2")
+ List<CustomerAttribute> findByOptionId(Integer merchantId,Long id);
+
+ @Query("select distinct a from CustomerAttribute a join fetch a.customer ac left join fetch a.customerOption aco join fetch aco.merchantStore acom left join fetch a.customerOptionValue acov left join fetch aco.descriptions acod left join fetch acov.descriptions acovd where acom.id = ?1 and ac.id = ?2")
+ List<CustomerAttribute> findByCustomerId(Integer merchantId,Long customerId);
+
+ @Query("select a from CustomerAttribute a join fetch a.customer ac left join fetch a.customerOption aco join fetch aco.merchantStore acom left join fetch a.customerOptionValue acov left join fetch aco.descriptions acod left join fetch acov.descriptions acovd where acom.id = ?1 and acov.id = ?2")
+ List<CustomerAttribute> findByOptionValueId(Integer merchantId,Long Id);
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/attribute/CustomerOptionRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/attribute/CustomerOptionRepository.java
index 2985ade..dd26a91 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/attribute/CustomerOptionRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/attribute/CustomerOptionRepository.java
@@ -1,22 +1,22 @@
-package com.salesmanager.core.business.repositories.customer.attribute;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.customer.attribute.CustomerOption;
-
-public interface CustomerOptionRepository extends JpaRepository<CustomerOption, Long> {
-
-
- @Query("select o from CustomerOption o join fetch o.merchantStore om left join fetch o.descriptions od where o.id = ?1")
- CustomerOption findOne(Long id);
-
- @Query("select o from CustomerOption o join fetch o.merchantStore om left join fetch o.descriptions od where om.id = ?1 and o.code = ?2")
- CustomerOption findByCode(Integer merchantId, String code);
-
- @Query("select o from CustomerOption o join fetch o.merchantStore om left join fetch o.descriptions od where om.id = ?1 and od.language.id = ?2")
- List<CustomerOption> findByStore(Integer merchantId, Integer languageId);
-
-}
+package com.salesmanager.core.business.repositories.customer.attribute;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.customer.attribute.CustomerOption;
+
+public interface CustomerOptionRepository extends JpaRepository<CustomerOption, Long> {
+
+
+ @Query("select o from CustomerOption o join fetch o.merchantStore om left join fetch o.descriptions od where o.id = ?1")
+ CustomerOption findOne(Long id);
+
+ @Query("select o from CustomerOption o join fetch o.merchantStore om left join fetch o.descriptions od where om.id = ?1 and o.code = ?2")
+ CustomerOption findByCode(Integer merchantId, String code);
+
+ @Query("select o from CustomerOption o join fetch o.merchantStore om left join fetch o.descriptions od where om.id = ?1 and od.language.id = ?2")
+ List<CustomerOption> findByStore(Integer merchantId, Integer languageId);
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/attribute/CustomerOptionSetRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/attribute/CustomerOptionSetRepository.java
index adfd702..bcabb96 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/attribute/CustomerOptionSetRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/attribute/CustomerOptionSetRepository.java
@@ -1,25 +1,25 @@
-package com.salesmanager.core.business.repositories.customer.attribute;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.customer.attribute.CustomerOptionSet;
-
-public interface CustomerOptionSetRepository extends JpaRepository<CustomerOptionSet, Long> {
-
-
- @Query("select c from CustomerOptionSet c join fetch c.customerOption co join fetch c.customerOptionValue cov join fetch co.merchantStore com left join fetch co.descriptions cod left join fetch cov.descriptions covd where c.id = ?1")
- CustomerOptionSet findOne(Long id);
-
- @Query("select c from CustomerOptionSet c join fetch c.customerOption co join fetch c.customerOptionValue cov join fetch co.merchantStore com left join fetch co.descriptions cod left join fetch cov.descriptions covd where com.id = ?1 and co.id = ?2")
- List<CustomerOptionSet> findByOptionId(Integer merchantStoreId, Long id);
-
- @Query("select c from CustomerOptionSet c join fetch c.customerOption co join fetch c.customerOptionValue cov join fetch co.merchantStore com left join fetch co.descriptions cod left join fetch cov.descriptions covd where com.id = ?1 and cov.id = ?2")
- List<CustomerOptionSet> findByOptionValueId(Integer merchantStoreId, Long id);
-
- @Query("select c from CustomerOptionSet c join fetch c.customerOption co join fetch c.customerOptionValue cov join fetch co.merchantStore com left join fetch co.descriptions cod left join fetch cov.descriptions covd where com.id = ?1 and cod.language.id = ?2 and covd.language.id = ?2 order by c.sortOrder asc")
- List<CustomerOptionSet> findByStore(Integer merchantStoreId, Integer languageId);
-
-}
+package com.salesmanager.core.business.repositories.customer.attribute;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.customer.attribute.CustomerOptionSet;
+
+public interface CustomerOptionSetRepository extends JpaRepository<CustomerOptionSet, Long> {
+
+
+ @Query("select c from CustomerOptionSet c join fetch c.customerOption co join fetch c.customerOptionValue cov join fetch co.merchantStore com left join fetch co.descriptions cod left join fetch cov.descriptions covd where c.id = ?1")
+ CustomerOptionSet findOne(Long id);
+
+ @Query("select c from CustomerOptionSet c join fetch c.customerOption co join fetch c.customerOptionValue cov join fetch co.merchantStore com left join fetch co.descriptions cod left join fetch cov.descriptions covd where com.id = ?1 and co.id = ?2")
+ List<CustomerOptionSet> findByOptionId(Integer merchantStoreId, Long id);
+
+ @Query("select c from CustomerOptionSet c join fetch c.customerOption co join fetch c.customerOptionValue cov join fetch co.merchantStore com left join fetch co.descriptions cod left join fetch cov.descriptions covd where com.id = ?1 and cov.id = ?2")
+ List<CustomerOptionSet> findByOptionValueId(Integer merchantStoreId, Long id);
+
+ @Query("select c from CustomerOptionSet c join fetch c.customerOption co join fetch c.customerOptionValue cov join fetch co.merchantStore com left join fetch co.descriptions cod left join fetch cov.descriptions covd where com.id = ?1 and cod.language.id = ?2 and covd.language.id = ?2 order by c.sortOrder asc")
+ List<CustomerOptionSet> findByStore(Integer merchantStoreId, Integer languageId);
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/attribute/CustomerOptionValueRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/attribute/CustomerOptionValueRepository.java
index ed56222..9c12e72 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/attribute/CustomerOptionValueRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/attribute/CustomerOptionValueRepository.java
@@ -1,23 +1,23 @@
-package com.salesmanager.core.business.repositories.customer.attribute;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.customer.attribute.CustomerOption;
-import com.salesmanager.core.model.customer.attribute.CustomerOptionValue;
-
-public interface CustomerOptionValueRepository extends JpaRepository<CustomerOptionValue, Long> {
-
-
- @Query("select o from CustomerOptionValue o join fetch o.merchantStore om left join fetch o.descriptions od where o.id = ?1")
- CustomerOptionValue findOne(Long id);
-
- @Query("select o from CustomerOptionValue o join fetch o.merchantStore om left join fetch o.descriptions od where om.id = ?1 and o.code = ?2")
- CustomerOptionValue findByCode(Integer merchantId, String code);
-
- @Query("select o from CustomerOptionValue o join fetch o.merchantStore om left join fetch o.descriptions od where om.id = ?1 and od.language.id = ?2")
- List<CustomerOptionValue> findByStore(Integer merchantId, Integer languageId);
-
-}
+package com.salesmanager.core.business.repositories.customer.attribute;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.customer.attribute.CustomerOption;
+import com.salesmanager.core.model.customer.attribute.CustomerOptionValue;
+
+public interface CustomerOptionValueRepository extends JpaRepository<CustomerOptionValue, Long> {
+
+
+ @Query("select o from CustomerOptionValue o join fetch o.merchantStore om left join fetch o.descriptions od where o.id = ?1")
+ CustomerOptionValue findOne(Long id);
+
+ @Query("select o from CustomerOptionValue o join fetch o.merchantStore om left join fetch o.descriptions od where om.id = ?1 and o.code = ?2")
+ CustomerOptionValue findByCode(Integer merchantId, String code);
+
+ @Query("select o from CustomerOptionValue o join fetch o.merchantStore om left join fetch o.descriptions od where om.id = ?1 and od.language.id = ?2")
+ List<CustomerOptionValue> findByStore(Integer merchantId, Integer languageId);
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/CustomerRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/CustomerRepository.java
index a595b8c..00f1da0 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/CustomerRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/CustomerRepository.java
@@ -1,27 +1,27 @@
-package com.salesmanager.core.business.repositories.customer;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.customer.Customer;
-
-public interface CustomerRepository extends JpaRepository<Customer, Long>, CustomerRepositoryCustom {
-
-
- @Query("select c from Customer c join fetch c.merchantStore cm left join fetch c.defaultLanguage cl left join fetch c.attributes ca left join fetch ca.customerOption cao left join fetch ca.customerOptionValue cav left join fetch cao.descriptions caod left join fetch cav.descriptions left join fetch c.groups where c.id = ?1")
- Customer findOne(Long id);
-
- @Query("select c from Customer c join fetch c.merchantStore cm left join fetch c.defaultLanguage cl left join fetch c.attributes ca left join fetch ca.customerOption cao left join fetch ca.customerOptionValue cav left join fetch cao.descriptions caod left join fetch cav.descriptions left join fetch c.groups where c.billing.firstName = ?1")
- List<Customer> findByName(String name);
-
- @Query("select c from Customer c join fetch c.merchantStore cm left join fetch c.defaultLanguage cl left join fetch c.attributes ca left join fetch ca.customerOption cao left join fetch ca.customerOptionValue cav left join fetch cao.descriptions caod left join fetch cav.descriptions left join fetch c.groups where c.nick = ?1")
- Customer findByNick(String nick);
-
- @Query("select c from Customer c join fetch c.merchantStore cm left join fetch c.defaultLanguage cl left join fetch c.attributes ca left join fetch ca.customerOption cao left join fetch ca.customerOptionValue cav left join fetch cao.descriptions caod left join fetch cav.descriptions left join fetch c.groups where c.nick = ?1 and cm.id = ?2")
- Customer findByNick(String nick, int storeId);
-
- @Query("select c from Customer c join fetch c.merchantStore cm left join fetch c.defaultLanguage cl left join fetch c.attributes ca left join fetch ca.customerOption cao left join fetch ca.customerOptionValue cav left join fetch cao.descriptions caod left join fetch cav.descriptions left join fetch c.groups where cm.id = ?1")
- List<Customer> findByStore(int storeId);
-}
+package com.salesmanager.core.business.repositories.customer;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.customer.Customer;
+
+public interface CustomerRepository extends JpaRepository<Customer, Long>, CustomerRepositoryCustom {
+
+
+ @Query("select c from Customer c join fetch c.merchantStore cm left join fetch c.defaultLanguage cl left join fetch c.attributes ca left join fetch ca.customerOption cao left join fetch ca.customerOptionValue cav left join fetch cao.descriptions caod left join fetch cav.descriptions left join fetch c.groups where c.id = ?1")
+ Customer findOne(Long id);
+
+ @Query("select distinct c from Customer c join fetch c.merchantStore cm left join fetch c.defaultLanguage cl left join fetch c.attributes ca left join fetch ca.customerOption cao left join fetch ca.customerOptionValue cav left join fetch cao.descriptions caod left join fetch cav.descriptions left join fetch c.groups where c.billing.firstName = ?1")
+ List<Customer> findByName(String name);
+
+ @Query("select c from Customer c join fetch c.merchantStore cm left join fetch c.defaultLanguage cl left join fetch c.attributes ca left join fetch ca.customerOption cao left join fetch ca.customerOptionValue cav left join fetch cao.descriptions caod left join fetch cav.descriptions left join fetch c.groups where c.nick = ?1")
+ Customer findByNick(String nick);
+
+ @Query("select c from Customer c join fetch c.merchantStore cm left join fetch c.defaultLanguage cl left join fetch c.attributes ca left join fetch ca.customerOption cao left join fetch ca.customerOptionValue cav left join fetch cao.descriptions caod left join fetch cav.descriptions left join fetch c.groups where c.nick = ?1 and cm.id = ?2")
+ Customer findByNick(String nick, int storeId);
+
+ @Query("select distinct c from Customer c join fetch c.merchantStore cm left join fetch c.defaultLanguage cl left join fetch c.attributes ca left join fetch ca.customerOption cao left join fetch ca.customerOptionValue cav left join fetch cao.descriptions caod left join fetch cav.descriptions left join fetch c.groups where cm.id = ?1")
+ List<Customer> findByStore(int storeId);
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/CustomerRepositoryCustom.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/CustomerRepositoryCustom.java
index 2e8fb93..a403751 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/CustomerRepositoryCustom.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/CustomerRepositoryCustom.java
@@ -1,14 +1,14 @@
-package com.salesmanager.core.business.repositories.customer;
-
-import com.salesmanager.core.model.customer.CustomerCriteria;
-import com.salesmanager.core.model.customer.CustomerList;
-import com.salesmanager.core.model.merchant.MerchantStore;
-
-
-
-public interface CustomerRepositoryCustom {
-
- CustomerList listByStore(MerchantStore store, CustomerCriteria criteria);
-
-
-}
+package com.salesmanager.core.business.repositories.customer;
+
+import com.salesmanager.core.model.customer.CustomerCriteria;
+import com.salesmanager.core.model.customer.CustomerList;
+import com.salesmanager.core.model.merchant.MerchantStore;
+
+
+
+public interface CustomerRepositoryCustom {
+
+ CustomerList listByStore(MerchantStore store, CustomerCriteria criteria);
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/CustomerRepositoryImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/CustomerRepositoryImpl.java
index a3d5298..d869303 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/CustomerRepositoryImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/CustomerRepositoryImpl.java
@@ -1,148 +1,151 @@
-package com.salesmanager.core.business.repositories.customer;
-
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-
-import org.apache.commons.lang3.StringUtils;
-
-import com.salesmanager.core.model.customer.CustomerCriteria;
-import com.salesmanager.core.model.customer.CustomerList;
-import com.salesmanager.core.model.merchant.MerchantStore;
-
-
-public class CustomerRepositoryImpl implements CustomerRepositoryCustom {
-
-
- @PersistenceContext
- private EntityManager em;
-
- @SuppressWarnings("unchecked")
- @Override
- public CustomerList listByStore(MerchantStore store, CustomerCriteria criteria) {
-
-
- CustomerList customerList = new CustomerList();
- StringBuilder countBuilderSelect = new StringBuilder();
- StringBuilder objectBuilderSelect = new StringBuilder();
-
- String baseCountQuery = "select count(c) from Customer as c";
- String baseQuery = "select c from Customer as c";
- countBuilderSelect.append(baseCountQuery);
- objectBuilderSelect.append(baseQuery);
-
- StringBuilder countBuilderWhere = new StringBuilder();
- StringBuilder objectBuilderWhere = new StringBuilder();
- String whereQuery = " where c.merchantStore.id=:mId";
- countBuilderWhere.append(whereQuery);
- objectBuilderWhere.append(whereQuery);
-
- if(!StringUtils.isBlank(criteria.getName())) {
- String nameQuery =" and c.billing.firstName like:nm or c.billing.lastName like:nm";
- countBuilderWhere.append(nameQuery);
- objectBuilderWhere.append(nameQuery);
- }
-
- if(!StringUtils.isBlank(criteria.getFirstName())) {
- String nameQuery =" and c..billing.firstName like:fn";
- countBuilderWhere.append(nameQuery);
- objectBuilderWhere.append(nameQuery);
- }
-
- if(!StringUtils.isBlank(criteria.getLastName())) {
- String nameQuery =" and c.billing.lastName like:ln";
- countBuilderWhere.append(nameQuery);
- objectBuilderWhere.append(nameQuery);
- }
-
- if(!StringUtils.isBlank(criteria.getEmail())) {
- String mailQuery =" and c.emailAddress like:email";
- countBuilderWhere.append(mailQuery);
- objectBuilderWhere.append(mailQuery);
- }
-
- if(!StringUtils.isBlank(criteria.getCountry())) {
- String countryQuery =" and c.billing.country.isoCode like:country";
- countBuilderWhere.append(countryQuery);
- objectBuilderWhere.append(countryQuery);
- }
-
- //count query
- Query countQ = em.createQuery(
- countBuilderSelect.toString() + countBuilderWhere.toString());
-
- //object query
- Query objectQ = em.createQuery(
- objectBuilderSelect.toString() + objectBuilderWhere.toString());
-
- countQ.setParameter("mId", store.getId());
- objectQ.setParameter("mId", store.getId());
-
-
- if(!StringUtils.isBlank(criteria.getName())) {
- String nameParam = new StringBuilder().append("%").append(criteria.getName()).append("%").toString();
- countQ.setParameter("nm",nameParam);
- objectQ.setParameter("nm",nameParam);
- }
-
- if(!StringUtils.isBlank(criteria.getFirstName())) {
- String nameParam = new StringBuilder().append("%").append(criteria.getFirstName()).append("%").toString();
- countQ.setParameter("fn",nameParam);
- objectQ.setParameter("fn",nameParam);
- }
-
- if(!StringUtils.isBlank(criteria.getLastName())) {
- String nameParam = new StringBuilder().append("%").append(criteria.getLastName()).append("%").toString();
- countQ.setParameter("ln",nameParam);
- objectQ.setParameter("ln",nameParam);
- }
-
- if(!StringUtils.isBlank(criteria.getEmail())) {
- String email = new StringBuilder().append("%").append(criteria.getEmail()).append("%").toString();
- countQ.setParameter("email",email);
- objectQ.setParameter("email",email);
- }
-
- if(!StringUtils.isBlank(criteria.getCountry())) {
- String country = new StringBuilder().append("%").append(criteria.getCountry()).append("%").toString();
- countQ.setParameter("country",country);
- objectQ.setParameter("country",country);
- }
-
-
-
- Number count = (Number) countQ.getSingleResult();
-
- customerList.setTotalCount(count.intValue());
-
- if(count.intValue()==0)
- return customerList;
-
- //TO BE USED
- int max = criteria.getMaxCount();
- int first = criteria.getStartIndex();
-
- objectQ.setFirstResult(first);
-
-
-
- if(max>0) {
- int maxCount = first + max;
-
- if(maxCount < count.intValue()) {
- objectQ.setMaxResults(maxCount);
- } else {
- objectQ.setMaxResults(count.intValue());
- }
- }
-
- customerList.setCustomers(objectQ.getResultList());
-
- return customerList;
-
-
- }
-
-
-
-}
+package com.salesmanager.core.business.repositories.customer;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.salesmanager.core.model.customer.CustomerCriteria;
+import com.salesmanager.core.model.customer.CustomerList;
+import com.salesmanager.core.model.merchant.MerchantStore;
+
+
+public class CustomerRepositoryImpl implements CustomerRepositoryCustom {
+
+
+ @PersistenceContext
+ private EntityManager em;
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public CustomerList listByStore(MerchantStore store, CustomerCriteria criteria) {
+
+
+ CustomerList customerList = new CustomerList();
+ StringBuilder countBuilderSelect = new StringBuilder();
+ StringBuilder objectBuilderSelect = new StringBuilder();
+
+ String baseCountQuery = "select count(c) from Customer as c";
+ String baseQuery = "select c from Customer as c";
+ countBuilderSelect.append(baseCountQuery);
+ objectBuilderSelect.append(baseQuery);
+
+ StringBuilder countBuilderWhere = new StringBuilder();
+ StringBuilder objectBuilderWhere = new StringBuilder();
+ String whereQuery = " where c.merchantStore.id=:mId";
+ countBuilderWhere.append(whereQuery);
+ objectBuilderWhere.append(whereQuery);
+
+ if(!StringUtils.isBlank(criteria.getName())) {
+ String nameQuery =" and c.billing.firstName like:nm or c.billing.lastName like:nm";
+ countBuilderWhere.append(nameQuery);
+ objectBuilderWhere.append(nameQuery);
+ }
+
+ if(!StringUtils.isBlank(criteria.getFirstName())) {
+ String nameQuery =" and c..billing.firstName like:fn";
+ countBuilderWhere.append(nameQuery);
+ objectBuilderWhere.append(nameQuery);
+ }
+
+ if(!StringUtils.isBlank(criteria.getLastName())) {
+ String nameQuery =" and c.billing.lastName like:ln";
+ countBuilderWhere.append(nameQuery);
+ objectBuilderWhere.append(nameQuery);
+ }
+
+ if(!StringUtils.isBlank(criteria.getEmail())) {
+ String mailQuery =" and c.emailAddress like:email";
+ countBuilderWhere.append(mailQuery);
+ objectBuilderWhere.append(mailQuery);
+ }
+
+ if(!StringUtils.isBlank(criteria.getCountry())) {
+ String countryQuery =" and c.billing.country.isoCode like:country";
+ countBuilderWhere.append(countryQuery);
+ objectBuilderWhere.append(countryQuery);
+ }
+
+ objectBuilderSelect.append(" left join fetch c.attributes ca left join fetch ca.customerOption cao left join fetch ca.customerOptionValue cav left join fetch cao.descriptions caod left join fetch cav.descriptions left join fetch c.groups");
+
+ //count query
+ Query countQ = em.createQuery(
+ countBuilderSelect.toString() + countBuilderWhere.toString());
+
+ //object query
+ Query objectQ = em.createQuery(
+ objectBuilderSelect.toString() + objectBuilderWhere.toString());
+
+ countQ.setParameter("mId", store.getId());
+ objectQ.setParameter("mId", store.getId());
+
+
+ if(!StringUtils.isBlank(criteria.getName())) {
+ String nameParam = new StringBuilder().append("%").append(criteria.getName()).append("%").toString();
+ countQ.setParameter("nm",nameParam);
+ objectQ.setParameter("nm",nameParam);
+ }
+
+ if(!StringUtils.isBlank(criteria.getFirstName())) {
+ String nameParam = new StringBuilder().append("%").append(criteria.getFirstName()).append("%").toString();
+ countQ.setParameter("fn",nameParam);
+ objectQ.setParameter("fn",nameParam);
+ }
+
+ if(!StringUtils.isBlank(criteria.getLastName())) {
+ String nameParam = new StringBuilder().append("%").append(criteria.getLastName()).append("%").toString();
+ countQ.setParameter("ln",nameParam);
+ objectQ.setParameter("ln",nameParam);
+ }
+
+ if(!StringUtils.isBlank(criteria.getEmail())) {
+ String email = new StringBuilder().append("%").append(criteria.getEmail()).append("%").toString();
+ countQ.setParameter("email",email);
+ objectQ.setParameter("email",email);
+ }
+
+ if(!StringUtils.isBlank(criteria.getCountry())) {
+ String country = new StringBuilder().append("%").append(criteria.getCountry()).append("%").toString();
+ countQ.setParameter("country",country);
+ objectQ.setParameter("country",country);
+ }
+
+
+
+
+ Number count = (Number) countQ.getSingleResult();
+
+ customerList.setTotalCount(count.intValue());
+
+ if(count.intValue()==0)
+ return customerList;
+
+ //TO BE USED
+ int max = criteria.getMaxCount();
+ int first = criteria.getStartIndex();
+
+ objectQ.setFirstResult(first);
+
+
+
+ if(max>0) {
+ int maxCount = first + max;
+
+ if(maxCount < count.intValue()) {
+ objectQ.setMaxResults(maxCount);
+ } else {
+ objectQ.setMaxResults(count.intValue());
+ }
+ }
+
+ customerList.setCustomers(objectQ.getResultList());
+
+ return customerList;
+
+
+ }
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/review/CustomerReviewRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/review/CustomerReviewRepository.java
new file mode 100644
index 0000000..bf6e1ab
--- /dev/null
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/customer/review/CustomerReviewRepository.java
@@ -0,0 +1,36 @@
+package com.salesmanager.core.business.repositories.customer.review;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.customer.review.CustomerReview;
+
+public interface CustomerReviewRepository extends JpaRepository<CustomerReview, Long> {
+
+ static String customerQuery = ""
+ + "select distinct r from CustomerReview r join fetch "
+ + "r.customer rc "
+ //+ "join fetch rc.attributes rca left join "
+ //+ "fetch rca.customerOption rcao left join fetch rca.customerOptionValue "
+ //+ "rcav left join fetch rcao.descriptions rcaod left join fetch rcav.descriptions "
+ + "join fetch r.reviewedCustomer rr join fetch rc.merchantStore rrm "
+ + "left join fetch r.descriptions rd ";
+
+
+ @Query("select r from CustomerReview r join fetch r.customer rc join fetch r.reviewedCustomer rr join fetch rc.merchantStore rrm left join fetch r.descriptions rd where r.id = ?1")
+ CustomerReview findOne(Long id);
+
+ @Query("select distinct r from CustomerReview r join fetch r.customer rc join fetch r.reviewedCustomer rr join fetch rc.merchantStore rrm left join fetch r.descriptions rd where rc.id = ?1")
+ List<CustomerReview> findByReviewer(Long id);
+
+ @Query("select distinct r from CustomerReview r join fetch r.customer rc join fetch r.reviewedCustomer rr join fetch rc.merchantStore rrm left join fetch r.descriptions rd where rr.id = ?1")
+ List<CustomerReview> findByReviewed(Long id);
+
+ @Query( customerQuery + "where rc.id = ?1 and rr.id = ?2")
+ CustomerReview findByRevieweAndReviewed(Long reviewer, Long reviewed);
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/merchant/MerchantRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/merchant/MerchantRepository.java
index 444e89f..db77e70 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/merchant/MerchantRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/merchant/MerchantRepository.java
@@ -1,15 +1,12 @@
-package com.salesmanager.core.business.repositories.merchant;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.merchant.MerchantStore;
-
-public interface MerchantRepository extends JpaRepository<MerchantStore, Integer> {
-
- @Query("select m from MerchantStore m left join fetch m.country mc left join fetch m.currency mc left join fetch m.zone mz left join fetch m.defaultLanguage md left join fetch m.languages mls where m.code = ?1")
- MerchantStore findByCode(String code);
-
- @Query("select m from MerchantStore m left join fetch m.country mc left join fetch m.currency mc left join fetch m.zone mz left join fetch m.defaultLanguage md left join fetch m.languages mls where m.id = ?1")
- MerchantStore findById(Integer id);
-}
+package com.salesmanager.core.business.repositories.merchant;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.merchant.MerchantStore;
+
+public interface MerchantRepository extends JpaRepository<MerchantStore, Integer> {
+
+ @Query("select m from MerchantStore m left join fetch m.country mc left join fetch m.currency mc left join fetch m.zone mz left join fetch m.defaultLanguage md left join fetch m.languages mls where m.code = ?1")
+ MerchantStore findByCode(String code);
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/orderaccount/OrderAccountRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/orderaccount/OrderAccountRepository.java
index 95c7703..d690b5b 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/orderaccount/OrderAccountRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/orderaccount/OrderAccountRepository.java
@@ -1,10 +1,10 @@
-package com.salesmanager.core.business.repositories.order.orderaccount;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import com.salesmanager.core.model.order.orderaccount.OrderAccount;
-
-public interface OrderAccountRepository extends JpaRepository<OrderAccount, Long> {
-
-
-}
+package com.salesmanager.core.business.repositories.order.orderaccount;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import com.salesmanager.core.model.order.orderaccount.OrderAccount;
+
+public interface OrderAccountRepository extends JpaRepository<OrderAccount, Long> {
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/orderproduct/OrderProductDownloadRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/orderproduct/OrderProductDownloadRepository.java
index d0e0d45..02f1890 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/orderproduct/OrderProductDownloadRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/orderproduct/OrderProductDownloadRepository.java
@@ -1,18 +1,18 @@
-package com.salesmanager.core.business.repositories.order.orderproduct;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.order.orderproduct.OrderProductDownload;
-
-public interface OrderProductDownloadRepository extends JpaRepository<OrderProductDownload, Long> {
-
- @Query("select o from OrderProductDownload o left join fetch o.orderProduct op join fetch op.order opo join fetch opo.merchant opon where o.id = ?1")
- OrderProductDownload findOne(Long id);
-
- @Query("select o from OrderProductDownload o left join fetch o.orderProduct op join fetch op.order opo join fetch opo.merchant opon where opo.id = ?1")
- List<OrderProductDownload> findByOrderId(Long id);
-
-}
+package com.salesmanager.core.business.repositories.order.orderproduct;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.order.orderproduct.OrderProductDownload;
+
+public interface OrderProductDownloadRepository extends JpaRepository<OrderProductDownload, Long> {
+
+ @Query("select o from OrderProductDownload o left join fetch o.orderProduct op join fetch op.order opo join fetch opo.merchant opon where o.id = ?1")
+ OrderProductDownload findOne(Long id);
+
+ @Query("select o from OrderProductDownload o left join fetch o.orderProduct op join fetch op.order opo join fetch opo.merchant opon where opo.id = ?1")
+ List<OrderProductDownload> findByOrderId(Long id);
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/orderproduct/OrderProductRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/orderproduct/OrderProductRepository.java
index 9aeb378..8bddb64 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/orderproduct/OrderProductRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/orderproduct/OrderProductRepository.java
@@ -1,10 +1,10 @@
-package com.salesmanager.core.business.repositories.order.orderproduct;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import com.salesmanager.core.model.order.orderproduct.OrderProduct;
-
-public interface OrderProductRepository extends JpaRepository<OrderProduct, Long> {
-
-
-}
+package com.salesmanager.core.business.repositories.order.orderproduct;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import com.salesmanager.core.model.order.orderproduct.OrderProduct;
+
+public interface OrderProductRepository extends JpaRepository<OrderProduct, Long> {
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/OrderRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/OrderRepository.java
index 575b8be..5f193a5 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/OrderRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/OrderRepository.java
@@ -1,12 +1,12 @@
-package com.salesmanager.core.business.repositories.order;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.order.Order;
-
-public interface OrderRepository extends JpaRepository<Order, Long>, OrderRepositoryCustom {
-
- @Query("select o from Order o join fetch o.orderProducts op join fetch o.orderTotal ot left join fetch o.orderHistory oh left join fetch op.downloads opd left join fetch op.orderAttributes opa left join fetch op.prices opp where o.id = ?1")
- Order findOne(Long id);
-}
+package com.salesmanager.core.business.repositories.order;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.order.Order;
+
+public interface OrderRepository extends JpaRepository<Order, Long>, OrderRepositoryCustom {
+
+ @Query("select o from Order o join fetch o.orderProducts op left join fetch o.orderAttributes oa join fetch o.orderTotal ot left join fetch o.orderHistory oh left join fetch op.downloads opd left join fetch op.orderAttributes opa left join fetch op.prices opp where o.id = ?1")
+ Order findOne(Long id);
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/OrderRepositoryCustom.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/OrderRepositoryCustom.java
index bbf9306..2b5d5a3 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/OrderRepositoryCustom.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/OrderRepositoryCustom.java
@@ -1,15 +1,15 @@
-package com.salesmanager.core.business.repositories.order;
-
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.OrderCriteria;
-import com.salesmanager.core.model.order.OrderList;
-
-
-
-
-public interface OrderRepositoryCustom {
-
- OrderList listByStore(MerchantStore store, OrderCriteria criteria);
-
-
-}
+package com.salesmanager.core.business.repositories.order;
+
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.OrderCriteria;
+import com.salesmanager.core.model.order.OrderList;
+
+
+
+
+public interface OrderRepositoryCustom {
+
+ OrderList listByStore(MerchantStore store, OrderCriteria criteria);
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/OrderRepositoryImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/OrderRepositoryImpl.java
index b2b3f2e..43e1848 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/OrderRepositoryImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/OrderRepositoryImpl.java
@@ -1,136 +1,136 @@
-package com.salesmanager.core.business.repositories.order;
-
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-import javax.persistence.Query;
-
-import org.apache.commons.lang3.StringUtils;
-
-import com.salesmanager.core.model.common.CriteriaOrderBy;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.OrderCriteria;
-import com.salesmanager.core.model.order.OrderList;
-
-
-public class OrderRepositoryImpl implements OrderRepositoryCustom {
-
-
- @PersistenceContext
- private EntityManager em;
-
- @SuppressWarnings("unchecked")
- @Override
- public OrderList listByStore(MerchantStore store, OrderCriteria criteria) {
-
-
- OrderList orderList = new OrderList();
- StringBuilder countBuilderSelect = new StringBuilder();
- StringBuilder objectBuilderSelect = new StringBuilder();
-
- String orderByCriteria = " order by o.id desc";
-
- if(criteria.getOrderBy()!=null) {
- if(CriteriaOrderBy.ASC.name().equals(criteria.getOrderBy().name())) {
- orderByCriteria = " order by o.id asc";
- }
- }
-
- String countBaseQuery = "select count(o) from Order as o";
- String baseQuery = "select o from Order as o left join fetch o.orderTotal ot left join fetch o.orderProducts op left join fetch op.orderAttributes opo left join fetch op.prices opp";
- countBuilderSelect.append(countBaseQuery);
- objectBuilderSelect.append(baseQuery);
-
-
-
- StringBuilder countBuilderWhere = new StringBuilder();
- StringBuilder objectBuilderWhere = new StringBuilder();
- String whereQuery = " where o.merchant.id=:mId";
- countBuilderWhere.append(whereQuery);
- objectBuilderWhere.append(whereQuery);
-
-
- if(!StringUtils.isBlank(criteria.getCustomerName())) {
- String nameQuery =" and o.billing.firstName like:nm or o.billing.lastName like:nm";
- countBuilderWhere.append(nameQuery);
- objectBuilderWhere.append(nameQuery);
- }
-
- if(!StringUtils.isBlank(criteria.getPaymentMethod())) {
- String paymentQuery =" and o.paymentModuleCode like:pm";
- countBuilderWhere.append(paymentQuery);
- objectBuilderWhere.append(paymentQuery);
- }
-
- if(criteria.getCustomerId()!=null) {
- String customerQuery =" and o.customerId =:cid";
- countBuilderWhere.append(customerQuery);
- objectBuilderWhere.append(customerQuery);
- }
-
- objectBuilderWhere.append(orderByCriteria);
-
-
- //count query
- Query countQ = em.createQuery(
- countBuilderSelect.toString() + countBuilderWhere.toString());
-
- //object query
- Query objectQ = em.createQuery(
- objectBuilderSelect.toString() + objectBuilderWhere.toString());
-
- countQ.setParameter("mId", store.getId());
- objectQ.setParameter("mId", store.getId());
-
-
- if(!StringUtils.isBlank(criteria.getCustomerName())) {
- String nameParam = new StringBuilder().append("%").append(criteria.getCustomerName()).append("%").toString();
- countQ.setParameter("nm",nameParam);
- objectQ.setParameter("nm",nameParam);
- }
-
- if(!StringUtils.isBlank(criteria.getPaymentMethod())) {
- String payementParam = new StringBuilder().append("%").append(criteria.getPaymentMethod()).append("%").toString();
- countQ.setParameter("pm",payementParam);
- objectQ.setParameter("pm",payementParam);
- }
-
- if(criteria.getCustomerId()!=null) {
- countQ.setParameter("cid", criteria.getCustomerId());
- objectQ.setParameter("cid",criteria.getCustomerId());
- }
-
-
- Number count = (Number) countQ.getSingleResult();
-
- orderList.setTotalCount(count.intValue());
-
- if(count.intValue()==0)
- return orderList;
-
- //TO BE USED
- int max = criteria.getMaxCount();
- int first = criteria.getStartIndex();
-
- objectQ.setFirstResult(first);
-
-
-
- if(max>0) {
- int maxCount = first + max;
-
- if(maxCount < count.intValue()) {
- objectQ.setMaxResults(maxCount);
- } else {
- objectQ.setMaxResults(count.intValue());
- }
- }
-
- orderList.setOrders(objectQ.getResultList());
-
- return orderList;
-
-
- }
-
-
-}
+package com.salesmanager.core.business.repositories.order;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.salesmanager.core.model.common.CriteriaOrderBy;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.OrderCriteria;
+import com.salesmanager.core.model.order.OrderList;
+
+
+public class OrderRepositoryImpl implements OrderRepositoryCustom {
+
+
+ @PersistenceContext
+ private EntityManager em;
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public OrderList listByStore(MerchantStore store, OrderCriteria criteria) {
+
+
+ OrderList orderList = new OrderList();
+ StringBuilder countBuilderSelect = new StringBuilder();
+ StringBuilder objectBuilderSelect = new StringBuilder();
+
+ String orderByCriteria = " order by o.id desc";
+
+ if(criteria.getOrderBy()!=null) {
+ if(CriteriaOrderBy.ASC.name().equals(criteria.getOrderBy().name())) {
+ orderByCriteria = " order by o.id asc";
+ }
+ }
+
+ String countBaseQuery = "select count(o) from Order as o";
+ String baseQuery = "select o from Order as o left join fetch o.orderTotal ot left join fetch o.orderProducts op left join fetch o.orderAttributes oa left join fetch op.orderAttributes opo left join fetch op.prices opp";
+ countBuilderSelect.append(countBaseQuery);
+ objectBuilderSelect.append(baseQuery);
+
+
+
+ StringBuilder countBuilderWhere = new StringBuilder();
+ StringBuilder objectBuilderWhere = new StringBuilder();
+ String whereQuery = " where o.merchant.id=:mId";
+ countBuilderWhere.append(whereQuery);
+ objectBuilderWhere.append(whereQuery);
+
+
+ if(!StringUtils.isBlank(criteria.getCustomerName())) {
+ String nameQuery =" and o.billing.firstName like:nm or o.billing.lastName like:nm";
+ countBuilderWhere.append(nameQuery);
+ objectBuilderWhere.append(nameQuery);
+ }
+
+ if(!StringUtils.isBlank(criteria.getPaymentMethod())) {
+ String paymentQuery =" and o.paymentModuleCode like:pm";
+ countBuilderWhere.append(paymentQuery);
+ objectBuilderWhere.append(paymentQuery);
+ }
+
+ if(criteria.getCustomerId()!=null) {
+ String customerQuery =" and o.customerId =:cid";
+ countBuilderWhere.append(customerQuery);
+ objectBuilderWhere.append(customerQuery);
+ }
+
+ objectBuilderWhere.append(orderByCriteria);
+
+
+ //count query
+ Query countQ = em.createQuery(
+ countBuilderSelect.toString() + countBuilderWhere.toString());
+
+ //object query
+ Query objectQ = em.createQuery(
+ objectBuilderSelect.toString() + objectBuilderWhere.toString());
+
+ countQ.setParameter("mId", store.getId());
+ objectQ.setParameter("mId", store.getId());
+
+
+ if(!StringUtils.isBlank(criteria.getCustomerName())) {
+ String nameParam = new StringBuilder().append("%").append(criteria.getCustomerName()).append("%").toString();
+ countQ.setParameter("nm",nameParam);
+ objectQ.setParameter("nm",nameParam);
+ }
+
+ if(!StringUtils.isBlank(criteria.getPaymentMethod())) {
+ String payementParam = new StringBuilder().append("%").append(criteria.getPaymentMethod()).append("%").toString();
+ countQ.setParameter("pm",payementParam);
+ objectQ.setParameter("pm",payementParam);
+ }
+
+ if(criteria.getCustomerId()!=null) {
+ countQ.setParameter("cid", criteria.getCustomerId());
+ objectQ.setParameter("cid",criteria.getCustomerId());
+ }
+
+
+ Number count = (Number) countQ.getSingleResult();
+
+ orderList.setTotalCount(count.intValue());
+
+ if(count.intValue()==0)
+ return orderList;
+
+ //TO BE USED
+ int max = criteria.getMaxCount();
+ int first = criteria.getStartIndex();
+
+ objectQ.setFirstResult(first);
+
+
+
+ if(max>0) {
+ int maxCount = first + max;
+
+ if(maxCount < count.intValue()) {
+ objectQ.setMaxResults(maxCount);
+ } else {
+ objectQ.setMaxResults(count.intValue());
+ }
+ }
+
+ orderList.setOrders(objectQ.getResultList());
+
+ return orderList;
+
+
+ }
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/OrderTotalRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/OrderTotalRepository.java
index dc6f9bd..6e5a728 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/OrderTotalRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/order/OrderTotalRepository.java
@@ -1,10 +1,10 @@
-package com.salesmanager.core.business.repositories.order;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import com.salesmanager.core.model.order.OrderTotal;
-
-public interface OrderTotalRepository extends JpaRepository<OrderTotal, Long> {
-
-
-}
+package com.salesmanager.core.business.repositories.order;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import com.salesmanager.core.model.order.OrderTotal;
+
+public interface OrderTotalRepository extends JpaRepository<OrderTotal, Long> {
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/payments/TransactionRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/payments/TransactionRepository.java
index 07b1c29..2e22972 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/payments/TransactionRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/payments/TransactionRepository.java
@@ -1,14 +1,22 @@
-package com.salesmanager.core.business.repositories.payments;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.payments.Transaction;
-
-public interface TransactionRepository extends JpaRepository<Transaction, Long> {
-
- @Query("select t from Transaction t join fetch t.order to where to.id = ?1")
- List<Transaction> findByOrder(Long orderId);
-}
+package com.salesmanager.core.business.repositories.payments;
+
+import java.util.Date;
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.jpa.repository.Temporal;
+import org.springframework.data.repository.query.Param;
+
+import com.salesmanager.core.model.payments.Transaction;
+
+public interface TransactionRepository extends JpaRepository<Transaction, Long> {
+
+ @Query("select t from Transaction t join fetch t.order to where to.id = ?1")
+ List<Transaction> findByOrder(Long orderId);
+
+ @Query("select t from Transaction t join fetch t.order to left join fetch to.orderAttributes toa left join fetch to.orderProducts too left join fetch to.orderTotal toot left join fetch to.orderHistory tood where to is not null and t.transactionDate BETWEEN :from AND :to")
+ List<Transaction> findByDates(
+ @Param("from") @Temporal(javax.persistence.TemporalType.TIMESTAMP) Date startDate,
+ @Param("to") @Temporal(javax.persistence.TemporalType.TIMESTAMP) Date endDate);
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/reference/country/CountryRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/reference/country/CountryRepository.java
index 31e74fe..22b04c5 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/reference/country/CountryRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/reference/country/CountryRepository.java
@@ -1,20 +1,20 @@
-package com.salesmanager.core.business.repositories.reference.country;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.reference.country.Country;
-
-
-public interface CountryRepository extends JpaRepository <Country, Integer> {
-
- @Query("select c from Country c left join fetch c.descriptions cd where c.isoCode=?1")
- Country findByIsoCode(String code);
-
-
- @Query("select c from Country c left join fetch c.descriptions cd where cd.language.id=?1")
- List<Country> listByLanguage(Integer id);
-
-}
+package com.salesmanager.core.business.repositories.reference.country;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.reference.country.Country;
+
+
+public interface CountryRepository extends JpaRepository <Country, Integer> {
+
+ @Query("select c from Country c left join fetch c.descriptions cd where c.isoCode=?1")
+ Country findByIsoCode(String code);
+
+
+ @Query("select c from Country c left join fetch c.descriptions cd where cd.language.id=?1")
+ List<Country> listByLanguage(Integer id);
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/reference/currency/CurrencyRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/reference/currency/CurrencyRepository.java
index 68a952f..b23e9eb 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/reference/currency/CurrencyRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/reference/currency/CurrencyRepository.java
@@ -1,11 +1,11 @@
-package com.salesmanager.core.business.repositories.reference.currency;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import com.salesmanager.core.model.reference.currency.Currency;
-
-public interface CurrencyRepository extends JpaRepository <Currency, Long> {
-
-
- Currency getByCode(String code);
-}
+package com.salesmanager.core.business.repositories.reference.currency;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import com.salesmanager.core.model.reference.currency.Currency;
+
+public interface CurrencyRepository extends JpaRepository <Currency, Long> {
+
+
+ Currency getByCode(String code);
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/reference/language/LanguageRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/reference/language/LanguageRepository.java
index ae53875..9426520 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/reference/language/LanguageRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/reference/language/LanguageRepository.java
@@ -1,14 +1,14 @@
-package com.salesmanager.core.business.repositories.reference.language;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.model.reference.language.Language;
-
-public interface LanguageRepository extends JpaRepository <Language, Integer> {
-
- Language findByCode(String code) throws ServiceException;
-
-
-
-}
+package com.salesmanager.core.business.repositories.reference.language;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.model.reference.language.Language;
+
+public interface LanguageRepository extends JpaRepository <Language, Integer> {
+
+ Language findByCode(String code) throws ServiceException;
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/reference/zone/ZoneRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/reference/zone/ZoneRepository.java
index 0dd7b03..399dc80 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/reference/zone/ZoneRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/reference/zone/ZoneRepository.java
@@ -1,21 +1,21 @@
-package com.salesmanager.core.business.repositories.reference.zone;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.reference.zone.Zone;
-
-public interface ZoneRepository extends JpaRepository<Zone, Long> {
-
-
- Zone findByCode(String code);
-
- @Query("select z from Zone z left join fetch z.descriptions zd where zd.language.id=?1")
- List<Zone> listByLanguage(Integer id);
-
- @Query("select z from Zone z left join fetch z.descriptions zd join fetch z.country zc where zc.isoCode=?1 and zd.language.id=?2")
- List<Zone> listByLanguageAndCountry(String isoCode, Integer languageId);
-
-}
+package com.salesmanager.core.business.repositories.reference.zone;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.reference.zone.Zone;
+
+public interface ZoneRepository extends JpaRepository<Zone, Long> {
+
+
+ Zone findByCode(String code);
+
+ @Query("select z from Zone z left join fetch z.descriptions zd where zd.language.id=?1")
+ List<Zone> listByLanguage(Integer id);
+
+ @Query("select z from Zone z left join fetch z.descriptions zd join fetch z.country zc where zc.isoCode=?1 and zd.language.id=?2")
+ List<Zone> listByLanguageAndCountry(String isoCode, Integer languageId);
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/shipping/ShippingOriginRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/shipping/ShippingOriginRepository.java
index 0b86e5d..d7b0352 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/shipping/ShippingOriginRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/shipping/ShippingOriginRepository.java
@@ -1,12 +1,12 @@
-package com.salesmanager.core.business.repositories.shipping;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.shipping.ShippingOrigin;
-
-public interface ShippingOriginRepository extends JpaRepository<ShippingOrigin, Long> {
-
- @Query("select s from ShippingOrigin as s join fetch s.merchantStore sm where sm.id = ?1")
- ShippingOrigin findByStore(Integer storeId);
-}
+package com.salesmanager.core.business.repositories.shipping;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.shipping.ShippingOrigin;
+
+public interface ShippingOriginRepository extends JpaRepository<ShippingOrigin, Long> {
+
+ @Query("select s from ShippingOrigin as s join fetch s.merchantStore sm where sm.id = ?1")
+ ShippingOrigin findByStore(Integer storeId);
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/shipping/ShippingQuoteRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/shipping/ShippingQuoteRepository.java
new file mode 100644
index 0000000..1273759
--- /dev/null
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/shipping/ShippingQuoteRepository.java
@@ -0,0 +1,16 @@
+package com.salesmanager.core.business.repositories.shipping;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.shipping.Quote;
+
+public interface ShippingQuoteRepository extends JpaRepository<Quote, Long> {
+
+
+ @Query("select q from Quote as q where q.orderId = ?1")
+ List<Quote> findByOrder(Long order);
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/shoppingcart/ShoppingCartAttributeRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/shoppingcart/ShoppingCartAttributeRepository.java
index 88b3288..fa95f87 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/shoppingcart/ShoppingCartAttributeRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/shoppingcart/ShoppingCartAttributeRepository.java
@@ -1,9 +1,9 @@
-package com.salesmanager.core.business.repositories.shoppingcart;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem;
-public interface ShoppingCartAttributeRepository extends JpaRepository<ShoppingCartAttributeItem, Long> {
-
-
-}
+package com.salesmanager.core.business.repositories.shoppingcart;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem;
+public interface ShoppingCartAttributeRepository extends JpaRepository<ShoppingCartAttributeItem, Long> {
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/shoppingcart/ShoppingCartItemRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/shoppingcart/ShoppingCartItemRepository.java
index 0ba984b..4d7655a 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/shoppingcart/ShoppingCartItemRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/shoppingcart/ShoppingCartItemRepository.java
@@ -1,9 +1,9 @@
-package com.salesmanager.core.business.repositories.shoppingcart;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
-public interface ShoppingCartItemRepository extends JpaRepository<ShoppingCartItem, Long> {
-
-
-}
+package com.salesmanager.core.business.repositories.shoppingcart;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
+public interface ShoppingCartItemRepository extends JpaRepository<ShoppingCartItem, Long> {
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/shoppingcart/ShoppingCartRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/shoppingcart/ShoppingCartRepository.java
index a89f158..2e0d8c8 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/shoppingcart/ShoppingCartRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/shoppingcart/ShoppingCartRepository.java
@@ -1,24 +1,24 @@
-package com.salesmanager.core.business.repositories.shoppingcart;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.shoppingcart.ShoppingCart;
-public interface ShoppingCartRepository extends JpaRepository<ShoppingCart, Long> {
-
- @Query("select c from ShoppingCart c left join fetch c.lineItems cl left join fetch cl.attributes cla join fetch c.merchantStore cm where c.id = ?1")
- ShoppingCart findOne(Long id);
-
- @Query("select c from ShoppingCart c left join fetch c.lineItems cl left join fetch cl.attributes cla join fetch c.merchantStore cm where c.shoppingCartCode = ?1")
- ShoppingCart findByCode(String code);
-
- @Query("select c from ShoppingCart c left join fetch c.lineItems cl left join fetch cl.attributes cla join fetch c.merchantStore cm where cm.id = ?1 and c.id = ?2")
- ShoppingCart findById(Integer merchantId, Long id);
-
- @Query("select c from ShoppingCart c left join fetch c.lineItems cl left join fetch cl.attributes cla join fetch c.merchantStore cm where cm.id = ?1 and c.shoppingCartCode = ?2")
- ShoppingCart findByCode(Integer merchantId, String code);
-
- @Query("select c from ShoppingCart c left join fetch c.lineItems cl left join fetch cl.attributes cla join fetch c.merchantStore cm where c.customerId = ?1")
- ShoppingCart findByCustomer(Long customerId);
-
-}
+package com.salesmanager.core.business.repositories.shoppingcart;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.shoppingcart.ShoppingCart;
+public interface ShoppingCartRepository extends JpaRepository<ShoppingCart, Long> {
+
+ @Query("select c from ShoppingCart c left join fetch c.lineItems cl left join fetch cl.attributes cla join fetch c.merchantStore cm where c.id = ?1")
+ ShoppingCart findOne(Long id);
+
+ @Query("select c from ShoppingCart c left join fetch c.lineItems cl left join fetch cl.attributes cla join fetch c.merchantStore cm where c.shoppingCartCode = ?1")
+ ShoppingCart findByCode(String code);
+
+ @Query("select c from ShoppingCart c left join fetch c.lineItems cl left join fetch cl.attributes cla join fetch c.merchantStore cm where cm.id = ?1 and c.id = ?2")
+ ShoppingCart findById(Integer merchantId, Long id);
+
+ @Query("select c from ShoppingCart c left join fetch c.lineItems cl left join fetch cl.attributes cla join fetch c.merchantStore cm where cm.id = ?1 and c.shoppingCartCode = ?2")
+ ShoppingCart findByCode(Integer merchantId, String code);
+
+ @Query("select c from ShoppingCart c left join fetch c.lineItems cl left join fetch cl.attributes cla join fetch c.merchantStore cm where c.customerId = ?1")
+ ShoppingCart findByCustomer(Long customerId);
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/CustomerOptinRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/CustomerOptinRepository.java
index b418d7a..90d9031 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/CustomerOptinRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/CustomerOptinRepository.java
@@ -1,14 +1,14 @@
-package com.salesmanager.core.business.repositories.system;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.system.optin.CustomerOptin;
-
-public interface CustomerOptinRepository extends JpaRepository<CustomerOptin, Long> {
-
- @Query("select distinct c from CustomerOptin as c left join fetch c.optin o join fetch o.merchant om where om.id = ?1 and o.code = ?2")
- List<CustomerOptin> findByCode(Integer storeId, String code);
-}
+package com.salesmanager.core.business.repositories.system;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.system.optin.CustomerOptin;
+
+public interface CustomerOptinRepository extends JpaRepository<CustomerOptin, Long> {
+
+ @Query("select distinct c from CustomerOptin as c left join fetch c.optin o join fetch o.merchant om where om.id = ?1 and o.code = ?2")
+ List<CustomerOptin> findByCode(Integer storeId, String code);
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/MerchantConfigurationRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/MerchantConfigurationRepository.java
index b3c67d1..b32458c 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/MerchantConfigurationRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/MerchantConfigurationRepository.java
@@ -1,25 +1,25 @@
-package com.salesmanager.core.business.repositories.system;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.system.MerchantConfiguration;
-import com.salesmanager.core.model.system.MerchantConfigurationType;
-
-public interface MerchantConfigurationRepository extends JpaRepository<MerchantConfiguration, Long> {
-
- //List<MerchantConfiguration> findByModule(String moduleName);
-
- //MerchantConfiguration findByCode(String code);
-
- @Query("select m from MerchantConfiguration m join fetch m.merchantStore ms where ms.id=?1")
- List<MerchantConfiguration> findByMerchantStore(Integer id);
-
- @Query("select m from MerchantConfiguration m join fetch m.merchantStore ms where ms.id=?1 and m.key=?2")
- MerchantConfiguration findByMerchantStoreAndKey(Integer id, String key);
-
- @Query("select m from MerchantConfiguration m join fetch m.merchantStore ms where ms.id=?1 and m.merchantConfigurationType=?2")
- List<MerchantConfiguration> findByMerchantStoreAndType(Integer id, MerchantConfigurationType type);
-}
+package com.salesmanager.core.business.repositories.system;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.system.MerchantConfiguration;
+import com.salesmanager.core.model.system.MerchantConfigurationType;
+
+public interface MerchantConfigurationRepository extends JpaRepository<MerchantConfiguration, Long> {
+
+ //List<MerchantConfiguration> findByModule(String moduleName);
+
+ //MerchantConfiguration findByCode(String code);
+
+ @Query("select m from MerchantConfiguration m join fetch m.merchantStore ms where ms.id=?1")
+ List<MerchantConfiguration> findByMerchantStore(Integer id);
+
+ @Query("select m from MerchantConfiguration m join fetch m.merchantStore ms where ms.id=?1 and m.key=?2")
+ MerchantConfiguration findByMerchantStoreAndKey(Integer id, String key);
+
+ @Query("select m from MerchantConfiguration m join fetch m.merchantStore ms where ms.id=?1 and m.merchantConfigurationType=?2")
+ List<MerchantConfiguration> findByMerchantStoreAndType(Integer id, MerchantConfigurationType type);
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/MerchantLogRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/MerchantLogRepository.java
index 0b6bd7f..d7b6b2e 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/MerchantLogRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/MerchantLogRepository.java
@@ -1,13 +1,13 @@
-package com.salesmanager.core.business.repositories.system;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.system.MerchantLog;
-
-public interface MerchantLogRepository extends JpaRepository<MerchantLog, Long> {
-
- public List<MerchantLog> findByStore(MerchantStore store);
-}
+package com.salesmanager.core.business.repositories.system;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.system.MerchantLog;
+
+public interface MerchantLogRepository extends JpaRepository<MerchantLog, Long> {
+
+ public List<MerchantLog> findByStore(MerchantStore store);
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/ModuleConfigurationRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/ModuleConfigurationRepository.java
index 88567fe..8dc1b90 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/ModuleConfigurationRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/ModuleConfigurationRepository.java
@@ -1,16 +1,16 @@
-package com.salesmanager.core.business.repositories.system;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import com.salesmanager.core.model.system.IntegrationModule;
-
-public interface ModuleConfigurationRepository extends JpaRepository<IntegrationModule, Long> {
-
- List<IntegrationModule> findByModule(String moduleName);
-
- IntegrationModule findByCode(String code);
-
-
-}
+package com.salesmanager.core.business.repositories.system;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import com.salesmanager.core.model.system.IntegrationModule;
+
+public interface ModuleConfigurationRepository extends JpaRepository<IntegrationModule, Long> {
+
+ List<IntegrationModule> findByModule(String moduleName);
+
+ IntegrationModule findByCode(String code);
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/OptinRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/OptinRepository.java
index d693f02..3fa28ef 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/OptinRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/OptinRepository.java
@@ -1,14 +1,14 @@
-package com.salesmanager.core.business.repositories.system;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.system.optin.Optin;
-
-public interface OptinRepository extends JpaRepository<Optin, Long> {
-
- @Query("select distinct o from Optin as o left join fetch o.merchant om where om.id = ?1")
- List<Optin> findByMerchant(Integer storeId);
-}
+package com.salesmanager.core.business.repositories.system;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.system.optin.Optin;
+
+public interface OptinRepository extends JpaRepository<Optin, Long> {
+
+ @Query("select distinct o from Optin as o left join fetch o.merchant om where om.id = ?1")
+ List<Optin> findByMerchant(Integer storeId);
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/SystemConfigurationRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/SystemConfigurationRepository.java
index f96fb76..9958eb6 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/SystemConfigurationRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/SystemConfigurationRepository.java
@@ -1,12 +1,12 @@
-package com.salesmanager.core.business.repositories.system;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import com.salesmanager.core.model.system.SystemConfiguration;
-
-public interface SystemConfigurationRepository extends JpaRepository<SystemConfiguration, Long> {
-
-
- SystemConfiguration findByKey(String key);
-
-}
+package com.salesmanager.core.business.repositories.system;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import com.salesmanager.core.model.system.SystemConfiguration;
+
+public interface SystemConfigurationRepository extends JpaRepository<SystemConfiguration, Long> {
+
+
+ SystemConfiguration findByKey(String key);
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/SystemNotificationRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/SystemNotificationRepository.java
index d28a95c..c92308a 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/SystemNotificationRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/system/SystemNotificationRepository.java
@@ -1,10 +1,10 @@
-package com.salesmanager.core.business.repositories.system;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-
-import com.salesmanager.core.model.system.SystemNotification;
-
-public interface SystemNotificationRepository extends JpaRepository<SystemNotification, Long> {
-
-
-}
+package com.salesmanager.core.business.repositories.system;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import com.salesmanager.core.model.system.SystemNotification;
+
+public interface SystemNotificationRepository extends JpaRepository<SystemNotification, Long> {
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/tax/TaxClassRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/tax/TaxClassRepository.java
index ad03a98..f29b173 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/tax/TaxClassRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/tax/TaxClassRepository.java
@@ -1,21 +1,21 @@
-package com.salesmanager.core.business.repositories.tax;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.tax.taxclass.TaxClass;
-
-public interface TaxClassRepository extends JpaRepository<TaxClass, Long> {
-
- @Query("select t from TaxClass t join fetch t.merchantStore tm where tm.id=?1")
- List<TaxClass> findByStore(Integer id);
-
- @Query("select t from TaxClass t join fetch t.merchantStore tm where t.code=?1")
- TaxClass findByCode(String code);
-
- @Query("select t from TaxClass t join fetch t.merchantStore tm where tm.id=?1 and t.code=?2")
- TaxClass findByStoreAndCode(Integer id, String code);
-
-}
+package com.salesmanager.core.business.repositories.tax;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.tax.taxclass.TaxClass;
+
+public interface TaxClassRepository extends JpaRepository<TaxClass, Long> {
+
+ @Query("select t from TaxClass t join fetch t.merchantStore tm where tm.id=?1")
+ List<TaxClass> findByStore(Integer id);
+
+ @Query("select t from TaxClass t join fetch t.merchantStore tm where t.code=?1")
+ TaxClass findByCode(String code);
+
+ @Query("select t from TaxClass t join fetch t.merchantStore tm where tm.id=?1 and t.code=?2")
+ TaxClass findByStoreAndCode(Integer id, String code);
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/tax/TaxRateRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/tax/TaxRateRepository.java
index 6cf4928..089f42b 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/tax/TaxRateRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/tax/TaxRateRepository.java
@@ -1,31 +1,31 @@
-package com.salesmanager.core.business.repositories.tax;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.tax.taxrate.TaxRate;
-
-public interface TaxRateRepository extends JpaRepository<TaxRate, Long> {
-
- @Query("select t from TaxRate t join fetch t.taxClass join fetch t.merchantStore tm join fetch t.country left join fetch t.zone left join fetch t.descriptions left join t.parent where tm.id=?1 order by t.taxPriority asc")
- List<TaxRate> findByStore(Integer id);
-
- @Query("select t from TaxRate t join fetch t.taxClass join fetch t.merchantStore tm join fetch t.country left join fetch t.zone left join fetch t.descriptions td left join t.parent where tm.id=?1 and td.language.id=?2 order by t.taxPriority asc")
- List<TaxRate> findByStoreAndLanguage(Integer id, Integer languageId);
-
- @Query("select t from TaxRate t join fetch t.taxClass join fetch t.merchantStore tm join fetch t.country left join fetch t.zone left join fetch t.descriptions td left join t.parent where tm.id=?1 and t.code=?2")
- TaxRate findByStoreAndCode(Integer id, String code);
-
- @Query("select t from TaxRate t join fetch t.taxClass join fetch t.merchantStore tm join fetch t.country left join fetch t.zone left join fetch t.descriptions td left join t.parent where t.id=?1")
- TaxRate findOne(Long id);
-
- @Query("select t from TaxRate t join fetch t.taxClass join fetch t.merchantStore tm join fetch t.country tc left join fetch t.zone tz left join fetch t.descriptions td left join t.parent where tm.id=?1 AND (tz.id=?2 OR tz IS NULL) and tc.id=?3 and td.language.id=?4 order by t.taxPriority asc")
- List<TaxRate> findByMerchantAndZoneAndCountryAndLanguage(Integer id, Long zoneId, Integer countryId, Integer languageId);
-
- @Query("select t from TaxRate t join fetch t.taxClass join fetch t.merchantStore tm join fetch t.country tc left join fetch t.zone tz left join fetch t.descriptions td left join t.parent where tm.id=?1 AND t.stateProvince=?2 and tc.id=?3 and td.language.id=?4 order by t.taxPriority asc")
- List<TaxRate> findByMerchantAndProvinceAndCountryAndLanguage(Integer id, String province, Integer countryId, Integer languageId);
-
-
-}
+package com.salesmanager.core.business.repositories.tax;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.tax.taxrate.TaxRate;
+
+public interface TaxRateRepository extends JpaRepository<TaxRate, Long> {
+
+ @Query("select t from TaxRate t join fetch t.taxClass join fetch t.merchantStore tm join fetch t.country left join fetch t.zone left join fetch t.descriptions left join t.parent where tm.id=?1 order by t.taxPriority asc")
+ List<TaxRate> findByStore(Integer id);
+
+ @Query("select t from TaxRate t join fetch t.taxClass join fetch t.merchantStore tm join fetch t.country left join fetch t.zone left join fetch t.descriptions td left join t.parent where tm.id=?1 and td.language.id=?2 order by t.taxPriority asc")
+ List<TaxRate> findByStoreAndLanguage(Integer id, Integer languageId);
+
+ @Query("select t from TaxRate t join fetch t.taxClass join fetch t.merchantStore tm join fetch t.country left join fetch t.zone left join fetch t.descriptions td left join t.parent where tm.id=?1 and t.code=?2")
+ TaxRate findByStoreAndCode(Integer id, String code);
+
+ @Query("select t from TaxRate t join fetch t.taxClass join fetch t.merchantStore tm join fetch t.country left join fetch t.zone left join fetch t.descriptions td left join t.parent where t.id=?1")
+ TaxRate findOne(Long id);
+
+ @Query("select t from TaxRate t join fetch t.taxClass join fetch t.merchantStore tm join fetch t.country tc left join fetch t.zone tz left join fetch t.descriptions td left join t.parent where tm.id=?1 AND (tz.id=?2 OR tz IS NULL) and tc.id=?3 and td.language.id=?4 order by t.taxPriority asc")
+ List<TaxRate> findByMerchantAndZoneAndCountryAndLanguage(Integer id, Long zoneId, Integer countryId, Integer languageId);
+
+ @Query("select t from TaxRate t join fetch t.taxClass join fetch t.merchantStore tm join fetch t.country tc left join fetch t.zone tz left join fetch t.descriptions td left join t.parent where tm.id=?1 AND t.stateProvince=?2 and tc.id=?3 and td.language.id=?4 order by t.taxPriority asc")
+ List<TaxRate> findByMerchantAndProvinceAndCountryAndLanguage(Integer id, String province, Integer countryId, Integer languageId);
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/user/GroupRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/user/GroupRepository.java
index a498233..c136e4f 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/user/GroupRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/user/GroupRepository.java
@@ -1,28 +1,30 @@
-package com.salesmanager.core.business.repositories.user;
-
-import java.util.List;
-import java.util.Set;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.user.Group;
-import com.salesmanager.core.model.user.GroupType;
-
-public interface GroupRepository extends JpaRepository<Group, Integer> {
-
-
- Group findById(Long id);
-
- @Query("select distinct g from Group as g join fetch g.permissions perms order by g.id")
- List<Group> findAll();
-
- @Query("select distinct g from Group as g join fetch g.permissions perms where perms.id in (?1) ")
- List<Group> findByPermissions(Set<Integer> permissionIds);
-
- @Query("select distinct g from Group as g join fetch g.permissions perms where g.id in (?1) ")
- List<Group> findByIds(Set<Integer> groupIds);
-
- @Query("select distinct g from Group as g join fetch g.permissions perms where g.groupType = ?1")
- List<Group> findByType(GroupType type);
-}
+package com.salesmanager.core.business.repositories.user;
+
+import java.util.List;
+import java.util.Set;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.user.Group;
+import com.salesmanager.core.model.user.GroupType;
+
+public interface GroupRepository extends JpaRepository<Group, Integer> {
+
+
+ Group findById(Long id);
+
+ @Query("select distinct g from Group as g left join fetch g.permissions perms order by g.id")
+ List<Group> findAll();
+
+ @Query("select distinct g from Group as g left join fetch g.permissions perms where perms.id in (?1) ")
+ List<Group> findByPermissions(Set<Integer> permissionIds);
+
+ @Query("select distinct g from Group as g left join fetch g.permissions perms where g.id in (?1) ")
+ List<Group> findByIds(Set<Integer> groupIds);
+
+ @Query("select distinct g from Group as g left join fetch g.permissions perms where g.groupType = ?1")
+ List<Group> findByType(GroupType type);
+
+ Group findByGroupName(String name);
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/user/PermissionRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/user/PermissionRepository.java
index 4cc66ae..5e8087c 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/user/PermissionRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/user/PermissionRepository.java
@@ -1,22 +1,22 @@
-package com.salesmanager.core.business.repositories.user;
-
-import java.util.List;
-import java.util.Set;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.user.Permission;
-
-public interface PermissionRepository extends JpaRepository<Permission, Integer>, PermissionRepositoryCustom {
-
-
- @Query("select p from Permission as p where p.id = ?1")
- Permission findOne(Integer id);
-
- @Query("select p from Permission as p order by p.id")
- List<Permission> findAll();
-
- @Query("select distinct p from Permission as p join fetch p.groups groups where groups.id in (?1)")
- List<Permission> findByGroups(Set<Integer> groupIds);
-}
+package com.salesmanager.core.business.repositories.user;
+
+import java.util.List;
+import java.util.Set;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.user.Permission;
+
+public interface PermissionRepository extends JpaRepository<Permission, Integer>, PermissionRepositoryCustom {
+
+
+ @Query("select p from Permission as p where p.id = ?1")
+ Permission findOne(Integer id);
+
+ @Query("select p from Permission as p order by p.id")
+ List<Permission> findAll();
+
+ @Query("select distinct p from Permission as p join fetch p.groups groups where groups.id in (?1)")
+ List<Permission> findByGroups(Set<Integer> groupIds);
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/user/PermissionRepositoryCustom.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/user/PermissionRepositoryCustom.java
index bcce79f..00cdee7 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/user/PermissionRepositoryCustom.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/user/PermissionRepositoryCustom.java
@@ -1,14 +1,14 @@
-package com.salesmanager.core.business.repositories.user;
-
-import com.salesmanager.core.model.user.PermissionCriteria;
-import com.salesmanager.core.model.user.PermissionList;
-
-
-
-
-public interface PermissionRepositoryCustom {
-
- PermissionList listByCriteria(PermissionCriteria criteria);
-
-
-}
+package com.salesmanager.core.business.repositories.user;
+
+import com.salesmanager.core.model.user.PermissionCriteria;
+import com.salesmanager.core.model.user.PermissionList;
+
+
+
+
+public interface PermissionRepositoryCustom {
+
+ PermissionList listByCriteria(PermissionCriteria criteria);
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/user/PermissionRepositoryImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/user/PermissionRepositoryImpl.java
index a6a5c7c..22f0932 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/user/PermissionRepositoryImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/user/PermissionRepositoryImpl.java
@@ -1,94 +1,94 @@
-package com.salesmanager.core.business.repositories.user;
-
-import java.util.List;
-
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-
-
-import javax.persistence.Query;
-
-import com.salesmanager.core.model.user.Permission;
-import com.salesmanager.core.model.user.PermissionCriteria;
-import com.salesmanager.core.model.user.PermissionList;
-
-
-public class PermissionRepositoryImpl implements PermissionRepositoryCustom {
-
-
- @PersistenceContext
- private EntityManager em;
-
- @Override
- public PermissionList listByCriteria(PermissionCriteria criteria) {
- PermissionList permissionList = new PermissionList();
-
-
- StringBuilder countBuilderSelect = new StringBuilder();
- countBuilderSelect.append("select count(p) from Permission as p");
-
- StringBuilder countBuilderWhere = new StringBuilder();
-
-
- if(criteria.getGroupIds()!=null && criteria.getGroupIds().size()>0) {
- countBuilderSelect.append(" INNER JOIN p.groups grous");
- countBuilderWhere.append(" where grous.id in (:cid)");
- }
-
-
- Query countQ = em.createQuery(
- countBuilderSelect.toString() + countBuilderWhere.toString());
-
- if(criteria.getGroupIds()!=null && criteria.getGroupIds().size()>0) {
- countQ.setParameter("cid", criteria.getGroupIds());
- }
-
-
- Number count = (Number) countQ.getSingleResult ();
-
- permissionList.setTotalCount(count.intValue());
-
- if(count.intValue()==0)
- return permissionList;
-
-
- StringBuilder qs = new StringBuilder();
- qs.append("select p from Permission as p ");
- qs.append("join fetch p.groups grous ");
-
- if(criteria.getGroupIds()!=null && criteria.getGroupIds().size()>0) {
- qs.append(" where grous.id in (:cid)");
- }
-
- qs.append(" order by p.id asc ");
-
- String hql = qs.toString();
- Query q = em.createQuery(hql);
-
-
- if(criteria.getGroupIds()!=null && criteria.getGroupIds().size()>0) {
- q.setParameter("cid", criteria.getGroupIds());
- }
-
- if(criteria.getMaxCount()>0) {
-
-
- q.setFirstResult(criteria.getStartIndex());
- if(criteria.getMaxCount()<count.intValue()) {
- q.setMaxResults(criteria.getMaxCount());
- permissionList.setTotalCount(criteria.getMaxCount());
- }
- else {
- q.setMaxResults(count.intValue());
- permissionList.setTotalCount(count.intValue());
- }
- }
-
- @SuppressWarnings("unchecked")
- List<Permission> permissions = q.getResultList();
- permissionList.setPermissions(permissions);
-
- return permissionList;
- }
-
-}
+package com.salesmanager.core.business.repositories.user;
+
+import java.util.List;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+
+import javax.persistence.Query;
+
+import com.salesmanager.core.model.user.Permission;
+import com.salesmanager.core.model.user.PermissionCriteria;
+import com.salesmanager.core.model.user.PermissionList;
+
+
+public class PermissionRepositoryImpl implements PermissionRepositoryCustom {
+
+
+ @PersistenceContext
+ private EntityManager em;
+
+ @Override
+ public PermissionList listByCriteria(PermissionCriteria criteria) {
+ PermissionList permissionList = new PermissionList();
+
+
+ StringBuilder countBuilderSelect = new StringBuilder();
+ countBuilderSelect.append("select count(p) from Permission as p");
+
+ StringBuilder countBuilderWhere = new StringBuilder();
+
+
+ if(criteria.getGroupIds()!=null && criteria.getGroupIds().size()>0) {
+ countBuilderSelect.append(" INNER JOIN p.groups grous");
+ countBuilderWhere.append(" where grous.id in (:cid)");
+ }
+
+
+ Query countQ = em.createQuery(
+ countBuilderSelect.toString() + countBuilderWhere.toString());
+
+ if(criteria.getGroupIds()!=null && criteria.getGroupIds().size()>0) {
+ countQ.setParameter("cid", criteria.getGroupIds());
+ }
+
+
+ Number count = (Number) countQ.getSingleResult ();
+
+ permissionList.setTotalCount(count.intValue());
+
+ if(count.intValue()==0)
+ return permissionList;
+
+
+ StringBuilder qs = new StringBuilder();
+ qs.append("select p from Permission as p ");
+ qs.append("join fetch p.groups grous ");
+
+ if(criteria.getGroupIds()!=null && criteria.getGroupIds().size()>0) {
+ qs.append(" where grous.id in (:cid)");
+ }
+
+ qs.append(" order by p.id asc ");
+
+ String hql = qs.toString();
+ Query q = em.createQuery(hql);
+
+
+ if(criteria.getGroupIds()!=null && criteria.getGroupIds().size()>0) {
+ q.setParameter("cid", criteria.getGroupIds());
+ }
+
+ if(criteria.getMaxCount()>0) {
+
+
+ q.setFirstResult(criteria.getStartIndex());
+ if(criteria.getMaxCount()<count.intValue()) {
+ q.setMaxResults(criteria.getMaxCount());
+ permissionList.setTotalCount(criteria.getMaxCount());
+ }
+ else {
+ q.setMaxResults(count.intValue());
+ permissionList.setTotalCount(count.intValue());
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ List<Permission> permissions = q.getResultList();
+ permissionList.setPermissions(permissions);
+
+ return permissionList;
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/repositories/user/UserRepository.java b/sm-core/src/main/java/com/salesmanager/core/business/repositories/user/UserRepository.java
index 528b078..40dbaa5 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/repositories/user/UserRepository.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/repositories/user/UserRepository.java
@@ -1,23 +1,23 @@
-package com.salesmanager.core.business.repositories.user;
-
-import java.util.List;
-
-import org.springframework.data.jpa.repository.JpaRepository;
-import org.springframework.data.jpa.repository.Query;
-
-import com.salesmanager.core.model.user.User;
-
-public interface UserRepository extends JpaRepository<User, Long> {
-
- @Query("select u from User as u inner join fetch u.groups ug inner join fetch u.merchantStore um left join fetch u.defaultLanguage ul where u.adminName = ?1")
- User findByUserName(String userName);
-
- @Query("select u from User as u inner join fetch u.groups ug inner join fetch u.merchantStore um left join fetch u.defaultLanguage ul where u.id = ?1")
- User findOne(Long id);
-
- @Query("select u from User as u inner join fetch u.groups ug inner join fetch u.merchantStore um left join fetch u.defaultLanguage ul order by u.id")
- List<User> findAll();
-
- @Query("select distinct u from User as u inner join fetch u.groups ug inner join fetch u.merchantStore um left join fetch u.defaultLanguage ul where um.id = ?1 order by u.id")
- List<User> findByStore(Integer storeId);
-}
+package com.salesmanager.core.business.repositories.user;
+
+import java.util.List;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import com.salesmanager.core.model.user.User;
+
+public interface UserRepository extends JpaRepository<User, Long> {
+
+ @Query("select u from User as u inner join fetch u.groups ug inner join fetch u.merchantStore um left join fetch u.defaultLanguage ul where u.adminName = ?1")
+ User findByUserName(String userName);
+
+ @Query("select u from User as u inner join fetch u.groups ug inner join fetch u.merchantStore um left join fetch u.defaultLanguage ul where u.id = ?1")
+ User findOne(Long id);
+
+ @Query("select u from User as u inner join fetch u.groups ug inner join fetch u.merchantStore um left join fetch u.defaultLanguage ul order by u.id")
+ List<User> findAll();
+
+ @Query("select distinct u from User as u inner join fetch u.groups ug inner join fetch u.merchantStore um left join fetch u.defaultLanguage ul where um.id = ?1 order by u.id")
+ List<User> findByStore(Integer storeId);
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/category/CategoryService.java b/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/category/CategoryService.java
index d1ef601..504a99d 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/category/CategoryService.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/category/CategoryService.java
@@ -48,6 +48,15 @@ public interface CategoryService extends SalesManagerEntityService<Long, Categor
* @return
*/
List<Category> listByDepth(MerchantStore store, int depth, Language language);
+
+ /**
+ * Returns category hierarchy filter by featured
+ * @param store
+ * @param depth
+ * @param language
+ * @return
+ */
+ List<Category> listByDepthFilterByFeatured(MerchantStore store, int depth, Language language);
List<Category> listByLineage(String storeCode, String lineage)
throws ServiceException;
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/category/CategoryServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/category/CategoryServiceImpl.java
index 7dd7467..2ead66f 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/category/CategoryServiceImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/category/CategoryServiceImpl.java
@@ -361,6 +361,11 @@ public class CategoryServiceImpl extends SalesManagerEntityServiceImpl<Long, Cat
public List<Category> listByDepth(MerchantStore store, int depth, Language language) {
return categoryRepository.findByDepth(store.getId(), depth, language.getId());
}
+
+ @Override
+ public List<Category> listByDepthFilterByFeatured(MerchantStore store, int depth, Language language) {
+ return categoryRepository.findByDepthFilterByFeatured(store.getId(), depth, language.getId());
+ }
@Override
public List<Category> getByName(MerchantStore store, String name, Language language) throws ServiceException {
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/manufacturer/ManufacturerServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/manufacturer/ManufacturerServiceImpl.java
index 0506766..a1bdd1f 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/manufacturer/ManufacturerServiceImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/manufacturer/ManufacturerServiceImpl.java
@@ -81,7 +81,7 @@ public class ManufacturerServiceImpl extends
LOGGER.debug("Creating Manufacturer");
- if(manufacturer.getId()!=null && manufacturer.getId()>0) {
+ if(manufacturer.getId()!=null && manufacturer.getId().longValue()>0) {
super.update(manufacturer);
} else {
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/PricingService.java b/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/PricingService.java
index e3366e7..4a5fbac 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/PricingService.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/PricingService.java
@@ -91,6 +91,15 @@ public interface PricingService {
throws ServiceException;
/**
+ * Converts a String amount to BigDecimal
+ * Takes care of String amount validation
+ * @param amount
+ * @return
+ * @throws ServiceException
+ */
+ BigDecimal getAmount(String amount) throws ServiceException;
+
+ /**
* String format of the money amount without currency symbol
* @param amount
* @param store
@@ -99,4 +108,12 @@ public interface PricingService {
*/
String getStringAmount(BigDecimal amount, MerchantStore store)
throws ServiceException;
+
+ /**
+ * Method for calculating sub total
+ * @param price
+ * @param quantity
+ * @return
+ */
+ BigDecimal calculatePriceQuantity(BigDecimal price, int quantity);
}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/PricingServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/PricingServiceImpl.java
index d2b4e86..5e955af 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/PricingServiceImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/PricingServiceImpl.java
@@ -54,6 +54,11 @@ public class PricingServiceImpl implements PricingService {
/** TODO add rules for price calculation **/
return priceUtil.getFinalProductPrice(product, attributes);
}
+
+ @Override
+ public BigDecimal calculatePriceQuantity(BigDecimal price, int quantity) {
+ return price.multiply(new BigDecimal(quantity));
+ }
@Override
public String getDisplayAmount(BigDecimal amount, MerchantStore store) throws ServiceException {
@@ -90,6 +95,18 @@ public class PricingServiceImpl implements PricingService {
}
}
+ @Override
+ public BigDecimal getAmount(String amount) throws ServiceException {
+
+ try {
+ return priceUtil.getAmount(amount);
+ } catch (Exception e) {
+ LOGGER.error("An error occured when trying to format an amount " + amount);
+ throw new ServiceException(e);
+ }
+
+ }
+
}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/ProductServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/ProductServiceImpl.java
index a4730e9..cd25240 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/ProductServiceImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/ProductServiceImpl.java
@@ -147,7 +147,9 @@ public class ProductServiceImpl extends SalesManagerEntityServiceImpl<Long, Prod
public Product getProductForLocale(long productId, Language language, Locale locale)
throws ServiceException {
Product product = productRepository.getProductForLocale(productId, language, locale);
-
+ if(product==null) {
+ return null;
+ }
CatalogServiceHelper.setToAvailability(product, locale);
CatalogServiceHelper.setToLanguage(product, language.getId());
@@ -270,9 +272,15 @@ public class ProductServiceImpl extends SalesManagerEntityServiceImpl<Long, Prod
}
/** save product first **/
- super.save(product);
-
+ if(product.getId()!=null && product.getId()>0) {
+ super.update(product);
+ } else {
+
+ super.create(product);
+
+ }
+
/**
* Image creation needs extra service to save the file in the CMS
*/
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/review/ProductReviewServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/review/ProductReviewServiceImpl.java
index ba8ffa4..ed16962 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/review/ProductReviewServiceImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/catalog/product/review/ProductReviewServiceImpl.java
@@ -5,6 +5,7 @@ import java.util.List;
import javax.inject.Inject;
+import org.apache.commons.lang.Validate;
import org.springframework.stereotype.Service;
import com.salesmanager.core.business.exception.ServiceException;
@@ -54,9 +55,13 @@ public class ProductReviewServiceImpl extends
return productReviewRepository.findByProduct(product.getId(), language.getId());
}
- public void create(ProductReview review) throws ServiceException {
+ private void saveOrUpdate(ProductReview review) throws ServiceException {
+
+
+ Validate.notNull(review,"ProductReview cannot be null");
+ Validate.notNull(review.getProduct(),"ProductReview.product cannot be null");
+ Validate.notNull(review.getCustomer(),"ProductReview.customer cannot be null");
- //adjust score
//refresh product
Product product = productService.getById(review.getProduct().getId());
@@ -85,10 +90,20 @@ public class ProductReviewServiceImpl extends
product.setProductReviewAvg(new BigDecimal(avg));
product.setProductReviewCount(count);
- super.create(review);
+ super.save(review);
productService.update(product);
+ review.setProduct(product);
+
+ }
+
+ public void update(ProductReview review) throws ServiceException {
+ this.saveOrUpdate(review);
+ }
+
+ public void create(ProductReview review) throws ServiceException {
+ this.saveOrUpdate(review);
}
/* (non-Javadoc)
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/common/generic/SalesManagerEntityService.java b/sm-core/src/main/java/com/salesmanager/core/business/services/common/generic/SalesManagerEntityService.java
index 1255318..863a6e6 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/common/generic/SalesManagerEntityService.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/common/generic/SalesManagerEntityService.java
@@ -1,76 +1,76 @@
-package com.salesmanager.core.business.services.common.generic;
-
-import java.io.Serializable;
-import java.util.List;
-
-import com.salesmanager.core.business.exception.ServiceException;
-
-
-/**
- * <p>Service racine pour la gestion des entités.</p>
- *
- * @param <T> type d'entité
- */
-public interface SalesManagerEntityService<K extends Serializable & Comparable<K>, E extends com.salesmanager.core.model.generic.SalesManagerEntity<K, ?>> extends TransactionalAspectAwareService{
-
- /**
- * Crée l'entité dans la base de données. Mis à part dans les tests pour faire des sauvegardes simples, utiliser
- * create() car il est possible qu'il y ait des listeners sur la création d'une entité.
- *
- * @param entity entité
- */
- void save(E entity) throws ServiceException;
-
- /**
- * Met à jour l'entité dans la base de données.
- *
- * @param entity entité
- */
- void update(E entity) throws ServiceException;
-
- /**
- * Crée l'entité dans la base de données.
- *
- * @param entity entité
- */
- void create(E entity) throws ServiceException;
-
- /**
- * Supprime l'entité de la base de données
- *
- * @param entity entité
- */
- void delete(E entity) throws ServiceException;
-
-
- /**
- * Retourne une entité à partir de son id.
- *
- * @param id identifiant
- * @return entité
- */
- E getById(K id);
-
- /**
- * Renvoie la liste de l'ensemble des entités de ce type.
- *
- * @return liste d'entités
- */
- List<E> list();
-
-
- /**
- * Compte le nombre d'entités de ce type présentes dans la base.
- *
- * @return nombre d'entités
- */
- Long count();
-
- /**
- * Flushe la session.
- */
- void flush();
-
-
-
-}
+package com.salesmanager.core.business.services.common.generic;
+
+import java.io.Serializable;
+import java.util.List;
+
+import com.salesmanager.core.business.exception.ServiceException;
+
+
+/**
+ * <p>Service racine pour la gestion des entités.</p>
+ *
+ * @param <T> type d'entité
+ */
+public interface SalesManagerEntityService<K extends Serializable & Comparable<K>, E extends com.salesmanager.core.model.generic.SalesManagerEntity<K, ?>> extends TransactionalAspectAwareService{
+
+ /**
+ * Crée l'entité dans la base de données. Mis à part dans les tests pour faire des sauvegardes simples, utiliser
+ * create() car il est possible qu'il y ait des listeners sur la création d'une entité.
+ *
+ * @param entity entité
+ */
+ void save(E entity) throws ServiceException;
+
+ /**
+ * Met à jour l'entité dans la base de données.
+ *
+ * @param entity entité
+ */
+ void update(E entity) throws ServiceException;
+
+ /**
+ * Crée l'entité dans la base de données.
+ *
+ * @param entity entité
+ */
+ void create(E entity) throws ServiceException;
+
+ /**
+ * Supprime l'entité de la base de données
+ *
+ * @param entity entité
+ */
+ void delete(E entity) throws ServiceException;
+
+
+ /**
+ * Retourne une entité à partir de son id.
+ *
+ * @param id identifiant
+ * @return entité
+ */
+ E getById(K id);
+
+ /**
+ * Renvoie la liste de l'ensemble des entités de ce type.
+ *
+ * @return liste d'entités
+ */
+ List<E> list();
+
+
+ /**
+ * Compte le nombre d'entités de ce type présentes dans la base.
+ *
+ * @return nombre d'entités
+ */
+ Long count();
+
+ /**
+ * Flushe la session.
+ */
+ void flush();
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/customer/CustomerService.java b/sm-core/src/main/java/com/salesmanager/core/business/services/customer/CustomerService.java
index e1733de..f4f52cf 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/customer/CustomerService.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/customer/CustomerService.java
@@ -1,40 +1,40 @@
-package com.salesmanager.core.business.services.customer;
-
-
-import java.util.List;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.common.generic.SalesManagerEntityService;
-import com.salesmanager.core.model.common.Address;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.customer.CustomerCriteria;
-import com.salesmanager.core.model.customer.CustomerList;
-import com.salesmanager.core.model.merchant.MerchantStore;
-
-
-
-public interface CustomerService extends SalesManagerEntityService<Long, Customer> {
-
- public List<Customer> getByName(String firstName);
-
- List<Customer> listByStore(MerchantStore store);
-
- Customer getByNick(String nick);
- void saveOrUpdate(Customer customer) throws ServiceException ;
-
- CustomerList listByStore(MerchantStore store, CustomerCriteria criteria);
-
- Customer getByNick(String nick, int storeId);
-
- /**
- * Return an {@link com.salesmanager.core.business.common.model.Address} object from the client IP address. Uses underlying GeoLocation module
- * @param store
- * @param ipAddress
- * @return
- * @throws ServiceException
- */
- Address getCustomerAddress(MerchantStore store, String ipAddress)
- throws ServiceException;
-
-
-}
+package com.salesmanager.core.business.services.customer;
+
+
+import java.util.List;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.common.generic.SalesManagerEntityService;
+import com.salesmanager.core.model.common.Address;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.customer.CustomerCriteria;
+import com.salesmanager.core.model.customer.CustomerList;
+import com.salesmanager.core.model.merchant.MerchantStore;
+
+
+
+public interface CustomerService extends SalesManagerEntityService<Long, Customer> {
+
+ public List<Customer> getByName(String firstName);
+
+ List<Customer> listByStore(MerchantStore store);
+
+ Customer getByNick(String nick);
+ void saveOrUpdate(Customer customer) throws ServiceException ;
+
+ CustomerList listByStore(MerchantStore store, CustomerCriteria criteria);
+
+ Customer getByNick(String nick, int storeId);
+
+ /**
+ * Return an {@link com.salesmanager.core.business.common.model.Address} object from the client IP address. Uses underlying GeoLocation module
+ * @param store
+ * @param ipAddress
+ * @return
+ * @throws ServiceException
+ */
+ Address getCustomerAddress(MerchantStore store, String ipAddress)
+ throws ServiceException;
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/customer/CustomerServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/customer/CustomerServiceImpl.java
index ee6eb94..6f5d0c2 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/customer/CustomerServiceImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/customer/CustomerServiceImpl.java
@@ -1,115 +1,115 @@
-package com.salesmanager.core.business.services.customer;
-
-import java.util.List;
-
-import javax.inject.Inject;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.repositories.customer.CustomerRepository;
-import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl;
-import com.salesmanager.core.business.services.customer.attribute.CustomerAttributeService;
-import com.salesmanager.core.model.common.Address;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.customer.CustomerCriteria;
-import com.salesmanager.core.model.customer.CustomerList;
-import com.salesmanager.core.model.customer.attribute.CustomerAttribute;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.modules.utils.GeoLocation;
-
-
-
-@Service("customerService")
-public class CustomerServiceImpl extends SalesManagerEntityServiceImpl<Long, Customer> implements CustomerService {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(CustomerServiceImpl.class);
-
- private CustomerRepository customerRepository;
-
- @Inject
- private CustomerAttributeService customerAttributeService;
-
- @Inject
- private GeoLocation geoLocation;
-
-
- @Inject
- public CustomerServiceImpl(CustomerRepository customerRepository) {
- super(customerRepository);
- this.customerRepository = customerRepository;
- }
-
- @Override
- public List<Customer> getByName(String firstName) {
- return customerRepository.findByName(firstName);
- }
-
- @Override
- public Customer getById(Long id) {
- return customerRepository.findOne(id);
- }
-
- @Override
- public Customer getByNick(String nick) {
- return customerRepository.findByNick(nick);
- }
-
- @Override
- public Customer getByNick(String nick, int storeId) {
- return customerRepository.findByNick(nick, storeId);
- }
-
- @Override
- public List<Customer> listByStore(MerchantStore store) {
- return customerRepository.findByStore(store.getId());
- }
-
- @Override
- public CustomerList listByStore(MerchantStore store, CustomerCriteria criteria) {
- return customerRepository.listByStore(store,criteria);
- }
-
- @Override
- public Address getCustomerAddress(MerchantStore store, String ipAddress) throws ServiceException {
-
- try {
- return geoLocation.getAddress(ipAddress);
- } catch(Exception e) {
- throw new ServiceException(e);
- }
-
- }
-
- @Override
- public void saveOrUpdate(Customer customer) throws ServiceException {
-
- LOGGER.debug("Creating Customer");
-
- if(customer.getId()!=null && customer.getId()>0) {
- super.update(customer);
- } else {
-
- super.create(customer);
-
- }
- }
-
- public void delete(Customer customer) throws ServiceException {
- customer = getById(customer.getId());
-
- //delete attributes
- List<CustomerAttribute> attributes =customerAttributeService.getByCustomer(customer.getMerchantStore(), customer);
- if(attributes!=null) {
- for(CustomerAttribute attribute : attributes) {
- customerAttributeService.delete(attribute);
- }
- }
- customerRepository.delete(customer);
-
- }
-
-
-}
+package com.salesmanager.core.business.services.customer;
+
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.repositories.customer.CustomerRepository;
+import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl;
+import com.salesmanager.core.business.services.customer.attribute.CustomerAttributeService;
+import com.salesmanager.core.model.common.Address;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.customer.CustomerCriteria;
+import com.salesmanager.core.model.customer.CustomerList;
+import com.salesmanager.core.model.customer.attribute.CustomerAttribute;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.modules.utils.GeoLocation;
+
+
+
+@Service("customerService")
+public class CustomerServiceImpl extends SalesManagerEntityServiceImpl<Long, Customer> implements CustomerService {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(CustomerServiceImpl.class);
+
+ private CustomerRepository customerRepository;
+
+ @Inject
+ private CustomerAttributeService customerAttributeService;
+
+ @Inject
+ private GeoLocation geoLocation;
+
+
+ @Inject
+ public CustomerServiceImpl(CustomerRepository customerRepository) {
+ super(customerRepository);
+ this.customerRepository = customerRepository;
+ }
+
+ @Override
+ public List<Customer> getByName(String firstName) {
+ return customerRepository.findByName(firstName);
+ }
+
+ @Override
+ public Customer getById(Long id) {
+ return customerRepository.findOne(id);
+ }
+
+ @Override
+ public Customer getByNick(String nick) {
+ return customerRepository.findByNick(nick);
+ }
+
+ @Override
+ public Customer getByNick(String nick, int storeId) {
+ return customerRepository.findByNick(nick, storeId);
+ }
+
+ @Override
+ public List<Customer> listByStore(MerchantStore store) {
+ return customerRepository.findByStore(store.getId());
+ }
+
+ @Override
+ public CustomerList listByStore(MerchantStore store, CustomerCriteria criteria) {
+ return customerRepository.listByStore(store,criteria);
+ }
+
+ @Override
+ public Address getCustomerAddress(MerchantStore store, String ipAddress) throws ServiceException {
+
+ try {
+ return geoLocation.getAddress(ipAddress);
+ } catch(Exception e) {
+ throw new ServiceException(e);
+ }
+
+ }
+
+ @Override
+ public void saveOrUpdate(Customer customer) throws ServiceException {
+
+ LOGGER.debug("Creating Customer");
+
+ if(customer.getId()!=null && customer.getId()>0) {
+ super.update(customer);
+ } else {
+
+ super.create(customer);
+
+ }
+ }
+
+ public void delete(Customer customer) throws ServiceException {
+ customer = getById(customer.getId());
+
+ //delete attributes
+ List<CustomerAttribute> attributes =customerAttributeService.getByCustomer(customer.getMerchantStore(), customer);
+ if(attributes!=null) {
+ for(CustomerAttribute attribute : attributes) {
+ customerAttributeService.delete(attribute);
+ }
+ }
+ customerRepository.delete(customer);
+
+ }
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/customer/review/CustomerReviewService.java b/sm-core/src/main/java/com/salesmanager/core/business/services/customer/review/CustomerReviewService.java
new file mode 100644
index 0000000..7b5f3eb
--- /dev/null
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/customer/review/CustomerReviewService.java
@@ -0,0 +1,34 @@
+package com.salesmanager.core.business.services.customer.review;
+
+import java.util.List;
+
+import com.salesmanager.core.business.services.common.generic.SalesManagerEntityService;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.customer.review.CustomerReview;
+
+public interface CustomerReviewService extends
+ SalesManagerEntityService<Long, CustomerReview> {
+
+ /**
+ * All reviews created by a given customer
+ * @param customer
+ * @return
+ */
+ List<CustomerReview> getByCustomer(Customer customer);
+
+ /**
+ * All reviews received by a given customer
+ * @param customer
+ * @return
+ */
+ List<CustomerReview> getByReviewedCustomer(Customer customer);
+
+ /**
+ * Get a review made by a customer to another customer
+ * @param reviewer
+ * @param reviewed
+ * @return
+ */
+ CustomerReview getByReviewerAndReviewed(Long reviewer, Long reviewed);
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/customer/review/CustomerReviewServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/customer/review/CustomerReviewServiceImpl.java
new file mode 100644
index 0000000..82d6c14
--- /dev/null
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/customer/review/CustomerReviewServiceImpl.java
@@ -0,0 +1,109 @@
+package com.salesmanager.core.business.services.customer.review;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.commons.lang.Validate;
+import org.springframework.stereotype.Service;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.repositories.customer.review.CustomerReviewRepository;
+import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl;
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.customer.review.CustomerReview;
+
+@Service("customerReviewService")
+public class CustomerReviewServiceImpl extends
+ SalesManagerEntityServiceImpl<Long, CustomerReview> implements CustomerReviewService {
+
+ private CustomerReviewRepository customerReviewRepository;
+
+ @Inject
+ private CustomerService customerService;
+
+ @Inject
+ public CustomerReviewServiceImpl(
+ CustomerReviewRepository customerReviewRepository) {
+ super(customerReviewRepository);
+ this.customerReviewRepository = customerReviewRepository;
+ }
+
+
+ private void saveOrUpdate(CustomerReview review) throws ServiceException {
+
+
+ Validate.notNull(review,"CustomerReview cannot be null");
+ Validate.notNull(review.getCustomer(),"CustomerReview.customer cannot be null");
+ Validate.notNull(review.getReviewedCustomer(),"CustomerReview.reviewedCustomer cannot be null");
+
+
+ //refresh customer
+ Customer customer = customerService.getById(review.getReviewedCustomer().getId());
+
+ //ajust product rating
+ Integer count = 0;
+ if(customer.getCustomerReviewCount()!=null) {
+ count = customer.getCustomerReviewCount();
+ }
+
+
+
+
+ BigDecimal averageRating = customer.getCustomerReviewAvg();
+ if(averageRating==null) {
+ averageRating = new BigDecimal(0);
+ }
+ //get reviews
+
+
+ BigDecimal totalRating = averageRating.multiply(new BigDecimal(count));
+ totalRating = totalRating.add(new BigDecimal(review.getReviewRating()));
+
+ count = count + 1;
+ double avg = totalRating.doubleValue() / count.intValue();
+
+ customer.setCustomerReviewAvg(new BigDecimal(avg));
+ customer.setCustomerReviewCount(count);
+ super.save(review);
+
+ customerService.update(customer);
+
+ review.setReviewedCustomer(customer);
+
+
+ }
+
+ public void update(CustomerReview review) throws ServiceException {
+ this.saveOrUpdate(review);
+ }
+
+ public void create(CustomerReview review) throws ServiceException {
+ this.saveOrUpdate(review);
+ }
+
+
+
+ @Override
+ public List<CustomerReview> getByCustomer(Customer customer) {
+ Validate.notNull(customer,"Customer cannot be null");
+ return customerReviewRepository.findByReviewer(customer.getId());
+ }
+
+ @Override
+ public List<CustomerReview> getByReviewedCustomer(Customer customer) {
+ Validate.notNull(customer,"Customer cannot be null");
+ return customerReviewRepository.findByReviewed(customer.getId());
+ }
+
+
+ @Override
+ public CustomerReview getByReviewerAndReviewed(Long reviewer, Long reviewed) {
+ Validate.notNull(reviewer,"Reviewer customer cannot be null");
+ Validate.notNull(reviewed,"Reviewer customer cannot be null");
+ return customerReviewRepository.findByRevieweAndReviewed(reviewer, reviewed);
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/merchant/MerchantStoreService.java b/sm-core/src/main/java/com/salesmanager/core/business/services/merchant/MerchantStoreService.java
index e464095..410672b 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/merchant/MerchantStoreService.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/merchant/MerchantStoreService.java
@@ -1,16 +1,16 @@
-package com.salesmanager.core.business.services.merchant;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.common.generic.SalesManagerEntityService;
-import com.salesmanager.core.model.merchant.MerchantStore;
-
-public interface MerchantStoreService extends SalesManagerEntityService<Integer, MerchantStore>{
-
-
- MerchantStore getMerchantStore(String merchantStoreCode)
- throws ServiceException;
-
- MerchantStore getByCode(String code) throws ServiceException ;
-
- void saveOrUpdate(MerchantStore store) throws ServiceException;
-}
+package com.salesmanager.core.business.services.merchant;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.common.generic.SalesManagerEntityService;
+import com.salesmanager.core.model.merchant.MerchantStore;
+
+public interface MerchantStoreService extends SalesManagerEntityService<Integer, MerchantStore>{
+
+
+ MerchantStore getMerchantStore(String merchantStoreCode)
+ throws ServiceException;
+
+ MerchantStore getByCode(String code) throws ServiceException ;
+
+ void saveOrUpdate(MerchantStore store) throws ServiceException;
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/merchant/MerchantStoreServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/merchant/MerchantStoreServiceImpl.java
index 0106a33..ecb204b 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/merchant/MerchantStoreServiceImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/merchant/MerchantStoreServiceImpl.java
@@ -1,144 +1,141 @@
-package com.salesmanager.core.business.services.merchant;
-
-import java.util.List;
-
-import javax.inject.Inject;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.repositories.merchant.MerchantRepository;
-import com.salesmanager.core.business.services.catalog.product.manufacturer.ManufacturerService;
-import com.salesmanager.core.business.services.catalog.product.type.ProductTypeService;
-import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl;
-import com.salesmanager.core.business.services.tax.TaxClassService;
-import com.salesmanager.core.model.catalog.category.Category;
-import com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.Order;
-import com.salesmanager.core.model.system.MerchantConfiguration;
-import com.salesmanager.core.model.tax.taxclass.TaxClass;
-import com.salesmanager.core.model.user.User;
-
-@Service("merchantService")
-public class MerchantStoreServiceImpl extends SalesManagerEntityServiceImpl<Integer, MerchantStore>
- implements MerchantStoreService {
-
-
-
- @Inject
- protected ProductTypeService productTypeService;
-
- @Inject
- private TaxClassService taxClassService;
-
-/* @Inject
- private ContentService contentService;
-
- @Inject
- private MerchantConfigurationService merchantConfigurationService;
-
- @Inject
- private CategoryService categoryService;
-
- @Inject
- private UserService userService;
-
- @Inject
- private OrderService orderService;
-
- @Inject
- private CustomerService customerService;*/
-
- @Inject
- private ManufacturerService manufacturerService;
-
- private MerchantRepository merchantRepository;
-
- @Inject
- public MerchantStoreServiceImpl(MerchantRepository merchantRepository) {
- super(merchantRepository);
- this.merchantRepository = merchantRepository;
- }
-
-
- public MerchantStore getMerchantStore(String merchantStoreCode) throws ServiceException {
- return merchantRepository.findByCode(merchantStoreCode);
- }
-
- @Override
- public void saveOrUpdate(MerchantStore store) throws ServiceException {
-
- super.save(store);
-
- }
-
-
- @Override
- public MerchantStore getByCode(String code) throws ServiceException {
- return merchantRepository.findByCode(code);
- }
-
- @Override
- public MerchantStore getById(Integer id) {
- return merchantRepository.findById(id);
- }
-/* @Override
- public void delete(MerchantStore merchant) throws ServiceException {
-
- merchant = this.getById(merchant.getId());
-
-
- //reference
- List<Manufacturer> manufacturers = manufacturerService.listByStore(merchant);
- for(Manufacturer manufacturer : manufacturers) {
- manufacturerService.delete(manufacturer);
- }
-
- List<MerchantConfiguration> configurations = merchantConfigurationService.listByStore(merchant);
- for(MerchantConfiguration configuration : configurations) {
- merchantConfigurationService.delete(configuration);
- }
-
-
- //TODO taxService
- List<TaxClass> taxClasses = taxClassService.listByStore(merchant);
- for(TaxClass taxClass : taxClasses) {
- taxClassService.delete(taxClass);
- }
-
- //content
- contentService.removeFiles(merchant.getCode());
- //TODO staticContentService.removeImages
-
- //category / product
- List<Category> categories = categoryService.listByStore(merchant);
- for(Category category : categories) {
- categoryService.delete(category);
- }
-
- //users
- List<User> users = userService.listByStore(merchant);
- for(User user : users) {
- userService.delete(user);
- }
-
- //customers
- List<Customer> customers = customerService.listByStore(merchant);
- for(Customer customer : customers) {
- customerService.delete(customer);
- }
-
- //orders
- List<Order> orders = orderService.listByStore(merchant);
- for(Order order : orders) {
- orderService.delete(order);
- }
-
- super.delete(merchant);
-
- }*/
-
-}
+package com.salesmanager.core.business.services.merchant;
+
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.repositories.merchant.MerchantRepository;
+import com.salesmanager.core.business.services.catalog.product.manufacturer.ManufacturerService;
+import com.salesmanager.core.business.services.catalog.product.type.ProductTypeService;
+import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl;
+import com.salesmanager.core.business.services.tax.TaxClassService;
+import com.salesmanager.core.model.catalog.category.Category;
+import com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.system.MerchantConfiguration;
+import com.salesmanager.core.model.tax.taxclass.TaxClass;
+import com.salesmanager.core.model.user.User;
+
+@Service("merchantService")
+public class MerchantStoreServiceImpl extends SalesManagerEntityServiceImpl<Integer, MerchantStore>
+ implements MerchantStoreService {
+
+
+
+ @Inject
+ protected ProductTypeService productTypeService;
+
+ @Inject
+ private TaxClassService taxClassService;
+
+/* @Inject
+ private ContentService contentService;
+
+ @Inject
+ private MerchantConfigurationService merchantConfigurationService;
+
+ @Inject
+ private CategoryService categoryService;
+
+ @Inject
+ private UserService userService;
+
+ @Inject
+ private OrderService orderService;
+
+ @Inject
+ private CustomerService customerService;*/
+
+ @Inject
+ private ManufacturerService manufacturerService;
+
+ private MerchantRepository merchantRepository;
+
+ @Inject
+ public MerchantStoreServiceImpl(MerchantRepository merchantRepository) {
+ super(merchantRepository);
+ this.merchantRepository = merchantRepository;
+ }
+
+
+ public MerchantStore getMerchantStore(String merchantStoreCode) throws ServiceException {
+ return merchantRepository.findByCode(merchantStoreCode);
+ }
+
+ @Override
+ public void saveOrUpdate(MerchantStore store) throws ServiceException {
+
+ super.save(store);
+
+ }
+
+
+ @Override
+ public MerchantStore getByCode(String code) throws ServiceException {
+
+ return merchantRepository.findByCode(code);
+ }
+
+/* @Override
+ public void delete(MerchantStore merchant) throws ServiceException {
+
+ merchant = this.getById(merchant.getId());
+
+
+ //reference
+ List<Manufacturer> manufacturers = manufacturerService.listByStore(merchant);
+ for(Manufacturer manufacturer : manufacturers) {
+ manufacturerService.delete(manufacturer);
+ }
+
+ List<MerchantConfiguration> configurations = merchantConfigurationService.listByStore(merchant);
+ for(MerchantConfiguration configuration : configurations) {
+ merchantConfigurationService.delete(configuration);
+ }
+
+
+ //TODO taxService
+ List<TaxClass> taxClasses = taxClassService.listByStore(merchant);
+ for(TaxClass taxClass : taxClasses) {
+ taxClassService.delete(taxClass);
+ }
+
+ //content
+ contentService.removeFiles(merchant.getCode());
+ //TODO staticContentService.removeImages
+
+ //category / product
+ List<Category> categories = categoryService.listByStore(merchant);
+ for(Category category : categories) {
+ categoryService.delete(category);
+ }
+
+ //users
+ List<User> users = userService.listByStore(merchant);
+ for(User user : users) {
+ userService.delete(user);
+ }
+
+ //customers
+ List<Customer> customers = customerService.listByStore(merchant);
+ for(Customer customer : customers) {
+ customerService.delete(customer);
+ }
+
+ //orders
+ List<Order> orders = orderService.listByStore(merchant);
+ for(Order order : orders) {
+ orderService.delete(order);
+ }
+
+ super.delete(merchant);
+
+ }*/
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/order/orderproduct/OrderProductDownloadService.java b/sm-core/src/main/java/com/salesmanager/core/business/services/order/orderproduct/OrderProductDownloadService.java
index e0c8341..3914fbd 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/order/orderproduct/OrderProductDownloadService.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/order/orderproduct/OrderProductDownloadService.java
@@ -1,18 +1,18 @@
-package com.salesmanager.core.business.services.order.orderproduct;
-
-import java.util.List;
-
-import com.salesmanager.core.business.services.common.generic.SalesManagerEntityService;
-import com.salesmanager.core.model.order.orderproduct.OrderProductDownload;
-
-
-public interface OrderProductDownloadService extends SalesManagerEntityService<Long, OrderProductDownload> {
-
- /**
- * List {@link OrderProductDownload} by order id
- * @param orderId
- * @return
- */
- List<OrderProductDownload> getByOrderId(Long orderId);
-
-}
+package com.salesmanager.core.business.services.order.orderproduct;
+
+import java.util.List;
+
+import com.salesmanager.core.business.services.common.generic.SalesManagerEntityService;
+import com.salesmanager.core.model.order.orderproduct.OrderProductDownload;
+
+
+public interface OrderProductDownloadService extends SalesManagerEntityService<Long, OrderProductDownload> {
+
+ /**
+ * List {@link OrderProductDownload} by order id
+ * @param orderId
+ * @return
+ */
+ List<OrderProductDownload> getByOrderId(Long orderId);
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/order/orderproduct/OrderProductDownloadServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/order/orderproduct/OrderProductDownloadServiceImpl.java
index 9dae42e..f51d49e 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/order/orderproduct/OrderProductDownloadServiceImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/order/orderproduct/OrderProductDownloadServiceImpl.java
@@ -1,38 +1,38 @@
-package com.salesmanager.core.business.services.order.orderproduct;
-
-import java.util.List;
-
-import javax.inject.Inject;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import com.salesmanager.core.business.repositories.order.orderproduct.OrderProductDownloadRepository;
-import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl;
-import com.salesmanager.core.model.order.orderproduct.OrderProductDownload;
-
-
-
-
-@Service("orderProductDownloadService")
-public class OrderProductDownloadServiceImpl extends SalesManagerEntityServiceImpl<Long, OrderProductDownload> implements OrderProductDownloadService {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(OrderProductDownloadServiceImpl.class);
-
-
- private final OrderProductDownloadRepository orderProductDownloadRepository;
-
- @Inject
- public OrderProductDownloadServiceImpl(OrderProductDownloadRepository orderProductDownloadRepository) {
- super(orderProductDownloadRepository);
- this.orderProductDownloadRepository = orderProductDownloadRepository;
- }
-
- @Override
- public List<OrderProductDownload> getByOrderId(Long orderId) {
- return orderProductDownloadRepository.findByOrderId(orderId);
- }
-
-
-}
+package com.salesmanager.core.business.services.order.orderproduct;
+
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import com.salesmanager.core.business.repositories.order.orderproduct.OrderProductDownloadRepository;
+import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl;
+import com.salesmanager.core.model.order.orderproduct.OrderProductDownload;
+
+
+
+
+@Service("orderProductDownloadService")
+public class OrderProductDownloadServiceImpl extends SalesManagerEntityServiceImpl<Long, OrderProductDownload> implements OrderProductDownloadService {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(OrderProductDownloadServiceImpl.class);
+
+
+ private final OrderProductDownloadRepository orderProductDownloadRepository;
+
+ @Inject
+ public OrderProductDownloadServiceImpl(OrderProductDownloadRepository orderProductDownloadRepository) {
+ super(orderProductDownloadRepository);
+ this.orderProductDownloadRepository = orderProductDownloadRepository;
+ }
+
+ @Override
+ public List<OrderProductDownload> getByOrderId(Long orderId) {
+ return orderProductDownloadRepository.findByOrderId(orderId);
+ }
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/order/OrderService.java b/sm-core/src/main/java/com/salesmanager/core/business/services/order/OrderService.java
index 28671b5..b3cf525 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/order/OrderService.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/order/OrderService.java
@@ -1,115 +1,122 @@
-package com.salesmanager.core.business.services.order;
-
-import java.io.ByteArrayOutputStream;
-import java.util.List;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.common.generic.SalesManagerEntityService;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.Order;
-import com.salesmanager.core.model.order.OrderCriteria;
-import com.salesmanager.core.model.order.OrderList;
-import com.salesmanager.core.model.order.OrderSummary;
-import com.salesmanager.core.model.order.OrderTotalSummary;
-import com.salesmanager.core.model.order.orderstatus.OrderStatusHistory;
-import com.salesmanager.core.model.payments.Payment;
-import com.salesmanager.core.model.payments.Transaction;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.shoppingcart.ShoppingCart;
-import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
-
-
-
-public interface OrderService extends SalesManagerEntityService<Long, Order> {
-
- void addOrderStatusHistory(Order order, OrderStatusHistory history)
- throws ServiceException;
-
- /**
- * Can be used to calculates the final prices of all items contained in checkout page
- * @param orderSummary
- * @param customer
- * @param store
- * @param language
- * @return
- * @throws ServiceException
- */
- OrderTotalSummary caculateOrderTotal(OrderSummary orderSummary,
- Customer customer, MerchantStore store, Language language)
- throws ServiceException;
-
- /**
- * Can be used to calculates the final prices of all items contained in a ShoppingCart
- * @param orderSummary
- * @param store
- * @param language
- * @return
- * @throws ServiceException
- */
- OrderTotalSummary caculateOrderTotal(OrderSummary orderSummary,
- MerchantStore store, Language language) throws ServiceException;
-
-
- /**
- * Can be used to calculates the final prices of all items contained in checkout page
- * @param shoppingCart
- * @param customer
- * @param store
- * @param language
- * @return @return {@link OrderTotalSummary}
- * @throws ServiceException
- */
- OrderTotalSummary calculateShoppingCartTotal(final ShoppingCart shoppingCart,final Customer customer, final MerchantStore store, final Language language) throws ServiceException;
-
- /**
- * Can be used to calculates the final prices of all items contained in a ShoppingCart
- * @param shoppingCart
- * @param store
- * @param language
- * @return {@link OrderTotalSummary}
- * @throws ServiceException
- */
- OrderTotalSummary calculateShoppingCartTotal(final ShoppingCart shoppingCart,final MerchantStore store, final Language language) throws ServiceException;
-
- ByteArrayOutputStream generateInvoice(MerchantStore store, Order order,
- Language language) throws ServiceException;
-
- Order getOrder(Long id);
-
- //List<Order> listByStore(MerchantStore merchantStore);
-
-
-
-
- /**
- * For finding orders. Mainly used in the administration tool
- * @param store
- * @param criteria
- * @return
- */
- OrderList listByStore(MerchantStore store, OrderCriteria criteria);
-
- void saveOrUpdate(Order order) throws ServiceException;
-
- Order processOrder(Order order, Customer customer,
- List<ShoppingCartItem> items, OrderTotalSummary summary,
- Payment payment, MerchantStore store) throws ServiceException;
-
- Order processOrder(Order order, Customer customer,
- List<ShoppingCartItem> items, OrderTotalSummary summary,
- Payment payment, Transaction transaction, MerchantStore store)
- throws ServiceException;
-
-
-
-
- /**
- * Determines if an Order has download files
- * @param order
- * @return
- * @throws ServiceException
- */
- boolean hasDownloadFiles(Order order) throws ServiceException;
-
-}
+package com.salesmanager.core.business.services.order;
+
+import java.io.ByteArrayOutputStream;
+import java.util.Date;
+import java.util.List;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.common.generic.SalesManagerEntityService;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.order.OrderCriteria;
+import com.salesmanager.core.model.order.OrderList;
+import com.salesmanager.core.model.order.OrderSummary;
+import com.salesmanager.core.model.order.OrderTotalSummary;
+import com.salesmanager.core.model.order.orderstatus.OrderStatusHistory;
+import com.salesmanager.core.model.payments.Payment;
+import com.salesmanager.core.model.payments.Transaction;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.shoppingcart.ShoppingCart;
+import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
+
+
+
+public interface OrderService extends SalesManagerEntityService<Long, Order> {
+
+ void addOrderStatusHistory(Order order, OrderStatusHistory history)
+ throws ServiceException;
+
+ /**
+ * Can be used to calculates the final prices of all items contained in checkout page
+ * @param orderSummary
+ * @param customer
+ * @param store
+ * @param language
+ * @return
+ * @throws ServiceException
+ */
+ OrderTotalSummary caculateOrderTotal(OrderSummary orderSummary,
+ Customer customer, MerchantStore store, Language language)
+ throws ServiceException;
+
+ /**
+ * Can be used to calculates the final prices of all items contained in a ShoppingCart
+ * @param orderSummary
+ * @param store
+ * @param language
+ * @return
+ * @throws ServiceException
+ */
+ OrderTotalSummary caculateOrderTotal(OrderSummary orderSummary,
+ MerchantStore store, Language language) throws ServiceException;
+
+
+ /**
+ * Can be used to calculates the final prices of all items contained in checkout page
+ * @param shoppingCart
+ * @param customer
+ * @param store
+ * @param language
+ * @return @return {@link OrderTotalSummary}
+ * @throws ServiceException
+ */
+ OrderTotalSummary calculateShoppingCartTotal(final ShoppingCart shoppingCart,final Customer customer, final MerchantStore store, final Language language) throws ServiceException;
+
+ /**
+ * Can be used to calculates the final prices of all items contained in a ShoppingCart
+ * @param shoppingCart
+ * @param store
+ * @param language
+ * @return {@link OrderTotalSummary}
+ * @throws ServiceException
+ */
+ OrderTotalSummary calculateShoppingCartTotal(final ShoppingCart shoppingCart,final MerchantStore store, final Language language) throws ServiceException;
+
+ ByteArrayOutputStream generateInvoice(MerchantStore store, Order order,
+ Language language) throws ServiceException;
+
+ Order getOrder(Long id);
+
+
+ /**
+ * For finding orders. Mainly used in the administration tool
+ * @param store
+ * @param criteria
+ * @return
+ */
+ OrderList listByStore(MerchantStore store, OrderCriteria criteria);
+
+ void saveOrUpdate(Order order) throws ServiceException;
+
+ Order processOrder(Order order, Customer customer,
+ List<ShoppingCartItem> items, OrderTotalSummary summary,
+ Payment payment, MerchantStore store) throws ServiceException;
+
+ Order processOrder(Order order, Customer customer,
+ List<ShoppingCartItem> items, OrderTotalSummary summary,
+ Payment payment, Transaction transaction, MerchantStore store)
+ throws ServiceException;
+
+
+
+
+ /**
+ * Determines if an Order has download files
+ * @param order
+ * @return
+ * @throws ServiceException
+ */
+ boolean hasDownloadFiles(Order order) throws ServiceException;
+
+ /**
+ * List all orders that have been pre-authorized but not captured
+ * @param store
+ * @param startDate
+ * @param endDate
+ * @return
+ * @throws ServiceException
+ */
+ List<Order> getCapturableOrders(MerchantStore store, Date startDate, Date endDate) throws ServiceException;
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/order/OrderServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/order/OrderServiceImpl.java
index ed96dbc..2607e8f 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/order/OrderServiceImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/order/OrderServiceImpl.java
@@ -1,521 +1,600 @@
-package com.salesmanager.core.business.services.order;
-
-import com.salesmanager.core.business.constants.Constants;
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.modules.order.InvoiceModule;
-import com.salesmanager.core.business.repositories.order.OrderRepository;
-import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl;
-import com.salesmanager.core.business.services.customer.CustomerService;
-import com.salesmanager.core.business.services.order.ordertotal.OrderTotalService;
-import com.salesmanager.core.business.services.payments.PaymentService;
-import com.salesmanager.core.business.services.payments.TransactionService;
-import com.salesmanager.core.business.services.shipping.ShippingService;
-import com.salesmanager.core.business.services.tax.TaxService;
-import com.salesmanager.core.model.catalog.product.price.FinalPrice;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.*;
-import com.salesmanager.core.model.order.orderproduct.OrderProduct;
-import com.salesmanager.core.model.order.orderstatus.OrderStatus;
-import com.salesmanager.core.model.order.orderstatus.OrderStatusHistory;
-import com.salesmanager.core.model.payments.Payment;
-import com.salesmanager.core.model.payments.Transaction;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.shipping.ShippingConfiguration;
-import com.salesmanager.core.model.shoppingcart.ShoppingCart;
-import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
-import com.salesmanager.core.model.tax.TaxItem;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.Validate;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import javax.inject.Inject;
-import java.io.ByteArrayOutputStream;
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.util.*;
-
-
-
-
-@Service("orderService")
-public class OrderServiceImpl extends SalesManagerEntityServiceImpl<Long, Order> implements OrderService {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(OrderServiceImpl.class);
-
- @Inject
- private InvoiceModule invoiceModule;
-
- @Inject
- private ShippingService shippingService;
-
- @Inject
- private PaymentService paymentService;
-
- @Inject
- private TaxService taxService;
-
- @Inject
- private CustomerService customerService;
-
- @Inject
- private TransactionService transactionService;
-
- @Inject
- private OrderTotalService orderTotalService;
-
- private final OrderRepository orderRepository;
-
- @Inject
- public OrderServiceImpl(OrderRepository orderRepository) {
- super(orderRepository);
- this.orderRepository = orderRepository;
- }
-
- @Override
- public void addOrderStatusHistory(Order order, OrderStatusHistory history) throws ServiceException {
- order.getOrderHistory().add(history);
- history.setOrder(order);
- update(order);
- }
-
- @Override
- public Order processOrder(Order order, Customer customer, List<ShoppingCartItem> items, OrderTotalSummary summary, Payment payment, MerchantStore store) throws ServiceException {
-
- return this.process(order, customer, items, summary, payment, null, store);
- }
-
- @Override
- public Order processOrder(Order order, Customer customer, List<ShoppingCartItem> items, OrderTotalSummary summary, Payment payment, Transaction transaction, MerchantStore store) throws ServiceException {
-
- return this.process(order, customer, items, summary, payment, transaction, store);
- }
-
- private Order process(Order order, Customer customer, List<ShoppingCartItem> items, OrderTotalSummary summary, Payment payment, Transaction transaction, MerchantStore store) throws ServiceException {
-
-
- Validate.notNull(order, "Order cannot be null");
- Validate.notNull(customer, "Customer cannot be null (even if anonymous order)");
- Validate.notEmpty(items, "ShoppingCart items cannot be null");
- Validate.notNull(payment, "Payment cannot be null");
- Validate.notNull(store, "MerchantStore cannot be null");
- Validate.notNull(summary, "Order total Summary cannot be null");
-
- //first process payment
- Transaction processTransaction = paymentService.processPayment(customer, store, payment, items, order);
- //transactionService.save(processTransaction);
-
- if(order.getOrderHistory()==null || order.getOrderHistory().size()==0 || order.getStatus()==null) {
- OrderStatus status = order.getStatus();
- if(status==null) {
- status = OrderStatus.ORDERED;
- order.setStatus(status);
- }
- Set<OrderStatusHistory> statusHistorySet = new HashSet<OrderStatusHistory>();
- OrderStatusHistory statusHistory = new OrderStatusHistory();
- statusHistory.setStatus(status);
- statusHistory.setDateAdded(new Date());
- statusHistory.setOrder(order);
- statusHistorySet.add(statusHistory);
- order.setOrderHistory(statusHistorySet);
-
- }
-
- if(customer.getId()==null || customer.getId()==0) {
- customerService.create(customer);
- }
-
- order.setCustomerId(customer.getId());
-
- this.create(order);
-
- if(transaction!=null) {
- transaction.setOrder(order);
- if(transaction.getId()==null || transaction.getId()==0) {
- transactionService.create(transaction);
- } else {
- transactionService.update(transaction);
- }
- }
-
- if(processTransaction!=null) {
- processTransaction.setOrder(order);
- if(processTransaction.getId()==null || processTransaction.getId()==0) {
- transactionService.create(processTransaction);
- } else {
- transactionService.update(processTransaction);
- }
- }
-
- return order;
-
-
- }
-
- private OrderTotalSummary caculateOrder(OrderSummary summary, Customer customer, final MerchantStore store, final Language language) throws Exception {
-
- OrderTotalSummary totalSummary = new OrderTotalSummary();
- List<OrderTotal> orderTotals = new ArrayList<OrderTotal>();
- Map<String,OrderTotal> otherPricesTotals = new HashMap<String,OrderTotal>();
-
- ShippingConfiguration shippingConfiguration = null;
-
- BigDecimal grandTotal = new BigDecimal(0);
- grandTotal.setScale(2, RoundingMode.HALF_UP);
-
- //price by item
- /**
- * qty * price
- * subtotal
- */
- BigDecimal subTotal = new BigDecimal(0);
- subTotal.setScale(2, RoundingMode.HALF_UP);
- for(ShoppingCartItem item : summary.getProducts()) {
-
- BigDecimal st = item.getItemPrice().multiply(new BigDecimal(item.getQuantity()));
- item.setSubTotal(st);
- subTotal = subTotal.add(st);
- //Other prices
- FinalPrice finalPrice = item.getFinalPrice();
- if(finalPrice!=null) {
- List<FinalPrice> otherPrices = finalPrice.getAdditionalPrices();
- if(otherPrices!=null) {
- for(FinalPrice price : otherPrices) {
- if(!price.isDefaultPrice()) {
- OrderTotal itemSubTotal = otherPricesTotals.get(price.getProductPrice().getCode());
-
- if(itemSubTotal==null) {
- itemSubTotal = new OrderTotal();
- itemSubTotal.setModule(Constants.OT_ITEM_PRICE_MODULE_CODE);
- //itemSubTotal.setText(Constants.OT_ITEM_PRICE_MODULE_CODE);
- itemSubTotal.setTitle(Constants.OT_ITEM_PRICE_MODULE_CODE);
- itemSubTotal.setOrderTotalCode(price.getProductPrice().getCode());
- itemSubTotal.setOrderTotalType(OrderTotalType.PRODUCT);
- itemSubTotal.setSortOrder(0);
- otherPricesTotals.put(price.getProductPrice().getCode(), itemSubTotal);
- }
-
- BigDecimal orderTotalValue = itemSubTotal.getValue();
- if(orderTotalValue==null) {
- orderTotalValue = new BigDecimal(0);
- orderTotalValue.setScale(2, RoundingMode.HALF_UP);
- }
-
- orderTotalValue = orderTotalValue.add(price.getFinalPrice());
- itemSubTotal.setValue(orderTotalValue);
- if(price.getProductPrice().getProductPriceType().name().equals(OrderValueType.ONE_TIME)) {
- subTotal = subTotal.add(price.getFinalPrice());
- }
- }
- }
- }
- }
-
- }
-
- //only in order page, otherwise invokes too many processing
- if(OrderSummaryType.ORDERTOTAL.name().equals(summary.getOrderSummaryType().name())) {
-
- //Post processing order total variation modules for sub total calculation - drools, custom modules
- //may affect the sub total
- OrderTotalVariation orderTotalVariation = orderTotalService.findOrderTotalVariation(summary, customer, store, language);
-
- int currentCount = 10;
-
- if(CollectionUtils.isNotEmpty(orderTotalVariation.getVariations())) {
- for(OrderTotal variation : orderTotalVariation.getVariations()) {
- variation.setSortOrder(currentCount++);
- orderTotals.add(variation);
- subTotal = subTotal.subtract(variation.getValue());
- }
- }
-
- }
-
-
- totalSummary.setSubTotal(subTotal);
- grandTotal=grandTotal.add(subTotal);
-
- OrderTotal orderTotalSubTotal = new OrderTotal();
- orderTotalSubTotal.setModule(Constants.OT_SUBTOTAL_MODULE_CODE);
- orderTotalSubTotal.setOrderTotalType(OrderTotalType.SUBTOTAL);
- orderTotalSubTotal.setOrderTotalCode("order.total.subtotal");
- orderTotalSubTotal.setTitle(Constants.OT_SUBTOTAL_MODULE_CODE);
- //orderTotalSubTotal.setText("order.total.subtotal");
- orderTotalSubTotal.setSortOrder(5);
- orderTotalSubTotal.setValue(subTotal);
-
- orderTotals.add(orderTotalSubTotal);
-
-
- //shipping
- if(summary.getShippingSummary()!=null) {
-
-
- OrderTotal shippingSubTotal = new OrderTotal();
- shippingSubTotal.setModule(Constants.OT_SHIPPING_MODULE_CODE);
- shippingSubTotal.setOrderTotalType(OrderTotalType.SHIPPING);
- shippingSubTotal.setOrderTotalCode("order.total.shipping");
- shippingSubTotal.setTitle(Constants.OT_SHIPPING_MODULE_CODE);
- //shippingSubTotal.setText("order.total.shipping");
- shippingSubTotal.setSortOrder(100);
-
- orderTotals.add(shippingSubTotal);
-
- if(!summary.getShippingSummary().isFreeShipping()) {
- shippingSubTotal.setValue(summary.getShippingSummary().getShipping());
- grandTotal=grandTotal.add(summary.getShippingSummary().getShipping());
- } else {
- shippingSubTotal.setValue(new BigDecimal(0));
- grandTotal=grandTotal.add(new BigDecimal(0));
- }
-
- //check handling fees
- shippingConfiguration = shippingService.getShippingConfiguration(store);
- if(summary.getShippingSummary().getHandling()!=null && summary.getShippingSummary().getHandling().doubleValue()>0) {
- if(shippingConfiguration.getHandlingFees()!=null && shippingConfiguration.getHandlingFees().doubleValue()>0) {
- OrderTotal handlingubTotal = new OrderTotal();
- handlingubTotal.setModule(Constants.OT_HANDLING_MODULE_CODE);
- handlingubTotal.setOrderTotalType(OrderTotalType.HANDLING);
- handlingubTotal.setOrderTotalCode("order.total.handling");
- handlingubTotal.setTitle(Constants.OT_HANDLING_MODULE_CODE);
- //handlingubTotal.setText("order.total.handling");
- handlingubTotal.setSortOrder(120);
- handlingubTotal.setValue(summary.getShippingSummary().getHandling());
- orderTotals.add(handlingubTotal);
- grandTotal=grandTotal.add(summary.getShippingSummary().getHandling());
- }
- }
- }
-
- //tax
- List<TaxItem> taxes = taxService.calculateTax(summary, customer, store, language);
- if(taxes!=null && taxes.size()>0) {
- BigDecimal totalTaxes = new BigDecimal(0);
- totalTaxes.setScale(2, RoundingMode.HALF_UP);
- int taxCount = 200;
- for(TaxItem tax : taxes) {
-
- OrderTotal taxLine = new OrderTotal();
- taxLine.setModule(Constants.OT_TAX_MODULE_CODE);
- taxLine.setOrderTotalType(OrderTotalType.TAX);
- taxLine.setOrderTotalCode(tax.getLabel());
- taxLine.setSortOrder(taxCount);
- taxLine.setTitle(Constants.OT_TAX_MODULE_CODE);
- taxLine.setText(tax.getLabel());
- taxLine.setValue(tax.getItemPrice());
-
- totalTaxes = totalTaxes.add(tax.getItemPrice());
- orderTotals.add(taxLine);
- //grandTotal=grandTotal.add(tax.getItemPrice());
-
- taxCount ++;
-
- }
- grandTotal = grandTotal.add(totalTaxes);
- totalSummary.setTaxTotal(totalTaxes);
- }
-
- // grand total
- OrderTotal orderTotal = new OrderTotal();
- orderTotal.setModule(Constants.OT_TOTAL_MODULE_CODE);
- orderTotal.setOrderTotalType(OrderTotalType.TOTAL);
- orderTotal.setOrderTotalCode("order.total.total");
- orderTotal.setTitle(Constants.OT_TOTAL_MODULE_CODE);
- //orderTotal.setText("order.total.total");
- orderTotal.setSortOrder(500);
- orderTotal.setValue(grandTotal);
- orderTotals.add(orderTotal);
-
- totalSummary.setTotal(grandTotal);
- totalSummary.setTotals(orderTotals);
- return totalSummary;
-
- }
-
-
- @Override
- public OrderTotalSummary caculateOrderTotal(final OrderSummary orderSummary, final Customer customer, final MerchantStore store, final Language language) throws ServiceException {
- Validate.notNull(orderSummary,"Order summary cannot be null");
- Validate.notNull(orderSummary.getProducts(),"Order summary.products cannot be null");
- Validate.notNull(store,"MerchantStore cannot be null");
- Validate.notNull(customer,"Customer cannot be null");
-
- try {
- return caculateOrder(orderSummary, customer, store, language);
- } catch (Exception e) {
- throw new ServiceException(e);
- }
-
- }
-
-
-
- @Override
- public OrderTotalSummary caculateOrderTotal(final OrderSummary orderSummary, final MerchantStore store, final Language language) throws ServiceException {
- Validate.notNull(orderSummary,"Order summary cannot be null");
- Validate.notNull(orderSummary.getProducts(),"Order summary.products cannot be null");
- Validate.notNull(store,"MerchantStore cannot be null");
-
- try {
- return caculateOrder(orderSummary, null, store, language);
- } catch (Exception e) {
- throw new ServiceException(e);
- }
-
- }
-
- private OrderTotalSummary caculateShoppingCart( final ShoppingCart shoppingCart, final Customer customer, final MerchantStore store, final Language language) throws Exception {
-
-
- OrderSummary orderSummary = new OrderSummary();
- orderSummary.setOrderSummaryType(OrderSummaryType.SHOPPINGCART);
-
- List<ShoppingCartItem> itemsSet = new ArrayList<ShoppingCartItem>(shoppingCart.getLineItems());
- orderSummary.setProducts(itemsSet);
-
-
- return this.caculateOrder(orderSummary, customer, store, language);
-
- }
-
-
- /**
- * <p>Method will be used to calculate Shopping cart total as well will update price for each
- * line items.
- * </p>
- * @param shoppingCart
- * @param customer
- * @param store
- * @param language
- * @return {@link OrderTotalSummary}
- * @throws ServiceException
- *
- */
- @Override
- public OrderTotalSummary calculateShoppingCartTotal(
- final ShoppingCart shoppingCart, final Customer customer, final MerchantStore store,
- final Language language) throws ServiceException {
- Validate.notNull(shoppingCart,"Order summary cannot be null");
- Validate.notNull(customer,"Customery cannot be null");
- Validate.notNull(store,"MerchantStore cannot be null.");
- try {
- return caculateShoppingCart(shoppingCart, customer, store, language);
- } catch (Exception e) {
- LOGGER.error( "Error while calculating shopping cart total" +e );
- throw new ServiceException(e);
- }
-
- }
-
-
-
-
- /**
- * <p>Method will be used to calculate Shopping cart total as well will update price for each
- * line items.
- * </p>
- * @param shoppingCart
- * @param store
- * @param language
- * @return {@link OrderTotalSummary}
- * @throws ServiceException
- *
- */
- @Override
- public OrderTotalSummary calculateShoppingCartTotal(
- final ShoppingCart shoppingCart, final MerchantStore store, final Language language)
- throws ServiceException {
- Validate.notNull(shoppingCart,"Order summary cannot be null");
- Validate.notNull(store,"MerchantStore cannot be null");
-
- try {
- return caculateShoppingCart(shoppingCart, null, store, language);
- } catch (Exception e) {
- LOGGER.error( "Error while calculating shopping cart total" +e );
- throw new ServiceException(e);
- }
- }
-
- @Override
- public void delete(final Order order) throws ServiceException {
-
-
- super.delete(order);
- }
-
-
- @Override
- public ByteArrayOutputStream generateInvoice(final MerchantStore store, final Order order, final Language language) throws ServiceException {
-
- Validate.notNull(order.getOrderProducts(),"Order products cannot be null");
- Validate.notNull(order.getOrderTotal(),"Order totals cannot be null");
-
- try {
- ByteArrayOutputStream stream = invoiceModule.createInvoice(store, order, language);
- return stream;
- } catch(Exception e) {
- throw new ServiceException(e);
- }
-
-
-
- }
-
- @Override
- public Order getOrder(final Long orderId ) {
- return getById(orderId);
- }
-
-
-
-/* @Override
- public List<Order> listByStore(final MerchantStore merchantStore) {
- return listByField(Order_.merchant, merchantStore);
- }*/
-
- @Override
- public OrderList listByStore(final MerchantStore store, final OrderCriteria criteria) {
-
- return orderRepository.listByStore(store, criteria);
- }
-
-
- @Override
- public void saveOrUpdate(final Order order) throws ServiceException {
-
- if(order.getId()!=null && order.getId()>0) {
- LOGGER.debug("Updating Order");
- super.update(order);
-
- } else {
- LOGGER.debug("Creating Order");
- super.create(order);
-
- }
- }
-
- @Override
- public boolean hasDownloadFiles(Order order) throws ServiceException {
-
- Validate.notNull(order,"Order cannot be null");
- Validate.notNull(order.getOrderProducts(),"Order products cannot be null");
- Validate.notEmpty(order.getOrderProducts(),"Order products cannot be empty");
-
- boolean hasDownloads = false;
- for(OrderProduct orderProduct : order.getOrderProducts()) {
-
- if(CollectionUtils.isNotEmpty(orderProduct.getDownloads())) {
- hasDownloads = true;
- break;
- }
- }
-
- return hasDownloads;
- }
-
-
-
-}
+package com.salesmanager.core.business.services.order;
+
+import com.salesmanager.core.business.constants.Constants;
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.modules.order.InvoiceModule;
+import com.salesmanager.core.business.repositories.order.OrderRepository;
+import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl;
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.business.services.order.ordertotal.OrderTotalService;
+import com.salesmanager.core.business.services.payments.PaymentService;
+import com.salesmanager.core.business.services.payments.TransactionService;
+import com.salesmanager.core.business.services.shipping.ShippingService;
+import com.salesmanager.core.business.services.tax.TaxService;
+import com.salesmanager.core.model.catalog.product.price.FinalPrice;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.*;
+import com.salesmanager.core.model.order.orderproduct.OrderProduct;
+import com.salesmanager.core.model.order.orderstatus.OrderStatus;
+import com.salesmanager.core.model.order.orderstatus.OrderStatusHistory;
+import com.salesmanager.core.model.payments.Payment;
+import com.salesmanager.core.model.payments.Transaction;
+import com.salesmanager.core.model.payments.TransactionType;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.shipping.ShippingConfiguration;
+import com.salesmanager.core.model.shoppingcart.ShoppingCart;
+import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
+import com.salesmanager.core.model.tax.TaxItem;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.Validate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import javax.inject.Inject;
+import java.io.ByteArrayOutputStream;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+
+
+
+
+@Service("orderService")
+public class OrderServiceImpl extends SalesManagerEntityServiceImpl<Long, Order> implements OrderService {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(OrderServiceImpl.class);
+
+ @Inject
+ private InvoiceModule invoiceModule;
+
+ @Inject
+ private ShippingService shippingService;
+
+ @Inject
+ private PaymentService paymentService;
+
+ @Inject
+ private TaxService taxService;
+
+ @Inject
+ private CustomerService customerService;
+
+ @Inject
+ private TransactionService transactionService;
+
+ @Inject
+ private OrderTotalService orderTotalService;
+
+ private final OrderRepository orderRepository;
+
+ @Inject
+ public OrderServiceImpl(OrderRepository orderRepository) {
+ super(orderRepository);
+ this.orderRepository = orderRepository;
+ }
+
+ @Override
+ public void addOrderStatusHistory(Order order, OrderStatusHistory history) throws ServiceException {
+ order.getOrderHistory().add(history);
+ history.setOrder(order);
+ update(order);
+ }
+
+ @Override
+ public Order processOrder(Order order, Customer customer, List<ShoppingCartItem> items, OrderTotalSummary summary, Payment payment, MerchantStore store) throws ServiceException {
+
+ return this.process(order, customer, items, summary, payment, null, store);
+ }
+
+ @Override
+ public Order processOrder(Order order, Customer customer, List<ShoppingCartItem> items, OrderTotalSummary summary, Payment payment, Transaction transaction, MerchantStore store) throws ServiceException {
+
+ return this.process(order, customer, items, summary, payment, transaction, store);
+ }
+
+ private Order process(Order order, Customer customer, List<ShoppingCartItem> items, OrderTotalSummary summary, Payment payment, Transaction transaction, MerchantStore store) throws ServiceException {
+
+
+ Validate.notNull(order, "Order cannot be null");
+ Validate.notNull(customer, "Customer cannot be null (even if anonymous order)");
+ Validate.notEmpty(items, "ShoppingCart items cannot be null");
+ Validate.notNull(payment, "Payment cannot be null");
+ Validate.notNull(store, "MerchantStore cannot be null");
+ Validate.notNull(summary, "Order total Summary cannot be null");
+
+ //first process payment
+ Transaction processTransaction = paymentService.processPayment(customer, store, payment, items, order);
+ //transactionService.save(processTransaction);
+
+ if(order.getOrderHistory()==null || order.getOrderHistory().size()==0 || order.getStatus()==null) {
+ OrderStatus status = order.getStatus();
+ if(status==null) {
+ status = OrderStatus.ORDERED;
+ order.setStatus(status);
+ }
+ Set<OrderStatusHistory> statusHistorySet = new HashSet<OrderStatusHistory>();
+ OrderStatusHistory statusHistory = new OrderStatusHistory();
+ statusHistory.setStatus(status);
+ statusHistory.setDateAdded(new Date());
+ statusHistory.setOrder(order);
+ statusHistorySet.add(statusHistory);
+ order.setOrderHistory(statusHistorySet);
+
+ }
+
+ if(customer.getId()==null || customer.getId()==0) {
+ customerService.create(customer);
+ }
+
+ order.setCustomerId(customer.getId());
+
+ this.create(order);
+
+ if(transaction!=null) {
+ transaction.setOrder(order);
+ if(transaction.getId()==null || transaction.getId()==0) {
+ transactionService.create(transaction);
+ } else {
+ transactionService.update(transaction);
+ }
+ }
+
+ if(processTransaction!=null) {
+ processTransaction.setOrder(order);
+ if(processTransaction.getId()==null || processTransaction.getId()==0) {
+ transactionService.create(processTransaction);
+ } else {
+ transactionService.update(processTransaction);
+ }
+ }
+
+ return order;
+
+
+ }
+
+ private OrderTotalSummary caculateOrder(OrderSummary summary, Customer customer, final MerchantStore store, final Language language) throws Exception {
+
+ OrderTotalSummary totalSummary = new OrderTotalSummary();
+ List<OrderTotal> orderTotals = new ArrayList<OrderTotal>();
+ Map<String,OrderTotal> otherPricesTotals = new HashMap<String,OrderTotal>();
+
+ ShippingConfiguration shippingConfiguration = null;
+
+ BigDecimal grandTotal = new BigDecimal(0);
+ grandTotal.setScale(2, RoundingMode.HALF_UP);
+
+ //price by item
+ /**
+ * qty * price
+ * subtotal
+ */
+ BigDecimal subTotal = new BigDecimal(0);
+ subTotal.setScale(2, RoundingMode.HALF_UP);
+ for(ShoppingCartItem item : summary.getProducts()) {
+
+ BigDecimal st = item.getItemPrice().multiply(new BigDecimal(item.getQuantity()));
+ item.setSubTotal(st);
+ subTotal = subTotal.add(st);
+ //Other prices
+ FinalPrice finalPrice = item.getFinalPrice();
+ if(finalPrice!=null) {
+ List<FinalPrice> otherPrices = finalPrice.getAdditionalPrices();
+ if(otherPrices!=null) {
+ for(FinalPrice price : otherPrices) {
+ if(!price.isDefaultPrice()) {
+ OrderTotal itemSubTotal = otherPricesTotals.get(price.getProductPrice().getCode());
+
+ if(itemSubTotal==null) {
+ itemSubTotal = new OrderTotal();
+ itemSubTotal.setModule(Constants.OT_ITEM_PRICE_MODULE_CODE);
+ //itemSubTotal.setText(Constants.OT_ITEM_PRICE_MODULE_CODE);
+ itemSubTotal.setTitle(Constants.OT_ITEM_PRICE_MODULE_CODE);
+ itemSubTotal.setOrderTotalCode(price.getProductPrice().getCode());
+ itemSubTotal.setOrderTotalType(OrderTotalType.PRODUCT);
+ itemSubTotal.setSortOrder(0);
+ otherPricesTotals.put(price.getProductPrice().getCode(), itemSubTotal);
+ }
+
+ BigDecimal orderTotalValue = itemSubTotal.getValue();
+ if(orderTotalValue==null) {
+ orderTotalValue = new BigDecimal(0);
+ orderTotalValue.setScale(2, RoundingMode.HALF_UP);
+ }
+
+ orderTotalValue = orderTotalValue.add(price.getFinalPrice());
+ itemSubTotal.setValue(orderTotalValue);
+ if(price.getProductPrice().getProductPriceType().name().equals(OrderValueType.ONE_TIME)) {
+ subTotal = subTotal.add(price.getFinalPrice());
+ }
+ }
+ }
+ }
+ }
+
+ }
+
+ //only in order page, otherwise invokes too many processing
+ if(OrderSummaryType.ORDERTOTAL.name().equals(summary.getOrderSummaryType().name())) {
+
+ //Post processing order total variation modules for sub total calculation - drools, custom modules
+ //may affect the sub total
+ OrderTotalVariation orderTotalVariation = orderTotalService.findOrderTotalVariation(summary, customer, store, language);
+
+ int currentCount = 10;
+
+ if(CollectionUtils.isNotEmpty(orderTotalVariation.getVariations())) {
+ for(OrderTotal variation : orderTotalVariation.getVariations()) {
+ variation.setSortOrder(currentCount++);
+ orderTotals.add(variation);
+ subTotal = subTotal.subtract(variation.getValue());
+ }
+ }
+
+ }
+
+
+ totalSummary.setSubTotal(subTotal);
+ grandTotal=grandTotal.add(subTotal);
+
+ OrderTotal orderTotalSubTotal = new OrderTotal();
+ orderTotalSubTotal.setModule(Constants.OT_SUBTOTAL_MODULE_CODE);
+ orderTotalSubTotal.setOrderTotalType(OrderTotalType.SUBTOTAL);
+ orderTotalSubTotal.setOrderTotalCode("order.total.subtotal");
+ orderTotalSubTotal.setTitle(Constants.OT_SUBTOTAL_MODULE_CODE);
+ //orderTotalSubTotal.setText("order.total.subtotal");
+ orderTotalSubTotal.setSortOrder(5);
+ orderTotalSubTotal.setValue(subTotal);
+
+ orderTotals.add(orderTotalSubTotal);
+
+
+ //shipping
+ if(summary.getShippingSummary()!=null) {
+
+
+ OrderTotal shippingSubTotal = new OrderTotal();
+ shippingSubTotal.setModule(Constants.OT_SHIPPING_MODULE_CODE);
+ shippingSubTotal.setOrderTotalType(OrderTotalType.SHIPPING);
+ shippingSubTotal.setOrderTotalCode("order.total.shipping");
+ shippingSubTotal.setTitle(Constants.OT_SHIPPING_MODULE_CODE);
+ //shippingSubTotal.setText("order.total.shipping");
+ shippingSubTotal.setSortOrder(100);
+
+ orderTotals.add(shippingSubTotal);
+
+ if(!summary.getShippingSummary().isFreeShipping()) {
+ shippingSubTotal.setValue(summary.getShippingSummary().getShipping());
+ grandTotal=grandTotal.add(summary.getShippingSummary().getShipping());
+ } else {
+ shippingSubTotal.setValue(new BigDecimal(0));
+ grandTotal=grandTotal.add(new BigDecimal(0));
+ }
+
+ //check handling fees
+ shippingConfiguration = shippingService.getShippingConfiguration(store);
+ if(summary.getShippingSummary().getHandling()!=null && summary.getShippingSummary().getHandling().doubleValue()>0) {
+ if(shippingConfiguration.getHandlingFees()!=null && shippingConfiguration.getHandlingFees().doubleValue()>0) {
+ OrderTotal handlingubTotal = new OrderTotal();
+ handlingubTotal.setModule(Constants.OT_HANDLING_MODULE_CODE);
+ handlingubTotal.setOrderTotalType(OrderTotalType.HANDLING);
+ handlingubTotal.setOrderTotalCode("order.total.handling");
+ handlingubTotal.setTitle(Constants.OT_HANDLING_MODULE_CODE);
+ //handlingubTotal.setText("order.total.handling");
+ handlingubTotal.setSortOrder(120);
+ handlingubTotal.setValue(summary.getShippingSummary().getHandling());
+ orderTotals.add(handlingubTotal);
+ grandTotal=grandTotal.add(summary.getShippingSummary().getHandling());
+ }
+ }
+ }
+
+ //tax
+ List<TaxItem> taxes = taxService.calculateTax(summary, customer, store, language);
+ if(taxes!=null && taxes.size()>0) {
+ BigDecimal totalTaxes = new BigDecimal(0);
+ totalTaxes.setScale(2, RoundingMode.HALF_UP);
+ int taxCount = 200;
+ for(TaxItem tax : taxes) {
+
+ OrderTotal taxLine = new OrderTotal();
+ taxLine.setModule(Constants.OT_TAX_MODULE_CODE);
+ taxLine.setOrderTotalType(OrderTotalType.TAX);
+ taxLine.setOrderTotalCode(tax.getLabel());
+ taxLine.setSortOrder(taxCount);
+ taxLine.setTitle(Constants.OT_TAX_MODULE_CODE);
+ taxLine.setText(tax.getLabel());
+ taxLine.setValue(tax.getItemPrice());
+
+ totalTaxes = totalTaxes.add(tax.getItemPrice());
+ orderTotals.add(taxLine);
+ //grandTotal=grandTotal.add(tax.getItemPrice());
+
+ taxCount ++;
+
+ }
+ grandTotal = grandTotal.add(totalTaxes);
+ totalSummary.setTaxTotal(totalTaxes);
+ }
+
+ // grand total
+ OrderTotal orderTotal = new OrderTotal();
+ orderTotal.setModule(Constants.OT_TOTAL_MODULE_CODE);
+ orderTotal.setOrderTotalType(OrderTotalType.TOTAL);
+ orderTotal.setOrderTotalCode("order.total.total");
+ orderTotal.setTitle(Constants.OT_TOTAL_MODULE_CODE);
+ //orderTotal.setText("order.total.total");
+ orderTotal.setSortOrder(500);
+ orderTotal.setValue(grandTotal);
+ orderTotals.add(orderTotal);
+
+ totalSummary.setTotal(grandTotal);
+ totalSummary.setTotals(orderTotals);
+ return totalSummary;
+
+ }
+
+
+ @Override
+ public OrderTotalSummary caculateOrderTotal(final OrderSummary orderSummary, final Customer customer, final MerchantStore store, final Language language) throws ServiceException {
+ Validate.notNull(orderSummary,"Order summary cannot be null");
+ Validate.notNull(orderSummary.getProducts(),"Order summary.products cannot be null");
+ Validate.notNull(store,"MerchantStore cannot be null");
+ Validate.notNull(customer,"Customer cannot be null");
+
+ try {
+ return caculateOrder(orderSummary, customer, store, language);
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ }
+
+ }
+
+
+
+ @Override
+ public OrderTotalSummary caculateOrderTotal(final OrderSummary orderSummary, final MerchantStore store, final Language language) throws ServiceException {
+ Validate.notNull(orderSummary,"Order summary cannot be null");
+ Validate.notNull(orderSummary.getProducts(),"Order summary.products cannot be null");
+ Validate.notNull(store,"MerchantStore cannot be null");
+
+ try {
+ return caculateOrder(orderSummary, null, store, language);
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ }
+
+ }
+
+ private OrderTotalSummary caculateShoppingCart( final ShoppingCart shoppingCart, final Customer customer, final MerchantStore store, final Language language) throws Exception {
+
+
+ OrderSummary orderSummary = new OrderSummary();
+ orderSummary.setOrderSummaryType(OrderSummaryType.SHOPPINGCART);
+
+ List<ShoppingCartItem> itemsSet = new ArrayList<ShoppingCartItem>(shoppingCart.getLineItems());
+ orderSummary.setProducts(itemsSet);
+
+
+ return this.caculateOrder(orderSummary, customer, store, language);
+
+ }
+
+
+ /**
+ * <p>Method will be used to calculate Shopping cart total as well will update price for each
+ * line items.
+ * </p>
+ * @param shoppingCart
+ * @param customer
+ * @param store
+ * @param language
+ * @return {@link OrderTotalSummary}
+ * @throws ServiceException
+ *
+ */
+ @Override
+ public OrderTotalSummary calculateShoppingCartTotal(
+ final ShoppingCart shoppingCart, final Customer customer, final MerchantStore store,
+ final Language language) throws ServiceException {
+ Validate.notNull(shoppingCart,"Order summary cannot be null");
+ Validate.notNull(customer,"Customery cannot be null");
+ Validate.notNull(store,"MerchantStore cannot be null.");
+ try {
+ return caculateShoppingCart(shoppingCart, customer, store, language);
+ } catch (Exception e) {
+ LOGGER.error( "Error while calculating shopping cart total" +e );
+ throw new ServiceException(e);
+ }
+
+ }
+
+
+
+
+ /**
+ * <p>Method will be used to calculate Shopping cart total as well will update price for each
+ * line items.
+ * </p>
+ * @param shoppingCart
+ * @param store
+ * @param language
+ * @return {@link OrderTotalSummary}
+ * @throws ServiceException
+ *
+ */
+ @Override
+ public OrderTotalSummary calculateShoppingCartTotal(
+ final ShoppingCart shoppingCart, final MerchantStore store, final Language language)
+ throws ServiceException {
+ Validate.notNull(shoppingCart,"Order summary cannot be null");
+ Validate.notNull(store,"MerchantStore cannot be null");
+
+ try {
+ return caculateShoppingCart(shoppingCart, null, store, language);
+ } catch (Exception e) {
+ LOGGER.error( "Error while calculating shopping cart total" +e );
+ throw new ServiceException(e);
+ }
+ }
+
+ @Override
+ public void delete(final Order order) throws ServiceException {
+
+
+ super.delete(order);
+ }
+
+
+ @Override
+ public ByteArrayOutputStream generateInvoice(final MerchantStore store, final Order order, final Language language) throws ServiceException {
+
+ Validate.notNull(order.getOrderProducts(),"Order products cannot be null");
+ Validate.notNull(order.getOrderTotal(),"Order totals cannot be null");
+
+ try {
+ ByteArrayOutputStream stream = invoiceModule.createInvoice(store, order, language);
+ return stream;
+ } catch(Exception e) {
+ throw new ServiceException(e);
+ }
+
+
+
+ }
+
+ @Override
+ public Order getOrder(final Long orderId ) {
+ return getById(orderId);
+ }
+
+
+
+/* @Override
+ public List<Order> listByStore(final MerchantStore merchantStore) {
+ return listByField(Order_.merchant, merchantStore);
+ }*/
+
+ @Override
+ public OrderList listByStore(final MerchantStore store, final OrderCriteria criteria) {
+
+ return orderRepository.listByStore(store, criteria);
+ }
+
+
+ @Override
+ public void saveOrUpdate(final Order order) throws ServiceException {
+
+ if(order.getId()!=null && order.getId()>0) {
+ LOGGER.debug("Updating Order");
+ super.update(order);
+
+ } else {
+ LOGGER.debug("Creating Order");
+ super.create(order);
+
+ }
+ }
+
+ @Override
+ public boolean hasDownloadFiles(Order order) throws ServiceException {
+
+ Validate.notNull(order,"Order cannot be null");
+ Validate.notNull(order.getOrderProducts(),"Order products cannot be null");
+ Validate.notEmpty(order.getOrderProducts(),"Order products cannot be empty");
+
+ boolean hasDownloads = false;
+ for(OrderProduct orderProduct : order.getOrderProducts()) {
+
+ if(CollectionUtils.isNotEmpty(orderProduct.getDownloads())) {
+ hasDownloads = true;
+ break;
+ }
+ }
+
+ return hasDownloads;
+ }
+
+ @Override
+ public List<Order> getCapturableOrders(MerchantStore store, Date startDate, Date endDate) throws ServiceException {
+
+ List<Transaction> transactions = transactionService.listTransactions(startDate, endDate);
+
+ List<Order> returnOrders = null;
+
+ if(!CollectionUtils.isEmpty(transactions)) {
+
+ returnOrders = new ArrayList<Order>();
+
+ //order id
+ Map<Long,Order> preAuthOrders = new HashMap<Long,Order> ();
+ //order id
+ Map<Long,List<Transaction>> processingTransactions = new HashMap<Long,List<Transaction>> ();
+
+ for(Transaction trx : transactions) {
+ Order order = trx.getOrder();
+ if(TransactionType.AUTHORIZE.name().equals(trx.getTransactionType().name())) {
+ preAuthOrders.put(order.getId(), order);
+ }
+
+ //put transaction
+ List<Transaction> listTransactions = null;
+ if(processingTransactions.containsKey(order.getId())) {
+ listTransactions = processingTransactions.get(order.getId());
+ } else {
+ listTransactions = new ArrayList<Transaction>();
+ processingTransactions.put(order.getId(), listTransactions);
+ }
+ listTransactions.add(trx);
+ }
+
+ //should have when captured
+ /**
+ * Order id Transaction type
+ * 1 AUTHORIZE
+ * 1 CAPTURE
+ */
+
+ //should have when not captured
+ /**
+ * Order id Transaction type
+ * 2 AUTHORIZE
+ */
+
+ for(Long orderId : processingTransactions.keySet()) {
+
+ List<Transaction> trx = processingTransactions.get(orderId);
+ if(CollectionUtils.isNotEmpty(trx)) {
+
+ boolean capturable = true;
+ for(Transaction t : trx) {
+
+ if(TransactionType.CAPTURE.name().equals(t.getTransactionType().name())) {
+ capturable = false;
+ } else if(TransactionType.AUTHORIZECAPTURE.name().equals(t.getTransactionType().name())) {
+ capturable = false;
+ } else if(TransactionType.REFUND.name().equals(t.getTransactionType().name())) {
+ capturable = false;
+ }
+
+ }
+
+ if(capturable) {
+ Order o = preAuthOrders.get(orderId);
+ returnOrders.add(o);
+ }
+
+ }
+
+
+ }
+ }
+
+ return returnOrders;
+ }
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/order/ordertotal/OrderTotalServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/order/ordertotal/OrderTotalServiceImpl.java
index 69a5635..f4271af 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/order/ordertotal/OrderTotalServiceImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/order/ordertotal/OrderTotalServiceImpl.java
@@ -51,7 +51,7 @@ public class OrderTotalServiceImpl implements OrderTotalService {
for(ShoppingCartItem item : items) {
Long productId = item.getProductId();
- Product product = productService.getProductForLocale(productId, language, languageService.toLocale(language));
+ Product product = productService.getProductForLocale(productId, language, languageService.toLocale(language, store));
OrderTotal orderTotal = module.caculateProductPiceVariation(summary, item, product, customer, store);
if(orderTotal==null) {
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/payments/PaymentService.java b/sm-core/src/main/java/com/salesmanager/core/business/services/payments/PaymentService.java
index 9df4e21..3a07ac3 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/payments/PaymentService.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/payments/PaymentService.java
@@ -1,103 +1,123 @@
-package com.salesmanager.core.business.services.payments;
-
-import java.math.BigDecimal;
-import java.util.List;
-import java.util.Map;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.Order;
-import com.salesmanager.core.model.payments.CreditCardType;
-import com.salesmanager.core.model.payments.Payment;
-import com.salesmanager.core.model.payments.PaymentMethod;
-import com.salesmanager.core.model.payments.Transaction;
-import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
-import com.salesmanager.core.model.system.IntegrationConfiguration;
-import com.salesmanager.core.model.system.IntegrationModule;
-import com.salesmanager.core.modules.integration.payment.model.PaymentModule;
-
-public interface PaymentService {
-
-
-
- public List<IntegrationModule> getPaymentMethods(MerchantStore store)
- throws ServiceException;
-
- Map<String, IntegrationConfiguration> getPaymentModulesConfigured(
- MerchantStore store) throws ServiceException;
-
- Transaction processPayment(Customer customer, MerchantStore store, Payment payment, List<ShoppingCartItem> items, Order order) throws ServiceException;
- Transaction processRefund(Order order, Customer customer, MerchantStore store, BigDecimal amount) throws ServiceException;
-
- /**
- * Get a specific Payment module by payment type CREDITCART, MONEYORDER ...
- * @param store
- * @param type (payment type)
- * @return IntegrationModule
- * @throws ServiceException
- */
- IntegrationModule getPaymentMethodByType(MerchantStore store, String type)
- throws ServiceException;
-
- /**
- * Get a specific Payment module by payment code (defined in integrationmoduel.json) paypal, authorizenet ..
- * @param store
- * @param name
- * @return IntegrationModule
- * @throws ServiceException
- */
- IntegrationModule getPaymentMethodByCode(MerchantStore store, String name)
- throws ServiceException;
-
- /**
- * Saves a payment module configuration
- * @param configuration
- * @param store
- * @throws ServiceException
- */
- void savePaymentModuleConfiguration(IntegrationConfiguration configuration,
- MerchantStore store) throws ServiceException;
-
- /**
- * Validates if the credit card input information are correct
- * @param number
- * @param type
- * @param month
- * @param date
- * @throws ServiceException
- */
- void validateCreditCard(String number, CreditCardType creditCard, String month, String date)
- throws ServiceException;
-
- /**
- * Get the integration configuration
- * for a specific payment module
- * @param moduleCode
- * @param store
- * @return IntegrationConfiguration
- * @throws ServiceException
- */
- IntegrationConfiguration getPaymentConfiguration(String moduleCode,
- MerchantStore store) throws ServiceException;
-
- void removePaymentModuleConfiguration(String moduleCode, MerchantStore store)
- throws ServiceException;
-
- Transaction processCapturePayment(Order order, Customer customer,
- MerchantStore store)
- throws ServiceException;
-
- List<PaymentMethod> getAcceptedPaymentMethods(MerchantStore store)
- throws ServiceException;
-
- /**
- * Returns a PaymentModule based on the payment code
- * @param paymentModuleCode
- * @return PaymentModule
- * @throws ServiceException
- */
- PaymentModule getPaymentModule(String paymentModuleCode)
- throws ServiceException;
-
+package com.salesmanager.core.business.services.payments;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.payments.CreditCardType;
+import com.salesmanager.core.model.payments.Payment;
+import com.salesmanager.core.model.payments.PaymentMethod;
+import com.salesmanager.core.model.payments.Transaction;
+import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
+import com.salesmanager.core.model.system.IntegrationConfiguration;
+import com.salesmanager.core.model.system.IntegrationModule;
+import com.salesmanager.core.modules.integration.payment.model.PaymentModule;
+
+public interface PaymentService {
+
+
+
+ public List<IntegrationModule> getPaymentMethods(MerchantStore store)
+ throws ServiceException;
+
+ Map<String, IntegrationConfiguration> getPaymentModulesConfigured(
+ MerchantStore store) throws ServiceException;
+
+ Transaction processPayment(Customer customer, MerchantStore store, Payment payment, List<ShoppingCartItem> items, Order order) throws ServiceException;
+ Transaction processRefund(Order order, Customer customer, MerchantStore store, BigDecimal amount) throws ServiceException;
+
+ /**
+ * Get a specific Payment module by payment type CREDITCART, MONEYORDER ...
+ * @param store
+ * @param type (payment type)
+ * @return IntegrationModule
+ * @throws ServiceException
+ */
+ IntegrationModule getPaymentMethodByType(MerchantStore store, String type)
+ throws ServiceException;
+
+ /**
+ * Get a specific Payment module by payment code (defined in integrationmoduel.json) paypal, authorizenet ..
+ * @param store
+ * @param name
+ * @return IntegrationModule
+ * @throws ServiceException
+ */
+ IntegrationModule getPaymentMethodByCode(MerchantStore store, String name)
+ throws ServiceException;
+
+ /**
+ * Saves a payment module configuration
+ * @param configuration
+ * @param store
+ * @throws ServiceException
+ */
+ void savePaymentModuleConfiguration(IntegrationConfiguration configuration,
+ MerchantStore store) throws ServiceException;
+
+ /**
+ * Validates if the credit card input information are correct
+ * @param number
+ * @param type
+ * @param month
+ * @param date
+ * @throws ServiceException
+ */
+ void validateCreditCard(String number, CreditCardType creditCard, String month, String date)
+ throws ServiceException;
+
+ /**
+ * Get the integration configuration
+ * for a specific payment module
+ * @param moduleCode
+ * @param store
+ * @return IntegrationConfiguration
+ * @throws ServiceException
+ */
+ IntegrationConfiguration getPaymentConfiguration(String moduleCode,
+ MerchantStore store) throws ServiceException;
+
+ void removePaymentModuleConfiguration(String moduleCode, MerchantStore store)
+ throws ServiceException;
+
+ Transaction processCapturePayment(Order order, Customer customer,
+ MerchantStore store)
+ throws ServiceException;
+
+ /**
+ * Initializes a transaction
+ * @param order
+ * @param customer
+ * @param payment
+ * @param store
+ * @return Transaction
+ */
+ Transaction initTransaction(Order order, Customer customer, Payment payment, MerchantStore store) throws ServiceException;
+
+ /**
+ * Initializes a transaction without an order
+ * @param order
+ * @param customer
+ * @param payment
+ * @param store
+ * @return Transaction
+ */
+ Transaction initTransaction(Customer customer, Payment payment, MerchantStore store) throws ServiceException;
+
+ List<PaymentMethod> getAcceptedPaymentMethods(MerchantStore store)
+ throws ServiceException;
+
+ /**
+ * Returns a PaymentModule based on the payment code
+ * @param paymentModuleCode
+ * @return PaymentModule
+ * @throws ServiceException
+ */
+ PaymentModule getPaymentModule(String paymentModuleCode)
+ throws ServiceException;
+
}
\ No newline at end of file
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/payments/PaymentServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/payments/PaymentServiceImpl.java
index 3dee2e3..39b80f6 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/payments/PaymentServiceImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/payments/PaymentServiceImpl.java
@@ -1,708 +1,798 @@
-package com.salesmanager.core.business.services.payments;
-
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import javax.annotation.Resource;
-import javax.inject.Inject;
-
-import org.apache.commons.lang3.Validate;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import com.salesmanager.core.business.constants.Constants;
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.order.OrderService;
-import com.salesmanager.core.business.services.reference.loader.ConfigurationModulesLoader;
-import com.salesmanager.core.business.services.system.MerchantConfigurationService;
-import com.salesmanager.core.business.services.system.ModuleConfigurationService;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.Order;
-import com.salesmanager.core.model.order.OrderTotal;
-import com.salesmanager.core.model.order.OrderTotalType;
-import com.salesmanager.core.model.order.orderstatus.OrderStatus;
-import com.salesmanager.core.model.order.orderstatus.OrderStatusHistory;
-import com.salesmanager.core.model.payments.CreditCardPayment;
-import com.salesmanager.core.model.payments.CreditCardType;
-import com.salesmanager.core.model.payments.Payment;
-import com.salesmanager.core.model.payments.PaymentMethod;
-import com.salesmanager.core.model.payments.PaymentType;
-import com.salesmanager.core.model.payments.Transaction;
-import com.salesmanager.core.model.payments.TransactionType;
-import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
-import com.salesmanager.core.model.system.IntegrationConfiguration;
-import com.salesmanager.core.model.system.IntegrationModule;
-import com.salesmanager.core.model.system.MerchantConfiguration;
-import com.salesmanager.core.modules.integration.IntegrationException;
-import com.salesmanager.core.modules.integration.payment.model.PaymentModule;
-import com.salesmanager.core.modules.utils.Encryption;
-
-
-@Service("paymentService")
-public class PaymentServiceImpl implements PaymentService {
-
-
-
- private final static String PAYMENT_MODULES = "PAYMENT";
-
- @Inject
- private MerchantConfigurationService merchantConfigurationService;
-
- @Inject
- private ModuleConfigurationService moduleConfigurationService;
-
- @Inject
- private TransactionService transactionService;
-
- @Inject
- private OrderService orderService;
-
- @Inject
- @Resource(name="paymentModules")
- private Map<String,PaymentModule> paymentModules;
-
- @Inject
- private Encryption encryption;
-
- @Override
- public List<IntegrationModule> getPaymentMethods(MerchantStore store) throws ServiceException {
-
- List<IntegrationModule> modules = moduleConfigurationService.getIntegrationModules(PAYMENT_MODULES);
- List<IntegrationModule> returnModules = new ArrayList<IntegrationModule>();
-
- for(IntegrationModule module : modules) {
- if(module.getRegionsSet().contains(store.getCountry().getIsoCode())
- || module.getRegionsSet().contains("*")) {
-
- returnModules.add(module);
- }
- }
-
- return returnModules;
- }
-
- @Override
- public List<PaymentMethod> getAcceptedPaymentMethods(MerchantStore store) throws ServiceException {
-
- Map<String,IntegrationConfiguration> modules = this.getPaymentModulesConfigured(store);
-
- List<PaymentMethod> returnModules = new ArrayList<PaymentMethod>();
-
- for(String module : modules.keySet()) {
- IntegrationConfiguration config = modules.get(module);
- if(config.isActive()) {
-
- IntegrationModule md = this.getPaymentMethodByCode(store, config.getModuleCode());
- if(md==null) {
- continue;
- }
- PaymentMethod paymentMethod = new PaymentMethod();
-
- paymentMethod.setDefaultSelected(config.isDefaultSelected());
- paymentMethod.setPaymentMethodCode(config.getModuleCode());
- paymentMethod.setModule(md);
- paymentMethod.setInformations(config);
-
- PaymentType type = PaymentType.fromString(md.getType());
-
- /**
- if(md.getType().equalsIgnoreCase(PaymentType.CREDITCARD.name())) {
- type = PaymentType.CREDITCARD;
- } else if(md.getType().equalsIgnoreCase(PaymentType.FREE.name())) {
- type = PaymentType.FREE;
- } else if(md.getType().equalsIgnoreCase(PaymentType.MONEYORDER.name())) {
- type = PaymentType.MONEYORDER;
- } else if(md.getType().equalsIgnoreCase(PaymentType.PAYPAL.name())) {
- type = PaymentType.PAYPAL;
- } else if(md.getType().equalsIgnoreCase(PaymentType.STRIPE.name())) {
- type = PaymentType.STRIPE;
- }**/
- paymentMethod.setPaymentType(type);
- returnModules.add(paymentMethod);
- }
- }
-
- return returnModules;
-
-
- }
-
- @Override
- public IntegrationModule getPaymentMethodByType(MerchantStore store, String type) throws ServiceException {
- List<IntegrationModule> modules = getPaymentMethods(store);
-
- for(IntegrationModule module : modules) {
- if(module.getModule().equals(type)) {
-
- return module;
- }
- }
-
- return null;
- }
-
- @Override
- public IntegrationModule getPaymentMethodByCode(MerchantStore store,
- String code) throws ServiceException {
- List<IntegrationModule> modules = getPaymentMethods(store);
-
- for(IntegrationModule module : modules) {
- if(module.getCode().equals(code)) {
-
- return module;
- }
- }
-
- return null;
- }
-
- @Override
- public IntegrationConfiguration getPaymentConfiguration(String moduleCode, MerchantStore store) throws ServiceException {
-
-
- Map<String,IntegrationConfiguration> configuredModules = getPaymentModulesConfigured(store);
- if(configuredModules!=null) {
- for(String key : configuredModules.keySet()) {
- if(key.equals(moduleCode)) {
- return configuredModules.get(key);
- }
- }
- }
-
- return null;
-
- }
-
-
-
- @Override
- public Map<String,IntegrationConfiguration> getPaymentModulesConfigured(MerchantStore store) throws ServiceException {
-
- try {
-
- Map<String,IntegrationConfiguration> modules = new HashMap<String,IntegrationConfiguration>();
- MerchantConfiguration merchantConfiguration = merchantConfigurationService.getMerchantConfiguration(PAYMENT_MODULES, store);
- if(merchantConfiguration!=null) {
-
- if(!StringUtils.isBlank(merchantConfiguration.getValue())) {
-
- String decrypted = encryption.decrypt(merchantConfiguration.getValue());
- modules = ConfigurationModulesLoader.loadIntegrationConfigurations(decrypted);
-
-
- }
- }
- return modules;
-
- } catch (Exception e) {
- throw new ServiceException(e);
- }
- }
-
- @Override
- public void savePaymentModuleConfiguration(IntegrationConfiguration configuration, MerchantStore store) throws ServiceException {
-
- //validate entries
- try {
-
- String moduleCode = configuration.getModuleCode();
- PaymentModule module = (PaymentModule)paymentModules.get(moduleCode);
- if(module==null) {
- throw new ServiceException("Payment module " + moduleCode + " does not exist");
- }
- module.validateModuleConfiguration(configuration, store);
-
- } catch (IntegrationException ie) {
- throw ie;
- }
-
- try {
- Map<String,IntegrationConfiguration> modules = new HashMap<String,IntegrationConfiguration>();
- MerchantConfiguration merchantConfiguration = merchantConfigurationService.getMerchantConfiguration(PAYMENT_MODULES, store);
- if(merchantConfiguration!=null) {
- if(!StringUtils.isBlank(merchantConfiguration.getValue())) {
-
- String decrypted = encryption.decrypt(merchantConfiguration.getValue());
-
- modules = ConfigurationModulesLoader.loadIntegrationConfigurations(decrypted);
- }
- } else {
- merchantConfiguration = new MerchantConfiguration();
- merchantConfiguration.setMerchantStore(store);
- merchantConfiguration.setKey(PAYMENT_MODULES);
- }
- modules.put(configuration.getModuleCode(), configuration);
-
- String configs = ConfigurationModulesLoader.toJSONString(modules);
-
- String encrypted = encryption.encrypt(configs);
- merchantConfiguration.setValue(encrypted);
-
- merchantConfigurationService.saveOrUpdate(merchantConfiguration);
-
- } catch (Exception e) {
- throw new ServiceException(e);
- }
- }
-
- @Override
- public void removePaymentModuleConfiguration(String moduleCode, MerchantStore store) throws ServiceException {
-
-
-
- try {
- Map<String,IntegrationConfiguration> modules = new HashMap<String,IntegrationConfiguration>();
- MerchantConfiguration merchantConfiguration = merchantConfigurationService.getMerchantConfiguration(PAYMENT_MODULES, store);
- if(merchantConfiguration!=null) {
-
- if(!StringUtils.isBlank(merchantConfiguration.getValue())) {
-
- String decrypted = encryption.decrypt(merchantConfiguration.getValue());
- modules = ConfigurationModulesLoader.loadIntegrationConfigurations(decrypted);
- }
-
- modules.remove(moduleCode);
- String configs = ConfigurationModulesLoader.toJSONString(modules);
-
- String encrypted = encryption.encrypt(configs);
- merchantConfiguration.setValue(encrypted);
-
- merchantConfigurationService.saveOrUpdate(merchantConfiguration);
-
-
- }
-
- MerchantConfiguration configuration = merchantConfigurationService.getMerchantConfiguration(moduleCode, store);
-
- if(configuration!=null) {//custom module
-
- merchantConfigurationService.delete(configuration);
- }
-
-
- } catch (Exception e) {
- throw new ServiceException(e);
- }
-
- }
-
-
-
-
-
- @Override
- public Transaction processPayment(Customer customer,
- MerchantStore store, Payment payment, List<ShoppingCartItem> items, Order order)
- throws ServiceException {
-
-
- Validate.notNull(customer);
- Validate.notNull(store);
- Validate.notNull(payment);
- Validate.notNull(order);
- Validate.notNull(order.getTotal());
-
- payment.setCurrency(store.getCurrency());
-
- BigDecimal amount = order.getTotal();
-
- //must have a shipping module configured
- Map<String, IntegrationConfiguration> modules = this.getPaymentModulesConfigured(store);
- if(modules==null){
- throw new ServiceException("No payment module configured");
- }
-
- IntegrationConfiguration configuration = modules.get(payment.getModuleName());
-
- if(configuration==null) {
- throw new ServiceException("Payment module " + payment.getModuleName() + " is not configured");
- }
-
- if(!configuration.isActive()) {
- throw new ServiceException("Payment module " + payment.getModuleName() + " is not active");
- }
-
- String sTransactionType = configuration.getIntegrationKeys().get("transaction");
- if(sTransactionType==null) {
- sTransactionType = TransactionType.AUTHORIZECAPTURE.name();
- }
-
-
- if(sTransactionType.equals(TransactionType.AUTHORIZE.name())) {
- payment.setTransactionType(TransactionType.AUTHORIZE);
- } else {
- payment.setTransactionType(TransactionType.AUTHORIZECAPTURE);
- }
-
-
- PaymentModule module = this.paymentModules.get(payment.getModuleName());
-
- if(module==null) {
- throw new ServiceException("Payment module " + payment.getModuleName() + " does not exist");
- }
-
- if(payment instanceof CreditCardPayment) {
- CreditCardPayment creditCardPayment = (CreditCardPayment)payment;
- validateCreditCard(creditCardPayment.getCreditCardNumber(),creditCardPayment.getCreditCard(),creditCardPayment.getExpirationMonth(),creditCardPayment.getExpirationYear());
- }
-
- IntegrationModule integrationModule = getPaymentMethodByCode(store,payment.getModuleName());
- TransactionType transactionType = TransactionType.valueOf(sTransactionType);
- if(transactionType==null) {
- transactionType = payment.getTransactionType();
- if(transactionType.equals(TransactionType.CAPTURE.name())) {
- throw new ServiceException("This method does not allow to process capture transaction. Use processCapturePayment");
- }
- }
-
- Transaction transaction = null;
- if(transactionType == TransactionType.AUTHORIZE) {
- transaction = module.authorize(store, customer, items, amount, payment, configuration, integrationModule);
- } else if(transactionType == TransactionType.AUTHORIZECAPTURE) {
- transaction = module.authorizeAndCapture(store, customer, items, amount, payment, configuration, integrationModule);
- } else if(transactionType == TransactionType.INIT) {
- transaction = module.initTransaction(store, customer, amount, payment, configuration, integrationModule);
- }
-
-
- if(transactionType != TransactionType.INIT) {
- transactionService.create(transaction);
- }
-
- if(transactionType == TransactionType.AUTHORIZECAPTURE) {
- order.setStatus(OrderStatus.ORDERED);
- if(payment.getPaymentType().name()!=PaymentType.MONEYORDER.name()) {
- order.setStatus(OrderStatus.PROCESSED);
- }
- }
-
- return transaction;
-
-
-
- }
-
- @Override
- public PaymentModule getPaymentModule(String paymentModuleCode) throws ServiceException {
- return paymentModules.get(paymentModuleCode);
- }
-
- @Override
- public Transaction processCapturePayment(Order order, Customer customer,
- MerchantStore store)
- throws ServiceException {
-
-
- Validate.notNull(customer);
- Validate.notNull(store);
- Validate.notNull(order);
-
-
-
- //must have a shipping module configured
- Map<String, IntegrationConfiguration> modules = this.getPaymentModulesConfigured(store);
- if(modules==null){
- throw new ServiceException("No payment module configured");
- }
-
- IntegrationConfiguration configuration = modules.get(order.getPaymentModuleCode());
-
- if(configuration==null) {
- throw new ServiceException("Payment module " + order.getPaymentModuleCode() + " is not configured");
- }
-
- if(!configuration.isActive()) {
- throw new ServiceException("Payment module " + order.getPaymentModuleCode() + " is not active");
- }
-
-
- PaymentModule module = this.paymentModules.get(order.getPaymentModuleCode());
-
- if(module==null) {
- throw new ServiceException("Payment module " + order.getPaymentModuleCode() + " does not exist");
- }
-
-
- IntegrationModule integrationModule = getPaymentMethodByCode(store,order.getPaymentModuleCode());
-
- //TransactionType transactionType = payment.getTransactionType();
-
- //get the previous transaction
- Transaction trx = transactionService.getCapturableTransaction(order);
- if(trx==null) {
- throw new ServiceException("No capturable transaction for order id " + order.getId());
- }
- Transaction transaction = module.capture(store, customer, order, trx, configuration, integrationModule);
- transaction.setOrder(order);
-
-
-
- transactionService.create(transaction);
-
-
- OrderStatusHistory orderHistory = new OrderStatusHistory();
- orderHistory.setOrder(order);
- orderHistory.setStatus(OrderStatus.PROCESSED);
- orderHistory.setDateAdded(new Date());
-
- orderService.addOrderStatusHistory(order, orderHistory);
-
- order.setStatus(OrderStatus.PROCESSED);
- orderService.saveOrUpdate(order);
-
- return transaction;
-
-
-
- }
-
- @Override
- public Transaction processRefund(Order order, Customer customer,
- MerchantStore store, BigDecimal amount)
- throws ServiceException {
-
-
- Validate.notNull(customer);
- Validate.notNull(store);
- Validate.notNull(amount);
- Validate.notNull(order);
- Validate.notNull(order.getOrderTotal());
-
-
- BigDecimal orderTotal = order.getTotal();
-
- if(amount.doubleValue()>orderTotal.doubleValue()) {
- throw new ServiceException("Invalid amount, the refunded amount is greater than the total allowed");
- }
-
-
- String module = order.getPaymentModuleCode();
- Map<String, IntegrationConfiguration> modules = this.getPaymentModulesConfigured(store);
- if(modules==null){
- throw new ServiceException("No payment module configured");
- }
-
- IntegrationConfiguration configuration = modules.get(module);
-
- if(configuration==null) {
- throw new ServiceException("Payment module " + module + " is not configured");
- }
-
- PaymentModule paymentModule = this.paymentModules.get(module);
-
- if(paymentModule==null) {
- throw new ServiceException("Payment module " + paymentModule + " does not exist");
- }
-
- boolean partial = false;
- if(amount.doubleValue()!=order.getTotal().doubleValue()) {
- partial = true;
- }
-
- IntegrationModule integrationModule = getPaymentMethodByCode(store,module);
-
- //get the associated transaction
- Transaction refundable = transactionService.getRefundableTransaction(order);
-
- if(refundable==null) {
- throw new ServiceException("No refundable transaction for this order");
- }
-
- Transaction transaction = paymentModule.refund(partial, store, refundable, order, amount, configuration, integrationModule);
- transaction.setOrder(order);
- transactionService.create(transaction);
-
- OrderTotal refund = new OrderTotal();
- refund.setModule(Constants.OT_REFUND_MODULE_CODE);
- refund.setText(Constants.OT_REFUND_MODULE_CODE);
- refund.setTitle(Constants.OT_REFUND_MODULE_CODE);
- refund.setOrderTotalCode(Constants.OT_REFUND_MODULE_CODE);
- refund.setOrderTotalType(OrderTotalType.REFUND);
- refund.setValue(amount);
- refund.setSortOrder(100);
- refund.setOrder(order);
-
- order.getOrderTotal().add(refund);
-
- //update order total
- orderTotal = orderTotal.subtract(amount);
-
- //update ordertotal refund
- Set<OrderTotal> totals = order.getOrderTotal();
- for(OrderTotal total : totals) {
- if(total.getModule().equals(Constants.OT_TOTAL_MODULE_CODE)) {
- total.setValue(orderTotal);
- }
- }
-
-
-
- order.setTotal(orderTotal);
- order.setStatus(OrderStatus.REFUNDED);
-
-
-
- OrderStatusHistory orderHistory = new OrderStatusHistory();
- orderHistory.setOrder(order);
- orderHistory.setStatus(OrderStatus.REFUNDED);
- orderHistory.setDateAdded(new Date());
- order.getOrderHistory().add(orderHistory);
-
- orderService.saveOrUpdate(order);
-
- return transaction;
- }
-
- @Override
- public void validateCreditCard(String number, CreditCardType creditCard, String month, String date)
- throws ServiceException {
-
- try {
- Integer.parseInt(month);
- Integer.parseInt(date);
- } catch (NumberFormatException nfe) {
- ServiceException ex = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"Invalid date format","messages.error.creditcard.dateformat");
- throw ex;
- }
-
- if (StringUtils.isBlank(number)) {
- ServiceException ex = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"Invalid card number","messages.error.creditcard.number");
- throw ex;
- }
-
- Matcher m = Pattern.compile("[^\\d\\s.-]").matcher(number);
-
- if (m.find()) {
- ServiceException ex = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"Invalid card number","messages.error.creditcard.number");
- throw ex;
- }
-
- Matcher matcher = Pattern.compile("[\\s.-]").matcher(number);
-
- number = matcher.replaceAll("");
- validateCreditCardDate(Integer.parseInt(month), Integer.parseInt(date));
- validateCreditCardNumber(number, creditCard);
- }
-
- private void validateCreditCardDate(int m, int y) throws ServiceException {
- java.util.Calendar cal = new java.util.GregorianCalendar();
- int monthNow = cal.get(java.util.Calendar.MONTH) + 1;
- int yearNow = cal.get(java.util.Calendar.YEAR);
- if (yearNow > y) {
- ServiceException ex = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"Invalid date format","messages.error.creditcard.dateformat");
- throw ex;
- }
- // OK, change implementation
- if (yearNow == y && monthNow > m) {
- ServiceException ex = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"Invalid date format","messages.error.creditcard.dateformat");
- throw ex;
- }
-
- }
-
- @Deprecated
- /**
- * Use commons validator CreditCardValidator
- * @param number
- * @param creditCard
- * @throws ServiceException
- */
- private void validateCreditCardNumber(String number, CreditCardType creditCard)
- throws ServiceException {
-
- //TODO implement
- if(CreditCardType.MASTERCARD.equals(creditCard.name())) {
- if (number.length() != 16
- || Integer.parseInt(number.substring(0, 2)) < 51
- || Integer.parseInt(number.substring(0, 2)) > 55) {
- ServiceException ex = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"Invalid card number","messages.error.creditcard.number");
- throw ex;
- }
- }
-
- if(CreditCardType.VISA.equals(creditCard.name())) {
- if ((number.length() != 13 && number.length() != 16)
- || Integer.parseInt(number.substring(0, 1)) != 4) {
- ServiceException ex = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"Invalid card number","messages.error.creditcard.number");
- throw ex;
- }
- }
-
- if(CreditCardType.AMEX.equals(creditCard.name())) {
- if (number.length() != 15
- || (Integer.parseInt(number.substring(0, 2)) != 34 && Integer
- .parseInt(number.substring(0, 2)) != 37)) {
- ServiceException ex = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"Invalid card number","messages.error.creditcard.number");
- throw ex;
- }
- }
-
- if(CreditCardType.DINERS.equals(creditCard.name())) {
- if (number.length() != 14
- || ((Integer.parseInt(number.substring(0, 2)) != 36 && Integer
- .parseInt(number.substring(0, 2)) != 38)
- && Integer.parseInt(number.substring(0, 3)) < 300 || Integer
- .parseInt(number.substring(0, 3)) > 305)) {
- ServiceException ex = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"Invalid card number","messages.error.creditcard.number");
- throw ex;
- }
- }
-
- if(CreditCardType.DISCOVERY.equals(creditCard.name())) {
- if (number.length() != 16
- || Integer.parseInt(number.substring(0, 5)) != 6011) {
- ServiceException ex = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"Invalid card number","messages.error.creditcard.number");
- throw ex;
- }
- }
-
- luhnValidate(number);
- }
-
- // The Luhn algorithm is basically a CRC type
- // system for checking the validity of an entry.
- // All major credit cards use numbers that will
- // pass the Luhn check. Also, all of them are based
- // on MOD 10.
- @Deprecated
- private void luhnValidate(String numberString)
- throws ServiceException {
- char[] charArray = numberString.toCharArray();
- int[] number = new int[charArray.length];
- int total = 0;
-
- for (int i = 0; i < charArray.length; i++) {
- number[i] = Character.getNumericValue(charArray[i]);
- }
-
- for (int i = number.length - 2; i > -1; i -= 2) {
- number[i] *= 2;
-
- if (number[i] > 9)
- number[i] -= 9;
- }
-
- for (int i = 0; i < number.length; i++)
- total += number[i];
-
- if (total % 10 != 0) {
- ServiceException ex = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"Invalid card number","messages.error.creditcard.number");
- throw ex;
- }
-
- }
-
-
-
-
-
-}
+package com.salesmanager.core.business.services.payments;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.annotation.Resource;
+import javax.inject.Inject;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.Validate;
+import org.springframework.stereotype.Service;
+
+import com.salesmanager.core.business.constants.Constants;
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.order.OrderService;
+import com.salesmanager.core.business.services.reference.loader.ConfigurationModulesLoader;
+import com.salesmanager.core.business.services.system.MerchantConfigurationService;
+import com.salesmanager.core.business.services.system.ModuleConfigurationService;
+import com.salesmanager.core.business.utils.CoreConfiguration;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.order.OrderTotal;
+import com.salesmanager.core.model.order.OrderTotalType;
+import com.salesmanager.core.model.order.orderstatus.OrderStatus;
+import com.salesmanager.core.model.order.orderstatus.OrderStatusHistory;
+import com.salesmanager.core.model.payments.CreditCardPayment;
+import com.salesmanager.core.model.payments.CreditCardType;
+import com.salesmanager.core.model.payments.Payment;
+import com.salesmanager.core.model.payments.PaymentMethod;
+import com.salesmanager.core.model.payments.PaymentType;
+import com.salesmanager.core.model.payments.Transaction;
+import com.salesmanager.core.model.payments.TransactionType;
+import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
+import com.salesmanager.core.model.system.IntegrationConfiguration;
+import com.salesmanager.core.model.system.IntegrationModule;
+import com.salesmanager.core.model.system.MerchantConfiguration;
+import com.salesmanager.core.modules.integration.IntegrationException;
+import com.salesmanager.core.modules.integration.payment.model.PaymentModule;
+import com.salesmanager.core.modules.utils.Encryption;
+
+
+@Service("paymentService")
+public class PaymentServiceImpl implements PaymentService {
+
+
+
+ private final static String PAYMENT_MODULES = "PAYMENT";
+
+ @Inject
+ private MerchantConfigurationService merchantConfigurationService;
+
+ @Inject
+ private ModuleConfigurationService moduleConfigurationService;
+
+ @Inject
+ private TransactionService transactionService;
+
+ @Inject
+ private OrderService orderService;
+
+ @Inject
+ private CoreConfiguration coreConfiguration;
+
+ @Inject
+ @Resource(name="paymentModules")
+ private Map<String,PaymentModule> paymentModules;
+
+ @Inject
+ private Encryption encryption;
+
+ @Override
+ public List<IntegrationModule> getPaymentMethods(MerchantStore store) throws ServiceException {
+
+ List<IntegrationModule> modules = moduleConfigurationService.getIntegrationModules(PAYMENT_MODULES);
+ List<IntegrationModule> returnModules = new ArrayList<IntegrationModule>();
+
+ for(IntegrationModule module : modules) {
+ if(module.getRegionsSet().contains(store.getCountry().getIsoCode())
+ || module.getRegionsSet().contains("*")) {
+
+ returnModules.add(module);
+ }
+ }
+
+ return returnModules;
+ }
+
+ @Override
+ public List<PaymentMethod> getAcceptedPaymentMethods(MerchantStore store) throws ServiceException {
+
+ Map<String,IntegrationConfiguration> modules = this.getPaymentModulesConfigured(store);
+
+ List<PaymentMethod> returnModules = new ArrayList<PaymentMethod>();
+
+ for(String module : modules.keySet()) {
+ IntegrationConfiguration config = modules.get(module);
+ if(config.isActive()) {
+
+ IntegrationModule md = this.getPaymentMethodByCode(store, config.getModuleCode());
+ if(md==null) {
+ continue;
+ }
+ PaymentMethod paymentMethod = new PaymentMethod();
+
+ paymentMethod.setDefaultSelected(config.isDefaultSelected());
+ paymentMethod.setPaymentMethodCode(config.getModuleCode());
+ paymentMethod.setModule(md);
+ paymentMethod.setInformations(config);
+
+ PaymentType type = PaymentType.fromString(md.getType());
+
+ /**
+ if(md.getType().equalsIgnoreCase(PaymentType.CREDITCARD.name())) {
+ type = PaymentType.CREDITCARD;
+ } else if(md.getType().equalsIgnoreCase(PaymentType.FREE.name())) {
+ type = PaymentType.FREE;
+ } else if(md.getType().equalsIgnoreCase(PaymentType.MONEYORDER.name())) {
+ type = PaymentType.MONEYORDER;
+ } else if(md.getType().equalsIgnoreCase(PaymentType.PAYPAL.name())) {
+ type = PaymentType.PAYPAL;
+ } else if(md.getType().equalsIgnoreCase(PaymentType.STRIPE.name())) {
+ type = PaymentType.STRIPE;
+ }**/
+ paymentMethod.setPaymentType(type);
+ returnModules.add(paymentMethod);
+ }
+ }
+
+ return returnModules;
+
+
+ }
+
+ @Override
+ public IntegrationModule getPaymentMethodByType(MerchantStore store, String type) throws ServiceException {
+ List<IntegrationModule> modules = getPaymentMethods(store);
+
+ for(IntegrationModule module : modules) {
+ if(module.getModule().equals(type)) {
+
+ return module;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public IntegrationModule getPaymentMethodByCode(MerchantStore store,
+ String code) throws ServiceException {
+ List<IntegrationModule> modules = getPaymentMethods(store);
+
+ for(IntegrationModule module : modules) {
+ if(module.getCode().equals(code)) {
+
+ return module;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public IntegrationConfiguration getPaymentConfiguration(String moduleCode, MerchantStore store) throws ServiceException {
+
+ Validate.notNull(moduleCode,"Module code must not be null");
+ Validate.notNull(store,"Store must not be null");
+
+ String mod = moduleCode.toLowerCase();
+
+ Map<String,IntegrationConfiguration> configuredModules = getPaymentModulesConfigured(store);
+ if(configuredModules!=null) {
+ for(String key : configuredModules.keySet()) {
+ if(key.equals(mod)) {
+ return configuredModules.get(key);
+ }
+ }
+ }
+
+ return null;
+
+ }
+
+
+
+ @Override
+ public Map<String,IntegrationConfiguration> getPaymentModulesConfigured(MerchantStore store) throws ServiceException {
+
+ try {
+
+ Map<String,IntegrationConfiguration> modules = new HashMap<String,IntegrationConfiguration>();
+ MerchantConfiguration merchantConfiguration = merchantConfigurationService.getMerchantConfiguration(PAYMENT_MODULES, store);
+ if(merchantConfiguration!=null) {
+
+ if(!StringUtils.isBlank(merchantConfiguration.getValue())) {
+
+ String decrypted = encryption.decrypt(merchantConfiguration.getValue());
+ modules = ConfigurationModulesLoader.loadIntegrationConfigurations(decrypted);
+
+
+ }
+ }
+ return modules;
+
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ }
+ }
+
+ @Override
+ public void savePaymentModuleConfiguration(IntegrationConfiguration configuration, MerchantStore store) throws ServiceException {
+
+ //validate entries
+ try {
+
+ String moduleCode = configuration.getModuleCode();
+ PaymentModule module = (PaymentModule)paymentModules.get(moduleCode);
+ if(module==null) {
+ throw new ServiceException("Payment module " + moduleCode + " does not exist");
+ }
+ module.validateModuleConfiguration(configuration, store);
+
+ } catch (IntegrationException ie) {
+ throw ie;
+ }
+
+ try {
+ Map<String,IntegrationConfiguration> modules = new HashMap<String,IntegrationConfiguration>();
+ MerchantConfiguration merchantConfiguration = merchantConfigurationService.getMerchantConfiguration(PAYMENT_MODULES, store);
+ if(merchantConfiguration!=null) {
+ if(!StringUtils.isBlank(merchantConfiguration.getValue())) {
+
+ String decrypted = encryption.decrypt(merchantConfiguration.getValue());
+
+ modules = ConfigurationModulesLoader.loadIntegrationConfigurations(decrypted);
+ }
+ } else {
+ merchantConfiguration = new MerchantConfiguration();
+ merchantConfiguration.setMerchantStore(store);
+ merchantConfiguration.setKey(PAYMENT_MODULES);
+ }
+ modules.put(configuration.getModuleCode(), configuration);
+
+ String configs = ConfigurationModulesLoader.toJSONString(modules);
+
+ String encrypted = encryption.encrypt(configs);
+ merchantConfiguration.setValue(encrypted);
+
+ merchantConfigurationService.saveOrUpdate(merchantConfiguration);
+
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ }
+ }
+
+ @Override
+ public void removePaymentModuleConfiguration(String moduleCode, MerchantStore store) throws ServiceException {
+
+
+
+ try {
+ Map<String,IntegrationConfiguration> modules = new HashMap<String,IntegrationConfiguration>();
+ MerchantConfiguration merchantConfiguration = merchantConfigurationService.getMerchantConfiguration(PAYMENT_MODULES, store);
+ if(merchantConfiguration!=null) {
+
+ if(!StringUtils.isBlank(merchantConfiguration.getValue())) {
+
+ String decrypted = encryption.decrypt(merchantConfiguration.getValue());
+ modules = ConfigurationModulesLoader.loadIntegrationConfigurations(decrypted);
+ }
+
+ modules.remove(moduleCode);
+ String configs = ConfigurationModulesLoader.toJSONString(modules);
+
+ String encrypted = encryption.encrypt(configs);
+ merchantConfiguration.setValue(encrypted);
+
+ merchantConfigurationService.saveOrUpdate(merchantConfiguration);
+
+
+ }
+
+ MerchantConfiguration configuration = merchantConfigurationService.getMerchantConfiguration(moduleCode, store);
+
+ if(configuration!=null) {//custom module
+
+ merchantConfigurationService.delete(configuration);
+ }
+
+
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ }
+
+ }
+
+
+
+
+
+ @Override
+ public Transaction processPayment(Customer customer,
+ MerchantStore store, Payment payment, List<ShoppingCartItem> items, Order order)
+ throws ServiceException {
+
+
+ Validate.notNull(customer);
+ Validate.notNull(store);
+ Validate.notNull(payment);
+ Validate.notNull(order);
+ Validate.notNull(order.getTotal());
+
+ payment.setCurrency(store.getCurrency());
+
+ BigDecimal amount = order.getTotal();
+
+ //must have a shipping module configured
+ Map<String, IntegrationConfiguration> modules = this.getPaymentModulesConfigured(store);
+ if(modules==null){
+ throw new ServiceException("No payment module configured");
+ }
+
+ IntegrationConfiguration configuration = modules.get(payment.getModuleName());
+
+ if(configuration==null) {
+ throw new ServiceException("Payment module " + payment.getModuleName() + " is not configured");
+ }
+
+ if(!configuration.isActive()) {
+ throw new ServiceException("Payment module " + payment.getModuleName() + " is not active");
+ }
+
+ String sTransactionType = configuration.getIntegrationKeys().get("transaction");
+ if(sTransactionType==null) {
+ sTransactionType = TransactionType.AUTHORIZECAPTURE.name();
+ }
+
+
+ if(sTransactionType.equals(TransactionType.AUTHORIZE.name())) {
+ payment.setTransactionType(TransactionType.AUTHORIZE);
+ } else {
+ payment.setTransactionType(TransactionType.AUTHORIZECAPTURE);
+ }
+
+
+ PaymentModule module = this.paymentModules.get(payment.getModuleName());
+
+ if(module==null) {
+ throw new ServiceException("Payment module " + payment.getModuleName() + " does not exist");
+ }
+
+ if(payment instanceof CreditCardPayment && "true".equals(coreConfiguration.getProperty("VALIDATE_CREDIT_CARD"))) {
+ CreditCardPayment creditCardPayment = (CreditCardPayment)payment;
+ validateCreditCard(creditCardPayment.getCreditCardNumber(),creditCardPayment.getCreditCard(),creditCardPayment.getExpirationMonth(),creditCardPayment.getExpirationYear());
+ }
+
+ IntegrationModule integrationModule = getPaymentMethodByCode(store,payment.getModuleName());
+ TransactionType transactionType = TransactionType.valueOf(sTransactionType);
+ if(transactionType==null) {
+ transactionType = payment.getTransactionType();
+ if(transactionType.equals(TransactionType.CAPTURE.name())) {
+ throw new ServiceException("This method does not allow to process capture transaction. Use processCapturePayment");
+ }
+ }
+
+ Transaction transaction = null;
+ if(transactionType == TransactionType.AUTHORIZE) {
+ transaction = module.authorize(store, customer, items, amount, payment, configuration, integrationModule);
+ } else if(transactionType == TransactionType.AUTHORIZECAPTURE) {
+ transaction = module.authorizeAndCapture(store, customer, items, amount, payment, configuration, integrationModule);
+ } else if(transactionType == TransactionType.INIT) {
+ transaction = module.initTransaction(store, customer, amount, payment, configuration, integrationModule);
+ }
+
+
+ if(transactionType != TransactionType.INIT) {
+ transactionService.create(transaction);
+ }
+
+ if(transactionType == TransactionType.AUTHORIZECAPTURE) {
+ order.setStatus(OrderStatus.ORDERED);
+ if(payment.getPaymentType().name()!=PaymentType.MONEYORDER.name()) {
+ order.setStatus(OrderStatus.PROCESSED);
+ }
+ }
+
+ return transaction;
+
+
+
+ }
+
+ @Override
+ public PaymentModule getPaymentModule(String paymentModuleCode) throws ServiceException {
+ return paymentModules.get(paymentModuleCode);
+ }
+
+ @Override
+ public Transaction processCapturePayment(Order order, Customer customer,
+ MerchantStore store)
+ throws ServiceException {
+
+
+ Validate.notNull(customer);
+ Validate.notNull(store);
+ Validate.notNull(order);
+
+
+
+ //must have a shipping module configured
+ Map<String, IntegrationConfiguration> modules = this.getPaymentModulesConfigured(store);
+ if(modules==null){
+ throw new ServiceException("No payment module configured");
+ }
+
+ IntegrationConfiguration configuration = modules.get(order.getPaymentModuleCode());
+
+ if(configuration==null) {
+ throw new ServiceException("Payment module " + order.getPaymentModuleCode() + " is not configured");
+ }
+
+ if(!configuration.isActive()) {
+ throw new ServiceException("Payment module " + order.getPaymentModuleCode() + " is not active");
+ }
+
+
+ PaymentModule module = this.paymentModules.get(order.getPaymentModuleCode());
+
+ if(module==null) {
+ throw new ServiceException("Payment module " + order.getPaymentModuleCode() + " does not exist");
+ }
+
+
+ IntegrationModule integrationModule = getPaymentMethodByCode(store,order.getPaymentModuleCode());
+
+ //TransactionType transactionType = payment.getTransactionType();
+
+ //get the previous transaction
+ Transaction trx = transactionService.getCapturableTransaction(order);
+ if(trx==null) {
+ throw new ServiceException("No capturable transaction for order id " + order.getId());
+ }
+ Transaction transaction = module.capture(store, customer, order, trx, configuration, integrationModule);
+ transaction.setOrder(order);
+
+
+
+ transactionService.create(transaction);
+
+
+ OrderStatusHistory orderHistory = new OrderStatusHistory();
+ orderHistory.setOrder(order);
+ orderHistory.setStatus(OrderStatus.PROCESSED);
+ orderHistory.setDateAdded(new Date());
+
+ orderService.addOrderStatusHistory(order, orderHistory);
+
+ order.setStatus(OrderStatus.PROCESSED);
+ orderService.saveOrUpdate(order);
+
+ return transaction;
+
+
+
+ }
+
+ @Override
+ public Transaction processRefund(Order order, Customer customer,
+ MerchantStore store, BigDecimal amount)
+ throws ServiceException {
+
+
+ Validate.notNull(customer);
+ Validate.notNull(store);
+ Validate.notNull(amount);
+ Validate.notNull(order);
+ Validate.notNull(order.getOrderTotal());
+
+
+ BigDecimal orderTotal = order.getTotal();
+
+ if(amount.doubleValue()>orderTotal.doubleValue()) {
+ throw new ServiceException("Invalid amount, the refunded amount is greater than the total allowed");
+ }
+
+
+ String module = order.getPaymentModuleCode();
+ Map<String, IntegrationConfiguration> modules = this.getPaymentModulesConfigured(store);
+ if(modules==null){
+ throw new ServiceException("No payment module configured");
+ }
+
+ IntegrationConfiguration configuration = modules.get(module);
+
+ if(configuration==null) {
+ throw new ServiceException("Payment module " + module + " is not configured");
+ }
+
+ PaymentModule paymentModule = this.paymentModules.get(module);
+
+ if(paymentModule==null) {
+ throw new ServiceException("Payment module " + paymentModule + " does not exist");
+ }
+
+ boolean partial = false;
+ if(amount.doubleValue()!=order.getTotal().doubleValue()) {
+ partial = true;
+ }
+
+ IntegrationModule integrationModule = getPaymentMethodByCode(store,module);
+
+ //get the associated transaction
+ Transaction refundable = transactionService.getRefundableTransaction(order);
+
+ if(refundable==null) {
+ throw new ServiceException("No refundable transaction for this order");
+ }
+
+ Transaction transaction = paymentModule.refund(partial, store, refundable, order, amount, configuration, integrationModule);
+ transaction.setOrder(order);
+ transactionService.create(transaction);
+
+ OrderTotal refund = new OrderTotal();
+ refund.setModule(Constants.OT_REFUND_MODULE_CODE);
+ refund.setText(Constants.OT_REFUND_MODULE_CODE);
+ refund.setTitle(Constants.OT_REFUND_MODULE_CODE);
+ refund.setOrderTotalCode(Constants.OT_REFUND_MODULE_CODE);
+ refund.setOrderTotalType(OrderTotalType.REFUND);
+ refund.setValue(amount);
+ refund.setSortOrder(100);
+ refund.setOrder(order);
+
+ order.getOrderTotal().add(refund);
+
+ //update order total
+ orderTotal = orderTotal.subtract(amount);
+
+ //update ordertotal refund
+ Set<OrderTotal> totals = order.getOrderTotal();
+ for(OrderTotal total : totals) {
+ if(total.getModule().equals(Constants.OT_TOTAL_MODULE_CODE)) {
+ total.setValue(orderTotal);
+ }
+ }
+
+
+
+ order.setTotal(orderTotal);
+ order.setStatus(OrderStatus.REFUNDED);
+
+
+
+ OrderStatusHistory orderHistory = new OrderStatusHistory();
+ orderHistory.setOrder(order);
+ orderHistory.setStatus(OrderStatus.REFUNDED);
+ orderHistory.setDateAdded(new Date());
+ order.getOrderHistory().add(orderHistory);
+
+ orderService.saveOrUpdate(order);
+
+ return transaction;
+ }
+
+ @Override
+ public void validateCreditCard(String number, CreditCardType creditCard, String month, String date)
+ throws ServiceException {
+
+ try {
+ Integer.parseInt(month);
+ Integer.parseInt(date);
+ } catch (NumberFormatException nfe) {
+ ServiceException ex = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"Invalid date format","messages.error.creditcard.dateformat");
+ throw ex;
+ }
+
+ if (StringUtils.isBlank(number)) {
+ ServiceException ex = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"Invalid card number","messages.error.creditcard.number");
+ throw ex;
+ }
+
+ Matcher m = Pattern.compile("[^\\d\\s.-]").matcher(number);
+
+ if (m.find()) {
+ ServiceException ex = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"Invalid card number","messages.error.creditcard.number");
+ throw ex;
+ }
+
+ Matcher matcher = Pattern.compile("[\\s.-]").matcher(number);
+
+ number = matcher.replaceAll("");
+ validateCreditCardDate(Integer.parseInt(month), Integer.parseInt(date));
+ validateCreditCardNumber(number, creditCard);
+ }
+
+ private void validateCreditCardDate(int m, int y) throws ServiceException {
+ java.util.Calendar cal = new java.util.GregorianCalendar();
+ int monthNow = cal.get(java.util.Calendar.MONTH) + 1;
+ int yearNow = cal.get(java.util.Calendar.YEAR);
+ if (yearNow > y) {
+ ServiceException ex = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"Invalid date format","messages.error.creditcard.dateformat");
+ throw ex;
+ }
+ // OK, change implementation
+ if (yearNow == y && monthNow > m) {
+ ServiceException ex = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"Invalid date format","messages.error.creditcard.dateformat");
+ throw ex;
+ }
+
+ }
+
+ @Deprecated
+ /**
+ * Use commons validator CreditCardValidator
+ * @param number
+ * @param creditCard
+ * @throws ServiceException
+ */
+ private void validateCreditCardNumber(String number, CreditCardType creditCard)
+ throws ServiceException {
+
+ //TODO implement
+ if(CreditCardType.MASTERCARD.equals(creditCard.name())) {
+ if (number.length() != 16
+ || Integer.parseInt(number.substring(0, 2)) < 51
+ || Integer.parseInt(number.substring(0, 2)) > 55) {
+ ServiceException ex = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"Invalid card number","messages.error.creditcard.number");
+ throw ex;
+ }
+ }
+
+ if(CreditCardType.VISA.equals(creditCard.name())) {
+ if ((number.length() != 13 && number.length() != 16)
+ || Integer.parseInt(number.substring(0, 1)) != 4) {
+ ServiceException ex = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"Invalid card number","messages.error.creditcard.number");
+ throw ex;
+ }
+ }
+
+ if(CreditCardType.AMEX.equals(creditCard.name())) {
+ if (number.length() != 15
+ || (Integer.parseInt(number.substring(0, 2)) != 34 && Integer
+ .parseInt(number.substring(0, 2)) != 37)) {
+ ServiceException ex = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"Invalid card number","messages.error.creditcard.number");
+ throw ex;
+ }
+ }
+
+ if(CreditCardType.DINERS.equals(creditCard.name())) {
+ if (number.length() != 14
+ || ((Integer.parseInt(number.substring(0, 2)) != 36 && Integer
+ .parseInt(number.substring(0, 2)) != 38)
+ && Integer.parseInt(number.substring(0, 3)) < 300 || Integer
+ .parseInt(number.substring(0, 3)) > 305)) {
+ ServiceException ex = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"Invalid card number","messages.error.creditcard.number");
+ throw ex;
+ }
+ }
+
+ if(CreditCardType.DISCOVERY.equals(creditCard.name())) {
+ if (number.length() != 16
+ || Integer.parseInt(number.substring(0, 5)) != 6011) {
+ ServiceException ex = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"Invalid card number","messages.error.creditcard.number");
+ throw ex;
+ }
+ }
+
+ luhnValidate(number);
+ }
+
+ // The Luhn algorithm is basically a CRC type
+ // system for checking the validity of an entry.
+ // All major credit cards use numbers that will
+ // pass the Luhn check. Also, all of them are based
+ // on MOD 10.
+ @Deprecated
+ private void luhnValidate(String numberString)
+ throws ServiceException {
+ char[] charArray = numberString.toCharArray();
+ int[] number = new int[charArray.length];
+ int total = 0;
+
+ for (int i = 0; i < charArray.length; i++) {
+ number[i] = Character.getNumericValue(charArray[i]);
+ }
+
+ for (int i = number.length - 2; i > -1; i -= 2) {
+ number[i] *= 2;
+
+ if (number[i] > 9)
+ number[i] -= 9;
+ }
+
+ for (int i = 0; i < number.length; i++)
+ total += number[i];
+
+ if (total % 10 != 0) {
+ ServiceException ex = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"Invalid card number","messages.error.creditcard.number");
+ throw ex;
+ }
+
+ }
+
+ @Override
+ public Transaction initTransaction(Order order, Customer customer, Payment payment, MerchantStore store) throws ServiceException {
+
+ Validate.notNull(store);
+ Validate.notNull(payment);
+ Validate.notNull(order);
+ Validate.notNull(order.getTotal());
+
+ payment.setCurrency(store.getCurrency());
+
+ BigDecimal amount = order.getTotal();
+
+ //must have a shipping module configured
+ Map<String, IntegrationConfiguration> modules = this.getPaymentModulesConfigured(store);
+ if(modules==null){
+ throw new ServiceException("No payment module configured");
+ }
+
+ IntegrationConfiguration configuration = modules.get(payment.getModuleName());
+
+ if(configuration==null) {
+ throw new ServiceException("Payment module " + payment.getModuleName() + " is not configured");
+ }
+
+ if(!configuration.isActive()) {
+ throw new ServiceException("Payment module " + payment.getModuleName() + " is not active");
+ }
+
+ PaymentModule module = this.paymentModules.get(order.getPaymentModuleCode());
+
+ if(module==null) {
+ throw new ServiceException("Payment module " + order.getPaymentModuleCode() + " does not exist");
+ }
+
+ IntegrationModule integrationModule = getPaymentMethodByCode(store,payment.getModuleName());
+
+ Transaction transaction = module.initTransaction(store, customer, amount, payment, configuration, integrationModule);
+
+ return transaction;
+ }
+
+ @Override
+ public Transaction initTransaction(Customer customer, Payment payment, MerchantStore store) throws ServiceException {
+
+ Validate.notNull(store);
+ Validate.notNull(payment);
+ Validate.notNull(payment.getAmount());
+
+ payment.setCurrency(store.getCurrency());
+
+ BigDecimal amount = payment.getAmount();
+
+ //must have a shipping module configured
+ Map<String, IntegrationConfiguration> modules = this.getPaymentModulesConfigured(store);
+ if(modules==null){
+ throw new ServiceException("No payment module configured");
+ }
+
+ IntegrationConfiguration configuration = modules.get(payment.getModuleName());
+
+ if(configuration==null) {
+ throw new ServiceException("Payment module " + payment.getModuleName() + " is not configured");
+ }
+
+ if(!configuration.isActive()) {
+ throw new ServiceException("Payment module " + payment.getModuleName() + " is not active");
+ }
+
+ PaymentModule module = this.paymentModules.get(payment.getModuleName());
+
+ if(module==null) {
+ throw new ServiceException("Payment module " + payment.getModuleName() + " does not exist");
+ }
+
+ IntegrationModule integrationModule = getPaymentMethodByCode(store,payment.getModuleName());
+
+ Transaction transaction = module.initTransaction(store, customer, amount, payment, configuration, integrationModule);
+
+ transactionService.save(transaction);
+
+ return transaction;
+ }
+
+
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/payments/TransactionService.java b/sm-core/src/main/java/com/salesmanager/core/business/services/payments/TransactionService.java
index 232d748..ec3cf31 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/payments/TransactionService.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/payments/TransactionService.java
@@ -1,29 +1,32 @@
-package com.salesmanager.core.business.services.payments;
-
-import java.util.List;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.common.generic.SalesManagerEntityService;
-import com.salesmanager.core.model.order.Order;
-import com.salesmanager.core.model.payments.Transaction;
-
-
-
-
-public interface TransactionService extends SalesManagerEntityService<Long, Transaction> {
-
- /**
- * Obtain a previous transaction that has type authorize for a give order
- * @param order
- * @return
- * @throws ServiceException
- */
- Transaction getCapturableTransaction(Order order) throws ServiceException;
-
- Transaction getRefundableTransaction(Order order) throws ServiceException;
-
- List<Transaction> listTransactions(Order order) throws ServiceException;
-
-
-
+package com.salesmanager.core.business.services.payments;
+
+import java.util.Date;
+import java.util.List;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.common.generic.SalesManagerEntityService;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.payments.Transaction;
+
+
+
+
+public interface TransactionService extends SalesManagerEntityService<Long, Transaction> {
+
+ /**
+ * Obtain a previous transaction that has type authorize for a give order
+ * @param order
+ * @return
+ * @throws ServiceException
+ */
+ Transaction getCapturableTransaction(Order order) throws ServiceException;
+
+ Transaction getRefundableTransaction(Order order) throws ServiceException;
+
+ List<Transaction> listTransactions(Order order) throws ServiceException;
+
+ List<Transaction> listTransactions(Date startDate, Date endDate) throws ServiceException;
+
+
+
}
\ No newline at end of file
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/payments/TransactionServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/payments/TransactionServiceImpl.java
index ce93338..7f4d9a7 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/payments/TransactionServiceImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/payments/TransactionServiceImpl.java
@@ -1,159 +1,160 @@
-package com.salesmanager.core.business.services.payments;
-
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.inject.Inject;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.stereotype.Service;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.repositories.payments.TransactionRepository;
-import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl;
-import com.salesmanager.core.model.order.Order;
-import com.salesmanager.core.model.payments.Transaction;
-import com.salesmanager.core.model.payments.TransactionType;
-
-
-
-@Service("transactionService")
-public class TransactionServiceImpl extends SalesManagerEntityServiceImpl<Long, Transaction> implements TransactionService {
-
-
- private TransactionRepository transactionRepository;
-
- @Inject
- public TransactionServiceImpl(TransactionRepository transactionRepository) {
- super(transactionRepository);
- this.transactionRepository = transactionRepository;
- }
-
- @Override
- public void create(Transaction transaction) throws ServiceException {
-
- //parse JSON string
- String transactionDetails = transaction.toJSONString();
- if(!StringUtils.isBlank(transactionDetails)) {
- transaction.setDetails(transactionDetails);
- }
-
- super.create(transaction);
-
-
- }
-
- @Override
- public List<Transaction> listTransactions(Order order) throws ServiceException {
-
- List<Transaction> transactions = transactionRepository.findByOrder(order.getId());
- ObjectMapper mapper = new ObjectMapper();
- for(Transaction transaction : transactions) {
- if(!StringUtils.isBlank(transaction.getDetails())) {
- try {
- @SuppressWarnings("unchecked")
- Map<String,String> objects = mapper.readValue(transaction.getDetails(), Map.class);
- transaction.setTransactionDetails(objects);
- } catch (Exception e) {
- throw new ServiceException(e);
- }
- }
- }
-
- return transactions;
- }
-
- @Override
- public Transaction getCapturableTransaction(Order order)
- throws ServiceException {
- List<Transaction> transactions = transactionRepository.findByOrder(order.getId());
- ObjectMapper mapper = new ObjectMapper();
- Transaction capturable = null;
- for(Transaction transaction : transactions) {
- if(transaction.getTransactionType().name().equals(TransactionType.AUTHORIZE.name())) {
- if(!StringUtils.isBlank(transaction.getDetails())) {
- try {
- @SuppressWarnings("unchecked")
- Map<String,String> objects = mapper.readValue(transaction.getDetails(), Map.class);
- transaction.setTransactionDetails(objects);
- capturable = transaction;
- } catch (Exception e) {
- throw new ServiceException(e);
- }
- }
- }
- if(transaction.getTransactionType().name().equals(TransactionType.CAPTURE.name())) {
- break;
- }
- if(transaction.getTransactionType().name().equals(TransactionType.REFUND.name())) {
- break;
- }
- }
-
- return capturable;
- }
-
- @Override
- public Transaction getRefundableTransaction(Order order)
- throws ServiceException {
- List<Transaction> transactions = transactionRepository.findByOrder(order.getId());
- Map<String,Transaction> finalTransactions = new HashMap<String,Transaction>();
- Transaction finalTransaction = null;
- for(Transaction transaction : transactions) {
- //System.out.println("Transaction type " + transaction.getTransactionType().name());
- if(transaction.getTransactionType().name().equals(TransactionType.AUTHORIZECAPTURE.name())) {
- finalTransactions.put(TransactionType.AUTHORIZECAPTURE.name(),transaction);
- continue;
- }
- if(transaction.getTransactionType().name().equals(TransactionType.CAPTURE.name())) {
- finalTransactions.put(TransactionType.CAPTURE.name(),transaction);
- continue;
- }
- if(transaction.getTransactionType().name().equals(TransactionType.REFUND.name())) {
- //check transaction id
- Transaction previousRefund = finalTransactions.get(TransactionType.REFUND.name());
- if(previousRefund!=null) {
- Date previousDate = previousRefund.getTransactionDate();
- Date currentDate = transaction.getTransactionDate();
- if(previousDate.before(currentDate)) {
- finalTransactions.put(TransactionType.REFUND.name(),transaction);
- continue;
- }
- } else {
- finalTransactions.put(TransactionType.REFUND.name(),transaction);
- continue;
- }
- }
- }
-
- if(finalTransactions.containsKey(TransactionType.AUTHORIZECAPTURE.name())) {
- finalTransaction = finalTransactions.get(TransactionType.AUTHORIZECAPTURE.name());
- }
-
- if(finalTransactions.containsKey(TransactionType.CAPTURE.name())) {
- finalTransaction = finalTransactions.get(TransactionType.CAPTURE.name());
- }
-
- //if(finalTransactions.containsKey(TransactionType.REFUND.name())) {
- // finalTransaction = finalTransactions.get(TransactionType.REFUND.name());
- //}
-
-
- if(finalTransaction!=null && !StringUtils.isBlank(finalTransaction.getDetails())) {
- try {
- ObjectMapper mapper = new ObjectMapper();
- @SuppressWarnings("unchecked")
- Map<String,String> objects = mapper.readValue(finalTransaction.getDetails(), Map.class);
- finalTransaction.setTransactionDetails(objects);
- } catch (Exception e) {
- throw new ServiceException(e);
- }
- }
-
- return finalTransaction;
- }
-
-}
+package com.salesmanager.core.business.services.payments;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.repositories.payments.TransactionRepository;
+import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.payments.Transaction;
+import com.salesmanager.core.model.payments.TransactionType;
+
+
+
+@Service("transactionService")
+public class TransactionServiceImpl extends SalesManagerEntityServiceImpl<Long, Transaction> implements TransactionService {
+
+
+ private TransactionRepository transactionRepository;
+
+ @Inject
+ public TransactionServiceImpl(TransactionRepository transactionRepository) {
+ super(transactionRepository);
+ this.transactionRepository = transactionRepository;
+ }
+
+ @Override
+ public void create(Transaction transaction) throws ServiceException {
+
+ //parse JSON string
+ String transactionDetails = transaction.toJSONString();
+ if(!StringUtils.isBlank(transactionDetails)) {
+ transaction.setDetails(transactionDetails);
+ }
+
+ super.create(transaction);
+
+
+ }
+
+ @Override
+ public List<Transaction> listTransactions(Order order) throws ServiceException {
+
+ List<Transaction> transactions = transactionRepository.findByOrder(order.getId());
+ ObjectMapper mapper = new ObjectMapper();
+ for(Transaction transaction : transactions) {
+ if(!StringUtils.isBlank(transaction.getDetails())) {
+ try {
+ @SuppressWarnings("unchecked")
+ Map<String,String> objects = mapper.readValue(transaction.getDetails(), Map.class);
+ transaction.setTransactionDetails(objects);
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ }
+ }
+ }
+
+ return transactions;
+ }
+
+ @Override
+ public Transaction getCapturableTransaction(Order order)
+ throws ServiceException {
+ List<Transaction> transactions = transactionRepository.findByOrder(order.getId());
+ ObjectMapper mapper = new ObjectMapper();
+ Transaction capturable = null;
+ for(Transaction transaction : transactions) {
+ if(transaction.getTransactionType().name().equals(TransactionType.AUTHORIZE.name())) {
+ if(!StringUtils.isBlank(transaction.getDetails())) {
+ try {
+ @SuppressWarnings("unchecked")
+ Map<String,String> objects = mapper.readValue(transaction.getDetails(), Map.class);
+ transaction.setTransactionDetails(objects);
+ capturable = transaction;
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ }
+ }
+ }
+ if(transaction.getTransactionType().name().equals(TransactionType.CAPTURE.name())) {
+ break;
+ }
+ if(transaction.getTransactionType().name().equals(TransactionType.REFUND.name())) {
+ break;
+ }
+ }
+
+ return capturable;
+ }
+
+ @Override
+ public Transaction getRefundableTransaction(Order order)
+ throws ServiceException {
+ List<Transaction> transactions = transactionRepository.findByOrder(order.getId());
+ Map<String,Transaction> finalTransactions = new HashMap<String,Transaction>();
+ Transaction finalTransaction = null;
+ for(Transaction transaction : transactions) {
+ //System.out.println("Transaction type " + transaction.getTransactionType().name());
+ if(transaction.getTransactionType().name().equals(TransactionType.AUTHORIZECAPTURE.name())) {
+ finalTransactions.put(TransactionType.AUTHORIZECAPTURE.name(),transaction);
+ continue;
+ }
+ if(transaction.getTransactionType().name().equals(TransactionType.CAPTURE.name())) {
+ finalTransactions.put(TransactionType.CAPTURE.name(),transaction);
+ continue;
+ }
+ if(transaction.getTransactionType().name().equals(TransactionType.REFUND.name())) {
+ //check transaction id
+ Transaction previousRefund = finalTransactions.get(TransactionType.REFUND.name());
+ if(previousRefund!=null) {
+ Date previousDate = previousRefund.getTransactionDate();
+ Date currentDate = transaction.getTransactionDate();
+ if(previousDate.before(currentDate)) {
+ finalTransactions.put(TransactionType.REFUND.name(),transaction);
+ continue;
+ }
+ } else {
+ finalTransactions.put(TransactionType.REFUND.name(),transaction);
+ continue;
+ }
+ }
+ }
+
+ if(finalTransactions.containsKey(TransactionType.AUTHORIZECAPTURE.name())) {
+ finalTransaction = finalTransactions.get(TransactionType.AUTHORIZECAPTURE.name());
+ }
+
+ if(finalTransactions.containsKey(TransactionType.CAPTURE.name())) {
+ finalTransaction = finalTransactions.get(TransactionType.CAPTURE.name());
+ }
+
+ if(finalTransaction!=null && !StringUtils.isBlank(finalTransaction.getDetails())) {
+ try {
+ ObjectMapper mapper = new ObjectMapper();
+ @SuppressWarnings("unchecked")
+ Map<String,String> objects = mapper.readValue(finalTransaction.getDetails(), Map.class);
+ finalTransaction.setTransactionDetails(objects);
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ }
+ }
+
+ return finalTransaction;
+ }
+
+ @Override
+ public List<Transaction> listTransactions(Date startDate, Date endDate) throws ServiceException {
+
+ return transactionRepository.findByDates(startDate, endDate);
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/reference/init/InitializationDatabaseImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/reference/init/InitializationDatabaseImpl.java
index 97e6a4d..0c3a351 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/reference/init/InitializationDatabaseImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/reference/init/InitializationDatabaseImpl.java
@@ -15,6 +15,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.catalog.product.manufacturer.ManufacturerService;
import com.salesmanager.core.business.services.catalog.product.type.ProductTypeService;
import com.salesmanager.core.business.services.merchant.MerchantStoreService;
import com.salesmanager.core.business.services.reference.country.CountryService;
@@ -26,6 +27,8 @@ import com.salesmanager.core.business.services.reference.zone.ZoneService;
import com.salesmanager.core.business.services.system.ModuleConfigurationService;
import com.salesmanager.core.business.services.tax.TaxClassService;
import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer;
+import com.salesmanager.core.model.catalog.product.manufacturer.ManufacturerDescription;
import com.salesmanager.core.model.catalog.product.type.ProductType;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.reference.country.Country;
@@ -72,6 +75,9 @@ public class InitializationDatabaseImpl implements InitializationDatabase {
private IntegrationModulesLoader modulesLoader;
@Inject
+ private ManufacturerService manufacturerService;
+
+ @Inject
private ModuleConfigurationService moduleConfigurationService;
@@ -102,12 +108,8 @@ public class InitializationDatabaseImpl implements InitializationDatabase {
private void createCurrencies() throws ServiceException {
LOGGER.info(String.format("%s : Populating Currencies ", name));
- //Locale [] locales = Locale.getAvailableLocales();
- //Locale l = locales[0];
-
for (String code : SchemaConstant.CURRENCY_MAP.keySet()) {
-
-
+
try {
java.util.Currency c = java.util.Currency.getInstance(code);
@@ -214,9 +216,9 @@ public class InitializationDatabaseImpl implements InitializationDatabase {
store.setStorecity("My city");
store.setStoreaddress("1234 Street address");
store.setStorepostalcode("H2H-2H2");
- store.setStoreEmailAddress("test@test.com");
+ store.setStoreEmailAddress("john@test.com");
store.setDomainName("localhost:8080");
- store.setStoreTemplate("bootstrap");
+ store.setStoreTemplate("generic");
store.setLanguages(supportedLanguages);
merchantService.create(store);
@@ -227,6 +229,20 @@ public class InitializationDatabaseImpl implements InitializationDatabase {
taxClassService.create(taxclass);
+ //create default manufacturer
+ Manufacturer defaultManufacturer = new Manufacturer();
+ defaultManufacturer.setCode("DEFAULT");
+ defaultManufacturer.setMerchantStore(store);
+
+ ManufacturerDescription manufacturerDescription = new ManufacturerDescription();
+ manufacturerDescription.setLanguage(en);
+ manufacturerDescription.setName("DEFAULT");
+ manufacturerDescription.setManufacturer(defaultManufacturer);
+ manufacturerDescription.setDescription("DEFAULT");
+ defaultManufacturer.getDescriptions().add(manufacturerDescription);
+
+ manufacturerService.create(defaultManufacturer);
+
}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/reference/language/LanguageService.java b/sm-core/src/main/java/com/salesmanager/core/business/services/reference/language/LanguageService.java
index f3c844a..f3b45d1 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/reference/language/LanguageService.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/reference/language/LanguageService.java
@@ -6,6 +6,7 @@ import java.util.Map;
import com.salesmanager.core.business.exception.ServiceException;
import com.salesmanager.core.business.services.common.generic.SalesManagerEntityService;
+import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.reference.language.Language;
public interface LanguageService extends SalesManagerEntityService<Integer, Language> {
@@ -16,7 +17,7 @@ public interface LanguageService extends SalesManagerEntityService<Integer, Lang
List<Language> getLanguages() throws ServiceException;
- Locale toLocale(Language language);
+ Locale toLocale(Language language, MerchantStore store);
Language toLanguage(Locale locale);
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/reference/language/LanguageServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/reference/language/LanguageServiceImpl.java
index 8b72793..70f2759 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/reference/language/LanguageServiceImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/reference/language/LanguageServiceImpl.java
@@ -16,6 +16,7 @@ import com.salesmanager.core.business.exception.ServiceException;
import com.salesmanager.core.business.repositories.reference.language.LanguageRepository;
import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl;
import com.salesmanager.core.business.utils.CacheUtils;
+import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.reference.language.Language;
/**
@@ -48,8 +49,23 @@ public class LanguageServiceImpl extends SalesManagerEntityServiceImpl<Integer,
}
@Override
- public Locale toLocale(Language language) {
- return new Locale(language.getCode());
+ public Locale toLocale(Language language, MerchantStore store) {
+
+ if(store != null) {
+
+ String countryCode = store.getCountry().getIsoCode();
+
+ //try to build valid language
+ if("CA".equals(countryCode) && language.getCode().equals("en")) {
+ countryCode = "US";
+ }
+
+ return new Locale(language.getCode(), countryCode);
+
+ } else {
+
+ return new Locale(language.getCode());
+ }
}
@Override
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/reference/loader/ConfigurationModulesLoader.java b/sm-core/src/main/java/com/salesmanager/core/business/services/reference/loader/ConfigurationModulesLoader.java
index b0a1798..7179745 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/reference/loader/ConfigurationModulesLoader.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/reference/loader/ConfigurationModulesLoader.java
@@ -1,107 +1,107 @@
-package com.salesmanager.core.business.services.reference.loader;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.model.system.IntegrationConfiguration;
-
-/**
- * Loads all modules in the database
- * @author c.samson
- *
- */
-public class ConfigurationModulesLoader {
-
- @SuppressWarnings("unused")
- private static final Logger LOGGER = LoggerFactory.getLogger(ConfigurationModulesLoader.class);
-
-
-
- public static String toJSONString(Map<String,IntegrationConfiguration> configurations) throws Exception {
-
- StringBuilder jsonModules = new StringBuilder();
- jsonModules.append("[");
- int count = 0;
- for(Object key : configurations.keySet()) {
-
- String k = (String)key;
- IntegrationConfiguration c = (IntegrationConfiguration)configurations.get(k);
-
- String jsonString = c.toJSONString();
- jsonModules.append(jsonString);
-
- count ++;
- if(count<configurations.size()) {
- jsonModules.append(",");
- }
- }
- jsonModules.append("]");
- return jsonModules.toString();
-
-
- }
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- public static Map<String,IntegrationConfiguration> loadIntegrationConfigurations(String value) throws Exception {
-
-
- Map<String,IntegrationConfiguration> modules = new HashMap<String,IntegrationConfiguration>();
-
- ObjectMapper mapper = new ObjectMapper();
-
- try {
-
-
- Map[] objects = mapper.readValue(value, Map[].class);
-
- for(int i = 0; i < objects.length; i++) {
-
-
- Map object = objects[i];
-
- IntegrationConfiguration configuration = new IntegrationConfiguration();
-
- String moduleCode = (String)object.get("moduleCode");
- if(object.get("active")!=null) {
- configuration.setActive((Boolean)object.get("active"));
- }
- if(object.get("defaultSelected")!=null) {
- configuration.setDefaultSelected((Boolean)object.get("defaultSelected"));
- }
- if(object.get("environment")!=null) {
- configuration.setEnvironment((String)object.get("environment"));
- }
- configuration.setModuleCode(moduleCode);
-
- modules.put(moduleCode, configuration);
-
- if(object.get("integrationKeys")!=null) {
- Map<String,String> confs = (Map<String,String> )object.get("integrationKeys");
- configuration.setIntegrationKeys(confs);
- }
-
- if(object.get("integrationKeys")!=null) {
- Map<String,List<String>> options = (Map<String,List<String>> )object.get("integrationOptions");
- configuration.setIntegrationOptions(options);
- }
-
-
- }
-
- return modules;
-
- } catch (Exception e) {
- throw new ServiceException(e);
- }
-
-
-
- }
-
-}
+package com.salesmanager.core.business.services.reference.loader;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.model.system.IntegrationConfiguration;
+
+/**
+ * Loads all modules in the database
+ * @author c.samson
+ *
+ */
+public class ConfigurationModulesLoader {
+
+ @SuppressWarnings("unused")
+ private static final Logger LOGGER = LoggerFactory.getLogger(ConfigurationModulesLoader.class);
+
+
+
+ public static String toJSONString(Map<String,IntegrationConfiguration> configurations) throws Exception {
+
+ StringBuilder jsonModules = new StringBuilder();
+ jsonModules.append("[");
+ int count = 0;
+ for(Object key : configurations.keySet()) {
+
+ String k = (String)key;
+ IntegrationConfiguration c = (IntegrationConfiguration)configurations.get(k);
+
+ String jsonString = c.toJSONString();
+ jsonModules.append(jsonString);
+
+ count ++;
+ if(count<configurations.size()) {
+ jsonModules.append(",");
+ }
+ }
+ jsonModules.append("]");
+ return jsonModules.toString();
+
+
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ public static Map<String,IntegrationConfiguration> loadIntegrationConfigurations(String value) throws Exception {
+
+
+ Map<String,IntegrationConfiguration> modules = new HashMap<String,IntegrationConfiguration>();
+
+ ObjectMapper mapper = new ObjectMapper();
+
+ try {
+
+
+ Map[] objects = mapper.readValue(value, Map[].class);
+
+ for(int i = 0; i < objects.length; i++) {
+
+
+ Map object = objects[i];
+
+ IntegrationConfiguration configuration = new IntegrationConfiguration();
+
+ String moduleCode = (String)object.get("moduleCode");
+ if(object.get("active")!=null) {
+ configuration.setActive((Boolean)object.get("active"));
+ }
+ if(object.get("defaultSelected")!=null) {
+ configuration.setDefaultSelected((Boolean)object.get("defaultSelected"));
+ }
+ if(object.get("environment")!=null) {
+ configuration.setEnvironment((String)object.get("environment"));
+ }
+ configuration.setModuleCode(moduleCode);
+
+ modules.put(moduleCode, configuration);
+
+ if(object.get("integrationKeys")!=null) {
+ Map<String,String> confs = (Map<String,String> )object.get("integrationKeys");
+ configuration.setIntegrationKeys(confs);
+ }
+
+ if(object.get("integrationKeys")!=null) {
+ Map<String,List<String>> options = (Map<String,List<String>> )object.get("integrationOptions");
+ configuration.setIntegrationOptions(options);
+ }
+
+
+ }
+
+ return modules;
+
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ }
+
+
+
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/reference/loader/IntegrationModulesLoader.java b/sm-core/src/main/java/com/salesmanager/core/business/services/reference/loader/IntegrationModulesLoader.java
index 78e1a4e..fc5ee47 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/reference/loader/IntegrationModulesLoader.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/reference/loader/IntegrationModulesLoader.java
@@ -1,190 +1,190 @@
-package com.salesmanager.core.business.services.reference.loader;
-
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.model.system.IntegrationModule;
-import com.salesmanager.core.model.system.ModuleConfig;
-
-@Component
-public class IntegrationModulesLoader {
-
-
- private static final Logger LOGGER = LoggerFactory.getLogger(IntegrationModulesLoader.class);
-
-
- public List<IntegrationModule> loadIntegrationModules(String jsonFilePath) throws Exception {
-
-
- List<IntegrationModule> modules = new ArrayList<IntegrationModule>();
-
- ObjectMapper mapper = new ObjectMapper();
-
- try {
-
- InputStream in =
- this.getClass().getClassLoader().getResourceAsStream(jsonFilePath);
-
-
- @SuppressWarnings("rawtypes")
- Map[] objects = mapper.readValue(in, Map[].class);
-
- for(int i = 0; i < objects.length; i++) {
-
- modules.add(this.loadModule(objects[i]));
- }
-
- return modules;
-
- } catch (Exception e) {
- throw new ServiceException(e);
- }
-
-
-
-
-
-
-
- }
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- public IntegrationModule loadModule(Map object) throws Exception {
-
- ObjectMapper mapper = new ObjectMapper();
- IntegrationModule module = new IntegrationModule();
- module.setModule((String)object.get("module"));
- module.setCode((String)object.get("code"));
- module.setImage((String)object.get("image"));
-
- if(object.get("type")!=null) {
- module.setType((String)object.get("type"));
- }
-
- if(object.get("customModule")!=null) {
- Object o = object.get("customModule");
- Boolean b = false;
- if(o instanceof Boolean) {
- b = (Boolean)object.get("customModule");
- } else {
- try {
- b = new Boolean((String)object.get("customModule"));
- } catch(Exception e) {
- LOGGER.error("Cannot cast " + o.getClass() + " tp a boolean value");
- }
- }
- module.setCustomModule(b);
- }
- //module.setRegions(regions)
- if(object.get("details")!=null) {
-
- Map<String,String> details = (Map<String,String>)object.get("details");
- module.setDetails(details);
-
- //maintain the original json structure
- StringBuilder detailsStructure = new StringBuilder();
- int count = 0;
- detailsStructure.append("{");
- for(String key : details.keySet()) {
- String jsonKeyString = mapper.writeValueAsString(key);
- detailsStructure.append(jsonKeyString);
- detailsStructure.append(":");
- String jsonValueString = mapper.writeValueAsString(details.get(key));
- detailsStructure.append(jsonValueString);
- if(count<(details.size()-1)) {
- detailsStructure.append(",");
- }
- count++;
- }
- detailsStructure.append("}");
- module.setConfigDetails(detailsStructure.toString());
-
- }
-
-
- List confs = (List)object.get("configuration");
-
- //convert to json
-
-
-
- if(confs!=null) {
- StringBuilder configString = new StringBuilder();
- configString.append("[");
- Map<String,ModuleConfig> moduleConfigs = new HashMap<String,ModuleConfig>();
- int count=0;
- for(Object oo : confs) {
-
- Map values = (Map)oo;
-
- String env = (String)values.get("env");
-
- ModuleConfig config = new ModuleConfig();
- config.setScheme((String)values.get("scheme"));
- config.setHost((String)values.get("host"));
- config.setPort((String)values.get("port"));
- config.setUri((String)values.get("uri"));
- config.setEnv((String)values.get("env"));
- if((String)values.get("config1")!=null) {
- config.setConfig1((String)values.get("config1"));
- }
- if((String)values.get("config2")!=null) {
- config.setConfig2((String)values.get("config2"));
- }
-
- String jsonConfigString = mapper.writeValueAsString(config);
- configString.append(jsonConfigString);
-
- moduleConfigs.put(env, config);
-
- if(count<(confs.size()-1)) {
- configString.append(",");
- }
- count++;
-
-
- }
- configString.append("]");
- module.setConfiguration(configString.toString());
- module.setModuleConfigs(moduleConfigs);
- }
-
- List<String> regions = (List<String>)object.get("regions");
- if(regions!=null) {
-
-
- StringBuilder configString = new StringBuilder();
- configString.append("[");
- int count=0;
- for(String region : regions) {
-
- module.getRegionsSet().add(region);
- String jsonConfigString = mapper.writeValueAsString(region);
- configString.append(jsonConfigString);
-
- if(count<(regions.size()-1)) {
- configString.append(",");
- }
- count++;
-
- }
- configString.append("]");
- module.setRegions(configString.toString());
-
- }
-
- return module;
-
-
- }
-
-}
+package com.salesmanager.core.business.services.reference.loader;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.model.system.IntegrationModule;
+import com.salesmanager.core.model.system.ModuleConfig;
+
+@Component
+public class IntegrationModulesLoader {
+
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(IntegrationModulesLoader.class);
+
+
+ public List<IntegrationModule> loadIntegrationModules(String jsonFilePath) throws Exception {
+
+
+ List<IntegrationModule> modules = new ArrayList<IntegrationModule>();
+
+ ObjectMapper mapper = new ObjectMapper();
+
+ try {
+
+ InputStream in =
+ this.getClass().getClassLoader().getResourceAsStream(jsonFilePath);
+
+
+ @SuppressWarnings("rawtypes")
+ Map[] objects = mapper.readValue(in, Map[].class);
+
+ for(int i = 0; i < objects.length; i++) {
+
+ modules.add(this.loadModule(objects[i]));
+ }
+
+ return modules;
+
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ }
+
+
+
+
+
+
+
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ public IntegrationModule loadModule(Map object) throws Exception {
+
+ ObjectMapper mapper = new ObjectMapper();
+ IntegrationModule module = new IntegrationModule();
+ module.setModule((String)object.get("module"));
+ module.setCode((String)object.get("code"));
+ module.setImage((String)object.get("image"));
+
+ if(object.get("type")!=null) {
+ module.setType((String)object.get("type"));
+ }
+
+ if(object.get("customModule")!=null) {
+ Object o = object.get("customModule");
+ Boolean b = false;
+ if(o instanceof Boolean) {
+ b = (Boolean)object.get("customModule");
+ } else {
+ try {
+ b = new Boolean((String)object.get("customModule"));
+ } catch(Exception e) {
+ LOGGER.error("Cannot cast " + o.getClass() + " tp a boolean value");
+ }
+ }
+ module.setCustomModule(b);
+ }
+ //module.setRegions(regions)
+ if(object.get("details")!=null) {
+
+ Map<String,String> details = (Map<String,String>)object.get("details");
+ module.setDetails(details);
+
+ //maintain the original json structure
+ StringBuilder detailsStructure = new StringBuilder();
+ int count = 0;
+ detailsStructure.append("{");
+ for(String key : details.keySet()) {
+ String jsonKeyString = mapper.writeValueAsString(key);
+ detailsStructure.append(jsonKeyString);
+ detailsStructure.append(":");
+ String jsonValueString = mapper.writeValueAsString(details.get(key));
+ detailsStructure.append(jsonValueString);
+ if(count<(details.size()-1)) {
+ detailsStructure.append(",");
+ }
+ count++;
+ }
+ detailsStructure.append("}");
+ module.setConfigDetails(detailsStructure.toString());
+
+ }
+
+
+ List confs = (List)object.get("configuration");
+
+ //convert to json
+
+
+
+ if(confs!=null) {
+ StringBuilder configString = new StringBuilder();
+ configString.append("[");
+ Map<String,ModuleConfig> moduleConfigs = new HashMap<String,ModuleConfig>();
+ int count=0;
+ for(Object oo : confs) {
+
+ Map values = (Map)oo;
+
+ String env = (String)values.get("env");
+
+ ModuleConfig config = new ModuleConfig();
+ config.setScheme((String)values.get("scheme"));
+ config.setHost((String)values.get("host"));
+ config.setPort((String)values.get("port"));
+ config.setUri((String)values.get("uri"));
+ config.setEnv((String)values.get("env"));
+ if((String)values.get("config1")!=null) {
+ config.setConfig1((String)values.get("config1"));
+ }
+ if((String)values.get("config2")!=null) {
+ config.setConfig2((String)values.get("config2"));
+ }
+
+ String jsonConfigString = mapper.writeValueAsString(config);
+ configString.append(jsonConfigString);
+
+ moduleConfigs.put(env, config);
+
+ if(count<(confs.size()-1)) {
+ configString.append(",");
+ }
+ count++;
+
+
+ }
+ configString.append("]");
+ module.setConfiguration(configString.toString());
+ module.setModuleConfigs(moduleConfigs);
+ }
+
+ List<String> regions = (List<String>)object.get("regions");
+ if(regions!=null) {
+
+
+ StringBuilder configString = new StringBuilder();
+ configString.append("[");
+ int count=0;
+ for(String region : regions) {
+
+ module.getRegionsSet().add(region);
+ String jsonConfigString = mapper.writeValueAsString(region);
+ configString.append(jsonConfigString);
+
+ if(count<(regions.size()-1)) {
+ configString.append(",");
+ }
+ count++;
+
+ }
+ configString.append("]");
+ module.setRegions(configString.toString());
+
+ }
+
+ return module;
+
+
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/reference/loader/ZonesLoader.java b/sm-core/src/main/java/com/salesmanager/core/business/services/reference/loader/ZonesLoader.java
index 5bcc455..92a4308 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/reference/loader/ZonesLoader.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/reference/loader/ZonesLoader.java
@@ -1,143 +1,143 @@
-package com.salesmanager.core.business.services.reference.loader;
-
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.inject.Inject;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.reference.country.CountryService;
-import com.salesmanager.core.business.services.reference.language.LanguageService;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.reference.zone.Zone;
-import com.salesmanager.core.model.reference.zone.ZoneDescription;
-
-@Component
-public class ZonesLoader {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ZonesLoader.class);
-
- @Inject
- private LanguageService languageService;
-
- @Inject
- private CountryService countryService;
-
- public Map<String, Zone> loadZones(String jsonFilePath) throws Exception {
-
-
-
- List<Language> languages = languageService.list();
-
- List<Country> countries = countryService.list();
- Map<String,Country> countriesMap = new HashMap<String,Country>();
- for(Country country : countries) {
-
- countriesMap.put(country.getIsoCode(), country);
-
- }
-
- ObjectMapper mapper = new ObjectMapper();
-
- try {
-
- InputStream in =
- this.getClass().getClassLoader().getResourceAsStream(jsonFilePath);
-
- @SuppressWarnings("unchecked")
- Map<String,Object> data = mapper.readValue(in, Map.class);
-
- Map<String,Zone> zonesMap = new HashMap<String,Zone>();
- Map<String,List<ZoneDescription>> zonesDescriptionsMap = new HashMap<String,List<ZoneDescription>>();
- Map<String,String> zonesMark = new HashMap<String,String>();
-
- for(Language l : languages) {
- @SuppressWarnings("rawtypes")
- List langList = (List)data.get(l.getCode());
- if(langList!=null) {
- for(Object z : langList) {
- @SuppressWarnings("unchecked")
- Map<String,String> e = (Map<String,String>)z;
- String zoneCode = e.get("zoneCode");
- ZoneDescription zoneDescription = new ZoneDescription();
- zoneDescription.setLanguage(l);
- zoneDescription.setName(e.get("zoneName"));
- Zone zone = null;
- List<ZoneDescription> descriptions = null;
- if(!zonesMap.containsKey(zoneCode)) {
- zone = new Zone();
- Country country = countriesMap.get(e.get("countryCode"));
- if(country==null) {
- LOGGER.warn("Country is null for " + zoneCode + " and country code " + e.get("countryCode"));
- continue;
- }
- zone.setCountry(country);
- zonesMap.put(zoneCode, zone);
- zone.setCode(zoneCode);
-
- }
-
-
- if(zonesMark.containsKey(l.getCode() + "_" + zoneCode)) {
- LOGGER.warn("This zone seems to be a duplicate ! " + zoneCode + " and language code " + l.getCode());
- continue;
- }
-
- zonesMark.put(l.getCode() + "_" + zoneCode, l.getCode() + "_" + zoneCode);
-
- if(zonesDescriptionsMap.containsKey(zoneCode)) {
- descriptions = zonesDescriptionsMap.get(zoneCode);
- } else {
- descriptions = new ArrayList<ZoneDescription>();
- zonesDescriptionsMap.put(zoneCode, descriptions);
- }
-
- descriptions.add(zoneDescription);
-
- }
- }
-
- }
-
-
- for (Map.Entry<String, Zone> entry : zonesMap.entrySet()) {
- String key = entry.getKey();
- Zone value = entry.getValue();
-
- //if(value.getDescriptions()==null) {
- // LOGGER.warn("This zone " + key + " has no descriptions");
- // continue;
- //}
-
- //get descriptions
- List<ZoneDescription> descriptions = zonesDescriptionsMap.get(key);
- if(descriptions!=null) {
- value.setDescriptons(descriptions);
- }
- }
-
- return zonesMap;
-
-
- } catch (Exception e) {
- throw new ServiceException(e);
- }
-
-
-
-
-
-
-
- }
-
-}
+package com.salesmanager.core.business.services.reference.loader;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.reference.country.CountryService;
+import com.salesmanager.core.business.services.reference.language.LanguageService;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.reference.zone.Zone;
+import com.salesmanager.core.model.reference.zone.ZoneDescription;
+
+@Component
+public class ZonesLoader {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ZonesLoader.class);
+
+ @Inject
+ private LanguageService languageService;
+
+ @Inject
+ private CountryService countryService;
+
+ public Map<String, Zone> loadZones(String jsonFilePath) throws Exception {
+
+
+
+ List<Language> languages = languageService.list();
+
+ List<Country> countries = countryService.list();
+ Map<String,Country> countriesMap = new HashMap<String,Country>();
+ for(Country country : countries) {
+
+ countriesMap.put(country.getIsoCode(), country);
+
+ }
+
+ ObjectMapper mapper = new ObjectMapper();
+
+ try {
+
+ InputStream in =
+ this.getClass().getClassLoader().getResourceAsStream(jsonFilePath);
+
+ @SuppressWarnings("unchecked")
+ Map<String,Object> data = mapper.readValue(in, Map.class);
+
+ Map<String,Zone> zonesMap = new HashMap<String,Zone>();
+ Map<String,List<ZoneDescription>> zonesDescriptionsMap = new HashMap<String,List<ZoneDescription>>();
+ Map<String,String> zonesMark = new HashMap<String,String>();
+
+ for(Language l : languages) {
+ @SuppressWarnings("rawtypes")
+ List langList = (List)data.get(l.getCode());
+ if(langList!=null) {
+ for(Object z : langList) {
+ @SuppressWarnings("unchecked")
+ Map<String,String> e = (Map<String,String>)z;
+ String zoneCode = e.get("zoneCode");
+ ZoneDescription zoneDescription = new ZoneDescription();
+ zoneDescription.setLanguage(l);
+ zoneDescription.setName(e.get("zoneName"));
+ Zone zone = null;
+ List<ZoneDescription> descriptions = null;
+ if(!zonesMap.containsKey(zoneCode)) {
+ zone = new Zone();
+ Country country = countriesMap.get(e.get("countryCode"));
+ if(country==null) {
+ LOGGER.warn("Country is null for " + zoneCode + " and country code " + e.get("countryCode"));
+ continue;
+ }
+ zone.setCountry(country);
+ zonesMap.put(zoneCode, zone);
+ zone.setCode(zoneCode);
+
+ }
+
+
+ if(zonesMark.containsKey(l.getCode() + "_" + zoneCode)) {
+ LOGGER.warn("This zone seems to be a duplicate ! " + zoneCode + " and language code " + l.getCode());
+ continue;
+ }
+
+ zonesMark.put(l.getCode() + "_" + zoneCode, l.getCode() + "_" + zoneCode);
+
+ if(zonesDescriptionsMap.containsKey(zoneCode)) {
+ descriptions = zonesDescriptionsMap.get(zoneCode);
+ } else {
+ descriptions = new ArrayList<ZoneDescription>();
+ zonesDescriptionsMap.put(zoneCode, descriptions);
+ }
+
+ descriptions.add(zoneDescription);
+
+ }
+ }
+
+ }
+
+
+ for (Map.Entry<String, Zone> entry : zonesMap.entrySet()) {
+ String key = entry.getKey();
+ Zone value = entry.getValue();
+
+ //if(value.getDescriptions()==null) {
+ // LOGGER.warn("This zone " + key + " has no descriptions");
+ // continue;
+ //}
+
+ //get descriptions
+ List<ZoneDescription> descriptions = zonesDescriptionsMap.get(key);
+ if(descriptions!=null) {
+ value.setDescriptons(descriptions);
+ }
+ }
+
+ return zonesMap;
+
+
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ }
+
+
+
+
+
+
+
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/reference/zone/ZoneServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/reference/zone/ZoneServiceImpl.java
index 1d16dd1..6c8b4b3 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/reference/zone/ZoneServiceImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/reference/zone/ZoneServiceImpl.java
@@ -7,6 +7,7 @@ import java.util.Map;
import javax.inject.Inject;
+import org.apache.commons.lang.Validate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@@ -64,10 +65,18 @@ public class ZoneServiceImpl extends SalesManagerEntityServiceImpl<Long, Zone> i
@Override
public List<Zone> getZones(Country country, Language language) throws ServiceException {
+ //Validate.notNull(country,"Country cannot be null");
+ Validate.notNull(language,"Language cannot be null");
+
List<Zone> zones = null;
try {
+
+ String countryCode = Constants.DEFAULT_COUNTRY;
+ if(country!=null) {
+ countryCode = country.getIsoCode();
+ }
- String cacheKey = ZONE_CACHE_PREFIX + country.getIsoCode() + Constants.UNDERSCORE + language.getCode();
+ String cacheKey = ZONE_CACHE_PREFIX + countryCode + Constants.UNDERSCORE + language.getCode();
zones = (List<Zone>) cache.getFromCache(cacheKey);
@@ -75,7 +84,7 @@ public class ZoneServiceImpl extends SalesManagerEntityServiceImpl<Long, Zone> i
if(zones==null) {
- zones = zoneRepository.listByLanguageAndCountry(country.getIsoCode(), language.getId());
+ zones = zoneRepository.listByLanguageAndCountry(countryCode, language.getId());
//set names
for(Zone zone : zones) {
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/reference/zone/ZoneTransient.java b/sm-core/src/main/java/com/salesmanager/core/business/services/reference/zone/ZoneTransient.java
index 4b88f0f..9790b59 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/reference/zone/ZoneTransient.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/reference/zone/ZoneTransient.java
@@ -1,28 +1,28 @@
-package com.salesmanager.core.business.services.reference.zone;
-
-public class ZoneTransient {
-
- private String zoneCode;
- private String zoneName;
- private String countryCode;
-
- public String getZoneCode() {
- return zoneCode;
- }
- public void setZoneCode(String zoneCode) {
- this.zoneCode = zoneCode;
- }
- public String getZoneName() {
- return zoneName;
- }
- public void setZoneName(String zoneName) {
- this.zoneName = zoneName;
- }
- public String getCountryCode() {
- return countryCode;
- }
- public void setCountryCode(String countryCode) {
- this.countryCode = countryCode;
- }
-
-}
+package com.salesmanager.core.business.services.reference.zone;
+
+public class ZoneTransient {
+
+ private String zoneCode;
+ private String zoneName;
+ private String countryCode;
+
+ public String getZoneCode() {
+ return zoneCode;
+ }
+ public void setZoneCode(String zoneCode) {
+ this.zoneCode = zoneCode;
+ }
+ public String getZoneName() {
+ return zoneName;
+ }
+ public void setZoneName(String zoneName) {
+ this.zoneName = zoneName;
+ }
+ public String getCountryCode() {
+ return countryCode;
+ }
+ public void setCountryCode(String countryCode) {
+ this.countryCode = countryCode;
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/search/SearchService.java b/sm-core/src/main/java/com/salesmanager/core/business/services/search/SearchService.java
index 2584772..fc2add5 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/search/SearchService.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/search/SearchService.java
@@ -1,58 +1,58 @@
-package com.salesmanager.core.business.services.search;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.search.SearchKeywords;
-import com.salesmanager.core.model.search.SearchResponse;
-
-public interface SearchService {
-
- /**
- * The indexing service for products. The index service must be invoked when a product is
- * created or updated
- * @param store
- * @param product
- * @throws ServiceException
- */
- void index(MerchantStore store, Product product) throws ServiceException;
-
- /**
- * Deletes an index in the appropriate language. Must be invoked when a product is deleted
- * @param store
- * @param product
- * @throws ServiceException
- */
- void deleteIndex(MerchantStore store, Product product)
- throws ServiceException;
-
- /**
- * Similar keywords based on a a series of characters. Used in the auto-complete
- * functionality
- * @param collectionName
- * @param jsonString
- * @param entriesCount
- * @return
- * @throws ServiceException
- */
- SearchKeywords searchForKeywords(String collectionName,
- String jsonString, int entriesCount) throws ServiceException;
-
- /**
- * Search products based on user entry
- * @param store
- * @param languageCode
- * @param jsonString
- * @param entriesCount
- * @param startIndex
- * @throws ServiceException
- */
- SearchResponse search(MerchantStore store, String languageCode, String jsonString,
- int entriesCount, int startIndex) throws ServiceException;
-
- /**
- * Initializes search service in order to avoid lazy initialization
- */
- void initService();
-
-}
+package com.salesmanager.core.business.services.search;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.search.SearchKeywords;
+import com.salesmanager.core.model.search.SearchResponse;
+
+public interface SearchService {
+
+ /**
+ * The indexing service for products. The index service must be invoked when a product is
+ * created or updated
+ * @param store
+ * @param product
+ * @throws ServiceException
+ */
+ void index(MerchantStore store, Product product) throws ServiceException;
+
+ /**
+ * Deletes an index in the appropriate language. Must be invoked when a product is deleted
+ * @param store
+ * @param product
+ * @throws ServiceException
+ */
+ void deleteIndex(MerchantStore store, Product product)
+ throws ServiceException;
+
+ /**
+ * Similar keywords based on a a series of characters. Used in the auto-complete
+ * functionality
+ * @param collectionName
+ * @param jsonString
+ * @param entriesCount
+ * @return
+ * @throws ServiceException
+ */
+ SearchKeywords searchForKeywords(String collectionName,
+ String jsonString, int entriesCount) throws ServiceException;
+
+ /**
+ * Search products based on user entry
+ * @param store
+ * @param languageCode
+ * @param jsonString
+ * @param entriesCount
+ * @param startIndex
+ * @throws ServiceException
+ */
+ SearchResponse search(MerchantStore store, String languageCode, String jsonString,
+ int entriesCount, int startIndex) throws ServiceException;
+
+ /**
+ * Initializes search service in order to avoid lazy initialization
+ */
+ void initService();
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/search/SearchServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/search/SearchServiceImpl.java
index a9f9466..b29b776 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/search/SearchServiceImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/search/SearchServiceImpl.java
@@ -1,310 +1,318 @@
-package com.salesmanager.core.business.services.search;
-
-import com.salesmanager.core.business.constants.Constants;
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.catalog.product.PricingService;
-import com.salesmanager.core.business.utils.CoreConfiguration;
-import com.salesmanager.core.model.catalog.category.Category;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.description.ProductDescription;
-import com.salesmanager.core.model.catalog.product.price.FinalPrice;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.search.IndexProduct;
-import com.salesmanager.core.model.search.SearchEntry;
-import com.salesmanager.core.model.search.SearchFacet;
-import com.salesmanager.core.model.search.SearchKeywords;
-import com.shopizer.search.services.FacetEntry;
-import com.shopizer.search.services.SearchHit;
-import com.shopizer.search.services.SearchRequest;
-import com.shopizer.search.services.SearchResponse;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import javax.inject.Inject;
-import java.util.*;
-
-
-@Service("productSearchService")
-public class SearchServiceImpl implements com.salesmanager.core.business.services.search.SearchService {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(SearchServiceImpl.class);
-
-
- private final static String PRODUCT_INDEX_NAME = "product";
- private final static String UNDERSCORE = "_";
- private final static String INDEX_PRODUCTS = "INDEX_PRODUCTS";
-
- @Inject
- private com.shopizer.search.services.SearchService searchService;
-
- @Inject
- private PricingService pricingService;
-
- @Inject
- private CoreConfiguration configuration;
-
-
- public void initService() {
- searchService.initService();
- }
-
- @SuppressWarnings("rawtypes")
- public void index(MerchantStore store, Product product)
- throws ServiceException {
-
- /**
- * When a product is saved or updated the indexing process occurs
- *
- * A product entity will have to be transformed to a bean ProductIndex
- * which contains the indices as described in product.json
- *
- * {"product": {
- "properties" : {
- "name" : {"type":"string","index":"analyzed"},
- "price" : {"type":"string","index":"not_analyzed"},
- "category" : {"type":"string","index":"not_analyzed"},
- "lang" : {"type":"string","index":"not_analyzed"},
- "available" : {"type":"string","index":"not_analyzed"},
- "description" : {"type":"string","index":"analyzed","index_analyzer":"english"},
- "tags" : {"type":"string","index":"not_analyzed"}
- }
- }
- }
- *
- * productService saveOrUpdate as well as create and update will invoke
- * productSearchService.index
- *
- * A copy of properies between Product to IndexProduct
- * Then IndexProduct will be transformed to a json representation by the invocation
- * of .toJSONString on IndexProduct
- *
- * Then index product
- * searchService.index(json, "product_<LANGUAGE_CODE>_<MERCHANT_CODE>", "product");
- *
- * example ...index(json,"product_en_default",product)
- *
- */
-
- if(configuration.getProperty(INDEX_PRODUCTS)==null || configuration.getProperty(INDEX_PRODUCTS).equals(Constants.FALSE)) {
- return;
- }
-
- FinalPrice price = pricingService.calculateProductPrice(product);
-
-
- Set<ProductDescription> descriptions = product.getDescriptions();
- for(ProductDescription description : descriptions) {
-
- StringBuilder collectionName = new StringBuilder();
- collectionName.append(PRODUCT_INDEX_NAME).append(UNDERSCORE).append(description.getLanguage().getCode()).append(UNDERSCORE).append(store.getCode().toLowerCase());
-
- IndexProduct index = new IndexProduct();
-
- index.setId(String.valueOf(product.getId()));
- index.setStore(store.getCode().toLowerCase());
- index.setLang(description.getLanguage().getCode());
- index.setAvailable(product.isAvailable());
- index.setDescription(description.getDescription());
- index.setName(description.getName());
- if(product.getManufacturer()!=null) {
- index.setManufacturer(String.valueOf(product.getManufacturer().getId()));
- }
- if(price!=null) {
- index.setPrice(price.getFinalPrice().doubleValue());
- }
- index.setHighlight(description.getProductHighlight());
- if(!StringUtils.isBlank(description.getMetatagKeywords())){
- String[] tags = description.getMetatagKeywords().split(",");
- @SuppressWarnings("unchecked")
- List<String> tagsList = new ArrayList(Arrays.asList(tags));
- index.setTags(tagsList);
- }
-
-
- Set<Category> categories = product.getCategories();
- if(!CollectionUtils.isEmpty(categories)) {
- List<String> categoryList = new ArrayList<String>();
- for(Category category : categories) {
- categoryList.add(category.getCode());
- }
- index.setCategories(categoryList);
- }
-
- String jsonString = index.toJSONString();
- try {
- searchService.index(jsonString, collectionName.toString(), new StringBuilder().append(PRODUCT_INDEX_NAME).append(UNDERSCORE).append(description.getLanguage().getCode()).toString());
- } catch (Exception e) {
- throw new ServiceException("Cannot index product id [" + product.getId() + "], " + e.getMessage() ,e);
- }
- }
- }
-
-
- public void deleteIndex(MerchantStore store, Product product) throws ServiceException {
-
- if(configuration.getProperty(INDEX_PRODUCTS)==null || configuration.getProperty(INDEX_PRODUCTS).equals(Constants.FALSE)) {
- return;
- }
-
- Set<ProductDescription> descriptions = product.getDescriptions();
- for(ProductDescription description : descriptions) {
-
- StringBuilder collectionName = new StringBuilder();
- collectionName.append(PRODUCT_INDEX_NAME).append(UNDERSCORE).append(description.getLanguage().getCode()).append(UNDERSCORE).append(store.getCode().toLowerCase());
-
- try {
- searchService.deleteObject(collectionName.toString(), new StringBuilder().append(PRODUCT_INDEX_NAME).append(UNDERSCORE).append(description.getLanguage().getCode()).toString(), String.valueOf(product.getId()));
- } catch (Exception e) {
- LOGGER.error("Cannot delete index for product id [" + product.getId() + "], ",e);
- }
- }
-
- }
-
-
- public SearchKeywords searchForKeywords(String collectionName, String jsonString, int entriesCount) throws ServiceException {
-
- /**
- * $('#search').searchAutocomplete({
- url: '<%=request.getContextPath()%>/search/autocomplete/keyword_en'
- //filter: function() {
- //return '\"filter\" : {\"numeric_range\" : {\"price\" : {\"from\" : \"22\",\"to\" : \"45\",\"include_lower\" : true,\"include_upper\" : true}}}';
- //}
- });
-
- **/
-
- try {
-
- SearchResponse response = searchService.searchAutoComplete(collectionName, jsonString, entriesCount);
-
- SearchKeywords keywords = new SearchKeywords();
- keywords.setKeywords(Arrays.asList(response.getInlineSearchList()));
-
- return keywords;
-
- } catch (Exception e) {
- LOGGER.error("Error while searching keywords " + jsonString,e);
- throw new ServiceException(e);
- }
-
-
- }
-
-
- public com.salesmanager.core.model.search.SearchResponse search(MerchantStore store, String languageCode, String jsonString, int entriesCount, int startIndex) throws ServiceException {
-
-
- try {
-
- StringBuilder collectionName = new StringBuilder();
- collectionName.append(PRODUCT_INDEX_NAME).append(UNDERSCORE).append(languageCode).append(UNDERSCORE).append(store.getCode().toLowerCase());
-
-
- SearchRequest request = new SearchRequest();
- request.addCollection(collectionName.toString());
- request.setSize(entriesCount);
- request.setStart(startIndex);
- request.setJson(jsonString);
-
- SearchResponse response =searchService.search(request);
-
- com.salesmanager.core.model.search.SearchResponse resp = new com.salesmanager.core.model.search.SearchResponse();
-
-
- resp.setTotalCount(response.getCount());
-
- List<SearchEntry> entries = new ArrayList<SearchEntry>();
-
- Collection<SearchHit> hits = response.getSearchHits();
- for(SearchHit hit : hits) {
-
- SearchEntry entry = new SearchEntry();
-
- //Map<String,Object> metaEntries = hit.getMetaEntries();
- Map<String,Object> metaEntries = hit.getItem();
- IndexProduct indexProduct = new IndexProduct();
- //Map sourceEntries = (Map)metaEntries.get("source");
-
- indexProduct.setDescription((String)metaEntries.get("description"));
- indexProduct.setHighlight((String)metaEntries.get("highlight"));
- indexProduct.setId((String)metaEntries.get("id"));
- indexProduct.setLang((String)metaEntries.get("lang"));
- indexProduct.setName(((String)metaEntries.get("name")));
- indexProduct.setManufacturer(((String)metaEntries.get("manufacturer")));
- indexProduct.setPrice(Double.valueOf(((String)metaEntries.get("price"))));
- indexProduct.setStore(((String)metaEntries.get("store")));
- entry.setIndexProduct(indexProduct);
- entries.add(entry);
-
- /**
- * no more support for highlighted
- */
-
-/* Map<String, HighlightField> fields = hit.getHighlightFields();
- if(fields!=null) {
- List<String> highlights = new ArrayList<String>();
- for(HighlightField field : fields.values()) {
-
- Text[] text = field.getFragments();
- //text[0]
- String f = field.getName();
- highlights.add(f);
-
-
- }
-
- entry.setHighlights(highlights);
-
- }*/
- }
-
- resp.setEntries(entries);
-
- Map<String,List<FacetEntry>> facets = response.getFacets();
- if(facets!=null) {
- Map<String,List<SearchFacet>> searchFacets = new HashMap<String,List<SearchFacet>>();
- for(String key : facets.keySet()) {
-
- List<FacetEntry> f = facets.get(key);
-
- List<SearchFacet> fs = searchFacets.get(key);
- if(fs==null) {
- fs = new ArrayList<SearchFacet>();
- searchFacets.put(key, fs);
- }
-
- for(com.shopizer.search.services.FacetEntry facetEntry : f) {
-
- SearchFacet searchFacet = new SearchFacet();
- searchFacet.setKey(facetEntry.getName());
- searchFacet.setName(facetEntry.getName());
- searchFacet.setCount(facetEntry.getCount());
-
- fs.add(searchFacet);
-
- }
-
- }
-
- resp.setFacets(searchFacets);
-
- }
-
-
-
- return resp;
-
-
- } catch (Exception e) {
- LOGGER.error("Error while searching keywords " + jsonString,e);
- throw new ServiceException(e);
- }
-
- }
-
-}
-
+package com.salesmanager.core.business.services.search;
+
+import com.salesmanager.core.business.constants.Constants;
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.utils.CoreConfiguration;
+import com.salesmanager.core.model.catalog.category.Category;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.description.ProductDescription;
+import com.salesmanager.core.model.catalog.product.price.FinalPrice;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.search.IndexProduct;
+import com.salesmanager.core.model.search.SearchEntry;
+import com.salesmanager.core.model.search.SearchFacet;
+import com.salesmanager.core.model.search.SearchKeywords;
+import com.shopizer.search.services.FacetEntry;
+import com.shopizer.search.services.SearchHit;
+import com.shopizer.search.services.SearchRequest;
+import com.shopizer.search.services.SearchResponse;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import javax.inject.Inject;
+import java.util.*;
+
+
+@Service("productSearchService")
+public class SearchServiceImpl implements com.salesmanager.core.business.services.search.SearchService {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(SearchServiceImpl.class);
+
+
+ private final static String PRODUCT_INDEX_NAME = "product";
+ private final static String UNDERSCORE = "_";
+ private final static String INDEX_PRODUCTS = "INDEX_PRODUCTS";
+
+ @Inject
+ private com.shopizer.search.services.SearchService searchService;
+
+ @Inject
+ private PricingService pricingService;
+
+ @Inject
+ private CoreConfiguration configuration;
+
+
+ public void initService() {
+ searchService.initService();
+ }
+
+ @Async
+ @SuppressWarnings("rawtypes")
+ public void index(MerchantStore store, Product product)
+ throws ServiceException {
+
+ /**
+ * When a product is saved or updated the indexing process occurs
+ *
+ * A product entity will have to be transformed to a bean ProductIndex
+ * which contains the indices as described in product.json
+ *
+ * {"product": {
+ "properties" : {
+ "name" : {"type":"string","index":"analyzed"},
+ "price" : {"type":"string","index":"not_analyzed"},
+ "category" : {"type":"string","index":"not_analyzed"},
+ "lang" : {"type":"string","index":"not_analyzed"},
+ "available" : {"type":"string","index":"not_analyzed"},
+ "description" : {"type":"string","index":"analyzed","index_analyzer":"english"},
+ "tags" : {"type":"string","index":"not_analyzed"}
+ }
+ }
+ }
+ *
+ * productService saveOrUpdate as well as create and update will invoke
+ * productSearchService.index
+ *
+ * A copy of properies between Product to IndexProduct
+ * Then IndexProduct will be transformed to a json representation by the invocation
+ * of .toJSONString on IndexProduct
+ *
+ * Then index product
+ * searchService.index(json, "product_<LANGUAGE_CODE>_<MERCHANT_CODE>", "product");
+ *
+ * example ...index(json,"product_en_default",product)
+ *
+ */
+
+ if(configuration.getProperty(INDEX_PRODUCTS)==null || configuration.getProperty(INDEX_PRODUCTS).equals(Constants.FALSE)) {
+ return;
+ }
+
+ FinalPrice price = pricingService.calculateProductPrice(product);
+
+
+ Set<ProductDescription> descriptions = product.getDescriptions();
+ for(ProductDescription description : descriptions) {
+
+ StringBuilder collectionName = new StringBuilder();
+ collectionName.append(PRODUCT_INDEX_NAME).append(UNDERSCORE).append(description.getLanguage().getCode()).append(UNDERSCORE).append(store.getCode().toLowerCase());
+
+ IndexProduct index = new IndexProduct();
+
+ index.setId(String.valueOf(product.getId()));
+ index.setStore(store.getCode().toLowerCase());
+ index.setLang(description.getLanguage().getCode());
+ index.setAvailable(product.isAvailable());
+ index.setDescription(description.getDescription());
+ index.setName(description.getName());
+ if(product.getManufacturer()!=null) {
+ index.setManufacturer(String.valueOf(product.getManufacturer().getId()));
+ }
+ if(price!=null) {
+ index.setPrice(price.getFinalPrice().doubleValue());
+ }
+ index.setHighlight(description.getProductHighlight());
+ if(!StringUtils.isBlank(description.getMetatagKeywords())){
+ String[] tags = description.getMetatagKeywords().split(",");
+ @SuppressWarnings("unchecked")
+ List<String> tagsList = new ArrayList(Arrays.asList(tags));
+ index.setTags(tagsList);
+ }
+
+
+ Set<Category> categories = product.getCategories();
+ if(!CollectionUtils.isEmpty(categories)) {
+ List<String> categoryList = new ArrayList<String>();
+ for(Category category : categories) {
+ categoryList.add(category.getCode());
+ }
+ index.setCategories(categoryList);
+ }
+
+ String jsonString = index.toJSONString();
+ try {
+ searchService.index(jsonString, collectionName.toString(), new StringBuilder().append(PRODUCT_INDEX_NAME).append(UNDERSCORE).append(description.getLanguage().getCode()).toString());
+ } catch (Exception e) {
+ throw new ServiceException("Cannot index product id [" + product.getId() + "], " + e.getMessage() ,e);
+ }
+ }
+ }
+
+
+ public void deleteIndex(MerchantStore store, Product product) throws ServiceException {
+
+ if(configuration.getProperty(INDEX_PRODUCTS)==null || configuration.getProperty(INDEX_PRODUCTS).equals(Constants.FALSE)) {
+ return;
+ }
+
+ Set<ProductDescription> descriptions = product.getDescriptions();
+ for(ProductDescription description : descriptions) {
+
+ StringBuilder collectionName = new StringBuilder();
+ collectionName.append(PRODUCT_INDEX_NAME).append(UNDERSCORE).append(description.getLanguage().getCode()).append(UNDERSCORE).append(store.getCode().toLowerCase());
+
+ try {
+ searchService.deleteObject(collectionName.toString(), new StringBuilder().append(PRODUCT_INDEX_NAME).append(UNDERSCORE).append(description.getLanguage().getCode()).toString(), String.valueOf(product.getId()));
+ } catch (Exception e) {
+ LOGGER.error("Cannot delete index for product id [" + product.getId() + "], ",e);
+ }
+ }
+
+ }
+
+
+ public SearchKeywords searchForKeywords(String collectionName, String jsonString, int entriesCount) throws ServiceException {
+
+ /**
+ * $('#search').searchAutocomplete({
+ url: '<%=request.getContextPath()%>/search/autocomplete/keyword_en'
+ //filter: function() {
+ //return '\"filter\" : {\"numeric_range\" : {\"price\" : {\"from\" : \"22\",\"to\" : \"45\",\"include_lower\" : true,\"include_upper\" : true}}}';
+ //}
+ });
+
+ **/
+
+ try {
+
+ SearchResponse response = searchService.searchAutoComplete(collectionName, jsonString, entriesCount);
+
+ SearchKeywords keywords = new SearchKeywords();
+ keywords.setKeywords(Arrays.asList(response.getInlineSearchList()));
+
+ return keywords;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while searching keywords " + jsonString,e);
+ throw new ServiceException(e);
+ }
+
+
+ }
+
+
+ public com.salesmanager.core.model.search.SearchResponse search(MerchantStore store, String languageCode, String jsonString, int entriesCount, int startIndex) throws ServiceException {
+
+
+ try {
+
+ StringBuilder collectionName = new StringBuilder();
+ collectionName.append(PRODUCT_INDEX_NAME).append(UNDERSCORE).append(languageCode).append(UNDERSCORE).append(store.getCode().toLowerCase());
+
+
+ SearchRequest request = new SearchRequest();
+ request.addCollection(collectionName.toString());
+ request.setSize(entriesCount);
+ request.setStart(startIndex);
+ request.setJson(jsonString);
+
+ SearchResponse response =searchService.search(request);
+
+ com.salesmanager.core.model.search.SearchResponse resp = new com.salesmanager.core.model.search.SearchResponse();
+ resp.setTotalCount(0);
+
+ if(response != null) {
+ resp.setTotalCount(response.getCount());
+
+ List<SearchEntry> entries = new ArrayList<SearchEntry>();
+
+ Collection<SearchHit> hits = response.getSearchHits();
+
+ if(!CollectionUtils.isEmpty(hits)) {
+ for(SearchHit hit : hits) {
+
+ SearchEntry entry = new SearchEntry();
+
+ //Map<String,Object> metaEntries = hit.getMetaEntries();
+ Map<String,Object> metaEntries = hit.getItem();
+ IndexProduct indexProduct = new IndexProduct();
+ //Map sourceEntries = (Map)metaEntries.get("source");
+
+ indexProduct.setDescription((String)metaEntries.get("description"));
+ indexProduct.setHighlight((String)metaEntries.get("highlight"));
+ indexProduct.setId((String)metaEntries.get("id"));
+ indexProduct.setLang((String)metaEntries.get("lang"));
+ indexProduct.setName(((String)metaEntries.get("name")));
+ indexProduct.setManufacturer(((String)metaEntries.get("manufacturer")));
+ indexProduct.setPrice(Double.valueOf(((String)metaEntries.get("price"))));
+ indexProduct.setStore(((String)metaEntries.get("store")));
+ entry.setIndexProduct(indexProduct);
+ entries.add(entry);
+
+ /**
+ * no more support for highlighted
+ */
+
+ /* Map<String, HighlightField> fields = hit.getHighlightFields();
+ if(fields!=null) {
+ List<String> highlights = new ArrayList<String>();
+ for(HighlightField field : fields.values()) {
+
+ Text[] text = field.getFragments();
+ //text[0]
+ String f = field.getName();
+ highlights.add(f);
+
+
+ }
+
+ entry.setHighlights(highlights);
+
+ }*/
+ }
+
+ resp.setEntries(entries);
+
+ Map<String,List<FacetEntry>> facets = response.getFacets();
+ if(facets!=null) {
+ Map<String,List<SearchFacet>> searchFacets = new HashMap<String,List<SearchFacet>>();
+ for(String key : facets.keySet()) {
+
+ List<FacetEntry> f = facets.get(key);
+
+ List<SearchFacet> fs = searchFacets.get(key);
+ if(fs==null) {
+ fs = new ArrayList<SearchFacet>();
+ searchFacets.put(key, fs);
+ }
+
+ for(com.shopizer.search.services.FacetEntry facetEntry : f) {
+
+ SearchFacet searchFacet = new SearchFacet();
+ searchFacet.setKey(facetEntry.getName());
+ searchFacet.setName(facetEntry.getName());
+ searchFacet.setCount(facetEntry.getCount());
+
+ fs.add(searchFacet);
+
+ }
+
+ }
+
+ resp.setFacets(searchFacets);
+
+ }
+
+ }
+ }
+
+
+
+ return resp;
+
+
+ } catch (Exception e) {
+ LOGGER.error("Error while searching keywords " + jsonString,e);
+ throw new ServiceException(e);
+ }
+
+ }
+
+}
+
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingOriginService.java b/sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingOriginService.java
index 9e539d9..ee469c4 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingOriginService.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingOriginService.java
@@ -1,19 +1,19 @@
-package com.salesmanager.core.business.services.shipping;
-
-import com.salesmanager.core.business.services.common.generic.SalesManagerEntityService;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.shipping.ShippingOrigin;
-
-/**
- * ShippingOrigin object if different from MerchantStore address.
- * Can be managed through this service.
- * @author carlsamson
- *
- */
-public interface ShippingOriginService extends SalesManagerEntityService<Long, ShippingOrigin> {
-
- ShippingOrigin getByStore(MerchantStore store);
-
-
-
-}
+package com.salesmanager.core.business.services.shipping;
+
+import com.salesmanager.core.business.services.common.generic.SalesManagerEntityService;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.shipping.ShippingOrigin;
+
+/**
+ * ShippingOrigin object if different from MerchantStore address.
+ * Can be managed through this service.
+ * @author carlsamson
+ *
+ */
+public interface ShippingOriginService extends SalesManagerEntityService<Long, ShippingOrigin> {
+
+ ShippingOrigin getByStore(MerchantStore store);
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingOriginServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingOriginServiceImpl.java
index 508d491..10604c6 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingOriginServiceImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingOriginServiceImpl.java
@@ -1,40 +1,40 @@
-package com.salesmanager.core.business.services.shipping;
-
-import javax.inject.Inject;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import com.salesmanager.core.business.repositories.shipping.ShippingOriginRepository;
-import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.shipping.ShippingOrigin;
-
-
-
-@Service("shippingOriginService")
-public class ShippingOriginServiceImpl extends SalesManagerEntityServiceImpl<Long, ShippingOrigin> implements ShippingOriginService {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ShippingOriginServiceImpl.class);
-
- private ShippingOriginRepository shippingOriginRepository;
-
-
-
- @Inject
- public ShippingOriginServiceImpl(ShippingOriginRepository shippingOriginRepository) {
- super(shippingOriginRepository);
- this.shippingOriginRepository = shippingOriginRepository;
- }
-
-
- @Override
- public ShippingOrigin getByStore(MerchantStore store) {
- // TODO Auto-generated method stub
- ShippingOrigin origin = shippingOriginRepository.findByStore(store.getId());
- return origin;
- }
-
-
-}
+package com.salesmanager.core.business.services.shipping;
+
+import javax.inject.Inject;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import com.salesmanager.core.business.repositories.shipping.ShippingOriginRepository;
+import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.shipping.ShippingOrigin;
+
+
+
+@Service("shippingOriginService")
+public class ShippingOriginServiceImpl extends SalesManagerEntityServiceImpl<Long, ShippingOrigin> implements ShippingOriginService {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ShippingOriginServiceImpl.class);
+
+ private ShippingOriginRepository shippingOriginRepository;
+
+
+
+ @Inject
+ public ShippingOriginServiceImpl(ShippingOriginRepository shippingOriginRepository) {
+ super(shippingOriginRepository);
+ this.shippingOriginRepository = shippingOriginRepository;
+ }
+
+
+ @Override
+ public ShippingOrigin getByStore(MerchantStore store) {
+ // TODO Auto-generated method stub
+ ShippingOrigin origin = shippingOriginRepository.findByStore(store.getId());
+ return origin;
+ }
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingQuoteService.java b/sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingQuoteService.java
new file mode 100644
index 0000000..5026d12
--- /dev/null
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingQuoteService.java
@@ -0,0 +1,39 @@
+package com.salesmanager.core.business.services.shipping;
+
+import java.util.List;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.common.generic.SalesManagerEntityService;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.shipping.Quote;
+import com.salesmanager.core.model.shipping.ShippingQuote;
+import com.salesmanager.core.model.shipping.ShippingSummary;
+
+/**
+ * Saves and retrieves various shipping quotes done by the system
+ * @author c.samson
+ *
+ */
+public interface ShippingQuoteService extends SalesManagerEntityService<Long, Quote> {
+
+ /**
+ * Find shipping quotes by Order
+ * @param order
+ * @return
+ * @throws ServiceException
+ */
+ List<Quote> findByOrder(Order order) throws ServiceException;
+
+
+ /**
+ * Each quote asked for a given shopping cart creates individual Quote object
+ * in the table ShippingQuote. This method allows the creation of a ShippingSummary
+ * object to work with in the services and in the api.
+ * @param quoteId
+ * @return
+ * @throws ServiceException
+ */
+ ShippingSummary getShippingSummary(Long quoteId, MerchantStore store) throws ServiceException;
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingQuoteServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingQuoteServiceImpl.java
new file mode 100644
index 0000000..3b68ff0
--- /dev/null
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingQuoteServiceImpl.java
@@ -0,0 +1,77 @@
+package com.salesmanager.core.business.services.shipping;
+
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.commons.lang.Validate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.repositories.shipping.ShippingQuoteRepository;
+import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.shipping.Quote;
+import com.salesmanager.core.model.shipping.ShippingSummary;
+
+@Service("shippingQuoteService")
+public class ShippingQuoteServiceImpl extends SalesManagerEntityServiceImpl<Long, Quote> implements ShippingQuoteService {
+
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ShippingQuoteServiceImpl.class);
+
+ private ShippingQuoteRepository shippingQuoteRepository;
+
+ @Inject
+ private ShippingService shippingService;
+
+ @Inject
+ public ShippingQuoteServiceImpl(ShippingQuoteRepository repository) {
+ super(repository);
+ this.shippingQuoteRepository = repository;
+ // TODO Auto-generated constructor stub
+ }
+
+ @Override
+ public List<Quote> findByOrder(Order order) throws ServiceException {
+ Validate.notNull(order,"Order cannot be null");
+ return this.shippingQuoteRepository.findByOrder(order.getId());
+ }
+
+ @Override
+ public ShippingSummary getShippingSummary(Long quoteId, MerchantStore store) throws ServiceException {
+
+ Validate.notNull(quoteId,"quoteId must not be null");
+
+ Quote q = shippingQuoteRepository.findOne(quoteId);
+
+ ShippingSummary quote = null;
+
+ if(q != null) {
+
+ quote = new ShippingSummary();
+ quote.setDeliveryAddress(q.getDelivery());
+ quote.setShipping(q.getPrice());
+ quote.setShippingModule(q.getModule());
+ quote.setShippingOption(q.getOptionName());
+ quote.setShippingOptionCode(q.getOptionCode());
+ quote.setHandling(q.getHandling());
+
+ if(shippingService.hasTaxOnShipping(store)) {
+ quote.setTaxOnShipping(true);
+ }
+
+
+
+ }
+
+
+ return quote;
+
+ }
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingService.java b/sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingService.java
index 0aa64ea..9043b95 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingService.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingService.java
@@ -1,208 +1,217 @@
-package com.salesmanager.core.business.services.shipping;
-
-import java.util.List;
-import java.util.Map;
-
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.model.common.Delivery;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.shipping.PackageDetails;
-import com.salesmanager.core.model.shipping.ShippingConfiguration;
-import com.salesmanager.core.model.shipping.ShippingMetaData;
-import com.salesmanager.core.model.shipping.ShippingOption;
-import com.salesmanager.core.model.shipping.ShippingProduct;
-import com.salesmanager.core.model.shipping.ShippingQuote;
-import com.salesmanager.core.model.shipping.ShippingSummary;
-import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
-import com.salesmanager.core.model.system.CustomIntegrationConfiguration;
-import com.salesmanager.core.model.system.IntegrationConfiguration;
-import com.salesmanager.core.model.system.IntegrationModule;
-
-
-
-public interface ShippingService {
-
- /**
- * Returns a list of supported countries (ship to country list) configured by merchant
- * when the merchant configured shipping National and has saved a list of ship to country
- * from the list
- * @param store
- * @return
- * @throws ServiceException
- */
- public List<String> getSupportedCountries(MerchantStore store)
- throws ServiceException;
-
- public void setSupportedCountries(MerchantStore store,
- List<String> countryCodes) throws ServiceException;
-
- /**
- * Returns a list of available shipping modules
- * @param store
- * @return
- * @throws ServiceException
- */
- public List<IntegrationModule> getShippingMethods(MerchantStore store)
- throws ServiceException;
-
-
- /**
- * Returns a list of configured shipping modules for a given merchant
- * @param store
- * @return
- * @throws ServiceException
- */
- Map<String, IntegrationConfiguration> getShippingModulesConfigured(
- MerchantStore store) throws ServiceException;
-
- /**
- * Adds a Shipping configuration
- * @param configuration
- * @param store
- * @throws ServiceException
- */
- void saveShippingQuoteModuleConfiguration(IntegrationConfiguration configuration,
- MerchantStore store) throws ServiceException;
-
- /**
- * ShippingType (NATIONAL, INTERNATIONSL)
- * ShippingBasisType (SHIPPING, BILLING)
- * ShippingPriceOptionType (ALL, LEAST, HIGHEST)
- * Packages
- * Handling
- * @param store
- * @return
- * @throws ServiceException
- */
- ShippingConfiguration getShippingConfiguration(MerchantStore store)
- throws ServiceException;
-
- /**
- * Saves ShippingConfiguration for a given MerchantStore
- * @param shippingConfiguration
- * @param store
- * @throws ServiceException
- */
- void saveShippingConfiguration(ShippingConfiguration shippingConfiguration,
- MerchantStore store) throws ServiceException;
-
- void removeShippingQuoteModuleConfiguration(String moduleCode,
- MerchantStore store) throws ServiceException;
-
- /**
- * Provides detailed information on boxes that will be used
- * when getting a ShippingQuote
- * @param products
- * @param store
- * @return
- * @throws ServiceException
- */
- List<PackageDetails> getPackagesDetails(List<ShippingProduct> products,
- MerchantStore store) throws ServiceException;
-
- /**
- * Get a list of ShippingQuote from a configured
- * shipping gateway. The quotes are displayed to the end user so he can pick
- * the ShippingOption he wants
- * @param store
- * @param customer
- * @param products
- * @param language
- * @return
- * @throws ServiceException
- */
- ShippingQuote getShippingQuote(MerchantStore store, Delivery delivery,
- List<ShippingProduct> products, Language language)
- throws ServiceException;
-
-
- /**
- * Returns a shipping module configuration given a moduleCode
- * @param moduleCode
- * @param store
- * @return
- * @throws ServiceException
- */
- IntegrationConfiguration getShippingConfiguration(String moduleCode,
- MerchantStore store) throws ServiceException;
-
- /**
- * Retrieves the custom configuration for a given module
- * @param moduleCode
- * @param store
- * @return
- * @throws ServiceException
- */
-
-
- CustomIntegrationConfiguration getCustomShippingConfiguration(
- String moduleCode, MerchantStore store) throws ServiceException;
-
- /**
- * Weight based configuration
- * @param moduleCode
- * @param shippingConfiguration
- * @param store
- * @throws ServiceException
- */
- void saveCustomShippingConfiguration(String moduleCode,
- CustomIntegrationConfiguration shippingConfiguration,
- MerchantStore store) throws ServiceException;
-
- /**
- * Removes a custom shipping quote
- * module
- * @param moduleCode
- * @param store
- * @throws ServiceException
- */
- void removeCustomShippingQuoteModuleConfiguration(String moduleCode,
- MerchantStore store) throws ServiceException;
-
- /**
- * The {@link ShippingSummary} is built from the ShippingOption the user has selected
- * The ShippingSummary is used for order calculation
- * @param store
- * @param shippingQuote
- * @param selectedShippingOption
- * @return
- * @throws ServiceException
- */
- ShippingSummary getShippingSummary(MerchantStore store, ShippingQuote shippingQuote,
- ShippingOption selectedShippingOption) throws ServiceException;
-
- /**
- * Returns a list of supported countries (ship to country list) configured by merchant
- * If the merchant configured shipping National, then only store country will be in the list
- * If the merchant configured shipping International, then the list of accepted country is returned
- * from the list
- * @param store
- * @param language
- * @return
- * @throws ServiceException
- */
- List<Country> getShipToCountryList(MerchantStore store, Language language)
- throws ServiceException;
-
- /**
- * Determines if Shipping should be proposed to the customer
- * @param items
- * @param store
- * @return
- * @throws ServiceException
- */
- boolean requiresShipping(List<ShoppingCartItem> items, MerchantStore store) throws ServiceException;
-
- /**
- * Returns shipping metadata and how shipping is configured for a given store
- * @param store
- * @return
- * @throws ServiceException
- */
- ShippingMetaData getShippingMetaData(MerchantStore store) throws ServiceException;
-
-
+package com.salesmanager.core.business.services.shipping;
+
+import java.util.List;
+import java.util.Map;
+
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.model.common.Delivery;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.shipping.PackageDetails;
+import com.salesmanager.core.model.shipping.ShippingConfiguration;
+import com.salesmanager.core.model.shipping.ShippingMetaData;
+import com.salesmanager.core.model.shipping.ShippingOption;
+import com.salesmanager.core.model.shipping.ShippingProduct;
+import com.salesmanager.core.model.shipping.ShippingQuote;
+import com.salesmanager.core.model.shipping.ShippingSummary;
+import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
+import com.salesmanager.core.model.system.CustomIntegrationConfiguration;
+import com.salesmanager.core.model.system.IntegrationConfiguration;
+import com.salesmanager.core.model.system.IntegrationModule;
+
+
+
+public interface ShippingService {
+
+ /**
+ * Returns a list of supported countries (ship to country list) configured by merchant
+ * when the merchant configured shipping National and has saved a list of ship to country
+ * from the list
+ * @param store
+ * @return
+ * @throws ServiceException
+ */
+ public List<String> getSupportedCountries(MerchantStore store)
+ throws ServiceException;
+
+ public void setSupportedCountries(MerchantStore store,
+ List<String> countryCodes) throws ServiceException;
+
+ /**
+ * Returns a list of available shipping modules
+ * @param store
+ * @return
+ * @throws ServiceException
+ */
+ public List<IntegrationModule> getShippingMethods(MerchantStore store)
+ throws ServiceException;
+
+
+ /**
+ * Returns a list of configured shipping modules for a given merchant
+ * @param store
+ * @return
+ * @throws ServiceException
+ */
+ Map<String, IntegrationConfiguration> getShippingModulesConfigured(
+ MerchantStore store) throws ServiceException;
+
+ /**
+ * Adds a Shipping configuration
+ * @param configuration
+ * @param store
+ * @throws ServiceException
+ */
+ void saveShippingQuoteModuleConfiguration(IntegrationConfiguration configuration,
+ MerchantStore store) throws ServiceException;
+
+ /**
+ * ShippingType (NATIONAL, INTERNATIONSL)
+ * ShippingBasisType (SHIPPING, BILLING)
+ * ShippingPriceOptionType (ALL, LEAST, HIGHEST)
+ * Packages
+ * Handling
+ * @param store
+ * @return
+ * @throws ServiceException
+ */
+ ShippingConfiguration getShippingConfiguration(MerchantStore store)
+ throws ServiceException;
+
+ /**
+ * Saves ShippingConfiguration for a given MerchantStore
+ * @param shippingConfiguration
+ * @param store
+ * @throws ServiceException
+ */
+ void saveShippingConfiguration(ShippingConfiguration shippingConfiguration,
+ MerchantStore store) throws ServiceException;
+
+ void removeShippingQuoteModuleConfiguration(String moduleCode,
+ MerchantStore store) throws ServiceException;
+
+ /**
+ * Provides detailed information on boxes that will be used
+ * when getting a ShippingQuote
+ * @param products
+ * @param store
+ * @return
+ * @throws ServiceException
+ */
+ List<PackageDetails> getPackagesDetails(List<ShippingProduct> products,
+ MerchantStore store) throws ServiceException;
+
+ /**
+ * Get a list of ShippingQuote from a configured
+ * shipping gateway. The quotes are displayed to the end user so he can pick
+ * the ShippingOption he wants
+ * @param store
+ * @param shoppingCartId
+ * @param customer
+ * @param products
+ * @param language
+ * @return
+ * @throws ServiceException
+ */
+ ShippingQuote getShippingQuote(Long shoppingCartId, MerchantStore store, Delivery delivery,
+ List<ShippingProduct> products, Language language)
+ throws ServiceException;
+
+
+ /**
+ * Returns a shipping module configuration given a moduleCode
+ * @param moduleCode
+ * @param store
+ * @return
+ * @throws ServiceException
+ */
+ IntegrationConfiguration getShippingConfiguration(String moduleCode,
+ MerchantStore store) throws ServiceException;
+
+ /**
+ * Retrieves the custom configuration for a given module
+ * @param moduleCode
+ * @param store
+ * @return
+ * @throws ServiceException
+ */
+
+
+ CustomIntegrationConfiguration getCustomShippingConfiguration(
+ String moduleCode, MerchantStore store) throws ServiceException;
+
+ /**
+ * Weight based configuration
+ * @param moduleCode
+ * @param shippingConfiguration
+ * @param store
+ * @throws ServiceException
+ */
+ void saveCustomShippingConfiguration(String moduleCode,
+ CustomIntegrationConfiguration shippingConfiguration,
+ MerchantStore store) throws ServiceException;
+
+ /**
+ * Removes a custom shipping quote
+ * module
+ * @param moduleCode
+ * @param store
+ * @throws ServiceException
+ */
+ void removeCustomShippingQuoteModuleConfiguration(String moduleCode,
+ MerchantStore store) throws ServiceException;
+
+ /**
+ * The {@link ShippingSummary} is built from the ShippingOption the user has selected
+ * The ShippingSummary is used for order calculation
+ * @param store
+ * @param shippingQuote
+ * @param selectedShippingOption
+ * @return
+ * @throws ServiceException
+ */
+ ShippingSummary getShippingSummary(MerchantStore store, ShippingQuote shippingQuote,
+ ShippingOption selectedShippingOption) throws ServiceException;
+
+ /**
+ * Returns a list of supported countries (ship to country list) configured by merchant
+ * If the merchant configured shipping National, then only store country will be in the list
+ * If the merchant configured shipping International, then the list of accepted country is returned
+ * from the list
+ * @param store
+ * @param language
+ * @return
+ * @throws ServiceException
+ */
+ List<Country> getShipToCountryList(MerchantStore store, Language language)
+ throws ServiceException;
+
+ /**
+ * Determines if Shipping should be proposed to the customer
+ * @param items
+ * @param store
+ * @return
+ * @throws ServiceException
+ */
+ boolean requiresShipping(List<ShoppingCartItem> items, MerchantStore store) throws ServiceException;
+
+ /**
+ * Returns shipping metadata and how shipping is configured for a given store
+ * @param store
+ * @return
+ * @throws ServiceException
+ */
+ ShippingMetaData getShippingMetaData(MerchantStore store) throws ServiceException;
+
+ /**
+ * Based on merchant configurations will return if tax must be calculated on shipping
+ * @param store
+ * @return
+ * @throws ServiceException
+ */
+ boolean hasTaxOnShipping(MerchantStore store) throws ServiceException;
+
+
}
\ No newline at end of file
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingServiceImpl.java
index 7e1d1a3..2c0728b 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingServiceImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/shipping/ShippingServiceImpl.java
@@ -1,872 +1,935 @@
-package com.salesmanager.core.business.services.shipping;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.salesmanager.core.business.constants.ShippingConstants;
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.catalog.product.PricingService;
-import com.salesmanager.core.business.services.reference.country.CountryService;
-import com.salesmanager.core.business.services.reference.language.LanguageService;
-import com.salesmanager.core.business.services.reference.loader.ConfigurationModulesLoader;
-import com.salesmanager.core.business.services.system.MerchantConfigurationService;
-import com.salesmanager.core.business.services.system.MerchantLogService;
-import com.salesmanager.core.business.services.system.ModuleConfigurationService;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.common.Delivery;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.shipping.*;
-import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
-import com.salesmanager.core.model.system.*;
-import com.salesmanager.core.modules.integration.IntegrationException;
-import com.salesmanager.core.modules.integration.shipping.model.Packaging;
-import com.salesmanager.core.modules.integration.shipping.model.ShippingQuoteModule;
-import com.salesmanager.core.modules.integration.shipping.model.ShippingQuotePrePostProcessModule;
-import com.salesmanager.core.modules.utils.Encryption;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.Validate;
-import org.json.simple.JSONArray;
-import org.json.simple.JSONValue;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import javax.inject.Inject;
-import java.math.BigDecimal;
-import java.util.*;
-
-
-@Service("shippingService")
-public class ShippingServiceImpl implements ShippingService {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ShippingServiceImpl.class);
-
-
- private final static String SUPPORTED_COUNTRIES = "SUPPORTED_CNTR";
- private final static String SHIPPING_MODULES = "SHIPPING";
- private final static String SHIPPING_DISTANCE = "shippingDistanceModule";
-
- @Inject
- private MerchantConfigurationService merchantConfigurationService;
-
-
- @Inject
- private PricingService pricingService;
-
- @Inject
- private ModuleConfigurationService moduleConfigurationService;
-
- @Inject
- private Packaging packaging;
-
- @Inject
- private CountryService countryService;
-
- @Inject
- private LanguageService languageService;
-
- @Inject
- private Encryption encryption;
-
- @Inject
- private MerchantLogService merchantLogService;
-
- @Inject
- private ShippingOriginService shippingOriginService;
-
- @Inject
- @Resource(name="shippingModules")
- private Map<String,ShippingQuoteModule> shippingModules;
-
- //shipping pre-processors
- @Inject
- @Resource(name="shippingModulePreProcessors")
- private List<ShippingQuotePrePostProcessModule> shippingModulePreProcessors;
-
- //shipping post-processors
- @Inject
- @Resource(name="shippingModulePostProcessors")
- private List<ShippingQuotePrePostProcessModule> shippingModulePostProcessors;
-
- @Override
- public ShippingConfiguration getShippingConfiguration(MerchantStore store) throws ServiceException {
-
- MerchantConfiguration configuration = merchantConfigurationService.getMerchantConfiguration(ShippingConstants.SHIPPING_CONFIGURATION, store);
-
- ShippingConfiguration shippingConfiguration = null;
-
- if(configuration!=null) {
- String value = configuration.getValue();
-
- ObjectMapper mapper = new ObjectMapper();
- try {
- shippingConfiguration = mapper.readValue(value, ShippingConfiguration.class);
- } catch(Exception e) {
- throw new ServiceException("Cannot parse json string " + value);
- }
- }
- return shippingConfiguration;
-
- }
-
- @Override
- public IntegrationConfiguration getShippingConfiguration(String moduleCode, MerchantStore store) throws ServiceException {
-
-
- Map<String,IntegrationConfiguration> configuredModules = getShippingModulesConfigured(store);
- if(configuredModules!=null) {
- for(String key : configuredModules.keySet()) {
- if(key.equals(moduleCode)) {
- return configuredModules.get(key);
- }
- }
- }
-
- return null;
-
- }
-
- @Override
- public CustomIntegrationConfiguration getCustomShippingConfiguration(String moduleCode, MerchantStore store) throws ServiceException {
-
-
- ShippingQuoteModule quoteModule = (ShippingQuoteModule)shippingModules.get(moduleCode);
- if(quoteModule==null) {
- return null;
- }
- return quoteModule.getCustomModuleConfiguration(store);
-
- }
-
- @Override
- public void saveShippingConfiguration(ShippingConfiguration shippingConfiguration, MerchantStore store) throws ServiceException {
-
- MerchantConfiguration configuration = merchantConfigurationService.getMerchantConfiguration(ShippingConstants.SHIPPING_CONFIGURATION, store);
-
- if(configuration==null) {
- configuration = new MerchantConfiguration();
- configuration.setMerchantStore(store);
- configuration.setKey(ShippingConstants.SHIPPING_CONFIGURATION);
- }
-
- String value = shippingConfiguration.toJSONString();
- configuration.setValue(value);
- merchantConfigurationService.saveOrUpdate(configuration);
-
- }
-
- @Override
- public void saveCustomShippingConfiguration(String moduleCode, CustomIntegrationConfiguration shippingConfiguration, MerchantStore store) throws ServiceException {
-
-
- ShippingQuoteModule quoteModule = (ShippingQuoteModule)shippingModules.get(moduleCode);
- if(quoteModule==null) {
- throw new ServiceException("Shipping module " + moduleCode + " does not exist");
- }
-
- String configurationValue = shippingConfiguration.toJSONString();
-
-
- try {
-
- MerchantConfiguration configuration = merchantConfigurationService.getMerchantConfiguration(moduleCode, store);
-
- if(configuration==null) {
-
- configuration = new MerchantConfiguration();
- configuration.setKey(moduleCode);
- configuration.setMerchantStore(store);
- }
- configuration.setValue(configurationValue);
- merchantConfigurationService.saveOrUpdate(configuration);
-
- } catch (Exception e) {
- throw new IntegrationException(e);
- }
-
-
-
- }
-
-
- @Override
- public List<IntegrationModule> getShippingMethods(MerchantStore store) throws ServiceException {
-
- List<IntegrationModule> modules = moduleConfigurationService.getIntegrationModules(SHIPPING_MODULES);
- List<IntegrationModule> returnModules = new ArrayList<IntegrationModule>();
-
- for(IntegrationModule module : modules) {
- if(module.getRegionsSet().contains(store.getCountry().getIsoCode())
- || module.getRegionsSet().contains("*")) {
-
- returnModules.add(module);
- }
- }
-
- return returnModules;
- }
-
- @Override
- public void saveShippingQuoteModuleConfiguration(IntegrationConfiguration configuration, MerchantStore store) throws ServiceException {
-
- //validate entries
- try {
-
- String moduleCode = configuration.getModuleCode();
- ShippingQuoteModule quoteModule = (ShippingQuoteModule)shippingModules.get(moduleCode);
- if(quoteModule==null) {
- throw new ServiceException("Shipping quote module " + moduleCode + " does not exist");
- }
- quoteModule.validateModuleConfiguration(configuration, store);
-
- } catch (IntegrationException ie) {
- throw ie;
- }
-
- try {
- Map<String,IntegrationConfiguration> modules = new HashMap<String,IntegrationConfiguration>();
- MerchantConfiguration merchantConfiguration = merchantConfigurationService.getMerchantConfiguration(SHIPPING_MODULES, store);
- if(merchantConfiguration!=null) {
- if(!StringUtils.isBlank(merchantConfiguration.getValue())) {
-
- String decrypted = encryption.decrypt(merchantConfiguration.getValue());
- modules = ConfigurationModulesLoader.loadIntegrationConfigurations(decrypted);
- }
- } else {
- merchantConfiguration = new MerchantConfiguration();
- merchantConfiguration.setMerchantStore(store);
- merchantConfiguration.setKey(SHIPPING_MODULES);
- }
- modules.put(configuration.getModuleCode(), configuration);
-
- String configs = ConfigurationModulesLoader.toJSONString(modules);
-
- String encrypted = encryption.encrypt(configs);
- merchantConfiguration.setValue(encrypted);
- merchantConfigurationService.saveOrUpdate(merchantConfiguration);
-
- } catch (Exception e) {
- throw new ServiceException(e);
- }
- }
-
-
- @Override
- public void removeShippingQuoteModuleConfiguration(String moduleCode, MerchantStore store) throws ServiceException {
-
-
-
- try {
- Map<String,IntegrationConfiguration> modules = new HashMap<String,IntegrationConfiguration>();
- MerchantConfiguration merchantConfiguration = merchantConfigurationService.getMerchantConfiguration(SHIPPING_MODULES, store);
- if(merchantConfiguration!=null) {
- if(!StringUtils.isBlank(merchantConfiguration.getValue())) {
- String decrypted = encryption.decrypt(merchantConfiguration.getValue());
- modules = ConfigurationModulesLoader.loadIntegrationConfigurations(decrypted);
- }
-
- modules.remove(moduleCode);
- String configs = ConfigurationModulesLoader.toJSONString(modules);
- String encrypted = encryption.encrypt(configs);
- merchantConfiguration.setValue(encrypted);
- merchantConfigurationService.saveOrUpdate(merchantConfiguration);
-
-
- }
-
- MerchantConfiguration configuration = merchantConfigurationService.getMerchantConfiguration(moduleCode, store);
-
- if(configuration!=null) {//custom module
-
- merchantConfigurationService.delete(configuration);
- }
-
-
- } catch (Exception e) {
- throw new ServiceException(e);
- }
-
- }
-
- @Override
- public void removeCustomShippingQuoteModuleConfiguration(String moduleCode, MerchantStore store) throws ServiceException {
-
-
-
- try {
-
- removeShippingQuoteModuleConfiguration(moduleCode,store);
- MerchantConfiguration merchantConfiguration = merchantConfigurationService.getMerchantConfiguration(moduleCode, store);
- if(merchantConfiguration!=null) {
- merchantConfigurationService.delete(merchantConfiguration);
- }
-
-
- } catch (Exception e) {
- throw new ServiceException(e);
- }
-
- }
-
- @Override
- public Map<String,IntegrationConfiguration> getShippingModulesConfigured(MerchantStore store) throws ServiceException {
- try {
-
-
- Map<String,IntegrationConfiguration> modules = new HashMap<String,IntegrationConfiguration>();
- MerchantConfiguration merchantConfiguration = merchantConfigurationService.getMerchantConfiguration(SHIPPING_MODULES, store);
- if(merchantConfiguration!=null) {
- if(!StringUtils.isBlank(merchantConfiguration.getValue())) {
- String decrypted = encryption.decrypt(merchantConfiguration.getValue());
- modules = ConfigurationModulesLoader.loadIntegrationConfigurations(decrypted);
-
- }
- }
- return modules;
-
-
- } catch (Exception e) {
- throw new ServiceException(e);
- }
-
- }
-
- @Override
- public ShippingSummary getShippingSummary(MerchantStore store, ShippingQuote shippingQuote, ShippingOption selectedShippingOption) throws ServiceException {
-
- ShippingSummary shippingSummary = new ShippingSummary();
- shippingSummary.setFreeShipping(shippingQuote.isFreeShipping());
- shippingSummary.setHandling(shippingQuote.getHandlingFees());
- shippingSummary.setShipping(selectedShippingOption.getOptionPrice());
- shippingSummary.setShippingModule(shippingQuote.getShippingModuleCode());
- shippingSummary.setShippingOption(selectedShippingOption.getDescription());
-
- return shippingSummary;
- }
-
- @Override
- public ShippingQuote getShippingQuote(MerchantStore store, Delivery delivery, List<ShippingProduct> products, Language language) throws ServiceException {
-
-
- //ShippingConfiguration -> Global configuration of a given store
- //IntegrationConfiguration -> Configuration of a given module
- //IntegrationModule -> The concrete module as defined in integrationmodules.properties
-
- //delivery without postal code is accepted
- Validate.notNull(store,"MerchantStore must not be null");
- Validate.notNull(delivery,"Delivery must not be null");
- Validate.notEmpty(products,"products must not be empty");
- Validate.notNull(language,"Language must not be null");
-
-
-
- ShippingQuote shippingQuote = new ShippingQuote();
- ShippingQuoteModule shippingQuoteModule = null;
-
- try {
-
-
- if(StringUtils.isBlank(delivery.getPostalCode())) {
- shippingQuote.getWarnings().add("No postal code in delivery address");
- shippingQuote.setShippingReturnCode(ShippingQuote.NO_POSTAL_CODE);
- }
-
- //get configuration
- ShippingConfiguration shippingConfiguration = getShippingConfiguration(store);
- ShippingType shippingType = ShippingType.INTERNATIONAL;
-
- /** get shipping origin **/
- ShippingOrigin shippingOrigin = shippingOriginService.getByStore(store);
- if(shippingOrigin == null || !shippingOrigin.isActive()) {
- shippingOrigin = new ShippingOrigin();
- shippingOrigin.setAddress(store.getStoreaddress());
- shippingOrigin.setCity(store.getStorecity());
- shippingOrigin.setCountry(store.getCountry());
- shippingOrigin.setPostalCode(store.getStorepostalcode());
- shippingOrigin.setState(store.getStorestateprovince());
- shippingOrigin.setZone(store.getZone());
- }
-
-
- if(shippingConfiguration==null) {
- shippingConfiguration = new ShippingConfiguration();
- }
-
- if(shippingConfiguration.getShippingType()!=null) {
- shippingType = shippingConfiguration.getShippingType();
- }
-
- //look if customer country code excluded
- Country shipCountry = delivery.getCountry();
-
- //a ship to country is required
- Validate.notNull(shipCountry);
- Validate.notNull(store.getCountry());
-
- if(shippingType.name().equals(ShippingType.NATIONAL.name())){
- //customer country must match store country
- if(!shipCountry.getIsoCode().equals(store.getCountry().getIsoCode())) {
- shippingQuote.setShippingReturnCode(ShippingQuote.NO_SHIPPING_TO_SELECTED_COUNTRY + " " + shipCountry.getIsoCode());
- return shippingQuote;
- }
- } else if(shippingType.name().equals(ShippingType.INTERNATIONAL.name())){
-
- //customer shipping country code must be in accepted list
- List<String> supportedCountries = this.getSupportedCountries(store);
- if(!supportedCountries.contains(shipCountry.getIsoCode())) {
- shippingQuote.setShippingReturnCode(ShippingQuote.NO_SHIPPING_TO_SELECTED_COUNTRY + " " + shipCountry.getIsoCode());
- return shippingQuote;
- }
- }
-
- //must have a shipping module configured
- Map<String, IntegrationConfiguration> modules = this.getShippingModulesConfigured(store);
- if(modules == null){
- shippingQuote.setShippingReturnCode(ShippingQuote.NO_SHIPPING_MODULE_CONFIGURED);
- return shippingQuote;
- }
-
-
- /** uses this module name **/
- String moduleName = null;
- IntegrationConfiguration configuration = null;
- for(String module : modules.keySet()) {
- moduleName = module;
- configuration = modules.get(module);
- //use the first active module
- if(configuration.isActive()) {
- shippingQuoteModule = this.shippingModules.get(module);
- if(shippingQuoteModule instanceof ShippingQuotePrePostProcessModule) {
- shippingQuoteModule = null;
- continue;
- } else {
- break;
- }
- }
- }
-
- if(shippingQuoteModule==null){
- shippingQuote.setShippingReturnCode(ShippingQuote.NO_SHIPPING_MODULE_CONFIGURED);
- return shippingQuote;
- }
-
- /** merchant module configs **/
- List<IntegrationModule> shippingMethods = this.getShippingMethods(store);
- IntegrationModule shippingModule = null;
- for(IntegrationModule mod : shippingMethods) {
- if(mod.getCode().equals(moduleName)){
- shippingModule = mod;
- break;
- }
- }
-
- /** general module configs **/
- if(shippingModule==null) {
- shippingQuote.setShippingReturnCode(ShippingQuote.NO_SHIPPING_MODULE_CONFIGURED);
- return shippingQuote;
- }
-
- //calculate order total
- BigDecimal orderTotal = calculateOrderTotal(products,store);
- List<PackageDetails> packages = this.getPackagesDetails(products, store);
-
- //free shipping ?
- if(shippingConfiguration.isFreeShippingEnabled()) {
- BigDecimal freeShippingAmount = shippingConfiguration.getOrderTotalFreeShipping();
- if(freeShippingAmount!=null) {
- if(orderTotal.doubleValue()>freeShippingAmount.doubleValue()) {
- if(shippingConfiguration.getFreeShippingType() == ShippingType.NATIONAL) {
- if(store.getCountry().getIsoCode().equals(shipCountry.getIsoCode())) {
- shippingQuote.setFreeShipping(true);
- shippingQuote.setFreeShippingAmount(freeShippingAmount);
- return shippingQuote;
- }
- } else {//international all
- shippingQuote.setFreeShipping(true);
- shippingQuote.setFreeShippingAmount(freeShippingAmount);
- return shippingQuote;
- }
-
- }
- }
- }
-
-
- //handling fees
- BigDecimal handlingFees = shippingConfiguration.getHandlingFees();
- if(handlingFees!=null) {
- shippingQuote.setHandlingFees(handlingFees);
- }
-
- //tax basis
- shippingQuote.setApplyTaxOnShipping(shippingConfiguration.isTaxOnShipping());
-
-
- Locale locale = languageService.toLocale(language);
-
- //invoke pre processors
- //the main pre-processor determines at runtime the shipping module
- //also available distance calculation
- if(!CollectionUtils.isEmpty(shippingModulePreProcessors)) {
- for(ShippingQuotePrePostProcessModule preProcessor : shippingModulePreProcessors) {
- //System.out.println("Using pre-processor " + preProcessor.getModuleCode());
- preProcessor.prePostProcessShippingQuotes(shippingQuote, packages, orderTotal, delivery, shippingOrigin, store, configuration, shippingModule, shippingConfiguration, shippingMethods, locale);
- //TODO switch module if required
- if(shippingQuote.getCurrentShippingModule()!=null && !shippingQuote.getCurrentShippingModule().getCode().equals(shippingModule.getCode())) {
- shippingModule = shippingQuote.getCurrentShippingModule();//determines the shipping module
- configuration = modules.get(shippingModule.getCode());
- if(configuration!=null) {
- if(configuration.isActive()) {
- moduleName = shippingModule.getCode();
- shippingQuoteModule = this.shippingModules.get(shippingModule.getCode());
- configuration = modules.get(shippingModule.getCode());
- } //TODO use default
- }
-
- }
- }
- }
-
- //invoke module
- List<ShippingOption> shippingOptions = null;
-
- try {
- shippingOptions = shippingQuoteModule.getShippingQuotes(shippingQuote, packages, orderTotal, delivery, shippingOrigin, store, configuration, shippingModule, shippingConfiguration, locale);
- } catch(Exception e) {
- LOGGER.error("Error while calculating shipping : " + e.getMessage(), e);
- merchantLogService.save(
- new MerchantLog(store,
- "Can't process " + shippingModule.getModule()
- + " -> "
- + e.getMessage()));
- shippingQuote.setQuoteError(e.getMessage());
- shippingQuote.setShippingReturnCode(ShippingQuote.ERROR);
- return shippingQuote;
- }
-
- if(shippingOptions==null && !StringUtils.isBlank(delivery.getPostalCode())) {
-
- //absolutely need to use in this case store pickup or other default shipping quote
- shippingQuote.setShippingReturnCode(ShippingQuote.NO_SHIPPING_TO_SELECTED_COUNTRY);
- }
-
-
- shippingQuote.setShippingModuleCode(moduleName);
-
- //filter shipping options
- ShippingOptionPriceType shippingOptionPriceType = shippingConfiguration.getShippingOptionPriceType();
- ShippingOption selectedOption = null;
-
- if(shippingOptions!=null) {
-
- for(ShippingOption option : shippingOptions) {
- if(selectedOption==null) {
- selectedOption = option;
- }
- //set price text
- String priceText = pricingService.getDisplayAmount(option.getOptionPrice(), store);
- option.setOptionPriceText(priceText);
- option.setShippingModuleCode(moduleName);
-
- if(StringUtils.isBlank(option.getOptionName())) {
-
- String countryName = delivery.getCountry().getName();
- if(countryName == null) {
- Map<String,Country> deliveryCountries = countryService.getCountriesMap(language);
- Country dCountry = (Country)deliveryCountries.get(delivery.getCountry().getIsoCode());
- if(dCountry!=null) {
- countryName = dCountry.getName();
- } else {
- countryName = delivery.getCountry().getIsoCode();
- }
- }
- option.setOptionName(countryName);
- }
-
- if(shippingOptionPriceType.name().equals(ShippingOptionPriceType.HIGHEST.name())) {
-
- if (option.getOptionPrice()
- .longValue() > selectedOption
- .getOptionPrice()
- .longValue()) {
- selectedOption = option;
- }
- }
-
-
- if(shippingOptionPriceType.name().equals(ShippingOptionPriceType.LEAST.name())) {
-
- if (option.getOptionPrice()
- .longValue() < selectedOption
- .getOptionPrice()
- .longValue()) {
- selectedOption = option;
- }
- }
-
-
- if(shippingOptionPriceType.name().equals(ShippingOptionPriceType.ALL.name())) {
-
- if (option.getOptionPrice()
- .longValue() < selectedOption
- .getOptionPrice()
- .longValue()) {
- selectedOption = option;
- }
- }
-
- }
-
- shippingQuote.setSelectedShippingOption(selectedOption);
-
- if(selectedOption!=null && !shippingOptionPriceType.name().equals(ShippingOptionPriceType.ALL.name())) {
- shippingOptions = new ArrayList<ShippingOption>();
- shippingOptions.add(selectedOption);
- }
-
- }
-
- /** set final delivery address **/
- shippingQuote.setDeliveryAddress(delivery);
-
- shippingQuote.setShippingOptions(shippingOptions);
-
- /** post processors **/
- //invoke pre processors
- if(!CollectionUtils.isEmpty(shippingModulePostProcessors)) {
- for(ShippingQuotePrePostProcessModule postProcessor : shippingModulePostProcessors) {
- //get module info
-
- //get module configuration
- IntegrationConfiguration integrationConfiguration = modules.get(postProcessor.getModuleCode());
-
- IntegrationModule postProcessModule = null;
- for(IntegrationModule mod : shippingMethods) {
- if(mod.getCode().equals(postProcessor.getModuleCode())){
- postProcessModule = mod;
- break;
- }
- }
-
- IntegrationModule module = postProcessModule;
- postProcessor.prePostProcessShippingQuotes(shippingQuote, packages, orderTotal, delivery, shippingOrigin, store, integrationConfiguration, module, shippingConfiguration, shippingMethods, locale);
- }
- }
-
-
-
-
- } catch (Exception e) {
- LOGGER.error(e.getMessage(), e);
- throw new ServiceException(e);
- }
-
- return shippingQuote;
-
- }
-
- @Override
- public List<String> getSupportedCountries(MerchantStore store) throws ServiceException {
-
- List<String> supportedCountries = new ArrayList<String>();
- MerchantConfiguration configuration = merchantConfigurationService.getMerchantConfiguration(SUPPORTED_COUNTRIES, store);
-
- if(configuration!=null) {
-
- String countries = configuration.getValue();
- if(!StringUtils.isBlank(countries)) {
-
- Object objRegions=JSONValue.parse(countries);
- JSONArray arrayRegions=(JSONArray)objRegions;
- @SuppressWarnings("rawtypes")
- Iterator i = arrayRegions.iterator();
- while(i.hasNext()) {
- supportedCountries.add((String)i.next());
- }
- }
-
- }
-
- return supportedCountries;
- }
-
- @Override
- public List<Country> getShipToCountryList(MerchantStore store, Language language) throws ServiceException {
-
-
- ShippingConfiguration shippingConfiguration = getShippingConfiguration(store);
- ShippingType shippingType = ShippingType.INTERNATIONAL;
- List<String> supportedCountries = new ArrayList<String>();
- if(shippingConfiguration==null) {
- shippingConfiguration = new ShippingConfiguration();
- }
-
- if(shippingConfiguration.getShippingType()!=null) {
- shippingType = shippingConfiguration.getShippingType();
- }
-
-
- if(shippingType.name().equals(ShippingType.NATIONAL.name())){
-
- supportedCountries.add(store.getCountry().getIsoCode());
-
- } else {
-
- MerchantConfiguration configuration = merchantConfigurationService.getMerchantConfiguration(SUPPORTED_COUNTRIES, store);
-
- if(configuration!=null) {
-
- String countries = configuration.getValue();
- if(!StringUtils.isBlank(countries)) {
-
- Object objRegions=JSONValue.parse(countries);
- JSONArray arrayRegions=(JSONArray)objRegions;
- @SuppressWarnings("rawtypes")
- Iterator i = arrayRegions.iterator();
- while(i.hasNext()) {
- supportedCountries.add((String)i.next());
- }
- }
-
- }
-
- }
-
- return countryService.getCountries(supportedCountries, language);
-
- }
-
-
- @Override
- public void setSupportedCountries(MerchantStore store, List<String> countryCodes) throws ServiceException {
-
-
- //transform a list of string to json entry
- ObjectMapper mapper = new ObjectMapper();
-
- try {
- String value = mapper.writeValueAsString(countryCodes);
-
- MerchantConfiguration configuration = merchantConfigurationService.getMerchantConfiguration(SUPPORTED_COUNTRIES, store);
-
- if(configuration==null) {
- configuration = new MerchantConfiguration();
- configuration.
- setKey(SUPPORTED_COUNTRIES);
- configuration.setMerchantStore(store);
- }
-
- configuration.setValue(value);
-
- merchantConfigurationService.saveOrUpdate(configuration);
-
- } catch (Exception e) {
- throw new ServiceException(e);
- }
-
- }
-
-
- private BigDecimal calculateOrderTotal(List<ShippingProduct> products, MerchantStore store) throws Exception {
-
- BigDecimal total = new BigDecimal(0);
- for(ShippingProduct shippingProduct : products) {
- BigDecimal currentPrice = shippingProduct.getFinalPrice().getFinalPrice();
- currentPrice = currentPrice.multiply(new BigDecimal(shippingProduct.getQuantity()));
- total = total.add(currentPrice);
- }
-
-
- return total;
-
-
- }
-
- @Override
- public List<PackageDetails> getPackagesDetails(
- List<ShippingProduct> products, MerchantStore store)
- throws ServiceException {
-
- List<PackageDetails> packages = null;
-
- ShippingConfiguration shippingConfiguration = this.getShippingConfiguration(store);
- //determine if the system has to use BOX or ITEM
- ShippingPackageType shippingPackageType = ShippingPackageType.ITEM;
- if(shippingConfiguration!=null) {
- shippingPackageType = shippingConfiguration.getShippingPackageType();
- }
-
- if(shippingPackageType.name().equals(ShippingPackageType.BOX.name())){
- packages = packaging.getBoxPackagesDetails(products, store);
- } else {
- packages = packaging.getItemPackagesDetails(products, store);
- }
-
- return packages;
-
- }
-
- @Override
- public boolean requiresShipping(List<ShoppingCartItem> items,
- MerchantStore store) throws ServiceException {
-
- boolean requiresShipping = false;
- for(ShoppingCartItem item : items) {
- Product product = item.getProduct();
- if(!product.isProductVirtual() && product.isProductShipeable()) {
- requiresShipping = true;
- }
- }
-
- return requiresShipping;
- }
-
- @Override
- public ShippingMetaData getShippingMetaData(MerchantStore store)
- throws ServiceException {
-
- ShippingMetaData metaData = new ShippingMetaData();
-
- // configured country
- List<Country> countries = getShipToCountryList(store, store.getDefaultLanguage());
- metaData.setShipToCountry(countries);
-
- // configured modules
- Map<String,IntegrationConfiguration> modules = getShippingModulesConfigured(store);
- List<String> moduleKeys = new ArrayList<String>();
- if(modules!=null) {
- for(String key : modules.keySet()) {
- moduleKeys.add(key);
- }
- }
- metaData.setModules(moduleKeys);
-
- // pre processors
- List<ShippingQuotePrePostProcessModule> preProcessors = this.shippingModulePreProcessors;
- List<String> preProcessorKeys = new ArrayList<String>();
- if(preProcessors!=null) {
- for(ShippingQuotePrePostProcessModule processor : preProcessors) {
- preProcessorKeys.add(processor.getModuleCode());
- if(SHIPPING_DISTANCE.equals(processor.getModuleCode())) {
- metaData.setUseDistanceModule(true);
- }
- }
- }
- metaData.setPreProcessors(preProcessorKeys);
-
- //post processors
- List<ShippingQuotePrePostProcessModule> postProcessors = this.shippingModulePostProcessors;
- List<String> postProcessorKeys = new ArrayList<String>();
- if(postProcessors!=null) {
- for(ShippingQuotePrePostProcessModule processor : postProcessors) {
- postProcessorKeys.add(processor.getModuleCode());
- }
- }
- metaData.setPostProcessors(postProcessorKeys);
-
-
- return metaData;
- }
+package com.salesmanager.core.business.services.shipping;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.salesmanager.core.business.constants.ShippingConstants;
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.reference.country.CountryService;
+import com.salesmanager.core.business.services.reference.language.LanguageService;
+import com.salesmanager.core.business.services.reference.loader.ConfigurationModulesLoader;
+import com.salesmanager.core.business.services.system.MerchantConfigurationService;
+import com.salesmanager.core.business.services.system.MerchantLogService;
+import com.salesmanager.core.business.services.system.ModuleConfigurationService;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.common.Delivery;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.shipping.*;
+import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
+import com.salesmanager.core.model.system.*;
+import com.salesmanager.core.modules.integration.IntegrationException;
+import com.salesmanager.core.modules.integration.shipping.model.Packaging;
+import com.salesmanager.core.modules.integration.shipping.model.ShippingQuoteModule;
+import com.salesmanager.core.modules.integration.shipping.model.ShippingQuotePrePostProcessModule;
+import com.salesmanager.core.modules.utils.Encryption;
+import com.shopizer.search.utils.DateUtil;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.Validate;
+import org.json.simple.JSONArray;
+import org.json.simple.JSONValue;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import javax.inject.Inject;
+import java.math.BigDecimal;
+import java.util.*;
+
+
+@Service("shippingService")
+public class ShippingServiceImpl implements ShippingService {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ShippingServiceImpl.class);
+
+
+ private final static String SUPPORTED_COUNTRIES = "SUPPORTED_CNTR";
+ private final static String SHIPPING_MODULES = "SHIPPING";
+ private final static String SHIPPING_DISTANCE = "shippingDistanceModule";
+
+ @Inject
+ private MerchantConfigurationService merchantConfigurationService;
+
+
+ @Inject
+ private PricingService pricingService;
+
+ @Inject
+ private ModuleConfigurationService moduleConfigurationService;
+
+ @Inject
+ private Packaging packaging;
+
+ @Inject
+ private CountryService countryService;
+
+ @Inject
+ private LanguageService languageService;
+
+ @Inject
+ private Encryption encryption;
+
+ @Inject
+ private MerchantLogService merchantLogService;
+
+ @Inject
+ private ShippingOriginService shippingOriginService;
+
+ @Inject
+ private ShippingQuoteService shippingQuoteService;
+
+ @Inject
+ @Resource(name="shippingModules")
+ private Map<String,ShippingQuoteModule> shippingModules;
+
+ //shipping pre-processors
+ @Inject
+ @Resource(name="shippingModulePreProcessors")
+ private List<ShippingQuotePrePostProcessModule> shippingModulePreProcessors;
+
+ //shipping post-processors
+ @Inject
+ @Resource(name="shippingModulePostProcessors")
+ private List<ShippingQuotePrePostProcessModule> shippingModulePostProcessors;
+
+ @Override
+ public ShippingConfiguration getShippingConfiguration(MerchantStore store) throws ServiceException {
+
+ MerchantConfiguration configuration = merchantConfigurationService.getMerchantConfiguration(ShippingConstants.SHIPPING_CONFIGURATION, store);
+
+ ShippingConfiguration shippingConfiguration = null;
+
+ if(configuration!=null) {
+ String value = configuration.getValue();
+
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ shippingConfiguration = mapper.readValue(value, ShippingConfiguration.class);
+ } catch(Exception e) {
+ throw new ServiceException("Cannot parse json string " + value);
+ }
+ }
+ return shippingConfiguration;
+
+ }
+
+ @Override
+ public IntegrationConfiguration getShippingConfiguration(String moduleCode, MerchantStore store) throws ServiceException {
+
+
+ Map<String,IntegrationConfiguration> configuredModules = getShippingModulesConfigured(store);
+ if(configuredModules!=null) {
+ for(String key : configuredModules.keySet()) {
+ if(key.equals(moduleCode)) {
+ return configuredModules.get(key);
+ }
+ }
+ }
+
+ return null;
+
+ }
+
+ @Override
+ public CustomIntegrationConfiguration getCustomShippingConfiguration(String moduleCode, MerchantStore store) throws ServiceException {
+
+
+ ShippingQuoteModule quoteModule = (ShippingQuoteModule)shippingModules.get(moduleCode);
+ if(quoteModule==null) {
+ return null;
+ }
+ return quoteModule.getCustomModuleConfiguration(store);
+
+ }
+
+ @Override
+ public void saveShippingConfiguration(ShippingConfiguration shippingConfiguration, MerchantStore store) throws ServiceException {
+
+ MerchantConfiguration configuration = merchantConfigurationService.getMerchantConfiguration(ShippingConstants.SHIPPING_CONFIGURATION, store);
+
+ if(configuration==null) {
+ configuration = new MerchantConfiguration();
+ configuration.setMerchantStore(store);
+ configuration.setKey(ShippingConstants.SHIPPING_CONFIGURATION);
+ }
+
+ String value = shippingConfiguration.toJSONString();
+ configuration.setValue(value);
+ merchantConfigurationService.saveOrUpdate(configuration);
+
+ }
+
+ @Override
+ public void saveCustomShippingConfiguration(String moduleCode, CustomIntegrationConfiguration shippingConfiguration, MerchantStore store) throws ServiceException {
+
+
+ ShippingQuoteModule quoteModule = (ShippingQuoteModule)shippingModules.get(moduleCode);
+ if(quoteModule==null) {
+ throw new ServiceException("Shipping module " + moduleCode + " does not exist");
+ }
+
+ String configurationValue = shippingConfiguration.toJSONString();
+
+
+ try {
+
+ MerchantConfiguration configuration = merchantConfigurationService.getMerchantConfiguration(moduleCode, store);
+
+ if(configuration==null) {
+
+ configuration = new MerchantConfiguration();
+ configuration.setKey(moduleCode);
+ configuration.setMerchantStore(store);
+ }
+ configuration.setValue(configurationValue);
+ merchantConfigurationService.saveOrUpdate(configuration);
+
+ } catch (Exception e) {
+ throw new IntegrationException(e);
+ }
+
+
+
+ }
+
+
+ @Override
+ public List<IntegrationModule> getShippingMethods(MerchantStore store) throws ServiceException {
+
+ List<IntegrationModule> modules = moduleConfigurationService.getIntegrationModules(SHIPPING_MODULES);
+ List<IntegrationModule> returnModules = new ArrayList<IntegrationModule>();
+
+ for(IntegrationModule module : modules) {
+ if(module.getRegionsSet().contains(store.getCountry().getIsoCode())
+ || module.getRegionsSet().contains("*")) {
+
+ returnModules.add(module);
+ }
+ }
+
+ return returnModules;
+ }
+
+ @Override
+ public void saveShippingQuoteModuleConfiguration(IntegrationConfiguration configuration, MerchantStore store) throws ServiceException {
+
+ //validate entries
+ try {
+
+ String moduleCode = configuration.getModuleCode();
+ ShippingQuoteModule quoteModule = (ShippingQuoteModule)shippingModules.get(moduleCode);
+ if(quoteModule==null) {
+ throw new ServiceException("Shipping quote module " + moduleCode + " does not exist");
+ }
+ quoteModule.validateModuleConfiguration(configuration, store);
+
+ } catch (IntegrationException ie) {
+ throw ie;
+ }
+
+ try {
+ Map<String,IntegrationConfiguration> modules = new HashMap<String,IntegrationConfiguration>();
+ MerchantConfiguration merchantConfiguration = merchantConfigurationService.getMerchantConfiguration(SHIPPING_MODULES, store);
+ if(merchantConfiguration!=null) {
+ if(!StringUtils.isBlank(merchantConfiguration.getValue())) {
+
+ String decrypted = encryption.decrypt(merchantConfiguration.getValue());
+ modules = ConfigurationModulesLoader.loadIntegrationConfigurations(decrypted);
+ }
+ } else {
+ merchantConfiguration = new MerchantConfiguration();
+ merchantConfiguration.setMerchantStore(store);
+ merchantConfiguration.setKey(SHIPPING_MODULES);
+ }
+ modules.put(configuration.getModuleCode(), configuration);
+
+ String configs = ConfigurationModulesLoader.toJSONString(modules);
+
+ String encrypted = encryption.encrypt(configs);
+ merchantConfiguration.setValue(encrypted);
+ merchantConfigurationService.saveOrUpdate(merchantConfiguration);
+
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ }
+ }
+
+
+ @Override
+ public void removeShippingQuoteModuleConfiguration(String moduleCode, MerchantStore store) throws ServiceException {
+
+
+
+ try {
+ Map<String,IntegrationConfiguration> modules = new HashMap<String,IntegrationConfiguration>();
+ MerchantConfiguration merchantConfiguration = merchantConfigurationService.getMerchantConfiguration(SHIPPING_MODULES, store);
+ if(merchantConfiguration!=null) {
+ if(!StringUtils.isBlank(merchantConfiguration.getValue())) {
+ String decrypted = encryption.decrypt(merchantConfiguration.getValue());
+ modules = ConfigurationModulesLoader.loadIntegrationConfigurations(decrypted);
+ }
+
+ modules.remove(moduleCode);
+ String configs = ConfigurationModulesLoader.toJSONString(modules);
+ String encrypted = encryption.encrypt(configs);
+ merchantConfiguration.setValue(encrypted);
+ merchantConfigurationService.saveOrUpdate(merchantConfiguration);
+
+
+ }
+
+ MerchantConfiguration configuration = merchantConfigurationService.getMerchantConfiguration(moduleCode, store);
+
+ if(configuration!=null) {//custom module
+
+ merchantConfigurationService.delete(configuration);
+ }
+
+
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ }
+
+ }
+
+ @Override
+ public void removeCustomShippingQuoteModuleConfiguration(String moduleCode, MerchantStore store) throws ServiceException {
+
+
+
+ try {
+
+ removeShippingQuoteModuleConfiguration(moduleCode,store);
+ MerchantConfiguration merchantConfiguration = merchantConfigurationService.getMerchantConfiguration(moduleCode, store);
+ if(merchantConfiguration!=null) {
+ merchantConfigurationService.delete(merchantConfiguration);
+ }
+
+
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ }
+
+ }
+
+ @Override
+ public Map<String,IntegrationConfiguration> getShippingModulesConfigured(MerchantStore store) throws ServiceException {
+ try {
+
+
+ Map<String,IntegrationConfiguration> modules = new HashMap<String,IntegrationConfiguration>();
+ MerchantConfiguration merchantConfiguration = merchantConfigurationService.getMerchantConfiguration(SHIPPING_MODULES, store);
+ if(merchantConfiguration!=null) {
+ if(!StringUtils.isBlank(merchantConfiguration.getValue())) {
+ String decrypted = encryption.decrypt(merchantConfiguration.getValue());
+ modules = ConfigurationModulesLoader.loadIntegrationConfigurations(decrypted);
+
+ }
+ }
+ return modules;
+
+
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ }
+
+ }
+
+ @Override
+ public ShippingSummary getShippingSummary(MerchantStore store, ShippingQuote shippingQuote, ShippingOption selectedShippingOption) throws ServiceException {
+
+ ShippingSummary shippingSummary = new ShippingSummary();
+ shippingSummary.setFreeShipping(shippingQuote.isFreeShipping());
+ shippingSummary.setHandling(shippingQuote.getHandlingFees());
+ shippingSummary.setShipping(selectedShippingOption.getOptionPrice());
+ shippingSummary.setShippingModule(shippingQuote.getShippingModuleCode());
+ shippingSummary.setShippingOption(selectedShippingOption.getDescription());
+
+ return shippingSummary;
+ }
+
+ @Override
+ public ShippingQuote getShippingQuote(Long shoppingCartId, MerchantStore store, Delivery delivery, List<ShippingProduct> products, Language language) throws ServiceException {
+
+
+ //ShippingConfiguration -> Global configuration of a given store
+ //IntegrationConfiguration -> Configuration of a given module
+ //IntegrationModule -> The concrete module as defined in integrationmodules.properties
+
+ //delivery without postal code is accepted
+ Validate.notNull(store,"MerchantStore must not be null");
+ Validate.notNull(delivery,"Delivery must not be null");
+ Validate.notEmpty(products,"products must not be empty");
+ Validate.notNull(language,"Language must not be null");
+
+
+
+ ShippingQuote shippingQuote = new ShippingQuote();
+ ShippingQuoteModule shippingQuoteModule = null;
+
+ try {
+
+
+ if(StringUtils.isBlank(delivery.getPostalCode())) {
+ shippingQuote.getWarnings().add("No postal code in delivery address");
+ shippingQuote.setShippingReturnCode(ShippingQuote.NO_POSTAL_CODE);
+ }
+
+ //get configuration
+ ShippingConfiguration shippingConfiguration = getShippingConfiguration(store);
+ ShippingType shippingType = ShippingType.INTERNATIONAL;
+
+ /** get shipping origin **/
+ ShippingOrigin shippingOrigin = shippingOriginService.getByStore(store);
+ if(shippingOrigin == null || !shippingOrigin.isActive()) {
+ shippingOrigin = new ShippingOrigin();
+ shippingOrigin.setAddress(store.getStoreaddress());
+ shippingOrigin.setCity(store.getStorecity());
+ shippingOrigin.setCountry(store.getCountry());
+ shippingOrigin.setPostalCode(store.getStorepostalcode());
+ shippingOrigin.setState(store.getStorestateprovince());
+ shippingOrigin.setZone(store.getZone());
+ }
+
+
+ if(shippingConfiguration==null) {
+ shippingConfiguration = new ShippingConfiguration();
+ }
+
+ if(shippingConfiguration.getShippingType()!=null) {
+ shippingType = shippingConfiguration.getShippingType();
+ }
+
+ //look if customer country code excluded
+ Country shipCountry = delivery.getCountry();
+
+ //a ship to country is required
+ Validate.notNull(shipCountry);
+ Validate.notNull(store.getCountry());
+
+ if(shippingType.name().equals(ShippingType.NATIONAL.name())){
+ //customer country must match store country
+ if(!shipCountry.getIsoCode().equals(store.getCountry().getIsoCode())) {
+ shippingQuote.setShippingReturnCode(ShippingQuote.NO_SHIPPING_TO_SELECTED_COUNTRY + " " + shipCountry.getIsoCode());
+ return shippingQuote;
+ }
+ } else if(shippingType.name().equals(ShippingType.INTERNATIONAL.name())){
+
+ //customer shipping country code must be in accepted list
+ List<String> supportedCountries = this.getSupportedCountries(store);
+ if(!supportedCountries.contains(shipCountry.getIsoCode())) {
+ shippingQuote.setShippingReturnCode(ShippingQuote.NO_SHIPPING_TO_SELECTED_COUNTRY + " " + shipCountry.getIsoCode());
+ return shippingQuote;
+ }
+ }
+
+ //must have a shipping module configured
+ Map<String, IntegrationConfiguration> modules = this.getShippingModulesConfigured(store);
+ if(modules == null){
+ shippingQuote.setShippingReturnCode(ShippingQuote.NO_SHIPPING_MODULE_CONFIGURED);
+ return shippingQuote;
+ }
+
+
+ /** uses this module name **/
+ String moduleName = null;
+ IntegrationConfiguration configuration = null;
+ for(String module : modules.keySet()) {
+ moduleName = module;
+ configuration = modules.get(module);
+ //use the first active module
+ if(configuration.isActive()) {
+ shippingQuoteModule = this.shippingModules.get(module);
+ if(shippingQuoteModule instanceof ShippingQuotePrePostProcessModule) {
+ shippingQuoteModule = null;
+ continue;
+ } else {
+ break;
+ }
+ }
+ }
+
+ if(shippingQuoteModule==null){
+ shippingQuote.setShippingReturnCode(ShippingQuote.NO_SHIPPING_MODULE_CONFIGURED);
+ return shippingQuote;
+ }
+
+ /** merchant module configs **/
+ List<IntegrationModule> shippingMethods = this.getShippingMethods(store);
+ IntegrationModule shippingModule = null;
+ for(IntegrationModule mod : shippingMethods) {
+ if(mod.getCode().equals(moduleName)){
+ shippingModule = mod;
+ break;
+ }
+ }
+
+ /** general module configs **/
+ if(shippingModule==null) {
+ shippingQuote.setShippingReturnCode(ShippingQuote.NO_SHIPPING_MODULE_CONFIGURED);
+ return shippingQuote;
+ }
+
+ //calculate order total
+ BigDecimal orderTotal = calculateOrderTotal(products,store);
+ List<PackageDetails> packages = this.getPackagesDetails(products, store);
+
+ //free shipping ?
+ boolean freeShipping = false;
+ if(shippingConfiguration.isFreeShippingEnabled()) {
+ BigDecimal freeShippingAmount = shippingConfiguration.getOrderTotalFreeShipping();
+ if(freeShippingAmount!=null) {
+ if(orderTotal.doubleValue()>freeShippingAmount.doubleValue()) {
+ if(shippingConfiguration.getFreeShippingType() == ShippingType.NATIONAL) {
+ if(store.getCountry().getIsoCode().equals(shipCountry.getIsoCode())) {
+ freeShipping = true;
+ shippingQuote.setFreeShipping(true);
+ shippingQuote.setFreeShippingAmount(freeShippingAmount);
+ return shippingQuote;
+ }
+ } else {//international all
+ freeShipping = true;
+ shippingQuote.setFreeShipping(true);
+ shippingQuote.setFreeShippingAmount(freeShippingAmount);
+ return shippingQuote;
+ }
+
+ }
+ }
+ }
+
+
+ //handling fees
+ BigDecimal handlingFees = shippingConfiguration.getHandlingFees();
+ if(handlingFees!=null) {
+ shippingQuote.setHandlingFees(handlingFees);
+ }
+
+ //tax basis
+ shippingQuote.setApplyTaxOnShipping(shippingConfiguration.isTaxOnShipping());
+
+
+ Locale locale = languageService.toLocale(language, store);
+
+ //invoke pre processors
+ //the main pre-processor determines at runtime the shipping module
+ //also available distance calculation
+ if(!CollectionUtils.isEmpty(shippingModulePreProcessors)) {
+ for(ShippingQuotePrePostProcessModule preProcessor : shippingModulePreProcessors) {
+ //System.out.println("Using pre-processor " + preProcessor.getModuleCode());
+ preProcessor.prePostProcessShippingQuotes(shippingQuote, packages, orderTotal, delivery, shippingOrigin, store, configuration, shippingModule, shippingConfiguration, shippingMethods, locale);
+ //TODO switch module if required
+ if(shippingQuote.getCurrentShippingModule()!=null && !shippingQuote.getCurrentShippingModule().getCode().equals(shippingModule.getCode())) {
+ shippingModule = shippingQuote.getCurrentShippingModule();//determines the shipping module
+ configuration = modules.get(shippingModule.getCode());
+ if(configuration!=null) {
+ if(configuration.isActive()) {
+ moduleName = shippingModule.getCode();
+ shippingQuoteModule = this.shippingModules.get(shippingModule.getCode());
+ configuration = modules.get(shippingModule.getCode());
+ } //TODO use default
+ }
+
+ }
+ }
+ }
+
+ //invoke module
+ List<ShippingOption> shippingOptions = null;
+
+ try {
+ shippingOptions = shippingQuoteModule.getShippingQuotes(shippingQuote, packages, orderTotal, delivery, shippingOrigin, store, configuration, shippingModule, shippingConfiguration, locale);
+ } catch(Exception e) {
+ LOGGER.error("Error while calculating shipping : " + e.getMessage(), e);
+ merchantLogService.save(
+ new MerchantLog(store,
+ "Can't process " + shippingModule.getModule()
+ + " -> "
+ + e.getMessage()));
+ shippingQuote.setQuoteError(e.getMessage());
+ shippingQuote.setShippingReturnCode(ShippingQuote.ERROR);
+ return shippingQuote;
+ }
+
+ if(shippingOptions==null && !StringUtils.isBlank(delivery.getPostalCode())) {
+
+ //absolutely need to use in this case store pickup or other default shipping quote
+ shippingQuote.setShippingReturnCode(ShippingQuote.NO_SHIPPING_TO_SELECTED_COUNTRY);
+ }
+
+
+ shippingQuote.setShippingModuleCode(moduleName);
+
+ //filter shipping options
+ ShippingOptionPriceType shippingOptionPriceType = shippingConfiguration.getShippingOptionPriceType();
+ ShippingOption selectedOption = null;
+
+ if(shippingOptions!=null) {
+
+ for(ShippingOption option : shippingOptions) {
+ if(selectedOption==null) {
+ selectedOption = option;
+ }
+ //set price text
+ String priceText = pricingService.getDisplayAmount(option.getOptionPrice(), store);
+ option.setOptionPriceText(priceText);
+ option.setShippingModuleCode(moduleName);
+
+ if(StringUtils.isBlank(option.getOptionName())) {
+
+ String countryName = delivery.getCountry().getName();
+ if(countryName == null) {
+ Map<String,Country> deliveryCountries = countryService.getCountriesMap(language);
+ Country dCountry = (Country)deliveryCountries.get(delivery.getCountry().getIsoCode());
+ if(dCountry!=null) {
+ countryName = dCountry.getName();
+ } else {
+ countryName = delivery.getCountry().getIsoCode();
+ }
+ }
+ option.setOptionName(countryName);
+ }
+
+ if(shippingOptionPriceType.name().equals(ShippingOptionPriceType.HIGHEST.name())) {
+
+ if (option.getOptionPrice()
+ .longValue() > selectedOption
+ .getOptionPrice()
+ .longValue()) {
+ selectedOption = option;
+ }
+ }
+
+
+ if(shippingOptionPriceType.name().equals(ShippingOptionPriceType.LEAST.name())) {
+
+ if (option.getOptionPrice()
+ .longValue() < selectedOption
+ .getOptionPrice()
+ .longValue()) {
+ selectedOption = option;
+ }
+ }
+
+
+ if(shippingOptionPriceType.name().equals(ShippingOptionPriceType.ALL.name())) {
+
+ if (option.getOptionPrice()
+ .longValue() < selectedOption
+ .getOptionPrice()
+ .longValue()) {
+ selectedOption = option;
+ }
+ }
+
+ }
+
+ shippingQuote.setSelectedShippingOption(selectedOption);
+
+ if(selectedOption!=null && !shippingOptionPriceType.name().equals(ShippingOptionPriceType.ALL.name())) {
+ shippingOptions = new ArrayList<ShippingOption>();
+ shippingOptions.add(selectedOption);
+ }
+
+ //TODO save shipping option
+
+ }
+
+ /** set final delivery address **/
+ shippingQuote.setDeliveryAddress(delivery);
+
+ shippingQuote.setShippingOptions(shippingOptions);
+
+ /** post processors **/
+ //invoke pre processors
+ if(!CollectionUtils.isEmpty(shippingModulePostProcessors)) {
+ for(ShippingQuotePrePostProcessModule postProcessor : shippingModulePostProcessors) {
+ //get module info
+
+ //get module configuration
+ IntegrationConfiguration integrationConfiguration = modules.get(postProcessor.getModuleCode());
+
+ IntegrationModule postProcessModule = null;
+ for(IntegrationModule mod : shippingMethods) {
+ if(mod.getCode().equals(postProcessor.getModuleCode())){
+ postProcessModule = mod;
+ break;
+ }
+ }
+
+ IntegrationModule module = postProcessModule;
+ postProcessor.prePostProcessShippingQuotes(shippingQuote, packages, orderTotal, delivery, shippingOrigin, store, integrationConfiguration, module, shippingConfiguration, shippingMethods, locale);
+ }
+ }
+
+ //save SHIPPING OPTIONS
+ List<ShippingOption> finalShippingOptions = shippingQuote.getShippingOptions();
+ for(ShippingOption option : finalShippingOptions) {
+
+ //transform to Quote
+ Quote q = new Quote();
+ q.setCartId(shoppingCartId);
+ q.setDelivery(delivery);
+ if(!StringUtils.isBlank(option.getEstimatedNumberOfDays())) {
+ try {
+ q.setEstimatedNumberOfDays(new Integer(option.getEstimatedNumberOfDays()));
+ } catch(Exception e) {
+ LOGGER.error("Cannot cast to integer " + option.getEstimatedNumberOfDays());
+ }
+ }
+
+ if(freeShipping) {
+ q.setFreeShipping(true);
+ q.setPrice(new BigDecimal(0));
+ q.setModule("FREE");
+ q.setOptionCode("FREE");
+ q.setOptionName("FREE");
+ } else {
+ q.setModule(option.getShippingModuleCode());
+ q.setOptionCode(option.getOptionCode());
+ if(!StringUtils.isBlank(option.getOptionDeliveryDate())) {
+ try {
+ q.setOptionDeliveryDate(DateUtil.formatDate(option.getOptionDeliveryDate()));
+ } catch(Exception e) {
+ LOGGER.error("Cannot transform to date " + option.getOptionDeliveryDate());
+ }
+ }
+ q.setOptionName(option.getOptionName());
+ q.setOptionShippingDate(new Date());
+ q.setPrice(option.getOptionPrice());
+
+ }
+
+ if(handlingFees != null) {
+ q.setHandling(handlingFees);
+ }
+
+ q.setQuoteDate(new Date());
+ shippingQuoteService.save(q);
+ option.setShippingQuoteOptionId(q.getId());
+
+ }
+
+
+
+ } catch (Exception e) {
+ LOGGER.error(e.getMessage(), e);
+ throw new ServiceException(e);
+ }
+
+ return shippingQuote;
+
+ }
+
+ @Override
+ public List<String> getSupportedCountries(MerchantStore store) throws ServiceException {
+
+ List<String> supportedCountries = new ArrayList<String>();
+ MerchantConfiguration configuration = merchantConfigurationService.getMerchantConfiguration(SUPPORTED_COUNTRIES, store);
+
+ if(configuration!=null) {
+
+ String countries = configuration.getValue();
+ if(!StringUtils.isBlank(countries)) {
+
+ Object objRegions=JSONValue.parse(countries);
+ JSONArray arrayRegions=(JSONArray)objRegions;
+ @SuppressWarnings("rawtypes")
+ Iterator i = arrayRegions.iterator();
+ while(i.hasNext()) {
+ supportedCountries.add((String)i.next());
+ }
+ }
+
+ }
+
+ return supportedCountries;
+ }
+
+ @Override
+ public List<Country> getShipToCountryList(MerchantStore store, Language language) throws ServiceException {
+
+
+ ShippingConfiguration shippingConfiguration = getShippingConfiguration(store);
+ ShippingType shippingType = ShippingType.INTERNATIONAL;
+ List<String> supportedCountries = new ArrayList<String>();
+ if(shippingConfiguration==null) {
+ shippingConfiguration = new ShippingConfiguration();
+ }
+
+ if(shippingConfiguration.getShippingType()!=null) {
+ shippingType = shippingConfiguration.getShippingType();
+ }
+
+
+ if(shippingType.name().equals(ShippingType.NATIONAL.name())){
+
+ supportedCountries.add(store.getCountry().getIsoCode());
+
+ } else {
+
+ MerchantConfiguration configuration = merchantConfigurationService.getMerchantConfiguration(SUPPORTED_COUNTRIES, store);
+
+ if(configuration!=null) {
+
+ String countries = configuration.getValue();
+ if(!StringUtils.isBlank(countries)) {
+
+ Object objRegions=JSONValue.parse(countries);
+ JSONArray arrayRegions=(JSONArray)objRegions;
+ @SuppressWarnings("rawtypes")
+ Iterator i = arrayRegions.iterator();
+ while(i.hasNext()) {
+ supportedCountries.add((String)i.next());
+ }
+ }
+
+ }
+
+ }
+
+ return countryService.getCountries(supportedCountries, language);
+
+ }
+
+
+ @Override
+ public void setSupportedCountries(MerchantStore store, List<String> countryCodes) throws ServiceException {
+
+
+ //transform a list of string to json entry
+ ObjectMapper mapper = new ObjectMapper();
+
+ try {
+ String value = mapper.writeValueAsString(countryCodes);
+
+ MerchantConfiguration configuration = merchantConfigurationService.getMerchantConfiguration(SUPPORTED_COUNTRIES, store);
+
+ if(configuration==null) {
+ configuration = new MerchantConfiguration();
+ configuration.
+ setKey(SUPPORTED_COUNTRIES);
+ configuration.setMerchantStore(store);
+ }
+
+ configuration.setValue(value);
+
+ merchantConfigurationService.saveOrUpdate(configuration);
+
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ }
+
+ }
+
+
+ private BigDecimal calculateOrderTotal(List<ShippingProduct> products, MerchantStore store) throws Exception {
+
+ BigDecimal total = new BigDecimal(0);
+ for(ShippingProduct shippingProduct : products) {
+ BigDecimal currentPrice = shippingProduct.getFinalPrice().getFinalPrice();
+ currentPrice = currentPrice.multiply(new BigDecimal(shippingProduct.getQuantity()));
+ total = total.add(currentPrice);
+ }
+
+
+ return total;
+
+
+ }
+
+ @Override
+ public List<PackageDetails> getPackagesDetails(
+ List<ShippingProduct> products, MerchantStore store)
+ throws ServiceException {
+
+ List<PackageDetails> packages = null;
+
+ ShippingConfiguration shippingConfiguration = this.getShippingConfiguration(store);
+ //determine if the system has to use BOX or ITEM
+ ShippingPackageType shippingPackageType = ShippingPackageType.ITEM;
+ if(shippingConfiguration!=null) {
+ shippingPackageType = shippingConfiguration.getShippingPackageType();
+ }
+
+ if(shippingPackageType.name().equals(ShippingPackageType.BOX.name())){
+ packages = packaging.getBoxPackagesDetails(products, store);
+ } else {
+ packages = packaging.getItemPackagesDetails(products, store);
+ }
+
+ return packages;
+
+ }
+
+ @Override
+ public boolean requiresShipping(List<ShoppingCartItem> items,
+ MerchantStore store) throws ServiceException {
+
+ boolean requiresShipping = false;
+ for(ShoppingCartItem item : items) {
+ Product product = item.getProduct();
+ if(!product.isProductVirtual() && product.isProductShipeable()) {
+ requiresShipping = true;
+ }
+ }
+
+ return requiresShipping;
+ }
+
+ @Override
+ public ShippingMetaData getShippingMetaData(MerchantStore store)
+ throws ServiceException {
+
+ ShippingMetaData metaData = new ShippingMetaData();
+
+ // configured country
+ List<Country> countries = getShipToCountryList(store, store.getDefaultLanguage());
+ metaData.setShipToCountry(countries);
+
+ // configured modules
+ Map<String,IntegrationConfiguration> modules = getShippingModulesConfigured(store);
+ List<String> moduleKeys = new ArrayList<String>();
+ if(modules!=null) {
+ for(String key : modules.keySet()) {
+ moduleKeys.add(key);
+ }
+ }
+ metaData.setModules(moduleKeys);
+
+ // pre processors
+ List<ShippingQuotePrePostProcessModule> preProcessors = this.shippingModulePreProcessors;
+ List<String> preProcessorKeys = new ArrayList<String>();
+ if(preProcessors!=null) {
+ for(ShippingQuotePrePostProcessModule processor : preProcessors) {
+ preProcessorKeys.add(processor.getModuleCode());
+ if(SHIPPING_DISTANCE.equals(processor.getModuleCode())) {
+ metaData.setUseDistanceModule(true);
+ }
+ }
+ }
+ metaData.setPreProcessors(preProcessorKeys);
+
+ //post processors
+ List<ShippingQuotePrePostProcessModule> postProcessors = this.shippingModulePostProcessors;
+ List<String> postProcessorKeys = new ArrayList<String>();
+ if(postProcessors!=null) {
+ for(ShippingQuotePrePostProcessModule processor : postProcessors) {
+ postProcessorKeys.add(processor.getModuleCode());
+ }
+ }
+ metaData.setPostProcessors(postProcessorKeys);
+
+
+ return metaData;
+ }
+
+ @Override
+ public boolean hasTaxOnShipping(MerchantStore store) throws ServiceException {
+ ShippingConfiguration shippingConfiguration = getShippingConfiguration(store);
+ return shippingConfiguration.isTaxOnShipping();
+ }
}
\ No newline at end of file
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/shoppingcart/ShoppingCartCalculationService.java b/sm-core/src/main/java/com/salesmanager/core/business/services/shoppingcart/ShoppingCartCalculationService.java
index a4fcb01..08dd5b6 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/shoppingcart/ShoppingCartCalculationService.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/shoppingcart/ShoppingCartCalculationService.java
@@ -1,48 +1,48 @@
-/**
- *
- */
-package com.salesmanager.core.business.services.shoppingcart;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.OrderTotalSummary;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.shoppingcart.ShoppingCart;
-
-/**
- * Interface declaring various methods used to calculate {@link ShoppingCart}
- * object details.
- *
- * @author Umesh Awasthi
- * @since 1.2
- *
- */
-public interface ShoppingCartCalculationService {
- /**
- * Method which will be used to calculate price for each line items as well
- * Total and Sub-total for {@link ShoppingCart}.
- *
- * @param cartModel
- * ShoopingCart mode representing underlying DB object
- * @param customer
- * @param store
- * @param language
- * @throws ServiceException
- */
- public OrderTotalSummary calculate(final ShoppingCart cartModel, final Customer customer, final MerchantStore store,
- final Language language) throws ServiceException;
-
- /**
- * Method which will be used to calculate price for each line items as well
- * Total and Sub-total for {@link ShoppingCart}.
- *
- * @param cartModel
- * ShoopingCart mode representing underlying DB object
- * @param store
- * @param language
- * @throws ServiceException
- */
- public OrderTotalSummary calculate(final ShoppingCart cartModel, final MerchantStore store, final Language language)
- throws ServiceException;
-}
+/**
+ *
+ */
+package com.salesmanager.core.business.services.shoppingcart;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.OrderTotalSummary;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.shoppingcart.ShoppingCart;
+
+/**
+ * Interface declaring various methods used to calculate {@link ShoppingCart}
+ * object details.
+ *
+ * @author Umesh Awasthi
+ * @since 1.2
+ *
+ */
+public interface ShoppingCartCalculationService {
+ /**
+ * Method which will be used to calculate price for each line items as well
+ * Total and Sub-total for {@link ShoppingCart}.
+ *
+ * @param cartModel
+ * ShoopingCart mode representing underlying DB object
+ * @param customer
+ * @param store
+ * @param language
+ * @throws ServiceException
+ */
+ public OrderTotalSummary calculate(final ShoppingCart cartModel, final Customer customer, final MerchantStore store,
+ final Language language) throws ServiceException;
+
+ /**
+ * Method which will be used to calculate price for each line items as well
+ * Total and Sub-total for {@link ShoppingCart}.
+ *
+ * @param cartModel
+ * ShoopingCart mode representing underlying DB object
+ * @param store
+ * @param language
+ * @throws ServiceException
+ */
+ public OrderTotalSummary calculate(final ShoppingCart cartModel, final MerchantStore store, final Language language)
+ throws ServiceException;
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/shoppingcart/ShoppingCartCalculationServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/shoppingcart/ShoppingCartCalculationServiceImpl.java
index 65ef12f..9f5df77 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/shoppingcart/ShoppingCartCalculationServiceImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/shoppingcart/ShoppingCartCalculationServiceImpl.java
@@ -1,121 +1,121 @@
-/**
- *
- */
-package com.salesmanager.core.business.services.shoppingcart;
-
-import javax.inject.Inject;
-
-import org.apache.commons.lang3.Validate;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.order.OrderService;
-import com.salesmanager.core.business.services.order.OrderServiceImpl;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.OrderTotalSummary;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.shoppingcart.ShoppingCart;
-import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
-
-/**
- * <p>
- * Implementation class responsible for calculating state of shopping cart. This
- * class will take care of calculating price of each line items of shopping cart
- * as well any discount including sub-total and total amount.
- * </p>
- *
- * @author Umesh Awasthi
- * @version 1.2
- */
-@Service("shoppingCartCalculationService")
-public class ShoppingCartCalculationServiceImpl implements ShoppingCartCalculationService {
-
- protected final Logger LOG = LoggerFactory.getLogger(getClass());
-
- @Inject
- private ShoppingCartService shoppingCartService;
-
- @Inject
- private OrderService orderService;
-
- /**
- * <p>
- * Method used to recalculate state of shopping cart every time any change
- * has been made to underlying {@link ShoppingCart} object in DB.
- * </p>
- * Following operations will be performed by this method.
- *
- * <li>Calculate price for each {@link ShoppingCartItem} and update it.</li>
- * <p>
- * This method is backbone method for all price calculation related to
- * shopping cart.
- * </p>
- *
- * @see OrderServiceImpl
- *
- * @param cartModel
- * @param customer
- * @param store
- * @param language
- * @throws ServiceException
- */
- @Override
- public OrderTotalSummary calculate(final ShoppingCart cartModel, final Customer customer, final MerchantStore store,
- final Language language) throws ServiceException {
-
- Validate.notNull(cartModel, "cart cannot be null");
- Validate.notNull(cartModel.getLineItems(), "Cart should have line items.");
- Validate.notNull(store, "MerchantStore cannot be null");
- Validate.notNull(customer, "Customer cannot be null");
- OrderTotalSummary orderTotalSummary = orderService.calculateShoppingCartTotal(cartModel, customer, store,
- language);
- updateCartModel(cartModel);
- return orderTotalSummary;
-
- }
-
- /**
- * <p>
- * Method used to recalculate state of shopping cart every time any change
- * has been made to underlying {@link ShoppingCart} object in DB.
- * </p>
- * Following operations will be performed by this method.
- *
- * <li>Calculate price for each {@link ShoppingCartItem} and update it.</li>
- * <p>
- * This method is backbone method for all price calculation related to
- * shopping cart.
- * </p>
- *
- * @see OrderServiceImpl
- *
- * @param cartModel
- * @param store
- * @param language
- * @throws ServiceException
- */
- @Override
- public OrderTotalSummary calculate(final ShoppingCart cartModel, final MerchantStore store, final Language language)
- throws ServiceException {
-
- Validate.notNull(cartModel, "cart cannot be null");
- Validate.notNull(cartModel.getLineItems(), "Cart should have line items.");
- Validate.notNull(store, "MerchantStore cannot be null");
- OrderTotalSummary orderTotalSummary = orderService.calculateShoppingCartTotal(cartModel, store, language);
- updateCartModel(cartModel);
- return orderTotalSummary;
-
- }
-
- public ShoppingCartService getShoppingCartService() {
- return shoppingCartService;
- }
-
- private void updateCartModel(final ShoppingCart cartModel) throws ServiceException {
- shoppingCartService.saveOrUpdate(cartModel);
- }
-
-}
+/**
+ *
+ */
+package com.salesmanager.core.business.services.shoppingcart;
+
+import javax.inject.Inject;
+
+import org.apache.commons.lang3.Validate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.order.OrderService;
+import com.salesmanager.core.business.services.order.OrderServiceImpl;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.OrderTotalSummary;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.shoppingcart.ShoppingCart;
+import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
+
+/**
+ * <p>
+ * Implementation class responsible for calculating state of shopping cart. This
+ * class will take care of calculating price of each line items of shopping cart
+ * as well any discount including sub-total and total amount.
+ * </p>
+ *
+ * @author Umesh Awasthi
+ * @version 1.2
+ */
+@Service("shoppingCartCalculationService")
+public class ShoppingCartCalculationServiceImpl implements ShoppingCartCalculationService {
+
+ protected final Logger LOG = LoggerFactory.getLogger(getClass());
+
+ @Inject
+ private ShoppingCartService shoppingCartService;
+
+ @Inject
+ private OrderService orderService;
+
+ /**
+ * <p>
+ * Method used to recalculate state of shopping cart every time any change
+ * has been made to underlying {@link ShoppingCart} object in DB.
+ * </p>
+ * Following operations will be performed by this method.
+ *
+ * <li>Calculate price for each {@link ShoppingCartItem} and update it.</li>
+ * <p>
+ * This method is backbone method for all price calculation related to
+ * shopping cart.
+ * </p>
+ *
+ * @see OrderServiceImpl
+ *
+ * @param cartModel
+ * @param customer
+ * @param store
+ * @param language
+ * @throws ServiceException
+ */
+ @Override
+ public OrderTotalSummary calculate(final ShoppingCart cartModel, final Customer customer, final MerchantStore store,
+ final Language language) throws ServiceException {
+
+ Validate.notNull(cartModel, "cart cannot be null");
+ Validate.notNull(cartModel.getLineItems(), "Cart should have line items.");
+ Validate.notNull(store, "MerchantStore cannot be null");
+ Validate.notNull(customer, "Customer cannot be null");
+ OrderTotalSummary orderTotalSummary = orderService.calculateShoppingCartTotal(cartModel, customer, store,
+ language);
+ updateCartModel(cartModel);
+ return orderTotalSummary;
+
+ }
+
+ /**
+ * <p>
+ * Method used to recalculate state of shopping cart every time any change
+ * has been made to underlying {@link ShoppingCart} object in DB.
+ * </p>
+ * Following operations will be performed by this method.
+ *
+ * <li>Calculate price for each {@link ShoppingCartItem} and update it.</li>
+ * <p>
+ * This method is backbone method for all price calculation related to
+ * shopping cart.
+ * </p>
+ *
+ * @see OrderServiceImpl
+ *
+ * @param cartModel
+ * @param store
+ * @param language
+ * @throws ServiceException
+ */
+ @Override
+ public OrderTotalSummary calculate(final ShoppingCart cartModel, final MerchantStore store, final Language language)
+ throws ServiceException {
+
+ Validate.notNull(cartModel, "cart cannot be null");
+ Validate.notNull(cartModel.getLineItems(), "Cart should have line items.");
+ Validate.notNull(store, "MerchantStore cannot be null");
+ OrderTotalSummary orderTotalSummary = orderService.calculateShoppingCartTotal(cartModel, store, language);
+ updateCartModel(cartModel);
+ return orderTotalSummary;
+
+ }
+
+ public ShoppingCartService getShoppingCartService() {
+ return shoppingCartService;
+ }
+
+ private void updateCartModel(final ShoppingCart cartModel) throws ServiceException {
+ shoppingCartService.saveOrUpdate(cartModel);
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/shoppingcart/ShoppingCartService.java b/sm-core/src/main/java/com/salesmanager/core/business/services/shoppingcart/ShoppingCartService.java
index 6abd683..879abfd 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/shoppingcart/ShoppingCartService.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/shoppingcart/ShoppingCartService.java
@@ -1,86 +1,86 @@
-package com.salesmanager.core.business.services.shoppingcart;
-
-import java.util.List;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.common.generic.SalesManagerEntityService;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.shipping.ShippingProduct;
-import com.salesmanager.core.model.shoppingcart.ShoppingCart;
-import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
-
-public interface ShoppingCartService extends SalesManagerEntityService<Long, ShoppingCart> {
-
- ShoppingCart getShoppingCart(Customer customer) throws ServiceException;
-
- void saveOrUpdate(ShoppingCart shoppingCart) throws ServiceException;
-
- ShoppingCart getById(Long id, MerchantStore store) throws ServiceException;
-
- ShoppingCart getByCode(String code, MerchantStore store) throws ServiceException;
-
- ShoppingCart getByCustomer(Customer customer) throws ServiceException;
-
- /**
- * Creates a list of ShippingProduct based on the ShoppingCart if items are
- * virtual return list will be null
- *
- * @param cart
- * @return
- * @throws ServiceException
- */
- List<ShippingProduct> createShippingProduct(ShoppingCart cart) throws ServiceException;
-
- /**
- * Looks if the items in the ShoppingCart are free of charges
- *
- * @param cart
- * @return
- * @throws ServiceException
- */
- boolean isFreeShoppingCart(ShoppingCart cart) throws ServiceException;
-
- boolean isFreeShoppingCart(List<ShoppingCartItem> items) throws ServiceException;
-
- /**
- * Populates a ShoppingCartItem from a Product and attributes if any
- *
- * @param product
- * @return
- * @throws ServiceException
- */
- ShoppingCartItem populateShoppingCartItem(Product product) throws ServiceException;
-
- void deleteCart(ShoppingCart cart) throws ServiceException;
-
- void removeShoppingCart(ShoppingCart cart) throws ServiceException;
-
- /**
- *
- * @param userShoppingModel
- * @param sessionCart
- * @param store
- * @return {@link ShoppingCart} merged Shopping Cart
- * @throws Exception
- */
- public ShoppingCart mergeShoppingCarts(final ShoppingCart userShoppingCart, final ShoppingCart sessionCart,
- final MerchantStore store) throws Exception;
-
- /**
- * Determines if the shopping cart requires shipping
- *
- * @param cart
- * @return
- * @throws ServiceException
- */
- boolean requiresShipping(ShoppingCart cart) throws ServiceException;
-
- /**
- * Removes a shopping cart item
- * @param item
- */
- void deleteShoppingCartItem(Long id);
-
+package com.salesmanager.core.business.services.shoppingcart;
+
+import java.util.List;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.common.generic.SalesManagerEntityService;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.shipping.ShippingProduct;
+import com.salesmanager.core.model.shoppingcart.ShoppingCart;
+import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
+
+public interface ShoppingCartService extends SalesManagerEntityService<Long, ShoppingCart> {
+
+ ShoppingCart getShoppingCart(Customer customer) throws ServiceException;
+
+ void saveOrUpdate(ShoppingCart shoppingCart) throws ServiceException;
+
+ ShoppingCart getById(Long id, MerchantStore store) throws ServiceException;
+
+ ShoppingCart getByCode(String code, MerchantStore store) throws ServiceException;
+
+ ShoppingCart getByCustomer(Customer customer) throws ServiceException;
+
+ /**
+ * Creates a list of ShippingProduct based on the ShoppingCart if items are
+ * virtual return list will be null
+ *
+ * @param cart
+ * @return
+ * @throws ServiceException
+ */
+ List<ShippingProduct> createShippingProduct(ShoppingCart cart) throws ServiceException;
+
+ /**
+ * Looks if the items in the ShoppingCart are free of charges
+ *
+ * @param cart
+ * @return
+ * @throws ServiceException
+ */
+ boolean isFreeShoppingCart(ShoppingCart cart) throws ServiceException;
+
+ boolean isFreeShoppingCart(List<ShoppingCartItem> items) throws ServiceException;
+
+ /**
+ * Populates a ShoppingCartItem from a Product and attributes if any
+ *
+ * @param product
+ * @return
+ * @throws ServiceException
+ */
+ ShoppingCartItem populateShoppingCartItem(Product product) throws ServiceException;
+
+ void deleteCart(ShoppingCart cart) throws ServiceException;
+
+ void removeShoppingCart(ShoppingCart cart) throws ServiceException;
+
+ /**
+ *
+ * @param userShoppingModel
+ * @param sessionCart
+ * @param store
+ * @return {@link ShoppingCart} merged Shopping Cart
+ * @throws Exception
+ */
+ public ShoppingCart mergeShoppingCarts(final ShoppingCart userShoppingCart, final ShoppingCart sessionCart,
+ final MerchantStore store) throws Exception;
+
+ /**
+ * Determines if the shopping cart requires shipping
+ *
+ * @param cart
+ * @return
+ * @throws ServiceException
+ */
+ boolean requiresShipping(ShoppingCart cart) throws ServiceException;
+
+ /**
+ * Removes a shopping cart item
+ * @param item
+ */
+ void deleteShoppingCartItem(Long id);
+
}
\ No newline at end of file
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/shoppingcart/ShoppingCartServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/shoppingcart/ShoppingCartServiceImpl.java
index 8066a52..7a79cea 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/shoppingcart/ShoppingCartServiceImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/shoppingcart/ShoppingCartServiceImpl.java
@@ -1,556 +1,556 @@
-package com.salesmanager.core.business.services.shoppingcart;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.repositories.shoppingcart.ShoppingCartAttributeRepository;
-import com.salesmanager.core.business.repositories.shoppingcart.ShoppingCartItemRepository;
-import com.salesmanager.core.business.repositories.shoppingcart.ShoppingCartRepository;
-import com.salesmanager.core.business.services.catalog.product.PricingService;
-import com.salesmanager.core.business.services.catalog.product.ProductService;
-import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
-import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
-import com.salesmanager.core.model.catalog.product.price.FinalPrice;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.shipping.ShippingProduct;
-import com.salesmanager.core.model.shoppingcart.ShoppingCart;
-import com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem;
-import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.Validate;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.inject.Inject;
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-@Service("shoppingCartService")
-public class ShoppingCartServiceImpl extends SalesManagerEntityServiceImpl<Long, ShoppingCart>
- implements ShoppingCartService {
-
- private ShoppingCartRepository shoppingCartRepository;
-
- @Inject
- private ProductService productService;
-
- @Inject
- private ShoppingCartItemRepository shoppingCartItemRepository;
-
- @Inject
- private ShoppingCartAttributeRepository shoppingCartAttributeItemRepository;
-
- @Inject
- private PricingService pricingService;
-
- @Inject
- private ProductAttributeService productAttributeService;
-
-
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ShoppingCartServiceImpl.class);
-
- @Inject
- public ShoppingCartServiceImpl(ShoppingCartRepository shoppingCartRepository) {
- super(shoppingCartRepository);
- this.shoppingCartRepository = shoppingCartRepository;
-
- }
-
- /**
- * Retrieve a {@link ShoppingCart} cart for a given customer
- */
- @Override
- @Transactional
- public ShoppingCart getShoppingCart(final Customer customer) throws ServiceException {
-
- try {
-
- ShoppingCart shoppingCart = shoppingCartRepository.findByCustomer(customer.getId());
- getPopulatedShoppingCart(shoppingCart);
- if (shoppingCart != null && shoppingCart.isObsolete()) {
- delete(shoppingCart);
- return null;
- } else {
- return shoppingCart;
- }
-
- } catch (Exception e) {
- throw new ServiceException(e);
- }
-
- }
-
- /**
- * Save or update a {@link ShoppingCart} for a given customer
- */
- @Override
- public void saveOrUpdate(final ShoppingCart shoppingCart) throws ServiceException {
- if (shoppingCart.getId() == null || shoppingCart.getId().longValue() == 0) {
- super.create(shoppingCart);
- } else {
- super.update(shoppingCart);
- }
- }
-
- /**
- * Get a {@link ShoppingCart} for a given id and MerchantStore. Will update
- * the shopping cart prices and items based on the actual inventory. This
- * method will remove the shopping cart if no items are attached.
- */
- @Override
- @Transactional
- public ShoppingCart getById(final Long id, final MerchantStore store) throws ServiceException {
-
- try {
- ShoppingCart shoppingCart = shoppingCartRepository.findById(store.getId(), id);
- if (shoppingCart == null) {
- return null;
- }
- getPopulatedShoppingCart(shoppingCart);
-
- if (shoppingCart.isObsolete()) {
- delete(shoppingCart);
- return null;
- } else {
- return shoppingCart;
- }
-
- } catch (Exception e) {
- throw new ServiceException(e);
- }
-
- }
-
- /**
- * Get a {@link ShoppingCart} for a given id. Will update the shopping cart
- * prices and items based on the actual inventory. This method will remove
- * the shopping cart if no items are attached.
- */
- @Override
- @Transactional
- public ShoppingCart getById(final Long id) {
-
- try {
- ShoppingCart shoppingCart = shoppingCartRepository.findOne(id);
- if (shoppingCart == null) {
- return null;
- }
- getPopulatedShoppingCart(shoppingCart);
-
- if (shoppingCart.isObsolete()) {
- delete(shoppingCart);
- return null;
- } else {
- return shoppingCart;
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return null;
-
- }
-
- /**
- * Get a {@link ShoppingCart} for a given code. Will update the shopping
- * cart prices and items based on the actual inventory. This method will
- * remove the shopping cart if no items are attached.
- */
- @Override
- @Transactional
- public ShoppingCart getByCode(final String code, final MerchantStore store) throws ServiceException {
-
- try {
- ShoppingCart shoppingCart = shoppingCartRepository.findByCode(store.getId(), code);
- if (shoppingCart == null) {
- return null;
- }
- getPopulatedShoppingCart(shoppingCart);
-
- if (shoppingCart.isObsolete()) {
- delete(shoppingCart);
- return null;
- } else {
- return shoppingCart;
- }
-
- } catch (javax.persistence.NoResultException nre) {
- return null;
- } catch (RuntimeException e) {
- throw new ServiceException(e);
- } catch (Exception ee) {
- throw new ServiceException(ee);
- } catch (Throwable t) {
- throw new ServiceException(t);
- }
-
- }
-
- @Override
- public void deleteCart(final ShoppingCart shoppingCart) throws ServiceException {
- ShoppingCart cart = this.getById(shoppingCart.getId());
- if (cart != null) {
- super.delete(cart);
- }
- }
-
- @Override
- @Transactional
- public ShoppingCart getByCustomer(final Customer customer) throws ServiceException {
-
- try {
- ShoppingCart shoppingCart = shoppingCartRepository.findByCustomer(customer.getId());
- if (shoppingCart == null) {
- return null;
- }
- return getPopulatedShoppingCart(shoppingCart);
-
- } catch (Exception e) {
- throw new ServiceException(e);
- }
- }
-
- @Transactional(noRollbackFor = { org.springframework.dao.EmptyResultDataAccessException.class })
- private ShoppingCart getPopulatedShoppingCart(final ShoppingCart shoppingCart) throws Exception {
-
- try {
-
- boolean cartIsObsolete = false;
- if (shoppingCart != null) {
-
- Set<ShoppingCartItem> items = shoppingCart.getLineItems();
- if (items == null || items.size() == 0) {
- shoppingCart.setObsolete(true);
- return shoppingCart;
-
- }
-
- // Set<ShoppingCartItem> shoppingCartItems = new
- // HashSet<ShoppingCartItem>();
- for (ShoppingCartItem item : items) {
- LOGGER.debug("Populate item " + item.getId());
- getPopulatedItem(item);
- LOGGER.debug("Obsolete item ? " + item.isObsolete());
- if (item.isObsolete()) {
- cartIsObsolete = true;
- }
- }
-
- // shoppingCart.setLineItems(shoppingCartItems);
- boolean refreshCart = false;
- Set<ShoppingCartItem> refreshedItems = new HashSet<ShoppingCartItem>();
- for (ShoppingCartItem item : items) {
-/* if (!item.isObsolete()) {
- refreshedItems.add(item);
- } else {
- refreshCart = true;
- }*/
- refreshedItems.add(item);
- }
-
- //if (refreshCart) {
- shoppingCart.setLineItems(refreshedItems);
- update(shoppingCart);
- //}
-
- if (cartIsObsolete) {
- shoppingCart.setObsolete(true);
- }
- return shoppingCart;
- }
-
- } catch (Exception e) {
- LOGGER.error(e.getMessage());
- throw new ServiceException(e);
- }
-
- return shoppingCart;
-
- }
-
- @Override
- public ShoppingCartItem populateShoppingCartItem(final Product product) throws ServiceException {
- Validate.notNull(product, "Product should not be null");
- Validate.notNull(product.getMerchantStore(), "Product.merchantStore should not be null");
-
- ShoppingCartItem item = new ShoppingCartItem(product);
-
- // Set<ProductAttribute> productAttributes = product.getAttributes();
- // Set<ShoppingCartAttributeItem> attributesList = new
- // HashSet<ShoppingCartAttributeItem>();
- // if(!CollectionUtils.isEmpty(productAttributes)) {
-
- // for(ProductAttribute productAttribute : productAttributes) {
- // ShoppingCartAttributeItem attributeItem = new
- // ShoppingCartAttributeItem();
- // attributeItem.setShoppingCartItem(item);
- // attributeItem.setProductAttribute(productAttribute);
- // attributeItem.setProductAttributeId(productAttribute.getId());
- // attributesList.add(attributeItem);
-
- // }
-
- // item.setAttributes(attributesList);
- // }
-
- item.setProductVirtual(product.isProductVirtual());
-
- // set item price
- FinalPrice price = pricingService.calculateProductPrice(product);
- item.setItemPrice(price.getFinalPrice());
- return item;
-
- }
-
- @Transactional
- private void getPopulatedItem(final ShoppingCartItem item) throws Exception {
-
- Product product = null;
-
- Long productId = item.getProductId();
- product = productService.getById(productId);
-
- if (product == null) {
- item.setObsolete(true);
- return;
- }
-
- item.setProduct(product);
-
- if (product.isProductVirtual()) {
- item.setProductVirtual(true);
- }
-
- Set<ShoppingCartAttributeItem> cartAttributes = item.getAttributes();
- Set<ProductAttribute> productAttributes = product.getAttributes();
- List<ProductAttribute> attributesList = new ArrayList<ProductAttribute>();//attributes maintained
- List<ShoppingCartAttributeItem> removeAttributesList = new ArrayList<ShoppingCartAttributeItem>();//attributes to remove
- //DELETE ORPHEANS MANUALLY
- if ( (productAttributes != null && productAttributes.size() > 0) || (cartAttributes != null && cartAttributes.size() > 0)) {
- for (ShoppingCartAttributeItem attribute : cartAttributes) {
- long attributeId = attribute.getProductAttributeId().longValue();
- boolean existingAttribute = false;
- for (ProductAttribute productAttribute : productAttributes) {
-
- if (productAttribute.getId().longValue() == attributeId) {
- attribute.setProductAttribute(productAttribute);
- attributesList.add(productAttribute);
- existingAttribute = true;
- break;
- }
- }
-
- if(!existingAttribute) {
- removeAttributesList.add(attribute);
- }
-
- }
- }
-
- //cleanup orphean item
- if(CollectionUtils.isNotEmpty(removeAttributesList)) {
- for(ShoppingCartAttributeItem attr : removeAttributesList) {
- shoppingCartAttributeItemRepository.delete(attr);
- }
- }
-
- //cleanup detached attributes
- if(CollectionUtils.isEmpty(attributesList)) {
- item.setAttributes(null);
- }
-
-
-
- // set item price
- FinalPrice price = pricingService.calculateProductPrice(product, attributesList);
- item.setItemPrice(price.getFinalPrice());
- item.setFinalPrice(price);
-
- BigDecimal subTotal = item.getItemPrice().multiply(new BigDecimal(item.getQuantity().intValue()));
- item.setSubTotal(subTotal);
-
- }
-
- @Override
- public List<ShippingProduct> createShippingProduct(final ShoppingCart cart) throws ServiceException {
- /**
- * Determines if products are virtual
- */
- Set<ShoppingCartItem> items = cart.getLineItems();
- List<ShippingProduct> shippingProducts = null;
- for (ShoppingCartItem item : items) {
- Product product = item.getProduct();
- if (!product.isProductVirtual() && product.isProductShipeable()) {
- if (shippingProducts == null) {
- shippingProducts = new ArrayList<ShippingProduct>();
- }
- ShippingProduct shippingProduct = new ShippingProduct(product);
- shippingProduct.setQuantity(item.getQuantity());
- shippingProduct.setFinalPrice(item.getFinalPrice());
- shippingProducts.add(shippingProduct);
- }
- }
-
- return shippingProducts;
-
- }
-
- @Override
- public boolean isFreeShoppingCart(final ShoppingCart cart) throws ServiceException {
- /**
- * Determines if products are free
- */
- Set<ShoppingCartItem> items = cart.getLineItems();
- for (ShoppingCartItem item : items) {
- Product product = item.getProduct();
- FinalPrice finalPrice = pricingService.calculateProductPrice(product);
- if (finalPrice.getFinalPrice().longValue() > 0) {
- return false;
- }
- }
-
- return true;
-
- }
-
- @Override
- public boolean requiresShipping(final ShoppingCart cart) throws ServiceException {
-
- Validate.notNull(cart, "Shopping cart cannot be null");
- Validate.notNull(cart.getLineItems(), "ShoppingCart items cannot be null");
- boolean requiresShipping = false;
- for (ShoppingCartItem item : cart.getLineItems()) {
- Product product = item.getProduct();
- if (product.isProductShipeable()) {
- requiresShipping = true;
- break;
- }
- }
-
- return requiresShipping;
-
- }
-
- @Override
- public void removeShoppingCart(final ShoppingCart cart) throws ServiceException {
- shoppingCartRepository.delete(cart);
- }
-
- @Override
- public ShoppingCart mergeShoppingCarts(final ShoppingCart userShoppingModel, final ShoppingCart sessionCart,
- final MerchantStore store) throws Exception {
- if (sessionCart.getCustomerId() != null && sessionCart.getCustomerId() == userShoppingModel.getCustomerId()) {
- LOGGER.info("Session Shopping cart belongs to same logged in user");
- if (CollectionUtils.isNotEmpty(userShoppingModel.getLineItems())
- && CollectionUtils.isNotEmpty(sessionCart.getLineItems())) {
- return userShoppingModel;
- }
- }
-
- LOGGER.info("Starting merging shopping carts");
- if (CollectionUtils.isNotEmpty(sessionCart.getLineItems())) {
- Set<ShoppingCartItem> shoppingCartItemsSet = getShoppingCartItems(sessionCart, store, userShoppingModel);
- boolean duplicateFound = false;
- if (CollectionUtils.isNotEmpty(shoppingCartItemsSet)) {
- for (ShoppingCartItem sessionShoppingCartItem : shoppingCartItemsSet) {
- if (CollectionUtils.isNotEmpty(userShoppingModel.getLineItems())) {
- for (ShoppingCartItem cartItem : userShoppingModel.getLineItems()) {
- if (cartItem.getProduct().getId().longValue() == sessionShoppingCartItem.getProduct()
- .getId().longValue()) {
- if (CollectionUtils.isNotEmpty(cartItem.getAttributes())) {
- if (!duplicateFound) {
- LOGGER.info("Dupliate item found..updating exisitng product quantity");
- cartItem.setQuantity(
- cartItem.getQuantity() + sessionShoppingCartItem.getQuantity());
- duplicateFound = true;
- break;
- }
- }
- }
- }
- }
- if (!duplicateFound) {
- LOGGER.info("New item found..adding item to Shopping cart");
- userShoppingModel.getLineItems().add(sessionShoppingCartItem);
- }
- }
-
- }
-
- }
- LOGGER.info("Shopping Cart merged successfully.....");
- saveOrUpdate(userShoppingModel);
- removeShoppingCart(sessionCart);
-
- return userShoppingModel;
- }
-
- private Set<ShoppingCartItem> getShoppingCartItems(final ShoppingCart sessionCart, final MerchantStore store,
- final ShoppingCart cartModel) throws Exception {
-
- Set<ShoppingCartItem> shoppingCartItemsSet = null;
- if (CollectionUtils.isNotEmpty(sessionCart.getLineItems())) {
- shoppingCartItemsSet = new HashSet<ShoppingCartItem>();
- for (ShoppingCartItem shoppingCartItem : sessionCart.getLineItems()) {
- Product product = productService.getById(shoppingCartItem.getProductId());
- if (product == null) {
- throw new Exception("Item with id " + shoppingCartItem.getProductId() + " does not exist");
- }
-
- if (product.getMerchantStore().getId().intValue() != store.getId().intValue()) {
- throw new Exception("Item with id " + shoppingCartItem.getProductId()
- + " does not belong to merchant " + store.getId());
- }
-
- ShoppingCartItem item = populateShoppingCartItem(product);
- item.setQuantity(shoppingCartItem.getQuantity());
- item.setShoppingCart(cartModel);
-
- List<ShoppingCartAttributeItem> cartAttributes = new ArrayList<ShoppingCartAttributeItem>(
- shoppingCartItem.getAttributes());
- if (CollectionUtils.isNotEmpty(cartAttributes)) {
- for (ShoppingCartAttributeItem shoppingCartAttributeItem : cartAttributes) {
- ProductAttribute productAttribute = productAttributeService
- .getById(shoppingCartAttributeItem.getId());
- if (productAttribute != null
- && productAttribute.getProduct().getId().longValue() == product.getId().longValue()) {
-
- ShoppingCartAttributeItem attributeItem = new ShoppingCartAttributeItem(item,
- productAttribute);
- if (shoppingCartAttributeItem.getId() > 0) {
- attributeItem.setId(shoppingCartAttributeItem.getId());
- }
- item.addAttributes(attributeItem);
-
- }
- }
- }
-
- shoppingCartItemsSet.add(item);
- }
-
- }
- return shoppingCartItemsSet;
- }
-
- @Override
- public boolean isFreeShoppingCart(List<ShoppingCartItem> items) throws ServiceException {
- ShoppingCart cart = new ShoppingCart();
- Set<ShoppingCartItem> cartItems = new HashSet<ShoppingCartItem>(items);
- cart.setLineItems(cartItems);
- return this.isFreeShoppingCart(cart);
- }
-
- @Override
- public void deleteShoppingCartItem(Long id) {
- shoppingCartItemRepository.delete(id);
- }
-
-}
+package com.salesmanager.core.business.services.shoppingcart;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.repositories.shoppingcart.ShoppingCartAttributeRepository;
+import com.salesmanager.core.business.repositories.shoppingcart.ShoppingCartItemRepository;
+import com.salesmanager.core.business.repositories.shoppingcart.ShoppingCartRepository;
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
+import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
+import com.salesmanager.core.model.catalog.product.price.FinalPrice;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.shipping.ShippingProduct;
+import com.salesmanager.core.model.shoppingcart.ShoppingCart;
+import com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem;
+import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.Validate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.inject.Inject;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+@Service("shoppingCartService")
+public class ShoppingCartServiceImpl extends SalesManagerEntityServiceImpl<Long, ShoppingCart>
+ implements ShoppingCartService {
+
+ private ShoppingCartRepository shoppingCartRepository;
+
+ @Inject
+ private ProductService productService;
+
+ @Inject
+ private ShoppingCartItemRepository shoppingCartItemRepository;
+
+ @Inject
+ private ShoppingCartAttributeRepository shoppingCartAttributeItemRepository;
+
+ @Inject
+ private PricingService pricingService;
+
+ @Inject
+ private ProductAttributeService productAttributeService;
+
+
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ShoppingCartServiceImpl.class);
+
+ @Inject
+ public ShoppingCartServiceImpl(ShoppingCartRepository shoppingCartRepository) {
+ super(shoppingCartRepository);
+ this.shoppingCartRepository = shoppingCartRepository;
+
+ }
+
+ /**
+ * Retrieve a {@link ShoppingCart} cart for a given customer
+ */
+ @Override
+ @Transactional
+ public ShoppingCart getShoppingCart(final Customer customer) throws ServiceException {
+
+ try {
+
+ ShoppingCart shoppingCart = shoppingCartRepository.findByCustomer(customer.getId());
+ getPopulatedShoppingCart(shoppingCart);
+ if (shoppingCart != null && shoppingCart.isObsolete()) {
+ delete(shoppingCart);
+ return null;
+ } else {
+ return shoppingCart;
+ }
+
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ }
+
+ }
+
+ /**
+ * Save or update a {@link ShoppingCart} for a given customer
+ */
+ @Override
+ public void saveOrUpdate(final ShoppingCart shoppingCart) throws ServiceException {
+ if (shoppingCart.getId() == null || shoppingCart.getId().longValue() == 0) {
+ super.create(shoppingCart);
+ } else {
+ super.update(shoppingCart);
+ }
+ }
+
+ /**
+ * Get a {@link ShoppingCart} for a given id and MerchantStore. Will update
+ * the shopping cart prices and items based on the actual inventory. This
+ * method will remove the shopping cart if no items are attached.
+ */
+ @Override
+ @Transactional
+ public ShoppingCart getById(final Long id, final MerchantStore store) throws ServiceException {
+
+ try {
+ ShoppingCart shoppingCart = shoppingCartRepository.findById(store.getId(), id);
+ if (shoppingCart == null) {
+ return null;
+ }
+ getPopulatedShoppingCart(shoppingCart);
+
+ if (shoppingCart.isObsolete()) {
+ delete(shoppingCart);
+ return null;
+ } else {
+ return shoppingCart;
+ }
+
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ }
+
+ }
+
+ /**
+ * Get a {@link ShoppingCart} for a given id. Will update the shopping cart
+ * prices and items based on the actual inventory. This method will remove
+ * the shopping cart if no items are attached.
+ */
+ @Override
+ @Transactional
+ public ShoppingCart getById(final Long id) {
+
+ try {
+ ShoppingCart shoppingCart = shoppingCartRepository.findOne(id);
+ if (shoppingCart == null) {
+ return null;
+ }
+ getPopulatedShoppingCart(shoppingCart);
+
+ if (shoppingCart.isObsolete()) {
+ delete(shoppingCart);
+ return null;
+ } else {
+ return shoppingCart;
+ }
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return null;
+
+ }
+
+ /**
+ * Get a {@link ShoppingCart} for a given code. Will update the shopping
+ * cart prices and items based on the actual inventory. This method will
+ * remove the shopping cart if no items are attached.
+ */
+ @Override
+ @Transactional
+ public ShoppingCart getByCode(final String code, final MerchantStore store) throws ServiceException {
+
+ try {
+ ShoppingCart shoppingCart = shoppingCartRepository.findByCode(store.getId(), code);
+ if (shoppingCart == null) {
+ return null;
+ }
+ getPopulatedShoppingCart(shoppingCart);
+
+ if (shoppingCart.isObsolete()) {
+ delete(shoppingCart);
+ return null;
+ } else {
+ return shoppingCart;
+ }
+
+ } catch (javax.persistence.NoResultException nre) {
+ return null;
+ } catch (RuntimeException e) {
+ throw new ServiceException(e);
+ } catch (Exception ee) {
+ throw new ServiceException(ee);
+ } catch (Throwable t) {
+ throw new ServiceException(t);
+ }
+
+ }
+
+ @Override
+ public void deleteCart(final ShoppingCart shoppingCart) throws ServiceException {
+ ShoppingCart cart = this.getById(shoppingCart.getId());
+ if (cart != null) {
+ super.delete(cart);
+ }
+ }
+
+ @Override
+ @Transactional
+ public ShoppingCart getByCustomer(final Customer customer) throws ServiceException {
+
+ try {
+ ShoppingCart shoppingCart = shoppingCartRepository.findByCustomer(customer.getId());
+ if (shoppingCart == null) {
+ return null;
+ }
+ return getPopulatedShoppingCart(shoppingCart);
+
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ }
+ }
+
+ @Transactional(noRollbackFor = { org.springframework.dao.EmptyResultDataAccessException.class })
+ private ShoppingCart getPopulatedShoppingCart(final ShoppingCart shoppingCart) throws Exception {
+
+ try {
+
+ boolean cartIsObsolete = false;
+ if (shoppingCart != null) {
+
+ Set<ShoppingCartItem> items = shoppingCart.getLineItems();
+ if (items == null || items.size() == 0) {
+ shoppingCart.setObsolete(true);
+ return shoppingCart;
+
+ }
+
+ // Set<ShoppingCartItem> shoppingCartItems = new
+ // HashSet<ShoppingCartItem>();
+ for (ShoppingCartItem item : items) {
+ LOGGER.debug("Populate item " + item.getId());
+ getPopulatedItem(item);
+ LOGGER.debug("Obsolete item ? " + item.isObsolete());
+ if (item.isObsolete()) {
+ cartIsObsolete = true;
+ }
+ }
+
+ // shoppingCart.setLineItems(shoppingCartItems);
+ boolean refreshCart = false;
+ Set<ShoppingCartItem> refreshedItems = new HashSet<ShoppingCartItem>();
+ for (ShoppingCartItem item : items) {
+/* if (!item.isObsolete()) {
+ refreshedItems.add(item);
+ } else {
+ refreshCart = true;
+ }*/
+ refreshedItems.add(item);
+ }
+
+ //if (refreshCart) {
+ shoppingCart.setLineItems(refreshedItems);
+ update(shoppingCart);
+ //}
+
+ if (cartIsObsolete) {
+ shoppingCart.setObsolete(true);
+ }
+ return shoppingCart;
+ }
+
+ } catch (Exception e) {
+ LOGGER.error(e.getMessage());
+ throw new ServiceException(e);
+ }
+
+ return shoppingCart;
+
+ }
+
+ @Override
+ public ShoppingCartItem populateShoppingCartItem(final Product product) throws ServiceException {
+ Validate.notNull(product, "Product should not be null");
+ Validate.notNull(product.getMerchantStore(), "Product.merchantStore should not be null");
+
+ ShoppingCartItem item = new ShoppingCartItem(product);
+
+ // Set<ProductAttribute> productAttributes = product.getAttributes();
+ // Set<ShoppingCartAttributeItem> attributesList = new
+ // HashSet<ShoppingCartAttributeItem>();
+ // if(!CollectionUtils.isEmpty(productAttributes)) {
+
+ // for(ProductAttribute productAttribute : productAttributes) {
+ // ShoppingCartAttributeItem attributeItem = new
+ // ShoppingCartAttributeItem();
+ // attributeItem.setShoppingCartItem(item);
+ // attributeItem.setProductAttribute(productAttribute);
+ // attributeItem.setProductAttributeId(productAttribute.getId());
+ // attributesList.add(attributeItem);
+
+ // }
+
+ // item.setAttributes(attributesList);
+ // }
+
+ item.setProductVirtual(product.isProductVirtual());
+
+ // set item price
+ FinalPrice price = pricingService.calculateProductPrice(product);
+ item.setItemPrice(price.getFinalPrice());
+ return item;
+
+ }
+
+ @Transactional
+ private void getPopulatedItem(final ShoppingCartItem item) throws Exception {
+
+ Product product = null;
+
+ Long productId = item.getProductId();
+ product = productService.getById(productId);
+
+ if (product == null) {
+ item.setObsolete(true);
+ return;
+ }
+
+ item.setProduct(product);
+
+ if (product.isProductVirtual()) {
+ item.setProductVirtual(true);
+ }
+
+ Set<ShoppingCartAttributeItem> cartAttributes = item.getAttributes();
+ Set<ProductAttribute> productAttributes = product.getAttributes();
+ List<ProductAttribute> attributesList = new ArrayList<ProductAttribute>();//attributes maintained
+ List<ShoppingCartAttributeItem> removeAttributesList = new ArrayList<ShoppingCartAttributeItem>();//attributes to remove
+ //DELETE ORPHEANS MANUALLY
+ if ( (productAttributes != null && productAttributes.size() > 0) || (cartAttributes != null && cartAttributes.size() > 0)) {
+ for (ShoppingCartAttributeItem attribute : cartAttributes) {
+ long attributeId = attribute.getProductAttributeId().longValue();
+ boolean existingAttribute = false;
+ for (ProductAttribute productAttribute : productAttributes) {
+
+ if (productAttribute.getId().longValue() == attributeId) {
+ attribute.setProductAttribute(productAttribute);
+ attributesList.add(productAttribute);
+ existingAttribute = true;
+ break;
+ }
+ }
+
+ if(!existingAttribute) {
+ removeAttributesList.add(attribute);
+ }
+
+ }
+ }
+
+ //cleanup orphean item
+ if(CollectionUtils.isNotEmpty(removeAttributesList)) {
+ for(ShoppingCartAttributeItem attr : removeAttributesList) {
+ shoppingCartAttributeItemRepository.delete(attr);
+ }
+ }
+
+ //cleanup detached attributes
+ if(CollectionUtils.isEmpty(attributesList)) {
+ item.setAttributes(null);
+ }
+
+
+
+ // set item price
+ FinalPrice price = pricingService.calculateProductPrice(product, attributesList);
+ item.setItemPrice(price.getFinalPrice());
+ item.setFinalPrice(price);
+
+ BigDecimal subTotal = item.getItemPrice().multiply(new BigDecimal(item.getQuantity().intValue()));
+ item.setSubTotal(subTotal);
+
+ }
+
+ @Override
+ public List<ShippingProduct> createShippingProduct(final ShoppingCart cart) throws ServiceException {
+ /**
+ * Determines if products are virtual
+ */
+ Set<ShoppingCartItem> items = cart.getLineItems();
+ List<ShippingProduct> shippingProducts = null;
+ for (ShoppingCartItem item : items) {
+ Product product = item.getProduct();
+ if (!product.isProductVirtual() && product.isProductShipeable()) {
+ if (shippingProducts == null) {
+ shippingProducts = new ArrayList<ShippingProduct>();
+ }
+ ShippingProduct shippingProduct = new ShippingProduct(product);
+ shippingProduct.setQuantity(item.getQuantity());
+ shippingProduct.setFinalPrice(item.getFinalPrice());
+ shippingProducts.add(shippingProduct);
+ }
+ }
+
+ return shippingProducts;
+
+ }
+
+ @Override
+ public boolean isFreeShoppingCart(final ShoppingCart cart) throws ServiceException {
+ /**
+ * Determines if products are free
+ */
+ Set<ShoppingCartItem> items = cart.getLineItems();
+ for (ShoppingCartItem item : items) {
+ Product product = item.getProduct();
+ FinalPrice finalPrice = pricingService.calculateProductPrice(product);
+ if (finalPrice.getFinalPrice().longValue() > 0) {
+ return false;
+ }
+ }
+
+ return true;
+
+ }
+
+ @Override
+ public boolean requiresShipping(final ShoppingCart cart) throws ServiceException {
+
+ Validate.notNull(cart, "Shopping cart cannot be null");
+ Validate.notNull(cart.getLineItems(), "ShoppingCart items cannot be null");
+ boolean requiresShipping = false;
+ for (ShoppingCartItem item : cart.getLineItems()) {
+ Product product = item.getProduct();
+ if (product.isProductShipeable()) {
+ requiresShipping = true;
+ break;
+ }
+ }
+
+ return requiresShipping;
+
+ }
+
+ @Override
+ public void removeShoppingCart(final ShoppingCart cart) throws ServiceException {
+ shoppingCartRepository.delete(cart);
+ }
+
+ @Override
+ public ShoppingCart mergeShoppingCarts(final ShoppingCart userShoppingModel, final ShoppingCart sessionCart,
+ final MerchantStore store) throws Exception {
+ if (sessionCart.getCustomerId() != null && sessionCart.getCustomerId() == userShoppingModel.getCustomerId()) {
+ LOGGER.info("Session Shopping cart belongs to same logged in user");
+ if (CollectionUtils.isNotEmpty(userShoppingModel.getLineItems())
+ && CollectionUtils.isNotEmpty(sessionCart.getLineItems())) {
+ return userShoppingModel;
+ }
+ }
+
+ LOGGER.info("Starting merging shopping carts");
+ if (CollectionUtils.isNotEmpty(sessionCart.getLineItems())) {
+ Set<ShoppingCartItem> shoppingCartItemsSet = getShoppingCartItems(sessionCart, store, userShoppingModel);
+ boolean duplicateFound = false;
+ if (CollectionUtils.isNotEmpty(shoppingCartItemsSet)) {
+ for (ShoppingCartItem sessionShoppingCartItem : shoppingCartItemsSet) {
+ if (CollectionUtils.isNotEmpty(userShoppingModel.getLineItems())) {
+ for (ShoppingCartItem cartItem : userShoppingModel.getLineItems()) {
+ if (cartItem.getProduct().getId().longValue() == sessionShoppingCartItem.getProduct()
+ .getId().longValue()) {
+ if (CollectionUtils.isNotEmpty(cartItem.getAttributes())) {
+ if (!duplicateFound) {
+ LOGGER.info("Dupliate item found..updating exisitng product quantity");
+ cartItem.setQuantity(
+ cartItem.getQuantity() + sessionShoppingCartItem.getQuantity());
+ duplicateFound = true;
+ break;
+ }
+ }
+ }
+ }
+ }
+ if (!duplicateFound) {
+ LOGGER.info("New item found..adding item to Shopping cart");
+ userShoppingModel.getLineItems().add(sessionShoppingCartItem);
+ }
+ }
+
+ }
+
+ }
+ LOGGER.info("Shopping Cart merged successfully.....");
+ saveOrUpdate(userShoppingModel);
+ removeShoppingCart(sessionCart);
+
+ return userShoppingModel;
+ }
+
+ private Set<ShoppingCartItem> getShoppingCartItems(final ShoppingCart sessionCart, final MerchantStore store,
+ final ShoppingCart cartModel) throws Exception {
+
+ Set<ShoppingCartItem> shoppingCartItemsSet = null;
+ if (CollectionUtils.isNotEmpty(sessionCart.getLineItems())) {
+ shoppingCartItemsSet = new HashSet<ShoppingCartItem>();
+ for (ShoppingCartItem shoppingCartItem : sessionCart.getLineItems()) {
+ Product product = productService.getById(shoppingCartItem.getProductId());
+ if (product == null) {
+ throw new Exception("Item with id " + shoppingCartItem.getProductId() + " does not exist");
+ }
+
+ if (product.getMerchantStore().getId().intValue() != store.getId().intValue()) {
+ throw new Exception("Item with id " + shoppingCartItem.getProductId()
+ + " does not belong to merchant " + store.getId());
+ }
+
+ ShoppingCartItem item = populateShoppingCartItem(product);
+ item.setQuantity(shoppingCartItem.getQuantity());
+ item.setShoppingCart(cartModel);
+
+ List<ShoppingCartAttributeItem> cartAttributes = new ArrayList<ShoppingCartAttributeItem>(
+ shoppingCartItem.getAttributes());
+ if (CollectionUtils.isNotEmpty(cartAttributes)) {
+ for (ShoppingCartAttributeItem shoppingCartAttributeItem : cartAttributes) {
+ ProductAttribute productAttribute = productAttributeService
+ .getById(shoppingCartAttributeItem.getId());
+ if (productAttribute != null
+ && productAttribute.getProduct().getId().longValue() == product.getId().longValue()) {
+
+ ShoppingCartAttributeItem attributeItem = new ShoppingCartAttributeItem(item,
+ productAttribute);
+ if (shoppingCartAttributeItem.getId() > 0) {
+ attributeItem.setId(shoppingCartAttributeItem.getId());
+ }
+ item.addAttributes(attributeItem);
+
+ }
+ }
+ }
+
+ shoppingCartItemsSet.add(item);
+ }
+
+ }
+ return shoppingCartItemsSet;
+ }
+
+ @Override
+ public boolean isFreeShoppingCart(List<ShoppingCartItem> items) throws ServiceException {
+ ShoppingCart cart = new ShoppingCart();
+ Set<ShoppingCartItem> cartItems = new HashSet<ShoppingCartItem>(items);
+ cart.setLineItems(cartItems);
+ return this.isFreeShoppingCart(cart);
+ }
+
+ @Override
+ public void deleteShoppingCartItem(Long id) {
+ shoppingCartItemRepository.delete(id);
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/system/EmailService.java b/sm-core/src/main/java/com/salesmanager/core/business/services/system/EmailService.java
index 373bc66..3620e8f 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/system/EmailService.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/system/EmailService.java
@@ -1,19 +1,19 @@
-package com.salesmanager.core.business.services.system;
-
-
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.modules.email.Email;
-import com.salesmanager.core.business.modules.email.EmailConfig;
-import com.salesmanager.core.model.merchant.MerchantStore;
-
-
-public interface EmailService {
-
- public void sendHtmlEmail(MerchantStore store, Email email) throws ServiceException, Exception;
-
- public EmailConfig getEmailConfiguration(MerchantStore store) throws ServiceException;
-
- public void saveEmailConfiguration(EmailConfig emailConfig, MerchantStore store) throws ServiceException;
-
-}
+package com.salesmanager.core.business.services.system;
+
+
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.modules.email.Email;
+import com.salesmanager.core.business.modules.email.EmailConfig;
+import com.salesmanager.core.model.merchant.MerchantStore;
+
+
+public interface EmailService {
+
+ public void sendHtmlEmail(MerchantStore store, Email email) throws ServiceException, Exception;
+
+ public EmailConfig getEmailConfiguration(MerchantStore store) throws ServiceException;
+
+ public void saveEmailConfiguration(EmailConfig emailConfig, MerchantStore store) throws ServiceException;
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/system/EmailServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/system/EmailServiceImpl.java
index c5eaafe..ea43c48 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/system/EmailServiceImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/system/EmailServiceImpl.java
@@ -1,67 +1,67 @@
-package com.salesmanager.core.business.services.system;
-
-import javax.inject.Inject;
-
-import org.springframework.stereotype.Service;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.salesmanager.core.business.constants.Constants;
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.modules.email.Email;
-import com.salesmanager.core.business.modules.email.EmailConfig;
-import com.salesmanager.core.business.modules.email.HtmlEmailSender;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.system.MerchantConfiguration;
-
-@Service("emailService")
-public class EmailServiceImpl implements EmailService {
-
- @Inject
- private MerchantConfigurationService merchantConfigurationService;
-
- @Inject
- private HtmlEmailSender sender;
-
- @Override
- public void sendHtmlEmail(MerchantStore store, Email email) throws ServiceException, Exception {
-
- EmailConfig emailConfig = getEmailConfiguration(store);
+package com.salesmanager.core.business.services.system;
+
+import javax.inject.Inject;
+
+import org.springframework.stereotype.Service;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.salesmanager.core.business.constants.Constants;
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.modules.email.Email;
+import com.salesmanager.core.business.modules.email.EmailConfig;
+import com.salesmanager.core.business.modules.email.HtmlEmailSender;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.system.MerchantConfiguration;
+
+@Service("emailService")
+public class EmailServiceImpl implements EmailService {
+
+ @Inject
+ private MerchantConfigurationService merchantConfigurationService;
+
+ @Inject
+ private HtmlEmailSender sender;
+
+ @Override
+ public void sendHtmlEmail(MerchantStore store, Email email) throws ServiceException, Exception {
+
+ EmailConfig emailConfig = getEmailConfiguration(store);
+
+ sender.setEmailConfig(emailConfig);
+ sender.send(email);
+ }
+
+ @Override
+ public EmailConfig getEmailConfiguration(MerchantStore store) throws ServiceException {
+
+ MerchantConfiguration configuration = merchantConfigurationService.getMerchantConfiguration(Constants.EMAIL_CONFIG, store);
+ EmailConfig emailConfig = null;
+ if(configuration!=null) {
+ String value = configuration.getValue();
+
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ emailConfig = mapper.readValue(value, EmailConfig.class);
+ } catch(Exception e) {
+ throw new ServiceException("Cannot parse json string " + value);
+ }
+ }
+ return emailConfig;
+ }
+
+
+ @Override
+ public void saveEmailConfiguration(EmailConfig emailConfig, MerchantStore store) throws ServiceException {
+ MerchantConfiguration configuration = merchantConfigurationService.getMerchantConfiguration(Constants.EMAIL_CONFIG, store);
+ if(configuration==null) {
+ configuration = new MerchantConfiguration();
+ configuration.setMerchantStore(store);
+ configuration.setKey(Constants.EMAIL_CONFIG);
+ }
- sender.setEmailConfig(emailConfig);
- sender.send(email);
+ String value = emailConfig.toJSONString();
+ configuration.setValue(value);
+ merchantConfigurationService.saveOrUpdate(configuration);
}
- @Override
- public EmailConfig getEmailConfiguration(MerchantStore store) throws ServiceException {
-
- MerchantConfiguration configuration = merchantConfigurationService.getMerchantConfiguration(Constants.EMAIL_CONFIG, store);
- EmailConfig emailConfig = null;
- if(configuration!=null) {
- String value = configuration.getValue();
-
- ObjectMapper mapper = new ObjectMapper();
- try {
- emailConfig = mapper.readValue(value, EmailConfig.class);
- } catch(Exception e) {
- throw new ServiceException("Cannot parse json string " + value);
- }
- }
- return emailConfig;
- }
-
-
- @Override
- public void saveEmailConfiguration(EmailConfig emailConfig, MerchantStore store) throws ServiceException {
- MerchantConfiguration configuration = merchantConfigurationService.getMerchantConfiguration(Constants.EMAIL_CONFIG, store);
- if(configuration==null) {
- configuration = new MerchantConfiguration();
- configuration.setMerchantStore(store);
- configuration.setKey(Constants.EMAIL_CONFIG);
- }
-
- String value = emailConfig.toJSONString();
- configuration.setValue(value);
- merchantConfigurationService.saveOrUpdate(configuration);
- }
-
-}
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/tax/TaxServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/tax/TaxServiceImpl.java
index 0842963..a0e1562 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/tax/TaxServiceImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/tax/TaxServiceImpl.java
@@ -165,6 +165,10 @@ public class TaxServiceImpl
stateProvince = store.getStorestateprovince();
}
+ if(zone == null && StringUtils.isBlank(stateProvince)) {
+ return null;
+ }
+
Map<Long,TaxClass> taxClasses = new HashMap<Long,TaxClass>();
//put items in a map by tax class id
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/user/GroupService.java b/sm-core/src/main/java/com/salesmanager/core/business/services/user/GroupService.java
index 5f2bc0c..02f6ff7 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/user/GroupService.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/user/GroupService.java
@@ -1,18 +1,19 @@
-package com.salesmanager.core.business.services.user;
-
-import java.util.List;
-import java.util.Set;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.common.generic.SalesManagerEntityService;
-import com.salesmanager.core.model.user.Group;
-import com.salesmanager.core.model.user.GroupType;
-
-
-public interface GroupService extends SalesManagerEntityService<Integer, Group> {
-
-
- List<Group> listGroup(GroupType groupType) throws ServiceException;
- List<Group> listGroupByIds(Set<Integer> ids) throws ServiceException;
-
-}
+package com.salesmanager.core.business.services.user;
+
+import java.util.List;
+import java.util.Set;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.common.generic.SalesManagerEntityService;
+import com.salesmanager.core.model.user.Group;
+import com.salesmanager.core.model.user.GroupType;
+
+
+public interface GroupService extends SalesManagerEntityService<Integer, Group> {
+
+
+ List<Group> listGroup(GroupType groupType) throws ServiceException;
+ List<Group> listGroupByIds(Set<Integer> ids) throws ServiceException;
+ Group findByName(String groupName) throws ServiceException;
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/user/GroupServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/user/GroupServiceImpl.java
index 525388f..cf36959 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/user/GroupServiceImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/user/GroupServiceImpl.java
@@ -1,50 +1,56 @@
-package com.salesmanager.core.business.services.user;
-
-import java.util.List;
-import java.util.Set;
-
-import javax.inject.Inject;
-
-import org.springframework.stereotype.Service;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.repositories.user.GroupRepository;
-import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl;
-import com.salesmanager.core.model.user.Group;
-import com.salesmanager.core.model.user.GroupType;
-
-
-@Service("groupService")
-public class GroupServiceImpl extends
- SalesManagerEntityServiceImpl<Integer, Group> implements GroupService {
-
- GroupRepository groupRepository;
-
-
- @Inject
- public GroupServiceImpl(GroupRepository groupRepository) {
- super(groupRepository);
- this.groupRepository = groupRepository;
-
- }
-
-
- @Override
- public List<Group> listGroup(GroupType groupType) throws ServiceException {
- try {
- return groupRepository.findByType(groupType);
- } catch (Exception e) {
- throw new ServiceException(e);
- }
- }
-
- public List<Group> listGroupByIds(Set<Integer> ids) throws ServiceException {
- try {
- return groupRepository.findByIds(ids);
- } catch (Exception e) {
- throw new ServiceException(e);
- }
- }
-
-
-}
+package com.salesmanager.core.business.services.user;
+
+import java.util.List;
+import java.util.Set;
+
+import javax.inject.Inject;
+
+import org.springframework.stereotype.Service;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.repositories.user.GroupRepository;
+import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl;
+import com.salesmanager.core.model.user.Group;
+import com.salesmanager.core.model.user.GroupType;
+
+
+@Service("groupService")
+public class GroupServiceImpl extends
+ SalesManagerEntityServiceImpl<Integer, Group> implements GroupService {
+
+ GroupRepository groupRepository;
+
+
+ @Inject
+ public GroupServiceImpl(GroupRepository groupRepository) {
+ super(groupRepository);
+ this.groupRepository = groupRepository;
+
+ }
+
+
+ @Override
+ public List<Group> listGroup(GroupType groupType) throws ServiceException {
+ try {
+ return groupRepository.findByType(groupType);
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ }
+ }
+
+ public List<Group> listGroupByIds(Set<Integer> ids) throws ServiceException {
+ try {
+ return groupRepository.findByIds(ids);
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ }
+ }
+
+
+ @Override
+ public Group findByName(String groupName) throws ServiceException {
+ return groupRepository.findByGroupName(groupName);
+ }
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/user/PermissionService.java b/sm-core/src/main/java/com/salesmanager/core/business/services/user/PermissionService.java
index 2f2532b..f7c637f 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/user/PermissionService.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/user/PermissionService.java
@@ -1,33 +1,33 @@
-package com.salesmanager.core.business.services.user;
-
-import java.util.List;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.common.generic.SalesManagerEntityService;
-import com.salesmanager.core.model.user.Group;
-import com.salesmanager.core.model.user.Permission;
-import com.salesmanager.core.model.user.PermissionCriteria;
-import com.salesmanager.core.model.user.PermissionList;
-
-
-
-public interface PermissionService extends SalesManagerEntityService<Integer, Permission> {
-
- List<Permission> getByName();
-
- List<Permission> listPermission() throws ServiceException;
-
- Permission getById(Integer permissionId);
-
-
-// void deletePermission(Permission permission) throws ServiceException;
-
- List<Permission> getPermissions(List<Integer> groupIds) throws ServiceException;
-
- void deletePermission(Permission permission) throws ServiceException;
-
- PermissionList listByCriteria(PermissionCriteria criteria) throws ServiceException ;
-
- void removePermission(Permission permission, Group group) throws ServiceException;
-
-}
+package com.salesmanager.core.business.services.user;
+
+import java.util.List;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.common.generic.SalesManagerEntityService;
+import com.salesmanager.core.model.user.Group;
+import com.salesmanager.core.model.user.Permission;
+import com.salesmanager.core.model.user.PermissionCriteria;
+import com.salesmanager.core.model.user.PermissionList;
+
+
+
+public interface PermissionService extends SalesManagerEntityService<Integer, Permission> {
+
+ List<Permission> getByName();
+
+ List<Permission> listPermission() throws ServiceException;
+
+ Permission getById(Integer permissionId);
+
+
+// void deletePermission(Permission permission) throws ServiceException;
+
+ List<Permission> getPermissions(List<Integer> groupIds) throws ServiceException;
+
+ void deletePermission(Permission permission) throws ServiceException;
+
+ PermissionList listByCriteria(PermissionCriteria criteria) throws ServiceException ;
+
+ void removePermission(Permission permission, Group group) throws ServiceException;
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/user/PermissionServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/user/PermissionServiceImpl.java
index bd39a67..b2c8ed0 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/user/PermissionServiceImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/user/PermissionServiceImpl.java
@@ -1,90 +1,90 @@
-package com.salesmanager.core.business.services.user;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import javax.inject.Inject;
-
-import org.springframework.stereotype.Service;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.repositories.user.PermissionRepository;
-import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl;
-import com.salesmanager.core.model.user.Group;
-import com.salesmanager.core.model.user.Permission;
-import com.salesmanager.core.model.user.PermissionCriteria;
-import com.salesmanager.core.model.user.PermissionList;
-
-
-
-@Service("permissionService")
-public class PermissionServiceImpl extends
- SalesManagerEntityServiceImpl<Integer, Permission> implements
- PermissionService {
-
- private PermissionRepository permissionRepository;
-
-
- @Inject
- public PermissionServiceImpl(PermissionRepository permissionRepository) {
- super(permissionRepository);
- this.permissionRepository = permissionRepository;
-
- }
-
- @Override
- public List<Permission> getByName() {
- // TODO Auto-generated method stub
- return null;
- }
-
-
- @Override
- public Permission getById(Integer permissionId) {
- return permissionRepository.findOne(permissionId);
-
- }
-
-
- @Override
- public void deletePermission(Permission permission) throws ServiceException {
- permission = this.getById(permission.getId());//Prevents detached entity error
- permission.setGroups(null);
-
- this.delete(permission);
- }
-
-
- @SuppressWarnings("unchecked")
- @Override
- public List<Permission> getPermissions(List<Integer> groupIds)
- throws ServiceException {
- @SuppressWarnings({ "unchecked", "rawtypes" })
- Set ids = new HashSet(groupIds);
- return permissionRepository.findByGroups(ids);
- }
-
- @Override
- public PermissionList listByCriteria(PermissionCriteria criteria)
- throws ServiceException {
- return permissionRepository.listByCriteria(criteria);
- }
-
- @Override
- public void removePermission(Permission permission,Group group) throws ServiceException {
- permission = this.getById(permission.getId());//Prevents detached entity error
-
- permission.getGroups().remove(group);
-
-
- }
-
- @Override
- public List<Permission> listPermission() throws ServiceException {
- return permissionRepository.findAll();
- }
-
-
-
-}
+package com.salesmanager.core.business.services.user;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.inject.Inject;
+
+import org.springframework.stereotype.Service;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.repositories.user.PermissionRepository;
+import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl;
+import com.salesmanager.core.model.user.Group;
+import com.salesmanager.core.model.user.Permission;
+import com.salesmanager.core.model.user.PermissionCriteria;
+import com.salesmanager.core.model.user.PermissionList;
+
+
+
+@Service("permissionService")
+public class PermissionServiceImpl extends
+ SalesManagerEntityServiceImpl<Integer, Permission> implements
+ PermissionService {
+
+ private PermissionRepository permissionRepository;
+
+
+ @Inject
+ public PermissionServiceImpl(PermissionRepository permissionRepository) {
+ super(permissionRepository);
+ this.permissionRepository = permissionRepository;
+
+ }
+
+ @Override
+ public List<Permission> getByName() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+
+ @Override
+ public Permission getById(Integer permissionId) {
+ return permissionRepository.findOne(permissionId);
+
+ }
+
+
+ @Override
+ public void deletePermission(Permission permission) throws ServiceException {
+ permission = this.getById(permission.getId());//Prevents detached entity error
+ permission.setGroups(null);
+
+ this.delete(permission);
+ }
+
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public List<Permission> getPermissions(List<Integer> groupIds)
+ throws ServiceException {
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ Set ids = new HashSet(groupIds);
+ return permissionRepository.findByGroups(ids);
+ }
+
+ @Override
+ public PermissionList listByCriteria(PermissionCriteria criteria)
+ throws ServiceException {
+ return permissionRepository.listByCriteria(criteria);
+ }
+
+ @Override
+ public void removePermission(Permission permission,Group group) throws ServiceException {
+ permission = this.getById(permission.getId());//Prevents detached entity error
+
+ permission.getGroups().remove(group);
+
+
+ }
+
+ @Override
+ public List<Permission> listPermission() throws ServiceException {
+ return permissionRepository.findAll();
+ }
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/user/UserService.java b/sm-core/src/main/java/com/salesmanager/core/business/services/user/UserService.java
index 6bd4a35..b307ff9 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/user/UserService.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/user/UserService.java
@@ -1,29 +1,29 @@
-package com.salesmanager.core.business.services.user;
-
-import java.util.List;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.common.generic.SalesManagerEntityService;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.user.User;
-
-
-
-public interface UserService extends SalesManagerEntityService<Long, User> {
-
- User getByUserName(String userName) throws ServiceException;
-
- List<User> listUser() throws ServiceException;
-
- /**
- * Create or update a User
- * @param user
- * @throws ServiceException
- */
- void saveOrUpdate(User user) throws ServiceException;
-
- List<User> listByStore(MerchantStore store) throws ServiceException;
-
-
-
-}
+package com.salesmanager.core.business.services.user;
+
+import java.util.List;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.common.generic.SalesManagerEntityService;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.user.User;
+
+
+
+public interface UserService extends SalesManagerEntityService<Long, User> {
+
+ User getByUserName(String userName) throws ServiceException;
+
+ List<User> listUser() throws ServiceException;
+
+ /**
+ * Create or update a User
+ * @param user
+ * @throws ServiceException
+ */
+ void saveOrUpdate(User user) throws ServiceException;
+
+ List<User> listByStore(MerchantStore store) throws ServiceException;
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/user/UserServiceImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/user/UserServiceImpl.java
index cebfebe..1975203 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/user/UserServiceImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/user/UserServiceImpl.java
@@ -1,80 +1,80 @@
-package com.salesmanager.core.business.services.user;
-
-import java.util.List;
-
-import javax.inject.Inject;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.repositories.user.UserRepository;
-import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl;
-import com.salesmanager.core.business.services.system.EmailService;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.user.User;
-
-
-
-
-public class UserServiceImpl extends SalesManagerEntityServiceImpl<Long, User>
- implements UserService {
-
-
- private UserRepository userRepository;
-
- @Inject
- public UserServiceImpl(UserRepository userRepository) {
- super(userRepository);
- this.userRepository = userRepository;
-
- }
-
- @Inject
- private EmailService emailService;
-
- @Override
- public User getByUserName(String userName) throws ServiceException {
-
- return userRepository.findByUserName(userName);
-
- }
-
- @Override
- public void delete(User user) throws ServiceException {
-
- User u = this.getById(user.getId());
- super.delete(u);
-
- }
-
- @Override
- public List<User> listUser() throws ServiceException {
- try {
- return userRepository.findAll();
- } catch (Exception e) {
- throw new ServiceException(e);
- }
- }
-
- @Override
- public List<User> listByStore(MerchantStore store) throws ServiceException {
- try {
- return userRepository.findByStore(store.getId());
- } catch (Exception e) {
- throw new ServiceException(e);
- }
- }
-
-
- @Override
- public void saveOrUpdate(User user) throws ServiceException {
-
-/* if(user.getId()==null || user.getId().longValue()==0) {
- userDao.save(user);
- } else {
- userDao.update(user);
- }*/
-
- userRepository.save(user);
-
- }
-
-}
+package com.salesmanager.core.business.services.user;
+
+import java.util.List;
+
+import javax.inject.Inject;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.repositories.user.UserRepository;
+import com.salesmanager.core.business.services.common.generic.SalesManagerEntityServiceImpl;
+import com.salesmanager.core.business.services.system.EmailService;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.user.User;
+
+
+
+
+public class UserServiceImpl extends SalesManagerEntityServiceImpl<Long, User>
+ implements UserService {
+
+
+ private UserRepository userRepository;
+
+ @Inject
+ public UserServiceImpl(UserRepository userRepository) {
+ super(userRepository);
+ this.userRepository = userRepository;
+
+ }
+
+ @Inject
+ private EmailService emailService;
+
+ @Override
+ public User getByUserName(String userName) throws ServiceException {
+
+ return userRepository.findByUserName(userName);
+
+ }
+
+ @Override
+ public void delete(User user) throws ServiceException {
+
+ User u = this.getById(user.getId());
+ super.delete(u);
+
+ }
+
+ @Override
+ public List<User> listUser() throws ServiceException {
+ try {
+ return userRepository.findAll();
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ }
+ }
+
+ @Override
+ public List<User> listByStore(MerchantStore store) throws ServiceException {
+ try {
+ return userRepository.findByStore(store.getId());
+ } catch (Exception e) {
+ throw new ServiceException(e);
+ }
+ }
+
+
+ @Override
+ public void saveOrUpdate(User user) throws ServiceException {
+
+/* if(user.getId()==null || user.getId().longValue()==0) {
+ userDao.save(user);
+ } else {
+ userDao.update(user);
+ }*/
+
+ userRepository.save(user);
+
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/services/user/UserServiceLDAPImpl.java b/sm-core/src/main/java/com/salesmanager/core/business/services/user/UserServiceLDAPImpl.java
index 575f1ad..e313062 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/services/user/UserServiceLDAPImpl.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/services/user/UserServiceLDAPImpl.java
@@ -1,99 +1,99 @@
-package com.salesmanager.core.business.services.user;
-
-import java.util.List;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.user.User;
-
-
-
-public class UserServiceLDAPImpl implements UserService {
-
- @Override
- public void save(User entity) throws ServiceException {
- throw new ServiceException("Not implemented");
-
- }
-
- @Override
- public void update(User entity) throws ServiceException {
- throw new ServiceException("Not implemented");
-
- }
-
- @Override
- public void create(User entity) throws ServiceException {
- throw new ServiceException("Not implemented");
-
- }
-
- @Override
- public void delete(User entity) throws ServiceException {
- throw new ServiceException("Not implemented");
-
- }
-
-
-
- @Override
- public User getById(Long id) {
- // TODO Auto-generated method stub
- return null;
- }
-
- @Override
- public List<User> list() {
- // TODO Auto-generated method stub
- return null;
- }
-
-
-
- @Override
- public Long count() {
- // TODO Auto-generated method stub
- return null;
- }
-
-
-
-
-
- @Override
- public User getByUserName(String userName) throws ServiceException {
- // TODO Auto-generated method stub
- throw new ServiceException("Not implemented");
- }
-
- @Override
- public List<User> listUser() throws ServiceException {
- // TODO Auto-generated method stub
- throw new ServiceException("Not implemented");
- }
-
- @Override
- public void saveOrUpdate(User user) throws ServiceException {
- throw new ServiceException("Not implemented");
-
- }
-
- @Override
- public List<User> listByStore(MerchantStore store)
- throws ServiceException {
- // TODO Auto-generated method stub
- throw new ServiceException("Not implemented");
- }
-
- /* (non-Javadoc)
- * @see com.salesmanager.core.business.services.common.generic.SalesManagerEntityService#flush()
- */
- @Override
- public void flush() {
- // TODO Auto-generated method stub
-
- }
-
-
-
-}
+package com.salesmanager.core.business.services.user;
+
+import java.util.List;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.user.User;
+
+
+
+public class UserServiceLDAPImpl implements UserService {
+
+ @Override
+ public void save(User entity) throws ServiceException {
+ throw new ServiceException("Not implemented");
+
+ }
+
+ @Override
+ public void update(User entity) throws ServiceException {
+ throw new ServiceException("Not implemented");
+
+ }
+
+ @Override
+ public void create(User entity) throws ServiceException {
+ throw new ServiceException("Not implemented");
+
+ }
+
+ @Override
+ public void delete(User entity) throws ServiceException {
+ throw new ServiceException("Not implemented");
+
+ }
+
+
+
+ @Override
+ public User getById(Long id) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public List<User> list() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+
+
+ @Override
+ public Long count() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+
+
+
+
+ @Override
+ public User getByUserName(String userName) throws ServiceException {
+ // TODO Auto-generated method stub
+ throw new ServiceException("Not implemented");
+ }
+
+ @Override
+ public List<User> listUser() throws ServiceException {
+ // TODO Auto-generated method stub
+ throw new ServiceException("Not implemented");
+ }
+
+ @Override
+ public void saveOrUpdate(User user) throws ServiceException {
+ throw new ServiceException("Not implemented");
+
+ }
+
+ @Override
+ public List<User> listByStore(MerchantStore store)
+ throws ServiceException {
+ // TODO Auto-generated method stub
+ throw new ServiceException("Not implemented");
+ }
+
+ /* (non-Javadoc)
+ * @see com.salesmanager.core.business.services.common.generic.SalesManagerEntityService#flush()
+ */
+ @Override
+ public void flush() {
+ // TODO Auto-generated method stub
+
+ }
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/utils/AbstractDataPopulator.java b/sm-core/src/main/java/com/salesmanager/core/business/utils/AbstractDataPopulator.java
index e5a641f..8cc2084 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/utils/AbstractDataPopulator.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/utils/AbstractDataPopulator.java
@@ -1,41 +1,41 @@
-/**
- *
- */
-package com.salesmanager.core.business.utils;
-
-import java.util.Locale;
-
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-
-
-/**
- * @author Umesh A
- *
- */
-public abstract class AbstractDataPopulator<Source,Target> implements DataPopulator<Source, Target>
-{
-
-
-
- private Locale locale;
-
- public void setLocale(Locale locale) {
- this.locale = locale;
- }
- public Locale getLocale() {
- return locale;
- }
-
-
- @Override
- public Target populate(Source source, MerchantStore store, Language language) throws ConversionException{
- return populate(source,createTarget(), store, language);
- }
-
- protected abstract Target createTarget();
-
-
-
-}
+/**
+ *
+ */
+package com.salesmanager.core.business.utils;
+
+import java.util.Locale;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+
+
+/**
+ * @author Umesh A
+ *
+ */
+public abstract class AbstractDataPopulator<Source,Target> implements DataPopulator<Source, Target>
+{
+
+
+
+ private Locale locale;
+
+ public void setLocale(Locale locale) {
+ this.locale = locale;
+ }
+ public Locale getLocale() {
+ return locale;
+ }
+
+
+ @Override
+ public Target populate(Source source, MerchantStore store, Language language) throws ConversionException{
+ return populate(source,createTarget(), store, language);
+ }
+
+ protected abstract Target createTarget();
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/utils/ApplicationContextListenerUtils.java b/sm-core/src/main/java/com/salesmanager/core/business/utils/ApplicationContextListenerUtils.java
index 6dcec0b..bea7bb5 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/utils/ApplicationContextListenerUtils.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/utils/ApplicationContextListenerUtils.java
@@ -1,20 +1,20 @@
-package com.salesmanager.core.business.utils;
-
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationListener;
-import org.springframework.context.event.ContextStartedEvent;
-
-import com.salesmanager.core.business.services.search.SearchService;
-
-public class ApplicationContextListenerUtils implements ApplicationListener<ContextStartedEvent> {
-
- @Override
- public void onApplicationEvent(ContextStartedEvent event) {
- ApplicationContext applicationContext = event.getApplicationContext();
- /** init search service **/
- SearchService searchService = (SearchService)applicationContext.getBean("productSearchService");
- searchService.initService();
-
- }
-
-}
+package com.salesmanager.core.business.utils;
+
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.event.ContextStartedEvent;
+
+import com.salesmanager.core.business.services.search.SearchService;
+
+public class ApplicationContextListenerUtils implements ApplicationListener<ContextStartedEvent> {
+
+ @Override
+ public void onApplicationEvent(ContextStartedEvent event) {
+ ApplicationContext applicationContext = event.getApplicationContext();
+ /** init search service **/
+ SearchService searchService = (SearchService)applicationContext.getBean("productSearchService");
+ searchService.initService();
+
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/utils/CreditCardUtils.java b/sm-core/src/main/java/com/salesmanager/core/business/utils/CreditCardUtils.java
index 01cafbc..16f35e9 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/utils/CreditCardUtils.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/utils/CreditCardUtils.java
@@ -1,32 +1,32 @@
-package com.salesmanager.core.business.utils;
-
-
-public class CreditCardUtils {
-
-
- public static final int MASTERCARD = 0, VISA = 1;
- public static final int AMEX = 2, DISCOVER = 3, DINERS = 4;
-
- public static String maskCardNumber(String clearcardnumber)
- throws Exception {
-
- if (clearcardnumber.length() < 10) {
- throw new Exception("Invalid number of digits");
- }
-
- int length = clearcardnumber.length();
-
- String prefix = clearcardnumber.substring(0, 4);
- String suffix = clearcardnumber.substring(length - 4);
-
- StringBuffer mask = new StringBuffer();
- mask.append(prefix).append("XXXXXXXXXX").append(suffix);
-
- return mask.toString();
- }
-
-
-
-
-
-}
+package com.salesmanager.core.business.utils;
+
+
+public class CreditCardUtils {
+
+
+ public static final int MASTERCARD = 0, VISA = 1;
+ public static final int AMEX = 2, DISCOVER = 3, DINERS = 4;
+
+ public static String maskCardNumber(String clearcardnumber)
+ throws Exception {
+
+ if (clearcardnumber.length() < 10) {
+ throw new Exception("Invalid number of digits");
+ }
+
+ int length = clearcardnumber.length();
+
+ String prefix = clearcardnumber.substring(0, 4);
+ String suffix = clearcardnumber.substring(length - 4);
+
+ StringBuffer mask = new StringBuffer();
+ mask.append(prefix).append("XXXXXXXXXX").append(suffix);
+
+ return mask.toString();
+ }
+
+
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/utils/DataPopulator.java b/sm-core/src/main/java/com/salesmanager/core/business/utils/DataPopulator.java
index 21da0b2..17a57b8 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/utils/DataPopulator.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/utils/DataPopulator.java
@@ -1,22 +1,22 @@
-/**
- *
- */
-package com.salesmanager.core.business.utils;
-
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-
-/**
- * @author Umesh A
- *
- */
-public interface DataPopulator<Source,Target>
-{
-
-
- public Target populate(Source source,Target target, MerchantStore store, Language language) throws ConversionException;
- public Target populate(Source source, MerchantStore store, Language language) throws ConversionException;
-
-
-}
+/**
+ *
+ */
+package com.salesmanager.core.business.utils;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+
+/**
+ * @author Umesh A
+ *
+ */
+public interface DataPopulator<Source,Target>
+{
+
+
+ public Target populate(Source source,Target target, MerchantStore store, Language language) throws ConversionException;
+ public Target populate(Source source, MerchantStore store, Language language) throws ConversionException;
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/utils/DataUtils.java b/sm-core/src/main/java/com/salesmanager/core/business/utils/DataUtils.java
index 124a728..c08d747 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/utils/DataUtils.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/utils/DataUtils.java
@@ -1,102 +1,102 @@
-package com.salesmanager.core.business.utils;
-
-import java.math.BigDecimal;
-
-import com.salesmanager.core.constants.MeasureUnit;
-import com.salesmanager.core.model.merchant.MerchantStore;
-
-public class DataUtils {
-
- /**
- * Removes dashes
- * @param postalCode
- * @return
- */
- public static String trimPostalCode(String postalCode) {
-
- String pc = postalCode.replaceAll("[^a-zA-Z0-9]", "");
-
- return pc;
-
- }
-
-
- /**
- * Get the measure according to the appropriate measure base. If the measure
- * configured in store is LB and it needs KG then the appropriate
- * calculation is done
- *
- * @param weight
- * @param store
- * @param base
- * @return
- */
- public static double getWeight(double weight, MerchantStore store,
- String base) {
-
- double weightConstant = 2.2;
- if (base.equals(MeasureUnit.LB.name())) {
- if (store.getWeightunitcode().equals(MeasureUnit.LB.name())) {
- return new BigDecimal(String.valueOf(weight)).setScale(2,
- BigDecimal.ROUND_HALF_UP).doubleValue();
- } else {// pound = kilogram
- double answer = weight * weightConstant;
- BigDecimal w = new BigDecimal(answer);
- return w.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
- }
- } else {// need KG
- if (store.getWeightunitcode().equals(MeasureUnit.KG.name())) {
- return new BigDecimal(String.valueOf(weight)).setScale(2,
- BigDecimal.ROUND_HALF_UP).doubleValue();
- } else {
-
- double answer = weight / weightConstant;
- BigDecimal w = new BigDecimal(answer);
- return w.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
-
- }
- }
- }
-
- /**
- * Get the measure according to the appropriate measure base. If the measure
- * configured in store is IN and it needs CM or vise versa then the
- * appropriate calculation is done
- *
- * @param weight
- * @param store
- * @param base
- * @return
- */
- public static double getMeasure(double measure, MerchantStore store,
- String base) {
-
- if (base.equals(MeasureUnit.IN.name())) {
- if (store.getSeizeunitcode().equals(MeasureUnit.IN.name())) {
- return new BigDecimal(String.valueOf(measure)).setScale(2,
- BigDecimal.ROUND_HALF_UP).doubleValue();
- } else {// centimeter (inch to centimeter)
- double measureConstant = 2.54;
-
- double answer = measure * measureConstant;
- BigDecimal w = new BigDecimal(answer);
- return w.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
-
- }
- } else {// need CM
- if (store.getSeizeunitcode().equals(MeasureUnit.CM.name())) {
- return new BigDecimal(String.valueOf(measure)).setScale(2)
- .doubleValue();
- } else {// in (centimeter to inch)
- double measureConstant = 0.39;
-
- double answer = measure * measureConstant;
- BigDecimal w = new BigDecimal(answer);
- return w.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
-
- }
- }
-
- }
-
-}
+package com.salesmanager.core.business.utils;
+
+import java.math.BigDecimal;
+
+import com.salesmanager.core.constants.MeasureUnit;
+import com.salesmanager.core.model.merchant.MerchantStore;
+
+public class DataUtils {
+
+ /**
+ * Removes dashes
+ * @param postalCode
+ * @return
+ */
+ public static String trimPostalCode(String postalCode) {
+
+ String pc = postalCode.replaceAll("[^a-zA-Z0-9]", "");
+
+ return pc;
+
+ }
+
+
+ /**
+ * Get the measure according to the appropriate measure base. If the measure
+ * configured in store is LB and it needs KG then the appropriate
+ * calculation is done
+ *
+ * @param weight
+ * @param store
+ * @param base
+ * @return
+ */
+ public static double getWeight(double weight, MerchantStore store,
+ String base) {
+
+ double weightConstant = 2.2;
+ if (base.equals(MeasureUnit.LB.name())) {
+ if (store.getWeightunitcode().equals(MeasureUnit.LB.name())) {
+ return new BigDecimal(String.valueOf(weight)).setScale(2,
+ BigDecimal.ROUND_HALF_UP).doubleValue();
+ } else {// pound = kilogram
+ double answer = weight * weightConstant;
+ BigDecimal w = new BigDecimal(answer);
+ return w.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+ }
+ } else {// need KG
+ if (store.getWeightunitcode().equals(MeasureUnit.KG.name())) {
+ return new BigDecimal(String.valueOf(weight)).setScale(2,
+ BigDecimal.ROUND_HALF_UP).doubleValue();
+ } else {
+
+ double answer = weight / weightConstant;
+ BigDecimal w = new BigDecimal(answer);
+ return w.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+
+ }
+ }
+ }
+
+ /**
+ * Get the measure according to the appropriate measure base. If the measure
+ * configured in store is IN and it needs CM or vise versa then the
+ * appropriate calculation is done
+ *
+ * @param weight
+ * @param store
+ * @param base
+ * @return
+ */
+ public static double getMeasure(double measure, MerchantStore store,
+ String base) {
+
+ if (base.equals(MeasureUnit.IN.name())) {
+ if (store.getSeizeunitcode().equals(MeasureUnit.IN.name())) {
+ return new BigDecimal(String.valueOf(measure)).setScale(2,
+ BigDecimal.ROUND_HALF_UP).doubleValue();
+ } else {// centimeter (inch to centimeter)
+ double measureConstant = 2.54;
+
+ double answer = measure * measureConstant;
+ BigDecimal w = new BigDecimal(answer);
+ return w.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+
+ }
+ } else {// need CM
+ if (store.getSeizeunitcode().equals(MeasureUnit.CM.name())) {
+ return new BigDecimal(String.valueOf(measure)).setScale(2)
+ .doubleValue();
+ } else {// in (centimeter to inch)
+ double measureConstant = 0.39;
+
+ double answer = measure * measureConstant;
+ BigDecimal w = new BigDecimal(answer);
+ return w.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
+
+ }
+ }
+
+ }
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/utils/EntityPopulator.java b/sm-core/src/main/java/com/salesmanager/core/business/utils/EntityPopulator.java
index 7df24cf..08f15a4 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/utils/EntityPopulator.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/utils/EntityPopulator.java
@@ -1,18 +1,18 @@
-/**
- *
- */
-package com.salesmanager.core.business.utils;
-
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.model.merchant.MerchantStore;
-
-/**
- * @author Umesh A
- *
- */
-public interface EntityPopulator<Source,Target>
-{
-
- public Target populateToEntity(Source source, Target target, MerchantStore store) throws ConversionException;
- public Target populateToEntity(Source source) throws ConversionException;
-}
+/**
+ *
+ */
+package com.salesmanager.core.business.utils;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.model.merchant.MerchantStore;
+
+/**
+ * @author Umesh A
+ *
+ */
+public interface EntityPopulator<Source,Target>
+{
+
+ public Target populateToEntity(Source source, Target target, MerchantStore store) throws ConversionException;
+ public Target populateToEntity(Source source) throws ConversionException;
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/utils/ProductImageCropUtils.java b/sm-core/src/main/java/com/salesmanager/core/business/utils/ProductImageCropUtils.java
index 20e0d02..946ba85 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/utils/ProductImageCropUtils.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/utils/ProductImageCropUtils.java
@@ -1,232 +1,232 @@
-package com.salesmanager.core.business.utils;
-
-import java.awt.Rectangle;
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.io.IOException;
-import java.net.FileNameMap;
-import java.net.URLConnection;
-
-import javax.imageio.ImageIO;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ProductImageCropUtils {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ProductImageCropUtils.class);
-
- private boolean cropeable = true;
-
- private int cropeBaseline = 0;// o is width, 1 is height
-
- private int getCropeBaseline() {
- return cropeBaseline;
- }
-
-
-
- private double cropAreaWidth = 0;
- private double cropAreaHeight = 0;
-
- //private InputStream originalFile = null;
- private BufferedImage originalFile = null;
-
-
-
- public ProductImageCropUtils(BufferedImage file, int largeImageWidth, int largeImageHeight) {
-
-
-
- try {
-
-
- this.originalFile = file;
-
- /** Original Image **/
- // get original image size
-
- int width = originalFile.getWidth();
- int height = originalFile.getHeight();
-
- /*** determine if image can be cropped ***/
- determineCropeable(width, largeImageWidth, height, largeImageHeight);
-
- /*** determine crop area calculation baseline ***/
- //this.determineBaseline(width, height);
-
- determineCropArea(width, largeImageWidth, height, largeImageHeight);
-
- } catch (Exception e) {
- LOGGER.error("Image Utils error in constructor", e);
- }
-
-
-
-
-
-
- }
-
-
- private void determineCropeable(int width, int specificationsWidth,
- int height, int specificationsHeight) {
- /*** determine if image can be cropped ***/
- // height
- int y = height - specificationsHeight;
- // width
- int x = width - specificationsWidth;
-
- if (x < 0 || y < 0) {
- setCropeable(false);
- }
-
- if (x == 0 && y == 0) {
- setCropeable(false);
- }
-
-
- if((height % specificationsHeight) == 0 && (width % specificationsWidth) == 0 ) {
- setCropeable(false);
- }
-
-
-
- }
-
-
- private void determineCropArea(int width, int specificationsWidth,
- int height, int specificationsHeight) {
-
- cropAreaWidth = specificationsWidth;
- cropAreaHeight = specificationsHeight;
-
-
- double factorWidth = new Integer(width).doubleValue() / new Integer(specificationsWidth).doubleValue();
- double factorHeight = new Integer(height).doubleValue() / new Integer(specificationsHeight).doubleValue();
-
- double factor = factorWidth;
-
- if(factorWidth>factorHeight) {
- factor = factorHeight;
- }
-
-
- // crop factor
-/* double factor = 1;
- if (this.getCropeBaseline() == 0) {// width
- factor = new Integer(width).doubleValue()
- / new Integer(specificationsWidth).doubleValue();
- } else {// height
- factor = new Integer(height).doubleValue()
- / new Integer(specificationsHeight).doubleValue();
- }*/
-
- double w = factor * specificationsWidth;
- double h = factor * specificationsHeight;
-
- if(w==h) {
- setCropeable(false);
- }
-
-
- cropAreaWidth = w;
-
- if(cropAreaWidth > width)
- cropAreaWidth = width;
-
- cropAreaHeight = h;
-
- if(cropAreaHeight > height)
- cropAreaHeight = height;
-
- /*
- * if(factor>1) { //determine croping section for(double
- * i=factor;i>1;i--) { //multiply specifications by factor int newWidth
- * = (int)(i * specificationsWidth); int newHeight = (int)(i *
- * specificationsHeight); //check if new size >= original image
- * if(width>=newWidth && height>=newHeight) { cropAreaWidth = newWidth;
- * cropAreaHeight = newHeight; break; } } }
- */
-
- }
-
-
- public File getCroppedImage(File originalFile, int x1, int y1, int width,
- int height) throws Exception {
-
- if(!this.cropeable) {
- return originalFile;
- }
-
- FileNameMap fileNameMap = URLConnection.getFileNameMap();
- String contentType = fileNameMap.getContentTypeFor(originalFile.getName());
-
- String extension = contentType.substring(contentType.indexOf("/"),contentType.length());
-
- BufferedImage image = ImageIO.read(originalFile);
- BufferedImage out = image.getSubimage(x1, y1, width, height);
- File tempFile = File.createTempFile("temp", "." + extension );
- tempFile.deleteOnExit();
- ImageIO.write(out, extension, tempFile);
- return tempFile;
- }
-
- public BufferedImage getCroppedImage() throws IOException {
-
-
- //out if croppedArea == 0 or file is null
-
-
-
-
- Rectangle goal = new Rectangle( (int)this.getCropAreaWidth(), (int) this.getCropAreaHeight());
-
- //Then intersect it with the dimensions of your image:
-
- Rectangle clip = goal.intersection(new Rectangle(originalFile.getWidth(), originalFile.getHeight()));
-
- //Now, clip corresponds to the portion of bi that will fit within your goal. In this case 100 x50.
-
- //Now get the subImage using the value of clip.
-
- BufferedImage clippedImg = originalFile.getSubimage(clip.x, clip.y, clip.width, clip.height);
-
-
- return clippedImg;
-
-
-
-
- }
-
-
-
-
- public double getCropAreaWidth() {
- return cropAreaWidth;
- }
-
- public void setCropAreaWidth(int cropAreaWidth) {
- this.cropAreaWidth = cropAreaWidth;
- }
-
- public double getCropAreaHeight() {
- return cropAreaHeight;
- }
-
- public void setCropAreaHeight(int cropAreaHeight) {
- this.cropAreaHeight = cropAreaHeight;
- }
-
- public void setCropeable(boolean cropeable) {
- this.cropeable = cropeable;
- }
-
- public boolean isCropeable() {
- return cropeable;
- }
-
-
-
-}
+package com.salesmanager.core.business.utils;
+
+import java.awt.Rectangle;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.net.FileNameMap;
+import java.net.URLConnection;
+
+import javax.imageio.ImageIO;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ProductImageCropUtils {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ProductImageCropUtils.class);
+
+ private boolean cropeable = true;
+
+ private int cropeBaseline = 0;// o is width, 1 is height
+
+ private int getCropeBaseline() {
+ return cropeBaseline;
+ }
+
+
+
+ private double cropAreaWidth = 0;
+ private double cropAreaHeight = 0;
+
+ //private InputStream originalFile = null;
+ private BufferedImage originalFile = null;
+
+
+
+ public ProductImageCropUtils(BufferedImage file, int largeImageWidth, int largeImageHeight) {
+
+
+
+ try {
+
+
+ this.originalFile = file;
+
+ /** Original Image **/
+ // get original image size
+
+ int width = originalFile.getWidth();
+ int height = originalFile.getHeight();
+
+ /*** determine if image can be cropped ***/
+ determineCropeable(width, largeImageWidth, height, largeImageHeight);
+
+ /*** determine crop area calculation baseline ***/
+ //this.determineBaseline(width, height);
+
+ determineCropArea(width, largeImageWidth, height, largeImageHeight);
+
+ } catch (Exception e) {
+ LOGGER.error("Image Utils error in constructor", e);
+ }
+
+
+
+
+
+
+ }
+
+
+ private void determineCropeable(int width, int specificationsWidth,
+ int height, int specificationsHeight) {
+ /*** determine if image can be cropped ***/
+ // height
+ int y = height - specificationsHeight;
+ // width
+ int x = width - specificationsWidth;
+
+ if (x < 0 || y < 0) {
+ setCropeable(false);
+ }
+
+ if (x == 0 && y == 0) {
+ setCropeable(false);
+ }
+
+
+ if((height % specificationsHeight) == 0 && (width % specificationsWidth) == 0 ) {
+ setCropeable(false);
+ }
+
+
+
+ }
+
+
+ private void determineCropArea(int width, int specificationsWidth,
+ int height, int specificationsHeight) {
+
+ cropAreaWidth = specificationsWidth;
+ cropAreaHeight = specificationsHeight;
+
+
+ double factorWidth = new Integer(width).doubleValue() / new Integer(specificationsWidth).doubleValue();
+ double factorHeight = new Integer(height).doubleValue() / new Integer(specificationsHeight).doubleValue();
+
+ double factor = factorWidth;
+
+ if(factorWidth>factorHeight) {
+ factor = factorHeight;
+ }
+
+
+ // crop factor
+/* double factor = 1;
+ if (this.getCropeBaseline() == 0) {// width
+ factor = new Integer(width).doubleValue()
+ / new Integer(specificationsWidth).doubleValue();
+ } else {// height
+ factor = new Integer(height).doubleValue()
+ / new Integer(specificationsHeight).doubleValue();
+ }*/
+
+ double w = factor * specificationsWidth;
+ double h = factor * specificationsHeight;
+
+ if(w==h) {
+ setCropeable(false);
+ }
+
+
+ cropAreaWidth = w;
+
+ if(cropAreaWidth > width)
+ cropAreaWidth = width;
+
+ cropAreaHeight = h;
+
+ if(cropAreaHeight > height)
+ cropAreaHeight = height;
+
+ /*
+ * if(factor>1) { //determine croping section for(double
+ * i=factor;i>1;i--) { //multiply specifications by factor int newWidth
+ * = (int)(i * specificationsWidth); int newHeight = (int)(i *
+ * specificationsHeight); //check if new size >= original image
+ * if(width>=newWidth && height>=newHeight) { cropAreaWidth = newWidth;
+ * cropAreaHeight = newHeight; break; } } }
+ */
+
+ }
+
+
+ public File getCroppedImage(File originalFile, int x1, int y1, int width,
+ int height) throws Exception {
+
+ if(!this.cropeable) {
+ return originalFile;
+ }
+
+ FileNameMap fileNameMap = URLConnection.getFileNameMap();
+ String contentType = fileNameMap.getContentTypeFor(originalFile.getName());
+
+ String extension = contentType.substring(contentType.indexOf("/"),contentType.length());
+
+ BufferedImage image = ImageIO.read(originalFile);
+ BufferedImage out = image.getSubimage(x1, y1, width, height);
+ File tempFile = File.createTempFile("temp", "." + extension );
+ tempFile.deleteOnExit();
+ ImageIO.write(out, extension, tempFile);
+ return tempFile;
+ }
+
+ public BufferedImage getCroppedImage() throws IOException {
+
+
+ //out if croppedArea == 0 or file is null
+
+
+
+
+ Rectangle goal = new Rectangle( (int)this.getCropAreaWidth(), (int) this.getCropAreaHeight());
+
+ //Then intersect it with the dimensions of your image:
+
+ Rectangle clip = goal.intersection(new Rectangle(originalFile.getWidth(), originalFile.getHeight()));
+
+ //Now, clip corresponds to the portion of bi that will fit within your goal. In this case 100 x50.
+
+ //Now get the subImage using the value of clip.
+
+ BufferedImage clippedImg = originalFile.getSubimage(clip.x, clip.y, clip.width, clip.height);
+
+
+ return clippedImg;
+
+
+
+
+ }
+
+
+
+
+ public double getCropAreaWidth() {
+ return cropAreaWidth;
+ }
+
+ public void setCropAreaWidth(int cropAreaWidth) {
+ this.cropAreaWidth = cropAreaWidth;
+ }
+
+ public double getCropAreaHeight() {
+ return cropAreaHeight;
+ }
+
+ public void setCropAreaHeight(int cropAreaHeight) {
+ this.cropAreaHeight = cropAreaHeight;
+ }
+
+ public void setCropeable(boolean cropeable) {
+ this.cropeable = cropeable;
+ }
+
+ public boolean isCropeable() {
+ return cropeable;
+ }
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/utils/ProductImageSizeUtils.java b/sm-core/src/main/java/com/salesmanager/core/business/utils/ProductImageSizeUtils.java
index 0ecb4dd..4544747 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/utils/ProductImageSizeUtils.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/utils/ProductImageSizeUtils.java
@@ -1,151 +1,151 @@
-package com.salesmanager.core.business.utils;
-
-import java.awt.AlphaComposite;
-import java.awt.Graphics2D;
-import java.awt.RenderingHints;
-import java.awt.Transparency;
-import java.awt.image.BufferedImage;
-
-/**
- * Utility class for image resize functions
- * @author Carl Samson
- *
- */
-public class ProductImageSizeUtils {
-
-
- private ProductImageSizeUtils() {
-
- }
-
-
- /**
- * Simple resize, does not maintain aspect ratio
- * @param image
- * @param width
- * @param height
- * @return
- */
-
- public static BufferedImage resize(BufferedImage image, int width, int height) {
- int type = image.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : image
- .getType();
- BufferedImage resizedImage = new BufferedImage(width, height, type);
- Graphics2D g = resizedImage.createGraphics();
- g.setComposite(AlphaComposite.Src);
- g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
- RenderingHints.VALUE_INTERPOLATION_BILINEAR);
- g.setRenderingHint(RenderingHints.KEY_RENDERING,
- RenderingHints.VALUE_RENDER_QUALITY);
- g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
- RenderingHints.VALUE_ANTIALIAS_ON);
- g.drawImage(image, 0, 0, width, height, null);
- g.dispose();
- return resizedImage;
- }
-
- /**
- *
- * @param img
- * @param targetWidth
- * @param targetHeight
- * @param hint
- * {@code RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR},
- * {@code RenderingHints.VALUE_INTERPOLATION_BILINEAR},
- * {@code RenderingHints.VALUE_INTERPOLATION_BICUBIC})
- * @param higherQuality
- * @return
- */
- public static BufferedImage resizeWithHint(BufferedImage img,
- int targetWidth, int targetHeight, Object hint,
- boolean higherQuality) {
- int type = (img.getTransparency() == Transparency.OPAQUE) ? BufferedImage.TYPE_INT_RGB
- : BufferedImage.TYPE_INT_ARGB;
- BufferedImage ret = (BufferedImage) img;
- int w, h;
- if (higherQuality) {
- // Use multi-step technique: start with original size, then
- // scale down in multiple passes with drawImage()
- // until the target size is reached
- w = img.getWidth();
- h = img.getHeight();
- } else {
- // Use one-step technique: scale directly from original
- // size to target size with a single drawImage() call
- w = targetWidth;
- h = targetHeight;
- }
-
- do {
- if (higherQuality && w > targetWidth) {
- w /= 2;
- if (w < targetWidth) {
- w = targetWidth;
- }
- }
-
- if (higherQuality && h > targetHeight) {
- h /= 2;
- if (h < targetHeight) {
- h = targetHeight;
- }
- }
-
- BufferedImage tmp = new BufferedImage(w, h, type);
- Graphics2D g2 = tmp.createGraphics();
- g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint);
- g2.drawImage(ret, 0, 0, w, h, null);
- g2.dispose();
-
- ret = tmp;
- } while (w != targetWidth || h != targetHeight);
-
- return ret;
- }
-
-
- public static BufferedImage resizeWithRatio(BufferedImage image, int destinationWidth, int destinationHeight) {
-
- int type = image.getType() == 0? BufferedImage.TYPE_INT_ARGB : image.getType();
-
- //*Special* if the width or height is 0 use image src dimensions
- if (destinationWidth == 0) {
- destinationWidth = image.getWidth();
- }
- if (destinationHeight == 0) {
- destinationHeight = image.getHeight();
- }
-
- int fHeight = destinationHeight;
- int fWidth = destinationWidth;
-
- //Work out the resized width/height
- if (image.getHeight() > destinationHeight || image.getWidth() > destinationWidth) {
- fHeight = destinationHeight;
- int wid = destinationWidth;
- float sum = (float)image.getWidth() / (float)image.getHeight();
- fWidth = Math.round(fHeight * sum);
-
- if (fWidth > wid) {
- //rezise again for the width this time
- fHeight = Math.round(wid/sum);
- fWidth = wid;
- }
- }
-
- BufferedImage resizedImage = new BufferedImage(fWidth, fHeight, type);
- Graphics2D g = resizedImage.createGraphics();
- g.setComposite(AlphaComposite.Src);
-
- g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
- g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
- g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-
- g.drawImage(image, 0, 0, fWidth, fHeight, null);
- g.dispose();
-
- return resizedImage;
- }
-
-
-}
+package com.salesmanager.core.business.utils;
+
+import java.awt.AlphaComposite;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.Transparency;
+import java.awt.image.BufferedImage;
+
+/**
+ * Utility class for image resize functions
+ * @author Carl Samson
+ *
+ */
+public class ProductImageSizeUtils {
+
+
+ private ProductImageSizeUtils() {
+
+ }
+
+
+ /**
+ * Simple resize, does not maintain aspect ratio
+ * @param image
+ * @param width
+ * @param height
+ * @return
+ */
+
+ public static BufferedImage resize(BufferedImage image, int width, int height) {
+ int type = image.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : image
+ .getType();
+ BufferedImage resizedImage = new BufferedImage(width, height, type);
+ Graphics2D g = resizedImage.createGraphics();
+ g.setComposite(AlphaComposite.Src);
+ g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
+ RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+ g.setRenderingHint(RenderingHints.KEY_RENDERING,
+ RenderingHints.VALUE_RENDER_QUALITY);
+ g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+ RenderingHints.VALUE_ANTIALIAS_ON);
+ g.drawImage(image, 0, 0, width, height, null);
+ g.dispose();
+ return resizedImage;
+ }
+
+ /**
+ *
+ * @param img
+ * @param targetWidth
+ * @param targetHeight
+ * @param hint
+ * {@code RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR},
+ * {@code RenderingHints.VALUE_INTERPOLATION_BILINEAR},
+ * {@code RenderingHints.VALUE_INTERPOLATION_BICUBIC})
+ * @param higherQuality
+ * @return
+ */
+ public static BufferedImage resizeWithHint(BufferedImage img,
+ int targetWidth, int targetHeight, Object hint,
+ boolean higherQuality) {
+ int type = (img.getTransparency() == Transparency.OPAQUE) ? BufferedImage.TYPE_INT_RGB
+ : BufferedImage.TYPE_INT_ARGB;
+ BufferedImage ret = (BufferedImage) img;
+ int w, h;
+ if (higherQuality) {
+ // Use multi-step technique: start with original size, then
+ // scale down in multiple passes with drawImage()
+ // until the target size is reached
+ w = img.getWidth();
+ h = img.getHeight();
+ } else {
+ // Use one-step technique: scale directly from original
+ // size to target size with a single drawImage() call
+ w = targetWidth;
+ h = targetHeight;
+ }
+
+ do {
+ if (higherQuality && w > targetWidth) {
+ w /= 2;
+ if (w < targetWidth) {
+ w = targetWidth;
+ }
+ }
+
+ if (higherQuality && h > targetHeight) {
+ h /= 2;
+ if (h < targetHeight) {
+ h = targetHeight;
+ }
+ }
+
+ BufferedImage tmp = new BufferedImage(w, h, type);
+ Graphics2D g2 = tmp.createGraphics();
+ g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, hint);
+ g2.drawImage(ret, 0, 0, w, h, null);
+ g2.dispose();
+
+ ret = tmp;
+ } while (w != targetWidth || h != targetHeight);
+
+ return ret;
+ }
+
+
+ public static BufferedImage resizeWithRatio(BufferedImage image, int destinationWidth, int destinationHeight) {
+
+ int type = image.getType() == 0? BufferedImage.TYPE_INT_ARGB : image.getType();
+
+ //*Special* if the width or height is 0 use image src dimensions
+ if (destinationWidth == 0) {
+ destinationWidth = image.getWidth();
+ }
+ if (destinationHeight == 0) {
+ destinationHeight = image.getHeight();
+ }
+
+ int fHeight = destinationHeight;
+ int fWidth = destinationWidth;
+
+ //Work out the resized width/height
+ if (image.getHeight() > destinationHeight || image.getWidth() > destinationWidth) {
+ fHeight = destinationHeight;
+ int wid = destinationWidth;
+ float sum = (float)image.getWidth() / (float)image.getHeight();
+ fWidth = Math.round(fHeight * sum);
+
+ if (fWidth > wid) {
+ //rezise again for the width this time
+ fHeight = Math.round(wid/sum);
+ fWidth = wid;
+ }
+ }
+
+ BufferedImage resizedImage = new BufferedImage(fWidth, fHeight, type);
+ Graphics2D g = resizedImage.createGraphics();
+ g.setComposite(AlphaComposite.Src);
+
+ g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+ g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
+ g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+
+ g.drawImage(image, 0, 0, fWidth, fHeight, null);
+ g.dispose();
+
+ return resizedImage;
+ }
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/utils/ProductPriceUtils.java b/sm-core/src/main/java/com/salesmanager/core/business/utils/ProductPriceUtils.java
index 0200cd0..3167883 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/utils/ProductPriceUtils.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/utils/ProductPriceUtils.java
@@ -1,614 +1,614 @@
-package com.salesmanager.core.business.utils;
-
-import java.math.BigDecimal;
-import java.text.NumberFormat;
-import java.util.ArrayList;
-import java.util.Currency;
-import java.util.Date;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.Validate;
-import org.apache.commons.validator.routines.BigDecimalValidator;
-import org.apache.commons.validator.routines.CurrencyValidator;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
-
-import com.salesmanager.core.business.constants.Constants;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
-import com.salesmanager.core.model.catalog.product.availability.ProductAvailability;
-import com.salesmanager.core.model.catalog.product.price.FinalPrice;
-import com.salesmanager.core.model.catalog.product.price.ProductPrice;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.orderproduct.OrderProduct;
-
-
-/**
- * This class determines the price that is displayed in the catalogue for a given item.
- * It does not calculate the total price for a given item
- * @author casams1
- *
- */
-@Component("priceUtil")
-public class ProductPriceUtils {
-
- private final static char DECIMALCOUNT = '2';
- private final static char DECIMALPOINT = '.';
- private final static char THOUSANDPOINT = ',';
-
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ProductPriceUtils.class);
-
-
-
- /**
- * Get the price without discount
- * @param store
- * @param product
- * @param locale
- * @return
- */
- public BigDecimal getPrice(MerchantStore store, Product product, Locale locale) {
-
- BigDecimal defaultPrice = new BigDecimal(0);
-
- Set<ProductAvailability> availabilities = product.getAvailabilities();
- for(ProductAvailability availability : availabilities) {
-
- Set<ProductPrice> prices = availability.getPrices();
- for(ProductPrice price : prices) {
-
- if(price.isDefaultPrice()) {
- defaultPrice = price.getProductPriceAmount();
- }
- }
- }
-
- return defaultPrice;
- }
-
- /**
- * This method calculates the final price taking into account
- * all attributes included having a specified default attribute with an attribute price gt 0
- * in the product object. The calculation is based
- * on the default price.
- * Attributes may be null
- * @param Product
- * @param List<ProductAttribute>
- * @return FinalPrice
- */
- public FinalPrice getFinalProductPrice(Product product, List<ProductAttribute> attributes) {
-
-
- FinalPrice finalPrice = calculateFinalPrice(product);
-
- //attributes
- BigDecimal attributePrice = null;
- if(attributes!=null && attributes.size()>0) {
- for(ProductAttribute attribute : attributes) {
- if(attribute.getProductAttributePrice()!=null && attribute.getProductAttributePrice().doubleValue()>0) {
- if(attributePrice==null) {
- attributePrice = new BigDecimal(0);
- }
- attributePrice = attributePrice.add(attribute.getProductAttributePrice());
- }
- }
-
- if(attributePrice!=null && attributePrice.doubleValue()>0) {
- BigDecimal fp = finalPrice.getFinalPrice();
- fp = fp.add(attributePrice);
- finalPrice.setFinalPrice(fp);
-
- BigDecimal op = finalPrice.getOriginalPrice();
- op = op.add(attributePrice);
- finalPrice.setOriginalPrice(op);
-
- BigDecimal dp = finalPrice.getDiscountedPrice();
- if(dp!=null) {
- dp = dp.add(attributePrice);
- finalPrice.setDiscountedPrice(dp);
- }
-
- }
- }
-
-
- return finalPrice;
-
- }
-
-
- /**
- * This is the final price calculated from all configured prices
- * and all possibles discounts. This price does not calculate the attributes
- * or other prices than the default one
- * @param store
- * @param product
- * @param locale
- * @return
- */
- public FinalPrice getFinalPrice(Product product) {
-
-
-
- FinalPrice finalPrice = calculateFinalPrice(product);
-
- //attributes
- BigDecimal attributePrice = null;
- if(product.getAttributes()!=null && product.getAttributes().size()>0) {
- for(ProductAttribute attribute : product.getAttributes()) {
- if(attribute.getAttributeDefault()) {
- if(attribute.getProductAttributePrice()!=null && attribute.getProductAttributePrice().doubleValue()>0) {
- if(attributePrice==null) {
- attributePrice = new BigDecimal(0);
- }
- attributePrice = attributePrice.add(attribute.getProductAttributePrice());
- }
- }
- }
-
- if(attributePrice!=null && attributePrice.doubleValue()>0) {
- BigDecimal fp = finalPrice.getFinalPrice();
- fp = fp.add(attributePrice);
- finalPrice.setFinalPrice(fp);
-
- BigDecimal op = finalPrice.getOriginalPrice();
- op = op.add(attributePrice);
- finalPrice.setOriginalPrice(op);
- }
- }
-
- return finalPrice;
-
- }
-
-
-
-
- /**
- * This is the format that will be displayed
- * in the admin input text fields when editing
- * an entity having a BigDecimal to be displayed
- * as a raw amount 1,299.99
- * The admin user will also be force to input
- * the amount using that format
- * @param store
- * @param amount
- * @return
- * @throws Exception
- */
- public String getAdminFormatedAmount(MerchantStore store, BigDecimal amount) throws Exception {
-
- if(amount==null) {
- return "";
- }
-
- NumberFormat nf = null;
-
-
- nf = NumberFormat.getInstance(Constants.DEFAULT_LOCALE);
-
- nf.setMaximumFractionDigits(Integer.parseInt(Character
- .toString(DECIMALCOUNT)));
- nf.setMinimumFractionDigits(Integer.parseInt(Character
- .toString(DECIMALCOUNT)));
-
- return nf.format(amount);
- }
-
-
- /**
- * This method has to be used to format store front amounts
- * It will display national format amount ex:
- * $1,345.99
- * Rs.1.345.99
- * or international format
- * USD1,345.79
- * INR1,345.79
- * @param store
- * @param amount
- * @return String
- * @throws Exception
- */
- public String getStoreFormatedAmountWithCurrency(MerchantStore store, BigDecimal amount) throws Exception {
- if(amount==null) {
- return "";
- }
-
-
-
- Currency currency = Constants.DEFAULT_CURRENCY;
- Locale locale = Constants.DEFAULT_LOCALE;
-
- try {
-
- currency = store.getCurrency().getCurrency();
- locale = new Locale(store.getDefaultLanguage().getCode(),store.getCountry().getIsoCode());
- } catch (Exception e) {
- LOGGER.error("Cannot create currency or locale instance for store " + store.getCode());
- }
-
-
- NumberFormat currencyInstance = null;
-
-
- if(store.isCurrencyFormatNational()) {
- currencyInstance = NumberFormat.getCurrencyInstance(locale);//national
- } else {
- currencyInstance = NumberFormat.getCurrencyInstance();//international
- }
- currencyInstance.setCurrency(currency);
-
-
- return currencyInstance.format(amount.doubleValue());
-
-
- }
-
-
- public String getFormatedAmountWithCurrency(Locale locale, com.salesmanager.core.model.reference.currency.Currency currency, BigDecimal amount) throws Exception {
- if(amount==null) {
- return "";
- }
-
- Currency curr = currency.getCurrency();
-
-
-
- NumberFormat currencyInstance = null;
-
- currencyInstance = NumberFormat.getCurrencyInstance(locale);
- currencyInstance.setCurrency(curr);
- return currencyInstance.format(amount.doubleValue());
-
-
- }
-
-
-
- /**
- * This method will return the required formated amount
- * with the appropriate currency
- * @param store
- * @param amount
- * @return
- * @throws Exception
- */
- public String getAdminFormatedAmountWithCurrency(MerchantStore store, BigDecimal amount) throws Exception {
- if(amount==null) {
- return "";
- }
-
-
-
-
- NumberFormat nf = null;
-
-
- Currency currency = store.getCurrency().getCurrency();
- nf = NumberFormat.getInstance(Constants.DEFAULT_LOCALE);
- nf.setMaximumFractionDigits(Integer.parseInt(Character
- .toString(DECIMALCOUNT)));
- nf.setMinimumFractionDigits(Integer.parseInt(Character
- .toString(DECIMALCOUNT)));
- nf.setCurrency(currency);
-
-
- return nf.format(amount);
- }
-
- /**
- * Returns a formatted amount using Shopizer Currency
- * requires internal java.util.Currency populated
- * @param currency
- * @param amount
- * @return
- * @throws Exception
- */
- public String getFormatedAmountWithCurrency(com.salesmanager.core.model.reference.currency.Currency currency, BigDecimal amount) throws Exception {
- if(amount==null) {
- return "";
- }
-
- Validate.notNull(currency.getCurrency(),"Currency must be populated with java.util.Currency");
-
- NumberFormat nf = null;
-
-
- Currency curr = currency.getCurrency();
- nf = NumberFormat.getInstance(Constants.DEFAULT_LOCALE);
- nf.setMaximumFractionDigits(Integer.parseInt(Character
- .toString(DECIMALCOUNT)));
- nf.setMinimumFractionDigits(Integer.parseInt(Character
- .toString(DECIMALCOUNT)));
- nf.setCurrency(curr);
-
-
- String stringNumber = nf.format(amount);
-
- return stringNumber;
- }
-
- /**
- * This amount will be displayed to the end user
- * @param store
- * @param amount
- * @param locale
- * @return
- * @throws Exception
- */
- public String getFormatedAmountWithCurrency(MerchantStore store, BigDecimal amount, Locale locale)
- throws Exception {
-
- NumberFormat nf = null;
-
- Currency currency = store.getCurrency().getCurrency();
-
- nf = NumberFormat.getInstance(locale);
- nf.setCurrency(currency);
- nf.setMaximumFractionDigits(Integer.parseInt(Character
- .toString(DECIMALCOUNT)));
- nf.setMinimumFractionDigits(Integer.parseInt(Character
- .toString(DECIMALCOUNT)));
-
-
-
- return nf.format(amount);
-
- }
-
- /**
- * Transformation of an amount of money submited by the admin
- * user to be inserted as a BigDecimal in the database
- * @param amount
- * @param locale
- * @return
- * @throws Exception
- */
- public BigDecimal getAmount(String amount) throws Exception {
-
- // validations
- /**
- * 1) remove decimal and thousand
- *
- * String.replaceAll(decimalPoint, ""); String.replaceAll(thousandPoint,
- * "");
- *
- * Should be able to parse to Integer
- */
- StringBuffer newAmount = new StringBuffer();
- for (int i = 0; i < amount.length(); i++) {
- if (amount.charAt(i) != DECIMALPOINT
- && amount.charAt(i) != THOUSANDPOINT) {
- newAmount.append(amount.charAt(i));
- }
- }
-
- try {
- Integer.parseInt(newAmount.toString());
- } catch (Exception e) {
- throw new Exception("Cannot parse " + amount);
- }
-
- if (!amount.contains(Character.toString(DECIMALPOINT))
- && !amount.contains(Character.toString(THOUSANDPOINT))
- && !amount.contains(" ")) {
-
- if (matchPositiveInteger(amount)) {
- BigDecimalValidator validator = CurrencyValidator.getInstance();
- BigDecimal bdamount = validator.validate(amount, Locale.US);
- if (bdamount == null) {
- throw new Exception("Cannot parse " + amount);
- } else {
- return bdamount;
- }
- } else {
- throw new Exception("Not a positive integer "
- + amount);
- }
-
- } else {
- //TODO should not go this path in this current release
- StringBuffer pat = new StringBuffer();
-
- if (!StringUtils.isBlank(Character.toString(THOUSANDPOINT))) {
- pat.append("\\d{1,3}(" + THOUSANDPOINT + "?\\d{3})*");
- }
-
- pat.append("(\\" + DECIMALPOINT + "\\d{1," + DECIMALCOUNT + "})");
-
- Pattern pattern = Pattern.compile(pat.toString());
- Matcher matcher = pattern.matcher(amount);
-
- if (matcher.matches()) {
-
- Locale locale = Constants.DEFAULT_LOCALE;
- //TODO validate amount using old test case
- if (DECIMALPOINT == ',') {
- locale = Locale.GERMAN;
- }
-
- BigDecimalValidator validator = CurrencyValidator.getInstance();
- BigDecimal bdamount = validator.validate(amount, locale);
-
- return bdamount;
- } else {
- throw new Exception("Cannot parse " + amount);
- }
- }
-
- }
-
- public BigDecimal getOrderProductTotalPrice(MerchantStore store, OrderProduct orderProduct) {
-
- BigDecimal finalPrice = orderProduct.getOneTimeCharge();
- finalPrice = finalPrice.multiply(new BigDecimal(orderProduct.getProductQuantity()));
- return finalPrice;
- }
-
- /**
- * Determines if a ProductPrice has a discount
- * @param productPrice
- * @return
- */
- public boolean hasDiscount(ProductPrice productPrice) {
-
-
- Date today = new Date();
-
- //calculate discount price
- boolean hasDiscount = false;
- if(productPrice.getProductPriceSpecialStartDate()!=null
- || productPrice.getProductPriceSpecialEndDate()!=null) {
-
-
- if(productPrice.getProductPriceSpecialStartDate()!=null) {
- if(productPrice.getProductPriceSpecialStartDate().before(today)) {
- if(productPrice.getProductPriceSpecialEndDate()!=null) {
- if(productPrice.getProductPriceSpecialEndDate().after(today)) {
- hasDiscount = true;
- }
- }
- }
- }
- }
-
- return hasDiscount;
-
-
-
- }
-
- private boolean matchPositiveInteger(String amount) {
-
- Pattern pattern = Pattern.compile("^[+]?\\d*$");
- Matcher matcher = pattern.matcher(amount);
- if (matcher.matches()) {
- return true;
-
- } else {
- return false;
- }
- }
-
- private FinalPrice calculateFinalPrice(Product product) {
-
- FinalPrice finalPrice = null;;
- List<FinalPrice> otherPrices = null;
-
-
- Set<ProductAvailability> availabilities = product.getAvailabilities();
- for(ProductAvailability availability : availabilities) {
- if(availability.getRegion().equals(Constants.ALL_REGIONS)) {//TODO REL 2.1 accept a region
- Set<ProductPrice> prices = availability.getPrices();
- for(ProductPrice price : prices) {
-
- FinalPrice p = finalPrice(price);
- if(price.isDefaultPrice()) {
- finalPrice = p;
- } else {
- if(otherPrices==null) {
- otherPrices = new ArrayList<FinalPrice>();
- }
- otherPrices.add(p);
- }
- }
- }
- }
-
-
- if(finalPrice!=null) {
- finalPrice.setAdditionalPrices(otherPrices);
- } else {
- if(otherPrices!=null) {
- finalPrice = otherPrices.get(0);
- }
- }
-
- return finalPrice;
-
-
- }
-
- private FinalPrice finalPrice(ProductPrice price) {
-
- FinalPrice finalPrice = new FinalPrice();
- BigDecimal fPrice = price.getProductPriceAmount();
- BigDecimal oPrice = price.getProductPriceAmount();
-
- Date today = new Date();
- //calculate discount price
- boolean hasDiscount = false;
- if(price.getProductPriceSpecialStartDate()!=null
- || price.getProductPriceSpecialEndDate()!=null) {
-
-
- if(price.getProductPriceSpecialStartDate()!=null) {
- if(price.getProductPriceSpecialStartDate().before(today)) {
- if(price.getProductPriceSpecialEndDate()!=null) {
- if(price.getProductPriceSpecialEndDate().after(today)) {
- hasDiscount = true;
- fPrice = price.getProductPriceSpecialAmount();
- finalPrice.setDiscountEndDate(price.getProductPriceSpecialEndDate());
- }
- }
-
- }
- }
-
-
- if(!hasDiscount && price.getProductPriceSpecialStartDate()==null && price.getProductPriceSpecialEndDate()!=null) {
- if(price.getProductPriceSpecialEndDate().after(today)) {
- hasDiscount = true;
- fPrice = price.getProductPriceSpecialAmount();
- finalPrice.setDiscountEndDate(price.getProductPriceSpecialEndDate());
- }
- }
- } else {
- if(price.getProductPriceSpecialAmount()!=null && price.getProductPriceSpecialAmount().doubleValue()>0) {
- hasDiscount = true;
- fPrice = price.getProductPriceSpecialAmount();
- finalPrice.setDiscountEndDate(price.getProductPriceSpecialEndDate());
- }
- }
-
- finalPrice.setProductPrice(price);
- finalPrice.setFinalPrice(fPrice);
- finalPrice.setOriginalPrice(oPrice);
-
-
- if(price.isDefaultPrice()) {
- finalPrice.setDefaultPrice(true);
- }
- if(hasDiscount) {
- discountPrice(finalPrice);
- }
-
-
- return finalPrice;
- }
-
- private void discountPrice(FinalPrice finalPrice) {
-
- finalPrice.setDiscounted(true);
-
- double arith = finalPrice.getProductPrice().getProductPriceSpecialAmount().doubleValue() / finalPrice.getProductPrice().getProductPriceAmount().doubleValue();
- double fsdiscount = 100 - (arith * 100);
- Float percentagediscount = new Float(fsdiscount);
- int percent = percentagediscount.intValue();
- finalPrice.setDiscountPercent(percent);
-
- //calculate percent
- BigDecimal price = finalPrice.getOriginalPrice();
- finalPrice.setDiscountedPrice(finalPrice.getProductPrice().getProductPriceSpecialAmount());
- }
-
-
-
-}
+package com.salesmanager.core.business.utils;
+
+import java.math.BigDecimal;
+import java.text.NumberFormat;
+import java.util.ArrayList;
+import java.util.Currency;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.Validate;
+import org.apache.commons.validator.routines.BigDecimalValidator;
+import org.apache.commons.validator.routines.CurrencyValidator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+import com.salesmanager.core.business.constants.Constants;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
+import com.salesmanager.core.model.catalog.product.availability.ProductAvailability;
+import com.salesmanager.core.model.catalog.product.price.FinalPrice;
+import com.salesmanager.core.model.catalog.product.price.ProductPrice;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.orderproduct.OrderProduct;
+
+
+/**
+ * This class determines the price that is displayed in the catalogue for a given item.
+ * It does not calculate the total price for a given item
+ * @author casams1
+ *
+ */
+@Component("priceUtil")
+public class ProductPriceUtils {
+
+ private final static char DECIMALCOUNT = '2';
+ private final static char DECIMALPOINT = '.';
+ private final static char THOUSANDPOINT = ',';
+
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ProductPriceUtils.class);
+
+
+
+ /**
+ * Get the price without discount
+ * @param store
+ * @param product
+ * @param locale
+ * @return
+ */
+ public BigDecimal getPrice(MerchantStore store, Product product, Locale locale) {
+
+ BigDecimal defaultPrice = new BigDecimal(0);
+
+ Set<ProductAvailability> availabilities = product.getAvailabilities();
+ for(ProductAvailability availability : availabilities) {
+
+ Set<ProductPrice> prices = availability.getPrices();
+ for(ProductPrice price : prices) {
+
+ if(price.isDefaultPrice()) {
+ defaultPrice = price.getProductPriceAmount();
+ }
+ }
+ }
+
+ return defaultPrice;
+ }
+
+ /**
+ * This method calculates the final price taking into account
+ * all attributes included having a specified default attribute with an attribute price gt 0
+ * in the product object. The calculation is based
+ * on the default price.
+ * Attributes may be null
+ * @param Product
+ * @param List<ProductAttribute>
+ * @return FinalPrice
+ */
+ public FinalPrice getFinalProductPrice(Product product, List<ProductAttribute> attributes) {
+
+
+ FinalPrice finalPrice = calculateFinalPrice(product);
+
+ //attributes
+ BigDecimal attributePrice = null;
+ if(attributes!=null && attributes.size()>0) {
+ for(ProductAttribute attribute : attributes) {
+ if(attribute.getProductAttributePrice()!=null && attribute.getProductAttributePrice().doubleValue()>0) {
+ if(attributePrice==null) {
+ attributePrice = new BigDecimal(0);
+ }
+ attributePrice = attributePrice.add(attribute.getProductAttributePrice());
+ }
+ }
+
+ if(attributePrice!=null && attributePrice.doubleValue()>0) {
+ BigDecimal fp = finalPrice.getFinalPrice();
+ fp = fp.add(attributePrice);
+ finalPrice.setFinalPrice(fp);
+
+ BigDecimal op = finalPrice.getOriginalPrice();
+ op = op.add(attributePrice);
+ finalPrice.setOriginalPrice(op);
+
+ BigDecimal dp = finalPrice.getDiscountedPrice();
+ if(dp!=null) {
+ dp = dp.add(attributePrice);
+ finalPrice.setDiscountedPrice(dp);
+ }
+
+ }
+ }
+
+
+ return finalPrice;
+
+ }
+
+
+ /**
+ * This is the final price calculated from all configured prices
+ * and all possibles discounts. This price does not calculate the attributes
+ * or other prices than the default one
+ * @param store
+ * @param product
+ * @param locale
+ * @return
+ */
+ public FinalPrice getFinalPrice(Product product) {
+
+
+
+ FinalPrice finalPrice = calculateFinalPrice(product);
+
+ //attributes
+ BigDecimal attributePrice = null;
+ if(product.getAttributes()!=null && product.getAttributes().size()>0) {
+ for(ProductAttribute attribute : product.getAttributes()) {
+ if(attribute.getAttributeDefault()) {
+ if(attribute.getProductAttributePrice()!=null && attribute.getProductAttributePrice().doubleValue()>0) {
+ if(attributePrice==null) {
+ attributePrice = new BigDecimal(0);
+ }
+ attributePrice = attributePrice.add(attribute.getProductAttributePrice());
+ }
+ }
+ }
+
+ if(attributePrice!=null && attributePrice.doubleValue()>0) {
+ BigDecimal fp = finalPrice.getFinalPrice();
+ fp = fp.add(attributePrice);
+ finalPrice.setFinalPrice(fp);
+
+ BigDecimal op = finalPrice.getOriginalPrice();
+ op = op.add(attributePrice);
+ finalPrice.setOriginalPrice(op);
+ }
+ }
+
+ return finalPrice;
+
+ }
+
+
+
+
+ /**
+ * This is the format that will be displayed
+ * in the admin input text fields when editing
+ * an entity having a BigDecimal to be displayed
+ * as a raw amount 1,299.99
+ * The admin user will also be force to input
+ * the amount using that format
+ * @param store
+ * @param amount
+ * @return
+ * @throws Exception
+ */
+ public String getAdminFormatedAmount(MerchantStore store, BigDecimal amount) throws Exception {
+
+ if(amount==null) {
+ return "";
+ }
+
+ NumberFormat nf = null;
+
+
+ nf = NumberFormat.getInstance(Constants.DEFAULT_LOCALE);
+
+ nf.setMaximumFractionDigits(Integer.parseInt(Character
+ .toString(DECIMALCOUNT)));
+ nf.setMinimumFractionDigits(Integer.parseInt(Character
+ .toString(DECIMALCOUNT)));
+
+ return nf.format(amount);
+ }
+
+
+ /**
+ * This method has to be used to format store front amounts
+ * It will display national format amount ex:
+ * $1,345.99
+ * Rs.1.345.99
+ * or international format
+ * USD1,345.79
+ * INR1,345.79
+ * @param store
+ * @param amount
+ * @return String
+ * @throws Exception
+ */
+ public String getStoreFormatedAmountWithCurrency(MerchantStore store, BigDecimal amount) throws Exception {
+ if(amount==null) {
+ return "";
+ }
+
+
+
+ Currency currency = Constants.DEFAULT_CURRENCY;
+ Locale locale = Constants.DEFAULT_LOCALE;
+
+ try {
+
+ currency = store.getCurrency().getCurrency();
+ locale = new Locale(store.getDefaultLanguage().getCode(),store.getCountry().getIsoCode());
+ } catch (Exception e) {
+ LOGGER.error("Cannot create currency or locale instance for store " + store.getCode());
+ }
+
+
+ NumberFormat currencyInstance = null;
+
+
+ if(store.isCurrencyFormatNational()) {
+ currencyInstance = NumberFormat.getCurrencyInstance(locale);//national
+ } else {
+ currencyInstance = NumberFormat.getCurrencyInstance();//international
+ }
+ currencyInstance.setCurrency(currency);
+
+
+ return currencyInstance.format(amount.doubleValue());
+
+
+ }
+
+
+ public String getFormatedAmountWithCurrency(Locale locale, com.salesmanager.core.model.reference.currency.Currency currency, BigDecimal amount) throws Exception {
+ if(amount==null) {
+ return "";
+ }
+
+ Currency curr = currency.getCurrency();
+
+
+
+ NumberFormat currencyInstance = null;
+
+ currencyInstance = NumberFormat.getCurrencyInstance(locale);
+ currencyInstance.setCurrency(curr);
+ return currencyInstance.format(amount.doubleValue());
+
+
+ }
+
+
+
+ /**
+ * This method will return the required formated amount
+ * with the appropriate currency
+ * @param store
+ * @param amount
+ * @return
+ * @throws Exception
+ */
+ public String getAdminFormatedAmountWithCurrency(MerchantStore store, BigDecimal amount) throws Exception {
+ if(amount==null) {
+ return "";
+ }
+
+
+
+
+ NumberFormat nf = null;
+
+
+ Currency currency = store.getCurrency().getCurrency();
+ nf = NumberFormat.getInstance(Constants.DEFAULT_LOCALE);
+ nf.setMaximumFractionDigits(Integer.parseInt(Character
+ .toString(DECIMALCOUNT)));
+ nf.setMinimumFractionDigits(Integer.parseInt(Character
+ .toString(DECIMALCOUNT)));
+ nf.setCurrency(currency);
+
+
+ return nf.format(amount);
+ }
+
+ /**
+ * Returns a formatted amount using Shopizer Currency
+ * requires internal java.util.Currency populated
+ * @param currency
+ * @param amount
+ * @return
+ * @throws Exception
+ */
+ public String getFormatedAmountWithCurrency(com.salesmanager.core.model.reference.currency.Currency currency, BigDecimal amount) throws Exception {
+ if(amount==null) {
+ return "";
+ }
+
+ Validate.notNull(currency.getCurrency(),"Currency must be populated with java.util.Currency");
+
+ NumberFormat nf = null;
+
+
+ Currency curr = currency.getCurrency();
+ nf = NumberFormat.getInstance(Constants.DEFAULT_LOCALE);
+ nf.setMaximumFractionDigits(Integer.parseInt(Character
+ .toString(DECIMALCOUNT)));
+ nf.setMinimumFractionDigits(Integer.parseInt(Character
+ .toString(DECIMALCOUNT)));
+ nf.setCurrency(curr);
+
+
+ String stringNumber = nf.format(amount);
+
+ return stringNumber;
+ }
+
+ /**
+ * This amount will be displayed to the end user
+ * @param store
+ * @param amount
+ * @param locale
+ * @return
+ * @throws Exception
+ */
+ public String getFormatedAmountWithCurrency(MerchantStore store, BigDecimal amount, Locale locale)
+ throws Exception {
+
+ NumberFormat nf = null;
+
+ Currency currency = store.getCurrency().getCurrency();
+
+ nf = NumberFormat.getInstance(locale);
+ nf.setCurrency(currency);
+ nf.setMaximumFractionDigits(Integer.parseInt(Character
+ .toString(DECIMALCOUNT)));
+ nf.setMinimumFractionDigits(Integer.parseInt(Character
+ .toString(DECIMALCOUNT)));
+
+
+
+ return nf.format(amount);
+
+ }
+
+ /**
+ * Transformation of an amount of money submited by the admin
+ * user to be inserted as a BigDecimal in the database
+ * @param amount
+ * @param locale
+ * @return
+ * @throws Exception
+ */
+ public BigDecimal getAmount(String amount) throws Exception {
+
+ // validations
+ /**
+ * 1) remove decimal and thousand
+ *
+ * String.replaceAll(decimalPoint, ""); String.replaceAll(thousandPoint,
+ * "");
+ *
+ * Should be able to parse to Integer
+ */
+ StringBuffer newAmount = new StringBuffer();
+ for (int i = 0; i < amount.length(); i++) {
+ if (amount.charAt(i) != DECIMALPOINT
+ && amount.charAt(i) != THOUSANDPOINT) {
+ newAmount.append(amount.charAt(i));
+ }
+ }
+
+ try {
+ Integer.parseInt(newAmount.toString());
+ } catch (Exception e) {
+ throw new Exception("Cannot parse " + amount);
+ }
+
+ if (!amount.contains(Character.toString(DECIMALPOINT))
+ && !amount.contains(Character.toString(THOUSANDPOINT))
+ && !amount.contains(" ")) {
+
+ if (matchPositiveInteger(amount)) {
+ BigDecimalValidator validator = CurrencyValidator.getInstance();
+ BigDecimal bdamount = validator.validate(amount, Locale.US);
+ if (bdamount == null) {
+ throw new Exception("Cannot parse " + amount);
+ } else {
+ return bdamount;
+ }
+ } else {
+ throw new Exception("Not a positive integer "
+ + amount);
+ }
+
+ } else {
+ //TODO should not go this path in this current release
+ StringBuffer pat = new StringBuffer();
+
+ if (!StringUtils.isBlank(Character.toString(THOUSANDPOINT))) {
+ pat.append("\\d{1,3}(" + THOUSANDPOINT + "?\\d{3})*");
+ }
+
+ pat.append("(\\" + DECIMALPOINT + "\\d{1," + DECIMALCOUNT + "})");
+
+ Pattern pattern = Pattern.compile(pat.toString());
+ Matcher matcher = pattern.matcher(amount);
+
+ if (matcher.matches()) {
+
+ Locale locale = Constants.DEFAULT_LOCALE;
+ //TODO validate amount using old test case
+ if (DECIMALPOINT == ',') {
+ locale = Locale.GERMAN;
+ }
+
+ BigDecimalValidator validator = CurrencyValidator.getInstance();
+ BigDecimal bdamount = validator.validate(amount, locale);
+
+ return bdamount;
+ } else {
+ throw new Exception("Cannot parse " + amount);
+ }
+ }
+
+ }
+
+ public BigDecimal getOrderProductTotalPrice(MerchantStore store, OrderProduct orderProduct) {
+
+ BigDecimal finalPrice = orderProduct.getOneTimeCharge();
+ finalPrice = finalPrice.multiply(new BigDecimal(orderProduct.getProductQuantity()));
+ return finalPrice;
+ }
+
+ /**
+ * Determines if a ProductPrice has a discount
+ * @param productPrice
+ * @return
+ */
+ public boolean hasDiscount(ProductPrice productPrice) {
+
+
+ Date today = new Date();
+
+ //calculate discount price
+ boolean hasDiscount = false;
+ if(productPrice.getProductPriceSpecialStartDate()!=null
+ || productPrice.getProductPriceSpecialEndDate()!=null) {
+
+
+ if(productPrice.getProductPriceSpecialStartDate()!=null) {
+ if(productPrice.getProductPriceSpecialStartDate().before(today)) {
+ if(productPrice.getProductPriceSpecialEndDate()!=null) {
+ if(productPrice.getProductPriceSpecialEndDate().after(today)) {
+ hasDiscount = true;
+ }
+ }
+ }
+ }
+ }
+
+ return hasDiscount;
+
+
+
+ }
+
+ private boolean matchPositiveInteger(String amount) {
+
+ Pattern pattern = Pattern.compile("^[+]?\\d*$");
+ Matcher matcher = pattern.matcher(amount);
+ if (matcher.matches()) {
+ return true;
+
+ } else {
+ return false;
+ }
+ }
+
+ private FinalPrice calculateFinalPrice(Product product) {
+
+ FinalPrice finalPrice = null;;
+ List<FinalPrice> otherPrices = null;
+
+
+ Set<ProductAvailability> availabilities = product.getAvailabilities();
+ for(ProductAvailability availability : availabilities) {
+ if(availability.getRegion().equals(Constants.ALL_REGIONS)) {//TODO REL 2.1 accept a region
+ Set<ProductPrice> prices = availability.getPrices();
+ for(ProductPrice price : prices) {
+
+ FinalPrice p = finalPrice(price);
+ if(price.isDefaultPrice()) {
+ finalPrice = p;
+ } else {
+ if(otherPrices==null) {
+ otherPrices = new ArrayList<FinalPrice>();
+ }
+ otherPrices.add(p);
+ }
+ }
+ }
+ }
+
+
+ if(finalPrice!=null) {
+ finalPrice.setAdditionalPrices(otherPrices);
+ } else {
+ if(otherPrices!=null) {
+ finalPrice = otherPrices.get(0);
+ }
+ }
+
+ return finalPrice;
+
+
+ }
+
+ private FinalPrice finalPrice(ProductPrice price) {
+
+ FinalPrice finalPrice = new FinalPrice();
+ BigDecimal fPrice = price.getProductPriceAmount();
+ BigDecimal oPrice = price.getProductPriceAmount();
+
+ Date today = new Date();
+ //calculate discount price
+ boolean hasDiscount = false;
+ if(price.getProductPriceSpecialStartDate()!=null
+ || price.getProductPriceSpecialEndDate()!=null) {
+
+
+ if(price.getProductPriceSpecialStartDate()!=null) {
+ if(price.getProductPriceSpecialStartDate().before(today)) {
+ if(price.getProductPriceSpecialEndDate()!=null) {
+ if(price.getProductPriceSpecialEndDate().after(today)) {
+ hasDiscount = true;
+ fPrice = price.getProductPriceSpecialAmount();
+ finalPrice.setDiscountEndDate(price.getProductPriceSpecialEndDate());
+ }
+ }
+
+ }
+ }
+
+
+ if(!hasDiscount && price.getProductPriceSpecialStartDate()==null && price.getProductPriceSpecialEndDate()!=null) {
+ if(price.getProductPriceSpecialEndDate().after(today)) {
+ hasDiscount = true;
+ fPrice = price.getProductPriceSpecialAmount();
+ finalPrice.setDiscountEndDate(price.getProductPriceSpecialEndDate());
+ }
+ }
+ } else {
+ if(price.getProductPriceSpecialAmount()!=null && price.getProductPriceSpecialAmount().doubleValue()>0) {
+ hasDiscount = true;
+ fPrice = price.getProductPriceSpecialAmount();
+ finalPrice.setDiscountEndDate(price.getProductPriceSpecialEndDate());
+ }
+ }
+
+ finalPrice.setProductPrice(price);
+ finalPrice.setFinalPrice(fPrice);
+ finalPrice.setOriginalPrice(oPrice);
+
+
+ if(price.isDefaultPrice()) {
+ finalPrice.setDefaultPrice(true);
+ }
+ if(hasDiscount) {
+ discountPrice(finalPrice);
+ }
+
+
+ return finalPrice;
+ }
+
+ private void discountPrice(FinalPrice finalPrice) {
+
+ finalPrice.setDiscounted(true);
+
+ double arith = finalPrice.getProductPrice().getProductPriceSpecialAmount().doubleValue() / finalPrice.getProductPrice().getProductPriceAmount().doubleValue();
+ double fsdiscount = 100 - (arith * 100);
+ Float percentagediscount = new Float(fsdiscount);
+ int percent = percentagediscount.intValue();
+ finalPrice.setDiscountPercent(percent);
+
+ //calculate percent
+ BigDecimal price = finalPrice.getOriginalPrice();
+ finalPrice.setDiscountedPrice(finalPrice.getProductPrice().getProductPriceSpecialAmount());
+ }
+
+
+
+}
diff --git a/sm-core/src/main/java/com/salesmanager/core/business/utils/query/ProductQueryBuilder.java b/sm-core/src/main/java/com/salesmanager/core/business/utils/query/ProductQueryBuilder.java
index f83e134..dc139e0 100644
--- a/sm-core/src/main/java/com/salesmanager/core/business/utils/query/ProductQueryBuilder.java
+++ b/sm-core/src/main/java/com/salesmanager/core/business/utils/query/ProductQueryBuilder.java
@@ -1,67 +1,67 @@
-package com.salesmanager.core.business.utils.query;
-
-public class ProductQueryBuilder {
-
- public static String buildProductQuery() {
-
- StringBuilder qs = new StringBuilder();
-
- //option 1
- qs.append("select distinct p from Product as p ");
- qs.append("join fetch p.availabilities pa ");
- qs.append("join fetch p.descriptions pd ");
- qs.append("join fetch p.merchantStore pm ");
- qs.append("left join fetch pa.prices pap ");
- qs.append("left join fetch pap.descriptions papd ");
-
-
- //images
- qs.append("left join fetch p.images images ");
- //options
- qs.append("left join fetch p.attributes pattr ");
- qs.append("left join fetch pattr.productOption po ");
- qs.append("left join fetch po.descriptions pod ");
- qs.append("left join fetch pattr.productOptionValue pov ");
- qs.append("left join fetch pov.descriptions povd ");
- qs.append("left join fetch p.relationships pr ");//no relationships
- //other lefts
- qs.append("left join fetch p.manufacturer manuf ");
- qs.append("left join fetch manuf.descriptions manufd ");
- qs.append("left join fetch p.type type ");
- qs.append("left join fetch p.taxClass tx ");
-
-
-
- //option 2 no relationships
-
- qs.append("select distinct p from Product as p ");
- qs.append("join fetch p.merchantStore merch ");
- qs.append("join fetch p.availabilities pa ");
- qs.append("left join fetch pa.prices pap ");
-
- qs.append("join fetch p.descriptions pd ");
- qs.append("join fetch p.categories categs ");
-
- qs.append("left join fetch pap.descriptions papd ");
-
-
- //images
- qs.append("left join fetch p.images images ");
-
- //options (do not need attributes for listings)
- qs.append("left join fetch p.attributes pattr ");
- qs.append("left join fetch pattr.productOption po ");
- qs.append("left join fetch po.descriptions pod ");
- qs.append("left join fetch pattr.productOptionValue pov ");
- qs.append("left join fetch pov.descriptions povd ");
-
- //other lefts
- qs.append("left join fetch p.manufacturer manuf ");
- qs.append("left join fetch manuf.descriptions manufd ");
- qs.append("left join fetch p.type type ");
- qs.append("left join fetch p.taxClass tx ");
-
- return qs.toString();
- }
-
-}
+package com.salesmanager.core.business.utils.query;
+
+public class ProductQueryBuilder {
+
+ public static String buildProductQuery() {
+
+ StringBuilder qs = new StringBuilder();
+
+ //option 1
+ qs.append("select distinct p from Product as p ");
+ qs.append("join fetch p.availabilities pa ");
+ qs.append("join fetch p.descriptions pd ");
+ qs.append("join fetch p.merchantStore pm ");
+ qs.append("left join fetch pa.prices pap ");
+ qs.append("left join fetch pap.descriptions papd ");
+
+
+ //images
+ qs.append("left join fetch p.images images ");
+ //options
+ qs.append("left join fetch p.attributes pattr ");
+ qs.append("left join fetch pattr.productOption po ");
+ qs.append("left join fetch po.descriptions pod ");
+ qs.append("left join fetch pattr.productOptionValue pov ");
+ qs.append("left join fetch pov.descriptions povd ");
+ qs.append("left join fetch p.relationships pr ");//no relationships
+ //other lefts
+ qs.append("left join fetch p.manufacturer manuf ");
+ qs.append("left join fetch manuf.descriptions manufd ");
+ qs.append("left join fetch p.type type ");
+ qs.append("left join fetch p.taxClass tx ");
+
+
+
+ //option 2 no relationships
+
+ qs.append("select distinct p from Product as p ");
+ qs.append("join fetch p.merchantStore merch ");
+ qs.append("join fetch p.availabilities pa ");
+ qs.append("left join fetch pa.prices pap ");
+
+ qs.append("join fetch p.descriptions pd ");
+ qs.append("join fetch p.categories categs ");
+
+ qs.append("left join fetch pap.descriptions papd ");
+
+
+ //images
+ qs.append("left join fetch p.images images ");
+
+ //options (do not need attributes for listings)
+ qs.append("left join fetch p.attributes pattr ");
+ qs.append("left join fetch pattr.productOption po ");
+ qs.append("left join fetch po.descriptions pod ");
+ qs.append("left join fetch pattr.productOptionValue pov ");
+ qs.append("left join fetch pov.descriptions povd ");
+
+ //other lefts
+ qs.append("left join fetch p.manufacturer manuf ");
+ qs.append("left join fetch manuf.descriptions manufd ");
+ qs.append("left join fetch p.type type ");
+ qs.append("left join fetch p.taxClass tx ");
+
+ return qs.toString();
+ }
+
+}
diff --git a/sm-core/src/main/resources/authentication.properties b/sm-core/src/main/resources/authentication.properties
new file mode 100644
index 0000000..3243d23
--- /dev/null
+++ b/sm-core/src/main/resources/authentication.properties
@@ -0,0 +1,21 @@
+
+authToken.header=Authorization
+
+#JWT authentication configuration for sm-shop
+jwt.header=Authorization
+jwt.secret=aSecret
+jwt.expiration: 604800
+
+
+#Your facebook app informations
+facebook.app.id=138715906193252
+facebook.app.secret=e9efad42873b8aa578af19f8322302ad
+facebook.app.access_token=138715906193252|utXPWQLdW8J071nF6ZVMmhIK104
+
+
+
+
+
+
+
+
diff --git a/sm-core/src/main/resources/cms/infinispan_configuration.xml b/sm-core/src/main/resources/cms/infinispan_configuration.xml
index d66608f..0dc772c 100644
--- a/sm-core/src/main/resources/cms/infinispan_configuration.xml
+++ b/sm-core/src/main/resources/cms/infinispan_configuration.xml
@@ -1,62 +1,62 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<infinispan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-
- xsi:schemaLocation="urn:infinispan:config:6.0 http://www.infinispan.org/schemas/infinispan-config-6.0.xsd"
- xmlns="urn:infinispan:config:6.0">
-
- <global>
-
- <globalJmxStatistics enabled="false" jmxDomain="infinispan"/>
-
- </global>
-
- <default />
-
- <namedCache name="StoreRepository">
- <invocationBatching enabled="true"/>
- <!-- disable jmx in prod -->
- <jmxStatistics enabled="false"/>
- <persistence passivation="false">
-
- <store class="org.infinispan.persistence.file.SingleFileStore" fetchPersistentState="false"
- ignoreModifications="false" purgeOnStartup="false" shared="false" preload="false">
- <properties>
- <property name="location" value="./files/store"/>
- </properties>
- </store>
-
- </persistence>
-
- <eviction maxEntries="10" strategy="LRU"/>
-
- <transaction
- transactionManagerLookupClass="org.infinispan.transaction.lookup.DummyTransactionManagerLookup"
- transactionMode="TRANSACTIONAL" lockingMode="OPTIMISTIC" />
-
- </namedCache>
-
- <namedCache name="FilesRepository">
- <invocationBatching enabled="true"/>
- <!-- disable jmx in prod -->
- <jmxStatistics enabled="true"/>
- <persistence passivation="false">
- <store class="org.infinispan.persistence.file.SingleFileStore" fetchPersistentState="false"
- ignoreModifications="false" purgeOnStartup="false" shared="false" preload="false">
- <properties>
- <property name="location" value="./files/repos"/>
- </properties>
- </store>
- </persistence>
-
- <transaction
-
- transactionManagerLookupClass="org.infinispan.transaction.lookup.DummyTransactionManagerLookup"
- transactionMode="TRANSACTIONAL" lockingMode="OPTIMISTIC" />
-
- </namedCache>
-
-
-
-</infinispan>
-
+<?xml version="1.0" encoding="UTF-8"?>
+
+<infinispan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+
+ xsi:schemaLocation="urn:infinispan:config:6.0 http://www.infinispan.org/schemas/infinispan-config-6.0.xsd"
+ xmlns="urn:infinispan:config:6.0">
+
+ <global>
+
+ <globalJmxStatistics enabled="false" jmxDomain="infinispan"/>
+
+ </global>
+
+ <default />
+
+ <namedCache name="StoreRepository">
+ <invocationBatching enabled="true"/>
+ <!-- disable jmx in prod -->
+ <jmxStatistics enabled="false"/>
+ <persistence passivation="false">
+
+ <store class="org.infinispan.persistence.file.SingleFileStore" fetchPersistentState="false"
+ ignoreModifications="false" purgeOnStartup="false" shared="false" preload="false">
+ <properties>
+ <property name="location" value="./files/store"/>
+ </properties>
+ </store>
+
+ </persistence>
+
+ <eviction maxEntries="10" strategy="LRU"/>
+
+ <transaction
+ transactionManagerLookupClass="org.infinispan.transaction.lookup.DummyTransactionManagerLookup"
+ transactionMode="TRANSACTIONAL" lockingMode="OPTIMISTIC" />
+
+ </namedCache>
+
+ <namedCache name="FilesRepository">
+ <invocationBatching enabled="true"/>
+ <!-- disable jmx in prod -->
+ <jmxStatistics enabled="true"/>
+ <persistence passivation="false">
+ <store class="org.infinispan.persistence.file.SingleFileStore" fetchPersistentState="false"
+ ignoreModifications="false" purgeOnStartup="false" shared="false" preload="false">
+ <properties>
+ <property name="location" value="./files/repos"/>
+ </properties>
+ </store>
+ </persistence>
+
+ <transaction
+
+ transactionManagerLookupClass="org.infinispan.transaction.lookup.DummyTransactionManagerLookup"
+ transactionMode="TRANSACTIONAL" lockingMode="OPTIMISTIC" />
+
+ </namedCache>
+
+
+
+</infinispan>
+
sm-core/src/main/resources/configs.properties 35(+19 -16)
diff --git a/sm-core/src/main/resources/configs.properties b/sm-core/src/main/resources/configs.properties
index b3f007a..666613f 100644
--- a/sm-core/src/main/resources/configs.properties
+++ b/sm-core/src/main/resources/configs.properties
@@ -1,16 +1,19 @@
-#Must be 16 digits (replace with your own creation !)
-secretKey=7070200000000007
-
-
-
-#Elastic Search configurations
-elasticsearch.cluster.name=shopizer
-elasticsearch.mode=remote
-elasticsearch.server.host=http://localhost
-elasticsearch.server.port=9200
-elasticsearch.server.proxy.user=
-elasticsearch.server.proxy.password=
-
-# Infinispan Configuration
-infinispan.cache.location=./infinispan
-
+#Must be 16 digits (replace with your own creation !)
+secretKey=7070200000000007
+
+
+
+#Elastic Search configurations
+elasticsearch.cluster.name=shopizer
+elasticsearch.mode=remote
+elasticsearch.server.host=http://localhost
+elasticsearch.server.port=9200
+elasticsearch.server.proxy.user=
+elasticsearch.server.proxy.password=
+
+# Infinispan Configuration
+infinispan.cache.location=./infinispan
+
+shippingDistancePreProcessor.apiKey=AIzaSyCFqjgSH_6_ktwKLcVi-IRojLx2iRWlcig
+
+
diff --git a/sm-core/src/main/resources/email.properties b/sm-core/src/main/resources/email.properties
index dea22dd..4bedfaf 100644
--- a/sm-core/src/main/resources/email.properties
+++ b/sm-core/src/main/resources/email.properties
@@ -1,9 +1,9 @@
-#GMail sample configuration
-#May require a keystore for certificates
-mailSender.protocol=smtps
-mailSender.host=smtp.gmail.com
-mailSender.port=465
-mailSender.username=youremail@gmail.com
-mailSender.password=yourpassword
-mailSender.mail.smtp.auth=true
+#GMail sample configuration
+#May require a keystore for certificates
+mailSender.protocol=smtps
+mailSender.host=smtp.gmail.com
+mailSender.port=465
+mailSender.username=youremail@gmail.com
+mailSender.password=yourpassword
+mailSender.mail.smtp.auth=true
mail.smtp.starttls.enable=true
\ No newline at end of file
diff --git a/sm-core/src/main/resources/reference/integrationmodules.json b/sm-core/src/main/resources/reference/integrationmodules.json
index 4352c9d..261ed92 100644
--- a/sm-core/src/main/resources/reference/integrationmodules.json
+++ b/sm-core/src/main/resources/reference/integrationmodules.json
@@ -1,99 +1,110 @@
-[
- {
- "module": "SHIPPING",
- "code": "usps",
- "version":"",
- "regions": ["US"],
- "image":"usps.jpg",
- "configuration":[{"env":"TEST","scheme":"http","host":"testing.shippingapis.com","port":"80","uri":"/ShippingAPI.dll"},{"env":"PROD","scheme":"http","host":"production.shippingapis.com","port":"80","uri":"/ShippingAPI.dll"}]
-
- },
- {
- "module": "SHIPPING",
- "code": "canadapost",
- "version":"",
- "regions": ["CA"],
- "image":"canadapost.jpg",
- "configuration":[{"env":"TEST","scheme":"https","host":"ct.soa-gw.canadapost.ca","port":"443","uri":"/rs/ship/price"},{"env":"PROD","scheme":"https","host":"soa-gw.canadapost.ca","port":"443","uri":"/rs/ship/price"}]
-
- },
- {
- "module": "SHIPPING",
- "code": "ups",
- "version":"",
- "regions": ["US","CA","FR","GB"],
- "image":"ups.jpg",
- "configuration":[{"env":"TEST","scheme":"https","host":"wwwcie.ups.com","port":"443","uri":"/ups.app/xml/Rate"},{"env":"PROD","scheme":"https","host":"onlinetools.ups.com","port":"443","uri":"/xml/Rate"}],
- "details":{"01":"UPS Next Day Air","02":"UPS Second Day Air","03":"UPS Ground","07":"UPS Worldwide Express","08":"UPS Worldwide Expedited","11":"UPS Standard","12":"UPS Three-Day Select","13":"UPS Next Day Air Saver","14":"UPS Next Day Air Early A.M.","54":"UPS Worldwide Express Plus","59":"UPS Second Day Air A.M.","69":"UPS Saver"}
-
- },
- {
- "module": "SHIPPING",
- "code": "weightBased",
- "customModule":"true",
- "version":"1.0",
- "regions": ["*"]
- },
- {
- "module": "SHIPPING",
- "code": "customQuotesRules",
- "version":"1.0",
- "regions": ["*"]
- },
- {
- "module": "SHIPPING",
- "code": "priceByDistance",
- "version":"1.0",
- "regions": ["*"]
- },
- {
- "module": "SHIPPING",
- "code": "storePickUp",
- "version":"1.0",
- "regions": ["*"]
- },
- {
- "module": "PAYMENT",
- "code": "moneyorder",
- "type":"moneyorder",
- "version":"",
- "regions": ["*"],
- "image":"moneyorder.gif"
- },
- {
- "module": "PAYMENT",
- "code": "paypal-express-checkout",
- "type":"paypal",
- "version":"104.0",
- "regions": ["*"],
- "image":"icon-paypal.png",
- "configuration":[{"env":"TEST","scheme":"","host":"","port":"","uri":"","config1":"https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token="},{"env":"PROD","scheme":"","host":"","port":"","uri":"","config1":"https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token="}]
-
- },
-
-
- {
- "module": "PAYMENT",
- "code": "beanstream",
- "type":"creditcard",
- "version":"",
- "regions": ["US","CA","GB"],
- "image":"beanstream.gif",
- "configuration":[{"env":"TEST","scheme":"https","host":"www.beanstream.com","port":"443","uri":"/scripts/process_transaction.asp"},{"env":"PROD","scheme":"https","host":"www.beanstream.com","port":"443","uri":"/scripts/process_transaction.asp"}]
-
- },
-
-
- {
- "module": "PAYMENT",
- "code": "stripe",
- "type":"creditcard",
- "version":"",
- "regions": ["US","CA","GB","AU","FI","DK","IE","NO","SE"],
- "image":"stripe.png",
- "configuration":[{"env":"TEST","scheme":"https","host":"www.stripe.com","port":"443","uri":"/"},{"env":"PROD","scheme":"https","host":"www.stripe.com","port":"443","uri":"/"}]
-
- }
-
-]
-
+[
+ {
+ "module": "SHIPPING",
+ "code": "usps",
+ "version":"",
+ "regions": ["US"],
+ "image":"usps.jpg",
+ "configuration":[{"env":"TEST","scheme":"http","host":"testing.shippingapis.com","port":"80","uri":"/ShippingAPI.dll"},{"env":"PROD","scheme":"http","host":"production.shippingapis.com","port":"80","uri":"/ShippingAPI.dll"}]
+
+ },
+ {
+ "module": "SHIPPING",
+ "code": "canadapost",
+ "version":"",
+ "regions": ["CA"],
+ "image":"canadapost.jpg",
+ "configuration":[{"env":"TEST","scheme":"https","host":"ct.soa-gw.canadapost.ca","port":"443","uri":"/rs/ship/price"},{"env":"PROD","scheme":"https","host":"soa-gw.canadapost.ca","port":"443","uri":"/rs/ship/price"}]
+
+ },
+ {
+ "module": "SHIPPING",
+ "code": "ups",
+ "version":"",
+ "regions": ["US","CA","FR","GB"],
+ "image":"ups.jpg",
+ "configuration":[{"env":"TEST","scheme":"https","host":"wwwcie.ups.com","port":"443","uri":"/ups.app/xml/Rate"},{"env":"PROD","scheme":"https","host":"onlinetools.ups.com","port":"443","uri":"/xml/Rate"}],
+ "details":{"01":"UPS Next Day Air","02":"UPS Second Day Air","03":"UPS Ground","07":"UPS Worldwide Express","08":"UPS Worldwide Expedited","11":"UPS Standard","12":"UPS Three-Day Select","13":"UPS Next Day Air Saver","14":"UPS Next Day Air Early A.M.","54":"UPS Worldwide Express Plus","59":"UPS Second Day Air A.M.","69":"UPS Saver"}
+
+ },
+ {
+ "module": "SHIPPING",
+ "code": "weightBased",
+ "customModule":"true",
+ "version":"1.0",
+ "regions": ["*"]
+ },
+ {
+ "module": "SHIPPING",
+ "code": "customQuotesRules",
+ "version":"1.0",
+ "regions": ["*"]
+ },
+ {
+ "module": "SHIPPING",
+ "code": "priceByDistance",
+ "version":"1.0",
+ "regions": ["*"]
+ },
+ {
+ "module": "SHIPPING",
+ "code": "storePickUp",
+ "version":"1.0",
+ "regions": ["*"]
+ },
+ {
+ "module": "PAYMENT",
+ "code": "moneyorder",
+ "type":"moneyorder",
+ "version":"",
+ "regions": ["*"],
+ "image":"moneyorder.gif"
+ },
+ {
+ "module": "PAYMENT",
+ "code": "paypal-express-checkout",
+ "type":"paypal",
+ "version":"104.0",
+ "regions": ["*"],
+ "image":"icon-paypal.png",
+ "configuration":[{"env":"TEST","scheme":"","host":"","port":"","uri":"","config1":"https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token="},{"env":"PROD","scheme":"","host":"","port":"","uri":"","config1":"https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token="}]
+
+ },
+
+
+ {
+ "module": "PAYMENT",
+ "code": "beanstream",
+ "type":"creditcard",
+ "version":"",
+ "regions": ["US","CA","GB"],
+ "image":"beanstream.gif",
+ "configuration":[{"env":"TEST","scheme":"https","host":"www.beanstream.com","port":"443","uri":"/scripts/process_transaction.asp"},{"env":"PROD","scheme":"https","host":"www.beanstream.com","port":"443","uri":"/scripts/process_transaction.asp"}]
+
+ },
+
+
+ {
+ "module": "PAYMENT",
+ "code": "stripe",
+ "type":"creditcard",
+ "version":"",
+ "regions": ["US","CA","GB","AU","FI","DK","IE","NO","SE"],
+ "image":"stripe.png",
+ "configuration":[{"env":"TEST","scheme":"https","host":"www.stripe.com","port":"443","uri":"/"},{"env":"PROD","scheme":"https","host":"www.stripe.com","port":"443","uri":"/"}]
+
+ },
+
+ {
+ "module": "PAYMENT",
+ "code": "braintree",
+ "type":"creditcard",
+ "version":"",
+ "regions": ["US","CA","GB","AU","FI","DK","IE","NO","SE","AL","AD","AT","BY","BE","BG","HY","CY","CZ","FR","GR","IS","IE","IM","IT","PL","LU","CH","RS","SG","MY","HK","NZ"],
+ "image":"braintree.jpg",
+ "configuration":[{"env":"TEST","scheme":"https","host":"NOTREQUIRED","port":"NOTREQUIRED","uri":"NOTREQUIRED"},{"env":"PROD","scheme":"https","host":"NOTREQUIRED","port":"NOTREQUIRED","uri":"NOTREQUIRED"}]
+
+ }
+
+]
+
sm-core/src/main/resources/reference/zoneconfig.json 3774(+1887 -1887)
diff --git a/sm-core/src/main/resources/reference/zoneconfig.json b/sm-core/src/main/resources/reference/zoneconfig.json
index ac8d3a2..ba24b6e 100644
--- a/sm-core/src/main/resources/reference/zoneconfig.json
+++ b/sm-core/src/main/resources/reference/zoneconfig.json
@@ -1,1888 +1,1888 @@
-{
- "en":[
- {
- "zoneCode": "AL",
- "zoneName": "Alabama",
- "countryCode": "US"
- },
- {
- "zoneCode": "AK",
- "zoneName": "Alaska",
- "countryCode": "US"
- },
- {
- "zoneCode": "AS",
- "zoneName": "American Samoa",
- "countryCode": "US"
- },
- {
- "zoneCode": "AZ",
- "zoneName": "Arizona",
- "countryCode": "US"
- },
- {
- "zoneCode": "AR",
- "zoneName": "Arkansas",
- "countryCode": "US"
- },
- {
- "zoneCode": "AF",
- "zoneName": "Armed Forces Africa",
- "countryCode": "US"
- },
- {
- "zoneCode": "AA",
- "zoneName": "Armed Forces Americas",
- "countryCode": "US"
- },
- {
- "zoneCode": "AC",
- "zoneName": "Armed Forces Canada",
- "countryCode": "US"
- },
- {
- "zoneCode": "AE",
- "zoneName": "Armed Forces Europe",
- "countryCode": "US"
- },
- {
- "zoneCode": "AM",
- "zoneName": "Armed Forces Middle East",
- "countryCode": "US"
- },
- {
- "zoneCode": "AP",
- "zoneName": "Armed Forces Pacific",
- "countryCode": "US"
- },
- {
- "zoneCode": "CA",
- "zoneName": "California",
- "countryCode": "US"
- },
- {
- "zoneCode": "CO",
- "zoneName": "Colorado",
- "countryCode": "US"
- },
- {
- "zoneCode": "CT",
- "zoneName": "Connecticut",
- "countryCode": "US"
- },
- {
- "zoneCode": "DE",
- "zoneName": "Delaware",
- "countryCode": "US"
- },
- {
- "zoneCode": "DC",
- "zoneName": "District of Columbia",
- "countryCode": "US"
- },
- {
- "zoneCode": "FM",
- "zoneName": "Federated States Of Micronesia",
- "countryCode": "US"
- },
- {
- "zoneCode": "FL",
- "zoneName": "Florida",
- "countryCode": "US"
- },
- {
- "zoneCode": "GA",
- "zoneName": "Georgia",
- "countryCode": "US"
- },
- {
- "zoneCode": "GU",
- "zoneName": "Guam",
- "countryCode": "US"
- },
- {
- "zoneCode": "HI",
- "zoneName": "Hawaii",
- "countryCode": "US"
- },
- {
- "zoneCode": "ID",
- "zoneName": "Idaho",
- "countryCode": "US"
- },
- {
- "zoneCode": "IL",
- "zoneName": "Illinois",
- "countryCode": "US"
- },
- {
- "zoneCode": "IN",
- "zoneName": "Indiana",
- "countryCode": "US"
- },
- {
- "zoneCode": "IA",
- "zoneName": "Iowa",
- "countryCode": "US"
- },
- {
- "zoneCode": "KS",
- "zoneName": "Kansas",
- "countryCode": "US"
- },
- {
- "zoneCode": "KY",
- "zoneName": "Kentucky",
- "countryCode": "US"
- },
- {
- "zoneCode": "LA",
- "zoneName": "Louisiana",
- "countryCode": "US"
- },
- {
- "zoneCode": "ME",
- "zoneName": "Maine",
- "countryCode": "US"
- },
- {
- "zoneCode": "MH",
- "zoneName": "Marshall Islands",
- "countryCode": "US"
- },
- {
- "zoneCode": "MD",
- "zoneName": "Maryland",
- "countryCode": "US"
- },
- {
- "zoneCode": "MA",
- "zoneName": "Massachusetts",
- "countryCode": "US"
- },
- {
- "zoneCode": "MI",
- "zoneName": "Michigan",
- "countryCode": "US"
- },
- {
- "zoneCode": "MN",
- "zoneName": "Minnesota",
- "countryCode": "US"
- },
- {
- "zoneCode": "MS",
- "zoneName": "Mississippi",
- "countryCode": "US"
- },
- {
- "zoneCode": "MO",
- "zoneName": "Missouri",
- "countryCode": "US"
- },
- {
- "zoneCode": "MT",
- "zoneName": "Montana",
- "countryCode": "US"
- },
- {
- "zoneCode": "NE",
- "zoneName": "Nebraska",
- "countryCode": "US"
- },
- {
- "zoneCode": "NV",
- "zoneName": "Nevada",
- "countryCode": "US"
- },
- {
- "zoneCode": "NH",
- "zoneName": "New Hampshire",
- "countryCode": "US"
- },
- {
- "zoneCode": "NJ",
- "zoneName": "New Jersey",
- "countryCode": "US"
- },
- {
- "zoneCode": "NM",
- "zoneName": "New Mexico",
- "countryCode": "US"
- },
- {
- "zoneCode": "NY",
- "zoneName": "New York",
- "countryCode": "US"
- },
- {
- "zoneCode": "NC",
- "zoneName": "North Carolina",
- "countryCode": "US"
- },
- {
- "zoneCode": "ND",
- "zoneName": "North Dakota",
- "countryCode": "US"
- },
- {
- "zoneCode": "MP",
- "zoneName": "Northern Mariana Islands",
- "countryCode": "US"
- },
- {
- "zoneCode": "OH",
- "zoneName": "Ohio",
- "countryCode": "US"
- },
- {
- "zoneCode": "OK",
- "zoneName": "Oklahoma",
- "countryCode": "US"
- },
- {
- "zoneCode": "OR",
- "zoneName": "Oregon",
- "countryCode": "US"
- },
- {
- "zoneCode": "PA",
- "zoneName": "Pennsylvania",
- "countryCode": "US"
- },
- {
- "zoneCode": "PR",
- "zoneName": "Puerto Rico",
- "countryCode": "US"
- },
- {
- "zoneCode": "RI",
- "zoneName": "Rhode Island",
- "countryCode": "US"
- },
- {
- "zoneCode": "SC",
- "zoneName": "South Carolina",
- "countryCode": "US"
- },
- {
- "zoneCode": "SD",
- "zoneName": "South Dakota",
- "countryCode": "US"
- },
- {
- "zoneCode": "TN",
- "zoneName": "Tennessee",
- "countryCode": "US"
- },
- {
- "zoneCode": "TX",
- "zoneName": "Texas",
- "countryCode": "US"
- },
- {
- "zoneCode": "UT",
- "zoneName": "Utah",
- "countryCode": "US"
- },
- {
- "zoneCode": "VT",
- "zoneName": "Vermont",
- "countryCode": "US"
- },
- {
- "zoneCode": "VI",
- "zoneName": "Virgin Islands",
- "countryCode": "US"
- },
- {
- "zoneCode": "VA",
- "zoneName": "Virginia",
- "countryCode": "US"
- },
- {
- "zoneCode": "WA",
- "zoneName": "Washington",
- "countryCode": "US"
- },
- {
- "zoneCode": "WV",
- "zoneName": "West Virginia",
- "countryCode": "US"
- },
- {
- "zoneCode": "WI",
- "zoneName": "Wisconsin",
- "countryCode": "US"
- },
- {
- "zoneCode": "WY",
- "zoneName": "Wyoming",
- "countryCode": "US"
- },
- {
- "zoneCode": "AB",
- "zoneName": "Alberta",
- "countryCode": "CA"
- },
- {
- "zoneCode": "BC",
- "zoneName": "British Columbia",
- "countryCode": "CA"
- },
- {
- "zoneCode": "MB",
- "zoneName": "Manitoba",
- "countryCode": "CA"
- },
- {
- "zoneCode": "NF",
- "zoneName": "Newfoundland - Labrador",
- "countryCode": "CA"
- },
- {
- "zoneCode": "NB",
- "zoneName": "New Brunswick",
- "countryCode": "CA"
- },
- {
- "zoneCode": "NS",
- "zoneName": "Nova Scotia",
- "countryCode": "CA"
- },
- {
- "zoneCode": "NT",
- "zoneName": "Northwest Territories",
- "countryCode": "CA"
- },
- {
- "zoneCode": "NU",
- "zoneName": "Nunavut",
- "countryCode": "CA"
- },
- {
- "zoneCode": "ON",
- "zoneName": "Ontario",
- "countryCode": "CA"
- },
- {
- "zoneCode": "PE",
- "zoneName": "Prince Edward Island",
- "countryCode": "CA"
- },
- {
- "zoneCode": "QC",
- "zoneName": "Quebec",
- "countryCode": "CA"
- },
- {
- "zoneCode": "SK",
- "zoneName": "Saskatchewan",
- "countryCode": "CA"
- },
- {
- "zoneCode": "YT",
- "zoneName": "Yukon Territory",
- "countryCode": "CA"
- },
- {
- "zoneCode": "NDS",
- "zoneName": "Niedersachsen",
- "countryCode": "DE"
- },
- {
- "zoneCode": "BAW",
- "zoneName": "Baden-Wrttemberg",
- "countryCode": "DE"
- },
- {
- "zoneCode": "BAY",
- "zoneName": "Bayern",
- "countryCode": "DE"
- },
- {
- "zoneCode": "BER",
- "zoneName": "Berlin",
- "countryCode": "DE"
- },
- {
- "zoneCode": "BRG",
- "zoneName": "Brandenburg",
- "countryCode": "DE"
- },
- {
- "zoneCode": "BRE",
- "zoneName": "Bremen",
- "countryCode": "DE"
- },
- {
- "zoneCode": "HAM",
- "zoneName": "Hamburg",
- "countryCode": "DE"
- },
- {
- "zoneCode": "HES",
- "zoneName": "Hessen",
- "countryCode": "DE"
- },
- {
- "zoneCode": "MEC",
- "zoneName": "Mecklenburg-Vorpommern",
- "countryCode": "DE"
- },
- {
- "zoneCode": "NRW",
- "zoneName": "Nordrhein-Westfalen",
- "countryCode": "DE"
- },
- {
- "zoneCode": "RHE",
- "zoneName": "Rheinland-Pfalz",
- "countryCode": "DE"
- },
- {
- "zoneCode": "SAR",
- "zoneName": "Saarland",
- "countryCode": "DE"
- },
- {
- "zoneCode": "SAS",
- "zoneName": "Sachsen",
- "countryCode": "DE"
- },
- {
- "zoneCode": "SAC",
- "zoneName": "Sachsen-Anhalt",
- "countryCode": "DE"
- },
- {
- "zoneCode": "SCN",
- "zoneName": "Schleswig-Holstein",
- "countryCode": "DE"
- },
- {
- "zoneCode": "THE",
- "zoneName": "Thringen",
- "countryCode": "DE"
- },
- {
- "zoneCode": "WIAT",
- "zoneName": "Wien",
- "countryCode": "AT"
- },
- {
- "zoneCode": "NO",
- "zoneName": "Niederosterreich",
- "countryCode": "AT"
- },
- {
- "zoneCode": "OO",
- "zoneName": "Oberosterreich",
- "countryCode": "AT"
- },
- {
- "zoneCode": "SB",
- "zoneName": "Salzburg",
- "countryCode": "AT"
- },
- {
- "zoneCode": "KN",
- "zoneName": "Katen",
- "countryCode": "AT"
- },
- {
- "zoneCode": "ST",
- "zoneName": "Steiermark",
- "countryCode": "AT"
- },
- {
- "zoneCode": "TIAT",
- "zoneName": "Tirol",
- "countryCode": "AT"
- },
- {
- "zoneCode": "BLAT",
- "zoneName": "Burgenland",
- "countryCode": "AT"
- },
- {
- "zoneCode": "VB",
- "zoneName": "Voralberg",
- "countryCode": "AT"
- },
- {
- "zoneCode": "AG",
- "zoneName": "Aargau",
- "countryCode": "CH"
- },
- {
- "zoneCode": "AI",
- "zoneName": "Appenzell Innerrhoden",
- "countryCode": "CH"
- },
- {
- "zoneCode": "ARCH",
- "zoneName": "Appenzell Ausserrhoden",
- "countryCode": "CH"
- },
- {
- "zoneCode": "BE",
- "zoneName": "Bern",
- "countryCode": "CH"
- },
- {
- "zoneCode": "BL",
- "zoneName": "Basel-Landschaft",
- "countryCode": "CH"
- },
- {
- "zoneCode": "BS",
- "zoneName": "Basel-Stadt",
- "countryCode": "CH"
- },
- {
- "zoneCode": "FR",
- "zoneName": "Freiburg",
- "countryCode": "CH"
- },
- {
- "zoneCode": "GE",
- "zoneName": "Genf",
- "countryCode": "CH"
- },
- {
- "zoneCode": "GL",
- "zoneName": "Glarus",
- "countryCode": "CH"
- },
- {
- "zoneCode": "GR",
- "zoneName": "Graubnden",
- "countryCode": "CH"
- },
- {
- "zoneCode": "JU",
- "zoneName": "Jura",
- "countryCode": "CH"
- },
- {
- "zoneCode": "LU",
- "zoneName": "Luzern",
- "countryCode": "CH"
- },
- {
- "zoneCode": "NECH",
- "zoneName": "Neuenburg",
- "countryCode": "CH"
- },
- {
- "zoneCode": "NW",
- "zoneName": "Nidwalden",
- "countryCode": "CH"
- },
- {
- "zoneCode": "OW",
- "zoneName": "Obwalden",
- "countryCode": "CH"
- },
- {
- "zoneCode": "SG",
- "zoneName": "St. Gallen",
- "countryCode": "CH"
- },
- {
- "zoneCode": "SH",
- "zoneName": "Schaffhausen",
- "countryCode": "CH"
- },
- {
- "zoneCode": "SO",
- "zoneName": "Solothurn",
- "countryCode": "CH"
- },
- {
- "zoneCode": "SZ",
- "zoneName": "Schwyz",
- "countryCode": "CH"
- },
- {
- "zoneCode": "TG",
- "zoneName": "Thurgau",
- "countryCode": "CH"
- },
- {
- "zoneCode": "TI",
- "zoneName": "Tessin",
- "countryCode": "CH"
- },
- {
- "zoneCode": "UR",
- "zoneName": "Uri",
- "countryCode": "CH"
- },
- {
- "zoneCode": "VD",
- "zoneName": "Waadt",
- "countryCode": "CH"
- },
- {
- "zoneCode": "VS",
- "zoneName": "Wallis",
- "countryCode": "CH"
- },
- {
- "zoneCode": "ZG",
- "zoneName": "Zug",
- "countryCode": "CH"
- },
- {
- "zoneCode": "ZH",
- "zoneName": "Zrich",
- "countryCode": "CH"
- },
- {
- "zoneCode": "ACorua",
- "zoneName": "A Corua",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Alava",
- "zoneName": "Alava",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Albacete",
- "zoneName": "Albacete",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Alicante",
- "zoneName": "Alicante",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Almeria",
- "zoneName": "Almeria",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Asturias",
- "zoneName": "Asturias",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Avila",
- "zoneName": "Avila",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Badajoz",
- "zoneName": "Badajoz",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Baleares",
- "zoneName": "Baleares",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Barcelona",
- "zoneName": "Barcelona",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Burgos",
- "zoneName": "Burgos",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Caceres",
- "zoneName": "Caceres",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Cadiz",
- "zoneName": "Cadiz",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Cantabria",
- "zoneName": "Cantabria",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Castellon",
- "zoneName": "Castellon",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Ceuta",
- "zoneName": "Ceuta",
- "countryCode": "ES"
- },
- {
- "zoneCode": "CiudadReal",
- "zoneName": "Ciudad Real",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Cordoba",
- "zoneName": "Cordoba",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Cuenca",
- "zoneName": "Cuenca",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Girona",
- "zoneName": "Girona",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Granada",
- "zoneName": "Granada",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Guadalajara",
- "zoneName": "Guadalajara",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Guipuzcoa",
- "zoneName": "Guipuzcoa",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Huelva",
- "zoneName": "Huelva",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Huesca",
- "zoneName": "Huesca",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Jaen",
- "zoneName": "Jaen",
- "countryCode": "ES"
- },
- {
- "zoneCode": "LaRioja",
- "zoneName": "La Rioja",
- "countryCode": "ES"
- },
- {
- "zoneCode": "LasPalmas",
- "zoneName": "Las Palmas",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Leon",
- "zoneName": "Leon",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Lleida",
- "zoneName": "Lleida",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Lugo",
- "zoneName": "Lugo",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Madrid",
- "zoneName": "Madrid",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Malaga",
- "zoneName": "Malaga",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Melilla",
- "zoneName": "Melilla",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Murcia",
- "zoneName": "Murcia",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Navarra",
- "zoneName": "Navarra",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Ourense",
- "zoneName": "Ourense",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Palencia",
- "zoneName": "Palencia",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Pontevedra",
- "zoneName": "Pontevedra",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Salamanca",
- "zoneName": "Salamanca",
- "countryCode": "ES"
- },
- {
- "zoneCode": "SantaCruzdeTenerife",
- "zoneName": "Santa Cruz de Tenerife",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Segovia",
- "zoneName": "Segovia",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Sevilla",
- "zoneName": "Sevilla",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Soria",
- "zoneName": "Soria",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Tarragona",
- "zoneName": "Tarragona",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Teruel",
- "zoneName": "Teruel",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Toledo",
- "zoneName": "Toledo",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Valencia",
- "zoneName": "Valencia",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Valladolid",
- "zoneName": "Valladolid",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Vizcaya",
- "zoneName": "Vizcaya",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Zamora",
- "zoneName": "Zamora",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Zaragoza",
- "zoneName": "Zaragoza",
- "countryCode": "ES"
- },
- {
- "zoneCode": "ACT",
- "zoneName": "Australian Capital Territory",
- "countryCode": "AU"
- },
- {
- "zoneCode": "NSW",
- "zoneName": "New South Wales",
- "countryCode": "AU"
- },
- {
- "zoneCode": "NTAU",
- "zoneName": "Northern Territory",
- "countryCode": "AU"
- },
- {
- "zoneCode": "QLD",
- "zoneName": "Queensland",
- "countryCode": "AU"
- },
- {
- "zoneCode": "SA",
- "zoneName": "South Australia",
- "countryCode": "AU"
- },
- {
- "zoneCode": "TAS",
- "zoneName": "Tasmania",
- "countryCode": "AU"
- },
- {
- "zoneCode": "VIC",
- "zoneName": "Victoria",
- "countryCode": "AU"
- },
- {
- "zoneCode": "WAAU",
- "zoneName": "Western Australia",
- "countryCode": "AU"
- }
-] ,
-
- "fr":[
- {
- "zoneCode": "AL",
- "zoneName": "Alabama",
- "countryCode": "US"
- },
- {
- "zoneCode": "AK",
- "zoneName": "Alaska",
- "countryCode": "US"
- },
- {
- "zoneCode": "AS",
- "zoneName": "American Samoa",
- "countryCode": "US"
- },
- {
- "zoneCode": "AZ",
- "zoneName": "Arizona",
- "countryCode": "US"
- },
- {
- "zoneCode": "AR",
- "zoneName": "Arkansas",
- "countryCode": "US"
- },
- {
- "zoneCode": "AF",
- "zoneName": "Armed Forces Africa",
- "countryCode": "US"
- },
- {
- "zoneCode": "AA",
- "zoneName": "Armed Forces Americas",
- "countryCode": "US"
- },
- {
- "zoneCode": "AC",
- "zoneName": "Armed Forces Canada",
- "countryCode": "US"
- },
- {
- "zoneCode": "AE",
- "zoneName": "Armed Forces Europe",
- "countryCode": "US"
- },
- {
- "zoneCode": "AM",
- "zoneName": "Armed Forces Middle East",
- "countryCode": "US"
- },
- {
- "zoneCode": "AP",
- "zoneName": "Armed Forces Pacific",
- "countryCode": "US"
- },
- {
- "zoneCode": "CA",
- "zoneName": "Californie",
- "countryCode": "US"
- },
- {
- "zoneCode": "CO",
- "zoneName": "Colorado",
- "countryCode": "US"
- },
- {
- "zoneCode": "CT",
- "zoneName": "Connecticut",
- "countryCode": "US"
- },
- {
- "zoneCode": "DE",
- "zoneName": "Delaware",
- "countryCode": "US"
- },
- {
- "zoneCode": "DC",
- "zoneName": "District de Columbia",
- "countryCode": "US"
- },
- {
- "zoneCode": "FM",
- "zoneName": "Federated States Of Micronesia",
- "countryCode": "US"
- },
- {
- "zoneCode": "FL",
- "zoneName": "Floride",
- "countryCode": "US"
- },
- {
- "zoneCode": "GA",
- "zoneName": "Georgie",
- "countryCode": "US"
- },
- {
- "zoneCode": "GU",
- "zoneName": "Guam",
- "countryCode": "US"
- },
- {
- "zoneCode": "HI",
- "zoneName": "Hawaii",
- "countryCode": "US"
- },
- {
- "zoneCode": "ID",
- "zoneName": "Idaho",
- "countryCode": "US"
- },
- {
- "zoneCode": "IL",
- "zoneName": "Illinois",
- "countryCode": "US"
- },
- {
- "zoneCode": "IN",
- "zoneName": "Indiana",
- "countryCode": "US"
- },
- {
- "zoneCode": "IA",
- "zoneName": "Iowa",
- "countryCode": "US"
- },
- {
- "zoneCode": "KS",
- "zoneName": "Kansas",
- "countryCode": "US"
- },
- {
- "zoneCode": "KY",
- "zoneName": "Kentucky",
- "countryCode": "US"
- },
- {
- "zoneCode": "LA",
- "zoneName": "Louisiane",
- "countryCode": "US"
- },
- {
- "zoneCode": "ME",
- "zoneName": "Maine",
- "countryCode": "US"
- },
- {
- "zoneCode": "MH",
- "zoneName": "Marshall Islands",
- "countryCode": "US"
- },
- {
- "zoneCode": "MD",
- "zoneName": "Maryland",
- "countryCode": "US"
- },
- {
- "zoneCode": "MA",
- "zoneName": "Massachusetts",
- "countryCode": "US"
- },
- {
- "zoneCode": "MI",
- "zoneName": "Michigan",
- "countryCode": "US"
- },
- {
- "zoneCode": "MN",
- "zoneName": "Minnesota",
- "countryCode": "US"
- },
- {
- "zoneCode": "MS",
- "zoneName": "Mississippi",
- "countryCode": "US"
- },
- {
- "zoneCode": "MO",
- "zoneName": "Missouri",
- "countryCode": "US"
- },
- {
- "zoneCode": "MT",
- "zoneName": "Montana",
- "countryCode": "US"
- },
- {
- "zoneCode": "NE",
- "zoneName": "Nebraska",
- "countryCode": "US"
- },
- {
- "zoneCode": "NV",
- "zoneName": "Nevada",
- "countryCode": "US"
- },
- {
- "zoneCode": "NH",
- "zoneName": "Nouveau Hampshire",
- "countryCode": "US"
- },
- {
- "zoneCode": "NJ",
- "zoneName": "New Jersey",
- "countryCode": "US"
- },
- {
- "zoneCode": "NM",
- "zoneName": "Nouveau Mexique",
- "countryCode": "US"
- },
- {
- "zoneCode": "NY",
- "zoneName": "New York",
- "countryCode": "US"
- },
- {
- "zoneCode": "NC",
- "zoneName": "Caroline du Nord",
- "countryCode": "US"
- },
- {
- "zoneCode": "ND",
- "zoneName": "Dakota du Nord",
- "countryCode": "US"
- },
- {
- "zoneCode": "MP",
- "zoneName": "Northern Mariana Islands",
- "countryCode": "US"
- },
- {
- "zoneCode": "OH",
- "zoneName": "Ohio",
- "countryCode": "US"
- },
- {
- "zoneCode": "OK",
- "zoneName": "Oklahoma",
- "countryCode": "US"
- },
- {
- "zoneCode": "OR",
- "zoneName": "Oregon",
- "countryCode": "US"
- },
- {
- "zoneCode": "PA",
- "zoneName": "Pennsylvanie",
- "countryCode": "US"
- },
- {
- "zoneCode": "PR",
- "zoneName": "Puerto Rico",
- "countryCode": "US"
- },
- {
- "zoneCode": "RI",
- "zoneName": "Rhode Island",
- "countryCode": "US"
- },
- {
- "zoneCode": "SC",
- "zoneName": "Caroline du Sud",
- "countryCode": "US"
- },
- {
- "zoneCode": "SD",
- "zoneName": "Dakota du Sud",
- "countryCode": "US"
- },
- {
- "zoneCode": "TN",
- "zoneName": "Tennessee",
- "countryCode": "US"
- },
- {
- "zoneCode": "TX",
- "zoneName": "Texas",
- "countryCode": "US"
- },
- {
- "zoneCode": "UT",
- "zoneName": "Utah",
- "countryCode": "US"
- },
- {
- "zoneCode": "VT",
- "zoneName": "Vermont",
- "countryCode": "US"
- },
- {
- "zoneCode": "VI",
- "zoneName": "Virgin Islands",
- "countryCode": "US"
- },
- {
- "zoneCode": "VA",
- "zoneName": "Virginie",
- "countryCode": "US"
- },
- {
- "zoneCode": "WA",
- "zoneName": "Washington",
- "countryCode": "US"
- },
- {
- "zoneCode": "WV",
- "zoneName": "West Virginia",
- "countryCode": "US"
- },
- {
- "zoneCode": "WI",
- "zoneName": "Wisconsin",
- "countryCode": "US"
- },
- {
- "zoneCode": "WY",
- "zoneName": "Wyoming",
- "countryCode": "US"
- },
- {
- "zoneCode": "AB",
- "zoneName": "Alberta",
- "countryCode": "CA"
- },
- {
- "zoneCode": "BC",
- "zoneName": "Columbie Britanique",
- "countryCode": "CA"
- },
- {
- "zoneCode": "MB",
- "zoneName": "Manitoba",
- "countryCode": "CA"
- },
- {
- "zoneCode": "NF",
- "zoneName": "Terre-Neuve - Labrador",
- "countryCode": "CA"
- },
- {
- "zoneCode": "NB",
- "zoneName": "Nouveau Brunswick",
- "countryCode": "CA"
- },
- {
- "zoneCode": "NS",
- "zoneName": "Nouvelle Écosse",
- "countryCode": "CA"
- },
- {
- "zoneCode": "NT",
- "zoneName": "Territores du Nord-Ouest",
- "countryCode": "CA"
- },
- {
- "zoneCode": "NU",
- "zoneName": "Nunavut",
- "countryCode": "CA"
- },
- {
- "zoneCode": "ON",
- "zoneName": "Ontario",
- "countryCode": "CA"
- },
- {
- "zoneCode": "PE",
- "zoneName": "Île-du-Prince-Édouard",
- "countryCode": "CA"
- },
- {
- "zoneCode": "QC",
- "zoneName": "Québec",
- "countryCode": "CA"
- },
- {
- "zoneCode": "SK",
- "zoneName": "Saskatchewan",
- "countryCode": "CA"
- },
- {
- "zoneCode": "YT",
- "zoneName": "Yukon",
- "countryCode": "CA"
- },
- {
- "zoneCode": "NDS",
- "zoneName": "Niedersachsen",
- "countryCode": "DE"
- },
- {
- "zoneCode": "BAW",
- "zoneName": "Baden-Wrttemberg",
- "countryCode": "DE"
- },
- {
- "zoneCode": "BAY",
- "zoneName": "Bayern",
- "countryCode": "DE"
- },
- {
- "zoneCode": "BER",
- "zoneName": "Berlin",
- "countryCode": "DE"
- },
- {
- "zoneCode": "BRG",
- "zoneName": "Brandenburg",
- "countryCode": "DE"
- },
- {
- "zoneCode": "BRE",
- "zoneName": "Bremen",
- "countryCode": "DE"
- },
- {
- "zoneCode": "HAM",
- "zoneName": "Hamburg",
- "countryCode": "DE"
- },
- {
- "zoneCode": "HES",
- "zoneName": "Hessen",
- "countryCode": "DE"
- },
- {
- "zoneCode": "MEC",
- "zoneName": "Mecklenburg-Vorpommern",
- "countryCode": "DE"
- },
- {
- "zoneCode": "NRW",
- "zoneName": "Nordrhein-Westfalen",
- "countryCode": "DE"
- },
- {
- "zoneCode": "RHE",
- "zoneName": "Rheinland-Pfalz",
- "countryCode": "DE"
- },
- {
- "zoneCode": "SAR",
- "zoneName": "Saarland",
- "countryCode": "DE"
- },
- {
- "zoneCode": "SAS",
- "zoneName": "Sachsen",
- "countryCode": "DE"
- },
- {
- "zoneCode": "SAC",
- "zoneName": "Sachsen-Anhalt",
- "countryCode": "DE"
- },
- {
- "zoneCode": "SCN",
- "zoneName": "Schleswig-Holstein",
- "countryCode": "DE"
- },
- {
- "zoneCode": "THE",
- "zoneName": "Thringen",
- "countryCode": "DE"
- },
- {
- "zoneCode": "WIAT",
- "zoneName": "Wien",
- "countryCode": "AT"
- },
- {
- "zoneCode": "NO",
- "zoneName": "Niederosterreich",
- "countryCode": "AT"
- },
- {
- "zoneCode": "OO",
- "zoneName": "Oberosterreich",
- "countryCode": "AT"
- },
- {
- "zoneCode": "SB",
- "zoneName": "Salzburg",
- "countryCode": "AT"
- },
- {
- "zoneCode": "KN",
- "zoneName": "Karten",
- "countryCode": "AT"
- },
- {
- "zoneCode": "ST",
- "zoneName": "Steiermark",
- "countryCode": "AT"
- },
- {
- "zoneCode": "TIAT",
- "zoneName": "Tirol",
- "countryCode": "AT"
- },
- {
- "zoneCode": "BLAT",
- "zoneName": "Burgenland",
- "countryCode": "AT"
- },
- {
- "zoneCode": "VB",
- "zoneName": "Voralberg",
- "countryCode": "AT"
- },
- {
- "zoneCode": "AG",
- "zoneName": "Aargau",
- "countryCode": "CH"
- },
- {
- "zoneCode": "AI",
- "zoneName": "Appenzell Innerrhoden",
- "countryCode": "CH"
- },
- {
- "zoneCode": "ARCH",
- "zoneName": "Appenzell Ausserrhoden",
- "countryCode": "CH"
- },
- {
- "zoneCode": "BE",
- "zoneName": "Bern",
- "countryCode": "CH"
- },
- {
- "zoneCode": "BL",
- "zoneName": "Basel-Landschaft",
- "countryCode": "CH"
- },
- {
- "zoneCode": "BS",
- "zoneName": "Basel-Stadt",
- "countryCode": "CH"
- },
- {
- "zoneCode": "FR",
- "zoneName": "Freiburg",
- "countryCode": "CH"
- },
- {
- "zoneCode": "GE",
- "zoneName": "Genf",
- "countryCode": "CH"
- },
- {
- "zoneCode": "GL",
- "zoneName": "Glarus",
- "countryCode": "CH"
- },
- {
- "zoneCode": "GR",
- "zoneName": "Graubnden",
- "countryCode": "CH"
- },
- {
- "zoneCode": "JU",
- "zoneName": "Jura",
- "countryCode": "CH"
- },
- {
- "zoneCode": "LU",
- "zoneName": "Luzern",
- "countryCode": "CH"
- },
- {
- "zoneCode": "NECH",
- "zoneName": "Neuenburg",
- "countryCode": "CH"
- },
- {
- "zoneCode": "NW",
- "zoneName": "Nidwalden",
- "countryCode": "CH"
- },
- {
- "zoneCode": "OW",
- "zoneName": "Obwalden",
- "countryCode": "CH"
- },
- {
- "zoneCode": "SG",
- "zoneName": "St. Gallen",
- "countryCode": "CH"
- },
- {
- "zoneCode": "SH",
- "zoneName": "Schaffhausen",
- "countryCode": "CH"
- },
- {
- "zoneCode": "SO",
- "zoneName": "Solothurn",
- "countryCode": "CH"
- },
- {
- "zoneCode": "SZ",
- "zoneName": "Schwyz",
- "countryCode": "CH"
- },
- {
- "zoneCode": "TG",
- "zoneName": "Thurgau",
- "countryCode": "CH"
- },
- {
- "zoneCode": "TI",
- "zoneName": "Tessin",
- "countryCode": "CH"
- },
- {
- "zoneCode": "UR",
- "zoneName": "Uri",
- "countryCode": "CH"
- },
- {
- "zoneCode": "VD",
- "zoneName": "Waadt",
- "countryCode": "CH"
- },
- {
- "zoneCode": "VS",
- "zoneName": "Wallis",
- "countryCode": "CH"
- },
- {
- "zoneCode": "ZG",
- "zoneName": "Zug",
- "countryCode": "CH"
- },
- {
- "zoneCode": "ZH",
- "zoneName": "Zrich",
- "countryCode": "CH"
- },
- {
- "zoneCode": "A Corua",
- "zoneName": "A Corua",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Alava",
- "zoneName": "Alava",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Albacete",
- "zoneName": "Albacete",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Alicante",
- "zoneName": "Alicante",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Almeria",
- "zoneName": "Almeria",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Asturias",
- "zoneName": "Asturias",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Avila",
- "zoneName": "Avila",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Badajoz",
- "zoneName": "Badajoz",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Baleares",
- "zoneName": "Baleares",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Barcelona",
- "zoneName": "Barcelona",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Burgos",
- "zoneName": "Burgos",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Caceres",
- "zoneName": "Caceres",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Cadiz",
- "zoneName": "Cadiz",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Cantabria",
- "zoneName": "Cantabria",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Castellon",
- "zoneName": "Castellon",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Ceuta",
- "zoneName": "Ceuta",
- "countryCode": "ES"
- },
- {
- "zoneCode": "CiudadReal",
- "zoneName": "Ciudad Real",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Cordoba",
- "zoneName": "Cordoba",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Cuenca",
- "zoneName": "Cuenca",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Girona",
- "zoneName": "Girona",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Granada",
- "zoneName": "Granada",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Guadalajara",
- "zoneName": "Guadalajara",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Guipuzcoa",
- "zoneName": "Guipuzcoa",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Huelva",
- "zoneName": "Huelva",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Huesca",
- "zoneName": "Huesca",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Jaen",
- "zoneName": "Jaen",
- "countryCode": "ES"
- },
- {
- "zoneCode": "LaRioja",
- "zoneName": "La Rioja",
- "countryCode": "ES"
- },
- {
- "zoneCode": "LasPalmas",
- "zoneName": "Las Palmas",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Leon",
- "zoneName": "Leon",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Lleida",
- "zoneName": "Lleida",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Lugo",
- "zoneName": "Lugo",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Madrid",
- "zoneName": "Madrid",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Malaga",
- "zoneName": "Malaga",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Melilla",
- "zoneName": "Melilla",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Murcia",
- "zoneName": "Murcia",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Navarra",
- "zoneName": "Navarra",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Ourense",
- "zoneName": "Ourense",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Palencia",
- "zoneName": "Palencia",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Pontevedra",
- "zoneName": "Pontevedra",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Salamanca",
- "zoneName": "Salamanca",
- "countryCode": "ES"
- },
- {
- "zoneCode": "SantaCruzdeTenerife",
- "zoneName": "Santa Cruz de Tenerife",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Segovia",
- "zoneName": "Segovia",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Sevilla",
- "zoneName": "Sevilla",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Soria",
- "zoneName": "Soria",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Tarragona",
- "zoneName": "Tarragona",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Teruel",
- "zoneName": "Teruel",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Toledo",
- "zoneName": "Toledo",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Valencia",
- "zoneName": "Valencia",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Valladolid",
- "zoneName": "Valladolid",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Vizcaya",
- "zoneName": "Vizcaya",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Zamora",
- "zoneName": "Zamora",
- "countryCode": "ES"
- },
- {
- "zoneCode": "Zaragoza",
- "zoneName": "Zaragoza",
- "countryCode": "ES"
- },
- {
- "zoneCode":"ACT",
- "zoneName":"Territoire de la capitale australienne",
- "countryCode":"AU"
- },
- {
- "zoneCode":"WAAU",
- "zoneName":"Australie-Occidentale",
- "countryCode":"AU"
- },
- {
- "zoneCode":"SA",
- "zoneName":"Australie-Mridionale",
- "countryCode":"AU"
- },
- {
- "zoneCode":"NTAU",
- "zoneName":"Territoire du Nord",
- "countryCode":"AU"
- },
- {
- "zoneCode":"VIC",
- "zoneName":"Victoria",
- "countryCode":"AU"
- },
- {
- "zoneCode":"TAS",
- "zoneName":"Tasmanie",
- "countryCode":"AU"
- },
- {
- "zoneCode":"QLD",
- "zoneName":"Queensland",
- "countryCode":"AU"
- },
- {
- "zoneCode":"NSW",
- "zoneName":"Nouvelle-Galles du Sud",
- "countryCode":"AU"
- }
-
-]
+{
+ "en":[
+ {
+ "zoneCode": "AL",
+ "zoneName": "Alabama",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "AK",
+ "zoneName": "Alaska",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "AS",
+ "zoneName": "American Samoa",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "AZ",
+ "zoneName": "Arizona",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "AR",
+ "zoneName": "Arkansas",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "AF",
+ "zoneName": "Armed Forces Africa",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "AA",
+ "zoneName": "Armed Forces Americas",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "AC",
+ "zoneName": "Armed Forces Canada",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "AE",
+ "zoneName": "Armed Forces Europe",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "AM",
+ "zoneName": "Armed Forces Middle East",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "AP",
+ "zoneName": "Armed Forces Pacific",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "CA",
+ "zoneName": "California",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "CO",
+ "zoneName": "Colorado",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "CT",
+ "zoneName": "Connecticut",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "DE",
+ "zoneName": "Delaware",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "DC",
+ "zoneName": "District of Columbia",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "FM",
+ "zoneName": "Federated States Of Micronesia",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "FL",
+ "zoneName": "Florida",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "GA",
+ "zoneName": "Georgia",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "GU",
+ "zoneName": "Guam",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "HI",
+ "zoneName": "Hawaii",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "ID",
+ "zoneName": "Idaho",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "IL",
+ "zoneName": "Illinois",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "IN",
+ "zoneName": "Indiana",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "IA",
+ "zoneName": "Iowa",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "KS",
+ "zoneName": "Kansas",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "KY",
+ "zoneName": "Kentucky",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "LA",
+ "zoneName": "Louisiana",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "ME",
+ "zoneName": "Maine",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "MH",
+ "zoneName": "Marshall Islands",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "MD",
+ "zoneName": "Maryland",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "MA",
+ "zoneName": "Massachusetts",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "MI",
+ "zoneName": "Michigan",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "MN",
+ "zoneName": "Minnesota",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "MS",
+ "zoneName": "Mississippi",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "MO",
+ "zoneName": "Missouri",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "MT",
+ "zoneName": "Montana",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "NE",
+ "zoneName": "Nebraska",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "NV",
+ "zoneName": "Nevada",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "NH",
+ "zoneName": "New Hampshire",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "NJ",
+ "zoneName": "New Jersey",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "NM",
+ "zoneName": "New Mexico",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "NY",
+ "zoneName": "New York",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "NC",
+ "zoneName": "North Carolina",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "ND",
+ "zoneName": "North Dakota",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "MP",
+ "zoneName": "Northern Mariana Islands",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "OH",
+ "zoneName": "Ohio",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "OK",
+ "zoneName": "Oklahoma",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "OR",
+ "zoneName": "Oregon",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "PA",
+ "zoneName": "Pennsylvania",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "PR",
+ "zoneName": "Puerto Rico",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "RI",
+ "zoneName": "Rhode Island",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "SC",
+ "zoneName": "South Carolina",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "SD",
+ "zoneName": "South Dakota",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "TN",
+ "zoneName": "Tennessee",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "TX",
+ "zoneName": "Texas",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "UT",
+ "zoneName": "Utah",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "VT",
+ "zoneName": "Vermont",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "VI",
+ "zoneName": "Virgin Islands",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "VA",
+ "zoneName": "Virginia",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "WA",
+ "zoneName": "Washington",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "WV",
+ "zoneName": "West Virginia",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "WI",
+ "zoneName": "Wisconsin",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "WY",
+ "zoneName": "Wyoming",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "AB",
+ "zoneName": "Alberta",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "BC",
+ "zoneName": "British Columbia",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "MB",
+ "zoneName": "Manitoba",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "NF",
+ "zoneName": "Newfoundland - Labrador",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "NB",
+ "zoneName": "New Brunswick",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "NS",
+ "zoneName": "Nova Scotia",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "NT",
+ "zoneName": "Northwest Territories",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "NU",
+ "zoneName": "Nunavut",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "ON",
+ "zoneName": "Ontario",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "PE",
+ "zoneName": "Prince Edward Island",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "QC",
+ "zoneName": "Quebec",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "SK",
+ "zoneName": "Saskatchewan",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "YT",
+ "zoneName": "Yukon Territory",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "NDS",
+ "zoneName": "Niedersachsen",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "BAW",
+ "zoneName": "Baden-Wrttemberg",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "BAY",
+ "zoneName": "Bayern",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "BER",
+ "zoneName": "Berlin",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "BRG",
+ "zoneName": "Brandenburg",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "BRE",
+ "zoneName": "Bremen",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "HAM",
+ "zoneName": "Hamburg",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "HES",
+ "zoneName": "Hessen",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "MEC",
+ "zoneName": "Mecklenburg-Vorpommern",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "NRW",
+ "zoneName": "Nordrhein-Westfalen",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "RHE",
+ "zoneName": "Rheinland-Pfalz",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "SAR",
+ "zoneName": "Saarland",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "SAS",
+ "zoneName": "Sachsen",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "SAC",
+ "zoneName": "Sachsen-Anhalt",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "SCN",
+ "zoneName": "Schleswig-Holstein",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "THE",
+ "zoneName": "Thringen",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "WIAT",
+ "zoneName": "Wien",
+ "countryCode": "AT"
+ },
+ {
+ "zoneCode": "NO",
+ "zoneName": "Niederosterreich",
+ "countryCode": "AT"
+ },
+ {
+ "zoneCode": "OO",
+ "zoneName": "Oberosterreich",
+ "countryCode": "AT"
+ },
+ {
+ "zoneCode": "SB",
+ "zoneName": "Salzburg",
+ "countryCode": "AT"
+ },
+ {
+ "zoneCode": "KN",
+ "zoneName": "Katen",
+ "countryCode": "AT"
+ },
+ {
+ "zoneCode": "ST",
+ "zoneName": "Steiermark",
+ "countryCode": "AT"
+ },
+ {
+ "zoneCode": "TIAT",
+ "zoneName": "Tirol",
+ "countryCode": "AT"
+ },
+ {
+ "zoneCode": "BLAT",
+ "zoneName": "Burgenland",
+ "countryCode": "AT"
+ },
+ {
+ "zoneCode": "VB",
+ "zoneName": "Voralberg",
+ "countryCode": "AT"
+ },
+ {
+ "zoneCode": "AG",
+ "zoneName": "Aargau",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "AI",
+ "zoneName": "Appenzell Innerrhoden",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "ARCH",
+ "zoneName": "Appenzell Ausserrhoden",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "BE",
+ "zoneName": "Bern",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "BL",
+ "zoneName": "Basel-Landschaft",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "BS",
+ "zoneName": "Basel-Stadt",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "FR",
+ "zoneName": "Freiburg",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "GE",
+ "zoneName": "Genf",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "GL",
+ "zoneName": "Glarus",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "GR",
+ "zoneName": "Graubnden",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "JU",
+ "zoneName": "Jura",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "LU",
+ "zoneName": "Luzern",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "NECH",
+ "zoneName": "Neuenburg",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "NW",
+ "zoneName": "Nidwalden",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "OW",
+ "zoneName": "Obwalden",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "SG",
+ "zoneName": "St. Gallen",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "SH",
+ "zoneName": "Schaffhausen",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "SO",
+ "zoneName": "Solothurn",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "SZ",
+ "zoneName": "Schwyz",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "TG",
+ "zoneName": "Thurgau",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "TI",
+ "zoneName": "Tessin",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "UR",
+ "zoneName": "Uri",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "VD",
+ "zoneName": "Waadt",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "VS",
+ "zoneName": "Wallis",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "ZG",
+ "zoneName": "Zug",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "ZH",
+ "zoneName": "Zrich",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "ACorua",
+ "zoneName": "A Corua",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Alava",
+ "zoneName": "Alava",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Albacete",
+ "zoneName": "Albacete",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Alicante",
+ "zoneName": "Alicante",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Almeria",
+ "zoneName": "Almeria",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Asturias",
+ "zoneName": "Asturias",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Avila",
+ "zoneName": "Avila",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Badajoz",
+ "zoneName": "Badajoz",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Baleares",
+ "zoneName": "Baleares",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Barcelona",
+ "zoneName": "Barcelona",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Burgos",
+ "zoneName": "Burgos",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Caceres",
+ "zoneName": "Caceres",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Cadiz",
+ "zoneName": "Cadiz",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Cantabria",
+ "zoneName": "Cantabria",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Castellon",
+ "zoneName": "Castellon",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Ceuta",
+ "zoneName": "Ceuta",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "CiudadReal",
+ "zoneName": "Ciudad Real",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Cordoba",
+ "zoneName": "Cordoba",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Cuenca",
+ "zoneName": "Cuenca",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Girona",
+ "zoneName": "Girona",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Granada",
+ "zoneName": "Granada",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Guadalajara",
+ "zoneName": "Guadalajara",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Guipuzcoa",
+ "zoneName": "Guipuzcoa",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Huelva",
+ "zoneName": "Huelva",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Huesca",
+ "zoneName": "Huesca",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Jaen",
+ "zoneName": "Jaen",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "LaRioja",
+ "zoneName": "La Rioja",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "LasPalmas",
+ "zoneName": "Las Palmas",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Leon",
+ "zoneName": "Leon",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Lleida",
+ "zoneName": "Lleida",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Lugo",
+ "zoneName": "Lugo",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Madrid",
+ "zoneName": "Madrid",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Malaga",
+ "zoneName": "Malaga",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Melilla",
+ "zoneName": "Melilla",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Murcia",
+ "zoneName": "Murcia",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Navarra",
+ "zoneName": "Navarra",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Ourense",
+ "zoneName": "Ourense",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Palencia",
+ "zoneName": "Palencia",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Pontevedra",
+ "zoneName": "Pontevedra",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Salamanca",
+ "zoneName": "Salamanca",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "SantaCruzdeTenerife",
+ "zoneName": "Santa Cruz de Tenerife",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Segovia",
+ "zoneName": "Segovia",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Sevilla",
+ "zoneName": "Sevilla",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Soria",
+ "zoneName": "Soria",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Tarragona",
+ "zoneName": "Tarragona",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Teruel",
+ "zoneName": "Teruel",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Toledo",
+ "zoneName": "Toledo",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Valencia",
+ "zoneName": "Valencia",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Valladolid",
+ "zoneName": "Valladolid",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Vizcaya",
+ "zoneName": "Vizcaya",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Zamora",
+ "zoneName": "Zamora",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Zaragoza",
+ "zoneName": "Zaragoza",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "ACT",
+ "zoneName": "Australian Capital Territory",
+ "countryCode": "AU"
+ },
+ {
+ "zoneCode": "NSW",
+ "zoneName": "New South Wales",
+ "countryCode": "AU"
+ },
+ {
+ "zoneCode": "NTAU",
+ "zoneName": "Northern Territory",
+ "countryCode": "AU"
+ },
+ {
+ "zoneCode": "QLD",
+ "zoneName": "Queensland",
+ "countryCode": "AU"
+ },
+ {
+ "zoneCode": "SA",
+ "zoneName": "South Australia",
+ "countryCode": "AU"
+ },
+ {
+ "zoneCode": "TAS",
+ "zoneName": "Tasmania",
+ "countryCode": "AU"
+ },
+ {
+ "zoneCode": "VIC",
+ "zoneName": "Victoria",
+ "countryCode": "AU"
+ },
+ {
+ "zoneCode": "WAAU",
+ "zoneName": "Western Australia",
+ "countryCode": "AU"
+ }
+] ,
+
+ "fr":[
+ {
+ "zoneCode": "AL",
+ "zoneName": "Alabama",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "AK",
+ "zoneName": "Alaska",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "AS",
+ "zoneName": "American Samoa",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "AZ",
+ "zoneName": "Arizona",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "AR",
+ "zoneName": "Arkansas",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "AF",
+ "zoneName": "Armed Forces Africa",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "AA",
+ "zoneName": "Armed Forces Americas",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "AC",
+ "zoneName": "Armed Forces Canada",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "AE",
+ "zoneName": "Armed Forces Europe",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "AM",
+ "zoneName": "Armed Forces Middle East",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "AP",
+ "zoneName": "Armed Forces Pacific",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "CA",
+ "zoneName": "Californie",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "CO",
+ "zoneName": "Colorado",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "CT",
+ "zoneName": "Connecticut",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "DE",
+ "zoneName": "Delaware",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "DC",
+ "zoneName": "District de Columbia",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "FM",
+ "zoneName": "Federated States Of Micronesia",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "FL",
+ "zoneName": "Floride",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "GA",
+ "zoneName": "Georgie",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "GU",
+ "zoneName": "Guam",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "HI",
+ "zoneName": "Hawaii",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "ID",
+ "zoneName": "Idaho",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "IL",
+ "zoneName": "Illinois",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "IN",
+ "zoneName": "Indiana",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "IA",
+ "zoneName": "Iowa",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "KS",
+ "zoneName": "Kansas",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "KY",
+ "zoneName": "Kentucky",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "LA",
+ "zoneName": "Louisiane",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "ME",
+ "zoneName": "Maine",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "MH",
+ "zoneName": "Marshall Islands",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "MD",
+ "zoneName": "Maryland",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "MA",
+ "zoneName": "Massachusetts",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "MI",
+ "zoneName": "Michigan",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "MN",
+ "zoneName": "Minnesota",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "MS",
+ "zoneName": "Mississippi",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "MO",
+ "zoneName": "Missouri",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "MT",
+ "zoneName": "Montana",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "NE",
+ "zoneName": "Nebraska",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "NV",
+ "zoneName": "Nevada",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "NH",
+ "zoneName": "Nouveau Hampshire",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "NJ",
+ "zoneName": "New Jersey",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "NM",
+ "zoneName": "Nouveau Mexique",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "NY",
+ "zoneName": "New York",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "NC",
+ "zoneName": "Caroline du Nord",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "ND",
+ "zoneName": "Dakota du Nord",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "MP",
+ "zoneName": "Northern Mariana Islands",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "OH",
+ "zoneName": "Ohio",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "OK",
+ "zoneName": "Oklahoma",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "OR",
+ "zoneName": "Oregon",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "PA",
+ "zoneName": "Pennsylvanie",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "PR",
+ "zoneName": "Puerto Rico",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "RI",
+ "zoneName": "Rhode Island",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "SC",
+ "zoneName": "Caroline du Sud",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "SD",
+ "zoneName": "Dakota du Sud",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "TN",
+ "zoneName": "Tennessee",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "TX",
+ "zoneName": "Texas",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "UT",
+ "zoneName": "Utah",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "VT",
+ "zoneName": "Vermont",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "VI",
+ "zoneName": "Virgin Islands",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "VA",
+ "zoneName": "Virginie",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "WA",
+ "zoneName": "Washington",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "WV",
+ "zoneName": "West Virginia",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "WI",
+ "zoneName": "Wisconsin",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "WY",
+ "zoneName": "Wyoming",
+ "countryCode": "US"
+ },
+ {
+ "zoneCode": "AB",
+ "zoneName": "Alberta",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "BC",
+ "zoneName": "Columbie Britanique",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "MB",
+ "zoneName": "Manitoba",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "NF",
+ "zoneName": "Terre-Neuve - Labrador",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "NB",
+ "zoneName": "Nouveau Brunswick",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "NS",
+ "zoneName": "Nouvelle Écosse",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "NT",
+ "zoneName": "Territores du Nord-Ouest",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "NU",
+ "zoneName": "Nunavut",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "ON",
+ "zoneName": "Ontario",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "PE",
+ "zoneName": "Île-du-Prince-Édouard",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "QC",
+ "zoneName": "Québec",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "SK",
+ "zoneName": "Saskatchewan",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "YT",
+ "zoneName": "Yukon",
+ "countryCode": "CA"
+ },
+ {
+ "zoneCode": "NDS",
+ "zoneName": "Niedersachsen",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "BAW",
+ "zoneName": "Baden-Wrttemberg",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "BAY",
+ "zoneName": "Bayern",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "BER",
+ "zoneName": "Berlin",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "BRG",
+ "zoneName": "Brandenburg",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "BRE",
+ "zoneName": "Bremen",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "HAM",
+ "zoneName": "Hamburg",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "HES",
+ "zoneName": "Hessen",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "MEC",
+ "zoneName": "Mecklenburg-Vorpommern",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "NRW",
+ "zoneName": "Nordrhein-Westfalen",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "RHE",
+ "zoneName": "Rheinland-Pfalz",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "SAR",
+ "zoneName": "Saarland",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "SAS",
+ "zoneName": "Sachsen",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "SAC",
+ "zoneName": "Sachsen-Anhalt",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "SCN",
+ "zoneName": "Schleswig-Holstein",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "THE",
+ "zoneName": "Thringen",
+ "countryCode": "DE"
+ },
+ {
+ "zoneCode": "WIAT",
+ "zoneName": "Wien",
+ "countryCode": "AT"
+ },
+ {
+ "zoneCode": "NO",
+ "zoneName": "Niederosterreich",
+ "countryCode": "AT"
+ },
+ {
+ "zoneCode": "OO",
+ "zoneName": "Oberosterreich",
+ "countryCode": "AT"
+ },
+ {
+ "zoneCode": "SB",
+ "zoneName": "Salzburg",
+ "countryCode": "AT"
+ },
+ {
+ "zoneCode": "KN",
+ "zoneName": "Karten",
+ "countryCode": "AT"
+ },
+ {
+ "zoneCode": "ST",
+ "zoneName": "Steiermark",
+ "countryCode": "AT"
+ },
+ {
+ "zoneCode": "TIAT",
+ "zoneName": "Tirol",
+ "countryCode": "AT"
+ },
+ {
+ "zoneCode": "BLAT",
+ "zoneName": "Burgenland",
+ "countryCode": "AT"
+ },
+ {
+ "zoneCode": "VB",
+ "zoneName": "Voralberg",
+ "countryCode": "AT"
+ },
+ {
+ "zoneCode": "AG",
+ "zoneName": "Aargau",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "AI",
+ "zoneName": "Appenzell Innerrhoden",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "ARCH",
+ "zoneName": "Appenzell Ausserrhoden",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "BE",
+ "zoneName": "Bern",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "BL",
+ "zoneName": "Basel-Landschaft",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "BS",
+ "zoneName": "Basel-Stadt",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "FR",
+ "zoneName": "Freiburg",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "GE",
+ "zoneName": "Genf",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "GL",
+ "zoneName": "Glarus",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "GR",
+ "zoneName": "Graubnden",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "JU",
+ "zoneName": "Jura",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "LU",
+ "zoneName": "Luzern",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "NECH",
+ "zoneName": "Neuenburg",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "NW",
+ "zoneName": "Nidwalden",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "OW",
+ "zoneName": "Obwalden",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "SG",
+ "zoneName": "St. Gallen",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "SH",
+ "zoneName": "Schaffhausen",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "SO",
+ "zoneName": "Solothurn",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "SZ",
+ "zoneName": "Schwyz",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "TG",
+ "zoneName": "Thurgau",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "TI",
+ "zoneName": "Tessin",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "UR",
+ "zoneName": "Uri",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "VD",
+ "zoneName": "Waadt",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "VS",
+ "zoneName": "Wallis",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "ZG",
+ "zoneName": "Zug",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "ZH",
+ "zoneName": "Zrich",
+ "countryCode": "CH"
+ },
+ {
+ "zoneCode": "A Corua",
+ "zoneName": "A Corua",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Alava",
+ "zoneName": "Alava",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Albacete",
+ "zoneName": "Albacete",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Alicante",
+ "zoneName": "Alicante",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Almeria",
+ "zoneName": "Almeria",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Asturias",
+ "zoneName": "Asturias",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Avila",
+ "zoneName": "Avila",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Badajoz",
+ "zoneName": "Badajoz",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Baleares",
+ "zoneName": "Baleares",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Barcelona",
+ "zoneName": "Barcelona",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Burgos",
+ "zoneName": "Burgos",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Caceres",
+ "zoneName": "Caceres",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Cadiz",
+ "zoneName": "Cadiz",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Cantabria",
+ "zoneName": "Cantabria",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Castellon",
+ "zoneName": "Castellon",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Ceuta",
+ "zoneName": "Ceuta",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "CiudadReal",
+ "zoneName": "Ciudad Real",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Cordoba",
+ "zoneName": "Cordoba",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Cuenca",
+ "zoneName": "Cuenca",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Girona",
+ "zoneName": "Girona",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Granada",
+ "zoneName": "Granada",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Guadalajara",
+ "zoneName": "Guadalajara",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Guipuzcoa",
+ "zoneName": "Guipuzcoa",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Huelva",
+ "zoneName": "Huelva",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Huesca",
+ "zoneName": "Huesca",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Jaen",
+ "zoneName": "Jaen",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "LaRioja",
+ "zoneName": "La Rioja",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "LasPalmas",
+ "zoneName": "Las Palmas",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Leon",
+ "zoneName": "Leon",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Lleida",
+ "zoneName": "Lleida",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Lugo",
+ "zoneName": "Lugo",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Madrid",
+ "zoneName": "Madrid",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Malaga",
+ "zoneName": "Malaga",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Melilla",
+ "zoneName": "Melilla",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Murcia",
+ "zoneName": "Murcia",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Navarra",
+ "zoneName": "Navarra",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Ourense",
+ "zoneName": "Ourense",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Palencia",
+ "zoneName": "Palencia",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Pontevedra",
+ "zoneName": "Pontevedra",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Salamanca",
+ "zoneName": "Salamanca",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "SantaCruzdeTenerife",
+ "zoneName": "Santa Cruz de Tenerife",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Segovia",
+ "zoneName": "Segovia",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Sevilla",
+ "zoneName": "Sevilla",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Soria",
+ "zoneName": "Soria",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Tarragona",
+ "zoneName": "Tarragona",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Teruel",
+ "zoneName": "Teruel",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Toledo",
+ "zoneName": "Toledo",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Valencia",
+ "zoneName": "Valencia",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Valladolid",
+ "zoneName": "Valladolid",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Vizcaya",
+ "zoneName": "Vizcaya",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Zamora",
+ "zoneName": "Zamora",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode": "Zaragoza",
+ "zoneName": "Zaragoza",
+ "countryCode": "ES"
+ },
+ {
+ "zoneCode":"ACT",
+ "zoneName":"Territoire de la capitale australienne",
+ "countryCode":"AU"
+ },
+ {
+ "zoneCode":"WAAU",
+ "zoneName":"Australie-Occidentale",
+ "countryCode":"AU"
+ },
+ {
+ "zoneCode":"SA",
+ "zoneName":"Australie-Mridionale",
+ "countryCode":"AU"
+ },
+ {
+ "zoneCode":"NTAU",
+ "zoneName":"Territoire du Nord",
+ "countryCode":"AU"
+ },
+ {
+ "zoneCode":"VIC",
+ "zoneName":"Victoria",
+ "countryCode":"AU"
+ },
+ {
+ "zoneCode":"TAS",
+ "zoneName":"Tasmanie",
+ "countryCode":"AU"
+ },
+ {
+ "zoneCode":"QLD",
+ "zoneName":"Queensland",
+ "countryCode":"AU"
+ },
+ {
+ "zoneCode":"NSW",
+ "zoneName":"Nouvelle-Galles du Sud",
+ "countryCode":"AU"
+ }
+
+]
}
\ No newline at end of file
diff --git a/sm-core/src/main/resources/rules/manufacturer-shipping-ordertotal-rules.xls b/sm-core/src/main/resources/rules/manufacturer-shipping-ordertotal-rules.xls
index b85fa31..47d4cfe 100644
Binary files a/sm-core/src/main/resources/rules/manufacturer-shipping-ordertotal-rules.xls and b/sm-core/src/main/resources/rules/manufacturer-shipping-ordertotal-rules.xls differ
diff --git a/sm-core/src/main/resources/rules/shipping-custom-rules.xls b/sm-core/src/main/resources/rules/shipping-custom-rules.xls
index c640402..7428ae6 100644
Binary files a/sm-core/src/main/resources/rules/shipping-custom-rules.xls and b/sm-core/src/main/resources/rules/shipping-custom-rules.xls differ
sm-core/src/main/resources/search/product.json 28(+14 -14)
diff --git a/sm-core/src/main/resources/search/product.json b/sm-core/src/main/resources/search/product.json
index 4305699..3819b40 100644
--- a/sm-core/src/main/resources/search/product.json
+++ b/sm-core/src/main/resources/search/product.json
@@ -1,15 +1,15 @@
-{"product_en": {
- "properties" : {
- "name": {"type": "String","analyzer":"folding_en"},
- "price" : {"type":"String","index":"not_analyzed"},
- "categories" : {"type":"String","index":"not_analyzed"},
- "lang" : {"type":"String","index":"not_analyzed"},
- "store" : {"type":"String","index":"not_analyzed"},
- "availability" : {"type":"String","index":"not_analyzed"},
- "available" : {"type":"String","index":"not_analyzed"},
- "description" : {"type":"String","analyzer":"folding_en"},
- "tags" : {"type":"String","analyzer":"folding_en"}
- }
- }
-
+{"product_en": {
+ "properties" : {
+ "name": {"type": "String","analyzer":"folding_en"},
+ "price" : {"type":"String","index":"not_analyzed"},
+ "categories" : {"type":"String","index":"not_analyzed"},
+ "lang" : {"type":"String","index":"not_analyzed"},
+ "store" : {"type":"String","index":"not_analyzed"},
+ "availability" : {"type":"String","index":"not_analyzed"},
+ "available" : {"type":"String","index":"not_analyzed"},
+ "description" : {"type":"String","analyzer":"folding_en"},
+ "tags" : {"type":"String","analyzer":"folding_en"}
+ }
+ }
+
}
\ No newline at end of file
diff --git a/sm-core/src/main/resources/search/product_fr.json b/sm-core/src/main/resources/search/product_fr.json
index 9cbc80c..5518c37 100644
--- a/sm-core/src/main/resources/search/product_fr.json
+++ b/sm-core/src/main/resources/search/product_fr.json
@@ -1,14 +1,14 @@
-{"product_fr": {
- "properties" : {
- "name": {"type": "String","analyzer":"folding_fr"},
- "price" : {"type":"String","index":"not_analyzed"},
- "categories" : {"type":"String","index":"not_analyzed"},
- "lang" : {"type":"String","index":"not_analyzed"},
- "store" : {"type":"String","index":"not_analyzed"},
- "availability" : {"type":"String","index":"not_analyzed"},
- "available" : {"type":"String","index":"not_analyzed"},
- "description" : {"type":"String","analyzer":"folding_fr"},
- "tags" : {"type":"String","analyzer":"folding_fr"}
- }
- }
+{"product_fr": {
+ "properties" : {
+ "name": {"type": "String","analyzer":"folding_fr"},
+ "price" : {"type":"String","index":"not_analyzed"},
+ "categories" : {"type":"String","index":"not_analyzed"},
+ "lang" : {"type":"String","index":"not_analyzed"},
+ "store" : {"type":"String","index":"not_analyzed"},
+ "availability" : {"type":"String","index":"not_analyzed"},
+ "available" : {"type":"String","index":"not_analyzed"},
+ "description" : {"type":"String","analyzer":"folding_fr"},
+ "tags" : {"type":"String","analyzer":"folding_fr"}
+ }
+ }
}
\ No newline at end of file
diff --git a/sm-core/src/main/resources/spring/datasource-c3p0.xml b/sm-core/src/main/resources/spring/datasource-c3p0.xml
index 50ac670..dcc5d09 100644
--- a/sm-core/src/main/resources/spring/datasource-c3p0.xml
+++ b/sm-core/src/main/resources/spring/datasource-c3p0.xml
@@ -3,11 +3,11 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
- <bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
+ <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
p:driverClass="${db.driverClass}" p:jdbcUrl="${db.jdbcUrl}" p:user="${db.user}"
p:password="${db.password}" p:initialPoolSize="${db.initialPoolSize}"
p:minPoolSize="${db.minPoolSize}" p:maxPoolSize="${db.maxPoolSize}"
p:preferredTestQuery="${db.preferredTestQuery}" p:testConnectionOnCheckin="true"
p:idleConnectionTestPeriod="300" destroy-method="close" />
-
+
</beans>
diff --git a/sm-core/src/main/resources/spring/processors/shopizer-core-shipping-processors.xml b/sm-core/src/main/resources/spring/processors/shopizer-core-shipping-processors.xml
index ea85b8d..49b6601 100644
--- a/sm-core/src/main/resources/spring/processors/shopizer-core-shipping-processors.xml
+++ b/sm-core/src/main/resources/spring/processors/shopizer-core-shipping-processors.xml
@@ -10,8 +10,22 @@
<!-- Shipping pre-processors -->
<util:list id="shippingModulePreProcessors" value-type="com.salesmanager.core.business.modules.integration.shipping.model.ShippingQuotePrePostProcessModule">
<!-- Not configured by default, should know what is your intention before enabling -->
-<!-- <ref bean="shippingDistancePreProcessor"/>
- <ref bean="shippingMethodDecisionProcess"/> -->
+
+ <!--
+ Shipping distance preprocessor as indicated in its name is a module that calculates
+ the distance between shipping origin and customer shipping address. It uses google
+ distance calculation and requires google api keys to be configured belog.
+ -->
+ <ref bean="shippingDistancePreProcessor"/>
+
+ <!--
+ Used drules decision tables to decide at runtime which module the system will use
+ for instance you can specify rules such as if dimension (volume) of each item lte
+ a given volume then use this method, otherwise use another one. Decision tables
+ need to be configured in resources/rules/shipping-decision-rules.xls
+
+ -->
+ <!-- <ref bean="shippingMethodDecisionProcess"/> -->
</util:list>
<!-- Calculates the distance between the origin and destination -->
@@ -19,7 +33,7 @@
<bean id="shippingDistancePreProcessor"
class="com.shopizer.modules.shipping.distance.ShippingDistancePreProcessorImpl">
<!-- Google API key -->
- <property name="apiKey" value="YOUR_KEY_HERE"/>
+ <property name="apiKey" value="${shippingDistancePreProcessor.apiKey}"/>
<property name="allowedZonesCodes" ref="acceptedZones"/>
</bean>
@@ -33,13 +47,15 @@
<!-- Shipping post-processors -->
<util:list id="shippingModulePostProcessors" value-type="com.salesmanager.core.business.modules.integration.shipping.model.ShippingQuotePrePostProcessModule">
<!-- Not configured by default, should be configured to be used -->
- <!-- <ref bean="storePickUp"/> --><!-- defined in core-modules -->
+ <ref bean="storePickUp"/><!-- defined in core-modules -->
</util:list>
<!-- List of accepted zones for using shipping distance pre processor -->
<util:list id="acceptedZones" value-type="java.lang.String">
<value>NY</value>
<value>NJ</value>
+ <value>QC</value>
+ <value>ON</value>
</util:list>
</beans>
\ No newline at end of file
diff --git a/sm-core/src/main/resources/spring/shopizer-core-config.xml b/sm-core/src/main/resources/spring/shopizer-core-config.xml
index 91ceac8..d8f95a2 100644
--- a/sm-core/src/main/resources/spring/shopizer-core-config.xml
+++ b/sm-core/src/main/resources/spring/shopizer-core-config.xml
@@ -28,7 +28,7 @@
<beans:bean id="entityManagerFactory" name="shopizerContainer" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
- <beans:property name="dataSource" ref="datasource" />
+ <beans:property name="dataSource" ref="dataSource" />
<beans:property name="jpaVendorAdapter">
<beans:bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
@@ -85,17 +85,7 @@
class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
- <!-- properties files -->
- <beans:bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <beans:property name="ignoreUnresolvablePlaceholders" value="false"/>
- <beans:property name="locations">
- <beans:list>
- <beans:value>classpath:database.properties</beans:value>
- <beans:value>classpath:email.properties</beans:value>
- <beans:value>classpath:configs.properties</beans:value>
- </beans:list>
- </beans:property>
- </beans:bean>
+
<!-- in sm-shop -->
@@ -119,6 +109,42 @@
<!-- After app context init -->
<beans:bean id="applicationContextListenerUtils" class="com.salesmanager.core.business.utils.ApplicationContextListenerUtils" />
-
+
+
+ <!--
+
+ properties files
+
+
+
+
+ -->
+ <beans:beans profile="default">
+ <beans:bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
+ <beans:property name="ignoreUnresolvablePlaceholders" value="false"/>
+ <beans:property name="locations">
+ <beans:list>
+ <beans:value>classpath:database.properties</beans:value>
+ <beans:value>classpath:email.properties</beans:value>
+ <beans:value>classpath:configs.properties</beans:value>
+ <beans:value>classpath:authentication.properties</beans:value>
+ </beans:list>
+ </beans:property>
+ </beans:bean>
+ </beans:beans>
+
+ <beans:beans profile="docker">
+ <beans:bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
+ <beans:property name="ignoreUnresolvablePlaceholders" value="false"/>
+ <beans:property name="locations">
+ <beans:list>
+ <beans:value>classpath:profiles/docker/database.properties</beans:value>
+ <beans:value>classpath:email.properties</beans:value>
+ <beans:value>classpath:configs.properties</beans:value>
+ <beans:value>classpath:authentication.properties</beans:value>
+ </beans:list>
+ </beans:property>
+ </beans:bean>
+ </beans:beans>
</beans:beans>
\ No newline at end of file
diff --git a/sm-core/src/main/resources/spring/shopizer-core-context.xml b/sm-core/src/main/resources/spring/shopizer-core-context.xml
index 6d54889..8f299fa 100644
--- a/sm-core/src/main/resources/spring/shopizer-core-context.xml
+++ b/sm-core/src/main/resources/spring/shopizer-core-context.xml
@@ -1,45 +1,45 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="http://www.springframework.org/schema/data/jpa"
- xmlns:util="http://www.springframework.org/schema/util"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop.xsd
- http://www.springframework.org/schema/util
- http://www.springframework.org/schema/util/spring-util.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/data/jpa
- http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
-
- <!-- This is the entry XML point -->
-
-
- <!-- datasource -->
- <beans:import resource="classpath:/spring/datasource-c3p0.xml" />
- <!-- cache -->
- <beans:import resource="classpath:/spring/shopizer-core-ehcache.xml" />
- <!-- DB, TX and properties -->
- <beans:import resource="classpath:/spring/shopizer-core-config.xml" />
- <!-- modules -->
- <beans:import resource="classpath:/spring/shopizer-core-modules.xml" />
- <!-- shipping pre processors -->
- <beans:import resource="classpath:/spring/processors/shopizer-core-shipping-processors.xml" />
- <!-- order total pre processors -->
- <beans:import resource="classpath:/spring/processors/shopizer-core-ordertotal-processors.xml" />
- <!-- rules -->
- <beans:import resource="classpath:/spring/shopizer-core-rules.xml" />
- <!-- search -->
- <beans:import resource="classpath:/spring/shopizer-search.xml" />
-
-
-
-
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns="http://www.springframework.org/schema/data/jpa"
+ xmlns:util="http://www.springframework.org/schema/util"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:aop="http://www.springframework.org/schema/aop"
+ xmlns:tx="http://www.springframework.org/schema/tx"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/tx
+ http://www.springframework.org/schema/tx/spring-tx.xsd
+ http://www.springframework.org/schema/aop
+ http://www.springframework.org/schema/aop/spring-aop.xsd
+ http://www.springframework.org/schema/util
+ http://www.springframework.org/schema/util/spring-util.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/data/jpa
+ http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">
+
+ <!-- This is the entry XML point -->
+
+
+ <!-- datasource -->
+ <beans:import resource="classpath:/spring/datasource-c3p0.xml" />
+ <!-- cache -->
+ <beans:import resource="classpath:/spring/shopizer-core-ehcache.xml" />
+ <!-- DB, TX and properties -->
+ <beans:import resource="classpath:/spring/shopizer-core-config.xml" />
+ <!-- modules -->
+ <beans:import resource="classpath:/spring/shopizer-core-modules.xml" />
+ <!-- shipping pre processors -->
+ <beans:import resource="classpath:/spring/processors/shopizer-core-shipping-processors.xml" />
+ <!-- order total pre processors -->
+ <beans:import resource="classpath:/spring/processors/shopizer-core-ordertotal-processors.xml" />
+ <!-- rules -->
+ <beans:import resource="classpath:/spring/shopizer-core-rules.xml" />
+ <!-- search -->
+ <beans:import resource="classpath:/spring/shopizer-search.xml" />
+
+
+
+
</beans:beans>
\ No newline at end of file
diff --git a/sm-core/src/main/resources/spring/shopizer-core-ehcache.xml b/sm-core/src/main/resources/spring/shopizer-core-ehcache.xml
index cc1fce0..9f676b2 100644
--- a/sm-core/src/main/resources/spring/shopizer-core-ehcache.xml
+++ b/sm-core/src/main/resources/spring/shopizer-core-ehcache.xml
@@ -1,31 +1,31 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task"
- xmlns:util="http://www.springframework.org/schema/util"
- xsi:schemaLocation="
- http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
- http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
- http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
- http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
- http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
- http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring/ehcache-spring.xsd">
-
-
- <bean id="springCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
- <property name="configLocation" value="classpath:/spring/ehcache.xml" />
- <property name="shared" value="false" />
- </bean>
-
- <bean id="serviceCacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
- <property name="cacheManager">
- <ref bean="springCacheManager" />
- </property>
- </bean>
-
- <bean id="serviceCache" factory-bean="serviceCacheManager" factory-method="getCache">
- <constructor-arg value="com.shopizer.OBJECT_CACHE" />
- </bean>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"
+ xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task"
+ xmlns:util="http://www.springframework.org/schema/util"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd
+ http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
+ http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
+ http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
+ http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring/ehcache-spring.xsd">
+
+
+ <bean id="springCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
+ <property name="configLocation" value="classpath:/spring/ehcache.xml" />
+ <property name="shared" value="false" />
+ </bean>
+
+ <bean id="serviceCacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
+ <property name="cacheManager">
+ <ref bean="springCacheManager" />
+ </property>
+ </bean>
+
+ <bean id="serviceCache" factory-bean="serviceCacheManager" factory-method="getCache">
+ <constructor-arg value="com.shopizer.OBJECT_CACHE" />
+ </bean>
+
</beans>
\ No newline at end of file
diff --git a/sm-core/src/main/resources/spring/shopizer-core-modules.xml b/sm-core/src/main/resources/spring/shopizer-core-modules.xml
index 95e2fbd..5339980 100644
--- a/sm-core/src/main/resources/spring/shopizer-core-modules.xml
+++ b/sm-core/src/main/resources/spring/shopizer-core-modules.xml
@@ -36,6 +36,7 @@
<beans:entry key="paypal-express-checkout" value-ref="paypal-ec"/>
<beans:entry key="moneyorder" value-ref="moneyorder"/>
<beans:entry key="stripe" value-ref="stripe"/>
+ <beans:entry key="braintree" value-ref="braintree"/>
</util:map>
<!-- Shipping -->
@@ -69,6 +70,8 @@
class="com.salesmanager.core.business.modules.integration.payment.impl.PayPalExpressCheckoutPayment"/>
<beans:bean id="stripe"
class="com.salesmanager.core.business.modules.integration.payment.impl.StripePayment"/>
+ <beans:bean id="braintree"
+ class="com.salesmanager.core.business.modules.integration.payment.impl.BraintreePayment"/>
@@ -101,10 +104,10 @@
<beans:bean id="cmsProductImage"
class="com.salesmanager.core.business.modules.cms.product.infinispan.CmsImageFileManagerImpl" factory-method="getInstance" >
<beans:property name="cacheManager">
- <beans:ref bean="storeCacheManager" />
+ <beans:ref bean="localCacheManager" />
</beans:property>
- <beans:property name="rootName" value="product-merchant"/>
- <!--<beans:property name="rootName" value="/Applications/AMPPS/www/shop-images"/>-->
+ <!--<beans:property name="rootName" value="product-merchant"/>-->
+ <beans:property name="rootName" value="/Applications/MAMP/htdocs/bam-images"/>
</beans:bean>
@@ -127,10 +130,10 @@
<beans:bean id="cmsStoreFile"
class="com.salesmanager.core.business.modules.cms.content.infinispan.CmsStaticContentFileManagerImpl" factory-method="getInstance" >
<beans:property name="cacheManager">
- <beans:ref bean="storeCacheManager" />
+ <beans:ref bean="localCacheManager" />
</beans:property>
<beans:property name="rootName" value="store-merchant"/>
- <!-- <beans:property name="rootName" value="/Applications/AMPPS/www/shop-images"/> -->
+ <!--<beans:property name="rootName" value="/Applications/MAMP/htdocs/bam-images"/>-->
</beans:bean>
@@ -154,10 +157,11 @@
<!-- CMS implementation for static content data -->
<beans:bean id="cmsStaticFile" class="com.salesmanager.core.business.modules.cms.content.infinispan.CmsStaticContentFileManagerImpl" factory-method="getInstance">
<beans:property name="cacheManager">
- <beans:ref bean="filesCacheManager" />
+ <!--<beans:ref bean="filesCacheManager" />-->
+ <beans:ref bean="localCacheManager" />
</beans:property>
<beans:property name="rootName" value="store-merchant"/>
- <!-- <beans:property name="rootName" value="/Applications/AMPPS/www/shop-images/"/> -->
+ <!--<beans:property name="rootName" value="/Applications/MAMP/htdocs/bam-images/"/>-->
</beans:bean>
@@ -181,24 +185,26 @@
<!-- CMS implementation for static content data -->
<beans:bean id="cmsProductFile" class="com.salesmanager.core.business.modules.cms.content.infinispan.CmsStaticContentFileManagerImpl" factory-method="getInstance">
<beans:property name="cacheManager">
- <beans:ref bean="storeCacheManager" />
+ <beans:ref bean="localCacheManager" />
</beans:property>
<beans:property name="rootName" value="product-file"/>
- <!-- <beans:property name="rootName" value="/Applications/AMPPS/www/shop-images"/> -->
+ <!--<beans:property name="rootName" value="/Applications/MAMP/htdocs/bam-images"/>-->
</beans:bean>
<!-- Store Cache Manager (infinispan) -->
- <beans:bean id="storeCacheManager"
+ <beans:bean id="localCacheManager"
class="com.salesmanager.core.business.modules.cms.impl.StoreCacheManagerImpl" factory-method="getInstance" >
</beans:bean>
- <!-- Local cache manager (for apache httpd)
+ <!-- Local cache manager (for apache httpd)-->
+ <!--
<beans:bean id="localCacheManager"
class="com.salesmanager.core.business.modules.cms.impl.LocalCacheManagerImpl" factory-method="getInstance" >
</beans:bean>
- -->
+ -->
+
diff --git a/sm-core/src/main/resources/spring/shopizer-core-rules.xml b/sm-core/src/main/resources/spring/shopizer-core-rules.xml
index 33276be..b8bee83 100644
--- a/sm-core/src/main/resources/spring/shopizer-core-rules.xml
+++ b/sm-core/src/main/resources/spring/shopizer-core-rules.xml
@@ -1,61 +1,61 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:drools="http://drools.org/schema/drools-spring"
- xmlns:util="http://www.springframework.org/schema/util"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
- http://drools.org/schema/drools-spring http://drools.org/schema/drools-spring.xsd
- http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
-
- <!-- Decision table for the the selection of a shipping method -->
- <!-- from shopizer-shipping-decision-table-module -->
- <drools:kbase id="shippingMethodDecisionBase">
- <drools:resources>
- <drools:resource type="DTABLE" source="classpath:rules/shipping-decision-rules.xls"/>
- </drools:resources>
- </drools:kbase>
-
- <drools:ksession id="shippingMethodDecision" name="shippingMethodDecision" type="stateless" kbase="shippingMethodDecisionBase"/>
-
- <!-- concrete module for the above kbase -->
- <beans:bean id="shippingMethodDecisionProcess" class="com.salesmanager.core.business.modules.integration.shipping.impl.ShippingDecisionPreProcessorImpl">
- <beans:property name="shippingMethodDecision" ref="shippingMethodDecision" />
- <beans:property name="kbase" ref="shippingMethodDecisionBase" />
- </beans:bean>
-
- <!-- Custom shipping price based on drool rules -->
- <!-- Basic custom shipping rules -->
- <drools:kbase id="shippingPriceDecisionBase">
- <drools:resources>
- <drools:resource type="DTABLE" source="classpath:rules/shipping-custom-rules.xls"/>
- </drools:resources>
- </drools:kbase>
-
- <drools:ksession id="shippingPriceRule" name="shippingPriceRule" type="stateless" kbase="shippingPriceDecisionBase"/>
-
- <!-- concrete module for the above kbase -->
- <beans:bean id="customShippingPriceModule" class="com.salesmanager.core.business.modules.integration.shipping.impl.CustomShippingQuoteRules">
- <beans:property name="shippingPriceRule" ref="shippingPriceRule" />
- <beans:property name="kbase" ref="shippingPriceDecisionBase" />
- </beans:bean>
-
- <!-- placeholder for order-total variation based on product manufacturer -->
-
- <!-- Basic Manufacturer Shipping Method rules -->
- <drools:kbase id="manufacturerShippingMethodOrderTotalBase">
- <drools:resources>
- <drools:resource type="DTABLE" source="classpath:rules/manufacturer-shipping-ordertotal-rules.xls"/>
- </drools:resources>
- </drools:kbase>
-
- <drools:ksession id="manufacturerShippingMethodOrderTotalDecision" name="manufacturerShippingMethodOrderTotalDecision" type="stateless" kbase="manufacturerShippingMethodOrderTotalBase"/>
-
- <!-- concrete module for the above kbase -->
- <beans:bean id="manufacturerShippingCodeOrderTotalModule" class="com.salesmanager.core.business.modules.order.total.ManufacturerShippingCodeOrderTotalModuleImpl">
- <beans:property name="orderTotalMethodDecision" ref="manufacturerShippingMethodOrderTotalDecision" />
- <beans:property name="kbase" ref="manufacturerShippingMethodOrderTotalBase" />
- <beans:property name="pricingService" ref="pricingService" />
- </beans:bean>
-
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns:beans="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:drools="http://drools.org/schema/drools-spring"
+ xmlns:util="http://www.springframework.org/schema/util"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://drools.org/schema/drools-spring http://drools.org/schema/drools-spring.xsd
+ http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
+
+ <!-- Decision table for the the selection of a shipping method -->
+ <!-- from shopizer-shipping-decision-table-module -->
+ <drools:kbase id="shippingMethodDecisionBase">
+ <drools:resources>
+ <drools:resource type="DTABLE" source="classpath:rules/shipping-decision-rules.xls"/>
+ </drools:resources>
+ </drools:kbase>
+
+ <drools:ksession id="shippingMethodDecision" name="shippingMethodDecision" type="stateless" kbase="shippingMethodDecisionBase"/>
+
+ <!-- concrete module for the above kbase -->
+ <beans:bean id="shippingMethodDecisionProcess" class="com.salesmanager.core.business.modules.integration.shipping.impl.ShippingDecisionPreProcessorImpl">
+ <beans:property name="shippingMethodDecision" ref="shippingMethodDecision" />
+ <beans:property name="kbase" ref="shippingMethodDecisionBase" />
+ </beans:bean>
+
+ <!-- Custom shipping price based on drool rules -->
+ <!-- Basic custom shipping rules -->
+ <drools:kbase id="shippingPriceDecisionBase">
+ <drools:resources>
+ <drools:resource type="DTABLE" source="classpath:rules/shipping-custom-rules.xls"/>
+ </drools:resources>
+ </drools:kbase>
+
+ <drools:ksession id="shippingPriceRule" name="shippingPriceRule" type="stateless" kbase="shippingPriceDecisionBase"/>
+
+ <!-- concrete module for the above kbase -->
+ <beans:bean id="customShippingPriceModule" class="com.salesmanager.core.business.modules.integration.shipping.impl.CustomShippingQuoteRules">
+ <beans:property name="shippingPriceRule" ref="shippingPriceRule" />
+ <beans:property name="kbase" ref="shippingPriceDecisionBase" />
+ </beans:bean>
+
+ <!-- placeholder for order-total variation based on product manufacturer -->
+
+ <!-- Basic Manufacturer Shipping Method rules -->
+ <drools:kbase id="manufacturerShippingMethodOrderTotalBase">
+ <drools:resources>
+ <drools:resource type="DTABLE" source="classpath:rules/manufacturer-shipping-ordertotal-rules.xls"/>
+ </drools:resources>
+ </drools:kbase>
+
+ <drools:ksession id="manufacturerShippingMethodOrderTotalDecision" name="manufacturerShippingMethodOrderTotalDecision" type="stateless" kbase="manufacturerShippingMethodOrderTotalBase"/>
+
+ <!-- concrete module for the above kbase -->
+ <beans:bean id="manufacturerShippingCodeOrderTotalModule" class="com.salesmanager.core.business.modules.order.total.ManufacturerShippingCodeOrderTotalModuleImpl">
+ <beans:property name="orderTotalMethodDecision" ref="manufacturerShippingMethodOrderTotalDecision" />
+ <beans:property name="kbase" ref="manufacturerShippingMethodOrderTotalBase" />
+ <beans:property name="pricingService" ref="pricingService" />
+ </beans:bean>
+
</beans:beans>
\ No newline at end of file
sm-core/src/main/resources/spring/shopizer-search.xml 406(+203 -203)
diff --git a/sm-core/src/main/resources/spring/shopizer-search.xml b/sm-core/src/main/resources/spring/shopizer-search.xml
index 4f0099c..b9b2aa6 100644
--- a/sm-core/src/main/resources/spring/shopizer-search.xml
+++ b/sm-core/src/main/resources/spring/shopizer-search.xml
@@ -1,204 +1,204 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:util="http://www.springframework.org/schema/util"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
- ">
-
- <!-- can have different search client for indexing & searching -->
- <bean id="searchClient" class="com.shopizer.search.utils.SearchClient">
- <property name="serverConfiguration">
- <ref bean="serverConfiguration" />
- </property>
- </bean>
-
- <!-- Server configuration -->
- <bean id="serverConfiguration" class="com.shopizer.search.utils.ServerConfiguration">
- <property name="clusterName" value="${elasticsearch.cluster.name}"/>
- <!-- local (embedded version, will create new indexes in the working directory) or remote (requires existing server) -->
- <property name="mode" value="${elasticsearch.mode}"/>
- <!-- http interface to ES server -->
- <property name="clusterHost" value="${elasticsearch.server.host}"/>
- <property name="clusterPort" value="${elasticsearch.server.port}"/>
-
- <property name="proxyUser" value="${elasticsearch.server.proxy.user}"/>
- <property name="proxyPassword" value="${elasticsearch.server.proxy.password}"/>
- </bean>
-
- <util:list id="facetTermsList" value-type="java.lang.String">
- <value>categories</value>
- <value>manufacturer</value>
- </util:list>
-
- <bean id="searchDelegate" class="com.shopizer.search.services.impl.SearchDelegateImpl">
- <property name="searchClient">
- <ref bean="searchClient" />
- </property>
- </bean>
-
- <!-- Main service -->
- <bean id="searchService" class="com.shopizer.search.services.SearchService"></bean>
-
-
- <!--
- Flow definitions for indexing and searching
- -->
-
-
- <bean id="searchWorkflow" class="com.shopizer.search.services.workflow.SearchWorkflow">
- <property name="searchFlow">
- <list>
- <bean id="search" class="com.shopizer.search.services.worker.SearchWorkerImpl"/>
- </list>
- </property>
- <property name="searchKeywordWorkflow">
- <list>
- <bean id="searchKeyword" class="com.shopizer.search.services.worker.KeywordSearchWorkerImpl"/>
- </list>
- </property>
- <property name="searchClient">
- <ref bean="searchClient" />
- </property>
- </bean>
-
- <bean id="indexWorkflow" class="com.shopizer.search.services.workflow.IndexWorkflow">
- <property name="indexWorkflow">
- <list>
- <ref bean="index" />
- <ref bean="keyword" />
- </list>
- </property>
- <property name="searchClient">
- <ref bean="searchClient" />
- </property>
- </bean>
-
- <bean id="deleteWorkflow" class="com.shopizer.search.services.workflow.DeleteObjectWorkflow">
- <property name="deleteObjectWorkflow">
- <list>
- <bean id="deleteObject" class="com.shopizer.search.services.worker.DeleteObjectImpl"/>
- <ref bean="deleteKeywords" />
- </list>
- </property>
- <property name="searchClient">
- <ref bean="searchClient" />
- </property>
- </bean>
-
-
- <bean id="getWorkflow" class="com.shopizer.search.services.workflow.GetWorkflow">
- <property name="searchClient">
- <ref bean="searchClient" />
- </property>
- </bean>
-
- <bean id="deleteKeywords" class="com.shopizer.search.services.worker.DeleteKeywordsImpl">
- <property name="indexConfigurations">
- <list>
- <ref bean="keywordindex_en_defaultstore" />
- <ref bean="keywordindex_fr_defaultstore" />
- </list>
- </property>
- </bean>
-
- <bean id="index" class="com.shopizer.search.services.worker.ObjectIndexerImpl">
- <property name="indexConfigurations">
- <list>
- <ref bean="productindex_en_defaultstore" />
- <ref bean="productindex_fr_defaultstore" />
- </list>
- </property>
- </bean>
-
-
-
- <!-- The presence of those properties will allow the creation of mapping files -->
- <bean id="productindex_en_defaultstore" class="com.shopizer.search.utils.IndexConfiguration">
- <property name="collectionName" value="product_en_default"/>
- <property name="indexName" value="product_en"/>
- <property name="mappingFileName" value="search/product.json"/>
- <!-- not necessary, only to define index and search rules -->
- <property name="settingsFileName" value="search/settings_product.json"/>
- </bean>
-
- <bean id="productindex_fr_defaultstore" class="com.shopizer.search.utils.IndexConfiguration">
- <property name="collectionName" value="product_fr_default"/>
- <property name="indexName" value="product_fr"/>
- <property name="mappingFileName" value="search/product_fr.json"/>
- <!-- not necessary, only to define index and search rules -->
- <property name="settingsFileName" value="search/settings_product_fr.json"/>
- </bean>
-
- <bean id="keyword" class="com.shopizer.search.services.worker.KeywordIndexerImpl">
- <property name="indexConfigurations">
- <list>
- <ref bean="keywordindex_en_defaultstore" />
- <ref bean="keywordindex_fr_defaultstore" />
- </list>
- </property>
- </bean>
-
- <bean id="keywordindex_en_defaultstore" class="com.shopizer.search.utils.CustomIndexConfiguration">
- <property name="collectionName" value="keyword_en_default"/>
- <property name="indexName" value="keyword_en"/>
- <property name="createOnIndexName" value="product_en"/>
- <property name="mappingFileName" value="search/keyword.json"/>
- <property name="settingsFileName" value="search/settings_keyword.json"/>
- <property name="fields">
- <list>
- <ref bean="field1" />
- <ref bean="field2" />
- </list>
- </property>
- <!-- NO FILTERS
- <property name="filters">
- <list>
- <ref bean="filter1" />
- </list>
- </property>
- -->
- </bean>
-
-
- <bean id="keywordindex_fr_defaultstore" class="com.shopizer.search.utils.CustomIndexConfiguration">
- <property name="collectionName" value="keyword_fr_default"/>
- <property name="indexName" value="keyword_fr"/>
- <property name="createOnIndexName" value="product_fr"/>
- <property name="mappingFileName" value="search/keyword_fr.json"/>
- <property name="settingsFileName" value="search/settings_keyword.json"/>
- <property name="fields">
- <list>
- <ref bean="field1" />
- <ref bean="field2" />
- </list>
- </property>
- <!-- NO FILTERS
- <property name="filters">
- <list>
- <ref bean="filter1" />
- </list>
- </property>
- -->
- </bean>
-
-
- <!-- supported field types List, Integer, Double, Boolean, String -->
- <bean id="field1" class="com.shopizer.search.utils.CustomIndexFieldConfiguration">
- <property name="fieldName" value="tags"/>
- <property name="fieldType" value="List"/>
- </bean>
- <bean id="field2" class="com.shopizer.search.utils.CustomIndexFieldConfiguration">
- <property name="fieldName" value="name"/>
- <property name="fieldType" value="String"/>
- </bean>
- <!--
- <bean id="filter1" class="com.shopizer.search.utils.CustomIndexFieldConfiguration">
- <property name="fieldName" value="price"/>
- <property name="fieldType" value="Double"/>
- </bean>
- -->
-
+<?xml version="1.0" encoding="UTF-8"?>
+
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:util="http://www.springframework.org/schema/util"
+ xsi:schemaLocation="
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
+ ">
+
+ <!-- can have different search client for indexing & searching -->
+ <bean id="searchClient" class="com.shopizer.search.utils.SearchClient">
+ <property name="serverConfiguration">
+ <ref bean="serverConfiguration" />
+ </property>
+ </bean>
+
+ <!-- Server configuration -->
+ <bean id="serverConfiguration" class="com.shopizer.search.utils.ServerConfiguration">
+ <property name="clusterName" value="${elasticsearch.cluster.name}"/>
+ <!-- local (embedded version, will create new indexes in the working directory) or remote (requires existing server) -->
+ <property name="mode" value="${elasticsearch.mode}"/>
+ <!-- http interface to ES server -->
+ <property name="clusterHost" value="${elasticsearch.server.host}"/>
+ <property name="clusterPort" value="${elasticsearch.server.port}"/>
+
+ <property name="proxyUser" value="${elasticsearch.server.proxy.user}"/>
+ <property name="proxyPassword" value="${elasticsearch.server.proxy.password}"/>
+ </bean>
+
+ <util:list id="facetTermsList" value-type="java.lang.String">
+ <value>categories</value>
+ <value>manufacturer</value>
+ </util:list>
+
+ <bean id="searchDelegate" class="com.shopizer.search.services.impl.SearchDelegateImpl">
+ <property name="searchClient">
+ <ref bean="searchClient" />
+ </property>
+ </bean>
+
+ <!-- Main service -->
+ <bean id="searchService" class="com.shopizer.search.services.SearchService"></bean>
+
+
+ <!--
+ Flow definitions for indexing and searching
+ -->
+
+
+ <bean id="searchWorkflow" class="com.shopizer.search.services.workflow.SearchWorkflow">
+ <property name="searchFlow">
+ <list>
+ <bean id="search" class="com.shopizer.search.services.worker.SearchWorkerImpl"/>
+ </list>
+ </property>
+ <property name="searchKeywordWorkflow">
+ <list>
+ <bean id="searchKeyword" class="com.shopizer.search.services.worker.KeywordSearchWorkerImpl"/>
+ </list>
+ </property>
+ <property name="searchClient">
+ <ref bean="searchClient" />
+ </property>
+ </bean>
+
+ <bean id="indexWorkflow" class="com.shopizer.search.services.workflow.IndexWorkflow">
+ <property name="indexWorkflow">
+ <list>
+ <ref bean="index" />
+ <ref bean="keyword" />
+ </list>
+ </property>
+ <property name="searchClient">
+ <ref bean="searchClient" />
+ </property>
+ </bean>
+
+ <bean id="deleteWorkflow" class="com.shopizer.search.services.workflow.DeleteObjectWorkflow">
+ <property name="deleteObjectWorkflow">
+ <list>
+ <bean id="deleteObject" class="com.shopizer.search.services.worker.DeleteObjectImpl"/>
+ <ref bean="deleteKeywords" />
+ </list>
+ </property>
+ <property name="searchClient">
+ <ref bean="searchClient" />
+ </property>
+ </bean>
+
+
+ <bean id="getWorkflow" class="com.shopizer.search.services.workflow.GetWorkflow">
+ <property name="searchClient">
+ <ref bean="searchClient" />
+ </property>
+ </bean>
+
+ <bean id="deleteKeywords" class="com.shopizer.search.services.worker.DeleteKeywordsImpl">
+ <property name="indexConfigurations">
+ <list>
+ <ref bean="keywordindex_en_defaultstore" />
+ <ref bean="keywordindex_fr_defaultstore" />
+ </list>
+ </property>
+ </bean>
+
+ <bean id="index" class="com.shopizer.search.services.worker.ObjectIndexerImpl">
+ <property name="indexConfigurations">
+ <list>
+ <ref bean="productindex_en_defaultstore" />
+ <ref bean="productindex_fr_defaultstore" />
+ </list>
+ </property>
+ </bean>
+
+
+
+ <!-- The presence of those properties will allow the creation of mapping files -->
+ <bean id="productindex_en_defaultstore" class="com.shopizer.search.utils.IndexConfiguration">
+ <property name="collectionName" value="product_en_default"/>
+ <property name="indexName" value="product_en"/>
+ <property name="mappingFileName" value="search/product.json"/>
+ <!-- not necessary, only to define index and search rules -->
+ <property name="settingsFileName" value="search/settings_product.json"/>
+ </bean>
+
+ <bean id="productindex_fr_defaultstore" class="com.shopizer.search.utils.IndexConfiguration">
+ <property name="collectionName" value="product_fr_default"/>
+ <property name="indexName" value="product_fr"/>
+ <property name="mappingFileName" value="search/product_fr.json"/>
+ <!-- not necessary, only to define index and search rules -->
+ <property name="settingsFileName" value="search/settings_product_fr.json"/>
+ </bean>
+
+ <bean id="keyword" class="com.shopizer.search.services.worker.KeywordIndexerImpl">
+ <property name="indexConfigurations">
+ <list>
+ <ref bean="keywordindex_en_defaultstore" />
+ <ref bean="keywordindex_fr_defaultstore" />
+ </list>
+ </property>
+ </bean>
+
+ <bean id="keywordindex_en_defaultstore" class="com.shopizer.search.utils.CustomIndexConfiguration">
+ <property name="collectionName" value="keyword_en_default"/>
+ <property name="indexName" value="keyword_en"/>
+ <property name="createOnIndexName" value="product_en"/>
+ <property name="mappingFileName" value="search/keyword.json"/>
+ <property name="settingsFileName" value="search/settings_keyword.json"/>
+ <property name="fields">
+ <list>
+ <ref bean="field1" />
+ <ref bean="field2" />
+ </list>
+ </property>
+ <!-- NO FILTERS
+ <property name="filters">
+ <list>
+ <ref bean="filter1" />
+ </list>
+ </property>
+ -->
+ </bean>
+
+
+ <bean id="keywordindex_fr_defaultstore" class="com.shopizer.search.utils.CustomIndexConfiguration">
+ <property name="collectionName" value="keyword_fr_default"/>
+ <property name="indexName" value="keyword_fr"/>
+ <property name="createOnIndexName" value="product_fr"/>
+ <property name="mappingFileName" value="search/keyword_fr.json"/>
+ <property name="settingsFileName" value="search/settings_keyword.json"/>
+ <property name="fields">
+ <list>
+ <ref bean="field1" />
+ <ref bean="field2" />
+ </list>
+ </property>
+ <!-- NO FILTERS
+ <property name="filters">
+ <list>
+ <ref bean="filter1" />
+ </list>
+ </property>
+ -->
+ </bean>
+
+
+ <!-- supported field types List, Integer, Double, Boolean, String -->
+ <bean id="field1" class="com.shopizer.search.utils.CustomIndexFieldConfiguration">
+ <property name="fieldName" value="tags"/>
+ <property name="fieldType" value="List"/>
+ </bean>
+ <bean id="field2" class="com.shopizer.search.utils.CustomIndexFieldConfiguration">
+ <property name="fieldName" value="name"/>
+ <property name="fieldType" value="String"/>
+ </bean>
+ <!--
+ <bean id="filter1" class="com.shopizer.search.utils.CustomIndexFieldConfiguration">
+ <property name="fieldName" value="price"/>
+ <property name="fieldType" value="Double"/>
+ </bean>
+ -->
+
</beans>
\ No newline at end of file
diff --git a/sm-core/src/main/resources/templates/email/email_template_checkout.ftl b/sm-core/src/main/resources/templates/email/email_template_checkout.ftl
index 0a17d7f..dbe0a62 100644
--- a/sm-core/src/main/resources/templates/email/email_template_checkout.ftl
+++ b/sm-core/src/main/resources/templates/email/email_template_checkout.ftl
@@ -1,417 +1,417 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html>
-<head>
-<!-- If you delete this meta tag, Earth will fall into the sun. -->
-<meta name="viewport" content="width=device-width" />
-
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<title></title>
-
-<style type="text/css">
-
-/* -------------------------------------
- GLOBAL
-------------------------------------- */
-* {
- margin:0;
- padding:0;
-}
-* { font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; }
-
-img {
- max-width: 100%;
-}
-.collapse {
- margin:0;
- padding:0;
-}
-body {
- -webkit-font-smoothing:antialiased;
- -webkit-text-size-adjust:none;
- width: 100%!important;
- height: 100%;
-}
-
-
-/* -------------------------------------
- ELEMENTS
-------------------------------------- */
-a { color: #2BA6CB;}
-
-.btn {
- text-decoration:none;
- color: #FFF;
- background-color: #666;
- padding:10px 16px;
- font-weight:bold;
- margin-right:10px;
- text-align:center;
- cursor:pointer;
- display: inline-block;
-}
-
-p.callout {
- padding:15px;
- background-color:#ECF8FF;
- margin-bottom: 15px;
-}
-.callout a {
- font-weight:bold;
- color: #2BA6CB;
-}
-
-table.social {
-/* padding:15px; */
- background-color: #ebebeb;
-
-}
-.social .soc-btn {
- padding: 3px 7px;
- font-size:12px;
- margin-bottom:10px;
- text-decoration:none;
- color: #FFF;font-weight:bold;
- display:block;
- text-align:center;
-}
-a.fb { background-color: #3B5998!important; }
-a.tw { background-color: #1daced!important; }
-a.gp { background-color: #DB4A39!important; }
-a.ms { background-color: #000!important; }
-
-.sidebar .soc-btn {
- display:block;
- width:100%;
-}
-
-/* -------------------------------------
- HEADER
-------------------------------------- */
-table.head-wrap { width: 100%;}
-
-.header.container table td.logo { padding: 2px; }
-.header.container table td.label { padding: 10fpx; padding-left:0px;}
-
-
-/* -------------------------------------
- BODY
-------------------------------------- */
-table.body-wrap { width: 100%;}
-
-
-/* -------------------------------------
- FOOTER
-------------------------------------- */
-table.footer-wrap { width: 100%; clear:both!important;
-}
-.footer-wrap .container td.content p { border-top: 1px solid rgb(215,215,215); padding-top:15px;}
-.footer-wrap .container td.content p {
- font-size:10px;
- font-weight: bold;
-
-}
-
-
-/* -------------------------------------
- TYPOGRAPHY
-------------------------------------- */
-h1,h2,h3,h4,h5,h6 {
-font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; line-height: 1.1; margin-bottom:15px; color:#000;
-}
-h1 small, h2 small, h3 small, h4 small, h5 small, h6 small { font-size: 60%; color: #6f6f6f; line-height: 0; text-transform: none; }
-
-h1 { font-weight:200; font-size: 44px;}
-h2 { font-weight:200; font-size: 37px;}
-h3 { font-weight:500; font-size: 27px;}
-h4 { font-weight:500; font-size: 23px;}
-h5 { font-weight:900; font-size: 17px;}
-h6 { font-weight:900; font-size: 14px; text-transform: uppercase; color:#444;}
-
-.collapse { margin:0!important;}
-
-p, ul {
- margin-bottom: 10px;
- font-weight: normal;
- font-size:14px;
- line-height:1.6;
-}
-p.lead { font-size:17px; }
-p.last { margin-bottom:0px;}
-
-ul li {
- margin-left:5px;
- list-style-position: inside;
-}
-
-/* -------------------------------------
- SIDEBAR
-------------------------------------- */
-ul.sidebar {
- display:block;
- list-style-type: none;
-}
-ul.sidebar li { display: block; margin:0;}
-ul.sidebar li a {
- text-decoration:none;
- color: #666;
- padding:10px 16px;
-/* font-weight:bold; */
- margin-right:10px;
-/* text-align:center; */
- cursor:pointer;
-/** border-bottom: 1px solid #777777;**/
-/** border-top: 1px solid #FFFFFF;**/
- display:block;
- margin:0;
-}
-ul.sidebar li a.last { border-bottom-width:0px;}
-ul.sidebar li a h1,ul.sidebar li a h2,ul.sidebar li a h3,ul.sidebar li a h4,ul.sidebar li a h5,ul.sidebar li a h6,ul.sidebar li a p { margin-bottom:0!important;}
-
-
-
-/* ---------------------------------------------------
- RESPONSIVENESS
- Nuke it from orbit. It's the only way to be sure.
------------------------------------------------------- */
-
-/* Set a max-width, and make it display as block so it will automatically stretch to that width, but will also shrink down on a phone or something */
-.container {
- display:block!important;
- max-width:600px!important;
- margin:0 auto!important; /* makes it centered */
- clear:both!important;
-}
-
-/* This should also be a block element, so that it will fill 100% of the .container */
-.content {
- padding:15px;
- max-width:600px;
- margin:0 auto;
- display:block;
-}
-
-/* Let's make sure tables in the content area are 100% wide */
-.content table { width: 100%; }
-
-
-/* Odds and ends */
-.column {
- width: 300px;
- float:left;
-}
-.column tr td { padding: 15px; }
-.column-wrap {
- padding:0!important;
- margin:0 auto;
- max-width:600px!important;
-}
-.column table { width:100%;}
-.social .column {
- width: 280px;
- min-width: 279px;
- float:left;
-}
-
-/* Be sure to place a .clear element after each set of columns, just to be safe */
-.clear { display: block; clear: both; }
-
-.border {border:1px solid}
-
-/* -------------------------------------------
- PHONE
- For clients that support media queries.
- Nothing fancy.
--------------------------------------------- */
-@media only screen and (max-width: 600px) {
-
- a[class="btn"] { display:block!important; margin-bottom:10px!important; background-image:none!important; margin-right:0!important;}
-
- div[class="column"] { width: auto!important; float:none!important;}
-
- table.social div[class="column"] {
- width:auto!important;
- }
-
-}
-
-</style>
-
-</head>
-
-<body bgcolor="#FFFFFF" topmargin="0" leftmargin="0" marginheight="0" marginwidth="0">
-
-<!-- HEADER -->
-<table class="head-wrap">
- <tr>
- <td></td>
- <td class="header container" >
-
- <p>
- <table>
- <tr>
- <td>
- ${LOGOPATH}
- </td>
- </tr>
- </table>
- </p>
-
- </td>
- <td></td>
- </tr>
-</table>
-<!-- /HEADER -->
-
-<!-- BODY -->
-<table class="body-wrap">
-
- <tr>
- <td colspan="2">
- <div class="content">
- <table>
- <tr>
- <td>
- <h4>${LABEL_HI} ${EMAIL_CUSTOMER_FIRSTNAME} ${EMAIL_CUSTOMER_LASTNAME}<br/></h4>
- <p class="lead">
- ${EMAIL_ORDER_NUMBER}
- </p>
- <br>
- <p>
- ${EMAIL_ORDER_DATE}<br/>
- ${EMAIL_ORDER_THANKS}
- </p>
- </td>
- </tr>
- </table>
- </div><!-- /content -->
- </td>
- </tr>
- <tr>
- <td></td>
- <td class="container" bgcolor="#FFFFFF">
-
-
- <p>
- <h4>${EMAIL_ORDER_DETAILS_TITLE}</h4>
- </p>
- <p>
- ${ORDER_PRODUCTS_DETAILS}
- </p>
- </td>
- <td></td>
- </tr>
- <tr>
- <td></td>
- <td class="container" bgcolor="#FFFFFF">
-
- <table>
- <tr>
- <td valign="top">
- <ul class="sidebar">
- <li>
- <a>
- <h5>${ADDRESS_BILLING_TITLE} »</h5>
- <p>
- ${ADDRESS_BILLING}
- </p>
- </a>
- </li>
- </ul>
- </td>
- <td valign="top">
- <ul class="sidebar">
- <li>
- <a>
- <h5>${ADDRESS_DELIVERY_TITLE} »</h5>
- <p>
- ${ADDRESS_DELIVERY}
- </p>
- </a>
- </li>
- </ul>
- </td>
- </tr>
- <tr>
- <td>
- <ul class="sidebar">
- <li>
- <a>
- <strong>${PAYMENT_METHOD_TITLE}</strong><br>
- ${PAYMENT_METHOD_DETAILS}
- </a>
- </li>
-
- </ul>
- </td>
- <td>
- <ul class="sidebar">
- <li>
- <a>
- <strong>${SHIPPING_METHOD_TITLE}</strong><br>
- ${SHIPPING_METHOD_DETAILS}
- </a>
- </li>
- </ul>
- </td>
- </tr>
- </table>
- <div class="clear"></div>
-
- </td>
- <td></td>
- </tr>
-</table><!-- /BODY -->
-
-<table class="body-wrap">
- <tr>
- <td></td>
- <td class="container" bgcolor="#FFFFFF">
- <div class="content">
- <!-- Callout Panel -->
- <p class="callout">
- ${ORDER_STATUS}
- </p><!-- /Callout Panel -->
- </div>
- </td>
- <td></td>
- </tr>
-</table>
-
-<!-- FOOTER -->
-<table class="footer-wrap">
- <tr>
- <td></td>
- <td class="container">
-
- <!-- content -->
- <div class="content">
- <p>
- <table>
- <tr>
- <td align="center">
- <p>
- ${EMAIL_DISCLAIMER}
- </p>
- <p>
- ${EMAIL_SPAM_DISCLAIMER}
- </p>
- <p>
- ${EMAIL_FOOTER_COPYRIGHT}
- </p>
- </td>
- </tr>
- </table>
- </p>
- </div><!-- /content -->
-
- </td>
- <td></td>
- </tr>
-</table><!-- /FOOTER -->
-
-</body>
-</html>
-
-
-
-
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html>
+<head>
+<!-- If you delete this meta tag, Earth will fall into the sun. -->
+<meta name="viewport" content="width=device-width" />
+
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title></title>
+
+<style type="text/css">
+
+/* -------------------------------------
+ GLOBAL
+------------------------------------- */
+* {
+ margin:0;
+ padding:0;
+}
+* { font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; }
+
+img {
+ max-width: 100%;
+}
+.collapse {
+ margin:0;
+ padding:0;
+}
+body {
+ -webkit-font-smoothing:antialiased;
+ -webkit-text-size-adjust:none;
+ width: 100%!important;
+ height: 100%;
+}
+
+
+/* -------------------------------------
+ ELEMENTS
+------------------------------------- */
+a { color: #2BA6CB;}
+
+.btn {
+ text-decoration:none;
+ color: #FFF;
+ background-color: #666;
+ padding:10px 16px;
+ font-weight:bold;
+ margin-right:10px;
+ text-align:center;
+ cursor:pointer;
+ display: inline-block;
+}
+
+p.callout {
+ padding:15px;
+ background-color:#ECF8FF;
+ margin-bottom: 15px;
+}
+.callout a {
+ font-weight:bold;
+ color: #2BA6CB;
+}
+
+table.social {
+/* padding:15px; */
+ background-color: #ebebeb;
+
+}
+.social .soc-btn {
+ padding: 3px 7px;
+ font-size:12px;
+ margin-bottom:10px;
+ text-decoration:none;
+ color: #FFF;font-weight:bold;
+ display:block;
+ text-align:center;
+}
+a.fb { background-color: #3B5998!important; }
+a.tw { background-color: #1daced!important; }
+a.gp { background-color: #DB4A39!important; }
+a.ms { background-color: #000!important; }
+
+.sidebar .soc-btn {
+ display:block;
+ width:100%;
+}
+
+/* -------------------------------------
+ HEADER
+------------------------------------- */
+table.head-wrap { width: 100%;}
+
+.header.container table td.logo { padding: 2px; }
+.header.container table td.label { padding: 10fpx; padding-left:0px;}
+
+
+/* -------------------------------------
+ BODY
+------------------------------------- */
+table.body-wrap { width: 100%;}
+
+
+/* -------------------------------------
+ FOOTER
+------------------------------------- */
+table.footer-wrap { width: 100%; clear:both!important;
+}
+.footer-wrap .container td.content p { border-top: 1px solid rgb(215,215,215); padding-top:15px;}
+.footer-wrap .container td.content p {
+ font-size:10px;
+ font-weight: bold;
+
+}
+
+
+/* -------------------------------------
+ TYPOGRAPHY
+------------------------------------- */
+h1,h2,h3,h4,h5,h6 {
+font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; line-height: 1.1; margin-bottom:15px; color:#000;
+}
+h1 small, h2 small, h3 small, h4 small, h5 small, h6 small { font-size: 60%; color: #6f6f6f; line-height: 0; text-transform: none; }
+
+h1 { font-weight:200; font-size: 44px;}
+h2 { font-weight:200; font-size: 37px;}
+h3 { font-weight:500; font-size: 27px;}
+h4 { font-weight:500; font-size: 23px;}
+h5 { font-weight:900; font-size: 17px;}
+h6 { font-weight:900; font-size: 14px; text-transform: uppercase; color:#444;}
+
+.collapse { margin:0!important;}
+
+p, ul {
+ margin-bottom: 10px;
+ font-weight: normal;
+ font-size:14px;
+ line-height:1.6;
+}
+p.lead { font-size:17px; }
+p.last { margin-bottom:0px;}
+
+ul li {
+ margin-left:5px;
+ list-style-position: inside;
+}
+
+/* -------------------------------------
+ SIDEBAR
+------------------------------------- */
+ul.sidebar {
+ display:block;
+ list-style-type: none;
+}
+ul.sidebar li { display: block; margin:0;}
+ul.sidebar li a {
+ text-decoration:none;
+ color: #666;
+ padding:10px 16px;
+/* font-weight:bold; */
+ margin-right:10px;
+/* text-align:center; */
+ cursor:pointer;
+/** border-bottom: 1px solid #777777;**/
+/** border-top: 1px solid #FFFFFF;**/
+ display:block;
+ margin:0;
+}
+ul.sidebar li a.last { border-bottom-width:0px;}
+ul.sidebar li a h1,ul.sidebar li a h2,ul.sidebar li a h3,ul.sidebar li a h4,ul.sidebar li a h5,ul.sidebar li a h6,ul.sidebar li a p { margin-bottom:0!important;}
+
+
+
+/* ---------------------------------------------------
+ RESPONSIVENESS
+ Nuke it from orbit. It's the only way to be sure.
+------------------------------------------------------ */
+
+/* Set a max-width, and make it display as block so it will automatically stretch to that width, but will also shrink down on a phone or something */
+.container {
+ display:block!important;
+ max-width:600px!important;
+ margin:0 auto!important; /* makes it centered */
+ clear:both!important;
+}
+
+/* This should also be a block element, so that it will fill 100% of the .container */
+.content {
+ padding:15px;
+ max-width:600px;
+ margin:0 auto;
+ display:block;
+}
+
+/* Let's make sure tables in the content area are 100% wide */
+.content table { width: 100%; }
+
+
+/* Odds and ends */
+.column {
+ width: 300px;
+ float:left;
+}
+.column tr td { padding: 15px; }
+.column-wrap {
+ padding:0!important;
+ margin:0 auto;
+ max-width:600px!important;
+}
+.column table { width:100%;}
+.social .column {
+ width: 280px;
+ min-width: 279px;
+ float:left;
+}
+
+/* Be sure to place a .clear element after each set of columns, just to be safe */
+.clear { display: block; clear: both; }
+
+.border {border:1px solid}
+
+/* -------------------------------------------
+ PHONE
+ For clients that support media queries.
+ Nothing fancy.
+-------------------------------------------- */
+@media only screen and (max-width: 600px) {
+
+ a[class="btn"] { display:block!important; margin-bottom:10px!important; background-image:none!important; margin-right:0!important;}
+
+ div[class="column"] { width: auto!important; float:none!important;}
+
+ table.social div[class="column"] {
+ width:auto!important;
+ }
+
+}
+
+</style>
+
+</head>
+
+<body bgcolor="#FFFFFF" topmargin="0" leftmargin="0" marginheight="0" marginwidth="0">
+
+<!-- HEADER -->
+<table class="head-wrap">
+ <tr>
+ <td></td>
+ <td class="header container" >
+
+ <p>
+ <table>
+ <tr>
+ <td>
+ ${LOGOPATH}
+ </td>
+ </tr>
+ </table>
+ </p>
+
+ </td>
+ <td></td>
+ </tr>
+</table>
+<!-- /HEADER -->
+
+<!-- BODY -->
+<table class="body-wrap">
+
+ <tr>
+ <td colspan="2">
+ <div class="content">
+ <table>
+ <tr>
+ <td>
+ <h4>${LABEL_HI} ${EMAIL_CUSTOMER_FIRSTNAME} ${EMAIL_CUSTOMER_LASTNAME}<br/></h4>
+ <p class="lead">
+ ${EMAIL_ORDER_NUMBER}
+ </p>
+ <br>
+ <p>
+ ${EMAIL_ORDER_DATE}<br/>
+ ${EMAIL_ORDER_THANKS}
+ </p>
+ </td>
+ </tr>
+ </table>
+ </div><!-- /content -->
+ </td>
+ </tr>
+ <tr>
+ <td></td>
+ <td class="container" bgcolor="#FFFFFF">
+
+
+ <p>
+ <h4>${EMAIL_ORDER_DETAILS_TITLE}</h4>
+ </p>
+ <p>
+ ${ORDER_PRODUCTS_DETAILS}
+ </p>
+ </td>
+ <td></td>
+ </tr>
+ <tr>
+ <td></td>
+ <td class="container" bgcolor="#FFFFFF">
+
+ <table>
+ <tr>
+ <td valign="top">
+ <ul class="sidebar">
+ <li>
+ <a>
+ <h5>${ADDRESS_BILLING_TITLE} »</h5>
+ <p>
+ ${ADDRESS_BILLING}
+ </p>
+ </a>
+ </li>
+ </ul>
+ </td>
+ <td valign="top">
+ <ul class="sidebar">
+ <li>
+ <a>
+ <h5>${ADDRESS_DELIVERY_TITLE} »</h5>
+ <p>
+ ${ADDRESS_DELIVERY}
+ </p>
+ </a>
+ </li>
+ </ul>
+ </td>
+ </tr>
+ <tr>
+ <td>
+ <ul class="sidebar">
+ <li>
+ <a>
+ <strong>${PAYMENT_METHOD_TITLE}</strong><br>
+ ${PAYMENT_METHOD_DETAILS}
+ </a>
+ </li>
+
+ </ul>
+ </td>
+ <td>
+ <ul class="sidebar">
+ <li>
+ <a>
+ <strong>${SHIPPING_METHOD_TITLE}</strong><br>
+ ${SHIPPING_METHOD_DETAILS}
+ </a>
+ </li>
+ </ul>
+ </td>
+ </tr>
+ </table>
+ <div class="clear"></div>
+
+ </td>
+ <td></td>
+ </tr>
+</table><!-- /BODY -->
+
+<table class="body-wrap">
+ <tr>
+ <td></td>
+ <td class="container" bgcolor="#FFFFFF">
+ <div class="content">
+ <!-- Callout Panel -->
+ <p class="callout">
+ ${ORDER_STATUS}
+ </p><!-- /Callout Panel -->
+ </div>
+ </td>
+ <td></td>
+ </tr>
+</table>
+
+<!-- FOOTER -->
+<table class="footer-wrap">
+ <tr>
+ <td></td>
+ <td class="container">
+
+ <!-- content -->
+ <div class="content">
+ <p>
+ <table>
+ <tr>
+ <td align="center">
+ <p>
+ ${EMAIL_DISCLAIMER}
+ </p>
+ <p>
+ ${EMAIL_SPAM_DISCLAIMER}
+ </p>
+ <p>
+ ${EMAIL_FOOTER_COPYRIGHT}
+ </p>
+ </td>
+ </tr>
+ </table>
+ </p>
+ </div><!-- /content -->
+
+ </td>
+ <td></td>
+ </tr>
+</table><!-- /FOOTER -->
+
+</body>
+</html>
+
+
+
+
diff --git a/sm-core/src/main/resources/templates/email/email_template_contact.ftl b/sm-core/src/main/resources/templates/email/email_template_contact.ftl
index 816b793..51c5a90 100644
--- a/sm-core/src/main/resources/templates/email/email_template_contact.ftl
+++ b/sm-core/src/main/resources/templates/email/email_template_contact.ftl
@@ -1,333 +1,333 @@
-<!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>
-<!-- If you delete this meta tag, Half Life 3 will never be released. -->
-<meta name="viewport" content="width=device-width" />
-
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<title></title>
-
-<style type="text/css">
-
-
-/* -------------------------------------
- GLOBAL
-------------------------------------- */
-* {
- margin:0;
- padding:0;
-}
-* { font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; }
-
-img {
- max-width: 100%;
-}
-.collapse {
- margin:0;
- padding:0;
-}
-body {
- -webkit-font-smoothing:antialiased;
- -webkit-text-size-adjust:none;
- width: 100%!important;
- height: 100%;
-}
-
-
-/* -------------------------------------
- ELEMENTS
-------------------------------------- */
-a { color: #2BA6CB;}
-
-.btn {
- text-decoration:none;
- color: #FFF;
- background-color: #666;
- padding:10px 16px;
- font-weight:bold;
- margin-right:10px;
- text-align:center;
- cursor:pointer;
- display: inline-block;
-}
-
-p.callout {
- padding:15px;
- background-color:#ECF8FF;
- margin-bottom: 15px;
-}
-.callout a {
- font-weight:bold;
- color: #2BA6CB;
-}
-
-table.social {
-/* padding:15px; */
- background-color: #ebebeb;
-
-}
-.social .soc-btn {
- padding: 3px 7px;
- font-size:12px;
- margin-bottom:10px;
- text-decoration:none;
- color: #FFF;font-weight:bold;
- display:block;
- text-align:center;
-}
-a.fb { background-color: #3B5998!important; }
-a.tw { background-color: #1daced!important; }
-a.gp { background-color: #DB4A39!important; }
-a.ms { background-color: #000!important; }
-
-.sidebar .soc-btn {
- display:block;
- width:100%;
-}
-
-/* -------------------------------------
- HEADER
-------------------------------------- */
-table.head-wrap { width: 100%;}
-
-.header.container table td.logo { padding: 15px; }
-.header.container table td.label { padding: 15px; padding-left:0px;}
-
-
-/* -------------------------------------
- BODY
-------------------------------------- */
-table.body-wrap { width: 100%;}
-
-
-/* -------------------------------------
- FOOTER
-------------------------------------- */
-table.footer-wrap { width: 100%; clear:both!important;
-}
-.footer-wrap .container td.content p { border-top: 1px solid rgb(215,215,215); padding-top:15px;}
-.footer-wrap .container td.content p {
- font-size:10px;
- font-weight: bold;
-
-}
-
-
-/* -------------------------------------
- TYPOGRAPHY
-------------------------------------- */
-h1,h2,h3,h4,h5,h6 {
-font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; line-height: 1.1; margin-bottom:15px; color:#000;
-}
-h1 small, h2 small, h3 small, h4 small, h5 small, h6 small { font-size: 60%; color: #6f6f6f; line-height: 0; text-transform: none; }
-
-h1 { font-weight:200; font-size: 44px;}
-h2 { font-weight:200; font-size: 37px;}
-h3 { font-weight:500; font-size: 27px;}
-h4 { font-weight:500; font-size: 23px;}
-h5 { font-weight:900; font-size: 17px;}
-h6 { font-weight:900; font-size: 14px; text-transform: uppercase; color:#444;}
-
-.collapse { margin:0!important;}
-
-p, ul {
- margin-bottom: 10px;
- font-weight: normal;
- font-size:14px;
- line-height:1.6;
-}
-p.lead { font-size:17px; }
-p.last { margin-bottom:0px;}
-
-ul li {
- margin-left:5px;
- list-style-position: inside;
-}
-
-/* -------------------------------------
- SIDEBAR
-------------------------------------- */
-ul.sidebar {
- background:#ebebeb;
- display:block;
- list-style-type: none;
-}
-ul.sidebar li { display: block; margin:0;}
-ul.sidebar li a {
- text-decoration:none;
- color: #666;
- padding:10px 16px;
-/* font-weight:bold; */
- margin-right:10px;
-/* text-align:center; */
- cursor:pointer;
- border-bottom: 1px solid #777777;
- border-top: 1px solid #FFFFFF;
- display:block;
- margin:0;
-}
-ul.sidebar li a.last { border-bottom-width:0px;}
-ul.sidebar li a h1,ul.sidebar li a h2,ul.sidebar li a h3,ul.sidebar li a h4,ul.sidebar li a h5,ul.sidebar li a h6,ul.sidebar li a p { margin-bottom:0!important;}
-
-
-
-/* ---------------------------------------------------
- RESPONSIVENESS
- Nuke it from orbit. It's the only way to be sure.
------------------------------------------------------- */
-
-/* Set a max-width, and make it display as block so it will automatically stretch to that width, but will also shrink down on a phone or something */
-.container {
- display:block!important;
- max-width:600px!important;
- margin:0 auto!important; /* makes it centered */
- clear:both!important;
-}
-
-/* This should also be a block element, so that it will fill 100% of the .container */
-.content {
- padding:15px;
- max-width:600px;
- margin:0 auto;
- display:block;
-}
-
-/* Let's make sure tables in the content area are 100% wide */
-.content table { width: 100%; }
-
-
-/* Odds and ends */
-.column {
- width: 300px;
- float:left;
-}
-.column tr td { padding: 15px; }
-.column-wrap {
- padding:0!important;
- margin:0 auto;
- max-width:600px!important;
-}
-.column table { width:100%;}
-.social .column {
- width: 280px;
- min-width: 279px;
- float:left;
-}
-
-/* Be sure to place a .clear element after each set of columns, just to be safe */
-.clear { display: block; clear: both; }
-
-
-/* -------------------------------------------
- PHONE
- For clients that support media queries.
- Nothing fancy.
--------------------------------------------- */
-@media only screen and (max-width: 600px) {
-
- a[class="btn"] { display:block!important; margin-bottom:10px!important; background-image:none!important; margin-right:0!important;}
-
- div[class="column"] { width: auto!important; float:none!important;}
-
- table.social div[class="column"] {
- width:auto!important;
- }
-
-}
-
-</style>
-
-</head>
-<body bgcolor="#FFFFFF">
-
-<!-- HEADER -->
-<table class="head-wrap">
- <tr>
- <td></td>
- <td class="header container" >
-
- <p>
- <table>
- <tr>
- <td>
- <h3>${LOGOPATH}</h3>
- </td>
- </tr>
- </table>
- </p>
-
- </td>
- <td></td>
- </tr>
-</table>
-<!-- /HEADER -->
-
-
-<!-- BODY -->
-<table class="body-wrap">
- <tr>
- <td></td>
- <td class="container" bgcolor="#FFFFFF">
-
- <div class="content">
- <table>
- <tr>
- <td>
- <p class="lead">
- ${EMAIL_CUSTOMER_CONTACT}
- </p>
- <p>
- ${EMAIL_CONTACT_NAME_LABEL}: ${EMAIL_CONTACT_NAME}<br />
- ${EMAIL_CONTACT_EMAIL_LABEL}: ${EMAIL_CONTACT_EMAIL}<br />
-
- </p>
- <!-- Callout Panel -->
- <p class="callout">
- ${EMAIL_CONTACT_CONTENT}
- </p><!-- /Callout Panel -->
-
-
- </td>
- </tr>
- </table>
- </div><!-- /content -->
-
- </td>
- <td></td>
- </tr>
-</table><!-- /BODY -->
-
-<!-- FOOTER -->
-<table class="footer-wrap">
- <tr>
- <td></td>
- <td class="container">
-
- <!-- content -->
- <div class="content">
- <p>
- <table>
- <tr>
- <td align="center">
- <p>
- ${EMAIL_DISCLAIMER}
- </p>
- <p>
- ${EMAIL_SPAM_DISCLAIMER}
- </p>
- <p>
- ${EMAIL_FOOTER_COPYRIGHT}
- </p>
- </td>
- </tr>
- </table>
- </p>
- </div><!-- /content -->
-
- </td>
- <td></td>
- </tr>
-</table><!-- /FOOTER -->
-
-</body>
-</html>
+<!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>
+<!-- If you delete this meta tag, Half Life 3 will never be released. -->
+<meta name="viewport" content="width=device-width" />
+
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title></title>
+
+<style type="text/css">
+
+
+/* -------------------------------------
+ GLOBAL
+------------------------------------- */
+* {
+ margin:0;
+ padding:0;
+}
+* { font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; }
+
+img {
+ max-width: 100%;
+}
+.collapse {
+ margin:0;
+ padding:0;
+}
+body {
+ -webkit-font-smoothing:antialiased;
+ -webkit-text-size-adjust:none;
+ width: 100%!important;
+ height: 100%;
+}
+
+
+/* -------------------------------------
+ ELEMENTS
+------------------------------------- */
+a { color: #2BA6CB;}
+
+.btn {
+ text-decoration:none;
+ color: #FFF;
+ background-color: #666;
+ padding:10px 16px;
+ font-weight:bold;
+ margin-right:10px;
+ text-align:center;
+ cursor:pointer;
+ display: inline-block;
+}
+
+p.callout {
+ padding:15px;
+ background-color:#ECF8FF;
+ margin-bottom: 15px;
+}
+.callout a {
+ font-weight:bold;
+ color: #2BA6CB;
+}
+
+table.social {
+/* padding:15px; */
+ background-color: #ebebeb;
+
+}
+.social .soc-btn {
+ padding: 3px 7px;
+ font-size:12px;
+ margin-bottom:10px;
+ text-decoration:none;
+ color: #FFF;font-weight:bold;
+ display:block;
+ text-align:center;
+}
+a.fb { background-color: #3B5998!important; }
+a.tw { background-color: #1daced!important; }
+a.gp { background-color: #DB4A39!important; }
+a.ms { background-color: #000!important; }
+
+.sidebar .soc-btn {
+ display:block;
+ width:100%;
+}
+
+/* -------------------------------------
+ HEADER
+------------------------------------- */
+table.head-wrap { width: 100%;}
+
+.header.container table td.logo { padding: 15px; }
+.header.container table td.label { padding: 15px; padding-left:0px;}
+
+
+/* -------------------------------------
+ BODY
+------------------------------------- */
+table.body-wrap { width: 100%;}
+
+
+/* -------------------------------------
+ FOOTER
+------------------------------------- */
+table.footer-wrap { width: 100%; clear:both!important;
+}
+.footer-wrap .container td.content p { border-top: 1px solid rgb(215,215,215); padding-top:15px;}
+.footer-wrap .container td.content p {
+ font-size:10px;
+ font-weight: bold;
+
+}
+
+
+/* -------------------------------------
+ TYPOGRAPHY
+------------------------------------- */
+h1,h2,h3,h4,h5,h6 {
+font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; line-height: 1.1; margin-bottom:15px; color:#000;
+}
+h1 small, h2 small, h3 small, h4 small, h5 small, h6 small { font-size: 60%; color: #6f6f6f; line-height: 0; text-transform: none; }
+
+h1 { font-weight:200; font-size: 44px;}
+h2 { font-weight:200; font-size: 37px;}
+h3 { font-weight:500; font-size: 27px;}
+h4 { font-weight:500; font-size: 23px;}
+h5 { font-weight:900; font-size: 17px;}
+h6 { font-weight:900; font-size: 14px; text-transform: uppercase; color:#444;}
+
+.collapse { margin:0!important;}
+
+p, ul {
+ margin-bottom: 10px;
+ font-weight: normal;
+ font-size:14px;
+ line-height:1.6;
+}
+p.lead { font-size:17px; }
+p.last { margin-bottom:0px;}
+
+ul li {
+ margin-left:5px;
+ list-style-position: inside;
+}
+
+/* -------------------------------------
+ SIDEBAR
+------------------------------------- */
+ul.sidebar {
+ background:#ebebeb;
+ display:block;
+ list-style-type: none;
+}
+ul.sidebar li { display: block; margin:0;}
+ul.sidebar li a {
+ text-decoration:none;
+ color: #666;
+ padding:10px 16px;
+/* font-weight:bold; */
+ margin-right:10px;
+/* text-align:center; */
+ cursor:pointer;
+ border-bottom: 1px solid #777777;
+ border-top: 1px solid #FFFFFF;
+ display:block;
+ margin:0;
+}
+ul.sidebar li a.last { border-bottom-width:0px;}
+ul.sidebar li a h1,ul.sidebar li a h2,ul.sidebar li a h3,ul.sidebar li a h4,ul.sidebar li a h5,ul.sidebar li a h6,ul.sidebar li a p { margin-bottom:0!important;}
+
+
+
+/* ---------------------------------------------------
+ RESPONSIVENESS
+ Nuke it from orbit. It's the only way to be sure.
+------------------------------------------------------ */
+
+/* Set a max-width, and make it display as block so it will automatically stretch to that width, but will also shrink down on a phone or something */
+.container {
+ display:block!important;
+ max-width:600px!important;
+ margin:0 auto!important; /* makes it centered */
+ clear:both!important;
+}
+
+/* This should also be a block element, so that it will fill 100% of the .container */
+.content {
+ padding:15px;
+ max-width:600px;
+ margin:0 auto;
+ display:block;
+}
+
+/* Let's make sure tables in the content area are 100% wide */
+.content table { width: 100%; }
+
+
+/* Odds and ends */
+.column {
+ width: 300px;
+ float:left;
+}
+.column tr td { padding: 15px; }
+.column-wrap {
+ padding:0!important;
+ margin:0 auto;
+ max-width:600px!important;
+}
+.column table { width:100%;}
+.social .column {
+ width: 280px;
+ min-width: 279px;
+ float:left;
+}
+
+/* Be sure to place a .clear element after each set of columns, just to be safe */
+.clear { display: block; clear: both; }
+
+
+/* -------------------------------------------
+ PHONE
+ For clients that support media queries.
+ Nothing fancy.
+-------------------------------------------- */
+@media only screen and (max-width: 600px) {
+
+ a[class="btn"] { display:block!important; margin-bottom:10px!important; background-image:none!important; margin-right:0!important;}
+
+ div[class="column"] { width: auto!important; float:none!important;}
+
+ table.social div[class="column"] {
+ width:auto!important;
+ }
+
+}
+
+</style>
+
+</head>
+<body bgcolor="#FFFFFF">
+
+<!-- HEADER -->
+<table class="head-wrap">
+ <tr>
+ <td></td>
+ <td class="header container" >
+
+ <p>
+ <table>
+ <tr>
+ <td>
+ <h3>${LOGOPATH}</h3>
+ </td>
+ </tr>
+ </table>
+ </p>
+
+ </td>
+ <td></td>
+ </tr>
+</table>
+<!-- /HEADER -->
+
+
+<!-- BODY -->
+<table class="body-wrap">
+ <tr>
+ <td></td>
+ <td class="container" bgcolor="#FFFFFF">
+
+ <div class="content">
+ <table>
+ <tr>
+ <td>
+ <p class="lead">
+ ${EMAIL_CUSTOMER_CONTACT}
+ </p>
+ <p>
+ ${EMAIL_CONTACT_NAME_LABEL}: ${EMAIL_CONTACT_NAME}<br />
+ ${EMAIL_CONTACT_EMAIL_LABEL}: ${EMAIL_CONTACT_EMAIL}<br />
+
+ </p>
+ <!-- Callout Panel -->
+ <p class="callout">
+ ${EMAIL_CONTACT_CONTENT}
+ </p><!-- /Callout Panel -->
+
+
+ </td>
+ </tr>
+ </table>
+ </div><!-- /content -->
+
+ </td>
+ <td></td>
+ </tr>
+</table><!-- /BODY -->
+
+<!-- FOOTER -->
+<table class="footer-wrap">
+ <tr>
+ <td></td>
+ <td class="container">
+
+ <!-- content -->
+ <div class="content">
+ <p>
+ <table>
+ <tr>
+ <td align="center">
+ <p>
+ ${EMAIL_DISCLAIMER}
+ </p>
+ <p>
+ ${EMAIL_SPAM_DISCLAIMER}
+ </p>
+ <p>
+ ${EMAIL_FOOTER_COPYRIGHT}
+ </p>
+ </td>
+ </tr>
+ </table>
+ </p>
+ </div><!-- /content -->
+
+ </td>
+ <td></td>
+ </tr>
+</table><!-- /FOOTER -->
+
+</body>
+</html>
diff --git a/sm-core/src/main/resources/templates/email/email_template_customer.ftl b/sm-core/src/main/resources/templates/email/email_template_customer.ftl
index d87d27c..6ec616b 100644
--- a/sm-core/src/main/resources/templates/email/email_template_customer.ftl
+++ b/sm-core/src/main/resources/templates/email/email_template_customer.ftl
@@ -1,334 +1,334 @@
-<!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>
-<!-- If you delete this meta tag, Half Life 3 will never be released. -->
-<meta name="viewport" content="width=device-width" />
-
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<title></title>
-
-<style type="text/css">
-
-
-/* -------------------------------------
- GLOBAL
-------------------------------------- */
-* {
- margin:0;
- padding:0;
-}
-* { font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; }
-
-img {
- max-width: 100%;
-}
-.collapse {
- margin:0;
- padding:0;
-}
-body {
- -webkit-font-smoothing:antialiased;
- -webkit-text-size-adjust:none;
- width: 100%!important;
- height: 100%;
-}
-
-
-/* -------------------------------------
- ELEMENTS
-------------------------------------- */
-a { color: #2BA6CB;}
-
-.btn {
- text-decoration:none;
- color: #FFF;
- background-color: #666;
- padding:10px 16px;
- font-weight:bold;
- margin-right:10px;
- text-align:center;
- cursor:pointer;
- display: inline-block;
-}
-
-p.callout {
- padding:15px;
- background-color:#ECF8FF;
- margin-bottom: 15px;
-}
-.callout a {
- font-weight:bold;
- color: #2BA6CB;
-}
-
-table.social {
-/* padding:15px; */
- background-color: #ebebeb;
-
-}
-.social .soc-btn {
- padding: 3px 7px;
- font-size:12px;
- margin-bottom:10px;
- text-decoration:none;
- color: #FFF;font-weight:bold;
- display:block;
- text-align:center;
-}
-a.fb { background-color: #3B5998!important; }
-a.tw { background-color: #1daced!important; }
-a.gp { background-color: #DB4A39!important; }
-a.ms { background-color: #000!important; }
-
-.sidebar .soc-btn {
- display:block;
- width:100%;
-}
-
-/* -------------------------------------
- HEADER
-------------------------------------- */
-table.head-wrap { width: 100%;}
-
-.header.container table td.logo { padding: 15px; }
-.header.container table td.label { padding: 15px; padding-left:0px;}
-
-
-/* -------------------------------------
- BODY
-------------------------------------- */
-table.body-wrap { width: 100%;}
-
-
-/* -------------------------------------
- FOOTER
-------------------------------------- */
-table.footer-wrap { width: 100%; clear:both!important;
-}
-.footer-wrap .container td.content p { border-top: 1px solid rgb(215,215,215); padding-top:15px;}
-.footer-wrap .container td.content p {
- font-size:10px;
- font-weight: bold;
-
-}
-
-
-/* -------------------------------------
- TYPOGRAPHY
-------------------------------------- */
-h1,h2,h3,h4,h5,h6 {
-font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; line-height: 1.1; margin-bottom:15px; color:#000;
-}
-h1 small, h2 small, h3 small, h4 small, h5 small, h6 small { font-size: 60%; color: #6f6f6f; line-height: 0; text-transform: none; }
-
-h1 { font-weight:200; font-size: 44px;}
-h2 { font-weight:200; font-size: 37px;}
-h3 { font-weight:500; font-size: 27px;}
-h4 { font-weight:500; font-size: 23px;}
-h5 { font-weight:900; font-size: 17px;}
-h6 { font-weight:900; font-size: 14px; text-transform: uppercase; color:#444;}
-
-.collapse { margin:0!important;}
-
-p, ul {
- margin-bottom: 10px;
- font-weight: normal;
- font-size:14px;
- line-height:1.6;
-}
-p.lead { font-size:17px; }
-p.last { margin-bottom:0px;}
-
-ul li {
- margin-left:5px;
- list-style-position: inside;
-}
-
-/* -------------------------------------
- SIDEBAR
-------------------------------------- */
-ul.sidebar {
- background:#ebebeb;
- display:block;
- list-style-type: none;
-}
-ul.sidebar li { display: block; margin:0;}
-ul.sidebar li a {
- text-decoration:none;
- color: #666;
- padding:10px 16px;
-/* font-weight:bold; */
- margin-right:10px;
-/* text-align:center; */
- cursor:pointer;
- border-bottom: 1px solid #777777;
- border-top: 1px solid #FFFFFF;
- display:block;
- margin:0;
-}
-ul.sidebar li a.last { border-bottom-width:0px;}
-ul.sidebar li a h1,ul.sidebar li a h2,ul.sidebar li a h3,ul.sidebar li a h4,ul.sidebar li a h5,ul.sidebar li a h6,ul.sidebar li a p { margin-bottom:0!important;}
-
-
-
-/* ---------------------------------------------------
- RESPONSIVENESS
- Nuke it from orbit. It's the only way to be sure.
------------------------------------------------------- */
-
-/* Set a max-width, and make it display as block so it will automatically stretch to that width, but will also shrink down on a phone or something */
-.container {
- display:block!important;
- max-width:600px!important;
- margin:0 auto!important; /* makes it centered */
- clear:both!important;
-}
-
-/* This should also be a block element, so that it will fill 100% of the .container */
-.content {
- padding:15px;
- max-width:600px;
- margin:0 auto;
- display:block;
-}
-
-/* Let's make sure tables in the content area are 100% wide */
-.content table { width: 100%; }
-
-
-/* Odds and ends */
-.column {
- width: 300px;
- float:left;
-}
-.column tr td { padding: 15px; }
-.column-wrap {
- padding:0!important;
- margin:0 auto;
- max-width:600px!important;
-}
-.column table { width:100%;}
-.social .column {
- width: 280px;
- min-width: 279px;
- float:left;
-}
-
-/* Be sure to place a .clear element after each set of columns, just to be safe */
-.clear { display: block; clear: both; }
-
-
-/* -------------------------------------------
- PHONE
- For clients that support media queries.
- Nothing fancy.
--------------------------------------------- */
-@media only screen and (max-width: 600px) {
-
- a[class="btn"] { display:block!important; margin-bottom:10px!important; background-image:none!important; margin-right:0!important;}
-
- div[class="column"] { width: auto!important; float:none!important;}
-
- table.social div[class="column"] {
- width:auto!important;
- }
-
-}
-
-</style>
-
-</head>
-<body bgcolor="#FFFFFF">
-
-<!-- HEADER -->
-<table class="head-wrap">
- <tr>
- <td></td>
- <td class="header container" >
-
- <p>
- <table>
- <tr>
- <td>
- <h3>${LOGOPATH}</h3>
- </td>
- </tr>
- </table>
- </p>
-
- </td>
- <td></td>
- </tr>
-</table>
-<!-- /HEADER -->
-
-
-<!-- BODY -->
-<table class="body-wrap">
- <tr>
- <td></td>
- <td class="container" bgcolor="#FFFFFF">
-
- <div class="content">
- <table>
- <tr>
- <td>
- <h4>${LABEL_HI} ${EMAIL_CUSTOMER_FIRSTNAME} ${EMAIL_CUSTOMER_LASTNAME}<br/></h4>
- <p class="lead">
- ${EMAIL_CUSTOMER_GREETING}
- </p>
- <p>
- ${EMAIL_USERNAME_LABEL}: ${EMAIL_USER_NAME}<br />
- ${EMAIL_PASSWORD_LABEL}: ${EMAIL_CUSTOMER_PASSWORD}<br />
-
- </p>
- <!-- Callout Panel -->
- <p class="callout">
- ${CUSTOMER_ACCESS_LABEL} <a href="${CUSTOMER_ACCESS_URL}">${ACCESS_NOW_LABEL} »</a>
- </p><!-- /Callout Panel -->
-
-
- </td>
- </tr>
- </table>
- </div><!-- /content -->
-
- </td>
- <td></td>
- </tr>
-</table><!-- /BODY -->
-
-<!-- FOOTER -->
-<table class="footer-wrap">
- <tr>
- <td></td>
- <td class="container">
-
- <!-- content -->
- <div class="content">
- <p>
- <table>
- <tr>
- <td align="center">
- <p>
- ${EMAIL_DISCLAIMER}
- </p>
- <p>
- ${EMAIL_SPAM_DISCLAIMER}
- </p>
- <p>
- ${EMAIL_FOOTER_COPYRIGHT}
- </p>
- </td>
- </tr>
- </table>
- </p>
- </div><!-- /content -->
-
- </td>
- <td></td>
- </tr>
-</table><!-- /FOOTER -->
-
-</body>
-</html>
+<!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>
+<!-- If you delete this meta tag, Half Life 3 will never be released. -->
+<meta name="viewport" content="width=device-width" />
+
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title></title>
+
+<style type="text/css">
+
+
+/* -------------------------------------
+ GLOBAL
+------------------------------------- */
+* {
+ margin:0;
+ padding:0;
+}
+* { font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; }
+
+img {
+ max-width: 100%;
+}
+.collapse {
+ margin:0;
+ padding:0;
+}
+body {
+ -webkit-font-smoothing:antialiased;
+ -webkit-text-size-adjust:none;
+ width: 100%!important;
+ height: 100%;
+}
+
+
+/* -------------------------------------
+ ELEMENTS
+------------------------------------- */
+a { color: #2BA6CB;}
+
+.btn {
+ text-decoration:none;
+ color: #FFF;
+ background-color: #666;
+ padding:10px 16px;
+ font-weight:bold;
+ margin-right:10px;
+ text-align:center;
+ cursor:pointer;
+ display: inline-block;
+}
+
+p.callout {
+ padding:15px;
+ background-color:#ECF8FF;
+ margin-bottom: 15px;
+}
+.callout a {
+ font-weight:bold;
+ color: #2BA6CB;
+}
+
+table.social {
+/* padding:15px; */
+ background-color: #ebebeb;
+
+}
+.social .soc-btn {
+ padding: 3px 7px;
+ font-size:12px;
+ margin-bottom:10px;
+ text-decoration:none;
+ color: #FFF;font-weight:bold;
+ display:block;
+ text-align:center;
+}
+a.fb { background-color: #3B5998!important; }
+a.tw { background-color: #1daced!important; }
+a.gp { background-color: #DB4A39!important; }
+a.ms { background-color: #000!important; }
+
+.sidebar .soc-btn {
+ display:block;
+ width:100%;
+}
+
+/* -------------------------------------
+ HEADER
+------------------------------------- */
+table.head-wrap { width: 100%;}
+
+.header.container table td.logo { padding: 15px; }
+.header.container table td.label { padding: 15px; padding-left:0px;}
+
+
+/* -------------------------------------
+ BODY
+------------------------------------- */
+table.body-wrap { width: 100%;}
+
+
+/* -------------------------------------
+ FOOTER
+------------------------------------- */
+table.footer-wrap { width: 100%; clear:both!important;
+}
+.footer-wrap .container td.content p { border-top: 1px solid rgb(215,215,215); padding-top:15px;}
+.footer-wrap .container td.content p {
+ font-size:10px;
+ font-weight: bold;
+
+}
+
+
+/* -------------------------------------
+ TYPOGRAPHY
+------------------------------------- */
+h1,h2,h3,h4,h5,h6 {
+font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; line-height: 1.1; margin-bottom:15px; color:#000;
+}
+h1 small, h2 small, h3 small, h4 small, h5 small, h6 small { font-size: 60%; color: #6f6f6f; line-height: 0; text-transform: none; }
+
+h1 { font-weight:200; font-size: 44px;}
+h2 { font-weight:200; font-size: 37px;}
+h3 { font-weight:500; font-size: 27px;}
+h4 { font-weight:500; font-size: 23px;}
+h5 { font-weight:900; font-size: 17px;}
+h6 { font-weight:900; font-size: 14px; text-transform: uppercase; color:#444;}
+
+.collapse { margin:0!important;}
+
+p, ul {
+ margin-bottom: 10px;
+ font-weight: normal;
+ font-size:14px;
+ line-height:1.6;
+}
+p.lead { font-size:17px; }
+p.last { margin-bottom:0px;}
+
+ul li {
+ margin-left:5px;
+ list-style-position: inside;
+}
+
+/* -------------------------------------
+ SIDEBAR
+------------------------------------- */
+ul.sidebar {
+ background:#ebebeb;
+ display:block;
+ list-style-type: none;
+}
+ul.sidebar li { display: block; margin:0;}
+ul.sidebar li a {
+ text-decoration:none;
+ color: #666;
+ padding:10px 16px;
+/* font-weight:bold; */
+ margin-right:10px;
+/* text-align:center; */
+ cursor:pointer;
+ border-bottom: 1px solid #777777;
+ border-top: 1px solid #FFFFFF;
+ display:block;
+ margin:0;
+}
+ul.sidebar li a.last { border-bottom-width:0px;}
+ul.sidebar li a h1,ul.sidebar li a h2,ul.sidebar li a h3,ul.sidebar li a h4,ul.sidebar li a h5,ul.sidebar li a h6,ul.sidebar li a p { margin-bottom:0!important;}
+
+
+
+/* ---------------------------------------------------
+ RESPONSIVENESS
+ Nuke it from orbit. It's the only way to be sure.
+------------------------------------------------------ */
+
+/* Set a max-width, and make it display as block so it will automatically stretch to that width, but will also shrink down on a phone or something */
+.container {
+ display:block!important;
+ max-width:600px!important;
+ margin:0 auto!important; /* makes it centered */
+ clear:both!important;
+}
+
+/* This should also be a block element, so that it will fill 100% of the .container */
+.content {
+ padding:15px;
+ max-width:600px;
+ margin:0 auto;
+ display:block;
+}
+
+/* Let's make sure tables in the content area are 100% wide */
+.content table { width: 100%; }
+
+
+/* Odds and ends */
+.column {
+ width: 300px;
+ float:left;
+}
+.column tr td { padding: 15px; }
+.column-wrap {
+ padding:0!important;
+ margin:0 auto;
+ max-width:600px!important;
+}
+.column table { width:100%;}
+.social .column {
+ width: 280px;
+ min-width: 279px;
+ float:left;
+}
+
+/* Be sure to place a .clear element after each set of columns, just to be safe */
+.clear { display: block; clear: both; }
+
+
+/* -------------------------------------------
+ PHONE
+ For clients that support media queries.
+ Nothing fancy.
+-------------------------------------------- */
+@media only screen and (max-width: 600px) {
+
+ a[class="btn"] { display:block!important; margin-bottom:10px!important; background-image:none!important; margin-right:0!important;}
+
+ div[class="column"] { width: auto!important; float:none!important;}
+
+ table.social div[class="column"] {
+ width:auto!important;
+ }
+
+}
+
+</style>
+
+</head>
+<body bgcolor="#FFFFFF">
+
+<!-- HEADER -->
+<table class="head-wrap">
+ <tr>
+ <td></td>
+ <td class="header container" >
+
+ <p>
+ <table>
+ <tr>
+ <td>
+ <h3>${LOGOPATH}</h3>
+ </td>
+ </tr>
+ </table>
+ </p>
+
+ </td>
+ <td></td>
+ </tr>
+</table>
+<!-- /HEADER -->
+
+
+<!-- BODY -->
+<table class="body-wrap">
+ <tr>
+ <td></td>
+ <td class="container" bgcolor="#FFFFFF">
+
+ <div class="content">
+ <table>
+ <tr>
+ <td>
+ <h4>${LABEL_HI} ${EMAIL_CUSTOMER_FIRSTNAME} ${EMAIL_CUSTOMER_LASTNAME}<br/></h4>
+ <p class="lead">
+ ${EMAIL_CUSTOMER_GREETING}
+ </p>
+ <p>
+ ${EMAIL_USERNAME_LABEL}: ${EMAIL_USER_NAME}<br />
+ ${EMAIL_PASSWORD_LABEL}: ${EMAIL_CUSTOMER_PASSWORD}<br />
+
+ </p>
+ <!-- Callout Panel -->
+ <p class="callout">
+ ${CUSTOMER_ACCESS_LABEL} <a href="${CUSTOMER_ACCESS_URL}">${ACCESS_NOW_LABEL} »</a>
+ </p><!-- /Callout Panel -->
+
+
+ </td>
+ </tr>
+ </table>
+ </div><!-- /content -->
+
+ </td>
+ <td></td>
+ </tr>
+</table><!-- /BODY -->
+
+<!-- FOOTER -->
+<table class="footer-wrap">
+ <tr>
+ <td></td>
+ <td class="container">
+
+ <!-- content -->
+ <div class="content">
+ <p>
+ <table>
+ <tr>
+ <td align="center">
+ <p>
+ ${EMAIL_DISCLAIMER}
+ </p>
+ <p>
+ ${EMAIL_SPAM_DISCLAIMER}
+ </p>
+ <p>
+ ${EMAIL_FOOTER_COPYRIGHT}
+ </p>
+ </td>
+ </tr>
+ </table>
+ </p>
+ </div><!-- /content -->
+
+ </td>
+ <td></td>
+ </tr>
+</table><!-- /FOOTER -->
+
+</body>
+</html>
diff --git a/sm-core/src/main/resources/templates/email/email_template_lowstock.ftl b/sm-core/src/main/resources/templates/email/email_template_lowstock.ftl
index e0924e3..0970e77 100644
--- a/sm-core/src/main/resources/templates/email/email_template_lowstock.ftl
+++ b/sm-core/src/main/resources/templates/email/email_template_lowstock.ftl
@@ -1,50 +1,50 @@
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-
-
-
-<style type="text/css">
-body {background-color:#ffffff; color:#000000; font-family:Verdana, Arial, Helvetica, sans-serif; text-align:center;}
-a:link {color:#0066cc;}
-a:hover {background-color:#eeeecc; color:#0066cc;}
-a:visited {color:#0066cc;}
-.holder {background-color:#f9f9f9; border:1px solid #9a9a9a; font-size:9px; text-align:left; width:550px;}
-.header {font-size:10px; padding:0px; width:550px;}
-.content {font-size:10px; padding:5px; width:550px;}
-.footer {font-size:9px; margin-top:10px; text-align:center; width:550px;}
-.disclaimer {background-color:#f9f9f9; border:1px solid #cccccc; font-size:10px; margin-top:10px; padding:5px; width:550px;}
-.disclaimer1 {color:#666666; padding:5px;}
-.disclaimer1 a:link {color:#666666;}
-.disclaimer1 a:visited {color:#666666;}
-.disclaimer2 {color:#666666; padding:5px;}
-.copyright {border-bottom:0px solid #9a9a9a; padding:5px;}
-</style>
-
-</head>
-
-<body>
-<div class="holder">
-
-
- <!-- Content Section -->
- <div class="content">
- <div class="content-line">
- ${EMAIL_STORE_NAME}<br /><br />
- ${EMAIL_PRODUCT_TEXT}<br/>
- </div>
-</div>
-
-</div>
-
- <!-- Footer Section -->
- <div class="footer">
- <div class="copyright">${EMAIL_FOOTER_COPYRIGHT}</div>
- </div>
-
-<div class="disclaimer">
- <div class="disclaimer1">${EMAIL_DISCLAIMER}</div>
- <div class="disclaimer2">${EMAIL_SPAM_DISCLAIMER}</div>
-</div>
-</body>
-</html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+
+
+
+<style type="text/css">
+body {background-color:#ffffff; color:#000000; font-family:Verdana, Arial, Helvetica, sans-serif; text-align:center;}
+a:link {color:#0066cc;}
+a:hover {background-color:#eeeecc; color:#0066cc;}
+a:visited {color:#0066cc;}
+.holder {background-color:#f9f9f9; border:1px solid #9a9a9a; font-size:9px; text-align:left; width:550px;}
+.header {font-size:10px; padding:0px; width:550px;}
+.content {font-size:10px; padding:5px; width:550px;}
+.footer {font-size:9px; margin-top:10px; text-align:center; width:550px;}
+.disclaimer {background-color:#f9f9f9; border:1px solid #cccccc; font-size:10px; margin-top:10px; padding:5px; width:550px;}
+.disclaimer1 {color:#666666; padding:5px;}
+.disclaimer1 a:link {color:#666666;}
+.disclaimer1 a:visited {color:#666666;}
+.disclaimer2 {color:#666666; padding:5px;}
+.copyright {border-bottom:0px solid #9a9a9a; padding:5px;}
+</style>
+
+</head>
+
+<body>
+<div class="holder">
+
+
+ <!-- Content Section -->
+ <div class="content">
+ <div class="content-line">
+ ${EMAIL_STORE_NAME}<br /><br />
+ ${EMAIL_PRODUCT_TEXT}<br/>
+ </div>
+</div>
+
+</div>
+
+ <!-- Footer Section -->
+ <div class="footer">
+ <div class="copyright">${EMAIL_FOOTER_COPYRIGHT}</div>
+ </div>
+
+<div class="disclaimer">
+ <div class="disclaimer1">${EMAIL_DISCLAIMER}</div>
+ <div class="disclaimer2">${EMAIL_SPAM_DISCLAIMER}</div>
+</div>
+</body>
+</html>
diff --git a/sm-core/src/main/resources/templates/email/email_template_new_review.ftl b/sm-core/src/main/resources/templates/email/email_template_new_review.ftl
index 32ba63f..747a7b2 100644
--- a/sm-core/src/main/resources/templates/email/email_template_new_review.ftl
+++ b/sm-core/src/main/resources/templates/email/email_template_new_review.ftl
@@ -1,52 +1,52 @@
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-
-
-<style type="text/css">
-body {background-color:#ffffff; color:#000000; font-family:Verdana, Arial, Helvetica, sans-serif; text-align:center;}
-a:link {color:#0066cc;}
-a:hover {background-color:#eeeecc; color:#0066cc;}
-a:visited {color:#0066cc;}
-.holder {background-color:#f9f9f9; border:1px solid #9a9a9a; font-size:9px; text-align:left; width:550px;}
-.header {font-size:10px; padding:0px; width:550px;}
-.content {font-size:10px; padding:5px; width:550px;}
-.footer {font-size:9px; margin-top:10px; text-align:center; width:550px;}
-.disclaimer {background-color:#f9f9f9; border:1px solid #cccccc; font-size:10px; margin-top:10px; padding:5px; width:550px;}
-.disclaimer1 {color:#666666; padding:5px;}
-.disclaimer1 a:link {color:#666666;}
-.disclaimer1 a:visited {color:#666666;}
-.disclaimer2 {color:#666666; padding:5px;}
-.copyright {border-bottom:0px solid #9a9a9a; padding:5px;}
-</style>
-
-</head>
-
-<body>
-<div class="holder">
-
-
- <!-- Content Section -->
- <div class="content">
- <div class="content-line">
- ${EMAIL_STORE_NAME}<br /><br /><br/>
- ${EMAIL_SUBJECT} - ${EMAIL_PRODUCT_NAME}<br/>
- ${EMAIL_CUSTOMER_REVIEW}<br/><br />
- ${EMAIL_REVIEW_RATING}<br/><br/>
- ${EMAIL_REVIEW_TEXT}<br/>
- </div>
-</div>
-
-</div>
-
- <!-- Footer Section -->
- <div class="footer">
- <div class="copyright">${EMAIL_FOOTER_COPYRIGHT}</div>
- </div>
-
-<div class="disclaimer">
- <div class="disclaimer1">${EMAIL_DISCLAIMER}</div>
- <div class="disclaimer2">${EMAIL_SPAM_DISCLAIMER}</div>
-</div>
-</body>
-</html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+
+
+<style type="text/css">
+body {background-color:#ffffff; color:#000000; font-family:Verdana, Arial, Helvetica, sans-serif; text-align:center;}
+a:link {color:#0066cc;}
+a:hover {background-color:#eeeecc; color:#0066cc;}
+a:visited {color:#0066cc;}
+.holder {background-color:#f9f9f9; border:1px solid #9a9a9a; font-size:9px; text-align:left; width:550px;}
+.header {font-size:10px; padding:0px; width:550px;}
+.content {font-size:10px; padding:5px; width:550px;}
+.footer {font-size:9px; margin-top:10px; text-align:center; width:550px;}
+.disclaimer {background-color:#f9f9f9; border:1px solid #cccccc; font-size:10px; margin-top:10px; padding:5px; width:550px;}
+.disclaimer1 {color:#666666; padding:5px;}
+.disclaimer1 a:link {color:#666666;}
+.disclaimer1 a:visited {color:#666666;}
+.disclaimer2 {color:#666666; padding:5px;}
+.copyright {border-bottom:0px solid #9a9a9a; padding:5px;}
+</style>
+
+</head>
+
+<body>
+<div class="holder">
+
+
+ <!-- Content Section -->
+ <div class="content">
+ <div class="content-line">
+ ${EMAIL_STORE_NAME}<br /><br /><br/>
+ ${EMAIL_SUBJECT} - ${EMAIL_PRODUCT_NAME}<br/>
+ ${EMAIL_CUSTOMER_REVIEW}<br/><br />
+ ${EMAIL_REVIEW_RATING}<br/><br/>
+ ${EMAIL_REVIEW_TEXT}<br/>
+ </div>
+</div>
+
+</div>
+
+ <!-- Footer Section -->
+ <div class="footer">
+ <div class="copyright">${EMAIL_FOOTER_COPYRIGHT}</div>
+ </div>
+
+<div class="disclaimer">
+ <div class="disclaimer1">${EMAIL_DISCLAIMER}</div>
+ <div class="disclaimer2">${EMAIL_SPAM_DISCLAIMER}</div>
+</div>
+</body>
+</html>
diff --git a/sm-core/src/main/resources/templates/email/email_template_new_store.ftl b/sm-core/src/main/resources/templates/email/email_template_new_store.ftl
index c1c8f29..c2b51d4 100644
--- a/sm-core/src/main/resources/templates/email/email_template_new_store.ftl
+++ b/sm-core/src/main/resources/templates/email/email_template_new_store.ftl
@@ -1,50 +1,50 @@
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-
-
-<style type="text/css">
-body {background-color:#ffffff; color:#000000; font-family:Verdana, Arial, Helvetica, sans-serif; text-align:center;}
-a:link {color:#0066cc;}
-a:hover {background-color:#eeeecc; color:#0066cc;}
-a:visited {color:#0066cc;}
-.holder {background-color:#f9f9f9; border:1px solid #9a9a9a; font-size:9px; text-align:left; width:550px;}
-.header {font-size:10px; padding:0px; width:550px;}
-.content {font-size:10px; padding:5px; width:550px;}
-.footer {font-size:9px; margin-top:10px; text-align:center; width:550px;}
-.disclaimer {background-color:#f9f9f9; border:1px solid #cccccc; font-size:10px; margin-top:10px; padding:5px; width:550px;}
-.disclaimer1 {color:#666666; padding:5px;}
-.disclaimer1 a:link {color:#666666;}
-.disclaimer1 a:visited {color:#666666;}
-.disclaimer2 {color:#666666; padding:5px;}
-.copyright {border-bottom:0px solid #9a9a9a; padding:5px;}
-</style>
-
-</head>
-
-<body>
-<div class="holder">
-
- <!-- Content Section -->
- <div class="content">
- <div class="content-line">
- ${EMAIL_NEW_STORE_TEXT}<br /><br /><br />
- ${EMAIL_STORE_NAME}<br /><br />
- ${EMAIL_ADMIN_STORE_INFO_LABEL}<br/>
- ${EMAIL_ADMIN_URL_LABEL}<br /><br />
- </div>
-</div>
-
-</div>
-
- <!-- Footer Section -->
- <div class="footer">
- <div class="copyright">${EMAIL_FOOTER_COPYRIGHT}</div>
- </div>
-
-<div class="disclaimer">
- <div class="disclaimer1">${EMAIL_DISCLAIMER}</div>
- <div class="disclaimer2">${EMAIL_SPAM_DISCLAIMER}</div>
-</div>
-</body>
-</html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+
+
+<style type="text/css">
+body {background-color:#ffffff; color:#000000; font-family:Verdana, Arial, Helvetica, sans-serif; text-align:center;}
+a:link {color:#0066cc;}
+a:hover {background-color:#eeeecc; color:#0066cc;}
+a:visited {color:#0066cc;}
+.holder {background-color:#f9f9f9; border:1px solid #9a9a9a; font-size:9px; text-align:left; width:550px;}
+.header {font-size:10px; padding:0px; width:550px;}
+.content {font-size:10px; padding:5px; width:550px;}
+.footer {font-size:9px; margin-top:10px; text-align:center; width:550px;}
+.disclaimer {background-color:#f9f9f9; border:1px solid #cccccc; font-size:10px; margin-top:10px; padding:5px; width:550px;}
+.disclaimer1 {color:#666666; padding:5px;}
+.disclaimer1 a:link {color:#666666;}
+.disclaimer1 a:visited {color:#666666;}
+.disclaimer2 {color:#666666; padding:5px;}
+.copyright {border-bottom:0px solid #9a9a9a; padding:5px;}
+</style>
+
+</head>
+
+<body>
+<div class="holder">
+
+ <!-- Content Section -->
+ <div class="content">
+ <div class="content-line">
+ ${EMAIL_NEW_STORE_TEXT}<br /><br /><br />
+ ${EMAIL_STORE_NAME}<br /><br />
+ ${EMAIL_ADMIN_STORE_INFO_LABEL}<br/>
+ ${EMAIL_ADMIN_URL_LABEL}<br /><br />
+ </div>
+</div>
+
+</div>
+
+ <!-- Footer Section -->
+ <div class="footer">
+ <div class="copyright">${EMAIL_FOOTER_COPYRIGHT}</div>
+ </div>
+
+<div class="disclaimer">
+ <div class="disclaimer1">${EMAIL_DISCLAIMER}</div>
+ <div class="disclaimer2">${EMAIL_SPAM_DISCLAIMER}</div>
+</div>
+</body>
+</html>
diff --git a/sm-core/src/main/resources/templates/email/email_template_new_user.ftl b/sm-core/src/main/resources/templates/email/email_template_new_user.ftl
index bda8dab..4a3f192 100644
--- a/sm-core/src/main/resources/templates/email/email_template_new_user.ftl
+++ b/sm-core/src/main/resources/templates/email/email_template_new_user.ftl
@@ -1,52 +1,52 @@
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-
-
-<style type="text/css">
-body {background-color:#ffffff; color:#000000; font-family:Verdana, Arial, Helvetica, sans-serif; text-align:center;}
-a:link {color:#0066cc;}
-a:hover {background-color:#eeeecc; color:#0066cc;}
-a:visited {color:#0066cc;}
-.holder {background-color:#f9f9f9; border:1px solid #9a9a9a; font-size:9px; text-align:left; width:550px;}
-.header {font-size:10px; padding:0px; width:550px;}
-.content {font-size:10px; padding:5px; width:550px;}
-.footer {font-size:9px; margin-top:10px; text-align:center; width:550px;}
-.disclaimer {background-color:#f9f9f9; border:1px solid #cccccc; font-size:10px; margin-top:10px; padding:5px; width:550px;}
-.disclaimer1 {color:#666666; padding:5px;}
-.disclaimer1 a:link {color:#666666;}
-.disclaimer1 a:visited {color:#666666;}
-.disclaimer2 {color:#666666; padding:5px;}
-.copyright {border-bottom:0px solid #9a9a9a; padding:5px;}
-</style>
-
-</head>
-
-<body>
-<div class="holder">
-
- <!-- Content Section -->
- <div class="content">
- <div class="content-line">
- ${EMAIL_NEW_USER_TEXT}<br /><br />
- ${EMAIL_STORE_NAME}<br /><br />
- ${EMAIL_TEXT_NEW_USER_CREATED}<br/>
- ${EMAIL_ADMIN_USERNAME_LABEL}: ${EMAIL_ADMIN_NAME}<br />
- ${EMAIL_ADMIN_PASSWORD_LABEL}: ${EMAIL_ADMIN_PASSWORD}</br>
- ${EMAIL_ADMIN_URL_LABEL}: ${EMAIL_ADMIN_URL}<br /><br />
- </div>
-</div>
-
-</div>
-
- <!-- Footer Section -->
- <div class="footer">
- <div class="copyright">${EMAIL_FOOTER_COPYRIGHT}</div>
- </div>
-
-<div class="disclaimer">
- <div class="disclaimer1">${EMAIL_DISCLAIMER}</div>
- <div class="disclaimer2">${EMAIL_SPAM_DISCLAIMER}</div>
-</div>
-</body>
-</html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+
+
+<style type="text/css">
+body {background-color:#ffffff; color:#000000; font-family:Verdana, Arial, Helvetica, sans-serif; text-align:center;}
+a:link {color:#0066cc;}
+a:hover {background-color:#eeeecc; color:#0066cc;}
+a:visited {color:#0066cc;}
+.holder {background-color:#f9f9f9; border:1px solid #9a9a9a; font-size:9px; text-align:left; width:550px;}
+.header {font-size:10px; padding:0px; width:550px;}
+.content {font-size:10px; padding:5px; width:550px;}
+.footer {font-size:9px; margin-top:10px; text-align:center; width:550px;}
+.disclaimer {background-color:#f9f9f9; border:1px solid #cccccc; font-size:10px; margin-top:10px; padding:5px; width:550px;}
+.disclaimer1 {color:#666666; padding:5px;}
+.disclaimer1 a:link {color:#666666;}
+.disclaimer1 a:visited {color:#666666;}
+.disclaimer2 {color:#666666; padding:5px;}
+.copyright {border-bottom:0px solid #9a9a9a; padding:5px;}
+</style>
+
+</head>
+
+<body>
+<div class="holder">
+
+ <!-- Content Section -->
+ <div class="content">
+ <div class="content-line">
+ ${EMAIL_NEW_USER_TEXT}<br /><br />
+ ${EMAIL_STORE_NAME}<br /><br />
+ ${EMAIL_TEXT_NEW_USER_CREATED}<br/>
+ ${EMAIL_ADMIN_USERNAME_LABEL}: ${EMAIL_ADMIN_NAME}<br />
+ ${EMAIL_ADMIN_PASSWORD_LABEL}: ${EMAIL_ADMIN_PASSWORD}</br>
+ ${EMAIL_ADMIN_URL_LABEL}: ${EMAIL_ADMIN_URL}<br /><br />
+ </div>
+</div>
+
+</div>
+
+ <!-- Footer Section -->
+ <div class="footer">
+ <div class="copyright">${EMAIL_FOOTER_COPYRIGHT}</div>
+ </div>
+
+<div class="disclaimer">
+ <div class="disclaimer1">${EMAIL_DISCLAIMER}</div>
+ <div class="disclaimer2">${EMAIL_SPAM_DISCLAIMER}</div>
+</div>
+</body>
+</html>
diff --git a/sm-core/src/main/resources/templates/email/email_template_notification.ftl b/sm-core/src/main/resources/templates/email/email_template_notification.ftl
index 939f97a..b6bea3b 100644
--- a/sm-core/src/main/resources/templates/email/email_template_notification.ftl
+++ b/sm-core/src/main/resources/templates/email/email_template_notification.ftl
@@ -1,326 +1,326 @@
-<!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>
-<!-- If you delete this meta tag, Half Life 3 will never be released. -->
-<meta name="viewport" content="width=device-width" />
-
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<title></title>
-
-<style type="text/css">
-
-
-/* -------------------------------------
- GLOBAL
-------------------------------------- */
-* {
- margin:0;
- padding:0;
-}
-* { font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; }
-
-img {
- max-width: 100%;
-}
-.collapse {
- margin:0;
- padding:0;
-}
-body {
- -webkit-font-smoothing:antialiased;
- -webkit-text-size-adjust:none;
- width: 100%!important;
- height: 100%;
-}
-
-
-/* -------------------------------------
- ELEMENTS
-------------------------------------- */
-a { color: #2BA6CB;}
-
-.btn {
- text-decoration:none;
- color: #FFF;
- background-color: #666;
- padding:10px 16px;
- font-weight:bold;
- margin-right:10px;
- text-align:center;
- cursor:pointer;
- display: inline-block;
-}
-
-p.callout {
- padding:15px;
- background-color:#ECF8FF;
- margin-bottom: 15px;
-}
-.callout a {
- font-weight:bold;
- color: #2BA6CB;
-}
-
-table.social {
-/* padding:15px; */
- background-color: #ebebeb;
-
-}
-.social .soc-btn {
- padding: 3px 7px;
- font-size:12px;
- margin-bottom:10px;
- text-decoration:none;
- color: #FFF;font-weight:bold;
- display:block;
- text-align:center;
-}
-a.fb { background-color: #3B5998!important; }
-a.tw { background-color: #1daced!important; }
-a.gp { background-color: #DB4A39!important; }
-a.ms { background-color: #000!important; }
-
-.sidebar .soc-btn {
- display:block;
- width:100%;
-}
-
-/* -------------------------------------
- HEADER
-------------------------------------- */
-table.head-wrap { width: 100%;}
-
-.header.container table td.logo { padding: 15px; }
-.header.container table td.label { padding: 15px; padding-left:0px;}
-
-
-/* -------------------------------------
- BODY
-------------------------------------- */
-table.body-wrap { width: 100%;}
-
-
-/* -------------------------------------
- FOOTER
-------------------------------------- */
-table.footer-wrap { width: 100%; clear:both!important;
-}
-.footer-wrap .container td.content p { border-top: 1px solid rgb(215,215,215); padding-top:15px;}
-.footer-wrap .container td.content p {
- font-size:10px;
- font-weight: bold;
-
-}
-
-
-/* -------------------------------------
- TYPOGRAPHY
-------------------------------------- */
-h1,h2,h3,h4,h5,h6 {
-font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; line-height: 1.1; margin-bottom:15px; color:#000;
-}
-h1 small, h2 small, h3 small, h4 small, h5 small, h6 small { font-size: 60%; color: #6f6f6f; line-height: 0; text-transform: none; }
-
-h1 { font-weight:200; font-size: 44px;}
-h2 { font-weight:200; font-size: 37px;}
-h3 { font-weight:500; font-size: 27px;}
-h4 { font-weight:500; font-size: 23px;}
-h5 { font-weight:900; font-size: 17px;}
-h6 { font-weight:900; font-size: 14px; text-transform: uppercase; color:#444;}
-
-.collapse { margin:0!important;}
-
-p, ul {
- margin-bottom: 10px;
- font-weight: normal;
- font-size:14px;
- line-height:1.6;
-}
-p.lead { font-size:17px; }
-p.last { margin-bottom:0px;}
-
-ul li {
- margin-left:5px;
- list-style-position: inside;
-}
-
-/* -------------------------------------
- SIDEBAR
-------------------------------------- */
-ul.sidebar {
- background:#ebebeb;
- display:block;
- list-style-type: none;
-}
-ul.sidebar li { display: block; margin:0;}
-ul.sidebar li a {
- text-decoration:none;
- color: #666;
- padding:10px 16px;
-/* font-weight:bold; */
- margin-right:10px;
-/* text-align:center; */
- cursor:pointer;
- border-bottom: 1px solid #777777;
- border-top: 1px solid #FFFFFF;
- display:block;
- margin:0;
-}
-ul.sidebar li a.last { border-bottom-width:0px;}
-ul.sidebar li a h1,ul.sidebar li a h2,ul.sidebar li a h3,ul.sidebar li a h4,ul.sidebar li a h5,ul.sidebar li a h6,ul.sidebar li a p { margin-bottom:0!important;}
-
-
-
-/* ---------------------------------------------------
- RESPONSIVENESS
- Nuke it from orbit. It's the only way to be sure.
------------------------------------------------------- */
-
-/* Set a max-width, and make it display as block so it will automatically stretch to that width, but will also shrink down on a phone or something */
-.container {
- display:block!important;
- max-width:600px!important;
- margin:0 auto!important; /* makes it centered */
- clear:both!important;
-}
-
-/* This should also be a block element, so that it will fill 100% of the .container */
-.content {
- padding:15px;
- max-width:600px;
- margin:0 auto;
- display:block;
-}
-
-/* Let's make sure tables in the content area are 100% wide */
-.content table { width: 100%; }
-
-
-/* Odds and ends */
-.column {
- width: 300px;
- float:left;
-}
-.column tr td { padding: 15px; }
-.column-wrap {
- padding:0!important;
- margin:0 auto;
- max-width:600px!important;
-}
-.column table { width:100%;}
-.social .column {
- width: 280px;
- min-width: 279px;
- float:left;
-}
-
-/* Be sure to place a .clear element after each set of columns, just to be safe */
-.clear { display: block; clear: both; }
-
-
-/* -------------------------------------------
- PHONE
- For clients that support media queries.
- Nothing fancy.
--------------------------------------------- */
-@media only screen and (max-width: 600px) {
-
- a[class="btn"] { display:block!important; margin-bottom:10px!important; background-image:none!important; margin-right:0!important;}
-
- div[class="column"] { width: auto!important; float:none!important;}
-
- table.social div[class="column"] {
- width:auto!important;
- }
-
-}
-
-</style>
-
-</head>
-<body bgcolor="#FFFFFF">
-
-<!-- HEADER -->
-<table class="head-wrap">
- <tr>
- <td></td>
- <td class="header container" >
-
- <p>
- <table>
- <tr>
- <td>
- <h3>${LOGOPATH}</h3>
- </td>
- </tr>
- </table>
- </p>
-
- </td>
- <td></td>
- </tr>
-</table>
-<!-- /HEADER -->
-
-
-<!-- BODY -->
-<table class="body-wrap">
- <tr>
- <td></td>
- <td class="container" bgcolor="#FFFFFF">
-
- <div class="content">
- <table>
- <tr>
- <td>
- <p class="lead">
- <h4>${LABEL_HI} ${EMAIL_CUSTOMER_FIRSTNAME} ${EMAIL_CUSTOMER_LASTNAME}<br/></h4>
- </p>
- <p>
- ${EMAIL_NOTIFICATION_MESSAGE}<br />
-
- </p>
- </td>
- </tr>
- </table>
- </div><!-- /content -->
-
- </td>
- <td></td>
- </tr>
-</table><!-- /BODY -->
-
-<!-- FOOTER -->
-<table class="footer-wrap">
- <tr>
- <td></td>
- <td class="container">
-
- <!-- content -->
- <div class="content">
- <p>
- <table>
- <tr>
- <td align="center">
- <p>
- ${EMAIL_DISCLAIMER}
- </p>
- <p>
- ${EMAIL_SPAM_DISCLAIMER}
- </p>
- <p>
- ${EMAIL_FOOTER_COPYRIGHT}
- </p>
- </td>
- </tr>
- </table>
- </p>
- </div><!-- /content -->
-
- </td>
- <td></td>
- </tr>
-</table><!-- /FOOTER -->
-
-</body>
-</html>
+<!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>
+<!-- If you delete this meta tag, Half Life 3 will never be released. -->
+<meta name="viewport" content="width=device-width" />
+
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title></title>
+
+<style type="text/css">
+
+
+/* -------------------------------------
+ GLOBAL
+------------------------------------- */
+* {
+ margin:0;
+ padding:0;
+}
+* { font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; }
+
+img {
+ max-width: 100%;
+}
+.collapse {
+ margin:0;
+ padding:0;
+}
+body {
+ -webkit-font-smoothing:antialiased;
+ -webkit-text-size-adjust:none;
+ width: 100%!important;
+ height: 100%;
+}
+
+
+/* -------------------------------------
+ ELEMENTS
+------------------------------------- */
+a { color: #2BA6CB;}
+
+.btn {
+ text-decoration:none;
+ color: #FFF;
+ background-color: #666;
+ padding:10px 16px;
+ font-weight:bold;
+ margin-right:10px;
+ text-align:center;
+ cursor:pointer;
+ display: inline-block;
+}
+
+p.callout {
+ padding:15px;
+ background-color:#ECF8FF;
+ margin-bottom: 15px;
+}
+.callout a {
+ font-weight:bold;
+ color: #2BA6CB;
+}
+
+table.social {
+/* padding:15px; */
+ background-color: #ebebeb;
+
+}
+.social .soc-btn {
+ padding: 3px 7px;
+ font-size:12px;
+ margin-bottom:10px;
+ text-decoration:none;
+ color: #FFF;font-weight:bold;
+ display:block;
+ text-align:center;
+}
+a.fb { background-color: #3B5998!important; }
+a.tw { background-color: #1daced!important; }
+a.gp { background-color: #DB4A39!important; }
+a.ms { background-color: #000!important; }
+
+.sidebar .soc-btn {
+ display:block;
+ width:100%;
+}
+
+/* -------------------------------------
+ HEADER
+------------------------------------- */
+table.head-wrap { width: 100%;}
+
+.header.container table td.logo { padding: 15px; }
+.header.container table td.label { padding: 15px; padding-left:0px;}
+
+
+/* -------------------------------------
+ BODY
+------------------------------------- */
+table.body-wrap { width: 100%;}
+
+
+/* -------------------------------------
+ FOOTER
+------------------------------------- */
+table.footer-wrap { width: 100%; clear:both!important;
+}
+.footer-wrap .container td.content p { border-top: 1px solid rgb(215,215,215); padding-top:15px;}
+.footer-wrap .container td.content p {
+ font-size:10px;
+ font-weight: bold;
+
+}
+
+
+/* -------------------------------------
+ TYPOGRAPHY
+------------------------------------- */
+h1,h2,h3,h4,h5,h6 {
+font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; line-height: 1.1; margin-bottom:15px; color:#000;
+}
+h1 small, h2 small, h3 small, h4 small, h5 small, h6 small { font-size: 60%; color: #6f6f6f; line-height: 0; text-transform: none; }
+
+h1 { font-weight:200; font-size: 44px;}
+h2 { font-weight:200; font-size: 37px;}
+h3 { font-weight:500; font-size: 27px;}
+h4 { font-weight:500; font-size: 23px;}
+h5 { font-weight:900; font-size: 17px;}
+h6 { font-weight:900; font-size: 14px; text-transform: uppercase; color:#444;}
+
+.collapse { margin:0!important;}
+
+p, ul {
+ margin-bottom: 10px;
+ font-weight: normal;
+ font-size:14px;
+ line-height:1.6;
+}
+p.lead { font-size:17px; }
+p.last { margin-bottom:0px;}
+
+ul li {
+ margin-left:5px;
+ list-style-position: inside;
+}
+
+/* -------------------------------------
+ SIDEBAR
+------------------------------------- */
+ul.sidebar {
+ background:#ebebeb;
+ display:block;
+ list-style-type: none;
+}
+ul.sidebar li { display: block; margin:0;}
+ul.sidebar li a {
+ text-decoration:none;
+ color: #666;
+ padding:10px 16px;
+/* font-weight:bold; */
+ margin-right:10px;
+/* text-align:center; */
+ cursor:pointer;
+ border-bottom: 1px solid #777777;
+ border-top: 1px solid #FFFFFF;
+ display:block;
+ margin:0;
+}
+ul.sidebar li a.last { border-bottom-width:0px;}
+ul.sidebar li a h1,ul.sidebar li a h2,ul.sidebar li a h3,ul.sidebar li a h4,ul.sidebar li a h5,ul.sidebar li a h6,ul.sidebar li a p { margin-bottom:0!important;}
+
+
+
+/* ---------------------------------------------------
+ RESPONSIVENESS
+ Nuke it from orbit. It's the only way to be sure.
+------------------------------------------------------ */
+
+/* Set a max-width, and make it display as block so it will automatically stretch to that width, but will also shrink down on a phone or something */
+.container {
+ display:block!important;
+ max-width:600px!important;
+ margin:0 auto!important; /* makes it centered */
+ clear:both!important;
+}
+
+/* This should also be a block element, so that it will fill 100% of the .container */
+.content {
+ padding:15px;
+ max-width:600px;
+ margin:0 auto;
+ display:block;
+}
+
+/* Let's make sure tables in the content area are 100% wide */
+.content table { width: 100%; }
+
+
+/* Odds and ends */
+.column {
+ width: 300px;
+ float:left;
+}
+.column tr td { padding: 15px; }
+.column-wrap {
+ padding:0!important;
+ margin:0 auto;
+ max-width:600px!important;
+}
+.column table { width:100%;}
+.social .column {
+ width: 280px;
+ min-width: 279px;
+ float:left;
+}
+
+/* Be sure to place a .clear element after each set of columns, just to be safe */
+.clear { display: block; clear: both; }
+
+
+/* -------------------------------------------
+ PHONE
+ For clients that support media queries.
+ Nothing fancy.
+-------------------------------------------- */
+@media only screen and (max-width: 600px) {
+
+ a[class="btn"] { display:block!important; margin-bottom:10px!important; background-image:none!important; margin-right:0!important;}
+
+ div[class="column"] { width: auto!important; float:none!important;}
+
+ table.social div[class="column"] {
+ width:auto!important;
+ }
+
+}
+
+</style>
+
+</head>
+<body bgcolor="#FFFFFF">
+
+<!-- HEADER -->
+<table class="head-wrap">
+ <tr>
+ <td></td>
+ <td class="header container" >
+
+ <p>
+ <table>
+ <tr>
+ <td>
+ <h3>${LOGOPATH}</h3>
+ </td>
+ </tr>
+ </table>
+ </p>
+
+ </td>
+ <td></td>
+ </tr>
+</table>
+<!-- /HEADER -->
+
+
+<!-- BODY -->
+<table class="body-wrap">
+ <tr>
+ <td></td>
+ <td class="container" bgcolor="#FFFFFF">
+
+ <div class="content">
+ <table>
+ <tr>
+ <td>
+ <p class="lead">
+ <h4>${LABEL_HI} ${EMAIL_CUSTOMER_FIRSTNAME} ${EMAIL_CUSTOMER_LASTNAME}<br/></h4>
+ </p>
+ <p>
+ ${EMAIL_NOTIFICATION_MESSAGE}<br />
+
+ </p>
+ </td>
+ </tr>
+ </table>
+ </div><!-- /content -->
+
+ </td>
+ <td></td>
+ </tr>
+</table><!-- /BODY -->
+
+<!-- FOOTER -->
+<table class="footer-wrap">
+ <tr>
+ <td></td>
+ <td class="container">
+
+ <!-- content -->
+ <div class="content">
+ <p>
+ <table>
+ <tr>
+ <td align="center">
+ <p>
+ ${EMAIL_DISCLAIMER}
+ </p>
+ <p>
+ ${EMAIL_SPAM_DISCLAIMER}
+ </p>
+ <p>
+ ${EMAIL_FOOTER_COPYRIGHT}
+ </p>
+ </td>
+ </tr>
+ </table>
+ </p>
+ </div><!-- /content -->
+
+ </td>
+ <td></td>
+ </tr>
+</table><!-- /FOOTER -->
+
+</body>
+</html>
diff --git a/sm-core/src/main/resources/templates/email/email_template_outofstock.ftl b/sm-core/src/main/resources/templates/email/email_template_outofstock.ftl
index bd9957f..a84d861 100644
--- a/sm-core/src/main/resources/templates/email/email_template_outofstock.ftl
+++ b/sm-core/src/main/resources/templates/email/email_template_outofstock.ftl
@@ -1,49 +1,49 @@
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-
-
-<style type="text/css">
-body {background-color:#ffffff; color:#000000; font-family:Verdana, Arial, Helvetica, sans-serif; text-align:center;}
-a:link {color:#0066cc;}
-a:hover {background-color:#eeeecc; color:#0066cc;}
-a:visited {color:#0066cc;}
-.holder {background-color:#f9f9f9; border:1px solid #9a9a9a; font-size:9px; text-align:left; width:550px;}
-.header {font-size:10px; padding:0px; width:550px;}
-.content {font-size:10px; padding:5px; width:550px;}
-.footer {font-size:9px; margin-top:10px; text-align:center; width:550px;}
-.disclaimer {background-color:#f9f9f9; border:1px solid #cccccc; font-size:10px; margin-top:10px; padding:5px; width:550px;}
-.disclaimer1 {color:#666666; padding:5px;}
-.disclaimer1 a:link {color:#666666;}
-.disclaimer1 a:visited {color:#666666;}
-.disclaimer2 {color:#666666; padding:5px;}
-.copyright {border-bottom:0px solid #9a9a9a; padding:5px;}
-</style>
-
-</head>
-
-<body>
-<div class="holder">
-
-
- <!-- Content Section -->
- <div class="content">
- <div class="content-line">
- ${EMAIL_STORE_NAME}<br /><br />
- ${EMAIL_PRODUCT_TEXT}<br/>
- </div>
-</div>
-
-</div>
-
- <!-- Footer Section -->
- <div class="footer">
- <div class="copyright">${EMAIL_FOOTER_COPYRIGHT}</div>
- </div>
-
-<div class="disclaimer">
- <div class="disclaimer1">${EMAIL_DISCLAIMER}</div>
- <div class="disclaimer2">${EMAIL_SPAM_DISCLAIMER}</div>
-</div>
-</body>
-</html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+
+
+<style type="text/css">
+body {background-color:#ffffff; color:#000000; font-family:Verdana, Arial, Helvetica, sans-serif; text-align:center;}
+a:link {color:#0066cc;}
+a:hover {background-color:#eeeecc; color:#0066cc;}
+a:visited {color:#0066cc;}
+.holder {background-color:#f9f9f9; border:1px solid #9a9a9a; font-size:9px; text-align:left; width:550px;}
+.header {font-size:10px; padding:0px; width:550px;}
+.content {font-size:10px; padding:5px; width:550px;}
+.footer {font-size:9px; margin-top:10px; text-align:center; width:550px;}
+.disclaimer {background-color:#f9f9f9; border:1px solid #cccccc; font-size:10px; margin-top:10px; padding:5px; width:550px;}
+.disclaimer1 {color:#666666; padding:5px;}
+.disclaimer1 a:link {color:#666666;}
+.disclaimer1 a:visited {color:#666666;}
+.disclaimer2 {color:#666666; padding:5px;}
+.copyright {border-bottom:0px solid #9a9a9a; padding:5px;}
+</style>
+
+</head>
+
+<body>
+<div class="holder">
+
+
+ <!-- Content Section -->
+ <div class="content">
+ <div class="content-line">
+ ${EMAIL_STORE_NAME}<br /><br />
+ ${EMAIL_PRODUCT_TEXT}<br/>
+ </div>
+</div>
+
+</div>
+
+ <!-- Footer Section -->
+ <div class="footer">
+ <div class="copyright">${EMAIL_FOOTER_COPYRIGHT}</div>
+ </div>
+
+<div class="disclaimer">
+ <div class="disclaimer1">${EMAIL_DISCLAIMER}</div>
+ <div class="disclaimer2">${EMAIL_SPAM_DISCLAIMER}</div>
+</div>
+</body>
+</html>
diff --git a/sm-core/src/main/resources/templates/email/email_template_password_reset_customer.ftl b/sm-core/src/main/resources/templates/email/email_template_password_reset_customer.ftl
index 467fdf0..4fbc4a7 100644
--- a/sm-core/src/main/resources/templates/email/email_template_password_reset_customer.ftl
+++ b/sm-core/src/main/resources/templates/email/email_template_password_reset_customer.ftl
@@ -1,334 +1,334 @@
-<!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>
-<!-- If you delete this meta tag, Half Life 3 will never be released. -->
-<meta name="viewport" content="width=device-width" />
-
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-<title></title>
-
-<style type="text/css">
-
-
-/* -------------------------------------
- GLOBAL
-------------------------------------- */
-* {
- margin:0;
- padding:0;
-}
-* { font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; }
-
-img {
- max-width: 100%;
-}
-.collapse {
- margin:0;
- padding:0;
-}
-body {
- -webkit-font-smoothing:antialiased;
- -webkit-text-size-adjust:none;
- width: 100%!important;
- height: 100%;
-}
-
-
-/* -------------------------------------
- ELEMENTS
-------------------------------------- */
-a { color: #2BA6CB;}
-
-.btn {
- text-decoration:none;
- color: #FFF;
- background-color: #666;
- padding:10px 16px;
- font-weight:bold;
- margin-right:10px;
- text-align:center;
- cursor:pointer;
- display: inline-block;
-}
-
-p.callout {
- padding:15px;
- background-color:#ECF8FF;
- margin-bottom: 15px;
-}
-.callout a {
- font-weight:bold;
- color: #2BA6CB;
-}
-
-table.social {
-/* padding:15px; */
- background-color: #ebebeb;
-
-}
-.social .soc-btn {
- padding: 3px 7px;
- font-size:12px;
- margin-bottom:10px;
- text-decoration:none;
- color: #FFF;font-weight:bold;
- display:block;
- text-align:center;
-}
-a.fb { background-color: #3B5998!important; }
-a.tw { background-color: #1daced!important; }
-a.gp { background-color: #DB4A39!important; }
-a.ms { background-color: #000!important; }
-
-.sidebar .soc-btn {
- display:block;
- width:100%;
-}
-
-/* -------------------------------------
- HEADER
-------------------------------------- */
-table.head-wrap { width: 100%;}
-
-.header.container table td.logo { padding: 15px; }
-.header.container table td.label { padding: 15px; padding-left:0px;}
-
-
-/* -------------------------------------
- BODY
-------------------------------------- */
-table.body-wrap { width: 100%;}
-
-
-/* -------------------------------------
- FOOTER
-------------------------------------- */
-table.footer-wrap { width: 100%; clear:both!important;
-}
-.footer-wrap .container td.content p { border-top: 1px solid rgb(215,215,215); padding-top:15px;}
-.footer-wrap .container td.content p {
- font-size:10px;
- font-weight: bold;
-
-}
-
-
-/* -------------------------------------
- TYPOGRAPHY
-------------------------------------- */
-h1,h2,h3,h4,h5,h6 {
-font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; line-height: 1.1; margin-bottom:15px; color:#000;
-}
-h1 small, h2 small, h3 small, h4 small, h5 small, h6 small { font-size: 60%; color: #6f6f6f; line-height: 0; text-transform: none; }
-
-h1 { font-weight:200; font-size: 44px;}
-h2 { font-weight:200; font-size: 37px;}
-h3 { font-weight:500; font-size: 27px;}
-h4 { font-weight:500; font-size: 23px;}
-h5 { font-weight:900; font-size: 17px;}
-h6 { font-weight:900; font-size: 14px; text-transform: uppercase; color:#444;}
-
-.collapse { margin:0!important;}
-
-p, ul {
- margin-bottom: 10px;
- font-weight: normal;
- font-size:14px;
- line-height:1.6;
-}
-p.lead { font-size:17px; }
-p.last { margin-bottom:0px;}
-
-ul li {
- margin-left:5px;
- list-style-position: inside;
-}
-
-/* -------------------------------------
- SIDEBAR
-------------------------------------- */
-ul.sidebar {
- background:#ebebeb;
- display:block;
- list-style-type: none;
-}
-ul.sidebar li { display: block; margin:0;}
-ul.sidebar li a {
- text-decoration:none;
- color: #666;
- padding:10px 16px;
-/* font-weight:bold; */
- margin-right:10px;
-/* text-align:center; */
- cursor:pointer;
- border-bottom: 1px solid #777777;
- border-top: 1px solid #FFFFFF;
- display:block;
- margin:0;
-}
-ul.sidebar li a.last { border-bottom-width:0px;}
-ul.sidebar li a h1,ul.sidebar li a h2,ul.sidebar li a h3,ul.sidebar li a h4,ul.sidebar li a h5,ul.sidebar li a h6,ul.sidebar li a p { margin-bottom:0!important;}
-
-
-
-/* ---------------------------------------------------
- RESPONSIVENESS
- Nuke it from orbit. It's the only way to be sure.
------------------------------------------------------- */
-
-/* Set a max-width, and make it display as block so it will automatically stretch to that width, but will also shrink down on a phone or something */
-.container {
- display:block!important;
- max-width:600px!important;
- margin:0 auto!important; /* makes it centered */
- clear:both!important;
-}
-
-/* This should also be a block element, so that it will fill 100% of the .container */
-.content {
- padding:15px;
- max-width:600px;
- margin:0 auto;
- display:block;
-}
-
-/* Let's make sure tables in the content area are 100% wide */
-.content table { width: 100%; }
-
-
-/* Odds and ends */
-.column {
- width: 300px;
- float:left;
-}
-.column tr td { padding: 15px; }
-.column-wrap {
- padding:0!important;
- margin:0 auto;
- max-width:600px!important;
-}
-.column table { width:100%;}
-.social .column {
- width: 280px;
- min-width: 279px;
- float:left;
-}
-
-/* Be sure to place a .clear element after each set of columns, just to be safe */
-.clear { display: block; clear: both; }
-
-
-/* -------------------------------------------
- PHONE
- For clients that support media queries.
- Nothing fancy.
--------------------------------------------- */
-@media only screen and (max-width: 600px) {
-
- a[class="btn"] { display:block!important; margin-bottom:10px!important; background-image:none!important; margin-right:0!important;}
-
- div[class="column"] { width: auto!important; float:none!important;}
-
- table.social div[class="column"] {
- width:auto!important;
- }
-
-}
-
-</style>
-
-</head>
-
-
-<body bgcolor="#FFFFFF">
-
-<!-- HEADER -->
-<table class="head-wrap">
- <tr>
- <td></td>
- <td class="header container" >
-
- <p>
- <table>
- <tr>
- <td>
- ${LOGOPATH}
- </td>
- </tr>
- </table>
- </p>
-
- </td>
- <td></td>
- </tr>
-</table>
-<!-- /HEADER -->
-
-<!-- BODY -->
-<table class="body-wrap">
- <tr>
- <td></td>
- <td class="container" bgcolor="#FFFFFF">
-
- <div class="content">
- <table>
- <tr>
- <td>
- <h4>${LABEL_HI} ${EMAIL_CUSTOMER_FIRSTNAME} ${EMAIL_CUSTOMER_LASTNAME}<br/></h4>
- <p class="lead">
- ${EMAIL_RESET_PASSWORD_TXT}
- </p>
- <p>
- ${EMAIL_PASSWORD_LABEL}: ${EMAIL_CUSTOMER_PASSWORD}<br />
-
- </p>
- <!-- Callout Panel -->
- <p class="callout">
- ${EMAIL_CONTACT_OWNER}
- </p><!-- /Callout Panel -->
-
-
- </td>
- </tr>
- </table>
- </div><!-- /content -->
-
- </td>
- <td></td>
- </tr>
-</table><!-- /BODY -->
-
-<!-- FOOTER -->
-<table class="footer-wrap">
- <tr>
- <td></td>
- <td class="container">
-
- <!-- content -->
- <div class="content">
- <p>
- <table>
- <tr>
- <td align="center">
- <p>
- ${EMAIL_DISCLAIMER}
- </p>
- <p>
- ${EMAIL_SPAM_DISCLAIMER}
- </p>
- <p>
- ${EMAIL_FOOTER_COPYRIGHT}
- </p>
- </td>
- </tr>
- </table>
- </p>
- </div><!-- /content -->
-
- </td>
- <td></td>
- </tr>
-</table><!-- /FOOTER -->
-
-</body>
+<!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>
+<!-- If you delete this meta tag, Half Life 3 will never be released. -->
+<meta name="viewport" content="width=device-width" />
+
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title></title>
+
+<style type="text/css">
+
+
+/* -------------------------------------
+ GLOBAL
+------------------------------------- */
+* {
+ margin:0;
+ padding:0;
+}
+* { font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; }
+
+img {
+ max-width: 100%;
+}
+.collapse {
+ margin:0;
+ padding:0;
+}
+body {
+ -webkit-font-smoothing:antialiased;
+ -webkit-text-size-adjust:none;
+ width: 100%!important;
+ height: 100%;
+}
+
+
+/* -------------------------------------
+ ELEMENTS
+------------------------------------- */
+a { color: #2BA6CB;}
+
+.btn {
+ text-decoration:none;
+ color: #FFF;
+ background-color: #666;
+ padding:10px 16px;
+ font-weight:bold;
+ margin-right:10px;
+ text-align:center;
+ cursor:pointer;
+ display: inline-block;
+}
+
+p.callout {
+ padding:15px;
+ background-color:#ECF8FF;
+ margin-bottom: 15px;
+}
+.callout a {
+ font-weight:bold;
+ color: #2BA6CB;
+}
+
+table.social {
+/* padding:15px; */
+ background-color: #ebebeb;
+
+}
+.social .soc-btn {
+ padding: 3px 7px;
+ font-size:12px;
+ margin-bottom:10px;
+ text-decoration:none;
+ color: #FFF;font-weight:bold;
+ display:block;
+ text-align:center;
+}
+a.fb { background-color: #3B5998!important; }
+a.tw { background-color: #1daced!important; }
+a.gp { background-color: #DB4A39!important; }
+a.ms { background-color: #000!important; }
+
+.sidebar .soc-btn {
+ display:block;
+ width:100%;
+}
+
+/* -------------------------------------
+ HEADER
+------------------------------------- */
+table.head-wrap { width: 100%;}
+
+.header.container table td.logo { padding: 15px; }
+.header.container table td.label { padding: 15px; padding-left:0px;}
+
+
+/* -------------------------------------
+ BODY
+------------------------------------- */
+table.body-wrap { width: 100%;}
+
+
+/* -------------------------------------
+ FOOTER
+------------------------------------- */
+table.footer-wrap { width: 100%; clear:both!important;
+}
+.footer-wrap .container td.content p { border-top: 1px solid rgb(215,215,215); padding-top:15px;}
+.footer-wrap .container td.content p {
+ font-size:10px;
+ font-weight: bold;
+
+}
+
+
+/* -------------------------------------
+ TYPOGRAPHY
+------------------------------------- */
+h1,h2,h3,h4,h5,h6 {
+font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; line-height: 1.1; margin-bottom:15px; color:#000;
+}
+h1 small, h2 small, h3 small, h4 small, h5 small, h6 small { font-size: 60%; color: #6f6f6f; line-height: 0; text-transform: none; }
+
+h1 { font-weight:200; font-size: 44px;}
+h2 { font-weight:200; font-size: 37px;}
+h3 { font-weight:500; font-size: 27px;}
+h4 { font-weight:500; font-size: 23px;}
+h5 { font-weight:900; font-size: 17px;}
+h6 { font-weight:900; font-size: 14px; text-transform: uppercase; color:#444;}
+
+.collapse { margin:0!important;}
+
+p, ul {
+ margin-bottom: 10px;
+ font-weight: normal;
+ font-size:14px;
+ line-height:1.6;
+}
+p.lead { font-size:17px; }
+p.last { margin-bottom:0px;}
+
+ul li {
+ margin-left:5px;
+ list-style-position: inside;
+}
+
+/* -------------------------------------
+ SIDEBAR
+------------------------------------- */
+ul.sidebar {
+ background:#ebebeb;
+ display:block;
+ list-style-type: none;
+}
+ul.sidebar li { display: block; margin:0;}
+ul.sidebar li a {
+ text-decoration:none;
+ color: #666;
+ padding:10px 16px;
+/* font-weight:bold; */
+ margin-right:10px;
+/* text-align:center; */
+ cursor:pointer;
+ border-bottom: 1px solid #777777;
+ border-top: 1px solid #FFFFFF;
+ display:block;
+ margin:0;
+}
+ul.sidebar li a.last { border-bottom-width:0px;}
+ul.sidebar li a h1,ul.sidebar li a h2,ul.sidebar li a h3,ul.sidebar li a h4,ul.sidebar li a h5,ul.sidebar li a h6,ul.sidebar li a p { margin-bottom:0!important;}
+
+
+
+/* ---------------------------------------------------
+ RESPONSIVENESS
+ Nuke it from orbit. It's the only way to be sure.
+------------------------------------------------------ */
+
+/* Set a max-width, and make it display as block so it will automatically stretch to that width, but will also shrink down on a phone or something */
+.container {
+ display:block!important;
+ max-width:600px!important;
+ margin:0 auto!important; /* makes it centered */
+ clear:both!important;
+}
+
+/* This should also be a block element, so that it will fill 100% of the .container */
+.content {
+ padding:15px;
+ max-width:600px;
+ margin:0 auto;
+ display:block;
+}
+
+/* Let's make sure tables in the content area are 100% wide */
+.content table { width: 100%; }
+
+
+/* Odds and ends */
+.column {
+ width: 300px;
+ float:left;
+}
+.column tr td { padding: 15px; }
+.column-wrap {
+ padding:0!important;
+ margin:0 auto;
+ max-width:600px!important;
+}
+.column table { width:100%;}
+.social .column {
+ width: 280px;
+ min-width: 279px;
+ float:left;
+}
+
+/* Be sure to place a .clear element after each set of columns, just to be safe */
+.clear { display: block; clear: both; }
+
+
+/* -------------------------------------------
+ PHONE
+ For clients that support media queries.
+ Nothing fancy.
+-------------------------------------------- */
+@media only screen and (max-width: 600px) {
+
+ a[class="btn"] { display:block!important; margin-bottom:10px!important; background-image:none!important; margin-right:0!important;}
+
+ div[class="column"] { width: auto!important; float:none!important;}
+
+ table.social div[class="column"] {
+ width:auto!important;
+ }
+
+}
+
+</style>
+
+</head>
+
+
+<body bgcolor="#FFFFFF">
+
+<!-- HEADER -->
+<table class="head-wrap">
+ <tr>
+ <td></td>
+ <td class="header container" >
+
+ <p>
+ <table>
+ <tr>
+ <td>
+ ${LOGOPATH}
+ </td>
+ </tr>
+ </table>
+ </p>
+
+ </td>
+ <td></td>
+ </tr>
+</table>
+<!-- /HEADER -->
+
+<!-- BODY -->
+<table class="body-wrap">
+ <tr>
+ <td></td>
+ <td class="container" bgcolor="#FFFFFF">
+
+ <div class="content">
+ <table>
+ <tr>
+ <td>
+ <h4>${LABEL_HI} ${EMAIL_CUSTOMER_FIRSTNAME} ${EMAIL_CUSTOMER_LASTNAME}<br/></h4>
+ <p class="lead">
+ ${EMAIL_RESET_PASSWORD_TXT}
+ </p>
+ <p>
+ ${EMAIL_PASSWORD_LABEL}: ${EMAIL_CUSTOMER_PASSWORD}<br />
+
+ </p>
+ <!-- Callout Panel -->
+ <p class="callout">
+ ${EMAIL_CONTACT_OWNER}
+ </p><!-- /Callout Panel -->
+
+
+ </td>
+ </tr>
+ </table>
+ </div><!-- /content -->
+
+ </td>
+ <td></td>
+ </tr>
+</table><!-- /BODY -->
+
+<!-- FOOTER -->
+<table class="footer-wrap">
+ <tr>
+ <td></td>
+ <td class="container">
+
+ <!-- content -->
+ <div class="content">
+ <p>
+ <table>
+ <tr>
+ <td align="center">
+ <p>
+ ${EMAIL_DISCLAIMER}
+ </p>
+ <p>
+ ${EMAIL_SPAM_DISCLAIMER}
+ </p>
+ <p>
+ ${EMAIL_FOOTER_COPYRIGHT}
+ </p>
+ </td>
+ </tr>
+ </table>
+ </p>
+ </div><!-- /content -->
+
+ </td>
+ <td></td>
+ </tr>
+</table><!-- /FOOTER -->
+
+</body>
</html>
\ No newline at end of file
diff --git a/sm-core/src/main/resources/templates/email/email_template_password_reset_user.ftl b/sm-core/src/main/resources/templates/email/email_template_password_reset_user.ftl
index 57cfaa3..9b1a8bc 100644
--- a/sm-core/src/main/resources/templates/email/email_template_password_reset_user.ftl
+++ b/sm-core/src/main/resources/templates/email/email_template_password_reset_user.ftl
@@ -1,54 +1,54 @@
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-
-
-<style type="text/css">
-body {background-color:#ffffff; color:#000000; font-family:Verdana, Arial, Helvetica, sans-serif; text-align:center;}
-a:link {color:#0066cc;}
-a:hover {background-color:#eeeecc; color:#0066cc;}
-a:visited {color:#0066cc;}
-.holder {background-color:#f9f9f9; border:1px solid #9a9a9a; font-size:9px; text-align:left; width:550px;}
-.header {font-size:10px; padding:0px; width:550px;}
-.content {font-size:10px; padding:5px; width:550px;}
-.footer {font-size:9px; margin-top:10px; text-align:center; width:550px;}
-.disclaimer {background-color:#f9f9f9; border:1px solid #cccccc; font-size:10px; margin-top:10px; padding:5px; width:550px;}
-.disclaimer1 {color:#666666; padding:5px;}
-.disclaimer1 a:link {color:#666666;}
-.disclaimer1 a:visited {color:#666666;}
-.disclaimer2 {color:#666666; padding:5px;}
-.copyright {border-bottom:0px solid #9a9a9a; padding:5px;}
-</style>
-
-</head>
-
-<body>
-<div class="holder">
-
- <!-- Header Section -->
- ${LOGOPATH}
-
-
- <!-- Content Section -->
- <div class="content">
- <div class="content-line">
- ${EMAIL_STORE_NAME}<br /><br />
- <p>${EMAIL_RESET_PASSWORD_TXT}</p><br/>
- ${EMAIL_PASSWORD_LABEL}: ${EMAIL_USER_PASSWORD}<br /><br />
- ${EMAIL_CONTACT_OWNER}
- </div>
-</div>
-
-</div>
-
- <!-- Footer Section -->
- <div class="footer">
- <div class="copyright">${EMAIL_FOOTER_COPYRIGHT}</div>
- </div>
-
-<div class="disclaimer">
- <div class="disclaimer1">${EMAIL_DISCLAIMER}</div>
- <div class="disclaimer2">${EMAIL_SPAM_DISCLAIMER}</div>
-</div>
-</body>
-</html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+
+
+<style type="text/css">
+body {background-color:#ffffff; color:#000000; font-family:Verdana, Arial, Helvetica, sans-serif; text-align:center;}
+a:link {color:#0066cc;}
+a:hover {background-color:#eeeecc; color:#0066cc;}
+a:visited {color:#0066cc;}
+.holder {background-color:#f9f9f9; border:1px solid #9a9a9a; font-size:9px; text-align:left; width:550px;}
+.header {font-size:10px; padding:0px; width:550px;}
+.content {font-size:10px; padding:5px; width:550px;}
+.footer {font-size:9px; margin-top:10px; text-align:center; width:550px;}
+.disclaimer {background-color:#f9f9f9; border:1px solid #cccccc; font-size:10px; margin-top:10px; padding:5px; width:550px;}
+.disclaimer1 {color:#666666; padding:5px;}
+.disclaimer1 a:link {color:#666666;}
+.disclaimer1 a:visited {color:#666666;}
+.disclaimer2 {color:#666666; padding:5px;}
+.copyright {border-bottom:0px solid #9a9a9a; padding:5px;}
+</style>
+
+</head>
+
+<body>
+<div class="holder">
+
+ <!-- Header Section -->
+ ${LOGOPATH}
+
+
+ <!-- Content Section -->
+ <div class="content">
+ <div class="content-line">
+ ${EMAIL_STORE_NAME}<br /><br />
+ <p>${EMAIL_RESET_PASSWORD_TXT}</p><br/>
+ ${EMAIL_PASSWORD_LABEL}: ${EMAIL_USER_PASSWORD}<br /><br />
+ ${EMAIL_CONTACT_OWNER}
+ </div>
+</div>
+
+</div>
+
+ <!-- Footer Section -->
+ <div class="footer">
+ <div class="copyright">${EMAIL_FOOTER_COPYRIGHT}</div>
+ </div>
+
+<div class="disclaimer">
+ <div class="disclaimer1">${EMAIL_DISCLAIMER}</div>
+ <div class="disclaimer2">${EMAIL_SPAM_DISCLAIMER}</div>
+</div>
+</body>
+</html>
diff --git a/sm-core/src/main/resources/templates/email/email_template_sentinvoice.ftl b/sm-core/src/main/resources/templates/email/email_template_sentinvoice.ftl
index ba563a3..f179795 100644
--- a/sm-core/src/main/resources/templates/email/email_template_sentinvoice.ftl
+++ b/sm-core/src/main/resources/templates/email/email_template_sentinvoice.ftl
@@ -1,55 +1,55 @@
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-
-
-<style type="text/css">
-body {background-color:#ffffff; color:#000000; font-family:Verdana, Arial, Helvetica, sans-serif; text-align:center;}
-a:link {color:#0066cc;}
-a:hover {background-color:#eeeecc; color:#0066cc;}
-a:visited {color:#0066cc;}
-.holder {background-color:#f9f9f9; border:1px solid #9a9a9a; font-size:9px; text-align:left; width:550px;}
-.header {font-size:10px; padding:0px; width:550px;}
-.content {font-size:10px; padding:5px; width:550px;}
-.footer {font-size:9px; margin-top:10px; text-align:center; width:550px;}
-.disclaimer {background-color:#f9f9f9; border:1px solid #cccccc; font-size:10px; margin-top:10px; padding:5px; width:550px;}
-.disclaimer1 {color:#666666; padding:5px;}
-.disclaimer1 a:link {color:#666666;}
-.disclaimer1 a:visited {color:#666666;}
-.disclaimer2 {color:#666666; padding:5px;}
-.copyright {border-bottom:0px solid #9a9a9a; padding:5px;}
-</style>
-
-</head>
-
-<body>
-<div class="holder">
-
- <!-- Header Section -->
- ${LOGOPATH}
-
-
- <!-- Content Section -->
- <div class="content">
- <div class="content-line">
- ${EMAIL_STORE_NAME}<br /><br />
- ${EMAIL_GREETING} ${EMAIL_CUSTOMER_NAME}<br/><br/>
- ${EMAIL_INVOICE_MESSAGE}<br /><br />
- ${EMAIL_INVOICE_PAYMENT_URL}<br /><br />
- ${EMAIL_CONTACT_OWNER}
- </div>
-</div>
-
-</div>
-
- <!-- Footer Section -->
- <div class="footer">
- <div class="copyright">${EMAIL_FOOTER_COPYRIGHT}</div>
- </div>
-
-<div class="disclaimer">
- <div class="disclaimer1">${EMAIL_DISCLAIMER}</div>
- <div class="disclaimer2">${EMAIL_SPAM_DISCLAIMER}</div>
-</div>
-</body>
-</html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+
+
+<style type="text/css">
+body {background-color:#ffffff; color:#000000; font-family:Verdana, Arial, Helvetica, sans-serif; text-align:center;}
+a:link {color:#0066cc;}
+a:hover {background-color:#eeeecc; color:#0066cc;}
+a:visited {color:#0066cc;}
+.holder {background-color:#f9f9f9; border:1px solid #9a9a9a; font-size:9px; text-align:left; width:550px;}
+.header {font-size:10px; padding:0px; width:550px;}
+.content {font-size:10px; padding:5px; width:550px;}
+.footer {font-size:9px; margin-top:10px; text-align:center; width:550px;}
+.disclaimer {background-color:#f9f9f9; border:1px solid #cccccc; font-size:10px; margin-top:10px; padding:5px; width:550px;}
+.disclaimer1 {color:#666666; padding:5px;}
+.disclaimer1 a:link {color:#666666;}
+.disclaimer1 a:visited {color:#666666;}
+.disclaimer2 {color:#666666; padding:5px;}
+.copyright {border-bottom:0px solid #9a9a9a; padding:5px;}
+</style>
+
+</head>
+
+<body>
+<div class="holder">
+
+ <!-- Header Section -->
+ ${LOGOPATH}
+
+
+ <!-- Content Section -->
+ <div class="content">
+ <div class="content-line">
+ ${EMAIL_STORE_NAME}<br /><br />
+ ${EMAIL_GREETING} ${EMAIL_CUSTOMER_NAME}<br/><br/>
+ ${EMAIL_INVOICE_MESSAGE}<br /><br />
+ ${EMAIL_INVOICE_PAYMENT_URL}<br /><br />
+ ${EMAIL_CONTACT_OWNER}
+ </div>
+</div>
+
+</div>
+
+ <!-- Footer Section -->
+ <div class="footer">
+ <div class="copyright">${EMAIL_FOOTER_COPYRIGHT}</div>
+ </div>
+
+<div class="disclaimer">
+ <div class="disclaimer1">${EMAIL_DISCLAIMER}</div>
+ <div class="disclaimer2">${EMAIL_SPAM_DISCLAIMER}</div>
+</div>
+</body>
+</html>
diff --git a/sm-core/src/main/resources/templates/email/email_template_user_password_link.ftl b/sm-core/src/main/resources/templates/email/email_template_user_password_link.ftl
index 02cef50..31053cc 100644
--- a/sm-core/src/main/resources/templates/email/email_template_user_password_link.ftl
+++ b/sm-core/src/main/resources/templates/email/email_template_user_password_link.ftl
@@ -1,49 +1,49 @@
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-
-
-<style type="text/css">
-body {background-color:#ffffff; color:#000000; font-family:Verdana, Arial, Helvetica, sans-serif; text-align:center;}
-a:link {color:#0066cc;}
-a:hover {background-color:#eeeecc; color:#0066cc;}
-a:visited {color:#0066cc;}
-.holder {background-color:#f9f9f9; border:1px solid #9a9a9a; font-size:9px; text-align:left; width:550px;}
-.header {font-size:10px; padding:0px; width:550px;}
-.content {font-size:10px; padding:5px; width:550px;}
-.footer {font-size:9px; margin-top:10px; text-align:center; width:550px;}
-.disclaimer {background-color:#f9f9f9; border:1px solid #cccccc; font-size:10px; margin-top:10px; padding:5px; width:550px;}
-.disclaimer1 {color:#666666; padding:5px;}
-.disclaimer1 a:link {color:#666666;}
-.disclaimer1 a:visited {color:#666666;}
-.disclaimer2 {color:#666666; padding:5px;}
-.copyright {border-bottom:0px solid #9a9a9a; padding:5px;}
-</style>
-
-</head>
-
-<body>
-<div class="holder">
-
- <!-- Content Section -->
- <div class="content">
- <div class="content-line">
- ${EMAIL_PASSWORD_TEXT}<br /><br /><br />
- ${EMAIL_PASSWORD_LINK}<br /><br />
- <br /><br />
- </div>
-</div>
-
-</div>
-
- <!-- Footer Section -->
- <div class="footer">
- <div class="copyright">${EMAIL_FOOTER_COPYRIGHT}</div>
- </div>
-
-<div class="disclaimer">
- <div class="disclaimer1">${EMAIL_DISCLAIMER}</div>
- <div class="disclaimer2">${EMAIL_SPAM_DISCLAIMER}</div>
-</div>
-</body>
-</html>
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+
+
+<style type="text/css">
+body {background-color:#ffffff; color:#000000; font-family:Verdana, Arial, Helvetica, sans-serif; text-align:center;}
+a:link {color:#0066cc;}
+a:hover {background-color:#eeeecc; color:#0066cc;}
+a:visited {color:#0066cc;}
+.holder {background-color:#f9f9f9; border:1px solid #9a9a9a; font-size:9px; text-align:left; width:550px;}
+.header {font-size:10px; padding:0px; width:550px;}
+.content {font-size:10px; padding:5px; width:550px;}
+.footer {font-size:9px; margin-top:10px; text-align:center; width:550px;}
+.disclaimer {background-color:#f9f9f9; border:1px solid #cccccc; font-size:10px; margin-top:10px; padding:5px; width:550px;}
+.disclaimer1 {color:#666666; padding:5px;}
+.disclaimer1 a:link {color:#666666;}
+.disclaimer1 a:visited {color:#666666;}
+.disclaimer2 {color:#666666; padding:5px;}
+.copyright {border-bottom:0px solid #9a9a9a; padding:5px;}
+</style>
+
+</head>
+
+<body>
+<div class="holder">
+
+ <!-- Content Section -->
+ <div class="content">
+ <div class="content-line">
+ ${EMAIL_PASSWORD_TEXT}<br /><br /><br />
+ ${EMAIL_PASSWORD_LINK}<br /><br />
+ <br /><br />
+ </div>
+</div>
+
+</div>
+
+ <!-- Footer Section -->
+ <div class="footer">
+ <div class="copyright">${EMAIL_FOOTER_COPYRIGHT}</div>
+ </div>
+
+<div class="disclaimer">
+ <div class="disclaimer1">${EMAIL_DISCLAIMER}</div>
+ <div class="disclaimer2">${EMAIL_SPAM_DISCLAIMER}</div>
+</div>
+</body>
+</html>
diff --git a/sm-core/src/test/java/com/salesmanager/test/common/AbstractSalesManagerCoreTestCase.java b/sm-core/src/test/java/com/salesmanager/test/common/AbstractSalesManagerCoreTestCase.java
index b98fd3e..43c54d1 100644
--- a/sm-core/src/test/java/com/salesmanager/test/common/AbstractSalesManagerCoreTestCase.java
+++ b/sm-core/src/test/java/com/salesmanager/test/common/AbstractSalesManagerCoreTestCase.java
@@ -1,169 +1,169 @@
-/**
- * This application is maintained by CSTI consulting (www.csticonsulting.com).
- * Licensed under LGPL - Feel free to use it and modify it to your needs !
- *
- */
-package com.salesmanager.test.common;
-
-import javax.inject.Inject;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.runner.RunWith;
-import org.springframework.boot.test.SpringApplicationConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.catalog.category.CategoryService;
-import com.salesmanager.core.business.services.catalog.product.PricingService;
-import com.salesmanager.core.business.services.catalog.product.ProductService;
-import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
-import com.salesmanager.core.business.services.catalog.product.attribute.ProductOptionService;
-import com.salesmanager.core.business.services.catalog.product.attribute.ProductOptionValueService;
-import com.salesmanager.core.business.services.catalog.product.availability.ProductAvailabilityService;
-import com.salesmanager.core.business.services.catalog.product.image.ProductImageService;
-import com.salesmanager.core.business.services.catalog.product.manufacturer.ManufacturerService;
-import com.salesmanager.core.business.services.catalog.product.price.ProductPriceService;
-import com.salesmanager.core.business.services.catalog.product.relationship.ProductRelationshipService;
-import com.salesmanager.core.business.services.catalog.product.review.ProductReviewService;
-import com.salesmanager.core.business.services.catalog.product.type.ProductTypeService;
-import com.salesmanager.core.business.services.customer.CustomerService;
-import com.salesmanager.core.business.services.customer.attribute.CustomerOptionService;
-import com.salesmanager.core.business.services.customer.attribute.CustomerOptionSetService;
-import com.salesmanager.core.business.services.customer.attribute.CustomerOptionValueService;
-import com.salesmanager.core.business.services.merchant.MerchantStoreService;
-import com.salesmanager.core.business.services.order.OrderService;
-import com.salesmanager.core.business.services.payments.PaymentService;
-import com.salesmanager.core.business.services.reference.country.CountryService;
-import com.salesmanager.core.business.services.reference.currency.CurrencyService;
-import com.salesmanager.core.business.services.reference.init.InitializationDatabase;
-import com.salesmanager.core.business.services.reference.language.LanguageService;
-import com.salesmanager.core.business.services.reference.zone.ZoneService;
-import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
-import com.salesmanager.core.business.services.system.EmailService;
-import com.salesmanager.core.business.utils.ProductPriceUtils;
-import com.salesmanager.test.configuration.ConfigurationTest;
-
-
-/**
- * @author c.samson
- *
- */
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@SpringApplicationConfiguration(classes = {ConfigurationTest.class})
-public class AbstractSalesManagerCoreTestCase {
-
-
- protected static String CAD_CURRENCY_CODE = "CAD";
- protected static String USD_CURRENCY_CODE = "USD";
-
- protected static String ENGLISH_LANGUAGE_CODE = "en";
- protected static String FRENCH_LANGUAGE_CODE = "fr";
-
- @Inject
- protected InitializationDatabase initializationDatabase;
-
- @Inject
- protected ProductService productService;
-
- @Inject
- protected PricingService pricingService;
-
- @Inject
- private ProductPriceUtils priceUtil;
-
-
- @Inject
- protected ProductPriceService productPriceService;
-
- @Inject
- protected ProductAttributeService productAttributeService;
-
- @Inject
- protected ProductOptionService productOptionService;
-
- @Inject
- protected ProductOptionValueService productOptionValueService;
-
- @Inject
- protected ProductAvailabilityService productAvailabilityService;
-
- @Inject
- protected ProductReviewService productReviewService;
-
- @Inject
- protected ProductImageService productImageService;
-
- @Inject
- protected ProductRelationshipService productRelationshipService;
-
- @Inject
- protected CategoryService categoryService;
-
- @Inject
- protected MerchantStoreService merchantService;
-
- @Inject
- protected ProductTypeService productTypeService;
-
- @Inject
- protected LanguageService languageService;
-
- @Inject
- protected CountryService countryService;
-
- @Inject
- protected CurrencyService currencyService;
-
- @Inject
- protected ManufacturerService manufacturerService;
-
- @Inject
- protected ZoneService zoneService;
-
- @Inject
- protected CustomerService customerService;
-
- @Inject
- protected CustomerOptionService customerOptionService;
-
- @Inject
- protected CustomerOptionValueService customerOptionValueService;
-
- @Inject
- protected CustomerOptionSetService customerOptionSetService;
-
- @Inject
- protected OrderService orderService;
-
- @Inject
- protected PaymentService paymentService;
-
- @Inject
- protected ShoppingCartService shoppingCartService;
-
- @Inject
- protected EmailService emailService;
-
- @Before
- public void init() throws ServiceException {
- System.out.println("**** INTO INIT ***");
- populate();
-
- }
-
- @After
- public void close() throws ServiceException {
-
- }
-
- private void populate() throws ServiceException {
-
-
- initializationDatabase.populate("TEST");
-
-
- }
-
-}
+/**
+ * This application is maintained by CSTI consulting (www.csticonsulting.com).
+ * Licensed under LGPL - Feel free to use it and modify it to your needs !
+ *
+ */
+package com.salesmanager.test.common;
+
+import javax.inject.Inject;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.SpringApplicationConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.catalog.category.CategoryService;
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
+import com.salesmanager.core.business.services.catalog.product.attribute.ProductOptionService;
+import com.salesmanager.core.business.services.catalog.product.attribute.ProductOptionValueService;
+import com.salesmanager.core.business.services.catalog.product.availability.ProductAvailabilityService;
+import com.salesmanager.core.business.services.catalog.product.image.ProductImageService;
+import com.salesmanager.core.business.services.catalog.product.manufacturer.ManufacturerService;
+import com.salesmanager.core.business.services.catalog.product.price.ProductPriceService;
+import com.salesmanager.core.business.services.catalog.product.relationship.ProductRelationshipService;
+import com.salesmanager.core.business.services.catalog.product.review.ProductReviewService;
+import com.salesmanager.core.business.services.catalog.product.type.ProductTypeService;
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.business.services.customer.attribute.CustomerOptionService;
+import com.salesmanager.core.business.services.customer.attribute.CustomerOptionSetService;
+import com.salesmanager.core.business.services.customer.attribute.CustomerOptionValueService;
+import com.salesmanager.core.business.services.merchant.MerchantStoreService;
+import com.salesmanager.core.business.services.order.OrderService;
+import com.salesmanager.core.business.services.payments.PaymentService;
+import com.salesmanager.core.business.services.reference.country.CountryService;
+import com.salesmanager.core.business.services.reference.currency.CurrencyService;
+import com.salesmanager.core.business.services.reference.init.InitializationDatabase;
+import com.salesmanager.core.business.services.reference.language.LanguageService;
+import com.salesmanager.core.business.services.reference.zone.ZoneService;
+import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
+import com.salesmanager.core.business.services.system.EmailService;
+import com.salesmanager.core.business.utils.ProductPriceUtils;
+import com.salesmanager.test.configuration.ConfigurationTest;
+
+
+/**
+ * @author c.samson
+ *
+ */
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringApplicationConfiguration(classes = {ConfigurationTest.class})
+public class AbstractSalesManagerCoreTestCase {
+
+
+ protected static String CAD_CURRENCY_CODE = "CAD";
+ protected static String USD_CURRENCY_CODE = "USD";
+
+ protected static String ENGLISH_LANGUAGE_CODE = "en";
+ protected static String FRENCH_LANGUAGE_CODE = "fr";
+
+ @Inject
+ protected InitializationDatabase initializationDatabase;
+
+ @Inject
+ protected ProductService productService;
+
+ @Inject
+ protected PricingService pricingService;
+
+ @Inject
+ private ProductPriceUtils priceUtil;
+
+
+ @Inject
+ protected ProductPriceService productPriceService;
+
+ @Inject
+ protected ProductAttributeService productAttributeService;
+
+ @Inject
+ protected ProductOptionService productOptionService;
+
+ @Inject
+ protected ProductOptionValueService productOptionValueService;
+
+ @Inject
+ protected ProductAvailabilityService productAvailabilityService;
+
+ @Inject
+ protected ProductReviewService productReviewService;
+
+ @Inject
+ protected ProductImageService productImageService;
+
+ @Inject
+ protected ProductRelationshipService productRelationshipService;
+
+ @Inject
+ protected CategoryService categoryService;
+
+ @Inject
+ protected MerchantStoreService merchantService;
+
+ @Inject
+ protected ProductTypeService productTypeService;
+
+ @Inject
+ protected LanguageService languageService;
+
+ @Inject
+ protected CountryService countryService;
+
+ @Inject
+ protected CurrencyService currencyService;
+
+ @Inject
+ protected ManufacturerService manufacturerService;
+
+ @Inject
+ protected ZoneService zoneService;
+
+ @Inject
+ protected CustomerService customerService;
+
+ @Inject
+ protected CustomerOptionService customerOptionService;
+
+ @Inject
+ protected CustomerOptionValueService customerOptionValueService;
+
+ @Inject
+ protected CustomerOptionSetService customerOptionSetService;
+
+ @Inject
+ protected OrderService orderService;
+
+ @Inject
+ protected PaymentService paymentService;
+
+ @Inject
+ protected ShoppingCartService shoppingCartService;
+
+ @Inject
+ protected EmailService emailService;
+
+ @Before
+ public void init() throws ServiceException {
+ System.out.println("**** INTO INIT ***");
+ populate();
+
+ }
+
+ @After
+ public void close() throws ServiceException {
+
+ }
+
+ private void populate() throws ServiceException {
+
+
+ initializationDatabase.populate("TEST");
+
+
+ }
+
+}
diff --git a/sm-core/src/test/java/com/salesmanager/test/configuration/ConfigurationTest.java b/sm-core/src/test/java/com/salesmanager/test/configuration/ConfigurationTest.java
index 5c7b062..35382ad 100644
--- a/sm-core/src/test/java/com/salesmanager/test/configuration/ConfigurationTest.java
+++ b/sm-core/src/test/java/com/salesmanager/test/configuration/ConfigurationTest.java
@@ -1,16 +1,16 @@
-package com.salesmanager.test.configuration;
-
-import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
-import org.springframework.boot.orm.jpa.EntityScan;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.ImportResource;
-
-@Configuration
-@EnableAutoConfiguration
-@EntityScan(basePackages = {"com.salesmanager.core.model"})
-@ComponentScan({"com.salesmanager.core.business.services","com.salesmanager.core.business.utils"})
-@ImportResource("spring/test-shopizer-context.xml")
-public class ConfigurationTest {
-
-}
+package com.salesmanager.test.configuration;
+
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.orm.jpa.EntityScan;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.ImportResource;
+
+@Configuration
+@EnableAutoConfiguration
+@EntityScan(basePackages = {"com.salesmanager.core.model"})
+@ComponentScan({"com.salesmanager.core.business.services","com.salesmanager.core.business.utils"})
+@ImportResource("spring/test-shopizer-context.xml")
+public class ConfigurationTest {
+
+}
diff --git a/sm-core/src/test/java/com/salesmanager/test/customer/CustomerTest.java b/sm-core/src/test/java/com/salesmanager/test/customer/CustomerTest.java
index 944b164..6c54078 100644
--- a/sm-core/src/test/java/com/salesmanager/test/customer/CustomerTest.java
+++ b/sm-core/src/test/java/com/salesmanager/test/customer/CustomerTest.java
@@ -1,221 +1,221 @@
-package com.salesmanager.test.customer;
-
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.junit.Ignore;
-import org.junit.Test;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.model.common.Billing;
-import com.salesmanager.core.model.common.Delivery;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.customer.CustomerGender;
-import com.salesmanager.core.model.customer.attribute.CustomerAttribute;
-import com.salesmanager.core.model.customer.attribute.CustomerOption;
-import com.salesmanager.core.model.customer.attribute.CustomerOptionDescription;
-import com.salesmanager.core.model.customer.attribute.CustomerOptionSet;
-import com.salesmanager.core.model.customer.attribute.CustomerOptionValue;
-import com.salesmanager.core.model.customer.attribute.CustomerOptionValueDescription;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.reference.zone.Zone;
-
-
-
-@Ignore
-public class CustomerTest extends com.salesmanager.test.common.AbstractSalesManagerCoreTestCase {
-
- @Test
- public void createCustomer() throws ServiceException {
-
-
- Language en = languageService.getByCode("en");
-
-
- MerchantStore store = merchantService.getByCode(MerchantStore.DEFAULT_STORE);
- Country country = countryService.getByCode("CA");
- Zone zone = zoneService.getByCode("QC");
-
- /** Core customer attributes **/
- Customer customer = new Customer();
- customer.setMerchantStore(store);
- customer.setEmailAddress("test@test.com");
- customer.setGender(CustomerGender.M);
-
- customer.setAnonymous(true);
- customer.setCompany("ifactory");
- customer.setDateOfBirth(new Date());
- customer.setNick("My nick");
- customer.setPassword("123456");
- customer.setDefaultLanguage(store.getDefaultLanguage());
-
- Delivery delivery = new Delivery();
- delivery.setAddress("Shipping address");
- delivery.setCountry(country);
- delivery.setZone(zone);
-
-
- Billing billing = new Billing();
- billing.setFirstName("John");
- billing.setLastName("Bossanova");
- billing.setAddress("Billing address");
- billing.setCountry(country);
- billing.setZone(zone);
-
- customer.setBilling(billing);
- customer.setDelivery(delivery);
-
- customerService.create(customer);
- customer = customerService.getById(customer.getId());
-
-
- //create an option value
- CustomerOptionValue yes = new CustomerOptionValue();
- yes.setCode("yes");
- yes.setMerchantStore(store);
- CustomerOptionValueDescription yesDescription = new CustomerOptionValueDescription();
- yesDescription.setLanguage(en);
- yesDescription.setCustomerOptionValue(yes);
-
- CustomerOptionValueDescription yes_sir = new CustomerOptionValueDescription();
- yes_sir.setCustomerOptionValue(yes);
- yes_sir.setDescription("Yes sir!");
- yes_sir.setName("Yes sir!");
- yes_sir.setLanguage(en);
- yes.getDescriptions().add(yes_sir);
-
- //needs to be saved before using it
- customerOptionValueService.create(yes);
-
- CustomerOptionValue no = new CustomerOptionValue();
- no.setCode("no");
- no.setMerchantStore(store);
- CustomerOptionValueDescription noDescription = new CustomerOptionValueDescription();
- noDescription.setLanguage(en);
- noDescription.setCustomerOptionValue(no);
-
- CustomerOptionValueDescription no_sir = new CustomerOptionValueDescription();
- no_sir.setCustomerOptionValue(no);
- no_sir.setDescription("Nope!");
- no_sir.setName("Nope!");
- no_sir.setLanguage(en);
- no.getDescriptions().add(no_sir);
-
- //needs to be saved before using it
- customerOptionValueService.create(no);
-
-
- //create a customer option to be used
- CustomerOption subscribedToMailingList = new CustomerOption();
- subscribedToMailingList.setActive(true);
- subscribedToMailingList.setPublicOption(true);
- subscribedToMailingList.setCode("subscribedToMailingList");
- subscribedToMailingList.setMerchantStore(store);
-
- CustomerOptionDescription mailingListDesciption= new CustomerOptionDescription();
- mailingListDesciption.setName("Subscribed to mailing list");
- mailingListDesciption.setDescription("Subscribed to mailing list");
- mailingListDesciption.setLanguage(en);
- mailingListDesciption.setCustomerOption(subscribedToMailingList);
-
- Set<CustomerOptionDescription> mailingListDesciptionList = new HashSet<CustomerOptionDescription>();
- mailingListDesciptionList.add(mailingListDesciption);
- subscribedToMailingList.setDescriptions(mailingListDesciptionList);
-
- customerOptionService.create(subscribedToMailingList);
-
-
- //create a customer option to be used
- CustomerOption hasReturnedItems = new CustomerOption();
- hasReturnedItems.setActive(true);
- hasReturnedItems.setPublicOption(true);
- hasReturnedItems.setCode("hasReturnedItems");
- hasReturnedItems.setMerchantStore(store);
-
- CustomerOptionDescription hasReturnedItemsDesciption= new CustomerOptionDescription();
- hasReturnedItemsDesciption.setName("Has returned items");
- hasReturnedItemsDesciption.setDescription("Has returned items");
- hasReturnedItemsDesciption.setLanguage(en);
- hasReturnedItemsDesciption.setCustomerOption(hasReturnedItems);
-
- Set<CustomerOptionDescription> hasReturnedItemsList = new HashSet<CustomerOptionDescription>();
- hasReturnedItemsList.add(hasReturnedItemsDesciption);
- hasReturnedItems.setDescriptions(hasReturnedItemsList);
-
- customerOptionService.create(hasReturnedItems);
-
- subscribedToMailingList.setSortOrder(3);
-
- customerOptionService.update(subscribedToMailingList);
-
- //--
- //now create an option set (association of a customer option with possible customer option values)
- //--
-
- //possible yes
- CustomerOptionSet mailingListSetYes = new CustomerOptionSet();
-
- mailingListSetYes.setSortOrder(0);
- mailingListSetYes.setCustomerOption(subscribedToMailingList);
- mailingListSetYes.setCustomerOptionValue(yes);
-
- customerOptionSetService.create(mailingListSetYes);
-
- //possible no
- CustomerOptionSet mailingListSetNo = new CustomerOptionSet();
- //mailingListSetNo.setPk(mailingListSetNoId);
- mailingListSetNo.setSortOrder(1);
- mailingListSetNo.setCustomerOption(subscribedToMailingList);
- mailingListSetNo.setCustomerOptionValue(no);
-
- customerOptionSetService.create(mailingListSetNo);
-
- //possible has returned items
-
- CustomerOptionSet hasReturnedItemsYes = new CustomerOptionSet();
- hasReturnedItemsYes.setSortOrder(0);
- hasReturnedItemsYes.setCustomerOption(hasReturnedItems);
- hasReturnedItemsYes.setCustomerOptionValue(yes);
-
- customerOptionSetService.create(hasReturnedItemsYes);
-
-
- subscribedToMailingList.setSortOrder(2);
- customerOptionService.update(subscribedToMailingList);
-
- CustomerOption option = customerOptionService.getById(subscribedToMailingList.getId());
-
- option.setSortOrder(4);
- customerOptionService.update(option);
-
- List<CustomerOptionSet> optionSetList = customerOptionSetService.listByStore(store, en);
-
- //Assert.assertEquals(3, optionSetList.size());
- System.out.println("Size of options : " + optionSetList.size());
-
- /**
- * Now create a customer option attribute
- * A customer attribute is a selected customer option set transformed to an
- * attribute for a given customer
- */
-
- CustomerAttribute customerAttributeMailingList = new CustomerAttribute();
- customerAttributeMailingList.setCustomer(customer);
- customerAttributeMailingList.setCustomerOption(subscribedToMailingList);
- customerAttributeMailingList.setCustomerOptionValue(no);
-
- customer.getAttributes().add(customerAttributeMailingList);
-
- customerService.save(customer);
-
- customerService.delete(customer);
-
-
-
-
- }
-}
+package com.salesmanager.test.customer;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.junit.Ignore;
+import org.junit.Test;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.model.common.Billing;
+import com.salesmanager.core.model.common.Delivery;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.customer.CustomerGender;
+import com.salesmanager.core.model.customer.attribute.CustomerAttribute;
+import com.salesmanager.core.model.customer.attribute.CustomerOption;
+import com.salesmanager.core.model.customer.attribute.CustomerOptionDescription;
+import com.salesmanager.core.model.customer.attribute.CustomerOptionSet;
+import com.salesmanager.core.model.customer.attribute.CustomerOptionValue;
+import com.salesmanager.core.model.customer.attribute.CustomerOptionValueDescription;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.reference.zone.Zone;
+
+
+
+@Ignore
+public class CustomerTest extends com.salesmanager.test.common.AbstractSalesManagerCoreTestCase {
+
+ @Test
+ public void createCustomer() throws ServiceException {
+
+
+ Language en = languageService.getByCode("en");
+
+
+ MerchantStore store = merchantService.getByCode(MerchantStore.DEFAULT_STORE);
+ Country country = countryService.getByCode("CA");
+ Zone zone = zoneService.getByCode("QC");
+
+ /** Core customer attributes **/
+ Customer customer = new Customer();
+ customer.setMerchantStore(store);
+ customer.setEmailAddress("test@test.com");
+ customer.setGender(CustomerGender.M);
+
+ customer.setAnonymous(true);
+ customer.setCompany("ifactory");
+ customer.setDateOfBirth(new Date());
+ customer.setNick("My nick");
+ customer.setPassword("123456");
+ customer.setDefaultLanguage(store.getDefaultLanguage());
+
+ Delivery delivery = new Delivery();
+ delivery.setAddress("Shipping address");
+ delivery.setCountry(country);
+ delivery.setZone(zone);
+
+
+ Billing billing = new Billing();
+ billing.setFirstName("John");
+ billing.setLastName("Bossanova");
+ billing.setAddress("Billing address");
+ billing.setCountry(country);
+ billing.setZone(zone);
+
+ customer.setBilling(billing);
+ customer.setDelivery(delivery);
+
+ customerService.create(customer);
+ customer = customerService.getById(customer.getId());
+
+
+ //create an option value
+ CustomerOptionValue yes = new CustomerOptionValue();
+ yes.setCode("yes");
+ yes.setMerchantStore(store);
+ CustomerOptionValueDescription yesDescription = new CustomerOptionValueDescription();
+ yesDescription.setLanguage(en);
+ yesDescription.setCustomerOptionValue(yes);
+
+ CustomerOptionValueDescription yes_sir = new CustomerOptionValueDescription();
+ yes_sir.setCustomerOptionValue(yes);
+ yes_sir.setDescription("Yes sir!");
+ yes_sir.setName("Yes sir!");
+ yes_sir.setLanguage(en);
+ yes.getDescriptions().add(yes_sir);
+
+ //needs to be saved before using it
+ customerOptionValueService.create(yes);
+
+ CustomerOptionValue no = new CustomerOptionValue();
+ no.setCode("no");
+ no.setMerchantStore(store);
+ CustomerOptionValueDescription noDescription = new CustomerOptionValueDescription();
+ noDescription.setLanguage(en);
+ noDescription.setCustomerOptionValue(no);
+
+ CustomerOptionValueDescription no_sir = new CustomerOptionValueDescription();
+ no_sir.setCustomerOptionValue(no);
+ no_sir.setDescription("Nope!");
+ no_sir.setName("Nope!");
+ no_sir.setLanguage(en);
+ no.getDescriptions().add(no_sir);
+
+ //needs to be saved before using it
+ customerOptionValueService.create(no);
+
+
+ //create a customer option to be used
+ CustomerOption subscribedToMailingList = new CustomerOption();
+ subscribedToMailingList.setActive(true);
+ subscribedToMailingList.setPublicOption(true);
+ subscribedToMailingList.setCode("subscribedToMailingList");
+ subscribedToMailingList.setMerchantStore(store);
+
+ CustomerOptionDescription mailingListDesciption= new CustomerOptionDescription();
+ mailingListDesciption.setName("Subscribed to mailing list");
+ mailingListDesciption.setDescription("Subscribed to mailing list");
+ mailingListDesciption.setLanguage(en);
+ mailingListDesciption.setCustomerOption(subscribedToMailingList);
+
+ Set<CustomerOptionDescription> mailingListDesciptionList = new HashSet<CustomerOptionDescription>();
+ mailingListDesciptionList.add(mailingListDesciption);
+ subscribedToMailingList.setDescriptions(mailingListDesciptionList);
+
+ customerOptionService.create(subscribedToMailingList);
+
+
+ //create a customer option to be used
+ CustomerOption hasReturnedItems = new CustomerOption();
+ hasReturnedItems.setActive(true);
+ hasReturnedItems.setPublicOption(true);
+ hasReturnedItems.setCode("hasReturnedItems");
+ hasReturnedItems.setMerchantStore(store);
+
+ CustomerOptionDescription hasReturnedItemsDesciption= new CustomerOptionDescription();
+ hasReturnedItemsDesciption.setName("Has returned items");
+ hasReturnedItemsDesciption.setDescription("Has returned items");
+ hasReturnedItemsDesciption.setLanguage(en);
+ hasReturnedItemsDesciption.setCustomerOption(hasReturnedItems);
+
+ Set<CustomerOptionDescription> hasReturnedItemsList = new HashSet<CustomerOptionDescription>();
+ hasReturnedItemsList.add(hasReturnedItemsDesciption);
+ hasReturnedItems.setDescriptions(hasReturnedItemsList);
+
+ customerOptionService.create(hasReturnedItems);
+
+ subscribedToMailingList.setSortOrder(3);
+
+ customerOptionService.update(subscribedToMailingList);
+
+ //--
+ //now create an option set (association of a customer option with possible customer option values)
+ //--
+
+ //possible yes
+ CustomerOptionSet mailingListSetYes = new CustomerOptionSet();
+
+ mailingListSetYes.setSortOrder(0);
+ mailingListSetYes.setCustomerOption(subscribedToMailingList);
+ mailingListSetYes.setCustomerOptionValue(yes);
+
+ customerOptionSetService.create(mailingListSetYes);
+
+ //possible no
+ CustomerOptionSet mailingListSetNo = new CustomerOptionSet();
+ //mailingListSetNo.setPk(mailingListSetNoId);
+ mailingListSetNo.setSortOrder(1);
+ mailingListSetNo.setCustomerOption(subscribedToMailingList);
+ mailingListSetNo.setCustomerOptionValue(no);
+
+ customerOptionSetService.create(mailingListSetNo);
+
+ //possible has returned items
+
+ CustomerOptionSet hasReturnedItemsYes = new CustomerOptionSet();
+ hasReturnedItemsYes.setSortOrder(0);
+ hasReturnedItemsYes.setCustomerOption(hasReturnedItems);
+ hasReturnedItemsYes.setCustomerOptionValue(yes);
+
+ customerOptionSetService.create(hasReturnedItemsYes);
+
+
+ subscribedToMailingList.setSortOrder(2);
+ customerOptionService.update(subscribedToMailingList);
+
+ CustomerOption option = customerOptionService.getById(subscribedToMailingList.getId());
+
+ option.setSortOrder(4);
+ customerOptionService.update(option);
+
+ List<CustomerOptionSet> optionSetList = customerOptionSetService.listByStore(store, en);
+
+ //Assert.assertEquals(3, optionSetList.size());
+ System.out.println("Size of options : " + optionSetList.size());
+
+ /**
+ * Now create a customer option attribute
+ * A customer attribute is a selected customer option set transformed to an
+ * attribute for a given customer
+ */
+
+ CustomerAttribute customerAttributeMailingList = new CustomerAttribute();
+ customerAttributeMailingList.setCustomer(customer);
+ customerAttributeMailingList.setCustomerOption(subscribedToMailingList);
+ customerAttributeMailingList.setCustomerOptionValue(no);
+
+ customer.getAttributes().add(customerAttributeMailingList);
+
+ customerService.save(customer);
+
+ customerService.delete(customer);
+
+
+
+
+ }
+}
diff --git a/sm-core/src/test/java/com/salesmanager/test/merchant/MerchantTest.java b/sm-core/src/test/java/com/salesmanager/test/merchant/MerchantTest.java
index 6b7d321..7518414 100644
--- a/sm-core/src/test/java/com/salesmanager/test/merchant/MerchantTest.java
+++ b/sm-core/src/test/java/com/salesmanager/test/merchant/MerchantTest.java
@@ -1,29 +1,29 @@
-package com.salesmanager.test.merchant;
-
-import org.junit.Ignore;
-import org.junit.Test;
-
-import com.salesmanager.test.common.AbstractSalesManagerCoreTestCase;
-
-/**
- * https://springframework.guru/spring-boot-web-application-part-3-spring-data-jpa/
- * http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/xsd-config.html
- * http://docs.spring.io/spring-data/jpa/docs/current/reference/html/
- * http://techblog.outbrain.com/2014/05/so-long-spring-xmls/
- * http://jdpgrailsdev.github.io/blog/2014/09/09/spring_data_hibernate_join.html
- * @author c.samson
- *
- */
-
-@Ignore
-public class MerchantTest extends AbstractSalesManagerCoreTestCase {
-
-
- //@Test
- @Ignore
- public void testReferences() {
- System.out.println("No tests in merchant");
- }
-
-
-}
+package com.salesmanager.test.merchant;
+
+import org.junit.Ignore;
+import org.junit.Test;
+
+import com.salesmanager.test.common.AbstractSalesManagerCoreTestCase;
+
+/**
+ * https://springframework.guru/spring-boot-web-application-part-3-spring-data-jpa/
+ * http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/xsd-config.html
+ * http://docs.spring.io/spring-data/jpa/docs/current/reference/html/
+ * http://techblog.outbrain.com/2014/05/so-long-spring-xmls/
+ * http://jdpgrailsdev.github.io/blog/2014/09/09/spring_data_hibernate_join.html
+ * @author c.samson
+ *
+ */
+
+@Ignore
+public class MerchantTest extends AbstractSalesManagerCoreTestCase {
+
+
+ //@Test
+ @Ignore
+ public void testReferences() {
+ System.out.println("No tests in merchant");
+ }
+
+
+}
diff --git a/sm-core/src/test/java/com/salesmanager/test/order/InvoiceTest.java b/sm-core/src/test/java/com/salesmanager/test/order/InvoiceTest.java
index c8aeceb..057453c 100644
--- a/sm-core/src/test/java/com/salesmanager/test/order/InvoiceTest.java
+++ b/sm-core/src/test/java/com/salesmanager/test/order/InvoiceTest.java
@@ -1,705 +1,705 @@
-package com.salesmanager.test.order;
-
-import java.awt.Graphics2D;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.math.BigDecimal;
-import java.net.URL;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-
-import javax.inject.Inject;
-
-import org.apache.commons.lang3.StringUtils;
-import org.jopendocument.dom.OOUtils;
-import org.jopendocument.dom.spreadsheet.Sheet;
-import org.jopendocument.dom.spreadsheet.SpreadSheet;
-import org.jopendocument.model.OpenDocument;
-import org.jopendocument.renderer.ODTRenderer;
-import org.junit.Assert;
-import org.junit.Ignore;
-import org.junit.Test;
-
-import com.itextpdf.text.Document;
-import com.itextpdf.text.PageSize;
-import com.itextpdf.text.Rectangle;
-import com.itextpdf.text.pdf.PdfContentByte;
-import com.itextpdf.text.pdf.PdfDocument;
-import com.itextpdf.text.pdf.PdfTemplate;
-import com.itextpdf.text.pdf.PdfWriter;
-import com.salesmanager.core.business.constants.Constants;
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.utils.ProductPriceUtils;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
-import com.salesmanager.core.model.catalog.product.attribute.ProductOption;
-import com.salesmanager.core.model.catalog.product.attribute.ProductOptionDescription;
-import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValue;
-import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValueDescription;
-import com.salesmanager.core.model.catalog.product.availability.ProductAvailability;
-import com.salesmanager.core.model.catalog.product.description.ProductDescription;
-import com.salesmanager.core.model.catalog.product.price.ProductPrice;
-import com.salesmanager.core.model.catalog.product.price.ProductPriceDescription;
-import com.salesmanager.core.model.catalog.product.type.ProductType;
-import com.salesmanager.core.model.common.Billing;
-import com.salesmanager.core.model.common.Delivery;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.customer.CustomerGender;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.Order;
-import com.salesmanager.core.model.order.OrderTotal;
-import com.salesmanager.core.model.order.orderproduct.OrderProduct;
-import com.salesmanager.core.model.order.orderproduct.OrderProductAttribute;
-import com.salesmanager.core.model.order.orderproduct.OrderProductDownload;
-import com.salesmanager.core.model.order.orderproduct.OrderProductPrice;
-import com.salesmanager.core.model.order.orderstatus.OrderStatus;
-import com.salesmanager.core.model.order.orderstatus.OrderStatusHistory;
-import com.salesmanager.core.model.payments.PaymentType;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.currency.Currency;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.reference.zone.Zone;
-
-
-/**
- * This test has to be completed
- * @author c.samson
- *
- */
-@Ignore
-public class InvoiceTest extends com.salesmanager.test.common.AbstractSalesManagerCoreTestCase {
-
- @Inject
- ProductPriceUtils priceUtil;
-
- //@Test
- @Ignore
- public void createInvoice() throws ServiceException {
-
-
- MerchantStore store = merchantService.getByCode(MerchantStore.DEFAULT_STORE);
-
- //create a product
- ProductType generalType = productTypeService.getProductType(ProductType.GENERAL_TYPE);
-
- Language en = languageService.getByCode("en");
-
-
- /**
- * 1) Create an order
- *
- */
-
- //1.1 create a product
-
- //create an option
- ProductOption color = new ProductOption();
- color.setMerchantStore(store);
- color.setCode("color");
- color.setProductOptionType("SELECT");
-
- ProductOptionDescription colorDescription = new ProductOptionDescription();
- colorDescription.setDescription("Color");
- colorDescription.setName("Color");
- colorDescription.setLanguage(en);
- colorDescription.setProductOption(color);
-
- Set<ProductOptionDescription> colorDescriptions = new HashSet<ProductOptionDescription>();
- colorDescriptions.add(colorDescription);
-
- color.setDescriptions(colorDescriptions);
-
- productOptionService.create(color);
-
- //create an option value
- ProductOptionValue red = new ProductOptionValue();
- red.setMerchantStore(store);
- red.setCode("red");
-
- ProductOptionValueDescription redDescription = new ProductOptionValueDescription();
- redDescription.setDescription("Red");
- redDescription.setLanguage(en);
- redDescription.setName("Red");
- redDescription.setProductOptionValue(red);
-
- Set<ProductOptionValueDescription> redDescriptions = new HashSet<ProductOptionValueDescription>();
- redDescriptions.add(redDescription);
-
- red.setDescriptions(redDescriptions);
-
- productOptionValueService.create(red);
-
- //create a product
- Product product = new Product();
- product.setProductHeight(new BigDecimal(4));
- product.setProductLength(new BigDecimal(3));
- product.setProductWidth(new BigDecimal(5));
- product.setProductWeight(new BigDecimal(8));
- product.setSku("TESTSKU");
- product.setType(generalType);
- product.setMerchantStore(store);
-
- // Product description
- ProductDescription description = new ProductDescription();
- description.setName("Product 1");
- description.setLanguage(en);
- description.setProduct(product);
-
- product.getDescriptions().add(description);
-
-
- // Availability
- ProductAvailability availability = new ProductAvailability();
- availability.setProductDateAvailable(new Date());
- availability.setProductQuantity(100);
- availability.setRegion("*");
- availability.setProduct(product);// associate with product
-
- product.getAvailabilities().add(availability);
-
- //price
- ProductPrice dprice = new ProductPrice();
- dprice.setDefaultPrice(true);
- dprice.setProductPriceAmount(new BigDecimal(29.99));
- dprice.setProductAvailability(availability);
-
- ProductPriceDescription dpd = new ProductPriceDescription();
- dpd.setName("Base price");
- dpd.setProductPrice(dprice);
- dpd.setLanguage(en);
-
- dprice.getDescriptions().add(dpd);
-
-
- //create an attribute
- ProductAttribute colorAttribute = new ProductAttribute();
- colorAttribute.setProduct(product);
- colorAttribute.setProductAttributePrice(new BigDecimal(5));
- colorAttribute.setProductOption(color);
- colorAttribute.setProductOptionValue(red);
-
-
- product.getAttributes().add(colorAttribute);
-
- productService.create(product);
-
-
- //1.2 create a Customer
- Country country = countryService.getByCode("CA");
- Zone zone = zoneService.getByCode("QC");
-
- Customer customer = new Customer();
- customer.setMerchantStore(store);
- customer.setEmailAddress("test@test.com");
- customer.setGender(CustomerGender.M);
- customer.setAnonymous(true);
- customer.setCompany("ifactory");
- customer.setDateOfBirth(new Date());
- customer.setNick("My nick");
- customer.setDefaultLanguage(en);
-
-
- Delivery delivery = new Delivery();
- delivery.setAddress("358 Du Languadoc");
- delivery.setCity( "Boucherville" );
- delivery.setCountry(country);
-// delivery.setCountryCode(CA_COUNTRY_CODE);
- delivery.setFirstName("First" );
- delivery.setLastName("Last" );
- delivery.setPostalCode("J4B-8J9" );
- delivery.setZone(zone);
-
- Billing billing = new Billing();
- billing.setAddress("358 Du Languadoc");
- billing.setCity("Boucherville");
- billing.setCompany("CSTI Consulting");
- billing.setCountry(country);
-// billing.setCountryCode(CA_COUNTRY_CODE);
- billing.setFirstName("Carl" );
- billing.setLastName("Samson" );
- billing.setPostalCode("J4B-8J9");
- billing.setZone(zone);
-
- customer.setBilling(billing);
- customer.setDelivery(delivery);
- customerService.create(customer);
-
- Currency currency = currencyService.getByCode(CAD_CURRENCY_CODE);
-
- //1.3 create an order
- OrderStatusHistory orderStatusHistory = new OrderStatusHistory();
-
-
- Order order = new Order();
- order.setDatePurchased(new Date());
- order.setCurrency(currency);
- order.setLastModified(new Date());
- order.setBilling(billing);
-
- Locale l = Locale.CANADA;
- order.setLocale(l);
-
-
- order.setCurrencyValue(new BigDecimal(0.98));//compared to based currency (not necessary)
- order.setCustomerId(customer.getId());
- order.setDelivery(delivery);
- order.setIpAddress("ipAddress" );
- order.setMerchant(store);
- order.setCustomerEmailAddress(customer.getEmailAddress());
- order.setOrderDateFinished(new Date());//committed date
-
- orderStatusHistory.setComments("We received your order");
- orderStatusHistory.setCustomerNotified(1);
- orderStatusHistory.setStatus(OrderStatus.ORDERED);
- orderStatusHistory.setDateAdded(new Date() );
- orderStatusHistory.setOrder(order);
- order.getOrderHistory().add( orderStatusHistory );
-
-
- order.setPaymentType(PaymentType.PAYPAL);
- order.setPaymentModuleCode("paypal");
- order.setStatus( OrderStatus.DELIVERED);
- order.setTotal(new BigDecimal(23.99));
-
-
- //OrderProductDownload - Digital download
- OrderProductDownload orderProductDownload = new OrderProductDownload();
- orderProductDownload.setDownloadCount(1);
- orderProductDownload.setMaxdays(31);
- orderProductDownload.setOrderProductFilename("Your digital file name");
-
- //OrderProductPrice
- OrderProductPrice oproductprice = new OrderProductPrice();
- oproductprice.setDefaultPrice(true);
- oproductprice.setProductPrice(new BigDecimal(19.99) );
- oproductprice.setProductPriceCode("baseprice" );
- oproductprice.setProductPriceName("Base Price" );
-
- //OrderProduct
- OrderProduct oproduct = new OrderProduct();
- oproduct.getDownloads().add( orderProductDownload);
- oproduct.setOneTimeCharge( new BigDecimal(19.99) );
- oproduct.setOrder(order);
- oproduct.setProductName( "Product name" );
- oproduct.setProductQuantity(2);
- oproduct.setSku("TB12345" );
- oproduct.getPrices().add(oproductprice ) ;
-
-
- //an attribute to the OrderProduct
- OrderProductAttribute orderAttribute = new OrderProductAttribute();
- orderAttribute.setOrderProduct(oproduct);
- orderAttribute.setProductAttributeName(colorDescription.getName());
- orderAttribute.setProductAttributeValueName(redDescription.getName());
- orderAttribute.setProductOptionId(color.getId());
- orderAttribute.setProductOptionValueId(red.getId());
- orderAttribute.setProductAttributePrice(colorAttribute.getProductAttributePrice());
-
- Set<OrderProductAttribute> orderAttributes = new HashSet<OrderProductAttribute>();
- orderAttributes.add(orderAttribute);
-
- oproduct.setOrderAttributes(orderAttributes);
-
- oproductprice.setOrderProduct(oproduct);
- orderProductDownload.setOrderProduct(oproduct);
- order.getOrderProducts().add(oproduct);
-
-
- //product #2
- OrderProductPrice oproductprice2 = new OrderProductPrice();
- oproductprice2.setDefaultPrice(true);
- oproductprice2.setProductPrice(new BigDecimal(9.99) );
- oproductprice2.setProductPriceCode("baseprice" );
- oproductprice2.setProductPriceName("Base Price" );
-
- //OrderProduct
- OrderProduct oproduct2 = new OrderProduct();
- oproduct2.setOneTimeCharge( new BigDecimal(9.99) );
- oproduct2.setOrder(order);
- oproduct2.setProductName( "Additional item name" );
- oproduct2.setProductQuantity(1);
- oproduct2.setSku("TB12346" );
- oproduct2.getPrices().add(oproductprice2 ) ;
-
- oproductprice2.setOrderProduct(oproduct2);
- order.getOrderProducts().add(oproduct2);
-
-
-
-
-
- //requires
- //OrderProduct
- //OrderProductPrice
- //OrderTotal
-
-
-
- //OrderTotal
- OrderTotal subtotal = new OrderTotal();
- subtotal.setModule("summary" );
- subtotal.setSortOrder(0);
- subtotal.setText("Summary" );
- subtotal.setTitle("Summary" );
- subtotal.setValue(new BigDecimal(19.99 ) );
- subtotal.setOrder(order);
-
- order.getOrderTotal().add(subtotal);
-
- OrderTotal tax = new OrderTotal();
- tax.setModule("tax" );
- tax.setSortOrder(1);
- tax.setText("Tax" );
- tax.setTitle("Tax" );
- tax.setValue(new BigDecimal(4) );
- tax.setOrder(order);
-
- order.getOrderTotal().add(tax);
-
- OrderTotal total = new OrderTotal();
- total.setModule("total" );
- total.setSortOrder(2);
- total.setText("Total" );
- total.setTitle("Total" );
- total.setValue(new BigDecimal(23.99) );
- total.setOrder(order);
-
- order.getOrderTotal().add(total);
-
- orderService.create(order);
- Assert.assertTrue(orderService.count() == 1);
-
- Locale locale = Locale.ENGLISH;
-
-
- order = orderService.getById(order.getId());
-
- /**
- * 2 Create an invoice
- */
- try {
- URL resource = getClass().getResource("/templates/invoice/invoice.ods");
- File file = new File(resource.toURI());
- //File file = new File("templates/invoice/invoice.ods");
-
- Sheet sheet = SpreadSheet.createFromFile(file).getSheet(0);
-
-
- //Store name
- sheet.setValueAt(store.getStorename(), 0, 0);
-
- store.setStoreaddress("2001 zoo avenue");
- store.setCurrencyFormatNational(true);//use $ instead of USD
-
-
- //Address
- //count store address cell
- int storeAddressCell = 2;
- //if(!StringUtils.isBlank(store.getStoreaddress())) {
- // sheet.setValueAt(store.getStoreaddress(), 0, storeAddressCell);
- // storeAddressCell ++;
- //}
-
- //3
- StringBuilder storeAddress = null;
- if(!StringUtils.isBlank(store.getStoreaddress())) {
- storeAddress = new StringBuilder();
- storeAddress.append(store.getStoreaddress());
- }
- if(!StringUtils.isBlank(store.getStorecity())) {
- if(storeAddress==null) {
- storeAddress = new StringBuilder();
- } else {
- storeAddress.append(", ");
- }
- storeAddress.append(store.getStorecity());
- }
- if(storeAddress!=null) {
- sheet.setValueAt(storeAddress.toString(), 0, storeAddressCell);
- storeAddressCell ++;
- }
-
- //4
- StringBuilder storeProvince = null;
- if(store.getZone()!=null) {
- storeProvince = new StringBuilder();
- List<Zone> zones = zoneService.getZones(store.getCountry(), en);
- for(Zone z : zones) {
- if(z.getCode().equals(store.getZone().getCode())) {
- storeProvince.append(store.getZone().getName());
- break;
- }
- }
-
- } else {
- if(!StringUtils.isBlank(store.getStorestateprovince())) {
- storeProvince = new StringBuilder();
- storeProvince.append(store.getStorestateprovince());
- }
- }
- if(store.getCountry()!=null) {
- if(storeProvince==null) {
- storeProvince = new StringBuilder();
- } else {
- storeProvince.append(", ");
- }
- Map<String,Country> countries = countryService.getCountriesMap(en);
- Country c = countries.get(store.getCountry().getIsoCode());
- if(c!=null) {
- storeProvince.append(c.getName());
- } else {
- storeProvince.append(store.getCountry().getIsoCode());
- }
-
- }
- if(storeProvince!=null) {
- sheet.setValueAt(storeProvince.toString(), 0, storeAddressCell);
- storeAddressCell ++;
- }
-
- //5
- if(!StringUtils.isBlank(store.getStorepostalcode())) {
- sheet.setValueAt(store.getStorepostalcode(), 0, storeAddressCell);
- storeAddressCell ++;
- }
-
- //6
- if(!StringUtils.isBlank(store.getStorephone())) {
- sheet.setValueAt(store.getStorephone(), 0, storeAddressCell);
- }
-
- //delete address blank lines
- for(int i = storeAddressCell; i<5; i++) {
- sheet.setValueAt("", 0, i);
- }
-
- //invoice date
- SimpleDateFormat format = new SimpleDateFormat(Constants.DEFAULT_DATE_FORMAT);
- sheet.setValueAt(format.format(order.getDatePurchased()), 3, 2);
-
- //invoice number
- sheet.setValueAt(order.getId(), 3, 3);
-
- //bill to
- //count bill to address cell
- int billToCell = 8;
- if(!StringUtils.isBlank(customer.getBilling().getFirstName())) {
- sheet.setValueAt(customer.getBilling().getFirstName() + " " + customer.getBilling().getLastName(), 0, billToCell);
- billToCell ++;
- }
-
- //9
- if(!StringUtils.isBlank(customer.getBilling().getCompany())) {
- sheet.setValueAt(customer.getBilling().getCompany(), 0, billToCell);
- billToCell ++;
- }
-
- //10
- StringBuilder billToAddress = null;
- if(!StringUtils.isBlank(customer.getBilling().getAddress())) {
- billToAddress = new StringBuilder();
- billToAddress.append(customer.getBilling().getAddress());
- }
- if(!StringUtils.isBlank(customer.getBilling().getCity())) {
- if(billToAddress==null) {
- billToAddress = new StringBuilder();
- } else {
- billToAddress.append(", ");
- }
- billToAddress.append(customer.getBilling().getCity());
- }
- if(billToAddress!=null) {
- sheet.setValueAt(billToAddress.toString(), 0, billToCell);
- billToCell ++;
- }
-
- //11
- StringBuilder billToProvince = null;
- if(customer.getBilling().getZone()!=null) {
- billToProvince = new StringBuilder();
- List<Zone> zones = zoneService.getZones(customer.getBilling().getCountry(), en);
- for(Zone z : zones) {
- if(z.getCode().equals(customer.getBilling().getZone().getCode())) {
- billToProvince.append(customer.getBilling().getZone().getName());
- break;
- }
- }
-
- } else {
- if(!StringUtils.isBlank(customer.getBilling().getState())) {
- billToProvince = new StringBuilder();
- billToProvince.append(customer.getBilling().getState());
- }
- }
- if(customer.getBilling().getCountry()!=null) {
- if(billToProvince==null) {
- billToProvince = new StringBuilder();
- } else {
- billToProvince.append(", ");
- }
- Map<String,Country> countries = countryService.getCountriesMap(en);
- Country c = countries.get(customer.getBilling().getCountry().getIsoCode());
- if(c!=null) {
- billToProvince.append(c.getName());
- } else {
- billToProvince.append(customer.getBilling().getCountry().getIsoCode());
- }
-
- }
- if(billToProvince!=null) {
- sheet.setValueAt(billToProvince.toString(), 0, billToCell);
- billToCell ++;
- }
-
- //12
- if(!StringUtils.isBlank(customer.getBilling().getPostalCode())) {
- sheet.setValueAt(customer.getBilling().getPostalCode(), 0, billToCell);
- billToCell ++;
- }
-
- //13
- if(!StringUtils.isBlank(customer.getBilling().getTelephone())) {
- sheet.setValueAt(customer.getBilling().getTelephone(), 0, billToCell);
- }
-
- //delete address blank lines
- for(int i = billToCell; i<13; i++) {
- sheet.setValueAt("", 0, i);
- }
-
- //products
- Set<OrderProduct> orderProducts = order.getOrderProducts();
- int productCell = 16;
- for(OrderProduct orderProduct : orderProducts) {
-
- //product name
- String pName = orderProduct.getProductName();
- Set<OrderProductAttribute> oAttributes = orderProduct.getOrderAttributes();
- StringBuilder attributeName = null;
- for(OrderProductAttribute oProductAttribute : oAttributes) {
- if(attributeName == null) {
- attributeName = new StringBuilder();
- attributeName.append("[");
- } else {
- attributeName.append(", ");
- }
- attributeName.append(oProductAttribute.getProductAttributeName())
- .append(": ")
- .append(oProductAttribute.getProductAttributeValueName());
-
- }
-
-
- StringBuilder productName = new StringBuilder();
- productName.append(pName);
-
- if(attributeName!=null) {
- attributeName.append("]");
- productName.append(" ").append(attributeName.toString());
- }
-
-
-
-
- sheet.setValueAt(productName.toString(), 0, productCell);
-
- int quantity = orderProduct.getProductQuantity();
- sheet.setValueAt(quantity, 1, productCell);
- String amount = priceUtil.getStoreFormatedAmountWithCurrency(store, orderProduct.getOneTimeCharge());
- sheet.setValueAt(amount, 2, productCell);
- String t = priceUtil.getStoreFormatedAmountWithCurrency(store, priceUtil.getOrderProductTotalPrice(store, orderProduct));
- sheet.setValueAt(t, 3, productCell);
-
- productCell++;
-
- }
-
- //print totals
- productCell++;
- Set<OrderTotal> totals = order.getOrderTotal();
- for(OrderTotal orderTotal : totals) {
-
- String totalName = orderTotal.getText();
- String totalValue = priceUtil.getStoreFormatedAmountWithCurrency(store,orderTotal.getValue());
- sheet.setValueAt(totalName, 2, productCell);
- sheet.setValueAt(totalValue, 3, productCell);
- productCell++;
- }
-
- //sheet.getCellAt(0, 0).setImage(arg0)
- //sheet.getCellAt(0, 0).setStyleName(arg0)
- //sheet.getCellAt(0, 0).getStyle().
-
-
-
- File outputFile = new File(order.getId() + "_invoice.ods");
- OOUtils.open(sheet.getSpreadSheet().saveAs(outputFile));
-
-
- final OpenDocument doc = new OpenDocument();
- doc.loadFrom(order.getId() + "_invoice.ods");
-
- // Open the PDF document
- Document document = new Document(PageSize.A4);
- File outFile = new File("invoice.pdf");
-
- PdfDocument pdf = new PdfDocument();
-
- document.addDocListener(pdf);
-
- FileOutputStream fileOutputStream = new FileOutputStream(outFile);
- PdfWriter writer = PdfWriter.getInstance(pdf, fileOutputStream);
- pdf.addWriter(writer);
-
- document.open();
-
- // Create a template and a Graphics2D object
- Rectangle pageSize = document.getPageSize();
- int w = (int) (pageSize.getWidth() * 0.9);
- int h = (int) (pageSize.getHeight() * 0.95);
- PdfContentByte cb = writer.getDirectContent();
- PdfTemplate tp = cb.createTemplate(w, h);
-
- Graphics2D g2 = tp.createPrinterGraphics(w, h, null);
- // If you want to prevent copy/paste, you can use
- // g2 = tp.createGraphicsShapes(w, h, true, 0.9f);
-
- tp.setWidth(w);
- tp.setHeight(h);
-
- // Configure the renderer
- ODTRenderer renderer = new ODTRenderer(doc);
- renderer.setIgnoreMargins(true);
- renderer.setPaintMaxResolution(true);
-
- // Scale the renderer to fit width
- renderer.setResizeFactor(renderer.getPrintWidth() / w);
- // Render
- renderer.paintComponent(g2);
- g2.dispose();
-
- // Add our spreadsheet in the middle of the page
- float offsetX = (pageSize.getWidth() - w) / 2;
- float offsetY = (pageSize.getHeight() - h) / 2;
- cb.addTemplate(tp, offsetX, offsetY);
- // Close the PDF document
- document.close();
-
- outputFile.delete();//remove temp file
-
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
-
- }
-
-
-
+package com.salesmanager.test.order;
+
+import java.awt.Graphics2D;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.math.BigDecimal;
+import java.net.URL;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+import javax.inject.Inject;
+
+import org.apache.commons.lang3.StringUtils;
+import org.jopendocument.dom.OOUtils;
+import org.jopendocument.dom.spreadsheet.Sheet;
+import org.jopendocument.dom.spreadsheet.SpreadSheet;
+import org.jopendocument.model.OpenDocument;
+import org.jopendocument.renderer.ODTRenderer;
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import com.itextpdf.text.Document;
+import com.itextpdf.text.PageSize;
+import com.itextpdf.text.Rectangle;
+import com.itextpdf.text.pdf.PdfContentByte;
+import com.itextpdf.text.pdf.PdfDocument;
+import com.itextpdf.text.pdf.PdfTemplate;
+import com.itextpdf.text.pdf.PdfWriter;
+import com.salesmanager.core.business.constants.Constants;
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.utils.ProductPriceUtils;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
+import com.salesmanager.core.model.catalog.product.attribute.ProductOption;
+import com.salesmanager.core.model.catalog.product.attribute.ProductOptionDescription;
+import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValue;
+import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValueDescription;
+import com.salesmanager.core.model.catalog.product.availability.ProductAvailability;
+import com.salesmanager.core.model.catalog.product.description.ProductDescription;
+import com.salesmanager.core.model.catalog.product.price.ProductPrice;
+import com.salesmanager.core.model.catalog.product.price.ProductPriceDescription;
+import com.salesmanager.core.model.catalog.product.type.ProductType;
+import com.salesmanager.core.model.common.Billing;
+import com.salesmanager.core.model.common.Delivery;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.customer.CustomerGender;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.order.OrderTotal;
+import com.salesmanager.core.model.order.orderproduct.OrderProduct;
+import com.salesmanager.core.model.order.orderproduct.OrderProductAttribute;
+import com.salesmanager.core.model.order.orderproduct.OrderProductDownload;
+import com.salesmanager.core.model.order.orderproduct.OrderProductPrice;
+import com.salesmanager.core.model.order.orderstatus.OrderStatus;
+import com.salesmanager.core.model.order.orderstatus.OrderStatusHistory;
+import com.salesmanager.core.model.payments.PaymentType;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.currency.Currency;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.reference.zone.Zone;
+
+
+/**
+ * This test has to be completed
+ * @author c.samson
+ *
+ */
+@Ignore
+public class InvoiceTest extends com.salesmanager.test.common.AbstractSalesManagerCoreTestCase {
+
+ @Inject
+ ProductPriceUtils priceUtil;
+
+ //@Test
+ @Ignore
+ public void createInvoice() throws ServiceException {
+
+
+ MerchantStore store = merchantService.getByCode(MerchantStore.DEFAULT_STORE);
+
+ //create a product
+ ProductType generalType = productTypeService.getProductType(ProductType.GENERAL_TYPE);
+
+ Language en = languageService.getByCode("en");
+
+
+ /**
+ * 1) Create an order
+ *
+ */
+
+ //1.1 create a product
+
+ //create an option
+ ProductOption color = new ProductOption();
+ color.setMerchantStore(store);
+ color.setCode("color");
+ color.setProductOptionType("SELECT");
+
+ ProductOptionDescription colorDescription = new ProductOptionDescription();
+ colorDescription.setDescription("Color");
+ colorDescription.setName("Color");
+ colorDescription.setLanguage(en);
+ colorDescription.setProductOption(color);
+
+ Set<ProductOptionDescription> colorDescriptions = new HashSet<ProductOptionDescription>();
+ colorDescriptions.add(colorDescription);
+
+ color.setDescriptions(colorDescriptions);
+
+ productOptionService.create(color);
+
+ //create an option value
+ ProductOptionValue red = new ProductOptionValue();
+ red.setMerchantStore(store);
+ red.setCode("red");
+
+ ProductOptionValueDescription redDescription = new ProductOptionValueDescription();
+ redDescription.setDescription("Red");
+ redDescription.setLanguage(en);
+ redDescription.setName("Red");
+ redDescription.setProductOptionValue(red);
+
+ Set<ProductOptionValueDescription> redDescriptions = new HashSet<ProductOptionValueDescription>();
+ redDescriptions.add(redDescription);
+
+ red.setDescriptions(redDescriptions);
+
+ productOptionValueService.create(red);
+
+ //create a product
+ Product product = new Product();
+ product.setProductHeight(new BigDecimal(4));
+ product.setProductLength(new BigDecimal(3));
+ product.setProductWidth(new BigDecimal(5));
+ product.setProductWeight(new BigDecimal(8));
+ product.setSku("TESTSKU");
+ product.setType(generalType);
+ product.setMerchantStore(store);
+
+ // Product description
+ ProductDescription description = new ProductDescription();
+ description.setName("Product 1");
+ description.setLanguage(en);
+ description.setProduct(product);
+
+ product.getDescriptions().add(description);
+
+
+ // Availability
+ ProductAvailability availability = new ProductAvailability();
+ availability.setProductDateAvailable(new Date());
+ availability.setProductQuantity(100);
+ availability.setRegion("*");
+ availability.setProduct(product);// associate with product
+
+ product.getAvailabilities().add(availability);
+
+ //price
+ ProductPrice dprice = new ProductPrice();
+ dprice.setDefaultPrice(true);
+ dprice.setProductPriceAmount(new BigDecimal(29.99));
+ dprice.setProductAvailability(availability);
+
+ ProductPriceDescription dpd = new ProductPriceDescription();
+ dpd.setName("Base price");
+ dpd.setProductPrice(dprice);
+ dpd.setLanguage(en);
+
+ dprice.getDescriptions().add(dpd);
+
+
+ //create an attribute
+ ProductAttribute colorAttribute = new ProductAttribute();
+ colorAttribute.setProduct(product);
+ colorAttribute.setProductAttributePrice(new BigDecimal(5));
+ colorAttribute.setProductOption(color);
+ colorAttribute.setProductOptionValue(red);
+
+
+ product.getAttributes().add(colorAttribute);
+
+ productService.create(product);
+
+
+ //1.2 create a Customer
+ Country country = countryService.getByCode("CA");
+ Zone zone = zoneService.getByCode("QC");
+
+ Customer customer = new Customer();
+ customer.setMerchantStore(store);
+ customer.setEmailAddress("test@test.com");
+ customer.setGender(CustomerGender.M);
+ customer.setAnonymous(true);
+ customer.setCompany("ifactory");
+ customer.setDateOfBirth(new Date());
+ customer.setNick("My nick");
+ customer.setDefaultLanguage(en);
+
+
+ Delivery delivery = new Delivery();
+ delivery.setAddress("358 Du Languadoc");
+ delivery.setCity( "Boucherville" );
+ delivery.setCountry(country);
+// delivery.setCountryCode(CA_COUNTRY_CODE);
+ delivery.setFirstName("First" );
+ delivery.setLastName("Last" );
+ delivery.setPostalCode("J4B-8J9" );
+ delivery.setZone(zone);
+
+ Billing billing = new Billing();
+ billing.setAddress("358 Du Languadoc");
+ billing.setCity("Boucherville");
+ billing.setCompany("CSTI Consulting");
+ billing.setCountry(country);
+// billing.setCountryCode(CA_COUNTRY_CODE);
+ billing.setFirstName("Carl" );
+ billing.setLastName("Samson" );
+ billing.setPostalCode("J4B-8J9");
+ billing.setZone(zone);
+
+ customer.setBilling(billing);
+ customer.setDelivery(delivery);
+ customerService.create(customer);
+
+ Currency currency = currencyService.getByCode(CAD_CURRENCY_CODE);
+
+ //1.3 create an order
+ OrderStatusHistory orderStatusHistory = new OrderStatusHistory();
+
+
+ Order order = new Order();
+ order.setDatePurchased(new Date());
+ order.setCurrency(currency);
+ order.setLastModified(new Date());
+ order.setBilling(billing);
+
+ Locale l = Locale.CANADA;
+ order.setLocale(l);
+
+
+ order.setCurrencyValue(new BigDecimal(0.98));//compared to based currency (not necessary)
+ order.setCustomerId(customer.getId());
+ order.setDelivery(delivery);
+ order.setIpAddress("ipAddress" );
+ order.setMerchant(store);
+ order.setCustomerEmailAddress(customer.getEmailAddress());
+ order.setOrderDateFinished(new Date());//committed date
+
+ orderStatusHistory.setComments("We received your order");
+ orderStatusHistory.setCustomerNotified(1);
+ orderStatusHistory.setStatus(OrderStatus.ORDERED);
+ orderStatusHistory.setDateAdded(new Date() );
+ orderStatusHistory.setOrder(order);
+ order.getOrderHistory().add( orderStatusHistory );
+
+
+ order.setPaymentType(PaymentType.PAYPAL);
+ order.setPaymentModuleCode("paypal");
+ order.setStatus( OrderStatus.DELIVERED);
+ order.setTotal(new BigDecimal(23.99));
+
+
+ //OrderProductDownload - Digital download
+ OrderProductDownload orderProductDownload = new OrderProductDownload();
+ orderProductDownload.setDownloadCount(1);
+ orderProductDownload.setMaxdays(31);
+ orderProductDownload.setOrderProductFilename("Your digital file name");
+
+ //OrderProductPrice
+ OrderProductPrice oproductprice = new OrderProductPrice();
+ oproductprice.setDefaultPrice(true);
+ oproductprice.setProductPrice(new BigDecimal(19.99) );
+ oproductprice.setProductPriceCode("baseprice" );
+ oproductprice.setProductPriceName("Base Price" );
+
+ //OrderProduct
+ OrderProduct oproduct = new OrderProduct();
+ oproduct.getDownloads().add( orderProductDownload);
+ oproduct.setOneTimeCharge( new BigDecimal(19.99) );
+ oproduct.setOrder(order);
+ oproduct.setProductName( "Product name" );
+ oproduct.setProductQuantity(2);
+ oproduct.setSku("TB12345" );
+ oproduct.getPrices().add(oproductprice ) ;
+
+
+ //an attribute to the OrderProduct
+ OrderProductAttribute orderAttribute = new OrderProductAttribute();
+ orderAttribute.setOrderProduct(oproduct);
+ orderAttribute.setProductAttributeName(colorDescription.getName());
+ orderAttribute.setProductAttributeValueName(redDescription.getName());
+ orderAttribute.setProductOptionId(color.getId());
+ orderAttribute.setProductOptionValueId(red.getId());
+ orderAttribute.setProductAttributePrice(colorAttribute.getProductAttributePrice());
+
+ Set<OrderProductAttribute> orderAttributes = new HashSet<OrderProductAttribute>();
+ orderAttributes.add(orderAttribute);
+
+ oproduct.setOrderAttributes(orderAttributes);
+
+ oproductprice.setOrderProduct(oproduct);
+ orderProductDownload.setOrderProduct(oproduct);
+ order.getOrderProducts().add(oproduct);
+
+
+ //product #2
+ OrderProductPrice oproductprice2 = new OrderProductPrice();
+ oproductprice2.setDefaultPrice(true);
+ oproductprice2.setProductPrice(new BigDecimal(9.99) );
+ oproductprice2.setProductPriceCode("baseprice" );
+ oproductprice2.setProductPriceName("Base Price" );
+
+ //OrderProduct
+ OrderProduct oproduct2 = new OrderProduct();
+ oproduct2.setOneTimeCharge( new BigDecimal(9.99) );
+ oproduct2.setOrder(order);
+ oproduct2.setProductName( "Additional item name" );
+ oproduct2.setProductQuantity(1);
+ oproduct2.setSku("TB12346" );
+ oproduct2.getPrices().add(oproductprice2 ) ;
+
+ oproductprice2.setOrderProduct(oproduct2);
+ order.getOrderProducts().add(oproduct2);
+
+
+
+
+
+ //requires
+ //OrderProduct
+ //OrderProductPrice
+ //OrderTotal
+
+
+
+ //OrderTotal
+ OrderTotal subtotal = new OrderTotal();
+ subtotal.setModule("summary" );
+ subtotal.setSortOrder(0);
+ subtotal.setText("Summary" );
+ subtotal.setTitle("Summary" );
+ subtotal.setValue(new BigDecimal(19.99 ) );
+ subtotal.setOrder(order);
+
+ order.getOrderTotal().add(subtotal);
+
+ OrderTotal tax = new OrderTotal();
+ tax.setModule("tax" );
+ tax.setSortOrder(1);
+ tax.setText("Tax" );
+ tax.setTitle("Tax" );
+ tax.setValue(new BigDecimal(4) );
+ tax.setOrder(order);
+
+ order.getOrderTotal().add(tax);
+
+ OrderTotal total = new OrderTotal();
+ total.setModule("total" );
+ total.setSortOrder(2);
+ total.setText("Total" );
+ total.setTitle("Total" );
+ total.setValue(new BigDecimal(23.99) );
+ total.setOrder(order);
+
+ order.getOrderTotal().add(total);
+
+ orderService.create(order);
+ Assert.assertTrue(orderService.count() == 1);
+
+ Locale locale = Locale.ENGLISH;
+
+
+ order = orderService.getById(order.getId());
+
+ /**
+ * 2 Create an invoice
+ */
+ try {
+ URL resource = getClass().getResource("/templates/invoice/invoice.ods");
+ File file = new File(resource.toURI());
+ //File file = new File("templates/invoice/invoice.ods");
+
+ Sheet sheet = SpreadSheet.createFromFile(file).getSheet(0);
+
+
+ //Store name
+ sheet.setValueAt(store.getStorename(), 0, 0);
+
+ store.setStoreaddress("2001 zoo avenue");
+ store.setCurrencyFormatNational(true);//use $ instead of USD
+
+
+ //Address
+ //count store address cell
+ int storeAddressCell = 2;
+ //if(!StringUtils.isBlank(store.getStoreaddress())) {
+ // sheet.setValueAt(store.getStoreaddress(), 0, storeAddressCell);
+ // storeAddressCell ++;
+ //}
+
+ //3
+ StringBuilder storeAddress = null;
+ if(!StringUtils.isBlank(store.getStoreaddress())) {
+ storeAddress = new StringBuilder();
+ storeAddress.append(store.getStoreaddress());
+ }
+ if(!StringUtils.isBlank(store.getStorecity())) {
+ if(storeAddress==null) {
+ storeAddress = new StringBuilder();
+ } else {
+ storeAddress.append(", ");
+ }
+ storeAddress.append(store.getStorecity());
+ }
+ if(storeAddress!=null) {
+ sheet.setValueAt(storeAddress.toString(), 0, storeAddressCell);
+ storeAddressCell ++;
+ }
+
+ //4
+ StringBuilder storeProvince = null;
+ if(store.getZone()!=null) {
+ storeProvince = new StringBuilder();
+ List<Zone> zones = zoneService.getZones(store.getCountry(), en);
+ for(Zone z : zones) {
+ if(z.getCode().equals(store.getZone().getCode())) {
+ storeProvince.append(store.getZone().getName());
+ break;
+ }
+ }
+
+ } else {
+ if(!StringUtils.isBlank(store.getStorestateprovince())) {
+ storeProvince = new StringBuilder();
+ storeProvince.append(store.getStorestateprovince());
+ }
+ }
+ if(store.getCountry()!=null) {
+ if(storeProvince==null) {
+ storeProvince = new StringBuilder();
+ } else {
+ storeProvince.append(", ");
+ }
+ Map<String,Country> countries = countryService.getCountriesMap(en);
+ Country c = countries.get(store.getCountry().getIsoCode());
+ if(c!=null) {
+ storeProvince.append(c.getName());
+ } else {
+ storeProvince.append(store.getCountry().getIsoCode());
+ }
+
+ }
+ if(storeProvince!=null) {
+ sheet.setValueAt(storeProvince.toString(), 0, storeAddressCell);
+ storeAddressCell ++;
+ }
+
+ //5
+ if(!StringUtils.isBlank(store.getStorepostalcode())) {
+ sheet.setValueAt(store.getStorepostalcode(), 0, storeAddressCell);
+ storeAddressCell ++;
+ }
+
+ //6
+ if(!StringUtils.isBlank(store.getStorephone())) {
+ sheet.setValueAt(store.getStorephone(), 0, storeAddressCell);
+ }
+
+ //delete address blank lines
+ for(int i = storeAddressCell; i<5; i++) {
+ sheet.setValueAt("", 0, i);
+ }
+
+ //invoice date
+ SimpleDateFormat format = new SimpleDateFormat(Constants.DEFAULT_DATE_FORMAT);
+ sheet.setValueAt(format.format(order.getDatePurchased()), 3, 2);
+
+ //invoice number
+ sheet.setValueAt(order.getId(), 3, 3);
+
+ //bill to
+ //count bill to address cell
+ int billToCell = 8;
+ if(!StringUtils.isBlank(customer.getBilling().getFirstName())) {
+ sheet.setValueAt(customer.getBilling().getFirstName() + " " + customer.getBilling().getLastName(), 0, billToCell);
+ billToCell ++;
+ }
+
+ //9
+ if(!StringUtils.isBlank(customer.getBilling().getCompany())) {
+ sheet.setValueAt(customer.getBilling().getCompany(), 0, billToCell);
+ billToCell ++;
+ }
+
+ //10
+ StringBuilder billToAddress = null;
+ if(!StringUtils.isBlank(customer.getBilling().getAddress())) {
+ billToAddress = new StringBuilder();
+ billToAddress.append(customer.getBilling().getAddress());
+ }
+ if(!StringUtils.isBlank(customer.getBilling().getCity())) {
+ if(billToAddress==null) {
+ billToAddress = new StringBuilder();
+ } else {
+ billToAddress.append(", ");
+ }
+ billToAddress.append(customer.getBilling().getCity());
+ }
+ if(billToAddress!=null) {
+ sheet.setValueAt(billToAddress.toString(), 0, billToCell);
+ billToCell ++;
+ }
+
+ //11
+ StringBuilder billToProvince = null;
+ if(customer.getBilling().getZone()!=null) {
+ billToProvince = new StringBuilder();
+ List<Zone> zones = zoneService.getZones(customer.getBilling().getCountry(), en);
+ for(Zone z : zones) {
+ if(z.getCode().equals(customer.getBilling().getZone().getCode())) {
+ billToProvince.append(customer.getBilling().getZone().getName());
+ break;
+ }
+ }
+
+ } else {
+ if(!StringUtils.isBlank(customer.getBilling().getState())) {
+ billToProvince = new StringBuilder();
+ billToProvince.append(customer.getBilling().getState());
+ }
+ }
+ if(customer.getBilling().getCountry()!=null) {
+ if(billToProvince==null) {
+ billToProvince = new StringBuilder();
+ } else {
+ billToProvince.append(", ");
+ }
+ Map<String,Country> countries = countryService.getCountriesMap(en);
+ Country c = countries.get(customer.getBilling().getCountry().getIsoCode());
+ if(c!=null) {
+ billToProvince.append(c.getName());
+ } else {
+ billToProvince.append(customer.getBilling().getCountry().getIsoCode());
+ }
+
+ }
+ if(billToProvince!=null) {
+ sheet.setValueAt(billToProvince.toString(), 0, billToCell);
+ billToCell ++;
+ }
+
+ //12
+ if(!StringUtils.isBlank(customer.getBilling().getPostalCode())) {
+ sheet.setValueAt(customer.getBilling().getPostalCode(), 0, billToCell);
+ billToCell ++;
+ }
+
+ //13
+ if(!StringUtils.isBlank(customer.getBilling().getTelephone())) {
+ sheet.setValueAt(customer.getBilling().getTelephone(), 0, billToCell);
+ }
+
+ //delete address blank lines
+ for(int i = billToCell; i<13; i++) {
+ sheet.setValueAt("", 0, i);
+ }
+
+ //products
+ Set<OrderProduct> orderProducts = order.getOrderProducts();
+ int productCell = 16;
+ for(OrderProduct orderProduct : orderProducts) {
+
+ //product name
+ String pName = orderProduct.getProductName();
+ Set<OrderProductAttribute> oAttributes = orderProduct.getOrderAttributes();
+ StringBuilder attributeName = null;
+ for(OrderProductAttribute oProductAttribute : oAttributes) {
+ if(attributeName == null) {
+ attributeName = new StringBuilder();
+ attributeName.append("[");
+ } else {
+ attributeName.append(", ");
+ }
+ attributeName.append(oProductAttribute.getProductAttributeName())
+ .append(": ")
+ .append(oProductAttribute.getProductAttributeValueName());
+
+ }
+
+
+ StringBuilder productName = new StringBuilder();
+ productName.append(pName);
+
+ if(attributeName!=null) {
+ attributeName.append("]");
+ productName.append(" ").append(attributeName.toString());
+ }
+
+
+
+
+ sheet.setValueAt(productName.toString(), 0, productCell);
+
+ int quantity = orderProduct.getProductQuantity();
+ sheet.setValueAt(quantity, 1, productCell);
+ String amount = priceUtil.getStoreFormatedAmountWithCurrency(store, orderProduct.getOneTimeCharge());
+ sheet.setValueAt(amount, 2, productCell);
+ String t = priceUtil.getStoreFormatedAmountWithCurrency(store, priceUtil.getOrderProductTotalPrice(store, orderProduct));
+ sheet.setValueAt(t, 3, productCell);
+
+ productCell++;
+
+ }
+
+ //print totals
+ productCell++;
+ Set<OrderTotal> totals = order.getOrderTotal();
+ for(OrderTotal orderTotal : totals) {
+
+ String totalName = orderTotal.getText();
+ String totalValue = priceUtil.getStoreFormatedAmountWithCurrency(store,orderTotal.getValue());
+ sheet.setValueAt(totalName, 2, productCell);
+ sheet.setValueAt(totalValue, 3, productCell);
+ productCell++;
+ }
+
+ //sheet.getCellAt(0, 0).setImage(arg0)
+ //sheet.getCellAt(0, 0).setStyleName(arg0)
+ //sheet.getCellAt(0, 0).getStyle().
+
+
+
+ File outputFile = new File(order.getId() + "_invoice.ods");
+ OOUtils.open(sheet.getSpreadSheet().saveAs(outputFile));
+
+
+ final OpenDocument doc = new OpenDocument();
+ doc.loadFrom(order.getId() + "_invoice.ods");
+
+ // Open the PDF document
+ Document document = new Document(PageSize.A4);
+ File outFile = new File("invoice.pdf");
+
+ PdfDocument pdf = new PdfDocument();
+
+ document.addDocListener(pdf);
+
+ FileOutputStream fileOutputStream = new FileOutputStream(outFile);
+ PdfWriter writer = PdfWriter.getInstance(pdf, fileOutputStream);
+ pdf.addWriter(writer);
+
+ document.open();
+
+ // Create a template and a Graphics2D object
+ Rectangle pageSize = document.getPageSize();
+ int w = (int) (pageSize.getWidth() * 0.9);
+ int h = (int) (pageSize.getHeight() * 0.95);
+ PdfContentByte cb = writer.getDirectContent();
+ PdfTemplate tp = cb.createTemplate(w, h);
+
+ Graphics2D g2 = tp.createPrinterGraphics(w, h, null);
+ // If you want to prevent copy/paste, you can use
+ // g2 = tp.createGraphicsShapes(w, h, true, 0.9f);
+
+ tp.setWidth(w);
+ tp.setHeight(h);
+
+ // Configure the renderer
+ ODTRenderer renderer = new ODTRenderer(doc);
+ renderer.setIgnoreMargins(true);
+ renderer.setPaintMaxResolution(true);
+
+ // Scale the renderer to fit width
+ renderer.setResizeFactor(renderer.getPrintWidth() / w);
+ // Render
+ renderer.paintComponent(g2);
+ g2.dispose();
+
+ // Add our spreadsheet in the middle of the page
+ float offsetX = (pageSize.getWidth() - w) / 2;
+ float offsetY = (pageSize.getHeight() - h) / 2;
+ cb.addTemplate(tp, offsetX, offsetY);
+ // Close the PDF document
+ document.close();
+
+ outputFile.delete();//remove temp file
+
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+
+ }
+
+
+
}
\ No newline at end of file
diff --git a/sm-core/src/test/java/com/salesmanager/test/order/OrderTest.java b/sm-core/src/test/java/com/salesmanager/test/order/OrderTest.java
index c411dec..c9ce5e0 100644
--- a/sm-core/src/test/java/com/salesmanager/test/order/OrderTest.java
+++ b/sm-core/src/test/java/com/salesmanager/test/order/OrderTest.java
@@ -1,402 +1,402 @@
-package com.salesmanager.test.order;
-
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import org.junit.Assert;
-import org.junit.Ignore;
-import org.junit.Test;
-
-import com.salesmanager.core.business.constants.Constants;
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.model.catalog.category.Category;
-import com.salesmanager.core.model.catalog.category.CategoryDescription;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
-import com.salesmanager.core.model.catalog.product.attribute.ProductOption;
-import com.salesmanager.core.model.catalog.product.attribute.ProductOptionDescription;
-import com.salesmanager.core.model.catalog.product.attribute.ProductOptionType;
-import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValue;
-import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValueDescription;
-import com.salesmanager.core.model.catalog.product.availability.ProductAvailability;
-import com.salesmanager.core.model.catalog.product.description.ProductDescription;
-import com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer;
-import com.salesmanager.core.model.catalog.product.manufacturer.ManufacturerDescription;
-import com.salesmanager.core.model.catalog.product.price.ProductPrice;
-import com.salesmanager.core.model.catalog.product.price.ProductPriceDescription;
-import com.salesmanager.core.model.catalog.product.price.ProductPriceType;
-import com.salesmanager.core.model.catalog.product.type.ProductType;
-import com.salesmanager.core.model.common.Billing;
-import com.salesmanager.core.model.common.Delivery;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.customer.CustomerGender;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.Order;
-import com.salesmanager.core.model.order.OrderCriteria;
-import com.salesmanager.core.model.order.OrderList;
-import com.salesmanager.core.model.order.OrderTotal;
-import com.salesmanager.core.model.order.orderproduct.OrderProduct;
-import com.salesmanager.core.model.order.orderproduct.OrderProductAttribute;
-import com.salesmanager.core.model.order.orderproduct.OrderProductPrice;
-import com.salesmanager.core.model.order.orderstatus.OrderStatus;
-import com.salesmanager.core.model.order.orderstatus.OrderStatusHistory;
-import com.salesmanager.core.model.order.payment.CreditCard;
-import com.salesmanager.core.model.payments.CreditCardType;
-import com.salesmanager.core.model.payments.PaymentType;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.currency.Currency;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.reference.zone.Zone;
-
-
-@Ignore
-public class OrderTest extends com.salesmanager.test.common.AbstractSalesManagerCoreTestCase {
-
-
-
-
- @Test
- public void getMerchantOrders() throws ServiceException {
-
-
-
- Currency currency = currencyService.getByCode(USD_CURRENCY_CODE);
- Country country = countryService.getByCode("US");
- Zone zone = zoneService.getByCode("VT");
- Language en = languageService.getByCode("en");
-
- MerchantStore merchant = merchantService.getByCode( MerchantStore.DEFAULT_STORE );
-
- /** Create a customer **/
- Customer customer = new Customer();
- customer.setMerchantStore(merchant);
- customer.setDefaultLanguage(en);
- customer.setEmailAddress("email@email.com");
- customer.setPassword("-1999");
- customer.setNick("My New nick");
- customer.setCompany(" Apple");
- customer.setGender(CustomerGender.M);
- customer.setDateOfBirth(new Date());
-
- Billing billing = new Billing();
- billing.setAddress("Billing address");
- billing.setCity("Billing city");
- billing.setCompany("Billing company");
- billing.setCountry(country);
- billing.setFirstName("Carl");
- billing.setLastName("Samson");
- billing.setPostalCode("Billing postal code");
- billing.setState("Billing state");
- billing.setZone(zone);
-
- Delivery delivery = new Delivery();
- delivery.setAddress("Shipping address");
- delivery.setCountry(country);
- delivery.setZone(zone);
-
- customer.setBilling(billing);
- customer.setDelivery(delivery);
-
- customerService.create(customer);
-
-
- //create a product with attributes
-
- /** CATALOG CREATION **/
-
- ProductType generalType = productTypeService.getProductType(ProductType.GENERAL_TYPE);
-
- /**
- * Create the category
- */
- Category shirts = new Category();
- shirts.setMerchantStore(merchant);
- shirts.setCode("shirts");
-
- CategoryDescription shirtsEnglishDescription = new CategoryDescription();
- shirtsEnglishDescription.setName("Shirts");
- shirtsEnglishDescription.setCategory(shirts);
- shirtsEnglishDescription.setLanguage(en);
-
- List<CategoryDescription> descriptions = new ArrayList<CategoryDescription>();
- descriptions.add(shirtsEnglishDescription);
-
-
- shirts.setDescriptions(descriptions);
- categoryService.create(shirts);
-
-
- /**
- * Create a manufacturer
- */
- Manufacturer addidas = new Manufacturer();
- addidas.setMerchantStore(merchant);
- addidas.setCode("addidas");
-
- ManufacturerDescription addidasDesc = new ManufacturerDescription();
- addidasDesc.setLanguage(en);
- addidasDesc.setManufacturer(addidas);
- addidasDesc.setName("Addidas");
- addidas.getDescriptions().add(addidasDesc);
-
- manufacturerService.create(addidas);
-
- /**
- * Create an option
- */
- ProductOption option = new ProductOption();
- option.setMerchantStore(merchant);
- option.setCode("color");
- option.setProductOptionType(ProductOptionType.Radio.name());
-
- ProductOptionDescription optionDescription = new ProductOptionDescription();
- optionDescription.setLanguage(en);
- optionDescription.setName("Color");
- optionDescription.setDescription("Item color");
- optionDescription.setProductOption(option);
-
- option.getDescriptions().add(optionDescription);
-
- productOptionService.saveOrUpdate(option);
-
-
- /** first option value **/
- ProductOptionValue white = new ProductOptionValue();
- white.setMerchantStore(merchant);
- white.setCode("white");
-
- ProductOptionValueDescription whiteDescription = new ProductOptionValueDescription();
- whiteDescription.setLanguage(en);
- whiteDescription.setName("White");
- whiteDescription.setDescription("White color");
- whiteDescription.setProductOptionValue(white);
-
- white.getDescriptions().add(whiteDescription);
-
- productOptionValueService.saveOrUpdate(white);
-
-
- ProductOptionValue black = new ProductOptionValue();
- black.setMerchantStore(merchant);
- black.setCode("black");
-
- /** second option value **/
- ProductOptionValueDescription blackDesc = new ProductOptionValueDescription();
- blackDesc.setLanguage(en);
- blackDesc.setName("Black");
- blackDesc.setDescription("Black color");
- blackDesc.setProductOptionValue(black);
-
- black.getDescriptions().add(blackDesc);
-
- productOptionValueService.saveOrUpdate(black);
-
-
- /**
- * Create a complex product
- */
- Product product = new Product();
- product.setProductHeight(new BigDecimal(4));
- product.setProductLength(new BigDecimal(3));
- product.setProductWidth(new BigDecimal(1));
- product.setSku("TB12345");
- product.setManufacturer(addidas);
- product.setType(generalType);
- product.setMerchantStore(merchant);
-
- // Product description
- ProductDescription description = new ProductDescription();
- description.setName("Short sleeves shirt");
- description.setLanguage(en);
- description.setProduct(product);
-
- product.getDescriptions().add(description);
- product.getCategories().add(shirts);
-
-
- //availability
- ProductAvailability availability = new ProductAvailability();
- availability.setProductDateAvailable(new Date());
- availability.setProductQuantity(100);
- availability.setRegion("*");
- availability.setProduct(product);// associate with product
-
- //price
- ProductPrice dprice = new ProductPrice();
- dprice.setDefaultPrice(true);
- dprice.setProductPriceAmount(new BigDecimal(29.99));
- dprice.setProductAvailability(availability);
-
-
-
- ProductPriceDescription dpd = new ProductPriceDescription();
- dpd.setName("Base price");
- dpd.setProductPrice(dprice);
- dpd.setLanguage(en);
-
- dprice.getDescriptions().add(dpd);
- availability.getPrices().add(dprice);
- product.getAvailabilities().add(availability);
-
-
- //attributes
- //white
- ProductAttribute whiteAttribute = new ProductAttribute();
- whiteAttribute.setProduct(product);
- whiteAttribute.setProductOption(option);
- whiteAttribute.setAttributeDefault(true);
- whiteAttribute.setProductAttributePrice(new BigDecimal(0));//no price variation
- whiteAttribute.setProductAttributeWeight(new BigDecimal(0));//no weight variation
- whiteAttribute.setProductOption(option);
- whiteAttribute.setProductOptionValue(white);
-
- product.getAttributes().add(whiteAttribute);
- //black
- ProductAttribute blackAttribute = new ProductAttribute();
- blackAttribute.setProduct(product);
- blackAttribute.setProductOption(option);
- blackAttribute.setProductAttributePrice(new BigDecimal(5));//5 + dollars
- blackAttribute.setProductAttributeWeight(new BigDecimal(0));//no weight variation
- blackAttribute.setProductOption(option);
- blackAttribute.setProductOptionValue(black);
-
- product.getAttributes().add(blackAttribute);
-
- productService.create(product);
-
-
-
-
- /** Create an order **/
- Order order = new Order();
-
-
-
- /** payment details **/
- CreditCard creditCard = new CreditCard();
- creditCard.setCardType(CreditCardType.VISA);
-
- creditCard.setCcCvv("123");
- creditCard.setCcExpires("12/30/2020" );
- creditCard.setCcNumber( "123456789");
- creditCard.setCcOwner("ccOwner" );
- order.setCreditCard(creditCard);
-
- /** order core attributes **/
- order.setDatePurchased(new Date());
- order.setCurrency(currency);
- order.setMerchant(merchant);
- order.setLastModified(new Date());
- order.setCurrencyValue(new BigDecimal(1));//no price variation because of the currency
- order.setCustomerId(new Long(1) );
- order.setDelivery(delivery);
- order.setIpAddress("ipAddress" );
- order.setMerchant(merchant);
- order.setOrderDateFinished(new Date());
-
- order.setPaymentType(PaymentType.CREDITCARD);
- order.setPaymentModuleCode("payment Module Code");
- order.setShippingModuleCode("UPS" );
- order.setStatus( OrderStatus.ORDERED);
- order.setCustomerAgreement(true);
- order.setConfirmedAddress(true);
- order.setTotal(dprice.getProductPriceAmount());
- order.setCustomerEmailAddress(customer.getEmailAddress());
-
- order.setBilling(billing);
- order.setDelivery(delivery);
-
-
- /** ORDER PRODUCT **/
-
- //OrderProduct
- OrderProduct oproduct = new OrderProduct();
- oproduct.setDownloads(null);
- oproduct.setOneTimeCharge(dprice.getProductPriceAmount());
- oproduct.setOrder(order);
- oproduct.setProductName( description.getName() );
- oproduct.setProductQuantity(1);
- oproduct.setSku(product.getSku());
-
- //set order product price
- OrderProductPrice orderProductPrice = new OrderProductPrice();
- orderProductPrice.setDefaultPrice(true);//default price (same as default product price)
- orderProductPrice.setOrderProduct(oproduct);
- orderProductPrice.setProductPrice(dprice.getProductPriceAmount());
- orderProductPrice.setProductPriceCode(ProductPriceType.ONE_TIME.name());
-
-
- oproduct.getPrices().add(orderProductPrice);
-
- //order product attribute
-
- OrderProductAttribute orderProductAttribute = new OrderProductAttribute();
- orderProductAttribute.setOrderProduct(oproduct);
- orderProductAttribute.setProductAttributePrice(new BigDecimal("0.00"));//no extra charge
- orderProductAttribute.setProductAttributeName(whiteDescription.getName());
- orderProductAttribute.setProductOptionId(option.getId());
- orderProductAttribute.setProductOptionValueId(white.getId());
-
- oproduct.getOrderAttributes().add(orderProductAttribute);
-
- order.getOrderProducts().add(oproduct);
-
- /** ORDER TOTAL **/
-
- OrderTotal subTotal = new OrderTotal();
- subTotal.setOrder(order);
- subTotal.setOrderTotalCode(Constants.OT_SUBTOTAL_MODULE_CODE);
- subTotal.setSortOrder(0);
- subTotal.setTitle("Sub Total");
- subTotal.setValue(dprice.getProductPriceAmount());
-
- order.getOrderTotal().add(subTotal);
-
-
- OrderTotal total = new OrderTotal();
- total.setOrder(order);
- total.setOrderTotalCode(Constants.OT_TOTAL_MODULE_CODE);
- total.setSortOrder(1);
- total.setTitle("Total");
- total.setValue(dprice.getProductPriceAmount());
-
- order.getOrderTotal().add(total);
-
-
-
-
- /** ORDER HISTORY **/
-
- //create a log entry in order history
- OrderStatusHistory history = new OrderStatusHistory();
- history.setOrder(order);
- history.setDateAdded(new Date());
- history.setStatus(OrderStatus.ORDERED);
- history.setComments("We received your order");
-
- order.getOrderHistory().add(history);
-
- /** CREATE ORDER **/
-
- orderService.create(order);
-
-
- /** SEARCH ORDERS **/
-
- OrderCriteria criteria = new OrderCriteria();
- criteria.setStartIndex(0);
- criteria.setMaxCount(10);
-
- OrderList ordserList = orderService.listByStore(merchant, criteria);
-
-
- Assert.assertNotNull(ordserList);
- Assert.assertTrue("Merchant Orders are null." , ordserList.getOrders() != null);
- Assert.assertTrue("Merchant Orders count is not one." , (ordserList.getOrders() != null && ordserList.getOrders().size() == 1) );
- }
-
-
-
+package com.salesmanager.test.order;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import com.salesmanager.core.business.constants.Constants;
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.model.catalog.category.Category;
+import com.salesmanager.core.model.catalog.category.CategoryDescription;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
+import com.salesmanager.core.model.catalog.product.attribute.ProductOption;
+import com.salesmanager.core.model.catalog.product.attribute.ProductOptionDescription;
+import com.salesmanager.core.model.catalog.product.attribute.ProductOptionType;
+import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValue;
+import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValueDescription;
+import com.salesmanager.core.model.catalog.product.availability.ProductAvailability;
+import com.salesmanager.core.model.catalog.product.description.ProductDescription;
+import com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer;
+import com.salesmanager.core.model.catalog.product.manufacturer.ManufacturerDescription;
+import com.salesmanager.core.model.catalog.product.price.ProductPrice;
+import com.salesmanager.core.model.catalog.product.price.ProductPriceDescription;
+import com.salesmanager.core.model.catalog.product.price.ProductPriceType;
+import com.salesmanager.core.model.catalog.product.type.ProductType;
+import com.salesmanager.core.model.common.Billing;
+import com.salesmanager.core.model.common.Delivery;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.customer.CustomerGender;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.order.OrderCriteria;
+import com.salesmanager.core.model.order.OrderList;
+import com.salesmanager.core.model.order.OrderTotal;
+import com.salesmanager.core.model.order.orderproduct.OrderProduct;
+import com.salesmanager.core.model.order.orderproduct.OrderProductAttribute;
+import com.salesmanager.core.model.order.orderproduct.OrderProductPrice;
+import com.salesmanager.core.model.order.orderstatus.OrderStatus;
+import com.salesmanager.core.model.order.orderstatus.OrderStatusHistory;
+import com.salesmanager.core.model.order.payment.CreditCard;
+import com.salesmanager.core.model.payments.CreditCardType;
+import com.salesmanager.core.model.payments.PaymentType;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.currency.Currency;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.reference.zone.Zone;
+
+
+@Ignore
+public class OrderTest extends com.salesmanager.test.common.AbstractSalesManagerCoreTestCase {
+
+
+
+
+ @Test
+ public void getMerchantOrders() throws ServiceException {
+
+
+
+ Currency currency = currencyService.getByCode(USD_CURRENCY_CODE);
+ Country country = countryService.getByCode("US");
+ Zone zone = zoneService.getByCode("VT");
+ Language en = languageService.getByCode("en");
+
+ MerchantStore merchant = merchantService.getByCode( MerchantStore.DEFAULT_STORE );
+
+ /** Create a customer **/
+ Customer customer = new Customer();
+ customer.setMerchantStore(merchant);
+ customer.setDefaultLanguage(en);
+ customer.setEmailAddress("email@email.com");
+ customer.setPassword("-1999");
+ customer.setNick("My New nick");
+ customer.setCompany(" Apple");
+ customer.setGender(CustomerGender.M);
+ customer.setDateOfBirth(new Date());
+
+ Billing billing = new Billing();
+ billing.setAddress("Billing address");
+ billing.setCity("Billing city");
+ billing.setCompany("Billing company");
+ billing.setCountry(country);
+ billing.setFirstName("Carl");
+ billing.setLastName("Samson");
+ billing.setPostalCode("Billing postal code");
+ billing.setState("Billing state");
+ billing.setZone(zone);
+
+ Delivery delivery = new Delivery();
+ delivery.setAddress("Shipping address");
+ delivery.setCountry(country);
+ delivery.setZone(zone);
+
+ customer.setBilling(billing);
+ customer.setDelivery(delivery);
+
+ customerService.create(customer);
+
+
+ //create a product with attributes
+
+ /** CATALOG CREATION **/
+
+ ProductType generalType = productTypeService.getProductType(ProductType.GENERAL_TYPE);
+
+ /**
+ * Create the category
+ */
+ Category shirts = new Category();
+ shirts.setMerchantStore(merchant);
+ shirts.setCode("shirts");
+
+ CategoryDescription shirtsEnglishDescription = new CategoryDescription();
+ shirtsEnglishDescription.setName("Shirts");
+ shirtsEnglishDescription.setCategory(shirts);
+ shirtsEnglishDescription.setLanguage(en);
+
+ List<CategoryDescription> descriptions = new ArrayList<CategoryDescription>();
+ descriptions.add(shirtsEnglishDescription);
+
+
+ shirts.setDescriptions(descriptions);
+ categoryService.create(shirts);
+
+
+ /**
+ * Create a manufacturer
+ */
+ Manufacturer addidas = new Manufacturer();
+ addidas.setMerchantStore(merchant);
+ addidas.setCode("addidas");
+
+ ManufacturerDescription addidasDesc = new ManufacturerDescription();
+ addidasDesc.setLanguage(en);
+ addidasDesc.setManufacturer(addidas);
+ addidasDesc.setName("Addidas");
+ addidas.getDescriptions().add(addidasDesc);
+
+ manufacturerService.create(addidas);
+
+ /**
+ * Create an option
+ */
+ ProductOption option = new ProductOption();
+ option.setMerchantStore(merchant);
+ option.setCode("color");
+ option.setProductOptionType(ProductOptionType.Radio.name());
+
+ ProductOptionDescription optionDescription = new ProductOptionDescription();
+ optionDescription.setLanguage(en);
+ optionDescription.setName("Color");
+ optionDescription.setDescription("Item color");
+ optionDescription.setProductOption(option);
+
+ option.getDescriptions().add(optionDescription);
+
+ productOptionService.saveOrUpdate(option);
+
+
+ /** first option value **/
+ ProductOptionValue white = new ProductOptionValue();
+ white.setMerchantStore(merchant);
+ white.setCode("white");
+
+ ProductOptionValueDescription whiteDescription = new ProductOptionValueDescription();
+ whiteDescription.setLanguage(en);
+ whiteDescription.setName("White");
+ whiteDescription.setDescription("White color");
+ whiteDescription.setProductOptionValue(white);
+
+ white.getDescriptions().add(whiteDescription);
+
+ productOptionValueService.saveOrUpdate(white);
+
+
+ ProductOptionValue black = new ProductOptionValue();
+ black.setMerchantStore(merchant);
+ black.setCode("black");
+
+ /** second option value **/
+ ProductOptionValueDescription blackDesc = new ProductOptionValueDescription();
+ blackDesc.setLanguage(en);
+ blackDesc.setName("Black");
+ blackDesc.setDescription("Black color");
+ blackDesc.setProductOptionValue(black);
+
+ black.getDescriptions().add(blackDesc);
+
+ productOptionValueService.saveOrUpdate(black);
+
+
+ /**
+ * Create a complex product
+ */
+ Product product = new Product();
+ product.setProductHeight(new BigDecimal(4));
+ product.setProductLength(new BigDecimal(3));
+ product.setProductWidth(new BigDecimal(1));
+ product.setSku("TB12345");
+ product.setManufacturer(addidas);
+ product.setType(generalType);
+ product.setMerchantStore(merchant);
+
+ // Product description
+ ProductDescription description = new ProductDescription();
+ description.setName("Short sleeves shirt");
+ description.setLanguage(en);
+ description.setProduct(product);
+
+ product.getDescriptions().add(description);
+ product.getCategories().add(shirts);
+
+
+ //availability
+ ProductAvailability availability = new ProductAvailability();
+ availability.setProductDateAvailable(new Date());
+ availability.setProductQuantity(100);
+ availability.setRegion("*");
+ availability.setProduct(product);// associate with product
+
+ //price
+ ProductPrice dprice = new ProductPrice();
+ dprice.setDefaultPrice(true);
+ dprice.setProductPriceAmount(new BigDecimal(29.99));
+ dprice.setProductAvailability(availability);
+
+
+
+ ProductPriceDescription dpd = new ProductPriceDescription();
+ dpd.setName("Base price");
+ dpd.setProductPrice(dprice);
+ dpd.setLanguage(en);
+
+ dprice.getDescriptions().add(dpd);
+ availability.getPrices().add(dprice);
+ product.getAvailabilities().add(availability);
+
+
+ //attributes
+ //white
+ ProductAttribute whiteAttribute = new ProductAttribute();
+ whiteAttribute.setProduct(product);
+ whiteAttribute.setProductOption(option);
+ whiteAttribute.setAttributeDefault(true);
+ whiteAttribute.setProductAttributePrice(new BigDecimal(0));//no price variation
+ whiteAttribute.setProductAttributeWeight(new BigDecimal(0));//no weight variation
+ whiteAttribute.setProductOption(option);
+ whiteAttribute.setProductOptionValue(white);
+
+ product.getAttributes().add(whiteAttribute);
+ //black
+ ProductAttribute blackAttribute = new ProductAttribute();
+ blackAttribute.setProduct(product);
+ blackAttribute.setProductOption(option);
+ blackAttribute.setProductAttributePrice(new BigDecimal(5));//5 + dollars
+ blackAttribute.setProductAttributeWeight(new BigDecimal(0));//no weight variation
+ blackAttribute.setProductOption(option);
+ blackAttribute.setProductOptionValue(black);
+
+ product.getAttributes().add(blackAttribute);
+
+ productService.create(product);
+
+
+
+
+ /** Create an order **/
+ Order order = new Order();
+
+
+
+ /** payment details **/
+ CreditCard creditCard = new CreditCard();
+ creditCard.setCardType(CreditCardType.VISA);
+
+ creditCard.setCcCvv("123");
+ creditCard.setCcExpires("12/30/2020" );
+ creditCard.setCcNumber( "123456789");
+ creditCard.setCcOwner("ccOwner" );
+ order.setCreditCard(creditCard);
+
+ /** order core attributes **/
+ order.setDatePurchased(new Date());
+ order.setCurrency(currency);
+ order.setMerchant(merchant);
+ order.setLastModified(new Date());
+ order.setCurrencyValue(new BigDecimal(1));//no price variation because of the currency
+ order.setCustomerId(new Long(1) );
+ order.setDelivery(delivery);
+ order.setIpAddress("ipAddress" );
+ order.setMerchant(merchant);
+ order.setOrderDateFinished(new Date());
+
+ order.setPaymentType(PaymentType.CREDITCARD);
+ order.setPaymentModuleCode("payment Module Code");
+ order.setShippingModuleCode("UPS" );
+ order.setStatus( OrderStatus.ORDERED);
+ order.setCustomerAgreement(true);
+ order.setConfirmedAddress(true);
+ order.setTotal(dprice.getProductPriceAmount());
+ order.setCustomerEmailAddress(customer.getEmailAddress());
+
+ order.setBilling(billing);
+ order.setDelivery(delivery);
+
+
+ /** ORDER PRODUCT **/
+
+ //OrderProduct
+ OrderProduct oproduct = new OrderProduct();
+ oproduct.setDownloads(null);
+ oproduct.setOneTimeCharge(dprice.getProductPriceAmount());
+ oproduct.setOrder(order);
+ oproduct.setProductName( description.getName() );
+ oproduct.setProductQuantity(1);
+ oproduct.setSku(product.getSku());
+
+ //set order product price
+ OrderProductPrice orderProductPrice = new OrderProductPrice();
+ orderProductPrice.setDefaultPrice(true);//default price (same as default product price)
+ orderProductPrice.setOrderProduct(oproduct);
+ orderProductPrice.setProductPrice(dprice.getProductPriceAmount());
+ orderProductPrice.setProductPriceCode(ProductPriceType.ONE_TIME.name());
+
+
+ oproduct.getPrices().add(orderProductPrice);
+
+ //order product attribute
+
+ OrderProductAttribute orderProductAttribute = new OrderProductAttribute();
+ orderProductAttribute.setOrderProduct(oproduct);
+ orderProductAttribute.setProductAttributePrice(new BigDecimal("0.00"));//no extra charge
+ orderProductAttribute.setProductAttributeName(whiteDescription.getName());
+ orderProductAttribute.setProductOptionId(option.getId());
+ orderProductAttribute.setProductOptionValueId(white.getId());
+
+ oproduct.getOrderAttributes().add(orderProductAttribute);
+
+ order.getOrderProducts().add(oproduct);
+
+ /** ORDER TOTAL **/
+
+ OrderTotal subTotal = new OrderTotal();
+ subTotal.setOrder(order);
+ subTotal.setOrderTotalCode(Constants.OT_SUBTOTAL_MODULE_CODE);
+ subTotal.setSortOrder(0);
+ subTotal.setTitle("Sub Total");
+ subTotal.setValue(dprice.getProductPriceAmount());
+
+ order.getOrderTotal().add(subTotal);
+
+
+ OrderTotal total = new OrderTotal();
+ total.setOrder(order);
+ total.setOrderTotalCode(Constants.OT_TOTAL_MODULE_CODE);
+ total.setSortOrder(1);
+ total.setTitle("Total");
+ total.setValue(dprice.getProductPriceAmount());
+
+ order.getOrderTotal().add(total);
+
+
+
+
+ /** ORDER HISTORY **/
+
+ //create a log entry in order history
+ OrderStatusHistory history = new OrderStatusHistory();
+ history.setOrder(order);
+ history.setDateAdded(new Date());
+ history.setStatus(OrderStatus.ORDERED);
+ history.setComments("We received your order");
+
+ order.getOrderHistory().add(history);
+
+ /** CREATE ORDER **/
+
+ orderService.create(order);
+
+
+ /** SEARCH ORDERS **/
+
+ OrderCriteria criteria = new OrderCriteria();
+ criteria.setStartIndex(0);
+ criteria.setMaxCount(10);
+
+ OrderList ordserList = orderService.listByStore(merchant, criteria);
+
+
+ Assert.assertNotNull(ordserList);
+ Assert.assertTrue("Merchant Orders are null." , ordserList.getOrders() != null);
+ Assert.assertTrue("Merchant Orders count is not one." , (ordserList.getOrders() != null && ordserList.getOrders().size() == 1) );
+ }
+
+
+
}
\ No newline at end of file
diff --git a/sm-core/src/test/java/com/salesmanager/test/references/ReferencesTest.java b/sm-core/src/test/java/com/salesmanager/test/references/ReferencesTest.java
index 63a5e09..e476646 100644
--- a/sm-core/src/test/java/com/salesmanager/test/references/ReferencesTest.java
+++ b/sm-core/src/test/java/com/salesmanager/test/references/ReferencesTest.java
@@ -1,87 +1,87 @@
-package com.salesmanager.test.references;
-
-import java.util.List;
-
-import javax.inject.Inject;
-
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.test.SpringApplicationConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.reference.country.CountryService;
-import com.salesmanager.core.business.services.reference.language.LanguageService;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.country.CountryDescription;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.test.configuration.ConfigurationTest;
-
-@RunWith(SpringJUnit4ClassRunner.class)
-@SpringApplicationConfiguration(classes = {ConfigurationTest.class})
-@Ignore
-public class ReferencesTest {
-
-
-
- @Inject
- LanguageService languageService;
-
- @Inject
- CountryService countryService;
-
- //@Test
- @Ignore
- public void testReferences() throws ServiceException {
-
- Language en = new Language();
- en.setCode("en");
- en.setSortOrder(0);
-
- languageService.save(en);
-
- Language fr = new Language();
- fr.setCode("fr");
- fr.setSortOrder(0);
-
- languageService.save(fr);
-
-
- List<Language> langs = languageService.getLanguages();
-
- System.out.println("Language size " + langs.size());
-
- Country us = new Country();
- us.setIsoCode("US");
-
- CountryDescription us_en = new CountryDescription();
- us_en.setLanguage(en);
- us_en.setCountry(us);
- us_en.setName("United States");
-
- us.getDescriptions().add(us_en);
-
- CountryDescription us_fr = new CountryDescription();
- us_fr.setLanguage(fr);
- us_fr.setCountry(us);
- us_fr.setName("Etats Unis");
-
- us.getDescriptions().add(us_fr);
-
- countryService.save(us);
-
- Country c = countryService.getByCode("US");
-
- System.out.println(c.getId());
-
-
-
- System.out.println("***********Done**************");
-
-
-
- }
-
-}
+package com.salesmanager.test.references;
+
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.SpringApplicationConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.reference.country.CountryService;
+import com.salesmanager.core.business.services.reference.language.LanguageService;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.country.CountryDescription;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.test.configuration.ConfigurationTest;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringApplicationConfiguration(classes = {ConfigurationTest.class})
+@Ignore
+public class ReferencesTest {
+
+
+
+ @Inject
+ LanguageService languageService;
+
+ @Inject
+ CountryService countryService;
+
+ //@Test
+ @Ignore
+ public void testReferences() throws ServiceException {
+
+ Language en = new Language();
+ en.setCode("en");
+ en.setSortOrder(0);
+
+ languageService.save(en);
+
+ Language fr = new Language();
+ fr.setCode("fr");
+ fr.setSortOrder(0);
+
+ languageService.save(fr);
+
+
+ List<Language> langs = languageService.getLanguages();
+
+ System.out.println("Language size " + langs.size());
+
+ Country us = new Country();
+ us.setIsoCode("US");
+
+ CountryDescription us_en = new CountryDescription();
+ us_en.setLanguage(en);
+ us_en.setCountry(us);
+ us_en.setName("United States");
+
+ us.getDescriptions().add(us_en);
+
+ CountryDescription us_fr = new CountryDescription();
+ us_fr.setLanguage(fr);
+ us_fr.setCountry(us);
+ us_fr.setName("Etats Unis");
+
+ us.getDescriptions().add(us_fr);
+
+ countryService.save(us);
+
+ Country c = countryService.getByCode("US");
+
+ System.out.println(c.getId());
+
+
+
+ System.out.println("***********Done**************");
+
+
+
+ }
+
+}
diff --git a/sm-core/src/test/java/com/salesmanager/test/shipping/ShippingMethodDecisionTest.java b/sm-core/src/test/java/com/salesmanager/test/shipping/ShippingMethodDecisionTest.java
index e814871..19769f0 100644
--- a/sm-core/src/test/java/com/salesmanager/test/shipping/ShippingMethodDecisionTest.java
+++ b/sm-core/src/test/java/com/salesmanager/test/shipping/ShippingMethodDecisionTest.java
@@ -1,94 +1,94 @@
-package com.salesmanager.test.shipping;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
-import javax.inject.Inject;
-
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.TestExecutionListeners;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
-
-import com.salesmanager.core.business.modules.integration.shipping.impl.ShippingDecisionPreProcessorImpl;
-import com.salesmanager.core.model.common.Delivery;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.zone.Zone;
-import com.salesmanager.core.model.shipping.PackageDetails;
-import com.salesmanager.core.model.shipping.ShippingQuote;
-import com.salesmanager.core.model.system.IntegrationModule;
-
-
-
-@Ignore
-public class ShippingMethodDecisionTest extends com.salesmanager.test.common.AbstractSalesManagerCoreTestCase {
-
- @Inject
+package com.salesmanager.test.shipping;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+import javax.inject.Inject;
+
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.TestExecutionListeners;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
+
+import com.salesmanager.core.business.modules.integration.shipping.impl.ShippingDecisionPreProcessorImpl;
+import com.salesmanager.core.model.common.Delivery;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.zone.Zone;
+import com.salesmanager.core.model.shipping.PackageDetails;
+import com.salesmanager.core.model.shipping.ShippingQuote;
+import com.salesmanager.core.model.system.IntegrationModule;
+
+
+
+@Ignore
+public class ShippingMethodDecisionTest extends com.salesmanager.test.common.AbstractSalesManagerCoreTestCase {
+
+ @Inject
ShippingDecisionPreProcessorImpl shippingMethodDecisionProcess;
- //@Test
- @Ignore
- public void validateShippingMethod() throws Exception {
-
- ShippingQuote quote = new ShippingQuote();
- PackageDetails pDetail = new PackageDetails();
- pDetail.setShippingHeight(20);
- pDetail.setShippingLength(10);
- pDetail.setShippingWeight(70);
- pDetail.setShippingWidth(78);
- List<PackageDetails> details = new ArrayList<PackageDetails>();
- details.add(pDetail);
-
- Delivery delivery = new Delivery();
- delivery.setAddress("358 Du Languedoc");
- delivery.setCity("Boucherville");
- delivery.setPostalCode("J4B 8J9");
-
- Country country = new Country();
- country.setIsoCode("CA");
- country.setName("Canada");
-
- //country.setIsoCode("US");
- //country.setName("United States");
-
- delivery.setCountry(country);
-
- Zone zone = new Zone();
- zone.setCode("QC");
- zone.setName("Quebec");
-
- //zone.setCode("NY");
- //zone.setName("New York");
-
- delivery.setZone(zone);
-
- IntegrationModule currentModule = new IntegrationModule();
- currentModule.setCode("canadapost");
- quote.setCurrentShippingModule(currentModule);
- quote.setShippingModuleCode(currentModule.getCode());
-
- IntegrationModule canadapost = new IntegrationModule();
- canadapost.setCode("canadapost");
-
- IntegrationModule ups = new IntegrationModule();
- ups.setCode("ups");
-
- IntegrationModule inhouse = new IntegrationModule();
- inhouse.setCode("customQuotesRules");
-
- List<IntegrationModule> allModules = new ArrayList<IntegrationModule>();
- allModules.add(canadapost);
- allModules.add(ups);
- allModules.add(inhouse);
-
- shippingMethodDecisionProcess.prePostProcessShippingQuotes(quote, details, null, delivery, null, null, null, currentModule, null, allModules, Locale.CANADA);
-
- System.out.println("Done : " + quote.getCurrentShippingModule()!=null ? quote.getCurrentShippingModule().getCode() : currentModule.getCode());
-
- }
-}
+ //@Test
+ @Ignore
+ public void validateShippingMethod() throws Exception {
+
+ ShippingQuote quote = new ShippingQuote();
+ PackageDetails pDetail = new PackageDetails();
+ pDetail.setShippingHeight(20);
+ pDetail.setShippingLength(10);
+ pDetail.setShippingWeight(70);
+ pDetail.setShippingWidth(78);
+ List<PackageDetails> details = new ArrayList<PackageDetails>();
+ details.add(pDetail);
+
+ Delivery delivery = new Delivery();
+ delivery.setAddress("358 Du Languedoc");
+ delivery.setCity("Boucherville");
+ delivery.setPostalCode("J4B 8J9");
+
+ Country country = new Country();
+ country.setIsoCode("CA");
+ country.setName("Canada");
+
+ //country.setIsoCode("US");
+ //country.setName("United States");
+
+ delivery.setCountry(country);
+
+ Zone zone = new Zone();
+ zone.setCode("QC");
+ zone.setName("Quebec");
+
+ //zone.setCode("NY");
+ //zone.setName("New York");
+
+ delivery.setZone(zone);
+
+ IntegrationModule currentModule = new IntegrationModule();
+ currentModule.setCode("canadapost");
+ quote.setCurrentShippingModule(currentModule);
+ quote.setShippingModuleCode(currentModule.getCode());
+
+ IntegrationModule canadapost = new IntegrationModule();
+ canadapost.setCode("canadapost");
+
+ IntegrationModule ups = new IntegrationModule();
+ ups.setCode("ups");
+
+ IntegrationModule inhouse = new IntegrationModule();
+ inhouse.setCode("customQuotesRules");
+
+ List<IntegrationModule> allModules = new ArrayList<IntegrationModule>();
+ allModules.add(canadapost);
+ allModules.add(ups);
+ allModules.add(inhouse);
+
+ shippingMethodDecisionProcess.prePostProcessShippingQuotes(quote, details, null, delivery, null, null, null, currentModule, null, allModules, Locale.CANADA);
+
+ System.out.println("Done : " + quote.getCurrentShippingModule()!=null ? quote.getCurrentShippingModule().getCode() : currentModule.getCode());
+
+ }
+}
diff --git a/sm-core/src/test/java/com/salesmanager/test/shipping/ShippingQuoteByWeightTest.java b/sm-core/src/test/java/com/salesmanager/test/shipping/ShippingQuoteByWeightTest.java
index 78e1b31..c508e4c 100644
--- a/sm-core/src/test/java/com/salesmanager/test/shipping/ShippingQuoteByWeightTest.java
+++ b/sm-core/src/test/java/com/salesmanager/test/shipping/ShippingQuoteByWeightTest.java
@@ -254,8 +254,10 @@ public class ShippingQuoteByWeightTest extends com.salesmanager.test.common.Abst
customer.setDelivery(delivery);
customerService.create(customer);
+
+ Long dummyCartId = 0L;//for correlation
- ShippingQuote shippingQuote = shippingService.getShippingQuote(store, delivery, shippingProducts, en);
+ ShippingQuote shippingQuote = shippingService.getShippingQuote(dummyCartId, store, delivery, shippingProducts, en);
Assert.notNull(shippingQuote);
diff --git a/sm-core/src/test/resources/spring/test-datasource.xml b/sm-core/src/test/resources/spring/test-datasource.xml
index 55dbe6a..ac98a71 100644
--- a/sm-core/src/test/resources/spring/test-datasource.xml
+++ b/sm-core/src/test/resources/spring/test-datasource.xml
@@ -3,7 +3,7 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
- <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
+ <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${db.driverClass}" />
<property name="url" value="${db.jdbcUrl}" />
<property name="username" value="${db.user}" />
diff --git a/sm-core/src/test/resources/spring/test-shopizer-context.xml b/sm-core/src/test/resources/spring/test-shopizer-context.xml
index 5aa64db..6893b94 100644
--- a/sm-core/src/test/resources/spring/test-shopizer-context.xml
+++ b/sm-core/src/test/resources/spring/test-shopizer-context.xml
@@ -24,7 +24,7 @@
<beans:import resource="classpath:/spring/shopizer-core-context.xml" />
- <beans:bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
+ <beans:bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<beans:property name="driverClassName" value="${db.driverClass}" />
<beans:property name="url" value="${db.jdbcUrl}" />
<beans:property name="username" value="${db.user}" />
sm-core-model/.classpath 54(+27 -27)
diff --git a/sm-core-model/.classpath b/sm-core-model/.classpath
index 6cd5836..51bd020 100644
--- a/sm-core-model/.classpath
+++ b/sm-core-model/.classpath
@@ -1,27 +1,27 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="src" output="target/classes" path="src/main/java">
- <attributes>
- <attribute name="optional" value="true"/>
- <attribute name="maven.pomderived" value="true"/>
- </attributes>
- </classpathentry>
- <classpathentry kind="src" output="target/test-classes" path="src/test/java">
- <attributes>
- <attribute name="optional" value="true"/>
- <attribute name="maven.pomderived" value="true"/>
- </attributes>
- </classpathentry>
- <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
- <attributes>
- <attribute name="maven.pomderived" value="true"/>
- </attributes>
- </classpathentry>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
- <attributes>
- <attribute name="maven.pomderived" value="true"/>
- </attributes>
- </classpathentry>
- <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
- <classpathentry kind="output" path="target/classes"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" output="target/classes" path="src/main/java">
+ <attributes>
+ <attribute name="optional" value="true"/>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="src" output="target/test-classes" path="src/test/java">
+ <attributes>
+ <attribute name="optional" value="true"/>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+ <attributes>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
+ <attributes>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jst.j2ee.internal.module.container"/>
+ <classpathentry kind="output" path="target/classes"/>
+</classpath>
sm-core-model/.gitignore 1(+1 -0)
diff --git a/sm-core-model/.gitignore b/sm-core-model/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/sm-core-model/.gitignore
@@ -0,0 +1 @@
+/target/
sm-core-model/.project 72(+36 -36)
diff --git a/sm-core-model/.project b/sm-core-model/.project
index bc8bb2b..f0b2cd7 100644
--- a/sm-core-model/.project
+++ b/sm-core-model/.project
@@ -1,36 +1,36 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>sm-core-model</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.wst.common.project.facet.core.builder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.wst.validation.validationbuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.m2e.core.maven2Builder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
- <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
- <nature>org.eclipse.jdt.core.javanature</nature>
- <nature>org.eclipse.m2e.core.maven2Nature</nature>
- <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
- </natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>sm-core-model</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.wst.common.project.facet.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.wst.validation.validationbuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.m2e.core.maven2Builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+ <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.m2e.core.maven2Nature</nature>
+ <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+ </natures>
+</projectDescription>
diff --git a/sm-core-model/.settings/org.eclipse.core.resources.prefs b/sm-core-model/.settings/org.eclipse.core.resources.prefs
index 4c28b1a..f9fe345 100644
--- a/sm-core-model/.settings/org.eclipse.core.resources.prefs
+++ b/sm-core-model/.settings/org.eclipse.core.resources.prefs
@@ -1,4 +1,4 @@
-eclipse.preferences.version=1
-encoding//src/main/java=UTF-8
-encoding//src/test/java=UTF-8
-encoding/<project>=UTF-8
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
+encoding//src/test/java=UTF-8
+encoding/<project>=UTF-8
diff --git a/sm-core-model/.settings/org.eclipse.jdt.core.prefs b/sm-core-model/.settings/org.eclipse.jdt.core.prefs
index 1ab2bb5..6e80039 100644
--- a/sm-core-model/.settings/org.eclipse.jdt.core.prefs
+++ b/sm-core-model/.settings/org.eclipse.jdt.core.prefs
@@ -1,8 +1,8 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.source=1.8
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/sm-core-model/.settings/org.eclipse.m2e.core.prefs b/sm-core-model/.settings/org.eclipse.m2e.core.prefs
index 14b697b..f897a7f 100644
--- a/sm-core-model/.settings/org.eclipse.m2e.core.prefs
+++ b/sm-core-model/.settings/org.eclipse.m2e.core.prefs
@@ -1,4 +1,4 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/sm-core-model/.settings/org.eclipse.wst.common.component b/sm-core-model/.settings/org.eclipse.wst.common.component
index 2d1ee8b..86852ff 100644
--- a/sm-core-model/.settings/org.eclipse.wst.common.component
+++ b/sm-core-model/.settings/org.eclipse.wst.common.component
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
- <wb-module deploy-name="sm-core-model">
- <wb-resource deploy-path="/" source-path="/connectorModule" tag="defaultRootSource"/>
- <wb-resource deploy-path="/" source-path="/src/main/java"/>
- <wb-resource deploy-path="/" source-path="/src/test/java"/>
- <property name="java-output-path" value="/sm-core-model/target/classes"/>
- </wb-module>
-</project-modules>
+<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
+ <wb-module deploy-name="sm-core-model">
+ <wb-resource deploy-path="/" source-path="/connectorModule" tag="defaultRootSource"/>
+ <wb-resource deploy-path="/" source-path="/src/main/java"/>
+ <wb-resource deploy-path="/" source-path="/src/test/java"/>
+ <property name="java-output-path" value="/sm-core-model/target/classes"/>
+ </wb-module>
+</project-modules>
diff --git a/sm-core-model/.settings/org.eclipse.wst.common.project.facet.core.xml b/sm-core-model/.settings/org.eclipse.wst.common.project.facet.core.xml
index 704e970..f4187b8 100644
--- a/sm-core-model/.settings/org.eclipse.wst.common.project.facet.core.xml
+++ b/sm-core-model/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<faceted-project>
- <installed facet="java" version="1.8"/>
- <installed facet="jst.connector" version="1.6"/>
-</faceted-project>
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <installed facet="java" version="1.8"/>
+ <installed facet="jst.connector" version="1.6"/>
+</faceted-project>
diff --git a/sm-core-model/connectorModule/META-INF/MANIFEST.MF b/sm-core-model/connectorModule/META-INF/MANIFEST.MF
index 5e94951..254272e 100644
--- a/sm-core-model/connectorModule/META-INF/MANIFEST.MF
+++ b/sm-core-model/connectorModule/META-INF/MANIFEST.MF
@@ -1,3 +1,3 @@
-Manifest-Version: 1.0
-Class-Path:
-
+Manifest-Version: 1.0
+Class-Path:
+
sm-core-model/pom.xml 10(+9 -1)
diff --git a/sm-core-model/pom.xml b/sm-core-model/pom.xml
index 86d5214..fb4c866 100644
--- a/sm-core-model/pom.xml
+++ b/sm-core-model/pom.xml
@@ -7,7 +7,7 @@
<parent>
<groupId>com.shopizer</groupId>
<artifactId>shopizer</artifactId>
- <version>2.0.5-SNAPSHOT</version>
+ <version>2.2.0-SNAPSHOT</version>
</parent>
@@ -25,6 +25,7 @@
<commons-lang3.version>3.0</commons-lang3.version>
<jackson.version>2.7.4</jackson.version>
<commons-io.version>2.5</commons-io.version>
+
</properties>
<dependencies>
@@ -95,6 +96,13 @@
<version>${commons-lang3.version}</version>
</dependency>
+ <!-- https://mvnrepository.com/artifact/org.springframework.social/ spring-social-core -->
+ <dependency>
+ <groupId>org.springframework.social</groupId>
+ <artifactId>spring-social-core</artifactId>
+ </dependency>
+
+
</dependencies>
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/business/exception/ConversionException.java b/sm-core-model/src/main/java/com/salesmanager/core/business/exception/ConversionException.java
index 821223f..4a245f5 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/business/exception/ConversionException.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/business/exception/ConversionException.java
@@ -1,31 +1,31 @@
-/**
- *
- */
-package com.salesmanager.core.business.exception;
-
-/**
- * @author Umesh A
- *
- */
-public class ConversionException extends Exception
-{
- private static final long serialVersionUID = 687400310032876603L;
-
- public ConversionException(final String msg, final Throwable cause)
- {
- super(msg, cause);
- }
-
- public ConversionException(final String msg)
- {
- super(msg);
- }
-
- public ConversionException(Throwable t)
- {
- super(t);
- }
-
-
-
-}
+/**
+ *
+ */
+package com.salesmanager.core.business.exception;
+
+/**
+ * @author Umesh A
+ *
+ */
+public class ConversionException extends Exception
+{
+ private static final long serialVersionUID = 687400310032876603L;
+
+ public ConversionException(final String msg, final Throwable cause)
+ {
+ super(msg, cause);
+ }
+
+ public ConversionException(final String msg)
+ {
+ super(msg);
+ }
+
+ public ConversionException(Throwable t)
+ {
+ super(t);
+ }
+
+
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/constants/MeasureUnit.java b/sm-core-model/src/main/java/com/salesmanager/core/constants/MeasureUnit.java
index 2d6607b..51332ed 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/constants/MeasureUnit.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/constants/MeasureUnit.java
@@ -1,7 +1,7 @@
-package com.salesmanager.core.constants;
-
-public enum MeasureUnit {
-
- KG, LB, CM, IN
-
-}
+package com.salesmanager.core.constants;
+
+public enum MeasureUnit {
+
+ KG, LB, CM, IN
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/category/Category.java b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/category/Category.java
index b95f36c..80936f4 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/category/Category.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/category/Category.java
@@ -79,6 +79,9 @@ public class Category extends SalesManagerEntity<Long, Category> implements Audi
@Column(name = "LINEAGE")
private String lineage;
+ @Column(name="FEATURED")
+ private boolean featured;
+
@NotEmpty
@Column(name="CODE", length=100, nullable=false)
private String code;
@@ -209,4 +212,12 @@ public class Category extends SalesManagerEntity<Long, Category> implements Audi
return null;
}
+
+ public boolean isFeatured() {
+ return featured;
+ }
+
+ public void setFeatured(boolean featured) {
+ this.featured = featured;
+ }
}
\ No newline at end of file
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/category/CategoryDescription.java b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/category/CategoryDescription.java
index d5ecf59..7ad11c5 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/category/CategoryDescription.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/category/CategoryDescription.java
@@ -9,7 +9,7 @@ import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.common.Description;
+import com.salesmanager.core.model.common.description.Description;
import com.salesmanager.core.model.reference.language.Language;
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/AttributeCriteria.java b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/AttributeCriteria.java
index 1031e4e..67bc0dd 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/AttributeCriteria.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/AttributeCriteria.java
@@ -1,26 +1,26 @@
-package com.salesmanager.core.model.catalog.product.attribute;
-
-import java.io.Serializable;
-
-public class AttributeCriteria implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String attributeCode;
- private String attributeValue;
- public void setAttributeCode(String attributeCode) {
- this.attributeCode = attributeCode;
- }
- public String getAttributeCode() {
- return attributeCode;
- }
- public void setAttributeValue(String attributeValue) {
- this.attributeValue = attributeValue;
- }
- public String getAttributeValue() {
- return attributeValue;
- }
-
-}
+package com.salesmanager.core.model.catalog.product.attribute;
+
+import java.io.Serializable;
+
+public class AttributeCriteria implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String attributeCode;
+ private String attributeValue;
+ public void setAttributeCode(String attributeCode) {
+ this.attributeCode = attributeCode;
+ }
+ public String getAttributeCode() {
+ return attributeCode;
+ }
+ public void setAttributeValue(String attributeValue) {
+ this.attributeValue = attributeValue;
+ }
+ public String getAttributeValue() {
+ return attributeValue;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductAttribute.java b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductAttribute.java
index 6234172..c932eb2 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductAttribute.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductAttribute.java
@@ -1,241 +1,241 @@
-package com.salesmanager.core.model.catalog.product.attribute;
-
-import java.math.BigDecimal;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Transient;
-import javax.persistence.UniqueConstraint;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.generic.SalesManagerEntity;
-
-@Entity
-@Table(name="PRODUCT_ATTRIBUTE", schema=SchemaConstant.SALESMANAGER_SCHEMA,
- uniqueConstraints={
- @UniqueConstraint(columnNames={
- "OPTION_ID",
- "OPTION_VALUE_ID",
- "PRODUCT_ID"
- })
- }
-)
-public class ProductAttribute extends SalesManagerEntity<Long, ProductAttribute> {
- private static final long serialVersionUID = -6537491946539803265L;
-
- @Id
- @Column(name = "PRODUCT_ATTRIBUTE_ID", unique=true, nullable=false)
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "PRODUCT_ATTR_SEQ_NEXT_VAL")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long id;
-
-
- @Column(name="PRODUCT_ATRIBUTE_PRICE")
- private BigDecimal productAttributePrice;
-
-
- @Column(name="PRODUCT_ATTRIBUTE_SORT_ORD")
- private Integer productOptionSortOrder;
-
- @Column(name="PRODUCT_ATTRIBUTE_FREE")
- private boolean productAttributeIsFree;
-
-
- @Column(name="PRODUCT_ATTRIBUTE_WEIGHT")
- private BigDecimal productAttributeWeight;
-
- @Column(name="PRODUCT_ATTRIBUTE_DEFAULT")
- private boolean attributeDefault=false;
-
- @Column(name="PRODUCT_ATTRIBUTE_REQUIRED")
- private boolean attributeRequired=false;
-
- /**
- * a read only attribute is considered as a core attribute addition
- */
- @Column(name="PRODUCT_ATTRIBUTE_FOR_DISP")
- private boolean attributeDisplayOnly=false;
-
-
- @Column(name="PRODUCT_ATTRIBUTE_DISCOUNTED")
- private boolean attributeDiscounted=false;
-
-
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name="OPTION_ID", nullable=false)
- private ProductOption productOption;
-
-
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name="OPTION_VALUE_ID", nullable=false)
- private ProductOptionValue productOptionValue;
-
-
- /**
- * This transient object property
- * is a utility used only to submit from a free text
- */
- @Transient
- private String attributePrice = "0";
-
-
- /**
- * This transient object property
- * is a utility used only to submit from a free text
- */
- @Transient
- private String attributeSortOrder = "0";
-
-
-
- /**
- * This transient object property
- * is a utility used only to submit from a free text
- */
- @Transient
- private String attributeAdditionalWeight = "0";
-
- public String getAttributePrice() {
- return attributePrice;
- }
-
- public void setAttributePrice(String attributePrice) {
- this.attributePrice = attributePrice;
- }
-
- @ManyToOne(targetEntity = Product.class)
- @JoinColumn(name = "PRODUCT_ID", nullable = false)
- private Product product;
-
- public ProductAttribute() {
- }
-
- @Override
- public Long getId() {
- return id;
- }
-
- @Override
- public void setId(Long id) {
- this.id = id;
- }
-
-
-
- public Integer getProductOptionSortOrder() {
- return productOptionSortOrder;
- }
-
- public void setProductOptionSortOrder(Integer productOptionSortOrder) {
- this.productOptionSortOrder = productOptionSortOrder;
- }
-
- public boolean getProductAttributeIsFree() {
- return productAttributeIsFree;
- }
-
- public void setProductAttributeIsFree(boolean productAttributeIsFree) {
- this.productAttributeIsFree = productAttributeIsFree;
- }
-
- public BigDecimal getProductAttributeWeight() {
- return productAttributeWeight;
- }
-
- public void setProductAttributeWeight(BigDecimal productAttributeWeight) {
- this.productAttributeWeight = productAttributeWeight;
- }
-
- public boolean getAttributeDefault() {
- return attributeDefault;
- }
-
- public void setAttributeDefault(boolean attributeDefault) {
- this.attributeDefault = attributeDefault;
- }
-
- public boolean getAttributeRequired() {
- return attributeRequired;
- }
-
- public void setAttributeRequired(boolean attributeRequired) {
- this.attributeRequired = attributeRequired;
- }
-
- public boolean getAttributeDisplayOnly() {
- return attributeDisplayOnly;
- }
-
- public void setAttributeDisplayOnly(boolean attributeDisplayOnly) {
- this.attributeDisplayOnly = attributeDisplayOnly;
- }
-
- public boolean getAttributeDiscounted() {
- return attributeDiscounted;
- }
-
- public void setAttributeDiscounted(boolean attributeDiscounted) {
- this.attributeDiscounted = attributeDiscounted;
- }
-
- public ProductOption getProductOption() {
- return productOption;
- }
-
- public void setProductOption(ProductOption productOption) {
- this.productOption = productOption;
- }
-
- public ProductOptionValue getProductOptionValue() {
- return productOptionValue;
- }
-
- public void setProductOptionValue(ProductOptionValue productOptionValue) {
- this.productOptionValue = productOptionValue;
- }
-
- public Product getProduct() {
- return product;
- }
-
- public void setProduct(Product product) {
- this.product = product;
- }
-
-
- public String getAttributeSortOrder() {
- return attributeSortOrder;
- }
-
- public void setAttributeSortOrder(String attributeSortOrder) {
- this.attributeSortOrder = attributeSortOrder;
- }
-
- public String getAttributeAdditionalWeight() {
- return attributeAdditionalWeight;
- }
-
- public void setAttributeAdditionalWeight(String attributeAdditionalWeight) {
- this.attributeAdditionalWeight = attributeAdditionalWeight;
- }
-
- public BigDecimal getProductAttributePrice() {
- return productAttributePrice;
- }
-
- public void setProductAttributePrice(BigDecimal productAttributePrice) {
- this.productAttributePrice = productAttributePrice;
- }
-
-
-
-}
+package com.salesmanager.core.model.catalog.product.attribute;
+
+import java.math.BigDecimal;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Transient;
+import javax.persistence.UniqueConstraint;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+
+@Entity
+@Table(name="PRODUCT_ATTRIBUTE", schema=SchemaConstant.SALESMANAGER_SCHEMA,
+ uniqueConstraints={
+ @UniqueConstraint(columnNames={
+ "OPTION_ID",
+ "OPTION_VALUE_ID",
+ "PRODUCT_ID"
+ })
+ }
+)
+public class ProductAttribute extends SalesManagerEntity<Long, ProductAttribute> {
+ private static final long serialVersionUID = -6537491946539803265L;
+
+ @Id
+ @Column(name = "PRODUCT_ATTRIBUTE_ID", unique=true, nullable=false)
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "PRODUCT_ATTR_SEQ_NEXT_VAL")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+
+ @Column(name="PRODUCT_ATRIBUTE_PRICE")
+ private BigDecimal productAttributePrice;
+
+
+ @Column(name="PRODUCT_ATTRIBUTE_SORT_ORD")
+ private Integer productOptionSortOrder;
+
+ @Column(name="PRODUCT_ATTRIBUTE_FREE")
+ private boolean productAttributeIsFree;
+
+
+ @Column(name="PRODUCT_ATTRIBUTE_WEIGHT")
+ private BigDecimal productAttributeWeight;
+
+ @Column(name="PRODUCT_ATTRIBUTE_DEFAULT")
+ private boolean attributeDefault=false;
+
+ @Column(name="PRODUCT_ATTRIBUTE_REQUIRED")
+ private boolean attributeRequired=false;
+
+ /**
+ * a read only attribute is considered as a core attribute addition
+ */
+ @Column(name="PRODUCT_ATTRIBUTE_FOR_DISP")
+ private boolean attributeDisplayOnly=false;
+
+
+ @Column(name="PRODUCT_ATTRIBUTE_DISCOUNTED")
+ private boolean attributeDiscounted=false;
+
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name="OPTION_ID", nullable=false)
+ private ProductOption productOption;
+
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name="OPTION_VALUE_ID", nullable=false)
+ private ProductOptionValue productOptionValue;
+
+
+ /**
+ * This transient object property
+ * is a utility used only to submit from a free text
+ */
+ @Transient
+ private String attributePrice = "0";
+
+
+ /**
+ * This transient object property
+ * is a utility used only to submit from a free text
+ */
+ @Transient
+ private String attributeSortOrder = "0";
+
+
+
+ /**
+ * This transient object property
+ * is a utility used only to submit from a free text
+ */
+ @Transient
+ private String attributeAdditionalWeight = "0";
+
+ public String getAttributePrice() {
+ return attributePrice;
+ }
+
+ public void setAttributePrice(String attributePrice) {
+ this.attributePrice = attributePrice;
+ }
+
+ @ManyToOne(targetEntity = Product.class)
+ @JoinColumn(name = "PRODUCT_ID", nullable = false)
+ private Product product;
+
+ public ProductAttribute() {
+ }
+
+ @Override
+ public Long getId() {
+ return id;
+ }
+
+ @Override
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+
+
+ public Integer getProductOptionSortOrder() {
+ return productOptionSortOrder;
+ }
+
+ public void setProductOptionSortOrder(Integer productOptionSortOrder) {
+ this.productOptionSortOrder = productOptionSortOrder;
+ }
+
+ public boolean getProductAttributeIsFree() {
+ return productAttributeIsFree;
+ }
+
+ public void setProductAttributeIsFree(boolean productAttributeIsFree) {
+ this.productAttributeIsFree = productAttributeIsFree;
+ }
+
+ public BigDecimal getProductAttributeWeight() {
+ return productAttributeWeight;
+ }
+
+ public void setProductAttributeWeight(BigDecimal productAttributeWeight) {
+ this.productAttributeWeight = productAttributeWeight;
+ }
+
+ public boolean getAttributeDefault() {
+ return attributeDefault;
+ }
+
+ public void setAttributeDefault(boolean attributeDefault) {
+ this.attributeDefault = attributeDefault;
+ }
+
+ public boolean getAttributeRequired() {
+ return attributeRequired;
+ }
+
+ public void setAttributeRequired(boolean attributeRequired) {
+ this.attributeRequired = attributeRequired;
+ }
+
+ public boolean getAttributeDisplayOnly() {
+ return attributeDisplayOnly;
+ }
+
+ public void setAttributeDisplayOnly(boolean attributeDisplayOnly) {
+ this.attributeDisplayOnly = attributeDisplayOnly;
+ }
+
+ public boolean getAttributeDiscounted() {
+ return attributeDiscounted;
+ }
+
+ public void setAttributeDiscounted(boolean attributeDiscounted) {
+ this.attributeDiscounted = attributeDiscounted;
+ }
+
+ public ProductOption getProductOption() {
+ return productOption;
+ }
+
+ public void setProductOption(ProductOption productOption) {
+ this.productOption = productOption;
+ }
+
+ public ProductOptionValue getProductOptionValue() {
+ return productOptionValue;
+ }
+
+ public void setProductOptionValue(ProductOptionValue productOptionValue) {
+ this.productOptionValue = productOptionValue;
+ }
+
+ public Product getProduct() {
+ return product;
+ }
+
+ public void setProduct(Product product) {
+ this.product = product;
+ }
+
+
+ public String getAttributeSortOrder() {
+ return attributeSortOrder;
+ }
+
+ public void setAttributeSortOrder(String attributeSortOrder) {
+ this.attributeSortOrder = attributeSortOrder;
+ }
+
+ public String getAttributeAdditionalWeight() {
+ return attributeAdditionalWeight;
+ }
+
+ public void setAttributeAdditionalWeight(String attributeAdditionalWeight) {
+ this.attributeAdditionalWeight = attributeAdditionalWeight;
+ }
+
+ public BigDecimal getProductAttributePrice() {
+ return productAttributePrice;
+ }
+
+ public void setProductAttributePrice(BigDecimal productAttributePrice) {
+ this.productAttributePrice = productAttributePrice;
+ }
+
+
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductOption.java b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductOption.java
index abdd673..5097cb4 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductOption.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductOption.java
@@ -1,151 +1,151 @@
-package com.salesmanager.core.model.catalog.product.attribute;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Index;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Transient;
-import javax.persistence.UniqueConstraint;
-import javax.validation.constraints.Pattern;
-
-
-
-import org.hibernate.validator.constraints.NotEmpty;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.generic.SalesManagerEntity;
-import com.salesmanager.core.model.merchant.MerchantStore;
-
-
-@Entity
-@Table(name="PRODUCT_OPTION", schema=SchemaConstant.SALESMANAGER_SCHEMA, indexes = { @Index(name="PRD_OPTION_CODE_IDX", columnList = "PRODUCT_OPTION_CODE")}, uniqueConstraints=
- @UniqueConstraint(columnNames = {"MERCHANT_ID", "PRODUCT_OPTION_CODE"}))
-public class ProductOption extends SalesManagerEntity<Long, ProductOption> {
- private static final long serialVersionUID = -2019269055342226086L;
-
- @Id
- @Column(name="PRODUCT_OPTION_ID")
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "PRODUCT_OPTION_SEQ_NEXT_VAL")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long id;
-
- @Column(name="PRODUCT_OPTION_SORT_ORD")
- private Integer productOptionSortOrder;
-
- @Column(name="PRODUCT_OPTION_TYPE", length=10)
- private String productOptionType;
-
-
- @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "productOption")
- private Set<ProductOptionDescription> descriptions = new HashSet<ProductOptionDescription>();
-
- @Transient
- private List<ProductOptionDescription> descriptionsList = new ArrayList<ProductOptionDescription>();
-
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name="MERCHANT_ID", nullable=false)
- private MerchantStore merchantStore;
-
- @Column(name="PRODUCT_OPTION_READ")
- private boolean readOnly;
-
- @NotEmpty
- @Pattern(regexp="^[a-zA-Z0-9_]*$")
- @Column(name="PRODUCT_OPTION_CODE")
- //@Index(name="PRD_OPTION_CODE_IDX")
- private String code;
-
- public ProductOption() {
- }
-
- public Integer getProductOptionSortOrder() {
- return productOptionSortOrder;
- }
-
- public void setProductOptionSortOrder(Integer productOptionSortOrder) {
- this.productOptionSortOrder = productOptionSortOrder;
- }
-
- public String getProductOptionType() {
- return productOptionType;
- }
-
- public void setProductOptionType(String productOptionType) {
- this.productOptionType = productOptionType;
- }
-
- public Set<ProductOptionDescription> getDescriptions() {
- return descriptions;
- }
-
- public void setDescriptions(Set<ProductOptionDescription> descriptions) {
- this.descriptions = descriptions;
- }
-
- @Override
- public Long getId() {
- return id;
- }
-
- @Override
- public void setId(Long id) {
- this.id = id;
- }
-
-
-
- public MerchantStore getMerchantStore() {
- return merchantStore;
- }
-
- public void setMerchantStore(MerchantStore merchantStore) {
- this.merchantStore = merchantStore;
- }
-
- public void setDescriptionsList(List<ProductOptionDescription> descriptionsList) {
- this.descriptionsList = descriptionsList;
- }
-
- public List<ProductOptionDescription> getDescriptionsList() {
- return descriptionsList;
- }
-
-
- public List<ProductOptionDescription> getDescriptionsSettoList() {
- if(descriptionsList==null || descriptionsList.size()==0) {
- descriptionsList = new ArrayList<ProductOptionDescription>(this.getDescriptions());
- }
- return descriptionsList;
-
- }
-
- public void setCode(String code) {
- this.code = code;
- }
-
- public String getCode() {
- return code;
- }
-
- public void setReadOnly(boolean readOnly) {
- this.readOnly = readOnly;
- }
-
- public boolean isReadOnly() {
- return readOnly;
- }
-}
+package com.salesmanager.core.model.catalog.product.attribute;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Index;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Transient;
+import javax.persistence.UniqueConstraint;
+import javax.validation.constraints.Pattern;
+
+
+
+import org.hibernate.validator.constraints.NotEmpty;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+import com.salesmanager.core.model.merchant.MerchantStore;
+
+
+@Entity
+@Table(name="PRODUCT_OPTION", schema=SchemaConstant.SALESMANAGER_SCHEMA, indexes = { @Index(name="PRD_OPTION_CODE_IDX", columnList = "PRODUCT_OPTION_CODE")}, uniqueConstraints=
+ @UniqueConstraint(columnNames = {"MERCHANT_ID", "PRODUCT_OPTION_CODE"}))
+public class ProductOption extends SalesManagerEntity<Long, ProductOption> {
+ private static final long serialVersionUID = -2019269055342226086L;
+
+ @Id
+ @Column(name="PRODUCT_OPTION_ID")
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "PRODUCT_OPTION_SEQ_NEXT_VAL")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+ @Column(name="PRODUCT_OPTION_SORT_ORD")
+ private Integer productOptionSortOrder;
+
+ @Column(name="PRODUCT_OPTION_TYPE", length=10)
+ private String productOptionType;
+
+
+ @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "productOption")
+ private Set<ProductOptionDescription> descriptions = new HashSet<ProductOptionDescription>();
+
+ @Transient
+ private List<ProductOptionDescription> descriptionsList = new ArrayList<ProductOptionDescription>();
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name="MERCHANT_ID", nullable=false)
+ private MerchantStore merchantStore;
+
+ @Column(name="PRODUCT_OPTION_READ")
+ private boolean readOnly;
+
+ @NotEmpty
+ @Pattern(regexp="^[a-zA-Z0-9_]*$")
+ @Column(name="PRODUCT_OPTION_CODE")
+ //@Index(name="PRD_OPTION_CODE_IDX")
+ private String code;
+
+ public ProductOption() {
+ }
+
+ public Integer getProductOptionSortOrder() {
+ return productOptionSortOrder;
+ }
+
+ public void setProductOptionSortOrder(Integer productOptionSortOrder) {
+ this.productOptionSortOrder = productOptionSortOrder;
+ }
+
+ public String getProductOptionType() {
+ return productOptionType;
+ }
+
+ public void setProductOptionType(String productOptionType) {
+ this.productOptionType = productOptionType;
+ }
+
+ public Set<ProductOptionDescription> getDescriptions() {
+ return descriptions;
+ }
+
+ public void setDescriptions(Set<ProductOptionDescription> descriptions) {
+ this.descriptions = descriptions;
+ }
+
+ @Override
+ public Long getId() {
+ return id;
+ }
+
+ @Override
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+
+
+ public MerchantStore getMerchantStore() {
+ return merchantStore;
+ }
+
+ public void setMerchantStore(MerchantStore merchantStore) {
+ this.merchantStore = merchantStore;
+ }
+
+ public void setDescriptionsList(List<ProductOptionDescription> descriptionsList) {
+ this.descriptionsList = descriptionsList;
+ }
+
+ public List<ProductOptionDescription> getDescriptionsList() {
+ return descriptionsList;
+ }
+
+
+ public List<ProductOptionDescription> getDescriptionsSettoList() {
+ if(descriptionsList==null || descriptionsList.size()==0) {
+ descriptionsList = new ArrayList<ProductOptionDescription>(this.getDescriptions());
+ }
+ return descriptionsList;
+
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setReadOnly(boolean readOnly) {
+ this.readOnly = readOnly;
+ }
+
+ public boolean isReadOnly() {
+ return readOnly;
+ }
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductOptionDescription.java b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductOptionDescription.java
index bb8aeeb..e10e835 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductOptionDescription.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductOptionDescription.java
@@ -1,51 +1,51 @@
-package com.salesmanager.core.model.catalog.product.attribute;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.UniqueConstraint;
-
-import org.hibernate.annotations.Type;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.common.Description;
-
-@Entity
-@Table(name="PRODUCT_OPTION_DESC", schema=SchemaConstant.SALESMANAGER_SCHEMA, uniqueConstraints={
- @UniqueConstraint(columnNames={
- "PRODUCT_OPTION_ID",
- "LANGUAGE_ID"
- })
- }
-)
-public class ProductOptionDescription extends Description {
- private static final long serialVersionUID = -3158504904707188465L;
-
- @ManyToOne(targetEntity = ProductOption.class)
- @JoinColumn(name = "PRODUCT_OPTION_ID", nullable = false)
- private ProductOption productOption;
-
- @Column(name="PRODUCT_OPTION_COMMENT")
- @Type(type = "org.hibernate.type.StringClobType")
- private String productOptionComment;
-
- public ProductOptionDescription() {
- }
-
- public String getProductOptionComment() {
- return productOptionComment;
- }
- public void setProductOptionComment(String productOptionComment) {
- this.productOptionComment = productOptionComment;
- }
-
- public ProductOption getProductOption() {
- return productOption;
- }
-
- public void setProductOption(ProductOption productOption) {
- this.productOption = productOption;
- }
-}
+package com.salesmanager.core.model.catalog.product.attribute;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+import org.hibernate.annotations.Type;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.common.description.Description;
+
+@Entity
+@Table(name="PRODUCT_OPTION_DESC", schema=SchemaConstant.SALESMANAGER_SCHEMA, uniqueConstraints={
+ @UniqueConstraint(columnNames={
+ "PRODUCT_OPTION_ID",
+ "LANGUAGE_ID"
+ })
+ }
+)
+public class ProductOptionDescription extends Description {
+ private static final long serialVersionUID = -3158504904707188465L;
+
+ @ManyToOne(targetEntity = ProductOption.class)
+ @JoinColumn(name = "PRODUCT_OPTION_ID", nullable = false)
+ private ProductOption productOption;
+
+ @Column(name="PRODUCT_OPTION_COMMENT")
+ @Type(type = "org.hibernate.type.StringClobType")
+ private String productOptionComment;
+
+ public ProductOptionDescription() {
+ }
+
+ public String getProductOptionComment() {
+ return productOptionComment;
+ }
+ public void setProductOptionComment(String productOptionComment) {
+ this.productOptionComment = productOptionComment;
+ }
+
+ public ProductOption getProductOption() {
+ return productOption;
+ }
+
+ public void setProductOption(ProductOption productOption) {
+ this.productOption = productOption;
+ }
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductOptionType.java b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductOptionType.java
index 6447f87..a24cecf 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductOptionType.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductOptionType.java
@@ -1,7 +1,7 @@
-package com.salesmanager.core.model.catalog.product.attribute;
-
-public enum ProductOptionType {
-
- Text, Radio, Select, Checkbox
-
-}
+package com.salesmanager.core.model.catalog.product.attribute;
+
+public enum ProductOptionType {
+
+ Text, Radio, Select, Checkbox
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductOptionValueDescription.java b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductOptionValueDescription.java
index 05930f6..0442c64 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductOptionValueDescription.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/attribute/ProductOptionValueDescription.java
@@ -7,7 +7,7 @@ import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.common.Description;
+import com.salesmanager.core.model.common.description.Description;
@Entity
@Table(name = "PRODUCT_OPTION_VALUE_DESCRIPTION", schema=SchemaConstant.SALESMANAGER_SCHEMA, uniqueConstraints={
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/availability/ProductAvailability.java b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/availability/ProductAvailability.java
index fbab0a5..d684152 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/availability/ProductAvailability.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/availability/ProductAvailability.java
@@ -1,183 +1,183 @@
-package com.salesmanager.core.model.catalog.product.availability;
-
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.Transient;
-import javax.validation.constraints.NotNull;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.price.ProductPrice;
-import com.salesmanager.core.model.generic.SalesManagerEntity;
-import com.salesmanager.core.utils.CloneUtils;
-
-
-@Entity
-@Table(name="PRODUCT_AVAILABILITY", schema=SchemaConstant.SALESMANAGER_SCHEMA)
-public class ProductAvailability extends SalesManagerEntity<Long, ProductAvailability> {
- private static final long serialVersionUID = 7449264635180797762L;
-
- @Id
- @Column(name = "PRODUCT_AVAIL_ID", unique=true, nullable=false)
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "PRODUCT_AVAIL_SEQ_NEXT_VAL")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long id;
-
-
- @ManyToOne(targetEntity = Product.class)
- @JoinColumn(name = "PRODUCT_ID", nullable = false)
- private Product product;
-
- @NotNull
- @Column(name="QUANTITY")
- private Integer productQuantity = 0;
-
- @Temporal(TemporalType.DATE)
- @Column(name="DATE_AVAILABLE")
- private Date productDateAvailable;
-
- @Column(name="REGION")
- private String region = SchemaConstant.ALL_REGIONS;
-
- @Column(name="REGION_VARIANT")
- private String regionVariant;
-
- @Column(name="STATUS")
- private boolean productStatus = true;
-
- @Column(name="FREE_SHIPPING")
- private boolean productIsAlwaysFreeShipping;
-
- @Column(name="QUANTITY_ORD_MIN")
- private Integer productQuantityOrderMin = 0;
-
- @Column(name="QUANTITY_ORD_MAX")
- private Integer productQuantityOrderMax = 0;
-
- @OneToMany(fetch = FetchType.LAZY, mappedBy="productAvailability", cascade = CascadeType.ALL)
- private Set<ProductPrice> prices = new HashSet<ProductPrice>();
-
- @Transient
- public ProductPrice defaultPrice() {
-
- for(ProductPrice price : prices) {
- if(price.isDefaultPrice()) {
- return price;
- }
- }
- return new ProductPrice();
- }
-
- public ProductAvailability() {
- }
-
- public Integer getProductQuantity() {
- return productQuantity;
- }
-
- public void setProductQuantity(Integer productQuantity) {
- this.productQuantity = productQuantity;
- }
-
- public Date getProductDateAvailable() {
- return CloneUtils.clone(productDateAvailable);
- }
-
- public void setProductDateAvailable(Date productDateAvailable) {
- this.productDateAvailable = CloneUtils.clone(productDateAvailable);
- }
-
- public String getRegion() {
- return region;
- }
-
- public void setRegion(String region) {
- this.region = region;
- }
-
- public String getRegionVariant() {
- return regionVariant;
- }
-
- public void setRegionVariant(String regionVariant) {
- this.regionVariant = regionVariant;
- }
-
- public boolean getProductStatus() {
- return productStatus;
- }
-
- public void setProductStatus(boolean productStatus) {
- this.productStatus = productStatus;
- }
-
- public boolean getProductIsAlwaysFreeShipping() {
- return productIsAlwaysFreeShipping;
- }
-
- public void setProductIsAlwaysFreeShipping(boolean productIsAlwaysFreeShipping) {
- this.productIsAlwaysFreeShipping = productIsAlwaysFreeShipping;
- }
-
- public Integer getProductQuantityOrderMin() {
- return productQuantityOrderMin;
- }
-
- public void setProductQuantityOrderMin(Integer productQuantityOrderMin) {
- this.productQuantityOrderMin = productQuantityOrderMin;
- }
-
- public Integer getProductQuantityOrderMax() {
- return productQuantityOrderMax;
- }
-
- public void setProductQuantityOrderMax(Integer productQuantityOrderMax) {
- this.productQuantityOrderMax = productQuantityOrderMax;
- }
-
-
- @Override
- public Long getId() {
- return id;
- }
-
- @Override
- public void setId(Long id) {
- this.id = id;
- }
-
- public Product getProduct() {
- return product;
- }
-
- public void setProduct(Product product) {
- this.product = product;
- }
-
-
-
- public Set<ProductPrice> getPrices() {
- return prices;
- }
-
- public void setPrices(Set<ProductPrice> prices) {
- this.prices = prices;
- }
-
-}
+package com.salesmanager.core.model.catalog.product.availability;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.persistence.Transient;
+import javax.validation.constraints.NotNull;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.price.ProductPrice;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+import com.salesmanager.core.utils.CloneUtils;
+
+
+@Entity
+@Table(name="PRODUCT_AVAILABILITY", schema=SchemaConstant.SALESMANAGER_SCHEMA)
+public class ProductAvailability extends SalesManagerEntity<Long, ProductAvailability> {
+ private static final long serialVersionUID = 7449264635180797762L;
+
+ @Id
+ @Column(name = "PRODUCT_AVAIL_ID", unique=true, nullable=false)
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "PRODUCT_AVAIL_SEQ_NEXT_VAL")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+
+ @ManyToOne(targetEntity = Product.class)
+ @JoinColumn(name = "PRODUCT_ID", nullable = false)
+ private Product product;
+
+ @NotNull
+ @Column(name="QUANTITY")
+ private Integer productQuantity = 0;
+
+ @Temporal(TemporalType.DATE)
+ @Column(name="DATE_AVAILABLE")
+ private Date productDateAvailable;
+
+ @Column(name="REGION")
+ private String region = SchemaConstant.ALL_REGIONS;
+
+ @Column(name="REGION_VARIANT")
+ private String regionVariant;
+
+ @Column(name="STATUS")
+ private boolean productStatus = true;
+
+ @Column(name="FREE_SHIPPING")
+ private boolean productIsAlwaysFreeShipping;
+
+ @Column(name="QUANTITY_ORD_MIN")
+ private Integer productQuantityOrderMin = 0;
+
+ @Column(name="QUANTITY_ORD_MAX")
+ private Integer productQuantityOrderMax = 0;
+
+ @OneToMany(fetch = FetchType.LAZY, mappedBy="productAvailability", cascade = CascadeType.ALL)
+ private Set<ProductPrice> prices = new HashSet<ProductPrice>();
+
+ @Transient
+ public ProductPrice defaultPrice() {
+
+ for(ProductPrice price : prices) {
+ if(price.isDefaultPrice()) {
+ return price;
+ }
+ }
+ return new ProductPrice();
+ }
+
+ public ProductAvailability() {
+ }
+
+ public Integer getProductQuantity() {
+ return productQuantity;
+ }
+
+ public void setProductQuantity(Integer productQuantity) {
+ this.productQuantity = productQuantity;
+ }
+
+ public Date getProductDateAvailable() {
+ return CloneUtils.clone(productDateAvailable);
+ }
+
+ public void setProductDateAvailable(Date productDateAvailable) {
+ this.productDateAvailable = CloneUtils.clone(productDateAvailable);
+ }
+
+ public String getRegion() {
+ return region;
+ }
+
+ public void setRegion(String region) {
+ this.region = region;
+ }
+
+ public String getRegionVariant() {
+ return regionVariant;
+ }
+
+ public void setRegionVariant(String regionVariant) {
+ this.regionVariant = regionVariant;
+ }
+
+ public boolean getProductStatus() {
+ return productStatus;
+ }
+
+ public void setProductStatus(boolean productStatus) {
+ this.productStatus = productStatus;
+ }
+
+ public boolean getProductIsAlwaysFreeShipping() {
+ return productIsAlwaysFreeShipping;
+ }
+
+ public void setProductIsAlwaysFreeShipping(boolean productIsAlwaysFreeShipping) {
+ this.productIsAlwaysFreeShipping = productIsAlwaysFreeShipping;
+ }
+
+ public Integer getProductQuantityOrderMin() {
+ return productQuantityOrderMin;
+ }
+
+ public void setProductQuantityOrderMin(Integer productQuantityOrderMin) {
+ this.productQuantityOrderMin = productQuantityOrderMin;
+ }
+
+ public Integer getProductQuantityOrderMax() {
+ return productQuantityOrderMax;
+ }
+
+ public void setProductQuantityOrderMax(Integer productQuantityOrderMax) {
+ this.productQuantityOrderMax = productQuantityOrderMax;
+ }
+
+
+ @Override
+ public Long getId() {
+ return id;
+ }
+
+ @Override
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Product getProduct() {
+ return product;
+ }
+
+ public void setProduct(Product product) {
+ this.product = product;
+ }
+
+
+
+ public Set<ProductPrice> getPrices() {
+ return prices;
+ }
+
+ public void setPrices(Set<ProductPrice> prices) {
+ this.prices = prices;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/description/ProductDescription.java b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/description/ProductDescription.java
index f598a44..be90053 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/description/ProductDescription.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/description/ProductDescription.java
@@ -9,7 +9,7 @@ import javax.persistence.UniqueConstraint;
import com.salesmanager.core.constants.SchemaConstant;
import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.common.Description;
+import com.salesmanager.core.model.common.description.Description;
@Entity
@Table(name = "PRODUCT_DESCRIPTION", schema=SchemaConstant.SALESMANAGER_SCHEMA, uniqueConstraints={
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/file/ProductImageSize.java b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/file/ProductImageSize.java
index c58b366..a3b8b97 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/file/ProductImageSize.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/file/ProductImageSize.java
@@ -1,10 +1,10 @@
-package com.salesmanager.core.model.catalog.product.file;
-
-public enum ProductImageSize {
-
- LARGE,
- SMALL
-
-
-
-}
+package com.salesmanager.core.model.catalog.product.file;
+
+public enum ProductImageSize {
+
+ LARGE,
+ SMALL
+
+
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/image/ProductImage.java b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/image/ProductImage.java
index cb7d06d..dbe6d6d 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/image/ProductImage.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/image/ProductImage.java
@@ -1,149 +1,149 @@
-package com.salesmanager.core.model.catalog.product.image;
-
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Transient;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.generic.SalesManagerEntity;
-
-@Entity
-@Table(name = "PRODUCT_IMAGE", schema=SchemaConstant.SALESMANAGER_SCHEMA)
-public class ProductImage extends SalesManagerEntity<Long, ProductImage> {
- private static final long serialVersionUID = 247514890386076337L;
-
- @Id
- @Column(name = "PRODUCT_IMAGE_ID")
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "PRODUCT_IMG_SEQ_NEXT_VAL")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long id;
-
- @OneToMany(fetch = FetchType.LAZY, mappedBy = "productImage", cascade = CascadeType.ALL)
- private List<ProductImageDescription> descriptions = new ArrayList<ProductImageDescription>();
-
-
- @Column(name = "PRODUCT_IMAGE")
- private String productImage;
-
- @Column(name = "DEFAULT_IMAGE")
- private boolean defaultImage = true;
-
- /**
- * default to 0 for images managed by the system
- */
- @Column(name = "IMAGE_TYPE")
- private int imageType;
-
- /**
- * Refers to images not accessible through the system. It may also be a video.
- */
- @Column(name = "PRODUCT_IMAGE_URL")
- private String productImageUrl;
-
-
- @Column(name = "IMAGE_CROP")
- private boolean imageCrop;
-
- @ManyToOne(targetEntity = Product.class)
- @JoinColumn(name = "PRODUCT_ID", nullable = false)
- private Product product;
-
- @Transient
- private InputStream image = null;
-
- //private MultiPartFile image
-
- public ProductImage(){
- }
-
- public String getProductImage() {
- return productImage;
- }
-
- public void setProductImage(String productImage) {
- this.productImage = productImage;
- }
-
- public boolean isDefaultImage() {
- return defaultImage;
- }
-
- public void setDefaultImage(boolean defaultImage) {
- this.defaultImage = defaultImage;
- }
-
- public int getImageType() {
- return imageType;
- }
-
- public void setImageType(int imageType) {
- this.imageType = imageType;
- }
-
- public boolean isImageCrop() {
- return imageCrop;
- }
-
- public void setImageCrop(boolean imageCrop) {
- this.imageCrop = imageCrop;
- }
-
- @Override
- public Long getId() {
- return id;
- }
-
- @Override
- public void setId(Long id) {
- this.id = id;
- }
-
- public Product getProduct() {
- return product;
- }
-
- public void setProduct(Product product) {
- this.product = product;
- }
-
- public void setDescriptions(List<ProductImageDescription> descriptions) {
- this.descriptions = descriptions;
- }
-
- public List<ProductImageDescription> getDescriptions() {
- return descriptions;
- }
-
- public InputStream getImage() {
- return image;
- }
-
- public void setImage(InputStream image) {
- this.image = image;
- }
-
- public String getProductImageUrl() {
- return productImageUrl;
- }
-
- public void setProductImageUrl(String productImageUrl) {
- this.productImageUrl = productImageUrl;
- }
-
-
-}
+package com.salesmanager.core.model.catalog.product.image;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Transient;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+
+@Entity
+@Table(name = "PRODUCT_IMAGE", schema=SchemaConstant.SALESMANAGER_SCHEMA)
+public class ProductImage extends SalesManagerEntity<Long, ProductImage> {
+ private static final long serialVersionUID = 247514890386076337L;
+
+ @Id
+ @Column(name = "PRODUCT_IMAGE_ID")
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "PRODUCT_IMG_SEQ_NEXT_VAL")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+ @OneToMany(fetch = FetchType.LAZY, mappedBy = "productImage", cascade = CascadeType.ALL)
+ private List<ProductImageDescription> descriptions = new ArrayList<ProductImageDescription>();
+
+
+ @Column(name = "PRODUCT_IMAGE")
+ private String productImage;
+
+ @Column(name = "DEFAULT_IMAGE")
+ private boolean defaultImage = true;
+
+ /**
+ * default to 0 for images managed by the system
+ */
+ @Column(name = "IMAGE_TYPE")
+ private int imageType;
+
+ /**
+ * Refers to images not accessible through the system. It may also be a video.
+ */
+ @Column(name = "PRODUCT_IMAGE_URL")
+ private String productImageUrl;
+
+
+ @Column(name = "IMAGE_CROP")
+ private boolean imageCrop;
+
+ @ManyToOne(targetEntity = Product.class)
+ @JoinColumn(name = "PRODUCT_ID", nullable = false)
+ private Product product;
+
+ @Transient
+ private InputStream image = null;
+
+ //private MultiPartFile image
+
+ public ProductImage(){
+ }
+
+ public String getProductImage() {
+ return productImage;
+ }
+
+ public void setProductImage(String productImage) {
+ this.productImage = productImage;
+ }
+
+ public boolean isDefaultImage() {
+ return defaultImage;
+ }
+
+ public void setDefaultImage(boolean defaultImage) {
+ this.defaultImage = defaultImage;
+ }
+
+ public int getImageType() {
+ return imageType;
+ }
+
+ public void setImageType(int imageType) {
+ this.imageType = imageType;
+ }
+
+ public boolean isImageCrop() {
+ return imageCrop;
+ }
+
+ public void setImageCrop(boolean imageCrop) {
+ this.imageCrop = imageCrop;
+ }
+
+ @Override
+ public Long getId() {
+ return id;
+ }
+
+ @Override
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Product getProduct() {
+ return product;
+ }
+
+ public void setProduct(Product product) {
+ this.product = product;
+ }
+
+ public void setDescriptions(List<ProductImageDescription> descriptions) {
+ this.descriptions = descriptions;
+ }
+
+ public List<ProductImageDescription> getDescriptions() {
+ return descriptions;
+ }
+
+ public InputStream getImage() {
+ return image;
+ }
+
+ public void setImage(InputStream image) {
+ this.image = image;
+ }
+
+ public String getProductImageUrl() {
+ return productImageUrl;
+ }
+
+ public void setProductImageUrl(String productImageUrl) {
+ this.productImageUrl = productImageUrl;
+ }
+
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/image/ProductImageDescription.java b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/image/ProductImageDescription.java
index 805b4ed..822e104 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/image/ProductImageDescription.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/image/ProductImageDescription.java
@@ -1,48 +1,48 @@
-package com.salesmanager.core.model.catalog.product.image;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.UniqueConstraint;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.common.Description;
-
-@Entity
-@Table(name="PRODUCT_IMAGE_DESCRIPTION", schema=SchemaConstant.SALESMANAGER_SCHEMA, uniqueConstraints={
- @UniqueConstraint(columnNames={
- "PRODUCT_IMAGE_ID",
- "LANGUAGE_ID"
- })
- }
-)
-public class ProductImageDescription extends Description {
- private static final long serialVersionUID = 247514890386076337L;
-
- @ManyToOne(targetEntity = ProductImage.class)
- @JoinColumn(name = "PRODUCT_IMAGE_ID", nullable = false)
- private ProductImage productImage;
-
- @Column(name="ALT_TAG", length=100)
- private String altTag;
-
- public ProductImage getProductImage() {
- return productImage;
- }
-
- public void setProductImage(ProductImage productImage) {
- this.productImage = productImage;
- }
-
- public String getAltTag() {
- return altTag;
- }
-
- public void setAltTag(String altTag) {
- this.altTag = altTag;
- }
-
-
-}
+package com.salesmanager.core.model.catalog.product.image;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.common.description.Description;
+
+@Entity
+@Table(name="PRODUCT_IMAGE_DESCRIPTION", schema=SchemaConstant.SALESMANAGER_SCHEMA, uniqueConstraints={
+ @UniqueConstraint(columnNames={
+ "PRODUCT_IMAGE_ID",
+ "LANGUAGE_ID"
+ })
+ }
+)
+public class ProductImageDescription extends Description {
+ private static final long serialVersionUID = 247514890386076337L;
+
+ @ManyToOne(targetEntity = ProductImage.class)
+ @JoinColumn(name = "PRODUCT_IMAGE_ID", nullable = false)
+ private ProductImage productImage;
+
+ @Column(name="ALT_TAG", length=100)
+ private String altTag;
+
+ public ProductImage getProductImage() {
+ return productImage;
+ }
+
+ public void setProductImage(ProductImage productImage) {
+ this.productImage = productImage;
+ }
+
+ public String getAltTag() {
+ return altTag;
+ }
+
+ public void setAltTag(String altTag) {
+ this.altTag = altTag;
+ }
+
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/manufacturer/ManufacturerDescription.java b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/manufacturer/ManufacturerDescription.java
index 8e6240b..73b7ca0 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/manufacturer/ManufacturerDescription.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/manufacturer/ManufacturerDescription.java
@@ -10,7 +10,7 @@ import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.common.Description;
+import com.salesmanager.core.model.common.description.Description;
@Entity
@Table(name = "MANUFACTURER_DESCRIPTION", schema=SchemaConstant.SALESMANAGER_SCHEMA, uniqueConstraints={
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/price/FinalPrice.java b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/price/FinalPrice.java
index ed2e5fb..8f4b9c6 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/price/FinalPrice.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/price/FinalPrice.java
@@ -1,107 +1,107 @@
-package com.salesmanager.core.model.catalog.product.price;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.Date;
-import java.util.List;
-
-/**
- * Transient entity used to display
- * different price information in the catalogue
- * @author Carl Samson
- *
- */
-public class FinalPrice implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private BigDecimal discountedPrice = null;//final price if a discount is applied
- private BigDecimal originalPrice = null;//original price
- private BigDecimal finalPrice = null;//final price discount or not
- private boolean discounted = false;
- private int discountPercent = 0;
-
- private Date discountEndDate = null;
-
- private boolean defaultPrice;
- private ProductPrice productPrice;
- List<FinalPrice> additionalPrices;
-
- public List<FinalPrice> getAdditionalPrices() {
- return additionalPrices;
- }
-
- public void setAdditionalPrices(List<FinalPrice> additionalPrices) {
- this.additionalPrices = additionalPrices;
- }
-
- public BigDecimal getOriginalPrice() {
- return originalPrice;
- }
-
- public void setOriginalPrice(BigDecimal originalPrice) {
- this.originalPrice = originalPrice;
- }
-
-
-
- public int getDiscountPercent() {
- return discountPercent;
- }
-
- public void setDiscountPercent(int discountPercent) {
- this.discountPercent = discountPercent;
- }
-
- public Date getDiscountEndDate() {
- return discountEndDate;
- }
-
- public void setDiscountEndDate(Date discountEndDate) {
- this.discountEndDate = discountEndDate;
- }
-
- public boolean isDiscounted() {
- return discounted;
- }
-
- public void setDiscounted(boolean discounted) {
- this.discounted = discounted;
- }
-
- public void setDiscountedPrice(BigDecimal discountedPrice) {
- this.discountedPrice = discountedPrice;
- }
-
- public BigDecimal getDiscountedPrice() {
- return discountedPrice;
- }
-
-
- public void setFinalPrice(BigDecimal finalPrice) {
- this.finalPrice = finalPrice;
- }
-
- public BigDecimal getFinalPrice() {
- return finalPrice;
- }
-
- public void setDefaultPrice(boolean defaultPrice) {
- this.defaultPrice = defaultPrice;
- }
-
- public boolean isDefaultPrice() {
- return defaultPrice;
- }
-
- public void setProductPrice(ProductPrice productPrice) {
- this.productPrice = productPrice;
- }
-
- public ProductPrice getProductPrice() {
- return productPrice;
- }
-
-}
+package com.salesmanager.core.model.catalog.product.price;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Transient entity used to display
+ * different price information in the catalogue
+ * @author Carl Samson
+ *
+ */
+public class FinalPrice implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private BigDecimal discountedPrice = null;//final price if a discount is applied
+ private BigDecimal originalPrice = null;//original price
+ private BigDecimal finalPrice = null;//final price discount or not
+ private boolean discounted = false;
+ private int discountPercent = 0;
+
+ private Date discountEndDate = null;
+
+ private boolean defaultPrice;
+ private ProductPrice productPrice;
+ List<FinalPrice> additionalPrices;
+
+ public List<FinalPrice> getAdditionalPrices() {
+ return additionalPrices;
+ }
+
+ public void setAdditionalPrices(List<FinalPrice> additionalPrices) {
+ this.additionalPrices = additionalPrices;
+ }
+
+ public BigDecimal getOriginalPrice() {
+ return originalPrice;
+ }
+
+ public void setOriginalPrice(BigDecimal originalPrice) {
+ this.originalPrice = originalPrice;
+ }
+
+
+
+ public int getDiscountPercent() {
+ return discountPercent;
+ }
+
+ public void setDiscountPercent(int discountPercent) {
+ this.discountPercent = discountPercent;
+ }
+
+ public Date getDiscountEndDate() {
+ return discountEndDate;
+ }
+
+ public void setDiscountEndDate(Date discountEndDate) {
+ this.discountEndDate = discountEndDate;
+ }
+
+ public boolean isDiscounted() {
+ return discounted;
+ }
+
+ public void setDiscounted(boolean discounted) {
+ this.discounted = discounted;
+ }
+
+ public void setDiscountedPrice(BigDecimal discountedPrice) {
+ this.discountedPrice = discountedPrice;
+ }
+
+ public BigDecimal getDiscountedPrice() {
+ return discountedPrice;
+ }
+
+
+ public void setFinalPrice(BigDecimal finalPrice) {
+ this.finalPrice = finalPrice;
+ }
+
+ public BigDecimal getFinalPrice() {
+ return finalPrice;
+ }
+
+ public void setDefaultPrice(boolean defaultPrice) {
+ this.defaultPrice = defaultPrice;
+ }
+
+ public boolean isDefaultPrice() {
+ return defaultPrice;
+ }
+
+ public void setProductPrice(ProductPrice productPrice) {
+ this.productPrice = productPrice;
+ }
+
+ public ProductPrice getProductPrice() {
+ return productPrice;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/price/ProductPriceDescription.java b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/price/ProductPriceDescription.java
index f8129a2..727f49e 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/price/ProductPriceDescription.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/price/ProductPriceDescription.java
@@ -7,7 +7,7 @@ import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.common.Description;
+import com.salesmanager.core.model.common.description.Description;
@Entity
@Table(name="PRODUCT_PRICE_DESCRIPTION", schema=SchemaConstant.SALESMANAGER_SCHEMA, uniqueConstraints={
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/price/ProductPriceType.java b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/price/ProductPriceType.java
index 430805b..eed7b05 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/price/ProductPriceType.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/price/ProductPriceType.java
@@ -1,7 +1,7 @@
-package com.salesmanager.core.model.catalog.product.price;
-
-public enum ProductPriceType {
-
- ONE_TIME, MONTHLY
-
-}
+package com.salesmanager.core.model.catalog.product.price;
+
+public enum ProductPriceType {
+
+ ONE_TIME, MONTHLY
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/Product.java b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/Product.java
index 94fa0fe..a053ca4 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/Product.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/Product.java
@@ -41,6 +41,7 @@ import com.salesmanager.core.model.catalog.product.type.ProductType;
import com.salesmanager.core.model.common.audit.AuditListener;
import com.salesmanager.core.model.common.audit.AuditSection;
import com.salesmanager.core.model.common.audit.Auditable;
+import com.salesmanager.core.model.customer.Customer;
import com.salesmanager.core.model.generic.SalesManagerEntity;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.tax.taxclass.TaxClass;
@@ -166,6 +167,48 @@ public class Product extends SalesManagerEntity<Long, Product> implements Audita
*/
@Column(name = "REF_SKU")
private String refSku;
+
+ @Column(name="COND", nullable = true)
+ private ProductCondition condition;
+
+ /**
+ * RENTAL ADDITIONAL FIELDS
+ */
+
+ @Column(name="RENTAL_STATUS", nullable = true)
+ private RentalStatus rentalStatus;
+
+
+ @Column(name="RENTAL_DURATION", nullable = true)
+ private Integer rentalDuration;
+
+ @Column(name="RENTAL_PERIOD", nullable = true)
+ private Integer rentalPeriod;
+
+
+ public Integer getRentalPeriod() {
+ return rentalPeriod;
+ }
+
+ public void setRentalPeriod(Integer rentalPeriod) {
+ this.rentalPeriod = rentalPeriod;
+ }
+
+ public Integer getRentalDuration() {
+ return rentalDuration;
+ }
+
+ public void setRentalDuration(Integer rentalDuration) {
+ this.rentalDuration = rentalDuration;
+ }
+
+ /**
+ * End rental fields
+ */
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name="CUSTOMER_ID", nullable=true)
+ private Customer owner;
public Product() {
}
@@ -440,5 +483,31 @@ public class Product extends SalesManagerEntity<Long, Product> implements Audita
this.refSku = refSku;
}
+ public ProductCondition getCondition() {
+ return condition;
+ }
+
+ public void setCondition(ProductCondition condition) {
+ this.condition = condition;
+ }
+
+ public RentalStatus getRentalStatus() {
+ return rentalStatus;
+ }
+
+ public void setRentalStatus(RentalStatus rentalStatus) {
+ this.rentalStatus = rentalStatus;
+ }
+
+ public Customer getOwner() {
+ return owner;
+ }
+
+ public void setOwner(Customer owner) {
+ this.owner = owner;
+ }
+
+
+
}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/ProductCondition.java b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/ProductCondition.java
new file mode 100644
index 0000000..b12f691
--- /dev/null
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/ProductCondition.java
@@ -0,0 +1,7 @@
+package com.salesmanager.core.model.catalog.product;
+
+public enum ProductCondition {
+
+ NEW, USED
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/ProductCriteria.java b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/ProductCriteria.java
index 1b5cf44..7fb3066 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/ProductCriteria.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/ProductCriteria.java
@@ -18,7 +18,11 @@ public class ProductCriteria extends Criteria {
private List<String> availabilities;
private List<Long> productIds;
+ private String status;
+
private Long manufacturerId = null;
+
+ private Long ownerId = null;
public String getProductName() {
return productName;
@@ -77,6 +81,22 @@ public class ProductCriteria extends Criteria {
return manufacturerId;
}
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public Long getOwnerId() {
+ return ownerId;
+ }
+
+ public void setOwnerId(Long ownerId) {
+ this.ownerId = ownerId;
+ }
+
}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/relationship/ProductRelationshipType.java b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/relationship/ProductRelationshipType.java
index 18edd11..cc49a24 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/relationship/ProductRelationshipType.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/relationship/ProductRelationshipType.java
@@ -1,7 +1,7 @@
-package com.salesmanager.core.model.catalog.product.relationship;
-
-public enum ProductRelationshipType {
-
- FEATURED_ITEM, RELATED_ITEM, BUNDLED_ITEM
-
-}
+package com.salesmanager.core.model.catalog.product.relationship;
+
+public enum ProductRelationshipType {
+
+ FEATURED_ITEM, RELATED_ITEM, BUNDLED_ITEM
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/RentalStatus.java b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/RentalStatus.java
new file mode 100644
index 0000000..5e5ed3c
--- /dev/null
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/RentalStatus.java
@@ -0,0 +1,7 @@
+package com.salesmanager.core.model.catalog.product;
+
+public enum RentalStatus {
+
+ RENTED, AVAILABLE
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/review/ProductReview.java b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/review/ProductReview.java
index 1de3104..49b685f 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/review/ProductReview.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/review/ProductReview.java
@@ -1,150 +1,157 @@
-package com.salesmanager.core.model.catalog.product.review;
-
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Embedded;
-import javax.persistence.Entity;
-import javax.persistence.EntityListeners;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.common.audit.AuditListener;
-import com.salesmanager.core.model.common.audit.AuditSection;
-import com.salesmanager.core.model.common.audit.Auditable;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.generic.SalesManagerEntity;
-
-@Entity
-@EntityListeners(value = AuditListener.class)
-@Table(name = "PRODUCT_REVIEW", schema=SchemaConstant.SALESMANAGER_SCHEMA)
-public class ProductReview extends SalesManagerEntity<Long, ProductReview> implements Auditable {
- private static final long serialVersionUID = -7509351278087554383L;
-
- @Id
- @Column(name = "PRODUCT_REVIEW_ID", unique=true, nullable=false)
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT",
- pkColumnValue = "PRODUCT_REVIEW_SEQ_NEXT_VAL")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long id;
-
- @Embedded
- private AuditSection audit = new AuditSection();
-
- @Column(name = "REVIEWS_RATING")
- private Double reviewRating;
-
- @Column(name = "REVIEWS_READ")
- private Long reviewRead;
-
- @Temporal(TemporalType.TIMESTAMP)
- @Column(name = "REVIEW_DATE")
- private Date reviewDate;
-
- @Column(name = "STATUS")
- private Integer status;
-
- @ManyToOne
- @JoinColumn(name="CUSTOMERS_ID")
- private Customer customer;
-
- @OneToOne
- @JoinColumn(name="PRODUCT_ID")
- private Product product;
-
- @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "productReview")
- private Set<ProductReviewDescription> descriptions = new HashSet<ProductReviewDescription>();
-
- public ProductReview() {
- }
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public Double getReviewRating() {
- return reviewRating;
- }
-
- public void setReviewRating(Double reviewRating) {
- this.reviewRating = reviewRating;
- }
-
- public Long getReviewRead() {
- return reviewRead;
- }
-
- public void setReviewRead(Long reviewRead) {
- this.reviewRead = reviewRead;
- }
-
- public Integer getStatus() {
- return status;
- }
-
- public void setStatus(Integer status) {
- this.status = status;
- }
-
- public Customer getCustomer() {
- return customer;
- }
-
- public void setCustomer(Customer customer) {
- this.customer = customer;
- }
-
- public Product getProduct() {
- return product;
- }
-
- public void setProduct(Product product) {
- this.product = product;
- }
-
- public Set<ProductReviewDescription> getDescriptions() {
- return descriptions;
- }
-
- public void setDescriptions(Set<ProductReviewDescription> descriptions) {
- this.descriptions = descriptions;
- }
-
- @Override
- public AuditSection getAuditSection() {
- return audit;
- }
-
- @Override
- public void setAuditSection(AuditSection audit) {
- this.audit = audit;
- }
-
- public Date getReviewDate() {
- return reviewDate;
- }
-
- public void setReviewDate(Date reviewDate) {
- this.reviewDate = reviewDate;
- }
-
-}
+package com.salesmanager.core.model.catalog.product.review;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.EntityListeners;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.persistence.UniqueConstraint;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.common.audit.AuditListener;
+import com.salesmanager.core.model.common.audit.AuditSection;
+import com.salesmanager.core.model.common.audit.Auditable;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+
+@Entity
+@EntityListeners(value = AuditListener.class)
+@Table(name = "PRODUCT_REVIEW", schema=SchemaConstant.SALESMANAGER_SCHEMA, uniqueConstraints={
+ @UniqueConstraint(columnNames={
+ "CUSTOMERS_ID",
+ "PRODUCT_ID"
+ })
+ }
+)
+public class ProductReview extends SalesManagerEntity<Long, ProductReview> implements Auditable {
+ private static final long serialVersionUID = -7509351278087554383L;
+
+ @Id
+ @Column(name = "PRODUCT_REVIEW_ID", unique=true, nullable=false)
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT",
+ pkColumnValue = "PRODUCT_REVIEW_SEQ_NEXT_VAL")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+ @Embedded
+ private AuditSection audit = new AuditSection();
+
+ @Column(name = "REVIEWS_RATING")
+ private Double reviewRating;
+
+ @Column(name = "REVIEWS_READ")
+ private Long reviewRead;
+
+ @Temporal(TemporalType.TIMESTAMP)
+ @Column(name = "REVIEW_DATE")
+ private Date reviewDate;
+
+ @Column(name = "STATUS")
+ private Integer status;
+
+ @ManyToOne
+ @JoinColumn(name="CUSTOMERS_ID")
+ private Customer customer;
+
+ @OneToOne
+ @JoinColumn(name="PRODUCT_ID")
+ private Product product;
+
+ @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "productReview")
+ private Set<ProductReviewDescription> descriptions = new HashSet<ProductReviewDescription>();
+
+ public ProductReview() {
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Double getReviewRating() {
+ return reviewRating;
+ }
+
+ public void setReviewRating(Double reviewRating) {
+ this.reviewRating = reviewRating;
+ }
+
+ public Long getReviewRead() {
+ return reviewRead;
+ }
+
+ public void setReviewRead(Long reviewRead) {
+ this.reviewRead = reviewRead;
+ }
+
+ public Integer getStatus() {
+ return status;
+ }
+
+ public void setStatus(Integer status) {
+ this.status = status;
+ }
+
+ public Customer getCustomer() {
+ return customer;
+ }
+
+ public void setCustomer(Customer customer) {
+ this.customer = customer;
+ }
+
+ public Product getProduct() {
+ return product;
+ }
+
+ public void setProduct(Product product) {
+ this.product = product;
+ }
+
+ public Set<ProductReviewDescription> getDescriptions() {
+ return descriptions;
+ }
+
+ public void setDescriptions(Set<ProductReviewDescription> descriptions) {
+ this.descriptions = descriptions;
+ }
+
+ @Override
+ public AuditSection getAuditSection() {
+ return audit;
+ }
+
+ @Override
+ public void setAuditSection(AuditSection audit) {
+ this.audit = audit;
+ }
+
+ public Date getReviewDate() {
+ return reviewDate;
+ }
+
+ public void setReviewDate(Date reviewDate) {
+ this.reviewDate = reviewDate;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/review/ProductReviewDescription.java b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/review/ProductReviewDescription.java
index 8a04992..c6b4c6f 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/review/ProductReviewDescription.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/catalog/product/review/ProductReviewDescription.java
@@ -21,7 +21,7 @@ import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.common.Description;
+import com.salesmanager.core.model.common.description.Description;
import com.salesmanager.core.model.reference.language.Language;
@Entity
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/common/Address.java b/sm-core-model/src/main/java/com/salesmanager/core/model/common/Address.java
index d771eba..a1b44ff 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/common/Address.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/common/Address.java
@@ -1,62 +1,62 @@
-package com.salesmanager.core.model.common;
-
-import java.io.Serializable;
-
-
-public class Address implements Serializable {
-
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String city;
- private String postalCode;
- private String stateProvince;
- private String zone;//code
- private String country;//code
-
- public void setStateProvince(String stateProvince) {
- this.stateProvince = stateProvince;
- }
-
- public void setCountry(String country) {
- this.country = country;
- }
-
-
- public String getCity() {
- return city;
- }
-
- public void setCity(String city) {
- this.city = city;
- }
-
- public String getPostalCode() {
- return postalCode;
- }
-
- public void setPostalCode(String postalCode) {
- this.postalCode = postalCode;
- }
-
- public String getStateProvince() {
- return stateProvince;
- }
-
- public String getCountry() {
- return country;
- }
-
- public void setZone(String zone) {
- this.zone = zone;
- }
-
- public String getZone() {
- return zone;
- }
-
-
-
-}
+package com.salesmanager.core.model.common;
+
+import java.io.Serializable;
+
+
+public class Address implements Serializable {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String city;
+ private String postalCode;
+ private String stateProvince;
+ private String zone;//code
+ private String country;//code
+
+ public void setStateProvince(String stateProvince) {
+ this.stateProvince = stateProvince;
+ }
+
+ public void setCountry(String country) {
+ this.country = country;
+ }
+
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public String getPostalCode() {
+ return postalCode;
+ }
+
+ public void setPostalCode(String postalCode) {
+ this.postalCode = postalCode;
+ }
+
+ public String getStateProvince() {
+ return stateProvince;
+ }
+
+ public String getCountry() {
+ return country;
+ }
+
+ public void setZone(String zone) {
+ this.zone = zone;
+ }
+
+ public String getZone() {
+ return zone;
+ }
+
+
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/common/audit/AuditSection.java b/sm-core-model/src/main/java/com/salesmanager/core/model/common/audit/AuditSection.java
index 400e9e1..bd0903e 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/common/audit/AuditSection.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/common/audit/AuditSection.java
@@ -11,7 +11,6 @@ import javax.persistence.TemporalType;
import com.salesmanager.core.utils.CloneUtils;
@Embeddable
-//@org.hibernate.annotations.Entity(dynamicUpdate = true, dynamicInsert = true)
public class AuditSection implements Serializable {
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/common/Billing.java b/sm-core-model/src/main/java/com/salesmanager/core/model/common/Billing.java
index 2d5157a..7aa080b 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/common/Billing.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/common/Billing.java
@@ -1,139 +1,161 @@
-package com.salesmanager.core.model.common;
-
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.persistence.FetchType;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-
-import org.hibernate.validator.constraints.NotEmpty;
-
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.zone.Zone;
-
-@Embeddable
-public class Billing {
-
- @NotEmpty
- @Column (name ="BILLING_LAST_NAME", length=64, nullable=false)
- private String lastName;
-
- @NotEmpty
- @Column (name ="BILLING_FIRST_NAME", length=64, nullable=false)
- private String firstName;
-
-
-
- @Column (name ="BILLING_COMPANY", length=100)
- private String company;
-
- @Column (name ="BILLING_STREET_ADDRESS", length=256)
- private String address;
-
-
- @Column (name ="BILLING_CITY", length=100)
- private String city;
-
- @Column (name ="BILLING_POSTCODE", length=20)
- private String postalCode;
-
- @Column(name="BILLING_TELEPHONE", length=32)
- private String telephone;
-
- @Column (name ="BILLING_STATE", length=100)
- private String state;
-
-
- @ManyToOne(fetch = FetchType.EAGER, targetEntity = Country.class)
- @JoinColumn(name="BILLING_COUNTRY_ID", nullable=false)
- private Country country;
-
-
- @ManyToOne(fetch = FetchType.EAGER, targetEntity = Zone.class)
- @JoinColumn(name="BILLING_ZONE_ID", nullable=true)
- private Zone zone;
-
-
-
- public String getCompany() {
- return company;
- }
-
- public void setCompany(String company) {
- this.company = company;
- }
-
- public String getAddress() {
- return address;
- }
-
- public void setAddress(String address) {
- this.address = address;
- }
-
- public String getCity() {
- return city;
- }
-
- public void setCity(String city) {
- this.city = city;
- }
-
- public String getPostalCode() {
- return postalCode;
- }
-
- public void setPostalCode(String postalCode) {
- this.postalCode = postalCode;
- }
-
- public Country getCountry() {
- return country;
- }
-
- public void setCountry(Country country) {
- this.country = country;
- }
-
- public Zone getZone() {
- return zone;
- }
-
- public void setZone(Zone zone) {
- this.zone = zone;
- }
-
- public String getState() {
- return state;
- }
-
- public void setState(String state) {
- this.state = state;
- }
-
- public void setTelephone(String telephone) {
- this.telephone = telephone;
- }
-
- public String getTelephone() {
- return telephone;
- }
-
-
- public String getLastName() {
- return lastName;
- }
-
- public void setLastName(String lastName) {
- this.lastName = lastName;
- }
-
- public String getFirstName() {
- return firstName;
- }
-
- public void setFirstName(String firstName) {
- this.firstName = firstName;
- }
-
-}
+package com.salesmanager.core.model.common;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import javax.persistence.FetchType;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.validator.constraints.NotEmpty;
+
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.zone.Zone;
+
+@Embeddable
+public class Billing {
+
+ @NotEmpty
+ @Column (name ="BILLING_LAST_NAME", length=64, nullable=false)
+ private String lastName;
+
+ @NotEmpty
+ @Column (name ="BILLING_FIRST_NAME", length=64, nullable=false)
+ private String firstName;
+
+
+
+ @Column (name ="BILLING_COMPANY", length=100)
+ private String company;
+
+ @Column (name ="BILLING_STREET_ADDRESS", length=256)
+ private String address;
+
+
+ @Column (name ="BILLING_CITY", length=100)
+ private String city;
+
+ @Column (name ="BILLING_POSTCODE", length=20)
+ private String postalCode;
+
+ @Column(name="BILLING_TELEPHONE", length=32)
+ private String telephone;
+
+ @Column (name ="BILLING_STATE", length=100)
+ private String state;
+
+ @Column (name ="LONGITUDE", length=100)
+ private String longitude;
+
+ @Column (name ="LATITUDE", length=100)
+ private String latitude;
+
+
+ @ManyToOne(fetch = FetchType.EAGER, targetEntity = Country.class)
+ @JoinColumn(name="BILLING_COUNTRY_ID", nullable=false)
+ private Country country;
+
+
+ @ManyToOne(fetch = FetchType.EAGER, targetEntity = Zone.class)
+ @JoinColumn(name="BILLING_ZONE_ID", nullable=true)
+ private Zone zone;
+
+
+
+ public String getCompany() {
+ return company;
+ }
+
+ public void setCompany(String company) {
+ this.company = company;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public String getPostalCode() {
+ return postalCode;
+ }
+
+ public void setPostalCode(String postalCode) {
+ this.postalCode = postalCode;
+ }
+
+ public Country getCountry() {
+ return country;
+ }
+
+ public void setCountry(Country country) {
+ this.country = country;
+ }
+
+ public Zone getZone() {
+ return zone;
+ }
+
+ public void setZone(Zone zone) {
+ this.zone = zone;
+ }
+
+ public String getState() {
+ return state;
+ }
+
+ public void setState(String state) {
+ this.state = state;
+ }
+
+ public void setTelephone(String telephone) {
+ this.telephone = telephone;
+ }
+
+ public String getTelephone() {
+ return telephone;
+ }
+
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLongitude() {
+ return longitude;
+ }
+
+ public void setLongitude(String longitude) {
+ this.longitude = longitude;
+ }
+
+ public String getLatitude() {
+ return latitude;
+ }
+
+ public void setLatitude(String latitude) {
+ this.latitude = latitude;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/common/Criteria.java b/sm-core-model/src/main/java/com/salesmanager/core/model/common/Criteria.java
index 6747446..1c642cc 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/common/Criteria.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/common/Criteria.java
@@ -2,10 +2,11 @@ package com.salesmanager.core.model.common;
public class Criteria {
+
private int startIndex = 0;
private int maxCount = 0;
private String code;
-
+ private String language;
private CriteriaOrderBy orderBy = CriteriaOrderBy.DESC;
@@ -34,6 +35,12 @@ public class Criteria {
public CriteriaOrderBy getOrderBy() {
return orderBy;
}
+ public String getLanguage() {
+ return language;
+ }
+ public void setLanguage(String language) {
+ this.language = language;
+ }
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/common/CriteriaOrderBy.java b/sm-core-model/src/main/java/com/salesmanager/core/model/common/CriteriaOrderBy.java
index fd9caf4..c9e0c5f 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/common/CriteriaOrderBy.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/common/CriteriaOrderBy.java
@@ -1,7 +1,7 @@
-package com.salesmanager.core.model.common;
-
-public enum CriteriaOrderBy {
-
-
- ASC, DESC
-}
+package com.salesmanager.core.model.common;
+
+public enum CriteriaOrderBy {
+
+
+ ASC, DESC
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/common/Delivery.java b/sm-core-model/src/main/java/com/salesmanager/core/model/common/Delivery.java
index da4d5f9..d3892e6 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/common/Delivery.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/common/Delivery.java
@@ -1,160 +1,160 @@
-package com.salesmanager.core.model.common;
-
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.persistence.FetchType;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Transient;
-
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.zone.Zone;
-
-@Embeddable
-public class Delivery {
-
- @Column (name ="DELIVERY_LAST_NAME", length=64)
- private String lastName;
-
-
-
-
- @Column (name ="DELIVERY_FIRST_NAME", length=64)
- private String firstName;
-
-
-
-
- @Column (name ="DELIVERY_COMPANY", length=100)
- private String company;
-
- @Column (name ="DELIVERY_STREET_ADDRESS", length=256)
- private String address;
-
- @Column (name ="DELIVERY_CITY", length=100)
- private String city;
-
- @Column (name ="DELIVERY_POSTCODE", length=20)
- private String postalCode;
-
- @Column (name ="DELIVERY_STATE", length=100)
- private String state;
-
- @Column(name="DELIVERY_TELEPHONE", length=32)
- private String telephone;
-
- @ManyToOne(fetch = FetchType.EAGER, targetEntity = Country.class)
- @JoinColumn(name="DELIVERY_COUNTRY_ID", nullable=true)
- private Country country;
-
-
- @ManyToOne(fetch = FetchType.EAGER, targetEntity = Zone.class)
- @JoinColumn(name="DELIVERY_ZONE_ID", nullable=true)
- private Zone zone;
-
- @Transient
- private String latitude = null;
-
-
-
- @Transient
- private String longitude = null;
-
-
- public String getCompany() {
- return company;
- }
-
- public void setCompany(String company) {
- this.company = company;
- }
-
- public String getAddress() {
- return address;
- }
-
- public void setAddress(String address) {
- this.address = address;
- }
-
- public String getCity() {
- return city;
- }
-
- public void setCity(String city) {
- this.city = city;
- }
-
- public String getPostalCode() {
- return postalCode;
- }
-
- public void setPostalCode(String postalCode) {
- this.postalCode = postalCode;
- }
-
- public Country getCountry() {
- return country;
- }
-
- public void setCountry(Country country) {
- this.country = country;
- }
-
- public Zone getZone() {
- return zone;
- }
-
- public void setZone(Zone zone) {
- this.zone = zone;
- }
-
-
- public String getState() {
- return state;
- }
-
- public void setState(String state) {
- this.state = state;
- }
-
- public void setTelephone(String telephone) {
- this.telephone = telephone;
- }
-
- public String getTelephone() {
- return telephone;
- }
-
- public String getLastName() {
- return lastName;
- }
-
- public void setLastName(String lastName) {
- this.lastName = lastName;
- }
-
- public String getFirstName() {
- return firstName;
- }
-
- public void setFirstName(String firstName) {
- this.firstName = firstName;
- }
-
- public String getLatitude() {
- return latitude;
- }
-
- public void setLatitude(String latitude) {
- this.latitude = latitude;
- }
-
- public String getLongitude() {
- return longitude;
- }
-
- public void setLongitude(String longitude) {
- this.longitude = longitude;
- }
-}
+package com.salesmanager.core.model.common;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import javax.persistence.FetchType;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Transient;
+
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.zone.Zone;
+
+@Embeddable
+public class Delivery {
+
+ @Column (name ="DELIVERY_LAST_NAME", length=64)
+ private String lastName;
+
+
+
+
+ @Column (name ="DELIVERY_FIRST_NAME", length=64)
+ private String firstName;
+
+
+
+
+ @Column (name ="DELIVERY_COMPANY", length=100)
+ private String company;
+
+ @Column (name ="DELIVERY_STREET_ADDRESS", length=256)
+ private String address;
+
+ @Column (name ="DELIVERY_CITY", length=100)
+ private String city;
+
+ @Column (name ="DELIVERY_POSTCODE", length=20)
+ private String postalCode;
+
+ @Column (name ="DELIVERY_STATE", length=100)
+ private String state;
+
+ @Column(name="DELIVERY_TELEPHONE", length=32)
+ private String telephone;
+
+ @ManyToOne(fetch = FetchType.EAGER, targetEntity = Country.class)
+ @JoinColumn(name="DELIVERY_COUNTRY_ID", nullable=true)
+ private Country country;
+
+
+ @ManyToOne(fetch = FetchType.EAGER, targetEntity = Zone.class)
+ @JoinColumn(name="DELIVERY_ZONE_ID", nullable=true)
+ private Zone zone;
+
+ @Transient
+ private String latitude = null;
+
+
+
+ @Transient
+ private String longitude = null;
+
+
+ public String getCompany() {
+ return company;
+ }
+
+ public void setCompany(String company) {
+ this.company = company;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public String getPostalCode() {
+ return postalCode;
+ }
+
+ public void setPostalCode(String postalCode) {
+ this.postalCode = postalCode;
+ }
+
+ public Country getCountry() {
+ return country;
+ }
+
+ public void setCountry(Country country) {
+ this.country = country;
+ }
+
+ public Zone getZone() {
+ return zone;
+ }
+
+ public void setZone(Zone zone) {
+ this.zone = zone;
+ }
+
+
+ public String getState() {
+ return state;
+ }
+
+ public void setState(String state) {
+ this.state = state;
+ }
+
+ public void setTelephone(String telephone) {
+ this.telephone = telephone;
+ }
+
+ public String getTelephone() {
+ return telephone;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLatitude() {
+ return latitude;
+ }
+
+ public void setLatitude(String latitude) {
+ this.latitude = latitude;
+ }
+
+ public String getLongitude() {
+ return longitude;
+ }
+
+ public void setLongitude(String longitude) {
+ this.longitude = longitude;
+ }
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/common/description/Description.java b/sm-core-model/src/main/java/com/salesmanager/core/model/common/description/Description.java
new file mode 100644
index 0000000..a0d23b4
--- /dev/null
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/common/description/Description.java
@@ -0,0 +1,113 @@
+package com.salesmanager.core.model.common.description;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.EntityListeners;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.MappedSuperclass;
+import javax.persistence.TableGenerator;
+
+import org.hibernate.annotations.Type;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import com.salesmanager.core.model.common.audit.AuditListener;
+import com.salesmanager.core.model.common.audit.AuditSection;
+import com.salesmanager.core.model.common.audit.Auditable;
+import com.salesmanager.core.model.reference.language.Language;
+
+@MappedSuperclass
+@EntityListeners(value = AuditListener.class)
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public class Description implements Auditable, Serializable {
+ private static final long serialVersionUID = -4335863941736710046L;
+
+ @Id
+ @Column(name = "DESCRIPTION_ID")
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "DESCRIPTION_SEQ_NEXT_VAL")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+ @Embedded
+ private AuditSection auditSection = new AuditSection();
+
+ @ManyToOne(optional = false)
+ @JoinColumn(name = "LANGUAGE_ID")
+ private Language language;
+
+ @NotEmpty
+ @Column(name="NAME", nullable = false, length=120)
+ private String name;
+
+ @Column(name="TITLE", length=100)
+ private String title;
+
+ @Column(name="DESCRIPTION")
+ @Type(type = "org.hibernate.type.StringClobType")
+ private String description;
+
+ public Description() {
+ }
+
+ public Description(Language language, String name) {
+ this.setLanguage(language);
+ this.setName(name);
+ }
+
+ @Override
+ public AuditSection getAuditSection() {
+ return auditSection;
+ }
+
+ @Override
+ public void setAuditSection(AuditSection auditSection) {
+ this.auditSection = auditSection;
+ }
+
+ public Language getLanguage() {
+ return language;
+ }
+
+ public void setLanguage(Language language) {
+ this.language = language;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/common/EntityList.java b/sm-core-model/src/main/java/com/salesmanager/core/model/common/EntityList.java
index 461bc90..cec81b2 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/common/EntityList.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/common/EntityList.java
@@ -1,21 +1,21 @@
-package com.salesmanager.core.model.common;
-
-import java.io.Serializable;
-
-public class EntityList implements Serializable {
-
-
- /**
- *
- */
- private static final long serialVersionUID = 6135941880202635567L;
- private int totalCount;
-
- public int getTotalCount() {
- return totalCount;
- }
- public void setTotalCount(int totalCount) {
- this.totalCount = totalCount;
- }
-
-}
+package com.salesmanager.core.model.common;
+
+import java.io.Serializable;
+
+public class EntityList implements Serializable {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 6135941880202635567L;
+ private int totalCount;
+
+ public int getTotalCount() {
+ return totalCount;
+ }
+ public void setTotalCount(int totalCount) {
+ this.totalCount = totalCount;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/content/Content.java b/sm-core-model/src/main/java/com/salesmanager/core/model/content/Content.java
index 5b686b0..33683e0 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/content/Content.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/content/Content.java
@@ -1,182 +1,194 @@
-package com.salesmanager.core.model.content;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Embedded;
-import javax.persistence.Entity;
-import javax.persistence.EntityListeners;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.UniqueConstraint;
-import javax.validation.Valid;
-
-import org.hibernate.validator.constraints.NotEmpty;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.common.audit.AuditListener;
-import com.salesmanager.core.model.common.audit.AuditSection;
-import com.salesmanager.core.model.generic.SalesManagerEntity;
-import com.salesmanager.core.model.merchant.MerchantStore;
-
-
-@Entity
-@EntityListeners(value = AuditListener.class)
-@Table(name = "CONTENT", schema= SchemaConstant.SALESMANAGER_SCHEMA,uniqueConstraints=
- @UniqueConstraint(columnNames = {"MERCHANT_ID", "CODE"}) )
-public class Content extends SalesManagerEntity<Long, Content> implements Serializable {
-
-
-
- private static final long serialVersionUID = 1772757159185494620L;
-
- @Id
- @Column(name = "CONTENT_ID", unique=true, nullable=false)
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "CONTENT_SEQ_NEXT_VAL")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long id;
-
- @Embedded
- private AuditSection auditSection = new AuditSection();
-
- @Valid
- @OneToMany(mappedBy="content", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
- private List<ContentDescription> descriptions = new ArrayList<ContentDescription>();
-
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name="MERCHANT_ID", nullable=false)
- private MerchantStore merchantStore;
-
- @NotEmpty
- @Column(name="CODE", length=100, nullable=false)
- private String code;
-
- @Column(name = "VISIBLE")
- private boolean visible;
-
- @Column(name = "CONTENT_POSITION", length=10, nullable=true)
- @Enumerated(value = EnumType.STRING)
- private ContentPosition contentPosition;
-
- //Used for grouping
- //BOX, SECTION, PAGE
- @Column(name = "CONTENT_TYPE", length=10, nullable=true)
- @Enumerated(value = EnumType.STRING)
- private ContentType contentType;
-
- @Column(name = "SORT_ORDER")
- private Integer sortOrder = 0;
-
- //A page can contain one product listing
- @Column(name = "PRODUCT_GROUP", nullable = true)
- private String productGroup;
-
-
-
- public String getProductGroup() {
- return productGroup;
- }
-
- public void setProductGroup(String productGroup) {
- this.productGroup = productGroup;
- }
-
- @Override
- public Long getId() {
- return this.id;
- }
-
- @Override
- public void setId(Long id) {
- this.id = id;
-
- }
-
- public void setAuditSection(AuditSection auditSection) {
- this.auditSection = auditSection;
- }
-
- public AuditSection getAuditSection() {
- return auditSection;
- }
-
- public MerchantStore getMerchantStore() {
- return merchantStore;
- }
-
- public void setMerchantStore(MerchantStore merchantStore) {
- this.merchantStore = merchantStore;
- }
-
- public String getCode() {
- return code;
- }
-
- public void setCode(String code) {
- this.code = code;
- }
-
- public boolean isVisible() {
- return visible;
- }
-
- public void setVisible(boolean visible) {
- this.visible = visible;
- }
-
-
-
- public List<ContentDescription> getDescriptions() {
- return descriptions;
- }
-
- public void setDescriptions(List<ContentDescription> descriptions) {
- this.descriptions = descriptions;
- }
-
- public void setContentType(ContentType contentType) {
- this.contentType = contentType;
- }
-
- public ContentType getContentType() {
- return contentType;
- }
-
- public ContentDescription getDescription() {
-
- if(this.getDescriptions()!=null && this.getDescriptions().size()>0) {
- return this.getDescriptions().get(0);
- }
-
- return null;
-
- }
-
- public void setSortOrder(Integer sortOrder) {
- this.sortOrder = sortOrder;
- }
-
- public Integer getSortOrder() {
- return sortOrder;
- }
-
- public void setContentPosition(ContentPosition contentPosition) {
- this.contentPosition = contentPosition;
- }
-
- public ContentPosition getContentPosition() {
- return contentPosition;
- }
+package com.salesmanager.core.model.content;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.EntityListeners;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.UniqueConstraint;
+import javax.validation.Valid;
+
+import org.hibernate.validator.constraints.NotEmpty;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.common.audit.AuditListener;
+import com.salesmanager.core.model.common.audit.AuditSection;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+import com.salesmanager.core.model.merchant.MerchantStore;
+
+
+@Entity
+@EntityListeners(value = AuditListener.class)
+@Table(name = "CONTENT", schema= SchemaConstant.SALESMANAGER_SCHEMA,uniqueConstraints=
+ @UniqueConstraint(columnNames = {"MERCHANT_ID", "CODE"}) )
+public class Content extends SalesManagerEntity<Long, Content> implements Serializable {
+
+
+
+ private static final long serialVersionUID = 1772757159185494620L;
+
+ @Id
+ @Column(name = "CONTENT_ID", unique=true, nullable=false)
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "CONTENT_SEQ_NEXT_VAL")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+ @Embedded
+ private AuditSection auditSection = new AuditSection();
+
+ @Valid
+ @OneToMany(mappedBy="content", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+ private List<ContentDescription> descriptions = new ArrayList<ContentDescription>();
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name="MERCHANT_ID", nullable=false)
+ private MerchantStore merchantStore;
+
+ @NotEmpty
+ @Column(name="CODE", length=100, nullable=false)
+ private String code;
+
+ @Column(name = "VISIBLE")
+ private boolean visible;
+
+ @Column(name = "LINK_TO_MENU")
+ private boolean linkToMenu;
+
+ @Column(name = "CONTENT_POSITION", length=10, nullable=true)
+ @Enumerated(value = EnumType.STRING)
+ private ContentPosition contentPosition;
+
+ //Used for grouping
+ //BOX, SECTION, PAGE
+ @Column(name = "CONTENT_TYPE", length=10, nullable=true)
+ @Enumerated(value = EnumType.STRING)
+ private ContentType contentType;
+
+ @Column(name = "SORT_ORDER")
+ private Integer sortOrder = 0;
+
+ //A page can contain one product listing
+ @Column(name = "PRODUCT_GROUP", nullable = true)
+ private String productGroup;
+
+ public String getProductGroup() {
+ return productGroup;
+ }
+
+ public void setProductGroup(String productGroup) {
+ this.productGroup = productGroup;
+ }
+
+ @Override
+ public Long getId() {
+ return this.id;
+ }
+
+ @Override
+ public void setId(Long id) {
+ this.id = id;
+
+ }
+
+ public void setAuditSection(AuditSection auditSection) {
+ this.auditSection = auditSection;
+ }
+
+ public AuditSection getAuditSection() {
+ return auditSection;
+ }
+
+ public MerchantStore getMerchantStore() {
+ return merchantStore;
+ }
+
+ public void setMerchantStore(MerchantStore merchantStore) {
+ this.merchantStore = merchantStore;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public boolean isVisible() {
+ return visible;
+ }
+
+ public void setVisible(boolean visible) {
+ this.visible = visible;
+ }
+
+
+
+ public List<ContentDescription> getDescriptions() {
+ return descriptions;
+ }
+
+ public void setDescriptions(List<ContentDescription> descriptions) {
+ this.descriptions = descriptions;
+ }
+
+ public void setContentType(ContentType contentType) {
+ this.contentType = contentType;
+ }
+
+ public ContentType getContentType() {
+ return contentType;
+ }
+
+ public ContentDescription getDescription() {
+
+ if(this.getDescriptions()!=null && this.getDescriptions().size()>0) {
+ return this.getDescriptions().get(0);
+ }
+
+ return null;
+
+ }
+
+ public void setSortOrder(Integer sortOrder) {
+ this.sortOrder = sortOrder;
+ }
+
+ public Integer getSortOrder() {
+ return sortOrder;
+ }
+
+ public void setContentPosition(ContentPosition contentPosition) {
+ this.contentPosition = contentPosition;
+ }
+
+ public ContentPosition getContentPosition() {
+ return contentPosition;
+ }
+
+
+
+ public boolean isLinkToMenu() {
+ return linkToMenu;
+ }
+
+ public void setLinkToMenu(boolean linkToMenu) {
+ this.linkToMenu = linkToMenu;
+ }
+
}
\ No newline at end of file
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/content/ContentDescription.java b/sm-core-model/src/main/java/com/salesmanager/core/model/content/ContentDescription.java
index 7671f0d..41b16ac 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/content/ContentDescription.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/content/ContentDescription.java
@@ -1,99 +1,99 @@
-package com.salesmanager.core.model.content;
-
-import java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.UniqueConstraint;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.common.Description;
-import com.salesmanager.core.model.reference.language.Language;
-
-@Entity
-@Table(name="CONTENT_DESCRIPTION", schema= SchemaConstant.SALESMANAGER_SCHEMA,uniqueConstraints={
- @UniqueConstraint(columnNames={
- "CONTENT_ID",
- "LANGUAGE_ID"
- })
- }
-)
-public class ContentDescription extends Description implements Serializable {
-
-
- /**
- *
- */
- private static final long serialVersionUID = -1252756716545768599L;
-
- @ManyToOne(targetEntity = Content.class)
- @JoinColumn(name = "CONTENT_ID", nullable = false)
- private Content content;
-
- @Column(name="SEF_URL", length=120)
- private String seUrl;
-
-
- @Column(name="META_KEYWORDS")
- private String metatagKeywords;
-
- @Column(name="META_TITLE")
- private String metatagTitle;
-
- public String getMetatagTitle() {
- return metatagTitle;
- }
-
- public void setMetatagTitle(String metatagTitle) {
- this.metatagTitle = metatagTitle;
- }
-
- @Column(name="META_DESCRIPTION")
- private String metatagDescription;
-
- public ContentDescription() {
- }
-
- public ContentDescription(String name, Language language) {
- this.setName(name);
- this.setLanguage(language);
- super.setId(0L);
- }
-
- public Content getContent() {
- return content;
- }
-
- public void setContent(Content content) {
- this.content = content;
- }
-
- public String getSeUrl() {
- return seUrl;
- }
-
- public void setSeUrl(String seUrl) {
- this.seUrl = seUrl;
- }
-
-
- public String getMetatagKeywords() {
- return metatagKeywords;
- }
-
- public void setMetatagKeywords(String metatagKeywords) {
- this.metatagKeywords = metatagKeywords;
- }
-
- public String getMetatagDescription() {
- return metatagDescription;
- }
-
- public void setMetatagDescription(String metatagDescription) {
- this.metatagDescription = metatagDescription;
- }
-
-}
+package com.salesmanager.core.model.content;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.common.description.Description;
+import com.salesmanager.core.model.reference.language.Language;
+
+@Entity
+@Table(name="CONTENT_DESCRIPTION", schema= SchemaConstant.SALESMANAGER_SCHEMA,uniqueConstraints={
+ @UniqueConstraint(columnNames={
+ "CONTENT_ID",
+ "LANGUAGE_ID"
+ })
+ }
+)
+public class ContentDescription extends Description implements Serializable {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -1252756716545768599L;
+
+ @ManyToOne(targetEntity = Content.class)
+ @JoinColumn(name = "CONTENT_ID", nullable = false)
+ private Content content;
+
+ @Column(name="SEF_URL", length=120)
+ private String seUrl;
+
+
+ @Column(name="META_KEYWORDS")
+ private String metatagKeywords;
+
+ @Column(name="META_TITLE")
+ private String metatagTitle;
+
+ public String getMetatagTitle() {
+ return metatagTitle;
+ }
+
+ public void setMetatagTitle(String metatagTitle) {
+ this.metatagTitle = metatagTitle;
+ }
+
+ @Column(name="META_DESCRIPTION")
+ private String metatagDescription;
+
+ public ContentDescription() {
+ }
+
+ public ContentDescription(String name, Language language) {
+ this.setName(name);
+ this.setLanguage(language);
+ super.setId(0L);
+ }
+
+ public Content getContent() {
+ return content;
+ }
+
+ public void setContent(Content content) {
+ this.content = content;
+ }
+
+ public String getSeUrl() {
+ return seUrl;
+ }
+
+ public void setSeUrl(String seUrl) {
+ this.seUrl = seUrl;
+ }
+
+
+ public String getMetatagKeywords() {
+ return metatagKeywords;
+ }
+
+ public void setMetatagKeywords(String metatagKeywords) {
+ this.metatagKeywords = metatagKeywords;
+ }
+
+ public String getMetatagDescription() {
+ return metatagDescription;
+ }
+
+ public void setMetatagDescription(String metatagDescription) {
+ this.metatagDescription = metatagDescription;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/content/ContentFile.java b/sm-core-model/src/main/java/com/salesmanager/core/model/content/ContentFile.java
index fbcdf01..6d3eea7 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/content/ContentFile.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/content/ContentFile.java
@@ -1,22 +1,22 @@
-package com.salesmanager.core.model.content;
-
-public abstract class ContentFile {
-
-
- private String fileName;
- private String mimeType;
- public void setMimeType(String mimeType) {
- this.mimeType = mimeType;
- }
- public String getMimeType() {
- return mimeType;
- }
- public void setFileName(String fileName) {
- this.fileName = fileName;
- }
- public String getFileName() {
- return fileName;
- }
-
-
-}
+package com.salesmanager.core.model.content;
+
+public abstract class ContentFile {
+
+
+ private String fileName;
+ private String mimeType;
+ public void setMimeType(String mimeType) {
+ this.mimeType = mimeType;
+ }
+ public String getMimeType() {
+ return mimeType;
+ }
+ public void setFileName(String fileName) {
+ this.fileName = fileName;
+ }
+ public String getFileName() {
+ return fileName;
+ }
+
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/content/ContentPosition.java b/sm-core-model/src/main/java/com/salesmanager/core/model/content/ContentPosition.java
index 268072c..d9635a6 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/content/ContentPosition.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/content/ContentPosition.java
@@ -1,7 +1,7 @@
-package com.salesmanager.core.model.content;
-
-public enum ContentPosition {
-
- LEFT, RIGHT
-
-}
+package com.salesmanager.core.model.content;
+
+public enum ContentPosition {
+
+ LEFT, RIGHT
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/content/ContentType.java b/sm-core-model/src/main/java/com/salesmanager/core/model/content/ContentType.java
index 7c7b486..264b794 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/content/ContentType.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/content/ContentType.java
@@ -1,7 +1,7 @@
-package com.salesmanager.core.model.content;
-
-public enum ContentType {
-
- BOX, PAGE, SECTION
-
-}
+package com.salesmanager.core.model.content;
+
+public enum ContentType {
+
+ BOX, PAGE, SECTION
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/content/FileContentType.java b/sm-core-model/src/main/java/com/salesmanager/core/model/content/FileContentType.java
index 7dd3afa..351a5f8 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/content/FileContentType.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/content/FileContentType.java
@@ -1,25 +1,25 @@
-/**
- *
- */
-package com.salesmanager.core.model.content;
-
-/**
- * Enum defining type of static content.
- * Currently following type of static content can be store and managed within
- * Shopizer CMS system
- * <pre>
- * 1. Static content like JS, CSS file etc
- * 2. Digital Data (audio,video)
- * </pre>
- *
- * StaticContentType will be used to distinguish between Digital data and other type of static data
- * stored with in the system.
- *
- * @author Umesh Awasthi
- * @since 1.2
- *
- */
-public enum FileContentType
-{
- STATIC_FILE, IMAGE, LOGO, PRODUCT, PRODUCTLG, PROPERTY, MANUFACTURER, PRODUCT_DIGITAL
-}
+/**
+ *
+ */
+package com.salesmanager.core.model.content;
+
+/**
+ * Enum defining type of static content.
+ * Currently following type of static content can be store and managed within
+ * Shopizer CMS system
+ * <pre>
+ * 1. Static content like JS, CSS file etc
+ * 2. Digital Data (audio,video)
+ * </pre>
+ *
+ * StaticContentType will be used to distinguish between Digital data and other type of static data
+ * stored with in the system.
+ *
+ * @author Umesh Awasthi
+ * @since 1.2
+ *
+ */
+public enum FileContentType
+{
+ STATIC_FILE, IMAGE, LOGO, PRODUCT, PRODUCTLG, PROPERTY, MANUFACTURER, PRODUCT_DIGITAL
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/content/ImageContentFile.java b/sm-core-model/src/main/java/com/salesmanager/core/model/content/ImageContentFile.java
index 96b6e40..81fad6a 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/content/ImageContentFile.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/content/ImageContentFile.java
@@ -1,14 +1,14 @@
-package com.salesmanager.core.model.content;
-
-import java.io.Serializable;
-
-public class ImageContentFile extends InputContentFile implements Serializable {
-
-
-
- /**
- *
- */
- private static final long serialVersionUID = -5321162403524229224L;
-
-}
+package com.salesmanager.core.model.content;
+
+import java.io.Serializable;
+
+public class ImageContentFile extends InputContentFile implements Serializable {
+
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -5321162403524229224L;
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/content/InputContentFile.java b/sm-core-model/src/main/java/com/salesmanager/core/model/content/InputContentFile.java
index 4237c41..905d288 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/content/InputContentFile.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/content/InputContentFile.java
@@ -1,26 +1,26 @@
-package com.salesmanager.core.model.content;
-
-import java.io.InputStream;
-import java.io.Serializable;
-
-
-public class InputContentFile extends StaticContentFile implements Serializable
-{
-
- private static final long serialVersionUID = 1L;
-
- private InputStream file;
-
-
- public InputStream getFile()
- {
- return file;
- }
- public void setFile( InputStream file )
- {
- this.file = file;
- }
-
-
-
+package com.salesmanager.core.model.content;
+
+import java.io.InputStream;
+import java.io.Serializable;
+
+
+public class InputContentFile extends StaticContentFile implements Serializable
+{
+
+ private static final long serialVersionUID = 1L;
+
+ private InputStream file;
+
+
+ public InputStream getFile()
+ {
+ return file;
+ }
+ public void setFile( InputStream file )
+ {
+ this.file = file;
+ }
+
+
+
}
\ No newline at end of file
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/content/OutputContentFile.java b/sm-core-model/src/main/java/com/salesmanager/core/model/content/OutputContentFile.java
index 7d2445d..ef0600c 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/content/OutputContentFile.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/content/OutputContentFile.java
@@ -1,26 +1,26 @@
-package com.salesmanager.core.model.content;
-
-import java.io.ByteArrayOutputStream;
-import java.io.Serializable;
-
-/**
- * Data class responsible for carrying out static content data from Infispan cache to
- * service layer.
- *
- * @author Umesh Awasthi
- * @since 1.2
- */
-public class OutputContentFile extends StaticContentFile implements Serializable
-{
- private static final long serialVersionUID = 1L;
- private ByteArrayOutputStream file;
- public ByteArrayOutputStream getFile()
- {
- return file;
- }
- public void setFile( ByteArrayOutputStream file )
- {
- this.file = file;
- }
-
+package com.salesmanager.core.model.content;
+
+import java.io.ByteArrayOutputStream;
+import java.io.Serializable;
+
+/**
+ * Data class responsible for carrying out static content data from Infispan cache to
+ * service layer.
+ *
+ * @author Umesh Awasthi
+ * @since 1.2
+ */
+public class OutputContentFile extends StaticContentFile implements Serializable
+{
+ private static final long serialVersionUID = 1L;
+ private ByteArrayOutputStream file;
+ public ByteArrayOutputStream getFile()
+ {
+ return file;
+ }
+ public void setFile( ByteArrayOutputStream file )
+ {
+ this.file = file;
+ }
+
}
\ No newline at end of file
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/content/StaticContentFile.java b/sm-core-model/src/main/java/com/salesmanager/core/model/content/StaticContentFile.java
index 16d7697..0d2cbca 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/content/StaticContentFile.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/content/StaticContentFile.java
@@ -1,18 +1,18 @@
-package com.salesmanager.core.model.content;
-
-public abstract class StaticContentFile extends ContentFile {
-
- private FileContentType fileContentType;
-
- public FileContentType getFileContentType() {
- return fileContentType;
- }
-
- public void setFileContentType(FileContentType fileContentType) {
- this.fileContentType = fileContentType;
- }
-
-
-
-
-}
+package com.salesmanager.core.model.content;
+
+public abstract class StaticContentFile extends ContentFile {
+
+ private FileContentType fileContentType;
+
+ public FileContentType getFileContentType() {
+ return fileContentType;
+ }
+
+ public void setFileContentType(FileContentType fileContentType) {
+ this.fileContentType = fileContentType;
+ }
+
+
+
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerAttribute.java b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerAttribute.java
index 678cc4f..2c7f507 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerAttribute.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerAttribute.java
@@ -1,104 +1,104 @@
-package com.salesmanager.core.model.customer.attribute;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.UniqueConstraint;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.generic.SalesManagerEntity;
-
-@Entity
-@Table(name="CUSTOMER_ATTRIBUTE", schema=SchemaConstant.SALESMANAGER_SCHEMA,
- uniqueConstraints={
- @UniqueConstraint(columnNames={
- "OPTION_ID",
- "CUSTOMER_ID"
- })
- }
-)
-public class CustomerAttribute extends SalesManagerEntity<Long, CustomerAttribute> {
- private static final long serialVersionUID = -6537491946539803265L;
-
- @Id
- @Column(name = "CUSTOMER_ATTRIBUTE_ID", unique=true, nullable=false)
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "CUST_ATTR_SEQ_NEXT_VAL")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long id;
-
-
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name="OPTION_ID", nullable=false)
- private CustomerOption customerOption;
-
-
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name="OPTION_VALUE_ID", nullable=false)
- private CustomerOptionValue customerOptionValue;
-
- @Column(name="CUSTOMER_ATTR_TXT_VAL")
- private String textValue;
-
-
- @ManyToOne(targetEntity = Customer.class)
- @JoinColumn(name = "CUSTOMER_ID", nullable = false)
- private Customer customer;
-
- public CustomerAttribute() {
- }
-
- @Override
- public Long getId() {
- return id;
- }
-
- @Override
- public void setId(Long id) {
- this.id = id;
- }
-
-
-
- public CustomerOption getCustomerOption() {
- return customerOption;
- }
-
- public void setCustomerOption(CustomerOption customerOption) {
- this.customerOption = customerOption;
- }
-
- public CustomerOptionValue getCustomerOptionValue() {
- return customerOptionValue;
- }
-
- public void setCustomerOptionValue(CustomerOptionValue customerOptionValue) {
- this.customerOptionValue = customerOptionValue;
- }
-
-
- public Customer getCustomer() {
- return customer;
- }
-
- public void setCustomer(Customer customer) {
- this.customer = customer;
- }
-
- public void setTextValue(String textValue) {
- this.textValue = textValue;
- }
-
- public String getTextValue() {
- return textValue;
- }
-
-
-}
+package com.salesmanager.core.model.customer.attribute;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.UniqueConstraint;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+
+@Entity
+@Table(name="CUSTOMER_ATTRIBUTE", schema=SchemaConstant.SALESMANAGER_SCHEMA,
+ uniqueConstraints={
+ @UniqueConstraint(columnNames={
+ "OPTION_ID",
+ "CUSTOMER_ID"
+ })
+ }
+)
+public class CustomerAttribute extends SalesManagerEntity<Long, CustomerAttribute> {
+ private static final long serialVersionUID = -6537491946539803265L;
+
+ @Id
+ @Column(name = "CUSTOMER_ATTRIBUTE_ID", unique=true, nullable=false)
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "CUST_ATTR_SEQ_NEXT_VAL")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name="OPTION_ID", nullable=false)
+ private CustomerOption customerOption;
+
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name="OPTION_VALUE_ID", nullable=false)
+ private CustomerOptionValue customerOptionValue;
+
+ @Column(name="CUSTOMER_ATTR_TXT_VAL")
+ private String textValue;
+
+
+ @ManyToOne(targetEntity = Customer.class)
+ @JoinColumn(name = "CUSTOMER_ID", nullable = false)
+ private Customer customer;
+
+ public CustomerAttribute() {
+ }
+
+ @Override
+ public Long getId() {
+ return id;
+ }
+
+ @Override
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+
+
+ public CustomerOption getCustomerOption() {
+ return customerOption;
+ }
+
+ public void setCustomerOption(CustomerOption customerOption) {
+ this.customerOption = customerOption;
+ }
+
+ public CustomerOptionValue getCustomerOptionValue() {
+ return customerOptionValue;
+ }
+
+ public void setCustomerOptionValue(CustomerOptionValue customerOptionValue) {
+ this.customerOptionValue = customerOptionValue;
+ }
+
+
+ public Customer getCustomer() {
+ return customer;
+ }
+
+ public void setCustomer(Customer customer) {
+ this.customer = customer;
+ }
+
+ public void setTextValue(String textValue) {
+ this.textValue = textValue;
+ }
+
+ public String getTextValue() {
+ return textValue;
+ }
+
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOption.java b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOption.java
index 0307091..4330496 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOption.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOption.java
@@ -1,182 +1,182 @@
-package com.salesmanager.core.model.customer.attribute;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Index;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Transient;
-import javax.persistence.UniqueConstraint;
-import javax.validation.Valid;
-import javax.validation.constraints.Pattern;
-
-import org.hibernate.validator.constraints.NotEmpty;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.generic.SalesManagerEntity;
-import com.salesmanager.core.model.merchant.MerchantStore;
-
-
-@Entity
-@Table(name="CUSTOMER_OPTION", schema=SchemaConstant.SALESMANAGER_SCHEMA, indexes = { @Index(name="CUST_OPT_CODE_IDX", columnList = "CUSTOMER_OPT_CODE")}, uniqueConstraints=
- @UniqueConstraint(columnNames = {"MERCHANT_ID", "CUSTOMER_OPT_CODE"}))
-public class CustomerOption extends SalesManagerEntity<Long, CustomerOption> {
- private static final long serialVersionUID = -2019269055342226086L;
-
- @Id
- @Column(name="CUSTOMER_OPTION_ID")
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "CUSTOMER_OPTION_SEQ_NEXT_VAL")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long id;
-
- @Column(name="SORT_ORDER")
- private Integer sortOrder = 0;
-
- @Column(name="CUSTOMER_OPTION_TYPE", length=10)
- private String customerOptionType;
-
- @NotEmpty
- @Pattern(regexp="^[a-zA-Z0-9_]*$")
- @Column(name="CUSTOMER_OPT_CODE")
- //@Index(name="CUST_OPT_CODE_IDX")
- private String code;
-
- @Column(name="CUSTOMER_OPT_ACTIVE")
- private boolean active;
-
- @Column(name="CUSTOMER_OPT_PUBLIC")
- private boolean publicOption;
-
- @Valid
- @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "customerOption")
- private Set<CustomerOptionDescription> descriptions = new HashSet<CustomerOptionDescription>();
-
- @Transient
- private List<CustomerOptionDescription> descriptionsList = new ArrayList<CustomerOptionDescription>();
-
-
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name="MERCHANT_ID", nullable=false)
- private MerchantStore merchantStore;
-
- public CustomerOption() {
- }
-
-
-
- public Set<CustomerOptionDescription> getDescriptions() {
- return descriptions;
- }
-
- public void setDescriptions(Set<CustomerOptionDescription> descriptions) {
- this.descriptions = descriptions;
- }
-
- @Override
- public Long getId() {
- return id;
- }
-
- @Override
- public void setId(Long id) {
- this.id = id;
- }
-
-
-
- public MerchantStore getMerchantStore() {
- return merchantStore;
- }
-
- public void setMerchantStore(MerchantStore merchantStore) {
- this.merchantStore = merchantStore;
- }
-
- public void setDescriptionsList(List<CustomerOptionDescription> descriptionsList) {
- this.descriptionsList = descriptionsList;
- }
-
- public List<CustomerOptionDescription> getDescriptionsList() {
- return descriptionsList;
- }
-
-
- public List<CustomerOptionDescription> getDescriptionsSettoList() {
- if(descriptionsList==null || descriptionsList.size()==0) {
- descriptionsList = new ArrayList<CustomerOptionDescription>(this.getDescriptions());
- }
- return descriptionsList;
-
- }
-
- public String getCustomerOptionType() {
- return customerOptionType;
- }
-
-
-
- public void setCustomerOptionType(String customerOptionType) {
- this.customerOptionType = customerOptionType;
- }
-
-
-
- public String getCode() {
- return code;
- }
-
-
-
- public void setCode(String code) {
- this.code = code;
- }
-
-
-
- public boolean isActive() {
- return active;
- }
-
-
-
- public void setActive(boolean active) {
- this.active = active;
- }
-
-
-
- public boolean isPublicOption() {
- return publicOption;
- }
-
-
-
- public void setPublicOption(boolean publicOption) {
- this.publicOption = publicOption;
- }
-
-
-
- public void setSortOrder(Integer sortOrder) {
- this.sortOrder = sortOrder;
- }
-
-
-
- public Integer getSortOrder() {
- return sortOrder;
- }
-}
+package com.salesmanager.core.model.customer.attribute;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Index;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Transient;
+import javax.persistence.UniqueConstraint;
+import javax.validation.Valid;
+import javax.validation.constraints.Pattern;
+
+import org.hibernate.validator.constraints.NotEmpty;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+import com.salesmanager.core.model.merchant.MerchantStore;
+
+
+@Entity
+@Table(name="CUSTOMER_OPTION", schema=SchemaConstant.SALESMANAGER_SCHEMA, indexes = { @Index(name="CUST_OPT_CODE_IDX", columnList = "CUSTOMER_OPT_CODE")}, uniqueConstraints=
+ @UniqueConstraint(columnNames = {"MERCHANT_ID", "CUSTOMER_OPT_CODE"}))
+public class CustomerOption extends SalesManagerEntity<Long, CustomerOption> {
+ private static final long serialVersionUID = -2019269055342226086L;
+
+ @Id
+ @Column(name="CUSTOMER_OPTION_ID")
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "CUSTOMER_OPTION_SEQ_NEXT_VAL")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+ @Column(name="SORT_ORDER")
+ private Integer sortOrder = 0;
+
+ @Column(name="CUSTOMER_OPTION_TYPE", length=10)
+ private String customerOptionType;
+
+ @NotEmpty
+ @Pattern(regexp="^[a-zA-Z0-9_]*$")
+ @Column(name="CUSTOMER_OPT_CODE")
+ //@Index(name="CUST_OPT_CODE_IDX")
+ private String code;
+
+ @Column(name="CUSTOMER_OPT_ACTIVE")
+ private boolean active;
+
+ @Column(name="CUSTOMER_OPT_PUBLIC")
+ private boolean publicOption;
+
+ @Valid
+ @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "customerOption")
+ private Set<CustomerOptionDescription> descriptions = new HashSet<CustomerOptionDescription>();
+
+ @Transient
+ private List<CustomerOptionDescription> descriptionsList = new ArrayList<CustomerOptionDescription>();
+
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name="MERCHANT_ID", nullable=false)
+ private MerchantStore merchantStore;
+
+ public CustomerOption() {
+ }
+
+
+
+ public Set<CustomerOptionDescription> getDescriptions() {
+ return descriptions;
+ }
+
+ public void setDescriptions(Set<CustomerOptionDescription> descriptions) {
+ this.descriptions = descriptions;
+ }
+
+ @Override
+ public Long getId() {
+ return id;
+ }
+
+ @Override
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+
+
+ public MerchantStore getMerchantStore() {
+ return merchantStore;
+ }
+
+ public void setMerchantStore(MerchantStore merchantStore) {
+ this.merchantStore = merchantStore;
+ }
+
+ public void setDescriptionsList(List<CustomerOptionDescription> descriptionsList) {
+ this.descriptionsList = descriptionsList;
+ }
+
+ public List<CustomerOptionDescription> getDescriptionsList() {
+ return descriptionsList;
+ }
+
+
+ public List<CustomerOptionDescription> getDescriptionsSettoList() {
+ if(descriptionsList==null || descriptionsList.size()==0) {
+ descriptionsList = new ArrayList<CustomerOptionDescription>(this.getDescriptions());
+ }
+ return descriptionsList;
+
+ }
+
+ public String getCustomerOptionType() {
+ return customerOptionType;
+ }
+
+
+
+ public void setCustomerOptionType(String customerOptionType) {
+ this.customerOptionType = customerOptionType;
+ }
+
+
+
+ public String getCode() {
+ return code;
+ }
+
+
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+
+
+ public boolean isActive() {
+ return active;
+ }
+
+
+
+ public void setActive(boolean active) {
+ this.active = active;
+ }
+
+
+
+ public boolean isPublicOption() {
+ return publicOption;
+ }
+
+
+
+ public void setPublicOption(boolean publicOption) {
+ this.publicOption = publicOption;
+ }
+
+
+
+ public void setSortOrder(Integer sortOrder) {
+ this.sortOrder = sortOrder;
+ }
+
+
+
+ public Integer getSortOrder() {
+ return sortOrder;
+ }
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOptionDescription.java b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOptionDescription.java
index ed77647..9358a93 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOptionDescription.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOptionDescription.java
@@ -1,58 +1,58 @@
-package com.salesmanager.core.model.customer.attribute;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.UniqueConstraint;
-
-import org.hibernate.annotations.Type;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.common.Description;
-
-@Entity
-@Table(name="CUSTOMER_OPTION_DESC", schema=SchemaConstant.SALESMANAGER_SCHEMA, uniqueConstraints={
- @UniqueConstraint(columnNames={
- "CUSTOMER_OPTION_ID",
- "LANGUAGE_ID"
- })
- }
-)
-public class CustomerOptionDescription extends Description {
- private static final long serialVersionUID = -3158504904707188465L;
-
- @ManyToOne(targetEntity = CustomerOption.class)
- @JoinColumn(name = "CUSTOMER_OPTION_ID", nullable = false)
- private CustomerOption customerOption;
-
- @Column(name="CUSTOMER_OPTION_COMMENT")
- @Type(type = "org.hibernate.type.StringClobType")
- private String customerOptionComment;
-
-
-
- public CustomerOptionDescription() {
- }
-
- public CustomerOption getCustomerOption() {
- return customerOption;
- }
-
- public void setCustomerOption(CustomerOption customerOption) {
- this.customerOption = customerOption;
- }
-
- public String getCustomerOptionComment() {
- return customerOptionComment;
- }
-
- public void setCustomerOptionComment(String customerOptionComment) {
- this.customerOptionComment = customerOptionComment;
- }
-
-
-
-
-}
+package com.salesmanager.core.model.customer.attribute;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+import org.hibernate.annotations.Type;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.common.description.Description;
+
+@Entity
+@Table(name="CUSTOMER_OPTION_DESC", schema=SchemaConstant.SALESMANAGER_SCHEMA, uniqueConstraints={
+ @UniqueConstraint(columnNames={
+ "CUSTOMER_OPTION_ID",
+ "LANGUAGE_ID"
+ })
+ }
+)
+public class CustomerOptionDescription extends Description {
+ private static final long serialVersionUID = -3158504904707188465L;
+
+ @ManyToOne(targetEntity = CustomerOption.class)
+ @JoinColumn(name = "CUSTOMER_OPTION_ID", nullable = false)
+ private CustomerOption customerOption;
+
+ @Column(name="CUSTOMER_OPTION_COMMENT")
+ @Type(type = "org.hibernate.type.StringClobType")
+ private String customerOptionComment;
+
+
+
+ public CustomerOptionDescription() {
+ }
+
+ public CustomerOption getCustomerOption() {
+ return customerOption;
+ }
+
+ public void setCustomerOption(CustomerOption customerOption) {
+ this.customerOption = customerOption;
+ }
+
+ public String getCustomerOptionComment() {
+ return customerOptionComment;
+ }
+
+ public void setCustomerOptionComment(String customerOptionComment) {
+ this.customerOptionComment = customerOptionComment;
+ }
+
+
+
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOptionSet.java b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOptionSet.java
index 7fb9bc3..352a8b8 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOptionSet.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOptionSet.java
@@ -1,92 +1,92 @@
-package com.salesmanager.core.model.customer.attribute;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.UniqueConstraint;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.generic.SalesManagerEntity;
-
-@Entity
-@Table(name="CUSTOMER_OPTION_SET", schema=SchemaConstant.SALESMANAGER_SCHEMA,
- uniqueConstraints={
- @UniqueConstraint(columnNames={
- "CUSTOMER_OPTION_ID",
- "CUSTOMER_OPTION_VALUE_ID"
- })
- }
-)
-public class CustomerOptionSet extends SalesManagerEntity<Long, CustomerOptionSet> {
-
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- @Id
- @Column(name = "CUSTOMER_OPTIONSET_ID", unique=true, nullable=false)
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "CUST_OPTSET_SEQ_NEXT_VAL")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long id;
-
-
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name="CUSTOMER_OPTION_ID", nullable=false)
- private CustomerOption customerOption = null;
-
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name="CUSTOMER_OPTION_VALUE_ID", nullable=false)
- private CustomerOptionValue customerOptionValue = null;
-
-
-
- @Column(name="SORT_ORDER")
- private Integer sortOrder = new Integer(0);
-
-
-
- public int getSortOrder() {
- return sortOrder;
- }
-
- public void setSortOrder(int sortOrder) {
- this.sortOrder = sortOrder;
- }
-
- public void setCustomerOptionValue(CustomerOptionValue customerOptionValue) {
- this.customerOptionValue = customerOptionValue;
- }
-
- public CustomerOptionValue getCustomerOptionValue() {
- return customerOptionValue;
- }
-
- public void setCustomerOption(CustomerOption customerOption) {
- this.customerOption = customerOption;
- }
-
- public CustomerOption getCustomerOption() {
- return customerOption;
- }
-
- @Override
- public Long getId() {
- return id;
- }
-
- @Override
- public void setId(Long id) {
- this.id = id;
- }
-
-
-}
+package com.salesmanager.core.model.customer.attribute;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.UniqueConstraint;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+
+@Entity
+@Table(name="CUSTOMER_OPTION_SET", schema=SchemaConstant.SALESMANAGER_SCHEMA,
+ uniqueConstraints={
+ @UniqueConstraint(columnNames={
+ "CUSTOMER_OPTION_ID",
+ "CUSTOMER_OPTION_VALUE_ID"
+ })
+ }
+)
+public class CustomerOptionSet extends SalesManagerEntity<Long, CustomerOptionSet> {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ @Id
+ @Column(name = "CUSTOMER_OPTIONSET_ID", unique=true, nullable=false)
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "CUST_OPTSET_SEQ_NEXT_VAL")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name="CUSTOMER_OPTION_ID", nullable=false)
+ private CustomerOption customerOption = null;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name="CUSTOMER_OPTION_VALUE_ID", nullable=false)
+ private CustomerOptionValue customerOptionValue = null;
+
+
+
+ @Column(name="SORT_ORDER")
+ private Integer sortOrder = new Integer(0);
+
+
+
+ public int getSortOrder() {
+ return sortOrder;
+ }
+
+ public void setSortOrder(int sortOrder) {
+ this.sortOrder = sortOrder;
+ }
+
+ public void setCustomerOptionValue(CustomerOptionValue customerOptionValue) {
+ this.customerOptionValue = customerOptionValue;
+ }
+
+ public CustomerOptionValue getCustomerOptionValue() {
+ return customerOptionValue;
+ }
+
+ public void setCustomerOption(CustomerOption customerOption) {
+ this.customerOption = customerOption;
+ }
+
+ public CustomerOption getCustomerOption() {
+ return customerOption;
+ }
+
+ @Override
+ public Long getId() {
+ return id;
+ }
+
+ @Override
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOptionType.java b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOptionType.java
index 2c4ec47..99bafb5 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOptionType.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOptionType.java
@@ -1,7 +1,7 @@
-package com.salesmanager.core.model.customer.attribute;
-
-public enum CustomerOptionType {
-
- Text, Radio, Select, Checkbox
-
-}
+package com.salesmanager.core.model.customer.attribute;
+
+public enum CustomerOptionType {
+
+ Text, Radio, Select, Checkbox
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOptionValueDescription.java b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOptionValueDescription.java
index c654c08..40fe9a8 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOptionValueDescription.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/attribute/CustomerOptionValueDescription.java
@@ -7,7 +7,7 @@ import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.common.Description;
+import com.salesmanager.core.model.common.description.Description;
@Entity
@Table(name = "CUSTOMER_OPT_VAL_DESCRIPTION", schema=SchemaConstant.SALESMANAGER_SCHEMA, uniqueConstraints={
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/connection/AbstractUserConnection.java b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/connection/AbstractUserConnection.java
new file mode 100644
index 0000000..8aedcc7
--- /dev/null
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/connection/AbstractUserConnection.java
@@ -0,0 +1,105 @@
+package com.salesmanager.core.model.customer.connection;
+
+import java.io.Serializable;
+
+import javax.persistence.MappedSuperclass;
+
+
+
+@MappedSuperclass
+public abstract class AbstractUserConnection<P> implements RemoteUser,
+ Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private String accessToken;
+ private String displayName;
+ private Long expireTime;
+ private String imageUrl;
+ private String profileUrl;
+ private int rank;
+ private String refreshToken;
+ private String secret;
+
+
+ public String getAccessToken() {
+ return accessToken;
+ }
+
+ public void setAccessToken(String accessToken) {
+ this.accessToken = accessToken;
+ }
+
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public void setDisplayName(String displayName) {
+ this.displayName = displayName;
+ }
+
+ public Long getExpireTime() {
+ return expireTime;
+ }
+
+ public void setExpireTime(Long expireTime) {
+ this.expireTime = expireTime;
+ }
+
+ public String getImageUrl() {
+ return imageUrl;
+ }
+
+ public void setImageUrl(String imageUrl) {
+ this.imageUrl = imageUrl;
+ }
+
+ public String getProfileUrl() {
+ return profileUrl;
+ }
+
+ public void setProfileUrl(String profileUrl) {
+ this.profileUrl = profileUrl;
+ }
+
+ public abstract String getProviderId();
+
+ public abstract void setProviderId(String providerId);
+
+ public abstract String getProviderUserId();
+
+ public abstract void setProviderUserId(String providerUserId);
+
+ public int getRank() {
+ return rank;
+ }
+
+ public void setRank(int rank) {
+ this.rank = rank;
+ }
+
+ public String getRefreshToken() {
+ return refreshToken;
+ }
+
+ public void setRefreshToken(String refreshToken) {
+ this.refreshToken = refreshToken;
+ }
+
+ public String getSecret() {
+ return secret;
+ }
+
+ public void setSecret(String secret) {
+ this.secret = secret;
+ }
+
+ public abstract String getUserId();
+
+ public abstract void setUserId(String userId);
+
+ protected abstract P getId();
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/connection/AbstractUserConnectionWithCompositeKey.java b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/connection/AbstractUserConnectionWithCompositeKey.java
new file mode 100644
index 0000000..4f824dc
--- /dev/null
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/connection/AbstractUserConnectionWithCompositeKey.java
@@ -0,0 +1,59 @@
+package com.salesmanager.core.model.customer.connection;
+
+import javax.persistence.Id;
+import javax.persistence.MappedSuperclass;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+import com.salesmanager.core.constants.SchemaConstant;
+
+@MappedSuperclass
+@Table(name="USERCONNECTION", schema=SchemaConstant.SALESMANAGER_SCHEMA, uniqueConstraints = { @UniqueConstraint(columnNames = { "userId",
+ "providerId", "rank" }) })
+public abstract class AbstractUserConnectionWithCompositeKey extends
+ AbstractUserConnection<UserConnectionPK> {
+
+ @Id
+ private UserConnectionPK primaryKey = new UserConnectionPK();
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public String getProviderId() {
+ return primaryKey.getProviderId();
+ }
+
+ @Override
+ public void setProviderId(String providerId) {
+ primaryKey.setProviderId(providerId);
+ }
+
+ @Override
+ public String getProviderUserId() {
+ return primaryKey.getProviderUserId();
+ }
+
+ @Override
+ public void setProviderUserId(String providerUserId) {
+ primaryKey.setProviderUserId(providerUserId);
+ }
+
+ @Override
+ public String getUserId() {
+ return primaryKey.getUserId();
+ }
+
+ @Override
+ public void setUserId(String userId) {
+ primaryKey.setUserId(userId);
+ }
+
+ @Override
+ protected UserConnectionPK getId() {
+ return primaryKey;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/connection/RemoteUser.java b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/connection/RemoteUser.java
new file mode 100644
index 0000000..3f427c2
--- /dev/null
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/connection/RemoteUser.java
@@ -0,0 +1,53 @@
+package com.salesmanager.core.model.customer.connection;
+
+import org.springframework.social.UserIdSource;
+
+public interface RemoteUser extends UserIdSource{
+
+ public String getUserId();
+
+ public void setUserId(String id);
+ /*
+ * Provider identifier: Facebook, Twitter, LinkedIn etc
+ */
+ public String getProviderUserId();
+
+ public void setProviderUserId(String provider);
+
+ public String getProviderId();
+
+ public void setProviderId(String providerId);
+
+ public int getRank();
+
+ public void setRank(int rank);
+
+ public String getSecret();
+
+ public void setSecret(String secret);
+
+ public String getDisplayName();
+
+ public void setDisplayName(String displayName);
+
+ public String getProfileUrl();
+
+ public void setProfileUrl(String profileUrl);
+
+ public String getImageUrl();
+
+ public void setImageUrl(String imageUrl);
+
+ public String getAccessToken();
+
+ public void setAccessToken(String accessToken);
+
+ public String getRefreshToken();
+
+ public void setRefreshToken(String refreshToken);
+
+ public Long getExpireTime();
+
+ public void setExpireTime(Long expireTime);
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/connection/UserConnection.java b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/connection/UserConnection.java
new file mode 100644
index 0000000..9cb8b81
--- /dev/null
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/connection/UserConnection.java
@@ -0,0 +1,13 @@
+package com.salesmanager.core.model.customer.connection;
+
+import javax.persistence.Entity;
+
+@Entity
+public class UserConnection extends AbstractUserConnectionWithCompositeKey {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+}
\ No newline at end of file
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/connection/UserConnectionPK.java b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/connection/UserConnectionPK.java
new file mode 100644
index 0000000..a415922
--- /dev/null
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/connection/UserConnectionPK.java
@@ -0,0 +1,63 @@
+package com.salesmanager.core.model.customer.connection;
+
+import java.io.Serializable;
+
+import javax.persistence.Embeddable;
+
+/**
+ * Identity key for storing spring social objects
+ * @author carlsamson
+ *
+ */
+@Embeddable
+public class UserConnectionPK implements Serializable {
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private String userId;
+ private String providerId;
+ private String providerUserId;
+
+ public String getUserId() {
+ return userId;
+ }
+
+ public void setUserId(String userId) {
+ this.userId = userId;
+ }
+
+ public String getProviderId() {
+ return providerId;
+ }
+
+ public void setProviderId(String providerId) {
+ this.providerId = providerId;
+ }
+
+ public String getProviderUserId() {
+ return providerUserId;
+ }
+
+ public void setProviderUserId(String providerUserId) {
+ this.providerUserId = providerUserId;
+ }
+
+ public boolean equals(Object o) {
+ if (o instanceof UserConnectionPK) {
+ UserConnectionPK other = (UserConnectionPK) o;
+ return other.getProviderId().equals(getProviderId())
+ && other.getProviderUserId().equals(getProviderUserId())
+ && other.getUserId().equals(getUserId());
+ } else {
+ return false;
+ }
+ }
+
+ public int hashCode() {
+ return getUserId().hashCode() + getProviderId().hashCode()
+ + getProviderUserId().hashCode();
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/Customer.java b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/Customer.java
index 5d64bac..717661d 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/Customer.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/Customer.java
@@ -1,293 +1,340 @@
-package com.salesmanager.core.model.customer;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Embedded;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.Transient;
-import javax.validation.Valid;
-
-import org.hibernate.annotations.Cascade;
-import org.hibernate.validator.constraints.Email;
-import org.hibernate.validator.constraints.NotEmpty;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.catalog.product.review.ProductReview;
-import com.salesmanager.core.model.common.Billing;
-import com.salesmanager.core.model.common.Delivery;
-import com.salesmanager.core.model.customer.attribute.CustomerAttribute;
-import com.salesmanager.core.model.generic.SalesManagerEntity;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.user.Group;
-import com.salesmanager.core.utils.CloneUtils;
-
-@Entity
-@Table(name = "CUSTOMER", schema=SchemaConstant.SALESMANAGER_SCHEMA)
-public class Customer extends SalesManagerEntity<Long, Customer> {
- private static final long serialVersionUID = -6966934116557219193L;
-
- @Id
- @Column(name = "CUSTOMER_ID", unique=true, nullable=false)
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT",
- pkColumnValue = "CUSTOMER_SEQ_NEXT_VAL")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long id;
-
- //@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE, mappedBy = "customer")
- @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "customer")
- private Set<CustomerAttribute> attributes = new HashSet<CustomerAttribute>();
-
- @Column(name="CUSTOMER_GENDER", length=1, nullable=true)
- @Enumerated(value = EnumType.STRING)
- private CustomerGender gender;
-
-
- @Temporal(TemporalType.TIMESTAMP)
- @Column(name="CUSTOMER_DOB")
- private Date dateOfBirth;
-
- @Email
- @NotEmpty
- @Column(name="CUSTOMER_EMAIL_ADDRESS", length=96, nullable=false)
- private String emailAddress;
-
- @Column(name="CUSTOMER_NICK", length=96)
- private String nick;
-
- @Column(name="CUSTOMER_COMPANY", length=100)
- private String company;
-
-
- @Column(name="CUSTOMER_PASSWORD", length=60)
- private String password;
-
-
- @Column(name="CUSTOMER_ANONYMOUS")
- private boolean anonymous;
-
-
-
- @ManyToOne(fetch = FetchType.LAZY, targetEntity = Language.class)
- @JoinColumn(name = "LANGUAGE_ID", nullable=false)
- private Language defaultLanguage;
-
-
-
- @OneToMany(mappedBy = "customer", targetEntity = ProductReview.class)
- private List<ProductReview> reviews = new ArrayList<ProductReview>();
-
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name="MERCHANT_ID", nullable=false)
- private MerchantStore merchantStore;
-
-
- @Embedded
- private Delivery delivery = null;
-
- @Valid
- @Embedded
- private Billing billing = null;
-
-
- @ManyToMany(fetch=FetchType.LAZY, cascade = {CascadeType.REFRESH})
- @JoinTable(name = "CUSTOMER_GROUP", schema=SchemaConstant.SALESMANAGER_SCHEMA, joinColumns = {
- @JoinColumn(name = "CUSTOMER_ID", nullable = false, updatable = false) }
- ,
- inverseJoinColumns = { @JoinColumn(name = "GROUP_ID",
- nullable = false, updatable = false) }
- )
- @Cascade({
- org.hibernate.annotations.CascadeType.DETACH,
- org.hibernate.annotations.CascadeType.LOCK,
- org.hibernate.annotations.CascadeType.REFRESH,
- org.hibernate.annotations.CascadeType.REPLICATE
-
- })
- private List<Group> groups = new ArrayList<Group>();
-
- @Transient
- private String showCustomerStateList;
-
- @Transient
- private String showBillingStateList;
-
- @Transient
- private String showDeliveryStateList;
-
-
- public Customer() {
- }
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
-
-
- public Date getDateOfBirth() {
- return CloneUtils.clone(dateOfBirth);
- }
-
- public void setDateOfBirth(Date dateOfBirth) {
- this.dateOfBirth = CloneUtils.clone(dateOfBirth);
- }
-
- public String getEmailAddress() {
- return emailAddress;
- }
-
- public void setEmailAddress(String emailAddress) {
- this.emailAddress = emailAddress;
- }
-
- public String getNick() {
- return nick;
- }
-
- public void setNick(String nick) {
- this.nick = nick;
- }
-
- public String getCompany() {
- return company;
- }
-
- public void setCompany(String company) {
- this.company = company;
- }
-
-
-
- public String getPassword() {
- return password;
- }
-
- public void setPassword(String password) {
- this.password = password;
- }
-
-
-
- public boolean isAnonymous() {
- return anonymous;
- }
-
- public void setAnonymous(boolean anonymous) {
- this.anonymous = anonymous;
- }
-
-
- public List<ProductReview> getReviews() {
- return reviews;
- }
-
- public void setReviews(List<ProductReview> reviews) {
- this.reviews = reviews;
- }
-
- public void setMerchantStore(MerchantStore merchantStore) {
- this.merchantStore = merchantStore;
- }
-
- public MerchantStore getMerchantStore() {
- return merchantStore;
- }
-
- public void setDelivery(Delivery delivery) {
- this.delivery = delivery;
- }
-
- public Delivery getDelivery() {
- return delivery;
- }
-
- public void setBilling(Billing billing) {
- this.billing = billing;
- }
-
- public Billing getBilling() {
- return billing;
- }
-
- public void setGroups(List<Group> groups) {
- this.groups = groups;
- }
-
- public List<Group> getGroups() {
- return groups;
- }
- public String getShowCustomerStateList() {
- return showCustomerStateList;
- }
-
- public void setShowCustomerStateList(String showCustomerStateList) {
- this.showCustomerStateList = showCustomerStateList;
- }
-
- public String getShowBillingStateList() {
- return showBillingStateList;
- }
-
- public void setShowBillingStateList(String showBillingStateList) {
- this.showBillingStateList = showBillingStateList;
- }
-
- public String getShowDeliveryStateList() {
- return showDeliveryStateList;
- }
-
- public void setShowDeliveryStateList(String showDeliveryStateList) {
- this.showDeliveryStateList = showDeliveryStateList;
- }
-
- public Language getDefaultLanguage() {
- return defaultLanguage;
- }
-
- public void setDefaultLanguage(Language defaultLanguage) {
- this.defaultLanguage = defaultLanguage;
- }
-
- public void setAttributes(Set<CustomerAttribute> attributes) {
- this.attributes = attributes;
- }
-
- public Set<CustomerAttribute> getAttributes() {
- return attributes;
- }
-
- public void setGender(CustomerGender gender) {
- this.gender = gender;
- }
-
- public CustomerGender getGender() {
- return gender;
- }
-
-}
+package com.salesmanager.core.model.customer;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.persistence.Transient;
+import javax.validation.Valid;
+
+import org.hibernate.annotations.Cascade;
+import org.hibernate.validator.constraints.Email;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.catalog.product.review.ProductReview;
+import com.salesmanager.core.model.common.Billing;
+import com.salesmanager.core.model.common.Delivery;
+import com.salesmanager.core.model.common.audit.AuditSection;
+import com.salesmanager.core.model.common.audit.Auditable;
+import com.salesmanager.core.model.customer.attribute.CustomerAttribute;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.user.Group;
+import com.salesmanager.core.utils.CloneUtils;
+
+@Entity
+@Table(name = "CUSTOMER", schema=SchemaConstant.SALESMANAGER_SCHEMA)
+public class Customer extends SalesManagerEntity<Long, Customer> implements Auditable {
+ private static final long serialVersionUID = -6966934116557219193L;
+
+ @Id
+ @Column(name = "CUSTOMER_ID", unique=true, nullable=false)
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT",
+ pkColumnValue = "CUSTOMER_SEQ_NEXT_VAL")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+ @Embedded
+ private AuditSection auditSection = new AuditSection();
+
+ @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "customer")
+ private Set<CustomerAttribute> attributes = new HashSet<CustomerAttribute>();
+
+ @Column(name="CUSTOMER_GENDER", length=1, nullable=true)
+ @Enumerated(value = EnumType.STRING)
+ private CustomerGender gender;
+
+
+ @Temporal(TemporalType.TIMESTAMP)
+ @Column(name="CUSTOMER_DOB")
+ private Date dateOfBirth;
+
+ @Email
+ @NotEmpty
+ @Column(name="CUSTOMER_EMAIL_ADDRESS", length=96, nullable=false)
+ private String emailAddress;
+
+ @Column(name="CUSTOMER_NICK", length=96)
+ private String nick;
+
+ @Column(name="CUSTOMER_COMPANY", length=100)
+ private String company;
+
+
+ @Column(name="CUSTOMER_PASSWORD", length=60)
+ private String password;
+
+
+ @Column(name="CUSTOMER_ANONYMOUS")
+ private boolean anonymous;
+
+ @Column(name = "REVIEW_AVG")
+ private BigDecimal customerReviewAvg;
+
+ @Column(name = "REVIEW_COUNT")
+ private Integer customerReviewCount;
+
+ @Column(name="PROVIDER")
+ private String provider;
+
+
+ @ManyToOne(fetch = FetchType.LAZY, targetEntity = Language.class)
+ @JoinColumn(name = "LANGUAGE_ID", nullable=false)
+ private Language defaultLanguage;
+
+
+
+ @OneToMany(mappedBy = "customer", targetEntity = ProductReview.class)
+ private List<ProductReview> reviews = new ArrayList<ProductReview>();
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name="MERCHANT_ID", nullable=false)
+ private MerchantStore merchantStore;
+
+
+ @Embedded
+ private Delivery delivery = null;
+
+ @Valid
+ @Embedded
+ private Billing billing = null;
+
+
+ @ManyToMany(fetch=FetchType.LAZY, cascade = {CascadeType.REFRESH})
+ @JoinTable(name = "CUSTOMER_GROUP", schema=SchemaConstant.SALESMANAGER_SCHEMA, joinColumns = {
+ @JoinColumn(name = "CUSTOMER_ID", nullable = false, updatable = false) }
+ ,
+ inverseJoinColumns = { @JoinColumn(name = "GROUP_ID",
+ nullable = false, updatable = false) }
+ )
+ @Cascade({
+ org.hibernate.annotations.CascadeType.DETACH,
+ org.hibernate.annotations.CascadeType.LOCK,
+ org.hibernate.annotations.CascadeType.REFRESH,
+ org.hibernate.annotations.CascadeType.REPLICATE
+
+ })
+ private List<Group> groups = new ArrayList<Group>();
+
+ @Transient
+ private String showCustomerStateList;
+
+ @Transient
+ private String showBillingStateList;
+
+ @Transient
+ private String showDeliveryStateList;
+
+
+ public Customer() {
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+
+
+ public Date getDateOfBirth() {
+ return CloneUtils.clone(dateOfBirth);
+ }
+
+ public void setDateOfBirth(Date dateOfBirth) {
+ this.dateOfBirth = CloneUtils.clone(dateOfBirth);
+ }
+
+ public String getEmailAddress() {
+ return emailAddress;
+ }
+
+ public void setEmailAddress(String emailAddress) {
+ this.emailAddress = emailAddress;
+ }
+
+ public String getNick() {
+ return nick;
+ }
+
+ public void setNick(String nick) {
+ this.nick = nick;
+ }
+
+ public String getCompany() {
+ return company;
+ }
+
+ public void setCompany(String company) {
+ this.company = company;
+ }
+
+
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+
+
+ public boolean isAnonymous() {
+ return anonymous;
+ }
+
+ public void setAnonymous(boolean anonymous) {
+ this.anonymous = anonymous;
+ }
+
+
+ public List<ProductReview> getReviews() {
+ return reviews;
+ }
+
+ public void setReviews(List<ProductReview> reviews) {
+ this.reviews = reviews;
+ }
+
+ public void setMerchantStore(MerchantStore merchantStore) {
+ this.merchantStore = merchantStore;
+ }
+
+ public MerchantStore getMerchantStore() {
+ return merchantStore;
+ }
+
+ public void setDelivery(Delivery delivery) {
+ this.delivery = delivery;
+ }
+
+ public Delivery getDelivery() {
+ return delivery;
+ }
+
+ public void setBilling(Billing billing) {
+ this.billing = billing;
+ }
+
+ public Billing getBilling() {
+ return billing;
+ }
+
+ public void setGroups(List<Group> groups) {
+ this.groups = groups;
+ }
+
+ public List<Group> getGroups() {
+ return groups;
+ }
+ public String getShowCustomerStateList() {
+ return showCustomerStateList;
+ }
+
+ public void setShowCustomerStateList(String showCustomerStateList) {
+ this.showCustomerStateList = showCustomerStateList;
+ }
+
+ public String getShowBillingStateList() {
+ return showBillingStateList;
+ }
+
+ public void setShowBillingStateList(String showBillingStateList) {
+ this.showBillingStateList = showBillingStateList;
+ }
+
+ public String getShowDeliveryStateList() {
+ return showDeliveryStateList;
+ }
+
+ public void setShowDeliveryStateList(String showDeliveryStateList) {
+ this.showDeliveryStateList = showDeliveryStateList;
+ }
+
+ public Language getDefaultLanguage() {
+ return defaultLanguage;
+ }
+
+ public void setDefaultLanguage(Language defaultLanguage) {
+ this.defaultLanguage = defaultLanguage;
+ }
+
+ public void setAttributes(Set<CustomerAttribute> attributes) {
+ this.attributes = attributes;
+ }
+
+ public Set<CustomerAttribute> getAttributes() {
+ return attributes;
+ }
+
+ public void setGender(CustomerGender gender) {
+ this.gender = gender;
+ }
+
+ public CustomerGender getGender() {
+ return gender;
+ }
+
+ public BigDecimal getCustomerReviewAvg() {
+ return customerReviewAvg;
+ }
+
+ public void setCustomerReviewAvg(BigDecimal customerReviewAvg) {
+ this.customerReviewAvg = customerReviewAvg;
+ }
+
+ public Integer getCustomerReviewCount() {
+ return customerReviewCount;
+ }
+
+ public void setCustomerReviewCount(Integer customerReviewCount) {
+ this.customerReviewCount = customerReviewCount;
+ }
+
+ @Override
+ public AuditSection getAuditSection() {
+ return auditSection;
+ }
+
+ @Override
+ public void setAuditSection(AuditSection auditSection) {
+ this.auditSection = auditSection;
+ }
+
+ public String getProvider() {
+ return provider;
+ }
+
+ public void setProvider(String provider) {
+ this.provider = provider;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/CustomerCriteria.java b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/CustomerCriteria.java
index ebc7d89..cc05f5c 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/CustomerCriteria.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/CustomerCriteria.java
@@ -1,43 +1,43 @@
-package com.salesmanager.core.model.customer;
-
-import com.salesmanager.core.model.common.Criteria;
-
-public class CustomerCriteria extends Criteria {
-
- private String firstName;
- private String lastName;
- private String name;
- private String email;
- private String country;
- public String getFirstName() {
- return firstName;
- }
- public void setFirstName(String firstName) {
- this.firstName = firstName;
- }
- public String getLastName() {
- return lastName;
- }
- public void setLastName(String lastName) {
- this.lastName = lastName;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getEmail() {
- return email;
- }
- public void setEmail(String email) {
- this.email = email;
- }
- public String getCountry() {
- return country;
- }
- public void setCountry(String country) {
- this.country = country;
- }
-
-}
+package com.salesmanager.core.model.customer;
+
+import com.salesmanager.core.model.common.Criteria;
+
+public class CustomerCriteria extends Criteria {
+
+ private String firstName;
+ private String lastName;
+ private String name;
+ private String email;
+ private String country;
+ public String getFirstName() {
+ return firstName;
+ }
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+ public String getLastName() {
+ return lastName;
+ }
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public String getEmail() {
+ return email;
+ }
+ public void setEmail(String email) {
+ this.email = email;
+ }
+ public String getCountry() {
+ return country;
+ }
+ public void setCountry(String country) {
+ this.country = country;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/CustomerGender.java b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/CustomerGender.java
index 8911503..193f4a1 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/CustomerGender.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/CustomerGender.java
@@ -1,7 +1,7 @@
-package com.salesmanager.core.model.customer;
-
-public enum CustomerGender {
-
- M, F
-
-}
+package com.salesmanager.core.model.customer;
+
+public enum CustomerGender {
+
+ M, F
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/CustomerList.java b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/CustomerList.java
index 776dee0..6c9ef3a 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/CustomerList.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/CustomerList.java
@@ -1,22 +1,22 @@
-package com.salesmanager.core.model.customer;
-
-import java.util.List;
-
-import com.salesmanager.core.model.common.EntityList;
-
-public class CustomerList extends EntityList {
-
-
- /**
- *
- */
- private static final long serialVersionUID = -3108842276158069739L;
- private List<Customer> customers;
- public void setCustomers(List<Customer> customers) {
- this.customers = customers;
- }
- public List<Customer> getCustomers() {
- return customers;
- }
-
-}
+package com.salesmanager.core.model.customer;
+
+import java.util.List;
+
+import com.salesmanager.core.model.common.EntityList;
+
+public class CustomerList extends EntityList {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -3108842276158069739L;
+ private List<Customer> customers;
+ public void setCustomers(List<Customer> customers) {
+ this.customers = customers;
+ }
+ public List<Customer> getCustomers() {
+ return customers;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/review/CustomerReview.java b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/review/CustomerReview.java
new file mode 100644
index 0000000..43a6e2a
--- /dev/null
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/review/CustomerReview.java
@@ -0,0 +1,159 @@
+package com.salesmanager.core.model.customer.review;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.EntityListeners;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.persistence.UniqueConstraint;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.common.audit.AuditListener;
+import com.salesmanager.core.model.common.audit.AuditSection;
+import com.salesmanager.core.model.common.audit.Auditable;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+
+@Entity
+@EntityListeners(value = AuditListener.class)
+@Table(name = "CUSTOMER_REVIEW", schema=SchemaConstant.SALESMANAGER_SCHEMA, uniqueConstraints={
+ @UniqueConstraint(columnNames={
+ "CUSTOMERS_ID",
+ "REVIEWED_CUSTOMER_ID"
+ })
+ }
+)
+public class CustomerReview extends SalesManagerEntity<Long, CustomerReview> implements Auditable {
+ private static final long serialVersionUID = 1L;
+
+ @Id
+ @Column(name = "CUSTOMER_REVIEW_ID", unique=true, nullable=false)
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT",
+ pkColumnValue = "CUSTOMER_REVIEW_SEQ_NEXT_VAL")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+ @Embedded
+ private AuditSection audit = new AuditSection();
+
+ @Column(name = "REVIEWS_RATING")
+ private Double reviewRating;
+
+ @Column(name = "REVIEWS_READ")
+ private Long reviewRead;
+
+ @Temporal(TemporalType.TIMESTAMP)
+ @Column(name = "REVIEW_DATE")
+ private Date reviewDate;
+
+ @Column(name = "STATUS")
+ private Integer status;
+
+ @ManyToOne
+ @JoinColumn(name="CUSTOMERS_ID")
+ private Customer customer;
+
+
+
+ @OneToOne
+ @JoinColumn(name="REVIEWED_CUSTOMER_ID")
+ private Customer reviewedCustomer;
+
+ public Customer getReviewedCustomer() {
+ return reviewedCustomer;
+ }
+
+ public void setReviewedCustomer(Customer reviewedCustomer) {
+ this.reviewedCustomer = reviewedCustomer;
+ }
+
+ @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "customerReview")
+ private Set<CustomerReviewDescription> descriptions = new HashSet<CustomerReviewDescription>();
+
+ public CustomerReview() {
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Double getReviewRating() {
+ return reviewRating;
+ }
+
+ public void setReviewRating(Double reviewRating) {
+ this.reviewRating = reviewRating;
+ }
+
+ public Long getReviewRead() {
+ return reviewRead;
+ }
+
+ public void setReviewRead(Long reviewRead) {
+ this.reviewRead = reviewRead;
+ }
+
+ public Integer getStatus() {
+ return status;
+ }
+
+ public void setStatus(Integer status) {
+ this.status = status;
+ }
+
+ public Customer getCustomer() {
+ return customer;
+ }
+
+ public void setCustomer(Customer customer) {
+ this.customer = customer;
+ }
+
+
+ public Set<CustomerReviewDescription> getDescriptions() {
+ return descriptions;
+ }
+
+ public void setDescriptions(Set<CustomerReviewDescription> descriptions) {
+ this.descriptions = descriptions;
+ }
+
+ @Override
+ public AuditSection getAuditSection() {
+ return audit;
+ }
+
+ @Override
+ public void setAuditSection(AuditSection audit) {
+ this.audit = audit;
+ }
+
+ public Date getReviewDate() {
+ return reviewDate;
+ }
+
+ public void setReviewDate(Date reviewDate) {
+ this.reviewDate = reviewDate;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/customer/review/CustomerReviewDescription.java b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/review/CustomerReviewDescription.java
new file mode 100644
index 0000000..08c8e3f
--- /dev/null
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/customer/review/CustomerReviewDescription.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to csti consulting
+ * You may obtain a copy of the License at
+ *
+ * http://www.csticonsulting.com
+ * Copyright (c) 2006-Aug 24, 2010 Consultation CS-TI inc.
+ *
+ * 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.
+ */
+package com.salesmanager.core.model.customer.review;
+
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.common.description.Description;
+import com.salesmanager.core.model.reference.language.Language;
+
+@Entity
+@Table(name = "CUSTOMER_REVIEW_DESCRIPTION", schema = SchemaConstant.SALESMANAGER_SCHEMA, uniqueConstraints={
+ @UniqueConstraint(columnNames={
+ "CUSTOMER_REVIEW_ID",
+ "LANGUAGE_ID"
+ })
+})
+public class CustomerReviewDescription extends Description {
+ private static final long serialVersionUID = -1L;
+
+ @ManyToOne(targetEntity = CustomerReview.class)
+ @JoinColumn(name="CUSTOMER_REVIEW_ID")
+ private CustomerReview customerReview;
+
+ public CustomerReview getCustomerReview() {
+ return customerReview;
+ }
+
+ public void setCustomerReview(CustomerReview customerReview) {
+ this.customerReview = customerReview;
+ }
+
+ public CustomerReviewDescription() {
+ }
+
+ public CustomerReviewDescription(Language language, String name) {
+ this.setLanguage(language);
+ this.setName(name);
+ }
+
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/order/attributes/OrderAttribute.java b/sm-core-model/src/main/java/com/salesmanager/core/model/order/attributes/OrderAttribute.java
new file mode 100644
index 0000000..66fec3e
--- /dev/null
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/order/attributes/OrderAttribute.java
@@ -0,0 +1,81 @@
+package com.salesmanager.core.model.order.attributes;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+import com.salesmanager.core.model.order.Order;
+
+/**
+ * Entity used for storing various attributes related to an Order
+ * @author c.samson
+ *
+ */
+@Entity
+@Table (name="ORDER_ATTRIBUTE" , schema=SchemaConstant.SALESMANAGER_SCHEMA)
+public class OrderAttribute extends SalesManagerEntity<Long, OrderAttribute> {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ @Id
+ @Column(name = "ORDER_ATTRIBUTE_ID", unique=true, nullable=false)
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "ORDER_ATTR_ID_NEXT_VALUE")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+ @Column (name ="IDENTIFIER", nullable=false)
+ private String key;
+
+ @Column (name ="VALUE", nullable=false)
+ private String value;
+
+ @ManyToOne(targetEntity = Order.class)
+ @JoinColumn(name = "ORDER_ID", nullable=false)
+ private Order order;
+
+ public Order getOrder() {
+ return order;
+ }
+
+ public void setOrder(Order order) {
+ this.order = order;
+ }
+
+ @Override
+ public Long getId() {
+ return id;
+ }
+
+ @Override
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/order/filehistory/FileHistory.java b/sm-core-model/src/main/java/com/salesmanager/core/model/order/filehistory/FileHistory.java
index 3933102..81dfa9e 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/order/filehistory/FileHistory.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/order/filehistory/FileHistory.java
@@ -1,135 +1,135 @@
-package com.salesmanager.core.model.order.filehistory;
-
-import java.io.Serializable;
-import java.util.Date;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.UniqueConstraint;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.utils.CloneUtils;
-
-@Entity
-@Table (name="FILE_HISTORY", schema=SchemaConstant.SALESMANAGER_SCHEMA, uniqueConstraints={
- @UniqueConstraint(
- columnNames={
- "MERCHANT_ID",
- "FILE_ID"
- }
- )
- }
-)
-public class FileHistory implements Serializable {
- private static final long serialVersionUID = 1321251632883237664L;
-
- @Id
- @Column(name = "FILE_HISTORY_ID", unique = true, nullable = false)
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT",
- pkColumnValue = "FILE_HISTORY_ID_NEXT_VALUE")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long id;
-
- @ManyToOne(targetEntity = MerchantStore.class)
- @JoinColumn(name = "MERCHANT_ID", nullable = false)
- private MerchantStore store;
-
- @Column(name = "FILE_ID")
- private Long fileId;
-
- @Column ( name="FILESIZE", nullable=false )
- private Integer filesize;
-
- @Temporal(TemporalType.TIMESTAMP )
- @Column ( name="DATE_ADDED", length=0, nullable=false )
- private Date dateAdded;
-
- @Temporal(TemporalType.TIMESTAMP)
- @Column ( name="DATE_DELETED", length=0 )
- private Date dateDeleted;
-
- @Temporal(TemporalType.TIMESTAMP)
- @Column ( name="ACCOUNTED_DATE", length=0 )
- private Date accountedDate;
-
- @Column ( name="DOWNLOAD_COUNT", nullable=false )
- private Integer downloadCount;
-
- public FileHistory() {
- }
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public MerchantStore getStore() {
- return store;
- }
-
- public void setStore(MerchantStore store) {
- this.store = store;
- }
-
- public Long getFileId() {
- return fileId;
- }
-
- public void setFileId(Long fileId) {
- this.fileId = fileId;
- }
-
- public Integer getFilesize() {
- return filesize;
- }
-
- public void setFilesize(Integer filesize) {
- this.filesize = filesize;
- }
-
- public Date getDateAdded() {
- return CloneUtils.clone(dateAdded);
- }
-
- public void setDateAdded(Date dateAdded) {
- this.dateAdded = CloneUtils.clone(dateAdded);
- }
-
- public Date getDateDeleted() {
- return CloneUtils.clone(dateDeleted);
- }
-
- public void setDateDeleted(Date dateDeleted) {
- this.dateDeleted = CloneUtils.clone(dateDeleted);
- }
-
- public Date getAccountedDate() {
- return CloneUtils.clone(accountedDate);
- }
-
- public void setAccountedDate(Date accountedDate) {
- this.accountedDate = CloneUtils.clone(accountedDate);
- }
-
- public Integer getDownloadCount() {
- return downloadCount;
- }
-
- public void setDownloadCount(Integer downloadCount) {
- this.downloadCount = downloadCount;
- }
-
+package com.salesmanager.core.model.order.filehistory;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.persistence.UniqueConstraint;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.utils.CloneUtils;
+
+@Entity
+@Table (name="FILE_HISTORY", schema=SchemaConstant.SALESMANAGER_SCHEMA, uniqueConstraints={
+ @UniqueConstraint(
+ columnNames={
+ "MERCHANT_ID",
+ "FILE_ID"
+ }
+ )
+ }
+)
+public class FileHistory implements Serializable {
+ private static final long serialVersionUID = 1321251632883237664L;
+
+ @Id
+ @Column(name = "FILE_HISTORY_ID", unique = true, nullable = false)
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT",
+ pkColumnValue = "FILE_HISTORY_ID_NEXT_VALUE")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+ @ManyToOne(targetEntity = MerchantStore.class)
+ @JoinColumn(name = "MERCHANT_ID", nullable = false)
+ private MerchantStore store;
+
+ @Column(name = "FILE_ID")
+ private Long fileId;
+
+ @Column ( name="FILESIZE", nullable=false )
+ private Integer filesize;
+
+ @Temporal(TemporalType.TIMESTAMP )
+ @Column ( name="DATE_ADDED", length=0, nullable=false )
+ private Date dateAdded;
+
+ @Temporal(TemporalType.TIMESTAMP)
+ @Column ( name="DATE_DELETED", length=0 )
+ private Date dateDeleted;
+
+ @Temporal(TemporalType.TIMESTAMP)
+ @Column ( name="ACCOUNTED_DATE", length=0 )
+ private Date accountedDate;
+
+ @Column ( name="DOWNLOAD_COUNT", nullable=false )
+ private Integer downloadCount;
+
+ public FileHistory() {
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public MerchantStore getStore() {
+ return store;
+ }
+
+ public void setStore(MerchantStore store) {
+ this.store = store;
+ }
+
+ public Long getFileId() {
+ return fileId;
+ }
+
+ public void setFileId(Long fileId) {
+ this.fileId = fileId;
+ }
+
+ public Integer getFilesize() {
+ return filesize;
+ }
+
+ public void setFilesize(Integer filesize) {
+ this.filesize = filesize;
+ }
+
+ public Date getDateAdded() {
+ return CloneUtils.clone(dateAdded);
+ }
+
+ public void setDateAdded(Date dateAdded) {
+ this.dateAdded = CloneUtils.clone(dateAdded);
+ }
+
+ public Date getDateDeleted() {
+ return CloneUtils.clone(dateDeleted);
+ }
+
+ public void setDateDeleted(Date dateDeleted) {
+ this.dateDeleted = CloneUtils.clone(dateDeleted);
+ }
+
+ public Date getAccountedDate() {
+ return CloneUtils.clone(accountedDate);
+ }
+
+ public void setAccountedDate(Date accountedDate) {
+ this.accountedDate = CloneUtils.clone(accountedDate);
+ }
+
+ public Integer getDownloadCount() {
+ return downloadCount;
+ }
+
+ public void setDownloadCount(Integer downloadCount) {
+ this.downloadCount = downloadCount;
+ }
+
}
\ No newline at end of file
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/order/Order.java b/sm-core-model/src/main/java/com/salesmanager/core/model/order/Order.java
index f081f02..e5c0092 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/order/Order.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/order/Order.java
@@ -1,386 +1,398 @@
-package com.salesmanager.core.model.order;
-
-import java.math.BigDecimal;
-import java.util.Date;
-import java.util.LinkedHashSet;
-import java.util.Locale;
-import java.util.Set;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Embedded;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.validation.Valid;
-
-import org.hibernate.annotations.OrderBy;
-import org.hibernate.annotations.Type;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.common.Billing;
-import com.salesmanager.core.model.common.Delivery;
-import com.salesmanager.core.model.generic.SalesManagerEntity;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.orderproduct.OrderProduct;
-import com.salesmanager.core.model.order.orderstatus.OrderStatus;
-import com.salesmanager.core.model.order.orderstatus.OrderStatusHistory;
-import com.salesmanager.core.model.order.payment.CreditCard;
-import com.salesmanager.core.model.payments.PaymentType;
-import com.salesmanager.core.model.reference.currency.Currency;
-import com.salesmanager.core.utils.CloneUtils;
-
-@Entity
-@Table (name="ORDERS", schema = SchemaConstant.SALESMANAGER_SCHEMA)
-public class Order extends SalesManagerEntity<Long, Order> {
-
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- @Id
- @Column (name ="ORDER_ID" , unique=true , nullable=false )
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT",
- pkColumnValue = "ORDER_ID_SEQ_NEXT_VAL")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long id;
-
- @Column (name ="ORDER_STATUS")
- @Enumerated(value = EnumType.STRING)
- private OrderStatus status;
-
- @Temporal(TemporalType.TIMESTAMP)
- @Column (name ="LAST_MODIFIED")
- private Date lastModified;
-
- //the customer object can be detached. An order can exist and the customer deleted
- @Column (name ="CUSTOMER_ID")
- private Long customerId;
-
- @Temporal(TemporalType.DATE)
- @Column (name ="DATE_PURCHASED")
- private Date datePurchased;
-
- //used for an order payable on multiple installment
- @Temporal(TemporalType.TIMESTAMP)
- @Column (name ="ORDER_DATE_FINISHED")
- private Date orderDateFinished;
-
- //What was the exchange rate
- @Column (name ="CURRENCY_VALUE")
- private BigDecimal currencyValue = new BigDecimal(1);//default 1-1
-
- @Column (name ="ORDER_TOTAL")
- private BigDecimal total;
-
- @Column (name ="IP_ADDRESS")
- private String ipAddress;
-
- @Column (name ="CHANNEL")
- @Enumerated(value = EnumType.STRING)
- private OrderChannel channel;
-
- @Column (name ="ORDER_TYPE")
- @Enumerated(value = EnumType.STRING)
- private OrderType orderType = OrderType.ORDER;
-
- @Column (name ="PAYMENT_TYPE")
- @Enumerated(value = EnumType.STRING)
- private PaymentType paymentType;
-
- @Column (name ="PAYMENT_MODULE_CODE")
- private String paymentModuleCode;
-
-
- @Column (name ="SHIPPING_MODULE_CODE")
- private String shippingModuleCode;
-
- @Column(name = "CUSTOMER_AGREED")
- private Boolean customerAgreement = false;
-
- @Column(name = "CONFIRMED_ADDRESS")
- private Boolean confirmedAddress = false;
-
- @Embedded
- private Delivery delivery = null;
-
- @Valid
- @Embedded
- private Billing billing = null;
-
- @Embedded
- private CreditCard creditCard = null;
-
-
- @ManyToOne(targetEntity = Currency.class)
- @JoinColumn(name = "CURRENCY_ID")
- private Currency currency;
-
- @Type(type="locale")
- @Column (name ="LOCALE")
- private Locale locale;
-
-
-
- @ManyToOne(targetEntity = MerchantStore.class)
- @JoinColumn(name="MERCHANTID")
- private MerchantStore merchant;
-
- //@OneToMany(mappedBy = "order")
- //private Set<OrderAccount> orderAccounts = new HashSet<OrderAccount>();
-
- @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
- private Set<OrderProduct> orderProducts = new LinkedHashSet<OrderProduct>();
-
- @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
- @OrderBy(clause = "sort_order asc")
- private Set<OrderTotal> orderTotal = new LinkedHashSet<OrderTotal>();
-
- @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
- @OrderBy(clause = "ORDER_STATUS_HISTORY_ID asc")
- private Set<OrderStatusHistory> orderHistory = new LinkedHashSet<OrderStatusHistory>();
-
- public Order() {
- }
-
- @Column (name ="CUSTOMER_EMAIL_ADDRESS", length=50, nullable=false)
- private String customerEmailAddress;
-
-
- @Override
- public Long getId() {
- return id;
- }
-
- @Override
- public void setId(Long id) {
- this.id = id;
- }
-
- public OrderStatus getStatus() {
- return status;
- }
-
- public void setStatus(OrderStatus status) {
- this.status = status;
- }
-
- public Date getLastModified() {
- return CloneUtils.clone(lastModified);
- }
-
- public void setLastModified(Date lastModified) {
- this.lastModified = CloneUtils.clone(lastModified);
- }
-
- public Date getDatePurchased() {
- return CloneUtils.clone(datePurchased);
- }
-
- public void setDatePurchased(Date datePurchased) {
- this.datePurchased = CloneUtils.clone(datePurchased);
- }
-
- public Date getOrderDateFinished() {
- return CloneUtils.clone(orderDateFinished);
- }
-
- public void setOrderDateFinished(Date orderDateFinished) {
- this.orderDateFinished = CloneUtils.clone(orderDateFinished);
- }
-
- public BigDecimal getCurrencyValue() {
- return currencyValue;
- }
-
- public void setCurrencyValue(BigDecimal currencyValue) {
- this.currencyValue = currencyValue;
- }
-
- public BigDecimal getTotal() {
- return total;
- }
-
- public void setTotal(BigDecimal total) {
- this.total = total;
- }
-
-
- public String getIpAddress() {
- return ipAddress;
- }
-
- public void setIpAddress(String ipAddress) {
- this.ipAddress = ipAddress;
- }
-
-
- public String getPaymentModuleCode() {
- return paymentModuleCode;
- }
-
- public void setPaymentModuleCode(String paymentModuleCode) {
- this.paymentModuleCode = paymentModuleCode;
- }
-
-
-
- public String getShippingModuleCode() {
- return shippingModuleCode;
- }
-
- public void setShippingModuleCode(String shippingModuleCode) {
- this.shippingModuleCode = shippingModuleCode;
- }
-
-
-
- public Currency getCurrency() {
- return currency;
- }
-
- public void setCurrency(Currency currency) {
- this.currency = currency;
- }
-
- public MerchantStore getMerchant() {
- return merchant;
- }
-
- public void setMerchant(MerchantStore merchant) {
- this.merchant = merchant;
- }
-
- public Set<OrderProduct> getOrderProducts() {
- return orderProducts;
- }
-
- public void setOrderProducts(Set<OrderProduct> orderProducts) {
- this.orderProducts = orderProducts;
- }
-
- public Set<OrderTotal> getOrderTotal() {
- return orderTotal;
- }
-
- public void setOrderTotal(Set<OrderTotal> orderTotal) {
- this.orderTotal = orderTotal;
- }
-
- public Set<OrderStatusHistory> getOrderHistory() {
- return orderHistory;
- }
-
- public void setOrderHistory(Set<OrderStatusHistory> orderHistory) {
- this.orderHistory = orderHistory;
- }
-
-
- public void setDelivery(Delivery delivery) {
- this.delivery = delivery;
- }
-
- public Delivery getDelivery() {
- return delivery;
- }
-
- public void setBilling(Billing billing) {
- this.billing = billing;
- }
-
- public Billing getBilling() {
- return billing;
- }
-
- public Long getCustomerId() {
- return customerId;
- }
-
- public void setCustomerId(Long customerId) {
- this.customerId = customerId;
- }
-
-
- public String getCustomerEmailAddress() {
- return customerEmailAddress;
- }
-
- public void setCustomerEmailAddress(String customerEmailAddress) {
- this.customerEmailAddress = customerEmailAddress;
- }
-
-
- public void setChannel(OrderChannel channel) {
- this.channel = channel;
- }
-
-
- public OrderChannel getChannel() {
- return channel;
- }
-
-
- public void setCreditCard(CreditCard creditCard) {
- this.creditCard = creditCard;
- }
-
-
- public CreditCard getCreditCard() {
- return creditCard;
- }
-
-
- public void setPaymentType(PaymentType paymentType) {
- this.paymentType = paymentType;
- }
-
-
- public PaymentType getPaymentType() {
- return paymentType;
- }
-
- public OrderType getOrderType() {
- return orderType;
- }
-
- public void setOrderType(OrderType orderType) {
- this.orderType = orderType;
- }
-
- public Locale getLocale() {
- return locale;
- }
-
- public void setLocale(Locale locale) {
- this.locale = locale;
- }
-
- public Boolean getCustomerAgreement() {
- return customerAgreement;
- }
-
- public void setCustomerAgreement(Boolean customerAgreement) {
- this.customerAgreement = customerAgreement;
- }
-
- public Boolean getConfirmedAddress() {
- return confirmedAddress;
- }
-
- public void setConfirmedAddress(Boolean confirmedAddress) {
- this.confirmedAddress = confirmedAddress;
- }
-
+package com.salesmanager.core.model.order;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.LinkedHashSet;
+import java.util.Locale;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.validation.Valid;
+
+import org.hibernate.annotations.OrderBy;
+import org.hibernate.annotations.Type;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.common.Billing;
+import com.salesmanager.core.model.common.Delivery;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.attributes.OrderAttribute;
+import com.salesmanager.core.model.order.orderproduct.OrderProduct;
+import com.salesmanager.core.model.order.orderstatus.OrderStatus;
+import com.salesmanager.core.model.order.orderstatus.OrderStatusHistory;
+import com.salesmanager.core.model.order.payment.CreditCard;
+import com.salesmanager.core.model.payments.PaymentType;
+import com.salesmanager.core.model.reference.currency.Currency;
+import com.salesmanager.core.utils.CloneUtils;
+
+@Entity
+@Table (name="ORDERS", schema = SchemaConstant.SALESMANAGER_SCHEMA)
+public class Order extends SalesManagerEntity<Long, Order> {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ @Id
+ @Column (name ="ORDER_ID" , unique=true , nullable=false )
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT",
+ pkColumnValue = "ORDER_ID_SEQ_NEXT_VAL")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+ @Column (name ="ORDER_STATUS")
+ @Enumerated(value = EnumType.STRING)
+ private OrderStatus status;
+
+ @Temporal(TemporalType.TIMESTAMP)
+ @Column (name ="LAST_MODIFIED")
+ private Date lastModified;
+
+ //the customer object can be detached. An order can exist and the customer deleted
+ @Column (name ="CUSTOMER_ID")
+ private Long customerId;
+
+ @Temporal(TemporalType.DATE)
+ @Column (name ="DATE_PURCHASED")
+ private Date datePurchased;
+
+ //used for an order payable on multiple installment
+ @Temporal(TemporalType.TIMESTAMP)
+ @Column (name ="ORDER_DATE_FINISHED")
+ private Date orderDateFinished;
+
+ //What was the exchange rate
+ @Column (name ="CURRENCY_VALUE")
+ private BigDecimal currencyValue = new BigDecimal(1);//default 1-1
+
+ @Column (name ="ORDER_TOTAL")
+ private BigDecimal total;
+
+ @Column (name ="IP_ADDRESS")
+ private String ipAddress;
+
+ @Column (name ="CHANNEL")
+ @Enumerated(value = EnumType.STRING)
+ private OrderChannel channel;
+
+ @Column (name ="ORDER_TYPE")
+ @Enumerated(value = EnumType.STRING)
+ private OrderType orderType = OrderType.ORDER;
+
+ @Column (name ="PAYMENT_TYPE")
+ @Enumerated(value = EnumType.STRING)
+ private PaymentType paymentType;
+
+ @Column (name ="PAYMENT_MODULE_CODE")
+ private String paymentModuleCode;
+
+
+ @Column (name ="SHIPPING_MODULE_CODE")
+ private String shippingModuleCode;
+
+ @Column(name = "CUSTOMER_AGREED")
+ private Boolean customerAgreement = false;
+
+ @Column(name = "CONFIRMED_ADDRESS")
+ private Boolean confirmedAddress = false;
+
+ @Embedded
+ private Delivery delivery = null;
+
+ @Valid
+ @Embedded
+ private Billing billing = null;
+
+ @Embedded
+ private CreditCard creditCard = null;
+
+
+ @ManyToOne(targetEntity = Currency.class)
+ @JoinColumn(name = "CURRENCY_ID")
+ private Currency currency;
+
+ @Type(type="locale")
+ @Column (name ="LOCALE")
+ private Locale locale;
+
+
+
+ @ManyToOne(targetEntity = MerchantStore.class)
+ @JoinColumn(name="MERCHANTID")
+ private MerchantStore merchant;
+
+ //@OneToMany(mappedBy = "order")
+ //private Set<OrderAccount> orderAccounts = new HashSet<OrderAccount>();
+
+ @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
+ private Set<OrderProduct> orderProducts = new LinkedHashSet<OrderProduct>();
+
+ @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
+ @OrderBy(clause = "sort_order asc")
+ private Set<OrderTotal> orderTotal = new LinkedHashSet<OrderTotal>();
+
+ @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
+ @OrderBy(clause = "ORDER_STATUS_HISTORY_ID asc")
+ private Set<OrderStatusHistory> orderHistory = new LinkedHashSet<OrderStatusHistory>();
+
+ @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
+ private Set<OrderAttribute> orderAttributes = new LinkedHashSet<OrderAttribute>();
+
+ public Order() {
+ }
+
+ @Column (name ="CUSTOMER_EMAIL_ADDRESS", length=50, nullable=false)
+ private String customerEmailAddress;
+
+
+ @Override
+ public Long getId() {
+ return id;
+ }
+
+ @Override
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public OrderStatus getStatus() {
+ return status;
+ }
+
+ public void setStatus(OrderStatus status) {
+ this.status = status;
+ }
+
+ public Date getLastModified() {
+ return CloneUtils.clone(lastModified);
+ }
+
+ public void setLastModified(Date lastModified) {
+ this.lastModified = CloneUtils.clone(lastModified);
+ }
+
+ public Date getDatePurchased() {
+ return CloneUtils.clone(datePurchased);
+ }
+
+ public void setDatePurchased(Date datePurchased) {
+ this.datePurchased = CloneUtils.clone(datePurchased);
+ }
+
+ public Date getOrderDateFinished() {
+ return CloneUtils.clone(orderDateFinished);
+ }
+
+ public void setOrderDateFinished(Date orderDateFinished) {
+ this.orderDateFinished = CloneUtils.clone(orderDateFinished);
+ }
+
+ public BigDecimal getCurrencyValue() {
+ return currencyValue;
+ }
+
+ public void setCurrencyValue(BigDecimal currencyValue) {
+ this.currencyValue = currencyValue;
+ }
+
+ public BigDecimal getTotal() {
+ return total;
+ }
+
+ public void setTotal(BigDecimal total) {
+ this.total = total;
+ }
+
+
+ public String getIpAddress() {
+ return ipAddress;
+ }
+
+ public void setIpAddress(String ipAddress) {
+ this.ipAddress = ipAddress;
+ }
+
+
+ public String getPaymentModuleCode() {
+ return paymentModuleCode;
+ }
+
+ public void setPaymentModuleCode(String paymentModuleCode) {
+ this.paymentModuleCode = paymentModuleCode;
+ }
+
+
+
+ public String getShippingModuleCode() {
+ return shippingModuleCode;
+ }
+
+ public void setShippingModuleCode(String shippingModuleCode) {
+ this.shippingModuleCode = shippingModuleCode;
+ }
+
+
+
+ public Currency getCurrency() {
+ return currency;
+ }
+
+ public void setCurrency(Currency currency) {
+ this.currency = currency;
+ }
+
+ public MerchantStore getMerchant() {
+ return merchant;
+ }
+
+ public void setMerchant(MerchantStore merchant) {
+ this.merchant = merchant;
+ }
+
+ public Set<OrderProduct> getOrderProducts() {
+ return orderProducts;
+ }
+
+ public void setOrderProducts(Set<OrderProduct> orderProducts) {
+ this.orderProducts = orderProducts;
+ }
+
+ public Set<OrderTotal> getOrderTotal() {
+ return orderTotal;
+ }
+
+ public void setOrderTotal(Set<OrderTotal> orderTotal) {
+ this.orderTotal = orderTotal;
+ }
+
+ public Set<OrderStatusHistory> getOrderHistory() {
+ return orderHistory;
+ }
+
+ public void setOrderHistory(Set<OrderStatusHistory> orderHistory) {
+ this.orderHistory = orderHistory;
+ }
+
+
+ public void setDelivery(Delivery delivery) {
+ this.delivery = delivery;
+ }
+
+ public Delivery getDelivery() {
+ return delivery;
+ }
+
+ public void setBilling(Billing billing) {
+ this.billing = billing;
+ }
+
+ public Billing getBilling() {
+ return billing;
+ }
+
+ public Long getCustomerId() {
+ return customerId;
+ }
+
+ public void setCustomerId(Long customerId) {
+ this.customerId = customerId;
+ }
+
+
+ public String getCustomerEmailAddress() {
+ return customerEmailAddress;
+ }
+
+ public void setCustomerEmailAddress(String customerEmailAddress) {
+ this.customerEmailAddress = customerEmailAddress;
+ }
+
+
+ public void setChannel(OrderChannel channel) {
+ this.channel = channel;
+ }
+
+
+ public OrderChannel getChannel() {
+ return channel;
+ }
+
+
+ public void setCreditCard(CreditCard creditCard) {
+ this.creditCard = creditCard;
+ }
+
+
+ public CreditCard getCreditCard() {
+ return creditCard;
+ }
+
+
+ public void setPaymentType(PaymentType paymentType) {
+ this.paymentType = paymentType;
+ }
+
+
+ public PaymentType getPaymentType() {
+ return paymentType;
+ }
+
+ public OrderType getOrderType() {
+ return orderType;
+ }
+
+ public void setOrderType(OrderType orderType) {
+ this.orderType = orderType;
+ }
+
+ public Locale getLocale() {
+ return locale;
+ }
+
+ public void setLocale(Locale locale) {
+ this.locale = locale;
+ }
+
+ public Boolean getCustomerAgreement() {
+ return customerAgreement;
+ }
+
+ public void setCustomerAgreement(Boolean customerAgreement) {
+ this.customerAgreement = customerAgreement;
+ }
+
+ public Boolean getConfirmedAddress() {
+ return confirmedAddress;
+ }
+
+ public void setConfirmedAddress(Boolean confirmedAddress) {
+ this.confirmedAddress = confirmedAddress;
+ }
+
+ public Set<OrderAttribute> getOrderAttributes() {
+ return orderAttributes;
+ }
+
+ public void setOrderAttributes(Set<OrderAttribute> orderAttributes) {
+ this.orderAttributes = orderAttributes;
+ }
+
}
\ No newline at end of file
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderaccount/OrderAccount.java b/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderaccount/OrderAccount.java
index 53b24b9..6af387a 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderaccount/OrderAccount.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderaccount/OrderAccount.java
@@ -1,106 +1,106 @@
-package com.salesmanager.core.model.order.orderaccount;
-
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.generic.SalesManagerEntity;
-import com.salesmanager.core.model.order.Order;
-import com.salesmanager.core.utils.CloneUtils;
-
-@Entity
-@Table(name = "ORDER_ACCOUNT", schema = SchemaConstant.SALESMANAGER_SCHEMA)
-public class OrderAccount extends SalesManagerEntity<Long, OrderAccount> {
-private static final long serialVersionUID = -2429388347536330540L;
-
- @Id
- @Column(name = "ORDER_ACCOUNT_ID", unique = true, nullable = false)
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "ORDER_ACCOUNT_ID_NEXT_VALUE")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long id;
-
- @ManyToOne
- @JoinColumn(name = "ORDER_ID", nullable = false)
- private Order order;
-
- @Temporal(TemporalType.DATE)
- @Column(name = "ORDER_ACCOUNT_START_DATE", nullable = false, length = 0)
- private Date orderAccountStartDate;
-
- @Temporal(TemporalType.DATE)
- @Column(name = "ORDER_ACCOUNT_END_DATE", length = 0)
- private Date orderAccountEndDate;
-
- @Column(name = "ORDER_ACCOUNT_BILL_DAY", nullable = false)
- private Integer orderAccountBillDay;
-
- @OneToMany(mappedBy = "orderAccount", cascade = CascadeType.ALL)
- private Set<OrderAccountProduct> orderAccountProducts = new HashSet<OrderAccountProduct>();
-
- public OrderAccount() {
- }
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public Order getOrder() {
- return order;
- }
-
- public void setOrder(Order order) {
- this.order = order;
- }
-
- public Date getOrderAccountStartDate() {
- return CloneUtils.clone(orderAccountStartDate);
- }
-
- public void setOrderAccountStartDate(Date orderAccountStartDate) {
- this.orderAccountStartDate = CloneUtils.clone(orderAccountStartDate);
- }
-
- public Date getOrderAccountEndDate() {
- return CloneUtils.clone(orderAccountEndDate);
- }
-
- public void setOrderAccountEndDate(Date orderAccountEndDate) {
- this.orderAccountEndDate = CloneUtils.clone(orderAccountEndDate);
- }
-
- public Integer getOrderAccountBillDay() {
- return orderAccountBillDay;
- }
-
- public void setOrderAccountBillDay(Integer orderAccountBillDay) {
- this.orderAccountBillDay = orderAccountBillDay;
- }
-
- public Set<OrderAccountProduct> getOrderAccountProducts() {
- return orderAccountProducts;
- }
-
- public void setOrderAccountProducts(
- Set<OrderAccountProduct> orderAccountProducts) {
- this.orderAccountProducts = orderAccountProducts;
- }
-}
+package com.salesmanager.core.model.order.orderaccount;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.utils.CloneUtils;
+
+@Entity
+@Table(name = "ORDER_ACCOUNT", schema = SchemaConstant.SALESMANAGER_SCHEMA)
+public class OrderAccount extends SalesManagerEntity<Long, OrderAccount> {
+private static final long serialVersionUID = -2429388347536330540L;
+
+ @Id
+ @Column(name = "ORDER_ACCOUNT_ID", unique = true, nullable = false)
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "ORDER_ACCOUNT_ID_NEXT_VALUE")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+ @ManyToOne
+ @JoinColumn(name = "ORDER_ID", nullable = false)
+ private Order order;
+
+ @Temporal(TemporalType.DATE)
+ @Column(name = "ORDER_ACCOUNT_START_DATE", nullable = false, length = 0)
+ private Date orderAccountStartDate;
+
+ @Temporal(TemporalType.DATE)
+ @Column(name = "ORDER_ACCOUNT_END_DATE", length = 0)
+ private Date orderAccountEndDate;
+
+ @Column(name = "ORDER_ACCOUNT_BILL_DAY", nullable = false)
+ private Integer orderAccountBillDay;
+
+ @OneToMany(mappedBy = "orderAccount", cascade = CascadeType.ALL)
+ private Set<OrderAccountProduct> orderAccountProducts = new HashSet<OrderAccountProduct>();
+
+ public OrderAccount() {
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Order getOrder() {
+ return order;
+ }
+
+ public void setOrder(Order order) {
+ this.order = order;
+ }
+
+ public Date getOrderAccountStartDate() {
+ return CloneUtils.clone(orderAccountStartDate);
+ }
+
+ public void setOrderAccountStartDate(Date orderAccountStartDate) {
+ this.orderAccountStartDate = CloneUtils.clone(orderAccountStartDate);
+ }
+
+ public Date getOrderAccountEndDate() {
+ return CloneUtils.clone(orderAccountEndDate);
+ }
+
+ public void setOrderAccountEndDate(Date orderAccountEndDate) {
+ this.orderAccountEndDate = CloneUtils.clone(orderAccountEndDate);
+ }
+
+ public Integer getOrderAccountBillDay() {
+ return orderAccountBillDay;
+ }
+
+ public void setOrderAccountBillDay(Integer orderAccountBillDay) {
+ this.orderAccountBillDay = orderAccountBillDay;
+ }
+
+ public Set<OrderAccountProduct> getOrderAccountProducts() {
+ return orderAccountProducts;
+ }
+
+ public void setOrderAccountProducts(
+ Set<OrderAccountProduct> orderAccountProducts) {
+ this.orderAccountProducts = orderAccountProducts;
+ }
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderaccount/OrderAccountProduct.java b/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderaccount/OrderAccountProduct.java
index f98710d..aa03c68 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderaccount/OrderAccountProduct.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderaccount/OrderAccountProduct.java
@@ -1,166 +1,166 @@
-package com.salesmanager.core.model.order.orderaccount;
-
-import java.io.Serializable;
-import java.util.Date;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.order.orderproduct.OrderProduct;
-import com.salesmanager.core.utils.CloneUtils;
-
-@Entity
-@Table (name="ORDER_ACCOUNT_PRODUCT", schema=SchemaConstant.SALESMANAGER_SCHEMA )
-public class OrderAccountProduct implements Serializable {
- private static final long serialVersionUID = -7437197293537758668L;
-
- @Id
- @Column (name="ORDER_ACCOUNT_PRODUCT_ID")
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT",
- pkColumnValue = "ORDERACCOUNTPRODUCT_SEQ_NEXT_VAL")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long orderAccountProductId;
-
- @ManyToOne
- @JoinColumn(name = "ORDER_ACCOUNT_ID" , nullable=false)
- private OrderAccount orderAccount;
-
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name = "ORDER_PRODUCT_ID" , nullable=false)
- private OrderProduct orderProduct;
-
- @Temporal(TemporalType.DATE)
- @Column (name="ORDER_ACCOUNT_PRODUCT_ST_DT" , length=0 , nullable=false)
- private Date orderAccountProductStartDate;
-
- @Temporal(TemporalType.DATE)
- @Column (name="ORDER_ACCOUNT_PRODUCT_END_DT", length=0)
- private Date orderAccountProductEndDate;
-
- @Temporal(TemporalType.TIMESTAMP)
- @Column (name="ORDER_ACCOUNT_PRODUCT_EOT" , length=0 )
- private Date orderAccountProductEot;
-
- @Temporal(TemporalType.DATE)
- @Column (name="ORDER_ACCOUNT_PRODUCT_ACCNT_DT" , length=0 )
- private Date orderAccountProductAccountedDate;
-
- @Temporal(TemporalType.TIMESTAMP)
- @Column (name="ORDER_ACCOUNT_PRODUCT_L_ST_DT" , length=0 )
- private Date orderAccountProductLastStatusDate;
-
- @Column (name="ORDER_ACCOUNT_PRODUCT_L_TRX_ST" , nullable=false )
- private Integer orderAccountProductLastTransactionStatus;
-
- @Column (name="ORDER_ACCOUNT_PRODUCT_PM_FR_TY" , nullable=false )
- private Integer orderAccountProductPaymentFrequencyType;
-
- @Column (name="ORDER_ACCOUNT_PRODUCT_STATUS" , nullable=false )
- private Integer orderAccountProductStatus;
-
- public OrderAccountProduct() {
- }
-
- public Long getOrderAccountProductId() {
- return orderAccountProductId;
- }
-
- public void setOrderAccountProductId(Long orderAccountProductId) {
- this.orderAccountProductId = orderAccountProductId;
- }
-
- public OrderAccount getOrderAccount() {
- return orderAccount;
- }
-
- public void setOrderAccount(OrderAccount orderAccount) {
- this.orderAccount = orderAccount;
- }
-
- public OrderProduct getOrderProduct() {
- return orderProduct;
- }
-
- public void setOrderProduct(OrderProduct orderProduct) {
- this.orderProduct = orderProduct;
- }
-
- public Date getOrderAccountProductStartDate() {
- return CloneUtils.clone(orderAccountProductStartDate);
- }
-
- public void setOrderAccountProductStartDate(Date orderAccountProductStartDate) {
- this.orderAccountProductStartDate = CloneUtils.clone(orderAccountProductStartDate);
- }
-
- public Date getOrderAccountProductEndDate() {
- return CloneUtils.clone(orderAccountProductEndDate);
- }
-
- public void setOrderAccountProductEndDate(Date orderAccountProductEndDate) {
- this.orderAccountProductEndDate = CloneUtils.clone(orderAccountProductEndDate);
- }
-
- public Date getOrderAccountProductEot() {
- return CloneUtils.clone(orderAccountProductEot);
- }
-
- public void setOrderAccountProductEot(Date orderAccountProductEot) {
- this.orderAccountProductEot = CloneUtils.clone(orderAccountProductEot);
- }
-
- public Date getOrderAccountProductAccountedDate() {
- return CloneUtils.clone(orderAccountProductAccountedDate);
- }
-
- public void setOrderAccountProductAccountedDate(
- Date orderAccountProductAccountedDate) {
- this.orderAccountProductAccountedDate = CloneUtils.clone(orderAccountProductAccountedDate);
- }
-
- public Date getOrderAccountProductLastStatusDate() {
- return CloneUtils.clone(orderAccountProductLastStatusDate);
- }
-
- public void setOrderAccountProductLastStatusDate(
- Date orderAccountProductLastStatusDate) {
- this.orderAccountProductLastStatusDate = CloneUtils.clone(orderAccountProductLastStatusDate);
- }
-
- public Integer getOrderAccountProductLastTransactionStatus() {
- return orderAccountProductLastTransactionStatus;
- }
-
- public void setOrderAccountProductLastTransactionStatus(
- Integer orderAccountProductLastTransactionStatus) {
- this.orderAccountProductLastTransactionStatus = orderAccountProductLastTransactionStatus;
- }
-
- public Integer getOrderAccountProductPaymentFrequencyType() {
- return orderAccountProductPaymentFrequencyType;
- }
-
- public void setOrderAccountProductPaymentFrequencyType(
- Integer orderAccountProductPaymentFrequencyType) {
- this.orderAccountProductPaymentFrequencyType = orderAccountProductPaymentFrequencyType;
- }
-
- public Integer getOrderAccountProductStatus() {
- return orderAccountProductStatus;
- }
-
- public void setOrderAccountProductStatus(Integer orderAccountProductStatus) {
- this.orderAccountProductStatus = orderAccountProductStatus;
- }
-}
+package com.salesmanager.core.model.order.orderaccount;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.order.orderproduct.OrderProduct;
+import com.salesmanager.core.utils.CloneUtils;
+
+@Entity
+@Table (name="ORDER_ACCOUNT_PRODUCT", schema=SchemaConstant.SALESMANAGER_SCHEMA )
+public class OrderAccountProduct implements Serializable {
+ private static final long serialVersionUID = -7437197293537758668L;
+
+ @Id
+ @Column (name="ORDER_ACCOUNT_PRODUCT_ID")
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT",
+ pkColumnValue = "ORDERACCOUNTPRODUCT_SEQ_NEXT_VAL")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long orderAccountProductId;
+
+ @ManyToOne
+ @JoinColumn(name = "ORDER_ACCOUNT_ID" , nullable=false)
+ private OrderAccount orderAccount;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "ORDER_PRODUCT_ID" , nullable=false)
+ private OrderProduct orderProduct;
+
+ @Temporal(TemporalType.DATE)
+ @Column (name="ORDER_ACCOUNT_PRODUCT_ST_DT" , length=0 , nullable=false)
+ private Date orderAccountProductStartDate;
+
+ @Temporal(TemporalType.DATE)
+ @Column (name="ORDER_ACCOUNT_PRODUCT_END_DT", length=0)
+ private Date orderAccountProductEndDate;
+
+ @Temporal(TemporalType.TIMESTAMP)
+ @Column (name="ORDER_ACCOUNT_PRODUCT_EOT" , length=0 )
+ private Date orderAccountProductEot;
+
+ @Temporal(TemporalType.DATE)
+ @Column (name="ORDER_ACCOUNT_PRODUCT_ACCNT_DT" , length=0 )
+ private Date orderAccountProductAccountedDate;
+
+ @Temporal(TemporalType.TIMESTAMP)
+ @Column (name="ORDER_ACCOUNT_PRODUCT_L_ST_DT" , length=0 )
+ private Date orderAccountProductLastStatusDate;
+
+ @Column (name="ORDER_ACCOUNT_PRODUCT_L_TRX_ST" , nullable=false )
+ private Integer orderAccountProductLastTransactionStatus;
+
+ @Column (name="ORDER_ACCOUNT_PRODUCT_PM_FR_TY" , nullable=false )
+ private Integer orderAccountProductPaymentFrequencyType;
+
+ @Column (name="ORDER_ACCOUNT_PRODUCT_STATUS" , nullable=false )
+ private Integer orderAccountProductStatus;
+
+ public OrderAccountProduct() {
+ }
+
+ public Long getOrderAccountProductId() {
+ return orderAccountProductId;
+ }
+
+ public void setOrderAccountProductId(Long orderAccountProductId) {
+ this.orderAccountProductId = orderAccountProductId;
+ }
+
+ public OrderAccount getOrderAccount() {
+ return orderAccount;
+ }
+
+ public void setOrderAccount(OrderAccount orderAccount) {
+ this.orderAccount = orderAccount;
+ }
+
+ public OrderProduct getOrderProduct() {
+ return orderProduct;
+ }
+
+ public void setOrderProduct(OrderProduct orderProduct) {
+ this.orderProduct = orderProduct;
+ }
+
+ public Date getOrderAccountProductStartDate() {
+ return CloneUtils.clone(orderAccountProductStartDate);
+ }
+
+ public void setOrderAccountProductStartDate(Date orderAccountProductStartDate) {
+ this.orderAccountProductStartDate = CloneUtils.clone(orderAccountProductStartDate);
+ }
+
+ public Date getOrderAccountProductEndDate() {
+ return CloneUtils.clone(orderAccountProductEndDate);
+ }
+
+ public void setOrderAccountProductEndDate(Date orderAccountProductEndDate) {
+ this.orderAccountProductEndDate = CloneUtils.clone(orderAccountProductEndDate);
+ }
+
+ public Date getOrderAccountProductEot() {
+ return CloneUtils.clone(orderAccountProductEot);
+ }
+
+ public void setOrderAccountProductEot(Date orderAccountProductEot) {
+ this.orderAccountProductEot = CloneUtils.clone(orderAccountProductEot);
+ }
+
+ public Date getOrderAccountProductAccountedDate() {
+ return CloneUtils.clone(orderAccountProductAccountedDate);
+ }
+
+ public void setOrderAccountProductAccountedDate(
+ Date orderAccountProductAccountedDate) {
+ this.orderAccountProductAccountedDate = CloneUtils.clone(orderAccountProductAccountedDate);
+ }
+
+ public Date getOrderAccountProductLastStatusDate() {
+ return CloneUtils.clone(orderAccountProductLastStatusDate);
+ }
+
+ public void setOrderAccountProductLastStatusDate(
+ Date orderAccountProductLastStatusDate) {
+ this.orderAccountProductLastStatusDate = CloneUtils.clone(orderAccountProductLastStatusDate);
+ }
+
+ public Integer getOrderAccountProductLastTransactionStatus() {
+ return orderAccountProductLastTransactionStatus;
+ }
+
+ public void setOrderAccountProductLastTransactionStatus(
+ Integer orderAccountProductLastTransactionStatus) {
+ this.orderAccountProductLastTransactionStatus = orderAccountProductLastTransactionStatus;
+ }
+
+ public Integer getOrderAccountProductPaymentFrequencyType() {
+ return orderAccountProductPaymentFrequencyType;
+ }
+
+ public void setOrderAccountProductPaymentFrequencyType(
+ Integer orderAccountProductPaymentFrequencyType) {
+ this.orderAccountProductPaymentFrequencyType = orderAccountProductPaymentFrequencyType;
+ }
+
+ public Integer getOrderAccountProductStatus() {
+ return orderAccountProductStatus;
+ }
+
+ public void setOrderAccountProductStatus(Integer orderAccountProductStatus) {
+ this.orderAccountProductStatus = orderAccountProductStatus;
+ }
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderChannel.java b/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderChannel.java
index 1c74b73..a670cff 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderChannel.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderChannel.java
@@ -1,7 +1,7 @@
-package com.salesmanager.core.model.order;
-
-public enum OrderChannel {
-
- ONLINE
-
-}
+package com.salesmanager.core.model.order;
+
+public enum OrderChannel {
+
+ ONLINE, API
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderCriteria.java b/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderCriteria.java
index 3b82f5f..038f3f4 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderCriteria.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderCriteria.java
@@ -1,35 +1,35 @@
-package com.salesmanager.core.model.order;
-
-import com.salesmanager.core.model.common.Criteria;
-
-public class OrderCriteria extends Criteria {
-
- private String customerName;
- private String paymentMethod;
- private Long customerId;
- public void setPaymentMethod(String paymentMethod) {
- this.paymentMethod = paymentMethod;
- }
- public String getPaymentMethod() {
- return paymentMethod;
- }
- public void setCustomerName(String customerName) {
- this.customerName = customerName;
- }
- public String getCustomerName() {
- return customerName;
- }
- public Long getCustomerId()
- {
- return customerId;
- }
- public void setCustomerId( Long customerId )
- {
- this.customerId = customerId;
- }
-
-
-
-
-
-}
+package com.salesmanager.core.model.order;
+
+import com.salesmanager.core.model.common.Criteria;
+
+public class OrderCriteria extends Criteria {
+
+ private String customerName;
+ private String paymentMethod;
+ private Long customerId;
+ public void setPaymentMethod(String paymentMethod) {
+ this.paymentMethod = paymentMethod;
+ }
+ public String getPaymentMethod() {
+ return paymentMethod;
+ }
+ public void setCustomerName(String customerName) {
+ this.customerName = customerName;
+ }
+ public String getCustomerName() {
+ return customerName;
+ }
+ public Long getCustomerId()
+ {
+ return customerId;
+ }
+ public void setCustomerId( Long customerId )
+ {
+ this.customerId = customerId;
+ }
+
+
+
+
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderList.java b/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderList.java
index 06fd028..da9033e 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderList.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderList.java
@@ -1,23 +1,23 @@
-package com.salesmanager.core.model.order;
-
-import java.util.List;
-
-import com.salesmanager.core.model.common.EntityList;
-
-public class OrderList extends EntityList {
-
- /**
- *
- */
- private static final long serialVersionUID = -6645927228659963628L;
- private List<Order> orders;
-
- public void setOrders(List<Order> orders) {
- this.orders = orders;
- }
-
- public List<Order> getOrders() {
- return orders;
- }
-
-}
+package com.salesmanager.core.model.order;
+
+import java.util.List;
+
+import com.salesmanager.core.model.common.EntityList;
+
+public class OrderList extends EntityList {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -6645927228659963628L;
+ private List<Order> orders;
+
+ public void setOrders(List<Order> orders) {
+ this.orders = orders;
+ }
+
+ public List<Order> getOrders() {
+ return orders;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderproduct/OrderProduct.java b/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderproduct/OrderProduct.java
index 326fe8c..4b04390 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderproduct/OrderProduct.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderproduct/OrderProduct.java
@@ -1,140 +1,140 @@
-package com.salesmanager.core.model.order.orderproduct;
-
-import java.math.BigDecimal;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.generic.SalesManagerEntity;
-import com.salesmanager.core.model.order.Order;
-
-@Entity
-@Table (name="ORDER_PRODUCT" , schema=SchemaConstant.SALESMANAGER_SCHEMA)
-public class OrderProduct extends SalesManagerEntity<Long, OrderProduct> {
- private static final long serialVersionUID = 176131742783954627L;
-
- @Id
- @Column (name="ORDER_PRODUCT_ID")
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "ORDER_PRODUCT_ID_NEXT_VALUE")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long id;
-
- @Column (name="PRODUCT_SKU")
- private String sku;
-
- @Column (name="PRODUCT_NAME" , length=64 , nullable=false)
- private String productName;
-
- @Column (name="PRODUCT_QUANTITY")
- private int productQuantity;
-
- @Column (name="ONETIME_CHARGE" , nullable=false )
- private BigDecimal oneTimeCharge;
-
-
- @ManyToOne(targetEntity = Order.class)
- @JoinColumn(name = "ORDER_ID", nullable = false)
- private Order order;
-
- @OneToMany(mappedBy = "orderProduct", cascade = CascadeType.ALL)
- private Set<OrderProductAttribute> orderAttributes = new HashSet<OrderProductAttribute>();
-
- @OneToMany(mappedBy = "orderProduct", cascade = CascadeType.ALL)
- private Set<OrderProductPrice> prices = new HashSet<OrderProductPrice>();
-
- @OneToMany(mappedBy = "orderProduct", cascade = CascadeType.ALL)
- private Set<OrderProductDownload> downloads = new HashSet<OrderProductDownload>();
-
- public OrderProduct() {
- }
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
-
- public String getProductName() {
- return productName;
- }
-
- public void setProductName(String productName) {
- this.productName = productName;
- }
-
- public int getProductQuantity() {
- return productQuantity;
- }
-
- public void setProductQuantity(int productQuantity) {
- this.productQuantity = productQuantity;
- }
-
-
-
- public Order getOrder() {
- return order;
- }
-
- public void setOrder(Order order) {
- this.order = order;
- }
-
-
- public Set<OrderProductAttribute> getOrderAttributes() {
- return orderAttributes;
- }
-
- public void setOrderAttributes(Set<OrderProductAttribute> orderAttributes) {
- this.orderAttributes = orderAttributes;
- }
-
- public Set<OrderProductPrice> getPrices() {
- return prices;
- }
-
- public void setPrices(Set<OrderProductPrice> prices) {
- this.prices = prices;
- }
-
- public Set<OrderProductDownload> getDownloads() {
- return downloads;
- }
-
- public void setDownloads(Set<OrderProductDownload> downloads) {
- this.downloads = downloads;
- }
-
-
- public void setSku(String sku) {
- this.sku = sku;
- }
-
- public String getSku() {
- return sku;
- }
-
- public void setOneTimeCharge(BigDecimal oneTimeCharge) {
- this.oneTimeCharge = oneTimeCharge;
- }
-
- public BigDecimal getOneTimeCharge() {
- return oneTimeCharge;
- }
-
-}
+package com.salesmanager.core.model.order.orderproduct;
+
+import java.math.BigDecimal;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+import com.salesmanager.core.model.order.Order;
+
+@Entity
+@Table (name="ORDER_PRODUCT" , schema=SchemaConstant.SALESMANAGER_SCHEMA)
+public class OrderProduct extends SalesManagerEntity<Long, OrderProduct> {
+ private static final long serialVersionUID = 176131742783954627L;
+
+ @Id
+ @Column (name="ORDER_PRODUCT_ID")
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "ORDER_PRODUCT_ID_NEXT_VALUE")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+ @Column (name="PRODUCT_SKU")
+ private String sku;
+
+ @Column (name="PRODUCT_NAME" , length=64 , nullable=false)
+ private String productName;
+
+ @Column (name="PRODUCT_QUANTITY")
+ private int productQuantity;
+
+ @Column (name="ONETIME_CHARGE" , nullable=false )
+ private BigDecimal oneTimeCharge;
+
+
+ @ManyToOne(targetEntity = Order.class)
+ @JoinColumn(name = "ORDER_ID", nullable = false)
+ private Order order;
+
+ @OneToMany(mappedBy = "orderProduct", cascade = CascadeType.ALL)
+ private Set<OrderProductAttribute> orderAttributes = new HashSet<OrderProductAttribute>();
+
+ @OneToMany(mappedBy = "orderProduct", cascade = CascadeType.ALL)
+ private Set<OrderProductPrice> prices = new HashSet<OrderProductPrice>();
+
+ @OneToMany(mappedBy = "orderProduct", cascade = CascadeType.ALL)
+ private Set<OrderProductDownload> downloads = new HashSet<OrderProductDownload>();
+
+ public OrderProduct() {
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+
+ public String getProductName() {
+ return productName;
+ }
+
+ public void setProductName(String productName) {
+ this.productName = productName;
+ }
+
+ public int getProductQuantity() {
+ return productQuantity;
+ }
+
+ public void setProductQuantity(int productQuantity) {
+ this.productQuantity = productQuantity;
+ }
+
+
+
+ public Order getOrder() {
+ return order;
+ }
+
+ public void setOrder(Order order) {
+ this.order = order;
+ }
+
+
+ public Set<OrderProductAttribute> getOrderAttributes() {
+ return orderAttributes;
+ }
+
+ public void setOrderAttributes(Set<OrderProductAttribute> orderAttributes) {
+ this.orderAttributes = orderAttributes;
+ }
+
+ public Set<OrderProductPrice> getPrices() {
+ return prices;
+ }
+
+ public void setPrices(Set<OrderProductPrice> prices) {
+ this.prices = prices;
+ }
+
+ public Set<OrderProductDownload> getDownloads() {
+ return downloads;
+ }
+
+ public void setDownloads(Set<OrderProductDownload> downloads) {
+ this.downloads = downloads;
+ }
+
+
+ public void setSku(String sku) {
+ this.sku = sku;
+ }
+
+ public String getSku() {
+ return sku;
+ }
+
+ public void setOneTimeCharge(BigDecimal oneTimeCharge) {
+ this.oneTimeCharge = oneTimeCharge;
+ }
+
+ public BigDecimal getOneTimeCharge() {
+ return oneTimeCharge;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderproduct/OrderProductAttribute.java b/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderproduct/OrderProductAttribute.java
index dcde319..78f1a76 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderproduct/OrderProductAttribute.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderproduct/OrderProductAttribute.java
@@ -1,132 +1,132 @@
-package com.salesmanager.core.model.order.orderproduct;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-
-import com.salesmanager.core.constants.SchemaConstant;
-
-@Entity
-@Table (name="ORDER_PRODUCT_ATTRIBUTE" , schema=SchemaConstant.SALESMANAGER_SCHEMA)
-public class OrderProductAttribute implements Serializable {
- private static final long serialVersionUID = 6037571119918073015L;
-
- @Id
- @Column (name="ORDER_PRODUCT_ATTRIBUTE_ID", nullable=false , unique=true )
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "ORDER_PRODUCT_ATTR_ID_NEXT_VAL")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long id;
-
- @Column ( name= "PRODUCT_ATTRIBUTE_PRICE" , nullable=false , precision=15 , scale=4 )
- private BigDecimal productAttributePrice;
-
- @Column ( name= "PRODUCT_ATTRIBUTE_IS_FREE" , nullable=false )
- private boolean productAttributeIsFree;
-
- @Column ( name= "PRODUCT_ATTRIBUTE_WEIGHT" , precision=15 , scale=4 )
- private java.math.BigDecimal productAttributeWeight;
-
- @ManyToOne
- @JoinColumn(name = "ORDER_PRODUCT_ID", nullable = false)
- private OrderProduct orderProduct;
-
- @Column(name = "PRODUCT_OPTION_ID", nullable = false)
- private Long productOptionId;
-
-
- @Column(name = "PRODUCT_OPTION_VALUE_ID", nullable = false)
- private Long productOptionValueId;
-
- @Column ( name= "PRODUCT_ATTRIBUTE_NAME")
- private String productAttributeName;
-
- @Column ( name= "PRODUCT_ATTRIBUTE_VAL_NAME")
- private String productAttributeValueName;
-
- public OrderProductAttribute() {
- }
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
-
- public boolean isProductAttributeIsFree() {
- return productAttributeIsFree;
- }
-
- public void setProductAttributeIsFree(boolean productAttributeIsFree) {
- this.productAttributeIsFree = productAttributeIsFree;
- }
-
- public java.math.BigDecimal getProductAttributeWeight() {
- return productAttributeWeight;
- }
-
- public void setProductAttributeWeight(
- java.math.BigDecimal productAttributeWeight) {
- this.productAttributeWeight = productAttributeWeight;
- }
-
- public OrderProduct getOrderProduct() {
- return orderProduct;
- }
-
- public void setOrderProduct(OrderProduct orderProduct) {
- this.orderProduct = orderProduct;
- }
-
- public String getProductAttributeName() {
- return productAttributeName;
- }
-
- public void setProductAttributeName(String productAttributeName) {
- this.productAttributeName = productAttributeName;
- }
-
- public String getProductAttributeValueName() {
- return productAttributeValueName;
- }
-
- public void setProductAttributeValueName(String productAttributeValueName) {
- this.productAttributeValueName = productAttributeValueName;
- }
-
- public BigDecimal getProductAttributePrice() {
- return productAttributePrice;
- }
-
- public void setProductAttributePrice(BigDecimal productAttributePrice) {
- this.productAttributePrice = productAttributePrice;
- }
-
- public Long getProductOptionId() {
- return productOptionId;
- }
-
- public void setProductOptionId(Long productOptionId) {
- this.productOptionId = productOptionId;
- }
-
- public Long getProductOptionValueId() {
- return productOptionValueId;
- }
-
- public void setProductOptionValueId(Long productOptionValueId) {
- this.productOptionValueId = productOptionValueId;
- }
-
-}
+package com.salesmanager.core.model.order.orderproduct;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+
+import com.salesmanager.core.constants.SchemaConstant;
+
+@Entity
+@Table (name="ORDER_PRODUCT_ATTRIBUTE" , schema=SchemaConstant.SALESMANAGER_SCHEMA)
+public class OrderProductAttribute implements Serializable {
+ private static final long serialVersionUID = 6037571119918073015L;
+
+ @Id
+ @Column (name="ORDER_PRODUCT_ATTRIBUTE_ID", nullable=false , unique=true )
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "ORDER_PRODUCT_ATTR_ID_NEXT_VAL")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+ @Column ( name= "PRODUCT_ATTRIBUTE_PRICE" , nullable=false , precision=15 , scale=4 )
+ private BigDecimal productAttributePrice;
+
+ @Column ( name= "PRODUCT_ATTRIBUTE_IS_FREE" , nullable=false )
+ private boolean productAttributeIsFree;
+
+ @Column ( name= "PRODUCT_ATTRIBUTE_WEIGHT" , precision=15 , scale=4 )
+ private java.math.BigDecimal productAttributeWeight;
+
+ @ManyToOne
+ @JoinColumn(name = "ORDER_PRODUCT_ID", nullable = false)
+ private OrderProduct orderProduct;
+
+ @Column(name = "PRODUCT_OPTION_ID", nullable = false)
+ private Long productOptionId;
+
+
+ @Column(name = "PRODUCT_OPTION_VALUE_ID", nullable = false)
+ private Long productOptionValueId;
+
+ @Column ( name= "PRODUCT_ATTRIBUTE_NAME")
+ private String productAttributeName;
+
+ @Column ( name= "PRODUCT_ATTRIBUTE_VAL_NAME")
+ private String productAttributeValueName;
+
+ public OrderProductAttribute() {
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+
+ public boolean isProductAttributeIsFree() {
+ return productAttributeIsFree;
+ }
+
+ public void setProductAttributeIsFree(boolean productAttributeIsFree) {
+ this.productAttributeIsFree = productAttributeIsFree;
+ }
+
+ public java.math.BigDecimal getProductAttributeWeight() {
+ return productAttributeWeight;
+ }
+
+ public void setProductAttributeWeight(
+ java.math.BigDecimal productAttributeWeight) {
+ this.productAttributeWeight = productAttributeWeight;
+ }
+
+ public OrderProduct getOrderProduct() {
+ return orderProduct;
+ }
+
+ public void setOrderProduct(OrderProduct orderProduct) {
+ this.orderProduct = orderProduct;
+ }
+
+ public String getProductAttributeName() {
+ return productAttributeName;
+ }
+
+ public void setProductAttributeName(String productAttributeName) {
+ this.productAttributeName = productAttributeName;
+ }
+
+ public String getProductAttributeValueName() {
+ return productAttributeValueName;
+ }
+
+ public void setProductAttributeValueName(String productAttributeValueName) {
+ this.productAttributeValueName = productAttributeValueName;
+ }
+
+ public BigDecimal getProductAttributePrice() {
+ return productAttributePrice;
+ }
+
+ public void setProductAttributePrice(BigDecimal productAttributePrice) {
+ this.productAttributePrice = productAttributePrice;
+ }
+
+ public Long getProductOptionId() {
+ return productOptionId;
+ }
+
+ public void setProductOptionId(Long productOptionId) {
+ this.productOptionId = productOptionId;
+ }
+
+ public Long getProductOptionValueId() {
+ return productOptionValueId;
+ }
+
+ public void setProductOptionValueId(Long productOptionValueId) {
+ this.productOptionValueId = productOptionValueId;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderproduct/OrderProductDownload.java b/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderproduct/OrderProductDownload.java
index 60e4b4e..1c4ca44 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderproduct/OrderProductDownload.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderproduct/OrderProductDownload.java
@@ -1,90 +1,90 @@
-package com.salesmanager.core.model.order.orderproduct;
-
-import java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.generic.SalesManagerEntity;
-
-@Entity
-@Table (name="ORDER_PRODUCT_DOWNLOAD", schema=SchemaConstant.SALESMANAGER_SCHEMA)
-public class OrderProductDownload extends SalesManagerEntity<Long, OrderProductDownload> implements Serializable {
- private static final long serialVersionUID = -8935511990745477240L;
-
- public final static int DEFAULT_DOWNLOAD_MAX_DAYS = 31;
-
- @Id
- @Column (name="ORDER_PRODUCT_DOWNLOAD_ID")
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "ORDER_PRODUCT_DL_ID_NEXT_VALUE")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long id;
-
- @ManyToOne
- @JoinColumn(name = "ORDER_PRODUCT_ID", nullable = false)
- private OrderProduct orderProduct;
-
- @Column(name = "ORDER_PRODUCT_FILENAME", nullable = false)
- private String orderProductFilename;
-
- @Column(name = "DOWNLOAD_MAXDAYS", nullable = false)
- private Integer maxdays = DEFAULT_DOWNLOAD_MAX_DAYS;
-
- @Column(name = "DOWNLOAD_COUNT", nullable = false)
- private Integer downloadCount;
-
-
-
- public OrderProductDownload() {
- }
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public OrderProduct getOrderProduct() {
- return orderProduct;
- }
-
- public void setOrderProduct(OrderProduct orderProduct) {
- this.orderProduct = orderProduct;
- }
-
- public String getOrderProductFilename() {
- return orderProductFilename;
- }
-
- public void setOrderProductFilename(String orderProductFilename) {
- this.orderProductFilename = orderProductFilename;
- }
-
- public Integer getMaxdays() {
- return maxdays;
- }
-
- public void setMaxdays(Integer maxdays) {
- this.maxdays = maxdays;
- }
-
- public Integer getDownloadCount() {
- return downloadCount;
- }
-
- public void setDownloadCount(Integer downloadCount) {
- this.downloadCount = downloadCount;
- }
-
-
+package com.salesmanager.core.model.order.orderproduct;
+
+import java.io.Serializable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+
+@Entity
+@Table (name="ORDER_PRODUCT_DOWNLOAD", schema=SchemaConstant.SALESMANAGER_SCHEMA)
+public class OrderProductDownload extends SalesManagerEntity<Long, OrderProductDownload> implements Serializable {
+ private static final long serialVersionUID = -8935511990745477240L;
+
+ public final static int DEFAULT_DOWNLOAD_MAX_DAYS = 31;
+
+ @Id
+ @Column (name="ORDER_PRODUCT_DOWNLOAD_ID")
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "ORDER_PRODUCT_DL_ID_NEXT_VALUE")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+ @ManyToOne
+ @JoinColumn(name = "ORDER_PRODUCT_ID", nullable = false)
+ private OrderProduct orderProduct;
+
+ @Column(name = "ORDER_PRODUCT_FILENAME", nullable = false)
+ private String orderProductFilename;
+
+ @Column(name = "DOWNLOAD_MAXDAYS", nullable = false)
+ private Integer maxdays = DEFAULT_DOWNLOAD_MAX_DAYS;
+
+ @Column(name = "DOWNLOAD_COUNT", nullable = false)
+ private Integer downloadCount;
+
+
+
+ public OrderProductDownload() {
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public OrderProduct getOrderProduct() {
+ return orderProduct;
+ }
+
+ public void setOrderProduct(OrderProduct orderProduct) {
+ this.orderProduct = orderProduct;
+ }
+
+ public String getOrderProductFilename() {
+ return orderProductFilename;
+ }
+
+ public void setOrderProductFilename(String orderProductFilename) {
+ this.orderProductFilename = orderProductFilename;
+ }
+
+ public Integer getMaxdays() {
+ return maxdays;
+ }
+
+ public void setMaxdays(Integer maxdays) {
+ this.maxdays = maxdays;
+ }
+
+ public Integer getDownloadCount() {
+ return downloadCount;
+ }
+
+ public void setDownloadCount(Integer downloadCount) {
+ this.downloadCount = downloadCount;
+ }
+
+
}
\ No newline at end of file
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderproduct/OrderProductPrice.java b/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderproduct/OrderProductPrice.java
index 963cb11..429fd02 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderproduct/OrderProductPrice.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderproduct/OrderProductPrice.java
@@ -1,138 +1,138 @@
-package com.salesmanager.core.model.order.orderproduct;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.Date;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-
-import com.salesmanager.core.constants.SchemaConstant;
-
-@Entity
-@Table (name="ORDER_PRODUCT_PRICE" , schema=SchemaConstant.SALESMANAGER_SCHEMA)
-public class OrderProductPrice implements Serializable {
- private static final long serialVersionUID = 3734737890163564311L;
-
- @Id
- @Column (name="ORDER_PRODUCT_PRICE_ID")
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT",
- pkColumnValue = "ORDER_PRD_PRICE_ID_NEXT_VAL")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long id;
-
- @ManyToOne
- @JoinColumn(name = "ORDER_PRODUCT_ID", nullable = false)
- private OrderProduct orderProduct;
-
-
- @Column(name = "PRODUCT_PRICE_CODE", nullable = false , length=64 )
- private String productPriceCode;
-
- @Column(name = "PRODUCT_PRICE", nullable = false)
- private BigDecimal productPrice;
-
- @Column(name = "PRODUCT_PRICE_SPECIAL")
- private BigDecimal productPriceSpecial;
-
- @Temporal(TemporalType.TIMESTAMP)
- @Column (name="PRD_PRICE_SPECIAL_ST_DT" , length=0)
- private Date productPriceSpecialStartDate;
-
- @Temporal(TemporalType.TIMESTAMP)
- @Column (name="PRD_PRICE_SPECIAL_END_DT" , length=0)
- private Date productPriceSpecialEndDate;
-
-
- @Column(name = "DEFAULT_PRICE", nullable = false)
- private Boolean defaultPrice;
-
-
- @Column(name = "PRODUCT_PRICE_NAME", nullable = true)
- private String productPriceName;
-
- public OrderProductPrice() {
- }
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public Boolean getDefaultPrice() {
- return defaultPrice;
- }
-
- public void setDefaultPrice(Boolean defaultPrice) {
- this.defaultPrice = defaultPrice;
- }
-
- public String getProductPriceName() {
- return productPriceName;
- }
-
- public void setProductPriceName(String productPriceName) {
- this.productPriceName = productPriceName;
- }
-
- public OrderProduct getOrderProduct() {
- return orderProduct;
- }
-
- public void setOrderProduct(OrderProduct orderProduct) {
- this.orderProduct = orderProduct;
- }
-
- public void setProductPriceCode(String productPriceCode) {
- this.productPriceCode = productPriceCode;
- }
-
- public String getProductPriceCode() {
- return productPriceCode;
- }
-
- public void setProductPriceSpecialStartDate(
- Date productPriceSpecialStartDate) {
- this.productPriceSpecialStartDate = productPriceSpecialStartDate;
- }
-
- public Date getProductPriceSpecialStartDate() {
- return productPriceSpecialStartDate;
- }
-
- public void setProductPriceSpecialEndDate(Date productPriceSpecialEndDate) {
- this.productPriceSpecialEndDate = productPriceSpecialEndDate;
- }
-
- public Date getProductPriceSpecialEndDate() {
- return productPriceSpecialEndDate;
- }
-
- public void setProductPriceSpecial(BigDecimal productPriceSpecial) {
- this.productPriceSpecial = productPriceSpecial;
- }
-
- public BigDecimal getProductPriceSpecial() {
- return productPriceSpecial;
- }
-
- public void setProductPrice(BigDecimal productPrice) {
- this.productPrice = productPrice;
- }
-
- public BigDecimal getProductPrice() {
- return productPrice;
- }
-}
+package com.salesmanager.core.model.order.orderproduct;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import com.salesmanager.core.constants.SchemaConstant;
+
+@Entity
+@Table (name="ORDER_PRODUCT_PRICE" , schema=SchemaConstant.SALESMANAGER_SCHEMA)
+public class OrderProductPrice implements Serializable {
+ private static final long serialVersionUID = 3734737890163564311L;
+
+ @Id
+ @Column (name="ORDER_PRODUCT_PRICE_ID")
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT",
+ pkColumnValue = "ORDER_PRD_PRICE_ID_NEXT_VAL")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+ @ManyToOne
+ @JoinColumn(name = "ORDER_PRODUCT_ID", nullable = false)
+ private OrderProduct orderProduct;
+
+
+ @Column(name = "PRODUCT_PRICE_CODE", nullable = false , length=64 )
+ private String productPriceCode;
+
+ @Column(name = "PRODUCT_PRICE", nullable = false)
+ private BigDecimal productPrice;
+
+ @Column(name = "PRODUCT_PRICE_SPECIAL")
+ private BigDecimal productPriceSpecial;
+
+ @Temporal(TemporalType.TIMESTAMP)
+ @Column (name="PRD_PRICE_SPECIAL_ST_DT" , length=0)
+ private Date productPriceSpecialStartDate;
+
+ @Temporal(TemporalType.TIMESTAMP)
+ @Column (name="PRD_PRICE_SPECIAL_END_DT" , length=0)
+ private Date productPriceSpecialEndDate;
+
+
+ @Column(name = "DEFAULT_PRICE", nullable = false)
+ private Boolean defaultPrice;
+
+
+ @Column(name = "PRODUCT_PRICE_NAME", nullable = true)
+ private String productPriceName;
+
+ public OrderProductPrice() {
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Boolean getDefaultPrice() {
+ return defaultPrice;
+ }
+
+ public void setDefaultPrice(Boolean defaultPrice) {
+ this.defaultPrice = defaultPrice;
+ }
+
+ public String getProductPriceName() {
+ return productPriceName;
+ }
+
+ public void setProductPriceName(String productPriceName) {
+ this.productPriceName = productPriceName;
+ }
+
+ public OrderProduct getOrderProduct() {
+ return orderProduct;
+ }
+
+ public void setOrderProduct(OrderProduct orderProduct) {
+ this.orderProduct = orderProduct;
+ }
+
+ public void setProductPriceCode(String productPriceCode) {
+ this.productPriceCode = productPriceCode;
+ }
+
+ public String getProductPriceCode() {
+ return productPriceCode;
+ }
+
+ public void setProductPriceSpecialStartDate(
+ Date productPriceSpecialStartDate) {
+ this.productPriceSpecialStartDate = productPriceSpecialStartDate;
+ }
+
+ public Date getProductPriceSpecialStartDate() {
+ return productPriceSpecialStartDate;
+ }
+
+ public void setProductPriceSpecialEndDate(Date productPriceSpecialEndDate) {
+ this.productPriceSpecialEndDate = productPriceSpecialEndDate;
+ }
+
+ public Date getProductPriceSpecialEndDate() {
+ return productPriceSpecialEndDate;
+ }
+
+ public void setProductPriceSpecial(BigDecimal productPriceSpecial) {
+ this.productPriceSpecial = productPriceSpecial;
+ }
+
+ public BigDecimal getProductPriceSpecial() {
+ return productPriceSpecial;
+ }
+
+ public void setProductPrice(BigDecimal productPrice) {
+ this.productPrice = productPrice;
+ }
+
+ public BigDecimal getProductPrice() {
+ return productPrice;
+ }
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderstatus/OrderStatusHistory.java b/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderstatus/OrderStatusHistory.java
index 5ddaec7..08575a6 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderstatus/OrderStatusHistory.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/order/orderstatus/OrderStatusHistory.java
@@ -1,107 +1,107 @@
-package com.salesmanager.core.model.order.orderstatus;
-
-import java.io.Serializable;
-import java.util.Date;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-
-import org.hibernate.annotations.Type;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.order.Order;
-import com.salesmanager.core.utils.CloneUtils;
-
-@Entity
-@Table (name="ORDER_STATUS_HISTORY" , schema=SchemaConstant.SALESMANAGER_SCHEMA)
-public class OrderStatusHistory implements Serializable {
- private static final long serialVersionUID = 3438730310126102187L;
-
- @Id
- @Column ( name="ORDER_STATUS_HISTORY_ID")
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT",
- pkColumnValue = "STATUS_HIST_ID_NEXT_VALUE")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long id;
-
- @ManyToOne(targetEntity = Order.class)
- @JoinColumn(name = "ORDER_ID", nullable = false)
- private Order order;
-
- @Enumerated(value = EnumType.STRING)
- private OrderStatus status;
-
- @Temporal(TemporalType.TIMESTAMP)
- @Column(name = "DATE_ADDED", nullable = false)
- private Date dateAdded;
-
- @Column(name = "CUSTOMER_NOTIFIED")
- private java.lang.Integer customerNotified;
-
- @Column(name = "COMMENTS")
- @Type(type = "org.hibernate.type.StringClobType")
- private String comments;
-
- public OrderStatusHistory() {
- }
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public Order getOrder() {
- return order;
- }
-
- public void setOrder(Order order) {
- this.order = order;
- }
-
- public OrderStatus getStatus() {
- return status;
- }
-
- public void setStatus(OrderStatus status) {
- this.status = status;
- }
-
- public Date getDateAdded() {
- return CloneUtils.clone(dateAdded);
- }
-
- public void setDateAdded(Date dateAdded) {
- this.dateAdded = CloneUtils.clone(dateAdded);
- }
-
- public java.lang.Integer getCustomerNotified() {
- return customerNotified;
- }
-
- public void setCustomerNotified(java.lang.Integer customerNotified) {
- this.customerNotified = customerNotified;
- }
-
- public String getComments() {
- return comments;
- }
-
- public void setComments(String comments) {
- this.comments = comments;
- }
-
+package com.salesmanager.core.model.order.orderstatus;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import org.hibernate.annotations.Type;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.utils.CloneUtils;
+
+@Entity
+@Table (name="ORDER_STATUS_HISTORY" , schema=SchemaConstant.SALESMANAGER_SCHEMA)
+public class OrderStatusHistory implements Serializable {
+ private static final long serialVersionUID = 3438730310126102187L;
+
+ @Id
+ @Column ( name="ORDER_STATUS_HISTORY_ID")
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT",
+ pkColumnValue = "STATUS_HIST_ID_NEXT_VALUE")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+ @ManyToOne(targetEntity = Order.class)
+ @JoinColumn(name = "ORDER_ID", nullable = false)
+ private Order order;
+
+ @Enumerated(value = EnumType.STRING)
+ private OrderStatus status;
+
+ @Temporal(TemporalType.TIMESTAMP)
+ @Column(name = "DATE_ADDED", nullable = false)
+ private Date dateAdded;
+
+ @Column(name = "CUSTOMER_NOTIFIED")
+ private java.lang.Integer customerNotified;
+
+ @Column(name = "COMMENTS")
+ @Type(type = "org.hibernate.type.StringClobType")
+ private String comments;
+
+ public OrderStatusHistory() {
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Order getOrder() {
+ return order;
+ }
+
+ public void setOrder(Order order) {
+ this.order = order;
+ }
+
+ public OrderStatus getStatus() {
+ return status;
+ }
+
+ public void setStatus(OrderStatus status) {
+ this.status = status;
+ }
+
+ public Date getDateAdded() {
+ return CloneUtils.clone(dateAdded);
+ }
+
+ public void setDateAdded(Date dateAdded) {
+ this.dateAdded = CloneUtils.clone(dateAdded);
+ }
+
+ public java.lang.Integer getCustomerNotified() {
+ return customerNotified;
+ }
+
+ public void setCustomerNotified(java.lang.Integer customerNotified) {
+ this.customerNotified = customerNotified;
+ }
+
+ public String getComments() {
+ return comments;
+ }
+
+ public void setComments(String comments) {
+ this.comments = comments;
+ }
+
}
\ No newline at end of file
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderSummary.java b/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderSummary.java
index 4e24643..901c3c8 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderSummary.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderSummary.java
@@ -1,47 +1,47 @@
-package com.salesmanager.core.model.order;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-import com.salesmanager.core.model.shipping.ShippingSummary;
-import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
-
-
-/**
- * This object is used as input object for many services
- * such as order total calculation and tax calculation
- * @author Carl Samson
- *
- */
-public class OrderSummary implements Serializable {
-
-
- /**
- *
- */
- private OrderSummaryType orderSummaryType = OrderSummaryType.ORDERTOTAL;
- private static final long serialVersionUID = 1L;
- private ShippingSummary shippingSummary;
- private List<ShoppingCartItem> products = new ArrayList<ShoppingCartItem>();
-
- public void setProducts(List<ShoppingCartItem> products) {
- this.products = products;
- }
- public List<ShoppingCartItem> getProducts() {
- return products;
- }
- public void setShippingSummary(ShippingSummary shippingSummary) {
- this.shippingSummary = shippingSummary;
- }
- public ShippingSummary getShippingSummary() {
- return shippingSummary;
- }
- public OrderSummaryType getOrderSummaryType() {
- return orderSummaryType;
- }
- public void setOrderSummaryType(OrderSummaryType orderSummaryType) {
- this.orderSummaryType = orderSummaryType;
- }
-
-}
+package com.salesmanager.core.model.order;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.salesmanager.core.model.shipping.ShippingSummary;
+import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
+
+
+/**
+ * This object is used as input object for many services
+ * such as order total calculation and tax calculation
+ * @author Carl Samson
+ *
+ */
+public class OrderSummary implements Serializable {
+
+
+ /**
+ *
+ */
+ private OrderSummaryType orderSummaryType = OrderSummaryType.ORDERTOTAL;
+ private static final long serialVersionUID = 1L;
+ private ShippingSummary shippingSummary;
+ private List<ShoppingCartItem> products = new ArrayList<ShoppingCartItem>();
+
+ public void setProducts(List<ShoppingCartItem> products) {
+ this.products = products;
+ }
+ public List<ShoppingCartItem> getProducts() {
+ return products;
+ }
+ public void setShippingSummary(ShippingSummary shippingSummary) {
+ this.shippingSummary = shippingSummary;
+ }
+ public ShippingSummary getShippingSummary() {
+ return shippingSummary;
+ }
+ public OrderSummaryType getOrderSummaryType() {
+ return orderSummaryType;
+ }
+ public void setOrderSummaryType(OrderSummaryType orderSummaryType) {
+ this.orderSummaryType = orderSummaryType;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderTotal.java b/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderTotal.java
index 48983a0..272fb83 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderTotal.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderTotal.java
@@ -1,155 +1,155 @@
-package com.salesmanager.core.model.order;
-
-import java.math.BigDecimal;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-
-import org.hibernate.annotations.Type;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.generic.SalesManagerEntity;
-
-
-/**
- * Order line items related to an order.
- * @author casams1
- *
- */
-
-@Entity
-@Table (name="ORDER_TOTAL" , schema=SchemaConstant.SALESMANAGER_SCHEMA)
-public class OrderTotal extends SalesManagerEntity<Long, OrderTotal> {
- private static final long serialVersionUID = -5885315557404081674L;
-
- @Id
- @Column(name = "ORDER_ACCOUNT_ID", unique=true, nullable=false)
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "ORDER_TOTAL_ID_NEXT_VALUE")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long id;
-
- @Column (name ="CODE", nullable=false)
- private String orderTotalCode;//SHIPPING, TAX
-
- @Column (name ="TITLE", nullable=true)
- private String title;
-
- @Column (name ="TEXT", nullable=true)
- @Type(type = "org.hibernate.type.StringClobType")
- private String text;
-
- @Column (name ="VALUE", precision=15, scale=4, nullable=false )
- private BigDecimal value;
-
- @Column (name ="MODULE", length=60 , nullable=true )
- private String module;
-
- @Column (name ="ORDER_VALUE_TYPE")
- @Enumerated(value = EnumType.STRING)
- private OrderValueType orderValueType = OrderValueType.ONE_TIME;
-
- @Column (name ="ORDER_TOTAL_TYPE")
- @Enumerated(value = EnumType.STRING)
- private OrderTotalType orderTotalType = null;
-
- @Column (name ="SORT_ORDER", nullable=false)
- private int sortOrder;
-
- @ManyToOne(targetEntity = Order.class)
- @JoinColumn(name = "ORDER_ID", nullable=false)
- private Order order;
-
- public OrderTotal() {
- }
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public String getText() {
- return text;
- }
-
- public void setText(String text) {
- this.text = text;
- }
-
- public BigDecimal getValue() {
- return value;
- }
-
- public void setValue(BigDecimal value) {
- this.value = value;
- }
-
- public String getModule() {
- return module;
- }
-
- public void setModule(String module) {
- this.module = module;
- }
-
- public int getSortOrder() {
- return sortOrder;
- }
-
- public void setSortOrder(int sortOrder) {
- this.sortOrder = sortOrder;
- }
-
- public Order getOrder() {
- return order;
- }
-
- public void setOrder(Order order) {
- this.order = order;
- }
-
- public void setOrderTotalCode(String orderTotalCode) {
- this.orderTotalCode = orderTotalCode;
- }
-
- public String getOrderTotalCode() {
- return orderTotalCode;
- }
-
- public void setOrderValueType(OrderValueType orderValueType) {
- this.orderValueType = orderValueType;
- }
-
- public OrderValueType getOrderValueType() {
- return orderValueType;
- }
-
- public void setOrderTotalType(OrderTotalType orderTotalType) {
- this.orderTotalType = orderTotalType;
- }
-
- public OrderTotalType getOrderTotalType() {
- return orderTotalType;
- }
-
-
+package com.salesmanager.core.model.order;
+
+import java.math.BigDecimal;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+
+import org.hibernate.annotations.Type;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+
+
+/**
+ * Order line items related to an order.
+ * @author casams1
+ *
+ */
+
+@Entity
+@Table (name="ORDER_TOTAL" , schema=SchemaConstant.SALESMANAGER_SCHEMA)
+public class OrderTotal extends SalesManagerEntity<Long, OrderTotal> {
+ private static final long serialVersionUID = -5885315557404081674L;
+
+ @Id
+ @Column(name = "ORDER_ACCOUNT_ID", unique=true, nullable=false)
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "ORDER_TOTAL_ID_NEXT_VALUE")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+ @Column (name ="CODE", nullable=false)
+ private String orderTotalCode;//SHIPPING, TAX
+
+ @Column (name ="TITLE", nullable=true)
+ private String title;
+
+ @Column (name ="TEXT", nullable=true)
+ @Type(type = "org.hibernate.type.StringClobType")
+ private String text;
+
+ @Column (name ="VALUE", precision=15, scale=4, nullable=false )
+ private BigDecimal value;
+
+ @Column (name ="MODULE", length=60 , nullable=true )
+ private String module;
+
+ @Column (name ="ORDER_VALUE_TYPE")
+ @Enumerated(value = EnumType.STRING)
+ private OrderValueType orderValueType = OrderValueType.ONE_TIME;
+
+ @Column (name ="ORDER_TOTAL_TYPE")
+ @Enumerated(value = EnumType.STRING)
+ private OrderTotalType orderTotalType = null;
+
+ @Column (name ="SORT_ORDER", nullable=false)
+ private int sortOrder;
+
+ @ManyToOne(targetEntity = Order.class)
+ @JoinColumn(name = "ORDER_ID", nullable=false)
+ private Order order;
+
+ public OrderTotal() {
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ public BigDecimal getValue() {
+ return value;
+ }
+
+ public void setValue(BigDecimal value) {
+ this.value = value;
+ }
+
+ public String getModule() {
+ return module;
+ }
+
+ public void setModule(String module) {
+ this.module = module;
+ }
+
+ public int getSortOrder() {
+ return sortOrder;
+ }
+
+ public void setSortOrder(int sortOrder) {
+ this.sortOrder = sortOrder;
+ }
+
+ public Order getOrder() {
+ return order;
+ }
+
+ public void setOrder(Order order) {
+ this.order = order;
+ }
+
+ public void setOrderTotalCode(String orderTotalCode) {
+ this.orderTotalCode = orderTotalCode;
+ }
+
+ public String getOrderTotalCode() {
+ return orderTotalCode;
+ }
+
+ public void setOrderValueType(OrderValueType orderValueType) {
+ this.orderValueType = orderValueType;
+ }
+
+ public OrderValueType getOrderValueType() {
+ return orderValueType;
+ }
+
+ public void setOrderTotalType(OrderTotalType orderTotalType) {
+ this.orderTotalType = orderTotalType;
+ }
+
+ public OrderTotalType getOrderTotalType() {
+ return orderTotalType;
+ }
+
+
}
\ No newline at end of file
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderTotalItem.java b/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderTotalItem.java
index e73f4d7..4b0f38d 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderTotalItem.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderTotalItem.java
@@ -1,27 +1,27 @@
-package com.salesmanager.core.model.order;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-
-public class OrderTotalItem implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private BigDecimal itemPrice;
- private String itemCode;
- public void setItemPrice(BigDecimal itemPrice) {
- this.itemPrice = itemPrice;
- }
- public BigDecimal getItemPrice() {
- return itemPrice;
- }
- public void setItemCode(String itemCode) {
- this.itemCode = itemCode;
- }
- public String getItemCode() {
- return itemCode;
- }
-
-}
+package com.salesmanager.core.model.order;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+public class OrderTotalItem implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private BigDecimal itemPrice;
+ private String itemCode;
+ public void setItemPrice(BigDecimal itemPrice) {
+ this.itemPrice = itemPrice;
+ }
+ public BigDecimal getItemPrice() {
+ return itemPrice;
+ }
+ public void setItemCode(String itemCode) {
+ this.itemCode = itemCode;
+ }
+ public String getItemCode() {
+ return itemCode;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderTotalSummary.java b/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderTotalSummary.java
index 6bf0c26..f9e7191 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderTotalSummary.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderTotalSummary.java
@@ -1,56 +1,56 @@
-package com.salesmanager.core.model.order;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.List;
-
-/**
- * Output object after total calculation
- * @author Carl Samson
- *
- */
-public class OrderTotalSummary implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private BigDecimal subTotal;//one time price for items
- private BigDecimal total;//final price
- private BigDecimal taxTotal;//total of taxes
-
- private List<OrderTotal> totals;//all other fees (tax, shipping ....)
-
- public BigDecimal getSubTotal() {
- return subTotal;
- }
-
- public void setSubTotal(BigDecimal subTotal) {
- this.subTotal = subTotal;
- }
-
- public BigDecimal getTotal() {
- return total;
- }
-
- public void setTotal(BigDecimal total) {
- this.total = total;
- }
-
- public List<OrderTotal> getTotals() {
- return totals;
- }
-
- public void setTotals(List<OrderTotal> totals) {
- this.totals = totals;
- }
-
- public BigDecimal getTaxTotal() {
- return taxTotal;
- }
-
- public void setTaxTotal(BigDecimal taxTotal) {
- this.taxTotal = taxTotal;
- }
-
-}
+package com.salesmanager.core.model.order;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * Output object after total calculation
+ * @author Carl Samson
+ *
+ */
+public class OrderTotalSummary implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private BigDecimal subTotal;//one time price for items
+ private BigDecimal total;//final price
+ private BigDecimal taxTotal;//total of taxes
+
+ private List<OrderTotal> totals;//all other fees (tax, shipping ....)
+
+ public BigDecimal getSubTotal() {
+ return subTotal;
+ }
+
+ public void setSubTotal(BigDecimal subTotal) {
+ this.subTotal = subTotal;
+ }
+
+ public BigDecimal getTotal() {
+ return total;
+ }
+
+ public void setTotal(BigDecimal total) {
+ this.total = total;
+ }
+
+ public List<OrderTotal> getTotals() {
+ return totals;
+ }
+
+ public void setTotals(List<OrderTotal> totals) {
+ this.totals = totals;
+ }
+
+ public BigDecimal getTaxTotal() {
+ return taxTotal;
+ }
+
+ public void setTaxTotal(BigDecimal taxTotal) {
+ this.taxTotal = taxTotal;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderTotalType.java b/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderTotalType.java
index a78e827..837c2cb 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderTotalType.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderTotalType.java
@@ -1,7 +1,7 @@
-package com.salesmanager.core.model.order;
-
-public enum OrderTotalType {
-
- SHIPPING, HANDLING, TAX, PRODUCT, SUBTOTAL, TOTAL, CREDIT, REFUND
-
-}
+package com.salesmanager.core.model.order;
+
+public enum OrderTotalType {
+
+ SHIPPING, HANDLING, TAX, PRODUCT, SUBTOTAL, TOTAL, CREDIT, REFUND
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderValueType.java b/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderValueType.java
index 8b9c201..bc1dc01 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderValueType.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/order/OrderValueType.java
@@ -1,7 +1,7 @@
-package com.salesmanager.core.model.order;
-
-public enum OrderValueType {
-
- ONE_TIME, MONTHLY
-
-}
+package com.salesmanager.core.model.order;
+
+public enum OrderValueType {
+
+ ONE_TIME, MONTHLY
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/order/payment/CreditCard.java b/sm-core-model/src/main/java/com/salesmanager/core/model/order/payment/CreditCard.java
index 5807890..2afa15a 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/order/payment/CreditCard.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/order/payment/CreditCard.java
@@ -1,69 +1,69 @@
-package com.salesmanager.core.model.order.payment;
-
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-
-import com.salesmanager.core.model.payments.CreditCardType;
-
-@Embeddable
-public class CreditCard {
-
- @Column (name ="CARD_TYPE")
- @Enumerated(value = EnumType.STRING)
- private CreditCardType cardType;
-
- @Column (name ="CC_OWNER")
- private String ccOwner;
-
- @Column (name ="CC_NUMBER")
- private String ccNumber;
-
- @Column (name ="CC_EXPIRES")
- private String ccExpires;
-
- @Column (name ="CC_CVV")
- private String ccCvv;
-
- public String getCcOwner() {
- return ccOwner;
- }
-
- public void setCcOwner(String ccOwner) {
- this.ccOwner = ccOwner;
- }
-
- public String getCcNumber() {
- return ccNumber;
- }
-
- public void setCcNumber(String ccNumber) {
- this.ccNumber = ccNumber;
- }
-
- public String getCcExpires() {
- return ccExpires;
- }
-
- public void setCcExpires(String ccExpires) {
- this.ccExpires = ccExpires;
- }
-
- public String getCcCvv() {
- return ccCvv;
- }
-
- public void setCcCvv(String ccCvv) {
- this.ccCvv = ccCvv;
- }
-
- public void setCardType(CreditCardType cardType) {
- this.cardType = cardType;
- }
-
- public CreditCardType getCardType() {
- return cardType;
- }
-
-}
+package com.salesmanager.core.model.order.payment;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+
+import com.salesmanager.core.model.payments.CreditCardType;
+
+@Embeddable
+public class CreditCard {
+
+ @Column (name ="CARD_TYPE")
+ @Enumerated(value = EnumType.STRING)
+ private CreditCardType cardType;
+
+ @Column (name ="CC_OWNER")
+ private String ccOwner;
+
+ @Column (name ="CC_NUMBER")
+ private String ccNumber;
+
+ @Column (name ="CC_EXPIRES")
+ private String ccExpires;
+
+ @Column (name ="CC_CVV")
+ private String ccCvv;
+
+ public String getCcOwner() {
+ return ccOwner;
+ }
+
+ public void setCcOwner(String ccOwner) {
+ this.ccOwner = ccOwner;
+ }
+
+ public String getCcNumber() {
+ return ccNumber;
+ }
+
+ public void setCcNumber(String ccNumber) {
+ this.ccNumber = ccNumber;
+ }
+
+ public String getCcExpires() {
+ return ccExpires;
+ }
+
+ public void setCcExpires(String ccExpires) {
+ this.ccExpires = ccExpires;
+ }
+
+ public String getCcCvv() {
+ return ccCvv;
+ }
+
+ public void setCcCvv(String ccCvv) {
+ this.ccCvv = ccCvv;
+ }
+
+ public void setCardType(CreditCardType cardType) {
+ this.cardType = cardType;
+ }
+
+ public CreditCardType getCardType() {
+ return cardType;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/payments/BasicPayment.java b/sm-core-model/src/main/java/com/salesmanager/core/model/payments/BasicPayment.java
index 80fefb0..8cf9769 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/payments/BasicPayment.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/payments/BasicPayment.java
@@ -1,11 +1,11 @@
-package com.salesmanager.core.model.payments;
-
-
-/**
- * When the user performs a payment using money order or cheque
- * @author Carl Samson
- *
- */
-public class BasicPayment extends Payment {
-
-}
+package com.salesmanager.core.model.payments;
+
+
+/**
+ * When the user performs a payment using money order or cheque
+ * @author Carl Samson
+ *
+ */
+public class BasicPayment extends Payment {
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/payments/CreditCardPayment.java b/sm-core-model/src/main/java/com/salesmanager/core/model/payments/CreditCardPayment.java
index 01badf9..dc3163a 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/payments/CreditCardPayment.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/payments/CreditCardPayment.java
@@ -1,53 +1,53 @@
-package com.salesmanager.core.model.payments;
-
-/**
- * When the user performs a payment using a credit card
- * @author Carl Samson
- *
- */
-public class CreditCardPayment extends Payment {
-
- private String creditCardNumber;
- private String credidCardValidationNumber;
- private String expirationMonth;
- private String expirationYear;
- private String cardOwner;
- private CreditCardType creditCard;
- public String getCreditCardNumber() {
- return creditCardNumber;
- }
- public void setCreditCardNumber(String creditCardNumber) {
- this.creditCardNumber = creditCardNumber;
- }
- public String getCredidCardValidationNumber() {
- return credidCardValidationNumber;
- }
- public void setCredidCardValidationNumber(String credidCardValidationNumber) {
- this.credidCardValidationNumber = credidCardValidationNumber;
- }
- public String getExpirationMonth() {
- return expirationMonth;
- }
- public void setExpirationMonth(String expirationMonth) {
- this.expirationMonth = expirationMonth;
- }
- public String getExpirationYear() {
- return expirationYear;
- }
- public void setExpirationYear(String expirationYear) {
- this.expirationYear = expirationYear;
- }
- public String getCardOwner() {
- return cardOwner;
- }
- public void setCardOwner(String cardOwner) {
- this.cardOwner = cardOwner;
- }
- public CreditCardType getCreditCard() {
- return creditCard;
- }
- public void setCreditCard(CreditCardType creditCard) {
- this.creditCard = creditCard;
- }
-
-}
+package com.salesmanager.core.model.payments;
+
+/**
+ * When the user performs a payment using a credit card
+ * @author Carl Samson
+ *
+ */
+public class CreditCardPayment extends Payment {
+
+ private String creditCardNumber;
+ private String credidCardValidationNumber;
+ private String expirationMonth;
+ private String expirationYear;
+ private String cardOwner;
+ private CreditCardType creditCard;
+ public String getCreditCardNumber() {
+ return creditCardNumber;
+ }
+ public void setCreditCardNumber(String creditCardNumber) {
+ this.creditCardNumber = creditCardNumber;
+ }
+ public String getCredidCardValidationNumber() {
+ return credidCardValidationNumber;
+ }
+ public void setCredidCardValidationNumber(String credidCardValidationNumber) {
+ this.credidCardValidationNumber = credidCardValidationNumber;
+ }
+ public String getExpirationMonth() {
+ return expirationMonth;
+ }
+ public void setExpirationMonth(String expirationMonth) {
+ this.expirationMonth = expirationMonth;
+ }
+ public String getExpirationYear() {
+ return expirationYear;
+ }
+ public void setExpirationYear(String expirationYear) {
+ this.expirationYear = expirationYear;
+ }
+ public String getCardOwner() {
+ return cardOwner;
+ }
+ public void setCardOwner(String cardOwner) {
+ this.cardOwner = cardOwner;
+ }
+ public CreditCardType getCreditCard() {
+ return creditCard;
+ }
+ public void setCreditCard(CreditCardType creditCard) {
+ this.creditCard = creditCard;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/payments/CreditCardType.java b/sm-core-model/src/main/java/com/salesmanager/core/model/payments/CreditCardType.java
index 72aec2f..b30f3c9 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/payments/CreditCardType.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/payments/CreditCardType.java
@@ -1,7 +1,7 @@
-package com.salesmanager.core.model.payments;
-
-public enum CreditCardType {
-
- AMEX, VISA, MASTERCARD, DINERS, DISCOVERY
-
-}
+package com.salesmanager.core.model.payments;
+
+public enum CreditCardType {
+
+ AMEX, VISA, MASTERCARD, DINERS, DISCOVERY
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/payments/Payment.java b/sm-core-model/src/main/java/com/salesmanager/core/model/payments/Payment.java
index 41e864a..0ef1f7e 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/payments/Payment.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/payments/Payment.java
@@ -1,55 +1,65 @@
-package com.salesmanager.core.model.payments;
-
-import java.util.Map;
-
-import com.salesmanager.core.model.reference.currency.Currency;
-
-public class Payment {
-
- private PaymentType paymentType;
- private TransactionType transactionType = TransactionType.AUTHORIZECAPTURE;
- private String moduleName;
- private Currency currency;
- private Map<String,String> paymentMetaData = null;
-
- public void setPaymentType(PaymentType paymentType) {
- this.paymentType = paymentType;
- }
-
- public PaymentType getPaymentType() {
- return paymentType;
- }
-
- public void setTransactionType(TransactionType transactionType) {
- this.transactionType = transactionType;
- }
-
- public TransactionType getTransactionType() {
- return transactionType;
- }
-
- public void setModuleName(String moduleName) {
- this.moduleName = moduleName;
- }
-
- public String getModuleName() {
- return moduleName;
- }
-
- public Currency getCurrency() {
- return currency;
- }
-
- public void setCurrency(Currency currency) {
- this.currency = currency;
- }
-
- public Map<String,String> getPaymentMetaData() {
- return paymentMetaData;
- }
-
- public void setPaymentMetaData(Map<String,String> paymentMetaData) {
- this.paymentMetaData = paymentMetaData;
- }
-
-}
+package com.salesmanager.core.model.payments;
+
+import java.math.BigDecimal;
+import java.util.Map;
+
+import com.salesmanager.core.model.reference.currency.Currency;
+
+public class Payment {
+
+ private PaymentType paymentType;
+ private TransactionType transactionType = TransactionType.AUTHORIZECAPTURE;
+ private String moduleName;
+ private Currency currency;
+ private BigDecimal amount;
+ private Map<String,String> paymentMetaData = null;
+
+ public void setPaymentType(PaymentType paymentType) {
+ this.paymentType = paymentType;
+ }
+
+ public PaymentType getPaymentType() {
+ return paymentType;
+ }
+
+ public void setTransactionType(TransactionType transactionType) {
+ this.transactionType = transactionType;
+ }
+
+ public TransactionType getTransactionType() {
+ return transactionType;
+ }
+
+ public void setModuleName(String moduleName) {
+ this.moduleName = moduleName;
+ }
+
+ public String getModuleName() {
+ return moduleName;
+ }
+
+ public Currency getCurrency() {
+ return currency;
+ }
+
+ public void setCurrency(Currency currency) {
+ this.currency = currency;
+ }
+
+ public Map<String,String> getPaymentMetaData() {
+ return paymentMetaData;
+ }
+
+ public void setPaymentMetaData(Map<String,String> paymentMetaData) {
+ this.paymentMetaData = paymentMetaData;
+ }
+
+ public BigDecimal getAmount() {
+ return amount;
+ }
+
+ public void setAmount(BigDecimal amount) {
+ this.amount = amount;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/payments/PaymentType.java b/sm-core-model/src/main/java/com/salesmanager/core/model/payments/PaymentType.java
index de05db8..ae80039 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/payments/PaymentType.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/payments/PaymentType.java
@@ -1,27 +1,27 @@
-package com.salesmanager.core.model.payments;
-
-public enum PaymentType {
-
-
-
- CREDITCARD("creditcard"), FREE("creditcard"), COD("creditcard"), MONEYORDER("creditcard"), PAYPAL("creditcard"), STRIPE("creditcard"), WEPAY("creditcard");
-
-
- private String paymentType;
-
- PaymentType(String type) {
- paymentType = type;
- }
-
- public static PaymentType fromString(String text) {
- if (text != null) {
- for (PaymentType b : PaymentType.values()) {
- String payemntType = text.toUpperCase();
- if (payemntType.equalsIgnoreCase(b.name())) {
- return b;
- }
- }
- }
- return null;
- }
-}
+package com.salesmanager.core.model.payments;
+
+public enum PaymentType {
+
+
+
+ CREDITCARD("creditcard"), FREE("creditcard"), COD("creditcard"), MONEYORDER("creditcard"), PAYPAL("creditcard"), STRIPE("creditcard"), WEPAY("creditcard");
+
+
+ private String paymentType;
+
+ PaymentType(String type) {
+ paymentType = type;
+ }
+
+ public static PaymentType fromString(String text) {
+ if (text != null) {
+ for (PaymentType b : PaymentType.values()) {
+ String payemntType = text.toUpperCase();
+ if (payemntType.equalsIgnoreCase(b.name())) {
+ return b;
+ }
+ }
+ }
+ return null;
+ }
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/payments/PaypalPayment.java b/sm-core-model/src/main/java/com/salesmanager/core/model/payments/PaypalPayment.java
index ca7d7b8..bba6804 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/payments/PaypalPayment.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/payments/PaypalPayment.java
@@ -1,31 +1,31 @@
-package com.salesmanager.core.model.payments;
-
-/**
- * When the user performs a payment using paypal
- * @author Carl Samson
- *
- */
-public class PaypalPayment extends Payment {
-
- //express checkout
- private String payerId;
- private String paymentToken;
-
- public PaypalPayment() {
- super.setPaymentType(PaymentType.PAYPAL);
- }
-
- public void setPayerId(String payerId) {
- this.payerId = payerId;
- }
- public String getPayerId() {
- return payerId;
- }
- public void setPaymentToken(String paymentToken) {
- this.paymentToken = paymentToken;
- }
- public String getPaymentToken() {
- return paymentToken;
- }
-
-}
+package com.salesmanager.core.model.payments;
+
+/**
+ * When the user performs a payment using paypal
+ * @author Carl Samson
+ *
+ */
+public class PaypalPayment extends Payment {
+
+ //express checkout
+ private String payerId;
+ private String paymentToken;
+
+ public PaypalPayment() {
+ super.setPaymentType(PaymentType.PAYPAL);
+ }
+
+ public void setPayerId(String payerId) {
+ this.payerId = payerId;
+ }
+ public String getPayerId() {
+ return payerId;
+ }
+ public void setPaymentToken(String paymentToken) {
+ this.paymentToken = paymentToken;
+ }
+ public String getPaymentToken() {
+ return paymentToken;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/payments/Transaction.java b/sm-core-model/src/main/java/com/salesmanager/core/model/payments/Transaction.java
index 5bdd3f2..2202676 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/payments/Transaction.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/payments/Transaction.java
@@ -1,183 +1,183 @@
-package com.salesmanager.core.model.payments;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.persistence.Column;
-import javax.persistence.Embedded;
-import javax.persistence.Entity;
-import javax.persistence.EntityListeners;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.Transient;
-
-import org.hibernate.annotations.Type;
-import org.json.simple.JSONAware;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.common.audit.AuditListener;
-import com.salesmanager.core.model.common.audit.AuditSection;
-import com.salesmanager.core.model.common.audit.Auditable;
-import com.salesmanager.core.model.generic.SalesManagerEntity;
-import com.salesmanager.core.model.order.Order;
-
-
-@Entity
-@EntityListeners(value = AuditListener.class)
-@Table(name = "SM_TRANSACTION", schema= SchemaConstant.SALESMANAGER_SCHEMA)
-public class Transaction extends SalesManagerEntity<Long, Transaction> implements Serializable, Auditable, JSONAware {
-
-
- private static final Logger LOGGER = LoggerFactory.getLogger(Transaction.class);
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- @Id
- @Column(name = "TRANSACTION_ID")
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "TRANSACT_SEQ_NEXT_VAL")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long id;
-
- @Embedded
- private AuditSection auditSection = new AuditSection();
-
-
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name="ORDER_ID", nullable=true)
- private Order order;
-
- @Column(name="AMOUNT")
- private BigDecimal amount;
-
- @Column(name="TRANSACTION_DATE")
- @Temporal(TemporalType.TIMESTAMP)
- private Date transactionDate;
-
- @Column(name="TRANSACTION_TYPE")
- @Enumerated(value = EnumType.STRING)
- private TransactionType transactionType;
-
- @Column(name="PAYMENT_TYPE")
- @Enumerated(value = EnumType.STRING)
- private PaymentType paymentType;
-
- @Column(name="DETAILS")
- @Type(type = "org.hibernate.type.StringClobType")
- private String details;
-
- @Transient
- private Map<String,String> transactionDetails= new HashMap<String,String>();
-
- @Override
- public AuditSection getAuditSection() {
- return this.auditSection;
- }
-
- @Override
- public void setAuditSection(AuditSection audit) {
- this.auditSection = audit;
-
- }
-
- @Override
- public Long getId() {
- return this.id;
- }
-
- @Override
- public void setId(Long id) {
- this.id = id;
-
- }
-
- public Order getOrder() {
- return order;
- }
-
- public void setOrder(Order order) {
- this.order = order;
- }
-
- public BigDecimal getAmount() {
- return amount;
- }
-
- public void setAmount(BigDecimal amount) {
- this.amount = amount;
- }
-
- public Date getTransactionDate() {
- return transactionDate;
- }
-
- public void setTransactionDate(Date transactionDate) {
- this.transactionDate = transactionDate;
- }
-
- public TransactionType getTransactionType() {
- return transactionType;
- }
-
- public void setTransactionType(TransactionType transactionType) {
- this.transactionType = transactionType;
- }
-
- public PaymentType getPaymentType() {
- return paymentType;
- }
-
- public void setPaymentType(PaymentType paymentType) {
- this.paymentType = paymentType;
- }
-
- public String getDetails() {
- return details;
- }
-
- public void setDetails(String details) {
- this.details = details;
- }
-
- public Map<String, String> getTransactionDetails() {
- return transactionDetails;
- }
-
- public void setTransactionDetails(Map<String, String> transactionDetails) {
- this.transactionDetails = transactionDetails;
- }
-
- @Override
- public String toJSONString() {
-
- if(this.getTransactionDetails()!=null && this.getTransactionDetails().size()>0) {
- ObjectMapper mapper = new ObjectMapper();
- try {
- return mapper.writeValueAsString(this.getTransactionDetails());
- } catch (Exception e) {
- LOGGER.error("Cannot parse transactions map",e);
- }
-
- }
-
- return null;
- }
-
-}
+package com.salesmanager.core.model.payments;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.EntityListeners;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.persistence.Transient;
+
+import org.hibernate.annotations.Type;
+import org.json.simple.JSONAware;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.common.audit.AuditListener;
+import com.salesmanager.core.model.common.audit.AuditSection;
+import com.salesmanager.core.model.common.audit.Auditable;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+import com.salesmanager.core.model.order.Order;
+
+
+@Entity
+@EntityListeners(value = AuditListener.class)
+@Table(name = "SM_TRANSACTION", schema= SchemaConstant.SALESMANAGER_SCHEMA)
+public class Transaction extends SalesManagerEntity<Long, Transaction> implements Serializable, Auditable, JSONAware {
+
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(Transaction.class);
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ @Id
+ @Column(name = "TRANSACTION_ID")
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "TRANSACT_SEQ_NEXT_VAL")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+ @Embedded
+ private AuditSection auditSection = new AuditSection();
+
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name="ORDER_ID", nullable=true)
+ private Order order;
+
+ @Column(name="AMOUNT")
+ private BigDecimal amount;
+
+ @Column(name="TRANSACTION_DATE")
+ @Temporal(TemporalType.TIMESTAMP)
+ private Date transactionDate;
+
+ @Column(name="TRANSACTION_TYPE")
+ @Enumerated(value = EnumType.STRING)
+ private TransactionType transactionType;
+
+ @Column(name="PAYMENT_TYPE")
+ @Enumerated(value = EnumType.STRING)
+ private PaymentType paymentType;
+
+ @Column(name="DETAILS")
+ @Type(type = "org.hibernate.type.StringClobType")
+ private String details;
+
+ @Transient
+ private Map<String,String> transactionDetails= new HashMap<String,String>();
+
+ @Override
+ public AuditSection getAuditSection() {
+ return this.auditSection;
+ }
+
+ @Override
+ public void setAuditSection(AuditSection audit) {
+ this.auditSection = audit;
+
+ }
+
+ @Override
+ public Long getId() {
+ return this.id;
+ }
+
+ @Override
+ public void setId(Long id) {
+ this.id = id;
+
+ }
+
+ public Order getOrder() {
+ return order;
+ }
+
+ public void setOrder(Order order) {
+ this.order = order;
+ }
+
+ public BigDecimal getAmount() {
+ return amount;
+ }
+
+ public void setAmount(BigDecimal amount) {
+ this.amount = amount;
+ }
+
+ public Date getTransactionDate() {
+ return transactionDate;
+ }
+
+ public void setTransactionDate(Date transactionDate) {
+ this.transactionDate = transactionDate;
+ }
+
+ public TransactionType getTransactionType() {
+ return transactionType;
+ }
+
+ public void setTransactionType(TransactionType transactionType) {
+ this.transactionType = transactionType;
+ }
+
+ public PaymentType getPaymentType() {
+ return paymentType;
+ }
+
+ public void setPaymentType(PaymentType paymentType) {
+ this.paymentType = paymentType;
+ }
+
+ public String getDetails() {
+ return details;
+ }
+
+ public void setDetails(String details) {
+ this.details = details;
+ }
+
+ public Map<String, String> getTransactionDetails() {
+ return transactionDetails;
+ }
+
+ public void setTransactionDetails(Map<String, String> transactionDetails) {
+ this.transactionDetails = transactionDetails;
+ }
+
+ @Override
+ public String toJSONString() {
+
+ if(this.getTransactionDetails()!=null && this.getTransactionDetails().size()>0) {
+ ObjectMapper mapper = new ObjectMapper();
+ try {
+ return mapper.writeValueAsString(this.getTransactionDetails());
+ } catch (Exception e) {
+ LOGGER.error("Cannot parse transactions map",e);
+ }
+
+ }
+
+ return null;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/payments/TransactionType.java b/sm-core-model/src/main/java/com/salesmanager/core/model/payments/TransactionType.java
index cc97c9a..9ea6f7e 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/payments/TransactionType.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/payments/TransactionType.java
@@ -1,7 +1,7 @@
-package com.salesmanager.core.model.payments;
-
-public enum TransactionType {
-
- INIT, AUTHORIZE, CAPTURE, AUTHORIZECAPTURE, REFUND
-
-}
+package com.salesmanager.core.model.payments;
+
+public enum TransactionType {
+
+ INIT, AUTHORIZE, CAPTURE, AUTHORIZECAPTURE, REFUND
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/reference/country/CountryDescription.java b/sm-core-model/src/main/java/com/salesmanager/core/model/reference/country/CountryDescription.java
index c0afa75..5ed9a6a 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/reference/country/CountryDescription.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/reference/country/CountryDescription.java
@@ -7,7 +7,7 @@ import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.common.Description;
+import com.salesmanager.core.model.common.description.Description;
import com.salesmanager.core.model.reference.language.Language;
@Entity
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/reference/geozone/GeoZoneDescription.java b/sm-core-model/src/main/java/com/salesmanager/core/model/reference/geozone/GeoZoneDescription.java
index 706b601..0336341 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/reference/geozone/GeoZoneDescription.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/reference/geozone/GeoZoneDescription.java
@@ -7,7 +7,7 @@ import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.common.Description;
+import com.salesmanager.core.model.common.description.Description;
@Entity
@Table(name="GEOZONE_DESCRIPTION", schema=SchemaConstant.SALESMANAGER_SCHEMA, uniqueConstraints={
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/reference/zone/Zone.java b/sm-core-model/src/main/java/com/salesmanager/core/model/reference/zone/Zone.java
index 11055c9..827dead 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/reference/zone/Zone.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/reference/zone/Zone.java
@@ -44,7 +44,7 @@ public class Zone extends SalesManagerEntity<Long, Zone>{
- @Column(name = "ZONE_CODE", nullable = false)
+ @Column(name = "ZONE_CODE", unique=true, nullable = false)
private String code;
public Zone() {
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/reference/zone/ZoneDescription.java b/sm-core-model/src/main/java/com/salesmanager/core/model/reference/zone/ZoneDescription.java
index d16f3d0..3974509 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/reference/zone/ZoneDescription.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/reference/zone/ZoneDescription.java
@@ -6,7 +6,7 @@ import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
-import com.salesmanager.core.model.common.Description;
+import com.salesmanager.core.model.common.description.Description;
import com.salesmanager.core.model.reference.language.Language;
@Entity
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/search/IndexProduct.java b/sm-core-model/src/main/java/com/salesmanager/core/model/search/IndexProduct.java
index 5ae2e61..78d4234 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/search/IndexProduct.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/search/IndexProduct.java
@@ -1,148 +1,148 @@
-package com.salesmanager.core.model.search;
-
-import java.util.List;
-
-import org.json.simple.JSONArray;
-import org.json.simple.JSONAware;
-import org.json.simple.JSONObject;
-
-public class IndexProduct implements JSONAware {
-
- private String name;
- private Double price;
- private List<String> categories;//category code
- private String manufacturer;//id of the manufacturer
- private boolean available;
- private String description;
- private List<String> tags;//keywords ?
- private String highlight;
- private String store;
- private String lang;
- private String id;//required by the search framework
-
- @SuppressWarnings("unchecked")
- @Override
- public String toJSONString() {
-
-
-
-
- JSONObject obj = new JSONObject();
- obj.put("name", this.getName());
- obj.put("price", this.getPrice());
- obj.put("description", this.getDescription());
- obj.put("highlight", this.getHighlight());
- obj.put("store", this.getStore());
- obj.put("manufacturer", this.getManufacturer());
- obj.put("lang", this.getLang());
- obj.put("id", this.getId());
- if(categories!=null) {
- JSONArray categoriesArray = new JSONArray();
- for(String category : categories) {
- categoriesArray.add(category);
- }
- obj.put("categories", categoriesArray);
- }
-
- if(tags!=null) {
- JSONArray tagsArray = new JSONArray();
- for(String tag : tags) {
- tagsArray.add(tag);
- }
- obj.put("tags", tagsArray);
- }
-
- return obj.toJSONString();
-
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
-
- public List<String> getCategories() {
- return categories;
- }
-
- public void setCategories(List<String> categories) {
- this.categories = categories;
- }
-
- public boolean isAvailable() {
- return available;
- }
-
- public void setAvailable(boolean available) {
- this.available = available;
- }
-
- public String getDescription() {
- return description;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-
- public List<String> getTags() {
- return tags;
- }
-
- public void setTags(List<String> tags) {
- this.tags = tags;
- }
-
- public String getHighlight() {
- return highlight;
- }
-
- public void setHighlight(String highlight) {
- this.highlight = highlight;
- }
-
- public void setPrice(Double price) {
- this.price = price;
- }
-
- public Double getPrice() {
- return price;
- }
-
- public void setStore(String store) {
- this.store = store;
- }
-
- public String getStore() {
- return store;
- }
-
- public void setLang(String lang) {
- this.lang = lang;
- }
-
- public String getLang() {
- return lang;
- }
-
- public void setId(String id) {
- this.id = id;
- }
-
- public String getId() {
- return id;
- }
-
- public void setManufacturer(String manufacturer) {
- this.manufacturer = manufacturer;
- }
-
- public String getManufacturer() {
- return manufacturer;
- }
-
-}
+package com.salesmanager.core.model.search;
+
+import java.util.List;
+
+import org.json.simple.JSONArray;
+import org.json.simple.JSONAware;
+import org.json.simple.JSONObject;
+
+public class IndexProduct implements JSONAware {
+
+ private String name;
+ private Double price;
+ private List<String> categories;//category code
+ private String manufacturer;//id of the manufacturer
+ private boolean available;
+ private String description;
+ private List<String> tags;//keywords ?
+ private String highlight;
+ private String store;
+ private String lang;
+ private String id;//required by the search framework
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public String toJSONString() {
+
+
+
+
+ JSONObject obj = new JSONObject();
+ obj.put("name", this.getName());
+ obj.put("price", this.getPrice());
+ obj.put("description", this.getDescription());
+ obj.put("highlight", this.getHighlight());
+ obj.put("store", this.getStore());
+ obj.put("manufacturer", this.getManufacturer());
+ obj.put("lang", this.getLang());
+ obj.put("id", this.getId());
+ if(categories!=null) {
+ JSONArray categoriesArray = new JSONArray();
+ for(String category : categories) {
+ categoriesArray.add(category);
+ }
+ obj.put("categories", categoriesArray);
+ }
+
+ if(tags!=null) {
+ JSONArray tagsArray = new JSONArray();
+ for(String tag : tags) {
+ tagsArray.add(tag);
+ }
+ obj.put("tags", tagsArray);
+ }
+
+ return obj.toJSONString();
+
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+
+ public List<String> getCategories() {
+ return categories;
+ }
+
+ public void setCategories(List<String> categories) {
+ this.categories = categories;
+ }
+
+ public boolean isAvailable() {
+ return available;
+ }
+
+ public void setAvailable(boolean available) {
+ this.available = available;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public List<String> getTags() {
+ return tags;
+ }
+
+ public void setTags(List<String> tags) {
+ this.tags = tags;
+ }
+
+ public String getHighlight() {
+ return highlight;
+ }
+
+ public void setHighlight(String highlight) {
+ this.highlight = highlight;
+ }
+
+ public void setPrice(Double price) {
+ this.price = price;
+ }
+
+ public Double getPrice() {
+ return price;
+ }
+
+ public void setStore(String store) {
+ this.store = store;
+ }
+
+ public String getStore() {
+ return store;
+ }
+
+ public void setLang(String lang) {
+ this.lang = lang;
+ }
+
+ public String getLang() {
+ return lang;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setManufacturer(String manufacturer) {
+ this.manufacturer = manufacturer;
+ }
+
+ public String getManufacturer() {
+ return manufacturer;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/search/SearchEntry.java b/sm-core-model/src/main/java/com/salesmanager/core/model/search/SearchEntry.java
index 7550583..a2f8066 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/search/SearchEntry.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/search/SearchEntry.java
@@ -1,22 +1,22 @@
-package com.salesmanager.core.model.search;
-
-import java.util.List;
-
-public class SearchEntry {
-
- private IndexProduct indexProduct;//product as saved in the index
- private List<String> highlights;
- public void setHighlights(List<String> highlights) {
- this.highlights = highlights;
- }
- public List<String> getHighlights() {
- return highlights;
- }
- public void setIndexProduct(IndexProduct indexProduct) {
- this.indexProduct = indexProduct;
- }
- public IndexProduct getIndexProduct() {
- return indexProduct;
- }
-
-}
+package com.salesmanager.core.model.search;
+
+import java.util.List;
+
+public class SearchEntry {
+
+ private IndexProduct indexProduct;//product as saved in the index
+ private List<String> highlights;
+ public void setHighlights(List<String> highlights) {
+ this.highlights = highlights;
+ }
+ public List<String> getHighlights() {
+ return highlights;
+ }
+ public void setIndexProduct(IndexProduct indexProduct) {
+ this.indexProduct = indexProduct;
+ }
+ public IndexProduct getIndexProduct() {
+ return indexProduct;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/search/SearchFacet.java b/sm-core-model/src/main/java/com/salesmanager/core/model/search/SearchFacet.java
index d7b3073..9c515b5 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/search/SearchFacet.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/search/SearchFacet.java
@@ -1,27 +1,27 @@
-package com.salesmanager.core.model.search;
-
-public class SearchFacet {
-
- private String name;
- private String key;
- private long count;
- public void setKey(String key) {
- this.key = key;
- }
- public String getKey() {
- return key;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getName() {
- return name;
- }
- public void setCount(long count) {
- this.count = count;
- }
- public long getCount() {
- return count;
- };
-
-}
+package com.salesmanager.core.model.search;
+
+public class SearchFacet {
+
+ private String name;
+ private String key;
+ private long count;
+ public void setKey(String key) {
+ this.key = key;
+ }
+ public String getKey() {
+ return key;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public String getName() {
+ return name;
+ }
+ public void setCount(long count) {
+ this.count = count;
+ }
+ public long getCount() {
+ return count;
+ };
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/search/SearchKeywords.java b/sm-core-model/src/main/java/com/salesmanager/core/model/search/SearchKeywords.java
index f6c93fb..4384931 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/search/SearchKeywords.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/search/SearchKeywords.java
@@ -1,34 +1,34 @@
-package com.salesmanager.core.model.search;
-
-import java.util.List;
-
-import org.json.simple.JSONArray;
-import org.json.simple.JSONAware;
-import org.json.simple.JSONObject;
-
-public class SearchKeywords implements JSONAware{
-
- private List<String> keywords;
-
- public void setKeywords(List<String> keywords) {
- this.keywords = keywords;
- }
-
- public List<String> getKeywords() {
- return keywords;
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public String toJSONString() {
- JSONArray jsonArray = new JSONArray();
- for(String kw : keywords) {
- JSONObject data = new JSONObject();
- data.put("name", kw);
- data.put("value", kw);
- jsonArray.add(data);
- }
- return jsonArray.toJSONString();
- }
-
-}
+package com.salesmanager.core.model.search;
+
+import java.util.List;
+
+import org.json.simple.JSONArray;
+import org.json.simple.JSONAware;
+import org.json.simple.JSONObject;
+
+public class SearchKeywords implements JSONAware{
+
+ private List<String> keywords;
+
+ public void setKeywords(List<String> keywords) {
+ this.keywords = keywords;
+ }
+
+ public List<String> getKeywords() {
+ return keywords;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public String toJSONString() {
+ JSONArray jsonArray = new JSONArray();
+ for(String kw : keywords) {
+ JSONObject data = new JSONObject();
+ data.put("name", kw);
+ data.put("value", kw);
+ jsonArray.add(data);
+ }
+ return jsonArray.toJSONString();
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/search/SearchResponse.java b/sm-core-model/src/main/java/com/salesmanager/core/model/search/SearchResponse.java
index fd83608..fcc83b2 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/search/SearchResponse.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/search/SearchResponse.java
@@ -1,39 +1,39 @@
-package com.salesmanager.core.model.search;
-
-import java.util.List;
-import java.util.Map;
-
-public class SearchResponse {
-
- private long totalCount = 0;//total number of entries
- private long entryCount = 0;//number of entries asked
-
- private List<SearchEntry> entries;
- private Map<String,List<SearchFacet>> facets;//facet key (example : category) & facet description (example : category code)
-
- public void setTotalCount(long totalCount) {
- this.totalCount = totalCount;
- }
- public long getTotalCount() {
- return totalCount;
- }
- public void setEntryCount(long entryCount) {
- this.entryCount = entryCount;
- }
- public long getEntryCount() {
- return entryCount;
- }
- public void setEntries(List<SearchEntry> entries) {
- this.entries = entries;
- }
- public List<SearchEntry> getEntries() {
- return entries;
- }
- public void setFacets(Map<String,List<SearchFacet>> facets) {
- this.facets = facets;
- }
- public Map<String,List<SearchFacet>> getFacets() {
- return facets;
- }
-
-}
+package com.salesmanager.core.model.search;
+
+import java.util.List;
+import java.util.Map;
+
+public class SearchResponse {
+
+ private long totalCount = 0;//total number of entries
+ private long entryCount = 0;//number of entries asked
+
+ private List<SearchEntry> entries;
+ private Map<String,List<SearchFacet>> facets;//facet key (example : category) & facet description (example : category code)
+
+ public void setTotalCount(long totalCount) {
+ this.totalCount = totalCount;
+ }
+ public long getTotalCount() {
+ return totalCount;
+ }
+ public void setEntryCount(long entryCount) {
+ this.entryCount = entryCount;
+ }
+ public long getEntryCount() {
+ return entryCount;
+ }
+ public void setEntries(List<SearchEntry> entries) {
+ this.entries = entries;
+ }
+ public List<SearchEntry> getEntries() {
+ return entries;
+ }
+ public void setFacets(Map<String,List<SearchFacet>> facets) {
+ this.facets = facets;
+ }
+ public Map<String,List<SearchFacet>> getFacets() {
+ return facets;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/PackageDetails.java b/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/PackageDetails.java
index 2f9dc3f..d559352 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/PackageDetails.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/PackageDetails.java
@@ -1,65 +1,65 @@
-package com.salesmanager.core.model.shipping;
-
-public class PackageDetails {
-
- private double shippingWeight;
- private double shippingMaxWeight;
- private double shippingLength;
- private double shippingHeight;
- private double shippingWidth;
- private int shippingQuantity;
- private int treshold;
-
- private String itemName = "";
-
-
- public String getItemName() {
- return itemName;
- }
- public void setItemName(String itemName) {
- this.itemName = itemName;
- }
- public double getShippingWeight() {
- return shippingWeight;
- }
- public void setShippingWeight(double shippingWeight) {
- this.shippingWeight = shippingWeight;
- }
- public double getShippingMaxWeight() {
- return shippingMaxWeight;
- }
- public void setShippingMaxWeight(double shippingMaxWeight) {
- this.shippingMaxWeight = shippingMaxWeight;
- }
- public double getShippingLength() {
- return shippingLength;
- }
- public void setShippingLength(double shippingLength) {
- this.shippingLength = shippingLength;
- }
- public double getShippingHeight() {
- return shippingHeight;
- }
- public void setShippingHeight(double shippingHeight) {
- this.shippingHeight = shippingHeight;
- }
- public double getShippingWidth() {
- return shippingWidth;
- }
- public void setShippingWidth(double shippingWidth) {
- this.shippingWidth = shippingWidth;
- }
- public int getShippingQuantity() {
- return shippingQuantity;
- }
- public void setShippingQuantity(int shippingQuantity) {
- this.shippingQuantity = shippingQuantity;
- }
- public int getTreshold() {
- return treshold;
- }
- public void setTreshold(int treshold) {
- this.treshold = treshold;
- }
-
-}
+package com.salesmanager.core.model.shipping;
+
+public class PackageDetails {
+
+ private double shippingWeight;
+ private double shippingMaxWeight;
+ private double shippingLength;
+ private double shippingHeight;
+ private double shippingWidth;
+ private int shippingQuantity;
+ private int treshold;
+
+ private String itemName = "";
+
+
+ public String getItemName() {
+ return itemName;
+ }
+ public void setItemName(String itemName) {
+ this.itemName = itemName;
+ }
+ public double getShippingWeight() {
+ return shippingWeight;
+ }
+ public void setShippingWeight(double shippingWeight) {
+ this.shippingWeight = shippingWeight;
+ }
+ public double getShippingMaxWeight() {
+ return shippingMaxWeight;
+ }
+ public void setShippingMaxWeight(double shippingMaxWeight) {
+ this.shippingMaxWeight = shippingMaxWeight;
+ }
+ public double getShippingLength() {
+ return shippingLength;
+ }
+ public void setShippingLength(double shippingLength) {
+ this.shippingLength = shippingLength;
+ }
+ public double getShippingHeight() {
+ return shippingHeight;
+ }
+ public void setShippingHeight(double shippingHeight) {
+ this.shippingHeight = shippingHeight;
+ }
+ public double getShippingWidth() {
+ return shippingWidth;
+ }
+ public void setShippingWidth(double shippingWidth) {
+ this.shippingWidth = shippingWidth;
+ }
+ public int getShippingQuantity() {
+ return shippingQuantity;
+ }
+ public void setShippingQuantity(int shippingQuantity) {
+ this.shippingQuantity = shippingQuantity;
+ }
+ public int getTreshold() {
+ return treshold;
+ }
+ public void setTreshold(int treshold) {
+ this.treshold = treshold;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/Quote.java b/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/Quote.java
new file mode 100644
index 0000000..0489d63
--- /dev/null
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/Quote.java
@@ -0,0 +1,212 @@
+package com.salesmanager.core.model.shipping;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.common.Delivery;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+
+
+/**
+ * Shipping quote received from external shipping quote module or calculated internally
+ * @author c.samson
+ *
+ */
+
+@Entity
+@Table (name="SHIPPING_QUOTE" , schema=SchemaConstant.SALESMANAGER_SCHEMA)
+public class Quote extends SalesManagerEntity<Long, Quote> {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ @Id
+ @Column(name = "SHIPPING_QUOTE_ID", unique=true, nullable=false)
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "SHIP_QUOTE_ID_NEXT_VALUE")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ Long id;
+
+ @Column(name = "ORDER_ID", nullable = true)
+ private Long orderId;
+
+ @Column(name = "CUSTOMER_ID", nullable = true)
+ private Long customerId;
+
+ @Column(name = "CART_ID", nullable = true)
+ private Long cartId;
+
+ @Column(name = "MODULE", nullable = false)
+ private String module;
+
+ @Column(name = "OPTION_NAME", nullable = true)
+ private String optionName = null;
+
+ @Column(name = "OPTION_CODE", nullable = true)
+ private String optionCode = null;
+
+ @Temporal(TemporalType.TIMESTAMP)
+ @Column (name ="OPTION_DELIVERY_DATE")
+ private Date optionDeliveryDate = null;
+
+ @Temporal(TemporalType.TIMESTAMP)
+ @Column (name ="OPTION_SHIPPING_DATE")
+ private Date optionShippingDate = null;
+
+ @Temporal(TemporalType.TIMESTAMP)
+ @Column (name ="QUOTE_DATE")
+ private Date quoteDate;
+
+ @Column(name = "SHIPPING_NUMBER_DAYS")
+ private Integer estimatedNumberOfDays;
+
+ @Column (name ="QUOTE_PRICE")
+ private BigDecimal price = null;
+
+ @Column (name ="QUOTE_HANDLING")
+ private BigDecimal handling = null;
+
+ @Column(name = "FREE_SHIPPING")
+ private boolean freeShipping;
+
+
+ @Embedded
+ private Delivery delivery = null;
+
+ public Long getOrderId() {
+ return orderId;
+ }
+
+ public void setOrderId(Long orderId) {
+ this.orderId = orderId;
+ }
+
+ public Long getCustomerId() {
+ return customerId;
+ }
+
+ public void setCustomerId(Long customerId) {
+ this.customerId = customerId;
+ }
+
+ public String getModule() {
+ return module;
+ }
+
+ public void setModule(String module) {
+ this.module = module;
+ }
+
+ public String getOptionName() {
+ return optionName;
+ }
+
+ public void setOptionName(String optionName) {
+ this.optionName = optionName;
+ }
+
+ public String getOptionCode() {
+ return optionCode;
+ }
+
+ public void setOptionCode(String optionCode) {
+ this.optionCode = optionCode;
+ }
+
+ public Date getOptionDeliveryDate() {
+ return optionDeliveryDate;
+ }
+
+ public void setOptionDeliveryDate(Date optionDeliveryDate) {
+ this.optionDeliveryDate = optionDeliveryDate;
+ }
+
+ public Date getOptionShippingDate() {
+ return optionShippingDate;
+ }
+
+ public void setOptionShippingDate(Date optionShippingDate) {
+ this.optionShippingDate = optionShippingDate;
+ }
+
+ public Date getQuoteDate() {
+ return quoteDate;
+ }
+
+ public void setQuoteDate(Date quoteDate) {
+ this.quoteDate = quoteDate;
+ }
+
+ public Integer getEstimatedNumberOfDays() {
+ return estimatedNumberOfDays;
+ }
+
+ public void setEstimatedNumberOfDays(Integer estimatedNumberOfDays) {
+ this.estimatedNumberOfDays = estimatedNumberOfDays;
+ }
+
+ public BigDecimal getPrice() {
+ return price;
+ }
+
+ public void setPrice(BigDecimal price) {
+ this.price = price;
+ }
+
+ public Delivery getDelivery() {
+ return delivery;
+ }
+
+ public void setDelivery(Delivery delivery) {
+ this.delivery = delivery;
+ }
+
+ public boolean isFreeShipping() {
+ return freeShipping;
+ }
+
+ public void setFreeShipping(boolean freeShipping) {
+ this.freeShipping = freeShipping;
+ }
+
+ @Override
+ public Long getId() {
+ return id;
+ }
+
+ @Override
+ public void setId(Long id) {
+ this.id = id;
+
+ }
+
+ public BigDecimal getHandling() {
+ return handling;
+ }
+
+ public void setHandling(BigDecimal handling) {
+ this.handling = handling;
+ }
+
+ public Long getCartId() {
+ return cartId;
+ }
+
+ public void setCartId(Long cartId) {
+ this.cartId = cartId;
+ }
+
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingBasisType.java b/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingBasisType.java
index bca16a2..742b790 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingBasisType.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingBasisType.java
@@ -1,7 +1,7 @@
-package com.salesmanager.core.model.shipping;
-
-public enum ShippingBasisType {
-
- BILLING, SHIPPING
-
-}
+package com.salesmanager.core.model.shipping;
+
+public enum ShippingBasisType {
+
+ BILLING, SHIPPING
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingConfiguration.java b/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingConfiguration.java
index 32a38c3..653d4fe 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingConfiguration.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingConfiguration.java
@@ -1,359 +1,359 @@
-package com.salesmanager.core.model.shipping;
-
-import java.math.BigDecimal;
-
-import org.json.simple.JSONAware;
-import org.json.simple.JSONObject;
-
-/**
- * Object saved in the database maintaining various shipping options
- * @author casams1
- *
- */
-public class ShippingConfiguration implements JSONAware {
-
- //enums
- private ShippingType shippingType = ShippingType.NATIONAL;
- private ShippingBasisType shippingBasisType = ShippingBasisType.SHIPPING;
- private ShippingOptionPriceType shippingOptionPriceType = ShippingOptionPriceType.ALL;
- private ShippingPackageType shippingPackageType = ShippingPackageType.ITEM;
- private ShippingDescription shippingDescription = ShippingDescription.SHORT_DESCRIPTION;
- private ShippingType freeShippingType = null;
-
- private int boxWidth = 0;
- private int boxHeight = 0;
- private int boxLength = 0;
- private double boxWeight = 0;
- private double maxWeight = 0;
-
- //free shipping
- private boolean freeShippingEnabled = false;
- private BigDecimal orderTotalFreeShipping = null;
-
-
- private BigDecimal handlingFees = null;
- private boolean taxOnShipping = false;
-
-
- //JSON bindings
- private String shipType;
- private String shipBaseType;
- private String shipOptionPriceType = ShippingOptionPriceType.ALL.name();
- private String shipPackageType;
- private String shipDescription;
- private String shipFreeType;
-
- //Transient
- private String orderTotalFreeShippingText = null;
- private String handlingFeesText = null;
-
-
- public String getShipType() {
- return shipType;
- }
-
-
- public String getShipBaseType() {
- return shipBaseType;
- }
-
-
- public String getShipOptionPriceType() {
- return shipOptionPriceType;
- }
-
-
-
- public void setShippingOptionPriceType(ShippingOptionPriceType shippingOptionPriceType) {
- this.shippingOptionPriceType = shippingOptionPriceType;
- this.shipOptionPriceType = this.shippingOptionPriceType.name();
- }
-
-
- public ShippingOptionPriceType getShippingOptionPriceType() {
- return shippingOptionPriceType;
- }
-
-
- public void setShippingBasisType(ShippingBasisType shippingBasisType) {
- this.shippingBasisType = shippingBasisType;
- this.shipBaseType = this.shippingBasisType.name();
- }
-
-
- public ShippingBasisType getShippingBasisType() {
- return shippingBasisType;
- }
-
-
- public void setShippingType(ShippingType shippingType) {
- this.shippingType = shippingType;
- this.shipType = this.shippingType.name();
- }
-
-
- public ShippingType getShippingType() {
- return shippingType;
- }
-
- public ShippingPackageType getShippingPackageType() {
- return shippingPackageType;
- }
-
-
- public void setShippingPackageType(ShippingPackageType shippingPackageType) {
- this.shippingPackageType = shippingPackageType;
- this.shipPackageType = shippingPackageType.name();
- }
-
-
- public String getShipPackageType() {
- return shipPackageType;
- }
-
-
- /** JSON bindding **/
- public void setShipType(String shipType) {
- this.shipType = shipType;
- ShippingType sType = ShippingType.NATIONAL;
- if(shipType.equals(ShippingType.INTERNATIONAL.name())) {
- sType = ShippingType.INTERNATIONAL;
- }
- setShippingType(sType);
- }
-
-
- public void setShipOptionPriceType(String shipOptionPriceType) {
- this.shipOptionPriceType = shipOptionPriceType;
- ShippingOptionPriceType sType = ShippingOptionPriceType.ALL;
- if(shipOptionPriceType.equals(ShippingOptionPriceType.HIGHEST.name())) {
- sType = ShippingOptionPriceType.HIGHEST;
- }
- if(shipOptionPriceType.equals(ShippingOptionPriceType.LEAST.name())) {
- sType = ShippingOptionPriceType.LEAST;
- }
- setShippingOptionPriceType(sType);
- }
-
-
- public void setShipBaseType(String shipBaseType) {
- this.shipBaseType = shipBaseType;
- ShippingBasisType sType = ShippingBasisType.SHIPPING;
- if(shipBaseType.equals(ShippingBasisType.BILLING.name())) {
- sType = ShippingBasisType.BILLING;
- }
- setShippingBasisType(sType);
- }
-
-
-
- public void setShipPackageType(String shipPackageType) {
- this.shipPackageType = shipPackageType;
- ShippingPackageType sType = ShippingPackageType.ITEM;
- if(shipPackageType.equals(ShippingPackageType.BOX.name())) {
- sType = ShippingPackageType.BOX;
- }
- this.setShippingPackageType(sType);
- }
-
- public void setShipDescription(String shipDescription) {
- this.shipDescription = shipDescription;
- ShippingDescription sType = ShippingDescription.SHORT_DESCRIPTION;
- if(shipDescription.equals(ShippingDescription.LONG_DESCRIPTION.name())) {
- sType = ShippingDescription.LONG_DESCRIPTION;
- }
- this.setShippingDescription(sType);
- }
-
- public void setShipFreeType(String shipFreeType) {
- this.shipFreeType = shipFreeType;
- ShippingType sType = ShippingType.NATIONAL;
- if(shipFreeType.equals(ShippingType.INTERNATIONAL.name())) {
- sType = ShippingType.INTERNATIONAL;
- }
- setFreeShippingType(sType);
- }
-
- @SuppressWarnings("unchecked")
- @Override
- public String toJSONString() {
- JSONObject data = new JSONObject();
- data.put("shipBaseType", this.getShippingBasisType().name());
- data.put("shipOptionPriceType", this.getShippingOptionPriceType().name());
- data.put("shipType", this.getShippingType().name());
- data.put("shipPackageType", this.getShippingPackageType().name());
- if(shipFreeType!=null) {
- data.put("shipFreeType", this.getFreeShippingType().name());
- }
- data.put("shipDescription", this.getShippingDescription().name());
-
-
- data.put("boxWidth", this.getBoxWidth());
- data.put("boxHeight", this.getBoxHeight());
- data.put("boxLength", this.getBoxLength());
- data.put("boxWeight", this.getBoxWeight());
- data.put("maxWeight", this.getMaxWeight());
- data.put("freeShippingEnabled", this.freeShippingEnabled);
- data.put("orderTotalFreeShipping", this.orderTotalFreeShipping);
- data.put("handlingFees", this.handlingFees);
- data.put("taxOnShipping", this.taxOnShipping);
-
-
- return data.toJSONString();
- }
-
-
- public int getBoxWidth() {
- return boxWidth;
- }
-
-
- public void setBoxWidth(int boxWidth) {
- this.boxWidth = boxWidth;
- }
-
-
- public int getBoxHeight() {
- return boxHeight;
- }
-
-
- public void setBoxHeight(int boxHeight) {
- this.boxHeight = boxHeight;
- }
-
-
- public int getBoxLength() {
- return boxLength;
- }
-
-
- public void setBoxLength(int boxLength) {
- this.boxLength = boxLength;
- }
-
-
- public double getBoxWeight() {
- return boxWeight;
- }
-
-
- public void setBoxWeight(double boxWeight) {
- this.boxWeight = boxWeight;
- }
-
-
- public double getMaxWeight() {
- return maxWeight;
- }
-
-
- public void setMaxWeight(double maxWeight) {
- this.maxWeight = maxWeight;
- }
-
-
- public boolean isFreeShippingEnabled() {
- return freeShippingEnabled;
- }
-
-
- public void setFreeShippingEnabled(boolean freeShippingEnabled) {
- this.freeShippingEnabled = freeShippingEnabled;
- }
-
-
- public BigDecimal getOrderTotalFreeShipping() {
- return orderTotalFreeShipping;
- }
-
-
- public void setOrderTotalFreeShipping(BigDecimal orderTotalFreeShipping) {
- this.orderTotalFreeShipping = orderTotalFreeShipping;
- }
-
-
- public void setHandlingFees(BigDecimal handlingFees) {
- this.handlingFees = handlingFees;
- }
-
-
- public BigDecimal getHandlingFees() {
- return handlingFees;
- }
-
-
- public void setTaxOnShipping(boolean taxOnShipping) {
- this.taxOnShipping = taxOnShipping;
- }
-
-
- public boolean isTaxOnShipping() {
- return taxOnShipping;
- }
-
-
-
-
-
- public String getShipDescription() {
- return shipDescription;
- }
-
-
- public void setShippingDescription(ShippingDescription shippingDescription) {
- this.shippingDescription = shippingDescription;
- }
-
-
- public ShippingDescription getShippingDescription() {
- return shippingDescription;
- }
-
-
- public void setFreeShippingType(ShippingType freeShippingType) {
- this.freeShippingType = freeShippingType;
- }
-
-
- public ShippingType getFreeShippingType() {
- return freeShippingType;
- }
-
-
-
- public String getShipFreeType() {
- return shipFreeType;
- }
-
-
- public void setOrderTotalFreeShippingText(String orderTotalFreeShippingText) {
- this.orderTotalFreeShippingText = orderTotalFreeShippingText;
- }
-
-
- public String getOrderTotalFreeShippingText() {
- return orderTotalFreeShippingText;
- }
-
-
- public void setHandlingFeesText(String handlingFeesText) {
- this.handlingFeesText = handlingFeesText;
- }
-
-
- public String getHandlingFeesText() {
- return handlingFeesText;
- }
-
-
-
-
-
-
-
-
-
-
-
-}
+package com.salesmanager.core.model.shipping;
+
+import java.math.BigDecimal;
+
+import org.json.simple.JSONAware;
+import org.json.simple.JSONObject;
+
+/**
+ * Object saved in the database maintaining various shipping options
+ * @author casams1
+ *
+ */
+public class ShippingConfiguration implements JSONAware {
+
+ //enums
+ private ShippingType shippingType = ShippingType.NATIONAL;
+ private ShippingBasisType shippingBasisType = ShippingBasisType.SHIPPING;
+ private ShippingOptionPriceType shippingOptionPriceType = ShippingOptionPriceType.ALL;
+ private ShippingPackageType shippingPackageType = ShippingPackageType.ITEM;
+ private ShippingDescription shippingDescription = ShippingDescription.SHORT_DESCRIPTION;
+ private ShippingType freeShippingType = null;
+
+ private int boxWidth = 0;
+ private int boxHeight = 0;
+ private int boxLength = 0;
+ private double boxWeight = 0;
+ private double maxWeight = 0;
+
+ //free shipping
+ private boolean freeShippingEnabled = false;
+ private BigDecimal orderTotalFreeShipping = null;
+
+
+ private BigDecimal handlingFees = null;
+ private boolean taxOnShipping = false;
+
+
+ //JSON bindings
+ private String shipType;
+ private String shipBaseType;
+ private String shipOptionPriceType = ShippingOptionPriceType.ALL.name();
+ private String shipPackageType;
+ private String shipDescription;
+ private String shipFreeType;
+
+ //Transient
+ private String orderTotalFreeShippingText = null;
+ private String handlingFeesText = null;
+
+
+ public String getShipType() {
+ return shipType;
+ }
+
+
+ public String getShipBaseType() {
+ return shipBaseType;
+ }
+
+
+ public String getShipOptionPriceType() {
+ return shipOptionPriceType;
+ }
+
+
+
+ public void setShippingOptionPriceType(ShippingOptionPriceType shippingOptionPriceType) {
+ this.shippingOptionPriceType = shippingOptionPriceType;
+ this.shipOptionPriceType = this.shippingOptionPriceType.name();
+ }
+
+
+ public ShippingOptionPriceType getShippingOptionPriceType() {
+ return shippingOptionPriceType;
+ }
+
+
+ public void setShippingBasisType(ShippingBasisType shippingBasisType) {
+ this.shippingBasisType = shippingBasisType;
+ this.shipBaseType = this.shippingBasisType.name();
+ }
+
+
+ public ShippingBasisType getShippingBasisType() {
+ return shippingBasisType;
+ }
+
+
+ public void setShippingType(ShippingType shippingType) {
+ this.shippingType = shippingType;
+ this.shipType = this.shippingType.name();
+ }
+
+
+ public ShippingType getShippingType() {
+ return shippingType;
+ }
+
+ public ShippingPackageType getShippingPackageType() {
+ return shippingPackageType;
+ }
+
+
+ public void setShippingPackageType(ShippingPackageType shippingPackageType) {
+ this.shippingPackageType = shippingPackageType;
+ this.shipPackageType = shippingPackageType.name();
+ }
+
+
+ public String getShipPackageType() {
+ return shipPackageType;
+ }
+
+
+ /** JSON bindding **/
+ public void setShipType(String shipType) {
+ this.shipType = shipType;
+ ShippingType sType = ShippingType.NATIONAL;
+ if(shipType.equals(ShippingType.INTERNATIONAL.name())) {
+ sType = ShippingType.INTERNATIONAL;
+ }
+ setShippingType(sType);
+ }
+
+
+ public void setShipOptionPriceType(String shipOptionPriceType) {
+ this.shipOptionPriceType = shipOptionPriceType;
+ ShippingOptionPriceType sType = ShippingOptionPriceType.ALL;
+ if(shipOptionPriceType.equals(ShippingOptionPriceType.HIGHEST.name())) {
+ sType = ShippingOptionPriceType.HIGHEST;
+ }
+ if(shipOptionPriceType.equals(ShippingOptionPriceType.LEAST.name())) {
+ sType = ShippingOptionPriceType.LEAST;
+ }
+ setShippingOptionPriceType(sType);
+ }
+
+
+ public void setShipBaseType(String shipBaseType) {
+ this.shipBaseType = shipBaseType;
+ ShippingBasisType sType = ShippingBasisType.SHIPPING;
+ if(shipBaseType.equals(ShippingBasisType.BILLING.name())) {
+ sType = ShippingBasisType.BILLING;
+ }
+ setShippingBasisType(sType);
+ }
+
+
+
+ public void setShipPackageType(String shipPackageType) {
+ this.shipPackageType = shipPackageType;
+ ShippingPackageType sType = ShippingPackageType.ITEM;
+ if(shipPackageType.equals(ShippingPackageType.BOX.name())) {
+ sType = ShippingPackageType.BOX;
+ }
+ this.setShippingPackageType(sType);
+ }
+
+ public void setShipDescription(String shipDescription) {
+ this.shipDescription = shipDescription;
+ ShippingDescription sType = ShippingDescription.SHORT_DESCRIPTION;
+ if(shipDescription.equals(ShippingDescription.LONG_DESCRIPTION.name())) {
+ sType = ShippingDescription.LONG_DESCRIPTION;
+ }
+ this.setShippingDescription(sType);
+ }
+
+ public void setShipFreeType(String shipFreeType) {
+ this.shipFreeType = shipFreeType;
+ ShippingType sType = ShippingType.NATIONAL;
+ if(shipFreeType.equals(ShippingType.INTERNATIONAL.name())) {
+ sType = ShippingType.INTERNATIONAL;
+ }
+ setFreeShippingType(sType);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public String toJSONString() {
+ JSONObject data = new JSONObject();
+ data.put("shipBaseType", this.getShippingBasisType().name());
+ data.put("shipOptionPriceType", this.getShippingOptionPriceType().name());
+ data.put("shipType", this.getShippingType().name());
+ data.put("shipPackageType", this.getShippingPackageType().name());
+ if(shipFreeType!=null) {
+ data.put("shipFreeType", this.getFreeShippingType().name());
+ }
+ data.put("shipDescription", this.getShippingDescription().name());
+
+
+ data.put("boxWidth", this.getBoxWidth());
+ data.put("boxHeight", this.getBoxHeight());
+ data.put("boxLength", this.getBoxLength());
+ data.put("boxWeight", this.getBoxWeight());
+ data.put("maxWeight", this.getMaxWeight());
+ data.put("freeShippingEnabled", this.freeShippingEnabled);
+ data.put("orderTotalFreeShipping", this.orderTotalFreeShipping);
+ data.put("handlingFees", this.handlingFees);
+ data.put("taxOnShipping", this.taxOnShipping);
+
+
+ return data.toJSONString();
+ }
+
+
+ public int getBoxWidth() {
+ return boxWidth;
+ }
+
+
+ public void setBoxWidth(int boxWidth) {
+ this.boxWidth = boxWidth;
+ }
+
+
+ public int getBoxHeight() {
+ return boxHeight;
+ }
+
+
+ public void setBoxHeight(int boxHeight) {
+ this.boxHeight = boxHeight;
+ }
+
+
+ public int getBoxLength() {
+ return boxLength;
+ }
+
+
+ public void setBoxLength(int boxLength) {
+ this.boxLength = boxLength;
+ }
+
+
+ public double getBoxWeight() {
+ return boxWeight;
+ }
+
+
+ public void setBoxWeight(double boxWeight) {
+ this.boxWeight = boxWeight;
+ }
+
+
+ public double getMaxWeight() {
+ return maxWeight;
+ }
+
+
+ public void setMaxWeight(double maxWeight) {
+ this.maxWeight = maxWeight;
+ }
+
+
+ public boolean isFreeShippingEnabled() {
+ return freeShippingEnabled;
+ }
+
+
+ public void setFreeShippingEnabled(boolean freeShippingEnabled) {
+ this.freeShippingEnabled = freeShippingEnabled;
+ }
+
+
+ public BigDecimal getOrderTotalFreeShipping() {
+ return orderTotalFreeShipping;
+ }
+
+
+ public void setOrderTotalFreeShipping(BigDecimal orderTotalFreeShipping) {
+ this.orderTotalFreeShipping = orderTotalFreeShipping;
+ }
+
+
+ public void setHandlingFees(BigDecimal handlingFees) {
+ this.handlingFees = handlingFees;
+ }
+
+
+ public BigDecimal getHandlingFees() {
+ return handlingFees;
+ }
+
+
+ public void setTaxOnShipping(boolean taxOnShipping) {
+ this.taxOnShipping = taxOnShipping;
+ }
+
+
+ public boolean isTaxOnShipping() {
+ return taxOnShipping;
+ }
+
+
+
+
+
+ public String getShipDescription() {
+ return shipDescription;
+ }
+
+
+ public void setShippingDescription(ShippingDescription shippingDescription) {
+ this.shippingDescription = shippingDescription;
+ }
+
+
+ public ShippingDescription getShippingDescription() {
+ return shippingDescription;
+ }
+
+
+ public void setFreeShippingType(ShippingType freeShippingType) {
+ this.freeShippingType = freeShippingType;
+ }
+
+
+ public ShippingType getFreeShippingType() {
+ return freeShippingType;
+ }
+
+
+
+ public String getShipFreeType() {
+ return shipFreeType;
+ }
+
+
+ public void setOrderTotalFreeShippingText(String orderTotalFreeShippingText) {
+ this.orderTotalFreeShippingText = orderTotalFreeShippingText;
+ }
+
+
+ public String getOrderTotalFreeShippingText() {
+ return orderTotalFreeShippingText;
+ }
+
+
+ public void setHandlingFeesText(String handlingFeesText) {
+ this.handlingFeesText = handlingFeesText;
+ }
+
+
+ public String getHandlingFeesText() {
+ return handlingFeesText;
+ }
+
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingDescription.java b/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingDescription.java
index c162f8a..7ae33ad 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingDescription.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingDescription.java
@@ -1,7 +1,7 @@
-package com.salesmanager.core.model.shipping;
-
-public enum ShippingDescription {
-
-
- SHORT_DESCRIPTION, LONG_DESCRIPTION
-}
+package com.salesmanager.core.model.shipping;
+
+public enum ShippingDescription {
+
+
+ SHORT_DESCRIPTION, LONG_DESCRIPTION
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingOption.java b/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingOption.java
index da5696e..3d61c03 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingOption.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingOption.java
@@ -1,119 +1,127 @@
-package com.salesmanager.core.model.shipping;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class ShippingOption implements Serializable {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ShippingOption.class);
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private BigDecimal optionPrice;
-
- private String optionName = null;
- private String optionCode = null;
- private String optionDeliveryDate = null;
- private String optionShippingDate = null;
- private String optionPriceText = null;
- private String optionId = null;
- private String description = null;
- private String shippingModuleCode = null;
- private String note = null;
-
- private String estimatedNumberOfDays;
-
-
-
- public BigDecimal getOptionPrice() {
-
- if(!StringUtils.isBlank(this.getOptionPriceText())) {
- try {
- this.optionPrice = new BigDecimal(this.getOptionPriceText());
- } catch(Exception e) {
- LOGGER.equals("Can't convert price text " + this.getOptionPriceText() + " to big decimal");
- }
- }
-
- return optionPrice;
- }
-
- public void setOptionPrice(BigDecimal optionPrice) {
- this.optionPrice = optionPrice;
- }
-
- public void setOptionCode(String optionCode) {
- this.optionCode = optionCode;
- }
- public String getOptionCode() {
- return optionCode;
- }
- public void setOptionName(String optionName) {
- this.optionName = optionName;
- }
- public String getOptionName() {
- return optionName;
- }
-
- public void setOptionPriceText(String optionPriceText) {
- this.optionPriceText = optionPriceText;
- }
- public String getOptionPriceText() {
- return optionPriceText;
- }
- public void setOptionId(String optionId) {
- this.optionId = optionId;
- }
- public String getOptionId() {
- return optionId;
- }
- public void setOptionDeliveryDate(String optionDeliveryDate) {
- this.optionDeliveryDate = optionDeliveryDate;
- }
- public String getOptionDeliveryDate() {
- return optionDeliveryDate;
- }
- public void setOptionShippingDate(String optionShippingDate) {
- this.optionShippingDate = optionShippingDate;
- }
- public String getOptionShippingDate() {
- return optionShippingDate;
- }
- public void setDescription(String description) {
- this.description = description;
- }
- public String getDescription() {
- return description;
- }
- public void setEstimatedNumberOfDays(String estimatedNumberOfDays) {
- this.estimatedNumberOfDays = estimatedNumberOfDays;
- }
- public String getEstimatedNumberOfDays() {
- return estimatedNumberOfDays;
- }
-
- public String getShippingModuleCode() {
- return shippingModuleCode;
- }
-
- public void setShippingModuleCode(String shippingModuleCode) {
- this.shippingModuleCode = shippingModuleCode;
- }
-
- public String getNote() {
- return note;
- }
-
- public void setNote(String note) {
- this.note = note;
- }
-
-
-
-}
+package com.salesmanager.core.model.shipping;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class ShippingOption implements Serializable {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ShippingOption.class);
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private BigDecimal optionPrice;
+ private Long shippingQuoteOptionId;
+
+
+ private String optionName = null;
+ private String optionCode = null;
+ private String optionDeliveryDate = null;
+ private String optionShippingDate = null;
+ private String optionPriceText = null;
+ private String optionId = null;
+ private String description = null;
+ private String shippingModuleCode = null;
+ private String note = null;
+
+ private String estimatedNumberOfDays;
+
+
+
+ public BigDecimal getOptionPrice() {
+
+ if(!StringUtils.isBlank(this.getOptionPriceText())) {
+ try {
+ this.optionPrice = new BigDecimal(this.getOptionPriceText());
+ } catch(Exception e) {
+ LOGGER.equals("Can't convert price text " + this.getOptionPriceText() + " to big decimal");
+ }
+ }
+
+ return optionPrice;
+ }
+
+ public void setOptionPrice(BigDecimal optionPrice) {
+ this.optionPrice = optionPrice;
+ }
+
+ public void setOptionCode(String optionCode) {
+ this.optionCode = optionCode;
+ }
+ public String getOptionCode() {
+ return optionCode;
+ }
+ public void setOptionName(String optionName) {
+ this.optionName = optionName;
+ }
+ public String getOptionName() {
+ return optionName;
+ }
+
+ public void setOptionPriceText(String optionPriceText) {
+ this.optionPriceText = optionPriceText;
+ }
+ public String getOptionPriceText() {
+ return optionPriceText;
+ }
+ public void setOptionId(String optionId) {
+ this.optionId = optionId;
+ }
+ public String getOptionId() {
+ return optionId;
+ }
+ public void setOptionDeliveryDate(String optionDeliveryDate) {
+ this.optionDeliveryDate = optionDeliveryDate;
+ }
+ public String getOptionDeliveryDate() {
+ return optionDeliveryDate;
+ }
+ public void setOptionShippingDate(String optionShippingDate) {
+ this.optionShippingDate = optionShippingDate;
+ }
+ public String getOptionShippingDate() {
+ return optionShippingDate;
+ }
+ public void setDescription(String description) {
+ this.description = description;
+ }
+ public String getDescription() {
+ return description;
+ }
+ public void setEstimatedNumberOfDays(String estimatedNumberOfDays) {
+ this.estimatedNumberOfDays = estimatedNumberOfDays;
+ }
+ public String getEstimatedNumberOfDays() {
+ return estimatedNumberOfDays;
+ }
+
+ public String getShippingModuleCode() {
+ return shippingModuleCode;
+ }
+
+ public void setShippingModuleCode(String shippingModuleCode) {
+ this.shippingModuleCode = shippingModuleCode;
+ }
+
+ public String getNote() {
+ return note;
+ }
+
+ public void setNote(String note) {
+ this.note = note;
+ }
+
+ public Long getShippingQuoteOptionId() {
+ return shippingQuoteOptionId;
+ }
+
+ public void setShippingQuoteOptionId(Long shippingQuoteOptionId) {
+ this.shippingQuoteOptionId = shippingQuoteOptionId;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingOptionPriceType.java b/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingOptionPriceType.java
index 6481295..da76982 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingOptionPriceType.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingOptionPriceType.java
@@ -1,7 +1,7 @@
-package com.salesmanager.core.model.shipping;
-
-public enum ShippingOptionPriceType {
-
- LEAST, HIGHEST, ALL
-
-}
+package com.salesmanager.core.model.shipping;
+
+public enum ShippingOptionPriceType {
+
+ LEAST, HIGHEST, ALL
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingOrigin.java b/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingOrigin.java
index 701bb29..a207b1b 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingOrigin.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingOrigin.java
@@ -1,149 +1,149 @@
-package com.salesmanager.core.model.shipping;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-
-import org.hibernate.validator.constraints.NotEmpty;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.generic.SalesManagerEntity;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.zone.Zone;
-
-@Entity
-@Table(name = "SHIPING_ORIGIN", schema=SchemaConstant.SALESMANAGER_SCHEMA)
-public class ShippingOrigin extends SalesManagerEntity<Long, ShippingOrigin> {
-
-
- /**
- *
- */
- private static final long serialVersionUID = 1172536723717691214L;
-
-
- @Id
- @Column(name = "SHIP_ORIGIN_ID", unique=true, nullable=false)
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT",
- pkColumnValue = "SHP_ORIG_SEQ_NEXT_VAL")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long id;
-
- @Column(name = "ACTIVE")
- private boolean active;
-
-
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name="MERCHANT_ID", nullable=false)
- private MerchantStore merchantStore;
-
- @NotEmpty
- @Column (name ="STREET_ADDRESS", length=256)
- private String address;
-
-
- @NotEmpty
- @Column (name ="CITY", length=100)
- private String city;
-
- @NotEmpty
- @Column (name ="POSTCODE", length=20)
- private String postalCode;
-
- @Column (name ="STATE", length=100)
- private String state;
-
- @ManyToOne(fetch = FetchType.EAGER, targetEntity = Country.class)
- @JoinColumn(name="COUNTRY_ID", nullable=true)
- private Country country;
-
- @ManyToOne(fetch = FetchType.EAGER, targetEntity = Zone.class)
- @JoinColumn(name="ZONE_ID", nullable=true)
- private Zone zone;
-
- @Override
- public Long getId() {
- return this.id;
- }
-
- @Override
- public void setId(Long id) {
- this.id = id;
-
- }
-
- public MerchantStore getMerchantStore() {
- return merchantStore;
- }
-
- public void setMerchantStore(MerchantStore merchantStore) {
- this.merchantStore = merchantStore;
- }
-
- public boolean isActive() {
- return active;
- }
-
- public void setActive(boolean active) {
- this.active = active;
- }
-
- public String getAddress() {
- return address;
- }
-
- public void setAddress(String address) {
- this.address = address;
- }
-
- public String getCity() {
- return city;
- }
-
- public void setCity(String city) {
- this.city = city;
- }
-
- public String getPostalCode() {
- return postalCode;
- }
-
- public void setPostalCode(String postalCode) {
- this.postalCode = postalCode;
- }
-
- public String getState() {
- return state;
- }
-
- public void setState(String state) {
- this.state = state;
- }
-
- public Country getCountry() {
- return country;
- }
-
- public void setCountry(Country country) {
- this.country = country;
- }
-
- public Zone getZone() {
- return zone;
- }
-
- public void setZone(Zone zone) {
- this.zone = zone;
- }
-
-
-
-}
+package com.salesmanager.core.model.shipping;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+
+import org.hibernate.validator.constraints.NotEmpty;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.zone.Zone;
+
+@Entity
+@Table(name = "SHIPING_ORIGIN", schema=SchemaConstant.SALESMANAGER_SCHEMA)
+public class ShippingOrigin extends SalesManagerEntity<Long, ShippingOrigin> {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1172536723717691214L;
+
+
+ @Id
+ @Column(name = "SHIP_ORIGIN_ID", unique=true, nullable=false)
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT",
+ pkColumnValue = "SHP_ORIG_SEQ_NEXT_VAL")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+ @Column(name = "ACTIVE")
+ private boolean active;
+
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name="MERCHANT_ID", nullable=false)
+ private MerchantStore merchantStore;
+
+ @NotEmpty
+ @Column (name ="STREET_ADDRESS", length=256)
+ private String address;
+
+
+ @NotEmpty
+ @Column (name ="CITY", length=100)
+ private String city;
+
+ @NotEmpty
+ @Column (name ="POSTCODE", length=20)
+ private String postalCode;
+
+ @Column (name ="STATE", length=100)
+ private String state;
+
+ @ManyToOne(fetch = FetchType.EAGER, targetEntity = Country.class)
+ @JoinColumn(name="COUNTRY_ID", nullable=true)
+ private Country country;
+
+ @ManyToOne(fetch = FetchType.EAGER, targetEntity = Zone.class)
+ @JoinColumn(name="ZONE_ID", nullable=true)
+ private Zone zone;
+
+ @Override
+ public Long getId() {
+ return this.id;
+ }
+
+ @Override
+ public void setId(Long id) {
+ this.id = id;
+
+ }
+
+ public MerchantStore getMerchantStore() {
+ return merchantStore;
+ }
+
+ public void setMerchantStore(MerchantStore merchantStore) {
+ this.merchantStore = merchantStore;
+ }
+
+ public boolean isActive() {
+ return active;
+ }
+
+ public void setActive(boolean active) {
+ this.active = active;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public String getPostalCode() {
+ return postalCode;
+ }
+
+ public void setPostalCode(String postalCode) {
+ this.postalCode = postalCode;
+ }
+
+ public String getState() {
+ return state;
+ }
+
+ public void setState(String state) {
+ this.state = state;
+ }
+
+ public Country getCountry() {
+ return country;
+ }
+
+ public void setCountry(Country country) {
+ this.country = country;
+ }
+
+ public Zone getZone() {
+ return zone;
+ }
+
+ public void setZone(Zone zone) {
+ this.zone = zone;
+ }
+
+
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingProduct.java b/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingProduct.java
index a1baa40..ae2aeea 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingProduct.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingProduct.java
@@ -1,39 +1,39 @@
-package com.salesmanager.core.model.shipping;
-
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.price.FinalPrice;
-
-public class ShippingProduct {
-
- public ShippingProduct(Product product) {
- this.product = product;
-
- }
-
- private int quantity = 1;
- private Product product;
-
- private FinalPrice finalPrice;
-
-
-
- public void setQuantity(int quantity) {
- this.quantity = quantity;
- }
- public int getQuantity() {
- return quantity;
- }
- public void setProduct(Product product) {
- this.product = product;
- }
- public Product getProduct() {
- return product;
- }
- public FinalPrice getFinalPrice() {
- return finalPrice;
- }
- public void setFinalPrice(FinalPrice finalPrice) {
- this.finalPrice = finalPrice;
- }
-
-}
+package com.salesmanager.core.model.shipping;
+
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.price.FinalPrice;
+
+public class ShippingProduct {
+
+ public ShippingProduct(Product product) {
+ this.product = product;
+
+ }
+
+ private int quantity = 1;
+ private Product product;
+
+ private FinalPrice finalPrice;
+
+
+
+ public void setQuantity(int quantity) {
+ this.quantity = quantity;
+ }
+ public int getQuantity() {
+ return quantity;
+ }
+ public void setProduct(Product product) {
+ this.product = product;
+ }
+ public Product getProduct() {
+ return product;
+ }
+ public FinalPrice getFinalPrice() {
+ return finalPrice;
+ }
+ public void setFinalPrice(FinalPrice finalPrice) {
+ this.finalPrice = finalPrice;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingQuote.java b/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingQuote.java
index d3c817f..5dca27f 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingQuote.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingQuote.java
@@ -1,138 +1,138 @@
-package com.salesmanager.core.model.shipping;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import com.salesmanager.core.model.common.Delivery;
-import com.salesmanager.core.model.system.IntegrationModule;
-
-public class ShippingQuote implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- public final static String NO_SHIPPING_TO_SELECTED_COUNTRY = "NO_SHIPPING_TO_SELECTED_COUNTRY";
- public final static String NO_SHIPPING_MODULE_CONFIGURED= "NO_SHIPPING_MODULE_CONFIGURED";
- public final static String NO_POSTAL_CODE= "NO_POSTAL_CODE";
- public final static String ERROR= "ERROR";
-
- /** shipping module used **/
- private String shippingModuleCode;
- private List<ShippingOption> shippingOptions = null;
- /** if an error occurs, this field will be populated from constants defined above **/
- private String shippingReturnCode = null;//NO_SHIPPING... or NO_SHIPPING_MODULE... or NO_POSTAL_...
- /** indicates if this quote is configured with free shipping **/
- private boolean freeShipping;
- /** the threshold amount for being free shipping **/
- private BigDecimal freeShippingAmount;
- /** handling fees to be added on top of shipping fees **/
- private BigDecimal handlingFees;
- /** apply tax on shipping **/
- private boolean applyTaxOnShipping;
-
- /**
- * final delivery address
- */
- private Delivery deliveryAddress;
-
- private List<String> warnings = new ArrayList<String>();
-
- private ShippingOption selectedShippingOption = null;
-
- private IntegrationModule currentShippingModule;
-
- private String quoteError = null;
-
- /** additinal shipping information **/
- private Map<String,Object> quoteInformations = new HashMap<String,Object>();
-
-
-
- public void setShippingOptions(List<ShippingOption> shippingOptions) {
- this.shippingOptions = shippingOptions;
- }
- public List<ShippingOption> getShippingOptions() {
- return shippingOptions;
- }
- public void setShippingModuleCode(String shippingModuleCode) {
- this.shippingModuleCode = shippingModuleCode;
- }
- public String getShippingModuleCode() {
- return shippingModuleCode;
- }
- public void setShippingReturnCode(String shippingReturnCode) {
- this.shippingReturnCode = shippingReturnCode;
- }
- public String getShippingReturnCode() {
- return shippingReturnCode;
- }
- public void setFreeShipping(boolean freeShipping) {
- this.freeShipping = freeShipping;
- }
- public boolean isFreeShipping() {
- return freeShipping;
- }
- public void setFreeShippingAmount(BigDecimal freeShippingAmount) {
- this.freeShippingAmount = freeShippingAmount;
- }
- public BigDecimal getFreeShippingAmount() {
- return freeShippingAmount;
- }
- public void setHandlingFees(BigDecimal handlingFees) {
- this.handlingFees = handlingFees;
- }
- public BigDecimal getHandlingFees() {
- return handlingFees;
- }
- public void setApplyTaxOnShipping(boolean applyTaxOnShipping) {
- this.applyTaxOnShipping = applyTaxOnShipping;
- }
- public boolean isApplyTaxOnShipping() {
- return applyTaxOnShipping;
- }
- public void setSelectedShippingOption(ShippingOption selectedShippingOption) {
- this.selectedShippingOption = selectedShippingOption;
- }
- public ShippingOption getSelectedShippingOption() {
- return selectedShippingOption;
- }
- public String getQuoteError() {
- return quoteError;
- }
- public void setQuoteError(String quoteError) {
- this.quoteError = quoteError;
- }
- public Map<String,Object> getQuoteInformations() {
- return quoteInformations;
- }
- public void setQuoteInformations(Map<String,Object> quoteInformations) {
- this.quoteInformations = quoteInformations;
- }
- public IntegrationModule getCurrentShippingModule() {
- return currentShippingModule;
- }
- public void setCurrentShippingModule(IntegrationModule currentShippingModule) {
- this.currentShippingModule = currentShippingModule;
- }
- public List<String> getWarnings() {
- return warnings;
- }
- public void setWarnings(List<String> warnings) {
- this.warnings = warnings;
- }
- public Delivery getDeliveryAddress() {
- return deliveryAddress;
- }
- public void setDeliveryAddress(Delivery deliveryAddress) {
- this.deliveryAddress = deliveryAddress;
- }
-
-
-
-
-}
+package com.salesmanager.core.model.shipping;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.salesmanager.core.model.common.Delivery;
+import com.salesmanager.core.model.system.IntegrationModule;
+
+public class ShippingQuote implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ public final static String NO_SHIPPING_TO_SELECTED_COUNTRY = "NO_SHIPPING_TO_SELECTED_COUNTRY";
+ public final static String NO_SHIPPING_MODULE_CONFIGURED= "NO_SHIPPING_MODULE_CONFIGURED";
+ public final static String NO_POSTAL_CODE= "NO_POSTAL_CODE";
+ public final static String ERROR= "ERROR";
+
+ /** shipping module used **/
+ private String shippingModuleCode;
+ private List<ShippingOption> shippingOptions = null;
+ /** if an error occurs, this field will be populated from constants defined above **/
+ private String shippingReturnCode = null;//NO_SHIPPING... or NO_SHIPPING_MODULE... or NO_POSTAL_...
+ /** indicates if this quote is configured with free shipping **/
+ private boolean freeShipping;
+ /** the threshold amount for being free shipping **/
+ private BigDecimal freeShippingAmount;
+ /** handling fees to be added on top of shipping fees **/
+ private BigDecimal handlingFees;
+ /** apply tax on shipping **/
+ private boolean applyTaxOnShipping;
+
+ /**
+ * final delivery address
+ */
+ private Delivery deliveryAddress;
+
+ private List<String> warnings = new ArrayList<String>();
+
+ private ShippingOption selectedShippingOption = null;
+
+ private IntegrationModule currentShippingModule;
+
+ private String quoteError = null;
+
+ /** additinal shipping information **/
+ private Map<String,Object> quoteInformations = new HashMap<String,Object>();
+
+
+
+ public void setShippingOptions(List<ShippingOption> shippingOptions) {
+ this.shippingOptions = shippingOptions;
+ }
+ public List<ShippingOption> getShippingOptions() {
+ return shippingOptions;
+ }
+ public void setShippingModuleCode(String shippingModuleCode) {
+ this.shippingModuleCode = shippingModuleCode;
+ }
+ public String getShippingModuleCode() {
+ return shippingModuleCode;
+ }
+ public void setShippingReturnCode(String shippingReturnCode) {
+ this.shippingReturnCode = shippingReturnCode;
+ }
+ public String getShippingReturnCode() {
+ return shippingReturnCode;
+ }
+ public void setFreeShipping(boolean freeShipping) {
+ this.freeShipping = freeShipping;
+ }
+ public boolean isFreeShipping() {
+ return freeShipping;
+ }
+ public void setFreeShippingAmount(BigDecimal freeShippingAmount) {
+ this.freeShippingAmount = freeShippingAmount;
+ }
+ public BigDecimal getFreeShippingAmount() {
+ return freeShippingAmount;
+ }
+ public void setHandlingFees(BigDecimal handlingFees) {
+ this.handlingFees = handlingFees;
+ }
+ public BigDecimal getHandlingFees() {
+ return handlingFees;
+ }
+ public void setApplyTaxOnShipping(boolean applyTaxOnShipping) {
+ this.applyTaxOnShipping = applyTaxOnShipping;
+ }
+ public boolean isApplyTaxOnShipping() {
+ return applyTaxOnShipping;
+ }
+ public void setSelectedShippingOption(ShippingOption selectedShippingOption) {
+ this.selectedShippingOption = selectedShippingOption;
+ }
+ public ShippingOption getSelectedShippingOption() {
+ return selectedShippingOption;
+ }
+ public String getQuoteError() {
+ return quoteError;
+ }
+ public void setQuoteError(String quoteError) {
+ this.quoteError = quoteError;
+ }
+ public Map<String,Object> getQuoteInformations() {
+ return quoteInformations;
+ }
+ public void setQuoteInformations(Map<String,Object> quoteInformations) {
+ this.quoteInformations = quoteInformations;
+ }
+ public IntegrationModule getCurrentShippingModule() {
+ return currentShippingModule;
+ }
+ public void setCurrentShippingModule(IntegrationModule currentShippingModule) {
+ this.currentShippingModule = currentShippingModule;
+ }
+ public List<String> getWarnings() {
+ return warnings;
+ }
+ public void setWarnings(List<String> warnings) {
+ this.warnings = warnings;
+ }
+ public Delivery getDeliveryAddress() {
+ return deliveryAddress;
+ }
+ public void setDeliveryAddress(Delivery deliveryAddress) {
+ this.deliveryAddress = deliveryAddress;
+ }
+
+
+
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingSummary.java b/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingSummary.java
index 7f16d06..01a9c0e 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingSummary.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingSummary.java
@@ -1,79 +1,79 @@
-package com.salesmanager.core.model.shipping;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-
-import com.salesmanager.core.model.common.Delivery;
-
-/**
- * Contains shipping fees according to user selections
- * @author casams1
- *
- */
-public class ShippingSummary implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private BigDecimal shipping;
- private BigDecimal handling;
- private String shippingModule;
- private String shippingOption;
- private String shippingOptionCode;
- private boolean freeShipping;
- private boolean taxOnShipping;
-
- private Delivery deliveryAddress;
-
-
- public BigDecimal getShipping() {
- return shipping;
- }
- public void setShipping(BigDecimal shipping) {
- this.shipping = shipping;
- }
- public BigDecimal getHandling() {
- return handling;
- }
- public void setHandling(BigDecimal handling) {
- this.handling = handling;
- }
- public String getShippingModule() {
- return shippingModule;
- }
- public void setShippingModule(String shippingModule) {
- this.shippingModule = shippingModule;
- }
- public String getShippingOption() {
- return shippingOption;
- }
- public void setShippingOption(String shippingOption) {
- this.shippingOption = shippingOption;
- }
- public boolean isFreeShipping() {
- return freeShipping;
- }
- public void setFreeShipping(boolean freeShipping) {
- this.freeShipping = freeShipping;
- }
- public boolean isTaxOnShipping() {
- return taxOnShipping;
- }
- public void setTaxOnShipping(boolean taxOnShipping) {
- this.taxOnShipping = taxOnShipping;
- }
- public Delivery getDeliveryAddress() {
- return deliveryAddress;
- }
- public void setDeliveryAddress(Delivery deliveryAddress) {
- this.deliveryAddress = deliveryAddress;
- }
- public String getShippingOptionCode() {
- return shippingOptionCode;
- }
- public void setShippingOptionCode(String shippingOptionCode) {
- this.shippingOptionCode = shippingOptionCode;
- }
-
-}
+package com.salesmanager.core.model.shipping;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+import com.salesmanager.core.model.common.Delivery;
+
+/**
+ * Contains shipping fees according to user selections
+ * @author casams1
+ *
+ */
+public class ShippingSummary implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private BigDecimal shipping;
+ private BigDecimal handling;
+ private String shippingModule;
+ private String shippingOption;
+ private String shippingOptionCode;
+ private boolean freeShipping;
+ private boolean taxOnShipping;
+
+ private Delivery deliveryAddress;
+
+
+ public BigDecimal getShipping() {
+ return shipping;
+ }
+ public void setShipping(BigDecimal shipping) {
+ this.shipping = shipping;
+ }
+ public BigDecimal getHandling() {
+ return handling;
+ }
+ public void setHandling(BigDecimal handling) {
+ this.handling = handling;
+ }
+ public String getShippingModule() {
+ return shippingModule;
+ }
+ public void setShippingModule(String shippingModule) {
+ this.shippingModule = shippingModule;
+ }
+ public String getShippingOption() {
+ return shippingOption;
+ }
+ public void setShippingOption(String shippingOption) {
+ this.shippingOption = shippingOption;
+ }
+ public boolean isFreeShipping() {
+ return freeShipping;
+ }
+ public void setFreeShipping(boolean freeShipping) {
+ this.freeShipping = freeShipping;
+ }
+ public boolean isTaxOnShipping() {
+ return taxOnShipping;
+ }
+ public void setTaxOnShipping(boolean taxOnShipping) {
+ this.taxOnShipping = taxOnShipping;
+ }
+ public Delivery getDeliveryAddress() {
+ return deliveryAddress;
+ }
+ public void setDeliveryAddress(Delivery deliveryAddress) {
+ this.deliveryAddress = deliveryAddress;
+ }
+ public String getShippingOptionCode() {
+ return shippingOptionCode;
+ }
+ public void setShippingOptionCode(String shippingOptionCode) {
+ this.shippingOptionCode = shippingOptionCode;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingType.java b/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingType.java
index 5d90127..cd69384 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingType.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/shipping/ShippingType.java
@@ -1,7 +1,7 @@
-package com.salesmanager.core.model.shipping;
-
-public enum ShippingType {
-
- NATIONAL, INTERNATIONAL
-
-}
+package com.salesmanager.core.model.shipping;
+
+public enum ShippingType {
+
+ NATIONAL, INTERNATIONAL
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/shoppingcart/ShoppingCart.java b/sm-core-model/src/main/java/com/salesmanager/core/model/shoppingcart/ShoppingCart.java
index d671e09..8d3b293 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/shoppingcart/ShoppingCart.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/shoppingcart/ShoppingCart.java
@@ -1,147 +1,148 @@
-/**
- *
- */
-package com.salesmanager.core.model.shoppingcart;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Embedded;
-import javax.persistence.Entity;
-import javax.persistence.EntityListeners;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Index;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Transient;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.common.audit.AuditListener;
-import com.salesmanager.core.model.common.audit.AuditSection;
-import com.salesmanager.core.model.common.audit.Auditable;
-import com.salesmanager.core.model.generic.SalesManagerEntity;
-import com.salesmanager.core.model.merchant.MerchantStore;
-
-/**
- * <p>Shopping cart is responsible for storing and carrying
- * shopping cart information.Shopping Cart consists of {@link ShoppingCartItem}
- * which represents individual lines items associated with the shopping cart</p>
- * @author Umesh Awasthi
- * version 2.0
- *
- */
-@Entity
-@EntityListeners(value = AuditListener.class)
-@Table(name = "SHOPPING_CART", schema=SchemaConstant.SALESMANAGER_SCHEMA, indexes= { @Index(name = "SHP_CART_CODE_IDX", columnList = "SHP_CART_CODE"), @Index(name = "SHP_CART_CUSTOMER_IDX", columnList = "CUSTOMER_ID")})
-public class ShoppingCart extends SalesManagerEntity<Long, ShoppingCart> implements Auditable{
-
-
- private static final long serialVersionUID = 1L;
-
- @Embedded
- private AuditSection auditSection = new AuditSection();
-
- @Id
- @Column(name = "SHP_CART_ID", unique=true, nullable=false)
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "SHP_CRT_SEQ_NEXT_VAL")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long id;
-
- /**
- * Will be used to fetch shopping cart model from the controller
- * this is a unique code that should be attributed from the client (UI)
- *
- */
- @Column(name = "SHP_CART_CODE", unique=true, nullable=false)
- private String shoppingCartCode;
-
- @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "shoppingCart")
- private Set<ShoppingCartItem> lineItems = new HashSet<ShoppingCartItem>();
-
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name="MERCHANT_ID", nullable=false)
- private MerchantStore merchantStore;
-
- @Column(name = "CUSTOMER_ID", nullable = true)
- private Long customerId;
-
- @Transient
- private boolean obsolete = false;//when all items are obsolete
-
- @Override
- public AuditSection getAuditSection() {
- return auditSection;
- }
-
- @Override
- public void setAuditSection(AuditSection audit) {
- this.auditSection = audit;
-
- }
-
- @Override
- public Long getId() {
- return id;
- }
-
- @Override
- public void setId(Long id) {
- this.id = id;
-
- }
-
-
- public boolean isObsolete() {
- return obsolete;
- }
-
- public void setObsolete(boolean obsolete) {
- this.obsolete = obsolete;
- }
-
- public Set<ShoppingCartItem> getLineItems() {
- return lineItems;
- }
-
- public void setLineItems(Set<ShoppingCartItem> lineItems) {
- this.lineItems = lineItems;
- }
-
- public String getShoppingCartCode()
- {
- return shoppingCartCode;
- }
-
- public void setShoppingCartCode( String shoppingCartCode )
- {
- this.shoppingCartCode = shoppingCartCode;
- }
-
-
- public void setCustomerId(Long customerId) {
- this.customerId = customerId;
- }
-
- public Long getCustomerId() {
- return customerId;
- }
-
- public void setMerchantStore(MerchantStore merchantStore) {
- this.merchantStore = merchantStore;
- }
-
- public MerchantStore getMerchantStore() {
- return merchantStore;
- }
-
-
-
-}
+/**
+ *
+ */
+package com.salesmanager.core.model.shoppingcart;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.EntityListeners;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Index;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Transient;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.common.audit.AuditListener;
+import com.salesmanager.core.model.common.audit.AuditSection;
+import com.salesmanager.core.model.common.audit.Auditable;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+import com.salesmanager.core.model.merchant.MerchantStore;
+
+/**
+ * <p>Shopping cart is responsible for storing and carrying
+ * shopping cart information.Shopping Cart consists of {@link ShoppingCartItem}
+ * which represents individual lines items associated with the shopping cart</p>
+ * @author Umesh Awasthi
+ * version 2.0
+ *
+ */
+@Entity
+@EntityListeners(value = AuditListener.class)
+@Table(name = "SHOPPING_CART", schema=SchemaConstant.SALESMANAGER_SCHEMA, indexes= { @Index(name = "SHP_CART_CODE_IDX", columnList = "SHP_CART_CODE"), @Index(name = "SHP_CART_CUSTOMER_IDX", columnList = "CUSTOMER_ID")})
+public class ShoppingCart extends SalesManagerEntity<Long, ShoppingCart> implements Auditable{
+
+
+ private static final long serialVersionUID = 1L;
+
+ @Embedded
+ private AuditSection auditSection = new AuditSection();
+
+ @Id
+ @Column(name = "SHP_CART_ID", unique=true, nullable=false)
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "SHP_CRT_SEQ_NEXT_VAL")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+ /**
+ * Will be used to fetch shopping cart model from the controller
+ * this is a unique code that should be attributed from the client (UI)
+ *
+ */
+ @Column(name = "SHP_CART_CODE", unique=true, nullable=false)
+ private String shoppingCartCode;
+
+ //@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval=true, mappedBy = "shoppingCart")
+ @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "shoppingCart")
+ private Set<ShoppingCartItem> lineItems = new HashSet<ShoppingCartItem>();
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name="MERCHANT_ID", nullable=false)
+ private MerchantStore merchantStore;
+
+ @Column(name = "CUSTOMER_ID", nullable = true)
+ private Long customerId;
+
+ @Transient
+ private boolean obsolete = false;//when all items are obsolete
+
+ @Override
+ public AuditSection getAuditSection() {
+ return auditSection;
+ }
+
+ @Override
+ public void setAuditSection(AuditSection audit) {
+ this.auditSection = audit;
+
+ }
+
+ @Override
+ public Long getId() {
+ return id;
+ }
+
+ @Override
+ public void setId(Long id) {
+ this.id = id;
+
+ }
+
+
+ public boolean isObsolete() {
+ return obsolete;
+ }
+
+ public void setObsolete(boolean obsolete) {
+ this.obsolete = obsolete;
+ }
+
+ public Set<ShoppingCartItem> getLineItems() {
+ return lineItems;
+ }
+
+ public void setLineItems(Set<ShoppingCartItem> lineItems) {
+ this.lineItems = lineItems;
+ }
+
+ public String getShoppingCartCode()
+ {
+ return shoppingCartCode;
+ }
+
+ public void setShoppingCartCode( String shoppingCartCode )
+ {
+ this.shoppingCartCode = shoppingCartCode;
+ }
+
+
+ public void setCustomerId(Long customerId) {
+ this.customerId = customerId;
+ }
+
+ public Long getCustomerId() {
+ return customerId;
+ }
+
+ public void setMerchantStore(MerchantStore merchantStore) {
+ this.merchantStore = merchantStore;
+ }
+
+ public MerchantStore getMerchantStore() {
+ return merchantStore;
+ }
+
+
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/system/CustomIntegrationConfiguration.java b/sm-core-model/src/main/java/com/salesmanager/core/model/system/CustomIntegrationConfiguration.java
index af38ec6..0eaec18 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/system/CustomIntegrationConfiguration.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/system/CustomIntegrationConfiguration.java
@@ -1,14 +1,14 @@
-package com.salesmanager.core.model.system;
-
-import org.json.simple.JSONAware;
-
-/**
- * Used as a marker interface to commit additional
- * integration module information to the database
- * @author casams1
- *
- */
-public interface CustomIntegrationConfiguration extends JSONAware{
-
-
-}
+package com.salesmanager.core.model.system;
+
+import org.json.simple.JSONAware;
+
+/**
+ * Used as a marker interface to commit additional
+ * integration module information to the database
+ * @author casams1
+ *
+ */
+public interface CustomIntegrationConfiguration extends JSONAware{
+
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/system/IntegrationConfiguration.java b/sm-core-model/src/main/java/com/salesmanager/core/model/system/IntegrationConfiguration.java
index 23ebebb..12b2680 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/system/IntegrationConfiguration.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/system/IntegrationConfiguration.java
@@ -1,184 +1,184 @@
-package com.salesmanager.core.model.system;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-
-
-import org.json.simple.JSONAware;
-import org.json.simple.JSONObject;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-/**
- * Object used to contain the integration information with an external gateway
- * Uses simple JSON to encode the object in JSON by implementing JSONAware
- * and uses jackson JSON decode to parse JSON String to an Object
- * @author csamson
- *
- */
-public class IntegrationConfiguration implements JSONAware {
-
-
- public final static String TEST_ENVIRONMENT = "TEST";
- public final static String PRODUCTION_ENVIRONMENT = "PRODUCTION";
-
- private String moduleCode;
- private boolean active;
- private boolean defaultSelected;
- //private boolean customModule;
- private Map<String,String> integrationKeys= new HashMap<String,String>();
- private Map<String,List<String>> integrationOptions= new HashMap<String,List<String>>();
- private String environment;
-
-
- public String getModuleCode() {
- return moduleCode;
- }
- @JsonProperty("moduleCode")
- public void setModuleCode(String moduleCode) {
- this.moduleCode = moduleCode;
- }
- public boolean isActive() {
- return active;
- }
- @JsonProperty("active")
- public void setActive(boolean active) {
- this.active = active;
- }
- public Map<String, String> getIntegrationKeys() {
- return integrationKeys;
- }
- @JsonProperty("integrationKeys")
- public void setIntegrationKeys(Map<String, String> integrationKeys) {
- this.integrationKeys = integrationKeys;
- }
-
-
- protected String getJsonInfo() {
-
- StringBuilder returnString = new StringBuilder();
- returnString.append("{");
- returnString.append("\"moduleCode\"").append(":\"").append(this.getModuleCode()).append("\"");
- returnString.append(",");
- returnString.append("\"active\"").append(":").append(this.isActive());
- returnString.append(",");
- returnString.append("\"defaultSelected\"").append(":").append(this.isDefaultSelected());
- returnString.append(",");
- //returnString.append("\"customModule\"").append(":").append(this.isCustomModule());
- //returnString.append(",");
- returnString.append("\"environment\"").append(":\"").append(this.getEnvironment()).append("\"");
- //returnString.append("}");
- return returnString.toString();
-
- }
-
-
- @SuppressWarnings("unchecked")
- @Override
- public String toJSONString() {
-
-
- StringBuilder returnString = new StringBuilder();
- returnString.append(getJsonInfo());
-
- if(this.getIntegrationKeys().size()>0) {
-
- JSONObject data = new JSONObject();
- Set<String> keys = this.getIntegrationKeys().keySet();
- for(String key : keys) {
- data.put(key, this.getIntegrationKeys().get(key));
- }
- String dataField = data.toJSONString();
-
- returnString.append(",").append("\"integrationKeys\"").append(":");
- returnString.append(dataField.toString());
-
-
- }
-
-
- if(this.getIntegrationOptions()!=null && this.getIntegrationOptions().size()>0) {
-
- //JSONObject data = new JSONObject();
- StringBuilder optionDataEntries = new StringBuilder();
- Set<String> keys = this.getIntegrationOptions().keySet();
- int countOptions = 0;
- int keySize = 0;
-
- for(String key : keys) {
- List<String> values = this.getIntegrationOptions().get(key);
- if(values!=null) {
- keySize ++;
- }
- }
-
- for(String key : keys) {
-
- List<String> values = this.getIntegrationOptions().get(key);
- if(values==null) {
- continue;
- }
- StringBuilder optionsEntries = new StringBuilder();
- StringBuilder dataEntries = new StringBuilder();
-
- int count = 0;
- for(String value : values) {
-
- dataEntries.append("\"").append(value).append("\"");
- if(count<values.size()-1) {
- dataEntries.append(",");
- }
- count++;
- }
-
- optionsEntries.append("[").append(dataEntries.toString()).append("]");
-
- optionDataEntries.append("\"").append(key).append("\":").append(optionsEntries.toString());
-
- if(countOptions<keySize-1) {
- optionDataEntries.append(",");
- }
- countOptions ++;
-
- }
- String dataField = optionDataEntries.toString();
-
- returnString.append(",").append("\"integrationOptions\"").append(":{");
- returnString.append(dataField.toString());
- returnString.append("}");
-
- }
-
-
- returnString.append("}");
-
-
- return returnString.toString();
-
- }
- public void setEnvironment(String environment) {
- this.environment = environment;
- }
- public String getEnvironment() {
- return environment;
- }
- public Map<String,List<String>> getIntegrationOptions() {
- return integrationOptions;
- }
- public void setIntegrationOptions(Map<String,List<String>> integrationOptions) {
- this.integrationOptions = integrationOptions;
- }
- public boolean isDefaultSelected() {
- return defaultSelected;
- }
- public void setDefaultSelected(boolean defaultSelected) {
- this.defaultSelected = defaultSelected;
- }
-
-
-
-
-}
+package com.salesmanager.core.model.system;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+
+
+import org.json.simple.JSONAware;
+import org.json.simple.JSONObject;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+/**
+ * Object used to contain the integration information with an external gateway
+ * Uses simple JSON to encode the object in JSON by implementing JSONAware
+ * and uses jackson JSON decode to parse JSON String to an Object
+ * @author csamson
+ *
+ */
+public class IntegrationConfiguration implements JSONAware {
+
+
+ public final static String TEST_ENVIRONMENT = "TEST";
+ public final static String PRODUCTION_ENVIRONMENT = "PRODUCTION";
+
+ private String moduleCode;
+ private boolean active;
+ private boolean defaultSelected;
+ //private boolean customModule;
+ private Map<String,String> integrationKeys= new HashMap<String,String>();
+ private Map<String,List<String>> integrationOptions= new HashMap<String,List<String>>();
+ private String environment;
+
+
+ public String getModuleCode() {
+ return moduleCode;
+ }
+ @JsonProperty("moduleCode")
+ public void setModuleCode(String moduleCode) {
+ this.moduleCode = moduleCode;
+ }
+ public boolean isActive() {
+ return active;
+ }
+ @JsonProperty("active")
+ public void setActive(boolean active) {
+ this.active = active;
+ }
+ public Map<String, String> getIntegrationKeys() {
+ return integrationKeys;
+ }
+ @JsonProperty("integrationKeys")
+ public void setIntegrationKeys(Map<String, String> integrationKeys) {
+ this.integrationKeys = integrationKeys;
+ }
+
+
+ protected String getJsonInfo() {
+
+ StringBuilder returnString = new StringBuilder();
+ returnString.append("{");
+ returnString.append("\"moduleCode\"").append(":\"").append(this.getModuleCode()).append("\"");
+ returnString.append(",");
+ returnString.append("\"active\"").append(":").append(this.isActive());
+ returnString.append(",");
+ returnString.append("\"defaultSelected\"").append(":").append(this.isDefaultSelected());
+ returnString.append(",");
+ //returnString.append("\"customModule\"").append(":").append(this.isCustomModule());
+ //returnString.append(",");
+ returnString.append("\"environment\"").append(":\"").append(this.getEnvironment()).append("\"");
+ //returnString.append("}");
+ return returnString.toString();
+
+ }
+
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public String toJSONString() {
+
+
+ StringBuilder returnString = new StringBuilder();
+ returnString.append(getJsonInfo());
+
+ if(this.getIntegrationKeys().size()>0) {
+
+ JSONObject data = new JSONObject();
+ Set<String> keys = this.getIntegrationKeys().keySet();
+ for(String key : keys) {
+ data.put(key, this.getIntegrationKeys().get(key));
+ }
+ String dataField = data.toJSONString();
+
+ returnString.append(",").append("\"integrationKeys\"").append(":");
+ returnString.append(dataField.toString());
+
+
+ }
+
+
+ if(this.getIntegrationOptions()!=null && this.getIntegrationOptions().size()>0) {
+
+ //JSONObject data = new JSONObject();
+ StringBuilder optionDataEntries = new StringBuilder();
+ Set<String> keys = this.getIntegrationOptions().keySet();
+ int countOptions = 0;
+ int keySize = 0;
+
+ for(String key : keys) {
+ List<String> values = this.getIntegrationOptions().get(key);
+ if(values!=null) {
+ keySize ++;
+ }
+ }
+
+ for(String key : keys) {
+
+ List<String> values = this.getIntegrationOptions().get(key);
+ if(values==null) {
+ continue;
+ }
+ StringBuilder optionsEntries = new StringBuilder();
+ StringBuilder dataEntries = new StringBuilder();
+
+ int count = 0;
+ for(String value : values) {
+
+ dataEntries.append("\"").append(value).append("\"");
+ if(count<values.size()-1) {
+ dataEntries.append(",");
+ }
+ count++;
+ }
+
+ optionsEntries.append("[").append(dataEntries.toString()).append("]");
+
+ optionDataEntries.append("\"").append(key).append("\":").append(optionsEntries.toString());
+
+ if(countOptions<keySize-1) {
+ optionDataEntries.append(",");
+ }
+ countOptions ++;
+
+ }
+ String dataField = optionDataEntries.toString();
+
+ returnString.append(",").append("\"integrationOptions\"").append(":{");
+ returnString.append(dataField.toString());
+ returnString.append("}");
+
+ }
+
+
+ returnString.append("}");
+
+
+ return returnString.toString();
+
+ }
+ public void setEnvironment(String environment) {
+ this.environment = environment;
+ }
+ public String getEnvironment() {
+ return environment;
+ }
+ public Map<String,List<String>> getIntegrationOptions() {
+ return integrationOptions;
+ }
+ public void setIntegrationOptions(Map<String,List<String>> integrationOptions) {
+ this.integrationOptions = integrationOptions;
+ }
+ public boolean isDefaultSelected() {
+ return defaultSelected;
+ }
+ public void setDefaultSelected(boolean defaultSelected) {
+ this.defaultSelected = defaultSelected;
+ }
+
+
+
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/system/MerchantConfigurationType.java b/sm-core-model/src/main/java/com/salesmanager/core/model/system/MerchantConfigurationType.java
index 6c898f8..d389af1 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/system/MerchantConfigurationType.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/system/MerchantConfigurationType.java
@@ -1,9 +1,9 @@
-package com.salesmanager.core.model.system;
-
-public enum MerchantConfigurationType {
-
- INTEGRATION,
- SHOP,
- CONFIG
-
-}
+package com.salesmanager.core.model.system;
+
+public enum MerchantConfigurationType {
+
+ INTEGRATION,
+ SHOP,
+ CONFIG
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/system/Module.java b/sm-core-model/src/main/java/com/salesmanager/core/model/system/Module.java
index d07b170..6257794 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/system/Module.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/system/Module.java
@@ -1,7 +1,7 @@
-package com.salesmanager.core.model.system;
-
-public enum Module {
-
- PAYMENT, SHIPPING
-
-}
+package com.salesmanager.core.model.system;
+
+public enum Module {
+
+ PAYMENT, SHIPPING
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/system/ModuleConfig.java b/sm-core-model/src/main/java/com/salesmanager/core/model/system/ModuleConfig.java
index 9c7c793..283aa5c 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/system/ModuleConfig.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/system/ModuleConfig.java
@@ -1,56 +1,56 @@
-package com.salesmanager.core.model.system;
-
-public class ModuleConfig {
-
-
- private String scheme;
- private String host;
- private String port;
- private String uri;
- private String env;
- private String config1;
- private String config2;
- public String getScheme() {
- return scheme;
- }
- public void setScheme(String scheme) {
- this.scheme = scheme;
- }
- public String getHost() {
- return host;
- }
- public void setHost(String host) {
- this.host = host;
- }
- public String getPort() {
- return port;
- }
- public void setPort(String port) {
- this.port = port;
- }
- public String getUri() {
- return uri;
- }
- public void setUri(String uri) {
- this.uri = uri;
- }
- public void setEnv(String env) {
- this.env = env;
- }
- public String getEnv() {
- return env;
- }
- public String getConfig1() {
- return config1;
- }
- public void setConfig1(String config1) {
- this.config1 = config1;
- }
- public String getConfig2() {
- return config2;
- }
- public void setConfig2(String config2) {
- this.config2 = config2;
- }
-
-}
+package com.salesmanager.core.model.system;
+
+public class ModuleConfig {
+
+
+ private String scheme;
+ private String host;
+ private String port;
+ private String uri;
+ private String env;
+ private String config1;
+ private String config2;
+ public String getScheme() {
+ return scheme;
+ }
+ public void setScheme(String scheme) {
+ this.scheme = scheme;
+ }
+ public String getHost() {
+ return host;
+ }
+ public void setHost(String host) {
+ this.host = host;
+ }
+ public String getPort() {
+ return port;
+ }
+ public void setPort(String port) {
+ this.port = port;
+ }
+ public String getUri() {
+ return uri;
+ }
+ public void setUri(String uri) {
+ this.uri = uri;
+ }
+ public void setEnv(String env) {
+ this.env = env;
+ }
+ public String getEnv() {
+ return env;
+ }
+ public String getConfig1() {
+ return config1;
+ }
+ public void setConfig1(String config1) {
+ this.config1 = config1;
+ }
+ public String getConfig2() {
+ return config2;
+ }
+ public void setConfig2(String config2) {
+ this.config2 = config2;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/system/optin/CustomerOptin.java b/sm-core-model/src/main/java/com/salesmanager/core/model/system/optin/CustomerOptin.java
index 698fcfe..3151021 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/system/optin/CustomerOptin.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/system/optin/CustomerOptin.java
@@ -31,7 +31,7 @@ import com.salesmanager.core.model.generic.SalesManagerEntity;
*/
@Entity
@EntityListeners(value = AuditListener.class)
-@Table(name = "CUSTMER_OPTIN", schema= SchemaConstant.SALESMANAGER_SCHEMA,uniqueConstraints=
+@Table(name = "CUSTOMER_OPTIN", schema= SchemaConstant.SALESMANAGER_SCHEMA,uniqueConstraints=
@UniqueConstraint(columnNames = {"EMAIL", "OPTIN_ID"}))
public class CustomerOptin extends SalesManagerEntity<Long, CustomerOptin> implements Serializable {
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/tax/TaxBasisCalculation.java b/sm-core-model/src/main/java/com/salesmanager/core/model/tax/TaxBasisCalculation.java
index 29fdb27..3a86d2f 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/tax/TaxBasisCalculation.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/tax/TaxBasisCalculation.java
@@ -1,7 +1,7 @@
-package com.salesmanager.core.model.tax;
-
-public enum TaxBasisCalculation {
-
- STOREADDRESS, SHIPPINGADDRESS, BILLINGADDRESS
-
-}
+package com.salesmanager.core.model.tax;
+
+public enum TaxBasisCalculation {
+
+ STOREADDRESS, SHIPPINGADDRESS, BILLINGADDRESS
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/tax/TaxConfiguration.java b/sm-core-model/src/main/java/com/salesmanager/core/model/tax/TaxConfiguration.java
index c348a1b..57edc3d 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/tax/TaxConfiguration.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/tax/TaxConfiguration.java
@@ -1,53 +1,53 @@
-package com.salesmanager.core.model.tax;
-
-import org.json.simple.JSONAware;
-import org.json.simple.JSONObject;
-
-/**
- * Set of various tax configuration settings saved in MerchantConfiguration
- * @author carl samson
- *
- */
-public class TaxConfiguration implements JSONAware {
-
- private TaxBasisCalculation taxBasisCalculation = TaxBasisCalculation.SHIPPINGADDRESS;
-
- private boolean collectTaxIfDifferentProvinceOfStoreCountry = true;
- private boolean collectTaxIfDifferentCountryOfStoreCountry = false;
-
- @SuppressWarnings("unchecked")
- @Override
- public String toJSONString() {
- JSONObject data = new JSONObject();
- data.put("taxBasisCalculation", this.getTaxBasisCalculation().name());
-
- return data.toJSONString();
- }
-
- public void setTaxBasisCalculation(TaxBasisCalculation taxBasisCalculation) {
- this.taxBasisCalculation = taxBasisCalculation;
- }
-
- public TaxBasisCalculation getTaxBasisCalculation() {
- return taxBasisCalculation;
- }
-
- public void setCollectTaxIfDifferentProvinceOfStoreCountry(
- boolean collectTaxIfDifferentProvinceOfStoreCountry) {
- this.collectTaxIfDifferentProvinceOfStoreCountry = collectTaxIfDifferentProvinceOfStoreCountry;
- }
-
- public boolean isCollectTaxIfDifferentProvinceOfStoreCountry() {
- return collectTaxIfDifferentProvinceOfStoreCountry;
- }
-
- public void setCollectTaxIfDifferentCountryOfStoreCountry(
- boolean collectTaxIfDifferentCountryOfStoreCountry) {
- this.collectTaxIfDifferentCountryOfStoreCountry = collectTaxIfDifferentCountryOfStoreCountry;
- }
-
- public boolean isCollectTaxIfDifferentCountryOfStoreCountry() {
- return collectTaxIfDifferentCountryOfStoreCountry;
- }
-
-}
+package com.salesmanager.core.model.tax;
+
+import org.json.simple.JSONAware;
+import org.json.simple.JSONObject;
+
+/**
+ * Set of various tax configuration settings saved in MerchantConfiguration
+ * @author carl samson
+ *
+ */
+public class TaxConfiguration implements JSONAware {
+
+ private TaxBasisCalculation taxBasisCalculation = TaxBasisCalculation.SHIPPINGADDRESS;
+
+ private boolean collectTaxIfDifferentProvinceOfStoreCountry = true;
+ private boolean collectTaxIfDifferentCountryOfStoreCountry = false;
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public String toJSONString() {
+ JSONObject data = new JSONObject();
+ data.put("taxBasisCalculation", this.getTaxBasisCalculation().name());
+
+ return data.toJSONString();
+ }
+
+ public void setTaxBasisCalculation(TaxBasisCalculation taxBasisCalculation) {
+ this.taxBasisCalculation = taxBasisCalculation;
+ }
+
+ public TaxBasisCalculation getTaxBasisCalculation() {
+ return taxBasisCalculation;
+ }
+
+ public void setCollectTaxIfDifferentProvinceOfStoreCountry(
+ boolean collectTaxIfDifferentProvinceOfStoreCountry) {
+ this.collectTaxIfDifferentProvinceOfStoreCountry = collectTaxIfDifferentProvinceOfStoreCountry;
+ }
+
+ public boolean isCollectTaxIfDifferentProvinceOfStoreCountry() {
+ return collectTaxIfDifferentProvinceOfStoreCountry;
+ }
+
+ public void setCollectTaxIfDifferentCountryOfStoreCountry(
+ boolean collectTaxIfDifferentCountryOfStoreCountry) {
+ this.collectTaxIfDifferentCountryOfStoreCountry = collectTaxIfDifferentCountryOfStoreCountry;
+ }
+
+ public boolean isCollectTaxIfDifferentCountryOfStoreCountry() {
+ return collectTaxIfDifferentCountryOfStoreCountry;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/tax/TaxItem.java b/sm-core-model/src/main/java/com/salesmanager/core/model/tax/TaxItem.java
index ee583a1..50c9b5b 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/tax/TaxItem.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/tax/TaxItem.java
@@ -1,32 +1,32 @@
-package com.salesmanager.core.model.tax;
-
-import com.salesmanager.core.model.order.OrderTotalItem;
-import com.salesmanager.core.model.tax.taxrate.TaxRate;
-
-public class TaxItem extends OrderTotalItem {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String label;
- private TaxRate taxRate=null;
-
- public void setLabel(String label) {
- this.label = label;
- }
-
- public String getLabel() {
- return label;
- }
-
- public void setTaxRate(TaxRate taxRate) {
- this.taxRate = taxRate;
- }
-
- public TaxRate getTaxRate() {
- return taxRate;
- }
-
-
-}
+package com.salesmanager.core.model.tax;
+
+import com.salesmanager.core.model.order.OrderTotalItem;
+import com.salesmanager.core.model.tax.taxrate.TaxRate;
+
+public class TaxItem extends OrderTotalItem {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String label;
+ private TaxRate taxRate=null;
+
+ public void setLabel(String label) {
+ this.label = label;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public void setTaxRate(TaxRate taxRate) {
+ this.taxRate = taxRate;
+ }
+
+ public TaxRate getTaxRate() {
+ return taxRate;
+ }
+
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/tax/taxrate/TaxRate.java b/sm-core-model/src/main/java/com/salesmanager/core/model/tax/taxrate/TaxRate.java
index caf52a7..9895d3a 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/tax/taxrate/TaxRate.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/tax/taxrate/TaxRate.java
@@ -1,252 +1,252 @@
-/*
- * Licensed to csti consulting
- * You may obtain a copy of the License at
- *
- * http://www.csticonsulting.com
- * Copyright (c) 2006-Aug 24, 2010 Consultation CS-TI inc.
- *
- * 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.
- */
-package com.salesmanager.core.model.tax.taxrate;
-
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Embedded;
-import javax.persistence.Entity;
-import javax.persistence.EntityListeners;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Transient;
-import javax.persistence.UniqueConstraint;
-import javax.validation.Valid;
-
-import org.hibernate.validator.constraints.NotEmpty;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.common.audit.AuditListener;
-import com.salesmanager.core.model.common.audit.AuditSection;
-import com.salesmanager.core.model.common.audit.Auditable;
-import com.salesmanager.core.model.generic.SalesManagerEntity;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.zone.Zone;
-import com.salesmanager.core.model.tax.taxclass.TaxClass;
-
-@Entity
-@EntityListeners(value = AuditListener.class)
-@Table(name = "TAX_RATE" , schema = SchemaConstant.SALESMANAGER_SCHEMA,uniqueConstraints={
- @UniqueConstraint(columnNames={
- "TAX_CODE",
- "MERCHANT_ID"
- })
- }
- )
-public class TaxRate extends SalesManagerEntity<Long, TaxRate> implements Auditable {
- private static final long serialVersionUID = 3356827741612925066L;
-
- @Id
- @Column(name = "TAX_RATE_ID")
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "TAX_RATE_ID_NEXT_VALUE")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long id;
-
- @Embedded
- private AuditSection auditSection = new AuditSection();
-
- @Column(name = "TAX_PRIORITY")
- private Integer taxPriority = 0;
-
- @Column(name = "TAX_RATE" , nullable= false , precision=7, scale=4)
- private BigDecimal taxRate;
-
- @NotEmpty
- @Column(name = "TAX_CODE")
- private String code;
-
-
- @Column(name = "PIGGYBACK")
- private boolean piggyback;
-
- @ManyToOne
- @JoinColumn(name = "TAX_CLASS_ID" , nullable=false)
- private TaxClass taxClass;
-
-
-
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name="MERCHANT_ID", nullable=false)
- private MerchantStore merchantStore;
-
- @Valid
- @OneToMany(mappedBy = "taxRate", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
- private List<TaxRateDescription> descriptions = new ArrayList<TaxRateDescription>();
-
- @ManyToOne(fetch = FetchType.LAZY, targetEntity = Country.class)
- @JoinColumn(name="COUNTRY_ID", nullable=false, updatable=true)
- private Country country;
-
- @OneToOne(fetch = FetchType.LAZY)
- @JoinColumn(name="ZONE_ID", nullable=true, updatable=true)
- private Zone zone;
-
- @Column(name = "STORE_STATE_PROV", length=100)
- private String stateProvince;
-
- @ManyToOne
- @JoinColumn(name = "PARENT_ID")
- private TaxRate parent;
-
- @OneToMany(mappedBy = "parent", cascade = CascadeType.REMOVE, orphanRemoval = true)
- private List<TaxRate> taxRates = new ArrayList<TaxRate>();
-
- @Transient
- private String rateText;
-
-
- public String getRateText() {
- return rateText;
- }
-
- public void setRateText(String rateText) {
- this.rateText = rateText;
- }
-
- public TaxRate() {
- }
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- @Override
- public AuditSection getAuditSection() {
- return auditSection;
- }
-
- @Override
- public void setAuditSection(AuditSection auditSection) {
- this.auditSection = auditSection;
- }
-
- public Integer getTaxPriority() {
- return taxPriority;
- }
-
- public void setTaxPriority(Integer taxPriority) {
- this.taxPriority = taxPriority;
- }
-
- public BigDecimal getTaxRate() {
- return taxRate;
- }
-
- public void setTaxRate(BigDecimal taxRate) {
- this.taxRate = taxRate;
- }
-
- public boolean isPiggyback() {
- return piggyback;
- }
-
- public void setPiggyback(boolean piggyback) {
- this.piggyback = piggyback;
- }
-
- public TaxClass getTaxClass() {
- return taxClass;
- }
-
- public void setTaxClass(TaxClass taxClass) {
- this.taxClass = taxClass;
- }
-
-
-
- public List<TaxRateDescription> getDescriptions() {
- return descriptions;
- }
-
- public void setDescriptions(List<TaxRateDescription> descriptions) {
- this.descriptions = descriptions;
- }
-
-
-
- public MerchantStore getMerchantStore() {
- return merchantStore;
- }
-
- public void setMerchantStore(MerchantStore merchantStore) {
- this.merchantStore = merchantStore;
- }
-
- public void setCountry(Country country) {
- this.country = country;
- }
-
- public Country getCountry() {
- return country;
- }
-
- public void setZone(Zone zone) {
- this.zone = zone;
- }
-
- public Zone getZone() {
- return zone;
- }
-
-
- public void setTaxRates(List<TaxRate> taxRates) {
- this.taxRates = taxRates;
- }
-
- public List<TaxRate> getTaxRates() {
- return taxRates;
- }
-
- public void setParent(TaxRate parent) {
- this.parent = parent;
- }
-
- public TaxRate getParent() {
- return parent;
- }
-
- public void setStateProvince(String stateProvince) {
- this.stateProvince = stateProvince;
- }
-
- public String getStateProvince() {
- return stateProvince;
- }
-
- public void setCode(String code) {
- this.code = code;
- }
-
- public String getCode() {
- return code;
- }
+/*
+ * Licensed to csti consulting
+ * You may obtain a copy of the License at
+ *
+ * http://www.csticonsulting.com
+ * Copyright (c) 2006-Aug 24, 2010 Consultation CS-TI inc.
+ *
+ * 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.
+ */
+package com.salesmanager.core.model.tax.taxrate;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.EntityListeners;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Transient;
+import javax.persistence.UniqueConstraint;
+import javax.validation.Valid;
+
+import org.hibernate.validator.constraints.NotEmpty;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.common.audit.AuditListener;
+import com.salesmanager.core.model.common.audit.AuditSection;
+import com.salesmanager.core.model.common.audit.Auditable;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.zone.Zone;
+import com.salesmanager.core.model.tax.taxclass.TaxClass;
+
+@Entity
+@EntityListeners(value = AuditListener.class)
+@Table(name = "TAX_RATE" , schema = SchemaConstant.SALESMANAGER_SCHEMA,uniqueConstraints={
+ @UniqueConstraint(columnNames={
+ "TAX_CODE",
+ "MERCHANT_ID"
+ })
+ }
+ )
+public class TaxRate extends SalesManagerEntity<Long, TaxRate> implements Auditable {
+ private static final long serialVersionUID = 3356827741612925066L;
+
+ @Id
+ @Column(name = "TAX_RATE_ID")
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "TAX_RATE_ID_NEXT_VALUE")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+ @Embedded
+ private AuditSection auditSection = new AuditSection();
+
+ @Column(name = "TAX_PRIORITY")
+ private Integer taxPriority = 0;
+
+ @Column(name = "TAX_RATE" , nullable= false , precision=7, scale=4)
+ private BigDecimal taxRate;
+
+ @NotEmpty
+ @Column(name = "TAX_CODE")
+ private String code;
+
+
+ @Column(name = "PIGGYBACK")
+ private boolean piggyback;
+
+ @ManyToOne
+ @JoinColumn(name = "TAX_CLASS_ID" , nullable=false)
+ private TaxClass taxClass;
+
+
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name="MERCHANT_ID", nullable=false)
+ private MerchantStore merchantStore;
+
+ @Valid
+ @OneToMany(mappedBy = "taxRate", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+ private List<TaxRateDescription> descriptions = new ArrayList<TaxRateDescription>();
+
+ @ManyToOne(fetch = FetchType.LAZY, targetEntity = Country.class)
+ @JoinColumn(name="COUNTRY_ID", nullable=false, updatable=true)
+ private Country country;
+
+ @OneToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name="ZONE_ID", nullable=true, updatable=true)
+ private Zone zone;
+
+ @Column(name = "STORE_STATE_PROV", length=100)
+ private String stateProvince;
+
+ @ManyToOne
+ @JoinColumn(name = "PARENT_ID")
+ private TaxRate parent;
+
+ @OneToMany(mappedBy = "parent", cascade = CascadeType.REMOVE, orphanRemoval = true)
+ private List<TaxRate> taxRates = new ArrayList<TaxRate>();
+
+ @Transient
+ private String rateText;
+
+
+ public String getRateText() {
+ return rateText;
+ }
+
+ public void setRateText(String rateText) {
+ this.rateText = rateText;
+ }
+
+ public TaxRate() {
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ @Override
+ public AuditSection getAuditSection() {
+ return auditSection;
+ }
+
+ @Override
+ public void setAuditSection(AuditSection auditSection) {
+ this.auditSection = auditSection;
+ }
+
+ public Integer getTaxPriority() {
+ return taxPriority;
+ }
+
+ public void setTaxPriority(Integer taxPriority) {
+ this.taxPriority = taxPriority;
+ }
+
+ public BigDecimal getTaxRate() {
+ return taxRate;
+ }
+
+ public void setTaxRate(BigDecimal taxRate) {
+ this.taxRate = taxRate;
+ }
+
+ public boolean isPiggyback() {
+ return piggyback;
+ }
+
+ public void setPiggyback(boolean piggyback) {
+ this.piggyback = piggyback;
+ }
+
+ public TaxClass getTaxClass() {
+ return taxClass;
+ }
+
+ public void setTaxClass(TaxClass taxClass) {
+ this.taxClass = taxClass;
+ }
+
+
+
+ public List<TaxRateDescription> getDescriptions() {
+ return descriptions;
+ }
+
+ public void setDescriptions(List<TaxRateDescription> descriptions) {
+ this.descriptions = descriptions;
+ }
+
+
+
+ public MerchantStore getMerchantStore() {
+ return merchantStore;
+ }
+
+ public void setMerchantStore(MerchantStore merchantStore) {
+ this.merchantStore = merchantStore;
+ }
+
+ public void setCountry(Country country) {
+ this.country = country;
+ }
+
+ public Country getCountry() {
+ return country;
+ }
+
+ public void setZone(Zone zone) {
+ this.zone = zone;
+ }
+
+ public Zone getZone() {
+ return zone;
+ }
+
+
+ public void setTaxRates(List<TaxRate> taxRates) {
+ this.taxRates = taxRates;
+ }
+
+ public List<TaxRate> getTaxRates() {
+ return taxRates;
+ }
+
+ public void setParent(TaxRate parent) {
+ this.parent = parent;
+ }
+
+ public TaxRate getParent() {
+ return parent;
+ }
+
+ public void setStateProvince(String stateProvince) {
+ this.stateProvince = stateProvince;
+ }
+
+ public String getStateProvince() {
+ return stateProvince;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public String getCode() {
+ return code;
+ }
}
\ No newline at end of file
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/tax/taxrate/TaxRateDescription.java b/sm-core-model/src/main/java/com/salesmanager/core/model/tax/taxrate/TaxRateDescription.java
index 0191ccc..17c46df 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/tax/taxrate/TaxRateDescription.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/tax/taxrate/TaxRateDescription.java
@@ -1,52 +1,52 @@
-/*
- * Licensed to csti consulting
- * You may obtain a copy of the License at
- *
- * http://www.csticonsulting.com
- * Copyright (c) 2006-Aug 24, 2010 Consultation CS-TI inc.
- *
- * 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.
- */
-package com.salesmanager.core.model.tax.taxrate;
-
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.UniqueConstraint;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.common.Description;
-
-
-@Entity
-@Table(name = "TAX_RATE_DESCRIPTION" , schema=SchemaConstant.SALESMANAGER_SCHEMA ,uniqueConstraints={
- @UniqueConstraint(columnNames={
- "TAX_RATE_ID",
- "LANGUAGE_ID"
- })
- }
- )
-public class TaxRateDescription extends Description {
- private static final long serialVersionUID = -4752794805878361822L;
-
- @ManyToOne(targetEntity = TaxRate.class)
- @JoinColumn(name = "TAX_RATE_ID")
- private TaxRate taxRate;
-
- public TaxRateDescription() {
- }
-
- public TaxRate getTaxRate() {
- return taxRate;
- }
-
- public void setTaxRate(TaxRate taxRate) {
- this.taxRate = taxRate;
- }
-}
+/*
+ * Licensed to csti consulting
+ * You may obtain a copy of the License at
+ *
+ * http://www.csticonsulting.com
+ * Copyright (c) 2006-Aug 24, 2010 Consultation CS-TI inc.
+ *
+ * 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.
+ */
+package com.salesmanager.core.model.tax.taxrate;
+
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.common.description.Description;
+
+
+@Entity
+@Table(name = "TAX_RATE_DESCRIPTION" , schema=SchemaConstant.SALESMANAGER_SCHEMA ,uniqueConstraints={
+ @UniqueConstraint(columnNames={
+ "TAX_RATE_ID",
+ "LANGUAGE_ID"
+ })
+ }
+ )
+public class TaxRateDescription extends Description {
+ private static final long serialVersionUID = -4752794805878361822L;
+
+ @ManyToOne(targetEntity = TaxRate.class)
+ @JoinColumn(name = "TAX_RATE_ID")
+ private TaxRate taxRate;
+
+ public TaxRateDescription() {
+ }
+
+ public TaxRate getTaxRate() {
+ return taxRate;
+ }
+
+ public void setTaxRate(TaxRate taxRate) {
+ this.taxRate = taxRate;
+ }
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/user/Group.java b/sm-core-model/src/main/java/com/salesmanager/core/model/user/Group.java
index 60e353a..7368406 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/user/Group.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/user/Group.java
@@ -1,112 +1,113 @@
-package com.salesmanager.core.model.user;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.persistence.Column;
-import javax.persistence.Embedded;
-import javax.persistence.Entity;
-import javax.persistence.EntityListeners;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.ManyToMany;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-
-import org.hibernate.validator.constraints.NotEmpty;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.common.audit.AuditListener;
-import com.salesmanager.core.model.common.audit.AuditSection;
-import com.salesmanager.core.model.common.audit.Auditable;
-import com.salesmanager.core.model.generic.SalesManagerEntity;
-
-
-@Entity
-@EntityListeners(value = AuditListener.class)
-@Table(name = "SM_GROUP", schema=SchemaConstant.SALESMANAGER_SCHEMA)
-public class Group extends SalesManagerEntity<Integer, Group> implements Auditable {
-
- /**
- *
- */
- private static final long serialVersionUID = 3786127652573709701L;
- @Id
- @Column(name = "GROUP_ID", unique=true, nullable=false)
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "GROUP_SEQ_NEXT_VAL")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Integer id;
-
- public Group() {
-
- }
-
- @Column (name ="GROUP_TYPE")
- @Enumerated(value = EnumType.STRING)
- private GroupType groupType;
-
- @NotEmpty
- @Column(name="GROUP_NAME", unique=true)
- private String groupName;
-
- public Group(String groupName) {
- this.groupName = groupName;
- }
-
- @ManyToMany(mappedBy = "groups")
- private Set<Permission> permissions = new HashSet<Permission>();
-
- public Set<Permission> getPermissions() {
- return permissions;
- }
-
- public void setPermissions(Set<Permission> permissions) {
- this.permissions = permissions;
- }
-
- @Embedded
- private AuditSection auditSection = new AuditSection();
-
-
- @Override
- public AuditSection getAuditSection() {
- return this.auditSection;
- }
-
- @Override
- public void setAuditSection(AuditSection audit) {
- this.auditSection = audit;
- }
-
- @Override
- public Integer getId() {
- return this.id;
- }
-
- @Override
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getGroupName() {
- return groupName;
- }
-
- public void setGroupName(String groupName) {
- this.groupName = groupName;
- }
-
- public void setGroupType(GroupType groupType) {
- this.groupType = groupType;
- }
-
- public GroupType getGroupType() {
- return groupType;
- }
-
-
-
-}
+package com.salesmanager.core.model.user;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.EntityListeners;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+
+import org.hibernate.validator.constraints.NotEmpty;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.common.audit.AuditListener;
+import com.salesmanager.core.model.common.audit.AuditSection;
+import com.salesmanager.core.model.common.audit.Auditable;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+
+
+@Entity
+@EntityListeners(value = AuditListener.class)
+@Table(name = "SM_GROUP", schema=SchemaConstant.SALESMANAGER_SCHEMA)
+public class Group extends SalesManagerEntity<Integer, Group> implements Auditable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 3786127652573709701L;
+ @Id
+ @Column(name = "GROUP_ID", unique=true, nullable=false)
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "GROUP_SEQ_NEXT_VAL")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Integer id;
+
+ public Group() {
+
+ }
+
+ //@NotEmpty
+ @Column (name ="GROUP_TYPE")
+ @Enumerated(value = EnumType.STRING)
+ private GroupType groupType;
+
+ @NotEmpty
+ @Column(name="GROUP_NAME", unique=true)
+ private String groupName;
+
+ public Group(String groupName) {
+ this.groupName = groupName;
+ }
+
+ @ManyToMany(mappedBy = "groups")
+ private Set<Permission> permissions = new HashSet<Permission>();
+
+ public Set<Permission> getPermissions() {
+ return permissions;
+ }
+
+ public void setPermissions(Set<Permission> permissions) {
+ this.permissions = permissions;
+ }
+
+ @Embedded
+ private AuditSection auditSection = new AuditSection();
+
+
+ @Override
+ public AuditSection getAuditSection() {
+ return this.auditSection;
+ }
+
+ @Override
+ public void setAuditSection(AuditSection audit) {
+ this.auditSection = audit;
+ }
+
+ @Override
+ public Integer getId() {
+ return this.id;
+ }
+
+ @Override
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getGroupName() {
+ return groupName;
+ }
+
+ public void setGroupName(String groupName) {
+ this.groupName = groupName;
+ }
+
+ public void setGroupType(GroupType groupType) {
+ this.groupType = groupType;
+ }
+
+ public GroupType getGroupType() {
+ return groupType;
+ }
+
+
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/user/GroupType.java b/sm-core-model/src/main/java/com/salesmanager/core/model/user/GroupType.java
index c2c6711..2547133 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/user/GroupType.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/user/GroupType.java
@@ -1,7 +1,7 @@
-package com.salesmanager.core.model.user;
-
-public enum GroupType {
-
- ADMIN, CUSTOMER
-
-}
+package com.salesmanager.core.model.user;
+
+public enum GroupType {
+
+ ADMIN, CUSTOMER
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/user/Permission.java b/sm-core-model/src/main/java/com/salesmanager/core/model/user/Permission.java
index 5e99934..1e890d0 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/user/Permission.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/user/Permission.java
@@ -1,116 +1,116 @@
-package com.salesmanager.core.model.user;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Embedded;
-import javax.persistence.Entity;
-import javax.persistence.EntityListeners;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-
-import org.hibernate.annotations.Cascade;
-import org.hibernate.validator.constraints.NotEmpty;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.common.audit.AuditListener;
-import com.salesmanager.core.model.common.audit.AuditSection;
-import com.salesmanager.core.model.common.audit.Auditable;
-import com.salesmanager.core.model.generic.SalesManagerEntity;
-
-@Entity
-@EntityListeners(value = AuditListener.class)
-@Table(name = "PERMISSION", schema=SchemaConstant.SALESMANAGER_SCHEMA)
-public class Permission extends SalesManagerEntity<Integer, Permission> implements Auditable {
-
-
-
- private static final long serialVersionUID = 813468140197420748L;
-
- @Id
- @Column(name = "PERMISSION_ID", unique=true, nullable=false)
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "PERMISSION_SEQ_NEXT_VAL")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Integer id;
-
- public Permission() {
-
- }
-
- public Permission(String permissionName) {
- this.permissionName = permissionName;
- }
-
-
- @NotEmpty
- @Column(name="PERMISSION_NAME", unique=true)
- private String permissionName;
-
- @ManyToMany(fetch=FetchType.LAZY, cascade = {CascadeType.REFRESH})
- @JoinTable(name = "PERMISSION_GROUP", schema=SchemaConstant.SALESMANAGER_SCHEMA, joinColumns = {
- @JoinColumn(name = "PERMISSION_ID", nullable = false, updatable = false) }
- ,
- inverseJoinColumns = { @JoinColumn(name = "GROUP_ID",
- nullable = false, updatable = false) }
- )
- @Cascade({
- org.hibernate.annotations.CascadeType.DETACH,
- org.hibernate.annotations.CascadeType.LOCK,
- org.hibernate.annotations.CascadeType.REFRESH,
- org.hibernate.annotations.CascadeType.REPLICATE
-
- })
- private List<Group> groups = new ArrayList<Group>();
-
- @Embedded
- private AuditSection auditSection = new AuditSection();
-
-
- @Override
- public Integer getId() {
- return this.id;
- }
-
- @Override
- public void setId(Integer id) {
- this.id = id;
-
- }
-
- @Override
- public AuditSection getAuditSection() {
- return this.auditSection;
- }
-
- @Override
- public void setAuditSection(AuditSection audit) {
- this.auditSection = audit;
-
- }
-
- public String getPermissionName() {
- return permissionName;
- }
-
- public void setPermissionName(String permissionName) {
- this.permissionName = permissionName;
- }
-
- public void setGroups(List<Group> groups) {
- this.groups = groups;
- }
-
- public List<Group> getGroups() {
- return groups;
- }
-
-}
+package com.salesmanager.core.model.user;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.EntityListeners;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+
+import org.hibernate.annotations.Cascade;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.common.audit.AuditListener;
+import com.salesmanager.core.model.common.audit.AuditSection;
+import com.salesmanager.core.model.common.audit.Auditable;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+
+@Entity
+@EntityListeners(value = AuditListener.class)
+@Table(name = "PERMISSION", schema=SchemaConstant.SALESMANAGER_SCHEMA)
+public class Permission extends SalesManagerEntity<Integer, Permission> implements Auditable {
+
+
+
+ private static final long serialVersionUID = 813468140197420748L;
+
+ @Id
+ @Column(name = "PERMISSION_ID", unique=true, nullable=false)
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "PERMISSION_SEQ_NEXT_VAL")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Integer id;
+
+ public Permission() {
+
+ }
+
+ public Permission(String permissionName) {
+ this.permissionName = permissionName;
+ }
+
+
+ @NotEmpty
+ @Column(name="PERMISSION_NAME", unique=true)
+ private String permissionName;
+
+ @ManyToMany(fetch=FetchType.LAZY, cascade = {CascadeType.REFRESH})
+ @JoinTable(name = "PERMISSION_GROUP", schema=SchemaConstant.SALESMANAGER_SCHEMA, joinColumns = {
+ @JoinColumn(name = "PERMISSION_ID", nullable = false, updatable = false) }
+ ,
+ inverseJoinColumns = { @JoinColumn(name = "GROUP_ID",
+ nullable = false, updatable = false) }
+ )
+ @Cascade({
+ org.hibernate.annotations.CascadeType.DETACH,
+ org.hibernate.annotations.CascadeType.LOCK,
+ org.hibernate.annotations.CascadeType.REFRESH,
+ org.hibernate.annotations.CascadeType.REPLICATE
+
+ })
+ private List<Group> groups = new ArrayList<Group>();
+
+ @Embedded
+ private AuditSection auditSection = new AuditSection();
+
+
+ @Override
+ public Integer getId() {
+ return this.id;
+ }
+
+ @Override
+ public void setId(Integer id) {
+ this.id = id;
+
+ }
+
+ @Override
+ public AuditSection getAuditSection() {
+ return this.auditSection;
+ }
+
+ @Override
+ public void setAuditSection(AuditSection audit) {
+ this.auditSection = audit;
+
+ }
+
+ public String getPermissionName() {
+ return permissionName;
+ }
+
+ public void setPermissionName(String permissionName) {
+ this.permissionName = permissionName;
+ }
+
+ public void setGroups(List<Group> groups) {
+ this.groups = groups;
+ }
+
+ public List<Group> getGroups() {
+ return groups;
+ }
+
+}
diff --git a/sm-core-model/src/main/java/com/salesmanager/core/model/user/User.java b/sm-core-model/src/main/java/com/salesmanager/core/model/user/User.java
index d9fb065..c57741b 100644
--- a/sm-core-model/src/main/java/com/salesmanager/core/model/user/User.java
+++ b/sm-core-model/src/main/java/com/salesmanager/core/model/user/User.java
@@ -1,298 +1,298 @@
-package com.salesmanager.core.model.user;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Embedded;
-import javax.persistence.Entity;
-import javax.persistence.EntityListeners;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-
-import org.hibernate.annotations.Cascade;
-import org.hibernate.validator.constraints.Email;
-import org.hibernate.validator.constraints.NotEmpty;
-
-import com.salesmanager.core.constants.SchemaConstant;
-import com.salesmanager.core.model.common.audit.AuditListener;
-import com.salesmanager.core.model.common.audit.AuditSection;
-import com.salesmanager.core.model.common.audit.Auditable;
-import com.salesmanager.core.model.generic.SalesManagerEntity;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-
-@Entity
-@EntityListeners(value = AuditListener.class)
-@Table(name = "USER", schema=SchemaConstant.SALESMANAGER_SCHEMA)
-public class User extends SalesManagerEntity<Long, User> implements Auditable {
-
-
- private static final long serialVersionUID = 5401059537544058710L;
-
- @Id
- @Column(name = "USER_ID", unique=true, nullable=false)
- @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "USER_SEQ_NEXT_VAL")
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
- private Long id;
-
- public User() {
-
- }
-
- public User(String userName,String password, String email) {
-
- this.adminName = userName;
- this.adminPassword = password;
- this.adminEmail = email;
- }
-
- @NotEmpty
- @Column(name="ADMIN_NAME", length=100, unique=true)
- private String adminName;
-
- @ManyToMany(fetch=FetchType.LAZY, cascade = {CascadeType.REFRESH})
- @JoinTable(name = "USER_GROUP", schema=SchemaConstant.SALESMANAGER_SCHEMA, joinColumns = {
- @JoinColumn(name = "USER_ID", nullable = false, updatable = false) }
- ,
- inverseJoinColumns = { @JoinColumn(name = "GROUP_ID",
- nullable = false, updatable = false) }
- )
- @Cascade({
- org.hibernate.annotations.CascadeType.DETACH,
- org.hibernate.annotations.CascadeType.LOCK,
- org.hibernate.annotations.CascadeType.REFRESH,
- org.hibernate.annotations.CascadeType.REPLICATE
-
- })
- private List<Group> groups = new ArrayList<Group>();
-
- @NotEmpty
- @Email
- @Column(name="ADMIN_EMAIL")
- private String adminEmail;
-
- @NotEmpty
- @Column(name="ADMIN_PASSWORD", length=60)
- private String adminPassword;
-
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name="MERCHANT_ID", nullable=false)
- private MerchantStore merchantStore;
-
-
- @Column(name="ADMIN_FIRST_NAME")
- private String firstName;
-
- @Column(name="ACTIVE")
- private boolean active = true;
-
-
- @Column(name="ADMIN_LAST_NAME")
- private String lastName;
-
- @ManyToOne(fetch = FetchType.LAZY, targetEntity = Language.class)
- @JoinColumn(name = "LANGUAGE_ID")
- private Language defaultLanguage;
-
-
- @Column(name="ADMIN_Q1")
- private String question1;
-
- @Column(name="ADMIN_Q2")
- private String question2;
-
- @Column(name="ADMIN_Q3")
- private String question3;
-
- @Column(name="ADMIN_A1")
- private String answer1;
-
- @Column(name="ADMIN_A2")
- private String answer2;
-
- @Column(name="ADMIN_A3")
- private String answer3;
-
-
- @Embedded
- private AuditSection auditSection = new AuditSection();
-
- @Temporal(TemporalType.TIMESTAMP)
- @Column(name = "LAST_ACCESS")
- private Date lastAccess;
-
- @Temporal(TemporalType.TIMESTAMP)
- @Column(name = "LOGIN_ACCESS")
- private Date loginTime;
-
- @Override
- public Long getId() {
- return this.id;
- }
-
- @Override
- public void setId(Long id) {
- this.id = id;
- }
-
- @Override
- public AuditSection getAuditSection() {
- return auditSection;
- }
-
- @Override
- public void setAuditSection(AuditSection audit) {
- auditSection = audit;
-
- }
-
- public String getAdminName() {
- return adminName;
- }
-
- public void setAdminName(String adminName) {
- this.adminName = adminName;
- }
-
- public String getAdminEmail() {
- return adminEmail;
- }
-
- public void setAdminEmail(String adminEmail) {
- this.adminEmail = adminEmail;
- }
-
- public String getAdminPassword() {
- return adminPassword;
- }
-
- public void setAdminPassword(String adminPassword) {
- this.adminPassword = adminPassword;
- }
-
- public String getFirstName() {
- return firstName;
- }
-
- public void setFirstName(String firstName) {
- this.firstName = firstName;
- }
-
- public String getLastName() {
- return lastName;
- }
-
- public void setLastName(String lastName) {
- this.lastName = lastName;
- }
-
- public Language getDefaultLanguage() {
- return defaultLanguage;
- }
-
- public void setDefaultLanguage(Language defaultLanguage) {
- this.defaultLanguage = defaultLanguage;
- }
-
- public String getQuestion1() {
- return question1;
- }
-
- public void setQuestion1(String question1) {
- this.question1 = question1;
- }
-
- public String getQuestion2() {
- return question2;
- }
-
- public void setQuestion2(String question2) {
- this.question2 = question2;
- }
-
- public String getQuestion3() {
- return question3;
- }
-
- public void setQuestion3(String question3) {
- this.question3 = question3;
- }
-
- public String getAnswer1() {
- return answer1;
- }
-
- public void setAnswer1(String answer1) {
- this.answer1 = answer1;
- }
-
- public String getAnswer2() {
- return answer2;
- }
-
- public void setAnswer2(String answer2) {
- this.answer2 = answer2;
- }
-
- public String getAnswer3() {
- return answer3;
- }
-
- public void setAnswer3(String answer3) {
- this.answer3 = answer3;
- }
-
- public void setGroups(List<Group> groups) {
- this.groups = groups;
- }
-
- public List<Group> getGroups() {
- return groups;
- }
-
- public MerchantStore getMerchantStore() {
- return merchantStore;
- }
-
- public void setMerchantStore(MerchantStore merchantStore) {
- this.merchantStore = merchantStore;
- }
-
- public void setActive(boolean active) {
- this.active = active;
- }
-
- public boolean isActive() {
- return active;
- }
-
- public void setLastAccess(Date lastAccess) {
- this.lastAccess = lastAccess;
- }
-
- public Date getLastAccess() {
- return lastAccess;
- }
-
- public void setLoginTime(Date loginTime) {
- this.loginTime = loginTime;
- }
-
- public Date getLoginTime() {
- return loginTime;
- }
-
-}
+package com.salesmanager.core.model.user;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.EntityListeners;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+import org.hibernate.annotations.Cascade;
+import org.hibernate.validator.constraints.Email;
+import org.hibernate.validator.constraints.NotEmpty;
+
+import com.salesmanager.core.constants.SchemaConstant;
+import com.salesmanager.core.model.common.audit.AuditListener;
+import com.salesmanager.core.model.common.audit.AuditSection;
+import com.salesmanager.core.model.common.audit.Auditable;
+import com.salesmanager.core.model.generic.SalesManagerEntity;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+
+@Entity
+@EntityListeners(value = AuditListener.class)
+@Table(name = "USER", schema=SchemaConstant.SALESMANAGER_SCHEMA)
+public class User extends SalesManagerEntity<Long, User> implements Auditable {
+
+
+ private static final long serialVersionUID = 5401059537544058710L;
+
+ @Id
+ @Column(name = "USER_ID", unique=true, nullable=false)
+ @TableGenerator(name = "TABLE_GEN", table = "SM_SEQUENCER", pkColumnName = "SEQ_NAME", valueColumnName = "SEQ_COUNT", pkColumnValue = "USER_SEQ_NEXT_VAL")
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_GEN")
+ private Long id;
+
+ public User() {
+
+ }
+
+ public User(String userName,String password, String email) {
+
+ this.adminName = userName;
+ this.adminPassword = password;
+ this.adminEmail = email;
+ }
+
+ @NotEmpty
+ @Column(name="ADMIN_NAME", length=100, unique=true)
+ private String adminName;
+
+ @ManyToMany(fetch=FetchType.LAZY, cascade = {CascadeType.REFRESH})
+ @JoinTable(name = "USER_GROUP", schema=SchemaConstant.SALESMANAGER_SCHEMA, joinColumns = {
+ @JoinColumn(name = "USER_ID", nullable = false, updatable = false) }
+ ,
+ inverseJoinColumns = { @JoinColumn(name = "GROUP_ID",
+ nullable = false, updatable = false) }
+ )
+ @Cascade({
+ org.hibernate.annotations.CascadeType.DETACH,
+ org.hibernate.annotations.CascadeType.LOCK,
+ org.hibernate.annotations.CascadeType.REFRESH,
+ org.hibernate.annotations.CascadeType.REPLICATE
+
+ })
+ private List<Group> groups = new ArrayList<Group>();
+
+ @NotEmpty
+ @Email
+ @Column(name="ADMIN_EMAIL")
+ private String adminEmail;
+
+ @NotEmpty
+ @Column(name="ADMIN_PASSWORD", length=60)
+ private String adminPassword;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name="MERCHANT_ID", nullable=false)
+ private MerchantStore merchantStore;
+
+
+ @Column(name="ADMIN_FIRST_NAME")
+ private String firstName;
+
+ @Column(name="ACTIVE")
+ private boolean active = true;
+
+
+ @Column(name="ADMIN_LAST_NAME")
+ private String lastName;
+
+ @ManyToOne(fetch = FetchType.LAZY, targetEntity = Language.class)
+ @JoinColumn(name = "LANGUAGE_ID")
+ private Language defaultLanguage;
+
+
+ @Column(name="ADMIN_Q1")
+ private String question1;
+
+ @Column(name="ADMIN_Q2")
+ private String question2;
+
+ @Column(name="ADMIN_Q3")
+ private String question3;
+
+ @Column(name="ADMIN_A1")
+ private String answer1;
+
+ @Column(name="ADMIN_A2")
+ private String answer2;
+
+ @Column(name="ADMIN_A3")
+ private String answer3;
+
+ @Embedded
+ private AuditSection auditSection = new AuditSection();
+
+ @Temporal(TemporalType.TIMESTAMP)
+ @Column(name = "LAST_ACCESS")
+ private Date lastAccess;
+
+ @Temporal(TemporalType.TIMESTAMP)
+ @Column(name = "LOGIN_ACCESS")
+ private Date loginTime;
+
+ @Override
+ public Long getId() {
+ return this.id;
+ }
+
+ @Override
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ @Override
+ public AuditSection getAuditSection() {
+ return auditSection;
+ }
+
+ @Override
+ public void setAuditSection(AuditSection audit) {
+ auditSection = audit;
+
+ }
+
+ public String getAdminName() {
+ return adminName;
+ }
+
+ public void setAdminName(String adminName) {
+ this.adminName = adminName;
+ }
+
+ public String getAdminEmail() {
+ return adminEmail;
+ }
+
+ public void setAdminEmail(String adminEmail) {
+ this.adminEmail = adminEmail;
+ }
+
+ public String getAdminPassword() {
+ return adminPassword;
+ }
+
+ public void setAdminPassword(String adminPassword) {
+ this.adminPassword = adminPassword;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public Language getDefaultLanguage() {
+ return defaultLanguage;
+ }
+
+ public void setDefaultLanguage(Language defaultLanguage) {
+ this.defaultLanguage = defaultLanguage;
+ }
+
+ public String getQuestion1() {
+ return question1;
+ }
+
+ public void setQuestion1(String question1) {
+ this.question1 = question1;
+ }
+
+ public String getQuestion2() {
+ return question2;
+ }
+
+ public void setQuestion2(String question2) {
+ this.question2 = question2;
+ }
+
+ public String getQuestion3() {
+ return question3;
+ }
+
+ public void setQuestion3(String question3) {
+ this.question3 = question3;
+ }
+
+ public String getAnswer1() {
+ return answer1;
+ }
+
+ public void setAnswer1(String answer1) {
+ this.answer1 = answer1;
+ }
+
+ public String getAnswer2() {
+ return answer2;
+ }
+
+ public void setAnswer2(String answer2) {
+ this.answer2 = answer2;
+ }
+
+ public String getAnswer3() {
+ return answer3;
+ }
+
+ public void setAnswer3(String answer3) {
+ this.answer3 = answer3;
+ }
+
+ public void setGroups(List<Group> groups) {
+ this.groups = groups;
+ }
+
+ public List<Group> getGroups() {
+ return groups;
+ }
+
+ public MerchantStore getMerchantStore() {
+ return merchantStore;
+ }
+
+ public void setMerchantStore(MerchantStore merchantStore) {
+ this.merchantStore = merchantStore;
+ }
+
+ public void setActive(boolean active) {
+ this.active = active;
+ }
+
+ public boolean isActive() {
+ return active;
+ }
+
+ public void setLastAccess(Date lastAccess) {
+ this.lastAccess = lastAccess;
+ }
+
+ public Date getLastAccess() {
+ return lastAccess;
+ }
+
+ public void setLoginTime(Date loginTime) {
+ this.loginTime = loginTime;
+ }
+
+ public Date getLoginTime() {
+ return loginTime;
+ }
+
+
+}
sm-core-modules/.classpath 54(+27 -27)
diff --git a/sm-core-modules/.classpath b/sm-core-modules/.classpath
index 9dd5796..d6c4436 100644
--- a/sm-core-modules/.classpath
+++ b/sm-core-modules/.classpath
@@ -1,27 +1,27 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="src" output="target/classes" path="src/main/java">
- <attributes>
- <attribute name="optional" value="true"/>
- <attribute name="maven.pomderived" value="true"/>
- </attributes>
- </classpathentry>
- <classpathentry kind="src" output="target/test-classes" path="src/test/java">
- <attributes>
- <attribute name="optional" value="true"/>
- <attribute name="maven.pomderived" value="true"/>
- </attributes>
- </classpathentry>
- <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
- <attributes>
- <attribute name="maven.pomderived" value="true"/>
- <attribute name="org.eclipse.jst.component.nondependency" value=""/>
- </attributes>
- </classpathentry>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
- <attributes>
- <attribute name="maven.pomderived" value="true"/>
- </attributes>
- </classpathentry>
- <classpathentry kind="output" path="target/classes"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" output="target/classes" path="src/main/java">
+ <attributes>
+ <attribute name="optional" value="true"/>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="src" output="target/test-classes" path="src/test/java">
+ <attributes>
+ <attribute name="optional" value="true"/>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+ <attributes>
+ <attribute name="maven.pomderived" value="true"/>
+ <attribute name="org.eclipse.jst.component.nondependency" value=""/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
+ <attributes>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="output" path="target/classes"/>
+</classpath>
sm-core-modules/.gitignore 1(+1 -0)
diff --git a/sm-core-modules/.gitignore b/sm-core-modules/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/sm-core-modules/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/sm-core-modules/.settings/org.eclipse.core.resources.prefs b/sm-core-modules/.settings/org.eclipse.core.resources.prefs
index 4c28b1a..f9fe345 100644
--- a/sm-core-modules/.settings/org.eclipse.core.resources.prefs
+++ b/sm-core-modules/.settings/org.eclipse.core.resources.prefs
@@ -1,4 +1,4 @@
-eclipse.preferences.version=1
-encoding//src/main/java=UTF-8
-encoding//src/test/java=UTF-8
-encoding/<project>=UTF-8
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
+encoding//src/test/java=UTF-8
+encoding/<project>=UTF-8
diff --git a/sm-core-modules/.settings/org.eclipse.jdt.core.prefs b/sm-core-modules/.settings/org.eclipse.jdt.core.prefs
index 1ab2bb5..6e80039 100644
--- a/sm-core-modules/.settings/org.eclipse.jdt.core.prefs
+++ b/sm-core-modules/.settings/org.eclipse.jdt.core.prefs
@@ -1,8 +1,8 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.source=1.8
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/sm-core-modules/.settings/org.eclipse.m2e.core.prefs b/sm-core-modules/.settings/org.eclipse.m2e.core.prefs
index 14b697b..f897a7f 100644
--- a/sm-core-modules/.settings/org.eclipse.m2e.core.prefs
+++ b/sm-core-modules/.settings/org.eclipse.m2e.core.prefs
@@ -1,4 +1,4 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
sm-core-modules/pom.xml 2(+1 -1)
diff --git a/sm-core-modules/pom.xml b/sm-core-modules/pom.xml
index 7314678..bf2da08 100644
--- a/sm-core-modules/pom.xml
+++ b/sm-core-modules/pom.xml
@@ -6,7 +6,7 @@
<parent>
<groupId>com.shopizer</groupId>
<artifactId>shopizer</artifactId>
- <version>2.0.5-SNAPSHOT</version>
+ <version>2.2.0-SNAPSHOT</version>
</parent>
<artifactId>sm-core-modules</artifactId>
diff --git a/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/IntegrationException.java b/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/IntegrationException.java
index b660035..5d5e157 100644
--- a/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/IntegrationException.java
+++ b/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/IntegrationException.java
@@ -1,61 +1,61 @@
-package com.salesmanager.core.modules.integration;
-
-import java.util.List;
-
-import com.salesmanager.core.business.exception.ServiceException;
-
-public class IntegrationException extends ServiceException {
-
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- public static final int ERROR_VALIDATION_SAVE = 100;
- public static final int TRANSACTION_EXCEPTION = 99;
-
- private List<String> errorFields;
-
- private int errorCode = 0;
-
- public int getErrorCode() {
- return errorCode;
- }
-
- public void setErrorCode(int errorCode) {
- this.errorCode = errorCode;
- }
-
- public IntegrationException(Exception e) {
- super(e);
- }
-
- public IntegrationException(String message, Exception e) {
- super(message,e);
- }
-
- public IntegrationException(int code, String message) {
-
- super(message);
- this.errorCode = code;
- }
-
- public IntegrationException(int code) {
-
- this.errorCode = code;
- }
-
- public IntegrationException(String message) {
- super(message);
- }
-
- public void setErrorFields(List<String> errorFields) {
- this.errorFields = errorFields;
- }
-
- public List<String> getErrorFields() {
- return errorFields;
- }
-
-}
+package com.salesmanager.core.modules.integration;
+
+import java.util.List;
+
+import com.salesmanager.core.business.exception.ServiceException;
+
+public class IntegrationException extends ServiceException {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public static final int ERROR_VALIDATION_SAVE = 100;
+ public static final int TRANSACTION_EXCEPTION = 99;
+
+ private List<String> errorFields;
+
+ private int errorCode = 0;
+
+ public int getErrorCode() {
+ return errorCode;
+ }
+
+ public void setErrorCode(int errorCode) {
+ this.errorCode = errorCode;
+ }
+
+ public IntegrationException(Exception e) {
+ super(e);
+ }
+
+ public IntegrationException(String message, Exception e) {
+ super(message,e);
+ }
+
+ public IntegrationException(int code, String message) {
+
+ super(message);
+ this.errorCode = code;
+ }
+
+ public IntegrationException(int code) {
+
+ this.errorCode = code;
+ }
+
+ public IntegrationException(String message) {
+ super(message);
+ }
+
+ public void setErrorFields(List<String> errorFields) {
+ this.errorFields = errorFields;
+ }
+
+ public List<String> getErrorFields() {
+ return errorFields;
+ }
+
+}
diff --git a/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/payment/model/PaymentModule.java b/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/payment/model/PaymentModule.java
index cf2a5d9..ecb3832 100644
--- a/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/payment/model/PaymentModule.java
+++ b/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/payment/model/PaymentModule.java
@@ -1,49 +1,54 @@
-package com.salesmanager.core.modules.integration.payment.model;
-
-import java.math.BigDecimal;
-import java.util.List;
-
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.Order;
-import com.salesmanager.core.model.payments.Payment;
-import com.salesmanager.core.model.payments.Transaction;
-import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
-import com.salesmanager.core.model.system.IntegrationConfiguration;
-import com.salesmanager.core.model.system.IntegrationModule;
-import com.salesmanager.core.modules.integration.IntegrationException;
-
-public interface PaymentModule {
-
- public void validateModuleConfiguration(IntegrationConfiguration integrationConfiguration, MerchantStore store) throws IntegrationException;
-
- /**
- * Returns token-value related to the initialization of the transaction This
- * method is invoked for paypal express checkout
- * @param customer
- * @param order
- * @return
- * @throws IntegrationException
- */
- public Transaction initTransaction(
- MerchantStore store, Customer customer, BigDecimal amount, Payment payment, IntegrationConfiguration configuration, IntegrationModule module)
- throws IntegrationException;
-
- public Transaction authorize(
- MerchantStore store, Customer customer, List<ShoppingCartItem> items, BigDecimal amount, Payment payment, IntegrationConfiguration configuration, IntegrationModule module)
- throws IntegrationException;
-
-
- public Transaction capture(
- MerchantStore store, Customer customer, Order order, Transaction capturableTransaction, IntegrationConfiguration configuration, IntegrationModule module)
- throws IntegrationException;
-
- public Transaction authorizeAndCapture(
- MerchantStore store, Customer customer, List<ShoppingCartItem> items, BigDecimal amount, Payment payment, IntegrationConfiguration configuration, IntegrationModule module)
- throws IntegrationException;
-
- public Transaction refund(
- boolean partial, MerchantStore store, Transaction transaction, Order order, BigDecimal amount, IntegrationConfiguration configuration, IntegrationModule module)
- throws IntegrationException;
-
-}
+package com.salesmanager.core.modules.integration.payment.model;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.payments.Payment;
+import com.salesmanager.core.model.payments.Transaction;
+import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
+import com.salesmanager.core.model.system.IntegrationConfiguration;
+import com.salesmanager.core.model.system.IntegrationModule;
+import com.salesmanager.core.modules.integration.IntegrationException;
+
+public interface PaymentModule {
+
+ public void validateModuleConfiguration(IntegrationConfiguration integrationConfiguration, MerchantStore store) throws IntegrationException;
+
+
+ /**
+ * Returns token-value related to the initialization of the transaction This
+ * method is invoked for paypal express checkout
+ * @param store MerchantStore
+ * @param customer Customer
+ * @param amount BigDecimal
+ * @param payment Payment
+ * @param configuration IntegrationConfiguration
+ * @param module IntegrationModule
+ * @return Transaction a Transaction
+ * @throws IntegrationException IntegrationException
+ */
+ public Transaction initTransaction(
+ MerchantStore store, Customer customer, BigDecimal amount, Payment payment, IntegrationConfiguration configuration, IntegrationModule module)
+ throws IntegrationException;
+
+ public Transaction authorize(
+ MerchantStore store, Customer customer, List<ShoppingCartItem> items, BigDecimal amount, Payment payment, IntegrationConfiguration configuration, IntegrationModule module)
+ throws IntegrationException;
+
+
+ public Transaction capture(
+ MerchantStore store, Customer customer, Order order, Transaction capturableTransaction, IntegrationConfiguration configuration, IntegrationModule module)
+ throws IntegrationException;
+
+ public Transaction authorizeAndCapture(
+ MerchantStore store, Customer customer, List<ShoppingCartItem> items, BigDecimal amount, Payment payment, IntegrationConfiguration configuration, IntegrationModule module)
+ throws IntegrationException;
+
+ public Transaction refund(
+ boolean partial, MerchantStore store, Transaction transaction, Order order, BigDecimal amount, IntegrationConfiguration configuration, IntegrationModule module)
+ throws IntegrationException;
+
+}
diff --git a/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/CustomShippingQuoteItem.java b/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/CustomShippingQuoteItem.java
index 4881db7..5f5e5a7 100644
--- a/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/CustomShippingQuoteItem.java
+++ b/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/CustomShippingQuoteItem.java
@@ -1,22 +1,22 @@
-package com.salesmanager.core.modules.integration.shipping.model;
-
-import java.math.BigDecimal;
-
-public abstract class CustomShippingQuoteItem {
-
- private String priceText;
- private BigDecimal price;
- public void setPriceText(String priceText) {
- this.priceText = priceText;
- }
- public String getPriceText() {
- return priceText;
- }
- public void setPrice(BigDecimal price) {
- this.price = price;
- }
- public BigDecimal getPrice() {
- return price;
- }
-
-}
+package com.salesmanager.core.modules.integration.shipping.model;
+
+import java.math.BigDecimal;
+
+public abstract class CustomShippingQuoteItem {
+
+ private String priceText;
+ private BigDecimal price;
+ public void setPriceText(String priceText) {
+ this.priceText = priceText;
+ }
+ public String getPriceText() {
+ return priceText;
+ }
+ public void setPrice(BigDecimal price) {
+ this.price = price;
+ }
+ public BigDecimal getPrice() {
+ return price;
+ }
+
+}
diff --git a/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/CustomShippingQuotesConfiguration.java b/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/CustomShippingQuotesConfiguration.java
index 254ab3b..3b9b4b2 100644
--- a/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/CustomShippingQuotesConfiguration.java
+++ b/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/CustomShippingQuotesConfiguration.java
@@ -1,85 +1,85 @@
-package com.salesmanager.core.modules.integration.shipping.model;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-import com.salesmanager.core.model.system.CustomIntegrationConfiguration;
-import com.salesmanager.core.model.system.IntegrationConfiguration;
-
-public class CustomShippingQuotesConfiguration extends IntegrationConfiguration implements CustomIntegrationConfiguration, Serializable {
-
- /**
- *
- */
- private String moduleCode;
-
- private List<CustomShippingQuotesRegion> regions = new ArrayList<CustomShippingQuotesRegion>();
-
-
- private static final long serialVersionUID = 1L;
-
-
- @SuppressWarnings("unchecked")
- public String toJSONString() {
- //JSONObject data = new JSONObject();
-
- //data.put("active", super.isActive());
- //data.put("moduleCode", this.getModuleCode());
-
-
- StringBuilder returnString = new StringBuilder();
- returnString.append("{");
- returnString.append("\"moduleCode\"").append(":\"").append(this.getModuleCode()).append("\"");
- returnString.append(",");
- returnString.append("\"active\"").append(":").append(this.isActive());
-
-
-
- if(regions!=null && regions.size()>0) {
-
- returnString.append(",");
- //org.json.simple.JSONArray array=new org.json.simple.JSONArray();
- StringBuilder regionsList = new StringBuilder();
- int countRegion = 0;
- regionsList.append("[");
- for(CustomShippingQuotesRegion region : regions) {
- regionsList.append(region.toJSONString());
- countRegion ++;
- if(countRegion<regions.size()) {
- regionsList.append(",");
- }
- }
- regionsList.append("]");
- returnString.append("\"regions\"").append(":").append(regionsList.toString());
- }
-
- //return data.toJSONString();
- returnString.append("}");
- return returnString.toString();
-
-
-
-
- }
-
- @Override
- public String getModuleCode() {
- return moduleCode;
- }
-
- @Override
- public void setModuleCode(String moduleCode) {
- this.moduleCode = moduleCode;
-
- }
-
- public void setRegions(List<CustomShippingQuotesRegion> regions) {
- this.regions = regions;
- }
-
- public List<CustomShippingQuotesRegion> getRegions() {
- return regions;
- }
-
-}
+package com.salesmanager.core.modules.integration.shipping.model;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.salesmanager.core.model.system.CustomIntegrationConfiguration;
+import com.salesmanager.core.model.system.IntegrationConfiguration;
+
+public class CustomShippingQuotesConfiguration extends IntegrationConfiguration implements CustomIntegrationConfiguration, Serializable {
+
+ /**
+ *
+ */
+ private String moduleCode;
+
+ private List<CustomShippingQuotesRegion> regions = new ArrayList<CustomShippingQuotesRegion>();
+
+
+ private static final long serialVersionUID = 1L;
+
+
+ @SuppressWarnings("unchecked")
+ public String toJSONString() {
+ //JSONObject data = new JSONObject();
+
+ //data.put("active", super.isActive());
+ //data.put("moduleCode", this.getModuleCode());
+
+
+ StringBuilder returnString = new StringBuilder();
+ returnString.append("{");
+ returnString.append("\"moduleCode\"").append(":\"").append(this.getModuleCode()).append("\"");
+ returnString.append(",");
+ returnString.append("\"active\"").append(":").append(this.isActive());
+
+
+
+ if(regions!=null && regions.size()>0) {
+
+ returnString.append(",");
+ //org.json.simple.JSONArray array=new org.json.simple.JSONArray();
+ StringBuilder regionsList = new StringBuilder();
+ int countRegion = 0;
+ regionsList.append("[");
+ for(CustomShippingQuotesRegion region : regions) {
+ regionsList.append(region.toJSONString());
+ countRegion ++;
+ if(countRegion<regions.size()) {
+ regionsList.append(",");
+ }
+ }
+ regionsList.append("]");
+ returnString.append("\"regions\"").append(":").append(regionsList.toString());
+ }
+
+ //return data.toJSONString();
+ returnString.append("}");
+ return returnString.toString();
+
+
+
+
+ }
+
+ @Override
+ public String getModuleCode() {
+ return moduleCode;
+ }
+
+ @Override
+ public void setModuleCode(String moduleCode) {
+ this.moduleCode = moduleCode;
+
+ }
+
+ public void setRegions(List<CustomShippingQuotesRegion> regions) {
+ this.regions = regions;
+ }
+
+ public List<CustomShippingQuotesRegion> getRegions() {
+ return regions;
+ }
+
+}
diff --git a/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/CustomShippingQuotesRegion.java b/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/CustomShippingQuotesRegion.java
index c37f279..2000797 100644
--- a/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/CustomShippingQuotesRegion.java
+++ b/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/CustomShippingQuotesRegion.java
@@ -1,88 +1,88 @@
-package com.salesmanager.core.modules.integration.shipping.model;
-
-import java.util.List;
-
-import org.json.simple.JSONAware;
-
-public class CustomShippingQuotesRegion implements JSONAware {
-
- private String customRegionName;//a name given by the merchant for this custom region
- private List<String> countries;//a list of country code for this region
-
- private List<CustomShippingQuoteWeightItem> quoteItems;//price max weight
-
- public void setQuoteItems(List<CustomShippingQuoteWeightItem> quoteItems) {
- this.quoteItems = quoteItems;
- }
-
- public List<CustomShippingQuoteWeightItem> getQuoteItems() {
- return quoteItems;
- }
-
- public void setCountries(List<String> countries) {
- this.countries = countries;
- }
-
- public List<String> getCountries() {
- return countries;
- }
-
- public void setCustomRegionName(String customRegionName) {
- this.customRegionName = customRegionName;
- }
-
- public String getCustomRegionName() {
- return customRegionName;
- }
-
-
- public String toJSONString() {
-
-
- StringBuilder returnString = new StringBuilder();
- returnString.append("{");
- returnString.append("\"customRegionName\"").append(":\"").append(this.getCustomRegionName()).append("\"");
-
-
-
- if(countries!=null) {
- returnString.append(",");
- StringBuilder coutriesList = new StringBuilder();
- int countCountry = 0;
- coutriesList.append("[");
- for(String country : countries) {
- coutriesList.append("\"").append(country).append("\"");
- countCountry ++;
- if(countCountry<countries.size()) {
- coutriesList.append(",");
- }
- }
-
- coutriesList.append("]");
- returnString.append("\"countries\"").append(":").append(coutriesList.toString());
- }
-
- if(quoteItems!=null) {
- returnString.append(",");
- StringBuilder quotesList = new StringBuilder();
- int countQuotes = 0;
- quotesList.append("[");
- for(CustomShippingQuoteWeightItem quote : quoteItems) {
- quotesList.append(quote.toJSONString());
- countQuotes ++;
- if(countQuotes<quoteItems.size()) {
- quotesList.append(",");
- }
- }
- quotesList.append("]");
-
- returnString.append("\"quoteItems\"").append(":").append(quotesList.toString());
- }
- returnString.append("}");
- return returnString.toString();
-
-
- }
-
-
-}
+package com.salesmanager.core.modules.integration.shipping.model;
+
+import java.util.List;
+
+import org.json.simple.JSONAware;
+
+public class CustomShippingQuotesRegion implements JSONAware {
+
+ private String customRegionName;//a name given by the merchant for this custom region
+ private List<String> countries;//a list of country code for this region
+
+ private List<CustomShippingQuoteWeightItem> quoteItems;//price max weight
+
+ public void setQuoteItems(List<CustomShippingQuoteWeightItem> quoteItems) {
+ this.quoteItems = quoteItems;
+ }
+
+ public List<CustomShippingQuoteWeightItem> getQuoteItems() {
+ return quoteItems;
+ }
+
+ public void setCountries(List<String> countries) {
+ this.countries = countries;
+ }
+
+ public List<String> getCountries() {
+ return countries;
+ }
+
+ public void setCustomRegionName(String customRegionName) {
+ this.customRegionName = customRegionName;
+ }
+
+ public String getCustomRegionName() {
+ return customRegionName;
+ }
+
+
+ public String toJSONString() {
+
+
+ StringBuilder returnString = new StringBuilder();
+ returnString.append("{");
+ returnString.append("\"customRegionName\"").append(":\"").append(this.getCustomRegionName()).append("\"");
+
+
+
+ if(countries!=null) {
+ returnString.append(",");
+ StringBuilder coutriesList = new StringBuilder();
+ int countCountry = 0;
+ coutriesList.append("[");
+ for(String country : countries) {
+ coutriesList.append("\"").append(country).append("\"");
+ countCountry ++;
+ if(countCountry<countries.size()) {
+ coutriesList.append(",");
+ }
+ }
+
+ coutriesList.append("]");
+ returnString.append("\"countries\"").append(":").append(coutriesList.toString());
+ }
+
+ if(quoteItems!=null) {
+ returnString.append(",");
+ StringBuilder quotesList = new StringBuilder();
+ int countQuotes = 0;
+ quotesList.append("[");
+ for(CustomShippingQuoteWeightItem quote : quoteItems) {
+ quotesList.append(quote.toJSONString());
+ countQuotes ++;
+ if(countQuotes<quoteItems.size()) {
+ quotesList.append(",");
+ }
+ }
+ quotesList.append("]");
+
+ returnString.append("\"quoteItems\"").append(":").append(quotesList.toString());
+ }
+ returnString.append("}");
+ return returnString.toString();
+
+
+ }
+
+
+}
diff --git a/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/CustomShippingQuoteWeightItem.java b/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/CustomShippingQuoteWeightItem.java
index 56140bd..d9f0bf9 100644
--- a/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/CustomShippingQuoteWeightItem.java
+++ b/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/CustomShippingQuoteWeightItem.java
@@ -1,39 +1,39 @@
-package com.salesmanager.core.modules.integration.shipping.model;
-
-import org.json.simple.JSONAware;
-import org.json.simple.JSONObject;
-
-public class CustomShippingQuoteWeightItem extends CustomShippingQuoteItem implements JSONAware {
-
- private int maximumWeight;
-
- private String priceText;
-
- public String getPriceText() {
- return priceText;
- }
-
- public void setPriceText(String priceText) {
- this.priceText = priceText;
- }
-
- public void setMaximumWeight(int maximumWeight) {
- this.maximumWeight = maximumWeight;
- }
-
- public int getMaximumWeight() {
- return maximumWeight;
- }
-
- @SuppressWarnings("unchecked")
- public String toJSONString() {
- JSONObject data = new JSONObject();
- data.put("price", super.getPrice());
- data.put("maximumWeight", this.getMaximumWeight());
-
- return data.toJSONString();
- }
-
-
-
-}
+package com.salesmanager.core.modules.integration.shipping.model;
+
+import org.json.simple.JSONAware;
+import org.json.simple.JSONObject;
+
+public class CustomShippingQuoteWeightItem extends CustomShippingQuoteItem implements JSONAware {
+
+ private int maximumWeight;
+
+ private String priceText;
+
+ public String getPriceText() {
+ return priceText;
+ }
+
+ public void setPriceText(String priceText) {
+ this.priceText = priceText;
+ }
+
+ public void setMaximumWeight(int maximumWeight) {
+ this.maximumWeight = maximumWeight;
+ }
+
+ public int getMaximumWeight() {
+ return maximumWeight;
+ }
+
+ @SuppressWarnings("unchecked")
+ public String toJSONString() {
+ JSONObject data = new JSONObject();
+ data.put("price", super.getPrice());
+ data.put("maximumWeight", this.getMaximumWeight());
+
+ return data.toJSONString();
+ }
+
+
+
+}
diff --git a/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/Packaging.java b/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/Packaging.java
index f4629cf..e2aa48c 100644
--- a/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/Packaging.java
+++ b/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/Packaging.java
@@ -1,18 +1,18 @@
-package com.salesmanager.core.modules.integration.shipping.model;
-
-import java.util.List;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.shipping.PackageDetails;
-import com.salesmanager.core.model.shipping.ShippingProduct;
-
-public interface Packaging {
-
- public List<PackageDetails> getBoxPackagesDetails(
- List<ShippingProduct> products, MerchantStore store) throws ServiceException;
-
- public List<PackageDetails> getItemPackagesDetails(
- List<ShippingProduct> products, MerchantStore store) throws ServiceException;
-
-}
+package com.salesmanager.core.modules.integration.shipping.model;
+
+import java.util.List;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.shipping.PackageDetails;
+import com.salesmanager.core.model.shipping.ShippingProduct;
+
+public interface Packaging {
+
+ public List<PackageDetails> getBoxPackagesDetails(
+ List<ShippingProduct> products, MerchantStore store) throws ServiceException;
+
+ public List<PackageDetails> getItemPackagesDetails(
+ List<ShippingProduct> products, MerchantStore store) throws ServiceException;
+
+}
diff --git a/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/ShippingQuoteModule.java b/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/ShippingQuoteModule.java
index 3931e06..aa59c3c 100644
--- a/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/ShippingQuoteModule.java
+++ b/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/ShippingQuoteModule.java
@@ -1,26 +1,26 @@
-package com.salesmanager.core.modules.integration.shipping.model;
-
-import java.math.BigDecimal;
-import java.util.List;
-import java.util.Locale;
-
-import com.salesmanager.core.model.common.Delivery;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.shipping.PackageDetails;
-import com.salesmanager.core.model.shipping.ShippingConfiguration;
-import com.salesmanager.core.model.shipping.ShippingOption;
-import com.salesmanager.core.model.shipping.ShippingOrigin;
-import com.salesmanager.core.model.shipping.ShippingQuote;
-import com.salesmanager.core.model.system.CustomIntegrationConfiguration;
-import com.salesmanager.core.model.system.IntegrationConfiguration;
-import com.salesmanager.core.model.system.IntegrationModule;
-import com.salesmanager.core.modules.integration.IntegrationException;
-
-public interface ShippingQuoteModule {
-
- public void validateModuleConfiguration(IntegrationConfiguration integrationConfiguration, MerchantStore store) throws IntegrationException;
- public CustomIntegrationConfiguration getCustomModuleConfiguration(MerchantStore store) throws IntegrationException;
-
- public List<ShippingOption> getShippingQuotes(ShippingQuote quote, List<PackageDetails> packages, BigDecimal orderTotal, Delivery delivery, ShippingOrigin origin, MerchantStore store, IntegrationConfiguration configuration, IntegrationModule module, ShippingConfiguration shippingConfiguration, Locale locale) throws IntegrationException;
-
-}
+package com.salesmanager.core.modules.integration.shipping.model;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Locale;
+
+import com.salesmanager.core.model.common.Delivery;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.shipping.PackageDetails;
+import com.salesmanager.core.model.shipping.ShippingConfiguration;
+import com.salesmanager.core.model.shipping.ShippingOption;
+import com.salesmanager.core.model.shipping.ShippingOrigin;
+import com.salesmanager.core.model.shipping.ShippingQuote;
+import com.salesmanager.core.model.system.CustomIntegrationConfiguration;
+import com.salesmanager.core.model.system.IntegrationConfiguration;
+import com.salesmanager.core.model.system.IntegrationModule;
+import com.salesmanager.core.modules.integration.IntegrationException;
+
+public interface ShippingQuoteModule {
+
+ public void validateModuleConfiguration(IntegrationConfiguration integrationConfiguration, MerchantStore store) throws IntegrationException;
+ public CustomIntegrationConfiguration getCustomModuleConfiguration(MerchantStore store) throws IntegrationException;
+
+ public List<ShippingOption> getShippingQuotes(ShippingQuote quote, List<PackageDetails> packages, BigDecimal orderTotal, Delivery delivery, ShippingOrigin origin, MerchantStore store, IntegrationConfiguration configuration, IntegrationModule module, ShippingConfiguration shippingConfiguration, Locale locale) throws IntegrationException;
+
+}
diff --git a/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/ShippingQuotePrePostProcessModule.java b/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/ShippingQuotePrePostProcessModule.java
index 68608f4..3fd1acd 100644
--- a/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/ShippingQuotePrePostProcessModule.java
+++ b/sm-core-modules/src/main/java/com/salesmanager/core/modules/integration/shipping/model/ShippingQuotePrePostProcessModule.java
@@ -1,40 +1,40 @@
-package com.salesmanager.core.modules.integration.shipping.model;
-
-import java.math.BigDecimal;
-import java.util.List;
-import java.util.Locale;
-
-import com.salesmanager.core.model.common.Delivery;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.shipping.PackageDetails;
-import com.salesmanager.core.model.shipping.ShippingConfiguration;
-import com.salesmanager.core.model.shipping.ShippingOrigin;
-import com.salesmanager.core.model.shipping.ShippingQuote;
-import com.salesmanager.core.model.system.IntegrationConfiguration;
-import com.salesmanager.core.model.system.IntegrationModule;
-import com.salesmanager.core.modules.integration.IntegrationException;
-
-/**
- * Invoked before or after quote processing
- * @author carlsamson
- *
- */
-public interface ShippingQuotePrePostProcessModule {
-
-
- public String getModuleCode();
-
-
- public void prePostProcessShippingQuotes(
- ShippingQuote quote,
- List<PackageDetails> packages,
- BigDecimal orderTotal,
- Delivery delivery,
- ShippingOrigin origin,
- MerchantStore store,
- IntegrationConfiguration globalShippingConfiguration,
- IntegrationModule currentModule,
- ShippingConfiguration shippingConfiguration,
- List<IntegrationModule> allModules, Locale locale) throws IntegrationException;
-
-}
+package com.salesmanager.core.modules.integration.shipping.model;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Locale;
+
+import com.salesmanager.core.model.common.Delivery;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.shipping.PackageDetails;
+import com.salesmanager.core.model.shipping.ShippingConfiguration;
+import com.salesmanager.core.model.shipping.ShippingOrigin;
+import com.salesmanager.core.model.shipping.ShippingQuote;
+import com.salesmanager.core.model.system.IntegrationConfiguration;
+import com.salesmanager.core.model.system.IntegrationModule;
+import com.salesmanager.core.modules.integration.IntegrationException;
+
+/**
+ * Invoked before or after quote processing
+ * @author carlsamson
+ *
+ */
+public interface ShippingQuotePrePostProcessModule {
+
+
+ public String getModuleCode();
+
+
+ public void prePostProcessShippingQuotes(
+ ShippingQuote quote,
+ List<PackageDetails> packages,
+ BigDecimal orderTotal,
+ Delivery delivery,
+ ShippingOrigin origin,
+ MerchantStore store,
+ IntegrationConfiguration globalShippingConfiguration,
+ IntegrationModule currentModule,
+ ShippingConfiguration shippingConfiguration,
+ List<IntegrationModule> allModules, Locale locale) throws IntegrationException;
+
+}
diff --git a/sm-core-modules/src/main/java/com/salesmanager/core/modules/order/total/OrderTotalPostProcessorModule.java b/sm-core-modules/src/main/java/com/salesmanager/core/modules/order/total/OrderTotalPostProcessorModule.java
index 0a3c699..8f0deb5 100644
--- a/sm-core-modules/src/main/java/com/salesmanager/core/modules/order/total/OrderTotalPostProcessorModule.java
+++ b/sm-core-modules/src/main/java/com/salesmanager/core/modules/order/total/OrderTotalPostProcessorModule.java
@@ -21,13 +21,13 @@ public interface OrderTotalPostProcessorModule extends Module {
/**
* Uses the OrderSummary and external tools for applying if necessary
* variations on the OrderTotal calculation.
- * @param orderSummary
- * @param shoppingCartItem
- * @param product
- * @param customer
- * @param store
- * @return
- * @throws Exception
+ * @param summary OrderSummary
+ * @param shoppingCartItem ShoppingCartItem
+ * @param product Product
+ * @param customer Customer
+ * @param store MerchantStore
+ * @return OrderTotal OrderTotal
+ * @throws Exception Exception
*/
OrderTotal caculateProductPiceVariation(final OrderSummary summary, final ShoppingCartItem shoppingCartItem, final Product product, final Customer customer, final MerchantStore store) throws Exception;
diff --git a/sm-core-modules/src/main/java/com/salesmanager/core/modules/utils/Encryption.java b/sm-core-modules/src/main/java/com/salesmanager/core/modules/utils/Encryption.java
index e665d8c..5859796 100644
--- a/sm-core-modules/src/main/java/com/salesmanager/core/modules/utils/Encryption.java
+++ b/sm-core-modules/src/main/java/com/salesmanager/core/modules/utils/Encryption.java
@@ -1,30 +1,28 @@
-package com.salesmanager.core.modules.utils;
-
-/**
- * Can be used to encrypt block or information that has to
- * be maintained secret
- * @author Carl Samson
- *
- */
-public interface Encryption {
-
-
- /**
- * Encrypts a string value
- * @param key
- * @param value
- * @return
- * @throws Exception
- */
- public String encrypt(String value) throws Exception;
-
- /**
- * Decrypts a string value
- * @param key
- * @param value
- * @return
- * @throws Exception
- */
- public String decrypt(String value) throws Exception;
-
-}
+package com.salesmanager.core.modules.utils;
+
+/**
+ * Can be used to encrypt block or information that has to
+ * be maintained secret
+ * @author Carl Samson
+ *
+ */
+public interface Encryption {
+
+
+ /**
+ * Encrypts a string value
+ * @param value VALUE
+ * @return String encrypted string
+ * @throws Exception cannot encrypt
+ */
+ public String encrypt(String value) throws Exception;
+
+ /**
+ * Decrypts a string value
+ * @param value VLUE
+ * @return String encrypted string
+ * @throws Exception cannot encrypt
+ */
+ public String decrypt(String value) throws Exception;
+
+}
sm-shop/.classpath 72(+36 -36)
diff --git a/sm-shop/.classpath b/sm-shop/.classpath
index fc5f96c..ace8266 100644
--- a/sm-shop/.classpath
+++ b/sm-shop/.classpath
@@ -1,36 +1,36 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="src" output="target/classes" path="src/main/java">
- <attributes>
- <attribute name="optional" value="true"/>
- <attribute name="maven.pomderived" value="true"/>
- </attributes>
- </classpathentry>
- <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
- <attributes>
- <attribute name="maven.pomderived" value="true"/>
- </attributes>
- </classpathentry>
- <classpathentry kind="src" output="target/test-classes" path="src/test/java">
- <attributes>
- <attribute name="optional" value="true"/>
- <attribute name="maven.pomderived" value="true"/>
- </attributes>
- </classpathentry>
- <classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
- <attributes>
- <attribute name="maven.pomderived" value="true"/>
- </attributes>
- </classpathentry>
- <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
- <attributes>
- <attribute name="maven.pomderived" value="true"/>
- </attributes>
- </classpathentry>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
- <attributes>
- <attribute name="maven.pomderived" value="true"/>
- </attributes>
- </classpathentry>
- <classpathentry kind="output" path="target/classes"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" output="target/classes" path="src/main/java">
+ <attributes>
+ <attribute name="optional" value="true"/>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
+ <attributes>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="src" output="target/test-classes" path="src/test/java">
+ <attributes>
+ <attribute name="optional" value="true"/>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
+ <attributes>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+ <attributes>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
+ <attributes>
+ <attribute name="maven.pomderived" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="output" path="target/classes"/>
+</classpath>
sm-shop/.gitignore 1(+1 -0)
diff --git a/sm-shop/.gitignore b/sm-shop/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/sm-shop/.gitignore
@@ -0,0 +1 @@
+/target/
sm-shop/.project 82(+41 -41)
diff --git a/sm-shop/.project b/sm-shop/.project
index 9b8d0a6..2cae61d 100644
--- a/sm-shop/.project
+++ b/sm-shop/.project
@@ -1,41 +1,41 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>sm-shop</name>
- <comment></comment>
- <projects>
- <project>sm-core</project>
- <project>sm-core-model</project>
- <project>sm-core-modules</project>
- <project>sm-search</project>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.wst.common.project.facet.core.builder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.wst.validation.validationbuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.m2e.core.maven2Builder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
- <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
- <nature>org.eclipse.jdt.core.javanature</nature>
- <nature>org.eclipse.m2e.core.maven2Nature</nature>
- <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
- <nature>org.eclipse.wst.jsdt.core.jsNature</nature>
- </natures>
-</projectDescription>
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>sm-shop</name>
+ <comment></comment>
+ <projects>
+ <project>sm-core</project>
+ <project>sm-core-model</project>
+ <project>sm-core-modules</project>
+ <project>sm-search</project>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.wst.common.project.facet.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.wst.validation.validationbuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.m2e.core.maven2Builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jem.workbench.JavaEMFNature</nature>
+ <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ <nature>org.eclipse.m2e.core.maven2Nature</nature>
+ <nature>org.eclipse.wst.common.project.facet.core.nature</nature>
+ <nature>org.eclipse.wst.jsdt.core.jsNature</nature>
+ </natures>
+</projectDescription>
sm-shop/.settings/.jsdtscope 24(+12 -12)
diff --git a/sm-shop/.settings/.jsdtscope b/sm-shop/.settings/.jsdtscope
index e34514d..81672d4 100644
--- a/sm-shop/.settings/.jsdtscope
+++ b/sm-shop/.settings/.jsdtscope
@@ -1,12 +1,12 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry excluding="**/bower_components/*|**/node_modules/*|**/*.min.js" kind="src" path="src/main/webapp"/>
- <classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER"/>
- <classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.WebProject">
- <attributes>
- <attribute name="hide" value="true"/>
- </attributes>
- </classpathentry>
- <classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary"/>
- <classpathentry kind="output" path=""/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry excluding="**/bower_components/*|**/node_modules/*|**/*.min.js" kind="src" path="src/main/webapp"/>
+ <classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.WebProject">
+ <attributes>
+ <attribute name="hide" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.wst.jsdt.launching.baseBrowserLibrary"/>
+ <classpathentry kind="output" path=""/>
+</classpath>
diff --git a/sm-shop/.settings/org.eclipse.core.resources.prefs b/sm-shop/.settings/org.eclipse.core.resources.prefs
index bc0fda7..e201e5e 100644
--- a/sm-shop/.settings/org.eclipse.core.resources.prefs
+++ b/sm-shop/.settings/org.eclipse.core.resources.prefs
@@ -1,10 +1,10 @@
-eclipse.preferences.version=1
-encoding//src/main/java=UTF-8
-encoding//src/main/resources=UTF-8
-encoding//src/main/resources/bundles/messages_fr.properties=UTF-8
-encoding//src/main/resources/bundles/payment_fr.properties=UTF-8
-encoding//src/main/resources/bundles/shipping_fr.properties=UTF-8
-encoding//src/main/resources/bundles/shopizer_fr.properties=UTF-8
-encoding//src/test/java=UTF-8
-encoding//src/test/resources=UTF-8
-encoding/<project>=UTF-8
+eclipse.preferences.version=1
+encoding//src/main/java=UTF-8
+encoding//src/main/resources=UTF-8
+encoding//src/main/resources/bundles/messages_fr.properties=UTF-8
+encoding//src/main/resources/bundles/payment_fr.properties=UTF-8
+encoding//src/main/resources/bundles/shipping_fr.properties=UTF-8
+encoding//src/main/resources/bundles/shopizer_fr.properties=UTF-8
+encoding//src/test/java=UTF-8
+encoding//src/test/resources=UTF-8
+encoding/<project>=UTF-8
sm-shop/.settings/org.eclipse.jdt.core.prefs 21(+13 -8)
diff --git a/sm-shop/.settings/org.eclipse.jdt.core.prefs b/sm-shop/.settings/org.eclipse.jdt.core.prefs
index 1ab2bb5..13b3428 100644
--- a/sm-shop/.settings/org.eclipse.jdt.core.prefs
+++ b/sm-shop/.settings/org.eclipse.jdt.core.prefs
@@ -1,8 +1,13 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
-org.eclipse.jdt.core.compiler.compliance=1.8
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
-org.eclipse.jdt.core.compiler.source=1.8
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/sm-shop/.settings/org.eclipse.m2e.core.prefs b/sm-shop/.settings/org.eclipse.m2e.core.prefs
index 14b697b..f897a7f 100644
--- a/sm-shop/.settings/org.eclipse.m2e.core.prefs
+++ b/sm-shop/.settings/org.eclipse.m2e.core.prefs
@@ -1,4 +1,4 @@
-activeProfiles=
-eclipse.preferences.version=1
-resolveWorkspaceProjects=true
-version=1
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/sm-shop/.settings/org.eclipse.wst.common.component b/sm-shop/.settings/org.eclipse.wst.common.component
index 725eca1..2d860b8 100644
--- a/sm-shop/.settings/org.eclipse.wst.common.component
+++ b/sm-shop/.settings/org.eclipse.wst.common.component
@@ -1,28 +1,19 @@
-<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
- <wb-module deploy-name="sm-shop-2.5.0-SNAPSHOT">
- <wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
- <wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
- <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
- <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
- <dependent-module archiveName="sm-core-2.0.5-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/sm-core/sm-core">
- <dependency-type>uses</dependency-type>
- </dependent-module>
- <dependent-module archiveName="sm-core-modules-2.0.5-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/sm-core-modules/sm-core-modules">
- <dependency-type>uses</dependency-type>
- </dependent-module>
- <dependent-module archiveName="shopizer-shipping-distance-processor-2.0.5-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/shopizer-shipping-distance-processor/shopizer-shipping-distance-processor">
- <dependency-type>uses</dependency-type>
- </dependent-module>
- <dependent-module archiveName="shopizer-shipping-canadapost-module-2.0.5-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/shopizer-canadapost/shopizer-canadapost">
- <dependency-type>uses</dependency-type>
- </dependent-module>
- <dependent-module archiveName="sm-core-model-2.0.5-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/sm-core-model/sm-core-model">
- <dependency-type>uses</dependency-type>
- </dependent-module>
- <dependent-module archiveName="sm-search-2.0.5-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/sm-search/sm-search">
- <dependency-type>uses</dependency-type>
- </dependent-module>
- <property name="context-root" value="sm-shop"/>
- <property name="java-output-path" value="/sm-shop/target/classes"/>
- </wb-module>
-</project-modules>
+<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
+ <wb-module deploy-name="sm-shop-2.5.0-SNAPSHOT">
+ <wb-resource deploy-path="/" source-path="/target/m2e-wtp/web-resources"/>
+ <wb-resource deploy-path="/" source-path="/src/main/webapp" tag="defaultRootSource"/>
+ <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/java"/>
+ <wb-resource deploy-path="/WEB-INF/classes" source-path="/src/main/resources"/>
+ <dependent-module archiveName="sm-core-2.2.0-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/sm-core/sm-core">
+ <dependency-type>uses</dependency-type>
+ </dependent-module>
+ <dependent-module archiveName="sm-core-modules-2.2.0-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/sm-core-modules/sm-core-modules">
+ <dependency-type>uses</dependency-type>
+ </dependent-module>
+ <dependent-module archiveName="sm-core-model-2.2.0-SNAPSHOT.jar" deploy-path="/WEB-INF/lib" handle="module:/resource/sm-core-model/sm-core-model">
+ <dependency-type>uses</dependency-type>
+ </dependent-module>
+ <property name="context-root" value="sm-shop"/>
+ <property name="java-output-path" value="/sm-shop/target/classes"/>
+ </wb-module>
+</project-modules>
diff --git a/sm-shop/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml b/sm-shop/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml
index b01fdb7..cc81385 100644
--- a/sm-shop/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml
+++ b/sm-shop/.settings/org.eclipse.wst.common.project.facet.core.prefs.xml
@@ -1,7 +1,7 @@
-<root>
- <facet id="jst.jaxrs">
- <node name="libprov">
- <attribute name="provider-id" value="jaxrs-no-op-library-provider"/>
- </node>
- </facet>
-</root>
+<root>
+ <facet id="jst.jaxrs">
+ <node name="libprov">
+ <attribute name="provider-id" value="jaxrs-no-op-library-provider"/>
+ </node>
+ </facet>
+</root>
diff --git a/sm-shop/.settings/org.eclipse.wst.common.project.facet.core.xml b/sm-shop/.settings/org.eclipse.wst.common.project.facet.core.xml
index b11c00a..bc52548 100644
--- a/sm-shop/.settings/org.eclipse.wst.common.project.facet.core.xml
+++ b/sm-shop/.settings/org.eclipse.wst.common.project.facet.core.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<faceted-project>
- <fixed facet="wst.jsdt.web"/>
- <installed facet="jst.web" version="3.1"/>
- <installed facet="jst.jaxrs" version="1.1"/>
- <installed facet="wst.jsdt.web" version="1.0"/>
- <installed facet="java" version="1.8"/>
-</faceted-project>
+<?xml version="1.0" encoding="UTF-8"?>
+<faceted-project>
+ <fixed facet="wst.jsdt.web"/>
+ <installed facet="jst.web" version="3.1"/>
+ <installed facet="jst.jaxrs" version="1.1"/>
+ <installed facet="wst.jsdt.web" version="1.0"/>
+ <installed facet="java" version="1.8"/>
+</faceted-project>
diff --git a/sm-shop/.settings/org.eclipse.wst.validation.prefs b/sm-shop/.settings/org.eclipse.wst.validation.prefs
index 95e1df8..648168b 100644
--- a/sm-shop/.settings/org.eclipse.wst.validation.prefs
+++ b/sm-shop/.settings/org.eclipse.wst.validation.prefs
@@ -1,9 +1,9 @@
-DELEGATES_PREFERENCE=delegateValidatorList
-USER_BUILD_PREFERENCE=enabledBuildValidatorListorg.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyValidator;
-USER_MANUAL_PREFERENCE=enabledManualValidatorListorg.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyValidator;
-USER_PREFERENCE=overrideGlobalPreferencestruedisableAllValidationtrueversion1.2.700.v201508251749
-disabled=06target
-eclipse.preferences.version=1
-override=true
-suspend=true
-vf.version=3
+DELEGATES_PREFERENCE=delegateValidatorList
+USER_BUILD_PREFERENCE=enabledBuildValidatorListorg.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyValidator;
+USER_MANUAL_PREFERENCE=enabledManualValidatorListorg.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyValidator;
+USER_PREFERENCE=overrideGlobalPreferencestruedisableAllValidationtrueversion1.2.700.v201508251749
+disabled=06target
+eclipse.preferences.version=1
+override=true
+suspend=true
+vf.version=3
sm-shop/docker-compose.yml 6(+6 -0)
diff --git a/sm-shop/docker-compose.yml b/sm-shop/docker-compose.yml
new file mode 100644
index 0000000..851cf67
--- /dev/null
+++ b/sm-shop/docker-compose.yml
@@ -0,0 +1,6 @@
+version: '2'
+services:
+ app:
+ build: .
+ ports:
+ - "80:8080"
sm-shop/Dockerfile 16(+16 -0)
diff --git a/sm-shop/Dockerfile b/sm-shop/Dockerfile
new file mode 100644
index 0000000..ea7bdac
--- /dev/null
+++ b/sm-shop/Dockerfile
@@ -0,0 +1,16 @@
+FROM tomcat:8.5.15-jre8
+MAINTAINER shopizerecomm
+
+VOLUME /tmp
+
+# Delete existing ROOT folder
+RUN rm -rf /usr/local/tomcat/webapps/ROOT
+
+ADD ./target/ROOT.war /usr/local/tomcat/webapps/
+
+ENV JAVA_OPTS="-Xmx1024m"
+
+CMD ["catalina.sh", "run"]
+
+EXPOSE 8080
+
diff --git a/sm-shop/files/store/StoreRepository.dat b/sm-shop/files/store/StoreRepository.dat
index 609ede9..4a6943e 100644
Binary files a/sm-shop/files/store/StoreRepository.dat and b/sm-shop/files/store/StoreRepository.dat differ
sm-shop/pom.xml 351(+184 -167)
diff --git a/sm-shop/pom.xml b/sm-shop/pom.xml
index cdca6be..0ff567e 100644
--- a/sm-shop/pom.xml
+++ b/sm-shop/pom.xml
@@ -1,167 +1,184 @@
-<?xml version="1.0"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>com.shopizer</groupId>
- <artifactId>shopizer</artifactId>
- <version>2.0.5-SNAPSHOT</version>
- </parent>
-
- <artifactId>sm-shop</artifactId>
- <packaging>war</packaging>
-
- <name>sm-shop</name>
- <url>http://www.shopizer.com</url>
-
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <main.basedir>${basedir}/../..</main.basedir>
- <m2eclipse.wtp.contextRoot>/</m2eclipse.wtp.contextRoot>
- </properties>
-
- <dependencies>
-
- <!-- sm-core -->
- <dependency>
- <groupId>com.shopizer</groupId>
- <artifactId>sm-core</artifactId>
- <version>${shopizer.version}</version>
- </dependency>
-
- <!-- sm-core-model -->
- <dependency>
- <groupId>com.shopizer</groupId>
- <artifactId>sm-core-model</artifactId>
- <version>${shopizer.version}</version>
- </dependency>
-
-
- <!-- sm-search -->
- <dependency>
- <groupId>com.shopizer</groupId>
- <artifactId>sm-search</artifactId>
- <version>${shopizer.search.version}</version>
- </dependency>
-
- <!-- Spring boot -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- <scope>provided</scope>
- </dependency>
-
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-security</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.springframework.security</groupId>
- <artifactId>spring-security-taglibs</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.apache.tomcat.embed</groupId>
- <artifactId>tomcat-embed-jasper</artifactId>
- <scope>provided</scope>
- </dependency>
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-tomcat</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.springframework.mobile</groupId>
- <artifactId>spring-mobile-device</artifactId>
- </dependency>
-
- <!-- Add Apache Tiles into the mix -->
- <dependency>
- <groupId>org.apache.tiles</groupId>
- <artifactId>tiles-jsp</artifactId>
- <version>3.0.4</version>
- <exclusions>
- <exclusion>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
-
-
- <!-- H2 session -->
- <dependency>
- <groupId>com.h2database</groupId>
- <artifactId>h2</artifactId>
- </dependency>
-
-
- <!--<dependency>
- <groupId>javax.validation</groupId>
- <artifactId>validation-api</artifactId>
- <version>1.1.0.Final</version>
- </dependency>-->
-
-
- <!-- Servlet -->
-
- <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>javax.servlet-api</artifactId>
- <version>${javax.servlet-api-version}</version>
- <scope>provided</scope>
- </dependency>-->
-
-
- <dependency>
- <groupId>javax.servlet.jsp</groupId>
- <artifactId>jsp-api</artifactId>
- <version>2.1</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
- <groupId>javax.servlet.jsp.jstl</groupId>
- <artifactId>jstl-api</artifactId>
- <version>1.2</version>
- <exclusions>
- <exclusion>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.glassfish.web</groupId>
- <artifactId>jstl-impl</artifactId>
- <version>1.2</version>
- <exclusions>
- <exclusion>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
-
-
- <!-- https://mvnrepository.com/artifact/javax/javaee-api -->
- <!--
- <dependency>
- <groupId>javax</groupId>
- <artifactId>javaee-api</artifactId>
- <version>7.0</version>
- </dependency>
- -->
-
-
- </dependencies>
-
-
-
-
-
-</project>
+<?xml version="1.0"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>com.shopizer</groupId>
+ <artifactId>shopizer</artifactId>
+ <version>2.2.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>sm-shop</artifactId>
+ <packaging>war</packaging>
+
+ <name>sm-shop</name>
+ <url>http://www.shopizer.com</url>
+
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <main.basedir>${basedir}/../..</main.basedir>
+ <m2eclipse.wtp.contextRoot>/</m2eclipse.wtp.contextRoot>
+ <jjwt.version>0.8.0</jjwt.version>
+ <!-- Need to use the latest milestone in order to logon with latest FB app version -->
+ <spring-social-facebook.version>3.0.0.M3</spring-social-facebook.version>
+ </properties>
+
+ <dependencies>
+
+ <!-- sm-core -->
+ <dependency>
+ <groupId>com.shopizer</groupId>
+ <artifactId>sm-core</artifactId>
+ <version>${shopizer.version}</version>
+ </dependency>
+
+ <!-- sm-core-model -->
+ <dependency>
+ <groupId>com.shopizer</groupId>
+ <artifactId>sm-core-model</artifactId>
+ <version>${shopizer.version}</version>
+ </dependency>
+
+
+ <!-- sm-search -->
+ <dependency>
+ <groupId>com.shopizer</groupId>
+ <artifactId>sm-search</artifactId>
+ <version>${shopizer.search.version}</version>
+ </dependency>
+
+ <!-- Spring boot -->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-web</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-security</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.springframework.security</groupId>
+ <artifactId>spring-security-taglibs</artifactId>
+ </dependency>
+
+
+ <!-- enables spring social -->
+ <!-- https://mvnrepository.com/artifact/org.springframework.social/spring-social-config -->
+ <dependency>
+ <groupId>org.springframework.social</groupId>
+ <artifactId>spring-social-config</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.springframework.social</groupId>
+ <artifactId>spring-social-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.social</groupId>
+ <artifactId>spring-social-security</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework.social</groupId>
+ <artifactId>spring-social-web</artifactId>
+ </dependency>
+
+
+ <!-- Enables login with facebook, for now it is using milestone -->
+ <dependency>
+ <groupId>org.springframework.social</groupId>
+ <artifactId>spring-social-facebook</artifactId>
+ <version>${spring-social-facebook.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-tomcat</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.springframework.mobile</groupId>
+ <artifactId>spring-mobile-device</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.tomcat.embed</groupId>
+ <artifactId>tomcat-embed-jasper</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+ <!-- Add Apache Tiles into the mix -->
+ <dependency>
+ <groupId>org.apache.tiles</groupId>
+ <artifactId>tiles-jsp</artifactId>
+ <version>3.0.4</version>
+ <exclusions>
+ <exclusion>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
+
+ <!-- H2 session -->
+ <dependency>
+ <groupId>com.h2database</groupId>
+ <artifactId>h2</artifactId>
+ </dependency>
+
+
+ <dependency>
+ <groupId>javax.servlet.jsp</groupId>
+ <artifactId>jsp-api</artifactId>
+ <version>2.1</version>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet.jsp.jstl</groupId>
+ <artifactId>jstl-api</artifactId>
+ <version>1.2</version>
+ <exclusions>
+ <exclusion>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.glassfish.web</groupId>
+ <artifactId>jstl-impl</artifactId>
+ <version>1.2</version>
+ <exclusions>
+ <exclusion>
+ <groupId>javax.servlet</groupId>
+ <artifactId>servlet-api</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
+ <dependency>
+ <groupId>io.jsonwebtoken</groupId>
+ <artifactId>jjwt</artifactId>
+ <version>${jjwt.version}</version>
+ </dependency>
+
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-maven-plugin</artifactId>
+ </plugin>
+ </plugins>
+ <finalName>ROOT</finalName>
+ </build>
+
+
+
+</project>
sm-shop/SALESMANAGER.h2.db 0(+0 -0)
diff --git a/sm-shop/SALESMANAGER.h2.db b/sm-shop/SALESMANAGER.h2.db
index c843a62..25199cb 100644
Binary files a/sm-shop/SALESMANAGER.h2.db and b/sm-shop/SALESMANAGER.h2.db differ
sm-shop/SALESMANAGER.lock.db 4(+2 -2)
diff --git a/sm-shop/SALESMANAGER.lock.db b/sm-shop/SALESMANAGER.lock.db
index c028245..1bbc8fd 100644
--- a/sm-shop/SALESMANAGER.lock.db
+++ b/sm-shop/SALESMANAGER.lock.db
@@ -1,4 +1,4 @@
#FileLock
-#Tue Feb 28 15:35:21 EST 2017
-id=15a866f35ae67795221c997e6eb71a74e599f68332f
+#Fri Feb 09 11:51:51 EST 2018
+id=1617b7af7ddb86c066f8024379f988cab511e8e689d
method=file
sm-shop/SALESMANAGER.trace.db 81(+81 -0)
diff --git a/sm-shop/SALESMANAGER.trace.db b/sm-shop/SALESMANAGER.trace.db
new file mode 100644
index 0000000..85dfab7
--- /dev/null
+++ b/sm-shop/SALESMANAGER.trace.db
@@ -0,0 +1,81 @@
+2018-01-07 15:00:16 jdbc[3]: exception
+org.h2.jdbc.JdbcSQLException: Table "MODULE_CONFIGURATION" not found; SQL statement:
+update MODULE_CONFIGURATION set IMAGE = 'braintree.jpg' where MODULE_CONF_ID=12 [42102-191]
+2018-02-09 11:43:44 jdbc[3]: exception
+org.h2.jdbc.JdbcSQLException: Column "ID" not found; SQL statement:
+delete from SALESMANAGER.CUSTOMER where ID > 1 [42122-191]
+ at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
+ at org.h2.message.DbException.get(DbException.java:179)
+ at org.h2.message.DbException.get(DbException.java:155)
+ at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:147)
+ at org.h2.expression.Comparison.optimize(Comparison.java:178)
+ at org.h2.command.dml.Delete.prepare(Delete.java:130)
+ at org.h2.command.Parser.prepareCommand(Parser.java:257)
+ at org.h2.engine.Session.prepareLocal(Session.java:560)
+ at org.h2.engine.Session.prepareCommand(Session.java:501)
+ at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1188)
+ at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:170)
+ at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:158)
+ at net.sourceforge.squirrel_sql.client.session.StatementWrapper.execute(StatementWrapper.java:165)
+ at net.sourceforge.squirrel_sql.client.session.SQLExecuterTask.processQuery(SQLExecuterTask.java:369)
+ at net.sourceforge.squirrel_sql.client.session.SQLExecuterTask.run(SQLExecuterTask.java:212)
+ at net.sourceforge.squirrel_sql.fw.util.TaskExecuter.run(TaskExecuter.java:82)
+ at java.lang.Thread.run(Thread.java:745)
+2018-02-09 11:46:15 database: close
+org.h2.message.DbException: IO Exception: "java.io.EOFException"; "/Users/carlsamson/Documents/dev/workspaces/shopizer-2.2.0/shopizer/sm-shop/SALESMANAGER.h2.db" [90031-191]
+ at org.h2.message.DbException.get(DbException.java:168)
+ at org.h2.message.DbException.convertIOException(DbException.java:330)
+ at org.h2.store.FileStore.readFully(FileStore.java:275)
+ at org.h2.store.PageStore.checkpoint(PageStore.java:461)
+ at org.h2.engine.Database.closeOpenFilesAndUnlock(Database.java:1353)
+ at org.h2.engine.Database.close(Database.java:1286)
+ at org.h2.engine.DatabaseCloser.run(DatabaseCloser.java:63)
+Caused by: org.h2.jdbc.JdbcSQLException: IO Exception: "java.io.EOFException"; "/Users/carlsamson/Documents/dev/workspaces/shopizer-2.2.0/shopizer/sm-shop/SALESMANAGER.h2.db" [90031-191]
+ at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
+ ... 7 more
+Caused by: java.io.EOFException
+ at org.h2.store.fs.FileUtils.readFully(FileUtils.java:358)
+ at org.h2.store.FileStore.readFully(FileStore.java:273)
+ ... 4 more
+2018-02-09 11:50:47 jdbc[3]: exception
+org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "UPDATE SALESMANAGER.MODULE_CONFIGURATION ET IMAGE[*] = 'braintree.j' WHERE MODULE_CONF_ID = 12 "; expected "SET"; SQL statement:
+update SALESMANAGER.MODULE_CONFIGURATION et IMAGE = 'braintree.j' where MODULE_CONF_ID = 12 [42001-191]
+2018-02-09 11:54:10 jdbc[3]: exception
+org.h2.jdbc.JdbcSQLException: Column "MODULE_CONFIGURATION_ID" not found; SQL statement:
+update SALESMANAGER.MODULE_CONFIGURATION set IMAGE = "braintree.jpg" where MODULE_CONFIGURATION_ID = 12 [42122-191]
+ at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
+ at org.h2.message.DbException.get(DbException.java:179)
+ at org.h2.message.DbException.get(DbException.java:155)
+ at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:147)
+ at org.h2.expression.Comparison.optimize(Comparison.java:178)
+ at org.h2.command.dml.Update.prepare(Update.java:185)
+ at org.h2.command.Parser.prepareCommand(Parser.java:257)
+ at org.h2.engine.Session.prepareLocal(Session.java:560)
+ at org.h2.engine.Session.prepareCommand(Session.java:501)
+ at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1188)
+ at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:170)
+ at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:158)
+ at net.sourceforge.squirrel_sql.client.session.StatementWrapper.execute(StatementWrapper.java:165)
+ at net.sourceforge.squirrel_sql.client.session.SQLExecuterTask.processQuery(SQLExecuterTask.java:369)
+ at net.sourceforge.squirrel_sql.client.session.SQLExecuterTask.run(SQLExecuterTask.java:212)
+ at net.sourceforge.squirrel_sql.fw.util.TaskExecuter.run(TaskExecuter.java:82)
+ at java.lang.Thread.run(Thread.java:745)
+2018-02-09 11:55:00 jdbc[3]: exception
+org.h2.jdbc.JdbcSQLException: Column "braintree.jpg" not found; SQL statement:
+update SALESMANAGER.MODULE_CONFIGURATION set IMAGE = "braintree.jpg" where MODULE_CONF_ID = 12 [42122-191]
+ at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
+ at org.h2.message.DbException.get(DbException.java:179)
+ at org.h2.message.DbException.get(DbException.java:155)
+ at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:147)
+ at org.h2.command.dml.Update.prepare(Update.java:192)
+ at org.h2.command.Parser.prepareCommand(Parser.java:257)
+ at org.h2.engine.Session.prepareLocal(Session.java:560)
+ at org.h2.engine.Session.prepareCommand(Session.java:501)
+ at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1188)
+ at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:170)
+ at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:158)
+ at net.sourceforge.squirrel_sql.client.session.StatementWrapper.execute(StatementWrapper.java:165)
+ at net.sourceforge.squirrel_sql.client.session.SQLExecuterTask.processQuery(SQLExecuterTask.java:369)
+ at net.sourceforge.squirrel_sql.client.session.SQLExecuterTask.run(SQLExecuterTask.java:212)
+ at net.sourceforge.squirrel_sql.fw.util.TaskExecuter.run(TaskExecuter.java:82)
+ at java.lang.Thread.run(Thread.java:745)
sm-shop/service.yml.txt 14(+14 -0)
diff --git a/sm-shop/service.yml.txt b/sm-shop/service.yml.txt
new file mode 100644
index 0000000..ecb643b
--- /dev/null
+++ b/sm-shop/service.yml.txt
@@ -0,0 +1,14 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: shopizer-ecommerce
+ labels:
+ app: shopizer-ecommerce
+ tier: backend
+spec:
+ type: NodePort
+ ports:
+ - port: 8888
+ selector:
+ app: shopizer-ecommerce
+ tier: backend
\ No newline at end of file
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/configurations/CacheController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/configurations/CacheController.java
index 4100609..2e5f6bf 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/configurations/CacheController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/configurations/CacheController.java
@@ -1,115 +1,115 @@
-package com.salesmanager.shop.admin.controller.configurations;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import com.salesmanager.core.business.utils.CacheUtils;
-import com.salesmanager.core.business.utils.ajax.AjaxResponse;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.shop.admin.controller.ControllerConstants;
-import com.salesmanager.shop.admin.model.web.Menu;
-import com.salesmanager.shop.constants.Constants;
-
-
-
-
-@Controller
-public class CacheController {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(CacheController.class);
-
- @Inject
- private CacheUtils cache;
-
-
-
- @PreAuthorize("hasRole('AUTH')")
- @RequestMapping(value="/admin/cache/cacheManagement.html", method=RequestMethod.GET)
- public String displayAccounts(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
- this.setMenu(model, request);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- //get cache keys
- List<String> cacheKeysList = cache.getCacheKeys(store);
-
- model.addAttribute("keys", cacheKeysList);
-
- return ControllerConstants.Tiles.Configuration.cache;
-
- }
-
-
- @PreAuthorize("hasRole('AUTH')")
- @RequestMapping(value="/admin/cache/clear.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> clearCache(HttpServletRequest request, HttpServletResponse response) {
- String cacheKey = request.getParameter("cacheKey");
-
- AjaxResponse resp = new AjaxResponse();
-
- try {
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- StringBuilder key = new StringBuilder();
- key.append(store.getId()).append("_").append(cacheKey);
-
- if(cacheKey!=null) {
- cache.removeFromCache(key.toString());
- } else {
- cache.removeAllFromCache(store);
- }
-
- resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
-
- } catch (Exception e) {
- LOGGER.error("Error while updateing groups", e);
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- }
-
- String returnString = resp.toJSONString();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
-
- private void setMenu(Model model, HttpServletRequest request) throws Exception {
-
- //display menu
- Map<String,String> activeMenus = new HashMap<String,String>();
- activeMenus.put("cache", "cache");
-
-
- @SuppressWarnings("unchecked")
- Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
-
- Menu currentMenu = (Menu)menus.get("cache");
- model.addAttribute("currentMenu",currentMenu);
- model.addAttribute("activeMenus",activeMenus);
- //
-
- }
-
-
-}
+package com.salesmanager.shop.admin.controller.configurations;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.salesmanager.core.business.utils.CacheUtils;
+import com.salesmanager.core.business.utils.ajax.AjaxResponse;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.shop.admin.controller.ControllerConstants;
+import com.salesmanager.shop.admin.model.web.Menu;
+import com.salesmanager.shop.constants.Constants;
+
+
+
+
+@Controller
+public class CacheController {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(CacheController.class);
+
+ @Inject
+ private CacheUtils cache;
+
+
+
+ @PreAuthorize("hasRole('AUTH')")
+ @RequestMapping(value="/admin/cache/cacheManagement.html", method=RequestMethod.GET)
+ public String displayAccounts(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ this.setMenu(model, request);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ //get cache keys
+ List<String> cacheKeysList = cache.getCacheKeys(store);
+
+ model.addAttribute("keys", cacheKeysList);
+
+ return ControllerConstants.Tiles.Configuration.cache;
+
+ }
+
+
+ @PreAuthorize("hasRole('AUTH')")
+ @RequestMapping(value="/admin/cache/clear.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> clearCache(HttpServletRequest request, HttpServletResponse response) {
+ String cacheKey = request.getParameter("cacheKey");
+
+ AjaxResponse resp = new AjaxResponse();
+
+ try {
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ StringBuilder key = new StringBuilder();
+ key.append(store.getId()).append("_").append(cacheKey);
+
+ if(cacheKey!=null) {
+ cache.removeFromCache(key.toString());
+ } else {
+ cache.removeAllFromCache(store);
+ }
+
+ resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while updateing groups", e);
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ }
+
+ String returnString = resp.toJSONString();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+
+ private void setMenu(Model model, HttpServletRequest request) throws Exception {
+
+ //display menu
+ Map<String,String> activeMenus = new HashMap<String,String>();
+ activeMenus.put("cache", "cache");
+
+
+ @SuppressWarnings("unchecked")
+ Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
+
+ Menu currentMenu = (Menu)menus.get("cache");
+ model.addAttribute("currentMenu",currentMenu);
+ model.addAttribute("activeMenus",activeMenus);
+ //
+
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/configurations/ConfigurationController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/configurations/ConfigurationController.java
index ff0ddd0..4138b05 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/configurations/ConfigurationController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/configurations/ConfigurationController.java
@@ -1,226 +1,226 @@
-package com.salesmanager.shop.admin.controller.configurations;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.core.env.Environment;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.BindingResult;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-
-import com.salesmanager.core.business.modules.email.EmailConfig;
-import com.salesmanager.core.business.services.system.EmailService;
-import com.salesmanager.core.business.services.system.MerchantConfigurationService;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.system.MerchantConfiguration;
-import com.salesmanager.core.model.system.MerchantConfigurationType;
-import com.salesmanager.shop.admin.controller.ControllerConstants;
-import com.salesmanager.shop.admin.model.web.ConfigListWrapper;
-import com.salesmanager.shop.admin.model.web.Menu;
-import com.salesmanager.shop.constants.Constants;
-
-
-
-
-@Controller
-public class ConfigurationController {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ConfigurationController.class);
-
- @Inject
- private MerchantConfigurationService merchantConfigurationService;
-
- @Inject
- private EmailService emailService;
-
- @Inject
- Environment env;
-
-
- @PreAuthorize("hasRole('AUTH')")
- @RequestMapping(value="/admin/configuration/accounts.html", method=RequestMethod.GET)
- public String displayAccountsConfguration(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
- setConfigurationMenu(model, request);
- List<MerchantConfiguration> configs = new ArrayList<MerchantConfiguration>();
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- MerchantConfiguration merchantFBConfiguration = merchantConfigurationService.getMerchantConfiguration(Constants.KEY_FACEBOOK_PAGE_URL,store);
- if(null == merchantFBConfiguration)
- {
- merchantFBConfiguration = new MerchantConfiguration();
- merchantFBConfiguration.setKey(Constants.KEY_FACEBOOK_PAGE_URL);
- merchantFBConfiguration.setMerchantConfigurationType(MerchantConfigurationType.CONFIG);
- }
- configs.add(merchantFBConfiguration);
-
- MerchantConfiguration merchantGoogleAnalyticsConfiguration = merchantConfigurationService.getMerchantConfiguration(Constants.KEY_GOOGLE_ANALYTICS_URL,store);
- if(null == merchantGoogleAnalyticsConfiguration)
- {
- merchantGoogleAnalyticsConfiguration = new MerchantConfiguration();
- merchantGoogleAnalyticsConfiguration.setKey(Constants.KEY_GOOGLE_ANALYTICS_URL);
- merchantGoogleAnalyticsConfiguration.setMerchantConfigurationType(MerchantConfigurationType.CONFIG);
- }
- configs.add(merchantGoogleAnalyticsConfiguration);
-
- MerchantConfiguration merchantInstagramConfiguration = merchantConfigurationService.getMerchantConfiguration(Constants.KEY_INSTAGRAM_URL,store);
- if(null == merchantInstagramConfiguration)
- {
- merchantInstagramConfiguration = new MerchantConfiguration();
- merchantInstagramConfiguration.setKey(Constants.KEY_INSTAGRAM_URL);
- merchantInstagramConfiguration.setMerchantConfigurationType(MerchantConfigurationType.CONFIG);
- }
- configs.add(merchantInstagramConfiguration);
-
- MerchantConfiguration merchantPinterestConfiguration = merchantConfigurationService.getMerchantConfiguration(Constants.KEY_PINTEREST_PAGE_URL,store);
- if(null == merchantPinterestConfiguration)
- {
- merchantPinterestConfiguration = new MerchantConfiguration();
- merchantPinterestConfiguration.setKey(Constants.KEY_PINTEREST_PAGE_URL);
- merchantPinterestConfiguration.setMerchantConfigurationType(MerchantConfigurationType.CONFIG);
- }
- configs.add(merchantPinterestConfiguration);
-
- /**
- MerchantConfiguration merchantGoogleApiConfiguration = merchantConfigurationService.getMerchantConfiguration(Constants.KEY_GOOGLE_API_KEY,store);
- if(null == merchantGoogleApiConfiguration)
- {
- merchantGoogleApiConfiguration = new MerchantConfiguration();
- merchantGoogleApiConfiguration.setKey(Constants.KEY_GOOGLE_API_KEY);
- merchantGoogleApiConfiguration.setMerchantConfigurationType(MerchantConfigurationType.CONFIG);
- }
- configs.add(merchantGoogleApiConfiguration);
- **/
-
- MerchantConfiguration twitterConfiguration = merchantConfigurationService.getMerchantConfiguration(Constants.KEY_TWITTER_HANDLE,store);
- if(null == twitterConfiguration)
- {
- twitterConfiguration = new MerchantConfiguration();
- twitterConfiguration.setKey(Constants.KEY_TWITTER_HANDLE);
- twitterConfiguration.setMerchantConfigurationType(MerchantConfigurationType.CONFIG);
- }
- configs.add(twitterConfiguration);
-
- ConfigListWrapper configWrapper = new ConfigListWrapper();
- configWrapper.setMerchantConfigs(configs);
- model.addAttribute("configuration",configWrapper);
-
- return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Configuration.accounts;
- }
-
- @PreAuthorize("hasRole('AUTH')")
- @RequestMapping(value="/admin/configuration/saveConfiguration.html", method=RequestMethod.POST)
- public String saveConfigurations(@ModelAttribute("configuration") ConfigListWrapper configWrapper, BindingResult result, Model model, HttpServletRequest request, Locale locale) throws Exception
- {
- setConfigurationMenu(model, request);
- List<MerchantConfiguration> configs = configWrapper.getMerchantConfigs();
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- for(MerchantConfiguration mConfigs : configs)
- {
- mConfigs.setMerchantStore(store);
- if(!StringUtils.isBlank(mConfigs.getValue())) {
- mConfigs.setMerchantConfigurationType(MerchantConfigurationType.CONFIG);
- merchantConfigurationService.saveOrUpdate(mConfigs);
- } else {//remove if submited blank and exists
- MerchantConfiguration config = merchantConfigurationService.getMerchantConfiguration(mConfigs.getKey(), store);
- if(config!=null) {
- merchantConfigurationService.delete(config);
- }
- }
- }
- model.addAttribute("success","success");
- model.addAttribute("configuration",configWrapper);
- return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Configuration.accounts;
-
- }
-
- @PreAuthorize("hasRole('AUTH')")
- @RequestMapping(value="/admin/configuration/email.html", method=RequestMethod.GET)
- public String displayEmailSettings(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
- setEmailConfigurationMenu(model, request);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- EmailConfig emailConfig = emailService.getEmailConfiguration(store);
- if(emailConfig == null){
- emailConfig = new EmailConfig();
- //TODO: Need to check below properties. When there are no record available in MerchantConfguration table with EMAIL_CONFIG key,
- // instead of showing blank fields in setup screen, show default configured values from email.properties
- emailConfig.setProtocol(env.getProperty("mailSender.protocol"));
- emailConfig.setHost(env.getProperty("mailSender.host"));
- emailConfig.setPort(env.getProperty("mailSender.port}"));
- emailConfig.setUsername(env.getProperty("mailSender.username"));
- emailConfig.setPassword(env.getProperty("mailSender.password"));
- emailConfig.setSmtpAuth(Boolean.parseBoolean(env.getProperty("mailSender.mail.smtp.auth")));
- emailConfig.setStarttls(Boolean.parseBoolean(env.getProperty("mail.smtp.starttls.enable")));
- }
-
- model.addAttribute("configuration", emailConfig);
- return ControllerConstants.Tiles.Configuration.email;
- }
-
- @PreAuthorize("hasRole('AUTH')")
- @RequestMapping(value="/admin/configuration/saveEmailConfiguration.html", method=RequestMethod.POST)
- public String saveEmailSettings(@ModelAttribute("configuration") EmailConfig config, BindingResult result, Model model, HttpServletRequest request, Locale locale) throws Exception {
- setEmailConfigurationMenu(model, request);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- EmailConfig emailConfig = emailService.getEmailConfiguration(store);
- if(emailConfig == null){
- emailConfig = new EmailConfig();
- }
-
- // populte EmailConfig model from UI values
- emailConfig.setProtocol(config.getProtocol());
- emailConfig.setHost(config.getHost());
- emailConfig.setPort(config.getPort());
- emailConfig.setUsername(config.getUsername());
- emailConfig.setPassword(config.getPassword());
- emailConfig.setSmtpAuth(config.isSmtpAuth());
- emailConfig.setStarttls(config.isStarttls());
-
- emailService.saveEmailConfiguration(emailConfig, store);
-
- model.addAttribute("configuration", emailConfig);
- model.addAttribute("success","success");
- return ControllerConstants.Tiles.Configuration.email;
- }
-
- private void setConfigurationMenu(Model model, HttpServletRequest request) throws Exception {
-
- Map<String,String> activeMenus = new HashMap<String,String>();
- activeMenus.put("configuration", "configuration");
- activeMenus.put("accounts-conf", "accounts-conf");
-
- @SuppressWarnings("unchecked")
- Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
-
- Menu currentMenu = (Menu)menus.get("configuration");
- model.addAttribute("currentMenu",currentMenu);
- model.addAttribute("activeMenus",activeMenus);
- }
-
- private void setEmailConfigurationMenu(Model model, HttpServletRequest request) throws Exception {
-
- Map<String,String> activeMenus = new HashMap<String,String>();
- activeMenus.put("configuration", "configuration");
- activeMenus.put("email-conf", "email-conf");
-
- @SuppressWarnings("unchecked")
- Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
-
- Menu currentMenu = (Menu)menus.get("configuration");
- model.addAttribute("currentMenu",currentMenu);
- model.addAttribute("activeMenus",activeMenus);
- }
-}
+package com.salesmanager.shop.admin.controller.configurations;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.env.Environment;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import com.salesmanager.core.business.modules.email.EmailConfig;
+import com.salesmanager.core.business.services.system.EmailService;
+import com.salesmanager.core.business.services.system.MerchantConfigurationService;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.system.MerchantConfiguration;
+import com.salesmanager.core.model.system.MerchantConfigurationType;
+import com.salesmanager.shop.admin.controller.ControllerConstants;
+import com.salesmanager.shop.admin.model.web.ConfigListWrapper;
+import com.salesmanager.shop.admin.model.web.Menu;
+import com.salesmanager.shop.constants.Constants;
+
+
+
+
+@Controller
+public class ConfigurationController {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ConfigurationController.class);
+
+ @Inject
+ private MerchantConfigurationService merchantConfigurationService;
+
+ @Inject
+ private EmailService emailService;
+
+ @Inject
+ Environment env;
+
+
+ @PreAuthorize("hasRole('AUTH')")
+ @RequestMapping(value="/admin/configuration/accounts.html", method=RequestMethod.GET)
+ public String displayAccountsConfguration(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ setConfigurationMenu(model, request);
+ List<MerchantConfiguration> configs = new ArrayList<MerchantConfiguration>();
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ MerchantConfiguration merchantFBConfiguration = merchantConfigurationService.getMerchantConfiguration(Constants.KEY_FACEBOOK_PAGE_URL,store);
+ if(null == merchantFBConfiguration)
+ {
+ merchantFBConfiguration = new MerchantConfiguration();
+ merchantFBConfiguration.setKey(Constants.KEY_FACEBOOK_PAGE_URL);
+ merchantFBConfiguration.setMerchantConfigurationType(MerchantConfigurationType.CONFIG);
+ }
+ configs.add(merchantFBConfiguration);
+
+ MerchantConfiguration merchantGoogleAnalyticsConfiguration = merchantConfigurationService.getMerchantConfiguration(Constants.KEY_GOOGLE_ANALYTICS_URL,store);
+ if(null == merchantGoogleAnalyticsConfiguration)
+ {
+ merchantGoogleAnalyticsConfiguration = new MerchantConfiguration();
+ merchantGoogleAnalyticsConfiguration.setKey(Constants.KEY_GOOGLE_ANALYTICS_URL);
+ merchantGoogleAnalyticsConfiguration.setMerchantConfigurationType(MerchantConfigurationType.CONFIG);
+ }
+ configs.add(merchantGoogleAnalyticsConfiguration);
+
+ MerchantConfiguration merchantInstagramConfiguration = merchantConfigurationService.getMerchantConfiguration(Constants.KEY_INSTAGRAM_URL,store);
+ if(null == merchantInstagramConfiguration)
+ {
+ merchantInstagramConfiguration = new MerchantConfiguration();
+ merchantInstagramConfiguration.setKey(Constants.KEY_INSTAGRAM_URL);
+ merchantInstagramConfiguration.setMerchantConfigurationType(MerchantConfigurationType.CONFIG);
+ }
+ configs.add(merchantInstagramConfiguration);
+
+ MerchantConfiguration merchantPinterestConfiguration = merchantConfigurationService.getMerchantConfiguration(Constants.KEY_PINTEREST_PAGE_URL,store);
+ if(null == merchantPinterestConfiguration)
+ {
+ merchantPinterestConfiguration = new MerchantConfiguration();
+ merchantPinterestConfiguration.setKey(Constants.KEY_PINTEREST_PAGE_URL);
+ merchantPinterestConfiguration.setMerchantConfigurationType(MerchantConfigurationType.CONFIG);
+ }
+ configs.add(merchantPinterestConfiguration);
+
+ /**
+ MerchantConfiguration merchantGoogleApiConfiguration = merchantConfigurationService.getMerchantConfiguration(Constants.KEY_GOOGLE_API_KEY,store);
+ if(null == merchantGoogleApiConfiguration)
+ {
+ merchantGoogleApiConfiguration = new MerchantConfiguration();
+ merchantGoogleApiConfiguration.setKey(Constants.KEY_GOOGLE_API_KEY);
+ merchantGoogleApiConfiguration.setMerchantConfigurationType(MerchantConfigurationType.CONFIG);
+ }
+ configs.add(merchantGoogleApiConfiguration);
+ **/
+
+ MerchantConfiguration twitterConfiguration = merchantConfigurationService.getMerchantConfiguration(Constants.KEY_TWITTER_HANDLE,store);
+ if(null == twitterConfiguration)
+ {
+ twitterConfiguration = new MerchantConfiguration();
+ twitterConfiguration.setKey(Constants.KEY_TWITTER_HANDLE);
+ twitterConfiguration.setMerchantConfigurationType(MerchantConfigurationType.CONFIG);
+ }
+ configs.add(twitterConfiguration);
+
+ ConfigListWrapper configWrapper = new ConfigListWrapper();
+ configWrapper.setMerchantConfigs(configs);
+ model.addAttribute("configuration",configWrapper);
+
+ return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Configuration.accounts;
+ }
+
+ @PreAuthorize("hasRole('AUTH')")
+ @RequestMapping(value="/admin/configuration/saveConfiguration.html", method=RequestMethod.POST)
+ public String saveConfigurations(@ModelAttribute("configuration") ConfigListWrapper configWrapper, BindingResult result, Model model, HttpServletRequest request, Locale locale) throws Exception
+ {
+ setConfigurationMenu(model, request);
+ List<MerchantConfiguration> configs = configWrapper.getMerchantConfigs();
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ for(MerchantConfiguration mConfigs : configs)
+ {
+ mConfigs.setMerchantStore(store);
+ if(!StringUtils.isBlank(mConfigs.getValue())) {
+ mConfigs.setMerchantConfigurationType(MerchantConfigurationType.CONFIG);
+ merchantConfigurationService.saveOrUpdate(mConfigs);
+ } else {//remove if submited blank and exists
+ MerchantConfiguration config = merchantConfigurationService.getMerchantConfiguration(mConfigs.getKey(), store);
+ if(config!=null) {
+ merchantConfigurationService.delete(config);
+ }
+ }
+ }
+ model.addAttribute("success","success");
+ model.addAttribute("configuration",configWrapper);
+ return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Configuration.accounts;
+
+ }
+
+ @PreAuthorize("hasRole('AUTH')")
+ @RequestMapping(value="/admin/configuration/email.html", method=RequestMethod.GET)
+ public String displayEmailSettings(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+ setEmailConfigurationMenu(model, request);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ EmailConfig emailConfig = emailService.getEmailConfiguration(store);
+ if(emailConfig == null){
+ emailConfig = new EmailConfig();
+ //TODO: Need to check below properties. When there are no record available in MerchantConfguration table with EMAIL_CONFIG key,
+ // instead of showing blank fields in setup screen, show default configured values from email.properties
+ emailConfig.setProtocol(env.getProperty("mailSender.protocol"));
+ emailConfig.setHost(env.getProperty("mailSender.host"));
+ emailConfig.setPort(env.getProperty("mailSender.port}"));
+ emailConfig.setUsername(env.getProperty("mailSender.username"));
+ emailConfig.setPassword(env.getProperty("mailSender.password"));
+ emailConfig.setSmtpAuth(Boolean.parseBoolean(env.getProperty("mailSender.mail.smtp.auth")));
+ emailConfig.setStarttls(Boolean.parseBoolean(env.getProperty("mail.smtp.starttls.enable")));
+ }
+
+ model.addAttribute("configuration", emailConfig);
+ return ControllerConstants.Tiles.Configuration.email;
+ }
+
+ @PreAuthorize("hasRole('AUTH')")
+ @RequestMapping(value="/admin/configuration/saveEmailConfiguration.html", method=RequestMethod.POST)
+ public String saveEmailSettings(@ModelAttribute("configuration") EmailConfig config, BindingResult result, Model model, HttpServletRequest request, Locale locale) throws Exception {
+ setEmailConfigurationMenu(model, request);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ EmailConfig emailConfig = emailService.getEmailConfiguration(store);
+ if(emailConfig == null){
+ emailConfig = new EmailConfig();
+ }
+
+ // populte EmailConfig model from UI values
+ emailConfig.setProtocol(config.getProtocol());
+ emailConfig.setHost(config.getHost());
+ emailConfig.setPort(config.getPort());
+ emailConfig.setUsername(config.getUsername());
+ emailConfig.setPassword(config.getPassword());
+ emailConfig.setSmtpAuth(config.isSmtpAuth());
+ emailConfig.setStarttls(config.isStarttls());
+
+ emailService.saveEmailConfiguration(emailConfig, store);
+
+ model.addAttribute("configuration", emailConfig);
+ model.addAttribute("success","success");
+ return ControllerConstants.Tiles.Configuration.email;
+ }
+
+ private void setConfigurationMenu(Model model, HttpServletRequest request) throws Exception {
+
+ Map<String,String> activeMenus = new HashMap<String,String>();
+ activeMenus.put("configuration", "configuration");
+ activeMenus.put("accounts-conf", "accounts-conf");
+
+ @SuppressWarnings("unchecked")
+ Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
+
+ Menu currentMenu = (Menu)menus.get("configuration");
+ model.addAttribute("currentMenu",currentMenu);
+ model.addAttribute("activeMenus",activeMenus);
+ }
+
+ private void setEmailConfigurationMenu(Model model, HttpServletRequest request) throws Exception {
+
+ Map<String,String> activeMenus = new HashMap<String,String>();
+ activeMenus.put("configuration", "configuration");
+ activeMenus.put("email-conf", "email-conf");
+
+ @SuppressWarnings("unchecked")
+ Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
+
+ Menu currentMenu = (Menu)menus.get("configuration");
+ model.addAttribute("currentMenu",currentMenu);
+ model.addAttribute("activeMenus",activeMenus);
+ }
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/content/ContentPagesController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/content/ContentPagesController.java
index 953e259..e1dec01 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/content/ContentPagesController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/content/ContentPagesController.java
@@ -281,6 +281,7 @@ public class ContentPagesController {
content.setContentType(ContentType.PAGE);
content.setMerchantStore(store);
+
contentService.saveOrUpdate(content);
List<ProductRelationship> relationships = productRelationshipService.getGroups(store);
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/ControllerConstants.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/ControllerConstants.java
index fd6d686..cc7af5e 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/ControllerConstants.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/ControllerConstants.java
@@ -1,109 +1,109 @@
-/**
- *
- */
-package com.salesmanager.shop.admin.controller;
-
-/**
- * Interface contain constant for Controller.These constant will be used throughout
- * sm-shop to providing constant values to various Controllers being used in the
- * application.
- * @author Umesh A
- *
- */
-public interface ControllerConstants
-{
-
- interface Tiles{
-
- final String adminDashboard="admin-dashboard";
- interface ContentImages{
- final String addContentImages="admin-contentImages-add";
- final String contentImages="admin-content-images";
- final String fileBrowser="admin-content-filebrowser";
-
- }
-
- interface ContentFiles{
- final String addContentFiles="admin-content-files-add";
- final String contentFiles="admin-content-files";
-
-
- }
-
- interface Content{
- final String contentPages="admin-content-pages";
- final String contentPagesDetails="admin-content-pages-details";
-
- }
-
- interface Customer{
- final String optionsList="admin-customer-options-list";
- final String optionDetails="admin-customer-options-details";
- final String optionsValuesList="admin-customer-options-values-list";
- final String optionsValueDetails="admin-customer-options-values-details";
- final String optionsSet="admin-customer-options-set";
-
- }
-
- interface Product{
- final String productReviews="catalogue-product-reviews";
- final String productPrices="admin-products-prices";
- final String productPrice="admin-products-price";
- final String relatedItems="admin-products-related";
- final String digitalProduct="admin-products-digital";
- final String productImages="admin-products-images";
- final String productImagesUrl="admin-products-images-url";
- final String productKeywords="admin-products-keywords";
- final String customGroups="admin-products-groups";
- final String customGroupsDetails="admin-products-groups-details";
- final String manufacturerList="admin-products-manufacturer";
- final String manufacturerDetails="admin-products-manufacturer-details";
- }
-
- interface User{
- final String profile="admin-user-profile";
- final String users="admin-users";
- final String password="admin-user-password";
- }
-
- interface Store{
- final String stores="admin-stores";
- }
-
-
- interface Shipping{
- final String shippingMethod="shipping-method";
- final String shippingMethods="shipping-methods";
- final String shippingOptions="shipping-options";
- final String shippingPackaging="shipping-packaging";
- final String customShippingWeightBased="admin-shipping-custom";
- }
-
- interface Payment{
- final String paymentMethods="payment-methods";
- final String paymentMethod="payment-method";
- }
-
- interface Order{
- final String orders="admin-orders";
- final String ordersEdit="admin-orders-edit";
- final String ordersTransactions="admin-orders-transactions";
- }
-
- interface Configuration{
- final String accounts="config-accounts";
- final String email="config-email";
- final String cache="admin-cache";
- final String system="config-system";
- }
-
- interface Tax{
- final String taxClasses="tax-classes";
- final String taxClass="tax-class";
- final String taxConfiguration="tax-configuration";
- final String taxRates="tax-rates";
- final String taxRate="tax-rate";
- }
-
- }
-}
+/**
+ *
+ */
+package com.salesmanager.shop.admin.controller;
+
+/**
+ * Interface contain constant for Controller.These constant will be used throughout
+ * sm-shop to providing constant values to various Controllers being used in the
+ * application.
+ * @author Umesh A
+ *
+ */
+public interface ControllerConstants
+{
+
+ interface Tiles{
+
+ final String adminDashboard="admin-dashboard";
+ interface ContentImages{
+ final String addContentImages="admin-contentImages-add";
+ final String contentImages="admin-content-images";
+ final String fileBrowser="admin-content-filebrowser";
+
+ }
+
+ interface ContentFiles{
+ final String addContentFiles="admin-content-files-add";
+ final String contentFiles="admin-content-files";
+
+
+ }
+
+ interface Content{
+ final String contentPages="admin-content-pages";
+ final String contentPagesDetails="admin-content-pages-details";
+
+ }
+
+ interface Customer{
+ final String optionsList="admin-customer-options-list";
+ final String optionDetails="admin-customer-options-details";
+ final String optionsValuesList="admin-customer-options-values-list";
+ final String optionsValueDetails="admin-customer-options-values-details";
+ final String optionsSet="admin-customer-options-set";
+
+ }
+
+ interface Product{
+ final String productReviews="catalogue-product-reviews";
+ final String productPrices="admin-products-prices";
+ final String productPrice="admin-products-price";
+ final String relatedItems="admin-products-related";
+ final String digitalProduct="admin-products-digital";
+ final String productImages="admin-products-images";
+ final String productImagesUrl="admin-products-images-url";
+ final String productKeywords="admin-products-keywords";
+ final String customGroups="admin-products-groups";
+ final String customGroupsDetails="admin-products-groups-details";
+ final String manufacturerList="admin-products-manufacturer";
+ final String manufacturerDetails="admin-products-manufacturer-details";
+ }
+
+ interface User{
+ final String profile="admin-user-profile";
+ final String users="admin-users";
+ final String password="admin-user-password";
+ }
+
+ interface Store{
+ final String stores="admin-stores";
+ }
+
+
+ interface Shipping{
+ final String shippingMethod="shipping-method";
+ final String shippingMethods="shipping-methods";
+ final String shippingOptions="shipping-options";
+ final String shippingPackaging="shipping-packaging";
+ final String customShippingWeightBased="admin-shipping-custom";
+ }
+
+ interface Payment{
+ final String paymentMethods="payment-methods";
+ final String paymentMethod="payment-method";
+ }
+
+ interface Order{
+ final String orders="admin-orders";
+ final String ordersEdit="admin-orders-edit";
+ final String ordersTransactions="admin-orders-transactions";
+ }
+
+ interface Configuration{
+ final String accounts="config-accounts";
+ final String email="config-email";
+ final String cache="admin-cache";
+ final String system="config-system";
+ }
+
+ interface Tax{
+ final String taxClasses="tax-classes";
+ final String taxClass="tax-class";
+ final String taxConfiguration="tax-configuration";
+ final String taxRates="tax-rates";
+ final String taxRate="tax-rate";
+ }
+
+ }
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/customers/CustomerController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/customers/CustomerController.java
index f2f0f6f..2febffd 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/customers/CustomerController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/customers/CustomerController.java
@@ -10,6 +10,7 @@ import com.salesmanager.core.business.services.reference.country.CountryService;
import com.salesmanager.core.business.services.reference.language.LanguageService;
import com.salesmanager.core.business.services.reference.zone.ZoneService;
import com.salesmanager.core.business.services.system.EmailService;
+import com.salesmanager.core.business.services.user.GroupService;
import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse;
import com.salesmanager.core.business.utils.ajax.AjaxResponse;
import com.salesmanager.core.model.customer.Customer;
@@ -23,6 +24,8 @@ import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.reference.country.Country;
import com.salesmanager.core.model.reference.language.Language;
import com.salesmanager.core.model.reference.zone.Zone;
+import com.salesmanager.core.model.user.Group;
+import com.salesmanager.core.model.user.GroupType;
import com.salesmanager.shop.admin.model.customer.attribute.CustomerOption;
import com.salesmanager.shop.admin.model.customer.attribute.CustomerOptionValue;
import com.salesmanager.shop.admin.model.userpassword.UserReset;
@@ -75,6 +78,9 @@ public class CustomerController {
private LabelUtils messages;
@Inject
+ private GroupService groupService;
+
+ @Inject
private CustomerService customerService;
@Inject
@@ -124,6 +130,15 @@ public class CustomerController {
//display menu
this.setMenu(model, request);
+ //get groups
+ List<Group> groups = new ArrayList<Group>();
+ List<Group> userGroups = groupService.listGroup(GroupType.CUSTOMER);
+ for(Group group : userGroups) {
+ groups.add(group);
+ }
+
+ model.addAttribute("groups",groups);
+
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
List<Language> languages = languageService.getLanguages();
@@ -238,6 +253,15 @@ public class CustomerController {
model.addAttribute("languages",languages);
+ //get groups
+ List<Group> groups = new ArrayList<Group>();
+ List<Group> userGroups = groupService.listGroup(GroupType.CUSTOMER);
+ for(Group group : userGroups) {
+ groups.add(group);
+ }
+
+ model.addAttribute("groups",groups);
+
this.getCustomerOptions(model, customer, store, language);
//get countries
@@ -320,6 +344,15 @@ public class CustomerController {
newCustomer.setMerchantStore(merchantStore);
}
+ List<Group> submitedGroups = customer.getGroups();
+ Set<Integer> ids = new HashSet<Integer>();
+ for(Group group : submitedGroups) {
+ ids.add(Integer.parseInt(group.getGroupName()));
+ }
+
+ List<Group> newGroups = groupService.listGroupByIds(ids);
+ newCustomer.setGroups(newGroups);
+
newCustomer.setEmailAddress(customer.getEmailAddress() );
@@ -332,22 +365,30 @@ public class CustomerController {
- if (customer.getShowDeliveryStateList().equalsIgnoreCase("yes" )) {
- deliveryZone = zoneService.getByCode(customer.getDelivery().getZone().getCode());
- customer.getDelivery().setState( null );
+ if ("yes".equalsIgnoreCase(customer.getShowDeliveryStateList())) {
+ if(customer.getDelivery().getZone()!=null) {
+ deliveryZone = zoneService.getByCode(customer.getDelivery().getZone().getCode());
+ customer.getDelivery().setState( null );
+ }
- }else if (customer.getShowDeliveryStateList().equalsIgnoreCase("no" )){
- deliveryZone = null ;
- customer.getDelivery().setState( customer.getDelivery().getState() );
+ }else if ("no".equalsIgnoreCase(customer.getShowDeliveryStateList())){
+ if(customer.getDelivery().getState()!=null) {
+ deliveryZone = null ;
+ customer.getDelivery().setState( customer.getDelivery().getState() );
+ }
}
- if (customer.getShowBillingStateList().equalsIgnoreCase("yes" )) {
- billingZone = zoneService.getByCode(customer.getBilling().getZone().getCode());
- customer.getBilling().setState( null );
+ if ("yes".equalsIgnoreCase(customer.getShowBillingStateList())) {
+ if(customer.getBilling().getZone()!=null) {
+ billingZone = zoneService.getByCode(customer.getBilling().getZone().getCode());
+ customer.getBilling().setState( null );
+ }
- }else if (customer.getShowBillingStateList().equalsIgnoreCase("no" )){
- billingZone = null ;
- customer.getBilling().setState( customer.getBilling().getState() );
+ }else if ("no".equalsIgnoreCase(customer.getShowBillingStateList())){
+ if(customer.getBilling().getState()!=null) {
+ billingZone = null ;
+ customer.getBilling().setState( customer.getBilling().getState() );
+ }
}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/merchant/MerchantStoreController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/merchant/MerchantStoreController.java
index c9fe746..c73fac9 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/merchant/MerchantStoreController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/merchant/MerchantStoreController.java
@@ -178,7 +178,6 @@ public class MerchantStoreController {
setMenu(model,request);
- request.getSession().setAttribute(Constants.ADMIN_STORE, store);
Language language = (Language)request.getAttribute("LANGUAGE");
List<Language> languages = languageService.getLanguages();
List<Currency> currencies = currencyService.list();
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/payments/PaymentsController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/payments/PaymentsController.java
index 4f860d8..8251eb5 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/payments/PaymentsController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/payments/PaymentsController.java
@@ -114,7 +114,7 @@ public class PaymentsController {
try {
paymentService.savePaymentModuleConfiguration(configuration, store);
} catch (Exception e) {
- if(e instanceof IntegrationException) {
+ if(e instanceof com.salesmanager.core.business.modules.integration.IntegrationException) {
if(((IntegrationException)e).getErrorCode()==IntegrationException.ERROR_VALIDATION_SAVE) {
List<String> errorCodes = ((IntegrationException)e).getErrorFields();
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/CustomProductGroupsController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/CustomProductGroupsController.java
index a436d27..69e5b4a 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/CustomProductGroupsController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/CustomProductGroupsController.java
@@ -1,465 +1,465 @@
-package com.salesmanager.shop.admin.controller.products;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.salesmanager.core.business.services.catalog.category.CategoryService;
-import com.salesmanager.core.business.services.catalog.product.ProductService;
-import com.salesmanager.core.business.services.catalog.product.relationship.ProductRelationshipService;
-import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse;
-import com.salesmanager.core.business.utils.ajax.AjaxResponse;
-import com.salesmanager.core.model.catalog.category.Category;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.description.ProductDescription;
-import com.salesmanager.core.model.catalog.product.relationship.ProductRelationship;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.admin.controller.ControllerConstants;
-import com.salesmanager.shop.admin.model.web.Menu;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.utils.LabelUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.BindingResult;
-import org.springframework.validation.FieldError;
-import org.springframework.web.bind.annotation.*;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.*;
-
-
-@Controller
-public class CustomProductGroupsController {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(CustomProductGroupsController.class);
-
- @Inject
- CategoryService categoryService;
-
- @Inject
- ProductService productService;
-
- @Inject
- ProductRelationshipService productRelationshipService;
-
- @Inject
- LabelUtils messages;
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/groups/list.html", method=RequestMethod.GET)
- public String displayProductGroups(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
- setMenu(model,request);
-
- Language language = (Language)request.getAttribute("LANGUAGE");
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- ProductRelationship group = new ProductRelationship();
-
-
- model.addAttribute("group", group);
-
- return ControllerConstants.Tiles.Product.customGroups;
-
- }
-
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/groups/paging.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> pageCustomGroups(HttpServletRequest request, HttpServletResponse response) {
-
-
- AjaxResponse resp = new AjaxResponse();
-
- try {
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
-
- List<ProductRelationship> relationships = productRelationshipService.getGroups(store);
-
- for(ProductRelationship relationship : relationships) {
-
- if(!"FEATURED_ITEM".equals(relationship.getCode())) {//do not add featured items
-
- Map entry = new HashMap();
- entry.put("code", relationship.getCode());
- entry.put("active", relationship.isActive());
-
- resp.addDataEntry(entry);
-
- }
-
- }
-
-
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
-
- } catch (Exception e) {
- LOGGER.error("Error while paging products", e);
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
-
-
- }
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/groups/save.html", method=RequestMethod.POST)
- public String saveCustomProductGroup(@ModelAttribute("group") ProductRelationship group, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- setMenu(model,request);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
-
- //check if group already exist
-
-
- if(StringUtils.isBlank(group.getCode())) {
- FieldError fieldError = new FieldError("group","code",group.getCode(),false,null,null,messages.getMessage("message.group.required",locale));
- result.addError(fieldError);
- return ControllerConstants.Tiles.Product.customGroups;
- }
-
- //String msg = messages.getMessage("message.group.alerady.exists",locale);
- //String[] messages = {msg};
-
- String[] messages = {"message.group.alerady.exists"};
-
- List<ProductRelationship> groups = productRelationshipService.getGroups(store);
- for(ProductRelationship grp : groups) {
- if(grp.getCode().equalsIgnoreCase(group.getCode())) {
- String[] args = {group.getCode()};
- FieldError fieldError = new FieldError("group","code",group.getCode(),false,messages,args,null);
- result.addError(fieldError);
- }
- }
-
- if(result.hasErrors()) {
- return ControllerConstants.Tiles.Product.customGroups;
- }
-
- group.setActive(true);
- group.setStore(store);
-
- productRelationshipService.addGroup(store,group.getCode());
-
-
- model.addAttribute("success","success");
-
- return ControllerConstants.Tiles.Product.customGroups;
-
- }
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/groups/remove.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> removeCustomProductGroup(HttpServletRequest request, HttpServletResponse response) {
-
- String groupCode = request.getParameter("code");
-
- AjaxResponse resp = new AjaxResponse();
-
-
- try {
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- productRelationshipService.deleteGroup(store, groupCode);
- resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
-
- } catch (Exception e) {
- LOGGER.error("Error while deleting a group", e);
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- }
-
- String returnString = resp.toJSONString();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
-
- }
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/groups/update.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> activateProductGroup(HttpServletRequest request, HttpServletResponse response) {
- String values = request.getParameter("_oldValues");
- String active = request.getParameter("active");
-
-
- AjaxResponse resp = new AjaxResponse();
-
- try {
-
- ObjectMapper mapper = new ObjectMapper();
- @SuppressWarnings("rawtypes")
- Map conf = mapper.readValue(values, Map.class);
- String groupCode = (String)conf.get("code");
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- //get groups
- List<ProductRelationship> groups = productRelationshipService.getGroups(store);
-
- for(ProductRelationship relation : groups) {
- if(relation.getCode().equals(groupCode)) {
- if("true".equals(active)) {
- relation.setActive(true);
- } else {
- relation.setActive(false);
- }
- productRelationshipService.saveOrUpdate(relation);
- }
- }
- resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
-
- } catch (Exception e) {
- LOGGER.error("Error while updateing groups", e);
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- }
-
- String returnString = resp.toJSONString();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/group/edit.html", method=RequestMethod.GET)
- public String displayCustomProductGroup(@RequestParam("id") String groupCode, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
- setMenu(model,request);
-
- Language language = (Language)request.getAttribute("LANGUAGE");
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- List<Category> categories = categoryService.listByStore(store,language);//for categories
-
-
- model.addAttribute("group", groupCode);
- model.addAttribute("categories", categories);
- return ControllerConstants.Tiles.Product.customGroupsDetails;
-
- }
-
-
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/group/details/paging.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> pageProducts(HttpServletRequest request, HttpServletResponse response) {
-
- String code = request.getParameter("code");
- AjaxResponse resp = new AjaxResponse();
-
- try {
-
-
-
- Language language = (Language)request.getAttribute("LANGUAGE");
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
-
- List<ProductRelationship> relationships = productRelationshipService.getByGroup(store, code, language);
-
- for(ProductRelationship relationship : relationships) {
-
- Product product = relationship.getRelatedProduct();
- Map entry = new HashMap();
- entry.put("relationshipId", relationship.getId());
- entry.put("productId", product.getId());
-
- ProductDescription description = product.getDescriptions().iterator().next();
- Set<ProductDescription> descriptions = product.getDescriptions();
- for(ProductDescription desc : descriptions) {
- if(desc.getLanguage().getId().intValue()==language.getId().intValue()) {
- description = desc;
- }
- }
-
- entry.put("name", description.getName());
- entry.put("sku", product.getSku());
- entry.put("available", product.isAvailable());
- resp.addDataEntry(entry);
-
- }
-
-
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
-
- } catch (Exception e) {
- LOGGER.error("Error while paging products", e);
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
-
-
- }
-
-
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/group/details/addItem.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> addItem(HttpServletRequest request, HttpServletResponse response) {
-
- String code = request.getParameter("code");
- String productId = request.getParameter("productId");
- AjaxResponse resp = new AjaxResponse();
-
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
-
- try {
-
-
- Long lProductId = Long.parseLong(productId);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- Product product = productService.getById(lProductId);
-
- if(product==null) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- ProductRelationship relationship = new ProductRelationship();
- relationship.setActive(true);
- relationship.setCode(code);
- relationship.setStore(store);
- relationship.setRelatedProduct(product);
-
- productRelationshipService.saveOrUpdate(relationship);
-
-
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
-
- } catch (Exception e) {
- LOGGER.error("Error while paging products", e);
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
-
- }
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/group/details/removeItem.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> removeItem(HttpServletRequest request, HttpServletResponse response) {
-
- String code = request.getParameter("code");
- String productId = request.getParameter("productId");
- AjaxResponse resp = new AjaxResponse();
-
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
-
- try {
-
-
- Long lproductId = Long.parseLong(productId);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- Product product = productService.getById(lproductId);
-
- if(product==null) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- ProductRelationship relationship = null;
- List<ProductRelationship> relationships = productRelationshipService.getByGroup(store, code);
-
- for(ProductRelationship r : relationships) {
- if(r.getRelatedProduct().getId().longValue()==lproductId.longValue()) {
- relationship = r;
- break;
- }
- }
-
- if(relationship==null) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- if(relationship.getStore().getId().intValue()!=store.getId().intValue()) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
-
-
- productRelationshipService.delete(relationship);
-
-
- resp.setStatus(AjaxPageableResponse.RESPONSE_OPERATION_COMPLETED);
-
- } catch (Exception e) {
- LOGGER.error("Error while paging products", e);
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
-
- }
-
- private void setMenu(Model model, HttpServletRequest request) throws Exception {
-
- //display menu
- Map<String,String> activeMenus = new HashMap<String,String>();
- activeMenus.put("catalogue", "catalogue");
- activeMenus.put("catalogue-products-group", "catalogue-products-group");
-
- @SuppressWarnings("unchecked")
- Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
-
- Menu currentMenu = (Menu)menus.get("catalogue");
- model.addAttribute("currentMenu",currentMenu);
- model.addAttribute("activeMenus",activeMenus);
- //
-
- }
-
-}
+package com.salesmanager.shop.admin.controller.products;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.salesmanager.core.business.services.catalog.category.CategoryService;
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.relationship.ProductRelationshipService;
+import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse;
+import com.salesmanager.core.business.utils.ajax.AjaxResponse;
+import com.salesmanager.core.model.catalog.category.Category;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.description.ProductDescription;
+import com.salesmanager.core.model.catalog.product.relationship.ProductRelationship;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.admin.controller.ControllerConstants;
+import com.salesmanager.shop.admin.model.web.Menu;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.utils.LabelUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.annotation.*;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+
+
+@Controller
+public class CustomProductGroupsController {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(CustomProductGroupsController.class);
+
+ @Inject
+ CategoryService categoryService;
+
+ @Inject
+ ProductService productService;
+
+ @Inject
+ ProductRelationshipService productRelationshipService;
+
+ @Inject
+ LabelUtils messages;
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/groups/list.html", method=RequestMethod.GET)
+ public String displayProductGroups(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ setMenu(model,request);
+
+ Language language = (Language)request.getAttribute("LANGUAGE");
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ ProductRelationship group = new ProductRelationship();
+
+
+ model.addAttribute("group", group);
+
+ return ControllerConstants.Tiles.Product.customGroups;
+
+ }
+
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/groups/paging.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> pageCustomGroups(HttpServletRequest request, HttpServletResponse response) {
+
+
+ AjaxResponse resp = new AjaxResponse();
+
+ try {
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+
+ List<ProductRelationship> relationships = productRelationshipService.getGroups(store);
+
+ for(ProductRelationship relationship : relationships) {
+
+ if(!"FEATURED_ITEM".equals(relationship.getCode())) {//do not add featured items
+
+ Map entry = new HashMap();
+ entry.put("code", relationship.getCode());
+ entry.put("active", relationship.isActive());
+
+ resp.addDataEntry(entry);
+
+ }
+
+ }
+
+
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging products", e);
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+
+ }
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/groups/save.html", method=RequestMethod.POST)
+ public String saveCustomProductGroup(@ModelAttribute("group") ProductRelationship group, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ setMenu(model,request);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+
+ //check if group already exist
+
+
+ if(StringUtils.isBlank(group.getCode())) {
+ FieldError fieldError = new FieldError("group","code",group.getCode(),false,null,null,messages.getMessage("message.group.required",locale));
+ result.addError(fieldError);
+ return ControllerConstants.Tiles.Product.customGroups;
+ }
+
+ //String msg = messages.getMessage("message.group.alerady.exists",locale);
+ //String[] messages = {msg};
+
+ String[] messages = {"message.group.alerady.exists"};
+
+ List<ProductRelationship> groups = productRelationshipService.getGroups(store);
+ for(ProductRelationship grp : groups) {
+ if(grp.getCode().equalsIgnoreCase(group.getCode())) {
+ String[] args = {group.getCode()};
+ FieldError fieldError = new FieldError("group","code",group.getCode(),false,messages,args,null);
+ result.addError(fieldError);
+ }
+ }
+
+ if(result.hasErrors()) {
+ return ControllerConstants.Tiles.Product.customGroups;
+ }
+
+ group.setActive(true);
+ group.setStore(store);
+
+ productRelationshipService.addGroup(store,group.getCode());
+
+
+ model.addAttribute("success","success");
+
+ return ControllerConstants.Tiles.Product.customGroups;
+
+ }
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/groups/remove.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> removeCustomProductGroup(HttpServletRequest request, HttpServletResponse response) {
+
+ String groupCode = request.getParameter("code");
+
+ AjaxResponse resp = new AjaxResponse();
+
+
+ try {
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ productRelationshipService.deleteGroup(store, groupCode);
+ resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while deleting a group", e);
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ }
+
+ String returnString = resp.toJSONString();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+ }
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/groups/update.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> activateProductGroup(HttpServletRequest request, HttpServletResponse response) {
+ String values = request.getParameter("_oldValues");
+ String active = request.getParameter("active");
+
+
+ AjaxResponse resp = new AjaxResponse();
+
+ try {
+
+ ObjectMapper mapper = new ObjectMapper();
+ @SuppressWarnings("rawtypes")
+ Map conf = mapper.readValue(values, Map.class);
+ String groupCode = (String)conf.get("code");
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ //get groups
+ List<ProductRelationship> groups = productRelationshipService.getGroups(store);
+
+ for(ProductRelationship relation : groups) {
+ if(relation.getCode().equals(groupCode)) {
+ if("true".equals(active)) {
+ relation.setActive(true);
+ } else {
+ relation.setActive(false);
+ }
+ productRelationshipService.saveOrUpdate(relation);
+ }
+ }
+ resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while updateing groups", e);
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ }
+
+ String returnString = resp.toJSONString();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/group/edit.html", method=RequestMethod.GET)
+ public String displayCustomProductGroup(@RequestParam("id") String groupCode, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ setMenu(model,request);
+
+ Language language = (Language)request.getAttribute("LANGUAGE");
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ List<Category> categories = categoryService.listByStore(store,language);//for categories
+
+
+ model.addAttribute("group", groupCode);
+ model.addAttribute("categories", categories);
+ return ControllerConstants.Tiles.Product.customGroupsDetails;
+
+ }
+
+
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/group/details/paging.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> pageProducts(HttpServletRequest request, HttpServletResponse response) {
+
+ String code = request.getParameter("code");
+ AjaxResponse resp = new AjaxResponse();
+
+ try {
+
+
+
+ Language language = (Language)request.getAttribute("LANGUAGE");
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+
+ List<ProductRelationship> relationships = productRelationshipService.getByGroup(store, code, language);
+
+ for(ProductRelationship relationship : relationships) {
+
+ Product product = relationship.getRelatedProduct();
+ Map entry = new HashMap();
+ entry.put("relationshipId", relationship.getId());
+ entry.put("productId", product.getId());
+
+ ProductDescription description = product.getDescriptions().iterator().next();
+ Set<ProductDescription> descriptions = product.getDescriptions();
+ for(ProductDescription desc : descriptions) {
+ if(desc.getLanguage().getId().intValue()==language.getId().intValue()) {
+ description = desc;
+ }
+ }
+
+ entry.put("name", description.getName());
+ entry.put("sku", product.getSku());
+ entry.put("available", product.isAvailable());
+ resp.addDataEntry(entry);
+
+ }
+
+
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging products", e);
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+
+ }
+
+
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/group/details/addItem.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> addItem(HttpServletRequest request, HttpServletResponse response) {
+
+ String code = request.getParameter("code");
+ String productId = request.getParameter("productId");
+ AjaxResponse resp = new AjaxResponse();
+
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+ try {
+
+
+ Long lProductId = Long.parseLong(productId);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ Product product = productService.getById(lProductId);
+
+ if(product==null) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ ProductRelationship relationship = new ProductRelationship();
+ relationship.setActive(true);
+ relationship.setCode(code);
+ relationship.setStore(store);
+ relationship.setRelatedProduct(product);
+
+ productRelationshipService.saveOrUpdate(relationship);
+
+
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging products", e);
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+ }
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/group/details/removeItem.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> removeItem(HttpServletRequest request, HttpServletResponse response) {
+
+ String code = request.getParameter("code");
+ String productId = request.getParameter("productId");
+ AjaxResponse resp = new AjaxResponse();
+
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+ try {
+
+
+ Long lproductId = Long.parseLong(productId);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ Product product = productService.getById(lproductId);
+
+ if(product==null) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ ProductRelationship relationship = null;
+ List<ProductRelationship> relationships = productRelationshipService.getByGroup(store, code);
+
+ for(ProductRelationship r : relationships) {
+ if(r.getRelatedProduct().getId().longValue()==lproductId.longValue()) {
+ relationship = r;
+ break;
+ }
+ }
+
+ if(relationship==null) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ if(relationship.getStore().getId().intValue()!=store.getId().intValue()) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+
+
+ productRelationshipService.delete(relationship);
+
+
+ resp.setStatus(AjaxPageableResponse.RESPONSE_OPERATION_COMPLETED);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging products", e);
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+ }
+
+ private void setMenu(Model model, HttpServletRequest request) throws Exception {
+
+ //display menu
+ Map<String,String> activeMenus = new HashMap<String,String>();
+ activeMenus.put("catalogue", "catalogue");
+ activeMenus.put("catalogue-products-group", "catalogue-products-group");
+
+ @SuppressWarnings("unchecked")
+ Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
+
+ Menu currentMenu = (Menu)menus.get("catalogue");
+ model.addAttribute("currentMenu",currentMenu);
+ model.addAttribute("activeMenus",activeMenus);
+ //
+
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/FeaturedItemsController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/FeaturedItemsController.java
index f80781c..ae7b7a2 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/FeaturedItemsController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/FeaturedItemsController.java
@@ -1,273 +1,273 @@
-package com.salesmanager.shop.admin.controller.products;
-
-import com.salesmanager.core.business.services.catalog.category.CategoryService;
-import com.salesmanager.core.business.services.catalog.product.ProductService;
-import com.salesmanager.core.business.services.catalog.product.relationship.ProductRelationshipService;
-import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse;
-import com.salesmanager.core.business.utils.ajax.AjaxResponse;
-import com.salesmanager.core.model.catalog.category.Category;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.description.ProductDescription;
-import com.salesmanager.core.model.catalog.product.relationship.ProductRelationship;
-import com.salesmanager.core.model.catalog.product.relationship.ProductRelationshipType;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.admin.model.web.Menu;
-import com.salesmanager.shop.constants.Constants;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-
-@Controller
-public class FeaturedItemsController {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(FeaturedItemsController.class);
-
- @Inject
- CategoryService categoryService;
-
- @Inject
- ProductService productService;
-
- @Inject
- ProductRelationshipService productRelationshipService;
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/catalogue/featured/list.html", method=RequestMethod.GET)
- public String displayFeaturedItems(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
- setMenu(model,request);
-
- Language language = (Language)request.getAttribute("LANGUAGE");
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- List<Category> categories = categoryService.listByStore(store,language);
-
- model.addAttribute("categories", categories);
- return "admin-catalogue-featured";
-
- }
-
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/catalogue/featured/paging.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> pageProducts(HttpServletRequest request, HttpServletResponse response) {
-
-
- AjaxResponse resp = new AjaxResponse();
-
- try {
-
-
-
- Language language = (Language)request.getAttribute("LANGUAGE");
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
-
- List<ProductRelationship> relationships = productRelationshipService.getByType(store, ProductRelationshipType.FEATURED_ITEM, language);
-
- for(ProductRelationship relationship : relationships) {
-
- Product product = relationship.getRelatedProduct();
- Map entry = new HashMap();
- entry.put("relationshipId", relationship.getId());
- entry.put("productId", product.getId());
-
- ProductDescription description = product.getDescriptions().iterator().next();
- Set<ProductDescription> descriptions = product.getDescriptions();
- for(ProductDescription desc : descriptions) {
- if(desc.getLanguage().getId().intValue()==language.getId().intValue()) {
- description = desc;
- }
- }
-
- entry.put("name", description.getName());
- entry.put("sku", product.getSku());
- entry.put("available", product.isAvailable());
- resp.addDataEntry(entry);
-
- }
-
-
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
-
- } catch (Exception e) {
- LOGGER.error("Error while paging products", e);
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
-
-
- }
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/catalogue/featured/addItem.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> addItem(HttpServletRequest request, HttpServletResponse response) {
-
- String productId = request.getParameter("productId");
- AjaxResponse resp = new AjaxResponse();
-
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
-
-
- try {
-
-
- Long lProductId = Long.parseLong(productId);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- Product product = productService.getById(lProductId);
-
- if(product==null) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- ProductRelationship relationship = new ProductRelationship();
- relationship.setActive(true);
- relationship.setCode(ProductRelationshipType.FEATURED_ITEM.name());
- relationship.setStore(store);
- relationship.setRelatedProduct(product);
-
- productRelationshipService.saveOrUpdate(relationship);
-
-
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
-
- } catch (Exception e) {
- LOGGER.error("Error while paging products", e);
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
-
- }
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/catalogue/featured/removeItem.html&removeEntity=FEATURED", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> removeItem(HttpServletRequest request, HttpServletResponse response) {
-
- String productId = request.getParameter("productId");
- AjaxResponse resp = new AjaxResponse();
-
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
-
- try {
-
-
- Long lproductId = Long.parseLong(productId);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- Product product = productService.getById(lproductId);
-
- if(product==null) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- ProductRelationship relationship = null;
- List<ProductRelationship> relationships = productRelationshipService.getByType(store, ProductRelationshipType.FEATURED_ITEM);
-
- for(ProductRelationship r : relationships) {
- if(r.getRelatedProduct().getId().longValue()==lproductId.longValue()) {
- relationship = r;
- }
- }
-
- if(relationship==null) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- if(relationship.getStore().getId().intValue()!=store.getId().intValue()) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
-
-
- productRelationshipService.delete(relationship);
-
-
- resp.setStatus(AjaxPageableResponse.RESPONSE_OPERATION_COMPLETED);
-
- } catch (Exception e) {
- LOGGER.error("Error while paging products", e);
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
-
- }
-
-
- private void setMenu(Model model, HttpServletRequest request) throws Exception {
-
- //display menu
- Map<String,String> activeMenus = new HashMap<String,String>();
- activeMenus.put("catalogue", "catalogue");
- activeMenus.put("catalogue-products-group", "catalogue-products-group");
-
- @SuppressWarnings("unchecked")
- Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
-
- Menu currentMenu = (Menu)menus.get("catalogue");
- model.addAttribute("currentMenu",currentMenu);
- model.addAttribute("activeMenus",activeMenus);
- //
-
- }
-
-}
+package com.salesmanager.shop.admin.controller.products;
+
+import com.salesmanager.core.business.services.catalog.category.CategoryService;
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.relationship.ProductRelationshipService;
+import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse;
+import com.salesmanager.core.business.utils.ajax.AjaxResponse;
+import com.salesmanager.core.model.catalog.category.Category;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.description.ProductDescription;
+import com.salesmanager.core.model.catalog.product.relationship.ProductRelationship;
+import com.salesmanager.core.model.catalog.product.relationship.ProductRelationshipType;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.admin.model.web.Menu;
+import com.salesmanager.shop.constants.Constants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+
+@Controller
+public class FeaturedItemsController {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(FeaturedItemsController.class);
+
+ @Inject
+ CategoryService categoryService;
+
+ @Inject
+ ProductService productService;
+
+ @Inject
+ ProductRelationshipService productRelationshipService;
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/catalogue/featured/list.html", method=RequestMethod.GET)
+ public String displayFeaturedItems(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ setMenu(model,request);
+
+ Language language = (Language)request.getAttribute("LANGUAGE");
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ List<Category> categories = categoryService.listByStore(store,language);
+
+ model.addAttribute("categories", categories);
+ return "admin-catalogue-featured";
+
+ }
+
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/catalogue/featured/paging.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> pageProducts(HttpServletRequest request, HttpServletResponse response) {
+
+
+ AjaxResponse resp = new AjaxResponse();
+
+ try {
+
+
+
+ Language language = (Language)request.getAttribute("LANGUAGE");
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+
+ List<ProductRelationship> relationships = productRelationshipService.getByType(store, ProductRelationshipType.FEATURED_ITEM, language);
+
+ for(ProductRelationship relationship : relationships) {
+
+ Product product = relationship.getRelatedProduct();
+ Map entry = new HashMap();
+ entry.put("relationshipId", relationship.getId());
+ entry.put("productId", product.getId());
+
+ ProductDescription description = product.getDescriptions().iterator().next();
+ Set<ProductDescription> descriptions = product.getDescriptions();
+ for(ProductDescription desc : descriptions) {
+ if(desc.getLanguage().getId().intValue()==language.getId().intValue()) {
+ description = desc;
+ }
+ }
+
+ entry.put("name", description.getName());
+ entry.put("sku", product.getSku());
+ entry.put("available", product.isAvailable());
+ resp.addDataEntry(entry);
+
+ }
+
+
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging products", e);
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+
+ }
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/catalogue/featured/addItem.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> addItem(HttpServletRequest request, HttpServletResponse response) {
+
+ String productId = request.getParameter("productId");
+ AjaxResponse resp = new AjaxResponse();
+
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+
+ try {
+
+
+ Long lProductId = Long.parseLong(productId);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ Product product = productService.getById(lProductId);
+
+ if(product==null) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ ProductRelationship relationship = new ProductRelationship();
+ relationship.setActive(true);
+ relationship.setCode(ProductRelationshipType.FEATURED_ITEM.name());
+ relationship.setStore(store);
+ relationship.setRelatedProduct(product);
+
+ productRelationshipService.saveOrUpdate(relationship);
+
+
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging products", e);
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+ }
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/catalogue/featured/removeItem.html&removeEntity=FEATURED", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> removeItem(HttpServletRequest request, HttpServletResponse response) {
+
+ String productId = request.getParameter("productId");
+ AjaxResponse resp = new AjaxResponse();
+
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+ try {
+
+
+ Long lproductId = Long.parseLong(productId);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ Product product = productService.getById(lproductId);
+
+ if(product==null) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ ProductRelationship relationship = null;
+ List<ProductRelationship> relationships = productRelationshipService.getByType(store, ProductRelationshipType.FEATURED_ITEM);
+
+ for(ProductRelationship r : relationships) {
+ if(r.getRelatedProduct().getId().longValue()==lproductId.longValue()) {
+ relationship = r;
+ }
+ }
+
+ if(relationship==null) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ if(relationship.getStore().getId().intValue()!=store.getId().intValue()) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+
+
+ productRelationshipService.delete(relationship);
+
+
+ resp.setStatus(AjaxPageableResponse.RESPONSE_OPERATION_COMPLETED);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging products", e);
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+ }
+
+
+ private void setMenu(Model model, HttpServletRequest request) throws Exception {
+
+ //display menu
+ Map<String,String> activeMenus = new HashMap<String,String>();
+ activeMenus.put("catalogue", "catalogue");
+ activeMenus.put("catalogue-products-group", "catalogue-products-group");
+
+ @SuppressWarnings("unchecked")
+ Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
+
+ Menu currentMenu = (Menu)menus.get("catalogue");
+ model.addAttribute("currentMenu",currentMenu);
+ model.addAttribute("activeMenus",activeMenus);
+ //
+
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/ManufacturerController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/ManufacturerController.java
index 267d98d..c11a581 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/ManufacturerController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/ManufacturerController.java
@@ -1,501 +1,501 @@
-package com.salesmanager.shop.admin.controller.products;
-
-import com.salesmanager.core.business.services.catalog.product.manufacturer.ManufacturerService;
-import com.salesmanager.core.business.services.reference.language.LanguageService;
-import com.salesmanager.core.business.utils.CoreConfiguration;
-import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse;
-import com.salesmanager.core.business.utils.ajax.AjaxResponse;
-import com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer;
-import com.salesmanager.core.model.catalog.product.manufacturer.ManufacturerDescription;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.admin.controller.ControllerConstants;
-import com.salesmanager.shop.admin.controller.customers.CustomerController;
-import com.salesmanager.shop.admin.model.web.Menu;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.utils.LabelUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.BindingResult;
-import org.springframework.validation.ObjectError;
-import org.springframework.web.bind.annotation.*;
-
-import javax.imageio.ImageIO;
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
-import java.awt.image.BufferedImage;
-import java.util.*;
-
-@Controller
-public class ManufacturerController {
-
- @Inject
- private LanguageService languageService;
-
- @Inject
- private ManufacturerService manufacturerService;
-
- @Inject
- LabelUtils messages;
-
- @Inject
- private CoreConfiguration configuration;
-
- private static final Logger LOGGER = LoggerFactory.getLogger(CustomerController.class);
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/catalogue/manufacturer/list.html", method=RequestMethod.GET)
- public String getManufacturers(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
- this.setMenu(model, request);
-
- return ControllerConstants.Tiles.Product.manufacturerList;
- }
-
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/catalogue/manufacturer/create.html", method=RequestMethod.GET)
- public String createManufacturer( Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
- return displayManufacturer(null,model,request,response);
- }
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/catalogue/manufacturer/edit.html", method=RequestMethod.GET)
- public String editManufacturer(@RequestParam("id") long manufacturerId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
- return displayManufacturer(manufacturerId,model,request,response);
- }
-
- private String displayManufacturer(Long manufacturerId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
- //display menu
- setMenu(model,request);
-
- //List<Language> languages = languageService.getLanguages();
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- List<Language> languages = store.getLanguages();
-
-
- com.salesmanager.shop.admin.model.catalog.Manufacturer manufacturer = new com.salesmanager.shop.admin.model.catalog.Manufacturer();
- List<ManufacturerDescription> descriptions = new ArrayList<ManufacturerDescription>();
-
-
- if( manufacturerId!=null && manufacturerId.longValue()!=0) { //edit mode
-
- Manufacturer dbManufacturer = new Manufacturer();
- dbManufacturer = manufacturerService.getById( manufacturerId );
-
- if(dbManufacturer==null) {
- return ControllerConstants.Tiles.Product.manufacturerList;
- }
-
- if(dbManufacturer.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- return ControllerConstants.Tiles.Product.manufacturerList;
- }
-
- Set<ManufacturerDescription> manufacturerDescriptions = dbManufacturer.getDescriptions();
-
-
- for(Language l : languages) {
-
- ManufacturerDescription manufDescription = null;
- if(manufacturerDescriptions!=null) {
-
- for(ManufacturerDescription desc : manufacturerDescriptions) {
- String code = desc.getLanguage().getCode();
- if(code.equals(l.getCode())) {
- manufDescription = desc;
- }
-
- }
-
- }
-
- if(manufDescription==null) {
- manufDescription = new ManufacturerDescription();
- manufDescription.setLanguage(l);
- }
-
- manufacturer.getDescriptions().add(manufDescription);
-
- }
-
- manufacturer.setManufacturer( dbManufacturer );
-
- manufacturer.setCode(dbManufacturer.getCode());
- manufacturer.setOrder( dbManufacturer.getOrder() );
-
- } else { // Create mode
-
- Manufacturer manufacturerTmp = new Manufacturer();
- manufacturer.setManufacturer( manufacturerTmp );
-
- for(Language l : languages) {// for each store language
-
- ManufacturerDescription manufacturerDesc = new ManufacturerDescription();
- manufacturerDesc.setLanguage(l);
- descriptions.add( manufacturerDesc );
- manufacturer.setDescriptions(descriptions);
-
- }
- }
-
- model.addAttribute("languages",languages);
- model.addAttribute("manufacturer", manufacturer);
-
- return ControllerConstants.Tiles.Product.manufacturerDetails;
- }
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/catalogue/manufacturer/save.html", method=RequestMethod.POST)
- public String saveManufacturer( @Valid @ModelAttribute("manufacturer") com.salesmanager.shop.admin.model.catalog.Manufacturer manufacturer, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- this.setMenu(model, request);
- //save or edit a manufacturer
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- List<Language> languages = languageService.getLanguages();
-
- if(manufacturer.getDescriptions()!=null && manufacturer.getDescriptions().size()>0) {
-
- for(ManufacturerDescription description : manufacturer.getDescriptions()) {
-
- //validate Url Clicked
-/* if ( description.getUrlClicked() != null && !description.getUrlClicked().toString().isEmpty()) {
- try{
- Integer.parseInt( description.getUrlClicked().toString() );
-
- } catch (Exception e) {
-
- ObjectError error = new ObjectError("descriptions[${counter.index}].urlClicked","URL Clicked must be a number");
- result.addError(error);
- }
- }*/
- }
- }
-
-
- //validate image
- if(manufacturer.getImage()!=null && !manufacturer.getImage().isEmpty()) {
-
- try {
-
- String maxHeight = configuration.getProperty("PRODUCT_IMAGE_MAX_HEIGHT_SIZE");
- String maxWidth = configuration.getProperty("PRODUCT_IMAGE_MAX_WIDTH_SIZE");
- String maxSize = configuration.getProperty("PRODUCT_IMAGE_MAX_SIZE");
-
- BufferedImage image = ImageIO.read(manufacturer.getImage().getInputStream());
-
- if(!StringUtils.isBlank(maxHeight)) {
-
- int maxImageHeight = Integer.parseInt(maxHeight);
- if(image.getHeight()>maxImageHeight) {
- ObjectError error = new ObjectError("image",messages.getMessage("message.image.height", locale) + " {"+maxHeight+"}");
- result.addError(error);
- }
- }
-
- if(!StringUtils.isBlank(maxWidth)) {
-
- int maxImageWidth = Integer.parseInt(maxWidth);
- if(image.getWidth()>maxImageWidth) {
- ObjectError error = new ObjectError("image",messages.getMessage("message.image.width", locale) + " {"+maxWidth+"}");
- result.addError(error);
- }
- }
-
- if(!StringUtils.isBlank(maxSize)) {
-
- int maxImageSize = Integer.parseInt(maxSize);
- if(manufacturer.getImage().getSize()>maxImageSize) {
- ObjectError error = new ObjectError("image",messages.getMessage("message.image.size", locale) + " {"+maxSize+"}");
- result.addError(error);
- }
- }
-
- } catch (Exception e) {
- LOGGER.error("Cannot validate manufacturer image", e);
- }
-
- }
-
- if (result.hasErrors()) {
- model.addAttribute("languages",languages);
- return ControllerConstants.Tiles.Product.manufacturerDetails;
- }
-
- Manufacturer newManufacturer = manufacturer.getManufacturer();
-
- if ( manufacturer.getManufacturer().getId() !=null && manufacturer.getManufacturer().getId() > 0 ){
-
- newManufacturer = manufacturerService.getById( manufacturer.getManufacturer().getId() );
-
- if(newManufacturer.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- return ControllerConstants.Tiles.Product.manufacturerList;
- }
-
- }
-
-// for(ManufacturerImage image : manufacturer.getImages()) {
-// if(image.isDefaultImage()) {
-// manufacturer.setProductImage(image);
-// }
-// }
-
- Set<ManufacturerDescription> descriptions = new HashSet<ManufacturerDescription>();
- if(manufacturer.getDescriptions()!=null && manufacturer.getDescriptions().size()>0) {
-
- for(ManufacturerDescription desc : manufacturer.getDescriptions()) {
-
- desc.setManufacturer(newManufacturer);
- descriptions.add(desc);
- }
- }
- newManufacturer.setDescriptions(descriptions );
- newManufacturer.setOrder( manufacturer.getOrder() );
- newManufacturer.setMerchantStore(store);
- newManufacturer.setCode(manufacturer.getCode());
-
-
-// if(manufacturer.getManufacturerImage()!=null && manufacturer.getManufacturerImage().getId() == null) {
-// newManufacturer.setProductImage(null);
-// }
-
-
-
- if(manufacturer.getImage()!=null && !manufacturer.getImage().isEmpty()) {
-//
-// String imageName = manufacturer.getImage().getOriginalFilename();
-//
-// ManufacturerImage manufacturerImage = new ManufacturerImage();
-// manufacturerImage.setDefaultImage(true);
-// manufacturerImage.setImage(manufacturer.getImage().getInputStream());
-// manufacturerImage.setManufacturerImage(imageName);
-//
-// List<ManufacturerImageDescription> imagesDescriptions = new ArrayList<ManufacturerImageDescription>();
-//
-// for(Language l : languages) {
-//
-// ManufacturerImageDescription imageDescription = new ManufacturerImageDescription();
-// imageDescription.setName(imageName);
-// imageDescription.setLanguage(l);
-// imageDescription.setManufacturerImage(productImage);
-// imagesDescriptions.add(imageDescription);
-//
-// }
-//
-// manufacturerImage.setDescriptions(imagesDescriptions);
-// manufacturerImage.setProduct(newManufacturer);
-//
-// newManufacturer.getImages().add(manufacturerImage);
-//
-// manufacturerService.saveOrUpdate(newManufacturer);
-//
-// //manufacturer displayed
-// manufacturer.setProductImage(manufacturerImage);
-
-
- } else {
-
- manufacturerService.saveOrUpdate(newManufacturer);
- }
-
- model.addAttribute("manufacturer", manufacturer);
- model.addAttribute("languages",languages);
- model.addAttribute("success","success");
-
- return ControllerConstants.Tiles.Product.manufacturerDetails;
-
- }
-
-
- @SuppressWarnings("unchecked")
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/catalogue/manufacturer/paging.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> pageManufacturers(HttpServletRequest request, HttpServletResponse response) {
-
- AjaxResponse resp = new AjaxResponse();
- try {
-
- Language language = (Language)request.getAttribute("LANGUAGE");
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- List<Manufacturer> manufacturers = null;
- manufacturers = manufacturerService.listByStore(store, language);
-
-
- for(Manufacturer manufacturer : manufacturers) {
-
- @SuppressWarnings("rawtypes")
- Map entry = new HashMap();
- entry.put("id", manufacturer.getId());
-
- ManufacturerDescription description = manufacturer.getDescriptions().iterator().next();
-
- entry.put("name", description.getName());
- entry.put("code", manufacturer.getCode());
- entry.put("order", manufacturer.getOrder());
- resp.addDataEntry(entry);
-
- }
-
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
-
- } catch (Exception e) {
- LOGGER.error("Error while paging Manufacturers", e);
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- }
-
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
-
- String returnString = resp.toJSONString();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
-
- }
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/catalogue/manufacturer/remove.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> deleteManufacturer(HttpServletRequest request, HttpServletResponse response, Locale locale) {
- Long sid = Long.valueOf(request.getParameter("id") );
-
-
- AjaxResponse resp = new AjaxResponse();
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
-
- try{
- Manufacturer delManufacturer = manufacturerService.getById( sid );
- if(delManufacturer==null || delManufacturer.getMerchantStore().getId().intValue() != store.getId().intValue()) {
- resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- int count = manufacturerService.getCountManufAttachedProducts( delManufacturer ).intValue();
- //IF already attached to products it can't be deleted
- if ( count > 0 ){
- resp.setStatusMessage(messages.getMessage("message.product.association", locale));
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- manufacturerService.delete( delManufacturer );
-
- resp.setStatusMessage(messages.getMessage("message.success", locale));
- resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
-
- } catch (Exception e) {
-
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- LOGGER.error("Cannot delete manufacturer.", e);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
-
- }
-
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/manufacturer/checkCode.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> checkCode(HttpServletRequest request, HttpServletResponse response, Locale locale) {
- String code = request.getParameter("code");
- String id = request.getParameter("id");
-
-
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
-
- AjaxResponse resp = new AjaxResponse();
-
- if(StringUtils.isBlank(code)) {
- resp.setStatus(AjaxResponse.CODE_ALREADY_EXIST);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- try {
-
- Manufacturer manufacturer = manufacturerService.getByCode(store, code);
-
- if(manufacturer!=null && StringUtils.isBlank(id)) {
- resp.setStatus(AjaxResponse.CODE_ALREADY_EXIST);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- if(manufacturer!=null && !StringUtils.isBlank(id)) {
- try {
- Long lid = Long.parseLong(id);
-
- if(manufacturer.getCode().equals(code) && manufacturer.getId().longValue()==lid) {
- resp.setStatus(AjaxResponse.CODE_ALREADY_EXIST);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
- } catch (Exception e) {
- resp.setStatus(AjaxResponse.CODE_ALREADY_EXIST);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- }
-
-
-
-
-
-
-
-
-
-
- resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
-
- } catch (Exception e) {
- LOGGER.error("Error while getting category", e);
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
-
- private void setMenu(Model model, HttpServletRequest request) throws Exception {
- //display menu
- Map<String,String> activeMenus = new HashMap<String,String>();
- activeMenus.put("catalogue", "catalogue");
- activeMenus.put("manufacturer-list", "manufacturer-list");
-
- @SuppressWarnings("unchecked")
- Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
-
- Menu currentMenu = (Menu)menus.get("catalogue");
- model.addAttribute("currentMenu",currentMenu);
- model.addAttribute("activeMenus",activeMenus);
- }
-
-}
+package com.salesmanager.shop.admin.controller.products;
+
+import com.salesmanager.core.business.services.catalog.product.manufacturer.ManufacturerService;
+import com.salesmanager.core.business.services.reference.language.LanguageService;
+import com.salesmanager.core.business.utils.CoreConfiguration;
+import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse;
+import com.salesmanager.core.business.utils.ajax.AjaxResponse;
+import com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer;
+import com.salesmanager.core.model.catalog.product.manufacturer.ManufacturerDescription;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.admin.controller.ControllerConstants;
+import com.salesmanager.shop.admin.controller.customers.CustomerController;
+import com.salesmanager.shop.admin.model.web.Menu;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.utils.LabelUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.annotation.*;
+
+import javax.imageio.ImageIO;
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.awt.image.BufferedImage;
+import java.util.*;
+
+@Controller
+public class ManufacturerController {
+
+ @Inject
+ private LanguageService languageService;
+
+ @Inject
+ private ManufacturerService manufacturerService;
+
+ @Inject
+ LabelUtils messages;
+
+ @Inject
+ private CoreConfiguration configuration;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(CustomerController.class);
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/catalogue/manufacturer/list.html", method=RequestMethod.GET)
+ public String getManufacturers(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ this.setMenu(model, request);
+
+ return ControllerConstants.Tiles.Product.manufacturerList;
+ }
+
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/catalogue/manufacturer/create.html", method=RequestMethod.GET)
+ public String createManufacturer( Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ return displayManufacturer(null,model,request,response);
+ }
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/catalogue/manufacturer/edit.html", method=RequestMethod.GET)
+ public String editManufacturer(@RequestParam("id") long manufacturerId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ return displayManufacturer(manufacturerId,model,request,response);
+ }
+
+ private String displayManufacturer(Long manufacturerId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ //display menu
+ setMenu(model,request);
+
+ //List<Language> languages = languageService.getLanguages();
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ List<Language> languages = store.getLanguages();
+
+
+ com.salesmanager.shop.admin.model.catalog.Manufacturer manufacturer = new com.salesmanager.shop.admin.model.catalog.Manufacturer();
+ List<ManufacturerDescription> descriptions = new ArrayList<ManufacturerDescription>();
+
+
+ if( manufacturerId!=null && manufacturerId.longValue()!=0) { //edit mode
+
+ Manufacturer dbManufacturer = new Manufacturer();
+ dbManufacturer = manufacturerService.getById( manufacturerId );
+
+ if(dbManufacturer==null) {
+ return ControllerConstants.Tiles.Product.manufacturerList;
+ }
+
+ if(dbManufacturer.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ return ControllerConstants.Tiles.Product.manufacturerList;
+ }
+
+ Set<ManufacturerDescription> manufacturerDescriptions = dbManufacturer.getDescriptions();
+
+
+ for(Language l : languages) {
+
+ ManufacturerDescription manufDescription = null;
+ if(manufacturerDescriptions!=null) {
+
+ for(ManufacturerDescription desc : manufacturerDescriptions) {
+ String code = desc.getLanguage().getCode();
+ if(code.equals(l.getCode())) {
+ manufDescription = desc;
+ }
+
+ }
+
+ }
+
+ if(manufDescription==null) {
+ manufDescription = new ManufacturerDescription();
+ manufDescription.setLanguage(l);
+ }
+
+ manufacturer.getDescriptions().add(manufDescription);
+
+ }
+
+ manufacturer.setManufacturer( dbManufacturer );
+
+ manufacturer.setCode(dbManufacturer.getCode());
+ manufacturer.setOrder( dbManufacturer.getOrder() );
+
+ } else { // Create mode
+
+ Manufacturer manufacturerTmp = new Manufacturer();
+ manufacturer.setManufacturer( manufacturerTmp );
+
+ for(Language l : languages) {// for each store language
+
+ ManufacturerDescription manufacturerDesc = new ManufacturerDescription();
+ manufacturerDesc.setLanguage(l);
+ descriptions.add( manufacturerDesc );
+ manufacturer.setDescriptions(descriptions);
+
+ }
+ }
+
+ model.addAttribute("languages",languages);
+ model.addAttribute("manufacturer", manufacturer);
+
+ return ControllerConstants.Tiles.Product.manufacturerDetails;
+ }
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/catalogue/manufacturer/save.html", method=RequestMethod.POST)
+ public String saveManufacturer( @Valid @ModelAttribute("manufacturer") com.salesmanager.shop.admin.model.catalog.Manufacturer manufacturer, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ this.setMenu(model, request);
+ //save or edit a manufacturer
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ List<Language> languages = languageService.getLanguages();
+
+ if(manufacturer.getDescriptions()!=null && manufacturer.getDescriptions().size()>0) {
+
+ for(ManufacturerDescription description : manufacturer.getDescriptions()) {
+
+ //validate Url Clicked
+/* if ( description.getUrlClicked() != null && !description.getUrlClicked().toString().isEmpty()) {
+ try{
+ Integer.parseInt( description.getUrlClicked().toString() );
+
+ } catch (Exception e) {
+
+ ObjectError error = new ObjectError("descriptions[${counter.index}].urlClicked","URL Clicked must be a number");
+ result.addError(error);
+ }
+ }*/
+ }
+ }
+
+
+ //validate image
+ if(manufacturer.getImage()!=null && !manufacturer.getImage().isEmpty()) {
+
+ try {
+
+ String maxHeight = configuration.getProperty("PRODUCT_IMAGE_MAX_HEIGHT_SIZE");
+ String maxWidth = configuration.getProperty("PRODUCT_IMAGE_MAX_WIDTH_SIZE");
+ String maxSize = configuration.getProperty("PRODUCT_IMAGE_MAX_SIZE");
+
+ BufferedImage image = ImageIO.read(manufacturer.getImage().getInputStream());
+
+ if(!StringUtils.isBlank(maxHeight)) {
+
+ int maxImageHeight = Integer.parseInt(maxHeight);
+ if(image.getHeight()>maxImageHeight) {
+ ObjectError error = new ObjectError("image",messages.getMessage("message.image.height", locale) + " {"+maxHeight+"}");
+ result.addError(error);
+ }
+ }
+
+ if(!StringUtils.isBlank(maxWidth)) {
+
+ int maxImageWidth = Integer.parseInt(maxWidth);
+ if(image.getWidth()>maxImageWidth) {
+ ObjectError error = new ObjectError("image",messages.getMessage("message.image.width", locale) + " {"+maxWidth+"}");
+ result.addError(error);
+ }
+ }
+
+ if(!StringUtils.isBlank(maxSize)) {
+
+ int maxImageSize = Integer.parseInt(maxSize);
+ if(manufacturer.getImage().getSize()>maxImageSize) {
+ ObjectError error = new ObjectError("image",messages.getMessage("message.image.size", locale) + " {"+maxSize+"}");
+ result.addError(error);
+ }
+ }
+
+ } catch (Exception e) {
+ LOGGER.error("Cannot validate manufacturer image", e);
+ }
+
+ }
+
+ if (result.hasErrors()) {
+ model.addAttribute("languages",languages);
+ return ControllerConstants.Tiles.Product.manufacturerDetails;
+ }
+
+ Manufacturer newManufacturer = manufacturer.getManufacturer();
+
+ if ( manufacturer.getManufacturer().getId() !=null && manufacturer.getManufacturer().getId() > 0 ){
+
+ newManufacturer = manufacturerService.getById( manufacturer.getManufacturer().getId() );
+
+ if(newManufacturer.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ return ControllerConstants.Tiles.Product.manufacturerList;
+ }
+
+ }
+
+// for(ManufacturerImage image : manufacturer.getImages()) {
+// if(image.isDefaultImage()) {
+// manufacturer.setProductImage(image);
+// }
+// }
+
+ Set<ManufacturerDescription> descriptions = new HashSet<ManufacturerDescription>();
+ if(manufacturer.getDescriptions()!=null && manufacturer.getDescriptions().size()>0) {
+
+ for(ManufacturerDescription desc : manufacturer.getDescriptions()) {
+
+ desc.setManufacturer(newManufacturer);
+ descriptions.add(desc);
+ }
+ }
+ newManufacturer.setDescriptions(descriptions );
+ newManufacturer.setOrder( manufacturer.getOrder() );
+ newManufacturer.setMerchantStore(store);
+ newManufacturer.setCode(manufacturer.getCode());
+
+
+// if(manufacturer.getManufacturerImage()!=null && manufacturer.getManufacturerImage().getId() == null) {
+// newManufacturer.setProductImage(null);
+// }
+
+
+
+ if(manufacturer.getImage()!=null && !manufacturer.getImage().isEmpty()) {
+//
+// String imageName = manufacturer.getImage().getOriginalFilename();
+//
+// ManufacturerImage manufacturerImage = new ManufacturerImage();
+// manufacturerImage.setDefaultImage(true);
+// manufacturerImage.setImage(manufacturer.getImage().getInputStream());
+// manufacturerImage.setManufacturerImage(imageName);
+//
+// List<ManufacturerImageDescription> imagesDescriptions = new ArrayList<ManufacturerImageDescription>();
+//
+// for(Language l : languages) {
+//
+// ManufacturerImageDescription imageDescription = new ManufacturerImageDescription();
+// imageDescription.setName(imageName);
+// imageDescription.setLanguage(l);
+// imageDescription.setManufacturerImage(productImage);
+// imagesDescriptions.add(imageDescription);
+//
+// }
+//
+// manufacturerImage.setDescriptions(imagesDescriptions);
+// manufacturerImage.setProduct(newManufacturer);
+//
+// newManufacturer.getImages().add(manufacturerImage);
+//
+// manufacturerService.saveOrUpdate(newManufacturer);
+//
+// //manufacturer displayed
+// manufacturer.setProductImage(manufacturerImage);
+
+
+ } else {
+
+ manufacturerService.saveOrUpdate(newManufacturer);
+ }
+
+ model.addAttribute("manufacturer", manufacturer);
+ model.addAttribute("languages",languages);
+ model.addAttribute("success","success");
+
+ return ControllerConstants.Tiles.Product.manufacturerDetails;
+
+ }
+
+
+ @SuppressWarnings("unchecked")
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/catalogue/manufacturer/paging.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> pageManufacturers(HttpServletRequest request, HttpServletResponse response) {
+
+ AjaxResponse resp = new AjaxResponse();
+ try {
+
+ Language language = (Language)request.getAttribute("LANGUAGE");
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ List<Manufacturer> manufacturers = null;
+ manufacturers = manufacturerService.listByStore(store, language);
+
+
+ for(Manufacturer manufacturer : manufacturers) {
+
+ @SuppressWarnings("rawtypes")
+ Map entry = new HashMap();
+ entry.put("id", manufacturer.getId());
+
+ ManufacturerDescription description = manufacturer.getDescriptions().iterator().next();
+
+ entry.put("name", description.getName());
+ entry.put("code", manufacturer.getCode());
+ entry.put("order", manufacturer.getOrder());
+ resp.addDataEntry(entry);
+
+ }
+
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging Manufacturers", e);
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ }
+
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
+
+ String returnString = resp.toJSONString();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+ }
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/catalogue/manufacturer/remove.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> deleteManufacturer(HttpServletRequest request, HttpServletResponse response, Locale locale) {
+ Long sid = Long.valueOf(request.getParameter("id") );
+
+
+ AjaxResponse resp = new AjaxResponse();
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+ try{
+ Manufacturer delManufacturer = manufacturerService.getById( sid );
+ if(delManufacturer==null || delManufacturer.getMerchantStore().getId().intValue() != store.getId().intValue()) {
+ resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ int count = manufacturerService.getCountManufAttachedProducts( delManufacturer ).intValue();
+ //IF already attached to products it can't be deleted
+ if ( count > 0 ){
+ resp.setStatusMessage(messages.getMessage("message.product.association", locale));
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ manufacturerService.delete( delManufacturer );
+
+ resp.setStatusMessage(messages.getMessage("message.success", locale));
+ resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
+
+ } catch (Exception e) {
+
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ LOGGER.error("Cannot delete manufacturer.", e);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+ }
+
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/manufacturer/checkCode.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> checkCode(HttpServletRequest request, HttpServletResponse response, Locale locale) {
+ String code = request.getParameter("code");
+ String id = request.getParameter("id");
+
+
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+
+ AjaxResponse resp = new AjaxResponse();
+
+ if(StringUtils.isBlank(code)) {
+ resp.setStatus(AjaxResponse.CODE_ALREADY_EXIST);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ try {
+
+ Manufacturer manufacturer = manufacturerService.getByCode(store, code);
+
+ if(manufacturer!=null && StringUtils.isBlank(id)) {
+ resp.setStatus(AjaxResponse.CODE_ALREADY_EXIST);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ if(manufacturer!=null && !StringUtils.isBlank(id)) {
+ try {
+ Long lid = Long.parseLong(id);
+
+ if(manufacturer.getCode().equals(code) && manufacturer.getId().longValue()==lid) {
+ resp.setStatus(AjaxResponse.CODE_ALREADY_EXIST);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+ } catch (Exception e) {
+ resp.setStatus(AjaxResponse.CODE_ALREADY_EXIST);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ }
+
+
+
+
+
+
+
+
+
+
+ resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while getting category", e);
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+
+ private void setMenu(Model model, HttpServletRequest request) throws Exception {
+ //display menu
+ Map<String,String> activeMenus = new HashMap<String,String>();
+ activeMenus.put("catalogue", "catalogue");
+ activeMenus.put("manufacturer-list", "manufacturer-list");
+
+ @SuppressWarnings("unchecked")
+ Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
+
+ Menu currentMenu = (Menu)menus.get("catalogue");
+ model.addAttribute("currentMenu",currentMenu);
+ model.addAttribute("activeMenus",activeMenus);
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/OptionsValueController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/OptionsValueController.java
index 6b4a73f..6db4ec3 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/OptionsValueController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/OptionsValueController.java
@@ -183,14 +183,18 @@ public class OptionsValueController {
}
+ } else {
+
+ //validate if it contains an existing code
+ ProductOptionValue byCode = productOptionValueService.getByCode(store, optionValue.getCode());
+ if(byCode!=null) {
+ ObjectError error = new ObjectError("code",messages.getMessage("message.code.exist", locale));
+ result.addError(error);
+ }
+
}
- //validate if it contains an existing code
- ProductOptionValue byCode = productOptionValueService.getByCode(store, optionValue.getCode());
- if(byCode!=null) {
- ObjectError error = new ObjectError("code",messages.getMessage("message.code.exist", locale));
- result.addError(error);
- }
+
Map<String,Language> langs = languageService.getLanguagesMap();
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/ProductAttributeController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/ProductAttributeController.java
index 8fc0719..5860116 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/ProductAttributeController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/ProductAttributeController.java
@@ -1,530 +1,530 @@
-package com.salesmanager.shop.admin.controller.products;
-
-import com.salesmanager.core.business.services.catalog.product.ProductService;
-import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
-import com.salesmanager.core.business.services.catalog.product.attribute.ProductOptionService;
-import com.salesmanager.core.business.services.catalog.product.attribute.ProductOptionValueService;
-import com.salesmanager.core.business.utils.ProductPriceUtils;
-import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse;
-import com.salesmanager.core.business.utils.ajax.AjaxResponse;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.attribute.*;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.admin.model.web.Menu;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.utils.LabelUtils;
-import org.apache.commons.lang3.RandomStringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.BindingResult;
-import org.springframework.validation.ObjectError;
-import org.springframework.web.bind.annotation.*;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
-import java.math.BigDecimal;
-import java.util.*;
-
-@Controller
-public class ProductAttributeController {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ProductAttributeController.class);
-
- private final static String TEXT_OPTION = "text";
-
- @Inject
- private ProductAttributeService productAttributeService;
-
- @Inject
- private ProductService productService;
-
- @Inject
- private ProductPriceUtils priceUtil;
-
- @Inject
- ProductOptionService productOptionService;
-
- @Inject
- ProductOptionValueService productOptionValueService;
-
- @Inject
- LabelUtils messages;
-
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/attributes/list.html", method=RequestMethod.GET)
- public String displayProductAttributes(@RequestParam("id") long productId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
- setMenu(model,request);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- Product product = productService.getById(productId);
-
- if(product==null) {
- return "redirect:/admin/products/products.html";
- }
-
- if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- return "redirect:/admin/products/products.html";
- }
-
- model.addAttribute("product",product);
- return "admin-products-attributes";
-
- }
-
-
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/attributes/page.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> pageAttributes(HttpServletRequest request, HttpServletResponse response) {
-
- //String attribute = request.getParameter("attribute");
- String sProductId = request.getParameter("productId");
-
-
- AjaxResponse resp = new AjaxResponse();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
-
- Long productId;
- Product product = null;
-
- try {
- productId = Long.parseLong(sProductId);
- } catch (Exception e) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorString("Product id is not valid");
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- try {
-
-
- product = productService.getById(productId);
-
-
-
- Language language = (Language)request.getAttribute("LANGUAGE");
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- //List<ProductAttribute> attributes = productAttributeService.getByProductId(store, product, language);
-
- for(ProductAttribute attr : product.getAttributes()) {
-
- Map entry = new HashMap();
- entry.put("attributeId", attr.getId());
-
- List<ProductOptionDescription> optionsDescriptions = attr.getProductOption().getDescriptionsSettoList();
- ProductOptionDescription optionDescription = attr.getProductOption().getDescriptionsSettoList().get(0);
- for(ProductOptionDescription desc : optionsDescriptions) {
- if(desc.getLanguage().getId().intValue()==language.getId().intValue()) {
- optionDescription = desc;
- }
- }
-
- List<ProductOptionValueDescription> optionValuesDescriptions = attr.getProductOptionValue().getDescriptionsSettoList();
- ProductOptionValueDescription optionValueDescription = attr.getProductOptionValue().getDescriptionsSettoList().get(0);
- for(ProductOptionValueDescription desc : optionValuesDescriptions) {
- if(desc.getLanguage().getId().intValue()==language.getId().intValue()) {
- optionValueDescription = desc;
- }
- }
- entry.put("attribute", optionDescription.getName());
- entry.put("display", attr.getAttributeDisplayOnly());
- entry.put("value", optionValueDescription.getName());
- entry.put("order", attr.getProductOptionSortOrder());
- entry.put("price", priceUtil.getAdminFormatedAmountWithCurrency(store,attr.getProductAttributePrice()));
-
- resp.addDataEntry(entry);
-
-
-
- }
-
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
-
- } catch (Exception e) {
- LOGGER.error("Error while paging products", e);
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
-
-
- }
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/attributes/editAttribute.html", method=RequestMethod.GET)
- public String displayAttributeEdit(@RequestParam("productId") Long productId, @RequestParam("id") Long id, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
- return displayAttribute(productId, id,model,request,response);
-
- }
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/attribute/createAttribute.html", method=RequestMethod.GET)
- public String displayAttributeCreate(@RequestParam("productId") Long productId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
- return displayAttribute(productId, null,model,request,response);
-
- }
-
- private String displayAttribute(Long productId, Long id, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
- //display menu
- setMenu(model,request);
-
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- Language language = (Language)request.getAttribute("LANGUAGE");
-
- //get product
- Product product = productService.getById(productId);
- if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- return "redirect:/admin/products/products.html";
- }
-
- List<Language> languages = store.getLanguages();
-
- ProductAttribute attribute = null;
-
- //get Options
- List<ProductOption> options = productOptionService.listByStore(store, language);
- //get OptionsValues
- List<ProductOptionValue> optionsValues = productOptionValueService.listByStoreNoReadOnly(store, language);
-
- if(id!=null && id.intValue()!=0) {//edit mode
-
- attribute = productAttributeService.getById(id);
- attribute.setAttributePrice(priceUtil.getAdminFormatedAmount(store, attribute.getProductAttributePrice()));
- attribute.setAttributeAdditionalWeight(String.valueOf(attribute.getProductAttributeWeight().intValue()));
- attribute.setAttributeSortOrder(String.valueOf(attribute.getProductOptionSortOrder()));
-
- } else {
-
- attribute = new ProductAttribute();
- attribute.setProduct(product);
- ProductOptionValue value = new ProductOptionValue();
- Set<ProductOptionValueDescription> descriptions = new HashSet<ProductOptionValueDescription>();
- for(Language l : languages) {
-
- ProductOptionValueDescription desc = new ProductOptionValueDescription();
- desc.setLanguage(l);
- descriptions.add(desc);
-
-
- }
-
- value.setDescriptions(descriptions);
- attribute.setProductOptionValue(value);
- }
-
- model.addAttribute("optionsValues",optionsValues);
- model.addAttribute("options",options);
- model.addAttribute("attribute",attribute);
- model.addAttribute("product",product);
- return "admin-products-attribute-details";
- }
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/attributes/attribute/save.html", method=RequestMethod.POST)
- public String saveAttribute(@Valid @ModelAttribute("attribute") ProductAttribute attribute, BindingResult result, Model model, HttpServletRequest request, Locale locale) throws Exception {
-
-
- //display menu
- setMenu(model,request);
-
- Product product = productService.getById(attribute.getProduct().getId());
-
- model.addAttribute("product",product);
-
-
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- Language language = (Language)request.getAttribute("LANGUAGE");
-
-
- //get Options
- List<ProductOption> options = productOptionService.listByStore(store, language);
- //get OptionsValues
- List<ProductOptionValue> optionsValues = productOptionValueService.listByStoreNoReadOnly(store, language);
-
- model.addAttribute("optionsValues",optionsValues);
- model.addAttribute("options",options);
-
- ProductAttribute dbEntity = null;
-
- if(attribute.getId() != null && attribute.getId() >0) { //edit entry
-
- //get from DB
- dbEntity = productAttributeService.getById(attribute.getId());
-
- if(dbEntity==null) {
- return "redirect:/admin/products/attributes/list.html";
- }
-
- if(dbEntity.getProductOption().getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- return "redirect:/admin/products/attributes/list.html";
- }
- }
-
- //validate price
- BigDecimal submitedPrice = null;
- try {
- submitedPrice = priceUtil.getAmount(attribute.getAttributePrice());
- attribute.setProductAttributePrice(submitedPrice);
- } catch (Exception e) {
- ObjectError error = new ObjectError("attributePrice",messages.getMessage("NotEmpty.product.productPrice", locale));
- result.addError(error);
- }
-
- //validate sort order
- try {
- Integer sortOrder = Integer.parseInt(attribute.getAttributeSortOrder());
- attribute.setProductOptionSortOrder(sortOrder);
- } catch(Exception e) {
- ObjectError error = new ObjectError("attributeSortOrder",messages.getMessage("message.number.invalid", locale));
- result.addError(error);
- }
-
- //validate weight
- try {
- Integer weight = Integer.parseInt(attribute.getAttributeAdditionalWeight());
- attribute.setProductAttributeWeight(new BigDecimal(weight));
- } catch(Exception e) {
- ObjectError error = new ObjectError("attributeAdditionalWeight",messages.getMessage("message.number.invalid", locale));
- result.addError(error);
- }
-
- if(attribute.getProductOption()==null) {
- ObjectError error = new ObjectError("productOption.id",messages.getMessage("message.productoption.required", locale));
- result.addError(error);
- return "admin-products-attribute-details";
- }
-
-
- //check type
- ProductOption option = attribute.getProductOption();
- option = productOptionService.getById(option.getId());
- attribute.setProductOption(option);
-
- if(option.getProductOptionType().equals(TEXT_OPTION)) {
-
- if(dbEntity!=null && dbEntity.getProductOption().getProductOptionType().equals(TEXT_OPTION)) {//bcz it is overwrited by hidden product option value list
- if(dbEntity.getProductOptionValue()!=null) {
- ProductOptionValue optVal = dbEntity.getProductOptionValue();
- List<ProductOptionValueDescription> descriptions = attribute.getProductOptionValue().getDescriptionsList();
- Set<ProductOptionValueDescription> descriptionsSet = new HashSet<ProductOptionValueDescription>();
- for(ProductOptionValueDescription description : descriptions) {
- description.setProductOptionValue(optVal);
- description.setName(description.getDescription().length()<15 ? description.getDescription() : description.getDescription().substring(0,15));
- descriptionsSet.add(description);
- }
- optVal.setDescriptions(descriptionsSet);
- optVal.setProductOptionDisplayOnly(true);
- productOptionValueService.saveOrUpdate(optVal);
- attribute.setProductOptionValue(optVal);
- }
- } else {//create a new value
-
- //create new option value
- List<ProductOptionValueDescription> descriptions = attribute.getProductOptionValue().getDescriptionsList();
- Set<ProductOptionValueDescription> newDescriptions = new HashSet<ProductOptionValueDescription>();
- ProductOptionValue newValue = new ProductOptionValue();
- for(ProductOptionValueDescription description : descriptions) {
- ProductOptionValueDescription optionValueDescription = new ProductOptionValueDescription();
- optionValueDescription.setAuditSection(description.getAuditSection());
- optionValueDescription.setLanguage(description.getLanguage());
- optionValueDescription.setName(description.getDescription().length()<15 ? description.getDescription() : description.getDescription().substring(0,15));
- optionValueDescription.setLanguage(description.getLanguage());
- optionValueDescription.setDescription(description.getDescription());
- optionValueDescription.setProductOptionValue(newValue);
- newDescriptions.add(optionValueDescription);
- }
-
- //code generation
- String code = RandomStringUtils.randomAlphanumeric(10).toUpperCase();
- newValue.setCode(code);
- newValue.setMerchantStore(store);
- newValue.setProductOptionValueSortOrder(attribute.getProductOptionValue().getProductOptionValueSortOrder());
- newValue.setDescriptions(newDescriptions);
- newValue.setProductOptionDisplayOnly(true);
- productOptionValueService.save(newValue);
- attribute.setProductOptionValue(newValue);
- attribute.setAttributeDisplayOnly(true);
-
- }
-
- }
-
-
-
- if(attribute.getProductOptionValue().getId()==null) {
- ObjectError error = new ObjectError("productOptionValue.id",messages.getMessage("message.productoptionvalue.required", locale));
- result.addError(error);
- }
-
- model.addAttribute("attribute",attribute);
-
-
- if (result.hasErrors()) {
- return "admin-products-attribute-details";
- }
-
- productAttributeService.saveOrUpdate(attribute);
-
- model.addAttribute("success","success");
- return "admin-products-attribute-details";
- }
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/attributes/attribute/remove.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> deleteProductPrice(HttpServletRequest request, HttpServletResponse response, Locale locale) {
- String sAttributeid = request.getParameter("attributeId");
-
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- AjaxResponse resp = new AjaxResponse();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
-
-
- try {
-
- Long attributeId = Long.parseLong(sAttributeid);
- ProductAttribute attribute = productAttributeService.getById(attributeId);
-
-
- if(attribute==null || attribute.getProduct().getMerchantStore().getId().intValue()!=store.getId()) {
-
- resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- productAttributeService.delete(attribute);
-
-
- resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
-
-
-
- } catch (Exception e) {
- LOGGER.error("Error while deleting product price", e);
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/attributes/getAttributeType.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> checkAttributeType(HttpServletRequest request, HttpServletResponse response, Locale locale) {
-
- String sOptionId = request.getParameter("optionId");
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
-
-
- AjaxResponse resp = new AjaxResponse();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
-
-
- Long prodoptionId;
- ProductOption productOption = null;
-
- try {
- prodoptionId = Long.parseLong(sOptionId);
- } catch (Exception e) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorString("Product Option id is not valid");
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- try {
-
-
- productOption = productOptionService.getById(prodoptionId);
-
- if(productOption==null) {
- resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- if(productOption.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
-
-
- Map entry = new HashMap();
-
-
-
- entry.put("type", productOption.getProductOptionType());
- resp.addDataEntry(entry);
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
-
- } catch (Exception e) {
- LOGGER.error("Error while paging products", e);
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
-
- }
-
-
-
- private void setMenu(Model model, HttpServletRequest request) throws Exception {
-
- //display menu
- Map<String,String> activeMenus = new HashMap<String,String>();
- activeMenus.put("catalogue", "catalogue");
- activeMenus.put("catalogue-products", "catalogue-products");
-
- @SuppressWarnings("unchecked")
- Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
-
- Menu currentMenu = (Menu)menus.get("catalogue");
- model.addAttribute("currentMenu",currentMenu);
- model.addAttribute("activeMenus",activeMenus);
- //
-
- }
-
-}
+package com.salesmanager.shop.admin.controller.products;
+
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
+import com.salesmanager.core.business.services.catalog.product.attribute.ProductOptionService;
+import com.salesmanager.core.business.services.catalog.product.attribute.ProductOptionValueService;
+import com.salesmanager.core.business.utils.ProductPriceUtils;
+import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse;
+import com.salesmanager.core.business.utils.ajax.AjaxResponse;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.attribute.*;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.admin.model.web.Menu;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.utils.LabelUtils;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.annotation.*;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.math.BigDecimal;
+import java.util.*;
+
+@Controller
+public class ProductAttributeController {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ProductAttributeController.class);
+
+ private final static String TEXT_OPTION = "text";
+
+ @Inject
+ private ProductAttributeService productAttributeService;
+
+ @Inject
+ private ProductService productService;
+
+ @Inject
+ private ProductPriceUtils priceUtil;
+
+ @Inject
+ ProductOptionService productOptionService;
+
+ @Inject
+ ProductOptionValueService productOptionValueService;
+
+ @Inject
+ LabelUtils messages;
+
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/attributes/list.html", method=RequestMethod.GET)
+ public String displayProductAttributes(@RequestParam("id") long productId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ setMenu(model,request);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ Product product = productService.getById(productId);
+
+ if(product==null) {
+ return "redirect:/admin/products/products.html";
+ }
+
+ if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ return "redirect:/admin/products/products.html";
+ }
+
+ model.addAttribute("product",product);
+ return "admin-products-attributes";
+
+ }
+
+
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/attributes/page.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> pageAttributes(HttpServletRequest request, HttpServletResponse response) {
+
+ //String attribute = request.getParameter("attribute");
+ String sProductId = request.getParameter("productId");
+
+
+ AjaxResponse resp = new AjaxResponse();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+ Long productId;
+ Product product = null;
+
+ try {
+ productId = Long.parseLong(sProductId);
+ } catch (Exception e) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorString("Product id is not valid");
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ try {
+
+
+ product = productService.getById(productId);
+
+
+
+ Language language = (Language)request.getAttribute("LANGUAGE");
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ //List<ProductAttribute> attributes = productAttributeService.getByProductId(store, product, language);
+
+ for(ProductAttribute attr : product.getAttributes()) {
+
+ Map entry = new HashMap();
+ entry.put("attributeId", attr.getId());
+
+ List<ProductOptionDescription> optionsDescriptions = attr.getProductOption().getDescriptionsSettoList();
+ ProductOptionDescription optionDescription = attr.getProductOption().getDescriptionsSettoList().get(0);
+ for(ProductOptionDescription desc : optionsDescriptions) {
+ if(desc.getLanguage().getId().intValue()==language.getId().intValue()) {
+ optionDescription = desc;
+ }
+ }
+
+ List<ProductOptionValueDescription> optionValuesDescriptions = attr.getProductOptionValue().getDescriptionsSettoList();
+ ProductOptionValueDescription optionValueDescription = attr.getProductOptionValue().getDescriptionsSettoList().get(0);
+ for(ProductOptionValueDescription desc : optionValuesDescriptions) {
+ if(desc.getLanguage().getId().intValue()==language.getId().intValue()) {
+ optionValueDescription = desc;
+ }
+ }
+ entry.put("attribute", optionDescription.getName());
+ entry.put("display", attr.getAttributeDisplayOnly());
+ entry.put("value", optionValueDescription.getName());
+ entry.put("order", attr.getProductOptionSortOrder());
+ entry.put("price", priceUtil.getAdminFormatedAmountWithCurrency(store,attr.getProductAttributePrice()));
+
+ resp.addDataEntry(entry);
+
+
+
+ }
+
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging products", e);
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+
+ }
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/attributes/editAttribute.html", method=RequestMethod.GET)
+ public String displayAttributeEdit(@RequestParam("productId") Long productId, @RequestParam("id") Long id, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+ return displayAttribute(productId, id,model,request,response);
+
+ }
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/attribute/createAttribute.html", method=RequestMethod.GET)
+ public String displayAttributeCreate(@RequestParam("productId") Long productId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+ return displayAttribute(productId, null,model,request,response);
+
+ }
+
+ private String displayAttribute(Long productId, Long id, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ //display menu
+ setMenu(model,request);
+
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ Language language = (Language)request.getAttribute("LANGUAGE");
+
+ //get product
+ Product product = productService.getById(productId);
+ if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ return "redirect:/admin/products/products.html";
+ }
+
+ List<Language> languages = store.getLanguages();
+
+ ProductAttribute attribute = null;
+
+ //get Options
+ List<ProductOption> options = productOptionService.listByStore(store, language);
+ //get OptionsValues
+ List<ProductOptionValue> optionsValues = productOptionValueService.listByStoreNoReadOnly(store, language);
+
+ if(id!=null && id.intValue()!=0) {//edit mode
+
+ attribute = productAttributeService.getById(id);
+ attribute.setAttributePrice(priceUtil.getAdminFormatedAmount(store, attribute.getProductAttributePrice()));
+ attribute.setAttributeAdditionalWeight(String.valueOf(attribute.getProductAttributeWeight().intValue()));
+ attribute.setAttributeSortOrder(String.valueOf(attribute.getProductOptionSortOrder()));
+
+ } else {
+
+ attribute = new ProductAttribute();
+ attribute.setProduct(product);
+ ProductOptionValue value = new ProductOptionValue();
+ Set<ProductOptionValueDescription> descriptions = new HashSet<ProductOptionValueDescription>();
+ for(Language l : languages) {
+
+ ProductOptionValueDescription desc = new ProductOptionValueDescription();
+ desc.setLanguage(l);
+ descriptions.add(desc);
+
+
+ }
+
+ value.setDescriptions(descriptions);
+ attribute.setProductOptionValue(value);
+ }
+
+ model.addAttribute("optionsValues",optionsValues);
+ model.addAttribute("options",options);
+ model.addAttribute("attribute",attribute);
+ model.addAttribute("product",product);
+ return "admin-products-attribute-details";
+ }
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/attributes/attribute/save.html", method=RequestMethod.POST)
+ public String saveAttribute(@Valid @ModelAttribute("attribute") ProductAttribute attribute, BindingResult result, Model model, HttpServletRequest request, Locale locale) throws Exception {
+
+
+ //display menu
+ setMenu(model,request);
+
+ Product product = productService.getById(attribute.getProduct().getId());
+
+ model.addAttribute("product",product);
+
+
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ Language language = (Language)request.getAttribute("LANGUAGE");
+
+
+ //get Options
+ List<ProductOption> options = productOptionService.listByStore(store, language);
+ //get OptionsValues
+ List<ProductOptionValue> optionsValues = productOptionValueService.listByStoreNoReadOnly(store, language);
+
+ model.addAttribute("optionsValues",optionsValues);
+ model.addAttribute("options",options);
+
+ ProductAttribute dbEntity = null;
+
+ if(attribute.getId() != null && attribute.getId() >0) { //edit entry
+
+ //get from DB
+ dbEntity = productAttributeService.getById(attribute.getId());
+
+ if(dbEntity==null) {
+ return "redirect:/admin/products/attributes/list.html";
+ }
+
+ if(dbEntity.getProductOption().getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ return "redirect:/admin/products/attributes/list.html";
+ }
+ }
+
+ //validate price
+ BigDecimal submitedPrice = null;
+ try {
+ submitedPrice = priceUtil.getAmount(attribute.getAttributePrice());
+ attribute.setProductAttributePrice(submitedPrice);
+ } catch (Exception e) {
+ ObjectError error = new ObjectError("attributePrice",messages.getMessage("NotEmpty.product.productPrice", locale));
+ result.addError(error);
+ }
+
+ //validate sort order
+ try {
+ Integer sortOrder = Integer.parseInt(attribute.getAttributeSortOrder());
+ attribute.setProductOptionSortOrder(sortOrder);
+ } catch(Exception e) {
+ ObjectError error = new ObjectError("attributeSortOrder",messages.getMessage("message.number.invalid", locale));
+ result.addError(error);
+ }
+
+ //validate weight
+ try {
+ Integer weight = Integer.parseInt(attribute.getAttributeAdditionalWeight());
+ attribute.setProductAttributeWeight(new BigDecimal(weight));
+ } catch(Exception e) {
+ ObjectError error = new ObjectError("attributeAdditionalWeight",messages.getMessage("message.number.invalid", locale));
+ result.addError(error);
+ }
+
+ if(attribute.getProductOption()==null) {
+ ObjectError error = new ObjectError("productOption.id",messages.getMessage("message.productoption.required", locale));
+ result.addError(error);
+ return "admin-products-attribute-details";
+ }
+
+
+ //check type
+ ProductOption option = attribute.getProductOption();
+ option = productOptionService.getById(option.getId());
+ attribute.setProductOption(option);
+
+ if(option.getProductOptionType().equals(TEXT_OPTION)) {
+
+ if(dbEntity!=null && dbEntity.getProductOption().getProductOptionType().equals(TEXT_OPTION)) {//bcz it is overwrited by hidden product option value list
+ if(dbEntity.getProductOptionValue()!=null) {
+ ProductOptionValue optVal = dbEntity.getProductOptionValue();
+ List<ProductOptionValueDescription> descriptions = attribute.getProductOptionValue().getDescriptionsList();
+ Set<ProductOptionValueDescription> descriptionsSet = new HashSet<ProductOptionValueDescription>();
+ for(ProductOptionValueDescription description : descriptions) {
+ description.setProductOptionValue(optVal);
+ description.setName(description.getDescription().length()<15 ? description.getDescription() : description.getDescription().substring(0,15));
+ descriptionsSet.add(description);
+ }
+ optVal.setDescriptions(descriptionsSet);
+ optVal.setProductOptionDisplayOnly(true);
+ productOptionValueService.saveOrUpdate(optVal);
+ attribute.setProductOptionValue(optVal);
+ }
+ } else {//create a new value
+
+ //create new option value
+ List<ProductOptionValueDescription> descriptions = attribute.getProductOptionValue().getDescriptionsList();
+ Set<ProductOptionValueDescription> newDescriptions = new HashSet<ProductOptionValueDescription>();
+ ProductOptionValue newValue = new ProductOptionValue();
+ for(ProductOptionValueDescription description : descriptions) {
+ ProductOptionValueDescription optionValueDescription = new ProductOptionValueDescription();
+ optionValueDescription.setAuditSection(description.getAuditSection());
+ optionValueDescription.setLanguage(description.getLanguage());
+ optionValueDescription.setName(description.getDescription().length()<15 ? description.getDescription() : description.getDescription().substring(0,15));
+ optionValueDescription.setLanguage(description.getLanguage());
+ optionValueDescription.setDescription(description.getDescription());
+ optionValueDescription.setProductOptionValue(newValue);
+ newDescriptions.add(optionValueDescription);
+ }
+
+ //code generation
+ String code = RandomStringUtils.randomAlphanumeric(10).toUpperCase();
+ newValue.setCode(code);
+ newValue.setMerchantStore(store);
+ newValue.setProductOptionValueSortOrder(attribute.getProductOptionValue().getProductOptionValueSortOrder());
+ newValue.setDescriptions(newDescriptions);
+ newValue.setProductOptionDisplayOnly(true);
+ productOptionValueService.save(newValue);
+ attribute.setProductOptionValue(newValue);
+ attribute.setAttributeDisplayOnly(true);
+
+ }
+
+ }
+
+
+
+ if(attribute.getProductOptionValue().getId()==null) {
+ ObjectError error = new ObjectError("productOptionValue.id",messages.getMessage("message.productoptionvalue.required", locale));
+ result.addError(error);
+ }
+
+ model.addAttribute("attribute",attribute);
+
+
+ if (result.hasErrors()) {
+ return "admin-products-attribute-details";
+ }
+
+ productAttributeService.saveOrUpdate(attribute);
+
+ model.addAttribute("success","success");
+ return "admin-products-attribute-details";
+ }
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/attributes/attribute/remove.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> deleteProductPrice(HttpServletRequest request, HttpServletResponse response, Locale locale) {
+ String sAttributeid = request.getParameter("attributeId");
+
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ AjaxResponse resp = new AjaxResponse();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+
+ try {
+
+ Long attributeId = Long.parseLong(sAttributeid);
+ ProductAttribute attribute = productAttributeService.getById(attributeId);
+
+
+ if(attribute==null || attribute.getProduct().getMerchantStore().getId().intValue()!=store.getId()) {
+
+ resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ productAttributeService.delete(attribute);
+
+
+ resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
+
+
+
+ } catch (Exception e) {
+ LOGGER.error("Error while deleting product price", e);
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/attributes/getAttributeType.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> checkAttributeType(HttpServletRequest request, HttpServletResponse response, Locale locale) {
+
+ String sOptionId = request.getParameter("optionId");
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+
+
+ AjaxResponse resp = new AjaxResponse();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+
+ Long prodoptionId;
+ ProductOption productOption = null;
+
+ try {
+ prodoptionId = Long.parseLong(sOptionId);
+ } catch (Exception e) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorString("Product Option id is not valid");
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ try {
+
+
+ productOption = productOptionService.getById(prodoptionId);
+
+ if(productOption==null) {
+ resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ if(productOption.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+
+
+ Map entry = new HashMap();
+
+
+
+ entry.put("type", productOption.getProductOptionType());
+ resp.addDataEntry(entry);
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging products", e);
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+ }
+
+
+
+ private void setMenu(Model model, HttpServletRequest request) throws Exception {
+
+ //display menu
+ Map<String,String> activeMenus = new HashMap<String,String>();
+ activeMenus.put("catalogue", "catalogue");
+ activeMenus.put("catalogue-products", "catalogue-products");
+
+ @SuppressWarnings("unchecked")
+ Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
+
+ Menu currentMenu = (Menu)menus.get("catalogue");
+ model.addAttribute("currentMenu",currentMenu);
+ model.addAttribute("activeMenus",activeMenus);
+ //
+
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/ProductImagesController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/ProductImagesController.java
index 32bf48d..5e50cc2 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/ProductImagesController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/ProductImagesController.java
@@ -1,502 +1,502 @@
-package com.salesmanager.shop.admin.controller.products;
-
-import com.salesmanager.core.business.services.catalog.product.ProductService;
-import com.salesmanager.core.business.services.catalog.product.image.ProductImageService;
-import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse;
-import com.salesmanager.core.business.utils.ajax.AjaxResponse;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.image.ProductImage;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.shop.admin.controller.ControllerConstants;
-import com.salesmanager.shop.admin.model.content.ProductImages;
-import com.salesmanager.shop.admin.model.web.Menu;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.utils.ImageFilePath;
-import com.salesmanager.shop.utils.LabelUtils;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.BindingResult;
-import org.springframework.validation.FieldError;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
-import java.util.*;
-
-@Controller
-public class ProductImagesController {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ProductImagesController.class);
-
-
-
- @Inject
- private ProductService productService;
-
-
- @Inject
- private ProductImageService productImageService;
-
- @Inject
- private LabelUtils messages;
-
- @Inject
- @Qualifier("img")
- private ImageFilePath imageUtils;
-
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/images/list.html", method=RequestMethod.GET)
- public String displayProductImages(@RequestParam("id") long productId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
- setMenu(model,request);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- Product product = productService.getById(productId);
-
- if(product==null) {
- return "redirect:/admin/products/products.html";
- }
-
- if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- return "redirect:/admin/products/products.html";
- }
-
- model.addAttribute("product",product);
- return ControllerConstants.Tiles.Product.productImages;
-
- }
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/images/url/list.html", method=RequestMethod.GET)
- public String displayProductImagesUrl(@RequestParam("id") long productId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
- setMenu(model,request);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- Product product = productService.getById(productId);
-
- if(product==null) {
- return "redirect:/admin/products/products.html";
- }
-
- if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- return "redirect:/admin/products/products.html";
- }
-
- Map< String, String > mediaTypes = new HashMap<String, String>();
- mediaTypes.put("0", "IMAGE");
- mediaTypes.put("1", "VIDEO");
-
- ProductImage productImage = new ProductImage();
-
- model.addAttribute("productImage", productImage);
- model.addAttribute("product",product);
- model.addAttribute("mediaTypes",mediaTypes);
- return ControllerConstants.Tiles.Product.productImagesUrl;
-
- }
-
-
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/images/page.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> pageProductImages(HttpServletRequest request, HttpServletResponse response) {
-
- String sProductId = request.getParameter("productId");
-
-
- AjaxResponse resp = new AjaxResponse();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
-
- Long productId;
- Product product = null;
-
- try {
- productId = Long.parseLong(sProductId);
- } catch (Exception e) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorString("Product id is not valid");
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- try {
-
-
- product = productService.getById(productId);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorString("Merchant id is not valid");
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- Set<ProductImage> images = product.getImages();
-
- if(images!=null) {
-
- for(ProductImage image : images) {
-
- String imagePath = imageUtils.buildProductImageUtils(store, product, image.getProductImage());
-
- Map entry = new HashMap();
- //entry.put("picture", new StringBuilder().append(request.getContextPath()).append(imagePath).toString());
- entry.put("picture", imagePath);
- entry.put("name", image.getProductImage());
- entry.put("id",image.getId());
- entry.put("defaultImageCheckmark", image.isDefaultImage() ? "/resources/img/admin/checkmark_checked.png" : "/resources/img/admin/checkmark_unchecked.png");
-
- resp.addDataEntry(entry);
-
- }
- }
-
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
-
- } catch (Exception e) {
- LOGGER.error("Error while paging products", e);
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
-
-
- }
-
-
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/images/url/page.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> pageProductImagesUrl(HttpServletRequest request, HttpServletResponse response) {
-
- String sProductId = request.getParameter("productId");
-
-
- AjaxResponse resp = new AjaxResponse();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
-
- Long productId;
- Product product = null;
-
- try {
- productId = Long.parseLong(sProductId);
- } catch (Exception e) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorString("Product id is not valid");
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- try {
-
-
- product = productService.getById(productId);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorString("Merchant id is not valid");
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- Set<ProductImage> images = product.getImages();
-
- if(images!=null) {
-
- for(ProductImage image : images) {
-
- if(!StringUtils.isBlank(image.getProductImageUrl())) {
-
- Map entry = new HashMap();
- entry.put("image", image.getProductImageUrl());
- entry.put("url", image.getProductImageUrl());
- entry.put("default", image.isDefaultImage());
- entry.put("id",image.getId());
-
- resp.addDataEntry(entry);
-
- }
- }
-
- }
-
-
-
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
-
- } catch (Exception e) {
- LOGGER.error("Error while paging products", e);
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
-
-
- }
-
-
-
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/images/save.html", method=RequestMethod.POST)
- public String saveProductImages(@ModelAttribute(value="productImages") @Valid final ProductImages productImages, final BindingResult bindingResult,final Model model, final HttpServletRequest request,Locale locale) throws Exception{
-
-
- this.setMenu(model, request);
-
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- Product product = productService.getById(productImages.getProductId());
- model.addAttribute("product",product);
- if(product==null) {
- FieldError error = new FieldError("productImages","image",messages.getMessage("message.error", locale));
- bindingResult.addError(error);
- return ControllerConstants.Tiles.Product.productImages;
- }
-
- if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- FieldError error = new FieldError("productImages","image",messages.getMessage("message.error", locale));
- bindingResult.addError(error);
- }
-
- if (bindingResult.hasErrors()) {
- LOGGER.info( "Found {} Validation errors", bindingResult.getErrorCount());
- return ControllerConstants.Tiles.Product.productImages;
-
- }
-
- final List<ProductImage> contentImagesList=new ArrayList<ProductImage>();
- if(CollectionUtils.isNotEmpty( productImages.getFile() )){
- LOGGER.info("Saving {} content images for merchant {}",productImages.getFile().size(),store.getId());
- for(final MultipartFile multipartFile:productImages.getFile()){
- if(!multipartFile.isEmpty()){
- ProductImage productImage = new ProductImage();
-
- productImage.setImage(multipartFile.getInputStream());
- productImage.setProductImage(multipartFile.getOriginalFilename() );
- productImage.setProduct(product);
- productImage.setDefaultImage(false);//default image is uploaded in the product details
-
- contentImagesList.add( productImage);
- }
- }
-
- if(CollectionUtils.isNotEmpty( contentImagesList )){
- productImageService.addProductImages(product, contentImagesList);
- }
-
- }
-
-
- //reload
- product = productService.getById(productImages.getProductId());
- model.addAttribute("product",product);
- model.addAttribute("success","success");
-
- return ControllerConstants.Tiles.Product.productImages;
- }
-
-
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/images/url/save.html", method=RequestMethod.POST)
- public String saveProductImagesUrl(@ModelAttribute(value="productImage") @Valid final ProductImage productImage, final BindingResult bindingResult,final Model model, final HttpServletRequest request,Locale locale) throws Exception{
-
-
- this.setMenu(model, request);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- Map< String, String > mediaTypes = new HashMap<String, String>();
- mediaTypes.put("0", "IMAGE");
- mediaTypes.put("1", "VIDEO");
-
- model.addAttribute("productImage", productImage);
- model.addAttribute("mediaTypes",mediaTypes);
-
- Product product = productService.getById(productImage.getId());
- model.addAttribute("product",product);
- if(product==null) {
- FieldError error = new FieldError("productImages","image",messages.getMessage("message.error", locale));
- bindingResult.addError(error);
- return ControllerConstants.Tiles.Product.productImagesUrl;
- }
-
- if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- FieldError error = new FieldError("productImages","image",messages.getMessage("message.error", locale));
- bindingResult.addError(error);
- }
-
- model.addAttribute("product",product);
-
- if (bindingResult.hasErrors()) {
- LOGGER.info( "Found {} Validation errors", bindingResult.getErrorCount());
- return ControllerConstants.Tiles.Product.productImagesUrl;
- }
-
- productImage.setProduct(product);
- productImage.setId(null);
-
- productImageService.saveOrUpdate(productImage);
- model.addAttribute("product",product);
- model.addAttribute("success","success");
-
- return ControllerConstants.Tiles.Product.productImagesUrl;
- }
-
-
-
-
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/images/remove.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> deleteImage(HttpServletRequest request, HttpServletResponse response, Locale locale) {
- String sImageId = request.getParameter("id");
-
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- AjaxResponse resp = new AjaxResponse();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
-
-
- try {
-
-
- Long imageId = Long.parseLong(sImageId);
-
-
- ProductImage productImage = productImageService.getById(imageId);
- if(productImage==null) {
- resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- if(productImage.getProduct().getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- productImageService.removeProductImage(productImage);
-
- resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
-
-
-
- } catch (Exception e) {
- LOGGER.error("Error while deleting product price", e);
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/images/defaultImage.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> setDefaultImage(final HttpServletRequest request,
- final HttpServletResponse response,
- final Locale locale) {
- final String sImageId = request.getParameter("id");
- final MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- final AjaxResponse resp = new AjaxResponse();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
-
- try {
- final Long imageId = Long.parseLong(sImageId);
- final ProductImage productImage = productImageService.getById(imageId);
-
- if (productImage == null) {
- resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- if (productImage.getProduct().getMerchantStore().getId().intValue() != store.getId().intValue()) {
- resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- productImage.setDefaultImage(true);
- productImageService.saveOrUpdate(productImage);
-
- final Set<ProductImage> images = productService.getById(productImage.getProduct().getId()).getImages();
- for (final ProductImage image : images) {
- if (image.getId() != productImage.getId()) {
- image.setDefaultImage(false);
- productImageService.saveOrUpdate(image);
- }
- }
-
- resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
- } catch (final Exception e) {
- LOGGER.error("Error while set default image", e);
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- private void setMenu(Model model, HttpServletRequest request) throws Exception {
-
- //display menu
- Map<String,String> activeMenus = new HashMap<String,String>();
- activeMenus.put("catalogue", "catalogue");
- activeMenus.put("catalogue-products", "catalogue-products");
-
- @SuppressWarnings("unchecked")
- Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
-
- Menu currentMenu = (Menu)menus.get("catalogue");
- model.addAttribute("currentMenu",currentMenu);
- model.addAttribute("activeMenus",activeMenus);
- //
-
- }
-
-}
+package com.salesmanager.shop.admin.controller.products;
+
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.image.ProductImageService;
+import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse;
+import com.salesmanager.core.business.utils.ajax.AjaxResponse;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.image.ProductImage;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.shop.admin.controller.ControllerConstants;
+import com.salesmanager.shop.admin.model.content.ProductImages;
+import com.salesmanager.shop.admin.model.web.Menu;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.utils.ImageFilePath;
+import com.salesmanager.shop.utils.LabelUtils;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.util.*;
+
+@Controller
+public class ProductImagesController {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ProductImagesController.class);
+
+
+
+ @Inject
+ private ProductService productService;
+
+
+ @Inject
+ private ProductImageService productImageService;
+
+ @Inject
+ private LabelUtils messages;
+
+ @Inject
+ @Qualifier("img")
+ private ImageFilePath imageUtils;
+
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/images/list.html", method=RequestMethod.GET)
+ public String displayProductImages(@RequestParam("id") long productId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ setMenu(model,request);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ Product product = productService.getById(productId);
+
+ if(product==null) {
+ return "redirect:/admin/products/products.html";
+ }
+
+ if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ return "redirect:/admin/products/products.html";
+ }
+
+ model.addAttribute("product",product);
+ return ControllerConstants.Tiles.Product.productImages;
+
+ }
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/images/url/list.html", method=RequestMethod.GET)
+ public String displayProductImagesUrl(@RequestParam("id") long productId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ setMenu(model,request);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ Product product = productService.getById(productId);
+
+ if(product==null) {
+ return "redirect:/admin/products/products.html";
+ }
+
+ if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ return "redirect:/admin/products/products.html";
+ }
+
+ Map< String, String > mediaTypes = new HashMap<String, String>();
+ mediaTypes.put("0", "IMAGE");
+ mediaTypes.put("1", "VIDEO");
+
+ ProductImage productImage = new ProductImage();
+
+ model.addAttribute("productImage", productImage);
+ model.addAttribute("product",product);
+ model.addAttribute("mediaTypes",mediaTypes);
+ return ControllerConstants.Tiles.Product.productImagesUrl;
+
+ }
+
+
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/images/page.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> pageProductImages(HttpServletRequest request, HttpServletResponse response) {
+
+ String sProductId = request.getParameter("productId");
+
+
+ AjaxResponse resp = new AjaxResponse();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+ Long productId;
+ Product product = null;
+
+ try {
+ productId = Long.parseLong(sProductId);
+ } catch (Exception e) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorString("Product id is not valid");
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ try {
+
+
+ product = productService.getById(productId);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorString("Merchant id is not valid");
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ Set<ProductImage> images = product.getImages();
+
+ if(images!=null) {
+
+ for(ProductImage image : images) {
+
+ String imagePath = imageUtils.buildProductImageUtils(store, product, image.getProductImage());
+
+ Map entry = new HashMap();
+ //entry.put("picture", new StringBuilder().append(request.getContextPath()).append(imagePath).toString());
+ entry.put("picture", imagePath);
+ entry.put("name", image.getProductImage());
+ entry.put("id",image.getId());
+ entry.put("defaultImageCheckmark", image.isDefaultImage() ? "/resources/img/admin/checkmark_checked.png" : "/resources/img/admin/checkmark_unchecked.png");
+
+ resp.addDataEntry(entry);
+
+ }
+ }
+
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging products", e);
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+
+ }
+
+
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/images/url/page.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> pageProductImagesUrl(HttpServletRequest request, HttpServletResponse response) {
+
+ String sProductId = request.getParameter("productId");
+
+
+ AjaxResponse resp = new AjaxResponse();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+ Long productId;
+ Product product = null;
+
+ try {
+ productId = Long.parseLong(sProductId);
+ } catch (Exception e) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorString("Product id is not valid");
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ try {
+
+
+ product = productService.getById(productId);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorString("Merchant id is not valid");
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ Set<ProductImage> images = product.getImages();
+
+ if(images!=null) {
+
+ for(ProductImage image : images) {
+
+ if(!StringUtils.isBlank(image.getProductImageUrl())) {
+
+ Map entry = new HashMap();
+ entry.put("image", image.getProductImageUrl());
+ entry.put("url", image.getProductImageUrl());
+ entry.put("default", image.isDefaultImage());
+ entry.put("id",image.getId());
+
+ resp.addDataEntry(entry);
+
+ }
+ }
+
+ }
+
+
+
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging products", e);
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+
+ }
+
+
+
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/images/save.html", method=RequestMethod.POST)
+ public String saveProductImages(@ModelAttribute(value="productImages") @Valid final ProductImages productImages, final BindingResult bindingResult,final Model model, final HttpServletRequest request,Locale locale) throws Exception{
+
+
+ this.setMenu(model, request);
+
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ Product product = productService.getById(productImages.getProductId());
+ model.addAttribute("product",product);
+ if(product==null) {
+ FieldError error = new FieldError("productImages","image",messages.getMessage("message.error", locale));
+ bindingResult.addError(error);
+ return ControllerConstants.Tiles.Product.productImages;
+ }
+
+ if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ FieldError error = new FieldError("productImages","image",messages.getMessage("message.error", locale));
+ bindingResult.addError(error);
+ }
+
+ if (bindingResult.hasErrors()) {
+ LOGGER.info( "Found {} Validation errors", bindingResult.getErrorCount());
+ return ControllerConstants.Tiles.Product.productImages;
+
+ }
+
+ final List<ProductImage> contentImagesList=new ArrayList<ProductImage>();
+ if(CollectionUtils.isNotEmpty( productImages.getFile() )){
+ LOGGER.info("Saving {} content images for merchant {}",productImages.getFile().size(),store.getId());
+ for(final MultipartFile multipartFile:productImages.getFile()){
+ if(!multipartFile.isEmpty()){
+ ProductImage productImage = new ProductImage();
+
+ productImage.setImage(multipartFile.getInputStream());
+ productImage.setProductImage(multipartFile.getOriginalFilename() );
+ productImage.setProduct(product);
+ productImage.setDefaultImage(false);//default image is uploaded in the product details
+
+ contentImagesList.add( productImage);
+ }
+ }
+
+ if(CollectionUtils.isNotEmpty( contentImagesList )){
+ productImageService.addProductImages(product, contentImagesList);
+ }
+
+ }
+
+
+ //reload
+ product = productService.getById(productImages.getProductId());
+ model.addAttribute("product",product);
+ model.addAttribute("success","success");
+
+ return ControllerConstants.Tiles.Product.productImages;
+ }
+
+
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/images/url/save.html", method=RequestMethod.POST)
+ public String saveProductImagesUrl(@ModelAttribute(value="productImage") @Valid final ProductImage productImage, final BindingResult bindingResult,final Model model, final HttpServletRequest request,Locale locale) throws Exception{
+
+
+ this.setMenu(model, request);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ Map< String, String > mediaTypes = new HashMap<String, String>();
+ mediaTypes.put("0", "IMAGE");
+ mediaTypes.put("1", "VIDEO");
+
+ model.addAttribute("productImage", productImage);
+ model.addAttribute("mediaTypes",mediaTypes);
+
+ Product product = productService.getById(productImage.getId());
+ model.addAttribute("product",product);
+ if(product==null) {
+ FieldError error = new FieldError("productImages","image",messages.getMessage("message.error", locale));
+ bindingResult.addError(error);
+ return ControllerConstants.Tiles.Product.productImagesUrl;
+ }
+
+ if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ FieldError error = new FieldError("productImages","image",messages.getMessage("message.error", locale));
+ bindingResult.addError(error);
+ }
+
+ model.addAttribute("product",product);
+
+ if (bindingResult.hasErrors()) {
+ LOGGER.info( "Found {} Validation errors", bindingResult.getErrorCount());
+ return ControllerConstants.Tiles.Product.productImagesUrl;
+ }
+
+ productImage.setProduct(product);
+ productImage.setId(null);
+
+ productImageService.saveOrUpdate(productImage);
+ model.addAttribute("product",product);
+ model.addAttribute("success","success");
+
+ return ControllerConstants.Tiles.Product.productImagesUrl;
+ }
+
+
+
+
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/images/remove.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> deleteImage(HttpServletRequest request, HttpServletResponse response, Locale locale) {
+ String sImageId = request.getParameter("id");
+
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ AjaxResponse resp = new AjaxResponse();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+
+ try {
+
+
+ Long imageId = Long.parseLong(sImageId);
+
+
+ ProductImage productImage = productImageService.getById(imageId);
+ if(productImage==null) {
+ resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ if(productImage.getProduct().getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ productImageService.removeProductImage(productImage);
+
+ resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
+
+
+
+ } catch (Exception e) {
+ LOGGER.error("Error while deleting product price", e);
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/images/defaultImage.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> setDefaultImage(final HttpServletRequest request,
+ final HttpServletResponse response,
+ final Locale locale) {
+ final String sImageId = request.getParameter("id");
+ final MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ final AjaxResponse resp = new AjaxResponse();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+ try {
+ final Long imageId = Long.parseLong(sImageId);
+ final ProductImage productImage = productImageService.getById(imageId);
+
+ if (productImage == null) {
+ resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ if (productImage.getProduct().getMerchantStore().getId().intValue() != store.getId().intValue()) {
+ resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ productImage.setDefaultImage(true);
+ productImageService.saveOrUpdate(productImage);
+
+ final Set<ProductImage> images = productService.getById(productImage.getProduct().getId()).getImages();
+ for (final ProductImage image : images) {
+ if (image.getId() != productImage.getId()) {
+ image.setDefaultImage(false);
+ productImageService.saveOrUpdate(image);
+ }
+ }
+
+ resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
+ } catch (final Exception e) {
+ LOGGER.error("Error while set default image", e);
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ private void setMenu(Model model, HttpServletRequest request) throws Exception {
+
+ //display menu
+ Map<String,String> activeMenus = new HashMap<String,String>();
+ activeMenus.put("catalogue", "catalogue");
+ activeMenus.put("catalogue-products", "catalogue-products");
+
+ @SuppressWarnings("unchecked")
+ Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
+
+ Menu currentMenu = (Menu)menus.get("catalogue");
+ model.addAttribute("currentMenu",currentMenu);
+ model.addAttribute("activeMenus",activeMenus);
+ //
+
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/ProductReviewController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/ProductReviewController.java
index c435823..2c54a2a 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/ProductReviewController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/ProductReviewController.java
@@ -1,231 +1,231 @@
-package com.salesmanager.shop.admin.controller.products;
-
-import com.salesmanager.core.business.services.catalog.product.ProductService;
-import com.salesmanager.core.business.services.catalog.product.review.ProductReviewService;
-import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse;
-import com.salesmanager.core.business.utils.ajax.AjaxResponse;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.review.ProductReview;
-import com.salesmanager.core.model.catalog.product.review.ProductReviewDescription;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.admin.controller.ControllerConstants;
-import com.salesmanager.shop.admin.model.web.Menu;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.utils.LabelUtils;
-import org.apache.commons.collections4.CollectionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.*;
-
-@Controller
-public class ProductReviewController {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ProductReviewController.class);
-
- @Inject
- private ProductService productService;
-
- @Inject
- private ProductReviewService productReviewService;
-
- @Inject
- LabelUtils messages;
-
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/reviews.html", method=RequestMethod.GET)
- public String displayProductReviews(@RequestParam("id") long productId,Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- setMenu(model, request);
-
- Language language = (Language)request.getAttribute("LANGUAGE");
-
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- Product product = productService.getById(productId);
-
- if(product==null) {
- return "redirect:/admin/products/products.html";
- }
-
- if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- return "redirect:/admin/products/products.html";
- }
-
-
- model.addAttribute("product", product);
-
- return ControllerConstants.Tiles.Product.productReviews;
-
- }
-
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/reviews/paging.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> pageProductReviews(HttpServletRequest request, HttpServletResponse response) {
-
- String sProductId = request.getParameter("productId");
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
-
- AjaxResponse resp = new AjaxResponse();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
-
- Long productId;
- Product product = null;
-
- try {
- productId = Long.parseLong(sProductId);
- } catch (Exception e) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorString("Product id is not valid");
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- try {
-
- product = productService.getById(productId);
-
-
- if(product==null) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorString("Product id is not valid");
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorString("Product id is not valid");
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- Language language = (Language)request.getAttribute("LANGUAGE");
-
-
- List<ProductReview> reviews = productReviewService.getByProduct(product);
-
-
-
- for(ProductReview review : reviews) {
- Map entry = new HashMap();
- entry.put("reviewId", review.getId());
- entry.put("rating", review.getReviewRating().intValue());
- Set<ProductReviewDescription> descriptions = review.getDescriptions();
- String reviewDesc= "";
- if(!CollectionUtils.isEmpty(descriptions)) {
- reviewDesc = descriptions.iterator().next().getDescription();
- }
- //for(ProductReviewDescription description : descriptions){
- // if(description.getLanguage().getCode().equals(language.getCode())) {
- // reviewDesc = description.getDescription();
- // }
- //}
- entry.put("description", reviewDesc);
- resp.addDataEntry(entry);
- }
-
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
-
- } catch (Exception e) {
- LOGGER.error("Error while paging products", e);
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
-
-
- }
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/products/reviews/remove.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> deleteProductReview(HttpServletRequest request, HttpServletResponse response, Locale locale) {
- String sReviewid = request.getParameter("reviewId");
-
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- AjaxResponse resp = new AjaxResponse();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
-
-
- try {
-
- Long reviewId = Long.parseLong(sReviewid);
-
-
- ProductReview review = productReviewService.getById(reviewId);
-
-
- if(review==null || review.getProduct().getMerchantStore().getId().intValue()!=store.getId()) {
-
- resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- productReviewService.delete(review);
-
-
- resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
-
-
-
- } catch (Exception e) {
- LOGGER.error("Error while deleting category", e);
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- private void setMenu(Model model, HttpServletRequest request) throws Exception {
-
- //display menu
- Map<String,String> activeMenus = new HashMap<String,String>();
- activeMenus.put("catalogue", "catalogue");
- activeMenus.put("catalogue-products", "catalogue-products");
-
- @SuppressWarnings("unchecked")
- Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
-
- Menu currentMenu = (Menu)menus.get("catalogue");
- model.addAttribute("currentMenu",currentMenu);
- model.addAttribute("activeMenus",activeMenus);
- //
-
- }
-
-
-
-}
+package com.salesmanager.shop.admin.controller.products;
+
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.review.ProductReviewService;
+import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse;
+import com.salesmanager.core.business.utils.ajax.AjaxResponse;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.review.ProductReview;
+import com.salesmanager.core.model.catalog.product.review.ProductReviewDescription;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.admin.controller.ControllerConstants;
+import com.salesmanager.shop.admin.model.web.Menu;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.utils.LabelUtils;
+import org.apache.commons.collections4.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+
+@Controller
+public class ProductReviewController {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ProductReviewController.class);
+
+ @Inject
+ private ProductService productService;
+
+ @Inject
+ private ProductReviewService productReviewService;
+
+ @Inject
+ LabelUtils messages;
+
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/reviews.html", method=RequestMethod.GET)
+ public String displayProductReviews(@RequestParam("id") long productId,Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ setMenu(model, request);
+
+ Language language = (Language)request.getAttribute("LANGUAGE");
+
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ Product product = productService.getById(productId);
+
+ if(product==null) {
+ return "redirect:/admin/products/products.html";
+ }
+
+ if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ return "redirect:/admin/products/products.html";
+ }
+
+
+ model.addAttribute("product", product);
+
+ return ControllerConstants.Tiles.Product.productReviews;
+
+ }
+
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/reviews/paging.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> pageProductReviews(HttpServletRequest request, HttpServletResponse response) {
+
+ String sProductId = request.getParameter("productId");
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+
+ AjaxResponse resp = new AjaxResponse();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+ Long productId;
+ Product product = null;
+
+ try {
+ productId = Long.parseLong(sProductId);
+ } catch (Exception e) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorString("Product id is not valid");
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ try {
+
+ product = productService.getById(productId);
+
+
+ if(product==null) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorString("Product id is not valid");
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorString("Product id is not valid");
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ Language language = (Language)request.getAttribute("LANGUAGE");
+
+
+ List<ProductReview> reviews = productReviewService.getByProduct(product);
+
+
+
+ for(ProductReview review : reviews) {
+ Map entry = new HashMap();
+ entry.put("reviewId", review.getId());
+ entry.put("rating", review.getReviewRating().intValue());
+ Set<ProductReviewDescription> descriptions = review.getDescriptions();
+ String reviewDesc= "";
+ if(!CollectionUtils.isEmpty(descriptions)) {
+ reviewDesc = descriptions.iterator().next().getDescription();
+ }
+ //for(ProductReviewDescription description : descriptions){
+ // if(description.getLanguage().getCode().equals(language.getCode())) {
+ // reviewDesc = description.getDescription();
+ // }
+ //}
+ entry.put("description", reviewDesc);
+ resp.addDataEntry(entry);
+ }
+
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging products", e);
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+
+ }
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/products/reviews/remove.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> deleteProductReview(HttpServletRequest request, HttpServletResponse response, Locale locale) {
+ String sReviewid = request.getParameter("reviewId");
+
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ AjaxResponse resp = new AjaxResponse();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+
+ try {
+
+ Long reviewId = Long.parseLong(sReviewid);
+
+
+ ProductReview review = productReviewService.getById(reviewId);
+
+
+ if(review==null || review.getProduct().getMerchantStore().getId().intValue()!=store.getId()) {
+
+ resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ productReviewService.delete(review);
+
+
+ resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
+
+
+
+ } catch (Exception e) {
+ LOGGER.error("Error while deleting category", e);
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ private void setMenu(Model model, HttpServletRequest request) throws Exception {
+
+ //display menu
+ Map<String,String> activeMenus = new HashMap<String,String>();
+ activeMenus.put("catalogue", "catalogue");
+ activeMenus.put("catalogue-products", "catalogue-products");
+
+ @SuppressWarnings("unchecked")
+ Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
+
+ Menu currentMenu = (Menu)menus.get("catalogue");
+ model.addAttribute("currentMenu",currentMenu);
+ model.addAttribute("activeMenus",activeMenus);
+ //
+
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/RelatedItemsController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/RelatedItemsController.java
index 66e5519..884af30 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/RelatedItemsController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/products/RelatedItemsController.java
@@ -1,331 +1,331 @@
-package com.salesmanager.shop.admin.controller.products;
-
-import com.salesmanager.core.business.services.catalog.category.CategoryService;
-import com.salesmanager.core.business.services.catalog.product.ProductService;
-import com.salesmanager.core.business.services.catalog.product.relationship.ProductRelationshipService;
-import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse;
-import com.salesmanager.core.business.utils.ajax.AjaxResponse;
-import com.salesmanager.core.model.catalog.category.Category;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.description.ProductDescription;
-import com.salesmanager.core.model.catalog.product.relationship.ProductRelationship;
-import com.salesmanager.core.model.catalog.product.relationship.ProductRelationshipType;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.admin.controller.ControllerConstants;
-import com.salesmanager.shop.admin.model.web.Menu;
-import com.salesmanager.shop.constants.Constants;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-
-@Controller
-public class RelatedItemsController {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(RelatedItemsController.class);
-
- @Inject
- CategoryService categoryService;
-
- @Inject
- ProductService productService;
-
- @Inject
- ProductRelationshipService productRelationshipService;
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/catalogue/related/list.html", method=RequestMethod.GET)
- public String displayRelatedItems(@RequestParam("id") long productId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
- setMenu(model,request);
-
- Language language = (Language)request.getAttribute("LANGUAGE");
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- //get the product and validate it belongs to the current merchant
- Product product = productService.getById(productId);
-
- if(product==null) {
- return "redirect:/admin/products/products.html";
- }
-
- if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- return "redirect:/admin/products/products.html";
- }
-
-
- List<Category> categories = categoryService.listByStore(store,language);
-
- model.addAttribute("categories", categories);
- model.addAttribute("product", product);
- return ControllerConstants.Tiles.Product.relatedItems;
-
- }
-
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/catalogue/related/paging.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> pageRelatedItems(HttpServletRequest request, HttpServletResponse response) {
-
- String sProductId = request.getParameter("productId");
- AjaxResponse resp = new AjaxResponse();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
-
- try {
-
-
-
- Long productId = Long.parseLong(sProductId);
- Product product = productService.getById(productId);
-
- Language language = (Language)request.getAttribute("LANGUAGE");
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
-
- if(product==null || product.getMerchantStore().getId().intValue()!= store.getId().intValue()) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorString("Product id is not valid");
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
-
- List<ProductRelationship> relationships = productRelationshipService.getByType(store, product, ProductRelationshipType.RELATED_ITEM, language);
-
- for(ProductRelationship relationship : relationships) {
-
- Product relatedProduct = relationship.getRelatedProduct();
- Map entry = new HashMap();
- entry.put("relationshipId", relationship.getId());
- entry.put("productId", relatedProduct.getId());
-
- ProductDescription description = relatedProduct.getDescriptions().iterator().next();
- Set<ProductDescription> descriptions = relatedProduct.getDescriptions();
- for(ProductDescription desc : descriptions) {
- if(desc.getLanguage().getId().intValue()==language.getId().intValue()) {
- description = desc;
- }
- }
-
-
- entry.put("name", description.getName());
- entry.put("sku", relatedProduct.getSku());
- entry.put("available", relatedProduct.isAvailable());
- resp.addDataEntry(entry);
-
- }
-
-
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
-
- } catch (Exception e) {
- LOGGER.error("Error while paging products", e);
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
-
-
- }
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/catalogue/related/addItem.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> addItem(HttpServletRequest request, HttpServletResponse response) {
-
- String productId = request.getParameter("productId");
- String baseProductId = request.getParameter("baseProductId");
- AjaxResponse resp = new AjaxResponse();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
-
- try {
-
-
- Long lProductId = Long.parseLong(productId);
- Long lBaseProductId = Long.parseLong(baseProductId);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- Product product = productService.getById(lProductId);
-
- if(product==null) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- Product baseProduct = productService.getById(lBaseProductId);
-
- if(baseProduct==null) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- if(baseProduct.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- ProductRelationship relationship = new ProductRelationship();
- relationship.setActive(true);
- relationship.setProduct(baseProduct);
- relationship.setCode(ProductRelationshipType.RELATED_ITEM.name());
- relationship.setStore(store);
- relationship.setRelatedProduct(product);
-
- productRelationshipService.saveOrUpdate(relationship);
-
-
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
-
- } catch (Exception e) {
- LOGGER.error("Error while paging products", e);
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
-
- }
-
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping(value="/admin/catalogue/related/removeItem.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> removeItem(HttpServletRequest request, HttpServletResponse response) {
-
- String productId = request.getParameter("productId");
- String baseProductId = request.getParameter("baseProductId");
- AjaxResponse resp = new AjaxResponse();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
-
- try {
-
-
- Long lproductId = Long.parseLong(productId);
- Long lBaseProductId = Long.parseLong(baseProductId);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- Product product = productService.getById(lproductId);
-
- if(product==null) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- Product baseProduct = productService.getById(lBaseProductId);
-
- if(baseProduct==null) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- if(baseProduct.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- ProductRelationship relationship = null;
- List<ProductRelationship> relationships = productRelationshipService.getByType(store, baseProduct, ProductRelationshipType.RELATED_ITEM);
-
- for(ProductRelationship r : relationships) {
- if(r.getRelatedProduct().getId().longValue()==lproductId.longValue()) {
- relationship = r;
- break;
- }
- }
-
- if(relationship==null) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- if(relationship.getStore().getId().intValue()!=store.getId().intValue()) {
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
-
-
- productRelationshipService.delete(relationship);
-
-
- resp.setStatus(AjaxPageableResponse.RESPONSE_OPERATION_COMPLETED);
-
- } catch (Exception e) {
- LOGGER.error("Error while paging products", e);
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
-
- }
-
-
- private void setMenu(Model model, HttpServletRequest request) throws Exception {
-
- //display menu
- Map<String,String> activeMenus = new HashMap<String,String>();
- activeMenus.put("catalogue", "catalogue");
- activeMenus.put("catalogue-products", "catalogue-products");
-
- @SuppressWarnings("unchecked")
- Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
-
- Menu currentMenu = (Menu)menus.get("catalogue");
- model.addAttribute("currentMenu",currentMenu);
- model.addAttribute("activeMenus",activeMenus);
- //
-
- }
-
-}
+package com.salesmanager.shop.admin.controller.products;
+
+import com.salesmanager.core.business.services.catalog.category.CategoryService;
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.relationship.ProductRelationshipService;
+import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse;
+import com.salesmanager.core.business.utils.ajax.AjaxResponse;
+import com.salesmanager.core.model.catalog.category.Category;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.description.ProductDescription;
+import com.salesmanager.core.model.catalog.product.relationship.ProductRelationship;
+import com.salesmanager.core.model.catalog.product.relationship.ProductRelationshipType;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.admin.controller.ControllerConstants;
+import com.salesmanager.shop.admin.model.web.Menu;
+import com.salesmanager.shop.constants.Constants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+
+@Controller
+public class RelatedItemsController {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(RelatedItemsController.class);
+
+ @Inject
+ CategoryService categoryService;
+
+ @Inject
+ ProductService productService;
+
+ @Inject
+ ProductRelationshipService productRelationshipService;
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/catalogue/related/list.html", method=RequestMethod.GET)
+ public String displayRelatedItems(@RequestParam("id") long productId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ setMenu(model,request);
+
+ Language language = (Language)request.getAttribute("LANGUAGE");
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ //get the product and validate it belongs to the current merchant
+ Product product = productService.getById(productId);
+
+ if(product==null) {
+ return "redirect:/admin/products/products.html";
+ }
+
+ if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ return "redirect:/admin/products/products.html";
+ }
+
+
+ List<Category> categories = categoryService.listByStore(store,language);
+
+ model.addAttribute("categories", categories);
+ model.addAttribute("product", product);
+ return ControllerConstants.Tiles.Product.relatedItems;
+
+ }
+
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/catalogue/related/paging.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> pageRelatedItems(HttpServletRequest request, HttpServletResponse response) {
+
+ String sProductId = request.getParameter("productId");
+ AjaxResponse resp = new AjaxResponse();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+ try {
+
+
+
+ Long productId = Long.parseLong(sProductId);
+ Product product = productService.getById(productId);
+
+ Language language = (Language)request.getAttribute("LANGUAGE");
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+
+ if(product==null || product.getMerchantStore().getId().intValue()!= store.getId().intValue()) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorString("Product id is not valid");
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+
+ List<ProductRelationship> relationships = productRelationshipService.getByType(store, product, ProductRelationshipType.RELATED_ITEM, language);
+
+ for(ProductRelationship relationship : relationships) {
+
+ Product relatedProduct = relationship.getRelatedProduct();
+ Map entry = new HashMap();
+ entry.put("relationshipId", relationship.getId());
+ entry.put("productId", relatedProduct.getId());
+
+ ProductDescription description = relatedProduct.getDescriptions().iterator().next();
+ Set<ProductDescription> descriptions = relatedProduct.getDescriptions();
+ for(ProductDescription desc : descriptions) {
+ if(desc.getLanguage().getId().intValue()==language.getId().intValue()) {
+ description = desc;
+ }
+ }
+
+
+ entry.put("name", description.getName());
+ entry.put("sku", relatedProduct.getSku());
+ entry.put("available", relatedProduct.isAvailable());
+ resp.addDataEntry(entry);
+
+ }
+
+
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging products", e);
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+
+ }
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/catalogue/related/addItem.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> addItem(HttpServletRequest request, HttpServletResponse response) {
+
+ String productId = request.getParameter("productId");
+ String baseProductId = request.getParameter("baseProductId");
+ AjaxResponse resp = new AjaxResponse();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+ try {
+
+
+ Long lProductId = Long.parseLong(productId);
+ Long lBaseProductId = Long.parseLong(baseProductId);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ Product product = productService.getById(lProductId);
+
+ if(product==null) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ Product baseProduct = productService.getById(lBaseProductId);
+
+ if(baseProduct==null) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ if(baseProduct.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ ProductRelationship relationship = new ProductRelationship();
+ relationship.setActive(true);
+ relationship.setProduct(baseProduct);
+ relationship.setCode(ProductRelationshipType.RELATED_ITEM.name());
+ relationship.setStore(store);
+ relationship.setRelatedProduct(product);
+
+ productRelationshipService.saveOrUpdate(relationship);
+
+
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging products", e);
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+ }
+
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping(value="/admin/catalogue/related/removeItem.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> removeItem(HttpServletRequest request, HttpServletResponse response) {
+
+ String productId = request.getParameter("productId");
+ String baseProductId = request.getParameter("baseProductId");
+ AjaxResponse resp = new AjaxResponse();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+ try {
+
+
+ Long lproductId = Long.parseLong(productId);
+ Long lBaseProductId = Long.parseLong(baseProductId);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ Product product = productService.getById(lproductId);
+
+ if(product==null) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ Product baseProduct = productService.getById(lBaseProductId);
+
+ if(baseProduct==null) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ if(baseProduct.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ ProductRelationship relationship = null;
+ List<ProductRelationship> relationships = productRelationshipService.getByType(store, baseProduct, ProductRelationshipType.RELATED_ITEM);
+
+ for(ProductRelationship r : relationships) {
+ if(r.getRelatedProduct().getId().longValue()==lproductId.longValue()) {
+ relationship = r;
+ break;
+ }
+ }
+
+ if(relationship==null) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ if(relationship.getStore().getId().intValue()!=store.getId().intValue()) {
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+
+
+ productRelationshipService.delete(relationship);
+
+
+ resp.setStatus(AjaxPageableResponse.RESPONSE_OPERATION_COMPLETED);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging products", e);
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+ }
+
+
+ private void setMenu(Model model, HttpServletRequest request) throws Exception {
+
+ //display menu
+ Map<String,String> activeMenus = new HashMap<String,String>();
+ activeMenus.put("catalogue", "catalogue");
+ activeMenus.put("catalogue-products", "catalogue-products");
+
+ @SuppressWarnings("unchecked")
+ Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
+
+ Menu currentMenu = (Menu)menus.get("catalogue");
+ model.addAttribute("currentMenu",currentMenu);
+ model.addAttribute("activeMenus",activeMenus);
+ //
+
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/CustomShippingMethodsController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/CustomShippingMethodsController.java
index fca2ba6..c4fe3bf 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/CustomShippingMethodsController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/CustomShippingMethodsController.java
@@ -1,771 +1,771 @@
-package com.salesmanager.shop.admin.controller.shipping;
-
-import com.salesmanager.core.business.services.reference.country.CountryService;
-import com.salesmanager.core.business.services.shipping.ShippingService;
-import com.salesmanager.core.business.utils.ProductPriceUtils;
-import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse;
-import com.salesmanager.core.business.utils.ajax.AjaxResponse;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.shipping.ShippingConfiguration;
-import com.salesmanager.core.model.shipping.ShippingType;
-import com.salesmanager.core.model.system.IntegrationConfiguration;
-import com.salesmanager.core.modules.integration.IntegrationException;
-import com.salesmanager.core.modules.integration.shipping.model.CustomShippingQuoteWeightItem;
-import com.salesmanager.core.modules.integration.shipping.model.CustomShippingQuotesConfiguration;
-import com.salesmanager.core.modules.integration.shipping.model.CustomShippingQuotesRegion;
-import com.salesmanager.shop.admin.controller.ControllerConstants;
-import com.salesmanager.shop.admin.model.web.Menu;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.utils.LabelUtils;
-import org.apache.commons.beanutils.BeanComparator;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.BindingResult;
-import org.springframework.validation.ObjectError;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.math.BigDecimal;
-import java.util.*;
-
-@Controller
-public class CustomShippingMethodsController {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(CustomShippingMethodsController.class);
-
-
- public final static String WEIGHT_BASED_SHIPPING_METHOD = "weightBased";
-
- @Inject
- private ShippingService shippingService;
-
- @Inject
- private CountryService countryService;
-
- @Inject
- private ProductPriceUtils priceUtil;
-
- @Inject
- LabelUtils messages;
-
-
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/weightBased.html", method=RequestMethod.GET)
- public String getWeightBasedShippingMethod(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
- this.setMenu(model, request);
-
- populateModel(model, request, response);
-
- return ControllerConstants.Tiles.Shipping.shippingMethod;
-
-
- }
-
-
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/addCustomRegion.html", method=RequestMethod.POST)
- public String addCustomRegion(@ModelAttribute("region") String region, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- this.setMenu(model, request);
- populateModel(model, request, response);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)shippingService.getCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, store);
-
- List<CustomShippingQuotesRegion> regions = customConfiguration.getRegions();
-
- if(StringUtils.isBlank(region)) {
- model.addAttribute("errorMessage",messages.getMessage("message.region.null", locale));
- ObjectError error = new ObjectError("region",messages.getMessage("message.region.null", locale));
- result.addError(error);
- }
-
-
- for(CustomShippingQuotesRegion customRegion : regions) {
- if(customRegion.getCustomRegionName().equals(region)) {
- model.addAttribute("errorMessage",messages.getMessage("message.region.null", locale));
- ObjectError error = new ObjectError("region",messages.getMessage("message.region.exists", locale));
- result.addError(error);
- break;
- }
- }
-
- if (result.hasErrors()) {
- return ControllerConstants.Tiles.Shipping.shippingMethod;
- }
-
-
- CustomShippingQuotesRegion quoteRegion = new CustomShippingQuotesRegion();
- quoteRegion.setCustomRegionName(region);
-
- customConfiguration.getRegions().add(quoteRegion);
- shippingService.saveCustomShippingConfiguration(this.WEIGHT_BASED_SHIPPING_METHOD, customConfiguration, store);
-
- model.addAttribute("customConfiguration", customConfiguration);
- model.addAttribute("success","success");
-
- return ControllerConstants.Tiles.Shipping.shippingMethod;
-
- }
-
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/addCountryToRegion.html", method=RequestMethod.POST)
- public String addCountryToCustomRegion(@ModelAttribute("customRegion") CustomShippingQuotesRegion customRegion, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- this.setMenu(model, request);
- populateModel(model, request, response);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)shippingService.getCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, store);
-
- List<CustomShippingQuotesRegion> regions = customConfiguration.getRegions();
-
-
- if(StringUtils.isBlank(customRegion.getCustomRegionName())) {
- model.addAttribute("errorMessageAssociation",messages.getMessage("message.region.null", locale));
- ObjectError error = new ObjectError("region",messages.getMessage("message.region.exists", locale));
- result.addError(error);
- }
-
-
- for(CustomShippingQuotesRegion region : regions) {
- if(region.getCustomRegionName().equals(customRegion.getCustomRegionName())) {
- List<String> countries = region.getCountries();
- if(countries!=null) {
- for(String countryCode : countries) {
- if(countryCode.equals(customRegion.getCountries().get(0))) {
- model.addAttribute("errorMessageAssociation",messages.getMessage("message.region.exists", locale));
- ObjectError error = new ObjectError("region",messages.getMessage("message.region.exists", locale));
- result.addError(error);
- break;
- }
- }
-
- countries.add(customRegion.getCountries().get(0));
-
- } else {
- List<String> countriesList = new ArrayList<String>();
- countriesList.add(customRegion.getCountries().get(0));
- region.setCountries(countriesList);
- }
- }
- }
-
- if (result.hasErrors()) {
- return ControllerConstants.Tiles.Shipping.shippingMethod;
- }
-
-
- shippingService.saveCustomShippingConfiguration(this.WEIGHT_BASED_SHIPPING_METHOD, customConfiguration, store);
- model.addAttribute("customConfiguration", customConfiguration);
- model.addAttribute("success","success");
-
- return ControllerConstants.Tiles.Shipping.shippingMethod;
-
- }
-
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/saveweightBasedShippingMethod.html", method=RequestMethod.POST)
- public String saveShippingMethod(@ModelAttribute("configuration") CustomShippingQuotesConfiguration configuration, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
-
- this.setMenu(model, request);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- populateModel(model, request, response);
-
- String moduleCode = configuration.getModuleCode();
- LOGGER.debug("Saving module code " + moduleCode);
-
- List<String> environments = new ArrayList<String>();
- environments.add(com.salesmanager.core.business.constants.Constants.TEST_ENVIRONMENT);
- environments.add(com.salesmanager.core.business.constants.Constants.PRODUCTION_ENVIRONMENT);
-
- model.addAttribute("environments", environments);
- model.addAttribute("configuration", configuration);
-
- try {
-
-
- CustomShippingQuotesConfiguration dbConfig = (CustomShippingQuotesConfiguration) shippingService.getCustomShippingConfiguration(this.WEIGHT_BASED_SHIPPING_METHOD, store);
-
-
- shippingService.saveShippingQuoteModuleConfiguration(configuration, store);
- if(dbConfig!=null) {
- dbConfig.setActive(configuration.isActive());
- shippingService.saveCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, dbConfig, store);
- } else {
- shippingService.saveCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, configuration, store);
- }
-
-
-
-
- } catch (Exception e) {
- if(e instanceof IntegrationException) {
- if(((IntegrationException)e).getErrorCode()==IntegrationException.ERROR_VALIDATION_SAVE) {
-
- List<String> errorCodes = ((IntegrationException)e).getErrorFields();
- for(String errorCode : errorCodes) {
- model.addAttribute(errorCode,messages.getMessage("message.fielderror", locale));
- }
- return ControllerConstants.Tiles.Shipping.shippingMethod;
- }
- } else {
- throw new Exception(e);
- }
- }
-
-
- model.addAttribute("success","success");
- return ControllerConstants.Tiles.Shipping.shippingMethod;
-
-
- }
-
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/weightBased/removeCountry.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> deleteCountry(HttpServletRequest request, HttpServletResponse response, Locale locale) {
- String country = request.getParameter("regionCode");
-
- AjaxResponse resp = new AjaxResponse();
-
-
- try {
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)shippingService.getCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, store);
-
- if(customConfiguration!=null) {
-
- List<CustomShippingQuotesRegion> quotes = customConfiguration.getRegions();
- for (CustomShippingQuotesRegion quote : quotes) {
- List<String> countries = quote.getCountries();
- List<String> newCountries = new ArrayList<String>();
- if(countries!=null) {
- for(String cntry : countries) {
- if(!cntry.equals(country)) {
- newCountries.add(cntry);
- }
- }
- }
- quote.setCountries(newCountries);
- }
-
- }
-
- shippingService.saveCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, customConfiguration, store);
-
- resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
-
- } catch (Exception e) {
- LOGGER.error("Error while paging custom weight based", e);
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- }
-
- String returnString = resp.toJSONString();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/weightBased/removePrice.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> deletePrice(HttpServletRequest request, HttpServletResponse response, Locale locale) {
- String weight = request.getParameter("weight");
- String region = request.getParameter("region");
- int maxWeight = 0;
- try {
- maxWeight = Integer.parseInt(weight);
- } catch (Exception e) {
- LOGGER.error("Weight (integer) malformed " + weight);
- }
-
- AjaxResponse resp = new AjaxResponse();
-
-
- try {
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)shippingService.getCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, store);
-
- if(customConfiguration!=null) {
-
- List<CustomShippingQuotesRegion> quotes = customConfiguration.getRegions();
-
- for (CustomShippingQuotesRegion quote : quotes) {
-
-
- if(quote.getCustomRegionName().equals(region)) {
- List<CustomShippingQuoteWeightItem> quoteItems = quote.getQuoteItems();
-
- if(quoteItems!=null) {
- List<CustomShippingQuoteWeightItem> newQuoteItems = new ArrayList<CustomShippingQuoteWeightItem>();
- for(CustomShippingQuoteWeightItem q : quoteItems) {
- if(maxWeight!=q.getMaximumWeight()) {
- newQuoteItems.add(q);
- }
- }
- quote.setQuoteItems(newQuoteItems);
- break;
- }
- }
-
- }
-
- }
-
- shippingService.saveCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, customConfiguration, store);
-
- resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
-
- } catch (Exception e) {
- LOGGER.error("Error while paging custom weight based", e);
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- }
-
- String returnString = resp.toJSONString();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/deleteWeightBasedShippingMethod.html", method=RequestMethod.POST)
- public String deleteShippingMethod(BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- this.setMenu(model, request);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- shippingService.removeCustomShippingQuoteModuleConfiguration(WEIGHT_BASED_SHIPPING_METHOD, store);
-
-
- return ControllerConstants.Tiles.Shipping.shippingMethods;
-
- }
-
- /**
- * Check if a region code already exist with the same name
- * @param request
- * @param response
- * @param locale
- * @return
- */
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/checkRegionCode.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> checkRegionCode(HttpServletRequest request, HttpServletResponse response, Locale locale) {
- String code = request.getParameter("code");
-
-
- AjaxResponse resp = new AjaxResponse();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- try {
-
- if(StringUtils.isBlank(code)) {
- resp.setStatus(AjaxResponse.CODE_ALREADY_EXIST);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)shippingService.getCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, store);
-
- if(customConfiguration!=null) {
- List<CustomShippingQuotesRegion> regions = customConfiguration.getRegions();
- for(CustomShippingQuotesRegion region : regions) {
-
- if(code.equals(region.getCustomRegionName())) {
- resp.setStatus(AjaxResponse.CODE_ALREADY_EXIST);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- }
- }
-
- resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
-
- } catch (Exception e) {
- LOGGER.error("Error while getting user", e);
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value = "/admin/shipping/weightBased/page.html", method = RequestMethod.POST)
- public @ResponseBody
- ResponseEntity<String> pageCustomShipping(HttpServletRequest request,
- HttpServletResponse response) {
-
- AjaxResponse resp = new AjaxResponse();
-
- Language language = (Language)request.getAttribute("LANGUAGE");
- try {
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)shippingService.getCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, store);
-
- Map<String,Country> countriesMap = countryService.getCountriesMap(language);
-
- if(customConfiguration!=null) {
- List<CustomShippingQuotesRegion> quotes = customConfiguration.getRegions();
- for (CustomShippingQuotesRegion quote : quotes) {
- List<String> countries = quote.getCountries();
- if(countries!=null) {
- for(String country : countries) {
- Map<String,String> entry = new HashMap<String,String> ();
- entry.put("regionCode", country);
- entry.put("region", quote.getCustomRegionName());
- entry.put("country", countriesMap.get(country).getName());
- resp.addDataEntry(entry);
- }
- }
- }
- }
-
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
-
- } catch (Exception e) {
- LOGGER.error("Error while paging custom weight based", e);
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- }
-
- String returnString = resp.toJSONString();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- /**
- * Edit custom region
- * @param region
- * @param model
- * @param request
- * @param response
- * @param locale
- * @return
- * @throws Exception
- */
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/weightBased/edit.html", method=RequestMethod.GET)
- public String editCustomShipping(@ModelAttribute("customRegionName") String region, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- setMenu(model,request);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)shippingService.getCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, store);
- CustomShippingQuotesRegion aRegion = null;
-
- List<CustomShippingQuotesRegion> regions = customConfiguration.getRegions();
- for(CustomShippingQuotesRegion customRegion : regions) {
- if(customRegion.getCustomRegionName().equals(region)) {
- aRegion = customRegion;
- break;
- }
- }
-
- if(aRegion==null) {
- return "redirect:/admin/shipping/shippingMethods.html";
- }
-
- model.addAttribute("customRegion", aRegion);
-
-
- return ControllerConstants.Tiles.Shipping.customShippingWeightBased;
- }
-
-
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value = "/admin/shipping/weightBasedDetails/page.html", method = RequestMethod.POST)
- public @ResponseBody
- ResponseEntity<String> pageCustomShippingDetails(HttpServletRequest request,
- HttpServletResponse response) {
-
- String region = request.getParameter("region");
-
- AjaxResponse resp = new AjaxResponse();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
-
- if(StringUtils.isBlank(region)){
-
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorString("Region is not valid");
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
-
- }
-
-
- try {
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)shippingService.getCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, store);
-
- List<CustomShippingQuotesRegion> quotes = customConfiguration.getRegions();
- for (CustomShippingQuotesRegion quote : quotes) {
-
- if(quote.getCustomRegionName().equals(region)) {
-
- List<CustomShippingQuoteWeightItem> quoteItems = quote.getQuoteItems();
- if(quoteItems!=null) {
- for(CustomShippingQuoteWeightItem quoteItem : quoteItems) {
- Map<String,String> entry = new HashMap<String,String> ();
- entry.put("price", priceUtil.getAdminFormatedAmountWithCurrency(store,quoteItem.getPrice()));
- entry.put("weight", String.valueOf(quoteItem.getMaximumWeight()));
- resp.addDataEntry(entry);
- }
- }
- }
- }
-
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
-
- } catch (Exception e) {
- LOGGER.error("Error while paging products", e);
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
-
-
- @SuppressWarnings("unchecked")
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/weightBased/addPrice.html", method=RequestMethod.POST)
- public String addPrice(@ModelAttribute("region") String customRegion, @ModelAttribute("customQuote") CustomShippingQuoteWeightItem customQuote, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- this.setMenu(model, request);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)shippingService.getCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, store);
-
- List<CustomShippingQuotesRegion> regions = customConfiguration.getRegions();
-
- try {
- BigDecimal price = new BigDecimal(customQuote.getPriceText());
- customQuote.setPrice(price);
- } catch(Exception e) {
- ObjectError error = new ObjectError("priceText",messages.getMessage("message.invalid.price", locale));
- result.addError(error);
- }
-
-
- int weight = customQuote.getMaximumWeight();
- if(weight<=0) {
- ObjectError error = new ObjectError("maximumWeight",messages.getMessage("message.maximumWeight.invalid", locale));
- result.addError(error);
- }
-
-
-
- for(CustomShippingQuotesRegion customReg : regions) {
- if(customReg.getCustomRegionName().equals(customRegion)) {
- model.addAttribute("customRegion", customReg);
- break;
- }
- }
-
-
- if(StringUtils.isBlank(customQuote.getPriceText())) {
- ObjectError error = new ObjectError("priceText",messages.getMessage("message.invalid.price", locale));
- result.addError(error);
- }
-
- CustomShippingQuotesRegion currentRegion = null;
-
-
- for(CustomShippingQuotesRegion region : regions) {
- if(region.getCustomRegionName().equals(customRegion)) {
- currentRegion = region;
- List<CustomShippingQuoteWeightItem> quotes = region.getQuoteItems();
- if(quotes!=null) {
- for(CustomShippingQuoteWeightItem quote : quotes) {
-
- if(quote.getMaximumWeight()==customQuote.getMaximumWeight()){
- ObjectError error = new ObjectError("maximumWeight",messages.getMessage("label.message.maximumWeight.exist", locale));
- result.addError(error);
- break;
- }
- }
- quotes.add(customQuote);
- } else {
- quotes = new ArrayList<CustomShippingQuoteWeightItem>();
- quotes.add(customQuote);
- region.setQuoteItems(quotes);
- }
- }
- }
-
- model.addAttribute("customConfiguration", customConfiguration);
-
- if (result.hasErrors()) {
- return ControllerConstants.Tiles.Shipping.customShippingWeightBased;
- }
-
- //order weights
- if(currentRegion!=null) {
- List<CustomShippingQuoteWeightItem> quotes = currentRegion.getQuoteItems();
- if(quotes!=null) {
-
-
- BeanComparator beanComparator = new BeanComparator("maximumWeight");
- Collections.sort(quotes, beanComparator);
-
-
- }
- }
-
-
- shippingService.saveCustomShippingConfiguration(this.WEIGHT_BASED_SHIPPING_METHOD, customConfiguration, store);
-
- model.addAttribute("success","success");
-
- return ControllerConstants.Tiles.Shipping.customShippingWeightBased;
-
- }
-
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/weightBased/deleteRegion.html", method=RequestMethod.POST)
- public String deleteRegion(@ModelAttribute("customRegionName") String region, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- this.setMenu(model, request);
-
-
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
-
- CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)shippingService.getCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, store);
-
- List<CustomShippingQuotesRegion> regions = customConfiguration.getRegions();
-
- List<CustomShippingQuotesRegion> newRegions = new ArrayList<CustomShippingQuotesRegion>();
- for(CustomShippingQuotesRegion reg : regions) {
-
- if(!reg.getCustomRegionName().equals(region)) {
- newRegions.add(reg);
- }
- }
-
- customConfiguration.setRegions(newRegions);
- shippingService.saveCustomShippingConfiguration(this.WEIGHT_BASED_SHIPPING_METHOD, customConfiguration, store);
- populateModel(model, request, response);
- model.addAttribute("success","success");
- return ControllerConstants.Tiles.Shipping.shippingMethod;
- }
-
-
-
-
-
- private void populateModel(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- Language language = (Language)request.getAttribute("LANGUAGE");
-
- ShippingConfiguration shippingConfiguration = shippingService.getShippingConfiguration(store);
-
- if(shippingConfiguration==null) {
- shippingConfiguration = new ShippingConfiguration();
- shippingConfiguration.setShippingType(ShippingType.INTERNATIONAL);
- }
-
-
- //get configured shipping modules
- Map<String,IntegrationConfiguration> configuredModules = shippingService.getShippingModulesConfigured(store);
- IntegrationConfiguration configuration = new IntegrationConfiguration();
- if(configuredModules!=null) {
- for(String key : configuredModules.keySet()) {
- if(key.equals(WEIGHT_BASED_SHIPPING_METHOD)) {
- configuration = configuredModules.get(key);
- break;
- }
- }
- }
- configuration.setModuleCode(WEIGHT_BASED_SHIPPING_METHOD);
-
- //get custom information
- CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)shippingService.getCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, store);
-
- if(customConfiguration==null) {
- customConfiguration = new CustomShippingQuotesConfiguration();
- customConfiguration.setModuleCode(this.WEIGHT_BASED_SHIPPING_METHOD);
- }
-
-
- //get supported countries
- //List<String> includedCountries = shippingService.getSupportedCountries(store);
- List<Country> shipToCountries = shippingService.getShipToCountryList(store, language);
-/* List<Country> shippingCountries = new ArrayList<Country>();
- Map<String,Country> countries = countryService.getCountriesMap(language);
- if(shippingConfiguration.getShippingType().name().equals(ShippingType.INTERNATIONAL.name())){
-
- for(String key : countries.keySet()) {
- Country country = (Country)countries.get(key);
- if(includedCountries.contains(key)) {
- shippingCountries.add(country);
- }
- }
- } else {//if national only store country
- if(!includedCountries.contains(store.getCountry().getIsoCode())) {
- shippingCountries.add((Country)countries.get(store.getCountry().getIsoCode()));
- }
- }*/
-
- CustomShippingQuotesRegion customRegion = new CustomShippingQuotesRegion();
-
-
- List<String> environments = new ArrayList<String>();
- environments.add(com.salesmanager.core.business.constants.Constants.PRODUCTION_ENVIRONMENT);//only production
-
- model.addAttribute("environments", environments);
- model.addAttribute("configuration", configuration);
- model.addAttribute("customConfiguration", customConfiguration);
- model.addAttribute("customRegion", customRegion);
- model.addAttribute("shippingCountries", shipToCountries);
-
-
- }
-
- private void setMenu(Model model, HttpServletRequest request) throws Exception {
-
- //display menu
- Map<String,String> activeMenus = new HashMap<String,String>();
- activeMenus.put("shipping", "shipping");
- activeMenus.put("shipping-methods", "shipping-methods");
-
- @SuppressWarnings("unchecked")
- Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
-
- Menu currentMenu = (Menu)menus.get("shipping");
- model.addAttribute("currentMenu",currentMenu);
- model.addAttribute("activeMenus",activeMenus);
- //
-
- }
-
-
-}
+package com.salesmanager.shop.admin.controller.shipping;
+
+import com.salesmanager.core.business.services.reference.country.CountryService;
+import com.salesmanager.core.business.services.shipping.ShippingService;
+import com.salesmanager.core.business.utils.ProductPriceUtils;
+import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse;
+import com.salesmanager.core.business.utils.ajax.AjaxResponse;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.shipping.ShippingConfiguration;
+import com.salesmanager.core.model.shipping.ShippingType;
+import com.salesmanager.core.model.system.IntegrationConfiguration;
+import com.salesmanager.core.modules.integration.IntegrationException;
+import com.salesmanager.core.modules.integration.shipping.model.CustomShippingQuoteWeightItem;
+import com.salesmanager.core.modules.integration.shipping.model.CustomShippingQuotesConfiguration;
+import com.salesmanager.core.modules.integration.shipping.model.CustomShippingQuotesRegion;
+import com.salesmanager.shop.admin.controller.ControllerConstants;
+import com.salesmanager.shop.admin.model.web.Menu;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.utils.LabelUtils;
+import org.apache.commons.beanutils.BeanComparator;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.util.*;
+
+@Controller
+public class CustomShippingMethodsController {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(CustomShippingMethodsController.class);
+
+
+ public final static String WEIGHT_BASED_SHIPPING_METHOD = "weightBased";
+
+ @Inject
+ private ShippingService shippingService;
+
+ @Inject
+ private CountryService countryService;
+
+ @Inject
+ private ProductPriceUtils priceUtil;
+
+ @Inject
+ LabelUtils messages;
+
+
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/weightBased.html", method=RequestMethod.GET)
+ public String getWeightBasedShippingMethod(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ this.setMenu(model, request);
+
+ populateModel(model, request, response);
+
+ return ControllerConstants.Tiles.Shipping.shippingMethod;
+
+
+ }
+
+
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/addCustomRegion.html", method=RequestMethod.POST)
+ public String addCustomRegion(@ModelAttribute("region") String region, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ this.setMenu(model, request);
+ populateModel(model, request, response);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)shippingService.getCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, store);
+
+ List<CustomShippingQuotesRegion> regions = customConfiguration.getRegions();
+
+ if(StringUtils.isBlank(region)) {
+ model.addAttribute("errorMessage",messages.getMessage("message.region.null", locale));
+ ObjectError error = new ObjectError("region",messages.getMessage("message.region.null", locale));
+ result.addError(error);
+ }
+
+
+ for(CustomShippingQuotesRegion customRegion : regions) {
+ if(customRegion.getCustomRegionName().equals(region)) {
+ model.addAttribute("errorMessage",messages.getMessage("message.region.null", locale));
+ ObjectError error = new ObjectError("region",messages.getMessage("message.region.exists", locale));
+ result.addError(error);
+ break;
+ }
+ }
+
+ if (result.hasErrors()) {
+ return ControllerConstants.Tiles.Shipping.shippingMethod;
+ }
+
+
+ CustomShippingQuotesRegion quoteRegion = new CustomShippingQuotesRegion();
+ quoteRegion.setCustomRegionName(region);
+
+ customConfiguration.getRegions().add(quoteRegion);
+ shippingService.saveCustomShippingConfiguration(this.WEIGHT_BASED_SHIPPING_METHOD, customConfiguration, store);
+
+ model.addAttribute("customConfiguration", customConfiguration);
+ model.addAttribute("success","success");
+
+ return ControllerConstants.Tiles.Shipping.shippingMethod;
+
+ }
+
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/addCountryToRegion.html", method=RequestMethod.POST)
+ public String addCountryToCustomRegion(@ModelAttribute("customRegion") CustomShippingQuotesRegion customRegion, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ this.setMenu(model, request);
+ populateModel(model, request, response);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)shippingService.getCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, store);
+
+ List<CustomShippingQuotesRegion> regions = customConfiguration.getRegions();
+
+
+ if(StringUtils.isBlank(customRegion.getCustomRegionName())) {
+ model.addAttribute("errorMessageAssociation",messages.getMessage("message.region.null", locale));
+ ObjectError error = new ObjectError("region",messages.getMessage("message.region.exists", locale));
+ result.addError(error);
+ }
+
+
+ for(CustomShippingQuotesRegion region : regions) {
+ if(region.getCustomRegionName().equals(customRegion.getCustomRegionName())) {
+ List<String> countries = region.getCountries();
+ if(countries!=null) {
+ for(String countryCode : countries) {
+ if(countryCode.equals(customRegion.getCountries().get(0))) {
+ model.addAttribute("errorMessageAssociation",messages.getMessage("message.region.exists", locale));
+ ObjectError error = new ObjectError("region",messages.getMessage("message.region.exists", locale));
+ result.addError(error);
+ break;
+ }
+ }
+
+ countries.add(customRegion.getCountries().get(0));
+
+ } else {
+ List<String> countriesList = new ArrayList<String>();
+ countriesList.add(customRegion.getCountries().get(0));
+ region.setCountries(countriesList);
+ }
+ }
+ }
+
+ if (result.hasErrors()) {
+ return ControllerConstants.Tiles.Shipping.shippingMethod;
+ }
+
+
+ shippingService.saveCustomShippingConfiguration(this.WEIGHT_BASED_SHIPPING_METHOD, customConfiguration, store);
+ model.addAttribute("customConfiguration", customConfiguration);
+ model.addAttribute("success","success");
+
+ return ControllerConstants.Tiles.Shipping.shippingMethod;
+
+ }
+
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/saveweightBasedShippingMethod.html", method=RequestMethod.POST)
+ public String saveShippingMethod(@ModelAttribute("configuration") CustomShippingQuotesConfiguration configuration, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+
+ this.setMenu(model, request);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ populateModel(model, request, response);
+
+ String moduleCode = configuration.getModuleCode();
+ LOGGER.debug("Saving module code " + moduleCode);
+
+ List<String> environments = new ArrayList<String>();
+ environments.add(com.salesmanager.core.business.constants.Constants.TEST_ENVIRONMENT);
+ environments.add(com.salesmanager.core.business.constants.Constants.PRODUCTION_ENVIRONMENT);
+
+ model.addAttribute("environments", environments);
+ model.addAttribute("configuration", configuration);
+
+ try {
+
+
+ CustomShippingQuotesConfiguration dbConfig = (CustomShippingQuotesConfiguration) shippingService.getCustomShippingConfiguration(this.WEIGHT_BASED_SHIPPING_METHOD, store);
+
+
+ shippingService.saveShippingQuoteModuleConfiguration(configuration, store);
+ if(dbConfig!=null) {
+ dbConfig.setActive(configuration.isActive());
+ shippingService.saveCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, dbConfig, store);
+ } else {
+ shippingService.saveCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, configuration, store);
+ }
+
+
+
+
+ } catch (Exception e) {
+ if(e instanceof IntegrationException) {
+ if(((IntegrationException)e).getErrorCode()==IntegrationException.ERROR_VALIDATION_SAVE) {
+
+ List<String> errorCodes = ((IntegrationException)e).getErrorFields();
+ for(String errorCode : errorCodes) {
+ model.addAttribute(errorCode,messages.getMessage("message.fielderror", locale));
+ }
+ return ControllerConstants.Tiles.Shipping.shippingMethod;
+ }
+ } else {
+ throw new Exception(e);
+ }
+ }
+
+
+ model.addAttribute("success","success");
+ return ControllerConstants.Tiles.Shipping.shippingMethod;
+
+
+ }
+
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/weightBased/removeCountry.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> deleteCountry(HttpServletRequest request, HttpServletResponse response, Locale locale) {
+ String country = request.getParameter("regionCode");
+
+ AjaxResponse resp = new AjaxResponse();
+
+
+ try {
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)shippingService.getCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, store);
+
+ if(customConfiguration!=null) {
+
+ List<CustomShippingQuotesRegion> quotes = customConfiguration.getRegions();
+ for (CustomShippingQuotesRegion quote : quotes) {
+ List<String> countries = quote.getCountries();
+ List<String> newCountries = new ArrayList<String>();
+ if(countries!=null) {
+ for(String cntry : countries) {
+ if(!cntry.equals(country)) {
+ newCountries.add(cntry);
+ }
+ }
+ }
+ quote.setCountries(newCountries);
+ }
+
+ }
+
+ shippingService.saveCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, customConfiguration, store);
+
+ resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging custom weight based", e);
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ }
+
+ String returnString = resp.toJSONString();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/weightBased/removePrice.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> deletePrice(HttpServletRequest request, HttpServletResponse response, Locale locale) {
+ String weight = request.getParameter("weight");
+ String region = request.getParameter("region");
+ int maxWeight = 0;
+ try {
+ maxWeight = Integer.parseInt(weight);
+ } catch (Exception e) {
+ LOGGER.error("Weight (integer) malformed " + weight);
+ }
+
+ AjaxResponse resp = new AjaxResponse();
+
+
+ try {
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)shippingService.getCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, store);
+
+ if(customConfiguration!=null) {
+
+ List<CustomShippingQuotesRegion> quotes = customConfiguration.getRegions();
+
+ for (CustomShippingQuotesRegion quote : quotes) {
+
+
+ if(quote.getCustomRegionName().equals(region)) {
+ List<CustomShippingQuoteWeightItem> quoteItems = quote.getQuoteItems();
+
+ if(quoteItems!=null) {
+ List<CustomShippingQuoteWeightItem> newQuoteItems = new ArrayList<CustomShippingQuoteWeightItem>();
+ for(CustomShippingQuoteWeightItem q : quoteItems) {
+ if(maxWeight!=q.getMaximumWeight()) {
+ newQuoteItems.add(q);
+ }
+ }
+ quote.setQuoteItems(newQuoteItems);
+ break;
+ }
+ }
+
+ }
+
+ }
+
+ shippingService.saveCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, customConfiguration, store);
+
+ resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging custom weight based", e);
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ }
+
+ String returnString = resp.toJSONString();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/deleteWeightBasedShippingMethod.html", method=RequestMethod.POST)
+ public String deleteShippingMethod(BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ this.setMenu(model, request);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ shippingService.removeCustomShippingQuoteModuleConfiguration(WEIGHT_BASED_SHIPPING_METHOD, store);
+
+
+ return ControllerConstants.Tiles.Shipping.shippingMethods;
+
+ }
+
+ /**
+ * Check if a region code already exist with the same name
+ * @param request
+ * @param response
+ * @param locale
+ * @return
+ */
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/checkRegionCode.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> checkRegionCode(HttpServletRequest request, HttpServletResponse response, Locale locale) {
+ String code = request.getParameter("code");
+
+
+ AjaxResponse resp = new AjaxResponse();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ try {
+
+ if(StringUtils.isBlank(code)) {
+ resp.setStatus(AjaxResponse.CODE_ALREADY_EXIST);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)shippingService.getCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, store);
+
+ if(customConfiguration!=null) {
+ List<CustomShippingQuotesRegion> regions = customConfiguration.getRegions();
+ for(CustomShippingQuotesRegion region : regions) {
+
+ if(code.equals(region.getCustomRegionName())) {
+ resp.setStatus(AjaxResponse.CODE_ALREADY_EXIST);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ }
+ }
+
+ resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while getting user", e);
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value = "/admin/shipping/weightBased/page.html", method = RequestMethod.POST)
+ public @ResponseBody
+ ResponseEntity<String> pageCustomShipping(HttpServletRequest request,
+ HttpServletResponse response) {
+
+ AjaxResponse resp = new AjaxResponse();
+
+ Language language = (Language)request.getAttribute("LANGUAGE");
+ try {
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)shippingService.getCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, store);
+
+ Map<String,Country> countriesMap = countryService.getCountriesMap(language);
+
+ if(customConfiguration!=null) {
+ List<CustomShippingQuotesRegion> quotes = customConfiguration.getRegions();
+ for (CustomShippingQuotesRegion quote : quotes) {
+ List<String> countries = quote.getCountries();
+ if(countries!=null) {
+ for(String country : countries) {
+ Map<String,String> entry = new HashMap<String,String> ();
+ entry.put("regionCode", country);
+ entry.put("region", quote.getCustomRegionName());
+ entry.put("country", countriesMap.get(country).getName());
+ resp.addDataEntry(entry);
+ }
+ }
+ }
+ }
+
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging custom weight based", e);
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ }
+
+ String returnString = resp.toJSONString();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ /**
+ * Edit custom region
+ * @param region
+ * @param model
+ * @param request
+ * @param response
+ * @param locale
+ * @return
+ * @throws Exception
+ */
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/weightBased/edit.html", method=RequestMethod.GET)
+ public String editCustomShipping(@ModelAttribute("customRegionName") String region, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ setMenu(model,request);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)shippingService.getCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, store);
+ CustomShippingQuotesRegion aRegion = null;
+
+ List<CustomShippingQuotesRegion> regions = customConfiguration.getRegions();
+ for(CustomShippingQuotesRegion customRegion : regions) {
+ if(customRegion.getCustomRegionName().equals(region)) {
+ aRegion = customRegion;
+ break;
+ }
+ }
+
+ if(aRegion==null) {
+ return "redirect:/admin/shipping/shippingMethods.html";
+ }
+
+ model.addAttribute("customRegion", aRegion);
+
+
+ return ControllerConstants.Tiles.Shipping.customShippingWeightBased;
+ }
+
+
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value = "/admin/shipping/weightBasedDetails/page.html", method = RequestMethod.POST)
+ public @ResponseBody
+ ResponseEntity<String> pageCustomShippingDetails(HttpServletRequest request,
+ HttpServletResponse response) {
+
+ String region = request.getParameter("region");
+
+ AjaxResponse resp = new AjaxResponse();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+ if(StringUtils.isBlank(region)){
+
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorString("Region is not valid");
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+ }
+
+
+ try {
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)shippingService.getCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, store);
+
+ List<CustomShippingQuotesRegion> quotes = customConfiguration.getRegions();
+ for (CustomShippingQuotesRegion quote : quotes) {
+
+ if(quote.getCustomRegionName().equals(region)) {
+
+ List<CustomShippingQuoteWeightItem> quoteItems = quote.getQuoteItems();
+ if(quoteItems!=null) {
+ for(CustomShippingQuoteWeightItem quoteItem : quoteItems) {
+ Map<String,String> entry = new HashMap<String,String> ();
+ entry.put("price", priceUtil.getAdminFormatedAmountWithCurrency(store,quoteItem.getPrice()));
+ entry.put("weight", String.valueOf(quoteItem.getMaximumWeight()));
+ resp.addDataEntry(entry);
+ }
+ }
+ }
+ }
+
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging products", e);
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+
+
+ @SuppressWarnings("unchecked")
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/weightBased/addPrice.html", method=RequestMethod.POST)
+ public String addPrice(@ModelAttribute("region") String customRegion, @ModelAttribute("customQuote") CustomShippingQuoteWeightItem customQuote, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ this.setMenu(model, request);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)shippingService.getCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, store);
+
+ List<CustomShippingQuotesRegion> regions = customConfiguration.getRegions();
+
+ try {
+ BigDecimal price = new BigDecimal(customQuote.getPriceText());
+ customQuote.setPrice(price);
+ } catch(Exception e) {
+ ObjectError error = new ObjectError("priceText",messages.getMessage("message.invalid.price", locale));
+ result.addError(error);
+ }
+
+
+ int weight = customQuote.getMaximumWeight();
+ if(weight<=0) {
+ ObjectError error = new ObjectError("maximumWeight",messages.getMessage("message.maximumWeight.invalid", locale));
+ result.addError(error);
+ }
+
+
+
+ for(CustomShippingQuotesRegion customReg : regions) {
+ if(customReg.getCustomRegionName().equals(customRegion)) {
+ model.addAttribute("customRegion", customReg);
+ break;
+ }
+ }
+
+
+ if(StringUtils.isBlank(customQuote.getPriceText())) {
+ ObjectError error = new ObjectError("priceText",messages.getMessage("message.invalid.price", locale));
+ result.addError(error);
+ }
+
+ CustomShippingQuotesRegion currentRegion = null;
+
+
+ for(CustomShippingQuotesRegion region : regions) {
+ if(region.getCustomRegionName().equals(customRegion)) {
+ currentRegion = region;
+ List<CustomShippingQuoteWeightItem> quotes = region.getQuoteItems();
+ if(quotes!=null) {
+ for(CustomShippingQuoteWeightItem quote : quotes) {
+
+ if(quote.getMaximumWeight()==customQuote.getMaximumWeight()){
+ ObjectError error = new ObjectError("maximumWeight",messages.getMessage("label.message.maximumWeight.exist", locale));
+ result.addError(error);
+ break;
+ }
+ }
+ quotes.add(customQuote);
+ } else {
+ quotes = new ArrayList<CustomShippingQuoteWeightItem>();
+ quotes.add(customQuote);
+ region.setQuoteItems(quotes);
+ }
+ }
+ }
+
+ model.addAttribute("customConfiguration", customConfiguration);
+
+ if (result.hasErrors()) {
+ return ControllerConstants.Tiles.Shipping.customShippingWeightBased;
+ }
+
+ //order weights
+ if(currentRegion!=null) {
+ List<CustomShippingQuoteWeightItem> quotes = currentRegion.getQuoteItems();
+ if(quotes!=null) {
+
+
+ BeanComparator beanComparator = new BeanComparator("maximumWeight");
+ Collections.sort(quotes, beanComparator);
+
+
+ }
+ }
+
+
+ shippingService.saveCustomShippingConfiguration(this.WEIGHT_BASED_SHIPPING_METHOD, customConfiguration, store);
+
+ model.addAttribute("success","success");
+
+ return ControllerConstants.Tiles.Shipping.customShippingWeightBased;
+
+ }
+
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/weightBased/deleteRegion.html", method=RequestMethod.POST)
+ public String deleteRegion(@ModelAttribute("customRegionName") String region, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ this.setMenu(model, request);
+
+
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+
+ CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)shippingService.getCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, store);
+
+ List<CustomShippingQuotesRegion> regions = customConfiguration.getRegions();
+
+ List<CustomShippingQuotesRegion> newRegions = new ArrayList<CustomShippingQuotesRegion>();
+ for(CustomShippingQuotesRegion reg : regions) {
+
+ if(!reg.getCustomRegionName().equals(region)) {
+ newRegions.add(reg);
+ }
+ }
+
+ customConfiguration.setRegions(newRegions);
+ shippingService.saveCustomShippingConfiguration(this.WEIGHT_BASED_SHIPPING_METHOD, customConfiguration, store);
+ populateModel(model, request, response);
+ model.addAttribute("success","success");
+ return ControllerConstants.Tiles.Shipping.shippingMethod;
+ }
+
+
+
+
+
+ private void populateModel(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ Language language = (Language)request.getAttribute("LANGUAGE");
+
+ ShippingConfiguration shippingConfiguration = shippingService.getShippingConfiguration(store);
+
+ if(shippingConfiguration==null) {
+ shippingConfiguration = new ShippingConfiguration();
+ shippingConfiguration.setShippingType(ShippingType.INTERNATIONAL);
+ }
+
+
+ //get configured shipping modules
+ Map<String,IntegrationConfiguration> configuredModules = shippingService.getShippingModulesConfigured(store);
+ IntegrationConfiguration configuration = new IntegrationConfiguration();
+ if(configuredModules!=null) {
+ for(String key : configuredModules.keySet()) {
+ if(key.equals(WEIGHT_BASED_SHIPPING_METHOD)) {
+ configuration = configuredModules.get(key);
+ break;
+ }
+ }
+ }
+ configuration.setModuleCode(WEIGHT_BASED_SHIPPING_METHOD);
+
+ //get custom information
+ CustomShippingQuotesConfiguration customConfiguration = (CustomShippingQuotesConfiguration)shippingService.getCustomShippingConfiguration(WEIGHT_BASED_SHIPPING_METHOD, store);
+
+ if(customConfiguration==null) {
+ customConfiguration = new CustomShippingQuotesConfiguration();
+ customConfiguration.setModuleCode(this.WEIGHT_BASED_SHIPPING_METHOD);
+ }
+
+
+ //get supported countries
+ //List<String> includedCountries = shippingService.getSupportedCountries(store);
+ List<Country> shipToCountries = shippingService.getShipToCountryList(store, language);
+/* List<Country> shippingCountries = new ArrayList<Country>();
+ Map<String,Country> countries = countryService.getCountriesMap(language);
+ if(shippingConfiguration.getShippingType().name().equals(ShippingType.INTERNATIONAL.name())){
+
+ for(String key : countries.keySet()) {
+ Country country = (Country)countries.get(key);
+ if(includedCountries.contains(key)) {
+ shippingCountries.add(country);
+ }
+ }
+ } else {//if national only store country
+ if(!includedCountries.contains(store.getCountry().getIsoCode())) {
+ shippingCountries.add((Country)countries.get(store.getCountry().getIsoCode()));
+ }
+ }*/
+
+ CustomShippingQuotesRegion customRegion = new CustomShippingQuotesRegion();
+
+
+ List<String> environments = new ArrayList<String>();
+ environments.add(com.salesmanager.core.business.constants.Constants.PRODUCTION_ENVIRONMENT);//only production
+
+ model.addAttribute("environments", environments);
+ model.addAttribute("configuration", configuration);
+ model.addAttribute("customConfiguration", customConfiguration);
+ model.addAttribute("customRegion", customRegion);
+ model.addAttribute("shippingCountries", shipToCountries);
+
+
+ }
+
+ private void setMenu(Model model, HttpServletRequest request) throws Exception {
+
+ //display menu
+ Map<String,String> activeMenus = new HashMap<String,String>();
+ activeMenus.put("shipping", "shipping");
+ activeMenus.put("shipping-methods", "shipping-methods");
+
+ @SuppressWarnings("unchecked")
+ Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
+
+ Menu currentMenu = (Menu)menus.get("shipping");
+ model.addAttribute("currentMenu",currentMenu);
+ model.addAttribute("activeMenus",activeMenus);
+ //
+
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingConfigsController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingConfigsController.java
index 7e46187..0af68f6 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingConfigsController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingConfigsController.java
@@ -1,234 +1,234 @@
-package com.salesmanager.shop.admin.controller.shipping;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.inject.Inject;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.country.Country;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.salesmanager.core.business.services.reference.country.CountryService;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.shipping.ShippingConfiguration;
-import com.salesmanager.core.model.shipping.ShippingType;
-import com.salesmanager.core.business.services.shipping.ShippingService;
-import com.salesmanager.core.business.utils.ajax.AjaxResponse;
-import com.salesmanager.shop.admin.model.web.Menu;
-import com.salesmanager.shop.constants.Constants;
-
-
-@Controller
-public class ShippingConfigsController {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ShippingConfigsController.class);
-
-
- @Inject
- private ShippingService shippingService;
-
- @Inject
- private CountryService countryService;
-
- /**
- * Configures the shipping mode, shows shipping countries
- * @param request
- * @param response
- * @param locale
- * @return
- * @throws Exception
- */
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/shippingConfigs.html", method=RequestMethod.GET)
- public String displayShippingConfigs(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
- this.setMenu(model, request);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
-
-
- ShippingConfiguration shippingConfiguration = shippingService.getShippingConfiguration(store);
-
- if(shippingConfiguration==null) {
- shippingConfiguration = new ShippingConfiguration();
- shippingConfiguration.setShippingType(ShippingType.INTERNATIONAL);
- }
-
-
- model.addAttribute("configuration", shippingConfiguration);
- return "shipping-configs";
-
-
- }
-
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/saveShippingConfiguration.html", method=RequestMethod.POST)
- public String saveShippingConfiguration(@ModelAttribute("configuration") ShippingConfiguration configuration, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- this.setMenu(model, request);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- //get original configuration
- ShippingConfiguration shippingConfiguration = shippingService.getShippingConfiguration(store);
-
- if(shippingConfiguration==null) {
- shippingConfiguration = new ShippingConfiguration();
- }
-
- shippingConfiguration.setShippingType(configuration.getShippingType());
-
- shippingService.saveShippingConfiguration(shippingConfiguration, store);
-
- model.addAttribute("configuration", shippingConfiguration);
- model.addAttribute("success","success");
- return "shipping-configs";
-
- }
-
- @SuppressWarnings({ "unchecked"})
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/countries/paging.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> pageCountries(HttpServletRequest request, HttpServletResponse response) {
- String countryName = request.getParameter("name");
- AjaxResponse resp = new AjaxResponse();
-
- try {
-
- Language language = (Language)request.getAttribute("LANGUAGE");
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- //get list of countries
- Map<String,Country> countries = countryService.getCountriesMap(language);
-
- //get inclusions
- List<String> includedCountries = shippingService.getSupportedCountries(store);
-
-
- for(String key : countries.keySet()) {
-
- Country country = (Country)countries.get(key);
-
- @SuppressWarnings("rawtypes")
- Map entry = new HashMap();
- entry.put("code", country.getIsoCode());
- entry.put("name", country.getName());
-
- if(includedCountries.contains(key)) {
- entry.put("supported", true);
- } else {
- entry.put("supported", false);
- }
-
- if(!StringUtils.isBlank(countryName)) {
- if(country.getName().contains(countryName)){
- resp.addDataEntry(entry);
- }
- } else {
- resp.addDataEntry(entry);
- }
- }
-
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
-
- } catch (Exception e) {
- LOGGER.error("Error while paging shipping countries", e);
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- }
-
- String returnString = resp.toJSONString();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/countries/update.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> updateCountry(HttpServletRequest request, HttpServletResponse response) {
- String values = request.getParameter("_oldValues");
- String supported = request.getParameter("supported");
-
-
-
-
-
-
- AjaxResponse resp = new AjaxResponse();
-
- try {
-
- ObjectMapper mapper = new ObjectMapper();
- @SuppressWarnings("rawtypes")
- Map conf = mapper.readValue(values, Map.class);
-
- String countryCode = (String)conf.get("code");
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- //get list of countries
- List<String> includedCountries = shippingService.getSupportedCountries(store);
-
- if(!StringUtils.isBlank(supported)) {
- if("true".equals(supported)) {
- includedCountries.add(countryCode);
- } else {
- includedCountries.remove(countryCode);
- }
- }
-
-
- shippingService.setSupportedCountries(store, includedCountries);
-
- resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
-
-
-
- } catch (Exception e) {
- LOGGER.error("Error while paging shipping countries", e);
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- }
-
- String returnString = resp.toJSONString();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- private void setMenu(Model model, HttpServletRequest request) throws Exception {
-
- //display menu
- Map<String,String> activeMenus = new HashMap<String,String>();
- activeMenus.put("shipping", "shipping");
- activeMenus.put("shipping-configs", "shipping-configs");
-
- @SuppressWarnings("unchecked")
- Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
-
- Menu currentMenu = (Menu)menus.get("shipping");
- model.addAttribute("currentMenu",currentMenu);
- model.addAttribute("activeMenus",activeMenus);
- //
-
- }
-
-
-}
+package com.salesmanager.shop.admin.controller.shipping;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.inject.Inject;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.country.Country;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.salesmanager.core.business.services.reference.country.CountryService;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.shipping.ShippingConfiguration;
+import com.salesmanager.core.model.shipping.ShippingType;
+import com.salesmanager.core.business.services.shipping.ShippingService;
+import com.salesmanager.core.business.utils.ajax.AjaxResponse;
+import com.salesmanager.shop.admin.model.web.Menu;
+import com.salesmanager.shop.constants.Constants;
+
+
+@Controller
+public class ShippingConfigsController {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ShippingConfigsController.class);
+
+
+ @Inject
+ private ShippingService shippingService;
+
+ @Inject
+ private CountryService countryService;
+
+ /**
+ * Configures the shipping mode, shows shipping countries
+ * @param request
+ * @param response
+ * @param locale
+ * @return
+ * @throws Exception
+ */
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/shippingConfigs.html", method=RequestMethod.GET)
+ public String displayShippingConfigs(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ this.setMenu(model, request);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+
+
+ ShippingConfiguration shippingConfiguration = shippingService.getShippingConfiguration(store);
+
+ if(shippingConfiguration==null) {
+ shippingConfiguration = new ShippingConfiguration();
+ shippingConfiguration.setShippingType(ShippingType.INTERNATIONAL);
+ }
+
+
+ model.addAttribute("configuration", shippingConfiguration);
+ return "shipping-configs";
+
+
+ }
+
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/saveShippingConfiguration.html", method=RequestMethod.POST)
+ public String saveShippingConfiguration(@ModelAttribute("configuration") ShippingConfiguration configuration, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ this.setMenu(model, request);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ //get original configuration
+ ShippingConfiguration shippingConfiguration = shippingService.getShippingConfiguration(store);
+
+ if(shippingConfiguration==null) {
+ shippingConfiguration = new ShippingConfiguration();
+ }
+
+ shippingConfiguration.setShippingType(configuration.getShippingType());
+
+ shippingService.saveShippingConfiguration(shippingConfiguration, store);
+
+ model.addAttribute("configuration", shippingConfiguration);
+ model.addAttribute("success","success");
+ return "shipping-configs";
+
+ }
+
+ @SuppressWarnings({ "unchecked"})
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/countries/paging.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> pageCountries(HttpServletRequest request, HttpServletResponse response) {
+ String countryName = request.getParameter("name");
+ AjaxResponse resp = new AjaxResponse();
+
+ try {
+
+ Language language = (Language)request.getAttribute("LANGUAGE");
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ //get list of countries
+ Map<String,Country> countries = countryService.getCountriesMap(language);
+
+ //get inclusions
+ List<String> includedCountries = shippingService.getSupportedCountries(store);
+
+
+ for(String key : countries.keySet()) {
+
+ Country country = (Country)countries.get(key);
+
+ @SuppressWarnings("rawtypes")
+ Map entry = new HashMap();
+ entry.put("code", country.getIsoCode());
+ entry.put("name", country.getName());
+
+ if(includedCountries.contains(key)) {
+ entry.put("supported", true);
+ } else {
+ entry.put("supported", false);
+ }
+
+ if(!StringUtils.isBlank(countryName)) {
+ if(country.getName().contains(countryName)){
+ resp.addDataEntry(entry);
+ }
+ } else {
+ resp.addDataEntry(entry);
+ }
+ }
+
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging shipping countries", e);
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ }
+
+ String returnString = resp.toJSONString();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/countries/update.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> updateCountry(HttpServletRequest request, HttpServletResponse response) {
+ String values = request.getParameter("_oldValues");
+ String supported = request.getParameter("supported");
+
+
+
+
+
+
+ AjaxResponse resp = new AjaxResponse();
+
+ try {
+
+ ObjectMapper mapper = new ObjectMapper();
+ @SuppressWarnings("rawtypes")
+ Map conf = mapper.readValue(values, Map.class);
+
+ String countryCode = (String)conf.get("code");
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ //get list of countries
+ List<String> includedCountries = shippingService.getSupportedCountries(store);
+
+ if(!StringUtils.isBlank(supported)) {
+ if("true".equals(supported)) {
+ includedCountries.add(countryCode);
+ } else {
+ includedCountries.remove(countryCode);
+ }
+ }
+
+
+ shippingService.setSupportedCountries(store, includedCountries);
+
+ resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
+
+
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging shipping countries", e);
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ }
+
+ String returnString = resp.toJSONString();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ private void setMenu(Model model, HttpServletRequest request) throws Exception {
+
+ //display menu
+ Map<String,String> activeMenus = new HashMap<String,String>();
+ activeMenus.put("shipping", "shipping");
+ activeMenus.put("shipping-configs", "shipping-configs");
+
+ @SuppressWarnings("unchecked")
+ Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
+
+ Menu currentMenu = (Menu)menus.get("shipping");
+ model.addAttribute("currentMenu",currentMenu);
+ model.addAttribute("activeMenus",activeMenus);
+ //
+
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingMethodsController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingMethodsController.java
index 8f70651..0518713 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingMethodsController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingMethodsController.java
@@ -1,182 +1,182 @@
-package com.salesmanager.shop.admin.controller.shipping;
-
-import com.salesmanager.core.business.services.shipping.ShippingService;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.system.IntegrationConfiguration;
-import com.salesmanager.core.model.system.IntegrationModule;
-import com.salesmanager.core.modules.integration.IntegrationException;
-import com.salesmanager.core.modules.integration.shipping.model.CustomShippingQuotesConfiguration;
-import com.salesmanager.shop.admin.controller.ControllerConstants;
-import com.salesmanager.shop.admin.model.web.Menu;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.utils.LabelUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.BindingResult;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.*;
-
-@Controller
-public class ShippingMethodsController {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ShippingMethodsController.class);
-
-
- @Inject
- private ShippingService shippingService;
-
- @Inject
- LabelUtils messages;
-
- /**
- * Configures the shipping shows shipping methods
- * @param request
- * @param response
- * @return
- * @throws Exception
- */
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/shippingMethods.html", method=RequestMethod.GET)
- public String displayShippingMethods(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
- this.setMenu(model, request);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- //get shipping methods
- List<IntegrationModule> modules = shippingService.getShippingMethods(store);
-
- //get configured shipping modules
- Map<String,IntegrationConfiguration> configuredModules = shippingService.getShippingModulesConfigured(store);
-
-
-
- model.addAttribute("modules", modules);
- model.addAttribute("configuredModules", configuredModules);
-
-
- return ControllerConstants.Tiles.Shipping.shippingMethods;
-
-
- }
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/shippingMethod.html", method=RequestMethod.GET)
- public String displayShippingMethod(@RequestParam("code") String code, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
- this.setMenu(model, request);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
-
- //get configured shipping modules
- IntegrationConfiguration configuration = shippingService.getShippingConfiguration(code, store);
- if(configuration==null) {
- configuration = new IntegrationConfiguration();
- }
-
- configuration.setModuleCode(code);
-
- List<String> environments = new ArrayList<String>();
- environments.add(com.salesmanager.core.business.constants.Constants.TEST_ENVIRONMENT);
- environments.add(com.salesmanager.core.business.constants.Constants.PRODUCTION_ENVIRONMENT);
-
- model.addAttribute("configuration", configuration);
- model.addAttribute("environments", environments);
- return ControllerConstants.Tiles.Shipping.shippingMethod;
-
-
- }
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/saveShippingMethod.html", method=RequestMethod.POST)
- public String saveShippingMethod(@ModelAttribute("configuration") IntegrationConfiguration configuration, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
-
- this.setMenu(model, request);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- String moduleCode = configuration.getModuleCode();
- LOGGER.debug("Saving module code " + moduleCode);
-
- List<String> environments = new ArrayList<String>();
- environments.add(com.salesmanager.core.business.constants.Constants.TEST_ENVIRONMENT);
- environments.add(com.salesmanager.core.business.constants.Constants.PRODUCTION_ENVIRONMENT);
-
- model.addAttribute("environments", environments);
- model.addAttribute("configuration", configuration);
-
- try {
- shippingService.saveShippingQuoteModuleConfiguration(configuration, store);
- } catch (Exception e) {
- if(e instanceof IntegrationException) {
- if(((IntegrationException)e).getErrorCode()==IntegrationException.ERROR_VALIDATION_SAVE) {
-
- List<String> errorCodes = ((IntegrationException)e).getErrorFields();
- for(String errorCode : errorCodes) {
- model.addAttribute(errorCode,messages.getMessage("message.fielderror", locale));
- }
- model.addAttribute("validationError","validationError");
- return ControllerConstants.Tiles.Shipping.shippingMethod;
- }
- } else {
- throw new Exception(e);
- }
- }
-
-
-
- model.addAttribute("success","success");
- return ControllerConstants.Tiles.Shipping.shippingMethod;
-
-
- }
-
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/weightBased.html", method=RequestMethod.POST)
- public String saveCustomWeightBasedShippingMethod(@ModelAttribute("configuration") CustomShippingQuotesConfiguration configuration, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- model.addAttribute("success","success");
- return ControllerConstants.Tiles.Shipping.shippingMethod;
-
- }
-
- @RequestMapping(value="/admin/shipping/deleteShippingMethod.html", method=RequestMethod.POST)
- public String deleteShippingMethod(@RequestParam("code") String code, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- this.setMenu(model, request);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- shippingService.removeShippingQuoteModuleConfiguration(code, store);
-
- return "redirect:/admin/shipping/shippingMethods.html";
-
- }
-
-
- private void setMenu(Model model, HttpServletRequest request) throws Exception {
-
- //display menu
- Map<String,String> activeMenus = new HashMap<String,String>();
- activeMenus.put("shipping", "shipping");
- activeMenus.put("shipping-methods", "shipping-methods");
-
- @SuppressWarnings("unchecked")
- Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
-
- Menu currentMenu = (Menu)menus.get("shipping");
- model.addAttribute("currentMenu",currentMenu);
- model.addAttribute("activeMenus",activeMenus);
- //
-
- }
-
-
-}
+package com.salesmanager.shop.admin.controller.shipping;
+
+import com.salesmanager.core.business.services.shipping.ShippingService;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.system.IntegrationConfiguration;
+import com.salesmanager.core.model.system.IntegrationModule;
+import com.salesmanager.core.modules.integration.IntegrationException;
+import com.salesmanager.core.modules.integration.shipping.model.CustomShippingQuotesConfiguration;
+import com.salesmanager.shop.admin.controller.ControllerConstants;
+import com.salesmanager.shop.admin.model.web.Menu;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.utils.LabelUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+
+@Controller
+public class ShippingMethodsController {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ShippingMethodsController.class);
+
+
+ @Inject
+ private ShippingService shippingService;
+
+ @Inject
+ LabelUtils messages;
+
+ /**
+ * Configures the shipping shows shipping methods
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/shippingMethods.html", method=RequestMethod.GET)
+ public String displayShippingMethods(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ this.setMenu(model, request);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ //get shipping methods
+ List<IntegrationModule> modules = shippingService.getShippingMethods(store);
+
+ //get configured shipping modules
+ Map<String,IntegrationConfiguration> configuredModules = shippingService.getShippingModulesConfigured(store);
+
+
+
+ model.addAttribute("modules", modules);
+ model.addAttribute("configuredModules", configuredModules);
+
+
+ return ControllerConstants.Tiles.Shipping.shippingMethods;
+
+
+ }
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/shippingMethod.html", method=RequestMethod.GET)
+ public String displayShippingMethod(@RequestParam("code") String code, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ this.setMenu(model, request);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+
+ //get configured shipping modules
+ IntegrationConfiguration configuration = shippingService.getShippingConfiguration(code, store);
+ if(configuration==null) {
+ configuration = new IntegrationConfiguration();
+ }
+
+ configuration.setModuleCode(code);
+
+ List<String> environments = new ArrayList<String>();
+ environments.add(com.salesmanager.core.business.constants.Constants.TEST_ENVIRONMENT);
+ environments.add(com.salesmanager.core.business.constants.Constants.PRODUCTION_ENVIRONMENT);
+
+ model.addAttribute("configuration", configuration);
+ model.addAttribute("environments", environments);
+ return ControllerConstants.Tiles.Shipping.shippingMethod;
+
+
+ }
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/saveShippingMethod.html", method=RequestMethod.POST)
+ public String saveShippingMethod(@ModelAttribute("configuration") IntegrationConfiguration configuration, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+
+ this.setMenu(model, request);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ String moduleCode = configuration.getModuleCode();
+ LOGGER.debug("Saving module code " + moduleCode);
+
+ List<String> environments = new ArrayList<String>();
+ environments.add(com.salesmanager.core.business.constants.Constants.TEST_ENVIRONMENT);
+ environments.add(com.salesmanager.core.business.constants.Constants.PRODUCTION_ENVIRONMENT);
+
+ model.addAttribute("environments", environments);
+ model.addAttribute("configuration", configuration);
+
+ try {
+ shippingService.saveShippingQuoteModuleConfiguration(configuration, store);
+ } catch (Exception e) {
+ if(e instanceof IntegrationException) {
+ if(((IntegrationException)e).getErrorCode()==IntegrationException.ERROR_VALIDATION_SAVE) {
+
+ List<String> errorCodes = ((IntegrationException)e).getErrorFields();
+ for(String errorCode : errorCodes) {
+ model.addAttribute(errorCode,messages.getMessage("message.fielderror", locale));
+ }
+ model.addAttribute("validationError","validationError");
+ return ControllerConstants.Tiles.Shipping.shippingMethod;
+ }
+ } else {
+ throw new Exception(e);
+ }
+ }
+
+
+
+ model.addAttribute("success","success");
+ return ControllerConstants.Tiles.Shipping.shippingMethod;
+
+
+ }
+
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/weightBased.html", method=RequestMethod.POST)
+ public String saveCustomWeightBasedShippingMethod(@ModelAttribute("configuration") CustomShippingQuotesConfiguration configuration, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ model.addAttribute("success","success");
+ return ControllerConstants.Tiles.Shipping.shippingMethod;
+
+ }
+
+ @RequestMapping(value="/admin/shipping/deleteShippingMethod.html", method=RequestMethod.POST)
+ public String deleteShippingMethod(@RequestParam("code") String code, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ this.setMenu(model, request);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ shippingService.removeShippingQuoteModuleConfiguration(code, store);
+
+ return "redirect:/admin/shipping/shippingMethods.html";
+
+ }
+
+
+ private void setMenu(Model model, HttpServletRequest request) throws Exception {
+
+ //display menu
+ Map<String,String> activeMenus = new HashMap<String,String>();
+ activeMenus.put("shipping", "shipping");
+ activeMenus.put("shipping-methods", "shipping-methods");
+
+ @SuppressWarnings("unchecked")
+ Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
+
+ Menu currentMenu = (Menu)menus.get("shipping");
+ model.addAttribute("currentMenu",currentMenu);
+ model.addAttribute("activeMenus",activeMenus);
+ //
+
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingOptionsController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingOptionsController.java
index 1782c90..1939dac 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingOptionsController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingOptionsController.java
@@ -1,176 +1,176 @@
-package com.salesmanager.shop.admin.controller.shipping;
-
-import java.math.BigDecimal;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.inject.Inject;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.BindingResult;
-import org.springframework.validation.ObjectError;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.shipping.ShippingConfiguration;
-import com.salesmanager.core.model.shipping.ShippingType;
-import com.salesmanager.core.business.services.shipping.ShippingService;
-import com.salesmanager.core.business.utils.ProductPriceUtils;
-import com.salesmanager.shop.admin.controller.ControllerConstants;
-import com.salesmanager.shop.admin.model.web.Menu;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.utils.LabelUtils;
-
-@Controller
-public class ShippingOptionsController {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ShippingOptionsController.class);
-
-
- @Inject
- private ShippingService shippingService;
-
- @Inject
- LabelUtils messages;
-
- @Inject
- private ProductPriceUtils priceUtil;
-
- /**
- * Displays shipping options
- * @param request
- * @param response
- * @param locale
- * @return
- * @throws Exception
- */
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/shippingOptions.html", method=RequestMethod.GET)
- public String displayShippingOptions(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
- this.setMenu(model, request);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
-
-
- ShippingConfiguration shippingConfiguration = shippingService.getShippingConfiguration(store);
-
- if(shippingConfiguration==null) {
- shippingConfiguration = new ShippingConfiguration();
- shippingConfiguration.setShippingType(ShippingType.INTERNATIONAL);
- }
-
- if(shippingConfiguration!=null) {
-
- if(shippingConfiguration.getHandlingFees()!=null) {
- shippingConfiguration.setHandlingFeesText(priceUtil.getAdminFormatedAmount(store,shippingConfiguration.getHandlingFees()));
- }
-
- if(shippingConfiguration.getOrderTotalFreeShipping()!=null) {
- shippingConfiguration.setOrderTotalFreeShippingText(priceUtil.getAdminFormatedAmount(store,shippingConfiguration.getOrderTotalFreeShipping()));
- }
-
- }
-
-
- model.addAttribute("configuration", shippingConfiguration);
- return ControllerConstants.Tiles.Shipping.shippingOptions;
-
-
- }
-
- /**
- * Saves shipping options
- * @param configuration
- * @param result
- * @param model
- * @param request
- * @param response
- * @param locale
- * @return
- * @throws Exception
- */
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/saveShippingOptions.html", method=RequestMethod.POST)
- public String saveShippingOptions(@ModelAttribute("configuration") ShippingConfiguration configuration, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
-
- this.setMenu(model, request);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- //get original configuration
- ShippingConfiguration shippingConfiguration = shippingService.getShippingConfiguration(store);
-
- if(shippingConfiguration==null) {
- shippingConfiguration = new ShippingConfiguration();
- }
-
- BigDecimal submitedOrderPrice = null;
- if(!StringUtils.isBlank(configuration.getOrderTotalFreeShippingText())){
- try {
- submitedOrderPrice = priceUtil.getAmount(configuration.getOrderTotalFreeShippingText());
- shippingConfiguration.setOrderTotalFreeShipping(submitedOrderPrice);
- } catch (Exception e) {
- ObjectError error = new ObjectError("orderTotalFreeShippingText",messages.getMessage("message.invalid.price", locale));
- result.addError(error);
- }
- }
-
- BigDecimal submitedHandlingPrice = null;
- if(!StringUtils.isBlank(configuration.getHandlingFeesText())){
- try {
- submitedHandlingPrice = priceUtil.getAmount(configuration.getHandlingFeesText());
- shippingConfiguration.setHandlingFees(submitedHandlingPrice);
- } catch (Exception e) {
- ObjectError error = new ObjectError("handlingFeesText",messages.getMessage("message.invalid.price", locale));
- result.addError(error);
- }
- }
-
- shippingConfiguration.setFreeShippingEnabled(configuration.isFreeShippingEnabled());
- shippingConfiguration.setTaxOnShipping(configuration.isTaxOnShipping());
- if(configuration.getShipFreeType()!=null) {
- shippingConfiguration.setShipFreeType(configuration.getShipFreeType());
- }
- shippingConfiguration.setShipOptionPriceType(configuration.getShipOptionPriceType());
-
- shippingService.saveShippingConfiguration(shippingConfiguration, store);
-
- model.addAttribute("configuration", configuration);
- model.addAttribute("success","success");
- return ControllerConstants.Tiles.Shipping.shippingOptions;
-
-
- }
-
- private void setMenu(Model model, HttpServletRequest request) throws Exception {
-
- //display menu
- Map<String,String> activeMenus = new HashMap<String,String>();
- activeMenus.put("shipping", "shipping");
- activeMenus.put("shipping-options", "shipping-options");
-
- @SuppressWarnings("unchecked")
- Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
-
- Menu currentMenu = (Menu)menus.get("shipping");
- model.addAttribute("currentMenu",currentMenu);
- model.addAttribute("activeMenus",activeMenus);
- //
-
- }
-
-
-}
+package com.salesmanager.shop.admin.controller.shipping;
+
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.inject.Inject;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.shipping.ShippingConfiguration;
+import com.salesmanager.core.model.shipping.ShippingType;
+import com.salesmanager.core.business.services.shipping.ShippingService;
+import com.salesmanager.core.business.utils.ProductPriceUtils;
+import com.salesmanager.shop.admin.controller.ControllerConstants;
+import com.salesmanager.shop.admin.model.web.Menu;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.utils.LabelUtils;
+
+@Controller
+public class ShippingOptionsController {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ShippingOptionsController.class);
+
+
+ @Inject
+ private ShippingService shippingService;
+
+ @Inject
+ LabelUtils messages;
+
+ @Inject
+ private ProductPriceUtils priceUtil;
+
+ /**
+ * Displays shipping options
+ * @param request
+ * @param response
+ * @param locale
+ * @return
+ * @throws Exception
+ */
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/shippingOptions.html", method=RequestMethod.GET)
+ public String displayShippingOptions(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ this.setMenu(model, request);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+
+
+ ShippingConfiguration shippingConfiguration = shippingService.getShippingConfiguration(store);
+
+ if(shippingConfiguration==null) {
+ shippingConfiguration = new ShippingConfiguration();
+ shippingConfiguration.setShippingType(ShippingType.INTERNATIONAL);
+ }
+
+ if(shippingConfiguration!=null) {
+
+ if(shippingConfiguration.getHandlingFees()!=null) {
+ shippingConfiguration.setHandlingFeesText(priceUtil.getAdminFormatedAmount(store,shippingConfiguration.getHandlingFees()));
+ }
+
+ if(shippingConfiguration.getOrderTotalFreeShipping()!=null) {
+ shippingConfiguration.setOrderTotalFreeShippingText(priceUtil.getAdminFormatedAmount(store,shippingConfiguration.getOrderTotalFreeShipping()));
+ }
+
+ }
+
+
+ model.addAttribute("configuration", shippingConfiguration);
+ return ControllerConstants.Tiles.Shipping.shippingOptions;
+
+
+ }
+
+ /**
+ * Saves shipping options
+ * @param configuration
+ * @param result
+ * @param model
+ * @param request
+ * @param response
+ * @param locale
+ * @return
+ * @throws Exception
+ */
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/saveShippingOptions.html", method=RequestMethod.POST)
+ public String saveShippingOptions(@ModelAttribute("configuration") ShippingConfiguration configuration, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+
+ this.setMenu(model, request);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ //get original configuration
+ ShippingConfiguration shippingConfiguration = shippingService.getShippingConfiguration(store);
+
+ if(shippingConfiguration==null) {
+ shippingConfiguration = new ShippingConfiguration();
+ }
+
+ BigDecimal submitedOrderPrice = null;
+ if(!StringUtils.isBlank(configuration.getOrderTotalFreeShippingText())){
+ try {
+ submitedOrderPrice = priceUtil.getAmount(configuration.getOrderTotalFreeShippingText());
+ shippingConfiguration.setOrderTotalFreeShipping(submitedOrderPrice);
+ } catch (Exception e) {
+ ObjectError error = new ObjectError("orderTotalFreeShippingText",messages.getMessage("message.invalid.price", locale));
+ result.addError(error);
+ }
+ }
+
+ BigDecimal submitedHandlingPrice = null;
+ if(!StringUtils.isBlank(configuration.getHandlingFeesText())){
+ try {
+ submitedHandlingPrice = priceUtil.getAmount(configuration.getHandlingFeesText());
+ shippingConfiguration.setHandlingFees(submitedHandlingPrice);
+ } catch (Exception e) {
+ ObjectError error = new ObjectError("handlingFeesText",messages.getMessage("message.invalid.price", locale));
+ result.addError(error);
+ }
+ }
+
+ shippingConfiguration.setFreeShippingEnabled(configuration.isFreeShippingEnabled());
+ shippingConfiguration.setTaxOnShipping(configuration.isTaxOnShipping());
+ if(configuration.getShipFreeType()!=null) {
+ shippingConfiguration.setShipFreeType(configuration.getShipFreeType());
+ }
+ shippingConfiguration.setShipOptionPriceType(configuration.getShipOptionPriceType());
+
+ shippingService.saveShippingConfiguration(shippingConfiguration, store);
+
+ model.addAttribute("configuration", configuration);
+ model.addAttribute("success","success");
+ return ControllerConstants.Tiles.Shipping.shippingOptions;
+
+
+ }
+
+ private void setMenu(Model model, HttpServletRequest request) throws Exception {
+
+ //display menu
+ Map<String,String> activeMenus = new HashMap<String,String>();
+ activeMenus.put("shipping", "shipping");
+ activeMenus.put("shipping-options", "shipping-options");
+
+ @SuppressWarnings("unchecked")
+ Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
+
+ Menu currentMenu = (Menu)menus.get("shipping");
+ model.addAttribute("currentMenu",currentMenu);
+ model.addAttribute("activeMenus",activeMenus);
+ //
+
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingOriginController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingOriginController.java
index 1381135..1d7aa89 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingOriginController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingOriginController.java
@@ -1,168 +1,168 @@
-package com.salesmanager.shop.admin.controller.shipping;
-
-import com.salesmanager.core.business.services.reference.country.CountryService;
-import com.salesmanager.core.business.services.reference.zone.ZoneService;
-import com.salesmanager.core.business.services.shipping.ShippingOriginService;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.reference.zone.Zone;
-import com.salesmanager.core.model.shipping.ShippingOrigin;
-import com.salesmanager.shop.admin.model.web.Menu;
-import com.salesmanager.shop.constants.Constants;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-
-@Controller
-public class ShippingOriginController {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ShippingOriginController.class);
-
-
- @Inject
- private ShippingOriginService shippingOriginService;
-
- @Inject
- private CountryService countryService;
-
- @Inject
- private ZoneService zoneService;
-
- /**
- * Configures the shipping mode, shows shipping countries
- * @param request
- * @param response
- * @return
- * @throws Exception
- */
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/origin/get.html", method=RequestMethod.GET)
- public String displayShippingOrigin(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
- this.setMenu(model, request);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- Language language = (Language)request.getAttribute("LANGUAGE");
-
- ShippingOrigin shippingOrigin = shippingOriginService.getByStore(store);
-
- List<Country> countries = countryService.getCountries(language);
-
- if(shippingOrigin==null) {
- shippingOrigin = new ShippingOrigin();
- shippingOrigin.setCountry(store.getCountry());
- shippingOrigin.setState(store.getStorestateprovince());
- shippingOrigin.setZone(store.getZone());
- }
-
- model.addAttribute("countries", countries);
- model.addAttribute("origin", shippingOrigin);
- return "shipping-origin";
-
-
- }
-
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/origin/post.html", method=RequestMethod.POST)
- public String saveShippingOrigin(@Valid @ModelAttribute("origin") ShippingOrigin origin, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- this.setMenu(model, request);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- Language language = (Language)request.getAttribute("LANGUAGE");
- List<Country> countries = countryService.getCountries(language);
-
- ShippingOrigin shippingOrigin = shippingOriginService.getByStore(store);
- if(shippingOrigin!=null) {
- origin.setId(shippingOrigin.getId());
- }
-
- origin.setMerchantStore(store);
-
- Country country = countryService.getByCode(origin.getCountry().getIsoCode());
- origin.setCountry(country);
-
- if(origin.getZone() !=null) {
- Zone zone = zoneService.getByCode(origin.getZone().getCode());
- origin.setZone(zone);
- }
-
- if(shippingOrigin!=null) {
- shippingOriginService.update(origin);
- } else {
- shippingOriginService.save(origin);
- }
-
- model.addAttribute("countries", countries);
- model.addAttribute("origin", origin);
- model.addAttribute("success","success");
- return "shipping-origin";
-
- }
-
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/origin/delete.html", method=RequestMethod.POST)
- public String deleteShippingOrigin(@ModelAttribute("origin") ShippingOrigin origin, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- this.setMenu(model, request);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- ShippingOrigin shippingOrigin = shippingOriginService.getByStore(store);
-
- Language language = (Language)request.getAttribute("LANGUAGE");
- List<Country> countries = countryService.getCountries(language);
-
-
- if(shippingOrigin!=null && origin !=null) {
- if(shippingOrigin.getId().longValue() == origin.getId().longValue()) {
- shippingOriginService.delete(shippingOrigin);
- model.addAttribute("success","success");
- } else {
- return "redirect:/admin/shipping/origin/get.html";
- }
- } else {
- return "redirect:/admin/shipping/origin/get.html";
- }
-
- model.addAttribute("countries", countries);
- model.addAttribute("origin", null);
- model.addAttribute("success","success");
- return "shipping-origin";
-
- }
-
- private void setMenu(Model model, HttpServletRequest request) throws Exception {
-
- //display menu
- Map<String,String> activeMenus = new HashMap<String,String>();
- activeMenus.put("shipping", "shipping");
- activeMenus.put("shipping-origin", "shipping-origin");
-
- @SuppressWarnings("unchecked")
- Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
-
- Menu currentMenu = (Menu)menus.get("shipping");
- model.addAttribute("currentMenu",currentMenu);
- model.addAttribute("activeMenus",activeMenus);
- //
-
- }
-
-
-}
+package com.salesmanager.shop.admin.controller.shipping;
+
+import com.salesmanager.core.business.services.reference.country.CountryService;
+import com.salesmanager.core.business.services.reference.zone.ZoneService;
+import com.salesmanager.core.business.services.shipping.ShippingOriginService;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.reference.zone.Zone;
+import com.salesmanager.core.model.shipping.ShippingOrigin;
+import com.salesmanager.shop.admin.model.web.Menu;
+import com.salesmanager.shop.constants.Constants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+
+@Controller
+public class ShippingOriginController {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ShippingOriginController.class);
+
+
+ @Inject
+ private ShippingOriginService shippingOriginService;
+
+ @Inject
+ private CountryService countryService;
+
+ @Inject
+ private ZoneService zoneService;
+
+ /**
+ * Configures the shipping mode, shows shipping countries
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/origin/get.html", method=RequestMethod.GET)
+ public String displayShippingOrigin(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ this.setMenu(model, request);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ Language language = (Language)request.getAttribute("LANGUAGE");
+
+ ShippingOrigin shippingOrigin = shippingOriginService.getByStore(store);
+
+ List<Country> countries = countryService.getCountries(language);
+
+ if(shippingOrigin==null) {
+ shippingOrigin = new ShippingOrigin();
+ shippingOrigin.setCountry(store.getCountry());
+ shippingOrigin.setState(store.getStorestateprovince());
+ shippingOrigin.setZone(store.getZone());
+ }
+
+ model.addAttribute("countries", countries);
+ model.addAttribute("origin", shippingOrigin);
+ return "shipping-origin";
+
+
+ }
+
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/origin/post.html", method=RequestMethod.POST)
+ public String saveShippingOrigin(@Valid @ModelAttribute("origin") ShippingOrigin origin, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ this.setMenu(model, request);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ Language language = (Language)request.getAttribute("LANGUAGE");
+ List<Country> countries = countryService.getCountries(language);
+
+ ShippingOrigin shippingOrigin = shippingOriginService.getByStore(store);
+ if(shippingOrigin!=null) {
+ origin.setId(shippingOrigin.getId());
+ }
+
+ origin.setMerchantStore(store);
+
+ Country country = countryService.getByCode(origin.getCountry().getIsoCode());
+ origin.setCountry(country);
+
+ if(origin.getZone() !=null) {
+ Zone zone = zoneService.getByCode(origin.getZone().getCode());
+ origin.setZone(zone);
+ }
+
+ if(shippingOrigin!=null) {
+ shippingOriginService.update(origin);
+ } else {
+ shippingOriginService.save(origin);
+ }
+
+ model.addAttribute("countries", countries);
+ model.addAttribute("origin", origin);
+ model.addAttribute("success","success");
+ return "shipping-origin";
+
+ }
+
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/origin/delete.html", method=RequestMethod.POST)
+ public String deleteShippingOrigin(@ModelAttribute("origin") ShippingOrigin origin, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ this.setMenu(model, request);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ ShippingOrigin shippingOrigin = shippingOriginService.getByStore(store);
+
+ Language language = (Language)request.getAttribute("LANGUAGE");
+ List<Country> countries = countryService.getCountries(language);
+
+
+ if(shippingOrigin!=null && origin !=null) {
+ if(shippingOrigin.getId().longValue() == origin.getId().longValue()) {
+ shippingOriginService.delete(shippingOrigin);
+ model.addAttribute("success","success");
+ } else {
+ return "redirect:/admin/shipping/origin/get.html";
+ }
+ } else {
+ return "redirect:/admin/shipping/origin/get.html";
+ }
+
+ model.addAttribute("countries", countries);
+ model.addAttribute("origin", null);
+ model.addAttribute("success","success");
+ return "shipping-origin";
+
+ }
+
+ private void setMenu(Model model, HttpServletRequest request) throws Exception {
+
+ //display menu
+ Map<String,String> activeMenus = new HashMap<String,String>();
+ activeMenus.put("shipping", "shipping");
+ activeMenus.put("shipping-origin", "shipping-origin");
+
+ @SuppressWarnings("unchecked")
+ Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
+
+ Menu currentMenu = (Menu)menus.get("shipping");
+ model.addAttribute("currentMenu",currentMenu);
+ model.addAttribute("activeMenus",activeMenus);
+ //
+
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingPackagingController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingPackagingController.java
index 0a27849..82dd0b9 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingPackagingController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/shipping/ShippingPackagingController.java
@@ -1,140 +1,140 @@
-package com.salesmanager.shop.admin.controller.shipping;
-
-import java.text.DecimalFormat;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.inject.Inject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.BindingResult;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.shipping.ShippingConfiguration;
-import com.salesmanager.core.model.shipping.ShippingType;
-import com.salesmanager.core.business.services.shipping.ShippingService;
-import com.salesmanager.shop.admin.controller.ControllerConstants;
-import com.salesmanager.shop.admin.model.web.Menu;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.utils.LabelUtils;
-
-@Controller
-public class ShippingPackagingController {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ShippingPackagingController.class);
-
-
- @Inject
- private ShippingService shippingService;
-
- @Inject
- LabelUtils messages;
-
-
- /**
- * Displays shipping packaging
- * @param request
- * @param response
- * @param locale
- * @return
- * @throws Exception
- */
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/shippingPackaging.html", method=RequestMethod.GET)
- public String displayShippingPackaging(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
- this.setMenu(model, request);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- ShippingConfiguration shippingConfiguration = shippingService.getShippingConfiguration(store);
-
- if(shippingConfiguration==null) {
- shippingConfiguration = new ShippingConfiguration();
- shippingConfiguration.setShippingType(ShippingType.INTERNATIONAL);
- }
-
- model.addAttribute("configuration", shippingConfiguration);
- model.addAttribute("store",store);
- return ControllerConstants.Tiles.Shipping.shippingPackaging;
-
-
- }
-
- /**
- * Saves shipping packaging
- * @param configuration
- * @param result
- * @param model
- * @param request
- * @param response
- * @param locale
- * @return
- * @throws Exception
- */
- @PreAuthorize("hasRole('SHIPPING')")
- @RequestMapping(value="/admin/shipping/saveShippingPackaging.html", method=RequestMethod.POST)
- public String saveShippingPackaging(@ModelAttribute("configuration") ShippingConfiguration configuration, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
-
- this.setMenu(model, request);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- //get original configuration
- ShippingConfiguration shippingConfiguration = shippingService.getShippingConfiguration(store);
-
- if(shippingConfiguration==null) {
- shippingConfiguration = new ShippingConfiguration();
- }
-
- DecimalFormat df = new DecimalFormat("#.##");
- String sweight = df.format(configuration.getBoxWeight());
- double weight = Double.parseDouble(sweight);
-
- shippingConfiguration.setBoxHeight(configuration.getBoxHeight());
- shippingConfiguration.setBoxLength(configuration.getBoxLength());
- shippingConfiguration.setBoxWeight(weight);
- shippingConfiguration.setBoxWidth(configuration.getBoxWidth());
-
- shippingConfiguration.setShipPackageType(configuration.getShipPackageType());
-
-
- shippingService.saveShippingConfiguration(shippingConfiguration, store);
-
- model.addAttribute("configuration", configuration);
- model.addAttribute("success","success");
- return ControllerConstants.Tiles.Shipping.shippingPackaging;
-
-
- }
-
- private void setMenu(Model model, HttpServletRequest request) throws Exception {
-
- //display menu
- Map<String,String> activeMenus = new HashMap<String,String>();
- activeMenus.put("shipping", "shipping");
- activeMenus.put("shipping-packages", "shipping-packages");
-
- @SuppressWarnings("unchecked")
- Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
-
- Menu currentMenu = (Menu)menus.get("shipping");
- model.addAttribute("currentMenu",currentMenu);
- model.addAttribute("activeMenus",activeMenus);
- //
-
- }
-
-
-}
+package com.salesmanager.shop.admin.controller.shipping;
+
+import java.text.DecimalFormat;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.inject.Inject;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.shipping.ShippingConfiguration;
+import com.salesmanager.core.model.shipping.ShippingType;
+import com.salesmanager.core.business.services.shipping.ShippingService;
+import com.salesmanager.shop.admin.controller.ControllerConstants;
+import com.salesmanager.shop.admin.model.web.Menu;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.utils.LabelUtils;
+
+@Controller
+public class ShippingPackagingController {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ShippingPackagingController.class);
+
+
+ @Inject
+ private ShippingService shippingService;
+
+ @Inject
+ LabelUtils messages;
+
+
+ /**
+ * Displays shipping packaging
+ * @param request
+ * @param response
+ * @param locale
+ * @return
+ * @throws Exception
+ */
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/shippingPackaging.html", method=RequestMethod.GET)
+ public String displayShippingPackaging(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ this.setMenu(model, request);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ ShippingConfiguration shippingConfiguration = shippingService.getShippingConfiguration(store);
+
+ if(shippingConfiguration==null) {
+ shippingConfiguration = new ShippingConfiguration();
+ shippingConfiguration.setShippingType(ShippingType.INTERNATIONAL);
+ }
+
+ model.addAttribute("configuration", shippingConfiguration);
+ model.addAttribute("store",store);
+ return ControllerConstants.Tiles.Shipping.shippingPackaging;
+
+
+ }
+
+ /**
+ * Saves shipping packaging
+ * @param configuration
+ * @param result
+ * @param model
+ * @param request
+ * @param response
+ * @param locale
+ * @return
+ * @throws Exception
+ */
+ @PreAuthorize("hasRole('SHIPPING')")
+ @RequestMapping(value="/admin/shipping/saveShippingPackaging.html", method=RequestMethod.POST)
+ public String saveShippingPackaging(@ModelAttribute("configuration") ShippingConfiguration configuration, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+
+ this.setMenu(model, request);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ //get original configuration
+ ShippingConfiguration shippingConfiguration = shippingService.getShippingConfiguration(store);
+
+ if(shippingConfiguration==null) {
+ shippingConfiguration = new ShippingConfiguration();
+ }
+
+ DecimalFormat df = new DecimalFormat("#.##");
+ String sweight = df.format(configuration.getBoxWeight());
+ double weight = Double.parseDouble(sweight);
+
+ shippingConfiguration.setBoxHeight(configuration.getBoxHeight());
+ shippingConfiguration.setBoxLength(configuration.getBoxLength());
+ shippingConfiguration.setBoxWeight(weight);
+ shippingConfiguration.setBoxWidth(configuration.getBoxWidth());
+
+ shippingConfiguration.setShipPackageType(configuration.getShipPackageType());
+
+
+ shippingService.saveShippingConfiguration(shippingConfiguration, store);
+
+ model.addAttribute("configuration", configuration);
+ model.addAttribute("success","success");
+ return ControllerConstants.Tiles.Shipping.shippingPackaging;
+
+
+ }
+
+ private void setMenu(Model model, HttpServletRequest request) throws Exception {
+
+ //display menu
+ Map<String,String> activeMenus = new HashMap<String,String>();
+ activeMenus.put("shipping", "shipping");
+ activeMenus.put("shipping-packages", "shipping-packages");
+
+ @SuppressWarnings("unchecked")
+ Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
+
+ Menu currentMenu = (Menu)menus.get("shipping");
+ model.addAttribute("currentMenu",currentMenu);
+ model.addAttribute("activeMenus",activeMenus);
+ //
+
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/tax/TaxClassController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/tax/TaxClassController.java
index 61fa9bc..f82bd32 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/tax/TaxClassController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/tax/TaxClassController.java
@@ -1,312 +1,312 @@
-package com.salesmanager.shop.admin.controller.tax;
-
-import com.salesmanager.core.business.services.catalog.product.ProductService;
-import com.salesmanager.core.business.services.tax.TaxClassService;
-import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse;
-import com.salesmanager.core.business.utils.ajax.AjaxResponse;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.tax.taxclass.TaxClass;
-import com.salesmanager.shop.admin.model.web.Menu;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.utils.LabelUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.BindingResult;
-import org.springframework.validation.ObjectError;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-@Controller
-public class TaxClassController {
-
- @Inject
- private TaxClassService taxClassService = null;
-
- @Inject
- private ProductService productService=null;
-
- @Inject
- LabelUtils messages;
-
- private static final Logger LOGGER = LoggerFactory.getLogger(TaxClassController.class);
-
-
- @PreAuthorize("hasRole('TAX')")
- @RequestMapping(value={"/admin/tax/taxclass/list.html"}, method=RequestMethod.GET)
- public String displayTaxClasses(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
- setMenu(model, request);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- TaxClass taxClass = new TaxClass();
- taxClass.setMerchantStore(store);
-
- model.addAttribute("taxClass", taxClass);
-
- return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxClasses;
- }
-
-
- @PreAuthorize("hasRole('TAX')")
- @RequestMapping(value = "/admin/tax/taxclass/paging.html", method = RequestMethod.POST)
- public @ResponseBody
- ResponseEntity<String> pageTaxClasses(HttpServletRequest request,
- HttpServletResponse response, Locale locale) {
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- AjaxResponse resp = new AjaxResponse();
- try {
-
- List<TaxClass> taxClasses = taxClassService.listByStore(store);
- for(TaxClass tax : taxClasses) {
- if(!tax.getCode().equals(TaxClass.DEFAULT_TAX_CLASS)) {
- Map<String,String> entry = new HashMap<String,String>();
- entry.put("taxClassId", String.valueOf(tax.getId()));
- entry.put("code", tax.getCode());
- entry.put("name", tax.getTitle());
- resp.addDataEntry(entry);
- }
- }
-
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
-
- } catch (Exception e) {
- LOGGER.error("Error while paging permissions", e);
- resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- @PreAuthorize("hasRole('TAX')")
- @RequestMapping(value="/admin/tax/taxclass/save.html", method=RequestMethod.POST)
- public String saveTaxClass(@Valid @ModelAttribute("taxClass") TaxClass taxClass, BindingResult result, Model model, HttpServletRequest request, Locale locale) throws Exception {
-
-
- setMenu(model, request);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
-
- //requires code and name
- if(taxClass.getCode().equals(TaxClass.DEFAULT_TAX_CLASS)) {
- ObjectError error = new ObjectError("code",messages.getMessage("message.taxclass.alreadyexist", locale));
- result.addError(error);
- }
-
-
-
- //check if the code already exist
- TaxClass taxClassDb = taxClassService.getByCode(taxClass.getCode(),store);
-
- if(taxClassDb!=null) {
- ObjectError error = new ObjectError("code",messages.getMessage("message.taxclass.alreadyexist", locale));
- result.addError(error);
- }
-
- if (result.hasErrors()) {
- return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxClasses;
- }
-
- taxClassService.create(taxClass);
-
- model.addAttribute("success","success");
-
- return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxClasses;
-
- }
-
-
- @PreAuthorize("hasRole('TAX')")
- @RequestMapping(value="/admin/tax/taxclass/update.html", method=RequestMethod.POST)
- public String updateTaxClass(@Valid @ModelAttribute("taxClass") TaxClass taxClass, BindingResult result, Model model, HttpServletRequest request, Locale locale) throws Exception {
-
-
- setMenu(model, request);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
-
- //requires code and name
- if(taxClass.getCode().equals(TaxClass.DEFAULT_TAX_CLASS)) {
- ObjectError error = new ObjectError("code",messages.getMessage("message.taxclass.alreadyexist", locale));
- result.addError(error);
- }
-
-
-
- //check if the code already exist
- TaxClass taxClassDb = taxClassService.getByCode(taxClass.getCode(),store);
-
- if(taxClassDb!=null && taxClassDb.getId().longValue()!=taxClass.getId().longValue()) {
- ObjectError error = new ObjectError("code",messages.getMessage("message.taxclass.alreadyexist", locale));
- result.addError(error);
- }
-
- if (result.hasErrors()) {
- return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxClass;
- }
-
- taxClassService.update(taxClass);
-
- model.addAttribute("success","success");
-
- return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxClass;
-
- }
-
-
- @PreAuthorize("hasRole('TAX')")
- @RequestMapping(value="/admin/tax/taxclass/remove.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> removeTaxClass(HttpServletRequest request, Locale locale) throws Exception {
-
- //do not remove super admin
-
- String taxClassId = request.getParameter("taxClassId");
-
- AjaxResponse resp = new AjaxResponse();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
-
- try {
-
-
- /**
- * In order to remove a User the logged in ser must be STORE_ADMIN
- * or SUPER_USER
- */
-
-
- if(taxClassId==null){
- resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- long lTaxClassId;
- try {
- lTaxClassId = Long.parseLong(taxClassId);
- } catch (Exception e) {
- LOGGER.error("Invalid taxClassId " + taxClassId);
- resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- TaxClass taxClass = taxClassService.getById(lTaxClassId);
-
- if(taxClass==null) {
- LOGGER.error("Invalid taxClassId " + taxClassId);
- resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- //look if the taxclass is used for products
- List<Product> products = productService.listByTaxClass(taxClass);
-
- if(products!=null && products.size()>0) {
- resp.setStatusMessage(messages.getMessage("message.product.association", locale));
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- taxClassService.delete(taxClass);
-
- resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
-
-
-
- } catch (Exception e) {
- LOGGER.error("Error while deleting tax class", e);
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
-
- }
-
- @PreAuthorize("hasRole('TAX')")
- @RequestMapping(value="/admin/tax/taxclass/edit.html", method=RequestMethod.GET)
- public String editTaxClass(@ModelAttribute("id") String id, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- setMenu(model,request);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- TaxClass taxClass = null;
- try {
- Long taxClassId = Long.parseLong(id);
- taxClass = taxClassService.getById(taxClassId);
- } catch (Exception e) {
- LOGGER.error("Cannot parse taxclassid " + id);
- return "redirect:/admin/tax/taxclass/list.html";
- }
-
- if(taxClass==null || taxClass.getMerchantStore().getId()!=store.getId()) {
- return "redirect:/admin/tax/taxclass/list.html";
- }
-
-
-
-
- model.addAttribute("taxClass", taxClass);
-
- return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxClass;
-
-
-
- }
-
-
-
- private void setMenu(Model model, HttpServletRequest request)
- throws Exception {
-
- // display menu
- Map<String, String> activeMenus = new HashMap<String, String>();
- activeMenus.put("tax", "tax");
- activeMenus.put("taxclass", "taxclass");
-
- @SuppressWarnings("unchecked")
- Map<String, Menu> menus = (Map<String, Menu>) request
- .getAttribute("MENUMAP");
-
- Menu currentMenu = (Menu) menus.get("tax");
- model.addAttribute("currentMenu", currentMenu);
- model.addAttribute("activeMenus", activeMenus);
- //
-
- }
-
-}
+package com.salesmanager.shop.admin.controller.tax;
+
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.tax.TaxClassService;
+import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse;
+import com.salesmanager.core.business.utils.ajax.AjaxResponse;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.tax.taxclass.TaxClass;
+import com.salesmanager.shop.admin.model.web.Menu;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.utils.LabelUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+@Controller
+public class TaxClassController {
+
+ @Inject
+ private TaxClassService taxClassService = null;
+
+ @Inject
+ private ProductService productService=null;
+
+ @Inject
+ LabelUtils messages;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(TaxClassController.class);
+
+
+ @PreAuthorize("hasRole('TAX')")
+ @RequestMapping(value={"/admin/tax/taxclass/list.html"}, method=RequestMethod.GET)
+ public String displayTaxClasses(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ setMenu(model, request);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ TaxClass taxClass = new TaxClass();
+ taxClass.setMerchantStore(store);
+
+ model.addAttribute("taxClass", taxClass);
+
+ return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxClasses;
+ }
+
+
+ @PreAuthorize("hasRole('TAX')")
+ @RequestMapping(value = "/admin/tax/taxclass/paging.html", method = RequestMethod.POST)
+ public @ResponseBody
+ ResponseEntity<String> pageTaxClasses(HttpServletRequest request,
+ HttpServletResponse response, Locale locale) {
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ AjaxResponse resp = new AjaxResponse();
+ try {
+
+ List<TaxClass> taxClasses = taxClassService.listByStore(store);
+ for(TaxClass tax : taxClasses) {
+ if(!tax.getCode().equals(TaxClass.DEFAULT_TAX_CLASS)) {
+ Map<String,String> entry = new HashMap<String,String>();
+ entry.put("taxClassId", String.valueOf(tax.getId()));
+ entry.put("code", tax.getCode());
+ entry.put("name", tax.getTitle());
+ resp.addDataEntry(entry);
+ }
+ }
+
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging permissions", e);
+ resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ @PreAuthorize("hasRole('TAX')")
+ @RequestMapping(value="/admin/tax/taxclass/save.html", method=RequestMethod.POST)
+ public String saveTaxClass(@Valid @ModelAttribute("taxClass") TaxClass taxClass, BindingResult result, Model model, HttpServletRequest request, Locale locale) throws Exception {
+
+
+ setMenu(model, request);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+
+ //requires code and name
+ if(taxClass.getCode().equals(TaxClass.DEFAULT_TAX_CLASS)) {
+ ObjectError error = new ObjectError("code",messages.getMessage("message.taxclass.alreadyexist", locale));
+ result.addError(error);
+ }
+
+
+
+ //check if the code already exist
+ TaxClass taxClassDb = taxClassService.getByCode(taxClass.getCode(),store);
+
+ if(taxClassDb!=null) {
+ ObjectError error = new ObjectError("code",messages.getMessage("message.taxclass.alreadyexist", locale));
+ result.addError(error);
+ }
+
+ if (result.hasErrors()) {
+ return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxClasses;
+ }
+
+ taxClassService.create(taxClass);
+
+ model.addAttribute("success","success");
+
+ return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxClasses;
+
+ }
+
+
+ @PreAuthorize("hasRole('TAX')")
+ @RequestMapping(value="/admin/tax/taxclass/update.html", method=RequestMethod.POST)
+ public String updateTaxClass(@Valid @ModelAttribute("taxClass") TaxClass taxClass, BindingResult result, Model model, HttpServletRequest request, Locale locale) throws Exception {
+
+
+ setMenu(model, request);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+
+ //requires code and name
+ if(taxClass.getCode().equals(TaxClass.DEFAULT_TAX_CLASS)) {
+ ObjectError error = new ObjectError("code",messages.getMessage("message.taxclass.alreadyexist", locale));
+ result.addError(error);
+ }
+
+
+
+ //check if the code already exist
+ TaxClass taxClassDb = taxClassService.getByCode(taxClass.getCode(),store);
+
+ if(taxClassDb!=null && taxClassDb.getId().longValue()!=taxClass.getId().longValue()) {
+ ObjectError error = new ObjectError("code",messages.getMessage("message.taxclass.alreadyexist", locale));
+ result.addError(error);
+ }
+
+ if (result.hasErrors()) {
+ return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxClass;
+ }
+
+ taxClassService.update(taxClass);
+
+ model.addAttribute("success","success");
+
+ return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxClass;
+
+ }
+
+
+ @PreAuthorize("hasRole('TAX')")
+ @RequestMapping(value="/admin/tax/taxclass/remove.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> removeTaxClass(HttpServletRequest request, Locale locale) throws Exception {
+
+ //do not remove super admin
+
+ String taxClassId = request.getParameter("taxClassId");
+
+ AjaxResponse resp = new AjaxResponse();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+ try {
+
+
+ /**
+ * In order to remove a User the logged in ser must be STORE_ADMIN
+ * or SUPER_USER
+ */
+
+
+ if(taxClassId==null){
+ resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ long lTaxClassId;
+ try {
+ lTaxClassId = Long.parseLong(taxClassId);
+ } catch (Exception e) {
+ LOGGER.error("Invalid taxClassId " + taxClassId);
+ resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ TaxClass taxClass = taxClassService.getById(lTaxClassId);
+
+ if(taxClass==null) {
+ LOGGER.error("Invalid taxClassId " + taxClassId);
+ resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ //look if the taxclass is used for products
+ List<Product> products = productService.listByTaxClass(taxClass);
+
+ if(products!=null && products.size()>0) {
+ resp.setStatusMessage(messages.getMessage("message.product.association", locale));
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ taxClassService.delete(taxClass);
+
+ resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
+
+
+
+ } catch (Exception e) {
+ LOGGER.error("Error while deleting tax class", e);
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+ }
+
+ @PreAuthorize("hasRole('TAX')")
+ @RequestMapping(value="/admin/tax/taxclass/edit.html", method=RequestMethod.GET)
+ public String editTaxClass(@ModelAttribute("id") String id, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ setMenu(model,request);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ TaxClass taxClass = null;
+ try {
+ Long taxClassId = Long.parseLong(id);
+ taxClass = taxClassService.getById(taxClassId);
+ } catch (Exception e) {
+ LOGGER.error("Cannot parse taxclassid " + id);
+ return "redirect:/admin/tax/taxclass/list.html";
+ }
+
+ if(taxClass==null || taxClass.getMerchantStore().getId()!=store.getId()) {
+ return "redirect:/admin/tax/taxclass/list.html";
+ }
+
+
+
+
+ model.addAttribute("taxClass", taxClass);
+
+ return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxClass;
+
+
+
+ }
+
+
+
+ private void setMenu(Model model, HttpServletRequest request)
+ throws Exception {
+
+ // display menu
+ Map<String, String> activeMenus = new HashMap<String, String>();
+ activeMenus.put("tax", "tax");
+ activeMenus.put("taxclass", "taxclass");
+
+ @SuppressWarnings("unchecked")
+ Map<String, Menu> menus = (Map<String, Menu>) request
+ .getAttribute("MENUMAP");
+
+ Menu currentMenu = (Menu) menus.get("tax");
+ model.addAttribute("currentMenu", currentMenu);
+ model.addAttribute("activeMenus", activeMenus);
+ //
+
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/tax/TaxConfigurationController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/tax/TaxConfigurationController.java
index 9798c45..0438f53 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/tax/TaxConfigurationController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/tax/TaxConfigurationController.java
@@ -1,87 +1,87 @@
-package com.salesmanager.shop.admin.controller.tax;
-
-import com.salesmanager.core.business.services.tax.TaxService;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.tax.TaxConfiguration;
-import com.salesmanager.shop.admin.model.web.Menu;
-import com.salesmanager.shop.constants.Constants;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.BindingResult;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-
-@Controller
-public class TaxConfigurationController {
-
- @Inject
- private TaxService taxService = null;
-
-
- @PreAuthorize("hasRole('TAX')")
- @RequestMapping(value={"/admin/tax/taxconfiguration/edit.html"}, method=RequestMethod.GET)
- public String displayTaxConfiguration(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
- setMenu(model, request);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
-
- TaxConfiguration taxConfiguration = taxService.getTaxConfiguration(store);
- if(taxConfiguration == null) {
-
- taxConfiguration = new TaxConfiguration();
-
- }
-
- model.addAttribute("taxConfiguration", taxConfiguration);
-
- return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxConfiguration;
- }
-
- @PreAuthorize("hasRole('TAX')")
- @RequestMapping(value="/admin/tax/taxconfiguration/save.html", method=RequestMethod.POST)
- public String saveTaxConfiguration(@Valid @ModelAttribute("taxConfiguration") TaxConfiguration taxConfiguration, BindingResult result, Model model, HttpServletRequest request, Locale locale) throws Exception {
-
-
- setMenu(model, request);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- taxService.saveTaxConfiguration(taxConfiguration, store);
-
- model.addAttribute("success","success");
-
- return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxConfiguration;
-
- }
-
-
- private void setMenu(Model model, HttpServletRequest request)
- throws Exception {
-
- // display menu
- Map<String, String> activeMenus = new HashMap<String, String>();
- activeMenus.put("tax", "tax");
- activeMenus.put("taxconfiguration", "taxconfiguration");
-
- @SuppressWarnings("unchecked")
- Map<String, Menu> menus = (Map<String, Menu>) request
- .getAttribute("MENUMAP");
-
- Menu currentMenu = (Menu) menus.get("tax");
- model.addAttribute("currentMenu", currentMenu);
- model.addAttribute("activeMenus", activeMenus);
- //
-
- }
-
-}
+package com.salesmanager.shop.admin.controller.tax;
+
+import com.salesmanager.core.business.services.tax.TaxService;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.tax.TaxConfiguration;
+import com.salesmanager.shop.admin.model.web.Menu;
+import com.salesmanager.shop.constants.Constants;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+@Controller
+public class TaxConfigurationController {
+
+ @Inject
+ private TaxService taxService = null;
+
+
+ @PreAuthorize("hasRole('TAX')")
+ @RequestMapping(value={"/admin/tax/taxconfiguration/edit.html"}, method=RequestMethod.GET)
+ public String displayTaxConfiguration(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ setMenu(model, request);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+
+ TaxConfiguration taxConfiguration = taxService.getTaxConfiguration(store);
+ if(taxConfiguration == null) {
+
+ taxConfiguration = new TaxConfiguration();
+
+ }
+
+ model.addAttribute("taxConfiguration", taxConfiguration);
+
+ return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxConfiguration;
+ }
+
+ @PreAuthorize("hasRole('TAX')")
+ @RequestMapping(value="/admin/tax/taxconfiguration/save.html", method=RequestMethod.POST)
+ public String saveTaxConfiguration(@Valid @ModelAttribute("taxConfiguration") TaxConfiguration taxConfiguration, BindingResult result, Model model, HttpServletRequest request, Locale locale) throws Exception {
+
+
+ setMenu(model, request);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ taxService.saveTaxConfiguration(taxConfiguration, store);
+
+ model.addAttribute("success","success");
+
+ return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxConfiguration;
+
+ }
+
+
+ private void setMenu(Model model, HttpServletRequest request)
+ throws Exception {
+
+ // display menu
+ Map<String, String> activeMenus = new HashMap<String, String>();
+ activeMenus.put("tax", "tax");
+ activeMenus.put("taxconfiguration", "taxconfiguration");
+
+ @SuppressWarnings("unchecked")
+ Map<String, Menu> menus = (Map<String, Menu>) request
+ .getAttribute("MENUMAP");
+
+ Menu currentMenu = (Menu) menus.get("tax");
+ model.addAttribute("currentMenu", currentMenu);
+ model.addAttribute("activeMenus", activeMenus);
+ //
+
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/tax/TaxRatesController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/tax/TaxRatesController.java
index 3dd6d34..4cf6742 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/tax/TaxRatesController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/tax/TaxRatesController.java
@@ -1,475 +1,475 @@
-package com.salesmanager.shop.admin.controller.tax;
-import com.salesmanager.core.business.services.reference.country.CountryService;
-import com.salesmanager.core.business.services.reference.zone.ZoneService;
-import com.salesmanager.core.business.services.tax.TaxClassService;
-import com.salesmanager.core.business.services.tax.TaxRateService;
-import com.salesmanager.core.business.utils.ajax.AjaxResponse;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.reference.zone.Zone;
-import com.salesmanager.core.model.tax.taxclass.TaxClass;
-import com.salesmanager.core.model.tax.taxrate.TaxRate;
-import com.salesmanager.core.model.tax.taxrate.TaxRateDescription;
-import com.salesmanager.shop.admin.model.web.Menu;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.utils.LabelUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.BindingResult;
-import org.springframework.validation.FieldError;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
-import java.math.BigDecimal;
-import java.text.NumberFormat;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-
-@Controller
-public class TaxRatesController {
-
-
- private static final Logger LOGGER = LoggerFactory.getLogger(TaxRatesController.class);
-
- private final static char DECIMALCOUNT = '3';
-
-
- @Inject
- LabelUtils messages;
-
- @Inject
- private CountryService countryService;
-
- @Inject
- private TaxRateService taxRateService;
-
- @Inject
- private TaxClassService taxClassService;
-
- @Inject
- private ZoneService zoneService;
-
- @PreAuthorize("hasRole('TAX')")
- @RequestMapping(value={"/admin/tax/taxrates/list.html"}, method=RequestMethod.GET)
- public String displayTaxRates(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
- setMenu(model, request);
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- Language language = (Language)request.getAttribute("LANGUAGE");
-
- List<Country> countries = countryService.getCountries(language);
- TaxRate taxRate = new TaxRate();
- List<Language> languages = store.getLanguages();
-
- for(Language l : languages) {
-
- TaxRateDescription taxRateDescription = new TaxRateDescription();
- taxRateDescription.setLanguage(l);
- taxRate.getDescriptions().add(taxRateDescription);
- }
-
- taxRate.setMerchantStore(store);
- taxRate.setCountry(store.getCountry());
-
-
- List<TaxRate> taxRates = taxRateService.listByStore(store);
- List<TaxClass> taxClasses = taxClassService.listByStore(store);
-
- model.addAttribute("taxRate", taxRate);
- model.addAttribute("countries", countries);
- model.addAttribute("taxRates", taxRates);
- model.addAttribute("taxClasses", taxClasses);
-
- return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxRates;
- }
-
- @SuppressWarnings("unchecked")
- @PreAuthorize("hasRole('TAX')")
- @RequestMapping(value = "/admin/tax/taxrates/page.html", method = RequestMethod.POST)
- public @ResponseBody
- ResponseEntity<String> pageTaxRates(HttpServletRequest request,
- HttpServletResponse response) {
-
- AjaxResponse resp = new AjaxResponse();
-
-
- try {
-
- NumberFormat nf = null;
-
-
- nf = NumberFormat.getInstance(Locale.US);
- nf.setMaximumFractionDigits(Integer.parseInt(Character
- .toString(DECIMALCOUNT)));
- nf.setMinimumFractionDigits(Integer.parseInt(Character
- .toString(DECIMALCOUNT)));
-
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- Language language = (Language)request.getAttribute("LANGUAGE");
- List<TaxRate> taxRates = taxRateService.listByStore(store,language);
-
- if(taxRates!=null) {
- for (TaxRate rate : taxRates) {
-
- Map entry = new HashMap ();
- entry.put("taxRateId", String.valueOf(rate.getId()));
- entry.put("code", rate.getCode());
- List<TaxRateDescription> descriptions = rate.getDescriptions();
- String name = "";
- if(descriptions!=null && descriptions.size()>0) {
- TaxRateDescription desc = descriptions.get(0);
- for(TaxRateDescription description : descriptions) {
- if(description.getLanguage().getCode().equals(language.getCode())) {
- desc = description;
- break;
- }
- }
- name = desc.getName();
- }
-
- entry.put("name", name);
- entry.put("priority", rate.getTaxPriority());
-
- entry.put("piggyback", rate.isPiggyback());
- entry.put("country", rate.getCountry().getIsoCode());
- entry.put("taxClass", rate.getTaxClass().getCode());
-
-
- String zoneCode = rate.getStateProvince();
- if(rate.getZone()!=null) {
- zoneCode = rate.getZone().getCode();
- }
- entry.put("zone", zoneCode);
- entry.put("rate", nf.format(rate.getTaxRate()));
-
- resp.addDataEntry(entry);
-
- }
- }
-
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
-
- } catch (Exception e) {
- LOGGER.error("Error while paging custom weight based", e);
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- }
-
- String returnString = resp.toJSONString();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- @PreAuthorize("hasRole('TAX')")
- @RequestMapping(value="/admin/tax/taxrates/save.html", method=RequestMethod.POST)
- public String saveTaxRate(@Valid @ModelAttribute("taxRate") TaxRate taxRate, BindingResult result, Model model, HttpServletRequest request, Locale locale) throws Exception {
-
- setMenu(model, request);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- Language language = (Language)request.getAttribute("LANGUAGE");
-
- this.validateTaxRate(model, taxRate, result, store, language, locale);
-
- if (result.hasErrors()) {
-
- return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxRates;
-
- }
-
-
- taxRateService.create(taxRate);
-
- List<TaxRate> taxRates = taxRateService.listByStore(store);
-
- model.addAttribute("success","success");
- model.addAttribute("taxRates", taxRates);
-
-
-
-
- return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxRates;
-
- }
-
-
-
- @PreAuthorize("hasRole('TAX')")
- @RequestMapping(value="/admin/tax/taxrates/update.html", method=RequestMethod.POST)
- public String updateTaxRate(@Valid @ModelAttribute("taxRate") TaxRate taxRate, BindingResult result, Model model, HttpServletRequest request, Locale locale) throws Exception {
-
-
- setMenu(model, request);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- Language language = (Language)request.getAttribute("LANGUAGE");
-
- this.validateTaxRate(model, taxRate, result, store, language, locale);
-
- if (result.hasErrors()) {
-
- return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxRate;
-
- }
-
-
- taxRateService.update(taxRate);
-
- List<TaxRate> taxRates = taxRateService.listByStore(store);
-
- model.addAttribute("success","success");
- model.addAttribute("taxRates", taxRates);
-
-
-
-
- return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxRate;
-
-
- }
-
- private void validateTaxRate(Model model, TaxRate taxRate, BindingResult result, MerchantStore store, Language language, Locale locale) throws Exception {
-
-
-
- List<TaxClass> taxClasses = taxClassService.listByStore(store);
-
-
- List<Country> countries = countryService.getCountries(language);
- List<TaxRate> taxRates = taxRateService.listByStore(store);
-
-
- model.addAttribute("countries", countries);
- model.addAttribute("taxRates", taxRates);
- model.addAttribute("taxClasses", taxClasses);
-
- if(StringUtils.isBlank(taxRate.getRateText())) {
- FieldError error = new FieldError("taxRate","rateText",messages.getMessage("NotEmpty.taxRate.rateText", locale));
- result.addError(error);
- }
-
- //if(taxRate.isPiggyback() && taxRate.getParent()==null) {
- //FieldError error = new FieldError("taxRate","piggyback",messages.getMessage("NotNull.taxRate.parent", locale));
- //result.addError(error);
- //}
-
- try {
- BigDecimal rate = new BigDecimal(taxRate.getRateText());
- taxRate.setTaxRate(rate);
- } catch (Exception e) {
- FieldError error = new FieldError("taxRate","rateText",messages.getMessage("message.invalid.rate", locale));
- result.addError(error);
- }
-
- //check if code exists
- String taxRateCode = taxRate.getCode();
- TaxRate tr = taxRateService.getByCode(taxRateCode, store);
- if(tr!=null) {
- if(tr.getId().longValue()!=taxRate.getId().longValue()){
- FieldError error = new FieldError("taxRate","code",messages.getMessage("NotEmpty.taxRate.unique.code", locale));
- result.addError(error);
- }
- }
-
-
- if(taxRate.getTaxPriority()==null) {
- taxRate.setTaxPriority(0);
- }
-
-
- if(taxRate.getZone()!=null) {
- Zone z = zoneService.getById(taxRate.getZone().getId());
- taxRate.setZone(z);
- }
-
-
-
- Country c = countryService.getByCode(taxRate.getCountry().getIsoCode());
-
- taxRate.setCountry(c);
-
- List<TaxRateDescription> descriptions = taxRate.getDescriptions();
- for(TaxRateDescription description : descriptions) {
- description.setTaxRate(taxRate);
- }
-
- if(!taxRate.isPiggyback()) {
- taxRate.setParent(null);
- }
-
- return;
-
- }
-
-
- @PreAuthorize("hasRole('TAX')")
- @RequestMapping(value="/admin/tax/taxrates/remove.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> removeTaxRate(HttpServletRequest request, Locale locale) throws Exception {
-
- //do not remove super admin
-
- String taxRateId = request.getParameter("taxRateId");
-
- AjaxResponse resp = new AjaxResponse();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
-
- try {
-
-
- /**
- * In order to remove a User the logged in must be STORE_ADMIN
- * or SUPER_USER
- */
-
-
- if(taxRateId==null){
- resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- long ltaxRateId;
- try {
- ltaxRateId = Long.parseLong(taxRateId);
- } catch (Exception e) {
- LOGGER.error("Invalid taxRateId " + taxRateId);
- resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- TaxRate taxRate = taxRateService.getById(ltaxRateId);
-
- if(taxRate==null) {
- LOGGER.error("Invalid taxRateId " + taxRateId);
- resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
-
-
- taxRateService.delete(taxRate);
-
- resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
-
-
-
- } catch (Exception e) {
- LOGGER.error("Error while deleting tax rate", e);
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
-
- }
-
- @PreAuthorize("hasRole('TAX')")
- @RequestMapping(value="/admin/tax/taxrates/edit.html", method=RequestMethod.GET)
- public String editTaxRate(@ModelAttribute("id") String id, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- setMenu(model,request);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- Language language = (Language)request.getAttribute("LANGUAGE");
-
- TaxRate taxRate = null;
- try {
- Long taxRateId = Long.parseLong(id);
- taxRate = taxRateService.getById(taxRateId);
- } catch (Exception e) {
- LOGGER.error("Cannot parse taxRateId " + id);
- return "redirect:/admin/tax/taxrates/list.html";
- }
-
- if(taxRate==null || taxRate.getMerchantStore().getId()!=store.getId()) {
- return "redirect:/admin/tax/taxrates/list.html";
- }
-
-
- NumberFormat nf = null;
-
-
- nf = NumberFormat.getInstance(Locale.US);
-
- nf.setMaximumFractionDigits(Integer.parseInt(Character
- .toString(DECIMALCOUNT)));
- nf.setMinimumFractionDigits(Integer.parseInt(Character
- .toString(DECIMALCOUNT)));
-
- taxRate.setRateText(nf.format(taxRate.getTaxRate()));
-
-
-
- List<TaxClass> taxClasses = taxClassService.listByStore(store);
-
-
-
- List<Country> countries = countryService.getCountries(language);
- List<TaxRate> taxRates = taxRateService.listByStore(store);
-
-
- model.addAttribute("countries", countries);
- model.addAttribute("taxRates", taxRates);
- model.addAttribute("taxClasses", taxClasses);
-
- model.addAttribute("taxRate", taxRate);
-
- return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxRate;
-
-
-
- }
-
-
-
-
- private void setMenu(Model model, HttpServletRequest request)
- throws Exception {
-
- // display menu
- Map<String, String> activeMenus = new HashMap<String, String>();
- activeMenus.put("tax", "tax");
- activeMenus.put("taxrates", "taxrates");
-
- @SuppressWarnings("unchecked")
- Map<String, Menu> menus = (Map<String, Menu>) request
- .getAttribute("MENUMAP");
-
- Menu currentMenu = (Menu) menus.get("tax");
- model.addAttribute("currentMenu", currentMenu);
- model.addAttribute("activeMenus", activeMenus);
- //
-
- }
-
-}
+package com.salesmanager.shop.admin.controller.tax;
+import com.salesmanager.core.business.services.reference.country.CountryService;
+import com.salesmanager.core.business.services.reference.zone.ZoneService;
+import com.salesmanager.core.business.services.tax.TaxClassService;
+import com.salesmanager.core.business.services.tax.TaxRateService;
+import com.salesmanager.core.business.utils.ajax.AjaxResponse;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.reference.zone.Zone;
+import com.salesmanager.core.model.tax.taxclass.TaxClass;
+import com.salesmanager.core.model.tax.taxrate.TaxRate;
+import com.salesmanager.core.model.tax.taxrate.TaxRateDescription;
+import com.salesmanager.shop.admin.model.web.Menu;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.utils.LabelUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.math.BigDecimal;
+import java.text.NumberFormat;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+
+@Controller
+public class TaxRatesController {
+
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(TaxRatesController.class);
+
+ private final static char DECIMALCOUNT = '3';
+
+
+ @Inject
+ LabelUtils messages;
+
+ @Inject
+ private CountryService countryService;
+
+ @Inject
+ private TaxRateService taxRateService;
+
+ @Inject
+ private TaxClassService taxClassService;
+
+ @Inject
+ private ZoneService zoneService;
+
+ @PreAuthorize("hasRole('TAX')")
+ @RequestMapping(value={"/admin/tax/taxrates/list.html"}, method=RequestMethod.GET)
+ public String displayTaxRates(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ setMenu(model, request);
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ Language language = (Language)request.getAttribute("LANGUAGE");
+
+ List<Country> countries = countryService.getCountries(language);
+ TaxRate taxRate = new TaxRate();
+ List<Language> languages = store.getLanguages();
+
+ for(Language l : languages) {
+
+ TaxRateDescription taxRateDescription = new TaxRateDescription();
+ taxRateDescription.setLanguage(l);
+ taxRate.getDescriptions().add(taxRateDescription);
+ }
+
+ taxRate.setMerchantStore(store);
+ taxRate.setCountry(store.getCountry());
+
+
+ List<TaxRate> taxRates = taxRateService.listByStore(store);
+ List<TaxClass> taxClasses = taxClassService.listByStore(store);
+
+ model.addAttribute("taxRate", taxRate);
+ model.addAttribute("countries", countries);
+ model.addAttribute("taxRates", taxRates);
+ model.addAttribute("taxClasses", taxClasses);
+
+ return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxRates;
+ }
+
+ @SuppressWarnings("unchecked")
+ @PreAuthorize("hasRole('TAX')")
+ @RequestMapping(value = "/admin/tax/taxrates/page.html", method = RequestMethod.POST)
+ public @ResponseBody
+ ResponseEntity<String> pageTaxRates(HttpServletRequest request,
+ HttpServletResponse response) {
+
+ AjaxResponse resp = new AjaxResponse();
+
+
+ try {
+
+ NumberFormat nf = null;
+
+
+ nf = NumberFormat.getInstance(Locale.US);
+ nf.setMaximumFractionDigits(Integer.parseInt(Character
+ .toString(DECIMALCOUNT)));
+ nf.setMinimumFractionDigits(Integer.parseInt(Character
+ .toString(DECIMALCOUNT)));
+
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ Language language = (Language)request.getAttribute("LANGUAGE");
+ List<TaxRate> taxRates = taxRateService.listByStore(store,language);
+
+ if(taxRates!=null) {
+ for (TaxRate rate : taxRates) {
+
+ Map entry = new HashMap ();
+ entry.put("taxRateId", String.valueOf(rate.getId()));
+ entry.put("code", rate.getCode());
+ List<TaxRateDescription> descriptions = rate.getDescriptions();
+ String name = "";
+ if(descriptions!=null && descriptions.size()>0) {
+ TaxRateDescription desc = descriptions.get(0);
+ for(TaxRateDescription description : descriptions) {
+ if(description.getLanguage().getCode().equals(language.getCode())) {
+ desc = description;
+ break;
+ }
+ }
+ name = desc.getName();
+ }
+
+ entry.put("name", name);
+ entry.put("priority", rate.getTaxPriority());
+
+ entry.put("piggyback", rate.isPiggyback());
+ entry.put("country", rate.getCountry().getIsoCode());
+ entry.put("taxClass", rate.getTaxClass().getCode());
+
+
+ String zoneCode = rate.getStateProvince();
+ if(rate.getZone()!=null) {
+ zoneCode = rate.getZone().getCode();
+ }
+ entry.put("zone", zoneCode);
+ entry.put("rate", nf.format(rate.getTaxRate()));
+
+ resp.addDataEntry(entry);
+
+ }
+ }
+
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging custom weight based", e);
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ }
+
+ String returnString = resp.toJSONString();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ @PreAuthorize("hasRole('TAX')")
+ @RequestMapping(value="/admin/tax/taxrates/save.html", method=RequestMethod.POST)
+ public String saveTaxRate(@Valid @ModelAttribute("taxRate") TaxRate taxRate, BindingResult result, Model model, HttpServletRequest request, Locale locale) throws Exception {
+
+ setMenu(model, request);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ Language language = (Language)request.getAttribute("LANGUAGE");
+
+ this.validateTaxRate(model, taxRate, result, store, language, locale);
+
+ if (result.hasErrors()) {
+
+ return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxRates;
+
+ }
+
+
+ taxRateService.create(taxRate);
+
+ List<TaxRate> taxRates = taxRateService.listByStore(store);
+
+ model.addAttribute("success","success");
+ model.addAttribute("taxRates", taxRates);
+
+
+
+
+ return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxRates;
+
+ }
+
+
+
+ @PreAuthorize("hasRole('TAX')")
+ @RequestMapping(value="/admin/tax/taxrates/update.html", method=RequestMethod.POST)
+ public String updateTaxRate(@Valid @ModelAttribute("taxRate") TaxRate taxRate, BindingResult result, Model model, HttpServletRequest request, Locale locale) throws Exception {
+
+
+ setMenu(model, request);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ Language language = (Language)request.getAttribute("LANGUAGE");
+
+ this.validateTaxRate(model, taxRate, result, store, language, locale);
+
+ if (result.hasErrors()) {
+
+ return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxRate;
+
+ }
+
+
+ taxRateService.update(taxRate);
+
+ List<TaxRate> taxRates = taxRateService.listByStore(store);
+
+ model.addAttribute("success","success");
+ model.addAttribute("taxRates", taxRates);
+
+
+
+
+ return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxRate;
+
+
+ }
+
+ private void validateTaxRate(Model model, TaxRate taxRate, BindingResult result, MerchantStore store, Language language, Locale locale) throws Exception {
+
+
+
+ List<TaxClass> taxClasses = taxClassService.listByStore(store);
+
+
+ List<Country> countries = countryService.getCountries(language);
+ List<TaxRate> taxRates = taxRateService.listByStore(store);
+
+
+ model.addAttribute("countries", countries);
+ model.addAttribute("taxRates", taxRates);
+ model.addAttribute("taxClasses", taxClasses);
+
+ if(StringUtils.isBlank(taxRate.getRateText())) {
+ FieldError error = new FieldError("taxRate","rateText",messages.getMessage("NotEmpty.taxRate.rateText", locale));
+ result.addError(error);
+ }
+
+ //if(taxRate.isPiggyback() && taxRate.getParent()==null) {
+ //FieldError error = new FieldError("taxRate","piggyback",messages.getMessage("NotNull.taxRate.parent", locale));
+ //result.addError(error);
+ //}
+
+ try {
+ BigDecimal rate = new BigDecimal(taxRate.getRateText());
+ taxRate.setTaxRate(rate);
+ } catch (Exception e) {
+ FieldError error = new FieldError("taxRate","rateText",messages.getMessage("message.invalid.rate", locale));
+ result.addError(error);
+ }
+
+ //check if code exists
+ String taxRateCode = taxRate.getCode();
+ TaxRate tr = taxRateService.getByCode(taxRateCode, store);
+ if(tr!=null) {
+ if(tr.getId().longValue()!=taxRate.getId().longValue()){
+ FieldError error = new FieldError("taxRate","code",messages.getMessage("NotEmpty.taxRate.unique.code", locale));
+ result.addError(error);
+ }
+ }
+
+
+ if(taxRate.getTaxPriority()==null) {
+ taxRate.setTaxPriority(0);
+ }
+
+
+ if(taxRate.getZone()!=null) {
+ Zone z = zoneService.getById(taxRate.getZone().getId());
+ taxRate.setZone(z);
+ }
+
+
+
+ Country c = countryService.getByCode(taxRate.getCountry().getIsoCode());
+
+ taxRate.setCountry(c);
+
+ List<TaxRateDescription> descriptions = taxRate.getDescriptions();
+ for(TaxRateDescription description : descriptions) {
+ description.setTaxRate(taxRate);
+ }
+
+ if(!taxRate.isPiggyback()) {
+ taxRate.setParent(null);
+ }
+
+ return;
+
+ }
+
+
+ @PreAuthorize("hasRole('TAX')")
+ @RequestMapping(value="/admin/tax/taxrates/remove.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> removeTaxRate(HttpServletRequest request, Locale locale) throws Exception {
+
+ //do not remove super admin
+
+ String taxRateId = request.getParameter("taxRateId");
+
+ AjaxResponse resp = new AjaxResponse();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+ try {
+
+
+ /**
+ * In order to remove a User the logged in must be STORE_ADMIN
+ * or SUPER_USER
+ */
+
+
+ if(taxRateId==null){
+ resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ long ltaxRateId;
+ try {
+ ltaxRateId = Long.parseLong(taxRateId);
+ } catch (Exception e) {
+ LOGGER.error("Invalid taxRateId " + taxRateId);
+ resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ TaxRate taxRate = taxRateService.getById(ltaxRateId);
+
+ if(taxRate==null) {
+ LOGGER.error("Invalid taxRateId " + taxRateId);
+ resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+
+
+ taxRateService.delete(taxRate);
+
+ resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
+
+
+
+ } catch (Exception e) {
+ LOGGER.error("Error while deleting tax rate", e);
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+ }
+
+ @PreAuthorize("hasRole('TAX')")
+ @RequestMapping(value="/admin/tax/taxrates/edit.html", method=RequestMethod.GET)
+ public String editTaxRate(@ModelAttribute("id") String id, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ setMenu(model,request);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ Language language = (Language)request.getAttribute("LANGUAGE");
+
+ TaxRate taxRate = null;
+ try {
+ Long taxRateId = Long.parseLong(id);
+ taxRate = taxRateService.getById(taxRateId);
+ } catch (Exception e) {
+ LOGGER.error("Cannot parse taxRateId " + id);
+ return "redirect:/admin/tax/taxrates/list.html";
+ }
+
+ if(taxRate==null || taxRate.getMerchantStore().getId()!=store.getId()) {
+ return "redirect:/admin/tax/taxrates/list.html";
+ }
+
+
+ NumberFormat nf = null;
+
+
+ nf = NumberFormat.getInstance(Locale.US);
+
+ nf.setMaximumFractionDigits(Integer.parseInt(Character
+ .toString(DECIMALCOUNT)));
+ nf.setMinimumFractionDigits(Integer.parseInt(Character
+ .toString(DECIMALCOUNT)));
+
+ taxRate.setRateText(nf.format(taxRate.getTaxRate()));
+
+
+
+ List<TaxClass> taxClasses = taxClassService.listByStore(store);
+
+
+
+ List<Country> countries = countryService.getCountries(language);
+ List<TaxRate> taxRates = taxRateService.listByStore(store);
+
+
+ model.addAttribute("countries", countries);
+ model.addAttribute("taxRates", taxRates);
+ model.addAttribute("taxClasses", taxClasses);
+
+ model.addAttribute("taxRate", taxRate);
+
+ return com.salesmanager.shop.admin.controller.ControllerConstants.Tiles.Tax.taxRate;
+
+
+
+ }
+
+
+
+
+ private void setMenu(Model model, HttpServletRequest request)
+ throws Exception {
+
+ // display menu
+ Map<String, String> activeMenus = new HashMap<String, String>();
+ activeMenus.put("tax", "tax");
+ activeMenus.put("taxrates", "taxrates");
+
+ @SuppressWarnings("unchecked")
+ Map<String, Menu> menus = (Map<String, Menu>) request
+ .getAttribute("MENUMAP");
+
+ Menu currentMenu = (Menu) menus.get("tax");
+ model.addAttribute("currentMenu", currentMenu);
+ model.addAttribute("activeMenus", activeMenus);
+ //
+
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/user/GroupsController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/user/GroupsController.java
index a00cc71..af8eba4 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/user/GroupsController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/user/GroupsController.java
@@ -1,15 +1,16 @@
package com.salesmanager.shop.admin.controller.user;
-import com.salesmanager.core.business.services.reference.country.CountryService;
-import com.salesmanager.core.business.services.reference.language.LanguageService;
-import com.salesmanager.core.business.services.user.GroupService;
-import com.salesmanager.core.business.services.user.PermissionService;
-import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse;
-import com.salesmanager.core.business.utils.ajax.AjaxResponse;
-import com.salesmanager.core.model.user.Group;
-import com.salesmanager.core.model.user.GroupType;
-import com.salesmanager.shop.admin.model.web.Menu;
-import com.salesmanager.shop.utils.LabelUtils;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpHeaders;
@@ -19,18 +20,26 @@ import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
+import com.salesmanager.core.business.services.reference.country.CountryService;
+import com.salesmanager.core.business.services.reference.language.LanguageService;
+import com.salesmanager.core.business.services.user.GroupService;
+import com.salesmanager.core.business.services.user.PermissionService;
+import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse;
+import com.salesmanager.core.business.utils.ajax.AjaxResponse;
+import com.salesmanager.core.model.user.Group;
+import com.salesmanager.core.model.user.GroupType;
+import com.salesmanager.shop.admin.model.permission.GroupDetails;
+import com.salesmanager.shop.admin.model.web.Menu;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.utils.LabelUtils;
@Controller
public class GroupsController {
@@ -58,14 +67,165 @@ public class GroupsController {
@PreAuthorize("hasRole('STORE_ADMIN')")
@RequestMapping(value = "/admin/groups/editGroup.html", method = RequestMethod.GET)
public String displayGroup(@RequestParam("id") Integer groupId, Model model,
- HttpServletRequest request, HttpServletResponse response)
+ Locale locale, HttpServletRequest request, HttpServletResponse response)
throws Exception {
// display menu
setMenu(model, request);
+
+ GroupType[] groupTypes = GroupType.values();
+ List<String> groups = new ArrayList<String>();
+
+ for(GroupType t : groupTypes) {
+ if(GroupType.ADMIN.name() != t.name()) {
+ groups.add(t.name());
+ }
+ }
Group group = groupService.getById(groupId);
+
+ if(group == null) {
+ return "redirect://admin/groups/groups.html";
+
+ }
+
+ GroupDetails groupDetails = new GroupDetails();
+ groupDetails.setGroup(group);
+ groupDetails.setTypes(groups);
+
+
+ model.addAttribute("group", groupDetails);
+
+ return "admin-user-group";
+ }
+
+ @PreAuthorize("hasRole('STORE_ADMIN')")
+ @RequestMapping(value = "/admin/groups/delete.html", method = RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> delete(Model model,
+ Locale locale, HttpServletRequest request, HttpServletResponse response)
+ throws Exception {
+ // display menu
+
+ String sGroupId = request.getParameter("groupId");
+
+ AjaxResponse resp = new AjaxResponse();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+ try {
+
+ Integer groupId = Integer.parseInt(sGroupId);
+ Group group = groupService.getById(groupId);
+
+
+ if(group==null){
+ resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ if(!request.isUserInRole(Constants.GROUP_ADMIN)) {
+ resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ if(GroupType.ADMIN.name().equals(group.getGroupType().name())) {
+ resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ groupService.delete(group);
+
+ resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
+
+
+
+ } catch (Exception e) {
+ LOGGER.error("Error while deleting group", e);
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+
+ }
+
+ @PreAuthorize("hasRole('STORE_ADMIN')")
+ @RequestMapping(value = "/admin/group/save.html", method = RequestMethod.POST)
+ public String save(@Valid @ModelAttribute("group") GroupDetails group, BindingResult result, Locale locale, Model model,
+ HttpServletRequest request, HttpServletResponse response)
+ throws Exception {
+ // display menu
+ setMenu(model, request);
+
+ GroupType[] groupTypes = GroupType.values();
+ List<String> groups = new ArrayList<String>();
+
+ for(GroupType t : groupTypes) {
+ if(GroupType.ADMIN.name() != t.name()) {
+ groups.add(t.name());
+ }
+ }
+
+ //check if already exists
+ Group g = null;
+ if(group.getGroup().getId()!=null) {
+ Group gid = groupService.getById(group.getGroup().getId());
+ if(gid != null && !gid.getGroupName().equals(group.getGroup().getGroupName())) {
+ g = groupService.findByName(group.getGroup().getGroupName());
+ }
+ } else {
+ g = groupService.findByName(group.getGroup().getGroupName());
+ }
+
+ if(g != null) {
+ ObjectError error = new ObjectError("group.groupName", messages.getMessage("message.name.exist", locale));
+ result.addError(error);
+ model.addAttribute("error","error");
+ } else {
+ groupService.save(group.getGroup());
+ model.addAttribute("success","success");
+ }
+
+ GroupDetails groupDetails = new GroupDetails();
+ groupDetails.setGroup(group.getGroup());
+ groupDetails.setTypes(groups);
+
+
+ model.addAttribute("group", groupDetails);
+
+ return "admin-user-group";
+ }
+
+ @PreAuthorize("hasRole('STORE_ADMIN')")
+ @RequestMapping(value = "/admin/groups/new.html", method = RequestMethod.GET)
+ public String displayGroup(Model model,
+ HttpServletRequest request, HttpServletResponse response)
+ throws Exception {
+ // display menu
+ setMenu(model, request);
+
+ GroupType[] groupTypes = GroupType.values();
+ List<String> groups = new ArrayList<String>();
+
+ for(GroupType t : groupTypes) {
+ if(GroupType.ADMIN.name() != t.name()) {
+ groups.add(t.name());
+ }
+ }
+ GroupDetails group = new GroupDetails();
+ Group g = new Group();
+ group.setGroup(g);
+ group.setTypes(groups);
model.addAttribute("group", group);
+
return "admin-user-group";
}
@@ -100,6 +260,7 @@ public class GroupsController {
Map entry = new HashMap();
entry.put("groupId", group.getId());
entry.put("name", group.getGroupName());
+ entry.put("type", group.getGroupType().name());
StringBuilder key = new StringBuilder().append("security.group.description.").append(group.getGroupName());
try {
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/user/LoginController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/user/LoginController.java
index e5dd133..8550bcb 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/user/LoginController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/user/LoginController.java
@@ -1,49 +1,49 @@
-package com.salesmanager.shop.admin.controller.user;
-
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-@Controller
-public class LoginController {
-
-
- @RequestMapping(value="/admin/logon.html", method=RequestMethod.GET)
- public String displayLogin(HttpServletRequest request, HttpServletResponse response) throws Exception {
-
- //WEB-INF/views/admin/logon.jsp
- return "admin/logon";
-
-
- }
-
-
- @RequestMapping(value="/admin/denied.html", method=RequestMethod.GET)
- public String displayDenied(HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
- //logoff the user
- Authentication auth = SecurityContextHolder.getContext().getAuthentication();
- if (auth != null){
- new SecurityContextLogoutHandler().logout(request, response, auth);
- //new PersistentTokenBasedRememberMeServices().logout(request, response, auth);
- }
-
- return "admin/logon";
-
-
- }
-
- @RequestMapping(value="/admin/unauthorized.html", method=RequestMethod.GET)
- public String unauthorized(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
- return "admin/unauthorized";
- }
-
-}
+package com.salesmanager.shop.admin.controller.user;
+
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Controller
+public class LoginController {
+
+
+ @RequestMapping(value="/admin/logon.html", method=RequestMethod.GET)
+ public String displayLogin(HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ //WEB-INF/views/admin/logon.jsp
+ return "admin/logon";
+
+
+ }
+
+
+ @RequestMapping(value="/admin/denied.html", method=RequestMethod.GET)
+ public String displayDenied(HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ //logoff the user
+ Authentication auth = SecurityContextHolder.getContext().getAuthentication();
+ if (auth != null){
+ new SecurityContextLogoutHandler().logout(request, response, auth);
+ //new PersistentTokenBasedRememberMeServices().logout(request, response, auth);
+ }
+
+ return "admin/logon";
+
+
+ }
+
+ @RequestMapping(value="/admin/unauthorized.html", method=RequestMethod.GET)
+ public String unauthorized(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+ return "admin/unauthorized";
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/user/UserController.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/user/UserController.java
index 6185c36..d2d911f 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/user/UserController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/controller/user/UserController.java
@@ -1,871 +1,858 @@
-package com.salesmanager.shop.admin.controller.user;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.modules.email.Email;
-import com.salesmanager.core.business.services.merchant.MerchantStoreService;
-import com.salesmanager.core.business.services.reference.country.CountryService;
-import com.salesmanager.core.business.services.reference.language.LanguageService;
-import com.salesmanager.core.business.services.system.EmailService;
-import com.salesmanager.core.business.services.user.GroupService;
-import com.salesmanager.core.business.services.user.UserService;
-import com.salesmanager.core.business.utils.ajax.AjaxResponse;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.user.Group;
-import com.salesmanager.core.model.user.GroupType;
-import com.salesmanager.core.model.user.User;
-import com.salesmanager.shop.admin.controller.ControllerConstants;
-import com.salesmanager.shop.admin.model.secutity.Password;
-import com.salesmanager.shop.admin.model.userpassword.UserReset;
-import com.salesmanager.shop.admin.model.web.Menu;
-import com.salesmanager.shop.admin.security.SecurityQuestion;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.constants.EmailConstants;
-import com.salesmanager.shop.utils.*;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.BindingResult;
-import org.springframework.validation.ObjectError;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-import javax.validation.Valid;
-import java.util.*;
-
-@Controller
-public class UserController {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(UserController.class);
-
- @Inject
- private LanguageService languageService;
-
- @Inject
- private UserService userService;
-
- @Inject
- private GroupService groupService;
-
- @Inject
- private CountryService countryService;
-
- @Inject
- private EmailService emailService;
-
- @Inject
- private MerchantStoreService merchantStoreService;
-
- @Inject
- LabelUtils messages;
-
- @Inject
- private FilePathUtils filePathUtils;
-
- @Inject
- private EmailUtils emailUtils;
-
- @Inject
- @Named("passwordEncoder")
- private PasswordEncoder passwordEncoder;
-
- private final static String QUESTION_1 = "question1";
- private final static String QUESTION_2 = "question2";
- private final static String QUESTION_3 = "question3";
- private final static String RESET_PASSWORD_TPL = "email_template_password_reset_user.ftl";
- private final static String NEW_USER_TMPL = "email_template_new_user.ftl";
-
- @PreAuthorize("hasRole('STORE_ADMIN')")
- @RequestMapping(value="/admin/users/list.html", method=RequestMethod.GET)
- public String displayUsers(Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- //The users are retrieved from the paging method
- setMenu(model,request);
- return ControllerConstants.Tiles.User.users;
- }
-
- /**
- * Displays a list of users that can be managed by admins
- * @param request
- * @param response
- * @return
- */
- @SuppressWarnings("unchecked")
- @PreAuthorize("hasRole('STORE_ADMIN')")
- @RequestMapping(value = "/admin/users/paging.html", method = RequestMethod.POST)
- public @ResponseBody
- ResponseEntity<String> pageUsers(HttpServletRequest request,
- HttpServletResponse response) {
-
- AjaxResponse resp = new AjaxResponse();
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- String sCurrentUser = request.getRemoteUser();
-
-
- try {
-
- User currentUser = userService.getByUserName(sCurrentUser);
- List<User> users = null;
- if(UserUtils.userInGroup(currentUser, Constants.GROUP_SUPERADMIN) ) {
- users = userService.listUser();
- } else {
- users = userService.listByStore(store);
- }
-
-
- for (User user : users) {
-
- if(!UserUtils.userInGroup(user, Constants.GROUP_SUPERADMIN)) {
-
- if(!currentUser.equals(user.getAdminName())){
-
- @SuppressWarnings("rawtypes")
- Map entry = new HashMap();
- entry.put("userId", user.getId());
- entry.put("name", user.getFirstName() + " " + user.getLastName());
- entry.put("email", user.getAdminEmail());
- entry.put("active", user.isActive());
- resp.addDataEntry(entry);
-
- }
- }
- }
-
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
-
- } catch (Exception e) {
- LOGGER.error("Error while paging products", e);
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,HttpStatus.OK);
- }
-
- @PreAuthorize("hasRole('AUTH')")
- @RequestMapping(value="/admin/users/password.html", method=RequestMethod.GET)
- public String displayChangePassword(Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
- setMenu(model,request);
- String userName = request.getRemoteUser();
- User user = userService.getByUserName(userName);
-
- Password password = new Password();
- password.setUser(user);
-
- model.addAttribute("password",password);
- model.addAttribute("user",user);
- return ControllerConstants.Tiles.User.password;
- }
-
-
- @PreAuthorize("hasRole('AUTH')")
- @RequestMapping(value="/admin/users/savePassword.html", method=RequestMethod.POST)
- public String changePassword(@ModelAttribute("password") Password password, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
- setMenu(model,request);
- String userName = request.getRemoteUser();
- User dbUser = userService.getByUserName(userName);
-
-
- if(password.getUser().getId().longValue()!= dbUser.getId().longValue()) {
- return "redirect:/admin/users/displayUser.html";
- }
-
- //validate password not empty
- if(StringUtils.isBlank(password.getPassword())) {
- ObjectError error = new ObjectError("password",new StringBuilder().append(messages.getMessage("label.generic.password", locale)).append(" ").append(messages.getMessage("message.cannot.empty", locale)).toString());
- result.addError(error);
- return ControllerConstants.Tiles.User.password;
- }
-
- if(!passwordEncoder.matches(password.getPassword(), dbUser.getAdminPassword())) {
- ObjectError error = new ObjectError("password",messages.getMessage("message.password.invalid", locale));
- result.addError(error);
- return ControllerConstants.Tiles.User.password;
- }
-
-
- if(StringUtils.isBlank(password.getNewPassword())) {
- ObjectError error = new ObjectError("newPassword",new StringBuilder().append(messages.getMessage("label.generic.newpassword", locale)).append(" ").append(messages.getMessage("message.cannot.empty", locale)).toString());
- result.addError(error);
- }
-
- if(StringUtils.isBlank(password.getRepeatPassword())) {
- ObjectError error = new ObjectError("newPasswordAgain",new StringBuilder().append(messages.getMessage("label.generic.newpassword.repeat", locale)).append(" ").append(messages.getMessage("message.cannot.empty", locale)).toString());
- result.addError(error);
- }
-
- if(!password.getRepeatPassword().equals(password.getNewPassword())) {
- ObjectError error = new ObjectError("newPasswordAgain",messages.getMessage("message.password.different", locale));
- result.addError(error);
- }
-
- if(password.getNewPassword().length()<6) {
- ObjectError error = new ObjectError("newPassword",messages.getMessage("message.password.length", locale));
- result.addError(error);
- }
-
- if (result.hasErrors()) {
- return ControllerConstants.Tiles.User.password;
- }
-
-
-
- String pass = passwordEncoder.encode(password.getNewPassword());
- dbUser.setAdminPassword(pass);
- userService.update(dbUser);
-
- model.addAttribute("success","success");
- return ControllerConstants.Tiles.User.password;
- }
-
- @PreAuthorize("hasRole('STORE_ADMIN')")
- @RequestMapping(value="/admin/users/createUser.html", method=RequestMethod.GET)
- public String displayUserCreate(Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
- return displayUser(null,model,request,response,locale);
- }
-
-
- /**
- * From user list
- * @param id
- * @param model
- * @param request
- * @param response
- * @param locale
- * @return
- * @throws Exception
- */
- @PreAuthorize("hasRole('AUTH')")
- @RequestMapping(value="/admin/users/displayStoreUser.html", method=RequestMethod.GET)
- public String displayUserEdit(@ModelAttribute("id") Long id, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- User dbUser = userService.getById(id);
-
- if(dbUser==null) {
- LOGGER.info("User is null for id " + id);
- return "redirect://admin/users/list.html";
- }
-
-
- return displayUser(dbUser,model,request,response,locale);
-
- }
-
- /**
- * From user profile
- * @param model
- * @param request
- * @param response
- * @param locale
- * @return
- * @throws Exception
- */
- @PreAuthorize("hasRole('AUTH')")
- @RequestMapping(value="/admin/users/displayUser.html", method=RequestMethod.GET)
- public String displayUserEdit(Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
-
- String userName = request.getRemoteUser();
- User user = userService.getByUserName(userName);
- return displayUser(user,model,request,response,locale);
-
- }
-
- private void populateUserObjects(User user, MerchantStore store, Model model, Locale locale) throws Exception {
-
- //get groups
- List<Group> groups = new ArrayList<Group>();
- List<Group> userGroups = groupService.listGroup(GroupType.ADMIN);
- for(Group group : userGroups) {
- if(!group.getGroupName().equals(Constants.GROUP_SUPERADMIN)) {
- groups.add(group);
- }
- }
-
-
- List<MerchantStore> stores = new ArrayList<MerchantStore>();
- //stores.add(store);
- stores = merchantStoreService.list();
-
- //String remoteUser = request.getRemoteUser();
-
-/* if(user!=null && user.getId()!=null) {
- User logedInUser = userService.getByUserName(user.getAdminName());
-
- //check groups
- List<Group> logedInUserGroups = logedInUser.getGroups();
- for(Group group : logedInUserGroups) {
- if(group.getGroupName().equals(Constants.GROUP_SUPERADMIN)) {
- stores = merchantStoreService.list();
- }
- }
- }*/
-
- //questions
- List<SecurityQuestion> questions = new ArrayList<SecurityQuestion>();
-
- SecurityQuestion question = new SecurityQuestion();
- question.setId("1");
- question.setLabel(messages.getMessage("security.question.1", locale));
- questions.add(question);
-
- question = new SecurityQuestion();
- question.setId("2");
- question.setLabel(messages.getMessage("security.question.2", locale));
- questions.add(question);
-
- question = new SecurityQuestion();
- question.setId("3");
- question.setLabel(messages.getMessage("security.question.3", locale));
- questions.add(question);
-
- question = new SecurityQuestion();
- question.setId("4");
- question.setLabel(messages.getMessage("security.question.4", locale));
- questions.add(question);
-
- question = new SecurityQuestion();
- question.setId("5");
- question.setLabel(messages.getMessage("security.question.5", locale));
- questions.add(question);
-
- question = new SecurityQuestion();
- question.setId("6");
- question.setLabel(messages.getMessage("security.question.6", locale));
- questions.add(question);
-
- question = new SecurityQuestion();
- question.setId("7");
- question.setLabel(messages.getMessage("security.question.7", locale));
- questions.add(question);
-
- question = new SecurityQuestion();
- question.setId("8");
- question.setLabel(messages.getMessage("security.question.8", locale));
- questions.add(question);
-
- question = new SecurityQuestion();
- question.setId("9");
- question.setLabel(messages.getMessage("security.question.9", locale));
- questions.add(question);
-
- model.addAttribute("questions", questions);
- model.addAttribute("stores", stores);
- model.addAttribute("languages", store.getLanguages());
- model.addAttribute("groups", groups);
-
-
- }
-
-
-
- private String displayUser(User user, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
-
- //display menu
- setMenu(model,request);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
-
-
-
- if(user==null) {
- user = new User();
- } else {
- user.setAdminPassword("TRANSIENT");
- }
-
- this.populateUserObjects(user, store, model, locale);
-
-
- model.addAttribute("user", user);
-
-
-
- return ControllerConstants.Tiles.User.profile;
- }
-
- @PreAuthorize("hasRole('AUTH')")
- @RequestMapping(value="/admin/users/checkUserCode.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> checkUserCode(HttpServletRequest request, HttpServletResponse response, Locale locale) {
- String code = request.getParameter("code");
- String id = request.getParameter("id");
-
- AjaxResponse resp = new AjaxResponse();
-
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
-
- try {
-
- if(StringUtils.isBlank(code)) {
- resp.setStatus(AjaxResponse.CODE_ALREADY_EXIST);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- User user = userService.getByUserName(code);
-
-
- if(!StringUtils.isBlank(id)&& user!=null) {
- try {
- Long lid = Long.parseLong(id);
-
- if(user.getAdminName().equals(code) && user.getId()==lid) {
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
- } catch (Exception e) {
- resp.setStatus(AjaxResponse.CODE_ALREADY_EXIST);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- }
-
-
- if(StringUtils.isBlank(code)) {
- resp.setStatus(AjaxResponse.CODE_ALREADY_EXIST);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- if(user!=null) {
- resp.setStatus(AjaxResponse.CODE_ALREADY_EXIST);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
-
- } catch (Exception e) {
- LOGGER.error("Error while getting user", e);
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
-
- }
-
- @PreAuthorize("hasRole('AUTH')")
- @RequestMapping(value="/admin/users/save.html", method=RequestMethod.POST)
- public String saveUser(@Valid @ModelAttribute("user") User user, BindingResult result, Model model, HttpServletRequest request, Locale locale) throws Exception {
-
-
- setMenu(model,request);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
-
- this.populateUserObjects(user, store, model, locale);
-
- Language language = user.getDefaultLanguage();
-
- Language l = languageService.getById(language.getId());
-
- user.setDefaultLanguage(l);
-
- Locale userLocale = LocaleUtils.getLocale(l);
-
-
-
- User dbUser = null;
-
- //edit mode, need to get original user important information
- if(user.getId()!=null) {
- dbUser = userService.getByUserName(user.getAdminName());
- if(dbUser==null) {
- return "redirect://admin/users/displayUser.html";
- }
- }
-
- List<Group> submitedGroups = user.getGroups();
- Set<Integer> ids = new HashSet<Integer>();
- for(Group group : submitedGroups) {
- ids.add(Integer.parseInt(group.getGroupName()));
- }
-
-
-
- //validate security questions not empty
- if(StringUtils.isBlank(user.getAnswer1())) {
- ObjectError error = new ObjectError("answer1",messages.getMessage("security.answer.question1.message", locale));
- result.addError(error);
- }
-
- if(StringUtils.isBlank(user.getAnswer2())) {
- ObjectError error = new ObjectError("answer2",messages.getMessage("security.answer.question2.message", locale));
- result.addError(error);
- }
-
- if(StringUtils.isBlank(user.getAnswer3())) {
- ObjectError error = new ObjectError("answer3",messages.getMessage("security.answer.question3.message", locale));
- result.addError(error);
- }
-
- if(user.getQuestion1().equals(user.getQuestion2()) || user.getQuestion1().equals(user.getQuestion3())
- || user.getQuestion2().equals(user.getQuestion1()) || user.getQuestion1().equals(user.getQuestion3())
- || user.getQuestion3().equals(user.getQuestion1()) || user.getQuestion1().equals(user.getQuestion2()))
-
-
- {
- ObjectError error = new ObjectError("question1",messages.getMessage("security.questions.differentmessages", locale));
- result.addError(error);
- }
-
-
- Group superAdmin = null;
-
- if(user.getId()!=null && user.getId()>0) {
- if(user.getId().longValue()!=dbUser.getId().longValue()) {
- return "redirect://admin/users/displayUser.html";
- }
-
- List<Group> groups = dbUser.getGroups();
- //boolean removeSuperAdmin = true;
- for(Group group : groups) {
- //can't revoke super admin
- if(group.getGroupName().equals("SUPERADMIN")) {
- superAdmin = group;
- }
- }
-
- } else {
-
- if(user.getAdminPassword().length()<6) {
- ObjectError error = new ObjectError("adminPassword",messages.getMessage("message.password.length", locale));
- result.addError(error);
- }
-
- }
-
- if(superAdmin!=null) {
- ids.add(superAdmin.getId());
- }
-
-
- List<Group> newGroups = groupService.listGroupByIds(ids);
-
- //set actual user groups
- user.setGroups(newGroups);
-
- if (result.hasErrors()) {
- return ControllerConstants.Tiles.User.profile;
- }
-
- String decodedPassword = user.getAdminPassword();
- if(user.getId()!=null && user.getId()>0) {
- user.setAdminPassword(dbUser.getAdminPassword());
- } else {
- String encoded = passwordEncoder.encode(user.getAdminPassword());
- user.setAdminPassword(encoded);
- }
-
-
- if(user.getId()==null || user.getId().longValue()==0) {
-
- //save or update user
- userService.saveOrUpdate(user);
-
- try {
-
- //creation of a user, send an email
- String userName = user.getFirstName();
- if(StringUtils.isBlank(userName)) {
- userName = user.getAdminName();
- }
- String[] userNameArg = {userName};
-
-
- Map<String, String> templateTokens = emailUtils.createEmailObjectsMap(request.getContextPath(), store, messages, userLocale);
- templateTokens.put(EmailConstants.EMAIL_NEW_USER_TEXT, messages.getMessage("email.greeting", userNameArg, userLocale));
- templateTokens.put(EmailConstants.EMAIL_USER_FIRSTNAME, user.getFirstName());
- templateTokens.put(EmailConstants.EMAIL_USER_LASTNAME, user.getLastName());
- templateTokens.put(EmailConstants.EMAIL_ADMIN_USERNAME_LABEL, messages.getMessage("label.generic.username",userLocale));
- templateTokens.put(EmailConstants.EMAIL_ADMIN_NAME, user.getAdminName());
- templateTokens.put(EmailConstants.EMAIL_TEXT_NEW_USER_CREATED, messages.getMessage("email.newuser.text",userLocale));
- templateTokens.put(EmailConstants.EMAIL_ADMIN_PASSWORD_LABEL, messages.getMessage("label.generic.password",userLocale));
- templateTokens.put(EmailConstants.EMAIL_ADMIN_PASSWORD, decodedPassword);
- templateTokens.put(EmailConstants.EMAIL_ADMIN_URL_LABEL, messages.getMessage("label.adminurl",userLocale));
- templateTokens.put(EmailConstants.EMAIL_ADMIN_URL, filePathUtils.buildAdminUri(store, request));
-
-
- Email email = new Email();
- email.setFrom(store.getStorename());
- email.setFromEmail(store.getStoreEmailAddress());
- email.setSubject(messages.getMessage("email.newuser.title",userLocale));
- email.setTo(user.getAdminEmail());
- email.setTemplateName(NEW_USER_TMPL);
- email.setTemplateTokens(templateTokens);
-
-
-
- emailService.sendHtmlEmail(store, email);
-
- } catch (Exception e) {
- LOGGER.error("Cannot send email to user",e);
- }
-
- } else {
- //save or update user
- userService.saveOrUpdate(user);
- }
-
- model.addAttribute("success","success");
- return ControllerConstants.Tiles.User.profile;
- }
-
- @PreAuthorize("hasRole('AUTH')")
- @RequestMapping(value="/admin/users/remove.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> removeUser(HttpServletRequest request, Locale locale) throws Exception {
-
- //do not remove super admin
-
- String sUserId = request.getParameter("userId");
-
- AjaxResponse resp = new AjaxResponse();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
-
- String userName = request.getRemoteUser();
- User remoteUser = userService.getByUserName(userName);
-
-
- try {
-
- Long userId = Long.parseLong(sUserId);
- User user = userService.getById(userId);
-
- /**
- * In order to remove a User the logged in ser must be STORE_ADMIN
- * or SUPER_USER
- */
-
-
- if(user==null){
- resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- if(!request.isUserInRole(Constants.GROUP_ADMIN)) {
- resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
- //check if the user removed has group ADMIN
- boolean isAdmin = false;
- if(UserUtils.userInGroup(remoteUser, Constants.GROUP_ADMIN) || UserUtils.userInGroup(remoteUser, Constants.GROUP_SUPERADMIN)) {
- isAdmin = true;
- }
-
-
- if(!isAdmin) {
- resp.setStatusMessage(messages.getMessage("message.security.caanotremovesuperadmin", locale));
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- userService.delete(user);
-
- resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
-
-
-
- } catch (Exception e) {
- LOGGER.error("Error while deleting product price", e);
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- resp.setErrorMessage(e);
- }
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
-
- }
-
-
- private void setMenu(Model model, HttpServletRequest request) throws Exception {
-
- //display menu
- Map<String,String> activeMenus = new HashMap<String,String>();
- activeMenus.put("profile", "profile");
- activeMenus.put("user", "create-user");
-
- @SuppressWarnings("unchecked")
- Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
-
- Menu currentMenu = (Menu)menus.get("profile");
- model.addAttribute("currentMenu",currentMenu);
- model.addAttribute("activeMenus",activeMenus);
- //
-
- }
-
- //password reset functionality --- Sajid Shajahan
- @RequestMapping(value="/admin/users/resetPassword.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> resetPassword(HttpServletRequest request, HttpServletResponse response, Locale locale) {
-
- AjaxResponse resp = new AjaxResponse();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
-
- String userName = request.getParameter("username");
-
-
-
- /**
- * Get User with userService.getByUserName
- * Get 3 security questions from User.getQuestion1, user.getQuestion2, user.getQuestion3
- */
-
- HttpSession session = request.getSession();
- session.setAttribute("username_reset", userName);
-
- try {
- if(!StringUtils.isBlank(userName)){
-
- User dbUser = userService.getByUserName(userName);
-
- if(dbUser==null) {
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- resp.setStatusMessage(messages.getMessage("message.username.notfound", locale));
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- Map<String,String> entry = new HashMap<String,String>();
- entry.put(QUESTION_1, dbUser.getQuestion1());
- entry.put(QUESTION_2, dbUser.getQuestion2());
- entry.put(QUESTION_3, dbUser.getQuestion3());
- resp.addDataEntry(entry);
- resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
-
- }else
- {
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- resp.setStatusMessage(messages.getMessage("User.resetPassword.Error", locale));
-
- }
- } catch (Exception e) {
- e.printStackTrace();
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- resp.setStatusMessage(messages.getMessage("User.resetPassword.Error", locale));
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
-
-
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
- //password reset functionality --- Sajid Shajahan
- @RequestMapping(value="/admin/users/resetPasswordSecurityQtn.html", method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> resetPasswordSecurityQtn(@ModelAttribute(value="userReset") UserReset userReset,HttpServletRequest request, HttpServletResponse response, Locale locale) {
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- Language userLanguage = null;
- Locale userLocale = null;
- AjaxResponse resp = new AjaxResponse();
-
-
- String answer1 = request.getParameter("answer1");
- String answer2 = request.getParameter("answer2");
- String answer3 = request.getParameter("answer3");
-
- try {
-
- HttpSession session = request.getSession();
- User dbUser = userService.getByUserName((String) session.getAttribute("username_reset"));
-
- if(dbUser!= null){
-
- if(dbUser.getAnswer1().equals(answer1.trim()) && dbUser.getAnswer2().equals(answer2.trim()) && dbUser.getAnswer3().equals(answer3.trim())){
- userLanguage = dbUser.getDefaultLanguage();
- userLocale = LocaleUtils.getLocale(userLanguage);
-
- String tempPass = userReset.generateRandomString();
- String pass = passwordEncoder.encode(tempPass);
-
- dbUser.setAdminPassword(pass);
- userService.update(dbUser);
-
- //send email
-
- try {
- String[] storeEmail = {store.getStoreEmailAddress()};
-
- Map<String, String> templateTokens = emailUtils.createEmailObjectsMap(request.getContextPath(), store, messages, userLocale);
- templateTokens.put(EmailConstants.EMAIL_RESET_PASSWORD_TXT, messages.getMessage("email.user.resetpassword.text", userLocale));
- templateTokens.put(EmailConstants.EMAIL_CONTACT_OWNER, messages.getMessage("email.contactowner", storeEmail, userLocale));
- templateTokens.put(EmailConstants.EMAIL_PASSWORD_LABEL, messages.getMessage("label.generic.password",userLocale));
- templateTokens.put(EmailConstants.EMAIL_USER_PASSWORD, tempPass);
-
- Email email = new Email();
- email.setFrom(store.getStorename());
- email.setFromEmail(store.getStoreEmailAddress());
- email.setSubject(messages.getMessage("label.generic.changepassword",userLocale));
- email.setTo(dbUser.getAdminEmail() );
- email.setTemplateName(RESET_PASSWORD_TPL);
- email.setTemplateTokens(templateTokens);
-
- emailService.sendHtmlEmail(store, email);
-
- } catch (Exception e) {
- LOGGER.error("Cannot send email to user",e);
- }
-
- resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
- resp.setStatusMessage(messages.getMessage("User.resetPassword.resetSuccess", locale));
- }
- else{
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- resp.setStatusMessage(messages.getMessage("User.resetPassword.wrongSecurityQtn", locale));
-
- }
- }else{
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- resp.setStatusMessage(messages.getMessage("User.resetPassword.userNotFound", locale));
-
- }
-
- } catch (ServiceException e) {
- e.printStackTrace();
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- resp.setStatusMessage(messages.getMessage("User.resetPassword.Error", locale));
- }
-
- String returnString = resp.toJSONString();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- }
+package com.salesmanager.shop.admin.controller.user;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.modules.email.Email;
+import com.salesmanager.core.business.services.merchant.MerchantStoreService;
+import com.salesmanager.core.business.services.reference.country.CountryService;
+import com.salesmanager.core.business.services.reference.language.LanguageService;
+import com.salesmanager.core.business.services.system.EmailService;
+import com.salesmanager.core.business.services.user.GroupService;
+import com.salesmanager.core.business.services.user.UserService;
+import com.salesmanager.core.business.utils.ajax.AjaxResponse;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.user.Group;
+import com.salesmanager.core.model.user.GroupType;
+import com.salesmanager.core.model.user.User;
+import com.salesmanager.shop.admin.controller.ControllerConstants;
+import com.salesmanager.shop.admin.model.secutity.Password;
+import com.salesmanager.shop.admin.model.userpassword.UserReset;
+import com.salesmanager.shop.admin.model.web.Menu;
+import com.salesmanager.shop.admin.security.SecurityQuestion;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.constants.EmailConstants;
+import com.salesmanager.shop.utils.*;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import javax.validation.Valid;
+import java.util.*;
+
+@Controller
+public class UserController {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(UserController.class);
+
+ @Inject
+ private LanguageService languageService;
+
+ @Inject
+ private UserService userService;
+
+ @Inject
+ private GroupService groupService;
+
+ @Inject
+ private CountryService countryService;
+
+ @Inject
+ private EmailService emailService;
+
+ @Inject
+ private MerchantStoreService merchantStoreService;
+
+ @Inject
+ LabelUtils messages;
+
+ @Inject
+ private FilePathUtils filePathUtils;
+
+ @Inject
+ private EmailUtils emailUtils;
+
+ @Inject
+ @Named("passwordEncoder")
+ private PasswordEncoder passwordEncoder;
+
+ private final static String QUESTION_1 = "question1";
+ private final static String QUESTION_2 = "question2";
+ private final static String QUESTION_3 = "question3";
+ private final static String RESET_PASSWORD_TPL = "email_template_password_reset_user.ftl";
+ private final static String NEW_USER_TMPL = "email_template_new_user.ftl";
+
+ @PreAuthorize("hasRole('STORE_ADMIN')")
+ @RequestMapping(value="/admin/users/list.html", method=RequestMethod.GET)
+ public String displayUsers(Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ //The users are retrieved from the paging method
+ setMenu(model,request);
+ return ControllerConstants.Tiles.User.users;
+ }
+
+ /**
+ * Displays a list of users that can be managed by admins
+ * @param request
+ * @param response
+ * @return
+ */
+ @SuppressWarnings("unchecked")
+ @PreAuthorize("hasRole('STORE_ADMIN')")
+ @RequestMapping(value = "/admin/users/paging.html", method = RequestMethod.POST)
+ public @ResponseBody
+ ResponseEntity<String> pageUsers(HttpServletRequest request,
+ HttpServletResponse response) {
+
+ AjaxResponse resp = new AjaxResponse();
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ String sCurrentUser = request.getRemoteUser();
+
+
+ try {
+
+ User currentUser = userService.getByUserName(sCurrentUser);
+ List<User> users = null;
+ if(UserUtils.userInGroup(currentUser, Constants.GROUP_SUPERADMIN) ) {
+ users = userService.listUser();
+ } else {
+ users = userService.listByStore(store);
+ }
+
+
+ for (User user : users) {
+
+ if(!UserUtils.userInGroup(user, Constants.GROUP_SUPERADMIN)) {
+
+ if(!currentUser.equals(user.getAdminName())){
+
+ @SuppressWarnings("rawtypes")
+ Map entry = new HashMap();
+ entry.put("userId", user.getId());
+ entry.put("name", user.getFirstName() + " " + user.getLastName());
+ entry.put("email", user.getAdminEmail());
+ entry.put("active", user.isActive());
+ resp.addDataEntry(entry);
+
+ }
+ }
+ }
+
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while paging products", e);
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,HttpStatus.OK);
+ }
+
+ @PreAuthorize("hasRole('AUTH')")
+ @RequestMapping(value="/admin/users/password.html", method=RequestMethod.GET)
+ public String displayChangePassword(Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+ setMenu(model,request);
+ String userName = request.getRemoteUser();
+ User user = userService.getByUserName(userName);
+
+ Password password = new Password();
+ password.setUser(user);
+
+ model.addAttribute("password",password);
+ model.addAttribute("user",user);
+ return ControllerConstants.Tiles.User.password;
+ }
+
+
+ @PreAuthorize("hasRole('AUTH')")
+ @RequestMapping(value="/admin/users/savePassword.html", method=RequestMethod.POST)
+ public String changePassword(@ModelAttribute("password") Password password, BindingResult result, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+ setMenu(model,request);
+ String userName = request.getRemoteUser();
+ User dbUser = userService.getByUserName(userName);
+
+
+ if(password.getUser().getId().longValue()!= dbUser.getId().longValue()) {
+ return "redirect:/admin/users/displayUser.html";
+ }
+
+ //validate password not empty
+ if(StringUtils.isBlank(password.getPassword())) {
+ ObjectError error = new ObjectError("password",new StringBuilder().append(messages.getMessage("label.generic.password", locale)).append(" ").append(messages.getMessage("message.cannot.empty", locale)).toString());
+ result.addError(error);
+ return ControllerConstants.Tiles.User.password;
+ }
+
+ if(!passwordEncoder.matches(password.getPassword(), dbUser.getAdminPassword())) {
+ ObjectError error = new ObjectError("password",messages.getMessage("message.password.invalid", locale));
+ result.addError(error);
+ return ControllerConstants.Tiles.User.password;
+ }
+
+
+ if(StringUtils.isBlank(password.getNewPassword())) {
+ ObjectError error = new ObjectError("newPassword",new StringBuilder().append(messages.getMessage("label.generic.newpassword", locale)).append(" ").append(messages.getMessage("message.cannot.empty", locale)).toString());
+ result.addError(error);
+ }
+
+ if(StringUtils.isBlank(password.getRepeatPassword())) {
+ ObjectError error = new ObjectError("newPasswordAgain",new StringBuilder().append(messages.getMessage("label.generic.newpassword.repeat", locale)).append(" ").append(messages.getMessage("message.cannot.empty", locale)).toString());
+ result.addError(error);
+ }
+
+ if(!password.getRepeatPassword().equals(password.getNewPassword())) {
+ ObjectError error = new ObjectError("newPasswordAgain",messages.getMessage("message.password.different", locale));
+ result.addError(error);
+ }
+
+ if(password.getNewPassword().length()<6) {
+ ObjectError error = new ObjectError("newPassword",messages.getMessage("message.password.length", locale));
+ result.addError(error);
+ }
+
+ if (result.hasErrors()) {
+ return ControllerConstants.Tiles.User.password;
+ }
+
+
+
+ String pass = passwordEncoder.encode(password.getNewPassword());
+ dbUser.setAdminPassword(pass);
+ userService.update(dbUser);
+
+ model.addAttribute("success","success");
+ return ControllerConstants.Tiles.User.password;
+ }
+
+ @PreAuthorize("hasRole('STORE_ADMIN')")
+ @RequestMapping(value="/admin/users/createUser.html", method=RequestMethod.GET)
+ public String displayUserCreate(Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+ return displayUser(null,model,request,response,locale);
+ }
+
+
+ /**
+ * From user list
+ * @param id
+ * @param model
+ * @param request
+ * @param response
+ * @param locale
+ * @return
+ * @throws Exception
+ */
+ @PreAuthorize("hasRole('AUTH')")
+ @RequestMapping(value="/admin/users/displayStoreUser.html", method=RequestMethod.GET)
+ public String displayUserEdit(@ModelAttribute("id") Long id, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ User dbUser = userService.getById(id);
+
+ if(dbUser==null) {
+ LOGGER.info("User is null for id " + id);
+ return "redirect://admin/users/list.html";
+ }
+
+
+ return displayUser(dbUser,model,request,response,locale);
+
+ }
+
+ /**
+ * From user profile
+ * @param model
+ * @param request
+ * @param response
+ * @param locale
+ * @return
+ * @throws Exception
+ */
+ @PreAuthorize("hasRole('AUTH')")
+ @RequestMapping(value="/admin/users/displayUser.html", method=RequestMethod.GET)
+ public String displayUserEdit(Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+
+ String userName = request.getRemoteUser();
+ User user = userService.getByUserName(userName);
+ return displayUser(user,model,request,response,locale);
+
+ }
+
+ private void populateUserObjects(User user, MerchantStore store, Model model, Locale locale) throws Exception {
+
+ //get groups
+ List<Group> groups = new ArrayList<Group>();
+ List<Group> userGroups = groupService.listGroup(GroupType.ADMIN);
+ for(Group group : userGroups) {
+ if(!group.getGroupName().equals(Constants.GROUP_SUPERADMIN)) {
+ groups.add(group);
+ }
+ }
+
+
+ List<MerchantStore> stores = new ArrayList<MerchantStore>();
+ //stores.add(store);
+ stores = merchantStoreService.list();
+
+
+ //questions
+ List<SecurityQuestion> questions = new ArrayList<SecurityQuestion>();
+
+ SecurityQuestion question = new SecurityQuestion();
+ question.setId("1");
+ question.setLabel(messages.getMessage("security.question.1", locale));
+ questions.add(question);
+
+ question = new SecurityQuestion();
+ question.setId("2");
+ question.setLabel(messages.getMessage("security.question.2", locale));
+ questions.add(question);
+
+ question = new SecurityQuestion();
+ question.setId("3");
+ question.setLabel(messages.getMessage("security.question.3", locale));
+ questions.add(question);
+
+ question = new SecurityQuestion();
+ question.setId("4");
+ question.setLabel(messages.getMessage("security.question.4", locale));
+ questions.add(question);
+
+ question = new SecurityQuestion();
+ question.setId("5");
+ question.setLabel(messages.getMessage("security.question.5", locale));
+ questions.add(question);
+
+ question = new SecurityQuestion();
+ question.setId("6");
+ question.setLabel(messages.getMessage("security.question.6", locale));
+ questions.add(question);
+
+ question = new SecurityQuestion();
+ question.setId("7");
+ question.setLabel(messages.getMessage("security.question.7", locale));
+ questions.add(question);
+
+ question = new SecurityQuestion();
+ question.setId("8");
+ question.setLabel(messages.getMessage("security.question.8", locale));
+ questions.add(question);
+
+ question = new SecurityQuestion();
+ question.setId("9");
+ question.setLabel(messages.getMessage("security.question.9", locale));
+ questions.add(question);
+
+ model.addAttribute("questions", questions);
+ model.addAttribute("stores", stores);
+ model.addAttribute("languages", store.getLanguages());
+ model.addAttribute("groups", groups);
+
+
+ }
+
+
+
+ private String displayUser(User user, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+
+ //display menu
+ setMenu(model,request);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+
+
+
+ if(user==null) {
+ user = new User();
+ } else {
+ user.setAdminPassword("TRANSIENT");
+ }
+
+ this.populateUserObjects(user, store, model, locale);
+
+
+ model.addAttribute("user", user);
+
+
+
+ return ControllerConstants.Tiles.User.profile;
+ }
+
+ @PreAuthorize("hasRole('AUTH')")
+ @RequestMapping(value="/admin/users/checkUserCode.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> checkUserCode(HttpServletRequest request, HttpServletResponse response, Locale locale) {
+ String code = request.getParameter("code");
+ String id = request.getParameter("id");
+
+ AjaxResponse resp = new AjaxResponse();
+
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+ try {
+
+ if(StringUtils.isBlank(code)) {
+ resp.setStatus(AjaxResponse.CODE_ALREADY_EXIST);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ User user = userService.getByUserName(code);
+
+
+ if(!StringUtils.isBlank(id)&& user!=null) {
+ try {
+ Long lid = Long.parseLong(id);
+
+ if(user.getAdminName().equals(code) && user.getId()==lid) {
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+ } catch (Exception e) {
+ resp.setStatus(AjaxResponse.CODE_ALREADY_EXIST);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ }
+
+
+ if(StringUtils.isBlank(code)) {
+ resp.setStatus(AjaxResponse.CODE_ALREADY_EXIST);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ if(user!=null) {
+ resp.setStatus(AjaxResponse.CODE_ALREADY_EXIST);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while getting user", e);
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+ }
+
+ @PreAuthorize("hasRole('AUTH')")
+ @RequestMapping(value="/admin/users/save.html", method=RequestMethod.POST)
+ public String saveUser(@Valid @ModelAttribute("user") User user, BindingResult result, Model model, HttpServletRequest request, Locale locale) throws Exception {
+
+
+ setMenu(model,request);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+
+ this.populateUserObjects(user, store, model, locale);
+
+ Language language = user.getDefaultLanguage();
+
+ Language l = languageService.getById(language.getId());
+
+ user.setDefaultLanguage(l);
+
+ Locale userLocale = LocaleUtils.getLocale(l);
+
+
+
+ User dbUser = null;
+
+ //edit mode, need to get original user important information
+ if(user.getId()!=null) {
+ dbUser = userService.getByUserName(user.getAdminName());
+ if(dbUser==null) {
+ return "redirect://admin/users/displayUser.html";
+ }
+ }
+
+ List<Group> submitedGroups = user.getGroups();
+ Set<Integer> ids = new HashSet<Integer>();
+ for(Group group : submitedGroups) {
+ ids.add(Integer.parseInt(group.getGroupName()));
+ }
+
+
+
+ //validate security questions not empty
+ if(StringUtils.isBlank(user.getAnswer1())) {
+ ObjectError error = new ObjectError("answer1",messages.getMessage("security.answer.question1.message", locale));
+ result.addError(error);
+ }
+
+ if(StringUtils.isBlank(user.getAnswer2())) {
+ ObjectError error = new ObjectError("answer2",messages.getMessage("security.answer.question2.message", locale));
+ result.addError(error);
+ }
+
+ if(StringUtils.isBlank(user.getAnswer3())) {
+ ObjectError error = new ObjectError("answer3",messages.getMessage("security.answer.question3.message", locale));
+ result.addError(error);
+ }
+
+ if(user.getQuestion1().equals(user.getQuestion2()) || user.getQuestion1().equals(user.getQuestion3())
+ || user.getQuestion2().equals(user.getQuestion1()) || user.getQuestion1().equals(user.getQuestion3())
+ || user.getQuestion3().equals(user.getQuestion1()) || user.getQuestion1().equals(user.getQuestion2()))
+
+
+ {
+ ObjectError error = new ObjectError("question1",messages.getMessage("security.questions.differentmessages", locale));
+ result.addError(error);
+ }
+
+
+ Group superAdmin = null;
+
+ if(user.getId()!=null && user.getId()>0) {
+ if(user.getId().longValue()!=dbUser.getId().longValue()) {
+ return "redirect://admin/users/displayUser.html";
+ }
+
+ List<Group> groups = dbUser.getGroups();
+ //boolean removeSuperAdmin = true;
+ for(Group group : groups) {
+ //can't revoke super admin
+ if(group.getGroupName().equals("SUPERADMIN")) {
+ superAdmin = group;
+ }
+ }
+
+ } else {
+
+ if(user.getAdminPassword().length()<6) {
+ ObjectError error = new ObjectError("adminPassword",messages.getMessage("message.password.length", locale));
+ result.addError(error);
+ }
+
+ }
+
+ if(superAdmin!=null) {
+ ids.add(superAdmin.getId());
+ }
+
+
+ List<Group> newGroups = groupService.listGroupByIds(ids);
+
+ //set actual user groups
+ user.setGroups(newGroups);
+
+ if (result.hasErrors()) {
+ return ControllerConstants.Tiles.User.profile;
+ }
+
+ String decodedPassword = user.getAdminPassword();
+ if(user.getId()!=null && user.getId()>0) {
+ user.setAdminPassword(dbUser.getAdminPassword());
+ } else {
+ String encoded = passwordEncoder.encode(user.getAdminPassword());
+ user.setAdminPassword(encoded);
+ }
+
+
+ if(user.getId()==null || user.getId().longValue()==0) {
+
+ //save or update user
+ userService.saveOrUpdate(user);
+
+ try {
+
+ //creation of a user, send an email
+ String userName = user.getFirstName();
+ if(StringUtils.isBlank(userName)) {
+ userName = user.getAdminName();
+ }
+ String[] userNameArg = {userName};
+
+
+ Map<String, String> templateTokens = emailUtils.createEmailObjectsMap(request.getContextPath(), store, messages, userLocale);
+ templateTokens.put(EmailConstants.EMAIL_NEW_USER_TEXT, messages.getMessage("email.greeting", userNameArg, userLocale));
+ templateTokens.put(EmailConstants.EMAIL_USER_FIRSTNAME, user.getFirstName());
+ templateTokens.put(EmailConstants.EMAIL_USER_LASTNAME, user.getLastName());
+ templateTokens.put(EmailConstants.EMAIL_ADMIN_USERNAME_LABEL, messages.getMessage("label.generic.username",userLocale));
+ templateTokens.put(EmailConstants.EMAIL_ADMIN_NAME, user.getAdminName());
+ templateTokens.put(EmailConstants.EMAIL_TEXT_NEW_USER_CREATED, messages.getMessage("email.newuser.text",userLocale));
+ templateTokens.put(EmailConstants.EMAIL_ADMIN_PASSWORD_LABEL, messages.getMessage("label.generic.password",userLocale));
+ templateTokens.put(EmailConstants.EMAIL_ADMIN_PASSWORD, decodedPassword);
+ templateTokens.put(EmailConstants.EMAIL_ADMIN_URL_LABEL, messages.getMessage("label.adminurl",userLocale));
+ templateTokens.put(EmailConstants.EMAIL_ADMIN_URL, filePathUtils.buildAdminUri(store, request));
+
+
+ Email email = new Email();
+ email.setFrom(store.getStorename());
+ email.setFromEmail(store.getStoreEmailAddress());
+ email.setSubject(messages.getMessage("email.newuser.title",userLocale));
+ email.setTo(user.getAdminEmail());
+ email.setTemplateName(NEW_USER_TMPL);
+ email.setTemplateTokens(templateTokens);
+
+
+
+ emailService.sendHtmlEmail(store, email);
+
+ } catch (Exception e) {
+ LOGGER.error("Cannot send email to user",e);
+ }
+
+ } else {
+ //save or update user
+ userService.saveOrUpdate(user);
+ }
+
+ model.addAttribute("success","success");
+ return ControllerConstants.Tiles.User.profile;
+ }
+
+ @PreAuthorize("hasRole('AUTH')")
+ @RequestMapping(value="/admin/users/remove.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> removeUser(HttpServletRequest request, Locale locale) throws Exception {
+
+ //do not remove super admin
+
+ String sUserId = request.getParameter("userId");
+
+ AjaxResponse resp = new AjaxResponse();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+ String userName = request.getRemoteUser();
+ User remoteUser = userService.getByUserName(userName);
+
+
+ try {
+
+ Long userId = Long.parseLong(sUserId);
+ User user = userService.getById(userId);
+
+ /**
+ * In order to remove a User the logged in ser must be STORE_ADMIN
+ * or SUPER_USER
+ */
+
+
+ if(user==null){
+ resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ if(!request.isUserInRole(Constants.GROUP_ADMIN)) {
+ resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+ //check if the user removed has group ADMIN
+ boolean isAdmin = false;
+ if(UserUtils.userInGroup(remoteUser, Constants.GROUP_ADMIN) || UserUtils.userInGroup(remoteUser, Constants.GROUP_SUPERADMIN)) {
+ isAdmin = true;
+ }
+
+
+ if(!isAdmin) {
+ resp.setStatusMessage(messages.getMessage("message.security.caanotremovesuperadmin", locale));
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ userService.delete(user);
+
+ resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
+
+
+
+ } catch (Exception e) {
+ LOGGER.error("Error while deleting user", e);
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ resp.setErrorMessage(e);
+ }
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+ }
+
+
+ private void setMenu(Model model, HttpServletRequest request) throws Exception {
+
+ //display menu
+ Map<String,String> activeMenus = new HashMap<String,String>();
+ activeMenus.put("profile", "profile");
+ activeMenus.put("user", "create-user");
+
+ @SuppressWarnings("unchecked")
+ Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
+
+ Menu currentMenu = (Menu)menus.get("profile");
+ model.addAttribute("currentMenu",currentMenu);
+ model.addAttribute("activeMenus",activeMenus);
+ //
+
+ }
+
+ //password reset functionality --- Sajid Shajahan
+ @RequestMapping(value="/admin/users/resetPassword.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> resetPassword(HttpServletRequest request, HttpServletResponse response, Locale locale) {
+
+ AjaxResponse resp = new AjaxResponse();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+ String userName = request.getParameter("username");
+
+
+
+ /**
+ * Get User with userService.getByUserName
+ * Get 3 security questions from User.getQuestion1, user.getQuestion2, user.getQuestion3
+ */
+
+ HttpSession session = request.getSession();
+ session.setAttribute("username_reset", userName);
+
+ try {
+ if(!StringUtils.isBlank(userName)){
+
+ User dbUser = userService.getByUserName(userName);
+
+ if(dbUser==null) {
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ resp.setStatusMessage(messages.getMessage("message.username.notfound", locale));
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ Map<String,String> entry = new HashMap<String,String>();
+ entry.put(QUESTION_1, dbUser.getQuestion1());
+ entry.put(QUESTION_2, dbUser.getQuestion2());
+ entry.put(QUESTION_3, dbUser.getQuestion3());
+ resp.addDataEntry(entry);
+ resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
+
+ }else
+ {
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ resp.setStatusMessage(messages.getMessage("User.resetPassword.Error", locale));
+
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ resp.setStatusMessage(messages.getMessage("User.resetPassword.Error", locale));
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+
+
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+ //password reset functionality --- Sajid Shajahan
+ @RequestMapping(value="/admin/users/resetPasswordSecurityQtn.html", method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> resetPasswordSecurityQtn(@ModelAttribute(value="userReset") UserReset userReset,HttpServletRequest request, HttpServletResponse response, Locale locale) {
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ Language userLanguage = null;
+ Locale userLocale = null;
+ AjaxResponse resp = new AjaxResponse();
+
+
+ String answer1 = request.getParameter("answer1");
+ String answer2 = request.getParameter("answer2");
+ String answer3 = request.getParameter("answer3");
+
+ try {
+
+ HttpSession session = request.getSession();
+ User dbUser = userService.getByUserName((String) session.getAttribute("username_reset"));
+
+ if(dbUser!= null){
+
+ if(dbUser.getAnswer1().equals(answer1.trim()) && dbUser.getAnswer2().equals(answer2.trim()) && dbUser.getAnswer3().equals(answer3.trim())){
+ userLanguage = dbUser.getDefaultLanguage();
+ userLocale = LocaleUtils.getLocale(userLanguage);
+
+ String tempPass = userReset.generateRandomString();
+ String pass = passwordEncoder.encode(tempPass);
+
+ dbUser.setAdminPassword(pass);
+ userService.update(dbUser);
+
+ //send email
+
+ try {
+ String[] storeEmail = {store.getStoreEmailAddress()};
+
+ Map<String, String> templateTokens = emailUtils.createEmailObjectsMap(request.getContextPath(), store, messages, userLocale);
+ templateTokens.put(EmailConstants.EMAIL_RESET_PASSWORD_TXT, messages.getMessage("email.user.resetpassword.text", userLocale));
+ templateTokens.put(EmailConstants.EMAIL_CONTACT_OWNER, messages.getMessage("email.contactowner", storeEmail, userLocale));
+ templateTokens.put(EmailConstants.EMAIL_PASSWORD_LABEL, messages.getMessage("label.generic.password",userLocale));
+ templateTokens.put(EmailConstants.EMAIL_USER_PASSWORD, tempPass);
+
+ Email email = new Email();
+ email.setFrom(store.getStorename());
+ email.setFromEmail(store.getStoreEmailAddress());
+ email.setSubject(messages.getMessage("label.generic.changepassword",userLocale));
+ email.setTo(dbUser.getAdminEmail() );
+ email.setTemplateName(RESET_PASSWORD_TPL);
+ email.setTemplateTokens(templateTokens);
+
+ emailService.sendHtmlEmail(store, email);
+
+ } catch (Exception e) {
+ LOGGER.error("Cannot send email to user",e);
+ }
+
+ resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
+ resp.setStatusMessage(messages.getMessage("User.resetPassword.resetSuccess", locale));
+ }
+ else{
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ resp.setStatusMessage(messages.getMessage("User.resetPassword.wrongSecurityQtn", locale));
+
+ }
+ }else{
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ resp.setStatusMessage(messages.getMessage("User.resetPassword.userNotFound", locale));
+
+ }
+
+ } catch (ServiceException e) {
+ e.printStackTrace();
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ resp.setStatusMessage(messages.getMessage("User.resetPassword.Error", locale));
+ }
+
+ String returnString = resp.toJSONString();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ }
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/catalog/Keyword.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/catalog/Keyword.java
index 2fccfbf..ac51013 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/catalog/Keyword.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/catalog/Keyword.java
@@ -1,41 +1,41 @@
-package com.salesmanager.shop.admin.model.catalog;
-
-import org.hibernate.validator.constraints.NotEmpty;
-
-import java.io.Serializable;
-
-/**
- * Post keyword from the admin
- * @author Carl Samson
- *
- */
-public class Keyword implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private long productId;
- private String languageCode;
- @NotEmpty
- private String keyword;
- public void setProductId(long productId) {
- this.productId = productId;
- }
- public long getProductId() {
- return productId;
- }
- public void setLanguageCode(String languageCode) {
- this.languageCode = languageCode;
- }
- public String getLanguageCode() {
- return languageCode;
- }
- public void setKeyword(String keyword) {
- this.keyword = keyword;
- }
- public String getKeyword() {
- return keyword;
- }
-
-}
+package com.salesmanager.shop.admin.model.catalog;
+
+import org.hibernate.validator.constraints.NotEmpty;
+
+import java.io.Serializable;
+
+/**
+ * Post keyword from the admin
+ * @author Carl Samson
+ *
+ */
+public class Keyword implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private long productId;
+ private String languageCode;
+ @NotEmpty
+ private String keyword;
+ public void setProductId(long productId) {
+ this.productId = productId;
+ }
+ public long getProductId() {
+ return productId;
+ }
+ public void setLanguageCode(String languageCode) {
+ this.languageCode = languageCode;
+ }
+ public String getLanguageCode() {
+ return languageCode;
+ }
+ public void setKeyword(String keyword) {
+ this.keyword = keyword;
+ }
+ public String getKeyword() {
+ return keyword;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/catalog/Manufacturer.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/catalog/Manufacturer.java
index ea5c35c..0ef97ca 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/catalog/Manufacturer.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/catalog/Manufacturer.java
@@ -1,91 +1,91 @@
-package com.salesmanager.shop.admin.model.catalog;
-
-import com.salesmanager.core.model.catalog.product.image.ProductImage;
-import com.salesmanager.core.model.catalog.product.manufacturer.ManufacturerDescription;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.validation.Valid;
-import javax.validation.constraints.NotNull;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-
-public class Manufacturer implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = -4531526676134574984L;
-
- /**
- *
- */
-
- //provides wrapping to the main Manufacturer entity
- private com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer manufacturer;
-
- @Valid
- private List<ManufacturerDescription> descriptions = new ArrayList<ManufacturerDescription>();
-
- private Integer order = new Integer(0);
- private MultipartFile image = null;
- @NotNull
- private String code;
- public String getCode() {
- return code;
- }
-
- public void setCode(String code) {
- this.code = code;
- }
-
- private ProductImage productImage = null;
-
-
-
- public MultipartFile getImage() {
- return image;
- }
-
- public void setImage(MultipartFile image) {
- this.image = image;
- }
-
- public ProductImage getProductImage() {
- return productImage;
- }
-
- public void setProductImage(ProductImage productImage) {
- this.productImage = productImage;
- }
-
- public com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer getManufacturer() {
- return manufacturer;
- }
-
- public void setManufacturer(
- com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer manufacturer) {
- this.manufacturer = manufacturer;
- }
-
- public List<ManufacturerDescription> getDescriptions() {
- return descriptions;
- }
-
- public void setDescriptions(List<ManufacturerDescription> descriptions) {
- this.descriptions = descriptions;
- }
-
- public Integer getOrder() {
- return order;
- }
-
- public void setOrder(Integer order) {
- this.order = order;
- }
-
-
-
-
-}
+package com.salesmanager.shop.admin.model.catalog;
+
+import com.salesmanager.core.model.catalog.product.image.ProductImage;
+import com.salesmanager.core.model.catalog.product.manufacturer.ManufacturerDescription;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class Manufacturer implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -4531526676134574984L;
+
+ /**
+ *
+ */
+
+ //provides wrapping to the main Manufacturer entity
+ private com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer manufacturer;
+
+ @Valid
+ private List<ManufacturerDescription> descriptions = new ArrayList<ManufacturerDescription>();
+
+ private Integer order = new Integer(0);
+ private MultipartFile image = null;
+ @NotNull
+ private String code;
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ private ProductImage productImage = null;
+
+
+
+ public MultipartFile getImage() {
+ return image;
+ }
+
+ public void setImage(MultipartFile image) {
+ this.image = image;
+ }
+
+ public ProductImage getProductImage() {
+ return productImage;
+ }
+
+ public void setProductImage(ProductImage productImage) {
+ this.productImage = productImage;
+ }
+
+ public com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer getManufacturer() {
+ return manufacturer;
+ }
+
+ public void setManufacturer(
+ com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer manufacturer) {
+ this.manufacturer = manufacturer;
+ }
+
+ public List<ManufacturerDescription> getDescriptions() {
+ return descriptions;
+ }
+
+ public void setDescriptions(List<ManufacturerDescription> descriptions) {
+ this.descriptions = descriptions;
+ }
+
+ public Integer getOrder() {
+ return order;
+ }
+
+ public void setOrder(Integer order) {
+ this.order = order;
+ }
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/catalog/Product.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/catalog/Product.java
index 2a00485..0a5b774 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/catalog/Product.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/catalog/Product.java
@@ -1,112 +1,112 @@
-package com.salesmanager.shop.admin.model.catalog;
-
-import com.salesmanager.core.model.catalog.product.availability.ProductAvailability;
-import com.salesmanager.core.model.catalog.product.description.ProductDescription;
-import com.salesmanager.core.model.catalog.product.image.ProductImage;
-import com.salesmanager.core.model.catalog.product.price.ProductPrice;
-import org.hibernate.validator.constraints.NotEmpty;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.validation.Valid;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-public class Product implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = -4531526676134574984L;
-
- /**
- *
- */
-
- //provides wrapping to the main product entity
- @Valid
- private com.salesmanager.core.model.catalog.product.Product product;
-
- @Valid
- private List<ProductDescription> descriptions = new ArrayList<ProductDescription>();
-
- @Valid
- private ProductAvailability availability = null;
-
- @Valid
- private ProductPrice price = null;
-
- private MultipartFile image = null;
-
- private ProductImage productImage = null;
-
- @NotEmpty
- private String productPrice = "0";
-
- private String dateAvailable;
-
- private ProductDescription description = null;
-
- public String getDateAvailable() {
- return dateAvailable;
- }
- public void setDateAvailable(String dateAvailable) {
- this.dateAvailable = dateAvailable;
- }
- public com.salesmanager.core.model.catalog.product.Product getProduct() {
- return product;
- }
- public void setProduct(com.salesmanager.core.model.catalog.product.Product product) {
- this.product = product;
- }
-
- public List<ProductDescription> getDescriptions() {
- return descriptions;
- }
- public void setDescriptions(List<ProductDescription> descriptions) {
- this.descriptions = descriptions;
- }
- public void setAvailability(ProductAvailability availability) {
- this.availability = availability;
- }
- public ProductAvailability getAvailability() {
- return availability;
- }
- public void setPrice(ProductPrice price) {
- this.price = price;
- }
- public ProductPrice getPrice() {
- return price;
- }
- public MultipartFile getImage() {
- return image;
- }
- public void setImage(MultipartFile image) {
- this.image = image;
- }
-
- public void setProductPrice(String productPrice) {
- this.productPrice = productPrice;
- }
- public String getProductPrice() {
- return productPrice;
- }
- public void setProductImage(ProductImage productImage) {
- this.productImage = productImage;
- }
- public ProductImage getProductImage() {
- return productImage;
- }
- public void setDescription(ProductDescription description) {
- this.description = description;
- }
- public ProductDescription getDescription() {
- return description;
- }
-
-
-
-
-
-
-}
+package com.salesmanager.shop.admin.model.catalog;
+
+import com.salesmanager.core.model.catalog.product.availability.ProductAvailability;
+import com.salesmanager.core.model.catalog.product.description.ProductDescription;
+import com.salesmanager.core.model.catalog.product.image.ProductImage;
+import com.salesmanager.core.model.catalog.product.price.ProductPrice;
+import org.hibernate.validator.constraints.NotEmpty;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.Valid;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Product implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -4531526676134574984L;
+
+ /**
+ *
+ */
+
+ //provides wrapping to the main product entity
+ @Valid
+ private com.salesmanager.core.model.catalog.product.Product product;
+
+ @Valid
+ private List<ProductDescription> descriptions = new ArrayList<ProductDescription>();
+
+ @Valid
+ private ProductAvailability availability = null;
+
+ @Valid
+ private ProductPrice price = null;
+
+ private MultipartFile image = null;
+
+ private ProductImage productImage = null;
+
+ @NotEmpty
+ private String productPrice = "0";
+
+ private String dateAvailable;
+
+ private ProductDescription description = null;
+
+ public String getDateAvailable() {
+ return dateAvailable;
+ }
+ public void setDateAvailable(String dateAvailable) {
+ this.dateAvailable = dateAvailable;
+ }
+ public com.salesmanager.core.model.catalog.product.Product getProduct() {
+ return product;
+ }
+ public void setProduct(com.salesmanager.core.model.catalog.product.Product product) {
+ this.product = product;
+ }
+
+ public List<ProductDescription> getDescriptions() {
+ return descriptions;
+ }
+ public void setDescriptions(List<ProductDescription> descriptions) {
+ this.descriptions = descriptions;
+ }
+ public void setAvailability(ProductAvailability availability) {
+ this.availability = availability;
+ }
+ public ProductAvailability getAvailability() {
+ return availability;
+ }
+ public void setPrice(ProductPrice price) {
+ this.price = price;
+ }
+ public ProductPrice getPrice() {
+ return price;
+ }
+ public MultipartFile getImage() {
+ return image;
+ }
+ public void setImage(MultipartFile image) {
+ this.image = image;
+ }
+
+ public void setProductPrice(String productPrice) {
+ this.productPrice = productPrice;
+ }
+ public String getProductPrice() {
+ return productPrice;
+ }
+ public void setProductImage(ProductImage productImage) {
+ this.productImage = productImage;
+ }
+ public ProductImage getProductImage() {
+ return productImage;
+ }
+ public void setDescription(ProductDescription description) {
+ this.description = description;
+ }
+ public ProductDescription getDescription() {
+ return description;
+ }
+
+
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/content/ContentFiles.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/content/ContentFiles.java
index c392562..0a15b04 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/content/ContentFiles.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/content/ContentFiles.java
@@ -1,57 +1,57 @@
-/**
- *
- */
-package com.salesmanager.shop.admin.model.content;
-
-import org.hibernate.validator.constraints.NotEmpty;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.validation.Valid;
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * A bean class responsible for getting form data from shop Admin for uploading
- * content files for a given merchant and validating the provided data.
- *
- * This will work as a wrapper for underlying cache where these content images will be stored
- * and retrieved in future.
- *
- * @author Umesh Awasthi
- * @since 1.2
- *
- */
-public class ContentFiles implements Serializable
-{
-
- private static final long serialVersionUID = 1L;
-
-
- private List<MultipartFile> file;
-
- public void setFile(List<MultipartFile> file) {
- this.file = file;
- }
-
- private String fileName;
-
- //@NotEmpty(message="{merchant.files.invalid}")
- //@Valid
- public List<MultipartFile> getFile()
- {
- return file;
- }
-
- public void setFileName(String fileName) {
- this.fileName = fileName;
- }
-
- public String getFileName() {
- return fileName;
- }
-
-
-
-
-
-}
+/**
+ *
+ */
+package com.salesmanager.shop.admin.model.content;
+
+import org.hibernate.validator.constraints.NotEmpty;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.Valid;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * A bean class responsible for getting form data from shop Admin for uploading
+ * content files for a given merchant and validating the provided data.
+ *
+ * This will work as a wrapper for underlying cache where these content images will be stored
+ * and retrieved in future.
+ *
+ * @author Umesh Awasthi
+ * @since 1.2
+ *
+ */
+public class ContentFiles implements Serializable
+{
+
+ private static final long serialVersionUID = 1L;
+
+
+ private List<MultipartFile> file;
+
+ public void setFile(List<MultipartFile> file) {
+ this.file = file;
+ }
+
+ private String fileName;
+
+ //@NotEmpty(message="{merchant.files.invalid}")
+ //@Valid
+ public List<MultipartFile> getFile()
+ {
+ return file;
+ }
+
+ public void setFileName(String fileName) {
+ this.fileName = fileName;
+ }
+
+ public String getFileName() {
+ return fileName;
+ }
+
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/customer/attribute/CustomerOption.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/customer/attribute/CustomerOption.java
index 69aed4a..14d4fab 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/customer/attribute/CustomerOption.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/customer/attribute/CustomerOption.java
@@ -1,67 +1,67 @@
-package com.salesmanager.shop.admin.model.customer.attribute;
-
-import java.io.Serializable;
-import java.util.List;
-
-import com.salesmanager.shop.model.ShopEntity;
-
-
-
-public class CustomerOption extends ShopEntity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String type;
- private String name;
-
-
- private CustomerOptionValue defaultValue;
-
-
- private List<CustomerOptionValue> availableValues;
-
-
- public String getType() {
- return type;
- }
-
- public void setType(String type) {
- this.type = type;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public CustomerOptionValue getDefaultValue() {
- return defaultValue;
- }
-
- public void setDefaultValue(CustomerOptionValue defaultValue) {
- this.defaultValue = defaultValue;
- }
-
- public List<CustomerOptionValue> getAvailableValues() {
- return availableValues;
- }
-
- public void setAvailableValues(List<CustomerOptionValue> availableValues) {
- this.availableValues = availableValues;
- }
-
-
-
-
-
-
-
-
-
-
-}
+package com.salesmanager.shop.admin.model.customer.attribute;
+
+import java.io.Serializable;
+import java.util.List;
+
+import com.salesmanager.shop.model.ShopEntity;
+
+
+
+public class CustomerOption extends ShopEntity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String type;
+ private String name;
+
+
+ private CustomerOptionValue defaultValue;
+
+
+ private List<CustomerOptionValue> availableValues;
+
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public CustomerOptionValue getDefaultValue() {
+ return defaultValue;
+ }
+
+ public void setDefaultValue(CustomerOptionValue defaultValue) {
+ this.defaultValue = defaultValue;
+ }
+
+ public List<CustomerOptionValue> getAvailableValues() {
+ return availableValues;
+ }
+
+ public void setAvailableValues(List<CustomerOptionValue> availableValues) {
+ this.availableValues = availableValues;
+ }
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/customer/attribute/CustomerOptionValue.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/customer/attribute/CustomerOptionValue.java
index 3406cd3..63defc3 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/customer/attribute/CustomerOptionValue.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/customer/attribute/CustomerOptionValue.java
@@ -1,24 +1,24 @@
-package com.salesmanager.shop.admin.model.customer.attribute;
-
-import java.io.Serializable;
-
-import com.salesmanager.shop.model.ShopEntity;
-
-
-
-public class CustomerOptionValue extends ShopEntity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String name;
-
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
-
-}
+package com.salesmanager.shop.admin.model.customer.attribute;
+
+import java.io.Serializable;
+
+import com.salesmanager.shop.model.ShopEntity;
+
+
+
+public class CustomerOptionValue extends ShopEntity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/digital/ProductFiles.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/digital/ProductFiles.java
index 722b533..fc1c12c 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/digital/ProductFiles.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/digital/ProductFiles.java
@@ -1,69 +1,69 @@
-/**
- *
- */
-package com.salesmanager.shop.admin.model.digital;
-
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.file.DigitalProduct;
-import org.hibernate.validator.constraints.NotEmpty;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.validation.Valid;
-import java.io.Serializable;
-import java.util.List;
-
-/**
- * A bean class responsible for getting form data from shop Admin for uploading
- * product files for a given product and validating the provided data.
- *
- * This will work as a wrapper for underlying cache where these content images will be stored
- * and retrieved in future.
- *
- * @author Carl Samson
- * @since 1.2
- *
- */
-public class ProductFiles implements Serializable
-{
-
- private static final long serialVersionUID = 1L;
-
-
- private List<MultipartFile> file;
- private DigitalProduct digitalProduct;
- private Product product;
-
- @NotEmpty(message="{product.files.invalid}")
- @Valid
- public List<MultipartFile> getFile()
- {
- return file;
- }
-
- public void setFile( final List<MultipartFile> file )
- {
- this.file = file;
- }
-
-
-
- public Product getProduct() {
- return product;
- }
-
- public void setProduct(Product product) {
- this.product = product;
- }
-
- public void setDigitalProduct(DigitalProduct digitalProduct) {
- this.digitalProduct = digitalProduct;
- }
-
- public DigitalProduct getDigitalProduct() {
- return digitalProduct;
- }
-
-
-
-
-}
+/**
+ *
+ */
+package com.salesmanager.shop.admin.model.digital;
+
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.file.DigitalProduct;
+import org.hibernate.validator.constraints.NotEmpty;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.validation.Valid;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * A bean class responsible for getting form data from shop Admin for uploading
+ * product files for a given product and validating the provided data.
+ *
+ * This will work as a wrapper for underlying cache where these content images will be stored
+ * and retrieved in future.
+ *
+ * @author Carl Samson
+ * @since 1.2
+ *
+ */
+public class ProductFiles implements Serializable
+{
+
+ private static final long serialVersionUID = 1L;
+
+
+ private List<MultipartFile> file;
+ private DigitalProduct digitalProduct;
+ private Product product;
+
+ @NotEmpty(message="{product.files.invalid}")
+ @Valid
+ public List<MultipartFile> getFile()
+ {
+ return file;
+ }
+
+ public void setFile( final List<MultipartFile> file )
+ {
+ this.file = file;
+ }
+
+
+
+ public Product getProduct() {
+ return product;
+ }
+
+ public void setProduct(Product product) {
+ this.product = product;
+ }
+
+ public void setDigitalProduct(DigitalProduct digitalProduct) {
+ this.digitalProduct = digitalProduct;
+ }
+
+ public DigitalProduct getDigitalProduct() {
+ return digitalProduct;
+ }
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/merchant/StoreLanding.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/merchant/StoreLanding.java
index 1e4a6b2..e6275f0 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/merchant/StoreLanding.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/merchant/StoreLanding.java
@@ -1,20 +1,20 @@
-package com.salesmanager.shop.admin.model.merchant;
-
-import javax.validation.Valid;
-import java.util.ArrayList;
-import java.util.List;
-
-public class StoreLanding {
-
- @Valid
- private List<StoreLandingDescription> descriptions = new ArrayList<StoreLandingDescription>();
-
- public void setDescriptions(List<StoreLandingDescription> descriptions) {
- this.descriptions = descriptions;
- }
-
- public List<StoreLandingDescription> getDescriptions() {
- return descriptions;
- }
-
-}
+package com.salesmanager.shop.admin.model.merchant;
+
+import javax.validation.Valid;
+import java.util.ArrayList;
+import java.util.List;
+
+public class StoreLanding {
+
+ @Valid
+ private List<StoreLandingDescription> descriptions = new ArrayList<StoreLandingDescription>();
+
+ public void setDescriptions(List<StoreLandingDescription> descriptions) {
+ this.descriptions = descriptions;
+ }
+
+ public List<StoreLandingDescription> getDescriptions() {
+ return descriptions;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/merchant/StoreLandingDescription.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/merchant/StoreLandingDescription.java
index 98bb5e6..389c56d 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/merchant/StoreLandingDescription.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/merchant/StoreLandingDescription.java
@@ -1,68 +1,68 @@
-package com.salesmanager.shop.admin.model.merchant;
-
-import com.salesmanager.core.model.reference.language.Language;
-
-import java.io.Serializable;
-
-import org.hibernate.validator.constraints.NotEmpty;
-
-public class StoreLandingDescription implements Serializable {
-
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- @NotEmpty
- private String title;
- private String description;
- private String keywords;
- private String homePageContent;
-
-
- private Language language;
-
-
-
-
- public void setDescription(String description) {
- this.description = description;
- }
-
- public String getDescription() {
- return description;
- }
-
- public void setHomePageContent(String homePageContent) {
- this.homePageContent = homePageContent;
- }
-
- public String getHomePageContent() {
- return homePageContent;
- }
-
- public void setKeywords(String keywords) {
- this.keywords = keywords;
- }
-
- public String getKeywords() {
- return keywords;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public String getTitle() {
- return title;
- }
-
- public void setLanguage(Language language) {
- this.language = language;
- }
-
- public Language getLanguage() {
- return language;
- }
-
-}
+package com.salesmanager.shop.admin.model.merchant;
+
+import com.salesmanager.core.model.reference.language.Language;
+
+import java.io.Serializable;
+
+import org.hibernate.validator.constraints.NotEmpty;
+
+public class StoreLandingDescription implements Serializable {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ @NotEmpty
+ private String title;
+ private String description;
+ private String keywords;
+ private String homePageContent;
+
+
+ private Language language;
+
+
+
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setHomePageContent(String homePageContent) {
+ this.homePageContent = homePageContent;
+ }
+
+ public String getHomePageContent() {
+ return homePageContent;
+ }
+
+ public void setKeywords(String keywords) {
+ this.keywords = keywords;
+ }
+
+ public String getKeywords() {
+ return keywords;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setLanguage(Language language) {
+ this.language = language;
+ }
+
+ public Language getLanguage() {
+ return language;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/orders/Order.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/orders/Order.java
index 93dcc56..c26832d 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/orders/Order.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/orders/Order.java
@@ -1,96 +1,96 @@
-package com.salesmanager.shop.admin.model.orders;
-
-import com.salesmanager.core.model.common.Billing;
-import com.salesmanager.core.model.common.Delivery;
-import com.salesmanager.core.model.order.orderstatus.OrderStatus;
-
-import javax.persistence.Embedded;
-import java.io.Serializable;
-import java.util.Arrays;
-import java.util.List;
-
-
-public class Order implements Serializable {
-
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private Long Id;
- private String orderHistoryComment = "";
-
- List<OrderStatus> orderStatusList = Arrays.asList(OrderStatus.values());
- private String datePurchased = "";
- private com.salesmanager.core.model.order.Order order;
-
- @Embedded
- private com.salesmanager.core.model.common.Delivery delivery = null;
-
- @Embedded
- private com.salesmanager.core.model.common.Billing billing = null;
-
-
-
-
- public String getDatePurchased() {
- return datePurchased;
- }
-
- public void setDatePurchased(String datePurchased) {
- this.datePurchased = datePurchased;
- }
-
- public Long getId() {
- return Id;
- }
-
- public void setId(Long id) {
- Id = id;
- }
-
- public String getOrderHistoryComment() {
- return orderHistoryComment;
- }
-
- public void setOrderHistoryComment(String orderHistoryComment) {
- this.orderHistoryComment = orderHistoryComment;
- }
-
- public List<OrderStatus> getOrderStatusList() {
- return orderStatusList;
- }
-
- public void setOrderStatusList(List<OrderStatus> orderStatusList) {
- this.orderStatusList = orderStatusList;
- }
-
- public com.salesmanager.core.model.order.Order getOrder() {
- return order;
- }
-
- public void setOrder(com.salesmanager.core.model.order.Order order) {
- this.order = order;
- }
-
- public Delivery getDelivery() {
- return delivery;
- }
-
- public void setDelivery(Delivery delivery) {
- this.delivery = delivery;
- }
-
- public Billing getBilling() {
- return billing;
- }
-
- public void setBilling(Billing billing) {
- this.billing = billing;
- }
-
-
-
-
-
+package com.salesmanager.shop.admin.model.orders;
+
+import com.salesmanager.core.model.common.Billing;
+import com.salesmanager.core.model.common.Delivery;
+import com.salesmanager.core.model.order.orderstatus.OrderStatus;
+
+import javax.persistence.Embedded;
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.List;
+
+
+public class Order implements Serializable {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private Long Id;
+ private String orderHistoryComment = "";
+
+ List<OrderStatus> orderStatusList = Arrays.asList(OrderStatus.values());
+ private String datePurchased = "";
+ private com.salesmanager.core.model.order.Order order;
+
+ @Embedded
+ private com.salesmanager.core.model.common.Delivery delivery = null;
+
+ @Embedded
+ private com.salesmanager.core.model.common.Billing billing = null;
+
+
+
+
+ public String getDatePurchased() {
+ return datePurchased;
+ }
+
+ public void setDatePurchased(String datePurchased) {
+ this.datePurchased = datePurchased;
+ }
+
+ public Long getId() {
+ return Id;
+ }
+
+ public void setId(Long id) {
+ Id = id;
+ }
+
+ public String getOrderHistoryComment() {
+ return orderHistoryComment;
+ }
+
+ public void setOrderHistoryComment(String orderHistoryComment) {
+ this.orderHistoryComment = orderHistoryComment;
+ }
+
+ public List<OrderStatus> getOrderStatusList() {
+ return orderStatusList;
+ }
+
+ public void setOrderStatusList(List<OrderStatus> orderStatusList) {
+ this.orderStatusList = orderStatusList;
+ }
+
+ public com.salesmanager.core.model.order.Order getOrder() {
+ return order;
+ }
+
+ public void setOrder(com.salesmanager.core.model.order.Order order) {
+ this.order = order;
+ }
+
+ public Delivery getDelivery() {
+ return delivery;
+ }
+
+ public void setDelivery(Delivery delivery) {
+ this.delivery = delivery;
+ }
+
+ public Billing getBilling() {
+ return billing;
+ }
+
+ public void setBilling(Billing billing) {
+ this.billing = billing;
+ }
+
+
+
+
+
}
\ No newline at end of file
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/permission/GroupDetails.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/permission/GroupDetails.java
new file mode 100644
index 0000000..0ee739a
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/permission/GroupDetails.java
@@ -0,0 +1,32 @@
+package com.salesmanager.shop.admin.model.permission;
+
+import java.io.Serializable;
+import java.util.List;
+
+import javax.validation.Valid;
+
+import com.salesmanager.core.model.user.Group;
+
+public class GroupDetails implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ @Valid
+ private Group group;
+ private List<String> types;
+ public Group getGroup() {
+ return group;
+ }
+ public void setGroup(Group group) {
+ this.group = group;
+ }
+ public List<String> getTypes() {
+ return types;
+ }
+ public void setTypes(List<String> types) {
+ this.types = types;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/permission/Permissions.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/permission/Permissions.java
old mode 100755
new mode 100644
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/permission/ShopGroup.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/permission/ShopGroup.java
old mode 100755
new mode 100644
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/permission/ShopPermission.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/permission/ShopPermission.java
old mode 100755
new mode 100644
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/userpassword/UserReset.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/userpassword/UserReset.java
index 3f4aeaf..31cf35c 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/userpassword/UserReset.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/userpassword/UserReset.java
@@ -1,47 +1,47 @@
-package com.salesmanager.shop.admin.model.userpassword;
-
-import java.util.Random;
-
-
-public class UserReset
-{
- final static String CHAR_LIST_WITHNUM = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
- final static String CHAR_LIST = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-";
-
- final static int RANDOM_STRING_LENGTH = 10;
-
- public static String generateRandomString()
- {
- StringBuilder randStr = new StringBuilder();
- for (int i = 0; i < RANDOM_STRING_LENGTH; i++) {
- int number = getRandomNumber();
- char ch = CHAR_LIST_WITHNUM.charAt(number);
- randStr.append(ch);
- }
- return randStr.toString();
- }
-
- public static String generateRandomString(int length)
- {
- StringBuilder randStr = new StringBuilder();
- for (int i = 0; i < length; i++) {
- int number = getRandomNumber();
- char ch = CHAR_LIST.charAt(number);
- randStr.append(ch);
- }
- return randStr.toString();
- }
-
- private static int getRandomNumber()
- {
- int randomInt = 0;
- Random randomGenerator = new Random();
- randomInt = randomGenerator.nextInt(CHAR_LIST.length());
- if (randomInt - 1 == -1) {
- return randomInt;
- }
- return randomInt - 1;
- }
-
-
+package com.salesmanager.shop.admin.model.userpassword;
+
+import java.util.Random;
+
+
+public class UserReset
+{
+ final static String CHAR_LIST_WITHNUM = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
+ final static String CHAR_LIST = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-";
+
+ final static int RANDOM_STRING_LENGTH = 10;
+
+ public static String generateRandomString()
+ {
+ StringBuilder randStr = new StringBuilder();
+ for (int i = 0; i < RANDOM_STRING_LENGTH; i++) {
+ int number = getRandomNumber();
+ char ch = CHAR_LIST_WITHNUM.charAt(number);
+ randStr.append(ch);
+ }
+ return randStr.toString();
+ }
+
+ public static String generateRandomString(int length)
+ {
+ StringBuilder randStr = new StringBuilder();
+ for (int i = 0; i < length; i++) {
+ int number = getRandomNumber();
+ char ch = CHAR_LIST.charAt(number);
+ randStr.append(ch);
+ }
+ return randStr.toString();
+ }
+
+ private static int getRandomNumber()
+ {
+ int randomInt = 0;
+ Random randomGenerator = new Random();
+ randomInt = randomGenerator.nextInt(CHAR_LIST.length());
+ if (randomInt - 1 == -1) {
+ return randomInt;
+ }
+ return randomInt - 1;
+ }
+
+
}
\ No newline at end of file
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/web/Menu.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/web/Menu.java
index d367540..55332b7 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/model/web/Menu.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/model/web/Menu.java
@@ -1,68 +1,68 @@
-package com.salesmanager.shop.admin.model.web;
-
-
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-public class Menu implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String code;
- private String url;
- private String icon;
- private String role;
- private int order;
- private List<Menu> menus = new ArrayList<Menu>();
- public String getCode() {
- return code;
- }
- @JsonProperty("code")
- public void setCode(String code) {
- this.code = code;
- }
- public String getUrl() {
- return url;
- }
- @JsonProperty("url")
- public void setUrl(String url) {
- this.url = url;
- }
-
-
-
- public int getOrder() {
- return order;
- }
- @JsonProperty("order")
- public void setOrder(int order) {
- this.order = order;
- }
- public List<Menu> getMenus() {
- return menus;
- }
- @JsonProperty("menus")
- public void setMenus(List<Menu> menus) {
- this.menus = menus;
- }
- public void setIcon(String icon) {
- this.icon = icon;
- }
- public String getIcon() {
- return icon;
- }
- public String getRole() {
- return role;
- }
- @JsonProperty("role")
- public void setRole(String role) {
- this.role = role;
- }
-
-}
+package com.salesmanager.shop.admin.model.web;
+
+
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class Menu implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String code;
+ private String url;
+ private String icon;
+ private String role;
+ private int order;
+ private List<Menu> menus = new ArrayList<Menu>();
+ public String getCode() {
+ return code;
+ }
+ @JsonProperty("code")
+ public void setCode(String code) {
+ this.code = code;
+ }
+ public String getUrl() {
+ return url;
+ }
+ @JsonProperty("url")
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+
+
+ public int getOrder() {
+ return order;
+ }
+ @JsonProperty("order")
+ public void setOrder(int order) {
+ this.order = order;
+ }
+ public List<Menu> getMenus() {
+ return menus;
+ }
+ @JsonProperty("menus")
+ public void setMenus(List<Menu> menus) {
+ this.menus = menus;
+ }
+ public void setIcon(String icon) {
+ this.icon = icon;
+ }
+ public String getIcon() {
+ return icon;
+ }
+ public String getRole() {
+ return role;
+ }
+ @JsonProperty("role")
+ public void setRole(String role) {
+ this.role = role;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/security/SecurityQuestion.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/security/SecurityQuestion.java
index 9014b8c..d4b8e24 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/security/SecurityQuestion.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/security/SecurityQuestion.java
@@ -1,26 +1,26 @@
-package com.salesmanager.shop.admin.security;
-
-import java.io.Serializable;
-
-public class SecurityQuestion implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String id;
- private String label;
- public void setLabel(String label) {
- this.label = label;
- }
- public String getLabel() {
- return label;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getId() {
- return id;
- }
-
-}
+package com.salesmanager.shop.admin.security;
+
+import java.io.Serializable;
+
+public class SecurityQuestion implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String id;
+ private String label;
+ public void setLabel(String label) {
+ this.label = label;
+ }
+ public String getLabel() {
+ return label;
+ }
+ public void setId(String id) {
+ this.id = id;
+ }
+ public String getId() {
+ return id;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/security/UserAuthenticationSuccessHandler.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/security/UserAuthenticationSuccessHandler.java
index 180d995..179a75f 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/security/UserAuthenticationSuccessHandler.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/security/UserAuthenticationSuccessHandler.java
@@ -1,76 +1,75 @@
-package com.salesmanager.shop.admin.security;
-
-import com.salesmanager.core.business.services.user.UserService;
-import com.salesmanager.core.model.user.User;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContext;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.web.DefaultRedirectStrategy;
-import org.springframework.security.web.RedirectStrategy;
-import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.servlet.http.HttpSession;
-
-import java.util.Date;
-
-public class UserAuthenticationSuccessHandler extends
- SavedRequestAwareAuthenticationSuccessHandler {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(UserAuthenticationSuccessHandler.class);
-
- private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
-
- @Inject
- private UserService userService;
-
- @Override
- public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
- // last access timestamp
- String userName = authentication.getName();
-
- /**
- * Spring Security 4 does not seem to add security context in the session
- * creating the authentication to be lost during the login
- */
- SecurityContext securityContext = SecurityContextHolder.getContext();
- Authentication auth = securityContext.getAuthentication();
- HttpSession session = request.getSession(true);
- session.setAttribute("SPRING_SECURITY_CONTEXT", securityContext);
-
- try {
- User user = userService.getByUserName(userName);
-
- Date lastAccess = user.getLoginTime();
- if(lastAccess==null) {
- lastAccess = new Date();
- }
- user.setLastAccess(lastAccess);
- user.setLoginTime(new Date());
-
- userService.saveOrUpdate(user);
-
- //response.sendRedirect(request.getContextPath() + "/admin/home.html");
- redirectStrategy.sendRedirect(request, response, request.getContextPath() + "/admin/home.html");
-
-
-
- } catch (Exception e) {
- LOGGER.error("User authenticationSuccess",e);
- }
-
-
- }
-
- public void setRedirectStrategy(RedirectStrategy redirectStrategy) {
- this.redirectStrategy = redirectStrategy;
- }
- protected RedirectStrategy getRedirectStrategy() {
- return redirectStrategy;
- }
-
-}
+package com.salesmanager.shop.admin.security;
+
+import com.salesmanager.core.business.services.user.UserService;
+import com.salesmanager.core.model.user.User;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContext;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.web.DefaultRedirectStrategy;
+import org.springframework.security.web.RedirectStrategy;
+import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import java.util.Date;
+
+public class UserAuthenticationSuccessHandler extends
+ SavedRequestAwareAuthenticationSuccessHandler {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(UserAuthenticationSuccessHandler.class);
+
+ private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
+
+ @Inject
+ private UserService userService;
+
+ @Override
+ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
+ // last access timestamp
+ String userName = authentication.getName();
+
+ /**
+ * Spring Security 4 does not seem to add security context in the session
+ * creating the authentication to be lost during the login
+ */
+ SecurityContext securityContext = SecurityContextHolder.getContext();
+ HttpSession session = request.getSession(true);
+ session.setAttribute("SPRING_SECURITY_CONTEXT", securityContext);
+
+ try {
+ User user = userService.getByUserName(userName);
+
+ Date lastAccess = user.getLoginTime();
+ if(lastAccess==null) {
+ lastAccess = new Date();
+ }
+ user.setLastAccess(lastAccess);
+ user.setLoginTime(new Date());
+
+ userService.saveOrUpdate(user);
+
+ //response.sendRedirect(request.getContextPath() + "/admin/home.html");
+ redirectStrategy.sendRedirect(request, response, "/admin/home.html");
+
+
+
+ } catch (Exception e) {
+ LOGGER.error("User authenticationSuccess",e);
+ }
+
+
+ }
+
+ public void setRedirectStrategy(RedirectStrategy redirectStrategy) {
+ this.redirectStrategy = redirectStrategy;
+ }
+ protected RedirectStrategy getRedirectStrategy() {
+ return redirectStrategy;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/security/UserServicesImpl.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/security/UserServicesImpl.java
index 90ba6ec..bd5f761 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/security/UserServicesImpl.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/security/UserServicesImpl.java
@@ -1,145 +1,145 @@
-package com.salesmanager.shop.admin.security;
-
-import com.salesmanager.core.business.services.merchant.MerchantStoreService;
-import com.salesmanager.core.business.services.user.GroupService;
-import com.salesmanager.core.business.services.user.PermissionService;
-import com.salesmanager.core.business.services.user.UserService;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.user.Group;
-import com.salesmanager.core.model.user.GroupType;
-import com.salesmanager.core.model.user.Permission;
-import com.salesmanager.shop.constants.Constants;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.dao.DataAccessException;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.userdetails.User;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.stereotype.Service;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-
-/**
- *
- * @author casams1
- * http://stackoverflow.com/questions/5105776/spring-security-with
- * -custom-user-details
- */
-@Service("userDetailsService")
-public class UserServicesImpl implements WebUserServices{
-
- private static final Logger LOGGER = LoggerFactory.getLogger(UserServicesImpl.class);
-
- private static final String DEFAULT_INITIAL_PASSWORD = "password";
-
- @Inject
- private UserService userService;
-
-
- @Inject
- private MerchantStoreService merchantStoreService;
-
- @Inject
- @Named("passwordEncoder")
- private PasswordEncoder passwordEncoder;
-
-
-
- @Inject
- protected PermissionService permissionService;
-
- @Inject
- protected GroupService groupService;
-
- public final static String ROLE_PREFIX = "ROLE_";//Spring Security 4
-
-
-
- public UserDetails loadUserByUsername(String userName)
- throws UsernameNotFoundException, DataAccessException {
-
- com.salesmanager.core.model.user.User user = null;
- Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
-
- try {
-
- user = userService.getByUserName(userName);
-
- if(user==null) {
- return null;
- }
-
- GrantedAuthority role = new SimpleGrantedAuthority(ROLE_PREFIX + Constants.PERMISSION_AUTHENTICATED);//required to login
- authorities.add(role);
-
- List<Integer> groupsId = new ArrayList<Integer>();
- List<Group> groups = user.getGroups();
- for(Group group : groups) {
-
-
- groupsId.add(group.getId());
-
- }
-
-
-
- List<Permission> permissions = permissionService.getPermissions(groupsId);
- for(Permission permission : permissions) {
- GrantedAuthority auth = new SimpleGrantedAuthority(ROLE_PREFIX + permission.getPermissionName());
- authorities.add(auth);
- }
-
- } catch (Exception e) {
- LOGGER.error("Exception while querrying user",e);
- throw new SecurityDataAccessException("Exception while querrying user",e);
- }
-
-
-
-
-
- User secUser = new User(userName, user.getAdminPassword(), user.isActive(), true,
- true, true, authorities);
- return secUser;
- }
-
-
- public void createDefaultAdmin() throws Exception {
-
- //TODO create all groups and permissions
-
- MerchantStore store = merchantStoreService.getMerchantStore(MerchantStore.DEFAULT_STORE);
-
- String password = passwordEncoder.encode(DEFAULT_INITIAL_PASSWORD);
-
- List<Group> groups = groupService.listGroup(GroupType.ADMIN);
-
- //creation of the super admin admin:password)
- com.salesmanager.core.model.user.User user = new com.salesmanager.core.model.user.User("admin",password,"admin@shopizer.com");
- user.setFirstName("Administrator");
- user.setLastName("User");
-
- for(Group group : groups) {
- if(group.getGroupName().equals(Constants.GROUP_SUPERADMIN) || group.getGroupName().equals(Constants.GROUP_ADMIN)) {
- user.getGroups().add(group);
- }
- }
-
- user.setMerchantStore(store);
- userService.create(user);
-
-
- }
-
-
-
-}
+package com.salesmanager.shop.admin.security;
+
+import com.salesmanager.core.business.services.merchant.MerchantStoreService;
+import com.salesmanager.core.business.services.user.GroupService;
+import com.salesmanager.core.business.services.user.PermissionService;
+import com.salesmanager.core.business.services.user.UserService;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.user.Group;
+import com.salesmanager.core.model.user.GroupType;
+import com.salesmanager.core.model.user.Permission;
+import com.salesmanager.shop.constants.Constants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.dao.DataAccessException;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Service;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+
+/**
+ *
+ * @author casams1
+ * http://stackoverflow.com/questions/5105776/spring-security-with
+ * -custom-user-details
+ */
+@Service("userDetailsService")
+public class UserServicesImpl implements WebUserServices{
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(UserServicesImpl.class);
+
+ private static final String DEFAULT_INITIAL_PASSWORD = "password";
+
+ @Inject
+ private UserService userService;
+
+
+ @Inject
+ private MerchantStoreService merchantStoreService;
+
+ @Inject
+ @Named("passwordEncoder")
+ private PasswordEncoder passwordEncoder;
+
+
+
+ @Inject
+ protected PermissionService permissionService;
+
+ @Inject
+ protected GroupService groupService;
+
+ public final static String ROLE_PREFIX = "ROLE_";//Spring Security 4
+
+
+
+ public UserDetails loadUserByUsername(String userName)
+ throws UsernameNotFoundException, DataAccessException {
+
+ com.salesmanager.core.model.user.User user = null;
+ Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
+
+ try {
+
+ user = userService.getByUserName(userName);
+
+ if(user==null) {
+ return null;
+ }
+
+ GrantedAuthority role = new SimpleGrantedAuthority(ROLE_PREFIX + Constants.PERMISSION_AUTHENTICATED);//required to login
+ authorities.add(role);
+
+ List<Integer> groupsId = new ArrayList<Integer>();
+ List<Group> groups = user.getGroups();
+ for(Group group : groups) {
+
+
+ groupsId.add(group.getId());
+
+ }
+
+
+
+ List<Permission> permissions = permissionService.getPermissions(groupsId);
+ for(Permission permission : permissions) {
+ GrantedAuthority auth = new SimpleGrantedAuthority(ROLE_PREFIX + permission.getPermissionName());
+ authorities.add(auth);
+ }
+
+ } catch (Exception e) {
+ LOGGER.error("Exception while querrying user",e);
+ throw new SecurityDataAccessException("Exception while querrying user",e);
+ }
+
+
+
+
+
+ User secUser = new User(userName, user.getAdminPassword(), user.isActive(), true,
+ true, true, authorities);
+ return secUser;
+ }
+
+
+ public void createDefaultAdmin() throws Exception {
+
+ //TODO create all groups and permissions
+
+ MerchantStore store = merchantStoreService.getMerchantStore(MerchantStore.DEFAULT_STORE);
+
+ String password = passwordEncoder.encode(DEFAULT_INITIAL_PASSWORD);
+
+ List<Group> groups = groupService.listGroup(GroupType.ADMIN);
+
+ //creation of the super admin admin:password)
+ com.salesmanager.core.model.user.User user = new com.salesmanager.core.model.user.User("admin",password,"admin@shopizer.com");
+ user.setFirstName("Administrator");
+ user.setLastName("User");
+
+ for(Group group : groups) {
+ if(group.getGroupName().equals(Constants.GROUP_SUPERADMIN) || group.getGroupName().equals(Constants.GROUP_ADMIN)) {
+ user.getGroups().add(group);
+ }
+ }
+
+ user.setMerchantStore(store);
+ userService.create(user);
+
+
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/admin/security/WebUserServices.java b/sm-shop/src/main/java/com/salesmanager/shop/admin/security/WebUserServices.java
index 47e4fd7..e047856 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/admin/security/WebUserServices.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/admin/security/WebUserServices.java
@@ -1,9 +1,9 @@
-package com.salesmanager.shop.admin.security;
-
-import org.springframework.security.core.userdetails.UserDetailsService;
-
-public interface WebUserServices extends UserDetailsService{
-
- void createDefaultAdmin() throws Exception;
-
-}
+package com.salesmanager.shop.admin.security;
+
+import org.springframework.security.core.userdetails.UserDetailsService;
+
+public interface WebUserServices extends UserDetailsService{
+
+ void createDefaultAdmin() throws Exception;
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/application/ShopApplicationConfiguration.java b/sm-shop/src/main/java/com/salesmanager/shop/application/ShopApplicationConfiguration.java
index fb50f78..cff5c6b 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/application/ShopApplicationConfiguration.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/application/ShopApplicationConfiguration.java
@@ -1,27 +1,72 @@
package com.salesmanager.shop.application;
+
+import javax.inject.Inject;
+import javax.sql.DataSource;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.log4j.PropertyConfigurator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;
+import org.springframework.context.annotation.Scope;
+import org.springframework.context.annotation.ScopedProxyMode;
+import org.springframework.context.event.EventListener;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.crypto.encrypt.TextEncryptor;
+import org.springframework.social.connect.ConnectionFactoryLocator;
+import org.springframework.social.connect.UsersConnectionRepository;
+import org.springframework.social.connect.jdbc.JdbcUsersConnectionRepository;
+import org.springframework.social.connect.support.ConnectionFactoryRegistry;
+import org.springframework.social.facebook.connect.FacebookConnectionFactory;
+import org.springframework.social.facebook.security.FacebookAuthenticationService;
+import org.springframework.social.security.SocialAuthenticationServiceLocator;
+import org.springframework.social.security.SocialAuthenticationServiceRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.tiles3.TilesConfigurer;
import org.springframework.web.servlet.view.tiles3.TilesView;
import org.springframework.web.servlet.view.tiles3.TilesViewResolver;
import com.salesmanager.core.business.configuration.CoreApplicationConfiguration;
+import com.salesmanager.core.constants.SchemaConstant;
@Configuration
@ComponentScan({"com.salesmanager.shop","com.salesmanager.core.business"})
@EnableAutoConfiguration
@Import(CoreApplicationConfiguration.class)//import sm-core configurations
-@ImportResource("classpath:/spring/shopizer-shop-context.xml")
+@ImportResource({"classpath:/spring/shopizer-shop-context.xml"})
@EnableWebSecurity
public class ShopApplicationConfiguration extends WebMvcConfigurerAdapter{
+ protected final Log logger = LogFactory.getLog(getClass());
+
+ @Value("${facebook.app.id}")
+ private String facebookAppId;
+
+ @Value("${facebook.app.secret}")
+ private String facebookAppSecret;
+
+ @Inject
+ private DataSource dataSource;
+
+ @Inject
+ private TextEncryptor textEncryptor;
+
+ @EventListener(ApplicationReadyEvent.class)
+ public void applicationReadyCode() {
+ String workingDir = System.getProperty("user.dir");
+ System.out.println("Current working directory : " + workingDir);
+ }
+
+
/**
* Configure TilesConfigurer.
*/
@@ -44,6 +89,57 @@ public class ShopApplicationConfiguration extends WebMvcConfigurerAdapter{
return resolver;
}
+/* @Bean
+ public ConnectionFactoryLocator connectionFactoryLocator() {
+ ConnectionFactoryRegistry registry = new ConnectionFactoryRegistry();
+
+ registry.addConnectionFactory(new FacebookConnectionFactory(
+ facebookAppId,
+ facebookAppSecret));
+
+ return registry;
+ }*/
+
+ @Bean
+ @Scope(value = "singleton", proxyMode = ScopedProxyMode.INTERFACES)
+ public SocialAuthenticationServiceLocator authenticationServiceLocator() {
+
+ try {
+
+ logger.debug("Creating social authenticators");
+
+
+ SocialAuthenticationServiceRegistry registry = new SocialAuthenticationServiceRegistry();
+ registry.addAuthenticationService(
+ new FacebookAuthenticationService(
+ facebookAppId,
+ facebookAppSecret));
+
+ // registry.addConnectionFactory(new
+ // FacebookConnectionFactory(environment
+ // .getProperty("facebook.clientId"), environment
+ // .getProperty("facebook.clientSecret")));
+
+ return registry;
+
+ } catch(Exception e) {
+ logger.error("Eror while creating social authenticators");
+ return null;
+ }
+ }
+
+ @Bean
+ public UsersConnectionRepository socialUsersConnectionRepository() {
+ JdbcUsersConnectionRepository conn = new JdbcUsersConnectionRepository(dataSource, authenticationServiceLocator(),
+ textEncryptor);
+ conn.setTablePrefix(SchemaConstant.SALESMANAGER_SCHEMA + ".");
+ return conn;
+
+ }
+
+
+
+
}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/application/ShopApplicationUserSecurityConfiguration.java b/sm-shop/src/main/java/com/salesmanager/shop/application/ShopApplicationUserSecurityConfiguration.java
new file mode 100644
index 0000000..66fa9ab
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/application/ShopApplicationUserSecurityConfiguration.java
@@ -0,0 +1,80 @@
+package com.salesmanager.shop.application;
+
+/**
+ * Configuration for admin basic authentication
+ *
+ * --- Can't login with spring mvc java configuration ---
+ * --- /login produces 404 error as is security filter is not found ---
+ * --- need to stick with xml
+ * @author carlsamson
+ *
+ */
+//@Configuration
+//@Order(1)
+public class ShopApplicationUserSecurityConfiguration { //extends WebSecurityConfigurerAdapter {
+
+
+ //private static final String ADMIN_REALM = "admin";
+
+ //@Inject
+ //private UserServicesImpl userDetailsService;
+
+ //@Inject
+ //private ServicesAuthenticationSuccessHandler userAuthenticationSuccessHandler;
+
+/* @Override
+ protected void configure(HttpSecurity http) throws Exception {
+ http.csrf().disable()
+ .formLogin().loginPage("/admin/logon.html").loginProcessingUrl("/login")
+ .usernameParameter("username").passwordParameter("password").successHandler(userAuthenticationSuccessHandler)
+ .failureUrl("/admin/logon.html?login_error=true")
+ .and()
+ .logout().invalidateHttpSession(false)
+ .logoutSuccessUrl("/shop")
+ .logoutUrl("/shop/customer/logout")
+ .and()
+ .exceptionHandling().accessDeniedPage("/shop")
+ .and()
+ .authenticationProvider(adminAuthenticationProvider())
+ .antMatcher("/admin/**").authorizeRequests()
+
+ .antMatchers("/login*").permitAll()
+ .antMatchers("/admin/logon*").permitAll()
+
+ .antMatchers("/admin/denied.html").permitAll()
+ .antMatchers("/admin/unauthorized.html").permitAll()
+ .antMatchers("/admin/users/resetPassword.html*").permitAll()
+ .antMatchers("/admin/users/resetPasswordSecurityQtn.html*").permitAll()
+ .antMatchers("/admin/unauthorized.html").permitAll()
+ .antMatchers("/admin").hasRole("AUTH")
+ .antMatchers("/admin/").hasRole("AUTH")
+ .antMatchers("/admin/*.html*").hasRole("AUTH")
+ .antMatchers("/admin/*//*.html*").hasRole("AUTH")
+ .antMatchers("/admin/*//*/*.html*").hasRole("AUTH")
+ .and().httpBasic().authenticationEntryPoint(adminAuthenticationEntryPoint());
+
+ }*/
+
+/* @Bean(name="passwordEncoder")
+ public PasswordEncoder encoder() {
+ return new BCryptPasswordEncoder(11);
+ }
+
+
+ @Bean
+ public AuthenticationEntryPoint adminAuthenticationEntryPoint(){
+ BasicAuthenticationEntryPoint entryPoint =
+ new BasicAuthenticationEntryPoint();
+ entryPoint.setRealmName(ADMIN_REALM);
+ return entryPoint;
+ }
+
+ @Bean
+ public AuthenticationProvider adminAuthenticationProvider() {
+ DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
+ authenticationProvider.setUserDetailsService(userDetailsService);
+ authenticationProvider.setPasswordEncoder(encoder());
+ return authenticationProvider;
+ }
+*/
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/constants/Constants.java b/sm-shop/src/main/java/com/salesmanager/shop/constants/Constants.java
index 14b12a9..a093286 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/constants/Constants.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/constants/Constants.java
@@ -10,6 +10,7 @@ public class Constants {
public final static String RESPONSE_SUCCESS = "SUCCESS";
public final static String DEFAULT_LANGUAGE = "en";
public final static String LANGUAGE = "LANGUAGE";
+ public final static String LOCALE = "LOCALE";
public final static String LANG = "lang";
public final static String BREADCRUMB = "BREADCRUMB";
@@ -56,6 +57,9 @@ public class Constants {
public final static String STATIC_URI = "/static";
public final static String FILES_URI = "/files";
public final static String PRODUCT_URI= "/product";
+ public final static String PRODUCTS_URI= "/products";
+ public final static String SMALL_IMAGE= "SMALL";
+ public final static String LARGE_IMAGE= "LARGE";
public final static String CATEGORY_URI = "/category";
public final static String PRODUCT_ID_URI= "/productid";
public final static String ORDER_DOWNLOAD_URI= "/order/download";
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/constants/EmailConstants.java b/sm-shop/src/main/java/com/salesmanager/shop/constants/EmailConstants.java
index f593983..3e5f2dd 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/constants/EmailConstants.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/constants/EmailConstants.java
@@ -1,88 +1,88 @@
-package com.salesmanager.shop.constants;
-
-public class EmailConstants {
-
- public static final String EMAIL_NEW_USER_TEXT = "EMAIL_NEW_USER_TEXT";
- public static final String EMAIL_USER_FIRSTNAME = "EMAIL_USER_FIRSTNAME";
- public static final String EMAIL_USER_LASTNAME = "EMAIL_USER_LASTNAME";
- public static final String EMAIL_ADMIN_USERNAME_LABEL = "EMAIL_ADMIN_USERNAME_LABEL";
- public static final String EMAIL_ADMIN_NAME = "EMAIL_ADMIN_NAME";
- public static final String EMAIL_TEXT_NEW_USER_CREATED = "EMAIL_TEXT_NEW_USER_CREATED";
- public static final String EMAIL_ADMIN_PASSWORD_LABEL = "EMAIL_ADMIN_PASSWORD_LABEL";
- public static final String EMAIL_ADMIN_PASSWORD = "EMAIL_ADMIN_PASSWORD";
-
-
- public static final String EMAIL_USERNAME_LABEL = "EMAIL_USERNAME_LABEL";
- public static final String EMAIL_PASSWORD_LABEL = "EMAIL_PASSWORD_LABEL";
- public static final String EMAIL_CUSTOMER_PASSWORD = "EMAIL_CUSTOMER_PASSWORD";
- public static final String EMAIL_CUSTOMER_NAME = "EMAIL_CUSTOMER_NAME";
- public static final String EMAIL_CUSTOMER_FIRSTNAME = "EMAIL_CUSTOMER_FIRSTNAME";
- public static final String EMAIL_CUSTOMER_LASTNAME = "EMAIL_CUSTOMER_LASTNAME";
- public static final String EMAIL_NOTIFICATION_MESSAGE = "EMAIL_NOTIFICATION_MESSAGE";
- public static final String EMAIL_CUSTOMER_GREETING = "EMAIL_CUSTOMER_GREETING";
- public static final String EMAIL_RESET_PASSWORD_TXT = "EMAIL_RESET_PASSWORD_TXT";
- public static final String EMAIL_USER_NAME = "EMAIL_USER_NAME";
- public static final String EMAIL_USER_PASSWORD = "EMAIL_USER_PASSWORD";
-
- public static final String EMAIL_TEXT_ORDER_NUMBER = "EMAIL_TEXT_ORDER_NUMBER";
- public static final String EMAIL_TEXT_DATE_ORDERED = "EMAIL_TEXT_DATE_ORDERED";
- public static final String EMAIL_TEXT_STATUS_COMMENTS = "EMAIL_TEXT_STATUS_COMMENTS";
- public static final String EMAIL_TEXT_DATE_UPDATED = "EMAIL_TEXT_DATE_UPDATED";
- public static final String EMAIL_ORDER_DETAILS_TITLE = "EMAIL_ORDER_DETAILS_TITLE";
- public static final String ORDER_PRODUCTS_DETAILS = "ORDER_PRODUCTS_DETAILS";
- public static final String ORDER_TOTALS = "ORDER_TOTALS";
- public static final String ORDER_STATUS = "ORDER_STATUS";
- public final static String EMAIL_ORDER_DOWNLOAD = "EMAIL_ORDER_DOWNLOAD";
-
- public static final String EMAIL_NEW_STORE_TEXT = "EMAIL_NEW_STORE_TEXT";
- public static final String EMAIL_STORE_NAME = "EMAIL_STORE_NAME";
- public static final String EMAIL_ADMIN_STORE_INFO_LABEL = "EMAIL_ADMIN_STORE_INFO_LABEL";
- public static final String EMAIL_ADMIN_USERNAME_TEXT = "EMAIL_ADMIN_USERNAME_TEXT";
- public static final String EMAIL_ADMIN_PASSWORD_TEXT = "EMAIL_ADMIN_PASSWORD_TEXT";
-
-
-
- public static final String EMAIL_CONTACT_OWNER = "EMAIL_CONTACT_OWNER";
- public static final String EMAIL_ADMIN_URL_LABEL = "EMAIL_ADMIN_URL_LABEL";
- public static final String EMAIL_ADMIN_URL = "EMAIL_ADMIN_URL";
-
- public static final String EMAIL_ORDER_CONFIRMATION_TITLE ="EMAIL_ORDER_CONFIRMATION_TITLE";
- public static final String EMAIL_ORDER_NUMBER ="EMAIL_ORDER_NUMBER";
- public static final String EMAIL_ORDER_DATE ="EMAIL_ORDER_DATE";
- public static final String EMAIL_ORDER_THANKS ="EMAIL_ORDER_THANKS";
- public static final String EMAIL_ORDER_STATUS_TEXT ="EMAIL_ORDER_STATUS_TEXT";
- public static final String EMAIL_ORDER_STATUS ="EMAIL_ORDER_STATUS";
- public static final String ADDRESS_BILLING_TITLE ="ADDRESS_BILLING_TITLE";
- public static final String ADDRESS_BILLING ="ADDRESS_BILLING";
- public static final String ADDRESS_SHIPPING ="ADDRESS_SHIPPING";
- public static final String ADDRESS_DELIVERY ="ADDRESS_DELIVERY";
- public static final String ADDRESS_SHIPPING_TITLE ="ADDRESS_SHIPPING_TITLE";
- public static final String PAYMENT_METHOD_TITLE ="PAYMENT_METHOD_TITLE";
- public static final String PAYMENT_METHOD_DETAILS ="PAYMENT_METHOD_DETAILS";
- public static final String SHIPPING_METHOD_DETAILS ="SHIPPING_METHOD_DETAILS";
- public static final String SHIPPING_METHOD_TITLE ="SHIPPING_METHOD_TITLE";
- public static final String ADDRESS_DELIVERY_TITLE ="ADDRESS_DELIVERY_TITLE";
-
- public static final String EMAIL_CUSTOMER_CONTACT ="EMAIL_CUSTOMER_CONTACT";
- public static final String EMAIL_CONTACT_NAME_LABEL ="EMAIL_CONTACT_NAME_LABEL";
- public static final String EMAIL_CONTACT_NAME ="EMAIL_CONTACT_NAME";
- public static final String EMAIL_CONTACT_EMAIL_LABEL ="EMAIL_CONTACT_EMAIL_LABEL";
- public static final String EMAIL_CONTACT_EMAIL ="EMAIL_CONTACT_EMAIL";
- public static final String EMAIL_CONTACT_CONTENT ="EMAIL_CONTACT_CONTENT";
-
-
-
- public final static String LABEL_HI = "LABEL_HI";
- public final static String CUSTOMER_ACCESS_LABEL = "CUSTOMER_ACCESS_LABEL";
- public final static String CUSTOMER_ACCESS_URL = "CUSTOMER_ACCESS_URL";
- public final static String ACCESS_NOW_LABEL = "ACCESS_NOW_LABEL";
-
- public static final String EMAIL_CUSTOMER_TPL = "email_template_customer.ftl";
- public static final String EMAIL_ORDER_TPL = "email_template_checkout.ftl";
- public static final String EMAIL_ORDER_DOWNLOAD_TPL = "email_template_checkout_download.ftl";
- public static final String ORDER_STATUS_TMPL = "email_template_order_status.ftl";
- public static final String EMAIL_CONTACT_TMPL = "email_template_contact.ftl";
- public static final String EMAIL_NOTIFICATION_TMPL = "email_template_notification.ftl";
-
-
-}
+package com.salesmanager.shop.constants;
+
+public class EmailConstants {
+
+ public static final String EMAIL_NEW_USER_TEXT = "EMAIL_NEW_USER_TEXT";
+ public static final String EMAIL_USER_FIRSTNAME = "EMAIL_USER_FIRSTNAME";
+ public static final String EMAIL_USER_LASTNAME = "EMAIL_USER_LASTNAME";
+ public static final String EMAIL_ADMIN_USERNAME_LABEL = "EMAIL_ADMIN_USERNAME_LABEL";
+ public static final String EMAIL_ADMIN_NAME = "EMAIL_ADMIN_NAME";
+ public static final String EMAIL_TEXT_NEW_USER_CREATED = "EMAIL_TEXT_NEW_USER_CREATED";
+ public static final String EMAIL_ADMIN_PASSWORD_LABEL = "EMAIL_ADMIN_PASSWORD_LABEL";
+ public static final String EMAIL_ADMIN_PASSWORD = "EMAIL_ADMIN_PASSWORD";
+
+
+ public static final String EMAIL_USERNAME_LABEL = "EMAIL_USERNAME_LABEL";
+ public static final String EMAIL_PASSWORD_LABEL = "EMAIL_PASSWORD_LABEL";
+ public static final String EMAIL_CUSTOMER_PASSWORD = "EMAIL_CUSTOMER_PASSWORD";
+ public static final String EMAIL_CUSTOMER_NAME = "EMAIL_CUSTOMER_NAME";
+ public static final String EMAIL_CUSTOMER_FIRSTNAME = "EMAIL_CUSTOMER_FIRSTNAME";
+ public static final String EMAIL_CUSTOMER_LASTNAME = "EMAIL_CUSTOMER_LASTNAME";
+ public static final String EMAIL_NOTIFICATION_MESSAGE = "EMAIL_NOTIFICATION_MESSAGE";
+ public static final String EMAIL_CUSTOMER_GREETING = "EMAIL_CUSTOMER_GREETING";
+ public static final String EMAIL_RESET_PASSWORD_TXT = "EMAIL_RESET_PASSWORD_TXT";
+ public static final String EMAIL_USER_NAME = "EMAIL_USER_NAME";
+ public static final String EMAIL_USER_PASSWORD = "EMAIL_USER_PASSWORD";
+
+ public static final String EMAIL_TEXT_ORDER_NUMBER = "EMAIL_TEXT_ORDER_NUMBER";
+ public static final String EMAIL_TEXT_DATE_ORDERED = "EMAIL_TEXT_DATE_ORDERED";
+ public static final String EMAIL_TEXT_STATUS_COMMENTS = "EMAIL_TEXT_STATUS_COMMENTS";
+ public static final String EMAIL_TEXT_DATE_UPDATED = "EMAIL_TEXT_DATE_UPDATED";
+ public static final String EMAIL_ORDER_DETAILS_TITLE = "EMAIL_ORDER_DETAILS_TITLE";
+ public static final String ORDER_PRODUCTS_DETAILS = "ORDER_PRODUCTS_DETAILS";
+ public static final String ORDER_TOTALS = "ORDER_TOTALS";
+ public static final String ORDER_STATUS = "ORDER_STATUS";
+ public final static String EMAIL_ORDER_DOWNLOAD = "EMAIL_ORDER_DOWNLOAD";
+
+ public static final String EMAIL_NEW_STORE_TEXT = "EMAIL_NEW_STORE_TEXT";
+ public static final String EMAIL_STORE_NAME = "EMAIL_STORE_NAME";
+ public static final String EMAIL_ADMIN_STORE_INFO_LABEL = "EMAIL_ADMIN_STORE_INFO_LABEL";
+ public static final String EMAIL_ADMIN_USERNAME_TEXT = "EMAIL_ADMIN_USERNAME_TEXT";
+ public static final String EMAIL_ADMIN_PASSWORD_TEXT = "EMAIL_ADMIN_PASSWORD_TEXT";
+
+
+
+ public static final String EMAIL_CONTACT_OWNER = "EMAIL_CONTACT_OWNER";
+ public static final String EMAIL_ADMIN_URL_LABEL = "EMAIL_ADMIN_URL_LABEL";
+ public static final String EMAIL_ADMIN_URL = "EMAIL_ADMIN_URL";
+
+ public static final String EMAIL_ORDER_CONFIRMATION_TITLE ="EMAIL_ORDER_CONFIRMATION_TITLE";
+ public static final String EMAIL_ORDER_NUMBER ="EMAIL_ORDER_NUMBER";
+ public static final String EMAIL_ORDER_DATE ="EMAIL_ORDER_DATE";
+ public static final String EMAIL_ORDER_THANKS ="EMAIL_ORDER_THANKS";
+ public static final String EMAIL_ORDER_STATUS_TEXT ="EMAIL_ORDER_STATUS_TEXT";
+ public static final String EMAIL_ORDER_STATUS ="EMAIL_ORDER_STATUS";
+ public static final String ADDRESS_BILLING_TITLE ="ADDRESS_BILLING_TITLE";
+ public static final String ADDRESS_BILLING ="ADDRESS_BILLING";
+ public static final String ADDRESS_SHIPPING ="ADDRESS_SHIPPING";
+ public static final String ADDRESS_DELIVERY ="ADDRESS_DELIVERY";
+ public static final String ADDRESS_SHIPPING_TITLE ="ADDRESS_SHIPPING_TITLE";
+ public static final String PAYMENT_METHOD_TITLE ="PAYMENT_METHOD_TITLE";
+ public static final String PAYMENT_METHOD_DETAILS ="PAYMENT_METHOD_DETAILS";
+ public static final String SHIPPING_METHOD_DETAILS ="SHIPPING_METHOD_DETAILS";
+ public static final String SHIPPING_METHOD_TITLE ="SHIPPING_METHOD_TITLE";
+ public static final String ADDRESS_DELIVERY_TITLE ="ADDRESS_DELIVERY_TITLE";
+
+ public static final String EMAIL_CUSTOMER_CONTACT ="EMAIL_CUSTOMER_CONTACT";
+ public static final String EMAIL_CONTACT_NAME_LABEL ="EMAIL_CONTACT_NAME_LABEL";
+ public static final String EMAIL_CONTACT_NAME ="EMAIL_CONTACT_NAME";
+ public static final String EMAIL_CONTACT_EMAIL_LABEL ="EMAIL_CONTACT_EMAIL_LABEL";
+ public static final String EMAIL_CONTACT_EMAIL ="EMAIL_CONTACT_EMAIL";
+ public static final String EMAIL_CONTACT_CONTENT ="EMAIL_CONTACT_CONTENT";
+
+
+
+ public final static String LABEL_HI = "LABEL_HI";
+ public final static String CUSTOMER_ACCESS_LABEL = "CUSTOMER_ACCESS_LABEL";
+ public final static String CUSTOMER_ACCESS_URL = "CUSTOMER_ACCESS_URL";
+ public final static String ACCESS_NOW_LABEL = "ACCESS_NOW_LABEL";
+
+ public static final String EMAIL_CUSTOMER_TPL = "email_template_customer.ftl";
+ public static final String EMAIL_ORDER_TPL = "email_template_checkout.ftl";
+ public static final String EMAIL_ORDER_DOWNLOAD_TPL = "email_template_checkout_download.ftl";
+ public static final String ORDER_STATUS_TMPL = "email_template_order_status.ftl";
+ public static final String EMAIL_CONTACT_TMPL = "email_template_contact.ftl";
+ public static final String EMAIL_NOTIFICATION_TMPL = "email_template_notification.ftl";
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/controller/FilesController.java b/sm-shop/src/main/java/com/salesmanager/shop/controller/FilesController.java
index 177221c..e47af3e 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/controller/FilesController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/controller/FilesController.java
@@ -1,92 +1,92 @@
-package com.salesmanager.shop.controller;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.content.ContentService;
-import com.salesmanager.core.model.content.FileContentType;
-import com.salesmanager.core.model.content.OutputContentFile;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.store.controller.AbstractController;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-@Controller
-public class FilesController extends AbstractController {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(FilesController.class);
-
-
-
- @Inject
- private ContentService contentService;
-
-
- /**
- * Serves static files (css, js ...) the repository is a single node by merchant
- * @param storeCode
- * @param extension
- * @return
- * @throws IOException
- * @throws ServiceException
- */
- @RequestMapping("/static/files/{storeCode}/{fileName}.{extension}")
- public @ResponseBody byte[] downloadFile(@PathVariable final String storeCode, @PathVariable final String fileName, @PathVariable final String extension, HttpServletRequest request, HttpServletResponse response) throws IOException, ServiceException {
-
- // example -> /files/<store code>/myfile.css
- FileContentType fileType = FileContentType.STATIC_FILE;
-
- // needs to query the new API
- OutputContentFile file =contentService.getContentFile(storeCode, fileType, new StringBuilder().append(fileName).append(".").append(extension).toString());
-
-
- if(file!=null) {
- return file.getFile().toByteArray();
- } else {
- LOGGER.debug("File not found " + fileName + "." + extension);
- response.sendError(404, Constants.FILE_NOT_FOUND);
- return null;
- }
- }
-
- /**
- * Requires admin with roles admin, superadmin or product
- * @param storeCode
- * @param fileName
- * @param extension
- * @param request
- * @param response
- * @return
- * @throws Exception
- */
- @PreAuthorize("hasRole('PRODUCTS')")
- @RequestMapping("/admin/files/downloads/{storeCode}/{fileName}.{extension}")
- public @ResponseBody byte[] downloadProduct(@PathVariable final String storeCode, @PathVariable final String fileName, @PathVariable final String extension, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
- FileContentType fileType = FileContentType.PRODUCT_DIGITAL;
-
- String fileNameAndExtension = new StringBuilder().append(fileName).append(".").append(extension).toString();
-
- // needs to query the new API
- OutputContentFile file = contentService.getContentFile(storeCode, fileType, fileNameAndExtension);
-
-
- if(file!=null) {
- response.setHeader("Content-Disposition", "attachment; filename=\"" + fileNameAndExtension + "\"");
- return file.getFile().toByteArray();
- } else {
- LOGGER.debug("File not found " + fileName + "." + extension);
- response.sendError(404, Constants.FILE_NOT_FOUND);
- return null;
- }
- }
-
-}
+package com.salesmanager.shop.controller;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.content.ContentService;
+import com.salesmanager.core.model.content.FileContentType;
+import com.salesmanager.core.model.content.OutputContentFile;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.store.controller.AbstractController;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+@Controller
+public class FilesController extends AbstractController {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(FilesController.class);
+
+
+
+ @Inject
+ private ContentService contentService;
+
+
+ /**
+ * Serves static files (css, js ...) the repository is a single node by merchant
+ * @param storeCode
+ * @param extension
+ * @return
+ * @throws IOException
+ * @throws ServiceException
+ */
+ @RequestMapping("/static/files/{storeCode}/{fileName}.{extension}")
+ public @ResponseBody byte[] downloadFile(@PathVariable final String storeCode, @PathVariable final String fileName, @PathVariable final String extension, HttpServletRequest request, HttpServletResponse response) throws IOException, ServiceException {
+
+ // example -> /files/<store code>/myfile.css
+ FileContentType fileType = FileContentType.STATIC_FILE;
+
+ // needs to query the new API
+ OutputContentFile file =contentService.getContentFile(storeCode, fileType, new StringBuilder().append(fileName).append(".").append(extension).toString());
+
+
+ if(file!=null) {
+ return file.getFile().toByteArray();
+ } else {
+ LOGGER.debug("File not found " + fileName + "." + extension);
+ response.sendError(404, Constants.FILE_NOT_FOUND);
+ return null;
+ }
+ }
+
+ /**
+ * Requires admin with roles admin, superadmin or product
+ * @param storeCode
+ * @param fileName
+ * @param extension
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @PreAuthorize("hasRole('PRODUCTS')")
+ @RequestMapping("/admin/files/downloads/{storeCode}/{fileName}.{extension}")
+ public @ResponseBody byte[] downloadProduct(@PathVariable final String storeCode, @PathVariable final String fileName, @PathVariable final String extension, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ FileContentType fileType = FileContentType.PRODUCT_DIGITAL;
+
+ String fileNameAndExtension = new StringBuilder().append(fileName).append(".").append(extension).toString();
+
+ // needs to query the new API
+ OutputContentFile file = contentService.getContentFile(storeCode, fileType, fileNameAndExtension);
+
+
+ if(file!=null) {
+ response.setHeader("Content-Disposition", "attachment; filename=\"" + fileNameAndExtension + "\"");
+ return file.getFile().toByteArray();
+ } else {
+ LOGGER.debug("File not found " + fileName + "." + extension);
+ response.sendError(404, Constants.FILE_NOT_FOUND);
+ return null;
+ }
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/controller/ImagesController.java b/sm-shop/src/main/java/com/salesmanager/shop/controller/ImagesController.java
index d835eba..4f513b2 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/controller/ImagesController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/controller/ImagesController.java
@@ -1,234 +1,234 @@
-package com.salesmanager.shop.controller;
-
-import java.io.IOException;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.catalog.product.image.ProductImageService;
-import com.salesmanager.core.business.services.content.ContentService;
-import com.salesmanager.core.model.catalog.product.file.ProductImageSize;
-import com.salesmanager.core.model.content.FileContentType;
-import com.salesmanager.core.model.content.OutputContentFile;
-
-/**
- * When handling images and files from the application server
- * @author c.samson
- *
- */
-@Controller
-public class ImagesController {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ImagesController.class);
-
-
-
- @Inject
- private ContentService contentService;
-
- @Inject
- private ProductImageService productImageService;
-
- /**
- * Logo, content image
- * @param storeId
- * @param imageType (LOGO, CONTENT, IMAGE)
- * @param imageName
- * @return
- * @throws IOException
- * @throws ServiceException
- */
- @RequestMapping("/static/files/{storeCode}/{imageType}/{imageName}.{extension}")
- public @ResponseBody byte[] printImage(@PathVariable final String storeCode, @PathVariable final String imageType, @PathVariable final String imageName, @PathVariable final String extension) throws IOException, ServiceException {
-
- // example -> /static/files/DEFAULT/CONTENT/myImage.png
-
- FileContentType imgType = null;
-
- if(FileContentType.LOGO.name().equals(imageType)) {
- imgType = FileContentType.LOGO;
- }
-
- if(FileContentType.IMAGE.name().equals(imageType)) {
- imgType = FileContentType.IMAGE;
- }
-
- if(FileContentType.PROPERTY.name().equals(imageType)) {
- imgType = FileContentType.PROPERTY;
- }
-
- OutputContentFile image =contentService.getContentFile(storeCode, imgType, new StringBuilder().append(imageName).append(".").append(extension).toString());
-
-
- if(image!=null) {
- return image.getFile().toByteArray();
- } else {
- //empty image placeholder
- return null;
- }
-
- }
-
-
- /**
- * For product images
- * @Deprecated
- * @param storeCode
- * @param productCode
- * @param imageType
- * @param imageName
- * @param extension
- * @return
- * @throws IOException
- */
- @RequestMapping("/static/{storeCode}/{imageType}/{productCode}/{imageName}.{extension}")
- public @ResponseBody byte[] printImage(@PathVariable final String storeCode, @PathVariable final String productCode, @PathVariable final String imageType, @PathVariable final String imageName, @PathVariable final String extension) throws IOException {
-
- // product image
- // example small product image -> /static/DEFAULT/products/TB12345/product1.jpg
-
- // example large product image -> /static/DEFAULT/products/TB12345/product1.jpg
-
-
- /**
- * List of possible imageType
- *
- */
-
-
- ProductImageSize size = ProductImageSize.SMALL;
-
- if(imageType.equals(FileContentType.PRODUCTLG.name())) {
- size = ProductImageSize.LARGE;
- }
-
-
-
- OutputContentFile image = null;
- try {
- image = productImageService.getProductImage(storeCode, productCode, new StringBuilder().append(imageName).append(".").append(extension).toString(), size);
- } catch (ServiceException e) {
- LOGGER.error("Cannot retrieve image " + imageName, e);
- }
- if(image!=null) {
- return image.getFile().toByteArray();
- } else {
- //empty image placeholder
- return null;
- }
-
- }
-
- /**
- * Exclusive method for dealing with product images
- * @param storeCode
- * @param productCode
- * @param imageName
- * @param extension
- * @param request
- * @return
- * @throws IOException
- */
- @RequestMapping("/static/products/{storeCode}/{productCode}/{imageSize}/{imageName}.{extension}")
- public @ResponseBody byte[] printImage(@PathVariable final String storeCode, @PathVariable final String productCode, @PathVariable final String imageSize, @PathVariable final String imageName, @PathVariable final String extension, HttpServletRequest request) throws IOException {
-
- // product image small
- // example small product image -> /static/products/DEFAULT/TB12345/SMALL/product1.jpg
-
- // example large product image -> /static/products/DEFAULT/TB12345/LARGE/product1.jpg
-
-
- /**
- * List of possible imageType
- *
- */
-
-
- ProductImageSize size = ProductImageSize.SMALL;
-
- if(FileContentType.PRODUCTLG.name().equals(imageSize)) {
- size = ProductImageSize.LARGE;
- }
-
-
-
-
- OutputContentFile image = null;
- try {
- image = productImageService.getProductImage(storeCode, productCode, new StringBuilder().append(imageName).append(".").append(extension).toString(), size);
- } catch (ServiceException e) {
- LOGGER.error("Cannot retrieve image " + imageName, e);
- }
- if(image!=null) {
- return image.getFile().toByteArray();
- } else {
- //empty image placeholder
- return null;
- }
-
- }
-
- /**
- * Exclusive method for dealing with product images
- * @param storeCode
- * @param productCode
- * @param imageName
- * @param extension
- * @param request
- * @return
- * @throws IOException
- */
- @RequestMapping("/static/products/{storeCode}/{productCode}/{imageName}.{extension}")
- public @ResponseBody byte[] printImage(@PathVariable final String storeCode, @PathVariable final String productCode, @PathVariable final String imageName, @PathVariable final String extension, HttpServletRequest request) throws IOException {
-
- // product image
- // example small product image -> /static/products/DEFAULT/TB12345/product1.jpg?size=small
-
- // example large product image -> /static/products/DEFAULT/TB12345/product1.jpg
- // or
- //example large product image -> /static/products/DEFAULT/TB12345/product1.jpg?size=large
-
-
- /**
- * List of possible imageType
- *
- */
-
-
- ProductImageSize size = ProductImageSize.LARGE;
-
-
- if(StringUtils.isNotBlank(request.getParameter("size"))) {
- String requestSize = request.getParameter("size");
- if(requestSize.equals(ProductImageSize.SMALL.name())) {
- size = ProductImageSize.SMALL;
- }
- }
-
-
-
- OutputContentFile image = null;
- try {
- image = productImageService.getProductImage(storeCode, productCode, new StringBuilder().append(imageName).append(".").append(extension).toString(), size);
- } catch (ServiceException e) {
- LOGGER.error("Cannot retrieve image " + imageName, e);
- }
- if(image!=null) {
- return image.getFile().toByteArray();
- } else {
- //empty image placeholder
- return null;
- }
-
- }
-
-}
+package com.salesmanager.shop.controller;
+
+import java.io.IOException;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.catalog.product.image.ProductImageService;
+import com.salesmanager.core.business.services.content.ContentService;
+import com.salesmanager.core.model.catalog.product.file.ProductImageSize;
+import com.salesmanager.core.model.content.FileContentType;
+import com.salesmanager.core.model.content.OutputContentFile;
+
+/**
+ * When handling images and files from the application server
+ * @author c.samson
+ *
+ */
+@Controller
+public class ImagesController {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ImagesController.class);
+
+
+
+ @Inject
+ private ContentService contentService;
+
+ @Inject
+ private ProductImageService productImageService;
+
+ /**
+ * Logo, content image
+ * @param storeId
+ * @param imageType (LOGO, CONTENT, IMAGE)
+ * @param imageName
+ * @return
+ * @throws IOException
+ * @throws ServiceException
+ */
+ @RequestMapping("/static/files/{storeCode}/{imageType}/{imageName}.{extension}")
+ public @ResponseBody byte[] printImage(@PathVariable final String storeCode, @PathVariable final String imageType, @PathVariable final String imageName, @PathVariable final String extension) throws IOException, ServiceException {
+
+ // example -> /static/files/DEFAULT/CONTENT/myImage.png
+
+ FileContentType imgType = null;
+
+ if(FileContentType.LOGO.name().equals(imageType)) {
+ imgType = FileContentType.LOGO;
+ }
+
+ if(FileContentType.IMAGE.name().equals(imageType)) {
+ imgType = FileContentType.IMAGE;
+ }
+
+ if(FileContentType.PROPERTY.name().equals(imageType)) {
+ imgType = FileContentType.PROPERTY;
+ }
+
+ OutputContentFile image =contentService.getContentFile(storeCode, imgType, new StringBuilder().append(imageName).append(".").append(extension).toString());
+
+
+ if(image!=null) {
+ return image.getFile().toByteArray();
+ } else {
+ //empty image placeholder
+ return null;
+ }
+
+ }
+
+
+ /**
+ * For product images
+ * @Deprecated
+ * @param storeCode
+ * @param productCode
+ * @param imageType
+ * @param imageName
+ * @param extension
+ * @return
+ * @throws IOException
+ */
+ @RequestMapping("/static/{storeCode}/{imageType}/{productCode}/{imageName}.{extension}")
+ public @ResponseBody byte[] printImage(@PathVariable final String storeCode, @PathVariable final String productCode, @PathVariable final String imageType, @PathVariable final String imageName, @PathVariable final String extension) throws IOException {
+
+ // product image
+ // example small product image -> /static/DEFAULT/products/TB12345/product1.jpg
+
+ // example large product image -> /static/DEFAULT/products/TB12345/product1.jpg
+
+
+ /**
+ * List of possible imageType
+ *
+ */
+
+
+ ProductImageSize size = ProductImageSize.SMALL;
+
+ if(imageType.equals(FileContentType.PRODUCTLG.name())) {
+ size = ProductImageSize.LARGE;
+ }
+
+
+
+ OutputContentFile image = null;
+ try {
+ image = productImageService.getProductImage(storeCode, productCode, new StringBuilder().append(imageName).append(".").append(extension).toString(), size);
+ } catch (ServiceException e) {
+ LOGGER.error("Cannot retrieve image " + imageName, e);
+ }
+ if(image!=null) {
+ return image.getFile().toByteArray();
+ } else {
+ //empty image placeholder
+ return null;
+ }
+
+ }
+
+ /**
+ * Exclusive method for dealing with product images
+ * @param storeCode
+ * @param productCode
+ * @param imageName
+ * @param extension
+ * @param request
+ * @return
+ * @throws IOException
+ */
+ @RequestMapping("/static/products/{storeCode}/{productCode}/{imageSize}/{imageName}.{extension}")
+ public @ResponseBody byte[] printImage(@PathVariable final String storeCode, @PathVariable final String productCode, @PathVariable final String imageSize, @PathVariable final String imageName, @PathVariable final String extension, HttpServletRequest request) throws IOException {
+
+ // product image small
+ // example small product image -> /static/products/DEFAULT/TB12345/SMALL/product1.jpg
+
+ // example large product image -> /static/products/DEFAULT/TB12345/LARGE/product1.jpg
+
+
+ /**
+ * List of possible imageType
+ *
+ */
+
+
+ ProductImageSize size = ProductImageSize.SMALL;
+
+ if(FileContentType.PRODUCTLG.name().equals(imageSize)) {
+ size = ProductImageSize.LARGE;
+ }
+
+
+
+
+ OutputContentFile image = null;
+ try {
+ image = productImageService.getProductImage(storeCode, productCode, new StringBuilder().append(imageName).append(".").append(extension).toString(), size);
+ } catch (ServiceException e) {
+ LOGGER.error("Cannot retrieve image " + imageName, e);
+ }
+ if(image!=null) {
+ return image.getFile().toByteArray();
+ } else {
+ //empty image placeholder
+ return null;
+ }
+
+ }
+
+ /**
+ * Exclusive method for dealing with product images
+ * @param storeCode
+ * @param productCode
+ * @param imageName
+ * @param extension
+ * @param request
+ * @return
+ * @throws IOException
+ */
+ @RequestMapping("/static/products/{storeCode}/{productCode}/{imageName}.{extension}")
+ public @ResponseBody byte[] printImage(@PathVariable final String storeCode, @PathVariable final String productCode, @PathVariable final String imageName, @PathVariable final String extension, HttpServletRequest request) throws IOException {
+
+ // product image
+ // example small product image -> /static/products/DEFAULT/TB12345/product1.jpg?size=small
+
+ // example large product image -> /static/products/DEFAULT/TB12345/product1.jpg
+ // or
+ //example large product image -> /static/products/DEFAULT/TB12345/product1.jpg?size=large
+
+
+ /**
+ * List of possible imageType
+ *
+ */
+
+
+ ProductImageSize size = ProductImageSize.LARGE;
+
+
+ if(StringUtils.isNotBlank(request.getParameter("size"))) {
+ String requestSize = request.getParameter("size");
+ if(requestSize.equals(ProductImageSize.SMALL.name())) {
+ size = ProductImageSize.SMALL;
+ }
+ }
+
+
+
+ OutputContentFile image = null;
+ try {
+ image = productImageService.getProductImage(storeCode, productCode, new StringBuilder().append(imageName).append(".").append(extension).toString(), size);
+ } catch (ServiceException e) {
+ LOGGER.error("Cannot retrieve image " + imageName, e);
+ }
+ if(image!=null) {
+ return image.getFile().toByteArray();
+ } else {
+ //empty image placeholder
+ return null;
+ }
+
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/filter/CorsFilter.java b/sm-shop/src/main/java/com/salesmanager/shop/filter/CorsFilter.java
new file mode 100644
index 0000000..3e892ea
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/filter/CorsFilter.java
@@ -0,0 +1,38 @@
+package com.salesmanager.shop.filter;
+
+import java.io.IOException;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletResponse;
+
+public class CorsFilter implements Filter {
+
+
+
+ @Override
+ public void destroy() {
+ }
+ @Override
+ public void init(FilterConfig filterConfig) throws ServletException {
+ // TODO Auto-generated method stub
+
+ }
+ @Override
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
+ throws IOException, ServletException {
+ HttpServletResponse httpResponse = (HttpServletResponse) response;
+
+ httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");
+ httpResponse.setHeader("Access-Control-Allow-Headers", "X-Auth-Token, Content-Type");
+ //httpResponse.setHeader("Access-Control-Allow-Credentials", "false");
+ //httpResponse.setHeader("Access-Control-Max-Age", "4800");
+ //System.out.println("---CORS Configuration Completed---");
+ chain.doFilter(request, response);
+
+ }
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/filter/StoreFilter.java b/sm-shop/src/main/java/com/salesmanager/shop/filter/StoreFilter.java
index 7d6ef05..8216d5f 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/filter/StoreFilter.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/filter/StoreFilter.java
@@ -241,7 +241,8 @@ public class StoreFilter extends HandlerInterceptorAdapter {
request.setAttribute(Constants.LANGUAGE, language);
- Locale locale = languageService.toLocale(language);
+ Locale locale = languageService.toLocale(language, store);
+ request.setAttribute(Constants.LOCALE, locale);
//Locale locale = LocaleContextHolder.getLocale();
LocaleContextHolder.setLocale(locale);
@@ -606,7 +607,7 @@ public class StoreFilter extends HandlerInterceptorAdapter {
if(objects==null) {
//load categories
- loadedCategories = categoryFacade.getCategoryHierarchy(store, 0, language);
+ loadedCategories = categoryFacade.getCategoryHierarchy(store, 0, language, null);//null filter
objects = new ConcurrentHashMap<String, List<ReadableCategory>>();
objects.put(language.getCode(), loadedCategories);
webApplicationCache.putInCache(categoriesKey.toString(), objects);
@@ -616,7 +617,7 @@ public class StoreFilter extends HandlerInterceptorAdapter {
}
} else {
- loadedCategories = categoryFacade.getCategoryHierarchy(store, 0, language);
+ loadedCategories = categoryFacade.getCategoryHierarchy(store, 0, language, null);//null filter
}
if(loadedCategories!=null) {
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/init/data/InitializationLoader.java b/sm-shop/src/main/java/com/salesmanager/shop/init/data/InitializationLoader.java
index b08372b..a620e96 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/init/data/InitializationLoader.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/init/data/InitializationLoader.java
@@ -1,179 +1,186 @@
-package com.salesmanager.shop.init.data;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.salesmanager.core.business.constants.SystemConstants;
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.merchant.MerchantStoreService;
-import com.salesmanager.core.business.services.reference.init.InitializationDatabase;
-import com.salesmanager.core.business.services.system.MerchantConfigurationService;
-import com.salesmanager.core.business.services.system.SystemConfigurationService;
-import com.salesmanager.core.business.services.user.GroupService;
-import com.salesmanager.core.business.services.user.PermissionService;
-import com.salesmanager.core.business.utils.CoreConfiguration;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.system.MerchantConfig;
-import com.salesmanager.core.model.system.SystemConfiguration;
-import com.salesmanager.core.model.user.Group;
-import com.salesmanager.core.model.user.GroupType;
-import com.salesmanager.core.model.user.Permission;
-import com.salesmanager.shop.admin.model.permission.Permissions;
-import com.salesmanager.shop.admin.model.permission.ShopPermission;
-import com.salesmanager.shop.admin.security.WebUserServices;
-import com.salesmanager.shop.constants.ApplicationConstants;
-
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.core.io.ResourceLoader;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.annotation.PostConstruct;
-import javax.inject.Inject;
-import javax.xml.transform.stream.StreamSource;
-
-
-@Component
-public class InitializationLoader {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(InitializationLoader.class);
-
-
- @Inject
- private MerchantConfigurationService merchantConfigurationService;
-
-
- @Inject
- private InitializationDatabase initializationDatabase;
-
- @Inject
- private InitData initData;
-
- @Inject
- private SystemConfigurationService systemConfigurationService;
-
- @Inject
- private WebUserServices userDetailsService;
-
- @Inject
- protected PermissionService permissionService;
-
- @Inject
- protected GroupService groupService;
-
- @Inject
- private CoreConfiguration configuration;
-
- @Inject
- protected MerchantStoreService merchantService;
-
- @Inject
- private ObjectMapper jacksonObjectMapper;
-
- @Inject
- private ResourceLoader resourceLoader;
-
- @PostConstruct
- public void init() {
-
- try {
-
- if (initializationDatabase.isEmpty()) {
-
- File permissionXML=resourceLoader.getResource("classpath:/permission/permission.json").getFile();
- StreamSource xmlSource = new StreamSource(permissionXML);
- //Permissions permissions= (Permissions) jaxb2Marshaller.unmarshal(xmlSource);
-
- Permissions permissions= jacksonObjectMapper.readValue(permissionXML,Permissions.class);
-
- //All default data to be created
-
- LOGGER.info(String.format("%s : Shopizer database is empty, populate it....", "sm-shop"));
-
- initializationDatabase.populate("sm-shop");
-
- MerchantStore store = merchantService.getByCode(MerchantStore.DEFAULT_STORE);
-
- //security groups and permissions
-
- Map<String, Group> groupMap = new HashMap<String,Group>();
- if(CollectionUtils.isNotEmpty(permissions.getShopPermission())){
-
- for(ShopPermission shopPermission : permissions.getShopPermission()){
-
- Permission permission = new Permission(shopPermission.getType());
-
- for(String groupName: shopPermission.getShopGroup().getName()){
- if(groupMap.get(groupName) == null){
- Group group = new Group(groupName);
- group.setGroupType(GroupType.ADMIN);
- groupService.create(group);
- groupMap.put(groupName,group);
- permission.getGroups().add(group);
- }
- else{
- permission.getGroups().add(groupMap.get(groupName)) ;
- }
- permissionService.create( permission);
- }
-
-
- }
- }
-
- userDetailsService.createDefaultAdmin();
- MerchantConfig config = new MerchantConfig();
- config.setAllowPurchaseItems(true);
- config.setDisplayAddToCartOnFeaturedItems(true);
-
- merchantConfigurationService.saveMerchantConfig(config, store);
-
- loadData();
-
- }
-
- } catch (Exception e) {
- LOGGER.error("Error in the init method",e);
- }
-
-
-
- }
-
- private void loadData() throws ServiceException {
-
- String loadTestData = configuration.getProperty(ApplicationConstants.POPULATE_TEST_DATA);
- boolean loadData = !StringUtils.isBlank(loadTestData) && loadTestData.equals(SystemConstants.CONFIG_VALUE_TRUE);
-
-
- if(loadData) {
-
- SystemConfiguration configuration = systemConfigurationService.getByKey(ApplicationConstants.TEST_DATA_LOADED);
-
- if(configuration!=null) {
- if(configuration.getKey().equals(ApplicationConstants.TEST_DATA_LOADED)) {
- if(configuration.getValue().equals(SystemConstants.CONFIG_VALUE_TRUE)) {
- return;
- }
- }
- }
-
- initData.initInitialData();
-
- configuration = new SystemConfiguration();
- configuration.getAuditSection().setModifiedBy(SystemConstants.SYSTEM_USER);
- configuration.setKey(ApplicationConstants.TEST_DATA_LOADED);
- configuration.setValue(SystemConstants.CONFIG_VALUE_TRUE);
- systemConfigurationService.create(configuration);
-
-
- }
- }
-
-
-
-}
+package com.salesmanager.shop.init.data;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.salesmanager.core.business.constants.SystemConstants;
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.merchant.MerchantStoreService;
+import com.salesmanager.core.business.services.reference.init.InitializationDatabase;
+import com.salesmanager.core.business.services.system.MerchantConfigurationService;
+import com.salesmanager.core.business.services.system.SystemConfigurationService;
+import com.salesmanager.core.business.services.user.GroupService;
+import com.salesmanager.core.business.services.user.PermissionService;
+import com.salesmanager.core.business.utils.CoreConfiguration;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.system.MerchantConfig;
+import com.salesmanager.core.model.system.SystemConfiguration;
+import com.salesmanager.core.model.user.Group;
+import com.salesmanager.core.model.user.GroupType;
+import com.salesmanager.core.model.user.Permission;
+import com.salesmanager.shop.admin.model.permission.Permissions;
+import com.salesmanager.shop.admin.model.permission.ShopPermission;
+import com.salesmanager.shop.admin.security.WebUserServices;
+import com.salesmanager.shop.constants.ApplicationConstants;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.io.ResourceLoader;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.annotation.PostConstruct;
+import javax.inject.Inject;
+import javax.xml.transform.stream.StreamSource;
+
+
+@Component
+public class InitializationLoader {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(InitializationLoader.class);
+
+
+ @Inject
+ private MerchantConfigurationService merchantConfigurationService;
+
+
+ @Inject
+ private InitializationDatabase initializationDatabase;
+
+ @Inject
+ private InitData initData;
+
+ @Inject
+ private SystemConfigurationService systemConfigurationService;
+
+ @Inject
+ private WebUserServices userDetailsService;
+
+ @Inject
+ protected PermissionService permissionService;
+
+ @Inject
+ protected GroupService groupService;
+
+ @Inject
+ private CoreConfiguration configuration;
+
+ @Inject
+ protected MerchantStoreService merchantService;
+
+ @Inject
+ private ObjectMapper jacksonObjectMapper;
+
+ @Inject
+ private ResourceLoader resourceLoader;
+
+ @PostConstruct
+ public void init() {
+
+ try {
+
+ if (initializationDatabase.isEmpty()) {
+ //InputStream in =
+ // this.getClass().getClassLoader().getResourceAsStream("/permission/permission.json");
+
+
+ org.springframework.core.io.Resource permissionXML=resourceLoader.getResource("classpath:/permission/permission.json");
+
+ InputStream xmlSource = permissionXML.getInputStream();
+
+ //File permissionXML=resourceLoader.getResource("classpath:/permission/permission.json").getFile();
+ //StreamSource xmlSource = new StreamSource(permissionXML);
+
+ Permissions permissions= jacksonObjectMapper.readValue(xmlSource,Permissions.class);
+
+ //All default data to be created
+
+ LOGGER.info(String.format("%s : Shopizer database is empty, populate it....", "sm-shop"));
+
+ initializationDatabase.populate("sm-shop");
+
+ MerchantStore store = merchantService.getByCode(MerchantStore.DEFAULT_STORE);
+
+ //security groups and permissions
+
+ Map<String, Group> groupMap = new HashMap<String,Group>();
+ if(CollectionUtils.isNotEmpty(permissions.getShopPermission())){
+
+ for(ShopPermission shopPermission : permissions.getShopPermission()){
+
+ Permission permission = new Permission(shopPermission.getType());
+
+ for(String groupName: shopPermission.getShopGroup().getName()){
+ if(groupMap.get(groupName) == null){
+ Group group = new Group(groupName);
+ group.setGroupType(GroupType.ADMIN);
+ groupService.create(group);
+ groupMap.put(groupName,group);
+ permission.getGroups().add(group);
+ }
+ else{
+ permission.getGroups().add(groupMap.get(groupName)) ;
+ }
+ permissionService.create( permission);
+ }
+
+
+ }
+ }
+
+ userDetailsService.createDefaultAdmin();
+ MerchantConfig config = new MerchantConfig();
+ config.setAllowPurchaseItems(true);
+ config.setDisplayAddToCartOnFeaturedItems(true);
+
+ merchantConfigurationService.saveMerchantConfig(config, store);
+
+ loadData();
+
+ }
+
+ } catch (Exception e) {
+ LOGGER.error("Error in the init method",e);
+ }
+
+
+
+ }
+
+ private void loadData() throws ServiceException {
+
+ String loadTestData = configuration.getProperty(ApplicationConstants.POPULATE_TEST_DATA);
+ boolean loadData = !StringUtils.isBlank(loadTestData) && loadTestData.equals(SystemConstants.CONFIG_VALUE_TRUE);
+
+
+ if(loadData) {
+
+ SystemConfiguration configuration = systemConfigurationService.getByKey(ApplicationConstants.TEST_DATA_LOADED);
+
+ if(configuration!=null) {
+ if(configuration.getKey().equals(ApplicationConstants.TEST_DATA_LOADED)) {
+ if(configuration.getValue().equals(SystemConstants.CONFIG_VALUE_TRUE)) {
+ return;
+ }
+ }
+ }
+
+ initData.initInitialData();
+
+ configuration = new SystemConfiguration();
+ configuration.getAuditSection().setModifiedBy(SystemConstants.SYSTEM_USER);
+ configuration.setKey(ApplicationConstants.TEST_DATA_LOADED);
+ configuration.setValue(SystemConstants.CONFIG_VALUE_TRUE);
+ systemConfigurationService.create(configuration);
+
+
+ }
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/CatalogEntity.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/CatalogEntity.java
index d456fe5..9a73413 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/CatalogEntity.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/CatalogEntity.java
@@ -1,64 +1,64 @@
-package com.salesmanager.shop.model.catalog;
-
-import java.io.Serializable;
-
-import com.salesmanager.shop.model.ShopEntity;
-
-
-public abstract class CatalogEntity extends ShopEntity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String name;
- private String description;
- private String friendlyUrl;
- private String keyWords;
- private String highlights;
- private String metaDescription;
- private String title;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getDescription() {
- return description;
- }
- public void setDescription(String description) {
- this.description = description;
- }
- public String getFriendlyUrl() {
- return friendlyUrl;
- }
- public void setFriendlyUrl(String friendlyUrl) {
- this.friendlyUrl = friendlyUrl;
- }
- public String getKeyWords() {
- return keyWords;
- }
- public void setKeyWords(String keyWords) {
- this.keyWords = keyWords;
- }
- public String getHighlights() {
- return highlights;
- }
- public void setHighlights(String highlights) {
- this.highlights = highlights;
- }
- public String getMetaDescription() {
- return metaDescription;
- }
- public void setMetaDescription(String metaDescription) {
- this.metaDescription = metaDescription;
- }
- public String getTitle() {
- return title;
- }
- public void setTitle(String title) {
- this.title = title;
- }
-
-}
+package com.salesmanager.shop.model.catalog;
+
+import java.io.Serializable;
+
+import com.salesmanager.shop.model.ShopEntity;
+
+
+public abstract class CatalogEntity extends ShopEntity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String name;
+ private String description;
+ private String friendlyUrl;
+ private String keyWords;
+ private String highlights;
+ private String metaDescription;
+ private String title;
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public String getDescription() {
+ return description;
+ }
+ public void setDescription(String description) {
+ this.description = description;
+ }
+ public String getFriendlyUrl() {
+ return friendlyUrl;
+ }
+ public void setFriendlyUrl(String friendlyUrl) {
+ this.friendlyUrl = friendlyUrl;
+ }
+ public String getKeyWords() {
+ return keyWords;
+ }
+ public void setKeyWords(String keyWords) {
+ this.keyWords = keyWords;
+ }
+ public String getHighlights() {
+ return highlights;
+ }
+ public void setHighlights(String highlights) {
+ this.highlights = highlights;
+ }
+ public String getMetaDescription() {
+ return metaDescription;
+ }
+ public void setMetaDescription(String metaDescription) {
+ this.metaDescription = metaDescription;
+ }
+ public String getTitle() {
+ return title;
+ }
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/category/Category.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/category/Category.java
index 5ea85f6..dbaab6a 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/category/Category.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/category/Category.java
@@ -1,22 +1,22 @@
-package com.salesmanager.shop.model.catalog.category;
-
-import java.io.Serializable;
-
-import com.salesmanager.shop.model.Entity;
-
-
-public class Category extends Entity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String code;
- public String getCode() {
- return code;
- }
- public void setCode(String code) {
- this.code = code;
- }
-
-}
+package com.salesmanager.shop.model.catalog.category;
+
+import java.io.Serializable;
+
+import com.salesmanager.shop.model.Entity;
+
+
+public class Category extends Entity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String code;
+ public String getCode() {
+ return code;
+ }
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/category/CategoryDescription.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/category/CategoryDescription.java
index e3403fd..87c4a1c 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/category/CategoryDescription.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/category/CategoryDescription.java
@@ -1,16 +1,16 @@
-package com.salesmanager.shop.model.catalog.category;
-
-import java.io.Serializable;
-
-import com.salesmanager.shop.model.catalog.CatalogEntity;
-
-
-
-public class CategoryDescription extends CatalogEntity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
-}
+package com.salesmanager.shop.model.catalog.category;
+
+import java.io.Serializable;
+
+import com.salesmanager.shop.model.catalog.CatalogEntity;
+
+
+
+public class CategoryDescription extends CatalogEntity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/category/CategoryEntity.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/category/CategoryEntity.java
index 50fbf8a..d221ccd 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/category/CategoryEntity.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/category/CategoryEntity.java
@@ -1,53 +1,60 @@
-package com.salesmanager.shop.model.catalog.category;
-
-import java.io.Serializable;
-
-public class CategoryEntity extends Category implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
-
-
-
- private int sortOrder;
- private boolean visible;
- private String lineage;
- private int depth;
- private Category parent;
-
-
- public int getSortOrder() {
- return sortOrder;
- }
- public void setSortOrder(int sortOrder) {
- this.sortOrder = sortOrder;
- }
- public boolean isVisible() {
- return visible;
- }
- public void setVisible(boolean visible) {
- this.visible = visible;
- }
- public String getLineage() {
- return lineage;
- }
- public void setLineage(String lineage) {
- this.lineage = lineage;
- }
- public int getDepth() {
- return depth;
- }
- public void setDepth(int depth) {
- this.depth = depth;
- }
- public Category getParent() {
- return parent;
- }
- public void setParent(Category parent) {
- this.parent = parent;
- }
-
-}
+package com.salesmanager.shop.model.catalog.category;
+
+import java.io.Serializable;
+
+public class CategoryEntity extends Category implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+
+
+
+ private int sortOrder;
+ private boolean visible;
+ private boolean featured;
+ private String lineage;
+ private int depth;
+ private Category parent;
+
+
+ public int getSortOrder() {
+ return sortOrder;
+ }
+ public void setSortOrder(int sortOrder) {
+ this.sortOrder = sortOrder;
+ }
+ public boolean isVisible() {
+ return visible;
+ }
+ public void setVisible(boolean visible) {
+ this.visible = visible;
+ }
+ public String getLineage() {
+ return lineage;
+ }
+ public void setLineage(String lineage) {
+ this.lineage = lineage;
+ }
+ public int getDepth() {
+ return depth;
+ }
+ public void setDepth(int depth) {
+ this.depth = depth;
+ }
+ public Category getParent() {
+ return parent;
+ }
+ public void setParent(Category parent) {
+ this.parent = parent;
+ }
+ public boolean isFeatured() {
+ return featured;
+ }
+ public void setFeatured(boolean featured) {
+ this.featured = featured;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/category/PersistableCategory.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/category/PersistableCategory.java
index 1ccbc20..256961c 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/category/PersistableCategory.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/category/PersistableCategory.java
@@ -1,29 +1,29 @@
-package com.salesmanager.shop.model.catalog.category;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-public class PersistableCategory extends CategoryEntity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private List<CategoryDescription> descriptions;//always persist description
- private List<PersistableCategory> children = new ArrayList<PersistableCategory>();
-
- public List<CategoryDescription> getDescriptions() {
- return descriptions;
- }
- public void setDescriptions(List<CategoryDescription> descriptions) {
- this.descriptions = descriptions;
- }
- public List<PersistableCategory> getChildren() {
- return children;
- }
- public void setChildren(List<PersistableCategory> children) {
- this.children = children;
- }
-
-}
+package com.salesmanager.shop.model.catalog.category;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+public class PersistableCategory extends CategoryEntity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private List<CategoryDescription> descriptions;//always persist description
+ private List<PersistableCategory> children = new ArrayList<PersistableCategory>();
+
+ public List<CategoryDescription> getDescriptions() {
+ return descriptions;
+ }
+ public void setDescriptions(List<CategoryDescription> descriptions) {
+ this.descriptions = descriptions;
+ }
+ public List<PersistableCategory> getChildren() {
+ return children;
+ }
+ public void setChildren(List<PersistableCategory> children) {
+ this.children = children;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/category/ReadableCategory.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/category/ReadableCategory.java
index fde4217..12ea74a 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/category/ReadableCategory.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/category/ReadableCategory.java
@@ -1,39 +1,39 @@
-package com.salesmanager.shop.model.catalog.category;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-public class ReadableCategory extends CategoryEntity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private CategoryDescription description;//one category based on language
- //private ReadableCategory parent;
- private int productCount;
- private List<ReadableCategory> children = new ArrayList<ReadableCategory>();
-
-
- public void setDescription(CategoryDescription description) {
- this.description = description;
- }
- public CategoryDescription getDescription() {
- return description;
- }
-
- public int getProductCount() {
- return productCount;
- }
- public void setProductCount(int productCount) {
- this.productCount = productCount;
- }
- public List<ReadableCategory> getChildren() {
- return children;
- }
- public void setChildren(List<ReadableCategory> children) {
- this.children = children;
- }
-
-}
+package com.salesmanager.shop.model.catalog.category;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ReadableCategory extends CategoryEntity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private CategoryDescription description;//one category based on language
+ //private ReadableCategory parent;
+ private int productCount;
+ private List<ReadableCategory> children = new ArrayList<ReadableCategory>();
+
+
+ public void setDescription(CategoryDescription description) {
+ this.description = description;
+ }
+ public CategoryDescription getDescription() {
+ return description;
+ }
+
+ public int getProductCount() {
+ return productCount;
+ }
+ public void setProductCount(int productCount) {
+ this.productCount = productCount;
+ }
+ public List<ReadableCategory> getChildren() {
+ return children;
+ }
+ public void setChildren(List<ReadableCategory> children) {
+ this.children = children;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/Manufacturer.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/Manufacturer.java
index 7e0e1db..67b84e5 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/Manufacturer.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/Manufacturer.java
@@ -1,22 +1,22 @@
-package com.salesmanager.shop.model.catalog.manufacturer;
-
-import java.io.Serializable;
-
-import com.salesmanager.shop.model.Entity;
-
-
-public class Manufacturer extends Entity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String code;
- public String getCode() {
- return code;
- }
- public void setCode(String code) {
- this.code = code;
- }
-
-}
+package com.salesmanager.shop.model.catalog.manufacturer;
+
+import java.io.Serializable;
+
+import com.salesmanager.shop.model.Entity;
+
+
+public class Manufacturer extends Entity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String code;
+ public String getCode() {
+ return code;
+ }
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/ManufacturerDescription.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/ManufacturerDescription.java
index b5fd37c..3953f79 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/ManufacturerDescription.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/ManufacturerDescription.java
@@ -1,16 +1,16 @@
-package com.salesmanager.shop.model.catalog.manufacturer;
-
-import java.io.Serializable;
-
-import com.salesmanager.shop.model.catalog.CatalogEntity;
-
-
-public class ManufacturerDescription extends CatalogEntity implements
- Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
-}
+package com.salesmanager.shop.model.catalog.manufacturer;
+
+import java.io.Serializable;
+
+import com.salesmanager.shop.model.catalog.CatalogEntity;
+
+
+public class ManufacturerDescription extends CatalogEntity implements
+ Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/ManufacturerEntity.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/ManufacturerEntity.java
index 5ea2804..401f5eb 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/ManufacturerEntity.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/ManufacturerEntity.java
@@ -1,23 +1,23 @@
-package com.salesmanager.shop.model.catalog.manufacturer;
-
-import java.io.Serializable;
-
-
-
-public class ManufacturerEntity extends Manufacturer implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private int order;
-
- public void setOrder(int order) {
- this.order = order;
- }
- public int getOrder() {
- return order;
- }
-
-
-}
+package com.salesmanager.shop.model.catalog.manufacturer;
+
+import java.io.Serializable;
+
+
+
+public class ManufacturerEntity extends Manufacturer implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private int order;
+
+ public void setOrder(int order) {
+ this.order = order;
+ }
+ public int getOrder() {
+ return order;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/PersistableManufacturer.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/PersistableManufacturer.java
index 03ea62c..3d38123 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/PersistableManufacturer.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/PersistableManufacturer.java
@@ -1,21 +1,21 @@
-package com.salesmanager.shop.model.catalog.manufacturer;
-
-import java.io.Serializable;
-import java.util.List;
-
-public class PersistableManufacturer extends ManufacturerEntity implements
- Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private List<ManufacturerDescription> descriptions;
- public void setDescriptions(List<ManufacturerDescription> descriptions) {
- this.descriptions = descriptions;
- }
- public List<ManufacturerDescription> getDescriptions() {
- return descriptions;
- }
-
-}
+package com.salesmanager.shop.model.catalog.manufacturer;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class PersistableManufacturer extends ManufacturerEntity implements
+ Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private List<ManufacturerDescription> descriptions;
+ public void setDescriptions(List<ManufacturerDescription> descriptions) {
+ this.descriptions = descriptions;
+ }
+ public List<ManufacturerDescription> getDescriptions() {
+ return descriptions;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/ReadableManufacturer.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/ReadableManufacturer.java
index f56ce8d..d9cabd9 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/ReadableManufacturer.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/manufacturer/ReadableManufacturer.java
@@ -1,20 +1,20 @@
-package com.salesmanager.shop.model.catalog.manufacturer;
-
-import java.io.Serializable;
-
-public class ReadableManufacturer extends ManufacturerEntity implements
- Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private ManufacturerDescription description;
- public void setDescription(ManufacturerDescription description) {
- this.description = description;
- }
- public ManufacturerDescription getDescription() {
- return description;
- }
-
-}
+package com.salesmanager.shop.model.catalog.manufacturer;
+
+import java.io.Serializable;
+
+public class ReadableManufacturer extends ManufacturerEntity implements
+ Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private ManufacturerDescription description;
+ public void setDescription(ManufacturerDescription description) {
+ this.description = description;
+ }
+ public ManufacturerDescription getDescription() {
+ return description;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/PersistableProductAttribute.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/PersistableProductAttribute.java
index 4006e4a..b21d2ad 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/PersistableProductAttribute.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/PersistableProductAttribute.java
@@ -1,13 +1,13 @@
-package com.salesmanager.shop.model.catalog.product.attribute;
-
-import java.io.Serializable;
-
-public class PersistableProductAttribute extends ProductAttributeEntity
- implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
-}
+package com.salesmanager.shop.model.catalog.product.attribute;
+
+import java.io.Serializable;
+
+public class PersistableProductAttribute extends ProductAttributeEntity
+ implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/PersistableProductOption.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/PersistableProductOption.java
index 892b0a8..fec624e 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/PersistableProductOption.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/PersistableProductOption.java
@@ -1,21 +1,21 @@
-package com.salesmanager.shop.model.catalog.product.attribute;
-
-import java.io.Serializable;
-import java.util.List;
-
-public class PersistableProductOption extends ProductOptionEntity implements
- Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private List<ProductOptionDescription> descriptions;
- public void setDescriptions(List<ProductOptionDescription> descriptions) {
- this.descriptions = descriptions;
- }
- public List<ProductOptionDescription> getDescriptions() {
- return descriptions;
- }
-
-}
+package com.salesmanager.shop.model.catalog.product.attribute;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class PersistableProductOption extends ProductOptionEntity implements
+ Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private List<ProductOptionDescription> descriptions;
+ public void setDescriptions(List<ProductOptionDescription> descriptions) {
+ this.descriptions = descriptions;
+ }
+ public List<ProductOptionDescription> getDescriptions() {
+ return descriptions;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/PersistableProductOptionValue.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/PersistableProductOptionValue.java
index e71ac59..55df029 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/PersistableProductOptionValue.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/PersistableProductOptionValue.java
@@ -1,23 +1,23 @@
-package com.salesmanager.shop.model.catalog.product.attribute;
-
-import java.io.Serializable;
-import java.util.List;
-
-public class PersistableProductOptionValue extends ProductOptionValueEntity
- implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private List<ProductOptionValueDescription> descriptions;
-
- public void setDescriptions(List<ProductOptionValueDescription> descriptions) {
- this.descriptions = descriptions;
- }
-
- public List<ProductOptionValueDescription> getDescriptions() {
- return descriptions;
- }
-
-}
+package com.salesmanager.shop.model.catalog.product.attribute;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class PersistableProductOptionValue extends ProductOptionValueEntity
+ implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private List<ProductOptionValueDescription> descriptions;
+
+ public void setDescriptions(List<ProductOptionValueDescription> descriptions) {
+ this.descriptions = descriptions;
+ }
+
+ public List<ProductOptionValueDescription> getDescriptions() {
+ return descriptions;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductAttribute.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductAttribute.java
index cab6340..6e9c4cc 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductAttribute.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductAttribute.java
@@ -1,28 +1,28 @@
-package com.salesmanager.shop.model.catalog.product.attribute;
-
-import java.io.Serializable;
-
-import com.salesmanager.shop.model.Entity;
-
-public class ProductAttribute extends Entity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private ProductOption option;
- private ProductOptionValue optionValue;
- public void setOptionValue(ProductOptionValue optionValue) {
- this.optionValue = optionValue;
- }
- public ProductOptionValue getOptionValue() {
- return optionValue;
- }
- public void setOption(ProductOption option) {
- this.option = option;
- }
- public ProductOption getOption() {
- return option;
- }
-
-}
+package com.salesmanager.shop.model.catalog.product.attribute;
+
+import java.io.Serializable;
+
+import com.salesmanager.shop.model.Entity;
+
+public class ProductAttribute extends Entity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private ProductOption option;
+ private ProductOptionValue optionValue;
+ public void setOptionValue(ProductOptionValue optionValue) {
+ this.optionValue = optionValue;
+ }
+ public ProductOptionValue getOptionValue() {
+ return optionValue;
+ }
+ public void setOption(ProductOption option) {
+ this.option = option;
+ }
+ public ProductOption getOption() {
+ return option;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductAttributeEntity.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductAttributeEntity.java
index 0178ea4..491a88b 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductAttributeEntity.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductAttributeEntity.java
@@ -1,43 +1,43 @@
-package com.salesmanager.shop.model.catalog.product.attribute;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-
-public class ProductAttributeEntity extends ProductAttribute implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private BigDecimal productAttributePrice;
- private int sortOrder;
- private BigDecimal productAttributeWeight;
- private boolean attributeDefault=false;
-
-
-
- public void setProductAttributePrice(BigDecimal productAttributePrice) {
- this.productAttributePrice = productAttributePrice;
- }
- public BigDecimal getProductAttributePrice() {
- return productAttributePrice;
- }
- public void setSortOrder(int sortOrder) {
- this.sortOrder = sortOrder;
- }
- public int getSortOrder() {
- return sortOrder;
- }
- public void setProductAttributeWeight(BigDecimal productAttributeWeight) {
- this.productAttributeWeight = productAttributeWeight;
- }
- public BigDecimal getProductAttributeWeight() {
- return productAttributeWeight;
- }
- public void setAttributeDefault(boolean attributeDefault) {
- this.attributeDefault = attributeDefault;
- }
- public boolean isAttributeDefault() {
- return attributeDefault;
- }
-}
+package com.salesmanager.shop.model.catalog.product.attribute;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+public class ProductAttributeEntity extends ProductAttribute implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private BigDecimal productAttributePrice;
+ private int sortOrder;
+ private BigDecimal productAttributeWeight;
+ private boolean attributeDefault=false;
+
+
+
+ public void setProductAttributePrice(BigDecimal productAttributePrice) {
+ this.productAttributePrice = productAttributePrice;
+ }
+ public BigDecimal getProductAttributePrice() {
+ return productAttributePrice;
+ }
+ public void setSortOrder(int sortOrder) {
+ this.sortOrder = sortOrder;
+ }
+ public int getSortOrder() {
+ return sortOrder;
+ }
+ public void setProductAttributeWeight(BigDecimal productAttributeWeight) {
+ this.productAttributeWeight = productAttributeWeight;
+ }
+ public BigDecimal getProductAttributeWeight() {
+ return productAttributeWeight;
+ }
+ public void setAttributeDefault(boolean attributeDefault) {
+ this.attributeDefault = attributeDefault;
+ }
+ public boolean isAttributeDefault() {
+ return attributeDefault;
+ }
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOption.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOption.java
index 4f88a92..7d9d176 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOption.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOption.java
@@ -1,22 +1,22 @@
-package com.salesmanager.shop.model.catalog.product.attribute;
-
-import java.io.Serializable;
-
-import com.salesmanager.shop.model.Entity;
-
-
-public class ProductOption extends Entity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String code;
- public String getCode() {
- return code;
- }
- public void setCode(String code) {
- this.code = code;
- }
-
-}
+package com.salesmanager.shop.model.catalog.product.attribute;
+
+import java.io.Serializable;
+
+import com.salesmanager.shop.model.Entity;
+
+
+public class ProductOption extends Entity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String code;
+ public String getCode() {
+ return code;
+ }
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionDescription.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionDescription.java
index a1cd2a4..d39c6bf 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionDescription.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionDescription.java
@@ -1,16 +1,16 @@
-package com.salesmanager.shop.model.catalog.product.attribute;
-
-import java.io.Serializable;
-
-import com.salesmanager.shop.model.catalog.CatalogEntity;
-
-
-public class ProductOptionDescription extends CatalogEntity implements
- Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
-}
+package com.salesmanager.shop.model.catalog.product.attribute;
+
+import java.io.Serializable;
+
+import com.salesmanager.shop.model.catalog.CatalogEntity;
+
+
+public class ProductOptionDescription extends CatalogEntity implements
+ Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionEntity.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionEntity.java
index d2bdcae..4fad721 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionEntity.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionEntity.java
@@ -1,28 +1,28 @@
-package com.salesmanager.shop.model.catalog.product.attribute;
-
-import java.io.Serializable;
-
-public class ProductOptionEntity extends ProductOption implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private int order;
-
- private String type;
- public void setOrder(int order) {
- this.order = order;
- }
- public int getOrder() {
- return order;
- }
-
- public void setType(String type) {
- this.type = type;
- }
- public String getType() {
- return type;
- }
-
-}
+package com.salesmanager.shop.model.catalog.product.attribute;
+
+import java.io.Serializable;
+
+public class ProductOptionEntity extends ProductOption implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private int order;
+
+ private String type;
+ public void setOrder(int order) {
+ this.order = order;
+ }
+ public int getOrder() {
+ return order;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+ public String getType() {
+ return type;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionValue.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionValue.java
index df80f81..54da4cc 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionValue.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionValue.java
@@ -1,22 +1,22 @@
-package com.salesmanager.shop.model.catalog.product.attribute;
-
-import java.io.Serializable;
-
-import com.salesmanager.shop.model.Entity;
-
-
-public class ProductOptionValue extends Entity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String code;
- public String getCode() {
- return code;
- }
- public void setCode(String code) {
- this.code = code;
- }
-
-}
+package com.salesmanager.shop.model.catalog.product.attribute;
+
+import java.io.Serializable;
+
+import com.salesmanager.shop.model.Entity;
+
+
+public class ProductOptionValue extends Entity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String code;
+ public String getCode() {
+ return code;
+ }
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionValueDescription.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionValueDescription.java
index fb37fb4..6183dd1 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionValueDescription.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionValueDescription.java
@@ -1,15 +1,15 @@
-package com.salesmanager.shop.model.catalog.product.attribute;
-
-import java.io.Serializable;
-
-import com.salesmanager.shop.model.catalog.CatalogEntity;
-
-public class ProductOptionValueDescription extends CatalogEntity implements
- Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
-}
+package com.salesmanager.shop.model.catalog.product.attribute;
+
+import java.io.Serializable;
+
+import com.salesmanager.shop.model.catalog.CatalogEntity;
+
+public class ProductOptionValueDescription extends CatalogEntity implements
+ Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionValueEntity.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionValueEntity.java
index 013ff26..2d94c69 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionValueEntity.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ProductOptionValueEntity.java
@@ -1,21 +1,21 @@
-package com.salesmanager.shop.model.catalog.product.attribute;
-
-import java.io.Serializable;
-
-public class ProductOptionValueEntity extends ProductOptionValue implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private int order;
-
- public void setOrder(int order) {
- this.order = order;
- }
- public int getOrder() {
- return order;
- }
-
-
-}
+package com.salesmanager.shop.model.catalog.product.attribute;
+
+import java.io.Serializable;
+
+public class ProductOptionValueEntity extends ProductOptionValue implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private int order;
+
+ public void setOrder(int order) {
+ this.order = order;
+ }
+ public int getOrder() {
+ return order;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ReadableProductAttribute.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ReadableProductAttribute.java
index eeb4343..8e89a90 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ReadableProductAttribute.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ReadableProductAttribute.java
@@ -1,12 +1,12 @@
-package com.salesmanager.shop.model.catalog.product.attribute;
-
-import java.io.Serializable;
-
-public class ReadableProductAttribute extends ProductAttributeEntity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
-}
+package com.salesmanager.shop.model.catalog.product.attribute;
+
+import java.io.Serializable;
+
+public class ReadableProductAttribute extends ProductAttributeEntity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ReadableProductOption.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ReadableProductOption.java
new file mode 100644
index 0000000..5d78f48
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ReadableProductOption.java
@@ -0,0 +1,20 @@
+package com.salesmanager.shop.model.catalog.product.attribute;
+
+public class ReadableProductOption extends ProductOption {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ReadableProductOptionValue.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ReadableProductOptionValue.java
new file mode 100644
index 0000000..fb5c085
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/attribute/ReadableProductOptionValue.java
@@ -0,0 +1,20 @@
+package com.salesmanager.shop.model.catalog.product.attribute;
+
+public class ReadableProductOptionValue extends ProductOptionValue {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/PersistableImage.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/PersistableImage.java
index f879480..8f8e052 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/PersistableImage.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/PersistableImage.java
@@ -1,69 +1,84 @@
-package com.salesmanager.shop.model.catalog.product;
-
-public class PersistableImage {
-
- private byte[] bytes = null;
-
-
- private String contentType = null;
-
- private String imageName = null;
-
- /**
- * An external image url
- */
- private String imageUrl = null;
-
- private int imageType = 0;
-
-
- public void setBytes(byte[] bytes) {
- this.bytes = bytes;
- }
-
-
- public byte[] getBytes() {
- return bytes;
- }
-
-
- public void setContentType(String contentType) {
- this.contentType = contentType;
- }
-
-
- public String getContentType() {
- return contentType;
- }
-
-
- public void setImageName(String imageName) {
- this.imageName = imageName;
- }
-
-
- public String getImageName() {
- return imageName;
- }
-
-
- public String getImageUrl() {
- return imageUrl;
- }
-
-
- public void setImageUrl(String imageUrl) {
- this.imageUrl = imageUrl;
- }
-
-
- public int getImageType() {
- return imageType;
- }
-
-
- public void setImageType(int imageType) {
- this.imageType = imageType;
- }
-
-}
+package com.salesmanager.shop.model.catalog.product;
+
+import com.salesmanager.shop.model.Entity;
+
+public class PersistableImage extends Entity {
+
+
+ private static final long serialVersionUID = 1L;
+ private boolean defaultImage;
+ private int imageType = 0;
+ private String imageName = null;
+
+
+ private byte[] bytes = null;
+ private String contentType = null;
+
+
+ /**
+ * An external image url
+ */
+ private String imageUrl = null;
+
+
+
+ public void setBytes(byte[] bytes) {
+ this.bytes = bytes;
+ }
+
+
+ public byte[] getBytes() {
+ return bytes;
+ }
+
+
+ public void setContentType(String contentType) {
+ this.contentType = contentType;
+ }
+
+
+ public String getContentType() {
+ return contentType;
+ }
+
+
+ public void setImageName(String imageName) {
+ this.imageName = imageName;
+ }
+
+
+ public String getImageName() {
+ return imageName;
+ }
+
+
+ public String getImageUrl() {
+ return imageUrl;
+ }
+
+
+ public void setImageUrl(String imageUrl) {
+ this.imageUrl = imageUrl;
+ }
+
+
+ public int getImageType() {
+ return imageType;
+ }
+
+
+ public void setImageType(int imageType) {
+ this.imageType = imageType;
+ }
+
+
+ public boolean isDefaultImage() {
+ return defaultImage;
+ }
+
+
+ public void setDefaultImage(boolean defaultImage) {
+ this.defaultImage = defaultImage;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/PersistableProduct.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/PersistableProduct.java
index eb63df4..8cecabf 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/PersistableProduct.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/PersistableProduct.java
@@ -1,70 +1,79 @@
-package com.salesmanager.shop.model.catalog.product;
-
-import java.io.Serializable;
-import java.util.List;
-
-import com.salesmanager.shop.model.catalog.category.Category;
-import com.salesmanager.shop.model.catalog.manufacturer.Manufacturer;
-import com.salesmanager.shop.model.catalog.product.attribute.PersistableProductAttribute;
-
-
-
-public class PersistableProduct extends ProductEntity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private List<ProductDescription> descriptions;//always persist descriptions
- private List<PersistableProductAttribute> attributes;//persist attribute and save reference
- private List<PersistableImage> images;//persist images and save reference
- private List<PersistableProductPrice> productPrices;//to be set when using discounts
- private List<Category> categories;//save reference
- private List<RelatedProduct> relatedProducts;//save reference
- private Manufacturer manufacturer;
-
- public List<ProductDescription> getDescriptions() {
- return descriptions;
- }
- public void setDescriptions(List<ProductDescription> descriptions) {
- this.descriptions = descriptions;
- }
-
- public List<PersistableImage> getImages() {
- return images;
- }
- public void setImages(List<PersistableImage> images) {
- this.images = images;
- }
- public List<Category> getCategories() {
- return categories;
- }
- public void setCategories(List<Category> categories) {
- this.categories = categories;
- }
- public List<RelatedProduct> getRelatedProducts() {
- return relatedProducts;
- }
- public void setRelatedProducts(List<RelatedProduct> relatedProducts) {
- this.relatedProducts = relatedProducts;
- }
- public void setManufacturer(Manufacturer manufacturer) {
- this.manufacturer = manufacturer;
- }
- public Manufacturer getManufacturer() {
- return manufacturer;
- }
- public void setAttributes(List<PersistableProductAttribute> attributes) {
- this.attributes = attributes;
- }
- public List<PersistableProductAttribute> getAttributes() {
- return attributes;
- }
- public List<PersistableProductPrice> getProductPrices() {
- return productPrices;
- }
- public void setProductPrices(List<PersistableProductPrice> productPrices) {
- this.productPrices = productPrices;
- }
-
-}
+package com.salesmanager.shop.model.catalog.product;
+
+import java.io.Serializable;
+import java.util.List;
+
+import com.salesmanager.shop.model.catalog.category.Category;
+import com.salesmanager.shop.model.catalog.manufacturer.Manufacturer;
+import com.salesmanager.shop.model.catalog.product.attribute.PersistableProductAttribute;
+
+
+
+public class PersistableProduct extends ProductEntity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private List<ProductDescription> descriptions;//always persist descriptions
+ private List<PersistableProductAttribute> attributes;//persist attribute and save reference
+ private List<PersistableImage> images;//persist images and save reference
+ private List<PersistableProductPrice> productPrices;//to be set when using discounts
+ private List<Category> categories;//save reference
+ private List<RelatedProduct> relatedProducts;//save reference
+ private Manufacturer manufacturer;//save reference
+
+ //RENTAL
+ private RentalOwner owner;
+
+ public List<ProductDescription> getDescriptions() {
+ return descriptions;
+ }
+ public void setDescriptions(List<ProductDescription> descriptions) {
+ this.descriptions = descriptions;
+ }
+
+ public List<PersistableImage> getImages() {
+ return images;
+ }
+ public void setImages(List<PersistableImage> images) {
+ this.images = images;
+ }
+ public List<Category> getCategories() {
+ return categories;
+ }
+ public void setCategories(List<Category> categories) {
+ this.categories = categories;
+ }
+ public List<RelatedProduct> getRelatedProducts() {
+ return relatedProducts;
+ }
+ public void setRelatedProducts(List<RelatedProduct> relatedProducts) {
+ this.relatedProducts = relatedProducts;
+ }
+ public void setManufacturer(Manufacturer manufacturer) {
+ this.manufacturer = manufacturer;
+ }
+ public Manufacturer getManufacturer() {
+ return manufacturer;
+ }
+ public void setAttributes(List<PersistableProductAttribute> attributes) {
+ this.attributes = attributes;
+ }
+ public List<PersistableProductAttribute> getAttributes() {
+ return attributes;
+ }
+ public List<PersistableProductPrice> getProductPrices() {
+ return productPrices;
+ }
+ public void setProductPrices(List<PersistableProductPrice> productPrices) {
+ this.productPrices = productPrices;
+ }
+ public RentalOwner getOwner() {
+ return owner;
+ }
+ public void setOwner(RentalOwner owner) {
+ this.owner = owner;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/Product.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/Product.java
index 3ece43b..fb14d3c 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/Product.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/Product.java
@@ -1,15 +1,15 @@
-package com.salesmanager.shop.model.catalog.product;
-
-import java.io.Serializable;
-
-import com.salesmanager.shop.model.Entity;
-
-
-public class Product extends Entity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
-}
+package com.salesmanager.shop.model.catalog.product;
+
+import java.io.Serializable;
+
+import com.salesmanager.shop.model.Entity;
+
+
+public class Product extends Entity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ProductDescription.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ProductDescription.java
index 9e1a82d..ece3d4c 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ProductDescription.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ProductDescription.java
@@ -1,12 +1,12 @@
-package com.salesmanager.shop.model.catalog.product;
-
-import com.salesmanager.shop.model.catalog.CatalogEntity;
-
-public class ProductDescription extends CatalogEntity {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
-}
+package com.salesmanager.shop.model.catalog.product;
+
+import com.salesmanager.shop.model.catalog.CatalogEntity;
+
+public class ProductDescription extends CatalogEntity {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ProductEntity.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ProductEntity.java
index b7afb92..7153ec9 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ProductEntity.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ProductEntity.java
@@ -1,167 +1,207 @@
-package com.salesmanager.shop.model.catalog.product;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-
-
-/**
- * A product entity is used by services API
- * to populate or retrieve a Product entity
- * @author Carl Samson
- *
- */
-public class ProductEntity extends Product implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private BigDecimal price;
- private int quantity = 0;
- private String sku;
- private boolean productShipeable = false;
- private boolean preOrder = false;
- private boolean productVirtual = false;
- private int quantityOrderMaximum =-1;//default unlimited
- private int quantityOrderMinimum = 1;//default 1
- private boolean productIsFree;
- private boolean available;
- private boolean visible;
- private BigDecimal productLength;
- private BigDecimal productWidth;
- private BigDecimal productHeight;
- private BigDecimal productWeight;
- private Double rating = 0D;
- private int ratingCount;
- private int sortOrder;
- private String dateAvailable;
- private String refSku;
-
-
-
-
-
- public BigDecimal getPrice() {
- return price;
- }
- public void setPrice(BigDecimal price) {
- this.price = price;
- }
-
- public int getQuantity() {
- return quantity;
- }
- public void setQuantity(int quantity) {
- this.quantity = quantity;
- }
- public String getSku() {
- return sku;
- }
- public void setSku(String sku) {
- this.sku = sku;
- }
- public boolean isProductShipeable() {
- return productShipeable;
- }
- public void setProductShipeable(boolean productShipeable) {
- this.productShipeable = productShipeable;
- }
- public boolean isProductIsFree() {
- return productIsFree;
- }
- public void setProductIsFree(boolean productIsFree) {
- this.productIsFree = productIsFree;
- }
- public BigDecimal getProductLength() {
- return productLength;
- }
- public void setProductLength(BigDecimal productLength) {
- this.productLength = productLength;
- }
- public BigDecimal getProductWidth() {
- return productWidth;
- }
- public void setProductWidth(BigDecimal productWidth) {
- this.productWidth = productWidth;
- }
- public BigDecimal getProductHeight() {
- return productHeight;
- }
- public void setProductHeight(BigDecimal productHeight) {
- this.productHeight = productHeight;
- }
- public BigDecimal getProductWeight() {
- return productWeight;
- }
- public void setProductWeight(BigDecimal productWeight) {
- this.productWeight = productWeight;
- }
- public int getSortOrder() {
- return sortOrder;
- }
- public void setSortOrder(int sortOrder) {
- this.sortOrder = sortOrder;
- }
- public void setQuantityOrderMaximum(int quantityOrderMaximum) {
- this.quantityOrderMaximum = quantityOrderMaximum;
- }
- public int getQuantityOrderMaximum() {
- return quantityOrderMaximum;
- }
- public void setProductVirtual(boolean productVirtual) {
- this.productVirtual = productVirtual;
- }
- public boolean isProductVirtual() {
- return productVirtual;
- }
- public void setAvailable(boolean available) {
- this.available = available;
- }
- public boolean isAvailable() {
- return available;
- }
- public void setDateAvailable(String dateAvailable) {
- this.dateAvailable = dateAvailable;
- }
- public String getDateAvailable() {
- return dateAvailable;
- }
- public int getQuantityOrderMinimum() {
- return quantityOrderMinimum;
- }
- public void setQuantityOrderMinimum(int quantityOrderMinimum) {
- this.quantityOrderMinimum = quantityOrderMinimum;
- }
- public int getRatingCount() {
- return ratingCount;
- }
- public void setRatingCount(int ratingCount) {
- this.ratingCount = ratingCount;
- }
- public Double getRating() {
- return rating;
- }
- public void setRating(Double rating) {
- this.rating = rating;
- }
- public boolean isPreOrder() {
- return preOrder;
- }
- public void setPreOrder(boolean preOrder) {
- this.preOrder = preOrder;
- }
- public String getRefSku() {
- return refSku;
- }
- public void setRefSku(String refSku) {
- this.refSku = refSku;
- }
- public boolean isVisible() {
- return visible;
- }
- public void setVisible(boolean visible) {
- this.visible = visible;
- }
-
-
-}
+package com.salesmanager.shop.model.catalog.product;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+import com.salesmanager.core.model.catalog.product.ProductCondition;
+import com.salesmanager.core.model.catalog.product.RentalStatus;
+
+
+/**
+ * A product entity is used by services API
+ * to populate or retrieve a Product entity
+ * @author Carl Samson
+ *
+ */
+public class ProductEntity extends Product implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private BigDecimal price;
+ private int quantity = 0;
+ private String sku;
+ private boolean productShipeable = false;
+ private boolean preOrder = false;
+ private boolean productVirtual = false;
+ private int quantityOrderMaximum =-1;//default unlimited
+ private int quantityOrderMinimum = 1;//default 1
+ private boolean productIsFree;
+ private boolean available;
+ private boolean visible = true;
+ private BigDecimal productLength;
+ private BigDecimal productWidth;
+ private BigDecimal productHeight;
+ private BigDecimal productWeight;
+ private Double rating = 0D;
+ private int ratingCount;
+ private int sortOrder;
+ private String dateAvailable;
+ private String refSku;
+ private ProductCondition condition;
+
+ /**
+ * RENTAL additional fields
+ * @return
+ */
+
+ private int rentalDuration;
+ private int rentalPeriod;
+ private RentalStatus rentalStatus;
+
+ /**
+ * End RENTAL fields
+ * @return
+ */
+
+
+ public BigDecimal getPrice() {
+ return price;
+ }
+ public void setPrice(BigDecimal price) {
+ this.price = price;
+ }
+
+ public int getQuantity() {
+ return quantity;
+ }
+ public void setQuantity(int quantity) {
+ this.quantity = quantity;
+ }
+ public String getSku() {
+ return sku;
+ }
+ public void setSku(String sku) {
+ this.sku = sku;
+ }
+ public boolean isProductShipeable() {
+ return productShipeable;
+ }
+ public void setProductShipeable(boolean productShipeable) {
+ this.productShipeable = productShipeable;
+ }
+ public boolean isProductIsFree() {
+ return productIsFree;
+ }
+ public void setProductIsFree(boolean productIsFree) {
+ this.productIsFree = productIsFree;
+ }
+ public BigDecimal getProductLength() {
+ return productLength;
+ }
+ public void setProductLength(BigDecimal productLength) {
+ this.productLength = productLength;
+ }
+ public BigDecimal getProductWidth() {
+ return productWidth;
+ }
+ public void setProductWidth(BigDecimal productWidth) {
+ this.productWidth = productWidth;
+ }
+ public BigDecimal getProductHeight() {
+ return productHeight;
+ }
+ public void setProductHeight(BigDecimal productHeight) {
+ this.productHeight = productHeight;
+ }
+ public BigDecimal getProductWeight() {
+ return productWeight;
+ }
+ public void setProductWeight(BigDecimal productWeight) {
+ this.productWeight = productWeight;
+ }
+ public int getSortOrder() {
+ return sortOrder;
+ }
+ public void setSortOrder(int sortOrder) {
+ this.sortOrder = sortOrder;
+ }
+ public void setQuantityOrderMaximum(int quantityOrderMaximum) {
+ this.quantityOrderMaximum = quantityOrderMaximum;
+ }
+ public int getQuantityOrderMaximum() {
+ return quantityOrderMaximum;
+ }
+ public void setProductVirtual(boolean productVirtual) {
+ this.productVirtual = productVirtual;
+ }
+ public boolean isProductVirtual() {
+ return productVirtual;
+ }
+ public void setAvailable(boolean available) {
+ this.available = available;
+ }
+ public boolean isAvailable() {
+ return available;
+ }
+ public void setDateAvailable(String dateAvailable) {
+ this.dateAvailable = dateAvailable;
+ }
+ public String getDateAvailable() {
+ return dateAvailable;
+ }
+ public int getQuantityOrderMinimum() {
+ return quantityOrderMinimum;
+ }
+ public void setQuantityOrderMinimum(int quantityOrderMinimum) {
+ this.quantityOrderMinimum = quantityOrderMinimum;
+ }
+ public int getRatingCount() {
+ return ratingCount;
+ }
+ public void setRatingCount(int ratingCount) {
+ this.ratingCount = ratingCount;
+ }
+ public Double getRating() {
+ return rating;
+ }
+ public void setRating(Double rating) {
+ this.rating = rating;
+ }
+ public boolean isPreOrder() {
+ return preOrder;
+ }
+ public void setPreOrder(boolean preOrder) {
+ this.preOrder = preOrder;
+ }
+ public String getRefSku() {
+ return refSku;
+ }
+ public void setRefSku(String refSku) {
+ this.refSku = refSku;
+ }
+ public boolean isVisible() {
+ return visible;
+ }
+ public void setVisible(boolean visible) {
+ this.visible = visible;
+ }
+ public ProductCondition getCondition() {
+ return condition;
+ }
+ public void setCondition(ProductCondition condition) {
+ this.condition = condition;
+ }
+ public int getRentalDuration() {
+ return rentalDuration;
+ }
+ public void setRentalDuration(int rentalDuration) {
+ this.rentalDuration = rentalDuration;
+ }
+ public RentalStatus getRentalStatus() {
+ return rentalStatus;
+ }
+ public void setRentalStatus(RentalStatus rentalStatus) {
+ this.rentalStatus = rentalStatus;
+ }
+
+ public int getRentalPeriod() {
+ return rentalPeriod;
+ }
+ public void setRentalPeriod(int rentalPeriod) {
+ this.rentalPeriod = rentalPeriod;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ProductPriceEntity.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ProductPriceEntity.java
index 9986ed4..33ae5d8 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ProductPriceEntity.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ProductPriceEntity.java
@@ -1,78 +1,78 @@
-package com.salesmanager.shop.model.catalog.product;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-
-import org.apache.commons.lang3.StringUtils;
-/**
- * A product entity is used by services API
- * to populate or retrieve a Product price entity
- * @author Carl Samson
- *
- */
-public class ProductPriceEntity extends ProductPrice implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String code;
- private boolean discounted = false;
- private String discountStartDate;
- private String discountEndDate;
- private boolean defaultPrice = false;
- private BigDecimal originalPrice;
- private BigDecimal discountedPrice;
-
- public boolean isDiscounted() {
- return discounted;
- }
- public void setDiscounted(boolean discounted) {
- this.discounted = discounted;
- }
- public String getDiscountStartDate() {
- return discountStartDate;
- }
- public void setDiscountStartDate(String discountStartDate) {
- this.discountStartDate = discountStartDate;
- }
- public String getDiscountEndDate() {
- return discountEndDate;
- }
- public void setDiscountEndDate(String discountEndDate) {
- this.discountEndDate = discountEndDate;
- }
- public boolean isDefaultPrice() {
- return defaultPrice;
- }
- public void setDefaultPrice(boolean defaultPrice) {
- this.defaultPrice = defaultPrice;
- }
- public BigDecimal getOriginalPrice() {
- return originalPrice;
- }
- public void setOriginalPrice(BigDecimal originalPrice) {
- this.originalPrice = originalPrice;
- }
- public BigDecimal getDiscountedPrice() {
- return discountedPrice;
- }
- public void setDiscountedPrice(BigDecimal discountedPrice) {
- this.discountedPrice = discountedPrice;
- }
- public String getCode() {
- if(StringUtils.isBlank(this.code)) {
- code = DEFAULT_PRICE_CODE;
- }
- return code;
- }
- public void setCode(String code) {
- this.code = code;
- }
-
-
-
-
-
-
-}
+package com.salesmanager.shop.model.catalog.product;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+import org.apache.commons.lang3.StringUtils;
+/**
+ * A product entity is used by services API
+ * to populate or retrieve a Product price entity
+ * @author Carl Samson
+ *
+ */
+public class ProductPriceEntity extends ProductPrice implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String code;
+ private boolean discounted = false;
+ private String discountStartDate;
+ private String discountEndDate;
+ private boolean defaultPrice = false;
+ private BigDecimal originalPrice;
+ private BigDecimal discountedPrice;
+
+ public boolean isDiscounted() {
+ return discounted;
+ }
+ public void setDiscounted(boolean discounted) {
+ this.discounted = discounted;
+ }
+ public String getDiscountStartDate() {
+ return discountStartDate;
+ }
+ public void setDiscountStartDate(String discountStartDate) {
+ this.discountStartDate = discountStartDate;
+ }
+ public String getDiscountEndDate() {
+ return discountEndDate;
+ }
+ public void setDiscountEndDate(String discountEndDate) {
+ this.discountEndDate = discountEndDate;
+ }
+ public boolean isDefaultPrice() {
+ return defaultPrice;
+ }
+ public void setDefaultPrice(boolean defaultPrice) {
+ this.defaultPrice = defaultPrice;
+ }
+ public BigDecimal getOriginalPrice() {
+ return originalPrice;
+ }
+ public void setOriginalPrice(BigDecimal originalPrice) {
+ this.originalPrice = originalPrice;
+ }
+ public BigDecimal getDiscountedPrice() {
+ return discountedPrice;
+ }
+ public void setDiscountedPrice(BigDecimal discountedPrice) {
+ this.discountedPrice = discountedPrice;
+ }
+ public String getCode() {
+ if(StringUtils.isBlank(this.code)) {
+ code = DEFAULT_PRICE_CODE;
+ }
+ return code;
+ }
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ReadableImage.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ReadableImage.java
new file mode 100644
index 0000000..dba89d5
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ReadableImage.java
@@ -0,0 +1,56 @@
+package com.salesmanager.shop.model.catalog.product;
+
+import java.io.Serializable;
+
+import com.salesmanager.shop.model.Entity;
+
+public class ReadableImage extends Entity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String imageName;
+ private String imageUrl;
+ private String externalUrl;
+ private String videoUrl;
+ private int imageType;
+ private boolean defaultImage;
+ public void setImageName(String imageName) {
+ this.imageName = imageName;
+ }
+ public String getImageName() {
+ return imageName;
+ }
+ public void setImageUrl(String imageUrl) {
+ this.imageUrl = imageUrl;
+ }
+ public String getImageUrl() {
+ return imageUrl;
+ }
+ public int getImageType() {
+ return imageType;
+ }
+ public void setImageType(int imageType) {
+ this.imageType = imageType;
+ }
+ public String getExternalUrl() {
+ return externalUrl;
+ }
+ public void setExternalUrl(String externalUrl) {
+ this.externalUrl = externalUrl;
+ }
+ public String getVideoUrl() {
+ return videoUrl;
+ }
+ public void setVideoUrl(String videoUrl) {
+ this.videoUrl = videoUrl;
+ }
+ public boolean isDefaultImage() {
+ return defaultImage;
+ }
+ public void setDefaultImage(boolean defaultImage) {
+ this.defaultImage = defaultImage;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ReadableProduct.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ReadableProduct.java
index 2c2d8dd..82bdf8e 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ReadableProduct.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ReadableProduct.java
@@ -1,84 +1,100 @@
-package com.salesmanager.shop.model.catalog.product;
-
-import java.io.Serializable;
-import java.util.List;
-
-import com.salesmanager.shop.model.catalog.ReadableImage;
-import com.salesmanager.shop.model.catalog.manufacturer.ReadableManufacturer;
-import com.salesmanager.shop.model.catalog.product.attribute.ReadableProductAttribute;
-
-
-public class ReadableProduct extends ProductEntity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private ProductDescription description;
- private String finalPrice = "0";
- private String originalPrice = null;
- private boolean discounted = false;
- private ReadableImage image;
- private List<ReadableImage> images;
- private ReadableManufacturer manufacturer;
- private List<ReadableProductAttribute> attributes;
- private boolean canBePurchased = false;
-
-
- public ProductDescription getDescription() {
- return description;
- }
- public void setDescription(ProductDescription description) {
- this.description = description;
- }
- public String getFinalPrice() {
- return finalPrice;
- }
- public void setFinalPrice(String finalPrice) {
- this.finalPrice = finalPrice;
- }
- public String getOriginalPrice() {
- return originalPrice;
- }
- public void setOriginalPrice(String originalPrice) {
- this.originalPrice = originalPrice;
- }
- public boolean isDiscounted() {
- return discounted;
- }
- public void setDiscounted(boolean discounted) {
- this.discounted = discounted;
- }
-
- public void setImages(List<ReadableImage> images) {
- this.images = images;
- }
- public List<ReadableImage> getImages() {
- return images;
- }
- public void setImage(ReadableImage image) {
- this.image = image;
- }
- public ReadableImage getImage() {
- return image;
- }
- public void setAttributes(List<ReadableProductAttribute> attributes) {
- this.attributes = attributes;
- }
- public List<ReadableProductAttribute> getAttributes() {
- return attributes;
- }
- public void setManufacturer(ReadableManufacturer manufacturer) {
- this.manufacturer = manufacturer;
- }
- public ReadableManufacturer getManufacturer() {
- return manufacturer;
- }
- public boolean isCanBePurchased() {
- return canBePurchased;
- }
- public void setCanBePurchased(boolean canBePurchased) {
- this.canBePurchased = canBePurchased;
- }
-
-}
+package com.salesmanager.shop.model.catalog.product;
+
+import java.io.Serializable;
+import java.util.List;
+
+import com.salesmanager.shop.model.catalog.category.ReadableCategory;
+import com.salesmanager.shop.model.catalog.manufacturer.ReadableManufacturer;
+import com.salesmanager.shop.model.catalog.product.attribute.ReadableProductAttribute;
+
+
+public class ReadableProduct extends ProductEntity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private ProductDescription description;
+ private String finalPrice = "0";
+ private String originalPrice = null;
+ private boolean discounted = false;
+ private ReadableImage image;
+ private List<ReadableImage> images;
+ private ReadableManufacturer manufacturer;
+ private List<ReadableProductAttribute> attributes;
+ private List<ReadableCategory> categories;
+ private boolean canBePurchased = false;
+
+ //RENTAL
+ private RentalOwner owner;
+
+
+ public ProductDescription getDescription() {
+ return description;
+ }
+ public void setDescription(ProductDescription description) {
+ this.description = description;
+ }
+ public String getFinalPrice() {
+ return finalPrice;
+ }
+ public void setFinalPrice(String finalPrice) {
+ this.finalPrice = finalPrice;
+ }
+ public String getOriginalPrice() {
+ return originalPrice;
+ }
+ public void setOriginalPrice(String originalPrice) {
+ this.originalPrice = originalPrice;
+ }
+ public boolean isDiscounted() {
+ return discounted;
+ }
+ public void setDiscounted(boolean discounted) {
+ this.discounted = discounted;
+ }
+
+ public void setImages(List<ReadableImage> images) {
+ this.images = images;
+ }
+ public List<ReadableImage> getImages() {
+ return images;
+ }
+ public void setImage(ReadableImage image) {
+ this.image = image;
+ }
+ public ReadableImage getImage() {
+ return image;
+ }
+ public void setAttributes(List<ReadableProductAttribute> attributes) {
+ this.attributes = attributes;
+ }
+ public List<ReadableProductAttribute> getAttributes() {
+ return attributes;
+ }
+ public void setManufacturer(ReadableManufacturer manufacturer) {
+ this.manufacturer = manufacturer;
+ }
+ public ReadableManufacturer getManufacturer() {
+ return manufacturer;
+ }
+ public boolean isCanBePurchased() {
+ return canBePurchased;
+ }
+ public void setCanBePurchased(boolean canBePurchased) {
+ this.canBePurchased = canBePurchased;
+ }
+ public RentalOwner getOwner() {
+ return owner;
+ }
+ public void setOwner(RentalOwner owner) {
+ this.owner = owner;
+ }
+ public List<ReadableCategory> getCategories() {
+ return categories;
+ }
+ public void setCategories(List<ReadableCategory> categories) {
+ this.categories = categories;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ReadableProductList.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ReadableProductList.java
index 4526ec4..f4f61f8 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ReadableProductList.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/ReadableProductList.java
@@ -1,29 +1,24 @@
-package com.salesmanager.shop.model.catalog.product;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-public class ReadableProductList implements Serializable {
-
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private int totalCount;
- private List<ReadableProduct> products = new ArrayList<ReadableProduct>();
- public void setProducts(List<ReadableProduct> products) {
- this.products = products;
- }
- public List<ReadableProduct> getProducts() {
- return products;
- }
- public void setTotalCount(int totalCount) {
- this.totalCount = totalCount;
- }
- public int getTotalCount() {
- return totalCount;
- }
-
-}
+package com.salesmanager.shop.model.catalog.product;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.salesmanager.shop.model.ReadableList;
+
+public class ReadableProductList extends ReadableList {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private List<ReadableProduct> products = new ArrayList<ReadableProduct>();
+ public void setProducts(List<ReadableProduct> products) {
+ this.products = products;
+ }
+ public List<ReadableProduct> getProducts() {
+ return products;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/RelatedProduct.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/RelatedProduct.java
index 18ae1a7..bdbb2af 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/RelatedProduct.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/RelatedProduct.java
@@ -1,19 +1,19 @@
-package com.salesmanager.shop.model.catalog.product;
-
-import java.io.Serializable;
-
-public class RelatedProduct extends Product implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String relationShipType; //RELATED_ITEM ~ BUNDLED_ITEM
- public void setRelationShipType(String relationShipType) {
- this.relationShipType = relationShipType;
- }
- public String getRelationShipType() {
- return relationShipType;
- }
-
-}
+package com.salesmanager.shop.model.catalog.product;
+
+import java.io.Serializable;
+
+public class RelatedProduct extends Product implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String relationShipType; //RELATED_ITEM ~ BUNDLED_ITEM
+ public void setRelationShipType(String relationShipType) {
+ this.relationShipType = relationShipType;
+ }
+ public String getRelationShipType() {
+ return relationShipType;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/RentalOwner.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/RentalOwner.java
new file mode 100644
index 0000000..cfe7190
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/product/RentalOwner.java
@@ -0,0 +1,45 @@
+package com.salesmanager.shop.model.catalog.product;
+
+import com.salesmanager.shop.model.Entity;
+import com.salesmanager.shop.model.customer.Address;
+
+/**
+ * RENTAL customer
+ * @author c.samson
+ *
+ */
+public class RentalOwner extends Entity {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String firstName;
+ private String lastName;
+ private Address address;
+ private String emailAddress;
+ public String getFirstName() {
+ return firstName;
+ }
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+ public String getLastName() {
+ return lastName;
+ }
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+ public Address getAddress() {
+ return address;
+ }
+ public void setAddress(Address address) {
+ this.address = address;
+ }
+ public String getEmailAddress() {
+ return emailAddress;
+ }
+ public void setEmailAddress(String emailAddress) {
+ this.emailAddress = emailAddress;
+ }
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/ProductList.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/ProductList.java
index 146a660..a459762 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/ProductList.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/ProductList.java
@@ -1,47 +1,47 @@
-package com.salesmanager.shop.model.catalog;
-
-import com.salesmanager.shop.model.catalog.product.ReadableProduct;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
-
-public class ProductList implements Serializable {
-
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private int productCount;
- private BigDecimal minPrice;
- private BigDecimal maxPrice;
- private List<ReadableProduct> products = new ArrayList<ReadableProduct>();
- public void setProducts(List<ReadableProduct> products) {
- this.products = products;
- }
- public List<ReadableProduct> getProducts() {
- return products;
- }
- public int getProductCount() {
- return productCount;
- }
- public void setProductCount(int productCount) {
- this.productCount = productCount;
- }
- public BigDecimal getMinPrice() {
- return minPrice;
- }
- public void setMinPrice(BigDecimal minPrice) {
- this.minPrice = minPrice;
- }
- public BigDecimal getMaxPrice() {
- return maxPrice;
- }
- public void setMaxPrice(BigDecimal maxPrice) {
- this.maxPrice = maxPrice;
- }
-
-
-}
+package com.salesmanager.shop.model.catalog;
+
+import com.salesmanager.shop.model.catalog.product.ReadableProduct;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ProductList implements Serializable {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private int productCount;
+ private BigDecimal minPrice;
+ private BigDecimal maxPrice;
+ private List<ReadableProduct> products = new ArrayList<ReadableProduct>();
+ public void setProducts(List<ReadableProduct> products) {
+ this.products = products;
+ }
+ public List<ReadableProduct> getProducts() {
+ return products;
+ }
+ public int getProductCount() {
+ return productCount;
+ }
+ public void setProductCount(int productCount) {
+ this.productCount = productCount;
+ }
+ public BigDecimal getMinPrice() {
+ return minPrice;
+ }
+ public void setMinPrice(BigDecimal minPrice) {
+ this.minPrice = minPrice;
+ }
+ public BigDecimal getMaxPrice() {
+ return maxPrice;
+ }
+ public void setMaxPrice(BigDecimal maxPrice) {
+ this.maxPrice = maxPrice;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/SearchProductList.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/SearchProductList.java
index 528462f..3415171 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/SearchProductList.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/SearchProductList.java
@@ -1,27 +1,27 @@
-package com.salesmanager.shop.model.catalog;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import com.salesmanager.shop.model.catalog.category.ReadableCategory;
-
-
-/**
- * Object representing the results of a search query
- * @author Carl Samson
- *
- */
-public class SearchProductList extends ProductList {
-
-
- private static final long serialVersionUID = 1L;
- private List<ReadableCategory> categoryFacets = new ArrayList<ReadableCategory>();
- public List<ReadableCategory> getCategoryFacets() {
- return categoryFacets;
- }
- public void setCategoryFacets(List<ReadableCategory> categoryFacets) {
- this.categoryFacets = categoryFacets;
- }
-
-
-}
+package com.salesmanager.shop.model.catalog;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.salesmanager.shop.model.catalog.category.ReadableCategory;
+
+
+/**
+ * Object representing the results of a search query
+ * @author Carl Samson
+ *
+ */
+public class SearchProductList extends ProductList {
+
+
+ private static final long serialVersionUID = 1L;
+ private List<ReadableCategory> categoryFacets = new ArrayList<ReadableCategory>();
+ public List<ReadableCategory> getCategoryFacets() {
+ return categoryFacets;
+ }
+ public void setCategoryFacets(List<ReadableCategory> categoryFacets) {
+ this.categoryFacets = categoryFacets;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/SearchProductRequest.java b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/SearchProductRequest.java
new file mode 100644
index 0000000..1da197a
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/catalog/SearchProductRequest.java
@@ -0,0 +1,45 @@
+package com.salesmanager.shop.model.catalog;
+
+import java.io.Serializable;
+
+/**
+ * Search product request
+ * @author c.samson
+ *
+ */
+public class SearchProductRequest implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private String query;
+ private int count;
+ private int start;
+
+ public String getQuery() {
+ return query;
+ }
+
+ public void setQuery(String query) {
+ this.query = query;
+ }
+
+ public int getStart() {
+ return start;
+ }
+
+ public void setStart(int start) {
+ this.start = start;
+ }
+
+ public int getCount() {
+ return count;
+ }
+
+ public void setCount(int count) {
+ this.count = count;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/Address.java b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/Address.java
index 37c5599..8a96c0d 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/Address.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/Address.java
@@ -1,163 +1,164 @@
-package com.salesmanager.shop.model.customer;
-
-import java.io.Serializable;
-
-import org.hibernate.validator.constraints.NotEmpty;
-
-
-public class Address implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- @NotEmpty(message="{NotEmpty.customer.firstName}")
- private String firstName;
-
- @NotEmpty(message="{NotEmpty.customer.lastName}")
- private String lastName;
- private String bilstateOther;
-
- private String company;
-
- private String phone;
- private String address;
- private String city;
-
-
- private String postalCode;
-
-
- private String stateProvince;
- private boolean billingAddress;
-
- private String latitude;
- private String longitude;
-
- private String zone;//code
-
- @NotEmpty(message="{NotEmpty.customer.billing.country}")
- private String country;//code
-
-
-
- public void setStateProvince(String stateProvince) {
- this.stateProvince = stateProvince;
- }
-
- public void setCountry(String country) {
- this.country = country;
- }
-
-
-
- public String getCompany() {
- return company;
- }
-
- public void setCompany(String company) {
- this.company = company;
- }
-
- public String getAddress() {
- return address;
- }
-
- public void setAddress(String address) {
- this.address = address;
- }
-
- public String getCity() {
- return city;
- }
-
- public void setCity(String city) {
- this.city = city;
- }
-
- public String getPostalCode() {
- return postalCode;
- }
-
- public void setPostalCode(String postalCode) {
- this.postalCode = postalCode;
- }
-
- public String getStateProvince() {
- return stateProvince;
- }
-
- public String getCountry() {
- return country;
- }
-
- public void setZone(String zone) {
- this.zone = zone;
- }
-
- public String getZone() {
- return zone;
- }
-
- public void setPhone(String phone) {
- this.phone = phone;
- }
-
- public String getPhone() {
- return phone;
- }
-
- public String getFirstName() {
- return firstName;
- }
-
- public void setFirstName(String firstName) {
- this.firstName = firstName;
- }
-
- public String getLastName() {
- return lastName;
- }
-
- public void setLastName(String lastName) {
- this.lastName = lastName;
- }
-
- public boolean isBillingAddress()
- {
- return billingAddress;
- }
-
- public void setBillingAddress( boolean billingAddress )
- {
- this.billingAddress = billingAddress;
- }
-
- public String getBilstateOther()
- {
- return bilstateOther;
- }
-
- public void setBilstateOther( String bilstateOther )
- {
- this.bilstateOther = bilstateOther;
- }
-
- public String getLatitude() {
- return latitude;
- }
-
- public void setLatitude(String latitude) {
- this.latitude = latitude;
- }
-
- public String getLongitude() {
- return longitude;
- }
-
- public void setLongitude(String longitude) {
- this.longitude = longitude;
- }
-
-}
+package com.salesmanager.shop.model.customer;
+
+import java.io.Serializable;
+
+import org.hibernate.validator.constraints.NotEmpty;
+
+
+public class Address implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ @NotEmpty(message="{NotEmpty.customer.firstName}")
+ private String firstName;
+
+ @NotEmpty(message="{NotEmpty.customer.lastName}")
+ private String lastName;
+
+ private String bilstateOther;
+
+ private String company;
+
+ private String phone;
+ private String address;
+ private String city;
+
+
+ private String postalCode;
+
+
+ private String stateProvince;
+ private boolean billingAddress;
+
+ private String latitude;
+ private String longitude;
+
+ private String zone;//code
+
+ @NotEmpty(message="{NotEmpty.customer.billing.country}")
+ private String country;//code
+
+
+
+ public void setStateProvince(String stateProvince) {
+ this.stateProvince = stateProvince;
+ }
+
+ public void setCountry(String country) {
+ this.country = country;
+ }
+
+
+
+ public String getCompany() {
+ return company;
+ }
+
+ public void setCompany(String company) {
+ this.company = company;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public String getPostalCode() {
+ return postalCode;
+ }
+
+ public void setPostalCode(String postalCode) {
+ this.postalCode = postalCode;
+ }
+
+ public String getStateProvince() {
+ return stateProvince;
+ }
+
+ public String getCountry() {
+ return country;
+ }
+
+ public void setZone(String zone) {
+ this.zone = zone;
+ }
+
+ public String getZone() {
+ return zone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public boolean isBillingAddress()
+ {
+ return billingAddress;
+ }
+
+ public void setBillingAddress( boolean billingAddress )
+ {
+ this.billingAddress = billingAddress;
+ }
+
+ public String getBilstateOther()
+ {
+ return bilstateOther;
+ }
+
+ public void setBilstateOther( String bilstateOther )
+ {
+ this.bilstateOther = bilstateOther;
+ }
+
+ public String getLatitude() {
+ return latitude;
+ }
+
+ public void setLatitude(String latitude) {
+ this.latitude = latitude;
+ }
+
+ public String getLongitude() {
+ return longitude;
+ }
+
+ public void setLongitude(String longitude) {
+ this.longitude = longitude;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerAttributeEntity.java b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerAttributeEntity.java
index 69da2ed..3a7c1b4 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerAttributeEntity.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerAttributeEntity.java
@@ -1,22 +1,22 @@
-package com.salesmanager.shop.model.customer.attribute;
-
-import java.io.Serializable;
-
-public class CustomerAttributeEntity extends CustomerAttribute implements
- Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String textValue;
- public void setTextValue(String textValue) {
- this.textValue = textValue;
- }
- public String getTextValue() {
- return textValue;
- }
-
-
-
-}
+package com.salesmanager.shop.model.customer.attribute;
+
+import java.io.Serializable;
+
+public class CustomerAttributeEntity extends CustomerAttribute implements
+ Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String textValue;
+ public void setTextValue(String textValue) {
+ this.textValue = textValue;
+ }
+ public String getTextValue() {
+ return textValue;
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOption.java b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOption.java
index a4eee82..a93acf4 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOption.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOption.java
@@ -1,18 +1,18 @@
-package com.salesmanager.shop.model.customer.attribute;
-
-import java.io.Serializable;
-
-import com.salesmanager.shop.model.Entity;
-
-
-public class CustomerOption extends Entity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
-
-
-
-}
+package com.salesmanager.shop.model.customer.attribute;
+
+import java.io.Serializable;
+
+import com.salesmanager.shop.model.Entity;
+
+
+public class CustomerOption extends Entity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionDescription.java b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionDescription.java
index 875d27c..7e360a9 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionDescription.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionDescription.java
@@ -1,16 +1,16 @@
-package com.salesmanager.shop.model.customer.attribute;
-
-import java.io.Serializable;
-
-import com.salesmanager.shop.model.catalog.CatalogEntity;
-
-
-public class CustomerOptionDescription extends CatalogEntity implements
- Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
-}
+package com.salesmanager.shop.model.customer.attribute;
+
+import java.io.Serializable;
+
+import com.salesmanager.shop.model.catalog.CatalogEntity;
+
+
+public class CustomerOptionDescription extends CatalogEntity implements
+ Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionEntity.java b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionEntity.java
index 692869f..032c9ec 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionEntity.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionEntity.java
@@ -1,34 +1,34 @@
-package com.salesmanager.shop.model.customer.attribute;
-
-import java.io.Serializable;
-
-public class CustomerOptionEntity extends CustomerOption implements
- Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private int order;
- private String code;
- private String type;//TEXT|SELECT|RADIO|CHECKBOX
- public void setOrder(int order) {
- this.order = order;
- }
- public int getOrder() {
- return order;
- }
- public void setCode(String code) {
- this.code = code;
- }
- public String getCode() {
- return code;
- }
- public String getType() {
- return type;
- }
- public void setType(String type) {
- this.type = type;
- }
-
-}
+package com.salesmanager.shop.model.customer.attribute;
+
+import java.io.Serializable;
+
+public class CustomerOptionEntity extends CustomerOption implements
+ Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private int order;
+ private String code;
+ private String type;//TEXT|SELECT|RADIO|CHECKBOX
+ public void setOrder(int order) {
+ this.order = order;
+ }
+ public int getOrder() {
+ return order;
+ }
+ public void setCode(String code) {
+ this.code = code;
+ }
+ public String getCode() {
+ return code;
+ }
+ public String getType() {
+ return type;
+ }
+ public void setType(String type) {
+ this.type = type;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionValue.java b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionValue.java
index 52b187a..d7caff9 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionValue.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionValue.java
@@ -1,16 +1,16 @@
-package com.salesmanager.shop.model.customer.attribute;
-
-import java.io.Serializable;
-
-import com.salesmanager.shop.model.Entity;
-
-
-public class CustomerOptionValue extends Entity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
-
-}
+package com.salesmanager.shop.model.customer.attribute;
+
+import java.io.Serializable;
+
+import com.salesmanager.shop.model.Entity;
+
+
+public class CustomerOptionValue extends Entity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionValueDescription.java b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionValueDescription.java
index 56b36fb..af4d77a 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionValueDescription.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionValueDescription.java
@@ -1,15 +1,15 @@
-package com.salesmanager.shop.model.customer.attribute;
-
-import java.io.Serializable;
-
-import com.salesmanager.shop.model.catalog.CatalogEntity;
-
-public class CustomerOptionValueDescription extends CatalogEntity implements
- Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
-}
+package com.salesmanager.shop.model.customer.attribute;
+
+import java.io.Serializable;
+
+import com.salesmanager.shop.model.catalog.CatalogEntity;
+
+public class CustomerOptionValueDescription extends CatalogEntity implements
+ Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionValueEntity.java b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionValueEntity.java
index a55ab7f..eb38043 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionValueEntity.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/CustomerOptionValueEntity.java
@@ -1,27 +1,27 @@
-package com.salesmanager.shop.model.customer.attribute;
-
-import java.io.Serializable;
-
-public class CustomerOptionValueEntity extends CustomerOptionValue implements
- Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private int order;
- private String code;
- public void setOrder(int order) {
- this.order = order;
- }
- public int getOrder() {
- return order;
- }
- public void setCode(String code) {
- this.code = code;
- }
- public String getCode() {
- return code;
- }
-
-}
+package com.salesmanager.shop.model.customer.attribute;
+
+import java.io.Serializable;
+
+public class CustomerOptionValueEntity extends CustomerOptionValue implements
+ Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private int order;
+ private String code;
+ public void setOrder(int order) {
+ this.order = order;
+ }
+ public int getOrder() {
+ return order;
+ }
+ public void setCode(String code) {
+ this.code = code;
+ }
+ public String getCode() {
+ return code;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/PersistableCustomerAttribute.java b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/PersistableCustomerAttribute.java
index a2a8c4f..7881b03 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/PersistableCustomerAttribute.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/PersistableCustomerAttribute.java
@@ -1,25 +1,25 @@
-package com.salesmanager.shop.model.customer.attribute;
-
-public class PersistableCustomerAttribute extends CustomerAttributeEntity {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private CustomerOption customerOption;
- private CustomerOptionValue customerOptionValue;
- public void setCustomerOptionValue(CustomerOptionValue customerOptionValue) {
- this.customerOptionValue = customerOptionValue;
- }
- public CustomerOptionValue getCustomerOptionValue() {
- return customerOptionValue;
- }
- public void setCustomerOption(CustomerOption customerOption) {
- this.customerOption = customerOption;
- }
- public CustomerOption getCustomerOption() {
- return customerOption;
- }
-
-
-}
+package com.salesmanager.shop.model.customer.attribute;
+
+public class PersistableCustomerAttribute extends CustomerAttributeEntity {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private CustomerOption customerOption;
+ private CustomerOptionValue customerOptionValue;
+ public void setCustomerOptionValue(CustomerOptionValue customerOptionValue) {
+ this.customerOptionValue = customerOptionValue;
+ }
+ public CustomerOptionValue getCustomerOptionValue() {
+ return customerOptionValue;
+ }
+ public void setCustomerOption(CustomerOption customerOption) {
+ this.customerOption = customerOption;
+ }
+ public CustomerOption getCustomerOption() {
+ return customerOption;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/PersistableCustomerOption.java b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/PersistableCustomerOption.java
index 311d6b8..c239225 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/PersistableCustomerOption.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/PersistableCustomerOption.java
@@ -1,23 +1,23 @@
-package com.salesmanager.shop.model.customer.attribute;
-
-import java.io.Serializable;
-import java.util.List;
-
-public class PersistableCustomerOption extends CustomerOptionEntity
- implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private List<CustomerOptionDescription> descriptions;
-
- public void setDescriptions(List<CustomerOptionDescription> descriptions) {
- this.descriptions = descriptions;
- }
-
- public List<CustomerOptionDescription> getDescriptions() {
- return descriptions;
- }
-
-}
+package com.salesmanager.shop.model.customer.attribute;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class PersistableCustomerOption extends CustomerOptionEntity
+ implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private List<CustomerOptionDescription> descriptions;
+
+ public void setDescriptions(List<CustomerOptionDescription> descriptions) {
+ this.descriptions = descriptions;
+ }
+
+ public List<CustomerOptionDescription> getDescriptions() {
+ return descriptions;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/PersistableCustomerOptionValue.java b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/PersistableCustomerOptionValue.java
index 60a2f65..59150bf 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/PersistableCustomerOptionValue.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/PersistableCustomerOptionValue.java
@@ -1,23 +1,23 @@
-package com.salesmanager.shop.model.customer.attribute;
-
-import java.io.Serializable;
-import java.util.List;
-
-public class PersistableCustomerOptionValue extends CustomerOptionValueEntity
- implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private List<CustomerOptionValueDescription> descriptions;
-
- public void setDescriptions(List<CustomerOptionValueDescription> descriptions) {
- this.descriptions = descriptions;
- }
-
- public List<CustomerOptionValueDescription> getDescriptions() {
- return descriptions;
- }
-
-}
+package com.salesmanager.shop.model.customer.attribute;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class PersistableCustomerOptionValue extends CustomerOptionValueEntity
+ implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private List<CustomerOptionValueDescription> descriptions;
+
+ public void setDescriptions(List<CustomerOptionValueDescription> descriptions) {
+ this.descriptions = descriptions;
+ }
+
+ public List<CustomerOptionValueDescription> getDescriptions() {
+ return descriptions;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/ReadableCustomerAttribute.java b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/ReadableCustomerAttribute.java
index 2e6d172..4ca7eb6 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/ReadableCustomerAttribute.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/ReadableCustomerAttribute.java
@@ -1,26 +1,26 @@
-package com.salesmanager.shop.model.customer.attribute;
-
-public class ReadableCustomerAttribute extends CustomerAttributeEntity {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private ReadableCustomerOption customerOption;
- private ReadableCustomerOptionValue customerOptionValue;
- public void setCustomerOption(ReadableCustomerOption customerOption) {
- this.customerOption = customerOption;
- }
- public ReadableCustomerOption getCustomerOption() {
- return customerOption;
- }
- public void setCustomerOptionValue(ReadableCustomerOptionValue customerOptionValue) {
- this.customerOptionValue = customerOptionValue;
- }
- public ReadableCustomerOptionValue getCustomerOptionValue() {
- return customerOptionValue;
- }
-
-
-
-}
+package com.salesmanager.shop.model.customer.attribute;
+
+public class ReadableCustomerAttribute extends CustomerAttributeEntity {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private ReadableCustomerOption customerOption;
+ private ReadableCustomerOptionValue customerOptionValue;
+ public void setCustomerOption(ReadableCustomerOption customerOption) {
+ this.customerOption = customerOption;
+ }
+ public ReadableCustomerOption getCustomerOption() {
+ return customerOption;
+ }
+ public void setCustomerOptionValue(ReadableCustomerOptionValue customerOptionValue) {
+ this.customerOptionValue = customerOptionValue;
+ }
+ public ReadableCustomerOptionValue getCustomerOptionValue() {
+ return customerOptionValue;
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/ReadableCustomerOption.java b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/ReadableCustomerOption.java
index 71c2e8d..7cd4547 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/ReadableCustomerOption.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/ReadableCustomerOption.java
@@ -1,22 +1,22 @@
-package com.salesmanager.shop.model.customer.attribute;
-
-import java.io.Serializable;
-
-public class ReadableCustomerOption extends CustomerOptionEntity
- implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private CustomerOptionDescription description;
- public void setDescription(CustomerOptionDescription description) {
- this.description = description;
- }
- public CustomerOptionDescription getDescription() {
- return description;
- }
-
-
-
-}
+package com.salesmanager.shop.model.customer.attribute;
+
+import java.io.Serializable;
+
+public class ReadableCustomerOption extends CustomerOptionEntity
+ implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private CustomerOptionDescription description;
+ public void setDescription(CustomerOptionDescription description) {
+ this.description = description;
+ }
+ public CustomerOptionDescription getDescription() {
+ return description;
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/ReadableCustomerOptionValue.java b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/ReadableCustomerOptionValue.java
index bbcbcec..7a2836d 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/ReadableCustomerOptionValue.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/attribute/ReadableCustomerOptionValue.java
@@ -1,22 +1,22 @@
-package com.salesmanager.shop.model.customer.attribute;
-
-import java.io.Serializable;
-
-public class ReadableCustomerOptionValue extends CustomerOptionValueEntity
- implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private CustomerOptionValueDescription description;
- public void setDescription(CustomerOptionValueDescription description) {
- this.description = description;
- }
- public CustomerOptionValueDescription getDescription() {
- return description;
- }
-
-
-
-}
+package com.salesmanager.shop.model.customer.attribute;
+
+import java.io.Serializable;
+
+public class ReadableCustomerOptionValue extends CustomerOptionValueEntity
+ implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private CustomerOptionValueDescription description;
+ public void setDescription(CustomerOptionValueDescription description) {
+ this.description = description;
+ }
+ public CustomerOptionValueDescription getDescription() {
+ return description;
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/CustomerEntity.java b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/CustomerEntity.java
index 2a8e9a5..5eccf3e 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/CustomerEntity.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/CustomerEntity.java
@@ -1,134 +1,147 @@
-package com.salesmanager.shop.model.customer;
-
-import java.io.Serializable;
-
-import javax.validation.Valid;
-
-import org.hibernate.validator.constraints.Email;
-import org.hibernate.validator.constraints.NotEmpty;
-
-public class CustomerEntity extends Customer implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
-
- @Email (message="{messages.invalid.email}")
- @NotEmpty(message="{NotEmpty.customer.emailAddress}")
- private String emailAddress;
- @Valid
- private Address billing;
- private Address delivery;
- private String gender;
-
- private String language;
- private String firstName;
- private String lastName;
-
- private String encodedPassword = null;
- private String clearPassword = null;
-
- private String storeCode;
-
- @NotEmpty(message="{NotEmpty.customer.userName}")
- private String userName;
-
- public void setUserName(final String userName) {
- this.userName = userName;
- }
-
- public String getUserName() {
- return userName;
- }
-
-
- public void setStoreCode(final String storeCode) {
- this.storeCode = storeCode;
- }
-
-
- public String getStoreCode() {
- return storeCode;
- }
-
-
- public void setEmailAddress(final String emailAddress) {
- this.emailAddress = emailAddress;
- }
-
-
- public String getEmailAddress() {
- return emailAddress;
- }
-
-
- public void setLanguage(final String language) {
- this.language = language;
- }
- public String getLanguage() {
- return language;
- }
-
-
- public Address getBilling() {
- return billing;
- }
- public void setBilling(final Address billing) {
- this.billing = billing;
- }
- public Address getDelivery() {
- return delivery;
- }
- public void setDelivery(final Address delivery) {
- this.delivery = delivery;
- }
- public void setGender(final String gender) {
- this.gender = gender;
- }
- public String getGender() {
- return gender;
- }
-
-
- public String getFirstName() {
- return firstName;
- }
-
-
- public void setFirstName(String firstName) {
- this.firstName = firstName;
- }
-
-
- public String getLastName() {
- return lastName;
- }
-
-
- public void setLastName(String lastName) {
- this.lastName = lastName;
- }
-
- public String getEncodedPassword() {
- return encodedPassword;
- }
-
- public void setEncodedPassword(String encodedPassword) {
- this.encodedPassword = encodedPassword;
- }
-
- public String getClearPassword() {
- return clearPassword;
- }
-
- public void setClearPassword(String clearPassword) {
- this.clearPassword = clearPassword;
- }
-
-
-
-
-
-}
+package com.salesmanager.shop.model.customer;
+
+import java.io.Serializable;
+
+import javax.validation.Valid;
+
+import org.hibernate.validator.constraints.Email;
+import org.hibernate.validator.constraints.NotEmpty;
+
+public class CustomerEntity extends Customer implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+
+ @Email (message="{messages.invalid.email}")
+ @NotEmpty(message="{NotEmpty.customer.emailAddress}")
+ private String emailAddress;
+ @Valid
+ private Address billing;
+ private Address delivery;
+ private String gender;
+
+ private String language;
+ private String firstName;
+ private String lastName;
+
+ private String provider;//online, facebook ...
+
+
+ private String storeCode;
+
+ @NotEmpty(message="{NotEmpty.customer.userName}")
+ //can be email or anything else
+ private String userName;
+
+ private Double rating = 0D;
+ private int ratingCount;
+
+ public void setUserName(final String userName) {
+ this.userName = userName;
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+
+ public void setStoreCode(final String storeCode) {
+ this.storeCode = storeCode;
+ }
+
+
+ public String getStoreCode() {
+ return storeCode;
+ }
+
+
+ public void setEmailAddress(final String emailAddress) {
+ this.emailAddress = emailAddress;
+ }
+
+
+ public String getEmailAddress() {
+ return emailAddress;
+ }
+
+
+ public void setLanguage(final String language) {
+ this.language = language;
+ }
+ public String getLanguage() {
+ return language;
+ }
+
+
+ public Address getBilling() {
+ return billing;
+ }
+ public void setBilling(final Address billing) {
+ this.billing = billing;
+ }
+ public Address getDelivery() {
+ return delivery;
+ }
+ public void setDelivery(final Address delivery) {
+ this.delivery = delivery;
+ }
+ public void setGender(final String gender) {
+ this.gender = gender;
+ }
+ public String getGender() {
+ return gender;
+ }
+
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+
+ public String getLastName() {
+ return lastName;
+ }
+
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+
+ public int getRatingCount() {
+ return ratingCount;
+ }
+
+ public void setRatingCount(int ratingCount) {
+ this.ratingCount = ratingCount;
+ }
+
+ public Double getRating() {
+ return rating;
+ }
+
+ public void setRating(Double rating) {
+ this.rating = rating;
+ }
+
+ public String getProvider() {
+ return provider;
+ }
+
+ public void setProvider(String provider) {
+ this.provider = provider;
+ }
+
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/CustomerReviewEntity.java b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/CustomerReviewEntity.java
new file mode 100644
index 0000000..f11963b
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/CustomerReviewEntity.java
@@ -0,0 +1,56 @@
+package com.salesmanager.shop.model.customer;
+
+import java.io.Serializable;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+
+import org.hibernate.validator.constraints.NotEmpty;
+
+import com.salesmanager.shop.model.ShopEntity;
+
+
+public class CustomerReviewEntity extends ShopEntity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ @NotEmpty
+ private String description;
+ private Long customerId;//review creator
+ private String date;
+
+ @NotNull
+ @Min(1)
+ @Max(5)
+ private Double rating;
+ public String getDescription() {
+ return description;
+ }
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public Double getRating() {
+ return rating;
+ }
+ public void setRating(Double rating) {
+ this.rating = rating;
+ }
+ public String getDate() {
+ return date;
+ }
+ public void setDate(String date) {
+ this.date = date;
+ }
+ public Long getCustomerId() {
+ return customerId;
+ }
+ public void setCustomerId(Long customerId) {
+ this.customerId = customerId;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/DeliveryEntity.java b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/DeliveryEntity.java
index fe66c63..0149e4e 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/DeliveryEntity.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/DeliveryEntity.java
@@ -1,41 +1,41 @@
-package com.salesmanager.shop.model.customer;
-
-import java.io.Serializable;
-
-import javax.persistence.Transient;
-
-
-public class DeliveryEntity extends Address implements Serializable {
-
-
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- @Transient
- private String countryName;
-
- @Transient
- private String provinceName;
-
-
- public String getCountryName() {
- return countryName;
- }
-
- public void setCountryName(String countryName) {
- this.countryName = countryName;
- }
-
- public String getProvinceName() {
- return provinceName;
- }
-
- public void setProvinceName(String provinceName) {
- this.provinceName = provinceName;
- }
-
-
-}
+package com.salesmanager.shop.model.customer;
+
+import java.io.Serializable;
+
+import javax.persistence.Transient;
+
+
+public class DeliveryEntity extends Address implements Serializable {
+
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ @Transient
+ private String countryName;
+
+ @Transient
+ private String provinceName;
+
+
+ public String getCountryName() {
+ return countryName;
+ }
+
+ public void setCountryName(String countryName) {
+ this.countryName = countryName;
+ }
+
+ public String getProvinceName() {
+ return provinceName;
+ }
+
+ public void setProvinceName(String provinceName) {
+ this.provinceName = provinceName;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/PersistableCustomer.java b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/PersistableCustomer.java
index 656e826..7034595 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/PersistableCustomer.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/PersistableCustomer.java
@@ -1,25 +1,49 @@
-package com.salesmanager.shop.model.customer;
-
-import java.io.Serializable;
-import java.util.List;
-
-import com.salesmanager.shop.model.customer.attribute.PersistableCustomerAttribute;
-
-
-
-public class PersistableCustomer extends CustomerEntity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private List<PersistableCustomerAttribute> attributes;
- public void setAttributes(List<PersistableCustomerAttribute> attributes) {
- this.attributes = attributes;
- }
- public List<PersistableCustomerAttribute> getAttributes() {
- return attributes;
- }
-
-
-}
+package com.salesmanager.shop.model.customer;
+
+import java.io.Serializable;
+import java.util.List;
+
+import com.salesmanager.shop.model.customer.attribute.PersistableCustomerAttribute;
+import com.salesmanager.shop.model.security.PersistableGroup;
+
+
+
+public class PersistableCustomer extends CustomerEntity implements Serializable {
+
+ /**
+ *
+ */
+ private String encodedPassword = null;
+ private String clearPassword = null;
+ private static final long serialVersionUID = 1L;
+ private List<PersistableCustomerAttribute> attributes;
+ private List<PersistableGroup> groups;
+
+
+ public void setAttributes(List<PersistableCustomerAttribute> attributes) {
+ this.attributes = attributes;
+ }
+ public List<PersistableCustomerAttribute> getAttributes() {
+ return attributes;
+ }
+ public String getEncodedPassword() {
+ return encodedPassword;
+ }
+ public void setEncodedPassword(String encodedPassword) {
+ this.encodedPassword = encodedPassword;
+ }
+ public String getClearPassword() {
+ return clearPassword;
+ }
+ public void setClearPassword(String clearPassword) {
+ this.clearPassword = clearPassword;
+ }
+ public List<PersistableGroup> getGroups() {
+ return groups;
+ }
+ public void setGroups(List<PersistableGroup> groups) {
+ this.groups = groups;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/PersistableCustomerReview.java b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/PersistableCustomerReview.java
new file mode 100644
index 0000000..34d63c3
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/PersistableCustomerReview.java
@@ -0,0 +1,19 @@
+package com.salesmanager.shop.model.customer;
+
+public class PersistableCustomerReview extends CustomerReviewEntity {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private Long reviewedCustomer;
+
+ public Long getReviewedCustomer() {
+ return reviewedCustomer;
+ }
+
+ public void setReviewedCustomer(Long reviewedCustomer) {
+ this.reviewedCustomer = reviewedCustomer;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/ReadableCustomer.java b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/ReadableCustomer.java
index d2601eb..d23337f 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/ReadableCustomer.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/ReadableCustomer.java
@@ -1,24 +1,33 @@
-package com.salesmanager.shop.model.customer;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-import com.salesmanager.shop.model.customer.attribute.ReadableCustomerAttribute;
-
-
-public class ReadableCustomer extends CustomerEntity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private List<ReadableCustomerAttribute> attributes = new ArrayList<ReadableCustomerAttribute>();
- public void setAttributes(List<ReadableCustomerAttribute> attributes) {
- this.attributes = attributes;
- }
- public List<ReadableCustomerAttribute> getAttributes() {
- return attributes;
- }
-
-}
+package com.salesmanager.shop.model.customer;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.salesmanager.shop.model.customer.attribute.ReadableCustomerAttribute;
+import com.salesmanager.shop.model.security.ReadableGroup;
+
+
+public class ReadableCustomer extends CustomerEntity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private List<ReadableCustomerAttribute> attributes = new ArrayList<ReadableCustomerAttribute>();
+ private List<ReadableGroup> groups = new ArrayList<ReadableGroup>();
+
+ public void setAttributes(List<ReadableCustomerAttribute> attributes) {
+ this.attributes = attributes;
+ }
+ public List<ReadableCustomerAttribute> getAttributes() {
+ return attributes;
+ }
+ public List<ReadableGroup> getGroups() {
+ return groups;
+ }
+ public void setGroups(List<ReadableGroup> groups) {
+ this.groups = groups;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/ReadableCustomerReview.java b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/ReadableCustomerReview.java
new file mode 100644
index 0000000..6ec2af4
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/ReadableCustomerReview.java
@@ -0,0 +1,18 @@
+package com.salesmanager.shop.model.customer;
+
+public class ReadableCustomerReview extends CustomerReviewEntity {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private ReadableCustomer reviewedCustomer;
+ public ReadableCustomer getReviewedCustomer() {
+ return reviewedCustomer;
+ }
+ public void setReviewedCustomer(ReadableCustomer reviewedCustomer) {
+ this.reviewedCustomer = reviewedCustomer;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/SecuredCustomer.java b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/SecuredCustomer.java
index 6d22056..226ec20 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/SecuredCustomer.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/SecuredCustomer.java
@@ -1,51 +1,51 @@
-package com.salesmanager.shop.model.customer;
-
-import java.io.Serializable;
-
-import javax.validation.constraints.Size;
-
-import com.salesmanager.shop.utils.FieldMatch;
-
-
-@FieldMatch.List({
- @FieldMatch(first="password",second="checkPassword",message="password.notequal")
-
-})
-public class SecuredCustomer extends PersistableCustomer implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
-
-
- @Size(min=6, message="{registration.password.not.empty}")
- private String password;
-
- @Size(min=6, message="{registration.password.not.empty}")
- private String checkPassword;
-
-
-
- public String getPassword() {
- return password;
- }
-
- public void setPassword(String password) {
- this.password = password;
- }
-
- public String getCheckPassword()
- {
- return checkPassword;
- }
-
- public void setCheckPassword( String checkPassword )
- {
- this.checkPassword = checkPassword;
- }
-
-
-
-}
+package com.salesmanager.shop.model.customer;
+
+import java.io.Serializable;
+
+import javax.validation.constraints.Size;
+
+import com.salesmanager.shop.utils.FieldMatch;
+
+
+@FieldMatch.List({
+ @FieldMatch(first="password",second="checkPassword",message="password.notequal")
+
+})
+public class SecuredCustomer extends PersistableCustomer implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+
+
+ @Size(min=6, message="{registration.password.not.empty}")
+ private String password;
+
+ @Size(min=6, message="{registration.password.not.empty}")
+ private String checkPassword;
+
+
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public String getCheckPassword()
+ {
+ return checkPassword;
+ }
+
+ public void setCheckPassword( String checkPassword )
+ {
+ this.checkPassword = checkPassword;
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/customer/UserAlreadyExistException.java b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/UserAlreadyExistException.java
new file mode 100644
index 0000000..ca0fd15
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/customer/UserAlreadyExistException.java
@@ -0,0 +1,13 @@
+package com.salesmanager.shop.model.customer;
+
+public class UserAlreadyExistException extends Exception {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ public UserAlreadyExistException(String message) {
+ super(message,null);
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/Entity.java b/sm-shop/src/main/java/com/salesmanager/shop/model/Entity.java
index a9cc2a1..4e012e5 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/Entity.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/Entity.java
@@ -1,19 +1,19 @@
-package com.salesmanager.shop.model;
-
-import java.io.Serializable;
-
-public class Entity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private Long id = 0L;
- public void setId(Long id) {
- this.id = id;
- }
- public Long getId() {
- return id;
- }
-
-}
+package com.salesmanager.shop.model;
+
+import java.io.Serializable;
+
+public class Entity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private Long id = 0L;
+ public void setId(Long id) {
+ this.id = id;
+ }
+ public Long getId() {
+ return id;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/Order.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/Order.java
index 840f916..1f82d34 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/order/Order.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/Order.java
@@ -1,14 +1,14 @@
-package com.salesmanager.shop.model.order;
-
-import java.io.Serializable;
-
-import com.salesmanager.shop.model.Entity;
-
-public class Order extends Entity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
-}
+package com.salesmanager.shop.model.order;
+
+import java.io.Serializable;
+
+import com.salesmanager.shop.model.Entity;
+
+public class Order extends Entity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/OrderApi.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/OrderApi.java
new file mode 100644
index 0000000..850b135
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/OrderApi.java
@@ -0,0 +1,55 @@
+package com.salesmanager.shop.model.order;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.salesmanager.shop.model.Entity;
+
+public class OrderApi extends Entity {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private boolean customerAgreement;
+ private String comments;
+ private String currency;
+ private List<OrderAttribute> attributes = new ArrayList<OrderAttribute>();
+
+
+ public boolean isCustomerAgreement() {
+ return customerAgreement;
+ }
+
+ public void setCustomerAgreement(boolean customerAgreement) {
+ this.customerAgreement = customerAgreement;
+ }
+
+ public String getComments() {
+ return comments;
+ }
+
+ public void setComments(String comments) {
+ this.comments = comments;
+ }
+
+ public String getCurrency() {
+ return currency;
+ }
+
+ public void setCurrency(String currency) {
+ this.currency = currency;
+ }
+
+ public List<OrderAttribute> getAttributes() {
+ return attributes;
+ }
+
+ public void setAttributes(List<OrderAttribute> attributes) {
+ this.attributes = attributes;
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/OrderAttribute.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/OrderAttribute.java
new file mode 100644
index 0000000..c4616f0
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/OrderAttribute.java
@@ -0,0 +1,20 @@
+package com.salesmanager.shop.model.order;
+
+public class OrderAttribute {
+
+ private String key;
+ private String value;
+ public String getKey() {
+ return key;
+ }
+ public void setKey(String key) {
+ this.key = key;
+ }
+ public String getValue() {
+ return value;
+ }
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/OrderEntity.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/OrderEntity.java
index 86060ed..36077ad 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/order/OrderEntity.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/OrderEntity.java
@@ -1,99 +1,115 @@
-package com.salesmanager.shop.model.order;
-
-import java.io.Serializable;
-import java.util.Date;
-import java.util.List;
-
-import com.salesmanager.core.model.order.orderstatus.OrderStatus;
-import com.salesmanager.core.model.order.payment.CreditCard;
-import com.salesmanager.core.model.payments.PaymentType;
-
-public class OrderEntity extends Order implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private List<OrderTotal> totals;
-
- private PaymentType paymentType;
- private String paymentModule;
- private String shippingModule;
- private List<OrderStatus> previousOrderStatus;
- private OrderStatus orderStatus;
- private CreditCard creditCard;
- private Date datePurchased;
- private String currency;
- private boolean customerAgreed;
- private boolean confirmedAddress;
-
- public void setTotals(List<OrderTotal> totals) {
- this.totals = totals;
- }
- public List<OrderTotal> getTotals() {
- return totals;
- }
- public PaymentType getPaymentType() {
- return paymentType;
- }
- public void setPaymentType(PaymentType paymentType) {
- this.paymentType = paymentType;
- }
- public String getPaymentModule() {
- return paymentModule;
- }
- public void setPaymentModule(String paymentModule) {
- this.paymentModule = paymentModule;
- }
- public String getShippingModule() {
- return shippingModule;
- }
- public void setShippingModule(String shippingModule) {
- this.shippingModule = shippingModule;
- }
-
- public CreditCard getCreditCard() {
- return creditCard;
- }
- public void setCreditCard(CreditCard creditCard) {
- this.creditCard = creditCard;
- }
- public Date getDatePurchased() {
- return datePurchased;
- }
- public void setDatePurchased(Date datePurchased) {
- this.datePurchased = datePurchased;
- }
- public void setPreviousOrderStatus(List<OrderStatus> previousOrderStatus) {
- this.previousOrderStatus = previousOrderStatus;
- }
- public List<OrderStatus> getPreviousOrderStatus() {
- return previousOrderStatus;
- }
- public void setOrderStatus(OrderStatus orderStatus) {
- this.orderStatus = orderStatus;
- }
- public OrderStatus getOrderStatus() {
- return orderStatus;
- }
- public String getCurrency() {
- return currency;
- }
- public void setCurrency(String currency) {
- this.currency = currency;
- }
- public boolean isCustomerAgreed() {
- return customerAgreed;
- }
- public void setCustomerAgreed(boolean customerAgreed) {
- this.customerAgreed = customerAgreed;
- }
- public boolean isConfirmedAddress() {
- return confirmedAddress;
- }
- public void setConfirmedAddress(boolean confirmedAddress) {
- this.confirmedAddress = confirmedAddress;
- }
-
-
-}
+package com.salesmanager.shop.model.order;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import com.salesmanager.core.model.order.orderstatus.OrderStatus;
+import com.salesmanager.core.model.order.payment.CreditCard;
+import com.salesmanager.core.model.payments.PaymentType;
+import com.salesmanager.shop.model.order.total.OrderTotal;
+
+public class OrderEntity extends Order implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private List<OrderTotal> totals;
+ private List<OrderAttribute> attributes = new ArrayList<OrderAttribute>();
+
+ private PaymentType paymentType;
+ private String paymentModule;
+ private String shippingModule;
+ private List<OrderStatus> previousOrderStatus;
+ private OrderStatus orderStatus;
+ private CreditCard creditCard;
+ private Date datePurchased;
+ private String currency;
+ private boolean customerAgreed;
+ private boolean confirmedAddress;
+ private String comments;
+
+ public void setTotals(List<OrderTotal> totals) {
+ this.totals = totals;
+ }
+ public List<OrderTotal> getTotals() {
+ return totals;
+ }
+ public PaymentType getPaymentType() {
+ return paymentType;
+ }
+ public void setPaymentType(PaymentType paymentType) {
+ this.paymentType = paymentType;
+ }
+ public String getPaymentModule() {
+ return paymentModule;
+ }
+ public void setPaymentModule(String paymentModule) {
+ this.paymentModule = paymentModule;
+ }
+ public String getShippingModule() {
+ return shippingModule;
+ }
+ public void setShippingModule(String shippingModule) {
+ this.shippingModule = shippingModule;
+ }
+
+ public CreditCard getCreditCard() {
+ return creditCard;
+ }
+ public void setCreditCard(CreditCard creditCard) {
+ this.creditCard = creditCard;
+ }
+ public Date getDatePurchased() {
+ return datePurchased;
+ }
+ public void setDatePurchased(Date datePurchased) {
+ this.datePurchased = datePurchased;
+ }
+ public void setPreviousOrderStatus(List<OrderStatus> previousOrderStatus) {
+ this.previousOrderStatus = previousOrderStatus;
+ }
+ public List<OrderStatus> getPreviousOrderStatus() {
+ return previousOrderStatus;
+ }
+ public void setOrderStatus(OrderStatus orderStatus) {
+ this.orderStatus = orderStatus;
+ }
+ public OrderStatus getOrderStatus() {
+ return orderStatus;
+ }
+ public String getCurrency() {
+ return currency;
+ }
+ public void setCurrency(String currency) {
+ this.currency = currency;
+ }
+ public boolean isCustomerAgreed() {
+ return customerAgreed;
+ }
+ public void setCustomerAgreed(boolean customerAgreed) {
+ this.customerAgreed = customerAgreed;
+ }
+ public boolean isConfirmedAddress() {
+ return confirmedAddress;
+ }
+ public void setConfirmedAddress(boolean confirmedAddress) {
+ this.confirmedAddress = confirmedAddress;
+ }
+ public String getComments() {
+ return comments;
+ }
+ public void setComments(String comments) {
+ this.comments = comments;
+ }
+ public List<OrderAttribute> getAttributes() {
+ return attributes;
+ }
+ public void setAttributes(List<OrderAttribute> attributes) {
+ this.attributes = attributes;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/OrderProduct.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/OrderProduct.java
index 32d5406..5a2b64f 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/order/OrderProduct.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/OrderProduct.java
@@ -1,15 +1,15 @@
-package com.salesmanager.shop.model.order;
-
-import java.io.Serializable;
-
-import com.salesmanager.shop.model.Entity;
-
-
-public class OrderProduct extends Entity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
-}
+package com.salesmanager.shop.model.order;
+
+import java.io.Serializable;
+
+import com.salesmanager.shop.model.Entity;
+
+
+public class OrderProduct extends Entity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/OrderProductEntity.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/OrderProductEntity.java
index d5afcdb..0644eaa 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/order/OrderProductEntity.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/OrderProductEntity.java
@@ -1,35 +1,35 @@
-package com.salesmanager.shop.model.order;
-
-import java.io.Serializable;
-
-import com.salesmanager.shop.model.catalog.product.ReadableProduct;
-
-public class OrderProductEntity extends OrderProduct implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private int orderedQuantity;
- private ReadableProduct product;
-
-
-
-
- public void setOrderedQuantity(int orderedQuantity) {
- this.orderedQuantity = orderedQuantity;
- }
- public int getOrderedQuantity() {
- return orderedQuantity;
- }
- public ReadableProduct getProduct() {
- return product;
- }
- public void setProduct(ReadableProduct product) {
- this.product = product;
- }
-
-
-
-
-}
+package com.salesmanager.shop.model.order;
+
+import java.io.Serializable;
+
+import com.salesmanager.shop.model.catalog.product.ReadableProduct;
+
+public class OrderProductEntity extends OrderProduct implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private int orderedQuantity;
+ private ReadableProduct product;
+
+
+
+
+ public void setOrderedQuantity(int orderedQuantity) {
+ this.orderedQuantity = orderedQuantity;
+ }
+ public int getOrderedQuantity() {
+ return orderedQuantity;
+ }
+ public ReadableProduct getProduct() {
+ return product;
+ }
+ public void setProduct(ReadableProduct product) {
+ this.product = product;
+ }
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/PersistableOrder.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/PersistableOrder.java
index 36601f7..da4cd56 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/order/PersistableOrder.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/PersistableOrder.java
@@ -1,41 +1,47 @@
-package com.salesmanager.shop.model.order;
-
-import java.io.Serializable;
-import java.util.List;
-
-import com.salesmanager.shop.model.customer.PersistableCustomer;
-
-
-public class PersistableOrder extends OrderEntity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private PersistableCustomer customer;//might already exist if id > 0, otherwise persist
- private List<PersistableOrderProduct> orderProductItems;
- private boolean shipToBillingAdress = true;
-
-
- public void setOrderProductItems(List<PersistableOrderProduct> orderProductItems) {
- this.orderProductItems = orderProductItems;
- }
- public List<PersistableOrderProduct> getOrderProductItems() {
- return orderProductItems;
- }
- public void setCustomer(PersistableCustomer customer) {
- this.customer = customer;
- }
- public PersistableCustomer getCustomer() {
- return customer;
- }
- public boolean isShipToBillingAdress() {
- return shipToBillingAdress;
- }
- public void setShipToBillingAdress(boolean shipToBillingAdress) {
- this.shipToBillingAdress = shipToBillingAdress;
- }
-
-
-
-}
+package com.salesmanager.shop.model.order;
+
+import java.io.Serializable;
+import java.util.List;
+
+import com.salesmanager.shop.model.customer.PersistableCustomer;
+
+
+public class PersistableOrder extends OrderEntity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private PersistableCustomer customer;//might already exist if id > 0, otherwise persist
+ private List<PersistableOrderProduct> orderProductItems;
+ private boolean shipToBillingAdress = true;
+ private boolean shipToDeliveryAddress = false;
+
+
+ public void setOrderProductItems(List<PersistableOrderProduct> orderProductItems) {
+ this.orderProductItems = orderProductItems;
+ }
+ public List<PersistableOrderProduct> getOrderProductItems() {
+ return orderProductItems;
+ }
+ public void setCustomer(PersistableCustomer customer) {
+ this.customer = customer;
+ }
+ public PersistableCustomer getCustomer() {
+ return customer;
+ }
+ public boolean isShipToBillingAdress() {
+ return shipToBillingAdress;
+ }
+ public void setShipToBillingAdress(boolean shipToBillingAdress) {
+ this.shipToBillingAdress = shipToBillingAdress;
+ }
+ public boolean isShipToDeliveryAddress() {
+ return shipToDeliveryAddress;
+ }
+ public void setShipToDeliveryAddress(boolean shipToDeliveryAddress) {
+ this.shipToDeliveryAddress = shipToDeliveryAddress;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/PersistableOrderApi.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/PersistableOrderApi.java
new file mode 100644
index 0000000..0424a6a
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/PersistableOrderApi.java
@@ -0,0 +1,62 @@
+package com.salesmanager.shop.model.order;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.salesmanager.shop.model.order.transaction.PersistablePayment;
+
+/**
+ * This object is used when processing an order from the API
+ * It will be used for processing the payment and as Order meta data
+ * @author c.samson
+ *
+ */
+public class PersistableOrderApi extends OrderApi {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private PersistablePayment payment;
+ private Long shippingQuote;
+ @JsonIgnore
+ private Long shoppingCartId;
+ @JsonIgnore
+ private Long customerId;
+
+
+
+ public Long getShoppingCartId() {
+ return shoppingCartId;
+ }
+
+ public void setShoppingCartId(Long shoppingCartId) {
+ this.shoppingCartId = shoppingCartId;
+ }
+
+ public Long getCustomerId() {
+ return customerId;
+ }
+
+ public void setCustomerId(Long customerId) {
+ this.customerId = customerId;
+ }
+
+ public PersistablePayment getPayment() {
+ return payment;
+ }
+
+ public void setPayment(PersistablePayment payment) {
+ this.payment = payment;
+ }
+
+ public Long getShippingQuote() {
+ return shippingQuote;
+ }
+
+ public void setShippingQuote(Long shippingQuote) {
+ this.shippingQuote = shippingQuote;
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/PersistableOrderProduct.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/PersistableOrderProduct.java
index d693aa1..9409ea9 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/order/PersistableOrderProduct.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/PersistableOrderProduct.java
@@ -1,38 +1,38 @@
-package com.salesmanager.shop.model.order;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.List;
-
-import com.salesmanager.shop.model.catalog.product.attribute.ProductAttribute;
-
-
-public class PersistableOrderProduct extends OrderProductEntity implements
- Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private BigDecimal price;//specify final price
- private List<ProductAttribute> attributes;//may have attributes
-
-
-
- public void setAttributes(List<ProductAttribute> attributes) {
- this.attributes = attributes;
- }
-
- public List<ProductAttribute> getAttributes() {
- return attributes;
- }
-
- public BigDecimal getPrice() {
- return price;
- }
-
- public void setPrice(BigDecimal price) {
- this.price = price;
- }
-
-}
+package com.salesmanager.shop.model.order;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+import com.salesmanager.shop.model.catalog.product.attribute.ProductAttribute;
+
+
+public class PersistableOrderProduct extends OrderProductEntity implements
+ Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private BigDecimal price;//specify final price
+ private List<ProductAttribute> attributes;//may have attributes
+
+
+
+ public void setAttributes(List<ProductAttribute> attributes) {
+ this.attributes = attributes;
+ }
+
+ public List<ProductAttribute> getAttributes() {
+ return attributes;
+ }
+
+ public BigDecimal getPrice() {
+ return price;
+ }
+
+ public void setPrice(BigDecimal price) {
+ this.price = price;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/ReadableOrder.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/ReadableOrder.java
index 64dac20..e86d87f 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/order/ReadableOrder.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/ReadableOrder.java
@@ -1,84 +1,85 @@
-package com.salesmanager.shop.model.order;
-
-import com.salesmanager.core.model.reference.currency.Currency;
-import com.salesmanager.shop.model.customer.Address;
-import com.salesmanager.shop.model.customer.ReadableCustomer;
-import com.salesmanager.shop.model.customer.ReadableDelivery;
-
-import java.io.Serializable;
-import java.util.List;
-
-
-public class ReadableOrder extends OrderEntity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private ReadableCustomer customer;
- private List<ReadableOrderProduct> products;
- private Currency currencyModel;
-
- private Address billing;
- private ReadableDelivery delivery;
-
-
-
- public void setCustomer(ReadableCustomer customer) {
- this.customer = customer;
- }
- public ReadableCustomer getCustomer() {
- return customer;
- }
- public OrderTotal getTotal() {
- return total;
- }
- public void setTotal(OrderTotal total) {
- this.total = total;
- }
- public OrderTotal getTax() {
- return tax;
- }
- public void setTax(OrderTotal tax) {
- this.tax = tax;
- }
- public OrderTotal getShipping() {
- return shipping;
- }
- public void setShipping(OrderTotal shipping) {
- this.shipping = shipping;
- }
-
- public List<ReadableOrderProduct> getProducts() {
- return products;
- }
- public void setProducts(List<ReadableOrderProduct> products) {
- this.products = products;
- }
-
- public Currency getCurrencyModel() {
- return currencyModel;
- }
- public void setCurrencyModel(Currency currencyModel) {
- this.currencyModel = currencyModel;
- }
-
- public Address getBilling() {
- return billing;
- }
- public void setBilling(Address billing) {
- this.billing = billing;
- }
-
- public Address getDelivery() {
- return delivery;
- }
- public void setDelivery(ReadableDelivery delivery) {
- this.delivery = delivery;
- }
-
- private OrderTotal total;
- private OrderTotal tax;
- private OrderTotal shipping;
-
-}
+package com.salesmanager.shop.model.order;
+
+import com.salesmanager.core.model.reference.currency.Currency;
+import com.salesmanager.shop.model.customer.Address;
+import com.salesmanager.shop.model.customer.ReadableCustomer;
+import com.salesmanager.shop.model.customer.ReadableDelivery;
+import com.salesmanager.shop.model.order.total.OrderTotal;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+public class ReadableOrder extends OrderEntity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private ReadableCustomer customer;
+ private List<ReadableOrderProduct> products;
+ private Currency currencyModel;
+
+ private Address billing;
+ private ReadableDelivery delivery;
+
+
+
+ public void setCustomer(ReadableCustomer customer) {
+ this.customer = customer;
+ }
+ public ReadableCustomer getCustomer() {
+ return customer;
+ }
+ public OrderTotal getTotal() {
+ return total;
+ }
+ public void setTotal(OrderTotal total) {
+ this.total = total;
+ }
+ public OrderTotal getTax() {
+ return tax;
+ }
+ public void setTax(OrderTotal tax) {
+ this.tax = tax;
+ }
+ public OrderTotal getShipping() {
+ return shipping;
+ }
+ public void setShipping(OrderTotal shipping) {
+ this.shipping = shipping;
+ }
+
+ public List<ReadableOrderProduct> getProducts() {
+ return products;
+ }
+ public void setProducts(List<ReadableOrderProduct> products) {
+ this.products = products;
+ }
+
+ public Currency getCurrencyModel() {
+ return currencyModel;
+ }
+ public void setCurrencyModel(Currency currencyModel) {
+ this.currencyModel = currencyModel;
+ }
+
+ public Address getBilling() {
+ return billing;
+ }
+ public void setBilling(Address billing) {
+ this.billing = billing;
+ }
+
+ public Address getDelivery() {
+ return delivery;
+ }
+ public void setDelivery(ReadableDelivery delivery) {
+ this.delivery = delivery;
+ }
+
+ private OrderTotal total;
+ private OrderTotal tax;
+ private OrderTotal shipping;
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/ReadableOrderApi.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/ReadableOrderApi.java
new file mode 100644
index 0000000..4bc0cb3
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/ReadableOrderApi.java
@@ -0,0 +1,54 @@
+package com.salesmanager.shop.model.order;
+
+import java.util.List;
+
+import com.salesmanager.core.model.shipping.ShippingOption;
+import com.salesmanager.shop.model.customer.ReadableDelivery;
+import com.salesmanager.shop.model.order.total.ReadableTotal;
+import com.salesmanager.shop.model.order.transaction.ReadablePayment;
+
+public class ReadableOrderApi extends OrderApi {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private ReadableDelivery delivery;
+ private ShippingOption shippingOption;
+ private ReadablePayment payment;
+ private ReadableTotal total;
+ private List<ReadableOrderProduct> products;
+
+ public List<ReadableOrderProduct> getProducts() {
+ return products;
+ }
+ public void setProducts(List<ReadableOrderProduct> products) {
+ this.products = products;
+ }
+ public ReadableDelivery getDelivery() {
+ return delivery;
+ }
+ public void setDelivery(ReadableDelivery delivery) {
+ this.delivery = delivery;
+ }
+ public ReadablePayment getPayment() {
+ return payment;
+ }
+ public void setPayment(ReadablePayment payment) {
+ this.payment = payment;
+ }
+ public ReadableTotal getTotal() {
+ return total;
+ }
+ public void setTotal(ReadableTotal total) {
+ this.total = total;
+ }
+ public ShippingOption getShippingOption() {
+ return shippingOption;
+ }
+ public void setShippingOption(ShippingOption shippingOption) {
+ this.shippingOption = shippingOption;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/ReadableOrderProduct.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/ReadableOrderProduct.java
index f75895e..12be181 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/order/ReadableOrderProduct.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/ReadableOrderProduct.java
@@ -1,59 +1,59 @@
-package com.salesmanager.shop.model.order;
-
-import java.io.Serializable;
-import java.util.List;
-
-public class ReadableOrderProduct extends OrderProductEntity implements
- Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String productName;
- private String price;
- private String subTotal;
-
- private List<ReadableOrderProductAttribute> attributes = null;
-
- private String sku;
- private String image;
- public String getProductName() {
- return productName;
- }
- public void setProductName(String productName) {
- this.productName = productName;
- }
- public String getSku() {
- return sku;
- }
- public void setSku(String sku) {
- this.sku = sku;
- }
- public String getImage() {
- return image;
- }
- public void setImage(String image) {
- this.image = image;
- }
- public String getPrice() {
- return price;
- }
- public void setPrice(String price) {
- this.price = price;
- }
- public String getSubTotal() {
- return subTotal;
- }
- public void setSubTotal(String subTotal) {
- this.subTotal = subTotal;
- }
- public List<ReadableOrderProductAttribute> getAttributes() {
- return attributes;
- }
- public void setAttributes(List<ReadableOrderProductAttribute> attributes) {
- this.attributes = attributes;
- }
-
-
-}
+package com.salesmanager.shop.model.order;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class ReadableOrderProduct extends OrderProductEntity implements
+ Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String productName;
+ private String price;
+ private String subTotal;
+
+ private List<ReadableOrderProductAttribute> attributes = null;
+
+ private String sku;
+ private String image;
+ public String getProductName() {
+ return productName;
+ }
+ public void setProductName(String productName) {
+ this.productName = productName;
+ }
+ public String getSku() {
+ return sku;
+ }
+ public void setSku(String sku) {
+ this.sku = sku;
+ }
+ public String getImage() {
+ return image;
+ }
+ public void setImage(String image) {
+ this.image = image;
+ }
+ public String getPrice() {
+ return price;
+ }
+ public void setPrice(String price) {
+ this.price = price;
+ }
+ public String getSubTotal() {
+ return subTotal;
+ }
+ public void setSubTotal(String subTotal) {
+ this.subTotal = subTotal;
+ }
+ public List<ReadableOrderProductAttribute> getAttributes() {
+ return attributes;
+ }
+ public void setAttributes(List<ReadableOrderProductAttribute> attributes) {
+ this.attributes = attributes;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/ReadableOrderTotalSummary.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/ReadableOrderTotalSummary.java
new file mode 100644
index 0000000..2319348
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/ReadableOrderTotalSummary.java
@@ -0,0 +1,53 @@
+package com.salesmanager.shop.model.order;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.salesmanager.shop.model.order.total.ReadableOrderTotal;
+
+public class ReadableOrderTotalSummary implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String subTotal;//one time price for items
+ private String total;//final price
+ private String taxTotal;//total of taxes
+
+ private List<ReadableOrderTotal> totals = new ArrayList<ReadableOrderTotal>();//all other fees (tax, shipping ....)
+
+ public String getSubTotal() {
+ return subTotal;
+ }
+
+ public void setSubTotal(String subTotal) {
+ this.subTotal = subTotal;
+ }
+
+ public String getTotal() {
+ return total;
+ }
+
+ public void setTotal(String total) {
+ this.total = total;
+ }
+
+ public String getTaxTotal() {
+ return taxTotal;
+ }
+
+ public void setTaxTotal(String taxTotal) {
+ this.taxTotal = taxTotal;
+ }
+
+ public List<ReadableOrderTotal> getTotals() {
+ return totals;
+ }
+
+ public void setTotals(List<ReadableOrderTotal> totals) {
+ this.totals = totals;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/ReadableShopOrder.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/ReadableShopOrder.java
index 421b733..8202d10 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/order/ReadableShopOrder.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/ReadableShopOrder.java
@@ -3,6 +3,9 @@ package com.salesmanager.shop.model.order;
import java.io.Serializable;
import java.util.List;
+import com.salesmanager.shop.model.order.shipping.ReadableShippingSummary;
+import com.salesmanager.shop.model.order.total.ReadableOrderTotal;
+
public class ReadableShopOrder extends ReadableOrder implements Serializable {
/**
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/shipping/ReadableShippingSummary.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/shipping/ReadableShippingSummary.java
new file mode 100644
index 0000000..b597c49
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/shipping/ReadableShippingSummary.java
@@ -0,0 +1,113 @@
+package com.salesmanager.shop.model.order.shipping;
+
+import com.salesmanager.core.model.shipping.ShippingOption;
+import com.salesmanager.shop.model.customer.Address;
+import com.salesmanager.shop.model.customer.ReadableDelivery;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class ReadableShippingSummary implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private BigDecimal shipping;
+ private BigDecimal handling;
+ private String shippingModule;
+ private String shippingOption;
+ private boolean freeShipping;
+ private boolean taxOnShipping;
+ private String shippingText;
+ private String handlingText;
+ private ReadableDelivery delivery;
+
+
+ private ShippingOption selectedShippingOption = null;//Default selected option
+ private List<ShippingOption> shippingOptions = null;
+
+ /** additional information that comes from the quote **/
+ private Map<String,String> quoteInformations = new HashMap<String,String>();
+
+
+ public BigDecimal getShipping() {
+ return shipping;
+ }
+ public void setShipping(BigDecimal shipping) {
+ this.shipping = shipping;
+ }
+ public BigDecimal getHandling() {
+ return handling;
+ }
+ public void setHandling(BigDecimal handling) {
+ this.handling = handling;
+ }
+ public String getShippingModule() {
+ return shippingModule;
+ }
+ public void setShippingModule(String shippingModule) {
+ this.shippingModule = shippingModule;
+ }
+ public String getShippingOption() {
+ return shippingOption;
+ }
+ public void setShippingOption(String shippingOption) {
+ this.shippingOption = shippingOption;
+ }
+ public boolean isFreeShipping() {
+ return freeShipping;
+ }
+ public void setFreeShipping(boolean freeShipping) {
+ this.freeShipping = freeShipping;
+ }
+ public boolean isTaxOnShipping() {
+ return taxOnShipping;
+ }
+ public void setTaxOnShipping(boolean taxOnShipping) {
+ this.taxOnShipping = taxOnShipping;
+ }
+ public String getShippingText() {
+ return shippingText;
+ }
+ public void setShippingText(String shippingText) {
+ this.shippingText = shippingText;
+ }
+ public String getHandlingText() {
+ return handlingText;
+ }
+ public void setHandlingText(String handlingText) {
+ this.handlingText = handlingText;
+ }
+ public static long getSerialversionuid() {
+ return serialVersionUID;
+ }
+ public List<ShippingOption> getShippingOptions() {
+ return shippingOptions;
+ }
+ public void setShippingOptions(List<ShippingOption> shippingOptions) {
+ this.shippingOptions = shippingOptions;
+ }
+ public ShippingOption getSelectedShippingOption() {
+ return selectedShippingOption;
+ }
+ public void setSelectedShippingOption(ShippingOption selectedShippingOption) {
+ this.selectedShippingOption = selectedShippingOption;
+ }
+ public Map<String,String> getQuoteInformations() {
+ return quoteInformations;
+ }
+ public void setQuoteInformations(Map<String,String> quoteInformations) {
+ this.quoteInformations = quoteInformations;
+ }
+ public Address getDelivery() {
+ return delivery;
+ }
+ public void setDelivery(ReadableDelivery delivery) {
+ this.delivery = delivery;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/ShopOrder.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/ShopOrder.java
index ed157ac..652b2f0 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/order/ShopOrder.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/ShopOrder.java
@@ -1,94 +1,94 @@
-package com.salesmanager.shop.model.order;
-
-import java.io.Serializable;
-import java.util.List;
-import java.util.Map;
-
-import com.salesmanager.core.model.order.OrderTotalSummary;
-import com.salesmanager.core.model.shipping.ShippingOption;
-import com.salesmanager.core.model.shipping.ShippingSummary;
-import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
-
-
-/**
- * Orders saved on the website
- * @author Carl Samson
- *
- */
-public class ShopOrder extends PersistableOrder implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private List<ShoppingCartItem> shoppingCartItems;//overrides parent API list of shoppingcartitem
-
- private OrderTotalSummary orderTotalSummary;//The order total displayed to the end user. That object will be used when committing the order
-
-
- private ShippingSummary shippingSummary;
- private ShippingOption selectedShippingOption = null;//Default selected option
-
- private String defaultPaymentMethodCode = null;
-
-
- private String paymentMethodType = null;//user selected payment type
- private Map<String,String> payment;//user payment information
-
- private String errorMessage = null;
-
-
- public void setShoppingCartItems(List<ShoppingCartItem> shoppingCartItems) {
- this.shoppingCartItems = shoppingCartItems;
- }
- public List<ShoppingCartItem> getShoppingCartItems() {
- return shoppingCartItems;
- }
-
- public void setOrderTotalSummary(OrderTotalSummary orderTotalSummary) {
- this.orderTotalSummary = orderTotalSummary;
- }
- public OrderTotalSummary getOrderTotalSummary() {
- return orderTotalSummary;
- }
-
- public ShippingSummary getShippingSummary() {
- return shippingSummary;
- }
- public void setShippingSummary(ShippingSummary shippingSummary) {
- this.shippingSummary = shippingSummary;
- }
- public ShippingOption getSelectedShippingOption() {
- return selectedShippingOption;
- }
- public void setSelectedShippingOption(ShippingOption selectedShippingOption) {
- this.selectedShippingOption = selectedShippingOption;
- }
- public String getErrorMessage() {
- return errorMessage;
- }
- public void setErrorMessage(String errorMessage) {
- this.errorMessage = errorMessage;
- }
- public String getPaymentMethodType() {
- return paymentMethodType;
- }
- public void setPaymentMethodType(String paymentMethodType) {
- this.paymentMethodType = paymentMethodType;
- }
- public Map<String,String> getPayment() {
- return payment;
- }
- public void setPayment(Map<String,String> payment) {
- this.payment = payment;
- }
- public String getDefaultPaymentMethodCode() {
- return defaultPaymentMethodCode;
- }
- public void setDefaultPaymentMethodCode(String defaultPaymentMethodCode) {
- this.defaultPaymentMethodCode = defaultPaymentMethodCode;
- }
-
-
-
-}
+package com.salesmanager.shop.model.order;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Map;
+
+import com.salesmanager.core.model.order.OrderTotalSummary;
+import com.salesmanager.core.model.shipping.ShippingOption;
+import com.salesmanager.core.model.shipping.ShippingSummary;
+import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
+
+
+/**
+ * Orders saved on the website
+ * @author Carl Samson
+ *
+ */
+public class ShopOrder extends PersistableOrder implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private List<ShoppingCartItem> shoppingCartItems;//overrides parent API list of shoppingcartitem
+
+ private OrderTotalSummary orderTotalSummary;//The order total displayed to the end user. That object will be used when committing the order
+
+
+ private ShippingSummary shippingSummary;
+ private ShippingOption selectedShippingOption = null;//Default selected option
+
+ private String defaultPaymentMethodCode = null;
+
+
+ private String paymentMethodType = null;//user selected payment type
+ private Map<String,String> payment;//user payment information
+
+ private String errorMessage = null;
+
+
+ public void setShoppingCartItems(List<ShoppingCartItem> shoppingCartItems) {
+ this.shoppingCartItems = shoppingCartItems;
+ }
+ public List<ShoppingCartItem> getShoppingCartItems() {
+ return shoppingCartItems;
+ }
+
+ public void setOrderTotalSummary(OrderTotalSummary orderTotalSummary) {
+ this.orderTotalSummary = orderTotalSummary;
+ }
+ public OrderTotalSummary getOrderTotalSummary() {
+ return orderTotalSummary;
+ }
+
+ public ShippingSummary getShippingSummary() {
+ return shippingSummary;
+ }
+ public void setShippingSummary(ShippingSummary shippingSummary) {
+ this.shippingSummary = shippingSummary;
+ }
+ public ShippingOption getSelectedShippingOption() {
+ return selectedShippingOption;
+ }
+ public void setSelectedShippingOption(ShippingOption selectedShippingOption) {
+ this.selectedShippingOption = selectedShippingOption;
+ }
+ public String getErrorMessage() {
+ return errorMessage;
+ }
+ public void setErrorMessage(String errorMessage) {
+ this.errorMessage = errorMessage;
+ }
+ public String getPaymentMethodType() {
+ return paymentMethodType;
+ }
+ public void setPaymentMethodType(String paymentMethodType) {
+ this.paymentMethodType = paymentMethodType;
+ }
+ public Map<String,String> getPayment() {
+ return payment;
+ }
+ public void setPayment(Map<String,String> payment) {
+ this.payment = payment;
+ }
+ public String getDefaultPaymentMethodCode() {
+ return defaultPaymentMethodCode;
+ }
+ public void setDefaultPaymentMethodCode(String defaultPaymentMethodCode) {
+ this.defaultPaymentMethodCode = defaultPaymentMethodCode;
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/total/OrderTotal.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/total/OrderTotal.java
new file mode 100644
index 0000000..01aed57
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/total/OrderTotal.java
@@ -0,0 +1,61 @@
+package com.salesmanager.shop.model.order.total;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+import com.salesmanager.shop.model.Entity;
+
+
+public class OrderTotal extends Entity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String title;
+ private String text;
+ private String code;
+ private int order;
+ private String module;
+ private BigDecimal value;
+
+
+ public String getTitle() {
+ return title;
+ }
+ public void setTitle(String title) {
+ this.title = title;
+ }
+ public String getCode() {
+ return code;
+ }
+ public void setCode(String code) {
+ this.code = code;
+ }
+ public int getOrder() {
+ return order;
+ }
+ public void setOrder(int order) {
+ this.order = order;
+ }
+ public String getModule() {
+ return module;
+ }
+ public void setModule(String module) {
+ this.module = module;
+ }
+ public BigDecimal getValue() {
+ return value;
+ }
+ public void setValue(BigDecimal value) {
+ this.value = value;
+ }
+ public String getText() {
+ return text;
+ }
+ public void setText(String text) {
+ this.text = text;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/total/ReadableOrderTotal.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/total/ReadableOrderTotal.java
new file mode 100644
index 0000000..1e4640e
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/total/ReadableOrderTotal.java
@@ -0,0 +1,26 @@
+package com.salesmanager.shop.model.order.total;
+
+import java.io.Serializable;
+
+public class ReadableOrderTotal extends OrderTotal implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String total;
+ private boolean discounted;
+ public String getTotal() {
+ return total;
+ }
+ public void setTotal(String total) {
+ this.total = total;
+ }
+ public boolean isDiscounted() {
+ return discounted;
+ }
+ public void setDiscounted(boolean discounted) {
+ this.discounted = discounted;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/total/ReadableTotal.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/total/ReadableTotal.java
new file mode 100644
index 0000000..8367f43
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/total/ReadableTotal.java
@@ -0,0 +1,33 @@
+package com.salesmanager.shop.model.order.total;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Serves as the order total summary calculation
+ * @author c.samson
+ *
+ */
+public class ReadableTotal implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private List<ReadableOrderTotal> totals;
+ private String grandTotal;
+ public List<ReadableOrderTotal> getTotals() {
+ return totals;
+ }
+ public void setTotals(List<ReadableOrderTotal> totals) {
+ this.totals = totals;
+ }
+ public String getGrandTotal() {
+ return grandTotal;
+ }
+ public void setGrandTotal(String grandTotal) {
+ this.grandTotal = grandTotal;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/transaction/PaymentEntity.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/transaction/PaymentEntity.java
new file mode 100644
index 0000000..42ba373
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/transaction/PaymentEntity.java
@@ -0,0 +1,28 @@
+package com.salesmanager.shop.model.order.transaction;
+
+import java.io.Serializable;
+
+public class PaymentEntity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private String paymentModule;//stripe|paypal|braintree|moneyorder ...
+ private String amount;
+
+ public String getPaymentModule() {
+ return paymentModule;
+ }
+ public void setPaymentModule(String paymentModule) {
+ this.paymentModule = paymentModule;
+ }
+ public String getAmount() {
+ return amount;
+ }
+ public void setAmount(String amount) {
+ this.amount = amount;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/transaction/PersistablePayment.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/transaction/PersistablePayment.java
new file mode 100644
index 0000000..fde1180
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/transaction/PersistablePayment.java
@@ -0,0 +1,41 @@
+package com.salesmanager.shop.model.order.transaction;
+
+import com.salesmanager.core.model.payments.PaymentType;
+import com.salesmanager.core.model.payments.TransactionType;
+import com.salesmanager.shop.utils.Enum;
+
+public class PersistablePayment extends PaymentEntity {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ @Enum(enumClass=PaymentType.class, ignoreCase=true)
+ private String paymentType;
+
+ @Enum(enumClass=TransactionType.class, ignoreCase=true)
+ private String transactionType;
+
+ private String paymentToken;//any token after doing init
+
+ public String getPaymentType() {
+ return paymentType;
+ }
+ public void setPaymentType(String paymentType) {
+ this.paymentType = paymentType;
+ }
+ public String getTransactionType() {
+ return transactionType;
+ }
+ public void setTransactionType(String transactionType) {
+ this.transactionType = transactionType;
+ }
+ public String getPaymentToken() {
+ return paymentToken;
+ }
+ public void setPaymentToken(String paymentToken) {
+ this.paymentToken = paymentToken;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/transaction/PersistableTransaction.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/transaction/PersistableTransaction.java
new file mode 100644
index 0000000..8ce28ee
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/transaction/PersistableTransaction.java
@@ -0,0 +1,42 @@
+package com.salesmanager.shop.model.order.transaction;
+
+import java.io.Serializable;
+
+import com.salesmanager.core.model.payments.PaymentType;
+import com.salesmanager.core.model.payments.TransactionType;
+import com.salesmanager.shop.utils.Enum;
+
+/**
+ * This class is used for writing a transaction in the System
+ * @author c.samson
+ *
+ */
+public class PersistableTransaction extends TransactionEntity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ @Enum(enumClass=PaymentType.class, ignoreCase=true)
+ private String paymentType;
+
+ @Enum(enumClass=TransactionType.class, ignoreCase=true)
+ private String transactionType;
+
+ public String getPaymentType() {
+ return paymentType;
+ }
+
+ public void setPaymentType(String paymentType) {
+ this.paymentType = paymentType;
+ }
+
+ public String getTransactionType() {
+ return transactionType;
+ }
+
+ public void setTransactionType(String transactionType) {
+ this.transactionType = transactionType;
+ }
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/transaction/ReadablePayment.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/transaction/ReadablePayment.java
new file mode 100644
index 0000000..7969233
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/transaction/ReadablePayment.java
@@ -0,0 +1,27 @@
+package com.salesmanager.shop.model.order.transaction;
+
+import com.salesmanager.core.model.payments.PaymentType;
+import com.salesmanager.core.model.payments.TransactionType;
+
+public class ReadablePayment extends PaymentEntity {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private PaymentType paymentType;
+ private TransactionType transactionType;
+ public TransactionType getTransactionType() {
+ return transactionType;
+ }
+ public void setTransactionType(TransactionType transactionType) {
+ this.transactionType = transactionType;
+ }
+ public PaymentType getPaymentType() {
+ return paymentType;
+ }
+ public void setPaymentType(PaymentType paymentType) {
+ this.paymentType = paymentType;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/transaction/ReadableTransaction.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/transaction/ReadableTransaction.java
new file mode 100644
index 0000000..fbf180a
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/transaction/ReadableTransaction.java
@@ -0,0 +1,31 @@
+package com.salesmanager.shop.model.order.transaction;
+
+import java.io.Serializable;
+
+import com.salesmanager.core.model.payments.PaymentType;
+import com.salesmanager.core.model.payments.TransactionType;
+
+public class ReadableTransaction extends TransactionEntity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private PaymentType paymentType;
+ private TransactionType transactionType;
+ public PaymentType getPaymentType() {
+ return paymentType;
+ }
+ public void setPaymentType(PaymentType paymentType) {
+ this.paymentType = paymentType;
+ }
+ public TransactionType getTransactionType() {
+ return transactionType;
+ }
+ public void setTransactionType(TransactionType transactionType) {
+ this.transactionType = transactionType;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/order/transaction/TransactionEntity.java b/sm-shop/src/main/java/com/salesmanager/shop/model/order/transaction/TransactionEntity.java
new file mode 100644
index 0000000..9abf374
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/order/transaction/TransactionEntity.java
@@ -0,0 +1,50 @@
+package com.salesmanager.shop.model.order.transaction;
+
+import java.io.Serializable;
+
+import com.salesmanager.shop.model.Entity;
+
+/**
+ * Readable version of Transaction entity object
+ * @author c.samson
+ *
+ */
+public class TransactionEntity extends Entity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private Long orderId;
+ private String details;
+ private String transactionDate;
+ private String amount;
+
+
+ public String getTransactionDate() {
+ return transactionDate;
+ }
+ public void setTransactionDate(String transactionDate) {
+ this.transactionDate = transactionDate;
+ }
+ public Long getOrderId() {
+ return orderId;
+ }
+ public void setOrderId(Long orderId) {
+ this.orderId = orderId;
+ }
+ public String getDetails() {
+ return details;
+ }
+ public void setDetails(String details) {
+ this.details = details;
+ }
+ public String getAmount() {
+ return amount;
+ }
+ public void setAmount(String amount) {
+ this.amount = amount;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/ReadableList.java b/sm-shop/src/main/java/com/salesmanager/shop/model/ReadableList.java
new file mode 100644
index 0000000..b523891
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/ReadableList.java
@@ -0,0 +1,21 @@
+package com.salesmanager.shop.model;
+
+import java.io.Serializable;
+
+public abstract class ReadableList implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private int totalCount;
+
+ public int getTotalCount() {
+ return totalCount;
+ }
+
+ public void setTotalCount(int totalCount) {
+ this.totalCount = totalCount;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/security/GroupEntity.java b/sm-shop/src/main/java/com/salesmanager/shop/model/security/GroupEntity.java
new file mode 100644
index 0000000..bc59aef
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/security/GroupEntity.java
@@ -0,0 +1,13 @@
+package com.salesmanager.shop.model.security;
+
+import com.salesmanager.shop.model.Entity;
+
+public class GroupEntity extends Entity {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/security/PersistableGroup.java b/sm-shop/src/main/java/com/salesmanager/shop/model/security/PersistableGroup.java
new file mode 100644
index 0000000..dd43c8c
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/security/PersistableGroup.java
@@ -0,0 +1,15 @@
+package com.salesmanager.shop.model.security;
+
+/**
+ * Object used for saving a group
+ * @author carlsamson
+ *
+ */
+public class PersistableGroup extends GroupEntity {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/security/ReadableGroup.java b/sm-shop/src/main/java/com/salesmanager/shop/model/security/ReadableGroup.java
new file mode 100644
index 0000000..c9c59d6
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/security/ReadableGroup.java
@@ -0,0 +1,23 @@
+package com.salesmanager.shop.model.security;
+
+/**
+ * Object used for reading a group
+ * @author carlsamson
+ *
+ */
+public class ReadableGroup extends GroupEntity {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private String name;
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/shop/Breadcrumb.java b/sm-shop/src/main/java/com/salesmanager/shop/model/shop/Breadcrumb.java
index c6de0cf..ee6299d 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/shop/Breadcrumb.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/shop/Breadcrumb.java
@@ -1,45 +1,45 @@
-package com.salesmanager.shop.model.shop;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-
-import com.salesmanager.core.model.reference.language.Language;
-
-
-public class Breadcrumb implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private BreadcrumbItemType itemType;
- private Language language;
- private String urlRefContent = null;
- private List<BreadcrumbItem> breadCrumbs = new ArrayList<BreadcrumbItem>();
- public Language getLanguage() {
- return language;
- }
- public void setLanguage(Language language) {
- this.language = language;
- }
- public List<BreadcrumbItem> getBreadCrumbs() {
- return breadCrumbs;
- }
- public void setBreadCrumbs(List<BreadcrumbItem> breadCrumbs) {
- this.breadCrumbs = breadCrumbs;
- }
- public void setItemType(BreadcrumbItemType itemType) {
- this.itemType = itemType;
- }
- public BreadcrumbItemType getItemType() {
- return itemType;
- }
- public String getUrlRefContent() {
- return urlRefContent;
- }
- public void setUrlRefContent(String urlRefContent) {
- this.urlRefContent = urlRefContent;
- }
-
-}
+package com.salesmanager.shop.model.shop;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.salesmanager.core.model.reference.language.Language;
+
+
+public class Breadcrumb implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private BreadcrumbItemType itemType;
+ private Language language;
+ private String urlRefContent = null;
+ private List<BreadcrumbItem> breadCrumbs = new ArrayList<BreadcrumbItem>();
+ public Language getLanguage() {
+ return language;
+ }
+ public void setLanguage(Language language) {
+ this.language = language;
+ }
+ public List<BreadcrumbItem> getBreadCrumbs() {
+ return breadCrumbs;
+ }
+ public void setBreadCrumbs(List<BreadcrumbItem> breadCrumbs) {
+ this.breadCrumbs = breadCrumbs;
+ }
+ public void setItemType(BreadcrumbItemType itemType) {
+ this.itemType = itemType;
+ }
+ public BreadcrumbItemType getItemType() {
+ return itemType;
+ }
+ public String getUrlRefContent() {
+ return urlRefContent;
+ }
+ public void setUrlRefContent(String urlRefContent) {
+ this.urlRefContent = urlRefContent;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/shop/BreadcrumbItem.java b/sm-shop/src/main/java/com/salesmanager/shop/model/shop/BreadcrumbItem.java
index fa44ff5..a871d7d 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/shop/BreadcrumbItem.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/shop/BreadcrumbItem.java
@@ -1,40 +1,40 @@
-package com.salesmanager.shop.model.shop;
-
-import java.io.Serializable;
-
-public class BreadcrumbItem implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private Long id;
- private String label;
- private String url;
- private BreadcrumbItemType itemType;
- public Long getId() {
- return id;
- }
- public void setId(Long id) {
- this.id = id;
- }
- public String getLabel() {
- return label;
- }
- public void setLabel(String label) {
- this.label = label;
- }
- public String getUrl() {
- return url;
- }
- public void setUrl(String url) {
- this.url = url;
- }
- public BreadcrumbItemType getItemType() {
- return itemType;
- }
- public void setItemType(BreadcrumbItemType itemType) {
- this.itemType = itemType;
- }
-
-}
+package com.salesmanager.shop.model.shop;
+
+import java.io.Serializable;
+
+public class BreadcrumbItem implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private Long id;
+ private String label;
+ private String url;
+ private BreadcrumbItemType itemType;
+ public Long getId() {
+ return id;
+ }
+ public void setId(Long id) {
+ this.id = id;
+ }
+ public String getLabel() {
+ return label;
+ }
+ public void setLabel(String label) {
+ this.label = label;
+ }
+ public String getUrl() {
+ return url;
+ }
+ public void setUrl(String url) {
+ this.url = url;
+ }
+ public BreadcrumbItemType getItemType() {
+ return itemType;
+ }
+ public void setItemType(BreadcrumbItemType itemType) {
+ this.itemType = itemType;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/shop/BreadcrumbItemType.java b/sm-shop/src/main/java/com/salesmanager/shop/model/shop/BreadcrumbItemType.java
index 4e8630d..2b61bdc 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/shop/BreadcrumbItemType.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/shop/BreadcrumbItemType.java
@@ -1,7 +1,7 @@
-package com.salesmanager.shop.model.shop;
-
-public enum BreadcrumbItemType {
-
- CATEGORY, PRODUCT, HOME, PAGE
-
-}
+package com.salesmanager.shop.model.shop;
+
+public enum BreadcrumbItemType {
+
+ CATEGORY, PRODUCT, HOME, PAGE
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/shop/PageInformation.java b/sm-shop/src/main/java/com/salesmanager/shop/model/shop/PageInformation.java
index 0bb88ac..8b6167e 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/shop/PageInformation.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/shop/PageInformation.java
@@ -1,40 +1,40 @@
-package com.salesmanager.shop.model.shop;
-
-import java.io.Serializable;
-
-public class PageInformation implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String pageTitle;
- private String pageDescription;
- private String pageKeywords;
- private String pageUrl;
- public String getPageTitle() {
- return pageTitle;
- }
- public void setPageTitle(String pageTitle) {
- this.pageTitle = pageTitle;
- }
- public String getPageDescription() {
- return pageDescription;
- }
- public void setPageDescription(String pageDescription) {
- this.pageDescription = pageDescription;
- }
- public String getPageKeywords() {
- return pageKeywords;
- }
- public void setPageKeywords(String pageKeywords) {
- this.pageKeywords = pageKeywords;
- }
- public void setPageUrl(String pageUrl) {
- this.pageUrl = pageUrl;
- }
- public String getPageUrl() {
- return pageUrl;
- }
-
-}
+package com.salesmanager.shop.model.shop;
+
+import java.io.Serializable;
+
+public class PageInformation implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String pageTitle;
+ private String pageDescription;
+ private String pageKeywords;
+ private String pageUrl;
+ public String getPageTitle() {
+ return pageTitle;
+ }
+ public void setPageTitle(String pageTitle) {
+ this.pageTitle = pageTitle;
+ }
+ public String getPageDescription() {
+ return pageDescription;
+ }
+ public void setPageDescription(String pageDescription) {
+ this.pageDescription = pageDescription;
+ }
+ public String getPageKeywords() {
+ return pageKeywords;
+ }
+ public void setPageKeywords(String pageKeywords) {
+ this.pageKeywords = pageKeywords;
+ }
+ public void setPageUrl(String pageUrl) {
+ this.pageUrl = pageUrl;
+ }
+ public String getPageUrl() {
+ return pageUrl;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/ShopEntity.java b/sm-shop/src/main/java/com/salesmanager/shop/model/ShopEntity.java
index 855bf11..5b16a52 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/ShopEntity.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/ShopEntity.java
@@ -1,21 +1,21 @@
-package com.salesmanager.shop.model;
-
-import java.io.Serializable;
-
-public abstract class ShopEntity extends Entity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String language;
-
- public void setLanguage(String language) {
- this.language = language;
- }
- public String getLanguage() {
- return language;
- }
-
-
-}
+package com.salesmanager.shop.model;
+
+import java.io.Serializable;
+
+public abstract class ShopEntity extends Entity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String language;
+
+ public void setLanguage(String language) {
+ this.language = language;
+ }
+ public String getLanguage() {
+ return language;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/CartModificationException.java b/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/CartModificationException.java
new file mode 100644
index 0000000..6c6e9f1
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/CartModificationException.java
@@ -0,0 +1,31 @@
+/**
+ *
+ */
+package com.salesmanager.shop.model.shoppingcart;
+
+/**
+ * @author Umesh A
+ *
+ */
+public class CartModificationException extends Exception{
+
+
+ private static final long serialVersionUID = 679173596061770958L;
+
+ public CartModificationException(final String msg, final Throwable cause)
+ {
+ super(msg, cause);
+ }
+
+ public CartModificationException(final String msg)
+ {
+ super(msg);
+ }
+
+ public CartModificationException(Throwable t)
+ {
+ super(t);
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/PersistableShoppingCartItem.java b/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/PersistableShoppingCartItem.java
new file mode 100644
index 0000000..fcac6a6
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/PersistableShoppingCartItem.java
@@ -0,0 +1,41 @@
+package com.salesmanager.shop.model.shoppingcart;
+
+import java.io.Serializable;
+import java.util.List;
+
+import com.salesmanager.shop.model.catalog.product.attribute.ProductAttribute;
+
+/**
+ * Compatible with v1
+ * @author c.samson
+ *
+ */
+public class PersistableShoppingCartItem implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private Long product;//product id
+ private int quantity;
+ public int getQuantity() {
+ return quantity;
+ }
+ public void setQuantity(int quantity) {
+ this.quantity = quantity;
+ }
+ private List<ProductAttribute> attributes;
+ public Long getProduct() {
+ return product;
+ }
+ public void setProduct(Long product) {
+ this.product = product;
+ }
+ public List<ProductAttribute> getAttributes() {
+ return attributes;
+ }
+ public void setAttributes(List<ProductAttribute> attributes) {
+ this.attributes = attributes;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ReadableShoppingCart.java b/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ReadableShoppingCart.java
new file mode 100644
index 0000000..81d9f7b
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ReadableShoppingCart.java
@@ -0,0 +1,144 @@
+package com.salesmanager.shop.model.shoppingcart;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.salesmanager.shop.model.order.total.ReadableOrderTotal;
+
+/**
+ * Compatible with v1
+ * @author c.samson
+ *
+ */
+public class ReadableShoppingCart extends ShoppingCartEntity {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private String code;
+ private BigDecimal subtotal;
+
+
+ private String displaySubTotal;
+ private BigDecimal total;
+ private String displayTotal;
+ private int quantity;
+
+ List<ReadableShoppingCartItem> products = new ArrayList<ReadableShoppingCartItem>();
+ List<ReadableOrderTotal> totals;
+
+ private Long customer;
+
+
+
+ public Long getCustomer() {
+ return customer;
+ }
+
+
+
+ public void setCustomer(Long customer) {
+ this.customer = customer;
+ }
+
+
+
+ public List<ReadableOrderTotal> getTotals() {
+ return totals;
+ }
+
+
+
+ public void setTotals(List<ReadableOrderTotal> totals) {
+ this.totals = totals;
+ }
+
+
+
+ public List<ReadableShoppingCartItem> getProducts() {
+ return products;
+ }
+
+
+
+ public void setProducts(List<ReadableShoppingCartItem> products) {
+ this.products = products;
+ }
+
+
+
+ public String getCode() {
+ return code;
+ }
+
+
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public BigDecimal getSubtotal() {
+ return subtotal;
+ }
+
+
+
+ public void setSubtotal(BigDecimal subtotal) {
+ this.subtotal = subtotal;
+ }
+
+
+
+ public String getDisplaySubTotal() {
+ return displaySubTotal;
+ }
+
+
+
+ public void setDisplaySubTotal(String displaySubTotal) {
+ this.displaySubTotal = displaySubTotal;
+ }
+
+
+
+ public BigDecimal getTotal() {
+ return total;
+ }
+
+
+
+ public void setTotal(BigDecimal total) {
+ this.total = total;
+ }
+
+
+
+ public String getDisplayTotal() {
+ return displayTotal;
+ }
+
+
+
+ public void setDisplayTotal(String displayTotal) {
+ this.displayTotal = displayTotal;
+ }
+
+
+
+ public int getQuantity() {
+ return quantity;
+ }
+
+
+
+ public void setQuantity(int quantity) {
+ this.quantity = quantity;
+ }
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ReadableShoppingCartAttribute.java b/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ReadableShoppingCartAttribute.java
new file mode 100644
index 0000000..e202976
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ReadableShoppingCartAttribute.java
@@ -0,0 +1,27 @@
+package com.salesmanager.shop.model.shoppingcart;
+
+import com.salesmanager.shop.model.ShopEntity;
+
+public class ReadableShoppingCartAttribute extends ShopEntity {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private ReadableShoppingCartAttributeOption option;
+ private ReadableShoppingCartAttributeOptionValue optionValue;
+
+ public ReadableShoppingCartAttributeOption getOption() {
+ return option;
+ }
+ public void setOption(ReadableShoppingCartAttributeOption option) {
+ this.option = option;
+ }
+ public ReadableShoppingCartAttributeOptionValue getOptionValue() {
+ return optionValue;
+ }
+ public void setOptionValue(ReadableShoppingCartAttributeOptionValue optionValue) {
+ this.optionValue = optionValue;
+ }
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ReadableShoppingCartAttributeOption.java b/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ReadableShoppingCartAttributeOption.java
new file mode 100644
index 0000000..40226bb
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ReadableShoppingCartAttributeOption.java
@@ -0,0 +1,12 @@
+package com.salesmanager.shop.model.shoppingcart;
+
+import com.salesmanager.shop.model.catalog.product.attribute.ReadableProductOption;
+
+public class ReadableShoppingCartAttributeOption extends ReadableProductOption {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ReadableShoppingCartAttributeOptionValue.java b/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ReadableShoppingCartAttributeOptionValue.java
new file mode 100644
index 0000000..8d5e297
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ReadableShoppingCartAttributeOptionValue.java
@@ -0,0 +1,12 @@
+package com.salesmanager.shop.model.shoppingcart;
+
+import com.salesmanager.shop.model.catalog.product.attribute.ReadableProductOptionValue;
+
+public class ReadableShoppingCartAttributeOptionValue extends ReadableProductOptionValue {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ReadableShoppingCartItem.java b/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ReadableShoppingCartItem.java
new file mode 100644
index 0000000..3e04f82
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ReadableShoppingCartItem.java
@@ -0,0 +1,47 @@
+package com.salesmanager.shop.model.shoppingcart;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.salesmanager.shop.model.catalog.product.ReadableProduct;
+
+/**
+ * compatible with v1 version
+ * @author c.samson
+ *
+ */
+public class ReadableShoppingCartItem extends ReadableProduct implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private BigDecimal subTotal;
+ private String displaySubTotal;
+ private List<ReadableShoppingCartAttribute> cartItemattributes = new ArrayList<ReadableShoppingCartAttribute>();
+
+
+ public BigDecimal getSubTotal() {
+ return subTotal;
+ }
+ public void setSubTotal(BigDecimal subTotal) {
+ this.subTotal = subTotal;
+ }
+ public String getDisplaySubTotal() {
+ return displaySubTotal;
+ }
+ public void setDisplaySubTotal(String displaySubTotal) {
+ this.displaySubTotal = displaySubTotal;
+ }
+ public List<ReadableShoppingCartAttribute> getCartItemattributes() {
+ return cartItemattributes;
+ }
+ public void setCartItemattributes(List<ReadableShoppingCartAttribute> cartItemattributes) {
+ this.cartItemattributes = cartItemattributes;
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ShoppingCartAttribute.java b/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ShoppingCartAttribute.java
index cc3dfd2..cdbe657 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ShoppingCartAttribute.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ShoppingCartAttribute.java
@@ -1,50 +1,50 @@
-package com.salesmanager.shop.model.shoppingcart;
-
-import java.io.Serializable;
-
-import com.salesmanager.shop.model.ShopEntity;
-
-public class ShoppingCartAttribute extends ShopEntity implements Serializable {
-
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private long optionId;
- private long optionValueId;
- private long attributeId;
- private String optionName;
- private String optionValue;
- public long getOptionId() {
- return optionId;
- }
- public void setOptionId(long optionId) {
- this.optionId = optionId;
- }
- public long getOptionValueId() {
- return optionValueId;
- }
- public void setOptionValueId(long optionValueId) {
- this.optionValueId = optionValueId;
- }
- public String getOptionName() {
- return optionName;
- }
- public void setOptionName(String optionName) {
- this.optionName = optionName;
- }
- public String getOptionValue() {
- return optionValue;
- }
- public void setOptionValue(String optionValue) {
- this.optionValue = optionValue;
- }
- public long getAttributeId() {
- return attributeId;
- }
- public void setAttributeId(long attributeId) {
- this.attributeId = attributeId;
- }
-
-}
+package com.salesmanager.shop.model.shoppingcart;
+
+import java.io.Serializable;
+
+import com.salesmanager.shop.model.ShopEntity;
+
+public class ShoppingCartAttribute extends ShopEntity implements Serializable {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private long optionId;
+ private long optionValueId;
+ private long attributeId;
+ private String optionName;
+ private String optionValue;
+ public long getOptionId() {
+ return optionId;
+ }
+ public void setOptionId(long optionId) {
+ this.optionId = optionId;
+ }
+ public long getOptionValueId() {
+ return optionValueId;
+ }
+ public void setOptionValueId(long optionValueId) {
+ this.optionValueId = optionValueId;
+ }
+ public String getOptionName() {
+ return optionName;
+ }
+ public void setOptionName(String optionName) {
+ this.optionName = optionName;
+ }
+ public String getOptionValue() {
+ return optionValue;
+ }
+ public void setOptionValue(String optionValue) {
+ this.optionValue = optionValue;
+ }
+ public long getAttributeId() {
+ return attributeId;
+ }
+ public void setAttributeId(long attributeId) {
+ this.attributeId = attributeId;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ShoppingCartData.java b/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ShoppingCartData.java
index 5efddb2..5766e2a 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ShoppingCartData.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ShoppingCartData.java
@@ -1,83 +1,83 @@
-package com.salesmanager.shop.model.shoppingcart;
-
-import java.io.Serializable;
-import java.util.List;
-
-import org.springframework.context.annotation.Scope;
-import org.springframework.stereotype.Component;
-
-import com.salesmanager.shop.model.ShopEntity;
-import com.salesmanager.shop.model.order.OrderTotal;
-
-
-@Component
-@Scope(value = "prototype")
-public class ShoppingCartData extends ShopEntity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String message;
- private String code;
- private int quantity;
- private String total;
- private String subTotal;
-
- private List<OrderTotal> totals;//calculated from OrderTotalSummary
- private List<ShoppingCartItem> shoppingCartItems;
- private List<ShoppingCartItem> unavailables;
-
-
- public String getMessage() {
- return message;
- }
- public void setMessage(String message) {
- this.message = message;
- }
- public String getCode() {
- return code;
- }
- public void setCode(String code) {
- this.code = code;
- }
- public int getQuantity() {
- return quantity;
- }
- public void setQuantity(int quantity) {
- this.quantity = quantity;
- }
- public String getTotal() {
- return total;
- }
- public void setTotal(String total) {
- this.total = total;
- }
- public List<ShoppingCartItem> getShoppingCartItems() {
- return shoppingCartItems;
- }
- public void setShoppingCartItems(List<ShoppingCartItem> shoppingCartItems) {
- this.shoppingCartItems = shoppingCartItems;
- }
- public String getSubTotal() {
- return subTotal;
- }
- public void setSubTotal(String subTotal) {
- this.subTotal = subTotal;
- }
- public List<OrderTotal> getTotals() {
- return totals;
- }
- public void setTotals(List<OrderTotal> totals) {
- this.totals = totals;
- }
- public List<ShoppingCartItem> getUnavailables() {
- return unavailables;
- }
- public void setUnavailables(List<ShoppingCartItem> unavailables) {
- this.unavailables = unavailables;
- }
-
-
-
-}
+package com.salesmanager.shop.model.shoppingcart;
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.springframework.context.annotation.Scope;
+import org.springframework.stereotype.Component;
+
+import com.salesmanager.shop.model.ShopEntity;
+import com.salesmanager.shop.model.order.total.OrderTotal;
+
+
+@Component
+@Scope(value = "prototype")
+public class ShoppingCartData extends ShopEntity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String message;
+ private String code;
+ private int quantity;
+ private String total;
+ private String subTotal;
+
+ private List<OrderTotal> totals;//calculated from OrderTotalSummary
+ private List<ShoppingCartItem> shoppingCartItems;
+ private List<ShoppingCartItem> unavailables;
+
+
+ public String getMessage() {
+ return message;
+ }
+ public void setMessage(String message) {
+ this.message = message;
+ }
+ public String getCode() {
+ return code;
+ }
+ public void setCode(String code) {
+ this.code = code;
+ }
+ public int getQuantity() {
+ return quantity;
+ }
+ public void setQuantity(int quantity) {
+ this.quantity = quantity;
+ }
+ public String getTotal() {
+ return total;
+ }
+ public void setTotal(String total) {
+ this.total = total;
+ }
+ public List<ShoppingCartItem> getShoppingCartItems() {
+ return shoppingCartItems;
+ }
+ public void setShoppingCartItems(List<ShoppingCartItem> shoppingCartItems) {
+ this.shoppingCartItems = shoppingCartItems;
+ }
+ public String getSubTotal() {
+ return subTotal;
+ }
+ public void setSubTotal(String subTotal) {
+ this.subTotal = subTotal;
+ }
+ public List<OrderTotal> getTotals() {
+ return totals;
+ }
+ public void setTotals(List<OrderTotal> totals) {
+ this.totals = totals;
+ }
+ public List<ShoppingCartItem> getUnavailables() {
+ return unavailables;
+ }
+ public void setUnavailables(List<ShoppingCartItem> unavailables) {
+ this.unavailables = unavailables;
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ShoppingCartEntity.java b/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ShoppingCartEntity.java
new file mode 100644
index 0000000..f5519f6
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ShoppingCartEntity.java
@@ -0,0 +1,14 @@
+package com.salesmanager.shop.model.shoppingcart;
+
+import com.salesmanager.shop.model.ShopEntity;
+
+public class ShoppingCartEntity extends ShopEntity {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ShoppingCartItem.java b/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ShoppingCartItem.java
index 8454c4d..51c1ee6 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ShoppingCartItem.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/model/shoppingcart/ShoppingCartItem.java
@@ -1,100 +1,100 @@
-package com.salesmanager.shop.model.shoppingcart;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.List;
-
-import com.salesmanager.shop.model.ShopEntity;
-
-
-public class ShoppingCartItem extends ShopEntity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String name;
- private String price;
- private String image;
- private BigDecimal productPrice;
- private int quantity;
- private long productId;
- private String productCode;
- private String code;//shopping cart code
- private boolean productVirtual;
-
- private String subTotal;
-
- private List<ShoppingCartAttribute> shoppingCartAttributes;
-
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getPrice() {
- return price;
- }
- public void setPrice(String price) {
- this.price = price;
- }
- public int getQuantity() {
- return quantity;
- }
- public void setQuantity(int quantity) {
- this.quantity = quantity;
- }
-
-
- public String getCode() {
- return code;
- }
- public void setCode(String code) {
- this.code = code;
- }
- public List<ShoppingCartAttribute> getShoppingCartAttributes() {
- return shoppingCartAttributes;
- }
- public void setShoppingCartAttributes(List<ShoppingCartAttribute> shoppingCartAttributes) {
- this.shoppingCartAttributes = shoppingCartAttributes;
- }
- public void setProductPrice(BigDecimal productPrice) {
- this.productPrice = productPrice;
- }
- public BigDecimal getProductPrice() {
- return productPrice;
- }
- public void setProductId(long productId) {
- this.productId = productId;
- }
- public long getProductId() {
- return productId;
- }
- public void setProductCode(String productCode) {
- this.productCode = productCode;
- }
- public String getProductCode() {
- return productCode;
- }
- public void setImage(String image) {
- this.image = image;
- }
- public String getImage() {
- return image;
- }
- public void setSubTotal(String subTotal) {
- this.subTotal = subTotal;
- }
- public String getSubTotal() {
- return subTotal;
- }
- public boolean isProductVirtual() {
- return productVirtual;
- }
- public void setProductVirtual(boolean productVirtual) {
- this.productVirtual = productVirtual;
- }
-
-
-}
+package com.salesmanager.shop.model.shoppingcart;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+import com.salesmanager.shop.model.ShopEntity;
+
+
+public class ShoppingCartItem extends ShopEntity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String name;
+ private String price;
+ private String image;
+ private BigDecimal productPrice;
+ private int quantity;
+ private long productId;
+ private String productCode;
+ private String code;//shopping cart code
+ private boolean productVirtual;
+
+ private String subTotal;
+
+ private List<ShoppingCartAttribute> shoppingCartAttributes;
+
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public String getPrice() {
+ return price;
+ }
+ public void setPrice(String price) {
+ this.price = price;
+ }
+ public int getQuantity() {
+ return quantity;
+ }
+ public void setQuantity(int quantity) {
+ this.quantity = quantity;
+ }
+
+
+ public String getCode() {
+ return code;
+ }
+ public void setCode(String code) {
+ this.code = code;
+ }
+ public List<ShoppingCartAttribute> getShoppingCartAttributes() {
+ return shoppingCartAttributes;
+ }
+ public void setShoppingCartAttributes(List<ShoppingCartAttribute> shoppingCartAttributes) {
+ this.shoppingCartAttributes = shoppingCartAttributes;
+ }
+ public void setProductPrice(BigDecimal productPrice) {
+ this.productPrice = productPrice;
+ }
+ public BigDecimal getProductPrice() {
+ return productPrice;
+ }
+ public void setProductId(long productId) {
+ this.productId = productId;
+ }
+ public long getProductId() {
+ return productId;
+ }
+ public void setProductCode(String productCode) {
+ this.productCode = productCode;
+ }
+ public String getProductCode() {
+ return productCode;
+ }
+ public void setImage(String image) {
+ this.image = image;
+ }
+ public String getImage() {
+ return image;
+ }
+ public void setSubTotal(String subTotal) {
+ this.subTotal = subTotal;
+ }
+ public String getSubTotal() {
+ return subTotal;
+ }
+ public boolean isProductVirtual() {
+ return productVirtual;
+ }
+ public void setProductVirtual(boolean productVirtual) {
+ this.productVirtual = productVirtual;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableCategoryPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableCategoryPopulator.java
index ec223fc..69718e2 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableCategoryPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableCategoryPopulator.java
@@ -1,145 +1,146 @@
-package com.salesmanager.shop.populator.catalog;
-
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.services.catalog.category.CategoryService;
-import com.salesmanager.core.business.services.reference.language.LanguageService;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.core.model.catalog.category.Category;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.model.catalog.category.CategoryDescription;
-import com.salesmanager.shop.model.catalog.category.PersistableCategory;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.Validate;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-public class PersistableCategoryPopulator extends
- AbstractDataPopulator<PersistableCategory, Category> {
-
-
- private CategoryService categoryService;
- private LanguageService languageService;
-
-
- public void setCategoryService(CategoryService categoryService) {
- this.categoryService = categoryService;
- }
-
- public CategoryService getCategoryService() {
- return categoryService;
- }
-
- public void setLanguageService(LanguageService languageService) {
- this.languageService = languageService;
- }
-
- public LanguageService getLanguageService() {
- return languageService;
- }
-
-
- @Override
- public Category populate(PersistableCategory source, Category target,
- MerchantStore store, Language language)
- throws ConversionException {
-
- try {
-
-
- Validate.notNull(categoryService, "Requires to set CategoryService");
- Validate.notNull(languageService, "Requires to set LanguageService");
-
- target.setMerchantStore(store);
- target.setCode(source.getCode());
- target.setSortOrder(source.getSortOrder());
- target.setVisible(source.isVisible());
-
- //get parent
-
- if(source.getParent()==null) {
-
- target.setParent(null);
- target.setLineage("/");
- target.setDepth(0);
-
- } else {
- Category parent = null;
- if(!StringUtils.isBlank(source.getParent().getCode())) {
- parent = categoryService.getByCode(store.getCode(), source.getParent().getCode());
- } else if(source.getParent().getId()!=null) {
- parent = categoryService.getById(source.getParent().getId());
- } else {
- throw new ConversionException("Category parent needs at least an id or a code for reference");
- }
- if(parent !=null && parent.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- throw new ConversionException("Store id does not belong to specified parent id");
- }
-
- if(parent!=null) {
- target.setParent(parent);
-
- String lineage = parent.getLineage();
- int depth = parent.getDepth();
-
- target.setDepth(depth+1);
- target.setLineage(new StringBuilder().append(lineage).append(parent.getId()).append("/").toString());
- }
-
- }
-
-
- if(!CollectionUtils.isEmpty(source.getChildren())) {
-
- for(PersistableCategory cat : source.getChildren()) {
-
- Category persistCategory = this.populate(cat, new Category(), store, language);
- target.getCategories().add(persistCategory);
-
- }
-
- }
-
-
- if(!CollectionUtils.isEmpty(source.getDescriptions())) {
- List<com.salesmanager.core.model.catalog.category.CategoryDescription> descriptions = new ArrayList<com.salesmanager.core.model.catalog.category.CategoryDescription>();
- for(CategoryDescription description : source.getDescriptions()) {
- com.salesmanager.core.model.catalog.category.CategoryDescription desc = new com.salesmanager.core.model.catalog.category.CategoryDescription();
- desc.setCategory(target);
- desc.setCategoryHighlight(description.getHighlights());
- desc.setDescription(description.getDescription());
- desc.setName(description.getName());
- desc.setMetatagDescription(description.getMetaDescription());
- desc.setMetatagTitle(description.getTitle());
- desc.setSeUrl(description.getFriendlyUrl());
- Language lang = languageService.getByCode(description.getLanguage());
- if(lang==null) {
- throw new ConversionException("Language is null for code " + description.getLanguage() + " use language ISO code [en, fr ...]");
- }
- desc.setLanguage(lang);
- descriptions.add(desc);
- }
- target.setDescriptions(descriptions);
- }
-
-
- return target;
-
-
- } catch(Exception e) {
- throw new ConversionException(e);
- }
-
- }
-
-
- @Override
- protected Category createTarget() {
- // TODO Auto-generated method stub
- return null;
- }
-
-}
+package com.salesmanager.shop.populator.catalog;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.services.catalog.category.CategoryService;
+import com.salesmanager.core.business.services.reference.language.LanguageService;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.catalog.category.Category;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.catalog.category.CategoryDescription;
+import com.salesmanager.shop.model.catalog.category.PersistableCategory;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.Validate;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class PersistableCategoryPopulator extends
+ AbstractDataPopulator<PersistableCategory, Category> {
+
+
+ private CategoryService categoryService;
+ private LanguageService languageService;
+
+
+ public void setCategoryService(CategoryService categoryService) {
+ this.categoryService = categoryService;
+ }
+
+ public CategoryService getCategoryService() {
+ return categoryService;
+ }
+
+ public void setLanguageService(LanguageService languageService) {
+ this.languageService = languageService;
+ }
+
+ public LanguageService getLanguageService() {
+ return languageService;
+ }
+
+
+ @Override
+ public Category populate(PersistableCategory source, Category target,
+ MerchantStore store, Language language)
+ throws ConversionException {
+
+ try {
+
+
+ Validate.notNull(categoryService, "Requires to set CategoryService");
+ Validate.notNull(languageService, "Requires to set LanguageService");
+
+ target.setMerchantStore(store);
+ target.setCode(source.getCode());
+ target.setSortOrder(source.getSortOrder());
+ target.setVisible(source.isVisible());
+ target.setFeatured(source.isFeatured());
+
+ //get parent
+
+ if(source.getParent()==null) {
+
+ target.setParent(null);
+ target.setLineage("/");
+ target.setDepth(0);
+
+ } else {
+ Category parent = null;
+ if(!StringUtils.isBlank(source.getParent().getCode())) {
+ parent = categoryService.getByCode(store.getCode(), source.getParent().getCode());
+ } else if(source.getParent().getId()!=null) {
+ parent = categoryService.getById(source.getParent().getId());
+ } else {
+ throw new ConversionException("Category parent needs at least an id or a code for reference");
+ }
+ if(parent !=null && parent.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ throw new ConversionException("Store id does not belong to specified parent id");
+ }
+
+ if(parent!=null) {
+ target.setParent(parent);
+
+ String lineage = parent.getLineage();
+ int depth = parent.getDepth();
+
+ target.setDepth(depth+1);
+ target.setLineage(new StringBuilder().append(lineage).append(parent.getId()).append("/").toString());
+ }
+
+ }
+
+
+ if(!CollectionUtils.isEmpty(source.getChildren())) {
+
+ for(PersistableCategory cat : source.getChildren()) {
+
+ Category persistCategory = this.populate(cat, new Category(), store, language);
+ target.getCategories().add(persistCategory);
+
+ }
+
+ }
+
+
+ if(!CollectionUtils.isEmpty(source.getDescriptions())) {
+ List<com.salesmanager.core.model.catalog.category.CategoryDescription> descriptions = new ArrayList<com.salesmanager.core.model.catalog.category.CategoryDescription>();
+ for(CategoryDescription description : source.getDescriptions()) {
+ com.salesmanager.core.model.catalog.category.CategoryDescription desc = new com.salesmanager.core.model.catalog.category.CategoryDescription();
+ desc.setCategory(target);
+ desc.setCategoryHighlight(description.getHighlights());
+ desc.setDescription(description.getDescription());
+ desc.setName(description.getName());
+ desc.setMetatagDescription(description.getMetaDescription());
+ desc.setMetatagTitle(description.getTitle());
+ desc.setSeUrl(description.getFriendlyUrl());
+ Language lang = languageService.getByCode(description.getLanguage());
+ if(lang==null) {
+ throw new ConversionException("Language is null for code " + description.getLanguage() + " use language ISO code [en, fr ...]");
+ }
+ desc.setLanguage(lang);
+ descriptions.add(desc);
+ }
+ target.setDescriptions(descriptions);
+ }
+
+
+ return target;
+
+
+ } catch(Exception e) {
+ throw new ConversionException(e);
+ }
+
+ }
+
+
+ @Override
+ protected Category createTarget() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableImagePopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableImagePopulator.java
new file mode 100644
index 0000000..b34e986
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableImagePopulator.java
@@ -0,0 +1,52 @@
+package com.salesmanager.shop.populator.catalog;
+
+import org.apache.commons.lang.Validate;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.image.ProductImage;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.catalog.product.PersistableImage;
+
+public class PersistableImagePopulator extends AbstractDataPopulator<PersistableImage, ProductImage> {
+
+
+ private Product product;
+
+ @Override
+ public ProductImage populate(PersistableImage source, ProductImage target, MerchantStore store, Language language)
+ throws ConversionException {
+
+ Validate.notNull(product,"Must set a product setProduct(Product)");
+ Validate.notNull(product.getId(),"Product must have an id not null");
+ Validate.notNull(source.getContentType(),"Content type must be set on persistable image");
+
+
+ target.setDefaultImage(source.isDefaultImage());
+ target.setImageType(source.getImageType());
+ target.setProductImage(source.getImageName());
+ if(source.getImageUrl() != null) {
+ target.setProductImageUrl(source.getImageUrl());
+ }
+ target.setProduct(product);
+
+ return target;
+ }
+
+ @Override
+ protected ProductImage createTarget() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public Product getProduct() {
+ return product;
+ }
+
+ public void setProduct(Product product) {
+ this.product = product;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableProductOptionPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableProductOptionPopulator.java
index c6d5688..e892d45 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableProductOptionPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableProductOptionPopulator.java
@@ -1,77 +1,77 @@
-package com.salesmanager.shop.populator.catalog;
-
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.services.reference.language.LanguageService;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.core.model.catalog.product.attribute.ProductOption;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.model.catalog.product.attribute.PersistableProductOption;
-import com.salesmanager.shop.model.catalog.product.attribute.ProductOptionDescription;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.Validate;
-
-import java.util.HashSet;
-import java.util.Set;
-
-
-
-
-public class PersistableProductOptionPopulator extends
- AbstractDataPopulator<PersistableProductOption, ProductOption> {
-
- private LanguageService languageService;
-
- public LanguageService getLanguageService() {
- return languageService;
- }
-
- public void setLanguageService(LanguageService languageService) {
- this.languageService = languageService;
- }
-
- @Override
- public ProductOption populate(PersistableProductOption source,
- ProductOption target, MerchantStore store, Language language)
- throws ConversionException {
- Validate.notNull(languageService, "Requires to set LanguageService");
-
-
- try {
-
-
- target.setMerchantStore(store);
- target.setProductOptionSortOrder(source.getOrder());
- target.setCode(source.getCode());
-
- if(!CollectionUtils.isEmpty(source.getDescriptions())) {
- Set<com.salesmanager.core.model.catalog.product.attribute.ProductOptionDescription> descriptions = new HashSet<com.salesmanager.core.model.catalog.product.attribute.ProductOptionDescription>();
- for(ProductOptionDescription desc : source.getDescriptions()) {
- com.salesmanager.core.model.catalog.product.attribute.ProductOptionDescription description = new com.salesmanager.core.model.catalog.product.attribute.ProductOptionDescription();
- Language lang = languageService.getByCode(desc.getLanguage());
- if(lang==null) {
- throw new ConversionException("Language is null for code " + description.getLanguage() + " use language ISO code [en, fr ...]");
- }
- description.setLanguage(lang);
- description.setName(desc.getName());
- description.setTitle(desc.getTitle());
- description.setProductOption(target);
- descriptions.add(description);
- }
- target.setDescriptions(descriptions);
- }
-
- } catch (Exception e) {
- throw new ConversionException(e);
- }
-
-
- return target;
- }
-
- @Override
- protected ProductOption createTarget() {
- return null;
- }
-
-}
+package com.salesmanager.shop.populator.catalog;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.services.reference.language.LanguageService;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.catalog.product.attribute.ProductOption;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.catalog.product.attribute.PersistableProductOption;
+import com.salesmanager.shop.model.catalog.product.attribute.ProductOptionDescription;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.Validate;
+
+import java.util.HashSet;
+import java.util.Set;
+
+
+
+
+public class PersistableProductOptionPopulator extends
+ AbstractDataPopulator<PersistableProductOption, ProductOption> {
+
+ private LanguageService languageService;
+
+ public LanguageService getLanguageService() {
+ return languageService;
+ }
+
+ public void setLanguageService(LanguageService languageService) {
+ this.languageService = languageService;
+ }
+
+ @Override
+ public ProductOption populate(PersistableProductOption source,
+ ProductOption target, MerchantStore store, Language language)
+ throws ConversionException {
+ Validate.notNull(languageService, "Requires to set LanguageService");
+
+
+ try {
+
+
+ target.setMerchantStore(store);
+ target.setProductOptionSortOrder(source.getOrder());
+ target.setCode(source.getCode());
+
+ if(!CollectionUtils.isEmpty(source.getDescriptions())) {
+ Set<com.salesmanager.core.model.catalog.product.attribute.ProductOptionDescription> descriptions = new HashSet<com.salesmanager.core.model.catalog.product.attribute.ProductOptionDescription>();
+ for(ProductOptionDescription desc : source.getDescriptions()) {
+ com.salesmanager.core.model.catalog.product.attribute.ProductOptionDescription description = new com.salesmanager.core.model.catalog.product.attribute.ProductOptionDescription();
+ Language lang = languageService.getByCode(desc.getLanguage());
+ if(lang==null) {
+ throw new ConversionException("Language is null for code " + description.getLanguage() + " use language ISO code [en, fr ...]");
+ }
+ description.setLanguage(lang);
+ description.setName(desc.getName());
+ description.setTitle(desc.getTitle());
+ description.setProductOption(target);
+ descriptions.add(description);
+ }
+ target.setDescriptions(descriptions);
+ }
+
+ } catch (Exception e) {
+ throw new ConversionException(e);
+ }
+
+
+ return target;
+ }
+
+ @Override
+ protected ProductOption createTarget() {
+ return null;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableProductOptionValuePopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableProductOptionValuePopulator.java
index 4efbf76..e8fe73a 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableProductOptionValuePopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableProductOptionValuePopulator.java
@@ -1,84 +1,84 @@
-package com.salesmanager.shop.populator.catalog;
-
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.services.reference.language.LanguageService;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValue;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.model.catalog.product.attribute.PersistableProductOptionValue;
-import com.salesmanager.shop.model.catalog.product.attribute.ProductOptionValueDescription;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.Validate;
-
-import java.util.HashSet;
-import java.util.Set;
-
-
-
-/**
- * Converts a PersistableProductOptionValue to
- * a ProductOptionValue model object
- * @author Carl Samson
- *
- */
-public class PersistableProductOptionValuePopulator extends
- AbstractDataPopulator<PersistableProductOptionValue, ProductOptionValue> {
-
-
- private LanguageService languageService;
-
- public LanguageService getLanguageService() {
- return languageService;
- }
-
- public void setLanguageService(LanguageService languageService) {
- this.languageService = languageService;
- }
-
- @Override
- public ProductOptionValue populate(PersistableProductOptionValue source,
- ProductOptionValue target, MerchantStore store, Language language)
- throws ConversionException {
-
- Validate.notNull(languageService, "Requires to set LanguageService");
-
-
- try {
-
-
- target.setMerchantStore(store);
- target.setProductOptionValueSortOrder(source.getOrder());
- target.setCode(source.getCode());
-
- if(!CollectionUtils.isEmpty(source.getDescriptions())) {
- Set<com.salesmanager.core.model.catalog.product.attribute.ProductOptionValueDescription> descriptions = new HashSet<com.salesmanager.core.model.catalog.product.attribute.ProductOptionValueDescription>();
- for(ProductOptionValueDescription desc : source.getDescriptions()) {
- com.salesmanager.core.model.catalog.product.attribute.ProductOptionValueDescription description = new com.salesmanager.core.model.catalog.product.attribute.ProductOptionValueDescription();
- Language lang = languageService.getByCode(desc.getLanguage());
- if(lang==null) {
- throw new ConversionException("Language is null for code " + description.getLanguage() + " use language ISO code [en, fr ...]");
- }
- description.setLanguage(lang);
- description.setName(desc.getName());
- description.setTitle(desc.getTitle());
- description.setProductOptionValue(target);
- descriptions.add(description);
- }
- target.setDescriptions(descriptions);
- }
-
- } catch (Exception e) {
- throw new ConversionException(e);
- }
-
-
- return target;
- }
-
- @Override
- protected ProductOptionValue createTarget() {
- return null;
- }
-
-}
+package com.salesmanager.shop.populator.catalog;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.services.reference.language.LanguageService;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValue;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.catalog.product.attribute.PersistableProductOptionValue;
+import com.salesmanager.shop.model.catalog.product.attribute.ProductOptionValueDescription;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.Validate;
+
+import java.util.HashSet;
+import java.util.Set;
+
+
+
+/**
+ * Converts a PersistableProductOptionValue to
+ * a ProductOptionValue model object
+ * @author Carl Samson
+ *
+ */
+public class PersistableProductOptionValuePopulator extends
+ AbstractDataPopulator<PersistableProductOptionValue, ProductOptionValue> {
+
+
+ private LanguageService languageService;
+
+ public LanguageService getLanguageService() {
+ return languageService;
+ }
+
+ public void setLanguageService(LanguageService languageService) {
+ this.languageService = languageService;
+ }
+
+ @Override
+ public ProductOptionValue populate(PersistableProductOptionValue source,
+ ProductOptionValue target, MerchantStore store, Language language)
+ throws ConversionException {
+
+ Validate.notNull(languageService, "Requires to set LanguageService");
+
+
+ try {
+
+
+ target.setMerchantStore(store);
+ target.setProductOptionValueSortOrder(source.getOrder());
+ target.setCode(source.getCode());
+
+ if(!CollectionUtils.isEmpty(source.getDescriptions())) {
+ Set<com.salesmanager.core.model.catalog.product.attribute.ProductOptionValueDescription> descriptions = new HashSet<com.salesmanager.core.model.catalog.product.attribute.ProductOptionValueDescription>();
+ for(ProductOptionValueDescription desc : source.getDescriptions()) {
+ com.salesmanager.core.model.catalog.product.attribute.ProductOptionValueDescription description = new com.salesmanager.core.model.catalog.product.attribute.ProductOptionValueDescription();
+ Language lang = languageService.getByCode(desc.getLanguage());
+ if(lang==null) {
+ throw new ConversionException("Language is null for code " + description.getLanguage() + " use language ISO code [en, fr ...]");
+ }
+ description.setLanguage(lang);
+ description.setName(desc.getName());
+ description.setTitle(desc.getTitle());
+ description.setProductOptionValue(target);
+ descriptions.add(description);
+ }
+ target.setDescriptions(descriptions);
+ }
+
+ } catch (Exception e) {
+ throw new ConversionException(e);
+ }
+
+
+ return target;
+ }
+
+ @Override
+ protected ProductOptionValue createTarget() {
+ return null;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableProductPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableProductPopulator.java
index 2f915b7..e9a0448 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableProductPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableProductPopulator.java
@@ -1,351 +1,399 @@
-package com.salesmanager.shop.populator.catalog;
-
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.services.catalog.category.CategoryService;
-import com.salesmanager.core.business.services.catalog.product.attribute.ProductOptionService;
-import com.salesmanager.core.business.services.catalog.product.attribute.ProductOptionValueService;
-import com.salesmanager.core.business.services.catalog.product.manufacturer.ManufacturerService;
-import com.salesmanager.core.business.services.reference.language.LanguageService;
-import com.salesmanager.core.business.services.tax.TaxClassService;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.core.model.catalog.category.Category;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
-import com.salesmanager.core.model.catalog.product.attribute.ProductOption;
-import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValue;
-import com.salesmanager.core.model.catalog.product.availability.ProductAvailability;
-import com.salesmanager.core.model.catalog.product.description.ProductDescription;
-import com.salesmanager.core.model.catalog.product.image.ProductImage;
-import com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer;
-import com.salesmanager.core.model.catalog.product.price.ProductPrice;
-import com.salesmanager.core.model.catalog.product.price.ProductPriceDescription;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.model.catalog.product.PersistableImage;
-import com.salesmanager.shop.model.catalog.product.PersistableProduct;
-import com.salesmanager.shop.model.catalog.product.ProductPriceEntity;
-import com.salesmanager.shop.utils.DateUtil;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.Validate;
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.ByteArrayInputStream;
-import java.math.BigDecimal;
-import java.util.*;
-
-
-
-public class PersistableProductPopulator extends
- AbstractDataPopulator<PersistableProduct, Product> {
-
-
- private CategoryService categoryService;
- private ManufacturerService manufacturerService;
- private TaxClassService taxClassService;
- private LanguageService languageService;
-
- private ProductOptionService productOptionService;
- private ProductOptionValueService productOptionValueService;
-
-
- @Override
- public Product populate(PersistableProduct source,
- Product target, MerchantStore store, Language language)
- throws ConversionException {
-
- Validate.notNull(manufacturerService, "Requires to set ManufacturerService");
- Validate.notNull(languageService, "Requires to set LanguageService");
- Validate.notNull(categoryService, "Requires to set CategoryService");
- Validate.notNull(taxClassService, "Requires to set TaxClassService");
- Validate.notNull(productOptionService, "Requires to set ProductOptionService");
- Validate.notNull(productOptionValueService, "Requires to set ProductOptionValueService");
-
- try {
-
- target.setSku(source.getSku());
- target.setAvailable(source.isAvailable());
- target.setPreOrder(source.isPreOrder());
- target.setRefSku(source.getRefSku());
-
- if(!StringUtils.isBlank(source.getDateAvailable())) {
- target.setDateAvailable(DateUtil.getDate(source.getDateAvailable()));
- }
-
- if(source.getManufacturer()!=null) {
-
- Manufacturer manuf = null;
- if(!StringUtils.isBlank(source.getManufacturer().getCode())) {
- manuf = manufacturerService.getByCode(store, source.getManufacturer().getCode());
- } else {
- Validate.notNull(source.getManufacturer().getId(), "Requires to set manufacturer id");
- manuf = manufacturerService.getById(source.getManufacturer().getId());
- }
-
- if(manuf==null) {
- throw new ConversionException("Invalid manufacturer id");
- }
- if(manuf!=null) {
- if(manuf.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- throw new ConversionException("Invalid manufacturer id");
- }
- target.setManufacturer(manuf);
-
- }
- }
-
- target.setMerchantStore(store);
-
- List<Language> languages = new ArrayList<Language>();
- Set<ProductDescription> descriptions = new HashSet<ProductDescription>();
- if(!CollectionUtils.isEmpty(source.getDescriptions())) {
- for(com.salesmanager.shop.model.catalog.product.ProductDescription description : source.getDescriptions()) {
-
- ProductDescription productDescription = new ProductDescription();
- productDescription.setProduct(target);
- productDescription.setDescription(description.getDescription());
- productDescription.setName(description.getName());
- productDescription.setSeUrl(description.getFriendlyUrl());
- productDescription.setMetatagKeywords(description.getKeyWords());
- productDescription.setMetatagDescription(description.getMetaDescription());
- productDescription.setTitle(description.getTitle());
-
- Language lang = languageService.getByCode(description.getLanguage());
- if(lang==null) {
- throw new ConversionException("Language code " + description.getLanguage() + " is invalid, use ISO code (en, fr ...)");
- }
-
- languages.add(lang);
- productDescription.setLanguage(lang);
- descriptions.add(productDescription);
- }
- }
-
- if(descriptions.size()>0) {
- target.setDescriptions(descriptions);
- }
-
- //target.setType(source.getType());//not implemented yet
- target.setProductHeight(source.getProductHeight());
- target.setProductLength(source.getProductLength());
- target.setProductWeight(source.getProductWeight());
- target.setProductWidth(source.getProductWidth());
- target.setSortOrder(source.getSortOrder());
- target.setProductVirtual(source.isProductVirtual());
- target.setProductShipeable(source.isProductShipeable());
- if(source.getRating() != null) {
- target.setProductReviewAvg(new BigDecimal(source.getRating()));
- }
- target.setProductReviewCount(source.getRatingCount());
-
-
- if(CollectionUtils.isNotEmpty(source.getProductPrices())) {
-
- ProductAvailability productAvailability = new ProductAvailability();
-
- productAvailability.setProductQuantity(source.getQuantity());
- productAvailability.setProductQuantityOrderMin(1);
- productAvailability.setProductQuantityOrderMax(1);
-
- for(ProductPriceEntity priceEntity : source.getProductPrices()) {
-
- ProductPrice price = new ProductPrice();
- price.setDefaultPrice(priceEntity.isDefaultPrice());
- price.setProductPriceAmount(priceEntity.getOriginalPrice());
- price.setCode(priceEntity.getCode());
- price.setProductPriceSpecialAmount(priceEntity.getDiscountedPrice());
- if(priceEntity.getDiscountStartDate()!=null) {
- Date startDate = DateUtil.getDate(priceEntity.getDiscountStartDate());
- price.setProductPriceSpecialStartDate(startDate);
- }
- if(priceEntity.getDiscountEndDate()!=null) {
- Date endDate = DateUtil.getDate(priceEntity.getDiscountEndDate());
- price.setProductPriceSpecialEndDate(endDate);
- }
- productAvailability.getPrices().add(price);
- target.getAvailabilities().add(productAvailability);
- for(Language lang : languages) {
- ProductPriceDescription ppd = new ProductPriceDescription();
- ppd.setProductPrice(price);
- ppd.setLanguage(lang);
- ppd.setName(ProductPriceDescription.DEFAULT_PRICE_DESCRIPTION);
- price.getDescriptions().add(ppd);
- }
- }
-
- } else {
-
- ProductAvailability productAvailability = new ProductAvailability();
-
- productAvailability.setProductQuantity(source.getQuantity());
- productAvailability.setProductQuantityOrderMin(1);
- productAvailability.setProductQuantityOrderMax(1);
-
- ProductPrice price = new ProductPrice();
- price.setDefaultPrice(true);
- price.setProductPriceAmount(source.getPrice());
- price.setCode(ProductPriceEntity.DEFAULT_PRICE_CODE);
- price.setProductAvailability(productAvailability);
- productAvailability.getPrices().add(price);
- target.getAvailabilities().add(productAvailability);
- for(Language lang : languages) {
- ProductPriceDescription ppd = new ProductPriceDescription();
- ppd.setProductPrice(price);
- ppd.setLanguage(lang);
- ppd.setName(ProductPriceDescription.DEFAULT_PRICE_DESCRIPTION);
- price.getDescriptions().add(ppd);
- }
-
-
- }
-
-
- //image
- if(source.getImages()!=null) {
- for(PersistableImage img : source.getImages()) {
- ByteArrayInputStream in = new ByteArrayInputStream(img.getBytes());
- ProductImage productImage = new ProductImage();
- productImage.setProduct(target);
- productImage.setProductImage(img.getImageName());
- productImage.setImage(in);
- target.getImages().add(productImage);
- }
- }
-
- //attributes
- if(source.getAttributes()!=null) {
- for(com.salesmanager.shop.model.catalog.product.attribute.ProductAttributeEntity attr : source.getAttributes()) {
-
- ProductOption productOption = null;
-
- if(!StringUtils.isBlank(attr.getOption().getCode())) {
- productOption = productOptionService.getByCode(store, attr.getOption().getCode());
- } else {
- Validate.notNull(attr.getOption().getId(),"Product option id is null");
- productOption = productOptionService.getById(attr.getOption().getId());
- }
-
- if(productOption==null) {
- throw new ConversionException("Product option id " + attr.getOption().getId() + " does not exist");
- }
-
- ProductOptionValue productOptionValue = null;
-
- if(!StringUtils.isBlank(attr.getOptionValue().getCode())) {
- productOptionValue = productOptionValueService.getByCode(store, attr.getOptionValue().getCode());
- } else {
- productOptionValue = productOptionValueService.getById(attr.getOptionValue().getId());
- }
-
- if(productOptionValue==null) {
- throw new ConversionException("Product option value id " + attr.getOptionValue().getId() + " does not exist");
- }
-
- if(productOption.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- throw new ConversionException("Invalid product option id ");
- }
-
- if(productOptionValue.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- throw new ConversionException("Invalid product option value id ");
- }
-
- ProductAttribute attribute = new ProductAttribute();
- attribute.setProduct(target);
- attribute.setProductOption(productOption);
- attribute.setProductOptionValue(productOptionValue);
- attribute.setProductAttributePrice(attr.getProductAttributePrice());
- attribute.setProductAttributeWeight(attr.getProductAttributeWeight());
- attribute.setProductAttributePrice(attr.getProductAttributePrice());
- target.getAttributes().add(attribute);
-
- }
- }
-
-
- //categories
- if(!CollectionUtils.isEmpty(source.getCategories())) {
- for(com.salesmanager.shop.model.catalog.category.Category categ : source.getCategories()) {
-
- Category c = null;
- if(!StringUtils.isBlank(categ.getCode())) {
- c = categoryService.getByCode(store, categ.getCode());
- } else {
- Validate.notNull(categ.getId(), "Category id nust not be null");
- c = categoryService.getById(categ.getId());
- }
-
- if(c==null) {
- throw new ConversionException("Category id " + categ.getId() + " does not exist");
- }
- if(c.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- throw new ConversionException("Invalid category id");
- }
- target.getCategories().add(c);
- }
- }
- return target;
-
- } catch (Exception e) {
- throw new ConversionException(e);
- }
- }
-
-
-
- public void setCategoryService(CategoryService categoryService) {
- this.categoryService = categoryService;
- }
-
- public CategoryService getCategoryService() {
- return categoryService;
- }
-
- public void setManufacturerService(ManufacturerService manufacturerService) {
- this.manufacturerService = manufacturerService;
- }
-
- public ManufacturerService getManufacturerService() {
- return manufacturerService;
- }
-
- public void setTaxClassService(TaxClassService taxClassService) {
- this.taxClassService = taxClassService;
- }
-
- public TaxClassService getTaxClassService() {
- return taxClassService;
- }
-
-
- public LanguageService getLanguageService() {
- return languageService;
- }
-
- public void setLanguageService(LanguageService languageService) {
- this.languageService = languageService;
- }
-
- public ProductOptionService getProductOptionService() {
- return productOptionService;
- }
-
- public void setProductOptionService(ProductOptionService productOptionService) {
- this.productOptionService = productOptionService;
- }
-
- public ProductOptionValueService getProductOptionValueService() {
- return productOptionValueService;
- }
-
- public void setProductOptionValueService(
- ProductOptionValueService productOptionValueService) {
- this.productOptionValueService = productOptionValueService;
- }
-
-
- @Override
- protected Product createTarget() {
- // TODO Auto-generated method stub
- return null;
- }
-
-}
+package com.salesmanager.shop.populator.catalog;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.services.catalog.category.CategoryService;
+import com.salesmanager.core.business.services.catalog.product.attribute.ProductOptionService;
+import com.salesmanager.core.business.services.catalog.product.attribute.ProductOptionValueService;
+import com.salesmanager.core.business.services.catalog.product.manufacturer.ManufacturerService;
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.business.services.reference.language.LanguageService;
+import com.salesmanager.core.business.services.tax.TaxClassService;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.catalog.category.Category;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
+import com.salesmanager.core.model.catalog.product.attribute.ProductOption;
+import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValue;
+import com.salesmanager.core.model.catalog.product.availability.ProductAvailability;
+import com.salesmanager.core.model.catalog.product.description.ProductDescription;
+import com.salesmanager.core.model.catalog.product.image.ProductImage;
+import com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer;
+import com.salesmanager.core.model.catalog.product.price.ProductPrice;
+import com.salesmanager.core.model.catalog.product.price.ProductPriceDescription;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.catalog.product.PersistableImage;
+import com.salesmanager.shop.model.catalog.product.PersistableProduct;
+import com.salesmanager.shop.model.catalog.product.ProductPriceEntity;
+import com.salesmanager.shop.model.customer.Customer;
+import com.salesmanager.shop.utils.DateUtil;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.Validate;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.ByteArrayInputStream;
+import java.math.BigDecimal;
+import java.util.*;
+
+
+
+public class PersistableProductPopulator extends
+ AbstractDataPopulator<PersistableProduct, Product> {
+
+
+ private CategoryService categoryService;
+ private ManufacturerService manufacturerService;
+ private TaxClassService taxClassService;
+ private LanguageService languageService;
+
+ private ProductOptionService productOptionService;
+ private ProductOptionValueService productOptionValueService;
+ private CustomerService customerService;
+
+
+ @Override
+ public Product populate(PersistableProduct source,
+ Product target, MerchantStore store, Language language)
+ throws ConversionException {
+
+ Validate.notNull(manufacturerService, "Requires to set ManufacturerService");
+ Validate.notNull(languageService, "Requires to set LanguageService");
+ Validate.notNull(categoryService, "Requires to set CategoryService");
+ Validate.notNull(taxClassService, "Requires to set TaxClassService");
+ Validate.notNull(customerService, "Requires to set CustomerService");//RENTAL
+ Validate.notNull(productOptionService, "Requires to set ProductOptionService");
+ Validate.notNull(productOptionValueService, "Requires to set ProductOptionValueService");
+
+ try {
+
+ target.setSku(source.getSku());
+ target.setAvailable(source.isAvailable());
+ target.setPreOrder(source.isPreOrder());
+ target.setRefSku(source.getRefSku());
+ if(source.getId() != null && source.getId().longValue()==0) {
+ target.setId(null);
+ } else {
+ target.setId(source.getId());
+ }
+
+ target.setCondition(source.getCondition());
+
+
+ //RENTAL
+ target.setRentalDuration(source.getRentalDuration());
+ target.setRentalStatus(source.getRentalStatus());
+ target.setRentalPeriod(source.getRentalPeriod());
+
+ /** end RENTAL **/
+
+ if(source.getOwner()!=null && source.getOwner().getId()!=null) {
+ com.salesmanager.core.model.customer.Customer owner = customerService.getById(source.getOwner().getId());
+ target.setOwner(owner);
+ }
+
+ if(!StringUtils.isBlank(source.getDateAvailable())) {
+ target.setDateAvailable(DateUtil.getDate(source.getDateAvailable()));
+ }
+
+ if(source.getManufacturer()!=null) {
+
+ Manufacturer manuf = null;
+ if(!StringUtils.isBlank(source.getManufacturer().getCode())) {
+ manuf = manufacturerService.getByCode(store, source.getManufacturer().getCode());
+ } else {
+ Validate.notNull(source.getManufacturer().getId(), "Requires to set manufacturer id");
+ manuf = manufacturerService.getById(source.getManufacturer().getId());
+ }
+
+ if(manuf==null) {
+ throw new ConversionException("Invalid manufacturer id");
+ }
+ if(manuf!=null) {
+ if(manuf.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ throw new ConversionException("Invalid manufacturer id");
+ }
+ target.setManufacturer(manuf);
+ }
+ }
+
+ target.setMerchantStore(store);
+
+ List<Language> languages = new ArrayList<Language>();
+ Set<ProductDescription> descriptions = new HashSet<ProductDescription>();
+ if(!CollectionUtils.isEmpty(source.getDescriptions())) {
+ for(com.salesmanager.shop.model.catalog.product.ProductDescription description : source.getDescriptions()) {
+
+ ProductDescription productDescription = new ProductDescription();
+ productDescription.setProduct(target);
+ productDescription.setDescription(description.getDescription());
+ if(description.getId() != null && description.getId().longValue() ==0) {
+ productDescription.setId(null);
+ } else {
+ productDescription.setId(description.getId());
+ }
+
+ productDescription.setName(description.getName());
+ productDescription.setSeUrl(description.getFriendlyUrl());
+ productDescription.setMetatagKeywords(description.getKeyWords());
+ productDescription.setMetatagDescription(description.getMetaDescription());
+ productDescription.setTitle(description.getTitle());
+
+ Language lang = languageService.getByCode(description.getLanguage());
+ if(lang==null) {
+ throw new ConversionException("Language code " + description.getLanguage() + " is invalid, use ISO code (en, fr ...)");
+ }
+
+ languages.add(lang);
+ productDescription.setLanguage(lang);
+ descriptions.add(productDescription);
+ }
+ }
+
+ if(descriptions.size()>0) {
+ target.setDescriptions(descriptions);
+ }
+
+ //target.setType(source.getType());//not implemented yet
+ target.setProductHeight(source.getProductHeight());
+ target.setProductLength(source.getProductLength());
+ target.setProductWeight(source.getProductWeight());
+ target.setProductWidth(source.getProductWidth());
+ target.setSortOrder(source.getSortOrder());
+ target.setProductVirtual(source.isProductVirtual());
+ target.setProductShipeable(source.isProductShipeable());
+ if(source.getRating() != null) {
+ target.setProductReviewAvg(new BigDecimal(source.getRating()));
+ }
+ target.setProductReviewCount(source.getRatingCount());
+
+
+ if(CollectionUtils.isNotEmpty(source.getProductPrices())) {
+
+ ProductAvailability productAvailability = new ProductAvailability();
+
+/* if(productAvailability.getId() != null && productAvailability.getId().longValue() == 0) {
+ } else {
+ productAvailability.setId(null);
+ }*/
+
+ productAvailability.setProductQuantity(source.getQuantity());
+ productAvailability.setProduct(target);
+ productAvailability.setProductQuantityOrderMin(1);
+ productAvailability.setProductQuantityOrderMax(1);
+
+ for(ProductPriceEntity priceEntity : source.getProductPrices()) {
+
+ ProductPrice price = new ProductPrice();
+ price.setProductAvailability(productAvailability);
+ price.setDefaultPrice(priceEntity.isDefaultPrice());
+ price.setProductPriceAmount(priceEntity.getOriginalPrice());
+ price.setCode(priceEntity.getCode());
+ price.setProductPriceSpecialAmount(priceEntity.getDiscountedPrice());
+ if(priceEntity.getDiscountStartDate()!=null) {
+ Date startDate = DateUtil.getDate(priceEntity.getDiscountStartDate());
+ price.setProductPriceSpecialStartDate(startDate);
+ }
+ if(priceEntity.getDiscountEndDate()!=null) {
+ Date endDate = DateUtil.getDate(priceEntity.getDiscountEndDate());
+ price.setProductPriceSpecialEndDate(endDate);
+ }
+ productAvailability.getPrices().add(price);
+ target.getAvailabilities().add(productAvailability);
+ for(Language lang : languages) {
+ ProductPriceDescription ppd = new ProductPriceDescription();
+ ppd.setProductPrice(price);
+ ppd.setLanguage(lang);
+ ppd.setName(ProductPriceDescription.DEFAULT_PRICE_DESCRIPTION);
+ price.getDescriptions().add(ppd);
+ }
+ }
+
+ } else { //create
+
+ ProductAvailability productAvailability = new ProductAvailability();
+ productAvailability.setProduct(target);
+ productAvailability.setProductQuantity(source.getQuantity());
+ productAvailability.setProductQuantityOrderMin(1);
+ productAvailability.setProductQuantityOrderMax(1);
+
+ ProductPrice price = new ProductPrice();
+ price.setDefaultPrice(true);
+ price.setProductPriceAmount(source.getPrice());
+ price.setCode(ProductPriceEntity.DEFAULT_PRICE_CODE);
+ price.setProductAvailability(productAvailability);
+ productAvailability.getPrices().add(price);
+ target.getAvailabilities().add(productAvailability);
+ for(Language lang : languages) {
+ ProductPriceDescription ppd = new ProductPriceDescription();
+ ppd.setProductPrice(price);
+ ppd.setLanguage(lang);
+ ppd.setName(ProductPriceDescription.DEFAULT_PRICE_DESCRIPTION);
+ price.getDescriptions().add(ppd);
+ }
+
+
+ }
+
+
+ //image
+ if(source.getImages()!=null) {
+ for(PersistableImage img : source.getImages()) {
+ ByteArrayInputStream in = new ByteArrayInputStream(img.getBytes());
+ ProductImage productImage = new ProductImage();
+ productImage.setProduct(target);
+ productImage.setProductImage(img.getImageName());
+ productImage.setImage(in);
+ target.getImages().add(productImage);
+ }
+ }
+
+ //attributes
+ if(source.getAttributes()!=null) {
+ for(com.salesmanager.shop.model.catalog.product.attribute.ProductAttributeEntity attr : source.getAttributes()) {
+
+ ProductOption productOption = null;
+
+ if(!StringUtils.isBlank(attr.getOption().getCode())) {
+ productOption = productOptionService.getByCode(store, attr.getOption().getCode());
+ } else {
+ Validate.notNull(attr.getOption().getId(),"Product option id is null");
+ productOption = productOptionService.getById(attr.getOption().getId());
+ }
+
+ if(productOption==null) {
+ throw new ConversionException("Product option id " + attr.getOption().getId() + " does not exist");
+ }
+
+ ProductOptionValue productOptionValue = null;
+
+ if(!StringUtils.isBlank(attr.getOptionValue().getCode())) {
+ productOptionValue = productOptionValueService.getByCode(store, attr.getOptionValue().getCode());
+ } else {
+ productOptionValue = productOptionValueService.getById(attr.getOptionValue().getId());
+ }
+
+ if(productOptionValue==null) {
+ throw new ConversionException("Product option value id " + attr.getOptionValue().getId() + " does not exist");
+ }
+
+ if(productOption.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ throw new ConversionException("Invalid product option id ");
+ }
+
+ if(productOptionValue.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ throw new ConversionException("Invalid product option value id ");
+ }
+
+ ProductAttribute attribute = new ProductAttribute();
+ attribute.setProduct(target);
+ attribute.setProductOption(productOption);
+ attribute.setProductOptionValue(productOptionValue);
+ attribute.setProductAttributePrice(attr.getProductAttributePrice());
+ attribute.setProductAttributeWeight(attr.getProductAttributeWeight());
+ attribute.setProductAttributePrice(attr.getProductAttributePrice());
+ target.getAttributes().add(attribute);
+
+ }
+ }
+
+
+ //categories
+ if(!CollectionUtils.isEmpty(source.getCategories())) {
+ for(com.salesmanager.shop.model.catalog.category.Category categ : source.getCategories()) {
+
+ Category c = null;
+ if(!StringUtils.isBlank(categ.getCode())) {
+ c = categoryService.getByCode(store, categ.getCode());
+ } else {
+ Validate.notNull(categ.getId(), "Category id nust not be null");
+ c = categoryService.getById(categ.getId());
+ }
+
+ if(c==null) {
+ throw new ConversionException("Category id " + categ.getId() + " does not exist");
+ }
+ if(c.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ throw new ConversionException("Invalid category id");
+ }
+ target.getCategories().add(c);
+ }
+ }
+ return target;
+
+ } catch (Exception e) {
+ throw new ConversionException(e);
+ }
+ }
+
+
+
+ public void setCategoryService(CategoryService categoryService) {
+ this.categoryService = categoryService;
+ }
+
+ public CategoryService getCategoryService() {
+ return categoryService;
+ }
+
+ public void setManufacturerService(ManufacturerService manufacturerService) {
+ this.manufacturerService = manufacturerService;
+ }
+
+ public ManufacturerService getManufacturerService() {
+ return manufacturerService;
+ }
+
+ public void setTaxClassService(TaxClassService taxClassService) {
+ this.taxClassService = taxClassService;
+ }
+
+ public TaxClassService getTaxClassService() {
+ return taxClassService;
+ }
+
+
+ public LanguageService getLanguageService() {
+ return languageService;
+ }
+
+ public void setLanguageService(LanguageService languageService) {
+ this.languageService = languageService;
+ }
+
+ public ProductOptionService getProductOptionService() {
+ return productOptionService;
+ }
+
+ public void setProductOptionService(ProductOptionService productOptionService) {
+ this.productOptionService = productOptionService;
+ }
+
+ public ProductOptionValueService getProductOptionValueService() {
+ return productOptionValueService;
+ }
+
+ public void setProductOptionValueService(
+ ProductOptionValueService productOptionValueService) {
+ this.productOptionValueService = productOptionValueService;
+ }
+
+
+ @Override
+ protected Product createTarget() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+
+
+ public CustomerService getCustomerService() {
+ return customerService;
+ }
+
+
+
+ public void setCustomerService(CustomerService customerService) {
+ this.customerService = customerService;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableProductReviewPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableProductReviewPopulator.java
index 4e22873..c073a0f 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableProductReviewPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/PersistableProductReviewPopulator.java
@@ -1,10 +1,9 @@
package com.salesmanager.shop.populator.catalog;
+import java.util.Date;
import java.util.HashSet;
import java.util.Set;
-import javax.inject.Inject;
-
import org.apache.commons.lang.Validate;
import com.salesmanager.core.business.exception.ConversionException;
@@ -28,13 +27,13 @@ public class PersistableProductReviewPopulator extends
- @Inject
+
private CustomerService customerService;
- @Inject
+
private ProductService productService;
- @Inject
+
private LanguageService languageService;
@@ -56,6 +55,7 @@ public class PersistableProductReviewPopulator extends
Validate.notNull(customerService,"customerService cannot be null");
Validate.notNull(productService,"productService cannot be null");
Validate.notNull(languageService,"languageService cannot be null");
+ Validate.notNull(source.getRating(),"Rating cannot bot be null");
try {
@@ -70,6 +70,10 @@ public class PersistableProductReviewPopulator extends
throw new ConversionException("Invalid customer id for the given store");
}
+ if(source.getDate() == null) {
+ String date = DateUtil.formatDate(new Date());
+ source.setDate(date);
+ }
target.setReviewDate(DateUtil.getDate(source.getDate()));
target.setCustomer(customer);
target.setReviewRating(source.getRating());
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/ReadableCategoryPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/ReadableCategoryPopulator.java
index 657ae51..407c551 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/ReadableCategoryPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/ReadableCategoryPopulator.java
@@ -2,6 +2,8 @@ package com.salesmanager.shop.populator.catalog;
+import org.apache.commons.lang.Validate;
+
import com.salesmanager.core.business.exception.ConversionException;
import com.salesmanager.core.business.utils.AbstractDataPopulator;
import com.salesmanager.core.model.catalog.category.Category;
@@ -18,6 +20,9 @@ public class ReadableCategoryPopulator extends
MerchantStore store, Language language) throws ConversionException {
+ Validate.notNull(source,"Category must not be null");
+
+
target.setLineage(source.getLineage());
if(source.getDescriptions()!=null && source.getDescriptions().size()>0) {
@@ -37,6 +42,7 @@ public class ReadableCategoryPopulator extends
com.salesmanager.shop.model.catalog.category.CategoryDescription desc = new com.salesmanager.shop.model.catalog.category.CategoryDescription();
desc.setFriendlyUrl(description.getSeUrl());
desc.setName(description.getName());
+ desc.setId(source.getId());
desc.setDescription(description.getName());
desc.setKeyWords(description.getMetatagKeywords());
desc.setHighlights(description.getCategoryHighlight());
@@ -55,11 +61,13 @@ public class ReadableCategoryPopulator extends
target.setParent(parent);
}
+
target.setCode(source.getCode());
target.setId(source.getId());
target.setDepth(source.getDepth());
target.setSortOrder(source.getSortOrder());
target.setVisible(source.isVisible());
+ target.setFeatured(source.isFeatured());
return target;
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/ReadableProductPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/ReadableProductPopulator.java
index 196a4f3..0bb5391 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/ReadableProductPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/ReadableProductPopulator.java
@@ -1,225 +1,296 @@
-package com.salesmanager.shop.populator.catalog;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.lang.Validate;
-import org.apache.commons.lang3.StringUtils;
-
-import com.salesmanager.core.business.constants.Constants;
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.services.catalog.product.PricingService;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.core.model.catalog.category.Category;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.availability.ProductAvailability;
-import com.salesmanager.core.model.catalog.product.description.ProductDescription;
-import com.salesmanager.core.model.catalog.product.image.ProductImage;
-import com.salesmanager.core.model.catalog.product.manufacturer.ManufacturerDescription;
-import com.salesmanager.core.model.catalog.product.price.FinalPrice;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.model.catalog.ReadableImage;
-import com.salesmanager.shop.model.catalog.manufacturer.ReadableManufacturer;
-import com.salesmanager.shop.model.catalog.product.ReadableProduct;
-import com.salesmanager.shop.utils.ImageFilePath;
-
-
-
-public class ReadableProductPopulator extends
- AbstractDataPopulator<Product, ReadableProduct> {
-
- private PricingService pricingService;
-
- private ImageFilePath imageUtils;
-
- public ImageFilePath getimageUtils() {
- return imageUtils;
- }
-
-
-
-
- public void setimageUtils(ImageFilePath imageUtils) {
- this.imageUtils = imageUtils;
- }
-
-
-
-
- public PricingService getPricingService() {
- return pricingService;
- }
-
-
-
-
- public void setPricingService(PricingService pricingService) {
- this.pricingService = pricingService;
- }
-
-
-
-
- @Override
- public ReadableProduct populate(Product source,
- ReadableProduct target, MerchantStore store, Language language)
- throws ConversionException {
- Validate.notNull(pricingService, "Requires to set PricingService");
- Validate.notNull(imageUtils, "Requires to set imageUtils");
-
- try {
-
-
- ProductDescription description = source.getProductDescription();
-
- target.setId(source.getId());
- target.setAvailable(source.isAvailable());
- target.setProductHeight(source.getProductHeight());
- target.setProductLength(source.getProductLength());
- target.setProductWeight(source.getProductWeight());
- target.setProductWidth(source.getProductWidth());
- target.setPreOrder(source.isPreOrder());
- target.setRefSku(source.getRefSku());
- target.setSortOrder(source.getSortOrder());
-
- if(source.getProductReviewAvg()!=null) {
- double avg = source.getProductReviewAvg().doubleValue();
- double rating = Math.round(avg * 2) / 2.0f;
- target.setRating(rating);
- }
- target.setProductVirtual(source.getProductVirtual());
- if(source.getProductReviewCount()!=null) {
- target.setRatingCount(source.getProductReviewCount().intValue());
- }
- if(description!=null) {
- com.salesmanager.shop.model.catalog.product.ProductDescription tragetDescription = new com.salesmanager.shop.model.catalog.product.ProductDescription();
- tragetDescription.setFriendlyUrl(description.getSeUrl());
- tragetDescription.setName(description.getName());
- if(!StringUtils.isBlank(description.getMetatagTitle())) {
- tragetDescription.setTitle(description.getMetatagTitle());
- } else {
- tragetDescription.setTitle(description.getName());
- }
- tragetDescription.setMetaDescription(description.getMetatagDescription());
- tragetDescription.setDescription(description.getDescription());
- tragetDescription.setHighlights(description.getProductHighlight());
- target.setDescription(tragetDescription);
- }
-
- if(source.getManufacturer()!=null) {
- ManufacturerDescription manufacturer = source.getManufacturer().getDescriptions().iterator().next();
- ReadableManufacturer manufacturerEntity = new ReadableManufacturer();
- com.salesmanager.shop.model.catalog.manufacturer.ManufacturerDescription d = new com.salesmanager.shop.model.catalog.manufacturer.ManufacturerDescription();
- d.setName(manufacturer.getName());
- manufacturerEntity.setDescription(d);
- manufacturerEntity.setId(manufacturer.getId());
- manufacturerEntity.setOrder(source.getManufacturer().getOrder());
- manufacturerEntity.setCode(source.getManufacturer().getCode());
- target.setManufacturer(manufacturerEntity);
- }
-
- ProductImage image = source.getProductImage();
- if(image!=null) {
- ReadableImage rimg = new ReadableImage();
- rimg.setImageName(image.getProductImage());
-
- String contextPath = imageUtils.getContextPath();
- StringBuilder imagePath = new StringBuilder();
- imagePath.append(contextPath).append(imageUtils.buildProductImageUtils(store, source.getSku(), image.getProductImage()));
-
- rimg.setImageUrl(imagePath.toString());
-
-
- rimg.setId(image.getId());
- target.setImage(rimg);
-
- //other images
- Set<ProductImage> images = source.getImages();
- if(images!=null && images.size()>0) {
- List<ReadableImage> imageList = new ArrayList<ReadableImage>();
- for(ProductImage img : images) {
- ReadableImage prdImage = new ReadableImage();
- prdImage.setImageName(img.getProductImage());
-
- StringBuilder imgPath = new StringBuilder();
- imgPath.append(contextPath).append(imageUtils.buildProductImageUtils(store, source.getSku(), img.getProductImage()));
-
- prdImage.setImageUrl(imgPath.toString());
- prdImage.setId(img.getId());
- prdImage.setImageType(img.getImageType());
- if(img.getProductImageUrl()!=null){
- prdImage.setExternalUrl(img.getProductImageUrl());
- }
- if(img.getImageType()==1 && img.getProductImageUrl()!=null) {//video
- prdImage.setVideoUrl(img.getProductImageUrl());
- }
- imageList.add(prdImage);
- }
- target
- .setImages(imageList);
- }
- }
-
- //remove products from invisible category -> set visible = false
-/* Set<Category> categories = source.getCategories();
- boolean isVisible = true;
- if(!CollectionUtils.isEmpty(categories)) {
- for(Category c : categories) {
- if(c.isVisible()) {
- isVisible = true;
- break;
- } else {
- isVisible = false;
- }
- }
- }*/
-
- //target.setVisible(isVisible);
-
-
- target.setSku(source.getSku());
- //target.setLanguage(language.getCode());
-
- FinalPrice price = pricingService.calculateProductPrice(source);
-
- target.setFinalPrice(pricingService.getDisplayAmount(price.getFinalPrice(), store));
- target.setPrice(price.getFinalPrice());
-
- if(price.isDiscounted()) {
- target.setDiscounted(true);
- target.setOriginalPrice(pricingService.getDisplayAmount(price.getOriginalPrice(), store));
- }
-
- //availability
- for(ProductAvailability availability : source.getAvailabilities()) {
- if(availability.getRegion().equals(Constants.ALL_REGIONS)) {//TODO REL 2.1 accept a region
- target.setQuantity(availability.getProductQuantity());
- target.setQuantityOrderMaximum(availability.getProductQuantityOrderMax());
- target.setQuantityOrderMinimum(availability.getProductQuantityOrderMin());
- if(availability.getProductQuantity().intValue() > 0 && target.isAvailable()) {
- target.setCanBePurchased(true);
- }
- }
- }
-
-
- return target;
-
- } catch (Exception e) {
- throw new ConversionException(e);
- }
- }
-
-
-
-
- @Override
- protected ReadableProduct createTarget() {
- // TODO Auto-generated method stub
- return null;
- }
-
-}
+package com.salesmanager.shop.populator.catalog;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.Validate;
+import org.apache.commons.lang3.StringUtils;
+
+import com.salesmanager.core.business.constants.Constants;
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.catalog.category.Category;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.availability.ProductAvailability;
+import com.salesmanager.core.model.catalog.product.description.ProductDescription;
+import com.salesmanager.core.model.catalog.product.image.ProductImage;
+import com.salesmanager.core.model.catalog.product.manufacturer.ManufacturerDescription;
+import com.salesmanager.core.model.catalog.product.price.FinalPrice;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.catalog.category.ReadableCategory;
+import com.salesmanager.shop.model.catalog.manufacturer.ReadableManufacturer;
+import com.salesmanager.shop.model.catalog.product.ReadableImage;
+import com.salesmanager.shop.model.catalog.product.ReadableProduct;
+import com.salesmanager.shop.model.catalog.product.RentalOwner;
+import com.salesmanager.shop.utils.DateUtil;
+import com.salesmanager.shop.utils.ImageFilePath;
+
+
+
+public class ReadableProductPopulator extends
+ AbstractDataPopulator<Product, ReadableProduct> {
+
+ private PricingService pricingService;
+
+ private ImageFilePath imageUtils;
+
+ public ImageFilePath getimageUtils() {
+ return imageUtils;
+ }
+
+
+
+
+ public void setimageUtils(ImageFilePath imageUtils) {
+ this.imageUtils = imageUtils;
+ }
+
+
+
+
+ public PricingService getPricingService() {
+ return pricingService;
+ }
+
+
+
+
+ public void setPricingService(PricingService pricingService) {
+ this.pricingService = pricingService;
+ }
+
+
+
+
+ @Override
+ public ReadableProduct populate(Product source,
+ ReadableProduct target, MerchantStore store, Language language)
+ throws ConversionException {
+ Validate.notNull(pricingService, "Requires to set PricingService");
+ Validate.notNull(imageUtils, "Requires to set imageUtils");
+ Validate.notNull(language, "Language cannot be null");
+
+ try {
+
+
+ ProductDescription description = source.getProductDescription();
+
+ Set<ProductDescription> descriptions = source.getDescriptions();
+ for(ProductDescription desc : descriptions) {
+
+ if(desc.getLanguage()!=null && desc.getLanguage().getId().intValue() == language.getId().intValue()) {
+ description = desc;
+ break;
+ }
+
+ }
+
+
+ target.setId(source.getId());
+ target.setAvailable(source.isAvailable());
+ target.setProductHeight(source.getProductHeight());
+ target.setProductLength(source.getProductLength());
+ target.setProductWeight(source.getProductWeight());
+ target.setProductWidth(source.getProductWidth());
+ target.setPreOrder(source.isPreOrder());
+ target.setRefSku(source.getRefSku());
+ target.setSortOrder(source.getSortOrder());
+
+
+ target.setCondition(source.getCondition());
+
+
+ //RENTAL
+ if(source.getRentalDuration()!=null) {
+ target.setRentalDuration(source.getRentalDuration());
+ }
+ if(source.getRentalPeriod()!=null) {
+ target.setRentalPeriod(source.getRentalPeriod());
+ }
+ target.setRentalStatus(source.getRentalStatus());
+
+ /**
+ * END RENTAL
+ */
+
+ if(source.getOwner() != null) {
+ RentalOwner owner = new RentalOwner();
+ owner.setId(source.getOwner().getId());
+ owner.setEmailAddress(source.getOwner().getEmailAddress());
+ owner.setFirstName(source.getOwner().getBilling().getFirstName());
+ owner.setLastName(source.getOwner().getBilling().getLastName());
+ com.salesmanager.shop.model.customer.Address address = new com.salesmanager.shop.model.customer.Address();
+ address.setAddress(source.getOwner().getBilling().getAddress());
+ address.setBillingAddress(true);
+ address.setCity(source.getOwner().getBilling().getCity());
+ address.setCompany(source.getOwner().getBilling().getCompany());
+ address.setCountry(source.getOwner().getBilling().getCountry().getIsoCode());
+ address.setZone(source.getOwner().getBilling().getZone().getCode());
+ address.setLatitude(source.getOwner().getBilling().getLatitude());
+ address.setLongitude(source.getOwner().getBilling().getLongitude());
+ address.setPhone(source.getOwner().getBilling().getTelephone());
+ address.setPostalCode(source.getOwner().getBilling().getPostalCode());
+ owner.setAddress(address);
+ target.setOwner(owner);
+ }
+
+
+ if(source.getDateAvailable() != null) {
+ target.setDateAvailable(DateUtil.formatDate(source.getDateAvailable()));
+ }
+
+ if(source.getProductReviewAvg()!=null) {
+ double avg = source.getProductReviewAvg().doubleValue();
+ double rating = Math.round(avg * 2) / 2.0f;
+ target.setRating(rating);
+ }
+ target.setProductVirtual(source.getProductVirtual());
+ if(source.getProductReviewCount()!=null) {
+ target.setRatingCount(source.getProductReviewCount().intValue());
+ }
+ if(description!=null) {
+ com.salesmanager.shop.model.catalog.product.ProductDescription tragetDescription = new com.salesmanager.shop.model.catalog.product.ProductDescription();
+ tragetDescription.setFriendlyUrl(description.getSeUrl());
+ tragetDescription.setName(description.getName());
+ tragetDescription.setId(description.getId());
+ if(!StringUtils.isBlank(description.getMetatagTitle())) {
+ tragetDescription.setTitle(description.getMetatagTitle());
+ } else {
+ tragetDescription.setTitle(description.getName());
+ }
+ tragetDescription.setMetaDescription(description.getMetatagDescription());
+ tragetDescription.setDescription(description.getDescription());
+ tragetDescription.setHighlights(description.getProductHighlight());
+ tragetDescription.setLanguage(description.getLanguage().getCode());
+ target.setDescription(tragetDescription);
+
+ }
+
+ if(source.getManufacturer()!=null) {
+ ManufacturerDescription manufacturer = source.getManufacturer().getDescriptions().iterator().next();
+ ReadableManufacturer manufacturerEntity = new ReadableManufacturer();
+ com.salesmanager.shop.model.catalog.manufacturer.ManufacturerDescription d = new com.salesmanager.shop.model.catalog.manufacturer.ManufacturerDescription();
+ d.setName(manufacturer.getName());
+ manufacturerEntity.setDescription(d);
+ manufacturerEntity.setId(source.getManufacturer().getId());
+ manufacturerEntity.setOrder(source.getManufacturer().getOrder());
+ manufacturerEntity.setCode(source.getManufacturer().getCode());
+ target.setManufacturer(manufacturerEntity);
+ }
+
+ Set<ProductImage> images = source.getImages();
+ if(images!=null && images.size()>0) {
+ List<ReadableImage> imageList = new ArrayList<ReadableImage>();
+
+ String contextPath = imageUtils.getContextPath();
+
+ for(ProductImage img : images) {
+ ReadableImage prdImage = new ReadableImage();
+ prdImage.setImageName(img.getProductImage());
+ prdImage.setDefaultImage(img.isDefaultImage());
+
+ StringBuilder imgPath = new StringBuilder();
+ imgPath.append(contextPath).append(imageUtils.buildProductImageUtils(store, source.getSku(), img.getProductImage()));
+
+ prdImage.setImageUrl(imgPath.toString());
+ prdImage.setId(img.getId());
+ prdImage.setImageType(img.getImageType());
+ if(img.getProductImageUrl()!=null){
+ prdImage.setExternalUrl(img.getProductImageUrl());
+ }
+ if(img.getImageType()==1 && img.getProductImageUrl()!=null) {//video
+ prdImage.setVideoUrl(img.getProductImageUrl());
+ }
+
+ if(prdImage.isDefaultImage()) {
+ target.setImage(prdImage);
+ }
+
+ imageList.add(prdImage);
+ }
+ target
+ .setImages(imageList);
+ }
+
+ if(!CollectionUtils.isEmpty(source.getCategories())) {
+
+ ReadableCategoryPopulator categoryPopulator = new ReadableCategoryPopulator();
+ List<ReadableCategory> categoryList = new ArrayList<ReadableCategory>();
+
+ for(Category category : source.getCategories()) {
+
+ ReadableCategory readableCategory = new ReadableCategory();
+ categoryPopulator.populate(category, readableCategory, store, language);
+ categoryList.add(readableCategory);
+
+ }
+
+ target.setCategories(categoryList);
+
+ }
+
+
+
+ //remove products from invisible category -> set visible = false
+/* Set<Category> categories = source.getCategories();
+ boolean isVisible = true;
+ if(!CollectionUtils.isEmpty(categories)) {
+ for(Category c : categories) {
+ if(c.isVisible()) {
+ isVisible = true;
+ break;
+ } else {
+ isVisible = false;
+ }
+ }
+ }*/
+
+ //target.setVisible(isVisible);
+
+
+ target.setSku(source.getSku());
+
+ FinalPrice price = pricingService.calculateProductPrice(source);
+
+ target.setFinalPrice(pricingService.getDisplayAmount(price.getFinalPrice(), store));
+ target.setPrice(price.getFinalPrice());
+ target.setOriginalPrice(pricingService.getDisplayAmount(price.getOriginalPrice(), store));
+
+ if(price.isDiscounted()) {
+ target.setDiscounted(true);
+ }
+
+ //availability
+ for(ProductAvailability availability : source.getAvailabilities()) {
+ if(availability.getRegion().equals(Constants.ALL_REGIONS)) {//TODO REL 2.1 accept a region
+ target.setQuantity(availability.getProductQuantity());
+ target.setQuantityOrderMaximum(availability.getProductQuantityOrderMax());
+ target.setQuantityOrderMinimum(availability.getProductQuantityOrderMin());
+ if(availability.getProductQuantity().intValue() > 0 && target.isAvailable()) {
+ target.setCanBePurchased(true);
+ }
+ }
+ }
+
+
+ return target;
+
+ } catch (Exception e) {
+ throw new ConversionException(e);
+ }
+ }
+
+
+
+
+ @Override
+ protected ReadableProduct createTarget() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/ReadableProductReviewPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/ReadableProductReviewPopulator.java
index 9cff0f4..94e0108 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/ReadableProductReviewPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/catalog/ReadableProductReviewPopulator.java
@@ -27,6 +27,7 @@ public class ReadableProductReviewPopulator extends
ReadableCustomer customer = new ReadableCustomer();
populator.populate(source.getCustomer(), customer, store, language);
+ target.setId(source.getId());
target.setDate(DateUtil.formatDate(source.getReviewDate()));
target.setCustomer(customer);
target.setRating(source.getReviewRating());
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerBillingAddressPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerBillingAddressPopulator.java
index 4108d5d..841f085 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerBillingAddressPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerBillingAddressPopulator.java
@@ -1,53 +1,53 @@
-/**
- *
- */
-package com.salesmanager.shop.populator.customer;
-
+/**
+ *
+ */
+package com.salesmanager.shop.populator.customer;
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.model.customer.Address;
-
-/**
- * @author csamson
- *
- */
-public class CustomerBillingAddressPopulator extends AbstractDataPopulator<Customer, Address>
-{
-
- @Override
- public Address populate( Customer source, Address target, MerchantStore store, Language language )
- throws ConversionException
- {
-
- target.setCity(source.getBilling().getCity());
- target.setCompany(source.getBilling().getCompany());
- target.setFirstName(source.getBilling().getFirstName());
- target.setLastName(source.getBilling().getLastName());
- target.setPostalCode(source.getBilling().getPostalCode());
- target.setPhone(source.getBilling().getTelephone());
- if(source.getBilling().getTelephone()==null) {
- target.setPhone(source.getBilling().getTelephone());
- }
- target.setAddress(source.getBilling().getAddress());
- if(source.getBilling().getCountry()!=null) {
- target.setCountry(source.getBilling().getCountry().getIsoCode());
- }
- if(source.getBilling().getZone()!=null) {
- target.setZone(source.getBilling().getZone().getCode());
- }
- target.setStateProvince(source.getBilling().getState());
-
- return target;
- }
-
- @Override
- protected Address createTarget()
- {
- return new Address();
- }
-
-}
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.customer.Address;
+
+/**
+ * @author csamson
+ *
+ */
+public class CustomerBillingAddressPopulator extends AbstractDataPopulator<Customer, Address>
+{
+
+ @Override
+ public Address populate( Customer source, Address target, MerchantStore store, Language language )
+ throws ConversionException
+ {
+
+ target.setCity(source.getBilling().getCity());
+ target.setCompany(source.getBilling().getCompany());
+ target.setFirstName(source.getBilling().getFirstName());
+ target.setLastName(source.getBilling().getLastName());
+ target.setPostalCode(source.getBilling().getPostalCode());
+ target.setPhone(source.getBilling().getTelephone());
+ if(source.getBilling().getTelephone()==null) {
+ target.setPhone(source.getBilling().getTelephone());
+ }
+ target.setAddress(source.getBilling().getAddress());
+ if(source.getBilling().getCountry()!=null) {
+ target.setCountry(source.getBilling().getCountry().getIsoCode());
+ }
+ if(source.getBilling().getZone()!=null) {
+ target.setZone(source.getBilling().getZone().getCode());
+ }
+ target.setStateProvince(source.getBilling().getState());
+
+ return target;
+ }
+
+ @Override
+ protected Address createTarget()
+ {
+ return new Address();
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerDeliveryAddressPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerDeliveryAddressPopulator.java
index 587b400..34b7dec 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerDeliveryAddressPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerDeliveryAddressPopulator.java
@@ -1,82 +1,82 @@
-/**
- *
- */
-package com.salesmanager.shop.populator.customer;
-
-import org.apache.commons.lang.StringUtils;
-
+/**
+ *
+ */
+package com.salesmanager.shop.populator.customer;
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.model.customer.Address;
-
-
+import org.apache.commons.lang.StringUtils;
-
-/**
- * @author Admin
- *
- */
-public class CustomerDeliveryAddressPopulator extends AbstractDataPopulator<Customer, Address>
-{
-
- @Override
- public Address populate( Customer source, Address target, MerchantStore store, Language language )
- throws ConversionException
- {
-
- if(source.getDelivery()!=null){
- if(StringUtils.isNotBlank( source.getDelivery().getCity() )){
- target.setCity(source.getDelivery().getCity());
- }
-
- if(StringUtils.isNotBlank( source.getDelivery().getCompany() )){
- target.setCompany(source.getDelivery().getCompany());
- }
-
- if(StringUtils.isNotBlank( source.getDelivery().getAddress() )){
- target.setAddress(source.getDelivery().getAddress());
- }
-
- if(StringUtils.isNotBlank( source.getDelivery().getFirstName() )){
- target.setFirstName(source.getDelivery().getFirstName());
- }
-
- if(StringUtils.isNotBlank( source.getDelivery().getLastName() )){
- target.setLastName(source.getDelivery().getLastName());
- }
-
- if(StringUtils.isNotBlank( source.getDelivery().getPostalCode() )){
- target.setPostalCode(source.getDelivery().getPostalCode());
- }
-
- if(StringUtils.isNotBlank( source.getDelivery().getTelephone() )){
- target.setPhone(source.getDelivery().getTelephone());
- }
-
- target.setStateProvince(source.getDelivery().getState());
-
- if(source.getDelivery().getTelephone()==null) {
- target.setPhone(source.getDelivery().getTelephone());
- }
- target.setAddress(source.getDelivery().getAddress());
- if(source.getDelivery().getCountry()!=null) {
- target.setCountry(source.getDelivery().getCountry().getIsoCode());
- }
- if(source.getDelivery().getZone()!=null) {
- target.setZone(source.getDelivery().getZone().getCode());
- }
- }
- return target;
- }
-
- @Override
- protected Address createTarget()
- {
- return new Address();
- }
-
-}
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.customer.Address;
+
+
+
+
+/**
+ * @author Admin
+ *
+ */
+public class CustomerDeliveryAddressPopulator extends AbstractDataPopulator<Customer, Address>
+{
+
+ @Override
+ public Address populate( Customer source, Address target, MerchantStore store, Language language )
+ throws ConversionException
+ {
+
+ if(source.getDelivery()!=null){
+ if(StringUtils.isNotBlank( source.getDelivery().getCity() )){
+ target.setCity(source.getDelivery().getCity());
+ }
+
+ if(StringUtils.isNotBlank( source.getDelivery().getCompany() )){
+ target.setCompany(source.getDelivery().getCompany());
+ }
+
+ if(StringUtils.isNotBlank( source.getDelivery().getAddress() )){
+ target.setAddress(source.getDelivery().getAddress());
+ }
+
+ if(StringUtils.isNotBlank( source.getDelivery().getFirstName() )){
+ target.setFirstName(source.getDelivery().getFirstName());
+ }
+
+ if(StringUtils.isNotBlank( source.getDelivery().getLastName() )){
+ target.setLastName(source.getDelivery().getLastName());
+ }
+
+ if(StringUtils.isNotBlank( source.getDelivery().getPostalCode() )){
+ target.setPostalCode(source.getDelivery().getPostalCode());
+ }
+
+ if(StringUtils.isNotBlank( source.getDelivery().getTelephone() )){
+ target.setPhone(source.getDelivery().getTelephone());
+ }
+
+ target.setStateProvince(source.getDelivery().getState());
+
+ if(source.getDelivery().getTelephone()==null) {
+ target.setPhone(source.getDelivery().getTelephone());
+ }
+ target.setAddress(source.getDelivery().getAddress());
+ if(source.getDelivery().getCountry()!=null) {
+ target.setCountry(source.getDelivery().getCountry().getIsoCode());
+ }
+ if(source.getDelivery().getZone()!=null) {
+ target.setZone(source.getDelivery().getZone().getCode());
+ }
+ }
+ return target;
+ }
+
+ @Override
+ protected Address createTarget()
+ {
+ return new Address();
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerEntityPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerEntityPopulator.java
index c9b695b..1cb10b6 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerEntityPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerEntityPopulator.java
@@ -1,111 +1,119 @@
-/**
- *
- */
-package com.salesmanager.shop.populator.customer;
-
-import org.apache.commons.lang.StringUtils;
-
-
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.model.customer.Address;
-import com.salesmanager.shop.model.customer.CustomerEntity;
-
-
-
-/**
- * <p>
- * CustomerEntityPopulator will help to populate {@link CustomerEntity} from {@link Customer} CustomerEntity will be
- * used to show data on the UI side.
- * </p>
- *
- * @author Umesh Awasthi
- * @version 1.2
- */
-public class CustomerEntityPopulator
- extends AbstractDataPopulator<Customer, CustomerEntity>
-{
-
- @Override
- public CustomerEntity populate( final Customer source, final CustomerEntity target,
- final MerchantStore merchantStore, final Language language )
- throws ConversionException
- {
- try
- {
-
-
- target.setId( source.getId() );
- if(StringUtils.isNotBlank( source.getEmailAddress() )){
- target.setEmailAddress( source.getEmailAddress() );
- }
-
-
-
- if ( source.getBilling() != null )
- {
- Address address = new Address();
- address.setCity( source.getBilling().getCity() );
- address.setAddress(source.getBilling().getAddress());
- address.setCompany( source.getBilling().getCompany() );
- address.setFirstName( source.getBilling().getFirstName() );
- address.setLastName( source.getBilling().getLastName() );
- address.setPostalCode( source.getBilling().getPostalCode() );
- address.setPhone( source.getBilling().getTelephone() );
- if ( source.getBilling().getCountry() != null )
- {
- address.setCountry( source.getBilling().getCountry().getIsoCode() );
- }
- if ( source.getBilling().getZone() != null )
- {
- address.setZone( source.getBilling().getZone().getCode() );
- }
-
- address.setStateProvince(source.getBilling().getState());
-
- target.setBilling( address );
- }
-
- if ( source.getDelivery() != null )
- {
- Address address = new Address();
- address.setCity( source.getDelivery().getCity() );
- address.setAddress(source.getDelivery().getAddress());
- address.setCompany( source.getDelivery().getCompany() );
- address.setFirstName( source.getDelivery().getFirstName() );
- address.setLastName( source.getDelivery().getLastName() );
- address.setPostalCode( source.getDelivery().getPostalCode() );
- address.setPhone( source.getDelivery().getTelephone() );
- if ( source.getDelivery().getCountry() != null )
- {
- address.setCountry( source.getDelivery().getCountry().getIsoCode() );
- }
- if ( source.getDelivery().getZone() != null )
- {
- address.setZone( source.getDelivery().getZone().getCode() );
- }
-
- address.setStateProvince(source.getDelivery().getState());
-
- target.setDelivery( address );
- }
-
- }
- catch ( Exception e )
- {
- throw new ConversionException( e );
- }
-
- return target;
- }
-
- @Override
- protected CustomerEntity createTarget()
- {
- return new CustomerEntity();
- }
-
-}
+/**
+ *
+ */
+package com.salesmanager.shop.populator.customer;
+
+import org.apache.commons.lang.StringUtils;
+
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.customer.Address;
+import com.salesmanager.shop.model.customer.CustomerEntity;
+
+
+
+/**
+ * <p>
+ * CustomerEntityPopulator will help to populate {@link CustomerEntity} from {@link Customer} CustomerEntity will be
+ * used to show data on the UI side.
+ * </p>
+ *
+ * @author Umesh Awasthi
+ * @version 1.2
+ */
+public class CustomerEntityPopulator
+ extends AbstractDataPopulator<Customer, CustomerEntity>
+{
+
+ @Override
+ public CustomerEntity populate( final Customer source, final CustomerEntity target,
+ final MerchantStore merchantStore, final Language language )
+ throws ConversionException
+ {
+ try
+ {
+
+
+ target.setId( source.getId() );
+ if(StringUtils.isNotBlank( source.getEmailAddress() )){
+ target.setEmailAddress( source.getEmailAddress() );
+ }
+
+
+
+ if ( source.getBilling() != null )
+ {
+ Address address = new Address();
+ address.setCity( source.getBilling().getCity() );
+ address.setAddress(source.getBilling().getAddress());
+ address.setCompany( source.getBilling().getCompany() );
+ address.setFirstName( source.getBilling().getFirstName() );
+ address.setLastName( source.getBilling().getLastName() );
+ address.setPostalCode( source.getBilling().getPostalCode() );
+ address.setPhone( source.getBilling().getTelephone() );
+ if ( source.getBilling().getCountry() != null )
+ {
+ address.setCountry( source.getBilling().getCountry().getIsoCode() );
+ }
+ if ( source.getBilling().getZone() != null )
+ {
+ address.setZone( source.getBilling().getZone().getCode() );
+ }
+
+ address.setStateProvince(source.getBilling().getState());
+
+ target.setBilling( address );
+ }
+
+ if(source.getCustomerReviewAvg() != null) {
+ target.setRating(source.getCustomerReviewAvg().doubleValue());
+ }
+
+ if(source.getCustomerReviewCount() != null) {
+ target.setRatingCount(source.getCustomerReviewCount().intValue());
+ }
+
+ if ( source.getDelivery() != null )
+ {
+ Address address = new Address();
+ address.setCity( source.getDelivery().getCity() );
+ address.setAddress(source.getDelivery().getAddress());
+ address.setCompany( source.getDelivery().getCompany() );
+ address.setFirstName( source.getDelivery().getFirstName() );
+ address.setLastName( source.getDelivery().getLastName() );
+ address.setPostalCode( source.getDelivery().getPostalCode() );
+ address.setPhone( source.getDelivery().getTelephone() );
+ if ( source.getDelivery().getCountry() != null )
+ {
+ address.setCountry( source.getDelivery().getCountry().getIsoCode() );
+ }
+ if ( source.getDelivery().getZone() != null )
+ {
+ address.setZone( source.getDelivery().getZone().getCode() );
+ }
+
+ address.setStateProvince(source.getDelivery().getState());
+
+ target.setDelivery( address );
+ }
+
+ }
+ catch ( Exception e )
+ {
+ throw new ConversionException( e );
+ }
+
+ return target;
+ }
+
+ @Override
+ protected CustomerEntity createTarget()
+ {
+ return new CustomerEntity();
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerOptionPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerOptionPopulator.java
index 87cda5f..e691089 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerOptionPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerOptionPopulator.java
@@ -1,78 +1,78 @@
-package com.salesmanager.shop.populator.customer;
-
-
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.core.model.customer.attribute.CustomerOptionSet;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.admin.model.customer.attribute.CustomerOption;
-import com.salesmanager.shop.admin.model.customer.attribute.CustomerOptionValue;
-
-
-import java.util.ArrayList;
-import java.util.List;
-
-
-
-/**
- * Used in the admin section
- * @author c.samson
- *
- */
-
-public class CustomerOptionPopulator extends
- AbstractDataPopulator<com.salesmanager.core.model.customer.attribute.CustomerOption, com.salesmanager.shop.admin.model.customer.attribute.CustomerOption> {
-
-
- private CustomerOptionSet optionSet;
-
- public CustomerOptionSet getOptionSet() {
- return optionSet;
- }
-
- public void setOptionSet(CustomerOptionSet optionSet) {
- this.optionSet = optionSet;
- }
-
- @Override
- public CustomerOption populate(
- com.salesmanager.core.model.customer.attribute.CustomerOption source,
- CustomerOption target, MerchantStore store, Language language) throws ConversionException {
-
-
- CustomerOption customerOption = target;
- if(customerOption==null) {
- customerOption = new CustomerOption();
- }
-
- customerOption.setId(source.getId());
- customerOption.setType(source.getCustomerOptionType());
- customerOption.setName(source.getDescriptionsSettoList().get(0).getName());
-
- List<CustomerOptionValue> values = customerOption.getAvailableValues();
- if(values==null) {
- values = new ArrayList<CustomerOptionValue>();
- customerOption.setAvailableValues(values);
- }
-
- com.salesmanager.core.model.customer.attribute.CustomerOptionValue optionValue = optionSet.getCustomerOptionValue();
- CustomerOptionValue custOptValue = new CustomerOptionValue();
- custOptValue.setId(optionValue.getId());
- custOptValue.setLanguage(language.getCode());
- custOptValue.setName(optionValue.getDescriptionsSettoList().get(0).getName());
- values.add(custOptValue);
-
- return customerOption;
-
- }
-
- @Override
- protected CustomerOption createTarget()
- {
- // TODO Auto-generated method stub
- return null;
- }
-
-
-}
+package com.salesmanager.shop.populator.customer;
+
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.customer.attribute.CustomerOptionSet;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.admin.model.customer.attribute.CustomerOption;
+import com.salesmanager.shop.admin.model.customer.attribute.CustomerOptionValue;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+
+/**
+ * Used in the admin section
+ * @author c.samson
+ *
+ */
+
+public class CustomerOptionPopulator extends
+ AbstractDataPopulator<com.salesmanager.core.model.customer.attribute.CustomerOption, com.salesmanager.shop.admin.model.customer.attribute.CustomerOption> {
+
+
+ private CustomerOptionSet optionSet;
+
+ public CustomerOptionSet getOptionSet() {
+ return optionSet;
+ }
+
+ public void setOptionSet(CustomerOptionSet optionSet) {
+ this.optionSet = optionSet;
+ }
+
+ @Override
+ public CustomerOption populate(
+ com.salesmanager.core.model.customer.attribute.CustomerOption source,
+ CustomerOption target, MerchantStore store, Language language) throws ConversionException {
+
+
+ CustomerOption customerOption = target;
+ if(customerOption==null) {
+ customerOption = new CustomerOption();
+ }
+
+ customerOption.setId(source.getId());
+ customerOption.setType(source.getCustomerOptionType());
+ customerOption.setName(source.getDescriptionsSettoList().get(0).getName());
+
+ List<CustomerOptionValue> values = customerOption.getAvailableValues();
+ if(values==null) {
+ values = new ArrayList<CustomerOptionValue>();
+ customerOption.setAvailableValues(values);
+ }
+
+ com.salesmanager.core.model.customer.attribute.CustomerOptionValue optionValue = optionSet.getCustomerOptionValue();
+ CustomerOptionValue custOptValue = new CustomerOptionValue();
+ custOptValue.setId(optionValue.getId());
+ custOptValue.setLanguage(language.getCode());
+ custOptValue.setName(optionValue.getDescriptionsSettoList().get(0).getName());
+ values.add(custOptValue);
+
+ return customerOption;
+
+ }
+
+ @Override
+ protected CustomerOption createTarget()
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerPopulator.java
index 38047a3..b69ba00 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/CustomerPopulator.java
@@ -1,272 +1,295 @@
-package com.salesmanager.shop.populator.customer;
+package com.salesmanager.shop.populator.customer;
-
-import java.util.Map;
-
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.services.customer.attribute.CustomerOptionService;
-import com.salesmanager.core.business.services.customer.attribute.CustomerOptionValueService;
-import com.salesmanager.core.business.services.reference.country.CountryService;
-import com.salesmanager.core.business.services.reference.language.LanguageService;
-import com.salesmanager.core.business.services.reference.zone.ZoneService;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.core.model.common.Billing;
-import com.salesmanager.core.model.common.Delivery;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.customer.attribute.CustomerAttribute;
-import com.salesmanager.core.model.customer.attribute.CustomerOption;
-import com.salesmanager.core.model.customer.attribute.CustomerOptionValue;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.reference.zone.Zone;
-import com.salesmanager.shop.model.customer.Address;
-import com.salesmanager.shop.model.customer.PersistableCustomer;
-import com.salesmanager.shop.model.customer.attribute.PersistableCustomerAttribute;
-import org.apache.commons.lang.Validate;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class CustomerPopulator extends
- AbstractDataPopulator<PersistableCustomer, Customer> {
-
- protected static final Logger LOG=LoggerFactory.getLogger( CustomerPopulator.class );
- private CountryService countryService;
- private ZoneService zoneService;
- private LanguageService languageService;
-
- private CustomerOptionService customerOptionService;
- private CustomerOptionValueService customerOptionValueService;
-
-
- /**
- * Creates a Customer entity ready to be saved
- */
- @Override
- public Customer populate(PersistableCustomer source, Customer target,
- MerchantStore store, Language language) throws ConversionException {
-
- Validate.notNull(customerOptionService, "Requires to set CustomerOptionService");
- Validate.notNull(customerOptionValueService, "Requires to set CustomerOptionValueService");
- Validate.notNull(zoneService, "Requires to set ZoneService");
- Validate.notNull(countryService, "Requires to set CountryService");
- Validate.notNull(languageService, "Requires to set LanguageService");
-
- try {
-
- if(source.getId() !=null && source.getId()>0){
- target.setId( source.getId() );
- }
-
-
- if(!StringUtils.isBlank(source.getEncodedPassword())) {
- target.setPassword(source.getEncodedPassword());
- target.setAnonymous(false);
- }
-
- target.setEmailAddress(source.getEmailAddress());
- target.setNick(source.getUserName());
- if(source.getGender()!=null && target.getGender()==null) {
- target.setGender( com.salesmanager.core.model.customer.CustomerGender.valueOf( source.getGender() ) );
- }
- if(target.getGender()==null) {
- target.setGender( com.salesmanager.core.model.customer.CustomerGender.M);
- }
-
- Map<String,Country> countries = countryService.getCountriesMap(language);
- Map<String,Zone> zones = zoneService.getZones(language);
-
- target.setMerchantStore( store );
-
- Address sourceBilling = source.getBilling();
- if(sourceBilling!=null) {
- Billing billing = new Billing();
- billing.setAddress(sourceBilling.getAddress());
- billing.setCity(sourceBilling.getCity());
- billing.setCompany(sourceBilling.getCompany());
- //billing.setCountry(country);
- billing.setFirstName(sourceBilling.getFirstName());
- billing.setLastName(sourceBilling.getLastName());
- billing.setTelephone(sourceBilling.getPhone());
- billing.setPostalCode(sourceBilling.getPostalCode());
- billing.setState(sourceBilling.getStateProvince());
- Country billingCountry = null;
- if(!StringUtils.isBlank(sourceBilling.getCountry())) {
- billingCountry = countries.get(sourceBilling.getCountry());
- if(billingCountry==null) {
- throw new ConversionException("Unsuported country code " + sourceBilling.getCountry());
- }
- billing.setCountry(billingCountry);
- }
-
- if(billingCountry!=null && !StringUtils.isBlank(sourceBilling.getZone())) {
- Zone zone = zoneService.getByCode(sourceBilling.getZone());
- if(zone==null) {
- throw new ConversionException("Unsuported zone code " + sourceBilling.getZone());
- }
- Zone zoneDescription = zones.get(zone.getCode());
- billing.setZone(zoneDescription);
- }
- target.setBilling(billing);
-
- }
- if(target.getBilling() ==null && source.getBilling()!=null){
- LOG.info( "Setting default values for billing" );
- Billing billing = new Billing();
- Country billingCountry = null;
- if(StringUtils.isNotBlank( source.getBilling().getCountry() )) {
- billingCountry = countries.get(source.getBilling().getCountry());
- if(billingCountry==null) {
- throw new ConversionException("Unsuported country code " + sourceBilling.getCountry());
- }
- billing.setCountry(billingCountry);
- target.setBilling( billing );
- }
- }
- Address sourceShipping = source.getDelivery();
- if(sourceShipping!=null) {
- Delivery delivery = new Delivery();
- delivery.setAddress(sourceShipping.getAddress());
- delivery.setCity(sourceShipping.getCity());
- delivery.setCompany(sourceShipping.getCompany());
- delivery.setFirstName(sourceShipping.getFirstName());
- delivery.setLastName(sourceShipping.getLastName());
- delivery.setTelephone(sourceShipping.getPhone());
- delivery.setPostalCode(sourceShipping.getPostalCode());
- delivery.setState(sourceShipping.getStateProvince());
- Country deliveryCountry = null;
-
-
-
- if(!StringUtils.isBlank(sourceShipping.getCountry())) {
- deliveryCountry = countries.get(sourceShipping.getCountry());
- if(deliveryCountry==null) {
- throw new ConversionException("Unsuported country code " + sourceShipping.getCountry());
- }
- delivery.setCountry(deliveryCountry);
- }
-
- if(deliveryCountry!=null && !StringUtils.isBlank(sourceShipping.getZone())) {
- Zone zone = zoneService.getByCode(sourceShipping.getZone());
- if(zone==null) {
- throw new ConversionException("Unsuported zone code " + sourceShipping.getZone());
- }
- Zone zoneDescription = zones.get(zone.getCode());
- delivery.setZone(zoneDescription);
- }
- target.setDelivery(delivery);
- }
-
- if(target.getDelivery() ==null && source.getDelivery()!=null){
- LOG.info( "Setting default value for delivery" );
- Delivery delivery = new Delivery();
- Country deliveryCountry = null;
- if(StringUtils.isNotBlank( source.getDelivery().getCountry() )) {
- deliveryCountry = countries.get(source.getDelivery().getCountry());
- if(deliveryCountry==null) {
- throw new ConversionException("Unsuported country code " + sourceShipping.getCountry());
- }
- delivery.setCountry(deliveryCountry);
- target.setDelivery( delivery );
- }
- }
-
- if(source.getAttributes()!=null) {
- for(PersistableCustomerAttribute attr : source.getAttributes()) {
-
- CustomerOption customerOption = customerOptionService.getById(attr.getCustomerOption().getId());
- if(customerOption==null) {
- throw new ConversionException("Customer option id " + attr.getCustomerOption().getId() + " does not exist");
- }
-
- CustomerOptionValue customerOptionValue = customerOptionValueService.getById(attr.getCustomerOptionValue().getId());
- if(customerOptionValue==null) {
- throw new ConversionException("Customer option value id " + attr.getCustomerOptionValue().getId() + " does not exist");
- }
-
- if(customerOption.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- throw new ConversionException("Invalid customer option id ");
- }
-
- if(customerOptionValue.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- throw new ConversionException("Invalid customer option value id ");
- }
-
- CustomerAttribute attribute = new CustomerAttribute();
- attribute.setCustomer(target);
- attribute.setCustomerOption(customerOption);
- attribute.setCustomerOptionValue(customerOptionValue);
- attribute.setTextValue(attr.getTextValue());
-
- target.getAttributes().add(attribute);
-
- }
- }
-
- if(target.getDefaultLanguage()==null) {
- Language lang = languageService.getByCode(source.getLanguage());
- if(lang==null) {
- lang = store.getDefaultLanguage();
- }
-
- target.setDefaultLanguage(lang);
- }
-
-
- } catch (Exception e) {
- throw new ConversionException(e);
- }
-
-
-
-
- return target;
- }
-
- @Override
- protected Customer createTarget() {
- return new Customer();
- }
-
- public void setCustomerOptionService(CustomerOptionService customerOptionService) {
- this.customerOptionService = customerOptionService;
- }
-
- public CustomerOptionService getCustomerOptionService() {
- return customerOptionService;
- }
-
- public void setCustomerOptionValueService(CustomerOptionValueService customerOptionValueService) {
- this.customerOptionValueService = customerOptionValueService;
- }
-
- public CustomerOptionValueService getCustomerOptionValueService() {
- return customerOptionValueService;
- }
-
- public CountryService getCountryService() {
- return countryService;
- }
-
- public void setCountryService(CountryService countryService) {
- this.countryService = countryService;
- }
-
- public ZoneService getZoneService() {
- return zoneService;
- }
-
- public void setZoneService(ZoneService zoneService) {
- this.zoneService = zoneService;
- }
-
- public LanguageService getLanguageService() {
- return languageService;
- }
-
- public void setLanguageService(LanguageService languageService) {
- this.languageService = languageService;
- }
-
-}
+
+import java.math.BigDecimal;
+import java.util.Map;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.services.customer.attribute.CustomerOptionService;
+import com.salesmanager.core.business.services.customer.attribute.CustomerOptionValueService;
+import com.salesmanager.core.business.services.reference.country.CountryService;
+import com.salesmanager.core.business.services.reference.language.LanguageService;
+import com.salesmanager.core.business.services.reference.zone.ZoneService;
+import com.salesmanager.core.business.services.user.GroupService;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.common.Billing;
+import com.salesmanager.core.model.common.Delivery;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.customer.attribute.CustomerAttribute;
+import com.salesmanager.core.model.customer.attribute.CustomerOption;
+import com.salesmanager.core.model.customer.attribute.CustomerOptionValue;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.reference.zone.Zone;
+import com.salesmanager.shop.model.customer.Address;
+import com.salesmanager.shop.model.customer.PersistableCustomer;
+import com.salesmanager.shop.model.customer.attribute.PersistableCustomerAttribute;
+import org.apache.commons.lang.Validate;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CustomerPopulator extends
+ AbstractDataPopulator<PersistableCustomer, Customer> {
+
+ protected static final Logger LOG=LoggerFactory.getLogger( CustomerPopulator.class );
+ private CountryService countryService;
+ private ZoneService zoneService;
+ private LanguageService languageService;
+
+ private CustomerOptionService customerOptionService;
+ private CustomerOptionValueService customerOptionValueService;
+ private GroupService groupService;
+
+
+
+
+ /**
+ * Creates a Customer entity ready to be saved
+ */
+ @Override
+ public Customer populate(PersistableCustomer source, Customer target,
+ MerchantStore store, Language language) throws ConversionException {
+
+ Validate.notNull(customerOptionService, "Requires to set CustomerOptionService");
+ Validate.notNull(customerOptionValueService, "Requires to set CustomerOptionValueService");
+ Validate.notNull(zoneService, "Requires to set ZoneService");
+ Validate.notNull(countryService, "Requires to set CountryService");
+ Validate.notNull(languageService, "Requires to set LanguageService");
+ Validate.notNull(groupService, "Requires to set GroupService");
+
+ try {
+
+ if(source.getId() !=null && source.getId()>0){
+ target.setId( source.getId() );
+ }
+
+
+ if(!StringUtils.isBlank(source.getEncodedPassword())) {
+ target.setPassword(source.getEncodedPassword());
+ target.setAnonymous(false);
+ }
+
+ target.setProvider(source.getProvider());
+
+ target.setEmailAddress(source.getEmailAddress());
+ target.setNick(source.getUserName());
+ if(source.getGender()!=null && target.getGender()==null) {
+ target.setGender( com.salesmanager.core.model.customer.CustomerGender.valueOf( source.getGender() ) );
+ }
+ if(target.getGender()==null) {
+ target.setGender( com.salesmanager.core.model.customer.CustomerGender.M);
+ }
+
+ Map<String,Country> countries = countryService.getCountriesMap(language);
+ Map<String,Zone> zones = zoneService.getZones(language);
+
+ target.setMerchantStore( store );
+
+ Address sourceBilling = source.getBilling();
+ if(sourceBilling!=null) {
+ Billing billing = new Billing();
+ billing.setAddress(sourceBilling.getAddress());
+ billing.setCity(sourceBilling.getCity());
+ billing.setCompany(sourceBilling.getCompany());
+ //billing.setCountry(country);
+ billing.setFirstName(sourceBilling.getFirstName());
+ billing.setLastName(sourceBilling.getLastName());
+ billing.setTelephone(sourceBilling.getPhone());
+ billing.setPostalCode(sourceBilling.getPostalCode());
+ billing.setState(sourceBilling.getStateProvince());
+ Country billingCountry = null;
+ if(!StringUtils.isBlank(sourceBilling.getCountry())) {
+ billingCountry = countries.get(sourceBilling.getCountry());
+ if(billingCountry==null) {
+ throw new ConversionException("Unsuported country code " + sourceBilling.getCountry());
+ }
+ billing.setCountry(billingCountry);
+ }
+
+ if(billingCountry!=null && !StringUtils.isBlank(sourceBilling.getZone())) {
+ Zone zone = zoneService.getByCode(sourceBilling.getZone());
+ if(zone==null) {
+ throw new ConversionException("Unsuported zone code " + sourceBilling.getZone());
+ }
+ Zone zoneDescription = zones.get(zone.getCode());
+ billing.setZone(zoneDescription);
+ }
+ target.setBilling(billing);
+
+ }
+ if(target.getBilling() ==null && source.getBilling()!=null){
+ LOG.info( "Setting default values for billing" );
+ Billing billing = new Billing();
+ Country billingCountry = null;
+ if(StringUtils.isNotBlank( source.getBilling().getCountry() )) {
+ billingCountry = countries.get(source.getBilling().getCountry());
+ if(billingCountry==null) {
+ throw new ConversionException("Unsuported country code " + sourceBilling.getCountry());
+ }
+ billing.setCountry(billingCountry);
+ target.setBilling( billing );
+ }
+ }
+ Address sourceShipping = source.getDelivery();
+ if(sourceShipping!=null) {
+ Delivery delivery = new Delivery();
+ delivery.setAddress(sourceShipping.getAddress());
+ delivery.setCity(sourceShipping.getCity());
+ delivery.setCompany(sourceShipping.getCompany());
+ delivery.setFirstName(sourceShipping.getFirstName());
+ delivery.setLastName(sourceShipping.getLastName());
+ delivery.setTelephone(sourceShipping.getPhone());
+ delivery.setPostalCode(sourceShipping.getPostalCode());
+ delivery.setState(sourceShipping.getStateProvince());
+ Country deliveryCountry = null;
+
+
+
+ if(!StringUtils.isBlank(sourceShipping.getCountry())) {
+ deliveryCountry = countries.get(sourceShipping.getCountry());
+ if(deliveryCountry==null) {
+ throw new ConversionException("Unsuported country code " + sourceShipping.getCountry());
+ }
+ delivery.setCountry(deliveryCountry);
+ }
+
+ if(deliveryCountry!=null && !StringUtils.isBlank(sourceShipping.getZone())) {
+ Zone zone = zoneService.getByCode(sourceShipping.getZone());
+ if(zone==null) {
+ throw new ConversionException("Unsuported zone code " + sourceShipping.getZone());
+ }
+ Zone zoneDescription = zones.get(zone.getCode());
+ delivery.setZone(zoneDescription);
+ }
+ target.setDelivery(delivery);
+ }
+
+ if(source.getRating() != null) {
+ target.setCustomerReviewAvg(new BigDecimal(source.getRating().doubleValue()));
+ }
+
+ target.setCustomerReviewCount(source.getRatingCount());
+
+
+ if(target.getDelivery() ==null && source.getDelivery()!=null){
+ LOG.info( "Setting default value for delivery" );
+ Delivery delivery = new Delivery();
+ Country deliveryCountry = null;
+ if(StringUtils.isNotBlank( source.getDelivery().getCountry() )) {
+ deliveryCountry = countries.get(source.getDelivery().getCountry());
+ if(deliveryCountry==null) {
+ throw new ConversionException("Unsuported country code " + sourceShipping.getCountry());
+ }
+ delivery.setCountry(deliveryCountry);
+ target.setDelivery( delivery );
+ }
+ }
+
+ if(source.getAttributes()!=null) {
+ for(PersistableCustomerAttribute attr : source.getAttributes()) {
+
+ CustomerOption customerOption = customerOptionService.getById(attr.getCustomerOption().getId());
+ if(customerOption==null) {
+ throw new ConversionException("Customer option id " + attr.getCustomerOption().getId() + " does not exist");
+ }
+
+ CustomerOptionValue customerOptionValue = customerOptionValueService.getById(attr.getCustomerOptionValue().getId());
+ if(customerOptionValue==null) {
+ throw new ConversionException("Customer option value id " + attr.getCustomerOptionValue().getId() + " does not exist");
+ }
+
+ if(customerOption.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ throw new ConversionException("Invalid customer option id ");
+ }
+
+ if(customerOptionValue.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ throw new ConversionException("Invalid customer option value id ");
+ }
+
+ CustomerAttribute attribute = new CustomerAttribute();
+ attribute.setCustomer(target);
+ attribute.setCustomerOption(customerOption);
+ attribute.setCustomerOptionValue(customerOptionValue);
+ attribute.setTextValue(attr.getTextValue());
+
+ target.getAttributes().add(attribute);
+
+ }
+ }
+
+ if(target.getDefaultLanguage()==null) {
+ Language lang = languageService.getByCode(source.getLanguage());
+ if(lang==null) {
+ lang = store.getDefaultLanguage();
+ }
+
+ target.setDefaultLanguage(lang);
+ }
+
+
+ } catch (Exception e) {
+ throw new ConversionException(e);
+ }
+
+
+
+
+ return target;
+ }
+
+ @Override
+ protected Customer createTarget() {
+ return new Customer();
+ }
+
+ public void setCustomerOptionService(CustomerOptionService customerOptionService) {
+ this.customerOptionService = customerOptionService;
+ }
+
+ public CustomerOptionService getCustomerOptionService() {
+ return customerOptionService;
+ }
+
+ public void setCustomerOptionValueService(CustomerOptionValueService customerOptionValueService) {
+ this.customerOptionValueService = customerOptionValueService;
+ }
+
+ public CustomerOptionValueService getCustomerOptionValueService() {
+ return customerOptionValueService;
+ }
+
+ public CountryService getCountryService() {
+ return countryService;
+ }
+
+ public void setCountryService(CountryService countryService) {
+ this.countryService = countryService;
+ }
+
+ public ZoneService getZoneService() {
+ return zoneService;
+ }
+
+ public void setZoneService(ZoneService zoneService) {
+ this.zoneService = zoneService;
+ }
+
+ public LanguageService getLanguageService() {
+ return languageService;
+ }
+
+ public void setLanguageService(LanguageService languageService) {
+ this.languageService = languageService;
+ }
+
+ public GroupService getGroupService() {
+ return groupService;
+ }
+
+ public void setGroupService(GroupService groupService) {
+ this.groupService = groupService;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerBillingAddressPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerBillingAddressPopulator.java
index cfaaf23..fc5b2af 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerBillingAddressPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerBillingAddressPopulator.java
@@ -1,62 +1,62 @@
-package com.salesmanager.shop.populator.customer;
-
-import org.apache.commons.lang.StringUtils;
-
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.shop.model.customer.Address;
-
-public class PersistableCustomerBillingAddressPopulator extends AbstractDataPopulator<Address, Customer>
-{
-
- @Override
- public Customer populate( Address source, Customer target, MerchantStore store, Language language )
- throws ConversionException
- {
-
-
- target.getBilling().setFirstName( source.getFirstName() );
- target.getBilling().setLastName( source.getLastName() );
-
- // lets fill optional data now
-
- if(StringUtils.isNotBlank( source.getAddress())){
- target.getBilling().setAddress( source.getAddress() );
- }
-
- if(StringUtils.isNotBlank( source.getCity())){
- target.getBilling().setCity( source.getCity() );
- }
-
- if(StringUtils.isNotBlank( source.getCompany())){
- target.getBilling().setCompany( source.getCompany() );
- }
-
- if(StringUtils.isNotBlank( source.getPhone())){
- target.getBilling().setTelephone( source.getPhone());
- }
-
- if(StringUtils.isNotBlank( source.getPostalCode())){
- target.getBilling().setPostalCode( source.getPostalCode());
- }
-
- if(StringUtils.isNotBlank( source.getStateProvince())){
- target.getBilling().setState(source.getStateProvince());
- }
-
- return target;
-
- }
-
- @Override
- protected Customer createTarget()
- {
- return null;
- }
-
-
-
-}
+package com.salesmanager.shop.populator.customer;
+
+import org.apache.commons.lang.StringUtils;
+
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.shop.model.customer.Address;
+
+public class PersistableCustomerBillingAddressPopulator extends AbstractDataPopulator<Address, Customer>
+{
+
+ @Override
+ public Customer populate( Address source, Customer target, MerchantStore store, Language language )
+ throws ConversionException
+ {
+
+
+ target.getBilling().setFirstName( source.getFirstName() );
+ target.getBilling().setLastName( source.getLastName() );
+
+ // lets fill optional data now
+
+ if(StringUtils.isNotBlank( source.getAddress())){
+ target.getBilling().setAddress( source.getAddress() );
+ }
+
+ if(StringUtils.isNotBlank( source.getCity())){
+ target.getBilling().setCity( source.getCity() );
+ }
+
+ if(StringUtils.isNotBlank( source.getCompany())){
+ target.getBilling().setCompany( source.getCompany() );
+ }
+
+ if(StringUtils.isNotBlank( source.getPhone())){
+ target.getBilling().setTelephone( source.getPhone());
+ }
+
+ if(StringUtils.isNotBlank( source.getPostalCode())){
+ target.getBilling().setPostalCode( source.getPostalCode());
+ }
+
+ if(StringUtils.isNotBlank( source.getStateProvince())){
+ target.getBilling().setState(source.getStateProvince());
+ }
+
+ return target;
+
+ }
+
+ @Override
+ protected Customer createTarget()
+ {
+ return null;
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerOptionPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerOptionPopulator.java
index 4aa83ca..bcf151f 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerOptionPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerOptionPopulator.java
@@ -1,81 +1,81 @@
-package com.salesmanager.shop.populator.customer;
-
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.services.reference.language.LanguageService;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.core.model.customer.attribute.CustomerOption;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.model.customer.attribute.CustomerOptionDescription;
-import com.salesmanager.shop.model.customer.attribute.PersistableCustomerOption;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.Validate;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.HashSet;
-import java.util.Set;
-
-public class PersistableCustomerOptionPopulator extends
- AbstractDataPopulator<PersistableCustomerOption, CustomerOption> {
-
-
- private LanguageService languageService;
-
- @Override
- public CustomerOption populate(PersistableCustomerOption source,
- CustomerOption target, MerchantStore store, Language language)
- throws ConversionException {
-
-
- Validate.notNull(languageService, "Requires to set LanguageService");
-
-
- try {
-
- target.setCode(source.getCode());
- target.setMerchantStore(store);
- target.setSortOrder(source.getOrder());
- if(!StringUtils.isBlank(source.getType())) {
- target.setCustomerOptionType(source.getType());
- } else {
- target.setCustomerOptionType("TEXT");
- }
- target.setPublicOption(true);
-
- if(!CollectionUtils.isEmpty(source.getDescriptions())) {
- Set<com.salesmanager.core.model.customer.attribute.CustomerOptionDescription> descriptions = new HashSet<com.salesmanager.core.model.customer.attribute.CustomerOptionDescription>();
- for(CustomerOptionDescription desc : source.getDescriptions()) {
- com.salesmanager.core.model.customer.attribute.CustomerOptionDescription description = new com.salesmanager.core.model.customer.attribute.CustomerOptionDescription();
- Language lang = languageService.getByCode(desc.getLanguage());
- if(lang==null) {
- throw new ConversionException("Language is null for code " + description.getLanguage() + " use language ISO code [en, fr ...]");
- }
- description.setLanguage(lang);
- description.setName(desc.getName());
- description.setTitle(desc.getTitle());
- description.setCustomerOption(target);
- descriptions.add(description);
- }
- target.setDescriptions(descriptions);
- }
-
- } catch (Exception e) {
- throw new ConversionException(e);
- }
- return target;
- }
-
- @Override
- protected CustomerOption createTarget() {
- return null;
- }
-
- public void setLanguageService(LanguageService languageService) {
- this.languageService = languageService;
- }
-
- public LanguageService getLanguageService() {
- return languageService;
- }
-
-}
+package com.salesmanager.shop.populator.customer;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.services.reference.language.LanguageService;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.customer.attribute.CustomerOption;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.customer.attribute.CustomerOptionDescription;
+import com.salesmanager.shop.model.customer.attribute.PersistableCustomerOption;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.Validate;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class PersistableCustomerOptionPopulator extends
+ AbstractDataPopulator<PersistableCustomerOption, CustomerOption> {
+
+
+ private LanguageService languageService;
+
+ @Override
+ public CustomerOption populate(PersistableCustomerOption source,
+ CustomerOption target, MerchantStore store, Language language)
+ throws ConversionException {
+
+
+ Validate.notNull(languageService, "Requires to set LanguageService");
+
+
+ try {
+
+ target.setCode(source.getCode());
+ target.setMerchantStore(store);
+ target.setSortOrder(source.getOrder());
+ if(!StringUtils.isBlank(source.getType())) {
+ target.setCustomerOptionType(source.getType());
+ } else {
+ target.setCustomerOptionType("TEXT");
+ }
+ target.setPublicOption(true);
+
+ if(!CollectionUtils.isEmpty(source.getDescriptions())) {
+ Set<com.salesmanager.core.model.customer.attribute.CustomerOptionDescription> descriptions = new HashSet<com.salesmanager.core.model.customer.attribute.CustomerOptionDescription>();
+ for(CustomerOptionDescription desc : source.getDescriptions()) {
+ com.salesmanager.core.model.customer.attribute.CustomerOptionDescription description = new com.salesmanager.core.model.customer.attribute.CustomerOptionDescription();
+ Language lang = languageService.getByCode(desc.getLanguage());
+ if(lang==null) {
+ throw new ConversionException("Language is null for code " + description.getLanguage() + " use language ISO code [en, fr ...]");
+ }
+ description.setLanguage(lang);
+ description.setName(desc.getName());
+ description.setTitle(desc.getTitle());
+ description.setCustomerOption(target);
+ descriptions.add(description);
+ }
+ target.setDescriptions(descriptions);
+ }
+
+ } catch (Exception e) {
+ throw new ConversionException(e);
+ }
+ return target;
+ }
+
+ @Override
+ protected CustomerOption createTarget() {
+ return null;
+ }
+
+ public void setLanguageService(LanguageService languageService) {
+ this.languageService = languageService;
+ }
+
+ public LanguageService getLanguageService() {
+ return languageService;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerOptionValuePopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerOptionValuePopulator.java
index 6d57d0f..23ac701 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerOptionValuePopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerOptionValuePopulator.java
@@ -1,74 +1,74 @@
-package com.salesmanager.shop.populator.customer;
-
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.services.reference.language.LanguageService;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.core.model.customer.attribute.CustomerOptionValue;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.model.customer.attribute.CustomerOptionValueDescription;
-import com.salesmanager.shop.model.customer.attribute.PersistableCustomerOptionValue;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.Validate;
-
-import java.util.HashSet;
-import java.util.Set;
-
-public class PersistableCustomerOptionValuePopulator extends
- AbstractDataPopulator<PersistableCustomerOptionValue, CustomerOptionValue> {
-
-
- private LanguageService languageService;
-
- @Override
- public CustomerOptionValue populate(PersistableCustomerOptionValue source,
- CustomerOptionValue target, MerchantStore store, Language language)
- throws ConversionException {
-
-
- Validate.notNull(languageService, "Requires to set LanguageService");
-
-
- try {
-
- target.setCode(source.getCode());
- target.setMerchantStore(store);
- target.setSortOrder(source.getOrder());
-
- if(!CollectionUtils.isEmpty(source.getDescriptions())) {
- Set<com.salesmanager.core.model.customer.attribute.CustomerOptionValueDescription> descriptions = new HashSet<com.salesmanager.core.model.customer.attribute.CustomerOptionValueDescription>();
- for(CustomerOptionValueDescription desc : source.getDescriptions()) {
- com.salesmanager.core.model.customer.attribute.CustomerOptionValueDescription description = new com.salesmanager.core.model.customer.attribute.CustomerOptionValueDescription();
- Language lang = languageService.getByCode(desc.getLanguage());
- if(lang==null) {
- throw new ConversionException("Language is null for code " + description.getLanguage() + " use language ISO code [en, fr ...]");
- }
- description.setLanguage(lang);
- description.setName(desc.getName());
- description.setTitle(desc.getTitle());
- description.setCustomerOptionValue(target);
- descriptions.add(description);
- }
- target.setDescriptions(descriptions);
- }
-
- } catch (Exception e) {
- throw new ConversionException(e);
- }
- return target;
- }
-
- @Override
- protected CustomerOptionValue createTarget() {
- return null;
- }
-
- public void setLanguageService(LanguageService languageService) {
- this.languageService = languageService;
- }
-
- public LanguageService getLanguageService() {
- return languageService;
- }
-
-}
+package com.salesmanager.shop.populator.customer;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.services.reference.language.LanguageService;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.customer.attribute.CustomerOptionValue;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.customer.attribute.CustomerOptionValueDescription;
+import com.salesmanager.shop.model.customer.attribute.PersistableCustomerOptionValue;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.Validate;
+
+import java.util.HashSet;
+import java.util.Set;
+
+public class PersistableCustomerOptionValuePopulator extends
+ AbstractDataPopulator<PersistableCustomerOptionValue, CustomerOptionValue> {
+
+
+ private LanguageService languageService;
+
+ @Override
+ public CustomerOptionValue populate(PersistableCustomerOptionValue source,
+ CustomerOptionValue target, MerchantStore store, Language language)
+ throws ConversionException {
+
+
+ Validate.notNull(languageService, "Requires to set LanguageService");
+
+
+ try {
+
+ target.setCode(source.getCode());
+ target.setMerchantStore(store);
+ target.setSortOrder(source.getOrder());
+
+ if(!CollectionUtils.isEmpty(source.getDescriptions())) {
+ Set<com.salesmanager.core.model.customer.attribute.CustomerOptionValueDescription> descriptions = new HashSet<com.salesmanager.core.model.customer.attribute.CustomerOptionValueDescription>();
+ for(CustomerOptionValueDescription desc : source.getDescriptions()) {
+ com.salesmanager.core.model.customer.attribute.CustomerOptionValueDescription description = new com.salesmanager.core.model.customer.attribute.CustomerOptionValueDescription();
+ Language lang = languageService.getByCode(desc.getLanguage());
+ if(lang==null) {
+ throw new ConversionException("Language is null for code " + description.getLanguage() + " use language ISO code [en, fr ...]");
+ }
+ description.setLanguage(lang);
+ description.setName(desc.getName());
+ description.setTitle(desc.getTitle());
+ description.setCustomerOptionValue(target);
+ descriptions.add(description);
+ }
+ target.setDescriptions(descriptions);
+ }
+
+ } catch (Exception e) {
+ throw new ConversionException(e);
+ }
+ return target;
+ }
+
+ @Override
+ protected CustomerOptionValue createTarget() {
+ return null;
+ }
+
+ public void setLanguageService(LanguageService languageService) {
+ this.languageService = languageService;
+ }
+
+ public LanguageService getLanguageService() {
+ return languageService;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerPopulator.java
index 253585a..9319460 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerPopulator.java
@@ -1,96 +1,106 @@
-package com.salesmanager.shop.populator.customer;
-
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.shop.model.customer.Address;
-import com.salesmanager.shop.model.customer.PersistableCustomer;
-
-public class PersistableCustomerPopulator extends
- AbstractDataPopulator<Customer, PersistableCustomer> {
-
- @Override
- public PersistableCustomer populate(Customer source,
- PersistableCustomer target, MerchantStore store, Language language)
- throws ConversionException {
-
-
- try {
-
-
- if(source.getBilling()!=null) {
- Address address = new Address();
- address.setCity(source.getBilling().getCity());
- address.setCompany(source.getBilling().getCompany());
- address.setFirstName(source.getBilling().getFirstName());
- address.setLastName(source.getBilling().getLastName());
- address.setPostalCode(source.getBilling().getPostalCode());
- address.setPhone(source.getBilling().getTelephone());
- if(source.getBilling().getTelephone()==null) {
- address.setPhone(source.getBilling().getTelephone());
- }
- address.setAddress(source.getBilling().getAddress());
- if(source.getBilling().getCountry()!=null) {
- address.setCountry(source.getBilling().getCountry().getIsoCode());
- }
- if(source.getBilling().getZone()!=null) {
- address.setZone(source.getBilling().getZone().getCode());
- }
-
- target.setBilling(address);
- }
-
- if(source.getDelivery()!=null) {
- Address address = new Address();
- address.setAddress(source.getDelivery().getAddress());
- address.setCity(source.getDelivery().getCity());
- address.setCompany(source.getDelivery().getCompany());
- address.setFirstName(source.getDelivery().getFirstName());
- address.setLastName(source.getDelivery().getLastName());
- address.setPostalCode(source.getDelivery().getPostalCode());
- address.setPhone(source.getDelivery().getTelephone());
- if(source.getDelivery().getCountry()!=null) {
- address.setCountry(source.getDelivery().getCountry().getIsoCode());
- }
- if(source.getDelivery().getZone()!=null) {
- address.setZone(source.getDelivery().getZone().getCode());
- }
-
- target.setDelivery(address);
- }
-
- target.setId(source.getId());
- target.setEmailAddress(source.getEmailAddress());
- if(source.getGender()!=null) {
- target.setGender(source.getGender().name());
- }
- if(source.getDefaultLanguage()!=null) {
- target.setLanguage(source.getDefaultLanguage().getCode());
- }
- target.setUserName(source.getNick());
- target.setStoreCode(store.getCode());
- if(source.getDefaultLanguage()!=null) {
- target.setLanguage(source.getDefaultLanguage().getCode());
- } else {
- target.setLanguage(store.getDefaultLanguage().getCode());
- }
-
-
-
- } catch (Exception e) {
- throw new ConversionException(e);
- }
-
- return target;
-
- }
-
- @Override
- protected PersistableCustomer createTarget() {
- // TODO Auto-generated method stub
- return null;
- }
-
-}
+package com.salesmanager.shop.populator.customer;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.customer.Address;
+import com.salesmanager.shop.model.customer.PersistableCustomer;
+
+public class PersistableCustomerPopulator extends
+ AbstractDataPopulator<Customer, PersistableCustomer> {
+
+ @Override
+ public PersistableCustomer populate(Customer source,
+ PersistableCustomer target, MerchantStore store, Language language)
+ throws ConversionException {
+
+
+ try {
+
+
+ if(source.getBilling()!=null) {
+ Address address = new Address();
+ address.setCity(source.getBilling().getCity());
+ address.setCompany(source.getBilling().getCompany());
+ address.setFirstName(source.getBilling().getFirstName());
+ address.setLastName(source.getBilling().getLastName());
+ address.setPostalCode(source.getBilling().getPostalCode());
+ address.setPhone(source.getBilling().getTelephone());
+ if(source.getBilling().getTelephone()==null) {
+ address.setPhone(source.getBilling().getTelephone());
+ }
+ address.setAddress(source.getBilling().getAddress());
+ if(source.getBilling().getCountry()!=null) {
+ address.setCountry(source.getBilling().getCountry().getIsoCode());
+ }
+ if(source.getBilling().getZone()!=null) {
+ address.setZone(source.getBilling().getZone().getCode());
+ }
+
+ target.setBilling(address);
+ }
+
+ target.setProvider(source.getProvider());
+
+ if(source.getCustomerReviewAvg() != null) {
+ target.setRating(source.getCustomerReviewAvg().doubleValue());
+ }
+
+ if(source.getCustomerReviewCount() != null) {
+ target.setRatingCount(source.getCustomerReviewCount().intValue());
+ }
+
+ if(source.getDelivery()!=null) {
+ Address address = new Address();
+ address.setAddress(source.getDelivery().getAddress());
+ address.setCity(source.getDelivery().getCity());
+ address.setCompany(source.getDelivery().getCompany());
+ address.setFirstName(source.getDelivery().getFirstName());
+ address.setLastName(source.getDelivery().getLastName());
+ address.setPostalCode(source.getDelivery().getPostalCode());
+ address.setPhone(source.getDelivery().getTelephone());
+ if(source.getDelivery().getCountry()!=null) {
+ address.setCountry(source.getDelivery().getCountry().getIsoCode());
+ }
+ if(source.getDelivery().getZone()!=null) {
+ address.setZone(source.getDelivery().getZone().getCode());
+ }
+
+ target.setDelivery(address);
+ }
+
+ target.setId(source.getId());
+ target.setEmailAddress(source.getEmailAddress());
+ if(source.getGender()!=null) {
+ target.setGender(source.getGender().name());
+ }
+ if(source.getDefaultLanguage()!=null) {
+ target.setLanguage(source.getDefaultLanguage().getCode());
+ }
+ target.setUserName(source.getNick());
+ target.setStoreCode(store.getCode());
+ if(source.getDefaultLanguage()!=null) {
+ target.setLanguage(source.getDefaultLanguage().getCode());
+ } else {
+ target.setLanguage(store.getDefaultLanguage().getCode());
+ }
+
+
+
+ } catch (Exception e) {
+ throw new ConversionException(e);
+ }
+
+ return target;
+
+ }
+
+ @Override
+ protected PersistableCustomer createTarget() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerReviewPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerReviewPopulator.java
new file mode 100644
index 0000000..a06b67a
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerReviewPopulator.java
@@ -0,0 +1,108 @@
+package com.salesmanager.shop.populator.customer;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.commons.lang.Validate;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.business.services.reference.language.LanguageService;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.customer.review.CustomerReview;
+import com.salesmanager.core.model.customer.review.CustomerReviewDescription;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.customer.PersistableCustomerReview;
+import com.salesmanager.shop.utils.DateUtil;
+
+public class PersistableCustomerReviewPopulator extends AbstractDataPopulator<PersistableCustomerReview, CustomerReview> {
+
+ private CustomerService customerService;
+
+ private LanguageService languageService;
+
+ public LanguageService getLanguageService() {
+ return languageService;
+ }
+
+ public void setLanguageService(LanguageService languageService) {
+ this.languageService = languageService;
+ }
+
+ @Override
+ public CustomerReview populate(PersistableCustomerReview source, CustomerReview target, MerchantStore store,
+ Language language) throws ConversionException {
+
+ Validate.notNull(customerService,"customerService cannot be null");
+ Validate.notNull(languageService,"languageService cannot be null");
+ Validate.notNull(source.getRating(),"Rating cannot bot be null");
+
+ try {
+
+ if(target==null) {
+ target = new CustomerReview();
+ }
+
+ if(source.getDate() == null) {
+ String date = DateUtil.formatDate(new Date());
+ source.setDate(date);
+ }
+ target.setReviewDate(DateUtil.getDate(source.getDate()));
+
+ if(source.getId() != null && source.getId().longValue()==0) {
+ source.setId(null);
+ } else {
+ target.setId(source.getId());
+ }
+
+
+ Customer reviewer = customerService.getById(source.getCustomerId());
+ Customer reviewed = customerService.getById(source.getReviewedCustomer());
+
+ target.setReviewRating(source.getRating());
+
+ target.setCustomer(reviewer);
+ target.setReviewedCustomer(reviewed);
+
+ Language lang = languageService.getByCode(language.getCode());
+ if(lang ==null) {
+ throw new ConversionException("Invalid language code, use iso codes (en, fr ...)");
+ }
+
+ CustomerReviewDescription description = new CustomerReviewDescription();
+ description.setDescription(source.getDescription());
+ description.setLanguage(lang);
+ description.setName("-");
+ description.setCustomerReview(target);
+
+ Set<CustomerReviewDescription> descriptions = new HashSet<CustomerReviewDescription>();
+ descriptions.add(description);
+
+ target.setDescriptions(descriptions);
+
+ } catch (Exception e) {
+ throw new ConversionException("Cannot populate CustomerReview", e);
+ }
+
+
+ return target;
+ }
+
+ @Override
+ protected CustomerReview createTarget() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public CustomerService getCustomerService() {
+ return customerService;
+ }
+
+ public void setCustomerService(CustomerService customerService) {
+ this.customerService = customerService;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerShippingAddressPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerShippingAddressPopulator.java
index 35975da..dc46344 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerShippingAddressPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/PersistableCustomerShippingAddressPopulator.java
@@ -1,97 +1,97 @@
-package com.salesmanager.shop.populator.customer;
-
-import org.apache.commons.lang.StringUtils;
-
-import com.salesmanager.core.model.common.Delivery;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.shop.model.customer.Address;
-
-public class PersistableCustomerShippingAddressPopulator extends AbstractDataPopulator<Address, Customer>
-{
-
- @Override
- public Customer populate( Address source, Customer target, MerchantStore store, Language language )
- throws ConversionException
- {
-
-
- if( target.getDelivery() == null){
-
- Delivery delivery=new Delivery();
- delivery.setFirstName( source.getFirstName()) ;
- delivery.setLastName( source.getLastName() );
-
- if(StringUtils.isNotBlank( source.getAddress())){
- delivery.setAddress( source.getAddress() );
- }
-
- if(StringUtils.isNotBlank( source.getCity())){
- delivery.setCity( source.getCity() );
- }
-
- if(StringUtils.isNotBlank( source.getCompany())){
- delivery.setCompany( source.getCompany() );
- }
-
- if(StringUtils.isNotBlank( source.getPhone())){
- delivery.setTelephone( source.getPhone());
- }
-
- if(StringUtils.isNotBlank( source.getPostalCode())){
- delivery.setPostalCode( source.getPostalCode());
- }
-
- if(StringUtils.isNotBlank( source.getStateProvince())){
- delivery.setPostalCode( source.getStateProvince());
- }
-
- target.setDelivery( delivery );
- }
- else{
- target.getDelivery().setFirstName( source.getFirstName() );
- target.getDelivery().setLastName( source.getLastName() );
-
- // lets fill optional data now
-
- if(StringUtils.isNotBlank( source.getAddress())){
- target.getDelivery().setAddress( source.getAddress() );
- }
-
- if(StringUtils.isNotBlank( source.getCity())){
- target.getDelivery().setCity( source.getCity() );
- }
-
- if(StringUtils.isNotBlank( source.getCompany())){
- target.getDelivery().setCompany( source.getCompany() );
- }
-
- if(StringUtils.isNotBlank( source.getPhone())){
- target.getDelivery().setTelephone( source.getPhone());
- }
-
- if(StringUtils.isNotBlank( source.getPostalCode())){
- target.getDelivery().setPostalCode( source.getPostalCode());
- }
-
- if(StringUtils.isNotBlank( source.getStateProvince())){
- target.getDelivery().setPostalCode( source.getStateProvince());
- }
- }
-
- return target;
-
- }
-
- @Override
- protected Customer createTarget()
- {
- return null;
- }
-
-
-
-}
+package com.salesmanager.shop.populator.customer;
+
+import org.apache.commons.lang.StringUtils;
+
+import com.salesmanager.core.model.common.Delivery;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.shop.model.customer.Address;
+
+public class PersistableCustomerShippingAddressPopulator extends AbstractDataPopulator<Address, Customer>
+{
+
+ @Override
+ public Customer populate( Address source, Customer target, MerchantStore store, Language language )
+ throws ConversionException
+ {
+
+
+ if( target.getDelivery() == null){
+
+ Delivery delivery=new Delivery();
+ delivery.setFirstName( source.getFirstName()) ;
+ delivery.setLastName( source.getLastName() );
+
+ if(StringUtils.isNotBlank( source.getAddress())){
+ delivery.setAddress( source.getAddress() );
+ }
+
+ if(StringUtils.isNotBlank( source.getCity())){
+ delivery.setCity( source.getCity() );
+ }
+
+ if(StringUtils.isNotBlank( source.getCompany())){
+ delivery.setCompany( source.getCompany() );
+ }
+
+ if(StringUtils.isNotBlank( source.getPhone())){
+ delivery.setTelephone( source.getPhone());
+ }
+
+ if(StringUtils.isNotBlank( source.getPostalCode())){
+ delivery.setPostalCode( source.getPostalCode());
+ }
+
+ if(StringUtils.isNotBlank( source.getStateProvince())){
+ delivery.setPostalCode( source.getStateProvince());
+ }
+
+ target.setDelivery( delivery );
+ }
+ else{
+ target.getDelivery().setFirstName( source.getFirstName() );
+ target.getDelivery().setLastName( source.getLastName() );
+
+ // lets fill optional data now
+
+ if(StringUtils.isNotBlank( source.getAddress())){
+ target.getDelivery().setAddress( source.getAddress() );
+ }
+
+ if(StringUtils.isNotBlank( source.getCity())){
+ target.getDelivery().setCity( source.getCity() );
+ }
+
+ if(StringUtils.isNotBlank( source.getCompany())){
+ target.getDelivery().setCompany( source.getCompany() );
+ }
+
+ if(StringUtils.isNotBlank( source.getPhone())){
+ target.getDelivery().setTelephone( source.getPhone());
+ }
+
+ if(StringUtils.isNotBlank( source.getPostalCode())){
+ target.getDelivery().setPostalCode( source.getPostalCode());
+ }
+
+ if(StringUtils.isNotBlank( source.getStateProvince())){
+ target.getDelivery().setPostalCode( source.getStateProvince());
+ }
+ }
+
+ return target;
+
+ }
+
+ @Override
+ protected Customer createTarget()
+ {
+ return null;
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/ReadableCustomerDeliveryAddressPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/ReadableCustomerDeliveryAddressPopulator.java
index 7ec0c48..28daba3 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/ReadableCustomerDeliveryAddressPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/ReadableCustomerDeliveryAddressPopulator.java
@@ -1,144 +1,144 @@
-/**
- *
- */
-package com.salesmanager.shop.populator.customer;
-
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.reference.country.CountryService;
-import com.salesmanager.core.business.services.reference.zone.ZoneService;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.core.model.common.Delivery;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.reference.zone.Zone;
-import com.salesmanager.shop.model.customer.ReadableDelivery;
-import org.apache.commons.lang.StringUtils;
-
-import java.util.Map;
-
-/**
- * @author Carl Samson
- *
- */
-public class ReadableCustomerDeliveryAddressPopulator extends AbstractDataPopulator<Delivery, ReadableDelivery>
-{
-
-
- private CountryService countryService;
- private ZoneService zoneService;
-
- @Override
- public ReadableDelivery populate( Delivery source, ReadableDelivery target, MerchantStore store, Language language )
- throws ConversionException
- {
-
-
- if(countryService==null) {
- throw new ConversionException("countryService must be set");
- }
-
- if(zoneService==null) {
- throw new ConversionException("zoneService must be set");
- }
-
-
- target.setLatitude(source.getLatitude());
- target.setLongitude(source.getLongitude());
-
-
- if(StringUtils.isNotBlank( source.getCity() )){
- target.setCity(source.getCity());
- }
-
- if(StringUtils.isNotBlank( source.getCompany() )){
- target.setCompany(source.getCompany());
- }
-
- if(StringUtils.isNotBlank( source.getAddress() )){
- target.setAddress(source.getAddress());
- }
-
- if(StringUtils.isNotBlank( source.getFirstName() )){
- target.setFirstName(source.getFirstName());
- }
-
- if(StringUtils.isNotBlank( source.getLastName() )){
- target.setLastName(source.getLastName());
- }
-
- if(StringUtils.isNotBlank( source.getPostalCode() )){
- target.setPostalCode(source.getPostalCode());
- }
-
- if(StringUtils.isNotBlank( source.getTelephone() )){
- target.setPhone(source.getTelephone());
- }
-
- target.setStateProvince(source.getState());
-
- if(source.getTelephone()==null) {
- target.setPhone(source.getTelephone());
- }
- target.setAddress(source.getAddress());
- if(source.getCountry()!=null) {
- target.setCountry(source.getCountry().getIsoCode());
-
- //resolve country name
- try {
- Map<String,Country> countries = countryService.getCountriesMap(language);
- Country c =countries.get(source.getCountry().getIsoCode());
- if(c!=null) {
- target.setCountryName(c.getName());
- }
- } catch (ServiceException e) {
- // TODO Auto-generated catch block
- throw new ConversionException(e);
- }
- }
- if(source.getZone()!=null) {
- target.setZone(source.getZone().getCode());
-
- //resolve zone name
- try {
- Map<String,Zone> zones = zoneService.getZones(language);
- Zone z = zones.get(source.getZone().getCode());
- if(z!=null) {
- target.setProvinceName(z.getName());
- }
- } catch (ServiceException e) {
- // TODO Auto-generated catch block
- throw new ConversionException(e);
- }
- }
-
-
-
- return target;
- }
-
- @Override
- protected ReadableDelivery createTarget() {
- // TODO Auto-generated method stub
- return null;
- }
-
- public CountryService getCountryService() {
- return countryService;
- }
-
- public void setCountryService(CountryService countryService) {
- this.countryService = countryService;
- }
-
- public ZoneService getZoneService() {
- return zoneService;
- }
-
- public void setZoneService(ZoneService zoneService) {
- this.zoneService = zoneService;
- }
-
-
-}
+/**
+ *
+ */
+package com.salesmanager.shop.populator.customer;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.reference.country.CountryService;
+import com.salesmanager.core.business.services.reference.zone.ZoneService;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.common.Delivery;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.reference.zone.Zone;
+import com.salesmanager.shop.model.customer.ReadableDelivery;
+import org.apache.commons.lang.StringUtils;
+
+import java.util.Map;
+
+/**
+ * @author Carl Samson
+ *
+ */
+public class ReadableCustomerDeliveryAddressPopulator extends AbstractDataPopulator<Delivery, ReadableDelivery>
+{
+
+
+ private CountryService countryService;
+ private ZoneService zoneService;
+
+ @Override
+ public ReadableDelivery populate( Delivery source, ReadableDelivery target, MerchantStore store, Language language )
+ throws ConversionException
+ {
+
+
+ if(countryService==null) {
+ throw new ConversionException("countryService must be set");
+ }
+
+ if(zoneService==null) {
+ throw new ConversionException("zoneService must be set");
+ }
+
+
+ target.setLatitude(source.getLatitude());
+ target.setLongitude(source.getLongitude());
+
+
+ if(StringUtils.isNotBlank( source.getCity() )){
+ target.setCity(source.getCity());
+ }
+
+ if(StringUtils.isNotBlank( source.getCompany() )){
+ target.setCompany(source.getCompany());
+ }
+
+ if(StringUtils.isNotBlank( source.getAddress() )){
+ target.setAddress(source.getAddress());
+ }
+
+ if(StringUtils.isNotBlank( source.getFirstName() )){
+ target.setFirstName(source.getFirstName());
+ }
+
+ if(StringUtils.isNotBlank( source.getLastName() )){
+ target.setLastName(source.getLastName());
+ }
+
+ if(StringUtils.isNotBlank( source.getPostalCode() )){
+ target.setPostalCode(source.getPostalCode());
+ }
+
+ if(StringUtils.isNotBlank( source.getTelephone() )){
+ target.setPhone(source.getTelephone());
+ }
+
+ target.setStateProvince(source.getState());
+
+ if(source.getTelephone()==null) {
+ target.setPhone(source.getTelephone());
+ }
+ target.setAddress(source.getAddress());
+ if(source.getCountry()!=null) {
+ target.setCountry(source.getCountry().getIsoCode());
+
+ //resolve country name
+ try {
+ Map<String,Country> countries = countryService.getCountriesMap(language);
+ Country c =countries.get(source.getCountry().getIsoCode());
+ if(c!=null) {
+ target.setCountryName(c.getName());
+ }
+ } catch (ServiceException e) {
+ // TODO Auto-generated catch block
+ throw new ConversionException(e);
+ }
+ }
+ if(source.getZone()!=null) {
+ target.setZone(source.getZone().getCode());
+
+ //resolve zone name
+ try {
+ Map<String,Zone> zones = zoneService.getZones(language);
+ Zone z = zones.get(source.getZone().getCode());
+ if(z!=null) {
+ target.setProvinceName(z.getName());
+ }
+ } catch (ServiceException e) {
+ // TODO Auto-generated catch block
+ throw new ConversionException(e);
+ }
+ }
+
+
+
+ return target;
+ }
+
+ @Override
+ protected ReadableDelivery createTarget() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public CountryService getCountryService() {
+ return countryService;
+ }
+
+ public void setCountryService(CountryService countryService) {
+ this.countryService = countryService;
+ }
+
+ public ZoneService getZoneService() {
+ return zoneService;
+ }
+
+ public void setZoneService(ZoneService zoneService) {
+ this.zoneService = zoneService;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/ReadableCustomerList.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/ReadableCustomerList.java
new file mode 100644
index 0000000..b598c1d
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/ReadableCustomerList.java
@@ -0,0 +1,26 @@
+package com.salesmanager.shop.populator.customer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.salesmanager.shop.model.ReadableList;
+import com.salesmanager.shop.model.customer.ReadableCustomer;
+
+public class ReadableCustomerList extends ReadableList {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private List<ReadableCustomer> customers = new ArrayList<ReadableCustomer>();
+
+ public List<ReadableCustomer> getCustomers() {
+ return customers;
+ }
+
+ public void setCustomers(List<ReadableCustomer> customers) {
+ this.customers = customers;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/ReadableCustomerPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/ReadableCustomerPopulator.java
index 06e33ec..42ea057 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/ReadableCustomerPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/ReadableCustomerPopulator.java
@@ -1,114 +1,126 @@
-package com.salesmanager.shop.populator.customer;
-
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.customer.attribute.CustomerAttribute;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.model.customer.Address;
-import com.salesmanager.shop.model.customer.ReadableCustomer;
-import com.salesmanager.shop.model.customer.attribute.CustomerOptionDescription;
-import com.salesmanager.shop.model.customer.attribute.CustomerOptionValueDescription;
-import com.salesmanager.shop.model.customer.attribute.ReadableCustomerAttribute;
-import com.salesmanager.shop.model.customer.attribute.ReadableCustomerOption;
-import com.salesmanager.shop.model.customer.attribute.ReadableCustomerOptionValue;
-
-public class ReadableCustomerPopulator extends
- AbstractDataPopulator<Customer, ReadableCustomer> {
-
-
-
- @Override
- public ReadableCustomer populate(Customer source, ReadableCustomer target,
- MerchantStore store, Language language) throws ConversionException {
-
- try {
-
- if(source.getId()!=null && source.getId()>0) {
- target.setId(source.getId());
- }
- target.setEmailAddress(source.getEmailAddress());
- if(source.getBilling()!=null) {
- Address address = new Address();
- address.setAddress(source.getBilling().getAddress());
- address.setCity(source.getBilling().getCity());
- address.setCompany(source.getBilling().getCompany());
- address.setFirstName(source.getBilling().getFirstName());
- address.setLastName(source.getBilling().getLastName());
- address.setPostalCode(source.getBilling().getPostalCode());
- address.setPhone(source.getBilling().getTelephone());
- if(source.getBilling().getCountry()!=null) {
- address.setCountry(source.getBilling().getCountry().getIsoCode());
- }
- if(source.getBilling().getZone()!=null) {
- address.setZone(source.getBilling().getZone().getCode());
- }
-
- target.setFirstName(address.getFirstName());
- target.setLastName(address.getLastName());
-
- target.setBilling(address);
- }
-
- if(source.getDelivery()!=null) {
- Address address = new Address();
- address.setCity(source.getDelivery().getCity());
- address.setAddress(source.getDelivery().getAddress());
- address.setCompany(source.getDelivery().getCompany());
- address.setFirstName(source.getDelivery().getFirstName());
- address.setLastName(source.getDelivery().getLastName());
- address.setPostalCode(source.getDelivery().getPostalCode());
- address.setPhone(source.getDelivery().getTelephone());
- if(source.getDelivery().getCountry()!=null) {
- address.setCountry(source.getDelivery().getCountry().getIsoCode());
- }
- if(source.getDelivery().getZone()!=null) {
- address.setZone(source.getDelivery().getZone().getCode());
- }
-
- target.setDelivery(address);
- }
-
- if(source.getAttributes()!=null) {
- for(CustomerAttribute attribute : source.getAttributes()) {
- ReadableCustomerAttribute readableAttribute = new ReadableCustomerAttribute();
- readableAttribute.setId(attribute.getId());
- ReadableCustomerOption option = new ReadableCustomerOption();
- option.setId(attribute.getCustomerOption().getId());
- option.setCode(attribute.getCustomerOption().getCode());
-
- CustomerOptionDescription d = new CustomerOptionDescription();
- d.setDescription(attribute.getCustomerOption().getDescriptionsSettoList().get(0).getDescription());
- d.setName(attribute.getCustomerOption().getDescriptionsSettoList().get(0).getName());
- option.setDescription(d);
-
- readableAttribute.setCustomerOption(option);
-
- ReadableCustomerOptionValue optionValue = new ReadableCustomerOptionValue();
- optionValue.setId(attribute.getCustomerOptionValue().getId());
- CustomerOptionValueDescription vd = new CustomerOptionValueDescription();
- vd.setDescription(attribute.getCustomerOptionValue().getDescriptionsSettoList().get(0).getDescription());
- vd.setName(attribute.getCustomerOptionValue().getDescriptionsSettoList().get(0).getName());
- optionValue.setCode(attribute.getCustomerOptionValue().getCode());
- optionValue.setDescription(vd);
-
-
- readableAttribute.setCustomerOptionValue(optionValue);
- target.getAttributes().add(readableAttribute);
- }
- }
-
- } catch (Exception e) {
- throw new ConversionException(e);
- }
-
- return target;
- }
-
- @Override
- protected ReadableCustomer createTarget() {
- return null;
- }
-
-}
+package com.salesmanager.shop.populator.customer;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.customer.attribute.CustomerAttribute;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.customer.Address;
+import com.salesmanager.shop.model.customer.ReadableCustomer;
+import com.salesmanager.shop.model.customer.attribute.CustomerOptionDescription;
+import com.salesmanager.shop.model.customer.attribute.CustomerOptionValueDescription;
+import com.salesmanager.shop.model.customer.attribute.ReadableCustomerAttribute;
+import com.salesmanager.shop.model.customer.attribute.ReadableCustomerOption;
+import com.salesmanager.shop.model.customer.attribute.ReadableCustomerOptionValue;
+
+public class ReadableCustomerPopulator extends
+ AbstractDataPopulator<Customer, ReadableCustomer> {
+
+
+
+ @Override
+ public ReadableCustomer populate(Customer source, ReadableCustomer target,
+ MerchantStore store, Language language) throws ConversionException {
+
+ try {
+
+ if(target == null) {
+ target = new ReadableCustomer();
+ }
+
+ if(source.getId()!=null && source.getId()>0) {
+ target.setId(source.getId());
+ }
+ target.setEmailAddress(source.getEmailAddress());
+ if(source.getBilling()!=null) {
+ Address address = new Address();
+ address.setAddress(source.getBilling().getAddress());
+ address.setCity(source.getBilling().getCity());
+ address.setCompany(source.getBilling().getCompany());
+ address.setFirstName(source.getBilling().getFirstName());
+ address.setLastName(source.getBilling().getLastName());
+ address.setPostalCode(source.getBilling().getPostalCode());
+ address.setPhone(source.getBilling().getTelephone());
+ if(source.getBilling().getCountry()!=null) {
+ address.setCountry(source.getBilling().getCountry().getIsoCode());
+ }
+ if(source.getBilling().getZone()!=null) {
+ address.setZone(source.getBilling().getZone().getCode());
+ }
+
+ target.setFirstName(address.getFirstName());
+ target.setLastName(address.getLastName());
+
+ target.setBilling(address);
+ }
+
+ if(source.getCustomerReviewAvg() != null) {
+ target.setRating(source.getCustomerReviewAvg().doubleValue());
+ }
+
+ if(source.getCustomerReviewCount() != null) {
+ target.setRatingCount(source.getCustomerReviewCount().intValue());
+ }
+
+ if(source.getDelivery()!=null) {
+ Address address = new Address();
+ address.setCity(source.getDelivery().getCity());
+ address.setAddress(source.getDelivery().getAddress());
+ address.setCompany(source.getDelivery().getCompany());
+ address.setFirstName(source.getDelivery().getFirstName());
+ address.setLastName(source.getDelivery().getLastName());
+ address.setPostalCode(source.getDelivery().getPostalCode());
+ address.setPhone(source.getDelivery().getTelephone());
+ if(source.getDelivery().getCountry()!=null) {
+ address.setCountry(source.getDelivery().getCountry().getIsoCode());
+ }
+ if(source.getDelivery().getZone()!=null) {
+ address.setZone(source.getDelivery().getZone().getCode());
+ }
+
+ target.setDelivery(address);
+ }
+
+ if(source.getAttributes()!=null) {
+ for(CustomerAttribute attribute : source.getAttributes()) {
+ ReadableCustomerAttribute readableAttribute = new ReadableCustomerAttribute();
+ readableAttribute.setId(attribute.getId());
+ ReadableCustomerOption option = new ReadableCustomerOption();
+ option.setId(attribute.getCustomerOption().getId());
+ option.setCode(attribute.getCustomerOption().getCode());
+
+ CustomerOptionDescription d = new CustomerOptionDescription();
+ d.setDescription(attribute.getCustomerOption().getDescriptionsSettoList().get(0).getDescription());
+ d.setName(attribute.getCustomerOption().getDescriptionsSettoList().get(0).getName());
+ option.setDescription(d);
+
+ readableAttribute.setCustomerOption(option);
+
+ ReadableCustomerOptionValue optionValue = new ReadableCustomerOptionValue();
+ optionValue.setId(attribute.getCustomerOptionValue().getId());
+ CustomerOptionValueDescription vd = new CustomerOptionValueDescription();
+ vd.setDescription(attribute.getCustomerOptionValue().getDescriptionsSettoList().get(0).getDescription());
+ vd.setName(attribute.getCustomerOptionValue().getDescriptionsSettoList().get(0).getName());
+ optionValue.setCode(attribute.getCustomerOptionValue().getCode());
+ optionValue.setDescription(vd);
+
+
+ readableAttribute.setCustomerOptionValue(optionValue);
+ target.getAttributes().add(readableAttribute);
+ }
+ }
+
+ } catch (Exception e) {
+ throw new ConversionException(e);
+ }
+
+ return target;
+ }
+
+ @Override
+ protected ReadableCustomer createTarget() {
+ return null;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/ReadableCustomerReviewPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/ReadableCustomerReviewPopulator.java
new file mode 100644
index 0000000..318b4ce
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/ReadableCustomerReviewPopulator.java
@@ -0,0 +1,86 @@
+package com.salesmanager.shop.populator.customer;
+
+import java.util.Set;
+
+import org.apache.commons.collections4.CollectionUtils;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.customer.review.CustomerReview;
+import com.salesmanager.core.model.customer.review.CustomerReviewDescription;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.customer.ReadableCustomer;
+import com.salesmanager.shop.model.customer.ReadableCustomerReview;
+import com.salesmanager.shop.utils.DateUtil;
+
+public class ReadableCustomerReviewPopulator extends AbstractDataPopulator<CustomerReview, ReadableCustomerReview> {
+
+ @Override
+ public ReadableCustomerReview populate(CustomerReview source, ReadableCustomerReview target, MerchantStore store,
+ Language language) throws ConversionException {
+
+ try {
+
+ if(target==null) {
+ target = new ReadableCustomerReview();
+ }
+
+ if(source.getReviewDate() != null) {
+ target.setDate(DateUtil.formatDate(source.getReviewDate()));
+ }
+
+
+ ReadableCustomer reviewed = new ReadableCustomer();
+ reviewed.setId(source.getReviewedCustomer().getId());
+ reviewed.setFirstName(source.getReviewedCustomer().getBilling().getFirstName());
+ reviewed.setLastName(source.getReviewedCustomer().getBilling().getLastName());
+
+
+ target.setId(source.getId());
+ target.setCustomerId(source.getCustomer().getId());
+ target.setReviewedCustomer(reviewed);
+ target.setRating(source.getReviewRating());
+ target.setReviewedCustomer(reviewed);
+ target.setCustomerId(source.getCustomer().getId());
+
+ Set<CustomerReviewDescription> descriptions = source.getDescriptions();
+ if(CollectionUtils.isNotEmpty(descriptions)) {
+ CustomerReviewDescription description = null;
+ if(descriptions.size()>1) {
+ for(CustomerReviewDescription desc : descriptions) {
+ if(desc.getLanguage().getCode().equals(language.getCode())) {
+ description = desc;
+ break;
+ }
+ }
+ } else {
+ description = descriptions.iterator().next();
+ }
+
+ if(description != null) {
+ target.setDescription(description.getDescription());
+ target.setLanguage(description.getLanguage().getCode());
+ }
+
+ }
+
+
+
+
+ } catch (Exception e) {
+ throw new ConversionException("Cannot populate ReadableCustomerReview", e);
+ }
+
+
+ return target;
+
+ }
+
+ @Override
+ protected ReadableCustomerReview createTarget() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/ReadableProductReviewPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/ReadableProductReviewPopulator.java
new file mode 100644
index 0000000..c7136fc
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/customer/ReadableProductReviewPopulator.java
@@ -0,0 +1,25 @@
+package com.salesmanager.shop.populator.customer;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.customer.review.CustomerReview;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.customer.ReadableCustomerReview;
+
+public class ReadableProductReviewPopulator extends AbstractDataPopulator<CustomerReview, ReadableCustomerReview> {
+
+ @Override
+ public ReadableCustomerReview populate(CustomerReview source, ReadableCustomerReview target, MerchantStore store,
+ Language language) throws ConversionException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ protected ReadableCustomerReview createTarget() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/manufacturer/PersistableManufacturerPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/manufacturer/PersistableManufacturerPopulator.java
index f063a8a..882ca6f 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/manufacturer/PersistableManufacturerPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/manufacturer/PersistableManufacturerPopulator.java
@@ -1,84 +1,87 @@
-
-package com.salesmanager.shop.populator.manufacturer;
-
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.services.reference.language.LanguageService;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.model.catalog.manufacturer.ManufacturerDescription;
-import com.salesmanager.shop.model.catalog.manufacturer.PersistableManufacturer;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.Validate;
-
-import java.util.HashSet;
-import java.util.Set;
-
-
-/**
- * @author Carl Samson
- *
- */
-
-
-public class PersistableManufacturerPopulator extends AbstractDataPopulator<PersistableManufacturer, Manufacturer>
-{
-
-
- private LanguageService languageService;
-
- @Override
- public Manufacturer populate(PersistableManufacturer source,
- Manufacturer target, MerchantStore store, Language language)
- throws ConversionException {
-
- Validate.notNull(languageService, "Requires to set LanguageService");
-
- try {
-
- target.setMerchantStore(store);
- target.setCode(source.getCode());
-
-
- if(!CollectionUtils.isEmpty(source.getDescriptions())) {
- Set<com.salesmanager.core.model.catalog.product.manufacturer.ManufacturerDescription> descriptions = new HashSet<com.salesmanager.core.model.catalog.product.manufacturer.ManufacturerDescription>();
- for(ManufacturerDescription description : source.getDescriptions()) {
- com.salesmanager.core.model.catalog.product.manufacturer.ManufacturerDescription desc = new com.salesmanager.core.model.catalog.product.manufacturer.ManufacturerDescription();
- desc.setManufacturer(target);
- desc.setDescription(description.getDescription());
- desc.setName(description.getName());
- Language lang = languageService.getByCode(description.getLanguage());
- if(lang==null) {
- throw new ConversionException("Language is null for code " + description.getLanguage() + " use language ISO code [en, fr ...]");
- }
- desc.setLanguage(lang);
- descriptions.add(desc);
- }
- target.setDescriptions(descriptions);
- }
-
- } catch (Exception e) {
- throw new ConversionException(e);
- }
-
-
- return target;
- }
-
- @Override
- protected Manufacturer createTarget() {
- // TODO Auto-generated method stub
- return null;
- }
-
- public void setLanguageService(LanguageService languageService) {
- this.languageService = languageService;
- }
-
- public LanguageService getLanguageService() {
- return languageService;
- }
-
-
-}
+
+package com.salesmanager.shop.populator.manufacturer;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.services.reference.language.LanguageService;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.catalog.manufacturer.ManufacturerDescription;
+import com.salesmanager.shop.model.catalog.manufacturer.PersistableManufacturer;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.Validate;
+
+import java.util.HashSet;
+import java.util.Set;
+
+
+/**
+ * @author Carl Samson
+ *
+ */
+
+
+public class PersistableManufacturerPopulator extends AbstractDataPopulator<PersistableManufacturer, Manufacturer>
+{
+
+
+ private LanguageService languageService;
+
+ @Override
+ public Manufacturer populate(PersistableManufacturer source,
+ Manufacturer target, MerchantStore store, Language language)
+ throws ConversionException {
+
+ Validate.notNull(languageService, "Requires to set LanguageService");
+
+ try {
+
+ target.setMerchantStore(store);
+ target.setCode(source.getCode());
+
+
+ if(!CollectionUtils.isEmpty(source.getDescriptions())) {
+ Set<com.salesmanager.core.model.catalog.product.manufacturer.ManufacturerDescription> descriptions = new HashSet<com.salesmanager.core.model.catalog.product.manufacturer.ManufacturerDescription>();
+ for(ManufacturerDescription description : source.getDescriptions()) {
+ com.salesmanager.core.model.catalog.product.manufacturer.ManufacturerDescription desc = new com.salesmanager.core.model.catalog.product.manufacturer.ManufacturerDescription();
+ desc.setManufacturer(target);
+ if(desc.getId() != null && desc.getId().longValue()>0) {
+ desc.setId(description.getId());
+ }
+ desc.setDescription(description.getDescription());
+ desc.setName(description.getName());
+ Language lang = languageService.getByCode(description.getLanguage());
+ if(lang==null) {
+ throw new ConversionException("Language is null for code " + description.getLanguage() + " use language ISO code [en, fr ...]");
+ }
+ desc.setLanguage(lang);
+ descriptions.add(desc);
+ }
+ target.setDescriptions(descriptions);
+ }
+
+ } catch (Exception e) {
+ throw new ConversionException(e);
+ }
+
+
+ return target;
+ }
+
+ @Override
+ protected Manufacturer createTarget() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public void setLanguageService(LanguageService languageService) {
+ this.languageService = languageService;
+ }
+
+ public LanguageService getLanguageService() {
+ return languageService;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/manufacturer/ReadableManufacturerPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/manufacturer/ReadableManufacturerPopulator.java
index 921d97a..8533705 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/manufacturer/ReadableManufacturerPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/manufacturer/ReadableManufacturerPopulator.java
@@ -1,55 +1,56 @@
-package com.salesmanager.shop.populator.manufacturer;
-
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.core.model.catalog.product.manufacturer.ManufacturerDescription;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.model.catalog.manufacturer.ReadableManufacturer;
-
-import java.util.Set;
-
-public class ReadableManufacturerPopulator extends AbstractDataPopulator<com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer,ReadableManufacturer>
-{
-
-
-
-
- @Override
- public ReadableManufacturer populate(
- com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer source,
- ReadableManufacturer target, MerchantStore store, Language language) throws ConversionException {
- target.setId(source.getId());
- if(source.getDescriptions()!=null && source.getDescriptions().size()>0) {
-
- Set<ManufacturerDescription> descriptions = source.getDescriptions();
- ManufacturerDescription description = null;
- for(ManufacturerDescription desc : descriptions) {
- if(desc.getLanguage().getCode().equals(language.getCode())) {
- description = desc;
- break;
- }
- }
-
- target.setOrder(source.getOrder());
- target.setId(source.getId());
- target.setCode(source.getCode());
-
- if (description != null) {
- com.salesmanager.shop.model.catalog.manufacturer.ManufacturerDescription d = new com.salesmanager.shop.model.catalog.manufacturer.ManufacturerDescription();
- d.setName(description.getName());
- d.setDescription(description.getDescription());
- target.setDescription(d);
- }
-
- }
-
- return target;
- }
-
- @Override
- protected ReadableManufacturer createTarget()
- {
- return null;
- }
-}
+package com.salesmanager.shop.populator.manufacturer;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.catalog.product.manufacturer.ManufacturerDescription;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.catalog.manufacturer.ReadableManufacturer;
+
+import java.util.Set;
+
+public class ReadableManufacturerPopulator extends AbstractDataPopulator<com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer,ReadableManufacturer>
+{
+
+
+
+
+ @Override
+ public ReadableManufacturer populate(
+ com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer source,
+ ReadableManufacturer target, MerchantStore store, Language language) throws ConversionException {
+ target.setId(source.getId());
+ if(source.getDescriptions()!=null && source.getDescriptions().size()>0) {
+
+ Set<ManufacturerDescription> descriptions = source.getDescriptions();
+ ManufacturerDescription description = null;
+ for(ManufacturerDescription desc : descriptions) {
+ if(desc.getLanguage().getCode().equals(language.getCode())) {
+ description = desc;
+ break;
+ }
+ }
+
+ target.setOrder(source.getOrder());
+ target.setId(source.getId());
+ target.setCode(source.getCode());
+
+ if (description != null) {
+ com.salesmanager.shop.model.catalog.manufacturer.ManufacturerDescription d = new com.salesmanager.shop.model.catalog.manufacturer.ManufacturerDescription();
+ d.setName(description.getName());
+ d.setDescription(description.getDescription());
+ d.setId(description.getId());
+ target.setDescription(d);
+ }
+
+ }
+
+ return target;
+ }
+
+ @Override
+ protected ReadableManufacturer createTarget()
+ {
+ return null;
+ }
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/order/OrderProductPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/order/OrderProductPopulator.java
index dd499be..1c94d3a 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/order/OrderProductPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/order/OrderProductPopulator.java
@@ -1,190 +1,190 @@
-package com.salesmanager.shop.populator.order;
-
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.services.catalog.product.ProductService;
-import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
-import com.salesmanager.core.business.services.catalog.product.file.DigitalProductService;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
-import com.salesmanager.core.model.catalog.product.file.DigitalProduct;
-import com.salesmanager.core.model.catalog.product.price.FinalPrice;
-import com.salesmanager.core.model.catalog.product.price.ProductPrice;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.orderproduct.OrderProduct;
-import com.salesmanager.core.model.order.orderproduct.OrderProductAttribute;
-import com.salesmanager.core.model.order.orderproduct.OrderProductDownload;
-import com.salesmanager.core.model.order.orderproduct.OrderProductPrice;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem;
-import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
-import com.salesmanager.shop.constants.ApplicationConstants;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.Validate;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-public class OrderProductPopulator extends
- AbstractDataPopulator<ShoppingCartItem, OrderProduct> {
-
- private ProductService productService;
- private DigitalProductService digitalProductService;
- private ProductAttributeService productAttributeService;
-
-
- public ProductAttributeService getProductAttributeService() {
- return productAttributeService;
- }
-
- public void setProductAttributeService(
- ProductAttributeService productAttributeService) {
- this.productAttributeService = productAttributeService;
- }
-
- public DigitalProductService getDigitalProductService() {
- return digitalProductService;
- }
-
- public void setDigitalProductService(DigitalProductService digitalProductService) {
- this.digitalProductService = digitalProductService;
- }
-
- /**
- * Converts a ShoppingCartItem carried in the ShoppingCart to an OrderProduct
- * that will be saved in the system
- */
- @Override
- public OrderProduct populate(ShoppingCartItem source, OrderProduct target,
- MerchantStore store, Language language) throws ConversionException {
-
- Validate.notNull(productService,"productService must be set");
- Validate.notNull(digitalProductService,"digitalProductService must be set");
- Validate.notNull(productAttributeService,"productAttributeService must be set");
-
-
- try {
- Product modelProduct = productService.getById(source.getProductId());
- if(modelProduct==null) {
- throw new ConversionException("Cannot get product with id (productId) " + source.getProductId());
- }
-
- if(modelProduct.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- throw new ConversionException("Invalid product id " + source.getProductId());
- }
-
- DigitalProduct digitalProduct = digitalProductService.getByProduct(store, modelProduct);
-
- if(digitalProduct!=null) {
- OrderProductDownload orderProductDownload = new OrderProductDownload();
- orderProductDownload.setOrderProductFilename(digitalProduct.getProductFileName());
- orderProductDownload.setOrderProduct(target);
- orderProductDownload.setDownloadCount(0);
- orderProductDownload.setMaxdays(ApplicationConstants.MAX_DOWNLOAD_DAYS);
- target.getDownloads().add(orderProductDownload);
- }
-
- target.setOneTimeCharge(source.getItemPrice());
- target.setProductName(source.getProduct().getDescriptions().iterator().next().getName());
- target.setProductQuantity(source.getQuantity());
- target.setSku(source.getProduct().getSku());
-
- FinalPrice finalPrice = source.getFinalPrice();
- if(finalPrice==null) {
- throw new ConversionException("Object final price not populated in shoppingCartItem (source)");
- }
- //Default price
- OrderProductPrice orderProductPrice = orderProductPrice(finalPrice);
- orderProductPrice.setOrderProduct(target);
-
- Set<OrderProductPrice> prices = new HashSet<OrderProductPrice>();
- prices.add(orderProductPrice);
-
- //Other prices
- List<FinalPrice> otherPrices = finalPrice.getAdditionalPrices();
- if(otherPrices!=null) {
- for(FinalPrice otherPrice : otherPrices) {
- OrderProductPrice other = orderProductPrice(otherPrice);
- other.setOrderProduct(target);
- prices.add(other);
- }
- }
-
- target.setPrices(prices);
-
- //OrderProductAttribute
- Set<ShoppingCartAttributeItem> attributeItems = source.getAttributes();
- if(!CollectionUtils.isEmpty(attributeItems)) {
- Set<OrderProductAttribute> attributes = new HashSet<OrderProductAttribute>();
- for(ShoppingCartAttributeItem attribute : attributeItems) {
- OrderProductAttribute orderProductAttribute = new OrderProductAttribute();
- orderProductAttribute.setOrderProduct(target);
- Long id = attribute.getProductAttributeId();
- ProductAttribute attr = productAttributeService.getById(id);
- if(attr==null) {
- throw new ConversionException("Attribute id " + id + " does not exists");
- }
-
- if(attr.getProduct().getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- throw new ConversionException("Attribute id " + id + " invalid for this store");
- }
-
- orderProductAttribute.setProductAttributeIsFree(attr.getProductAttributeIsFree());
- orderProductAttribute.setProductAttributeName(attr.getProductOption().getDescriptionsSettoList().get(0).getName());
- orderProductAttribute.setProductAttributeValueName(attr.getProductOptionValue().getDescriptionsSettoList().get(0).getName());
- orderProductAttribute.setProductAttributePrice(attr.getProductAttributePrice());
- orderProductAttribute.setProductAttributeWeight(attr.getProductAttributeWeight());
- orderProductAttribute.setProductOptionId(attr.getProductOption().getId());
- orderProductAttribute.setProductOptionValueId(attr.getProductOptionValue().getId());
- attributes.add(orderProductAttribute);
- }
- target.setOrderAttributes(attributes);
- }
-
-
- } catch (Exception e) {
- throw new ConversionException(e);
- }
-
-
- return target;
- }
-
- @Override
- protected OrderProduct createTarget() {
- return null;
- }
-
- public void setProductService(ProductService productService) {
- this.productService = productService;
- }
-
- public ProductService getProductService() {
- return productService;
- }
-
- private OrderProductPrice orderProductPrice(FinalPrice price) {
-
- OrderProductPrice orderProductPrice = new OrderProductPrice();
-
- ProductPrice productPrice = price.getProductPrice();
-
- orderProductPrice.setDefaultPrice(productPrice.isDefaultPrice());
-
- orderProductPrice.setProductPrice(price.getFinalPrice());
- orderProductPrice.setProductPriceCode(productPrice.getCode());
- if(productPrice.getDescriptions()!=null && productPrice.getDescriptions().size()>0) {
- orderProductPrice.setProductPriceName(productPrice.getDescriptions().iterator().next().getName());
- }
- if(price.isDiscounted()) {
- orderProductPrice.setProductPriceSpecial(productPrice.getProductPriceSpecialAmount());
- orderProductPrice.setProductPriceSpecialStartDate(productPrice.getProductPriceSpecialStartDate());
- orderProductPrice.setProductPriceSpecialEndDate(productPrice.getProductPriceSpecialEndDate());
- }
-
- return orderProductPrice;
- }
-
-
-}
+package com.salesmanager.shop.populator.order;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
+import com.salesmanager.core.business.services.catalog.product.file.DigitalProductService;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
+import com.salesmanager.core.model.catalog.product.file.DigitalProduct;
+import com.salesmanager.core.model.catalog.product.price.FinalPrice;
+import com.salesmanager.core.model.catalog.product.price.ProductPrice;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.orderproduct.OrderProduct;
+import com.salesmanager.core.model.order.orderproduct.OrderProductAttribute;
+import com.salesmanager.core.model.order.orderproduct.OrderProductDownload;
+import com.salesmanager.core.model.order.orderproduct.OrderProductPrice;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem;
+import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
+import com.salesmanager.shop.constants.ApplicationConstants;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.Validate;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class OrderProductPopulator extends
+ AbstractDataPopulator<ShoppingCartItem, OrderProduct> {
+
+ private ProductService productService;
+ private DigitalProductService digitalProductService;
+ private ProductAttributeService productAttributeService;
+
+
+ public ProductAttributeService getProductAttributeService() {
+ return productAttributeService;
+ }
+
+ public void setProductAttributeService(
+ ProductAttributeService productAttributeService) {
+ this.productAttributeService = productAttributeService;
+ }
+
+ public DigitalProductService getDigitalProductService() {
+ return digitalProductService;
+ }
+
+ public void setDigitalProductService(DigitalProductService digitalProductService) {
+ this.digitalProductService = digitalProductService;
+ }
+
+ /**
+ * Converts a ShoppingCartItem carried in the ShoppingCart to an OrderProduct
+ * that will be saved in the system
+ */
+ @Override
+ public OrderProduct populate(ShoppingCartItem source, OrderProduct target,
+ MerchantStore store, Language language) throws ConversionException {
+
+ Validate.notNull(productService,"productService must be set");
+ Validate.notNull(digitalProductService,"digitalProductService must be set");
+ Validate.notNull(productAttributeService,"productAttributeService must be set");
+
+
+ try {
+ Product modelProduct = productService.getById(source.getProductId());
+ if(modelProduct==null) {
+ throw new ConversionException("Cannot get product with id (productId) " + source.getProductId());
+ }
+
+ if(modelProduct.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ throw new ConversionException("Invalid product id " + source.getProductId());
+ }
+
+ DigitalProduct digitalProduct = digitalProductService.getByProduct(store, modelProduct);
+
+ if(digitalProduct!=null) {
+ OrderProductDownload orderProductDownload = new OrderProductDownload();
+ orderProductDownload.setOrderProductFilename(digitalProduct.getProductFileName());
+ orderProductDownload.setOrderProduct(target);
+ orderProductDownload.setDownloadCount(0);
+ orderProductDownload.setMaxdays(ApplicationConstants.MAX_DOWNLOAD_DAYS);
+ target.getDownloads().add(orderProductDownload);
+ }
+
+ target.setOneTimeCharge(source.getItemPrice());
+ target.setProductName(source.getProduct().getDescriptions().iterator().next().getName());
+ target.setProductQuantity(source.getQuantity());
+ target.setSku(source.getProduct().getSku());
+
+ FinalPrice finalPrice = source.getFinalPrice();
+ if(finalPrice==null) {
+ throw new ConversionException("Object final price not populated in shoppingCartItem (source)");
+ }
+ //Default price
+ OrderProductPrice orderProductPrice = orderProductPrice(finalPrice);
+ orderProductPrice.setOrderProduct(target);
+
+ Set<OrderProductPrice> prices = new HashSet<OrderProductPrice>();
+ prices.add(orderProductPrice);
+
+ //Other prices
+ List<FinalPrice> otherPrices = finalPrice.getAdditionalPrices();
+ if(otherPrices!=null) {
+ for(FinalPrice otherPrice : otherPrices) {
+ OrderProductPrice other = orderProductPrice(otherPrice);
+ other.setOrderProduct(target);
+ prices.add(other);
+ }
+ }
+
+ target.setPrices(prices);
+
+ //OrderProductAttribute
+ Set<ShoppingCartAttributeItem> attributeItems = source.getAttributes();
+ if(!CollectionUtils.isEmpty(attributeItems)) {
+ Set<OrderProductAttribute> attributes = new HashSet<OrderProductAttribute>();
+ for(ShoppingCartAttributeItem attribute : attributeItems) {
+ OrderProductAttribute orderProductAttribute = new OrderProductAttribute();
+ orderProductAttribute.setOrderProduct(target);
+ Long id = attribute.getProductAttributeId();
+ ProductAttribute attr = productAttributeService.getById(id);
+ if(attr==null) {
+ throw new ConversionException("Attribute id " + id + " does not exists");
+ }
+
+ if(attr.getProduct().getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ throw new ConversionException("Attribute id " + id + " invalid for this store");
+ }
+
+ orderProductAttribute.setProductAttributeIsFree(attr.getProductAttributeIsFree());
+ orderProductAttribute.setProductAttributeName(attr.getProductOption().getDescriptionsSettoList().get(0).getName());
+ orderProductAttribute.setProductAttributeValueName(attr.getProductOptionValue().getDescriptionsSettoList().get(0).getName());
+ orderProductAttribute.setProductAttributePrice(attr.getProductAttributePrice());
+ orderProductAttribute.setProductAttributeWeight(attr.getProductAttributeWeight());
+ orderProductAttribute.setProductOptionId(attr.getProductOption().getId());
+ orderProductAttribute.setProductOptionValueId(attr.getProductOptionValue().getId());
+ attributes.add(orderProductAttribute);
+ }
+ target.setOrderAttributes(attributes);
+ }
+
+
+ } catch (Exception e) {
+ throw new ConversionException(e);
+ }
+
+
+ return target;
+ }
+
+ @Override
+ protected OrderProduct createTarget() {
+ return null;
+ }
+
+ public void setProductService(ProductService productService) {
+ this.productService = productService;
+ }
+
+ public ProductService getProductService() {
+ return productService;
+ }
+
+ private OrderProductPrice orderProductPrice(FinalPrice price) {
+
+ OrderProductPrice orderProductPrice = new OrderProductPrice();
+
+ ProductPrice productPrice = price.getProductPrice();
+
+ orderProductPrice.setDefaultPrice(productPrice.isDefaultPrice());
+
+ orderProductPrice.setProductPrice(price.getFinalPrice());
+ orderProductPrice.setProductPriceCode(productPrice.getCode());
+ if(productPrice.getDescriptions()!=null && productPrice.getDescriptions().size()>0) {
+ orderProductPrice.setProductPriceName(productPrice.getDescriptions().iterator().next().getName());
+ }
+ if(price.isDiscounted()) {
+ orderProductPrice.setProductPriceSpecial(productPrice.getProductPriceSpecialAmount());
+ orderProductPrice.setProductPriceSpecialStartDate(productPrice.getProductPriceSpecialStartDate());
+ orderProductPrice.setProductPriceSpecialEndDate(productPrice.getProductPriceSpecialEndDate());
+ }
+
+ return orderProductPrice;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/order/PersistableOrderApiPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/order/PersistableOrderApiPopulator.java
new file mode 100644
index 0000000..bd7cc07
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/order/PersistableOrderApiPopulator.java
@@ -0,0 +1,198 @@
+package com.salesmanager.shop.populator.order;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.commons.lang.Validate;
+import org.apache.commons.lang3.StringUtils;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
+import com.salesmanager.core.business.services.catalog.product.file.DigitalProductService;
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.business.services.order.OrderService;
+import com.salesmanager.core.business.services.reference.currency.CurrencyService;
+import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.common.Billing;
+import com.salesmanager.core.model.common.Delivery;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.order.OrderChannel;
+import com.salesmanager.core.model.order.attributes.OrderAttribute;
+import com.salesmanager.core.model.order.orderstatus.OrderStatus;
+import com.salesmanager.core.model.order.orderstatus.OrderStatusHistory;
+import com.salesmanager.core.model.payments.PaymentType;
+import com.salesmanager.core.model.reference.currency.Currency;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.order.PersistableOrderApi;
+import com.salesmanager.shop.utils.LocaleUtils;
+
+public class PersistableOrderApiPopulator extends AbstractDataPopulator<PersistableOrderApi, Order> {
+
+
+ private CurrencyService currencyService;
+ private CustomerService customerService;
+ private ShoppingCartService shoppingCartService;
+ private ProductService productService;
+ private ProductAttributeService productAttributeService;
+ private DigitalProductService digitalProductService;
+
+
+
+
+ @Override
+ public Order populate(PersistableOrderApi source, Order target, MerchantStore store, Language language)
+ throws ConversionException {
+
+
+ Validate.notNull(currencyService,"currencyService must be set");
+ Validate.notNull(customerService,"customerService must be set");
+ Validate.notNull(shoppingCartService,"shoppingCartService must be set");
+ Validate.notNull(productService,"productService must be set");
+ Validate.notNull(productAttributeService,"productAttributeService must be set");
+ Validate.notNull(digitalProductService,"digitalProductService must be set");
+ Validate.notNull(source.getPayment(),"Payment cannot be null");
+
+ try {
+
+ if(target == null) {
+ target = new Order();
+ }
+
+ //target.setLocale(LocaleUtils.getLocale(store));
+
+ target.setLocale(LocaleUtils.getLocale(store));
+
+
+ Currency currency = null;
+ try {
+ currency = currencyService.getByCode(source.getCurrency());
+ } catch(Exception e) {
+ throw new ConversionException("Currency not found for code " + source.getCurrency());
+ }
+
+ if(currency==null) {
+ throw new ConversionException("Currency not found for code " + source.getCurrency());
+ }
+
+ //Customer
+ Long customerId = source.getCustomerId();
+ Customer customer = customerService.getById(customerId);
+
+ if(customer == null) {
+ throw new ConversionException("Curstomer with id " + source.getCustomerId() + " does not exist");
+ }
+
+ target.setCustomerId(customerId);
+ target.setCustomerEmailAddress(customer.getEmailAddress());
+
+ Delivery delivery = customer.getDelivery();
+ target.setDelivery(delivery);
+
+ Billing billing = customer.getBilling();
+ target.setBilling(billing);
+
+ if(source.getAttributes() != null && source.getAttributes().size() > 0) {
+ Set<OrderAttribute> attrs = new HashSet<OrderAttribute>();
+ for(com.salesmanager.shop.model.order.OrderAttribute attribute : source.getAttributes()) {
+ OrderAttribute attr = new OrderAttribute();
+ attr.setKey(attribute.getKey());
+ attr.setValue(attribute.getValue());
+ attr.setOrder(target);
+ attrs.add(attr);
+ }
+ target.setOrderAttributes(attrs);
+ }
+
+ target.setDatePurchased(new Date());
+ target.setCurrency(currency);
+ target.setCurrencyValue(new BigDecimal(0));
+ target.setMerchant(store);
+ target.setChannel(OrderChannel.API);
+ //need this
+ target.setStatus(OrderStatus.ORDERED);
+ target.setPaymentModuleCode(source.getPayment().getPaymentModule());
+ target.setPaymentType(PaymentType.valueOf(source.getPayment().getPaymentType()));
+
+ target.setCustomerAgreement(source.isCustomerAgreement());
+ target.setConfirmedAddress(true);//force this to true, cannot perform this activity from the API
+
+
+ if(!StringUtils.isBlank(source.getComments())) {
+ OrderStatusHistory statusHistory = new OrderStatusHistory();
+ statusHistory.setStatus(null);
+ statusHistory.setOrder(target);
+ statusHistory.setComments(source.getComments());
+ target.getOrderHistory().add(statusHistory);
+ }
+
+ return target;
+
+ } catch(Exception e) {
+ throw new ConversionException(e);
+ }
+ }
+
+ @Override
+ protected Order createTarget() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+
+ public CurrencyService getCurrencyService() {
+ return currencyService;
+ }
+
+ public void setCurrencyService(CurrencyService currencyService) {
+ this.currencyService = currencyService;
+ }
+
+ public CustomerService getCustomerService() {
+ return customerService;
+ }
+
+ public void setCustomerService(CustomerService customerService) {
+ this.customerService = customerService;
+ }
+
+ public ShoppingCartService getShoppingCartService() {
+ return shoppingCartService;
+ }
+
+ public void setShoppingCartService(ShoppingCartService shoppingCartService) {
+ this.shoppingCartService = shoppingCartService;
+ }
+
+ public ProductService getProductService() {
+ return productService;
+ }
+
+ public void setProductService(ProductService productService) {
+ this.productService = productService;
+ }
+
+ public ProductAttributeService getProductAttributeService() {
+ return productAttributeService;
+ }
+
+ public void setProductAttributeService(ProductAttributeService productAttributeService) {
+ this.productAttributeService = productAttributeService;
+ }
+
+ public DigitalProductService getDigitalProductService() {
+ return digitalProductService;
+ }
+
+ public void setDigitalProductService(DigitalProductService digitalProductService) {
+ this.digitalProductService = digitalProductService;
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/order/PersistableOrderPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/order/PersistableOrderPopulator.java
index fa315db..be0ab2a 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/order/PersistableOrderPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/order/PersistableOrderPopulator.java
@@ -1,226 +1,235 @@
-package com.salesmanager.shop.populator.order;
-
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.services.catalog.product.ProductService;
-import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
-import com.salesmanager.core.business.services.catalog.product.file.DigitalProductService;
-import com.salesmanager.core.business.services.customer.CustomerService;
-import com.salesmanager.core.business.services.reference.country.CountryService;
-import com.salesmanager.core.business.services.reference.currency.CurrencyService;
-import com.salesmanager.core.business.services.reference.zone.ZoneService;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.core.business.utils.CreditCardUtils;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.Order;
-import com.salesmanager.core.model.order.orderproduct.OrderProduct;
-import com.salesmanager.core.model.order.orderstatus.OrderStatus;
-import com.salesmanager.core.model.order.orderstatus.OrderStatusHistory;
-import com.salesmanager.core.model.order.payment.CreditCard;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.currency.Currency;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.reference.zone.Zone;
-import com.salesmanager.shop.model.customer.PersistableCustomer;
-import com.salesmanager.shop.model.order.OrderTotal;
-import com.salesmanager.shop.model.order.PersistableOrder;
-import com.salesmanager.shop.model.order.PersistableOrderProduct;
-import com.salesmanager.shop.utils.LocaleUtils;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.Validate;
-
-import java.math.BigDecimal;
-import java.util.List;
-import java.util.Map;
-
-public class PersistableOrderPopulator extends
- AbstractDataPopulator<PersistableOrder, Order> {
-
- private CustomerService customerService;
- private CountryService countryService;
- private CurrencyService currencyService;
-
-
- private ZoneService zoneService;
- private ProductService productService;
- private DigitalProductService digitalProductService;
- private ProductAttributeService productAttributeService;
-
- @Override
- public Order populate(PersistableOrder source, Order target,
- MerchantStore store, Language language) throws ConversionException {
-
-
- Validate.notNull(productService,"productService must be set");
- Validate.notNull(digitalProductService,"digitalProductService must be set");
- Validate.notNull(productAttributeService,"productAttributeService must be set");
- Validate.notNull(customerService,"customerService must be set");
- Validate.notNull(countryService,"countryService must be set");
- Validate.notNull(zoneService,"zoneService must be set");
- Validate.notNull(currencyService,"currencyService must be set");
-
- try {
-
-
- Map<String,Country> countriesMap = countryService.getCountriesMap(language);
- Map<String,Zone> zonesMap = zoneService.getZones(language);
- /** customer **/
- PersistableCustomer customer = source.getCustomer();
- if(customer!=null) {
- if(customer.getId()!=null && customer.getId()>0) {
- Customer modelCustomer = customerService.getById(customer.getId());
- if(modelCustomer==null) {
- throw new ConversionException("Customer id " + customer.getId() + " does not exists");
- }
- if(modelCustomer.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- throw new ConversionException("Customer id " + customer.getId() + " does not exists for store " + store.getCode());
- }
- target.setCustomerId(modelCustomer.getId());
- target.setBilling(modelCustomer.getBilling());
- target.setDelivery(modelCustomer.getDelivery());
- target.setCustomerEmailAddress(source.getCustomer().getEmailAddress());
-
-
-
- }
- }
-
- target.setLocale(LocaleUtils.getLocale(store));
-
- CreditCard creditCard = source.getCreditCard();
- if(creditCard!=null) {
- String maskedNumber = CreditCardUtils.maskCardNumber(creditCard.getCcNumber());
- creditCard.setCcNumber(maskedNumber);
- target.setCreditCard(creditCard);
- }
-
- Currency currency = null;
- try {
- currency = currencyService.getByCode(source.getCurrency());
- } catch(Exception e) {
- throw new ConversionException("Currency not found for code " + source.getCurrency());
- }
-
- if(currency==null) {
- throw new ConversionException("Currency not found for code " + source.getCurrency());
- }
-
- target.setCurrency(currency);
- target.setDatePurchased(source.getDatePurchased());
- //target.setCurrency(store.getCurrency());
- target.setCurrencyValue(new BigDecimal(0));
- target.setMerchant(store);
- target.setStatus(source.getOrderStatus());
- target.setPaymentModuleCode(source.getPaymentModule());
- target.setPaymentType(source.getPaymentType());
- target.setShippingModuleCode(source.getShippingModule());
- target.setCustomerAgreement(source.isCustomerAgreed());
- target.setConfirmedAddress(source.isConfirmedAddress());
- if(source.getPreviousOrderStatus()!=null) {
- List<OrderStatus> orderStatusList = source.getPreviousOrderStatus();
- for(OrderStatus status : orderStatusList) {
- OrderStatusHistory statusHistory = new OrderStatusHistory();
- statusHistory.setStatus(status);
- statusHistory.setOrder(target);
- target.getOrderHistory().add(statusHistory);
- }
- }
-
- List<PersistableOrderProduct> products = source.getOrderProductItems();
- if(CollectionUtils.isEmpty(products)) {
- throw new ConversionException("Requires at least 1 PersistableOrderProduct");
- }
- com.salesmanager.shop.populator.order.PersistableOrderProductPopulator orderProductPopulator = new PersistableOrderProductPopulator();
- orderProductPopulator.setProductAttributeService(productAttributeService);
- orderProductPopulator.setProductService(productService);
- orderProductPopulator.setDigitalProductService(digitalProductService);
-
- for(PersistableOrderProduct orderProduct : products) {
- OrderProduct modelOrderProduct = new OrderProduct();
- orderProductPopulator.populate(orderProduct, modelOrderProduct, store, language);
- target.getOrderProducts().add(modelOrderProduct);
- }
-
- List<OrderTotal> orderTotals = source.getTotals();
- if(CollectionUtils.isNotEmpty(orderTotals)) {
- for(OrderTotal total : orderTotals) {
- com.salesmanager.core.model.order.OrderTotal totalModel = new com.salesmanager.core.model.order.OrderTotal();
- totalModel.setModule(total.getModule());
- totalModel.setOrder(target);
- totalModel.setOrderTotalCode(total.getCode());
- totalModel.setTitle(total.getTitle());
- totalModel.setValue(total.getValue());
- target.getOrderTotal().add(totalModel);
- }
- }
-
- } catch (Exception e) {
- throw new ConversionException(e);
- }
-
-
- return target;
- }
-
- @Override
- protected Order createTarget() {
- return null;
- }
-
- public void setProductService(ProductService productService) {
- this.productService = productService;
- }
-
- public ProductService getProductService() {
- return productService;
- }
-
- public void setDigitalProductService(DigitalProductService digitalProductService) {
- this.digitalProductService = digitalProductService;
- }
-
- public DigitalProductService getDigitalProductService() {
- return digitalProductService;
- }
-
- public void setProductAttributeService(ProductAttributeService productAttributeService) {
- this.productAttributeService = productAttributeService;
- }
-
- public ProductAttributeService getProductAttributeService() {
- return productAttributeService;
- }
-
- public CustomerService getCustomerService() {
- return customerService;
- }
-
- public void setCustomerService(CustomerService customerService) {
- this.customerService = customerService;
- }
-
- public CountryService getCountryService() {
- return countryService;
- }
-
- public void setCountryService(CountryService countryService) {
- this.countryService = countryService;
- }
-
- public CurrencyService getCurrencyService() {
- return currencyService;
- }
-
- public void setCurrencyService(CurrencyService currencyService) {
- this.currencyService = currencyService;
- }
-
- public ZoneService getZoneService() {
- return zoneService;
- }
-
- public void setZoneService(ZoneService zoneService) {
- this.zoneService = zoneService;
- }
-
-}
+package com.salesmanager.shop.populator.order;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
+import com.salesmanager.core.business.services.catalog.product.file.DigitalProductService;
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.business.services.reference.country.CountryService;
+import com.salesmanager.core.business.services.reference.currency.CurrencyService;
+import com.salesmanager.core.business.services.reference.zone.ZoneService;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.business.utils.CreditCardUtils;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.order.orderproduct.OrderProduct;
+import com.salesmanager.core.model.order.orderstatus.OrderStatus;
+import com.salesmanager.core.model.order.orderstatus.OrderStatusHistory;
+import com.salesmanager.core.model.order.payment.CreditCard;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.currency.Currency;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.reference.zone.Zone;
+import com.salesmanager.shop.model.customer.PersistableCustomer;
+import com.salesmanager.shop.model.order.PersistableOrder;
+import com.salesmanager.shop.model.order.PersistableOrderProduct;
+import com.salesmanager.shop.model.order.total.OrderTotal;
+import com.salesmanager.shop.utils.LocaleUtils;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.Validate;
+import org.apache.commons.lang3.StringUtils;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+public class PersistableOrderPopulator extends
+ AbstractDataPopulator<PersistableOrder, Order> {
+
+ private CustomerService customerService;
+ private CountryService countryService;
+ private CurrencyService currencyService;
+
+
+ private ZoneService zoneService;
+ private ProductService productService;
+ private DigitalProductService digitalProductService;
+ private ProductAttributeService productAttributeService;
+
+ @Override
+ public Order populate(PersistableOrder source, Order target,
+ MerchantStore store, Language language) throws ConversionException {
+
+
+ Validate.notNull(productService,"productService must be set");
+ Validate.notNull(digitalProductService,"digitalProductService must be set");
+ Validate.notNull(productAttributeService,"productAttributeService must be set");
+ Validate.notNull(customerService,"customerService must be set");
+ Validate.notNull(countryService,"countryService must be set");
+ Validate.notNull(zoneService,"zoneService must be set");
+ Validate.notNull(currencyService,"currencyService must be set");
+
+ try {
+
+
+ Map<String,Country> countriesMap = countryService.getCountriesMap(language);
+ Map<String,Zone> zonesMap = zoneService.getZones(language);
+ /** customer **/
+ PersistableCustomer customer = source.getCustomer();
+ if(customer!=null) {
+ if(customer.getId()!=null && customer.getId()>0) {
+ Customer modelCustomer = customerService.getById(customer.getId());
+ if(modelCustomer==null) {
+ throw new ConversionException("Customer id " + customer.getId() + " does not exists");
+ }
+ if(modelCustomer.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ throw new ConversionException("Customer id " + customer.getId() + " does not exists for store " + store.getCode());
+ }
+ target.setCustomerId(modelCustomer.getId());
+ target.setBilling(modelCustomer.getBilling());
+ target.setDelivery(modelCustomer.getDelivery());
+ target.setCustomerEmailAddress(source.getCustomer().getEmailAddress());
+
+
+
+ }
+ }
+
+ target.setLocale(LocaleUtils.getLocale(store));
+
+ CreditCard creditCard = source.getCreditCard();
+ if(creditCard!=null) {
+ String maskedNumber = CreditCardUtils.maskCardNumber(creditCard.getCcNumber());
+ creditCard.setCcNumber(maskedNumber);
+ target.setCreditCard(creditCard);
+ }
+
+ Currency currency = null;
+ try {
+ currency = currencyService.getByCode(source.getCurrency());
+ } catch(Exception e) {
+ throw new ConversionException("Currency not found for code " + source.getCurrency());
+ }
+
+ if(currency==null) {
+ throw new ConversionException("Currency not found for code " + source.getCurrency());
+ }
+
+ target.setCurrency(currency);
+ target.setDatePurchased(source.getDatePurchased());
+ //target.setCurrency(store.getCurrency());
+ target.setCurrencyValue(new BigDecimal(0));
+ target.setMerchant(store);
+ target.setStatus(source.getOrderStatus());
+ target.setPaymentModuleCode(source.getPaymentModule());
+ target.setPaymentType(source.getPaymentType());
+ target.setShippingModuleCode(source.getShippingModule());
+ target.setCustomerAgreement(source.isCustomerAgreed());
+ target.setConfirmedAddress(source.isConfirmedAddress());
+ if(source.getPreviousOrderStatus()!=null) {
+ List<OrderStatus> orderStatusList = source.getPreviousOrderStatus();
+ for(OrderStatus status : orderStatusList) {
+ OrderStatusHistory statusHistory = new OrderStatusHistory();
+ statusHistory.setStatus(status);
+ statusHistory.setOrder(target);
+ target.getOrderHistory().add(statusHistory);
+ }
+ }
+
+ if(!StringUtils.isBlank(source.getComments())) {
+ OrderStatusHistory statusHistory = new OrderStatusHistory();
+ statusHistory.setStatus(null);
+ statusHistory.setOrder(target);
+ statusHistory.setComments(source.getComments());
+ target.getOrderHistory().add(statusHistory);
+ }
+
+ List<PersistableOrderProduct> products = source.getOrderProductItems();
+ if(CollectionUtils.isEmpty(products)) {
+ throw new ConversionException("Requires at least 1 PersistableOrderProduct");
+ }
+ com.salesmanager.shop.populator.order.PersistableOrderProductPopulator orderProductPopulator = new PersistableOrderProductPopulator();
+ orderProductPopulator.setProductAttributeService(productAttributeService);
+ orderProductPopulator.setProductService(productService);
+ orderProductPopulator.setDigitalProductService(digitalProductService);
+
+ for(PersistableOrderProduct orderProduct : products) {
+ OrderProduct modelOrderProduct = new OrderProduct();
+ orderProductPopulator.populate(orderProduct, modelOrderProduct, store, language);
+ target.getOrderProducts().add(modelOrderProduct);
+ }
+
+ List<OrderTotal> orderTotals = source.getTotals();
+ if(CollectionUtils.isNotEmpty(orderTotals)) {
+ for(OrderTotal total : orderTotals) {
+ com.salesmanager.core.model.order.OrderTotal totalModel = new com.salesmanager.core.model.order.OrderTotal();
+ totalModel.setModule(total.getModule());
+ totalModel.setOrder(target);
+ totalModel.setOrderTotalCode(total.getCode());
+ totalModel.setTitle(total.getTitle());
+ totalModel.setValue(total.getValue());
+ target.getOrderTotal().add(totalModel);
+ }
+ }
+
+ } catch (Exception e) {
+ throw new ConversionException(e);
+ }
+
+
+ return target;
+ }
+
+ @Override
+ protected Order createTarget() {
+ return null;
+ }
+
+ public void setProductService(ProductService productService) {
+ this.productService = productService;
+ }
+
+ public ProductService getProductService() {
+ return productService;
+ }
+
+ public void setDigitalProductService(DigitalProductService digitalProductService) {
+ this.digitalProductService = digitalProductService;
+ }
+
+ public DigitalProductService getDigitalProductService() {
+ return digitalProductService;
+ }
+
+ public void setProductAttributeService(ProductAttributeService productAttributeService) {
+ this.productAttributeService = productAttributeService;
+ }
+
+ public ProductAttributeService getProductAttributeService() {
+ return productAttributeService;
+ }
+
+ public CustomerService getCustomerService() {
+ return customerService;
+ }
+
+ public void setCustomerService(CustomerService customerService) {
+ this.customerService = customerService;
+ }
+
+ public CountryService getCountryService() {
+ return countryService;
+ }
+
+ public void setCountryService(CountryService countryService) {
+ this.countryService = countryService;
+ }
+
+ public CurrencyService getCurrencyService() {
+ return currencyService;
+ }
+
+ public void setCurrencyService(CurrencyService currencyService) {
+ this.currencyService = currencyService;
+ }
+
+ public ZoneService getZoneService() {
+ return zoneService;
+ }
+
+ public void setZoneService(ZoneService zoneService) {
+ this.zoneService = zoneService;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/order/PersistableOrderProductPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/order/PersistableOrderProductPopulator.java
index b2d4516..9d7413d 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/order/PersistableOrderProductPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/order/PersistableOrderProductPopulator.java
@@ -1,166 +1,166 @@
-package com.salesmanager.shop.populator.order;
-
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.services.catalog.product.ProductService;
-import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
-import com.salesmanager.core.business.services.catalog.product.file.DigitalProductService;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.file.DigitalProduct;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.orderproduct.OrderProduct;
-import com.salesmanager.core.model.order.orderproduct.OrderProductAttribute;
-import com.salesmanager.core.model.order.orderproduct.OrderProductDownload;
-import com.salesmanager.core.model.order.orderproduct.OrderProductPrice;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.constants.ApplicationConstants;
-import com.salesmanager.shop.model.catalog.product.attribute.ProductAttribute;
-import com.salesmanager.shop.model.order.PersistableOrderProduct;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.Validate;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-public class PersistableOrderProductPopulator extends
- AbstractDataPopulator<PersistableOrderProduct, OrderProduct> {
-
- private ProductService productService;
- private DigitalProductService digitalProductService;
- private ProductAttributeService productAttributeService;
-
-
- public ProductAttributeService getProductAttributeService() {
- return productAttributeService;
- }
-
- public void setProductAttributeService(
- ProductAttributeService productAttributeService) {
- this.productAttributeService = productAttributeService;
- }
-
- public DigitalProductService getDigitalProductService() {
- return digitalProductService;
- }
-
- public void setDigitalProductService(DigitalProductService digitalProductService) {
- this.digitalProductService = digitalProductService;
- }
-
- /**
- * Converts a ShoppingCartItem carried in the ShoppingCart to an OrderProduct
- * that will be saved in the system
- */
- @Override
- public OrderProduct populate(PersistableOrderProduct source, OrderProduct target,
- MerchantStore store, Language language) throws ConversionException {
-
- Validate.notNull(productService,"productService must be set");
- Validate.notNull(digitalProductService,"digitalProductService must be set");
- Validate.notNull(productAttributeService,"productAttributeService must be set");
-
-
- try {
- Product modelProduct = productService.getById(source.getProduct().getId());
- if(modelProduct==null) {
- throw new ConversionException("Cannot get product with id (productId) " + source.getProduct().getId());
- }
-
- if(modelProduct.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- throw new ConversionException("Invalid product id " + source.getProduct().getId());
- }
-
- DigitalProduct digitalProduct = digitalProductService.getByProduct(store, modelProduct);
-
- if(digitalProduct!=null) {
- OrderProductDownload orderProductDownload = new OrderProductDownload();
- orderProductDownload.setOrderProductFilename(digitalProduct.getProductFileName());
- orderProductDownload.setOrderProduct(target);
- orderProductDownload.setDownloadCount(0);
- orderProductDownload.setMaxdays(ApplicationConstants.MAX_DOWNLOAD_DAYS);
- target.getDownloads().add(orderProductDownload);
- }
-
- target.setOneTimeCharge(source.getPrice());
- target.setProductName(source.getProduct().getDescription().getName());
- target.setProductQuantity(source.getOrderedQuantity());
- target.setSku(source.getProduct().getSku());
-
- OrderProductPrice orderProductPrice = new OrderProductPrice();
- orderProductPrice.setDefaultPrice(true);
- orderProductPrice.setProductPrice(source.getPrice());
- orderProductPrice.setOrderProduct(target);
-
-
-
- Set<OrderProductPrice> prices = new HashSet<OrderProductPrice>();
- prices.add(orderProductPrice);
-
- /** DO NOT SUPPORT MUTIPLE PRICES **/
-/* //Other prices
- List<FinalPrice> otherPrices = finalPrice.getAdditionalPrices();
- if(otherPrices!=null) {
- for(FinalPrice otherPrice : otherPrices) {
- OrderProductPrice other = orderProductPrice(otherPrice);
- other.setOrderProduct(target);
- prices.add(other);
- }
- }*/
-
- target.setPrices(prices);
-
- //OrderProductAttribute
- List<ProductAttribute> attributeItems = source.getAttributes();
- if(!CollectionUtils.isEmpty(attributeItems)) {
- Set<OrderProductAttribute> attributes = new HashSet<OrderProductAttribute>();
- for(ProductAttribute attribute : attributeItems) {
- OrderProductAttribute orderProductAttribute = new OrderProductAttribute();
- orderProductAttribute.setOrderProduct(target);
- Long id = attribute.getId();
- com.salesmanager.core.model.catalog.product.attribute.ProductAttribute attr = productAttributeService.getById(id);
- if(attr==null) {
- throw new ConversionException("Attribute id " + id + " does not exists");
- }
-
- if(attr.getProduct().getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- throw new ConversionException("Attribute id " + id + " invalid for this store");
- }
-
- orderProductAttribute.setProductAttributeIsFree(attr.getProductAttributeIsFree());
- orderProductAttribute.setProductAttributeName(attr.getProductOption().getDescriptionsSettoList().get(0).getName());
- orderProductAttribute.setProductAttributeValueName(attr.getProductOptionValue().getDescriptionsSettoList().get(0).getName());
- orderProductAttribute.setProductAttributePrice(attr.getProductAttributePrice());
- orderProductAttribute.setProductAttributeWeight(attr.getProductAttributeWeight());
- orderProductAttribute.setProductOptionId(attr.getProductOption().getId());
- orderProductAttribute.setProductOptionValueId(attr.getProductOptionValue().getId());
- attributes.add(orderProductAttribute);
- }
- target.setOrderAttributes(attributes);
- }
-
-
- } catch (Exception e) {
- throw new ConversionException(e);
- }
-
-
- return target;
- }
-
- @Override
- protected OrderProduct createTarget() {
- return null;
- }
-
- public void setProductService(ProductService productService) {
- this.productService = productService;
- }
-
- public ProductService getProductService() {
- return productService;
- }
-
-
-
-}
+package com.salesmanager.shop.populator.order;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
+import com.salesmanager.core.business.services.catalog.product.file.DigitalProductService;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.file.DigitalProduct;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.orderproduct.OrderProduct;
+import com.salesmanager.core.model.order.orderproduct.OrderProductAttribute;
+import com.salesmanager.core.model.order.orderproduct.OrderProductDownload;
+import com.salesmanager.core.model.order.orderproduct.OrderProductPrice;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.constants.ApplicationConstants;
+import com.salesmanager.shop.model.catalog.product.attribute.ProductAttribute;
+import com.salesmanager.shop.model.order.PersistableOrderProduct;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.Validate;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class PersistableOrderProductPopulator extends
+ AbstractDataPopulator<PersistableOrderProduct, OrderProduct> {
+
+ private ProductService productService;
+ private DigitalProductService digitalProductService;
+ private ProductAttributeService productAttributeService;
+
+
+ public ProductAttributeService getProductAttributeService() {
+ return productAttributeService;
+ }
+
+ public void setProductAttributeService(
+ ProductAttributeService productAttributeService) {
+ this.productAttributeService = productAttributeService;
+ }
+
+ public DigitalProductService getDigitalProductService() {
+ return digitalProductService;
+ }
+
+ public void setDigitalProductService(DigitalProductService digitalProductService) {
+ this.digitalProductService = digitalProductService;
+ }
+
+ /**
+ * Converts a ShoppingCartItem carried in the ShoppingCart to an OrderProduct
+ * that will be saved in the system
+ */
+ @Override
+ public OrderProduct populate(PersistableOrderProduct source, OrderProduct target,
+ MerchantStore store, Language language) throws ConversionException {
+
+ Validate.notNull(productService,"productService must be set");
+ Validate.notNull(digitalProductService,"digitalProductService must be set");
+ Validate.notNull(productAttributeService,"productAttributeService must be set");
+
+
+ try {
+ Product modelProduct = productService.getById(source.getProduct().getId());
+ if(modelProduct==null) {
+ throw new ConversionException("Cannot get product with id (productId) " + source.getProduct().getId());
+ }
+
+ if(modelProduct.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ throw new ConversionException("Invalid product id " + source.getProduct().getId());
+ }
+
+ DigitalProduct digitalProduct = digitalProductService.getByProduct(store, modelProduct);
+
+ if(digitalProduct!=null) {
+ OrderProductDownload orderProductDownload = new OrderProductDownload();
+ orderProductDownload.setOrderProductFilename(digitalProduct.getProductFileName());
+ orderProductDownload.setOrderProduct(target);
+ orderProductDownload.setDownloadCount(0);
+ orderProductDownload.setMaxdays(ApplicationConstants.MAX_DOWNLOAD_DAYS);
+ target.getDownloads().add(orderProductDownload);
+ }
+
+ target.setOneTimeCharge(source.getPrice());
+ target.setProductName(source.getProduct().getDescription().getName());
+ target.setProductQuantity(source.getOrderedQuantity());
+ target.setSku(source.getProduct().getSku());
+
+ OrderProductPrice orderProductPrice = new OrderProductPrice();
+ orderProductPrice.setDefaultPrice(true);
+ orderProductPrice.setProductPrice(source.getPrice());
+ orderProductPrice.setOrderProduct(target);
+
+
+
+ Set<OrderProductPrice> prices = new HashSet<OrderProductPrice>();
+ prices.add(orderProductPrice);
+
+ /** DO NOT SUPPORT MUTIPLE PRICES **/
+/* //Other prices
+ List<FinalPrice> otherPrices = finalPrice.getAdditionalPrices();
+ if(otherPrices!=null) {
+ for(FinalPrice otherPrice : otherPrices) {
+ OrderProductPrice other = orderProductPrice(otherPrice);
+ other.setOrderProduct(target);
+ prices.add(other);
+ }
+ }*/
+
+ target.setPrices(prices);
+
+ //OrderProductAttribute
+ List<ProductAttribute> attributeItems = source.getAttributes();
+ if(!CollectionUtils.isEmpty(attributeItems)) {
+ Set<OrderProductAttribute> attributes = new HashSet<OrderProductAttribute>();
+ for(ProductAttribute attribute : attributeItems) {
+ OrderProductAttribute orderProductAttribute = new OrderProductAttribute();
+ orderProductAttribute.setOrderProduct(target);
+ Long id = attribute.getId();
+ com.salesmanager.core.model.catalog.product.attribute.ProductAttribute attr = productAttributeService.getById(id);
+ if(attr==null) {
+ throw new ConversionException("Attribute id " + id + " does not exists");
+ }
+
+ if(attr.getProduct().getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ throw new ConversionException("Attribute id " + id + " invalid for this store");
+ }
+
+ orderProductAttribute.setProductAttributeIsFree(attr.getProductAttributeIsFree());
+ orderProductAttribute.setProductAttributeName(attr.getProductOption().getDescriptionsSettoList().get(0).getName());
+ orderProductAttribute.setProductAttributeValueName(attr.getProductOptionValue().getDescriptionsSettoList().get(0).getName());
+ orderProductAttribute.setProductAttributePrice(attr.getProductAttributePrice());
+ orderProductAttribute.setProductAttributeWeight(attr.getProductAttributeWeight());
+ orderProductAttribute.setProductOptionId(attr.getProductOption().getId());
+ orderProductAttribute.setProductOptionValueId(attr.getProductOptionValue().getId());
+ attributes.add(orderProductAttribute);
+ }
+ target.setOrderAttributes(attributes);
+ }
+
+
+ } catch (Exception e) {
+ throw new ConversionException(e);
+ }
+
+
+ return target;
+ }
+
+ @Override
+ protected OrderProduct createTarget() {
+ return null;
+ }
+
+ public void setProductService(ProductService productService) {
+ this.productService = productService;
+ }
+
+ public ProductService getProductService() {
+ return productService;
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/order/ReadableOrderPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/order/ReadableOrderPopulator.java
index 4c712f8..cadcb8a 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/order/ReadableOrderPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/order/ReadableOrderPopulator.java
@@ -1,159 +1,175 @@
-package com.salesmanager.shop.populator.order;
-
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.Order;
-import com.salesmanager.core.model.order.OrderTotal;
-import com.salesmanager.core.model.order.OrderTotalType;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.model.customer.Address;
-import com.salesmanager.shop.model.customer.ReadableDelivery;
-import com.salesmanager.shop.model.order.ReadableOrder;
-
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
-
-public class ReadableOrderPopulator extends
- AbstractDataPopulator<Order, ReadableOrder> {
-
- @Override
- public ReadableOrder populate(Order source, ReadableOrder target,
- MerchantStore store, Language language) throws ConversionException {
-
-
-
- target.setId(source.getId());
- target.setDatePurchased(source.getDatePurchased());
- target.setOrderStatus(source.getStatus());
- target.setCurrency(source.getCurrency().getCode());
- target.setCurrencyModel(source.getCurrency());
- if(source.getCustomerAgreement()!=null) {
- target.setCustomerAgreed(source.getCustomerAgreement());
- }
- if(source.getConfirmedAddress()!=null) {
- target.setConfirmedAddress(source.getConfirmedAddress());
- }
-
- com.salesmanager.shop.model.order.OrderTotal taxTotal = null;
- com.salesmanager.shop.model.order.OrderTotal shippingTotal = null;
-
-
- if(source.getBilling()!=null) {
- Address address = new Address();
- address.setCity(source.getBilling().getCity());
- address.setAddress(source.getBilling().getAddress());
- address.setCompany(source.getBilling().getCompany());
- address.setFirstName(source.getBilling().getFirstName());
- address.setLastName(source.getBilling().getLastName());
- address.setPostalCode(source.getBilling().getPostalCode());
- address.setPhone(source.getBilling().getTelephone());
- if(source.getBilling().getCountry()!=null) {
- address.setCountry(source.getBilling().getCountry().getIsoCode());
- }
- if(source.getBilling().getZone()!=null) {
- address.setZone(source.getBilling().getZone().getCode());
- }
-
- target.setBilling(address);
- }
-
- if(source.getDelivery()!=null) {
- ReadableDelivery address = new ReadableDelivery();
- address.setCity(source.getDelivery().getCity());
- address.setAddress(source.getDelivery().getAddress());
- address.setCompany(source.getDelivery().getCompany());
- address.setFirstName(source.getDelivery().getFirstName());
- address.setLastName(source.getDelivery().getLastName());
- address.setPostalCode(source.getDelivery().getPostalCode());
- address.setPhone(source.getDelivery().getTelephone());
- if(source.getDelivery().getCountry()!=null) {
- address.setCountry(source.getDelivery().getCountry().getIsoCode());
- }
- if(source.getDelivery().getZone()!=null) {
- address.setZone(source.getDelivery().getZone().getCode());
- }
-
- target.setDelivery(address);
- }
-
- List<com.salesmanager.shop.model.order.OrderTotal> totals = new ArrayList<com.salesmanager.shop.model.order.OrderTotal>();
- for(OrderTotal t : source.getOrderTotal()) {
- if(t.getOrderTotalType()==null) {
- continue;
- }
- if(t.getOrderTotalType().name().equals(OrderTotalType.TOTAL.name())) {
- com.salesmanager.shop.model.order.OrderTotal totalTotal = createTotal(t);
- target.setTotal(totalTotal);
- totals.add(totalTotal);
- }
- else if(t.getOrderTotalType().name().equals(OrderTotalType.TAX.name())) {
- com.salesmanager.shop.model.order.OrderTotal totalTotal = createTotal(t);
- if(taxTotal==null) {
- taxTotal = totalTotal;
- } else {
- BigDecimal v = taxTotal.getValue();
- v = v.add(totalTotal.getValue());
- taxTotal.setValue(v);
- }
- target.setTax(totalTotal);
- totals.add(totalTotal);
- }
- else if(t.getOrderTotalType().name().equals(OrderTotalType.SHIPPING.name())) {
- com.salesmanager.shop.model.order.OrderTotal totalTotal = createTotal(t);
- if(shippingTotal==null) {
- shippingTotal = totalTotal;
- } else {
- BigDecimal v = shippingTotal.getValue();
- v = v.add(totalTotal.getValue());
- shippingTotal.setValue(v);
- }
- target.setShipping(totalTotal);
- totals.add(totalTotal);
- }
- else if(t.getOrderTotalType().name().equals(OrderTotalType.HANDLING.name())) {
- com.salesmanager.shop.model.order.OrderTotal totalTotal = createTotal(t);
- if(shippingTotal==null) {
- shippingTotal = totalTotal;
- } else {
- BigDecimal v = shippingTotal.getValue();
- v = v.add(totalTotal.getValue());
- shippingTotal.setValue(v);
- }
- target.setShipping(totalTotal);
- totals.add(totalTotal);
- }
- else if(t.getOrderTotalType().name().equals(OrderTotalType.SUBTOTAL.name())) {
- com.salesmanager.shop.model.order.OrderTotal subTotal = createTotal(t);
- totals.add(subTotal);
-
- }
- else {
- com.salesmanager.shop.model.order.OrderTotal otherTotal = createTotal(t);
- totals.add(otherTotal);
- }
- }
-
- target.setTotals(totals);
-
- return target;
- }
-
- private com.salesmanager.shop.model.order.OrderTotal createTotal(OrderTotal t) {
- com.salesmanager.shop.model.order.OrderTotal totalTotal = new com.salesmanager.shop.model.order.OrderTotal();
- totalTotal.setCode(t.getOrderTotalCode());
- totalTotal.setId(t.getId());
- totalTotal.setModule(t.getModule());
- totalTotal.setOrder(t.getSortOrder());
- totalTotal.setValue(t.getValue());
- return totalTotal;
- }
-
- @Override
- protected ReadableOrder createTarget() {
-
- return null;
- }
-
-}
+package com.salesmanager.shop.populator.order;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.order.OrderTotal;
+import com.salesmanager.core.model.order.OrderTotalType;
+import com.salesmanager.core.model.order.attributes.OrderAttribute;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.customer.Address;
+import com.salesmanager.shop.model.customer.ReadableDelivery;
+import com.salesmanager.shop.model.order.ReadableOrder;
+
+public class ReadableOrderPopulator extends
+ AbstractDataPopulator<Order, ReadableOrder> {
+
+ @Override
+ public ReadableOrder populate(Order source, ReadableOrder target,
+ MerchantStore store, Language language) throws ConversionException {
+
+
+
+ target.setId(source.getId());
+ target.setDatePurchased(source.getDatePurchased());
+ target.setOrderStatus(source.getStatus());
+ target.setCurrency(source.getCurrency().getCode());
+ target.setCurrencyModel(source.getCurrency());
+
+ target.setPaymentType(source.getPaymentType());
+ target.setPaymentModule(source.getPaymentModuleCode());
+ target.setShippingModule(source.getShippingModuleCode());
+
+
+ if(source.getCustomerAgreement()!=null) {
+ target.setCustomerAgreed(source.getCustomerAgreement());
+ }
+ if(source.getConfirmedAddress()!=null) {
+ target.setConfirmedAddress(source.getConfirmedAddress());
+ }
+
+ com.salesmanager.shop.model.order.total.OrderTotal taxTotal = null;
+ com.salesmanager.shop.model.order.total.OrderTotal shippingTotal = null;
+
+
+ if(source.getBilling()!=null) {
+ Address address = new Address();
+ address.setCity(source.getBilling().getCity());
+ address.setAddress(source.getBilling().getAddress());
+ address.setCompany(source.getBilling().getCompany());
+ address.setFirstName(source.getBilling().getFirstName());
+ address.setLastName(source.getBilling().getLastName());
+ address.setPostalCode(source.getBilling().getPostalCode());
+ address.setPhone(source.getBilling().getTelephone());
+ if(source.getBilling().getCountry()!=null) {
+ address.setCountry(source.getBilling().getCountry().getIsoCode());
+ }
+ if(source.getBilling().getZone()!=null) {
+ address.setZone(source.getBilling().getZone().getCode());
+ }
+
+ target.setBilling(address);
+ }
+
+ if(source.getOrderAttributes()!=null && source.getOrderAttributes().size()>0) {
+ for(OrderAttribute attr : source.getOrderAttributes()) {
+ com.salesmanager.shop.model.order.OrderAttribute a = new com.salesmanager.shop.model.order.OrderAttribute();
+ a.setKey(attr.getKey());
+ a.setValue(attr.getValue());
+ target.getAttributes().add(a);
+ }
+ }
+
+ if(source.getDelivery()!=null) {
+ ReadableDelivery address = new ReadableDelivery();
+ address.setCity(source.getDelivery().getCity());
+ address.setAddress(source.getDelivery().getAddress());
+ address.setCompany(source.getDelivery().getCompany());
+ address.setFirstName(source.getDelivery().getFirstName());
+ address.setLastName(source.getDelivery().getLastName());
+ address.setPostalCode(source.getDelivery().getPostalCode());
+ address.setPhone(source.getDelivery().getTelephone());
+ if(source.getDelivery().getCountry()!=null) {
+ address.setCountry(source.getDelivery().getCountry().getIsoCode());
+ }
+ if(source.getDelivery().getZone()!=null) {
+ address.setZone(source.getDelivery().getZone().getCode());
+ }
+
+ target.setDelivery(address);
+ }
+
+ List<com.salesmanager.shop.model.order.total.OrderTotal> totals = new ArrayList<com.salesmanager.shop.model.order.total.OrderTotal>();
+ for(OrderTotal t : source.getOrderTotal()) {
+ if(t.getOrderTotalType()==null) {
+ continue;
+ }
+ if(t.getOrderTotalType().name().equals(OrderTotalType.TOTAL.name())) {
+ com.salesmanager.shop.model.order.total.OrderTotal totalTotal = createTotal(t);
+ target.setTotal(totalTotal);
+ totals.add(totalTotal);
+ }
+ else if(t.getOrderTotalType().name().equals(OrderTotalType.TAX.name())) {
+ com.salesmanager.shop.model.order.total.OrderTotal totalTotal = createTotal(t);
+ if(taxTotal==null) {
+ taxTotal = totalTotal;
+ } else {
+ BigDecimal v = taxTotal.getValue();
+ v = v.add(totalTotal.getValue());
+ taxTotal.setValue(v);
+ }
+ target.setTax(totalTotal);
+ totals.add(totalTotal);
+ }
+ else if(t.getOrderTotalType().name().equals(OrderTotalType.SHIPPING.name())) {
+ com.salesmanager.shop.model.order.total.OrderTotal totalTotal = createTotal(t);
+ if(shippingTotal==null) {
+ shippingTotal = totalTotal;
+ } else {
+ BigDecimal v = shippingTotal.getValue();
+ v = v.add(totalTotal.getValue());
+ shippingTotal.setValue(v);
+ }
+ target.setShipping(totalTotal);
+ totals.add(totalTotal);
+ }
+ else if(t.getOrderTotalType().name().equals(OrderTotalType.HANDLING.name())) {
+ com.salesmanager.shop.model.order.total.OrderTotal totalTotal = createTotal(t);
+ if(shippingTotal==null) {
+ shippingTotal = totalTotal;
+ } else {
+ BigDecimal v = shippingTotal.getValue();
+ v = v.add(totalTotal.getValue());
+ shippingTotal.setValue(v);
+ }
+ target.setShipping(totalTotal);
+ totals.add(totalTotal);
+ }
+ else if(t.getOrderTotalType().name().equals(OrderTotalType.SUBTOTAL.name())) {
+ com.salesmanager.shop.model.order.total.OrderTotal subTotal = createTotal(t);
+ totals.add(subTotal);
+
+ }
+ else {
+ com.salesmanager.shop.model.order.total.OrderTotal otherTotal = createTotal(t);
+ totals.add(otherTotal);
+ }
+ }
+
+ target.setTotals(totals);
+
+ return target;
+ }
+
+ private com.salesmanager.shop.model.order.total.OrderTotal createTotal(OrderTotal t) {
+ com.salesmanager.shop.model.order.total.OrderTotal totalTotal = new com.salesmanager.shop.model.order.total.OrderTotal();
+ totalTotal.setCode(t.getOrderTotalCode());
+ totalTotal.setId(t.getId());
+ totalTotal.setModule(t.getModule());
+ totalTotal.setOrder(t.getSortOrder());
+ totalTotal.setValue(t.getValue());
+ return totalTotal;
+ }
+
+ @Override
+ protected ReadableOrder createTarget() {
+
+ return null;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/order/ReadableOrderSummaryPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/order/ReadableOrderSummaryPopulator.java
new file mode 100644
index 0000000..805d32b
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/order/ReadableOrderSummaryPopulator.java
@@ -0,0 +1,97 @@
+package com.salesmanager.shop.populator.order;
+
+import org.apache.commons.lang3.Validate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.CollectionUtils;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.OrderTotal;
+import com.salesmanager.core.model.order.OrderTotalSummary;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.order.ReadableOrderTotalSummary;
+import com.salesmanager.shop.model.order.total.ReadableOrderTotal;
+import com.salesmanager.shop.utils.LabelUtils;
+
+public class ReadableOrderSummaryPopulator extends AbstractDataPopulator<OrderTotalSummary, ReadableOrderTotalSummary> {
+
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(ReadableOrderSummaryPopulator.class);
+
+ private PricingService pricingService;
+
+ private LabelUtils messages;
+
+
+
+ @Override
+ public ReadableOrderTotalSummary populate(OrderTotalSummary source, ReadableOrderTotalSummary target,
+ MerchantStore store, Language language) throws ConversionException {
+
+ Validate.notNull(pricingService,"PricingService must be set");
+ Validate.notNull(messages,"LabelUtils must be set");
+
+ if(target==null) {
+ target = new ReadableOrderTotalSummary();
+ }
+
+ try {
+
+ if(source.getSubTotal() != null) {
+ target.setSubTotal(pricingService.getDisplayAmount(source.getSubTotal(), store));
+ }
+ if(source.getTaxTotal()!=null) {
+ target.setTaxTotal(pricingService.getDisplayAmount(source.getTaxTotal(), store));
+ }
+ if(source.getTotal() != null) {
+ target.setTotal(pricingService.getDisplayAmount(source.getTotal(), store));
+ }
+
+ if(!CollectionUtils.isEmpty(source.getTotals())) {
+ ReadableOrderTotalPopulator orderTotalPopulator = new ReadableOrderTotalPopulator();
+ orderTotalPopulator.setMessages(messages);
+ orderTotalPopulator.setPricingService(pricingService);
+ for(OrderTotal orderTotal : source.getTotals()) {
+ ReadableOrderTotal t = new ReadableOrderTotal();
+ orderTotalPopulator.populate(orderTotal, t, store, language);
+ target.getTotals().add(t);
+ }
+ }
+
+
+ } catch(Exception e) {
+ LOGGER.error("Error during amount formatting " + e.getMessage());
+ throw new ConversionException(e);
+ }
+
+ return target;
+
+ }
+
+ @Override
+ protected ReadableOrderTotalSummary createTarget() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+
+ public PricingService getPricingService() {
+ return pricingService;
+ }
+
+ public void setPricingService(PricingService pricingService) {
+ this.pricingService = pricingService;
+ }
+
+ public LabelUtils getMessages() {
+ return messages;
+ }
+
+ public void setMessages(LabelUtils messages) {
+ this.messages = messages;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/order/ReadableOrderTotalPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/order/ReadableOrderTotalPopulator.java
index 70b8002..bea8079 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/order/ReadableOrderTotalPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/order/ReadableOrderTotalPopulator.java
@@ -7,7 +7,7 @@ import com.salesmanager.core.business.utils.AbstractDataPopulator;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.order.OrderTotal;
import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.model.order.ReadableOrderTotal;
+import com.salesmanager.shop.model.order.total.ReadableOrderTotal;
import com.salesmanager.shop.utils.LabelUtils;
import com.salesmanager.shop.utils.LocaleUtils;
import org.apache.commons.lang.Validate;
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/order/ReadableShippingSummaryPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/order/ReadableShippingSummaryPopulator.java
index c730851..ee12774 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/order/ReadableShippingSummaryPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/order/ReadableShippingSummaryPopulator.java
@@ -9,7 +9,7 @@ import com.salesmanager.core.model.reference.language.Language;
import com.salesmanager.core.model.shipping.ShippingSummary;
import com.salesmanager.core.business.utils.AbstractDataPopulator;
import com.salesmanager.shop.model.customer.ReadableDelivery;
-import com.salesmanager.shop.model.order.ReadableShippingSummary;
+import com.salesmanager.shop.model.order.shipping.ReadableShippingSummary;
public class ReadableShippingSummaryPopulator extends
AbstractDataPopulator<ShippingSummary, ReadableShippingSummary> {
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/order/ShoppingCartItemPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/order/ShoppingCartItemPopulator.java
index fda655c..3c06f17 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/order/ShoppingCartItemPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/order/ShoppingCartItemPopulator.java
@@ -1,87 +1,87 @@
-package com.salesmanager.shop.populator.order;
-
-import org.apache.commons.lang3.Validate;
-
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
-import com.salesmanager.core.business.services.catalog.product.ProductService;
-import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
-import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.shop.model.order.PersistableOrderProduct;
-
-public class ShoppingCartItemPopulator extends
- AbstractDataPopulator<PersistableOrderProduct, ShoppingCartItem> {
-
-
- private ProductService productService;
- private ProductAttributeService productAttributeService;
- private ShoppingCartService shoppingCartService;
-
- @Override
- public ShoppingCartItem populate(PersistableOrderProduct source,
- ShoppingCartItem target, MerchantStore store, Language language)
- throws ConversionException {
- Validate.notNull(productService, "Requires to set productService");
- Validate.notNull(productAttributeService, "Requires to set productAttributeService");
- Validate.notNull(shoppingCartService, "Requires to set shoppingCartService");
-
- Product product = productService.getById(source.getProduct().getId());
- if(source.getAttributes()!=null) {
-
- for(com.salesmanager.shop.model.catalog.product.attribute.ProductAttribute attr : source.getAttributes()) {
- ProductAttribute attribute = productAttributeService.getById(attr.getId());
- if(attribute==null) {
- throw new ConversionException("ProductAttribute with id " + attr.getId() + " is null");
- }
- if(attribute.getProduct().getId().longValue()!=source.getProduct().getId().longValue()) {
- throw new ConversionException("ProductAttribute with id " + attr.getId() + " is not assigned to Product id " + source.getProduct().getId());
- }
- product.getAttributes().add(attribute);
- }
- }
-
- try {
- return shoppingCartService.populateShoppingCartItem(product);
- } catch (ServiceException e) {
- throw new ConversionException(e);
- }
-
- }
-
- @Override
- protected ShoppingCartItem createTarget() {
- // TODO Auto-generated method stub
- return null;
- }
-
- public void setProductAttributeService(ProductAttributeService productAttributeService) {
- this.productAttributeService = productAttributeService;
- }
-
- public ProductAttributeService getProductAttributeService() {
- return productAttributeService;
- }
-
- public void setProductService(ProductService productService) {
- this.productService = productService;
- }
-
- public ProductService getProductService() {
- return productService;
- }
-
- public void setShoppingCartService(ShoppingCartService shoppingCartService) {
- this.shoppingCartService = shoppingCartService;
- }
-
- public ShoppingCartService getShoppingCartService() {
- return shoppingCartService;
- }
-
-}
+package com.salesmanager.shop.populator.order;
+
+import org.apache.commons.lang3.Validate;
+
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
+import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.shop.model.order.PersistableOrderProduct;
+
+public class ShoppingCartItemPopulator extends
+ AbstractDataPopulator<PersistableOrderProduct, ShoppingCartItem> {
+
+
+ private ProductService productService;
+ private ProductAttributeService productAttributeService;
+ private ShoppingCartService shoppingCartService;
+
+ @Override
+ public ShoppingCartItem populate(PersistableOrderProduct source,
+ ShoppingCartItem target, MerchantStore store, Language language)
+ throws ConversionException {
+ Validate.notNull(productService, "Requires to set productService");
+ Validate.notNull(productAttributeService, "Requires to set productAttributeService");
+ Validate.notNull(shoppingCartService, "Requires to set shoppingCartService");
+
+ Product product = productService.getById(source.getProduct().getId());
+ if(source.getAttributes()!=null) {
+
+ for(com.salesmanager.shop.model.catalog.product.attribute.ProductAttribute attr : source.getAttributes()) {
+ ProductAttribute attribute = productAttributeService.getById(attr.getId());
+ if(attribute==null) {
+ throw new ConversionException("ProductAttribute with id " + attr.getId() + " is null");
+ }
+ if(attribute.getProduct().getId().longValue()!=source.getProduct().getId().longValue()) {
+ throw new ConversionException("ProductAttribute with id " + attr.getId() + " is not assigned to Product id " + source.getProduct().getId());
+ }
+ product.getAttributes().add(attribute);
+ }
+ }
+
+ try {
+ return shoppingCartService.populateShoppingCartItem(product);
+ } catch (ServiceException e) {
+ throw new ConversionException(e);
+ }
+
+ }
+
+ @Override
+ protected ShoppingCartItem createTarget() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public void setProductAttributeService(ProductAttributeService productAttributeService) {
+ this.productAttributeService = productAttributeService;
+ }
+
+ public ProductAttributeService getProductAttributeService() {
+ return productAttributeService;
+ }
+
+ public void setProductService(ProductService productService) {
+ this.productService = productService;
+ }
+
+ public ProductService getProductService() {
+ return productService;
+ }
+
+ public void setShoppingCartService(ShoppingCartService shoppingCartService) {
+ this.shoppingCartService = shoppingCartService;
+ }
+
+ public ShoppingCartService getShoppingCartService() {
+ return shoppingCartService;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/order/transaction/PersistablePaymentPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/order/transaction/PersistablePaymentPopulator.java
new file mode 100644
index 0000000..e5ae1fa
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/order/transaction/PersistablePaymentPopulator.java
@@ -0,0 +1,67 @@
+package com.salesmanager.shop.populator.order.transaction;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.lang3.Validate;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.payments.Payment;
+import com.salesmanager.core.model.payments.PaymentType;
+import com.salesmanager.core.model.payments.TransactionType;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.order.transaction.PersistablePayment;
+
+public class PersistablePaymentPopulator extends AbstractDataPopulator<PersistablePayment, Payment> {
+
+
+ PricingService pricingService;
+
+
+
+ @Override
+ public Payment populate(PersistablePayment source, Payment target, MerchantStore store, Language language)
+ throws ConversionException {
+
+ Validate.notNull(source,"PersistablePayment cannot be null");
+ Validate.notNull(pricingService,"pricingService must be set");
+ if(target == null) {
+ target = new Payment();
+ }
+
+ try {
+
+ target.setAmount(pricingService.getAmount(source.getAmount()));
+ target.setModuleName(source.getPaymentModule());
+ target.setPaymentType(PaymentType.valueOf(source.getPaymentType()));
+ target.setTransactionType(TransactionType.valueOf(source.getTransactionType()));
+
+ Map<String,String> metadata = new HashMap<String,String>();
+ metadata.put("paymentToken", source.getPaymentToken());
+ target.setPaymentMetaData(metadata);
+
+ return target;
+
+ } catch(Exception e) {
+ throw new ConversionException(e);
+ }
+ }
+
+ @Override
+ protected Payment createTarget() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public PricingService getPricingService() {
+ return pricingService;
+ }
+
+ public void setPricingService(PricingService pricingService) {
+ this.pricingService = pricingService;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/order/transaction/PersistableTransactionPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/order/transaction/PersistableTransactionPopulator.java
new file mode 100644
index 0000000..8cad17f
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/order/transaction/PersistableTransactionPopulator.java
@@ -0,0 +1,89 @@
+package com.salesmanager.shop.populator.order.transaction;
+
+import org.apache.commons.lang.Validate;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.order.OrderService;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.payments.PaymentType;
+import com.salesmanager.core.model.payments.Transaction;
+import com.salesmanager.core.model.payments.TransactionType;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.order.transaction.PersistableTransaction;
+import com.shopizer.search.utils.DateUtil;
+
+public class PersistableTransactionPopulator extends AbstractDataPopulator<PersistableTransaction, Transaction> {
+
+ private OrderService orderService;
+ private PricingService pricingService;
+
+ @Override
+ public Transaction populate(PersistableTransaction source, Transaction target, MerchantStore store,
+ Language language) throws ConversionException {
+
+ Validate.notNull(source,"PersistableTransaction must not be null");
+ Validate.notNull(orderService,"OrderService must not be null");
+ Validate.notNull(pricingService,"OrderService must not be null");
+
+ if(target == null) {
+ target = new Transaction();
+ }
+
+
+ try {
+
+
+ target.setAmount(pricingService.getAmount(source.getAmount()));
+ target.setDetails(source.getDetails());
+ target.setPaymentType(PaymentType.valueOf(source.getPaymentType()));
+ target.setTransactionType(TransactionType.valueOf(source.getTransactionType()));
+ target.setTransactionDate(DateUtil.formatDate(source.getTransactionDate()));
+
+ if(source.getOrderId()!=null && source.getOrderId().longValue() > 0) {
+ Order order = orderService.getById(source.getOrderId());
+/* if(source.getCustomerId() == null) {
+ throw new ConversionException("Cannot add a transaction for an Order without specyfing the customer");
+ }*/
+
+ if(order == null) {
+ throw new ConversionException("Order with id " + source.getOrderId() + "does not exist");
+ }
+ target.setOrder(order);
+ }
+
+ return target;
+
+
+
+ } catch(Exception e) {
+ throw new ConversionException(e);
+ }
+
+ }
+
+ @Override
+ protected Transaction createTarget() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public OrderService getOrderService() {
+ return orderService;
+ }
+
+ public void setOrderService(OrderService orderService) {
+ this.orderService = orderService;
+ }
+
+ public PricingService getPricingService() {
+ return pricingService;
+ }
+
+ public void setPricingService(PricingService pricingService) {
+ this.pricingService = pricingService;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/order/transaction/ReadableTransactionPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/order/transaction/ReadableTransactionPopulator.java
new file mode 100644
index 0000000..8184e82
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/order/transaction/ReadableTransactionPopulator.java
@@ -0,0 +1,83 @@
+package com.salesmanager.shop.populator.order.transaction;
+
+import org.apache.commons.lang.Validate;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.order.OrderService;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.payments.Transaction;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.order.transaction.ReadableTransaction;
+import com.salesmanager.shop.utils.DateUtil;
+
+
+public class ReadableTransactionPopulator extends AbstractDataPopulator<Transaction, ReadableTransaction> {
+
+
+ private OrderService orderService;
+ private PricingService pricingService;
+
+ @Override
+ public ReadableTransaction populate(Transaction source, ReadableTransaction target, MerchantStore store,
+ Language language) throws ConversionException {
+
+
+ Validate.notNull(source,"PersistableTransaction must not be null");
+ Validate.notNull(orderService,"OrderService must not be null");
+ Validate.notNull(pricingService,"OrderService must not be null");
+
+ if(target == null) {
+ target = new ReadableTransaction();
+ }
+
+
+ try {
+
+
+ target.setAmount(pricingService.getDisplayAmount(source.getAmount(), store));
+ target.setDetails(source.getDetails());
+ target.setPaymentType(source.getPaymentType());
+ target.setTransactionType(source.getTransactionType());
+ target.setTransactionDate(DateUtil.formatDate(source.getTransactionDate()));
+ target.setId(source.getId());
+
+ if(source.getOrder() != null) {
+ target.setOrderId(source.getOrder().getId());
+
+ }
+
+ return target;
+
+
+
+ } catch(Exception e) {
+ throw new ConversionException(e);
+ }
+
+ }
+
+ @Override
+ protected ReadableTransaction createTarget() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public OrderService getOrderService() {
+ return orderService;
+ }
+
+ public void setOrderService(OrderService orderService) {
+ this.orderService = orderService;
+ }
+
+ public PricingService getPricingService() {
+ return pricingService;
+ }
+
+ public void setPricingService(PricingService pricingService) {
+ this.pricingService = pricingService;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/shoppingCart/ReadableShoppingCartPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/shoppingCart/ReadableShoppingCartPopulator.java
new file mode 100644
index 0000000..b051fd8
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/shoppingCart/ReadableShoppingCartPopulator.java
@@ -0,0 +1,249 @@
+package com.salesmanager.shop.populator.shoppingCart;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.Validate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
+import com.salesmanager.core.business.services.shoppingcart.ShoppingCartCalculationService;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
+import com.salesmanager.core.model.catalog.product.attribute.ProductOption;
+import com.salesmanager.core.model.catalog.product.attribute.ProductOptionDescription;
+import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValue;
+import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValueDescription;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.OrderSummary;
+import com.salesmanager.core.model.order.OrderTotalSummary;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.shoppingcart.ShoppingCart;
+import com.salesmanager.shop.model.order.total.ReadableOrderTotal;
+import com.salesmanager.shop.model.shoppingcart.ReadableShoppingCart;
+import com.salesmanager.shop.model.shoppingcart.ReadableShoppingCartAttribute;
+import com.salesmanager.shop.model.shoppingcart.ReadableShoppingCartAttributeOption;
+import com.salesmanager.shop.model.shoppingcart.ReadableShoppingCartAttributeOptionValue;
+import com.salesmanager.shop.model.shoppingcart.ReadableShoppingCartItem;
+import com.salesmanager.shop.populator.catalog.ReadableProductPopulator;
+import com.salesmanager.shop.utils.ImageFilePath;
+
+public class ReadableShoppingCartPopulator extends AbstractDataPopulator<ShoppingCart, ReadableShoppingCart> {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ReadableShoppingCartPopulator.class);
+
+ private PricingService pricingService;
+ private ShoppingCartCalculationService shoppingCartCalculationService;
+ private ProductAttributeService productAttributeService;
+
+ private ImageFilePath imageUtils;
+
+ @Override
+ public ReadableShoppingCart populate(ShoppingCart source, ReadableShoppingCart target, MerchantStore store,
+ Language language) throws ConversionException {
+ Validate.notNull(source, "Requires ShoppingCart");
+ Validate.notNull(language, "Requires Language not null");
+ Validate.notNull(store, "Requires MerchantStore not null");
+ Validate.notNull(pricingService, "Requires to set pricingService");
+ Validate.notNull(productAttributeService, "Requires to set productAttributeService");
+ Validate.notNull(shoppingCartCalculationService, "Requires to set shoppingCartCalculationService");
+ Validate.notNull(imageUtils, "Requires to set imageUtils");
+
+ if(target == null) {
+ target = new ReadableShoppingCart();
+ }
+ target.setCode(source.getShoppingCartCode());
+ int cartQuantity = 0;
+
+ target.setCustomer(source.getCustomerId());
+
+ try {
+
+ Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> items = source.getLineItems();
+
+ if(items!=null) {
+
+ for(com.salesmanager.core.model.shoppingcart.ShoppingCartItem item : items) {
+
+
+ ReadableShoppingCartItem shoppingCartItem = new ReadableShoppingCartItem();
+
+ ReadableProductPopulator readableProductPopulator = new ReadableProductPopulator();
+ readableProductPopulator.setPricingService(pricingService);
+ readableProductPopulator.setimageUtils(imageUtils);
+ readableProductPopulator.populate(item.getProduct(), shoppingCartItem, store, language);
+
+
+
+ shoppingCartItem.setPrice(item.getItemPrice());
+ shoppingCartItem.setFinalPrice(pricingService.getDisplayAmount(item.getItemPrice(),store));
+
+ shoppingCartItem.setQuantity(item.getQuantity());
+
+ cartQuantity = cartQuantity + item.getQuantity();
+
+ BigDecimal subTotal = pricingService.calculatePriceQuantity(item.getItemPrice(), item.getQuantity());
+
+ //calculate sub total (price * quantity)
+ shoppingCartItem.setSubTotal(subTotal);
+
+ shoppingCartItem.setDisplaySubTotal(pricingService.getDisplayAmount(subTotal,store));
+
+
+ Set<com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem> attributes = item.getAttributes();
+ if(attributes!=null) {
+ for(com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem attribute : attributes) {
+
+ ProductAttribute productAttribute = productAttributeService.getById(attribute.getProductAttributeId());
+
+ if(productAttribute==null) {
+ LOGGER.warn("Product attribute with ID " + attribute.getId() + " not found, skipping cart attribute " + attribute.getId());
+ continue;
+ }
+
+ ReadableShoppingCartAttribute cartAttribute = new ReadableShoppingCartAttribute();
+
+
+ cartAttribute.setId(attribute.getId());
+
+ ProductOption option = productAttribute.getProductOption();
+ ProductOptionValue optionValue = productAttribute.getProductOptionValue();
+
+
+ List<ProductOptionDescription> optionDescriptions = option.getDescriptionsSettoList();
+ List<ProductOptionValueDescription> optionValueDescriptions = optionValue.getDescriptionsSettoList();
+
+ String optName = null;
+ String optValue = null;
+ if(!CollectionUtils.isEmpty(optionDescriptions) && !CollectionUtils.isEmpty(optionValueDescriptions)) {
+
+ optName = optionDescriptions.get(0).getName();
+ optValue = optionValueDescriptions.get(0).getName();
+
+ for(ProductOptionDescription optionDescription : optionDescriptions) {
+ if(optionDescription.getLanguage() != null && optionDescription.getLanguage().getId().intValue() == language.getId().intValue()) {
+ optName = optionDescription.getName();
+ break;
+ }
+ }
+
+ for(ProductOptionValueDescription optionValueDescription : optionValueDescriptions) {
+ if(optionValueDescription.getLanguage() != null && optionValueDescription.getLanguage().getId().intValue() == language.getId().intValue()) {
+ optValue = optionValueDescription.getName();
+ break;
+ }
+ }
+
+ }
+
+ if(optName != null) {
+ ReadableShoppingCartAttributeOption attributeOption = new ReadableShoppingCartAttributeOption();
+ attributeOption.setCode(option.getCode());
+ attributeOption.setId(option.getId());
+ attributeOption.setName(optName);
+ cartAttribute.setOption(attributeOption);
+ }
+
+ if(optValue != null) {
+ ReadableShoppingCartAttributeOptionValue attributeOptionValue = new ReadableShoppingCartAttributeOptionValue();
+ attributeOptionValue.setCode(optionValue.getCode());
+ attributeOptionValue.setId(optionValue.getId());
+ attributeOptionValue.setName(optValue);
+ cartAttribute.setOptionValue(attributeOptionValue);
+ }
+ shoppingCartItem.getCartItemattributes().add(cartAttribute);
+ }
+
+ }
+ target.getProducts().add(shoppingCartItem);
+ }
+ }
+
+ //Calculate totals using shoppingCartService
+ //OrderSummary contains ShoppingCart items
+
+ OrderSummary summary = new OrderSummary();
+ List<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> productsList = new ArrayList<com.salesmanager.core.model.shoppingcart.ShoppingCartItem>();
+ productsList.addAll(source.getLineItems());
+ summary.setProducts(productsList);
+
+ //OrdetTotalSummary contains all calculations
+
+ OrderTotalSummary orderSummary = shoppingCartCalculationService.calculate(source, store, language );
+
+ if(CollectionUtils.isNotEmpty(orderSummary.getTotals())) {
+ List<ReadableOrderTotal> totals = new ArrayList<ReadableOrderTotal>();
+ for(com.salesmanager.core.model.order.OrderTotal t : orderSummary.getTotals()) {
+ ReadableOrderTotal total = new ReadableOrderTotal();
+ total.setCode(t.getOrderTotalCode());
+ total.setValue(t.getValue());
+ totals.add(total);
+ }
+ target.setTotals(totals);
+ }
+
+ target.setSubtotal(orderSummary.getSubTotal());
+ target.setDisplaySubTotal(pricingService.getDisplayAmount(orderSummary.getSubTotal(), store));
+
+
+ target.setTotal(orderSummary.getTotal());
+ target.setDisplayTotal(pricingService.getDisplayAmount(orderSummary.getTotal(), store));
+
+
+ target.setQuantity(cartQuantity);
+ target.setId(source.getId());
+
+
+ } catch(Exception e) {
+ throw new ConversionException(e);
+ }
+
+ return target;
+
+
+ }
+
+ @Override
+ protected ReadableShoppingCart createTarget() {
+ return null;
+ }
+
+ public PricingService getPricingService() {
+ return pricingService;
+ }
+
+ public void setPricingService(PricingService pricingService) {
+ this.pricingService = pricingService;
+ }
+
+ public ShoppingCartCalculationService getShoppingCartCalculationService() {
+ return shoppingCartCalculationService;
+ }
+
+ public void setShoppingCartCalculationService(ShoppingCartCalculationService shoppingCartCalculationService) {
+ this.shoppingCartCalculationService = shoppingCartCalculationService;
+ }
+
+ public ImageFilePath getImageUtils() {
+ return imageUtils;
+ }
+
+ public void setImageUtils(ImageFilePath imageUtils) {
+ this.imageUtils = imageUtils;
+ }
+
+ public ProductAttributeService getProductAttributeService() {
+ return productAttributeService;
+ }
+
+ public void setProductAttributeService(ProductAttributeService productAttributeService) {
+ this.productAttributeService = productAttributeService;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/shoppingCart/ShoppingCartDataPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/shoppingCart/ShoppingCartDataPopulator.java
index b5d8008..3431e52 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/shoppingCart/ShoppingCartDataPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/shoppingCart/ShoppingCartDataPopulator.java
@@ -1,197 +1,228 @@
-/**
- *
- */
-package com.salesmanager.shop.populator.shoppingCart;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.catalog.product.PricingService;
-import com.salesmanager.core.business.services.shoppingcart.ShoppingCartCalculationService;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.core.model.catalog.product.attribute.ProductOptionDescription;
-import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValueDescription;
-import com.salesmanager.core.model.catalog.product.image.ProductImage;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.OrderSummary;
-import com.salesmanager.core.model.order.OrderTotalSummary;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.shoppingcart.ShoppingCart;
-import com.salesmanager.shop.model.order.OrderTotal;
-import com.salesmanager.shop.model.shoppingcart.ShoppingCartAttribute;
-import com.salesmanager.shop.model.shoppingcart.ShoppingCartData;
-import com.salesmanager.shop.model.shoppingcart.ShoppingCartItem;
-import com.salesmanager.shop.utils.ImageFilePath;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.configuration.ConversionException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-
-/**
- * @author Umesh A
- *
- */
-
-
-public class ShoppingCartDataPopulator extends AbstractDataPopulator<ShoppingCart,ShoppingCartData>
-{
-
- private static final Logger LOG = LoggerFactory.getLogger(ShoppingCartDataPopulator.class);
-
- private PricingService pricingService;
-
- private ShoppingCartCalculationService shoppingCartCalculationService;
-
- private ImageFilePath imageUtils;
-
- public ImageFilePath getimageUtils() {
- return imageUtils;
- }
-
-
-
-
- public void setimageUtils(ImageFilePath imageUtils) {
- this.imageUtils = imageUtils;
- }
-
-
-
- @Override
- public ShoppingCartData createTarget()
- {
-
- return new ShoppingCartData();
- }
-
-
-
- public ShoppingCartCalculationService getOrderService() {
- return shoppingCartCalculationService;
- }
-
-
-
- public PricingService getPricingService() {
- return pricingService;
- }
-
-
- @Override
- public ShoppingCartData populate(final ShoppingCart shoppingCart,
- final ShoppingCartData cart, final MerchantStore store, final Language language) {
-
- //Validate.notNull(imageUtils, "Requires to set imageUtils");
- int cartQuantity = 0;
- cart.setCode(shoppingCart.getShoppingCartCode());
- Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> items = shoppingCart.getLineItems();
- List<ShoppingCartItem> shoppingCartItemsList=Collections.emptyList();
- try{
- if(items!=null) {
- shoppingCartItemsList=new ArrayList<ShoppingCartItem>();
- for(com.salesmanager.core.model.shoppingcart.ShoppingCartItem item : items) {
-
- ShoppingCartItem shoppingCartItem = new ShoppingCartItem();
- shoppingCartItem.setCode(cart.getCode());
- shoppingCartItem.setProductCode(item.getProduct().getSku());
- shoppingCartItem.setProductVirtual(item.isProductVirtual());
-
- shoppingCartItem.setProductId(item.getProductId());
- shoppingCartItem.setId(item.getId());
- shoppingCartItem.setName(item.getProduct().getProductDescription().getName());
-
- shoppingCartItem.setPrice(pricingService.getDisplayAmount(item.getItemPrice(),store));
- shoppingCartItem.setQuantity(item.getQuantity());
-
-
- cartQuantity = cartQuantity + item.getQuantity();
-
- shoppingCartItem.setProductPrice(item.getItemPrice());
- shoppingCartItem.setSubTotal(pricingService.getDisplayAmount(item.getSubTotal(), store));
- ProductImage image = item.getProduct().getProductImage();
- if(image!=null && imageUtils!=null) {
- String imagePath = imageUtils.buildProductImageUtils(store, item.getProduct().getSku(), image.getProductImage());
- shoppingCartItem.setImage(imagePath);
- }
- Set<com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem> attributes = item.getAttributes();
- if(attributes!=null) {
- List<ShoppingCartAttribute> cartAttributes = new ArrayList<ShoppingCartAttribute>();
- for(com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem attribute : attributes) {
- ShoppingCartAttribute cartAttribute = new ShoppingCartAttribute();
- cartAttribute.setId(attribute.getId());
- cartAttribute.setAttributeId(attribute.getProductAttributeId());
- cartAttribute.setOptionId(attribute.getProductAttribute().getProductOption().getId());
- cartAttribute.setOptionValueId(attribute.getProductAttribute().getProductOptionValue().getId());
- List<ProductOptionDescription> optionDescriptions = attribute.getProductAttribute().getProductOption().getDescriptionsSettoList();
- List<ProductOptionValueDescription> optionValueDescriptions = attribute.getProductAttribute().getProductOptionValue().getDescriptionsSettoList();
- if(!CollectionUtils.isEmpty(optionDescriptions) && !CollectionUtils.isEmpty(optionValueDescriptions)) {
- cartAttribute.setOptionName(optionDescriptions.get(0).getName());
- cartAttribute.setOptionValue(optionValueDescriptions.get(0).getName());
- cartAttributes.add(cartAttribute);
- }
- }
- shoppingCartItem.setShoppingCartAttributes(cartAttributes);
- }
- shoppingCartItemsList.add(shoppingCartItem);
- }
- }
- if(CollectionUtils.isNotEmpty(shoppingCartItemsList)){
- cart.setShoppingCartItems(shoppingCartItemsList);
- }
-
- OrderSummary summary = new OrderSummary();
- List<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> productsList = new ArrayList<com.salesmanager.core.model.shoppingcart.ShoppingCartItem>();
- productsList.addAll(shoppingCart.getLineItems());
- summary.setProducts(productsList);
- OrderTotalSummary orderSummary = shoppingCartCalculationService.calculate(shoppingCart,store, language );
-
- if(CollectionUtils.isNotEmpty(orderSummary.getTotals())) {
- List<OrderTotal> totals = new ArrayList<OrderTotal>();
- for(com.salesmanager.core.model.order.OrderTotal t : orderSummary.getTotals()) {
- OrderTotal total = new OrderTotal();
- total.setCode(t.getOrderTotalCode());
- total.setValue(t.getValue());
- totals.add(total);
- }
- cart.setTotals(totals);
- }
-
- cart.setSubTotal(pricingService.getDisplayAmount(orderSummary.getSubTotal(), store));
- cart.setTotal(pricingService.getDisplayAmount(orderSummary.getTotal(), store));
- cart.setQuantity(cartQuantity);
- cart.setId(shoppingCart.getId());
- }
- catch(ServiceException ex){
- LOG.error( "Error while converting cart Model to cart Data.."+ex );
- throw new ConversionException( "Unable to create cart data", ex );
- }
- return cart;
-
-
- };
-
-
-
-
-
- public void setPricingService(final PricingService pricingService) {
- this.pricingService = pricingService;
- }
-
-
-
-
-
-
- public void setShoppingCartCalculationService(final ShoppingCartCalculationService shoppingCartCalculationService) {
- this.shoppingCartCalculationService = shoppingCartCalculationService;
- }
-
-
-
-
-}
+/**
+ *
+ */
+package com.salesmanager.shop.populator.shoppingCart;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.shoppingcart.ShoppingCartCalculationService;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.catalog.product.attribute.ProductOptionDescription;
+import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValueDescription;
+import com.salesmanager.core.model.catalog.product.description.ProductDescription;
+import com.salesmanager.core.model.catalog.product.image.ProductImage;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.OrderSummary;
+import com.salesmanager.core.model.order.OrderTotalSummary;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.shoppingcart.ShoppingCart;
+import com.salesmanager.shop.model.order.total.OrderTotal;
+import com.salesmanager.shop.model.shoppingcart.ShoppingCartAttribute;
+import com.salesmanager.shop.model.shoppingcart.ShoppingCartData;
+import com.salesmanager.shop.model.shoppingcart.ShoppingCartItem;
+import com.salesmanager.shop.utils.ImageFilePath;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.configuration.ConversionException;
+import org.apache.commons.lang3.Validate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+
+/**
+ * @author Umesh A
+ *
+ */
+
+
+public class ShoppingCartDataPopulator extends AbstractDataPopulator<ShoppingCart,ShoppingCartData>
+{
+
+ private static final Logger LOG = LoggerFactory.getLogger(ShoppingCartDataPopulator.class);
+
+ private PricingService pricingService;
+
+ private ShoppingCartCalculationService shoppingCartCalculationService;
+
+ private ImageFilePath imageUtils;
+
+ public ImageFilePath getimageUtils() {
+ return imageUtils;
+ }
+
+
+
+
+ public void setimageUtils(ImageFilePath imageUtils) {
+ this.imageUtils = imageUtils;
+ }
+
+
+
+ @Override
+ public ShoppingCartData createTarget()
+ {
+
+ return new ShoppingCartData();
+ }
+
+
+
+ public ShoppingCartCalculationService getOrderService() {
+ return shoppingCartCalculationService;
+ }
+
+
+
+ public PricingService getPricingService() {
+ return pricingService;
+ }
+
+
+ @Override
+ public ShoppingCartData populate(final ShoppingCart shoppingCart,
+ final ShoppingCartData cart, final MerchantStore store, final Language language) {
+
+ Validate.notNull(shoppingCart, "Requires ShoppingCart");
+ Validate.notNull(language, "Requires Language not null");
+ int cartQuantity = 0;
+ cart.setCode(shoppingCart.getShoppingCartCode());
+ Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> items = shoppingCart.getLineItems();
+ List<ShoppingCartItem> shoppingCartItemsList=Collections.emptyList();
+ try{
+ if(items!=null) {
+ shoppingCartItemsList=new ArrayList<ShoppingCartItem>();
+ for(com.salesmanager.core.model.shoppingcart.ShoppingCartItem item : items) {
+
+ ShoppingCartItem shoppingCartItem = new ShoppingCartItem();
+ shoppingCartItem.setCode(cart.getCode());
+ shoppingCartItem.setProductCode(item.getProduct().getSku());
+ shoppingCartItem.setProductVirtual(item.isProductVirtual());
+
+ shoppingCartItem.setProductId(item.getProductId());
+ shoppingCartItem.setId(item.getId());
+
+ String itemName = item.getProduct().getProductDescription().getName();
+ if(!CollectionUtils.isEmpty(item.getProduct().getDescriptions())) {
+ for(ProductDescription productDescription : item.getProduct().getDescriptions()) {
+ if(language != null && language.getId().intValue() == productDescription.getLanguage().getId().intValue()) {
+ itemName = productDescription.getName();
+ break;
+ }
+ }
+ }
+
+ shoppingCartItem.setName(itemName);
+
+ shoppingCartItem.setPrice(pricingService.getDisplayAmount(item.getItemPrice(),store));
+ shoppingCartItem.setQuantity(item.getQuantity());
+
+
+ cartQuantity = cartQuantity + item.getQuantity();
+
+ shoppingCartItem.setProductPrice(item.getItemPrice());
+ shoppingCartItem.setSubTotal(pricingService.getDisplayAmount(item.getSubTotal(), store));
+ ProductImage image = item.getProduct().getProductImage();
+ if(image!=null && imageUtils!=null) {
+ String imagePath = imageUtils.buildProductImageUtils(store, item.getProduct().getSku(), image.getProductImage());
+ shoppingCartItem.setImage(imagePath);
+ }
+ Set<com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem> attributes = item.getAttributes();
+ if(attributes!=null) {
+ List<ShoppingCartAttribute> cartAttributes = new ArrayList<ShoppingCartAttribute>();
+ for(com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem attribute : attributes) {
+ ShoppingCartAttribute cartAttribute = new ShoppingCartAttribute();
+ cartAttribute.setId(attribute.getId());
+ cartAttribute.setAttributeId(attribute.getProductAttributeId());
+ cartAttribute.setOptionId(attribute.getProductAttribute().getProductOption().getId());
+ cartAttribute.setOptionValueId(attribute.getProductAttribute().getProductOptionValue().getId());
+ List<ProductOptionDescription> optionDescriptions = attribute.getProductAttribute().getProductOption().getDescriptionsSettoList();
+ List<ProductOptionValueDescription> optionValueDescriptions = attribute.getProductAttribute().getProductOptionValue().getDescriptionsSettoList();
+ if(!CollectionUtils.isEmpty(optionDescriptions) && !CollectionUtils.isEmpty(optionValueDescriptions)) {
+
+ String optionName = optionDescriptions.get(0).getName();
+ String optionValue = optionValueDescriptions.get(0).getName();
+
+ for(ProductOptionDescription optionDescription : optionDescriptions) {
+ if(optionDescription.getLanguage() != null && optionDescription.getLanguage().getId().intValue() == language.getId().intValue()) {
+ optionName = optionDescription.getName();
+ break;
+ }
+ }
+
+ for(ProductOptionValueDescription optionValueDescription : optionValueDescriptions) {
+ if(optionValueDescription.getLanguage() != null && optionValueDescription.getLanguage().getId().intValue() == language.getId().intValue()) {
+ optionValue = optionValueDescription.getName();
+ break;
+ }
+ }
+ cartAttribute.setOptionName(optionName);
+ cartAttribute.setOptionValue(optionValue);
+ cartAttributes.add(cartAttribute);
+ }
+ }
+ shoppingCartItem.setShoppingCartAttributes(cartAttributes);
+ }
+ shoppingCartItemsList.add(shoppingCartItem);
+ }
+ }
+ if(CollectionUtils.isNotEmpty(shoppingCartItemsList)){
+ cart.setShoppingCartItems(shoppingCartItemsList);
+ }
+
+ OrderSummary summary = new OrderSummary();
+ List<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> productsList = new ArrayList<com.salesmanager.core.model.shoppingcart.ShoppingCartItem>();
+ productsList.addAll(shoppingCart.getLineItems());
+ summary.setProducts(productsList);
+ OrderTotalSummary orderSummary = shoppingCartCalculationService.calculate(shoppingCart,store, language );
+
+ if(CollectionUtils.isNotEmpty(orderSummary.getTotals())) {
+ List<OrderTotal> totals = new ArrayList<OrderTotal>();
+ for(com.salesmanager.core.model.order.OrderTotal t : orderSummary.getTotals()) {
+ OrderTotal total = new OrderTotal();
+ total.setCode(t.getOrderTotalCode());
+ total.setValue(t.getValue());
+ totals.add(total);
+ }
+ cart.setTotals(totals);
+ }
+
+ cart.setSubTotal(pricingService.getDisplayAmount(orderSummary.getSubTotal(), store));
+ cart.setTotal(pricingService.getDisplayAmount(orderSummary.getTotal(), store));
+ cart.setQuantity(cartQuantity);
+ cart.setId(shoppingCart.getId());
+ }
+ catch(ServiceException ex){
+ LOG.error( "Error while converting cart Model to cart Data.."+ex );
+ throw new ConversionException( "Unable to create cart data", ex );
+ }
+ return cart;
+
+
+ };
+
+
+
+
+
+ public void setPricingService(final PricingService pricingService) {
+ this.pricingService = pricingService;
+ }
+
+
+
+
+
+
+ public void setShoppingCartCalculationService(final ShoppingCartCalculationService shoppingCartCalculationService) {
+ this.shoppingCartCalculationService = shoppingCartCalculationService;
+ }
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/populator/shoppingCart/ShoppingCartModelPopulator.java b/sm-shop/src/main/java/com/salesmanager/shop/populator/shoppingCart/ShoppingCartModelPopulator.java
index 4232c83..3d8d6ff 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/populator/shoppingCart/ShoppingCartModelPopulator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/populator/shoppingCart/ShoppingCartModelPopulator.java
@@ -1,275 +1,275 @@
-/**
- *
- */
-package com.salesmanager.shop.populator.shoppingCart;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.catalog.product.ProductService;
-import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
-import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
-import com.salesmanager.core.business.utils.AbstractDataPopulator;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.shoppingcart.ShoppingCart;
-import com.salesmanager.shop.model.shoppingcart.ShoppingCartAttribute;
-import com.salesmanager.shop.model.shoppingcart.ShoppingCartData;
-import com.salesmanager.shop.model.shoppingcart.ShoppingCartItem;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.configuration.ConversionException;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Service;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Umesh A
- */
-
-@Service(value="shoppingCartModelPopulator")
-public class ShoppingCartModelPopulator
- extends AbstractDataPopulator<ShoppingCartData,ShoppingCart>
-{
-
- private static final Logger LOG = LoggerFactory.getLogger(ShoppingCartModelPopulator.class);
-
- private ShoppingCartService shoppingCartService;
-
- private Customer customer;
-
- public ShoppingCartService getShoppingCartService() {
- return shoppingCartService;
- }
-
-
- public void setShoppingCartService(ShoppingCartService shoppingCartService) {
- this.shoppingCartService = shoppingCartService;
- }
-
-
- private ProductService productService;
-
-
- public ProductService getProductService() {
- return productService;
- }
-
-
- public void setProductService(ProductService productService) {
- this.productService = productService;
- }
-
-
- private ProductAttributeService productAttributeService;
-
-
- public ProductAttributeService getProductAttributeService() {
- return productAttributeService;
- }
-
-
- public void setProductAttributeService(
- ProductAttributeService productAttributeService) {
- this.productAttributeService = productAttributeService;
- }
-
-
- @Override
- public ShoppingCart populate(ShoppingCartData shoppingCart,ShoppingCart cartMdel,final MerchantStore store, Language language)
- {
-
-
- // if id >0 get the original from the database, override products
- try{
- if ( shoppingCart.getId() > 0 && StringUtils.isNotBlank( shoppingCart.getCode()))
- {
- cartMdel = shoppingCartService.getByCode( shoppingCart.getCode(), store );
- if(cartMdel==null){
- cartMdel=new ShoppingCart();
- cartMdel.setShoppingCartCode( shoppingCart.getCode() );
- cartMdel.setMerchantStore( store );
- if ( customer != null )
- {
- cartMdel.setCustomerId( customer.getId() );
- }
- shoppingCartService.create( cartMdel );
- }
- }
- else
- {
- cartMdel.setShoppingCartCode( shoppingCart.getCode() );
- cartMdel.setMerchantStore( store );
- if ( customer != null )
- {
- cartMdel.setCustomerId( customer.getId() );
- }
- shoppingCartService.create( cartMdel );
- }
-
- List<ShoppingCartItem> items = shoppingCart.getShoppingCartItems();
- Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> newItems =
- new HashSet<com.salesmanager.core.model.shoppingcart.ShoppingCartItem>();
- if ( items != null && items.size() > 0 )
- {
- for ( ShoppingCartItem item : items )
- {
-
- Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> cartItems = cartMdel.getLineItems();
- if ( cartItems != null && cartItems.size() > 0 )
- {
-
- for ( com.salesmanager.core.model.shoppingcart.ShoppingCartItem dbItem : cartItems )
- {
- if ( dbItem.getId().longValue() == item.getId() )
- {
- dbItem.setQuantity( item.getQuantity() );
- // compare attributes
- Set<com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem> attributes =
- dbItem.getAttributes();
- Set<com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem> newAttributes =
- new HashSet<com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem>();
- List<ShoppingCartAttribute> cartAttributes = item.getShoppingCartAttributes();
- if ( !CollectionUtils.isEmpty( cartAttributes ) )
- {
- for ( ShoppingCartAttribute attribute : cartAttributes )
- {
- for ( com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem dbAttribute : attributes )
- {
- if ( dbAttribute.getId().longValue() == attribute.getId() )
- {
- newAttributes.add( dbAttribute );
- }
- }
- }
-
- dbItem.setAttributes( newAttributes );
- }
- else
- {
- dbItem.removeAllAttributes();
- }
- newItems.add( dbItem );
- }
- }
- }
- else
- {// create new item
- com.salesmanager.core.model.shoppingcart.ShoppingCartItem cartItem =
- createCartItem( cartMdel, item, store );
- Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> lineItems =
- cartMdel.getLineItems();
- if ( lineItems == null )
- {
- lineItems = new HashSet<com.salesmanager.core.model.shoppingcart.ShoppingCartItem>();
- cartMdel.setLineItems( lineItems );
- }
- lineItems.add( cartItem );
- shoppingCartService.update( cartMdel );
- }
- }// end for
- }// end if
- }catch(ServiceException se){
- LOG.error( "Error while converting cart data to cart model.."+se );
- throw new ConversionException( "Unable to create cart model", se );
- }
- catch (Exception ex){
- LOG.error( "Error while converting cart data to cart model.."+ex );
- throw new ConversionException( "Unable to create cart model", ex );
- }
-
- return cartMdel;
- }
-
-
- private com.salesmanager.core.model.shoppingcart.ShoppingCartItem createCartItem( com.salesmanager.core.model.shoppingcart.ShoppingCart cart,
- ShoppingCartItem shoppingCartItem,
- MerchantStore store )
- throws Exception
- {
-
- Product product = productService.getById( shoppingCartItem.getProductId() );
-
- if ( product == null )
- {
- throw new Exception( "Item with id " + shoppingCartItem.getProductId() + " does not exist" );
- }
-
- if ( product.getMerchantStore().getId().intValue() != store.getId().intValue() )
- {
- throw new Exception( "Item with id " + shoppingCartItem.getProductId() + " does not belong to merchant "
- + store.getId() );
- }
-
- com.salesmanager.core.model.shoppingcart.ShoppingCartItem item =
- new com.salesmanager.core.model.shoppingcart.ShoppingCartItem( cart, product );
- item.setQuantity( shoppingCartItem.getQuantity() );
- item.setItemPrice( shoppingCartItem.getProductPrice() );
- item.setShoppingCart( cart );
-
- // attributes
- List<ShoppingCartAttribute> cartAttributes = shoppingCartItem.getShoppingCartAttributes();
- if ( !CollectionUtils.isEmpty( cartAttributes ) )
- {
- Set<com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem> newAttributes =
- new HashSet<com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem>();
- for ( ShoppingCartAttribute attribute : cartAttributes )
- {
- ProductAttribute productAttribute = productAttributeService.getById( attribute.getAttributeId() );
- if ( productAttribute != null
- && productAttribute.getProduct().getId().longValue() == product.getId().longValue() )
- {
- com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem attributeItem =
- new com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem( item,
- productAttribute );
- if ( attribute.getAttributeId() > 0 )
- {
- attributeItem.setId( attribute.getId() );
- }
- item.addAttributes( attributeItem );
- //newAttributes.add( attributeItem );
- }
-
- }
-
- //item.setAttributes( newAttributes );
- }
-
- return item;
-
- }
-
-
-
-
- @Override
- protected ShoppingCart createTarget()
- {
-
- return new ShoppingCart();
- }
-
-
- public Customer getCustomer() {
- return customer;
- }
-
-
- public void setCustomer(Customer customer) {
- this.customer = customer;
- }
-
-
-
-
-
-
-
-
-
-}
+/**
+ *
+ */
+package com.salesmanager.shop.populator.shoppingCart;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
+import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
+import com.salesmanager.core.business.utils.AbstractDataPopulator;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.shoppingcart.ShoppingCart;
+import com.salesmanager.shop.model.shoppingcart.ShoppingCartAttribute;
+import com.salesmanager.shop.model.shoppingcart.ShoppingCartData;
+import com.salesmanager.shop.model.shoppingcart.ShoppingCartItem;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.configuration.ConversionException;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Umesh A
+ */
+
+@Service(value="shoppingCartModelPopulator")
+public class ShoppingCartModelPopulator
+ extends AbstractDataPopulator<ShoppingCartData,ShoppingCart>
+{
+
+ private static final Logger LOG = LoggerFactory.getLogger(ShoppingCartModelPopulator.class);
+
+ private ShoppingCartService shoppingCartService;
+
+ private Customer customer;
+
+ public ShoppingCartService getShoppingCartService() {
+ return shoppingCartService;
+ }
+
+
+ public void setShoppingCartService(ShoppingCartService shoppingCartService) {
+ this.shoppingCartService = shoppingCartService;
+ }
+
+
+ private ProductService productService;
+
+
+ public ProductService getProductService() {
+ return productService;
+ }
+
+
+ public void setProductService(ProductService productService) {
+ this.productService = productService;
+ }
+
+
+ private ProductAttributeService productAttributeService;
+
+
+ public ProductAttributeService getProductAttributeService() {
+ return productAttributeService;
+ }
+
+
+ public void setProductAttributeService(
+ ProductAttributeService productAttributeService) {
+ this.productAttributeService = productAttributeService;
+ }
+
+
+ @Override
+ public ShoppingCart populate(ShoppingCartData shoppingCart,ShoppingCart cartMdel,final MerchantStore store, Language language)
+ {
+
+
+ // if id >0 get the original from the database, override products
+ try{
+ if ( shoppingCart.getId() > 0 && StringUtils.isNotBlank( shoppingCart.getCode()))
+ {
+ cartMdel = shoppingCartService.getByCode( shoppingCart.getCode(), store );
+ if(cartMdel==null){
+ cartMdel=new ShoppingCart();
+ cartMdel.setShoppingCartCode( shoppingCart.getCode() );
+ cartMdel.setMerchantStore( store );
+ if ( customer != null )
+ {
+ cartMdel.setCustomerId( customer.getId() );
+ }
+ shoppingCartService.create( cartMdel );
+ }
+ }
+ else
+ {
+ cartMdel.setShoppingCartCode( shoppingCart.getCode() );
+ cartMdel.setMerchantStore( store );
+ if ( customer != null )
+ {
+ cartMdel.setCustomerId( customer.getId() );
+ }
+ shoppingCartService.create( cartMdel );
+ }
+
+ List<ShoppingCartItem> items = shoppingCart.getShoppingCartItems();
+ Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> newItems =
+ new HashSet<com.salesmanager.core.model.shoppingcart.ShoppingCartItem>();
+ if ( items != null && items.size() > 0 )
+ {
+ for ( ShoppingCartItem item : items )
+ {
+
+ Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> cartItems = cartMdel.getLineItems();
+ if ( cartItems != null && cartItems.size() > 0 )
+ {
+
+ for ( com.salesmanager.core.model.shoppingcart.ShoppingCartItem dbItem : cartItems )
+ {
+ if ( dbItem.getId().longValue() == item.getId() )
+ {
+ dbItem.setQuantity( item.getQuantity() );
+ // compare attributes
+ Set<com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem> attributes =
+ dbItem.getAttributes();
+ Set<com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem> newAttributes =
+ new HashSet<com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem>();
+ List<ShoppingCartAttribute> cartAttributes = item.getShoppingCartAttributes();
+ if ( !CollectionUtils.isEmpty( cartAttributes ) )
+ {
+ for ( ShoppingCartAttribute attribute : cartAttributes )
+ {
+ for ( com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem dbAttribute : attributes )
+ {
+ if ( dbAttribute.getId().longValue() == attribute.getId() )
+ {
+ newAttributes.add( dbAttribute );
+ }
+ }
+ }
+
+ dbItem.setAttributes( newAttributes );
+ }
+ else
+ {
+ dbItem.removeAllAttributes();
+ }
+ newItems.add( dbItem );
+ }
+ }
+ }
+ else
+ {// create new item
+ com.salesmanager.core.model.shoppingcart.ShoppingCartItem cartItem =
+ createCartItem( cartMdel, item, store );
+ Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> lineItems =
+ cartMdel.getLineItems();
+ if ( lineItems == null )
+ {
+ lineItems = new HashSet<com.salesmanager.core.model.shoppingcart.ShoppingCartItem>();
+ cartMdel.setLineItems( lineItems );
+ }
+ lineItems.add( cartItem );
+ shoppingCartService.update( cartMdel );
+ }
+ }// end for
+ }// end if
+ }catch(ServiceException se){
+ LOG.error( "Error while converting cart data to cart model.."+se );
+ throw new ConversionException( "Unable to create cart model", se );
+ }
+ catch (Exception ex){
+ LOG.error( "Error while converting cart data to cart model.."+ex );
+ throw new ConversionException( "Unable to create cart model", ex );
+ }
+
+ return cartMdel;
+ }
+
+
+ private com.salesmanager.core.model.shoppingcart.ShoppingCartItem createCartItem( com.salesmanager.core.model.shoppingcart.ShoppingCart cart,
+ ShoppingCartItem shoppingCartItem,
+ MerchantStore store )
+ throws Exception
+ {
+
+ Product product = productService.getById( shoppingCartItem.getProductId() );
+
+ if ( product == null )
+ {
+ throw new Exception( "Item with id " + shoppingCartItem.getProductId() + " does not exist" );
+ }
+
+ if ( product.getMerchantStore().getId().intValue() != store.getId().intValue() )
+ {
+ throw new Exception( "Item with id " + shoppingCartItem.getProductId() + " does not belong to merchant "
+ + store.getId() );
+ }
+
+ com.salesmanager.core.model.shoppingcart.ShoppingCartItem item =
+ new com.salesmanager.core.model.shoppingcart.ShoppingCartItem( cart, product );
+ item.setQuantity( shoppingCartItem.getQuantity() );
+ item.setItemPrice( shoppingCartItem.getProductPrice() );
+ item.setShoppingCart( cart );
+
+ // attributes
+ List<ShoppingCartAttribute> cartAttributes = shoppingCartItem.getShoppingCartAttributes();
+ if ( !CollectionUtils.isEmpty( cartAttributes ) )
+ {
+ Set<com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem> newAttributes =
+ new HashSet<com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem>();
+ for ( ShoppingCartAttribute attribute : cartAttributes )
+ {
+ ProductAttribute productAttribute = productAttributeService.getById( attribute.getAttributeId() );
+ if ( productAttribute != null
+ && productAttribute.getProduct().getId().longValue() == product.getId().longValue() )
+ {
+ com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem attributeItem =
+ new com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem( item,
+ productAttribute );
+ if ( attribute.getAttributeId() > 0 )
+ {
+ attributeItem.setId( attribute.getId() );
+ }
+ item.addAttributes( attributeItem );
+ //newAttributes.add( attributeItem );
+ }
+
+ }
+
+ //item.setAttributes( newAttributes );
+ }
+
+ return item;
+
+ }
+
+
+
+
+ @Override
+ protected ShoppingCart createTarget()
+ {
+
+ return new ShoppingCart();
+ }
+
+
+ public Customer getCustomer() {
+ return customer;
+ }
+
+
+ public void setCustomer(Customer customer) {
+ this.customer = customer;
+ }
+
+
+
+
+
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/api/v0/search/SearchRESTController.java b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v0/search/SearchRESTController.java
new file mode 100644
index 0000000..3b3eb72
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v0/search/SearchRESTController.java
@@ -0,0 +1,71 @@
+package com.salesmanager.shop.store.api.v0.search;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.salesmanager.core.business.services.merchant.MerchantStoreService;
+import com.salesmanager.core.business.utils.ajax.AjaxResponse;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.shop.store.controller.search.facade.SearchFacade;
+
+
+/**
+ * Searching and indexing products
+ * @author c.samson
+ *
+ */
+
+@Controller
+@RequestMapping("/services")
+public class SearchRESTController {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(SearchRESTController.class);
+
+ @Inject
+ private MerchantStoreService merchantStoreService;
+
+ @Inject
+ private SearchFacade searchFacade;
+
+ @RequestMapping( value="/private/{store}/search/index", method=RequestMethod.GET)
+ @ResponseBody
+ public AjaxResponse indexProducts(@PathVariable String store, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ AjaxResponse resp = new AjaxResponse();
+
+ try {
+
+ MerchantStore merchantStore = merchantStoreService.getByCode(store);
+ if(merchantStore==null) {
+ LOGGER.error("Merchant store is null for code " + store);
+ resp.setStatus(500);
+ resp.setErrorString("Merchant store is null for code " + store);
+ return resp;
+ }
+
+ LOGGER.debug("Index all data : " + store);
+ searchFacade.indexAllData(merchantStore);
+ response.setStatus(200);
+ resp.setStatus(200);
+
+ } catch(Exception e) {
+ resp.setStatus(500);
+ resp.setErrorMessage(e);
+ response.sendError(503, "Exception while indexing all data for store " + store + " " + e.getMessage());
+ }
+
+ return resp;
+
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/api/v0/system/SystemRESTController.java b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v0/system/SystemRESTController.java
new file mode 100644
index 0000000..6dea634
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v0/system/SystemRESTController.java
@@ -0,0 +1,156 @@
+package com.salesmanager.shop.store.api.v0.system;
+
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.salesmanager.core.business.services.system.ModuleConfigurationService;
+import com.salesmanager.core.business.utils.ajax.AjaxResponse;
+
+
+/**
+ * Rest services for the system configuration
+ * @author Carl Samson
+ *
+ */
+@Controller
+@RequestMapping("/services")
+public class SystemRESTController {
+
+
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(SystemRESTController.class);
+
+ @Inject
+ private ModuleConfigurationService moduleConfigurationService;
+
+ /**
+ * Creates or updates a configuration module. A JSON has to be created on the client side which represents
+ * an object that will create a new module (payment, shipping ...) which can be used and configured from
+ * the administration tool. Here is an example of configuration accepted
+ *
+ * {
+ "module": "PAYMENT",
+ "code": "paypal-express-checkout",
+ "type":"paypal",
+ "version":"104.0",
+ "regions": ["*"],
+ "image":"icon-paypal.png",
+ "configuration":[{"env":"TEST","scheme":"","host":"","port":"","uri":"","config1":"https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token="},{"env":"PROD","scheme":"","host":"","port":"","uri":"","config1":"https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token="}]
+
+ }
+ *
+ * see : shopizer/sm-core/src/main/resources/reference/integrationmodules.json for more samples
+ * @param json
+ * @param request
+ * @param response
+ * @throws Exception
+ */
+ @RequestMapping( value="/private/system/module", method=RequestMethod.POST, consumes = "application/json")
+ @ResponseBody
+ public AjaxResponse createOrUpdateModule(@RequestBody final String json, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ AjaxResponse resp = new AjaxResponse();
+
+ try {
+
+
+
+ LOGGER.debug("Creating or updating an integration module : " + json);
+
+ moduleConfigurationService.createOrUpdateModule(json);
+
+ response.setStatus(200);
+
+ resp.setStatus(200);
+
+ } catch(Exception e) {
+ resp.setStatus(500);
+ resp.setErrorMessage(e);
+ response.sendError(503, "Exception while creating or updating the module " + e.getMessage());
+ }
+
+ return resp;
+
+ }
+
+ @RequestMapping( value="/private/system/optin", method=RequestMethod.POST)
+ @ResponseBody
+ public AjaxResponse createOptin(@RequestBody final String json, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ AjaxResponse resp = new AjaxResponse();
+
+ try {
+ LOGGER.debug("Creating an optin : " + json);
+ //moduleConfigurationService.createOrUpdateModule(json);
+ response.setStatus(200);
+ resp.setStatus(200);
+
+ } catch(Exception e) {
+ resp.setStatus(500);
+ resp.setErrorMessage(e);
+ response.sendError(503, "Exception while creating optin " + e.getMessage());
+ }
+
+ return resp;
+
+ }
+
+ @RequestMapping( value="/private/system/optin/{code}", method=RequestMethod.DELETE)
+ @ResponseBody
+ public AjaxResponse deleteOptin(@RequestBody final String code, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ AjaxResponse resp = new AjaxResponse();
+
+ try {
+ LOGGER.debug("Delete optin : " + code);
+ //moduleConfigurationService.createOrUpdateModule(json);
+ response.setStatus(200);
+ resp.setStatus(200);
+
+ } catch(Exception e) {
+ resp.setStatus(500);
+ resp.setErrorMessage(e);
+ response.sendError(503, "Exception while deleting optin " + e.getMessage());
+ }
+
+ return resp;
+
+ }
+
+ @RequestMapping( value="/private/system/optin/{code}/customer", method=RequestMethod.POST, consumes = "application/json")
+ @ResponseBody
+ public AjaxResponse createOptinCustomer(@RequestBody final String code, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ AjaxResponse resp = new AjaxResponse();
+
+ try {
+ LOGGER.debug("Adding a customer optin : " + code);
+ //moduleConfigurationService.createOrUpdateModule(json);
+ response.setStatus(200);
+ resp.setStatus(200);
+
+ } catch(Exception e) {
+ resp.setStatus(500);
+ resp.setErrorMessage(e);
+ response.sendError(503, "Exception while creating uptin " + e.getMessage());
+ }
+
+ return resp;
+
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/api/v0/utility/CallbackController.java b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v0/utility/CallbackController.java
new file mode 100644
index 0000000..2754e07
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v0/utility/CallbackController.java
@@ -0,0 +1,58 @@
+package com.salesmanager.shop.store.api.v0.utility;
+
+import java.io.IOException;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+
+/**
+ * In progress entry point for receiving various hooks and callback
+ * from various web AP.
+ *
+ * The first draft implementation is for facebook conversations
+ * with messenger. The FB messanger API supports the possibility to track
+ * all conversations messages which are sent back to the webhook. It accepts request parameters
+ * and respond back simple acknowledge answer.
+ *
+ * A good enhancement would be to have sub-implementation by webhook so this controller could
+ * delegate to a worker according to a request parameter. But ... let's start exploring with FB first.
+ * @author carlsamson
+ *
+ */
+@Controller
+@RequestMapping("/services")
+public class CallbackController {
+
+ private static final String VERIFY_MESSENGER_WEBHOOK = "VERIFY_MESSENGER_WEBHOOK";
+
+ @RequestMapping( value="/public/callBack", method=RequestMethod.GET)
+ public void callBack(HttpServletRequest request, HttpServletResponse response) throws IOException {
+
+ String verificationToken = request.getParameter("hub.verify_token");
+
+ if(!StringUtils.isBlank(verificationToken)) {
+
+ if(verificationToken.equals(VERIFY_MESSENGER_WEBHOOK)) {
+ String replyToken = request.getParameter("hub.challenge");
+
+ response.setStatus(HttpServletResponse.SC_OK);
+ response.getWriter().write(replyToken);
+ response.getWriter().flush();
+ response.getWriter().close();
+ }
+
+ }
+ return;
+ }
+
+ public String verifyCallBack() {
+ return null;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/category/CategoryApi.java b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/category/CategoryApi.java
new file mode 100644
index 0000000..8b3f30a
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/category/CategoryApi.java
@@ -0,0 +1,195 @@
+package com.salesmanager.shop.store.api.v1.category;
+
+import java.util.List;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+import com.salesmanager.core.business.services.catalog.category.CategoryService;
+import com.salesmanager.core.model.catalog.category.Category;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.catalog.category.PersistableCategory;
+import com.salesmanager.shop.model.catalog.category.ReadableCategory;
+import com.salesmanager.shop.store.controller.category.facade.CategoryFacade;
+import com.salesmanager.shop.store.controller.store.facade.StoreFacade;
+import com.salesmanager.shop.utils.ImageFilePath;
+import com.salesmanager.shop.utils.LanguageUtils;
+
+@Controller
+@RequestMapping("/api/v1")
+public class CategoryApi {
+
+ @Inject
+ private CategoryFacade categoryFacade;
+
+ @Inject
+ private CategoryService categoryService;
+
+ @Inject
+ @Qualifier("img")
+ private ImageFilePath imageUtils;
+
+ @Inject
+ private StoreFacade storeFacade;
+
+ @Inject
+ private LanguageUtils languageUtils;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(CategoryApi.class);
+
+
+ @RequestMapping(value = "/category/{id}", method=RequestMethod.GET)
+ @ResponseBody
+ public ReadableCategory get(@PathVariable final Long id, @RequestParam(value = "lang", required=false) String lang, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ try {
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ ReadableCategory category = categoryFacade.getById(merchantStore, id, language);
+
+ if(category==null) {
+ response.sendError(404, "Category id not found");
+ return null;
+ }
+
+
+ return category;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while getting category",e);
+ try {
+ response.sendError(503, "Error while getting category " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+ return null;
+ }
+ }
+
+ /**
+ * Get all category starting from root
+ * filter can be used for filtering on fields
+ * only featured is supported
+ * @param lang
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping(value = "/category", method=RequestMethod.GET)
+ @ResponseBody
+ public List <ReadableCategory> getFiltered(
+ @RequestParam(value = "filter", required=false) String filter,
+ @RequestParam(value = "lang", required=false)
+ String lang, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ try {
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ List <ReadableCategory> category = categoryFacade.getCategoryHierarchy(merchantStore, 0, language, filter);
+
+
+ return category;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while getting root category",e);
+ try {
+ response.sendError(503, "Error while getting root category " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+ return null;
+ }
+ }
+
+ /**
+ * Category creation
+ */
+ @RequestMapping( value="/private/category", method=RequestMethod.POST)
+ @ResponseStatus(HttpStatus.CREATED)
+ @ResponseBody
+ public PersistableCategory createCategory(@Valid @RequestBody PersistableCategory category, HttpServletRequest request, HttpServletResponse response) {
+
+
+ try {
+
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+ categoryFacade.saveCategory(merchantStore, category);
+
+
+ category.setId(category.getId());
+
+ return category;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while creating category",e);
+ try {
+ response.sendError(503, "Error while creating category " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+ return null;
+ }
+ }
+
+ @ResponseStatus(HttpStatus.OK)
+ @RequestMapping( value="/private/category/{id}", method=RequestMethod.PUT)
+ public @ResponseBody PersistableCategory update(@PathVariable Long id, @Valid @RequestBody PersistableCategory category, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ categoryFacade.saveCategory(merchantStore, category);
+
+ return category;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while updating category",e);
+ try {
+ response.sendError(503, "Error while updating category " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+
+ }
+
+ @ResponseStatus(HttpStatus.OK)
+ @RequestMapping( value="/private/category/{id}", method=RequestMethod.DELETE)
+ public void delete(@PathVariable Long id, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ try {
+ Category category = categoryService.getById(id);
+ if(category != null){
+ categoryFacade.deleteCategory(category);
+ }else{
+ response.sendError(404, "No Category found for ID : " + id);
+ }
+ } catch (Exception e) {
+ LOGGER.error("Error while deleting category",e);
+ try {
+ response.sendError(503, "Error while deleting category " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+ }
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/customer/AuthenticateCustomerApi.java b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/customer/AuthenticateCustomerApi.java
new file mode 100644
index 0000000..7be6b9c
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/customer/AuthenticateCustomerApi.java
@@ -0,0 +1,185 @@
+package com.salesmanager.shop.store.api.v1.customer;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+import org.apache.http.auth.AuthenticationException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.mobile.device.Device;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.customer.PersistableCustomer;
+import com.salesmanager.shop.store.controller.customer.facade.CustomerFacade;
+import com.salesmanager.shop.store.controller.store.facade.StoreFacade;
+import com.salesmanager.shop.store.security.AuthenticationRequest;
+import com.salesmanager.shop.store.security.AuthenticationResponse;
+import com.salesmanager.shop.store.security.JWTTokenUtil;
+import com.salesmanager.shop.store.security.user.JWTUser;
+import com.salesmanager.shop.utils.LanguageUtils;
+
+@Controller
+@RequestMapping("/api/v1")
+public class AuthenticateCustomerApi {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(AuthenticateCustomerApi.class);
+
+ @Value("${authToken.header}")
+ private String tokenHeader;
+
+ @Inject
+ private AuthenticationManager jwtCustomerAuthenticationManager;
+
+ @Inject
+ private JWTTokenUtil jwtTokenUtil;
+
+ @Inject
+ private UserDetailsService jwtCustomerDetailsService;
+
+ @Inject
+ private CustomerFacade customerFacade;
+
+ @Inject
+ private StoreFacade storeFacade;
+
+ @Inject
+ private LanguageUtils languageUtils;
+
+ /**
+ * Create new customer for a given MerchantStore, then authenticate that customer
+ */
+ @RequestMapping( value={"/auth/register"}, method=RequestMethod.POST)
+ @ResponseStatus(HttpStatus.CREATED)
+ @ResponseBody
+ public ResponseEntity<?> register(@Valid @RequestBody PersistableCustomer customer, HttpServletRequest request, HttpServletResponse response, Device device) throws Exception {
+
+
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+
+
+ customerFacade.registerCustomer(customer, merchantStore, language);
+
+ // Perform the security
+ Authentication authentication = null;
+ try {
+
+ authentication = jwtCustomerAuthenticationManager.authenticate(
+ new UsernamePasswordAuthenticationToken(
+ customer.getUserName(),
+ customer.getClearPassword()
+ )
+ );
+
+ } catch(Exception e) {
+ return new ResponseEntity<>(HttpStatus.NOT_FOUND);
+ }
+
+ if(authentication == null) {
+ return new ResponseEntity<>(HttpStatus.NOT_FOUND);
+ }
+
+ SecurityContextHolder.getContext().setAuthentication(authentication);
+
+ // Reload password post-security so we can generate token
+ final JWTUser userDetails = (JWTUser)jwtCustomerDetailsService.loadUserByUsername(customer.getUserName());
+ final String token = jwtTokenUtil.generateToken(userDetails, device);
+
+ // Return the token
+ return ResponseEntity.ok(new AuthenticationResponse(customer.getId(),token));
+
+
+ } catch (Exception e) {
+ LOGGER.error("Error while registering customer",e);
+ try {
+ response.sendError(503, "Error while registering customer " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+
+
+ }
+
+ /**
+ * Authenticate a customer using username & password
+ * @param authenticationRequest
+ * @param device
+ * @return
+ * @throws AuthenticationException
+ */
+ @RequestMapping(value = "/auth/login", method = RequestMethod.POST)
+ public ResponseEntity<?> authenticate(@RequestBody @Valid AuthenticationRequest authenticationRequest, Device device) throws AuthenticationException {
+
+ // Perform the security
+ Authentication authentication = null;
+ try {
+
+
+ //to be used when username and password are set
+ authentication = jwtCustomerAuthenticationManager.authenticate(
+ new UsernamePasswordAuthenticationToken(
+ authenticationRequest.getUsername(),
+ authenticationRequest.getPassword()
+ )
+ );
+
+
+ } catch(Exception e) {
+ return new ResponseEntity<>(HttpStatus.NOT_FOUND);
+ }
+
+ if(authentication == null) {
+ return new ResponseEntity<>(HttpStatus.NOT_FOUND);
+ }
+
+ SecurityContextHolder.getContext().setAuthentication(authentication);
+
+ // Reload password post-security so we can generate token
+ // todo create one for social
+ final JWTUser userDetails = (JWTUser)jwtCustomerDetailsService.loadUserByUsername(authenticationRequest.getUsername());
+
+ final String token = jwtTokenUtil.generateToken(userDetails, device);
+
+ // Return the token
+ return ResponseEntity.ok(new AuthenticationResponse(userDetails.getId(),token));
+ }
+
+ @RequestMapping(value = "/auth/refresh", method = RequestMethod.GET)
+ public ResponseEntity<?> refreshAndGetAuthenticationToken(HttpServletRequest request) {
+ String token = request.getHeader(tokenHeader);
+ String username = jwtTokenUtil.getUsernameFromToken(token);
+ JWTUser user = (JWTUser) jwtCustomerDetailsService.loadUserByUsername(username);
+
+ if (jwtTokenUtil.canTokenBeRefreshed(token, user.getLastPasswordResetDate())) {
+ String refreshedToken = jwtTokenUtil.refreshToken(token);
+ return ResponseEntity.ok(new AuthenticationResponse(user.getId(),refreshedToken));
+ } else {
+ return ResponseEntity.badRequest().body(null);
+ }
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/customer/CustomerApi.java b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/customer/CustomerApi.java
new file mode 100644
index 0000000..baa6978
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/customer/CustomerApi.java
@@ -0,0 +1,268 @@
+package com.salesmanager.shop.store.api.v1.customer;
+
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.customer.CustomerCriteria;
+import com.salesmanager.core.model.customer.CustomerList;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.customer.PersistableCustomer;
+import com.salesmanager.shop.model.customer.ReadableCustomer;
+import com.salesmanager.shop.populator.customer.ReadableCustomerList;
+import com.salesmanager.shop.populator.customer.ReadableCustomerPopulator;
+import com.salesmanager.shop.store.controller.customer.facade.CustomerFacade;
+import com.salesmanager.shop.store.controller.store.facade.StoreFacade;
+import com.salesmanager.shop.utils.LanguageUtils;
+
+@Controller
+@RequestMapping("/api/v1")
+public class CustomerApi {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(CustomerApi.class);
+
+
+ @Inject
+ private CustomerFacade customerFacade;
+
+ @Inject
+ private CustomerService customerService;
+
+ @Inject
+ private StoreFacade storeFacade;
+
+ @Inject
+ private LanguageUtils languageUtils;
+
+
+ /**
+ * Create new customer for a given MerchantStore
+ */
+ @RequestMapping( value={"/private/customers"}, method=RequestMethod.POST)
+ @ResponseStatus(HttpStatus.CREATED)
+ @ResponseBody
+ public PersistableCustomer create(@Valid @RequestBody PersistableCustomer customer, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+
+ customerFacade.create(customer, merchantStore);
+
+ customer.setEncodedPassword(null);
+ customer.setClearPassword(null);
+
+ return customer;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while saving customer",e);
+ try {
+ response.sendError(503, "Error while saving customer " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+
+
+ }
+
+ @ResponseStatus(HttpStatus.OK)
+ @RequestMapping( value="/private/customers/{id}", method=RequestMethod.PUT)
+ public @ResponseBody PersistableCustomer update(@PathVariable Long id, @Valid @RequestBody PersistableCustomer customer, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ customerFacade.update(customer, merchantStore);
+ return customer;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while saving customer",e);
+ try {
+ response.sendError(503, "Error while saving customer " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+ }
+
+ @ResponseStatus(HttpStatus.OK)
+ @RequestMapping( value="/private/customers/{id}", method=RequestMethod.DELETE)
+ public void delete(@PathVariable Long id, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ try {
+
+
+ Customer customer = customerService.getById(id);
+ if(customer != null){
+ customerService.delete(customer);
+ }else{
+ response.sendError(404, "No Customer found for ID : " + id);
+ }
+ } catch (Exception e) {
+ LOGGER.error("Error while deleting customer",e);
+ try {
+ response.sendError(503, "Error while deleting customer " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+ }
+ }
+
+ /**
+ * Get all customers
+ * @param start
+ * @param count
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping( value="/private/customers", method=RequestMethod.GET)
+ @ResponseStatus(HttpStatus.OK)
+ @ResponseBody
+ public ReadableCustomerList getFilteredCustomers(
+ @RequestParam(value = "start", required=false) Integer start,
+ @RequestParam(value = "count", required=false) Integer count,
+ HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ CustomerCriteria customerCriteria = new CustomerCriteria();
+ if(start != null) {
+ customerCriteria.setStartIndex(start.intValue());
+ }
+
+ if(count != null) {
+ customerCriteria.setMaxCount(count.intValue());
+ }
+
+ CustomerList customerList = customerService.listByStore(merchantStore, customerCriteria);
+ List<ReadableCustomer> readableCustomers = new ArrayList<ReadableCustomer>();
+
+ ReadableCustomerPopulator populator = new ReadableCustomerPopulator();
+
+ if(CollectionUtils.isNotEmpty(customerList.getCustomers())) {
+ for(Customer c : customerList.getCustomers()) {
+ ReadableCustomer readable = new ReadableCustomer();
+ populator.populate(c, readable, merchantStore, language);
+ readableCustomers.add(readable);
+ }
+ }
+
+ ReadableCustomerList readableCustomerList = new ReadableCustomerList();
+ readableCustomerList.setCustomers(readableCustomers);
+ readableCustomerList.setTotalCount(customerList.getTotalCount());
+
+ return readableCustomerList;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while getting all customers",e);
+ try {
+ response.sendError(503, "Error while getting all customers " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+ }
+
+ return null;
+ }
+
+ @RequestMapping( value="/private/customers/{id}", method=RequestMethod.GET)
+ @ResponseStatus(HttpStatus.OK)
+ @ResponseBody
+ public ReadableCustomer get(@PathVariable Long id, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ ReadableCustomer customer = customerFacade.getCustomerById(id, merchantStore, language);
+ if(customer == null){
+ response.sendError(404, "No Customer found for ID : " + id);
+ }
+
+ return customer;
+ } catch (Exception e) {
+ LOGGER.error("Error while getting customer",e);
+ try {
+ response.sendError(503, "Error while getting customer " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+ }
+
+ return null;
+
+ }
+
+ @RequestMapping( value="/auth/customers/profile", method=RequestMethod.GET)
+ @ResponseStatus(HttpStatus.OK)
+ @ResponseBody
+ public ReadableCustomer get(HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ Principal principal = request.getUserPrincipal();
+ String userName = principal.getName();
+
+ Customer c = customerService.getByNick(userName);
+
+ if(c == null) {
+ response.sendError(401, "Error while getting customer, customer not authorized");
+ return null;
+ }
+
+
+ ReadableCustomer customer = customerFacade.getCustomerById(c.getId(), merchantStore, language);
+ if(customer == null){
+ response.sendError(404, "No Customer found for ID : " + c.getId());
+ }
+
+ return customer;
+ } catch (Exception e) {
+ LOGGER.error("Error while getting customer",e);
+ try {
+ response.sendError(503, "Error while getting customer " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+ }
+
+ return null;
+
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/customer/CustomerReviewApi.java b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/customer/CustomerReviewApi.java
new file mode 100644
index 0000000..b86bb41
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/customer/CustomerReviewApi.java
@@ -0,0 +1,227 @@
+package com.salesmanager.shop.store.api.v1.customer;
+
+import java.util.List;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.business.services.customer.review.CustomerReviewService;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.customer.review.CustomerReview;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.model.customer.PersistableCustomerReview;
+import com.salesmanager.shop.model.customer.ReadableCustomerReview;
+import com.salesmanager.shop.store.controller.customer.facade.CustomerFacade;
+import com.salesmanager.shop.store.controller.store.facade.StoreFacade;
+import com.salesmanager.shop.utils.LanguageUtils;
+
+@Controller
+@RequestMapping("/api/v1")
+public class CustomerReviewApi {
+
+ @Inject
+ private CustomerFacade customerFacade;
+
+ @Inject
+ private StoreFacade storeFacade;
+
+ @Inject
+ private LanguageUtils languageUtils;
+
+ @Inject
+ private CustomerService customerService;
+
+ @Inject
+ private CustomerReviewService customerReviewService;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(CustomerReviewApi.class);
+
+
+ /**
+ * Reviews made for a given customer
+ * @param id
+ * @param review
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping( value="/private/customers/{id}/reviews", method=RequestMethod.POST)
+ @ResponseStatus(HttpStatus.CREATED)
+ @ResponseBody
+ public PersistableCustomerReview create(@PathVariable final Long id, @Valid @RequestBody PersistableCustomerReview review, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+
+ //rating already exist
+ CustomerReview customerReview = customerReviewService.getByReviewerAndReviewed(review.getCustomerId(), id);
+ if(customerReview!=null) {
+ response.sendError(500, "A review already exist for this customer and product");
+ return null;
+ }
+
+ //rating maximum 5
+ if(review.getRating()>Constants.MAX_REVIEW_RATING_SCORE) {
+ response.sendError(503, "Maximum rating score is " + Constants.MAX_REVIEW_RATING_SCORE);
+ return null;
+ }
+
+ review.setReviewedCustomer(id);
+
+ customerFacade.saveOrUpdateCustomerReview(review, merchantStore, language);
+
+ return review;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while saving product review",e);
+ try {
+ response.sendError(503, "Error while saving product review" + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+ }
+
+
+
+ @RequestMapping( value="/customers/{id}/reviews", method=RequestMethod.GET)
+ @ResponseStatus(HttpStatus.OK)
+ @ResponseBody
+ public List<ReadableCustomerReview> getAll(@PathVariable final Long id, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ //customer exist
+ Customer reviewed = customerService.getById(id);
+
+ if(reviewed == null) {
+ response.sendError(404, "Customer id " + id + " does not exists");
+ return null;
+ }
+
+ List<ReadableCustomerReview> reviews = customerFacade.getAllCustomerReviewsByReviewed(reviewed, merchantStore, language);
+
+ return reviews;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while getting customer reviews",e);
+ try {
+ response.sendError(503, "Error while getting customer reviews" + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+ }
+
+ @RequestMapping( value="/private/customers/{id}/reviews/{reviewid}", method=RequestMethod.PUT)
+ @ResponseStatus(HttpStatus.OK)
+ @ResponseBody
+ public PersistableCustomerReview update(@PathVariable final Long id, @PathVariable final Long reviewId, @Valid @RequestBody PersistableCustomerReview review, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ CustomerReview customerReview = customerReviewService.getById(reviewId);
+ if(customerReview==null) {
+ response.sendError(404, "Customer review with id " + reviewId + " does not exist");
+ return null;
+ }
+
+ if(customerReview.getReviewedCustomer().getId().longValue() != id.longValue()) {
+ response.sendError(404, "Customer review with id " + reviewId + " does not exist for this customer");
+ return null;
+ }
+
+ //rating maximum 5
+ if(review.getRating()>Constants.MAX_REVIEW_RATING_SCORE) {
+ response.sendError(503, "Maximum rating score is " + Constants.MAX_REVIEW_RATING_SCORE);
+ return null;
+ }
+
+ review.setReviewedCustomer(id);
+
+ customerFacade.saveOrUpdateCustomerReview(review, merchantStore, language);
+
+ return review;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while updating customer review",e);
+ try {
+ response.sendError(503, "Error while updating customer review" + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+ }
+
+ @RequestMapping( value="/private/customers/{id}/reviews/{reviewid}", method=RequestMethod.DELETE)
+ @ResponseStatus(HttpStatus.OK)
+ @ResponseBody
+ public void delete(@PathVariable final Long id, @PathVariable final Long reviewId, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ CustomerReview customerReview = customerReviewService.getById(reviewId);
+ if(customerReview==null) {
+ response.sendError(404, "Customer review with id " + reviewId + " does not exist");
+ return;
+ }
+
+ if(customerReview.getReviewedCustomer().getId().longValue() != id.longValue()) {
+ response.sendError(404, "Customer review with id " + reviewId + " does not exist for this customer");
+ return;
+ }
+
+
+
+
+ customerFacade.deleteCustomerReview(customerReview, merchantStore, language);
+
+
+
+ } catch (Exception e) {
+ LOGGER.error("Error while deleting customer review",e);
+ try {
+ response.sendError(503, "Error while deleting customer review" + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return;
+ }
+ }
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/order/OrderApi.java b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/order/OrderApi.java
new file mode 100644
index 0000000..6d1c206
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/order/OrderApi.java
@@ -0,0 +1,284 @@
+package com.salesmanager.shop.store.api.v1.order;
+
+import java.security.Principal;
+import java.util.List;
+import java.util.Locale;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.customer.ReadableCustomer;
+import com.salesmanager.shop.model.order.PersistableOrderApi;
+import com.salesmanager.shop.model.order.ReadableOrder;
+import com.salesmanager.shop.model.order.ReadableOrderList;
+import com.salesmanager.shop.populator.customer.ReadableCustomerPopulator;
+import com.salesmanager.shop.store.controller.order.facade.OrderFacade;
+import com.salesmanager.shop.store.controller.store.facade.StoreFacade;
+import com.salesmanager.shop.utils.LanguageUtils;
+
+@Controller
+@RequestMapping("/api/v1")
+public class OrderApi {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(OrderApi.class);
+
+
+ @Inject
+ private StoreFacade storeFacade;
+
+ @Inject
+ private LanguageUtils languageUtils;
+
+ @Inject
+ private CustomerService customerService;
+
+ @Inject
+ private OrderFacade orderFacade;
+
+
+
+ /**
+ * Get a list of orders for a given customer
+ * accept request parameter 'start' start index for count
+ * accept request parameter 'max' maximum number count, otherwise returns all
+ * Used for administrators
+ * @param store
+ * @param order
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping( value={"/private/orders/customers/{id}"}, method=RequestMethod.GET)
+ @ResponseStatus(HttpStatus.ACCEPTED)
+ @ResponseBody
+ public ReadableOrderList listOrders(
+ @PathVariable final Long id,
+ @RequestParam(value = "start", required=false) Integer start,
+ @RequestParam(value = "count", required=false) Integer count,
+ HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+
+ Customer customer = customerService.getById(id);
+
+ if(customer==null) {
+ LOGGER.error("Customer is null for id " + id);
+ response.sendError(404, "Customer is null for id " + id);
+ return null;
+ }
+
+ if(start == null) {
+ start = new Integer(0);
+ }
+ if(count == null) {
+ count = new Integer(100);
+ }
+
+ ReadableCustomer readableCustomer = new ReadableCustomer();
+ ReadableCustomerPopulator customerPopulator = new ReadableCustomerPopulator();
+ customerPopulator.populate(customer, readableCustomer, merchantStore, language);
+
+
+ ReadableOrderList returnList = orderFacade.getReadableOrderList(merchantStore, customer, start, count, language);
+
+ List<ReadableOrder> orders = returnList.getOrders();
+
+ if(!CollectionUtils.isEmpty(orders)) {
+ for(ReadableOrder order : orders) {
+ order.setCustomer(readableCustomer);
+ }
+ }
+
+
+ return returnList;
+ }
+
+ /**
+ * List orders for authenticated customers
+ * @param start
+ * @param count
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping( value={"/auth/orders"}, method=RequestMethod.GET)
+ @ResponseStatus(HttpStatus.ACCEPTED)
+ @ResponseBody
+ public ReadableOrderList listOrders(
+ @RequestParam(value = "start", required=false) Integer start,
+ @RequestParam(value = "count", required=false) Integer count,
+ HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+
+ Principal principal = request.getUserPrincipal();
+ String userName = principal.getName();
+
+ Customer customer = customerService.getByNick(userName);
+
+ if(customer == null) {
+ response.sendError(401, "Error while listing orders, customer not authorized");
+ return null;
+ }
+
+ if(start == null) {
+ start = new Integer(0);
+ }
+ if(count == null) {
+ count = new Integer(100);
+ }
+
+ ReadableCustomer readableCustomer = new ReadableCustomer();
+ ReadableCustomerPopulator customerPopulator = new ReadableCustomerPopulator();
+ customerPopulator.populate(customer, readableCustomer, merchantStore, language);
+
+ ReadableOrderList returnList = orderFacade.getReadableOrderList(merchantStore, customer, start, count, language);
+
+ List<ReadableOrder> orders = returnList.getOrders();
+
+ if(!CollectionUtils.isEmpty(orders)) {
+ for(ReadableOrder order : orders) {
+ order.setCustomer(readableCustomer);
+ }
+ }
+
+
+ return returnList;
+ }
+
+ /**
+ * Get a given order by id
+ * @param id
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping( value={"/auth/orders/{id}"}, method=RequestMethod.GET)
+ @ResponseStatus(HttpStatus.ACCEPTED)
+ @ResponseBody
+ public ReadableOrder getOrder(
+ @PathVariable final Long id,
+ HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ Principal principal = request.getUserPrincipal();
+ String userName = principal.getName();
+
+ Customer customer = customerService.getByNick(userName);
+
+ if(customer == null) {
+ response.sendError(401, "Error while performing checkout customer not authorized");
+ return null;
+ }
+
+ ReadableOrder order = orderFacade.getReadableOrder(id, merchantStore, language);
+
+ if(order==null) {
+ LOGGER.error("Order is null for id " + id);
+ response.sendError(404, "Order is null for id " + id);
+ return null;
+ }
+
+ if(order.getCustomer()==null) {
+ LOGGER.error("Order is null for customer " + principal);
+ response.sendError(404, "Order is null for customer " + principal);
+ return null;
+ }
+
+ if(order.getCustomer().getId()!=null && order.getCustomer().getId().longValue()!=customer.getId().longValue()) {
+ LOGGER.error("Order is null for customer " + principal);
+ response.sendError(404, "Order is null for customer " + principal);
+ return null;
+ }
+
+ return order;
+ }
+
+ /**
+ * Action for performing a checkout on a given shopping cart
+ * @param id
+ * @param order
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping( value={"/auth/cart/{id}/checkout"}, method=RequestMethod.POST)
+ @ResponseStatus(HttpStatus.ACCEPTED)
+ @ResponseBody
+ public PersistableOrderApi checkout(
+ @PathVariable final Long id,
+ @Valid @RequestBody PersistableOrderApi order,
+ HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ Principal principal = request.getUserPrincipal();
+ String userName = principal.getName();
+
+ Customer customer = customerService.getByNick(userName);
+
+ if(customer == null) {
+ response.sendError(401, "Error while performing checkout customer not authorized");
+ return null;
+ }
+
+ order.setShoppingCartId(id);
+ order.setCustomerId(customer.getId());
+
+
+ Order modelOrder = orderFacade.processOrder(order, customer, merchantStore, language, locale);
+ Long orderId = modelOrder.getId();
+ order.setId(orderId);
+
+
+ return order;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while processing checkout",e);
+ try {
+ response.sendError(503, "Error while processing checkout " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+ return null;
+ }
+
+
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/order/OrderPaymentApi.java b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/order/OrderPaymentApi.java
new file mode 100644
index 0000000..892c7c5
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/order/OrderPaymentApi.java
@@ -0,0 +1,265 @@
+package com.salesmanager.shop.store.api.v1.order;
+
+import java.security.Principal;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.Calendar;
+import java.util.Date;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.business.services.order.OrderService;
+import com.salesmanager.core.business.services.payments.PaymentService;
+import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.payments.Payment;
+import com.salesmanager.core.model.payments.Transaction;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.shoppingcart.ShoppingCart;
+import com.salesmanager.shop.model.order.ReadableOrderList;
+import com.salesmanager.shop.model.order.transaction.PersistablePayment;
+import com.salesmanager.shop.model.order.transaction.ReadableTransaction;
+import com.salesmanager.shop.populator.order.transaction.PersistablePaymentPopulator;
+import com.salesmanager.shop.populator.order.transaction.ReadableTransactionPopulator;
+import com.salesmanager.shop.store.controller.order.facade.OrderFacade;
+import com.salesmanager.shop.store.controller.store.facade.StoreFacade;
+import com.salesmanager.shop.utils.LanguageUtils;
+
+@Controller
+@RequestMapping("/api/v1")
+public class OrderPaymentApi {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(OrderPaymentApi.class);
+
+ @Inject
+ private StoreFacade storeFacade;
+
+ @Inject
+ private LanguageUtils languageUtils;
+
+ @Inject
+ private CustomerService customerService;
+
+ @Inject
+ private OrderService orderService;
+
+ @Inject
+ private ShoppingCartService shoppingCartService;
+
+ @Inject
+ private PricingService pricingService;
+
+ @Inject
+ private PaymentService paymentService;
+
+ @Inject
+ private OrderFacade orderFacade;
+
+ @RequestMapping(value = {"/auth/cart/{id}/payment/init"}, method=RequestMethod.POST)
+ @ResponseBody
+ public ReadableTransaction init(
+ @Valid @RequestBody PersistablePayment payment,
+ @PathVariable Long id,
+ HttpServletRequest request,
+ HttpServletResponse response) throws Exception {
+
+ try {
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ Principal principal = request.getUserPrincipal();
+ String userName = principal.getName();
+
+ Customer customer = customerService.getByNick(userName);
+
+ if(customer == null) {
+ response.sendError(401, "Error while initializing the payment customer not authorized");
+ return null;
+ }
+
+ ShoppingCart cart = shoppingCartService.getById(id, merchantStore);
+ if(cart == null) {
+ response.sendError(404, "Cart id " + id + " does not exist");
+ return null;
+ }
+
+ if(cart.getCustomerId()==null) {
+ response.sendError(404, "Cart id " + id + " does not exist for exist for user " + userName);
+ return null;
+ }
+
+ if(cart.getCustomerId().longValue() != customer.getId().longValue()) {
+ response.sendError(404, "Cart id " + id + " does not exist for exist for user " + userName);
+ return null;
+ }
+
+
+ PersistablePaymentPopulator populator = new PersistablePaymentPopulator();
+ populator.setPricingService(pricingService);
+
+ Payment paymentModel = new Payment();
+
+
+ populator.populate(payment, paymentModel, merchantStore, language);
+
+ Transaction transactionModel = paymentService.initTransaction(customer, paymentModel, merchantStore);
+
+
+ ReadableTransaction transaction = new ReadableTransaction();
+ ReadableTransactionPopulator trxPopulator = new ReadableTransactionPopulator();
+ trxPopulator.setOrderService(orderService);
+ trxPopulator.setPricingService(pricingService);
+
+ trxPopulator.populate(transactionModel, transaction, merchantStore, language);
+
+
+ return transaction;
+
+
+ } catch (Exception e) {
+ LOGGER.error("Error while initializing the payment",e);
+ try {
+ response.sendError(503, "Error while initializing the payment " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+ return null;
+ }
+ }
+
+
+ /**
+ * An order can be pre-authorized but un captured. This metho returns all order subject to be capturable
+ * For a given time frame
+ * @param startDate
+ * @param endDate
+ * @param request
+ * @param response
+ * @return ReadableOrderList
+ * @throws Exception
+ */
+ @RequestMapping( value={"/private/orders/payment/capturable"}, method=RequestMethod.GET)
+ @ResponseStatus(HttpStatus.ACCEPTED)
+ @ResponseBody
+ public ReadableOrderList listCapturableOrders(
+ @RequestParam(value="startDate", required=false)
+ @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate,
+ @RequestParam(value="endDate", required=false)
+ @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate,
+ HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ try {
+
+
+ //if startdate or enddate are null use default range (last 24 hours) DD-1 to DD
+ Calendar cal = Calendar.getInstance();
+ Date sDate = null;
+
+ if(startDate!=null) {
+ sDate = Date.from(startDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
+ } else {
+ cal.add(Calendar.DATE, -1);
+ sDate = cal.getTime();
+ }
+
+ Date eDate = null;
+
+ if(endDate!=null) {
+ eDate = Date.from(endDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
+ } else {
+ eDate = new Date();
+ }
+
+ ReadableOrderList returnList = orderFacade.getCapturableOrderList(merchantStore, sDate, eDate, language);
+
+ return returnList;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while getting capturable payments",e);
+ try {
+ response.sendError(503, "Error while getting capturable payments " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+ return null;
+ }
+
+ }
+
+
+ /**
+ * Capture payment transaction for a given order id
+ * @param id
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping( value={"/private/orders/{id}/capture"}, method=RequestMethod.POST)
+ @ResponseStatus(HttpStatus.ACCEPTED)
+ @ResponseBody
+ public ReadableTransaction caprurePayment(
+ @PathVariable Long id,
+ HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+ try {
+
+ //need order
+ Order order = orderService.getById(id);
+
+ if(order==null) {
+ response.sendError(404, "Order id " + id + " does not exist");
+ return null;
+ }
+
+ //need customer
+ Customer customer = customerService.getById(order.getCustomerId());
+
+ if(customer==null) {
+ response.sendError(404, "Order id " + id + " contains an invalid customer " + order.getCustomerId());
+ return null;
+ }
+
+ ReadableTransaction transaction = orderFacade.captureOrder(merchantStore, order, customer, language);
+
+ return transaction;
+
+
+ } catch (Exception e) {
+ LOGGER.error("Error while capturing payment",e);
+ try {
+ response.sendError(503, "Error while capturing payment " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+ return null;
+ }
+
+
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/order/OrderShippingApi.java b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/order/OrderShippingApi.java
new file mode 100644
index 0000000..db04ea9
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/order/OrderShippingApi.java
@@ -0,0 +1,174 @@
+package com.salesmanager.shop.store.api.v1.order;
+
+import java.security.Principal;
+import java.util.List;
+import java.util.Locale;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.shipping.ShippingOption;
+import com.salesmanager.core.model.shipping.ShippingQuote;
+import com.salesmanager.core.model.shipping.ShippingSummary;
+import com.salesmanager.core.model.shoppingcart.ShoppingCart;
+import com.salesmanager.shop.model.order.shipping.ReadableShippingSummary;
+import com.salesmanager.shop.populator.order.ReadableShippingSummaryPopulator;
+import com.salesmanager.shop.store.controller.order.facade.OrderFacade;
+import com.salesmanager.shop.store.controller.store.facade.StoreFacade;
+import com.salesmanager.shop.utils.LabelUtils;
+import com.salesmanager.shop.utils.LanguageUtils;
+
+@Controller
+@RequestMapping("/api/v1")
+public class OrderShippingApi {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(OrderShippingApi.class);
+
+
+ @Inject
+ private CustomerService customerService;
+
+ @Inject
+ private StoreFacade storeFacade;
+
+ @Inject
+ private LanguageUtils languageUtils;
+
+ @Inject
+ private OrderFacade orderFacade;
+
+ @Inject
+ private ShoppingCartService shoppingCartService;
+
+ @Inject
+ private LabelUtils messages;
+
+ @Inject
+ private PricingService pricingService;
+
+ /**
+ * Get shipping quote for a given shopping cart
+ * @param id
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping(value = {"/auth/cart/{id}/shipping"}, method=RequestMethod.GET)
+ @ResponseBody
+ public ReadableShippingSummary shipping(
+ @PathVariable final Long id,
+ HttpServletRequest request,
+ HttpServletResponse response) throws Exception {
+
+ try {
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+ Locale locale = request.getLocale();
+
+
+ Principal principal = request.getUserPrincipal();
+ String userName = principal.getName();
+
+ //get customer id
+ Customer customer = customerService.getByNick(userName);
+
+ if(customer == null) {
+ response.sendError(503, "Error while getting user details to calculate shipping quote");
+ }
+
+ ShoppingCart cart = shoppingCartService.getById(id);
+
+ if(cart == null) {
+ response.sendError(404, "Cart id " + id + " does not exist");
+ }
+
+ if(cart.getCustomerId()==null) {
+ response.sendError(404, "Cart id " + id + " does not exist for exist for user " + userName);
+ }
+
+ if(cart.getCustomerId().longValue() != customer.getId().longValue()) {
+ response.sendError(404, "Cart id " + id + " does not exist for exist for user " + userName);
+ }
+
+ ShippingQuote quote = orderFacade.getShippingQuote(customer, cart, merchantStore, language);
+
+ ShippingSummary summary = orderFacade.getShippingSummary(quote, merchantStore, language);
+
+ ReadableShippingSummary shippingSummary = new ReadableShippingSummary();
+ ReadableShippingSummaryPopulator populator = new ReadableShippingSummaryPopulator();
+ populator.setPricingService(pricingService);
+ populator.populate(summary, shippingSummary, merchantStore, language);
+
+ List<ShippingOption> options = quote.getShippingOptions();
+
+ if(!CollectionUtils.isEmpty(options)) {
+
+ for(ShippingOption shipOption : options) {
+
+ StringBuilder moduleName = new StringBuilder();
+ moduleName.append("module.shipping.").append(shipOption.getShippingModuleCode());
+
+ String carrier = messages.getMessage(moduleName.toString(),new String[]{merchantStore.getStorename()},locale);
+
+ String note = messages.getMessage(moduleName.append(".note").toString(), locale, "");
+
+
+ shipOption.setDescription(carrier);
+ shipOption.setNote(note);
+
+ //option name
+ if(!StringUtils.isBlank(shipOption.getOptionCode())) {
+ //try to get the translate
+ StringBuilder optionCodeBuilder = new StringBuilder();
+ try {
+
+ optionCodeBuilder.append("module.shipping.").append(shipOption.getShippingModuleCode());
+ String optionName = messages.getMessage(optionCodeBuilder.toString(),locale);
+ shipOption.setOptionName(optionName);
+ } catch(Exception e) {//label not found
+ LOGGER.warn("No shipping code found for " + optionCodeBuilder.toString());
+ }
+ }
+
+ }
+
+ shippingSummary.setShippingOptions(options);
+
+ }
+
+
+
+ return shippingSummary;
+
+
+ } catch (Exception e) {
+ LOGGER.error("Error while getting shipping quote",e);
+ try {
+ response.sendError(503, "Error while getting shipping quote" + e.getMessage());
+ } catch (Exception ignore) {
+ }
+ return null;
+ }
+
+
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/order/OrderTotalApi.java b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/order/OrderTotalApi.java
new file mode 100644
index 0000000..1cfcdf1
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/order/OrderTotalApi.java
@@ -0,0 +1,156 @@
+package com.salesmanager.shop.store.api.v1.order;
+
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.business.services.order.OrderService;
+import com.salesmanager.core.business.services.shipping.ShippingQuoteService;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.OrderSummary;
+import com.salesmanager.core.model.order.OrderTotalSummary;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.shipping.ShippingSummary;
+import com.salesmanager.core.model.shoppingcart.ShoppingCart;
+import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
+import com.salesmanager.shop.model.order.ReadableOrderTotalSummary;
+import com.salesmanager.shop.populator.order.ReadableOrderSummaryPopulator;
+import com.salesmanager.shop.store.controller.shoppingCart.facade.ShoppingCartFacade;
+import com.salesmanager.shop.store.controller.store.facade.StoreFacade;
+import com.salesmanager.shop.utils.LabelUtils;
+import com.salesmanager.shop.utils.LanguageUtils;
+
+@Controller
+@RequestMapping("/api/v1")
+public class OrderTotalApi {
+
+ @Inject
+ private StoreFacade storeFacade;
+
+ @Inject
+ private LanguageUtils languageUtils;
+
+ @Inject
+ private ShoppingCartFacade shoppingCartFacade;
+
+ @Inject
+ private LabelUtils messages;
+
+ @Inject
+ private PricingService pricingService;
+
+ @Inject
+ private CustomerService customerService;
+
+ @Inject
+ private ShippingQuoteService shippingQuoteService;
+
+ @Inject
+ private OrderService orderService;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(OrderTotalApi.class);
+
+ /**
+ * This service calculates order total for a given shopping cart
+ * This method takes in consideration any applicable sales tax
+ * An optional request parameter accepts a quote id that was received using
+ * shipping api
+ * @param id
+ * @param quote
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping(value = {"/auth/cart/{id}/payment"}, method=RequestMethod.GET)
+ @ResponseBody
+ public ReadableOrderTotalSummary payment(
+ @PathVariable final Long id,
+ @RequestParam(value = "quote", required=false) Long quote,
+ HttpServletRequest request,
+ HttpServletResponse response) throws Exception {
+
+ try {
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ Principal principal = request.getUserPrincipal();
+ String userName = principal.getName();
+
+ Customer customer = customerService.getByNick(userName);
+
+ if(customer == null) {
+ response.sendError(503, "Error while getting user details to calculate shipping quote");
+ }
+
+ ShoppingCart shoppingCart = shoppingCartFacade.getShoppingCartModel(id, merchantStore);
+
+ if(shoppingCart == null) {
+ response.sendError(404, "Cart id " + id + " does not exist");
+ return null;
+ }
+
+ if(shoppingCart.getCustomerId()==null) {
+ response.sendError(404, "Cart id " + id + " does not exist for exist for user " + userName);
+ return null;
+ }
+
+ if(shoppingCart.getCustomerId().longValue() != customer.getId().longValue()) {
+ response.sendError(404, "Cart id " + id + " does not exist for exist for user " + userName);
+ return null;
+ }
+
+
+ ShippingSummary shippingSummary = null;
+
+ //get shipping quote if asked for
+ if(quote != null) {
+ shippingSummary = shippingQuoteService.getShippingSummary(quote, merchantStore);
+ }
+
+ OrderTotalSummary orderTotalSummary = null;
+
+ OrderSummary orderSummary = new OrderSummary();
+ orderSummary.setShippingSummary(shippingSummary);
+ List<ShoppingCartItem> itemsSet = new ArrayList<ShoppingCartItem>(shoppingCart.getLineItems());
+ orderSummary.setProducts(itemsSet);
+
+ orderTotalSummary = orderService.caculateOrderTotal(orderSummary, customer, merchantStore, language);
+
+ ReadableOrderTotalSummary returnSummary = new ReadableOrderTotalSummary();
+ ReadableOrderSummaryPopulator populator = new ReadableOrderSummaryPopulator();
+ populator.setMessages(messages);
+ populator.setPricingService(pricingService);
+ populator.populate(orderTotalSummary, returnSummary, merchantStore, language);
+
+ return returnSummary;
+
+
+
+ } catch (Exception e) {
+ LOGGER.error("Error while calculating order summary",e);
+ try {
+ response.sendError(503, "Error while calculating order summary " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+ return null;
+ }
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/product/ManufacturerApi.java b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/product/ManufacturerApi.java
new file mode 100644
index 0000000..dc108ff
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/product/ManufacturerApi.java
@@ -0,0 +1,211 @@
+package com.salesmanager.shop.store.api.v1.product;
+
+import java.util.List;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+import com.salesmanager.core.business.services.catalog.product.manufacturer.ManufacturerService;
+import com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.catalog.manufacturer.PersistableManufacturer;
+import com.salesmanager.shop.model.catalog.manufacturer.ReadableManufacturer;
+import com.salesmanager.shop.store.controller.product.facade.ProductFacade;
+import com.salesmanager.shop.store.controller.store.facade.StoreFacade;
+import com.salesmanager.shop.utils.LanguageUtils;
+
+/**
+ * Manufacturer management
+ * Collection, Manufacturer ...
+ * @author c.samson
+ *
+ */
+@Controller
+@RequestMapping("/api/v1")
+public class ManufacturerApi {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ManufacturerApi.class);
+
+ @Inject
+ private StoreFacade storeFacade;
+
+ @Inject
+ private LanguageUtils languageUtils;
+
+ @Inject
+ private ProductFacade productFacade;
+
+ @Inject
+ private ManufacturerService manufacturerService;
+
+
+ /**
+ * Method for creating a manufacturer
+ * @param store
+ * @param manufacturer
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping( value="/private/manufacturers", method=RequestMethod.POST)
+ @ResponseStatus(HttpStatus.CREATED)
+ @ResponseBody
+ public PersistableManufacturer create(@Valid @RequestBody PersistableManufacturer manufacturer, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ productFacade.saveOrUpdateManufacturer(manufacturer, merchantStore, language);
+
+ return manufacturer;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while creating manufacturer",e);
+ try {
+ response.sendError(503, "Error while creating manufacturer " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+
+ }
+
+ @RequestMapping( value="/manufacturers/{id}", method=RequestMethod.GET)
+ @ResponseStatus(HttpStatus.OK)
+ @ResponseBody
+ public ReadableManufacturer get(@PathVariable Long id, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ ReadableManufacturer manufacturer = productFacade.getManufacturer(id, merchantStore, language);
+
+ if(manufacturer==null) {
+ response.sendError(404, "No Manufacturer found for ID : " + id);
+ }
+
+ return manufacturer;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while getting manufacturer",e);
+ try {
+ response.sendError(503, "Error while getting manufacturer " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+
+ }
+
+ return null;
+
+
+ }
+
+ @RequestMapping( value="/manufacturers/", method=RequestMethod.GET)
+ @ResponseStatus(HttpStatus.OK)
+ @ResponseBody
+ public List<ReadableManufacturer> getAll(HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ return productFacade.getAllManufacturers(merchantStore, language);
+
+ } catch (Exception e) {
+ LOGGER.error("Error while getting manufacturer list",e);
+ try {
+ response.sendError(503, "Error while getting manufacturer list " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+
+ }
+
+ return null;
+
+ }
+
+ @RequestMapping( value="/private/manufacturers/{id}", method=RequestMethod.POST)
+ @ResponseStatus(HttpStatus.OK)
+ @ResponseBody
+ public PersistableManufacturer update(@PathVariable Long id, @Valid @RequestBody PersistableManufacturer manufacturer, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ productFacade.saveOrUpdateManufacturer(manufacturer, merchantStore, language);
+
+ return manufacturer;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while creating manufacturer",e);
+ try {
+ response.sendError(503, "Error while creating manufacturer " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+
+ }
+
+ @RequestMapping( value="/manufacturers/{id}", method=RequestMethod.DELETE)
+ @ResponseStatus(HttpStatus.OK)
+ @ResponseBody
+ public void delete(@PathVariable Long id, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ Manufacturer manufacturer = manufacturerService.getById(id);
+
+ if(manufacturer != null){
+ productFacade.deleteManufacturer(manufacturer, merchantStore, language);
+ }else{
+ response.sendError(404, "No Manufacturer found for ID : " + id);
+ }
+
+ } catch (Exception e) {
+ LOGGER.error("Error while deleting manufacturer id " + id,e);
+ try {
+ response.sendError(503, "Error while deleting manufacturer id " + id + " - " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+
+ }
+
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/product/ProductApi.java b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/product/ProductApi.java
new file mode 100644
index 0000000..352b3cb
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/product/ProductApi.java
@@ -0,0 +1,588 @@
+package com.salesmanager.shop.store.api.v1.product;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+import com.salesmanager.core.business.services.catalog.category.CategoryService;
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.business.services.merchant.MerchantStoreService;
+import com.salesmanager.core.model.catalog.category.Category;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.ProductCriteria;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.catalog.product.PersistableProduct;
+import com.salesmanager.shop.model.catalog.product.ReadableProduct;
+import com.salesmanager.shop.model.catalog.product.ReadableProductList;
+import com.salesmanager.shop.store.controller.product.facade.ProductFacade;
+import com.salesmanager.shop.store.controller.store.facade.StoreFacade;
+import com.salesmanager.shop.utils.ImageFilePath;
+import com.salesmanager.shop.utils.LanguageUtils;
+
+/**
+ * API to create, read, update and delete a Product
+ * API to create Manufacturer
+ * @author Carl Samson
+ *
+ */
+@Controller
+@RequestMapping("/api/v1")
+public class ProductApi {
+
+ @Inject
+ private MerchantStoreService merchantStoreService;
+
+ @Inject
+ private CategoryService categoryService;
+
+ @Inject
+ private CustomerService customerService;
+
+ @Inject
+ private ProductService productService;
+
+ @Inject
+ private ProductFacade productFacade;
+
+
+ @Inject
+ @Qualifier("img")
+ private ImageFilePath imageUtils;
+
+ @Inject
+ private StoreFacade storeFacade;
+
+ @Inject
+ private LanguageUtils languageUtils;
+
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ProductApi.class);
+
+
+ @ResponseStatus(HttpStatus.CREATED)
+ @RequestMapping( value={"/private/products","/auth/products"}, method=RequestMethod.POST)
+ public @ResponseBody PersistableProduct create(@Valid @RequestBody PersistableProduct product, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ productFacade.saveProduct(merchantStore, product, language);
+
+ return product;
+
+
+ } catch (Exception e) {
+ LOGGER.error("Error while creating product",e);
+ try {
+ response.sendError(503, "Error while creating product " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+
+ }
+ @ResponseStatus(HttpStatus.OK)
+ @RequestMapping( value={"/private/products/{id}","/auth/products/{id}"}, method=RequestMethod.PUT)
+ public @ResponseBody PersistableProduct update(@PathVariable Long id, @Valid @RequestBody PersistableProduct product, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ productFacade.saveProduct(merchantStore, product, merchantStore.getDefaultLanguage());
+
+ return product;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while updating product",e);
+ try {
+ response.sendError(503, "Error while updating product " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+
+ }
+
+ @ResponseStatus(HttpStatus.OK)
+ @RequestMapping( value={"/private/products/{id}","/auth/products/{id}"}, method=RequestMethod.DELETE)
+ public void delete(@PathVariable Long id, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ try {
+ Product product = productService.getById(id);
+ if(product != null){
+ productFacade.deleteProduct(product);
+ }else{
+ response.sendError(404, "No Product found for ID : " + id);
+ }
+ } catch (Exception e) {
+ LOGGER.error("Error while deleting product",e);
+ try {
+ response.sendError(503, "Error while deleting product " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+ }
+ }
+
+
+/**
+ @RequestMapping( value="/private/{store}/manufacturer", method=RequestMethod.POST)
+ @ResponseStatus(HttpStatus.CREATED)
+ @ResponseBody
+ public PersistableManufacturer createManufacturer(@PathVariable final String store, @Valid @RequestBody PersistableManufacturer manufacturer, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ try {
+
+ MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+ if(merchantStore!=null) {
+ if(!merchantStore.getCode().equals(store)) {
+ merchantStore = null;
+ }
+ }
+
+ if(merchantStore== null) {
+ merchantStore = merchantStoreService.getByCode(store);
+ }
+
+ if(merchantStore==null) {
+ LOGGER.error("Merchant store is null for code " + store);
+ response.sendError(503, "Merchant store is null for code " + store);
+ return null;
+ }
+
+ PersistableManufacturerPopulator populator = new PersistableManufacturerPopulator();
+ populator.setLanguageService(languageService);
+
+ com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer manuf = new com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer();
+
+ populator.populate(manufacturer, manuf, merchantStore, merchantStore.getDefaultLanguage());
+
+ manufacturerService.save(manuf);
+
+ manufacturer.setId(manuf.getId());
+
+ return manufacturer;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while saving product",e);
+ try {
+ response.sendError(503, "Error while saving product " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+
+ }
+
+
+ @RequestMapping( value="/private/{store}/product/optionValue", method=RequestMethod.POST)
+ @ResponseStatus(HttpStatus.CREATED)
+ @ResponseBody
+ public PersistableProductOptionValue createProductOptionValue(@PathVariable final String store, @Valid @RequestBody PersistableProductOptionValue optionValue, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ try {
+
+ MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+ if(merchantStore!=null) {
+ if(!merchantStore.getCode().equals(store)) {
+ merchantStore = null;
+ }
+ }
+
+ if(merchantStore== null) {
+ merchantStore = merchantStoreService.getByCode(store);
+ }
+
+ if(merchantStore==null) {
+ LOGGER.error("Merchant store is null for code " + store);
+ response.sendError(503, "Merchant store is null for code " + store);
+ return null;
+ }
+
+ PersistableProductOptionValuePopulator populator = new PersistableProductOptionValuePopulator();
+ populator.setLanguageService(languageService);
+
+ com.salesmanager.core.model.catalog.product.attribute.ProductOptionValue optValue = new com.salesmanager.core.model.catalog.product.attribute.ProductOptionValue();
+ populator.populate(optionValue, optValue, merchantStore, merchantStore.getDefaultLanguage());
+
+ productOptionValueService.save(optValue);
+
+ optionValue.setId(optValue.getId());
+
+ return optionValue;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while saving product option value",e);
+ try {
+ response.sendError(503, "Error while saving product option value" + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+
+ }
+
+
+ @RequestMapping( value="/private/{store}/product/option", method=RequestMethod.POST)
+ @ResponseStatus(HttpStatus.CREATED)
+ @ResponseBody
+ public PersistableProductOption createProductOption(@PathVariable final String store, @Valid @RequestBody PersistableProductOption option, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ try {
+
+ MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+ if(merchantStore!=null) {
+ if(!merchantStore.getCode().equals(store)) {
+ merchantStore = null;
+ }
+ }
+
+ if(merchantStore== null) {
+ merchantStore = merchantStoreService.getByCode(store);
+ }
+
+ if(merchantStore==null) {
+ LOGGER.error("Merchant store is null for code " + store);
+ response.sendError(503, "Merchant store is null for code " + store);
+ return null;
+ }
+
+ PersistableProductOptionPopulator populator = new PersistableProductOptionPopulator();
+ populator.setLanguageService(languageService);
+
+ com.salesmanager.core.model.catalog.product.attribute.ProductOption opt = new com.salesmanager.core.model.catalog.product.attribute.ProductOption();
+ populator.populate(option, opt, merchantStore, merchantStore.getDefaultLanguage());
+
+ productOptionService.save(opt);
+
+ option.setId(opt.getId());
+
+ return option;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while saving product option",e);
+ try {
+ response.sendError(503, "Error while saving product option" + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+ }
+
+
+ @RequestMapping( value="/private/{store}/product/review", method=RequestMethod.POST)
+ @ResponseStatus(HttpStatus.CREATED)
+ @ResponseBody
+ public PersistableProductReview createProductReview(@PathVariable final String store, @Valid @RequestBody PersistableProductReview review, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ try {
+
+ MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+ if(merchantStore!=null) {
+ if(!merchantStore.getCode().equals(store)) {
+ merchantStore = null;
+ }
+ }
+
+ if(merchantStore== null) {
+ merchantStore = merchantStoreService.getByCode(store);
+ }
+
+ if(merchantStore==null) {
+ LOGGER.error("Merchant store is null for code " + store);
+ response.sendError(500, "Merchant store is null for code " + store);
+ return null;
+ }
+
+
+ //rating already exist
+ ProductReview prodReview = productReviewService.getByProductAndCustomer(review.getProductId(), review.getCustomerId());
+ if(prodReview!=null) {
+ response.sendError(500, "A review already exist for this customer and product");
+ return null;
+ }
+
+ //rating maximum 5
+ if(review.getRating()>Constants.MAX_REVIEW_RATING_SCORE) {
+ response.sendError(503, "Maximum rating score is " + Constants.MAX_REVIEW_RATING_SCORE);
+ return null;
+ }
+
+
+
+ PersistableProductReviewPopulator populator = new PersistableProductReviewPopulator();
+ populator.setLanguageService(languageService);
+ populator.setCustomerService(customerService);
+ populator.setProductService(productService);
+
+ com.salesmanager.core.model.catalog.product.review.ProductReview rev = new com.salesmanager.core.model.catalog.product.review.ProductReview();
+ populator.populate(review, rev, merchantStore, merchantStore.getDefaultLanguage());
+
+ productReviewService.create(rev);
+
+
+ review.setId(rev.getId());
+
+ return review;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while saving product review",e);
+ try {
+ response.sendError(503, "Error while saving product review" + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+ }
+
+
+ @RequestMapping("/public/products/{store}")
+ @ResponseBody
+ public ReadableProductList getProducts(@PathVariable String store, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ *//** default routine **//*
+
+ MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+ if(merchantStore!=null) {
+ if(!merchantStore.getCode().equals(store)) {
+ merchantStore = null;
+ }
+ }
+
+ if(merchantStore== null) {
+ merchantStore = merchantStoreService.getByCode(store);
+ }
+
+ if(merchantStore==null) {
+ LOGGER.error("Merchant store is null for code " + store);
+ response.sendError(503, "Merchant store is null for code " + store);
+ return null;
+ }
+
+ Language l = merchantStore.getDefaultLanguage();
+
+ String lang = l.getCode();
+
+ if(!StringUtils.isBlank(request.getParameter(Constants.LANG))) {
+
+ lang = request.getParameter(Constants.LANG);
+
+ }
+
+
+ *//** end default routine **//*
+
+
+
+
+ return this.getProducts(0, 10000, store, lang, null, null, request, response);
+ }*/
+
+
+
+ /**
+ * Filtering product lists based on product attributes
+ * ?category=1
+ * &manufacturer=2
+ * &type=...
+ * &lang=en|fr NOT REQUIRED, will use request language
+ * &start=0 NOT REQUIRED, can be used for pagination
+ * &count=10 NOT REQUIRED, can be used to limit item count
+ * @param model
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping(value = "/products", method=RequestMethod.GET)
+ @ResponseBody
+ public ReadableProductList getFiltered(
+ @RequestParam(value = "lang", required=false) String lang,
+ @RequestParam(value = "category", required=false) Long category,
+ @RequestParam(value = "manufacturer", required=false) Long manufacturer,
+ @RequestParam(value = "status", required=false) String status,
+ @RequestParam(value = "owner", required=false) Long owner,
+ @RequestParam(value = "start", required=false) Integer start,
+ @RequestParam(value = "count", required=false) Integer count,
+ HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ ProductCriteria criteria = new ProductCriteria();
+ if(!StringUtils.isBlank(lang)) {
+ criteria.setLanguage(lang);
+ }
+ if(!StringUtils.isBlank(status)) {
+ criteria.setStatus(status);
+ }
+ if(category != null) {
+ List<Long> categoryIds = new ArrayList<Long>();
+ categoryIds.add(category);
+ criteria.setCategoryIds(categoryIds);
+ }
+ if(manufacturer != null) {
+ criteria.setManufacturerId(manufacturer);
+ }
+
+ if(owner != null) {
+ criteria.setOwnerId(owner);
+ }
+
+ if(start != null) {
+ criteria.setStartIndex(start);
+ }
+ if(count != null) {
+ criteria.setMaxCount(count);
+ }
+
+ //TODO
+ //RENTAL add filter by owner
+ //REPOSITORY to use the new filters
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+
+ ReadableProductList productList = productFacade.getProductListsByCriterias(merchantStore, language, criteria);
+
+ return productList;
+
+ } catch(Exception e) {
+
+ LOGGER.error("Error while filtering products product",e);
+ try {
+ response.sendError(503, "Error while filtering products " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+
+ }
+
+
+
+ }
+
+ /**
+ * API for getting a product
+ * @param id
+ * @param lang
+ * ?lang=fr|en
+ * @param request
+ * @param response
+ * @return ReadableProduct
+ * @throws Exception
+ *
+ * /api/v1/product/123
+ */
+ @RequestMapping(value = "/products/{id}", method=RequestMethod.GET)
+ @ResponseBody
+ public ReadableProduct get(@PathVariable final Long id, @RequestParam(value = "lang", required=false) String lang, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ ReadableProduct product = productFacade.getProduct(merchantStore, id, language);
+
+ if(product==null) {
+ response.sendError(404, "Product not fount for id " + id);
+ return null;
+ }
+
+ return product;
+
+ }
+
+
+ @ResponseStatus(HttpStatus.CREATED)
+ @RequestMapping( value={"/private/products/{productId}/category/{categoryId}","/auth/products/{productId}/category/{categoryId}"}, method=RequestMethod.POST)
+ public @ResponseBody ReadableProduct addProductToCategory(@PathVariable Long productId, @PathVariable Long categoryId, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ //get the product
+ Product product = productService.getById(productId);
+
+ Category category = categoryService.getById(categoryId);
+
+ ReadableProduct readableProduct = productFacade.addProductToCategory(category, product, language);
+
+ return readableProduct;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while adding product to category",e);
+ try {
+ response.sendError(503, "Error while adding product to category " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+ }
+
+ @ResponseStatus(HttpStatus.OK)
+ @RequestMapping( value={"/private/products/{productId}/category/{categoryId}","/auth/products/{productId}/category/{categoryId}"}, method=RequestMethod.DELETE)
+ public @ResponseBody ReadableProduct removeProductFromCategory(@PathVariable Long productId, @PathVariable Long categoryId, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ //get the product
+ Product product = productService.getById(productId);
+
+ Category category = categoryService.getById(categoryId);
+
+ ReadableProduct readableProduct = productFacade.removeProductFromCategory(category, product, language);
+
+ return readableProduct;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while removing product from category",e);
+ try {
+ response.sendError(503, "Error while removing product from category " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/product/ProductGroupApi.java b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/product/ProductGroupApi.java
new file mode 100644
index 0000000..ecfd65f
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/product/ProductGroupApi.java
@@ -0,0 +1,171 @@
+package com.salesmanager.shop.store.api.v1.product;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.relationship.ProductRelationshipService;
+import com.salesmanager.core.business.services.merchant.MerchantStoreService;
+import com.salesmanager.core.business.services.reference.language.LanguageService;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.catalog.product.ReadableProductList;
+import com.salesmanager.shop.store.controller.items.facade.ProductItemsFacade;
+import com.salesmanager.shop.store.controller.store.facade.StoreFacade;
+import com.salesmanager.shop.utils.LanguageUtils;
+
+/**
+ * Used for product grouping such as
+ * featured items
+ * @author carlsamson
+ *
+ */
+@Controller
+@RequestMapping("/api/v1")
+public class ProductGroupApi {
+
+ @Inject
+ private LanguageService languageService;
+
+ @Inject
+ private LanguageUtils languageUtils;
+
+ @Inject
+ private ProductService productService;
+
+ @Inject
+ private ProductRelationshipService productRelationshipService;
+
+ @Inject
+ private MerchantStoreService merchantStoreService;
+
+ @Inject
+ private ProductItemsFacade productItemsFacade;
+
+ @Inject
+ private StoreFacade storeFacade;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ProductGroupApi.class);
+
+
+ /**
+ * Query for a product group
+ * public/products/group/{code}?lang=fr|en
+ * no lang it will take session lang or default store lang
+ * code can be any code used while creating product group, defeult being FEATURED
+ * @param store
+ * @param language
+ * @param groupCode
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping("/products/group/{code}")
+ @ResponseBody
+ public ReadableProductList getProductItemsByGroup(@PathVariable final String code, @RequestParam(value = "lang", required=false) String lang, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+
+ ReadableProductList list = productItemsFacade.listItemsByGroup(code, merchantStore, language);
+
+ if(list == null) {
+ response.sendError(404, "Group not fount for code " + code);
+ return null;
+ }
+
+ return list;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while getting products",e);
+ response.sendError(503, "An error occured while retrieving products " + e.getMessage());
+ }
+
+ return null;
+
+ }
+
+
+ @ResponseStatus(HttpStatus.CREATED)
+ @RequestMapping( value="/private/products/{productId}/group/{code}", method=RequestMethod.POST)
+ public @ResponseBody ReadableProductList addProductToGroup(@PathVariable Long productId, @PathVariable String code, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ //get the product
+ Product product = productService.getById(productId);
+
+ if(product==null) {
+ response.sendError(404, "Product not fount for id " + productId);
+ return null;
+ }
+
+ ReadableProductList list = productItemsFacade.addItemToGroup(product, code, merchantStore, language);
+
+ return list;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while adding product to group",e);
+ try {
+ response.sendError(503, "Error while adding product to group " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+ }
+
+ @ResponseStatus(HttpStatus.OK)
+ @RequestMapping( value="/private/products/{productId}/group/{code}", method=RequestMethod.DELETE)
+ public @ResponseBody ReadableProductList removeProductFromCategory(@PathVariable Long productId, @PathVariable String code, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ //get the product
+ Product product = productService.getById(productId);
+
+ if(product==null) {
+ response.sendError(404, "Product not fount for id " + productId);
+ return null;
+ }
+
+ ReadableProductList list = productItemsFacade.removeItemFromGroup(product, code, merchantStore, language);
+
+ return list;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while removing product from category",e);
+ try {
+ response.sendError(503, "Error while removing product from category " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/product/ProductImageApi.java b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/product/ProductImageApi.java
new file mode 100644
index 0000000..9815d65
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/product/ProductImageApi.java
@@ -0,0 +1,201 @@
+package com.salesmanager.shop.store.api.v1.product;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.image.ProductImageService;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.image.ProductImage;
+import com.salesmanager.core.model.content.FileContentType;
+import com.salesmanager.core.model.content.ImageContentFile;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.catalog.product.PersistableImage;
+import com.salesmanager.shop.populator.catalog.PersistableImagePopulator;
+import com.salesmanager.shop.store.controller.store.facade.StoreFacade;
+import com.salesmanager.shop.utils.LanguageUtils;
+
+@Controller
+@RequestMapping("/api/v1")
+public class ProductImageApi {
+
+ @Inject
+ private ProductImageService productImageService;
+
+ @Inject
+ private StoreFacade storeFacade;
+
+ @Inject
+ private LanguageUtils languageUtils;
+
+
+ @Inject
+ private ProductService productService;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ProductImageApi.class);
+
+ /**
+ * To be used with MultipartFile
+ * @param id
+ * @param uploadfiles
+ * @param request
+ * @param response
+ * @throws Exception
+ */
+ @ResponseStatus(HttpStatus.CREATED)
+ @RequestMapping( value={"/private/products/{id}/images","/auth/products/{id}/images"}, method=RequestMethod.POST)
+ public void uploadImages(@PathVariable Long id, @RequestParam("files") MultipartFile[] uploadfiles, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ try {
+
+ //get the product
+ Product product = productService.getById(id);
+
+ if(product == null){
+ response.sendError(404, "No Product found for ID : " + id);
+ return;
+ }
+
+
+ boolean hasDefaultImage = false;
+ Set<ProductImage> images = product.getImages();
+ if(!CollectionUtils.isEmpty(images)) {
+ for(ProductImage image : images) {
+ if(image.isDefaultImage()) {
+ hasDefaultImage = true;
+ break;
+ }
+ }
+ }
+
+
+ List<ProductImage> contentImagesList=new ArrayList<ProductImage>();
+
+ for(MultipartFile multipartFile : uploadfiles){
+ if(!multipartFile.isEmpty()){
+ ProductImage productImage = new ProductImage();
+ productImage.setImage(multipartFile.getInputStream());
+ productImage.setProductImage(multipartFile.getOriginalFilename() );
+ productImage.setProduct(product);
+
+ if(!hasDefaultImage) {
+ productImage.setDefaultImage(true);
+ hasDefaultImage = true;
+ }
+
+ contentImagesList.add( productImage);
+ }
+ }
+
+ if(CollectionUtils.isNotEmpty( contentImagesList )){
+ productImageService.addProductImages(product, contentImagesList);
+ }
+
+
+ } catch(Exception e) {
+ LOGGER.error("Error while creating ProductImage",e);
+ try {
+ response.sendError(503, "Error while creating ProductImage " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ }
+
+ }
+
+ /**
+ * Simple way of uploading image using Base64
+ * @param id
+ * @param image
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @ResponseStatus(HttpStatus.CREATED)
+ @RequestMapping( value={"/private/products/{id}/images/v0"}, method=RequestMethod.POST)
+ public @ResponseBody PersistableImage createImage(@PathVariable Long id, @Valid @RequestBody PersistableImage image, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ //get the product
+ Product product = productService.getById(id);
+
+ PersistableImagePopulator imagePopulator = new PersistableImagePopulator();
+ imagePopulator.setProduct(product);
+ ProductImage productImage = imagePopulator.populate(image, merchantStore, language);
+
+ InputStream input = new ByteArrayInputStream(image.getBytes());
+
+ ImageContentFile file = new ImageContentFile();
+ file.setFile(input);
+ file.setFileContentType(FileContentType.IMAGE);
+ file.setFileName(productImage.getProductImage());
+ file.setMimeType(image.getContentType());
+
+ productImageService.addProductImage(product, productImage, file);
+ image.setId(productImage.getId());
+
+ return image;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while creating ProductImage",e);
+ try {
+ response.sendError(503, "Error while creating ProductImage " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+ }
+
+ @ResponseStatus(HttpStatus.OK)
+ @RequestMapping( value={"/private/products/images/{id}","/auth/products/images/{id}"}, method=RequestMethod.DELETE)
+ public void deleteImage( @PathVariable Long id, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ try {
+ ProductImage productImage = productImageService.getById(id);
+
+ if(productImage != null){
+ productImageService.delete(productImage);
+ }else{
+ response.sendError(404, "No ProductImage found for ID : " + id);
+ }
+
+ } catch (Exception e) {
+ LOGGER.error("Error while deleting ProductImage",e);
+ try {
+ response.sendError(503, "Error while deleting ProductImage " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+ }
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/product/ProductReviewApi.java b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/product/ProductReviewApi.java
new file mode 100644
index 0000000..8fd88e0
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/product/ProductReviewApi.java
@@ -0,0 +1,221 @@
+package com.salesmanager.shop.store.api.v1.product;
+
+import java.util.List;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.review.ProductReviewService;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.review.ProductReview;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.model.catalog.product.PersistableProductReview;
+import com.salesmanager.shop.model.catalog.product.ReadableProductReview;
+import com.salesmanager.shop.store.controller.product.facade.ProductFacade;
+import com.salesmanager.shop.store.controller.store.facade.StoreFacade;
+import com.salesmanager.shop.utils.LanguageUtils;
+
+@Controller
+@RequestMapping("/api/v1")
+public class ProductReviewApi {
+
+ @Inject
+ private ProductFacade productFacade;
+
+ @Inject
+ private StoreFacade storeFacade;
+
+ @Inject
+ private LanguageUtils languageUtils;
+
+ @Inject
+ private ProductService productService;
+
+ @Inject
+ private ProductReviewService productReviewService;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ProductReviewApi.class);
+
+
+
+ @RequestMapping( value={"/private/products/{id}/reviews","/auth/products/{id}/reviews","/auth/products/{id}/reviews","/auth/products/{id}/reviews"}, method=RequestMethod.POST)
+ @ResponseStatus(HttpStatus.CREATED)
+ @ResponseBody
+ public PersistableProductReview create(@PathVariable final Long id, @Valid @RequestBody PersistableProductReview review, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ //rating already exist
+ ProductReview prodReview = productReviewService.getByProductAndCustomer(review.getProductId(), review.getCustomerId());
+ if(prodReview!=null) {
+ response.sendError(500, "A review already exist for this customer and product");
+ return null;
+ }
+
+ //rating maximum 5
+ if(review.getRating()>Constants.MAX_REVIEW_RATING_SCORE) {
+ response.sendError(503, "Maximum rating score is " + Constants.MAX_REVIEW_RATING_SCORE);
+ return null;
+ }
+
+ review.setProductId(id);
+
+
+
+ productFacade.saveOrUpdateReview(review, merchantStore, language);
+
+ return review;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while saving product review",e);
+ try {
+ response.sendError(503, "Error while saving product review" + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+ }
+
+ @RequestMapping( value="/products/{id}/reviews", method=RequestMethod.GET)
+ @ResponseStatus(HttpStatus.OK)
+ @ResponseBody
+ public List<ReadableProductReview> getAll(@PathVariable final Long id, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ //product exist
+ Product product = productService.getById(id);
+
+ if(product==null) {
+ response.sendError(404, "Product id " + id + " does not exists");
+ return null;
+ }
+
+
+
+ List<ReadableProductReview> reviews = productFacade.getProductReviews(product, merchantStore, language);
+
+ return reviews;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while getting product reviews",e);
+ try {
+ response.sendError(503, "Error while getting product reviews" + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+ }
+
+
+ @RequestMapping( value={"/private/products/{id}/reviews/{reviewid}","/auth/products/{id}/reviews/{reviewid}"}, method=RequestMethod.PUT)
+ @ResponseStatus(HttpStatus.OK)
+ @ResponseBody
+ public PersistableProductReview update(@PathVariable final Long id, @PathVariable final Long reviewId, @Valid @RequestBody PersistableProductReview review, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ ProductReview prodReview = productReviewService.getById(reviewId);
+ if(prodReview==null) {
+ response.sendError(404, "Product review with id " + reviewId + " does not exist");
+ return null;
+ }
+
+ if(prodReview.getCustomer().getId().longValue() != review.getCustomerId().longValue()) {
+ response.sendError(404, "Product review with id " + reviewId + " does not exist");
+ return null;
+ }
+
+ //rating maximum 5
+ if(review.getRating()>Constants.MAX_REVIEW_RATING_SCORE) {
+ response.sendError(503, "Maximum rating score is " + Constants.MAX_REVIEW_RATING_SCORE);
+ return null;
+ }
+
+ review.setProductId(id);
+
+
+ productFacade.saveOrUpdateReview(review, merchantStore, language);
+
+ return review;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while saving product review",e);
+ try {
+ response.sendError(503, "Error while saving product review" + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+ }
+
+ @RequestMapping( value={"/private/products/{id}/reviews/{reviewid}","/auth/products/{id}/reviews/{reviewid}"}, method=RequestMethod.DELETE)
+ @ResponseStatus(HttpStatus.OK)
+ @ResponseBody
+ public void delete(@PathVariable final Long id, @PathVariable final Long reviewId, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ ProductReview prodReview = productReviewService.getById(reviewId);
+ if(prodReview==null) {
+ response.sendError(404, "Product review with id " + reviewId + " does not exist");
+ return;
+ }
+
+ if(prodReview.getProduct().getId().longValue() != id.longValue()) {
+ response.sendError(404, "Product review with id " + reviewId + " does not exist");
+ return;
+ }
+
+
+ productFacade.deleteReview(prodReview, merchantStore, language);
+
+
+
+ } catch (Exception e) {
+ LOGGER.error("Error while deleting product review",e);
+ try {
+ response.sendError(503, "Error while deleting product review" + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return;
+ }
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/search/SearchApi.java b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/search/SearchApi.java
new file mode 100644
index 0000000..36d6e83
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/search/SearchApi.java
@@ -0,0 +1,80 @@
+package com.salesmanager.shop.store.api.v1.search;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.catalog.SearchProductList;
+import com.salesmanager.shop.model.catalog.SearchProductRequest;
+import com.salesmanager.shop.store.controller.search.facade.SearchFacade;
+import com.salesmanager.shop.store.controller.store.facade.StoreFacade;
+import com.salesmanager.shop.utils.LanguageUtils;
+
+/**
+ * Api for searching shopizer catalog based on search term
+ * when filtering products based on product attribute is required, see /api/v1/product
+ * @author c.samson
+ *
+ */
+@Controller
+@RequestMapping("/api/v1")
+public class SearchApi {
+
+ @Inject
+ private SearchFacade searchFacade;
+
+ @Inject
+ private StoreFacade storeFacade;
+
+ @Inject
+ private LanguageUtils languageUtils;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(SearchApi.class);
+
+
+ /**
+ * Search products from underlying elastic search
+ * @param searchRequest
+ * @param lang nothing or en or fr ...
+ * @param request
+ * @param response
+ * @return SearchProductList
+ * @throws Exception
+ */
+ @ResponseStatus(HttpStatus.FOUND)
+ @RequestMapping( value="/search", method=RequestMethod.POST)
+ public @ResponseBody SearchProductList search(@RequestBody SearchProductRequest searchRequest, @RequestParam(value = "lang", required=false) String lang, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+ SearchProductList productList = searchFacade.search(merchantStore, language, searchRequest);
+
+ return productList;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while searching products",e);
+ try {
+ response.sendError(503, "Error while searching products " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ }
+ return null;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/shoppingCart/ShoppingCartApi.java b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/shoppingCart/ShoppingCartApi.java
new file mode 100644
index 0000000..bb1c2e6
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/api/v1/shoppingCart/ShoppingCartApi.java
@@ -0,0 +1,123 @@
+package com.salesmanager.shop.store.api.v1.shoppingCart;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpStatus;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.shoppingcart.PersistableShoppingCartItem;
+import com.salesmanager.shop.model.shoppingcart.ReadableShoppingCart;
+import com.salesmanager.shop.store.controller.shoppingCart.facade.ShoppingCartFacade;
+import com.salesmanager.shop.store.controller.store.facade.StoreFacade;
+import com.salesmanager.shop.utils.LanguageUtils;
+
+@Controller
+@RequestMapping("/api/v1")
+public class ShoppingCartApi {
+
+ @Inject
+ private StoreFacade storeFacade;
+
+ @Inject
+ private LanguageUtils languageUtils;
+
+ @Inject
+ private ShoppingCartFacade shoppingCartFacade;
+
+ @Inject
+ private CustomerService customerService;
+
+
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ShoppingCartApi.class);
+
+
+
+ @ResponseStatus(HttpStatus.CREATED)
+ @RequestMapping( value="/customers/{id}/cart", method=RequestMethod.POST)
+ public @ResponseBody ReadableShoppingCart addToCart(@PathVariable Long id, @Valid @RequestBody PersistableShoppingCartItem shoppingCartItem, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ //lookup customer
+ Customer customer = customerService.getById(id);
+
+ if(customer == null){
+ response.sendError(404, "No Customer found for ID : " + id);
+ return null;
+ }
+
+ ReadableShoppingCart cart = shoppingCartFacade.addToCart(customer, shoppingCartItem, merchantStore, language);
+
+ return cart;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while adding product to cart",e);
+ try {
+ response.sendError(503, "Error while adding product to cart " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+
+ }
+
+
+ @ResponseStatus(HttpStatus.OK)
+ @RequestMapping( value="/customers/{id}/cart", method=RequestMethod.GET)
+ public @ResponseBody ReadableShoppingCart get(@PathVariable Long id, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ //lookup customer
+ Customer customer = customerService.getById(id);
+
+ if(customer == null){
+ response.sendError(404, "No Customer found for ID : " + id);
+ return null;
+ }
+
+ ReadableShoppingCart cart = shoppingCartFacade.getCart(customer, merchantStore, language);
+
+ if(cart == null){
+ response.sendError(404, "No ShoppingCart found for customer ID : " + id);
+ return null;
+ }
+
+ return cart;
+
+ } catch (Exception e) {
+ LOGGER.error("Error while getting cart",e);
+ try {
+ response.sendError(503, "Error while getting cart " + e.getMessage());
+ } catch (Exception ignore) {
+ }
+
+ return null;
+ }
+
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/AbstractController.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/AbstractController.java
index 9a113a0..169e400 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/AbstractController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/AbstractController.java
@@ -1,62 +1,62 @@
-/**
- *
- */
-package com.salesmanager.shop.store.controller;
-
-import javax.servlet.http.HttpServletRequest;
-
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.store.model.paging.PaginationData;
-
-/**
- * @author Umesh A
- *
- */
-public abstract class AbstractController {
-
-
- /**
- * Method which will help to retrieving values from Session
- * based on the key being passed to the method.
- * @param key
- * @return value stored in session corresponding to the key
- */
- @SuppressWarnings( "unchecked" )
- protected <T> T getSessionAttribute(final String key, HttpServletRequest request) {
- return (T) com.salesmanager.shop.utils.SessionUtil.getSessionAttribute(key, request);
-
- }
-
- protected void setSessionAttribute(final String key, final Object value, HttpServletRequest request) {
- com.salesmanager.shop.utils.SessionUtil.setSessionAttribute(key, value, request);
- }
-
-
- protected void removeAttribute(final String key, HttpServletRequest request) {
- com.salesmanager.shop.utils.SessionUtil.removeSessionAttribute(key, request);
- }
-
- protected Language getLanguage(HttpServletRequest request) {
- return (Language)request.getAttribute(Constants.LANGUAGE);
- }
-
- protected PaginationData createPaginaionData( final int pageNumber, final int pageSize )
- {
- final PaginationData paginaionData = new PaginationData(pageSize,pageNumber);
-
- return paginaionData;
- }
-
- protected PaginationData calculatePaginaionData( final PaginationData paginationData, final int pageSize, final int resultCount){
-
- int currentPage = paginationData.getCurrentPage();
-
-
- int count = Math.min((currentPage * pageSize), resultCount);
- paginationData.setCountByPage(count);
-
- paginationData.setTotalCount( resultCount );
- return paginationData;
- }
-}
+/**
+ *
+ */
+package com.salesmanager.shop.store.controller;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.store.model.paging.PaginationData;
+
+/**
+ * @author Umesh A
+ *
+ */
+public abstract class AbstractController {
+
+
+ /**
+ * Method which will help to retrieving values from Session
+ * based on the key being passed to the method.
+ * @param key
+ * @return value stored in session corresponding to the key
+ */
+ @SuppressWarnings( "unchecked" )
+ protected <T> T getSessionAttribute(final String key, HttpServletRequest request) {
+ return (T) com.salesmanager.shop.utils.SessionUtil.getSessionAttribute(key, request);
+
+ }
+
+ protected void setSessionAttribute(final String key, final Object value, HttpServletRequest request) {
+ com.salesmanager.shop.utils.SessionUtil.setSessionAttribute(key, value, request);
+ }
+
+
+ protected void removeAttribute(final String key, HttpServletRequest request) {
+ com.salesmanager.shop.utils.SessionUtil.removeSessionAttribute(key, request);
+ }
+
+ protected Language getLanguage(HttpServletRequest request) {
+ return (Language)request.getAttribute(Constants.LANGUAGE);
+ }
+
+ protected PaginationData createPaginaionData( final int pageNumber, final int pageSize )
+ {
+ final PaginationData paginaionData = new PaginationData(pageSize,pageNumber);
+
+ return paginaionData;
+ }
+
+ protected PaginationData calculatePaginaionData( final PaginationData paginationData, final int pageSize, final int resultCount){
+
+ int currentPage = paginationData.getCurrentPage();
+
+
+ int count = Math.min((currentPage * pageSize), resultCount);
+ paginationData.setCountByPage(count);
+
+ paginationData.setTotalCount( resultCount );
+ return paginationData;
+ }
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/category/facade/CategoryFacade.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/category/facade/CategoryFacade.java
index 74dc6e4..aa102d1 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/category/facade/CategoryFacade.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/category/facade/CategoryFacade.java
@@ -1,5 +1,6 @@
package com.salesmanager.shop.store.controller.category.facade;
+import com.salesmanager.core.model.catalog.category.Category;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.reference.language.Language;
import com.salesmanager.shop.model.catalog.category.PersistableCategory;
@@ -17,8 +18,14 @@ public interface CategoryFacade {
* @return
* @throws Exception
*/
- List<ReadableCategory> getCategoryHierarchy(MerchantStore store, int depth, Language language) throws Exception;
+ List<ReadableCategory> getCategoryHierarchy(MerchantStore store, int depth, Language language, String filter) throws Exception;
void saveCategory(MerchantStore store, PersistableCategory category) throws Exception;
+
+ ReadableCategory getById(MerchantStore store, Long id, Language language) throws Exception;
+
+ ReadableCategory getByCode(MerchantStore store, String code, Language language) throws Exception;
+
+ void deleteCategory(Category category) throws Exception;
}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/category/facade/CategoryFacadeImpl.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/category/facade/CategoryFacadeImpl.java
index 4296375..70d6e17 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/category/facade/CategoryFacadeImpl.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/category/facade/CategoryFacadeImpl.java
@@ -1,5 +1,19 @@
package com.salesmanager.shop.store.controller.category.facade;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.inject.Inject;
+
+import org.apache.commons.lang.Validate;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
import com.salesmanager.core.business.exception.ServiceException;
import com.salesmanager.core.business.services.catalog.category.CategoryService;
import com.salesmanager.core.business.services.reference.language.LanguageService;
@@ -10,12 +24,6 @@ import com.salesmanager.shop.model.catalog.category.PersistableCategory;
import com.salesmanager.shop.model.catalog.category.ReadableCategory;
import com.salesmanager.shop.populator.catalog.PersistableCategoryPopulator;
import com.salesmanager.shop.populator.catalog.ReadableCategoryPopulator;
-import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
-
-import javax.inject.Inject;
-import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
@Service( value = "categoryFacade" )
@@ -26,12 +34,28 @@ public class CategoryFacadeImpl implements CategoryFacade {
@Inject
private LanguageService languageService;
+
+ private final static String FEATURED_CATEGORY = "featured";
@Override
public List<ReadableCategory> getCategoryHierarchy(MerchantStore store,
- int depth, Language language) throws Exception {
+ int depth, Language language, String filter) throws Exception {
+
+
+ List<Category> categories = null;
- List<Category> categories = categoryService.listByDepth(store, depth, language);
+ if(!StringUtils.isBlank(filter)) {
+ //as of 2.2.0 only filter by featured is supported
+ if(FEATURED_CATEGORY.equals(filter)) {
+ categories = categoryService.listByDepthFilterByFeatured(store, depth, language);
+ } else {
+ categories = categoryService.listByDepth(store, depth, language);
+ }
+ } else {
+ categories = categoryService.listByDepth(store, depth, language);
+ }
+
+
List<ReadableCategory> returnValues = new ArrayList<ReadableCategory>();
Map<Long, ReadableCategory> categoryMap = new ConcurrentHashMap<Long, ReadableCategory>();
@@ -88,10 +112,21 @@ public class CategoryFacadeImpl implements CategoryFacade {
populator.setCategoryService(categoryService);
populator.setLanguageService(languageService);
- Category dbCategory = populator.populate(category, new Category(), store, store.getDefaultLanguage());
+ Category target = null;
+
+ if(category.getId() != null && category.getId().longValue() > 0) {
+ target = categoryService.getById(category.getId());
+ } else {
+ target = new Category();
+ }
+
+ Category dbCategory = populator.populate(category, target, store, store.getDefaultLanguage());
this.saveCategory(store, dbCategory, null);
+ //set category id
+ category.setId(dbCategory.getId());
+
}
@@ -144,4 +179,72 @@ public class CategoryFacadeImpl implements CategoryFacade {
}
}
+ @Override
+ public ReadableCategory getById(MerchantStore store, Long id, Language language) throws Exception {
+ Category categoryModel = categoryService.getByLanguage(id, language);
+
+ if(categoryModel == null)
+ return null;
+
+ StringBuilder lineage = new StringBuilder();
+ lineage.append(categoryModel.getLineage());
+ lineage.append(categoryModel.getId());
+
+ //get children
+ List<Category> children = categoryService.listByLineage(store, lineage.toString());
+
+
+
+ ReadableCategoryPopulator populator = new ReadableCategoryPopulator();
+
+
+ ReadableCategory category = populator.populate(categoryModel, new ReadableCategory(), store, language);
+
+ Map<Long, ReadableCategory> categoryMap = new ConcurrentHashMap<Long, ReadableCategory>();
+ List<ReadableCategory> returnValues = new ArrayList<ReadableCategory>();
+ categoryMap.put(categoryModel.getId(), category);
+
+
+ for(Category child : children) {
+ ReadableCategory c = new ReadableCategory();
+ populator.populate(child, c, store, language);
+ returnValues.add(c);
+ categoryMap.put(c.getId(),c);
+ }
+
+ //traverse map and add child to parent
+ for(ReadableCategory readable : returnValues) {
+
+ if(readable.getParent() != null) {
+
+ ReadableCategory rc = categoryMap.get(readable.getParent().getId());
+ rc.getChildren().add(readable);
+
+ }
+ }
+
+
+ return category;
+
+ }
+
+ @Override
+ public void deleteCategory(Category category) throws Exception {
+ categoryService.delete(category);
+ }
+
+ @Override
+ public ReadableCategory getByCode(MerchantStore store, String code, Language language) throws Exception {
+
+ Validate.notNull(code,"category code must not be null");
+ ReadableCategoryPopulator categoryPopulator = new ReadableCategoryPopulator();
+ ReadableCategory readableCategory = new ReadableCategory();
+
+ Category category = categoryService.getByCode(store, code);
+ categoryPopulator.populate(category, readableCategory, store, language);
+
+ return readableCategory;
+
+ }
+
}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/category/ShoppingCategoryController.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/category/ShoppingCategoryController.java
index 2ae58fd..f75691b 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/category/ShoppingCategoryController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/category/ShoppingCategoryController.java
@@ -1,721 +1,721 @@
-package com.salesmanager.shop.store.controller.category;
-
-import com.salesmanager.core.business.services.catalog.category.CategoryService;
-import com.salesmanager.core.business.services.catalog.product.PricingService;
-import com.salesmanager.core.business.services.catalog.product.ProductService;
-import com.salesmanager.core.business.services.catalog.product.manufacturer.ManufacturerService;
-import com.salesmanager.core.business.services.merchant.MerchantStoreService;
-import com.salesmanager.core.business.services.reference.language.LanguageService;
-import com.salesmanager.core.business.utils.CacheUtils;
-import com.salesmanager.core.model.catalog.category.Category;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.ProductCriteria;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.model.catalog.ProductList;
-import com.salesmanager.shop.model.catalog.category.ReadableCategory;
-import com.salesmanager.shop.model.catalog.manufacturer.ReadableManufacturer;
-import com.salesmanager.shop.model.catalog.product.ReadableProduct;
-import com.salesmanager.shop.model.shop.Breadcrumb;
-import com.salesmanager.shop.model.shop.PageInformation;
-import com.salesmanager.shop.populator.catalog.ReadableCategoryPopulator;
-import com.salesmanager.shop.populator.catalog.ReadableProductPopulator;
-import com.salesmanager.shop.populator.manufacturer.ReadableManufacturerPopulator;
-import com.salesmanager.shop.store.controller.ControllerConstants;
-import com.salesmanager.shop.store.model.filter.QueryFilter;
-import com.salesmanager.shop.store.model.filter.QueryFilterType;
-import com.salesmanager.shop.utils.BreadcrumbsUtils;
-import com.salesmanager.shop.utils.ImageFilePath;
-import com.salesmanager.shop.utils.LabelUtils;
-import com.salesmanager.shop.utils.PageBuilderUtils;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.math.BigDecimal;
-import java.util.*;
-
-
-
-/**
- * Renders a given category page based on friendly url
- * Can also filter by facets such as manufacturer
- * @author Carl Samson
- *
- */
-@Controller
-public class ShoppingCategoryController {
-
-
-
- @Inject
- private CategoryService categoryService;
-
- @Inject
- private LanguageService languageService;
-
- @Inject
- private MerchantStoreService merchantStoreService;
-
- @Inject
- private ProductService productService;
-
- @Inject
- private ManufacturerService manufacturerService;
-
- @Inject
- private LabelUtils messages;
-
- @Inject
- private BreadcrumbsUtils breadcrumbsUtils;
-
- @Inject
- private CacheUtils cache;
-
- @Inject
- private PricingService pricingService;
-
- @Inject
- @Qualifier("img")
- private ImageFilePath imageUtils;
-
-
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ShoppingCategoryController.class);
-
-
- /**
- *
- * @param friendlyUrl
- * @param ref
- * @param model
- * @param request
- * @param response
- * @param locale
- * @return
- * @throws Exception
- */
- @RequestMapping("/shop/category/{friendlyUrl}.html/ref={ref}")
- public String displayCategoryWithReference(@PathVariable final String friendlyUrl, @PathVariable final String ref, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
-
-
- return this.displayCategory(friendlyUrl,ref,model,request,response,locale);
- }
-
-
-
- /**
- * Category page entry point
- * @param friendlyUrl
- * @param model
- * @param request
- * @param response
- * @return
- * @throws Exception
- */
- @RequestMapping("/shop/category/{friendlyUrl}.html")
- public String displayCategoryNoReference(@PathVariable final String friendlyUrl, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- return this.displayCategory(friendlyUrl,null,model,request,response,locale);
- }
-
- @SuppressWarnings("unchecked")
- private String displayCategory(final String friendlyUrl, final String ref, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
-
-
-
-
- //get category
- Category category = categoryService.getBySeUrl(store, friendlyUrl);
-
- Language language = (Language)request.getAttribute("LANGUAGE");
-
- if(category==null) {
- LOGGER.error("No category found for friendlyUrl " + friendlyUrl);
- //redirect on page not found
- return PageBuilderUtils.build404(store);
-
- }
-
- if(!category.isVisible()) {
- return PageBuilderUtils.buildHomePage(store);
- }
-
- ReadableCategoryPopulator populator = new ReadableCategoryPopulator();
- ReadableCategory categoryProxy = populator.populate(category, new ReadableCategory(), store, language);
-
- Breadcrumb breadCrumb = breadcrumbsUtils.buildCategoryBreadcrumb(categoryProxy, store, language, request.getContextPath());
- request.getSession().setAttribute(Constants.BREADCRUMB, breadCrumb);
- request.setAttribute(Constants.BREADCRUMB, breadCrumb);
-
-
- //meta information
- PageInformation pageInformation = new PageInformation();
- pageInformation.setPageDescription(categoryProxy.getDescription().getMetaDescription());
- pageInformation.setPageKeywords(categoryProxy.getDescription().getKeyWords());
- pageInformation.setPageTitle(categoryProxy.getDescription().getTitle());
- pageInformation.setPageUrl(categoryProxy.getDescription().getFriendlyUrl());
-
- //** retrieves category id drill down**//
- String lineage = new StringBuilder().append(category.getLineage()).append(category.getId()).append(Constants.CATEGORY_LINEAGE_DELIMITER).toString();
-
-
-
- request.setAttribute(Constants.REQUEST_PAGE_INFORMATION, pageInformation);
-
- //TODO add to caching
- List<Category> subCategs = categoryService.listByLineage(store, lineage);
- List<Long> subIds = new ArrayList<Long>();
- if(subCategs!=null && subCategs.size()>0) {
- for(Category c : subCategs) {
- if(c.isVisible()) {
- subIds.add(c.getId());
- }
- }
- }
- subIds.add(category.getId());
-
-
- StringBuilder subCategoriesCacheKey = new StringBuilder();
- subCategoriesCacheKey
- .append(store.getId())
- .append("_")
- .append(category.getId())
- .append("_")
- .append(Constants.SUBCATEGORIES_CACHE_KEY)
- .append("-")
- .append(language.getCode());
-
- StringBuilder subCategoriesMissed = new StringBuilder();
- subCategoriesMissed
- .append(subCategoriesCacheKey.toString())
- .append(Constants.MISSED_CACHE_KEY);
-
- List<BigDecimal> prices = new ArrayList<BigDecimal>();
- List<ReadableCategory> subCategories = null;
- Map<Long,Long> countProductsByCategories = null;
-
- if(store.isUseCache()) {
-
- //get from the cache
- subCategories = (List<ReadableCategory>) cache.getFromCache(subCategoriesCacheKey.toString());
- if(subCategories==null) {
- //get from missed cache
- //Boolean missedContent = (Boolean)cache.getFromCache(subCategoriesMissed.toString());
-
- //if(missedContent==null) {
- countProductsByCategories = getProductsByCategory(store, category, lineage, subIds);
- subCategories = getSubCategories(store,category,countProductsByCategories,language,locale);
-
- if(subCategories!=null) {
- cache.putInCache(subCategories, subCategoriesCacheKey.toString());
- } else {
- //cache.putInCache(new Boolean(true), subCategoriesCacheKey.toString());
- }
- //}
- }
- } else {
- countProductsByCategories = getProductsByCategory(store, category, lineage, subIds);
- subCategories = getSubCategories(store,category,countProductsByCategories,language,locale);
- }
-
- //Parent category
- ReadableCategory parentProxy = null;
-
- if(category.getParent()!=null) {
- Category parent = categoryService.getById(category.getParent().getId());
- parentProxy = populator.populate(parent, new ReadableCategory(), store, language);
- }
-
-
- //** List of manufacturers **//
- List<ReadableManufacturer> manufacturerList = getManufacturersByProductAndCategory(store,category,subIds,language);
-
- model.addAttribute("manufacturers", manufacturerList);
- model.addAttribute("parent", parentProxy);
- model.addAttribute("category", categoryProxy);
- model.addAttribute("subCategories", subCategories);
-
- if(parentProxy!=null) {
- request.setAttribute(Constants.LINK_CODE, parentProxy.getDescription().getFriendlyUrl());
- }
-
-
- /** template **/
- StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Category.category).append(".").append(store.getStoreTemplate());
-
- return template.toString();
- }
-
- @SuppressWarnings("unchecked")
- private List<ReadableManufacturer> getManufacturersByProductAndCategory(MerchantStore store, Category category, List<Long> subCategoryIds, Language language) throws Exception {
-
- List<ReadableManufacturer> manufacturerList = null;
- /** List of manufacturers **/
- if(subCategoryIds!=null && subCategoryIds.size()>0) {
-
- StringBuilder manufacturersKey = new StringBuilder();
- manufacturersKey
- .append(store.getId())
- .append("_")
- .append(Constants.MANUFACTURERS_BY_PRODUCTS_CACHE_KEY)
- .append("-")
- .append(language.getCode());
-
- StringBuilder manufacturersKeyMissed = new StringBuilder();
- manufacturersKeyMissed
- .append(manufacturersKey.toString())
- .append(Constants.MISSED_CACHE_KEY);
-
- if(store.isUseCache()) {
-
- //get from the cache
-
- manufacturerList = (List<ReadableManufacturer>) cache.getFromCache(manufacturersKey.toString());
-
-
- if(manufacturerList==null) {
- //get from missed cache
- //Boolean missedContent = (Boolean)cache.getFromCache(manufacturersKeyMissed.toString());
- //if(missedContent==null) {
- manufacturerList = this.getManufacturers(store, subCategoryIds, language);
- if(manufacturerList.isEmpty()) {
- cache.putInCache(new Boolean(true), manufacturersKeyMissed.toString());
- } else {
- //cache.putInCache(manufacturerList, manufacturersKey.toString());
- }
- //}
- }
- } else {
- manufacturerList = this.getManufacturers(store, subCategoryIds, language);
- }
- }
- return manufacturerList;
- }
-
- private List<ReadableManufacturer> getManufacturers(MerchantStore store, List<Long> ids, Language language) throws Exception {
- List<ReadableManufacturer> manufacturerList = null;
- List<com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer> manufacturers = manufacturerService.listByProductsByCategoriesId(store, ids, language);
- if(!manufacturers.isEmpty()) {
- manufacturerList = new ArrayList<ReadableManufacturer>();
- for(com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer manufacturer : manufacturers) {
- ReadableManufacturer manuf = new ReadableManufacturerPopulator().populate(manufacturer, new ReadableManufacturer(), store, language);
- manufacturerList.add(manuf);
-
- }
- }
- return manufacturerList;
- }
-
- private Map<Long,Long> getProductsByCategory(MerchantStore store, Category category, String lineage, List<Long> subIds) throws Exception {
-
- if(subIds.isEmpty()) {
- return null;
- }
-
- List<Object[]> countProductsByCategories = categoryService.countProductsByCategories(store, subIds);
- Map<Long, Long> countByCategories = new HashMap<Long,Long>();
-
- for(Object[] counts : countProductsByCategories) {
- Category c = (Category)counts[0];
- if(c.getParent()!=null) {
- if(c.getParent().getId()==category.getId()) {
- countByCategories.put(c.getId(), (Long)counts[1]);
- } else {
- //get lineage
- String lin = c.getLineage();
- String[] categoryPath = lin.split(Constants.CATEGORY_LINEAGE_DELIMITER);
- for(int i=0 ; i<categoryPath.length; i++) {
- String sId = categoryPath[i];
- if(!StringUtils.isBlank(sId)) {
- Long count = countByCategories.get(Long.parseLong(sId));
- if(count!=null) {
- count = count + (Long)counts[1];
- countByCategories.put(Long.parseLong(sId), count);
- }
- }
- }
- }
- }
- }
-
- return countByCategories;
-
- }
-
- private List<ReadableCategory> getSubCategories(MerchantStore store, Category category, Map<Long,Long> productCount, Language language, Locale locale) throws Exception {
-
-
- //sub categories
- List<Category> subCategories = categoryService.listByParent(category, language);
- ReadableCategoryPopulator populator = new ReadableCategoryPopulator();
- List<ReadableCategory> subCategoryProxies = new ArrayList<ReadableCategory>();
-
-
-
- for(Category sub : subCategories) {
- ReadableCategory cProxy = populator.populate(sub, new ReadableCategory(), store, language);
- //com.salesmanager.web.entity.catalog.Category cProxy = catalogUtils.buildProxyCategory(sub, store, locale);
- if(productCount!=null) {
- Long total = productCount.get(cProxy.getId());
- if(total!=null) {
- cProxy.setProductCount(total.intValue());
- }
- }
- subCategoryProxies.add(cProxy);
- }
-
- return subCategoryProxies;
-
- }
-
-
-
- /**
- * Returns all categories for a given MerchantStore
- */
- @RequestMapping("/services/public/category/{store}/{language}")
- @ResponseBody
- public List<ReadableCategory> getCategories(@PathVariable final String language, @PathVariable final String store, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
- Map<String,Language> langs = languageService.getLanguagesMap();
- Language l = langs.get(language);
- if(l==null) {
- l = languageService.getByCode(Constants.DEFAULT_LANGUAGE);
- }
-
- MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
-
- if(merchantStore!=null) {
- if(!merchantStore.getCode().equals(store)) {
- merchantStore = null; //reset for the current request
- }
- }
-
- if(merchantStore== null) {
- merchantStore = merchantStoreService.getByCode(store);
- }
-
- if(merchantStore==null) {
- LOGGER.error("Merchant store is null for code " + store);
- response.sendError(503, "Merchant store is null for code " + store);//TODO localized message
- return null;
- }
-
- List<Category> categories = categoryService.listByStore(merchantStore, l);
-
- ReadableCategoryPopulator populator = new ReadableCategoryPopulator();
-
- List<ReadableCategory> returnCategories = new ArrayList<ReadableCategory>();
- for(Category category : categories) {
- ReadableCategory categoryProxy = populator.populate(category, new ReadableCategory(), merchantStore, l);
- returnCategories.add(categoryProxy);
- }
-
- return returnCategories;
- }
-
- /**
- * Returns an array of products belonging to a given category
- * in a given language for a given store
- * url example : http://<host>/sm-shop/shop/services/public/products/DEFAULT/BOOKS
- * @param store
- * @param language
- * @param category
- * @param model
- * @param request
- * @param response
- * @return
- * @throws Exception
- **/
- ////TODO : services/public/DEFAULT/products/category/MYCATEGORY?lang=fr
- @RequestMapping("/services/public/products/{store}/{language}/{category}")
- @ResponseBody
- public ProductList getProducts(@PathVariable final String store, @PathVariable final String language, @PathVariable final String category, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
- //http://localhost:8080/sm-shop/services/public/products/DEFAULT/en/book
-
- try {
-
-
- /**
- * How to Spring MVC Rest web service - ajax / jquery
- * http://codetutr.com/2013/04/09/spring-mvc-easy-rest-based-json-services-with-responsebody/
- */
-
- MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
- Map<String,Language> langs = languageService.getLanguagesMap();
-
- if(merchantStore!=null) {
- if(!merchantStore.getCode().equals(store)) {
- merchantStore = null; //reset for the current request
- }
- }
-
- if(merchantStore== null) {
- merchantStore = merchantStoreService.getByCode(store);
- }
-
- if(merchantStore==null) {
- LOGGER.error("Merchant store is null for code " + store);
- response.sendError(503, "Merchant store is null for code " + store);//TODO localized message
- return null;
- }
-
- //get the category by code
- Category cat = categoryService.getBySeUrl(merchantStore, category);
-
- if(cat==null) {
- LOGGER.error("Category with friendly url " + category + " is null");
- response.sendError(503, "Category is null");//TODO localized message
- }
-
- String lineage = new StringBuilder().append(cat.getLineage()).append(cat.getId()).append("/").toString();
-
- List<Category> categories = categoryService.listByLineage(store, lineage);
-
- List<Long> ids = new ArrayList<Long>();
- if(categories!=null && categories.size()>0) {
- for(Category c : categories) {
- ids.add(c.getId());
- }
- }
- ids.add(cat.getId());
-
- Language lang = langs.get(language);
- if(lang==null) {
- lang = langs.get(Constants.DEFAULT_LANGUAGE);
- }
-
- List<com.salesmanager.core.model.catalog.product.Product> products = productService.getProducts(ids, lang);
-
- ProductList productList = new ProductList();
-
- ReadableProductPopulator populator = new ReadableProductPopulator();
- populator.setPricingService(pricingService);
- populator.setimageUtils(imageUtils);
-
- for(Product product : products) {
- //create new proxy product
- ReadableProduct p = populator.populate(product, new ReadableProduct(), merchantStore, lang);
- productList.getProducts().add(p);
-
- }
-
- productList.setProductCount(productList.getProducts().size());
- return productList;
-
-
- } catch (Exception e) {
- LOGGER.error("Error while getting category",e);
- response.sendError(503, "Error while getting category");
- }
-
- return null;
- }
-
-
- /**
- * Will page products of a given category
- * @param store
- * @param language
- * @param category
- * @param model
- * @param request
- * @param response
- * @return
- * @throws Exception
- */
- @RequestMapping("/services/public/products/page/{start}/{max}/{store}/{language}/{category}")
- @ResponseBody
- public ProductList getProducts(@PathVariable int start, @PathVariable int max, @PathVariable String store, @PathVariable final String language, @PathVariable final String category, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
- return this.getProducts(start, max, store, language, category, null, model, request, response);
- }
-
-
- /**
- * An entry point for filtering by another entity such as Manufacturer
- * filter=BRAND&filter-value=123
- * @param start
- * @param max
- * @param store
- * @param language
- * @param category
- * @param filterType
- * @param filterValue
- * @param model
- * @param request
- * @param response
- * @return
- * @throws Exception
- */
- @RequestMapping("/services/public/products/page/{start}/{max}/{store}/{language}/{category}/filter={filterType}/filter-value={filterValue}")
- @ResponseBody
- public ProductList getProductsFilteredByType(@PathVariable int start, @PathVariable int max, @PathVariable String store, @PathVariable final String language, @PathVariable final String category, @PathVariable final String filterType, @PathVariable final String filterValue, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
- List<QueryFilter> queryFilters = null;
- try {
- if(filterType.equals(QueryFilterType.BRAND.name())) {//the only one implemented so far
- QueryFilter filter = new QueryFilter();
- filter.setFilterType(QueryFilterType.BRAND);
- filter.setFilterId(Long.parseLong(filterValue));
- if(queryFilters==null) {
- queryFilters = new ArrayList<QueryFilter>();
- }
- queryFilters.add(filter);
- }
- } catch(Exception e) {
- LOGGER.error("Invalid filter or filter-value " + filterType + " - " + filterValue,e);
- }
-
- return this.getProducts(start, max, store, language, category, queryFilters, model, request, response);
- }
-
-
- private ProductList getProducts(final int start, final int max, final String store, final String language, final String category, final List<QueryFilter> filters, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
- try {
-
-
- MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
- List<BigDecimal> prices = new ArrayList<BigDecimal>();
-
- Map<String,Language> langs = languageService.getLanguagesMap();
-
- if(merchantStore!=null) {
- if(!merchantStore.getCode().equals(store)) {
- merchantStore = null; //reset for the current request
- }
- }
-
- if(merchantStore== null) {
- merchantStore = merchantStoreService.getByCode(store);
- }
-
- if(merchantStore==null) {
- LOGGER.error("Merchant store is null for code " + store);
- response.sendError(503, "Merchant store is null for code " + store);//TODO localized message
- return null;
- }
-
- //get the category by code
- Category cat = categoryService.getBySeUrl(merchantStore, category);
-
- if(cat==null) {
- LOGGER.error("Category " + category + " is null");
- response.sendError(503, "Category is null");//TODO localized message
- return null;
- }
-
- String lineage = new StringBuilder().append(cat.getLineage()).append(cat.getId()).append("/").toString();
-
- List<Category> categories = categoryService.listByLineage(store, lineage);
-
- List<Long> ids = new ArrayList<Long>();
- if(categories!=null && categories.size()>0) {
- for(Category c : categories) {
- if(c.isVisible()) {
- ids.add(c.getId());
- }
- }
- }
- ids.add(cat.getId());
-
-
- Language lang = langs.get(language);
- if(lang==null) {
- lang = langs.get(Constants.DEFAULT_LANGUAGE);
- }
-
- ProductCriteria productCriteria = new ProductCriteria();
- productCriteria.setMaxCount(max);
- productCriteria.setStartIndex(start);
- productCriteria.setCategoryIds(ids);
- productCriteria.setAvailable(true);
-
- if(filters!=null) {
- for(QueryFilter filter : filters) {
- if(filter.getFilterType().name().equals(QueryFilterType.BRAND.name())) {//the only filter implemented
- productCriteria.setManufacturerId(filter.getFilterId());
- }
- }
- }
-
- com.salesmanager.core.model.catalog.product.ProductList products = productService.listByStore(merchantStore, lang, productCriteria);
-
- ReadableProductPopulator populator = new ReadableProductPopulator();
- populator.setPricingService(pricingService);
- populator.setimageUtils(imageUtils);
-
- ProductList productList = new ProductList();
- for(Product product : products.getProducts()) {
-
- //create new proxy product
- ReadableProduct p = populator.populate(product, new ReadableProduct(), merchantStore, lang);
- productList.getProducts().add(p);
- prices.add(p.getPrice());
-
- }
-
-
- /** order products based on the specified order **/
- Collections.sort(productList.getProducts(), new Comparator<ReadableProduct>() {
-
- @Override
- public int compare(ReadableProduct o1, ReadableProduct o2) {
- int order1 = o1.getSortOrder();
- int order2 = o2.getSortOrder();
- return order1 - order2;
- }
- });
-
-
- productList.setProductCount(products.getTotalCount());
-
- if(CollectionUtils.isNotEmpty(prices)) {
- BigDecimal minPrice = (BigDecimal)Collections.min(prices);
- BigDecimal maxPrice = (BigDecimal)Collections.max(prices);
-
- if(minPrice !=null && maxPrice !=null) {
- productList.setMinPrice(minPrice);
- productList.setMaxPrice(maxPrice);
- }
- }
-
-
-
- return productList;
-
-
- } catch (Exception e) {
- LOGGER.error("Error while getting products",e);
- response.sendError(503, "An error occured while retrieving products " + e.getMessage());
- }
-
- return null;
-
- }
-
-
-
-
-
-
-}
+package com.salesmanager.shop.store.controller.category;
+
+import com.salesmanager.core.business.services.catalog.category.CategoryService;
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.manufacturer.ManufacturerService;
+import com.salesmanager.core.business.services.merchant.MerchantStoreService;
+import com.salesmanager.core.business.services.reference.language.LanguageService;
+import com.salesmanager.core.business.utils.CacheUtils;
+import com.salesmanager.core.model.catalog.category.Category;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.ProductCriteria;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.model.catalog.ProductList;
+import com.salesmanager.shop.model.catalog.category.ReadableCategory;
+import com.salesmanager.shop.model.catalog.manufacturer.ReadableManufacturer;
+import com.salesmanager.shop.model.catalog.product.ReadableProduct;
+import com.salesmanager.shop.model.shop.Breadcrumb;
+import com.salesmanager.shop.model.shop.PageInformation;
+import com.salesmanager.shop.populator.catalog.ReadableCategoryPopulator;
+import com.salesmanager.shop.populator.catalog.ReadableProductPopulator;
+import com.salesmanager.shop.populator.manufacturer.ReadableManufacturerPopulator;
+import com.salesmanager.shop.store.controller.ControllerConstants;
+import com.salesmanager.shop.store.model.filter.QueryFilter;
+import com.salesmanager.shop.store.model.filter.QueryFilterType;
+import com.salesmanager.shop.utils.BreadcrumbsUtils;
+import com.salesmanager.shop.utils.ImageFilePath;
+import com.salesmanager.shop.utils.LabelUtils;
+import com.salesmanager.shop.utils.PageBuilderUtils;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.util.*;
+
+
+
+/**
+ * Renders a given category page based on friendly url
+ * Can also filter by facets such as manufacturer
+ * @author Carl Samson
+ *
+ */
+@Controller
+public class ShoppingCategoryController {
+
+
+
+ @Inject
+ private CategoryService categoryService;
+
+ @Inject
+ private LanguageService languageService;
+
+ @Inject
+ private MerchantStoreService merchantStoreService;
+
+ @Inject
+ private ProductService productService;
+
+ @Inject
+ private ManufacturerService manufacturerService;
+
+ @Inject
+ private LabelUtils messages;
+
+ @Inject
+ private BreadcrumbsUtils breadcrumbsUtils;
+
+ @Inject
+ private CacheUtils cache;
+
+ @Inject
+ private PricingService pricingService;
+
+ @Inject
+ @Qualifier("img")
+ private ImageFilePath imageUtils;
+
+
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ShoppingCategoryController.class);
+
+
+ /**
+ *
+ * @param friendlyUrl
+ * @param ref
+ * @param model
+ * @param request
+ * @param response
+ * @param locale
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping("/shop/category/{friendlyUrl}.html/ref={ref}")
+ public String displayCategoryWithReference(@PathVariable final String friendlyUrl, @PathVariable final String ref, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+
+
+ return this.displayCategory(friendlyUrl,ref,model,request,response,locale);
+ }
+
+
+
+ /**
+ * Category page entry point
+ * @param friendlyUrl
+ * @param model
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping("/shop/category/{friendlyUrl}.html")
+ public String displayCategoryNoReference(@PathVariable final String friendlyUrl, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ return this.displayCategory(friendlyUrl,null,model,request,response,locale);
+ }
+
+ @SuppressWarnings("unchecked")
+ private String displayCategory(final String friendlyUrl, final String ref, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+
+
+
+
+ //get category
+ Category category = categoryService.getBySeUrl(store, friendlyUrl);
+
+ Language language = (Language)request.getAttribute("LANGUAGE");
+
+ if(category==null) {
+ LOGGER.error("No category found for friendlyUrl " + friendlyUrl);
+ //redirect on page not found
+ return PageBuilderUtils.build404(store);
+
+ }
+
+ if(!category.isVisible()) {
+ return PageBuilderUtils.buildHomePage(store);
+ }
+
+ ReadableCategoryPopulator populator = new ReadableCategoryPopulator();
+ ReadableCategory categoryProxy = populator.populate(category, new ReadableCategory(), store, language);
+
+ Breadcrumb breadCrumb = breadcrumbsUtils.buildCategoryBreadcrumb(categoryProxy, store, language, request.getContextPath());
+ request.getSession().setAttribute(Constants.BREADCRUMB, breadCrumb);
+ request.setAttribute(Constants.BREADCRUMB, breadCrumb);
+
+
+ //meta information
+ PageInformation pageInformation = new PageInformation();
+ pageInformation.setPageDescription(categoryProxy.getDescription().getMetaDescription());
+ pageInformation.setPageKeywords(categoryProxy.getDescription().getKeyWords());
+ pageInformation.setPageTitle(categoryProxy.getDescription().getTitle());
+ pageInformation.setPageUrl(categoryProxy.getDescription().getFriendlyUrl());
+
+ //** retrieves category id drill down**//
+ String lineage = new StringBuilder().append(category.getLineage()).append(category.getId()).append(Constants.CATEGORY_LINEAGE_DELIMITER).toString();
+
+
+
+ request.setAttribute(Constants.REQUEST_PAGE_INFORMATION, pageInformation);
+
+ //TODO add to caching
+ List<Category> subCategs = categoryService.listByLineage(store, lineage);
+ List<Long> subIds = new ArrayList<Long>();
+ if(subCategs!=null && subCategs.size()>0) {
+ for(Category c : subCategs) {
+ if(c.isVisible()) {
+ subIds.add(c.getId());
+ }
+ }
+ }
+ subIds.add(category.getId());
+
+
+ StringBuilder subCategoriesCacheKey = new StringBuilder();
+ subCategoriesCacheKey
+ .append(store.getId())
+ .append("_")
+ .append(category.getId())
+ .append("_")
+ .append(Constants.SUBCATEGORIES_CACHE_KEY)
+ .append("-")
+ .append(language.getCode());
+
+ StringBuilder subCategoriesMissed = new StringBuilder();
+ subCategoriesMissed
+ .append(subCategoriesCacheKey.toString())
+ .append(Constants.MISSED_CACHE_KEY);
+
+ List<BigDecimal> prices = new ArrayList<BigDecimal>();
+ List<ReadableCategory> subCategories = null;
+ Map<Long,Long> countProductsByCategories = null;
+
+ if(store.isUseCache()) {
+
+ //get from the cache
+ subCategories = (List<ReadableCategory>) cache.getFromCache(subCategoriesCacheKey.toString());
+ if(subCategories==null) {
+ //get from missed cache
+ //Boolean missedContent = (Boolean)cache.getFromCache(subCategoriesMissed.toString());
+
+ //if(missedContent==null) {
+ countProductsByCategories = getProductsByCategory(store, category, lineage, subIds);
+ subCategories = getSubCategories(store,category,countProductsByCategories,language,locale);
+
+ if(subCategories!=null) {
+ cache.putInCache(subCategories, subCategoriesCacheKey.toString());
+ } else {
+ //cache.putInCache(new Boolean(true), subCategoriesCacheKey.toString());
+ }
+ //}
+ }
+ } else {
+ countProductsByCategories = getProductsByCategory(store, category, lineage, subIds);
+ subCategories = getSubCategories(store,category,countProductsByCategories,language,locale);
+ }
+
+ //Parent category
+ ReadableCategory parentProxy = null;
+
+ if(category.getParent()!=null) {
+ Category parent = categoryService.getById(category.getParent().getId());
+ parentProxy = populator.populate(parent, new ReadableCategory(), store, language);
+ }
+
+
+ //** List of manufacturers **//
+ List<ReadableManufacturer> manufacturerList = getManufacturersByProductAndCategory(store,category,subIds,language);
+
+ model.addAttribute("manufacturers", manufacturerList);
+ model.addAttribute("parent", parentProxy);
+ model.addAttribute("category", categoryProxy);
+ model.addAttribute("subCategories", subCategories);
+
+ if(parentProxy!=null) {
+ request.setAttribute(Constants.LINK_CODE, parentProxy.getDescription().getFriendlyUrl());
+ }
+
+
+ /** template **/
+ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Category.category).append(".").append(store.getStoreTemplate());
+
+ return template.toString();
+ }
+
+ @SuppressWarnings("unchecked")
+ private List<ReadableManufacturer> getManufacturersByProductAndCategory(MerchantStore store, Category category, List<Long> subCategoryIds, Language language) throws Exception {
+
+ List<ReadableManufacturer> manufacturerList = null;
+ /** List of manufacturers **/
+ if(subCategoryIds!=null && subCategoryIds.size()>0) {
+
+ StringBuilder manufacturersKey = new StringBuilder();
+ manufacturersKey
+ .append(store.getId())
+ .append("_")
+ .append(Constants.MANUFACTURERS_BY_PRODUCTS_CACHE_KEY)
+ .append("-")
+ .append(language.getCode());
+
+ StringBuilder manufacturersKeyMissed = new StringBuilder();
+ manufacturersKeyMissed
+ .append(manufacturersKey.toString())
+ .append(Constants.MISSED_CACHE_KEY);
+
+ if(store.isUseCache()) {
+
+ //get from the cache
+
+ manufacturerList = (List<ReadableManufacturer>) cache.getFromCache(manufacturersKey.toString());
+
+
+ if(manufacturerList==null) {
+ //get from missed cache
+ //Boolean missedContent = (Boolean)cache.getFromCache(manufacturersKeyMissed.toString());
+ //if(missedContent==null) {
+ manufacturerList = this.getManufacturers(store, subCategoryIds, language);
+ if(manufacturerList.isEmpty()) {
+ cache.putInCache(new Boolean(true), manufacturersKeyMissed.toString());
+ } else {
+ //cache.putInCache(manufacturerList, manufacturersKey.toString());
+ }
+ //}
+ }
+ } else {
+ manufacturerList = this.getManufacturers(store, subCategoryIds, language);
+ }
+ }
+ return manufacturerList;
+ }
+
+ private List<ReadableManufacturer> getManufacturers(MerchantStore store, List<Long> ids, Language language) throws Exception {
+ List<ReadableManufacturer> manufacturerList = new ArrayList<ReadableManufacturer>();
+ List<com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer> manufacturers = manufacturerService.listByProductsByCategoriesId(store, ids, language);
+ if(!manufacturers.isEmpty()) {
+
+ for(com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer manufacturer : manufacturers) {
+ ReadableManufacturer manuf = new ReadableManufacturerPopulator().populate(manufacturer, new ReadableManufacturer(), store, language);
+ manufacturerList.add(manuf);
+
+ }
+ }
+ return manufacturerList;
+ }
+
+ private Map<Long,Long> getProductsByCategory(MerchantStore store, Category category, String lineage, List<Long> subIds) throws Exception {
+
+ if(subIds.isEmpty()) {
+ return null;
+ }
+
+ List<Object[]> countProductsByCategories = categoryService.countProductsByCategories(store, subIds);
+ Map<Long, Long> countByCategories = new HashMap<Long,Long>();
+
+ for(Object[] counts : countProductsByCategories) {
+ Category c = (Category)counts[0];
+ if(c.getParent()!=null) {
+ if(c.getParent().getId()==category.getId()) {
+ countByCategories.put(c.getId(), (Long)counts[1]);
+ } else {
+ //get lineage
+ String lin = c.getLineage();
+ String[] categoryPath = lin.split(Constants.CATEGORY_LINEAGE_DELIMITER);
+ for(int i=0 ; i<categoryPath.length; i++) {
+ String sId = categoryPath[i];
+ if(!StringUtils.isBlank(sId)) {
+ Long count = countByCategories.get(Long.parseLong(sId));
+ if(count!=null) {
+ count = count + (Long)counts[1];
+ countByCategories.put(Long.parseLong(sId), count);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return countByCategories;
+
+ }
+
+ private List<ReadableCategory> getSubCategories(MerchantStore store, Category category, Map<Long,Long> productCount, Language language, Locale locale) throws Exception {
+
+
+ //sub categories
+ List<Category> subCategories = categoryService.listByParent(category, language);
+ ReadableCategoryPopulator populator = new ReadableCategoryPopulator();
+ List<ReadableCategory> subCategoryProxies = new ArrayList<ReadableCategory>();
+
+
+
+ for(Category sub : subCategories) {
+ ReadableCategory cProxy = populator.populate(sub, new ReadableCategory(), store, language);
+ //com.salesmanager.web.entity.catalog.Category cProxy = catalogUtils.buildProxyCategory(sub, store, locale);
+ if(productCount!=null) {
+ Long total = productCount.get(cProxy.getId());
+ if(total!=null) {
+ cProxy.setProductCount(total.intValue());
+ }
+ }
+ subCategoryProxies.add(cProxy);
+ }
+
+ return subCategoryProxies;
+
+ }
+
+
+
+ /**
+ * Returns all categories for a given MerchantStore
+ */
+ @RequestMapping("/services/public/category/{store}/{language}")
+ @ResponseBody
+ public List<ReadableCategory> getCategories(@PathVariable final String language, @PathVariable final String store, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ Map<String,Language> langs = languageService.getLanguagesMap();
+ Language l = langs.get(language);
+ if(l==null) {
+ l = languageService.getByCode(Constants.DEFAULT_LANGUAGE);
+ }
+
+ MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+
+ if(merchantStore!=null) {
+ if(!merchantStore.getCode().equals(store)) {
+ merchantStore = null; //reset for the current request
+ }
+ }
+
+ if(merchantStore== null) {
+ merchantStore = merchantStoreService.getByCode(store);
+ }
+
+ if(merchantStore==null) {
+ LOGGER.error("Merchant store is null for code " + store);
+ response.sendError(503, "Merchant store is null for code " + store);//TODO localized message
+ return null;
+ }
+
+ List<Category> categories = categoryService.listByStore(merchantStore, l);
+
+ ReadableCategoryPopulator populator = new ReadableCategoryPopulator();
+
+ List<ReadableCategory> returnCategories = new ArrayList<ReadableCategory>();
+ for(Category category : categories) {
+ ReadableCategory categoryProxy = populator.populate(category, new ReadableCategory(), merchantStore, l);
+ returnCategories.add(categoryProxy);
+ }
+
+ return returnCategories;
+ }
+
+ /**
+ * Returns an array of products belonging to a given category
+ * in a given language for a given store
+ * url example : http://<host>/sm-shop/shop/services/public/products/DEFAULT/BOOKS
+ * @param store
+ * @param language
+ * @param category
+ * @param model
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ **/
+ ////TODO : services/public/DEFAULT/products/category/MYCATEGORY?lang=fr
+ @RequestMapping("/services/public/products/{store}/{language}/{category}")
+ @ResponseBody
+ public ProductList getProducts(@PathVariable final String store, @PathVariable final String language, @PathVariable final String category, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ //http://localhost:8080/sm-shop/services/public/products/DEFAULT/en/book
+
+ try {
+
+
+ /**
+ * How to Spring MVC Rest web service - ajax / jquery
+ * http://codetutr.com/2013/04/09/spring-mvc-easy-rest-based-json-services-with-responsebody/
+ */
+
+ MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+ Map<String,Language> langs = languageService.getLanguagesMap();
+
+ if(merchantStore!=null) {
+ if(!merchantStore.getCode().equals(store)) {
+ merchantStore = null; //reset for the current request
+ }
+ }
+
+ if(merchantStore== null) {
+ merchantStore = merchantStoreService.getByCode(store);
+ }
+
+ if(merchantStore==null) {
+ LOGGER.error("Merchant store is null for code " + store);
+ response.sendError(503, "Merchant store is null for code " + store);//TODO localized message
+ return null;
+ }
+
+ //get the category by code
+ Category cat = categoryService.getBySeUrl(merchantStore, category);
+
+ if(cat==null) {
+ LOGGER.error("Category with friendly url " + category + " is null");
+ response.sendError(503, "Category is null");//TODO localized message
+ }
+
+ String lineage = new StringBuilder().append(cat.getLineage()).append(cat.getId()).append("/").toString();
+
+ List<Category> categories = categoryService.listByLineage(store, lineage);
+
+ List<Long> ids = new ArrayList<Long>();
+ if(categories!=null && categories.size()>0) {
+ for(Category c : categories) {
+ ids.add(c.getId());
+ }
+ }
+ ids.add(cat.getId());
+
+ Language lang = langs.get(language);
+ if(lang==null) {
+ lang = langs.get(Constants.DEFAULT_LANGUAGE);
+ }
+
+ List<com.salesmanager.core.model.catalog.product.Product> products = productService.getProducts(ids, lang);
+
+ ProductList productList = new ProductList();
+
+ ReadableProductPopulator populator = new ReadableProductPopulator();
+ populator.setPricingService(pricingService);
+ populator.setimageUtils(imageUtils);
+
+ for(Product product : products) {
+ //create new proxy product
+ ReadableProduct p = populator.populate(product, new ReadableProduct(), merchantStore, lang);
+ productList.getProducts().add(p);
+
+ }
+
+ productList.setProductCount(productList.getProducts().size());
+ return productList;
+
+
+ } catch (Exception e) {
+ LOGGER.error("Error while getting category",e);
+ response.sendError(503, "Error while getting category");
+ }
+
+ return null;
+ }
+
+
+ /**
+ * Will page products of a given category
+ * @param store
+ * @param language
+ * @param category
+ * @param model
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping("/services/public/products/page/{start}/{max}/{store}/{language}/{category}")
+ @ResponseBody
+ public ProductList getProducts(@PathVariable int start, @PathVariable int max, @PathVariable String store, @PathVariable final String language, @PathVariable final String category, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ return this.getProducts(start, max, store, language, category, null, model, request, response);
+ }
+
+
+ /**
+ * An entry point for filtering by another entity such as Manufacturer
+ * filter=BRAND&filter-value=123
+ * @param start
+ * @param max
+ * @param store
+ * @param language
+ * @param category
+ * @param filterType
+ * @param filterValue
+ * @param model
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping("/services/public/products/page/{start}/{max}/{store}/{language}/{category}/filter={filterType}/filter-value={filterValue}")
+ @ResponseBody
+ public ProductList getProductsFilteredByType(@PathVariable int start, @PathVariable int max, @PathVariable String store, @PathVariable final String language, @PathVariable final String category, @PathVariable final String filterType, @PathVariable final String filterValue, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ List<QueryFilter> queryFilters = null;
+ try {
+ if(filterType.equals(QueryFilterType.BRAND.name())) {//the only one implemented so far
+ QueryFilter filter = new QueryFilter();
+ filter.setFilterType(QueryFilterType.BRAND);
+ filter.setFilterId(Long.parseLong(filterValue));
+ if(queryFilters==null) {
+ queryFilters = new ArrayList<QueryFilter>();
+ }
+ queryFilters.add(filter);
+ }
+ } catch(Exception e) {
+ LOGGER.error("Invalid filter or filter-value " + filterType + " - " + filterValue,e);
+ }
+
+ return this.getProducts(start, max, store, language, category, queryFilters, model, request, response);
+ }
+
+
+ private ProductList getProducts(final int start, final int max, final String store, final String language, final String category, final List<QueryFilter> filters, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ try {
+
+
+ MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+ List<BigDecimal> prices = new ArrayList<BigDecimal>();
+
+ Map<String,Language> langs = languageService.getLanguagesMap();
+
+ if(merchantStore!=null) {
+ if(!merchantStore.getCode().equals(store)) {
+ merchantStore = null; //reset for the current request
+ }
+ }
+
+ if(merchantStore== null) {
+ merchantStore = merchantStoreService.getByCode(store);
+ }
+
+ if(merchantStore==null) {
+ LOGGER.error("Merchant store is null for code " + store);
+ response.sendError(503, "Merchant store is null for code " + store);//TODO localized message
+ return null;
+ }
+
+ //get the category by code
+ Category cat = categoryService.getBySeUrl(merchantStore, category);
+
+ if(cat==null) {
+ LOGGER.error("Category " + category + " is null");
+ response.sendError(503, "Category is null");//TODO localized message
+ return null;
+ }
+
+ String lineage = new StringBuilder().append(cat.getLineage()).append(cat.getId()).append("/").toString();
+
+ List<Category> categories = categoryService.listByLineage(store, lineage);
+
+ List<Long> ids = new ArrayList<Long>();
+ if(categories!=null && categories.size()>0) {
+ for(Category c : categories) {
+ if(c.isVisible()) {
+ ids.add(c.getId());
+ }
+ }
+ }
+ ids.add(cat.getId());
+
+
+ Language lang = langs.get(language);
+ if(lang==null) {
+ lang = langs.get(Constants.DEFAULT_LANGUAGE);
+ }
+
+ ProductCriteria productCriteria = new ProductCriteria();
+ productCriteria.setMaxCount(max);
+ productCriteria.setStartIndex(start);
+ productCriteria.setCategoryIds(ids);
+ productCriteria.setAvailable(true);
+
+ if(filters!=null) {
+ for(QueryFilter filter : filters) {
+ if(filter.getFilterType().name().equals(QueryFilterType.BRAND.name())) {//the only filter implemented
+ productCriteria.setManufacturerId(filter.getFilterId());
+ }
+ }
+ }
+
+ com.salesmanager.core.model.catalog.product.ProductList products = productService.listByStore(merchantStore, lang, productCriteria);
+
+ ReadableProductPopulator populator = new ReadableProductPopulator();
+ populator.setPricingService(pricingService);
+ populator.setimageUtils(imageUtils);
+
+ ProductList productList = new ProductList();
+ for(Product product : products.getProducts()) {
+
+ //create new proxy product
+ ReadableProduct p = populator.populate(product, new ReadableProduct(), merchantStore, lang);
+ productList.getProducts().add(p);
+ prices.add(p.getPrice());
+
+ }
+
+
+ /** order products based on the specified order **/
+ Collections.sort(productList.getProducts(), new Comparator<ReadableProduct>() {
+
+ @Override
+ public int compare(ReadableProduct o1, ReadableProduct o2) {
+ int order1 = o1.getSortOrder();
+ int order2 = o2.getSortOrder();
+ return order1 - order2;
+ }
+ });
+
+
+ productList.setProductCount(products.getTotalCount());
+
+ if(CollectionUtils.isNotEmpty(prices)) {
+ BigDecimal minPrice = (BigDecimal)Collections.min(prices);
+ BigDecimal maxPrice = (BigDecimal)Collections.max(prices);
+
+ if(minPrice !=null && maxPrice !=null) {
+ productList.setMinPrice(minPrice);
+ productList.setMaxPrice(maxPrice);
+ }
+ }
+
+
+
+ return productList;
+
+
+ } catch (Exception e) {
+ LOGGER.error("Error while getting products",e);
+ response.sendError(503, "An error occured while retrieving products " + e.getMessage());
+ }
+
+ return null;
+
+ }
+
+
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/content/ShopContentController.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/content/ShopContentController.java
index 626bb1d..03fd369 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/content/ShopContentController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/content/ShopContentController.java
@@ -1,78 +1,78 @@
-package com.salesmanager.shop.store.controller.content;
-
-import com.salesmanager.core.business.services.content.ContentService;
-import com.salesmanager.core.model.content.Content;
-import com.salesmanager.core.model.content.ContentDescription;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.model.shop.PageInformation;
-import com.salesmanager.shop.store.controller.ControllerConstants;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.Locale;
-
-@Controller
-public class ShopContentController {
-
-
- @Inject
- private ContentService contentService;
-
-
- @RequestMapping("/shop/pages/{friendlyUrl}.html")
- public String displayContent(@PathVariable final String friendlyUrl, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
-
- ContentDescription contentDescription = contentService.getBySeUrl(store, friendlyUrl);
-
- Content content = null;
-
- if(contentDescription!=null) {
-
- content = contentDescription.getContent();
-
- if(!content.isVisible()) {
- return "redirect:/shop";
- }
-
- //meta information
- PageInformation pageInformation = new PageInformation();
- pageInformation.setPageDescription(contentDescription.getMetatagDescription());
- pageInformation.setPageKeywords(contentDescription.getMetatagKeywords());
- pageInformation.setPageTitle(contentDescription.getTitle());
- pageInformation.setPageUrl(contentDescription.getName());
-
- request.setAttribute(Constants.REQUEST_PAGE_INFORMATION, pageInformation);
-
-
-
-
- }
-
- //TODO breadcrumbs
- request.setAttribute(Constants.LINK_CODE, contentDescription.getSeUrl());
- model.addAttribute("content",contentDescription);
-
- if(!StringUtils.isBlank(content.getProductGroup())) {
- model.addAttribute("productGroup",content.getProductGroup());
- }
-
- /** template **/
- StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Content.content).append(".").append(store.getStoreTemplate());
-
- return template.toString();
-
-
- }
-
+package com.salesmanager.shop.store.controller.content;
+
+import com.salesmanager.core.business.services.content.ContentService;
+import com.salesmanager.core.model.content.Content;
+import com.salesmanager.core.model.content.ContentDescription;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.model.shop.PageInformation;
+import com.salesmanager.shop.store.controller.ControllerConstants;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Locale;
+
+@Controller
+public class ShopContentController {
+
+
+ @Inject
+ private ContentService contentService;
+
+
+ @RequestMapping("/shop/pages/{friendlyUrl}.html")
+ public String displayContent(@PathVariable final String friendlyUrl, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+
+ ContentDescription contentDescription = contentService.getBySeUrl(store, friendlyUrl);
+
+ Content content = null;
+
+ if(contentDescription!=null) {
+
+ content = contentDescription.getContent();
+
+ if(!content.isVisible()) {
+ return "redirect:/shop";
+ }
+
+ //meta information
+ PageInformation pageInformation = new PageInformation();
+ pageInformation.setPageDescription(contentDescription.getMetatagDescription());
+ pageInformation.setPageKeywords(contentDescription.getMetatagKeywords());
+ pageInformation.setPageTitle(contentDescription.getTitle());
+ pageInformation.setPageUrl(contentDescription.getName());
+
+ request.setAttribute(Constants.REQUEST_PAGE_INFORMATION, pageInformation);
+
+
+
+
+ }
+
+ //TODO breadcrumbs
+ request.setAttribute(Constants.LINK_CODE, contentDescription.getSeUrl());
+ model.addAttribute("content",contentDescription);
+
+ if(!StringUtils.isBlank(content.getProductGroup())) {
+ model.addAttribute("productGroup",content.getProductGroup());
+ }
+
+ /** template **/
+ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Content.content).append(".").append(store.getStoreTemplate());
+
+ return template.toString();
+
+
+ }
+
}
\ No newline at end of file
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/ControllerConstants.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/ControllerConstants.java
index 8524520..8201c12 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/ControllerConstants.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/ControllerConstants.java
@@ -1,89 +1,89 @@
-/**
- *
- */
-package com.salesmanager.shop.store.controller;
-
-/**
- * Interface contain constant for Controller.These constant will be used throughout
- * sm-shop to providing constant values to various Controllers being used in the
- * application.
- * @author Umesh A
- *
- */
-public interface ControllerConstants
-{
-
- final static String REDIRECT="redirect:";
-
- interface Tiles{
- interface ShoppingCart{
- final static String shoppingCart="maincart";
- }
-
- interface Category{
- final static String category="category";
- }
-
- interface Product{
- final static String product="product";
- }
-
- interface Items{
- final static String items_manufacturer="items.manufacturer";
- }
-
- interface Customer{
- final static String customer="customer";
- final static String customerLogon="customerLogon";
- final static String review="review";
- final static String register="register";
- final static String changePassword="customerPassword";
- final static String customerOrders="customerOrders";
- final static String customerOrder="customerOrder";
- final static String Billing="customerAddress";
- final static String EditAddress="editCustomerAddress";
- }
-
- interface Content{
- final static String content="content";
- final static String contactus="contactus";
- }
-
- interface Pages{
- final static String notFound="404";
- final static String timeout="timeout";
- }
-
- interface Merchant{
- final static String contactUs="contactus";
- }
-
- interface Checkout{
- final static String checkout="checkout";
- final static String confirmation="confirmation";
- }
-
- interface Search{
- final static String search="search";
- }
-
- interface Error {
- final static String accessDenied = "accessDenied";
- final static String error = "error";
- }
-
-
-
- }
-
- interface Views
- {
- interface Controllers
- {
- interface Registration
- {
- String RegistrationPage = "shop/customer/registration.html";
- }
- }
- }
-}
+/**
+ *
+ */
+package com.salesmanager.shop.store.controller;
+
+/**
+ * Interface contain constant for Controller.These constant will be used throughout
+ * sm-shop to providing constant values to various Controllers being used in the
+ * application.
+ * @author Umesh A
+ *
+ */
+public interface ControllerConstants
+{
+
+ final static String REDIRECT="redirect:";
+
+ interface Tiles{
+ interface ShoppingCart{
+ final static String shoppingCart="maincart";
+ }
+
+ interface Category{
+ final static String category="category";
+ }
+
+ interface Product{
+ final static String product="product";
+ }
+
+ interface Items{
+ final static String items_manufacturer="items.manufacturer";
+ }
+
+ interface Customer{
+ final static String customer="customer";
+ final static String customerLogon="customerLogon";
+ final static String review="review";
+ final static String register="register";
+ final static String changePassword="customerPassword";
+ final static String customerOrders="customerOrders";
+ final static String customerOrder="customerOrder";
+ final static String Billing="customerAddress";
+ final static String EditAddress="editCustomerAddress";
+ }
+
+ interface Content{
+ final static String content="content";
+ final static String contactus="contactus";
+ }
+
+ interface Pages{
+ final static String notFound="404";
+ final static String timeout="timeout";
+ }
+
+ interface Merchant{
+ final static String contactUs="contactus";
+ }
+
+ interface Checkout{
+ final static String checkout="checkout";
+ final static String confirmation="confirmation";
+ }
+
+ interface Search{
+ final static String search="search";
+ }
+
+ interface Error {
+ final static String accessDenied = "accessDenied";
+ final static String error = "error";
+ }
+
+
+
+ }
+
+ interface Views
+ {
+ interface Controllers
+ {
+ interface Registration
+ {
+ String RegistrationPage = "shop/customer/registration.html";
+ }
+ }
+ }
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerAccountController.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerAccountController.java
index 5f33b9a..a9886ce 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerAccountController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerAccountController.java
@@ -1,572 +1,572 @@
-package com.salesmanager.shop.store.controller.customer;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.customer.CustomerService;
-import com.salesmanager.core.business.services.customer.attribute.CustomerAttributeService;
-import com.salesmanager.core.business.services.customer.attribute.CustomerOptionService;
-import com.salesmanager.core.business.services.customer.attribute.CustomerOptionSetService;
-import com.salesmanager.core.business.services.customer.attribute.CustomerOptionValueService;
-import com.salesmanager.core.business.services.order.OrderService;
-import com.salesmanager.core.business.services.reference.country.CountryService;
-import com.salesmanager.core.business.services.reference.language.LanguageService;
-import com.salesmanager.core.business.services.reference.zone.ZoneService;
-import com.salesmanager.core.business.utils.ajax.AjaxResponse;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.customer.attribute.CustomerAttribute;
-import com.salesmanager.core.model.customer.attribute.CustomerOptionType;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.model.customer.Address;
-import com.salesmanager.shop.model.customer.CustomerEntity;
-import com.salesmanager.shop.model.customer.CustomerPassword;
-import com.salesmanager.shop.model.customer.ReadableCustomer;
-import com.salesmanager.shop.populator.customer.ReadableCustomerPopulator;
-import com.salesmanager.shop.store.controller.AbstractController;
-import com.salesmanager.shop.store.controller.ControllerConstants;
-import com.salesmanager.shop.store.controller.customer.facade.CustomerFacade;
-import com.salesmanager.shop.store.controller.order.facade.OrderFacade;
-import com.salesmanager.shop.utils.EmailTemplatesUtils;
-import com.salesmanager.shop.utils.LabelUtils;
-import com.salesmanager.shop.utils.LanguageUtils;
-import com.salesmanager.shop.utils.LocaleUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.BindingResult;
-import org.springframework.validation.FieldError;
-import org.springframework.web.bind.annotation.*;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
-import java.util.*;
-
-/**
- * Entry point for logged in customers
- * @author Carl Samson
- *
- */
-@Controller
-@RequestMapping("/shop/customer")
-public class CustomerAccountController extends AbstractController {
-
- private static final String CUSTOMER_ID_PARAMETER = "customer";
- private static final String BILLING_SECTION="/shop/customer/billing.html";
-
- private static final Logger LOGGER = LoggerFactory.getLogger(CustomerAccountController.class);
-
- @Inject
- private CustomerService customerService;
-
- @Inject
- private CustomerOptionService customerOptionService;
-
- @Inject
- private CustomerOptionValueService customerOptionValueService;
-
- @Inject
- private CustomerOptionSetService customerOptionSetService;
-
- @Inject
- private CustomerAttributeService customerAttributeService;
-
- @Inject
- private LanguageService languageService;
-
- @Inject
- private LanguageUtils languageUtils;
-
- @Inject
- private PasswordEncoder passwordEncoder;
-
-
- @Inject
- private CountryService countryService;
-
- @Inject
- private EmailTemplatesUtils emailTemplatesUtils;
-
-
- @Inject
- private ZoneService zoneService;
-
- @Inject
- private CustomerFacade customerFacade;
-
- @Inject
- private OrderService orderService;
-
- @Inject
- private OrderFacade orderFacade;
-
- @Inject
- private LabelUtils messages;
-
-
-
- /**
- * Dedicated customer logon page
- * @param model
- * @param request
- * @param response
- * @return
- * @throws Exception
- */
- @RequestMapping(value="/customLogon.html", method=RequestMethod.GET)
- public String displayLogon(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
- MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
-
-
- //dispatch to dedicated customer logon
-
- /** template **/
- StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Customer.customerLogon).append(".").append(store.getStoreTemplate());
-
- return template.toString();
-
- }
-
-
- @RequestMapping(value="/accountSummary.json", method=RequestMethod.GET)
- public @ResponseBody ReadableCustomer customerInformation(@RequestParam String userName, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
- MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
-
- Authentication auth = SecurityContextHolder.getContext().getAuthentication();
- Customer customer = null;
- if(auth != null &&
- request.isUserInRole("AUTH_CUSTOMER")) {
- customer = customerFacade.getCustomerByUserName(auth.getName(), store);
-
- } else {
- response.sendError(401, "Customer not authenticated");
- return null;
- }
-
- if(StringUtils.isBlank(userName)) {
- response.sendError(403, "Customer name required");
- return null;
- }
-
- if(customer==null) {
- response.sendError(401, "Customer not authenticated");
- return null;
- }
-
- if(!customer.getNick().equals(userName)) {
- response.sendError(401, "Customer not authenticated");
- return null;
- }
-
-
- ReadableCustomer readableCustomer = new ReadableCustomer();
-
-
- Language lang = languageUtils.getRequestLanguage(request, response);
-
- ReadableCustomerPopulator readableCustomerPopulator = new ReadableCustomerPopulator();
- readableCustomerPopulator.populate(customer, readableCustomer, store, lang);
-
- return readableCustomer;
-
- }
-
- @PreAuthorize("hasRole('AUTH_CUSTOMER')")
- @RequestMapping(value="/account.html", method=RequestMethod.GET)
- public String displayCustomerAccount(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
- MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
-
-
-
- /** template **/
- StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Customer.customer).append(".").append(store.getStoreTemplate());
-
- return template.toString();
-
- }
-
- @PreAuthorize("hasRole('AUTH_CUSTOMER')")
- @RequestMapping(value="/password.html", method=RequestMethod.GET)
- public String displayCustomerChangePassword(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
- MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
-
- CustomerPassword customerPassword = new CustomerPassword();
- model.addAttribute("password", customerPassword);
-
- /** template **/
- StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Customer.changePassword).append(".").append(store.getStoreTemplate());
-
- return template.toString();
-
- }
-
- @PreAuthorize("hasRole('AUTH_CUSTOMER')")
- @RequestMapping(value="/changePassword.html", method=RequestMethod.POST)
- public String changePassword(@Valid @ModelAttribute(value="password") CustomerPassword password, BindingResult bindingResult, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
-
- MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
-
- /** template **/
- StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Customer.changePassword).append(".").append(store.getStoreTemplate());
-
- Authentication auth = SecurityContextHolder.getContext().getAuthentication();
- Customer customer = null;
- if(auth != null &&
- request.isUserInRole("AUTH_CUSTOMER")) {
- customer = customerFacade.getCustomerByUserName(auth.getName(), store);
-
- }
-
- if(customer==null) {
- return "redirect:/"+Constants.SHOP_URI;
- }
-
- String currentPassword = password.getCurrentPassword();
- String encodedCurrentPassword = passwordEncoder.encode(currentPassword);
-
- if(!StringUtils.equals(encodedCurrentPassword, customer.getPassword())) {
- FieldError error = new FieldError("password","password",messages.getMessage("message.invalidpassword", locale));
- bindingResult.addError(error);
- }
-
-
- if ( bindingResult.hasErrors() )
- {
- LOGGER.info( "found {} validation error while validating customer password",
- bindingResult.getErrorCount() );
- return template.toString();
-
- }
-
- CustomerPassword customerPassword = new CustomerPassword();
- model.addAttribute("password", customerPassword);
-
- String newPassword = password.getPassword();
- String encodedPassword = passwordEncoder.encode(newPassword);
-
- customer.setPassword(encodedPassword);
-
- customerService.saveOrUpdate(customer);
-
- emailTemplatesUtils.changePasswordNotificationEmail(customer, store, LocaleUtils.getLocale(customer.getDefaultLanguage()), request.getContextPath());
-
- model.addAttribute("success", "success");
-
- return template.toString();
-
- }
-
-
-
- /**
- * Manage the edition of customer attributes
- * @param request
- * @param locale
- * @return
- * @throws Exception
- */
- @PreAuthorize("hasRole('AUTH_CUSTOMER')")
- @RequestMapping(value={"/attributes/save.html"}, method=RequestMethod.POST)
- public @ResponseBody ResponseEntity<String> saveCustomerAttributes(HttpServletRequest request, Locale locale) throws Exception {
-
-
- AjaxResponse resp = new AjaxResponse();
- final HttpHeaders httpHeaders= new HttpHeaders();
- httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
-
- //1=1&2=on&3=eeee&4=on&customer=1
-
- @SuppressWarnings("rawtypes")
- Enumeration parameterNames = request.getParameterNames();
-
-
- Authentication auth = SecurityContextHolder.getContext().getAuthentication();
- Customer customer = null;
- if(auth != null &&
- request.isUserInRole("AUTH_CUSTOMER")) {
- customer = customerFacade.getCustomerByUserName(auth.getName(), store);
-
- }
-
- if(customer==null) {
- LOGGER.error("Customer id [customer] is not defined in the parameters");
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
-
-
-
- if(customer.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- LOGGER.error("Customer id does not belong to current store");
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
- }
-
- List<CustomerAttribute> customerAttributes = customerAttributeService.getByCustomer(store, customer);
- Map<Long,CustomerAttribute> customerAttributesMap = new HashMap<Long,CustomerAttribute>();
-
- for(CustomerAttribute attr : customerAttributes) {
- customerAttributesMap.put(attr.getCustomerOption().getId(), attr);
- }
-
- parameterNames = request.getParameterNames();
-
- while(parameterNames.hasMoreElements()) {
-
- String parameterName = (String)parameterNames.nextElement();
- String parameterValue = request.getParameter(parameterName);
- try {
-
- String[] parameterKey = parameterName.split("-");
- com.salesmanager.core.model.customer.attribute.CustomerOption customerOption = null;
- com.salesmanager.core.model.customer.attribute.CustomerOptionValue customerOptionValue = null;
-
-
- if(CUSTOMER_ID_PARAMETER.equals(parameterName)) {
- continue;
- }
-
- if(parameterKey.length>1) {
- //parse key - value
- String key = parameterKey[0];
- String value = parameterKey[1];
- //should be on
- customerOption = customerOptionService.getById(new Long(key));
- customerOptionValue = customerOptionValueService.getById(new Long(value));
-
-
-
- } else {
- customerOption = customerOptionService.getById(new Long(parameterName));
- customerOptionValue = customerOptionValueService.getById(new Long(parameterValue));
-
- }
-
- //get the attribute
- //CustomerAttribute attribute = customerAttributeService.getByCustomerOptionId(store, customer.getId(), customerOption.getId());
- CustomerAttribute attribute = customerAttributesMap.get(customerOption.getId());
- if(attribute==null) {
- attribute = new CustomerAttribute();
- attribute.setCustomer(customer);
- attribute.setCustomerOption(customerOption);
- } else {
- customerAttributes.remove(attribute);
- }
-
- if(customerOption.getCustomerOptionType().equals(CustomerOptionType.Text.name())) {
- if(!StringUtils.isBlank(parameterValue)) {
- attribute.setCustomerOptionValue(customerOptionValue);
- attribute.setTextValue(parameterValue);
- } else {
- attribute.setTextValue(null);
- }
- } else {
- attribute.setCustomerOptionValue(customerOptionValue);
- }
-
-
- if(attribute.getId()!=null && attribute.getId().longValue()>0) {
- if(attribute.getCustomerOptionValue()==null){
- customerAttributeService.delete(attribute);
- } else {
- customerAttributeService.update(attribute);
- }
- } else {
- customerAttributeService.save(attribute);
- }
-
-
-
- } catch (Exception e) {
- LOGGER.error("Cannot get parameter information " + parameterName,e);
- }
-
- }
-
- //and now the remaining to be removed
- for(CustomerAttribute attr : customerAttributes) {
- customerAttributeService.delete(attr);
- }
-
- //refresh customer
- Customer c = customerService.getById(customer.getId());
- super.setSessionAttribute(Constants.CUSTOMER, c, request);
-
- resp.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
- String returnString = resp.toJSONString();
- return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
-
-
- }
-
- @PreAuthorize("hasRole('AUTH_CUSTOMER')")
- @RequestMapping(value="/billing.html", method=RequestMethod.GET)
- public String displayCustomerBillingAddress(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
- MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
- Language language = getSessionAttribute(Constants.LANGUAGE, request);
-
- Authentication auth = SecurityContextHolder.getContext().getAuthentication();
- Customer customer = null;
- if(auth != null &&
- request.isUserInRole("AUTH_CUSTOMER")) {
- customer = customerFacade.getCustomerByUserName(auth.getName(), store);
-
- }
-
- if(customer==null) {
- return "redirect:/"+Constants.SHOP_URI;
- }
-
-
- CustomerEntity customerEntity = customerFacade.getCustomerDataByUserName( customer.getNick(), store, language );
- if(customer !=null){
- model.addAttribute( "customer", customerEntity);
- }
-
-
- /** template **/
- StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Customer.Billing).append(".").append(store.getStoreTemplate());
-
- return template.toString();
-
- }
-
- @PreAuthorize("hasRole('AUTH_CUSTOMER')")
- @RequestMapping(value="/editAddress.html", method={RequestMethod.GET,RequestMethod.POST})
- public String editAddress(final Model model, final HttpServletRequest request,
- @RequestParam(value = "billingAddress", required = false) Boolean billingAddress) throws Exception {
- MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
-
- Authentication auth = SecurityContextHolder.getContext().getAuthentication();
- Customer customer = null;
- if(auth != null &&
- request.isUserInRole("AUTH_CUSTOMER")) {
- customer = customerFacade.getCustomerByUserName(auth.getName(), store);
-
- }
-
- if(customer==null) {
- return "redirect:/"+Constants.SHOP_URI;
- }
-
-
-
- Address address=customerFacade.getAddress( customer.getId(), store, billingAddress );
- model.addAttribute( "address", address);
- model.addAttribute( "customerId", customer.getId() );
- StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Customer.EditAddress).append(".").append(store.getStoreTemplate());
- return template.toString();
- }
-
-
- @PreAuthorize("hasRole('AUTH_CUSTOMER')")
- @RequestMapping(value="/updateAddress.html", method={RequestMethod.GET,RequestMethod.POST})
- public String updateCustomerAddress(@Valid
- @ModelAttribute("address") Address address,BindingResult bindingResult,final Model model, final HttpServletRequest request,
- @RequestParam(value = "billingAddress", required = false) Boolean billingAddress) throws Exception {
-
- MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
-
- Authentication auth = SecurityContextHolder.getContext().getAuthentication();
- Customer customer = null;
- if(auth != null &&
- request.isUserInRole("AUTH_CUSTOMER")) {
- customer = customerFacade.getCustomerByUserName(auth.getName(), store);
-
- }
-
- StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Customer.EditAddress).append(".").append(store.getStoreTemplate());
-
- if(customer==null) {
- return "redirect:/"+Constants.SHOP_URI;
- }
-
- model.addAttribute( "address", address);
- model.addAttribute( "customerId", customer.getId() );
-
-
- if(bindingResult.hasErrors()){
- LOGGER.info( "found {} error(s) while validating customer address ",
- bindingResult.getErrorCount() );
- return template.toString();
- }
-
-
- Language language = getSessionAttribute(Constants.LANGUAGE, request);
- customerFacade.updateAddress( customer.getId(), store, address, language);
-
- Customer c = customerService.getById(customer.getId());
- super.setSessionAttribute(Constants.CUSTOMER, c, request);
-
- model.addAttribute("success", "success");
-
- return template.toString();
-
- }
-
-
- @ModelAttribute("countries")
- protected List<Country> getCountries(final HttpServletRequest request){
-
- Language language = (Language) request.getAttribute( "LANGUAGE" );
- try
- {
- if ( language == null )
- {
- language = (Language) request.getAttribute( "LANGUAGE" );
- }
-
- if ( language == null )
- {
- language = languageService.getByCode( Constants.DEFAULT_LANGUAGE );
- }
-
- List<Country> countryList=countryService.getCountries( language );
- return countryList;
- }
- catch ( ServiceException e )
- {
- LOGGER.error( "Error while fetching country list ", e );
-
- }
- return Collections.emptyList();
- }
-
- //@ModelAttribute("zones")
- //public List<Zone> getZones(final HttpServletRequest request){
- // return zoneService.list();
- //}
-
-
-
-
-
-}
+package com.salesmanager.shop.store.controller.customer;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.business.services.customer.attribute.CustomerAttributeService;
+import com.salesmanager.core.business.services.customer.attribute.CustomerOptionService;
+import com.salesmanager.core.business.services.customer.attribute.CustomerOptionSetService;
+import com.salesmanager.core.business.services.customer.attribute.CustomerOptionValueService;
+import com.salesmanager.core.business.services.order.OrderService;
+import com.salesmanager.core.business.services.reference.country.CountryService;
+import com.salesmanager.core.business.services.reference.language.LanguageService;
+import com.salesmanager.core.business.services.reference.zone.ZoneService;
+import com.salesmanager.core.business.utils.ajax.AjaxResponse;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.customer.attribute.CustomerAttribute;
+import com.salesmanager.core.model.customer.attribute.CustomerOptionType;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.model.customer.Address;
+import com.salesmanager.shop.model.customer.CustomerEntity;
+import com.salesmanager.shop.model.customer.CustomerPassword;
+import com.salesmanager.shop.model.customer.ReadableCustomer;
+import com.salesmanager.shop.populator.customer.ReadableCustomerPopulator;
+import com.salesmanager.shop.store.controller.AbstractController;
+import com.salesmanager.shop.store.controller.ControllerConstants;
+import com.salesmanager.shop.store.controller.customer.facade.CustomerFacade;
+import com.salesmanager.shop.store.controller.order.facade.OrderFacade;
+import com.salesmanager.shop.utils.EmailTemplatesUtils;
+import com.salesmanager.shop.utils.LabelUtils;
+import com.salesmanager.shop.utils.LanguageUtils;
+import com.salesmanager.shop.utils.LocaleUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.annotation.*;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.util.*;
+
+/**
+ * Entry point for logged in customers
+ * @author Carl Samson
+ *
+ */
+@Controller
+@RequestMapping("/shop/customer")
+public class CustomerAccountController extends AbstractController {
+
+ private static final String CUSTOMER_ID_PARAMETER = "customer";
+ private static final String BILLING_SECTION="/shop/customer/billing.html";
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(CustomerAccountController.class);
+
+ @Inject
+ private CustomerService customerService;
+
+ @Inject
+ private CustomerOptionService customerOptionService;
+
+ @Inject
+ private CustomerOptionValueService customerOptionValueService;
+
+ @Inject
+ private CustomerOptionSetService customerOptionSetService;
+
+ @Inject
+ private CustomerAttributeService customerAttributeService;
+
+ @Inject
+ private LanguageService languageService;
+
+ @Inject
+ private LanguageUtils languageUtils;
+
+ @Inject
+ private PasswordEncoder passwordEncoder;
+
+
+ @Inject
+ private CountryService countryService;
+
+ @Inject
+ private EmailTemplatesUtils emailTemplatesUtils;
+
+
+ @Inject
+ private ZoneService zoneService;
+
+ @Inject
+ private CustomerFacade customerFacade;
+
+ @Inject
+ private OrderService orderService;
+
+ @Inject
+ private OrderFacade orderFacade;
+
+ @Inject
+ private LabelUtils messages;
+
+
+
+ /**
+ * Dedicated customer logon page
+ * @param model
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping(value="/customLogon.html", method=RequestMethod.GET)
+ public String displayLogon(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
+
+
+ //dispatch to dedicated customer logon
+
+ /** template **/
+ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Customer.customerLogon).append(".").append(store.getStoreTemplate());
+
+ return template.toString();
+
+ }
+
+
+ @RequestMapping(value="/accountSummary.json", method=RequestMethod.GET)
+ public @ResponseBody ReadableCustomer customerInformation(@RequestParam String userName, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
+
+ Authentication auth = SecurityContextHolder.getContext().getAuthentication();
+ Customer customer = null;
+ if(auth != null &&
+ request.isUserInRole("AUTH_CUSTOMER")) {
+ customer = customerFacade.getCustomerByUserName(auth.getName(), store);
+
+ } else {
+ response.sendError(401, "Customer not authenticated");
+ return null;
+ }
+
+ if(StringUtils.isBlank(userName)) {
+ response.sendError(403, "Customer name required");
+ return null;
+ }
+
+ if(customer==null) {
+ response.sendError(401, "Customer not authenticated");
+ return null;
+ }
+
+ if(!customer.getNick().equals(userName)) {
+ response.sendError(401, "Customer not authenticated");
+ return null;
+ }
+
+
+ ReadableCustomer readableCustomer = new ReadableCustomer();
+
+
+ Language lang = languageUtils.getRequestLanguage(request, response);
+
+ ReadableCustomerPopulator readableCustomerPopulator = new ReadableCustomerPopulator();
+ readableCustomerPopulator.populate(customer, readableCustomer, store, lang);
+
+ return readableCustomer;
+
+ }
+
+ @PreAuthorize("hasRole('AUTH_CUSTOMER')")
+ @RequestMapping(value="/account.html", method=RequestMethod.GET)
+ public String displayCustomerAccount(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
+
+
+
+ /** template **/
+ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Customer.customer).append(".").append(store.getStoreTemplate());
+
+ return template.toString();
+
+ }
+
+ @PreAuthorize("hasRole('AUTH_CUSTOMER')")
+ @RequestMapping(value="/password.html", method=RequestMethod.GET)
+ public String displayCustomerChangePassword(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
+
+ CustomerPassword customerPassword = new CustomerPassword();
+ model.addAttribute("password", customerPassword);
+
+ /** template **/
+ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Customer.changePassword).append(".").append(store.getStoreTemplate());
+
+ return template.toString();
+
+ }
+
+ @PreAuthorize("hasRole('AUTH_CUSTOMER')")
+ @RequestMapping(value="/changePassword.html", method=RequestMethod.POST)
+ public String changePassword(@Valid @ModelAttribute(value="password") CustomerPassword password, BindingResult bindingResult, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+
+ MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
+
+ /** template **/
+ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Customer.changePassword).append(".").append(store.getStoreTemplate());
+
+ Authentication auth = SecurityContextHolder.getContext().getAuthentication();
+ Customer customer = null;
+ if(auth != null &&
+ request.isUserInRole("AUTH_CUSTOMER")) {
+ customer = customerFacade.getCustomerByUserName(auth.getName(), store);
+
+ }
+
+ if(customer==null) {
+ return "redirect:/"+Constants.SHOP_URI;
+ }
+
+ String currentPassword = password.getCurrentPassword();
+ String encodedCurrentPassword = passwordEncoder.encode(currentPassword);
+
+ if(!StringUtils.equals(encodedCurrentPassword, customer.getPassword())) {
+ FieldError error = new FieldError("password","password",messages.getMessage("message.invalidpassword", locale));
+ bindingResult.addError(error);
+ }
+
+
+ if ( bindingResult.hasErrors() )
+ {
+ LOGGER.info( "found {} validation error while validating customer password",
+ bindingResult.getErrorCount() );
+ return template.toString();
+
+ }
+
+ CustomerPassword customerPassword = new CustomerPassword();
+ model.addAttribute("password", customerPassword);
+
+ String newPassword = password.getPassword();
+ String encodedPassword = passwordEncoder.encode(newPassword);
+
+ customer.setPassword(encodedPassword);
+
+ customerService.saveOrUpdate(customer);
+
+ emailTemplatesUtils.changePasswordNotificationEmail(customer, store, LocaleUtils.getLocale(customer.getDefaultLanguage()), request.getContextPath());
+
+ model.addAttribute("success", "success");
+
+ return template.toString();
+
+ }
+
+
+
+ /**
+ * Manage the edition of customer attributes
+ * @param request
+ * @param locale
+ * @return
+ * @throws Exception
+ */
+ @PreAuthorize("hasRole('AUTH_CUSTOMER')")
+ @RequestMapping(value={"/attributes/save.html"}, method=RequestMethod.POST)
+ public @ResponseBody ResponseEntity<String> saveCustomerAttributes(HttpServletRequest request, Locale locale) throws Exception {
+
+
+ AjaxResponse resp = new AjaxResponse();
+ final HttpHeaders httpHeaders= new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+
+ //1=1&2=on&3=eeee&4=on&customer=1
+
+ @SuppressWarnings("rawtypes")
+ Enumeration parameterNames = request.getParameterNames();
+
+
+ Authentication auth = SecurityContextHolder.getContext().getAuthentication();
+ Customer customer = null;
+ if(auth != null &&
+ request.isUserInRole("AUTH_CUSTOMER")) {
+ customer = customerFacade.getCustomerByUserName(auth.getName(), store);
+
+ }
+
+ if(customer==null) {
+ LOGGER.error("Customer id [customer] is not defined in the parameters");
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+
+
+
+ if(customer.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ LOGGER.error("Customer id does not belong to current store");
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+ }
+
+ List<CustomerAttribute> customerAttributes = customerAttributeService.getByCustomer(store, customer);
+ Map<Long,CustomerAttribute> customerAttributesMap = new HashMap<Long,CustomerAttribute>();
+
+ for(CustomerAttribute attr : customerAttributes) {
+ customerAttributesMap.put(attr.getCustomerOption().getId(), attr);
+ }
+
+ parameterNames = request.getParameterNames();
+
+ while(parameterNames.hasMoreElements()) {
+
+ String parameterName = (String)parameterNames.nextElement();
+ String parameterValue = request.getParameter(parameterName);
+ try {
+
+ String[] parameterKey = parameterName.split("-");
+ com.salesmanager.core.model.customer.attribute.CustomerOption customerOption = null;
+ com.salesmanager.core.model.customer.attribute.CustomerOptionValue customerOptionValue = null;
+
+
+ if(CUSTOMER_ID_PARAMETER.equals(parameterName)) {
+ continue;
+ }
+
+ if(parameterKey.length>1) {
+ //parse key - value
+ String key = parameterKey[0];
+ String value = parameterKey[1];
+ //should be on
+ customerOption = customerOptionService.getById(new Long(key));
+ customerOptionValue = customerOptionValueService.getById(new Long(value));
+
+
+
+ } else {
+ customerOption = customerOptionService.getById(new Long(parameterName));
+ customerOptionValue = customerOptionValueService.getById(new Long(parameterValue));
+
+ }
+
+ //get the attribute
+ //CustomerAttribute attribute = customerAttributeService.getByCustomerOptionId(store, customer.getId(), customerOption.getId());
+ CustomerAttribute attribute = customerAttributesMap.get(customerOption.getId());
+ if(attribute==null) {
+ attribute = new CustomerAttribute();
+ attribute.setCustomer(customer);
+ attribute.setCustomerOption(customerOption);
+ } else {
+ customerAttributes.remove(attribute);
+ }
+
+ if(customerOption.getCustomerOptionType().equals(CustomerOptionType.Text.name())) {
+ if(!StringUtils.isBlank(parameterValue)) {
+ attribute.setCustomerOptionValue(customerOptionValue);
+ attribute.setTextValue(parameterValue);
+ } else {
+ attribute.setTextValue(null);
+ }
+ } else {
+ attribute.setCustomerOptionValue(customerOptionValue);
+ }
+
+
+ if(attribute.getId()!=null && attribute.getId().longValue()>0) {
+ if(attribute.getCustomerOptionValue()==null){
+ customerAttributeService.delete(attribute);
+ } else {
+ customerAttributeService.update(attribute);
+ }
+ } else {
+ customerAttributeService.save(attribute);
+ }
+
+
+
+ } catch (Exception e) {
+ LOGGER.error("Cannot get parameter information " + parameterName,e);
+ }
+
+ }
+
+ //and now the remaining to be removed
+ for(CustomerAttribute attr : customerAttributes) {
+ customerAttributeService.delete(attr);
+ }
+
+ //refresh customer
+ Customer c = customerService.getById(customer.getId());
+ super.setSessionAttribute(Constants.CUSTOMER, c, request);
+
+ resp.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
+ String returnString = resp.toJSONString();
+ return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
+
+
+ }
+
+ @PreAuthorize("hasRole('AUTH_CUSTOMER')")
+ @RequestMapping(value="/billing.html", method=RequestMethod.GET)
+ public String displayCustomerBillingAddress(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
+ Language language = getSessionAttribute(Constants.LANGUAGE, request);
+
+ Authentication auth = SecurityContextHolder.getContext().getAuthentication();
+ Customer customer = null;
+ if(auth != null &&
+ request.isUserInRole("AUTH_CUSTOMER")) {
+ customer = customerFacade.getCustomerByUserName(auth.getName(), store);
+
+ }
+
+ if(customer==null) {
+ return "redirect:/"+Constants.SHOP_URI;
+ }
+
+
+ CustomerEntity customerEntity = customerFacade.getCustomerDataByUserName( customer.getNick(), store, language );
+ if(customer !=null){
+ model.addAttribute( "customer", customerEntity);
+ }
+
+
+ /** template **/
+ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Customer.Billing).append(".").append(store.getStoreTemplate());
+
+ return template.toString();
+
+ }
+
+ @PreAuthorize("hasRole('AUTH_CUSTOMER')")
+ @RequestMapping(value="/editAddress.html", method={RequestMethod.GET,RequestMethod.POST})
+ public String editAddress(final Model model, final HttpServletRequest request,
+ @RequestParam(value = "billingAddress", required = false) Boolean billingAddress) throws Exception {
+ MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
+
+ Authentication auth = SecurityContextHolder.getContext().getAuthentication();
+ Customer customer = null;
+ if(auth != null &&
+ request.isUserInRole("AUTH_CUSTOMER")) {
+ customer = customerFacade.getCustomerByUserName(auth.getName(), store);
+
+ }
+
+ if(customer==null) {
+ return "redirect:/"+Constants.SHOP_URI;
+ }
+
+
+
+ Address address=customerFacade.getAddress( customer.getId(), store, billingAddress );
+ model.addAttribute( "address", address);
+ model.addAttribute( "customerId", customer.getId() );
+ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Customer.EditAddress).append(".").append(store.getStoreTemplate());
+ return template.toString();
+ }
+
+
+ @PreAuthorize("hasRole('AUTH_CUSTOMER')")
+ @RequestMapping(value="/updateAddress.html", method={RequestMethod.GET,RequestMethod.POST})
+ public String updateCustomerAddress(@Valid
+ @ModelAttribute("address") Address address,BindingResult bindingResult,final Model model, final HttpServletRequest request,
+ @RequestParam(value = "billingAddress", required = false) Boolean billingAddress) throws Exception {
+
+ MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
+
+ Authentication auth = SecurityContextHolder.getContext().getAuthentication();
+ Customer customer = null;
+ if(auth != null &&
+ request.isUserInRole("AUTH_CUSTOMER")) {
+ customer = customerFacade.getCustomerByUserName(auth.getName(), store);
+
+ }
+
+ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Customer.EditAddress).append(".").append(store.getStoreTemplate());
+
+ if(customer==null) {
+ return "redirect:/"+Constants.SHOP_URI;
+ }
+
+ model.addAttribute( "address", address);
+ model.addAttribute( "customerId", customer.getId() );
+
+
+ if(bindingResult.hasErrors()){
+ LOGGER.info( "found {} error(s) while validating customer address ",
+ bindingResult.getErrorCount() );
+ return template.toString();
+ }
+
+
+ Language language = getSessionAttribute(Constants.LANGUAGE, request);
+ customerFacade.updateAddress( customer.getId(), store, address, language);
+
+ Customer c = customerService.getById(customer.getId());
+ super.setSessionAttribute(Constants.CUSTOMER, c, request);
+
+ model.addAttribute("success", "success");
+
+ return template.toString();
+
+ }
+
+
+ @ModelAttribute("countries")
+ protected List<Country> getCountries(final HttpServletRequest request){
+
+ Language language = (Language) request.getAttribute( "LANGUAGE" );
+ try
+ {
+ if ( language == null )
+ {
+ language = (Language) request.getAttribute( "LANGUAGE" );
+ }
+
+ if ( language == null )
+ {
+ language = languageService.getByCode( Constants.DEFAULT_LANGUAGE );
+ }
+
+ List<Country> countryList=countryService.getCountries( language );
+ return countryList;
+ }
+ catch ( ServiceException e )
+ {
+ LOGGER.error( "Error while fetching country list ", e );
+
+ }
+ return Collections.emptyList();
+ }
+
+ //@ModelAttribute("zones")
+ //public List<Zone> getZones(final HttpServletRequest request){
+ // return zoneService.list();
+ //}
+
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerDashboardController.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerDashboardController.java
index 8e678e0..0919326 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerDashboardController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerDashboardController.java
@@ -1,133 +1,133 @@
-package com.salesmanager.shop.store.controller.customer;
-
-import com.salesmanager.core.business.services.customer.attribute.CustomerOptionSetService;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.customer.attribute.CustomerAttribute;
-import com.salesmanager.core.model.customer.attribute.CustomerOptionSet;
-import com.salesmanager.core.model.customer.attribute.CustomerOptionType;
-import com.salesmanager.core.model.customer.attribute.CustomerOptionValueDescription;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.admin.model.customer.attribute.CustomerOption;
-import com.salesmanager.shop.admin.model.customer.attribute.CustomerOptionValue;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.populator.customer.ReadableCustomerOptionPopulator;
-import com.salesmanager.shop.store.controller.AbstractController;
-import com.salesmanager.shop.store.controller.ControllerConstants;
-import org.apache.commons.collections4.CollectionUtils;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Entry point for logged in customers
- * @author Carl Samson
- *
- */
-@Controller
-@RequestMapping("/shop/customer")
-public class CustomerDashboardController extends AbstractController {
-
- @Inject
- private AuthenticationManager customerAuthenticationManager;
-
- @Inject
- private CustomerOptionSetService customerOptionSetService;
-
-
- @PreAuthorize("hasRole('AUTH_CUSTOMER')")
- @RequestMapping(value="/dashboard.html", method=RequestMethod.GET)
- public String displayCustomerDashboard(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
- MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
- Language language = (Language)request.getAttribute(Constants.LANGUAGE);
-
- Customer customer = (Customer)request.getAttribute(Constants.CUSTOMER);
- getCustomerOptions(model, customer, store, language);
-
-
- model.addAttribute("section","dashboard");
-
-
- /** template **/
- StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Customer.customer).append(".").append(store.getStoreTemplate());
-
- return template.toString();
-
- }
-
-
- private void getCustomerOptions(Model model, Customer customer, MerchantStore store, Language language) throws Exception {
-
- Map<Long,CustomerOption> options = new HashMap<Long,CustomerOption>();
- //get options
- List<CustomerOptionSet> optionSet = customerOptionSetService.listByStore(store, language);
- if(!CollectionUtils.isEmpty(optionSet)) {
-
-
- ReadableCustomerOptionPopulator optionPopulator = new ReadableCustomerOptionPopulator();
-
- Set<CustomerAttribute> customerAttributes = customer.getAttributes();
-
- for(CustomerOptionSet optSet : optionSet) {
-
- com.salesmanager.core.model.customer.attribute.CustomerOption custOption = optSet.getCustomerOption();
- if(!custOption.isActive() || !custOption.isPublicOption()) {
- continue;
- }
- CustomerOption customerOption = options.get(custOption.getId());
-
- optionPopulator.setOptionSet(optSet);
-
-
-
- if(customerOption==null) {
- customerOption = new CustomerOption();
- customerOption.setId(custOption.getId());
- customerOption.setType(custOption.getCustomerOptionType());
- customerOption.setName(custOption.getDescriptionsSettoList().get(0).getName());
-
- }
-
- optionPopulator.populate(custOption, customerOption, store, language);
- options.put(customerOption.getId(), customerOption);
-
- if(!CollectionUtils.isEmpty(customerAttributes)) {
- for(CustomerAttribute customerAttribute : customerAttributes) {
- if(customerAttribute.getCustomerOption().getId().longValue()==customerOption.getId()){
- CustomerOptionValue selectedValue = new CustomerOptionValue();
- com.salesmanager.core.model.customer.attribute.CustomerOptionValue attributeValue = customerAttribute.getCustomerOptionValue();
- selectedValue.setId(attributeValue.getId());
- CustomerOptionValueDescription optValue = attributeValue.getDescriptionsSettoList().get(0);
- selectedValue.setName(optValue.getName());
- customerOption.setDefaultValue(selectedValue);
- if(customerOption.getType().equalsIgnoreCase(CustomerOptionType.Text.name())) {
- selectedValue.setName(customerAttribute.getTextValue());
- }
- }
- }
- }
- }
- }
-
-
- model.addAttribute("options", options.values());
-
-
- }
-
-
-
-}
+package com.salesmanager.shop.store.controller.customer;
+
+import com.salesmanager.core.business.services.customer.attribute.CustomerOptionSetService;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.customer.attribute.CustomerAttribute;
+import com.salesmanager.core.model.customer.attribute.CustomerOptionSet;
+import com.salesmanager.core.model.customer.attribute.CustomerOptionType;
+import com.salesmanager.core.model.customer.attribute.CustomerOptionValueDescription;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.admin.model.customer.attribute.CustomerOption;
+import com.salesmanager.shop.admin.model.customer.attribute.CustomerOptionValue;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.populator.customer.ReadableCustomerOptionPopulator;
+import com.salesmanager.shop.store.controller.AbstractController;
+import com.salesmanager.shop.store.controller.ControllerConstants;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Entry point for logged in customers
+ * @author Carl Samson
+ *
+ */
+@Controller
+@RequestMapping("/shop/customer")
+public class CustomerDashboardController extends AbstractController {
+
+ @Inject
+ private AuthenticationManager customerAuthenticationManager;
+
+ @Inject
+ private CustomerOptionSetService customerOptionSetService;
+
+
+ @PreAuthorize("hasRole('AUTH_CUSTOMER')")
+ @RequestMapping(value="/dashboard.html", method=RequestMethod.GET)
+ public String displayCustomerDashboard(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
+ Language language = (Language)request.getAttribute(Constants.LANGUAGE);
+
+ Customer customer = (Customer)request.getAttribute(Constants.CUSTOMER);
+ getCustomerOptions(model, customer, store, language);
+
+
+ model.addAttribute("section","dashboard");
+
+
+ /** template **/
+ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Customer.customer).append(".").append(store.getStoreTemplate());
+
+ return template.toString();
+
+ }
+
+
+ private void getCustomerOptions(Model model, Customer customer, MerchantStore store, Language language) throws Exception {
+
+ Map<Long,CustomerOption> options = new HashMap<Long,CustomerOption>();
+ //get options
+ List<CustomerOptionSet> optionSet = customerOptionSetService.listByStore(store, language);
+ if(!CollectionUtils.isEmpty(optionSet)) {
+
+
+ ReadableCustomerOptionPopulator optionPopulator = new ReadableCustomerOptionPopulator();
+
+ Set<CustomerAttribute> customerAttributes = customer.getAttributes();
+
+ for(CustomerOptionSet optSet : optionSet) {
+
+ com.salesmanager.core.model.customer.attribute.CustomerOption custOption = optSet.getCustomerOption();
+ if(!custOption.isActive() || !custOption.isPublicOption()) {
+ continue;
+ }
+ CustomerOption customerOption = options.get(custOption.getId());
+
+ optionPopulator.setOptionSet(optSet);
+
+
+
+ if(customerOption==null) {
+ customerOption = new CustomerOption();
+ customerOption.setId(custOption.getId());
+ customerOption.setType(custOption.getCustomerOptionType());
+ customerOption.setName(custOption.getDescriptionsSettoList().get(0).getName());
+
+ }
+
+ optionPopulator.populate(custOption, customerOption, store, language);
+ options.put(customerOption.getId(), customerOption);
+
+ if(!CollectionUtils.isEmpty(customerAttributes)) {
+ for(CustomerAttribute customerAttribute : customerAttributes) {
+ if(customerAttribute.getCustomerOption().getId().longValue()==customerOption.getId()){
+ CustomerOptionValue selectedValue = new CustomerOptionValue();
+ com.salesmanager.core.model.customer.attribute.CustomerOptionValue attributeValue = customerAttribute.getCustomerOptionValue();
+ selectedValue.setId(attributeValue.getId());
+ CustomerOptionValueDescription optValue = attributeValue.getDescriptionsSettoList().get(0);
+ selectedValue.setName(optValue.getName());
+ customerOption.setDefaultValue(selectedValue);
+ if(customerOption.getType().equalsIgnoreCase(CustomerOptionType.Text.name())) {
+ selectedValue.setName(customerAttribute.getTextValue());
+ }
+ }
+ }
+ }
+ }
+ }
+
+
+ model.addAttribute("options", options.values());
+
+
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerLoginController.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerLoginController.java
index e60b8e8..aecbcfb 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerLoginController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerLoginController.java
@@ -1,207 +1,211 @@
-package com.salesmanager.shop.store.controller.customer;
-
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.services.catalog.product.PricingService;
-import com.salesmanager.core.business.services.shoppingcart.ShoppingCartCalculationService;
-import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
-import com.salesmanager.core.business.utils.ajax.AjaxResponse;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.shoppingcart.ShoppingCart;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.model.customer.SecuredCustomer;
-import com.salesmanager.shop.model.shoppingcart.ShoppingCartData;
-import com.salesmanager.shop.populator.shoppingCart.ShoppingCartDataPopulator;
-import com.salesmanager.shop.store.controller.AbstractController;
-import com.salesmanager.shop.store.controller.customer.facade.CustomerFacade;
-import com.salesmanager.shop.utils.ImageFilePath;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.*;
-
-import javax.inject.Inject;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * Custom Spring Security authentication
- * @author Carl Samson
- *
- */
-@Controller
-@RequestMapping("/shop/customer")
-public class CustomerLoginController extends AbstractController {
-
- @Inject
- private AuthenticationManager customerAuthenticationManager;
-
-
- @Inject
- private CustomerFacade customerFacade;
-
- @Inject
- private ShoppingCartService shoppingCartService;
-
- @Inject
- private ShoppingCartCalculationService shoppingCartCalculationService;
-
- @Inject
- private PricingService pricingService;
-
-
- @Inject
- @Qualifier("img")
- private ImageFilePath imageUtils;
-
-
- private static final Logger LOG = LoggerFactory.getLogger(CustomerLoginController.class);
-
-
- private AjaxResponse logon(String userName, String password, String storeCode, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
- AjaxResponse jsonObject = new AjaxResponse();
-
-
- try {
-
- LOG.debug("Authenticating user " + userName);
-
- //user goes to shop filter first so store and language are set
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
- Language language = (Language)request.getAttribute("LANGUAGE");
-
- //check if username is from the appropriate store
- Customer customerModel = customerFacade.getCustomerByUserName(userName, store);
- if(customerModel==null) {
- jsonObject.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- return jsonObject;
- }
-
- if(!customerModel.getMerchantStore().getCode().equals(storeCode)) {
- jsonObject.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- return jsonObject;
- }
-
- customerFacade.authenticate(customerModel, userName, password);
- //set customer in the http session
- super.setSessionAttribute(Constants.CUSTOMER, customerModel, request);
- jsonObject.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
- jsonObject.addEntry(Constants.RESPONSE_KEY_USERNAME, customerModel.getNick());
-
-
-
-
- LOG.info( "Fetching and merging Shopping Cart data" );
- String sessionShoppingCartCode= (String)request.getSession().getAttribute( Constants.SHOPPING_CART );
- if(!StringUtils.isBlank(sessionShoppingCartCode)) {
- ShoppingCart shoppingCart = customerFacade.mergeCart( customerModel, sessionShoppingCartCode, store, language );
- ShoppingCartData shoppingCartData=this.populateShoppingCartData(shoppingCart, store, language);
- if(shoppingCartData !=null){
- jsonObject.addEntry(Constants.SHOPPING_CART, shoppingCartData.getCode());
- request.getSession().setAttribute(Constants.SHOPPING_CART, shoppingCartData.getCode());
-
- //set cart in the cookie
- Cookie c = new Cookie(Constants.COOKIE_NAME_CART, shoppingCartData.getCode());
- c.setMaxAge(60 * 24 * 3600);
- c.setPath(Constants.SLASH);
- response.addCookie(c);
-
- } else {
- //DELETE COOKIE
- Cookie c = new Cookie(Constants.COOKIE_NAME_CART, "");
- c.setMaxAge(0);
- c.setPath(Constants.SLASH);
- response.addCookie(c);
- }
-
-
-
- } else {
-
- ShoppingCart cartModel = shoppingCartService.getByCustomer(customerModel);
- if(cartModel!=null) {
- jsonObject.addEntry( Constants.SHOPPING_CART, cartModel.getShoppingCartCode());
- request.getSession().setAttribute(Constants.SHOPPING_CART, cartModel.getShoppingCartCode());
-
- Cookie c = new Cookie(Constants.COOKIE_NAME_CART, cartModel.getShoppingCartCode());
- c.setMaxAge(60 * 24 * 3600);
- c.setPath(Constants.SLASH);
- response.addCookie(c);
-
- }
-
-
- }
-
- StringBuilder cookieValue = new StringBuilder();
- cookieValue.append(store.getCode()).append("_").append(customerModel.getNick());
-
- //set username in the cookie
- Cookie c = new Cookie(Constants.COOKIE_NAME_USER, cookieValue.toString());
- c.setMaxAge(60 * 24 * 3600);
- c.setPath(Constants.SLASH);
- response.addCookie(c);
-
-
- } catch (AuthenticationException ex) {
- jsonObject.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- } catch(Exception e) {
- jsonObject.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- }
-
- return jsonObject;
-
-
- }
- //http://localhost:8080/sm-shop/shop/customer/authenticate.html?userName=shopizer&password=password&storeCode=DEFAULT
- @RequestMapping(value="/authenticate.html", method=RequestMethod.GET)
- public @ResponseBody String basicLogon(@RequestParam String userName, @RequestParam String password, @RequestParam String storeCode, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
- AjaxResponse jsonObject = this.logon(userName, password, storeCode, request, response);
- return jsonObject.toJSONString();
-
- }
-
- /**
- * Customer login entry point
- * @param securedCustomer
- * @param request
- * @param response
- * @return
- * @throws Exception
- */
- @RequestMapping(value="/logon.html", method=RequestMethod.POST)
- public @ResponseBody String jsonLogon(@ModelAttribute SecuredCustomer securedCustomer, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
- AjaxResponse jsonObject = this.logon(securedCustomer.getUserName(), securedCustomer.getPassword(), securedCustomer.getStoreCode(), request, response);
- return jsonObject.toJSONString();
-
-
- }
-
- private ShoppingCartData populateShoppingCartData(final ShoppingCart cartModel , final MerchantStore store, final Language language){
-
- ShoppingCartDataPopulator shoppingCartDataPopulator = new ShoppingCartDataPopulator();
- shoppingCartDataPopulator.setShoppingCartCalculationService( shoppingCartCalculationService );
- shoppingCartDataPopulator.setPricingService( pricingService );
-
- try
- {
- return shoppingCartDataPopulator.populate( cartModel , store, language);
- }
- catch ( ConversionException ce )
- {
- LOG.error( "Error in converting shopping cart to shopping cart data", ce );
-
- }
- return null;
- }
-
-}
+package com.salesmanager.shop.store.controller.customer;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.shoppingcart.ShoppingCartCalculationService;
+import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
+import com.salesmanager.core.business.utils.ajax.AjaxResponse;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.shoppingcart.ShoppingCart;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.model.customer.SecuredCustomer;
+import com.salesmanager.shop.model.shoppingcart.ShoppingCartData;
+import com.salesmanager.shop.populator.shoppingCart.ShoppingCartDataPopulator;
+import com.salesmanager.shop.store.controller.AbstractController;
+import com.salesmanager.shop.store.controller.customer.facade.CustomerFacade;
+import com.salesmanager.shop.utils.ImageFilePath;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import javax.inject.Inject;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * Custom Spring Security authentication
+ * @author Carl Samson
+ *
+ */
+@Controller
+@RequestMapping("/shop/customer")
+public class CustomerLoginController extends AbstractController {
+
+ @Inject
+ private AuthenticationManager customerAuthenticationManager;
+
+
+ @Inject
+ private CustomerFacade customerFacade;
+
+ @Inject
+ private ShoppingCartService shoppingCartService;
+
+ @Inject
+ private ShoppingCartCalculationService shoppingCartCalculationService;
+
+ @Inject
+ private PricingService pricingService;
+
+
+ @Inject
+ @Qualifier("img")
+ private ImageFilePath imageUtils;
+
+
+ private static final Logger LOG = LoggerFactory.getLogger(CustomerLoginController.class);
+
+
+ private AjaxResponse logon(String userName, String password, String storeCode, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ AjaxResponse jsonObject = new AjaxResponse();
+
+
+ try {
+
+ LOG.debug("Authenticating user " + userName);
+
+ //user goes to shop filter first so store and language are set
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+ Language language = (Language)request.getAttribute("LANGUAGE");
+
+ //check if username is from the appropriate store
+ Customer customerModel = customerFacade.getCustomerByUserName(userName, store);
+ if(customerModel==null) {
+ jsonObject.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ return jsonObject;
+ }
+
+ if(!customerModel.getMerchantStore().getCode().equals(storeCode)) {
+ jsonObject.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ return jsonObject;
+ }
+
+ customerFacade.authenticate(customerModel, userName, password);
+ //set customer in the http session
+ super.setSessionAttribute(Constants.CUSTOMER, customerModel, request);
+ jsonObject.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
+ jsonObject.addEntry(Constants.RESPONSE_KEY_USERNAME, customerModel.getNick());
+
+
+
+
+ LOG.info( "Fetching and merging Shopping Cart data" );
+ String sessionShoppingCartCode= (String)request.getSession().getAttribute( Constants.SHOPPING_CART );
+ if(!StringUtils.isBlank(sessionShoppingCartCode)) {
+ ShoppingCart shoppingCart = customerFacade.mergeCart( customerModel, sessionShoppingCartCode, store, language );
+ if(shoppingCart != null) {
+ ShoppingCartData shoppingCartData=this.populateShoppingCartData(shoppingCart, store, language);
+ if(shoppingCartData !=null){
+ jsonObject.addEntry(Constants.SHOPPING_CART, shoppingCartData.getCode());
+ request.getSession().setAttribute(Constants.SHOPPING_CART, shoppingCartData.getCode());
+
+ //set cart in the cookie
+ Cookie c = new Cookie(Constants.COOKIE_NAME_CART, shoppingCartData.getCode());
+ c.setMaxAge(60 * 24 * 3600);
+ c.setPath(Constants.SLASH);
+ response.addCookie(c);
+
+ } else {
+ //DELETE COOKIE
+ Cookie c = new Cookie(Constants.COOKIE_NAME_CART, "");
+ c.setMaxAge(0);
+ c.setPath(Constants.SLASH);
+ response.addCookie(c);
+ }
+ }
+
+
+
+ } else {
+
+ ShoppingCart cartModel = shoppingCartService.getByCustomer(customerModel);
+ if(cartModel!=null) {
+ jsonObject.addEntry( Constants.SHOPPING_CART, cartModel.getShoppingCartCode());
+ request.getSession().setAttribute(Constants.SHOPPING_CART, cartModel.getShoppingCartCode());
+
+ Cookie c = new Cookie(Constants.COOKIE_NAME_CART, cartModel.getShoppingCartCode());
+ c.setMaxAge(60 * 24 * 3600);
+ c.setPath(Constants.SLASH);
+ response.addCookie(c);
+
+ }
+
+
+ }
+
+ StringBuilder cookieValue = new StringBuilder();
+ cookieValue.append(store.getCode()).append("_").append(customerModel.getNick());
+
+ //set username in the cookie
+ Cookie c = new Cookie(Constants.COOKIE_NAME_USER, cookieValue.toString());
+ c.setMaxAge(60 * 24 * 3600);
+ c.setPath(Constants.SLASH);
+ response.addCookie(c);
+
+
+ } catch (AuthenticationException ex) {
+ jsonObject.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ } catch(Exception e) {
+ jsonObject.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ }
+
+ return jsonObject;
+
+
+ }
+ //http://localhost:8080/sm-shop/shop/customer/authenticate.html?userName=shopizer&password=password&storeCode=DEFAULT
+ @RequestMapping(value="/authenticate.html", method=RequestMethod.GET)
+ public @ResponseBody String basicLogon(@RequestParam String userName, @RequestParam String password, @RequestParam String storeCode, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ AjaxResponse jsonObject = this.logon(userName, password, storeCode, request, response);
+ return jsonObject.toJSONString();
+
+ }
+
+ /**
+ * Customer login entry point
+ * @param securedCustomer
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping(value="/logon.html", method=RequestMethod.POST)
+ public @ResponseBody String jsonLogon(@ModelAttribute SecuredCustomer securedCustomer, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+ AjaxResponse jsonObject = this.logon(securedCustomer.getUserName(), securedCustomer.getPassword(), securedCustomer.getStoreCode(), request, response);
+ return jsonObject.toJSONString();
+
+
+ }
+
+
+
+ private ShoppingCartData populateShoppingCartData(final ShoppingCart cartModel , final MerchantStore store, final Language language){
+
+ ShoppingCartDataPopulator shoppingCartDataPopulator = new ShoppingCartDataPopulator();
+ shoppingCartDataPopulator.setShoppingCartCalculationService( shoppingCartCalculationService );
+ shoppingCartDataPopulator.setPricingService( pricingService );
+
+ try
+ {
+ return shoppingCartDataPopulator.populate( cartModel , store, language);
+ }
+ catch ( ConversionException ce )
+ {
+ LOG.error( "Error in converting shopping cart to shopping cart data", ce );
+
+ }
+ return null;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerProductReviewController.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerProductReviewController.java
index 2b46b81..185f4ad 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerProductReviewController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerProductReviewController.java
@@ -1,232 +1,232 @@
-package com.salesmanager.shop.store.controller.customer;
-
-import com.salesmanager.core.business.services.catalog.product.PricingService;
-import com.salesmanager.core.business.services.catalog.product.ProductService;
-import com.salesmanager.core.business.services.catalog.product.review.ProductReviewService;
-import com.salesmanager.core.business.services.customer.CustomerService;
-import com.salesmanager.core.business.services.reference.language.LanguageService;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.review.ProductReview;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.model.catalog.product.PersistableProductReview;
-import com.salesmanager.shop.model.catalog.product.ReadableProduct;
-import com.salesmanager.shop.model.catalog.product.ReadableProductReview;
-import com.salesmanager.shop.populator.catalog.PersistableProductReviewPopulator;
-import com.salesmanager.shop.populator.catalog.ReadableProductPopulator;
-import com.salesmanager.shop.populator.catalog.ReadableProductReviewPopulator;
-import com.salesmanager.shop.store.controller.AbstractController;
-import com.salesmanager.shop.store.controller.ControllerConstants;
-import com.salesmanager.shop.store.controller.customer.facade.CustomerFacade;
-import com.salesmanager.shop.utils.DateUtil;
-import com.salesmanager.shop.utils.ImageFilePath;
-import com.salesmanager.shop.utils.LabelUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.BindingResult;
-import org.springframework.validation.FieldError;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.Date;
-import java.util.List;
-import java.util.Locale;
-
-/**
- * Entry point for logged in customers
- * @author Carl Samson
- *
- */
-@Controller
-@RequestMapping(Constants.SHOP_URI + "/customer")
-public class CustomerProductReviewController extends AbstractController {
-
- @Inject
- private ProductService productService;
-
- @Inject
- private LanguageService languageService;
-
- @Inject
- private PricingService pricingService;
-
- @Inject
- private ProductReviewService productReviewService;
-
- @Inject
- private CustomerService customerService;
-
- @Inject
- private CustomerFacade customerFacade;
-
- @Inject
- private LabelUtils messages;
-
- @Inject
- @Qualifier("img")
- private ImageFilePath imageUtils;
-
- @PreAuthorize("hasRole('AUTH_CUSTOMER')")
- @RequestMapping(value="/review.html", method=RequestMethod.GET)
- public String displayProductReview(@RequestParam Long productId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
- MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
- Language language = super.getLanguage(request);
-
-
-
- //get product
- Product product = productService.getById(productId);
- if(product==null) {
- return "redirect:" + Constants.SHOP_URI;
- }
-
- if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
- return "redirect:" + Constants.SHOP_URI;
- }
-
-
- //create readable product
- ReadableProduct readableProduct = new ReadableProduct();
- ReadableProductPopulator readableProductPopulator = new ReadableProductPopulator();
- readableProductPopulator.setPricingService(pricingService);
- readableProductPopulator.setimageUtils(imageUtils);
- readableProductPopulator.populate(product, readableProduct, store, language);
- model.addAttribute("product", readableProduct);
-
-
- Customer customer = customerFacade.getCustomerByUserName(request.getRemoteUser(), store);
-
- List<ProductReview> reviews = productReviewService.getByProduct(product, language);
- for(ProductReview r : reviews) {
- if(r.getCustomer().getId().longValue()==customer.getId().longValue()) {
-
- ReadableProductReviewPopulator reviewPopulator = new ReadableProductReviewPopulator();
- ReadableProductReview rev = new ReadableProductReview();
- reviewPopulator.populate(r, rev, store, language);
-
- model.addAttribute("customerReview", rev);
- break;
- }
- }
-
-
- ProductReview review = new ProductReview();
- review.setCustomer(customer);
- review.setProduct(product);
-
- ReadableProductReview productReview = new ReadableProductReview();
- ReadableProductReviewPopulator reviewPopulator = new ReadableProductReviewPopulator();
- reviewPopulator.populate(review, productReview, store, language);
-
- model.addAttribute("review", productReview);
- model.addAttribute("reviews", reviews);
-
-
- /** template **/
- StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Customer.review).append(".").append(store.getStoreTemplate());
-
- return template.toString();
-
- }
-
-
- @PreAuthorize("hasRole('AUTH_CUSTOMER')")
- @RequestMapping(value="/review/submit.html", method=RequestMethod.POST)
- public String submitProductReview(@ModelAttribute("review") PersistableProductReview review, BindingResult bindingResult, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
-
- MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
- Language language = getLanguage(request);
-
- Customer customer = customerFacade.getCustomerByUserName(request.getRemoteUser(), store);
-
- if(customer==null) {
- return "redirect:" + Constants.SHOP_URI;
- }
-
-
- Product product = productService.getById(review.getProductId());
- if(product==null) {
- return "redirect:" + Constants.SHOP_URI;
- }
-
- if(StringUtils.isBlank(review.getDescription())) {
- FieldError error = new FieldError("description","description",messages.getMessage("NotEmpty.review.description", locale));
- bindingResult.addError(error);
- }
-
-
-
- ReadableProduct readableProduct = new ReadableProduct();
- ReadableProductPopulator readableProductPopulator = new ReadableProductPopulator();
- readableProductPopulator.setPricingService(pricingService);
- readableProductPopulator.setimageUtils(imageUtils);
- readableProductPopulator.populate(product, readableProduct, store, language);
- model.addAttribute("product", readableProduct);
-
-
- /** template **/
- StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Customer.review).append(".").append(store.getStoreTemplate());
-
- if ( bindingResult.hasErrors() )
- {
-
- return template.toString();
-
- }
-
-
- //check if customer has already evaluated the product
- List<ProductReview> reviews = productReviewService.getByProduct(product);
-
- for(ProductReview r : reviews) {
- if(r.getCustomer().getId().longValue()==customer.getId().longValue()) {
- ReadableProductReviewPopulator reviewPopulator = new ReadableProductReviewPopulator();
- ReadableProductReview rev = new ReadableProductReview();
- reviewPopulator.populate(r, rev, store, language);
-
- model.addAttribute("customerReview", rev);
- return template.toString();
- }
- }
-
-
- PersistableProductReviewPopulator populator = new PersistableProductReviewPopulator();
- populator.setCustomerService(customerService);
- populator.setLanguageService(languageService);
- populator.setProductService(productService);
-
- review.setDate(DateUtil.formatDate(new Date()));
- review.setCustomerId(customer.getId());
-
- ProductReview productReview = populator.populate(review, store, language);
- productReviewService.create(productReview);
-
- model.addAttribute("review", review);
- model.addAttribute("success", "success");
-
- ReadableProductReviewPopulator reviewPopulator = new ReadableProductReviewPopulator();
- ReadableProductReview rev = new ReadableProductReview();
- reviewPopulator.populate(productReview, rev, store, language);
-
- model.addAttribute("customerReview", rev);
-
- return template.toString();
-
- }
-
-
-
-}
+package com.salesmanager.shop.store.controller.customer;
+
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.review.ProductReviewService;
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.business.services.reference.language.LanguageService;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.review.ProductReview;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.model.catalog.product.PersistableProductReview;
+import com.salesmanager.shop.model.catalog.product.ReadableProduct;
+import com.salesmanager.shop.model.catalog.product.ReadableProductReview;
+import com.salesmanager.shop.populator.catalog.PersistableProductReviewPopulator;
+import com.salesmanager.shop.populator.catalog.ReadableProductPopulator;
+import com.salesmanager.shop.populator.catalog.ReadableProductReviewPopulator;
+import com.salesmanager.shop.store.controller.AbstractController;
+import com.salesmanager.shop.store.controller.ControllerConstants;
+import com.salesmanager.shop.store.controller.customer.facade.CustomerFacade;
+import com.salesmanager.shop.utils.DateUtil;
+import com.salesmanager.shop.utils.ImageFilePath;
+import com.salesmanager.shop.utils.LabelUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * Entry point for logged in customers
+ * @author Carl Samson
+ *
+ */
+@Controller
+@RequestMapping(Constants.SHOP_URI + "/customer")
+public class CustomerProductReviewController extends AbstractController {
+
+ @Inject
+ private ProductService productService;
+
+ @Inject
+ private LanguageService languageService;
+
+ @Inject
+ private PricingService pricingService;
+
+ @Inject
+ private ProductReviewService productReviewService;
+
+ @Inject
+ private CustomerService customerService;
+
+ @Inject
+ private CustomerFacade customerFacade;
+
+ @Inject
+ private LabelUtils messages;
+
+ @Inject
+ @Qualifier("img")
+ private ImageFilePath imageUtils;
+
+ @PreAuthorize("hasRole('AUTH_CUSTOMER')")
+ @RequestMapping(value="/review.html", method=RequestMethod.GET)
+ public String displayProductReview(@RequestParam Long productId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
+ Language language = super.getLanguage(request);
+
+
+
+ //get product
+ Product product = productService.getById(productId);
+ if(product==null) {
+ return "redirect:" + Constants.SHOP_URI;
+ }
+
+ if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
+ return "redirect:" + Constants.SHOP_URI;
+ }
+
+
+ //create readable product
+ ReadableProduct readableProduct = new ReadableProduct();
+ ReadableProductPopulator readableProductPopulator = new ReadableProductPopulator();
+ readableProductPopulator.setPricingService(pricingService);
+ readableProductPopulator.setimageUtils(imageUtils);
+ readableProductPopulator.populate(product, readableProduct, store, language);
+ model.addAttribute("product", readableProduct);
+
+
+ Customer customer = customerFacade.getCustomerByUserName(request.getRemoteUser(), store);
+
+ List<ProductReview> reviews = productReviewService.getByProduct(product, language);
+ for(ProductReview r : reviews) {
+ if(r.getCustomer().getId().longValue()==customer.getId().longValue()) {
+
+ ReadableProductReviewPopulator reviewPopulator = new ReadableProductReviewPopulator();
+ ReadableProductReview rev = new ReadableProductReview();
+ reviewPopulator.populate(r, rev, store, language);
+
+ model.addAttribute("customerReview", rev);
+ break;
+ }
+ }
+
+
+ ProductReview review = new ProductReview();
+ review.setCustomer(customer);
+ review.setProduct(product);
+
+ ReadableProductReview productReview = new ReadableProductReview();
+ ReadableProductReviewPopulator reviewPopulator = new ReadableProductReviewPopulator();
+ reviewPopulator.populate(review, productReview, store, language);
+
+ model.addAttribute("review", productReview);
+ model.addAttribute("reviews", reviews);
+
+
+ /** template **/
+ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Customer.review).append(".").append(store.getStoreTemplate());
+
+ return template.toString();
+
+ }
+
+
+ @PreAuthorize("hasRole('AUTH_CUSTOMER')")
+ @RequestMapping(value="/review/submit.html", method=RequestMethod.POST)
+ public String submitProductReview(@ModelAttribute("review") PersistableProductReview review, BindingResult bindingResult, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+
+ MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
+ Language language = getLanguage(request);
+
+ Customer customer = customerFacade.getCustomerByUserName(request.getRemoteUser(), store);
+
+ if(customer==null) {
+ return "redirect:" + Constants.SHOP_URI;
+ }
+
+
+ Product product = productService.getById(review.getProductId());
+ if(product==null) {
+ return "redirect:" + Constants.SHOP_URI;
+ }
+
+ if(StringUtils.isBlank(review.getDescription())) {
+ FieldError error = new FieldError("description","description",messages.getMessage("NotEmpty.review.description", locale));
+ bindingResult.addError(error);
+ }
+
+
+
+ ReadableProduct readableProduct = new ReadableProduct();
+ ReadableProductPopulator readableProductPopulator = new ReadableProductPopulator();
+ readableProductPopulator.setPricingService(pricingService);
+ readableProductPopulator.setimageUtils(imageUtils);
+ readableProductPopulator.populate(product, readableProduct, store, language);
+ model.addAttribute("product", readableProduct);
+
+
+ /** template **/
+ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Customer.review).append(".").append(store.getStoreTemplate());
+
+ if ( bindingResult.hasErrors() )
+ {
+
+ return template.toString();
+
+ }
+
+
+ //check if customer has already evaluated the product
+ List<ProductReview> reviews = productReviewService.getByProduct(product);
+
+ for(ProductReview r : reviews) {
+ if(r.getCustomer().getId().longValue()==customer.getId().longValue()) {
+ ReadableProductReviewPopulator reviewPopulator = new ReadableProductReviewPopulator();
+ ReadableProductReview rev = new ReadableProductReview();
+ reviewPopulator.populate(r, rev, store, language);
+
+ model.addAttribute("customerReview", rev);
+ return template.toString();
+ }
+ }
+
+
+ PersistableProductReviewPopulator populator = new PersistableProductReviewPopulator();
+ populator.setCustomerService(customerService);
+ populator.setLanguageService(languageService);
+ populator.setProductService(productService);
+
+ review.setDate(DateUtil.formatDate(new Date()));
+ review.setCustomerId(customer.getId());
+
+ ProductReview productReview = populator.populate(review, store, language);
+ productReviewService.create(productReview);
+
+ model.addAttribute("review", review);
+ model.addAttribute("success", "success");
+
+ ReadableProductReviewPopulator reviewPopulator = new ReadableProductReviewPopulator();
+ ReadableProductReview rev = new ReadableProductReview();
+ reviewPopulator.populate(productReview, rev, store, language);
+
+ model.addAttribute("customerReview", rev);
+
+ return template.toString();
+
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerRegistrationController.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerRegistrationController.java
index d5127f0..94e238a 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerRegistrationController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/CustomerRegistrationController.java
@@ -1,347 +1,356 @@
-package com.salesmanager.shop.store.controller.customer;
-
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.catalog.product.PricingService;
-import com.salesmanager.core.business.services.reference.country.CountryService;
-import com.salesmanager.core.business.services.reference.language.LanguageService;
-import com.salesmanager.core.business.services.reference.zone.ZoneService;
-import com.salesmanager.core.business.services.shoppingcart.ShoppingCartCalculationService;
-import com.salesmanager.core.business.services.system.EmailService;
-import com.salesmanager.core.business.utils.CoreConfiguration;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.reference.zone.Zone;
-import com.salesmanager.core.model.shoppingcart.ShoppingCart;
-import com.salesmanager.shop.constants.ApplicationConstants;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.model.customer.AnonymousCustomer;
-import com.salesmanager.shop.model.customer.CustomerEntity;
-import com.salesmanager.shop.model.customer.SecuredShopPersistableCustomer;
-import com.salesmanager.shop.model.shoppingcart.ShoppingCartData;
-import com.salesmanager.shop.populator.shoppingCart.ShoppingCartDataPopulator;
-import com.salesmanager.shop.store.controller.AbstractController;
-import com.salesmanager.shop.store.controller.ControllerConstants;
-import com.salesmanager.shop.store.controller.customer.facade.CustomerFacade;
-import com.salesmanager.shop.utils.CaptchaRequestUtils;
-import com.salesmanager.shop.utils.EmailTemplatesUtils;
-import com.salesmanager.shop.utils.ImageFilePath;
-import com.salesmanager.shop.utils.LabelUtils;
-import org.apache.commons.lang.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.BindingResult;
-import org.springframework.validation.FieldError;
-import org.springframework.validation.ObjectError;
-import org.springframework.web.bind.annotation.ModelAttribute;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-
-import javax.inject.Inject;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
-import java.util.Collections;
-import java.util.List;
-import java.util.Locale;
-
-//import com.salesmanager.core.business.customer.CustomerRegistrationException;
-
-/**
- * Registration of a new customer
- * @author Carl Samson
- *
- */
-
-@SuppressWarnings( "deprecation" )
-// http://stackoverflow.com/questions/17444258/how-to-use-new-passwordencoder-from-spring-security
-@Controller
-@RequestMapping("/shop/customer")
-public class CustomerRegistrationController extends AbstractController {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(CustomerRegistrationController.class);
-
-
- @Inject
- private CoreConfiguration coreConfiguration;
-
- @Inject
- private LanguageService languageService;
-
-
- @Inject
- private CountryService countryService;
-
-
- @Inject
- private ZoneService zoneService;
-
- @Inject
- private PasswordEncoder passwordEncoder;
-
- @Inject
- EmailService emailService;
-
- @Inject
- private LabelUtils messages;
-
- @Inject
- private CustomerFacade customerFacade;
-
- @Inject
- private AuthenticationManager customerAuthenticationManager;
-
- @Inject
- private EmailTemplatesUtils emailTemplatesUtils;
-
- @Inject
- private CaptchaRequestUtils captchaRequestUtils;
-
- @Inject
- @Qualifier("img")
- private ImageFilePath imageUtils;
-
- @Inject
- private ShoppingCartCalculationService shoppingCartCalculationService;
-
- @Inject
- private PricingService pricingService;
-
-
-
-
- @RequestMapping(value="/registration.html", method=RequestMethod.GET)
- public String displayRegistration(final Model model, final HttpServletRequest request, final HttpServletResponse response) throws Exception {
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
-
- model.addAttribute( "recapatcha_public_key", coreConfiguration.getProperty( ApplicationConstants.RECAPTCHA_PUBLIC_KEY ) );
-
- SecuredShopPersistableCustomer customer = new SecuredShopPersistableCustomer();
- AnonymousCustomer anonymousCustomer = (AnonymousCustomer)request.getAttribute(Constants.ANONYMOUS_CUSTOMER);
- if(anonymousCustomer!=null) {
- customer.setBilling(anonymousCustomer.getBilling());
- }
-
- model.addAttribute("customer", customer);
-
- /** template **/
- StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Customer.register).append(".").append(store.getStoreTemplate());
-
- return template.toString();
-
-
- }
-
- @RequestMapping( value = "/register.html", method = RequestMethod.POST )
- public String registerCustomer( @Valid
- @ModelAttribute("customer") SecuredShopPersistableCustomer customer, BindingResult bindingResult, Model model,
- HttpServletRequest request, HttpServletResponse response, final Locale locale )
- throws Exception
- {
- MerchantStore merchantStore = (MerchantStore) request.getAttribute( Constants.MERCHANT_STORE );
- Language language = super.getLanguage(request);
-
- String userName = null;
- String password = null;
-
- model.addAttribute( "recapatcha_public_key", coreConfiguration.getProperty( ApplicationConstants.RECAPTCHA_PUBLIC_KEY ) );
-
- if(!StringUtils.isBlank(request.getParameter("g-recaptcha-response"))) {
- boolean validateCaptcha = captchaRequestUtils.checkCaptcha(request.getParameter("g-recaptcha-response"));
-
- if ( !validateCaptcha )
- {
- LOGGER.debug( "Captcha response does not matched" );
- FieldError error = new FieldError("captchaChallengeField","captchaChallengeField",messages.getMessage("validaion.recaptcha.not.matched", locale));
- bindingResult.addError(error);
- }
- }
-
-
- if ( StringUtils.isNotBlank( customer.getUserName() ) )
- {
- if ( customerFacade.checkIfUserExists( customer.getUserName(), merchantStore ) )
- {
- LOGGER.debug( "Customer with username {} already exists for this store ", customer.getUserName() );
- FieldError error = new FieldError("userName","userName",messages.getMessage("registration.username.already.exists", locale));
- bindingResult.addError(error);
- }
- userName = customer.getUserName();
- }
-
-
- if ( StringUtils.isNotBlank( customer.getPassword() ) && StringUtils.isNotBlank( customer.getCheckPassword() ))
- {
- if (! customer.getPassword().equals(customer.getCheckPassword()) )
- {
- FieldError error = new FieldError("password","password",messages.getMessage("message.password.checkpassword.identical", locale));
- bindingResult.addError(error);
-
- }
- password = customer.getPassword();
- }
-
- if ( bindingResult.hasErrors() )
- {
- LOGGER.debug( "found {} validation error while validating in customer registration ",
- bindingResult.getErrorCount() );
- StringBuilder template =
- new StringBuilder().append( ControllerConstants.Tiles.Customer.register ).append( "." ).append( merchantStore.getStoreTemplate() );
- return template.toString();
-
- }
-
- @SuppressWarnings( "unused" )
- CustomerEntity customerData = null;
- try
- {
- //set user clear password
- customer.setClearPassword(password);
- customerData = customerFacade.registerCustomer( customer, merchantStore, language );
- }
- /* catch ( CustomerRegistrationException cre )
- {
- LOGGER.error( "Error while registering customer.. ", cre);
- ObjectError error = new ObjectError("registration",messages.getMessage("registration.failed", locale));
- bindingResult.addError(error);
- StringBuilder template =
- new StringBuilder().append( ControllerConstants.Tiles.Customer.register ).append( "." ).append( merchantStore.getStoreTemplate() );
- return template.toString();
- }*/
- catch ( Exception e )
- {
- LOGGER.error( "Error while registering customer.. ", e);
- ObjectError error = new ObjectError("registration",messages.getMessage("registration.failed", locale));
- bindingResult.addError(error);
- StringBuilder template =
- new StringBuilder().append( ControllerConstants.Tiles.Customer.register ).append( "." ).append( merchantStore.getStoreTemplate() );
- return template.toString();
- }
-
- /**
- * Send registration email
- */
- emailTemplatesUtils.sendRegistrationEmail( customer, merchantStore, locale, request.getContextPath() );
-
- /**
- * Login user
- */
-
- try {
-
- //refresh customer
- Customer c = customerFacade.getCustomerByUserName(customer.getUserName(), merchantStore);
- //authenticate
- customerFacade.authenticate(c, userName, password);
- super.setSessionAttribute(Constants.CUSTOMER, c, request);
-
- StringBuilder cookieValue = new StringBuilder();
- cookieValue.append(merchantStore.getCode()).append("_").append(c.getNick());
-
- //set username in the cookie
- Cookie cookie = new Cookie(Constants.COOKIE_NAME_USER, cookieValue.toString());
- cookie.setMaxAge(60 * 24 * 3600);
- cookie.setPath(Constants.SLASH);
- response.addCookie(cookie);
-
-
- String sessionShoppingCartCode= (String)request.getSession().getAttribute( Constants.SHOPPING_CART );
- if(!StringUtils.isBlank(sessionShoppingCartCode)) {
- ShoppingCart shoppingCart = customerFacade.mergeCart( c, sessionShoppingCartCode, merchantStore, language );
- ShoppingCartData shoppingCartData=this.populateShoppingCartData(shoppingCart, merchantStore, language);
- if(shoppingCartData !=null) {
- request.getSession().setAttribute(Constants.SHOPPING_CART, shoppingCartData.getCode());
- }
-
- //set username in the cookie
- Cookie c1 = new Cookie(Constants.COOKIE_NAME_CART, shoppingCartData.getCode());
- c1.setMaxAge(60 * 24 * 3600);
- c1.setPath(Constants.SLASH);
- response.addCookie(c1);
-
- }
-
- return "redirect:/shop/customer/dashboard.html";
-
-
- } catch(Exception e) {
- LOGGER.error("Cannot authenticate user ",e);
- ObjectError error = new ObjectError("registration",messages.getMessage("registration.failed", locale));
- bindingResult.addError(error);
- }
-
-
- StringBuilder template =
- new StringBuilder().append( ControllerConstants.Tiles.Customer.register ).append( "." ).append( merchantStore.getStoreTemplate() );
- return template.toString();
-
- }
-
-
- @ModelAttribute("countryList")
- public List<Country> getCountries(final HttpServletRequest request){
-
- Language language = (Language) request.getAttribute( "LANGUAGE" );
- try
- {
- if ( language == null )
- {
- language = (Language) request.getAttribute( "LANGUAGE" );
- }
-
- if ( language == null )
- {
- language = languageService.getByCode( Constants.DEFAULT_LANGUAGE );
- }
-
- List<Country> countryList=countryService.getCountries( language );
- return countryList;
- }
- catch ( ServiceException e )
- {
- LOGGER.error( "Error while fetching country list ", e );
-
- }
- return Collections.emptyList();
- }
-
- @ModelAttribute("zoneList")
- public List<Zone> getZones(final HttpServletRequest request){
- return zoneService.list();
- }
-
-
-
-
-
-
- private ShoppingCartData populateShoppingCartData(final ShoppingCart cartModel , final MerchantStore store, final Language language){
-
- ShoppingCartDataPopulator shoppingCartDataPopulator = new ShoppingCartDataPopulator();
- shoppingCartDataPopulator.setShoppingCartCalculationService( shoppingCartCalculationService );
- shoppingCartDataPopulator.setPricingService( pricingService );
-
- try
- {
- return shoppingCartDataPopulator.populate( cartModel , store, language);
- }
- catch ( ConversionException ce )
- {
- LOGGER.error( "Error in converting shopping cart to shopping cart data", ce );
-
- }
- return null;
- }
-
-
-
-}
+package com.salesmanager.shop.store.controller.customer;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.reference.country.CountryService;
+import com.salesmanager.core.business.services.reference.language.LanguageService;
+import com.salesmanager.core.business.services.reference.zone.ZoneService;
+import com.salesmanager.core.business.services.shoppingcart.ShoppingCartCalculationService;
+import com.salesmanager.core.business.services.system.EmailService;
+import com.salesmanager.core.business.utils.CoreConfiguration;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.reference.zone.Zone;
+import com.salesmanager.core.model.shoppingcart.ShoppingCart;
+import com.salesmanager.shop.constants.ApplicationConstants;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.model.customer.AnonymousCustomer;
+import com.salesmanager.shop.model.customer.CustomerEntity;
+import com.salesmanager.shop.model.customer.SecuredShopPersistableCustomer;
+import com.salesmanager.shop.model.shoppingcart.ShoppingCartData;
+import com.salesmanager.shop.populator.shoppingCart.ShoppingCartDataPopulator;
+import com.salesmanager.shop.store.controller.AbstractController;
+import com.salesmanager.shop.store.controller.ControllerConstants;
+import com.salesmanager.shop.store.controller.customer.facade.CustomerFacade;
+import com.salesmanager.shop.utils.CaptchaRequestUtils;
+import com.salesmanager.shop.utils.EmailTemplatesUtils;
+import com.salesmanager.shop.utils.ImageFilePath;
+import com.salesmanager.shop.utils.LabelUtils;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.FieldError;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import javax.inject.Inject;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.util.Collections;
+import java.util.List;
+import java.util.Locale;
+
+//import com.salesmanager.core.business.customer.CustomerRegistrationException;
+
+/**
+ * Registration of a new customer
+ * @author Carl Samson
+ *
+ */
+
+@SuppressWarnings( "deprecation" )
+// http://stackoverflow.com/questions/17444258/how-to-use-new-passwordencoder-from-spring-security
+@Controller
+@RequestMapping("/shop/customer")
+public class CustomerRegistrationController extends AbstractController {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(CustomerRegistrationController.class);
+
+
+ @Inject
+ private CoreConfiguration coreConfiguration;
+
+ @Inject
+ private LanguageService languageService;
+
+
+ @Inject
+ private CountryService countryService;
+
+
+ @Inject
+ private ZoneService zoneService;
+
+ @Inject
+ private PasswordEncoder passwordEncoder;
+
+ @Inject
+ EmailService emailService;
+
+ @Inject
+ private LabelUtils messages;
+
+ @Inject
+ private CustomerFacade customerFacade;
+
+ @Inject
+ private AuthenticationManager customerAuthenticationManager;
+
+ @Inject
+ private EmailTemplatesUtils emailTemplatesUtils;
+
+ @Inject
+ private CaptchaRequestUtils captchaRequestUtils;
+
+ @Inject
+ @Qualifier("img")
+ private ImageFilePath imageUtils;
+
+ @Inject
+ private ShoppingCartCalculationService shoppingCartCalculationService;
+
+ @Inject
+ private PricingService pricingService;
+
+
+
+
+ @RequestMapping(value="/registration.html", method=RequestMethod.GET)
+ public String displayRegistration(final Model model, final HttpServletRequest request, final HttpServletResponse response) throws Exception {
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+
+ model.addAttribute( "recapatcha_public_key", coreConfiguration.getProperty( ApplicationConstants.RECAPTCHA_PUBLIC_KEY ) );
+
+ SecuredShopPersistableCustomer customer = new SecuredShopPersistableCustomer();
+ AnonymousCustomer anonymousCustomer = (AnonymousCustomer)request.getAttribute(Constants.ANONYMOUS_CUSTOMER);
+ if(anonymousCustomer!=null) {
+ customer.setBilling(anonymousCustomer.getBilling());
+ }
+
+ model.addAttribute("customer", customer);
+
+ /** template **/
+ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Customer.register).append(".").append(store.getStoreTemplate());
+
+ return template.toString();
+
+
+ }
+
+ @RequestMapping( value = "/register.html", method = RequestMethod.POST )
+ public String registerCustomer( @Valid
+ @ModelAttribute("customer") SecuredShopPersistableCustomer customer, BindingResult bindingResult, Model model,
+ HttpServletRequest request, HttpServletResponse response, final Locale locale )
+ throws Exception
+ {
+ MerchantStore merchantStore = (MerchantStore) request.getAttribute( Constants.MERCHANT_STORE );
+ Language language = super.getLanguage(request);
+
+ String userName = null;
+ String password = null;
+
+ model.addAttribute( "recapatcha_public_key", coreConfiguration.getProperty( ApplicationConstants.RECAPTCHA_PUBLIC_KEY ) );
+
+ if(!StringUtils.isBlank(request.getParameter("g-recaptcha-response"))) {
+ boolean validateCaptcha = captchaRequestUtils.checkCaptcha(request.getParameter("g-recaptcha-response"));
+
+ if ( !validateCaptcha )
+ {
+ LOGGER.debug( "Captcha response does not matched" );
+ FieldError error = new FieldError("captchaChallengeField","captchaChallengeField",messages.getMessage("validaion.recaptcha.not.matched", locale));
+ bindingResult.addError(error);
+ }
+ }
+
+
+ if ( StringUtils.isNotBlank( customer.getUserName() ) )
+ {
+ if ( customerFacade.checkIfUserExists( customer.getUserName(), merchantStore ) )
+ {
+ LOGGER.debug( "Customer with username {} already exists for this store ", customer.getUserName() );
+ FieldError error = new FieldError("userName","userName",messages.getMessage("registration.username.already.exists", locale));
+ bindingResult.addError(error);
+ }
+ userName = customer.getUserName();
+ }
+
+
+ if ( StringUtils.isNotBlank( customer.getPassword() ) && StringUtils.isNotBlank( customer.getCheckPassword() ))
+ {
+ if (! customer.getPassword().equals(customer.getCheckPassword()) )
+ {
+ FieldError error = new FieldError("password","password",messages.getMessage("message.password.checkpassword.identical", locale));
+ bindingResult.addError(error);
+
+ }
+ password = customer.getPassword();
+ }
+
+ if ( bindingResult.hasErrors() )
+ {
+ LOGGER.debug( "found {} validation error while validating in customer registration ",
+ bindingResult.getErrorCount() );
+ StringBuilder template =
+ new StringBuilder().append( ControllerConstants.Tiles.Customer.register ).append( "." ).append( merchantStore.getStoreTemplate() );
+ return template.toString();
+
+ }
+
+ @SuppressWarnings( "unused" )
+ CustomerEntity customerData = null;
+ try
+ {
+ //set user clear password
+ customer.setClearPassword(password);
+ customerData = customerFacade.registerCustomer( customer, merchantStore, language );
+ }
+ /* catch ( CustomerRegistrationException cre )
+ {
+ LOGGER.error( "Error while registering customer.. ", cre);
+ ObjectError error = new ObjectError("registration",messages.getMessage("registration.failed", locale));
+ bindingResult.addError(error);
+ StringBuilder template =
+ new StringBuilder().append( ControllerConstants.Tiles.Customer.register ).append( "." ).append( merchantStore.getStoreTemplate() );
+ return template.toString();
+ }*/
+ catch ( Exception e )
+ {
+ LOGGER.error( "Error while registering customer.. ", e);
+ ObjectError error = new ObjectError("registration",messages.getMessage("registration.failed", locale));
+ bindingResult.addError(error);
+ StringBuilder template =
+ new StringBuilder().append( ControllerConstants.Tiles.Customer.register ).append( "." ).append( merchantStore.getStoreTemplate() );
+ return template.toString();
+ }
+
+
+ try {
+
+ /**
+ * Send registration email
+ */
+ emailTemplatesUtils.sendRegistrationEmail( customer, merchantStore, locale, request.getContextPath() );
+
+ } catch(Exception e) {
+
+ LOGGER.error("Cannot send email to customer ",e);
+
+ }
+
+ /**
+ * Login user
+ */
+
+ try {
+
+ //refresh customer
+ Customer c = customerFacade.getCustomerByUserName(customer.getUserName(), merchantStore);
+ //authenticate
+ customerFacade.authenticate(c, userName, password);
+ super.setSessionAttribute(Constants.CUSTOMER, c, request);
+
+ StringBuilder cookieValue = new StringBuilder();
+ cookieValue.append(merchantStore.getCode()).append("_").append(c.getNick());
+
+ //set username in the cookie
+ Cookie cookie = new Cookie(Constants.COOKIE_NAME_USER, cookieValue.toString());
+ cookie.setMaxAge(60 * 24 * 3600);
+ cookie.setPath(Constants.SLASH);
+ response.addCookie(cookie);
+
+
+ String sessionShoppingCartCode= (String)request.getSession().getAttribute( Constants.SHOPPING_CART );
+ if(!StringUtils.isBlank(sessionShoppingCartCode)) {
+ ShoppingCart shoppingCart = customerFacade.mergeCart( c, sessionShoppingCartCode, merchantStore, language );
+ ShoppingCartData shoppingCartData=this.populateShoppingCartData(shoppingCart, merchantStore, language);
+ if(shoppingCartData !=null) {
+ request.getSession().setAttribute(Constants.SHOPPING_CART, shoppingCartData.getCode());
+ }
+
+ //set username in the cookie
+ Cookie c1 = new Cookie(Constants.COOKIE_NAME_CART, shoppingCartData.getCode());
+ c1.setMaxAge(60 * 24 * 3600);
+ c1.setPath(Constants.SLASH);
+ response.addCookie(c1);
+
+ }
+
+ return "redirect:/shop/customer/dashboard.html";
+
+
+ } catch(Exception e) {
+ LOGGER.error("Cannot authenticate user ",e);
+ ObjectError error = new ObjectError("registration",messages.getMessage("registration.failed", locale));
+ bindingResult.addError(error);
+ }
+
+
+ StringBuilder template =
+ new StringBuilder().append( ControllerConstants.Tiles.Customer.register ).append( "." ).append( merchantStore.getStoreTemplate() );
+ return template.toString();
+
+ }
+
+
+ @ModelAttribute("countryList")
+ public List<Country> getCountries(final HttpServletRequest request){
+
+ Language language = (Language) request.getAttribute( "LANGUAGE" );
+ try
+ {
+ if ( language == null )
+ {
+ language = (Language) request.getAttribute( "LANGUAGE" );
+ }
+
+ if ( language == null )
+ {
+ language = languageService.getByCode( Constants.DEFAULT_LANGUAGE );
+ }
+
+ List<Country> countryList=countryService.getCountries( language );
+ return countryList;
+ }
+ catch ( ServiceException e )
+ {
+ LOGGER.error( "Error while fetching country list ", e );
+
+ }
+ return Collections.emptyList();
+ }
+
+ @ModelAttribute("zoneList")
+ public List<Zone> getZones(final HttpServletRequest request){
+ return zoneService.list();
+ }
+
+
+
+
+
+
+ private ShoppingCartData populateShoppingCartData(final ShoppingCart cartModel , final MerchantStore store, final Language language){
+
+ ShoppingCartDataPopulator shoppingCartDataPopulator = new ShoppingCartDataPopulator();
+ shoppingCartDataPopulator.setShoppingCartCalculationService( shoppingCartCalculationService );
+ shoppingCartDataPopulator.setPricingService( pricingService );
+
+ try
+ {
+ return shoppingCartDataPopulator.populate( cartModel , store, language);
+ }
+ catch ( ConversionException ce )
+ {
+ LOGGER.error( "Error in converting shopping cart to shopping cart data", ce );
+
+ }
+ return null;
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/facade/CustomerFacade.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/facade/CustomerFacade.java
index fdf3518..1b13659 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/facade/CustomerFacade.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/facade/CustomerFacade.java
@@ -1,90 +1,131 @@
-/**
- *
- */
-package com.salesmanager.shop.store.controller.customer.facade;
-
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.business.services.customer.CustomerService;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.shoppingcart.ShoppingCart;
-import com.salesmanager.shop.model.customer.Address;
-import com.salesmanager.shop.model.customer.CustomerEntity;
-import com.salesmanager.shop.model.customer.PersistableCustomer;
-import com.salesmanager.shop.model.customer.ReadableCustomer;
-
-/**
- * <p>Customer facade working as a bridge between {@link CustomerService} and Controller
- * It will take care about interacting with Service API and doing any pre and post processing
- * </p>
- *
- * @author Umesh Awasthi
- * @version 1/2
- *
- *
- */
-public interface CustomerFacade
-{
-
- /**
- * Method used to fetch customer based on the username and storecode.
- * Customer username is unique to each store.
- *
- * @param userName
- * @param store
- * @param store
- * @param language
- * @throws Exception
- *
- */
- public CustomerEntity getCustomerDataByUserName(final String userName,final MerchantStore store, final Language language) throws Exception;
-
- /**
- * Creates a ReadableCustomer
- * @param id
- * @param merchantStore
- * @param language
- * @return
- */
- public ReadableCustomer getCustomerById(final Long id, final MerchantStore merchantStore, final Language language) throws Exception;
-
- /**
- * <p>Method responsible for merging cart during authentication,
- * Method will perform following operations
- * <li> Merge Customer Shopping Cart with Session Cart if any.</li>
- * <li> Convert Customer to {@link CustomerEntity} </li>
- * </p>
- *
- * @param customer username of Customer
- * @param sessionShoppingCartId session shopping cart, if user already have few items in Cart.
- * @throws Exception
- */
- public ShoppingCart mergeCart(final Customer customer,final String sessionShoppingCartId,final MerchantStore store,final Language language) throws Exception;
-
- public Customer getCustomerByUserName(final String userName, final MerchantStore store) throws Exception;
-
- public boolean checkIfUserExists(final String userName,final MerchantStore store) throws Exception;
-
- public CustomerEntity registerCustomer( final PersistableCustomer customer,final MerchantStore merchantStore, final Language language) throws Exception;
-
- public Address getAddress(final Long userId, final MerchantStore merchantStore,boolean isBillingAddress) throws Exception;
-
- public void updateAddress( Long userId, MerchantStore merchantStore, Address address, final Language language )
- throws Exception;
-
- public void setCustomerModelDefaultProperties(Customer customer, MerchantStore store) throws Exception;
- //public Customer populateCustomerModel(PersistableCustomer customer,
- // MerchantStore merchantStore) throws Exception;
-
- public void authenticate(Customer customer, String userName, String password) throws Exception;
-
- Customer getCustomerModel(PersistableCustomer customer,
- MerchantStore merchantStore, Language language) throws Exception;
-
- Customer populateCustomerModel(Customer customerModel, PersistableCustomer customer,
- MerchantStore merchantStore, Language language) throws Exception;
-
-
-
-
-}
+/**
+ *
+ */
+package com.salesmanager.shop.store.controller.customer.facade;
+
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.customer.review.CustomerReview;
+
+import java.util.List;
+
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.shoppingcart.ShoppingCart;
+import com.salesmanager.shop.model.customer.Address;
+import com.salesmanager.shop.model.customer.CustomerEntity;
+import com.salesmanager.shop.model.customer.PersistableCustomer;
+import com.salesmanager.shop.model.customer.PersistableCustomerReview;
+import com.salesmanager.shop.model.customer.ReadableCustomer;
+import com.salesmanager.shop.model.customer.ReadableCustomerReview;
+
+/**
+ * <p>Customer facade working as a bridge between {@link CustomerService} and Controller
+ * It will take care about interacting with Service API and doing any pre and post processing
+ * </p>
+ *
+ * @author Umesh Awasthi
+ * @version 1/2
+ *
+ *
+ */
+public interface CustomerFacade
+{
+
+ /**
+ * Method used to fetch customer based on the username and storecode.
+ * Customer username is unique to each store.
+ *
+ * @param userName
+ * @param store
+ * @param store
+ * @param language
+ * @throws Exception
+ *
+ */
+ public CustomerEntity getCustomerDataByUserName(final String userName,final MerchantStore store, final Language language) throws Exception;
+
+ /**
+ * Creates a ReadableCustomer
+ * @param id
+ * @param merchantStore
+ * @param language
+ * @return
+ */
+ public ReadableCustomer getCustomerById(final Long id, final MerchantStore merchantStore, final Language language) throws Exception;
+
+ /**
+ * <p>Method responsible for merging cart during authentication,
+ * Method will perform following operations
+ * <li> Merge Customer Shopping Cart with Session Cart if any.</li>
+ * <li> Convert Customer to {@link CustomerEntity} </li>
+ * </p>
+ *
+ * @param customer username of Customer
+ * @param sessionShoppingCartId session shopping cart, if user already have few items in Cart.
+ * @throws Exception
+ */
+ public ShoppingCart mergeCart(final Customer customer,final String sessionShoppingCartId,final MerchantStore store,final Language language) throws Exception;
+
+ public Customer getCustomerByUserName(final String userName, final MerchantStore store) throws Exception;
+
+ public boolean checkIfUserExists(final String userName,final MerchantStore store) throws Exception;
+
+ public PersistableCustomer registerCustomer( final PersistableCustomer customer,final MerchantStore merchantStore, final Language language) throws Exception;
+
+ public Address getAddress(final Long userId, final MerchantStore merchantStore,boolean isBillingAddress) throws Exception;
+
+ public void updateAddress( Long userId, MerchantStore merchantStore, Address address, final Language language )
+ throws Exception;
+
+ public void setCustomerModelDefaultProperties(Customer customer, MerchantStore store) throws Exception;
+ //public Customer populateCustomerModel(PersistableCustomer customer,
+ // MerchantStore merchantStore) throws Exception;
+
+ public void authenticate(Customer customer, String userName, String password) throws Exception;
+
+ Customer getCustomerModel(PersistableCustomer customer,
+ MerchantStore merchantStore, Language language) throws Exception;
+
+ Customer populateCustomerModel(Customer customerModel, PersistableCustomer customer,
+ MerchantStore merchantStore, Language language) throws Exception;
+
+ /*
+ * Creates a Customer from a PersistableCustomer received from REST API
+ */
+ void create(PersistableCustomer customer, MerchantStore store) throws Exception;
+
+ /**
+ * Updates a Customer
+ * @param customer
+ * @param store
+ * @throws Exception
+ */
+ void update(PersistableCustomer customer, MerchantStore store) throws Exception;
+
+ /**
+ * Save or update a CustomerReview
+ * @param review
+ * @param store
+ * @param language
+ * @throws Exception
+ */
+ void saveOrUpdateCustomerReview(PersistableCustomerReview review, MerchantStore store, Language language) throws Exception;
+
+ /**
+ * List all customer reviews by reviewed
+ * @param customer
+ * @param store
+ * @param language
+ * @return
+ */
+ List<ReadableCustomerReview> getAllCustomerReviewsByReviewed(Customer customer, MerchantStore store, Language language) throws Exception;
+
+ /**
+ * Deletes a customer review
+ * @param review
+ * @param store
+ * @param language
+ */
+ void deleteCustomerReview(CustomerReview review, MerchantStore store, Language language) throws Exception;
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/facade/CustomerFacadeImpl.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/facade/CustomerFacadeImpl.java
index 3ccd3ea..94ad05d 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/facade/CustomerFacadeImpl.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/customer/facade/CustomerFacadeImpl.java
@@ -1,553 +1,727 @@
-/**
- *
- */
-package com.salesmanager.shop.store.controller.customer.facade;
-
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.services.catalog.product.PricingService;
-import com.salesmanager.core.business.services.catalog.product.ProductService;
-import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
-import com.salesmanager.core.business.services.customer.CustomerService;
-import com.salesmanager.core.business.services.customer.attribute.CustomerOptionService;
-import com.salesmanager.core.business.services.customer.attribute.CustomerOptionValueService;
-import com.salesmanager.core.business.services.reference.country.CountryService;
-import com.salesmanager.core.business.services.reference.language.LanguageService;
-import com.salesmanager.core.business.services.reference.zone.ZoneService;
-import com.salesmanager.core.business.services.shoppingcart.ShoppingCartCalculationService;
-import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
-import com.salesmanager.core.business.services.system.EmailService;
-import com.salesmanager.core.business.services.user.GroupService;
-import com.salesmanager.core.business.services.user.PermissionService;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.reference.zone.Zone;
-import com.salesmanager.core.model.shoppingcart.ShoppingCart;
-import com.salesmanager.core.model.user.Group;
-import com.salesmanager.core.model.user.GroupType;
-import com.salesmanager.core.model.user.Permission;
-import com.salesmanager.shop.admin.model.userpassword.UserReset;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.model.customer.Address;
-import com.salesmanager.shop.model.customer.CustomerEntity;
-import com.salesmanager.shop.model.customer.PersistableCustomer;
-import com.salesmanager.shop.model.customer.ReadableCustomer;
-import com.salesmanager.shop.populator.customer.*;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.Validate;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.stereotype.Service;
-
-import javax.inject.Inject;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-//import com.salesmanager.core.business.customer.CustomerRegistrationException;
-//import com.salesmanager.core.business.customer.exception.CustomerNotFoundException;
-
-
-/**
- * Customer Facade work as an abstraction layer between Controller and Service layer.
- * It work as an entry point to service layer.
- * @author Umesh Awasthi
- *
- */
-////http://stackoverflow.com/questions/17444258/how-to-use-new-passwordencoder-from-spring-security
-
-@Service("customerFacade")
-public class CustomerFacadeImpl implements CustomerFacade
-{
-
- private static final Logger LOG = LoggerFactory.getLogger(CustomerFacadeImpl.class);
- private final static int USERNAME_LENGTH=6;
-
- public final static String ROLE_PREFIX = "ROLE_";//Spring Security 4
-
-
- @Inject
- private CustomerService customerService;
-
- @Inject
- private ShoppingCartService shoppingCartService;
-
- @Inject
- private ShoppingCartCalculationService shoppingCartCalculationService;
-
- @Inject
- private PricingService pricingService;
-
- @Inject
- private ProductService productService;
-
- @Inject
- private ProductAttributeService productAttributeService;
-
- @Inject
- private LanguageService languageService;
-
- @Inject
- private CustomerOptionValueService customerOptionValueService;
-
- @Inject
- private CustomerOptionService customerOptionService;
-
-
- @Inject
- private CountryService countryService;
-
- @Inject
- private GroupService groupService;
-
- @Inject
- private PermissionService permissionService;
-
- @Inject
- private ZoneService zoneService;
-
- @SuppressWarnings( "deprecation" )
- @Inject
- private PasswordEncoder passwordEncoder;
-
- @Inject
- private EmailService emailService;
-
- @Inject
- private AuthenticationManager customerAuthenticationManager;
-
-
-
-
- /**
- * Method used to fetch customer based on the username and storecode.
- * Customer username is unique to each store.
- *
- * @param userName
- * @param store
- * @throws ConversionException
- */
- @Override
- public CustomerEntity getCustomerDataByUserName( final String userName, final MerchantStore store, final Language language ) throws Exception
- {
- LOG.info( "Fetching customer with userName" +userName);
- Customer customer=customerService.getByNick( userName );
-
- if(customer !=null){
- LOG.info( "Found customer, converting to CustomerEntity");
- try{
- CustomerEntityPopulator customerEntityPopulator=new CustomerEntityPopulator();
- return customerEntityPopulator.populate( customer, store, language ); //store, language
-
- }
- catch(ConversionException ex){
- LOG.error( "Error while converting Customer to CustomerEntity", ex );
- throw new Exception(ex);
- }
- }
-
- return null;
-
- }
-
-
- /* (non-Javadoc)
- * @see com.salesmanager.web.shop.controller.customer.facade#mergeCart(final Customer customerModel, final String sessionShoppingCartId ,final MerchantStore store,final Language language)
- */
- @Override
- public ShoppingCart mergeCart( final Customer customerModel, final String sessionShoppingCartId ,final MerchantStore store,final Language language)
- throws Exception
- {
-
- LOG.debug( "Starting merge cart process" );
- if(customerModel != null){
- ShoppingCart customerCart = shoppingCartService.getByCustomer( customerModel );
- if(StringUtils.isNotBlank( sessionShoppingCartId )){
- ShoppingCart sessionShoppingCart = shoppingCartService.getByCode( sessionShoppingCartId, store );
- if(sessionShoppingCart != null){
- if(customerCart == null){
- if(sessionShoppingCart.getCustomerId()==null) {//saved shopping cart does not belong to a customer
- LOG.debug( "Not able to find any shoppingCart with current customer" );
- //give it to the customer
- sessionShoppingCart.setCustomerId( customerModel.getId() );
- shoppingCartService.saveOrUpdate( sessionShoppingCart );
- customerCart =shoppingCartService.getById( sessionShoppingCart.getId(), store );
- return customerCart;
- //return populateShoppingCartData(customerCart,store,language);
- } else {
- return null;
- }
- }
- else{
- if(sessionShoppingCart.getCustomerId()==null) {//saved shopping cart does not belong to a customer
- //assign it to logged in user
- LOG.debug( "Customer shopping cart as well session cart is available, merging carts" );
- customerCart=shoppingCartService.mergeShoppingCarts( customerCart, sessionShoppingCart, store );
- customerCart =shoppingCartService.getById( customerCart.getId(), store );
- return customerCart;
- //return populateShoppingCartData(customerCart,store,language);
- } else {
- if(sessionShoppingCart.getCustomerId().longValue()==customerModel.getId().longValue()) {
- if(!customerCart.getShoppingCartCode().equals(sessionShoppingCart.getShoppingCartCode())) {
- //merge carts
- LOG.info( "Customer shopping cart as well session cart is available" );
- customerCart=shoppingCartService.mergeShoppingCarts( customerCart, sessionShoppingCart, store );
- customerCart =shoppingCartService.getById( customerCart.getId(), store );
- return customerCart;
- //return populateShoppingCartData(customerCart,store,language);
- } else {
- return customerCart;
- //return populateShoppingCartData(sessionShoppingCart,store,language);
- }
- } else {
- //the saved cart belongs to another user
- return null;
- }
- }
-
-
- }
- }
- }
- else{
- if(customerCart !=null){
- //return populateShoppingCartData(customerCart,store,language);
- return customerCart;
- }
- return null;
-
- }
- }
- LOG.info( "Seems some issue with system, unable to find any customer after successful authentication" );
- return null;
-
- }
-
-
-
-
-
- @Override
- public Customer getCustomerByUserName(String userName, MerchantStore store)
- throws Exception {
- return customerService.getByNick( userName, store.getId() );
- }
-
-
- /**
- * <p>
- * Method to check if given user exists for given username under given store.
- * System treat username as unique for a given store,
- * customer is not allowed
- * to use same username twice for a given store, however it can be used for
- * different stores.</p>
- *
- * @param userName Customer slected userName
- * @param store store for which customer want to register
- * @return boolean flag indicating if user exists for given store or not
- * @throws Exception
- *
- */
- @Override
- public boolean checkIfUserExists( final String userName, final MerchantStore store )
- throws Exception
- {
- if ( StringUtils.isNotBlank( userName ) && store != null )
- {
- Customer customer = customerService.getByNick( userName, store.getId() );
- if ( customer != null )
- {
- LOG.info( "Customer with userName {} already exists for store {} ", userName, store.getStorename() );
- return true;
- }
-
- LOG.info( "No customer found with userName {} for store {} ", userName, store.getStorename());
- return false;
-
- }
- LOG.info( "Either userName is empty or we have not found any value for store" );
- return false;
- }
-
-
- @Override
- public CustomerEntity registerCustomer( final PersistableCustomer customer,final MerchantStore merchantStore, Language language )
- throws Exception
- {
- LOG.info( "Starting customer registration process.." );
- Customer customerModel= getCustomerModel(customer,merchantStore,language);
- if(customerModel == null){
- LOG.equals( "Unable to create customer in system" );
- //throw new CustomerRegistrationException( "Unable to register customer" );
- throw new Exception( "Unable to register customer" );
- }
-
- LOG.info( "About to persist customer to database." );
- customerService.saveOrUpdate( customerModel );
-
- LOG.info( "Returning customer data to controller.." );
- return customerEntityPoulator(customerModel,merchantStore);
- }
-
- @Override
- public Customer getCustomerModel(final PersistableCustomer customer,final MerchantStore merchantStore, Language language) throws Exception {
-
- LOG.info( "Starting to populate customer model from customer data" );
- Customer customerModel=null;
- CustomerPopulator populator = new CustomerPopulator();
- populator.setCountryService(countryService);
- populator.setCustomerOptionService(customerOptionService);
- populator.setCustomerOptionValueService(customerOptionValueService);
- populator.setLanguageService(languageService);
- populator.setLanguageService(languageService);
- populator.setZoneService(zoneService);
-
-
- customerModel= populator.populate( customer, merchantStore, language );
- //we are creating or resetting a customer
- if(StringUtils.isBlank(customerModel.getPassword()) && !StringUtils.isBlank(customer.getClearPassword())) {
- customerModel.setPassword(customer.getClearPassword());
- }
- //set groups
- if(!StringUtils.isBlank(customerModel.getPassword()) && !StringUtils.isBlank(customerModel.getNick())) {
- customerModel.setPassword(passwordEncoder.encode(customer.getClearPassword()));
- setCustomerModelDefaultProperties(customerModel, merchantStore);
- }
-
-
- return customerModel;
-
- }
-
-
-
-
- private CustomerEntity customerEntityPoulator(final Customer customerModel,final MerchantStore merchantStore){
- CustomerEntityPopulator customerPopulator=new CustomerEntityPopulator();
- try
- {
- CustomerEntity customerEntity= customerPopulator.populate( customerModel, merchantStore, merchantStore.getDefaultLanguage() );
- if(customerEntity !=null){
- customerEntity.setId( customerModel.getId() );
- LOG.info( "Retunring populated instance of customer entity" );
- return customerEntity;
- }
- LOG.warn( "Seems some issue with customerEntity populator..retunring null instance of customerEntity " );
- return null;
-
- }
- catch ( ConversionException e )
- {
- LOG.error( "Error while converting customer model to customer entity ",e );
-
- }
- return null;
- }
-
-
- @Override
- public void setCustomerModelDefaultProperties(Customer customer,
- MerchantStore store) throws Exception {
- Validate.notNull(customer, "Customer object cannot be null");
- if(customer.getId()==null || customer.getId()==0) {
- if(StringUtils.isBlank(customer.getNick())) {
- String userName = UserReset.generateRandomString(USERNAME_LENGTH);
- customer.setNick(userName);
- }
- if(StringUtils.isBlank(customer.getPassword())) {
- String password = UserReset.generateRandomString();
- String encodedPassword = passwordEncoder.encode(password);
- customer.setPassword(encodedPassword);
- }
- }
-
- if(CollectionUtils.isEmpty(customer.getGroups())) {
- List<Group> groups = groupService.listGroup(GroupType.CUSTOMER);
- for(Group group : groups) {
- if(group.getGroupName().equals(Constants.GROUP_CUSTOMER)) {
- customer.getGroups().add(group);
- }
- }
-
- }
-
- }
-
-
-
-
- @SuppressWarnings("deprecation")
- public void authenticate(Customer customer, String userName, String password) throws Exception {
-
- Validate.notNull(customer, "Customer cannot be null");
-
- Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
- GrantedAuthority role = new SimpleGrantedAuthority(ROLE_PREFIX + Constants.PERMISSION_CUSTOMER_AUTHENTICATED);//required to login
- authorities.add(role);
- List<Integer> groupsId = new ArrayList<Integer>();
- List<Group> groups = customer.getGroups();
- if(groups!=null) {
- for(Group group : groups) {
- groupsId.add(group.getId());
-
- }
- if(groupsId!=null && groupsId.size()>0) {
- List<Permission> permissions = permissionService.getPermissions(groupsId);
- for(Permission permission : permissions) {
- GrantedAuthority auth = new SimpleGrantedAuthority(permission.getPermissionName());
- authorities.add(auth);
- }
- }
- }
-
- Authentication authenticationToken =
- new UsernamePasswordAuthenticationToken(userName, password, authorities);
-
- Authentication authentication = customerAuthenticationManager.authenticate(authenticationToken);
-
- SecurityContextHolder.getContext().setAuthentication(authentication);
-
- }
-
-
- @Override
- public Address getAddress( Long userId, final MerchantStore merchantStore,boolean isBillingAddress)
- throws Exception
- {
- LOG.info( "Fetching customer for id {} ", userId);
- Address address=null;
- final Customer customerModel=customerService.getById( userId );
-
- if(customerModel == null){
- LOG.error( "Customer with ID {} does not exists..", userId);
- //throw new CustomerNotFoundException( "customer with given id does not exists" );
- throw new Exception( "customer with given id does not exists" );
- }
-
- if(isBillingAddress){
- LOG.info( "getting billing address.." );
- CustomerBillingAddressPopulator billingAddressPopulator=new CustomerBillingAddressPopulator();
- address =billingAddressPopulator.populate( customerModel, merchantStore, merchantStore.getDefaultLanguage() );
- address.setBillingAddress( true );
- return address;
- }
-
- LOG.info( "getting Delivery address.." );
- CustomerDeliveryAddressPopulator deliveryAddressPopulator=new CustomerDeliveryAddressPopulator();
- return deliveryAddressPopulator.populate( customerModel, merchantStore, merchantStore.getDefaultLanguage() );
-
- }
-
-
- @Override
- public void updateAddress( Long userId, MerchantStore merchantStore, Address address, final Language language )
- throws Exception
- {
-
- Customer customerModel=customerService.getById( userId );
- Map<String, Country> countriesMap = countryService.getCountriesMap( language );
- Country country = countriesMap.get( address.getCountry() );
-
- if(customerModel ==null){
- LOG.error( "Customer with ID {} does not exists..", userId);
- //throw new CustomerNotFoundException( "customer with given id does not exists" );
- throw new Exception( "customer with given id does not exists" );
-
- }
- if(address.isBillingAddress()){
- LOG.info( "updating customer billing address..");
- PersistableCustomerBillingAddressPopulator billingAddressPopulator=new PersistableCustomerBillingAddressPopulator();
- customerModel= billingAddressPopulator.populate( address, customerModel, merchantStore, merchantStore.getDefaultLanguage() );
- customerModel.getBilling().setCountry( country );
- if(StringUtils.isNotBlank( address.getZone() )){
- Zone zone = zoneService.getByCode(address.getZone());
- if(zone==null) {
- throw new ConversionException("Unsuported zone code " + address.getZone());
- }
- customerModel.getBilling().setZone( zone );
- customerModel.getBilling().setState(null);
-
- } else {
- customerModel.getBilling().setZone(null);
- }
-
- }
- else{
- LOG.info( "updating customer shipping address..");
- PersistableCustomerShippingAddressPopulator shippingAddressPopulator=new PersistableCustomerShippingAddressPopulator();
- customerModel= shippingAddressPopulator.populate( address, customerModel, merchantStore, merchantStore.getDefaultLanguage() );
- customerModel.getDelivery().setCountry( country );
- if(StringUtils.isNotBlank( address.getZone() )){
- Zone zone = zoneService.getByCode(address.getZone());
- if(zone==null) {
- throw new ConversionException("Unsuported zone code " + address.getZone());
- }
-
- customerModel.getDelivery().setZone( zone );
- customerModel.getDelivery().setState(null);
-
- } else {
- customerModel.getDelivery().setZone(null);
- }
-
- }
-
-
- // same update address with customer model
- this.customerService.saveOrUpdate( customerModel );
-
- }
-
- @Override
- public ReadableCustomer getCustomerById(final Long id, final MerchantStore merchantStore, final Language language) throws Exception {
- Customer customerModel = customerService.getById(id);
- if(customerModel==null) {
- return null;
- }
-
- ReadableCustomer readableCustomer = new ReadableCustomer();
-
- ReadableCustomerPopulator customerPopulator = new ReadableCustomerPopulator();
- customerPopulator.populate(customerModel,readableCustomer, merchantStore, language);
-
- return readableCustomer;
- }
-
-
- @Override
- public Customer populateCustomerModel(Customer customerModel,
- PersistableCustomer customer, MerchantStore merchantStore,
- Language language) throws Exception {
- LOG.info( "Starting to populate customer model from customer data" );
- CustomerPopulator populator = new CustomerPopulator();
- populator.setCountryService(countryService);
- populator.setCustomerOptionService(customerOptionService);
- populator.setCustomerOptionValueService(customerOptionValueService);
- populator.setLanguageService(languageService);
- populator.setLanguageService(languageService);
- populator.setZoneService(zoneService);
-
-
- customerModel= populator.populate( customer, customerModel, merchantStore, language );
- //set groups
- //if(!StringUtils.isBlank(customerModel.getPassword()) && !StringUtils.isBlank(customerModel.getNick())) {
- // customerModel.setPassword(passwordEncoder.encodePassword(customer.getPassword(), null));
- // setCustomerModelDefaultProperties(customerModel, merchantStore);
- //}
-
- LOG.info( "About to persist customer to database." );
- customerService.saveOrUpdate( customerModel );
- return customerModel;
- }
-
-}
+/**
+ *
+ */
+package com.salesmanager.shop.store.controller.customer.facade;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang.Validate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Service;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.business.services.customer.attribute.CustomerOptionService;
+import com.salesmanager.core.business.services.customer.attribute.CustomerOptionValueService;
+import com.salesmanager.core.business.services.customer.review.CustomerReviewService;
+import com.salesmanager.core.business.services.reference.country.CountryService;
+import com.salesmanager.core.business.services.reference.language.LanguageService;
+import com.salesmanager.core.business.services.reference.zone.ZoneService;
+import com.salesmanager.core.business.services.shoppingcart.ShoppingCartCalculationService;
+import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
+import com.salesmanager.core.business.services.system.EmailService;
+import com.salesmanager.core.business.services.user.GroupService;
+import com.salesmanager.core.business.services.user.PermissionService;
+import com.salesmanager.core.business.utils.CoreConfiguration;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.customer.review.CustomerReview;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.reference.zone.Zone;
+import com.salesmanager.core.model.shoppingcart.ShoppingCart;
+import com.salesmanager.core.model.user.Group;
+import com.salesmanager.core.model.user.GroupType;
+import com.salesmanager.core.model.user.Permission;
+import com.salesmanager.shop.admin.model.userpassword.UserReset;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.model.customer.Address;
+import com.salesmanager.shop.model.customer.CustomerEntity;
+import com.salesmanager.shop.model.customer.PersistableCustomer;
+import com.salesmanager.shop.model.customer.PersistableCustomerReview;
+import com.salesmanager.shop.model.customer.ReadableCustomer;
+import com.salesmanager.shop.model.customer.ReadableCustomerReview;
+import com.salesmanager.shop.model.customer.UserAlreadyExistException;
+import com.salesmanager.shop.populator.customer.CustomerBillingAddressPopulator;
+import com.salesmanager.shop.populator.customer.CustomerDeliveryAddressPopulator;
+import com.salesmanager.shop.populator.customer.CustomerEntityPopulator;
+import com.salesmanager.shop.populator.customer.CustomerPopulator;
+import com.salesmanager.shop.populator.customer.PersistableCustomerBillingAddressPopulator;
+import com.salesmanager.shop.populator.customer.PersistableCustomerReviewPopulator;
+import com.salesmanager.shop.populator.customer.PersistableCustomerShippingAddressPopulator;
+import com.salesmanager.shop.populator.customer.ReadableCustomerPopulator;
+import com.salesmanager.shop.populator.customer.ReadableCustomerReviewPopulator;
+import com.salesmanager.shop.utils.EmailTemplatesUtils;
+import com.salesmanager.shop.utils.LocaleUtils;
+
+
+/**
+ * Customer Facade work as an abstraction layer between Controller and Service layer.
+ * It work as an entry point to service layer.
+ * @author Umesh Awasthi
+ *
+ */
+
+@Service("customerFacade")
+public class CustomerFacadeImpl implements CustomerFacade
+{
+
+ private static final Logger LOG = LoggerFactory.getLogger(CustomerFacadeImpl.class);
+ private final static int USERNAME_LENGTH=6;
+
+ public final static String ROLE_PREFIX = "ROLE_";//Spring Security 4
+
+
+ @Inject
+ private CustomerService customerService;
+
+ @Inject
+ private ShoppingCartService shoppingCartService;
+
+ @Inject
+ private ShoppingCartCalculationService shoppingCartCalculationService;
+
+ @Inject
+ private PricingService pricingService;
+
+ @Inject
+ private ProductService productService;
+
+ @Inject
+ private ProductAttributeService productAttributeService;
+
+ @Inject
+ private LanguageService languageService;
+
+ @Inject
+ private CustomerOptionValueService customerOptionValueService;
+
+ @Inject
+ private CustomerOptionService customerOptionService;
+
+
+ @Inject
+ private CountryService countryService;
+
+ @Inject
+ private GroupService groupService;
+
+ @Inject
+ private PermissionService permissionService;
+
+ @Inject
+ private ZoneService zoneService;
+
+ @SuppressWarnings( "deprecation" )
+ @Inject
+ private PasswordEncoder passwordEncoder;
+
+ @Inject
+ private EmailService emailService;
+
+ @Inject
+ private EmailTemplatesUtils emailTemplatesUtils;
+
+ @Inject
+ private AuthenticationManager customerAuthenticationManager;
+
+ @Inject
+ private CustomerReviewService customerReviewService;
+
+
+ @Inject
+ private CoreConfiguration coreConfiguration;
+
+ /**
+ * Method used to fetch customer based on the username and storecode.
+ * Customer username is unique to each store.
+ *
+ * @param userName
+ * @param store
+ * @throws ConversionException
+ */
+ @Override
+ public CustomerEntity getCustomerDataByUserName( final String userName, final MerchantStore store, final Language language ) throws Exception
+ {
+ LOG.info( "Fetching customer with userName" +userName);
+ Customer customer=customerService.getByNick( userName );
+
+ if(customer !=null){
+ LOG.info( "Found customer, converting to CustomerEntity");
+ try{
+ CustomerEntityPopulator customerEntityPopulator=new CustomerEntityPopulator();
+ return customerEntityPopulator.populate( customer, store, language ); //store, language
+
+ }
+ catch(ConversionException ex){
+ LOG.error( "Error while converting Customer to CustomerEntity", ex );
+ throw new Exception(ex);
+ }
+ }
+
+ return null;
+
+ }
+
+
+ /* (non-Javadoc)
+ * @see com.salesmanager.web.shop.controller.customer.facade#mergeCart(final Customer customerModel, final String sessionShoppingCartId ,final MerchantStore store,final Language language)
+ */
+ @Override
+ public ShoppingCart mergeCart( final Customer customerModel, final String sessionShoppingCartId ,final MerchantStore store,final Language language)
+ throws Exception
+ {
+
+ LOG.debug( "Starting merge cart process" );
+ if(customerModel != null){
+ ShoppingCart customerCart = shoppingCartService.getByCustomer( customerModel );
+ if(StringUtils.isNotBlank( sessionShoppingCartId )){
+ ShoppingCart sessionShoppingCart = shoppingCartService.getByCode( sessionShoppingCartId, store );
+ if(sessionShoppingCart != null){
+ if(customerCart == null){
+ if(sessionShoppingCart.getCustomerId()==null) {//saved shopping cart does not belong to a customer
+ LOG.debug( "Not able to find any shoppingCart with current customer" );
+ //give it to the customer
+ sessionShoppingCart.setCustomerId( customerModel.getId() );
+ shoppingCartService.saveOrUpdate( sessionShoppingCart );
+ customerCart =shoppingCartService.getById( sessionShoppingCart.getId(), store );
+ return customerCart;
+ //return populateShoppingCartData(customerCart,store,language);
+ } else {
+ return null;
+ }
+ }
+ else{
+ if(sessionShoppingCart.getCustomerId()==null) {//saved shopping cart does not belong to a customer
+ //assign it to logged in user
+ LOG.debug( "Customer shopping cart as well session cart is available, merging carts" );
+ customerCart=shoppingCartService.mergeShoppingCarts( customerCart, sessionShoppingCart, store );
+ customerCart =shoppingCartService.getById( customerCart.getId(), store );
+ return customerCart;
+ //return populateShoppingCartData(customerCart,store,language);
+ } else {
+ if(sessionShoppingCart.getCustomerId().longValue()==customerModel.getId().longValue()) {
+ if(!customerCart.getShoppingCartCode().equals(sessionShoppingCart.getShoppingCartCode())) {
+ //merge carts
+ LOG.info( "Customer shopping cart as well session cart is available" );
+ customerCart=shoppingCartService.mergeShoppingCarts( customerCart, sessionShoppingCart, store );
+ customerCart =shoppingCartService.getById( customerCart.getId(), store );
+ return customerCart;
+ //return populateShoppingCartData(customerCart,store,language);
+ } else {
+ return customerCart;
+ //return populateShoppingCartData(sessionShoppingCart,store,language);
+ }
+ } else {
+ //the saved cart belongs to another user
+ return null;
+ }
+ }
+
+
+ }
+ }
+ }
+ else{
+ if(customerCart !=null){
+ //return populateShoppingCartData(customerCart,store,language);
+ return customerCart;
+ }
+ return null;
+
+ }
+ }
+ LOG.info( "Seems some issue with system, unable to find any customer after successful authentication" );
+ return null;
+
+ }
+
+
+
+
+
+ @Override
+ public Customer getCustomerByUserName(String userName, MerchantStore store)
+ throws Exception {
+ return customerService.getByNick( userName, store.getId() );
+ }
+
+
+ /**
+ * <p>
+ * Method to check if given user exists for given username under given store.
+ * System treat username as unique for a given store,
+ * customer is not allowed
+ * to use same username twice for a given store, however it can be used for
+ * different stores.</p>
+ *
+ * @param userName Customer slected userName
+ * @param store store for which customer want to register
+ * @return boolean flag indicating if user exists for given store or not
+ * @throws Exception
+ *
+ */
+ @Override
+ public boolean checkIfUserExists( final String userName, final MerchantStore store )
+ throws Exception
+ {
+ if ( StringUtils.isNotBlank( userName ) && store != null )
+ {
+ Customer customer = customerService.getByNick( userName, store.getId() );
+ if ( customer != null )
+ {
+ LOG.info( "Customer with userName {} already exists for store {} ", userName, store.getStorename() );
+ return true;
+ }
+
+ LOG.info( "No customer found with userName {} for store {} ", userName, store.getStorename());
+ return false;
+
+ }
+ LOG.info( "Either userName is empty or we have not found any value for store" );
+ return false;
+ }
+
+
+ @Override
+ public PersistableCustomer registerCustomer( final PersistableCustomer customer,final MerchantStore merchantStore, Language language )
+ throws Exception
+ {
+ LOG.info( "Starting customer registration process.." );
+
+ if(this.userExist(customer.getUserName())) {
+ throw new UserAlreadyExistException("User already exist");
+ }
+
+ Customer customerModel= getCustomerModel(customer,merchantStore,language);
+ if(customerModel == null){
+ LOG.equals( "Unable to create customer in system" );
+ //throw new CustomerRegistrationException( "Unable to register customer" );
+ throw new Exception( "Unable to register customer" );
+ }
+
+ LOG.info( "About to persist customer to database." );
+ customerService.saveOrUpdate( customerModel );
+
+ LOG.info( "Returning customer data to controller.." );
+ //return customerEntityPoulator(customerModel,merchantStore);
+ customer.setId(customerModel.getId());
+ return customer;
+ }
+
+ @Override
+ public Customer getCustomerModel(final PersistableCustomer customer,final MerchantStore merchantStore, Language language) throws Exception {
+
+ LOG.info( "Starting to populate customer model from customer data" );
+ Customer customerModel=null;
+ CustomerPopulator populator = new CustomerPopulator();
+ populator.setCountryService(countryService);
+ populator.setCustomerOptionService(customerOptionService);
+ populator.setCustomerOptionValueService(customerOptionValueService);
+ populator.setLanguageService(languageService);
+ populator.setLanguageService(languageService);
+ populator.setZoneService(zoneService);
+ populator.setGroupService(groupService);
+
+
+ customerModel= populator.populate( customer, merchantStore, language );
+ //we are creating or resetting a customer
+ if(StringUtils.isBlank(customerModel.getPassword()) && !StringUtils.isBlank(customer.getClearPassword())) {
+ customerModel.setPassword(customer.getClearPassword());
+ }
+ //set groups
+ if(!StringUtils.isBlank(customerModel.getPassword()) && !StringUtils.isBlank(customerModel.getNick())) {
+ customerModel.setPassword(passwordEncoder.encode(customer.getClearPassword()));
+ setCustomerModelDefaultProperties(customerModel, merchantStore);
+ }
+
+
+ return customerModel;
+
+ }
+
+
+
+
+ @Override
+ public void setCustomerModelDefaultProperties(Customer customer,
+ MerchantStore store) throws Exception {
+ Validate.notNull(customer, "Customer object cannot be null");
+ if(customer.getId()==null || customer.getId()==0) {
+ if(StringUtils.isBlank(customer.getNick())) {
+ String userName = UserReset.generateRandomString(USERNAME_LENGTH);
+ customer.setNick(userName);
+ }
+ if(StringUtils.isBlank(customer.getPassword())) {
+ String password = UserReset.generateRandomString();
+ String encodedPassword = passwordEncoder.encode(password);
+ customer.setPassword(encodedPassword);
+ }
+ }
+
+ if(CollectionUtils.isEmpty(customer.getGroups())) {
+ List<Group> groups = groupService.listGroup(GroupType.CUSTOMER);
+ for(Group group : groups) {
+ if(group.getGroupName().equals(Constants.GROUP_CUSTOMER)) {
+ customer.getGroups().add(group);
+ }
+ }
+
+ }
+
+ }
+
+
+
+
+ @SuppressWarnings("deprecation")
+ public void authenticate(Customer customer, String userName, String password) throws Exception {
+
+ Validate.notNull(customer, "Customer cannot be null");
+
+ Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
+ GrantedAuthority role = new SimpleGrantedAuthority(ROLE_PREFIX + Constants.PERMISSION_CUSTOMER_AUTHENTICATED);//required to login
+ authorities.add(role);
+ List<Integer> groupsId = new ArrayList<Integer>();
+ List<Group> groups = customer.getGroups();
+ if(groups!=null) {
+ for(Group group : groups) {
+ groupsId.add(group.getId());
+
+ }
+ if(groupsId!=null && groupsId.size()>0) {
+ List<Permission> permissions = permissionService.getPermissions(groupsId);
+ for(Permission permission : permissions) {
+ GrantedAuthority auth = new SimpleGrantedAuthority(permission.getPermissionName());
+ authorities.add(auth);
+ }
+ }
+ }
+
+ Authentication authenticationToken =
+ new UsernamePasswordAuthenticationToken(userName, password, authorities);
+
+ Authentication authentication = customerAuthenticationManager.authenticate(authenticationToken);
+
+ SecurityContextHolder.getContext().setAuthentication(authentication);
+
+ }
+
+
+ @Override
+ public Address getAddress( Long userId, final MerchantStore merchantStore,boolean isBillingAddress)
+ throws Exception
+ {
+ LOG.info( "Fetching customer for id {} ", userId);
+ Address address=null;
+ final Customer customerModel=customerService.getById( userId );
+
+ if(customerModel == null){
+ LOG.error( "Customer with ID {} does not exists..", userId);
+ //throw new CustomerNotFoundException( "customer with given id does not exists" );
+ throw new Exception( "customer with given id does not exists" );
+ }
+
+ if(isBillingAddress){
+ LOG.info( "getting billing address.." );
+ CustomerBillingAddressPopulator billingAddressPopulator=new CustomerBillingAddressPopulator();
+ address =billingAddressPopulator.populate( customerModel, merchantStore, merchantStore.getDefaultLanguage() );
+ address.setBillingAddress( true );
+ return address;
+ }
+
+ LOG.info( "getting Delivery address.." );
+ CustomerDeliveryAddressPopulator deliveryAddressPopulator=new CustomerDeliveryAddressPopulator();
+ return deliveryAddressPopulator.populate( customerModel, merchantStore, merchantStore.getDefaultLanguage() );
+
+ }
+
+
+ @Override
+ public void updateAddress( Long userId, MerchantStore merchantStore, Address address, final Language language )
+ throws Exception
+ {
+
+ Customer customerModel=customerService.getById( userId );
+ Map<String, Country> countriesMap = countryService.getCountriesMap( language );
+ Country country = countriesMap.get( address.getCountry() );
+
+ if(customerModel ==null){
+ LOG.error( "Customer with ID {} does not exists..", userId);
+ //throw new CustomerNotFoundException( "customer with given id does not exists" );
+ throw new Exception( "customer with given id does not exists" );
+
+ }
+ if(address.isBillingAddress()){
+ LOG.info( "updating customer billing address..");
+ PersistableCustomerBillingAddressPopulator billingAddressPopulator=new PersistableCustomerBillingAddressPopulator();
+ customerModel= billingAddressPopulator.populate( address, customerModel, merchantStore, merchantStore.getDefaultLanguage() );
+ customerModel.getBilling().setCountry( country );
+ if(StringUtils.isNotBlank( address.getZone() )){
+ Zone zone = zoneService.getByCode(address.getZone());
+ if(zone==null) {
+ throw new ConversionException("Unsuported zone code " + address.getZone());
+ }
+ customerModel.getBilling().setZone( zone );
+ customerModel.getBilling().setState(null);
+
+ } else {
+ customerModel.getBilling().setZone(null);
+ }
+
+ }
+ else{
+ LOG.info( "updating customer shipping address..");
+ PersistableCustomerShippingAddressPopulator shippingAddressPopulator=new PersistableCustomerShippingAddressPopulator();
+ customerModel= shippingAddressPopulator.populate( address, customerModel, merchantStore, merchantStore.getDefaultLanguage() );
+ customerModel.getDelivery().setCountry( country );
+ if(StringUtils.isNotBlank( address.getZone() )){
+ Zone zone = zoneService.getByCode(address.getZone());
+ if(zone==null) {
+ throw new ConversionException("Unsuported zone code " + address.getZone());
+ }
+
+ customerModel.getDelivery().setZone( zone );
+ customerModel.getDelivery().setState(null);
+
+ } else {
+ customerModel.getDelivery().setZone(null);
+ }
+
+ }
+
+
+ // same update address with customer model
+ this.customerService.saveOrUpdate( customerModel );
+
+ }
+
+ @Override
+ public ReadableCustomer getCustomerById(final Long id, final MerchantStore merchantStore, final Language language) throws Exception {
+ Customer customerModel = customerService.getById(id);
+ if(customerModel==null) {
+ return null;
+ }
+
+ ReadableCustomer readableCustomer = new ReadableCustomer();
+
+ ReadableCustomerPopulator customerPopulator = new ReadableCustomerPopulator();
+ customerPopulator.populate(customerModel,readableCustomer, merchantStore, language);
+
+ return readableCustomer;
+ }
+
+
+ @Override
+ public Customer populateCustomerModel(Customer customerModel,
+ PersistableCustomer customer, MerchantStore merchantStore,
+ Language language) throws Exception {
+ LOG.info( "Starting to populate customer model from customer data" );
+ CustomerPopulator populator = new CustomerPopulator();
+ populator.setCountryService(countryService);
+ populator.setCustomerOptionService(customerOptionService);
+ populator.setCustomerOptionValueService(customerOptionValueService);
+ populator.setLanguageService(languageService);
+ populator.setLanguageService(languageService);
+ populator.setGroupService(groupService);
+ populator.setZoneService(zoneService);
+ populator.setGroupService(groupService);
+
+
+ customerModel= populator.populate( customer, customerModel, merchantStore, language );
+
+ LOG.info( "About to persist customer to database." );
+ customerService.saveOrUpdate( customerModel );
+ return customerModel;
+ }
+
+
+ @Override
+ public void create(PersistableCustomer customer, MerchantStore store) throws Exception {
+
+ if(this.userExist(customer.getUserName())) {
+ throw new UserAlreadyExistException("User already exist");
+ }
+
+ Customer c = this.populate(customer, store);
+
+ customerService.save(c);
+ customer.setId(c.getId());
+
+ this.notifyNewCustomer(customer, store, c.getDefaultLanguage());
+
+ /**
+ * For security reasons set empty passwords
+ */
+ //customer.setEncodedPassword(null);
+ //customer.setClearPassword(null);
+
+ }
+
+ private boolean userExist(String userName) throws Exception {
+ boolean exist = false;
+ Customer customer = customerService.getByNick(userName);
+ if(customer != null) {
+ exist = true;
+ }
+ return exist;
+ }
+
+ private Customer populate(PersistableCustomer customer, MerchantStore store) throws Exception {
+
+ Customer cust = new Customer();
+
+ CustomerPopulator populator = new CustomerPopulator();
+ populator.setCountryService(countryService);
+ populator.setCustomerOptionService(customerOptionService);
+ populator.setCustomerOptionValueService(customerOptionValueService);
+ populator.setLanguageService(languageService);
+ populator.setLanguageService(languageService);
+ populator.setZoneService(zoneService);
+ populator.setGroupService(groupService);
+ populator.populate(customer, cust, store, store.getDefaultLanguage());
+
+ List<Group> groups = groupService.listGroup(GroupType.CUSTOMER);
+ cust.setGroups(groups);
+
+ Locale customerLocale = LocaleUtils.getLocale(cust.getDefaultLanguage());
+
+ String password = customer.getClearPassword();
+ if(StringUtils.isBlank(password)) {
+ password = UserReset.generateRandomString();
+ customer.setClearPassword(password);
+ }
+
+ @SuppressWarnings("deprecation")
+ String encodedPassword = passwordEncoder.encode(password);
+ if(!StringUtils.isBlank(customer.getEncodedPassword())) {
+ encodedPassword = customer.getEncodedPassword();
+ //customer.setClearPassword("");
+ }
+
+ cust.setPassword(encodedPassword);
+
+ return cust;
+
+ }
+
+ private void notifyNewCustomer(PersistableCustomer customer, MerchantStore store, Language lang) throws Exception {
+
+
+ Locale customerLocale = LocaleUtils.getLocale(lang);
+ emailTemplatesUtils.sendRegistrationEmail(customer, store, customerLocale, (String)coreConfiguration.getProperty("SHOP_SCHEME"));
+
+
+ }
+
+
+ @Override
+ public void update(PersistableCustomer customer, MerchantStore store) throws Exception {
+
+
+ if(customer.getId() == null || customer.getId().longValue() == 0) {
+ throw new Exception("Can't update a customer with null id");
+ }
+
+ Customer cust = customerService.getById(customer.getId());
+
+
+ CustomerPopulator populator = new CustomerPopulator();
+ populator.setCountryService(countryService);
+ populator.setCustomerOptionService(customerOptionService);
+ populator.setCustomerOptionValueService(customerOptionValueService);
+ populator.setLanguageService(languageService);
+ populator.setLanguageService(languageService);
+ populator.setZoneService(zoneService);
+ populator.setGroupService(groupService);
+ populator.populate(customer, cust, store, store.getDefaultLanguage());
+
+
+ String password = customer.getClearPassword();
+ if(StringUtils.isBlank(password)) {
+ password = UserReset.generateRandomString();
+ customer.setClearPassword(password);
+ }
+
+ @SuppressWarnings("deprecation")
+ String encodedPassword = passwordEncoder.encode(password);
+ if(!StringUtils.isBlank(customer.getEncodedPassword())) {
+ encodedPassword = customer.getEncodedPassword();
+ customer.setClearPassword("");
+ }
+
+ customer.setEncodedPassword(encodedPassword);
+ customerService.save(cust);
+ customer.setId(cust.getId());
+
+
+ }
+
+
+ @Override
+ public void saveOrUpdateCustomerReview(PersistableCustomerReview review, MerchantStore store, Language language)
+ throws Exception {
+ CustomerReview rev = new CustomerReview();
+
+ PersistableCustomerReviewPopulator populator = new PersistableCustomerReviewPopulator();
+ populator.setCustomerService(customerService);
+ populator.setLanguageService(languageService);
+ populator.populate(review, rev, store, language);
+
+ customerReviewService.create(rev);
+
+ review.setId(rev.getId());
+
+ }
+
+
+ @Override
+ public List<ReadableCustomerReview> getAllCustomerReviewsByReviewed(Customer customer, MerchantStore store,
+ Language language) throws Exception {
+ Validate.notNull(customer,"Reviewed customer cannot be null");
+
+ List<CustomerReview> reviews = customerReviewService.getByReviewedCustomer(customer);
+
+ ReadableCustomerReviewPopulator populator = new ReadableCustomerReviewPopulator();
+
+
+ List<ReadableCustomerReview> customerReviews = new ArrayList<ReadableCustomerReview>();
+
+ for(CustomerReview review : reviews) {
+ ReadableCustomerReview readableReview = new ReadableCustomerReview();
+ populator.populate(review, readableReview, store, language);
+ customerReviews.add(readableReview);
+ }
+
+
+
+ return customerReviews;
+ }
+
+
+ @Override
+ public void deleteCustomerReview(CustomerReview review, MerchantStore store, Language language) throws Exception {
+ customerReviewService.delete(review);
+
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/error/ErrorController.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/error/ErrorController.java
index cdbd5c3..3de9985 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/error/ErrorController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/error/ErrorController.java
@@ -1,16 +1,24 @@
package com.salesmanager.shop.store.controller.error;
+import java.util.HashMap;
+import java.util.Map;
+
import org.jopendocument.util.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.ModelAndView;
-import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
@ControllerAdvice
public class ErrorController {
@@ -18,7 +26,24 @@ public class ErrorController {
private static final Logger LOGGER = LoggerFactory.getLogger(ErrorController.class);
-
+ /**
+ * For API exceptions
+ * @param ex
+ * @return
+ */
+ @ExceptionHandler({org.springframework.web.HttpRequestMethodNotSupportedException.class,org.springframework.web.bind.MethodArgumentNotValidException.class})
+ @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
+ public Map<String,String> handleAPIException(Exception ex, WebRequest request) {
+
+
+ Map<String,String> error = new HashMap<String,String>();
+ error.put("error", ex.getMessage());
+
+
+
+ return error;
+
+ }
@ExceptionHandler(Exception.class)
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
@@ -45,6 +70,8 @@ public class ErrorController {
}
+
+
@ExceptionHandler(RuntimeException.class)
@ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR)
public ModelAndView handleRuntimeException(Exception ex) {
@@ -65,6 +92,24 @@ public class ErrorController {
}
+ /**
+ * Generic exception catch allpage
+ * @param ex
+ * @return
+ */
+ @RequestMapping(value="/error", method=RequestMethod.GET)
+ public ModelAndView handleCatchAllException(Model model) {
+
+
+ ModelAndView modelAndView = null;
+
+
+ modelAndView = new ModelAndView("error/generic_error");
+
+ return modelAndView;
+
+ }
+
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/items/facade/ProductItemsFacade.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/items/facade/ProductItemsFacade.java
index 5b43b4d..b0ae943 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/items/facade/ProductItemsFacade.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/items/facade/ProductItemsFacade.java
@@ -2,6 +2,7 @@ package com.salesmanager.shop.store.controller.items.facade;
import java.util.List;
+import com.salesmanager.core.model.catalog.product.Product;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.reference.language.Language;
import com.salesmanager.shop.model.catalog.product.ReadableProductList;
@@ -28,4 +29,39 @@ public interface ProductItemsFacade {
*/
ReadableProductList listItemsByIds(MerchantStore store, Language language, List<Long> ids, int startCount, int maxCount) throws Exception;
+
+ /**
+ * List products created in a group, for instance FEATURED group
+ * @param group
+ * @param store
+ * @param language
+ * @return
+ * @throws Exception
+ */
+ ReadableProductList listItemsByGroup(String group, MerchantStore store, Language language) throws Exception;
+
+ /**
+ * Add product to a group
+ * @param product
+ * @param group
+ * @param store
+ * @param language
+ * @return
+ * @throws Exception
+ */
+ ReadableProductList addItemToGroup(Product product, String group, MerchantStore store, Language language) throws Exception;
+
+ /**
+ * Removes a product from a group
+ * @param product
+ * @param group
+ * @param store
+ * @param language
+ * @return
+ * @throws Exception
+ */
+ ReadableProductList removeItemFromGroup(Product product, String group, MerchantStore store, Language language) throws Exception;
+
+
+
}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/items/facade/ProductItemsFacadeImpl.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/items/facade/ProductItemsFacadeImpl.java
index 46e44b9..ec18e1b 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/items/facade/ProductItemsFacadeImpl.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/items/facade/ProductItemsFacadeImpl.java
@@ -1,21 +1,27 @@
package com.salesmanager.shop.store.controller.items.facade;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.Validate;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
+
import com.salesmanager.core.business.services.catalog.product.PricingService;
import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.relationship.ProductRelationshipService;
import com.salesmanager.core.model.catalog.product.Product;
import com.salesmanager.core.model.catalog.product.ProductCriteria;
+import com.salesmanager.core.model.catalog.product.relationship.ProductRelationship;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.reference.language.Language;
import com.salesmanager.shop.model.catalog.product.ReadableProduct;
import com.salesmanager.shop.model.catalog.product.ReadableProductList;
import com.salesmanager.shop.populator.catalog.ReadableProductPopulator;
import com.salesmanager.shop.utils.ImageFilePath;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-import javax.inject.Inject;
@Component
public class ProductItemsFacadeImpl implements ProductItemsFacade {
@@ -30,6 +36,9 @@ public class ProductItemsFacadeImpl implements ProductItemsFacade {
@Inject
@Qualifier("img")
private ImageFilePath imageUtils;
+
+ @Inject
+ private ProductRelationshipService productRelationshipService;
@Override
public ReadableProductList listItemsByManufacturer(MerchantStore store,
@@ -69,6 +78,10 @@ public class ProductItemsFacadeImpl implements ProductItemsFacade {
public ReadableProductList listItemsByIds(MerchantStore store, Language language, List<Long> ids, int startCount,
int maxCount) throws Exception {
+ if(CollectionUtils.isEmpty(ids)) {
+ return new ReadableProductList();
+ }
+
ProductCriteria productCriteria = new ProductCriteria();
productCriteria.setMaxCount(maxCount);
@@ -99,4 +112,63 @@ public class ProductItemsFacadeImpl implements ProductItemsFacade {
return productList;
}
+ @Override
+ public ReadableProductList listItemsByGroup(String group, MerchantStore store, Language language) throws Exception {
+
+
+ //get product group
+ List<ProductRelationship> groups = productRelationshipService.getByGroup(store, group, language);
+
+ if(group!=null) {
+ List<Long> ids = new ArrayList<Long>();
+ for(ProductRelationship relationship : groups) {
+ Product product = relationship.getRelatedProduct();
+ ids.add(product.getId());
+ }
+
+ ReadableProductList list = listItemsByIds(store, language, ids, 0, 0);
+ return list;
+ }
+
+ return null;
+ }
+
+ @Override
+ public ReadableProductList addItemToGroup(Product product, String group, MerchantStore store, Language language)
+ throws Exception {
+
+ Validate.notNull(product,"Product muust not be null");
+ Validate.notNull(group,"group must not be null");
+
+ ProductRelationship relationship = new ProductRelationship();
+ relationship.setActive(true);
+ relationship.setCode(group);
+ relationship.setStore(store);
+ relationship.setRelatedProduct(product);
+
+ productRelationshipService.saveOrUpdate(relationship);
+
+
+ return listItemsByGroup(group,store,language);
+ }
+
+ @Override
+ public ReadableProductList removeItemFromGroup(Product product, String group, MerchantStore store,
+ Language language) throws Exception {
+
+ ProductRelationship relationship = null;
+ List<ProductRelationship> relationships = productRelationshipService.getByGroup(store, group);
+
+ for(ProductRelationship r : relationships) {
+ if(r.getRelatedProduct().getId().longValue()==product.getId().longValue()) {
+ relationship = r;
+ break;
+ }
+ }
+
+ productRelationshipService.delete(relationship);
+
+ return listItemsByGroup(group,store,language);
+ }
+
}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/LandingController.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/LandingController.java
index 6bdfb3b..84fc719 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/LandingController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/LandingController.java
@@ -1,173 +1,174 @@
-package com.salesmanager.shop.store.controller;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-
-import com.salesmanager.core.business.services.catalog.product.PricingService;
-import com.salesmanager.core.business.services.catalog.product.relationship.ProductRelationshipService;
-import com.salesmanager.core.business.services.content.ContentService;
-import com.salesmanager.core.business.services.merchant.MerchantStoreService;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.relationship.ProductRelationship;
-import com.salesmanager.core.model.catalog.product.relationship.ProductRelationshipType;
-import com.salesmanager.core.model.content.Content;
-import com.salesmanager.core.model.content.ContentDescription;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.model.catalog.product.ReadableProduct;
-import com.salesmanager.shop.model.shop.Breadcrumb;
-import com.salesmanager.shop.model.shop.BreadcrumbItem;
-import com.salesmanager.shop.model.shop.BreadcrumbItemType;
-import com.salesmanager.shop.model.shop.PageInformation;
-import com.salesmanager.shop.populator.catalog.ReadableProductPopulator;
-import com.salesmanager.shop.utils.ImageFilePath;
-import com.salesmanager.shop.utils.LabelUtils;
-
-
-
-@Controller
-public class LandingController {
-
-
- private final static String LANDING_PAGE = "LANDING_PAGE";
-
-
- @Inject
- private ContentService contentService;
-
- @Inject
- private ProductRelationshipService productRelationshipService;
-
-
- @Inject
- private LabelUtils messages;
-
- @Inject
- private PricingService pricingService;
-
- @Inject
- private MerchantStoreService merchantService;
-
- @Inject
- @Qualifier("img")
- private ImageFilePath imageUtils;
-
- private static final Logger LOGGER = LoggerFactory.getLogger(LandingController.class);
- private final static String HOME_LINK_CODE="HOME";
-
- @RequestMapping(value={Constants.SHOP_URI + "/home.html",Constants.SHOP_URI +"/", Constants.SHOP_URI}, method=RequestMethod.GET)
- public String displayLanding(Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- Language language = (Language)request.getAttribute(Constants.LANGUAGE);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
-
- request.setAttribute(Constants.LINK_CODE, HOME_LINK_CODE);
-
- Content content = contentService.getByCode(LANDING_PAGE, store, language);
-
- /** Rebuild breadcrumb **/
- BreadcrumbItem item = new BreadcrumbItem();
- item.setItemType(BreadcrumbItemType.HOME);
- item.setLabel(messages.getMessage(Constants.HOME_MENU_KEY, locale));
- item.setUrl(Constants.HOME_URL);
-
-
- Breadcrumb breadCrumb = new Breadcrumb();
- breadCrumb.setLanguage(language);
-
- List<BreadcrumbItem> items = new ArrayList<BreadcrumbItem>();
- items.add(item);
-
- breadCrumb.setBreadCrumbs(items);
- request.getSession().setAttribute(Constants.BREADCRUMB, breadCrumb);
- request.setAttribute(Constants.BREADCRUMB, breadCrumb);
- /** **/
-
- if(content!=null) {
-
- ContentDescription description = content.getDescription();
-
-
- model.addAttribute("page",description);
-
-
- PageInformation pageInformation = new PageInformation();
- pageInformation.setPageTitle(description.getName());
- pageInformation.setPageDescription(description.getMetatagDescription());
- pageInformation.setPageKeywords(description.getMetatagKeywords());
-
- request.setAttribute(Constants.REQUEST_PAGE_INFORMATION, pageInformation);
-
- }
-
- ReadableProductPopulator populator = new ReadableProductPopulator();
- populator.setPricingService(pricingService);
- populator.setimageUtils(imageUtils);
-
-
- //featured items
- List<ProductRelationship> relationships = productRelationshipService.getByType(store, ProductRelationshipType.FEATURED_ITEM, language);
- List<ReadableProduct> featuredItems = new ArrayList<ReadableProduct>();
- for(ProductRelationship relationship : relationships) {
-
- Product product = relationship.getRelatedProduct();
- ReadableProduct proxyProduct = populator.populate(product, new ReadableProduct(), store, language);
-
- featuredItems.add(proxyProduct);
- }
-
-
- model.addAttribute("featuredItems", featuredItems);
-
- /** template **/
- StringBuilder template = new StringBuilder().append("landing.").append(store.getStoreTemplate());
- return template.toString();
- }
-
- @RequestMapping(value={Constants.SHOP_URI + "/stub.html"}, method=RequestMethod.GET)
- public String displayHomeStub(Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
- return "index";
- }
-
- @RequestMapping( value=Constants.SHOP_URI + "/{store}", method=RequestMethod.GET)
- public String displayStoreLanding(@PathVariable final String store, HttpServletRequest request, HttpServletResponse response) {
-
- try {
-
- request.getSession().invalidate();
- request.getSession().removeAttribute(Constants.MERCHANT_STORE);
-
- MerchantStore merchantStore = merchantService.getByCode(store);
- if(merchantStore!=null) {
- request.getSession().setAttribute(Constants.MERCHANT_STORE, merchantStore);
- } else {
- LOGGER.error("MerchantStore does not exist for store code " + store);
- }
-
- } catch(Exception e) {
- LOGGER.error("Error occured while getting store code " + store, e);
- }
-
-
-
- return "redirect:" + Constants.SHOP_URI;
- }
-
-
-}
+package com.salesmanager.shop.store.controller;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.catalog.product.relationship.ProductRelationshipService;
+import com.salesmanager.core.business.services.content.ContentService;
+import com.salesmanager.core.business.services.merchant.MerchantStoreService;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.relationship.ProductRelationship;
+import com.salesmanager.core.model.catalog.product.relationship.ProductRelationshipType;
+import com.salesmanager.core.model.content.Content;
+import com.salesmanager.core.model.content.ContentDescription;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.model.catalog.product.ReadableProduct;
+import com.salesmanager.shop.model.shop.Breadcrumb;
+import com.salesmanager.shop.model.shop.BreadcrumbItem;
+import com.salesmanager.shop.model.shop.BreadcrumbItemType;
+import com.salesmanager.shop.model.shop.PageInformation;
+import com.salesmanager.shop.populator.catalog.ReadableProductPopulator;
+import com.salesmanager.shop.utils.DateUtil;
+import com.salesmanager.shop.utils.ImageFilePath;
+import com.salesmanager.shop.utils.LabelUtils;
+
+
+
+@Controller
+public class LandingController {
+
+
+ private final static String LANDING_PAGE = "LANDING_PAGE";
+
+
+ @Inject
+ private ContentService contentService;
+
+ @Inject
+ private ProductRelationshipService productRelationshipService;
+
+
+ @Inject
+ private LabelUtils messages;
+
+ @Inject
+ private PricingService pricingService;
+
+ @Inject
+ private MerchantStoreService merchantService;
+
+ @Inject
+ @Qualifier("img")
+ private ImageFilePath imageUtils;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(LandingController.class);
+ private final static String HOME_LINK_CODE="HOME";
+
+ @RequestMapping(value={Constants.SHOP_URI + "/home.html",Constants.SHOP_URI +"/", Constants.SHOP_URI}, method=RequestMethod.GET)
+ public String displayLanding(Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ Language language = (Language)request.getAttribute(Constants.LANGUAGE);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+
+ request.setAttribute(Constants.LINK_CODE, HOME_LINK_CODE);
+
+ Content content = contentService.getByCode(LANDING_PAGE, store, language);
+
+ /** Rebuild breadcrumb **/
+ BreadcrumbItem item = new BreadcrumbItem();
+ item.setItemType(BreadcrumbItemType.HOME);
+ item.setLabel(messages.getMessage(Constants.HOME_MENU_KEY, locale));
+ item.setUrl(Constants.HOME_URL);
+
+
+ Breadcrumb breadCrumb = new Breadcrumb();
+ breadCrumb.setLanguage(language);
+
+ List<BreadcrumbItem> items = new ArrayList<BreadcrumbItem>();
+ items.add(item);
+
+ breadCrumb.setBreadCrumbs(items);
+ request.getSession().setAttribute(Constants.BREADCRUMB, breadCrumb);
+ request.setAttribute(Constants.BREADCRUMB, breadCrumb);
+ /** **/
+
+ if(content!=null) {
+
+ ContentDescription description = content.getDescription();
+
+ model.addAttribute("page",description);
+
+ PageInformation pageInformation = new PageInformation();
+ pageInformation.setPageTitle(description.getName());
+ pageInformation.setPageDescription(description.getMetatagDescription());
+ pageInformation.setPageKeywords(description.getMetatagKeywords());
+
+ request.setAttribute(Constants.REQUEST_PAGE_INFORMATION, pageInformation);
+
+ }
+
+ ReadableProductPopulator populator = new ReadableProductPopulator();
+ populator.setPricingService(pricingService);
+ populator.setimageUtils(imageUtils);
+
+
+ //featured items
+ List<ProductRelationship> relationships = productRelationshipService.getByType(store, ProductRelationshipType.FEATURED_ITEM, language);
+ List<ReadableProduct> featuredItems = new ArrayList<ReadableProduct>();
+ Date today = new Date();
+ for(ProductRelationship relationship : relationships) {
+ Product product = relationship.getRelatedProduct();
+ if(product.isAvailable() && DateUtil.dateBeforeEqualsDate(product.getDateAvailable(), today)) {
+ ReadableProduct proxyProduct = populator.populate(product, new ReadableProduct(), store, language);
+ featuredItems.add(proxyProduct);
+ }
+ }
+
+
+ model.addAttribute("featuredItems", featuredItems);
+
+ /** template **/
+ StringBuilder template = new StringBuilder().append("landing.").append(store.getStoreTemplate());
+ return template.toString();
+ }
+
+ @RequestMapping(value={Constants.SHOP_URI + "/stub.html"}, method=RequestMethod.GET)
+ public String displayHomeStub(Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+ return "index";
+ }
+
+ @RequestMapping( value=Constants.SHOP_URI + "/{store}", method=RequestMethod.GET)
+ public String displayStoreLanding(@PathVariable final String store, HttpServletRequest request, HttpServletResponse response) {
+
+ try {
+
+ request.getSession().invalidate();
+ request.getSession().removeAttribute(Constants.MERCHANT_STORE);
+
+ MerchantStore merchantStore = merchantService.getByCode(store);
+ if(merchantStore!=null) {
+ request.getSession().setAttribute(Constants.MERCHANT_STORE, merchantStore);
+ } else {
+ LOGGER.error("MerchantStore does not exist for store code " + store);
+ }
+
+ } catch(Exception e) {
+ LOGGER.error("Error occured while getting store code " + store, e);
+ }
+
+
+
+ return "redirect:" + Constants.SHOP_URI;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/facade/OrderFacade.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/facade/OrderFacade.java
index 4eccd84..bdc494d 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/facade/OrderFacade.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/facade/OrderFacade.java
@@ -1,109 +1,154 @@
-package com.salesmanager.shop.store.controller.order.facade;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.Order;
-import com.salesmanager.core.model.order.OrderTotalSummary;
-import com.salesmanager.core.model.payments.Transaction;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.shipping.ShippingQuote;
-import com.salesmanager.core.model.shipping.ShippingSummary;
-import com.salesmanager.core.model.shoppingcart.ShoppingCart;
-import com.salesmanager.shop.model.customer.PersistableCustomer;
-import com.salesmanager.shop.model.order.PersistableOrder;
-import com.salesmanager.shop.model.order.ReadableOrder;
-import com.salesmanager.shop.model.order.ReadableOrderList;
-import com.salesmanager.shop.model.order.ShopOrder;
-import org.springframework.validation.BindingResult;
-
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-
-public interface OrderFacade {
-
- ShopOrder initializeOrder(MerchantStore store, Customer customer, ShoppingCart shoppingCart, Language language) throws Exception;
- void refreshOrder(ShopOrder order, MerchantStore store, Customer customer, ShoppingCart shoppingCart, Language language) throws Exception;
- /** used in website **/
- OrderTotalSummary calculateOrderTotal(MerchantStore store, ShopOrder order, Language language) throws Exception;
- /** used in the API **/
- OrderTotalSummary calculateOrderTotal(MerchantStore store, PersistableOrder order, Language language) throws Exception;
-
- /** process a valid order **/
- Order processOrder(ShopOrder order, Customer customer, MerchantStore store, Language language) throws ServiceException;
- /** process a valid order against an initial transaction **/
- Order processOrder(ShopOrder order, Customer customer, Transaction transaction, MerchantStore store, Language language) throws ServiceException;
-
- /** creates a working copy of customer when the user is anonymous **/
- Customer initEmptyCustomer(MerchantStore store);
- List<Country> getShipToCountry(MerchantStore store, Language language)
- throws Exception;
-
- /**
- * Get a ShippingQuote based on merchant configuration and items to be shipped
- * @param cart
- * @param order
- * @param store
- * @param language
- * @return
- * @throws Exception
- */
- ShippingQuote getShippingQuote(PersistableCustomer customer, ShoppingCart cart, ShopOrder order,
- MerchantStore store, Language language) throws Exception;
-
- ShippingQuote getShippingQuote(Customer customer, ShoppingCart cart, PersistableOrder order,
- MerchantStore store, Language language) throws Exception;
-
- /**
- * Creates a ShippingSummary object for OrderTotal calculation based on a ShippingQuote
- * @param quote
- * @param store
- * @param language
- * @return
- */
- ShippingSummary getShippingSummary(ShippingQuote quote, MerchantStore store, Language language);
- void validateOrder(ShopOrder order, BindingResult bindingResult,
- Map<String, String> messagesResult, MerchantStore store,
- Locale locale) throws ServiceException;
-
- /**
- * Creates a ReadableOrder object from an orderId
- * @param orderId
- * @param store
- * @param language
- * @return
- * @throws Exception
- */
- ReadableOrder getReadableOrder(Long orderId, MerchantStore store, Language language) throws Exception;
-
-
- /**
- * <p>Method used to fetch all orders associated with customer customer.
- * It will used current customer ID to fetch all orders which has been
- * placed by customer for current store.</p>
- *
- * @param customer currently logged in customer
- * @param store store associated with current customer
- * @return ReadableOrderList
- * @throws Exception
- */
-
- ReadableOrderList getReadableOrderList(MerchantStore store, Customer customer, int start,
- int maxCount, Language language) throws Exception;
-
-
- /**
- * Get orders for a given store
- * @param store
- * @param start
- * @param maxCount
- * @param language
- * @return
- * @throws Exception
- */
- ReadableOrderList getReadableOrderList(MerchantStore store, int start,
- int maxCount, Language language) throws Exception;
-}
+package com.salesmanager.shop.store.controller.order.facade;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import org.springframework.validation.BindingResult;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.order.OrderTotalSummary;
+import com.salesmanager.core.model.payments.Transaction;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.shipping.ShippingQuote;
+import com.salesmanager.core.model.shipping.ShippingSummary;
+import com.salesmanager.core.model.shoppingcart.ShoppingCart;
+import com.salesmanager.shop.model.customer.PersistableCustomer;
+import com.salesmanager.shop.model.order.PersistableOrder;
+import com.salesmanager.shop.model.order.PersistableOrderApi;
+import com.salesmanager.shop.model.order.ReadableOrder;
+import com.salesmanager.shop.model.order.ReadableOrderList;
+import com.salesmanager.shop.model.order.ShopOrder;
+import com.salesmanager.shop.model.order.transaction.ReadableTransaction;
+
+
+public interface OrderFacade {
+
+ ShopOrder initializeOrder(MerchantStore store, Customer customer, ShoppingCart shoppingCart, Language language) throws Exception;
+ void refreshOrder(ShopOrder order, MerchantStore store, Customer customer, ShoppingCart shoppingCart, Language language) throws Exception;
+ /** used in website **/
+ OrderTotalSummary calculateOrderTotal(MerchantStore store, ShopOrder order, Language language) throws Exception;
+ /** used in the API **/
+ OrderTotalSummary calculateOrderTotal(MerchantStore store, PersistableOrder order, Language language) throws Exception;
+
+ /** process a valid order **/
+ Order processOrder(ShopOrder order, Customer customer, MerchantStore store, Language language) throws ServiceException;
+ /** process a valid order against an initial transaction **/
+ Order processOrder(ShopOrder order, Customer customer, Transaction transaction, MerchantStore store, Language language) throws ServiceException;
+ /** process a valid order submitted from the API **/
+ Order processOrder(PersistableOrderApi order, Customer customer, MerchantStore store, Language language, Locale locale) throws ServiceException;
+
+
+
+ /** creates a working copy of customer when the user is anonymous **/
+ Customer initEmptyCustomer(MerchantStore store);
+ List<Country> getShipToCountry(MerchantStore store, Language language)
+ throws Exception;
+
+ /**
+ * Get a ShippingQuote based on merchant configuration and items to be shipped
+ * @param cart
+ * @param order
+ * @param store
+ * @param language
+ * @return
+ * @throws Exception
+ */
+ ShippingQuote getShippingQuote(PersistableCustomer customer, ShoppingCart cart, ShopOrder order,
+ MerchantStore store, Language language) throws Exception;
+
+ ShippingQuote getShippingQuote(Customer customer, ShoppingCart cart, PersistableOrder order,
+ MerchantStore store, Language language) throws Exception;
+
+ ShippingQuote getShippingQuote(Customer customer, ShoppingCart cart,
+ MerchantStore store, Language language) throws Exception;
+
+ /**
+ * Creates a ShippingSummary object for OrderTotal calculation based on a ShippingQuote
+ * @param quote
+ * @param store
+ * @param language
+ * @return
+ */
+ ShippingSummary getShippingSummary(ShippingQuote quote, MerchantStore store, Language language);
+
+ /**
+ * Validates an order submitted from the web application
+ * @param order
+ * @param bindingResult
+ * @param messagesResult
+ * @param store
+ * @param locale
+ * @throws ServiceException
+ */
+ void validateOrder(ShopOrder order, BindingResult bindingResult,
+ Map<String, String> messagesResult, MerchantStore store,
+ Locale locale) throws ServiceException;
+
+ /**
+ * Creates a ReadableOrder object from an orderId
+ * @param orderId
+ * @param store
+ * @param language
+ * @return
+ * @throws Exception
+ */
+ ReadableOrder getReadableOrder(Long orderId, MerchantStore store, Language language) throws Exception;
+
+
+ /**
+ * <p>Method used to fetch all orders associated with customer customer.
+ * It will used current customer ID to fetch all orders which has been
+ * placed by customer for current store.</p>
+ *
+ * @param customer currently logged in customer
+ * @param store store associated with current customer
+ * @return ReadableOrderList
+ * @throws Exception
+ */
+
+ ReadableOrderList getReadableOrderList(MerchantStore store, Customer customer, int start,
+ int maxCount, Language language) throws Exception;
+
+
+ /**
+ * Get a list of Order on which payment capture must be done
+ * @param store
+ * @param startDate
+ * @param endDate
+ * @param language
+ * @return
+ * @throws Exception
+ */
+ ReadableOrderList getCapturableOrderList(MerchantStore store, Date startDate, Date endDate,
+ Language language) throws Exception;
+
+ /**
+ * Capture a pre-authorized transaction. Candidate order ids can be obtained from
+ * getCapturableOrderList
+ * @param store
+ * @param order
+ * @param customer
+ * @return
+ * @throws Exception
+ */
+ ReadableTransaction captureOrder(MerchantStore store, Order order, Customer customer, Language language) throws Exception;
+
+
+ /**
+ * Get orders for a given store
+ * @param store
+ * @param start
+ * @param maxCount
+ * @param language
+ * @return
+ * @throws Exception
+ */
+ ReadableOrderList getReadableOrderList(MerchantStore store, int start,
+ int maxCount, Language language) throws Exception;
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/facade/OrderFacadeImpl.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/facade/OrderFacadeImpl.java
index 9ece227..a7fe1a0 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/facade/OrderFacadeImpl.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/facade/OrderFacadeImpl.java
@@ -1,966 +1,1299 @@
-package com.salesmanager.shop.store.controller.order.facade;
-
-import com.salesmanager.core.business.exception.ConversionException;
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.catalog.product.PricingService;
-import com.salesmanager.core.business.services.catalog.product.ProductService;
-import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
-import com.salesmanager.core.business.services.catalog.product.file.DigitalProductService;
-import com.salesmanager.core.business.services.customer.CustomerService;
-import com.salesmanager.core.business.services.customer.attribute.CustomerOptionService;
-import com.salesmanager.core.business.services.customer.attribute.CustomerOptionValueService;
-import com.salesmanager.core.business.services.order.OrderService;
-import com.salesmanager.core.business.services.reference.country.CountryService;
-import com.salesmanager.core.business.services.reference.language.LanguageService;
-import com.salesmanager.core.business.services.reference.zone.ZoneService;
-import com.salesmanager.core.business.services.shipping.ShippingService;
-import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
-import com.salesmanager.core.business.utils.CreditCardUtils;
-import com.salesmanager.core.model.common.Billing;
-import com.salesmanager.core.model.common.Delivery;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.Order;
-import com.salesmanager.core.model.order.*;
-import com.salesmanager.core.model.order.orderproduct.OrderProduct;
-import com.salesmanager.core.model.order.orderstatus.OrderStatus;
-import com.salesmanager.core.model.order.payment.CreditCard;
-import com.salesmanager.core.model.payments.*;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.shipping.ShippingProduct;
-import com.salesmanager.core.model.shipping.ShippingQuote;
-import com.salesmanager.core.model.shipping.ShippingSummary;
-import com.salesmanager.core.model.shoppingcart.ShoppingCart;
-import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
-import com.salesmanager.shop.model.customer.Address;
-import com.salesmanager.shop.model.customer.PersistableCustomer;
-import com.salesmanager.shop.model.customer.ReadableCustomer;
-import com.salesmanager.shop.model.order.*;
-import com.salesmanager.shop.model.order.OrderTotal;
-import com.salesmanager.shop.populator.customer.CustomerPopulator;
-import com.salesmanager.shop.populator.customer.PersistableCustomerPopulator;
-import com.salesmanager.shop.populator.order.OrderProductPopulator;
-import com.salesmanager.shop.populator.order.ReadableOrderPopulator;
-import com.salesmanager.shop.populator.order.ReadableOrderProductPopulator;
-import com.salesmanager.shop.populator.order.ShoppingCartItemPopulator;
-import com.salesmanager.shop.store.controller.customer.facade.CustomerFacade;
-import com.salesmanager.shop.utils.ImageFilePath;
-import com.salesmanager.shop.utils.LabelUtils;
-import com.salesmanager.shop.utils.LocaleUtils;
-
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.Validate;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.stereotype.Service;
-import org.springframework.validation.BindingResult;
-import org.springframework.validation.FieldError;
-import org.springframework.validation.ObjectError;
-
-import javax.inject.Inject;
-import java.util.*;
-
-@Service("orderFacade")
-public class OrderFacadeImpl implements OrderFacade {
-
- private static final Logger LOGGER = LoggerFactory
- .getLogger(OrderFacadeImpl.class);
-
-
- @Inject
- private OrderService orderService;
- @Inject
- private ProductService productService;
- @Inject
- private ProductAttributeService productAttributeService;
- @Inject
- private ShoppingCartService shoppingCartService;
- @Inject
- private DigitalProductService digitalProductService;
- @Inject
- private CustomerService customerService;
- @Inject
- private CountryService countryService;
- @Inject
- private ZoneService zoneService;
- @Inject
- private CustomerOptionService customerOptionService;
- @Inject
- private CustomerOptionValueService customerOptionValueService;
- @Inject
- private LanguageService languageService;
- @Inject
- private ShippingService shippingService;
- @Inject
- private CustomerFacade customerFacade;
- @Inject
- private PricingService pricingService;
-
-
- @Inject
- private LabelUtils messages;
-
- @Inject
- @Qualifier("img")
- private ImageFilePath imageUtils;
-
-
- @Override
- public ShopOrder initializeOrder(MerchantStore store, Customer customer,
- ShoppingCart shoppingCart, Language language) throws Exception {
-
- // assert not null shopping cart items
-
- ShopOrder order = new ShopOrder();
-
- OrderStatus orderStatus = OrderStatus.ORDERED;
- order.setOrderStatus(orderStatus);
-
- if(customer==null) {
- customer = this.initEmptyCustomer(store);
- }
-
- PersistableCustomer persistableCustomer = persistableCustomer(customer, store, language);
- order.setCustomer(persistableCustomer);
-
- //keep list of shopping cart items for core price calculation
- List<ShoppingCartItem> items = new ArrayList<ShoppingCartItem>(shoppingCart.getLineItems());
- order.setShoppingCartItems(items);
-
- return order;
- }
-
-
-
- @Override
- public OrderTotalSummary calculateOrderTotal(MerchantStore store,
- ShopOrder order, Language language) throws Exception {
-
-
- Customer customer = customerFacade.getCustomerModel(order.getCustomer(), store, language);
- OrderTotalSummary summary = this.calculateOrderTotal(store, customer, order, language);
- this.setOrderTotals(order, summary);
- return summary;
- }
-
- @Override
- public OrderTotalSummary calculateOrderTotal(MerchantStore store,
- PersistableOrder order, Language language) throws Exception {
-
- List<PersistableOrderProduct> orderProducts = order.getOrderProductItems();
-
- ShoppingCartItemPopulator populator = new ShoppingCartItemPopulator();
- populator.setProductAttributeService(productAttributeService);
- populator.setProductService(productService);
- populator.setShoppingCartService(shoppingCartService);
-
- List<ShoppingCartItem> items = new ArrayList<ShoppingCartItem>();
- for(PersistableOrderProduct orderProduct : orderProducts) {
- ShoppingCartItem item = populator.populate(orderProduct, new ShoppingCartItem(), store, language);
- items.add(item);
- }
-
-
- Customer customer = customer(order.getCustomer(), store, language);
-
- OrderTotalSummary summary = this.calculateOrderTotal(store, customer, order, language);
-
- return summary;
- }
-
- private OrderTotalSummary calculateOrderTotal(MerchantStore store, Customer customer, PersistableOrder order, Language language) throws Exception {
-
- OrderTotalSummary orderTotalSummary = null;
-
- OrderSummary summary = new OrderSummary();
-
-
- if(order instanceof ShopOrder) {
- ShopOrder o = (ShopOrder)order;
- summary.setProducts(o.getShoppingCartItems());
-
- if(o.getShippingSummary()!=null) {
- summary.setShippingSummary(o.getShippingSummary());
- }
- orderTotalSummary = orderService.caculateOrderTotal(summary, customer, store, language);
- } else {
- //need Set of ShoppingCartItem
- //PersistableOrder not implemented
- throw new Exception("calculateOrderTotal not yet implemented for PersistableOrder");
- }
-
- return orderTotalSummary;
-
- }
-
-
- private PersistableCustomer persistableCustomer(Customer customer, MerchantStore store, Language language) throws Exception {
-
- PersistableCustomerPopulator customerPopulator = new PersistableCustomerPopulator();
- PersistableCustomer persistableCustomer = customerPopulator.populate(customer, new PersistableCustomer(), store, language);
- return persistableCustomer;
-
- }
-
- private Customer customer(PersistableCustomer customer, MerchantStore store, Language language) throws Exception {
- CustomerPopulator customerPopulator = new CustomerPopulator();
- Customer cust = customerPopulator.populate(customer, new Customer(), store, language);
- return cust;
-
- }
-
- private void setOrderTotals(OrderEntity order, OrderTotalSummary summary) {
-
- List<OrderTotal> totals = new ArrayList<OrderTotal>();
- List<com.salesmanager.core.model.order.OrderTotal> orderTotals = summary.getTotals();
- for(com.salesmanager.core.model.order.OrderTotal t : orderTotals) {
- OrderTotal total = new OrderTotal();
- total.setCode(t.getOrderTotalCode());
- total.setTitle(t.getTitle());
- total.setValue(t.getValue());
- totals.add(total);
- }
-
- order.setTotals(totals);
-
- }
-
-
- /**
- * Submitted object must be valided prior to the invocation of this method
- */
- @Override
- public Order processOrder(ShopOrder order, Customer customer, MerchantStore store,
- Language language) throws ServiceException {
-
- return this.processOrderModel(order, customer, null, store, language);
-
- }
-
- @Override
- public Order processOrder(ShopOrder order, Customer customer, Transaction transaction, MerchantStore store,
- Language language) throws ServiceException {
-
- return this.processOrderModel(order, customer, transaction, store, language);
-
- }
-
- private Order processOrderModel(ShopOrder order, Customer customer, Transaction transaction, MerchantStore store,
- Language language) throws ServiceException {
-
- try {
-
- if(order.isShipToBillingAdress()) {//customer shipping is billing
- PersistableCustomer orderCustomer = order.getCustomer();
- Address billing = orderCustomer.getBilling();
- orderCustomer.setDelivery(billing);
- }
-
-
-
-
- Order modelOrder = new Order();
- modelOrder.setDatePurchased(new Date());
- modelOrder.setBilling(customer.getBilling());
- modelOrder.setDelivery(customer.getDelivery());
- modelOrder.setPaymentModuleCode(order.getPaymentModule());
- modelOrder.setPaymentType(PaymentType.valueOf(order.getPaymentMethodType()));
- modelOrder.setShippingModuleCode(order.getShippingModule());
- modelOrder.setCustomerAgreement(order.isCustomerAgreed());
- modelOrder.setLocale(LocaleUtils.getLocale(store));//set the store locale based on the country for order $ formatting
-
- List<ShoppingCartItem> shoppingCartItems = order.getShoppingCartItems();
- Set<OrderProduct> orderProducts = new LinkedHashSet<OrderProduct>();
-
- OrderProductPopulator orderProductPopulator = new OrderProductPopulator();
- orderProductPopulator.setDigitalProductService(digitalProductService);
- orderProductPopulator.setProductAttributeService(productAttributeService);
- orderProductPopulator.setProductService(productService);
-
- for(ShoppingCartItem item : shoppingCartItems) {
- OrderProduct orderProduct = new OrderProduct();
- orderProduct = orderProductPopulator.populate(item, orderProduct , store, language);
- orderProduct.setOrder(modelOrder);
- orderProducts.add(orderProduct);
- }
-
- modelOrder.setOrderProducts(orderProducts);
-
- OrderTotalSummary summary = order.getOrderTotalSummary();
- List<com.salesmanager.core.model.order.OrderTotal> totals = summary.getTotals();
-
- //re-order totals
- Collections.sort(
- totals,
- new Comparator<com.salesmanager.core.model.order.OrderTotal>() {
- public int compare(com.salesmanager.core.model.order.OrderTotal x, com.salesmanager.core.model.order.OrderTotal y) {
- if(x.getSortOrder()==y.getSortOrder())
- return 0;
- return x.getSortOrder() < y.getSortOrder() ? -1 : 1;
- }
-
- });
-
- Set<com.salesmanager.core.model.order.OrderTotal> modelTotals = new LinkedHashSet<com.salesmanager.core.model.order.OrderTotal>();
- for(com.salesmanager.core.model.order.OrderTotal total : totals) {
- total.setOrder(modelOrder);
- modelTotals.add(total);
- }
-
- modelOrder.setOrderTotal(modelTotals);
- modelOrder.setTotal(order.getOrderTotalSummary().getTotal());
-
- //order misc objects
- modelOrder.setCurrency(store.getCurrency());
- modelOrder.setMerchant(store);
-
-
-
- //customer object
- orderCustomer(customer, modelOrder, language);
-
- //populate shipping information
- if(!StringUtils.isBlank(order.getShippingModule())) {
- modelOrder.setShippingModuleCode(order.getShippingModule());
- }
-
- String paymentType = order.getPaymentMethodType();
- Payment payment = new Payment();
- payment.setPaymentType(PaymentType.valueOf(paymentType));
- if(PaymentType.CREDITCARD.name().equals(paymentType)) {
-
-
-
- payment = new CreditCardPayment();
- ((CreditCardPayment)payment).setCardOwner(order.getPayment().get("creditcard_card_holder"));
- ((CreditCardPayment)payment).setCredidCardValidationNumber(order.getPayment().get("creditcard_card_cvv"));
- ((CreditCardPayment)payment).setCreditCardNumber(order.getPayment().get("creditcard_card_number"));
- ((CreditCardPayment)payment).setExpirationMonth(order.getPayment().get("creditcard_card_expirationmonth"));
- ((CreditCardPayment)payment).setExpirationYear(order.getPayment().get("creditcard_card_expirationyear"));
-
-
- Map<String,String> paymentMetaData = order.getPayment();
- payment.setPaymentMetaData(paymentMetaData);
-
-
-
- CreditCardType creditCardType =null;
- String cardType = order.getPayment().get("creditcard_card_type");
-
- if(cardType.equalsIgnoreCase(CreditCardType.AMEX.name())) {
- creditCardType = CreditCardType.AMEX;
- } else if(cardType.equalsIgnoreCase(CreditCardType.VISA.name())) {
- creditCardType = CreditCardType.VISA;
- } else if(cardType.equalsIgnoreCase(CreditCardType.MASTERCARD.name())) {
- creditCardType = CreditCardType.MASTERCARD;
- } else if(cardType.equalsIgnoreCase(CreditCardType.DINERS.name())) {
- creditCardType = CreditCardType.DINERS;
- } else if(cardType.equalsIgnoreCase(CreditCardType.DISCOVERY.name())) {
- creditCardType = CreditCardType.DISCOVERY;
- }
-
- ((CreditCardPayment)payment).setCreditCard(creditCardType);
-
- CreditCard cc = new CreditCard();
- cc.setCardType(creditCardType);
- cc.setCcCvv(((CreditCardPayment)payment).getCredidCardValidationNumber());
- cc.setCcOwner(((CreditCardPayment)payment).getCardOwner());
- cc.setCcExpires(((CreditCardPayment)payment).getExpirationMonth() + "-" + ((CreditCardPayment)payment).getExpirationYear());
-
- //hash credit card number
- String maskedNumber = CreditCardUtils.maskCardNumber(order.getPayment().get("creditcard_card_number"));
- cc.setCcNumber(maskedNumber);
- modelOrder.setCreditCard(cc);
-
-
- }
-
- if(PaymentType.PAYPAL.name().equals(paymentType)) {
-
- //check for previous transaction
- if(transaction==null) {
- throw new ServiceException("payment.error");
- }
-
- payment = new com.salesmanager.core.model.payments.PaypalPayment();
-
- ((com.salesmanager.core.model.payments.PaypalPayment)payment).setPayerId(transaction.getTransactionDetails().get("PAYERID"));
- ((com.salesmanager.core.model.payments.PaypalPayment)payment).setPaymentToken(transaction.getTransactionDetails().get("TOKEN"));
-
-
- }
-
-
- modelOrder.setPaymentModuleCode(order.getPaymentModule());
- payment.setModuleName(order.getPaymentModule());
-
- if(transaction!=null) {
- orderService.processOrder(modelOrder, customer, order.getShoppingCartItems(), summary, payment, store);
- } else {
- orderService.processOrder(modelOrder, customer, order.getShoppingCartItems(), summary, payment, transaction, store);
- }
-
-
-
- return modelOrder;
-
- } catch(ServiceException se) {//may be invalid credit card
- throw se;
- } catch(Exception e) {
- throw new ServiceException(e);
- }
-
- }
-
- private void orderCustomer(Customer customer, Order order, Language language) throws Exception {
-
- //populate customer
- order.setBilling(customer.getBilling());
- order.setDelivery(customer.getDelivery());
- order.setCustomerEmailAddress(customer.getEmailAddress());
- order.setCustomerId(customer.getId());
-
-
-
- }
-
-
-
- @Override
- public Customer initEmptyCustomer(MerchantStore store) {
-
- Customer customer = new Customer();
- Billing billing = new Billing();
- billing.setCountry(store.getCountry());
- billing.setZone(store.getZone());
- billing.setState(store.getStorestateprovince());
- /** empty postal code for initial quote **/
- //billing.setPostalCode(store.getStorepostalcode());
- customer.setBilling(billing);
-
- Delivery delivery = new Delivery();
- delivery.setCountry(store.getCountry());
- delivery.setZone(store.getZone());
- delivery.setState(store.getStorestateprovince());
- /** empty postal code for initial quote **/
- //delivery.setPostalCode(store.getStorepostalcode());
- customer.setDelivery(delivery);
-
- return customer;
- }
-
-
-
- @Override
- public void refreshOrder(ShopOrder order, MerchantStore store,
- Customer customer, ShoppingCart shoppingCart, Language language)
- throws Exception {
- if(customer==null && order.getCustomer()!=null) {
- order.getCustomer().setId(0L);//reset customer id
- }
-
- if(customer!=null) {
- PersistableCustomer persistableCustomer = persistableCustomer(customer, store, language);
- order.setCustomer(persistableCustomer);
- }
-
- List<ShoppingCartItem> items = new ArrayList<ShoppingCartItem>(shoppingCart.getLineItems());
- order.setShoppingCartItems(items);
-
- return;
- }
-
- @Override
- public ShippingQuote getShippingQuote(PersistableCustomer persistableCustomer, ShoppingCart cart, ShopOrder order, MerchantStore store, Language language) throws Exception {
-
-
- //create shipping products
- List<ShippingProduct> shippingProducts = shoppingCartService.createShippingProduct(cart);
-
- if(CollectionUtils.isEmpty(shippingProducts)) {
- return null;//products are virtual
- }
-
- Customer customer = customerFacade.getCustomerModel(persistableCustomer, store, language);
-
-
- Delivery delivery = new Delivery();
-
- //adjust shipping and billing
- if(order.isShipToBillingAdress()) {
-
- Billing billing = customer.getBilling();
-
- String postalCode = billing.getPostalCode();
- postalCode = validatePostalCode(postalCode);
-
- delivery.setAddress(billing.getAddress());
- delivery.setCompany(billing.getCompany());
- delivery.setCity(billing.getCity());
- delivery.setPostalCode(billing.getPostalCode());
- delivery.setState(billing.getState());
- delivery.setCountry(billing.getCountry());
- delivery.setZone(billing.getZone());
- } else {
- delivery = customer.getDelivery();
- }
-
-
-
- ShippingQuote quote = shippingService.getShippingQuote(store, delivery, shippingProducts, language);
-
- return quote;
-
- }
-
- private String validatePostalCode(String postalCode) {
-
- String patternString = "__";//this one is set in the template
- if(postalCode.contains(patternString)) {
- postalCode = null;
- }
- return postalCode;
- }
-
- @Override
- public List<Country> getShipToCountry(MerchantStore store, Language language) throws Exception {
-
- List<Country> shippingCountriesList = shippingService.getShipToCountryList(store, language);
- return shippingCountriesList;
-
- }
-
-
-
-
- /**
- * ShippingSummary contains the subset of information
- * of a ShippingQuote
- */
- @Override
- public ShippingSummary getShippingSummary(ShippingQuote quote,
- MerchantStore store, Language language) {
-
- ShippingSummary summary = null;
- if(quote.getSelectedShippingOption()!=null) {
-
-
- summary = new ShippingSummary();
- summary.setFreeShipping(quote.isFreeShipping());
- summary.setTaxOnShipping(quote.isApplyTaxOnShipping());
- summary.setHandling(quote.getHandlingFees());
- summary.setShipping(quote.getSelectedShippingOption().getOptionPrice());
- summary.setShippingOption(quote.getSelectedShippingOption().getOptionName());
- summary.setShippingModule(quote.getShippingModuleCode());
- summary.setShippingOptionCode(quote.getSelectedShippingOption().getOptionCode());
-
- if(quote.getDeliveryAddress()!=null) {
-
- summary.setDeliveryAddress(quote.getDeliveryAddress());
-
-
- }
-
-
- }
-
- return summary;
- }
-
- @Override
- public void validateOrder(ShopOrder order, BindingResult bindingResult, Map<String,String> messagesResult, MerchantStore store, Locale locale) throws ServiceException {
-
-
- Validate.notNull(messagesResult,"messagesResult should not be null");
-
-
- try {
-
-
- //Language language = (Language)request.getAttribute("LANGUAGE");
-
- //validate order shipping and billing
- if(StringUtils.isBlank(order.getCustomer().getBilling().getFirstName())) {
- FieldError error = new FieldError("customer.billing.firstName","customer.billing.firstName",messages.getMessage("NotEmpty.customer.firstName", locale));
- bindingResult.addError(error);
- messagesResult.put("customer.billing.firstName",messages.getMessage("NotEmpty.customer.firstName", locale));
- }
-
- if(StringUtils.isBlank(order.getCustomer().getBilling().getLastName())) {
- FieldError error = new FieldError("customer.billing.lastName","customer.billing.lastName",messages.getMessage("NotEmpty.customer.lastName", locale));
- bindingResult.addError(error);
- messagesResult.put("customer.billing.lastName",messages.getMessage("NotEmpty.customer.lastName", locale));
- }
-
- if(StringUtils.isBlank(order.getCustomer().getEmailAddress())) {
- FieldError error = new FieldError("customer.emailAddress","customer.emailAddress",messages.getMessage("NotEmpty.customer.emailAddress", locale));
- bindingResult.addError(error);
- messagesResult.put("customer.emailAddress",messages.getMessage("NotEmpty.customer.emailAddress", locale));
- }
-
- if(StringUtils.isBlank(order.getCustomer().getBilling().getAddress())) {
- FieldError error = new FieldError("customer.billing.address","customer.billing.address",messages.getMessage("NotEmpty.customer.billing.address", locale));
- bindingResult.addError(error);
- messagesResult.put("customer.billing.address",messages.getMessage("NotEmpty.customer.billing.address", locale));
- }
-
- if(StringUtils.isBlank(order.getCustomer().getBilling().getCity())) {
- FieldError error = new FieldError("customer.billing.city","customer.billing.city",messages.getMessage("NotEmpty.customer.billing.city", locale));
- bindingResult.addError(error);
- messagesResult.put("customer.billing.city",messages.getMessage("NotEmpty.customer.billing.city", locale));
- }
-
- if(StringUtils.isBlank(order.getCustomer().getBilling().getCountry())) {
- FieldError error = new FieldError("customer.billing.country","customer.billing.country",messages.getMessage("NotEmpty.customer.billing.country", locale));
- bindingResult.addError(error);
- messagesResult.put("customer.billing.country",messages.getMessage("NotEmpty.customer.billing.country", locale));
- }
-
- if(StringUtils.isBlank(order.getCustomer().getBilling().getZone()) && StringUtils.isBlank(order.getCustomer().getBilling().getStateProvince())) {
- FieldError error = new FieldError("customer.billing.stateProvince","customer.billing.stateProvince",messages.getMessage("NotEmpty.customer.billing.stateProvince", locale));
- bindingResult.addError(error);
- messagesResult.put("customer.billing.stateProvince",messages.getMessage("NotEmpty.customer.billing.stateProvince", locale));
- }
-
- if(StringUtils.isBlank(order.getCustomer().getBilling().getPhone())) {
- FieldError error = new FieldError("customer.billing.phone","customer.billing.phone",messages.getMessage("NotEmpty.customer.billing.phone", locale));
- bindingResult.addError(error);
- messagesResult.put("customer.billing.phone",messages.getMessage("NotEmpty.customer.billing.phone", locale));
- }
-
- if(StringUtils.isBlank(order.getCustomer().getBilling().getPostalCode())) {
- FieldError error = new FieldError("customer.billing.postalCode","customer.billing.postalCode",messages.getMessage("NotEmpty.customer.billing.postalCode", locale));
- bindingResult.addError(error);
- messagesResult.put("customer.billing.postalCode",messages.getMessage("NotEmpty.customer.billing.postalCode", locale));
- }
-
- if(!order.isShipToBillingAdress()) {
-
- if(StringUtils.isBlank(order.getCustomer().getDelivery().getFirstName())) {
- FieldError error = new FieldError("customer.delivery.firstName","customer.delivery.firstName",messages.getMessage("NotEmpty.customer.shipping.firstName", locale));
- bindingResult.addError(error);
- messagesResult.put("customer.delivery.firstName",messages.getMessage("NotEmpty.customer.shipping.firstName", locale));
- }
-
- if(StringUtils.isBlank(order.getCustomer().getDelivery().getLastName())) {
- FieldError error = new FieldError("customer.delivery.lastName","customer.delivery.lastName",messages.getMessage("NotEmpty.customer.shipping.lastName", locale));
- bindingResult.addError(error);
- messagesResult.put("customer.delivery.lastName",messages.getMessage("NotEmpty.customer.shipping.lastName", locale));
- }
-
- if(StringUtils.isBlank(order.getCustomer().getDelivery().getAddress())) {
- FieldError error = new FieldError("customer.delivery.address","customer.delivery.address",messages.getMessage("NotEmpty.customer.shipping.address", locale));
- bindingResult.addError(error);
- messagesResult.put("customer.delivery.address",messages.getMessage("NotEmpty.customer.shipping.address", locale));
- }
-
- if(StringUtils.isBlank(order.getCustomer().getDelivery().getCity())) {
- FieldError error = new FieldError("customer.delivery.city","customer.delivery.city",messages.getMessage("NotEmpty.customer.shipping.city", locale));
- bindingResult.addError(error);
- messagesResult.put("customer.delivery.city",messages.getMessage("NotEmpty.customer.shipping.city", locale));
- }
-
- if(StringUtils.isBlank(order.getCustomer().getDelivery().getCountry())) {
- FieldError error = new FieldError("customer.delivery.country","customer.delivery.country",messages.getMessage("NotEmpty.customer.shipping.country", locale));
- bindingResult.addError(error);
- messagesResult.put("customer.delivery.country",messages.getMessage("NotEmpty.customer.shipping.country", locale));
- }
-
- if(StringUtils.isBlank(order.getCustomer().getDelivery().getZone()) && StringUtils.isBlank(order.getCustomer().getDelivery().getStateProvince())) {
- FieldError error = new FieldError("customer.delivery.stateProvince","customer.delivery.stateProvince",messages.getMessage("NotEmpty.customer.shipping.stateProvince", locale));
- bindingResult.addError(error);
- messagesResult.put("customer.delivery.stateProvince",messages.getMessage("NotEmpty.customer.shipping.stateProvince", locale));
- }
-
-
- if(StringUtils.isBlank(order.getCustomer().getDelivery().getPostalCode())) {
- FieldError error = new FieldError("customer.delivery.postalCode","customer.delivery.postalCode",messages.getMessage("NotEmpty.customer.shipping.postalCode", locale));
- bindingResult.addError(error);
- messagesResult.put("customer.delivery.postalCode",messages.getMessage("NotEmpty.customer.shipping.postalCode", locale));
- }
-
- }
-
- if ( bindingResult.hasErrors() )
- {
- return;
-
- }
-
- String paymentType = order.getPaymentMethodType();
-
- if(!shoppingCartService.isFreeShoppingCart(order.getShoppingCartItems()) && paymentType==null) {
-
- }
-
- //validate payment
- if(paymentType==null) {
- ServiceException serviceException = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"payment.required");
- throw serviceException;
- }
-
- //validate shipping
- if(shippingService.requiresShipping(order.getShoppingCartItems(), store) && order.getSelectedShippingOption()==null) {
- ServiceException serviceException = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"shipping.required");
- throw serviceException;
- }
-
- //pre-validate credit card
- if(PaymentType.CREDITCARD.name().equals(paymentType)) {
- String cco = order.getPayment().get("creditcard_card_holder");
- String cvv = order.getPayment().get("creditcard_card_cvv");
- String ccn = order.getPayment().get("creditcard_card_number");
- String ccm = order.getPayment().get("creditcard_card_expirationmonth");
- String ccd = order.getPayment().get("creditcard_card_expirationyear");
-
- if(StringUtils.isBlank(cco) || StringUtils.isBlank(cvv) || StringUtils.isBlank(ccn) ||
- StringUtils.isBlank(ccm) || StringUtils.isBlank(ccd)) {
- ObjectError error = new ObjectError("creditcard_card_holder",messages.getMessage("NotEmpty.customer.shipping.stateProvince", locale));
- bindingResult.addError(error);
- messagesResult.put("creditcard_card_holder",messages.getMessage("NotEmpty.customer.shipping.stateProvince", locale));
- return;
- }
-
- CreditCardType creditCardType =null;
- String cardType = order.getPayment().get("creditcard_card_type");
-
- if(cardType.equalsIgnoreCase(CreditCardType.AMEX.name())) {
- creditCardType = CreditCardType.AMEX;
- } else if(cardType.equalsIgnoreCase(CreditCardType.VISA.name())) {
- creditCardType = CreditCardType.VISA;
- } else if(cardType.equalsIgnoreCase(CreditCardType.MASTERCARD.name())) {
- creditCardType = CreditCardType.MASTERCARD;
- } else if(cardType.equalsIgnoreCase(CreditCardType.DINERS.name())) {
- creditCardType = CreditCardType.DINERS;
- } else if(cardType.equalsIgnoreCase(CreditCardType.DISCOVERY.name())) {
- creditCardType = CreditCardType.DISCOVERY;
- }
-
- if(creditCardType==null) {
- ServiceException serviceException = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"cc.type");
- throw serviceException;
- }
-
- }
-
-
-
-
-
-
-
- } catch(ServiceException se) {
- LOGGER.error("Error while commiting order",se);
- throw se;
- }
-
-}
-
-
-
- @Override
- public ReadableOrderList getReadableOrderList(MerchantStore store,
- Customer customer, int start, int maxCount, Language language) throws Exception {
-
- OrderCriteria criteria = new OrderCriteria();
- criteria.setStartIndex(start);
- criteria.setMaxCount(maxCount);
- criteria.setCustomerId(customer.getId());
-
- return this.getReadableOrderList(criteria, store, language);
-
- }
-
-
-
- @Override
- public ShippingQuote getShippingQuote(Customer customer, ShoppingCart cart,
- PersistableOrder order, MerchantStore store, Language language)
- throws Exception {
- //create shipping products
- List<ShippingProduct> shippingProducts = shoppingCartService.createShippingProduct(cart);
-
- if(CollectionUtils.isEmpty(shippingProducts)) {
- return null;//products are virtual
- }
-
-
-
- Delivery delivery = new Delivery();
-
- //adjust shipping and billing
- if(order.isShipToBillingAdress()) {
- Billing billing = customer.getBilling();
- delivery.setAddress(billing.getAddress());
- delivery.setCity(billing.getCity());
- delivery.setCompany(billing.getCompany());
- delivery.setPostalCode(billing.getPostalCode());
- delivery.setState(billing.getState());
- delivery.setCountry(billing.getCountry());
- delivery.setZone(billing.getZone());
- } else {
- delivery = customer.getDelivery();
- }
-
-
-
- ShippingQuote quote = shippingService.getShippingQuote(store, delivery, shippingProducts, language);
-
- return quote;
- }
-
-
-
- private ReadableOrderList populateOrderList(final OrderList orderList,final MerchantStore store, final Language language){
- List<Order> orders = orderList.getOrders();
- ReadableOrderList returnList = new ReadableOrderList();
- if(CollectionUtils.isEmpty( orders)){
- LOGGER.info( "Order list if empty..Returning empty list" );
- returnList.setTotal(0);
- returnList.setMessage("No results for store code " + store);
- return null;
- }
-
- ReadableOrderPopulator orderPopulator = new ReadableOrderPopulator();
- Locale locale = LocaleUtils.getLocale(language);
- orderPopulator.setLocale(locale);
-
- List<ReadableOrder> readableOrders = new ArrayList<ReadableOrder>();
- for (Order order : orders) {
- ReadableOrder readableOrder = new ReadableOrder();
- try
- {
- orderPopulator.populate(order,readableOrder,store,language);
- setOrderProductList(order,locale,store,language,readableOrder);
- }
- catch ( ConversionException ex )
- {
- LOGGER.error( "Error while converting order to order data", ex );
-
- }
- readableOrders.add(readableOrder);
-
- }
-
- returnList.setTotal(orderList.getTotalCount());
- returnList.setOrders( readableOrders );
- return returnList;
-
- }
-
- private void setOrderProductList(final Order order, final Locale locale,final MerchantStore store, final Language language , final ReadableOrder readableOrder) throws ConversionException{
- List<ReadableOrderProduct> orderProducts = new ArrayList<ReadableOrderProduct>();
- for(OrderProduct p : order.getOrderProducts()) {
- ReadableOrderProductPopulator orderProductPopulator = new ReadableOrderProductPopulator();
- orderProductPopulator.setLocale(locale);
- orderProductPopulator.setProductService(productService);
- orderProductPopulator.setPricingService(pricingService);
- orderProductPopulator.setimageUtils(imageUtils);
- ReadableOrderProduct orderProduct = new ReadableOrderProduct();
- orderProductPopulator.populate(p, orderProduct, store, language);
-
- //image
-
- //attributes
-
-
-
- orderProducts.add(orderProduct);
- }
-
- readableOrder.setProducts(orderProducts);
- }
-
-
- private ReadableOrderList getReadableOrderList(OrderCriteria criteria, MerchantStore store, Language language) throws Exception {
-
- OrderList orderList = orderService.listByStore(store, criteria);
-
- ReadableOrderPopulator orderPopulator = new ReadableOrderPopulator();
- Locale locale = LocaleUtils.getLocale(language);
- orderPopulator.setLocale(locale);
-
- List<Order> orders = orderList.getOrders();
- ReadableOrderList returnList = new ReadableOrderList();
-
- if(CollectionUtils.isEmpty(orders)) {
- returnList.setTotal(0);
- returnList.setMessage("No results for store code " + store);
- return null;
- }
-
- List<ReadableOrder> readableOrders = new ArrayList<ReadableOrder>();
- for (Order order : orders) {
- ReadableOrder readableOrder = new ReadableOrder();
- orderPopulator.populate(order,readableOrder,store,language);
- readableOrders.add(readableOrder);
-
- }
-
- returnList.setTotal(orderList.getTotalCount());
- return this.populateOrderList(orderList, store, language);
-
-
- }
-
- @Override
- public ReadableOrderList getReadableOrderList(MerchantStore store,
- int start, int maxCount, Language language) throws Exception {
-
- OrderCriteria criteria = new OrderCriteria();
- criteria.setStartIndex(start);
- criteria.setMaxCount(maxCount);
-
- return this.getReadableOrderList(criteria, store, language);
- }
-
-
-
- @Override
- public ReadableOrder getReadableOrder(Long orderId, MerchantStore store,
- Language language) throws Exception {
-
-
-
- Order modelOrder = orderService.getById(orderId);
- if(modelOrder==null) {
- throw new Exception("Order not found with id " + orderId);
- }
-
- ReadableOrder readableOrder = new ReadableOrder();
-
- Long customerId = modelOrder.getCustomerId();
- if(customerId != null) {
- ReadableCustomer readableCustomer = customerFacade.getCustomerById(customerId, store, language);
- if(readableCustomer==null) {
- LOGGER.warn("Customer id " + customerId + " not found in order " + orderId);
- } else {
- readableOrder.setCustomer(readableCustomer);
- }
- }
-
- ReadableOrderPopulator orderPopulator = new ReadableOrderPopulator();
- orderPopulator.populate(modelOrder, readableOrder, store, language);
-
- //order products
- List<ReadableOrderProduct> orderProducts = new ArrayList<ReadableOrderProduct>();
- for(OrderProduct p : modelOrder.getOrderProducts()) {
- ReadableOrderProductPopulator orderProductPopulator = new ReadableOrderProductPopulator();
- orderProductPopulator.setProductService(productService);
- orderProductPopulator.setPricingService(pricingService);
- orderProductPopulator.setimageUtils(imageUtils);
-
- ReadableOrderProduct orderProduct = new ReadableOrderProduct();
- orderProductPopulator.populate(p, orderProduct, store, language);
- orderProducts.add(orderProduct);
- }
-
- readableOrder.setProducts(orderProducts);
-
- return readableOrder;
- }
-
-}
+package com.salesmanager.shop.store.controller.order.facade;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+
+import javax.inject.Inject;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.Validate;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.FieldError;
+import org.springframework.validation.ObjectError;
+
+import com.salesmanager.core.business.exception.ConversionException;
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
+import com.salesmanager.core.business.services.catalog.product.file.DigitalProductService;
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.business.services.customer.attribute.CustomerOptionService;
+import com.salesmanager.core.business.services.customer.attribute.CustomerOptionValueService;
+import com.salesmanager.core.business.services.order.OrderService;
+import com.salesmanager.core.business.services.payments.PaymentService;
+import com.salesmanager.core.business.services.reference.country.CountryService;
+import com.salesmanager.core.business.services.reference.currency.CurrencyService;
+import com.salesmanager.core.business.services.reference.language.LanguageService;
+import com.salesmanager.core.business.services.reference.zone.ZoneService;
+import com.salesmanager.core.business.services.shipping.ShippingQuoteService;
+import com.salesmanager.core.business.services.shipping.ShippingService;
+import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
+import com.salesmanager.core.business.services.system.EmailService;
+import com.salesmanager.core.business.services.user.GroupService;
+import com.salesmanager.core.business.utils.CoreConfiguration;
+import com.salesmanager.core.business.utils.CreditCardUtils;
+import com.salesmanager.core.model.common.Billing;
+import com.salesmanager.core.model.common.Delivery;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.order.OrderCriteria;
+import com.salesmanager.core.model.order.OrderList;
+import com.salesmanager.core.model.order.OrderSummary;
+import com.salesmanager.core.model.order.OrderTotalSummary;
+import com.salesmanager.core.model.order.attributes.OrderAttribute;
+import com.salesmanager.core.model.order.orderproduct.OrderProduct;
+import com.salesmanager.core.model.order.orderstatus.OrderStatus;
+import com.salesmanager.core.model.order.payment.CreditCard;
+import com.salesmanager.core.model.payments.CreditCardPayment;
+import com.salesmanager.core.model.payments.CreditCardType;
+import com.salesmanager.core.model.payments.Payment;
+import com.salesmanager.core.model.payments.PaymentType;
+import com.salesmanager.core.model.payments.Transaction;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.shipping.ShippingProduct;
+import com.salesmanager.core.model.shipping.ShippingQuote;
+import com.salesmanager.core.model.shipping.ShippingSummary;
+import com.salesmanager.core.model.shoppingcart.ShoppingCart;
+import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
+import com.salesmanager.shop.model.customer.Address;
+import com.salesmanager.shop.model.customer.PersistableCustomer;
+import com.salesmanager.shop.model.customer.ReadableCustomer;
+import com.salesmanager.shop.model.order.OrderEntity;
+import com.salesmanager.shop.model.order.PersistableOrder;
+import com.salesmanager.shop.model.order.PersistableOrderApi;
+import com.salesmanager.shop.model.order.PersistableOrderProduct;
+import com.salesmanager.shop.model.order.ReadableOrder;
+import com.salesmanager.shop.model.order.ReadableOrderList;
+import com.salesmanager.shop.model.order.ReadableOrderProduct;
+import com.salesmanager.shop.model.order.ShopOrder;
+import com.salesmanager.shop.model.order.total.OrderTotal;
+import com.salesmanager.shop.model.order.transaction.ReadableTransaction;
+import com.salesmanager.shop.populator.customer.CustomerPopulator;
+import com.salesmanager.shop.populator.customer.PersistableCustomerPopulator;
+import com.salesmanager.shop.populator.order.OrderProductPopulator;
+import com.salesmanager.shop.populator.order.PersistableOrderApiPopulator;
+import com.salesmanager.shop.populator.order.ReadableOrderPopulator;
+import com.salesmanager.shop.populator.order.ReadableOrderProductPopulator;
+import com.salesmanager.shop.populator.order.ShoppingCartItemPopulator;
+import com.salesmanager.shop.populator.order.transaction.PersistablePaymentPopulator;
+import com.salesmanager.shop.populator.order.transaction.ReadableTransactionPopulator;
+import com.salesmanager.shop.store.controller.customer.facade.CustomerFacade;
+import com.salesmanager.shop.store.controller.shoppingCart.facade.ShoppingCartFacade;
+import com.salesmanager.shop.utils.EmailTemplatesUtils;
+import com.salesmanager.shop.utils.ImageFilePath;
+import com.salesmanager.shop.utils.LabelUtils;
+import com.salesmanager.shop.utils.LocaleUtils;
+
+@Service("orderFacade")
+public class OrderFacadeImpl implements OrderFacade {
+
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(OrderFacadeImpl.class);
+
+
+ @Inject
+ private OrderService orderService;
+ @Inject
+ private ProductService productService;
+ @Inject
+ private ProductAttributeService productAttributeService;
+ @Inject
+ private ShoppingCartService shoppingCartService;
+ @Inject
+ private DigitalProductService digitalProductService;
+ @Inject
+ private CustomerService customerService;
+ @Inject
+ private ShippingService shippingService;
+ @Inject
+ private CustomerFacade customerFacade;
+ @Inject
+ private PricingService pricingService;
+ @Inject
+ private ShoppingCartFacade shoppingCartFacade;
+ @Inject
+ private CurrencyService currencyService;
+ @Inject
+ private ShippingQuoteService shippingQuoteService;
+ @Inject
+ private CoreConfiguration coreConfiguration;
+ @Inject
+ private PaymentService paymentService;
+
+ @Inject
+ private CustomerOptionValueService customerOptionValueService;
+
+ @Inject
+ private CustomerOptionService customerOptionService;
+
+
+ @Inject
+ private LanguageService languageService;
+
+
+ @Inject
+ private CountryService countryService;
+
+ @Inject
+ private GroupService groupService;
+
+ @Inject
+ private ZoneService zoneService;
+
+ @Inject
+ EmailService emailService;
+
+
+ @Inject
+ private EmailTemplatesUtils emailTemplatesUtils;
+
+
+
+
+ @Inject
+ private LabelUtils messages;
+
+ @Inject
+ @Qualifier("img")
+ private ImageFilePath imageUtils;
+
+
+ @Override
+ public ShopOrder initializeOrder(MerchantStore store, Customer customer,
+ ShoppingCart shoppingCart, Language language) throws Exception {
+
+ //assert not null shopping cart items
+
+ ShopOrder order = new ShopOrder();
+
+ OrderStatus orderStatus = OrderStatus.ORDERED;
+ order.setOrderStatus(orderStatus);
+
+ if(customer==null) {
+ customer = this.initEmptyCustomer(store);
+ }
+
+ PersistableCustomer persistableCustomer = persistableCustomer(customer, store, language);
+ order.setCustomer(persistableCustomer);
+
+ //keep list of shopping cart items for core price calculation
+ List<ShoppingCartItem> items = new ArrayList<ShoppingCartItem>(shoppingCart.getLineItems());
+ order.setShoppingCartItems(items);
+
+ return order;
+ }
+
+
+
+ @Override
+ public OrderTotalSummary calculateOrderTotal(MerchantStore store,
+ ShopOrder order, Language language) throws Exception {
+
+
+ Customer customer = customerFacade.getCustomerModel(order.getCustomer(), store, language);
+ OrderTotalSummary summary = this.calculateOrderTotal(store, customer, order, language);
+ this.setOrderTotals(order, summary);
+ return summary;
+ }
+
+ @Override
+ public OrderTotalSummary calculateOrderTotal(MerchantStore store,
+ PersistableOrder order, Language language) throws Exception {
+
+ List<PersistableOrderProduct> orderProducts = order.getOrderProductItems();
+
+ ShoppingCartItemPopulator populator = new ShoppingCartItemPopulator();
+ populator.setProductAttributeService(productAttributeService);
+ populator.setProductService(productService);
+ populator.setShoppingCartService(shoppingCartService);
+
+ List<ShoppingCartItem> items = new ArrayList<ShoppingCartItem>();
+ for(PersistableOrderProduct orderProduct : orderProducts) {
+ ShoppingCartItem item = populator.populate(orderProduct, new ShoppingCartItem(), store, language);
+ items.add(item);
+ }
+
+
+ Customer customer = customer(order.getCustomer(), store, language);
+
+ OrderTotalSummary summary = this.calculateOrderTotal(store, customer, order, language);
+
+ return summary;
+ }
+
+ private OrderTotalSummary calculateOrderTotal(MerchantStore store, Customer customer, PersistableOrder order, Language language) throws Exception {
+
+ OrderTotalSummary orderTotalSummary = null;
+
+ OrderSummary summary = new OrderSummary();
+
+
+ if(order instanceof ShopOrder) {
+ ShopOrder o = (ShopOrder)order;
+ summary.setProducts(o.getShoppingCartItems());
+
+ if(o.getShippingSummary()!=null) {
+ summary.setShippingSummary(o.getShippingSummary());
+ }
+ orderTotalSummary = orderService.caculateOrderTotal(summary, customer, store, language);
+ } else {
+ //need Set of ShoppingCartItem
+ //PersistableOrder not implemented
+ throw new Exception("calculateOrderTotal not yet implemented for PersistableOrder");
+ }
+
+ return orderTotalSummary;
+
+ }
+
+
+ private PersistableCustomer persistableCustomer(Customer customer, MerchantStore store, Language language) throws Exception {
+
+ PersistableCustomerPopulator customerPopulator = new PersistableCustomerPopulator();
+ PersistableCustomer persistableCustomer = customerPopulator.populate(customer, new PersistableCustomer(), store, language);
+ return persistableCustomer;
+
+ }
+
+ private Customer customer(PersistableCustomer customer, MerchantStore store, Language language) throws Exception {
+ CustomerPopulator populator = new CustomerPopulator();
+ populator.setCountryService(countryService);
+ populator.setCustomerOptionService(customerOptionService);
+ populator.setCustomerOptionValueService(customerOptionValueService);
+ populator.setLanguageService(languageService);
+ populator.setZoneService(zoneService);
+ populator.setGroupService(groupService);
+ Customer cust = populator.populate(customer, new Customer(), store, language);
+ return cust;
+
+ }
+
+ private void setOrderTotals(OrderEntity order, OrderTotalSummary summary) {
+
+ List<OrderTotal> totals = new ArrayList<OrderTotal>();
+ List<com.salesmanager.core.model.order.OrderTotal> orderTotals = summary.getTotals();
+ for(com.salesmanager.core.model.order.OrderTotal t : orderTotals) {
+ OrderTotal total = new OrderTotal();
+ total.setCode(t.getOrderTotalCode());
+ total.setTitle(t.getTitle());
+ total.setValue(t.getValue());
+ totals.add(total);
+ }
+
+ order.setTotals(totals);
+
+ }
+
+
+ /**
+ * Submitted object must be valided prior to the invocation of this method
+ */
+ @Override
+ public Order processOrder(ShopOrder order, Customer customer, MerchantStore store,
+ Language language) throws ServiceException {
+
+ return this.processOrderModel(order, customer, null, store, language);
+
+ }
+
+ @Override
+ public Order processOrder(ShopOrder order, Customer customer, Transaction transaction, MerchantStore store,
+ Language language) throws ServiceException {
+
+ return this.processOrderModel(order, customer, transaction, store, language);
+
+ }
+
+ private Order processOrderModel(ShopOrder order, Customer customer, Transaction transaction, MerchantStore store,
+ Language language) throws ServiceException {
+
+ try {
+
+ if(order.isShipToBillingAdress()) {//customer shipping is billing
+ PersistableCustomer orderCustomer = order.getCustomer();
+ Address billing = orderCustomer.getBilling();
+ orderCustomer.setDelivery(billing);
+ }
+
+
+
+
+ Order modelOrder = new Order();
+ modelOrder.setDatePurchased(new Date());
+ modelOrder.setBilling(customer.getBilling());
+ modelOrder.setDelivery(customer.getDelivery());
+ modelOrder.setPaymentModuleCode(order.getPaymentModule());
+ modelOrder.setPaymentType(PaymentType.valueOf(order.getPaymentMethodType()));
+ modelOrder.setShippingModuleCode(order.getShippingModule());
+ modelOrder.setCustomerAgreement(order.isCustomerAgreed());
+ modelOrder.setLocale(LocaleUtils.getLocale(store));//set the store locale based on the country for order $ formatting
+
+ List<ShoppingCartItem> shoppingCartItems = order.getShoppingCartItems();
+ Set<OrderProduct> orderProducts = new LinkedHashSet<OrderProduct>();
+
+ OrderProductPopulator orderProductPopulator = new OrderProductPopulator();
+ orderProductPopulator.setDigitalProductService(digitalProductService);
+ orderProductPopulator.setProductAttributeService(productAttributeService);
+ orderProductPopulator.setProductService(productService);
+
+ for(ShoppingCartItem item : shoppingCartItems) {
+ OrderProduct orderProduct = new OrderProduct();
+ orderProduct = orderProductPopulator.populate(item, orderProduct , store, language);
+ orderProduct.setOrder(modelOrder);
+ orderProducts.add(orderProduct);
+ }
+
+ modelOrder.setOrderProducts(orderProducts);
+
+ OrderTotalSummary summary = order.getOrderTotalSummary();
+ List<com.salesmanager.core.model.order.OrderTotal> totals = summary.getTotals();
+
+ //re-order totals
+ Collections.sort(
+ totals,
+ new Comparator<com.salesmanager.core.model.order.OrderTotal>() {
+ public int compare(com.salesmanager.core.model.order.OrderTotal x, com.salesmanager.core.model.order.OrderTotal y) {
+ if(x.getSortOrder()==y.getSortOrder())
+ return 0;
+ return x.getSortOrder() < y.getSortOrder() ? -1 : 1;
+ }
+
+ });
+
+ Set<com.salesmanager.core.model.order.OrderTotal> modelTotals = new LinkedHashSet<com.salesmanager.core.model.order.OrderTotal>();
+ for(com.salesmanager.core.model.order.OrderTotal total : totals) {
+ total.setOrder(modelOrder);
+ modelTotals.add(total);
+ }
+
+ modelOrder.setOrderTotal(modelTotals);
+ modelOrder.setTotal(order.getOrderTotalSummary().getTotal());
+
+ //order misc objects
+ modelOrder.setCurrency(store.getCurrency());
+ modelOrder.setMerchant(store);
+
+
+
+ //customer object
+ orderCustomer(customer, modelOrder, language);
+
+ //populate shipping information
+ if(!StringUtils.isBlank(order.getShippingModule())) {
+ modelOrder.setShippingModuleCode(order.getShippingModule());
+ }
+
+ String paymentType = order.getPaymentMethodType();
+ Payment payment = new Payment();
+ payment.setPaymentType(PaymentType.valueOf(paymentType));
+ payment.setAmount(order.getOrderTotalSummary().getTotal());
+ payment.setModuleName(order.getPaymentModule());
+ payment.setCurrency(modelOrder.getCurrency());
+
+ if(order.getPayment().get("paymentToken") != null) {// set any tokenization payment token
+ String paymentToken = order.getPayment().get("paymentToken");
+ Map<String,String> paymentMetaData = new HashMap<String,String>();
+ payment.setPaymentMetaData(paymentMetaData);
+ paymentMetaData.put("paymentToken", paymentToken);
+ }
+
+
+ if(PaymentType.CREDITCARD.name().equals(paymentType)) {
+
+
+
+ payment = new CreditCardPayment();
+ ((CreditCardPayment)payment).setCardOwner(order.getPayment().get("creditcard_card_holder"));
+ ((CreditCardPayment)payment).setCredidCardValidationNumber(order.getPayment().get("creditcard_card_cvv"));
+ ((CreditCardPayment)payment).setCreditCardNumber(order.getPayment().get("creditcard_card_number"));
+ ((CreditCardPayment)payment).setExpirationMonth(order.getPayment().get("creditcard_card_expirationmonth"));
+ ((CreditCardPayment)payment).setExpirationYear(order.getPayment().get("creditcard_card_expirationyear"));
+
+
+ Map<String,String> paymentMetaData = order.getPayment();
+ payment.setPaymentMetaData(paymentMetaData);
+
+
+
+ CreditCardType creditCardType =null;
+ String cardType = order.getPayment().get("creditcard_card_type");
+
+
+ if(CreditCardType.AMEX.name().equalsIgnoreCase(cardType)) {
+ creditCardType = CreditCardType.AMEX;
+ } else if(CreditCardType.VISA.name().equalsIgnoreCase(cardType)) {
+ creditCardType = CreditCardType.VISA;
+ } else if(CreditCardType.MASTERCARD.name().equalsIgnoreCase(cardType)) {
+ creditCardType = CreditCardType.MASTERCARD;
+ } else if(CreditCardType.DINERS.name().equalsIgnoreCase(cardType)) {
+ creditCardType = CreditCardType.DINERS;
+ } else if(CreditCardType.DISCOVERY.name().equalsIgnoreCase(cardType)) {
+ creditCardType = CreditCardType.DISCOVERY;
+ }
+
+ ((CreditCardPayment)payment).setCreditCard(creditCardType);
+
+ if(creditCardType!=null) {
+
+ CreditCard cc = new CreditCard();
+ cc.setCardType(creditCardType);
+ cc.setCcCvv(((CreditCardPayment)payment).getCredidCardValidationNumber());
+ cc.setCcOwner(((CreditCardPayment)payment).getCardOwner());
+ cc.setCcExpires(((CreditCardPayment)payment).getExpirationMonth() + "-" + ((CreditCardPayment)payment).getExpirationYear());
+
+ //hash credit card number
+ String maskedNumber = CreditCardUtils.maskCardNumber(order.getPayment().get("creditcard_card_number"));
+ cc.setCcNumber(maskedNumber);
+ modelOrder.setCreditCard(cc);
+
+ }
+
+
+ }
+
+ if(PaymentType.PAYPAL.name().equals(paymentType)) {
+
+ //check for previous transaction
+ if(transaction==null) {
+ throw new ServiceException("payment.error");
+ }
+
+ payment = new com.salesmanager.core.model.payments.PaypalPayment();
+
+ ((com.salesmanager.core.model.payments.PaypalPayment)payment).setPayerId(transaction.getTransactionDetails().get("PAYERID"));
+ ((com.salesmanager.core.model.payments.PaypalPayment)payment).setPaymentToken(transaction.getTransactionDetails().get("TOKEN"));
+
+
+ }
+
+
+ modelOrder.setPaymentModuleCode(order.getPaymentModule());
+ payment.setModuleName(order.getPaymentModule());
+
+ if(transaction!=null) {
+ orderService.processOrder(modelOrder, customer, order.getShoppingCartItems(), summary, payment, store);
+ } else {
+ orderService.processOrder(modelOrder, customer, order.getShoppingCartItems(), summary, payment, transaction, store);
+ }
+
+
+
+ return modelOrder;
+
+ } catch(ServiceException se) {//may be invalid credit card
+ throw se;
+ } catch(Exception e) {
+ throw new ServiceException(e);
+ }
+
+ }
+
+ private void orderCustomer(Customer customer, Order order, Language language) throws Exception {
+
+ //populate customer
+ order.setBilling(customer.getBilling());
+ order.setDelivery(customer.getDelivery());
+ order.setCustomerEmailAddress(customer.getEmailAddress());
+ order.setCustomerId(customer.getId());
+
+
+
+ }
+
+
+
+ @Override
+ public Customer initEmptyCustomer(MerchantStore store) {
+
+ Customer customer = new Customer();
+ Billing billing = new Billing();
+ billing.setCountry(store.getCountry());
+ billing.setZone(store.getZone());
+ billing.setState(store.getStorestateprovince());
+ /** empty postal code for initial quote **/
+ //billing.setPostalCode(store.getStorepostalcode());
+ customer.setBilling(billing);
+
+ Delivery delivery = new Delivery();
+ delivery.setCountry(store.getCountry());
+ delivery.setZone(store.getZone());
+ delivery.setState(store.getStorestateprovince());
+ /** empty postal code for initial quote **/
+ //delivery.setPostalCode(store.getStorepostalcode());
+ customer.setDelivery(delivery);
+
+ return customer;
+ }
+
+
+
+ @Override
+ public void refreshOrder(ShopOrder order, MerchantStore store,
+ Customer customer, ShoppingCart shoppingCart, Language language)
+ throws Exception {
+ if(customer==null && order.getCustomer()!=null) {
+ order.getCustomer().setId(0L);//reset customer id
+ }
+
+ if(customer!=null) {
+ PersistableCustomer persistableCustomer = persistableCustomer(customer, store, language);
+ order.setCustomer(persistableCustomer);
+ }
+
+ List<ShoppingCartItem> items = new ArrayList<ShoppingCartItem>(shoppingCart.getLineItems());
+ order.setShoppingCartItems(items);
+
+ return;
+ }
+
+ @Override
+ public ShippingQuote getShippingQuote(PersistableCustomer persistableCustomer, ShoppingCart cart, ShopOrder order, MerchantStore store, Language language) throws Exception {
+
+
+ //create shipping products
+ List<ShippingProduct> shippingProducts = shoppingCartService.createShippingProduct(cart);
+
+ if(CollectionUtils.isEmpty(shippingProducts)) {
+ return null;//products are virtual
+ }
+
+ Customer customer = customerFacade.getCustomerModel(persistableCustomer, store, language);
+
+
+ Delivery delivery = new Delivery();
+
+ //adjust shipping and billing
+ if(order.isShipToBillingAdress() && ! order.isShipToDeliveryAddress()) {
+
+ Billing billing = customer.getBilling();
+
+ String postalCode = billing.getPostalCode();
+ postalCode = validatePostalCode(postalCode);
+
+ delivery.setAddress(billing.getAddress());
+ delivery.setCompany(billing.getCompany());
+ delivery.setCity(billing.getCity());
+ delivery.setPostalCode(billing.getPostalCode());
+ delivery.setState(billing.getState());
+ delivery.setCountry(billing.getCountry());
+ delivery.setZone(billing.getZone());
+ } else {
+ delivery = customer.getDelivery();
+ }
+
+
+
+ ShippingQuote quote = shippingService.getShippingQuote(cart.getId(), store, delivery, shippingProducts, language);
+
+ return quote;
+
+ }
+
+ private String validatePostalCode(String postalCode) {
+
+ String patternString = "__";//this one is set in the template
+ if(postalCode.contains(patternString)) {
+ postalCode = null;
+ }
+ return postalCode;
+ }
+
+ @Override
+ public List<Country> getShipToCountry(MerchantStore store, Language language) throws Exception {
+
+ List<Country> shippingCountriesList = shippingService.getShipToCountryList(store, language);
+ return shippingCountriesList;
+
+ }
+
+
+
+
+ /**
+ * ShippingSummary contains the subset of information
+ * of a ShippingQuote
+ */
+ @Override
+ public ShippingSummary getShippingSummary(ShippingQuote quote,
+ MerchantStore store, Language language) {
+
+ ShippingSummary summary = null;
+ if(quote.getSelectedShippingOption()!=null) {
+
+
+ summary = new ShippingSummary();
+ summary.setFreeShipping(quote.isFreeShipping());
+ summary.setTaxOnShipping(quote.isApplyTaxOnShipping());
+ summary.setHandling(quote.getHandlingFees());
+ summary.setShipping(quote.getSelectedShippingOption().getOptionPrice());
+ summary.setShippingOption(quote.getSelectedShippingOption().getOptionName());
+ summary.setShippingModule(quote.getShippingModuleCode());
+ summary.setShippingOptionCode(quote.getSelectedShippingOption().getOptionCode());
+
+ if(quote.getDeliveryAddress()!=null) {
+
+ summary.setDeliveryAddress(quote.getDeliveryAddress());
+
+
+ }
+
+
+ }
+
+ return summary;
+ }
+
+ @Override
+ public void validateOrder(ShopOrder order, BindingResult bindingResult, Map<String,String> messagesResult, MerchantStore store, Locale locale) throws ServiceException {
+
+
+ Validate.notNull(messagesResult,"messagesResult should not be null");
+
+
+ try {
+
+
+ //Language language = (Language)request.getAttribute("LANGUAGE");
+
+ //validate order shipping and billing
+ if(StringUtils.isBlank(order.getCustomer().getBilling().getFirstName())) {
+ FieldError error = new FieldError("customer.billing.firstName","customer.billing.firstName",messages.getMessage("NotEmpty.customer.firstName", locale));
+ bindingResult.addError(error);
+ messagesResult.put("customer.billing.firstName",messages.getMessage("NotEmpty.customer.firstName", locale));
+ }
+
+ if(StringUtils.isBlank(order.getCustomer().getBilling().getLastName())) {
+ FieldError error = new FieldError("customer.billing.lastName","customer.billing.lastName",messages.getMessage("NotEmpty.customer.lastName", locale));
+ bindingResult.addError(error);
+ messagesResult.put("customer.billing.lastName",messages.getMessage("NotEmpty.customer.lastName", locale));
+ }
+
+ if(StringUtils.isBlank(order.getCustomer().getEmailAddress())) {
+ FieldError error = new FieldError("customer.emailAddress","customer.emailAddress",messages.getMessage("NotEmpty.customer.emailAddress", locale));
+ bindingResult.addError(error);
+ messagesResult.put("customer.emailAddress",messages.getMessage("NotEmpty.customer.emailAddress", locale));
+ }
+
+ if(StringUtils.isBlank(order.getCustomer().getBilling().getAddress())) {
+ FieldError error = new FieldError("customer.billing.address","customer.billing.address",messages.getMessage("NotEmpty.customer.billing.address", locale));
+ bindingResult.addError(error);
+ messagesResult.put("customer.billing.address",messages.getMessage("NotEmpty.customer.billing.address", locale));
+ }
+
+ if(StringUtils.isBlank(order.getCustomer().getBilling().getCity())) {
+ FieldError error = new FieldError("customer.billing.city","customer.billing.city",messages.getMessage("NotEmpty.customer.billing.city", locale));
+ bindingResult.addError(error);
+ messagesResult.put("customer.billing.city",messages.getMessage("NotEmpty.customer.billing.city", locale));
+ }
+
+ if(StringUtils.isBlank(order.getCustomer().getBilling().getCountry())) {
+ FieldError error = new FieldError("customer.billing.country","customer.billing.country",messages.getMessage("NotEmpty.customer.billing.country", locale));
+ bindingResult.addError(error);
+ messagesResult.put("customer.billing.country",messages.getMessage("NotEmpty.customer.billing.country", locale));
+ }
+
+ if(StringUtils.isBlank(order.getCustomer().getBilling().getZone()) && StringUtils.isBlank(order.getCustomer().getBilling().getStateProvince())) {
+ FieldError error = new FieldError("customer.billing.stateProvince","customer.billing.stateProvince",messages.getMessage("NotEmpty.customer.billing.stateProvince", locale));
+ bindingResult.addError(error);
+ messagesResult.put("customer.billing.stateProvince",messages.getMessage("NotEmpty.customer.billing.stateProvince", locale));
+ }
+
+ if(StringUtils.isBlank(order.getCustomer().getBilling().getPhone())) {
+ FieldError error = new FieldError("customer.billing.phone","customer.billing.phone",messages.getMessage("NotEmpty.customer.billing.phone", locale));
+ bindingResult.addError(error);
+ messagesResult.put("customer.billing.phone",messages.getMessage("NotEmpty.customer.billing.phone", locale));
+ }
+
+ if(StringUtils.isBlank(order.getCustomer().getBilling().getPostalCode())) {
+ FieldError error = new FieldError("customer.billing.postalCode","customer.billing.postalCode",messages.getMessage("NotEmpty.customer.billing.postalCode", locale));
+ bindingResult.addError(error);
+ messagesResult.put("customer.billing.postalCode",messages.getMessage("NotEmpty.customer.billing.postalCode", locale));
+ }
+
+ if(!order.isShipToBillingAdress()) {
+
+ if(StringUtils.isBlank(order.getCustomer().getDelivery().getFirstName())) {
+ FieldError error = new FieldError("customer.delivery.firstName","customer.delivery.firstName",messages.getMessage("NotEmpty.customer.shipping.firstName", locale));
+ bindingResult.addError(error);
+ messagesResult.put("customer.delivery.firstName",messages.getMessage("NotEmpty.customer.shipping.firstName", locale));
+ }
+
+ if(StringUtils.isBlank(order.getCustomer().getDelivery().getLastName())) {
+ FieldError error = new FieldError("customer.delivery.lastName","customer.delivery.lastName",messages.getMessage("NotEmpty.customer.shipping.lastName", locale));
+ bindingResult.addError(error);
+ messagesResult.put("customer.delivery.lastName",messages.getMessage("NotEmpty.customer.shipping.lastName", locale));
+ }
+
+ if(StringUtils.isBlank(order.getCustomer().getDelivery().getAddress())) {
+ FieldError error = new FieldError("customer.delivery.address","customer.delivery.address",messages.getMessage("NotEmpty.customer.shipping.address", locale));
+ bindingResult.addError(error);
+ messagesResult.put("customer.delivery.address",messages.getMessage("NotEmpty.customer.shipping.address", locale));
+ }
+
+ if(StringUtils.isBlank(order.getCustomer().getDelivery().getCity())) {
+ FieldError error = new FieldError("customer.delivery.city","customer.delivery.city",messages.getMessage("NotEmpty.customer.shipping.city", locale));
+ bindingResult.addError(error);
+ messagesResult.put("customer.delivery.city",messages.getMessage("NotEmpty.customer.shipping.city", locale));
+ }
+
+ if(StringUtils.isBlank(order.getCustomer().getDelivery().getCountry())) {
+ FieldError error = new FieldError("customer.delivery.country","customer.delivery.country",messages.getMessage("NotEmpty.customer.shipping.country", locale));
+ bindingResult.addError(error);
+ messagesResult.put("customer.delivery.country",messages.getMessage("NotEmpty.customer.shipping.country", locale));
+ }
+
+ if(StringUtils.isBlank(order.getCustomer().getDelivery().getZone()) && StringUtils.isBlank(order.getCustomer().getDelivery().getStateProvince())) {
+ FieldError error = new FieldError("customer.delivery.stateProvince","customer.delivery.stateProvince",messages.getMessage("NotEmpty.customer.shipping.stateProvince", locale));
+ bindingResult.addError(error);
+ messagesResult.put("customer.delivery.stateProvince",messages.getMessage("NotEmpty.customer.shipping.stateProvince", locale));
+ }
+
+
+ if(StringUtils.isBlank(order.getCustomer().getDelivery().getPostalCode())) {
+ FieldError error = new FieldError("customer.delivery.postalCode","customer.delivery.postalCode",messages.getMessage("NotEmpty.customer.shipping.postalCode", locale));
+ bindingResult.addError(error);
+ messagesResult.put("customer.delivery.postalCode",messages.getMessage("NotEmpty.customer.shipping.postalCode", locale));
+ }
+
+ }
+
+ if ( bindingResult.hasErrors() )
+ {
+ return;
+
+ }
+
+ String paymentType = order.getPaymentMethodType();
+
+ if(!shoppingCartService.isFreeShoppingCart(order.getShoppingCartItems()) && paymentType==null) {
+
+ }
+
+ //validate payment
+ if(paymentType==null) {
+ ServiceException serviceException = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"payment.required");
+ throw serviceException;
+ }
+
+ //validate shipping
+ if(shippingService.requiresShipping(order.getShoppingCartItems(), store) && order.getSelectedShippingOption()==null) {
+ ServiceException serviceException = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"shipping.required");
+ throw serviceException;
+ }
+
+ //pre-validate credit card
+ if(PaymentType.CREDITCARD.name().equals(paymentType) && "true".equals(coreConfiguration.getProperty("VALIDATE_CREDIT_CARD"))) {
+ String cco = order.getPayment().get("creditcard_card_holder");
+ String cvv = order.getPayment().get("creditcard_card_cvv");
+ String ccn = order.getPayment().get("creditcard_card_number");
+ String ccm = order.getPayment().get("creditcard_card_expirationmonth");
+ String ccd = order.getPayment().get("creditcard_card_expirationyear");
+
+ if(StringUtils.isBlank(cco) || StringUtils.isBlank(cvv) || StringUtils.isBlank(ccn) ||
+ StringUtils.isBlank(ccm) || StringUtils.isBlank(ccd)) {
+ ObjectError error = new ObjectError("creditcard",messages.getMessage("messages.error.creditcard", locale));
+ bindingResult.addError(error);
+ messagesResult.put("creditcard",messages.getMessage("messages.error.creditcard", locale));
+ return;
+ }
+
+ CreditCardType creditCardType =null;
+ String cardType = order.getPayment().get("creditcard_card_type");
+
+ if(cardType.equalsIgnoreCase(CreditCardType.AMEX.name())) {
+ creditCardType = CreditCardType.AMEX;
+ } else if(cardType.equalsIgnoreCase(CreditCardType.VISA.name())) {
+ creditCardType = CreditCardType.VISA;
+ } else if(cardType.equalsIgnoreCase(CreditCardType.MASTERCARD.name())) {
+ creditCardType = CreditCardType.MASTERCARD;
+ } else if(cardType.equalsIgnoreCase(CreditCardType.DINERS.name())) {
+ creditCardType = CreditCardType.DINERS;
+ } else if(cardType.equalsIgnoreCase(CreditCardType.DISCOVERY.name())) {
+ creditCardType = CreditCardType.DISCOVERY;
+ }
+
+ if(creditCardType==null) {
+ ServiceException serviceException = new ServiceException(ServiceException.EXCEPTION_VALIDATION,"cc.type");
+ throw serviceException;
+ }
+
+ }
+
+
+
+
+
+
+
+ } catch(ServiceException se) {
+ LOGGER.error("Error while commiting order",se);
+ throw se;
+ }
+
+}
+
+
+
+ @Override
+ public ReadableOrderList getReadableOrderList(MerchantStore store,
+ Customer customer, int start, int maxCount, Language language) throws Exception {
+
+ OrderCriteria criteria = new OrderCriteria();
+ criteria.setStartIndex(start);
+ criteria.setMaxCount(maxCount);
+ criteria.setCustomerId(customer.getId());
+
+ return this.getReadableOrderList(criteria, store, language);
+
+ }
+
+
+
+ @Override
+ public ShippingQuote getShippingQuote(Customer customer, ShoppingCart cart,
+ PersistableOrder order, MerchantStore store, Language language)
+ throws Exception {
+ //create shipping products
+ List<ShippingProduct> shippingProducts = shoppingCartService.createShippingProduct(cart);
+
+ if(CollectionUtils.isEmpty(shippingProducts)) {
+ return null;//products are virtual
+ }
+
+
+
+ Delivery delivery = new Delivery();
+
+ //adjust shipping and billing
+ if(order.isShipToBillingAdress()) {
+ Billing billing = customer.getBilling();
+ delivery.setAddress(billing.getAddress());
+ delivery.setCity(billing.getCity());
+ delivery.setCompany(billing.getCompany());
+ delivery.setPostalCode(billing.getPostalCode());
+ delivery.setState(billing.getState());
+ delivery.setCountry(billing.getCountry());
+ delivery.setZone(billing.getZone());
+ } else {
+ delivery = customer.getDelivery();
+ }
+
+
+
+ ShippingQuote quote = shippingService.getShippingQuote(cart.getId(), store, delivery, shippingProducts, language);
+
+ return quote;
+ }
+
+
+
+ private ReadableOrderList populateOrderList(final OrderList orderList,final MerchantStore store, final Language language){
+ List<Order> orders = orderList.getOrders();
+ ReadableOrderList returnList = new ReadableOrderList();
+ if(CollectionUtils.isEmpty( orders)){
+ LOGGER.info( "Order list if empty..Returning empty list" );
+ returnList.setTotal(0);
+ returnList.setMessage("No results for store code " + store);
+ return returnList;
+ }
+
+ ReadableOrderPopulator orderPopulator = new ReadableOrderPopulator();
+ Locale locale = LocaleUtils.getLocale(language);
+ orderPopulator.setLocale(locale);
+
+ List<ReadableOrder> readableOrders = new ArrayList<ReadableOrder>();
+ for (Order order : orders) {
+ ReadableOrder readableOrder = new ReadableOrder();
+ try
+ {
+ orderPopulator.populate(order,readableOrder,store,language);
+ setOrderProductList(order,locale,store,language,readableOrder);
+ }
+ catch ( ConversionException ex )
+ {
+ LOGGER.error( "Error while converting order to order data", ex );
+
+ }
+ readableOrders.add(readableOrder);
+
+ }
+
+ returnList.setTotal(orderList.getTotalCount());
+ returnList.setOrders( readableOrders );
+ return returnList;
+
+ }
+
+ private void setOrderProductList(final Order order, final Locale locale,final MerchantStore store, final Language language , final ReadableOrder readableOrder) throws ConversionException{
+ List<ReadableOrderProduct> orderProducts = new ArrayList<ReadableOrderProduct>();
+ for(OrderProduct p : order.getOrderProducts()) {
+ ReadableOrderProductPopulator orderProductPopulator = new ReadableOrderProductPopulator();
+ orderProductPopulator.setLocale(locale);
+ orderProductPopulator.setProductService(productService);
+ orderProductPopulator.setPricingService(pricingService);
+ orderProductPopulator.setimageUtils(imageUtils);
+ ReadableOrderProduct orderProduct = new ReadableOrderProduct();
+ orderProductPopulator.populate(p, orderProduct, store, language);
+
+ //image
+
+ //attributes
+
+
+
+ orderProducts.add(orderProduct);
+ }
+
+ readableOrder.setProducts(orderProducts);
+ }
+
+
+ private ReadableOrderList getReadableOrderList(OrderCriteria criteria, MerchantStore store, Language language) throws Exception {
+
+ OrderList orderList = orderService.listByStore(store, criteria);
+
+ ReadableOrderPopulator orderPopulator = new ReadableOrderPopulator();
+ Locale locale = LocaleUtils.getLocale(language);
+ orderPopulator.setLocale(locale);
+
+ List<Order> orders = orderList.getOrders();
+ ReadableOrderList returnList = new ReadableOrderList();
+
+ if(CollectionUtils.isEmpty(orders)) {
+ returnList.setTotal(0);
+ returnList.setMessage("No results for store code " + store);
+ return null;
+ }
+
+ List<ReadableOrder> readableOrders = new ArrayList<ReadableOrder>();
+ for (Order order : orders) {
+ ReadableOrder readableOrder = new ReadableOrder();
+ orderPopulator.populate(order,readableOrder,store,language);
+ readableOrders.add(readableOrder);
+
+ }
+
+ returnList.setTotal(orderList.getTotalCount());
+ return this.populateOrderList(orderList, store, language);
+
+
+ }
+
+ @Override
+ public ReadableOrderList getReadableOrderList(MerchantStore store,
+ int start, int maxCount, Language language) throws Exception {
+
+ OrderCriteria criteria = new OrderCriteria();
+ criteria.setStartIndex(start);
+ criteria.setMaxCount(maxCount);
+
+ return this.getReadableOrderList(criteria, store, language);
+ }
+
+
+
+ @Override
+ public ReadableOrder getReadableOrder(Long orderId, MerchantStore store,
+ Language language) throws Exception {
+
+
+
+ Order modelOrder = orderService.getById(orderId);
+ if(modelOrder==null) {
+ throw new Exception("Order not found with id " + orderId);
+ }
+
+ ReadableOrder readableOrder = new ReadableOrder();
+
+ Long customerId = modelOrder.getCustomerId();
+ if(customerId != null) {
+ ReadableCustomer readableCustomer = customerFacade.getCustomerById(customerId, store, language);
+ if(readableCustomer==null) {
+ LOGGER.warn("Customer id " + customerId + " not found in order " + orderId);
+ } else {
+ readableOrder.setCustomer(readableCustomer);
+ }
+ }
+
+ ReadableOrderPopulator orderPopulator = new ReadableOrderPopulator();
+ orderPopulator.populate(modelOrder, readableOrder, store, language);
+
+ //order products
+ List<ReadableOrderProduct> orderProducts = new ArrayList<ReadableOrderProduct>();
+ for(OrderProduct p : modelOrder.getOrderProducts()) {
+ ReadableOrderProductPopulator orderProductPopulator = new ReadableOrderProductPopulator();
+ orderProductPopulator.setProductService(productService);
+ orderProductPopulator.setPricingService(pricingService);
+ orderProductPopulator.setimageUtils(imageUtils);
+
+ ReadableOrderProduct orderProduct = new ReadableOrderProduct();
+ orderProductPopulator.populate(p, orderProduct, store, language);
+ orderProducts.add(orderProduct);
+ }
+
+ readableOrder.setProducts(orderProducts);
+
+ return readableOrder;
+ }
+
+
+ @Override
+ public ShippingQuote getShippingQuote(Customer customer, ShoppingCart cart, MerchantStore store, Language language)
+ throws Exception {
+
+ Validate.notNull(customer,"Customer cannot be null");
+ Validate.notNull(cart,"cart cannot be null");
+
+
+ //create shipping products
+ List<ShippingProduct> shippingProducts = shoppingCartService.createShippingProduct(cart);
+
+ if(CollectionUtils.isEmpty(shippingProducts)) {
+ return null;//products are virtual
+ }
+
+
+
+ Delivery delivery = new Delivery();
+
+ //adjust shipping and billing
+ if(customer.getDelivery() == null || StringUtils.isBlank(customer.getDelivery().getPostalCode())) {
+ Billing billing = customer.getBilling();
+ delivery.setAddress(billing.getAddress());
+ delivery.setCity(billing.getCity());
+ delivery.setCompany(billing.getCompany());
+ delivery.setPostalCode(billing.getPostalCode());
+ delivery.setState(billing.getState());
+ delivery.setCountry(billing.getCountry());
+ delivery.setZone(billing.getZone());
+ } else {
+ delivery = customer.getDelivery();
+ }
+
+ ShippingQuote quote = shippingService.getShippingQuote(cart.getId(), store, delivery, shippingProducts, language);
+ return quote;
+ }
+
+
+
+ @Override
+ public Order processOrder(PersistableOrderApi order, Customer customer, MerchantStore store, Language language, Locale locale)
+ throws ServiceException {
+
+ PersistableOrderApiPopulator populator = new PersistableOrderApiPopulator();
+ populator.setCurrencyService(currencyService);
+ populator.setCustomerService(customerService);
+ populator.setDigitalProductService(digitalProductService);
+ populator.setProductAttributeService(productAttributeService);
+ populator.setProductService(productService);
+ populator.setShoppingCartService(shoppingCartService);
+
+
+ try {
+
+ Order modelOrder = new Order();
+ populator.populate(order, modelOrder,store, language);
+
+ Long shoppingCartId = order.getShoppingCartId();
+ ShoppingCart cart = shoppingCartService.getById(shoppingCartId, store);
+
+ if(cart == null) {
+ throw new ServiceException("Shopping cart with id " + shoppingCartId + " does not exist");
+ }
+
+ Set<ShoppingCartItem> shoppingCartItems = cart.getLineItems();
+
+ List<ShoppingCartItem> items = new ArrayList<ShoppingCartItem>(shoppingCartItems);
+
+ Set<OrderProduct> orderProducts = new LinkedHashSet<OrderProduct>();
+
+ OrderProductPopulator orderProductPopulator = new OrderProductPopulator();
+ orderProductPopulator.setDigitalProductService(digitalProductService);
+ orderProductPopulator.setProductAttributeService(productAttributeService);
+ orderProductPopulator.setProductService(productService);
+
+ for(ShoppingCartItem item : shoppingCartItems) {
+ OrderProduct orderProduct = new OrderProduct();
+ orderProduct = orderProductPopulator.populate(item, orderProduct , store, language);
+ orderProduct.setOrder(modelOrder);
+ orderProducts.add(orderProduct);
+ }
+
+ modelOrder.setOrderProducts(orderProducts);
+
+ if(order.getAttributes() != null && order.getAttributes().size() > 0) {
+ Set<OrderAttribute> attrs = new HashSet<OrderAttribute>();
+ for(com.salesmanager.shop.model.order.OrderAttribute attribute : order.getAttributes()) {
+ OrderAttribute attr = new OrderAttribute();
+ attr.setKey(attribute.getKey());
+ attr.setValue(attribute.getValue());
+ attr.setOrder(modelOrder);
+ attrs.add(attr);
+ }
+ modelOrder.setOrderAttributes(attrs);
+ }
+
+ //requires Shipping information (need a quote id calculated)
+ ShippingSummary shippingSummary = null;
+
+ //get shipping quote if asked for
+ if(order.getShippingQuote()!=null && order.getShippingQuote().longValue()>0) {
+ shippingSummary = shippingQuoteService.getShippingSummary(order.getShippingQuote(), store);
+ if(shippingSummary != null) {
+ modelOrder.setShippingModuleCode(shippingSummary.getShippingModule());
+ }
+ }
+
+ //requires Order Totals, this needs recalculation and then compare total with the amount sent as part
+ //of process order request. If totals does not match, an error should be thrown.
+
+ OrderTotalSummary orderTotalSummary = null;
+
+ OrderSummary orderSummary = new OrderSummary();
+ orderSummary.setShippingSummary(shippingSummary);
+ List<ShoppingCartItem> itemsSet = new ArrayList<ShoppingCartItem>(cart.getLineItems());
+ orderSummary.setProducts(itemsSet);
+
+ orderTotalSummary = orderService.caculateOrderTotal(orderSummary, customer, store, language);
+
+ if(order.getPayment().getAmount()==null) {
+ throw new ConversionException("Requires Payment.amount");
+ }
+
+ String submitedAmount = order.getPayment().getAmount();
+
+
+ BigDecimal calculatedAmount = orderTotalSummary.getTotal();
+ String strCalculatedTotal = pricingService.getStringAmount(calculatedAmount, store);
+
+ //compare both prices
+ if(!submitedAmount.equals(strCalculatedTotal)) {
+ throw new ConversionException("Payment.amount does not match what the system has calculated " + strCalculatedTotal + " please recalculate the order and submit again");
+ }
+
+ modelOrder.setTotal(calculatedAmount);
+ List<com.salesmanager.core.model.order.OrderTotal> totals = orderTotalSummary.getTotals();
+ Set<com.salesmanager.core.model.order.OrderTotal> set = new HashSet<com.salesmanager.core.model.order.OrderTotal>();
+
+ if(!CollectionUtils.isEmpty(totals)) {
+ for(com.salesmanager.core.model.order.OrderTotal total : totals) {
+ total.setOrder(modelOrder);
+ set.add(total);
+ }
+ }
+ modelOrder.setOrderTotal(set);
+
+ PersistablePaymentPopulator paymentPopulator = new PersistablePaymentPopulator();
+ paymentPopulator.setPricingService(pricingService);
+ Payment paymentModel = new Payment();
+ paymentPopulator.populate(order.getPayment(), paymentModel, store, language);
+
+ modelOrder = orderService.processOrder(modelOrder, customer, items, orderTotalSummary, paymentModel, store);
+
+
+ //delete cart
+ try {
+ shoppingCartFacade.deleteShoppingCart(cart.getShoppingCartCode(), store);
+ } catch(Exception e) {
+ LOGGER.error("Cannot delete cart " + cart.getId(), e);
+ }
+
+ if("true".equals(coreConfiguration.getProperty("ORDER_EMAIL_API"))) {
+ //send email
+ try {
+
+ //send order confirmation email to customer
+ emailTemplatesUtils.sendOrderEmail(customer.getEmailAddress(), customer, modelOrder, locale, language, store, coreConfiguration.getProperty("CONTEXT_PATH"));
+
+ if(orderService.hasDownloadFiles(modelOrder)) {
+ emailTemplatesUtils.sendOrderDownloadEmail(customer, modelOrder, store, locale, coreConfiguration.getProperty("CONTEXT_PATH"));
+ }
+
+ //send order confirmation email to merchant
+ emailTemplatesUtils.sendOrderEmail(store.getStoreEmailAddress(), customer, modelOrder, locale, language, store, coreConfiguration.getProperty("CONTEXT_PATH"));
+
+
+ } catch(Exception e) {
+ LOGGER.error("Cannot send order confirmation email", e);
+ }
+ }
+
+ return modelOrder;
+
+ } catch(Exception e) {
+ throw new ServiceException(e);
+ }
+
+ }
+
+
+
+ @Override
+ public ReadableOrderList getCapturableOrderList(MerchantStore store, Date startDate, Date endDate,
+ Language language) throws Exception {
+
+ //get all transactions for the given date
+ List<Order> orders = orderService.getCapturableOrders(store, startDate, endDate);
+
+ ReadableOrderPopulator orderPopulator = new ReadableOrderPopulator();
+ Locale locale = LocaleUtils.getLocale(language);
+ orderPopulator.setLocale(locale);
+
+ ReadableOrderList returnList = new ReadableOrderList();
+
+ if(CollectionUtils.isEmpty(orders)) {
+ returnList.setTotal(0);
+ returnList.setMessage("No results for store code " + store);
+ return null;
+ }
+
+ List<ReadableOrder> readableOrders = new ArrayList<ReadableOrder>();
+ for (Order order : orders) {
+ ReadableOrder readableOrder = new ReadableOrder();
+ orderPopulator.populate(order,readableOrder,store,language);
+ readableOrders.add(readableOrder);
+
+ }
+
+ returnList.setTotal(orders.size());
+ returnList.setOrders(readableOrders);
+
+ return returnList;
+ }
+
+
+
+ @Override
+ public ReadableTransaction captureOrder(MerchantStore store, Order order, Customer customer, Language language) throws Exception {
+ Transaction transactionModel = paymentService.processCapturePayment(order, customer, store);
+
+ ReadableTransaction transaction = new ReadableTransaction();
+ ReadableTransactionPopulator trxPopulator = new ReadableTransactionPopulator();
+ trxPopulator.setOrderService(orderService);
+ trxPopulator.setPricingService(pricingService);
+
+ trxPopulator.populate(transactionModel, transaction, store, language);
+
+ return transaction;
+
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/ShoppingOrderConfirmationController.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/ShoppingOrderConfirmationController.java
index dc8c323..cd2f34e 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/ShoppingOrderConfirmationController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/ShoppingOrderConfirmationController.java
@@ -1,195 +1,195 @@
-package com.salesmanager.shop.store.controller.order;
-
-import com.salesmanager.core.business.services.catalog.product.PricingService;
-import com.salesmanager.core.business.services.catalog.product.ProductService;
-import com.salesmanager.core.business.services.order.OrderService;
-import com.salesmanager.core.business.services.order.orderproduct.OrderProductDownloadService;
-import com.salesmanager.core.business.services.payments.PaymentService;
-import com.salesmanager.core.business.services.reference.country.CountryService;
-import com.salesmanager.core.business.services.reference.zone.ZoneService;
-import com.salesmanager.core.business.services.shipping.ShippingService;
-import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.Order;
-import com.salesmanager.core.model.order.orderproduct.OrderProductDownload;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.reference.zone.Zone;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.model.order.ReadableOrder;
-import com.salesmanager.shop.model.order.ReadableOrderProductDownload;
-import com.salesmanager.shop.populator.order.ReadableOrderProductDownloadPopulator;
-import com.salesmanager.shop.store.controller.AbstractController;
-import com.salesmanager.shop.store.controller.ControllerConstants;
-import com.salesmanager.shop.store.controller.customer.facade.CustomerFacade;
-import com.salesmanager.shop.store.controller.order.facade.OrderFacade;
-import com.salesmanager.shop.store.controller.shoppingCart.facade.ShoppingCartFacade;
-import com.salesmanager.shop.utils.LabelUtils;
-import org.apache.commons.collections4.CollectionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-@Controller
-@RequestMapping(Constants.SHOP_URI+"/order")
-public class ShoppingOrderConfirmationController extends AbstractController {
-
- private static final Logger LOGGER = LoggerFactory
- .getLogger(ShoppingOrderConfirmationController.class);
-
- @Inject
- private ShoppingCartFacade shoppingCartFacade;
-
- @Inject
- private ShoppingCartService shoppingCartService;
-
-
-
- @Inject
- private PaymentService paymentService;
-
- @Inject
- private ShippingService shippingService;
-
-
- @Inject
- private OrderService orderService;
-
- @Inject
- private ProductService productService;
-
- @Inject
- private CountryService countryService;
-
- @Inject
- private ZoneService zoneService;
-
- @Inject
- private OrderFacade orderFacade;
-
- @Inject
- private LabelUtils messages;
-
- @Inject
- private PricingService pricingService;
-
- @Inject
- private CustomerFacade customerFacade;
-
- @Inject
- private AuthenticationManager customerAuthenticationManager;
-
- @Inject
- private OrderProductDownloadService orderProdctDownloadService;
-
- /**
- * Invoked once the payment is complete and order is fulfilled
- * @param model
- * @param request
- * @param response
- * @param locale
- * @return
- * @throws Exception
- */
- @RequestMapping("/confirmation.html")
- public String displayConfirmation(Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- Language language = (Language)request.getAttribute("LANGUAGE");
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
-
- Long orderId = super.getSessionAttribute(Constants.ORDER_ID, request);
- if(orderId==null) {
- return new StringBuilder().append("redirect:").append(Constants.SHOP_URI).toString();
- }
-
- //get the order
- Order order = orderService.getById(orderId);
- if(order == null) {
- LOGGER.warn("Order id [" + orderId + "] does not exist");
- throw new Exception("Order id [" + orderId + "] does not exist");
- }
-
- if(order.getMerchant().getId().intValue()!=store.getId().intValue()) {
- LOGGER.warn("Store id [" + store.getId() + "] differs from order.store.id [" + order.getMerchant().getId() + "]");
- return new StringBuilder().append("redirect:").append(Constants.SHOP_URI).toString();
- }
-
- if(super.getSessionAttribute(Constants.ORDER_ID_TOKEN, request)!=null) {
- //set this unique token for performing unique operations in the confirmation
- model.addAttribute("confirmation", "confirmation");
- }
-
- //remove unique token
- super.removeAttribute(Constants.ORDER_ID_TOKEN, request);
-
-
- String[] orderMessageParams = {store.getStorename()};
- String orderMessage = messages.getMessage("label.checkout.text", orderMessageParams, locale);
- model.addAttribute("ordermessage", orderMessage);
-
- String[] orderIdParams = {String.valueOf(order.getId())};
- String orderMessageId = messages.getMessage("label.checkout.orderid", orderIdParams, locale);
- model.addAttribute("ordermessageid", orderMessageId);
-
- String[] orderEmailParams = {order.getCustomerEmailAddress()};
- String orderEmailMessage = messages.getMessage("label.checkout.email", orderEmailParams, locale);
- model.addAttribute("orderemail", orderEmailMessage);
-
- ReadableOrder readableOrder = orderFacade.getReadableOrder(orderId, store, language);
-
-
-
- //resolve country and Zone for GA
- String countryCode = readableOrder.getCustomer().getBilling().getCountry();
- Map<String,Country> countriesMap = countryService.getCountriesMap(language);
- Country billingCountry = countriesMap.get(countryCode);
- if(billingCountry!=null) {
- readableOrder.getCustomer().getBilling().setCountry(billingCountry.getName());
- }
-
- String zoneCode = readableOrder.getCustomer().getBilling().getZone();
- Map<String,Zone> zonesMap = zoneService.getZones(language);
- Zone billingZone = zonesMap.get(zoneCode);
- if(billingZone!=null) {
- readableOrder.getCustomer().getBilling().setZone(billingZone.getName());
- }
-
-
- model.addAttribute("order",readableOrder);
-
- //check if any downloads exist for this order
- List<OrderProductDownload> orderProductDownloads = orderProdctDownloadService.getByOrderId(order.getId());
- if(CollectionUtils.isNotEmpty(orderProductDownloads)) {
- ReadableOrderProductDownloadPopulator populator = new ReadableOrderProductDownloadPopulator();
- List<ReadableOrderProductDownload> downloads = new ArrayList<ReadableOrderProductDownload>();
- for(OrderProductDownload download : orderProductDownloads) {
- ReadableOrderProductDownload view = new ReadableOrderProductDownload();
- populator.populate(download, view, store, language);
- downloads.add(view);
- }
- model.addAttribute("downloads", downloads);
- }
-
-
- /** template **/
- StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Checkout.confirmation).append(".").append(store.getStoreTemplate());
- return template.toString();
-
-
- }
-
-
-
-
-}
+package com.salesmanager.shop.store.controller.order;
+
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.order.OrderService;
+import com.salesmanager.core.business.services.order.orderproduct.OrderProductDownloadService;
+import com.salesmanager.core.business.services.payments.PaymentService;
+import com.salesmanager.core.business.services.reference.country.CountryService;
+import com.salesmanager.core.business.services.reference.zone.ZoneService;
+import com.salesmanager.core.business.services.shipping.ShippingService;
+import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.order.orderproduct.OrderProductDownload;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.reference.zone.Zone;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.model.order.ReadableOrder;
+import com.salesmanager.shop.model.order.ReadableOrderProductDownload;
+import com.salesmanager.shop.populator.order.ReadableOrderProductDownloadPopulator;
+import com.salesmanager.shop.store.controller.AbstractController;
+import com.salesmanager.shop.store.controller.ControllerConstants;
+import com.salesmanager.shop.store.controller.customer.facade.CustomerFacade;
+import com.salesmanager.shop.store.controller.order.facade.OrderFacade;
+import com.salesmanager.shop.store.controller.shoppingCart.facade.ShoppingCartFacade;
+import com.salesmanager.shop.utils.LabelUtils;
+import org.apache.commons.collections4.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+@Controller
+@RequestMapping(Constants.SHOP_URI+"/order")
+public class ShoppingOrderConfirmationController extends AbstractController {
+
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(ShoppingOrderConfirmationController.class);
+
+ @Inject
+ private ShoppingCartFacade shoppingCartFacade;
+
+ @Inject
+ private ShoppingCartService shoppingCartService;
+
+
+
+ @Inject
+ private PaymentService paymentService;
+
+ @Inject
+ private ShippingService shippingService;
+
+
+ @Inject
+ private OrderService orderService;
+
+ @Inject
+ private ProductService productService;
+
+ @Inject
+ private CountryService countryService;
+
+ @Inject
+ private ZoneService zoneService;
+
+ @Inject
+ private OrderFacade orderFacade;
+
+ @Inject
+ private LabelUtils messages;
+
+ @Inject
+ private PricingService pricingService;
+
+ @Inject
+ private CustomerFacade customerFacade;
+
+ @Inject
+ private AuthenticationManager customerAuthenticationManager;
+
+ @Inject
+ private OrderProductDownloadService orderProdctDownloadService;
+
+ /**
+ * Invoked once the payment is complete and order is fulfilled
+ * @param model
+ * @param request
+ * @param response
+ * @param locale
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping("/confirmation.html")
+ public String displayConfirmation(Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ Language language = (Language)request.getAttribute("LANGUAGE");
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+
+ Long orderId = super.getSessionAttribute(Constants.ORDER_ID, request);
+ if(orderId==null) {
+ return new StringBuilder().append("redirect:").append(Constants.SHOP_URI).toString();
+ }
+
+ //get the order
+ Order order = orderService.getById(orderId);
+ if(order == null) {
+ LOGGER.warn("Order id [" + orderId + "] does not exist");
+ throw new Exception("Order id [" + orderId + "] does not exist");
+ }
+
+ if(order.getMerchant().getId().intValue()!=store.getId().intValue()) {
+ LOGGER.warn("Store id [" + store.getId() + "] differs from order.store.id [" + order.getMerchant().getId() + "]");
+ return new StringBuilder().append("redirect:").append(Constants.SHOP_URI).toString();
+ }
+
+ if(super.getSessionAttribute(Constants.ORDER_ID_TOKEN, request)!=null) {
+ //set this unique token for performing unique operations in the confirmation
+ model.addAttribute("confirmation", "confirmation");
+ }
+
+ //remove unique token
+ super.removeAttribute(Constants.ORDER_ID_TOKEN, request);
+
+
+ String[] orderMessageParams = {store.getStorename()};
+ String orderMessage = messages.getMessage("label.checkout.text", orderMessageParams, locale);
+ model.addAttribute("ordermessage", orderMessage);
+
+ String[] orderIdParams = {String.valueOf(order.getId())};
+ String orderMessageId = messages.getMessage("label.checkout.orderid", orderIdParams, locale);
+ model.addAttribute("ordermessageid", orderMessageId);
+
+ String[] orderEmailParams = {order.getCustomerEmailAddress()};
+ String orderEmailMessage = messages.getMessage("label.checkout.email", orderEmailParams, locale);
+ model.addAttribute("orderemail", orderEmailMessage);
+
+ ReadableOrder readableOrder = orderFacade.getReadableOrder(orderId, store, language);
+
+
+
+ //resolve country and Zone for GA
+ String countryCode = readableOrder.getCustomer().getBilling().getCountry();
+ Map<String,Country> countriesMap = countryService.getCountriesMap(language);
+ Country billingCountry = countriesMap.get(countryCode);
+ if(billingCountry!=null) {
+ readableOrder.getCustomer().getBilling().setCountry(billingCountry.getName());
+ }
+
+ String zoneCode = readableOrder.getCustomer().getBilling().getZone();
+ Map<String,Zone> zonesMap = zoneService.getZones(language);
+ Zone billingZone = zonesMap.get(zoneCode);
+ if(billingZone!=null) {
+ readableOrder.getCustomer().getBilling().setZone(billingZone.getName());
+ }
+
+
+ model.addAttribute("order",readableOrder);
+
+ //check if any downloads exist for this order
+ List<OrderProductDownload> orderProductDownloads = orderProdctDownloadService.getByOrderId(order.getId());
+ if(CollectionUtils.isNotEmpty(orderProductDownloads)) {
+ ReadableOrderProductDownloadPopulator populator = new ReadableOrderProductDownloadPopulator();
+ List<ReadableOrderProductDownload> downloads = new ArrayList<ReadableOrderProductDownload>();
+ for(OrderProductDownload download : orderProductDownloads) {
+ ReadableOrderProductDownload view = new ReadableOrderProductDownload();
+ populator.populate(download, view, store, language);
+ downloads.add(view);
+ }
+ model.addAttribute("downloads", downloads);
+ }
+
+
+ /** template **/
+ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Checkout.confirmation).append(".").append(store.getStoreTemplate());
+ return template.toString();
+
+
+ }
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/ShoppingOrderController.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/ShoppingOrderController.java
index 7fdd8da..0ec6e5f 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/ShoppingOrderController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/ShoppingOrderController.java
@@ -1,1251 +1,1262 @@
-package com.salesmanager.shop.store.controller.order;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.catalog.product.PricingService;
-import com.salesmanager.core.business.services.catalog.product.ProductService;
-import com.salesmanager.core.business.services.customer.CustomerService;
-import com.salesmanager.core.business.services.order.OrderService;
-import com.salesmanager.core.business.services.order.orderproduct.OrderProductDownloadService;
-import com.salesmanager.core.business.services.payments.PaymentService;
-import com.salesmanager.core.business.services.reference.country.CountryService;
-import com.salesmanager.core.business.services.reference.zone.ZoneService;
-import com.salesmanager.core.business.services.shipping.ShippingService;
-import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.common.Billing;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.Order;
-import com.salesmanager.core.model.order.OrderTotal;
-import com.salesmanager.core.model.order.OrderTotalSummary;
-import com.salesmanager.core.model.order.orderproduct.OrderProductDownload;
-import com.salesmanager.core.model.payments.PaymentMethod;
-import com.salesmanager.core.model.payments.Transaction;
-import com.salesmanager.core.model.reference.country.Country;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.reference.zone.Zone;
-import com.salesmanager.core.model.shipping.ShippingMetaData;
-import com.salesmanager.core.model.shipping.ShippingOption;
-import com.salesmanager.core.model.shipping.ShippingQuote;
-import com.salesmanager.core.model.shipping.ShippingSummary;
-import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
-import com.salesmanager.shop.admin.model.userpassword.UserReset;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.model.customer.AnonymousCustomer;
-import com.salesmanager.shop.model.customer.PersistableCustomer;
-import com.salesmanager.shop.model.customer.ReadableDelivery;
-import com.salesmanager.shop.model.order.ReadableOrderTotal;
-import com.salesmanager.shop.model.order.ReadableShippingSummary;
-import com.salesmanager.shop.model.order.ReadableShopOrder;
-import com.salesmanager.shop.model.order.ShopOrder;
-import com.salesmanager.shop.model.shoppingcart.ShoppingCartData;
-import com.salesmanager.shop.populator.customer.ReadableCustomerDeliveryAddressPopulator;
-import com.salesmanager.shop.populator.order.ReadableOrderTotalPopulator;
-import com.salesmanager.shop.populator.order.ReadableShippingSummaryPopulator;
-import com.salesmanager.shop.populator.order.ReadableShopOrderPopulator;
-import com.salesmanager.shop.store.controller.AbstractController;
-import com.salesmanager.shop.store.controller.ControllerConstants;
-import com.salesmanager.shop.store.controller.customer.facade.CustomerFacade;
-import com.salesmanager.shop.store.controller.order.facade.OrderFacade;
-import com.salesmanager.shop.store.controller.shoppingCart.facade.ShoppingCartFacade;
-import com.salesmanager.shop.utils.EmailTemplatesUtils;
-import com.salesmanager.shop.utils.LabelUtils;
-
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.Validate;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.authentication.AuthenticationManager;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.crypto.password.PasswordEncoder;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.validation.BindingResult;
-import org.springframework.web.bind.annotation.*;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
-import java.util.*;
-
-
-/**
- * Displays checkout form and deals with ajax user input
- * @author carlsamson
- *
- */
-@Controller
-@RequestMapping(Constants.SHOP_URI+"/order")
-public class ShoppingOrderController extends AbstractController {
-
- private static final Logger LOGGER = LoggerFactory
- .getLogger(ShoppingOrderController.class);
-
- @Inject
- private ShoppingCartFacade shoppingCartFacade;
-
- @Inject
- private ShoppingCartService shoppingCartService;
-
- @Inject
- private PaymentService paymentService;
-
- @Inject
- private CustomerService customerService;
-
- @Inject
- private ShippingService shippingService;
-
- @Inject
- private OrderService orderService;
-
- @Inject
- private CountryService countryService;
-
- @Inject
- private ZoneService zoneService;
-
- @Inject
- private OrderFacade orderFacade;
-
- @Inject
- private CustomerFacade customerFacade;
-
- @Inject
- private LabelUtils messages;
-
- @Inject
- private PricingService pricingService;
-
- @Inject
- private ProductService productService;
-
- @Inject
- private PasswordEncoder passwordEncoder;
-
- @Inject
- private AuthenticationManager customerAuthenticationManager;
-
- @Inject
- private EmailTemplatesUtils emailTemplatesUtils;
-
- @Inject
- private OrderProductDownloadService orderProdctDownloadService;
-
- @SuppressWarnings("unused")
- @RequestMapping("/checkout.html")
- public String displayCheckout(@CookieValue("cart") String cookie, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- Language language = (Language)request.getAttribute("LANGUAGE");
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
- Customer customer = (Customer)request.getSession().getAttribute(Constants.CUSTOMER);
-
-
- /**
- * Shopping cart
- *
- * ShoppingCart should be in the HttpSession
- * Otherwise the cart id is in the cookie
- * Otherwise the customer is in the session and a cart exist in the DB
- * Else -> Nothing to display
- */
-
- //check if an existing order exist
- ShopOrder order = null;
- order = super.getSessionAttribute(Constants.ORDER, request);
-
- //Get the cart from the DB
- String shoppingCartCode = (String)request.getSession().getAttribute(Constants.SHOPPING_CART);
- com.salesmanager.core.model.shoppingcart.ShoppingCart cart = null;
-
- if(StringUtils.isBlank(shoppingCartCode)) {
-
- if(cookie==null) {//session expired and cookie null, nothing to do
- return "redirect:/shop/cart/shoppingCart.html";
- }
- String merchantCookie[] = cookie.split("_");
- String merchantStoreCode = merchantCookie[0];
- if(!merchantStoreCode.equals(store.getCode())) {
- return "redirect:/shop/cart/shoppingCart.html";
- }
- shoppingCartCode = merchantCookie[1];
-
- }
-
- cart = shoppingCartFacade.getShoppingCartModel(shoppingCartCode, store);
-
-
- if(cart==null && customer!=null) {
- cart=shoppingCartFacade.getShoppingCartModel(customer, store);
- }
- boolean allAvailables = true;
- //Filter items, delete unavailable
- Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> availables = new HashSet<ShoppingCartItem>();
- //Take out items no more available
- Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> items = cart.getLineItems();
- for(com.salesmanager.core.model.shoppingcart.ShoppingCartItem item : items) {
-
- Long id = item.getProduct().getId();
- Product p = productService.getById(id);
- if(p.isAvailable()) {
- availables.add(item);
- } else {
- allAvailables = false;
- }
- }
- cart.setLineItems(availables);
-
- if(!allAvailables) {
- shoppingCartFacade.saveOrUpdateShoppingCart(cart);
- }
-
- super.setSessionAttribute(Constants.SHOPPING_CART, cart.getShoppingCartCode(), request);
-
- if(shoppingCartCode==null && cart==null) {//error
- return "redirect:/shop/cart/shoppingCart.html";
- }
-
-
- if(customer!=null) {
- if(cart.getCustomerId()!=customer.getId().longValue()) {
- return "redirect:/shop/shoppingCart.html";
- }
- } else {
- customer = orderFacade.initEmptyCustomer(store);
- AnonymousCustomer anonymousCustomer = (AnonymousCustomer)request.getAttribute(Constants.ANONYMOUS_CUSTOMER);
- if(anonymousCustomer!=null && anonymousCustomer.getBilling()!=null) {
- Billing billing = customer.getBilling();
- billing.setCity(anonymousCustomer.getBilling().getCity());
- Map<String,Country> countriesMap = countryService.getCountriesMap(language);
- Country anonymousCountry = countriesMap.get(anonymousCustomer.getBilling().getCountry());
- if(anonymousCountry!=null) {
- billing.setCountry(anonymousCountry);
- }
- Map<String,Zone> zonesMap = zoneService.getZones(language);
- Zone anonymousZone = zonesMap.get(anonymousCustomer.getBilling().getZone());
- if(anonymousZone!=null) {
- billing.setZone(anonymousZone);
- }
- if(anonymousCustomer.getBilling().getPostalCode()!=null) {
- billing.setPostalCode(anonymousCustomer.getBilling().getPostalCode());
- }
- customer.setBilling(billing);
- }
- }
-
-
- if(CollectionUtils.isEmpty(items)) {
- return "redirect:/shop/shoppingCart.html";
- }
-
- if(order==null) {
- order = orderFacade.initializeOrder(store, customer, cart, language);
- }
-
- boolean freeShoppingCart = shoppingCartService.isFreeShoppingCart(cart);
- boolean requiresShipping = shoppingCartService.requiresShipping(cart);
-
- /**
- * hook for displaying or not delivery address configuration
- */
- ShippingMetaData shippingMetaData = shippingService.getShippingMetaData(store);
- model.addAttribute("shippingMetaData",shippingMetaData);//TODO DTO
-
- /** shipping **/
- ShippingQuote quote = null;
- if(requiresShipping) {
- //System.out.println("** Berfore default shipping quote **");
- //Get all applicable shipping quotes
- quote = orderFacade.getShippingQuote(customer, cart, order, store, language);
- model.addAttribute("shippingQuote", quote);
- }
-
- if(quote!=null) {
- String shippingReturnCode = quote.getShippingReturnCode();
-
- if(StringUtils.isBlank(shippingReturnCode) || shippingReturnCode.equals(ShippingQuote.NO_POSTAL_CODE)) {
-
- if(order.getShippingSummary()==null) {
- ShippingSummary summary = orderFacade.getShippingSummary(quote, store, language);
- order.setShippingSummary(summary);
- request.getSession().setAttribute(Constants.SHIPPING_SUMMARY, summary);//TODO DTO
- }
- if(order.getSelectedShippingOption()==null) {
- order.setSelectedShippingOption(quote.getSelectedShippingOption());
- }
-
- //save quotes in HttpSession
- List<ShippingOption> options = quote.getShippingOptions();
- request.getSession().setAttribute(Constants.SHIPPING_OPTIONS, options);//TODO DTO
-
- if(!CollectionUtils.isEmpty(options)) {
-
- for(ShippingOption shipOption : options) {
-
- StringBuilder moduleName = new StringBuilder();
- moduleName.append("module.shipping.").append(shipOption.getShippingModuleCode());
-
-
- String carrier = messages.getMessage(moduleName.toString(),locale);
- String note = messages.getMessage(moduleName.append(".note").toString(), locale, "");
-
- shipOption.setDescription(carrier);
- shipOption.setNote(note);
-
- //option name
- if(!StringUtils.isBlank(shipOption.getOptionCode())) {
- //try to get the translate
- StringBuilder optionCodeBuilder = new StringBuilder();
- try {
-
- optionCodeBuilder.append("module.shipping.").append(shipOption.getShippingModuleCode());
- String optionName = messages.getMessage(optionCodeBuilder.toString(),locale);
- shipOption.setOptionName(optionName);
- } catch(Exception e) {//label not found
- LOGGER.warn("No shipping code found for " + optionCodeBuilder.toString());
- }
- }
-
- }
-
- }
-
- }
-
- if(quote.getDeliveryAddress()!=null) {
- ReadableCustomerDeliveryAddressPopulator addressPopulator = new ReadableCustomerDeliveryAddressPopulator();
- addressPopulator.setCountryService(countryService);
- addressPopulator.setZoneService(zoneService);
- ReadableDelivery deliveryAddress = new ReadableDelivery();
- addressPopulator.populate(quote.getDeliveryAddress(), deliveryAddress, store, language);
- model.addAttribute("deliveryAddress", deliveryAddress);
- super.setSessionAttribute(Constants.KEY_SESSION_ADDRESS, deliveryAddress, request);
- }
-
-
- //get shipping countries
- List<Country> shippingCountriesList = orderFacade.getShipToCountry(store, language);
- model.addAttribute("countries", shippingCountriesList);
- } else {
- //get all countries
- List<Country> countries = countryService.getCountries(language);
- model.addAttribute("countries", countries);
- }
-
- if(quote!=null && quote.getShippingReturnCode()!=null && quote.getShippingReturnCode().equals(ShippingQuote.NO_SHIPPING_MODULE_CONFIGURED)) {
- LOGGER.error("Shipping quote error " + quote.getShippingReturnCode());
- model.addAttribute("errorMessages", quote.getShippingReturnCode());
- }
-
- if(quote!=null && !StringUtils.isBlank(quote.getQuoteError())) {
- LOGGER.error("Shipping quote error " + quote.getQuoteError());
- model.addAttribute("errorMessages", quote.getQuoteError());
- }
-
- if(quote!=null && quote.getShippingReturnCode()!=null && quote.getShippingReturnCode().equals(ShippingQuote.NO_SHIPPING_TO_SELECTED_COUNTRY)) {
- LOGGER.error("Shipping quote error " + quote.getShippingReturnCode());
- model.addAttribute("errorMessages", quote.getShippingReturnCode());
- }
- /** end shipping **/
-
- //get payment methods
- List<PaymentMethod> paymentMethods = paymentService.getAcceptedPaymentMethods(store);
-
- //not free and no payment methods
- if(CollectionUtils.isEmpty(paymentMethods) && !freeShoppingCart) {
- LOGGER.error("No payment method configured");
- model.addAttribute("errorMessages", "No payments configured");
- }
-
- if(!CollectionUtils.isEmpty(paymentMethods)) {//select default payment method
- PaymentMethod defaultPaymentSelected = null;
- for(PaymentMethod paymentMethod : paymentMethods) {
- if(paymentMethod.isDefaultSelected()) {
- defaultPaymentSelected = paymentMethod;
- break;
- }
- }
-
- if(defaultPaymentSelected==null) {//forced default selection
- defaultPaymentSelected = paymentMethods.get(0);
- defaultPaymentSelected.setDefaultSelected(true);
- }
-
- order.setDefaultPaymentMethodCode(defaultPaymentSelected.getPaymentMethodCode());
-
- }
-
- //readable shopping cart items for order summary box
- ShoppingCartData shoppingCart = shoppingCartFacade.getShoppingCartData(cart);
- model.addAttribute( "cart", shoppingCart );
- //TODO filter here
-
-
- //order total
- OrderTotalSummary orderTotalSummary = orderFacade.calculateOrderTotal(store, order, language);
- order.setOrderTotalSummary(orderTotalSummary);
- //if order summary has to be re-used
- super.setSessionAttribute(Constants.ORDER_SUMMARY, orderTotalSummary, request);
-
- model.addAttribute("order",order);
- model.addAttribute("paymentMethods", paymentMethods);
-
- /** template **/
- StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Checkout.checkout).append(".").append(store.getStoreTemplate());
- return template.toString();
-
-
- }
-
-
- @RequestMapping("/commitPreAuthorized.html")
- public String commitPreAuthorizedOrder(Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
- Language language = (Language)request.getAttribute("LANGUAGE");
- ShopOrder order = super.getSessionAttribute(Constants.ORDER, request);
- if(order==null) {
- StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Pages.timeout).append(".").append(store.getStoreTemplate());
- return template.toString();
- }
-
- @SuppressWarnings("unchecked")
- Map<String, Object> configs = (Map<String, Object>) request.getAttribute(Constants.REQUEST_CONFIGS);
-
- if(configs!=null && configs.containsKey(Constants.DEBUG_MODE)) {
- Boolean debugMode = (Boolean) configs.get(Constants.DEBUG_MODE);
- if(debugMode) {
- try {
- ObjectMapper mapper = new ObjectMapper();
- String jsonInString = mapper.writeValueAsString(order);
- LOGGER.debug("Commit pre-authorized order -> " + jsonInString);
- } catch(Exception de) {
- LOGGER.error(de.getMessage());
- }
- }
- }
-
-
- try {
-
- OrderTotalSummary totalSummary = super.getSessionAttribute(Constants.ORDER_SUMMARY, request);
-
- if(totalSummary==null) {
- totalSummary = orderFacade.calculateOrderTotal(store, order, language);
- super.setSessionAttribute(Constants.ORDER_SUMMARY, totalSummary, request);
- }
-
-
- order.setOrderTotalSummary(totalSummary);
-
- //already validated, proceed with commit
- Order orderModel = this.commitOrder(order, request, locale);
- super.setSessionAttribute(Constants.ORDER_ID, orderModel.getId(), request);
-
- return "redirect:/shop/order/confirmation.html";
-
- } catch(Exception e) {
- LOGGER.error("Error while commiting order",e);
- throw e;
-
- }
-
- }
-
-
- private Order commitOrder(ShopOrder order, HttpServletRequest request, Locale locale) throws Exception, ServiceException {
-
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
- Language language = (Language)request.getAttribute("LANGUAGE");
-
-
- String userName = null;
- String password = null;
-
- PersistableCustomer customer = order.getCustomer();
-
- /** set username and password to persistable object **/
- Authentication auth = SecurityContextHolder.getContext().getAuthentication();
- Customer authCustomer = null;
- if(auth != null &&
- request.isUserInRole("AUTH_CUSTOMER")) {
- authCustomer = customerFacade.getCustomerByUserName(auth.getName(), store);
- //set id and authentication information
- customer.setUserName(authCustomer.getNick());
- customer.setEncodedPassword(authCustomer.getPassword());
- customer.setId(authCustomer.getId());
- } else {
- //set customer id to null
- customer.setId(null);
- }
-
- //if the customer is new, generate a password
- if(customer.getId()==null || customer.getId()==0) {//new customer
- password = UserReset.generateRandomString();
- String encodedPassword = passwordEncoder.encode(password);
- customer.setEncodedPassword(encodedPassword);
- }
-
- if(order.isShipToBillingAdress()) {
- customer.setDelivery(customer.getBilling());
- }
-
-
-
- Customer modelCustomer = null;
- try {//set groups
- if(authCustomer==null) {//not authenticated, create a new volatile user
- modelCustomer = customerFacade.getCustomerModel(customer, store, language);
- customerFacade.setCustomerModelDefaultProperties(modelCustomer, store);
- userName = modelCustomer.getNick();
- LOGGER.debug( "About to persist volatile customer to database." );
- customerService.saveOrUpdate( modelCustomer );
- } else {//use existing customer
- modelCustomer = customerFacade.populateCustomerModel(authCustomer, customer, store, language);
- }
- } catch(Exception e) {
- throw new ServiceException(e);
- }
-
-
-
- Order modelOrder = null;
- Transaction initialTransaction = (Transaction)super.getSessionAttribute(Constants.INIT_TRANSACTION_KEY, request);
- if(initialTransaction!=null) {
- modelOrder=orderFacade.processOrder(order, modelCustomer, initialTransaction, store, language);
- } else {
- modelOrder=orderFacade.processOrder(order, modelCustomer, store, language);
- }
-
- //save order id in session
- super.setSessionAttribute(Constants.ORDER_ID, modelOrder.getId(), request);
- //set a unique token for confirmation
- super.setSessionAttribute(Constants.ORDER_ID_TOKEN, modelOrder.getId(), request);
-
-
- //get cart
- String cartCode = super.getSessionAttribute(Constants.SHOPPING_CART, request);
- if(StringUtils.isNotBlank(cartCode)) {
- try {
- shoppingCartFacade.deleteShoppingCart(cartCode, store);
- } catch(Exception e) {
- LOGGER.error("Cannot delete cart " + cartCode, e);
- throw new ServiceException(e);
- }
- }
-
-
- //cleanup the order objects
- super.removeAttribute(Constants.ORDER, request);
- super.removeAttribute(Constants.ORDER_SUMMARY, request);
- super.removeAttribute(Constants.INIT_TRANSACTION_KEY, request);
- super.removeAttribute(Constants.SHIPPING_OPTIONS, request);
- super.removeAttribute(Constants.SHIPPING_SUMMARY, request);
- super.removeAttribute(Constants.SHOPPING_CART, request);
-
-
-
-
- try {
- //refresh customer --
- modelCustomer = customerFacade.getCustomerByUserName(modelCustomer.getNick(), store);
-
- //if has downloads, authenticate
-
- //check if any downloads exist for this order6
- List<OrderProductDownload> orderProductDownloads = orderProdctDownloadService.getByOrderId(modelOrder.getId());
- if(CollectionUtils.isNotEmpty(orderProductDownloads)) {
-
- LOGGER.debug("Is user authenticated ? ",auth.isAuthenticated());
- if(auth != null &&
- request.isUserInRole("AUTH_CUSTOMER")) {
- //already authenticated
- } else {
- //authenticate
- customerFacade.authenticate(modelCustomer, userName, password);
- super.setSessionAttribute(Constants.CUSTOMER, modelCustomer, request);
- }
- //send new user registration template
- if(order.getCustomer().getId()==null || order.getCustomer().getId().longValue()==0) {
- //send email for new customer
- customer.setClearPassword(password);//set clear password for email
- customer.setUserName(userName);
- emailTemplatesUtils.sendRegistrationEmail( customer, store, locale, request.getContextPath() );
- }
- }
-
- //send order confirmation email to customer
- emailTemplatesUtils.sendOrderEmail(modelCustomer.getEmailAddress(), modelCustomer, modelOrder, locale, language, store, request.getContextPath());
-
- if(orderService.hasDownloadFiles(modelOrder)) {
- emailTemplatesUtils.sendOrderDownloadEmail(modelCustomer, modelOrder, store, locale, request.getContextPath());
-
- }
-
- //send order confirmation email to merchant
- emailTemplatesUtils.sendOrderEmail(store.getStoreEmailAddress(), modelCustomer, modelOrder, locale, language, store, request.getContextPath());
-
-
-
- } catch(Exception e) {
- LOGGER.error("Error while post processing order",e);
- }
-
-
-
-
- return modelOrder;
-
-
- }
-
-
-
-
- @SuppressWarnings("unchecked")
- @RequestMapping("/commitOrder.html")
- public String commitOrder(@CookieValue("cart") String cookie, @Valid @ModelAttribute(value="order") ShopOrder order, BindingResult bindingResult, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
- Language language = (Language)request.getAttribute("LANGUAGE");
- //validate if session has expired
-
- model.addAttribute("order", order);//TODO remove
-
- Map<String, Object> configs = (Map<String, Object>) request.getAttribute(Constants.REQUEST_CONFIGS);
-
- if(configs!=null && configs.containsKey(Constants.DEBUG_MODE)) {
- Boolean debugMode = (Boolean) configs.get(Constants.DEBUG_MODE);
- if(debugMode) {
- try {
- ObjectMapper mapper = new ObjectMapper();
- String jsonInString = mapper.writeValueAsString(order);
- LOGGER.debug("Commit order -> " + jsonInString);
- } catch(Exception de) {
- LOGGER.error(de.getMessage());
- }
- }
- }
-
- try {
-
-
- ShippingMetaData shippingMetaData = shippingService.getShippingMetaData(store);
- model.addAttribute("shippingMetaData",shippingMetaData);
- //basic stuff
- String shoppingCartCode = (String)request.getSession().getAttribute(Constants.SHOPPING_CART);
- if(shoppingCartCode==null) {
-
- if(cookie==null) {//session expired and cookie null, nothing to do
- StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Pages.timeout).append(".").append(store.getStoreTemplate());
- return template.toString();
- }
- String merchantCookie[] = cookie.split("_");
- String merchantStoreCode = merchantCookie[0];
- if(!merchantStoreCode.equals(store.getCode())) {
- StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Pages.timeout).append(".").append(store.getStoreTemplate());
- return template.toString();
- }
- shoppingCartCode = merchantCookie[1];
- }
- com.salesmanager.core.model.shoppingcart.ShoppingCart cart = null;
-
- if(StringUtils.isBlank(shoppingCartCode)) {
- StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Pages.timeout).append(".").append(store.getStoreTemplate());
- return template.toString();
- }
- cart = shoppingCartFacade.getShoppingCartModel(shoppingCartCode, store);
-
- //readable shopping cart items for order summary box
- ShoppingCartData shoppingCart = shoppingCartFacade.getShoppingCartData(cart);
- model.addAttribute( "cart", shoppingCart );
-
- Set<ShoppingCartItem> items = cart.getLineItems();
- List<ShoppingCartItem> cartItems = new ArrayList<ShoppingCartItem>(items);
- order.setShoppingCartItems(cartItems);
-
- //get payment methods
- List<PaymentMethod> paymentMethods = paymentService.getAcceptedPaymentMethods(store);
- boolean freeShoppingCart = shoppingCartService.isFreeShoppingCart(cart);
-
- //not free and no payment methods
- if(CollectionUtils.isEmpty(paymentMethods) && !freeShoppingCart) {
- LOGGER.error("No payment method configured");
- model.addAttribute("errorMessages", "No payments configured");
- }
-
- if(!CollectionUtils.isEmpty(paymentMethods)) {//select default payment method
- PaymentMethod defaultPaymentSelected = null;
- for(PaymentMethod paymentMethod : paymentMethods) {
- if(paymentMethod.isDefaultSelected()) {
- defaultPaymentSelected = paymentMethod;
- break;
- }
- }
-
- if(defaultPaymentSelected==null) {//forced default selection
- defaultPaymentSelected = paymentMethods.get(0);
- defaultPaymentSelected.setDefaultSelected(true);
- }
-
-
- }
-
- ShippingQuote quote = orderFacade.getShippingQuote(order.getCustomer(), cart, order, store, language);
-
-
- if(quote!=null) {
-
-
- //save quotes in HttpSession
- List<ShippingOption> options = quote.getShippingOptions();
- request.getSession().setAttribute(Constants.SHIPPING_OPTIONS, options);
-
- if(!CollectionUtils.isEmpty(options)) {
-
- for(ShippingOption shipOption : options) {
-
- StringBuilder moduleName = new StringBuilder();
- moduleName.append("module.shipping.").append(shipOption.getShippingModuleCode());
-
-
- String carrier = messages.getMessage(moduleName.toString(),locale);
-
- shipOption.setDescription(carrier);
-
- //option name
- if(!StringUtils.isBlank(shipOption.getOptionCode())) {
- //try to get the translate
- StringBuilder optionCodeBuilder = new StringBuilder();
- try {
-
- optionCodeBuilder.append("module.shipping.").append(shipOption.getShippingModuleCode()).append(".").append(shipOption.getOptionCode());
- String optionName = messages.getMessage(optionCodeBuilder.toString(),locale);
- shipOption.setOptionName(optionName);
- } catch(Exception e) {//label not found
- LOGGER.warn("No shipping code found for " + optionCodeBuilder.toString());
- }
- }
-
- }
-
- }
-
- if(quote.getDeliveryAddress()!=null) {
- ReadableCustomerDeliveryAddressPopulator addressPopulator = new ReadableCustomerDeliveryAddressPopulator();
- addressPopulator.setCountryService(countryService);
- addressPopulator.setZoneService(zoneService);
- ReadableDelivery deliveryAddress = new ReadableDelivery();
- addressPopulator.populate(quote.getDeliveryAddress(), deliveryAddress, store, language);
- model.addAttribute("deliveryAddress", deliveryAddress);
- }
-
- }
-
- model.addAttribute("shippingQuote", quote);
- model.addAttribute("paymentMethods", paymentMethods);
-
- if(quote!=null) {
- List<Country> shippingCountriesList = orderFacade.getShipToCountry(store, language);
- model.addAttribute("countries", shippingCountriesList);
- } else {
- //get all countries
- List<Country> countries = countryService.getCountries(language);
- model.addAttribute("countries", countries);
- }
-
- //set shipping summary
- if(order.getSelectedShippingOption()!=null) {
- ShippingSummary summary = (ShippingSummary)request.getSession().getAttribute(Constants.SHIPPING_SUMMARY);
- @SuppressWarnings("unchecked")
- List<ShippingOption> options = (List<ShippingOption>)request.getSession().getAttribute(Constants.SHIPPING_OPTIONS);
-
- if(summary==null) {
- summary = orderFacade.getShippingSummary(quote, store, language);
- request.getSession().setAttribute(Constants.SHIPPING_SUMMARY, options);
- }
-
- if(options==null) {
- options = quote.getShippingOptions();
- request.getSession().setAttribute(Constants.SHIPPING_OPTIONS, options);
- }
-
- ReadableShippingSummary readableSummary = new ReadableShippingSummary();
- ReadableShippingSummaryPopulator readableSummaryPopulator = new ReadableShippingSummaryPopulator();
- readableSummaryPopulator.setPricingService(pricingService);
- readableSummaryPopulator.populate(summary, readableSummary, store, language);
-
-
- if(!CollectionUtils.isEmpty(options)) {
-
- //get submitted shipping option
- ShippingOption quoteOption = null;
- ShippingOption selectedOption = order.getSelectedShippingOption();
-
- //check if selectedOption exist
- for(ShippingOption shipOption : options) {
- if(!StringUtils.isBlank(shipOption.getOptionId()) && shipOption.getOptionId().equals(selectedOption.getOptionId())) {
- quoteOption = shipOption;
- }
-
- }
- if(quoteOption==null) {
- quoteOption = options.get(0);
- }
-
- readableSummary.setSelectedShippingOption(quoteOption);
- readableSummary.setShippingOptions(options);
- summary.setShippingOption(quoteOption.getOptionId());
- summary.setShipping(quoteOption.getOptionPrice());
-
- }
-
- order.setShippingSummary(summary);
- }
-
- OrderTotalSummary totalSummary = super.getSessionAttribute(Constants.ORDER_SUMMARY, request);
-
- if(totalSummary==null) {
- totalSummary = orderFacade.calculateOrderTotal(store, order, language);
- super.setSessionAttribute(Constants.ORDER_SUMMARY, totalSummary, request);
- }
-
-
- order.setOrderTotalSummary(totalSummary);
-
-
- orderFacade.validateOrder(order, bindingResult, new HashMap<String,String>(), store, locale);
-
- if ( bindingResult.hasErrors() )
- {
- LOGGER.info( "found {} validation error while validating in customer registration ",
- bindingResult.getErrorCount() );
- StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Checkout.checkout).append(".").append(store.getStoreTemplate());
- return template.toString();
-
- }
-
- @SuppressWarnings("unused")
- Order modelOrder = this.commitOrder(order, request, locale);
-
-
- } catch(ServiceException se) {
-
-
- LOGGER.error("Error while creating an order ", se);
-
- String defaultMessage = messages.getMessage("message.error", locale);
- model.addAttribute("errorMessages", defaultMessage);
-
- if(se.getExceptionType()==ServiceException.EXCEPTION_VALIDATION) {
- if(!StringUtils.isBlank(se.getMessageCode())) {
- String messageLabel = messages.getMessage(se.getMessageCode(), locale, defaultMessage);
- model.addAttribute("errorMessages", messageLabel);
- }
- } else if(se.getExceptionType()==ServiceException.EXCEPTION_PAYMENT_DECLINED) {
- String paymentDeclinedMessage = messages.getMessage("message.payment.declined", locale);
- if(!StringUtils.isBlank(se.getMessageCode())) {
- String messageLabel = messages.getMessage(se.getMessageCode(), locale, paymentDeclinedMessage);
- model.addAttribute("errorMessages", messageLabel);
- } else {
- model.addAttribute("errorMessages", paymentDeclinedMessage);
- }
- }
-
-
-
- StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Checkout.checkout).append(".").append(store.getStoreTemplate());
- return template.toString();
-
- } catch(Exception e) {
- LOGGER.error("Error while commiting order",e);
- throw e;
-
- }
-
- //redirect to completd
- return "redirect:/shop/order/confirmation.html";
-
-
-
-
-
- }
-
-
-
-
- /**
- * Recalculates shipping and tax following a change in country or province
- * @param order
- * @param request
- * @param response
- * @param locale
- * @return
- * @throws Exception
- */
- @SuppressWarnings("unchecked")
- @RequestMapping(value={"/shippingQuotes.json"}, method=RequestMethod.POST)
- public @ResponseBody ReadableShopOrder calculateShipping(@ModelAttribute(value="order") ShopOrder order, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- Language language = (Language)request.getAttribute("LANGUAGE");
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
- String shoppingCartCode = getSessionAttribute(Constants.SHOPPING_CART, request);
-
- Map<String, Object> configs = (Map<String, Object>) request.getAttribute(Constants.REQUEST_CONFIGS);
-
-/* if(configs!=null && configs.containsKey(Constants.DEBUG_MODE)) {
- Boolean debugMode = (Boolean) configs.get(Constants.DEBUG_MODE);
- if(debugMode) {
- try {
- ObjectMapper mapper = new ObjectMapper();
- String jsonInString = mapper.writeValueAsString(order);
- LOGGER.info("Calculate order -> shoppingCartCode[ " + shoppingCartCode + "] -> " + jsonInString);
- } catch(Exception de) {
- LOGGER.error(de.getMessage());
- }
- }
- }*/
-
- Validate.notNull(shoppingCartCode,"shoppingCartCode does not exist in the session");
-
- ReadableShopOrder readableOrder = new ReadableShopOrder();
- try {
-
- //re-generate cart
- com.salesmanager.core.model.shoppingcart.ShoppingCart cart = shoppingCartFacade.getShoppingCartModel(shoppingCartCode, store);
-
-
-
- ReadableShopOrderPopulator populator = new ReadableShopOrderPopulator();
- populator.populate(order, readableOrder, store, language);
-
- boolean requiresShipping = shoppingCartService.requiresShipping(cart);
-
- /** shipping **/
- ShippingQuote quote = null;
- if(requiresShipping) {
- quote = orderFacade.getShippingQuote(order.getCustomer(), cart, order, store, language);
- }
-
- if(quote!=null) {
- String shippingReturnCode = quote.getShippingReturnCode();
- if(CollectionUtils.isNotEmpty(quote.getShippingOptions()) || ShippingQuote.NO_POSTAL_CODE.equals(shippingReturnCode)) {
-
- ShippingSummary summary = orderFacade.getShippingSummary(quote, store, language);
- order.setShippingSummary(summary);//for total calculation
-
-
- ReadableShippingSummary readableSummary = new ReadableShippingSummary();
- ReadableShippingSummaryPopulator readableSummaryPopulator = new ReadableShippingSummaryPopulator();
- readableSummaryPopulator.setPricingService(pricingService);
- readableSummaryPopulator.populate(summary, readableSummary, store, language);
-
- //additional informations
-/* if(quote.getQuoteInformations() != null && quote.getQuoteInformations().size() >0) {
- for(String k : quote.getQuoteInformations().keySet()) {
- Object o = quote.getQuoteInformations().get(k);
- try {
- readableSummary.getQuoteInformations().put(k, String.valueOf(o));
- } catch(Exception e) {
- LOGGER.error("Cannot cast value to string " + e.getMessage());
- }
- }
- }*/
-
- if(quote.getDeliveryAddress()!=null) {
- ReadableCustomerDeliveryAddressPopulator addressPopulator = new ReadableCustomerDeliveryAddressPopulator();
- addressPopulator.setCountryService(countryService);
- addressPopulator.setZoneService(zoneService);
- ReadableDelivery deliveryAddress = new ReadableDelivery();
- addressPopulator.populate(quote.getDeliveryAddress(), deliveryAddress, store, language);
- //model.addAttribute("deliveryAddress", deliveryAddress);
- readableOrder.setDelivery(deliveryAddress);
- super.setSessionAttribute(Constants.KEY_SESSION_ADDRESS, deliveryAddress, request);
- }
-
-
- //save quotes in HttpSession
- List<ShippingOption> options = quote.getShippingOptions();
-
- if(!CollectionUtils.isEmpty(options)) {
-
- for(ShippingOption shipOption : options) {
-
- StringBuilder moduleName = new StringBuilder();
- moduleName.append("module.shipping.").append(shipOption.getShippingModuleCode());
-
- String carrier = messages.getMessage(moduleName.toString(),new String[]{store.getStorename()},locale);
-
- String note = messages.getMessage(moduleName.append(".note").toString(), locale, "");
-
-
- shipOption.setDescription(carrier);
- shipOption.setNote(note);
-
- //option name
- if(!StringUtils.isBlank(shipOption.getOptionCode())) {
- //try to get the translate
- StringBuilder optionCodeBuilder = new StringBuilder();
- try {
-
- optionCodeBuilder.append("module.shipping.").append(shipOption.getShippingModuleCode());
- String optionName = messages.getMessage(optionCodeBuilder.toString(),locale);
- shipOption.setOptionName(optionName);
- } catch(Exception e) {//label not found
- LOGGER.warn("No shipping code found for " + optionCodeBuilder.toString());
- }
- }
-
- }
-
- }
-
- readableSummary.setSelectedShippingOption(quote.getSelectedShippingOption());
-
-
- readableSummary.setShippingOptions(options);
-
- readableOrder.setShippingSummary(readableSummary);//TODO add readable address
- request.getSession().setAttribute(Constants.SHIPPING_SUMMARY, summary);
- request.getSession().setAttribute(Constants.SHIPPING_OPTIONS, options);
- request.getSession().setAttribute("SHIPPING_INFORMATIONS", readableSummary.getQuoteInformations());
-
- if(configs!=null && configs.containsKey(Constants.DEBUG_MODE)) {
- Boolean debugMode = (Boolean) configs.get(Constants.DEBUG_MODE);
- if(debugMode) {
-
- try {
- ObjectMapper mapper = new ObjectMapper();
- String jsonInString = mapper.writeValueAsString(readableOrder);
- LOGGER.debug("Readable order -> shoppingCartCode[ " + shoppingCartCode + "] -> " + jsonInString);
- System.out.println("Readable order -> shoppingCartCode[ " + shoppingCartCode + "] -> " + jsonInString);
- } catch(Exception de) {
- LOGGER.error(de.getMessage());
- }
-
-
- }
- }
-
-
- }
-
- if(quote.getShippingReturnCode()!=null && quote.getShippingReturnCode().equals(ShippingQuote.NO_SHIPPING_MODULE_CONFIGURED)) {
- LOGGER.error("Shipping quote error " + quote.getShippingReturnCode());
- readableOrder.setErrorMessage(messages.getMessage("message.noshipping", locale));
- }
-
- if(quote.getShippingReturnCode()!=null && quote.getShippingReturnCode().equals(ShippingQuote.NO_SHIPPING_TO_SELECTED_COUNTRY)) {
- if(CollectionUtils.isEmpty(quote.getShippingOptions())) {//only if there are no other options
- LOGGER.error("Shipping quote error " + quote.getShippingReturnCode());
- readableOrder.setErrorMessage(messages.getMessage("message.noshipping", locale));
- }
- }
-
- //if(quote.getShippingReturnCode()!=null && quote.getShippingReturnCode().equals(ShippingQuote.NO_POSTAL_CODE)) {
- // LOGGER.error("Shipping quote error " + quote.getShippingReturnCode());
- // readableOrder.setErrorMessage(messages.getMessage("message.noshipping", locale));
- //}
-
- if(!StringUtils.isBlank(quote.getQuoteError())) {
- LOGGER.error("Shipping quote error " + quote.getQuoteError());
- readableOrder.setErrorMessage(messages.getMessage("message.noshippingerror", locale));
- }
-
-
- }
-
- //set list of shopping cart items for core price calculation
- List<ShoppingCartItem> items = new ArrayList<ShoppingCartItem>(cart.getLineItems());
- order.setShoppingCartItems(items);
-
- OrderTotalSummary orderTotalSummary = orderFacade.calculateOrderTotal(store, order, language);
- super.setSessionAttribute(Constants.ORDER_SUMMARY, orderTotalSummary, request);
-
-
- ReadableOrderTotalPopulator totalPopulator = new ReadableOrderTotalPopulator();
- totalPopulator.setMessages(messages);
- totalPopulator.setPricingService(pricingService);
-
- List<ReadableOrderTotal> subtotals = new ArrayList<ReadableOrderTotal>();
- for(OrderTotal total : orderTotalSummary.getTotals()) {
- if(!total.getOrderTotalCode().equals("order.total.total")) {
- ReadableOrderTotal t = new ReadableOrderTotal();
- totalPopulator.populate(total, t, store, language);
- subtotals.add(t);
- } else {//grand total
- ReadableOrderTotal ot = new ReadableOrderTotal();
- totalPopulator.populate(total, ot, store, language);
- readableOrder.setGrandTotal(ot.getTotal());
- }
- }
-
-
- readableOrder.setSubTotals(subtotals);
-
- } catch(Exception e) {
- LOGGER.error("Error while getting shipping quotes",e);
- readableOrder.setErrorMessage(messages.getMessage("message.error", locale));
- }
-
- return readableOrder;
- }
-
- /**
- * Calculates the order total following price variation like changing a shipping option
- * @param order
- * @param request
- * @param response
- * @param locale
- * @return
- * @throws Exception
- */
- @RequestMapping(value={"/calculateOrderTotal.json"}, method=RequestMethod.POST)
- public @ResponseBody ReadableShopOrder calculateOrderTotal(@ModelAttribute(value="order") ShopOrder order, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
- Language language = (Language)request.getAttribute("LANGUAGE");
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
- String shoppingCartCode = getSessionAttribute(Constants.SHOPPING_CART, request);
-
- Validate.notNull(shoppingCartCode,"shoppingCartCode does not exist in the session");
-
- ReadableShopOrder readableOrder = new ReadableShopOrder();
- try {
-
- //re-generate cart
- com.salesmanager.core.model.shoppingcart.ShoppingCart cart = shoppingCartFacade.getShoppingCartModel(shoppingCartCode, store);
-
- ReadableShopOrderPopulator populator = new ReadableShopOrderPopulator();
- populator.populate(order, readableOrder, store, language);
-
- ReadableDelivery readableDelivery = super.getSessionAttribute(Constants.KEY_SESSION_ADDRESS, request);
-
- if(order.getSelectedShippingOption()!=null) {
- ShippingSummary summary = (ShippingSummary)request.getSession().getAttribute(Constants.SHIPPING_SUMMARY);
- @SuppressWarnings("unchecked")
- List<ShippingOption> options = (List<ShippingOption>)request.getSession().getAttribute(Constants.SHIPPING_OPTIONS);
-
-
- order.setShippingSummary(summary);//for total calculation
-
-
- ReadableShippingSummary readableSummary = new ReadableShippingSummary();
- ReadableShippingSummaryPopulator readableSummaryPopulator = new ReadableShippingSummaryPopulator();
- readableSummaryPopulator.setPricingService(pricingService);
- readableSummaryPopulator.populate(summary, readableSummary, store, language);
-
- //override summary
- readableSummary.setDelivery(readableDelivery);
-
- if(!CollectionUtils.isEmpty(options)) {
-
- //get submitted shipping option
- ShippingOption quoteOption = null;
- ShippingOption selectedOption = order.getSelectedShippingOption();
-
-
-
- //check if selectedOption exist
- for(ShippingOption shipOption : options) {
-
- StringBuilder moduleName = new StringBuilder();
- moduleName.append("module.shipping.").append(shipOption.getShippingModuleCode());
-
-
- String carrier = messages.getMessage(moduleName.toString(),locale);
- String note = messages.getMessage(moduleName.append(".note").toString(), locale, "");
-
- shipOption.setNote(note);
-
- shipOption.setDescription(carrier);
- if(!StringUtils.isBlank(shipOption.getOptionId()) && shipOption.getOptionId().equals(selectedOption.getOptionId())) {
- quoteOption = shipOption;
- }
-
- //option name
- if(!StringUtils.isBlank(shipOption.getOptionCode())) {
- //try to get the translate
- StringBuilder optionCodeBuilder = new StringBuilder();
- try {
-
- //optionCodeBuilder.append("module.shipping.").append(shipOption.getShippingModuleCode()).append(".").append(shipOption.getOptionCode());
- optionCodeBuilder.append("module.shipping.").append(shipOption.getShippingModuleCode());
- String optionName = messages.getMessage(optionCodeBuilder.toString(),locale);
- shipOption.setOptionName(optionName);
- } catch(Exception e) {//label not found
- LOGGER.warn("No shipping code found for " + optionCodeBuilder.toString());
- }
- }
- }
-
- if(quoteOption==null) {
- quoteOption = options.get(0);
- }
-
-
- readableSummary.setSelectedShippingOption(quoteOption);
- readableSummary.setShippingOptions(options);
-
- summary.setShippingOption(quoteOption.getOptionId());
- summary.setShippingOptionCode(quoteOption.getOptionCode());
- summary.setShipping(quoteOption.getOptionPrice());
- order.setShippingSummary(summary);//override with new summary
-
-
- @SuppressWarnings("unchecked")
- Map<String,String> informations = (Map<String,String>)request.getSession().getAttribute("SHIPPING_INFORMATIONS");
- readableSummary.setQuoteInformations(informations);
-
- }
-
-
- readableOrder.setShippingSummary(readableSummary);//TODO readable address format
- readableOrder.setDelivery(readableDelivery);
- }
-
- //set list of shopping cart items for core price calculation
- List<ShoppingCartItem> items = new ArrayList<ShoppingCartItem>(cart.getLineItems());
- order.setShoppingCartItems(items);
-
- //order total calculation
- OrderTotalSummary orderTotalSummary = orderFacade.calculateOrderTotal(store, order, language);
- super.setSessionAttribute(Constants.ORDER_SUMMARY, orderTotalSummary, request);
-
-
- ReadableOrderTotalPopulator totalPopulator = new ReadableOrderTotalPopulator();
- totalPopulator.setMessages(messages);
- totalPopulator.setPricingService(pricingService);
-
- List<ReadableOrderTotal> subtotals = new ArrayList<ReadableOrderTotal>();
- for(OrderTotal total : orderTotalSummary.getTotals()) {
- if(total.getOrderTotalCode() == null || !total.getOrderTotalCode().equals("order.total.total")) {
- ReadableOrderTotal t = new ReadableOrderTotal();
- totalPopulator.populate(total, t, store, language);
- subtotals.add(t);
- } else {//grand total
- ReadableOrderTotal ot = new ReadableOrderTotal();
- totalPopulator.populate(total, ot, store, language);
- readableOrder.setGrandTotal(ot.getTotal());
- }
- }
-
-
- readableOrder.setSubTotals(subtotals);
-
- } catch(Exception e) {
- LOGGER.error("Error while getting shipping quotes",e);
- readableOrder.setErrorMessage(messages.getMessage("message.error", locale));
- }
-
- return readableOrder;
- }
-
-
-
+package com.salesmanager.shop.store.controller.order;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.business.services.order.OrderService;
+import com.salesmanager.core.business.services.order.orderproduct.OrderProductDownloadService;
+import com.salesmanager.core.business.services.payments.PaymentService;
+import com.salesmanager.core.business.services.reference.country.CountryService;
+import com.salesmanager.core.business.services.reference.zone.ZoneService;
+import com.salesmanager.core.business.services.shipping.ShippingService;
+import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.common.Billing;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.order.OrderTotal;
+import com.salesmanager.core.model.order.OrderTotalSummary;
+import com.salesmanager.core.model.order.orderproduct.OrderProductDownload;
+import com.salesmanager.core.model.payments.PaymentMethod;
+import com.salesmanager.core.model.payments.Transaction;
+import com.salesmanager.core.model.reference.country.Country;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.reference.zone.Zone;
+import com.salesmanager.core.model.shipping.ShippingMetaData;
+import com.salesmanager.core.model.shipping.ShippingOption;
+import com.salesmanager.core.model.shipping.ShippingQuote;
+import com.salesmanager.core.model.shipping.ShippingSummary;
+import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
+import com.salesmanager.shop.admin.model.userpassword.UserReset;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.model.customer.AnonymousCustomer;
+import com.salesmanager.shop.model.customer.PersistableCustomer;
+import com.salesmanager.shop.model.customer.ReadableDelivery;
+import com.salesmanager.shop.model.order.ReadableShopOrder;
+import com.salesmanager.shop.model.order.ShopOrder;
+import com.salesmanager.shop.model.order.shipping.ReadableShippingSummary;
+import com.salesmanager.shop.model.order.total.ReadableOrderTotal;
+import com.salesmanager.shop.model.shoppingcart.ShoppingCartData;
+import com.salesmanager.shop.populator.customer.ReadableCustomerDeliveryAddressPopulator;
+import com.salesmanager.shop.populator.order.ReadableOrderTotalPopulator;
+import com.salesmanager.shop.populator.order.ReadableShippingSummaryPopulator;
+import com.salesmanager.shop.populator.order.ReadableShopOrderPopulator;
+import com.salesmanager.shop.store.controller.AbstractController;
+import com.salesmanager.shop.store.controller.ControllerConstants;
+import com.salesmanager.shop.store.controller.customer.facade.CustomerFacade;
+import com.salesmanager.shop.store.controller.order.facade.OrderFacade;
+import com.salesmanager.shop.store.controller.shoppingCart.facade.ShoppingCartFacade;
+import com.salesmanager.shop.utils.EmailTemplatesUtils;
+import com.salesmanager.shop.utils.LabelUtils;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.Validate;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.ObjectError;
+import org.springframework.web.bind.annotation.*;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.util.*;
+
+
+/**
+ * Displays checkout form and deals with ajax user input
+ * @author carlsamson
+ *
+ */
+@Controller
+@RequestMapping(Constants.SHOP_URI+"/order")
+public class ShoppingOrderController extends AbstractController {
+
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(ShoppingOrderController.class);
+
+ @Inject
+ private ShoppingCartFacade shoppingCartFacade;
+
+ @Inject
+ private ShoppingCartService shoppingCartService;
+
+ @Inject
+ private PaymentService paymentService;
+
+ @Inject
+ private CustomerService customerService;
+
+ @Inject
+ private ShippingService shippingService;
+
+ @Inject
+ private OrderService orderService;
+
+ @Inject
+ private CountryService countryService;
+
+ @Inject
+ private ZoneService zoneService;
+
+ @Inject
+ private OrderFacade orderFacade;
+
+ @Inject
+ private CustomerFacade customerFacade;
+
+ @Inject
+ private LabelUtils messages;
+
+ @Inject
+ private PricingService pricingService;
+
+ @Inject
+ private ProductService productService;
+
+ @Inject
+ private PasswordEncoder passwordEncoder;
+
+ @Inject
+ private AuthenticationManager customerAuthenticationManager;
+
+ @Inject
+ private EmailTemplatesUtils emailTemplatesUtils;
+
+ @Inject
+ private OrderProductDownloadService orderProdctDownloadService;
+
+ @SuppressWarnings("unused")
+ @RequestMapping("/checkout.html")
+ public String displayCheckout(@CookieValue("cart") String cookie, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ Language language = (Language)request.getAttribute("LANGUAGE");
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+ Customer customer = (Customer)request.getSession().getAttribute(Constants.CUSTOMER);
+
+
+ /**
+ * Shopping cart
+ *
+ * ShoppingCart should be in the HttpSession
+ * Otherwise the cart id is in the cookie
+ * Otherwise the customer is in the session and a cart exist in the DB
+ * Else -> Nothing to display
+ */
+
+ //check if an existing order exist
+ ShopOrder order = null;
+ order = super.getSessionAttribute(Constants.ORDER, request);
+
+ //Get the cart from the DB
+ String shoppingCartCode = (String)request.getSession().getAttribute(Constants.SHOPPING_CART);
+ com.salesmanager.core.model.shoppingcart.ShoppingCart cart = null;
+
+ if(StringUtils.isBlank(shoppingCartCode)) {
+
+ if(cookie==null) {//session expired and cookie null, nothing to do
+ return "redirect:/shop/cart/shoppingCart.html";
+ }
+ String merchantCookie[] = cookie.split("_");
+ String merchantStoreCode = merchantCookie[0];
+ if(!merchantStoreCode.equals(store.getCode())) {
+ return "redirect:/shop/cart/shoppingCart.html";
+ }
+ shoppingCartCode = merchantCookie[1];
+
+ }
+
+ cart = shoppingCartFacade.getShoppingCartModel(shoppingCartCode, store);
+
+
+ if(cart==null && customer!=null) {
+ cart=shoppingCartFacade.getShoppingCartModel(customer, store);
+ }
+ boolean allAvailables = true;
+ //Filter items, delete unavailable
+ Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> availables = new HashSet<ShoppingCartItem>();
+ //Take out items no more available
+ Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> items = cart.getLineItems();
+ for(com.salesmanager.core.model.shoppingcart.ShoppingCartItem item : items) {
+
+ Long id = item.getProduct().getId();
+ Product p = productService.getById(id);
+ if(p.isAvailable()) {
+ availables.add(item);
+ } else {
+ allAvailables = false;
+ }
+ }
+ cart.setLineItems(availables);
+
+ if(!allAvailables) {
+ shoppingCartFacade.saveOrUpdateShoppingCart(cart);
+ }
+
+ super.setSessionAttribute(Constants.SHOPPING_CART, cart.getShoppingCartCode(), request);
+
+ if(shoppingCartCode==null && cart==null) {//error
+ return "redirect:/shop/cart/shoppingCart.html";
+ }
+
+
+ if(customer!=null) {
+ if(cart.getCustomerId()!=customer.getId().longValue()) {
+ return "redirect:/shop/shoppingCart.html";
+ }
+ } else {
+ customer = orderFacade.initEmptyCustomer(store);
+ AnonymousCustomer anonymousCustomer = (AnonymousCustomer)request.getAttribute(Constants.ANONYMOUS_CUSTOMER);
+ if(anonymousCustomer!=null && anonymousCustomer.getBilling()!=null) {
+ Billing billing = customer.getBilling();
+ billing.setCity(anonymousCustomer.getBilling().getCity());
+ Map<String,Country> countriesMap = countryService.getCountriesMap(language);
+ Country anonymousCountry = countriesMap.get(anonymousCustomer.getBilling().getCountry());
+ if(anonymousCountry!=null) {
+ billing.setCountry(anonymousCountry);
+ }
+ Map<String,Zone> zonesMap = zoneService.getZones(language);
+ Zone anonymousZone = zonesMap.get(anonymousCustomer.getBilling().getZone());
+ if(anonymousZone!=null) {
+ billing.setZone(anonymousZone);
+ }
+ if(anonymousCustomer.getBilling().getPostalCode()!=null) {
+ billing.setPostalCode(anonymousCustomer.getBilling().getPostalCode());
+ }
+ customer.setBilling(billing);
+ }
+ }
+
+
+ if(CollectionUtils.isEmpty(items)) {
+ return "redirect:/shop/shoppingCart.html";
+ }
+
+ if(order==null) {
+ order = orderFacade.initializeOrder(store, customer, cart, language);
+ }
+
+ boolean freeShoppingCart = shoppingCartService.isFreeShoppingCart(cart);
+ boolean requiresShipping = shoppingCartService.requiresShipping(cart);
+
+ /**
+ * hook for displaying or not delivery address configuration
+ */
+ ShippingMetaData shippingMetaData = shippingService.getShippingMetaData(store);
+ model.addAttribute("shippingMetaData",shippingMetaData);//TODO DTO
+
+ /** shipping **/
+ ShippingQuote quote = null;
+ if(requiresShipping) {
+ //System.out.println("** Berfore default shipping quote **");
+ //Get all applicable shipping quotes
+ quote = orderFacade.getShippingQuote(customer, cart, order, store, language);
+ model.addAttribute("shippingQuote", quote);
+ }
+
+ if(quote!=null) {
+ String shippingReturnCode = quote.getShippingReturnCode();
+
+ if(StringUtils.isBlank(shippingReturnCode) || shippingReturnCode.equals(ShippingQuote.NO_POSTAL_CODE)) {
+
+ if(order.getShippingSummary()==null) {
+ ShippingSummary summary = orderFacade.getShippingSummary(quote, store, language);
+ order.setShippingSummary(summary);
+ request.getSession().setAttribute(Constants.SHIPPING_SUMMARY, summary);//TODO DTO
+ }
+ if(order.getSelectedShippingOption()==null) {
+ order.setSelectedShippingOption(quote.getSelectedShippingOption());
+ }
+
+ //save quotes in HttpSession
+ List<ShippingOption> options = quote.getShippingOptions();
+ request.getSession().setAttribute(Constants.SHIPPING_OPTIONS, options);//TODO DTO
+
+ if(!CollectionUtils.isEmpty(options)) {
+
+ for(ShippingOption shipOption : options) {
+
+ StringBuilder moduleName = new StringBuilder();
+ moduleName.append("module.shipping.").append(shipOption.getShippingModuleCode());
+
+
+ String carrier = messages.getMessage(moduleName.toString(),locale);
+ String note = messages.getMessage(moduleName.append(".note").toString(), locale, "");
+
+ shipOption.setDescription(carrier);
+ shipOption.setNote(note);
+
+ //option name
+ if(!StringUtils.isBlank(shipOption.getOptionCode())) {
+ //try to get the translate
+ StringBuilder optionCodeBuilder = new StringBuilder();
+ try {
+
+ optionCodeBuilder.append("module.shipping.").append(shipOption.getShippingModuleCode());
+ String optionName = messages.getMessage(optionCodeBuilder.toString(),locale);
+ shipOption.setOptionName(optionName);
+ } catch(Exception e) {//label not found
+ LOGGER.warn("No shipping code found for " + optionCodeBuilder.toString());
+ }
+ }
+
+ }
+
+ }
+
+ }
+
+ if(quote.getDeliveryAddress()!=null) {
+ ReadableCustomerDeliveryAddressPopulator addressPopulator = new ReadableCustomerDeliveryAddressPopulator();
+ addressPopulator.setCountryService(countryService);
+ addressPopulator.setZoneService(zoneService);
+ ReadableDelivery deliveryAddress = new ReadableDelivery();
+ addressPopulator.populate(quote.getDeliveryAddress(), deliveryAddress, store, language);
+ model.addAttribute("deliveryAddress", deliveryAddress);
+ super.setSessionAttribute(Constants.KEY_SESSION_ADDRESS, deliveryAddress, request);
+ }
+
+
+ //get shipping countries
+ List<Country> shippingCountriesList = orderFacade.getShipToCountry(store, language);
+ model.addAttribute("countries", shippingCountriesList);
+ } else {
+ //get all countries
+ List<Country> countries = countryService.getCountries(language);
+ model.addAttribute("countries", countries);
+ }
+
+ if(quote!=null && quote.getShippingReturnCode()!=null && quote.getShippingReturnCode().equals(ShippingQuote.NO_SHIPPING_MODULE_CONFIGURED)) {
+ LOGGER.error("Shipping quote error " + quote.getShippingReturnCode());
+ model.addAttribute("errorMessages", messages.getMessage(quote.getShippingReturnCode(), locale, quote.getShippingReturnCode()));
+ }
+
+ if(quote!=null && !StringUtils.isBlank(quote.getQuoteError())) {
+ LOGGER.error("Shipping quote error " + quote.getQuoteError());
+ model.addAttribute("errorMessages", quote.getQuoteError());
+ }
+
+ if(quote!=null && quote.getShippingReturnCode()!=null && quote.getShippingReturnCode().equals(ShippingQuote.NO_SHIPPING_TO_SELECTED_COUNTRY)) {
+ LOGGER.error("Shipping quote error " + quote.getShippingReturnCode());
+ model.addAttribute("errorMessages", quote.getShippingReturnCode());
+ }
+ /** end shipping **/
+
+ //get payment methods
+ List<PaymentMethod> paymentMethods = paymentService.getAcceptedPaymentMethods(store);
+
+ //not free and no payment methods
+ if(CollectionUtils.isEmpty(paymentMethods) && !freeShoppingCart) {
+ LOGGER.error("No payment method configured");
+ model.addAttribute("errorMessages", messages.getMessage("payment.not.configured", locale,
+ "No payments configured"));
+ }
+
+ if(!CollectionUtils.isEmpty(paymentMethods)) {//select default payment method
+ PaymentMethod defaultPaymentSelected = null;
+ for(PaymentMethod paymentMethod : paymentMethods) {
+ if(paymentMethod.isDefaultSelected()) {
+ defaultPaymentSelected = paymentMethod;
+ break;
+ }
+ }
+
+ if(defaultPaymentSelected==null) {//forced default selection
+ defaultPaymentSelected = paymentMethods.get(0);
+ defaultPaymentSelected.setDefaultSelected(true);
+ }
+
+ order.setDefaultPaymentMethodCode(defaultPaymentSelected.getPaymentMethodCode());
+
+ }
+
+ //readable shopping cart items for order summary box
+ ShoppingCartData shoppingCart = shoppingCartFacade.getShoppingCartData(cart, language);
+ model.addAttribute( "cart", shoppingCart );
+ //TODO filter here
+
+
+ //order total
+ OrderTotalSummary orderTotalSummary = orderFacade.calculateOrderTotal(store, order, language);
+ order.setOrderTotalSummary(orderTotalSummary);
+ //if order summary has to be re-used
+ super.setSessionAttribute(Constants.ORDER_SUMMARY, orderTotalSummary, request);
+
+ model.addAttribute("order",order);
+ model.addAttribute("paymentMethods", paymentMethods);
+
+ /** template **/
+ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Checkout.checkout).append(".").append(store.getStoreTemplate());
+ return template.toString();
+
+
+ }
+
+
+ @RequestMapping("/commitPreAuthorized.html")
+ public String commitPreAuthorizedOrder(Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+ Language language = (Language)request.getAttribute("LANGUAGE");
+ ShopOrder order = super.getSessionAttribute(Constants.ORDER, request);
+ if(order==null) {
+ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Pages.timeout).append(".").append(store.getStoreTemplate());
+ return template.toString();
+ }
+
+ @SuppressWarnings("unchecked")
+ Map<String, Object> configs = (Map<String, Object>) request.getAttribute(Constants.REQUEST_CONFIGS);
+
+ if(configs!=null && configs.containsKey(Constants.DEBUG_MODE)) {
+ Boolean debugMode = (Boolean) configs.get(Constants.DEBUG_MODE);
+ if(debugMode) {
+ try {
+ ObjectMapper mapper = new ObjectMapper();
+ String jsonInString = mapper.writeValueAsString(order);
+ LOGGER.debug("Commit pre-authorized order -> " + jsonInString);
+ } catch(Exception de) {
+ LOGGER.error(de.getMessage());
+ }
+ }
+ }
+
+
+ try {
+
+ OrderTotalSummary totalSummary = super.getSessionAttribute(Constants.ORDER_SUMMARY, request);
+
+ if(totalSummary==null) {
+ totalSummary = orderFacade.calculateOrderTotal(store, order, language);
+ super.setSessionAttribute(Constants.ORDER_SUMMARY, totalSummary, request);
+ }
+
+
+ order.setOrderTotalSummary(totalSummary);
+
+ //already validated, proceed with commit
+ Order orderModel = this.commitOrder(order, request, locale);
+ super.setSessionAttribute(Constants.ORDER_ID, orderModel.getId(), request);
+
+ return "redirect:/shop/order/confirmation.html";
+
+ } catch(Exception e) {
+ LOGGER.error("Error while commiting order",e);
+ throw e;
+
+ }
+
+ }
+
+
+ private Order commitOrder(ShopOrder order, HttpServletRequest request, Locale locale) throws Exception, ServiceException {
+
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+ Language language = (Language)request.getAttribute("LANGUAGE");
+
+
+ String userName = null;
+ String password = null;
+
+ PersistableCustomer customer = order.getCustomer();
+
+ /** set username and password to persistable object **/
+ Authentication auth = SecurityContextHolder.getContext().getAuthentication();
+ Customer authCustomer = null;
+ if(auth != null &&
+ request.isUserInRole("AUTH_CUSTOMER")) {
+ authCustomer = customerFacade.getCustomerByUserName(auth.getName(), store);
+ //set id and authentication information
+ customer.setUserName(authCustomer.getNick());
+ customer.setEncodedPassword(authCustomer.getPassword());
+ customer.setId(authCustomer.getId());
+ } else {
+ //set customer id to null
+ customer.setId(null);
+ }
+
+ //if the customer is new, generate a password
+ if(customer.getId()==null || customer.getId()==0) {//new customer
+ password = UserReset.generateRandomString();
+ String encodedPassword = passwordEncoder.encode(password);
+ customer.setEncodedPassword(encodedPassword);
+ }
+
+ if(order.isShipToBillingAdress()) {
+ customer.setDelivery(customer.getBilling());
+ }
+
+
+
+ Customer modelCustomer = null;
+ try {//set groups
+ if(authCustomer==null) {//not authenticated, create a new volatile user
+ modelCustomer = customerFacade.getCustomerModel(customer, store, language);
+ customerFacade.setCustomerModelDefaultProperties(modelCustomer, store);
+ userName = modelCustomer.getNick();
+ LOGGER.debug( "About to persist volatile customer to database." );
+ customerService.saveOrUpdate( modelCustomer );
+ } else {//use existing customer
+ modelCustomer = customerFacade.populateCustomerModel(authCustomer, customer, store, language);
+ }
+ } catch(Exception e) {
+ throw new ServiceException(e);
+ }
+
+
+
+ Order modelOrder = null;
+ Transaction initialTransaction = (Transaction)super.getSessionAttribute(Constants.INIT_TRANSACTION_KEY, request);
+ if(initialTransaction!=null) {
+ modelOrder=orderFacade.processOrder(order, modelCustomer, initialTransaction, store, language);
+ } else {
+ modelOrder=orderFacade.processOrder(order, modelCustomer, store, language);
+ }
+
+ //save order id in session
+ super.setSessionAttribute(Constants.ORDER_ID, modelOrder.getId(), request);
+ //set a unique token for confirmation
+ super.setSessionAttribute(Constants.ORDER_ID_TOKEN, modelOrder.getId(), request);
+
+
+ //get cart
+ String cartCode = super.getSessionAttribute(Constants.SHOPPING_CART, request);
+ if(StringUtils.isNotBlank(cartCode)) {
+ try {
+ shoppingCartFacade.deleteShoppingCart(cartCode, store);
+ } catch(Exception e) {
+ LOGGER.error("Cannot delete cart " + cartCode, e);
+ throw new ServiceException(e);
+ }
+ }
+
+
+ //cleanup the order objects
+ super.removeAttribute(Constants.ORDER, request);
+ super.removeAttribute(Constants.ORDER_SUMMARY, request);
+ super.removeAttribute(Constants.INIT_TRANSACTION_KEY, request);
+ super.removeAttribute(Constants.SHIPPING_OPTIONS, request);
+ super.removeAttribute(Constants.SHIPPING_SUMMARY, request);
+ super.removeAttribute(Constants.SHOPPING_CART, request);
+
+
+
+
+ try {
+ //refresh customer --
+ modelCustomer = customerFacade.getCustomerByUserName(modelCustomer.getNick(), store);
+
+ //if has downloads, authenticate
+
+ //check if any downloads exist for this order6
+ List<OrderProductDownload> orderProductDownloads = orderProdctDownloadService.getByOrderId(modelOrder.getId());
+ if(CollectionUtils.isNotEmpty(orderProductDownloads)) {
+
+ LOGGER.debug("Is user authenticated ? ",auth.isAuthenticated());
+ if(auth != null &&
+ request.isUserInRole("AUTH_CUSTOMER")) {
+ //already authenticated
+ } else {
+ //authenticate
+ customerFacade.authenticate(modelCustomer, userName, password);
+ super.setSessionAttribute(Constants.CUSTOMER, modelCustomer, request);
+ }
+ //send new user registration template
+ if(order.getCustomer().getId()==null || order.getCustomer().getId().longValue()==0) {
+ //send email for new customer
+ customer.setClearPassword(password);//set clear password for email
+ customer.setUserName(userName);
+ emailTemplatesUtils.sendRegistrationEmail( customer, store, locale, request.getContextPath() );
+ }
+ }
+
+ //send order confirmation email to customer
+ emailTemplatesUtils.sendOrderEmail(modelCustomer.getEmailAddress(), modelCustomer, modelOrder, locale, language, store, request.getContextPath());
+
+ if(orderService.hasDownloadFiles(modelOrder)) {
+ emailTemplatesUtils.sendOrderDownloadEmail(modelCustomer, modelOrder, store, locale, request.getContextPath());
+
+ }
+
+ //send order confirmation email to merchant
+ emailTemplatesUtils.sendOrderEmail(store.getStoreEmailAddress(), modelCustomer, modelOrder, locale, language, store, request.getContextPath());
+
+
+
+ } catch(Exception e) {
+ LOGGER.error("Error while post processing order",e);
+ }
+
+
+
+
+ return modelOrder;
+
+
+ }
+
+
+
+
+ @SuppressWarnings("unchecked")
+ @RequestMapping("/commitOrder.html")
+ public String commitOrder(@CookieValue("cart") String cookie, @Valid @ModelAttribute(value="order") ShopOrder order, BindingResult bindingResult, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+ Language language = (Language)request.getAttribute("LANGUAGE");
+ //validate if session has expired
+
+ model.addAttribute("order", order);//TODO remove
+
+ Map<String, Object> configs = (Map<String, Object>) request.getAttribute(Constants.REQUEST_CONFIGS);
+
+ if(configs!=null && configs.containsKey(Constants.DEBUG_MODE)) {
+ Boolean debugMode = (Boolean) configs.get(Constants.DEBUG_MODE);
+ if(debugMode) {
+ try {
+ ObjectMapper mapper = new ObjectMapper();
+ String jsonInString = mapper.writeValueAsString(order);
+ LOGGER.debug("Commit order -> " + jsonInString);
+ } catch(Exception de) {
+ LOGGER.error(de.getMessage());
+ }
+ }
+ }
+
+ try {
+
+
+ ShippingMetaData shippingMetaData = shippingService.getShippingMetaData(store);
+ model.addAttribute("shippingMetaData",shippingMetaData);
+ //basic stuff
+ String shoppingCartCode = (String)request.getSession().getAttribute(Constants.SHOPPING_CART);
+ if(shoppingCartCode==null) {
+
+ if(cookie==null) {//session expired and cookie null, nothing to do
+ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Pages.timeout).append(".").append(store.getStoreTemplate());
+ return template.toString();
+ }
+ String merchantCookie[] = cookie.split("_");
+ String merchantStoreCode = merchantCookie[0];
+ if(!merchantStoreCode.equals(store.getCode())) {
+ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Pages.timeout).append(".").append(store.getStoreTemplate());
+ return template.toString();
+ }
+ shoppingCartCode = merchantCookie[1];
+ }
+ com.salesmanager.core.model.shoppingcart.ShoppingCart cart = null;
+
+ if(StringUtils.isBlank(shoppingCartCode)) {
+ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Pages.timeout).append(".").append(store.getStoreTemplate());
+ return template.toString();
+ }
+ cart = shoppingCartFacade.getShoppingCartModel(shoppingCartCode, store);
+
+ //readable shopping cart items for order summary box
+ ShoppingCartData shoppingCart = shoppingCartFacade.getShoppingCartData(cart, language);
+ model.addAttribute( "cart", shoppingCart );
+
+ Set<ShoppingCartItem> items = cart.getLineItems();
+ List<ShoppingCartItem> cartItems = new ArrayList<ShoppingCartItem>(items);
+ order.setShoppingCartItems(cartItems);
+
+ //get payment methods
+ List<PaymentMethod> paymentMethods = paymentService.getAcceptedPaymentMethods(store);
+ boolean freeShoppingCart = shoppingCartService.isFreeShoppingCart(cart);
+
+ //not free and no payment methods
+ if(CollectionUtils.isEmpty(paymentMethods) && !freeShoppingCart) {
+ LOGGER.error("No payment method configured");
+ model.addAttribute("errorMessages", "No payments configured");
+ }
+
+ if(!CollectionUtils.isEmpty(paymentMethods)) {//select default payment method
+ PaymentMethod defaultPaymentSelected = null;
+ for(PaymentMethod paymentMethod : paymentMethods) {
+ if(paymentMethod.isDefaultSelected()) {
+ defaultPaymentSelected = paymentMethod;
+ break;
+ }
+ }
+
+ if(defaultPaymentSelected==null) {//forced default selection
+ defaultPaymentSelected = paymentMethods.get(0);
+ defaultPaymentSelected.setDefaultSelected(true);
+ }
+
+
+ }
+
+ ShippingQuote quote = orderFacade.getShippingQuote(order.getCustomer(), cart, order, store, language);
+
+
+ if(quote!=null) {
+
+
+ //save quotes in HttpSession
+ List<ShippingOption> options = quote.getShippingOptions();
+ request.getSession().setAttribute(Constants.SHIPPING_OPTIONS, options);
+
+ if(!CollectionUtils.isEmpty(options)) {
+
+ for(ShippingOption shipOption : options) {
+
+ StringBuilder moduleName = new StringBuilder();
+ moduleName.append("module.shipping.").append(shipOption.getShippingModuleCode());
+
+
+ String carrier = messages.getMessage(moduleName.toString(),locale);
+
+ shipOption.setDescription(carrier);
+
+ //option name
+ if(!StringUtils.isBlank(shipOption.getOptionCode())) {
+ //try to get the translate
+ StringBuilder optionCodeBuilder = new StringBuilder();
+ try {
+
+ optionCodeBuilder.append("module.shipping.").append(shipOption.getShippingModuleCode()).append(".").append(shipOption.getOptionCode());
+ String optionName = messages.getMessage(optionCodeBuilder.toString(),locale);
+ shipOption.setOptionName(optionName);
+ } catch(Exception e) {//label not found
+ LOGGER.warn("No shipping code found for " + optionCodeBuilder.toString());
+ }
+ }
+
+ }
+
+ }
+
+ if(quote.getDeliveryAddress()!=null) {
+ ReadableCustomerDeliveryAddressPopulator addressPopulator = new ReadableCustomerDeliveryAddressPopulator();
+ addressPopulator.setCountryService(countryService);
+ addressPopulator.setZoneService(zoneService);
+ ReadableDelivery deliveryAddress = new ReadableDelivery();
+ addressPopulator.populate(quote.getDeliveryAddress(), deliveryAddress, store, language);
+ model.addAttribute("deliveryAddress", deliveryAddress);
+ }
+
+ }
+
+ model.addAttribute("shippingQuote", quote);
+ model.addAttribute("paymentMethods", paymentMethods);
+
+ if(quote!=null) {
+ List<Country> shippingCountriesList = orderFacade.getShipToCountry(store, language);
+ model.addAttribute("countries", shippingCountriesList);
+ } else {
+ //get all countries
+ List<Country> countries = countryService.getCountries(language);
+ model.addAttribute("countries", countries);
+ }
+
+ //set shipping summary
+ if(order.getSelectedShippingOption()!=null) {
+ ShippingSummary summary = (ShippingSummary)request.getSession().getAttribute(Constants.SHIPPING_SUMMARY);
+ @SuppressWarnings("unchecked")
+ List<ShippingOption> options = (List<ShippingOption>)request.getSession().getAttribute(Constants.SHIPPING_OPTIONS);
+
+ if(summary==null) {
+ summary = orderFacade.getShippingSummary(quote, store, language);
+ request.getSession().setAttribute(Constants.SHIPPING_SUMMARY, options);
+ }
+
+ if(options==null) {
+ options = quote.getShippingOptions();
+ request.getSession().setAttribute(Constants.SHIPPING_OPTIONS, options);
+ }
+
+ ReadableShippingSummary readableSummary = new ReadableShippingSummary();
+ ReadableShippingSummaryPopulator readableSummaryPopulator = new ReadableShippingSummaryPopulator();
+ readableSummaryPopulator.setPricingService(pricingService);
+ readableSummaryPopulator.populate(summary, readableSummary, store, language);
+
+
+ if(!CollectionUtils.isEmpty(options)) {
+
+ //get submitted shipping option
+ ShippingOption quoteOption = null;
+ ShippingOption selectedOption = order.getSelectedShippingOption();
+
+ //check if selectedOption exist
+ for(ShippingOption shipOption : options) {
+ if(!StringUtils.isBlank(shipOption.getOptionId()) && shipOption.getOptionId().equals(selectedOption.getOptionId())) {
+ quoteOption = shipOption;
+ }
+
+ }
+ if(quoteOption==null) {
+ quoteOption = options.get(0);
+ }
+
+ readableSummary.setSelectedShippingOption(quoteOption);
+ readableSummary.setShippingOptions(options);
+ summary.setShippingOption(quoteOption.getOptionId());
+ summary.setShipping(quoteOption.getOptionPrice());
+
+ }
+
+ order.setShippingSummary(summary);
+ }
+
+ OrderTotalSummary totalSummary = super.getSessionAttribute(Constants.ORDER_SUMMARY, request);
+
+ if(totalSummary==null) {
+ totalSummary = orderFacade.calculateOrderTotal(store, order, language);
+ super.setSessionAttribute(Constants.ORDER_SUMMARY, totalSummary, request);
+ }
+
+
+ order.setOrderTotalSummary(totalSummary);
+
+
+ orderFacade.validateOrder(order, bindingResult, new HashMap<String,String>(), store, locale);
+
+ if ( bindingResult.hasErrors() )
+ {
+ LOGGER.info( "found {} validation error while validating in customer registration ",
+ bindingResult.getErrorCount() );
+ String message = null;
+ List<ObjectError> errors = bindingResult.getAllErrors();
+ if(!CollectionUtils.isEmpty(errors)) {
+ for(ObjectError error : errors) {
+ message = error.getDefaultMessage();
+ break;
+ }
+ }
+ model.addAttribute("errorMessages", message);
+ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Checkout.checkout).append(".").append(store.getStoreTemplate());
+ return template.toString();
+
+ }
+
+ @SuppressWarnings("unused")
+ Order modelOrder = this.commitOrder(order, request, locale);
+
+
+ } catch(ServiceException se) {
+
+
+ LOGGER.error("Error while creating an order ", se);
+
+ String defaultMessage = messages.getMessage("message.error", locale);
+ model.addAttribute("errorMessages", defaultMessage);
+
+ if(se.getExceptionType()==ServiceException.EXCEPTION_VALIDATION) {
+ if(!StringUtils.isBlank(se.getMessageCode())) {
+ String messageLabel = messages.getMessage(se.getMessageCode(), locale, defaultMessage);
+ model.addAttribute("errorMessages", messageLabel);
+ }
+ } else if(se.getExceptionType()==ServiceException.EXCEPTION_PAYMENT_DECLINED) {
+ String paymentDeclinedMessage = messages.getMessage("message.payment.declined", locale);
+ if(!StringUtils.isBlank(se.getMessageCode())) {
+ String messageLabel = messages.getMessage(se.getMessageCode(), locale, paymentDeclinedMessage);
+ model.addAttribute("errorMessages", messageLabel);
+ } else {
+ model.addAttribute("errorMessages", paymentDeclinedMessage);
+ }
+ }
+
+
+
+ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Checkout.checkout).append(".").append(store.getStoreTemplate());
+ return template.toString();
+
+ } catch(Exception e) {
+ LOGGER.error("Error while commiting order",e);
+ throw e;
+
+ }
+
+ //redirect to completd
+ return "redirect:/shop/order/confirmation.html";
+
+
+
+
+
+ }
+
+
+
+
+ /**
+ * Recalculates shipping and tax following a change in country or province
+ * @param order
+ * @param request
+ * @param response
+ * @param locale
+ * @return
+ * @throws Exception
+ */
+ @SuppressWarnings("unchecked")
+ @RequestMapping(value={"/shippingQuotes.json"}, method=RequestMethod.POST)
+ public @ResponseBody ReadableShopOrder calculateShipping(@ModelAttribute(value="order") ShopOrder order, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ Language language = (Language)request.getAttribute("LANGUAGE");
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+ String shoppingCartCode = getSessionAttribute(Constants.SHOPPING_CART, request);
+
+ Map<String, Object> configs = (Map<String, Object>) request.getAttribute(Constants.REQUEST_CONFIGS);
+
+/* if(configs!=null && configs.containsKey(Constants.DEBUG_MODE)) {
+ Boolean debugMode = (Boolean) configs.get(Constants.DEBUG_MODE);
+ if(debugMode) {
+ try {
+ ObjectMapper mapper = new ObjectMapper();
+ String jsonInString = mapper.writeValueAsString(order);
+ LOGGER.info("Calculate order -> shoppingCartCode[ " + shoppingCartCode + "] -> " + jsonInString);
+ } catch(Exception de) {
+ LOGGER.error(de.getMessage());
+ }
+ }
+ }*/
+
+ Validate.notNull(shoppingCartCode,"shoppingCartCode does not exist in the session");
+
+ ReadableShopOrder readableOrder = new ReadableShopOrder();
+ try {
+
+ //re-generate cart
+ com.salesmanager.core.model.shoppingcart.ShoppingCart cart = shoppingCartFacade.getShoppingCartModel(shoppingCartCode, store);
+
+
+
+ ReadableShopOrderPopulator populator = new ReadableShopOrderPopulator();
+ populator.populate(order, readableOrder, store, language);
+
+ boolean requiresShipping = shoppingCartService.requiresShipping(cart);
+
+ /** shipping **/
+ ShippingQuote quote = null;
+ if(requiresShipping) {
+ quote = orderFacade.getShippingQuote(order.getCustomer(), cart, order, store, language);
+ }
+
+ if(quote!=null) {
+ String shippingReturnCode = quote.getShippingReturnCode();
+ if(CollectionUtils.isNotEmpty(quote.getShippingOptions()) || ShippingQuote.NO_POSTAL_CODE.equals(shippingReturnCode)) {
+
+ ShippingSummary summary = orderFacade.getShippingSummary(quote, store, language);
+ order.setShippingSummary(summary);//for total calculation
+
+
+ ReadableShippingSummary readableSummary = new ReadableShippingSummary();
+ ReadableShippingSummaryPopulator readableSummaryPopulator = new ReadableShippingSummaryPopulator();
+ readableSummaryPopulator.setPricingService(pricingService);
+ readableSummaryPopulator.populate(summary, readableSummary, store, language);
+
+ //additional informations
+/* if(quote.getQuoteInformations() != null && quote.getQuoteInformations().size() >0) {
+ for(String k : quote.getQuoteInformations().keySet()) {
+ Object o = quote.getQuoteInformations().get(k);
+ try {
+ readableSummary.getQuoteInformations().put(k, String.valueOf(o));
+ } catch(Exception e) {
+ LOGGER.error("Cannot cast value to string " + e.getMessage());
+ }
+ }
+ }*/
+
+ if(quote.getDeliveryAddress()!=null) {
+ ReadableCustomerDeliveryAddressPopulator addressPopulator = new ReadableCustomerDeliveryAddressPopulator();
+ addressPopulator.setCountryService(countryService);
+ addressPopulator.setZoneService(zoneService);
+ ReadableDelivery deliveryAddress = new ReadableDelivery();
+ addressPopulator.populate(quote.getDeliveryAddress(), deliveryAddress, store, language);
+ //model.addAttribute("deliveryAddress", deliveryAddress);
+ readableOrder.setDelivery(deliveryAddress);
+ super.setSessionAttribute(Constants.KEY_SESSION_ADDRESS, deliveryAddress, request);
+ }
+
+
+ //save quotes in HttpSession
+ List<ShippingOption> options = quote.getShippingOptions();
+
+ if(!CollectionUtils.isEmpty(options)) {
+
+ for(ShippingOption shipOption : options) {
+
+ StringBuilder moduleName = new StringBuilder();
+ moduleName.append("module.shipping.").append(shipOption.getShippingModuleCode());
+
+ String carrier = messages.getMessage(moduleName.toString(),new String[]{store.getStorename()},locale);
+
+ String note = messages.getMessage(moduleName.append(".note").toString(), locale, "");
+
+
+ shipOption.setDescription(carrier);
+ shipOption.setNote(note);
+
+ //option name
+ if(!StringUtils.isBlank(shipOption.getOptionCode())) {
+ //try to get the translate
+ StringBuilder optionCodeBuilder = new StringBuilder();
+ try {
+
+ optionCodeBuilder.append("module.shipping.").append(shipOption.getShippingModuleCode());
+ String optionName = messages.getMessage(optionCodeBuilder.toString(),locale);
+ shipOption.setOptionName(optionName);
+ } catch(Exception e) {//label not found
+ LOGGER.warn("No shipping code found for " + optionCodeBuilder.toString());
+ }
+ }
+
+ }
+
+ }
+
+ readableSummary.setSelectedShippingOption(quote.getSelectedShippingOption());
+
+
+ readableSummary.setShippingOptions(options);
+
+ readableOrder.setShippingSummary(readableSummary);//TODO add readable address
+ request.getSession().setAttribute(Constants.SHIPPING_SUMMARY, summary);
+ request.getSession().setAttribute(Constants.SHIPPING_OPTIONS, options);
+ request.getSession().setAttribute("SHIPPING_INFORMATIONS", readableSummary.getQuoteInformations());
+
+ if(configs!=null && configs.containsKey(Constants.DEBUG_MODE)) {
+ Boolean debugMode = (Boolean) configs.get(Constants.DEBUG_MODE);
+ if(debugMode) {
+
+ try {
+ ObjectMapper mapper = new ObjectMapper();
+ String jsonInString = mapper.writeValueAsString(readableOrder);
+ LOGGER.debug("Readable order -> shoppingCartCode[ " + shoppingCartCode + "] -> " + jsonInString);
+ System.out.println("Readable order -> shoppingCartCode[ " + shoppingCartCode + "] -> " + jsonInString);
+ } catch(Exception de) {
+ LOGGER.error(de.getMessage());
+ }
+
+
+ }
+ }
+
+
+ }
+
+ if(quote.getShippingReturnCode()!=null && quote.getShippingReturnCode().equals(ShippingQuote.NO_SHIPPING_MODULE_CONFIGURED)) {
+ LOGGER.error("Shipping quote error " + quote.getShippingReturnCode());
+ readableOrder.setErrorMessage(messages.getMessage("message.noshipping", locale));
+ }
+
+ if(quote.getShippingReturnCode()!=null && quote.getShippingReturnCode().equals(ShippingQuote.NO_SHIPPING_TO_SELECTED_COUNTRY)) {
+ if(CollectionUtils.isEmpty(quote.getShippingOptions())) {//only if there are no other options
+ LOGGER.error("Shipping quote error " + quote.getShippingReturnCode());
+ readableOrder.setErrorMessage(messages.getMessage("message.noshipping", locale));
+ }
+ }
+
+ //if(quote.getShippingReturnCode()!=null && quote.getShippingReturnCode().equals(ShippingQuote.NO_POSTAL_CODE)) {
+ // LOGGER.error("Shipping quote error " + quote.getShippingReturnCode());
+ // readableOrder.setErrorMessage(messages.getMessage("message.noshipping", locale));
+ //}
+
+ if(!StringUtils.isBlank(quote.getQuoteError())) {
+ LOGGER.error("Shipping quote error " + quote.getQuoteError());
+ readableOrder.setErrorMessage(messages.getMessage("message.noshippingerror", locale));
+ }
+
+
+ }
+
+ //set list of shopping cart items for core price calculation
+ List<ShoppingCartItem> items = new ArrayList<ShoppingCartItem>(cart.getLineItems());
+ order.setShoppingCartItems(items);
+
+ OrderTotalSummary orderTotalSummary = orderFacade.calculateOrderTotal(store, order, language);
+ super.setSessionAttribute(Constants.ORDER_SUMMARY, orderTotalSummary, request);
+
+
+ ReadableOrderTotalPopulator totalPopulator = new ReadableOrderTotalPopulator();
+ totalPopulator.setMessages(messages);
+ totalPopulator.setPricingService(pricingService);
+
+ List<ReadableOrderTotal> subtotals = new ArrayList<ReadableOrderTotal>();
+ for(OrderTotal total : orderTotalSummary.getTotals()) {
+ if(!total.getOrderTotalCode().equals("order.total.total")) {
+ ReadableOrderTotal t = new ReadableOrderTotal();
+ totalPopulator.populate(total, t, store, language);
+ subtotals.add(t);
+ } else {//grand total
+ ReadableOrderTotal ot = new ReadableOrderTotal();
+ totalPopulator.populate(total, ot, store, language);
+ readableOrder.setGrandTotal(ot.getTotal());
+ }
+ }
+
+
+ readableOrder.setSubTotals(subtotals);
+
+ } catch(Exception e) {
+ LOGGER.error("Error while getting shipping quotes",e);
+ readableOrder.setErrorMessage(messages.getMessage("message.error", locale));
+ }
+
+ return readableOrder;
+ }
+
+ /**
+ * Calculates the order total following price variation like changing a shipping option
+ * @param order
+ * @param request
+ * @param response
+ * @param locale
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping(value={"/calculateOrderTotal.json"}, method=RequestMethod.POST)
+ public @ResponseBody ReadableShopOrder calculateOrderTotal(@ModelAttribute(value="order") ShopOrder order, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+ Language language = (Language)request.getAttribute("LANGUAGE");
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+ String shoppingCartCode = getSessionAttribute(Constants.SHOPPING_CART, request);
+
+ Validate.notNull(shoppingCartCode,"shoppingCartCode does not exist in the session");
+
+ ReadableShopOrder readableOrder = new ReadableShopOrder();
+ try {
+
+ //re-generate cart
+ com.salesmanager.core.model.shoppingcart.ShoppingCart cart = shoppingCartFacade.getShoppingCartModel(shoppingCartCode, store);
+
+ ReadableShopOrderPopulator populator = new ReadableShopOrderPopulator();
+ populator.populate(order, readableOrder, store, language);
+
+ ReadableDelivery readableDelivery = super.getSessionAttribute(Constants.KEY_SESSION_ADDRESS, request);
+
+ if(order.getSelectedShippingOption()!=null) {
+ ShippingSummary summary = (ShippingSummary)request.getSession().getAttribute(Constants.SHIPPING_SUMMARY);
+ @SuppressWarnings("unchecked")
+ List<ShippingOption> options = (List<ShippingOption>)request.getSession().getAttribute(Constants.SHIPPING_OPTIONS);
+
+
+ order.setShippingSummary(summary);//for total calculation
+
+
+ ReadableShippingSummary readableSummary = new ReadableShippingSummary();
+ ReadableShippingSummaryPopulator readableSummaryPopulator = new ReadableShippingSummaryPopulator();
+ readableSummaryPopulator.setPricingService(pricingService);
+ readableSummaryPopulator.populate(summary, readableSummary, store, language);
+
+ //override summary
+ readableSummary.setDelivery(readableDelivery);
+
+ if(!CollectionUtils.isEmpty(options)) {
+
+ //get submitted shipping option
+ ShippingOption quoteOption = null;
+ ShippingOption selectedOption = order.getSelectedShippingOption();
+
+
+
+ //check if selectedOption exist
+ for(ShippingOption shipOption : options) {
+
+ StringBuilder moduleName = new StringBuilder();
+ moduleName.append("module.shipping.").append(shipOption.getShippingModuleCode());
+
+
+ String carrier = messages.getMessage(moduleName.toString(),locale);
+ String note = messages.getMessage(moduleName.append(".note").toString(), locale, "");
+
+ shipOption.setNote(note);
+
+ shipOption.setDescription(carrier);
+ if(!StringUtils.isBlank(shipOption.getOptionId()) && shipOption.getOptionId().equals(selectedOption.getOptionId())) {
+ quoteOption = shipOption;
+ }
+
+ //option name
+ if(!StringUtils.isBlank(shipOption.getOptionCode())) {
+ //try to get the translate
+ StringBuilder optionCodeBuilder = new StringBuilder();
+ try {
+
+ //optionCodeBuilder.append("module.shipping.").append(shipOption.getShippingModuleCode()).append(".").append(shipOption.getOptionCode());
+ optionCodeBuilder.append("module.shipping.").append(shipOption.getShippingModuleCode());
+ String optionName = messages.getMessage(optionCodeBuilder.toString(),locale);
+ shipOption.setOptionName(optionName);
+ } catch(Exception e) {//label not found
+ LOGGER.warn("No shipping code found for " + optionCodeBuilder.toString());
+ }
+ }
+ }
+
+ if(quoteOption==null) {
+ quoteOption = options.get(0);
+ }
+
+
+ readableSummary.setSelectedShippingOption(quoteOption);
+ readableSummary.setShippingOptions(options);
+
+ summary.setShippingOption(quoteOption.getOptionId());
+ summary.setShippingOptionCode(quoteOption.getOptionCode());
+ summary.setShipping(quoteOption.getOptionPrice());
+ order.setShippingSummary(summary);//override with new summary
+
+
+ @SuppressWarnings("unchecked")
+ Map<String,String> informations = (Map<String,String>)request.getSession().getAttribute("SHIPPING_INFORMATIONS");
+ readableSummary.setQuoteInformations(informations);
+
+ }
+
+
+ readableOrder.setShippingSummary(readableSummary);//TODO readable address format
+ readableOrder.setDelivery(readableDelivery);
+ }
+
+ //set list of shopping cart items for core price calculation
+ List<ShoppingCartItem> items = new ArrayList<ShoppingCartItem>(cart.getLineItems());
+ order.setShoppingCartItems(items);
+
+ //order total calculation
+ OrderTotalSummary orderTotalSummary = orderFacade.calculateOrderTotal(store, order, language);
+ super.setSessionAttribute(Constants.ORDER_SUMMARY, orderTotalSummary, request);
+
+
+ ReadableOrderTotalPopulator totalPopulator = new ReadableOrderTotalPopulator();
+ totalPopulator.setMessages(messages);
+ totalPopulator.setPricingService(pricingService);
+
+ List<ReadableOrderTotal> subtotals = new ArrayList<ReadableOrderTotal>();
+ for(OrderTotal total : orderTotalSummary.getTotals()) {
+ if(total.getOrderTotalCode() == null || !total.getOrderTotalCode().equals("order.total.total")) {
+ ReadableOrderTotal t = new ReadableOrderTotal();
+ totalPopulator.populate(total, t, store, language);
+ subtotals.add(t);
+ } else {//grand total
+ ReadableOrderTotal ot = new ReadableOrderTotal();
+ totalPopulator.populate(total, ot, store, language);
+ readableOrder.setGrandTotal(ot.getTotal());
+ }
+ }
+
+
+ readableOrder.setSubTotals(subtotals);
+
+ } catch(Exception e) {
+ LOGGER.error("Error while getting shipping quotes",e);
+ readableOrder.setErrorMessage(messages.getMessage("message.error", locale));
+ }
+
+ return readableOrder;
+ }
+
+
+
}
\ No newline at end of file
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/ShoppingOrderDownloadController.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/ShoppingOrderDownloadController.java
index 368d94a..b9f806d 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/ShoppingOrderDownloadController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/ShoppingOrderDownloadController.java
@@ -1,113 +1,113 @@
-package com.salesmanager.shop.store.controller.order;
-
-import com.salesmanager.core.business.services.content.ContentService;
-import com.salesmanager.core.business.services.order.OrderService;
-import com.salesmanager.core.business.services.order.orderproduct.OrderProductDownloadService;
-import com.salesmanager.core.model.content.FileContentType;
-import com.salesmanager.core.model.content.OutputContentFile;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.Order;
-import com.salesmanager.core.model.order.orderproduct.OrderProductDownload;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.store.controller.AbstractController;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-
-@Controller
-@RequestMapping(Constants.SHOP_URI+"/order")
-public class ShoppingOrderDownloadController extends AbstractController {
-
- private static final Logger LOGGER = LoggerFactory
- .getLogger(ShoppingOrderDownloadController.class);
-
- @Inject
- private ContentService contentService;
-
- @Inject
- private OrderService orderService;
-
- @Inject
- private OrderProductDownloadService orderProductDownloadService;
-
- /**
- * Virtual product(s) download link
- * @param id
- * @param model
- * @param request
- * @param response
- * @return
- * @throws Exception
- */
- @PreAuthorize("hasRole('AUTH_CUSTOMER')")
- @RequestMapping("/download/{orderId}/{id}.html")
- public @ResponseBody byte[] downloadFile(@PathVariable Long orderId, @PathVariable Long id, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
-
-
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
-
-
- FileContentType fileType = FileContentType.PRODUCT_DIGITAL;
-
- //get customer and check order
- Order order = orderService.getById(orderId);
- if(order==null) {
- LOGGER.warn("Order is null for id " + orderId);
- response.sendError(404, "Image not found");
- return null;
- }
-
-
- //order belongs to customer
- Customer customer = (Customer)super.getSessionAttribute(Constants.CUSTOMER, request);
- if(customer==null) {
- response.sendError(404, "Image not found");
- return null;
- }
-
-
- String fileName = null;//get it from OrderProductDownlaod
- OrderProductDownload download = orderProductDownloadService.getById(id);
- if(download==null) {
- LOGGER.warn("OrderProductDownload is null for id " + id);
- response.sendError(404, "Image not found");
- return null;
- }
-
- fileName = download.getOrderProductFilename();
-
- // needs to query the new API
- OutputContentFile file =contentService.getContentFile(store.getCode(), fileType, fileName);
-
-
- if(file!=null) {
- response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
- return file.getFile().toByteArray();
- } else {
- LOGGER.warn("Image not found for OrderProductDownload id " + id);
- response.sendError(404, "Image not found");
- return null;
- }
-
-
- // product image
- // example -> /download/12345/120.html
-
-
- }
-
-
-
-}
+package com.salesmanager.shop.store.controller.order;
+
+import com.salesmanager.core.business.services.content.ContentService;
+import com.salesmanager.core.business.services.order.OrderService;
+import com.salesmanager.core.business.services.order.orderproduct.OrderProductDownloadService;
+import com.salesmanager.core.model.content.FileContentType;
+import com.salesmanager.core.model.content.OutputContentFile;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.Order;
+import com.salesmanager.core.model.order.orderproduct.OrderProductDownload;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.store.controller.AbstractController;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+
+@Controller
+@RequestMapping(Constants.SHOP_URI+"/order")
+public class ShoppingOrderDownloadController extends AbstractController {
+
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(ShoppingOrderDownloadController.class);
+
+ @Inject
+ private ContentService contentService;
+
+ @Inject
+ private OrderService orderService;
+
+ @Inject
+ private OrderProductDownloadService orderProductDownloadService;
+
+ /**
+ * Virtual product(s) download link
+ * @param id
+ * @param model
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @PreAuthorize("hasRole('AUTH_CUSTOMER')")
+ @RequestMapping("/download/{orderId}/{id}.html")
+ public @ResponseBody byte[] downloadFile(@PathVariable Long orderId, @PathVariable Long id, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+
+
+ FileContentType fileType = FileContentType.PRODUCT_DIGITAL;
+
+ //get customer and check order
+ Order order = orderService.getById(orderId);
+ if(order==null) {
+ LOGGER.warn("Order is null for id " + orderId);
+ response.sendError(404, "Image not found");
+ return null;
+ }
+
+
+ //order belongs to customer
+ Customer customer = (Customer)super.getSessionAttribute(Constants.CUSTOMER, request);
+ if(customer==null) {
+ response.sendError(404, "Image not found");
+ return null;
+ }
+
+
+ String fileName = null;//get it from OrderProductDownlaod
+ OrderProductDownload download = orderProductDownloadService.getById(id);
+ if(download==null) {
+ LOGGER.warn("OrderProductDownload is null for id " + id);
+ response.sendError(404, "Image not found");
+ return null;
+ }
+
+ fileName = download.getOrderProductFilename();
+
+ // needs to query the new API
+ OutputContentFile file =contentService.getContentFile(store.getCode(), fileType, fileName);
+
+
+ if(file!=null) {
+ response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
+ return file.getFile().toByteArray();
+ } else {
+ LOGGER.warn("Image not found for OrderProductDownload id " + id);
+ response.sendError(404, "Image not found");
+ return null;
+ }
+
+
+ // product image
+ // example -> /download/12345/120.html
+
+
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/ShoppingOrderPaymentController.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/ShoppingOrderPaymentController.java
index 0c08f43..b98f3d8 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/ShoppingOrderPaymentController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/order/ShoppingOrderPaymentController.java
@@ -1,244 +1,244 @@
-package com.salesmanager.shop.store.controller.order;
-
-import com.salesmanager.core.business.modules.integration.payment.impl.PayPalExpressCheckoutPayment;
-import com.salesmanager.core.business.services.catalog.product.PricingService;
-import com.salesmanager.core.business.services.customer.CustomerService;
-import com.salesmanager.core.business.services.customer.attribute.CustomerOptionService;
-import com.salesmanager.core.business.services.customer.attribute.CustomerOptionValueService;
-import com.salesmanager.core.business.services.order.OrderService;
-import com.salesmanager.core.business.services.payments.PaymentService;
-import com.salesmanager.core.business.services.payments.TransactionService;
-import com.salesmanager.core.business.services.reference.country.CountryService;
-import com.salesmanager.core.business.services.reference.language.LanguageService;
-import com.salesmanager.core.business.services.reference.zone.ZoneService;
-import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
-import com.salesmanager.core.business.utils.CoreConfiguration;
-import com.salesmanager.core.business.utils.ajax.AjaxResponse;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.order.OrderTotalSummary;
-import com.salesmanager.core.model.payments.PaypalPayment;
-import com.salesmanager.core.model.payments.Transaction;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.shipping.ShippingSummary;
-import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
-import com.salesmanager.core.model.system.IntegrationConfiguration;
-import com.salesmanager.core.model.system.IntegrationModule;
-import com.salesmanager.core.modules.integration.payment.model.PaymentModule;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.model.order.ShopOrder;
-import com.salesmanager.shop.store.controller.AbstractController;
-import com.salesmanager.shop.store.controller.order.facade.OrderFacade;
-import com.salesmanager.shop.store.controller.shoppingCart.facade.ShoppingCartFacade;
-import com.salesmanager.shop.utils.LabelUtils;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.Validate;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Controller;
-import org.springframework.validation.BeanPropertyBindingResult;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.mobile.device.Device;
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import javax.validation.Valid;
-import java.util.*;
-
-@Controller
-@RequestMapping(Constants.SHOP_URI)
-public class ShoppingOrderPaymentController extends AbstractController {
-
- private static final Logger LOGGER = LoggerFactory
- .getLogger(ShoppingOrderPaymentController.class);
-
- private final static String INIT_ACTION = "init";
-
-
- @Inject
- private ShoppingCartFacade shoppingCartFacade;
-
- @Inject
- private ShoppingCartService shoppingCartService;
-
- @Inject
- private LanguageService languageService;
-
- @Inject
- private PaymentService paymentService;
-
- @Inject
- private OrderService orderService;
-
- @Inject
- private CountryService countryService;
-
- @Inject
- private ZoneService zoneService;
-
- @Inject
- private OrderFacade orderFacade;
-
- @Inject
- private LabelUtils messages;
-
- @Inject
- private PricingService pricingService;
-
- @Inject
- private CustomerService customerService;
-
- @Inject
- private CustomerOptionService customerOptionService;
-
- @Inject
- private CustomerOptionValueService customerOptionValueService;
-
- @Inject
- private TransactionService transactionService;
-
- @Inject
- private CoreConfiguration coreConfiguration;
-
- /**
- * Recalculates shipping and tax following a change in country or province
- * @param order
- * @param request
- * @param response
- * @param locale
- * @return
- * @throws Exception
- */
- @RequestMapping(value={"/order/payment/{action}/{paymentmethod}.html"}, method=RequestMethod.POST)
- public @ResponseBody String paymentAction(@Valid @ModelAttribute(value="order") ShopOrder order, @PathVariable String action, @PathVariable String paymentmethod, Device device, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
-
-
- Language language = (Language)request.getAttribute("LANGUAGE");
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
- String shoppingCartCode = getSessionAttribute(Constants.SHOPPING_CART, request);
-
- Validate.notNull(shoppingCartCode,"shoppingCartCode does not exist in the session");
- AjaxResponse ajaxResponse = new AjaxResponse();
-
- try {
-
-
- com.salesmanager.core.model.shoppingcart.ShoppingCart cart = shoppingCartFacade.getShoppingCartModel(shoppingCartCode, store);
-
- Set<ShoppingCartItem> items = cart.getLineItems();
- List<ShoppingCartItem> cartItems = new ArrayList<ShoppingCartItem>(items);
- order.setShoppingCartItems(cartItems);
-
- //validate order first
- Map<String,String> messages = new TreeMap<String,String>();
- orderFacade.validateOrder(order, new BeanPropertyBindingResult(order,"order"), messages, store, locale);
-
- if(CollectionUtils.isNotEmpty(messages.values())) {
- for(String key : messages.keySet()) {
- String value = messages.get(key);
- ajaxResponse.addValidationMessage(key, value);
- }
- ajaxResponse.setStatus(AjaxResponse.RESPONSE_STATUS_VALIDATION_FAILED);
- return ajaxResponse.toJSONString();
- }
-
-
- IntegrationConfiguration config = paymentService.getPaymentConfiguration(order.getPaymentModule(), store);
- IntegrationModule integrationModule = paymentService.getPaymentMethodByCode(store, order.getPaymentModule());
-
-
- //OrderTotalSummary orderTotalSummary = orderFacade.calculateOrderTotal(store, order, language);
- OrderTotalSummary orderTotalSummary = super.getSessionAttribute(Constants.ORDER_SUMMARY, request);
- if(orderTotalSummary==null) {
- orderTotalSummary = orderFacade.calculateOrderTotal(store, order, language);
- super.setSessionAttribute(Constants.ORDER_SUMMARY, orderTotalSummary, request);
- }
-
- ShippingSummary summary = (ShippingSummary)request.getSession().getAttribute("SHIPPING_SUMMARY");
-
- if(summary!=null) {
- order.setShippingSummary(summary);
- }
-
-
-
- if(action.equals(INIT_ACTION)) {
- if(paymentmethod.equals("PAYPAL")) {
- try {
-
-
-
- PaymentModule module = paymentService.getPaymentModule("paypal-express-checkout");
- PayPalExpressCheckoutPayment p = (PayPalExpressCheckoutPayment)module;
- PaypalPayment payment = new PaypalPayment();
- payment.setCurrency(store.getCurrency());
- Transaction transaction = p.initPaypalTransaction(store, cartItems, orderTotalSummary, payment, config, integrationModule);
- transactionService.create(transaction);
-
- super.setSessionAttribute(Constants.INIT_TRANSACTION_KEY, transaction, request);
-
- //https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout-mobile&token=tokenValueReturnedFromSetExpressCheckoutCall
- //For Desktop use
- //https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=tokenValueReturnedFromSetExpressCheckoutCall
-
- StringBuilder urlAppender = new StringBuilder();
-
- if(device!=null) {
- if(device.isNormal()) {
- urlAppender.append(coreConfiguration.getProperty("PAYPAL_EXPRESSCHECKOUT_REGULAR"));
- }
- if(device.isTablet()) {
- urlAppender.append(coreConfiguration.getProperty("PAYPAL_EXPRESSCHECKOUT_REGULAR"));
- }
- if(device.isMobile()) {
- urlAppender.append(coreConfiguration.getProperty("PAYPAL_EXPRESSCHECKOUT_MOBILE"));
- }
- } else {
- urlAppender.append(coreConfiguration.getProperty("PAYPAL_EXPRESSCHECKOUT_REGULAR"));
- }
-
- urlAppender.append(transaction.getTransactionDetails().get("TOKEN"));
-
-
-
- if(config.getEnvironment().equals(com.salesmanager.core.business.constants.Constants.PRODUCTION_ENVIRONMENT)) {
- StringBuilder url = new StringBuilder().append(coreConfiguration.getProperty("PAYPAL_EXPRESSCHECKOUT_PRODUCTION")).append(urlAppender.toString());
- ajaxResponse.addEntry("url", url.toString());
- } else {
- StringBuilder url = new StringBuilder().append(coreConfiguration.getProperty("PAYPAL_EXPRESSCHECKOUT_SANDBOX")).append(urlAppender.toString());
- ajaxResponse.addEntry("url", url.toString());
- }
-
- //keep order in session when user comes back from pp
- super.setSessionAttribute(Constants.ORDER, order, request);
- ajaxResponse.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
-
- } catch(Exception e) {
- ajaxResponse.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- }
-
-
- }
- }
-
- } catch(Exception e) {
- LOGGER.error("Error while performing payment action " + action + " for payment method " + paymentmethod ,e);
- ajaxResponse.setErrorMessage(e);
- ajaxResponse.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
-
- }
-
- return ajaxResponse.toJSONString();
- }
-
- //cancel - success paypal order
- @RequestMapping(value={"/paypal/checkout.html/{code}"}, method=RequestMethod.GET)
- public String returnPayPalPayment(@PathVariable String code, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
- if(Constants.SUCCESS.equals(code)) {
- return "redirect:" + Constants.SHOP_URI + "/order/commitPreAuthorized.html";
- } else {//process as cancel
- return "redirect:" + Constants.SHOP_URI + "/order/checkout.html";
- }
- }
-
-}
+package com.salesmanager.shop.store.controller.order;
+
+import com.salesmanager.core.business.modules.integration.payment.impl.PayPalExpressCheckoutPayment;
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.business.services.customer.attribute.CustomerOptionService;
+import com.salesmanager.core.business.services.customer.attribute.CustomerOptionValueService;
+import com.salesmanager.core.business.services.order.OrderService;
+import com.salesmanager.core.business.services.payments.PaymentService;
+import com.salesmanager.core.business.services.payments.TransactionService;
+import com.salesmanager.core.business.services.reference.country.CountryService;
+import com.salesmanager.core.business.services.reference.language.LanguageService;
+import com.salesmanager.core.business.services.reference.zone.ZoneService;
+import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
+import com.salesmanager.core.business.utils.CoreConfiguration;
+import com.salesmanager.core.business.utils.ajax.AjaxResponse;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.order.OrderTotalSummary;
+import com.salesmanager.core.model.payments.PaypalPayment;
+import com.salesmanager.core.model.payments.Transaction;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.shipping.ShippingSummary;
+import com.salesmanager.core.model.shoppingcart.ShoppingCartItem;
+import com.salesmanager.core.model.system.IntegrationConfiguration;
+import com.salesmanager.core.model.system.IntegrationModule;
+import com.salesmanager.core.modules.integration.payment.model.PaymentModule;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.model.order.ShopOrder;
+import com.salesmanager.shop.store.controller.AbstractController;
+import com.salesmanager.shop.store.controller.order.facade.OrderFacade;
+import com.salesmanager.shop.store.controller.shoppingCart.facade.ShoppingCartFacade;
+import com.salesmanager.shop.utils.LabelUtils;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.Validate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+import org.springframework.validation.BeanPropertyBindingResult;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.mobile.device.Device;
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.util.*;
+
+@Controller
+@RequestMapping(Constants.SHOP_URI)
+public class ShoppingOrderPaymentController extends AbstractController {
+
+ private static final Logger LOGGER = LoggerFactory
+ .getLogger(ShoppingOrderPaymentController.class);
+
+ private final static String INIT_ACTION = "init";
+
+
+ @Inject
+ private ShoppingCartFacade shoppingCartFacade;
+
+ @Inject
+ private ShoppingCartService shoppingCartService;
+
+ @Inject
+ private LanguageService languageService;
+
+ @Inject
+ private PaymentService paymentService;
+
+ @Inject
+ private OrderService orderService;
+
+ @Inject
+ private CountryService countryService;
+
+ @Inject
+ private ZoneService zoneService;
+
+ @Inject
+ private OrderFacade orderFacade;
+
+ @Inject
+ private LabelUtils messages;
+
+ @Inject
+ private PricingService pricingService;
+
+ @Inject
+ private CustomerService customerService;
+
+ @Inject
+ private CustomerOptionService customerOptionService;
+
+ @Inject
+ private CustomerOptionValueService customerOptionValueService;
+
+ @Inject
+ private TransactionService transactionService;
+
+ @Inject
+ private CoreConfiguration coreConfiguration;
+
+ /**
+ * Recalculates shipping and tax following a change in country or province
+ * @param order
+ * @param request
+ * @param response
+ * @param locale
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping(value={"/order/payment/{action}/{paymentmethod}.html"}, method=RequestMethod.POST)
+ public @ResponseBody String paymentAction(@Valid @ModelAttribute(value="order") ShopOrder order, @PathVariable String action, @PathVariable String paymentmethod, Device device, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+
+
+ Language language = (Language)request.getAttribute("LANGUAGE");
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+ String shoppingCartCode = getSessionAttribute(Constants.SHOPPING_CART, request);
+
+ Validate.notNull(shoppingCartCode,"shoppingCartCode does not exist in the session");
+ AjaxResponse ajaxResponse = new AjaxResponse();
+
+ try {
+
+
+ com.salesmanager.core.model.shoppingcart.ShoppingCart cart = shoppingCartFacade.getShoppingCartModel(shoppingCartCode, store);
+
+ Set<ShoppingCartItem> items = cart.getLineItems();
+ List<ShoppingCartItem> cartItems = new ArrayList<ShoppingCartItem>(items);
+ order.setShoppingCartItems(cartItems);
+
+ //validate order first
+ Map<String,String> messages = new TreeMap<String,String>();
+ orderFacade.validateOrder(order, new BeanPropertyBindingResult(order,"order"), messages, store, locale);
+
+ if(CollectionUtils.isNotEmpty(messages.values())) {
+ for(String key : messages.keySet()) {
+ String value = messages.get(key);
+ ajaxResponse.addValidationMessage(key, value);
+ }
+ ajaxResponse.setStatus(AjaxResponse.RESPONSE_STATUS_VALIDATION_FAILED);
+ return ajaxResponse.toJSONString();
+ }
+
+
+ IntegrationConfiguration config = paymentService.getPaymentConfiguration(order.getPaymentModule(), store);
+ IntegrationModule integrationModule = paymentService.getPaymentMethodByCode(store, order.getPaymentModule());
+
+
+ //OrderTotalSummary orderTotalSummary = orderFacade.calculateOrderTotal(store, order, language);
+ OrderTotalSummary orderTotalSummary = super.getSessionAttribute(Constants.ORDER_SUMMARY, request);
+ if(orderTotalSummary==null) {
+ orderTotalSummary = orderFacade.calculateOrderTotal(store, order, language);
+ super.setSessionAttribute(Constants.ORDER_SUMMARY, orderTotalSummary, request);
+ }
+
+ ShippingSummary summary = (ShippingSummary)request.getSession().getAttribute("SHIPPING_SUMMARY");
+
+ if(summary!=null) {
+ order.setShippingSummary(summary);
+ }
+
+
+
+ if(action.equals(INIT_ACTION)) {
+ if(paymentmethod.equals("PAYPAL")) {
+ try {
+
+
+
+ PaymentModule module = paymentService.getPaymentModule("paypal-express-checkout");
+ PayPalExpressCheckoutPayment p = (PayPalExpressCheckoutPayment)module;
+ PaypalPayment payment = new PaypalPayment();
+ payment.setCurrency(store.getCurrency());
+ Transaction transaction = p.initPaypalTransaction(store, cartItems, orderTotalSummary, payment, config, integrationModule);
+ transactionService.create(transaction);
+
+ super.setSessionAttribute(Constants.INIT_TRANSACTION_KEY, transaction, request);
+
+ //https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout-mobile&token=tokenValueReturnedFromSetExpressCheckoutCall
+ //For Desktop use
+ //https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=tokenValueReturnedFromSetExpressCheckoutCall
+
+ StringBuilder urlAppender = new StringBuilder();
+
+ if(device!=null) {
+ if(device.isNormal()) {
+ urlAppender.append(coreConfiguration.getProperty("PAYPAL_EXPRESSCHECKOUT_REGULAR"));
+ }
+ if(device.isTablet()) {
+ urlAppender.append(coreConfiguration.getProperty("PAYPAL_EXPRESSCHECKOUT_REGULAR"));
+ }
+ if(device.isMobile()) {
+ urlAppender.append(coreConfiguration.getProperty("PAYPAL_EXPRESSCHECKOUT_MOBILE"));
+ }
+ } else {
+ urlAppender.append(coreConfiguration.getProperty("PAYPAL_EXPRESSCHECKOUT_REGULAR"));
+ }
+
+ urlAppender.append(transaction.getTransactionDetails().get("TOKEN"));
+
+
+
+ if(config.getEnvironment().equals(com.salesmanager.core.business.constants.Constants.PRODUCTION_ENVIRONMENT)) {
+ StringBuilder url = new StringBuilder().append(coreConfiguration.getProperty("PAYPAL_EXPRESSCHECKOUT_PRODUCTION")).append(urlAppender.toString());
+ ajaxResponse.addEntry("url", url.toString());
+ } else {
+ StringBuilder url = new StringBuilder().append(coreConfiguration.getProperty("PAYPAL_EXPRESSCHECKOUT_SANDBOX")).append(urlAppender.toString());
+ ajaxResponse.addEntry("url", url.toString());
+ }
+
+ //keep order in session when user comes back from pp
+ super.setSessionAttribute(Constants.ORDER, order, request);
+ ajaxResponse.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
+
+ } catch(Exception e) {
+ ajaxResponse.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ }
+
+
+ }
+ }
+
+ } catch(Exception e) {
+ LOGGER.error("Error while performing payment action " + action + " for payment method " + paymentmethod ,e);
+ ajaxResponse.setErrorMessage(e);
+ ajaxResponse.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+
+ }
+
+ return ajaxResponse.toJSONString();
+ }
+
+ //cancel - success paypal order
+ @RequestMapping(value={"/paypal/checkout.html/{code}"}, method=RequestMethod.GET)
+ public String returnPayPalPayment(@PathVariable String code, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+ if(Constants.SUCCESS.equals(code)) {
+ return "redirect:" + Constants.SHOP_URI + "/order/commitPreAuthorized.html";
+ } else {//process as cancel
+ return "redirect:" + Constants.SHOP_URI + "/order/checkout.html";
+ }
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/product/facade/ProductFacade.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/product/facade/ProductFacade.java
index 18b5863..c308dd2 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/product/facade/ProductFacade.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/product/facade/ProductFacade.java
@@ -1,10 +1,22 @@
package com.salesmanager.shop.store.controller.product.facade;
+import java.util.List;
+
+import com.salesmanager.core.model.catalog.category.Category;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.ProductCriteria;
+import com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer;
+import com.salesmanager.core.model.catalog.product.review.ProductReview;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.catalog.manufacturer.PersistableManufacturer;
+import com.salesmanager.shop.model.catalog.manufacturer.ReadableManufacturer;
import com.salesmanager.shop.model.catalog.product.PersistableProduct;
+import com.salesmanager.shop.model.catalog.product.PersistableProductReview;
import com.salesmanager.shop.model.catalog.product.ProductPriceEntity;
import com.salesmanager.shop.model.catalog.product.ReadableProduct;
+import com.salesmanager.shop.model.catalog.product.ReadableProductList;
+import com.salesmanager.shop.model.catalog.product.ReadableProductReview;
public interface ProductFacade {
@@ -20,6 +32,17 @@ public interface ProductFacade {
*/
ReadableProduct getProduct(MerchantStore store, Long id, Language language) throws Exception;
+
+ /**
+ * Reads a product by code
+ * @param store
+ * @param uniqueCode
+ * @param language
+ * @return
+ * @throws Exception
+ */
+ ReadableProduct getProductByCode(MerchantStore store, String uniqueCode, Language language) throws Exception;
+
/**
* Get a product by sku and store
* @param store
@@ -50,4 +73,106 @@ public interface ProductFacade {
*/
ReadableProduct updateProductQuantity(ReadableProduct product, int quantity, Language language) throws Exception;
+ /**
+ * Deletes a product for a given product id
+ * @param product
+ * @throws Exception
+ */
+ void deleteProduct(Product product) throws Exception;
+
+
+ /**
+ * Filters a list of product based on criteria
+ * @param store
+ * @param language
+ * @param criterias
+ * @return
+ * @throws Exception
+ */
+ ReadableProductList getProductListsByCriterias(MerchantStore store, Language language, ProductCriteria criterias) throws Exception;
+
+
+ /**
+ * Adds a product to a category
+ * @param category
+ * @param product
+ * @return
+ * @throws Exception
+ */
+ ReadableProduct addProductToCategory(Category category, Product product, Language language) throws Exception;
+
+ /**
+ * Removes item from a category
+ * @param category
+ * @param product
+ * @param language
+ * @return
+ * @throws Exception
+ */
+ ReadableProduct removeProductFromCategory(Category category, Product product, Language language) throws Exception;
+
+
+ /**
+ * Saves or updates a Product review
+ * @param review
+ * @param language
+ * @throws Exception
+ */
+ void saveOrUpdateReview(PersistableProductReview review, MerchantStore store, Language language) throws Exception;
+
+ /**
+ * Deletes a product review
+ * @param review
+ * @param store
+ * @param language
+ * @throws Exception
+ */
+ void deleteReview(ProductReview review, MerchantStore store, Language language) throws Exception;
+
+ /**
+ * Get reviews for a given product
+ * @param product
+ * @param store
+ * @param language
+ * @return
+ * @throws Exception
+ */
+ List<ReadableProductReview> getProductReviews(Product product, MerchantStore store, Language language) throws Exception;
+
+ /**
+ * Creates or saves a manufacturer
+ * @param manufacturer
+ * @param store
+ * @param language
+ * @throws Exception
+ */
+ void saveOrUpdateManufacturer(PersistableManufacturer manufacturer, MerchantStore store, Language language) throws Exception;
+
+ /**
+ * Deletes a manufacturer
+ * @param manufacturer
+ * @param store
+ * @param language
+ * @throws Exception
+ */
+ void deleteManufacturer(Manufacturer manufacturer, MerchantStore store, Language language) throws Exception;
+
+ /**
+ * Get a Manufacturer by id
+ * @param id
+ * @param store
+ * @param language
+ * @return
+ * @throws Exception
+ */
+ ReadableManufacturer getManufacturer(Long id, MerchantStore store, Language language) throws Exception;
+
+ /**
+ * Get all Manufacturer
+ * @param store
+ * @param language
+ * @return
+ * @throws Exception
+ */
+ List<ReadableManufacturer> getAllManufacturers(MerchantStore store, Language language) throws Exception;
}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/product/facade/ProductFacadeImpl.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/product/facade/ProductFacadeImpl.java
index 8b81509..5c5df5b 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/product/facade/ProductFacadeImpl.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/product/facade/ProductFacadeImpl.java
@@ -1,31 +1,52 @@
package com.salesmanager.shop.store.controller.product.facade;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.inject.Inject;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang.Validate;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Service;
+
import com.salesmanager.core.business.services.catalog.category.CategoryService;
import com.salesmanager.core.business.services.catalog.product.PricingService;
import com.salesmanager.core.business.services.catalog.product.ProductService;
import com.salesmanager.core.business.services.catalog.product.attribute.ProductOptionService;
import com.salesmanager.core.business.services.catalog.product.attribute.ProductOptionValueService;
import com.salesmanager.core.business.services.catalog.product.manufacturer.ManufacturerService;
+import com.salesmanager.core.business.services.catalog.product.review.ProductReviewService;
+import com.salesmanager.core.business.services.customer.CustomerService;
import com.salesmanager.core.business.services.reference.language.LanguageService;
import com.salesmanager.core.business.services.tax.TaxClassService;
+import com.salesmanager.core.model.catalog.category.Category;
import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.ProductCriteria;
import com.salesmanager.core.model.catalog.product.availability.ProductAvailability;
+import com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer;
import com.salesmanager.core.model.catalog.product.price.ProductPrice;
+import com.salesmanager.core.model.catalog.product.review.ProductReview;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.model.catalog.manufacturer.PersistableManufacturer;
+import com.salesmanager.shop.model.catalog.manufacturer.ReadableManufacturer;
import com.salesmanager.shop.model.catalog.product.PersistableProduct;
+import com.salesmanager.shop.model.catalog.product.PersistableProductReview;
import com.salesmanager.shop.model.catalog.product.ProductPriceEntity;
import com.salesmanager.shop.model.catalog.product.ReadableProduct;
+import com.salesmanager.shop.model.catalog.product.ReadableProductList;
+import com.salesmanager.shop.model.catalog.product.ReadableProductReview;
import com.salesmanager.shop.populator.catalog.PersistableProductPopulator;
+import com.salesmanager.shop.populator.catalog.PersistableProductReviewPopulator;
import com.salesmanager.shop.populator.catalog.ReadableProductPopulator;
+import com.salesmanager.shop.populator.catalog.ReadableProductReviewPopulator;
+import com.salesmanager.shop.populator.manufacturer.PersistableManufacturerPopulator;
+import com.salesmanager.shop.populator.manufacturer.ReadableManufacturerPopulator;
import com.salesmanager.shop.utils.DateUtil;
import com.salesmanager.shop.utils.ImageFilePath;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.stereotype.Service;
-
-import javax.inject.Inject;
-import java.util.Date;
@Service("productFacade")
public class ProductFacadeImpl implements ProductFacade {
@@ -55,6 +76,12 @@ public class ProductFacadeImpl implements ProductFacade {
private PricingService pricingService;
@Inject
+ private CustomerService customerService;
+
+ @Inject
+ private ProductReviewService productReviewService;
+
+ @Inject
@Qualifier("img")
private ImageFilePath imageUtils;
@@ -62,6 +89,25 @@ public class ProductFacadeImpl implements ProductFacade {
public PersistableProduct saveProduct(MerchantStore store, PersistableProduct product, Language language)
throws Exception {
+
+ com.salesmanager.shop.model.catalog.manufacturer.Manufacturer manufacturer = product.getManufacturer();
+
+ if(manufacturer == null || (manufacturer.getId()==null || manufacturer.getId().longValue()==0)
+ && StringUtils.isBlank(manufacturer.getCode())) {
+
+ //get default manufacturer
+ Manufacturer defaultManufacturer = manufacturerService.getByCode(store, "DEFAULT");
+
+ if(defaultManufacturer != null) {
+
+ com.salesmanager.shop.model.catalog.manufacturer.Manufacturer m = new com.salesmanager.shop.model.catalog.manufacturer.Manufacturer();
+ m.setId(defaultManufacturer.getId());
+ m.setCode(defaultManufacturer.getCode());
+ product.setManufacturer(m);
+
+ }
+
+ }
PersistableProductPopulator persistableProductPopulator = new PersistableProductPopulator();
@@ -71,15 +117,22 @@ public class ProductFacadeImpl implements ProductFacade {
persistableProductPopulator.setProductOptionService(productOptionService);
persistableProductPopulator.setProductOptionValueService(productOptionValueService);
persistableProductPopulator.setTaxClassService(taxClassService);
+ persistableProductPopulator.setCustomerService(customerService);
- Product target = new Product();
+ Product target = null;
+ if(product.getId() != null && product.getId().longValue() > 0) {
+ target = productService.getById(product.getId());
+ } else {
+ target = new Product();
+ }
+
persistableProductPopulator.populate(product, target, store, language);
productService.create(target);
product.setId(target.getId());
-
+
return product;
@@ -196,4 +249,235 @@ public class ProductFacadeImpl implements ProductFacade {
return readableProduct;
}
+ @Override
+ public void deleteProduct(Product product) throws Exception {
+ productService.delete(product);
+
+ }
+
+ @Override
+ public ReadableProductList getProductListsByCriterias(MerchantStore store, Language language,
+ ProductCriteria criterias) throws Exception {
+
+
+ Validate.notNull(criterias, "ProductCriteria must be set for this product");
+
+ if(CollectionUtils.isNotEmpty(criterias.getCategoryIds())) {
+
+
+ if(criterias.getCategoryIds().size()==1) {
+
+ com.salesmanager.core.model.catalog.category.Category category = categoryService.getById(criterias.getCategoryIds().get(0));
+
+ if(category != null) {
+ String lineage = new StringBuilder().append(category.getLineage()).append(category.getId()).append("/").toString();
+
+ List<com.salesmanager.core.model.catalog.category.Category> categories = categoryService.listByLineage(store, lineage);
+
+ List<Long> ids = new ArrayList<Long>();
+ if(categories!=null && categories.size()>0) {
+ for(com.salesmanager.core.model.catalog.category.Category c : categories) {
+ ids.add(c.getId());
+ }
+ }
+ ids.add(category.getId());
+ criterias.setCategoryIds(ids);
+ }
+ }
+
+
+ }
+
+ com.salesmanager.core.model.catalog.product.ProductList products = productService.listByStore(store, language, criterias);
+
+
+ ReadableProductPopulator populator = new ReadableProductPopulator();
+ populator.setPricingService(pricingService);
+ populator.setimageUtils(imageUtils);
+
+
+ ReadableProductList productList = new ReadableProductList();
+ for(Product product : products.getProducts()) {
+
+ //create new proxy product
+ ReadableProduct readProduct = populator.populate(product, new ReadableProduct(), store, language);
+ productList.getProducts().add(readProduct);
+
+ }
+
+ productList.setTotalCount(products.getTotalCount());
+
+
+ return productList;
+ }
+
+ @Override
+ public ReadableProduct addProductToCategory(Category category, Product product, Language language) throws Exception {
+
+ Validate.notNull(category,"Category cannot be null");
+ Validate.notNull(product,"Product cannot be null");
+
+ product.getCategories().add(category);
+
+ productService.update(product);
+
+ ReadableProduct readableProduct = new ReadableProduct();
+
+ ReadableProductPopulator populator = new ReadableProductPopulator();
+
+ populator.setPricingService(pricingService);
+ populator.setimageUtils(imageUtils);
+ populator.populate(product, readableProduct, product.getMerchantStore(), language);
+
+ return readableProduct;
+
+
+ }
+
+ @Override
+ public ReadableProduct removeProductFromCategory(Category category, Product product, Language language)
+ throws Exception {
+
+ Validate.notNull(category,"Category cannot be null");
+ Validate.notNull(product,"Product cannot be null");
+
+ product.getCategories().remove(category);
+ productService.update(product);
+
+ ReadableProduct readableProduct = new ReadableProduct();
+
+ ReadableProductPopulator populator = new ReadableProductPopulator();
+
+ populator.setPricingService(pricingService);
+ populator.setimageUtils(imageUtils);
+ populator.populate(product, readableProduct, product.getMerchantStore(), language);
+
+ return readableProduct;
+ }
+
+ @Override
+ public ReadableProduct getProductByCode(MerchantStore store, String uniqueCode, Language language)
+ throws Exception {
+
+ Product product = productService.getByCode(uniqueCode, language);
+
+
+ ReadableProduct readableProduct = new ReadableProduct();
+
+ ReadableProductPopulator populator = new ReadableProductPopulator();
+
+ populator.setPricingService(pricingService);
+ populator.setimageUtils(imageUtils);
+ populator.populate(product, readableProduct, product.getMerchantStore(), language);
+
+ return readableProduct;
+ }
+
+ @Override
+ public void saveOrUpdateReview(PersistableProductReview review, MerchantStore store, Language language) throws Exception {
+ PersistableProductReviewPopulator populator = new PersistableProductReviewPopulator();
+ populator.setLanguageService(languageService);
+ populator.setCustomerService(customerService);
+ populator.setProductService(productService);
+
+ com.salesmanager.core.model.catalog.product.review.ProductReview rev = new com.salesmanager.core.model.catalog.product.review.ProductReview();
+ populator.populate(review, rev, store, language);
+
+ if(review.getId()==null) {
+ productReviewService.create(rev);
+ } else {
+ productReviewService.update(rev);
+ }
+
+
+ review.setId(rev.getId());
+
+ }
+
+ @Override
+ public void deleteReview(ProductReview review, MerchantStore store, Language language) throws Exception {
+ productReviewService.delete(review);
+
+ }
+
+ @Override
+ public List<ReadableProductReview> getProductReviews(Product product, MerchantStore store, Language language)
+ throws Exception {
+
+
+ List<ProductReview> reviews = productReviewService.getByProduct(product);
+
+ ReadableProductReviewPopulator populator = new ReadableProductReviewPopulator();
+
+ List<ReadableProductReview> productReviews = new ArrayList<ReadableProductReview>();
+
+ for(ProductReview review : reviews) {
+ ReadableProductReview readableReview = new ReadableProductReview();
+ populator.populate(review, readableReview, store, language);
+ productReviews.add(readableReview);
+ }
+
+
+
+ return productReviews;
+ }
+
+ @Override
+ public void saveOrUpdateManufacturer(PersistableManufacturer manufacturer, MerchantStore store, Language language)
+ throws Exception {
+
+ PersistableManufacturerPopulator populator = new PersistableManufacturerPopulator();
+ populator.setLanguageService(languageService);
+
+
+ Manufacturer manuf = new Manufacturer();
+ populator.populate(manufacturer, manuf, store, language);
+
+ manufacturerService.saveOrUpdate(manuf);
+
+ manufacturer.setId(manuf.getId());
+
+ }
+
+ @Override
+ public void deleteManufacturer(Manufacturer manufacturer, MerchantStore store, Language language) throws Exception {
+ manufacturerService.delete(manufacturer);
+
+ }
+
+ @Override
+ public ReadableManufacturer getManufacturer(Long id, MerchantStore store, Language language) throws Exception {
+ Manufacturer manufacturer = manufacturerService.getById(id);
+
+ if(manufacturer==null) {
+ return null;
+ }
+
+ ReadableManufacturer readableManufacturer = new ReadableManufacturer();
+
+ ReadableManufacturerPopulator populator = new ReadableManufacturerPopulator();
+ populator.populate(manufacturer, readableManufacturer, store, language);
+
+
+ return readableManufacturer;
+ }
+
+ @Override
+ public List<ReadableManufacturer> getAllManufacturers(MerchantStore store, Language language) throws Exception {
+
+
+ List<Manufacturer> manufacturers = manufacturerService.listByStore(store);
+ ReadableManufacturerPopulator populator = new ReadableManufacturerPopulator();
+ List<ReadableManufacturer> returnList = new ArrayList<ReadableManufacturer>();
+
+ for(Manufacturer m : manufacturers) {
+
+ ReadableManufacturer readableManufacturer = new ReadableManufacturer();
+ populator.populate(m, readableManufacturer, store, language);
+ returnList.add(readableManufacturer);
+ }
+
+ return returnList;
+ }
+
}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/product/ShopProductController.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/product/ShopProductController.java
index 530961f..474ef80 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/product/ShopProductController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/product/ShopProductController.java
@@ -1,398 +1,420 @@
-package com.salesmanager.shop.store.controller.product;
-
-import com.salesmanager.core.business.services.catalog.category.CategoryService;
-import com.salesmanager.core.business.services.catalog.product.PricingService;
-import com.salesmanager.core.business.services.catalog.product.ProductService;
-import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
-import com.salesmanager.core.business.services.catalog.product.relationship.ProductRelationshipService;
-import com.salesmanager.core.business.services.catalog.product.review.ProductReviewService;
-import com.salesmanager.core.business.utils.CacheUtils;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
-import com.salesmanager.core.model.catalog.product.attribute.ProductOptionDescription;
-import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValue;
-import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValueDescription;
-import com.salesmanager.core.model.catalog.product.price.FinalPrice;
-import com.salesmanager.core.model.catalog.product.relationship.ProductRelationship;
-import com.salesmanager.core.model.catalog.product.relationship.ProductRelationshipType;
-import com.salesmanager.core.model.catalog.product.review.ProductReview;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.model.catalog.product.ReadableProduct;
-import com.salesmanager.shop.model.catalog.product.ReadableProductPrice;
-import com.salesmanager.shop.model.catalog.product.ReadableProductReview;
-import com.salesmanager.shop.model.shop.Breadcrumb;
-import com.salesmanager.shop.model.shop.PageInformation;
-import com.salesmanager.shop.populator.catalog.ReadableFinalPricePopulator;
-import com.salesmanager.shop.populator.catalog.ReadableProductPopulator;
-import com.salesmanager.shop.populator.catalog.ReadableProductReviewPopulator;
-import com.salesmanager.shop.store.controller.ControllerConstants;
-import com.salesmanager.shop.store.model.catalog.Attribute;
-import com.salesmanager.shop.store.model.catalog.AttributeValue;
-import com.salesmanager.shop.utils.BreadcrumbsUtils;
-import com.salesmanager.shop.utils.ImageFilePath;
-import com.salesmanager.shop.utils.LabelUtils;
-import com.salesmanager.shop.utils.PageBuilderUtils;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.*;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.*;
-
-
-
-/**
- * Populates the product details page
- * @author Carl Samson
- *
- */
-@Controller
-@RequestMapping("/shop/product")
-public class ShopProductController {
-
- @Inject
- private ProductService productService;
-
- @Inject
- private ProductAttributeService productAttributeService;
-
- @Inject
- private ProductRelationshipService productRelationshipService;
-
- @Inject
- private PricingService pricingService;
-
- @Inject
- private ProductReviewService productReviewService;
-
- @Inject
- private LabelUtils messages;
-
- @Inject
- private CacheUtils cache;
-
- @Inject
- private CategoryService categoryService;
-
- @Inject
- private BreadcrumbsUtils breadcrumbsUtils;
-
- @Inject
- @Qualifier("img")
- private ImageFilePath imageUtils;
-
- private static final Logger LOG = LoggerFactory.getLogger(ShopProductController.class);
-
-
- /**
- * Display product details with reference to caller page
- * @param friendlyUrl
- * @param ref
- * @param model
- * @param request
- * @param response
- * @param locale
- * @return
- * @throws Exception
- */
- @RequestMapping("/{friendlyUrl}.html/ref={ref}")
- public String displayProductWithReference(@PathVariable final String friendlyUrl, @PathVariable final String ref, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
- return display(ref, friendlyUrl, model, request, response, locale);
- }
-
-
- /**
- * Display product details no reference
- * @param friendlyUrl
- * @param model
- * @param request
- * @param response
- * @param locale
- * @return
- * @throws Exception
- */
- @RequestMapping("/{friendlyUrl}.html")
- public String displayProduct(@PathVariable final String friendlyUrl, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
- return display(null, friendlyUrl, model, request, response, locale);
- }
-
-
- public String display(final String reference, final String friendlyUrl, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
-
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
- Language language = (Language)request.getAttribute("LANGUAGE");
-
- Product product = productService.getBySeUrl(store, friendlyUrl, locale);
-
- if(product==null) {
- return PageBuilderUtils.build404(store);
- }
-
- ReadableProductPopulator populator = new ReadableProductPopulator();
- populator.setPricingService(pricingService);
- populator.setimageUtils(imageUtils);
-
- ReadableProduct productProxy = populator.populate(product, new ReadableProduct(), store, language);
-
- //meta information
- PageInformation pageInformation = new PageInformation();
- pageInformation.setPageDescription(productProxy.getDescription().getMetaDescription());
- pageInformation.setPageKeywords(productProxy.getDescription().getKeyWords());
- pageInformation.setPageTitle(productProxy.getDescription().getTitle());
- pageInformation.setPageUrl(productProxy.getDescription().getFriendlyUrl());
-
- request.setAttribute(Constants.REQUEST_PAGE_INFORMATION, pageInformation);
-
- Breadcrumb breadCrumb = breadcrumbsUtils.buildProductBreadcrumb(reference, productProxy, store, language, request.getContextPath());
- request.getSession().setAttribute(Constants.BREADCRUMB, breadCrumb);
- request.setAttribute(Constants.BREADCRUMB, breadCrumb);
-
-
-
- StringBuilder relatedItemsCacheKey = new StringBuilder();
- relatedItemsCacheKey
- .append(store.getId())
- .append("_")
- .append(Constants.RELATEDITEMS_CACHE_KEY)
- .append("-")
- .append(language.getCode());
-
- StringBuilder relatedItemsMissed = new StringBuilder();
- relatedItemsMissed
- .append(relatedItemsCacheKey.toString())
- .append(Constants.MISSED_CACHE_KEY);
-
- Map<Long,List<ReadableProduct>> relatedItemsMap = null;
- List<ReadableProduct> relatedItems = null;
-
- if(store.isUseCache()) {
-
- //get from the cache
- relatedItemsMap = (Map<Long,List<ReadableProduct>>) cache.getFromCache(relatedItemsCacheKey.toString());
- if(relatedItemsMap==null) {
- //get from missed cache
- //Boolean missedContent = (Boolean)cache.getFromCache(relatedItemsMissed.toString());
-
- //if(missedContent==null) {
- relatedItems = relatedItems(store, product, language);
- if(relatedItems!=null) {
- relatedItemsMap = new HashMap<Long,List<ReadableProduct>>();
- relatedItemsMap.put(product.getId(), relatedItems);
- cache.putInCache(relatedItemsMap, relatedItemsCacheKey.toString());
- } else {
- //cache.putInCache(new Boolean(true), relatedItemsMissed.toString());
- }
- //}
- } else {
- relatedItems = relatedItemsMap.get(product.getId());
- }
- } else {
- relatedItems = relatedItems(store, product, language);
- }
-
- model.addAttribute("relatedProducts",relatedItems);
- Set<ProductAttribute> attributes = product.getAttributes();
-
- //split read only and options
- Map<Long,Attribute> readOnlyAttributes = null;
- Map<Long,Attribute> selectableOptions = null;
-
- if(!CollectionUtils.isEmpty(attributes)) {
- for(ProductAttribute attribute : attributes) {
- Attribute attr = null;
- AttributeValue attrValue = new AttributeValue();
- ProductOptionValue optionValue = attribute.getProductOptionValue();
-
- if(attribute.getAttributeDisplayOnly()==true) {//read only attribute
- if(readOnlyAttributes==null) {
- readOnlyAttributes = new TreeMap<Long,Attribute>();
- }
- attr = readOnlyAttributes.get(attribute.getProductOption().getId());
- if(attr==null) {
- attr = createAttribute(attribute, language);
- }
- if(attr!=null) {
- readOnlyAttributes.put(attribute.getProductOption().getId(), attr);
- attr.setReadOnlyValue(attrValue);
- }
- } else {//selectable option
- if(selectableOptions==null) {
- selectableOptions = new TreeMap<Long,Attribute>();
- }
- attr = selectableOptions.get(attribute.getProductOption().getId());
- if(attr==null) {
- attr = createAttribute(attribute, language);
- }
- if(attr!=null) {
- selectableOptions.put(attribute.getProductOption().getId(), attr);
- }
- }
-
-
-
- attrValue.setDefaultAttribute(attribute.getAttributeDefault());
- attrValue.setId(attribute.getId());//id of the attribute
- attrValue.setLanguage(language.getCode());
- if(attribute.getProductAttributePrice()!=null && attribute.getProductAttributePrice().doubleValue()>0) {
- String formatedPrice = pricingService.getDisplayAmount(attribute.getProductAttributePrice(), store);
- attrValue.setPrice(formatedPrice);
- }
-
- if(!StringUtils.isBlank(attribute.getProductOptionValue().getProductOptionValueImage())) {
- attrValue.setImage(imageUtils.buildProductPropertyImageUtils(store, attribute.getProductOptionValue().getProductOptionValueImage()));
- }
-
- List<ProductOptionValueDescription> descriptions = optionValue.getDescriptionsSettoList();
- ProductOptionValueDescription description = null;
- if(descriptions!=null && descriptions.size()>0) {
- description = descriptions.get(0);
- if(descriptions.size()>1) {
- for(ProductOptionValueDescription optionValueDescription : descriptions) {
- if(optionValueDescription.getLanguage().getId().intValue()==language.getId().intValue()) {
- description = optionValueDescription;
- break;
- }
- }
- }
- }
- attrValue.setName(description.getName());
- attrValue.setDescription(description.getDescription());
- List<AttributeValue> attrs = attr.getValues();
- if(attrs==null) {
- attrs = new ArrayList<AttributeValue>();
- attr.setValues(attrs);
- }
- attrs.add(attrValue);
- }
- }
-
- List<ProductReview> reviews = productReviewService.getByProduct(product, language);
- if(!CollectionUtils.isEmpty(reviews)) {
- List<ReadableProductReview> revs = new ArrayList<ReadableProductReview>();
- ReadableProductReviewPopulator reviewPopulator = new ReadableProductReviewPopulator();
- for(ProductReview review : reviews) {
- ReadableProductReview rev = new ReadableProductReview();
- reviewPopulator.populate(review, rev, store, language);
- revs.add(rev);
- }
- model.addAttribute("reviews", revs);
- }
-
- List<Attribute> attributesList = null;
- if(readOnlyAttributes!=null) {
- attributesList = new ArrayList<Attribute>(readOnlyAttributes.values());
- }
-
- List<Attribute> optionsList = null;
- if(selectableOptions!=null) {
- optionsList = new ArrayList<Attribute>(selectableOptions.values());
- }
-
- model.addAttribute("attributes", attributesList);
- model.addAttribute("options", optionsList);
-
- model.addAttribute("product", productProxy);
-
-
- /** template **/
- StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Product.product).append(".").append(store.getStoreTemplate());
-
- return template.toString();
- }
-
- @RequestMapping(value={"/{productId}/calculatePrice.json"}, method=RequestMethod.POST)
- public @ResponseBody
- ReadableProductPrice calculatePrice(@RequestParam(value="attributeIds[]") Long[] attributeIds, @PathVariable final Long productId, final HttpServletRequest request, final HttpServletResponse response, final Locale locale) throws Exception {
-
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
- Language language = (Language)request.getAttribute("LANGUAGE");
-
-
- Product product = productService.getById(productId);
-
- @SuppressWarnings("unchecked")
- List<Long> ids = new ArrayList<Long>(Arrays.asList(attributeIds));
- List<ProductAttribute> attributes = productAttributeService.getByAttributeIds(store, product, ids);
-
- for(ProductAttribute attribute : attributes) {
- if(attribute.getProduct().getId().longValue()!=productId.longValue()) {
- return null;
- }
- }
-
- FinalPrice price = pricingService.calculateProductPrice(product, attributes);
- ReadableProductPrice readablePrice = new ReadableProductPrice();
- ReadableFinalPricePopulator populator = new ReadableFinalPricePopulator();
- populator.setPricingService(pricingService);
- populator.populate(price, readablePrice, store, language);
- return readablePrice;
-
- }
-
- private Attribute createAttribute(ProductAttribute productAttribute, Language language) {
-
- Attribute attribute = new Attribute();
- attribute.setId(productAttribute.getProductOption().getId());//attribute of the option
- attribute.setType(productAttribute.getProductOption().getProductOptionType());
- List<ProductOptionDescription> descriptions = productAttribute.getProductOption().getDescriptionsSettoList();
- ProductOptionDescription description = null;
- if(descriptions!=null && descriptions.size()>0) {
- description = descriptions.get(0);
- if(descriptions.size()>1) {
- for(ProductOptionDescription optionDescription : descriptions) {
- if(optionDescription.getLanguage().getId().intValue()==language.getId().intValue()) {
- description = optionDescription;
- break;
- }
- }
- }
- }
-
- if(description==null) {
- return null;
- }
-
- attribute.setType(productAttribute.getProductOption().getProductOptionType());
- attribute.setLanguage(language.getCode());
- attribute.setName(description.getName());
- attribute.setCode(productAttribute.getProductOption().getCode());
-
- return attribute;
-
- }
-
- private List<ReadableProduct> relatedItems(MerchantStore store, Product product, Language language) throws Exception {
-
-
- ReadableProductPopulator populator = new ReadableProductPopulator();
- populator.setPricingService(pricingService);
- populator.setimageUtils(imageUtils);
-
- List<ProductRelationship> relatedItems = productRelationshipService.getByType(store, product, ProductRelationshipType.RELATED_ITEM);
- if(relatedItems!=null && relatedItems.size()>0) {
- List<ReadableProduct> items = new ArrayList<ReadableProduct>();
- for(ProductRelationship relationship : relatedItems) {
- Product relatedProduct = relationship.getRelatedProduct();
- ReadableProduct proxyProduct = populator.populate(relatedProduct, new ReadableProduct(), store, language);
- items.add(proxyProduct);
- }
- return items;
- }
-
- return null;
- }
-
-
-
-}
+package com.salesmanager.shop.store.controller.product;
+
+import com.salesmanager.core.business.services.catalog.category.CategoryService;
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
+import com.salesmanager.core.business.services.catalog.product.relationship.ProductRelationshipService;
+import com.salesmanager.core.business.services.catalog.product.review.ProductReviewService;
+import com.salesmanager.core.business.utils.CacheUtils;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
+import com.salesmanager.core.model.catalog.product.attribute.ProductOptionDescription;
+import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValue;
+import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValueDescription;
+import com.salesmanager.core.model.catalog.product.price.FinalPrice;
+import com.salesmanager.core.model.catalog.product.relationship.ProductRelationship;
+import com.salesmanager.core.model.catalog.product.relationship.ProductRelationshipType;
+import com.salesmanager.core.model.catalog.product.review.ProductReview;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.model.catalog.product.ReadableProduct;
+import com.salesmanager.shop.model.catalog.product.ReadableProductPrice;
+import com.salesmanager.shop.model.catalog.product.ReadableProductReview;
+import com.salesmanager.shop.model.shop.Breadcrumb;
+import com.salesmanager.shop.model.shop.PageInformation;
+import com.salesmanager.shop.populator.catalog.ReadableFinalPricePopulator;
+import com.salesmanager.shop.populator.catalog.ReadableProductPopulator;
+import com.salesmanager.shop.populator.catalog.ReadableProductReviewPopulator;
+import com.salesmanager.shop.store.controller.ControllerConstants;
+import com.salesmanager.shop.store.model.catalog.Attribute;
+import com.salesmanager.shop.store.model.catalog.AttributeValue;
+import com.salesmanager.shop.utils.BreadcrumbsUtils;
+import com.salesmanager.shop.utils.ImageFilePath;
+import com.salesmanager.shop.utils.LabelUtils;
+import com.salesmanager.shop.utils.PageBuilderUtils;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.*;
+
+
+
+/**
+ * Populates the product details page
+ * @author Carl Samson
+ *
+ */
+@Controller
+@RequestMapping("/shop/product")
+public class ShopProductController {
+
+ @Inject
+ private ProductService productService;
+
+ @Inject
+ private ProductAttributeService productAttributeService;
+
+ @Inject
+ private ProductRelationshipService productRelationshipService;
+
+ @Inject
+ private PricingService pricingService;
+
+ @Inject
+ private ProductReviewService productReviewService;
+
+ @Inject
+ private LabelUtils messages;
+
+ @Inject
+ private CacheUtils cache;
+
+ @Inject
+ private CategoryService categoryService;
+
+ @Inject
+ private BreadcrumbsUtils breadcrumbsUtils;
+
+ @Inject
+ @Qualifier("img")
+ private ImageFilePath imageUtils;
+
+ private static final Logger LOG = LoggerFactory.getLogger(ShopProductController.class);
+
+
+ /**
+ * Display product details with reference to caller page
+ * @param friendlyUrl
+ * @param ref
+ * @param model
+ * @param request
+ * @param response
+ * @param locale
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping("/{friendlyUrl}.html/ref={ref}")
+ public String displayProductWithReference(@PathVariable final String friendlyUrl, @PathVariable final String ref, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+ return display(ref, friendlyUrl, model, request, response, locale);
+ }
+
+
+ /**
+ * Display product details no reference
+ * @param friendlyUrl
+ * @param model
+ * @param request
+ * @param response
+ * @param locale
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping("/{friendlyUrl}.html")
+ public String displayProduct(@PathVariable final String friendlyUrl, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+ return display(null, friendlyUrl, model, request, response, locale);
+ }
+
+
+ public String display(final String reference, final String friendlyUrl, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception {
+
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+ Language language = (Language)request.getAttribute("LANGUAGE");
+
+ Product product = productService.getBySeUrl(store, friendlyUrl, locale);
+
+ if(product==null) {
+ return PageBuilderUtils.build404(store);
+ }
+
+ ReadableProductPopulator populator = new ReadableProductPopulator();
+ populator.setPricingService(pricingService);
+ populator.setimageUtils(imageUtils);
+
+ ReadableProduct productProxy = populator.populate(product, new ReadableProduct(), store, language);
+
+ //meta information
+ PageInformation pageInformation = new PageInformation();
+ pageInformation.setPageDescription(productProxy.getDescription().getMetaDescription());
+ pageInformation.setPageKeywords(productProxy.getDescription().getKeyWords());
+ pageInformation.setPageTitle(productProxy.getDescription().getTitle());
+ pageInformation.setPageUrl(productProxy.getDescription().getFriendlyUrl());
+
+ request.setAttribute(Constants.REQUEST_PAGE_INFORMATION, pageInformation);
+
+ Breadcrumb breadCrumb = breadcrumbsUtils.buildProductBreadcrumb(reference, productProxy, store, language, request.getContextPath());
+ request.getSession().setAttribute(Constants.BREADCRUMB, breadCrumb);
+ request.setAttribute(Constants.BREADCRUMB, breadCrumb);
+
+
+
+ StringBuilder relatedItemsCacheKey = new StringBuilder();
+ relatedItemsCacheKey
+ .append(store.getId())
+ .append("_")
+ .append(Constants.RELATEDITEMS_CACHE_KEY)
+ .append("-")
+ .append(language.getCode());
+
+ StringBuilder relatedItemsMissed = new StringBuilder();
+ relatedItemsMissed
+ .append(relatedItemsCacheKey.toString())
+ .append(Constants.MISSED_CACHE_KEY);
+
+ Map<Long,List<ReadableProduct>> relatedItemsMap = null;
+ List<ReadableProduct> relatedItems = null;
+
+ if(store.isUseCache()) {
+
+ //get from the cache
+ relatedItemsMap = (Map<Long,List<ReadableProduct>>) cache.getFromCache(relatedItemsCacheKey.toString());
+ if(relatedItemsMap==null) {
+ //get from missed cache
+ //Boolean missedContent = (Boolean)cache.getFromCache(relatedItemsMissed.toString());
+
+ //if(missedContent==null) {
+ relatedItems = relatedItems(store, product, language);
+ if(relatedItems!=null) {
+ relatedItemsMap = new HashMap<Long,List<ReadableProduct>>();
+ relatedItemsMap.put(product.getId(), relatedItems);
+ cache.putInCache(relatedItemsMap, relatedItemsCacheKey.toString());
+ } else {
+ //cache.putInCache(new Boolean(true), relatedItemsMissed.toString());
+ }
+ //}
+ } else {
+ relatedItems = relatedItemsMap.get(product.getId());
+ }
+ } else {
+ relatedItems = relatedItems(store, product, language);
+ }
+
+ model.addAttribute("relatedProducts",relatedItems);
+ Set<ProductAttribute> attributes = product.getAttributes();
+
+
+
+ //split read only and options
+ Map<Long,Attribute> readOnlyAttributes = null;
+ Map<Long,Attribute> selectableOptions = null;
+
+ if(!CollectionUtils.isEmpty(attributes)) {
+
+ for(ProductAttribute attribute : attributes) {
+ Attribute attr = null;
+ AttributeValue attrValue = new AttributeValue();
+ ProductOptionValue optionValue = attribute.getProductOptionValue();
+
+ if(attribute.getAttributeDisplayOnly()==true) {//read only attribute
+ if(readOnlyAttributes==null) {
+ readOnlyAttributes = new TreeMap<Long,Attribute>();
+ }
+ attr = readOnlyAttributes.get(attribute.getProductOption().getId());
+ if(attr==null) {
+ attr = createAttribute(attribute, language);
+ }
+ if(attr!=null) {
+ readOnlyAttributes.put(attribute.getProductOption().getId(), attr);
+ attr.setReadOnlyValue(attrValue);
+ }
+ } else {//selectable option
+ if(selectableOptions==null) {
+ selectableOptions = new TreeMap<Long,Attribute>();
+ }
+ attr = selectableOptions.get(attribute.getProductOption().getId());
+ if(attr==null) {
+ attr = createAttribute(attribute, language);
+ }
+ if(attr!=null) {
+ selectableOptions.put(attribute.getProductOption().getId(), attr);
+ }
+ }
+
+
+
+ attrValue.setDefaultAttribute(attribute.getAttributeDefault());
+ attrValue.setId(attribute.getId());//id of the attribute
+ attrValue.setLanguage(language.getCode());
+ if(attribute.getProductAttributePrice()!=null && attribute.getProductAttributePrice().doubleValue()>0) {
+ String formatedPrice = pricingService.getDisplayAmount(attribute.getProductAttributePrice(), store);
+ attrValue.setPrice(formatedPrice);
+ }
+
+ if(!StringUtils.isBlank(attribute.getProductOptionValue().getProductOptionValueImage())) {
+ attrValue.setImage(imageUtils.buildProductPropertyImageUtils(store, attribute.getProductOptionValue().getProductOptionValueImage()));
+ }
+ attrValue.setSortOrder(0);
+ if(attribute.getProductOptionSortOrder()!=null) {
+ attrValue.setSortOrder(attribute.getProductOptionSortOrder().intValue());
+ }
+
+ List<ProductOptionValueDescription> descriptions = optionValue.getDescriptionsSettoList();
+ ProductOptionValueDescription description = null;
+ if(descriptions!=null && descriptions.size()>0) {
+ description = descriptions.get(0);
+ if(descriptions.size()>1) {
+ for(ProductOptionValueDescription optionValueDescription : descriptions) {
+ if(optionValueDescription.getLanguage().getId().intValue()==language.getId().intValue()) {
+ description = optionValueDescription;
+ break;
+ }
+ }
+ }
+ }
+ attrValue.setName(description.getName());
+ attrValue.setDescription(description.getDescription());
+ List<AttributeValue> attrs = attr.getValues();
+ if(attrs==null) {
+ attrs = new ArrayList<AttributeValue>();
+ attr.setValues(attrs);
+ }
+ attrs.add(attrValue);
+ }
+
+ }
+
+
+
+ List<ProductReview> reviews = productReviewService.getByProduct(product, language);
+ if(!CollectionUtils.isEmpty(reviews)) {
+ List<ReadableProductReview> revs = new ArrayList<ReadableProductReview>();
+ ReadableProductReviewPopulator reviewPopulator = new ReadableProductReviewPopulator();
+ for(ProductReview review : reviews) {
+ ReadableProductReview rev = new ReadableProductReview();
+ reviewPopulator.populate(review, rev, store, language);
+ revs.add(rev);
+ }
+ model.addAttribute("reviews", revs);
+ }
+
+ List<Attribute> attributesList = null;
+ if(readOnlyAttributes!=null) {
+ attributesList = new ArrayList<Attribute>(readOnlyAttributes.values());
+ }
+
+ List<Attribute> optionsList = null;
+ if(selectableOptions!=null) {
+ optionsList = new ArrayList<Attribute>(selectableOptions.values());
+ //order attributes by sort order
+ for(Attribute attr : optionsList) {
+ Collections.sort(attr.getValues(), new Comparator<AttributeValue>(){
+ public int compare(AttributeValue o1, AttributeValue o2){
+ if(o1.getSortOrder()== o2.getSortOrder())
+ return 0;
+ return o1.getSortOrder() < o2.getSortOrder() ? -1 : 1;
+
+ }
+ });
+ }
+ }
+
+ model.addAttribute("attributes", attributesList);
+ model.addAttribute("options", optionsList);
+
+ model.addAttribute("product", productProxy);
+
+
+ /** template **/
+ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Product.product).append(".").append(store.getStoreTemplate());
+
+ return template.toString();
+ }
+
+ @RequestMapping(value={"/{productId}/calculatePrice.json"}, method=RequestMethod.POST)
+ public @ResponseBody
+ ReadableProductPrice calculatePrice(@RequestParam(value="attributeIds[]") Long[] attributeIds, @PathVariable final Long productId, final HttpServletRequest request, final HttpServletResponse response, final Locale locale) throws Exception {
+
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+ Language language = (Language)request.getAttribute("LANGUAGE");
+
+
+ Product product = productService.getById(productId);
+
+ @SuppressWarnings("unchecked")
+ List<Long> ids = new ArrayList<Long>(Arrays.asList(attributeIds));
+ List<ProductAttribute> attributes = productAttributeService.getByAttributeIds(store, product, ids);
+
+ for(ProductAttribute attribute : attributes) {
+ if(attribute.getProduct().getId().longValue()!=productId.longValue()) {
+ return null;
+ }
+ }
+
+ FinalPrice price = pricingService.calculateProductPrice(product, attributes);
+ ReadableProductPrice readablePrice = new ReadableProductPrice();
+ ReadableFinalPricePopulator populator = new ReadableFinalPricePopulator();
+ populator.setPricingService(pricingService);
+ populator.populate(price, readablePrice, store, language);
+ return readablePrice;
+
+ }
+
+ private Attribute createAttribute(ProductAttribute productAttribute, Language language) {
+
+ Attribute attribute = new Attribute();
+ attribute.setId(productAttribute.getProductOption().getId());//attribute of the option
+ attribute.setType(productAttribute.getProductOption().getProductOptionType());
+ List<ProductOptionDescription> descriptions = productAttribute.getProductOption().getDescriptionsSettoList();
+ ProductOptionDescription description = null;
+ if(descriptions!=null && descriptions.size()>0) {
+ description = descriptions.get(0);
+ if(descriptions.size()>1) {
+ for(ProductOptionDescription optionDescription : descriptions) {
+ if(optionDescription.getLanguage().getId().intValue()==language.getId().intValue()) {
+ description = optionDescription;
+ break;
+ }
+ }
+ }
+ }
+
+ if(description==null) {
+ return null;
+ }
+
+ attribute.setType(productAttribute.getProductOption().getProductOptionType());
+ attribute.setLanguage(language.getCode());
+ attribute.setName(description.getName());
+ attribute.setCode(productAttribute.getProductOption().getCode());
+
+
+ return attribute;
+
+ }
+
+ private List<ReadableProduct> relatedItems(MerchantStore store, Product product, Language language) throws Exception {
+
+
+ ReadableProductPopulator populator = new ReadableProductPopulator();
+ populator.setPricingService(pricingService);
+ populator.setimageUtils(imageUtils);
+
+ List<ProductRelationship> relatedItems = productRelationshipService.getByType(store, product, ProductRelationshipType.RELATED_ITEM);
+ if(relatedItems!=null && relatedItems.size()>0) {
+ List<ReadableProduct> items = new ArrayList<ReadableProduct>();
+ for(ProductRelationship relationship : relatedItems) {
+ Product relatedProduct = relationship.getRelatedProduct();
+ ReadableProduct proxyProduct = populator.populate(relatedProduct, new ReadableProduct(), store, language);
+ items.add(proxyProduct);
+ }
+ return items;
+ }
+
+ return null;
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/search/facade/SearchFacade.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/search/facade/SearchFacade.java
index f5e4aba..ab9990a 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/search/facade/SearchFacade.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/search/facade/SearchFacade.java
@@ -1,16 +1,39 @@
-package com.salesmanager.shop.store.controller.search.facade;
-
-import com.salesmanager.core.model.merchant.MerchantStore;
-
-/**
- * Different services for searching and indexing data
- * @author c.samson
- *
- */
-public interface SearchFacade {
-
-
-
- public void indexAllData(MerchantStore store) throws Exception;
-
-}
+package com.salesmanager.shop.store.controller.search.facade;
+
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.search.SearchResponse;
+import com.salesmanager.shop.model.catalog.SearchProductList;
+import com.salesmanager.shop.model.catalog.SearchProductRequest;
+
+/**
+ * Different services for searching and indexing data
+ * @author c.samson
+ *
+ */
+public interface SearchFacade {
+
+
+ /**
+ * This utility method will re-index all products in the catalogue
+ * @param store
+ * @throws Exception
+ */
+ public void indexAllData(MerchantStore store) throws Exception;
+
+ /**
+ * Produces a search request against elastic search
+ * @param searchRequest
+ * @return
+ * @throws Exception
+ */
+ public SearchProductList search(MerchantStore store, Language language, SearchProductRequest searchRequest) throws Exception;
+
+ /**
+ * Copy sm-core search response to a simple readable format populated with corresponding products
+ * @param searchResponse
+ * @return
+ */
+ public SearchProductList copySearchResponse(SearchResponse searchResponse, MerchantStore store, int start, int count, Language language) throws Exception;
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/search/facade/SearchFacadeImpl.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/search/facade/SearchFacadeImpl.java
index 3b03d66..fe2e95c 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/search/facade/SearchFacadeImpl.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/search/facade/SearchFacadeImpl.java
@@ -1,43 +1,182 @@
-package com.salesmanager.shop.store.controller.search.facade;
-
-import java.util.List;
-
-import javax.inject.Inject;
-
-import org.springframework.scheduling.annotation.Async;
-import org.springframework.stereotype.Service;
-
-import com.salesmanager.core.business.services.catalog.product.ProductService;
-import com.salesmanager.core.business.services.search.SearchService;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.merchant.MerchantStore;
-
-
-@Service("searchFacade")
-public class SearchFacadeImpl implements SearchFacade {
-
- @Inject
- private SearchService searchService;
-
- @Inject
- private ProductService productService;
-
- /**
- * Index all products from the catalogue
- * Better stop the system, remove ES indexex manually
- * restart ES and run this query
- */
- @Override
- @Async
- public void indexAllData(MerchantStore store) throws Exception {
-
-
- List<Product> products = productService.listByStore(store);
-
- for(Product product : products) {
- searchService.index(store, product);
- }
-
- }
-
-}
+package com.salesmanager.shop.store.controller.search.facade;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import com.salesmanager.core.business.services.catalog.category.CategoryService;
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.search.SearchService;
+import com.salesmanager.core.business.utils.CoreConfiguration;
+import com.salesmanager.core.model.catalog.category.Category;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.ProductCriteria;
+import com.salesmanager.core.model.catalog.product.ProductList;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.search.IndexProduct;
+import com.salesmanager.core.model.search.SearchEntry;
+import com.salesmanager.core.model.search.SearchFacet;
+import com.salesmanager.core.model.search.SearchResponse;
+import com.salesmanager.shop.model.catalog.SearchProductList;
+import com.salesmanager.shop.model.catalog.SearchProductRequest;
+import com.salesmanager.shop.model.catalog.category.ReadableCategory;
+import com.salesmanager.shop.model.catalog.product.ReadableProduct;
+import com.salesmanager.shop.populator.catalog.ReadableCategoryPopulator;
+import com.salesmanager.shop.populator.catalog.ReadableProductPopulator;
+import com.salesmanager.shop.utils.ImageFilePath;
+
+
+@Service("searchFacade")
+public class SearchFacadeImpl implements SearchFacade {
+
+ @Inject
+ private SearchService searchService;
+
+ @Inject
+ private ProductService productService;
+
+ @Inject
+ private CategoryService categoryService;
+
+ @Inject
+ private PricingService pricingService;
+
+ @Inject
+ @Qualifier("img")
+ private ImageFilePath imageUtils;
+
+ @Inject
+ private CoreConfiguration coreConfiguration;
+
+
+ private final static String CATEGORY_FACET_NAME = "categories";
+ private final static String MANUFACTURER_FACET_NAME = "manufacturer";
+
+ /**
+ * Index all products from the catalogue
+ * Better stop the system, remove ES indexex manually
+ * restart ES and run this query
+ */
+ @Override
+ @Async
+ public void indexAllData(MerchantStore store) throws Exception {
+
+
+ List<Product> products = productService.listByStore(store);
+
+ for(Product product : products) {
+ searchService.index(store, product);
+ }
+
+ }
+
+ @Override
+ public SearchProductList search(MerchantStore store, Language language, SearchProductRequest searchRequest) throws Exception {
+
+ String query = String.format(coreConfiguration.getProperty("SEARCH_QUERY"), searchRequest.getQuery());
+ SearchResponse response = searchService.search(store, language.getCode(), query, searchRequest.getCount(), searchRequest.getStart());
+ return this.copySearchResponse(response, store, searchRequest.getStart(), searchRequest.getCount(), language);
+ }
+
+ @Override
+ public SearchProductList copySearchResponse(SearchResponse searchResponse, MerchantStore merchantStore, int start, int count, Language language) throws Exception {
+
+ SearchProductList returnList = new SearchProductList();
+ List<SearchEntry> entries = searchResponse.getEntries();
+
+ if(!CollectionUtils.isEmpty(entries)) {
+ List<Long> ids = new ArrayList<Long>();
+ for(SearchEntry entry : entries) {
+ IndexProduct indexedProduct = entry.getIndexProduct();
+ Long id = Long.parseLong(indexedProduct.getId());
+
+ //No highlights
+ ids.add(id);
+ }
+
+ ProductCriteria searchCriteria = new ProductCriteria();
+ searchCriteria.setMaxCount(count);
+ searchCriteria.setStartIndex(start);
+ searchCriteria.setProductIds(ids);
+ searchCriteria.setAvailable(true);
+
+ ProductList productList = productService.listByStore(merchantStore, language, searchCriteria);
+
+ ReadableProductPopulator populator = new ReadableProductPopulator();
+ populator.setPricingService(pricingService);
+ populator.setimageUtils(imageUtils);
+
+ for(Product product : productList.getProducts()) {
+ //create new proxy product
+ ReadableProduct p = populator.populate(product, new ReadableProduct(), merchantStore, language);
+
+ returnList.getProducts().add(p);
+
+ }
+ returnList.setProductCount(productList.getProducts().size());
+ }
+
+ //Facets
+ Map<String,List<SearchFacet>> facets = searchResponse.getFacets();
+ List<SearchFacet> categoriesFacets = null;
+ List<SearchFacet> manufacturersFacets = null;
+ if(facets!=null) {
+ for(String key : facets.keySet()) {
+ //supports category and manufacturer
+ if(CATEGORY_FACET_NAME.equals(key)) {
+ categoriesFacets = facets.get(key);
+ }
+
+ if(MANUFACTURER_FACET_NAME.equals(key)) {
+ manufacturersFacets = facets.get(key);
+ }
+ }
+
+
+ if(categoriesFacets!=null) {
+ List<String> categoryCodes = new ArrayList<String>();
+ Map<String,Long> productCategoryCount = new HashMap<String,Long>();
+ for(SearchFacet facet : categoriesFacets) {
+ categoryCodes.add(facet.getName());
+ productCategoryCount.put(facet.getKey(), facet.getCount());
+ }
+
+ List<Category> categories = categoryService.listByCodes(merchantStore, categoryCodes, language);
+ List<ReadableCategory> categoryProxies = new ArrayList<ReadableCategory>();
+ ReadableCategoryPopulator populator = new ReadableCategoryPopulator();
+
+ for(Category category : categories) {
+ ReadableCategory categoryProxy = populator.populate(category, new ReadableCategory(), merchantStore, language);
+ Long total = productCategoryCount.get(categoryProxy.getCode());
+ if(total!=null) {
+ categoryProxy.setProductCount(total.intValue());
+ }
+ categoryProxies.add(categoryProxy);
+ }
+ returnList.setCategoryFacets(categoryProxies);
+ }
+
+ //todo manufacturer facets
+ if(manufacturersFacets!=null) {
+
+ }
+
+
+ }
+
+ return returnList;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/search/SearchController.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/search/SearchController.java
index 6ba70b8..239c281 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/search/SearchController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/search/SearchController.java
@@ -1,46 +1,41 @@
package com.salesmanager.shop.store.controller.search;
+import java.io.StringWriter;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.io.IOUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
import com.salesmanager.core.business.services.catalog.category.CategoryService;
import com.salesmanager.core.business.services.catalog.product.PricingService;
import com.salesmanager.core.business.services.catalog.product.ProductService;
import com.salesmanager.core.business.services.merchant.MerchantStoreService;
import com.salesmanager.core.business.services.reference.language.LanguageService;
import com.salesmanager.core.business.services.search.SearchService;
-import com.salesmanager.core.model.catalog.category.Category;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.ProductCriteria;
-import com.salesmanager.core.model.catalog.product.ProductList;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.search.*;
+import com.salesmanager.core.model.search.SearchKeywords;
+import com.salesmanager.core.model.search.SearchResponse;
import com.salesmanager.shop.constants.Constants;
import com.salesmanager.shop.model.catalog.SearchProductList;
-import com.salesmanager.shop.model.catalog.category.ReadableCategory;
-import com.salesmanager.shop.model.catalog.product.ReadableProduct;
-import com.salesmanager.shop.populator.catalog.ReadableCategoryPopulator;
-import com.salesmanager.shop.populator.catalog.ReadableProductPopulator;
import com.salesmanager.shop.store.controller.ControllerConstants;
+import com.salesmanager.shop.store.controller.search.facade.SearchFacade;
import com.salesmanager.shop.store.model.search.AutoCompleteRequest;
import com.salesmanager.shop.utils.ImageFilePath;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.io.IOUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.http.HttpHeaders;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.*;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import java.io.StringWriter;
-import java.util.*;
@Controller
public class SearchController {
@@ -64,6 +59,9 @@ public class SearchController {
private PricingService pricingService;
@Inject
+ private SearchFacade searchFacade;
+
+ @Inject
@Qualifier("img")
private ImageFilePath imageUtils;
@@ -71,8 +69,7 @@ public class SearchController {
private static final Logger LOGGER = LoggerFactory.getLogger(SearchController.class);
private final static int AUTOCOMPLETE_ENTRIES_COUNT = 15;
- private final static String CATEGORY_FACET_NAME = "categories";
- private final static String MANUFACTURER_FACET_NAME = "manufacturer";
+
/**
@@ -178,90 +175,8 @@ public class SearchController {
}
SearchResponse resp = searchService.search(merchantStore, language, json, max, start);
-
- List<SearchEntry> entries = resp.getEntries();
-
- if(!CollectionUtils.isEmpty(entries)) {
- List<Long> ids = new ArrayList<Long>();
- for(SearchEntry entry : entries) {
- IndexProduct indexedProduct = entry.getIndexProduct();
- Long id = Long.parseLong(indexedProduct.getId());
-
- //No highlights
- ids.add(id);
- }
-
- ProductCriteria searchCriteria = new ProductCriteria();
- searchCriteria.setMaxCount(max);
- searchCriteria.setStartIndex(start);
- searchCriteria.setProductIds(ids);
- searchCriteria.setAvailable(true);
-
- ProductList productList = productService.listByStore(merchantStore, l, searchCriteria);
-
- ReadableProductPopulator populator = new ReadableProductPopulator();
- populator.setPricingService(pricingService);
- populator.setimageUtils(imageUtils);
-
- for(Product product : productList.getProducts()) {
- //create new proxy product
- ReadableProduct p = populator.populate(product, new ReadableProduct(), merchantStore, l);
-
- //com.salesmanager.web.entity.catalog.Product p = catalogUtils.buildProxyProduct(product,merchantStore,LocaleUtils.getLocale(l));
- returnList.getProducts().add(p);
-
- }
- returnList.setProductCount(productList.getProducts().size());
- }
-
- //Facets
- Map<String,List<SearchFacet>> facets = resp.getFacets();
- List<SearchFacet> categoriesFacets = null;
- List<SearchFacet> manufacturersFacets = null;
- if(facets!=null) {
- for(String key : facets.keySet()) {
- //supports category and manufacturer
- if(CATEGORY_FACET_NAME.equals(key)) {
- categoriesFacets = facets.get(key);
- }
-
- if(MANUFACTURER_FACET_NAME.equals(key)) {
- manufacturersFacets = facets.get(key);
- }
- }
-
-
- if(categoriesFacets!=null) {
- List<String> categoryCodes = new ArrayList<String>();
- Map<String,Long> productCategoryCount = new HashMap<String,Long>();
- for(SearchFacet facet : categoriesFacets) {
- categoryCodes.add(facet.getName());
- productCategoryCount.put(facet.getKey(), facet.getCount());
- }
-
- List<Category> categories = categoryService.listByCodes(merchantStore, categoryCodes, l);
- List<ReadableCategory> categoryProxies = new ArrayList<ReadableCategory>();
- ReadableCategoryPopulator populator = new ReadableCategoryPopulator();
-
- for(Category category : categories) {
- //com.salesmanager.web.entity.catalog.Category categoryProxy = catalogUtils.buildProxyCategory(category, merchantStore, LocaleUtils.getLocale(l));
- ReadableCategory categoryProxy = populator.populate(category, new ReadableCategory(), merchantStore, l);
- Long total = productCategoryCount.get(categoryProxy.getCode());
- if(total!=null) {
- categoryProxy.setProductCount(total.intValue());
- }
- categoryProxies.add(categoryProxy);
- }
- returnList.setCategoryFacets(categoryProxies);
- }
-
- //todo manufacturer facets
- if(manufacturersFacets!=null) {
-
- }
-
-
- }
+ return searchFacade.copySearchResponse(resp, merchantStore, start, max, l);
+
} catch (Exception e) {
LOGGER.error("Exception occured while querying " + json,e);
}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/shoppingCart/facade/ShoppingCartFacade.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/shoppingCart/facade/ShoppingCartFacade.java
index 9e36367..b49c7ce 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/shoppingCart/facade/ShoppingCartFacade.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/shoppingCart/facade/ShoppingCartFacade.java
@@ -1,49 +1,84 @@
-/**
- *
- */
-package com.salesmanager.shop.store.controller.shoppingCart.facade;
-
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.shoppingcart.ShoppingCart;
-import com.salesmanager.shop.model.shoppingcart.ShoppingCartData;
-import com.salesmanager.shop.model.shoppingcart.ShoppingCartItem;
-
-import java.util.List;
-
-/**
- * </p>Shopping cart Facade which provide abstraction layer between
- * SM core module and Controller.
- * Only Data Object will be exposed to controller by hiding model
- * object from view.</p>
- * @author Umesh Awasthi
- * @version 1.2
- * @since1.2
- *
- */
-
-
-public interface ShoppingCartFacade {
-
- public ShoppingCartData addItemsToShoppingCart(ShoppingCartData shoppingCart,final ShoppingCartItem item, final MerchantStore store,final Language language,final Customer customer) throws Exception;
- public ShoppingCart createCartModel(final String shoppingCartCode, final MerchantStore store,final Customer customer) throws Exception;
- /**
- * Method responsible for getting shopping cart from
- * either session or from underlying DB.
- */
- public ShoppingCartData getShoppingCartData(final Customer customer,final MerchantStore store,final String shoppingCartId) throws Exception;
- public ShoppingCartData getShoppingCartData(final ShoppingCart shoppingCart) throws Exception;
- public ShoppingCartData getShoppingCartData(String code, MerchantStore store) throws Exception;
- public ShoppingCartData removeCartItem(final Long itemID, final String cartId,final MerchantStore store,final Language language ) throws Exception;
- public ShoppingCartData updateCartItem(final Long itemID, final String cartId, final long quantity,final MerchantStore store,Language language ) throws Exception;
- public void deleteShoppingCart(final Long id, final MerchantStore store) throws Exception;
- ShoppingCartData updateCartItems(List<ShoppingCartItem> shoppingCartItems,
- MerchantStore store, Language language) throws Exception;
- public ShoppingCart getShoppingCartModel(final String shoppingCartCode, MerchantStore store) throws Exception;
- public ShoppingCart getShoppingCartModel(final Customer customer, MerchantStore store) throws Exception;
- void deleteShoppingCart(String code, MerchantStore store) throws Exception;
- void saveOrUpdateShoppingCart(ShoppingCart cart) throws Exception;
-
-
-}
+/**
+ *
+ */
+package com.salesmanager.shop.store.controller.shoppingCart.facade;
+
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.shoppingcart.ShoppingCart;
+import com.salesmanager.shop.model.shoppingcart.PersistableShoppingCartItem;
+import com.salesmanager.shop.model.shoppingcart.ReadableShoppingCart;
+import com.salesmanager.shop.model.shoppingcart.ShoppingCartData;
+import com.salesmanager.shop.model.shoppingcart.ShoppingCartItem;
+
+import java.util.List;
+
+/**
+ * </p>Shopping cart Facade which provide abstraction layer between
+ * SM core module and Controller.
+ * Only Data Object will be exposed to controller by hiding model
+ * object from view.</p>
+ * @author Umesh Awasthi
+ * @author Carl Samson
+ * @version 1.0
+ * @since1.0
+ *
+ */
+
+
+public interface ShoppingCartFacade {
+
+ public ShoppingCartData addItemsToShoppingCart(ShoppingCartData shoppingCart,final ShoppingCartItem item, final MerchantStore store,final Language language,final Customer customer) throws Exception;
+ public ShoppingCart createCartModel(final String shoppingCartCode, final MerchantStore store,final Customer customer) throws Exception;
+ /**
+ * Method responsible for getting shopping cart from
+ * either session or from underlying DB.
+ */
+ public ShoppingCartData getShoppingCartData(final Customer customer,final MerchantStore store,final String shoppingCartId, Language language) throws Exception;
+ public ShoppingCartData getShoppingCartData(final ShoppingCart shoppingCart, Language language) throws Exception;
+ public ShoppingCartData getShoppingCartData(String code, MerchantStore store, Language lnguage) throws Exception;
+ public ShoppingCartData removeCartItem(final Long itemID, final String cartId,final MerchantStore store,final Language language ) throws Exception;
+ public ShoppingCartData updateCartItem(final Long itemID, final String cartId, final long quantity,final MerchantStore store,Language language ) throws Exception;
+ public void deleteShoppingCart(final Long id, final MerchantStore store) throws Exception;
+ ShoppingCartData updateCartItems(List<ShoppingCartItem> shoppingCartItems,
+ MerchantStore store, Language language) throws Exception;
+ public ShoppingCart getShoppingCartModel(final String shoppingCartCode, MerchantStore store) throws Exception;
+ public ShoppingCart getShoppingCartModel(Long id, MerchantStore store) throws Exception;
+ public ShoppingCart getShoppingCartModel(final Customer customer, MerchantStore store) throws Exception;
+ void deleteShoppingCart(String code, MerchantStore store) throws Exception;
+ void saveOrUpdateShoppingCart(ShoppingCart cart) throws Exception;
+
+ /**
+ * Get ShoppingCart
+ * This method is used by the API
+ * @param customer
+ * @param store
+ * @param language
+ * @return
+ * @throws Exception
+ */
+ ReadableShoppingCart getCart(Customer customer, MerchantStore store, Language language) throws Exception;
+
+ /**
+ * Add product to ShoppingCart
+ * This method is used by the API
+ * @param customer
+ * @param item
+ * @param store
+ * @param language
+ * @return
+ * @throws Exception
+ */
+ ReadableShoppingCart addToCart(Customer customer, PersistableShoppingCartItem item, MerchantStore store, Language language) throws Exception;
+
+ /**
+ * Retrieves a shopping cart by ID
+ * @param shoppingCartId
+ * @param store
+ * @param language
+ * @return
+ * @throws Exception
+ */
+ ReadableShoppingCart getById(Long shoppingCartId, MerchantStore store, Language language) throws Exception;
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/shoppingCart/facade/ShoppingCartFacadeImpl.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/shoppingCart/facade/ShoppingCartFacadeImpl.java
index 172eba3..665104c 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/shoppingCart/facade/ShoppingCartFacadeImpl.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/shoppingCart/facade/ShoppingCartFacadeImpl.java
@@ -1,546 +1,793 @@
-/**
- *
- */
-package com.salesmanager.shop.store.controller.shoppingCart.facade;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.catalog.product.PricingService;
-import com.salesmanager.core.business.services.catalog.product.ProductService;
-import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
-import com.salesmanager.core.business.services.shoppingcart.ShoppingCartCalculationService;
-import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
-import com.salesmanager.core.business.utils.ProductPriceUtils;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
-import com.salesmanager.core.model.catalog.product.price.FinalPrice;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.core.model.shoppingcart.ShoppingCart;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.model.order.CartModificationException;
-import com.salesmanager.shop.model.shoppingcart.ShoppingCartAttribute;
-import com.salesmanager.shop.model.shoppingcart.ShoppingCartData;
-import com.salesmanager.shop.model.shoppingcart.ShoppingCartItem;
-import com.salesmanager.shop.populator.shoppingCart.ShoppingCartDataPopulator;
-import com.salesmanager.shop.utils.ImageFilePath;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.Validate;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.stereotype.Service;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
-
-import javax.inject.Inject;
-import javax.persistence.NoResultException;
-import java.util.*;
-
-/**
- * @author Umesh Awasthi
- * @version 1.2
- * @since 1.2
- */
-@Service( value = "shoppingCartFacade" )
-public class ShoppingCartFacadeImpl
- implements ShoppingCartFacade
-{
-
-
- private static final Logger LOG = LoggerFactory.getLogger(ShoppingCartFacadeImpl.class);
-
- @Inject
- private ShoppingCartService shoppingCartService;
-
- @Inject
- ShoppingCartCalculationService shoppingCartCalculationService;
-
- @Inject
- private ProductPriceUtils productPriceUtils;
-
- @Inject
- private ProductService productService;
-
- @Inject
- private PricingService pricingService;
-
- @Inject
- private ProductAttributeService productAttributeService;
-
- @Inject
- @Qualifier("img")
- private ImageFilePath imageUtils;
-
- public void deleteShoppingCart(final Long id, final MerchantStore store) throws Exception {
- ShoppingCart cart = shoppingCartService.getById(id, store);
- if(cart!=null) {
- shoppingCartService.deleteCart(cart);
- }
- }
-
- @Override
- public void deleteShoppingCart(final String code, final MerchantStore store) throws Exception {
- ShoppingCart cart = shoppingCartService.getByCode(code, store);
- if(cart!=null) {
- shoppingCartService.deleteCart(cart);
- }
- }
-
- @Override
- public ShoppingCartData addItemsToShoppingCart( final ShoppingCartData shoppingCartData,
- final ShoppingCartItem item, final MerchantStore store, final Language language,final Customer customer )
- throws Exception
- {
-
- ShoppingCart cartModel = null;
- if ( !StringUtils.isBlank( item.getCode() ) )
- {
- // get it from the db
- cartModel = getShoppingCartModel( item.getCode(), store );
- if ( cartModel == null )
- {
- cartModel = createCartModel( shoppingCartData.getCode(), store,customer );
- }
-
- }
-
- if ( cartModel == null )
- {
-
- final String shoppingCartCode =
- StringUtils.isNotBlank( shoppingCartData.getCode() ) ? shoppingCartData.getCode() : null;
- cartModel = createCartModel( shoppingCartCode, store,customer );
-
- }
- com.salesmanager.core.model.shoppingcart.ShoppingCartItem shoppingCartItem =
- createCartItem( cartModel, item, store );
-
- boolean duplicateFound = false;
- if(CollectionUtils.isEmpty(item.getShoppingCartAttributes())) {//increment quantity
- //get duplicate item from the cart
- Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> cartModelItems = cartModel.getLineItems();
- for(com.salesmanager.core.model.shoppingcart.ShoppingCartItem cartItem : cartModelItems) {
- if(cartItem.getProduct().getId().longValue()==shoppingCartItem.getProduct().getId().longValue()) {
- if(CollectionUtils.isEmpty(cartItem.getAttributes())) {
- if(!duplicateFound) {
- if(!shoppingCartItem.isProductVirtual()) {
- cartItem.setQuantity(cartItem.getQuantity() + shoppingCartItem.getQuantity());
- }
- duplicateFound = true;
- break;
- }
- }
- }
- }
- }
-
- if(!duplicateFound) {
- cartModel.getLineItems().add( shoppingCartItem );
- }
-
- /** Update cart in database with line items **/
- shoppingCartService.saveOrUpdate( cartModel );
-
- //refresh cart
- cartModel = shoppingCartService.getById(cartModel.getId(), store);
-
- shoppingCartCalculationService.calculate( cartModel, store, language );
-
- ShoppingCartDataPopulator shoppingCartDataPopulator = new ShoppingCartDataPopulator();
- shoppingCartDataPopulator.setShoppingCartCalculationService( shoppingCartCalculationService );
- shoppingCartDataPopulator.setPricingService( pricingService );
- shoppingCartDataPopulator.setimageUtils(imageUtils);
-
- return shoppingCartDataPopulator.populate( cartModel, store, language );
- }
-
- private com.salesmanager.core.model.shoppingcart.ShoppingCartItem createCartItem( final ShoppingCart cartModel,
- final ShoppingCartItem shoppingCartItem,
- final MerchantStore store )
- throws Exception
- {
-
- Product product = productService.getById( shoppingCartItem.getProductId() );
-
- if ( product == null )
- {
- throw new Exception( "Item with id " + shoppingCartItem.getProductId() + " does not exist" );
- }
-
- if ( product.getMerchantStore().getId().intValue() != store.getId().intValue() )
- {
- throw new Exception( "Item with id " + shoppingCartItem.getProductId() + " does not belong to merchant "
- + store.getId() );
- }
-
- com.salesmanager.core.model.shoppingcart.ShoppingCartItem item =
- shoppingCartService.populateShoppingCartItem( product );
-
- item.setQuantity( shoppingCartItem.getQuantity() );
- item.setShoppingCart( cartModel );
-
- // attributes
- List<ShoppingCartAttribute> cartAttributes = shoppingCartItem.getShoppingCartAttributes();
- if ( !CollectionUtils.isEmpty( cartAttributes ) )
- {
- for ( ShoppingCartAttribute attribute : cartAttributes )
- {
- ProductAttribute productAttribute = productAttributeService.getById( attribute.getAttributeId() );
- if ( productAttribute != null
- && productAttribute.getProduct().getId().longValue() == product.getId().longValue() )
- {
- com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem attributeItem =
- new com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem( item,
- productAttribute );
-
- item.addAttributes( attributeItem );
- }
- }
- }
- return item;
-
- }
-
- @Override
- public ShoppingCart createCartModel( final String shoppingCartCode, final MerchantStore store,final Customer customer )
- throws Exception
- {
- final Long CustomerId = customer != null ? customer.getId() : null;
- ShoppingCart cartModel = new ShoppingCart();
- if ( StringUtils.isNotBlank( shoppingCartCode ) )
- {
- cartModel.setShoppingCartCode( shoppingCartCode );
- }
- else
- {
- cartModel.setShoppingCartCode( UUID.randomUUID().toString().replaceAll( "-", "" ) );
- }
-
- cartModel.setMerchantStore( store );
- if ( CustomerId != null )
- {
- cartModel.setCustomerId( CustomerId );
- }
- shoppingCartService.create( cartModel );
- return cartModel;
- }
-
-
-
-
-
- private com.salesmanager.core.model.shoppingcart.ShoppingCartItem getEntryToUpdate( final long entryId,
- final ShoppingCart cartModel )
- {
- if ( CollectionUtils.isNotEmpty( cartModel.getLineItems() ) )
- {
- for ( com.salesmanager.core.model.shoppingcart.ShoppingCartItem shoppingCartItem : cartModel.getLineItems() )
- {
- if ( shoppingCartItem.getId().longValue() == entryId )
- {
- LOG.info( "Found line item for given entry id: " + entryId );
- return shoppingCartItem;
-
- }
- }
- }
- LOG.info( "Unable to find any entry for given Id: " + entryId );
- return null;
- }
-
- private Object getKeyValue( final String key )
- {
- ServletRequestAttributes reqAttr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
- return reqAttr.getRequest().getAttribute( key );
- }
-
- @Override
- public ShoppingCartData getShoppingCartData( final Customer customer, final MerchantStore store,
- final String shoppingCartId )
- throws Exception
- {
-
- ShoppingCart cart = null;
- try
- {
- if ( customer != null )
- {
- LOG.info( "Reteriving customer shopping cart..." );
-
- cart = shoppingCartService.getShoppingCart( customer );
-
- }
-
- else
- {
- if ( StringUtils.isNotBlank( shoppingCartId ) && cart == null )
- {
- cart = shoppingCartService.getByCode( shoppingCartId, store );
- }
-
- }
- }
- catch ( ServiceException ex )
- {
- LOG.error( "Error while retriving cart from customer", ex );
- }
- catch( NoResultException nre) {
- //nothing
- }
-
- if ( cart == null )
- {
- return null;
- }
-
- LOG.info( "Cart model found." );
-
- ShoppingCartDataPopulator shoppingCartDataPopulator = new ShoppingCartDataPopulator();
- shoppingCartDataPopulator.setShoppingCartCalculationService( shoppingCartCalculationService );
- shoppingCartDataPopulator.setPricingService( pricingService );
- shoppingCartDataPopulator.setimageUtils(imageUtils);
-
- Language language = (Language) getKeyValue( Constants.LANGUAGE );
- MerchantStore merchantStore = (MerchantStore) getKeyValue( Constants.MERCHANT_STORE );
-
- ShoppingCartData shoppingCartData = shoppingCartDataPopulator.populate( cart, merchantStore, language );
-
-/* List<ShoppingCartItem> unavailables = new ArrayList<ShoppingCartItem>();
- List<ShoppingCartItem> availables = new ArrayList<ShoppingCartItem>();
- //Take out items no more available
- List<ShoppingCartItem> items = shoppingCartData.getShoppingCartItems();
- for(ShoppingCartItem item : items) {
- String code = item.getProductCode();
- Product p =productService.getByCode(code, language);
- if(!p.isAvailable()) {
- unavailables.add(item);
- } else {
- availables.add(item);
- }
-
- }
- shoppingCartData.setShoppingCartItems(availables);
- shoppingCartData.setUnavailables(unavailables);*/
-
- return shoppingCartData;
-
- }
-
- @Override
- public ShoppingCartData getShoppingCartData( final ShoppingCart shoppingCartModel )
- throws Exception
- {
-
- ShoppingCartDataPopulator shoppingCartDataPopulator = new ShoppingCartDataPopulator();
- shoppingCartDataPopulator.setShoppingCartCalculationService( shoppingCartCalculationService );
- shoppingCartDataPopulator.setPricingService( pricingService );
- shoppingCartDataPopulator.setimageUtils(imageUtils);
- Language language = (Language) getKeyValue( Constants.LANGUAGE );
- MerchantStore merchantStore = (MerchantStore) getKeyValue( Constants.MERCHANT_STORE );
- return shoppingCartDataPopulator.populate( shoppingCartModel, merchantStore, language );
- }
-
- @Override
- public ShoppingCartData removeCartItem( final Long itemID, final String cartId ,final MerchantStore store,final Language language )
- throws Exception
- {
- if ( StringUtils.isNotBlank( cartId ) )
- {
-
- ShoppingCart cartModel = getCartModel( cartId,store );
- if ( cartModel != null )
- {
- if ( CollectionUtils.isNotEmpty( cartModel.getLineItems() ) )
- {
- Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> shoppingCartItemSet =
- new HashSet<com.salesmanager.core.model.shoppingcart.ShoppingCartItem>();
- for ( com.salesmanager.core.model.shoppingcart.ShoppingCartItem shoppingCartItem : cartModel.getLineItems() )
- {
- //if ( shoppingCartItem.getId().longValue() != itemID.longValue() )
- if ( shoppingCartItem.getId().longValue() == itemID.longValue() )
- {
- //shoppingCartItemSet.add( shoppingCartItem );
- shoppingCartService.deleteShoppingCartItem(itemID);
- }
- }
- //cartModel.setLineItems( shoppingCartItemSet );
- //shoppingCartService.saveOrUpdate( cartModel );
-
- cartModel = getCartModel( cartId,store );
-
-
- ShoppingCartDataPopulator shoppingCartDataPopulator = new ShoppingCartDataPopulator();
- shoppingCartDataPopulator.setShoppingCartCalculationService( shoppingCartCalculationService );
- shoppingCartDataPopulator.setPricingService( pricingService );
- shoppingCartDataPopulator.setimageUtils(imageUtils);
- return shoppingCartDataPopulator.populate( cartModel, store, language );
- }
- }
- }
- return null;
- }
-
- @Override
- public ShoppingCartData updateCartItem( final Long itemID, final String cartId, final long newQuantity,final MerchantStore store, final Language language )
- throws Exception
- {
- if ( newQuantity < 1 )
- {
- throw new CartModificationException( "Quantity must not be less than one" );
- }
- if ( StringUtils.isNotBlank( cartId ) )
- {
- ShoppingCart cartModel = getCartModel( cartId,store );
- if ( cartModel != null )
- {
- com.salesmanager.core.model.shoppingcart.ShoppingCartItem entryToUpdate =
- getEntryToUpdate( itemID.longValue(), cartModel );
-
- if ( entryToUpdate == null )
- {
- throw new CartModificationException( "Unknown entry number." );
- }
-
- entryToUpdate.getProduct();
-
- LOG.info( "Updating cart entry quantity to" + newQuantity );
- entryToUpdate.setQuantity( (int) newQuantity );
- List<ProductAttribute> productAttributes = new ArrayList<ProductAttribute>();
- productAttributes.addAll( entryToUpdate.getProduct().getAttributes() );
- final FinalPrice finalPrice =
- productPriceUtils.getFinalProductPrice( entryToUpdate.getProduct(), productAttributes );
- entryToUpdate.setItemPrice( finalPrice.getFinalPrice() );
- shoppingCartService.saveOrUpdate( cartModel );
-
- LOG.info( "Cart entry updated with desired quantity" );
- ShoppingCartDataPopulator shoppingCartDataPopulator = new ShoppingCartDataPopulator();
- shoppingCartDataPopulator.setShoppingCartCalculationService( shoppingCartCalculationService );
- shoppingCartDataPopulator.setPricingService( pricingService );
- shoppingCartDataPopulator.setimageUtils(imageUtils);
- return shoppingCartDataPopulator.populate( cartModel, store, language );
-
- }
- }
- return null;
- }
-
- @Override
- public ShoppingCartData updateCartItems( final List<ShoppingCartItem> shoppingCartItems, final MerchantStore store, final Language language )
- throws Exception
- {
-
- Validate.notEmpty(shoppingCartItems,"shoppingCartItems null or empty");
- ShoppingCart cartModel = null;
- Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> cartItems = new HashSet<com.salesmanager.core.model.shoppingcart.ShoppingCartItem>();
- for(ShoppingCartItem item : shoppingCartItems) {
-
- if(item.getQuantity()<1) {
- throw new CartModificationException( "Quantity must not be less than one" );
- }
-
- if(cartModel==null) {
- cartModel = getCartModel( item.getCode(), store );
- }
-
- com.salesmanager.core.model.shoppingcart.ShoppingCartItem entryToUpdate =
- getEntryToUpdate( item.getId(), cartModel );
-
- if ( entryToUpdate == null ) {
- throw new CartModificationException( "Unknown entry number." );
- }
-
- entryToUpdate.getProduct();
-
- LOG.info( "Updating cart entry quantity to" + item.getQuantity() );
- entryToUpdate.setQuantity( (int) item.getQuantity() );
-
- List<ProductAttribute> productAttributes = new ArrayList<ProductAttribute>();
- productAttributes.addAll( entryToUpdate.getProduct().getAttributes() );
-
- final FinalPrice finalPrice =
- productPriceUtils.getFinalProductPrice( entryToUpdate.getProduct(), productAttributes );
- entryToUpdate.setItemPrice( finalPrice.getFinalPrice() );
-
-
- cartItems.add(entryToUpdate);
-
-
-
-
- }
-
- cartModel.setLineItems(cartItems);
- shoppingCartService.saveOrUpdate( cartModel );
- LOG.info( "Cart entry updated with desired quantity" );
- ShoppingCartDataPopulator shoppingCartDataPopulator = new ShoppingCartDataPopulator();
- shoppingCartDataPopulator.setShoppingCartCalculationService( shoppingCartCalculationService );
- shoppingCartDataPopulator.setPricingService( pricingService );
- shoppingCartDataPopulator.setimageUtils(imageUtils);
- return shoppingCartDataPopulator.populate( cartModel, store, language );
-
- }
-
-
- private ShoppingCart getCartModel( final String cartId,final MerchantStore store )
- {
- if ( StringUtils.isNotBlank( cartId ) )
- {
- try
- {
- return shoppingCartService.getByCode( cartId, store );
- }
- catch ( ServiceException e )
- {
- LOG.error( "unable to find any cart asscoiated with this Id: " + cartId );
- LOG.error( "error while fetching cart model...", e );
- return null;
- }
- catch( NoResultException nre) {
- //nothing
- }
-
- }
- return null;
- }
-
- @Override
- public ShoppingCartData getShoppingCartData(String code, MerchantStore store) {
- try {
- ShoppingCart cartModel = shoppingCartService.getByCode( code, store );
- if(cartModel!=null) {
- ShoppingCartData cart = getShoppingCartData(cartModel);
- return cart;
- }
- } catch( NoResultException nre) {
- //nothing
-
- } catch(Exception e) {
- LOG.error("Cannot retrieve cart code " + code,e);
- }
-
-
- return null;
- }
-
- @Override
- public ShoppingCart getShoppingCartModel(String shoppingCartCode,
- MerchantStore store) throws Exception {
- return shoppingCartService.getByCode( shoppingCartCode, store );
- }
-
- @Override
- public ShoppingCart getShoppingCartModel(Customer customer,
- MerchantStore store) throws Exception {
- return shoppingCartService.getByCustomer(customer);
- }
-
- @Override
- public void saveOrUpdateShoppingCart(ShoppingCart cart) throws Exception {
- shoppingCartService.saveOrUpdate(cart);
-
- }
-
-
-}
+/**
+ *
+ */
+package com.salesmanager.shop.store.controller.shoppingCart.facade;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+
+import javax.inject.Inject;
+import javax.persistence.NoResultException;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.Validate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Service;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
+import com.salesmanager.core.business.services.shoppingcart.ShoppingCartCalculationService;
+import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
+import com.salesmanager.core.business.utils.ProductPriceUtils;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.attribute.ProductAttribute;
+import com.salesmanager.core.model.catalog.product.availability.ProductAvailability;
+import com.salesmanager.core.model.catalog.product.price.FinalPrice;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.core.model.shoppingcart.ShoppingCart;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.model.shoppingcart.CartModificationException;
+import com.salesmanager.shop.model.shoppingcart.PersistableShoppingCartItem;
+import com.salesmanager.shop.model.shoppingcart.ReadableShoppingCart;
+import com.salesmanager.shop.model.shoppingcart.ShoppingCartAttribute;
+import com.salesmanager.shop.model.shoppingcart.ShoppingCartData;
+import com.salesmanager.shop.model.shoppingcart.ShoppingCartItem;
+import com.salesmanager.shop.populator.shoppingCart.ReadableShoppingCartPopulator;
+import com.salesmanager.shop.populator.shoppingCart.ShoppingCartDataPopulator;
+import com.salesmanager.shop.utils.DateUtil;
+import com.salesmanager.shop.utils.ImageFilePath;
+
+/**
+ * @author Umesh Awasthi
+ * @version 1.0
+ * @since 1.0
+ */
+@Service( value = "shoppingCartFacade" )
+public class ShoppingCartFacadeImpl
+ implements ShoppingCartFacade
+{
+
+
+ private static final Logger LOG = LoggerFactory.getLogger(ShoppingCartFacadeImpl.class);
+
+ @Inject
+ private ShoppingCartService shoppingCartService;
+
+ @Inject
+ ShoppingCartCalculationService shoppingCartCalculationService;
+
+ @Inject
+ private ProductPriceUtils productPriceUtils;
+
+ @Inject
+ private ProductService productService;
+
+ @Inject
+ private PricingService pricingService;
+
+ @Inject
+ private ProductAttributeService productAttributeService;
+
+ @Inject
+ @Qualifier("img")
+ private ImageFilePath imageUtils;
+
+ public void deleteShoppingCart(final Long id, final MerchantStore store) throws Exception {
+ ShoppingCart cart = shoppingCartService.getById(id, store);
+ if(cart!=null) {
+ shoppingCartService.deleteCart(cart);
+ }
+ }
+
+ @Override
+ public void deleteShoppingCart(final String code, final MerchantStore store) throws Exception {
+ ShoppingCart cart = shoppingCartService.getByCode(code, store);
+ if(cart!=null) {
+ shoppingCartService.deleteCart(cart);
+ }
+ }
+
+ @Override
+ public ShoppingCartData addItemsToShoppingCart( final ShoppingCartData shoppingCartData,
+ final ShoppingCartItem item, final MerchantStore store, final Language language,final Customer customer )
+ throws Exception
+ {
+
+ ShoppingCart cartModel = null;
+ if ( !StringUtils.isBlank( item.getCode() ) )
+ {
+ // get it from the db
+ cartModel = getShoppingCartModel( item.getCode(), store );
+ if ( cartModel == null )
+ {
+ cartModel = createCartModel( shoppingCartData.getCode(), store,customer );
+ }
+
+ }
+
+ if ( cartModel == null )
+ {
+
+ final String shoppingCartCode =
+ StringUtils.isNotBlank( shoppingCartData.getCode() ) ? shoppingCartData.getCode() : null;
+ cartModel = createCartModel( shoppingCartCode, store,customer );
+
+ }
+ com.salesmanager.core.model.shoppingcart.ShoppingCartItem shoppingCartItem =
+ createCartItem( cartModel, item, store );
+
+ boolean duplicateFound = false;
+ if(CollectionUtils.isEmpty(item.getShoppingCartAttributes())) {//increment quantity
+ //get duplicate item from the cart
+ Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> cartModelItems = cartModel.getLineItems();
+ for(com.salesmanager.core.model.shoppingcart.ShoppingCartItem cartItem : cartModelItems) {
+ if(cartItem.getProduct().getId().longValue()==shoppingCartItem.getProduct().getId().longValue()) {
+ if(CollectionUtils.isEmpty(cartItem.getAttributes())) {
+ if(!duplicateFound) {
+ if(!shoppingCartItem.isProductVirtual()) {
+ cartItem.setQuantity(cartItem.getQuantity() + shoppingCartItem.getQuantity());
+ }
+ duplicateFound = true;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if(!duplicateFound) {
+ cartModel.getLineItems().add( shoppingCartItem );
+ }
+
+ /** Update cart in database with line items **/
+ shoppingCartService.saveOrUpdate( cartModel );
+
+ //refresh cart
+ cartModel = shoppingCartService.getById(cartModel.getId(), store);
+
+ shoppingCartCalculationService.calculate( cartModel, store, language );
+
+ ShoppingCartDataPopulator shoppingCartDataPopulator = new ShoppingCartDataPopulator();
+ shoppingCartDataPopulator.setShoppingCartCalculationService( shoppingCartCalculationService );
+ shoppingCartDataPopulator.setPricingService( pricingService );
+ shoppingCartDataPopulator.setimageUtils(imageUtils);
+
+ return shoppingCartDataPopulator.populate( cartModel, store, language );
+ }
+
+ private com.salesmanager.core.model.shoppingcart.ShoppingCartItem createCartItem( final ShoppingCart cartModel,
+ final ShoppingCartItem shoppingCartItem,
+ final MerchantStore store )
+ throws Exception
+ {
+
+ Product product = productService.getById( shoppingCartItem.getProductId() );
+
+ if ( product == null )
+ {
+ throw new Exception( "Item with id " + shoppingCartItem.getProductId() + " does not exist" );
+ }
+
+ if ( product.getMerchantStore().getId().intValue() != store.getId().intValue() )
+ {
+ throw new Exception( "Item with id " + shoppingCartItem.getProductId() + " does not belong to merchant "
+ + store.getId() );
+ }
+
+ /**
+ * Check if product quantity is 0
+ * Check if product is available
+ * Check if date available <= now
+ */
+
+ Set<ProductAvailability> availabilities = product.getAvailabilities();
+ if(availabilities == null) {
+
+ throw new Exception( "Item with id " + product.getId() + " is not properly configured" );
+
+ }
+
+ for(ProductAvailability availability : availabilities) {
+ if(availability.getProductQuantity() == null || availability.getProductQuantity().intValue() ==0) {
+ throw new Exception( "Item with id " + product.getId() + " is not available");
+ }
+ }
+
+ if(!product.isAvailable()) {
+ throw new Exception( "Item with id " + product.getId() + " is not available");
+ }
+
+ if(!DateUtil.dateBeforeEqualsDate(product.getDateAvailable(), new Date())) {
+ throw new Exception( "Item with id " + product.getId() + " is not available");
+ }
+
+
+ com.salesmanager.core.model.shoppingcart.ShoppingCartItem item =
+ shoppingCartService.populateShoppingCartItem( product );
+
+ item.setQuantity( shoppingCartItem.getQuantity() );
+ item.setShoppingCart( cartModel );
+
+ // attributes
+ List<ShoppingCartAttribute> cartAttributes = shoppingCartItem.getShoppingCartAttributes();
+ if ( !CollectionUtils.isEmpty( cartAttributes ) )
+ {
+ for ( ShoppingCartAttribute attribute : cartAttributes )
+ {
+ ProductAttribute productAttribute = productAttributeService.getById( attribute.getAttributeId() );
+ if ( productAttribute != null
+ && productAttribute.getProduct().getId().longValue() == product.getId().longValue() )
+ {
+ com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem attributeItem =
+ new com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem( item,
+ productAttribute );
+
+ item.addAttributes( attributeItem );
+ }
+ }
+ }
+ return item;
+
+ }
+
+
+ //used for api
+ private com.salesmanager.core.model.shoppingcart.ShoppingCartItem createCartItem(ShoppingCart cartModel,
+ PersistableShoppingCartItem shoppingCartItem, MerchantStore store) throws Exception {
+
+ Product product = productService.getById(shoppingCartItem.getProduct());
+
+ if (product == null) {
+ throw new Exception("Item with id " + shoppingCartItem.getProduct() + " does not exist");
+ }
+
+ if (product.getMerchantStore().getId().intValue() != store.getId().intValue()) {
+ throw new Exception("Item with id " + shoppingCartItem.getProduct() + " does not belong to merchant "
+ + store.getId());
+ }
+
+ /**
+ * Check if product quantity is 0
+ * Check if product is available
+ * Check if date available <= now
+ */
+
+ Set<ProductAvailability> availabilities = product.getAvailabilities();
+ if(availabilities == null) {
+
+ throw new Exception( "Item with id " + product.getId() + " is not properly configured" );
+
+ }
+
+ for(ProductAvailability availability : availabilities) {
+ if(availability.getProductQuantity() == null || availability.getProductQuantity().intValue() ==0) {
+ throw new Exception( "Item with id " + product.getId() + " is not available");
+ }
+ }
+
+ if(!product.isAvailable()) {
+ throw new Exception( "Item with id " + product.getId() + " is not available");
+ }
+
+ if(!DateUtil.dateBeforeEqualsDate(product.getDateAvailable(), new Date())) {
+ throw new Exception( "Item with id " + product.getId() + " is not available");
+ }
+
+
+ com.salesmanager.core.model.shoppingcart.ShoppingCartItem item = shoppingCartService
+ .populateShoppingCartItem(product);
+
+ item.setQuantity(shoppingCartItem.getQuantity());
+ item.setShoppingCart(cartModel);
+
+ //set attributes
+ List<com.salesmanager.shop.model.catalog.product.attribute.ProductAttribute> attributes = shoppingCartItem.getAttributes();
+ if (!CollectionUtils.isEmpty(attributes)) {
+ for(com.salesmanager.shop.model.catalog.product.attribute.ProductAttribute attribute : attributes) {
+
+ ProductAttribute productAttribute = productAttributeService.getById(attribute.getId());
+
+ if (productAttribute != null
+ && productAttribute.getProduct().getId().longValue() == product.getId().longValue()) {
+
+ com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem attributeItem = new com.salesmanager.core.model.shoppingcart.ShoppingCartAttributeItem(
+ item, productAttribute);
+
+ item.addAttributes(attributeItem);
+ }
+ }
+ }
+
+ return item;
+
+ }
+
+
+ @Override
+ public ShoppingCart createCartModel( final String shoppingCartCode, final MerchantStore store,final Customer customer )
+ throws Exception
+ {
+ final Long CustomerId = customer != null ? customer.getId() : null;
+ ShoppingCart cartModel = new ShoppingCart();
+ if ( StringUtils.isNotBlank( shoppingCartCode ) )
+ {
+ cartModel.setShoppingCartCode( shoppingCartCode );
+ }
+ else
+ {
+ cartModel.setShoppingCartCode( uniqueShoppingCartCode() );
+ }
+
+ cartModel.setMerchantStore( store );
+ if ( CustomerId != null )
+ {
+ cartModel.setCustomerId( CustomerId );
+ }
+ shoppingCartService.create( cartModel );
+ return cartModel;
+ }
+
+
+
+
+
+ private com.salesmanager.core.model.shoppingcart.ShoppingCartItem getEntryToUpdate( final long entryId,
+ final ShoppingCart cartModel )
+ {
+ if ( CollectionUtils.isNotEmpty( cartModel.getLineItems() ) )
+ {
+ for ( com.salesmanager.core.model.shoppingcart.ShoppingCartItem shoppingCartItem : cartModel.getLineItems() )
+ {
+ if ( shoppingCartItem.getId().longValue() == entryId )
+ {
+ LOG.info( "Found line item for given entry id: " + entryId );
+ return shoppingCartItem;
+
+ }
+ }
+ }
+ LOG.info( "Unable to find any entry for given Id: " + entryId );
+ return null;
+ }
+
+ private Object getKeyValue( final String key )
+ {
+ ServletRequestAttributes reqAttr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
+ return reqAttr.getRequest().getAttribute( key );
+ }
+
+ @Override
+ public ShoppingCartData getShoppingCartData( final Customer customer, final MerchantStore store,
+ final String shoppingCartId, Language language)
+ throws Exception
+ {
+
+ ShoppingCart cart = null;
+ try
+ {
+ if ( customer != null )
+ {
+ LOG.info( "Reteriving customer shopping cart..." );
+
+ cart = shoppingCartService.getShoppingCart( customer );
+
+ }
+
+ else
+ {
+ if ( StringUtils.isNotBlank( shoppingCartId ) && cart == null )
+ {
+ cart = shoppingCartService.getByCode( shoppingCartId, store );
+ }
+
+ }
+ }
+ catch ( ServiceException ex )
+ {
+ LOG.error( "Error while retriving cart from customer", ex );
+ }
+ catch( NoResultException nre) {
+ //nothing
+ }
+
+ if ( cart == null )
+ {
+ return null;
+ }
+
+ LOG.info( "Cart model found." );
+
+ ShoppingCartDataPopulator shoppingCartDataPopulator = new ShoppingCartDataPopulator();
+ shoppingCartDataPopulator.setShoppingCartCalculationService( shoppingCartCalculationService );
+ shoppingCartDataPopulator.setPricingService( pricingService );
+ shoppingCartDataPopulator.setimageUtils(imageUtils);
+
+ //Language language = (Language) getKeyValue( Constants.LANGUAGE );
+ MerchantStore merchantStore = (MerchantStore) getKeyValue( Constants.MERCHANT_STORE );
+
+ ShoppingCartData shoppingCartData = shoppingCartDataPopulator.populate( cart, merchantStore, language );
+
+/* List<ShoppingCartItem> unavailables = new ArrayList<ShoppingCartItem>();
+ List<ShoppingCartItem> availables = new ArrayList<ShoppingCartItem>();
+ //Take out items no more available
+ List<ShoppingCartItem> items = shoppingCartData.getShoppingCartItems();
+ for(ShoppingCartItem item : items) {
+ String code = item.getProductCode();
+ Product p =productService.getByCode(code, language);
+ if(!p.isAvailable()) {
+ unavailables.add(item);
+ } else {
+ availables.add(item);
+ }
+
+ }
+ shoppingCartData.setShoppingCartItems(availables);
+ shoppingCartData.setUnavailables(unavailables);*/
+
+ return shoppingCartData;
+
+ }
+
+ //@Override
+ public ShoppingCartData getShoppingCartData( final ShoppingCart shoppingCartModel, Language language)
+ throws Exception
+ {
+
+ ShoppingCartDataPopulator shoppingCartDataPopulator = new ShoppingCartDataPopulator();
+ shoppingCartDataPopulator.setShoppingCartCalculationService( shoppingCartCalculationService );
+ shoppingCartDataPopulator.setPricingService( pricingService );
+ shoppingCartDataPopulator.setimageUtils(imageUtils);
+ //Language language = (Language) getKeyValue( Constants.LANGUAGE );
+ MerchantStore merchantStore = (MerchantStore) getKeyValue( Constants.MERCHANT_STORE );
+ return shoppingCartDataPopulator.populate( shoppingCartModel, merchantStore, language );
+ }
+
+ @Override
+ public ShoppingCartData removeCartItem( final Long itemID, final String cartId ,final MerchantStore store,final Language language )
+ throws Exception
+ {
+ if ( StringUtils.isNotBlank( cartId ) )
+ {
+
+ ShoppingCart cartModel = getCartModel( cartId,store );
+ if ( cartModel != null )
+ {
+ if ( CollectionUtils.isNotEmpty( cartModel.getLineItems() ) )
+ {
+ Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> shoppingCartItemSet =
+ new HashSet<com.salesmanager.core.model.shoppingcart.ShoppingCartItem>();
+ for ( com.salesmanager.core.model.shoppingcart.ShoppingCartItem shoppingCartItem : cartModel.getLineItems() )
+ {
+ //if ( shoppingCartItem.getId().longValue() != itemID.longValue() )
+ if ( shoppingCartItem.getId().longValue() == itemID.longValue() )
+ {
+ //shoppingCartItemSet.add( shoppingCartItem );
+ shoppingCartService.deleteShoppingCartItem(itemID);
+ }
+ }
+ //cartModel.setLineItems( shoppingCartItemSet );
+ //shoppingCartService.saveOrUpdate( cartModel );
+
+ cartModel = getCartModel( cartId,store );
+
+
+ ShoppingCartDataPopulator shoppingCartDataPopulator = new ShoppingCartDataPopulator();
+ shoppingCartDataPopulator.setShoppingCartCalculationService( shoppingCartCalculationService );
+ shoppingCartDataPopulator.setPricingService( pricingService );
+ shoppingCartDataPopulator.setimageUtils(imageUtils);
+ return shoppingCartDataPopulator.populate( cartModel, store, language );
+ }
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public ShoppingCartData updateCartItem( final Long itemID, final String cartId, final long newQuantity,final MerchantStore store, final Language language )
+ throws Exception
+ {
+ if ( newQuantity < 1 )
+ {
+ throw new CartModificationException( "Quantity must not be less than one" );
+ }
+ if ( StringUtils.isNotBlank( cartId ) )
+ {
+ ShoppingCart cartModel = getCartModel( cartId,store );
+ if ( cartModel != null )
+ {
+ com.salesmanager.core.model.shoppingcart.ShoppingCartItem entryToUpdate =
+ getEntryToUpdate( itemID.longValue(), cartModel );
+
+ if ( entryToUpdate == null )
+ {
+ throw new CartModificationException( "Unknown entry number." );
+ }
+
+ entryToUpdate.getProduct();
+
+ LOG.info( "Updating cart entry quantity to" + newQuantity );
+ entryToUpdate.setQuantity( (int) newQuantity );
+ List<ProductAttribute> productAttributes = new ArrayList<ProductAttribute>();
+ productAttributes.addAll( entryToUpdate.getProduct().getAttributes() );
+ final FinalPrice finalPrice =
+ productPriceUtils.getFinalProductPrice( entryToUpdate.getProduct(), productAttributes );
+ entryToUpdate.setItemPrice( finalPrice.getFinalPrice() );
+ shoppingCartService.saveOrUpdate( cartModel );
+
+ LOG.info( "Cart entry updated with desired quantity" );
+ ShoppingCartDataPopulator shoppingCartDataPopulator = new ShoppingCartDataPopulator();
+ shoppingCartDataPopulator.setShoppingCartCalculationService( shoppingCartCalculationService );
+ shoppingCartDataPopulator.setPricingService( pricingService );
+ shoppingCartDataPopulator.setimageUtils(imageUtils);
+ return shoppingCartDataPopulator.populate( cartModel, store, language );
+
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public ShoppingCartData updateCartItems( final List<ShoppingCartItem> shoppingCartItems, final MerchantStore store, final Language language )
+ throws Exception
+ {
+
+ Validate.notEmpty(shoppingCartItems,"shoppingCartItems null or empty");
+ ShoppingCart cartModel = null;
+ Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> cartItems = new HashSet<com.salesmanager.core.model.shoppingcart.ShoppingCartItem>();
+ for(ShoppingCartItem item : shoppingCartItems) {
+
+ if(item.getQuantity()<1) {
+ throw new CartModificationException( "Quantity must not be less than one" );
+ }
+
+ if(cartModel==null) {
+ cartModel = getCartModel( item.getCode(), store );
+ }
+
+ com.salesmanager.core.model.shoppingcart.ShoppingCartItem entryToUpdate =
+ getEntryToUpdate( item.getId(), cartModel );
+
+ if ( entryToUpdate == null ) {
+ throw new CartModificationException( "Unknown entry number." );
+ }
+
+ entryToUpdate.getProduct();
+
+ LOG.info( "Updating cart entry quantity to" + item.getQuantity() );
+ entryToUpdate.setQuantity( (int) item.getQuantity() );
+
+ List<ProductAttribute> productAttributes = new ArrayList<ProductAttribute>();
+ productAttributes.addAll( entryToUpdate.getProduct().getAttributes() );
+
+ final FinalPrice finalPrice =
+ productPriceUtils.getFinalProductPrice( entryToUpdate.getProduct(), productAttributes );
+ entryToUpdate.setItemPrice( finalPrice.getFinalPrice() );
+
+
+ cartItems.add(entryToUpdate);
+
+
+
+
+ }
+
+ cartModel.setLineItems(cartItems);
+ shoppingCartService.saveOrUpdate( cartModel );
+ LOG.info( "Cart entry updated with desired quantity" );
+ ShoppingCartDataPopulator shoppingCartDataPopulator = new ShoppingCartDataPopulator();
+ shoppingCartDataPopulator.setShoppingCartCalculationService( shoppingCartCalculationService );
+ shoppingCartDataPopulator.setPricingService( pricingService );
+ shoppingCartDataPopulator.setimageUtils(imageUtils);
+ return shoppingCartDataPopulator.populate( cartModel, store, language );
+
+ }
+
+
+ private ShoppingCart getCartModel( final String cartId,final MerchantStore store )
+ {
+ if ( StringUtils.isNotBlank( cartId ) )
+ {
+ try
+ {
+ return shoppingCartService.getByCode( cartId, store );
+ }
+ catch ( ServiceException e )
+ {
+ LOG.error( "unable to find any cart asscoiated with this Id: " + cartId );
+ LOG.error( "error while fetching cart model...", e );
+ return null;
+ }
+ catch( NoResultException nre) {
+ //nothing
+ }
+
+ }
+ return null;
+ }
+
+ @Override
+ public ShoppingCartData getShoppingCartData(String code, MerchantStore store, Language language) {
+ try {
+ ShoppingCart cartModel = shoppingCartService.getByCode( code, store );
+ if(cartModel!=null) {
+ ShoppingCartData cart = getShoppingCartData(cartModel, language);
+ return cart;
+ }
+ } catch( NoResultException nre) {
+ //nothing
+
+ } catch(Exception e) {
+ LOG.error("Cannot retrieve cart code " + code,e);
+ }
+
+
+ return null;
+ }
+
+ @Override
+ public ShoppingCart getShoppingCartModel(String shoppingCartCode,
+ MerchantStore store) throws Exception {
+ return shoppingCartService.getByCode( shoppingCartCode, store );
+ }
+
+ @Override
+ public ShoppingCart getShoppingCartModel(Customer customer,
+ MerchantStore store) throws Exception {
+ return shoppingCartService.getByCustomer(customer);
+ }
+
+ @Override
+ public void saveOrUpdateShoppingCart(ShoppingCart cart) throws Exception {
+ shoppingCartService.saveOrUpdate(cart);
+
+ }
+
+ @Override
+ public ReadableShoppingCart getCart(Customer customer, MerchantStore store, Language language) throws Exception {
+
+ Validate.notNull(customer,"Customer cannot be null");
+ Validate.notNull(customer.getId(),"Customer.id cannot be null or empty");
+
+ //Check if customer has an existing shopping cart
+ ShoppingCart cartModel = shoppingCartService.getByCustomer(customer);
+
+ if(cartModel == null) {
+ return null;
+ }
+
+ shoppingCartCalculationService.calculate( cartModel, store, language );
+
+ ReadableShoppingCartPopulator readableShoppingCart = new ReadableShoppingCartPopulator();
+
+ readableShoppingCart.setImageUtils(imageUtils);
+ readableShoppingCart.setPricingService(pricingService);
+ readableShoppingCart.setProductAttributeService(productAttributeService);
+ readableShoppingCart.setShoppingCartCalculationService(shoppingCartCalculationService);
+
+ ReadableShoppingCart readableCart = new ReadableShoppingCart();
+
+ readableShoppingCart.populate(cartModel, readableCart, store, language);
+
+
+ return readableCart;
+ }
+
+ @Override
+ public ReadableShoppingCart addToCart(Customer customer, PersistableShoppingCartItem item, MerchantStore store,
+ Language language) throws Exception {
+
+ Validate.notNull(customer,"Customer cannot be null");
+ Validate.notNull(customer.getId(),"Customer.id cannot be null or empty");
+
+ //Check if customer has an existing shopping cart
+ ShoppingCart cartModel = shoppingCartService.getByCustomer(customer);
+
+ //if cart does not exist create a new one
+ if(cartModel==null) {
+ cartModel = new ShoppingCart();
+ cartModel.setCustomerId(customer.getId());
+ cartModel.setMerchantStore(store);
+ cartModel.setShoppingCartCode(uniqueShoppingCartCode());
+ }
+
+ com.salesmanager.core.model.shoppingcart.ShoppingCartItem itemModel = createCartItem(cartModel, item, store);
+
+ //need to check if the item is already in the cart
+ boolean duplicateFound = false;
+ //only if item has no attributes
+ if(CollectionUtils.isEmpty(item.getAttributes())) {//increment quantity
+ //get duplicate item from the cart
+ Set<com.salesmanager.core.model.shoppingcart.ShoppingCartItem> cartModelItems = cartModel.getLineItems();
+ for(com.salesmanager.core.model.shoppingcart.ShoppingCartItem cartItem : cartModelItems) {
+ if(cartItem.getProduct().getId().longValue()==item.getProduct().longValue()) {
+ if(CollectionUtils.isEmpty(cartItem.getAttributes())) {
+ if(!duplicateFound) {
+ if(!itemModel.isProductVirtual()) {
+ cartItem.setQuantity(cartItem.getQuantity() + item.getQuantity());
+ }
+ duplicateFound = true;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if(!duplicateFound) {
+ cartModel.getLineItems().add( itemModel );
+ }
+
+ saveShoppingCart( cartModel );
+
+ //refresh cart
+ cartModel = shoppingCartService.getById(cartModel.getId(), store);
+
+ shoppingCartCalculationService.calculate( cartModel, store, language );
+
+ ReadableShoppingCartPopulator readableShoppingCart = new ReadableShoppingCartPopulator();
+
+ readableShoppingCart.setImageUtils(imageUtils);
+ readableShoppingCart.setPricingService(pricingService);
+ readableShoppingCart.setProductAttributeService(productAttributeService);
+ readableShoppingCart.setShoppingCartCalculationService(shoppingCartCalculationService);
+
+ ReadableShoppingCart readableCart = new ReadableShoppingCart();
+
+ readableShoppingCart.populate(cartModel, readableCart, store, language);
+
+
+ return readableCart;
+ }
+
+ private void saveShoppingCart(ShoppingCart shoppingCart) throws Exception {
+ shoppingCartService.save(shoppingCart);
+ }
+
+ private String uniqueShoppingCartCode() {
+ return UUID.randomUUID().toString().replaceAll( "-", "" );
+ }
+
+ @Override
+ public ReadableShoppingCart getById(Long shoppingCartId, MerchantStore store, Language language) throws Exception {
+ // TODO Auto-generated method stub
+ ShoppingCart cart = shoppingCartService.getById(shoppingCartId);
+
+ ReadableShoppingCart readableCart = null;
+
+ if(cart != null) {
+
+ ReadableShoppingCartPopulator readableShoppingCart = new ReadableShoppingCartPopulator();
+
+ readableShoppingCart.setImageUtils(imageUtils);
+ readableShoppingCart.setPricingService(pricingService);
+ readableShoppingCart.setProductAttributeService(productAttributeService);
+ readableShoppingCart.setShoppingCartCalculationService(shoppingCartCalculationService);
+
+ readableShoppingCart.populate(cart, readableCart, store, language);
+
+
+ }
+
+ return readableCart;
+ }
+
+ @Override
+ public ShoppingCart getShoppingCartModel(Long id, MerchantStore store) throws Exception {
+ return shoppingCartService.getById(id);
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/shoppingCart/MiniCartController.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/shoppingCart/MiniCartController.java
index b20c30a..178dc4b 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/shoppingCart/MiniCartController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/shoppingCart/MiniCartController.java
@@ -1,92 +1,94 @@
-/**
- *
- */
-package com.salesmanager.shop.store.controller.shoppingCart;
-
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.model.shoppingcart.ShoppingCartData;
-import com.salesmanager.shop.store.controller.AbstractController;
-import com.salesmanager.shop.store.controller.shoppingCart.facade.ShoppingCartFacade;
-import org.apache.commons.collections4.CollectionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * @author Umesh A
- *
- */
-@Controller
-@RequestMapping("/shop/cart")
-public class MiniCartController extends AbstractController{
-
- private static final Logger LOG = LoggerFactory.getLogger(MiniCartController.class);
-
- @Inject
- private ShoppingCartFacade shoppingCartFacade;
-
-
-
-
- @RequestMapping(value={"/displayMiniCartByCode"}, method = { RequestMethod.GET, RequestMethod.POST })
- public @ResponseBody ShoppingCartData displayMiniCart(final String shoppingCartCode, HttpServletRequest request, Model model){
-
- try {
- MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
- Customer customer = getSessionAttribute( Constants.CUSTOMER, request );
- ShoppingCartData cart = shoppingCartFacade.getShoppingCartData(customer,merchantStore,shoppingCartCode);
- if(cart!=null) {
- request.getSession().setAttribute(Constants.SHOPPING_CART, cart.getCode());
- }
- if(cart==null) {
- request.getSession().removeAttribute(Constants.SHOPPING_CART);//make sure there is no cart here
- cart = new ShoppingCartData();//create an empty cart
- }
- return cart;
-
-
- } catch(Exception e) {
- LOG.error("Error while getting the shopping cart",e);
- }
-
- return null;
-
- }
-
-
- @RequestMapping(value={"/removeMiniShoppingCartItem"}, method = { RequestMethod.GET, RequestMethod.POST })
- public @ResponseBody ShoppingCartData removeShoppingCartItem(Long lineItemId, final String shoppingCartCode, HttpServletRequest request, Model model) throws Exception {
- Language language = (Language)request.getAttribute(Constants.LANGUAGE);
- MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
- ShoppingCartData cart = shoppingCartFacade.getShoppingCartData(null, merchantStore, shoppingCartCode);
- if(cart==null) {
- return null;
- }
- ShoppingCartData shoppingCartData=shoppingCartFacade.removeCartItem(lineItemId, cart.getCode(), merchantStore,language);
-
-
- if(CollectionUtils.isEmpty(shoppingCartData.getShoppingCartItems())) {
- shoppingCartFacade.deleteShoppingCart(shoppingCartData.getId(), merchantStore);
- request.getSession().removeAttribute(Constants.SHOPPING_CART);
- return null;
- }
-
-
- request.getSession().setAttribute(Constants.SHOPPING_CART, cart.getCode());
-
- LOG.debug("removed item" + lineItemId + "from cart");
- return shoppingCartData;
- }
-
-
-}
+/**
+ *
+ */
+package com.salesmanager.shop.store.controller.shoppingCart;
+
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.model.shoppingcart.ShoppingCartData;
+import com.salesmanager.shop.store.controller.AbstractController;
+import com.salesmanager.shop.store.controller.shoppingCart.facade.ShoppingCartFacade;
+import org.apache.commons.collections4.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @author Umesh A
+ *
+ */
+@Controller
+@RequestMapping("/shop/cart")
+public class MiniCartController extends AbstractController{
+
+ private static final Logger LOG = LoggerFactory.getLogger(MiniCartController.class);
+
+ @Inject
+ private ShoppingCartFacade shoppingCartFacade;
+
+
+
+
+ @RequestMapping(value={"/displayMiniCartByCode"}, method = { RequestMethod.GET, RequestMethod.POST })
+ public @ResponseBody ShoppingCartData displayMiniCart(final String shoppingCartCode, HttpServletRequest request, Model model){
+
+ Language language = (Language)request.getAttribute(Constants.LANGUAGE);
+
+ try {
+ MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+ Customer customer = getSessionAttribute( Constants.CUSTOMER, request );
+ ShoppingCartData cart = shoppingCartFacade.getShoppingCartData(customer,merchantStore,shoppingCartCode, language);
+ if(cart!=null) {
+ request.getSession().setAttribute(Constants.SHOPPING_CART, cart.getCode());
+ }
+ if(cart==null) {
+ request.getSession().removeAttribute(Constants.SHOPPING_CART);//make sure there is no cart here
+ cart = new ShoppingCartData();//create an empty cart
+ }
+ return cart;
+
+
+ } catch(Exception e) {
+ LOG.error("Error while getting the shopping cart",e);
+ }
+
+ return null;
+
+ }
+
+
+ @RequestMapping(value={"/removeMiniShoppingCartItem"}, method = { RequestMethod.GET, RequestMethod.POST })
+ public @ResponseBody ShoppingCartData removeShoppingCartItem(Long lineItemId, final String shoppingCartCode, HttpServletRequest request, Model model) throws Exception {
+ Language language = (Language)request.getAttribute(Constants.LANGUAGE);
+ MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+ ShoppingCartData cart = shoppingCartFacade.getShoppingCartData(null, merchantStore, shoppingCartCode, language);
+ if(cart==null) {
+ return null;
+ }
+ ShoppingCartData shoppingCartData=shoppingCartFacade.removeCartItem(lineItemId, cart.getCode(), merchantStore,language);
+
+
+ if(CollectionUtils.isEmpty(shoppingCartData.getShoppingCartItems())) {
+ shoppingCartFacade.deleteShoppingCart(shoppingCartData.getId(), merchantStore);
+ request.getSession().removeAttribute(Constants.SHOPPING_CART);
+ return null;
+ }
+
+
+ request.getSession().setAttribute(Constants.SHOPPING_CART, cart.getCode());
+
+ LOG.debug("removed item" + lineItemId + "from cart");
+ return shoppingCartData;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/shoppingCart/ShoppingCartController.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/shoppingCart/ShoppingCartController.java
index afbae2a..09de748 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/shoppingCart/ShoppingCartController.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/shoppingCart/ShoppingCartController.java
@@ -1,428 +1,448 @@
-package com.salesmanager.shop.store.controller.shoppingCart;
-
-import com.salesmanager.core.business.services.catalog.product.PricingService;
-import com.salesmanager.core.business.services.catalog.product.ProductService;
-import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
-import com.salesmanager.core.business.services.order.OrderService;
-import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
-import com.salesmanager.core.business.utils.ProductPriceUtils;
-import com.salesmanager.core.business.utils.ajax.AjaxResponse;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.model.shop.PageInformation;
-import com.salesmanager.shop.model.shoppingcart.ShoppingCartData;
-import com.salesmanager.shop.model.shoppingcart.ShoppingCartItem;
-import com.salesmanager.shop.store.controller.AbstractController;
-import com.salesmanager.shop.store.controller.ControllerConstants;
-import com.salesmanager.shop.store.controller.shoppingCart.facade.ShoppingCartFacade;
-import com.salesmanager.shop.utils.LabelUtils;
-import com.salesmanager.shop.utils.LanguageUtils;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.*;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.*;
-
-
-/**
- * A mini shopping cart is available on the public shopping section from the upper menu
- * Landing page, Category page (list of products) and Product details page contains a form
- * that let the user add an item to the cart, see the quantity of items, total price of items
- * in the cart and remove items
- *
- * Add To Cart
- * ---------------
- * The add to cart is 100% driven by javascript / ajax. The code is available in webapp\resources\js\functions.js
- *
- * <!-- Simple add to cart html example ${id} is the product id -->
- * <form id="input-${id}">
- * <input type="text" class="input-small" id="quantity-productId-${id}" placeholder="1" value="1">
- * <a href="#" class="addToCart" productId="${id}">Add to cart</a>
- * </form>
- *
- * The javascript function creates com.salesmanager.web.entity.shoppingcart.ShoppingCartItem and ShoppingCartAttribute based on user selection
- * The javascript looks in the cookie if a shopping cart code exists ex $.cookie( 'cart' ); // requires jQuery-cookie
- * The javascript posts the ShoppingCartItem and the shopping cart code if present to /shop/addShoppingCartItem.html
- *
- * @see
- *
- * javascript re-creates the shopping cart div item (div id shoppingcart) (see webapp\pages\shop\templates\bootstrap\sections\header.jsp)
- * The javascript set the shopping cart code in the cookie
- *
- * Display a page
- * ----------------
- *
- * When a page is displayed from the shopping section, the shopping cart has to be displayed
- * 4 paths 1) No shopping cart 2) A shopping cart exist in the session 3) A shopping cart code exists in the cookie 4) A customer is logeed in and a shopping cart exists in the database
- *
- * 1) No shopping cart, nothing to do !
- *
- * 2) StoreFilter will tak care of a ShoppingCart present in the HttpSession
- *
- * 3) Once a page is displayed and no cart returned from the controller, a javascript looks on load in the cookie to see if a shopping cart code is present
- * If a code is present, by ajax the cart is loaded and displayed
- *
- * 4) No cart in the session but the customer logs in, the system looks in the DB if a shopping cart exists, if so it is putted in the session so the StoreFilter can manage it and putted in the request
- *
- * @author Carl Samson
- * @author Umesh
- */
-
-@Controller
-@RequestMapping("/shop/cart/")
-public class ShoppingCartController extends AbstractController {
-
- private static final Logger LOG = LoggerFactory.getLogger(ShoppingCartController.class);
- @Inject
- private ProductService productService;
-
- @Inject
- private ProductAttributeService productAttributeService;
-
- @Inject
- private PricingService pricingService;
-
- @Inject
- private OrderService orderService;
-
- @Inject
- private ShoppingCartService shoppingCartService;
-
- @Inject
- private ProductPriceUtils productPriceUtils;
-
- @Inject
- private ShoppingCartFacade shoppingCartFacade;
-
- @Inject
- private LabelUtils messages;
-
- @Inject
- private LanguageUtils languageUtils;
-
-
-
- /**
- * Add an item to the ShoppingCart (AJAX exposed method)
- * @param request
- * @param response
- * @return
- * @throws Exception
- */
- @RequestMapping(value={"/addShoppingCartItem"}, method=RequestMethod.POST)
- public @ResponseBody
- ShoppingCartData addShoppingCartItem(@RequestBody final ShoppingCartItem item, final HttpServletRequest request, final HttpServletResponse response, final Locale locale) throws Exception {
-
-
- ShoppingCartData shoppingCart=null;
-
-
-
- //Look in the HttpSession to see if a customer is logged in
- MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
- Language language = (Language)request.getAttribute(Constants.LANGUAGE);
- Customer customer = getSessionAttribute( Constants.CUSTOMER, request );
-
-
- if(customer != null) {
- com.salesmanager.core.model.shoppingcart.ShoppingCart customerCart = shoppingCartService.getByCustomer(customer);
- if(customerCart!=null) {
- shoppingCart = shoppingCartFacade.getShoppingCartData( customerCart);
-
-
- //TODO if shoppingCart != null ?? merge
- //TODO maybe they have the same code
- //TODO what if codes are different (-- merge carts, keep the latest one, delete the oldest, switch codes --)
- }
- }
-
-
- if(shoppingCart==null && !StringUtils.isBlank(item.getCode())) {
- shoppingCart = shoppingCartFacade.getShoppingCartData(item.getCode(), store);
- }
-
-
- //if shoppingCart is null create a new one
- if(shoppingCart==null) {
- shoppingCart = new ShoppingCartData();
- String code = UUID.randomUUID().toString().replaceAll("-", "");
- shoppingCart.setCode(code);
- }
-
- shoppingCart=shoppingCartFacade.addItemsToShoppingCart( shoppingCart, item, store,language,customer );
- request.getSession().setAttribute(Constants.SHOPPING_CART, shoppingCart.getCode());
-
-
- /******************************************************/
- //TODO validate all of this
-
- //if a customer exists in http session
- //if a cart does not exist in httpsession
- //get cart from database
- //if a cart exist in the database add the item to the cart and put cart in httpsession and save to the database
- //else a cart does not exist in the database, create a new one, set the customer id, set the cart in the httpsession
- //else a cart exist in the httpsession, add item to httpsession cart and save to the database
- //else no customer in httpsession
- //if a cart does not exist in httpsession
- //create a new one, set the cart in the httpsession
- //else a cart exist in the httpsession, add item to httpsession cart and save to the database
-
-
- /**
- * Tested with the following :
- * what if you add item in the shopping cart as an anonymous user
- * later on you log in to process with checkout but the system retrieves a previous shopping cart saved in the database for that customer
- * in that case we need to synchronize both carts and the original one (the one with the customer id) supercedes the current cart in session
- * the system will have to deal with the original one and remove the latest
- */
-
-
- //**more implementation details
- //calculate the price of each item by using ProductPriceUtils in sm-core
- //for each product in the shopping cart get the product
- //invoke productPriceUtils.getFinalProductPrice
- //from FinalPrice get final price which is the calculated price given attributes and discounts
- //set each item price in ShoppingCartItem.price
-
-
- return shoppingCart;
-
- }
-
-
-
- /**
- * Retrieves a Shopping cart from the database (regular shopping cart)
- * @param model
- * @param request
- * @param response
- * @return
- * @throws Exception
- */
- @RequestMapping( value = { "/shoppingCart.html" }, method = RequestMethod.GET )
- public String displayShoppingCart( final Model model, final HttpServletRequest request, final HttpServletResponse response, final Locale locale )
- throws Exception
- {
-
- LOG.debug( "Starting to calculate shopping cart..." );
-
-
- //meta information
- PageInformation pageInformation = new PageInformation();
- pageInformation.setPageTitle(messages.getMessage("label.cart.placeorder", locale));
- request.setAttribute(Constants.REQUEST_PAGE_INFORMATION, pageInformation);
-
-
- MerchantStore store = (MerchantStore) request.getAttribute(Constants.MERCHANT_STORE);
- Customer customer = getSessionAttribute( Constants.CUSTOMER, request );
-
- /** there must be a cart in the session **/
- String cartCode = (String)request.getSession().getAttribute(Constants.SHOPPING_CART);
-
- if(StringUtils.isBlank(cartCode)) {
- //display empty cart
- StringBuilder template =
- new StringBuilder().append( ControllerConstants.Tiles.ShoppingCart.shoppingCart ).append( "." ).append( store.getStoreTemplate() );
- return template.toString();
- }
-
- ShoppingCartData shoppingCart = shoppingCartFacade.getShoppingCartData(customer, store, cartCode);
-
- Language lang = languageUtils.getRequestLanguage(request, response);
- //Filter unavailables
- List<ShoppingCartItem> unavailables = new ArrayList<ShoppingCartItem>();
- List<ShoppingCartItem> availables = new ArrayList<ShoppingCartItem>();
- //Take out items no more available
- List<ShoppingCartItem> items = shoppingCart.getShoppingCartItems();
- for(ShoppingCartItem item : items) {
- String code = item.getProductCode();
- Product p =productService.getByCode(code, lang);
- if(!p.isAvailable()) {
- unavailables.add(item);
- } else {
- availables.add(item);
- }
-
- }
- shoppingCart.setShoppingCartItems(availables);
- shoppingCart.setUnavailables(unavailables);
-
-
-
- model.addAttribute( "cart", shoppingCart );
-
-
-
-
-
- /** template **/
- StringBuilder template =
- new StringBuilder().append( ControllerConstants.Tiles.ShoppingCart.shoppingCart ).append( "." ).append( store.getStoreTemplate() );
- return template.toString();
-
- }
-
-
- @RequestMapping(value={"/shoppingCartByCode"}, method = { RequestMethod.GET })
- public String displayShoppingCart(@ModelAttribute String shoppingCartCode, final Model model, HttpServletRequest request, HttpServletResponse response, final Locale locale) throws Exception{
-
- MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
- Customer customer = getSessionAttribute( Constants.CUSTOMER, request );
-
- if(StringUtils.isBlank(shoppingCartCode)) {
- return "redirect:/shop";
- }
-
- ShoppingCartData cart = shoppingCartFacade.getShoppingCartData(customer,merchantStore,shoppingCartCode);
- if(cart==null) {
- return "redirect:/shop";
- }
-
-
- Language lang = languageUtils.getRequestLanguage(request, response);
- //Filter unavailables
- List<ShoppingCartItem> unavailables = new ArrayList<ShoppingCartItem>();
- List<ShoppingCartItem> availables = new ArrayList<ShoppingCartItem>();
- //Take out items no more available
- List<ShoppingCartItem> items = cart.getShoppingCartItems();
- for(ShoppingCartItem item : items) {
- String code = item.getProductCode();
- Product p =productService.getByCode(code, lang);
- if(!p.isAvailable()) {
- unavailables.add(item);
- } else {
- availables.add(item);
- }
-
- }
- cart.setShoppingCartItems(availables);
- cart.setUnavailables(unavailables);
-
-
- //meta information
- PageInformation pageInformation = new PageInformation();
- pageInformation.setPageTitle(messages.getMessage("label.cart.placeorder", locale));
- request.setAttribute(Constants.REQUEST_PAGE_INFORMATION, pageInformation);
- request.getSession().setAttribute(Constants.SHOPPING_CART, cart.getCode());
- model.addAttribute("cart", cart);
-
- /** template **/
- StringBuilder template =
- new StringBuilder().append( ControllerConstants.Tiles.ShoppingCart.shoppingCart ).append( "." ).append( merchantStore.getStoreTemplate() );
- return template.toString();
-
-
-
- }
-
-
- /**
- * Removes an item from the Shopping Cart (AJAX exposed method)
- * @param request
- * @param response
- * @return
- * @throws Exception
- */
- @RequestMapping(value={"/removeShoppingCartItem.html"}, method = { RequestMethod.GET, RequestMethod.POST })
-
- String removeShoppingCartItem(final Long lineItemId, final HttpServletRequest request, final HttpServletResponse response) throws Exception {
-
-
-
- //Looks in the HttpSession to see if a customer is logged in
-
- //get any shopping cart for this user
-
- //** need to check if the item has property, similar items may exist but with different properties
- //String attributes = request.getParameter("attribute");//attributes id are sent as 1|2|5|
- //this will help with hte removal of the appropriate item
-
- //remove the item shoppingCartService.create
-
- //create JSON representation of the shopping cart
-
- //return the JSON structure in AjaxResponse
-
- //store the shopping cart in the http session
-
- MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
- Language language = (Language)request.getAttribute(Constants.LANGUAGE);
- Customer customer = getSessionAttribute( Constants.CUSTOMER, request );
-
- /** there must be a cart in the session **/
- String cartCode = (String)request.getSession().getAttribute(Constants.SHOPPING_CART);
-
- if(StringUtils.isBlank(cartCode)) {
- return "redirect:/shop";
- }
-
- ShoppingCartData shoppingCart = shoppingCartFacade.getShoppingCartData(customer, store, cartCode);
-
- ShoppingCartData shoppingCartData=shoppingCartFacade.removeCartItem(lineItemId, shoppingCart.getCode(),store,language);
-
-
- if(CollectionUtils.isEmpty(shoppingCartData.getShoppingCartItems())) {
- shoppingCartFacade.deleteShoppingCart(shoppingCartData.getId(), store);
- return "redirect:/shop";
- }
-
-
-
- return Constants.REDIRECT_PREFIX + "/shop/cart/shoppingCart.html";
-
-
-
-
- }
-
- /**
- * Update the quantity of an item in the Shopping Cart (AJAX exposed method)
- * @param request
- * @param response
- * @return
- * @throws Exception
- */
- @RequestMapping(value={"/updateShoppingCartItem.html"}, method = { RequestMethod.POST })
- public @ResponseBody String updateShoppingCartItem( @RequestBody final ShoppingCartItem[] shoppingCartItems, final HttpServletRequest request, final HttpServletResponse response) {
-
- AjaxResponse ajaxResponse = new AjaxResponse();
-
-
-
- MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
- Language language = (Language)request.getAttribute(Constants.LANGUAGE);
-
-
- String cartCode = (String)request.getSession().getAttribute(Constants.SHOPPING_CART);
-
- if(StringUtils.isBlank(cartCode)) {
- return "redirect:/shop";
- }
-
- try {
- List<ShoppingCartItem> items = Arrays.asList(shoppingCartItems);
- ShoppingCartData shoppingCart = shoppingCartFacade.updateCartItems(items, store, language);
- ajaxResponse.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
-
- } catch (Exception e) {
- LOG.error("Excption while updating cart" ,e);
- ajaxResponse.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
- }
-
- return ajaxResponse.toJSONString();
-
-
- }
-
-
-}
+package com.salesmanager.shop.store.controller.shoppingCart;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+import java.util.UUID;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.catalog.product.ProductService;
+import com.salesmanager.core.business.services.catalog.product.attribute.ProductAttributeService;
+import com.salesmanager.core.business.services.order.OrderService;
+import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
+import com.salesmanager.core.business.utils.ProductPriceUtils;
+import com.salesmanager.core.business.utils.ajax.AjaxResponse;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.model.shop.PageInformation;
+import com.salesmanager.shop.model.shoppingcart.ShoppingCartData;
+import com.salesmanager.shop.model.shoppingcart.ShoppingCartItem;
+import com.salesmanager.shop.store.controller.AbstractController;
+import com.salesmanager.shop.store.controller.ControllerConstants;
+import com.salesmanager.shop.store.controller.shoppingCart.facade.ShoppingCartFacade;
+import com.salesmanager.shop.utils.LabelUtils;
+import com.salesmanager.shop.utils.LanguageUtils;
+
+
+/**
+ * A mini shopping cart is available on the public shopping section from the upper menu
+ * Landing page, Category page (list of products) and Product details page contains a form
+ * that let the user add an item to the cart, see the quantity of items, total price of items
+ * in the cart and remove items
+ *
+ * Add To Cart
+ * ---------------
+ * The add to cart is 100% driven by javascript / ajax. The code is available in webapp\resources\js\functions.js
+ *
+ * <!-- Simple add to cart html example ${id} is the product id -->
+ * <form id="input-${id}">
+ * <input type="text" class="input-small" id="quantity-productId-${id}" placeholder="1" value="1">
+ * <a href="#" class="addToCart" productId="${id}">Add to cart</a>
+ * </form>
+ *
+ * The javascript function creates com.salesmanager.web.entity.shoppingcart.ShoppingCartItem and ShoppingCartAttribute based on user selection
+ * The javascript looks in the cookie if a shopping cart code exists ex $.cookie( 'cart' ); // requires jQuery-cookie
+ * The javascript posts the ShoppingCartItem and the shopping cart code if present to /shop/addShoppingCartItem.html
+ *
+ * @see
+ *
+ * javascript re-creates the shopping cart div item (div id shoppingcart) (see webapp\pages\shop\templates\bootstrap\sections\header.jsp)
+ * The javascript set the shopping cart code in the cookie
+ *
+ * Display a page
+ * ----------------
+ *
+ * When a page is displayed from the shopping section, the shopping cart has to be displayed
+ * 4 paths 1) No shopping cart 2) A shopping cart exist in the session 3) A shopping cart code exists in the cookie 4) A customer is logeed in and a shopping cart exists in the database
+ *
+ * 1) No shopping cart, nothing to do !
+ *
+ * 2) StoreFilter will tak care of a ShoppingCart present in the HttpSession
+ *
+ * 3) Once a page is displayed and no cart returned from the controller, a javascript looks on load in the cookie to see if a shopping cart code is present
+ * If a code is present, by ajax the cart is loaded and displayed
+ *
+ * 4) No cart in the session but the customer logs in, the system looks in the DB if a shopping cart exists, if so it is putted in the session so the StoreFilter can manage it and putted in the request
+ *
+ * @author Carl Samson
+ * @author Umesh
+ */
+
+@Controller
+@RequestMapping("/shop/cart/")
+public class ShoppingCartController extends AbstractController {
+
+ private static final Logger LOG = LoggerFactory.getLogger(ShoppingCartController.class);
+ @Inject
+ private ProductService productService;
+
+ @Inject
+ private ProductAttributeService productAttributeService;
+
+ @Inject
+ private PricingService pricingService;
+
+ @Inject
+ private OrderService orderService;
+
+ @Inject
+ private ShoppingCartService shoppingCartService;
+
+ @Inject
+ private ProductPriceUtils productPriceUtils;
+
+ @Inject
+ private ShoppingCartFacade shoppingCartFacade;
+
+ @Inject
+ private LabelUtils messages;
+
+ @Inject
+ private LanguageUtils languageUtils;
+
+
+
+ /**
+ * Add an item to the ShoppingCart (AJAX exposed method)
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping(value={"/addShoppingCartItem"}, method=RequestMethod.POST)
+ public @ResponseBody
+ ShoppingCartData addShoppingCartItem(@RequestBody final ShoppingCartItem item, final HttpServletRequest request, final HttpServletResponse response, final Locale locale) throws Exception {
+
+
+ ShoppingCartData shoppingCart=null;
+
+
+ //Look in the HttpSession to see if a customer is logged in
+ MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
+ Language language = (Language)request.getAttribute(Constants.LANGUAGE);
+ Customer customer = getSessionAttribute( Constants.CUSTOMER, request );
+
+
+ if(customer != null) {
+ com.salesmanager.core.model.shoppingcart.ShoppingCart customerCart = shoppingCartService.getByCustomer(customer);
+ if(customerCart!=null) {
+ shoppingCart = shoppingCartFacade.getShoppingCartData( customerCart, language);
+
+
+ //TODO if shoppingCart != null ?? merge
+ //TODO maybe they have the same code
+ //TODO what if codes are different (-- merge carts, keep the latest one, delete the oldest, switch codes --)
+ }
+ }
+
+
+ if(shoppingCart==null && !StringUtils.isBlank(item.getCode())) {
+ shoppingCart = shoppingCartFacade.getShoppingCartData(item.getCode(), store, language);
+ }
+
+
+ //if shoppingCart is null create a new one
+ if(shoppingCart==null) {
+ shoppingCart = new ShoppingCartData();
+ String code = UUID.randomUUID().toString().replaceAll("-", "");
+ shoppingCart.setCode(code);
+ }
+
+ shoppingCart=shoppingCartFacade.addItemsToShoppingCart( shoppingCart, item, store,language,customer );
+ request.getSession().setAttribute(Constants.SHOPPING_CART, shoppingCart.getCode());
+
+
+ /******************************************************/
+ //TODO validate all of this
+
+ //if a customer exists in http session
+ //if a cart does not exist in httpsession
+ //get cart from database
+ //if a cart exist in the database add the item to the cart and put cart in httpsession and save to the database
+ //else a cart does not exist in the database, create a new one, set the customer id, set the cart in the httpsession
+ //else a cart exist in the httpsession, add item to httpsession cart and save to the database
+ //else no customer in httpsession
+ //if a cart does not exist in httpsession
+ //create a new one, set the cart in the httpsession
+ //else a cart exist in the httpsession, add item to httpsession cart and save to the database
+
+
+ /**
+ * Tested with the following :
+ * what if you add item in the shopping cart as an anonymous user
+ * later on you log in to process with checkout but the system retrieves a previous shopping cart saved in the database for that customer
+ * in that case we need to synchronize both carts and the original one (the one with the customer id) supercedes the current cart in session
+ * the system will have to deal with the original one and remove the latest
+ */
+
+
+ //**more implementation details
+ //calculate the price of each item by using ProductPriceUtils in sm-core
+ //for each product in the shopping cart get the product
+ //invoke productPriceUtils.getFinalProductPrice
+ //from FinalPrice get final price which is the calculated price given attributes and discounts
+ //set each item price in ShoppingCartItem.price
+
+
+ return shoppingCart;
+
+ }
+
+
+
+ /**
+ * Retrieves a Shopping cart from the database (regular shopping cart)
+ * @param model
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping( value = { "/shoppingCart.html" }, method = RequestMethod.GET )
+ public String displayShoppingCart( final Model model, final HttpServletRequest request, final HttpServletResponse response, final Locale locale )
+ throws Exception
+ {
+
+ LOG.debug( "Starting to calculate shopping cart..." );
+
+ Language language = (Language)request.getAttribute(Constants.LANGUAGE);
+
+
+ //meta information
+ PageInformation pageInformation = new PageInformation();
+ pageInformation.setPageTitle(messages.getMessage("label.cart.placeorder", locale));
+ request.setAttribute(Constants.REQUEST_PAGE_INFORMATION, pageInformation);
+
+
+ MerchantStore store = (MerchantStore) request.getAttribute(Constants.MERCHANT_STORE);
+ Customer customer = getSessionAttribute( Constants.CUSTOMER, request );
+
+ /** there must be a cart in the session **/
+ String cartCode = (String)request.getSession().getAttribute(Constants.SHOPPING_CART);
+
+ if(StringUtils.isBlank(cartCode)) {
+ //display empty cart
+ StringBuilder template =
+ new StringBuilder().append( ControllerConstants.Tiles.ShoppingCart.shoppingCart ).append( "." ).append( store.getStoreTemplate() );
+ return template.toString();
+ }
+
+ ShoppingCartData shoppingCart = shoppingCartFacade.getShoppingCartData(customer, store, cartCode, language);
+
+ if(shoppingCart == null) {
+ //display empty cart
+ StringBuilder template =
+ new StringBuilder().append( ControllerConstants.Tiles.ShoppingCart.shoppingCart ).append( "." ).append( store.getStoreTemplate() );
+ return template.toString();
+ }
+
+ Language lang = languageUtils.getRequestLanguage(request, response);
+ //Filter unavailables
+ List<ShoppingCartItem> unavailables = new ArrayList<ShoppingCartItem>();
+ List<ShoppingCartItem> availables = new ArrayList<ShoppingCartItem>();
+ //Take out items no more available
+ List<ShoppingCartItem> items = shoppingCart.getShoppingCartItems();
+ for(ShoppingCartItem item : items) {
+ String code = item.getProductCode();
+ Product p =productService.getByCode(code, lang);
+ if(!p.isAvailable()) {
+ unavailables.add(item);
+ } else {
+ availables.add(item);
+ }
+
+ }
+ shoppingCart.setShoppingCartItems(availables);
+ shoppingCart.setUnavailables(unavailables);
+
+
+
+ model.addAttribute( "cart", shoppingCart );
+
+
+
+
+
+ /** template **/
+ StringBuilder template =
+ new StringBuilder().append( ControllerConstants.Tiles.ShoppingCart.shoppingCart ).append( "." ).append( store.getStoreTemplate() );
+ return template.toString();
+
+ }
+
+
+ @RequestMapping(value={"/shoppingCartByCode"}, method = { RequestMethod.GET })
+ public String displayShoppingCart(@ModelAttribute String shoppingCartCode, final Model model, HttpServletRequest request, HttpServletResponse response, final Locale locale) throws Exception{
+
+ MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+ Customer customer = getSessionAttribute( Constants.CUSTOMER, request );
+
+ Language language = (Language)request.getAttribute(Constants.LANGUAGE);
+
+ if(StringUtils.isBlank(shoppingCartCode)) {
+ return "redirect:/shop";
+ }
+
+ ShoppingCartData cart = shoppingCartFacade.getShoppingCartData(customer,merchantStore,shoppingCartCode,language);
+ if(cart==null) {
+ return "redirect:/shop";
+ }
+
+
+ Language lang = languageUtils.getRequestLanguage(request, response);
+ //Filter unavailables
+ List<ShoppingCartItem> unavailables = new ArrayList<ShoppingCartItem>();
+ List<ShoppingCartItem> availables = new ArrayList<ShoppingCartItem>();
+ //Take out items no more available
+ List<ShoppingCartItem> items = cart.getShoppingCartItems();
+ for(ShoppingCartItem item : items) {
+ String code = item.getProductCode();
+ Product p =productService.getByCode(code, lang);
+ if(!p.isAvailable()) {
+ unavailables.add(item);
+ } else {
+ availables.add(item);
+ }
+
+ }
+ cart.setShoppingCartItems(availables);
+ cart.setUnavailables(unavailables);
+
+
+ //meta information
+ PageInformation pageInformation = new PageInformation();
+ pageInformation.setPageTitle(messages.getMessage("label.cart.placeorder", locale));
+ request.setAttribute(Constants.REQUEST_PAGE_INFORMATION, pageInformation);
+ request.getSession().setAttribute(Constants.SHOPPING_CART, cart.getCode());
+ model.addAttribute("cart", cart);
+
+ /** template **/
+ StringBuilder template =
+ new StringBuilder().append( ControllerConstants.Tiles.ShoppingCart.shoppingCart ).append( "." ).append( merchantStore.getStoreTemplate() );
+ return template.toString();
+
+
+
+ }
+
+
+ /**
+ * Removes an item from the Shopping Cart (AJAX exposed method)
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping(value={"/removeShoppingCartItem.html"}, method = { RequestMethod.GET, RequestMethod.POST })
+
+ String removeShoppingCartItem(final Long lineItemId, final HttpServletRequest request, final HttpServletResponse response) throws Exception {
+
+
+
+ //Looks in the HttpSession to see if a customer is logged in
+
+ //get any shopping cart for this user
+
+ //** need to check if the item has property, similar items may exist but with different properties
+ //String attributes = request.getParameter("attribute");//attributes id are sent as 1|2|5|
+ //this will help with hte removal of the appropriate item
+
+ //remove the item shoppingCartService.create
+
+ //create JSON representation of the shopping cart
+
+ //return the JSON structure in AjaxResponse
+
+ //store the shopping cart in the http session
+
+ MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
+ Language language = (Language)request.getAttribute(Constants.LANGUAGE);
+ Customer customer = getSessionAttribute( Constants.CUSTOMER, request );
+
+ /** there must be a cart in the session **/
+ String cartCode = (String)request.getSession().getAttribute(Constants.SHOPPING_CART);
+
+ if(StringUtils.isBlank(cartCode)) {
+ return "redirect:/shop";
+ }
+
+ ShoppingCartData shoppingCart = shoppingCartFacade.getShoppingCartData(customer, store, cartCode, language);
+
+ ShoppingCartData shoppingCartData=shoppingCartFacade.removeCartItem(lineItemId, shoppingCart.getCode(),store,language);
+
+
+ if(CollectionUtils.isEmpty(shoppingCartData.getShoppingCartItems())) {
+ shoppingCartFacade.deleteShoppingCart(shoppingCartData.getId(), store);
+ return "redirect:/shop";
+ }
+
+
+
+ return Constants.REDIRECT_PREFIX + "/shop/cart/shoppingCart.html";
+
+
+
+
+ }
+
+ /**
+ * Update the quantity of an item in the Shopping Cart (AJAX exposed method)
+ * @param request
+ * @param response
+ * @return
+ * @throws Exception
+ */
+ @RequestMapping(value={"/updateShoppingCartItem.html"}, method = { RequestMethod.POST })
+ public @ResponseBody String updateShoppingCartItem( @RequestBody final ShoppingCartItem[] shoppingCartItems, final HttpServletRequest request, final HttpServletResponse response) {
+
+ AjaxResponse ajaxResponse = new AjaxResponse();
+
+
+
+ MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request);
+ Language language = (Language)request.getAttribute(Constants.LANGUAGE);
+
+
+ String cartCode = (String)request.getSession().getAttribute(Constants.SHOPPING_CART);
+
+ if(StringUtils.isBlank(cartCode)) {
+ return "redirect:/shop";
+ }
+
+ try {
+ List<ShoppingCartItem> items = Arrays.asList(shoppingCartItems);
+ ShoppingCartData shoppingCart = shoppingCartFacade.updateCartItems(items, store, language);
+ ajaxResponse.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
+
+ } catch (Exception e) {
+ LOG.error("Excption while updating cart" ,e);
+ ajaxResponse.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
+ }
+
+ return ajaxResponse.toJSONString();
+
+
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/store/facade/StoreFacade.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/store/facade/StoreFacade.java
new file mode 100644
index 0000000..3d9769b
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/store/facade/StoreFacade.java
@@ -0,0 +1,20 @@
+package com.salesmanager.shop.store.controller.store.facade;
+
+import com.salesmanager.core.model.merchant.MerchantStore;
+
+/**
+ * Layer between shop controllers, services and API with sm-core
+ * @author carlsamson
+ *
+ */
+public interface StoreFacade {
+
+ /**
+ * Find MerchantStore model from store code
+ * @param code
+ * @return
+ * @throws Exception
+ */
+ MerchantStore getByCode(String code) throws Exception;
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/controller/store/facade/StoreFacadeImple.java b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/store/facade/StoreFacadeImple.java
new file mode 100644
index 0000000..dc2848a
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/controller/store/facade/StoreFacadeImple.java
@@ -0,0 +1,21 @@
+package com.salesmanager.shop.store.controller.store.facade;
+
+import javax.inject.Inject;
+
+import org.springframework.stereotype.Service;
+
+import com.salesmanager.core.business.services.merchant.MerchantStoreService;
+import com.salesmanager.core.model.merchant.MerchantStore;
+
+@Service("storeFacade")
+public class StoreFacadeImple implements StoreFacade {
+
+ @Inject
+ private MerchantStoreService merchantStoreService;
+
+ @Override
+ public MerchantStore getByCode(String code) throws Exception {
+ return merchantStoreService.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/model/catalog/Attribute.java b/sm-shop/src/main/java/com/salesmanager/shop/store/model/catalog/Attribute.java
index 1b2d36f..9c61e80 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/model/catalog/Attribute.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/model/catalog/Attribute.java
@@ -1,58 +1,58 @@
-package com.salesmanager.shop.store.model.catalog;
-
-import java.io.Serializable;
-import java.util.List;
-
-import com.salesmanager.shop.model.ShopEntity;
-
-
-public class Attribute extends ShopEntity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String name = null;
- private String type = null;
- private String code = null;
- private List<AttributeValue> values = null;
- private AttributeValue readOnlyValue = null;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getType() {
- return type;
- }
- public void setType(String type) {
- this.type = type;
- }
-
-
-
- public void setValues(List<AttributeValue> values) {
- this.values = values;
- }
- public List<AttributeValue> getValues() {
- return values;
- }
- public void setCode(String code) {
- this.code = code;
- }
- public String getCode() {
- return code;
- }
- public void setReadOnlyValue(AttributeValue readOnlyValue) {
- this.readOnlyValue = readOnlyValue;
- }
- public AttributeValue getReadOnlyValue() {
- return readOnlyValue;
- }
-
-
-
-
-
-}
+package com.salesmanager.shop.store.model.catalog;
+
+import java.io.Serializable;
+import java.util.List;
+
+import com.salesmanager.shop.model.ShopEntity;
+
+
+public class Attribute extends ShopEntity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String name = null;
+ private String type = null;
+ private String code = null;
+ private List<AttributeValue> values = null;
+ private AttributeValue readOnlyValue = null;
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public String getType() {
+ return type;
+ }
+ public void setType(String type) {
+ this.type = type;
+ }
+
+
+
+ public void setValues(List<AttributeValue> values) {
+ this.values = values;
+ }
+ public List<AttributeValue> getValues() {
+ return values;
+ }
+ public void setCode(String code) {
+ this.code = code;
+ }
+ public String getCode() {
+ return code;
+ }
+ public void setReadOnlyValue(AttributeValue readOnlyValue) {
+ this.readOnlyValue = readOnlyValue;
+ }
+ public AttributeValue getReadOnlyValue() {
+ return readOnlyValue;
+ }
+
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/model/catalog/AttributeValue.java b/sm-shop/src/main/java/com/salesmanager/shop/store/model/catalog/AttributeValue.java
index c1679bf..ef9719d 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/model/catalog/AttributeValue.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/model/catalog/AttributeValue.java
@@ -1,50 +1,57 @@
-package com.salesmanager.shop.store.model.catalog;
-
-import java.io.Serializable;
-
-import com.salesmanager.shop.model.ShopEntity;
-
-public class AttributeValue extends ShopEntity implements Serializable {
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private String name = null;
- private String description = null;
- private boolean defaultAttribute;
- private String image;
- private String price;
-
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public boolean isDefaultAttribute() {
- return defaultAttribute;
- }
- public void setDefaultAttribute(boolean defaultAttribute) {
- this.defaultAttribute = defaultAttribute;
- }
- public String getImage() {
- return image;
- }
- public void setImage(String image) {
- this.image = image;
- }
- public String getPrice() {
- return price;
- }
- public void setPrice(String price) {
- this.price = price;
- }
- public String getDescription() {
- return description;
- }
- public void setDescription(String description) {
- this.description = description;
- }
-
-}
+package com.salesmanager.shop.store.model.catalog;
+
+import java.io.Serializable;
+
+import com.salesmanager.shop.model.ShopEntity;
+
+public class AttributeValue extends ShopEntity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private String name = null;
+ private String description = null;
+ private boolean defaultAttribute;
+ private String image;
+ private String price;
+ private int sortOrder;
+
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public boolean isDefaultAttribute() {
+ return defaultAttribute;
+ }
+ public void setDefaultAttribute(boolean defaultAttribute) {
+ this.defaultAttribute = defaultAttribute;
+ }
+ public String getImage() {
+ return image;
+ }
+ public void setImage(String image) {
+ this.image = image;
+ }
+ public String getPrice() {
+ return price;
+ }
+ public void setPrice(String price) {
+ this.price = price;
+ }
+ public String getDescription() {
+ return description;
+ }
+ public void setDescription(String description) {
+ this.description = description;
+ }
+ public int getSortOrder() {
+ return sortOrder;
+ }
+ public void setSortOrder(int sortOrder) {
+ this.sortOrder = sortOrder;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/model/paging/PaginationData.java b/sm-shop/src/main/java/com/salesmanager/shop/store/model/paging/PaginationData.java
index 9c9dd61..8f8ae7e 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/model/paging/PaginationData.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/model/paging/PaginationData.java
@@ -1,143 +1,143 @@
-/**
- *
- */
-package com.salesmanager.shop.store.model.paging;
-
-import java.io.Serializable;
-
-/**
- * POJO representation of pagination
- * @author Umesh Awasthi
- *
- */
-public class PaginationData implements Serializable
-{
-
-
- private static final long serialVersionUID = 1L;
-
- /** The number of results per page.*/
- private int pageSize;
- private int currentPage;
- private int offset ;
- private int totalCount;
- private int totalPages;
- private int countByPage;
-
-
- public PaginationData(int pageSize,int currentPage) {
- if (pageSize == 0)
- throw new IllegalArgumentException("limit cannot be 0 for pagination.");
-
-
- this.pageSize = pageSize;
- this.currentPage=currentPage;
- }
-
-
- public int getPageSize()
- {
- return pageSize;
- }
-
-
- /**
- * The current page number this pagination object represents
- *
- * @return the page number
- */
- public int getPageNumber() {
- if (offset < pageSize || pageSize == 0)
- return 1;
-
- return (offset / pageSize) + 1;
- }
-
-
- /**
- * The offset for this pagination object. The offset determines what index (0 index) to start retrieving results from.
- *
- * @return the offset
- */
- public int getOffset() {
- return (currentPage - 1) * pageSize + 1;
- }
-
-
- /**
- * Creates a new pagination object representing the next page
- *
- * @return new pagination object with offset shifted by offset+limit
- */
- public PaginationData getNext()
- {
- return new PaginationData( offset + pageSize, pageSize );
- }
-
-
- /**
- * Creates a new pagination object representing the previous page
- *
- * @return new pagination object with offset shifted by offset-limit
- */
- public PaginationData getPrevious() {
- if (pageSize >= offset) {
- return new PaginationData(0, pageSize);
- } else {
- return new PaginationData(offset - pageSize, pageSize);
- }
- }
-
-
- public int getCurrentPage()
- {
- return currentPage;
- }
-
-
- public void setCurrentPage( int currentPage )
- {
- this.currentPage = currentPage;
- }
-
-
- public int getTotalCount()
- {
- return totalCount;
- }
-
-
- public void setTotalCount( int totalCount )
- {
- this.totalCount = totalCount;
- }
-
-
- public int getTotalPages()
- {
-
- Integer totalPages= Integer.valueOf((int) (Math.ceil(Integer.valueOf(totalCount).doubleValue() / pageSize)));
- return totalPages;
- }
-
-
- public int getCountByPage() {
- return countByPage;
- }
-
-
- public void setCountByPage(int countByPage) {
- this.countByPage = countByPage;
- }
-
-
- public void setTotalPages(int totalPages) {
- this.totalPages = totalPages;
- }
-
-
-
-
-
-
-}
+/**
+ *
+ */
+package com.salesmanager.shop.store.model.paging;
+
+import java.io.Serializable;
+
+/**
+ * POJO representation of pagination
+ * @author Umesh Awasthi
+ *
+ */
+public class PaginationData implements Serializable
+{
+
+
+ private static final long serialVersionUID = 1L;
+
+ /** The number of results per page.*/
+ private int pageSize;
+ private int currentPage;
+ private int offset ;
+ private int totalCount;
+ private int totalPages;
+ private int countByPage;
+
+
+ public PaginationData(int pageSize,int currentPage) {
+ if (pageSize == 0)
+ throw new IllegalArgumentException("limit cannot be 0 for pagination.");
+
+
+ this.pageSize = pageSize;
+ this.currentPage=currentPage;
+ }
+
+
+ public int getPageSize()
+ {
+ return pageSize;
+ }
+
+
+ /**
+ * The current page number this pagination object represents
+ *
+ * @return the page number
+ */
+ public int getPageNumber() {
+ if (offset < pageSize || pageSize == 0)
+ return 1;
+
+ return (offset / pageSize) + 1;
+ }
+
+
+ /**
+ * The offset for this pagination object. The offset determines what index (0 index) to start retrieving results from.
+ *
+ * @return the offset
+ */
+ public int getOffset() {
+ return (currentPage - 1) * pageSize + 1;
+ }
+
+
+ /**
+ * Creates a new pagination object representing the next page
+ *
+ * @return new pagination object with offset shifted by offset+limit
+ */
+ public PaginationData getNext()
+ {
+ return new PaginationData( offset + pageSize, pageSize );
+ }
+
+
+ /**
+ * Creates a new pagination object representing the previous page
+ *
+ * @return new pagination object with offset shifted by offset-limit
+ */
+ public PaginationData getPrevious() {
+ if (pageSize >= offset) {
+ return new PaginationData(0, pageSize);
+ } else {
+ return new PaginationData(offset - pageSize, pageSize);
+ }
+ }
+
+
+ public int getCurrentPage()
+ {
+ return currentPage;
+ }
+
+
+ public void setCurrentPage( int currentPage )
+ {
+ this.currentPage = currentPage;
+ }
+
+
+ public int getTotalCount()
+ {
+ return totalCount;
+ }
+
+
+ public void setTotalCount( int totalCount )
+ {
+ this.totalCount = totalCount;
+ }
+
+
+ public int getTotalPages()
+ {
+
+ Integer totalPages= Integer.valueOf((int) (Math.ceil(Integer.valueOf(totalCount).doubleValue() / pageSize)));
+ return totalPages;
+ }
+
+
+ public int getCountByPage() {
+ return countByPage;
+ }
+
+
+ public void setCountByPage(int countByPage) {
+ this.countByPage = countByPage;
+ }
+
+
+ public void setTotalPages(int totalPages) {
+ this.totalPages = totalPages;
+ }
+
+
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/security/AbstractCustomerServices.java b/sm-shop/src/main/java/com/salesmanager/shop/store/security/AbstractCustomerServices.java
new file mode 100644
index 0000000..99168c2
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/security/AbstractCustomerServices.java
@@ -0,0 +1,100 @@
+package com.salesmanager.shop.store.security;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.dao.DataAccessException;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+
+import com.salesmanager.core.business.exception.ServiceException;
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.business.services.user.GroupService;
+import com.salesmanager.core.business.services.user.PermissionService;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.core.model.user.Group;
+import com.salesmanager.core.model.user.Permission;
+import com.salesmanager.shop.admin.security.SecurityDataAccessException;
+import com.salesmanager.shop.constants.Constants;
+
+public abstract class AbstractCustomerServices implements UserDetailsService{
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(AbstractCustomerServices.class);
+
+ protected CustomerService customerService;
+ protected PermissionService permissionService;
+ protected GroupService groupService;
+
+ public final static String ROLE_PREFIX = "ROLE_";//Spring Security 4
+
+ public AbstractCustomerServices(
+ CustomerService customerService,
+ PermissionService permissionService,
+ GroupService groupService) {
+
+ this.customerService = customerService;
+ this.permissionService = permissionService;
+ this.groupService = groupService;
+ }
+
+ protected abstract UserDetails userDetails(String userName, Customer customer, Collection<GrantedAuthority> authorities);
+
+
+ public UserDetails loadUserByUsername(String userName)
+ throws UsernameNotFoundException, DataAccessException {
+ Customer user = null;
+ Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
+
+ try {
+
+ LOGGER.debug("Loading user by user id: {}", userName);
+
+ user = customerService.getByNick(userName);
+
+ if(user==null) {
+ //return null;
+ throw new UsernameNotFoundException("User " + userName + " not found");
+ }
+
+
+
+ GrantedAuthority role = new SimpleGrantedAuthority(ROLE_PREFIX + Constants.PERMISSION_CUSTOMER_AUTHENTICATED);//required to login
+ authorities.add(role);
+
+ List<Integer> groupsId = new ArrayList<Integer>();
+ List<Group> groups = user.getGroups();
+ for(Group group : groups) {
+ groupsId.add(group.getId());
+ }
+
+
+ if(CollectionUtils.isNotEmpty(groupsId)) {
+ List<Permission> permissions = permissionService.getPermissions(groupsId);
+ for(Permission permission : permissions) {
+ GrantedAuthority auth = new SimpleGrantedAuthority(permission.getPermissionName());
+ authorities.add(auth);
+ }
+ }
+
+
+
+
+
+
+ } catch (ServiceException e) {
+ LOGGER.error("Exception while querrying customer",e);
+ throw new SecurityDataAccessException("Cannot authenticate customer",e);
+ }
+
+ return userDetails(userName, user, authorities);
+
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/security/AuthenticationRequest.java b/sm-shop/src/main/java/com/salesmanager/shop/store/security/AuthenticationRequest.java
new file mode 100644
index 0000000..1d8c912
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/security/AuthenticationRequest.java
@@ -0,0 +1,51 @@
+package com.salesmanager.shop.store.security;
+
+import java.io.Serializable;
+
+import org.hibernate.validator.constraints.NotEmpty;
+
+public class AuthenticationRequest implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Username and password must be used when using normal system authentication
+ * for a registered customer
+ */
+ @NotEmpty(message="{NotEmpty.customer.userName}")
+ private String username;
+ @NotEmpty(message="{message.password.required}")
+ private String password;
+
+
+
+ public AuthenticationRequest() {
+ super();
+ }
+
+ public AuthenticationRequest(String username, String password) {
+ this.setUsername(username);
+ this.setPassword(password);
+ }
+
+ public String getUsername() {
+ return this.username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return this.password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/security/AuthenticationResponse.java b/sm-shop/src/main/java/com/salesmanager/shop/store/security/AuthenticationResponse.java
new file mode 100644
index 0000000..263ed1d
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/security/AuthenticationResponse.java
@@ -0,0 +1,24 @@
+package com.salesmanager.shop.store.security;
+
+import java.io.Serializable;
+
+import com.salesmanager.shop.model.Entity;
+
+public class AuthenticationResponse extends Entity implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private final String token;
+
+ public AuthenticationResponse(Long userId, String token) {
+ this.token = token;
+ super.setId(userId);
+ }
+
+ public String getToken() {
+ return this.token;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/security/AuthenticationTokenFilter.java b/sm-shop/src/main/java/com/salesmanager/shop/store/security/AuthenticationTokenFilter.java
new file mode 100644
index 0000000..ff4b7b6
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/security/AuthenticationTokenFilter.java
@@ -0,0 +1,71 @@
+package com.salesmanager.shop.store.security;
+
+import java.io.IOException;
+
+import javax.inject.Inject;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.filter.OncePerRequestFilter;
+
+import com.salesmanager.shop.store.security.manager.CustomAuthenticationManager;
+
+
+public class AuthenticationTokenFilter extends OncePerRequestFilter {
+
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(AuthenticationTokenFilter.class);
+
+
+ @Value("${authToken.header}")
+ private String tokenHeader;
+
+
+ @Inject
+ private CustomAuthenticationManager jwtCustomCustomerAuthenticationManager;
+
+ @Inject
+ private CustomAuthenticationManager facebookCustomerAuthenticationManager;
+
+
+ @Override
+ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
+
+ //@TODO edit this
+ if(request.getRequestURL().toString().contains("/api/v1/auth")) {
+
+ //Allow CORS requests, support pre-flight check
+ response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, OPTIONS, DELETE");
+ response.setHeader("Access-Control-Allow-Headers", "X-Auth-Token, Content-Type, Authorization");
+ response.setHeader("Access-Control-Allow-Origin", "*");
+
+ final String requestHeader = request.getHeader(this.tokenHeader);//token
+
+ try {
+ if (requestHeader != null && requestHeader.startsWith("Bearer ")) {//Bearer
+
+ jwtCustomCustomerAuthenticationManager.authenticateRequest(request, response);
+
+ } else if(requestHeader != null && requestHeader.startsWith("FB ")) {
+ //Facebook
+ facebookCustomerAuthenticationManager.authenticateRequest(request, response);
+ } else {
+ LOGGER.warn("couldn't find any authorization token, will ignore the header");
+ }
+
+ } catch(Exception e) {
+ throw new ServletException(e);
+ }
+ }
+
+ chain.doFilter(request, response);
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/security/CustomerServicesImpl.java b/sm-shop/src/main/java/com/salesmanager/shop/store/security/CustomerServicesImpl.java
index b94db3e..de8c241 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/security/CustomerServicesImpl.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/security/CustomerServicesImpl.java
@@ -1,113 +1,61 @@
-package com.salesmanager.shop.store.security;
-
-import com.salesmanager.core.business.exception.ServiceException;
-import com.salesmanager.core.business.services.customer.CustomerService;
-import com.salesmanager.core.business.services.user.GroupService;
-import com.salesmanager.core.business.services.user.PermissionService;
-import com.salesmanager.core.model.customer.Customer;
-import com.salesmanager.core.model.user.Group;
-import com.salesmanager.core.model.user.Permission;
-import com.salesmanager.shop.admin.security.SecurityDataAccessException;
-import com.salesmanager.shop.constants.Constants;
-
-import org.apache.commons.collections4.CollectionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.dao.DataAccessException;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.userdetails.User;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.stereotype.Service;
-
-import javax.inject.Inject;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-
-/**
- *
- * @author casams1
- * http://stackoverflow.com/questions/5105776/spring-security-with
- * -custom-user-details
- */
-@Service("customerDetailsService")
-public class CustomerServicesImpl implements UserDetailsService{
-
- private static final Logger LOGGER = LoggerFactory.getLogger(CustomerServicesImpl.class);
-
- public final static String ROLE_PREFIX = "ROLE_";//Spring Security 4
-
- @Inject
- private CustomerService customerService;
-
-
-
- @Inject
- protected PermissionService permissionService;
-
- @Inject
- protected GroupService groupService;
-
-
-
- public UserDetails loadUserByUsername(String userName)
- throws UsernameNotFoundException, DataAccessException {
-
- Customer user = null;
- Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
-
- try {
-
- user = customerService.getByNick(userName);
-
- if(user==null) {
- return null;
- }
-
-
-
- GrantedAuthority role = new SimpleGrantedAuthority(ROLE_PREFIX + Constants.PERMISSION_CUSTOMER_AUTHENTICATED);//required to login
- authorities.add(role);
-
- List<Integer> groupsId = new ArrayList<Integer>();
- List<Group> groups = user.getGroups();
- for(Group group : groups) {
- groupsId.add(group.getId());
- }
-
-
- if(CollectionUtils.isNotEmpty(groupsId)) {
- List<Permission> permissions = permissionService.getPermissions(groupsId);
- for(Permission permission : permissions) {
- GrantedAuthority auth = new SimpleGrantedAuthority(permission.getPermissionName());
- authorities.add(auth);
- }
- }
-
-
-
-
-
-
- } catch (ServiceException e) {
- LOGGER.error("Exception while querrying customer",e);
- throw new SecurityDataAccessException("Cannot authenticate customer",e);
- }
-
- User authUser = new User(userName, user.getPassword(), true, true,
- true, true, authorities);
-
- return authUser;
-
-
- }
-
-
-
-
-
-}
+package com.salesmanager.shop.store.security;
+
+import java.util.Collection;
+
+import javax.inject.Inject;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.stereotype.Service;
+
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.business.services.user.GroupService;
+import com.salesmanager.core.business.services.user.PermissionService;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.shop.store.security.user.CustomerDetails;
+
+
+/**
+ *
+ * @author casams1
+ * http://stackoverflow.com/questions/5105776/spring-security-with
+ * -custom-user-details
+ */
+@Service("customerDetailsService")
+public class CustomerServicesImpl extends AbstractCustomerServices{
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(CustomerServicesImpl.class);
+
+
+ private CustomerService customerService;
+ private PermissionService permissionService;
+ private GroupService groupService;
+
+ @Inject
+ public CustomerServicesImpl(CustomerService customerService, PermissionService permissionService, GroupService groupService) {
+ super(customerService, permissionService, groupService);
+ this.customerService = customerService;
+ this.permissionService = permissionService;
+ this.groupService = groupService;
+ }
+
+ @Override
+ protected UserDetails userDetails(String userName, Customer customer, Collection<GrantedAuthority> authorities) {
+
+ CustomerDetails authUser = new CustomerDetails(userName, customer.getPassword(), true, true,
+ true, true, authorities);
+
+ authUser.setEmail(customer.getEmailAddress());
+ authUser.setId(customer.getId());
+
+ return authUser;
+ }
+
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/security/JWTCustomerServicesImpl.java b/sm-shop/src/main/java/com/salesmanager/shop/store/security/JWTCustomerServicesImpl.java
new file mode 100644
index 0000000..febf816
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/security/JWTCustomerServicesImpl.java
@@ -0,0 +1,55 @@
+package com.salesmanager.shop.store.security;
+
+import java.util.Collection;
+import java.util.Date;
+
+import javax.inject.Inject;
+
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.stereotype.Service;
+
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.business.services.user.GroupService;
+import com.salesmanager.core.business.services.user.PermissionService;
+import com.salesmanager.core.model.common.audit.AuditSection;
+import com.salesmanager.core.model.customer.Customer;
+import com.salesmanager.shop.store.security.user.JWTUser;
+
+
+@Service("jwtCustomerDetailsService")
+public class JWTCustomerServicesImpl extends AbstractCustomerServices {
+
+
+ @Inject
+ public JWTCustomerServicesImpl(CustomerService customerService, PermissionService permissionService, GroupService groupService) {
+ super(customerService, permissionService, groupService);
+ this.customerService = customerService;
+ this.permissionService = permissionService;
+ this.groupService = groupService;
+ }
+
+ @Override
+ protected UserDetails userDetails(String userName, Customer customer, Collection<GrantedAuthority> authorities) {
+
+ AuditSection section = null;
+ section = customer.getAuditSection();
+ Date lastModified = null;
+ if(section != null) {
+ lastModified = section.getDateModified();
+ }
+
+ return new JWTUser(
+ customer.getId(),
+ userName,
+ customer.getBilling().getFirstName(),
+ customer.getBilling().getLastName(),
+ customer.getEmailAddress(),
+ customer.getPassword(),
+ authorities,
+ true,
+ lastModified
+ );
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/security/JWTTokenUtil.java b/sm-shop/src/main/java/com/salesmanager/shop/store/security/JWTTokenUtil.java
new file mode 100644
index 0000000..5f467cd
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/security/JWTTokenUtil.java
@@ -0,0 +1,164 @@
+package com.salesmanager.shop.store.security;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.Function;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.mobile.device.Device;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.stereotype.Component;
+
+import com.salesmanager.shop.store.security.user.JWTUser;
+import com.salesmanager.shop.utils.DateUtil;
+
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureAlgorithm;
+
+@Component
+public class JWTTokenUtil implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+
+
+ static final String CLAIM_KEY_USERNAME = "sub";
+ static final String CLAIM_KEY_AUDIENCE = "aud";
+ static final String CLAIM_KEY_CREATED = "iat";
+
+ static final String AUDIENCE_UNKNOWN = "unknown";
+ static final String AUDIENCE_WEB = "web";
+ static final String AUDIENCE_MOBILE = "mobile";
+ static final String AUDIENCE_TABLET = "tablet";
+
+
+ @Value("${jwt.secret}")
+ private String secret;
+
+ @Value("${jwt.expiration}")
+ private Long expiration;
+
+ public String getUsernameFromToken(String token) {
+ return getClaimFromToken(token, Claims::getSubject);
+ }
+
+ public Date getIssuedAtDateFromToken(String token) {
+ return getClaimFromToken(token, Claims::getIssuedAt);
+ }
+
+ public Date getExpirationDateFromToken(String token) {
+ return getClaimFromToken(token, Claims::getExpiration);
+ }
+
+ public String getAudienceFromToken(String token) {
+ return getClaimFromToken(token, Claims::getAudience);
+ }
+
+ public <T> T getClaimFromToken(String token, Function<Claims, T> claimsResolver) {
+ final Claims claims = getAllClaimsFromToken(token);
+ return claimsResolver.apply(claims);
+ }
+
+ private Claims getAllClaimsFromToken(String token) {
+ return Jwts.parser()
+ .setSigningKey(secret)
+ .parseClaimsJws(token)
+ .getBody();
+ }
+
+ private Boolean isTokenExpired(String token) {
+ final Date expiration = getExpirationDateFromToken(token);
+ return expiration.before(DateUtil.getDate());
+ }
+
+ private Boolean isCreatedBeforeLastPasswordReset(Date created, Date lastPasswordReset) {
+ return (lastPasswordReset != null && created.before(lastPasswordReset));
+ }
+
+ private String generateAudience(Device device) {
+ String audience = AUDIENCE_UNKNOWN;
+ if(device != null) {
+ if (device.isNormal()) {
+ audience = AUDIENCE_WEB;
+ } else if (device.isTablet()) {
+ audience = AUDIENCE_TABLET;
+ } else if (device.isMobile()) {
+ audience = AUDIENCE_MOBILE;
+ }
+ }
+ return audience;
+ }
+
+ private Boolean ignoreTokenExpiration(String token) {
+ String audience = getAudienceFromToken(token);
+ return (AUDIENCE_TABLET.equals(audience) || AUDIENCE_MOBILE.equals(audience));
+ }
+
+ public String generateToken(UserDetails userDetails, Device device) {
+ Map<String, Object> claims = new HashMap<>();
+ return doGenerateToken(claims, userDetails.getUsername(), generateAudience(device));
+ }
+
+ private String doGenerateToken(Map<String, Object> claims, String subject, String audience) {
+ final Date createdDate = DateUtil.getDate();
+ final Date expirationDate = calculateExpirationDate(createdDate);
+
+ System.out.println("doGenerateToken " + createdDate);
+
+ return Jwts.builder()
+ .setClaims(claims)
+ .setSubject(subject)
+ .setAudience(audience)
+ .setIssuedAt(createdDate)
+ .setExpiration(expirationDate)
+ .signWith(SignatureAlgorithm.HS512, secret)
+ .compact();
+ }
+
+ public Boolean canTokenBeRefreshed(String token, Date lastPasswordReset) {
+ final Date created = getIssuedAtDateFromToken(token);
+ return !isCreatedBeforeLastPasswordReset(created, lastPasswordReset)
+ && (!isTokenExpired(token) || ignoreTokenExpiration(token));
+ }
+
+ public String refreshToken(String token) {
+ final Date createdDate = DateUtil.getDate();
+ final Date expirationDate = calculateExpirationDate(createdDate);
+
+ final Claims claims = getAllClaimsFromToken(token);
+ claims.setIssuedAt(createdDate);
+ claims.setExpiration(expirationDate);
+
+ return Jwts.builder()
+ .setClaims(claims)
+ .signWith(SignatureAlgorithm.HS512, secret)
+ .compact();
+ }
+
+ public Boolean validateToken(String token, UserDetails userDetails) {
+ JWTUser user = (JWTUser) userDetails;
+ final String username = getUsernameFromToken(token);
+ final Date created = getIssuedAtDateFromToken(token);
+ //final Date expiration = getExpirationDateFromToken(token);
+
+ boolean usernameEquals = username.equals(user.getUsername());
+ boolean isTokenExpired = isTokenExpired(token);
+ boolean isTokenCreatedBeforeLastPasswordReset = isCreatedBeforeLastPasswordReset(created, user.getLastPasswordResetDate());
+
+ return (
+
+ usernameEquals && !isTokenExpired && !isTokenCreatedBeforeLastPasswordReset
+ );
+ }
+
+ private Date calculateExpirationDate(Date createdDate) {
+ return new Date(createdDate.getTime() + expiration * 1000);
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/security/manager/CustomAuthenticationException.java b/sm-shop/src/main/java/com/salesmanager/shop/store/security/manager/CustomAuthenticationException.java
new file mode 100644
index 0000000..71a6cd5
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/security/manager/CustomAuthenticationException.java
@@ -0,0 +1,16 @@
+package com.salesmanager.shop.store.security.manager;
+
+import org.springframework.security.core.AuthenticationException;
+
+public class CustomAuthenticationException extends AuthenticationException {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public CustomAuthenticationException(String msg) {
+ super(msg);
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/security/manager/CustomAuthenticationManager.java b/sm-shop/src/main/java/com/salesmanager/shop/store/security/manager/CustomAuthenticationManager.java
new file mode 100644
index 0000000..508055c
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/security/manager/CustomAuthenticationManager.java
@@ -0,0 +1,93 @@
+package com.salesmanager.shop.store.security.manager;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.context.SecurityContextHolder;
+
+/**
+ * Abstract authentication manager to be used by various internal Authentication manager
+ * invoked from a SecurityFilter placed in the security filter chain of given http configuration.
+ * @author c.samson
+ *
+ */
+public abstract class CustomAuthenticationManager {
+
+ protected final Log logger = LogFactory.getLog(getClass());
+
+ @Value("${authToken.header}")
+ private String tokenHeader;
+
+
+ public String getTokenHeader() {
+ return tokenHeader;
+ }
+
+ public void setTokenHeader(String tokenHeader) {
+ this.tokenHeader = tokenHeader;
+ }
+
+ public void authenticateRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("Processing authentication");
+ }
+
+ Authentication authResult = null;
+
+ try {
+ authResult = this.attemptAuthentication(request, response);
+ if (authResult == null) {
+ // return immediately as subclass has indicated that it hasn't completed
+ // authentication
+ return;
+ }
+ } catch (AuthenticationException failed) {
+ // Authentication failed
+ unsuccess(request, response);
+ return;
+ }
+
+ this.success(request, response, authResult);
+
+
+ }
+
+ private void success(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws AuthenticationException {
+
+ SecurityContextHolder.getContext().setAuthentication(authentication);
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("Authentication success");
+ logger.debug("Updated SecurityContextHolder to containAuthentication");
+ }
+
+ successfullAuthentication(request, response, authentication);
+ }
+
+ private void unsuccess(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
+
+ SecurityContextHolder.clearContext();
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("Authentication request failed");
+ logger.debug("Updated SecurityContextHolder to contain null Authentication");
+ }
+
+ unSuccessfullAuthentication(request, response);
+ }
+
+
+ abstract Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, Exception;
+
+ abstract void successfullAuthentication(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws AuthenticationException;
+
+ abstract void unSuccessfullAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException;
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/security/manager/FacebookCustomerAuthenticationManager.java b/sm-shop/src/main/java/com/salesmanager/shop/store/security/manager/FacebookCustomerAuthenticationManager.java
new file mode 100644
index 0000000..4ce1c93
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/security/manager/FacebookCustomerAuthenticationManager.java
@@ -0,0 +1,330 @@
+package com.salesmanager.shop.store.security.manager;
+
+import java.io.IOException;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.inject.Inject;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.authentication.AuthenticationDetailsSource;
+import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.AuthenticationServiceException;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
+import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
+import org.springframework.social.UserIdSource;
+import org.springframework.social.connect.Connection;
+import org.springframework.social.connect.ConnectionData;
+//import org.springframework.social.connect.ConnectionFactoryLocator;
+import org.springframework.social.connect.ConnectionKey;
+import org.springframework.social.connect.ConnectionRepository;
+import org.springframework.social.connect.UserProfile;
+import org.springframework.social.connect.UsersConnectionRepository;
+import org.springframework.social.connect.support.OAuth2ConnectionFactory;
+import org.springframework.social.oauth2.AccessGrant;
+import org.springframework.social.security.SocialAuthenticationException;
+import org.springframework.social.security.SocialAuthenticationRedirectException;
+import org.springframework.social.security.SocialAuthenticationServiceLocator;
+import org.springframework.social.security.SocialAuthenticationToken;
+import org.springframework.social.security.SocialUserDetails;
+import org.springframework.social.security.provider.SocialAuthenticationService;
+import org.springframework.social.support.URIBuilder;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+import org.springframework.util.Assert;
+import org.springframework.web.client.HttpClientErrorException;
+import org.springframework.web.client.RestTemplate;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.salesmanager.core.business.services.user.UserService;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.model.customer.Address;
+import com.salesmanager.shop.model.customer.CustomerEntity;
+import com.salesmanager.shop.model.customer.PersistableCustomer;
+import com.salesmanager.shop.model.customer.UserAlreadyExistException;
+import com.salesmanager.shop.store.controller.customer.facade.CustomerFacade;
+import com.salesmanager.shop.store.controller.store.facade.StoreFacade;
+import com.salesmanager.shop.store.security.user.CustomerDetails;
+import com.salesmanager.shop.utils.LanguageUtils;
+
+
+
+@Component("facebookCustomerAuthenticationManager")
+public class FacebookCustomerAuthenticationManager extends CustomAuthenticationManager {
+
+ protected final Log logger = LogFactory.getLog(getClass());
+
+ @Value("${facebook.app.access_token}")
+ private String access_token;
+
+ private static final String providerId = "facebook";
+
+ @Inject
+ private AuthenticationManager facebookAuthenticationManager;
+
+ @Inject
+ private CustomerFacade customerFacade;
+
+ @Inject
+ private StoreFacade storeFacade;
+
+ @Inject
+ private LanguageUtils languageUtils;
+
+ //@Inject
+ //private UserService service;
+
+ @Inject
+ private SocialAuthenticationServiceLocator authenticationServiceLocator;
+ //private ConnectionFactoryLocator connectionFactoryLocator;
+
+ @Inject
+ private UsersConnectionRepository socialUsersConnectionRepository;
+ private AuthenticationDetailsSource<HttpServletRequest, ?> authenticationDetailsSource = new WebAuthenticationDetailsSource();
+ private UserIdSource userIdSource = new org.springframework.social.security.AuthenticationNameUserIdSource();
+ private SimpleUrlAuthenticationFailureHandler delegateAuthenticationFailureHandler;
+
+ /** Entry point of facebook authentication, requires FB <token> **/
+ public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
+ throws AuthenticationException, Exception {
+
+ Authentication auth = null;
+ Set<String> authProviders = authenticationServiceLocator.registeredAuthenticationProviderIds();
+ if (!authProviders.isEmpty() && authProviders.contains(providerId)) {
+ SocialAuthenticationService<?> authService = authenticationServiceLocator.getAuthenticationService(providerId);
+ auth = attemptAuthService(authService, request, response);
+ if (auth == null) {
+ throw new AuthenticationServiceException("authentication failed");
+ }
+ }
+ return auth;
+ }
+
+
+/* protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain,
+ Authentication authResult) throws IOException, ServletException {
+ // --> //super.successfulAuthentication(request, response, chain, authResult);
+ chain.doFilter(request, response);
+ }*/
+
+ @Deprecated
+ protected boolean requiresAuthentication(HttpServletRequest request, HttpServletResponse response) {
+ return true;
+ }
+
+ protected Connection<?> addConnection(SocialAuthenticationService<?> authService, String userId,
+ ConnectionData data) {
+ HashSet<String> userIdSet = new HashSet<String>();
+ userIdSet.add(data.getProviderUserId());
+ Set<String> connectedUserIds = socialUsersConnectionRepository.findUserIdsConnectedTo(data.getProviderId(),
+ userIdSet);
+ if (connectedUserIds.contains(userId)) {
+ // already connected
+ return null;
+ } else if (!authService.getConnectionCardinality().isMultiUserId() && !connectedUserIds.isEmpty()) {
+ return null;
+ }
+
+ ConnectionRepository repo = socialUsersConnectionRepository.createConnectionRepository(userId);
+
+ if (!authService.getConnectionCardinality().isMultiProviderUserId()) {
+ List<Connection<?>> connections = repo.findConnections(data.getProviderId());
+ if (!connections.isEmpty()) {
+ // TODO maybe throw an exception to allow UI feedback?
+ return null;
+ }
+ }
+
+ // add new connection
+ Connection<?> connection = authService.getConnectionFactory().createConnection(data);
+ connection.sync();
+ repo.addConnection(connection);
+ return connection;
+ }
+
+ private Authentication attemptAuthService(final SocialAuthenticationService<?> authService,
+ final HttpServletRequest request, HttpServletResponse response)
+ throws SocialAuthenticationRedirectException, AuthenticationException, Exception {
+
+ final String requestHeader = request.getHeader(super.getTokenHeader());//token
+
+ if (requestHeader == null) {
+ throw new SocialAuthenticationException("No token in the request");
+ }
+
+ if (!requestHeader.startsWith("FB ")) {//FB token
+ throw new SocialAuthenticationException("Token must start with FB");
+ }
+
+ String input_token = requestHeader.substring(3);
+
+ URIBuilder builder = URIBuilder.fromUri(String.format("%s/debug_token", "https://graph.facebook.com"));
+ builder.queryParam("access_token", access_token);
+ builder.queryParam("input_token", input_token);
+ URI uri = builder.build();
+ RestTemplate restTemplate = new RestTemplate();
+
+ JsonNode resp = null;
+ try {
+ resp = restTemplate.getForObject(uri, JsonNode.class);
+ } catch (HttpClientErrorException e) {
+ throw new SocialAuthenticationException("Error validating token");
+ }
+ Boolean isValid = resp.path("data").findValue("is_valid").asBoolean();
+ if (!isValid)
+ throw new SocialAuthenticationException("Token is not valid");
+
+ AccessGrant accessGrant = new AccessGrant(input_token, null, null,
+ resp.path("data").findValue("expires_at").longValue());
+
+ Connection<?> connection = ((OAuth2ConnectionFactory<?>) authService.getConnectionFactory())
+ .createConnection(accessGrant);
+ SocialAuthenticationToken token = new SocialAuthenticationToken(connection, null);
+ Assert.notNull(token.getConnection());
+
+ Authentication auth = SecurityContextHolder.getContext().getAuthentication();
+ if (auth == null || !auth.isAuthenticated()) {
+ return doAuthentication(authService, request, token);
+ } else {
+ addConnection(authService, request, token);
+ return null;
+ }
+
+ }
+
+ private void addConnection(final SocialAuthenticationService<?> authService, HttpServletRequest request,
+ SocialAuthenticationToken token) {
+ // already authenticated - add connection instead
+ String userId = userIdSource.getUserId();
+ Object principal = token.getPrincipal();
+ if (userId == null || !(principal instanceof ConnectionData))
+ return;
+
+ addConnection(authService, userId, (ConnectionData) principal);
+
+ }
+
+ private Authentication doAuthentication(SocialAuthenticationService<?> authService, HttpServletRequest request,
+ SocialAuthenticationToken token) throws Exception {
+ try {
+ if (!authService.getConnectionCardinality().isAuthenticatePossible())
+ return null;
+ token.setDetails(authenticationDetailsSource.buildDetails(request));
+ Authentication success = facebookAuthenticationManager.authenticate(token);
+ Assert.isInstanceOf(SocialUserDetails.class, success.getPrincipal(), "unexpected principle type");
+ updateConnections(authService, token, success);
+ return success;
+
+ } catch (BadCredentialsException e) {
+
+ CustomerDetails registered = null;
+ PersistableCustomer registration = null;
+ try {
+
+ MerchantStore merchantStore = storeFacade.getByCode(com.salesmanager.core.business.constants.Constants.DEFAULT_STORE);
+ Language language = languageUtils.getRESTLanguage(request, merchantStore);
+
+ registration = register(token.getConnection());
+
+
+ PersistableCustomer c = customerFacade.registerCustomer(registration, merchantStore, language);
+
+ Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
+ GrantedAuthority role = new SimpleGrantedAuthority("ROLE_" + Constants.PERMISSION_CUSTOMER_AUTHENTICATED);//required to login
+ authorities.add(role);
+
+ registered = new CustomerDetails(
+ c.getEmailAddress(),
+ c.getEncodedPassword(),
+ authorities);
+
+ } catch (UserAlreadyExistException e1) {
+ //we create the user anyway
+ //throw new SocialAuthenticationException("An email address was found from the database.");
+ }
+ ConnectionRepository repo = socialUsersConnectionRepository.createConnectionRepository(registration.getEmailAddress());
+ repo.addConnection(token.getConnection());
+ Authentication success = facebookAuthenticationManager.authenticate(token);
+ return success;
+
+ }
+
+ }
+
+ private void updateConnections(SocialAuthenticationService<?> authService, SocialAuthenticationToken token,
+ Authentication success) {
+
+ String userId = ((SocialUserDetails) success.getPrincipal()).getUserId();
+ Connection<?> connection = token.getConnection();
+ ConnectionRepository repo = socialUsersConnectionRepository.createConnectionRepository(userId);
+ repo.updateConnection(connection);
+
+ }
+
+
+ @Override
+ void successfullAuthentication(HttpServletRequest request, HttpServletResponse response,
+ Authentication authentication) throws AuthenticationException {
+ logger.debug("Successfull FB authentication");
+
+ }
+
+
+ @Override
+ void unSuccessfullAuthentication(HttpServletRequest request, HttpServletResponse response)
+ throws AuthenticationException {
+ logger.debug("Un successfull FB authentication");
+
+ }
+
+
+
+ private PersistableCustomer register(Connection<?> connection) {
+ PersistableCustomer customer = new PersistableCustomer();
+ if (connection != null) {
+ UserProfile socialMediaProfile = connection.fetchUserProfile();
+
+ ConnectionKey providerKey = connection.getKey();
+
+ customer.setEmailAddress(socialMediaProfile.getEmail());
+ customer.setUserName(socialMediaProfile.getEmail());
+ customer.setFirstName(socialMediaProfile.getFirstName());
+ customer.setLastName(socialMediaProfile.getLastName());
+ customer.setProvider(providerKey.getProviderId());
+
+ //create dummy password
+
+ Address address = new Address();
+ address.setFirstName(socialMediaProfile.getFirstName());
+ address.setLastName(socialMediaProfile.getLastName());
+ address.setCountry(com.salesmanager.core.business.constants.Constants.DEFAULT_COUNTRY);
+
+ customer.setBilling(address);
+
+ }
+
+ return customer;
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/security/manager/JWTCustomerAuthenticationManager.java b/sm-shop/src/main/java/com/salesmanager/shop/store/security/manager/JWTCustomerAuthenticationManager.java
new file mode 100644
index 0000000..ef46788
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/security/manager/JWTCustomerAuthenticationManager.java
@@ -0,0 +1,90 @@
+package com.salesmanager.shop.store.security.manager;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
+import org.springframework.stereotype.Component;
+
+import com.salesmanager.shop.store.security.JWTTokenUtil;
+
+import io.jsonwebtoken.ExpiredJwtException;
+
+@Component("jwtCustomCustomerAuthenticationManager")//different than jwtCustomerAuthenticationManager
+public class JWTCustomerAuthenticationManager extends CustomAuthenticationManager {
+
+ protected final Log logger = LogFactory.getLog(getClass());
+
+ @Inject
+ private JWTTokenUtil jwtTokenUtil;
+
+ @Inject
+ private UserDetailsService jwtCustomerDetailsService;
+
+ @Override
+ Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
+ throws AuthenticationException {
+
+ final String requestHeader = request.getHeader(super.getTokenHeader());//token
+ String username = null;
+ String authToken = null;
+ if (requestHeader != null && requestHeader.startsWith("Bearer ")) {//Bearer
+ authToken = requestHeader.substring(7);
+ try {
+ username = jwtTokenUtil.getUsernameFromToken(authToken);
+ } catch (IllegalArgumentException e) {
+ logger.error("an error occured during getting username from token", e);
+ } catch (ExpiredJwtException e) {
+ logger.warn("the token is expired and not valid anymore", e);
+ }
+ } else {
+ throw new CustomAuthenticationException("No Bearer token found in the request");
+ }
+
+ UsernamePasswordAuthenticationToken authentication = null;
+
+
+ logger.info("checking authentication for user " + username);
+ if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
+
+ // It is not compelling necessary to load the use details from the database. You could also store the information
+ // in the token and read it from it. It's up to you ;)
+ UserDetails userDetails = this.jwtCustomerDetailsService.loadUserByUsername(username);
+
+ // For simple validation it is completely sufficient to just check the token integrity. You don't have to call
+ // the database compellingly. Again it's up to you ;)
+ if (userDetails != null && jwtTokenUtil.validateToken(authToken, userDetails)) {
+ authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
+ authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
+ logger.info("authenticated user " + username + ", setting security context");
+ //SecurityContextHolder.getContext().setAuthentication(authentication);
+ }
+ }
+
+ return authentication;
+ }
+
+ @Override
+ void successfullAuthentication(HttpServletRequest request, HttpServletResponse response,
+ Authentication authentication) throws AuthenticationException {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ void unSuccessfullAuthentication(HttpServletRequest request, HttpServletResponse response)
+ throws AuthenticationException {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/security/RestAuthenticationEntryPoint.java b/sm-shop/src/main/java/com/salesmanager/shop/store/security/RestAuthenticationEntryPoint.java
new file mode 100644
index 0000000..40a664e
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/security/RestAuthenticationEntryPoint.java
@@ -0,0 +1,41 @@
+package com.salesmanager.shop.store.security;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.core.Ordered;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.AuthenticationEntryPoint;
+import org.springframework.stereotype.Component;
+
+@Component("restAuthenticationEntryPoint")
+public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint, InitializingBean, Ordered {
+
+ private String realmName = "rest-realm";
+
+ @Override
+ public void commence(HttpServletRequest request, HttpServletResponse response,
+ AuthenticationException authException) throws IOException, ServletException {
+
+
+ response.sendError( HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized" );
+
+ }
+
+ @Override
+ public int getOrder() {
+ return 1;
+ }
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+ if ((realmName == null) || "".equals(realmName)) {
+ throw new IllegalArgumentException("realmName must be specified");
+ }
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/security/ServicesAuthenticationEntryPoint.java b/sm-shop/src/main/java/com/salesmanager/shop/store/security/ServicesAuthenticationEntryPoint.java
index d2be366..bc77e3a 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/security/ServicesAuthenticationEntryPoint.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/security/ServicesAuthenticationEntryPoint.java
@@ -1,18 +1,36 @@
-package com.salesmanager.shop.store.security;
-
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.web.AuthenticationEntryPoint;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-public class ServicesAuthenticationEntryPoint implements AuthenticationEntryPoint {
-
- @Override
- public void commence( HttpServletRequest request, HttpServletResponse response,
- AuthenticationException authException ) throws IOException{
- response.sendError( HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized" );
- }
-
+package com.salesmanager.shop.store.security;
+
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.core.Ordered;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.web.AuthenticationEntryPoint;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+public class ServicesAuthenticationEntryPoint implements AuthenticationEntryPoint, InitializingBean, Ordered {
+
+
+ private String realmName = "services-realm";
+
+ @Override
+ public void commence( HttpServletRequest request, HttpServletResponse response,
+ AuthenticationException authException ) throws IOException{
+ response.sendError( HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized" );
+ }
+
+ @Override
+ public int getOrder() {
+ return 0;
+ }
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+ if ((realmName == null) || "".equals(realmName)) {
+ throw new IllegalArgumentException("realmName must be specified");
+ }
+
+ }
+
}
\ No newline at end of file
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/security/ServicesAuthenticationSuccessHandler.java b/sm-shop/src/main/java/com/salesmanager/shop/store/security/ServicesAuthenticationSuccessHandler.java
index a3627f2..100e803 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/store/security/ServicesAuthenticationSuccessHandler.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/security/ServicesAuthenticationSuccessHandler.java
@@ -1,41 +1,42 @@
-package com.salesmanager.shop.store.security;
-
-import org.springframework.security.core.Authentication;
-import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
-import org.springframework.security.web.savedrequest.HttpSessionRequestCache;
-import org.springframework.security.web.savedrequest.RequestCache;
-import org.springframework.security.web.savedrequest.SavedRequest;
-import org.springframework.util.StringUtils;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-public class ServicesAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
-
- private RequestCache requestCache = new HttpSessionRequestCache();
-
- @Override
- public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {
- SavedRequest savedRequest = requestCache.getRequest(request, response);
-
- if (savedRequest == null) {
- clearAuthenticationAttributes(request);
- return;
- }
- String targetUrlParam = getTargetUrlParameter();
- if (isAlwaysUseDefaultTargetUrl() || (targetUrlParam != null && StringUtils.hasText(request.getParameter(targetUrlParam)))) {
- requestCache.removeRequest(request, response);
- clearAuthenticationAttributes(request);
- return;
- }
-
- clearAuthenticationAttributes(request);
- }
-
- public void setRequestCache(RequestCache requestCache) {
- this.requestCache = requestCache;
- }
-
-}
+package com.salesmanager.shop.store.security;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.security.core.Authentication;
+import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
+import org.springframework.security.web.savedrequest.HttpSessionRequestCache;
+import org.springframework.security.web.savedrequest.RequestCache;
+import org.springframework.security.web.savedrequest.SavedRequest;
+import org.springframework.util.StringUtils;
+
+public class ServicesAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
+
+ private RequestCache requestCache = new HttpSessionRequestCache();
+
+ @Override
+ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException {
+ SavedRequest savedRequest = requestCache.getRequest(request, response);
+
+ if (savedRequest == null) {
+ clearAuthenticationAttributes(request);
+ return;
+ }
+ String targetUrlParam = getTargetUrlParameter();
+ if (isAlwaysUseDefaultTargetUrl() || (targetUrlParam != null && StringUtils.hasText(request.getParameter(targetUrlParam)))) {
+ requestCache.removeRequest(request, response);
+ clearAuthenticationAttributes(request);
+ return;
+ }
+
+ clearAuthenticationAttributes(request);
+ }
+
+ public void setRequestCache(RequestCache requestCache) {
+ this.requestCache = requestCache;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/security/SocialCustomerServicesImpl.java b/sm-shop/src/main/java/com/salesmanager/shop/store/security/SocialCustomerServicesImpl.java
new file mode 100644
index 0000000..58950fa
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/security/SocialCustomerServicesImpl.java
@@ -0,0 +1,28 @@
+package com.salesmanager.shop.store.security;
+
+import javax.inject.Inject;
+
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
+
+
+@Service("socialCustomerDetailsService")
+public class SocialCustomerServicesImpl implements UserDetailsService{
+
+ @Inject
+ UserDetailsService customerDetailsService;
+
+ @Override
+ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+ //delegates to Customer fetch service
+ UserDetails userDetails = customerDetailsService.loadUserByUsername(username);
+ if (userDetails == null) {
+ return null;
+ }
+
+ return userDetails;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/security/user/CustomerDetails.java b/sm-shop/src/main/java/com/salesmanager/shop/store/security/user/CustomerDetails.java
new file mode 100644
index 0000000..21dd195
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/security/user/CustomerDetails.java
@@ -0,0 +1,70 @@
+package com.salesmanager.shop.store.security.user;
+
+import java.util.Collection;
+
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.User;
+
+public class CustomerDetails extends User {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private String email;
+ private Long id;
+ private String firstName;
+ private String lastName;
+
+ public CustomerDetails(
+ String username,
+ String password,
+ boolean enabled,
+ boolean accountNonExpired,
+ boolean credentialsNonExpired,
+ boolean accountNonLocked,
+ Collection<? extends GrantedAuthority> authorities) {
+ super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
+ }
+
+ public CustomerDetails(
+ String username,
+ String password,
+ Collection<? extends GrantedAuthority> authorities) {
+ super(username, password, true, true, true, true, authorities);
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/security/user/FacebookSocialUserDetailsService.java b/sm-shop/src/main/java/com/salesmanager/shop/store/security/user/FacebookSocialUserDetailsService.java
new file mode 100644
index 0000000..1525694
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/security/user/FacebookSocialUserDetailsService.java
@@ -0,0 +1,64 @@
+package com.salesmanager.shop.store.security.user;
+
+
+import java.util.Collection;
+
+import javax.inject.Inject;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.social.security.SocialUserDetails;
+import org.springframework.social.security.SocialUserDetailsService;
+import org.springframework.stereotype.Service;
+
+import com.salesmanager.core.business.services.customer.CustomerService;
+import com.salesmanager.core.business.services.user.GroupService;
+import com.salesmanager.core.business.services.user.PermissionService;
+import com.salesmanager.core.model.customer.Customer;
+
+@Service
+public class FacebookSocialUserDetailsService implements SocialUserDetailsService {
+
+
+ @Inject UserDetailsService customerDetailsService;//delegate to current customer
+
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(FacebookSocialUserDetailsService.class);
+
+
+ @Override
+ public SocialUserDetails loadUserByUserId(String userId) throws UsernameNotFoundException {
+
+
+ CustomerDetails userDetails = (CustomerDetails) customerDetailsService.loadUserByUsername(userId);
+
+ if (userDetails == null) {
+ throw new UsernameNotFoundException("No user found with username: " + userId);
+ }
+
+ FacebookTokenUserDetails principal = new FacebookTokenUserDetails(
+ userDetails.getUsername(),
+ userDetails.getPassword(),
+ userDetails.getAuthorities());
+
+ principal.setFirstName(userDetails.getFirstName());
+ principal.setId(String.valueOf(userDetails.getId()));
+ principal.setLastName(userDetails.getLastName());
+
+ LOGGER.debug("Found user details: {}", principal);
+
+ return principal;
+
+ }
+
+
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/security/user/FacebookTokenUserDetails.java b/sm-shop/src/main/java/com/salesmanager/shop/store/security/user/FacebookTokenUserDetails.java
new file mode 100644
index 0000000..d24ea23
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/security/user/FacebookTokenUserDetails.java
@@ -0,0 +1,49 @@
+package com.salesmanager.shop.store.security.user;
+
+import java.util.Collection;
+
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.social.security.SocialUser;
+
+public class FacebookTokenUserDetails extends SocialUser {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private String id;
+ private String firstName;
+ private String lastName;
+
+
+ public FacebookTokenUserDetails(String username, String password,
+ Collection<? extends GrantedAuthority> authorities) {
+ super(username, password, authorities);
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/store/security/user/JWTUser.java b/sm-shop/src/main/java/com/salesmanager/shop/store/security/user/JWTUser.java
new file mode 100644
index 0000000..eb1f705
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/store/security/user/JWTUser.java
@@ -0,0 +1,109 @@
+package com.salesmanager.shop.store.security.user;
+
+import java.util.Collection;
+import java.util.Date;
+
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+
+public class JWTUser implements UserDetails {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private final Long id;
+ private final String username;
+ private final String firstname;
+ private final String lastname;
+ private final String password;
+ private final String email;
+ private final Collection<? extends GrantedAuthority> authorities;
+ private final boolean enabled;
+ private final Date lastPasswordResetDate;
+
+ public JWTUser(
+ Long id,
+ String username,
+ String firstname,
+ String lastname,
+ String email,
+ String password, Collection<? extends GrantedAuthority> authorities,
+ boolean enabled,
+ Date lastPasswordResetDate
+ ) {
+ this.id = id;
+ this.username = username;
+ this.firstname = firstname;
+ this.lastname = lastname;
+ this.email = email;
+ this.password = password;
+ this.authorities = authorities;
+ this.enabled = enabled;
+ this.lastPasswordResetDate = lastPasswordResetDate;
+ }
+
+ @JsonIgnore
+ public Long getId() {
+ return id;
+ }
+
+ @Override
+ public String getUsername() {
+ return username;
+ }
+
+ @JsonIgnore
+ @Override
+ public boolean isAccountNonExpired() {
+ return true;
+ }
+
+ @JsonIgnore
+ @Override
+ public boolean isAccountNonLocked() {
+ return true;
+ }
+
+ @JsonIgnore
+ @Override
+ public boolean isCredentialsNonExpired() {
+ return true;
+ }
+
+ public String getFirstname() {
+ return firstname;
+ }
+
+ public String getLastname() {
+ return lastname;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ @JsonIgnore
+ @Override
+ public String getPassword() {
+ return password;
+ }
+
+ @Override
+ public Collection<? extends GrantedAuthority> getAuthorities() {
+ return authorities;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ @JsonIgnore
+ public Date getLastPasswordResetDate() {
+ return lastPasswordResetDate;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/tags/ActiveLinkTag.java b/sm-shop/src/main/java/com/salesmanager/shop/tags/ActiveLinkTag.java
index 349092a..0f35ba4 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/tags/ActiveLinkTag.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/tags/ActiveLinkTag.java
@@ -1,99 +1,99 @@
-package com.salesmanager.shop.tags;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.tagext.TagSupport;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.salesmanager.shop.constants.Constants;
-
-
-public class ActiveLinkTag extends TagSupport {
-
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private static final Logger LOGGER = LoggerFactory.getLogger(ActiveLinkTag.class);
-
- private final static String ACTIVE = "active";
-
- private String linkCode = null;
- private String activeReturnCode = null;
- private String inactiveReturnCode = null;
-
-
- public int doStartTag() throws JspException {
- try {
-
-
-
- HttpServletRequest request = (HttpServletRequest) pageContext
- .getRequest();
-
- String requestLinkCode = (String)request.getAttribute(Constants.LINK_CODE);
-
- if(StringUtils.isBlank(requestLinkCode)) {
- if(!StringUtils.isBlank(inactiveReturnCode)) {
- pageContext.getOut().print(inactiveReturnCode);
- } else {
- pageContext.getOut().print("");
- }
- } else {
- if(requestLinkCode.equalsIgnoreCase(linkCode)) {
- if(!StringUtils.isBlank(activeReturnCode)) {
- pageContext.getOut().print(activeReturnCode);
- } else {
- pageContext.getOut().print(ACTIVE);
- }
- } else {
- if(!StringUtils.isBlank(inactiveReturnCode)) {
- pageContext.getOut().print(inactiveReturnCode);
- } else {
- pageContext.getOut().print("");
- }
- }
- }
-
-
-
- } catch (Exception ex) {
- LOGGER.error("Error while creating active link", ex);
- }
- return SKIP_BODY;
- }
-
- public int doEndTag() {
- return EVAL_PAGE;
- }
-
- public String getLinkCode() {
- return linkCode;
- }
-
- public void setLinkCode(String linkCode) {
- this.linkCode = linkCode;
- }
-
- public String getActiveReturnCode() {
- return activeReturnCode;
- }
-
- public void setActiveReturnCode(String activeReturnCode) {
- this.activeReturnCode = activeReturnCode;
- }
-
-
-
-
-
-
-
-
-
-
-}
+package com.salesmanager.shop.tags;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.TagSupport;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.salesmanager.shop.constants.Constants;
+
+
+public class ActiveLinkTag extends TagSupport {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private static final Logger LOGGER = LoggerFactory.getLogger(ActiveLinkTag.class);
+
+ private final static String ACTIVE = "active";
+
+ private String linkCode = null;
+ private String activeReturnCode = null;
+ private String inactiveReturnCode = null;
+
+
+ public int doStartTag() throws JspException {
+ try {
+
+
+
+ HttpServletRequest request = (HttpServletRequest) pageContext
+ .getRequest();
+
+ String requestLinkCode = (String)request.getAttribute(Constants.LINK_CODE);
+
+ if(StringUtils.isBlank(requestLinkCode)) {
+ if(!StringUtils.isBlank(inactiveReturnCode)) {
+ pageContext.getOut().print(inactiveReturnCode);
+ } else {
+ pageContext.getOut().print("");
+ }
+ } else {
+ if(requestLinkCode.equalsIgnoreCase(linkCode)) {
+ if(!StringUtils.isBlank(activeReturnCode)) {
+ pageContext.getOut().print(activeReturnCode);
+ } else {
+ pageContext.getOut().print(ACTIVE);
+ }
+ } else {
+ if(!StringUtils.isBlank(inactiveReturnCode)) {
+ pageContext.getOut().print(inactiveReturnCode);
+ } else {
+ pageContext.getOut().print("");
+ }
+ }
+ }
+
+
+
+ } catch (Exception ex) {
+ LOGGER.error("Error while creating active link", ex);
+ }
+ return SKIP_BODY;
+ }
+
+ public int doEndTag() {
+ return EVAL_PAGE;
+ }
+
+ public String getLinkCode() {
+ return linkCode;
+ }
+
+ public void setLinkCode(String linkCode) {
+ this.linkCode = linkCode;
+ }
+
+ public String getActiveReturnCode() {
+ return activeReturnCode;
+ }
+
+ public void setActiveReturnCode(String activeReturnCode) {
+ this.activeReturnCode = activeReturnCode;
+ }
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/tags/AdminProductDownloadUrlTag.java b/sm-shop/src/main/java/com/salesmanager/shop/tags/AdminProductDownloadUrlTag.java
index cfdb9e6..940fa1a 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/tags/AdminProductDownloadUrlTag.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/tags/AdminProductDownloadUrlTag.java
@@ -1,112 +1,112 @@
-package com.salesmanager.shop.tags;
-
-import java.util.Map;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-import javax.servlet.jsp.JspException;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
-import org.springframework.web.context.WebApplicationContext;
-import org.springframework.web.servlet.tags.RequestContextAwareTag;
-
-import com.salesmanager.core.model.catalog.product.file.DigitalProduct;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.utils.FilePathUtils;
-
-
-
-public class AdminProductDownloadUrlTag extends RequestContextAwareTag {
-
-
- /**
- *
- */
- private static final long serialVersionUID = 6319855234657139862L;
-
- private static final Logger LOGGER = LoggerFactory.getLogger(AdminProductDownloadUrlTag.class);
-
- private DigitalProduct digitalProduct;
-
- @Inject
- private FilePathUtils filePathUtils;
-
-
-
-
- public DigitalProduct getDigitalProduct() {
- return digitalProduct;
- }
-
- public void setDigitalProduct(DigitalProduct digitalProduct) {
- this.digitalProduct = digitalProduct;
- }
-
- public int doStartTagInternal() throws JspException {
- try {
-
- if (filePathUtils==null) {
- WebApplicationContext wac = getRequestContext().getWebApplicationContext();
- AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory();
- factory.autowireBean(this);
- }
-
-
- HttpServletRequest request = (HttpServletRequest) pageContext
- .getRequest();
-
- MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- HttpSession session = request.getSession();
-
- StringBuilder filePath = new StringBuilder();
-
- //TODO domain from merchant, else from global config, else from property (localhost)
-
- // example -> "/files/{storeCode}/{fileName}.{extension}"
-
-
- @SuppressWarnings("unchecked")
- Map<String,String> configurations = (Map<String, String>)session.getAttribute(Constants.STORE_CONFIGURATION);
- String scheme = Constants.HTTP_SCHEME;
- if(configurations!=null) {
- scheme = (String)configurations.get("scheme");
- }
-
-
-
- filePath.append(scheme).append("://")
- .append(merchantStore.getDomainName())
- //.append("/")
- .append(request.getContextPath());
-
- filePath
- .append(filePathUtils.buildAdminDownloadProductFilePath(merchantStore, digitalProduct)).toString();
-
-
-
- pageContext.getOut().print(filePath.toString());
-
-
-
- } catch (Exception ex) {
- LOGGER.error("Error while getting content url", ex);
- }
- return SKIP_BODY;
- }
-
- public int doEndTag() {
- return EVAL_PAGE;
- }
-
-
-
-
-
-
-
-}
+package com.salesmanager.shop.tags;
+
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import javax.servlet.jsp.JspException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.servlet.tags.RequestContextAwareTag;
+
+import com.salesmanager.core.model.catalog.product.file.DigitalProduct;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.utils.FilePathUtils;
+
+
+
+public class AdminProductDownloadUrlTag extends RequestContextAwareTag {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 6319855234657139862L;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(AdminProductDownloadUrlTag.class);
+
+ private DigitalProduct digitalProduct;
+
+ @Inject
+ private FilePathUtils filePathUtils;
+
+
+
+
+ public DigitalProduct getDigitalProduct() {
+ return digitalProduct;
+ }
+
+ public void setDigitalProduct(DigitalProduct digitalProduct) {
+ this.digitalProduct = digitalProduct;
+ }
+
+ public int doStartTagInternal() throws JspException {
+ try {
+
+ if (filePathUtils==null) {
+ WebApplicationContext wac = getRequestContext().getWebApplicationContext();
+ AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory();
+ factory.autowireBean(this);
+ }
+
+
+ HttpServletRequest request = (HttpServletRequest) pageContext
+ .getRequest();
+
+ MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ HttpSession session = request.getSession();
+
+ StringBuilder filePath = new StringBuilder();
+
+ //TODO domain from merchant, else from global config, else from property (localhost)
+
+ // example -> "/files/{storeCode}/{fileName}.{extension}"
+
+
+ @SuppressWarnings("unchecked")
+ Map<String,String> configurations = (Map<String, String>)session.getAttribute(Constants.STORE_CONFIGURATION);
+ String scheme = Constants.HTTP_SCHEME;
+ if(configurations!=null) {
+ scheme = (String)configurations.get("scheme");
+ }
+
+
+
+ filePath.append(scheme).append("://")
+ .append(merchantStore.getDomainName())
+ //.append("/")
+ .append(request.getContextPath());
+
+ filePath
+ .append(filePathUtils.buildAdminDownloadProductFilePath(merchantStore, digitalProduct)).toString();
+
+
+
+ pageContext.getOut().print(filePath.toString());
+
+
+
+ } catch (Exception ex) {
+ LOGGER.error("Error while getting content url", ex);
+ }
+ return SKIP_BODY;
+ }
+
+ public int doEndTag() {
+ return EVAL_PAGE;
+ }
+
+
+
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/tags/ConfigurationTag.java b/sm-shop/src/main/java/com/salesmanager/shop/tags/ConfigurationTag.java
index 37cda2e..db41571 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/tags/ConfigurationTag.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/tags/ConfigurationTag.java
@@ -1,78 +1,78 @@
-package com.salesmanager.shop.tags;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.jsp.JspException;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
-import org.springframework.web.context.WebApplicationContext;
-import org.springframework.web.servlet.tags.RequestContextAwareTag;
-
-import com.salesmanager.core.business.utils.CoreConfiguration;
-
-
-public class ConfigurationTag extends RequestContextAwareTag {
-
-
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private static final Logger LOGGER = LoggerFactory.getLogger(ConfigurationTag.class);
-
-
- @Inject
- private CoreConfiguration coreConfiguration;
-
- private String configurationCode;
-
-
- public int doStartTagInternal() throws JspException {
- try {
-
- if (coreConfiguration==null) {
- WebApplicationContext wac = getRequestContext().getWebApplicationContext();
- AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory();
- factory.autowireBean(this);
- }
-
- HttpServletRequest request = (HttpServletRequest) pageContext
- .getRequest();
-
-
- pageContext.getOut().print(coreConfiguration.getProperty(this.getConfigurationCode(), "property " + getConfigurationCode() + " not found"));
-
-
-
- } catch (Exception ex) {
- LOGGER.error("Error while getting content url", ex);
- }
- return SKIP_BODY;
- }
-
- public int doEndTag() {
- return EVAL_PAGE;
- }
-
- public String getConfigurationCode() {
- return configurationCode;
- }
-
- public void setConfigurationCode(String configurationCode) {
- this.configurationCode = configurationCode;
- }
-
-
-
-
-
-
-
-
-
-
-
-}
+package com.salesmanager.shop.tags;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.jsp.JspException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.servlet.tags.RequestContextAwareTag;
+
+import com.salesmanager.core.business.utils.CoreConfiguration;
+
+
+public class ConfigurationTag extends RequestContextAwareTag {
+
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+ private static final Logger LOGGER = LoggerFactory.getLogger(ConfigurationTag.class);
+
+
+ @Inject
+ private CoreConfiguration coreConfiguration;
+
+ private String configurationCode;
+
+
+ public int doStartTagInternal() throws JspException {
+ try {
+
+ if (coreConfiguration==null) {
+ WebApplicationContext wac = getRequestContext().getWebApplicationContext();
+ AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory();
+ factory.autowireBean(this);
+ }
+
+ HttpServletRequest request = (HttpServletRequest) pageContext
+ .getRequest();
+
+
+ pageContext.getOut().print(coreConfiguration.getProperty(this.getConfigurationCode(), "property " + getConfigurationCode() + " not found"));
+
+
+
+ } catch (Exception ex) {
+ LOGGER.error("Error while getting content url", ex);
+ }
+ return SKIP_BODY;
+ }
+
+ public int doEndTag() {
+ return EVAL_PAGE;
+ }
+
+ public String getConfigurationCode() {
+ return configurationCode;
+ }
+
+ public void setConfigurationCode(String configurationCode) {
+ this.configurationCode = configurationCode;
+ }
+
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/tags/ContentImageUrlTag.java b/sm-shop/src/main/java/com/salesmanager/shop/tags/ContentImageUrlTag.java
index 99f619a..c8097c6 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/tags/ContentImageUrlTag.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/tags/ContentImageUrlTag.java
@@ -1,103 +1,103 @@
-package com.salesmanager.shop.tags;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.jsp.JspException;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
-import org.springframework.web.context.WebApplicationContext;
-import org.springframework.web.servlet.tags.RequestContextAwareTag;
-
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.utils.FilePathUtils;
-import com.salesmanager.shop.utils.ImageFilePath;
-
-
-public class ContentImageUrlTag extends RequestContextAwareTag {
-
-
- /**
- *
- */
- private static final long serialVersionUID = 6319855234657139862L;
- private static final Logger LOGGER = LoggerFactory.getLogger(ContentImageUrlTag.class);
-
- private MerchantStore merchantStore;
- private String imageName;
- private String imageType;
-
- @Inject
- private FilePathUtils filePathUtils;
-
- @Inject
- @Qualifier("img")
- private ImageFilePath imageUtils;
-
-
- public int doStartTagInternal() throws JspException {
- try {
-
-
- if (filePathUtils==null || imageUtils==null) {
- WebApplicationContext wac = getRequestContext().getWebApplicationContext();
- AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory();
- factory.autowireBean(this);
- }
-
- HttpServletRequest request = (HttpServletRequest) pageContext
- .getRequest();
-
- MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- if(this.getMerchantStore()!=null) {
- merchantStore = this.getMerchantStore();
- }
-
- String img = imageUtils.buildStaticImageUtils(merchantStore,this.getImageType(),this.getImageName());
-
- pageContext.getOut().print(img);
-
-
-
- } catch (Exception ex) {
- LOGGER.error("Error while getting content url", ex);
- }
- return SKIP_BODY;
- }
-
- public int doEndTag() {
- return EVAL_PAGE;
- }
-
- public void setMerchantStore(MerchantStore merchantStore) {
- this.merchantStore = merchantStore;
- }
-
- public MerchantStore getMerchantStore() {
- return merchantStore;
- }
-
- public void setImageName(String imageName) {
- this.imageName = imageName;
- }
-
- public String getImageName() {
- return imageName;
- }
-
- public void setImageType(String imageType) {
- this.imageType = imageType;
- }
-
- public String getImageType() {
- return imageType;
- }
-
-
-
-
-
-}
+package com.salesmanager.shop.tags;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.jsp.JspException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.servlet.tags.RequestContextAwareTag;
+
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.utils.FilePathUtils;
+import com.salesmanager.shop.utils.ImageFilePath;
+
+
+public class ContentImageUrlTag extends RequestContextAwareTag {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 6319855234657139862L;
+ private static final Logger LOGGER = LoggerFactory.getLogger(ContentImageUrlTag.class);
+
+ private MerchantStore merchantStore;
+ private String imageName;
+ private String imageType;
+
+ @Inject
+ private FilePathUtils filePathUtils;
+
+ @Inject
+ @Qualifier("img")
+ private ImageFilePath imageUtils;
+
+
+ public int doStartTagInternal() throws JspException {
+ try {
+
+
+ if (filePathUtils==null || imageUtils==null) {
+ WebApplicationContext wac = getRequestContext().getWebApplicationContext();
+ AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory();
+ factory.autowireBean(this);
+ }
+
+ HttpServletRequest request = (HttpServletRequest) pageContext
+ .getRequest();
+
+ MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ if(this.getMerchantStore()!=null) {
+ merchantStore = this.getMerchantStore();
+ }
+
+ String img = imageUtils.buildStaticImageUtils(merchantStore,this.getImageType(),this.getImageName());
+
+ pageContext.getOut().print(img);
+
+
+
+ } catch (Exception ex) {
+ LOGGER.error("Error while getting content url", ex);
+ }
+ return SKIP_BODY;
+ }
+
+ public int doEndTag() {
+ return EVAL_PAGE;
+ }
+
+ public void setMerchantStore(MerchantStore merchantStore) {
+ this.merchantStore = merchantStore;
+ }
+
+ public MerchantStore getMerchantStore() {
+ return merchantStore;
+ }
+
+ public void setImageName(String imageName) {
+ this.imageName = imageName;
+ }
+
+ public String getImageName() {
+ return imageName;
+ }
+
+ public void setImageType(String imageType) {
+ this.imageType = imageType;
+ }
+
+ public String getImageType() {
+ return imageType;
+ }
+
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/tags/ManufacturerImageUrlTag.java b/sm-shop/src/main/java/com/salesmanager/shop/tags/ManufacturerImageUrlTag.java
index 34a5f53..4e7be54 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/tags/ManufacturerImageUrlTag.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/tags/ManufacturerImageUrlTag.java
@@ -1,106 +1,106 @@
-package com.salesmanager.shop.tags;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.jsp.JspException;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
-import org.springframework.web.context.WebApplicationContext;
-import org.springframework.web.servlet.tags.RequestContextAwareTag;
-
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.model.catalog.manufacturer.Manufacturer;
-import com.salesmanager.shop.utils.FilePathUtils;
-import com.salesmanager.shop.utils.ImageFilePath;
-
-
-
-public class ManufacturerImageUrlTag extends RequestContextAwareTag {
-
-
- /**
- *
- */
- private static final long serialVersionUID = 6319855234657139862L;
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ManufacturerImageUrlTag.class);
-
-
- private String imageName;
- private String imageType;
- private Manufacturer manufacturer;
-
- @Inject
- private FilePathUtils filePathUtils;
-
-
- @Inject
- @Qualifier("img")
- private ImageFilePath imageUtils;
-
- public int doStartTagInternal() throws JspException {
- try {
-
- if (filePathUtils==null || imageUtils==null) {
- WebApplicationContext wac = getRequestContext().getWebApplicationContext();
- AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory();
- factory.autowireBean(this);
- }
-
-
- HttpServletRequest request = (HttpServletRequest) pageContext
- .getRequest();
-
- MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- StringBuilder imagePath = new StringBuilder();
-
- String baseUrl = filePathUtils.buildStoreUri(merchantStore, request);
- imagePath.append(baseUrl);
-
- pageContext.getOut().print(imagePath.toString());
-
-
-
- } catch (Exception ex) {
- LOGGER.error("Error while getting content url", ex);
- }
- return SKIP_BODY;
- }
-
- public int doEndTag() {
- return EVAL_PAGE;
- }
-
-
- public void setImageName(String imageName) {
- this.imageName = imageName;
- }
-
- public String getImageName() {
- return imageName;
- }
-
- public void setImageType(String imageType) {
- this.imageType = imageType;
- }
-
- public String getImageType() {
- return imageType;
- }
-
- public Manufacturer getManufacturer() {
- return manufacturer;
- }
-
- public void setManufacturer(Manufacturer manufacturer) {
- this.manufacturer = manufacturer;
- }
-
-
-
-}
+package com.salesmanager.shop.tags;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.jsp.JspException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.servlet.tags.RequestContextAwareTag;
+
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.model.catalog.manufacturer.Manufacturer;
+import com.salesmanager.shop.utils.FilePathUtils;
+import com.salesmanager.shop.utils.ImageFilePath;
+
+
+
+public class ManufacturerImageUrlTag extends RequestContextAwareTag {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 6319855234657139862L;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ManufacturerImageUrlTag.class);
+
+
+ private String imageName;
+ private String imageType;
+ private Manufacturer manufacturer;
+
+ @Inject
+ private FilePathUtils filePathUtils;
+
+
+ @Inject
+ @Qualifier("img")
+ private ImageFilePath imageUtils;
+
+ public int doStartTagInternal() throws JspException {
+ try {
+
+ if (filePathUtils==null || imageUtils==null) {
+ WebApplicationContext wac = getRequestContext().getWebApplicationContext();
+ AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory();
+ factory.autowireBean(this);
+ }
+
+
+ HttpServletRequest request = (HttpServletRequest) pageContext
+ .getRequest();
+
+ MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ StringBuilder imagePath = new StringBuilder();
+
+ String baseUrl = filePathUtils.buildStoreUri(merchantStore, request);
+ imagePath.append(baseUrl);
+
+ pageContext.getOut().print(imagePath.toString());
+
+
+
+ } catch (Exception ex) {
+ LOGGER.error("Error while getting content url", ex);
+ }
+ return SKIP_BODY;
+ }
+
+ public int doEndTag() {
+ return EVAL_PAGE;
+ }
+
+
+ public void setImageName(String imageName) {
+ this.imageName = imageName;
+ }
+
+ public String getImageName() {
+ return imageName;
+ }
+
+ public void setImageType(String imageType) {
+ this.imageType = imageType;
+ }
+
+ public String getImageType() {
+ return imageType;
+ }
+
+ public Manufacturer getManufacturer() {
+ return manufacturer;
+ }
+
+ public void setManufacturer(Manufacturer manufacturer) {
+ this.manufacturer = manufacturer;
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/tags/OrderProductDownloadUrlTag.java b/sm-shop/src/main/java/com/salesmanager/shop/tags/OrderProductDownloadUrlTag.java
index 344154b..294da26 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/tags/OrderProductDownloadUrlTag.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/tags/OrderProductDownloadUrlTag.java
@@ -1,102 +1,102 @@
-package com.salesmanager.shop.tags;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.jsp.JspException;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
-import org.springframework.web.context.WebApplicationContext;
-import org.springframework.web.servlet.tags.RequestContextAwareTag;
-
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.model.order.ReadableOrderProductDownload;
-import com.salesmanager.shop.utils.FilePathUtils;
-
-
-public class OrderProductDownloadUrlTag extends RequestContextAwareTag {
-
-
- /**
- *
- */
- private static final long serialVersionUID = 6319855234657139862L;
-
- private static final Logger LOGGER = LoggerFactory.getLogger(OrderProductDownloadUrlTag.class);
-
-
- private ReadableOrderProductDownload productDownload;
-
- private Long orderId;
-
- @Inject
- private FilePathUtils filePathUtils;
-
-
-
-
- public int doStartTagInternal() throws JspException {
- try {
-
- if (filePathUtils==null) {
- WebApplicationContext wac = getRequestContext().getWebApplicationContext();
- AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory();
- factory.autowireBean(this);
- }
-
-
- HttpServletRequest request = (HttpServletRequest) pageContext
- .getRequest();
-
- MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
-
- StringBuilder filePath = new StringBuilder();
-
- filePath.append(filePathUtils.buildStoreUri(merchantStore,request));
-
- filePath
- .append(filePathUtils.buildOrderDownloadProductFilePath(merchantStore, this.getProductDownload(), this.getOrderId())).toString();
-
-
-
- pageContext.getOut().print(filePath.toString());
-
-
-
- } catch (Exception ex) {
- LOGGER.error("Error while getting order product download url", ex);
- }
- return SKIP_BODY;
- }
-
- public int doEndTag() {
- return EVAL_PAGE;
- }
-
-
-
- public Long getOrderId() {
- return orderId;
- }
-
- public void setOrderId(Long orderId) {
- this.orderId = orderId;
- }
-
- public ReadableOrderProductDownload getProductDownload() {
- return productDownload;
- }
-
- public void setProductDownload(ReadableOrderProductDownload productDownload) {
- this.productDownload = productDownload;
- }
-
-
-
-
-
-
-
-}
+package com.salesmanager.shop.tags;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.jsp.JspException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.servlet.tags.RequestContextAwareTag;
+
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.model.order.ReadableOrderProductDownload;
+import com.salesmanager.shop.utils.FilePathUtils;
+
+
+public class OrderProductDownloadUrlTag extends RequestContextAwareTag {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 6319855234657139862L;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(OrderProductDownloadUrlTag.class);
+
+
+ private ReadableOrderProductDownload productDownload;
+
+ private Long orderId;
+
+ @Inject
+ private FilePathUtils filePathUtils;
+
+
+
+
+ public int doStartTagInternal() throws JspException {
+ try {
+
+ if (filePathUtils==null) {
+ WebApplicationContext wac = getRequestContext().getWebApplicationContext();
+ AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory();
+ factory.autowireBean(this);
+ }
+
+
+ HttpServletRequest request = (HttpServletRequest) pageContext
+ .getRequest();
+
+ MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+
+ StringBuilder filePath = new StringBuilder();
+
+ filePath.append(filePathUtils.buildStoreUri(merchantStore,request));
+
+ filePath
+ .append(filePathUtils.buildOrderDownloadProductFilePath(merchantStore, this.getProductDownload(), this.getOrderId())).toString();
+
+
+
+ pageContext.getOut().print(filePath.toString());
+
+
+
+ } catch (Exception ex) {
+ LOGGER.error("Error while getting order product download url", ex);
+ }
+ return SKIP_BODY;
+ }
+
+ public int doEndTag() {
+ return EVAL_PAGE;
+ }
+
+
+
+ public Long getOrderId() {
+ return orderId;
+ }
+
+ public void setOrderId(Long orderId) {
+ this.orderId = orderId;
+ }
+
+ public ReadableOrderProductDownload getProductDownload() {
+ return productDownload;
+ }
+
+ public void setProductDownload(ReadableOrderProductDownload productDownload) {
+ this.productDownload = productDownload;
+ }
+
+
+
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/tags/PageContentTag.java b/sm-shop/src/main/java/com/salesmanager/shop/tags/PageContentTag.java
index edc77ac..d2f1603 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/tags/PageContentTag.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/tags/PageContentTag.java
@@ -1,91 +1,91 @@
-package com.salesmanager.shop.tags;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
-import org.springframework.web.context.WebApplicationContext;
-import org.springframework.web.servlet.tags.RequestContextAwareTag;
-
-import com.salesmanager.core.business.services.content.ContentService;
-import com.salesmanager.core.model.content.Content;
-import com.salesmanager.core.model.content.ContentDescription;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.constants.Constants;
-
-
-public class PageContentTag extends RequestContextAwareTag {
-
-
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- private static final Logger LOGGER = LoggerFactory.getLogger(PageContentTag.class);
-
-
- @Inject
- private ContentService contentService;
-
- private String contentCode;
-
-
-
-
- public String getContentCode() {
- return contentCode;
- }
-
-
- public void setContentCode(String contentCode) {
- this.contentCode = contentCode;
- }
-
-
- @Override
- protected int doStartTagInternal() throws Exception {
- if (contentService == null || contentService==null) {
- LOGGER.debug("Autowiring contentService");
- WebApplicationContext wac = getRequestContext().getWebApplicationContext();
- AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory();
- factory.autowireBean(this);
- }
-
- HttpServletRequest request = (HttpServletRequest) pageContext
- .getRequest();
-
- Language language = (Language)request.getAttribute(Constants.LANGUAGE);
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
-
- Content content = contentService.getByCode(contentCode, store, language);
-
- String pageContent = "";
- if(content!=null) {
- ContentDescription description = content.getDescription();
- if(description != null) {
- pageContent = description.getDescription();
- }
- }
-
-
- pageContext.getOut().print(pageContent);
-
- return SKIP_BODY;
-
- }
-
-
- public int doEndTag() {
- return EVAL_PAGE;
- }
-
-
-
-
-}
+package com.salesmanager.shop.tags;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.servlet.tags.RequestContextAwareTag;
+
+import com.salesmanager.core.business.services.content.ContentService;
+import com.salesmanager.core.model.content.Content;
+import com.salesmanager.core.model.content.ContentDescription;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.constants.Constants;
+
+
+public class PageContentTag extends RequestContextAwareTag {
+
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(PageContentTag.class);
+
+
+ @Inject
+ private ContentService contentService;
+
+ private String contentCode;
+
+
+
+
+ public String getContentCode() {
+ return contentCode;
+ }
+
+
+ public void setContentCode(String contentCode) {
+ this.contentCode = contentCode;
+ }
+
+
+ @Override
+ protected int doStartTagInternal() throws Exception {
+ if (contentService == null || contentService==null) {
+ LOGGER.debug("Autowiring contentService");
+ WebApplicationContext wac = getRequestContext().getWebApplicationContext();
+ AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory();
+ factory.autowireBean(this);
+ }
+
+ HttpServletRequest request = (HttpServletRequest) pageContext
+ .getRequest();
+
+ Language language = (Language)request.getAttribute(Constants.LANGUAGE);
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+
+ Content content = contentService.getByCode(contentCode, store, language);
+
+ String pageContent = "";
+ if(content!=null) {
+ ContentDescription description = content.getDescription();
+ if(description != null) {
+ pageContent = description.getDescription();
+ }
+ }
+
+
+ pageContext.getOut().print(pageContent);
+
+ return SKIP_BODY;
+
+ }
+
+
+ public int doEndTag() {
+ return EVAL_PAGE;
+ }
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/tags/ProductDescriptionUrlTag.java b/sm-shop/src/main/java/com/salesmanager/shop/tags/ProductDescriptionUrlTag.java
index 372f869..44b1dea 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/tags/ProductDescriptionUrlTag.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/tags/ProductDescriptionUrlTag.java
@@ -1,101 +1,101 @@
-package com.salesmanager.shop.tags;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.jsp.JspException;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
-import org.springframework.web.context.WebApplicationContext;
-import org.springframework.web.servlet.tags.RequestContextAwareTag;
-
-import com.salesmanager.core.model.catalog.product.description.ProductDescription;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.utils.FilePathUtils;
-
-
-public class ProductDescriptionUrlTag extends RequestContextAwareTag {
-
-
- /**
- *
- */
- private static final long serialVersionUID = 6319855234657139862L;
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ProductDescriptionUrlTag.class);
-
-
-
- private ProductDescription productDescription;
-
- @Inject
- private FilePathUtils filePathUtils;
-
- /**
- * Created the product url for the store front
- */
- public int doStartTagInternal() throws JspException {
- try {
-
- if (filePathUtils==null) {
- WebApplicationContext wac = getRequestContext().getWebApplicationContext();
- AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory();
- factory.autowireBean(this);
- }
-
- HttpServletRequest request = (HttpServletRequest) pageContext
- .getRequest();
-
- MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
- //*** IF USED FROM ADMIN THE STORE WILL BE NULL, THEN TRY TO USE ADMIN STORE
- if(merchantStore==null) {
- merchantStore = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
- }
-
-
- StringBuilder productPath = new StringBuilder();
-
- String baseUrl = filePathUtils.buildStoreUri(merchantStore, request);
- productPath.append(baseUrl);
-
- if(!StringUtils.isBlank(this.getProductDescription().getSeUrl())) {
- productPath.append(Constants.PRODUCT_URI).append("/");
- productPath.append(this.getProductDescription().getSeUrl());
- } else {
- productPath.append(Constants.PRODUCT_ID_URI).append("/");
- productPath.append(this.getProductDescription().getProduct().getSku());
- }
-
- productPath.append(Constants.URL_EXTENSION);
-
-
-
- pageContext.getOut().print(productPath.toString());
-
-
-
- } catch (Exception ex) {
- LOGGER.error("Error while getting content url", ex);
- }
- return SKIP_BODY;
- }
-
- public int doEndTag() {
- return EVAL_PAGE;
- }
-
- public void setProductDescription(ProductDescription productDescription) {
- this.productDescription = productDescription;
- }
-
- public ProductDescription getProductDescription() {
- return productDescription;
- }
-
-
-
-
-}
+package com.salesmanager.shop.tags;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.jsp.JspException;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.servlet.tags.RequestContextAwareTag;
+
+import com.salesmanager.core.model.catalog.product.description.ProductDescription;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.utils.FilePathUtils;
+
+
+public class ProductDescriptionUrlTag extends RequestContextAwareTag {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 6319855234657139862L;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ProductDescriptionUrlTag.class);
+
+
+
+ private ProductDescription productDescription;
+
+ @Inject
+ private FilePathUtils filePathUtils;
+
+ /**
+ * Created the product url for the store front
+ */
+ public int doStartTagInternal() throws JspException {
+ try {
+
+ if (filePathUtils==null) {
+ WebApplicationContext wac = getRequestContext().getWebApplicationContext();
+ AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory();
+ factory.autowireBean(this);
+ }
+
+ HttpServletRequest request = (HttpServletRequest) pageContext
+ .getRequest();
+
+ MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+ //*** IF USED FROM ADMIN THE STORE WILL BE NULL, THEN TRY TO USE ADMIN STORE
+ if(merchantStore==null) {
+ merchantStore = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+ }
+
+
+ StringBuilder productPath = new StringBuilder();
+
+ String baseUrl = filePathUtils.buildStoreUri(merchantStore, request);
+ productPath.append(baseUrl);
+
+ if(!StringUtils.isBlank(this.getProductDescription().getSeUrl())) {
+ productPath.append(Constants.PRODUCT_URI).append("/");
+ productPath.append(this.getProductDescription().getSeUrl());
+ } else {
+ productPath.append(Constants.PRODUCT_ID_URI).append("/");
+ productPath.append(this.getProductDescription().getProduct().getSku());
+ }
+
+ productPath.append(Constants.URL_EXTENSION);
+
+
+
+ pageContext.getOut().print(productPath.toString());
+
+
+
+ } catch (Exception ex) {
+ LOGGER.error("Error while getting content url", ex);
+ }
+ return SKIP_BODY;
+ }
+
+ public int doEndTag() {
+ return EVAL_PAGE;
+ }
+
+ public void setProductDescription(ProductDescription productDescription) {
+ this.productDescription = productDescription;
+ }
+
+ public ProductDescription getProductDescription() {
+ return productDescription;
+ }
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/tags/ProductImageUrlTag.java b/sm-shop/src/main/java/com/salesmanager/shop/tags/ProductImageUrlTag.java
index a77d04b..40a0781 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/tags/ProductImageUrlTag.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/tags/ProductImageUrlTag.java
@@ -1,112 +1,112 @@
-package com.salesmanager.shop.tags;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.jsp.JspException;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
-import org.springframework.web.context.WebApplicationContext;
-import org.springframework.web.servlet.tags.RequestContextAwareTag;
-
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.utils.FilePathUtils;
-import com.salesmanager.shop.utils.ImageFilePath;
-
-public class ProductImageUrlTag extends RequestContextAwareTag {
-
-
- /**
- *
- */
- private static final long serialVersionUID = 6319855234657139862L;
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ProductImageUrlTag.class);
-
-
- private String imageName;
- private String imageType;
- private Product product;
-
- @Inject
- private FilePathUtils filePathUtils;
-
- @Inject
- @Qualifier("img")
- private ImageFilePath imageUtils;
-
- public int doStartTagInternal() throws JspException {
- try {
-
-
- if (filePathUtils==null || imageUtils==null) {
- WebApplicationContext wac = getRequestContext().getWebApplicationContext();
- AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory();
- factory.autowireBean(this);
- }
-
- HttpServletRequest request = (HttpServletRequest) pageContext
- .getRequest();
-
- MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
-
- StringBuilder imagePath = new StringBuilder();
-
- String baseUrl = filePathUtils.buildRelativeStoreUri(request, merchantStore);
- imagePath.append(baseUrl);
-
- imagePath
-
- .append(imageUtils.buildProductImageUtils(merchantStore, product, this.getImageName())).toString();
-
- System.out.println("Printing image " + imagePath.toString());
-
- pageContext.getOut().print(imagePath.toString());
-
-
-
- } catch (Exception ex) {
- LOGGER.error("Error while getting content url", ex);
- }
- return SKIP_BODY;
- }
-
- public int doEndTag() {
- return EVAL_PAGE;
- }
-
-
- public void setImageName(String imageName) {
- this.imageName = imageName;
- }
-
- public String getImageName() {
- return imageName;
- }
-
- public void setImageType(String imageType) {
- this.imageType = imageType;
- }
-
- public String getImageType() {
- return imageType;
- }
-
- public void setProduct(Product product) {
- this.product = product;
- }
-
- public Product getProduct() {
- return product;
- }
-
-
-
-
-
-
-}
+package com.salesmanager.shop.tags;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.jsp.JspException;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.servlet.tags.RequestContextAwareTag;
+
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.utils.FilePathUtils;
+import com.salesmanager.shop.utils.ImageFilePath;
+
+public class ProductImageUrlTag extends RequestContextAwareTag {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 6319855234657139862L;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ProductImageUrlTag.class);
+
+
+ private String imageName;
+ private String imageType;
+ private Product product;
+
+ @Inject
+ private FilePathUtils filePathUtils;
+
+ @Inject
+ @Qualifier("img")
+ private ImageFilePath imageUtils;
+
+ public int doStartTagInternal() throws JspException {
+ try {
+
+
+ if (filePathUtils==null || imageUtils==null) {
+ WebApplicationContext wac = getRequestContext().getWebApplicationContext();
+ AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory();
+ factory.autowireBean(this);
+ }
+
+ HttpServletRequest request = (HttpServletRequest) pageContext
+ .getRequest();
+
+ MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
+
+ StringBuilder imagePath = new StringBuilder();
+
+ String baseUrl = filePathUtils.buildRelativeStoreUri(request, merchantStore);
+ imagePath.append(baseUrl);
+
+ imagePath
+
+ .append(imageUtils.buildProductImageUtils(merchantStore, product, this.getImageName())).toString();
+
+ System.out.println("Printing image " + imagePath.toString());
+
+ pageContext.getOut().print(imagePath.toString());
+
+
+
+ } catch (Exception ex) {
+ LOGGER.error("Error while getting content url", ex);
+ }
+ return SKIP_BODY;
+ }
+
+ public int doEndTag() {
+ return EVAL_PAGE;
+ }
+
+
+ public void setImageName(String imageName) {
+ this.imageName = imageName;
+ }
+
+ public String getImageName() {
+ return imageName;
+ }
+
+ public void setImageType(String imageType) {
+ this.imageType = imageType;
+ }
+
+ public String getImageType() {
+ return imageType;
+ }
+
+ public void setProduct(Product product) {
+ this.product = product;
+ }
+
+ public Product getProduct() {
+ return product;
+ }
+
+
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/tags/ShopProductImageUrlTag.java b/sm-shop/src/main/java/com/salesmanager/shop/tags/ShopProductImageUrlTag.java
index b2a3754..16d69c8 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/tags/ShopProductImageUrlTag.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/tags/ShopProductImageUrlTag.java
@@ -1,120 +1,120 @@
-package com.salesmanager.shop.tags;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.jsp.JspException;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
-import org.springframework.web.context.WebApplicationContext;
-import org.springframework.web.servlet.tags.RequestContextAwareTag;
-
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.utils.FilePathUtils;
-import com.salesmanager.shop.utils.ImageFilePath;
-
-
-
-public class ShopProductImageUrlTag extends RequestContextAwareTag {
-
-
- /**
- *
- */
- private static final long serialVersionUID = 6319855234657139862L;
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ShopProductImageUrlTag.class);
-
- private final static String SMALL = "SMALL";
- private final static String LARGE = "LARGE";
-
- private String imageName;
- private String sku;
- private String size; //SMALL | LARGE
-
- @Inject
- private FilePathUtils filePathUtils;
-
- @Inject
- @Qualifier("img")
- private ImageFilePath imageUtils;
-
- public int doStartTagInternal() throws JspException {
- try {
-
- if (filePathUtils==null || imageUtils==null) {
- WebApplicationContext wac = getRequestContext().getWebApplicationContext();
- AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory();
- factory.autowireBean(this);
- }
-
- HttpServletRequest request = (HttpServletRequest) pageContext
- .getRequest();
-
- MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
-
- StringBuilder imagePath = new StringBuilder();
-
- String baseUrl = filePathUtils.buildRelativeStoreUri(request, merchantStore);
- imagePath.append(baseUrl);
-
- if(StringUtils.isBlank(this.getSize()) || this.getSize().equals(SMALL)) {
- imagePath.append(imageUtils.buildProductImageUtils(merchantStore, this.getSku(), this.getImageName())).toString();
- } else {
- imagePath.append(imageUtils.buildLargeProductImageUtils(merchantStore, this.getSku(), this.getImageName())).toString();
- }
-
- //System.out.println("Printing image -M " + imagePath.toString());
-
- pageContext.getOut().print(imagePath.toString());
-
-
-
- } catch (Exception ex) {
- LOGGER.error("Error while getting content url", ex);
- }
- return SKIP_BODY;
- }
-
-
- public int doEndTag() {
- return EVAL_PAGE;
- }
-
-
- public void setImageName(String imageName) {
- this.imageName = imageName;
- }
-
- public String getImageName() {
- return imageName;
- }
-
-
-
- public void setSku(String sku) {
- this.sku = sku;
- }
-
- public String getSku() {
- return sku;
- }
-
- public String getSize() {
- return size;
- }
-
- public void setSize(String size) {
- this.size = size;
- }
-
-
-
-
-
-
-}
+package com.salesmanager.shop.tags;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.jsp.JspException;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.servlet.tags.RequestContextAwareTag;
+
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.utils.FilePathUtils;
+import com.salesmanager.shop.utils.ImageFilePath;
+
+
+
+public class ShopProductImageUrlTag extends RequestContextAwareTag {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 6319855234657139862L;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ShopProductImageUrlTag.class);
+
+ private final static String SMALL = "SMALL";
+ private final static String LARGE = "LARGE";
+
+ private String imageName;
+ private String sku;
+ private String size; //SMALL | LARGE
+
+ @Inject
+ private FilePathUtils filePathUtils;
+
+ @Inject
+ @Qualifier("img")
+ private ImageFilePath imageUtils;
+
+ public int doStartTagInternal() throws JspException {
+ try {
+
+ if (filePathUtils==null || imageUtils==null) {
+ WebApplicationContext wac = getRequestContext().getWebApplicationContext();
+ AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory();
+ factory.autowireBean(this);
+ }
+
+ HttpServletRequest request = (HttpServletRequest) pageContext
+ .getRequest();
+
+ MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+
+ StringBuilder imagePath = new StringBuilder();
+
+ String baseUrl = filePathUtils.buildRelativeStoreUri(request, merchantStore);
+ imagePath.append(baseUrl);
+
+ if(StringUtils.isBlank(this.getSize()) || this.getSize().equals(SMALL)) {
+ imagePath.append(imageUtils.buildProductImageUtils(merchantStore, this.getSku(), this.getImageName())).toString();
+ } else {
+ imagePath.append(imageUtils.buildLargeProductImageUtils(merchantStore, this.getSku(), this.getImageName())).toString();
+ }
+
+ //System.out.println("Printing image -M " + imagePath.toString());
+
+ pageContext.getOut().print(imagePath.toString());
+
+
+
+ } catch (Exception ex) {
+ LOGGER.error("Error while getting content url", ex);
+ }
+ return SKIP_BODY;
+ }
+
+
+ public int doEndTag() {
+ return EVAL_PAGE;
+ }
+
+
+ public void setImageName(String imageName) {
+ this.imageName = imageName;
+ }
+
+ public String getImageName() {
+ return imageName;
+ }
+
+
+
+ public void setSku(String sku) {
+ this.sku = sku;
+ }
+
+ public String getSku() {
+ return sku;
+ }
+
+ public String getSize() {
+ return size;
+ }
+
+ public void setSize(String size) {
+ this.size = size;
+ }
+
+
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/tags/ShopProductPriceFormatTag.java b/sm-shop/src/main/java/com/salesmanager/shop/tags/ShopProductPriceFormatTag.java
index e9a7bf1..127c6a4 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/tags/ShopProductPriceFormatTag.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/tags/ShopProductPriceFormatTag.java
@@ -1,108 +1,108 @@
-package com.salesmanager.shop.tags;
-
-import java.math.BigDecimal;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
-import org.springframework.web.context.WebApplicationContext;
-import org.springframework.web.servlet.tags.RequestContextAwareTag;
-
-import com.salesmanager.core.business.services.catalog.product.PricingService;
-import com.salesmanager.core.business.utils.ProductPriceUtils;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.currency.Currency;
-import com.salesmanager.shop.constants.Constants;
-
-
-public class ShopProductPriceFormatTag extends RequestContextAwareTag {
-
-
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ShopProductPriceFormatTag.class);
-
- @Inject
- private PricingService pricingService;
-
- @Inject
- private ProductPriceUtils productPriceUtils;
-
-
-
- private BigDecimal value;
-
-
-
- private Currency currency;
-
-
-
-
-
- public Currency getCurrency() {
- return currency;
- }
-
-
- public void setCurrency(Currency currency) {
- this.currency = currency;
- }
-
-
- @Override
- protected int doStartTagInternal() throws Exception {
- if (pricingService == null || productPriceUtils==null) {
- LOGGER.debug("Autowiring productPriceUtils");
- WebApplicationContext wac = getRequestContext().getWebApplicationContext();
- AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory();
- factory.autowireBean(this);
- }
-
- HttpServletRequest request = (HttpServletRequest) pageContext
- .getRequest();
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
-
- String formatedPrice = null;
-
- if(this.getCurrency()!=null) {
- formatedPrice = productPriceUtils.getFormatedAmountWithCurrency(this.getCurrency(), this.getValue());
- } else {
- formatedPrice = pricingService.getDisplayAmount(this.getValue(), store);
- }
-
- pageContext.getOut().print(formatedPrice);
-
- return SKIP_BODY;
-
- }
-
-
- public int doEndTag() {
- return EVAL_PAGE;
- }
-
-
- public void setValue(BigDecimal value) {
- this.value = value;
- }
-
-
- public BigDecimal getValue() {
- return value;
- }
-
-
-
-
-
-
-}
+package com.salesmanager.shop.tags;
+
+import java.math.BigDecimal;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.servlet.tags.RequestContextAwareTag;
+
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.utils.ProductPriceUtils;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.currency.Currency;
+import com.salesmanager.shop.constants.Constants;
+
+
+public class ShopProductPriceFormatTag extends RequestContextAwareTag {
+
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ShopProductPriceFormatTag.class);
+
+ @Inject
+ private PricingService pricingService;
+
+ @Inject
+ private ProductPriceUtils productPriceUtils;
+
+
+
+ private BigDecimal value;
+
+
+
+ private Currency currency;
+
+
+
+
+
+ public Currency getCurrency() {
+ return currency;
+ }
+
+
+ public void setCurrency(Currency currency) {
+ this.currency = currency;
+ }
+
+
+ @Override
+ protected int doStartTagInternal() throws Exception {
+ if (pricingService == null || productPriceUtils==null) {
+ LOGGER.debug("Autowiring productPriceUtils");
+ WebApplicationContext wac = getRequestContext().getWebApplicationContext();
+ AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory();
+ factory.autowireBean(this);
+ }
+
+ HttpServletRequest request = (HttpServletRequest) pageContext
+ .getRequest();
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+
+ String formatedPrice = null;
+
+ if(this.getCurrency()!=null) {
+ formatedPrice = productPriceUtils.getFormatedAmountWithCurrency(this.getCurrency(), this.getValue());
+ } else {
+ formatedPrice = pricingService.getDisplayAmount(this.getValue(), store);
+ }
+
+ pageContext.getOut().print(formatedPrice);
+
+ return SKIP_BODY;
+
+ }
+
+
+ public int doEndTag() {
+ return EVAL_PAGE;
+ }
+
+
+ public void setValue(BigDecimal value) {
+ this.value = value;
+ }
+
+
+ public BigDecimal getValue() {
+ return value;
+ }
+
+
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/tags/ShopProductRelationshipTag.java b/sm-shop/src/main/java/com/salesmanager/shop/tags/ShopProductRelationshipTag.java
index 2310f79..d2517c7 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/tags/ShopProductRelationshipTag.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/tags/ShopProductRelationshipTag.java
@@ -1,163 +1,163 @@
-package com.salesmanager.shop.tags;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
-import org.springframework.web.context.WebApplicationContext;
-import org.springframework.web.servlet.tags.RequestContextAwareTag;
-
-import com.salesmanager.core.business.services.catalog.product.PricingService;
-import com.salesmanager.core.business.services.catalog.product.relationship.ProductRelationshipService;
-import com.salesmanager.core.business.utils.CacheUtils;
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.relationship.ProductRelationship;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.model.catalog.product.ReadableProduct;
-import com.salesmanager.shop.populator.catalog.ReadableProductPopulator;
-import com.salesmanager.shop.utils.ImageFilePath;
-
-
-
-public class ShopProductRelationshipTag extends RequestContextAwareTag {
-
-
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- private static final Logger LOGGER = LoggerFactory.getLogger(ShopProductRelationshipTag.class);
-
- @Inject
- private ProductRelationshipService productRelationshipService;
-
- @Inject
- private PricingService pricingService;
-
- @Inject
- private CacheUtils cache;
-
- @Inject
- @Qualifier("img")
- private ImageFilePath imageUtils;
-
-
- private String groupName;
-
-
-
- public String getGroupName() {
- return groupName;
- }
-
-
- public void setGroupName(String groupName) {
- this.groupName = groupName;
- }
-
-
- @SuppressWarnings("unchecked")
- @Override
- protected int doStartTagInternal() throws Exception {
- if (productRelationshipService == null || pricingService==null || imageUtils==null) {
- LOGGER.debug("Autowiring ProductRelationshipService");
- WebApplicationContext wac = getRequestContext().getWebApplicationContext();
- AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory();
- factory.autowireBean(this);
- }
-
- HttpServletRequest request = (HttpServletRequest) pageContext
- .getRequest();
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
-
- Language language = (Language)request.getAttribute(Constants.LANGUAGE);
-
- StringBuilder groupKey = new StringBuilder();
- groupKey
- .append(store.getId())
- .append("_")
- .append(Constants.PRODUCTS_GROUP_CACHE_KEY)
- .append("-")
- .append(this.getGroupName())
- .append("_")
- .append(language.getCode());
-
- StringBuilder groupKeyMissed = new StringBuilder();
- groupKeyMissed
- .append(groupKey.toString())
- .append(Constants.MISSED_CACHE_KEY);
-
- List<ReadableProduct> objects = null;
-
- if(store.isUseCache()) {
-
- //get from the cache
- objects = (List<ReadableProduct>) cache.getFromCache(groupKey.toString());
- Boolean missedContent = null;
-
- if(objects==null && missedContent==null) {
- objects = getProducts(request);
-
- //put in cache
- cache.putInCache(objects, groupKey.toString());
-
- } else {
- //put in missed cache
- //cache.putInCache(new Boolean(true), groupKeyMissed.toString());
- }
-
- } else {
- objects = getProducts(request);
- }
- if(objects!=null && objects.size()>0) {
- request.setAttribute(this.getGroupName(), objects);
- }
-
- return SKIP_BODY;
-
- }
-
-
- public int doEndTag() {
- return EVAL_PAGE;
- }
-
- private List<ReadableProduct> getProducts(HttpServletRequest request) throws Exception {
-
- MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
- Language language = (Language)request.getAttribute(Constants.LANGUAGE);
-
- List<ProductRelationship> relationships = productRelationshipService.getByGroup(store, this.getGroupName(), language);
-
- ReadableProductPopulator populator = new ReadableProductPopulator();
- populator.setPricingService(pricingService);
- populator.setimageUtils(imageUtils);
-
- List<ReadableProduct> products = new ArrayList<ReadableProduct>();
- for(ProductRelationship relationship : relationships) {
-
- Product product = relationship.getRelatedProduct();
-
- ReadableProduct proxyProduct = populator.populate(product, new ReadableProduct(), store, language);
- products.add(proxyProduct);
-
- }
-
- return products;
-
- }
-
-
-
-}
+package com.salesmanager.shop.tags;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.servlet.tags.RequestContextAwareTag;
+
+import com.salesmanager.core.business.services.catalog.product.PricingService;
+import com.salesmanager.core.business.services.catalog.product.relationship.ProductRelationshipService;
+import com.salesmanager.core.business.utils.CacheUtils;
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.relationship.ProductRelationship;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.model.catalog.product.ReadableProduct;
+import com.salesmanager.shop.populator.catalog.ReadableProductPopulator;
+import com.salesmanager.shop.utils.ImageFilePath;
+
+
+
+public class ShopProductRelationshipTag extends RequestContextAwareTag {
+
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(ShopProductRelationshipTag.class);
+
+ @Inject
+ private ProductRelationshipService productRelationshipService;
+
+ @Inject
+ private PricingService pricingService;
+
+ @Inject
+ private CacheUtils cache;
+
+ @Inject
+ @Qualifier("img")
+ private ImageFilePath imageUtils;
+
+
+ private String groupName;
+
+
+
+ public String getGroupName() {
+ return groupName;
+ }
+
+
+ public void setGroupName(String groupName) {
+ this.groupName = groupName;
+ }
+
+
+ @SuppressWarnings("unchecked")
+ @Override
+ protected int doStartTagInternal() throws Exception {
+ if (productRelationshipService == null || pricingService==null || imageUtils==null) {
+ LOGGER.debug("Autowiring ProductRelationshipService");
+ WebApplicationContext wac = getRequestContext().getWebApplicationContext();
+ AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory();
+ factory.autowireBean(this);
+ }
+
+ HttpServletRequest request = (HttpServletRequest) pageContext
+ .getRequest();
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+
+ Language language = (Language)request.getAttribute(Constants.LANGUAGE);
+
+ StringBuilder groupKey = new StringBuilder();
+ groupKey
+ .append(store.getId())
+ .append("_")
+ .append(Constants.PRODUCTS_GROUP_CACHE_KEY)
+ .append("-")
+ .append(this.getGroupName())
+ .append("_")
+ .append(language.getCode());
+
+ StringBuilder groupKeyMissed = new StringBuilder();
+ groupKeyMissed
+ .append(groupKey.toString())
+ .append(Constants.MISSED_CACHE_KEY);
+
+ List<ReadableProduct> objects = null;
+
+ if(store.isUseCache()) {
+
+ //get from the cache
+ objects = (List<ReadableProduct>) cache.getFromCache(groupKey.toString());
+ Boolean missedContent = null;
+
+ if(objects==null && missedContent==null) {
+ objects = getProducts(request);
+
+ //put in cache
+ cache.putInCache(objects, groupKey.toString());
+
+ } else {
+ //put in missed cache
+ //cache.putInCache(new Boolean(true), groupKeyMissed.toString());
+ }
+
+ } else {
+ objects = getProducts(request);
+ }
+ if(objects!=null && objects.size()>0) {
+ request.setAttribute(this.getGroupName(), objects);
+ }
+
+ return SKIP_BODY;
+
+ }
+
+
+ public int doEndTag() {
+ return EVAL_PAGE;
+ }
+
+ private List<ReadableProduct> getProducts(HttpServletRequest request) throws Exception {
+
+ MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+ Language language = (Language)request.getAttribute(Constants.LANGUAGE);
+
+ List<ProductRelationship> relationships = productRelationshipService.getByGroup(store, this.getGroupName(), language);
+
+ ReadableProductPopulator populator = new ReadableProductPopulator();
+ populator.setPricingService(pricingService);
+ populator.setimageUtils(imageUtils);
+
+ List<ReadableProduct> products = new ArrayList<ReadableProduct>();
+ for(ProductRelationship relationship : relationships) {
+
+ Product product = relationship.getRelatedProduct();
+
+ ReadableProduct proxyProduct = populator.populate(product, new ReadableProduct(), store, language);
+ products.add(proxyProduct);
+
+ }
+
+ return products;
+
+ }
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/tags/StoreBreadcrumbsTag.java b/sm-shop/src/main/java/com/salesmanager/shop/tags/StoreBreadcrumbsTag.java
index d8dd51e..64a0540 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/tags/StoreBreadcrumbsTag.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/tags/StoreBreadcrumbsTag.java
@@ -1,111 +1,111 @@
-package com.salesmanager.shop.tags;
-
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.tagext.TagSupport;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.model.shop.Breadcrumb;
-
-
-public class StoreBreadcrumbsTag extends TagSupport {
-
-
- /**
- *
- */
- private static final long serialVersionUID = 1L;
-
- private static final Logger LOGGER = LoggerFactory.getLogger(StoreBreadcrumbsTag.class);
-
- private Long categoryId = null;
- private Long productId = null;
-
- public int doStartTag() throws JspException {
- try {
-
-
-
- HttpServletRequest request = (HttpServletRequest) pageContext
- .getRequest();
-
- Breadcrumb breadCrumb = (Breadcrumb)request.getAttribute(Constants.BREADCRUMB);
-
- StringBuilder ref = new StringBuilder();
-
- if(breadCrumb!=null && !StringUtils.isBlank(breadCrumb.getUrlRefContent())) {
- ref.append(Constants.SLASH).append(Constants.REF).append(Constants.EQUALS).append(breadCrumb.getUrlRefContent());
- if(categoryId!=null) {
- List<String> ids = this.parseBreadCrumb(breadCrumb.getUrlRefContent());
- if(!ids.contains(String.valueOf(this.getCategoryId()))) {
- ref.append(",").append(this.getCategoryId().longValue());
- }
- }
- } else {
- if(categoryId!=null) {
- ref.append(Constants.SLASH).append(Constants.REF).append(Constants.EQUALS).append(Constants.REF_C).append(this.getCategoryId());
- } else {
- ref.append("");
- }
- }
-
-
- pageContext.getOut().print(ref.toString());
-
-
-
- } catch (Exception ex) {
- LOGGER.error("Error while getting content url", ex);
- }
- return SKIP_BODY;
- }
-
- /** only category **/
- private List<String> parseBreadCrumb(String refContent) throws Exception {
-
- /** c:1,2,3 **/
- String[] categoryComa = refContent.split(":");
- String[] categoryIds = categoryComa[1].split(",");
- return new LinkedList(Arrays.asList(categoryIds));
-
-
- }
-
- public int doEndTag() {
- return EVAL_PAGE;
- }
-
- public Long getCategoryId() {
- return categoryId;
- }
-
- public void setCategoryId(Long categoryId) {
- this.categoryId = categoryId;
- }
-
- public Long getProductId() {
- return productId;
- }
-
- public void setProductId(Long productId) {
- this.productId = productId;
- }
-
-
-
-
-
-
-
-
-
-
-}
+package com.salesmanager.shop.tags;
+
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.TagSupport;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.model.shop.Breadcrumb;
+
+
+public class StoreBreadcrumbsTag extends TagSupport {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(StoreBreadcrumbsTag.class);
+
+ private Long categoryId = null;
+ private Long productId = null;
+
+ public int doStartTag() throws JspException {
+ try {
+
+
+
+ HttpServletRequest request = (HttpServletRequest) pageContext
+ .getRequest();
+
+ Breadcrumb breadCrumb = (Breadcrumb)request.getAttribute(Constants.BREADCRUMB);
+
+ StringBuilder ref = new StringBuilder();
+
+ if(breadCrumb!=null && !StringUtils.isBlank(breadCrumb.getUrlRefContent())) {
+ ref.append(Constants.SLASH).append(Constants.REF).append(Constants.EQUALS).append(breadCrumb.getUrlRefContent());
+ if(categoryId!=null) {
+ List<String> ids = this.parseBreadCrumb(breadCrumb.getUrlRefContent());
+ if(!ids.contains(String.valueOf(this.getCategoryId()))) {
+ ref.append(",").append(this.getCategoryId().longValue());
+ }
+ }
+ } else {
+ if(categoryId!=null) {
+ ref.append(Constants.SLASH).append(Constants.REF).append(Constants.EQUALS).append(Constants.REF_C).append(this.getCategoryId());
+ } else {
+ ref.append("");
+ }
+ }
+
+
+ pageContext.getOut().print(ref.toString());
+
+
+
+ } catch (Exception ex) {
+ LOGGER.error("Error while getting content url", ex);
+ }
+ return SKIP_BODY;
+ }
+
+ /** only category **/
+ private List<String> parseBreadCrumb(String refContent) throws Exception {
+
+ /** c:1,2,3 **/
+ String[] categoryComa = refContent.split(":");
+ String[] categoryIds = categoryComa[1].split(",");
+ return new LinkedList(Arrays.asList(categoryIds));
+
+
+ }
+
+ public int doEndTag() {
+ return EVAL_PAGE;
+ }
+
+ public Long getCategoryId() {
+ return categoryId;
+ }
+
+ public void setCategoryId(Long categoryId) {
+ this.categoryId = categoryId;
+ }
+
+ public Long getProductId() {
+ return productId;
+ }
+
+ public void setProductId(Long productId) {
+ this.productId = productId;
+ }
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/tags/StoreFooterlTag.java b/sm-shop/src/main/java/com/salesmanager/shop/tags/StoreFooterlTag.java
index e30f061..f3d49bc 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/tags/StoreFooterlTag.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/tags/StoreFooterlTag.java
@@ -1,83 +1,83 @@
-package com.salesmanager.shop.tags;
-
-import java.util.Calendar;
-import java.util.Date;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.jsp.JspException;
-import javax.servlet.jsp.tagext.TagSupport;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.shop.constants.Constants;
-
-public class StoreFooterlTag extends TagSupport {
-
-
- /**
- *
- */
- private static final long serialVersionUID = 6319855234657139862L;
- private static final Logger LOGGER = LoggerFactory.getLogger(StoreFooterlTag.class);
-
- private final static String COPY = "\u00a9";
-
-
- public int doStartTag() throws JspException {
- try {
-
-
-
- HttpServletRequest request = (HttpServletRequest) pageContext
- .getRequest();
-
- MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
-
-
- StringBuilder y = new StringBuilder();
- int currentYear = Calendar.getInstance().get(Calendar.YEAR);
-
-
- if(merchantStore!=null) {
- Date dateBusiness=merchantStore.getInBusinessSince();
- if(dateBusiness!=null) {
- Calendar c = Calendar.getInstance();
- c.setTime(dateBusiness);
- int startBusiness = c.get(Calendar.YEAR);
- if(startBusiness<currentYear) {
- y.append(startBusiness).append("-");
- }
- }
- }
-
- y.append(currentYear);
-
- StringBuilder copy = new StringBuilder();
- copy.append(COPY).append(" ").append(merchantStore.getStorename()).append(" ").append(y.toString());
-
- pageContext.getOut().print(copy.toString());
-
-
-
- } catch (Exception ex) {
- LOGGER.error("Error while getting content url", ex);
- }
- return SKIP_BODY;
- }
-
- public int doEndTag() {
- return EVAL_PAGE;
- }
-
-
-
-
-
-
-
-
-
-
-}
+package com.salesmanager.shop.tags;
+
+import java.util.Calendar;
+import java.util.Date;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.TagSupport;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.shop.constants.Constants;
+
+public class StoreFooterlTag extends TagSupport {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 6319855234657139862L;
+ private static final Logger LOGGER = LoggerFactory.getLogger(StoreFooterlTag.class);
+
+ private final static String COPY = "\u00a9";
+
+
+ public int doStartTag() throws JspException {
+ try {
+
+
+
+ HttpServletRequest request = (HttpServletRequest) pageContext
+ .getRequest();
+
+ MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+
+
+ StringBuilder y = new StringBuilder();
+ int currentYear = Calendar.getInstance().get(Calendar.YEAR);
+
+
+ if(merchantStore!=null) {
+ Date dateBusiness=merchantStore.getInBusinessSince();
+ if(dateBusiness!=null) {
+ Calendar c = Calendar.getInstance();
+ c.setTime(dateBusiness);
+ int startBusiness = c.get(Calendar.YEAR);
+ if(startBusiness<currentYear) {
+ y.append(startBusiness).append("-");
+ }
+ }
+ }
+
+ y.append(currentYear);
+
+ StringBuilder copy = new StringBuilder();
+ copy.append(COPY).append(" ").append(merchantStore.getStorename()).append(" ").append(y.toString());
+
+ pageContext.getOut().print(copy.toString());
+
+
+
+ } catch (Exception ex) {
+ LOGGER.error("Error while getting content url", ex);
+ }
+ return SKIP_BODY;
+ }
+
+ public int doEndTag() {
+ return EVAL_PAGE;
+ }
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/tags/StoreLogoUrlTag.java b/sm-shop/src/main/java/com/salesmanager/shop/tags/StoreLogoUrlTag.java
index e226b1c..346b871 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/tags/StoreLogoUrlTag.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/tags/StoreLogoUrlTag.java
@@ -1,95 +1,95 @@
-package com.salesmanager.shop.tags;
-
-import javax.inject.Inject;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.jsp.JspException;
-
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
-import org.springframework.web.context.WebApplicationContext;
-import org.springframework.web.servlet.tags.RequestContextAwareTag;
-
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.utils.FilePathUtils;
-import com.salesmanager.shop.utils.ImageFilePath;
-
-public class StoreLogoUrlTag extends RequestContextAwareTag {
-
-
- /**
- *
- */
- private static final long serialVersionUID = 6319855234657139862L;
- private static final Logger LOGGER = LoggerFactory.getLogger(StoreLogoUrlTag.class);
- private static final String RESOURCES = "resources";
- private static final String IMG = "img";
- private static final String SHOPIZER_LOGO = "shopizer_small.png";
-
- @Inject
- private FilePathUtils filePathUtils;
-
-
- @Inject
- @Qualifier("img")
- private ImageFilePath imageUtils;
-
- public int doStartTagInternal() throws JspException {
- try {
-
- if (filePathUtils==null || imageUtils!=null) {
- WebApplicationContext wac = getRequestContext().getWebApplicationContext();
- AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory();
- factory.autowireBean(this);
- }
-
- HttpServletRequest request = (HttpServletRequest) pageContext
- .getRequest();
-
- MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
-
- StringBuilder imagePath = new StringBuilder();
-
- String baseUrl = filePathUtils.buildRelativeStoreUri(request, merchantStore);
- imagePath.append(baseUrl);
-
- if(StringUtils.isBlank(merchantStore.getStoreLogo())){
-
- imagePath
- .append(RESOURCES).append("/")
- .append(IMG).append("/").append(SHOPIZER_LOGO);
- } else {
-
- imagePath
- .append(imageUtils.buildStoreLogoFilePath(merchantStore));
-
- }
-
- pageContext.getOut().print(imagePath.toString());
-
-
-
- } catch (Exception ex) {
- LOGGER.error("Error while getting content url", ex);
- }
- return SKIP_BODY;
- }
-
- public int doEndTag() {
- return EVAL_PAGE;
- }
-
-
-
-
-
-
-
-
-
-
-
-}
+package com.salesmanager.shop.tags;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.jsp.JspException;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.servlet.tags.RequestContextAwareTag;
+
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.utils.FilePathUtils;
+import com.salesmanager.shop.utils.ImageFilePath;
+
+public class StoreLogoUrlTag extends RequestContextAwareTag {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 6319855234657139862L;
+ private static final Logger LOGGER = LoggerFactory.getLogger(StoreLogoUrlTag.class);
+ private static final String RESOURCES = "resources";
+ private static final String IMG = "img";
+ private static final String SHOPIZER_LOGO = "shopizer_small.png";
+
+ @Inject
+ private FilePathUtils filePathUtils;
+
+
+ @Inject
+ @Qualifier("img")
+ private ImageFilePath imageUtils;
+
+ public int doStartTagInternal() throws JspException {
+ try {
+
+ if (filePathUtils==null || imageUtils!=null) {
+ WebApplicationContext wac = getRequestContext().getWebApplicationContext();
+ AutowireCapableBeanFactory factory = wac.getAutowireCapableBeanFactory();
+ factory.autowireBean(this);
+ }
+
+ HttpServletRequest request = (HttpServletRequest) pageContext
+ .getRequest();
+
+ MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
+
+ StringBuilder imagePath = new StringBuilder();
+
+ String baseUrl = filePathUtils.buildRelativeStoreUri(request, merchantStore);
+ imagePath.append(baseUrl);
+
+ if(StringUtils.isBlank(merchantStore.getStoreLogo())){
+
+ imagePath
+ .append(RESOURCES).append("/")
+ .append(IMG).append("/").append(SHOPIZER_LOGO);
+ } else {
+
+ imagePath
+ .append(imageUtils.buildStoreLogoFilePath(merchantStore));
+
+ }
+
+ pageContext.getOut().print(imagePath.toString());
+
+
+
+ } catch (Exception ex) {
+ LOGGER.error("Error while getting content url", ex);
+ }
+ return SKIP_BODY;
+ }
+
+ public int doEndTag() {
+ return EVAL_PAGE;
+ }
+
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/utils/AbstractimageFilePath.java b/sm-shop/src/main/java/com/salesmanager/shop/utils/AbstractimageFilePath.java
index 882b15c..3e644eb 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/utils/AbstractimageFilePath.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/utils/AbstractimageFilePath.java
@@ -92,8 +92,8 @@ public abstract class AbstractimageFilePath implements ImageFilePath {
* @return
*/
public String buildProductImageUtils(MerchantStore store, Product product, String imageName) {
- return new StringBuilder().append(getBasePath()).append(Constants.SLASH).append(store.getCode()).append(Constants.SLASH).append(FileContentType.PRODUCT.name()).append(Constants.SLASH)
- .append(product.getSku()).append(Constants.SLASH).append(imageName).toString();
+ return new StringBuilder().append(getBasePath()).append(Constants.PRODUCTS_URI).append(Constants.SLASH).append(store.getCode()).append(Constants.SLASH).append(Constants.SLASH)
+ .append(product.getSku()).append(Constants.SLASH).append(Constants.SMALL_IMAGE).append(Constants.SLASH).append(imageName).toString();
}
/**
@@ -105,8 +105,8 @@ public abstract class AbstractimageFilePath implements ImageFilePath {
* @return
*/
public String buildProductImageUtils(MerchantStore store, String sku, String imageName) {
- return new StringBuilder().append(getBasePath()).append(Constants.SLASH).append(store.getCode()).append(Constants.SLASH).append(FileContentType.PRODUCT.name()).append(Constants.SLASH)
- .append(sku).append(Constants.SLASH).append(imageName).toString();
+ return new StringBuilder().append(getBasePath()).append(Constants.PRODUCTS_URI).append(Constants.SLASH).append(store.getCode()).append(Constants.SLASH)
+ .append(sku).append(Constants.SLASH).append(Constants.SMALL_IMAGE).append(Constants.SLASH).append(imageName).toString();
}
/**
@@ -117,8 +117,8 @@ public abstract class AbstractimageFilePath implements ImageFilePath {
* @return
*/
public String buildLargeProductImageUtils(MerchantStore store, String sku, String imageName) {
- return new StringBuilder().append(getBasePath()).append(Constants.SLASH).append(store.getCode()).append(Constants.SLASH).append(FileContentType.PRODUCTLG.name()).append(Constants.SLASH)
- .append(sku).append(Constants.SLASH).append(imageName).toString();
+ return new StringBuilder().append(getBasePath()).append(Constants.SLASH).append(store.getCode()).append(Constants.SLASH)
+ .append(sku).append(Constants.SLASH).append(Constants.SMALL_IMAGE).append(Constants.SLASH).append(imageName).toString();
}
@@ -129,7 +129,7 @@ public abstract class AbstractimageFilePath implements ImageFilePath {
* @return
*/
public String buildStoreLogoFilePath(MerchantStore store) {
- return new StringBuilder().append(getBasePath()).append(Constants.SLASH).append(store.getCode()).append(Constants.SLASH).append(FileContentType.LOGO).append(Constants.SLASH)
+ return new StringBuilder().append(getBasePath()).append(Constants.FILES_URI).append(Constants.SLASH).append(store.getCode()).append(Constants.SLASH).append(FileContentType.LOGO).append(Constants.SLASH)
.append(store.getStoreLogo()).toString();
}
@@ -145,12 +145,12 @@ public abstract class AbstractimageFilePath implements ImageFilePath {
}
public String buildProductPropertyImageUtils(MerchantStore store, String imageName) {
- return new StringBuilder().append(getBasePath()).append("/files/").append(store.getCode()).append("/").append(FileContentType.PROPERTY).append("/")
+ return new StringBuilder().append(getBasePath()).append(Constants.FILES_URI).append(Constants.SLASH).append(store.getCode()).append("/").append(FileContentType.PROPERTY).append("/")
.append(imageName).toString();
}
/**
- * Builds pstatic file url path
+ * Builds static file url path
* @param store
* @param imageName
* @return
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/utils/BeanUtils.java b/sm-shop/src/main/java/com/salesmanager/shop/utils/BeanUtils.java
index 1146dfb..e91be20 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/utils/BeanUtils.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/utils/BeanUtils.java
@@ -1,65 +1,65 @@
-package com.salesmanager.shop.utils;
-
-import java.beans.BeanInfo;
-import java.beans.IntrospectionException;
-import java.beans.Introspector;
-import java.beans.PropertyDescriptor;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-public class BeanUtils
-{
- private BeanUtils(){
-
- }
-
- public static BeanUtils newInstance(){
- return new BeanUtils();
- }
-
- @SuppressWarnings( "nls" )
- public Object getPropertyValue( Object bean, String property )
- throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException
- {
-
- if (bean == null) {
- throw new IllegalArgumentException("No bean specified");
- }
- if(property == null){
-
- throw new IllegalArgumentException("No name specified for bean class '" + bean.getClass() + "'");
- }
- Class<?> beanClass = bean.getClass();
- PropertyDescriptor propertyDescriptor = getPropertyDescriptor( beanClass, property );
- if ( propertyDescriptor == null )
- {
- throw new IllegalArgumentException( "No such property " + property + " for " + beanClass + " exists" );
- }
-
- Method readMethod = propertyDescriptor.getReadMethod();
- if ( readMethod == null )
- {
- throw new IllegalStateException( "No getter available for property " + property + " on " + beanClass );
- }
- return readMethod.invoke( bean );
- }
-
- private PropertyDescriptor getPropertyDescriptor( Class<?> beanClass, String propertyname )
- throws IntrospectionException
- {
- BeanInfo beanInfo = Introspector.getBeanInfo( beanClass );
- PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
- PropertyDescriptor propertyDescriptor = null;
- for ( int i = 0; i < propertyDescriptors.length; i++ )
- {
- PropertyDescriptor currentPropertyDescriptor = propertyDescriptors[i];
- if ( currentPropertyDescriptor.getName().equals( propertyname ) )
- {
- propertyDescriptor = currentPropertyDescriptor;
- }
-
- }
- return propertyDescriptor;
- }
-
-}
+package com.salesmanager.shop.utils;
+
+import java.beans.BeanInfo;
+import java.beans.IntrospectionException;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+public class BeanUtils
+{
+ private BeanUtils(){
+
+ }
+
+ public static BeanUtils newInstance(){
+ return new BeanUtils();
+ }
+
+ @SuppressWarnings( "nls" )
+ public Object getPropertyValue( Object bean, String property )
+ throws IntrospectionException, IllegalArgumentException, IllegalAccessException, InvocationTargetException
+ {
+
+ if (bean == null) {
+ throw new IllegalArgumentException("No bean specified");
+ }
+ if(property == null){
+
+ throw new IllegalArgumentException("No name specified for bean class '" + bean.getClass() + "'");
+ }
+ Class<?> beanClass = bean.getClass();
+ PropertyDescriptor propertyDescriptor = getPropertyDescriptor( beanClass, property );
+ if ( propertyDescriptor == null )
+ {
+ throw new IllegalArgumentException( "No such property " + property + " for " + beanClass + " exists" );
+ }
+
+ Method readMethod = propertyDescriptor.getReadMethod();
+ if ( readMethod == null )
+ {
+ throw new IllegalStateException( "No getter available for property " + property + " on " + beanClass );
+ }
+ return readMethod.invoke( bean );
+ }
+
+ private PropertyDescriptor getPropertyDescriptor( Class<?> beanClass, String propertyname )
+ throws IntrospectionException
+ {
+ BeanInfo beanInfo = Introspector.getBeanInfo( beanClass );
+ PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
+ PropertyDescriptor propertyDescriptor = null;
+ for ( int i = 0; i < propertyDescriptors.length; i++ )
+ {
+ PropertyDescriptor currentPropertyDescriptor = propertyDescriptors[i];
+ if ( currentPropertyDescriptor.getName().equals( propertyname ) )
+ {
+ propertyDescriptor = currentPropertyDescriptor;
+ }
+
+ }
+ return propertyDescriptor;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/utils/DateUtil.java b/sm-shop/src/main/java/com/salesmanager/shop/utils/DateUtil.java
index 91a42d2..489c141 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/utils/DateUtil.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/utils/DateUtil.java
@@ -1,159 +1,178 @@
-/*
- * Licensed to csti consulting
- * You may obtain a copy of the License at
- *
- * http://www.csticonsulting.com
- * Copyright (c) 2006-Aug 24, 2010 Consultation CS-TI inc.
- *
- * 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.
- */
-package com.salesmanager.shop.utils;
-
-import com.salesmanager.core.business.constants.Constants;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.servlet.http.HttpServletRequest;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-
-
-
-public class DateUtil {
-
- private Date startDate = new Date(new Date().getTime());
- private Date endDate = new Date(new Date().getTime());
- private static final Logger LOGGER = LoggerFactory.getLogger(DateUtil.class);
- private final static String LONGDATE_FORMAT = "EEE, d MMM yyyy HH:mm:ss Z";
-
-
-
- /**
- * Generates a time stamp
- * yyyymmddhhmmss
- * @return
- */
- public static String generateTimeStamp() {
- SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmSS");
- return format.format(new Date());
- }
-
- /**
- * yyyy-MM-dd
- *
- * @param dt
- * @return
- */
- public static String formatDate(Date dt) {
-
- if (dt == null)
- return null;
- SimpleDateFormat format = new SimpleDateFormat(Constants.DEFAULT_DATE_FORMAT);
- return format.format(dt);
-
- }
-
- public static String formatYear(Date dt) {
-
- if (dt == null)
- return null;
- SimpleDateFormat format = new SimpleDateFormat(Constants.DEFAULT_DATE_FORMAT_YEAR);
- return format.format(dt);
-
- }
-
- public static String formatLongDate(Date date) {
-
- if (date == null)
- return null;
- SimpleDateFormat format = new SimpleDateFormat(LONGDATE_FORMAT);
- return format.format(date);
-
- }
-
- /**
- * yy-MMM-dd
- *
- * @param dt
- * @return
- */
- public static String formatDateMonthString(Date dt) {
-
- if (dt == null)
- return null;
- SimpleDateFormat format = new SimpleDateFormat(Constants.DEFAULT_DATE_FORMAT);
- return format.format(dt);
-
- }
-
- public static Date getDate(String date) throws Exception {
- DateFormat myDateFormat = new SimpleDateFormat(Constants.DEFAULT_DATE_FORMAT);
- return myDateFormat.parse(date);
- }
-
- public static Date addDaysToCurrentDate(int days) {
- Calendar c = Calendar.getInstance();
- c.setTime(new Date());
- c.add(Calendar.DATE, days);
- return c.getTime();
-
- }
-
- public static Date getDate() {
-
- return new Date(new Date().getTime());
-
- }
-
- public static String getPresentDate() {
-
- Date dt = new Date();
-
- SimpleDateFormat format = new SimpleDateFormat(Constants.DEFAULT_DATE_FORMAT);
- return format.format(new Date(dt.getTime()));
- }
-
- public static String getPresentYear() {
-
- Date dt = new Date();
-
- SimpleDateFormat format = new SimpleDateFormat("yyyy");
- return format.format(new Date(dt.getTime()));
- }
-
- public void processPostedDates(HttpServletRequest request) {
- Date dt = new Date();
- DateFormat myDateFormat = new SimpleDateFormat(Constants.DEFAULT_DATE_FORMAT);
- Date sDate = null;
- Date eDate = null;
- try {
- if (request.getParameter("startdate") != null) {
- sDate = myDateFormat.parse(request.getParameter("startdate"));
- }
- if (request.getParameter("enddate") != null) {
- eDate = myDateFormat.parse(request.getParameter("enddate"));
- }
- this.startDate = sDate;
- this.endDate = eDate;
- } catch (Exception e) {
- LOGGER.error("",e);
- this.startDate = new Date(dt.getTime());
- this.endDate = new Date(dt.getTime());
- }
- }
-
- public Date getEndDate() {
- return endDate;
- }
-
- public Date getStartDate() {
- return startDate;
- }
-}
+/*
+ * Licensed to csti consulting
+ * You may obtain a copy of the License at
+ *
+ * http://www.csticonsulting.com
+ * Copyright (c) 2006-Aug 24, 2010 Consultation CS-TI inc.
+ *
+ * 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.
+ */
+package com.salesmanager.shop.utils;
+
+import com.salesmanager.core.business.constants.Constants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.http.HttpServletRequest;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+
+
+public class DateUtil {
+
+ private Date startDate = new Date(new Date().getTime());
+ private Date endDate = new Date(new Date().getTime());
+ private static final Logger LOGGER = LoggerFactory.getLogger(DateUtil.class);
+ private final static String LONGDATE_FORMAT = "EEE, d MMM yyyy HH:mm:ss Z";
+
+
+
+ /**
+ * Generates a time stamp
+ * yyyymmddhhmmss
+ * @return
+ */
+ public static String generateTimeStamp() {
+ SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmSS");
+ return format.format(new Date());
+ }
+
+ /**
+ * yyyy-MM-dd
+ *
+ * @param dt
+ * @return
+ */
+ public static String formatDate(Date dt) {
+
+ if (dt == null)
+ return null;
+ SimpleDateFormat format = new SimpleDateFormat(Constants.DEFAULT_DATE_FORMAT);
+ return format.format(dt);
+
+ }
+
+ public static String formatYear(Date dt) {
+
+ if (dt == null)
+ return null;
+ SimpleDateFormat format = new SimpleDateFormat(Constants.DEFAULT_DATE_FORMAT_YEAR);
+ return format.format(dt);
+
+ }
+
+ public static String formatLongDate(Date date) {
+
+ if (date == null)
+ return null;
+ SimpleDateFormat format = new SimpleDateFormat(LONGDATE_FORMAT);
+ return format.format(date);
+
+ }
+
+ /**
+ * yy-MMM-dd
+ *
+ * @param dt
+ * @return
+ */
+ public static String formatDateMonthString(Date dt) {
+
+ if (dt == null)
+ return null;
+ SimpleDateFormat format = new SimpleDateFormat(Constants.DEFAULT_DATE_FORMAT);
+ return format.format(dt);
+
+ }
+
+ public static Date getDate(String date) throws Exception {
+ DateFormat myDateFormat = new SimpleDateFormat(Constants.DEFAULT_DATE_FORMAT);
+ return myDateFormat.parse(date);
+ }
+
+ public static Date addDaysToCurrentDate(int days) {
+ Calendar c = Calendar.getInstance();
+ c.setTime(new Date());
+ c.add(Calendar.DATE, days);
+ return c.getTime();
+
+ }
+
+ public static Date getDate() {
+
+ return new Date(new Date().getTime());
+
+ }
+
+ public static String getPresentDate() {
+
+ Date dt = new Date();
+
+ SimpleDateFormat format = new SimpleDateFormat(Constants.DEFAULT_DATE_FORMAT);
+ return format.format(new Date(dt.getTime()));
+ }
+
+ public static String getPresentYear() {
+
+ Date dt = new Date();
+
+ SimpleDateFormat format = new SimpleDateFormat("yyyy");
+ return format.format(new Date(dt.getTime()));
+ }
+
+ public static boolean dateBeforeEqualsDate(Date firstDate, Date compareDate) {
+
+
+ if(firstDate==null || compareDate==null) {
+ return true;
+ }
+
+ if (firstDate.compareTo(compareDate) > 0) {
+ return false;
+ } else if (firstDate.compareTo(compareDate) < 0) {
+ return true;
+ } else if (firstDate.compareTo(compareDate) == 0) {
+ return true;
+ } else {
+ return false;
+ }
+
+ }
+
+ public void processPostedDates(HttpServletRequest request) {
+ Date dt = new Date();
+ DateFormat myDateFormat = new SimpleDateFormat(Constants.DEFAULT_DATE_FORMAT);
+ Date sDate = null;
+ Date eDate = null;
+ try {
+ if (request.getParameter("startdate") != null) {
+ sDate = myDateFormat.parse(request.getParameter("startdate"));
+ }
+ if (request.getParameter("enddate") != null) {
+ eDate = myDateFormat.parse(request.getParameter("enddate"));
+ }
+ this.startDate = sDate;
+ this.endDate = eDate;
+ } catch (Exception e) {
+ LOGGER.error("",e);
+ this.startDate = new Date(dt.getTime());
+ this.endDate = new Date(dt.getTime());
+ }
+ }
+
+ public Date getEndDate() {
+ return endDate;
+ }
+
+ public Date getStartDate() {
+ return startDate;
+ }
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/utils/EmailUtils.java b/sm-shop/src/main/java/com/salesmanager/shop/utils/EmailUtils.java
index a1ac85a..617dfb2 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/utils/EmailUtils.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/utils/EmailUtils.java
@@ -1,64 +1,64 @@
-package com.salesmanager.shop.utils;
-
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-
-import javax.inject.Inject;
-
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.stereotype.Component;
-
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.shop.constants.Constants;
-
-
-@Component
-public class EmailUtils {
-
- private final static String EMAIL_STORE_NAME = "EMAIL_STORE_NAME";
- private final static String EMAIL_FOOTER_COPYRIGHT = "EMAIL_FOOTER_COPYRIGHT";
- private final static String EMAIL_DISCLAIMER = "EMAIL_DISCLAIMER";
- private final static String EMAIL_SPAM_DISCLAIMER = "EMAIL_SPAM_DISCLAIMER";
- private final static String EMAIL_ADMIN_LABEL = "EMAIL_ADMIN_LABEL";
- private final static String LOGOPATH = "LOGOPATH";
-
- @Inject
- @Qualifier("img")
- private ImageFilePath imageUtils;
-
- /**
- * Builds generic html email information
- * @param store
- * @param messages
- * @param locale
- * @return
- */
- public Map<String, String> createEmailObjectsMap(String contextPath, MerchantStore store, LabelUtils messages, Locale locale){
-
- Map<String, String> templateTokens = new HashMap<String, String>();
-
- String[] adminNameArg = {store.getStorename()};
- String[] adminEmailArg = {store.getStoreEmailAddress()};
- String[] copyArg = {store.getStorename(), DateUtil.getPresentYear()};
-
- templateTokens.put(EMAIL_ADMIN_LABEL, messages.getMessage("email.message.from", adminNameArg, locale));
- templateTokens.put(EMAIL_STORE_NAME, store.getStorename());
- templateTokens.put(EMAIL_FOOTER_COPYRIGHT, messages.getMessage("email.copyright", copyArg, locale));
- templateTokens.put(EMAIL_DISCLAIMER, messages.getMessage("email.disclaimer", adminEmailArg, locale));
- templateTokens.put(EMAIL_SPAM_DISCLAIMER, messages.getMessage("email.spam.disclaimer", locale));
-
- if(store.getStoreLogo()!=null) {
- //TODO revise
- StringBuilder logoPath = new StringBuilder();
- String scheme = Constants.HTTP_SCHEME;
- logoPath.append("<img src='").append(scheme).append("://").append(store.getDomainName()).append(contextPath).append("/").append(imageUtils.buildStoreLogoFilePath(store)).append("' style='max-width:400px;'>");
- templateTokens.put(LOGOPATH, logoPath.toString());
- } else {
- templateTokens.put(LOGOPATH, store.getStorename());
- }
-
- return templateTokens;
- }
-
-}
+package com.salesmanager.shop.utils;
+
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
+
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.shop.constants.Constants;
+
+
+@Component
+public class EmailUtils {
+
+ private final static String EMAIL_STORE_NAME = "EMAIL_STORE_NAME";
+ private final static String EMAIL_FOOTER_COPYRIGHT = "EMAIL_FOOTER_COPYRIGHT";
+ private final static String EMAIL_DISCLAIMER = "EMAIL_DISCLAIMER";
+ private final static String EMAIL_SPAM_DISCLAIMER = "EMAIL_SPAM_DISCLAIMER";
+ private final static String EMAIL_ADMIN_LABEL = "EMAIL_ADMIN_LABEL";
+ private final static String LOGOPATH = "LOGOPATH";
+
+ @Inject
+ @Qualifier("img")
+ private ImageFilePath imageUtils;
+
+ /**
+ * Builds generic html email information
+ * @param store
+ * @param messages
+ * @param locale
+ * @return
+ */
+ public Map<String, String> createEmailObjectsMap(String contextPath, MerchantStore store, LabelUtils messages, Locale locale){
+
+ Map<String, String> templateTokens = new HashMap<String, String>();
+
+ String[] adminNameArg = {store.getStorename()};
+ String[] adminEmailArg = {store.getStoreEmailAddress()};
+ String[] copyArg = {store.getStorename(), DateUtil.getPresentYear()};
+
+ templateTokens.put(EMAIL_ADMIN_LABEL, messages.getMessage("email.message.from", adminNameArg, locale));
+ templateTokens.put(EMAIL_STORE_NAME, store.getStorename());
+ templateTokens.put(EMAIL_FOOTER_COPYRIGHT, messages.getMessage("email.copyright", copyArg, locale));
+ templateTokens.put(EMAIL_DISCLAIMER, messages.getMessage("email.disclaimer", adminEmailArg, locale));
+ templateTokens.put(EMAIL_SPAM_DISCLAIMER, messages.getMessage("email.spam.disclaimer", locale));
+
+ if(store.getStoreLogo()!=null) {
+ //TODO revise
+ StringBuilder logoPath = new StringBuilder();
+ String scheme = Constants.HTTP_SCHEME;
+ logoPath.append("<img src='").append(scheme).append("://").append(store.getDomainName()).append(contextPath).append("/").append(imageUtils.buildStoreLogoFilePath(store)).append("' style='max-width:400px;'>");
+ templateTokens.put(LOGOPATH, logoPath.toString());
+ } else {
+ templateTokens.put(LOGOPATH, store.getStorename());
+ }
+
+ return templateTokens;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/utils/Enum.java b/sm-shop/src/main/java/com/salesmanager/shop/utils/Enum.java
new file mode 100644
index 0000000..fb7ee0f
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/utils/Enum.java
@@ -0,0 +1,27 @@
+package com.salesmanager.shop.utils;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+
+@Documented
+@Constraint(validatedBy = {EnumValidator.class})
+@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Enum
+{
+ public abstract String message() default "Invalid value. This is not permitted.";
+
+ public abstract Class<?>[] groups() default {};
+
+ public abstract Class<? extends Payload>[] payload() default {};
+
+ public abstract Class<? extends java.lang.Enum<?>> enumClass();
+
+ public abstract boolean ignoreCase() default false;
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/utils/EnumValidator.java b/sm-shop/src/main/java/com/salesmanager/shop/utils/EnumValidator.java
new file mode 100644
index 0000000..b6edf6b
--- /dev/null
+++ b/sm-shop/src/main/java/com/salesmanager/shop/utils/EnumValidator.java
@@ -0,0 +1,45 @@
+package com.salesmanager.shop.utils;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+
+
+/**
+ * Validates values of a String used as payload in REST service
+ * Solution taken from https://funofprograming.wordpress.com/2016/09/29/java-enum-validator/
+ * @author c.samson
+ *
+ */
+public class EnumValidator implements ConstraintValidator<Enum, String>
+{
+ private Enum annotation;
+
+ @Override
+ public void initialize(Enum annotation)
+ {
+ this.annotation = annotation;
+ }
+
+ @Override
+ public boolean isValid(String valueForValidation, ConstraintValidatorContext constraintValidatorContext)
+ {
+ boolean result = false;
+
+ Object[] enumValues = this.annotation.enumClass().getEnumConstants();
+
+ if(enumValues != null)
+ {
+ for(Object enumValue:enumValues)
+ {
+ if(valueForValidation.equals(enumValue.toString())
+ || (this.annotation.ignoreCase() && valueForValidation.equalsIgnoreCase(enumValue.toString())))
+ {
+ result = true;
+ break;
+ }
+ }
+ }
+
+ return result;
+ }
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/utils/FieldMatch.java b/sm-shop/src/main/java/com/salesmanager/shop/utils/FieldMatch.java
index 424d1f0..328ba6c 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/utils/FieldMatch.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/utils/FieldMatch.java
@@ -1,70 +1,70 @@
-/**
- *
- */
-package com.salesmanager.shop.utils;
-
-import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import javax.validation.Constraint;
-import javax.validation.Payload;
-
-
-/**
- *
- * Validation annotation to validate that 2 fields have the same value.
- * An array of fields and their matching confirmation fields can be supplied.
- *
- * Example, compare 1 pair of fields:
- * @FieldMatch(first = "password", second = "confirmPassword", message = "The password fields must match")
- *
- * Example, compare more than 1 pair of fields:
- * @FieldMatch.List({
- * @FieldMatch(first = "password", second = "confirmPassword", message = "The password fields must match"),
- * @FieldMatch(first = "email", second = "confirmEmail", message = "The email fields must match")})
- *
- * @author Umesh Awasthi
- *
- */
-
-@Constraint(validatedBy = FieldMatchValidator.class)
-@Documented
-@Target({TYPE, ANNOTATION_TYPE})
-@Retention(RUNTIME)
-public @interface FieldMatch
-{
-
- String message() default "Fields are not matching";
-
- Class<?>[] groups() default {};
-
- Class<? extends Payload>[] payload() default {};
-
- /**
- * @return The first field
- */
- String first();
-
- /**
- * @return The second field
- */
- String second();
-
- /**
- * Defines several <code>@FieldMatch</code> annotations on the same element
- *
- * @see FieldMatch
- */
- @Target({TYPE, ANNOTATION_TYPE})
- @Retention(RUNTIME)
- @Documented
- @interface List
- {
- FieldMatch[] value();
- }
-}
+/**
+ *
+ */
+package com.salesmanager.shop.utils;
+
+import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import javax.validation.Constraint;
+import javax.validation.Payload;
+
+
+/**
+ *
+ * Validation annotation to validate that 2 fields have the same value.
+ * An array of fields and their matching confirmation fields can be supplied.
+ *
+ * Example, compare 1 pair of fields:
+ * @FieldMatch(first = "password", second = "confirmPassword", message = "The password fields must match")
+ *
+ * Example, compare more than 1 pair of fields:
+ * @FieldMatch.List({
+ * @FieldMatch(first = "password", second = "confirmPassword", message = "The password fields must match"),
+ * @FieldMatch(first = "email", second = "confirmEmail", message = "The email fields must match")})
+ *
+ * @author Umesh Awasthi
+ *
+ */
+
+@Constraint(validatedBy = FieldMatchValidator.class)
+@Documented
+@Target({TYPE, ANNOTATION_TYPE})
+@Retention(RUNTIME)
+public @interface FieldMatch
+{
+
+ String message() default "Fields are not matching";
+
+ Class<?>[] groups() default {};
+
+ Class<? extends Payload>[] payload() default {};
+
+ /**
+ * @return The first field
+ */
+ String first();
+
+ /**
+ * @return The second field
+ */
+ String second();
+
+ /**
+ * Defines several <code>@FieldMatch</code> annotations on the same element
+ *
+ * @see FieldMatch
+ */
+ @Target({TYPE, ANNOTATION_TYPE})
+ @Retention(RUNTIME)
+ @Documented
+ @interface List
+ {
+ FieldMatch[] value();
+ }
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/utils/FieldMatchValidator.java b/sm-shop/src/main/java/com/salesmanager/shop/utils/FieldMatchValidator.java
index 9a4d74d..6cebb4c 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/utils/FieldMatchValidator.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/utils/FieldMatchValidator.java
@@ -1,45 +1,45 @@
-package com.salesmanager.shop.utils;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-
-import javax.validation.ConstraintValidator;
-import javax.validation.ConstraintValidatorContext;
-
-
-public class FieldMatchValidator implements ConstraintValidator<FieldMatch, Object>
-{
-
- private static final Logger LOG=LoggerFactory.getLogger(FieldMatchValidator.class);
- private String firstFieldName;
- private String secondFieldName;
- private BeanUtils beanUtils;
-
- @Override
- public void initialize(final FieldMatch constraintAnnotation)
- {
- this.firstFieldName = constraintAnnotation.first();
- this.secondFieldName = constraintAnnotation.second();
- this.beanUtils=BeanUtils.newInstance();
- }
-
- @SuppressWarnings( "nls" )
- @Override
- public boolean isValid(final Object value, final ConstraintValidatorContext context)
- {
- try
- {
- final Object firstObj = this.beanUtils.getPropertyValue(value, this.firstFieldName);
- final Object secondObj = this.beanUtils.getPropertyValue(value, this.secondFieldName);
- return firstObj == null && secondObj == null || firstObj != null && firstObj.equals(secondObj);
- }
- catch (final Exception ex)
- {
- LOG.info( "Error while getting values from object", ex );
- return false;
-
- }
-
- }
-}
+package com.salesmanager.shop.utils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+
+
+public class FieldMatchValidator implements ConstraintValidator<FieldMatch, Object>
+{
+
+ private static final Logger LOG=LoggerFactory.getLogger(FieldMatchValidator.class);
+ private String firstFieldName;
+ private String secondFieldName;
+ private BeanUtils beanUtils;
+
+ @Override
+ public void initialize(final FieldMatch constraintAnnotation)
+ {
+ this.firstFieldName = constraintAnnotation.first();
+ this.secondFieldName = constraintAnnotation.second();
+ this.beanUtils=BeanUtils.newInstance();
+ }
+
+ @SuppressWarnings( "nls" )
+ @Override
+ public boolean isValid(final Object value, final ConstraintValidatorContext context)
+ {
+ try
+ {
+ final Object firstObj = this.beanUtils.getPropertyValue(value, this.firstFieldName);
+ final Object secondObj = this.beanUtils.getPropertyValue(value, this.secondFieldName);
+ return firstObj == null && secondObj == null || firstObj != null && firstObj.equals(secondObj);
+ }
+ catch (final Exception ex)
+ {
+ LOG.info( "Error while getting values from object", ex );
+ return false;
+
+ }
+
+ }
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/utils/FilePathUtils.java b/sm-shop/src/main/java/com/salesmanager/shop/utils/FilePathUtils.java
index c2ca426..3285075 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/utils/FilePathUtils.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/utils/FilePathUtils.java
@@ -1,16 +1,16 @@
package com.salesmanager.shop.utils;
-import javax.servlet.http.HttpServletRequest;
import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+
import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
+import com.salesmanager.core.business.utils.CoreConfiguration;
import com.salesmanager.core.model.catalog.product.file.DigitalProduct;
import com.salesmanager.core.model.content.FileContentType;
import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.business.utils.CoreConfiguration;
import com.salesmanager.shop.constants.ApplicationConstants;
import com.salesmanager.shop.constants.Constants;
import com.salesmanager.shop.model.order.ReadableOrderProductDownload;
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/utils/ImageFilePath.java b/sm-shop/src/main/java/com/salesmanager/shop/utils/ImageFilePath.java
index 37f1743..22d281b 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/utils/ImageFilePath.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/utils/ImageFilePath.java
@@ -1,102 +1,102 @@
-package com.salesmanager.shop.utils;
-
-import com.salesmanager.core.model.catalog.product.Product;
-import com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer;
-import com.salesmanager.core.model.merchant.MerchantStore;
-
-public interface ImageFilePath {
-
- /**
- * Context path configured in shopizer-properties.xml
- * @return
- */
- public String getContextPath();
-
-
- public String getBasePath();
-
- /**
- * Builds a static content image file path that can be used by image servlet
- * utility for getting the physical image
- * @param store
- * @param imageName
- * @return
- */
- public String buildStaticImageUtils(MerchantStore store, String imageName);
-
- /**
- * Builds a static content image file path that can be used by image servlet
- * utility for getting the physical image by specifying the image type
- * @param store
- * @param imageName
- * @return
- */
- public String buildStaticImageUtils(MerchantStore store, String type, String imageName);
-
- /**
- * Builds a manufacturer image file path that can be used by image servlet
- * utility for getting the physical image
- * @param store
- * @param manufacturer
- * @param imageName
- * @return
- */
- public String buildManufacturerImageUtils(MerchantStore store, Manufacturer manufacturer, String imageName);
-
- /**
- * Builds a product image file path that can be used by image servlet
- * utility for getting the physical image
- * @param store
- * @param product
- * @param imageName
- * @return
- */
- public String buildProductImageUtils(MerchantStore store, Product product, String imageName);
-
- /**
- * Builds a default product image file path that can be used by image servlet
- * utility for getting the physical image
- * @param store
- * @param sku
- * @param imageName
- * @return
- */
- public String buildProductImageUtils(MerchantStore store, String sku, String imageName);
-
- /**
- * Builds a large product image file path that can be used by the image servlet
- * @param store
- * @param sku
- * @param imageName
- * @return
- */
- public String buildLargeProductImageUtils(MerchantStore store, String sku, String imageName);
-
-
-
- /**
- * Builds a merchant store logo path
- * @param store
- * @return
- */
- public String buildStoreLogoFilePath(MerchantStore store);
-
- /**
- * Builds product property image url path
- * @param store
- * @param imageName
- * @return
- */
- public String buildProductPropertyImageUtils(MerchantStore store, String imageName);
-
-
- /**
- * Builds static file path
- * @param store
- * @param fileName
- * @return
- */
- public String buildStaticContentFilePath(MerchantStore store, String fileName);
-
-
-}
+package com.salesmanager.shop.utils;
+
+import com.salesmanager.core.model.catalog.product.Product;
+import com.salesmanager.core.model.catalog.product.manufacturer.Manufacturer;
+import com.salesmanager.core.model.merchant.MerchantStore;
+
+public interface ImageFilePath {
+
+ /**
+ * Context path configured in shopizer-properties.xml
+ * @return
+ */
+ public String getContextPath();
+
+
+ public String getBasePath();
+
+ /**
+ * Builds a static content image file path that can be used by image servlet
+ * utility for getting the physical image
+ * @param store
+ * @param imageName
+ * @return
+ */
+ public String buildStaticImageUtils(MerchantStore store, String imageName);
+
+ /**
+ * Builds a static content image file path that can be used by image servlet
+ * utility for getting the physical image by specifying the image type
+ * @param store
+ * @param imageName
+ * @return
+ */
+ public String buildStaticImageUtils(MerchantStore store, String type, String imageName);
+
+ /**
+ * Builds a manufacturer image file path that can be used by image servlet
+ * utility for getting the physical image
+ * @param store
+ * @param manufacturer
+ * @param imageName
+ * @return
+ */
+ public String buildManufacturerImageUtils(MerchantStore store, Manufacturer manufacturer, String imageName);
+
+ /**
+ * Builds a product image file path that can be used by image servlet
+ * utility for getting the physical image
+ * @param store
+ * @param product
+ * @param imageName
+ * @return
+ */
+ public String buildProductImageUtils(MerchantStore store, Product product, String imageName);
+
+ /**
+ * Builds a default product image file path that can be used by image servlet
+ * utility for getting the physical image
+ * @param store
+ * @param sku
+ * @param imageName
+ * @return
+ */
+ public String buildProductImageUtils(MerchantStore store, String sku, String imageName);
+
+ /**
+ * Builds a large product image file path that can be used by the image servlet
+ * @param store
+ * @param sku
+ * @param imageName
+ * @return
+ */
+ public String buildLargeProductImageUtils(MerchantStore store, String sku, String imageName);
+
+
+
+ /**
+ * Builds a merchant store logo path
+ * @param store
+ * @return
+ */
+ public String buildStoreLogoFilePath(MerchantStore store);
+
+ /**
+ * Builds product property image url path
+ * @param store
+ * @param imageName
+ * @return
+ */
+ public String buildProductPropertyImageUtils(MerchantStore store, String imageName);
+
+
+ /**
+ * Builds static file path
+ * @param store
+ * @param fileName
+ * @return
+ */
+ public String buildStaticContentFilePath(MerchantStore store, String fileName);
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/utils/LanguageUtils.java b/sm-shop/src/main/java/com/salesmanager/shop/utils/LanguageUtils.java
index 17cb38c..af6f633 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/utils/LanguageUtils.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/utils/LanguageUtils.java
@@ -33,6 +33,7 @@ public class LanguageUtils {
Locale locale = null;
Language language = (Language) request.getSession().getAttribute(Constants.LANGUAGE);
+ MerchantStore store = (MerchantStore)request.getSession().getAttribute(Constants.MERCHANT_STORE);
if(language==null) {
@@ -41,11 +42,11 @@ public class LanguageUtils {
locale = LocaleContextHolder.getLocale();//should be browser locale
- MerchantStore store = (MerchantStore)request.getSession().getAttribute(Constants.MERCHANT_STORE);
+
if(store!=null) {
language = store.getDefaultLanguage();
if(language!=null) {
- locale = languageService.toLocale(language);
+ locale = languageService.toLocale(language, store);
if(locale!=null) {
LocaleContextHolder.setLocale(locale);
}
@@ -78,7 +79,7 @@ public class LanguageUtils {
}
if(language != null) {
- locale = languageService.toLocale(language);
+ locale = languageService.toLocale(language, store);
} else {
language = languageService.toLanguage(locale);
}
@@ -88,6 +89,7 @@ public class LanguageUtils {
localeResolver.setLocale(request, response, locale);
}
response.setLocale(locale);
+ request.getSession().setAttribute(Constants.LANGUAGE, language);
return language;
}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/utils/LocaleUtils.java b/sm-shop/src/main/java/com/salesmanager/shop/utils/LocaleUtils.java
index fe8c147..d1a4600 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/utils/LocaleUtils.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/utils/LocaleUtils.java
@@ -1,50 +1,50 @@
-package com.salesmanager.shop.utils;
-
-import java.util.Locale;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.salesmanager.core.business.constants.Constants;
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.core.model.reference.language.Language;
-
-
-public class LocaleUtils {
-
- private static final Logger LOGGER = LoggerFactory.getLogger(LocaleUtils.class);
-
- public static Locale getLocale(Language language) {
-
- return new Locale(language.getCode());
-
- }
-
- /**
- * Creates a Locale object for currency format only with country code
- * This method ignoes the language
- * @param store
- * @return
- */
- public static Locale getLocale(MerchantStore store) {
-
- Locale defaultLocale = Constants.DEFAULT_LOCALE;
- Locale[] locales = Locale.getAvailableLocales();
- for(int i = 0; i< locales.length; i++) {
- Locale l = locales[i];
- try {
- if(l.getISO3Country().equals(store.getCurrency().getCode())) {
- defaultLocale = l;
- break;
- }
- } catch(Exception e) {
- LOGGER.error("An error occured while getting ISO code for locale " + l.toString());
- }
- }
-
- return defaultLocale;
-
- }
-
-
-}
+package com.salesmanager.shop.utils;
+
+import java.util.Locale;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.salesmanager.core.business.constants.Constants;
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.core.model.reference.language.Language;
+
+
+public class LocaleUtils {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(LocaleUtils.class);
+
+ public static Locale getLocale(Language language) {
+
+ return new Locale(language.getCode());
+
+ }
+
+ /**
+ * Creates a Locale object for currency format only with country code
+ * This method ignoes the language
+ * @param store
+ * @return
+ */
+ public static Locale getLocale(MerchantStore store) {
+
+ Locale defaultLocale = Constants.DEFAULT_LOCALE;
+ Locale[] locales = Locale.getAvailableLocales();
+ for(int i = 0; i< locales.length; i++) {
+ Locale l = locales[i];
+ try {
+ if(l.getISO3Country().equals(store.getCurrency().getCode())) {
+ defaultLocale = l;
+ break;
+ }
+ } catch(Exception e) {
+ LOGGER.error("An error occured while getting ISO code for locale " + l.toString());
+ }
+ }
+
+ return defaultLocale;
+
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/utils/MerchantUtils.java b/sm-shop/src/main/java/com/salesmanager/shop/utils/MerchantUtils.java
index 6a66803..6097175 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/utils/MerchantUtils.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/utils/MerchantUtils.java
@@ -1,26 +1,26 @@
-package com.salesmanager.shop.utils;
-
-import java.util.Date;
-
-import org.apache.commons.lang3.StringUtils;
-
-import com.salesmanager.core.model.merchant.MerchantStore;
-
-public class MerchantUtils {
-
- public String getFooterMessage(MerchantStore store, String prefix, String suffix) {
-
- StringBuilder footerMessage = new StringBuilder();
-
- if(!StringUtils.isBlank(prefix)) {
- footerMessage.append(prefix).append(" ");
- }
-
- Date sinceDate = null;
- String inBusinessSince = store.getDateBusinessSince();
-
-
- return null;
- }
-
-}
+package com.salesmanager.shop.utils;
+
+import java.util.Date;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.salesmanager.core.model.merchant.MerchantStore;
+
+public class MerchantUtils {
+
+ public String getFooterMessage(MerchantStore store, String prefix, String suffix) {
+
+ StringBuilder footerMessage = new StringBuilder();
+
+ if(!StringUtils.isBlank(prefix)) {
+ footerMessage.append(prefix).append(" ");
+ }
+
+ Date sinceDate = null;
+ String inBusinessSince = store.getDateBusinessSince();
+
+
+ return null;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/utils/PageBuilderUtils.java b/sm-shop/src/main/java/com/salesmanager/shop/utils/PageBuilderUtils.java
index 3c1a353..1fb5018 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/utils/PageBuilderUtils.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/utils/PageBuilderUtils.java
@@ -1,17 +1,17 @@
-package com.salesmanager.shop.utils;
-
-import com.salesmanager.core.model.merchant.MerchantStore;
-import com.salesmanager.shop.constants.Constants;
-import com.salesmanager.shop.store.controller.ControllerConstants;
-
-public class PageBuilderUtils {
-
- public static String build404(MerchantStore store) {
- return new StringBuilder().append(ControllerConstants.Tiles.Pages.notFound).append(".").append(store.getStoreTemplate()).toString();
- }
-
- public static String buildHomePage(MerchantStore store) {
- return "redirect:" + Constants.SHOP_URI;
- }
-
-}
+package com.salesmanager.shop.utils;
+
+import com.salesmanager.core.model.merchant.MerchantStore;
+import com.salesmanager.shop.constants.Constants;
+import com.salesmanager.shop.store.controller.ControllerConstants;
+
+public class PageBuilderUtils {
+
+ public static String build404(MerchantStore store) {
+ return new StringBuilder().append(ControllerConstants.Tiles.Pages.notFound).append(".").append(store.getStoreTemplate()).toString();
+ }
+
+ public static String buildHomePage(MerchantStore store) {
+ return "redirect:" + Constants.SHOP_URI;
+ }
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/utils/SessionUtil.java b/sm-shop/src/main/java/com/salesmanager/shop/utils/SessionUtil.java
index 1f681e2..4dffe72 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/utils/SessionUtil.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/utils/SessionUtil.java
@@ -1,31 +1,31 @@
-/**
- *
- */
-package com.salesmanager.shop.utils;
-
-import javax.servlet.http.HttpServletRequest;
-
-/**
- * @author Umesh Awasthi
- *
- */
-public class SessionUtil
-{
-
-
-
- @SuppressWarnings("unchecked")
- public static <T> T getSessionAttribute(final String key, HttpServletRequest request) {
- return (T) request.getSession().getAttribute( key );
- }
-
- public static void removeSessionAttribute(final String key, HttpServletRequest request) {
- request.getSession().removeAttribute( key );
- }
-
- public static void setSessionAttribute(final String key, final Object value, HttpServletRequest request) {
- request.getSession().setAttribute( key, value );
- }
-
-
-}
+/**
+ *
+ */
+package com.salesmanager.shop.utils;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @author Umesh Awasthi
+ *
+ */
+public class SessionUtil
+{
+
+
+
+ @SuppressWarnings("unchecked")
+ public static <T> T getSessionAttribute(final String key, HttpServletRequest request) {
+ return (T) request.getSession().getAttribute( key );
+ }
+
+ public static void removeSessionAttribute(final String key, HttpServletRequest request) {
+ request.getSession().removeAttribute( key );
+ }
+
+ public static void setSessionAttribute(final String key, final Object value, HttpServletRequest request) {
+ request.getSession().setAttribute( key, value );
+ }
+
+
+}
diff --git a/sm-shop/src/main/java/com/salesmanager/shop/utils/TokenizeTool.java b/sm-shop/src/main/java/com/salesmanager/shop/utils/TokenizeTool.java
index 5a452e6..92a22df 100644
--- a/sm-shop/src/main/java/com/salesmanager/shop/utils/TokenizeTool.java
+++ b/sm-shop/src/main/java/com/salesmanager/shop/utils/TokenizeTool.java
@@ -1,48 +1,48 @@
-package com.salesmanager.shop.utils;
-
-import javax.crypto.Cipher;
-import javax.crypto.KeyGenerator;
-import javax.crypto.SecretKey;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class TokenizeTool {
-
- private final static String CIPHER = "AES/ECB/PKCS5Padding";
-
- private static final Logger LOGGER = LoggerFactory.getLogger(TokenizeTool.class);
-
- private TokenizeTool(){}
-
- private static SecretKey key = null;
-
- static {
-
- try {
-
- KeyGenerator keygen = KeyGenerator.getInstance("DES");
- key = keygen.generateKey();
-
- } catch (Exception e) {
- LOGGER.error("Cannot generate key",e);
- }
-
-
-
-
-
- }
-
- public static String tokenizeString(String token) throws Exception {
-
- Cipher aes = Cipher.getInstance(CIPHER);
- aes.init(Cipher.ENCRYPT_MODE, key);
- byte[] ciphertext = aes.doFinal(token.getBytes());
-
- return new String(ciphertext);
-
-
- }
-
-}
+package com.salesmanager.shop.utils;
+
+import javax.crypto.Cipher;
+import javax.crypto.KeyGenerator;
+import javax.crypto.SecretKey;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TokenizeTool {
+
+ private final static String CIPHER = "AES/ECB/PKCS5Padding";
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(TokenizeTool.class);
+
+ private TokenizeTool(){}
+
+ private static SecretKey key = null;
+
+ static {
+
+ try {
+
+ KeyGenerator keygen = KeyGenerator.getInstance("DES");
+ key = keygen.generateKey();
+
+ } catch (Exception e) {
+ LOGGER.error("Cannot generate key",e);
+ }
+
+
+
+
+
+ }
+
+ public static String tokenizeString(String token) throws Exception {
+
+ Cipher aes = Cipher.getInstance(CIPHER);
+ aes.init(Cipher.ENCRYPT_MODE, key);
+ byte[] ciphertext = aes.doFinal(token.getBytes());
+
+ return new String(ciphertext);
+
+
+ }
+
+}
sm-shop/src/main/resources/admin/menu.json 623(+313 -310)
diff --git a/sm-shop/src/main/resources/admin/menu.json b/sm-shop/src/main/resources/admin/menu.json
index 23fae73..728b637 100644
--- a/sm-shop/src/main/resources/admin/menu.json
+++ b/sm-shop/src/main/resources/admin/menu.json
@@ -1,310 +1,313 @@
-{"menus":[
-{
-"menu":{
-"code":"home",
-"icon":"icon-home",
-"url":"/admin/home.html",
-"role":"AUTH",
-"order":0
-}},
-{
-"menu":{
-"code":"store",
-"icon":"icon-file",
-"url":"/admin/store/store.html",
-"role":"STORE",
-"order":1,
-"menus":[
- {"menu":{"code":"storeDetails","url":"/admin/store/store.html","role":"STORE","order":0, "menus":
- [
- {"menu":{
- "code":"storeDetails","url":"/admin/store/store.html","role":"STORE","order":0
- }},
- {"menu":{
- "code":"create-store","url":"/admin/store/createStore.html","role":"SUPERADMIN","order":1
- }},
- {"menu":{
- "code":"store-list","url":"/admin/store/list.html","role":"SUPERADMIN","order":1
- }}
- ]
- }},
- {"menu":{"code":"storeBranding","url":"/admin/store/branding.html","role":"STORE","order":1}},
- {"menu":{"code":"storeLanding","url":"/admin/store/storeLanding.html","role":"STORE","order":2}}
-]
-}},
-{
-"menu":{
-"code":"profile",
-"icon":"icon-info-sign",
-"url":"/admin/users/displayUser.html",
-"role":"AUTH",
-"order":2,
-"menus":[
- {"menu":{
- "code":"user","url":"","role":"AUTH","order":0,"menus":
- [
- {"menu":{
- "code":"myprofile","url":"/admin/user/profile.html","role":"AUTH","order":0
- }},
- {"menu":{
- "code":"change-password","url":"/admin/user/password.html","role":"AUTH","order":1
- }},
- {"menu":{
- "code":"users","url":"","role":"ADMIN","order":2
- }},
- {"menu":{
- "code":"create-user","url":"","role":"ADMIN","order":3
- }}
- ]
-
- }},
- {"menu":{
- "code":"security","url":"","role":"ADMIN","order":1,"menus":
- [
- {"menu":{
- "code":"security-groups","url":"/admin/user/groups.html","role":"ADMIN","order":1
- }}
- ]
- }}
-]
-}},
-{
-"menu":{
-"code":"catalogue",
-"icon":"icon-tags",
-"url":"/admin/products/products.html",
-"role":"PRODUCTS",
-"order":3,
-"menus":[
- {"menu":{
- "code":"catalogue-products","url":"","role":"PRODUCTS","order":0,"menus":
- [
- {"menu":{
- "code":"catalogue-products-create","url":"/admin/products/product.html","role":"PRODUCTS","order":0
- }},
- {"menu":{
- "code":"catalogue","url":"/admin/products/products.html","role":"PRODUCTS","order":2
- }}
- ]
- }},
- {"menu":{
- "code":"catalogue-categories","url":"","role":"PRODUCTS","order":1,"menus":
- [
- {"menu":{
- "code":"catalogue-categories-create","url":"/admin/categories/createCategory.html","role":"PRODUCTS","order":0
- }},
- {"menu":{
- "code":"catalogue-categories-list","url":"/admin/categories/categories.html","role":"PRODUCTS","order":1
- }},
- {"menu":{
- "code":"catalogue-categories-hierarchy","url":"/admin/categories/hierarchy.html","role":"PRODUCTS","order":2
- }}
- ]
- }},
- {"menu":{
- "code":"catalogue-options","url":"","role":"PRODUCTS","order":2,"menus":
- [
- {"menu":{
- "code":"catalogue-options-list","url":"/admin/catalogue/options/options.html","role":"PRODUCTS","order":1
- }},
- {"menu":{
- "code":"catalogue-options-create","url":"/admin/catalogue/options/option.html","role":"PRODUCTS","order":1
- }},
- {"menu":{
- "code":"catalogue-optionsvalues-list","url":"/admin/catalogue/options/optionsvalues.html","role":"PRODUCTS","order":1
- }},
- {"menu":{
- "code":"catalogue-optionsvalues-create","url":"/admin/options/createOptionValue.html","role":"PRODUCTS","order":1
- }}
- ]
- }},
- {"menu":{
- "code":"catalogue-products-group","url":"/admin/catalogue/groups/list.html","role":"PRODUCTS","order":3,"menus":
- [
- {"menu":{
- "code":"catalogue-featured","url":"/admin/catalogue/featured/list.html","role":"PRODUCTS","order":0
- }},
- {"menu":{
- "code":"catalogue-products-custom-group","url":"/admin/catalogue/groups/list.html","role":"PRODUCTS","order":1
- }}
- ]
- }},
- {"menu":{
- "code":"manufacturer-list","url":"","role":"PRODUCTS","order":4,"menus":
- [
- {"menu":{
- "code":"manufacturer-list","url":"/admin/catalogue/manufacturer/list.html","role":"PRODUCTS","order":0
- }},
- {"menu":{
- "code":"manufacturer-create","url":"/admin/catalogue/manufacturer/create.html","role":"PRODUCTS","order":1
- }}
- ]
- }}
-]
-}},
-
-
-
-
-{
-"menu":{
-"code":"content",
-"icon":"icon-pencil",
-"url":"/admin/content/pages/list.html",
-"role":"CONTENT",
-"order":4,
-"menus":[
- {"menu":{
- "code":"content-pages","url":"","role":"CONTENT","order":0,"menus":
- [
- {"menu":{
- "code":"content-pages","url":"/admin/content/pages/list.html","role":"CONTENT","order":0
- }},
- {"menu":{
- "code":"content-pages-create","url":"/admin/content/pages/create.html","role":"CONTENT","order":1
- }}
- ]
-
- }},
- {"menu":{
- "code":"content-boxes","url":"","role":"CONTENT","order":1,"menus":
- [
- {"menu":{
- "code":"content-boxes","url":"/admin/content/boxes/list.html","role":"CONTENT","order":0
- }},
- {"menu":{
- "code":"content-boxes-create","url":"/admin/content/boxes/create.html","role":"CONTENT","order":1
- }}
- ]
-
- }},
- {"menu":{"code":"content-images","url":"","role":"CONTENT","order":0}},
- {"menu":{"code":"content-files","url":"","role":"CONTENT","order":0}}
-]
-}},
-{
-"menu":{
-"code":"shipping",
-"icon":"icon-plane",
-"url":"/admin/shipping/shippingConfigs.html",
-"role":"SHIPPING",
-"order":5,
-"menus":[
- {"menu":{"code":"shipping-configs","url":"","role":"SHIPPING","order":0}},
- {"menu":{"code":"shipping-methods","url":"","role":"SHIPPING","order":2}},
- {"menu":{"code":"shipping-origin","url":"","role":"SHIPPING","order":3}},
- {"menu":{"code":"shipping-options","url":"","role":"SHIPPING","order":4}},
- {"menu":{"code":"shipping-packages","url":"","role":"SHIPPING","order":6}}
-]
-}},
-{
-"menu":{
-"code":"payment",
-"icon":"icon-cog",
-"url":"/admin/payments/paymentMethods.html",
-"role":"PAYMENT",
-"order":6
-}},
-{
-"menu":{
-"code":"customer",
-"icon":"icon-user",
-"url":"/admin/customers/list.html",
-"role":"CUSTOMER",
-"order":7,
-"menus":[
- {"menu":{
- "code":"customer-list","url":"","role":"CUSTOMER","order":0,"menus":
- [
- {"menu":{
- "code":"customer-list","url":"/admin/customers/list.html","role":"CUSTOMER","order":0
- }},
- {"menu":{
- "code":"customer-create","url":"/admin/customers/customer.html","role":"CUSTOMER","order":1
- }}
- ]
- }},
- {"menu":{
- "code":"customer-options","url":"","role":"CUSTOMER","order":1,"menus":
- [
- {"menu":{
- "code":"customer-options-list","url":"/admin/customers/options/list.html","role":"CUSTOMER","order":0
- }},
- {"menu":{
- "code":"customer-options-create","url":"/admin/customers/options/create.html","role":"CUSTOMER","order":1
- }},
- {"menu":{
- "code":"customer-options-values-list","url":"/admin/customers/options/values/list.html","role":"CUSTOMER","order":2
- }},
- {"menu":{
- "code":"customer-options-values-create","url":"/admin/customers/options/values/create.html","role":"CUSTOMER","order":3
- }},
- {"menu":{
- "code":"customer-options-set","url":"/admin/customers/optionsset/list.html","role":"CUSTOMER","order":4
- }}
- ]
- }}
-]
-}},
-{
-"menu":{
-"code":"order",
-"icon":"icon-shopping-cart",
-"url":"/admin/orders/list.html",
-"role":"ORDER",
-"order":8,
-"menus":[
- {"menu":{
- "code":"order-list","url":"/admin/orders/list.html","role":"ORDER","order":0
- }}
-]
-}},
-{
-"menu":{
-"code":"tax",
-"icon":"icon-book",
-"url":"/admin/tax/taxconfiguration/edit.html",
-"role":"TAX",
-"order":9,
-"menus":[
- {"menu":{
- "code":"taxconfiguration","url":"/admin/tax/taxconfiguration/edit.html","role":"TAX","order":0
- }},
- {"menu":{
- "code":"taxclass","url":"/admin/tax/taxclass/list.html","role":"TAX","order":1
- }},
- {"menu":{
- "code":"taxrates","url":"/admin/tax/taxrates/list.html","role":"TAX","order":2
- }}
-]
-}},
-{
-"menu":{
-"code":"cache",
-"icon":"icon-th",
-"url":"/admin/cache/cacheManagement.html",
-"role":"AUTH",
-"order":10
-}},
-{
-"menu":{
-"code":"configuration",
-"icon":"icon-wrench",
-"url":"/admin/configuration/accounts.html",
-"role":"AUTH",
-"order":11,
-"menus":[
- {"menu":{
- "code":"accounts-conf","url":"/admin/configuration/accounts.html","role":"AUTH","order":0
- }},
- {"menu":{
- "code":"email-conf","url":"/admin/configuration/email.html","role":"AUTH","order":1
- }},
- {"menu":{
- "code":"system-configurations","url":"/admin/configuration/system.html","role":"AUTH","order":2
- }}
-]
-}}
-]}
-
-
+{"menus":[
+{
+"menu":{
+"code":"home",
+"icon":"icon-home",
+"url":"/admin/home.html",
+"role":"AUTH",
+"order":0
+}},
+{
+"menu":{
+"code":"store",
+"icon":"icon-file",
+"url":"/admin/store/store.html",
+"role":"STORE",
+"order":1,
+"menus":[
+ {"menu":{"code":"storeDetails","url":"/admin/store/store.html","role":"STORE","order":0, "menus":
+ [
+ {"menu":{
+ "code":"storeDetails","url":"/admin/store/store.html","role":"STORE","order":0
+ }},
+ {"menu":{
+ "code":"create-store","url":"/admin/store/createStore.html","role":"SUPERADMIN","order":1
+ }},
+ {"menu":{
+ "code":"store-list","url":"/admin/store/list.html","role":"SUPERADMIN","order":1
+ }}
+ ]
+ }},
+ {"menu":{"code":"storeBranding","url":"/admin/store/branding.html","role":"STORE","order":1}},
+ {"menu":{"code":"storeLanding","url":"/admin/store/storeLanding.html","role":"STORE","order":2}}
+]
+}},
+{
+"menu":{
+"code":"profile",
+"icon":"icon-info-sign",
+"url":"/admin/users/displayUser.html",
+"role":"AUTH",
+"order":2,
+"menus":[
+ {"menu":{
+ "code":"user","url":"","role":"AUTH","order":0,"menus":
+ [
+ {"menu":{
+ "code":"myprofile","url":"/admin/user/profile.html","role":"AUTH","order":0
+ }},
+ {"menu":{
+ "code":"change-password","url":"/admin/user/password.html","role":"AUTH","order":1
+ }},
+ {"menu":{
+ "code":"users","url":"","role":"ADMIN","order":2
+ }},
+ {"menu":{
+ "code":"create-user","url":"","role":"ADMIN","order":3
+ }}
+ ]
+
+ }},
+ {"menu":{
+ "code":"security","url":"","role":"ADMIN","order":1,"menus":
+ [
+ {"menu":{
+ "code":"security-groups","url":"/admin/user/groups.html","role":"ADMIN","order":1
+ }},
+ {"menu":{
+ "code":"security-create-group","url":"/admin/groups/new.html","role":"ADMIN","order":2
+ }}
+ ]
+ }}
+]
+}},
+{
+"menu":{
+"code":"catalogue",
+"icon":"icon-tags",
+"url":"/admin/products/products.html",
+"role":"PRODUCTS",
+"order":3,
+"menus":[
+ {"menu":{
+ "code":"catalogue-products","url":"","role":"PRODUCTS","order":0,"menus":
+ [
+ {"menu":{
+ "code":"catalogue-products-create","url":"/admin/products/createProduct.html","role":"PRODUCTS","order":0
+ }},
+ {"menu":{
+ "code":"catalogue","url":"/admin/products/products.html","role":"PRODUCTS","order":2
+ }}
+ ]
+ }},
+ {"menu":{
+ "code":"catalogue-categories","url":"","role":"PRODUCTS","order":1,"menus":
+ [
+ {"menu":{
+ "code":"catalogue-categories-create","url":"/admin/categories/createCategory.html","role":"PRODUCTS","order":0
+ }},
+ {"menu":{
+ "code":"catalogue-categories-list","url":"/admin/categories/categories.html","role":"PRODUCTS","order":1
+ }},
+ {"menu":{
+ "code":"catalogue-categories-hierarchy","url":"/admin/categories/hierarchy.html","role":"PRODUCTS","order":2
+ }}
+ ]
+ }},
+ {"menu":{
+ "code":"catalogue-options","url":"","role":"PRODUCTS","order":2,"menus":
+ [
+ {"menu":{
+ "code":"catalogue-options-list","url":"/admin/catalogue/options/options.html","role":"PRODUCTS","order":1
+ }},
+ {"menu":{
+ "code":"catalogue-options-create","url":"/admin/catalogue/options/option.html","role":"PRODUCTS","order":1
+ }},
+ {"menu":{
+ "code":"catalogue-optionsvalues-list","url":"/admin/catalogue/options/optionsvalues.html","role":"PRODUCTS","order":1
+ }},
+ {"menu":{
+ "code":"catalogue-optionsvalues-create","url":"/admin/options/createOptionValue.html","role":"PRODUCTS","order":1
+ }}
+ ]
+ }},
+ {"menu":{
+ "code":"catalogue-products-group","url":"/admin/catalogue/groups/list.html","role":"PRODUCTS","order":3,"menus":
+ [
+ {"menu":{
+ "code":"catalogue-featured","url":"/admin/catalogue/featured/list.html","role":"PRODUCTS","order":0
+ }},
+ {"menu":{
+ "code":"catalogue-products-custom-group","url":"/admin/catalogue/groups/list.html","role":"PRODUCTS","order":1
+ }}
+ ]
+ }},
+ {"menu":{
+ "code":"manufacturer-list","url":"","role":"PRODUCTS","order":4,"menus":
+ [
+ {"menu":{
+ "code":"manufacturer-list","url":"/admin/catalogue/manufacturer/list.html","role":"PRODUCTS","order":0
+ }},
+ {"menu":{
+ "code":"manufacturer-create","url":"/admin/catalogue/manufacturer/create.html","role":"PRODUCTS","order":1
+ }}
+ ]
+ }}
+]
+}},
+
+
+
+
+{
+"menu":{
+"code":"content",
+"icon":"icon-pencil",
+"url":"/admin/content/pages/list.html",
+"role":"CONTENT",
+"order":4,
+"menus":[
+ {"menu":{
+ "code":"content-pages","url":"","role":"CONTENT","order":0,"menus":
+ [
+ {"menu":{
+ "code":"content-pages","url":"/admin/content/pages/list.html","role":"CONTENT","order":0
+ }},
+ {"menu":{
+ "code":"content-pages-create","url":"/admin/content/pages/create.html","role":"CONTENT","order":1
+ }}
+ ]
+
+ }},
+ {"menu":{
+ "code":"content-boxes","url":"","role":"CONTENT","order":1,"menus":
+ [
+ {"menu":{
+ "code":"content-boxes","url":"/admin/content/boxes/list.html","role":"CONTENT","order":0
+ }},
+ {"menu":{
+ "code":"content-boxes-create","url":"/admin/content/boxes/create.html","role":"CONTENT","order":1
+ }}
+ ]
+
+ }},
+ {"menu":{"code":"content-images","url":"","role":"CONTENT","order":0}},
+ {"menu":{"code":"content-files","url":"","role":"CONTENT","order":0}}
+]
+}},
+{
+"menu":{
+"code":"shipping",
+"icon":"icon-plane",
+"url":"/admin/shipping/shippingConfigs.html",
+"role":"SHIPPING",
+"order":5,
+"menus":[
+ {"menu":{"code":"shipping-configs","url":"","role":"SHIPPING","order":0}},
+ {"menu":{"code":"shipping-methods","url":"","role":"SHIPPING","order":2}},
+ {"menu":{"code":"shipping-origin","url":"","role":"SHIPPING","order":3}},
+ {"menu":{"code":"shipping-options","url":"","role":"SHIPPING","order":4}},
+ {"menu":{"code":"shipping-packages","url":"","role":"SHIPPING","order":6}}
+]
+}},
+{
+"menu":{
+"code":"payment",
+"icon":"icon-cog",
+"url":"/admin/payments/paymentMethods.html",
+"role":"PAYMENT",
+"order":6
+}},
+{
+"menu":{
+"code":"customer",
+"icon":"icon-user",
+"url":"/admin/customers/list.html",
+"role":"CUSTOMER",
+"order":7,
+"menus":[
+ {"menu":{
+ "code":"customer-list","url":"","role":"CUSTOMER","order":0,"menus":
+ [
+ {"menu":{
+ "code":"customer-list","url":"/admin/customers/list.html","role":"CUSTOMER","order":0
+ }},
+ {"menu":{
+ "code":"customer-create","url":"/admin/customers/customer.html","role":"CUSTOMER","order":1
+ }}
+ ]
+ }},
+ {"menu":{
+ "code":"customer-options","url":"","role":"CUSTOMER","order":1,"menus":
+ [
+ {"menu":{
+ "code":"customer-options-list","url":"/admin/customers/options/list.html","role":"CUSTOMER","order":0
+ }},
+ {"menu":{
+ "code":"customer-options-create","url":"/admin/customers/options/create.html","role":"CUSTOMER","order":1
+ }},
+ {"menu":{
+ "code":"customer-options-values-list","url":"/admin/customers/options/values/list.html","role":"CUSTOMER","order":2
+ }},
+ {"menu":{
+ "code":"customer-options-values-create","url":"/admin/customers/options/values/create.html","role":"CUSTOMER","order":3
+ }},
+ {"menu":{
+ "code":"customer-options-set","url":"/admin/customers/optionsset/list.html","role":"CUSTOMER","order":4
+ }}
+ ]
+ }}
+]
+}},
+{
+"menu":{
+"code":"order",
+"icon":"icon-shopping-cart",
+"url":"/admin/orders/list.html",
+"role":"ORDER",
+"order":8,
+"menus":[
+ {"menu":{
+ "code":"order-list","url":"/admin/orders/list.html","role":"ORDER","order":0
+ }}
+]
+}},
+{
+"menu":{
+"code":"tax",
+"icon":"icon-book",
+"url":"/admin/tax/taxconfiguration/edit.html",
+"role":"TAX",
+"order":9,
+"menus":[
+ {"menu":{
+ "code":"taxconfiguration","url":"/admin/tax/taxconfiguration/edit.html","role":"TAX","order":0
+ }},
+ {"menu":{
+ "code":"taxclass","url":"/admin/tax/taxclass/list.html","role":"TAX","order":1
+ }},
+ {"menu":{
+ "code":"taxrates","url":"/admin/tax/taxrates/list.html","role":"TAX","order":2
+ }}
+]
+}},
+{
+"menu":{
+"code":"cache",
+"icon":"icon-th",
+"url":"/admin/cache/cacheManagement.html",
+"role":"AUTH",
+"order":10
+}},
+{
+"menu":{
+"code":"configuration",
+"icon":"icon-wrench",
+"url":"/admin/configuration/accounts.html",
+"role":"AUTH",
+"order":11,
+"menus":[
+ {"menu":{
+ "code":"accounts-conf","url":"/admin/configuration/accounts.html","role":"AUTH","order":0
+ }},
+ {"menu":{
+ "code":"email-conf","url":"/admin/configuration/email.html","role":"AUTH","order":1
+ }},
+ {"menu":{
+ "code":"system-configurations","url":"/admin/configuration/system.html","role":"AUTH","order":2
+ }}
+]
+}}
+]}
+
+
diff --git a/sm-shop/src/main/resources/application.properties b/sm-shop/src/main/resources/application.properties
index a53e412..c499e79 100644
--- a/sm-shop/src/main/resources/application.properties
+++ b/sm-shop/src/main/resources/application.properties
@@ -1,5 +1,13 @@
-logging.level.org.springframework.web: DEBUG
-logging.level.org.springframework.security: DEBUG
+#Spring boot configurations
+#logging.config=log4j-shopizer.properties
+
+#when running from IDE (eclipse) or from springboot:run command
+#server.contextPath=/shopizer
+
+logging.level.org.springframework.web: INFO
+logging.level.org.springframework.security: INFO
+logging.level.com.shopizer: DEBUG
+#logging.file=shopizer.log
#Default Spring white label error page
server.error.whitelabel.enabled=false
@@ -9,3 +17,7 @@ multipart.max-request-size=10Mb
+
+
+
+
sm-shop/src/main/resources/bundles/messages.properties 426(+215 -211)
diff --git a/sm-shop/src/main/resources/bundles/messages.properties b/sm-shop/src/main/resources/bundles/messages.properties
index a0c37a0..41c3ff3 100644
--- a/sm-shop/src/main/resources/bundles/messages.properties
+++ b/sm-shop/src/main/resources/bundles/messages.properties
@@ -1,211 +1,215 @@
-message.success=Request completed with success
-message.error=An error occurred in this request
-message.email.success=Your message has been sent
-message.productreview.created=You have successfully created a product review
-message.email.error=An error occurred while sending your message, pleas try again later
-message.access.denied=Access denied
-message.error.shoppingcart.update=An error occurred while updating the shopping cart
-message.username.password=Login Failed. Username or Password is incorrect.
-message.resource.notfound=The requested page does not exist.
-message.fielderror=Field error
-message.timeout=The session timed out.
-message.error.shipping=An error occurred while estimating shipping costs
-NotEmpty=Field required
-currentpassword.not.empty=Current password should not be empty
-password.notequal=New password and check password should be equals
-newpassword.not.empty=New password should not be empty and should be 6 characters long
-repeatpassword.not.empty=Check password should not be empty and should be 6 characters long
-
-NotEmpty.store.storename=The store name should not be empty
-NotEmpty.store.storeEmailAddress=Store email address should not be empty
-Email.store.storeEmailAddress=Store email address is invalid
-NotEmpty.product.productPrice=The product price must be specified
-NotEmpty.product.manufacturer=The product manufacturer is required
-NotEmpty.price.code=The price code is required
-Pattern.price.code=The price code must be alphanumeric
-Pattern.product.sku=The sku must be alphanumeric
-Pattern.merchant.code=The merchant store code must be alphanumeric
-Pattern.optionValue.code=The code must be alphanumeric
-NotEmpty.optionValue.code=The code should not be empty
-Pattern.option.code=The code must be alphanumeric
-NotEmpty.option.code=The code should not be empty
-NotEmpty.keyword.keyword=The keyword cannot be empty
-NotEmpty.review.description=Your opinion is required
-
-NotEmpty.customer.userName=User name is required
-NotEmpty.customer.firstName=First name is required
-NotEmpty.customer.lastName=Last name is required
-NotEmpty.customer.address=Street address is required
-NotEmpty.customer.address2=Street address is required
-NotEmpty.customer.postalCode=Postal code is required
-NotEmpty.customer.stateProvince=State / Province is required
-NotEmpty.customer.phone=Phone number is required
-NotEmpty.customer.city=City is required
-NotEmpty.customer.agreement=Please agree to our terms and conditions
-
-NotEmpty.origin.address=Street address is required
-NotEmpty.origin.postalCode=Postal code is required
-NotEmpty.origin.city=City is required
-NotEmpty.origin.country=Country is required
-
-NotEmpty.customer.emailAddress=Email address is required
-Email.customer.emailAddress=Email address is invalid
-NotEmpty.customer.billing.phone=Phone number is required
-NotEmpty.customer.billing.address=Street address is required
-NotEmpty.customer.billing.city=City is required
-NotEmpty.customer.billing.postalCode=Postal code is required
-NotEmpty.customer.billing.country=Country is required
-NotEmpty.customer.billing.stateProvince=State / Province is required
-
-NotEmpty.customer.shipping.firstName=Shipping first name should not be empty
-NotEmpty.customer.shipping.lastName=Shipping last name should not be empty
-NotEmpty.customer.shipping.address=Shipping street address should not be empty
-NotEmpty.customer.shipping.city=Shipping city should not be empty
-NotEmpty.customer.shipping.postalCode=Shipping postal code should not be empty
-NotEmpty.customer.shipping.phone=Shipping phone should not be empty
-NotEmpty.customer.shipping.stateProvince=Shipping State / Province is required
-
-NotEmpty.order.creditcard.number=A valid credit card number is required
-NotEmpty.order.creditcard.name=Credit card holder's name is required
-NotEmpty.order.creditcard.cvv=Credit card validation digit is required
-NotEmpty.contact.name=Contact name is required
-NotEmpty.contact.subject=Contact subject is required
-NotEmpty.contact.comment=Comment is required
-Email.contact.email=Email format is invalid
-NotEmpty.contact.captchaResponseField=Captcha answer is required
-NotEmpty.contact.captchaChallengeField=Captcha challenge question is required
-
-message.order.canprocess=The order can be completed
-message.name.required=The object name is required
-
-message.code.exist=This code already exist
-message.invalid.amount=Invalid amount
-message.region.exists=Region already exist
-message.region.null=Region cannot be empty
-message.invalid.price=Price format is invalid
-message.invalid.rate=Rate format is invalid
-message.invalid.date=Invalid date format
-message.maximumWeight.null=Maximum weight cannot be empty
-message.maximumWeight.invalid=Maximum weight needs to be greater than 0
-message.unauthorized=This transaction cannot be completed
-message.code.available=This code is available
-message.image.height=Image height too large
-message.image.width=Image width too large
-message.image.size=Image too big
-message.number.invalid=Must be a valid number (eg 5)
-message.productoption.required=A product attribute/option is required
-message.productoptionvalue.required=A product attribute/option value is required
-message.product.language=The product has not been configured with this language. Edit the product and configure it with this language.
-
-message.password.required=A password is required
-message.password.repeat.required=Repeated password is required
-message.username.required=User name is required
-message.username.notfound=User name not found
-message.price.cents=Please enter a maximum of 99 cents
-message.security.cannotrevoke.superadmin=Can't revoke Super Admin group
-message.cannot.empty=can't be empty
-message.password.different=New password and repeat password must be identical
-message.password.invalid=Invalid password
-message.password.length=Password must be at least 6 characters
-message.password.reset=Password has been reset
-message.password.checkpassword.identical=Both password must match
-message.credentials.reset=Credentials have been changed
-
-message.security.caanotremovesuperadmin=Can't remove super admin user
-
-message.group.alerady.exists=The group {0} already exists
-message.group.required=The group is required
-
-message.product.association=This entity is attached to one or more products, remove the association before trying to delete.
-message.notexist.customer=Customer does not exist
-message.optionset.optionassociationexists=The option association already exist
-message.optionset.noassociation=Select an option and an option value
-
-messages.error.creditcard.number=Credit card number is not valid
-messages.error.creditcard.dateformat=Credit card expiration date is invalid
-messages.error.creditcard.cvc=Credit card verification digits are invalid
-
-
-message.payment.declined=Payment transaction has been declined
-message.payment.error=Got an error while processing the payment, please use another payment method
-
-message.content.missing.agreement=Content with code 'agreement' does not exist
-
-merchant.storeId.invalid=Please provide a merchant store
-merchant.files.invalid=Please provide file(s) to be uploaded.
-merchant.zone.invalid=Store state/province is required
-
-NotEmpty.order.customerFirstName=Customer first name should not be empty
-NotEmpty.order.customerLastName=Customer last name should not be empty
-NotEmpty.order.customerStreetAddress=Customer street address should not be empty
-NotEmpty.order.customerCity=Customer city should not be empty
-NotEmpty.order.customerPostCode=Customer postal code should not be empty
-NotEmpty.order.customerTelephone=Customer phone should not be empty
-Email.order.customerEmailAddress=Customer email address is invalid
-NotEmpty.order.customerEmailAddress=Customer email address should not be empty
-
-
-NotEmpty.order.billingName=Billing name should not be empty
-NotEmpty.order.billingStreetAddress=Billing street address should not be empty
-NotEmpty.order.billingCity=Billing city should not be empty
-NotEmpty.order.billingState=Billing state should not be empty
-NotEmpty.order.billingPostCode=Billing postal code should not be empty
-
-
-NotEmpty.customer.FirstName=Customer first name should not be empty
-NotEmpty.customer.LastName=Customer last name should not be empty
-NotEmpty.customer.StreetAddress=Customer street address should not be empty
-NotEmpty.customer.City=Customer city should not be empty
-NotEmpty.customer.Country=Customer country should not be empty
-NotEmpty.customer.PostCode=Customer postal code should not be empty
-NotEmpty.customer.Telephone=Customer phone should not be empty
-Email.customer.EmailAddress=Customer email address is invalid
-NotEmpty.customer.EmailAddress=Customer email address should not be empty
-
-NotEmpty.customer.billingCompany=Billing company name should not be empty
-NotEmpty.customer.billingFirstName=Billing first name should not be empty
-NotEmpty.customer.billingLastName=Billing last name should not be empty
-NotEmpty.customer.billingStreetAddress=Billing street address should not be empty
-NotEmpty.customer.billingCity=Billing city should not be empty
-NotEmpty.customer.billingState=Billing state should not be empty
-NotEmpty.customer.billingCountry=Billing country should not be empty
-NotEmpty.customer.billingPostCode=Billing postal code should not be empty
-
-NotEmpty.customer.shippingCountry=Shipping country should not be empty
-
-NotEmpty.taxClass.code=Tax Class code is required
-NotEmpty.taxClass.title=Tax Class name is required
-message.taxclass.alreadyexist=Tax Class code already exist
-NotEmpty.taxRate.code=Tax Rate code must not be empty
-NotEmpty.taxRate.unique.code=Tax Rate code must be unique
-NotEmpty.taxRate.rateText=Tax Rate must not be empty
-NotEmpty.taxRateDescription.name=Tax Rate name must not be empty
-NotNull.taxRate.parent=Parent tax rate must be selected
-
-message.noshipping.configured=No shipping method configured
-message.noshipping=No shipping available
-message.noshippingerror=No shipping available, please check your shipping country, state / province and postal code
-
-message.login.duallogin=Dual login not authorized on the same browser
-
-User.resetPassword.resetSuccess=Successfully changed password, please check your Email
-User.resetPassword.wrongSecurityQtn=Wrong Security Question/Answer Entered
-User.resetPassword.userNotFound=Specified User Not Found
-User.resetPassword.Error=An error occured, please contact the administrator
-
-validaion.recaptcha.not.matched=Recaptcha does not matched with user input
-registration.username.not.empty=Please provide user name
-registration.username.length.invalid=User name must be at least 6 characters long
-registration.password.not.empty=Please provide a valid password
-registration.firstName.invalid=Please provide first name
-registration.lastName.invalid=Please provide last name
-messages.invalid.email=Please provide a valid email address.
-registration.username.already.exists = User with user name already exists for this store.
-registration.failed=Unable to complete registration, please try again later
-currentpassword.not.empty=Please provide your current password
-newpassword.not.empty=Please provide a new password
-repeatpassword.not.empty=Please provide repeated password
-message.invalidpassword=Invalid password
-
-error.code.99=An error occured while trying to process the payment
-
+message.success=Request completed with success
+message.error=An error occurred in this request
+message.email.success=Your message has been sent
+message.productreview.created=You have successfully created a product review
+message.email.error=An error occurred while sending your message, pleas try again later
+message.access.denied=Access denied
+message.error.shoppingcart.update=An error occurred while updating the shopping cart
+message.username.password=Login Failed. Username or Password is incorrect.
+message.resource.notfound=The requested page does not exist.
+message.fielderror=Field error
+message.timeout=The session timed out.
+message.error.shipping=An error occurred while estimating shipping costs
+NotEmpty=Field required
+currentpassword.not.empty=Current password should not be empty
+password.notequal=New password and check password should be equals
+newpassword.not.empty=New password should not be empty and should be 6 characters long
+repeatpassword.not.empty=Check password should not be empty and should be 6 characters long
+
+NotEmpty.store.storename=The store name should not be empty
+NotEmpty.store.storeEmailAddress=Store email address should not be empty
+Email.store.storeEmailAddress=Store email address is invalid
+NotEmpty.product.productPrice=The product price must be specified
+NotEmpty.product.manufacturer=The product manufacturer is required
+NotEmpty.price.code=The price code is required
+Pattern.price.code=The price code must be alphanumeric
+Pattern.product.sku=The sku must be alphanumeric
+Pattern.merchant.code=The merchant store code must be alphanumeric
+Pattern.optionValue.code=The code must be alphanumeric
+NotEmpty.optionValue.code=The code should not be empty
+Pattern.option.code=The code must be alphanumeric
+NotEmpty.option.code=The code should not be empty
+NotEmpty.keyword.keyword=The keyword cannot be empty
+NotEmpty.review.description=Your opinion is required
+NotEmpty.group.groupType=Group type is required
+NotEmpty.group.groupName=Group name is required
+
+NotEmpty.customer.userName=User name is required
+NotEmpty.customer.firstName=First name is required
+NotEmpty.customer.lastName=Last name is required
+NotEmpty.customer.address=Street address is required
+NotEmpty.customer.address2=Street address is required
+NotEmpty.customer.postalCode=Postal code is required
+NotEmpty.customer.stateProvince=State / Province is required
+NotEmpty.customer.phone=Phone number is required
+NotEmpty.customer.city=City is required
+NotEmpty.customer.agreement=Please agree to our terms and conditions
+
+NotEmpty.origin.address=Street address is required
+NotEmpty.origin.postalCode=Postal code is required
+NotEmpty.origin.city=City is required
+NotEmpty.origin.country=Country is required
+
+NotEmpty.customer.emailAddress=Email address is required
+Email.customer.emailAddress=Email address is invalid
+NotEmpty.customer.billing.phone=Phone number is required
+NotEmpty.customer.billing.address=Street address is required
+NotEmpty.customer.billing.city=City is required
+NotEmpty.customer.billing.postalCode=Postal code is required
+NotEmpty.customer.billing.country=Country is required
+NotEmpty.customer.billing.stateProvince=State / Province is required
+
+NotEmpty.customer.shipping.firstName=Shipping first name should not be empty
+NotEmpty.customer.shipping.lastName=Shipping last name should not be empty
+NotEmpty.customer.shipping.address=Shipping street address should not be empty
+NotEmpty.customer.shipping.city=Shipping city should not be empty
+NotEmpty.customer.shipping.postalCode=Shipping postal code should not be empty
+NotEmpty.customer.shipping.phone=Shipping phone should not be empty
+NotEmpty.customer.shipping.stateProvince=Shipping State / Province is required
+
+NotEmpty.order.creditcard.number=A valid credit card number is required
+NotEmpty.order.creditcard.name=Credit card holder's name is required
+NotEmpty.order.creditcard.cvv=Credit card validation digit is required
+NotEmpty.contact.name=Contact name is required
+NotEmpty.contact.subject=Contact subject is required
+NotEmpty.contact.comment=Comment is required
+Email.contact.email=Email format is invalid
+NotEmpty.contact.captchaResponseField=Captcha answer is required
+NotEmpty.contact.captchaChallengeField=Captcha challenge question is required
+
+message.order.canprocess=The order can be completed
+message.name.required=The object name is required
+
+message.code.exist=This code already exist
+message.name.exist=This name already exist
+message.invalid.amount=Invalid amount
+message.region.exists=Region already exist
+message.region.null=Region cannot be empty
+message.invalid.price=Price format is invalid
+message.invalid.rate=Rate format is invalid
+message.invalid.date=Invalid date format
+message.maximumWeight.null=Maximum weight cannot be empty
+message.maximumWeight.invalid=Maximum weight needs to be greater than 0
+message.unauthorized=This transaction cannot be completed
+message.code.available=This code is available
+message.image.height=Image height too large
+message.image.width=Image width too large
+message.image.size=Image too big
+message.number.invalid=Must be a valid number (eg 5)
+message.productoption.required=A product attribute/option is required
+message.productoptionvalue.required=A product attribute/option value is required
+message.product.language=The product has not been configured with this language. Edit the product and configure it with this language.
+
+message.password.required=A password is required
+message.password.repeat.required=Repeated password is required
+message.username.required=User name is required
+message.username.notfound=User name not found
+message.price.cents=Please enter a maximum of 99 cents
+message.security.cannotrevoke.superadmin=Can't revoke Super Admin group
+message.cannot.empty=can't be empty
+message.password.different=New password and repeat password must be identical
+message.password.invalid=Invalid password
+message.password.length=Password must be at least 6 characters
+message.password.reset=Password has been reset
+message.password.checkpassword.identical=Both password must match
+message.credentials.reset=Credentials have been changed
+
+message.security.caanotremovesuperadmin=Can't remove super admin user
+
+message.group.alerady.exists=The group {0} already exists
+message.group.required=The group is required
+
+message.product.association=This entity is attached to one or more products, remove the association before trying to delete.
+message.notexist.customer=Customer does not exist
+message.optionset.optionassociationexists=The option association already exist
+message.optionset.noassociation=Select an option and an option value
+
+messages.error.creditcard=Credit card data is invalid
+messages.error.creditcard.number=Credit card number is not valid
+messages.error.creditcard.dateformat=Credit card expiration date is invalid
+messages.error.creditcard.cvc=Credit card verification digits are invalid
+
+
+message.payment.declined=Payment transaction has been declined
+message.payment.error=Got an error while processing the payment, please use another payment method
+
+message.content.missing.agreement=Content with code 'agreement' does not exist
+
+merchant.storeId.invalid=Please provide a merchant store
+merchant.files.invalid=Please provide file(s) to be uploaded.
+merchant.zone.invalid=Store state/province is required
+
+NotEmpty.order.customerFirstName=Customer first name should not be empty
+NotEmpty.order.customerLastName=Customer last name should not be empty
+NotEmpty.order.customerStreetAddress=Customer street address should not be empty
+NotEmpty.order.customerCity=Customer city should not be empty
+NotEmpty.order.customerPostCode=Customer postal code should not be empty
+NotEmpty.order.customerTelephone=Customer phone should not be empty
+Email.order.customerEmailAddress=Customer email address is invalid
+NotEmpty.order.customerEmailAddress=Customer email address should not be empty
+
+
+NotEmpty.order.billingName=Billing name should not be empty
+NotEmpty.order.billingStreetAddress=Billing street address should not be empty
+NotEmpty.order.billingCity=Billing city should not be empty
+NotEmpty.order.billingState=Billing state should not be empty
+NotEmpty.order.billingPostCode=Billing postal code should not be empty
+
+
+NotEmpty.customer.FirstName=Customer first name should not be empty
+NotEmpty.customer.LastName=Customer last name should not be empty
+NotEmpty.customer.StreetAddress=Customer street address should not be empty
+NotEmpty.customer.City=Customer city should not be empty
+NotEmpty.customer.Country=Customer country should not be empty
+NotEmpty.customer.PostCode=Customer postal code should not be empty
+NotEmpty.customer.Telephone=Customer phone should not be empty
+Email.customer.EmailAddress=Customer email address is invalid
+NotEmpty.customer.EmailAddress=Customer email address should not be empty
+
+NotEmpty.customer.billingCompany=Billing company name should not be empty
+NotEmpty.customer.billingFirstName=Billing first name should not be empty
+NotEmpty.customer.billingLastName=Billing last name should not be empty
+NotEmpty.customer.billingStreetAddress=Billing street address should not be empty
+NotEmpty.customer.billingCity=Billing city should not be empty
+NotEmpty.customer.billingState=Billing state should not be empty
+NotEmpty.customer.billingCountry=Billing country should not be empty
+NotEmpty.customer.billingPostCode=Billing postal code should not be empty
+
+NotEmpty.customer.shippingCountry=Shipping country should not be empty
+
+NotEmpty.taxClass.code=Tax Class code is required
+NotEmpty.taxClass.title=Tax Class name is required
+message.taxclass.alreadyexist=Tax Class code already exist
+NotEmpty.taxRate.code=Tax Rate code must not be empty
+NotEmpty.taxRate.unique.code=Tax Rate code must be unique
+NotEmpty.taxRate.rateText=Tax Rate must not be empty
+NotEmpty.taxRateDescription.name=Tax Rate name must not be empty
+NotNull.taxRate.parent=Parent tax rate must be selected
+
+message.noshipping.configured=No shipping method configured
+message.noshipping=No shipping available
+message.noshippingerror=No shipping available, please check your shipping country, state / province and postal code
+
+message.login.duallogin=Dual login not authorized on the same browser
+
+User.resetPassword.resetSuccess=Successfully changed password, please check your Email
+User.resetPassword.wrongSecurityQtn=Wrong Security Question/Answer Entered
+User.resetPassword.userNotFound=Specified User Not Found
+User.resetPassword.Error=An error occured, please contact the administrator
+
+validaion.recaptcha.not.matched=Recaptcha does not matched with user input
+registration.username.not.empty=Please provide user name
+registration.username.length.invalid=User name must be at least 6 characters long
+registration.password.not.empty=Please provide a valid password
+registration.firstName.invalid=Please provide first name
+registration.lastName.invalid=Please provide last name
+messages.invalid.email=Please provide a valid email address.
+registration.username.already.exists = User with user name already exists for this store.
+registration.failed=Unable to complete registration, please try again later
+currentpassword.not.empty=Please provide your current password
+newpassword.not.empty=Please provide a new password
+repeatpassword.not.empty=Please provide repeated password
+message.invalidpassword=Invalid password
+
+error.code.99=An error occured while trying to process the payment
+
sm-shop/src/main/resources/bundles/messages_fr.properties 426(+215 -211)
diff --git a/sm-shop/src/main/resources/bundles/messages_fr.properties b/sm-shop/src/main/resources/bundles/messages_fr.properties
index 37e3583..00d5d53 100644
--- a/sm-shop/src/main/resources/bundles/messages_fr.properties
+++ b/sm-shop/src/main/resources/bundles/messages_fr.properties
@@ -1,211 +1,215 @@
-message.success=Requête compétée avec succès
-message.error=Une erreur est survenue avec cette requête
-message.email.success=Votre message a été envoyé avec succès
-message.productreview.created=Votre avez créé une revue de produit avec succès
-message.email.error=Une erreur est survenue avec l''envoi du message, veuillez essayer plus tard
-message.error.shoppingcart.update=Une erreur est survenue pendant la mise à jour du panier d'achat
-message.access.denied=Accès refusé
-message.username.password=Authentication échouée. Le nom d\\'usager ou le mot de passe est invalide.
-message.resource.notfound=La page demandée n'existe pas
-message.fielderror=Entrée erronnée
-message.timeout=La session est expirée.
-message.error.shipping=Une erreur est survenue lors du calcul des coûts d'expédition
-NotEmpty=Champs requis
-currentpassword.not.empty=Le mot de passe courant ne doit pas être vide
-password.notequal=Le nouveau mot de passe et le mot de passe de vérification doivent être identiques
-newpassword.not.empty=Le nouveau mot de passe ne doit pas être vide et doit être d''au moins 6 caractères
-repeatpassword.not.empty=Le mot de passe de vérification ne doit pas être vide et doit être d''au moins 6 caractères
-
-NotEmpty.store.storename=Le nom de la boutique ne doit pas être vide
-NotEmpty.store.storeEmailAddress=Le email de la boutique ne doit pas être vide
-Email.store.storeEmailAddress=Le email est invalide
-NotEmpty.product.productPrice=Le prix du produit doit être spécifié
-NotEmpty.product.manufacturer=Le manufacturier du produit doit être spécifié
-NotEmpty.price.code=Le code de prix doit être spécifié
-Pattern.price.code=Le code de prix doit être aplha-numérique
-Pattern.product.sku=Le sku doit être aplha-numérique
-Pattern.merchant.code=Le code du marchand doit être aplha-numérique
-Pattern.optionValue.code=Le code doit être aplha-numérique
-NotEmpty.optionValue.code=Le code ne doit pas être vide
-Pattern.option.code=Le code doit être aplha-numérique
-NotEmpty.option.code=Le code ne doit pas être vide
-NotEmpty.keyword.keyword=Le mot clé ne doit pas être vide
-NotEmpty.review.description=Votre opinion est requise
-
-NotEmpty.customer.userName=Un nom d''usager est requis
-NotEmpty.customer.firstName=Le prénom est requis
-NotEmpty.customer.lastName=Le nom est requis
-NotEmpty.customer.address=L''addresse est requise
-NotEmpty.customer.address2=L'addresse est requise
-NotEmpty.customer.postalCode=Le code postal est requis
-NotEmpty.customer.stateProvince=L''état / province est requis
-NotEmpty.customer.phone=Le téléphone est requis
-NotEmpty.customer.city=La ville est requise
-
-NotEmpty.origin.address=L'addresse est requise
-NotEmpty.origin.postalCode=Le code postal est requis
-NotEmpty.origin.city=La ville est requise
-NotEmpty.origin.country=Le pays est requis
-
-
-NotEmpty.customer.emailAddress=L'adresse couriel est requise
-Email.customer.emailAddress=L'adresse couriel est invalide
-NotEmpty.customer.billing.phone=Le téléphone est requis
-NotEmpty.customer.billing.address=L'addresse est requise
-NotEmpty.customer.billing.city=La ville est requise
-NotEmpty.customer.billing.postalCode=Le code postal est requis
-NotEmpty.customer.billing.country=Le pays est requis
-NotEmpty.customer.billing.stateProvince=L'état / province est requis
-NotEmpty.customer.agreement=Veuillez accepter nos termes et conditions
-
-NotEmpty.customer.shipping.firstName=Le prénom à la livraison ne doit pas être vide
-NotEmpty.customer.shipping.lastName=Le nom de famille à la livraisonne doit pas être vide
-NotEmpty.customer.shipping.address=L'adresse de livraison ne doit pas être vide
-NotEmpty.customer.shipping.city=La ville de livraison ne doit pas être vide
-NotEmpty.customer.shipping.postalCode=Le code postal de livraison ne doit pas être vide
-NotEmpty.customer.shipping.phone=Le numéro de telephone de livraison ne doit pas être vide
-NotEmpty.customer.shipping.stateProvince=L'état / province de la livraison est requis
-
-NotEmpty.order.creditcard.number=Un numéro de carte de crédit valide est requis
-NotEmpty.order.creditcard.name=Le nom aparaissant sur la carte de crédit est requis
-NotEmpty.order.creditcard.cvv=Les numéros de vérification aparaisasant sur la carte de crédit sont requis
-NotEmpty.contact.name=Le nom de la personne contact est requis
-NotEmpty.contact.subject=Le sujet du formulaire de contact est requis
-NotEmpty.contact.comment=Les commentaires sont requis
-Email.contact.email=L'adresse couriel est invalide
-NotEmpty.contact.captchaResponseField=La réponse 'Captcha' est requise
-NotEmpty.contact.captchaChallengeField=La question 'Captcha' est requise
-
-message.payment.declined=La transaction a été refusée
-message.payment.error=Une erreur est survenue en essayant de compléter le paiement, si possible utiliser une autre méthode de paiement.
-messages.error.creditcard.cvc=Le numéro de vérification inscrit sur la carte est invalide
-
-message.order.canprocess=La commande peut être complétée
-message.name.required=Le nom de l'objet est reuis
-
-message.code.exist=Ce code existe déjà
-message.invalid.amount=Montant invalide
-message.region.exists=cette région existe déjà
-message.region.null=La région ne peut être vide
-message.invalid.price=Le format du prix est invalide
-message.invalid.rate=Le format du taux est invalide
-message.invalid.date=Format de la date invalide
-message.maximumWeight.null=Poids maximum ne peut être vide
-message.maximumWeight.invalid=Poids maximum doit être supérieur é 0
-message.unauthorized=Cette transaction ne peut être complétée
-message.code.available=Ce code est disponible
-message.image.height=Hauteur de l'image trop grande
-message.image.width=Largeur de l'image trop grande
-message.image.size=Image trop volumineuse
-message.number.invalid=Doit être un nombre valide (ex 5)
-
-message.password.required=Un mot de passe est requis
-message.password.repeat.required=Le mot de passe répété est requis
-message.username.required=Le code d'usager est requis
-message.username.notfound=Le code d'usager n'existe pas
-message.price.cents=SVP entrer un maximum de 99 sous
-message.security.cannotrevoke.superadmin=Le groupe Super Admin ne peut être révoqué
-message.cannot.empty=ne peut être vide
-message.password.different=Le nouveau mot de passe et le mot de passe répété doivent être identiques
-message.password.invalid=Mot de passe invalide
-message.password.length=Le mot de passe doit avoir au moins 6 caractéres
-message.password.reset=Le mot de passe a été ré-initialisé
-message.password.checkpassword.identical=Les deux mots de passe doivent être identiques
-message.credentials.reset=Le données d'authentification ont été changées
-
-message.security.caanotremovesuperadmin=Il n'est pas possible de détruire un usager super admin
-
-message.group.alerady.exists=Le groupe {0} existe déjà
-
-message.product.association=Cette entité est associée é un ou plusieurs produits. Veuillez détruire les associations et ré-essayer é nouveau.
-message.notexist.customer=Le client n'existe pas
-
-message.optionset.optionassociationexists=Cette association d'options existe déjà
-message.optionset.noassociation=Choisir une option et une valeur d'option
-
-
-message.productoption.required=Un attribut/option de produit est requis
-message.productoptionvalue.required=Une valeur d'attribut/option de produit est requis
-message.product.language=Le produit n'a pas été configuré pour ce language. Veuillez éditer le produit et ajouter les informations pour cette langue.
-
-messages.error.creditcard.number=Le numéro de carte de crédit est invalide
-messages.error.creditcard.dateformat=La date d\\'expiration de la carte de crédit est invalide
-
-message.content.missing.agreement=Le contenu défini avec le code 'agreement' n'existe pas
-
-merchant.storeId.invalid=Le numéro de marchand est invalide
-merchant.files.invalid=Veuillez fournir un ou plusieurs fichiers é charger
-merchant.zone.invalid=L'état / province est requise
-
-NotEmpty.order.customerFirstName=Le prénom du client ne doit pas être vide
-NotEmpty.order.customerLastName=Le nom de famille du client ne doit pas être vide
-NotEmpty.order.customerStreetAddress=L'adresse du client ne doit pas être vide
-NotEmpty.order.customerCity=La ville du client ne doit pas être vide
-NotEmpty.order.customerPostCode=Le code postal du client ne doit pas être vide
-NotEmpty.order.customerTelephone=Le numero de telephone du client ne doit pas être vide
-Email.order.customerEmailAddress=Le email du client est invalide
-NotEmpty.order.customerEmailAddress=Le email du client ne doit pas être vide
-
-NotEmpty.order.billingName=Le nom de facturation ne doit pas être vide
-NotEmpty.order.billingStreetAddress=L'adresse de facturation ne doit pas être vide
-NotEmpty.order.billingCity=La ville de facturation ne doit pas être vide
-NotEmpty.order.billingState=La province de facturation ne doit pas être vide
-NotEmpty.order.billingPostCode=Le code postal de facturation ne doit pas être vide
-
-NotEmpty.customer.FirstName=Le prenom du client ne doit pas être vide
-NotEmpty.customer.LastName=Le nom de famille du client ne doit pas être vide
-NotEmpty.customer.StreetAddress=L'adresse du client ne doit pas être vide
-NotEmpty.customer.City=La ville du client ne doit pas être vide
-NotEmpty.customer.PostCode=Le code postal du client ne doit pas être vide
-NotEmpty.customer.Telephone=Le numero de telephone du client ne doit pas être vide
-Email.customer.EmailAddress=Le email du client est invalide
-NotEmpty.customer.EmailAddress=Le email du client ne doit pas être vide
-
-NotEmpty.customer.billingCompany=Le nom de compagnie ne doit pas être vide
-NotEmpty.customer.billingFirstName=Le prénom de facturation ne doit pas être vide
-NotEmpty.customer.billingLastName=Le nom de facturation ne doit pas être vide
-NotEmpty.customer.billingStreetAddress=L'adresse de facturation ne doit pas être vide
-NotEmpty.customer.billingCity=La ville de facturation ne doit pas être vide
-NotEmpty.customer.billingState=La province de facturation ne doit pas être vide
-NotEmpty.customer.billingCountry=Le pays de facturation ne doit pas être vide
-NotEmpty.customer.billingPostCode=Le code postal de facturation ne doit pas être vide
-
-NotEmpty.customer.shippingCountry=Le pays de livraison ne doit pas être vide
-
-NotEmpty.taxClass.code=Le code de la classe de taxe est requis
-NotEmpty.taxClass.title=Le nom de la classe de taxe est requis
-message.taxclass.alreadyexist=Le code de classe existe déjà
-NotEmpty.taxRate.code=Le code du taux de taxation est requis
-NotEmpty.taxRate.unique.code=Le code du taux de taxation doit être unique
-NotEmpty.taxRate.rateText=Le taux de taxation est requis
-NotEmpty.taxRateDescription.name=Le nom du taux de taxation est requis
-NotNull.taxRate.parent=Le taux de taxation parent doit être sélectionné
-
-
-message.noshipping.configured=Aucune méthode de livraison configurée
-message.noshipping=La livraison n'est pas disponible
-message.noshippingerror=La livraison n'est pas disponible, veuillez valider le pays, la province ou l'état ainsi que le code postal de livraison
-
-message.login.duallogin=Le système ne supporte pas 2 authentifications sur le même fureteur
-
-User.resetPassword.resetSuccess=Le mot de passe a été changé. Vous recevrez votre nouveau mot de passe par courriel.
-User.resetPassword.wrongSecurityQtn=La réponse à la question de sécurité est invalide
-User.resetPassword.userNotFound=L'usager spécifié n`existe pas
-User.resetPassword.Error=Une erreur s'est produite, contactez l'administrateur
-
-validaion.recaptcha.not.matched=Saisie du champs 'captcha' invalide
-registration.username.not.empty=Veuillez fournir un nom d'usager
-registration.password.not.empty=Veuillez fournir un mot de passe valide
-registration.username.length.invalid=Le nom d\\'usager doit contenir au moins 6 caractères
-registration.firstName.invalid=Le prénom est obligatoire
-registration.lastName.invalid=Le nom est obligatoire
-messages.invalid.email=Veuillez fournir une adress courriel valide
-registration.username.already.exists = Ce nom d'usager existe déjà
-registration.failed=Une erreur est survenue lors de l'enregistrement veuillez recommencer plus tard
-currentpassword.not.empty=Veuillez fournir votre mot de passe actuel
-newpassword.not.empty=Veuillez fournir un nouveau mot de passe valide
-repeatpassword.not.empty=Veuillez répéter le nouveau mot de passe
-message.invalidpassword=Mot de passe invalide
-
-error.code.99=Une erreur s\\'est produite en essayant de traîter le paiement (99)
-
+message.success=Requête compétée avec succès
+message.error=Une erreur est survenue avec cette requête
+message.email.success=Votre message a été envoyé avec succès
+message.productreview.created=Votre avez créé une revue de produit avec succès
+message.email.error=Une erreur est survenue avec l''envoi du message, veuillez essayer plus tard
+message.error.shoppingcart.update=Une erreur est survenue pendant la mise à jour du panier d'achat
+message.access.denied=Accès refusé
+message.username.password=Authentication échouée. Le nom d\\'usager ou le mot de passe est invalide.
+message.resource.notfound=La page demandée n'existe pas
+message.fielderror=Entrée erronnée
+message.timeout=La session est expirée.
+message.error.shipping=Une erreur est survenue lors du calcul des coûts d'expédition
+NotEmpty=Champs requis
+currentpassword.not.empty=Le mot de passe courant ne doit pas être vide
+password.notequal=Le nouveau mot de passe et le mot de passe de vérification doivent être identiques
+newpassword.not.empty=Le nouveau mot de passe ne doit pas être vide et doit être d''au moins 6 caractères
+repeatpassword.not.empty=Le mot de passe de vérification ne doit pas être vide et doit être d''au moins 6 caractères
+
+NotEmpty.store.storename=Le nom de la boutique ne doit pas être vide
+NotEmpty.store.storeEmailAddress=Le email de la boutique ne doit pas être vide
+Email.store.storeEmailAddress=Le email est invalide
+NotEmpty.product.productPrice=Le prix du produit doit être spécifié
+NotEmpty.product.manufacturer=Le manufacturier du produit doit être spécifié
+NotEmpty.price.code=Le code de prix doit être spécifié
+Pattern.price.code=Le code de prix doit être aplha-numérique
+Pattern.product.sku=Le sku doit être aplha-numérique
+Pattern.merchant.code=Le code du marchand doit être aplha-numérique
+Pattern.optionValue.code=Le code doit être aplha-numérique
+NotEmpty.optionValue.code=Le code ne doit pas être vide
+Pattern.option.code=Le code doit être aplha-numérique
+NotEmpty.option.code=Le code ne doit pas être vide
+NotEmpty.keyword.keyword=Le mot clé ne doit pas être vide
+NotEmpty.review.description=Votre opinion est requise
+NotEmpty.group.groupType=Le type de groupe est requis
+NotEmpty.group.groupName=Le nom du groupe est requis
+
+NotEmpty.customer.userName=Un nom d''usager est requis
+NotEmpty.customer.firstName=Le prénom est requis
+NotEmpty.customer.lastName=Le nom est requis
+NotEmpty.customer.address=L''addresse est requise
+NotEmpty.customer.address2=L'addresse est requise
+NotEmpty.customer.postalCode=Le code postal est requis
+NotEmpty.customer.stateProvince=L''état / province est requis
+NotEmpty.customer.phone=Le téléphone est requis
+NotEmpty.customer.city=La ville est requise
+
+NotEmpty.origin.address=L'addresse est requise
+NotEmpty.origin.postalCode=Le code postal est requis
+NotEmpty.origin.city=La ville est requise
+NotEmpty.origin.country=Le pays est requis
+
+
+NotEmpty.customer.emailAddress=L'adresse couriel est requise
+Email.customer.emailAddress=L'adresse couriel est invalide
+NotEmpty.customer.billing.phone=Le téléphone est requis
+NotEmpty.customer.billing.address=L'addresse est requise
+NotEmpty.customer.billing.city=La ville est requise
+NotEmpty.customer.billing.postalCode=Le code postal est requis
+NotEmpty.customer.billing.country=Le pays est requis
+NotEmpty.customer.billing.stateProvince=L'état / province est requis
+NotEmpty.customer.agreement=Veuillez accepter nos termes et conditions
+
+NotEmpty.customer.shipping.firstName=Le prénom à la livraison ne doit pas être vide
+NotEmpty.customer.shipping.lastName=Le nom de famille à la livraisonne doit pas être vide
+NotEmpty.customer.shipping.address=L'adresse de livraison ne doit pas être vide
+NotEmpty.customer.shipping.city=La ville de livraison ne doit pas être vide
+NotEmpty.customer.shipping.postalCode=Le code postal de livraison ne doit pas être vide
+NotEmpty.customer.shipping.phone=Le numéro de telephone de livraison ne doit pas être vide
+NotEmpty.customer.shipping.stateProvince=L'état / province de la livraison est requis
+
+NotEmpty.order.creditcard.number=Un numéro de carte de crédit valide est requis
+NotEmpty.order.creditcard.name=Le nom aparaissant sur la carte de crédit est requis
+NotEmpty.order.creditcard.cvv=Les numéros de vérification aparaisasant sur la carte de crédit sont requis
+NotEmpty.contact.name=Le nom de la personne contact est requis
+NotEmpty.contact.subject=Le sujet du formulaire de contact est requis
+NotEmpty.contact.comment=Les commentaires sont requis
+Email.contact.email=L'adresse couriel est invalide
+NotEmpty.contact.captchaResponseField=La réponse 'Captcha' est requise
+NotEmpty.contact.captchaChallengeField=La question 'Captcha' est requise
+
+message.payment.declined=La transaction a été refusée
+message.payment.error=Une erreur est survenue en essayant de compléter le paiement, si possible utiliser une autre méthode de paiement.
+messages.error.creditcard.cvc=Le numéro de vérification inscrit sur la carte est invalide
+
+message.order.canprocess=La commande peut être complétée
+message.name.required=Le nom de l'objet est reuis
+
+message.code.exist=Ce code existe déjà
+message.name.exist=Ce nom existe déjà
+message.invalid.amount=Montant invalide
+message.region.exists=cette région existe déjà
+message.region.null=La région ne peut être vide
+message.invalid.price=Le format du prix est invalide
+message.invalid.rate=Le format du taux est invalide
+message.invalid.date=Format de la date invalide
+message.maximumWeight.null=Poids maximum ne peut être vide
+message.maximumWeight.invalid=Poids maximum doit être supérieur é 0
+message.unauthorized=Cette transaction ne peut être complétée
+message.code.available=Ce code est disponible
+message.image.height=Hauteur de l'image trop grande
+message.image.width=Largeur de l'image trop grande
+message.image.size=Image trop volumineuse
+message.number.invalid=Doit être un nombre valide (ex 5)
+
+message.password.required=Un mot de passe est requis
+message.password.repeat.required=Le mot de passe répété est requis
+message.username.required=Le code d'usager est requis
+message.username.notfound=Le code d'usager n'existe pas
+message.price.cents=SVP entrer un maximum de 99 sous
+message.security.cannotrevoke.superadmin=Le groupe Super Admin ne peut être révoqué
+message.cannot.empty=ne peut être vide
+message.password.different=Le nouveau mot de passe et le mot de passe répété doivent être identiques
+message.password.invalid=Mot de passe invalide
+message.password.length=Le mot de passe doit avoir au moins 6 caractéres
+message.password.reset=Le mot de passe a été ré-initialisé
+message.password.checkpassword.identical=Les deux mots de passe doivent être identiques
+message.credentials.reset=Le données d'authentification ont été changées
+
+message.security.caanotremovesuperadmin=Il n'est pas possible de détruire un usager super admin
+
+message.group.alerady.exists=Le groupe {0} existe déjà
+
+message.product.association=Cette entité est associée é un ou plusieurs produits. Veuillez détruire les associations et ré-essayer é nouveau.
+message.notexist.customer=Le client n'existe pas
+
+message.optionset.optionassociationexists=Cette association d'options existe déjà
+message.optionset.noassociation=Choisir une option et une valeur d'option
+
+
+message.productoption.required=Un attribut/option de produit est requis
+message.productoptionvalue.required=Une valeur d'attribut/option de produit est requis
+message.product.language=Le produit n'a pas été configuré pour ce language. Veuillez éditer le produit et ajouter les informations pour cette langue.
+
+messages.error.creditcard=Les données de la carte de crédit sont invalides
+messages.error.creditcard.number=Le numéro de carte de crédit est invalide
+messages.error.creditcard.dateformat=La date d\\'expiration de la carte de crédit est invalide
+
+message.content.missing.agreement=Le contenu défini avec le code 'agreement' n'existe pas
+
+merchant.storeId.invalid=Le numéro de marchand est invalide
+merchant.files.invalid=Veuillez fournir un ou plusieurs fichiers é charger
+merchant.zone.invalid=L'état / province est requise
+
+NotEmpty.order.customerFirstName=Le prénom du client ne doit pas être vide
+NotEmpty.order.customerLastName=Le nom de famille du client ne doit pas être vide
+NotEmpty.order.customerStreetAddress=L'adresse du client ne doit pas être vide
+NotEmpty.order.customerCity=La ville du client ne doit pas être vide
+NotEmpty.order.customerPostCode=Le code postal du client ne doit pas être vide
+NotEmpty.order.customerTelephone=Le numero de telephone du client ne doit pas être vide
+Email.order.customerEmailAddress=Le email du client est invalide
+NotEmpty.order.customerEmailAddress=Le email du client ne doit pas être vide
+
+NotEmpty.order.billingName=Le nom de facturation ne doit pas être vide
+NotEmpty.order.billingStreetAddress=L'adresse de facturation ne doit pas être vide
+NotEmpty.order.billingCity=La ville de facturation ne doit pas être vide
+NotEmpty.order.billingState=La province de facturation ne doit pas être vide
+NotEmpty.order.billingPostCode=Le code postal de facturation ne doit pas être vide
+
+NotEmpty.customer.FirstName=Le prenom du client ne doit pas être vide
+NotEmpty.customer.LastName=Le nom de famille du client ne doit pas être vide
+NotEmpty.customer.StreetAddress=L'adresse du client ne doit pas être vide
+NotEmpty.customer.City=La ville du client ne doit pas être vide
+NotEmpty.customer.PostCode=Le code postal du client ne doit pas être vide
+NotEmpty.customer.Telephone=Le numero de telephone du client ne doit pas être vide
+Email.customer.EmailAddress=Le email du client est invalide
+NotEmpty.customer.EmailAddress=Le email du client ne doit pas être vide
+
+NotEmpty.customer.billingCompany=Le nom de compagnie ne doit pas être vide
+NotEmpty.customer.billingFirstName=Le prénom de facturation ne doit pas être vide
+NotEmpty.customer.billingLastName=Le nom de facturation ne doit pas être vide
+NotEmpty.customer.billingStreetAddress=L'adresse de facturation ne doit pas être vide
+NotEmpty.customer.billingCity=La ville de facturation ne doit pas être vide
+NotEmpty.customer.billingState=La province de facturation ne doit pas être vide
+NotEmpty.customer.billingCountry=Le pays de facturation ne doit pas être vide
+NotEmpty.customer.billingPostCode=Le code postal de facturation ne doit pas être vide
+
+NotEmpty.customer.shippingCountry=Le pays de livraison ne doit pas être vide
+
+NotEmpty.taxClass.code=Le code de la classe de taxe est requis
+NotEmpty.taxClass.title=Le nom de la classe de taxe est requis
+message.taxclass.alreadyexist=Le code de classe existe déjà
+NotEmpty.taxRate.code=Le code du taux de taxation est requis
+NotEmpty.taxRate.unique.code=Le code du taux de taxation doit être unique
+NotEmpty.taxRate.rateText=Le taux de taxation est requis
+NotEmpty.taxRateDescription.name=Le nom du taux de taxation est requis
+NotNull.taxRate.parent=Le taux de taxation parent doit être sélectionné
+
+
+message.noshipping.configured=Aucune méthode de livraison configurée
+message.noshipping=La livraison n'est pas disponible
+message.noshippingerror=La livraison n'est pas disponible, veuillez valider le pays, la province ou l'état ainsi que le code postal de livraison
+
+message.login.duallogin=Le système ne supporte pas 2 authentifications sur le même fureteur
+
+User.resetPassword.resetSuccess=Le mot de passe a été changé. Vous recevrez votre nouveau mot de passe par courriel.
+User.resetPassword.wrongSecurityQtn=La réponse à la question de sécurité est invalide
+User.resetPassword.userNotFound=L'usager spécifié n`existe pas
+User.resetPassword.Error=Une erreur s'est produite, contactez l'administrateur
+
+validaion.recaptcha.not.matched=Saisie du champs 'captcha' invalide
+registration.username.not.empty=Veuillez fournir un nom d'usager
+registration.password.not.empty=Veuillez fournir un mot de passe valide
+registration.username.length.invalid=Le nom d\\'usager doit contenir au moins 6 caractères
+registration.firstName.invalid=Le prénom est obligatoire
+registration.lastName.invalid=Le nom est obligatoire
+messages.invalid.email=Veuillez fournir une adress courriel valide
+registration.username.already.exists = Ce nom d'usager existe déjà
+registration.failed=Une erreur est survenue lors de l'enregistrement veuillez recommencer plus tard
+currentpassword.not.empty=Veuillez fournir votre mot de passe actuel
+newpassword.not.empty=Veuillez fournir un nouveau mot de passe valide
+repeatpassword.not.empty=Veuillez répéter le nouveau mot de passe
+message.invalidpassword=Mot de passe invalide
+
+error.code.99=Une erreur s\\'est produite en essayant de traîter le paiement (99)
+
diff --git a/sm-shop/src/main/resources/bundles/payment.properties b/sm-shop/src/main/resources/bundles/payment.properties
index 169a67d..313a9c6 100644
--- a/sm-shop/src/main/resources/bundles/payment.properties
+++ b/sm-shop/src/main/resources/bundles/payment.properties
@@ -1,52 +1,59 @@
-payment.type.MONEYORDER=Money order
-payment.type.PAYPAL=PayPal
-payment.type.CREDITCARD=Credit card
-payment.type.STRIPE=Credit card
-
-module.payment.paypal=PayPal
-module.payment.beanstream=Beanstream
-module.payment.authorizenet=Authorize Net
-module.payment.moneyorder=Money order
-module.payment.paypal-express-checkout=PayPal express checkout
-module.payment.stripe=Stripe
-
-
-module.payment.transactiontype=Transaction type
-module.payment.transactiontype.preauth=Pre-authorization
-module.payment.transactiontype.capture=Capture
-module.payment.transactiontype.sale=Sale
-module.payment.transactiontype.refund=Refund
-
-#PayPal
-module.payment.paypal-express-checkout.userid=PayPal API user name
-module.payment.paypal-express-checkout.apikey=PayPal API password
-module.payment.paypal-express-checkout.signature=PayPal API signature
-module.payment.paypal-express-checkout.applicationid=PayPal application id
-module.payment.paypal-express-checkout.note=Follow the instructions here to create you PayPal API user name, password and signature (https://developer.paypal.com/docs/classic/api/apiCredentials/#creating-classic-api-credentials)
-
-
-
-#paypal rest
-module,payment.paypal.clientId=PayPal clientId
-module,payment.paypal.secret=PayPal secret
-module.payment.paypal.note=Create a PayPal seller account (www.paypal.com). Once completed, login to PayPal developer website (https://developer.paypal.com/webapps/developer/index) using your PayPal seller credentials. Click Applications on the upper nav bar to access the My Applications page. Click on Create App button, this action will provide your client id and secret keys.
-module.payment.paypal.message.clientId=PayPal clientId is required
-module.payment.paypal.message.secret=PayPal secret is required
-
-module.payment.paypal.message.identifier=PayPal API user name required
-module.payment.paypal.message.api=PayPal API user name required
-module.payment.paypal.message.password=PayPal API password required
-module.payment.paypal.message.signature=PayPal API signature required
-
-#Beanstream
-module.payment.beanstream.merchantid=Merchant id
-module.payment.beanstream.username=User name
-module.payment.beanstream.password=Password
-
-module.payment.beanstream.message.merchantid=Merchant id required
-module.payment.beanstream.message.username=Username is required
-module.payment.beanstream.message.password=Password is required
-
-#Moneyorder
-module.payment.moneyorder.adress=Cheque to be made to this address
+payment.not.configured=No payment modules configured
+
+
+payment.type.MONEYORDER=Money order
+payment.type.PAYPAL=PayPal
+payment.type.CREDITCARD=Credit card
+payment.type.STRIPE=Credit card
+payment.type.BRAINTREE=Credit card
+
+label.payment.moneyorder.usemoneyorder=Use money order
+
+module.payment.paypal=PayPal
+module.payment.beanstream=Beanstream
+module.payment.authorizenet=Authorize Net
+module.payment.moneyorder=Money order
+module.payment.paypal-express-checkout=PayPal express checkout
+module.payment.stripe=Stripe
+module.payment.braintree=Braintree
+
+
+module.payment.transactiontype=Transaction type
+module.payment.transactiontype.preauth=Pre-authorization
+module.payment.transactiontype.capture=Capture
+module.payment.transactiontype.sale=Sale
+module.payment.transactiontype.refund=Refund
+
+#PayPal
+module.payment.paypal-express-checkout.userid=PayPal API user name
+module.payment.paypal-express-checkout.apikey=PayPal API password
+module.payment.paypal-express-checkout.signature=PayPal API signature
+module.payment.paypal-express-checkout.applicationid=PayPal application id
+module.payment.paypal-express-checkout.note=Follow the instructions here to create you PayPal API user name, password and signature (https://developer.paypal.com/docs/classic/api/apiCredentials/#creating-classic-api-credentials)
+
+
+
+#paypal rest
+module,payment.paypal.clientId=PayPal clientId
+module,payment.paypal.secret=PayPal secret
+module.payment.paypal.note=Create a PayPal seller account (www.paypal.com). Once completed, login to PayPal developer website (https://developer.paypal.com/webapps/developer/index) using your PayPal seller credentials. Click Applications on the upper nav bar to access the My Applications page. Click on Create App button, this action will provide your client id and secret keys.
+module.payment.paypal.message.clientId=PayPal clientId is required
+module.payment.paypal.message.secret=PayPal secret is required
+
+module.payment.paypal.message.identifier=PayPal API user name required
+module.payment.paypal.message.api=PayPal API user name required
+module.payment.paypal.message.password=PayPal API password required
+module.payment.paypal.message.signature=PayPal API signature required
+
+#Beanstream
+module.payment.beanstream.merchantid=Merchant id
+module.payment.beanstream.username=User name
+module.payment.beanstream.password=Password
+
+module.payment.beanstream.message.merchantid=Merchant id required
+module.payment.beanstream.message.username=Username is required
+module.payment.beanstream.message.password=Password is required
+
+#Moneyorder
+module.payment.moneyorder.adress=Cheque to be made to this address
module.payment.moneyorder.message.address=Address is required
\ No newline at end of file
diff --git a/sm-shop/src/main/resources/bundles/payment_fr.properties b/sm-shop/src/main/resources/bundles/payment_fr.properties
index ab8837b..714e65d 100644
--- a/sm-shop/src/main/resources/bundles/payment_fr.properties
+++ b/sm-shop/src/main/resources/bundles/payment_fr.properties
@@ -1,48 +1,55 @@
-payment.type.MONEYORDER=Chèque
-payment.type.PayPal=PayPal
-payment.type.CREDITCARD=Carte de crédit
-payment.type.STRIPE=Carte de crédit
-
-module.payment.PayPal=PayPal
-module.payment.beanstream=Beanstream
-module.payment.authorizenet=Authorize Net
-module.payment.moneyorder=Chèque
-module.payment.paypal-express-checkout=PayPal express checkout
-module.payment.stripe=Stripe
-
-module.payment.transactiontype=Type de transaction
-module.payment.transactiontype.preauth=Pré-authorization
-module.payment.transactiontype.capture=Capture
-module.payment.transactiontype.sale=Vente
-module.payment.transactiontype.refund=Remboursement
-
-#PayPal
-module.payment.paypal-express-checkout.userid=Usager PayPal API
-module.payment.paypal-express-checkout.apikey=Mot de pass API
-module.payment.paypal-express-checkout.signature=PayPal API signature
-module.payment.paypal-express-checkout.applicationid=PayPal identifiant de l'application
-module.payment.paypal-express-checkout.note=Suivez les instructions afin de créer votre usager, mot de passe et signature PayPal (https://developer.paypal.com/docs/classic/api/apiCredentials/#creating-classic-api-credentials)
-
-module,payment.paypal.clientId=PayPal clientId
-module,payment.paypal.secret=PayPal secret
-module.payment.paypal.note=Créez un compte PayPal (www.PayPal.com). Une fois terminé, connectez-vous au site PayPal pour développeur (https://developer.paypal.com/webapps/developer/index) en utilisant votre compte PayPal. Cliquez sur Applications sur la barre de navigation supérieure pour accéder à la page Mes applications. Cliquez sur le bouton Créer une Application, cette action vous fournira votre numéro de client et la clé secrète.
-module.payment.paypal.message.clientId=PayPal clientId est requis
-module.payment.paypal.message.secret=PayPal secret est requis
-
-module.payment.paypal.message.identifier=Usager API PayPal requis
-module.payment.paypal.message.api=Clée API PayPal requise
-module.payment.paypal.message.password=PayPal API mot de passe requis
-module.payment.paypal.message.signature=PayPal API signature requise
-
-#Beanstream
-module.payment.beanstream.merchantid=Identifiant marchand
-module.payment.beanstream.username=Nom d'usager
-module.payment.beanstream.password=Mot de passe
-
-module.payment.beanstream.message.merchantid=Identifiant marchand requis
-module.payment.beanstream.message.username=Nom d'usager requis
-module.payment.beanstream.message.password=Mot de passe requis
-
-#Moneyorder
-module.payment.moneyorder.adress=Le chèque doit être fait à cette adresse
+payment.not.configured=Aucun module de paiement configuré
+
+payment.type.MONEYORDER=Chèque
+payment.type.PayPal=PayPal
+payment.type.CREDITCARD=Carte de crédit
+payment.type.STRIPE=Carte de crédit
+payment.type.BRAINTREE=Carte de crédit
+
+label.payment.moneyorder.usemoneyorder=Utiliser les chèques
+
+
+module.payment.PayPal=PayPal
+module.payment.beanstream=Beanstream
+module.payment.authorizenet=Authorize Net
+module.payment.moneyorder=Chèque
+module.payment.paypal-express-checkout=PayPal express checkout
+module.payment.stripe=Stripe
+module.payment.braintree=Braintree
+
+module.payment.transactiontype=Type de transaction
+module.payment.transactiontype.preauth=Pré-authorization
+module.payment.transactiontype.capture=Capture
+module.payment.transactiontype.sale=Vente
+module.payment.transactiontype.refund=Remboursement
+
+#PayPal
+module.payment.paypal-express-checkout.userid=Usager PayPal API
+module.payment.paypal-express-checkout.apikey=Mot de pass API
+module.payment.paypal-express-checkout.signature=PayPal API signature
+module.payment.paypal-express-checkout.applicationid=PayPal identifiant de l'application
+module.payment.paypal-express-checkout.note=Suivez les instructions afin de créer votre usager, mot de passe et signature PayPal (https://developer.paypal.com/docs/classic/api/apiCredentials/#creating-classic-api-credentials)
+
+module,payment.paypal.clientId=PayPal clientId
+module,payment.paypal.secret=PayPal secret
+module.payment.paypal.note=Créez un compte PayPal (www.PayPal.com). Une fois terminé, connectez-vous au site PayPal pour développeur (https://developer.paypal.com/webapps/developer/index) en utilisant votre compte PayPal. Cliquez sur Applications sur la barre de navigation supérieure pour accéder à la page Mes applications. Cliquez sur le bouton Créer une Application, cette action vous fournira votre numéro de client et la clé secrète.
+module.payment.paypal.message.clientId=PayPal clientId est requis
+module.payment.paypal.message.secret=PayPal secret est requis
+
+module.payment.paypal.message.identifier=Usager API PayPal requis
+module.payment.paypal.message.api=Clée API PayPal requise
+module.payment.paypal.message.password=PayPal API mot de passe requis
+module.payment.paypal.message.signature=PayPal API signature requise
+
+#Beanstream
+module.payment.beanstream.merchantid=Identifiant marchand
+module.payment.beanstream.username=Nom d'usager
+module.payment.beanstream.password=Mot de passe
+
+module.payment.beanstream.message.merchantid=Identifiant marchand requis
+module.payment.beanstream.message.username=Nom d'usager requis
+module.payment.beanstream.message.password=Mot de passe requis
+
+#Moneyorder
+module.payment.moneyorder.adress=Le chèque doit être fait à cette adresse
module.payment.moneyorder.message.address=L'adresse est requise
\ No newline at end of file
sm-shop/src/main/resources/bundles/shipping.properties 286(+144 -142)
diff --git a/sm-shop/src/main/resources/bundles/shipping.properties b/sm-shop/src/main/resources/bundles/shipping.properties
index a759560..11c5c65 100644
--- a/sm-shop/src/main/resources/bundles/shipping.properties
+++ b/sm-shop/src/main/resources/bundles/shipping.properties
@@ -1,143 +1,145 @@
-module.shipping.canadapost=Canada Post
-module.shipping.ups=UPS
-module.shipping.usps=United States Postal Service
-module.shipping.fedex=Fedex
-module.shipping.weightBased=Weight based shipping price
-module.shipping.customQuotesRules=Shipping by {0}
-module.shipping.storePickUp=Store pick up
-module.shipping.priceByDistance=Shipping by {0}
-
-module.shipping.storePickUp.note=This option let you reserve you order items through the onlne system and pick up your order by yourself at the store. This option is also ooered when no other shipping option is available for your region.
-
-#custom
-module.shipping.customQuotesRules.title=Create your own shipping quotes rules
-module.shipping.customQuotesRules.text=Use the rule system to create your own shipping rate decision table. The custom shipping rate decision table can be edited in sm-core/src/main/resources/rules/shipping-custom-rules.xls
-
-#custom
-module.shipping.priceByDistance.title=Create your own shipping quote based on distance
-module.shipping.priceByDistance.text=Set your shipping price (by kilometer). Requires the pre-processor distance calculator.
-
-module.shipping.canada=Canada
-module.shipping.usa=United states
-module.shipping.international=International
-
-
-
-#Canada Post
-module.shipping.canadapost.identifier=Canada Post identifier (CPC number)
-module.shipping.canadapost.username=Canada Post user name (first part of the API key before semi column)
-module.shipping.canadapost.password=Canada Post password (second part of the API key after semi column)
-module.shipping.canadapost.apikey=Canada Post API key
-module.shipping.canadapost.packages=Package type
-module.shipping.canadapost.services=Services to be rated
-module.shipping.canadapost.message.identifier=Canada Post identifier required
-module.shipping.canadapost.message.username=Canada Post user name required
-module.shipping.canadapost.message.password=Canada Post password required
-module.shipping.canadapost.message.apikey=Canada Post API key required
-
-module.shipping.canadapost.DOM.RP=Regular Parcel
-module.shipping.canadapost.DOM.EP=Expedited Parcel
-module.shipping.canadapost.DOM.XP=Xpresspost
-module.shipping.canadapost.DOM.XP.CERT=Xpresspost Certified
-module.shipping.canadapost.DOM.PC=Priority
-module.shipping.canadapost.DOM.DT=Delivered Tonight
-module.shipping.canadapost.DOM.LIB=Library Books
-
-module.shipping.canadapost.USA.EP=Expedited Parcel USA
-module.shipping.canadapost.USA.PW.ENV=Priority Worldwide Envelope USA
-module.shipping.canadapost.USA.PW.PAK=Priority Worldwide pak USA
-module.shipping.canadapost.USA.PW.PARCEL=Priority Worldwide Parcel USA
-module.shipping.canadapost.USA.SP.AIR=Small Packet USA Air
-module.shipping.canadapost.USA.TP=Tracked Packet - USA
-module.shipping.canadapost.USA.TP.LVM=Tracked Packet - USA - (LVM - large volume mailers)
-module.shipping.canadapost.USA.XP=Xpresspost USA
-
-
-module.shipping.canadapost.INT.XP=Xpresspost International
-module.shipping.canadapost.INT.IP.AIR=International Parcel Air
-module.shipping.canadapost.INT.IP.SURF=International Parcel Surface
-module.shipping.canadapost.INT.PW.ENV=Priority Worldwide Envelope International
-module.shipping.canadapost.INT.PW.PAK=Priority Worldwide pak International
-module.shipping.canadapost.INT.PW.PARCEL=Priority Worldwide parcel International
-module.shipping.canadapost.INT.SP.AIR=Small Packet International Air
-module.shipping.canadapost.INT.SP.SURF=Small Packet International Surface
-module.shipping.canadapost.INT.TP=Tracked Packet - International
-
-
-#USPS
-module.shipping.usps.identifier=USPS account identifier
-module.shipping.usps.packages=Package type
-module.shipping.usps.shippingmethods=Select up to 3 shipping methods
-module.shipping.usps.message.identifier=USPS account identifier required
-module.shipping.usps.message.packages=You must select one package type
-
-
-module.shipping.usps.package.01=Variable
-module.shipping.usps.package.02=Flat Rate Box
-module.shipping.usps.package.03=Flat Rate Envelope
-module.shipping.usps.package.04=Rectangular
-module.shipping.usps.package.05=Non Rectangular
-module.shipping.usps.package.06=LG Flat Rate Box
-
-module.shipping.usps.package.07=Envelope
-module.shipping.usps.package.08=Package
-
-module.shipping.usps.method.01=First-Class Mail
-module.shipping.usps.method.02=Priority Mail
-module.shipping.usps.method.03=Express Mail
-module.shipping.usps.method.04=Express SH
-module.shipping.usps.method.05=Express HFP
-module.shipping.usps.method.06=BPM
-module.shipping.usps.method.07=Parcel Post
-
-#UPS
-module.shipping.ups.identifier=UPS access key
-module.shipping.ups.userid=User ID
-module.shipping.ups.password=Password
-module.shipping.ups.packages=Package type
-module.shipping.ups.shippingmethods=Select a shipping method
-module.shipping.ups.message.identifier=UPS account identifier required
-module.shipping.ups.message.packages=You must select one package type
-
-
-
-module.shipping.ups.package.02=Customer Package
-module.shipping.ups.packagel.01=UPS Letter
-module.shipping.ups.package.03=UPS Tube
-module.shipping.ups.package.04=UPS Pak
-module.shipping.ups.package.21=UPS Express Box
-module.shipping.ups.package.24=UPS 25kg Box
-module.shipping.ups.package.10=UPS 10kg box
-module.shipping.ups.package.25=Unknown
-
-
-
-
-module.shipping.ups.method.01=UPS Next Day Air
-module.shipping.ups.method.02=UPS Second Day Air
-module.shipping.ups.method.03=UPS Ground
-module.shipping.ups.method.07=UPS Worldwide Express
-module.shipping.ups.method.08=UPS Worldwide Expedited
-module.shipping.ups.method.11=UPS Standard
-module.shipping.ups.method.12=UPS Three-Day Select
-module.shipping.ups.method.13=UPS Next Day Air Saver
-module.shipping.ups.method.14=UPS Next Day Air Early A.M.
-module.shipping.ups.method.54=UPS Worldwide Express Plus
-module.shipping.ups.method.59=UPS Second Day Air A.M.
-module.shipping.ups.method.65=UPS Saver
-
-#module.shipping.ups.method.68=UPS Express
-#module.shipping.ups.method.69=UPS Worldwide Expedited
-#module.shipping.ups.method.70=UPS Standard
-#module.shipping.ups.method.71=UPS Worldwide Express Plus
-#module.shipping.ups.method.72=UPS Saver
-module.shipping.ups.method=UPS shipping methods
-module.shipping.ups.method.select=Select a specific UPS shipping method
-module.shipping.ups.method.unselect=Let UPS propose all available shipping methods
-
-
-#store pick up
-module.shipping.storePickUp.address=Pick up address that will be displayed to the client
-module.shipping.storePickUp.address.message=Pick up address is a required field
-module.shipping.storePickUp.price=Price for store pick up in numeric format (usually 0)
+NO_SHIPPING_MODULE_CONFIGURED=No shipping module configured
+
+module.shipping.canadapost=Canada Post
+module.shipping.ups=UPS
+module.shipping.usps=United States Postal Service
+module.shipping.fedex=Fedex
+module.shipping.weightBased=Weight based shipping price
+module.shipping.customQuotesRules=Shipping by {0}
+module.shipping.storePickUp=Store pick up
+module.shipping.priceByDistance=Shipping by {0}
+
+module.shipping.storePickUp.note=This option let you reserve you order items through the onlne system and pick up your order by yourself at the store. This option is also offered when no other shipping option is available for your region.
+
+#custom
+module.shipping.customQuotesRules.title=Create your own shipping quotes rules
+module.shipping.customQuotesRules.text=Use the rule system to create your own shipping rate decision table. The custom shipping rate decision table can be edited in sm-core/src/main/resources/rules/shipping-custom-rules.xls
+
+#custom
+module.shipping.priceByDistance.title=Create your own shipping quote based on distance
+module.shipping.priceByDistance.text=Set your shipping price (by kilometer). Requires the pre-processor distance calculator.
+
+module.shipping.canada=Canada
+module.shipping.usa=United states
+module.shipping.international=International
+
+
+
+#Canada Post
+module.shipping.canadapost.identifier=Canada Post identifier (CPC number)
+module.shipping.canadapost.username=Canada Post user name (first part of the API key before semi column)
+module.shipping.canadapost.password=Canada Post password (second part of the API key after semi column)
+module.shipping.canadapost.apikey=Canada Post API key
+module.shipping.canadapost.packages=Package type
+module.shipping.canadapost.services=Services to be rated
+module.shipping.canadapost.message.identifier=Canada Post identifier required
+module.shipping.canadapost.message.username=Canada Post user name required
+module.shipping.canadapost.message.password=Canada Post password required
+module.shipping.canadapost.message.apikey=Canada Post API key required
+
+module.shipping.canadapost.DOM.RP=Regular Parcel
+module.shipping.canadapost.DOM.EP=Expedited Parcel
+module.shipping.canadapost.DOM.XP=Xpresspost
+module.shipping.canadapost.DOM.XP.CERT=Xpresspost Certified
+module.shipping.canadapost.DOM.PC=Priority
+module.shipping.canadapost.DOM.DT=Delivered Tonight
+module.shipping.canadapost.DOM.LIB=Library Books
+
+module.shipping.canadapost.USA.EP=Expedited Parcel USA
+module.shipping.canadapost.USA.PW.ENV=Priority Worldwide Envelope USA
+module.shipping.canadapost.USA.PW.PAK=Priority Worldwide pak USA
+module.shipping.canadapost.USA.PW.PARCEL=Priority Worldwide Parcel USA
+module.shipping.canadapost.USA.SP.AIR=Small Packet USA Air
+module.shipping.canadapost.USA.TP=Tracked Packet - USA
+module.shipping.canadapost.USA.TP.LVM=Tracked Packet - USA - (LVM - large volume mailers)
+module.shipping.canadapost.USA.XP=Xpresspost USA
+
+
+module.shipping.canadapost.INT.XP=Xpresspost International
+module.shipping.canadapost.INT.IP.AIR=International Parcel Air
+module.shipping.canadapost.INT.IP.SURF=International Parcel Surface
+module.shipping.canadapost.INT.PW.ENV=Priority Worldwide Envelope International
+module.shipping.canadapost.INT.PW.PAK=Priority Worldwide pak International
+module.shipping.canadapost.INT.PW.PARCEL=Priority Worldwide parcel International
+module.shipping.canadapost.INT.SP.AIR=Small Packet International Air
+module.shipping.canadapost.INT.SP.SURF=Small Packet International Surface
+module.shipping.canadapost.INT.TP=Tracked Packet - International
+
+
+#USPS
+module.shipping.usps.identifier=USPS account identifier
+module.shipping.usps.packages=Package type
+module.shipping.usps.shippingmethods=Select up to 3 shipping methods
+module.shipping.usps.message.identifier=USPS account identifier required
+module.shipping.usps.message.packages=You must select one package type
+
+
+module.shipping.usps.package.01=Variable
+module.shipping.usps.package.02=Flat Rate Box
+module.shipping.usps.package.03=Flat Rate Envelope
+module.shipping.usps.package.04=Rectangular
+module.shipping.usps.package.05=Non Rectangular
+module.shipping.usps.package.06=LG Flat Rate Box
+
+module.shipping.usps.package.07=Envelope
+module.shipping.usps.package.08=Package
+
+module.shipping.usps.method.01=First-Class Mail
+module.shipping.usps.method.02=Priority Mail
+module.shipping.usps.method.03=Express Mail
+module.shipping.usps.method.04=Express SH
+module.shipping.usps.method.05=Express HFP
+module.shipping.usps.method.06=BPM
+module.shipping.usps.method.07=Parcel Post
+
+#UPS
+module.shipping.ups.identifier=UPS access key
+module.shipping.ups.userid=User ID
+module.shipping.ups.password=Password
+module.shipping.ups.packages=Package type
+module.shipping.ups.shippingmethods=Select a shipping method
+module.shipping.ups.message.identifier=UPS account identifier required
+module.shipping.ups.message.packages=You must select one package type
+
+
+
+module.shipping.ups.package.02=Customer Package
+module.shipping.ups.packagel.01=UPS Letter
+module.shipping.ups.package.03=UPS Tube
+module.shipping.ups.package.04=UPS Pak
+module.shipping.ups.package.21=UPS Express Box
+module.shipping.ups.package.24=UPS 25kg Box
+module.shipping.ups.package.10=UPS 10kg box
+module.shipping.ups.package.25=Unknown
+
+
+
+
+module.shipping.ups.method.01=UPS Next Day Air
+module.shipping.ups.method.02=UPS Second Day Air
+module.shipping.ups.method.03=UPS Ground
+module.shipping.ups.method.07=UPS Worldwide Express
+module.shipping.ups.method.08=UPS Worldwide Expedited
+module.shipping.ups.method.11=UPS Standard
+module.shipping.ups.method.12=UPS Three-Day Select
+module.shipping.ups.method.13=UPS Next Day Air Saver
+module.shipping.ups.method.14=UPS Next Day Air Early A.M.
+module.shipping.ups.method.54=UPS Worldwide Express Plus
+module.shipping.ups.method.59=UPS Second Day Air A.M.
+module.shipping.ups.method.65=UPS Saver
+
+#module.shipping.ups.method.68=UPS Express
+#module.shipping.ups.method.69=UPS Worldwide Expedited
+#module.shipping.ups.method.70=UPS Standard
+#module.shipping.ups.method.71=UPS Worldwide Express Plus
+#module.shipping.ups.method.72=UPS Saver
+module.shipping.ups.method=UPS shipping methods
+module.shipping.ups.method.select=Select a specific UPS shipping method
+module.shipping.ups.method.unselect=Let UPS propose all available shipping methods
+
+
+#store pick up
+module.shipping.storePickUp.address=Pick up address that will be displayed to the client
+module.shipping.storePickUp.address.message=Pick up address is a required field
+module.shipping.storePickUp.price=Price for store pick up in numeric format (usually 0)
module.shipping.storePickUp.price.message=Price for store pick up is required (in numeric format)
\ No newline at end of file
diff --git a/sm-shop/src/main/resources/bundles/shipping_fr.properties b/sm-shop/src/main/resources/bundles/shipping_fr.properties
index fbfb891..c12aec9 100644
--- a/sm-shop/src/main/resources/bundles/shipping_fr.properties
+++ b/sm-shop/src/main/resources/bundles/shipping_fr.properties
@@ -1,94 +1,96 @@
-module.shipping.canadapost=Postes Canada
-module.shipping.ups=UPS
-module.shipping.usps=United States Postal Service
-module.shipping.fedex=Fedex
-module.shipping.weightBased=Prix d'expédition basé sur le poids
-module.shipping.customQuotesRules=Livraison par {0}
-module.shipping.storePickUp=Ramassage en magasin
-module.shipping.priceByDistance=Livraison par {0}
-
-module.shipping.storePickUp.note=Cette option vous permet de réserver votre commande via le système web et de ramasser par vous même l'item ou les items en magasin. Cette option est également offerte lorsque aucune autre option de livraison est disponible dans votre secteur.
-
-#custom
-module.shipping.customQuotesRules.title=Vous pouvez produire vos propre règles de coûts d'expédition
-module.shipping.customQuotesRules.text=Utilisez le système de règles d'affaires afin de créer votre propre table de décision des coûts d'expédition. Le fichier de règles d'affaires des coûts d'expédition peut être édité sous sm-core/src/main/resources/rules/shipping-custom-rules.xls
-
-#custom
-module.shipping.priceByDistance.title=Vous pouvez produire vos propre règles de coûts d'expédition basées sur la distance
-module.shipping.priceByDistance.text=Calcul du prix de livraison sur un prix fixe par kilomètre. Requiert le pré-processeur permettant de calculer la distance de livraison.
-
-module.shipping.canada=Canada
-module.shipping.usa=États-Unis
-module.shipping.international=International
-
-#Canada Post
-module.shipping.canadapost.identifier=Identifiant Postes Canada (numéro CPC)
-module.shipping.canadapost.username=Nom d'usager Postes Canada (première partie de la clé API avant les 2 points :)
-module.shipping.canadapost.password=Mot de passe Postes Canada (deuxième partie de la clé API après les 2 points :)
-module.shipping.canadapost.apikey=Clé API Postes Canada
-module.shipping.canadapost.services=Services de postage à calculer
-module.shipping.canadapost.packages=Type d'emballage
-module.shipping.canadapost.message.identifier=Identifiant Postes Canada requis
-module.shipping.canadapost.message.packages=Au moins un type d'emballage
-module.shipping.canadapost.message.apikey=Clé API requise
-
-module.shipping.canadapost.DOM.RP=Colis standard
-module.shipping.canadapost.DOM.EP=Colis accélérés
-module.shipping.canadapost.DOM.XP=Xpresspost
-module.shipping.canadapost.DOM.XP.CERT=Xpresspost certifié
-module.shipping.canadapost.DOM.PC=Priorité
-module.shipping.canadapost.DOM.DT=Service Livré ce soir
-module.shipping.canadapost.DOM.LIB=Livres de bibliothèque
-
-module.shipping.canadapost.USA.EP=Colis accélérés É.-U.
-module.shipping.canadapost.USA.PW.ENV=Enveloppe Priorité Mondial – É.-U.
-module.shipping.canadapost.USA.PW.PAK=Paquet Priorité Mondial – É.-U.
-module.shipping.canadapost.USA.PW.PARCEL=Colis Priorité Mondial – É.-U.
-module.shipping.canadapost.USA.SP.AIR=Petits paquets-avion à destination des É.-U.
-module.shipping.canadapost.USA.TP=Paquet repérable – É.-U.
-module.shipping.canadapost.USA.TP.LVM=Paquet repérable – É.-U. (GEC - gros expéditeur de courrier)
-module.shipping.canadapost.USA.XP=Xpresspost É.-U.
-
-module.shipping.canadapost.INT.XP=Xpresspost International
-module.shipping.canadapost.INT.IP.AIR=Colis-avion du régime international
-module.shipping.canadapost.INT.IP.SURF=Colis de surface du régime international
-module.shipping.canadapost.INT.PW.ENV=Enveloppe Priorité Mondial – International
-module.shipping.canadapost.INT.PW.PAK=Paquet Priorité Mondial – International
-module.shipping.canadapost.INT.PW.PARCEL=Colis Prioritié Mondial – International
-module.shipping.canadapost.INT.SP.AIR=Petits paquets-avion du régime international
-module.shipping.canadapost.INT.SP.SURF=Petits paquets de surface du régime international
-module.shipping.canadapost.INT.TP=Paquet repérable – International
-
-#USPS
-module.shipping.usps.identifier=Numéro de compte USPS
-module.shipping.usps.packages=Type d'emballage
-module.shipping.usps.shippingmethods=Choisir jusqu'a 3 méthodes d'expédition
-module.shipping.usps.message.identifier=Identifiant USPS requis
-module.shipping.usps.message.packages=Vous devez choisir un type d'emballage
-
-
-module.shipping.usps.package.01=Variable
-module.shipping.usps.package.02=Flat Rate Box
-module.shipping.usps.package.03=Flat Rate Envelope
-module.shipping.usps.package.04=Rectangular
-module.shipping.usps.package.05=Non Rectangular
-module.shipping.usps.package.06=LG Flat Rate Box
-
-module.shipping.usps.package.07=Envelope
-module.shipping.usps.package.08=Package
-
-module.shipping.usps.method.01=First-Class Mail
-module.shipping.usps.method.02=Priority Mail
-module.shipping.usps.method.03=Express Mail
-module.shipping.usps.method.04=Express SH
-module.shipping.usps.method.05=Express HFP
-module.shipping.usps.method.06=BPM
-module.shipping.usps.method.07=Parcel Post
-module.shipping.canadapost.packages.package=Paquet
-module.shipping.canadapost.packages.envelope=Enveloppe
-
-#store pick up
-module.shipping.storePickUp.address=Adresse de ramassage affichée au client
-module.shipping.storePickUp.address.message=L'Adresse de ramassage est un champ requis
-module.shipping.storePickUp.price=Prix de l'option de ramassage en magasin (normalement 0)
-module.shipping.storePickUp.price.message=Le prix de l'option de ramassage est requis (en format numérique)
+NO_SHIPPING_MODULE_CONFIGURED=Aucun module de livraison configuré
+
+module.shipping.canadapost=Postes Canada
+module.shipping.ups=UPS
+module.shipping.usps=United States Postal Service
+module.shipping.fedex=Fedex
+module.shipping.weightBased=Prix basé sur le poids
+module.shipping.customQuotesRules=Livraison par {0}
+module.shipping.storePickUp=Ramassage en magasin
+module.shipping.priceByDistance=Livraison par {0}
+
+module.shipping.storePickUp.note=Cette option vous permet de réserver votre commande via le système web et de ramasser par vous même l'item ou les items en magasin. Cette option est également offerte lorsque aucune autre option de livraison est disponible dans votre secteur.
+
+#custom
+module.shipping.customQuotesRules.title=Vous pouvez produire vos propre règles de coûts d'expédition
+module.shipping.customQuotesRules.text=Utilisez le système de règles d'affaires afin de créer votre propre table de décision des coûts d'expédition. Le fichier de règles d'affaires des coûts d'expédition peut être édité sous sm-core/src/main/resources/rules/shipping-custom-rules.xls
+
+#custom
+module.shipping.priceByDistance.title=Vous pouvez produire vos propre règles de coûts d'expédition basées sur la distance
+module.shipping.priceByDistance.text=Calcul du prix de livraison sur un prix fixe par kilomètre. Requiert le pré-processeur permettant de calculer la distance de livraison.
+
+module.shipping.canada=Canada
+module.shipping.usa=États-Unis
+module.shipping.international=International
+
+#Canada Post
+module.shipping.canadapost.identifier=Identifiant Postes Canada (numéro CPC)
+module.shipping.canadapost.username=Nom d'usager Postes Canada (première partie de la clé API avant les 2 points :)
+module.shipping.canadapost.password=Mot de passe Postes Canada (deuxième partie de la clé API après les 2 points :)
+module.shipping.canadapost.apikey=Clé API Postes Canada
+module.shipping.canadapost.services=Services de postage à calculer
+module.shipping.canadapost.packages=Type d'emballage
+module.shipping.canadapost.message.identifier=Identifiant Postes Canada requis
+module.shipping.canadapost.message.packages=Au moins un type d'emballage
+module.shipping.canadapost.message.apikey=Clé API requise
+
+module.shipping.canadapost.DOM.RP=Colis standard
+module.shipping.canadapost.DOM.EP=Colis accélérés
+module.shipping.canadapost.DOM.XP=Xpresspost
+module.shipping.canadapost.DOM.XP.CERT=Xpresspost certifié
+module.shipping.canadapost.DOM.PC=Priorité
+module.shipping.canadapost.DOM.DT=Service Livré ce soir
+module.shipping.canadapost.DOM.LIB=Livres de bibliothèque
+
+module.shipping.canadapost.USA.EP=Colis accélérés É.-U.
+module.shipping.canadapost.USA.PW.ENV=Enveloppe Priorité Mondial – É.-U.
+module.shipping.canadapost.USA.PW.PAK=Paquet Priorité Mondial – É.-U.
+module.shipping.canadapost.USA.PW.PARCEL=Colis Priorité Mondial – É.-U.
+module.shipping.canadapost.USA.SP.AIR=Petits paquets-avion à destination des É.-U.
+module.shipping.canadapost.USA.TP=Paquet repérable – É.-U.
+module.shipping.canadapost.USA.TP.LVM=Paquet repérable – É.-U. (GEC - gros expéditeur de courrier)
+module.shipping.canadapost.USA.XP=Xpresspost É.-U.
+
+module.shipping.canadapost.INT.XP=Xpresspost International
+module.shipping.canadapost.INT.IP.AIR=Colis-avion du régime international
+module.shipping.canadapost.INT.IP.SURF=Colis de surface du régime international
+module.shipping.canadapost.INT.PW.ENV=Enveloppe Priorité Mondial – International
+module.shipping.canadapost.INT.PW.PAK=Paquet Priorité Mondial – International
+module.shipping.canadapost.INT.PW.PARCEL=Colis Prioritié Mondial – International
+module.shipping.canadapost.INT.SP.AIR=Petits paquets-avion du régime international
+module.shipping.canadapost.INT.SP.SURF=Petits paquets de surface du régime international
+module.shipping.canadapost.INT.TP=Paquet repérable – International
+
+#USPS
+module.shipping.usps.identifier=Numéro de compte USPS
+module.shipping.usps.packages=Type d'emballage
+module.shipping.usps.shippingmethods=Choisir jusqu'a 3 méthodes d'expédition
+module.shipping.usps.message.identifier=Identifiant USPS requis
+module.shipping.usps.message.packages=Vous devez choisir un type d'emballage
+
+
+module.shipping.usps.package.01=Variable
+module.shipping.usps.package.02=Flat Rate Box
+module.shipping.usps.package.03=Flat Rate Envelope
+module.shipping.usps.package.04=Rectangular
+module.shipping.usps.package.05=Non Rectangular
+module.shipping.usps.package.06=LG Flat Rate Box
+
+module.shipping.usps.package.07=Envelope
+module.shipping.usps.package.08=Package
+
+module.shipping.usps.method.01=First-Class Mail
+module.shipping.usps.method.02=Priority Mail
+module.shipping.usps.method.03=Express Mail
+module.shipping.usps.method.04=Express SH
+module.shipping.usps.method.05=Express HFP
+module.shipping.usps.method.06=BPM
+module.shipping.usps.method.07=Parcel Post
+module.shipping.canadapost.packages.package=Paquet
+module.shipping.canadapost.packages.envelope=Enveloppe
+
+#store pick up
+module.shipping.storePickUp.address=Adresse de ramassage affichée au client
+module.shipping.storePickUp.address.message=L'Adresse de ramassage est un champ requis
+module.shipping.storePickUp.price=Prix de l'option de ramassage en magasin (normalement 0)
+module.shipping.storePickUp.price.message=Le prix de l'option de ramassage est requis (en format numérique)
diff --git a/sm-shop/src/main/resources/bundles/shopizer.properties b/sm-shop/src/main/resources/bundles/shopizer.properties
index a03d0ae..3f963d1 100644
--- a/sm-shop/src/main/resources/bundles/shopizer.properties
+++ b/sm-shop/src/main/resources/bundles/shopizer.properties
@@ -144,6 +144,9 @@ label.storefront.landingpage.title=Landing page title
label.profile.title=User profile
label.my.profile=My profile
label.profile.lastaccess=Last access
+label.register.personal.information=Personal information
+label.register.signin.information=Sign-in information
+label.register.createaccount=Create an account
#search
label.search.searchQuery=Search query
@@ -187,6 +190,12 @@ label.security.loggedinas=You are logged in as
label.security.nologinacces.store=We can't display store logon box
#customer
+label.customer.registered=Registered customer
+label.customer.new=New customer
+label.customer.registered.signinemail=If you have an account, sign in with your email address
+label.customer.signin.social=Make it easier and sign in with your {0} account!
+label.customer.signin.social.system=Sign in with {0}
+label.customer.faster=Creating an account has many benefits: check out faster, keep more than one address, track orders and more.
label.customer.myaccount=My Account
label.customer.contactus=Contact us
label.customer.list=Customer list
@@ -244,6 +253,7 @@ label.customer.shipping.firstname=Shipping first name
label.customer.shipping.lastname=Shipping last name
label.customer.shipping.name=Shipping name
label.customer.shipping.shipaddress=Ship to this address
+label.customer.shipping.shipdifferentaddress=Ship to a different address?
label.customer.confirmshippingaddress=Shipping address confirmation
@@ -264,11 +274,18 @@ label.customer.resetpasswor.confirm=Are you sure you want to reset the customer
label.customer.moredetails=More details!
label.order.editcustomer=Edit customer
label.order.displayagreement=Display customer terms and policy agreement in order page
+label.order.notes=Order notes
+label.order.notes.eg=Notes for the order or delivery
+
label.customer.currentpassword=Current password
label.customer.newpassword=New password
label.customer.repeatpassword=Repeat password
+label.customer.createaccount=Create an account?
+label.customer.accountpassword=Account password
+label.customer.createaccount.text=Create an account by entering the information below. If you are a returning customer please login using the link at the top of the page.
+
#permission
label.permissions.title=Permissions
label.permission.editpermission=Edit permission
@@ -434,6 +451,7 @@ label.content.boxes.name=Box name
label.content.sections=Content sections
label.content.friendlyurl=Friendly url
label.content.metatag.description=Description metatag
+label.content.page.displaymainmenu=Display this page in main menu
#shipping
label.shipping.title=Shipping configuration
@@ -477,6 +495,7 @@ label.shipping.origin.description=Shipping origin will help calculate the distan
#order
label.order.title=Orders
label.order.total=Total
+label.order.totals=Totals
label.order.date=Order date
label.order.module=Payment module
label.order.paymentmode=Payment mode
@@ -505,7 +524,7 @@ label.order.DELIVERED=Delivered
label.order.CANCELED=Canceled
refund=Refund
-order.total.subtotal=Sub-total
+order.total.subtotal=Subtotal
order.total.total=Total
order.total.shipping=Shipping
order.total.handling=Handling
@@ -525,6 +544,8 @@ label.payment.creditcard.usecredicard=Use your credit card
label.payment.creditcard.cardowner=Card Holder's Name
label.payment.creditcard.cardnumber=Card number
label.payment.creditcard.cardexpiry=Card expiry date
+label.payment.creditcard.cardexpiry.month=Card expiry month
+label.payment.creditcard.cardexpiry.year=Card expiry year
label.payment.creditcard.cardcvv=Card validation number
label.payment.creditcard.whatiscvv=What is a credit card validation number?
@@ -564,6 +585,7 @@ label.shipping.nopostalcode=A shipping quote will be available after filling the
#checkout
label.checkout=Checkout
+label.proceed.checkout=Proceed to checkout
label.subtotal=Sub-total
label.checkout.confirmation=Order completed
@@ -660,7 +682,7 @@ button.label.getcode=Get code
button.label.logout=Logout
button.label.logon=Logon
button.label.login=Login
-button.label.signin=Signin
+button.label.signin=Sign in
button.label.register=Register
button.label.select=Select
button.label.subscribe=Subscribe
@@ -708,6 +730,7 @@ menu.store-list=Stores
menu.security=Security
menu.security-permissions=Permissions
menu.security-groups=Groups
+menu.security-create-group=Create group
menu.order=Orders
menu.order-list=List of orders
menu.shipping=Shipping
diff --git a/sm-shop/src/main/resources/bundles/shopizer_fr.properties b/sm-shop/src/main/resources/bundles/shopizer_fr.properties
index d854830..f3318d2 100644
--- a/sm-shop/src/main/resources/bundles/shopizer_fr.properties
+++ b/sm-shop/src/main/resources/bundles/shopizer_fr.properties
@@ -54,7 +54,7 @@ label.generic.videos=Vidéos
label.generic.imageType=Type de média
label.generic.today=Aujourd'hui
-label.generic.welcome=Bienvenue
+label.generic.welcome=Bonjour
label.generic.weightunit.LB = Livres
label.generic.weightunit.KG = Kilogrammes
label.generic.language=Langue
@@ -143,6 +143,9 @@ label.storefront.landingpage.title = Titre de la page principale
label.profile.title=Profile de l'utilisateur
label.my.profile=Mon profile
label.profile.lastaccess=Dernier accès
+label.register.personal.information=Informations personnelles
+label.register.signin.information=Informations d'authentification
+label.register.createaccount=Crééer un compte
#search
label.search.searchQuery=mots recherchés
@@ -185,7 +188,13 @@ label.security.loggedinas=Vous êtes authentifié avec
label.security.nologinacces.store=Impossible de s'authentifier dans cette section.
#customer
-label.customer.myaccount=Mon Compte
+label.customer.registered=Client enregistré
+label.customer.new=Nouveau client
+label.customer.registered.signinemail=Si vous avez déjà un compte veuillez vous enregistrer avec votre addresse de courriel
+label.customer.signin.social=Encore plus simple, connectez-vous avec votre compte {0} !
+label.customer.signin.social.system=Connectez-vous avec {0}
+label.customer.faster=Il y a plusieurs bénéfices à créer un compte dont simplifier le processus d'achat, obtnir des informations sur vos commandes et bien plus.
+label.customer.myaccount=Mon compte
label.customer.contactus=Contactez-nous
label.customer.list=Liste de clients
label.customer.customerlist.title = Liste des clients
@@ -203,7 +212,6 @@ label.customer.telephone = Téléphone
label.customer.city = Ville
label.customer.zone = État / Province
label.customer.country = Pays
-label.customer.registered = Client inscrit (enregistré)
label.customer.editcustomer=Éditer un client
label.customer.createcustomer=Créer un client
label.customer.order.date= Date de la commande
@@ -244,6 +252,7 @@ label.customer.shipping.firstname=Prénom à la livraison
label.customer.shipping.lastname=Nom de famille à la livraison
label.customer.shipping.name=Nom à la livraison
label.customer.shipping.shipaddress=Livrer à cette adresse
+label.customer.shipping.shipdifferentaddress=Livrer à une adresse différente ?
label.customer.confirmshippingaddress=Confirmation de l'adresse de livraison
@@ -266,6 +275,16 @@ label.customer.resetpasswor.confirm=Êtes-vous certain de vouloir ré-initialise
label.customer.moredetails=Plus de détails !
label.order.editcustomer=Éditer le client
label.order.displayagreement=Afficher les termes et conditions dans la page d'achat
+label.order.notes=Notes
+label.order.notes.eg=Notes pour la commande ou pour la livraison
+
+label.customer.currentpassword=Mot de passe actuel
+label.customer.newpassword=Nouveau mot de passe
+label.customer.repeatpassword=Répéter le mot de passw
+
+label.customer.createaccount=Créer un compte ?
+label.customer.accountpassword=Mot de passe du compte
+label.customer.createaccount.text=Créez un compte en fournissant les informations requises ci-bas. Si vous possédez déjà un compte utilisez le lien au haut de la page permettant de vous authentifier.
#permission
label.permissions.title=Permissions
@@ -430,6 +449,7 @@ label.content.boxes.name=Nom de la boîte
label.content.sections=Sections de contenu
label.content.friendlyurl=URL simplifié
label.content.metatag.description=Méta donnée de description
+label.content.page.displaymainmenu=Afficher un line vers cette page dans le menu principal
#shipping
@@ -475,6 +495,7 @@ label.shipping.origin.description=L'adresse source de la livraison sert à calcu
#order
label.order.title=Commandes
label.order.total=Total
+label.order.totals=Total
label.order.date=Date de la commande
label.order.module=Module du paiement
label.order.shippingmethod=Mode d'expédition
@@ -522,8 +543,10 @@ label.payment.creditcard.usecredicard=Utitliser votre carte de crédit
label.payment.creditcard.cardowner=Nom inscrit sur la carte
label.payment.creditcard.cardnumber=Numéro de la carte
label.payment.creditcard.cardexpiry=Date d'expiration de la carte de crédit
+label.payment.creditcard.cardexpiry.month=Mois d'expiration
+label.payment.creditcard.cardexpiry.year=Année d'expiration
label.payment.creditcard.cardcvv=Numéro de validation de la carte de crédit
-label.payment.creditcard.whatiscvv=Qu'est-ce que le numéro de validation de la carte de crédit
+label.payment.creditcard.whatiscvv=Qu'est-ce que le numéro de validation de la carte de crédit ?
#tax
label.tax.taxclass.title=Classes de taxes
@@ -558,6 +581,7 @@ label.cart.placeorder=Passez votre commande
#checkout
label.checkout=Paiement
+label.proceed.checkout=Effectuer le paiement
label.subtotal=Sous-total
label.checkout.confirmation=La commande a été complétée
@@ -703,6 +727,7 @@ menu.store-list=Liste des boutiques
menu.security=Securité
menu.security-permissions=Permissions
menu.security-groups=Groupes
+menu.security-create-group=Créer un groupe
menu.order=Commandes
menu.order-list=Liste des commandes
menu.shipping=Expédition
diff --git a/sm-shop/src/main/resources/database.properties b/sm-shop/src/main/resources/database.properties
index c142b2f..89a1fe1 100644
--- a/sm-shop/src/main/resources/database.properties
+++ b/sm-shop/src/main/resources/database.properties
@@ -2,10 +2,16 @@
## configuration base de donnees
##
+#Need to run these commands before running shopizer - choose your username and password
+#mysql>CREATE DATABASE SALESMANAGER;
+#mysql>GRANT USAGE, SELECT ON *.* TO test@localhost IDENTIFIED BY 'password' with grant option;
+#mysql>GRANT ALL ON SALESMANAGER.* TO test@localhost;
+#mysql>GRANT FILE ON *.* TO test@localhost;
+#mysql>FLUSH PRIVILEGES;
#MYSQL
#db.jdbcUrl=jdbc:mysql://localhost:3306/SALESMANAGER?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8
-#db.user=username
+#db.user=root
#db.password=password
#db.driverClass=com.mysql.jdbc.Driver
#hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
@@ -22,6 +28,8 @@ db.preferredTestQuery=SELECT 1
db.schema=SALESMANAGER
hibernate.hbm2ddl.auto=update
+
+
##
## configuration pooling base de donn�es
##
diff --git a/sm-shop/src/main/resources/profiles/docker/database.properties b/sm-shop/src/main/resources/profiles/docker/database.properties
new file mode 100644
index 0000000..97cb23a
--- /dev/null
+++ b/sm-shop/src/main/resources/profiles/docker/database.properties
@@ -0,0 +1,38 @@
+##
+## configuration base de donnees
+##
+
+#Need to run these commands before running shopizer - choose your username and password
+#mysql>CREATE DATABASE SALESMANAGER;
+#mysql>GRANT USAGE, SELECT ON *.* TO test@localhost IDENTIFIED BY 'password' with grant option;
+#mysql>GRANT ALL ON SALESMANAGER.* TO test@localhost;
+#mysql>GRANT FILE ON *.* TO test@localhost;
+#mysql>FLUSH PRIVILEGES;
+
+#MYSQL
+#db.jdbcUrl=jdbc:mysql://localhost:3306/SALESMANAGER?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8
+#db.user=root
+#db.password=password
+#db.driverClass=com.mysql.jdbc.Driver
+#hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
+
+#H2
+db.jdbcUrl=jdbc\:h2\:file\:/tmp/SALESMANAGER;AUTOCOMMIT=OFF;;mv_store=false;INIT\=CREATE SCHEMA IF NOT EXISTS SALESMANAGER
+db.user=test
+db.password=password
+db.driverClass=org.h2.Driver
+hibernate.dialect=org.hibernate.dialect.H2Dialect
+
+
+db.preferredTestQuery=SELECT 1
+db.schema=SALESMANAGER
+hibernate.hbm2ddl.auto=update
+
+
+
+##
+## configuration pooling base de donn�es
+##
+db.initialPoolSize=4
+db.minPoolSize=4
+db.maxPoolSize=8
\ No newline at end of file
diff --git a/sm-shop/src/main/resources/spring/shopizer-controllers.xml b/sm-shop/src/main/resources/spring/shopizer-controllers.xml
index fdf611b..60378ba 100644
--- a/sm-shop/src/main/resources/spring/shopizer-controllers.xml
+++ b/sm-shop/src/main/resources/spring/shopizer-controllers.xml
@@ -76,7 +76,5 @@
<bean class="com.salesmanager.shop.filter.AdminFilter" />
</mvc:interceptor>
</mvc:interceptors>
-
-
-
+
</beans>
\ No newline at end of file
diff --git a/sm-shop/src/main/resources/spring/shopizer-properties.xml b/sm-shop/src/main/resources/spring/shopizer-properties.xml
index 943d050..86c41bd 100644
--- a/sm-shop/src/main/resources/spring/shopizer-properties.xml
+++ b/sm-shop/src/main/resources/spring/shopizer-properties.xml
@@ -13,17 +13,16 @@
<!--
image template bootstrap 350 x 376
- image template bootstrap3 350 x 376
image template exotica 400 x 400
-->
-
+ <!-- Properties to be used accross all components of the application -->
<util:properties id="shopizer-properties">
<prop key="MULTIPLE_PRICE_AVAILABILITY">false</prop>
<prop key="INDEX_PRODUCTS">true</prop>
- <!-- Images -->
- <prop key="PRODUCT_IMAGE_WIDTH_SIZE">400</prop>
- <prop key="PRODUCT_IMAGE_HEIGHT_SIZE">400</prop>
+ <!-- Images (aspect ratio) -->
+ <prop key="PRODUCT_IMAGE_WIDTH_SIZE">1000</prop>
+ <prop key="PRODUCT_IMAGE_HEIGHT_SIZE">800</prop>
<prop key="CROP_UPLOADED_IMAGES">false</prop>
<!-- upload image validations -->
@@ -32,24 +31,34 @@
<prop key="PRODUCT_IMAGE_MAX_SIZE">9000000</prop>
<prop key="IMAGE_FORMATS">jpg|png|gif</prop>
- <prop key="POPULATE_TEST_DATA">true</prop>
+ <prop key="POPULATE_TEST_DATA">false</prop>
<prop key="SHOP_SCHEME">http</prop>
<!-- when removing the context path from the url put that value to blank (nothing) otherwise put the uri for the web app eg /sm-shop -->
<prop key="CONTEXT_PATH"></prop>
<prop key="URL_EXTENSION">.html</prop>
+ <!-- search query -->
+ <prop key="SEARCH_QUERY"><![CDATA[{"query":{"multi_match":{"query":"%s","type":"best_fields","fields":["name^10","description^1"]}},"aggregations":{"categories":{"terms":{"field":"categories"}},"manufacturer":{"terms":{"field": "manufacturer"}}}}]]></prop>
<!-- Google maps key -->
- <prop key="shopizer.googlemaps_key">YOUR-KEY-HERE</prop>
+ <prop key="shopizer.googlemaps_key">AIzaSyB9NBFBiHKJ00SpVlRB495bTktcJE3iwNA</prop>
<!-- #https://www.google.com/recaptcha/admin/create -->
- <!-- to be used with localhost
- <prop key="shopizer.recapatcha_public_key">6LefQwsTAAAAAJWgJfNq_LgUwYunqct2x-EBr_CY</prop>
- <prop key="shopizer.recapatcha_private_key">6LefQwsTAAAAAM667PyQxTLkSfQ4P0YYeN5DQDTc</prop>
+ <!-- to be used with localhost -->
+ <prop key="shopizer.recapatcha_public_key">6Le3DiUUAAAAAGECVhc4zwFewu8bG-6etonJNTvD</prop>
+ <prop key="shopizer.recapatcha_private_key">6Le3DiUUAAAAAPUUz_JVqujTLRITPzbIR85khz6W</prop>
<prop key="shopizer.recapatcha_url"><![CDATA[https://www.google.com/recaptcha/api/siteverify]]></prop>
- -->
+
<!-- express checkout url -->
<prop key="PAYPAL_EXPRESSCHECKOUT_SANDBOX"><![CDATA[https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=]]></prop>
<prop key="PAYPAL_EXPRESSCHECKOUT_PRODUCTION"><![CDATA[https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=]]></prop>
<prop key="PAYPAL_EXPRESSCHECKOUT_REGULAR"><![CDATA[_express-checkout&token=]]></prop>
<prop key="PAYPAL_EXPRESSCHECKOUT_MOBILE"><![CDATA[_express-checkout-mobile&token=]]></prop>
+
+ <!-- Send HTML email after orders completed from the API -->
+ <prop key="ORDER_EMAIL_API">true</prop>
+
+ <!-- Validate credit card (Non PCI solutions used) in checkout action, not to be used
+ when stripe, braintree is enabled -->
+ <prop key="VALIDATE_CREDIT_CARD">false</prop>
+
</util:properties>
@@ -57,7 +66,7 @@
<!-- Add new templates in the list, should point to pages/shop/templates and resources/templates -->
<util:list id="templates" value-type="java.lang.String">
<value>bootstrap</value>
- <value>bootstrap3</value>
+ <value>generic</value>
<value>exoticamobilia</value>
</util:list>
diff --git a/sm-shop/src/main/resources/spring/shopizer-security.xml b/sm-shop/src/main/resources/spring/shopizer-security.xml
index 318c8d4..ed1e7a2 100644
--- a/sm-shop/src/main/resources/spring/shopizer-security.xml
+++ b/sm-shop/src/main/resources/spring/shopizer-security.xml
@@ -6,6 +6,10 @@
http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">
+
+ <!--
+ https://github.com/sunilpulugula/SpringSecuritySocialLoginExample
+ -->
<global-method-security secured-annotations="enabled" jsr250-annotations="enabled" pre-post-annotations="enabled"/>
@@ -17,6 +21,11 @@
<beans:bean id="customerDetailsService"
class="com.salesmanager.shop.store.security.CustomerServicesImpl">
</beans:bean>
+
+ <beans:bean id="jwtCustomerDetailsService"
+ class="com.salesmanager.shop.store.security.JWTCustomerServicesImpl">
+ </beans:bean>
+
<!-- JDBC User details -->
<beans:bean id="userDetailsService"
@@ -49,8 +58,12 @@
<http pattern="/layout/**" security="none" /><!-- remove css and other static resources -->
- <http pattern="/admin/**" auto-config="true" use-expressions="true" authentication-manager-ref="adminAuthenticationManager">
+ <http pattern="/admin/**"
+ auto-config="true"
+ use-expressions="true"
+ authentication-manager-ref="adminAuthenticationManager">
<!-- Shopizer logon page -->
+
<intercept-url pattern="/admin/logon*" access="permitAll" />
<intercept-url pattern="/admin/denied.html" access="permitAll" />
<intercept-url pattern="/admin/unauthorized.html" access="permitAll" />
@@ -64,6 +77,8 @@
<intercept-url pattern="/admin/*.html*" access="hasRole('AUTH')" />
<intercept-url pattern="/admin/*/*.html*" access="hasRole('AUTH')" />
<intercept-url pattern="/admin/*/*/*.html*" access="hasRole('AUTH')" />
+
+
<form-login login-page="/admin/logon.html"
@@ -86,8 +101,12 @@
- <http pattern="/shop/**" auto-config="true" use-expressions="true" authentication-manager-ref="customerAuthenticationManager">
-
+ <http pattern="/shop/**"
+ auto-config="true"
+ use-expressions="true"
+ entry-point-ref="shopAuthenticationEntryPoint"
+ authentication-manager-ref="customerAuthenticationManager">
+
<intercept-url pattern="/shop" access="permitAll" />
<intercept-url pattern="/shop/" access="permitAll" />
<intercept-url pattern="/shop/**" access="permitAll" />
@@ -113,17 +132,72 @@
</http>
- <!-- REST services -->
- <http pattern="/services/**" create-session="stateless" use-expressions="true" authentication-manager-ref="adminAuthenticationManager" entry-point-ref="servicesAuthenticationEntryPoint">
+ <!-- REST services v0 -->
+ <http pattern="/services/**"
+ create-session="stateless"
+ use-expressions="true"
+ authentication-manager-ref="adminAuthenticationManager"
+ entry-point-ref="servicesAuthenticationEntryPoint">
<intercept-url pattern="/services/private/**" access="hasRole('AUTH')"/>
<intercept-url pattern="/services/public/**" access="permitAll"/>
<form-login authentication-success-handler-ref="servicesAuthenticationSuccessHandler" />
<http-basic />
<csrf disabled="true"/><!-- Spring security 4 -->
</http>
+
+ <!-- REST services v1 for Admin REALM -->
+ <http pattern="/api/v1/private/**"
+ create-session="stateless"
+ use-expressions="true"
+ authentication-manager-ref="adminAuthenticationManager"
+ entry-point-ref="servicesAuthenticationEntryPoint">
+ <intercept-url pattern="/api/v1/private/**" access="hasRole('AUTH')"/>
+ <!--<intercept-url pattern="/api/v1/**" access="permitAll"/>-->
+ <form-login authentication-success-handler-ref="servicesAuthenticationSuccessHandler" />
+ <http-basic />
+ <csrf disabled="true"/><!-- Spring security 4 -->
+ </http>
+ <!-- REST services v1 for Customer REALM -->
+ <!-- http://www.gauravbytes.com/2017/03/spring-security-digest-authentication.html
+
+ https://www.toptal.com/java/rest-security-with-jwt-spring-security-and-java
+ https://github.com/szerhusenBC/jwt-spring-security-demo
+
+ FB
+ https://github.com/ozgengunay/FBSpringSocialRESTAuth
+
+ App access token
+ https://developers.facebook.com/tools/access_token/
+
+
+ FB user access token
+ EAABZBKVBQN2QBALvVE6RfhdzNVw3JkZCN6HDzGqeFXJJ5kOupH8EZA5PQrgO4sAOy7MfOS8pfilGtWeYlhT6eA7v5Obj02uPBq9oW9mdZC52GuTWnO18kTUKpqAx45CjZCqoKDGsPzTk0DWLkdcBDo3aDuUKW3wiFLGeRyuVmBKTmOLprOVtI7nISmb4tTsYZD
+
+ -->
+
+ <http pattern="/api/v1/auth/**"
+ create-session="stateless"
+ use-expressions="true"
+ authentication-manager-ref="jwtCustomerAuthenticationManager"
+ entry-point-ref="restAuthenticationEntryPoint">
+
+ <intercept-url pattern="/api/v1/auth/register" access="permitAll" />
+ <intercept-url pattern="/api/v1/auth/login" access="permitAll" />
+ <intercept-url pattern="/api/v1/auth/refresh" access="permitAll" />
+ <intercept-url pattern="/api/v1/auth/**" method="OPTIONS" access="permitAll"/>
+ <intercept-url pattern="/api/v1/auth/**" access="hasRole('AUTH_CUSTOMER')"/>
+
+ <custom-filter ref="authenticationTokenFilter" before="FORM_LOGIN_FILTER"/>
+ <logout />
+ <csrf disabled="true"/>
+ </http>
+
-
+ <beans:bean id="authenticationTokenFilter"
+ class="com.salesmanager.shop.store.security.AuthenticationTokenFilter">
+ </beans:bean>
+
<authentication-manager id="adminAuthenticationManager">
<authentication-provider user-service-ref="userDetailsService">
<password-encoder ref="passwordEncoder" hash="sha"/>
@@ -136,6 +210,43 @@
</authentication-provider>
</authentication-manager>
+ <!-- Authenticates API -->
+ <authentication-manager id="jwtCustomerAuthenticationManager">
+ <authentication-provider user-service-ref="jwtCustomerDetailsService">
+ <password-encoder ref="passwordEncoder" hash="sha"/>
+ </authentication-provider>
+ </authentication-manager>
+
+ <!-- Facebook authentication -->
+ <authentication-manager id="facebookAuthenticationManager">
+ <authentication-provider
+ ref="socialAuthenticationProvider" />
+ </authentication-manager>
+
+ <!-- Configures the social authentication provider which processes authentication
+ requests made by using social authentication service (FB). -->
+ <beans:bean id="socialAuthenticationProvider"
+ class="org.springframework.social.security.SocialAuthenticationProvider">
+ <beans:constructor-arg index="0" ref="socialUsersConnectionRepository" />
+ <beans:constructor-arg index="1" ref="facebookSocialUserDetailsService" />
+ </beans:bean>
+
+
+
+ <beans:bean id="adminAuthenticationEntryPoint"
+ class="org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint">
+ <beans:property name="realmName" value="admin-realm" />
+ </beans:bean>
+
+ <beans:bean id="shopAuthenticationEntryPoint"
+ class="org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint">
+ <beans:property name="realmName" value="shop-realm" />
+ </beans:bean>
+ <!-- This bean encrypts the authorization details of the connection. In
+ our example, the authorization details are stored as plain text. DO NOT USE
+ THIS IN PRODUCTION. -->
+ <beans:bean id="textEncryptor" class="org.springframework.security.crypto.encrypt.Encryptors"
+ factory-method="noOpText" />
</beans:beans>
\ No newline at end of file
diff --git a/sm-shop/src/main/resources/spring/shopizer-servlet-context.xml b/sm-shop/src/main/resources/spring/shopizer-servlet-context.xml
index d539a58..81e5284 100644
--- a/sm-shop/src/main/resources/spring/shopizer-servlet-context.xml
+++ b/sm-shop/src/main/resources/spring/shopizer-servlet-context.xml
@@ -4,11 +4,16 @@
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:task="http://www.springframework.org/schema/task"
xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:social="http://www.springframework.org/schema/social"
+ xmlns:facebook="http://www.springframework.org/schema/social/facebook"
xsi:schemaLocation="
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
+ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
+ http://www.springframework.org/schema/social http://www.springframework.org/schema/social/spring-social.xsd
+ http://www.springframework.org/schema/social/facebook http://www.springframework.org/schema/social/spring-social-facebook.xsd">
+
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
@@ -46,10 +51,43 @@
<beans:bean id="messages" class="com.salesmanager.shop.utils.LabelUtils"/>
+ <!-- with infinispan -->
<!-- load images from local web server [com.salesmanager.web.utils.LocalImageFilePathUtils] -->
<beans:bean id="img" class="com.salesmanager.shop.utils.LocalImageFilePathUtils">
<beans:property name="basePath" value="/static" />
+ </beans:bean>
+
+ <!-- External web server -->
+ <!-- load images from external web server [com.salesmanager.web.utils.ImageFilePathUtils] -->
+ <!--
+ <beans:bean id="img" class="com.salesmanager.shop.utils.ImageFilePathUtils">
+ <beans:property name="basePath" value="http://localhost:80/bam-images" />
</beans:bean>
+ -->
+ <!--
+ Configures FB and Twitter support.
+ -->
+
+ <facebook:config app-id="${facebook.app.id}" app-secret="${facebook.app.secret}"/>
+
+ <!--
+ Configures the connection repository. This application uses JDBC
+ connection repository which saves connection details to database.
+ This repository uses the data source bean for obtaining database
+ connection.
+
+ -->
+
+ <social:jdbc-connection-repository/>
+
+ <!--
+ This bean manages the connection flow between the account provider and
+ the example application.
+ -->
+
+
+ <beans:bean id="connectController" class="org.springframework.social.connect.web.ConnectController"
+ autowire="constructor"/>
</beans:beans>
\ No newline at end of file
sm-shop/src/main/webapp/common/adminLinks.jsp 72(+36 -36)
diff --git a/sm-shop/src/main/webapp/common/adminLinks.jsp b/sm-shop/src/main/webapp/common/adminLinks.jsp
index 0eac544..64ed467 100644
--- a/sm-shop/src/main/webapp/common/adminLinks.jsp
+++ b/sm-shop/src/main/webapp/common/adminLinks.jsp
@@ -1,36 +1,36 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
- <!-- Le styles -->
-
- <link href="<c:url value="/resources/css/bootstrap/css/sm-bootstrap.css" />" rel="stylesheet">
- <link href="<c:url value="/resources/css/bootstrap/css/sm-bootstrap-responsive.css" />" rel="stylesheet">
-
-
-
-
-
- <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
- <!--[if lt IE 9]>
- <!--<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>-->
- <![endif]-->
- <link href="<c:url value="/resources/css/shopizer-admin.css" />" rel="stylesheet">
-
-
- <script src="<c:url value="/resources/js/jquery.showLoading.min.js" />"></script>
- <link href="<c:url value="/resources/css/showLoading.css" />" rel="stylesheet">
-
-
- <script>var isomorphicDir="<c:url value="/resources/smart-client/" />";</script>
- <script SRC="<c:url value="/resources/smart-client/system/modules/ISC_Core.js" />"></script>
- <script SRC="<c:url value="/resources/smart-client/system/modules/ISC_Foundation.js" />"></script>
- <script SRC="<c:url value="/resources/smart-client/system/modules/ISC_Containers.js" />"></script>
- <script SRC="<c:url value="/resources/smart-client/system/modules/ISC_Grids.js" />"></script>
- <script SRC="<c:url value="/resources/smart-client/system/modules/ISC_Forms.js" />"></script>
- <script SRC="<c:url value="/resources/smart-client/system/modules/ISC_DataBinding.js" />"></script>
- <script SRC="<c:url value="/resources/smart-client/skins/Graphite/load_skin.js" />"></script>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+ <!-- Le styles -->
+
+ <link href="<c:url value="/resources/css/bootstrap/css/sm-bootstrap.css" />" rel="stylesheet">
+ <link href="<c:url value="/resources/css/bootstrap/css/sm-bootstrap-responsive.css" />" rel="stylesheet">
+
+
+
+
+
+ <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
+ <!--[if lt IE 9]>
+ <!--<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>-->
+ <![endif]-->
+ <link href="<c:url value="/resources/css/shopizer-admin.css" />" rel="stylesheet">
+
+
+ <script src="<c:url value="/resources/js/jquery.showLoading.min.js" />"></script>
+ <link href="<c:url value="/resources/css/showLoading.css" />" rel="stylesheet">
+
+
+ <script>var isomorphicDir="<c:url value="/resources/smart-client/" />";</script>
+ <script SRC="<c:url value="/resources/smart-client/system/modules/ISC_Core.js" />"></script>
+ <script SRC="<c:url value="/resources/smart-client/system/modules/ISC_Foundation.js" />"></script>
+ <script SRC="<c:url value="/resources/smart-client/system/modules/ISC_Containers.js" />"></script>
+ <script SRC="<c:url value="/resources/smart-client/system/modules/ISC_Grids.js" />"></script>
+ <script SRC="<c:url value="/resources/smart-client/system/modules/ISC_Forms.js" />"></script>
+ <script SRC="<c:url value="/resources/smart-client/system/modules/ISC_DataBinding.js" />"></script>
+ <script SRC="<c:url value="/resources/smart-client/skins/Graphite/load_skin.js" />"></script>
+
diff --git a/sm-shop/src/main/webapp/common/adminTabs.jsp b/sm-shop/src/main/webapp/common/adminTabs.jsp
index f0234fc..4d7b2d2 100644
--- a/sm-shop/src/main/webapp/common/adminTabs.jsp
+++ b/sm-shop/src/main/webapp/common/adminTabs.jsp
@@ -22,7 +22,7 @@
<ul class="dropdown-menu">
<c:forEach items="${menu.menus}" var="submenu">
<sec:authorize access="hasRole('${submenu.role}') and fullyAuthenticated">
- <li><a href="#" id="${submenu.code}-link" data-toggle="tab"><s:message code="menu.${submenu.code}" text="${submenu.code}"/></a></li>
+ <li><a href="#" onClick="window.location.href='${submenu.url}';" id="${submenu.code}-link" data-toggle="tab"><s:message code="menu.${submenu.code}" text="${submenu.code}"/></a></li>
</sec:authorize>
</c:forEach>
</ul>
diff --git a/sm-shop/src/main/webapp/layout/admin/layout.jsp b/sm-shop/src/main/webapp/layout/admin/layout.jsp
index 42688e2..abf2774 100644
--- a/sm-shop/src/main/webapp/layout/admin/layout.jsp
+++ b/sm-shop/src/main/webapp/layout/admin/layout.jsp
@@ -39,7 +39,6 @@ response.setDateHeader ("Expires", -1);
<script src="<c:url value="/resources/js/bootstrap/jquery.js" />"></script>
<script src="<c:url value="/resources/js/jquery.friendurl.min.js" />"></script>
- <link rel="icon" href="<c:url value="/static/favicon.ico"/>">
<jsp:include page="/common/adminLinks.jsp" />
@@ -202,18 +201,12 @@ response.setDateHeader ("Expires", -1);
$(document).ready(function(){
- $("#catalogue-products-create-link").click(function() {
- window.location='<c:url value="/admin/products/createProduct.html" />';
- });
$("#catalogue-categories-list-link").click(function() {
window.location='<c:url value="/admin/categories/categories.html" />';
});
$("#catalogue-products-categories-link").click(function() {
window.location='<c:url value="/admin/products/product-categories.html" />';
});
- $("#catalogue-link").click(function() {
- window.location='<c:url value="/admin/products/products.html" />';
- });
$("#catalogue-categories-hierarchy-link").click(function() {
window.location='<c:url value="/admin/categories/hierarchy.html" />';
});
diff --git a/sm-shop/src/main/webapp/pages/admin/categories/categories.jsp b/sm-shop/src/main/webapp/pages/admin/categories/categories.jsp
index e7f42c0..237d575 100644
--- a/sm-shop/src/main/webapp/pages/admin/categories/categories.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/categories/categories.jsp
@@ -1,59 +1,59 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
- <div class="sm-ui-component">
- <h3><s:message code="label.categories.title" text="Categories" /></h3>
- <br/>
-
-
-
-
- <!-- Listing grid include -->
- <c:set value="/admin/categories/paging.html" var="pagingUrl" scope="request"/>
- <c:set value="/admin/categories/remove.html" var="removeUrl" scope="request"/>
- <c:set value="/admin/categories/editCategory.html" var="editUrl" scope="request"/>
- <c:set value="/admin/categories/categories.html" var="afterRemoveUrl" scope="request"/>
- <c:set var="entityId" value="categoryId" scope="request"/>
- <c:set var="componentTitleKey" value="label.categories.title" scope="request"/>
- <c:set var="gridHeader" value="/pages/admin/categories/categories-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="true" scope="request"/>
-
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+ <div class="sm-ui-component">
+ <h3><s:message code="label.categories.title" text="Categories" /></h3>
+ <br/>
+
+
+
+
+ <!-- Listing grid include -->
+ <c:set value="/admin/categories/paging.html" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/categories/remove.html" var="removeUrl" scope="request"/>
+ <c:set value="/admin/categories/editCategory.html" var="editUrl" scope="request"/>
+ <c:set value="/admin/categories/categories.html" var="afterRemoveUrl" scope="request"/>
+ <c:set var="entityId" value="categoryId" scope="request"/>
+ <c:set var="componentTitleKey" value="label.categories.title" scope="request"/>
+ <c:set var="gridHeader" value="/pages/admin/categories/categories-gridHeader.jsp" scope="request"/>
+ <c:set var="canRemoveEntry" value="true" scope="request"/>
+
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/categories/categories-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/categories/categories-gridHeader.jsp
index be64c85..738ef3b 100644
--- a/sm-shop/src/main/webapp/pages/admin/categories/categories-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/categories/categories-gridHeader.jsp
@@ -1,13 +1,13 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
- {title:"<s:message code="label.entity.id" text="Id"/>", name:"categoryId", canFilter:false},
- {title:"<s:message code="label.entity.name" text="Name"/>", name:"name"},
- {title:"<s:message code="label.entity.code" text="Code"/>", name:"code", canFiler:false},
- {title:"<s:message code="label.entity.visible" text="Visible"/>", name:"visible", canFilter:false},
- {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+ {title:"<s:message code="label.entity.id" text="Id"/>", name:"categoryId", canFilter:false},
+ {title:"<s:message code="label.entity.name" text="Name"/>", name:"name"},
+ {title:"<s:message code="label.entity.code" text="Code"/>", name:"code", canFiler:false},
+ {title:"<s:message code="label.entity.visible" text="Visible"/>", name:"visible", canFilter:false},
+ {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
sm-shop/src/main/webapp/pages/admin/categories/category.jsp 542(+271 -271)
diff --git a/sm-shop/src/main/webapp/pages/admin/categories/category.jsp b/sm-shop/src/main/webapp/pages/admin/categories/category.jsp
index 3b9fd79..759e99a 100644
--- a/sm-shop/src/main/webapp/pages/admin/categories/category.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/categories/category.jsp
@@ -1,272 +1,272 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-<script src="<c:url value="/resources/js/ckeditor/ckeditor.js" />"></script>
-<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
-
-
- <script type="text/javascript">
-
-
-
- $(function(){
- $('#order').numeric();
- if($("#code").val()=="") {
- $('.btn').addClass('disabled');
- }
- <c:forEach items="${category.descriptions}" var="description" varStatus="counter">
- $("#name${counter.index}").friendurl({id : 'seUrl${counter.index}'});
- </c:forEach>
- });
-
-
- function validateCode() {
- $('#checkCodeStatus').html('<img src="<c:url value="/resources/img/ajax-loader.gif" />');
- $('#checkCodeStatus').show();
- var code = $("#code").val();
- var id = $("#id").val();
- checkCode(code,id,'<c:url value="/admin/categories/checkCategoryCode.html" />');
- }
-
- function callBackCheckCode(msg,code) {
- console.log(code);
- if(code==0) {
- $('.btn').removeClass('disabled');
- }
- if(code==9999) {
-
- $('#checkCodeStatus').html('<font color="green"><s:message code="message.code.available" text="This code is available"/></font>');
- $('#checkCodeStatus').show();
- $('.btn').removeClass('disabled');
- }
- if(code==9998) {
-
- $('#checkCodeStatus').html('<font color="red"><s:message code="message.code.exist" text="This code already exist"/></font>');
- $('#checkCodeStatus').show();
- $('.btn').addClass('disabled');
- }
-
- }
-
-
- </script>
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
- <div class="sm-ui-component">
-
-
- <h3>
- <c:choose>
- <c:when test="${category.id!=null && category.id>0}">
- <s:message code="label.category.editcategory" text="Edit category" /> <c:out value="${category.code}"/>
- </c:when>
- <c:otherwise>
- <s:message code="label.category.createcategory" text="Create category" />
- </c:otherwise>
- </c:choose>
-
- </h3>
- <br/>
-
- <c:url var="categorySave" value="/admin/categories/save.html"/>
-
-
- <form:form method="POST" commandName="category" action="${categorySave}">
-
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
-
-
-
- <div class="control-group">
- <label><s:message code="label.category.parentcategory" text="Category vsible"/></label>
- <div class="controls">
-
- <div class="controls">
- <s:message code="label.category.root" text="Root" var="rootVar"/>
- <form:select path="parent.id">
- <form:option value="-1" label="${rootVar}" />
- <form:options items="${categories}" itemValue="id" itemLabel="descriptions[0].name"/>
- </form:select>
- <span class="help-inline"><form:errors path="parent.id" cssClass="error" /></span>
- </div>
-
- </div>
- </div>
-
-
- <div class="control-group">
- <label><s:message code="label.entity.visible" text="Visible"/></label>
- <div class="controls">
- <form:checkbox path="visible" />
-
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.category.code" text="Category code"/></label>
- <div class="controls">
- <form:input cssClass="input-large highlight" path="code" onblur="validateCode()"/>
- <span class="help-inline"><div id="checkCodeStatus" style="display:none;"></div><form:errors path="code" cssClass="error" /></span>
- </div>
- </div>
-
- <c:forEach items="${category.descriptions}" var="description" varStatus="counter">
-
- <div class="control-group">
- <label><s:message code="label.productedit.categoryname" text="Category name"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:input cssClass="input-large highlight" id="name${counter.index}" path="descriptions[${counter.index}].name"/>
- <span class="help-inline"><form:errors path="descriptions[${counter.index}].name" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.category.highlight" text="Category highlight"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:input cssClass="input-large" id="categoryHighlight${counter.index}" path="descriptions[${counter.index}].categoryHighlight"/>
- <span class="help-inline"><form:errors path="descriptions[${counter.index}].categoryHighlight" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.sefurl" text="SEF Url"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:input cssClass="highlight" id="seUrl${counter.index}" path="descriptions[${counter.index}].seUrl"/>
- <span class="help-inline"><form:errors path="descriptions[${counter.index}].seUrl" cssClass="error" /></span>
- </div>
-
- </div>
-
- <div class="control-group">
- <label><s:message code="label.category.categorydescription" text="Category description"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
-
-
-
- <textarea cols="30" id="descriptions[${counter.index}].description" class="ckeditor" name="descriptions[${counter.index}].description">
- <c:out value="${category.descriptions[counter.index].description}"/>
- </textarea>
-
-
- </div>
-
- <script type="text/javascript">
- //<![CDATA[
-
- CKEDITOR.replace('descriptions[${counter.index}].description',
- {
- skin : 'office2003',
- toolbar :
- [
- ['Source','-','Save','NewPage','Preview'],
- ['Cut','Copy','Paste','PasteText','-','Print'],
- ['Undo','Redo','-','Find','-','SelectAll','RemoveFormat'], '/',
- ['Bold','Italic','Underline','Strike','-','Subscript','Superscript'],
- ['NumberedList','BulletedList','-','Outdent','Indent','Blockquote'],
- ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
- ['Link','Unlink','Anchor'],
- ['Image','Flash','Table','HorizontalRule','SpecialChar','PageBreak'], '/',
- ['Styles','Format','Font','FontSize'], ['TextColor','BGColor'],
- ['Maximize', 'ShowBlocks']
- ],
-
- filebrowserWindowWidth : '720',
- filebrowserWindowHeight : '740',
- filebrowserImageBrowseUrl : '<c:url value="/admin/content/fileBrowser.html"/>'
-
-
- });
-
- //]]>
- </script>
-
- </div>
-
- <div class="control-group">
- <label><s:message code="label.category.title" text="Metatag title"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:input path="descriptions[${counter.index}].metatagTitle"/>
- <span class="help-inline"><form:errors path="descriptions[${counter.index}].metatagTitle" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.metatags.keywords" text="Metatag keywords"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:input path="descriptions[${counter.index}].metatagKeywords"/>
- <span class="help-inline"><form:errors path="descriptions[${counter.index}].metatagKeywords" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.metatags.description" text="Metatag description"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:input path="descriptions[${counter.index}].metatagDescription"/>
- <span class="help-inline"><form:errors path="descriptions[${counter.index}].metatagDescription" cssClass="error" /></span>
- </div>
- </div>
-
- <form:hidden path="descriptions[${counter.index}].language.code" />
- <form:hidden path="descriptions[${counter.index}].id" />
-
- </c:forEach>
-
- <div class="control-group">
- <label><s:message code="label.entity.order" text="Sort order"/></label>
- <div class="controls">
- <form:input id="order" cssClass="" path="sortOrder"/>
- <span class="help-inline"><form:errors path="sortOrder" cssClass="error" /></span>
- </div>
- </div>
-
- <form:hidden path="id" />
-
- <div class="form-actions">
-
- <div class="pull-right">
-
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
-
-
- </div>
-
- </div>
-
- </form:form>
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+<script src="<c:url value="/resources/js/ckeditor/ckeditor.js" />"></script>
+<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
+
+
+ <script type="text/javascript">
+
+
+
+ $(function(){
+ $('#order').numeric();
+ if($("#code").val()=="") {
+ $('.btn').addClass('disabled');
+ }
+ <c:forEach items="${category.descriptions}" var="description" varStatus="counter">
+ $("#name${counter.index}").friendurl({id : 'seUrl${counter.index}'});
+ </c:forEach>
+ });
+
+
+ function validateCode() {
+ $('#checkCodeStatus').html('<img src="<c:url value="/resources/img/ajax-loader.gif" />');
+ $('#checkCodeStatus').show();
+ var code = $("#code").val();
+ var id = $("#id").val();
+ checkCode(code,id,'<c:url value="/admin/categories/checkCategoryCode.html" />');
+ }
+
+ function callBackCheckCode(msg,code) {
+ console.log(code);
+ if(code==0) {
+ $('.btn').removeClass('disabled');
+ }
+ if(code==9999) {
+
+ $('#checkCodeStatus').html('<font color="green"><s:message code="message.code.available" text="This code is available"/></font>');
+ $('#checkCodeStatus').show();
+ $('.btn').removeClass('disabled');
+ }
+ if(code==9998) {
+
+ $('#checkCodeStatus').html('<font color="red"><s:message code="message.code.exist" text="This code already exist"/></font>');
+ $('#checkCodeStatus').show();
+ $('.btn').addClass('disabled');
+ }
+
+ }
+
+
+ </script>
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+ <div class="sm-ui-component">
+
+
+ <h3>
+ <c:choose>
+ <c:when test="${category.id!=null && category.id>0}">
+ <s:message code="label.category.editcategory" text="Edit category" /> <c:out value="${category.code}"/>
+ </c:when>
+ <c:otherwise>
+ <s:message code="label.category.createcategory" text="Create category" />
+ </c:otherwise>
+ </c:choose>
+
+ </h3>
+ <br/>
+
+ <c:url var="categorySave" value="/admin/categories/save.html"/>
+
+
+ <form:form method="POST" commandName="category" action="${categorySave}">
+
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+
+
+
+ <div class="control-group">
+ <label><s:message code="label.category.parentcategory" text="Category vsible"/></label>
+ <div class="controls">
+
+ <div class="controls">
+ <s:message code="label.category.root" text="Root" var="rootVar"/>
+ <form:select path="parent.id">
+ <form:option value="-1" label="${rootVar}" />
+ <form:options items="${categories}" itemValue="id" itemLabel="descriptions[0].name"/>
+ </form:select>
+ <span class="help-inline"><form:errors path="parent.id" cssClass="error" /></span>
+ </div>
+
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.entity.visible" text="Visible"/></label>
+ <div class="controls">
+ <form:checkbox path="visible" />
+
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.category.code" text="Category code"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" path="code" onblur="validateCode()"/>
+ <span class="help-inline"><div id="checkCodeStatus" style="display:none;"></div><form:errors path="code" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <c:forEach items="${category.descriptions}" var="description" varStatus="counter">
+
+ <div class="control-group">
+ <label><s:message code="label.productedit.categoryname" text="Category name"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" id="name${counter.index}" path="descriptions[${counter.index}].name"/>
+ <span class="help-inline"><form:errors path="descriptions[${counter.index}].name" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.category.highlight" text="Category highlight"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:input cssClass="input-large" id="categoryHighlight${counter.index}" path="descriptions[${counter.index}].categoryHighlight"/>
+ <span class="help-inline"><form:errors path="descriptions[${counter.index}].categoryHighlight" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.sefurl" text="SEF Url"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:input cssClass="highlight" id="seUrl${counter.index}" path="descriptions[${counter.index}].seUrl"/>
+ <span class="help-inline"><form:errors path="descriptions[${counter.index}].seUrl" cssClass="error" /></span>
+ </div>
+
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.category.categorydescription" text="Category description"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+
+
+
+ <textarea cols="30" id="descriptions[${counter.index}].description" class="ckeditor" name="descriptions[${counter.index}].description">
+ <c:out value="${category.descriptions[counter.index].description}"/>
+ </textarea>
+
+
+ </div>
+
+ <script type="text/javascript">
+ //<![CDATA[
+
+ CKEDITOR.replace('descriptions[${counter.index}].description',
+ {
+ skin : 'office2003',
+ toolbar :
+ [
+ ['Source','-','Save','NewPage','Preview'],
+ ['Cut','Copy','Paste','PasteText','-','Print'],
+ ['Undo','Redo','-','Find','-','SelectAll','RemoveFormat'], '/',
+ ['Bold','Italic','Underline','Strike','-','Subscript','Superscript'],
+ ['NumberedList','BulletedList','-','Outdent','Indent','Blockquote'],
+ ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
+ ['Link','Unlink','Anchor'],
+ ['Image','Flash','Table','HorizontalRule','SpecialChar','PageBreak'], '/',
+ ['Styles','Format','Font','FontSize'], ['TextColor','BGColor'],
+ ['Maximize', 'ShowBlocks']
+ ],
+
+ filebrowserWindowWidth : '720',
+ filebrowserWindowHeight : '740',
+ filebrowserImageBrowseUrl : '<c:url value="/admin/content/fileBrowser.html"/>'
+
+
+ });
+
+ //]]>
+ </script>
+
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.category.title" text="Metatag title"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:input path="descriptions[${counter.index}].metatagTitle"/>
+ <span class="help-inline"><form:errors path="descriptions[${counter.index}].metatagTitle" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.metatags.keywords" text="Metatag keywords"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:input path="descriptions[${counter.index}].metatagKeywords"/>
+ <span class="help-inline"><form:errors path="descriptions[${counter.index}].metatagKeywords" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.metatags.description" text="Metatag description"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:input path="descriptions[${counter.index}].metatagDescription"/>
+ <span class="help-inline"><form:errors path="descriptions[${counter.index}].metatagDescription" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <form:hidden path="descriptions[${counter.index}].language.code" />
+ <form:hidden path="descriptions[${counter.index}].id" />
+
+ </c:forEach>
+
+ <div class="control-group">
+ <label><s:message code="label.entity.order" text="Sort order"/></label>
+ <div class="controls">
+ <form:input id="order" cssClass="" path="sortOrder"/>
+ <span class="help-inline"><form:errors path="sortOrder" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <form:hidden path="id" />
+
+ <div class="form-actions">
+
+ <div class="pull-right">
+
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
+
+
+ </div>
+
+ </div>
+
+ </form:form>
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
sm-shop/src/main/webapp/pages/admin/categories/hierarchy.jsp 344(+172 -172)
diff --git a/sm-shop/src/main/webapp/pages/admin/categories/hierarchy.jsp b/sm-shop/src/main/webapp/pages/admin/categories/hierarchy.jsp
index 05b039b..f47bc14 100644
--- a/sm-shop/src/main/webapp/pages/admin/categories/hierarchy.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/categories/hierarchy.jsp
@@ -1,172 +1,172 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
- <div class="sm-ui-component">
- <h3><s:message code="label.categories.hierarchy.title" text="Category hierarchy" /></h3>
- <br/>
- <div class="well">
- <s:message code="label.category.hierarchy.text" text="Drag categories to re-organize the hierarchy" />
- </div>
- <br/>
-
- <script>
-
-
-
-///isc.showConsole();
-
-
-// User Interface
-// ---------------------------------------------------------------------
-
-
-
- //iterate from category objects to display data
- isc.TreeGrid.create({
- ID:"categoryTree",
- border:1,
- showResizeBar: false,
-
- data: isc.Tree.create({
- modelType: "parent",
- nameProperty: "Name",
- idField: "categoryId",
- parentIdField: "parentId",
- data: [
- {categoryId:"-1", parentId:"0", Name:"<s:message code="label.category.root" text="Root" />", isFolder: true},
- <c:forEach items="${categories}" var="category" varStatus="status">
- {categoryId:'<c:out value="${category.id}" />', parentId:'<c:choose><c:when test="${category.parent!=null}"><c:out value="${category.parent.id}" /></c:when><c:otherwise>-1</c:otherwise></c:choose>', Name:'<c:out value="${category.descriptions[0].name}" />', isFolder: true}
- <c:if test="${status.count<fn:length(categories)}">,</c:if>
- </c:forEach>
- ]
- }),
-
-
- //nodeClick:"itemList.fetchData({categoryId:node.categoryId})",
- showHeader:false,
- leaveScrollbarGap:false,
- animateFolders:true,
- canReorderRecords: true,
- canAcceptDroppedRecords: true,
- canReparentNodes:true,
- selectionType:"single",
- animateRowsMaxTime:750,
- folderDrop: function (dragRecords, dropFolder, index, sourceWidget) {
- var record=categoryTree.getSelectedRecord();
- var newUnit=dropFolder.SysId;
- var newRecord=record;
- newRecord.ReportsTo=newUnit;
-
- //ajax call
- $.ajax({
- type: 'POST',
- dataType: "json",
- url: "<c:url value="/admin/categories/moveCategory.html" />",
- data: "parentId="+ dropFolder.categoryId + "&childId=" + newRecord.categoryId,
- success: function(response) {
- var msg = isc.XMLTools.selectObjects(response, "/response/statusMessage");
- var status = isc.XMLTools.selectObjects(response, "/response/status");
-
-
- if(status==0 || status ==9999) {
- categoryTree.removeData(record);
- categoryTree.data.addList([newRecord],dropFolder, index);
- } else {
- if(msg!=null && msg !='') {
- alert("! " + msg);
- }
- }
-
- },
- error: function(jqXHR,textStatus,errorThrown) {
- alert(jqXHR + "-" + textStatus + "-" + errorThrown);
-
- //alert(data.statusMessage);
- }
-
- });
-
-
-
-
-
- //alert(index);
- //alert(dropFolder.categoryId);
- //alert(newRecord.categoryId);
- }
-
-
-
- });
-
-
-
-
-
-
-
-
-// Define application layout
-// ---------------------------------------------------------------------
-
-isc.HLayout.create({
- ID:"pageLayout",
- width: "680",
- height: "600",
- position:"relative",
- members:[
-
- isc.SectionStack.create({
- ID:"mainLayout",
- visibilityMode:"multiple",
- animateSections:true,
- sections:[
- {title:"<s:message code="label.categories.hierarchy.title" text="Category hierarchy"/>", autoShow:true, items:[categoryTree]}
- ]
- })
-
-
- ]
-});
-
-isc.Page.setEvent("load", "pageLayout.draw()");
-
- </script>
-
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
- </div>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+ <div class="sm-ui-component">
+ <h3><s:message code="label.categories.hierarchy.title" text="Category hierarchy" /></h3>
+ <br/>
+ <div class="well">
+ <s:message code="label.category.hierarchy.text" text="Drag categories to re-organize the hierarchy" />
+ </div>
+ <br/>
+
+ <script>
+
+
+
+///isc.showConsole();
+
+
+// User Interface
+// ---------------------------------------------------------------------
+
+
+
+ //iterate from category objects to display data
+ isc.TreeGrid.create({
+ ID:"categoryTree",
+ border:1,
+ showResizeBar: false,
+
+ data: isc.Tree.create({
+ modelType: "parent",
+ nameProperty: "Name",
+ idField: "categoryId",
+ parentIdField: "parentId",
+ data: [
+ {categoryId:"-1", parentId:"0", Name:"<s:message code="label.category.root" text="Root" />", isFolder: true},
+ <c:forEach items="${categories}" var="category" varStatus="status">
+ {categoryId:'<c:out value="${category.id}" />', parentId:'<c:choose><c:when test="${category.parent!=null}"><c:out value="${category.parent.id}" /></c:when><c:otherwise>-1</c:otherwise></c:choose>', Name:'<c:out value="${category.descriptions[0].name}" />', isFolder: true}
+ <c:if test="${status.count<fn:length(categories)}">,</c:if>
+ </c:forEach>
+ ]
+ }),
+
+
+ //nodeClick:"itemList.fetchData({categoryId:node.categoryId})",
+ showHeader:false,
+ leaveScrollbarGap:false,
+ animateFolders:true,
+ canReorderRecords: true,
+ canAcceptDroppedRecords: true,
+ canReparentNodes:true,
+ selectionType:"single",
+ animateRowsMaxTime:750,
+ folderDrop: function (dragRecords, dropFolder, index, sourceWidget) {
+ var record=categoryTree.getSelectedRecord();
+ var newUnit=dropFolder.SysId;
+ var newRecord=record;
+ newRecord.ReportsTo=newUnit;
+
+ //ajax call
+ $.ajax({
+ type: 'POST',
+ dataType: "json",
+ url: "<c:url value="/admin/categories/moveCategory.html" />",
+ data: "parentId="+ dropFolder.categoryId + "&childId=" + newRecord.categoryId,
+ success: function(response) {
+ var msg = isc.XMLTools.selectObjects(response, "/response/statusMessage");
+ var status = isc.XMLTools.selectObjects(response, "/response/status");
+
+
+ if(status==0 || status ==9999) {
+ categoryTree.removeData(record);
+ categoryTree.data.addList([newRecord],dropFolder, index);
+ } else {
+ if(msg!=null && msg !='') {
+ alert("! " + msg);
+ }
+ }
+
+ },
+ error: function(jqXHR,textStatus,errorThrown) {
+ alert(jqXHR + "-" + textStatus + "-" + errorThrown);
+
+ //alert(data.statusMessage);
+ }
+
+ });
+
+
+
+
+
+ //alert(index);
+ //alert(dropFolder.categoryId);
+ //alert(newRecord.categoryId);
+ }
+
+
+
+ });
+
+
+
+
+
+
+
+
+// Define application layout
+// ---------------------------------------------------------------------
+
+isc.HLayout.create({
+ ID:"pageLayout",
+ width: "680",
+ height: "600",
+ position:"relative",
+ members:[
+
+ isc.SectionStack.create({
+ ID:"mainLayout",
+ visibilityMode:"multiple",
+ animateSections:true,
+ sections:[
+ {title:"<s:message code="label.categories.hierarchy.title" text="Category hierarchy"/>", autoShow:true, items:[categoryTree]}
+ ]
+ })
+
+
+ ]
+});
+
+isc.Page.setEvent("load", "pageLayout.draw()");
+
+ </script>
+
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
+ </div>
sm-shop/src/main/webapp/pages/admin/components/list.jsp 283(+142 -141)
diff --git a/sm-shop/src/main/webapp/pages/admin/components/list.jsp b/sm-shop/src/main/webapp/pages/admin/components/list.jsp
index ba93966..f7bbb16 100644
--- a/sm-shop/src/main/webapp/pages/admin/components/list.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/components/list.jsp
@@ -1,142 +1,143 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
- <script>
-
- isc.RestDataSource.create({
- ID:"dataSource",
- dataFormat:"json",
- operationBindings:[
- {operationType:"fetch", dataProtocol:"postParams",dataURL: "<c:url value="${pagingUrl}" />"},
- {operationType:"remove", dataProtocol:"postParams",dataURL: "<c:url value="${removeUrl}" />"},
- {operationType:"update", dataProtocol:"postParams",dataURL: "<c:url value="${updateUrl}" />"},
- ],
- transformResponse : function (dsResponse, dsRequest, jsonData) {
-
- var status = isc.XMLTools.selectObjects(jsonData, "/response/status");
- //alert('check status ' + status);
- if (status != 0) {
- if(status==9999) {//operation completed
- //reload
- <c:if test="${afterRemoveUrl!=null}">
- window.location='<c:url value="${afterRemoveUrl}" />';
- </c:if>
- <c:if test="${refreshUrl!=null}">
- window.location='<c:url value="${refreshUrl}" />';
- </c:if>
- } else {
-
- var msg = isc.XMLTools.selectObjects(jsonData, "/response/statusMessage");
- alert("! " + msg);
- }
- }
- }
- });
-
-
-
- isc.ListGrid.create({
- ID: "entityList",
- border:1,
- dataSource: "dataSource",
- showRecordComponents: true,
- showRecordComponentsByCell: true,
- canRemoveRecords: <c:out value="${canRemoveEntry}" />,
- autoFetchData: true,
- showFilterEditor: true,
- filterOnKeypress: true,
- dataFetchMode:"paged",
- canEdit:<c:choose><c:when test="${canEdit!=null}"><c:out value="${canEdit}" /></c:when><c:otherwise>true</c:otherwise></c:choose>,
- editByCell: true,
- editEvent: "click",
-
-
- fields:[
- <jsp:include page="${gridHeader}"></jsp:include>
- ],
- selectionType: "multiple",
- removeData: function () {
- if (confirm('<s:message code="label.entity.remove.confirm" text="Do you really want to remove this record ?" />')) {
- return this.Super("removeData", arguments);
- }
- },
- fetchData: function () {
- return this.Super("fetchData", arguments);
- },
-
- <c:if test="${expandDetails!=null && expandDetails!=''}">
- canExpandRecords: true,
- expansionMode: "detailField",
- detailField: "<c:out value="${expandDetails}"/>",
- </c:if>
-
-
- <c:if test="${groupByEntity!=null && groupByEntity!=''}">
- groupStartOpen:"all",
- groupByField: '<c:out value="${groupByEntity}"/>',
- </c:if>
-
- createRecordComponent : function (record, colNum) {
- var fieldName = this.getFieldName(colNum);
- if (fieldName == "buttonField") {
-
-
- var button = isc.IButton.create({
- height: 18,
- width: 65,
- title: "<s:message code="label.entity.details" text="Details"/>",
- click : function () {
-
- var url = '<c:url value="${editUrl}" />';
- var queryString = '?id=' + record["<c:out value="${entityId}" />"];
- <c:if test="${appendQueryStringToEdit!=null && appendQueryStringToEdit!=''}">
- queryString = queryString + '&<c:out value="${appendQueryStringToEdit}" />' ;
- </c:if>
- var locationUrl = url + queryString;
- window.location= locationUrl;
-
- }
- });
- return button;
-
- }
-
-
- }
-
-
- });
-
-
-
-
-
-
-
-// Define application layout
-// ---------------------------------------------------------------------
-
-isc.HLayout.create({
- ID:"pageLayout",
- width: "700",
- height: "600",
- position:"relative",
- members:[
- isc.SectionStack.create({
- ID:"mainLayout",
- visibilityMode:"multiple",
- animateSections:true,
- sections:[
- {title:"<s:message code="${componentTitleKey}" text="{componentTitleKey} UNDEFINED"/>", autoShow:true, items:[entityList]}
- ]
- })
- ]
-});
-
-isc.Page.setEvent("load", "pageLayout.draw()");
-
- </script>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+ <script>
+
+ isc.RestDataSource.create({
+ ID:"dataSource",
+ dataFormat:"json",
+ operationBindings:[
+ {operationType:"fetch", dataProtocol:"postParams",dataURL: "<c:url value="${pagingUrl}" />"},
+ {operationType:"remove", dataProtocol:"postParams",dataURL: "<c:url value="${removeUrl}" />"},
+ {operationType:"update", dataProtocol:"postParams",dataURL: "<c:url value="${updateUrl}" />"},
+ ],
+ transformResponse : function (dsResponse, dsRequest, jsonData) {
+
+ var status = isc.XMLTools.selectObjects(jsonData, "/response/status");
+ //alert('check status ' + status);
+ if (status != 0) {
+ if(status==9999) {//operation completed
+ //reload
+ <c:if test="${afterRemoveUrl!=null}">
+ window.location='<c:url value="${afterRemoveUrl}" />';
+ </c:if>
+ <c:if test="${refreshUrl!=null}">
+ window.location='<c:url value="${refreshUrl}" />';
+ </c:if>
+ } else {
+
+ var msg = isc.XMLTools.selectObjects(jsonData, "/response/statusMessage");
+ console.log('Error received ' + JSON.stringify(jsonData));
+ alert("! " + msg);
+ }
+ }
+ }
+ });
+
+
+
+ isc.ListGrid.create({
+ ID: "entityList",
+ border:1,
+ dataSource: "dataSource",
+ showRecordComponents: true,
+ showRecordComponentsByCell: true,
+ canRemoveRecords: <c:out value="${canRemoveEntry}" />,
+ autoFetchData: true,
+ showFilterEditor: true,
+ filterOnKeypress: true,
+ dataFetchMode:"paged",
+ canEdit:<c:choose><c:when test="${canEdit!=null}"><c:out value="${canEdit}" /></c:when><c:otherwise>true</c:otherwise></c:choose>,
+ editByCell: true,
+ editEvent: "click",
+
+
+ fields:[
+ <jsp:include page="${gridHeader}"></jsp:include>
+ ],
+ selectionType: "multiple",
+ removeData: function () {
+ if (confirm('<s:message code="label.entity.remove.confirm" text="Do you really want to remove this record ?" />')) {
+ return this.Super("removeData", arguments);
+ }
+ },
+ fetchData: function () {
+ return this.Super("fetchData", arguments);
+ },
+
+ <c:if test="${expandDetails!=null && expandDetails!=''}">
+ canExpandRecords: true,
+ expansionMode: "detailField",
+ detailField: "<c:out value="${expandDetails}"/>",
+ </c:if>
+
+
+ <c:if test="${groupByEntity!=null && groupByEntity!=''}">
+ groupStartOpen:"all",
+ groupByField: '<c:out value="${groupByEntity}"/>',
+ </c:if>
+
+ createRecordComponent : function (record, colNum) {
+ var fieldName = this.getFieldName(colNum);
+ if (fieldName == "buttonField") {
+
+
+ var button = isc.IButton.create({
+ height: 18,
+ width: 65,
+ title: "<s:message code="label.entity.details" text="Details"/>",
+ click : function () {
+
+ var url = '<c:url value="${editUrl}" />';
+ var queryString = '?id=' + record["<c:out value="${entityId}" />"];
+ <c:if test="${appendQueryStringToEdit!=null && appendQueryStringToEdit!=''}">
+ queryString = queryString + '&<c:out value="${appendQueryStringToEdit}" />' ;
+ </c:if>
+ var locationUrl = url + queryString;
+ window.location= locationUrl;
+
+ }
+ });
+ return button;
+
+ }
+
+
+ }
+
+
+ });
+
+
+
+
+
+
+
+// Define application layout
+// ---------------------------------------------------------------------
+
+isc.HLayout.create({
+ ID:"pageLayout",
+ width: "700",
+ height: "600",
+ position:"relative",
+ members:[
+ isc.SectionStack.create({
+ ID:"mainLayout",
+ visibilityMode:"multiple",
+ animateSections:true,
+ sections:[
+ {title:"<s:message code="${componentTitleKey}" text="{componentTitleKey} UNDEFINED"/>", autoShow:true, items:[entityList]}
+ ]
+ })
+ ]
+});
+
+isc.Page.setEvent("load", "pageLayout.draw()");
+
+ </script>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/components/product-container.jsp b/sm-shop/src/main/webapp/pages/admin/components/product-container.jsp
index bbf1010..fb5ca0c 100644
--- a/sm-shop/src/main/webapp/pages/admin/components/product-container.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/components/product-container.jsp
@@ -1,206 +1,206 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-<script>
- //isc.showConsole();
- //Always fetch products for a given category
- isc.RestDataSource.create({
- ID:"products",
- dataFormat:"json",
- dataURL: "<c:url value="/admin/products/paging.html" />",
- operationBindings:[
- {operationType:"fetch", dataProtocol:"postParams"}
- ]
- });
-
- isc.RestDataSource.create({
- ID:"container",
- dataFormat:"json",
- operationBindings:[
- {operationType:"remove", dataProtocol:"postParams",dataURL: "<c:url value="${containerRemoveUrl}" />&removeEntity=<c:out value="${removeEntity}" />"},
- {operationType:"fetch", dataProtocol:"postParams",dataURL: "<c:url value="${containerFetchUrl}" />"},
- {operationType:"add", dataProtocol:"postParams",dataURL: "<c:url value="${containerAddUrl}" />"},
- {operationType:"update", dataProtocol:"postParams",dataURL: "<c:url value="${containerUpdateUrl}" />"}
- ],
- transformResponse : function (dsResponse, dsRequest, jsonData) {
- var status = isc.XMLTools.selectObjects(jsonData, "/response/status");
- if (status != 0 && status !=9999) {
- var msg = isc.XMLTools.selectObjects(jsonData, "/response/statusMessage");
- alert("! " + msg);
- //window.location='<c:url value="${reloadUrl}" />';
- }
- if(status == 9999) {
- window.location='<c:url value="${reloadUrl}" />';
- }
- }
- });
-
-
- //iterate from category objects to display data
- isc.TreeGrid.create({
- ID:"categoryTree",
- showResizeBar: false,
- data: isc.Tree.create({
- modelType: "parent",
- nameProperty: "Name",
- idField: "categoryId",
- parentIdField: "parentId",
- data: [
- {categoryId:"-1", parentId:"0", Name:"<s:message code="label.category.root" text="Root" />", isFolder: true},
- <c:forEach items="${categories}" var="category" varStatus="status">
- {categoryId:'<c:out value="${category.id}" />', parentId:'<c:choose><c:when test="${category.parent!=null}"><c:out value="${category.parent.id}" /></c:when><c:otherwise>-1</c:otherwise></c:choose>', Name:'<c:out value="${category.descriptions[0].name}" />', isFolder: true}
- <c:if test="${status.count<fn:length(categories)}">,</c:if>
- </c:forEach>
- ]
- }),
-
- nodeClick:"itemList.fetchData({categoryId:node.categoryId})",
- showHeader:false,
- leaveScrollbarGap:false,
- animateFolders:true,
- canAcceptDroppedRecords:false,
- canReparentNodes:false,
- selectionType:"single",
- animateRowsMaxTime:750
- });
-
-
- isc.ListGrid.create({
- ID: "itemList",
- dataSource: "products",
- showRecordComponents: true,
- showRecordComponentsByCell: true,
-
- autoFetchData: false,
- showFilterEditor: true,
- filterOnKeypress: true,
- dataFetchMode:"paged",
- canDragRecordsOut: true,
- dragDataAction: "copy",
- alternateRecordStyles: true,
- fields:[
- <jsp:include page="${gridHeader}"></jsp:include>
- ],
- selectionType: "single",
- createRecordComponent : function (record, colNum) {
- var fieldName = this.getFieldName(colNum);
- if (fieldName == "buttonField") {
- var button = isc.IButton.create({
- height: 18,
- width: 65,
- title: "<s:message code="label.entity.details" text="Details"/>",
- click : function () {
- var url = '<c:url value="/admin/products/editProduct.html" />?id=' + record["productId"];
- <c:if test="${appendQueryStringToEdit!=null && appendQueryStringToEdit!=''}">
- url = url + '&<c:out value="${appendQueryStringToEdit}" />' ;
- </c:if>
- window.location=url;
- }
- });
- }
- return button;
- }
-
-
-
- });
-
- isc.ListGrid.create({
- ID: "containerList",
- dataSource: "container",
- canAcceptDroppedRecords: true,
- canRemoveRecords: true,
- canReorderRecords: false,
- alternateRecordStyles: true,
- autoFetchData: true,
- preventDuplicates: true,
- leaveScrollbarGap: false,
- fields: [
- <jsp:include page="${gridHeaderContainer}"></jsp:include>
- ],
- removeData: function () {
- if (confirm('<s:message code="label.entity.remove.confirm" text="Do you really want to remove this record ?" />')) {
- return this.Super("removeData", arguments);
- }
- }
- //recordDrop: function (dropRecords, targetRecord, index, sourceWidget) {
- //alert(dropRecords.length);
- //alert(dropRecords.length);
- //var rolesNotAddedMessage = '';
- //for (i=0; i < dropRecords.length; i++) {
- //if (selectedRoleList.data.find("roleId", dropRecords.get(i).roleId)) {
- // rolesNotAddedMessage = rolesNotAddedMessage + "\'" + dropRecords.get(i).roleName + "\' is already in the list." + "<br>";
- //}
- //else {
- // this.Super("recordDrop", newDropRecords, targetRecord, index, sourceWidget);
- //}
- //if (rolesNotAddedMessage != ''){
- //alert(dropRecords[i].productId);
-
- //isc.say(dropRecords.get(i).productId);
- //}
- //}
-
- //this.Super("recordDrop", dropRecords, targetRecord, index, sourceWidget);
-
- //}
- });
-
-
-// Define application layout
-// ---------------------------------------------------------------------
-
-isc.HLayout.create({
- ID:"pageLayout",
- width: "700",
- height: "600",
- position:"relative",
- members:[
- isc.SectionStack.create({
- ID:"leftSideLayout",
- width:200,
- showResizeBar:true,
- visibilityMode:"multiple",
- animateSections:true,
- sections:[
- {title:"<s:message code="label.categories.title" text="Categories" />", autoShow:true, items:[categoryTree]}
- ]
- }),
- isc.SectionStack.create({
- ID:"middleSideLayout",
- width:280,
- visibilityMode:"multiple",
- animateSections:true,
- sections:[
- {title:"<s:message code="menu.catalogue-products" text="Products" />", autoShow:true, items:[itemList]}
- ]
- }),
- isc.Img.create({src:"", width:10, height:32, layoutAlign:"center",
- click:"itemList.transferSelectedData(containerList)"
- }),
- isc.SectionStack.create({
- ID:"rightSideLayout",
- width:205,
- showResizeBar:false,
- visibilityMode:"multiple",
- animateSections:true,
- sections:[
- {title:"<s:message code="${componentTitleKey}" text="{componentTitleKey} UNDEFINED"/>", autoShow:true, items:[containerList]}
- ]
- }),
- ]
-});
-
-
-
-isc.Page.setEvent("load", "pageLayout.draw()");
-
-
-
-
-
-</script>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+<script>
+ //isc.showConsole();
+ //Always fetch products for a given category
+ isc.RestDataSource.create({
+ ID:"products",
+ dataFormat:"json",
+ dataURL: "<c:url value="/admin/products/paging.html" />",
+ operationBindings:[
+ {operationType:"fetch", dataProtocol:"postParams"}
+ ]
+ });
+
+ isc.RestDataSource.create({
+ ID:"container",
+ dataFormat:"json",
+ operationBindings:[
+ {operationType:"remove", dataProtocol:"postParams",dataURL: "<c:url value="${containerRemoveUrl}" />&removeEntity=<c:out value="${removeEntity}" />"},
+ {operationType:"fetch", dataProtocol:"postParams",dataURL: "<c:url value="${containerFetchUrl}" />"},
+ {operationType:"add", dataProtocol:"postParams",dataURL: "<c:url value="${containerAddUrl}" />"},
+ {operationType:"update", dataProtocol:"postParams",dataURL: "<c:url value="${containerUpdateUrl}" />"}
+ ],
+ transformResponse : function (dsResponse, dsRequest, jsonData) {
+ var status = isc.XMLTools.selectObjects(jsonData, "/response/status");
+ if (status != 0 && status !=9999) {
+ var msg = isc.XMLTools.selectObjects(jsonData, "/response/statusMessage");
+ alert("! " + msg);
+ //window.location='<c:url value="${reloadUrl}" />';
+ }
+ if(status == 9999) {
+ window.location='<c:url value="${reloadUrl}" />';
+ }
+ }
+ });
+
+
+ //iterate from category objects to display data
+ isc.TreeGrid.create({
+ ID:"categoryTree",
+ showResizeBar: false,
+ data: isc.Tree.create({
+ modelType: "parent",
+ nameProperty: "Name",
+ idField: "categoryId",
+ parentIdField: "parentId",
+ data: [
+ {categoryId:"-1", parentId:"0", Name:"<s:message code="label.category.root" text="Root" />", isFolder: true},
+ <c:forEach items="${categories}" var="category" varStatus="status">
+ {categoryId:'<c:out value="${category.id}" />', parentId:'<c:choose><c:when test="${category.parent!=null}"><c:out value="${category.parent.id}" /></c:when><c:otherwise>-1</c:otherwise></c:choose>', Name:'<c:out value="${category.descriptions[0].name}" />', isFolder: true}
+ <c:if test="${status.count<fn:length(categories)}">,</c:if>
+ </c:forEach>
+ ]
+ }),
+
+ nodeClick:"itemList.fetchData({categoryId:node.categoryId})",
+ showHeader:false,
+ leaveScrollbarGap:false,
+ animateFolders:true,
+ canAcceptDroppedRecords:false,
+ canReparentNodes:false,
+ selectionType:"single",
+ animateRowsMaxTime:750
+ });
+
+
+ isc.ListGrid.create({
+ ID: "itemList",
+ dataSource: "products",
+ showRecordComponents: true,
+ showRecordComponentsByCell: true,
+
+ autoFetchData: false,
+ showFilterEditor: true,
+ filterOnKeypress: true,
+ dataFetchMode:"paged",
+ canDragRecordsOut: true,
+ dragDataAction: "copy",
+ alternateRecordStyles: true,
+ fields:[
+ <jsp:include page="${gridHeader}"></jsp:include>
+ ],
+ selectionType: "single",
+ createRecordComponent : function (record, colNum) {
+ var fieldName = this.getFieldName(colNum);
+ if (fieldName == "buttonField") {
+ var button = isc.IButton.create({
+ height: 18,
+ width: 65,
+ title: "<s:message code="label.entity.details" text="Details"/>",
+ click : function () {
+ var url = '<c:url value="/admin/products/editProduct.html" />?id=' + record["productId"];
+ <c:if test="${appendQueryStringToEdit!=null && appendQueryStringToEdit!=''}">
+ url = url + '&<c:out value="${appendQueryStringToEdit}" />' ;
+ </c:if>
+ window.location=url;
+ }
+ });
+ }
+ return button;
+ }
+
+
+
+ });
+
+ isc.ListGrid.create({
+ ID: "containerList",
+ dataSource: "container",
+ canAcceptDroppedRecords: true,
+ canRemoveRecords: true,
+ canReorderRecords: false,
+ alternateRecordStyles: true,
+ autoFetchData: true,
+ preventDuplicates: true,
+ leaveScrollbarGap: false,
+ fields: [
+ <jsp:include page="${gridHeaderContainer}"></jsp:include>
+ ],
+ removeData: function () {
+ if (confirm('<s:message code="label.entity.remove.confirm" text="Do you really want to remove this record ?" />')) {
+ return this.Super("removeData", arguments);
+ }
+ }
+ //recordDrop: function (dropRecords, targetRecord, index, sourceWidget) {
+ //alert(dropRecords.length);
+ //alert(dropRecords.length);
+ //var rolesNotAddedMessage = '';
+ //for (i=0; i < dropRecords.length; i++) {
+ //if (selectedRoleList.data.find("roleId", dropRecords.get(i).roleId)) {
+ // rolesNotAddedMessage = rolesNotAddedMessage + "\'" + dropRecords.get(i).roleName + "\' is already in the list." + "<br>";
+ //}
+ //else {
+ // this.Super("recordDrop", newDropRecords, targetRecord, index, sourceWidget);
+ //}
+ //if (rolesNotAddedMessage != ''){
+ //alert(dropRecords[i].productId);
+
+ //isc.say(dropRecords.get(i).productId);
+ //}
+ //}
+
+ //this.Super("recordDrop", dropRecords, targetRecord, index, sourceWidget);
+
+ //}
+ });
+
+
+// Define application layout
+// ---------------------------------------------------------------------
+
+isc.HLayout.create({
+ ID:"pageLayout",
+ width: "700",
+ height: "600",
+ position:"relative",
+ members:[
+ isc.SectionStack.create({
+ ID:"leftSideLayout",
+ width:200,
+ showResizeBar:true,
+ visibilityMode:"multiple",
+ animateSections:true,
+ sections:[
+ {title:"<s:message code="label.categories.title" text="Categories" />", autoShow:true, items:[categoryTree]}
+ ]
+ }),
+ isc.SectionStack.create({
+ ID:"middleSideLayout",
+ width:280,
+ visibilityMode:"multiple",
+ animateSections:true,
+ sections:[
+ {title:"<s:message code="menu.catalogue-products" text="Products" />", autoShow:true, items:[itemList]}
+ ]
+ }),
+ isc.Img.create({src:"", width:10, height:32, layoutAlign:"center",
+ click:"itemList.transferSelectedData(containerList)"
+ }),
+ isc.SectionStack.create({
+ ID:"rightSideLayout",
+ width:205,
+ showResizeBar:false,
+ visibilityMode:"multiple",
+ animateSections:true,
+ sections:[
+ {title:"<s:message code="${componentTitleKey}" text="{componentTitleKey} UNDEFINED"/>", autoShow:true, items:[containerList]}
+ ]
+ }),
+ ]
+});
+
+
+
+isc.Page.setEvent("load", "pageLayout.draw()");
+
+
+
+
+
+</script>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/configuration/accounts.jsp b/sm-shop/src/main/webapp/pages/admin/configuration/accounts.jsp
index e67e493..83ec584 100644
--- a/sm-shop/src/main/webapp/pages/admin/configuration/accounts.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/configuration/accounts.jsp
@@ -1,52 +1,52 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-<script>
-
-
-
-</script>
-
-
-<div class="tabbable">
- <jsp:include page="/common/adminTabs.jsp" />
- <div class="tab-content">
- <div class="tab-pane active" id="accounts-conf">
- <div class="sm-ui-component">
- <h3><s:message code="label.configuration.options" text="Configuration options" /></h3>
- <br/>
- <c:url var="saveAccountsConfiguration" value="/admin/configuration/saveConfiguration.html"/>
- <form:form method="POST" modelAttribute="configuration" action="${saveAccountsConfiguration}">
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
- <c:forEach var="merchantConfig" items="${configuration.merchantConfigs}" varStatus="counter">
-
-
- <div class="control-group">
- <label><s:message code="label.configuration.${merchantConfig.key}" text="** Label for [label.configuration.${merchantConfig.key}] not found **" /> : </label>
- <div class="controls">
- <form:input path="merchantConfigs[${counter.index}].value" />
- <form:hidden path="merchantConfigs[${counter.index}].key" />
- <form:hidden path="merchantConfigs[${counter.index}].id" />
- <span class="help-inline"><form:errors path="merchantConfigs[${counter.index}].key" cssClass="error" /></span>
- </div>
- </div>
-
-
- </c:forEach>
-
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
- </div>
- </div>
-
-
- </form:form>
- </div>
- </div>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+<script>
+
+
+
+</script>
+
+
+<div class="tabbable">
+ <jsp:include page="/common/adminTabs.jsp" />
+ <div class="tab-content">
+ <div class="tab-pane active" id="accounts-conf">
+ <div class="sm-ui-component">
+ <h3><s:message code="label.configuration.options" text="Configuration options" /></h3>
+ <br/>
+ <c:url var="saveAccountsConfiguration" value="/admin/configuration/saveConfiguration.html"/>
+ <form:form method="POST" modelAttribute="configuration" action="${saveAccountsConfiguration}">
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+ <c:forEach var="merchantConfig" items="${configuration.merchantConfigs}" varStatus="counter">
+
+
+ <div class="control-group">
+ <label><s:message code="label.configuration.${merchantConfig.key}" text="** Label for [label.configuration.${merchantConfig.key}] not found **" /> : </label>
+ <div class="controls">
+ <form:input path="merchantConfigs[${counter.index}].value" />
+ <form:hidden path="merchantConfigs[${counter.index}].key" />
+ <form:hidden path="merchantConfigs[${counter.index}].id" />
+ <span class="help-inline"><form:errors path="merchantConfigs[${counter.index}].key" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+ </c:forEach>
+
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
+ </div>
+ </div>
+
+
+ </form:form>
+ </div>
+ </div>
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/configuration/cacheManagement.jsp b/sm-shop/src/main/webapp/pages/admin/configuration/cacheManagement.jsp
index 8c99689..2b67d3e 100644
--- a/sm-shop/src/main/webapp/pages/admin/configuration/cacheManagement.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/configuration/cacheManagement.jsp
@@ -1,106 +1,106 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
- <script src="<c:url value="/resources/js/jquery.showLoading.min.js" />"></script>
- <link href="<c:url value="/resources/css/showLoading.css" />" rel="stylesheet">
-
-<script>
- $(function() {
-
- $(".clear-cache").click(function() {
- $(".alert-error").hide();
- $(".alert-success").hide();
- $('.tab-content').showLoading();
- var cacheKey = $(this).attr('id');
- clearCache(cacheKey);
- return false;
- });
- });
-
-
- function clearCache(cacheKey) {
-
- var url = '<c:url value="/admin/cache/clear.html"/>';
- if(cacheKey!=null) {
- url = url + '?cacheKey=' + cacheKey;
- }
-
- $.ajax({
- 'type': 'POST',
- 'url': url,
- 'contentType': 'application/json',
- 'dataType': 'json',
- 'success': function(result) {
- $('.tab-content').hideLoading();
- var response = result.response.status;
- if (response==9999) {
- $(".alert-success").show();
- window.location='<c:url value="/admin/cache/cacheManagement.html" />';
- } else {
- $(".alert-error").show();
- }
- }
- });
- }
-
- $(function() {
-
- $(".clear-all-cache").click(function() {
- $(".alert-error").hide();
- $(".alert-success").hide();
- $('.tab-content').showLoading();
- clearCache(null);
- return false;
- });
- });
-
-
-</script>
-
-
-<div class="tabbable">
-
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
-
- <div class="tab-pane active" id="admin-cache">
-
-
- <div class="sm-ui-component">
- <h3><s:message code="menu.cache" text="Cache management" /></h3>
- <br/>
-
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
- <div id="store.error" class="alert alert-error" style="display:none;"><s:message code="message.error" text="An error occured"/></div>
- <table class="table table-hover">
- <c:forEach items="${keys}" var="key">
- <tr>
- <td><label>${key}</label></td>
- <td>
- <form class="form-inline">
- <button id="${key}" type="submit" class="btn clear-cache"><s:message code="button.label.clear" text="Clear" /></button>
- <br/>
- </form>
- </td>
- </tr>
- </c:forEach>
- <tr>
- <td><s:message code="button.label.clear.all" text="Clear all"/></td>
- <td><button type="submit" class="btn clear-all-cache"><s:message code="button.label.clear" text="Clear" /></button></td>
- </tr>
- </table>
-
- </div>
-
-
- </div>
-
- </div>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+ <script src="<c:url value="/resources/js/jquery.showLoading.min.js" />"></script>
+ <link href="<c:url value="/resources/css/showLoading.css" />" rel="stylesheet">
+
+<script>
+ $(function() {
+
+ $(".clear-cache").click(function() {
+ $(".alert-error").hide();
+ $(".alert-success").hide();
+ $('.tab-content').showLoading();
+ var cacheKey = $(this).attr('id');
+ clearCache(cacheKey);
+ return false;
+ });
+ });
+
+
+ function clearCache(cacheKey) {
+
+ var url = '<c:url value="/admin/cache/clear.html"/>';
+ if(cacheKey!=null) {
+ url = url + '?cacheKey=' + cacheKey;
+ }
+
+ $.ajax({
+ 'type': 'POST',
+ 'url': url,
+ 'contentType': 'application/json',
+ 'dataType': 'json',
+ 'success': function(result) {
+ $('.tab-content').hideLoading();
+ var response = result.response.status;
+ if (response==9999) {
+ $(".alert-success").show();
+ window.location='<c:url value="/admin/cache/cacheManagement.html" />';
+ } else {
+ $(".alert-error").show();
+ }
+ }
+ });
+ }
+
+ $(function() {
+
+ $(".clear-all-cache").click(function() {
+ $(".alert-error").hide();
+ $(".alert-success").hide();
+ $('.tab-content').showLoading();
+ clearCache(null);
+ return false;
+ });
+ });
+
+
+</script>
+
+
+<div class="tabbable">
+
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+
+ <div class="tab-pane active" id="admin-cache">
+
+
+ <div class="sm-ui-component">
+ <h3><s:message code="menu.cache" text="Cache management" /></h3>
+ <br/>
+
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+ <div id="store.error" class="alert alert-error" style="display:none;"><s:message code="message.error" text="An error occured"/></div>
+ <table class="table table-hover">
+ <c:forEach items="${keys}" var="key">
+ <tr>
+ <td><label>${key}</label></td>
+ <td>
+ <form class="form-inline">
+ <button id="${key}" type="submit" class="btn clear-cache"><s:message code="button.label.clear" text="Clear" /></button>
+ <br/>
+ </form>
+ </td>
+ </tr>
+ </c:forEach>
+ <tr>
+ <td><s:message code="button.label.clear.all" text="Clear all"/></td>
+ <td><button type="submit" class="btn clear-all-cache"><s:message code="button.label.clear" text="Clear" /></button></td>
+ </tr>
+ </table>
+
+ </div>
+
+
+ </div>
+
+ </div>
</div>
\ No newline at end of file
sm-shop/src/main/webapp/pages/admin/configuration/email.jsp 232(+116 -116)
diff --git a/sm-shop/src/main/webapp/pages/admin/configuration/email.jsp b/sm-shop/src/main/webapp/pages/admin/configuration/email.jsp
index 8978cb2..b2052e6 100644
--- a/sm-shop/src/main/webapp/pages/admin/configuration/email.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/configuration/email.jsp
@@ -1,117 +1,117 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-<script>
-
-
-
-</script>
-
-
-<div class="tabbable">
-
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
-
- <div class="tab-pane active" id="accounts-conf">
-
-
- <div class="sm-ui-component">
- <h3><s:message code="label.emailconfig.options" text="Email Configuration Options" /></h3>
- <br/>
-
-
- <c:url var="saveEmailConfiguration" value="/admin/configuration/saveEmailConfiguration.html"/>
- <form:form method="POST" commandName="configuration" action="${saveEmailConfiguration}">
-
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
-
- <div class="control-group">
- <label><s:message code="label.emailconfig.protocol" text="Protocol"/></label>
- <div class="controls">
- <form:input cssClass="input-large" path="protocol" />
- </div>
- <span class="help-inline"><form:errors path="protocol" cssClass="error" /></span>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.emailconfig.host" text="Host"/></label>
- <div class="controls">
- <form:input cssClass="input-large" path="host" />
- </div>
- <span class="help-inline"><form:errors path="host" cssClass="error" /></span>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.emailconfig.port" text="Port"/></label>
- <div class="controls">
- <form:input cssClass="input-large" path="port" />
- </div>
- <span class="help-inline"><form:errors path="port" cssClass="error" /></span>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.emailconfig.username" text="Username"/></label>
- <div class="controls">
- <form:input cssClass="input-large" path="username" />
- </div>
- <span class="help-inline"><form:errors path="username" cssClass="error" /></span>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.emailconfig.password" text="Password"/></label>
- <div class="controls">
- <form:password cssClass="input-large" path="password" />
- </div>
- <span class="help-inline"><form:errors path="password" cssClass="error" /></span>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.emailconfig.smtpauth" text="SmtpAuth"/></label>
- <div class="controls">
- <form:checkbox cssClass="input-large" path="smtpAuth" />
- </div>
- <span class="help-inline"><s:message code="label.emailconfig.requiresauthentication" text="Email server requires authentication (should be set to true)"/></span>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.emailconfig.starttls" text="Starttls"/></label>
- <div class="controls">
- <form:checkbox cssClass="input-large" path="starttls" />
- </div>
- <span class="help-inline"><s:message code="label.emailconfig.requiresstarttls" text="Email server requires STARTLS encryption (should be false, check server configurations)"/></span>
- </div>
-
-
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
- </div>
- </div>
-
-
- </form:form>
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+<script>
+
+
+
+</script>
+
+
+<div class="tabbable">
+
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+
+ <div class="tab-pane active" id="accounts-conf">
+
+
+ <div class="sm-ui-component">
+ <h3><s:message code="label.emailconfig.options" text="Email Configuration Options" /></h3>
+ <br/>
+
+
+ <c:url var="saveEmailConfiguration" value="/admin/configuration/saveEmailConfiguration.html"/>
+ <form:form method="POST" commandName="configuration" action="${saveEmailConfiguration}">
+
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.emailconfig.protocol" text="Protocol"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large" path="protocol" />
+ </div>
+ <span class="help-inline"><form:errors path="protocol" cssClass="error" /></span>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.emailconfig.host" text="Host"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large" path="host" />
+ </div>
+ <span class="help-inline"><form:errors path="host" cssClass="error" /></span>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.emailconfig.port" text="Port"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large" path="port" />
+ </div>
+ <span class="help-inline"><form:errors path="port" cssClass="error" /></span>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.emailconfig.username" text="Username"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large" path="username" />
+ </div>
+ <span class="help-inline"><form:errors path="username" cssClass="error" /></span>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.emailconfig.password" text="Password"/></label>
+ <div class="controls">
+ <form:password cssClass="input-large" path="password" />
+ </div>
+ <span class="help-inline"><form:errors path="password" cssClass="error" /></span>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.emailconfig.smtpauth" text="SmtpAuth"/></label>
+ <div class="controls">
+ <form:checkbox cssClass="input-large" path="smtpAuth" />
+ </div>
+ <span class="help-inline"><s:message code="label.emailconfig.requiresauthentication" text="Email server requires authentication (should be set to true)"/></span>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.emailconfig.starttls" text="Starttls"/></label>
+ <div class="controls">
+ <form:checkbox cssClass="input-large" path="starttls" />
+ </div>
+ <span class="help-inline"><s:message code="label.emailconfig.requiresstarttls" text="Email server requires STARTLS encryption (should be false, check server configurations)"/></span>
+ </div>
+
+
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
+ </div>
+ </div>
+
+
+ </form:form>
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
sm-shop/src/main/webapp/pages/admin/configuration/system.jsp 272(+136 -136)
diff --git a/sm-shop/src/main/webapp/pages/admin/configuration/system.jsp b/sm-shop/src/main/webapp/pages/admin/configuration/system.jsp
index 4796078..0016a74 100644
--- a/sm-shop/src/main/webapp/pages/admin/configuration/system.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/configuration/system.jsp
@@ -1,137 +1,137 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-
-
-<div class="tabbable">
-
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
-
- <div class="tab-pane active" id="admin-cache">
-
-
- <div class="sm-ui-component">
- <h3><s:message code="menu.system-configurations" text="System configurations" /></h3>
- <br/>
-
- <c:url var="saveSystemConfiguration" value="/admin/configuration/saveSystemConfiguration.html"/>
- <form:form method="POST" commandName="configuration" action="${saveSystemConfiguration}">
-
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
-
- <div class="control-group">
- <label><s:message code="label.store.testmode" text="Test mode" /></label>
- <div class="controls">
- <form:checkbox path="testMode" />
- <span class="help-inline"></span>
- </div>
- </div>
-
-
- <div class="control-group">
- <label><s:message code="label.store.debugmode" text="Debug mode" /></label>
- <div class="controls">
- <form:checkbox path="debugMode" />
- <span class="help-inline"></span>
- </div>
- </div>
-
-
- <div class="control-group">
- <label><s:message code="label.customer.displaycustomersection" text="Display customer section" /></label>
- <div class="controls">
- <form:checkbox path="displayCustomerSection" />
- <span class="help-inline"></span>
- </div>
- </div>
-
-
- <div class="control-group">
- <label><s:message code="label.store.displaycontactussection" text="Display contact us page" /></label>
- <div class="controls">
- <form:checkbox path="displayContactUs" />
- <span class="help-inline"></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.store.displaystoreaddress" text="Display store address" /></label>
- <div class="controls">
- <form:checkbox path="displayStoreAddress" />
- <span class="help-inline"></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.order.displayagreement" text="Display customer terms and policy agreement in order page" /></label>
- <div class="controls">
- <form:checkbox path="displayCustomerAgreement" />
- <span class="help-inline"></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.store.displaysearchbox" text="Display search box" /></label>
- <div class="controls">
- <form:checkbox path="displaySearchBox" />
- <span class="help-inline"></span>
- </div>
- </div>
-
- <c:forEach items="${store.languages}" var="language">
-
- <div class="control-group">
- <label><s:message code="label.configuration.useglobalsearch_suggestions" text="Use global pre-defined search suggestions" /> (${language.code})</label>
- <div class="controls">
- <form:checkbox path="useDefaultSearchConfig['${language.code}']" value="on"/>
- <br/>
- <s:message code="label.configuration.globalsearch_suggestions_path" text="Global pre-defined search suggestions file path" /> (${language.code})<br/>
- <form:input cssClass="input-large" path="defaultSearchConfigPath['${language.code}']" />
- <span class="help-inline"></span>
- </div>
- </div>
-
- </c:forEach>
-
- <div class="control-group">
- <label><s:message code="label.store.allowPurchaseItems" text="Allow purchase items" /></label>
- <div class="controls">
- <form:checkbox path="allowPurchaseItems" />
- <span class="help-inline"></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.store.displayaddtocartfeatured" text="Allow add to cart on featured items" /></label>
- <div class="controls">
- <form:checkbox path="displayAddToCartOnFeaturedItems" />
- <span class="help-inline"></span>
- </div>
- </div>
-
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
- </div>
- </div>
-
-
- </form:form>
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+
+
+<div class="tabbable">
+
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+
+ <div class="tab-pane active" id="admin-cache">
+
+
+ <div class="sm-ui-component">
+ <h3><s:message code="menu.system-configurations" text="System configurations" /></h3>
+ <br/>
+
+ <c:url var="saveSystemConfiguration" value="/admin/configuration/saveSystemConfiguration.html"/>
+ <form:form method="POST" commandName="configuration" action="${saveSystemConfiguration}">
+
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.store.testmode" text="Test mode" /></label>
+ <div class="controls">
+ <form:checkbox path="testMode" />
+ <span class="help-inline"></span>
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.store.debugmode" text="Debug mode" /></label>
+ <div class="controls">
+ <form:checkbox path="debugMode" />
+ <span class="help-inline"></span>
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.customer.displaycustomersection" text="Display customer section" /></label>
+ <div class="controls">
+ <form:checkbox path="displayCustomerSection" />
+ <span class="help-inline"></span>
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.store.displaycontactussection" text="Display contact us page" /></label>
+ <div class="controls">
+ <form:checkbox path="displayContactUs" />
+ <span class="help-inline"></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.store.displaystoreaddress" text="Display store address" /></label>
+ <div class="controls">
+ <form:checkbox path="displayStoreAddress" />
+ <span class="help-inline"></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.order.displayagreement" text="Display customer terms and policy agreement in order page" /></label>
+ <div class="controls">
+ <form:checkbox path="displayCustomerAgreement" />
+ <span class="help-inline"></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.store.displaysearchbox" text="Display search box" /></label>
+ <div class="controls">
+ <form:checkbox path="displaySearchBox" />
+ <span class="help-inline"></span>
+ </div>
+ </div>
+
+ <c:forEach items="${store.languages}" var="language">
+
+ <div class="control-group">
+ <label><s:message code="label.configuration.useglobalsearch_suggestions" text="Use global pre-defined search suggestions" /> (${language.code})</label>
+ <div class="controls">
+ <form:checkbox path="useDefaultSearchConfig['${language.code}']" value="on"/>
+ <br/>
+ <s:message code="label.configuration.globalsearch_suggestions_path" text="Global pre-defined search suggestions file path" /> (${language.code})<br/>
+ <form:input cssClass="input-large" path="defaultSearchConfigPath['${language.code}']" />
+ <span class="help-inline"></span>
+ </div>
+ </div>
+
+ </c:forEach>
+
+ <div class="control-group">
+ <label><s:message code="label.store.allowPurchaseItems" text="Allow purchase items" /></label>
+ <div class="controls">
+ <form:checkbox path="allowPurchaseItems" />
+ <span class="help-inline"></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.store.displayaddtocartfeatured" text="Allow add to cart on featured items" /></label>
+ <div class="controls">
+ <form:checkbox path="displayAddToCartOnFeaturedItems" />
+ <span class="help-inline"></span>
+ </div>
+ </div>
+
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
+ </div>
+ </div>
+
+
+ </form:form>
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/content/contentFiles-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/content/contentFiles-gridHeader.jsp
index 196f906..70fe6cf 100644
--- a/sm-shop/src/main/webapp/pages/admin/content/contentFiles-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/content/contentFiles-gridHeader.jsp
@@ -1,14 +1,14 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
-
-
- {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:true},
- {title:"<s:message code="label.generic.url" text="URL"/>", name:"path", type: "link", canFilter:true},
- {title:"<s:message code="label.entity.type" text="Type"/>", name:"mimeType", canFilter:false},
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+
+
+ {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:true},
+ {title:"<s:message code="label.generic.url" text="URL"/>", name:"path", type: "link", canFilter:true},
+ {title:"<s:message code="label.entity.type" text="Type"/>", name:"mimeType", canFilter:false},
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/content/content-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/content/content-gridHeader.jsp
index 1f5dd19..2ec6de8 100644
--- a/sm-shop/src/main/webapp/pages/admin/content/content-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/content/content-gridHeader.jsp
@@ -1,14 +1,14 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
-
- {title:"<s:message code="label.entity.id" text="Id"/>", name:"id", canFilter:false},
- {title:"<s:message code="label.entity.code" text="Code"/>", name:"code", canFilter:false},
- {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false},
- {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+
+ {title:"<s:message code="label.entity.id" text="Id"/>", name:"id", canFilter:false},
+ {title:"<s:message code="label.entity.code" text="Code"/>", name:"code", canFilter:false},
+ {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false},
+ {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/content/contentPagesDetails.jsp b/sm-shop/src/main/webapp/pages/admin/content/contentPagesDetails.jsp
index bc67fcd..33bc6e6 100644
--- a/sm-shop/src/main/webapp/pages/admin/content/contentPagesDetails.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/content/contentPagesDetails.jsp
@@ -95,7 +95,13 @@
<label><s:message code="label.entity.visible" text="Visible"/></label>
<div class="controls">
<form:checkbox path="visible" />
-
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.content.page.displaymainmenu" text="Show this page in main menu"/></label>
+ <div class="controls">
+ <form:checkbox path="linkToMenu" />
</div>
</div>
diff --git a/sm-shop/src/main/webapp/pages/admin/customers/customer.jsp b/sm-shop/src/main/webapp/pages/admin/customers/customer.jsp
index 12deeea..2f4f563 100644
--- a/sm-shop/src/main/webapp/pages/admin/customers/customer.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/customers/customer.jsp
@@ -552,9 +552,20 @@ function setCredentials(customerId, userName, password){
<form:input id="deliveryPostalCode" cssClass="input-large" maxlength="20" path="delivery.postalCode"/>
<span class="help-inline"><form:errors path="delivery.postalCode" cssClass="error" /></span>
</div>
- </address>
+ </address>
+
+ <c:if test="${fn:length(groups)>0}">
+ <div class="control-group">
+ <label><s:message code="label.groups.title" text="Groups"/></label>
+ <div class="controls">
+ <form:checkboxes cssClass="highlight" items="${groups}" itemValue="id" itemLabel="groupName" path="groups" delimiter="<br/>" />
+ <span class="help-inline"><form:errors path="groups" cssClass="error" /></span>
+ </div>
+ </div>
+
+ </c:if>
+
- <!--</div>-->
<div class="form-actions">
<div class="pull-right">
<button type="submit" class="btn btn-success"><s:message code="button.label.save" text="Save"/></button>
diff --git a/sm-shop/src/main/webapp/pages/admin/customers/customers.jsp b/sm-shop/src/main/webapp/pages/admin/customers/customers.jsp
index 332861d..8a1e84e 100644
--- a/sm-shop/src/main/webapp/pages/admin/customers/customers.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/customers/customers.jsp
@@ -1,69 +1,69 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
-
-<%@ page session="false"%>
-
-
-
-
-<div class="tabbable">
-
-
- <jsp:include page="/common/adminTabs.jsp" />
-
-
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
-
-
- <div class="sm-ui-component">
-
-
-
-
- <h3><s:message code="label.customer.list" text="Customer list" /></h3>
- <br/><br/>
-
- <!-- Listing grid include -->
- <c:set value="/admin/customers/page.html" var="pagingUrl" scope="request"/>
- <c:set value="/admin/admin/customers/remove.html" var="removeUrl" scope="request"/>
- <c:set value="/admin/customers/customer.html" var="editUrl" scope="request"/>
- <c:set var="entityId" value="id" scope="request"/>
- <c:set var="componentTitleKey" value="label.customer.list" scope="request"/>
- <c:set var="gridHeader" value="/pages/admin/customers/customers-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="false" scope="request"/>
-
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
-
-
-
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
+
+<%@ page session="false"%>
+
+
+
+
+<div class="tabbable">
+
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+
+
+ <div class="sm-ui-component">
+
+
+
+
+ <h3><s:message code="label.customer.list" text="Customer list" /></h3>
+ <br/><br/>
+
+ <!-- Listing grid include -->
+ <c:set value="/admin/customers/page.html" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/admin/customers/remove.html" var="removeUrl" scope="request"/>
+ <c:set value="/admin/customers/customer.html" var="editUrl" scope="request"/>
+ <c:set var="entityId" value="id" scope="request"/>
+ <c:set var="componentTitleKey" value="label.customer.list" scope="request"/>
+ <c:set var="gridHeader" value="/pages/admin/customers/customers-gridHeader.jsp" scope="request"/>
+ <c:set var="canRemoveEntry" value="false" scope="request"/>
+
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+
+
+
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/customers/customers-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/customers/customers-gridHeader.jsp
index 94fe906..930fd5d 100644
--- a/sm-shop/src/main/webapp/pages/admin/customers/customers-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/customers/customers-gridHeader.jsp
@@ -1,14 +1,14 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
- {title:"<s:message code="label.entity.id" text="Id"/>", name:"id",canFilter:false},
- {title:"<s:message code="label.customer.firstname" text="First name"/>", name:"firstName",canFilter:false},
- {title:"<s:message code="label.customer.lastname" text="Last name"/>", name:"lastName",canFilter:true},
- {title:"<s:message code="label.generic.email" text="Email"/>", name:"email",canFilter:true},
- {title:"<s:message code="label.customer.country" text="Customer country"/>", name:"country",canFilter:false},
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+ {title:"<s:message code="label.entity.id" text="Id"/>", name:"id",canFilter:false},
+ {title:"<s:message code="label.customer.firstname" text="First name"/>", name:"firstName",canFilter:false},
+ {title:"<s:message code="label.customer.lastname" text="Last name"/>", name:"lastName",canFilter:true},
+ {title:"<s:message code="label.generic.email" text="Email"/>", name:"email",canFilter:true},
+ {title:"<s:message code="label.customer.country" text="Customer country"/>", name:"country",canFilter:false},
{title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false}
\ No newline at end of file
sm-shop/src/main/webapp/pages/admin/customers/option.jsp 344(+172 -172)
diff --git a/sm-shop/src/main/webapp/pages/admin/customers/option.jsp b/sm-shop/src/main/webapp/pages/admin/customers/option.jsp
index 9933a0d..9d3b2f7 100644
--- a/sm-shop/src/main/webapp/pages/admin/customers/option.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/customers/option.jsp
@@ -1,173 +1,173 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
-
-
-<script type="text/javascript">
-
-$(document).ready(function() {
-
- $('#sortOrder').numeric();
-
-});
-
-</script>
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="customer-section">
-
-
-
- <div class="sm-ui-component">
-
-
- <h3>
- <s:message code="menu.customer-options" text="Option management" />
- </h3>
-
-
- <h3>
- <c:choose>
- <c:when test="${option.id!=null && option.id>0}">
- <s:message code="label.customer.options.edit" text="Edit option" />
- </c:when>
- <c:otherwise>
- <s:message code="menu.customer-options-create" text="Create option" />
- </c:otherwise>
- </c:choose>
-
- </h3>
- <br/>
-
- <c:url var="optionSave" value="/admin/customers/options/save.html"/>
-
-
- <form:form method="POST" commandName="option" action="${optionSave}">
-
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
- <div class="control-group">
- <label class="required"><s:message code="label.customer.option.code" text="Option code"/> </label>
- <div class="controls">
- <form:input cssClass="highlight" readonly="${option.id>0}" id="code" path="code"/>
- <span class="help-inline"><form:errors path="code" cssClass="error" /></span>
- </div>
-
- </div>
-
- <c:forEach items="${option.descriptionsSettoList}" var="description" varStatus="counter">
-
- <div class="control-group">
- <label class="required"><s:message code="label.customer.option.name" text="Option name"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:input cssClass="highlight input-xxlarge" id="name${counter.index}" path="descriptionsList[${counter.index}].name"/>
- <span class="help-inline"><form:errors path="descriptionsList[${counter.index}].name" cssClass="error" /></span>
- </div>
-
- </div>
-
-
- <form:hidden path="descriptionsList[${counter.index}].language.code" />
- <form:hidden path="descriptionsList[${counter.index}].id" />
-
- </c:forEach>
-
-
- <div class="control-group">
- <label><s:message code="label.customer.option.type" text="Dsiplay selection type"/></label>
- <div class="controls">
-
- <div class="controls">
- <form:select path="customerOptionType">
- <s:message code="label.product.productoption.type.text" text="Text" var="vText" />
- <s:message code="label.product.productoption.type.select" text="Select" var="vSelect"/>
- <s:message code="label.product.productoption.type.radio" text="Radio" var="vRadio"/>
- <s:message code="label.product.productoption.type.checkbox" text="Checkbox" var="vCheckbox"/>
- <form:option value="Text" label="${vText}" />
- <form:option value="Select" label="${vSelect}" />
- <form:option value="Radio" label="${vRadio}" />
- <form:option value="Checkbox" label="${vCheckbox}" />
- </form:select>
- <span class="help-inline"><form:errors path="customerOptionType" cssClass="error" /></span>
- </div>
-
- </div>
- </div>
-
-
- <form:hidden path="id" />
-
- <div class="control-group">
- <label class="required"><s:message code="label.entity.public" text="Public"/></label>
- <div class="controls">
- <form:checkbox path="publicOption" />
- <span class="help-inline"><form:errors path="publicOption" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="label.entity.active" text="Active"/></label>
- <div class="controls">
- <form:checkbox path="active" />
- <span class="help-inline"><form:errors path="active" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="label.entity.order" text="Order"/></label>
- <div class="controls">
- <form:input id="sortOrder" path="sortOrder"/>
- <span class="help-inline"><form:errors path="sortOrder" cssClass="error" /></span>
-
- </div>
- </div>
-
- <div class="form-actions">
-
- <div class="pull-right">
-
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
-
-
- </div>
-
- </div>
-
- </form:form>
-
-
- <br/>
-
-
-
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
+
+
+<script type="text/javascript">
+
+$(document).ready(function() {
+
+ $('#sortOrder').numeric();
+
+});
+
+</script>
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="customer-section">
+
+
+
+ <div class="sm-ui-component">
+
+
+ <h3>
+ <s:message code="menu.customer-options" text="Option management" />
+ </h3>
+
+
+ <h3>
+ <c:choose>
+ <c:when test="${option.id!=null && option.id>0}">
+ <s:message code="label.customer.options.edit" text="Edit option" />
+ </c:when>
+ <c:otherwise>
+ <s:message code="menu.customer-options-create" text="Create option" />
+ </c:otherwise>
+ </c:choose>
+
+ </h3>
+ <br/>
+
+ <c:url var="optionSave" value="/admin/customers/options/save.html"/>
+
+
+ <form:form method="POST" commandName="option" action="${optionSave}">
+
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.customer.option.code" text="Option code"/> </label>
+ <div class="controls">
+ <form:input cssClass="highlight" readonly="${option.id>0}" id="code" path="code"/>
+ <span class="help-inline"><form:errors path="code" cssClass="error" /></span>
+ </div>
+
+ </div>
+
+ <c:forEach items="${option.descriptionsSettoList}" var="description" varStatus="counter">
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.customer.option.name" text="Option name"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:input cssClass="highlight input-xxlarge" id="name${counter.index}" path="descriptionsList[${counter.index}].name"/>
+ <span class="help-inline"><form:errors path="descriptionsList[${counter.index}].name" cssClass="error" /></span>
+ </div>
+
+ </div>
+
+
+ <form:hidden path="descriptionsList[${counter.index}].language.code" />
+ <form:hidden path="descriptionsList[${counter.index}].id" />
+
+ </c:forEach>
+
+
+ <div class="control-group">
+ <label><s:message code="label.customer.option.type" text="Dsiplay selection type"/></label>
+ <div class="controls">
+
+ <div class="controls">
+ <form:select path="customerOptionType">
+ <s:message code="label.product.productoption.type.text" text="Text" var="vText" />
+ <s:message code="label.product.productoption.type.select" text="Select" var="vSelect"/>
+ <s:message code="label.product.productoption.type.radio" text="Radio" var="vRadio"/>
+ <s:message code="label.product.productoption.type.checkbox" text="Checkbox" var="vCheckbox"/>
+ <form:option value="Text" label="${vText}" />
+ <form:option value="Select" label="${vSelect}" />
+ <form:option value="Radio" label="${vRadio}" />
+ <form:option value="Checkbox" label="${vCheckbox}" />
+ </form:select>
+ <span class="help-inline"><form:errors path="customerOptionType" cssClass="error" /></span>
+ </div>
+
+ </div>
+ </div>
+
+
+ <form:hidden path="id" />
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.entity.public" text="Public"/></label>
+ <div class="controls">
+ <form:checkbox path="publicOption" />
+ <span class="help-inline"><form:errors path="publicOption" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.entity.active" text="Active"/></label>
+ <div class="controls">
+ <form:checkbox path="active" />
+ <span class="help-inline"><form:errors path="active" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.entity.order" text="Order"/></label>
+ <div class="controls">
+ <form:input id="sortOrder" path="sortOrder"/>
+ <span class="help-inline"><form:errors path="sortOrder" cssClass="error" /></span>
+
+ </div>
+ </div>
+
+ <div class="form-actions">
+
+ <div class="pull-right">
+
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
+
+
+ </div>
+
+ </div>
+
+ </form:form>
+
+
+ <br/>
+
+
+
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/customers/options.jsp b/sm-shop/src/main/webapp/pages/admin/customers/options.jsp
index 151ea48..60128cf 100644
--- a/sm-shop/src/main/webapp/pages/admin/customers/options.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/customers/options.jsp
@@ -1,62 +1,62 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="customer-section">
-
-
-
- <div class="sm-ui-component">
-
-
- <h3>
- <s:message code="menu.customer-options" text="Option management" />
- </h3>
- <br/>
-
- <!-- Listing grid include -->
- <c:set value="/admin/customers/options/paging.html" var="pagingUrl" scope="request"/>
- <c:set value="/admin/customers/options/remove.html" var="removeUrl" scope="request"/>
- <c:set value="/admin/customers/options/edit.html" var="editUrl" scope="request"/>
- <c:set value="/admin/customers/options/list.html" var="afterRemoveUrl" scope="request"/>
- <c:set var="entityId" value="id" scope="request"/>
- <c:set var="componentTitleKey" value="menu.catalogue-options-list" scope="request"/>
- <c:set var="gridHeader" value="/pages/admin/customers/options-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="true" scope="request"/>
-
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
-
-
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="customer-section">
+
+
+
+ <div class="sm-ui-component">
+
+
+ <h3>
+ <s:message code="menu.customer-options" text="Option management" />
+ </h3>
+ <br/>
+
+ <!-- Listing grid include -->
+ <c:set value="/admin/customers/options/paging.html" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/customers/options/remove.html" var="removeUrl" scope="request"/>
+ <c:set value="/admin/customers/options/edit.html" var="editUrl" scope="request"/>
+ <c:set value="/admin/customers/options/list.html" var="afterRemoveUrl" scope="request"/>
+ <c:set var="entityId" value="id" scope="request"/>
+ <c:set var="componentTitleKey" value="menu.catalogue-options-list" scope="request"/>
+ <c:set var="gridHeader" value="/pages/admin/customers/options-gridHeader.jsp" scope="request"/>
+ <c:set var="canRemoveEntry" value="true" scope="request"/>
+
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+
+
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/customers/options-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/customers/options-gridHeader.jsp
index 5b20805..a9341d0 100644
--- a/sm-shop/src/main/webapp/pages/admin/customers/options-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/customers/options-gridHeader.jsp
@@ -1,14 +1,14 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
- {title:"<s:message code="label.entity.id" text="Id"/>", name:"id", canFilter:false},
- {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false},
- {title:"<s:message code="label.entity.type" text="Type"/>", name:"type", canFilter:false},
- {title:"<s:message code="label.entity.active" text="Active"/>", name:"active", type:"boolean", canEdit:false, canFilter:false},
- {title:"<s:message code="label.entity.public" text="Public"/>", name:"public", type:"boolean", canEdit:false, canFilter:false},
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+ {title:"<s:message code="label.entity.id" text="Id"/>", name:"id", canFilter:false},
+ {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false},
+ {title:"<s:message code="label.entity.type" text="Type"/>", name:"type", canFilter:false},
+ {title:"<s:message code="label.entity.active" text="Active"/>", name:"active", type:"boolean", canEdit:false, canFilter:false},
+ {title:"<s:message code="label.entity.public" text="Public"/>", name:"public", type:"boolean", canEdit:false, canFilter:false},
{title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
\ No newline at end of file
sm-shop/src/main/webapp/pages/admin/customers/optionsset.jsp 284(+142 -142)
diff --git a/sm-shop/src/main/webapp/pages/admin/customers/optionsset.jsp b/sm-shop/src/main/webapp/pages/admin/customers/optionsset.jsp
index cf84332..233865e 100644
--- a/sm-shop/src/main/webapp/pages/admin/customers/optionsset.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/customers/optionsset.jsp
@@ -1,142 +1,142 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
-
-<%@ page session="false"%>
-
-<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
-
-
-<script type="text/javascript">
-
-$(document).ready(function() {
-
- $('#sortOrder').numeric();
-
-});
-
-</script>
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="customer-section">
-
-
-
- <div class="sm-ui-component">
-
-
- <h3>
- <s:message code="menu.customer-options-set"
- text="Manage customer options set" />
- </h3>
-
- <c:url var="createOptionSet"
- value="/admin/customers/optionsset/save.html" />
- <form:form method="POST" commandName="optionSet"
- action="${createOptionSet}" cssClass="form-inline">
-
-
- <div class="control-group">
- <label>
- <s:message code="label.customer.option" text="Option" />
- </label>
- <div class="controls">
- <form:select path="customerOption.id">
- <form:options items="${options}" itemValue="id"
- itemLabel="descriptionsSettoList[0].name" />
- </form:select>
- </div>
- </div>
-
-
- <div class="control-group">
- <label>
- <s:message code="label.customer.option.value" text="Option value" />
- </label>
- <div class="controls">
- <form:select path="customerOptionValue.id">
- <form:options items="${optionsValues}" itemValue="id"
- itemLabel="descriptionsSettoList[0].name" />
- </form:select>
- <span class="help-inline"> <c:if
- test="${errorMessageAssociation!=null}">
- <span id="identifiererrors" class="error"><c:out
- value="${errorMessageAssociation}" />
- </span>
- </c:if> </span>
- </div>
- </div>
-
-
- <div class="control-group">
- <label class="required">
- <s:message code="label.entity.order" text="Order" />
- </label>
- <div class="controls">
- <form:input id="sortOrder" path="sortOrder" />
- <span class="help-inline"><form:errors path="sortOrder"
- cssClass="error" />
- </span>
-
- </div>
- </div>
-
-
- <button type="submit" class="btn btn-success">
- <s:message code="label.generic.add" text="Add" />
- </button>
-
- </form:form>
-
-
-
- <!-- Listing grid include -->
- <c:set value="/admin/customers/optionsset/paging.html"
- var="pagingUrl" scope="request" />
- <c:set value="/admin/customers/optionsset/remove.html"
- var="removeUrl" scope="request" />
- <c:set value="/admin/customers/optionsset/edit.html" var="editUrl"
- scope="request" />
- <c:set value="/admin/customers/optionsset/list.html"
- var="afterRemoveUrl" scope="request" />
- <c:set var="entityId" value="id" scope="request" />
- <c:set var="groupByEntity" value="optionCode" scope="request" />
- <c:set var="componentTitleKey" value="menu.customer-options-list"
- scope="request" />
- <c:set var="gridHeader"
- value="/pages/admin/customers/optionsset-gridHeader.jsp"
- scope="request" />
- <c:set var="canRemoveEntry" value="true" scope="request" />
-
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
-</div>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
+
+<%@ page session="false"%>
+
+<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
+
+
+<script type="text/javascript">
+
+$(document).ready(function() {
+
+ $('#sortOrder').numeric();
+
+});
+
+</script>
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="customer-section">
+
+
+
+ <div class="sm-ui-component">
+
+
+ <h3>
+ <s:message code="menu.customer-options-set"
+ text="Manage customer options set" />
+ </h3>
+
+ <c:url var="createOptionSet"
+ value="/admin/customers/optionsset/save.html" />
+ <form:form method="POST" commandName="optionSet"
+ action="${createOptionSet}" cssClass="form-inline">
+
+
+ <div class="control-group">
+ <label>
+ <s:message code="label.customer.option" text="Option" />
+ </label>
+ <div class="controls">
+ <form:select path="customerOption.id">
+ <form:options items="${options}" itemValue="id"
+ itemLabel="descriptionsSettoList[0].name" />
+ </form:select>
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label>
+ <s:message code="label.customer.option.value" text="Option value" />
+ </label>
+ <div class="controls">
+ <form:select path="customerOptionValue.id">
+ <form:options items="${optionsValues}" itemValue="id"
+ itemLabel="descriptionsSettoList[0].name" />
+ </form:select>
+ <span class="help-inline"> <c:if
+ test="${errorMessageAssociation!=null}">
+ <span id="identifiererrors" class="error"><c:out
+ value="${errorMessageAssociation}" />
+ </span>
+ </c:if> </span>
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label class="required">
+ <s:message code="label.entity.order" text="Order" />
+ </label>
+ <div class="controls">
+ <form:input id="sortOrder" path="sortOrder" />
+ <span class="help-inline"><form:errors path="sortOrder"
+ cssClass="error" />
+ </span>
+
+ </div>
+ </div>
+
+
+ <button type="submit" class="btn btn-success">
+ <s:message code="label.generic.add" text="Add" />
+ </button>
+
+ </form:form>
+
+
+
+ <!-- Listing grid include -->
+ <c:set value="/admin/customers/optionsset/paging.html"
+ var="pagingUrl" scope="request" />
+ <c:set value="/admin/customers/optionsset/remove.html"
+ var="removeUrl" scope="request" />
+ <c:set value="/admin/customers/optionsset/edit.html" var="editUrl"
+ scope="request" />
+ <c:set value="/admin/customers/optionsset/list.html"
+ var="afterRemoveUrl" scope="request" />
+ <c:set var="entityId" value="id" scope="request" />
+ <c:set var="groupByEntity" value="optionCode" scope="request" />
+ <c:set var="componentTitleKey" value="menu.customer-options-list"
+ scope="request" />
+ <c:set var="gridHeader"
+ value="/pages/admin/customers/optionsset-gridHeader.jsp"
+ scope="request" />
+ <c:set var="canRemoveEntry" value="true" scope="request" />
+
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
+</div>
diff --git a/sm-shop/src/main/webapp/pages/admin/customers/optionsset-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/customers/optionsset-gridHeader.jsp
index 6b129d8..6cd72c0 100644
--- a/sm-shop/src/main/webapp/pages/admin/customers/optionsset-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/customers/optionsset-gridHeader.jsp
@@ -1,14 +1,14 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
- {title:"<s:message code="label.entity.id" text="Id"/>", name:"id", canFilter:false},
- {title:"<s:message code="label.customer.option.code" text="Option code"/>", name:"optionCode", canFilter:false},
- {title:"<s:message code="label.customer.option.name" text="Option name"/>", name:"optionName", canFilter:false},
- {title:"<s:message code="label.customer.optionvalue.code" text="Option value code"/>", name:"optionValueCode", canFilter:false},
- {title:"<s:message code="label.customer.optionvalue.name" text="Option value name"/>", name:"optionValueName", canFilter:false},
- {title:"<s:message code="label.entity.order" text="Sort order"/>", name:"order", type: "integer", canEdit:true, canFilter:false}
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+ {title:"<s:message code="label.entity.id" text="Id"/>", name:"id", canFilter:false},
+ {title:"<s:message code="label.customer.option.code" text="Option code"/>", name:"optionCode", canFilter:false},
+ {title:"<s:message code="label.customer.option.name" text="Option name"/>", name:"optionName", canFilter:false},
+ {title:"<s:message code="label.customer.optionvalue.code" text="Option value code"/>", name:"optionValueCode", canFilter:false},
+ {title:"<s:message code="label.customer.optionvalue.name" text="Option value name"/>", name:"optionValueName", canFilter:false},
+ {title:"<s:message code="label.entity.order" text="Sort order"/>", name:"order", type: "integer", canEdit:true, canFilter:false}
diff --git a/sm-shop/src/main/webapp/pages/admin/customers/optionsValues.jsp b/sm-shop/src/main/webapp/pages/admin/customers/optionsValues.jsp
index cfd2d60..cc05dbb 100644
--- a/sm-shop/src/main/webapp/pages/admin/customers/optionsValues.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/customers/optionsValues.jsp
@@ -1,55 +1,55 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="customer-section">
-
-
-
- <div class="sm-ui-component">
-
-
- <h3>
- <s:message code="menu.customer-options" text="Customer options" />
- </h3>
- <br/>
-
-
-
- <!-- Listing grid include -->
- <c:set value="/admin/customers/options/values/paging.html" var="pagingUrl" scope="request"/>
- <c:set value="/admin/customers/options/values/remove.html" var="removeUrl" scope="request"/>
- <c:set value="/admin/customers/options/values/edit.html" var="editUrl" scope="request"/>
- <c:set value="/admin/customers/options/values/list.html" var="afterRemoveUrl" scope="request"/>
- <c:set var="entityId" value="id" scope="request"/>
- <c:set var="componentTitleKey" value="menu.customer-options-list" scope="request"/>
- <c:set var="gridHeader" value="/pages/admin/customers/optionsValues-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="true" scope="request"/>
-
-
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
-
-
-
- </div>
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="customer-section">
+
+
+
+ <div class="sm-ui-component">
+
+
+ <h3>
+ <s:message code="menu.customer-options" text="Customer options" />
+ </h3>
+ <br/>
+
+
+
+ <!-- Listing grid include -->
+ <c:set value="/admin/customers/options/values/paging.html" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/customers/options/values/remove.html" var="removeUrl" scope="request"/>
+ <c:set value="/admin/customers/options/values/edit.html" var="editUrl" scope="request"/>
+ <c:set value="/admin/customers/options/values/list.html" var="afterRemoveUrl" scope="request"/>
+ <c:set var="entityId" value="id" scope="request"/>
+ <c:set var="componentTitleKey" value="menu.customer-options-list" scope="request"/>
+ <c:set var="gridHeader" value="/pages/admin/customers/optionsValues-gridHeader.jsp" scope="request"/>
+ <c:set var="canRemoveEntry" value="true" scope="request"/>
+
+
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+
+
+
+ </div>
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/customers/optionsValues-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/customers/optionsValues-gridHeader.jsp
index de21a97..1b3310e 100644
--- a/sm-shop/src/main/webapp/pages/admin/customers/optionsValues-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/customers/optionsValues-gridHeader.jsp
@@ -1,12 +1,12 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
- {title:"<s:message code="label.entity.id" text="Id"/>", name:"id", canFilter:false},
- {title:"<s:message code="label.entity.code" text="Code"/>", name:"code", canFilter:false},
- {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false},
- {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+ {title:"<s:message code="label.entity.id" text="Id"/>", name:"id", canFilter:false},
+ {title:"<s:message code="label.entity.code" text="Code"/>", name:"code", canFilter:false},
+ {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false},
+ {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
diff --git a/sm-shop/src/main/webapp/pages/admin/customers/optionValue.jsp b/sm-shop/src/main/webapp/pages/admin/customers/optionValue.jsp
index 4cac819..9450c1a 100644
--- a/sm-shop/src/main/webapp/pages/admin/customers/optionValue.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/customers/optionValue.jsp
@@ -1,103 +1,103 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-<%@ page session="false" %>
-
-<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
-
-
-<script type="text/javascript">
-
-$(document).ready(function() {
-
- $('#sortOrder').numeric();
-
-});
-
-</script>
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
- <div class="tab-content">
- <div class="tab-pane active" id="customer-section">
- <div class="sm-ui-component">
-
- <h3>
- <c:choose>
- <c:when test="${optionValue.id!=null && optionValue.id>0}">
- <s:message code="label.customer.optionvalue.edit" text="Edit option value" />
- </c:when>
- <c:otherwise>
- <s:message code="menu.customer-options-create" text="Create option value" />
- </c:otherwise>
- </c:choose>
- </h3>
- <br/>
-
- <c:url var="optionSave" value="/admin/customers/options/values/save.html"/>
-
-
- <form:form method="POST" enctype="multipart/form-data" commandName="optionValue" action="${optionSave}">
-
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
-
- <div class="control-group">
- <label class="required"><s:message code="label.customer.optionvalue.code" text="Option value code"/> </label>
- <div class="controls">
- <form:input cssClass="highlight" readonly="${optionValue.id>0}" id="code" path="code"/>
- <span class="help-inline"><form:errors path="code" cssClass="error" /></span>
- </div>
-
- </div>
-
- <c:forEach items="${optionValue.descriptionsSettoList}" var="description" varStatus="counter">
-
- <div class="control-group">
- <label class="required"><s:message code="label.customer.optionvalue.name" text="Option name"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:input cssClass="highlight x-large" id="name${counter.index}" path="descriptionsList[${counter.index}].name"/>
- <span class="help-inline"><form:errors path="descriptionsList[${counter.index}].name" cssClass="error" /></span>
- </div>
-
- </div>
-
-
- <form:hidden path="descriptionsList[${counter.index}].language.code" />
- <form:hidden path="descriptionsList[${counter.index}].id" />
-
- </c:forEach>
-
- <div class="control-group">
- <label class="required"><s:message code="label.entity.order" text="Order"/></label>
- <div class="controls">
- <form:input id="sortOrder" path="sortOrder"/>
- <span class="help-inline"><form:errors path="sortOrder" cssClass="error" /></span>
-
- </div>
- </div>
-
-
- <form:hidden path="id" />
-
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
- </div>
- </div>
-
- </form:form>
-
-
- <br/>
-
- </div>
- </div>
- </div>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+<%@ page session="false" %>
+
+<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
+
+
+<script type="text/javascript">
+
+$(document).ready(function() {
+
+ $('#sortOrder').numeric();
+
+});
+
+</script>
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+ <div class="tab-content">
+ <div class="tab-pane active" id="customer-section">
+ <div class="sm-ui-component">
+
+ <h3>
+ <c:choose>
+ <c:when test="${optionValue.id!=null && optionValue.id>0}">
+ <s:message code="label.customer.optionvalue.edit" text="Edit option value" />
+ </c:when>
+ <c:otherwise>
+ <s:message code="menu.customer-options-create" text="Create option value" />
+ </c:otherwise>
+ </c:choose>
+ </h3>
+ <br/>
+
+ <c:url var="optionSave" value="/admin/customers/options/values/save.html"/>
+
+
+ <form:form method="POST" enctype="multipart/form-data" commandName="optionValue" action="${optionSave}">
+
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.customer.optionvalue.code" text="Option value code"/> </label>
+ <div class="controls">
+ <form:input cssClass="highlight" readonly="${optionValue.id>0}" id="code" path="code"/>
+ <span class="help-inline"><form:errors path="code" cssClass="error" /></span>
+ </div>
+
+ </div>
+
+ <c:forEach items="${optionValue.descriptionsSettoList}" var="description" varStatus="counter">
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.customer.optionvalue.name" text="Option name"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:input cssClass="highlight x-large" id="name${counter.index}" path="descriptionsList[${counter.index}].name"/>
+ <span class="help-inline"><form:errors path="descriptionsList[${counter.index}].name" cssClass="error" /></span>
+ </div>
+
+ </div>
+
+
+ <form:hidden path="descriptionsList[${counter.index}].language.code" />
+ <form:hidden path="descriptionsList[${counter.index}].id" />
+
+ </c:forEach>
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.entity.order" text="Order"/></label>
+ <div class="controls">
+ <form:input id="sortOrder" path="sortOrder"/>
+ <span class="help-inline"><form:errors path="sortOrder" cssClass="error" /></span>
+
+ </div>
+ </div>
+
+
+ <form:hidden path="id" />
+
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
+ </div>
+ </div>
+
+ </form:form>
+
+
+ <br/>
+
+ </div>
+ </div>
+ </div>
</div>
\ No newline at end of file
sm-shop/src/main/webapp/pages/admin/home.jsp 170(+85 -85)
diff --git a/sm-shop/src/main/webapp/pages/admin/home.jsp b/sm-shop/src/main/webapp/pages/admin/home.jsp
index be7ea48..d4abd24 100644
--- a/sm-shop/src/main/webapp/pages/admin/home.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/home.jsp
@@ -1,86 +1,86 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
-<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
-
-<%@ page session="false" %>
-
-
-
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
- <div id="messages" class="alert alert-info" style="display:none">
- </div>
-
- <div class="box">
- <span class="box-title">
- <p><s:message code="label.store.information" text="Store information" /></p>
- </span>
-
- <p>
- <address>
- <strong><c:out value="${store.storename}"/></strong><br/>
- <c:if test="${not empty store.storeaddress}">
- <c:out value="${store.storeaddress}"/><br/>
- </c:if>
- <c:if test="${not empty store.storecity}">
- <c:out value="${store.storecity}"/>,
- </c:if>
- <c:choose>
- <c:when test="${not empty store.zone}">
- <c:out value="${store.zone.code}"/>,
- </c:when>
- <c:otherwise>
- <c:if test="${not empty store.storestateprovince}">
- <c:out value="${store.storestateprovince}"/>,
- </c:if>
- </c:otherwise>
- </c:choose>
- <c:if test="${not empty store.storepostalcode}">
- <c:out value="${store.storepostalcode}"/>
- </c:if>
- <br/><c:out value="${country.name}"/>
- <c:if test="${not empty store.storephone}">
- <br/><c:out value="${store.storephone}"/>
- </c:if>
- </address>
-
-
- </p>
- <p>
- <i class="icon-user"></i>
- <sec:authentication property="principal.username" /><br/>
- <i class="icon-calendar"></i> <s:message code="label.profile.lastaccess" text="Last access"/>: <fmt:formatDate type="both" dateStyle="long" value="${user.lastAccess}" />
- </p>
-
-
- </div>
-
- <sec:authorize access="hasAnyRole('ADMIN', 'SUPERADMIN', 'ADMIN_ORDER')">
-
- <br/>
- <h3><s:message code="label.order.recent" text="Recent orders"/></h3>
- <br/><br/>
-
- <!-- Listing grid include -->
- <c:set value="/admin/orders/paging.html?_endRow=10" var="pagingUrl" scope="request"/>
- <c:set value="/admin/orders/remove.html" var="removeUrl" scope="request"/>
- <c:set value="/admin/orders/editOrder.html" var="editUrl" scope="request"/>
- <c:set value="/admin/orders/list.html" var="afterRemoveUrl" scope="request"/>
- <c:set var="entityId" value="orderId" scope="request"/>
- <c:set var="componentTitleKey" value="label.order.title" scope="request"/>
- <c:set var="gridHeader" value="/pages/admin/orders/orders-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="false" scope="request"/>
-
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
- </sec:authorize>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
+<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
+
+<%@ page session="false" %>
+
+
+
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+ <div id="messages" class="alert alert-info" style="display:none">
+ </div>
+
+ <div class="box">
+ <span class="box-title">
+ <p><s:message code="label.store.information" text="Store information" /></p>
+ </span>
+
+ <p>
+ <address>
+ <strong><c:out value="${store.storename}"/></strong><br/>
+ <c:if test="${not empty store.storeaddress}">
+ <c:out value="${store.storeaddress}"/><br/>
+ </c:if>
+ <c:if test="${not empty store.storecity}">
+ <c:out value="${store.storecity}"/>,
+ </c:if>
+ <c:choose>
+ <c:when test="${not empty store.zone}">
+ <c:out value="${store.zone.code}"/>,
+ </c:when>
+ <c:otherwise>
+ <c:if test="${not empty store.storestateprovince}">
+ <c:out value="${store.storestateprovince}"/>,
+ </c:if>
+ </c:otherwise>
+ </c:choose>
+ <c:if test="${not empty store.storepostalcode}">
+ <c:out value="${store.storepostalcode}"/>
+ </c:if>
+ <br/><c:out value="${country.name}"/>
+ <c:if test="${not empty store.storephone}">
+ <br/><c:out value="${store.storephone}"/>
+ </c:if>
+ </address>
+
+
+ </p>
+ <p>
+ <i class="icon-user"></i>
+ <sec:authentication property="principal.username" /><br/>
+ <i class="icon-calendar"></i> <s:message code="label.profile.lastaccess" text="Last access"/>: <fmt:formatDate type="both" dateStyle="long" value="${user.lastAccess}" />
+ </p>
+
+
+ </div>
+
+ <sec:authorize access="hasAnyRole('ADMIN', 'SUPERADMIN', 'ADMIN_ORDER')">
+
+ <br/>
+ <h3><s:message code="label.order.recent" text="Recent orders"/></h3>
+ <br/><br/>
+
+ <!-- Listing grid include -->
+ <c:set value="/admin/orders/paging.html?_endRow=10" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/orders/remove.html" var="removeUrl" scope="request"/>
+ <c:set value="/admin/orders/editOrder.html" var="editUrl" scope="request"/>
+ <c:set value="/admin/orders/list.html" var="afterRemoveUrl" scope="request"/>
+ <c:set var="entityId" value="orderId" scope="request"/>
+ <c:set var="componentTitleKey" value="label.order.title" scope="request"/>
+ <c:set var="gridHeader" value="/pages/admin/orders/orders-gridHeader.jsp" scope="request"/>
+ <c:set var="canRemoveEntry" value="false" scope="request"/>
+
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+ </sec:authorize>
+
</div>
\ No newline at end of file
sm-shop/src/main/webapp/pages/admin/merchant/branding.jsp 266(+133 -133)
diff --git a/sm-shop/src/main/webapp/pages/admin/merchant/branding.jsp b/sm-shop/src/main/webapp/pages/admin/merchant/branding.jsp
index 6f6acd6..6e62e52 100644
--- a/sm-shop/src/main/webapp/pages/admin/merchant/branding.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/merchant/branding.jsp
@@ -1,133 +1,133 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-
-<%@ page session="false"%>
-
-
-
-<script type="text/javascript">
-
- function removeImage(){
- $("#store.error").show();
- $.ajax({
- type: 'POST',
- url: '<c:url value="/admin/store/removeImage.html"/>',
- dataType: 'json',
- success: function(response){
-
- var status = isc.XMLTools.selectObjects(response, "/response/status");
- if(status==0 || status ==9999) {
-
- //remove delete
- $("#imageControlRemove").html('');
- //add field
- $("#imageControl").html('<input class=\"input-file\" id=\"file[0]\" name=\"file[0]\" type=\"file\">');
- $(".alert-success").show();
-
- } else {
-
- //display message
- $(".alert-error").show();
- }
-
-
- },
- error: function(xhr, textStatus, errorThrown) {
- alert('error ' + errorThrown);
- }
-
- });
- }
-
-</script>
-
-
-<div class="tabbable">
-
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
- <c:url var="saveBrandingImage" value="/admin/store/saveBranding.html" />
- <form:form method="POST" enctype="multipart/form-data" action="${saveBrandingImage}">
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success"
- style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>">
- <s:message code="message.success" text="Request successfull" />
- </div>
-
-
-
- <!-- hidden when creating the product -->
- <div class="control-group">
- <label><s:message code="label.storelogo" text="Store logo"/> <c:if test="${store.storeLogo!=null}"><span id="imageControlRemove"> - <a href="#" onClick="removeImage('${store.id}')"><s:message code="label.generic.remove" text="Remove"/></a></span></c:if></label>
- <div class="controls" id="imageControl">
-
- <c:choose>
- <c:when test="${store.storeLogo==null}">
- <input class="input-file" name="file" type="file"><br/>
- </c:when>
- <c:otherwise>
- <img src="<c:url value=""/><sm:contentImage imageName="${store.storeLogo}" imageType="LOGO"/>">
- </c:otherwise>
- </c:choose>
-
-
-
-
-
-
- </div>
- </div>
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success">
- <s:message code="button.label.submit2" text="Submit" />
- </button>
- </div>
- </div>
- </form:form>
-
- <br/>
- <br/>
- <c:url var="saveTemplate" value="/admin/store/saveTemplate.html" />
- <form:form method="POST" enctype="multipart/form-data" commandName="store" action="${saveTemplate}">
-
-
-
- <!-- hidden when creating the product -->
- <div class="control-group">
- <label><s:message code="label.store.template" text="Theme"/></label>
- <div class="controls">
- <form:select items="${templates}" path="storeTemplate" />
- <span class="help-inline"></span>
- </div>
- </div>
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success">
- <s:message code="button.label.submit2" text="Submit" />
- </button>
- </div>
- </div>
- </form:form>
-
-
- </div>
- </div>
- </div>
-
-
-
-
-
-
-
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@ page session="false"%>
+
+
+
+<script type="text/javascript">
+
+ function removeImage(){
+ $("#store.error").show();
+ $.ajax({
+ type: 'POST',
+ url: '<c:url value="/admin/store/removeImage.html"/>',
+ dataType: 'json',
+ success: function(response){
+
+ var status = isc.XMLTools.selectObjects(response, "/response/status");
+ if(status==0 || status ==9999) {
+
+ //remove delete
+ $("#imageControlRemove").html('');
+ //add field
+ $("#imageControl").html('<input class=\"input-file\" id=\"file[0]\" name=\"file[0]\" type=\"file\">');
+ $(".alert-success").show();
+
+ } else {
+
+ //display message
+ $(".alert-error").show();
+ }
+
+
+ },
+ error: function(xhr, textStatus, errorThrown) {
+ alert('error ' + errorThrown);
+ }
+
+ });
+ }
+
+</script>
+
+
+<div class="tabbable">
+
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+ <c:url var="saveBrandingImage" value="/admin/store/saveBranding.html" />
+ <form:form method="POST" enctype="multipart/form-data" action="${saveBrandingImage}">
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success"
+ style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>">
+ <s:message code="message.success" text="Request successfull" />
+ </div>
+
+
+
+ <!-- hidden when creating the product -->
+ <div class="control-group">
+ <label><s:message code="label.storelogo" text="Store logo"/> <c:if test="${store.storeLogo!=null}"><span id="imageControlRemove"> - <a href="#" onClick="removeImage('${store.id}')"><s:message code="label.generic.remove" text="Remove"/></a></span></c:if></label>
+ <div class="controls" id="imageControl">
+
+ <c:choose>
+ <c:when test="${empty store.storeLogo}">
+ <input class="input-file" name="file" type="file"><br/>
+ </c:when>
+ <c:otherwise>
+ <img src="<c:url value=""/><sm:contentImage imageName="${store.storeLogo}" imageType="LOGO"/>">
+ </c:otherwise>
+ </c:choose>
+
+
+
+
+
+
+ </div>
+ </div>
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success">
+ <s:message code="button.label.submit2" text="Submit" />
+ </button>
+ </div>
+ </div>
+ </form:form>
+
+ <br/>
+ <br/>
+ <c:url var="saveTemplate" value="/admin/store/saveTemplate.html" />
+ <form:form method="POST" enctype="multipart/form-data" commandName="store" action="${saveTemplate}">
+
+
+
+ <!-- hidden when creating the product -->
+ <div class="control-group">
+ <label><s:message code="label.store.template" text="Theme"/></label>
+ <div class="controls">
+ <form:select items="${templates}" path="storeTemplate" />
+ <span class="help-inline"></span>
+ </div>
+ </div>
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success">
+ <s:message code="button.label.submit2" text="Submit" />
+ </button>
+ </div>
+ </div>
+ </form:form>
+
+
+ </div>
+ </div>
+ </div>
+
+
+
+
+
+
+
+
sm-shop/src/main/webapp/pages/admin/merchant/merchant.jsp 694(+347 -347)
diff --git a/sm-shop/src/main/webapp/pages/admin/merchant/merchant.jsp b/sm-shop/src/main/webapp/pages/admin/merchant/merchant.jsp
index 3ce2b58..355fa3c 100644
--- a/sm-shop/src/main/webapp/pages/admin/merchant/merchant.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/merchant/merchant.jsp
@@ -1,348 +1,348 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-
- <link href="<c:url value="/resources/css/bootstrap/css/datepicker.css" />" rel="stylesheet"></link>
- <script src="<c:url value="/resources/js/bootstrap/bootstrap-datepicker.js" />"></script>
-
-
-<script>
-
-
-$(document).ready(function() {
-
- if($("#code").val()=="") {
- $('.btn').addClass('disabled');
- }
-
-
- <c:choose>
- <c:when test="${store.storestateprovince!=null && store.storestateprovince!=''}">
- $('.zone-list').hide();
- $('#storestateprovince').show();
- $('#storestateprovince').val('<c:out value="${store.storestateprovince}"/>');
- </c:when>
- <c:otherwise>
- $('.zone-list').show();
- $('#storestateprovince').hide();
- getZones('<c:out value="${store.country.isoCode}" />');
- </c:otherwise>
- </c:choose>
-
- $(".country-list").change(function() {
- getZones($(this).val());
- })
-
-
-});
-
-$.fn.addItems = function(data) {
- $(".zone-list > option").remove();
- return this.each(function() {
- var list = this;
- $.each(data, function(index, itemData) {
- var option = new Option(itemData.name, itemData.code);
- list.add(option);
- });
- });
-};
-
-function getZones(countryCode){
-
- var url = '<c:url value="/admin/reference/provinces.html"/>?lang=<c:out value="${requestScope.LANGUAGE.code}"/>';
-
- $.ajax({
- type: 'POST',
- url: url,
- data: 'countryCode=' + countryCode,
- dataType: 'json',
- success: function(response){
-
- var status = isc.XMLTools.selectObjects(response, "/response/status");
- if(status==0 || status ==9999) {
-
- var data = isc.XMLTools.selectObjects(response, "/response/data");
- if(data && data.length>0) {
-
- $('.zone-list').show();
- $('#storestateprovince').hide();
- $(".zone-list").addItems(data);
- <c:if test="${store.zone!=null}">
- $('.zone-list').val('<c:out value="${store.zone.code}"/>');
- $('#storestateprovince').val('');
- </c:if>
- } else {
- $('.zone-list').hide();
- $('#storestateprovince').show();
- <c:if test="${store.storestateprovince!=null}">
- $('#storestateprovince').val('<c:out value="${store.storestateprovince}"/>');
- </c:if>
- }
- } else {
- $('.zone-list').hide();
- $('#storestateprovince').show();
- }
-
-
- },
- error: function(xhr, textStatus, errorThrown) {
- alert('error ' + errorThrown);
- }
-
- });
-}
-
-
-
-function validateCode() {
- $('#checkCodeStatus').html('<img src="<c:url value="/resources/img/ajax-loader.gif" />');
- $('#checkCodeStatus').show();
- var storeCode = $("#code").val();
- var id = $("#id").val();
- checkCode(storeCode,id,'<c:url value="/admin/store/checkStoreCode.html" />');
-}
-
-function callBackCheckCode(msg,code) {
-
- if(code==0) {
- $('.btn').removeClass('disabled');
- }
- if(code==9999) {
-
- $('#checkCodeStatus').html('<font color="green"><s:message code="message.code.available" text="This code is available"/></font>');
- $('#checkCodeStatus').show();
- $('.btn').removeClass('disabled');
- }
- if(code==9998) {
-
- $('#checkCodeStatus').html('<font color="red"><s:message code="message.code.exist" text="This code already exist"/></font>');
- $('#checkCodeStatus').show();
- $('.btn').addClass('disabled');
- }
-
-}
-
-
-</script>
-
-
-<div class="tabbable">
-
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <h3><s:message code="label.store.title" text="Merchant store" /></h3>
- <br/>
-
-
- <c:url var="merchant" value="/admin/store/save.html"/>
-
-
- <form:form method="POST" commandName="store" action="${merchant}">
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
- <div class="control-group">
- <label><s:message code="label.storename" text="Name"/></label>
- <div class="controls">
- <form:input cssClass="input-large highlight" path="storename" />
- <span class="help-inline"><form:errors path="storename" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.storecode" text="Store code"/></label>
- <div class="controls">
- <c:choose>
- <c:when test="${store.code=='DEFAULT'}">
- <span class="input-large uneditable-input">${store.code}</span><form:hidden path="code" />
- </c:when>
- <c:otherwise>
- <form:input cssClass="input-large highlight" path="code" onblur="validateCode()"/>
- </c:otherwise>
- </c:choose>
- <span class="help-inline"><div id="checkCodeStatus" style="display:none;"></div><form:errors path="code" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.storephone" text="Phone"/></label>
- <div class="controls">
- <form:input cssClass="input-large highlight" path="storephone" />
- <span class="help-inline"><form:errors path="storephone" cssClass="error" /></span>
- </div>
-
- </div>
-
- <div class="control-group">
- <label><s:message code="label.storeemailaddress" text="Email"/></label>
- <div class="controls">
- <form:input cssClass="input-large highlight" path="storeEmailAddress" />
- <span class="help-inline"><form:errors path="storeEmailAddress" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.storeaddress" text="Address"/></label>
- <div class="controls">
- <form:input cssClass="input-large" path="storeaddress" />
- <span class="help-inline"><form:errors path="storeaddress" cssClass="error" /></span>
- </div>
- </div>
-
-
- <div class="control-group">
- <label><s:message code="label.storecity" text="City"/></label>
- <div class="controls">
- <form:input cssClass="input-large highlight" path="storecity" />
- <span class="help-inline"><form:errors path="storecity" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.storecountry" text="Store Country"/></label>
- <div class="controls">
-
- <form:select cssClass="country-list highlight" path="country.isoCode">
- <form:options items="${countries}" itemValue="isoCode" itemLabel="name"/>
- </form:select>
- <span class="help-inline"><form:errors path="country" cssClass="error" /></span>
- </div>
- </div>
-
-
- <div class="control-group">
- <label><s:message code="label.storezone" text="Store state / province"/></label>
- <div class="controls">
- <form:select cssClass="zone-list highlight" path="zone.code"/>
- <input type="text" class="input-large highlight" id="storestateprovince" name="storestateprovince" value="${store.storestateprovince}" />
- <span class="help-inline"><form:errors path="zone.code" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.storepostalcode" text="Postal code"/></label>
- <div class="controls">
- <form:input cssClass="input-large highlight" path="storepostalcode" />
- <span class="help-inline"><form:errors path="storepostalcode" cssClass="error" /></span>
- </div>
- </div>
-
-
-
- <div class="control-group">
- <label><s:message code="label.supportedlanguages" text="Supported languages"/></label>
- <div class="controls">
-
- <form:checkboxes cssClass="highlight" items="${languages}" itemValue="code" itemLabel="code" path="languages" />
- <span class="help-inline"><form:errors path="languages" cssClass="error" /></span>
- </div>
- </div>
-
-
- <div class="control-group">
- <label><s:message code="label.defaultlanguage" text="Default language"/></label>
- <div class="controls">
-
- <form:select items="${languages}" itemValue="id" itemLabel="code" path="defaultLanguage.id"/>
- <span class="help-inline"></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.currency" text="Currency"/></label>
- <div class="controls">
-
- <form:select items="${currencies}" itemValue="id" itemLabel="code" path="currency.id"/>
- <span class="help-inline"></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.store.currency.format" text="National currency format"/></label>
- <div class="controls">
-
- <form:checkbox path="currencyFormatNational" />
- <span class="help-inline"><s:message code="label.store.currency.format.help" text="National currency format ex $1,345.79 or International currency format ex USD1,345.79"/></span>
- </div>
- </div>
-
-
- <div class="control-group">
- <label><s:message code="label.store.weightunit" text="Weight units"/></label>
- <div class="controls">
-
- <form:select items="${weights}" path="weightunitcode" itemValue="code" itemLabel="name"/>
- <span class="help-inline"></span>
- </div>
- </div>
-
-
- <div class="control-group">
- <label><s:message code="label.store.sizeunit" text="Size units"/></label>
- <div class="controls">
-
- <form:select items="${sizes}" path="seizeunitcode" itemValue="code" itemLabel="name"/>
- <span class="help-inline"></span>
- </div>
- </div>
-
-
- <div class="control-group">
- <label><s:message code="label.store.inbusinesssince" text="Web site operating since"/></label>
- <div class="controls">
- <input id="dateBusinessSince" name="dateBusinessSince" value="${store.dateBusinessSince}" class="small" type="text" data-date-format="<%=com.salesmanager.core.business.constants.Constants.DEFAULT_DATE_FORMAT%>" data-datepicker="datepicker">
- <span class="help-inline"><form:errors path="dateBusinessSince" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.store.useCache" text="Use cache"/></label>
- <div class="controls">
-
- <form:checkbox path="useCache" />
- <span class="help-inline"></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.store.baseurl" text="Store base url"/></label>
- <div class="controls">
- <span class="add-on">
- http://
- </span>
- <form:input cssClass="input-medium highlight" path="domainName" />
- <span class="help-inline"><form:errors path="domainName" cssClass="error" /></span>
- </div>
- </div>
-
- <form:hidden path="id" />
- <form:hidden path="storeLogo" />
- <form:hidden path="storeTemplate" />
-
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit2" text="Submit"/></button>
- </div>
- </div>
-
-
-
- </form:form>
-
-
-
-
-
-
-
-
-
-
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+
+ <link href="<c:url value="/resources/css/bootstrap/css/datepicker.css" />" rel="stylesheet"></link>
+ <script src="<c:url value="/resources/js/bootstrap/bootstrap-datepicker.js" />"></script>
+
+
+<script>
+
+
+$(document).ready(function() {
+
+ if($("#code").val()=="") {
+ $('.btn').addClass('disabled');
+ }
+
+
+ <c:choose>
+ <c:when test="${store.storestateprovince!=null && store.storestateprovince!=''}">
+ $('.zone-list').hide();
+ $('#storestateprovince').show();
+ $('#storestateprovince').val('<c:out value="${store.storestateprovince}"/>');
+ </c:when>
+ <c:otherwise>
+ $('.zone-list').show();
+ $('#storestateprovince').hide();
+ getZones('<c:out value="${store.country.isoCode}" />');
+ </c:otherwise>
+ </c:choose>
+
+ $(".country-list").change(function() {
+ getZones($(this).val());
+ })
+
+
+});
+
+$.fn.addItems = function(data) {
+ $(".zone-list > option").remove();
+ return this.each(function() {
+ var list = this;
+ $.each(data, function(index, itemData) {
+ var option = new Option(itemData.name, itemData.code);
+ list.add(option);
+ });
+ });
+};
+
+function getZones(countryCode){
+
+ var url = '<c:url value="/admin/reference/provinces.html"/>?lang=<c:out value="${requestScope.LANGUAGE.code}"/>';
+
+ $.ajax({
+ type: 'POST',
+ url: url,
+ data: 'countryCode=' + countryCode,
+ dataType: 'json',
+ success: function(response){
+
+ var status = isc.XMLTools.selectObjects(response, "/response/status");
+ if(status==0 || status ==9999) {
+
+ var data = isc.XMLTools.selectObjects(response, "/response/data");
+ if(data && data.length>0) {
+
+ $('.zone-list').show();
+ $('#storestateprovince').hide();
+ $(".zone-list").addItems(data);
+ <c:if test="${store.zone!=null}">
+ $('.zone-list').val('<c:out value="${store.zone.code}"/>');
+ $('#storestateprovince').val('');
+ </c:if>
+ } else {
+ $('.zone-list').hide();
+ $('#storestateprovince').show();
+ <c:if test="${store.storestateprovince!=null}">
+ $('#storestateprovince').val('<c:out value="${store.storestateprovince}"/>');
+ </c:if>
+ }
+ } else {
+ $('.zone-list').hide();
+ $('#storestateprovince').show();
+ }
+
+
+ },
+ error: function(xhr, textStatus, errorThrown) {
+ alert('error ' + errorThrown);
+ }
+
+ });
+}
+
+
+
+function validateCode() {
+ $('#checkCodeStatus').html('<img src="<c:url value="/resources/img/ajax-loader.gif" />');
+ $('#checkCodeStatus').show();
+ var storeCode = $("#code").val();
+ var id = $("#id").val();
+ checkCode(storeCode,id,'<c:url value="/admin/store/checkStoreCode.html" />');
+}
+
+function callBackCheckCode(msg,code) {
+
+ if(code==0) {
+ $('.btn').removeClass('disabled');
+ }
+ if(code==9999) {
+
+ $('#checkCodeStatus').html('<font color="green"><s:message code="message.code.available" text="This code is available"/></font>');
+ $('#checkCodeStatus').show();
+ $('.btn').removeClass('disabled');
+ }
+ if(code==9998) {
+
+ $('#checkCodeStatus').html('<font color="red"><s:message code="message.code.exist" text="This code already exist"/></font>');
+ $('#checkCodeStatus').show();
+ $('.btn').addClass('disabled');
+ }
+
+}
+
+
+</script>
+
+
+<div class="tabbable">
+
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <h3><s:message code="label.store.title" text="Merchant store" /></h3>
+ <br/>
+
+
+ <c:url var="merchant" value="/admin/store/save.html"/>
+
+
+ <form:form method="POST" commandName="store" action="${merchant}">
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+ <div class="control-group">
+ <label><s:message code="label.storename" text="Name"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" path="storename" />
+ <span class="help-inline"><form:errors path="storename" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.storecode" text="Store code"/></label>
+ <div class="controls">
+ <c:choose>
+ <c:when test="${store.code=='DEFAULT'}">
+ <span class="input-large uneditable-input">${store.code}</span><form:hidden path="code" />
+ </c:when>
+ <c:otherwise>
+ <form:input cssClass="input-large highlight" path="code" onblur="validateCode()"/>
+ </c:otherwise>
+ </c:choose>
+ <span class="help-inline"><div id="checkCodeStatus" style="display:none;"></div><form:errors path="code" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.storephone" text="Phone"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" path="storephone" />
+ <span class="help-inline"><form:errors path="storephone" cssClass="error" /></span>
+ </div>
+
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.storeemailaddress" text="Email"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" path="storeEmailAddress" />
+ <span class="help-inline"><form:errors path="storeEmailAddress" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.storeaddress" text="Address"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large" path="storeaddress" />
+ <span class="help-inline"><form:errors path="storeaddress" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.storecity" text="City"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" path="storecity" />
+ <span class="help-inline"><form:errors path="storecity" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.storecountry" text="Store Country"/></label>
+ <div class="controls">
+
+ <form:select cssClass="country-list highlight" path="country.isoCode">
+ <form:options items="${countries}" itemValue="isoCode" itemLabel="name"/>
+ </form:select>
+ <span class="help-inline"><form:errors path="country" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.storezone" text="Store state / province"/></label>
+ <div class="controls">
+ <form:select cssClass="zone-list highlight" path="zone.code"/>
+ <input type="text" class="input-large highlight" id="storestateprovince" name="storestateprovince" value="${store.storestateprovince}" />
+ <span class="help-inline"><form:errors path="zone.code" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.storepostalcode" text="Postal code"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" path="storepostalcode" />
+ <span class="help-inline"><form:errors path="storepostalcode" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+
+ <div class="control-group">
+ <label><s:message code="label.supportedlanguages" text="Supported languages"/></label>
+ <div class="controls">
+
+ <form:checkboxes cssClass="highlight" items="${languages}" itemValue="code" itemLabel="code" path="languages" />
+ <span class="help-inline"><form:errors path="languages" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.defaultlanguage" text="Default language"/></label>
+ <div class="controls">
+
+ <form:select items="${languages}" itemValue="id" itemLabel="code" path="defaultLanguage.id"/>
+ <span class="help-inline"></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.currency" text="Currency"/></label>
+ <div class="controls">
+
+ <form:select items="${currencies}" itemValue="id" itemLabel="code" path="currency.id"/>
+ <span class="help-inline"></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.store.currency.format" text="National currency format"/></label>
+ <div class="controls">
+
+ <form:checkbox path="currencyFormatNational" />
+ <span class="help-inline"><s:message code="label.store.currency.format.help" text="National currency format ex $1,345.79 or International currency format ex USD1,345.79"/></span>
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.store.weightunit" text="Weight units"/></label>
+ <div class="controls">
+
+ <form:select items="${weights}" path="weightunitcode" itemValue="code" itemLabel="name"/>
+ <span class="help-inline"></span>
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.store.sizeunit" text="Size units"/></label>
+ <div class="controls">
+
+ <form:select items="${sizes}" path="seizeunitcode" itemValue="code" itemLabel="name"/>
+ <span class="help-inline"></span>
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.store.inbusinesssince" text="Web site operating since"/></label>
+ <div class="controls">
+ <input id="dateBusinessSince" name="dateBusinessSince" value="${store.dateBusinessSince}" class="small" type="text" data-date-format="<%=com.salesmanager.core.business.constants.Constants.DEFAULT_DATE_FORMAT%>" data-datepicker="datepicker">
+ <span class="help-inline"><form:errors path="dateBusinessSince" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.store.useCache" text="Use cache"/></label>
+ <div class="controls">
+
+ <form:checkbox path="useCache" />
+ <span class="help-inline"></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.store.baseurl" text="Store base url"/></label>
+ <div class="controls">
+ <span class="add-on">
+ http://
+ </span>
+ <form:input cssClass="input-medium highlight" path="domainName" />
+ <span class="help-inline"><form:errors path="domainName" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <form:hidden path="id" />
+ <form:hidden path="storeLogo" />
+ <form:hidden path="storeTemplate" />
+
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit2" text="Submit"/></button>
+ </div>
+ </div>
+
+
+
+ </form:form>
+
+
+
+
+
+
+
+
+
+
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/merchant/storeLanding.jsp b/sm-shop/src/main/webapp/pages/admin/merchant/storeLanding.jsp
index 78f458c..b0c8625 100644
--- a/sm-shop/src/main/webapp/pages/admin/merchant/storeLanding.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/merchant/storeLanding.jsp
@@ -1,146 +1,146 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-
-<script src="<c:url value="/resources/js/ckeditor/ckeditor.js" />"></script>
-
-
-<script>
-
-
-
-
-</script>
-
-
-<div class="tabbable">
-
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <h3><s:message code="label.storefront.landingpage" text="Landing page information" /></h3>
- <br/>
-
-
- <c:url var="merchant" value="/admin/store/saveLanding.html"/>
-
-
- <form:form method="POST" commandName="storeLanding" action="${merchant}">
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
-
- <c:forEach items="${storeLanding.descriptions}" var="description" varStatus="counter">
-
-
- <!-- Title -->
- <div class="control-group">
- <label><s:message code="label.storefront.landingpage.title" text="Title"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:input id="title${counter.index}" cssClass="input-large highlight" path="descriptions[${counter.index}].title" />
- <span class="help-inline"><form:errors path="descriptions[${counter.index}].title" cssClass="error" /></span>
- </div>
- </div>
-
- <!-- Description -->
- <div class="control-group">
- <label><s:message code="label.storefront.metatags.description" text="Tags description"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:textarea id="description${counter.index}" cssClass="span6" path="descriptions[${counter.index}].description" rows="5" />
- <span class="help-inline"><form:errors path="descriptions[${counter.index}].description" cssClass="error" /></span>
- </div>
- </div>
-
-
-
-
- <!-- Keywords -->
- <div class="control-group">
- <label><s:message code="label.storefront.metatags.keywords" text="Keywords"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:textarea id="keywords${counter.index}" cssClass="span6" path="descriptions[${counter.index}].keywords" rows="5"/>
- <span class="help-inline"><form:errors path="descriptions[${counter.index}].keywords" cssClass="error" /></span>
- </div>
- </div>
-
-
- <!-- Content -->
- <div class="control-group">
- <label><s:message code="label.storefront.storetext" text="Page content"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
-
-
-
- <textarea cols="30" id="descriptions[${counter.index}].homePageContent" class="ckeditor" name="descriptions[${counter.index}].homePageContent">
- <c:out value="${description.homePageContent}" escapeXml="true"/>
- </textarea>
-
-
- </div>
-
- <script type="text/javascript">
- //<![CDATA[
-
- CKEDITOR.replace('descriptions[${counter.index}].homePageContent',
- {
- skin : 'office2003',
- toolbar :
- [
- ['Source','-','Save','NewPage','Preview'],
- ['Cut','Copy','Paste','PasteText','-','Print'],
- ['Undo','Redo','-','Find','-','SelectAll','RemoveFormat'], '/',
- ['Bold','Italic','Underline','Strike','-','Subscript','Superscript'],
- ['NumberedList','BulletedList','-','Outdent','Indent','Blockquote'],
- ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
- ['Link','Unlink','Anchor'],
- ['Image','Flash','Table','HorizontalRule','SpecialChar','PageBreak'], '/',
- ['Styles','Format','Font','FontSize'], ['TextColor','BGColor'],
- ['Maximize', 'ShowBlocks']
- ],
-
- filebrowserWindowWidth : '720',
- filebrowserWindowHeight : '740',
- filebrowserImageBrowseUrl : '<c:url value="/admin/content/fileBrowser.html"/>'
-
-
- });
-
- //]]>
- </script>
-
- </div>
-
-
-
- <form:hidden path="descriptions[${counter.index}].language.code" />
-
-
- </c:forEach>
-
-
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit2" text="Submit"/></button>
- </div>
- </div>
-
-
-
- </form:form>
-
-
-
-
-
-
-
-
-
-
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+
+<script src="<c:url value="/resources/js/ckeditor/ckeditor.js" />"></script>
+
+
+<script>
+
+
+
+
+</script>
+
+
+<div class="tabbable">
+
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <h3><s:message code="label.storefront.landingpage" text="Landing page information" /></h3>
+ <br/>
+
+
+ <c:url var="merchant" value="/admin/store/saveLanding.html"/>
+
+
+ <form:form method="POST" commandName="storeLanding" action="${merchant}">
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+
+ <c:forEach items="${storeLanding.descriptions}" var="description" varStatus="counter">
+
+
+ <!-- Title -->
+ <div class="control-group">
+ <label><s:message code="label.storefront.landingpage.title" text="Title"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:input id="title${counter.index}" cssClass="input-large highlight" path="descriptions[${counter.index}].title" />
+ <span class="help-inline"><form:errors path="descriptions[${counter.index}].title" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <!-- Description -->
+ <div class="control-group">
+ <label><s:message code="label.storefront.metatags.description" text="Tags description"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:textarea id="description${counter.index}" cssClass="span6" path="descriptions[${counter.index}].description" rows="5" />
+ <span class="help-inline"><form:errors path="descriptions[${counter.index}].description" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+
+
+ <!-- Keywords -->
+ <div class="control-group">
+ <label><s:message code="label.storefront.metatags.keywords" text="Keywords"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:textarea id="keywords${counter.index}" cssClass="span6" path="descriptions[${counter.index}].keywords" rows="5"/>
+ <span class="help-inline"><form:errors path="descriptions[${counter.index}].keywords" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+ <!-- Content -->
+ <div class="control-group">
+ <label><s:message code="label.storefront.storetext" text="Page content"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+
+
+
+ <textarea cols="30" id="descriptions[${counter.index}].homePageContent" class="ckeditor" name="descriptions[${counter.index}].homePageContent">
+ <c:out value="${description.homePageContent}" escapeXml="true"/>
+ </textarea>
+
+
+ </div>
+
+ <script type="text/javascript">
+ //<![CDATA[
+
+ CKEDITOR.replace('descriptions[${counter.index}].homePageContent',
+ {
+ skin : 'office2003',
+ toolbar :
+ [
+ ['Source','-','Save','NewPage','Preview'],
+ ['Cut','Copy','Paste','PasteText','-','Print'],
+ ['Undo','Redo','-','Find','-','SelectAll','RemoveFormat'], '/',
+ ['Bold','Italic','Underline','Strike','-','Subscript','Superscript'],
+ ['NumberedList','BulletedList','-','Outdent','Indent','Blockquote'],
+ ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
+ ['Link','Unlink','Anchor'],
+ ['Image','Flash','Table','HorizontalRule','SpecialChar','PageBreak'], '/',
+ ['Styles','Format','Font','FontSize'], ['TextColor','BGColor'],
+ ['Maximize', 'ShowBlocks']
+ ],
+
+ filebrowserWindowWidth : '720',
+ filebrowserWindowHeight : '740',
+ filebrowserImageBrowseUrl : '<c:url value="/admin/content/fileBrowser.html"/>'
+
+
+ });
+
+ //]]>
+ </script>
+
+ </div>
+
+
+
+ <form:hidden path="descriptions[${counter.index}].language.code" />
+
+
+ </c:forEach>
+
+
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit2" text="Submit"/></button>
+ </div>
+ </div>
+
+
+
+ </form:form>
+
+
+
+
+
+
+
+
+
+
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/merchant/stores.jsp b/sm-shop/src/main/webapp/pages/admin/merchant/stores.jsp
index 03be948..1e1b357 100644
--- a/sm-shop/src/main/webapp/pages/admin/merchant/stores.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/merchant/stores.jsp
@@ -1,51 +1,51 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
- <div class="sm-ui-component">
- <h3><s:message code="label.store.list" text="Stores" /></h3>
- <br/>
-
-
- <!-- Listing grid include -->
- <c:set value="/admin/store/paging.html" var="pagingUrl" scope="request"/>
- <c:set value="/admin/store/remove.html" var="removeUrl" scope="request"/>
- <c:set value="/admin/store/editStore.html" var="editUrl" scope="request"/>
- <c:set value="/admin/store/list.html" var="refreshUrl" scope="request"/>
- <c:set var="entityId" value="storeId" scope="request"/>
- <c:set var="componentTitleKey" value="label.store.list" scope="request"/>
- <c:set var="gridHeader" value="/pages/admin/merchant/stores-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="true" scope="request"/>
-
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
-
-
-
- </div>
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+ <div class="sm-ui-component">
+ <h3><s:message code="label.store.list" text="Stores" /></h3>
+ <br/>
+
+
+ <!-- Listing grid include -->
+ <c:set value="/admin/store/paging.html" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/store/remove.html" var="removeUrl" scope="request"/>
+ <c:set value="/admin/store/editStore.html" var="editUrl" scope="request"/>
+ <c:set value="/admin/store/list.html" var="refreshUrl" scope="request"/>
+ <c:set var="entityId" value="storeId" scope="request"/>
+ <c:set var="componentTitleKey" value="label.store.list" scope="request"/>
+ <c:set var="gridHeader" value="/pages/admin/merchant/stores-gridHeader.jsp" scope="request"/>
+ <c:set var="canRemoveEntry" value="true" scope="request"/>
+
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+
+
+
+ </div>
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/merchant/stores-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/merchant/stores-gridHeader.jsp
index be2326e..2939e3e 100644
--- a/sm-shop/src/main/webapp/pages/admin/merchant/stores-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/merchant/stores-gridHeader.jsp
@@ -1,13 +1,13 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
- {title:"<s:message code="label.entity.id" text="Id"/>", name:"storeId", canFilter:false},
- {title:"<s:message code="label.entity.code" text="Code"/>", name:"code", canFilter:false},
- {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false},
- {title:"<s:message code="label.generic.email" text="Email"/>", name:"email", canFilter:false},
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+ {title:"<s:message code="label.entity.id" text="Id"/>", name:"storeId", canFilter:false},
+ {title:"<s:message code="label.entity.code" text="Code"/>", name:"code", canFilter:false},
+ {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false},
+ {title:"<s:message code="label.generic.email" text="Email"/>", name:"email", canFilter:false},
{title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
\ No newline at end of file
sm-shop/src/main/webapp/pages/admin/orders/order.jsp 1442(+721 -721)
diff --git a/sm-shop/src/main/webapp/pages/admin/orders/order.jsp b/sm-shop/src/main/webapp/pages/admin/orders/order.jsp
index f012791..2824773 100644
--- a/sm-shop/src/main/webapp/pages/admin/orders/order.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/orders/order.jsp
@@ -1,722 +1,722 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-<%@ page session="false" %>
-
-
-<link href="<c:url value="/resources/css/bootstrap/css/datepicker.css" />" rel="stylesheet"></link>
-<script src="<c:url value="/resources/js/bootstrap/bootstrap-datepicker.js" />"></script>
-<script src="<c:url value="/resources/js/ckeditor/ckeditor.js" />"></script>
-<script src="<c:url value="/resources/js/jquery.formatCurrency-1.4.0.js" />"></script>
-<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
-<script src="<c:url value="/resources/js/json2.js" />"></script>
-<script src="<c:url value="/resources/js/adminFunctions.js" />"></script>
-
-<script src="<c:url value="/resources/js/jquery.showLoading.min.js" />"></script>
-<link href="<c:url value="/resources/css/showLoading.css" />" rel="stylesheet">
-
-<script>
-
-function displayErrorMessage(message) {
-
-}
-
-
-function getZones(listDiv, textDiv, countryCode, defaultValue){
- $.ajax({
- type: 'POST',
- url: '<c:url value="/shop/reference/provinces.html"/>',
- data: 'countryCode=' + countryCode + '&lang=${requestScope.LANGUAGE.code}',
- dataType: 'json',
- success: function(response){
- var status = response.response.status;
- var data = response.response.data;
- //console.log(status);
- if((status==0 || status ==9999) && data) {
- //console.log(data);
- if(data && data.length>0) {
- $(listDiv).show();
- $(textDiv).hide();
- $(listDiv).addItems(listDiv, data, defaultValue);
- } else {
- $(listDiv).hide();
- $(textDiv).show();
- if(defaultValue!=null || defaultValue !='') {
- $(textDiv).val(defaultValue);
- }
- }
- } else {
- $(listDiv).hide();
- $(textDiv).show();
- }
- },
- error: function(xhr, textStatus, errorThrown) {
- alert('error ' + errorThrown);
- $('.sm').hideLoading();
- }
-
- });
-
-}
-
-
-$.fn.addItems = function(div, data, defaultValue) {
- //console.log('Populating div ' + div + ' defaultValue ' + defaultValue);
- var selector = div + ' > option';
- var defaultExist = false;
- $(selector).remove();
- return this.each(function() {
- var list = this;
- $.each(data, function(index, itemData) {
- //console.log(itemData.code + ' ' + defaultValue);
- if(itemData.code==defaultValue) {
- defaultExist = true;
- }
- var option = new Option(itemData.name, itemData.code);
- list.add(option);
- });
- if(defaultExist && (defaultValue!=null && defaultValue!='')) {
- $(div).val(defaultValue);
- }
- });
-};
-
-function listTransactions(orderId){
-
- $.ajax({
- type: 'GET',
- url: '<c:url value="/admin/orders/listTransactions.html"/>?id=' + orderId,
- dataType: 'json',
- success: function(response){
- var status = response.response.status;
- var data = response.response.data;
- console.log(status);
- if((status==0 || status ==9999) && data) {
- //console.log(data);
- $('#transactionsModal').modal();
- var transactions = data;
- //console.log(transactions);
- for(i=0;i<transactions.length;i++) {
- var tr = '<tr><td>' + transactions[i].transactionId + '</td><td>' + transactions[i].transactionDate + '</td><td>' + transactions[i].transactionType + '</td><td>' + transactions[i].transactionAmount + '</td><td>' + JSON.stringify(transactions[i].transactionDetails) + '</td>';
- $('#transactionList').append(tr);
- }
- }
- },
- error: function(xhr, textStatus, errorThrown) {
- alert('error ' + errorThrown);
- $('.sm').hideLoading();
- }
-
- });
-}
-
-function sendInvoice(orderId){
-
- $.ajax({
- type: 'GET',
- url: '<c:url value="/admin/orders/sendInvoice.html"/>?id=' + orderId,
- dataType: 'json',
- success: function(response){
- var status = response.response.status;
- var data = response.response.data;
- //console.log(status);
- if(status==0 || status ==9999) {
- $(".alert-success").show();
- } else {
- $(".alert-error").show();
- }
- $('.sm').hideLoading();
- },
- error: function(xhr, textStatus, errorThrown) {
- alert('error ' + errorThrown);
- $('.sm').hideLoading();
- }
-
- });
-}
-
-function updateStatus(orderId){
-
- $.ajax({
- type: 'GET',
- url: '<c:url value="/admin/orders/updateStatus.html"/>?id=' + orderId,
- dataType: 'json',
- success: function(response){
- var status = response.response.status;
- var data = response.response.data;
- //console.log(status);
- if(status==0 || status ==9999) {
- $(".alert-success").show();
- } else {
- $(".alert-error").show();
- }
- $('.sm').hideLoading();
- },
- error: function(xhr, textStatus, errorThrown) {
- alert('error ' + errorThrown);
- $('.sm').hideLoading();
- }
-
- });
-}
-
-function resetMessages() {
- $(".alert-error").hide();
- $(".alert-success").hide();
-}
-
-
-function sendDownloadEmail(orderId){
-
- $.ajax({
- type: 'GET',
- url: '<c:url value="/admin/orders/sendDownloadEmail.html"/>?id=' + orderId,
- dataType: 'json',
- success: function(response){
- var status = response.response.status;
- var data = response.response.data;
- //console.log(status);
- if(status==0 || status ==9999) {
- $(".alert-success").show();
- } else {
- $(".alert-error").show();
- }
- $('.sm').hideLoading();
- },
- error: function(xhr, textStatus, errorThrown) {
- alert('error ' + errorThrown);
- $('.sm').hideLoading();
- }
-
- });
-}
-
-function captureOrder(orderId){
- $.ajax({
- type: 'POST',
- url: '<c:url value="/admin/orders/captureOrder.html"/>?id=' + orderId,
- dataType: 'json',
- success: function(response){
- var status = response.response.status;
- var data = response.response.data;
- //console.log(status);
- if(status==0 || status ==9999) {
- $(".alert-success").show();
- window.location='<c:url value="/admin/orders/editOrder.html" />?id=' + orderId;
- } else {
- $(".alert-error").show();
- }
- $('.sm').hideLoading();
- $('#captureAction').removeClass('disabled');
- },
- error: function(xhr, textStatus, errorThrown) {
- alert('error ' + errorThrown);
- $('.sm').hideLoading();
- }
-
- });
-}
-
- $(document).ready(function(){
-
- $("#refundAction").click(function() {
- resetMessages();
- $('#refundModal').modal();
- });
-
- $("#transactionsAction").click(function() {
- resetMessages();
- listTransactions('<c:out value="${order.order.id}"/>');
- });
-
- $("#sendInvoiceAction").click(function() {
- resetMessages();
- $('.sm').showLoading();
- sendInvoice('<c:out value="${order.order.id}"/>');
- });
-
- $("#updateStatusAction").click(function() {
- resetMessages();
- $('.sm').showLoading();
- updateStatus('<c:out value="${order.order.id}"/>');
- });
-
- $("#updateDownloadsAction").click(function() {
- resetMessages();
- $('.sm').showLoading();
- sendDownloadEmail('<c:out value="${order.order.id}"/>');
- });
-
- $("#captureAction").click(function() {
- resetMessages();
- $('#captureAction').addClass('disabled');
- $('.sm').showLoading();
- captureOrder('<c:out value="${order.order.id}"/>');
- });
-
- $(".close-modal").click(function() {
- location.href="<c:url value="/admin/orders/editOrder.html" />?id=<c:out value="${order.order.id}"/>";
- });
-
- $(".billing-country-list").change(function() {
- getZones('#billingZoneList','#billingZoneText',$(this).val(),'<c:out value="${order.billing.zone.code}" />');
- })
-
-
- <c:if test="${order.billing.state!=null && order.billing.state!=''}">
- $('#billingZoneList').hide();
- $('#billingZoneText').show();
- $('#billingZoneText').val('<c:out value="${order.billing.state}"/>');
- </c:if>
-
- <c:if test="${order.billing.state==null || order.billing.state==''}">
- $('#billingZoneList').show();
- $('#billingZoneText').hide();
- getZones('#billingZoneList','#billingZoneText','<c:out value="${order.billing.country.isoCode}" />','<c:out value="${order.billing.zone.code}" />');
- </c:if>
-
- <c:if test="${order.delivery.state!=null && order.delivery.state!=''}">
- $('#shippingZoneList').hide();
- $('#shippingZoneText').show();
- $('#shippingZoneText').val('<c:out value="${order.delivery.state}"/>');
- </c:if>
- <c:if test="${order.delivery.state==null || order.delivery.state==''}">
- $('#shippingZoneList').show();
- $('#shippingZoneText').hide();
- getZones('#shippingZoneList','#shippingZoneText','<c:out value="${order.delivery.country.isoCode}" />','<c:out value="${order.delivery.zone.code}" />');
- </c:if>
-
-
-
- });
-
-
- $(function() {
-
- $("#refund").submit(function() {
- $('#refundButton').addClass('disabled');
- $('#refundModal').showLoading();
- var data = $(this).serializeObject();
- $.ajax({
- 'type': 'POST',
- 'url': "<c:url value="/admin/orders/refundOrder.html"/>",
- 'contentType': 'application/json',
- 'data': JSON.stringify(data),
- 'dataType': 'json',
- 'success': function(result) {
- $('#refundModal').hideLoading();
- var response = result.response;
- var status = response.status;
- if(status==0 || status ==9999) {
- //window.location='<c:url value="/admin/orders/editOrder.html" />?id=<c:out value="${order.order.id}" />';
- $(".alert-success-modal").show();
- //$(".close-modal").show();
- } else {
- $(".alert-error-modal").html(response.statusMessage);
- $(".alert-error-modal").show();
- }
- $('#refundButton').removeClass('disabled');
- }
- });
-
- return false;
- });
- });
-
- $.fn.serializeObject = function() {
- var o = {};
- var a = this.serializeArray();
- $.each(a, function() {
- if (o[this.name]) {
- if (!o[this.name].push) {
- o[this.name] = [o[this.name]];
- }
- o[this.name].push(this.value || '');
- } else {
- o[this.name] = this.value || '';
- }
- });
- return o;
- };
-</script>
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="order-section">
-
- <div class="sm-ui-component">
-
-
- <h3>
- <div class="control-group">
- <div class="controls">
- <s:message code="label.order.id2" text="Order ID"/>
- <c:out value="${order.order.id}" /> - <span class="lead"><s:message code="label.order.${order.order.status.value}" text="${order.order.status.value}" /></span>
- <br>
- </div>
- </div>
- </h3>
- <br/>
- <br/>
- <div class="btn-group" style="z-index:400000;">
- <button class="btn btn-info dropdown-toggle" data-toggle="dropdown"><s:message code="label.generic.moreoptions" text="More options"/> ... <span class="caret"></span></button>
- <ul class="dropdown-menu">
- <li><a id="transactionsAction" href="#"><s:message code="label.order.transactions" text="Transactions list"/></a></li>
- <li><a id="sendInvoiceAction" href="#"><s:message code="label.order.sendinvoice" text="Send email invoice"/></a></li>
- <li><a id="updateStatusAction" href="#"><s:message code="label.order.updatestatus" text="Send order status email"/></a></li>
- <li>
- <c:if test="${downloads!=null}">
- <a id="updateDownloadsAction" href="#"><s:message code="label.order.downloademail" text="Send download email"/></a>
- </c:if>
- </li>
-
- <!--<li><a href="<c:url value="/admin/orders/printInvoice.html?id=${order.id}" />"><s:message code="label.order.printinvoice" text="Print invoice"/></a></li>-->
- <!-- available soon <li><a href="<c:url value="/admin/orders/printShippingLabel.html?id=${order.id}" />"><s:message code="label.order.packing" text="Print packing slip"/></a></li>-->
- <li>
- <c:if test="${customer!=null}">
- <a href="<c:url value="/admin/customers/customer.html?id=${customer.id}"/>"><s:message code="label.order.editcustomer" text="Edit customer"/></a>
- </c:if>
- </li>
- </ul>
-
- <c:if test="${order.order.total>0}">
- <c:if test="${capturableTransaction!=null}">
- <a id="captureAction" class="btn btn-primary btn-block" href="#"><s:message code="label.order.capture" text="Capture transaction"/></a>
- </c:if>
- <c:if test="${refundableTransaction!=null}">
- <a id="refundAction" class="btn btn-danger btn-block" href="#"><s:message code="label.order.refund" text="Apply refund"/></a>
- </c:if>
- </c:if>
-
- </div><!-- /btn-group -->
- <br/>
-
- <c:url var="orderSave" value="/admin/orders/save.html"/>
- <form:form method="POST" enctype="multipart/form-data" commandName="order" action="${orderSave}">
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
- <div id="store.error" class="alert alert-error" style="display:none;"><s:message code="message.error" text="An error occured"/></div>
-
- <form:hidden path="order.id" />
- <form:hidden path="order.customerId" />
-
- <div class="span8">
-
- <div class="span4" style="margin-left:0px;">
-
- <h6> <s:message code="label.customer.billinginformation" text="Billing information"/> </h6>
- <address>
-
- <label><s:message code="label.customer.firstname" text="First Name"/></label>
- <div class="controls">
-
- <form:input id="customerFirstName" cssClass="input-large highlight" path="order.billing.firstName"/>
- <span class="help-inline">
- <form:errors path="order.billing.firstName" cssClass="error" /></span>
- </div>
-
- <label><s:message code="label.customer.lastname" text="Last Name"/></label>
- <div class="controls">
- <form:input id="customerLastName" cssClass="input-large highlight" path="order.billing.lastName"/>
- <span class="help-inline"><form:errors path="order.billing.lastName" cssClass="error" /></span>
- </div>
-
-
- <address>
-
- <label><s:message code="label.customer.billing.streetaddress" text="Billing address"/></label>
- <div class="controls">
- <form:input id="billingAdress" cssClass="input-large highlight" path="order.billing.address"/>
- <span class="help-inline"><form:errors path="order.billing.address" cssClass="error" /></span>
- </div>
- <label><s:message code="label.customer.billing.city" text="Billing city"/></label>
- <div class="controls">
- <form:input id="billingCity" cssClass="input-large highlight" path="order.billing.city"/>
- <span class="help-inline"><form:errors path="order.billing.city" cssClass="error" /></span>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.customer.billing.zone" text="State / Province"/></label>
- <div class="controls">
- <form:select id="billingZoneList" cssClass="billing-zone-list" path="order.billing.zone.code"/>
- <form:input class="input-large highlight" id="billingZoneText" maxlength="100" name="billingZoneText" path="order.billing.state" />
- <span class="help-inline"><form:errors path="order.billing.zone.code" cssClass="error" /></span>
- </div>
- </div>
-
- <label><s:message code="label.customer.billing.country" text="Country"/></label>
- <div class="controls">
- <form:select cssClass="billing-country-list" path="order.billing.country.isoCode">
- <form:options items="${countries}" itemValue="isoCode" itemLabel="name"/>
- </form:select>
- </div>
- <label><s:message code="label.customer.billing.postalcode" text="Billing postal code"/></label>
- <div class="controls">
- <form:input id="billingPostalCode" cssClass="input-large highlight" path="order.billing.postalCode"/>
- <span class="help-inline"><form:errors path="order.billing.postalCode" cssClass="error" /></span>
- </div>
- <label><s:message code="label.customer.telephone" text="Customer phone"/></label>
- <div class="controls">
- <form:input id="phoneNumber" cssClass="input-large highlight" path="order.billing.telephone"/>
- <span class="help-inline"><form:errors path="order.billing.telephone" cssClass="error" /></span>
- </div>
- </address>
-
-
- <label><s:message code="label.customer.email" text="Email"/></label>
- <div class="controls">
- <form:input id="customerEmailAddress" cssClass="input-large highlight" path="order.customerEmailAddress"/>
- <span class="help-inline"><form:errors path="order.customerEmailAddress" cssClass="error" /></span>
- </div>
-
- </div>
-
- <div span="4">
-
-
- <h6><s:message code="label.customer.shippinginformation" text="Shipping information"/></h6>
- <address>
- <label><s:message code="label.customer.shipping.firstName" text="Shipping first name"/></label>
- <div class="controls">
- <form:input cssClass="input-large" path="order.delivery.firstName"/>
- </div>
- <label><s:message code="label.customer.shipping.lastName" text="Shipping last name"/></label>
- <div class="controls">
- <form:input cssClass="input-large" path="order.delivery.lastName"/>
- </div>
- <label><s:message code="label.customer.shipping.streetaddress" text="Shipping address"/></label>
- <div class="controls">
- <form:input cssClass="input-large" path="order.delivery.address"/>
- </div>
- <label><s:message code="label.customer.shipping.city" text="Shipping city"/></label>
- <div class="controls">
- <form:input cssClass="input-large" path="order.delivery.city"/>
- </div>
-
-
- <div class="control-group">
- <label><s:message code="label.customer.shipping.zone" text="State / Province"/></label>
- <div class="controls">
- <form:select id="shippingZoneList" cssClass="shiiping-zone-list" path="order.delivery.zone.code"/>
- <form:input class="input-large highlight" id="shippingZoneText" maxlength="100" name="shippingZoneText" path="order.delivery.state" />
- <span class="help-inline"><form:errors path="order.delivery.zone.code" cssClass="error" /></span>
- </div>
- </div>
-
- <label><s:message code="label.customer.shipping.country" text="Country"/></label>
- <div class="controls">
- <form:select cssClass="country-list" path="order.delivery.country.isoCode">
- <form:options items="${countries}" itemValue="isoCode" itemLabel="name"/>
- </form:select>
- </div>
- <label><s:message code="label.customer.shipping.postalcode" text="Postal code"/></label>
- <div class="controls">
- <form:input cssClass="input-large" path="order.delivery.postalCode"/>
- </div>
- </address>
-
-
- </div>
-
- </div>
-
- <div class="span8">
- <s:message code="label.customer.order.date" text="Order date"/>
- <div class="controls">
- <form:input cssClass="input-large" path="datePurchased" class="small" type="text"
- data-date-format="<%=com.salesmanager.core.business.constants.Constants.DEFAULT_DATE_FORMAT%>" />
- <script type="text/javascript">
- $('#datePurchased').datepicker();
- </script>
- <span class="help-inline"><form:errors path="datePurchased" cssClass="error" /></span>
- </div>
-
-
- <label><s:message code="label.customer.order.agreement.title" text="Terms and conditions"/>: <strong><c:out value="${order.order.customerAgreement}"/></strong></label>
-
- <br/><br/>
- <label><s:message code="label.order.paymentmode" text="Payment mode"/></label>
- <div class="controls">
- <strong><c:out value="${order.order.paymentType}"/> - <c:out value="${order.order.paymentModuleCode}"/></strong>
- <c:if test="${order.order.paymentType=='CREDITCARD' && order.order.creditCard!=null}">
- <br/><c:out value="${order.order.creditCard.cardType}"/> - <c:out value="${order.order.creditCard.ccNumber}"/>
- </c:if>
- <br/><br/>
- </div>
-
- <c:if test="${order.order.shippingModuleCode!=null}">
- <label><s:message code="label.order.shippingmethod" text="Shipping method"/></label>
- <div class="controls">
- <strong><c:out value="${order.order.shippingModuleCode}"/></strong><form:hidden path="order.shippingModuleCode"/>
- </div>
- </c:if>
-
- </dl>
-
-
-
- </div>
-
-
-
-
- <div class="span8" style="margin-top:20px;">
- <table class="table table-bordered table-striped">
- <thead>
- <tr>
- <th colspan="2" width="55%"><s:message code="label.order.item" text="Item"/></th>
- <th colspan="1" width="15%"><s:message code="label.quantity" text="Quantity"/></th>
- <th width="15%"><s:message code="label.order.price" text="Price"/></th>
- <th width="15%"><s:message code="label.order.total" text="Total"/></th>
- </tr>
- </thead>
-
- <tbody>
- <c:forEach items="${order.order.orderProducts}" var="orderProduct" varStatus="counter">
- <c:set var="total" value="${orderProduct.oneTimeCharge * orderProduct.productQuantity }" />
-
- <tr>
- <td colspan="2">
- <c:out value="${orderProduct.productName}" /> - <a href="<c:url value="/admin/products/viewEditProduct.html?sku=${orderProduct.sku}"/>"><c:out value="${orderProduct.sku}" /></a>
- <c:if test="${fn:length(orderProduct.orderAttributes)>0}">
- <br/>
- <ul>
- <c:forEach items="${orderProduct.orderAttributes}" var="attribute">
- <li>${attribute.productAttributeName} - ${attribute.productAttributeValueName}</li>
- </c:forEach>
- </ul>
- </c:if>
- </td>
- <td ><c:out value="${orderProduct.productQuantity}" /></td>
- <td><strong><sm:monetary value="${orderProduct.oneTimeCharge}" currency="${order.order.currency}"/></strong> </td>
- <td><strong><sm:monetary value="${total}" currency="${order.order.currency}"/></strong></td>
- </tr>
-
- </c:forEach>
-
- <c:forEach items="${order.order.orderTotal}" var="orderTotal" varStatus="counter">
- <tr class="subt">
- <td colspan="2"> </td>
- <td colspan="2" ><c:if test="${orderTotal.orderTotalCode=='refund'}"><font color="red"></c:if><s:message code="${orderTotal.orderTotalCode}" text="${orderTotal.orderTotalCode}"/><c:if test="${orderTotal.orderTotalCode=='refund'}"></font></c:if></td>
- <td ><strong><c:if test="${orderTotal.orderTotalCode=='refund'}"><font color="red"></c:if><sm:monetary value="${orderTotal.value}" currency="${order.order.currency}"/><c:if test="${orderTotal.orderTotalCode=='refund'}"></font></c:if></strong></td>
- </tr>
- </c:forEach>
- </tbody>
- </table>
- </div>
-
- <br/>
- <div class="span8">
- <div class="control-group">
- <label><s:message code="label.entity.status" text="Status"/></label>
- <div class="controls">
- <form:select path="order.status">
- <form:options items="${orderStatusList}" />
- </form:select>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.order.history" text="History"/></label>
- <div class="controls">
- <dl class="dl-horizontal">
- <c:forEach items="${order.order.orderHistory}" var="orderHistory" varStatus="counter">
- <c:if test="${orderHistory.comments!=null}">
- <dd><fmt:formatDate type="both" dateStyle="long" value="${orderHistory.dateAdded}" /> - <c:out value="${orderHistory.comments}"/>
- </c:if>
- </c:forEach>
- </dl>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.entity.status" text="Status"/></label>
- <div class="controls">
- <form:textarea cols="10" rows="3" path="orderHistoryComment"/>
- </div>
- </div>
-
- <div class="form-actions">
- <button type="submit" class="btn btn-medium btn-primary" ><s:message code="button.label.save" text="Save"/></button>
- </div>
- </div>
- <br/>
-
- </div>
-
- </form:form>
-
- </div>
- </div>
- </div>
-
-
-
-
-<div id="transactionsModal" class="modal hide" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="width:900px;z-index:500000;">
- <div class="modal-header">
- <button type="button" class="close close-modal" data-dismiss="modal" aria-hidden="true">X</button>
- <h3 id="myModalLabel"><s:message code="label.order.transactions" text="List of transactions" /></h3>
- </div>
- <div class="modal-body">
- <p>
- <table class="table table-hover" style="font-size:10px;">
- <thead>
- <tr>
- <th><s:message code="label.entity.id" text="Id" /></th>
- <th><s:message code="label.generic.date" text="Date" /></th>
- <th><s:message code="label.entity.type" text="Type" /></th>
- <th><s:message code="label.entity.amount" text="Amount" /></th>
- <th><s:message code="label.entity.details" text="Details" /></th>
- </tr>
- </thead>
- <tbody id="transactionList">
- </tbody>
- </table>
- </p>
-
- </div>
- <div class="modal-footer">
- <button class="btn btn-primary" id="closeModal" data-dismiss="modal" aria-hidden="true"><s:message code="button.label.close" text="Close" /></button>
- </div>
-</div>
-
-<div id="refundModal" class="modal hide" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="z-index:500000;">
- <div class="modal-header">
- <button type="button" class="close close-modal" data-dismiss="modal" aria-hidden="true">X</button>
- <h3 id="myModalLabel"><s:message code="label.order.refund" text="Apply refund"/> -
- <s:message code="label.order.id2" text="Order ID"/>
- <c:out value="${order.order.id}" />
- </h3>
- </div>
- <div class="modal-body">
-
- <div id="store.success" class="alert alert-success alert-success-modal" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
- <div id="store.error" class="alert alert-error alert-error-modal" style="display:none;"><s:message code="message.error" text="An error occured"/></div>
-
- <p>
- <s:message code="label.order.total" text="Total" />: <strong><c:out value="${order.order.total}"/></strong>
- <span id="refundMessage" style="display:none;"><s:message code="" text=""/><span id="refundAmount"></span></span>
- </p>
- <p>
- <form id="refund" class="form-inline">
- <label><s:message code="label.generic.amount" text="Amount" /></label> <input type="text" id="amount" name="amount" class="input-small" placeholder="<s:message code="label.generic.amount" text="Amount" />">
- <input name="orderId" id="orderId" type="hidden" value="<c:out value="${order.id}"/>">
- <button id="refundButton" type="submit" class="btn btn-danger"><s:message code="label.order.refund" text="Apply refund"/></button>
- </form>
-
- </p>
-
- </div>
- <div class="modal-footer">
- <button class="btn btn-primary close-modal" id="closeModal" data-dismiss="modal" aria-hidden="true"><s:message code="button.label.close" text="Close" /></button>
- </div>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+<%@ page session="false" %>
+
+
+<link href="<c:url value="/resources/css/bootstrap/css/datepicker.css" />" rel="stylesheet"></link>
+<script src="<c:url value="/resources/js/bootstrap/bootstrap-datepicker.js" />"></script>
+<script src="<c:url value="/resources/js/ckeditor/ckeditor.js" />"></script>
+<script src="<c:url value="/resources/js/jquery.formatCurrency-1.4.0.js" />"></script>
+<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
+<script src="<c:url value="/resources/js/json2.js" />"></script>
+<script src="<c:url value="/resources/js/adminFunctions.js" />"></script>
+
+<script src="<c:url value="/resources/js/jquery.showLoading.min.js" />"></script>
+<link href="<c:url value="/resources/css/showLoading.css" />" rel="stylesheet">
+
+<script>
+
+function displayErrorMessage(message) {
+
+}
+
+
+function getZones(listDiv, textDiv, countryCode, defaultValue){
+ $.ajax({
+ type: 'POST',
+ url: '<c:url value="/shop/reference/provinces.html"/>',
+ data: 'countryCode=' + countryCode + '&lang=${requestScope.LANGUAGE.code}',
+ dataType: 'json',
+ success: function(response){
+ var status = response.response.status;
+ var data = response.response.data;
+ //console.log(status);
+ if((status==0 || status ==9999) && data) {
+ //console.log(data);
+ if(data && data.length>0) {
+ $(listDiv).show();
+ $(textDiv).hide();
+ $(listDiv).addItems(listDiv, data, defaultValue);
+ } else {
+ $(listDiv).hide();
+ $(textDiv).show();
+ if(defaultValue!=null || defaultValue !='') {
+ $(textDiv).val(defaultValue);
+ }
+ }
+ } else {
+ $(listDiv).hide();
+ $(textDiv).show();
+ }
+ },
+ error: function(xhr, textStatus, errorThrown) {
+ alert('error ' + errorThrown);
+ $('.sm').hideLoading();
+ }
+
+ });
+
+}
+
+
+$.fn.addItems = function(div, data, defaultValue) {
+ //console.log('Populating div ' + div + ' defaultValue ' + defaultValue);
+ var selector = div + ' > option';
+ var defaultExist = false;
+ $(selector).remove();
+ return this.each(function() {
+ var list = this;
+ $.each(data, function(index, itemData) {
+ //console.log(itemData.code + ' ' + defaultValue);
+ if(itemData.code==defaultValue) {
+ defaultExist = true;
+ }
+ var option = new Option(itemData.name, itemData.code);
+ list.add(option);
+ });
+ if(defaultExist && (defaultValue!=null && defaultValue!='')) {
+ $(div).val(defaultValue);
+ }
+ });
+};
+
+function listTransactions(orderId){
+
+ $.ajax({
+ type: 'GET',
+ url: '<c:url value="/admin/orders/listTransactions.html"/>?id=' + orderId,
+ dataType: 'json',
+ success: function(response){
+ var status = response.response.status;
+ var data = response.response.data;
+ console.log(status);
+ if((status==0 || status ==9999) && data) {
+ //console.log(data);
+ $('#transactionsModal').modal();
+ var transactions = data;
+ //console.log(transactions);
+ for(i=0;i<transactions.length;i++) {
+ var tr = '<tr><td>' + transactions[i].transactionId + '</td><td>' + transactions[i].transactionDate + '</td><td>' + transactions[i].transactionType + '</td><td>' + transactions[i].transactionAmount + '</td><td>' + JSON.stringify(transactions[i].transactionDetails) + '</td>';
+ $('#transactionList').append(tr);
+ }
+ }
+ },
+ error: function(xhr, textStatus, errorThrown) {
+ alert('error ' + errorThrown);
+ $('.sm').hideLoading();
+ }
+
+ });
+}
+
+function sendInvoice(orderId){
+
+ $.ajax({
+ type: 'GET',
+ url: '<c:url value="/admin/orders/sendInvoice.html"/>?id=' + orderId,
+ dataType: 'json',
+ success: function(response){
+ var status = response.response.status;
+ var data = response.response.data;
+ //console.log(status);
+ if(status==0 || status ==9999) {
+ $(".alert-success").show();
+ } else {
+ $(".alert-error").show();
+ }
+ $('.sm').hideLoading();
+ },
+ error: function(xhr, textStatus, errorThrown) {
+ alert('error ' + errorThrown);
+ $('.sm').hideLoading();
+ }
+
+ });
+}
+
+function updateStatus(orderId){
+
+ $.ajax({
+ type: 'GET',
+ url: '<c:url value="/admin/orders/updateStatus.html"/>?id=' + orderId,
+ dataType: 'json',
+ success: function(response){
+ var status = response.response.status;
+ var data = response.response.data;
+ //console.log(status);
+ if(status==0 || status ==9999) {
+ $(".alert-success").show();
+ } else {
+ $(".alert-error").show();
+ }
+ $('.sm').hideLoading();
+ },
+ error: function(xhr, textStatus, errorThrown) {
+ alert('error ' + errorThrown);
+ $('.sm').hideLoading();
+ }
+
+ });
+}
+
+function resetMessages() {
+ $(".alert-error").hide();
+ $(".alert-success").hide();
+}
+
+
+function sendDownloadEmail(orderId){
+
+ $.ajax({
+ type: 'GET',
+ url: '<c:url value="/admin/orders/sendDownloadEmail.html"/>?id=' + orderId,
+ dataType: 'json',
+ success: function(response){
+ var status = response.response.status;
+ var data = response.response.data;
+ //console.log(status);
+ if(status==0 || status ==9999) {
+ $(".alert-success").show();
+ } else {
+ $(".alert-error").show();
+ }
+ $('.sm').hideLoading();
+ },
+ error: function(xhr, textStatus, errorThrown) {
+ alert('error ' + errorThrown);
+ $('.sm').hideLoading();
+ }
+
+ });
+}
+
+function captureOrder(orderId){
+ $.ajax({
+ type: 'POST',
+ url: '<c:url value="/admin/orders/captureOrder.html"/>?id=' + orderId,
+ dataType: 'json',
+ success: function(response){
+ var status = response.response.status;
+ var data = response.response.data;
+ //console.log(status);
+ if(status==0 || status ==9999) {
+ $(".alert-success").show();
+ window.location='<c:url value="/admin/orders/editOrder.html" />?id=' + orderId;
+ } else {
+ $(".alert-error").show();
+ }
+ $('.sm').hideLoading();
+ $('#captureAction').removeClass('disabled');
+ },
+ error: function(xhr, textStatus, errorThrown) {
+ alert('error ' + errorThrown);
+ $('.sm').hideLoading();
+ }
+
+ });
+}
+
+ $(document).ready(function(){
+
+ $("#refundAction").click(function() {
+ resetMessages();
+ $('#refundModal').modal();
+ });
+
+ $("#transactionsAction").click(function() {
+ resetMessages();
+ listTransactions('<c:out value="${order.order.id}"/>');
+ });
+
+ $("#sendInvoiceAction").click(function() {
+ resetMessages();
+ $('.sm').showLoading();
+ sendInvoice('<c:out value="${order.order.id}"/>');
+ });
+
+ $("#updateStatusAction").click(function() {
+ resetMessages();
+ $('.sm').showLoading();
+ updateStatus('<c:out value="${order.order.id}"/>');
+ });
+
+ $("#updateDownloadsAction").click(function() {
+ resetMessages();
+ $('.sm').showLoading();
+ sendDownloadEmail('<c:out value="${order.order.id}"/>');
+ });
+
+ $("#captureAction").click(function() {
+ resetMessages();
+ $('#captureAction').addClass('disabled');
+ $('.sm').showLoading();
+ captureOrder('<c:out value="${order.order.id}"/>');
+ });
+
+ $(".close-modal").click(function() {
+ location.href="<c:url value="/admin/orders/editOrder.html" />?id=<c:out value="${order.order.id}"/>";
+ });
+
+ $(".billing-country-list").change(function() {
+ getZones('#billingZoneList','#billingZoneText',$(this).val(),'<c:out value="${order.billing.zone.code}" />');
+ })
+
+
+ <c:if test="${order.billing.state!=null && order.billing.state!=''}">
+ $('#billingZoneList').hide();
+ $('#billingZoneText').show();
+ $('#billingZoneText').val('<c:out value="${order.billing.state}"/>');
+ </c:if>
+
+ <c:if test="${order.billing.state==null || order.billing.state==''}">
+ $('#billingZoneList').show();
+ $('#billingZoneText').hide();
+ getZones('#billingZoneList','#billingZoneText','<c:out value="${order.billing.country.isoCode}" />','<c:out value="${order.billing.zone.code}" />');
+ </c:if>
+
+ <c:if test="${order.delivery.state!=null && order.delivery.state!=''}">
+ $('#shippingZoneList').hide();
+ $('#shippingZoneText').show();
+ $('#shippingZoneText').val('<c:out value="${order.delivery.state}"/>');
+ </c:if>
+ <c:if test="${order.delivery.state==null || order.delivery.state==''}">
+ $('#shippingZoneList').show();
+ $('#shippingZoneText').hide();
+ getZones('#shippingZoneList','#shippingZoneText','<c:out value="${order.delivery.country.isoCode}" />','<c:out value="${order.delivery.zone.code}" />');
+ </c:if>
+
+
+
+ });
+
+
+ $(function() {
+
+ $("#refund").submit(function() {
+ $('#refundButton').addClass('disabled');
+ $('#refundModal').showLoading();
+ var data = $(this).serializeObject();
+ $.ajax({
+ 'type': 'POST',
+ 'url': "<c:url value="/admin/orders/refundOrder.html"/>",
+ 'contentType': 'application/json',
+ 'data': JSON.stringify(data),
+ 'dataType': 'json',
+ 'success': function(result) {
+ $('#refundModal').hideLoading();
+ var response = result.response;
+ var status = response.status;
+ if(status==0 || status ==9999) {
+ //window.location='<c:url value="/admin/orders/editOrder.html" />?id=<c:out value="${order.order.id}" />';
+ $(".alert-success-modal").show();
+ //$(".close-modal").show();
+ } else {
+ $(".alert-error-modal").html(response.statusMessage);
+ $(".alert-error-modal").show();
+ }
+ $('#refundButton').removeClass('disabled');
+ }
+ });
+
+ return false;
+ });
+ });
+
+ $.fn.serializeObject = function() {
+ var o = {};
+ var a = this.serializeArray();
+ $.each(a, function() {
+ if (o[this.name]) {
+ if (!o[this.name].push) {
+ o[this.name] = [o[this.name]];
+ }
+ o[this.name].push(this.value || '');
+ } else {
+ o[this.name] = this.value || '';
+ }
+ });
+ return o;
+ };
+</script>
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="order-section">
+
+ <div class="sm-ui-component">
+
+
+ <h3>
+ <div class="control-group">
+ <div class="controls">
+ <s:message code="label.order.id2" text="Order ID"/>
+ <c:out value="${order.order.id}" /> - <span class="lead"><s:message code="label.order.${order.order.status.value}" text="${order.order.status.value}" /></span>
+ <br>
+ </div>
+ </div>
+ </h3>
+ <br/>
+ <br/>
+ <div class="btn-group" style="z-index:400000;">
+ <button class="btn btn-info dropdown-toggle" data-toggle="dropdown"><s:message code="label.generic.moreoptions" text="More options"/> ... <span class="caret"></span></button>
+ <ul class="dropdown-menu">
+ <li><a id="transactionsAction" href="#"><s:message code="label.order.transactions" text="Transactions list"/></a></li>
+ <li><a id="sendInvoiceAction" href="#"><s:message code="label.order.sendinvoice" text="Send email invoice"/></a></li>
+ <li><a id="updateStatusAction" href="#"><s:message code="label.order.updatestatus" text="Send order status email"/></a></li>
+ <li>
+ <c:if test="${downloads!=null}">
+ <a id="updateDownloadsAction" href="#"><s:message code="label.order.downloademail" text="Send download email"/></a>
+ </c:if>
+ </li>
+
+ <!--<li><a href="<c:url value="/admin/orders/printInvoice.html?id=${order.id}" />"><s:message code="label.order.printinvoice" text="Print invoice"/></a></li>-->
+ <!-- available soon <li><a href="<c:url value="/admin/orders/printShippingLabel.html?id=${order.id}" />"><s:message code="label.order.packing" text="Print packing slip"/></a></li>-->
+ <li>
+ <c:if test="${customer!=null}">
+ <a href="<c:url value="/admin/customers/customer.html?id=${customer.id}"/>"><s:message code="label.order.editcustomer" text="Edit customer"/></a>
+ </c:if>
+ </li>
+ </ul>
+
+ <c:if test="${order.order.total>0}">
+ <c:if test="${capturableTransaction!=null}">
+ <a id="captureAction" class="btn btn-primary btn-block" href="#"><s:message code="label.order.capture" text="Capture transaction"/></a>
+ </c:if>
+ <c:if test="${refundableTransaction!=null}">
+ <a id="refundAction" class="btn btn-danger btn-block" href="#"><s:message code="label.order.refund" text="Apply refund"/></a>
+ </c:if>
+ </c:if>
+
+ </div><!-- /btn-group -->
+ <br/>
+
+ <c:url var="orderSave" value="/admin/orders/save.html"/>
+ <form:form method="POST" enctype="multipart/form-data" commandName="order" action="${orderSave}">
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+ <div id="store.error" class="alert alert-error" style="display:none;"><s:message code="message.error" text="An error occured"/></div>
+
+ <form:hidden path="order.id" />
+ <form:hidden path="order.customerId" />
+
+ <div class="span8">
+
+ <div class="span4" style="margin-left:0px;">
+
+ <h6> <s:message code="label.customer.billinginformation" text="Billing information"/> </h6>
+ <address>
+
+ <label><s:message code="label.customer.firstname" text="First Name"/></label>
+ <div class="controls">
+
+ <form:input id="customerFirstName" cssClass="input-large highlight" path="order.billing.firstName"/>
+ <span class="help-inline">
+ <form:errors path="order.billing.firstName" cssClass="error" /></span>
+ </div>
+
+ <label><s:message code="label.customer.lastname" text="Last Name"/></label>
+ <div class="controls">
+ <form:input id="customerLastName" cssClass="input-large highlight" path="order.billing.lastName"/>
+ <span class="help-inline"><form:errors path="order.billing.lastName" cssClass="error" /></span>
+ </div>
+
+
+ <address>
+
+ <label><s:message code="label.customer.billing.streetaddress" text="Billing address"/></label>
+ <div class="controls">
+ <form:input id="billingAdress" cssClass="input-large highlight" path="order.billing.address"/>
+ <span class="help-inline"><form:errors path="order.billing.address" cssClass="error" /></span>
+ </div>
+ <label><s:message code="label.customer.billing.city" text="Billing city"/></label>
+ <div class="controls">
+ <form:input id="billingCity" cssClass="input-large highlight" path="order.billing.city"/>
+ <span class="help-inline"><form:errors path="order.billing.city" cssClass="error" /></span>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.customer.billing.zone" text="State / Province"/></label>
+ <div class="controls">
+ <form:select id="billingZoneList" cssClass="billing-zone-list" path="order.billing.zone.code"/>
+ <form:input class="input-large highlight" id="billingZoneText" maxlength="100" name="billingZoneText" path="order.billing.state" />
+ <span class="help-inline"><form:errors path="order.billing.zone.code" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <label><s:message code="label.customer.billing.country" text="Country"/></label>
+ <div class="controls">
+ <form:select cssClass="billing-country-list" path="order.billing.country.isoCode">
+ <form:options items="${countries}" itemValue="isoCode" itemLabel="name"/>
+ </form:select>
+ </div>
+ <label><s:message code="label.customer.billing.postalcode" text="Billing postal code"/></label>
+ <div class="controls">
+ <form:input id="billingPostalCode" cssClass="input-large highlight" path="order.billing.postalCode"/>
+ <span class="help-inline"><form:errors path="order.billing.postalCode" cssClass="error" /></span>
+ </div>
+ <label><s:message code="label.customer.telephone" text="Customer phone"/></label>
+ <div class="controls">
+ <form:input id="phoneNumber" cssClass="input-large highlight" path="order.billing.telephone"/>
+ <span class="help-inline"><form:errors path="order.billing.telephone" cssClass="error" /></span>
+ </div>
+ </address>
+
+
+ <label><s:message code="label.customer.email" text="Email"/></label>
+ <div class="controls">
+ <form:input id="customerEmailAddress" cssClass="input-large highlight" path="order.customerEmailAddress"/>
+ <span class="help-inline"><form:errors path="order.customerEmailAddress" cssClass="error" /></span>
+ </div>
+
+ </div>
+
+ <div span="4">
+
+
+ <h6><s:message code="label.customer.shippinginformation" text="Shipping information"/></h6>
+ <address>
+ <label><s:message code="label.customer.shipping.firstName" text="Shipping first name"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large" path="order.delivery.firstName"/>
+ </div>
+ <label><s:message code="label.customer.shipping.lastName" text="Shipping last name"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large" path="order.delivery.lastName"/>
+ </div>
+ <label><s:message code="label.customer.shipping.streetaddress" text="Shipping address"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large" path="order.delivery.address"/>
+ </div>
+ <label><s:message code="label.customer.shipping.city" text="Shipping city"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large" path="order.delivery.city"/>
+ </div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.customer.shipping.zone" text="State / Province"/></label>
+ <div class="controls">
+ <form:select id="shippingZoneList" cssClass="shiiping-zone-list" path="order.delivery.zone.code"/>
+ <form:input class="input-large highlight" id="shippingZoneText" maxlength="100" name="shippingZoneText" path="order.delivery.state" />
+ <span class="help-inline"><form:errors path="order.delivery.zone.code" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <label><s:message code="label.customer.shipping.country" text="Country"/></label>
+ <div class="controls">
+ <form:select cssClass="country-list" path="order.delivery.country.isoCode">
+ <form:options items="${countries}" itemValue="isoCode" itemLabel="name"/>
+ </form:select>
+ </div>
+ <label><s:message code="label.customer.shipping.postalcode" text="Postal code"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large" path="order.delivery.postalCode"/>
+ </div>
+ </address>
+
+
+ </div>
+
+ </div>
+
+ <div class="span8">
+ <s:message code="label.customer.order.date" text="Order date"/>
+ <div class="controls">
+ <form:input cssClass="input-large" path="datePurchased" class="small" type="text"
+ data-date-format="<%=com.salesmanager.core.business.constants.Constants.DEFAULT_DATE_FORMAT%>" />
+ <script type="text/javascript">
+ $('#datePurchased').datepicker();
+ </script>
+ <span class="help-inline"><form:errors path="datePurchased" cssClass="error" /></span>
+ </div>
+
+
+ <label><s:message code="label.customer.order.agreement.title" text="Terms and conditions"/>: <strong><c:out value="${order.order.customerAgreement}"/></strong></label>
+
+ <br/><br/>
+ <label><s:message code="label.order.paymentmode" text="Payment mode"/></label>
+ <div class="controls">
+ <strong><c:out value="${order.order.paymentType}"/> - <c:out value="${order.order.paymentModuleCode}"/></strong>
+ <c:if test="${order.order.paymentType=='CREDITCARD' && order.order.creditCard!=null}">
+ <br/><c:out value="${order.order.creditCard.cardType}"/> - <c:out value="${order.order.creditCard.ccNumber}"/>
+ </c:if>
+ <br/><br/>
+ </div>
+
+ <c:if test="${order.order.shippingModuleCode!=null}">
+ <label><s:message code="label.order.shippingmethod" text="Shipping method"/></label>
+ <div class="controls">
+ <strong><c:out value="${order.order.shippingModuleCode}"/></strong><form:hidden path="order.shippingModuleCode"/>
+ </div>
+ </c:if>
+
+ </dl>
+
+
+
+ </div>
+
+
+
+
+ <div class="span8" style="margin-top:20px;">
+ <table class="table table-bordered table-striped">
+ <thead>
+ <tr>
+ <th colspan="2" width="55%"><s:message code="label.order.item" text="Item"/></th>
+ <th colspan="1" width="15%"><s:message code="label.quantity" text="Quantity"/></th>
+ <th width="15%"><s:message code="label.order.price" text="Price"/></th>
+ <th width="15%"><s:message code="label.order.total" text="Total"/></th>
+ </tr>
+ </thead>
+
+ <tbody>
+ <c:forEach items="${order.order.orderProducts}" var="orderProduct" varStatus="counter">
+ <c:set var="total" value="${orderProduct.oneTimeCharge * orderProduct.productQuantity }" />
+
+ <tr>
+ <td colspan="2">
+ <c:out value="${orderProduct.productName}" /> - <a href="<c:url value="/admin/products/viewEditProduct.html?sku=${orderProduct.sku}"/>"><c:out value="${orderProduct.sku}" /></a>
+ <c:if test="${fn:length(orderProduct.orderAttributes)>0}">
+ <br/>
+ <ul>
+ <c:forEach items="${orderProduct.orderAttributes}" var="attribute">
+ <li>${attribute.productAttributeName} - ${attribute.productAttributeValueName}</li>
+ </c:forEach>
+ </ul>
+ </c:if>
+ </td>
+ <td ><c:out value="${orderProduct.productQuantity}" /></td>
+ <td><strong><sm:monetary value="${orderProduct.oneTimeCharge}" currency="${order.order.currency}"/></strong> </td>
+ <td><strong><sm:monetary value="${total}" currency="${order.order.currency}"/></strong></td>
+ </tr>
+
+ </c:forEach>
+
+ <c:forEach items="${order.order.orderTotal}" var="orderTotal" varStatus="counter">
+ <tr class="subt">
+ <td colspan="2"> </td>
+ <td colspan="2" ><c:if test="${orderTotal.orderTotalCode=='refund'}"><font color="red"></c:if><s:message code="${orderTotal.orderTotalCode}" text="${orderTotal.orderTotalCode}"/><c:if test="${orderTotal.orderTotalCode=='refund'}"></font></c:if></td>
+ <td ><strong><c:if test="${orderTotal.orderTotalCode=='refund'}"><font color="red"></c:if><sm:monetary value="${orderTotal.value}" currency="${order.order.currency}"/><c:if test="${orderTotal.orderTotalCode=='refund'}"></font></c:if></strong></td>
+ </tr>
+ </c:forEach>
+ </tbody>
+ </table>
+ </div>
+
+ <br/>
+ <div class="span8">
+ <div class="control-group">
+ <label><s:message code="label.entity.status" text="Status"/></label>
+ <div class="controls">
+ <form:select path="order.status">
+ <form:options items="${orderStatusList}" />
+ </form:select>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.order.history" text="History"/></label>
+ <div class="controls">
+ <dl class="dl-horizontal">
+ <c:forEach items="${order.order.orderHistory}" var="orderHistory" varStatus="counter">
+ <c:if test="${orderHistory.comments!=null}">
+ <dd><fmt:formatDate type="both" dateStyle="long" value="${orderHistory.dateAdded}" /> - <c:out value="${orderHistory.comments}"/>
+ </c:if>
+ </c:forEach>
+ </dl>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.entity.status" text="Status"/></label>
+ <div class="controls">
+ <form:textarea cols="10" rows="3" path="orderHistoryComment"/>
+ </div>
+ </div>
+
+ <div class="form-actions">
+ <button type="submit" class="btn btn-medium btn-primary" ><s:message code="button.label.save" text="Save"/></button>
+ </div>
+ </div>
+ <br/>
+
+ </div>
+
+ </form:form>
+
+ </div>
+ </div>
+ </div>
+
+
+
+
+<div id="transactionsModal" class="modal hide" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="width:900px;z-index:500000;">
+ <div class="modal-header">
+ <button type="button" class="close close-modal" data-dismiss="modal" aria-hidden="true">X</button>
+ <h3 id="myModalLabel"><s:message code="label.order.transactions" text="List of transactions" /></h3>
+ </div>
+ <div class="modal-body">
+ <p>
+ <table class="table table-hover" style="font-size:10px;">
+ <thead>
+ <tr>
+ <th><s:message code="label.entity.id" text="Id" /></th>
+ <th><s:message code="label.generic.date" text="Date" /></th>
+ <th><s:message code="label.entity.type" text="Type" /></th>
+ <th><s:message code="label.entity.amount" text="Amount" /></th>
+ <th><s:message code="label.entity.details" text="Details" /></th>
+ </tr>
+ </thead>
+ <tbody id="transactionList">
+ </tbody>
+ </table>
+ </p>
+
+ </div>
+ <div class="modal-footer">
+ <button class="btn btn-primary" id="closeModal" data-dismiss="modal" aria-hidden="true"><s:message code="button.label.close" text="Close" /></button>
+ </div>
+</div>
+
+<div id="refundModal" class="modal hide" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="z-index:500000;">
+ <div class="modal-header">
+ <button type="button" class="close close-modal" data-dismiss="modal" aria-hidden="true">X</button>
+ <h3 id="myModalLabel"><s:message code="label.order.refund" text="Apply refund"/> -
+ <s:message code="label.order.id2" text="Order ID"/>
+ <c:out value="${order.order.id}" />
+ </h3>
+ </div>
+ <div class="modal-body">
+
+ <div id="store.success" class="alert alert-success alert-success-modal" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+ <div id="store.error" class="alert alert-error alert-error-modal" style="display:none;"><s:message code="message.error" text="An error occured"/></div>
+
+ <p>
+ <s:message code="label.order.total" text="Total" />: <strong><c:out value="${order.order.total}"/></strong>
+ <span id="refundMessage" style="display:none;"><s:message code="" text=""/><span id="refundAmount"></span></span>
+ </p>
+ <p>
+ <form id="refund" class="form-inline">
+ <label><s:message code="label.generic.amount" text="Amount" /></label> <input type="text" id="amount" name="amount" class="input-small" placeholder="<s:message code="label.generic.amount" text="Amount" />">
+ <input name="orderId" id="orderId" type="hidden" value="<c:out value="${order.id}"/>">
+ <button id="refundButton" type="submit" class="btn btn-danger"><s:message code="label.order.refund" text="Apply refund"/></button>
+ </form>
+
+ </p>
+
+ </div>
+ <div class="modal-footer">
+ <button class="btn btn-primary close-modal" id="closeModal" data-dismiss="modal" aria-hidden="true"><s:message code="button.label.close" text="Close" /></button>
+ </div>
</div
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/orders/orders.jsp b/sm-shop/src/main/webapp/pages/admin/orders/orders.jsp
index 28ddebd..e8d5cd2 100644
--- a/sm-shop/src/main/webapp/pages/admin/orders/orders.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/orders/orders.jsp
@@ -1,59 +1,59 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
- <div class="sm-ui-component">
- <h3><s:message code="label.order.title" text="Orders" /></h3>
- <br/>
-
-
-
-
- <!-- Listing grid include -->
- <c:set value="/admin/orders/paging.html" var="pagingUrl" scope="request"/>
- <c:set value="/admin/orders/remove.html" var="removeUrl" scope="request"/>
- <c:set value="/admin/orders/editOrder.html" var="editUrl" scope="request"/>
- <c:set value="/admin/orders/list.html" var="afterRemoveUrl" scope="request"/>
- <c:set var="entityId" value="orderId" scope="request"/>
- <c:set var="componentTitleKey" value="label.order.title" scope="request"/>
- <c:set var="gridHeader" value="/pages/admin/orders/orders-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="false" scope="request"/>
-
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+ <div class="sm-ui-component">
+ <h3><s:message code="label.order.title" text="Orders" /></h3>
+ <br/>
+
+
+
+
+ <!-- Listing grid include -->
+ <c:set value="/admin/orders/paging.html" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/orders/remove.html" var="removeUrl" scope="request"/>
+ <c:set value="/admin/orders/editOrder.html" var="editUrl" scope="request"/>
+ <c:set value="/admin/orders/list.html" var="afterRemoveUrl" scope="request"/>
+ <c:set var="entityId" value="orderId" scope="request"/>
+ <c:set var="componentTitleKey" value="label.order.title" scope="request"/>
+ <c:set var="gridHeader" value="/pages/admin/orders/orders-gridHeader.jsp" scope="request"/>
+ <c:set var="canRemoveEntry" value="false" scope="request"/>
+
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/orders/orders-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/orders/orders-gridHeader.jsp
index 94864f2..1e4332e 100644
--- a/sm-shop/src/main/webapp/pages/admin/orders/orders-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/orders/orders-gridHeader.jsp
@@ -1,16 +1,16 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
- {title:"<s:message code="label.entity.id" text="Id"/>", name:"orderId", canFilter:false},
- {title:"<s:message code="label.customer.name" text="Customer name"/>", name:"customer"},
- {title:"<s:message code="label.order.total" text="Total"/>", name:"amount", canFilter:false},
- {title:"<s:message code="label.order.date" text="Date"/>", name:"date", canFilter:false},
- {title:"<s:message code="label.entity.status" text="Status"/>", name:"status", canFilter:false},
- {title:"<s:message code="label.order.module" text="Payment module"/>", name:"paymentModule"},
- {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+ {title:"<s:message code="label.entity.id" text="Id"/>", name:"orderId", canFilter:false},
+ {title:"<s:message code="label.customer.name" text="Customer name"/>", name:"customer"},
+ {title:"<s:message code="label.order.total" text="Total"/>", name:"amount", canFilter:false},
+ {title:"<s:message code="label.order.date" text="Date"/>", name:"date", canFilter:false},
+ {title:"<s:message code="label.entity.status" text="Status"/>", name:"status", canFilter:false},
+ {title:"<s:message code="label.order.module" text="Payment module"/>", name:"paymentModule"},
+ {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
+
diff --git a/sm-shop/src/main/webapp/pages/admin/orders/transactions.jsp b/sm-shop/src/main/webapp/pages/admin/orders/transactions.jsp
index a895d63..4baf1f8 100644
--- a/sm-shop/src/main/webapp/pages/admin/orders/transactions.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/orders/transactions.jsp
@@ -1,54 +1,54 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-<%@ page session="false" %>
-
-
-<link href="<c:url value="/resources/css/bootstrap/css/datepicker.css" />" rel="stylesheet"></link>
-<script src="<c:url value="/resources/js/bootstrap/bootstrap-datepicker.js" />"></script>
-<script src="<c:url value="/resources/js/ckeditor/ckeditor.js" />"></script>
-<script src="<c:url value="/resources/js/jquery.formatCurrency-1.4.0.js" />"></script>
-<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
-<script src="<c:url value="/resources/js/adminFunctions.js" />"></script>
-
-<script src="<c:url value="/resources/js/jquery.showLoading.min.js" />"></script>
-<link href="<c:url value="/resources/css/showLoading.css" />" rel="stylesheet">
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="order-section">
-
- <div class="sm-ui-component">
-
-
- <h3>
- <div class="control-group">
- <div class="controls">
- Transactions - <s:message code="label.order.id2" text="Order ID"/>
- <c:out value="${order.order.id}" /><br>
- </div>
- </div>
- </div>
-
-
- </h3>
- <br/>
- <br/>
-
- </div>
- </div>
- </div>
-
-</div>
-
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+<%@ page session="false" %>
+
+
+<link href="<c:url value="/resources/css/bootstrap/css/datepicker.css" />" rel="stylesheet"></link>
+<script src="<c:url value="/resources/js/bootstrap/bootstrap-datepicker.js" />"></script>
+<script src="<c:url value="/resources/js/ckeditor/ckeditor.js" />"></script>
+<script src="<c:url value="/resources/js/jquery.formatCurrency-1.4.0.js" />"></script>
+<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
+<script src="<c:url value="/resources/js/adminFunctions.js" />"></script>
+
+<script src="<c:url value="/resources/js/jquery.showLoading.min.js" />"></script>
+<link href="<c:url value="/resources/css/showLoading.css" />" rel="stylesheet">
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="order-section">
+
+ <div class="sm-ui-component">
+
+
+ <h3>
+ <div class="control-group">
+ <div class="controls">
+ Transactions - <s:message code="label.order.id2" text="Order ID"/>
+ <c:out value="${order.order.id}" /><br>
+ </div>
+ </div>
+ </div>
+
+
+ </h3>
+ <br/>
+ <br/>
+
+ </div>
+ </div>
+ </div>
+
+</div>
+
+
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/payment/beanstream.jsp b/sm-shop/src/main/webapp/pages/admin/payment/beanstream.jsp
index b0773a5..007cea1 100644
--- a/sm-shop/src/main/webapp/pages/admin/payment/beanstream.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/payment/beanstream.jsp
@@ -1,55 +1,55 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
-
- <div class="control-group">
- <label class="required"><s:message code="module.payment.beanstream.merchantid" text="Merchant id"/></label>
- <div class="controls">
- <form:input cssClass="input-large highlight" path="integrationKeys['merchantid']" />
- </div>
- <span class="help-inline">
- <c:if test="${merchantid!=null}">
- <span id="identifiererrors" class="error"><s:message code="module.payment.beanstream.message.merchantid" text="Field in error"/></span>
- </c:if>
- </span>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="module.payment.beanstream.username" text="Username"/></label>
- <div class="controls">
- <form:input cssClass="input-large highlight" path="integrationKeys['username']" />
- </div>
- <span class="help-inline">
- <c:if test="${username!=null}">
- <span id="usernameerrors" class="error"><s:message code="module.payment.beanstream.message.username" text="Field in error"/></span>
- </c:if>
- </span>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="module.payment.beanstream.password" text="Password"/></label>
- <div class="controls">
- <form:password cssClass="input-large highlight" path="integrationKeys['password']" />
- </div>
- <span class="help-inline">
- <c:if test="${password!=null}">
- <span id="passworderrors" class="error"><s:message code="module.payment.beanstream.message.password" text="Field in error"/></span>
- </c:if>
- </span>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="module.payment.transactiontype" text="Transaction type"/></label>
- <div class="controls">
- <form:radiobutton cssClass="input-large highlight" path="integrationKeys['transaction']" value="AUTHORIZE" /> <s:message code="module.payment.transactiontype.preauth" text="Pre-authorization" /><br/>
- <form:radiobutton cssClass="input-large highlight" path="integrationKeys['transaction']" value="AUTHORIZECAPTURE" /> <s:message code="module.payment.transactiontype.sale" text="Sale" /></br>
- </div>
- </div>
-
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.payment.beanstream.merchantid" text="Merchant id"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" path="integrationKeys['merchantid']" />
+ </div>
+ <span class="help-inline">
+ <c:if test="${merchantid!=null}">
+ <span id="identifiererrors" class="error"><s:message code="module.payment.beanstream.message.merchantid" text="Field in error"/></span>
+ </c:if>
+ </span>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.payment.beanstream.username" text="Username"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" path="integrationKeys['username']" />
+ </div>
+ <span class="help-inline">
+ <c:if test="${username!=null}">
+ <span id="usernameerrors" class="error"><s:message code="module.payment.beanstream.message.username" text="Field in error"/></span>
+ </c:if>
+ </span>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.payment.beanstream.password" text="Password"/></label>
+ <div class="controls">
+ <form:password cssClass="input-large highlight" path="integrationKeys['password']" />
+ </div>
+ <span class="help-inline">
+ <c:if test="${password!=null}">
+ <span id="passworderrors" class="error"><s:message code="module.payment.beanstream.message.password" text="Field in error"/></span>
+ </c:if>
+ </span>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.payment.transactiontype" text="Transaction type"/></label>
+ <div class="controls">
+ <form:radiobutton cssClass="input-large highlight" path="integrationKeys['transaction']" value="AUTHORIZE" /> <s:message code="module.payment.transactiontype.preauth" text="Pre-authorization" /><br/>
+ <form:radiobutton cssClass="input-large highlight" path="integrationKeys['transaction']" value="AUTHORIZECAPTURE" /> <s:message code="module.payment.transactiontype.sale" text="Sale" /></br>
+ </div>
+ </div>
+
+
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/payment/braintree.jsp b/sm-shop/src/main/webapp/pages/admin/payment/braintree.jsp
new file mode 100644
index 0000000..eded76a
--- /dev/null
+++ b/sm-shop/src/main/webapp/pages/admin/payment/braintree.jsp
@@ -0,0 +1,69 @@
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.payment.braintree.merchantId" text="Merchant ID"/></label>
+ <div class="controls">
+ <form:input cssClass="input-xxlarge highlight" path="integrationKeys['merchant_id']" />
+ </div>
+ <span class="help-inline">
+ <c:if test="${merchant_id!=null}">
+ <span id="identifiererrors" class="error"><s:message code="module.payment.braintree.message.merchant_id" text="Field in error"/></span>
+ </c:if>
+ </span>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.payment.braintree.publicKey" text="Public key"/></label>
+ <div class="controls">
+ <form:input cssClass="input-xxlarge highlight" path="integrationKeys['public_key']" />
+ </div>
+ <span class="help-inline">
+ <c:if test="${public_key!=null}">
+ <span id="apikeyerrors" class="error"><s:message code="module.payment.braintree.message.public_key" text="Field in error"/></span>
+ </c:if>
+ </span>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.payment.braintree.privateKey" text="Private key"/></label>
+ <div class="controls">
+ <form:input cssClass="input-xxlarge highlight" path="integrationKeys['private_key']" />
+ </div>
+ <span class="help-inline">
+ <c:if test="${private_key!=null}">
+ <span id="apikeyerrors" class="error"><s:message code="module.payment.braintree.message.private_key" text="Field in error"/></span>
+ </c:if>
+ </span>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.payment.braintree.tokenizationKey" text="Tokenization key"/></label>
+ <div class="controls">
+ <form:input cssClass="input-xxlarge highlight" path="integrationKeys['tokenization_key']" />
+ </div>
+ <span class="help-inline">
+ <c:if test="${private_key!=null}">
+ <span id="apikeyerrors" class="error"><s:message code="module.payment.braintree.message.tokenization_key" text="Field in error"/></span>
+ </c:if>
+ </span>
+ </div>
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.payment.transactiontype" text="Transaction type"/></label>
+ <div class="controls">
+ <form:radiobutton cssClass="input-large highlight" path="integrationKeys['transaction']" value="AUTHORIZE" /> <s:message code="module.payment.transactiontype.preauth" text="Pre-authorization" /><br/>
+ <form:radiobutton cssClass="input-large highlight" path="integrationKeys['transaction']" value="AUTHORIZECAPTURE" /> <s:message code="module.payment.transactiontype.sale" text="Sale" /></br>
+ </div>
+ </div>
+
+
+
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/payment/moneyorder.jsp b/sm-shop/src/main/webapp/pages/admin/payment/moneyorder.jsp
index 74d5aa8..0a9aecc 100644
--- a/sm-shop/src/main/webapp/pages/admin/payment/moneyorder.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/payment/moneyorder.jsp
@@ -1,65 +1,65 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-<script src="<c:url value="/resources/js/ckeditor/ckeditor.js" />"></script>
-
-
-
-
- <div class="control-group">
- <label class="required"><strong><s:message code="module.payment.moneyorder.adress" text="Cheque must be made to this address"/></strong></label>
- <div class="controls">
- <span class="help-inline">
- <c:if test="${address!=null}">
- <span id="identifiererrors" class="error"><s:message code="module.payment.moneyorder.message.address" text="Field in error"/></span>
- </c:if>
- </span>
- <br/>
-
- <textarea cols="30" id="integrationKeys['address']" name="integrationKeys['address']">
- <c:out value="${configuration.integrationKeys['address']}"/>
- </textarea>
-
- <script type="text/javascript">
- //<![CDATA[
-
- CKEDITOR.replace("integrationKeys['address']",
- {
- skin : 'office2003',
- toolbar :
- [
- ['Source','-','Save','NewPage','Preview'],
- ['Cut','Copy','Paste','PasteText','-','Print'],
- ['Undo','Redo','-','Find','-','SelectAll','RemoveFormat'], '/',
- ['Bold','Italic','Underline','Strike','-','Subscript','Superscript'],
- ['NumberedList','BulletedList','-','Outdent','Indent','Blockquote'],
- ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
- ['Link','Unlink','Anchor'],
- ['Image','Flash','Table','HorizontalRule','SpecialChar','PageBreak'], '/',
- ['Styles','Format','Font','FontSize'], ['TextColor','BGColor'],
- ['Maximize', 'ShowBlocks']
- ],
-
- filebrowserWindowWidth : '720',
- filebrowserWindowHeight : '740',
- filebrowserImageBrowseUrl : '<c:url value="/admin/content/fileBrowser.html"/>'
-
-
- });
-
- //]]>
- </script>
-
-
- </div>
-
- </div>
-
-
-
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+<script src="<c:url value="/resources/js/ckeditor/ckeditor.js" />"></script>
+
+
+
+
+ <div class="control-group">
+ <label class="required"><strong><s:message code="module.payment.moneyorder.adress" text="Cheque must be made to this address"/></strong></label>
+ <div class="controls">
+ <span class="help-inline">
+ <c:if test="${address!=null}">
+ <span id="identifiererrors" class="error"><s:message code="module.payment.moneyorder.message.address" text="Field in error"/></span>
+ </c:if>
+ </span>
+ <br/>
+
+ <textarea cols="30" id="integrationKeys['address']" name="integrationKeys['address']">
+ <c:out value="${configuration.integrationKeys['address']}"/>
+ </textarea>
+
+ <script type="text/javascript">
+ //<![CDATA[
+
+ CKEDITOR.replace("integrationKeys['address']",
+ {
+ skin : 'office2003',
+ toolbar :
+ [
+ ['Source','-','Save','NewPage','Preview'],
+ ['Cut','Copy','Paste','PasteText','-','Print'],
+ ['Undo','Redo','-','Find','-','SelectAll','RemoveFormat'], '/',
+ ['Bold','Italic','Underline','Strike','-','Subscript','Superscript'],
+ ['NumberedList','BulletedList','-','Outdent','Indent','Blockquote'],
+ ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
+ ['Link','Unlink','Anchor'],
+ ['Image','Flash','Table','HorizontalRule','SpecialChar','PageBreak'], '/',
+ ['Styles','Format','Font','FontSize'], ['TextColor','BGColor'],
+ ['Maximize', 'ShowBlocks']
+ ],
+
+ filebrowserWindowWidth : '720',
+ filebrowserWindowHeight : '740',
+ filebrowserImageBrowseUrl : '<c:url value="/admin/content/fileBrowser.html"/>'
+
+
+ });
+
+ //]]>
+ </script>
+
+
+ </div>
+
+ </div>
+
+
+
+
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/payment/paymentMethod.jsp b/sm-shop/src/main/webapp/pages/admin/payment/paymentMethod.jsp
index 49a0295..977d714 100644
--- a/sm-shop/src/main/webapp/pages/admin/payment/paymentMethod.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/payment/paymentMethod.jsp
@@ -1,122 +1,122 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-<script>
-
-
-
-</script>
-
-
-<div class="tabbable">
-
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
-
- <div class="tab-pane active" id="payment-method">
-
-
- <div class="sm-ui-component">
- <h3><s:message code="label.payment.module.title" text="Payment method" /> - <s:message code="module.payment.${configuration.moduleCode}" text="No label found - ${configuration.moduleCode}"/></h3>
- <br/>
-
-
-
-
- <p><s:message code="module.payment.${configuration.moduleCode}.note" text=""/></p><br/>
-
- <c:url var="savePaymentMethod" value="/admin/payments/savePaymentMethod.html"/>
-
-
- <form:form method="POST" commandName="configuration" action="${savePaymentMethod}">
-
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
-
- <div class="control-group">
- <label><s:message code="label.entity.enabled" text="Module enabled"/></label>
- <div class="controls">
- <form:checkbox path="active" />
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.generic.default" text="Default"/></label>
- <div class="controls">
- <form:checkbox path="defaultSelected" />
- </div>
- </div>
-
- <div class="controls">
- <label><s:message code="label.generic.environment" text="Environment"/></label>
- <div class="controls">
- <form:select path="environment">
- <form:options items="${environments}" />
- </form:select>
- </div>
- <span class="help-inline"><form:errors path="environment" cssClass="error" /></span>
- </div>
-
-
- <c:if test="${customConfiguration==null}">
- <jsp:include page="/pages/admin/payment/${configuration.moduleCode}.jsp"></jsp:include>
- </c:if>
-
-
- <form:hidden path="moduleCode" />
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
- </div>
- </div>
-
-
- </form:form>
-
-
-
- <c:if test="${customConfiguration!=null}">
- <jsp:include page="/pages/admin/payments/${configuration.moduleCode}.jsp"></jsp:include>
- </c:if>
-
-
- <c:if test="${configuration.active && validationError==null}">
- <c:url var="removeModule" value="/admin/payments/deletePaymentMethod.html"/>
- <form:form method="POST" enctype="multipart/form-data" commandName="code" action="${removeModule}">
- <input type="hidden" name="code" value="${configuration.moduleCode}" />
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn-danger"><i class="icon-trash icon-large"></i><s:message code="label.generic.remove" text="Remove"/></button>
- </div>
- </div>
-
- </form:form>
- </c:if>
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+<script>
+
+
+
+</script>
+
+
+<div class="tabbable">
+
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+
+ <div class="tab-pane active" id="payment-method">
+
+
+ <div class="sm-ui-component">
+ <h3><s:message code="label.payment.module.title" text="Payment method" /> - <s:message code="module.payment.${configuration.moduleCode}" text="No label found - ${configuration.moduleCode}"/></h3>
+ <br/>
+
+
+
+
+ <p><s:message code="module.payment.${configuration.moduleCode}.note" text=""/></p><br/>
+
+ <c:url var="savePaymentMethod" value="/admin/payments/savePaymentMethod.html"/>
+
+
+ <form:form method="POST" commandName="configuration" action="${savePaymentMethod}">
+
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.entity.enabled" text="Module enabled"/></label>
+ <div class="controls">
+ <form:checkbox path="active" />
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.generic.default" text="Default"/></label>
+ <div class="controls">
+ <form:checkbox path="defaultSelected" />
+ </div>
+ </div>
+
+ <div class="controls">
+ <label><s:message code="label.generic.environment" text="Environment"/></label>
+ <div class="controls">
+ <form:select path="environment">
+ <form:options items="${environments}" />
+ </form:select>
+ </div>
+ <span class="help-inline"><form:errors path="environment" cssClass="error" /></span>
+ </div>
+
+
+ <c:if test="${customConfiguration==null}">
+ <jsp:include page="/pages/admin/payment/${configuration.moduleCode}.jsp"></jsp:include>
+ </c:if>
+
+
+ <form:hidden path="moduleCode" />
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
+ </div>
+ </div>
+
+
+ </form:form>
+
+
+
+ <c:if test="${customConfiguration!=null}">
+ <jsp:include page="/pages/admin/payments/${configuration.moduleCode}.jsp"></jsp:include>
+ </c:if>
+
+
+ <c:if test="${configuration.active && validationError==null}">
+ <c:url var="removeModule" value="/admin/payments/deletePaymentMethod.html"/>
+ <form:form method="POST" enctype="multipart/form-data" commandName="code" action="${removeModule}">
+ <input type="hidden" name="code" value="${configuration.moduleCode}" />
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn-danger"><i class="icon-trash icon-large"></i><s:message code="label.generic.remove" text="Remove"/></button>
+ </div>
+ </div>
+
+ </form:form>
+ </c:if>
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/payment/paymentMethods.jsp b/sm-shop/src/main/webapp/pages/admin/payment/paymentMethods.jsp
index c991e18..6c5b1d2 100644
--- a/sm-shop/src/main/webapp/pages/admin/payment/paymentMethods.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/payment/paymentMethods.jsp
@@ -1,107 +1,107 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-<script>
-
-
-
-</script>
-
-
-<div class="tabbable">
-
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
-
- <div class="tab-pane active" id="payment-methods">
-
-
- <div class="sm-ui-component">
- <h3><s:message code="label.payment.title" text="Payment configuration" /></h3>
- <br/>
-
-
-
-
-
-
- <c:url var="savePaymentMethods" value="/admin/payments/savePaymentMethods.html"/>
- <form:form method="POST" commandName="configuration" action="${savePaymentMethods}">
-
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
-
- <div class="control-group">
- <table class="table table-hover">
-
- <c:forEach items="${modules}" var="module">
-
-
- <tr>
- <td>
- <c:choose>
- <c:when test="${configuredModules[module.code]!=null && configuredModules[module.code].active==true}">
- <img src="<c:url value="/resources/img/icon_green_on.gif"/>" width="12">
- </c:when>
- <c:otherwise>
- <img src="<c:url value="/resources/img/icon_red_on.gif"/>" width="12">
- </c:otherwise>
- </c:choose>
- </td>
- <td>
- <label>
- <c:choose>
- <c:when test="${module.customModule==true}">
- <a href="<c:url value="/admin/payments/${module.code}.html"/>"><s:message code="module.payment.${module.code}" text="No label found - ${module.code}"/></a>
- </c:when>
- <c:otherwise>
- <a href="<c:url value="/admin/payments/paymentMethod.html?code="/><c:out value="${module.code}"/>"><s:message code="module.payment.${module.code}" text="No label found - ${module.code}"/></a>
- </c:otherwise>
- </c:choose>
- </label>
- </td>
- <td>
- <c:if test="${module.image!=null}">
- <img src="<c:url value="/resources/img/payment/${module.image}"/>">
- </c:if>
- </td>
- </tr>
-
-
- </c:forEach>
- </table>
-
- </div>
-
- </form:form>
-
-
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+<script>
+
+
+
+</script>
+
+
+<div class="tabbable">
+
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+
+ <div class="tab-pane active" id="payment-methods">
+
+
+ <div class="sm-ui-component">
+ <h3><s:message code="label.payment.title" text="Payment configuration" /></h3>
+ <br/>
+
+
+
+
+
+
+ <c:url var="savePaymentMethods" value="/admin/payments/savePaymentMethods.html"/>
+ <form:form method="POST" commandName="configuration" action="${savePaymentMethods}">
+
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+
+ <div class="control-group">
+ <table class="table table-hover">
+
+ <c:forEach items="${modules}" var="module">
+
+
+ <tr>
+ <td>
+ <c:choose>
+ <c:when test="${configuredModules[module.code]!=null && configuredModules[module.code].active==true}">
+ <img src="<c:url value="/resources/img/icon_green_on.gif"/>" width="12">
+ </c:when>
+ <c:otherwise>
+ <img src="<c:url value="/resources/img/icon_red_on.gif"/>" width="12">
+ </c:otherwise>
+ </c:choose>
+ </td>
+ <td>
+ <label>
+ <c:choose>
+ <c:when test="${module.customModule==true}">
+ <a href="<c:url value="/admin/payments/${module.code}.html"/>"><s:message code="module.payment.${module.code}" text="No label found - ${module.code}"/></a>
+ </c:when>
+ <c:otherwise>
+ <a href="<c:url value="/admin/payments/paymentMethod.html?code="/><c:out value="${module.code}"/>"><s:message code="module.payment.${module.code}" text="No label found - ${module.code}"/></a>
+ </c:otherwise>
+ </c:choose>
+ </label>
+ </td>
+ <td>
+ <c:if test="${module.image!=null}">
+ <img src="<c:url value="/resources/img/payment/${module.image}"/>">
+ </c:if>
+ </td>
+ </tr>
+
+
+ </c:forEach>
+ </table>
+
+ </div>
+
+ </form:form>
+
+
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/payment/paypal.jsp b/sm-shop/src/main/webapp/pages/admin/payment/paypal.jsp
index 2021b0b..9cc6aed 100644
--- a/sm-shop/src/main/webapp/pages/admin/payment/paypal.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/payment/paypal.jsp
@@ -1,44 +1,44 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
-
- <div class="control-group">
- <label class="required"><s:message code="module.payment.paypal.clientId" text="Paypal client id"/></label>
- <div class="controls">
- <form:input cssClass="input-xxlarge highlight" path="integrationKeys['client']" />
- </div>
- <span class="help-inline">
- <c:if test="${client!=null}">
- <span id="identifiererrors" class="error"><s:message code="module.payment.paypal.message.clientId" text="Field in error"/></span>
- </c:if>
- </span>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="module.payment.paypal.secret" text="PayPal Secret"/></label>
- <div class="controls">
- <form:input cssClass="input-xxlarge highlight" path="integrationKeys['secret']" />
- </div>
- <span class="help-inline">
- <c:if test="${secret!=null}">
- <span id="apikeyerrors" class="error"><s:message code="module.payment.paypal.message.secret" text="Field in error"/></span>
- </c:if>
- </span>
- </div>
-
-
- <div class="control-group">
- <label class="required"><s:message code="module.payment.transactiontype" text="Transaction type"/></label>
- <div class="controls">
- <form:radiobutton cssClass="input-large highlight" path="integrationKeys['transaction']" value="AUTHORIZE" /> <s:message code="module.payment.transactiontype.preauth" text="Pre-authorization" /><br/>
- <form:radiobutton cssClass="input-large highlight" path="integrationKeys['transaction']" value="AUTHORIZECAPTURE" /> <s:message code="module.payment.transactiontype.sale" text="Sale" /></br>
- </div>
- </div>
-
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.payment.paypal.clientId" text="Paypal client id"/></label>
+ <div class="controls">
+ <form:input cssClass="input-xxlarge highlight" path="integrationKeys['client']" />
+ </div>
+ <span class="help-inline">
+ <c:if test="${client!=null}">
+ <span id="identifiererrors" class="error"><s:message code="module.payment.paypal.message.clientId" text="Field in error"/></span>
+ </c:if>
+ </span>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.payment.paypal.secret" text="PayPal Secret"/></label>
+ <div class="controls">
+ <form:input cssClass="input-xxlarge highlight" path="integrationKeys['secret']" />
+ </div>
+ <span class="help-inline">
+ <c:if test="${secret!=null}">
+ <span id="apikeyerrors" class="error"><s:message code="module.payment.paypal.message.secret" text="Field in error"/></span>
+ </c:if>
+ </span>
+ </div>
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.payment.transactiontype" text="Transaction type"/></label>
+ <div class="controls">
+ <form:radiobutton cssClass="input-large highlight" path="integrationKeys['transaction']" value="AUTHORIZE" /> <s:message code="module.payment.transactiontype.preauth" text="Pre-authorization" /><br/>
+ <form:radiobutton cssClass="input-large highlight" path="integrationKeys['transaction']" value="AUTHORIZECAPTURE" /> <s:message code="module.payment.transactiontype.sale" text="Sale" /></br>
+ </div>
+ </div>
+
+
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/payment/paypal-express-checkout.jsp b/sm-shop/src/main/webapp/pages/admin/payment/paypal-express-checkout.jsp
index e1f630e..6cbc400 100644
--- a/sm-shop/src/main/webapp/pages/admin/payment/paypal-express-checkout.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/payment/paypal-express-checkout.jsp
@@ -1,55 +1,55 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
-
- <div class="control-group">
- <label class="required"><s:message code="module.payment.paypal-express-checkout.userid" text="Paypal API user name"/></label>
- <div class="controls">
- <form:input cssClass="input-large highlight" path="integrationKeys['username']" />
- </div>
- <span class="help-inline">
- <c:if test="${username!=null}">
- <span id="identifiererrors" class="error"><s:message code="module.payment.paypal.message.identifier" text="Field in error"/></span>
- </c:if>
- </span>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="module.payment.paypal-express-checkout.apikey" text="Paypal API password"/></label>
- <div class="controls">
- <form:input cssClass="input-large highlight" path="integrationKeys['api']" />
- </div>
- <span class="help-inline">
- <c:if test="${api!=null}">
- <span id="apikeyerrors" class="error"><s:message code="module.payment.paypal.message.api" text="Field in error"/></span>
- </c:if>
- </span>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="module.payment.paypal-express-checkout.signature" text="Paypal API signature"/></label>
- <div class="controls">
- <form:input cssClass="input-large highlight" path="integrationKeys['signature']" />
- </div>
- <span class="help-inline">
- <c:if test="${signature!=null}">
- <span id="apisignatureerrors" class="error"><s:message code="module.payment.paypal.message.signature" text="Field in error"/></span>
- </c:if>
- </span>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="module.payment.transactiontype" text="Transaction type"/></label>
- <div class="controls">
- <form:radiobutton cssClass="input-large highlight" path="integrationKeys['transaction']" value="AUTHORIZE" /> <s:message code="module.payment.transactiontype.preauth" text="Pre-authorization" /><br/>
- <form:radiobutton cssClass="input-large highlight" path="integrationKeys['transaction']" value="AUTHORIZECAPTURE" /> <s:message code="module.payment.transactiontype.sale" text="Sale" /></br>
- </div>
- </div>
-
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.payment.paypal-express-checkout.userid" text="Paypal API user name"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" path="integrationKeys['username']" />
+ </div>
+ <span class="help-inline">
+ <c:if test="${username!=null}">
+ <span id="identifiererrors" class="error"><s:message code="module.payment.paypal.message.identifier" text="Field in error"/></span>
+ </c:if>
+ </span>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.payment.paypal-express-checkout.apikey" text="Paypal API password"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" path="integrationKeys['api']" />
+ </div>
+ <span class="help-inline">
+ <c:if test="${api!=null}">
+ <span id="apikeyerrors" class="error"><s:message code="module.payment.paypal.message.api" text="Field in error"/></span>
+ </c:if>
+ </span>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.payment.paypal-express-checkout.signature" text="Paypal API signature"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" path="integrationKeys['signature']" />
+ </div>
+ <span class="help-inline">
+ <c:if test="${signature!=null}">
+ <span id="apisignatureerrors" class="error"><s:message code="module.payment.paypal.message.signature" text="Field in error"/></span>
+ </c:if>
+ </span>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.payment.transactiontype" text="Transaction type"/></label>
+ <div class="controls">
+ <form:radiobutton cssClass="input-large highlight" path="integrationKeys['transaction']" value="AUTHORIZE" /> <s:message code="module.payment.transactiontype.preauth" text="Pre-authorization" /><br/>
+ <form:radiobutton cssClass="input-large highlight" path="integrationKeys['transaction']" value="AUTHORIZECAPTURE" /> <s:message code="module.payment.transactiontype.sale" text="Sale" /></br>
+ </div>
+ </div>
+
+
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/payment/stripe.jsp b/sm-shop/src/main/webapp/pages/admin/payment/stripe.jsp
index c1b0f73..c43fa7d 100644
--- a/sm-shop/src/main/webapp/pages/admin/payment/stripe.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/payment/stripe.jsp
@@ -1,45 +1,45 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
-
-
- <div class="control-group">
- <label class="required"><s:message code="module.payment.stripe.secretKey" text="Secret key"/></label>
- <div class="controls">
- <form:input cssClass="input-xxlarge highlight" path="integrationKeys['secretKey']" />
- </div>
- <span class="help-inline">
- <c:if test="${secretKey!=null}">
- <span id="identifiererrors" class="error"><s:message code="module.payment.stripe.message.secretKey" text="Field in error"/></span>
- </c:if>
- </span>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="module.payment.stripe.publishableKey" text="Publishable key"/></label>
- <div class="controls">
- <form:input cssClass="input-xxlarge highlight" path="integrationKeys['publishableKey']" />
- </div>
- <span class="help-inline">
- <c:if test="${publishableKey!=null}">
- <span id="apikeyerrors" class="error"><s:message code="module.payment.stripe.message.publishableKey" text="Field in error"/></span>
- </c:if>
- </span>
- </div>
-
-
- <div class="control-group">
- <label class="required"><s:message code="module.payment.transactiontype" text="Transaction type"/></label>
- <div class="controls">
- <form:radiobutton cssClass="input-large highlight" path="integrationKeys['transaction']" value="AUTHORIZE" /> <s:message code="module.payment.transactiontype.preauth" text="Pre-authorization" /><br/>
- <form:radiobutton cssClass="input-large highlight" path="integrationKeys['transaction']" value="AUTHORIZECAPTURE" /> <s:message code="module.payment.transactiontype.sale" text="Sale" /></br>
- </div>
- </div>
-
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.payment.stripe.secretKey" text="Secret key"/></label>
+ <div class="controls">
+ <form:input cssClass="input-xxlarge highlight" path="integrationKeys['secretKey']" />
+ </div>
+ <span class="help-inline">
+ <c:if test="${secretKey!=null}">
+ <span id="identifiererrors" class="error"><s:message code="module.payment.stripe.message.secretKey" text="Field in error"/></span>
+ </c:if>
+ </span>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.payment.stripe.publishableKey" text="Publishable key"/></label>
+ <div class="controls">
+ <form:input cssClass="input-xxlarge highlight" path="integrationKeys['publishableKey']" />
+ </div>
+ <span class="help-inline">
+ <c:if test="${publishableKey!=null}">
+ <span id="apikeyerrors" class="error"><s:message code="module.payment.stripe.message.publishableKey" text="Field in error"/></span>
+ </c:if>
+ </span>
+ </div>
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.payment.transactiontype" text="Transaction type"/></label>
+ <div class="controls">
+ <form:radiobutton cssClass="input-large highlight" path="integrationKeys['transaction']" value="AUTHORIZE" /> <s:message code="module.payment.transactiontype.preauth" text="Pre-authorization" /><br/>
+ <form:radiobutton cssClass="input-large highlight" path="integrationKeys['transaction']" value="AUTHORIZECAPTURE" /> <s:message code="module.payment.transactiontype.sale" text="Sale" /></br>
+ </div>
+ </div>
+
+
\ No newline at end of file
sm-shop/src/main/webapp/pages/admin/products/attribute.jsp 526(+263 -263)
diff --git a/sm-shop/src/main/webapp/pages/admin/products/attribute.jsp b/sm-shop/src/main/webapp/pages/admin/products/attribute.jsp
index 81af97c..a34e971 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/attribute.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/attribute.jsp
@@ -1,264 +1,264 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-<script type="text/javascript">
-var priceFormatMessage = '<s:message code="message.price.cents" text="Wrong format" />';
-</script>
-
-<script src="<c:url value="/resources/js/jquery.formatCurrency-1.4.0.js" />"></script>
-<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
-<script src="<c:url value="/resources/js/adminFunctions.js" />"></script>
-
-<script type="text/javascript">
-
-$(document).ready(function() {
-
- $('#productPriceAmount').numeric({allow:"."});
- $('#order').numeric();
- $('#weight').numeric({allow:"."});
- $("#productOption").change(function() {
- if($('#displayOnly').attr('checked')) {
- checkReadOnlyAttribute($(this).val());
- }
- })
-
- var optionId = $('#productOption').find(":selected").val();
- checkReadOnlyAttribute(optionId);
-
- $( "#productOption" ).change(function() {
- checkReadOnlyAttribute($(this).val());
- });
-
-
-});
-
-function checkReadOnlyAttribute(optionId){
- //$('#displayOnly').removeAttr("disabled");
- $.ajax({
- type: 'POST',
- url: '<c:url value="/admin/products/attributes/getAttributeType.html"/>',
- data: 'optionId=' + optionId,
- dataType: 'json',
- success: function(response){
-
- var status = isc.XMLTools.selectObjects(response, "/response/status");
- if(status==0 || status ==9999) {
-
- var type = isc.XMLTools.selectObjects(response, "/response/data/type");
- if(type=='text') {
- //$('#displayOnly').prop("checked", true);
- //$('#displayOnly').attr("disabled", true);
- $("#attributeValueText").show();
- $("#optionValue").hide();
- } else {
- $("#attributeValueText").hide();
- $("#optionValue").show();
- }
-
- } else {
-
- //display message
- $(".alert-error").show();
- }
-
-
- },
- error: function(xhr, textStatus, errorThrown) {
- alert('error ' + errorThrown);
- }
-
- });
-}
-
-
-</script>
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
- <div class="sm-ui-component">
- <c:if test="${product.id!=null && product.id>0}">
- <c:set value="${product.id}" var="productId" scope="request"/>
- <jsp:include page="/pages/admin/products/product-menu.jsp" />
- </c:if>
-
-
- <h3>
- <s:message code="label.product.attribute" text="Attribute" />
- </h3>
- <br/>
- <strong><c:out value="${product.sku}"/></strong>
-
-
- <br/><br/>
-
-
-
-
- <c:url var="attributeSave" value="/admin/attributes/attribute/save.html"/>
-
-
- <form:form method="POST" commandName="attribute" action="${attributeSave}">
-
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
-
-
- <div class="control-group">
- <label><s:message code="label.product.attribute.option.name" text="Option / attribute name"/></label>
- <div class="controls">
- <div class="controls">
- <form:select cssClass="highlight" id="productOption" path="productOption.id">
- <form:options items="${options}" itemValue="id" itemLabel="descriptionsSettoList[0].name"/>
- </form:select>
- <span class="help-inline"><form:errors path="productOption.id" cssClass="error" /></span>
- </div>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.product.attribute.display" text="Display only"/></label>
- <div class="controls">
- <form:checkbox id="displayOnly" path="attributeDisplayOnly"/>
- <span class="help-inline"><form:errors path="attributeDisplayOnly" cssClass="error" /></span>
- </div>
- </div>
-
-
- <div class="control-group" id="optionValue" style="display:<c:choose><c:when test="${attribute.productOption.productOptionType=='text'}">none;</c:when><c:otherwise>block;</c:otherwise></c:choose>">
- <label><s:message code="label.product.productoptiosvalue.title" text="Option value name"/></label>
- <div class="controls">
- <div class="controls">
- <form:select cssClass="highlight" path="productOptionValue.id">
- <form:options items="${optionsValues}" itemValue="id" itemLabel="descriptionsSettoList[0].name"/>
- </form:select>
- <span class="help-inline"><form:errors path="productOptionValue.id" cssClass="error" /></span>
- </div>
- </div>
- </div>
-
-
- <div class="control-group" id="attributeValueText" style="display:<c:choose><c:when test="${attribute.productOption.productOptionType=='text'}">block;</c:when><c:otherwise>none;</c:otherwise></c:choose>">
- <c:forEach items="${attribute.productOptionValue.descriptionsSettoList}" var="description" varStatus="counter">
-
-
- <label class="required"><s:message code="label.product.attribute.value" text="Attribute value"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:input cssClass="input-xlarge" id="name${counter.index}" path="productOptionValue.descriptionsList[${counter.index}].description"/>
- <span class="help-inline"><form:errors path="productOptionValue.descriptionsList[${counter.index}].description" cssClass="error" /></span>
- </div>
-
- <form:hidden path="productOptionValue.descriptionsList[${counter.index}].language.code" />
- <form:hidden path="productOptionValue.descriptionsList[${counter.index}].language.id" />
- <form:hidden path="productOptionValue.descriptionsList[${counter.index}].id" />
- <form:hidden path="productOptionValue.id" />
- <form:hidden path="productOptionValue.code" />
-
- </c:forEach>
- </div>
-
-
- <div class="control-group">
- <label><s:message code="label.product.productoptions.price" text="Price"/></label>
- <div class="controls">
- <form:input id="productPriceAmount" cssClass="highlight" path="attributePrice"/>
- <span id="help-price" class="help-inline"><form:errors path="attributePrice" cssClass="error" /></span>
- </div>
- </div>
-
-
- <div class="control-group">
- <label class="required"><s:message code="label.entity.order" text="Order"/></label>
- <div class="controls">
- <form:input id="order" cssClass="highlight" path="attributeSortOrder"/>
- <span class="help-inline"><form:errors path="attributeSortOrder" cssClass="error" /></span>
-
- </div>
- </div>
-
-
-
-
- <div class="control-group">
- <label><s:message code="label.product.attribute.default" text="Default"/></label>
- <div class="controls">
- <form:checkbox path="attributeDefault"/>
- <span class="help-inline"><form:errors path="attributeDefault" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.product.attribute.required" text="Required"/></label>
- <div class="controls">
- <form:checkbox path="attributeRequired"/>
- <span class="help-inline"><form:errors path="attributeRequired" cssClass="error" /></span>
- </div>
- </div>
-
-
-
- <div class="control-group">
- <label class="required"><s:message code="label.product.attribute.otherweight" text="Additional weight"/></label>
- <div class="controls">
- <form:input id="weight" cssClass="highlight" path="attributeAdditionalWeight"/>
- <span class="help-inline"><form:errors path="attributeAdditionalWeight" cssClass="error" /></span>
-
- </div>
- </div>
-
-
-
- <form:hidden path="id" />
- <form:hidden path="product.id" />
-
- <div class="form-actions">
-
- <div class="pull-right">
-
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
-
-
- </div>
-
- </div>
-
- </form:form>
-
-
- <br/>
-
-
-
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+<script type="text/javascript">
+var priceFormatMessage = '<s:message code="message.price.cents" text="Wrong format" />';
+</script>
+
+<script src="<c:url value="/resources/js/jquery.formatCurrency-1.4.0.js" />"></script>
+<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
+<script src="<c:url value="/resources/js/adminFunctions.js" />"></script>
+
+<script type="text/javascript">
+
+$(document).ready(function() {
+
+ $('#productPriceAmount').numeric({allow:"."});
+ $('#order').numeric();
+ $('#weight').numeric({allow:"."});
+ $("#productOption").change(function() {
+ if($('#displayOnly').attr('checked')) {
+ checkReadOnlyAttribute($(this).val());
+ }
+ })
+
+ var optionId = $('#productOption').find(":selected").val();
+ checkReadOnlyAttribute(optionId);
+
+ $( "#productOption" ).change(function() {
+ checkReadOnlyAttribute($(this).val());
+ });
+
+
+});
+
+function checkReadOnlyAttribute(optionId){
+ //$('#displayOnly').removeAttr("disabled");
+ $.ajax({
+ type: 'POST',
+ url: '<c:url value="/admin/products/attributes/getAttributeType.html"/>',
+ data: 'optionId=' + optionId,
+ dataType: 'json',
+ success: function(response){
+
+ var status = isc.XMLTools.selectObjects(response, "/response/status");
+ if(status==0 || status ==9999) {
+
+ var type = isc.XMLTools.selectObjects(response, "/response/data/type");
+ if(type=='text') {
+ //$('#displayOnly').prop("checked", true);
+ //$('#displayOnly').attr("disabled", true);
+ $("#attributeValueText").show();
+ $("#optionValue").hide();
+ } else {
+ $("#attributeValueText").hide();
+ $("#optionValue").show();
+ }
+
+ } else {
+
+ //display message
+ $(".alert-error").show();
+ }
+
+
+ },
+ error: function(xhr, textStatus, errorThrown) {
+ alert('error ' + errorThrown);
+ }
+
+ });
+}
+
+
+</script>
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+ <div class="sm-ui-component">
+ <c:if test="${product.id!=null && product.id>0}">
+ <c:set value="${product.id}" var="productId" scope="request"/>
+ <jsp:include page="/pages/admin/products/product-menu.jsp" />
+ </c:if>
+
+
+ <h3>
+ <s:message code="label.product.attribute" text="Attribute" />
+ </h3>
+ <br/>
+ <strong><c:out value="${product.sku}"/></strong>
+
+
+ <br/><br/>
+
+
+
+
+ <c:url var="attributeSave" value="/admin/attributes/attribute/save.html"/>
+
+
+ <form:form method="POST" commandName="attribute" action="${attributeSave}">
+
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+
+
+ <div class="control-group">
+ <label><s:message code="label.product.attribute.option.name" text="Option / attribute name"/></label>
+ <div class="controls">
+ <div class="controls">
+ <form:select cssClass="highlight" id="productOption" path="productOption.id">
+ <form:options items="${options}" itemValue="id" itemLabel="descriptionsSettoList[0].name"/>
+ </form:select>
+ <span class="help-inline"><form:errors path="productOption.id" cssClass="error" /></span>
+ </div>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.product.attribute.display" text="Display only"/></label>
+ <div class="controls">
+ <form:checkbox id="displayOnly" path="attributeDisplayOnly"/>
+ <span class="help-inline"><form:errors path="attributeDisplayOnly" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+ <div class="control-group" id="optionValue" style="display:<c:choose><c:when test="${attribute.productOption.productOptionType=='text'}">none;</c:when><c:otherwise>block;</c:otherwise></c:choose>">
+ <label><s:message code="label.product.productoptiosvalue.title" text="Option value name"/></label>
+ <div class="controls">
+ <div class="controls">
+ <form:select cssClass="highlight" path="productOptionValue.id">
+ <form:options items="${optionsValues}" itemValue="id" itemLabel="descriptionsSettoList[0].name"/>
+ </form:select>
+ <span class="help-inline"><form:errors path="productOptionValue.id" cssClass="error" /></span>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="control-group" id="attributeValueText" style="display:<c:choose><c:when test="${attribute.productOption.productOptionType=='text'}">block;</c:when><c:otherwise>none;</c:otherwise></c:choose>">
+ <c:forEach items="${attribute.productOptionValue.descriptionsSettoList}" var="description" varStatus="counter">
+
+
+ <label class="required"><s:message code="label.product.attribute.value" text="Attribute value"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:input cssClass="input-xlarge" id="name${counter.index}" path="productOptionValue.descriptionsList[${counter.index}].description"/>
+ <span class="help-inline"><form:errors path="productOptionValue.descriptionsList[${counter.index}].description" cssClass="error" /></span>
+ </div>
+
+ <form:hidden path="productOptionValue.descriptionsList[${counter.index}].language.code" />
+ <form:hidden path="productOptionValue.descriptionsList[${counter.index}].language.id" />
+ <form:hidden path="productOptionValue.descriptionsList[${counter.index}].id" />
+ <form:hidden path="productOptionValue.id" />
+ <form:hidden path="productOptionValue.code" />
+
+ </c:forEach>
+ </div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.product.productoptions.price" text="Price"/></label>
+ <div class="controls">
+ <form:input id="productPriceAmount" cssClass="highlight" path="attributePrice"/>
+ <span id="help-price" class="help-inline"><form:errors path="attributePrice" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.entity.order" text="Order"/></label>
+ <div class="controls">
+ <form:input id="order" cssClass="highlight" path="attributeSortOrder"/>
+ <span class="help-inline"><form:errors path="attributeSortOrder" cssClass="error" /></span>
+
+ </div>
+ </div>
+
+
+
+
+ <div class="control-group">
+ <label><s:message code="label.product.attribute.default" text="Default"/></label>
+ <div class="controls">
+ <form:checkbox path="attributeDefault"/>
+ <span class="help-inline"><form:errors path="attributeDefault" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.product.attribute.required" text="Required"/></label>
+ <div class="controls">
+ <form:checkbox path="attributeRequired"/>
+ <span class="help-inline"><form:errors path="attributeRequired" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.product.attribute.otherweight" text="Additional weight"/></label>
+ <div class="controls">
+ <form:input id="weight" cssClass="highlight" path="attributeAdditionalWeight"/>
+ <span class="help-inline"><form:errors path="attributeAdditionalWeight" cssClass="error" /></span>
+
+ </div>
+ </div>
+
+
+
+ <form:hidden path="id" />
+ <form:hidden path="product.id" />
+
+ <div class="form-actions">
+
+ <div class="pull-right">
+
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
+
+
+ </div>
+
+ </div>
+
+ </form:form>
+
+
+ <br/>
+
+
+
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/products/attributes.jsp b/sm-shop/src/main/webapp/pages/admin/products/attributes.jsp
index 8baf59f..261c9f9 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/attributes.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/attributes.jsp
@@ -1,74 +1,74 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
- <div class="sm-ui-component">
-
-
-
-
- <c:if test="${product.id!=null && product.id>0}">
- <c:set value="${product.id}" var="productId" scope="request"/>
- <jsp:include page="/pages/admin/products/product-menu.jsp" />
- </c:if>
-
- <h3><s:message code="label.product.attributes" text="Product attributes" /></h3>
- <br/>
- <strong><c:out value="${product.sku}"/></strong>
-
- <br/>
- <a href="<c:url value="/admin/products/attribute/createAttribute.html?productId=${product.id}"/>"><s:message code="label.product.attribute.create" text="Create product attribute" /></a>
- <br/><br/>
-
- <!-- Listing grid include -->
- <c:set value="/admin/products/attributes/page.html?productId=${product.id}" var="pagingUrl" scope="request"/>
- <c:set value="/admin/attributes/attribute/remove.html" var="removeUrl" scope="request"/>
- <c:set value="/admin/products/attributes/editAttribute.html" var="editUrl" scope="request"/>
- <c:set value="/admin/products/attributes/list.html?id=${product.id}" var="afterRemoveUrl" scope="request"/>
- <c:set var="entityId" value="attributeId" scope="request"/>
- <c:set var="appendQueryStringToEdit" value="productId=${product.id}" scope="request"/>
- <c:set var="groupByEntity" value="attribute" scope="request"/>
- <c:set var="componentTitleKey" value="label.product.attributes" scope="request"/>
- <c:set var="gridHeader" value="/pages/admin/products/attributes-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="true" scope="request"/>
-
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
-
-
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+ <div class="sm-ui-component">
+
+
+
+
+ <c:if test="${product.id!=null && product.id>0}">
+ <c:set value="${product.id}" var="productId" scope="request"/>
+ <jsp:include page="/pages/admin/products/product-menu.jsp" />
+ </c:if>
+
+ <h3><s:message code="label.product.attributes" text="Product attributes" /></h3>
+ <br/>
+ <strong><c:out value="${product.sku}"/></strong>
+
+ <br/>
+ <a href="<c:url value="/admin/products/attribute/createAttribute.html?productId=${product.id}"/>"><s:message code="label.product.attribute.create" text="Create product attribute" /></a>
+ <br/><br/>
+
+ <!-- Listing grid include -->
+ <c:set value="/admin/products/attributes/page.html?productId=${product.id}" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/attributes/attribute/remove.html" var="removeUrl" scope="request"/>
+ <c:set value="/admin/products/attributes/editAttribute.html" var="editUrl" scope="request"/>
+ <c:set value="/admin/products/attributes/list.html?id=${product.id}" var="afterRemoveUrl" scope="request"/>
+ <c:set var="entityId" value="attributeId" scope="request"/>
+ <c:set var="appendQueryStringToEdit" value="productId=${product.id}" scope="request"/>
+ <c:set var="groupByEntity" value="attribute" scope="request"/>
+ <c:set var="componentTitleKey" value="label.product.attributes" scope="request"/>
+ <c:set var="gridHeader" value="/pages/admin/products/attributes-gridHeader.jsp" scope="request"/>
+ <c:set var="canRemoveEntry" value="true" scope="request"/>
+
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+
+
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/products/attributes-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/products/attributes-gridHeader.jsp
index e71966f..dcd34e3 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/attributes-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/attributes-gridHeader.jsp
@@ -1,15 +1,15 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
- {title:"<s:message code="label.entity.id" text="Id"/>", name:"attributeId", canFilter:false},
- {title:"<s:message code="label.product.productoptions.name" text="Attribute / option name"/>", name:"attribute", canFilter:false},
- {title:"<s:message code="label.product.productoptiosvalue.title" text="Option value"/>", name:"value", canFilter:false},
- {title:"<s:message code="label.generic.displayonly" text="Display only"/>", name:"display", type:"boolean", canFilter:false},
- {title:"<s:message code="label.generic.price" text="Price"/>", name:"price", canFilter:false},
- {title:"<s:message code="label.entity.order" text="Order"/>", name:"order", canFilter:false},
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+ {title:"<s:message code="label.entity.id" text="Id"/>", name:"attributeId", canFilter:false},
+ {title:"<s:message code="label.product.productoptions.name" text="Attribute / option name"/>", name:"attribute", canFilter:false},
+ {title:"<s:message code="label.product.productoptiosvalue.title" text="Option value"/>", name:"value", canFilter:false},
+ {title:"<s:message code="label.generic.displayonly" text="Display only"/>", name:"display", type:"boolean", canFilter:false},
+ {title:"<s:message code="label.generic.price" text="Price"/>", name:"price", canFilter:false},
+ {title:"<s:message code="label.entity.order" text="Order"/>", name:"order", canFilter:false},
{title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/products/customProductGroup.jsp b/sm-shop/src/main/webapp/pages/admin/products/customProductGroup.jsp
index 238060b..ae9fc3f 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/customProductGroup.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/customProductGroup.jsp
@@ -1,100 +1,100 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
- <div class="sm-ui-component">
-
-
-
-
- <h3>
- <s:message code="label.product.customgroup.add" text="Add custom group" />
- </h3>
-
-
-
- <br/><br/>
-
-
- <c:url var="saveProductGrop" value="/admin/products/groups/save.html"/>
-
-
- <form:form method="POST" commandName="group" action="${saveProductGrop}">
-
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
- <div class="control-group">
- <label class="required"><s:message code="label.product.customgroup.code" text="Custom product group code"/></label>
- <div class="controls">
- <form:input id="code" cssClass="highlight" path="code"/>
- <span id="help-price" class="help-inline"><form:errors path="code" cssClass="error" /></span>
- </div>
- </div>
-
-
-
- <div class="form-actions">
-
- <div class="pull-right">
-
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
-
- </div>
- </div>
-
- </form:form>
-
-
- <br/>
-
- <!-- Listing grid include -->
-
- <c:set value="/admin/products/groups/paging.html" var="pagingUrl" scope="request"/>
- <c:set value="/admin/products/groups/remove.html" var="removeUrl" scope="request"/>
- <c:set value="/admin/products/groups/update.html" var="updateUrl" scope="request"/>
- <c:set value="/admin/products/group/edit.html" var="editUrl" scope="request"/>
- <c:set value="/admin/products/groups/list.html" var="afterRemoveUrl" scope="request"/>
- <c:set var="entityId" value="code" scope="request"/>
- <c:set var="componentTitleKey" value="menu.catalogue-products-custom-group" scope="request"/>
- <c:set var="gridHeader" value="/pages/admin/products/customProductGroup-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="true" scope="request"/>
-
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+ <div class="sm-ui-component">
+
+
+
+
+ <h3>
+ <s:message code="label.product.customgroup.add" text="Add custom group" />
+ </h3>
+
+
+
+ <br/><br/>
+
+
+ <c:url var="saveProductGrop" value="/admin/products/groups/save.html"/>
+
+
+ <form:form method="POST" commandName="group" action="${saveProductGrop}">
+
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.product.customgroup.code" text="Custom product group code"/></label>
+ <div class="controls">
+ <form:input id="code" cssClass="highlight" path="code"/>
+ <span id="help-price" class="help-inline"><form:errors path="code" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+
+ <div class="form-actions">
+
+ <div class="pull-right">
+
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
+
+ </div>
+ </div>
+
+ </form:form>
+
+
+ <br/>
+
+ <!-- Listing grid include -->
+
+ <c:set value="/admin/products/groups/paging.html" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/products/groups/remove.html" var="removeUrl" scope="request"/>
+ <c:set value="/admin/products/groups/update.html" var="updateUrl" scope="request"/>
+ <c:set value="/admin/products/group/edit.html" var="editUrl" scope="request"/>
+ <c:set value="/admin/products/groups/list.html" var="afterRemoveUrl" scope="request"/>
+ <c:set var="entityId" value="code" scope="request"/>
+ <c:set var="componentTitleKey" value="menu.catalogue-products-custom-group" scope="request"/>
+ <c:set var="gridHeader" value="/pages/admin/products/customProductGroup-gridHeader.jsp" scope="request"/>
+ <c:set var="canRemoveEntry" value="true" scope="request"/>
+
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/products/customProductGroupDetails.jsp b/sm-shop/src/main/webapp/pages/admin/products/customProductGroupDetails.jsp
index 82e8d34..d1a1f71 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/customProductGroupDetails.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/customProductGroupDetails.jsp
@@ -1,74 +1,74 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-<script>
-
-
-
-</script>
-
-
-<div class="tabbable">
-
-
- <jsp:include page="/common/adminTabs.jsp" />
-
-
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
-
-
- <div class="sm-ui-component">
-
- <h3>
- <c:out value="${group}"/>
- </h3>
- <br/>
- <div class="alert alert-info">
- <s:message code="label.product.group.meassage" text="Drag and drop product from product list to the product group box"/>
- </div>
-
- <!-- Listing grid include -->
- <c:set value="/admin/products/paging.html" var="pagingUrl" scope="request"/>
- <c:set value="/admin/products/group/details/paging.html?code=${group}" var="containerFetchUrl" scope="request"/>
- <c:set value="/admin/products/group/details/removeItem.html?code=${group}" var="containerRemoveUrl" scope="request"/>
- <c:set value="/admin/products/group/details/addItem.html?code=${group}" var="containerAddUrl" scope="request"/>
- <c:set value="/admin/products/group/details/update.html" var="containerUpdateUrl" scope="request"/>
- <c:set value="/admin/products/editProduct.html" var="editUrl" scope="request"/>
- <c:set value="/admin/products/group/edit.html?id=${group}" var="reloadUrl" scope="request"/>
- <c:set var="componentTitleKey" value="label.product.customGroup.title" scope="request"/>
- <c:set var="gridHeader" value="/pages/admin/products/featured-gridHeader.jsp" scope="request"/>
- <c:set var="gridHeaderContainer" value="/pages/admin/products/product-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="true" scope="request"/>
-
- <jsp:include page="/pages/admin/components/product-container.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+<script>
+
+
+
+</script>
+
+
+<div class="tabbable">
+
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+
+
+ <div class="sm-ui-component">
+
+ <h3>
+ <c:out value="${group}"/>
+ </h3>
+ <br/>
+ <div class="alert alert-info">
+ <s:message code="label.product.group.meassage" text="Drag and drop product from product list to the product group box"/>
+ </div>
+
+ <!-- Listing grid include -->
+ <c:set value="/admin/products/paging.html" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/products/group/details/paging.html?code=${group}" var="containerFetchUrl" scope="request"/>
+ <c:set value="/admin/products/group/details/removeItem.html?code=${group}" var="containerRemoveUrl" scope="request"/>
+ <c:set value="/admin/products/group/details/addItem.html?code=${group}" var="containerAddUrl" scope="request"/>
+ <c:set value="/admin/products/group/details/update.html" var="containerUpdateUrl" scope="request"/>
+ <c:set value="/admin/products/editProduct.html" var="editUrl" scope="request"/>
+ <c:set value="/admin/products/group/edit.html?id=${group}" var="reloadUrl" scope="request"/>
+ <c:set var="componentTitleKey" value="label.product.customGroup.title" scope="request"/>
+ <c:set var="gridHeader" value="/pages/admin/products/featured-gridHeader.jsp" scope="request"/>
+ <c:set var="gridHeaderContainer" value="/pages/admin/products/product-gridHeader.jsp" scope="request"/>
+ <c:set var="canRemoveEntry" value="true" scope="request"/>
+
+ <jsp:include page="/pages/admin/components/product-container.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/products/customProductGroup-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/products/customProductGroup-gridHeader.jsp
index e79b841..7fdc825 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/customProductGroup-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/customProductGroup-gridHeader.jsp
@@ -1,12 +1,12 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
-
- {title:"<s:message code="label.entity.code" text="Code"/>", name:"code", canFilter:false},
- {title:"<s:message code="label.entity.enabled" text="Enabled"/>", name:"active", type:"boolean", canEdit:true, canFilter:true},
- {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+
+ {title:"<s:message code="label.entity.code" text="Code"/>", name:"code", canFilter:false},
+ {title:"<s:message code="label.entity.enabled" text="Enabled"/>", name:"active", type:"boolean", canEdit:true, canFilter:true},
+ {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
diff --git a/sm-shop/src/main/webapp/pages/admin/products/digitalProduct.jsp b/sm-shop/src/main/webapp/pages/admin/products/digitalProduct.jsp
index 7cb62b9..5f0f4a2 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/digitalProduct.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/digitalProduct.jsp
@@ -1,122 +1,122 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-
-<%@ page session="false"%>
-
-
-
-<script type="text/javascript">
-
- function removeFile(fileId){
- $("#store.error").show();
- $.ajax({
- type: 'POST',
- url: '<c:url value="/admin/products/product/removeDigitalProduct.html"/>?fileId=' + fileId,
- dataType: 'json',
- success: function(response){
-
- var status = isc.XMLTools.selectObjects(response, "/response/status");
- if(status==0 || status ==9999) {
-
- //remove delete
- $("#productControlRemove").html('');
- $("#fileLink").hide();
- //add field
- $("#fileControl").html('<input class=\"input-file\" id=\"file\" name=\"file\" type=\"file\">');
- $(".alert-success").show();
-
- } else {
-
- //display message
- $(".alert-error").show();
- }
-
-
- },
- error: function(xhr, textStatus, errorThrown) {
- alert('error ' + errorThrown);
- }
-
- });
- }
-
-</script>
-
-
-<div class="tabbable">
-
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
- <c:if test="${product.id!=null && product.id>0}">
- <c:set value="${product.id}" var="productId" scope="request"/>
- <jsp:include page="/pages/admin/products/product-menu.jsp" />
- </c:if>
-
- <h3>
- <s:message code="label.product.digitalproduct" text="Digital product"/>
- </h3>
- <br/>
- <strong><c:out value="${product.sku}"/></strong>
-
-
- <br/><br/>
-
- <c:url var="saveProductFile" value="/admin/products/product/saveDigitalProduct.html" />
- <form:form method="POST" enctype="multipart/form-data" commandName="productFiles" action="${saveProductFile}">
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success"
- style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>">
- <s:message code="message.success" text="Request successfull" />
- </div>
- <input type="hidden" name="product.id" value="${product.id}" />
-
-
-
- <!-- hidden when creating the product -->
- <div class="control-group">
- <label>
- <s:message code="label.product.digitalproduct" text="Digital product"/>
- <c:if test="${digitalProduct!=null}"><span id="productControlRemove"> - <a href="#" onClick="removeFile('${digitalProduct.id}')"><s:message code="label.generic.remove" text="Remove"/></a></span></c:if>
- </label>
- <div class="controls" id="fileControl">
-
- <c:choose>
- <c:when test="${digitalProduct==null}">
- <input class="input-file" id="file" name="file" type="file" multiple="multiple">
- <br/>
- </c:when>
- <c:otherwise>
- <a id="fileLink" href="<sm:adminProductDownload digitalProduct="${digitalProduct}" />">${digitalProduct.productFileName}</a>
- </c:otherwise>
- </c:choose>
-
- </div>
- </div>
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success">
- <s:message code="button.label.submit2" text="Submit" />
- </button>
- </div>
- </div>
- </form:form>
- </div>
- </div>
- </div>
-
-
-
-
-
-
-
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@ page session="false"%>
+
+
+
+<script type="text/javascript">
+
+ function removeFile(fileId){
+ $("#store.error").show();
+ $.ajax({
+ type: 'POST',
+ url: '<c:url value="/admin/products/product/removeDigitalProduct.html"/>?fileId=' + fileId,
+ dataType: 'json',
+ success: function(response){
+
+ var status = isc.XMLTools.selectObjects(response, "/response/status");
+ if(status==0 || status ==9999) {
+
+ //remove delete
+ $("#productControlRemove").html('');
+ $("#fileLink").hide();
+ //add field
+ $("#fileControl").html('<input class=\"input-file\" id=\"file\" name=\"file\" type=\"file\">');
+ $(".alert-success").show();
+
+ } else {
+
+ //display message
+ $(".alert-error").show();
+ }
+
+
+ },
+ error: function(xhr, textStatus, errorThrown) {
+ alert('error ' + errorThrown);
+ }
+
+ });
+ }
+
+</script>
+
+
+<div class="tabbable">
+
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+ <c:if test="${product.id!=null && product.id>0}">
+ <c:set value="${product.id}" var="productId" scope="request"/>
+ <jsp:include page="/pages/admin/products/product-menu.jsp" />
+ </c:if>
+
+ <h3>
+ <s:message code="label.product.digitalproduct" text="Digital product"/>
+ </h3>
+ <br/>
+ <strong><c:out value="${product.sku}"/></strong>
+
+
+ <br/><br/>
+
+ <c:url var="saveProductFile" value="/admin/products/product/saveDigitalProduct.html" />
+ <form:form method="POST" enctype="multipart/form-data" commandName="productFiles" action="${saveProductFile}">
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success"
+ style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>">
+ <s:message code="message.success" text="Request successfull" />
+ </div>
+ <input type="hidden" name="product.id" value="${product.id}" />
+
+
+
+ <!-- hidden when creating the product -->
+ <div class="control-group">
+ <label>
+ <s:message code="label.product.digitalproduct" text="Digital product"/>
+ <c:if test="${digitalProduct!=null}"><span id="productControlRemove"> - <a href="#" onClick="removeFile('${digitalProduct.id}')"><s:message code="label.generic.remove" text="Remove"/></a></span></c:if>
+ </label>
+ <div class="controls" id="fileControl">
+
+ <c:choose>
+ <c:when test="${digitalProduct==null}">
+ <input class="input-file" id="file" name="file" type="file" multiple="multiple">
+ <br/>
+ </c:when>
+ <c:otherwise>
+ <a id="fileLink" href="<sm:adminProductDownload digitalProduct="${digitalProduct}" />">${digitalProduct.productFileName}</a>
+ </c:otherwise>
+ </c:choose>
+
+ </div>
+ </div>
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success">
+ <s:message code="button.label.submit2" text="Submit" />
+ </button>
+ </div>
+ </div>
+ </form:form>
+ </div>
+ </div>
+ </div>
+
+
+
+
+
+
+
+
diff --git a/sm-shop/src/main/webapp/pages/admin/products/featured.jsp b/sm-shop/src/main/webapp/pages/admin/products/featured.jsp
index d9c8989..e7007df 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/featured.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/featured.jsp
@@ -1,75 +1,75 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-<script>
-
-
-
-</script>
-
-
-<div class="tabbable">
-
-
- <jsp:include page="/common/adminTabs.jsp" />
-
-
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
-
-
- <div class="sm-ui-component">
-
- <h3>
- <s:message code="menu.catalogue-featured" text="Featured items" />
- </h3>
- <br/>
- <div class="alert alert-info">
- <s:message code="label.product.featured.meassage" text="Drag and drop product from product list to featured items box"/>
- </div>
-
- <!-- Listing grid include -->
- <c:set value="/admin/products/paging.html" var="pagingUrl" scope="request"/>
- <c:set value="/admin/catalogue/featured/paging.html" var="containerFetchUrl" scope="request"/>
- <c:set value="/admin/catalogue/featured/removeItem.html" var="containerRemoveUrl" scope="request"/>
- <c:set value="FEATURED" var="removeEntity" scope="request"/>
- <c:set value="/admin/catalogue/featured/addItem.html" var="containerAddUrl" scope="request"/>
- <c:set value="/admin/catalogue/featured/update.html" var="containerUpdateUrl" scope="request"/>
- <c:set value="/admin/products/editProduct.html" var="editUrl" scope="request"/>
- <c:set value="/admin/catalogue/featured/list.html" var="reloadUrl" scope="request"/>
- <c:set var="componentTitleKey" value="menu.catalogue-featured" scope="request"/>
- <c:set var="gridHeader" value="/pages/admin/products/featured-gridHeader.jsp" scope="request"/>
- <c:set var="gridHeaderContainer" value="/pages/admin/products/product-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="true" scope="request"/>
-
- <jsp:include page="/pages/admin/components/product-container.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+<script>
+
+
+
+</script>
+
+
+<div class="tabbable">
+
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+
+
+ <div class="sm-ui-component">
+
+ <h3>
+ <s:message code="menu.catalogue-featured" text="Featured items" />
+ </h3>
+ <br/>
+ <div class="alert alert-info">
+ <s:message code="label.product.featured.meassage" text="Drag and drop product from product list to featured items box"/>
+ </div>
+
+ <!-- Listing grid include -->
+ <c:set value="/admin/products/paging.html" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/catalogue/featured/paging.html" var="containerFetchUrl" scope="request"/>
+ <c:set value="/admin/catalogue/featured/removeItem.html" var="containerRemoveUrl" scope="request"/>
+ <c:set value="FEATURED" var="removeEntity" scope="request"/>
+ <c:set value="/admin/catalogue/featured/addItem.html" var="containerAddUrl" scope="request"/>
+ <c:set value="/admin/catalogue/featured/update.html" var="containerUpdateUrl" scope="request"/>
+ <c:set value="/admin/products/editProduct.html" var="editUrl" scope="request"/>
+ <c:set value="/admin/catalogue/featured/list.html" var="reloadUrl" scope="request"/>
+ <c:set var="componentTitleKey" value="menu.catalogue-featured" scope="request"/>
+ <c:set var="gridHeader" value="/pages/admin/products/featured-gridHeader.jsp" scope="request"/>
+ <c:set var="gridHeaderContainer" value="/pages/admin/products/product-gridHeader.jsp" scope="request"/>
+ <c:set var="canRemoveEntry" value="true" scope="request"/>
+
+ <jsp:include page="/pages/admin/components/product-container.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/products/featured-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/products/featured-gridHeader.jsp
index 33c50a2..ea0eed2 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/featured-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/featured-gridHeader.jsp
@@ -1,13 +1,13 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
- {title:"<s:message code="label.entity.id" text="Id"/>", name:"productId", canFilter:false},
- {title:"<s:message code="label.entity.name" text="Name"/>", name:"name"},
- {title:"<s:message code="label.product.sku" text="Sku"/>", name:"sku"},
- {title:"<s:message code="label.product.available" text="Available"/>", name:"available",type:"boolean"},
- {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+ {title:"<s:message code="label.entity.id" text="Id"/>", name:"productId", canFilter:false},
+ {title:"<s:message code="label.entity.name" text="Name"/>", name:"name"},
+ {title:"<s:message code="label.product.sku" text="Sku"/>", name:"sku"},
+ {title:"<s:message code="label.product.available" text="Available"/>", name:"available",type:"boolean"},
+ {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
diff --git a/sm-shop/src/main/webapp/pages/admin/products/keywords.jsp b/sm-shop/src/main/webapp/pages/admin/products/keywords.jsp
index 8fc3456..061d7c8 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/keywords.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/keywords.jsp
@@ -1,86 +1,86 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-<div class="tabbable">
- <jsp:include page="/common/adminTabs.jsp" />
- <div class="tab-content">
- <div class="tab-pane active" id="catalogue-section">
- <div class="sm-ui-component">
-
-
- <c:if test="${product.id!=null && product.id>0}">
- <c:set value="${product.id}" var="productId" scope="request"/>
- <jsp:include page="/pages/admin/products/product-menu.jsp" />
- </c:if>
-
-
- <h3>
- <s:message code="label.product.searchkeywords" text="Search keywords" />
- </h3>
-
-
-
- <c:url var="addKeyword" value="/admin/products/product/addKeyword.html" />
- <form:form method="POST" enctype="multipart/form-data" commandName="productKeyword" action="${addKeyword}">
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>">
- <s:message code="message.success" text="Request successfull" />
- </div>
- <br/>
- <strong><c:out value="${product.sku}"/></strong>
- <br/><br/>
-
- <div class="control-group">
- <label><s:message code="label.generic.language" text="Language"/></label>
- <div class="controls">
- <form:select path="languageCode">
- <form:options items="${store.languages}" itemValue="code" itemLabel="code"/>
- </form:select>
- <span class="help-inline"><form:errors path="languageCode" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.generic.keyword" text="Keyword"/></label>
- <div class="controls">
- <form:input id="keyword" cssClass="highlight" path="keyword"/>
- <span class="help-inline"><form:errors path="keyword" cssClass="error" /></span>
- </div>
- </div>
-
-
- <input type="hidden" name="productId" value="${product.id}">
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success"><s:message code="label.generic.add" text="Add"/></button>
- </div>
- </div>
-
- </form:form>
-
-
- <br/>
- <!-- Listing grid include -->
-
- <c:set value="/admin/products/product/keywords/paging.html?id=${product.id}" var="pagingUrl" scope="request"/>
- <c:set value="/admin/products/product/removeKeyword.html?id=${product.id}" var="removeUrl" scope="request"/>
- <c:set value="/admin/products/product/keywords.html?id=${product.id}" var="afterRemoveUrl" scope="request"/>
- <c:set var="entityId" value="code" scope="request"/>
- <c:set var="componentTitleKey" value="label.product.searchkeywords" scope="request"/>
- <c:set var="groupByEntity" value="language" scope="request" />
- <c:set var="gridHeader" value="/pages/admin/products/keywords-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="true" scope="request"/>
- <c:set var="canEdit" value="false" scope="request"/>
-
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
- </div>
- </div>
- </div>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+<div class="tabbable">
+ <jsp:include page="/common/adminTabs.jsp" />
+ <div class="tab-content">
+ <div class="tab-pane active" id="catalogue-section">
+ <div class="sm-ui-component">
+
+
+ <c:if test="${product.id!=null && product.id>0}">
+ <c:set value="${product.id}" var="productId" scope="request"/>
+ <jsp:include page="/pages/admin/products/product-menu.jsp" />
+ </c:if>
+
+
+ <h3>
+ <s:message code="label.product.searchkeywords" text="Search keywords" />
+ </h3>
+
+
+
+ <c:url var="addKeyword" value="/admin/products/product/addKeyword.html" />
+ <form:form method="POST" enctype="multipart/form-data" commandName="productKeyword" action="${addKeyword}">
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>">
+ <s:message code="message.success" text="Request successfull" />
+ </div>
+ <br/>
+ <strong><c:out value="${product.sku}"/></strong>
+ <br/><br/>
+
+ <div class="control-group">
+ <label><s:message code="label.generic.language" text="Language"/></label>
+ <div class="controls">
+ <form:select path="languageCode">
+ <form:options items="${store.languages}" itemValue="code" itemLabel="code"/>
+ </form:select>
+ <span class="help-inline"><form:errors path="languageCode" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.generic.keyword" text="Keyword"/></label>
+ <div class="controls">
+ <form:input id="keyword" cssClass="highlight" path="keyword"/>
+ <span class="help-inline"><form:errors path="keyword" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+ <input type="hidden" name="productId" value="${product.id}">
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success"><s:message code="label.generic.add" text="Add"/></button>
+ </div>
+ </div>
+
+ </form:form>
+
+
+ <br/>
+ <!-- Listing grid include -->
+
+ <c:set value="/admin/products/product/keywords/paging.html?id=${product.id}" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/products/product/removeKeyword.html?id=${product.id}" var="removeUrl" scope="request"/>
+ <c:set value="/admin/products/product/keywords.html?id=${product.id}" var="afterRemoveUrl" scope="request"/>
+ <c:set var="entityId" value="code" scope="request"/>
+ <c:set var="componentTitleKey" value="label.product.searchkeywords" scope="request"/>
+ <c:set var="groupByEntity" value="language" scope="request" />
+ <c:set var="gridHeader" value="/pages/admin/products/keywords-gridHeader.jsp" scope="request"/>
+ <c:set var="canRemoveEntry" value="true" scope="request"/>
+ <c:set var="canEdit" value="false" scope="request"/>
+
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+ </div>
+ </div>
+ </div>
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/products/keywords-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/products/keywords-gridHeader.jsp
index 0797f65..e6f547d 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/keywords-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/keywords-gridHeader.jsp
@@ -1,11 +1,11 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
- {title:"<s:message code="label.entity.id" text="Id"/>", name:"code", canFilter:false},
- {title:"<s:message code="label.generic.language" text="Language"/>", name:"language"},
- {title:"<s:message code="label.generic.keyword" text="Keyword"/>", name:"keyword"}
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+ {title:"<s:message code="label.entity.id" text="Id"/>", name:"code", canFilter:false},
+ {title:"<s:message code="label.generic.language" text="Language"/>", name:"language"},
+ {title:"<s:message code="label.generic.keyword" text="Keyword"/>", name:"keyword"}
diff --git a/sm-shop/src/main/webapp/pages/admin/products/manufacturer.jsp b/sm-shop/src/main/webapp/pages/admin/products/manufacturer.jsp
index b0f1e42..8bfd692 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/manufacturer.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/manufacturer.jsp
@@ -1,241 +1,241 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-
-
-<%@ page session="false" %>
-
-<link href="<c:url value="/resources/css/bootstrap/css/datepicker.css" />" rel="stylesheet"></link>
-<script src="<c:url value="/resources/js/bootstrap/bootstrap-datepicker.js" />"></script>
-<script src="<c:url value="/resources/js/ckeditor/ckeditor.js" />"></script>
-<script src="<c:url value="/resources/js/jquery.formatCurrency-1.4.0.js" />"></script>
-<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
-<script src="<c:url value="/resources/js/adminFunctions.js" />"></script>
-
-<script type="text/javascript">
-
-
- $(function(){
- $('#order').numeric();
-
- if($("#code").val()=="") {
- $('.btn').addClass('disabled');
- }
-
- <c:forEach items="${manufacturer.descriptions}" var="description" varStatus="counter">
- $("#name${counter.index}").friendurl({id : 'url${counter.index}'});
- </c:forEach>
- });
-
-
- function removeImage(imageId){
- $("#store.error").show();
- $.ajax({
- type: 'POST',
- url: '<c:url value="/admin/manufacturers/manufacturer/removeImage.html"/>',
- data: 'imageId=' + imageId,
- dataType: 'json',
- success: function(response){
-
- var status = isc.XMLTools.selectObjects(response, "/response/status");
- if(status==0 || status ==9999) {
-
- //remove delete
- $("#imageControlRemove").html('');
- //add field
- $("#imageControl").html('<input class=\"input-file\" id=\"image\" name=\"image\" type=\"file\">');
- $(".alert-success").show();
-
- } else {
-
- //display message
- $(".alert-error").show();
- }
-
-
- },
- error: function(xhr, textStatus, errorThrown) {
- alert('error ' + errorThrown);
- }
-
- });
- }
-
-
-
- function validateCode() {
- $('#checkCodeStatus').html('<img src="<c:url value="/resources/img/ajax-loader.gif" />');
- $('#checkCodeStatus').show();
- var code = $("#code").val();
- var id = $("#id").val();
- checkCode(code,id,'<c:url value="/admin/manufacturer/checkCode.html" />');
- }
-
- function callBackCheckCode(msg,code) {
- console.log(code);
- if(code==0) {
- $('.btn').removeClass('disabled');
- }
- if(code==9999) {
-
- $('#checkCodeStatus').html('<font color="green"><s:message code="message.code.available" text="This code is available"/></font>');
- $('#checkCodeStatus').show();
- $('.btn').removeClass('disabled');
- }
- if(code==9998) {
-
- $('#checkCodeStatus').html('<font color="red"><s:message code="message.code.exist" text="This code already exist"/></font>');
- $('#checkCodeStatus').show();
- $('.btn').addClass('disabled');
- }
-
- }
-
-
-</script>
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
- <h3>
- <c:choose>
- <c:when test="${manufacturer.manufacturer.id!=null && manufacturer.manufacturer.id>0}">
- <s:message code="label.manufacturer.edit" text="Edit Manufacturer" /> <c:out value="${product.product.sku}"/>
- </c:when>
- <c:otherwise>
- <s:message code="label.manufacturer.create" text="Create a Manufacturer" />
- </c:otherwise>
- </c:choose>
- </h3>
- <br/><br/>
-
- <c:url var="manufacturerSave" value="/admin/catalogue/manufacturer/save.html"/>
-
- <form:form method="POST" commandName="manufacturer" action="${manufacturerSave}">
-
- <form:hidden path="manufacturer.id" />
-
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
- <div id="store.error" class="alert alert-error" style="display:none;"><s:message code="message.error" text="An error occured"/></div>
-
- <div class="control-group">
- <label><s:message code="label.entity.code" text="Code"/></label>
- <div class="controls">
- <form:input cssClass="input-large highlight" path="code" onblur="validateCode()"/>
- <span class="help-inline"><div id="checkCodeStatus" style="display:none;"></div><form:errors path="code" cssClass="error" /></span>
- </div>
- </div>
-
- <c:forEach items="${manufacturer.descriptions}" var="description" varStatus="counter">
-
- <div class="control-group">
- <label class="required"><s:message code="label.manufactureredit.manufacturername" text="Manufacturer Name"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:input cssClass="input-large highlight" id="name${counter.index}" path="descriptions[${counter.index}].name"/>
- <span class="help-inline"><form:errors path="descriptions[${counter.index}].name" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.manufactureredit.manufacturertitle" text="Manufacturer Title"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:input cssClass="input-large" id="title${counter.index}" path="descriptions[${counter.index}].title"/>
- <span class="help-inline"><form:errors path="descriptions[${counter.index}].title" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.manufactureredit.manufacturerurl" text="URL"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:input cssClass="input-large" id="url${counter.index}" path="descriptions[${counter.index}].url"/>
- <span class="help-inline"><form:errors path="descriptions[${counter.index}].url" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="label.manufactureredit.manufacturerdescription" text="Manufacturer Description"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
-
- <textarea cols="30" id="descriptions${counter.index}.description" name="descriptions[${counter.index}].description">
- <c:out value="${manufacturer.descriptions[counter.index].description}"/>
- </textarea>
- </div>
- <script type="text/javascript">
- //<![CDATA[
-
- CKEDITOR.replace('descriptions[${counter.index}].description',
- {
- skin : 'office2003',
- toolbar :
- [
- ['Source','-','Save','NewPage','Preview'],
- ['Cut','Copy','Paste','PasteText','-','Print'],
- ['Undo','Redo','-','Find','-','SelectAll','RemoveFormat'], '/',
- ['Bold','Italic','Underline','Strike','-','Subscript','Superscript'],
- ['NumberedList','BulletedList','-','Outdent','Indent','Blockquote'],
- ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
- ['Link','Unlink','Anchor'],
- ['Image','Flash','Table','HorizontalRule','SpecialChar','PageBreak'], '/',
- ['Styles','Format','Font','FontSize'], ['TextColor','BGColor'],
- ['Maximize', 'ShowBlocks']
- ],
-
- filebrowserWindowWidth : '720',
- filebrowserWindowHeight : '740',
- filebrowserImageBrowseUrl : '<c:url value="/admin/content/fileBrowser.html"/>'
-
-
- });
-
- //]]>
- </script>
-
- </div>
- <form:hidden path="descriptions[${counter.index}].language.id" />
- <form:hidden path="descriptions[${counter.index}].language.code" />
- <form:hidden path="descriptions[${counter.index}].id" />
-
- </c:forEach>
- <%--
- <div class="control-group">
- <label><s:message code="label.manufacturer.image" text="Image"/> <c:if test="${manufacturer.productImage.productImage!=null && manufacturer.productImage.productImage!=''}"><span id="imageControlRemove"> - <a href="#" onClick="removeImage('${manufacturer.productImage.id}')"><s:message code="label.generic.remove" text="Remove"/></a></span></c:if></label>
- <div class="controls" id="imageControl">
- <c:choose>
- <c:when test="${manufacturer.productImage.productImage==null || manufacturer.productImage.productImage==''}">
- <input class="input-file" id="image" name="image" type="file">
- </c:when>
- <c:otherwise>
- <img src="<sm:manufacturerImage imageName="${manufacturer.productImage.productImage}" manufacturer="${manufacturer.manufacturer}"/>" width="200"/>
- </c:otherwise>
- </c:choose>
- </div>
- </div>
- --%>
- <div class="control-group">
- <label><s:message code="label.manufactureredit.manufacturerorder" text="Order"/></label>
- <div class="controls">
- <form:input id="order" cssClass="input-large" path="order"/>
- <span class="help-inline"><form:errors path="order" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit2" text="Submit"/></button>
- </div>
- </div>
-
- </form:form>
-
- </div>
- </div>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+
+<%@ page session="false" %>
+
+<link href="<c:url value="/resources/css/bootstrap/css/datepicker.css" />" rel="stylesheet"></link>
+<script src="<c:url value="/resources/js/bootstrap/bootstrap-datepicker.js" />"></script>
+<script src="<c:url value="/resources/js/ckeditor/ckeditor.js" />"></script>
+<script src="<c:url value="/resources/js/jquery.formatCurrency-1.4.0.js" />"></script>
+<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
+<script src="<c:url value="/resources/js/adminFunctions.js" />"></script>
+
+<script type="text/javascript">
+
+
+ $(function(){
+ $('#order').numeric();
+
+ if($("#code").val()=="") {
+ $('.btn').addClass('disabled');
+ }
+
+ <c:forEach items="${manufacturer.descriptions}" var="description" varStatus="counter">
+ $("#name${counter.index}").friendurl({id : 'url${counter.index}'});
+ </c:forEach>
+ });
+
+
+ function removeImage(imageId){
+ $("#store.error").show();
+ $.ajax({
+ type: 'POST',
+ url: '<c:url value="/admin/manufacturers/manufacturer/removeImage.html"/>',
+ data: 'imageId=' + imageId,
+ dataType: 'json',
+ success: function(response){
+
+ var status = isc.XMLTools.selectObjects(response, "/response/status");
+ if(status==0 || status ==9999) {
+
+ //remove delete
+ $("#imageControlRemove").html('');
+ //add field
+ $("#imageControl").html('<input class=\"input-file\" id=\"image\" name=\"image\" type=\"file\">');
+ $(".alert-success").show();
+
+ } else {
+
+ //display message
+ $(".alert-error").show();
+ }
+
+
+ },
+ error: function(xhr, textStatus, errorThrown) {
+ alert('error ' + errorThrown);
+ }
+
+ });
+ }
+
+
+
+ function validateCode() {
+ $('#checkCodeStatus').html('<img src="<c:url value="/resources/img/ajax-loader.gif" />');
+ $('#checkCodeStatus').show();
+ var code = $("#code").val();
+ var id = $("#id").val();
+ checkCode(code,id,'<c:url value="/admin/manufacturer/checkCode.html" />');
+ }
+
+ function callBackCheckCode(msg,code) {
+ console.log(code);
+ if(code==0) {
+ $('.btn').removeClass('disabled');
+ }
+ if(code==9999) {
+
+ $('#checkCodeStatus').html('<font color="green"><s:message code="message.code.available" text="This code is available"/></font>');
+ $('#checkCodeStatus').show();
+ $('.btn').removeClass('disabled');
+ }
+ if(code==9998) {
+
+ $('#checkCodeStatus').html('<font color="red"><s:message code="message.code.exist" text="This code already exist"/></font>');
+ $('#checkCodeStatus').show();
+ $('.btn').addClass('disabled');
+ }
+
+ }
+
+
+</script>
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+ <h3>
+ <c:choose>
+ <c:when test="${manufacturer.manufacturer.id!=null && manufacturer.manufacturer.id>0}">
+ <s:message code="label.manufacturer.edit" text="Edit Manufacturer" /> <c:out value="${product.product.sku}"/>
+ </c:when>
+ <c:otherwise>
+ <s:message code="label.manufacturer.create" text="Create a Manufacturer" />
+ </c:otherwise>
+ </c:choose>
+ </h3>
+ <br/><br/>
+
+ <c:url var="manufacturerSave" value="/admin/catalogue/manufacturer/save.html"/>
+
+ <form:form method="POST" commandName="manufacturer" action="${manufacturerSave}">
+
+ <form:hidden path="manufacturer.id" />
+
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+ <div id="store.error" class="alert alert-error" style="display:none;"><s:message code="message.error" text="An error occured"/></div>
+
+ <div class="control-group">
+ <label><s:message code="label.entity.code" text="Code"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" path="code" onblur="validateCode()"/>
+ <span class="help-inline"><div id="checkCodeStatus" style="display:none;"></div><form:errors path="code" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <c:forEach items="${manufacturer.descriptions}" var="description" varStatus="counter">
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.manufactureredit.manufacturername" text="Manufacturer Name"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" id="name${counter.index}" path="descriptions[${counter.index}].name"/>
+ <span class="help-inline"><form:errors path="descriptions[${counter.index}].name" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.manufactureredit.manufacturertitle" text="Manufacturer Title"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:input cssClass="input-large" id="title${counter.index}" path="descriptions[${counter.index}].title"/>
+ <span class="help-inline"><form:errors path="descriptions[${counter.index}].title" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.manufactureredit.manufacturerurl" text="URL"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:input cssClass="input-large" id="url${counter.index}" path="descriptions[${counter.index}].url"/>
+ <span class="help-inline"><form:errors path="descriptions[${counter.index}].url" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.manufactureredit.manufacturerdescription" text="Manufacturer Description"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+
+ <textarea cols="30" id="descriptions${counter.index}.description" name="descriptions[${counter.index}].description">
+ <c:out value="${manufacturer.descriptions[counter.index].description}"/>
+ </textarea>
+ </div>
+ <script type="text/javascript">
+ //<![CDATA[
+
+ CKEDITOR.replace('descriptions[${counter.index}].description',
+ {
+ skin : 'office2003',
+ toolbar :
+ [
+ ['Source','-','Save','NewPage','Preview'],
+ ['Cut','Copy','Paste','PasteText','-','Print'],
+ ['Undo','Redo','-','Find','-','SelectAll','RemoveFormat'], '/',
+ ['Bold','Italic','Underline','Strike','-','Subscript','Superscript'],
+ ['NumberedList','BulletedList','-','Outdent','Indent','Blockquote'],
+ ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
+ ['Link','Unlink','Anchor'],
+ ['Image','Flash','Table','HorizontalRule','SpecialChar','PageBreak'], '/',
+ ['Styles','Format','Font','FontSize'], ['TextColor','BGColor'],
+ ['Maximize', 'ShowBlocks']
+ ],
+
+ filebrowserWindowWidth : '720',
+ filebrowserWindowHeight : '740',
+ filebrowserImageBrowseUrl : '<c:url value="/admin/content/fileBrowser.html"/>'
+
+
+ });
+
+ //]]>
+ </script>
+
+ </div>
+ <form:hidden path="descriptions[${counter.index}].language.id" />
+ <form:hidden path="descriptions[${counter.index}].language.code" />
+ <form:hidden path="descriptions[${counter.index}].id" />
+
+ </c:forEach>
+ <%--
+ <div class="control-group">
+ <label><s:message code="label.manufacturer.image" text="Image"/> <c:if test="${manufacturer.productImage.productImage!=null && manufacturer.productImage.productImage!=''}"><span id="imageControlRemove"> - <a href="#" onClick="removeImage('${manufacturer.productImage.id}')"><s:message code="label.generic.remove" text="Remove"/></a></span></c:if></label>
+ <div class="controls" id="imageControl">
+ <c:choose>
+ <c:when test="${manufacturer.productImage.productImage==null || manufacturer.productImage.productImage==''}">
+ <input class="input-file" id="image" name="image" type="file">
+ </c:when>
+ <c:otherwise>
+ <img src="<sm:manufacturerImage imageName="${manufacturer.productImage.productImage}" manufacturer="${manufacturer.manufacturer}"/>" width="200"/>
+ </c:otherwise>
+ </c:choose>
+ </div>
+ </div>
+ --%>
+ <div class="control-group">
+ <label><s:message code="label.manufactureredit.manufacturerorder" text="Order"/></label>
+ <div class="controls">
+ <form:input id="order" cssClass="input-large" path="order"/>
+ <span class="help-inline"><form:errors path="order" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit2" text="Submit"/></button>
+ </div>
+ </div>
+
+ </form:form>
+
+ </div>
+ </div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/products/manufacturers.jsp b/sm-shop/src/main/webapp/pages/admin/products/manufacturers.jsp
index 9a81a41..542b33e 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/manufacturers.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/manufacturers.jsp
@@ -1,62 +1,62 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
-
- <h3>
- <s:message code="menu.manufacturer-list" text="Manufacturers" />
- </h3>
- <br/>
-
-
-
- <!-- Listing grid include -->
- <c:set value="/admin/catalogue/manufacturer/paging.html" var="pagingUrl" scope="request"/>
- <c:set value="/admin/catalogue/manufacturer/remove.html" var="removeUrl" scope="request"/>
- <c:set value="/admin/catalogue/manufacturer/edit.html" var="editUrl" scope="request"/>
- <c:set value="/admin/catalogue/manufacturer/list.html" var="afterRemoveUrl" scope="request"/>
- <c:set var="entityId" value="id" scope="request"/>
- <c:set var="componentTitleKey" value="menu.manufacturer-list" scope="request"/>
- <c:set var="gridHeader" value="/pages/admin/products/manufacturers-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="true" scope="request"/>
-
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
-
-
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+
+ <h3>
+ <s:message code="menu.manufacturer-list" text="Manufacturers" />
+ </h3>
+ <br/>
+
+
+
+ <!-- Listing grid include -->
+ <c:set value="/admin/catalogue/manufacturer/paging.html" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/catalogue/manufacturer/remove.html" var="removeUrl" scope="request"/>
+ <c:set value="/admin/catalogue/manufacturer/edit.html" var="editUrl" scope="request"/>
+ <c:set value="/admin/catalogue/manufacturer/list.html" var="afterRemoveUrl" scope="request"/>
+ <c:set var="entityId" value="id" scope="request"/>
+ <c:set var="componentTitleKey" value="menu.manufacturer-list" scope="request"/>
+ <c:set var="gridHeader" value="/pages/admin/products/manufacturers-gridHeader.jsp" scope="request"/>
+ <c:set var="canRemoveEntry" value="true" scope="request"/>
+
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+
+
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/products/manufacturers-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/products/manufacturers-gridHeader.jsp
index 0a65d8a..364fa1f 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/manufacturers-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/manufacturers-gridHeader.jsp
@@ -1,13 +1,13 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
- {title:"<s:message code="label.entity.id" text="Id"/>", name:"id", canFilter:false},
- {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false},
- {title:"<s:message code="label.entity.code" text="Code"/>", name:"code", canFilter:true},
- {title:"<s:message code="label.entity.order" text="Order"/>", name:"order", canFilter:false},
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+ {title:"<s:message code="label.entity.id" text="Id"/>", name:"id", canFilter:false},
+ {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false},
+ {title:"<s:message code="label.entity.code" text="Code"/>", name:"code", canFilter:true},
+ {title:"<s:message code="label.entity.order" text="Order"/>", name:"order", canFilter:false},
{title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
\ No newline at end of file
sm-shop/src/main/webapp/pages/admin/products/option.jsp 274(+137 -137)
diff --git a/sm-shop/src/main/webapp/pages/admin/products/option.jsp b/sm-shop/src/main/webapp/pages/admin/products/option.jsp
index d0d0e31..ef48bbb 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/option.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/option.jsp
@@ -1,138 +1,138 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
- <div class="sm-ui-component">
-
-
- <h3>
- <s:message code="label.product.productoptions.title" text="Option management" />
- </h3>
-
-
- <h3>
- <c:choose>
- <c:when test="${option.id!=null && option.id>0}">
- <s:message code="label.product.productoptions.edit.title" text="Edit option" />
- </c:when>
- <c:otherwise>
- <s:message code="label.product.productoptions.create.title" text="Create option" />
- </c:otherwise>
- </c:choose>
-
- </h3>
- <br/>
-
- <c:url var="optionSave" value="/admin/options/save.html"/>
-
-
- <form:form method="POST" commandName="option" action="${optionSave}">
-
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
-
-
- <div class="control-group">
- <label><s:message code="label.product.option.code" text="Option code"/></label>
- <div class="controls">
- <form:input cssClass="highlight" id="code" path="code"/>
- <span class="help-inline"><form:errors path="code" cssClass="error" /></span>
- </div>
- </div>
-
- <c:forEach items="${option.descriptionsSettoList}" var="description" varStatus="counter">
-
- <div class="control-group">
- <label class="required"><s:message code="label.product.productoptions.name" text="Option name"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:input id="name${counter.index}" path="descriptionsList[${counter.index}].name"/>
- <span class="help-inline"><form:errors path="descriptionsList[${counter.index}].name" cssClass="error" /></span>
- </div>
-
- </div>
-
-
- <form:hidden path="descriptionsList[${counter.index}].language.code" />
- <form:hidden path="descriptionsList[${counter.index}].id" />
-
- </c:forEach>
-
-
- <div class="control-group">
- <label><s:message code="label.product.productoptions.type" text="Option type"/></label>
- <div class="controls">
-
- <div class="controls">
- <form:select path="productOptionType">
- <s:message code="label.product.productoption.type.text" text="Text" var="vText" />
- <s:message code="label.product.productoption.type.select" text="Select" var="vSelect"/>
- <s:message code="label.product.productoption.type.radio" text="Radio" var="vRadio"/>
- <s:message code="label.product.productoption.type.checkbox" text="Checkbox" var="vCheckbox"/>
- <form:option value="text" label="${vText}" />
- <form:option value="select" label="${vSelect}" />
- <form:option value="radio" label="${vRadio}" />
- <form:option value="checkbox" label="${vCheckbox}" />
- </form:select>
- <span class="help-inline"><form:errors path="productOptionType" cssClass="error" /></span>
- </div>
-
- </div>
- </div>
-
-
- <form:hidden path="id" />
-
- <div class="form-actions">
-
- <div class="pull-right">
-
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
-
-
- </div>
-
- </div>
-
- </form:form>
-
-
- <br/>
-
-
-
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+ <div class="sm-ui-component">
+
+
+ <h3>
+ <s:message code="label.product.productoptions.title" text="Option management" />
+ </h3>
+
+
+ <h3>
+ <c:choose>
+ <c:when test="${option.id!=null && option.id>0}">
+ <s:message code="label.product.productoptions.edit.title" text="Edit option" />
+ </c:when>
+ <c:otherwise>
+ <s:message code="label.product.productoptions.create.title" text="Create option" />
+ </c:otherwise>
+ </c:choose>
+
+ </h3>
+ <br/>
+
+ <c:url var="optionSave" value="/admin/options/save.html"/>
+
+
+ <form:form method="POST" commandName="option" action="${optionSave}">
+
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+
+
+ <div class="control-group">
+ <label><s:message code="label.product.option.code" text="Option code"/></label>
+ <div class="controls">
+ <form:input cssClass="highlight" id="code" path="code"/>
+ <span class="help-inline"><form:errors path="code" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <c:forEach items="${option.descriptionsSettoList}" var="description" varStatus="counter">
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.product.productoptions.name" text="Option name"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:input id="name${counter.index}" path="descriptionsList[${counter.index}].name"/>
+ <span class="help-inline"><form:errors path="descriptionsList[${counter.index}].name" cssClass="error" /></span>
+ </div>
+
+ </div>
+
+
+ <form:hidden path="descriptionsList[${counter.index}].language.code" />
+ <form:hidden path="descriptionsList[${counter.index}].id" />
+
+ </c:forEach>
+
+
+ <div class="control-group">
+ <label><s:message code="label.product.productoptions.type" text="Option type"/></label>
+ <div class="controls">
+
+ <div class="controls">
+ <form:select path="productOptionType">
+ <s:message code="label.product.productoption.type.text" text="Text" var="vText" />
+ <s:message code="label.product.productoption.type.select" text="Select" var="vSelect"/>
+ <s:message code="label.product.productoption.type.radio" text="Radio" var="vRadio"/>
+ <s:message code="label.product.productoption.type.checkbox" text="Checkbox" var="vCheckbox"/>
+ <form:option value="text" label="${vText}" />
+ <form:option value="select" label="${vSelect}" />
+ <form:option value="radio" label="${vRadio}" />
+ <form:option value="checkbox" label="${vCheckbox}" />
+ </form:select>
+ <span class="help-inline"><form:errors path="productOptionType" cssClass="error" /></span>
+ </div>
+
+ </div>
+ </div>
+
+
+ <form:hidden path="id" />
+
+ <div class="form-actions">
+
+ <div class="pull-right">
+
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
+
+
+ </div>
+
+ </div>
+
+ </form:form>
+
+
+ <br/>
+
+
+
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/products/options.jsp b/sm-shop/src/main/webapp/pages/admin/products/options.jsp
index 5863b2f..f754b21 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/options.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/options.jsp
@@ -1,62 +1,62 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
- <div class="sm-ui-component">
-
-
- <h3>
- <s:message code="label.product.productoptions.title" text="Option management" />
- </h3>
- <br/>
-
- <!-- Listing grid include -->
- <c:set value="/admin/options/paging.html" var="pagingUrl" scope="request"/>
- <c:set value="/admin/options/remove.html" var="removeUrl" scope="request"/>
- <c:set value="/admin/options/editOption.html" var="editUrl" scope="request"/>
- <c:set value="/admin/options/options.html" var="afterRemoveUrl" scope="request"/>
- <c:set var="entityId" value="optionId" scope="request"/>
- <c:set var="componentTitleKey" value="label.product.productoptions.list" scope="request"/>
- <c:set var="gridHeader" value="/pages/admin/products/options-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="true" scope="request"/>
-
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
-
-
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+ <div class="sm-ui-component">
+
+
+ <h3>
+ <s:message code="label.product.productoptions.title" text="Option management" />
+ </h3>
+ <br/>
+
+ <!-- Listing grid include -->
+ <c:set value="/admin/options/paging.html" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/options/remove.html" var="removeUrl" scope="request"/>
+ <c:set value="/admin/options/editOption.html" var="editUrl" scope="request"/>
+ <c:set value="/admin/options/options.html" var="afterRemoveUrl" scope="request"/>
+ <c:set var="entityId" value="optionId" scope="request"/>
+ <c:set var="componentTitleKey" value="label.product.productoptions.list" scope="request"/>
+ <c:set var="gridHeader" value="/pages/admin/products/options-gridHeader.jsp" scope="request"/>
+ <c:set var="canRemoveEntry" value="true" scope="request"/>
+
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+
+
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/products/options-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/products/options-gridHeader.jsp
index 1a5f6ef..ca7540f 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/options-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/options-gridHeader.jsp
@@ -1,12 +1,12 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
- {title:"<s:message code="label.entity.id" text="Id"/>", name:"optionId", canFilter:false},
- {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false},
- {title:"<s:message code="label.entity.type" text="Type"/>", name:"type", canFilter:false},
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+ {title:"<s:message code="label.entity.id" text="Id"/>", name:"optionId", canFilter:false},
+ {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false},
+ {title:"<s:message code="label.entity.type" text="Type"/>", name:"type", canFilter:false},
{title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/products/optionsValues.jsp b/sm-shop/src/main/webapp/pages/admin/products/optionsValues.jsp
index f2fc2c2..7e7229b 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/optionsValues.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/optionsValues.jsp
@@ -1,64 +1,64 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
- <div class="sm-ui-component">
-
-
- <h3>
- <s:message code="label.product.productoptionsvalues.title" text="Product options values" />
- </h3>
- <br/>
-
-
-
- <!-- Listing grid include -->
- <c:set value="/admin/optionsvalues/paging.html" var="pagingUrl" scope="request"/>
- <c:set value="/admin/optionsvalues/remove.html" var="removeUrl" scope="request"/>
- <c:set value="/admin/options/editOptionValue.html" var="editUrl" scope="request"/>
- <c:set value="/admin/options/optionvalues.html" var="afterRemoveUrl" scope="request"/>
- <c:set var="entityId" value="optionValueId" scope="request"/>
- <c:set var="componentTitleKey" value="label.product.productoptionsvalues.list" scope="request"/>
- <c:set var="gridHeader" value="/pages/admin/products/optionsValues-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="true" scope="request"/>
-
-
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
-
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+ <div class="sm-ui-component">
+
+
+ <h3>
+ <s:message code="label.product.productoptionsvalues.title" text="Product options values" />
+ </h3>
+ <br/>
+
+
+
+ <!-- Listing grid include -->
+ <c:set value="/admin/optionsvalues/paging.html" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/optionsvalues/remove.html" var="removeUrl" scope="request"/>
+ <c:set value="/admin/options/editOptionValue.html" var="editUrl" scope="request"/>
+ <c:set value="/admin/options/optionvalues.html" var="afterRemoveUrl" scope="request"/>
+ <c:set var="entityId" value="optionValueId" scope="request"/>
+ <c:set var="componentTitleKey" value="label.product.productoptionsvalues.list" scope="request"/>
+ <c:set var="gridHeader" value="/pages/admin/products/optionsValues-gridHeader.jsp" scope="request"/>
+ <c:set var="canRemoveEntry" value="true" scope="request"/>
+
+
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/products/optionsValues-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/products/optionsValues-gridHeader.jsp
index a6be0d4..38255c2 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/optionsValues-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/optionsValues-gridHeader.jsp
@@ -1,12 +1,12 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-<!-- {title:"<s:message code="label.product.image" text="Image"/>", name:"image", type:"image", imageWidth:75, imageURLPrefix:"<c:url value='/static/'/>", canFilter:false}, -->
-
- {title:"<s:message code="label.entity.id" text="Id"/>", name:"optionValueId", canFilter:false},
- {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false},
- {title:"<s:message code="label.product.image" text="Image"/>", name:"image", type:"image", imageWidth:75, imageURLPrefix:"<c:url value='/'/>", canFilter:false},
- {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+<!-- {title:"<s:message code="label.product.image" text="Image"/>", name:"image", type:"image", imageWidth:75, imageURLPrefix:"<c:url value='/static/'/>", canFilter:false}, -->
+
+ {title:"<s:message code="label.entity.id" text="Id"/>", name:"optionValueId", canFilter:false},
+ {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false},
+ {title:"<s:message code="label.product.image" text="Image"/>", name:"image", type:"image", imageWidth:75, imageURLPrefix:"<c:url value='/'/>", canFilter:false},
+ {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
sm-shop/src/main/webapp/pages/admin/products/optionValue.jsp 268(+134 -134)
diff --git a/sm-shop/src/main/webapp/pages/admin/products/optionValue.jsp b/sm-shop/src/main/webapp/pages/admin/products/optionValue.jsp
index 8ef526a..ec56f91 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/optionValue.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/optionValue.jsp
@@ -1,135 +1,135 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-<%@ page session="false" %>
-
-
-
-<script type="text/javascript">
-
- function removeImage(id){
- $("#store.error").show();
- $.ajax({
- type: 'POST',
- url: '<c:url value="/admin/optionsvalues/removeImage.html"/>',
- dataType: 'json',
- data: 'optionId=' + id,
- success: function(response){
-
- var status = isc.XMLTools.selectObjects(response, "/response/status");
- if(status==0 || status ==9999) {
-
- //remove delete
- $("#imageControlRemove").html('');
- //add field
- $("#imageControl").html('<input class=\"input-file\" id=\"image\" name=\"image\" type=\"file\">');
- $(".alert-success").show();
-
- } else {
-
- //display message
- $(".alert-error").show();
- }
-
-
- },
- error: function(xhr, textStatus, errorThrown) {
- alert('error ' + errorThrown);
- }
-
- });
- }
-
-</script>
-
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
- <div class="tab-content">
- <div class="tab-pane active" id="catalogue-section">
- <div class="sm-ui-component">
-
- <h3>
- <c:choose>
- <c:when test="${optionValue.id!=null && optionValue.id>0}">
- <s:message code="label.product.productoptionvalue.edit.title" text="Edit option value" />
- </c:when>
- <c:otherwise>
- <s:message code="label.product.productoptionvalue.create.title" text="Create option value" />
- </c:otherwise>
- </c:choose>
- </h3>
- <br/>
-
- <c:url var="optionSave" value="/admin/options/saveOptionValue.html"/>
-
-
- <form:form method="POST" enctype="multipart/form-data" commandName="optionValue" action="${optionSave}">
-
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
-
- <div class="control-group">
- <label><s:message code="label.entity.code" text="Option value code"/></label>
- <div class="controls">
- <form:input cssClass="highlight" id="code" path="code"/>
- <span class="help-inline"><form:errors path="code" cssClass="error" /></span>
- </div>
- </div>
-
- <c:forEach items="${optionValue.descriptionsSettoList}" var="description" varStatus="counter">
-
- <div class="control-group">
- <label class="required"><s:message code="label.product.productoptions.name" text="Option name"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:input cssClass="highlight" id="name${counter.index}" path="descriptionsList[${counter.index}].name"/>
- <span class="help-inline"><form:errors path="descriptionsList[${counter.index}].name" cssClass="error" /></span>
- </div>
-
- </div>
-
-
- <form:hidden path="descriptionsList[${counter.index}].language.code" />
- <form:hidden path="descriptionsList[${counter.index}].id" />
-
- </c:forEach>
-
-
- <div class="control-group">
- <label><s:message code="label.product.image" text="Image"/> <c:if test="${optionValue.productOptionValueImage!=null && optionValue.productOptionValueImage!=''}"><span id="imageControlRemove"> - <a href="#" onClick="removeImage('${optionValue.id}')"><s:message code="label.generic.remove" text="Remove"/></a></span></c:if></label>
- <div class="controls" id="imageControl">
- <c:choose>
- <c:when test="${optionValue.productOptionValueImage==null || optionValue.productOptionValueImage==''}">
- <input class="input-file" id="image" name="image" type="file">
- </c:when>
- <c:otherwise>
- <img src="<c:url value=""/><sm:contentImage imageName="${optionValue.productOptionValueImage}" imageType="PROPERTY"/>" width="80">
- </c:otherwise>
- </c:choose>
- </div>
- </div>
- <form:hidden path="productOptionValueImage" />
- <form:hidden path="id" />
-
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
- </div>
- </div>
-
- </form:form>
-
-
- <br/>
-
- </div>
- </div>
- </div>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+<%@ page session="false" %>
+
+
+
+<script type="text/javascript">
+
+ function removeImage(id){
+ $("#store.error").show();
+ $.ajax({
+ type: 'POST',
+ url: '<c:url value="/admin/optionsvalues/removeImage.html"/>',
+ dataType: 'json',
+ data: 'optionId=' + id,
+ success: function(response){
+
+ var status = isc.XMLTools.selectObjects(response, "/response/status");
+ if(status==0 || status ==9999) {
+
+ //remove delete
+ $("#imageControlRemove").html('');
+ //add field
+ $("#imageControl").html('<input class=\"input-file\" id=\"image\" name=\"image\" type=\"file\">');
+ $(".alert-success").show();
+
+ } else {
+
+ //display message
+ $(".alert-error").show();
+ }
+
+
+ },
+ error: function(xhr, textStatus, errorThrown) {
+ alert('error ' + errorThrown);
+ }
+
+ });
+ }
+
+</script>
+
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+ <div class="tab-content">
+ <div class="tab-pane active" id="catalogue-section">
+ <div class="sm-ui-component">
+
+ <h3>
+ <c:choose>
+ <c:when test="${optionValue.id!=null && optionValue.id>0}">
+ <s:message code="label.product.productoptionvalue.edit.title" text="Edit option value" />
+ </c:when>
+ <c:otherwise>
+ <s:message code="label.product.productoptionvalue.create.title" text="Create option value" />
+ </c:otherwise>
+ </c:choose>
+ </h3>
+ <br/>
+
+ <c:url var="optionSave" value="/admin/options/saveOptionValue.html"/>
+
+
+ <form:form method="POST" enctype="multipart/form-data" commandName="optionValue" action="${optionSave}">
+
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.entity.code" text="Option value code"/></label>
+ <div class="controls">
+ <form:input cssClass="highlight" id="code" path="code"/>
+ <span class="help-inline"><form:errors path="code" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <c:forEach items="${optionValue.descriptionsSettoList}" var="description" varStatus="counter">
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.product.productoptions.name" text="Option name"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:input cssClass="highlight" id="name${counter.index}" path="descriptionsList[${counter.index}].name"/>
+ <span class="help-inline"><form:errors path="descriptionsList[${counter.index}].name" cssClass="error" /></span>
+ </div>
+
+ </div>
+
+
+ <form:hidden path="descriptionsList[${counter.index}].language.code" />
+ <form:hidden path="descriptionsList[${counter.index}].id" />
+
+ </c:forEach>
+
+
+ <div class="control-group">
+ <label><s:message code="label.product.image" text="Image"/> <c:if test="${optionValue.productOptionValueImage!=null && optionValue.productOptionValueImage!=''}"><span id="imageControlRemove"> - <a href="#" onClick="removeImage('${optionValue.id}')"><s:message code="label.generic.remove" text="Remove"/></a></span></c:if></label>
+ <div class="controls" id="imageControl">
+ <c:choose>
+ <c:when test="${optionValue.productOptionValueImage==null || optionValue.productOptionValueImage==''}">
+ <input class="input-file" id="image" name="image" type="file">
+ </c:when>
+ <c:otherwise>
+ <img src="<c:url value=""/><sm:contentImage imageName="${optionValue.productOptionValueImage}" imageType="PROPERTY"/>" width="80">
+ </c:otherwise>
+ </c:choose>
+ </div>
+ </div>
+ <form:hidden path="productOptionValueImage" />
+ <form:hidden path="id" />
+
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
+ </div>
+ </div>
+
+ </form:form>
+
+
+ <br/>
+
+ </div>
+ </div>
+ </div>
</div>
\ No newline at end of file
sm-shop/src/main/webapp/pages/admin/products/price.jsp 408(+204 -204)
diff --git a/sm-shop/src/main/webapp/pages/admin/products/price.jsp b/sm-shop/src/main/webapp/pages/admin/products/price.jsp
index 6e3c174..964ec06 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/price.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/price.jsp
@@ -1,205 +1,205 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-<script type="text/javascript">
-var priceFormatMessage = '<s:message code="message.price.cents" text="Wrong format" />';
-</script>
-
-<link href="<c:url value="/resources/css/bootstrap/css/datepicker.css" />" rel="stylesheet"></link>
-<script src="<c:url value="/resources/js/bootstrap/bootstrap-datepicker.js" />"></script>
-<script src="<c:url value="/resources/js/jquery.formatCurrency-1.4.0.js" />"></script>
-<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
-<script src="<c:url value="/resources/js/adminFunctions.js" />"></script>
-
-
-<script type="text/javascript">
- $(function(){
-
- $('#productSpecialPriceAmount').blur(function() {
- $('#help-price').html(null);
- $(this).formatCurrency({ roundToDecimalPlace: 2, eventOnDecimalsEntered: true, symbol: ''});
- })
- .keyup(function(e) {
- var e = window.event || e;
- var keyUnicode = e.charCode || e.keyCode;
- if (e !== undefined) {
- switch (keyUnicode) {
- case 16: break; // Shift
- case 17: break; // Ctrl
- case 18: break; // Alt
- case 27: this.value = ''; break; // Esc: clear entry
- case 35: break; // End
- case 36: break; // Home
- case 37: break; // cursor left
- case 38: break; // cursor up
- case 39: break; // cursor right
- case 40: break; // cursor down
- case 78: break; // N (Opera 9.63+ maps the "." from the number key section to the "N" key too!) (See: http://unixpapa.com/js/key.html search for ". Del")
- case 110: break; // . number block (Opera 9.63+ maps the "." from the number block to the "N" key (78) !!!)
- case 190: break; // .
- default: $(this).formatCurrency({ colorize: true, negativeFormat: '-%s%n', roundToDecimalPlace: -1, eventOnDecimalsEntered: true, symbol: ''});
- }
- }
- })
- .bind('decimalsEntered', function(e, cents) {
- if (String(cents).length > 2) {
- var errorMsg = priceFormatMessage + ' (0.' + cents + ')';
- $('#help-special-price').html(errorMsg);
- }
- });
-
- $('#productSpecialPriceAmount').numeric({allow:"."});
-
-
- });
-
-</script>
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
- <div class="sm-ui-component">
-
- <c:if test="${product.id!=null && product.id>0}">
- <c:set value="${product.id}" var="productId" scope="request"/>
- <jsp:include page="/pages/admin/products/product-menu.jsp" />
- </c:if>
-
-
- <h3>
- <s:message code="label.product.price" text="Product price" />
- </h3>
- <br/>
- <strong><c:out value="${product.sku}"/></strong>
-
-
- <br/><br/>
-
-
- <c:url var="saveProductPrice" value="/admin/products/price/save.html"/>
-
-
- <form:form method="POST" commandName="price" action="${saveProductPrice}">
-
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
- <div class="control-group">
- <label class="required"><s:message code="label.product.price" text="Price"/></label>
- <div class="controls">
- <form:input id="productPriceAmount" cssClass="highlight" path="priceText"/>
- <span id="help-price" class="help-inline"><form:errors path="priceText" cssClass="error" /></span>
- </div>
- </div>
-
-
- <div class="control-group">
- <label><s:message code="label.product.price.default" text="Default price"/></label>
- <div class="controls">
- <form:checkbox path="price.defaultPrice" />
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.product.price.code" text="Product price code"/></label>
- <div class="controls">
- <form:input cssClass="highlight" path="price.code"/>
- <span class="help-inline"><form:errors path="price.code" cssClass="error" /></span>
- </div>
- </div>
-
- <c:forEach items="${price.descriptions}" var="description" varStatus="counter">
-
- <div class="control-group">
-
- <label class="required"><s:message code="label.product.price.name" text="Product price name"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:input cssClass="input-large highlight" id="name${counter.index}" path="descriptions[${counter.index}].name"/>
- <span class="help-inline"><form:errors path="descriptions[${counter.index}].name" cssClass="error" /></span>
- </div>
- </div>
-
- <form:hidden path="descriptions[${counter.index}].language.id" />
- <form:hidden path="descriptions[${counter.index}].language.code" />
- <form:hidden path="descriptions[${counter.index}].id" />
-
- </c:forEach>
-
-
- <div class="control-group">
- <label class="required"><s:message code="label.product.price.special" text="Special price"/></label>
- <div class="controls">
- <form:input id="productSpecialPriceAmount" cssClass="" path="specialPriceText"/>
- <span id="help-special-price" class="help-inline"><form:errors path="specialPriceText" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.product.price.special.startdate" text="Special start date"/></label>
- <div class="controls">
- <input name="productPriceSpecialStartDate" id="productPriceSpecialStartDate" value="${price.price.productPriceSpecialStartDate}" class="small" type="text" data-datepicker="datepicker">
- <span class="help-inline"><form:errors path="productPriceSpecialStartDate" cssClass="error" /></span>
- </div>
- </div>
-
-
- <div class="control-group">
- <label><s:message code="label.product.price.special.enddate" text="Special end date"/></label>
- <div class="controls">
- <input name="productPriceSpecialEndDate" id="productPriceSpecialEndDate" value="${price.price.productPriceSpecialEndDate}" class="small" type="text" data-datepicker="datepicker">
- <span class="help-inline"><form:errors path="productPriceSpecialEndDate" cssClass="error" /></span>
- </div>
- </div>
-
- <!-- default one time -->
- <form:hidden path="price.productPriceType" />
- <form:hidden path="price.id" />
- <form:hidden path="productAvailability.region" />
- <form:hidden path="productAvailability.id" />
- <form:hidden path="product.id" />
-
- <div class="form-actions">
-
- <div class="pull-right">
-
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
-
- </div>
- </div>
-
- </form:form>
-
-
- <br/>
-
-
-
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+<script type="text/javascript">
+var priceFormatMessage = '<s:message code="message.price.cents" text="Wrong format" />';
+</script>
+
+<link href="<c:url value="/resources/css/bootstrap/css/datepicker.css" />" rel="stylesheet"></link>
+<script src="<c:url value="/resources/js/bootstrap/bootstrap-datepicker.js" />"></script>
+<script src="<c:url value="/resources/js/jquery.formatCurrency-1.4.0.js" />"></script>
+<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
+<script src="<c:url value="/resources/js/adminFunctions.js" />"></script>
+
+
+<script type="text/javascript">
+ $(function(){
+
+ $('#productSpecialPriceAmount').blur(function() {
+ $('#help-price').html(null);
+ $(this).formatCurrency({ roundToDecimalPlace: 2, eventOnDecimalsEntered: true, symbol: ''});
+ })
+ .keyup(function(e) {
+ var e = window.event || e;
+ var keyUnicode = e.charCode || e.keyCode;
+ if (e !== undefined) {
+ switch (keyUnicode) {
+ case 16: break; // Shift
+ case 17: break; // Ctrl
+ case 18: break; // Alt
+ case 27: this.value = ''; break; // Esc: clear entry
+ case 35: break; // End
+ case 36: break; // Home
+ case 37: break; // cursor left
+ case 38: break; // cursor up
+ case 39: break; // cursor right
+ case 40: break; // cursor down
+ case 78: break; // N (Opera 9.63+ maps the "." from the number key section to the "N" key too!) (See: http://unixpapa.com/js/key.html search for ". Del")
+ case 110: break; // . number block (Opera 9.63+ maps the "." from the number block to the "N" key (78) !!!)
+ case 190: break; // .
+ default: $(this).formatCurrency({ colorize: true, negativeFormat: '-%s%n', roundToDecimalPlace: -1, eventOnDecimalsEntered: true, symbol: ''});
+ }
+ }
+ })
+ .bind('decimalsEntered', function(e, cents) {
+ if (String(cents).length > 2) {
+ var errorMsg = priceFormatMessage + ' (0.' + cents + ')';
+ $('#help-special-price').html(errorMsg);
+ }
+ });
+
+ $('#productSpecialPriceAmount').numeric({allow:"."});
+
+
+ });
+
+</script>
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+ <div class="sm-ui-component">
+
+ <c:if test="${product.id!=null && product.id>0}">
+ <c:set value="${product.id}" var="productId" scope="request"/>
+ <jsp:include page="/pages/admin/products/product-menu.jsp" />
+ </c:if>
+
+
+ <h3>
+ <s:message code="label.product.price" text="Product price" />
+ </h3>
+ <br/>
+ <strong><c:out value="${product.sku}"/></strong>
+
+
+ <br/><br/>
+
+
+ <c:url var="saveProductPrice" value="/admin/products/price/save.html"/>
+
+
+ <form:form method="POST" commandName="price" action="${saveProductPrice}">
+
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.product.price" text="Price"/></label>
+ <div class="controls">
+ <form:input id="productPriceAmount" cssClass="highlight" path="priceText"/>
+ <span id="help-price" class="help-inline"><form:errors path="priceText" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.product.price.default" text="Default price"/></label>
+ <div class="controls">
+ <form:checkbox path="price.defaultPrice" />
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.product.price.code" text="Product price code"/></label>
+ <div class="controls">
+ <form:input cssClass="highlight" path="price.code"/>
+ <span class="help-inline"><form:errors path="price.code" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <c:forEach items="${price.descriptions}" var="description" varStatus="counter">
+
+ <div class="control-group">
+
+ <label class="required"><s:message code="label.product.price.name" text="Product price name"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" id="name${counter.index}" path="descriptions[${counter.index}].name"/>
+ <span class="help-inline"><form:errors path="descriptions[${counter.index}].name" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <form:hidden path="descriptions[${counter.index}].language.id" />
+ <form:hidden path="descriptions[${counter.index}].language.code" />
+ <form:hidden path="descriptions[${counter.index}].id" />
+
+ </c:forEach>
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.product.price.special" text="Special price"/></label>
+ <div class="controls">
+ <form:input id="productSpecialPriceAmount" cssClass="" path="specialPriceText"/>
+ <span id="help-special-price" class="help-inline"><form:errors path="specialPriceText" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.product.price.special.startdate" text="Special start date"/></label>
+ <div class="controls">
+ <input name="productPriceSpecialStartDate" id="productPriceSpecialStartDate" value="${price.price.productPriceSpecialStartDate}" class="small" type="text" data-datepicker="datepicker">
+ <span class="help-inline"><form:errors path="productPriceSpecialStartDate" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.product.price.special.enddate" text="Special end date"/></label>
+ <div class="controls">
+ <input name="productPriceSpecialEndDate" id="productPriceSpecialEndDate" value="${price.price.productPriceSpecialEndDate}" class="small" type="text" data-datepicker="datepicker">
+ <span class="help-inline"><form:errors path="productPriceSpecialEndDate" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <!-- default one time -->
+ <form:hidden path="price.productPriceType" />
+ <form:hidden path="price.id" />
+ <form:hidden path="productAvailability.region" />
+ <form:hidden path="productAvailability.id" />
+ <form:hidden path="product.id" />
+
+ <div class="form-actions">
+
+ <div class="pull-right">
+
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
+
+ </div>
+ </div>
+
+ </form:form>
+
+
+ <br/>
+
+
+
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/products/prices.jsp b/sm-shop/src/main/webapp/pages/admin/products/prices.jsp
index 0642587..9fe06a2 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/prices.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/prices.jsp
@@ -1,73 +1,73 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
- <div class="sm-ui-component">
-
-
- <c:if test="${product.id!=null && product.id>0}">
- <c:set value="${product.id}" var="productId" scope="request"/>
- <jsp:include page="/pages/admin/products/product-menu.jsp" />
- </c:if>
-
-
-
-
- <h3><s:message code="label.product.prices" text="Product prices" /></h3>
- <br/>
- <strong><c:out value="${product.sku}"/></strong>
-
- <br/>
- <a href="<c:url value="/admin/products/price/create.html?productId=${product.id}&availabilityId=${availability.id}"/>"><s:message code="label.product.price.create" text="Create price" /></a>
- <br/><br/>
-
- <!-- Listing grid include -->
-
- <c:set value="/admin/products/prices/paging.html?productId=${product.id}" var="pagingUrl" scope="request"/>
- <c:set value="/admin/products/price/remove.html?productId=${product.id}" var="removeUrl" scope="request"/>
- <c:set value="/admin/products/price/edit.html" var="editUrl" scope="request"/>
- <c:set value="/admin/products/prices.html?id=${product.id}" var="afterRemoveUrl" scope="request"/>
- <c:set var="entityId" value="priceId" scope="request"/>
- <c:set var="appendQueryStringToEdit" value="productId=${product.id}" scope="request"/>
- <c:set var="componentTitleKey" value="label.product.prices" scope="request"/>
- <c:set var="gridHeader" value="/pages/admin/products/prices-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="true" scope="request"/>
-
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+ <div class="sm-ui-component">
+
+
+ <c:if test="${product.id!=null && product.id>0}">
+ <c:set value="${product.id}" var="productId" scope="request"/>
+ <jsp:include page="/pages/admin/products/product-menu.jsp" />
+ </c:if>
+
+
+
+
+ <h3><s:message code="label.product.prices" text="Product prices" /></h3>
+ <br/>
+ <strong><c:out value="${product.sku}"/></strong>
+
+ <br/>
+ <a href="<c:url value="/admin/products/price/create.html?productId=${product.id}&availabilityId=${availability.id}"/>"><s:message code="label.product.price.create" text="Create price" /></a>
+ <br/><br/>
+
+ <!-- Listing grid include -->
+
+ <c:set value="/admin/products/prices/paging.html?productId=${product.id}" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/products/price/remove.html?productId=${product.id}" var="removeUrl" scope="request"/>
+ <c:set value="/admin/products/price/edit.html" var="editUrl" scope="request"/>
+ <c:set value="/admin/products/prices.html?id=${product.id}" var="afterRemoveUrl" scope="request"/>
+ <c:set var="entityId" value="priceId" scope="request"/>
+ <c:set var="appendQueryStringToEdit" value="productId=${product.id}" scope="request"/>
+ <c:set var="componentTitleKey" value="label.product.prices" scope="request"/>
+ <c:set var="gridHeader" value="/pages/admin/products/prices-gridHeader.jsp" scope="request"/>
+ <c:set var="canRemoveEntry" value="true" scope="request"/>
+
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/products/prices-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/products/prices-gridHeader.jsp
index ff13e30..ccec149 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/prices-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/prices-gridHeader.jsp
@@ -1,13 +1,13 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
- {title:"<s:message code="label.entity.id" text="Id"/>", name:"priceId", canFilter:false},
- {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false},
- {title:"<s:message code="label.product.price" text="Price"/>", name:"price", canFiler:false},
- {title:"<s:message code="label.product.price.special" text="Special price"/>", name:"specialPrice", canFiler:false},
- {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+ {title:"<s:message code="label.entity.id" text="Id"/>", name:"priceId", canFilter:false},
+ {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false},
+ {title:"<s:message code="label.product.price" text="Price"/>", name:"price", canFiler:false},
+ {title:"<s:message code="label.product.price.special" text="Special price"/>", name:"specialPrice", canFiler:false},
+ {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
sm-shop/src/main/webapp/pages/admin/products/product.jsp 962(+481 -481)
diff --git a/sm-shop/src/main/webapp/pages/admin/products/product.jsp b/sm-shop/src/main/webapp/pages/admin/products/product.jsp
index 3d0b66b..2b134a3 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/product.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/product.jsp
@@ -1,482 +1,482 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-
-<%@ page session="false" %>
-<script type="text/javascript">
-var priceFormatMessage = '<s:message code="message.price.cents" text="Wrong format" />';
-</script>
-
- <link href="<c:url value="/resources/css/bootstrap/css/datepicker.css" />" rel="stylesheet"></link>
- <script src="<c:url value="/resources/js/bootstrap/bootstrap-datepicker.js" />"></script>
- <script src="<c:url value="/resources/js/ckeditor/ckeditor.js" />"></script>
- <script src="<c:url value="/resources/js/jquery.formatCurrency-1.4.0.js" />"></script>
- <script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
- <script src="<c:url value="/resources/js/adminFunctions.js" />"></script>
-
-
-
-<script type="text/javascript">
-
-
- $(function(){
- $('#sku').alphanumeric();
- $('#productPriceAmount').numeric({allow:"."});
- $('#quantity').numeric();
- $('#ordermin').numeric();
- $('#ordermax').numeric();
- $('#order').numeric();
- $('#weight').numeric({allow:"."});
- $('#width').numeric({allow:"."});
- $('#length').numeric({allow:"."});
- $('#hight').numeric({allow:"."});
- <c:forEach items="${product.descriptions}" var="description" varStatus="counter">
- $("#name${counter.index}").friendurl({id : 'seUrl${counter.index}'});
- </c:forEach>
- });
-
-
- function removeImage(imageId){
- $("#store.error").show();
- $.ajax({
- type: 'POST',
- url: '<c:url value="/admin/products/product/removeImage.html"/>',
- data: 'imageId=' + imageId,
- dataType: 'json',
- success: function(response){
-
- var status = isc.XMLTools.selectObjects(response, "/response/status");
- if(status==0 || status ==9999) {
-
- //remove delete
- $("#imageControlRemove").html('');
- //add field
- $("#imageControl").html('<input class=\"input-file\" id=\"image\" name=\"image\" type=\"file\">');
- $(".alert-success").show();
-
- } else {
-
- //display message
- $(".alert-error").show();
- }
-
-
- },
- error: function(xhr, textStatus, errorThrown) {
- alert('error ' + errorThrown);
- }
-
- });
- }
-
-
-</script>
-
-
-<div class="tabbable">
-
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
- <div class="sm-ui-component">
-
-
- <c:if test="${product.product.id!=null && product.product.id>0}">
- <c:set value="${product.product.id}" var="productId" scope="request"/>
- <jsp:include page="/pages/admin/products/product-menu.jsp" />
- </c:if>
-
-
- <h3>
- <c:choose>
- <c:when test="${product.product.id!=null && product.product.id>0}">
- <s:message code="label.product.edit" text="Edit product" /> <c:out value="${product.product.sku}"/>
- </c:when>
- <c:otherwise>
- <s:message code="label.product.create" text="Create product" />
- </c:otherwise>
- </c:choose>
-
- </h3>
- <br/>
- <c:if test="${product.product.id!=null && product.product.id>0}">
- <c:forEach items="${product.descriptions}" var="description" varStatus="counter">
- <strong><sm:productUrl productDescription="${description}" /></strong><br/>
- </c:forEach>
- </c:if>
- <br/><br/>
-
- <c:url var="productSave" value="/admin/products/save.html"/>
- <form:form method="POST" enctype="multipart/form-data" commandName="product" action="${productSave}">
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
- <div id="store.error" class="alert alert-error" style="display:none;"><s:message code="message.error" text="An error occured"/></div>
-
- <div class="control-group">
- <label><s:message code="label.product.sku" text="Sku"/></label>
- <div class="controls">
- <form:input cssClass="input-large highlight" id="sku" path="product.sku"/>
- <span class="help-inline"><s:message code="label.generic.alphanumeric" text="Alphanumeric" /><form:errors path="product.sku" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.product.refsku" text="External system identifier"/></label>
- <div class="controls">
- <form:input cssClass="input-large" id="refSku" path="product.refSku"/>
- </div>
- </div>
-
- <form:hidden path="product.id" />
-
-
- <div class="control-group">
- <label><s:message code="label.product.available" text="Product available"/></label>
- <div class="controls">
- <form:checkbox path="product.available" />
- </div>
- </div>
-
-
- <div class="control-group">
- <label><s:message code="label.product.preorder" text="Pre-order"/></label>
- <div class="controls">
- <form:checkbox path="product.preOrder" />
- </div>
- </div>
-
-
- <div class="control-group">
- <label><s:message code="label.product.availabledate" text="Date available"/></label>
- <div class="controls">
- <input id="dateAvailable" name="dateAvailable" value="${product.dateAvailable}" class="small" type="text" data-date-format="<%=com.salesmanager.core.business.constants.Constants.DEFAULT_DATE_FORMAT%>" data-datepicker="datepicker">
- <script type="text/javascript">
- $('#dateAvailable').datepicker();
- </script>
- <span class="help-inline"><form:errors path="dateAvailable" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.product.manufacturer" text="Manufacturer"/></label>
- <div class="controls">
- <form:select items="${manufacturers}" itemValue="id" itemLabel="descriptions[0].name" path="product.manufacturer.id"/>
- <span class="help-inline"></span>
- </div>
- </div>
-
-
-
-
- <div class="control-group">
- <label><s:message code="label.productedit.producttype" text="Product type"/></label>
- <div class="controls">
- <form:select items="${productTypes}" itemValue="id" itemLabel="code" path="product.type.id"/>
- <span class="help-inline"></span>
- </div>
- </div>
-
-
-
- <c:forEach items="${product.descriptions}" var="description" varStatus="counter">
-
-
-
- <div class="control-group">
-
- <label class="required"><s:message code="label.productedit.productname" text="Product name"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:input cssClass="input-large highlight" id="name${counter.index}" path="descriptions[${counter.index}].name"/>
- <span class="help-inline"><form:errors path="descriptions[${counter.index}].name" cssClass="error" /></span>
- </div>
-
- </div>
-
-
- <div class="control-group">
- <label class="required"><s:message code="label.sefurl" text="Search engine friendly url"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:input id="seUrl${counter.index}" cssClass="input-large" path="descriptions[${counter.index}].seUrl"/>
- <span class="help-inline"><form:errors path="descriptions[${counter.index}].seUrl" cssClass="error" /></span>
- </div>
- </div>
-
-
- <div class="control-group">
- <label class="required"><s:message code="label.productedit.producthl" text="Product highlight"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:input cssClass="input-large" path="descriptions[${counter.index}].productHighlight"/>
- <span class="help-inline"><form:errors path="descriptions[${counter.index}].productHighlight" cssClass="error" /></span>
- </div>
-
- </div>
-
-
- <div class="control-group">
- <label class="required"><s:message code="label.productedit.productdesc" text="Product description"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
-
-
- <textarea cols="30" id="descriptions${counter.index}.description" name="descriptions[${counter.index}].description">
- <c:out value="${product.descriptions[counter.index].description}"/>
- </textarea>
- </div>
-
-
-
- <script type="text/javascript">
- //<![CDATA[
-
- CKEDITOR.replace('descriptions[${counter.index}].description',
- {
- skin : 'office2003',
- toolbar :
- [
- ['Source','-','Save','NewPage','Preview'],
- ['Cut','Copy','Paste','PasteText','-','Print'],
- ['Undo','Redo','-','Find','-','SelectAll','RemoveFormat'], '/',
- ['Bold','Italic','Underline','Strike','-','Subscript','Superscript'],
- ['NumberedList','BulletedList','-','Outdent','Indent','Blockquote'],
- ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
- ['Link','Unlink','Anchor'],
- ['Image','Flash','Table','HorizontalRule','SpecialChar','PageBreak'], '/',
- ['Styles','Format','Font','FontSize'], ['TextColor','BGColor'],
- ['Maximize', 'ShowBlocks']
- ],
-
- filebrowserWindowWidth : '720',
- filebrowserWindowHeight : '740',
- filebrowserImageBrowseUrl : '<c:url value="/admin/content/fileBrowser.html"/>'
-
-
- });
-
- //]]>
- </script>
-
-
-
- </div>
-
-
- <div class="control-group">
- <label class="required"><s:message code="label.product.title" text="Product title"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:input cssClass="input-large" path="descriptions[${counter.index}].metatagTitle"/>
- <span class="help-inline"><form:errors path="descriptions[${counter.index}].metatagTitle" cssClass="error" /></span>
- </div>
- </div>
-
-
-
- <div class="control-group">
- <label class="required"><s:message code="label.metatags.description" text="Metatag description"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:input cssClass="input-large" path="descriptions[${counter.index}].metatagDescription"/>
- <span class="help-inline"><form:errors path="descriptions[${counter.index}].metatagDescription" cssClass="error" /></span>
- </div>
- </div>
-
-
-
- <form:hidden path="descriptions[${counter.index}].language.id" />
- <form:hidden path="descriptions[${counter.index}].language.code" />
- <form:hidden path="descriptions[${counter.index}].id" />
- <form:hidden path="descriptions[${counter.index}].metatagKeywords" />
- <form:hidden path="descriptions[${counter.index}].productExternalDl" />
-
-
-
- </c:forEach>
-
-
-
- <div class="control-group">
-
- <label class="required"><s:message code="label.product.price" text="Price"/></label>
-
- <div class="controls">
- <form:input id="productPriceAmount" cssClass="highlight" path="productPrice"/>
- <span id="help-price" class="help-inline"><form:errors path="productPrice" cssClass="error" /></span>
- </div>
- </div>
-
-
-
- <div class="control-group">
-
- <label><s:message code="label.productedit.qtyavailable" text="Quantity available"/></label>
- <div class="controls">
- <form:input id="quantity" cssClass="highlight" path="availability.productQuantity"/>
- <span class="help-inline"><form:errors path="availability.productQuantity" cssClass="error" /></span>
- </div>
- </div>
-
-
-
- <div class="control-group">
- <label><s:message code="label.product.ordermin" text="Quantity order minimum"/></label>
- <div class="controls">
- <form:input id="ordermin" cssClass="highlight" path="availability.productQuantityOrderMin"/>
- <span class="help-inline"><form:errors path="availability.productQuantityOrderMin" cssClass="error" /></span>
-
- </div>
- </div>
-
-
-
- <div class="control-group">
- <label><s:message code="label.product.ordermax" text="Quantity order maximum"/></label>
- <div class="controls">
- <form:input id="ordermax" cssClass="highlight" path="availability.productQuantityOrderMax"/>
- <span class="help-inline"><form:errors path="availability.productQuantityOrderMax" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.product.shipeable" text="Product will be shipped"/></label>
- <div class="controls">
- <form:checkbox path="product.productShipeable" />
- </div>
- </div>
-
-
- <form:hidden path="availability.region" />
- <form:hidden path="availability.id" />
- <form:hidden path="price.id" />
- <form:hidden path="product.productVirtual" />
-
- <div class="control-group">
- <label><s:message code="label.product.weight" text="Weight"/></label>
- <div class="controls">
- <form:input id="weight" cssClass="" path="product.productWeight"/>
- <span class="help-inline"><form:errors path="product.productWeight" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.product.height" text="Height"/></label>
- <div class="controls">
- <form:input id="height" cssClass="" path="product.productHeight"/>
- <span class="help-inline"><form:errors path="product.productHeight" cssClass="error" /></span>
- </div>
- </div>
-
-
- <div class="control-group">
- <label><s:message code="label.product.width" text="Width"/></label>
- <div class="controls">
- <form:input id="width" cssClass="" path="product.productWidth"/>
- <span class="help-inline"><form:errors path="product.productWidth" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.product.length" text="Length"/></label>
- <div class="controls">
- <form:input id="length" cssClass="" path="product.productLength"/>
- <span class="help-inline"><form:errors path="product.productLength" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.entity.order" text="Sort order"/></label>
- <div class="controls">
- <form:input id="order" cssClass="" path="product.sortOrder"/>
- <span class="help-inline"><form:errors path="product.sortOrder" cssClass="error" /></span>
- </div>
- </div>
-
-
- <div class="control-group">
- <label><s:message code="label.product.image" text="Image"/> <c:if test="${product.productImage.productImage!=null && product.productImage.productImage!=''}"><span id="imageControlRemove"> - <a href="#" onClick="removeImage('${product.productImage.id}')"><s:message code="label.generic.remove" text="Remove"/></a></span></c:if></label>
- <div class="controls" id="imageControl">
- <c:choose>
- <c:when test="${product.productImage.productImage==null || product.productImage.productImage==''}">
- <input class="input-file" id="image" name="image" type="file">
- </c:when>
- <c:otherwise>
- <img src="<sm:productImage imageName="${product.productImage.productImage}" product="${product.product}"/>" width="200"/>
- </c:otherwise>
- </c:choose>
- </div>
- </div>
-
- <form:hidden path="productImage.productImage" />
-
- <div class="control-group">
- <label><s:message code="label.taxclass" text="Tax class"/></label>
- <div class="controls">
- <form:select items="${taxClasses}" itemValue="id" itemLabel="code" path="product.taxClass.id"/>
- <span class="help-inline"></span>
- </div>
- </div>
-
-
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit2" text="Submit"/></button>
- </div>
- </div>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- </form:form>
-
- <c:if test="${product.product.id!=null && product.product.id>0}">
- <c:url var="createSimilar" value="/admin/products/product/duplicate.html"/>
- <form:form method="POST" enctype="multipart/form-data" commandName="product" action="${createSimilar}">
- <input type="hidden" name="productId" value="${product.product.id}" />
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn"><s:message code="label.product.createsimilar" text="Create similar product"/></button>
- </div>
- </div>
-
- </form:form>
- </c:if>
-
-
-
-
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@ page session="false" %>
+<script type="text/javascript">
+var priceFormatMessage = '<s:message code="message.price.cents" text="Wrong format" />';
+</script>
+
+ <link href="<c:url value="/resources/css/bootstrap/css/datepicker.css" />" rel="stylesheet"></link>
+ <script src="<c:url value="/resources/js/bootstrap/bootstrap-datepicker.js" />"></script>
+ <script src="<c:url value="/resources/js/ckeditor/ckeditor.js" />"></script>
+ <script src="<c:url value="/resources/js/jquery.formatCurrency-1.4.0.js" />"></script>
+ <script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
+ <script src="<c:url value="/resources/js/adminFunctions.js" />"></script>
+
+
+
+<script type="text/javascript">
+
+
+ $(function(){
+ $('#sku').alphanumeric();
+ $('#productPriceAmount').numeric({allow:"."});
+ $('#quantity').numeric();
+ $('#ordermin').numeric();
+ $('#ordermax').numeric();
+ $('#order').numeric();
+ $('#weight').numeric({allow:"."});
+ $('#width').numeric({allow:"."});
+ $('#length').numeric({allow:"."});
+ $('#hight').numeric({allow:"."});
+ <c:forEach items="${product.descriptions}" var="description" varStatus="counter">
+ $("#name${counter.index}").friendurl({id : 'seUrl${counter.index}'});
+ </c:forEach>
+ });
+
+
+ function removeImage(imageId){
+ $("#store.error").show();
+ $.ajax({
+ type: 'POST',
+ url: '<c:url value="/admin/products/product/removeImage.html"/>',
+ data: 'imageId=' + imageId,
+ dataType: 'json',
+ success: function(response){
+
+ var status = isc.XMLTools.selectObjects(response, "/response/status");
+ if(status==0 || status ==9999) {
+
+ //remove delete
+ $("#imageControlRemove").html('');
+ //add field
+ $("#imageControl").html('<input class=\"input-file\" id=\"image\" name=\"image\" type=\"file\">');
+ $(".alert-success").show();
+
+ } else {
+
+ //display message
+ $(".alert-error").show();
+ }
+
+
+ },
+ error: function(xhr, textStatus, errorThrown) {
+ alert('error ' + errorThrown);
+ }
+
+ });
+ }
+
+
+</script>
+
+
+<div class="tabbable">
+
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+ <div class="sm-ui-component">
+
+
+ <c:if test="${product.product.id!=null && product.product.id>0}">
+ <c:set value="${product.product.id}" var="productId" scope="request"/>
+ <jsp:include page="/pages/admin/products/product-menu.jsp" />
+ </c:if>
+
+
+ <h3>
+ <c:choose>
+ <c:when test="${product.product.id!=null && product.product.id>0}">
+ <s:message code="label.product.edit" text="Edit product" /> <c:out value="${product.product.sku}"/>
+ </c:when>
+ <c:otherwise>
+ <s:message code="label.product.create" text="Create product" />
+ </c:otherwise>
+ </c:choose>
+
+ </h3>
+ <br/>
+ <c:if test="${product.product.id!=null && product.product.id>0}">
+ <c:forEach items="${product.descriptions}" var="description" varStatus="counter">
+ <strong><sm:productUrl productDescription="${description}" /></strong><br/>
+ </c:forEach>
+ </c:if>
+ <br/><br/>
+
+ <c:url var="productSave" value="/admin/products/save.html"/>
+ <form:form method="POST" enctype="multipart/form-data" commandName="product" action="${productSave}">
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+ <div id="store.error" class="alert alert-error" style="display:none;"><s:message code="message.error" text="An error occured"/></div>
+
+ <div class="control-group">
+ <label><s:message code="label.product.sku" text="Sku"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" id="sku" path="product.sku"/>
+ <span class="help-inline"><s:message code="label.generic.alphanumeric" text="Alphanumeric" /><form:errors path="product.sku" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.product.refsku" text="External system identifier"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large" id="refSku" path="product.refSku"/>
+ </div>
+ </div>
+
+ <form:hidden path="product.id" />
+
+
+ <div class="control-group">
+ <label><s:message code="label.product.available" text="Product available"/></label>
+ <div class="controls">
+ <form:checkbox path="product.available" />
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.product.preorder" text="Pre-order"/></label>
+ <div class="controls">
+ <form:checkbox path="product.preOrder" />
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.product.availabledate" text="Date available"/></label>
+ <div class="controls">
+ <input id="dateAvailable" name="dateAvailable" value="${product.dateAvailable}" class="small" type="text" data-date-format="<%=com.salesmanager.core.business.constants.Constants.DEFAULT_DATE_FORMAT%>" data-datepicker="datepicker">
+ <script type="text/javascript">
+ $('#dateAvailable').datepicker();
+ </script>
+ <span class="help-inline"><form:errors path="dateAvailable" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.product.manufacturer" text="Manufacturer"/></label>
+ <div class="controls">
+ <form:select items="${manufacturers}" itemValue="id" itemLabel="descriptions[0].name" path="product.manufacturer.id"/>
+ <span class="help-inline"></span>
+ </div>
+ </div>
+
+
+
+
+ <div class="control-group">
+ <label><s:message code="label.productedit.producttype" text="Product type"/></label>
+ <div class="controls">
+ <form:select items="${productTypes}" itemValue="id" itemLabel="code" path="product.type.id"/>
+ <span class="help-inline"></span>
+ </div>
+ </div>
+
+
+
+ <c:forEach items="${product.descriptions}" var="description" varStatus="counter">
+
+
+
+ <div class="control-group">
+
+ <label class="required"><s:message code="label.productedit.productname" text="Product name"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" id="name${counter.index}" path="descriptions[${counter.index}].name"/>
+ <span class="help-inline"><form:errors path="descriptions[${counter.index}].name" cssClass="error" /></span>
+ </div>
+
+ </div>
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.sefurl" text="Search engine friendly url"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:input id="seUrl${counter.index}" cssClass="input-large" path="descriptions[${counter.index}].seUrl"/>
+ <span class="help-inline"><form:errors path="descriptions[${counter.index}].seUrl" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.productedit.producthl" text="Product highlight"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:input cssClass="input-large" path="descriptions[${counter.index}].productHighlight"/>
+ <span class="help-inline"><form:errors path="descriptions[${counter.index}].productHighlight" cssClass="error" /></span>
+ </div>
+
+ </div>
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.productedit.productdesc" text="Product description"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+
+
+ <textarea cols="30" id="descriptions${counter.index}.description" name="descriptions[${counter.index}].description">
+ <c:out value="${product.descriptions[counter.index].description}"/>
+ </textarea>
+ </div>
+
+
+
+ <script type="text/javascript">
+ //<![CDATA[
+
+ CKEDITOR.replace('descriptions[${counter.index}].description',
+ {
+ skin : 'office2003',
+ toolbar :
+ [
+ ['Source','-','Save','NewPage','Preview'],
+ ['Cut','Copy','Paste','PasteText','-','Print'],
+ ['Undo','Redo','-','Find','-','SelectAll','RemoveFormat'], '/',
+ ['Bold','Italic','Underline','Strike','-','Subscript','Superscript'],
+ ['NumberedList','BulletedList','-','Outdent','Indent','Blockquote'],
+ ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
+ ['Link','Unlink','Anchor'],
+ ['Image','Flash','Table','HorizontalRule','SpecialChar','PageBreak'], '/',
+ ['Styles','Format','Font','FontSize'], ['TextColor','BGColor'],
+ ['Maximize', 'ShowBlocks']
+ ],
+
+ filebrowserWindowWidth : '720',
+ filebrowserWindowHeight : '740',
+ filebrowserImageBrowseUrl : '<c:url value="/admin/content/fileBrowser.html"/>'
+
+
+ });
+
+ //]]>
+ </script>
+
+
+
+ </div>
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.product.title" text="Product title"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:input cssClass="input-large" path="descriptions[${counter.index}].metatagTitle"/>
+ <span class="help-inline"><form:errors path="descriptions[${counter.index}].metatagTitle" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.metatags.description" text="Metatag description"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:input cssClass="input-large" path="descriptions[${counter.index}].metatagDescription"/>
+ <span class="help-inline"><form:errors path="descriptions[${counter.index}].metatagDescription" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+
+ <form:hidden path="descriptions[${counter.index}].language.id" />
+ <form:hidden path="descriptions[${counter.index}].language.code" />
+ <form:hidden path="descriptions[${counter.index}].id" />
+ <form:hidden path="descriptions[${counter.index}].metatagKeywords" />
+ <form:hidden path="descriptions[${counter.index}].productExternalDl" />
+
+
+
+ </c:forEach>
+
+
+
+ <div class="control-group">
+
+ <label class="required"><s:message code="label.product.price" text="Price"/></label>
+
+ <div class="controls">
+ <form:input id="productPriceAmount" cssClass="highlight" path="productPrice"/>
+ <span id="help-price" class="help-inline"><form:errors path="productPrice" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+
+ <div class="control-group">
+
+ <label><s:message code="label.productedit.qtyavailable" text="Quantity available"/></label>
+ <div class="controls">
+ <form:input id="quantity" cssClass="highlight" path="availability.productQuantity"/>
+ <span class="help-inline"><form:errors path="availability.productQuantity" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+
+ <div class="control-group">
+ <label><s:message code="label.product.ordermin" text="Quantity order minimum"/></label>
+ <div class="controls">
+ <form:input id="ordermin" cssClass="highlight" path="availability.productQuantityOrderMin"/>
+ <span class="help-inline"><form:errors path="availability.productQuantityOrderMin" cssClass="error" /></span>
+
+ </div>
+ </div>
+
+
+
+ <div class="control-group">
+ <label><s:message code="label.product.ordermax" text="Quantity order maximum"/></label>
+ <div class="controls">
+ <form:input id="ordermax" cssClass="highlight" path="availability.productQuantityOrderMax"/>
+ <span class="help-inline"><form:errors path="availability.productQuantityOrderMax" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.product.shipeable" text="Product will be shipped"/></label>
+ <div class="controls">
+ <form:checkbox path="product.productShipeable" />
+ </div>
+ </div>
+
+
+ <form:hidden path="availability.region" />
+ <form:hidden path="availability.id" />
+ <form:hidden path="price.id" />
+ <form:hidden path="product.productVirtual" />
+
+ <div class="control-group">
+ <label><s:message code="label.product.weight" text="Weight"/></label>
+ <div class="controls">
+ <form:input id="weight" cssClass="" path="product.productWeight"/>
+ <span class="help-inline"><form:errors path="product.productWeight" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.product.height" text="Height"/></label>
+ <div class="controls">
+ <form:input id="height" cssClass="" path="product.productHeight"/>
+ <span class="help-inline"><form:errors path="product.productHeight" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.product.width" text="Width"/></label>
+ <div class="controls">
+ <form:input id="width" cssClass="" path="product.productWidth"/>
+ <span class="help-inline"><form:errors path="product.productWidth" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.product.length" text="Length"/></label>
+ <div class="controls">
+ <form:input id="length" cssClass="" path="product.productLength"/>
+ <span class="help-inline"><form:errors path="product.productLength" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.entity.order" text="Sort order"/></label>
+ <div class="controls">
+ <form:input id="order" cssClass="" path="product.sortOrder"/>
+ <span class="help-inline"><form:errors path="product.sortOrder" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.product.image" text="Image"/> <c:if test="${product.productImage.productImage!=null && product.productImage.productImage!=''}"><span id="imageControlRemove"> - <a href="#" onClick="removeImage('${product.productImage.id}')"><s:message code="label.generic.remove" text="Remove"/></a></span></c:if></label>
+ <div class="controls" id="imageControl">
+ <c:choose>
+ <c:when test="${product.productImage.productImage==null || product.productImage.productImage==''}">
+ <input class="input-file" id="image" name="image" type="file">
+ </c:when>
+ <c:otherwise>
+ <img src="<sm:productImage imageName="${product.productImage.productImage}" product="${product.product}"/>" width="200"/>
+ </c:otherwise>
+ </c:choose>
+ </div>
+ </div>
+
+ <form:hidden path="productImage.productImage" />
+
+ <div class="control-group">
+ <label><s:message code="label.taxclass" text="Tax class"/></label>
+ <div class="controls">
+ <form:select items="${taxClasses}" itemValue="id" itemLabel="code" path="product.taxClass.id"/>
+ <span class="help-inline"></span>
+ </div>
+ </div>
+
+
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit2" text="Submit"/></button>
+ </div>
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ </form:form>
+
+ <c:if test="${product.product.id!=null && product.product.id>0}">
+ <c:url var="createSimilar" value="/admin/products/product/duplicate.html"/>
+ <form:form method="POST" enctype="multipart/form-data" commandName="product" action="${createSimilar}">
+ <input type="hidden" name="productId" value="${product.product.id}" />
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn"><s:message code="label.product.createsimilar" text="Create similar product"/></button>
+ </div>
+ </div>
+
+ </form:form>
+ </c:if>
+
+
+
+
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/products/product-categories-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/products/product-categories-gridHeader.jsp
index c07ba4e..d2bc373 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/product-categories-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/product-categories-gridHeader.jsp
@@ -1,10 +1,10 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
- {title:"<s:message code="label.entity.id" text="Id"/>", name:"categoryId", canFilter:false},
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+ {title:"<s:message code="label.entity.id" text="Id"/>", name:"categoryId", canFilter:false},
{title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false}
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/products/product-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/products/product-gridHeader.jsp
index 8a9f51b..124dfa6 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/product-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/product-gridHeader.jsp
@@ -1,11 +1,11 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
- {title:"<s:message code="label.entity.id" text="Id"/>", name: "productId"},
- {title:"<s:message code="label.entity.name" text="Name"/>", name: "name", width: "70%"},
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+ {title:"<s:message code="label.entity.id" text="Id"/>", name: "productId"},
+ {title:"<s:message code="label.entity.name" text="Name"/>", name: "name", width: "70%"},
{title:"<s:message code="label.product.sku" text="Sku"/>", name: "sku"}
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/products/product-images-url-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/products/product-images-url-gridHeader.jsp
index 7cafba1..f2bf96c 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/product-images-url-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/product-images-url-gridHeader.jsp
@@ -1,12 +1,12 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
- {title:"<s:message code="label.product.image" text="Image"/>", name:"image", type:"image", canEdit:false, imageWidth:75, canFilter:false},
- {title:"<s:message code="label.generic.url" text="URL"/>", name:"url", canEdit:false, canFilter:false},
- {title:"<s:message code="label.generic.default" text="Default"/>", name:"default", canEdit:false, type:"boolean", canFilter:false},
- {title:"<s:message code="label.entity.id" text="ID"/>", name:"id", canEdit:false, canFilter:false}
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+ {title:"<s:message code="label.product.image" text="Image"/>", name:"image", type:"image", canEdit:false, imageWidth:75, canFilter:false},
+ {title:"<s:message code="label.generic.url" text="URL"/>", name:"url", canEdit:false, canFilter:false},
+ {title:"<s:message code="label.generic.default" text="Default"/>", name:"default", canEdit:false, type:"boolean", canFilter:false},
+ {title:"<s:message code="label.entity.id" text="ID"/>", name:"id", canEdit:false, canFilter:false}
\ No newline at end of file
sm-shop/src/main/webapp/pages/admin/products/products.jsp 426(+213 -213)
diff --git a/sm-shop/src/main/webapp/pages/admin/products/products.jsp b/sm-shop/src/main/webapp/pages/admin/products/products.jsp
index 0df800b..09e9a54 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/products.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/products.jsp
@@ -1,214 +1,214 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-
-
-
-<div class="tabbable">
-
-
- <jsp:include page="/common/adminTabs.jsp" />
-
-
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
-
-
- <div class="sm-ui-component">
-
-
- <script>
-
-///isc.showConsole();
-
-
-// User Interface
-// ---------------------------------------------------------------------
-
-
-
-
-
- isc.RestDataSource.create({
- ID:"products",
- dataFormat:"json",
- operationBindings:[
- {operationType:"fetch", dataProtocol:"postParams",dataURL: "<c:url value="/admin/products/paging.html" />"},
- {operationType:"remove", dataProtocol:"postParams",dataURL: "<c:url value="/admin/products/remove.html" />"}
- ],
- transformResponse : function (dsResponse, dsRequest, jsonData) {
- var status = isc.XMLTools.selectObjects(jsonData, "/response/status");
-
- if (status != 0 && status !=9999) {
-
- var msg = isc.XMLTools.selectObjects(jsonData, "/response/statusMessage");
-
- alert("! " + msg);
-
- }
-
-
- if(status == 9999) {
-
- window.location='<c:url value="/admin/products/products.html" />';
- }
- }
- });
-
-
- //iterate from category objects to display data
- isc.TreeGrid.create({
- ID:"categoryTree",
- border:0,
- showResizeBar: false,
- data: isc.Tree.create({
- modelType: "parent",
- nameProperty: "Name",
- idField: "categoryId",
- parentIdField: "parentId",
- data: [
- {categoryId:"-1", parentId:"0", Name:"<s:message code="label.category.root" text="Root" />", isFolder: true},
- <c:forEach items="${categories}" var="category" varStatus="status">
- {categoryId:'<c:out value="${category.id}" />', parentId:'<c:choose><c:when test="${category.parent!=null}"><c:out value="${category.parent.id}" /></c:when><c:otherwise>-1</c:otherwise></c:choose>', Name:'<c:out value="${category.descriptions[0].name}" />', isFolder: true}
- <c:if test="${status.count<fn:length(categories)}">,</c:if>
- </c:forEach>
- ]
- }),
-
-
- nodeClick:"itemList.fetchData({categoryId:node.categoryId})",
- showHeader:false,
- leaveScrollbarGap:false,
- animateFolders:true,
- canAcceptDroppedRecords:true,
- canReparentNodes:false,
- selectionType:"single",
- animateRowsMaxTime:750
- });
-
-
- isc.ListGrid.create({
- ID: "itemList",
- border:0,
- dataSource: "products",
- showRecordComponents: true,
- showRecordComponentsByCell: true,
- canRemoveRecords: true,
- autoFetchData: false,
- showFilterEditor: true,
- filterOnKeypress: true,
- dataFetchMode:"paged",
-
-
- fields:[
-
-
- {title:"<s:message code="label.entity.id" text="Id"/>", name:"productId", canFilter:false},
- {title:"<s:message code="label.entity.name" text="Name"/>", name:"name"},
- {title:"<s:message code="label.product.sku" text="Sku"/>", name:"sku"},
- {title:"<s:message code="label.product.available" text="Available"/>", name:"available",type:"boolean"},
- //{title:"<s:message code="label.quantity" text="Quantity"/>", name:"quantity", canFilter:false},
- {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
-
-
- ],
- selectionType: "single",
- removeData: function () {
- if (confirm('<s:message code="label.entity.remove.confirm" text="Do you really want to remove this record ?" />')) {
- return this.Super("removeData", arguments);
- }
- },
- createRecordComponent : function (record, colNum) {
-
- var fieldName = this.getFieldName(colNum);
- if (fieldName == "buttonField") {
-
-
- var button = isc.IButton.create({
- height: 18,
- width: 65,
- title: "<s:message code="label.entity.details" text="Details"/>",
- click : function () {
- window.location='<c:url value="/admin/products/editProduct.html" />?id=' + record["productId"];
- }
- });
- return button;
-
- }
-
- }
-
-
- });
-
-
-
-
-
-// Define application layout
-// ---------------------------------------------------------------------
-
-isc.HLayout.create({
- ID:"pageLayout",
- width: "700",
- height: "600",
- position:"relative",
- members:[
- isc.SectionStack.create({
- ID:"leftSideLayout",
- width:200,
- showResizeBar:true,
- visibilityMode:"multiple",
- animateSections:true,
- sections:[
- {title:"<s:message code="label.categories.title" text="Categories" />", autoShow:true, items:[categoryTree]}
- ]
- }),
- isc.SectionStack.create({
- ID:"rightSideLayout",
- visibilityMode:"multiple",
- animateSections:true,
- sections:[
- {title:"<s:message code="menu.catalogue-products" text="Products" />", autoShow:true, items:[itemList]}
- ]
- })
- ]
-});
-
-isc.Page.setEvent("load", "pageLayout.draw()");
-
-
-
-
-
- </script>
-
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+
+
+
+<div class="tabbable">
+
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+
+
+ <div class="sm-ui-component">
+
+
+ <script>
+
+///isc.showConsole();
+
+
+// User Interface
+// ---------------------------------------------------------------------
+
+
+
+
+
+ isc.RestDataSource.create({
+ ID:"products",
+ dataFormat:"json",
+ operationBindings:[
+ {operationType:"fetch", dataProtocol:"postParams",dataURL: "<c:url value="/admin/products/paging.html" />"},
+ {operationType:"remove", dataProtocol:"postParams",dataURL: "<c:url value="/admin/products/remove.html" />"}
+ ],
+ transformResponse : function (dsResponse, dsRequest, jsonData) {
+ var status = isc.XMLTools.selectObjects(jsonData, "/response/status");
+
+ if (status != 0 && status !=9999) {
+
+ var msg = isc.XMLTools.selectObjects(jsonData, "/response/statusMessage");
+
+ alert("! " + msg);
+
+ }
+
+
+ if(status == 9999) {
+
+ window.location='<c:url value="/admin/products/products.html" />';
+ }
+ }
+ });
+
+
+ //iterate from category objects to display data
+ isc.TreeGrid.create({
+ ID:"categoryTree",
+ border:0,
+ showResizeBar: false,
+ data: isc.Tree.create({
+ modelType: "parent",
+ nameProperty: "Name",
+ idField: "categoryId",
+ parentIdField: "parentId",
+ data: [
+ {categoryId:"-1", parentId:"0", Name:"<s:message code="label.category.root" text="Root" />", isFolder: true},
+ <c:forEach items="${categories}" var="category" varStatus="status">
+ {categoryId:'<c:out value="${category.id}" />', parentId:'<c:choose><c:when test="${category.parent!=null}"><c:out value="${category.parent.id}" /></c:when><c:otherwise>-1</c:otherwise></c:choose>', Name:'<c:out value="${category.descriptions[0].name}" />', isFolder: true}
+ <c:if test="${status.count<fn:length(categories)}">,</c:if>
+ </c:forEach>
+ ]
+ }),
+
+
+ nodeClick:"itemList.fetchData({categoryId:node.categoryId})",
+ showHeader:false,
+ leaveScrollbarGap:false,
+ animateFolders:true,
+ canAcceptDroppedRecords:true,
+ canReparentNodes:false,
+ selectionType:"single",
+ animateRowsMaxTime:750
+ });
+
+
+ isc.ListGrid.create({
+ ID: "itemList",
+ border:0,
+ dataSource: "products",
+ showRecordComponents: true,
+ showRecordComponentsByCell: true,
+ canRemoveRecords: true,
+ autoFetchData: false,
+ showFilterEditor: true,
+ filterOnKeypress: true,
+ dataFetchMode:"paged",
+
+
+ fields:[
+
+
+ {title:"<s:message code="label.entity.id" text="Id"/>", name:"productId", canFilter:false},
+ {title:"<s:message code="label.entity.name" text="Name"/>", name:"name"},
+ {title:"<s:message code="label.product.sku" text="Sku"/>", name:"sku"},
+ {title:"<s:message code="label.product.available" text="Available"/>", name:"available",type:"boolean"},
+ //{title:"<s:message code="label.quantity" text="Quantity"/>", name:"quantity", canFilter:false},
+ {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
+
+
+ ],
+ selectionType: "single",
+ removeData: function () {
+ if (confirm('<s:message code="label.entity.remove.confirm" text="Do you really want to remove this record ?" />')) {
+ return this.Super("removeData", arguments);
+ }
+ },
+ createRecordComponent : function (record, colNum) {
+
+ var fieldName = this.getFieldName(colNum);
+ if (fieldName == "buttonField") {
+
+
+ var button = isc.IButton.create({
+ height: 18,
+ width: 65,
+ title: "<s:message code="label.entity.details" text="Details"/>",
+ click : function () {
+ window.location='<c:url value="/admin/products/editProduct.html" />?id=' + record["productId"];
+ }
+ });
+ return button;
+
+ }
+
+ }
+
+
+ });
+
+
+
+
+
+// Define application layout
+// ---------------------------------------------------------------------
+
+isc.HLayout.create({
+ ID:"pageLayout",
+ width: "700",
+ height: "600",
+ position:"relative",
+ members:[
+ isc.SectionStack.create({
+ ID:"leftSideLayout",
+ width:200,
+ showResizeBar:true,
+ visibilityMode:"multiple",
+ animateSections:true,
+ sections:[
+ {title:"<s:message code="label.categories.title" text="Categories" />", autoShow:true, items:[categoryTree]}
+ ]
+ }),
+ isc.SectionStack.create({
+ ID:"rightSideLayout",
+ visibilityMode:"multiple",
+ animateSections:true,
+ sections:[
+ {title:"<s:message code="menu.catalogue-products" text="Products" />", autoShow:true, items:[itemList]}
+ ]
+ })
+ ]
+});
+
+isc.Page.setEvent("load", "pageLayout.draw()");
+
+
+
+
+
+ </script>
+
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/products/productsCategories.jsp b/sm-shop/src/main/webapp/pages/admin/products/productsCategories.jsp
index 9b5e52c..e7757dc 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/productsCategories.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/productsCategories.jsp
@@ -1,74 +1,74 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-<div class="tabbable">
- <jsp:include page="/common/adminTabs.jsp" />
- <div class="tab-content">
- <div class="tab-pane active" id="catalogue-section">
- <div class="sm-ui-component">
-
-
- <c:if test="${product.id!=null && product.id>0}">
- <c:set value="${product.id}" var="productId" scope="request"/>
- <jsp:include page="/pages/admin/products/product-menu.jsp" />
- </c:if>
-
-
- <h3>
- <s:message code="label.product.category.association" text="Associate to categories" />
- </h3>
-
-
-
- <c:url var="addCategory" value="/admin/products/addProductToCategories.html" />
- <form:form method="POST" enctype="multipart/form-data" commandName="product" action="${addCategory}">
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>">
- <s:message code="message.success" text="Request successfull" />
- </div>
- <br/>
- <strong><c:out value="${product.sku}"/></strong>
- <br/><br/>
-
- <div class="control-group">
- <label><s:message code="label.productedit.categoryname" text="Category"/></label>
- <div class="controls">
- <form:select path="id">
- <form:options items="${categories}" itemValue="id" itemLabel="descriptions[0].name"/>
- </form:select>
- <span class="help-inline"><form:errors path="id" cssClass="error" /></span>
- </div>
- </div>
-
-
- <input type="hidden" name="productId" value="${product.id}">
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success"><s:message code="label.generic.add" text="Add"/></button>
- </div>
- </div>
-
- </form:form>
-
-
-
- <br />
- <!-- Listing grid include -->
- <c:set value="/admin/product-categories/paging.html?productId=${product.id}" var="pagingUrl" scope="request" />
- <c:set value="/admin/product-categories/remove.html?productId=${product.id}" var="removeUrl" scope="request" />
- <c:set value="/admin/products/displayProductToCategories.html?id=${product.id}" var="refreshUrl" scope="request" />
- <c:set var="entityId" value="categoryId" scope="request"/>
- <c:set var="componentTitleKey" value="label.categories.title" scope="request" />
- <c:set var="canRemoveEntry" value="true" scope="request" />
- <c:set var="gridHeader" value="/pages/admin/products/product-categories-gridHeader.jsp" scope="request"/>
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
- </div>
- </div>
- </div>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+<div class="tabbable">
+ <jsp:include page="/common/adminTabs.jsp" />
+ <div class="tab-content">
+ <div class="tab-pane active" id="catalogue-section">
+ <div class="sm-ui-component">
+
+
+ <c:if test="${product.id!=null && product.id>0}">
+ <c:set value="${product.id}" var="productId" scope="request"/>
+ <jsp:include page="/pages/admin/products/product-menu.jsp" />
+ </c:if>
+
+
+ <h3>
+ <s:message code="label.product.category.association" text="Associate to categories" />
+ </h3>
+
+
+
+ <c:url var="addCategory" value="/admin/products/addProductToCategories.html" />
+ <form:form method="POST" enctype="multipart/form-data" commandName="product" action="${addCategory}">
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>">
+ <s:message code="message.success" text="Request successfull" />
+ </div>
+ <br/>
+ <strong><c:out value="${product.sku}"/></strong>
+ <br/><br/>
+
+ <div class="control-group">
+ <label><s:message code="label.productedit.categoryname" text="Category"/></label>
+ <div class="controls">
+ <form:select path="id">
+ <form:options items="${categories}" itemValue="id" itemLabel="descriptions[0].name"/>
+ </form:select>
+ <span class="help-inline"><form:errors path="id" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+ <input type="hidden" name="productId" value="${product.id}">
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success"><s:message code="label.generic.add" text="Add"/></button>
+ </div>
+ </div>
+
+ </form:form>
+
+
+
+ <br />
+ <!-- Listing grid include -->
+ <c:set value="/admin/product-categories/paging.html?productId=${product.id}" var="pagingUrl" scope="request" />
+ <c:set value="/admin/product-categories/remove.html?productId=${product.id}" var="removeUrl" scope="request" />
+ <c:set value="/admin/products/displayProductToCategories.html?id=${product.id}" var="refreshUrl" scope="request" />
+ <c:set var="entityId" value="categoryId" scope="request"/>
+ <c:set var="componentTitleKey" value="label.categories.title" scope="request" />
+ <c:set var="canRemoveEntry" value="true" scope="request" />
+ <c:set var="gridHeader" value="/pages/admin/products/product-categories-gridHeader.jsp" scope="request"/>
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+ </div>
+ </div>
+ </div>
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/products/related.jsp b/sm-shop/src/main/webapp/pages/admin/products/related.jsp
index 4c025e6..4199dc5 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/related.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/related.jsp
@@ -1,84 +1,84 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-<script>
-
-
-
-</script>
-
-
-<div class="tabbable">
-
-
- <jsp:include page="/common/adminTabs.jsp" />
-
-
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
-
-
- <div class="sm-ui-component">
-
- <c:if test="${product.id!=null && product.id>0}">
- <c:set value="${product.id}" var="productId" scope="request"/>
- <jsp:include page="/pages/admin/products/product-menu.jsp" />
- </c:if>
-
-
- <h3><s:message code="label.product.related.title" text="Related items" /></h3>
- <br/>
- <strong><c:out value="${product.sku}"/></strong>
-
-
- <br/>
- <div class="alert alert-info">
- <s:message code="label.product.related.meassage" text="Drag and drop product from product list to related items box"/>
- </div>
-
- <!-- Listing grid include -->
- <c:set value="/admin/products/paging.html" var="pagingUrl" scope="request"/>
- <c:set value="/admin/catalogue/related/paging.html?productId=${productId}" var="containerFetchUrl" scope="request"/>
- <c:set value="/admin/catalogue/related/removeItem.html?baseProductId=${productId}" var="containerRemoveUrl" scope="request"/>
- <c:set value="RELATED" var="removeEntity" scope="request"/>
- <c:set value="/admin/catalogue/related/addItem.html?baseProductId=${productId}" var="containerAddUrl" scope="request"/>
- <c:set value="/admin/catalogue/related/update.html" var="containerUpdateUrl" scope="request"/>
- <c:set value="/admin/products/editProduct.html" var="editUrl" scope="request"/>
- <c:set value="/admin/catalogue/related/list.html?id=${productId}" var="reloadUrl" scope="request"/>
- <c:set var="componentTitleKey" value="label.product.related.title" scope="request"/>
- <!-- same headers than featured -->
- <c:set var="gridHeader" value="/pages/admin/products/featured-gridHeader.jsp" scope="request"/>
- <c:set var="gridHeaderContainer" value="/pages/admin/products/featured-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="true" scope="request"/>
-
- <jsp:include page="/pages/admin/components/product-container.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+<script>
+
+
+
+</script>
+
+
+<div class="tabbable">
+
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+
+
+ <div class="sm-ui-component">
+
+ <c:if test="${product.id!=null && product.id>0}">
+ <c:set value="${product.id}" var="productId" scope="request"/>
+ <jsp:include page="/pages/admin/products/product-menu.jsp" />
+ </c:if>
+
+
+ <h3><s:message code="label.product.related.title" text="Related items" /></h3>
+ <br/>
+ <strong><c:out value="${product.sku}"/></strong>
+
+
+ <br/>
+ <div class="alert alert-info">
+ <s:message code="label.product.related.meassage" text="Drag and drop product from product list to related items box"/>
+ </div>
+
+ <!-- Listing grid include -->
+ <c:set value="/admin/products/paging.html" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/catalogue/related/paging.html?productId=${productId}" var="containerFetchUrl" scope="request"/>
+ <c:set value="/admin/catalogue/related/removeItem.html?baseProductId=${productId}" var="containerRemoveUrl" scope="request"/>
+ <c:set value="RELATED" var="removeEntity" scope="request"/>
+ <c:set value="/admin/catalogue/related/addItem.html?baseProductId=${productId}" var="containerAddUrl" scope="request"/>
+ <c:set value="/admin/catalogue/related/update.html" var="containerUpdateUrl" scope="request"/>
+ <c:set value="/admin/products/editProduct.html" var="editUrl" scope="request"/>
+ <c:set value="/admin/catalogue/related/list.html?id=${productId}" var="reloadUrl" scope="request"/>
+ <c:set var="componentTitleKey" value="label.product.related.title" scope="request"/>
+ <!-- same headers than featured -->
+ <c:set var="gridHeader" value="/pages/admin/products/featured-gridHeader.jsp" scope="request"/>
+ <c:set var="gridHeaderContainer" value="/pages/admin/products/featured-gridHeader.jsp" scope="request"/>
+ <c:set var="canRemoveEntry" value="true" scope="request"/>
+
+ <jsp:include page="/pages/admin/components/product-container.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/products/reviews.jsp b/sm-shop/src/main/webapp/pages/admin/products/reviews.jsp
index 01ff8c7..68f4b46 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/reviews.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/reviews.jsp
@@ -1,71 +1,71 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
- <div class="sm-ui-component">
-
-
- <c:if test="${product.id!=null && product.id>0}">
- <c:set value="${product.id}" var="productId" scope="request"/>
- <jsp:include page="/pages/admin/products/product-menu.jsp" />
- </c:if>
-
-
-
-
- <h3><s:message code="label.product.customer.reviews" text="Customer reviews" /></h3>
- <br/>
- <strong><c:out value="${product.sku}"/></strong>
-
- <br/>
-
-
- <!-- Listing grid include -->
- <c:set value="/admin/products/reviews/paging.html?productId=${product.id}" var="pagingUrl" scope="request"/>
- <c:set value="/admin/products/reviews/remove.html" var="removeUrl" scope="request"/>
- <c:set value="/admin/products/reviews/paging.html?productId=${product.id}" var="refreshUrl" scope="request"/>
- <c:set var="entityId" value="reviewId" scope="request"/>
- <c:set var="componentTitleKey" value="label.product.reviews" scope="request"/>
- <c:set var="gridHeader" value="/pages/admin/products/reviews-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="true" scope="request"/>
-
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
-
-
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+ <div class="sm-ui-component">
+
+
+ <c:if test="${product.id!=null && product.id>0}">
+ <c:set value="${product.id}" var="productId" scope="request"/>
+ <jsp:include page="/pages/admin/products/product-menu.jsp" />
+ </c:if>
+
+
+
+
+ <h3><s:message code="label.product.customer.reviews" text="Customer reviews" /></h3>
+ <br/>
+ <strong><c:out value="${product.sku}"/></strong>
+
+ <br/>
+
+
+ <!-- Listing grid include -->
+ <c:set value="/admin/products/reviews/paging.html?productId=${product.id}" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/products/reviews/remove.html" var="removeUrl" scope="request"/>
+ <c:set value="/admin/products/reviews/paging.html?productId=${product.id}" var="refreshUrl" scope="request"/>
+ <c:set var="entityId" value="reviewId" scope="request"/>
+ <c:set var="componentTitleKey" value="label.product.reviews" scope="request"/>
+ <c:set var="gridHeader" value="/pages/admin/products/reviews-gridHeader.jsp" scope="request"/>
+ <c:set var="canRemoveEntry" value="true" scope="request"/>
+
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+
+
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/products/reviews-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/products/reviews-gridHeader.jsp
index 85da89e..fda6f5b 100644
--- a/sm-shop/src/main/webapp/pages/admin/products/reviews-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/products/reviews-gridHeader.jsp
@@ -1,11 +1,11 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
- {title:"<s:message code="label.entity.id" text="Id"/>", name:"reviewId", canFilter:false},
- {title:"<s:message code="label.entity.details" text="Name"/>", name:"description"},
- {title:"<s:message code="label.product.reviews.rating" text="Rating"/>", name:"rating"}
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+ {title:"<s:message code="label.entity.id" text="Id"/>", name:"reviewId", canFilter:false},
+ {title:"<s:message code="label.entity.details" text="Name"/>", name:"description"},
+ {title:"<s:message code="label.product.reviews.rating" text="Rating"/>", name:"rating"}
diff --git a/sm-shop/src/main/webapp/pages/admin/profile/group.jsp b/sm-shop/src/main/webapp/pages/admin/profile/group.jsp
index 29dbb2f..f21483e 100644
--- a/sm-shop/src/main/webapp/pages/admin/profile/group.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/profile/group.jsp
@@ -1,87 +1,97 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
- <div class="sm-ui-component">
-
-
- <h3>
- <c:choose>
- <c:when test="${group.id!=null && group.id>0}">
- <s:message code="label.group.editgroup" text="Edit group" /> <c:out value="${category.code}"/>
- </c:when>
- <c:otherwise>
- <s:message code="label.group.creategroup" text="Create group" />
- </c:otherwise>
- </c:choose>
-
- </h3>
- <br/>
-
- <c:url var="groupSave" value="/admin/group/save.html"/>
-
-
- <form:form method="POST" modelAttribute="group" action="${groupSave}">
-
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
-
-
- <div class="control-group">
- <label class="required"><s:message code="label.group.name" text="Group name"/></label>
- <div class="controls">
- <form:input cssClass="input-large" path="groupName" />
- </div>
- </div>
-
-
- <form:hidden path="id" />
-
- <div class="form-actions">
-
- <div class="pull-right">
-
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
-
-
- </div>
-
- </div>
-
- </form:form>
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
- </div>
\ No newline at end of file
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
+<%@ page session="false"%>
+
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+ <div class="sm-ui-component">
+
+
+ <h3>
+ <c:choose>
+ <c:when test="${group.group.id!=null && group.group.id>0}">
+ <s:message code="label.group.editgroup" text="Edit group" />
+ <c:out value="${category.code}" />
+ </c:when>
+ <c:otherwise>
+ <s:message code="label.group.creategroup" text="Create group" />
+ </c:otherwise>
+ </c:choose>
+
+ </h3>
+ <br />
+
+ <c:url var="groupSave" value="/admin/group/save.html" />
+
+
+ <form:form method="POST" commandName="group" action="${groupSave}">
+
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success"
+ style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>">
+ <s:message code="message.success" text="Request successfull" />
+ </div>
+
+
+ <form:hidden path="group.id" />
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.group.name"
+ text="Group name" /></label>
+ <div class="controls">
+ <form:input cssClass="input-large" path="group.groupName" />
+ <span class="help-inline"><form:errors path="group.groupName"
+ cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.entity.type" text="Type" /></label>
+ <div class="controls">
+ <form:select path="group.groupType">
+ <form:options items="${group.types}" />
+ </form:select>
+ <span class="help-inline"><form:errors path="group.groupType"
+ cssClass="error" /></span>
+ </div>
+ </div>
+
+ <c:if test="${group.group.groupType != 'ADMIN'}">
+ <div class="form-actions">
+
+ <div class="pull-right">
+
+ <button type="submit" class="btn btn-success">
+ <s:message code="button.label.submit" text="Submit" />
+ </button>
+
+ </div>
+
+ </div>
+ </c:if>
+
+
+ </form:form>
+
+ </div>
+
+ </div>
+
+
+ </div>
+
+</div>
diff --git a/sm-shop/src/main/webapp/pages/admin/profile/groups.jsp b/sm-shop/src/main/webapp/pages/admin/profile/groups.jsp
index 2bdf271..94db9d4 100644
--- a/sm-shop/src/main/webapp/pages/admin/profile/groups.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/profile/groups.jsp
@@ -1,50 +1,54 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
- <div class="sm-ui-component">
- <h3><s:message code="label.groups.title" text="Groups" /></h3>
- <br/>
-
-
- <!-- Listing grid include -->
- <c:set value="/admin/groups/paging.html" var="pagingUrl" scope="request"/>
- <c:set value="/admin/groups/editGroup.html?id=${group.id}" var="editUrl" scope="request"/>
- <c:set var="entityId" value="groupId" scope="request"/>
- <c:set var="expandDetails" value="description" scope="request"/>
- <c:set var="componentTitleKey" value="label.groups.title" scope="request"/>
- <c:set var="gridHeader" value="/pages/admin/profile/groups-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="false" scope="request"/>
-
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
-
-
-
- </div>
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+ <div class="sm-ui-component">
+ <h3><s:message code="label.groups.title" text="Groups" /></h3>
+ <br/>
+
+
+ <!-- Listing grid include -->
+ <c:set value="/admin/groups/paging.html" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/groups/editGroup.html" var="editUrl" scope="request"/>
+ <c:set value="/admin/groups/delete.html" var="removeUrl" scope="request"/>
+ <c:set value="/admin/groups/groups.html" var="refreshUrl" scope="request"/>
+ <c:set var="entityId" value="groupId" scope="request"/>
+ <c:set var="expandDetails" value="description" scope="request"/>
+ <c:set var="componentTitleKey" value="label.groups.title" scope="request"/>
+ <c:set var="gridHeader" value="/pages/admin/profile/groups-gridHeader.jsp" scope="request"/>
+ <sec:authorize access="hasRole('STORE_ADMIN') and fullyAuthenticated">
+ <c:set var="canRemoveEntry" value="true" scope="request"/>
+ </sec:authorize>
+
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+
+
+
+ </div>
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/profile/groups-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/profile/groups-gridHeader.jsp
index 9f94ca5..1e66179 100644
--- a/sm-shop/src/main/webapp/pages/admin/profile/groups-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/profile/groups-gridHeader.jsp
@@ -1,10 +1,12 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
- {title:"<s:message code="label.entity.id" text="Id"/>", name:"groupId", canFilter:false},
- {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false}
\ No newline at end of file
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+ {title:"<s:message code="label.entity.id" text="Id"/>", name:"groupId", canFilter:false},
+ {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false},
+ {title:"<s:message code="label.entity.type" text="Type"/>", name:"type", canFilter:false},
+ {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
\ No newline at end of file
sm-shop/src/main/webapp/pages/admin/profile/permission.jsp 256(+128 -128)
diff --git a/sm-shop/src/main/webapp/pages/admin/profile/permission.jsp b/sm-shop/src/main/webapp/pages/admin/profile/permission.jsp
index 1a326eb..5034946 100644
--- a/sm-shop/src/main/webapp/pages/admin/profile/permission.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/profile/permission.jsp
@@ -1,129 +1,129 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-<script src="<c:url value="/resources/js/ckeditor/ckeditor.js" />"></script>
-
-
- <script type="text/javascript">
-
-
-
- $(function(){
- $('.btn').addClass('disabled');
- <c:forEach items="${category.descriptions}" var="description" varStatus="counter">
- $("#name${counter.index}").friendurl({id : 'seUrl${counter.index}'});
- </c:forEach>
- });
-
-
- function validateCode() {
- $('#checkCodeStatus').html('<img src="<c:url value="/resources/img/ajax-loader.gif" />');
- $('#checkCodeStatus').show();
- var code = $("#code").val();
- checkCode(code,'<c:url value="/admin/categories/checkCategoryCode.html" />');
- }
-
- function callBackCheckCode(msg,code) {
-
- if(code==9999 || code==0) {
-
- $('#checkCodeStatus').html('<font color="green"><s:message code="message.code.available" text="This code is available"/></font>');
- $('#checkCodeStatus').show();
- $('.btn').removeClass('disabled');
- }
- if(code==9998) {
-
- $('#checkCodeStatus').html('<font color="red"><s:message code="message.code.exist" text="This code already exist"/></font>');
- $('#checkCodeStatus').show();
- $('.btn').addClass('disabled');
- }
-
- }
-
-
- </script>
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
- <div class="sm-ui-component">
-
-
- <h3>
- <c:choose>
- <c:when test="${permission.id!=null && permission.id>0}">
- <s:message code="label.permission.editpermission" text="Edit permission" /> <c:out value="${category.code}"/>
- </c:when>
- <c:otherwise>
- <s:message code="label.permission.createpermission" text="Create permission" />
- </c:otherwise>
- </c:choose>
-
- </h3>
- <br/>
-
- <c:url var="permissionSave" value="/admin/permission/save.html"/>
-
-
- <form:form method="POST" modelAttribute="permission" action="${permissionSave}">
-
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
-
-
- <div class="control-group">
- <label class="required"><s:message code="label.permission.name" text="Permission name"/></label>
- <div class="controls">
- <form:input cssClass="input-large" path="permissionName" />
- </div>
- </div>
-
-
- <form:hidden path="id" />
-
- <div class="form-actions">
-
- <div class="pull-right">
-
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
-
-
- </div>
-
- </div>
-
- </form:form>
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+<script src="<c:url value="/resources/js/ckeditor/ckeditor.js" />"></script>
+
+
+ <script type="text/javascript">
+
+
+
+ $(function(){
+ $('.btn').addClass('disabled');
+ <c:forEach items="${category.descriptions}" var="description" varStatus="counter">
+ $("#name${counter.index}").friendurl({id : 'seUrl${counter.index}'});
+ </c:forEach>
+ });
+
+
+ function validateCode() {
+ $('#checkCodeStatus').html('<img src="<c:url value="/resources/img/ajax-loader.gif" />');
+ $('#checkCodeStatus').show();
+ var code = $("#code").val();
+ checkCode(code,'<c:url value="/admin/categories/checkCategoryCode.html" />');
+ }
+
+ function callBackCheckCode(msg,code) {
+
+ if(code==9999 || code==0) {
+
+ $('#checkCodeStatus').html('<font color="green"><s:message code="message.code.available" text="This code is available"/></font>');
+ $('#checkCodeStatus').show();
+ $('.btn').removeClass('disabled');
+ }
+ if(code==9998) {
+
+ $('#checkCodeStatus').html('<font color="red"><s:message code="message.code.exist" text="This code already exist"/></font>');
+ $('#checkCodeStatus').show();
+ $('.btn').addClass('disabled');
+ }
+
+ }
+
+
+ </script>
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+ <div class="sm-ui-component">
+
+
+ <h3>
+ <c:choose>
+ <c:when test="${permission.id!=null && permission.id>0}">
+ <s:message code="label.permission.editpermission" text="Edit permission" /> <c:out value="${category.code}"/>
+ </c:when>
+ <c:otherwise>
+ <s:message code="label.permission.createpermission" text="Create permission" />
+ </c:otherwise>
+ </c:choose>
+
+ </h3>
+ <br/>
+
+ <c:url var="permissionSave" value="/admin/permission/save.html"/>
+
+
+ <form:form method="POST" modelAttribute="permission" action="${permissionSave}">
+
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.permission.name" text="Permission name"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large" path="permissionName" />
+ </div>
+ </div>
+
+
+ <form:hidden path="id" />
+
+ <div class="form-actions">
+
+ <div class="pull-right">
+
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
+
+
+ </div>
+
+ </div>
+
+ </form:form>
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/profile/permissions.jsp b/sm-shop/src/main/webapp/pages/admin/profile/permissions.jsp
index 10aaf05..d3d5989 100644
--- a/sm-shop/src/main/webapp/pages/admin/profile/permissions.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/profile/permissions.jsp
@@ -1,57 +1,57 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
- <div class="sm-ui-component">
- <h3><s:message code="label.permissions.title" text="Permissions" /></h3>
- <br/>
-
-
- <!-- Listing grid include -->
- <c:set value="/admin/permissions/paging.html" var="pagingUrl" scope="request"/>
- <c:set value="/admin/permissions/editPermission.html?id=${group.id}" var="editUrl" scope="request"/>
- <c:set var="entityId" value="groupId" scope="request"/>
- <c:set var="componentTitleKey" value="label.permissions.title" scope="request"/>
- <c:set var="gridHeader" value="/pages/admin/profile/permissions-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="false" scope="request"/>
-
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+ <div class="sm-ui-component">
+ <h3><s:message code="label.permissions.title" text="Permissions" /></h3>
+ <br/>
+
+
+ <!-- Listing grid include -->
+ <c:set value="/admin/permissions/paging.html" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/permissions/editPermission.html?id=${group.id}" var="editUrl" scope="request"/>
+ <c:set var="entityId" value="groupId" scope="request"/>
+ <c:set var="componentTitleKey" value="label.permissions.title" scope="request"/>
+ <c:set var="gridHeader" value="/pages/admin/profile/permissions-gridHeader.jsp" scope="request"/>
+ <c:set var="canRemoveEntry" value="false" scope="request"/>
+
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/profile/permissions-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/profile/permissions-gridHeader.jsp
index d36ea2a..ddfe9bf 100644
--- a/sm-shop/src/main/webapp/pages/admin/profile/permissions-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/profile/permissions-gridHeader.jsp
@@ -1,11 +1,11 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
- {title:"<s:message code="label.entity.id" text="Id"/>", name:"permissionId", canFilter:false},
- {title:"<s:message code="label.entity.name" text="Name"/>", name:"name"},
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+ {title:"<s:message code="label.entity.id" text="Id"/>", name:"permissionId", canFilter:false},
+ {title:"<s:message code="label.entity.name" text="Name"/>", name:"name"},
{title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/profile/profile.jsp b/sm-shop/src/main/webapp/pages/admin/profile/profile.jsp
index f91b4eb..36707d3 100644
--- a/sm-shop/src/main/webapp/pages/admin/profile/profile.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/profile/profile.jsp
@@ -155,7 +155,7 @@
<span class="help-inline"><form:errors path="groups" cssClass="error" /></span>
</div>
</div>
- </sec:authorize>
+ </sec:authorize>
<sec:authorize access="hasRole('ADMIN') and fullyAuthenticated">
diff --git a/sm-shop/src/main/webapp/pages/admin/profile/users.jsp b/sm-shop/src/main/webapp/pages/admin/profile/users.jsp
index 62689f5..a925472 100644
--- a/sm-shop/src/main/webapp/pages/admin/profile/users.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/profile/users.jsp
@@ -1,48 +1,48 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="catalogue-section">
-
-
-
- <div class="sm-ui-component">
- <h3><s:message code="menu.users" text="Users" /></h3>
- <br/>
-
- <!-- Listing grid include -->
- <c:set value="/admin/users/paging.html" var="pagingUrl" scope="request"/>
- <c:set value="/admin/users/remove.html" var="removeUrl" scope="request"/>
- <c:set value="/admin/users/list.html" var="refreshUrl" scope="request"/>
- <c:set value="/admin/users/displayStoreUser.html" var="editUrl" scope="request"/>
- <c:set var="entityId" value="userId" scope="request"/>
- <c:set var="componentTitleKey" value="menu.users" scope="request"/>
- <c:set var="gridHeader" value="/pages/admin/profile/users-gridHeader.jsp" scope="request"/>
- <sec:authorize access="hasRole('STORE_ADMIN') and fullyAuthenticated">
- <c:set var="canRemoveEntry" value="true" scope="request"/>
- </sec:authorize>
-
-
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
-
- </div>
-
- </div>
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="catalogue-section">
+
+
+
+ <div class="sm-ui-component">
+ <h3><s:message code="menu.users" text="Users" /></h3>
+ <br/>
+
+ <!-- Listing grid include -->
+ <c:set value="/admin/users/paging.html" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/users/remove.html" var="removeUrl" scope="request"/>
+ <c:set value="/admin/users/list.html" var="refreshUrl" scope="request"/>
+ <c:set value="/admin/users/displayStoreUser.html" var="editUrl" scope="request"/>
+ <c:set var="entityId" value="userId" scope="request"/>
+ <c:set var="componentTitleKey" value="menu.users" scope="request"/>
+ <c:set var="gridHeader" value="/pages/admin/profile/users-gridHeader.jsp" scope="request"/>
+ <sec:authorize access="hasRole('STORE_ADMIN') and fullyAuthenticated">
+ <c:set var="canRemoveEntry" value="true" scope="request"/>
+ </sec:authorize>
+
+
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+
+ </div>
+
+ </div>
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/profile/users-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/profile/users-gridHeader.jsp
index 0fd6027..c681a6f 100644
--- a/sm-shop/src/main/webapp/pages/admin/profile/users-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/profile/users-gridHeader.jsp
@@ -1,17 +1,17 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
-<%@ page session="false" %>
-
-
-
- {title:"<s:message code="label.entity.id" text="Id"/>", name:"userId", canFilter:false},
- {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false},
- {title:"<s:message code="label.generic.email" text="Email"/>", name:"email", canFilter:false},
- {title:"<s:message code="label.entity.active" text="Active"/>", name:"active", canFilter:false}
- <sec:authorize access="hasRole('STORE_ADMIN') and fullyAuthenticated">
- ,
- {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
+<%@ page session="false" %>
+
+
+
+ {title:"<s:message code="label.entity.id" text="Id"/>", name:"userId", canFilter:false},
+ {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false},
+ {title:"<s:message code="label.generic.email" text="Email"/>", name:"email", canFilter:false},
+ {title:"<s:message code="label.entity.active" text="Active"/>", name:"active", canFilter:false}
+ <sec:authorize access="hasRole('STORE_ADMIN') and fullyAuthenticated">
+ ,
+ {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
</sec:authorize>
\ No newline at end of file
sm-shop/src/main/webapp/pages/admin/shipping/canadapost.jsp 202(+101 -101)
diff --git a/sm-shop/src/main/webapp/pages/admin/shipping/canadapost.jsp b/sm-shop/src/main/webapp/pages/admin/shipping/canadapost.jsp
index c43d60e..e92e6e8 100644
--- a/sm-shop/src/main/webapp/pages/admin/shipping/canadapost.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/shipping/canadapost.jsp
@@ -1,102 +1,102 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
-
- <div class="control-group">
- <label class="required"><s:message code="module.shipping.canadapost.identifier" text="Account identifier"/></label>
- <div class="controls">
- <form:input cssClass="input-large highlight" path="integrationKeys['account']" />
- </div>
- <span class="help-inline">
- <c:if test="${identifier!=null}">
- <span id="identifiererrors" class="error"><s:message code="module.shipping.canadapost.message.identifier" text="Field in error"/></span>
- </c:if>
- </span>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="module.shipping.canadapost.username" text="Username"/></label>
- <div class="controls">
- <form:input cssClass="input-large highlight" path="integrationKeys['username']" />
- </div>
- <span class="help-inline">
- <c:if test="${username!=null}">
- <span id="identifiererrors" class="error"><s:message code="module.shipping.canadapost.message.username" text="Field in error"/></span>
- </c:if>
- </span>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="module.shipping.canadapost.password" text="Password"/></label>
- <div class="controls">
- <form:input cssClass="input-large highlight" path="integrationKeys['password']" />
- </div>
- <span class="help-inline">
- <c:if test="${password!=null}">
- <span id="identifiererrors" class="error"><s:message code="module.shipping.canadapost.message.password" text="Field in error"/></span>
- </c:if>
- </span>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="module.shipping.canadapost.apikey" text="API key"/></label>
- <div class="controls">
- <form:input cssClass="input-large highlight" path="integrationKeys['apikey']" />
- </div>
- <span class="help-inline">
- <c:if test="${apikey!=null}">
- <span id="identifiererrors" class="error"><s:message code="module.shipping.canadapost.message.apikey" text="Field in error"/></span>
- </c:if>
- </span>
- </div>
-
- <div class="control-group">
- <label class="required"><strong><s:message code="module.shipping.canadapost.services" text="Services"/> - <s:message code="module.shipping.canada" text="Canada"/></strong></label>
- <div class="controls">
- <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-domestic']" value="DOM.RP" /> <s:message code="module.shipping.canadapost.DOM.RP" text="DOM.RP" /><br/>
- <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-domestic']" value="DOM.EP" /> <s:message code="module.shipping.canadapost.DOM.EP" text="DOM.EP" /><br/>
- <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-domestic']" value="DOM.XP" /> <s:message code="module.shipping.canadapost.DOM.XP" text="DOM.XP" /><br/>
- <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-domestic']" value="DOM.XP.CERT" /> <s:message code="module.shipping.canadapost.DOM.XP.CERT" text="DOM.XP.CERT" /><br/>
- <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-domestic']" value="DOM.PC" /> <s:message code="module.shipping.canadapost.DOM.PC" text="DOM.PC" /><br/>
- <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-domestic']" value="DOM.DT" /> <s:message code="module.shipping.canadapost.DOM.DT" text="DOM.DT" /><br/>
- <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-domestic']" value="DOM.LIB" /> <s:message code="module.shipping.canadapost.DOM.LIB" text="DOM.LIB" /><br/>
- </div>
- </div>
-
- <div class="control-group">
- <label class="required"><strong><s:message code="module.shipping.canadapost.services" text="Services"/> - <s:message code="module.shipping.usa" text="United states"/></strong></label>
- <div class="controls">
- <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-usa']" value="USA.EP" /> <s:message code="module.shipping.canadapost.USA.EP" text="USA.EP" /><br/>
- <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-usa']" value="USA.PW.ENV" /> <s:message code="module.shipping.canadapost.USA.PW.ENV" text="USA.PW.ENV" /><br/>
- <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-usa']" value="USA.PW.PAK" /> <s:message code="module.shipping.canadapost.USA.PW.PAK" text="USA.PW.PAK" /><br/>
- <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-usa']" value="USA.PW.PARCEL" /> <s:message code="module.shipping.canadapost.USA.PW.PARCEL" text="USA.PW.PARCEL" /><br/>
- <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-usa']" value="USA.SP.AIR" /> <s:message code="module.shipping.canadapost.USA.SP.AIR" text="SA.SP.AIR" /><br/>
- <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-usa']" value="USA.TP" /> <s:message code="module.shipping.canadapost.USA.TP" text="USA.TP" /><br/>
- <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-usa']" value="USA.TP.LVM" /> <s:message code="module.shipping.canadapost.USA.TP.LVW" text="USA.TP.LVW" /><br/>
- <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-usa']" value="USA.XP" /> <s:message code="module.shipping.canadapost.USA.XP" text="USA.XP" /><br/>
- </div>
- </div>
-
- <div class="control-group">
- <label class="required"><strong><s:message code="module.shipping.canadapost.services" text="Services"/> - <s:message code="module.shipping.intl" text="International"/></strong></label>
- <div class="controls">
- <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-intl']" value="INT.XP" /> <s:message code="module.shipping.canadapost.INT.XP" text="INT.XP" /><br/>
- <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-intl']" value="INT.IP.AIR" /> <s:message code="module.shipping.canadapost.USA.PW.ENV" text="INT.IP.AIR" /><br/>
- <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-intl']" value="INT.IP.SURF" /> <s:message code="module.shipping.canadapost.INT.IP.SURF" text="INT.IP.SURF" /><br/>
- <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-intl']" value="INT.PW.ENV" /> <s:message code="module.shipping.canadapost.INT.PW.ENV" text="INT.PW.ENV" /><br/>
- <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-intl']" value="INT.PW.PAK" /> <s:message code="module.shipping.canadapost.INT.PW.PAK" text="INT.PW.PAK" /><br/>
- <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-intl']" value="INT.PW.PARCEL" /> <s:message code="module.shipping.canadapost.INT.PW.PARCEL" text="INT.PW.PARCEL" /><br/>
- <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-intl']" value="INT.SP.AIR" /> <s:message code="module.shipping.canadapost.INT.SP.AIR" text="INT.SP.AIR" /><br/>
- <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-intl']" value="INT.SP.SURF" /> <s:message code="module.shipping.canadapost.INT.SP.SURF" text="INT.SP.SURF" /><br/>
- <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-intl']" value="INT.TP" /> <s:message code="module.shipping.canadapost.INT.TP" text="INT.TP" /><br/>
- </div>
- </div>
-
-
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.shipping.canadapost.identifier" text="Account identifier"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" path="integrationKeys['account']" />
+ </div>
+ <span class="help-inline">
+ <c:if test="${identifier!=null}">
+ <span id="identifiererrors" class="error"><s:message code="module.shipping.canadapost.message.identifier" text="Field in error"/></span>
+ </c:if>
+ </span>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.shipping.canadapost.username" text="Username"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" path="integrationKeys['username']" />
+ </div>
+ <span class="help-inline">
+ <c:if test="${username!=null}">
+ <span id="identifiererrors" class="error"><s:message code="module.shipping.canadapost.message.username" text="Field in error"/></span>
+ </c:if>
+ </span>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.shipping.canadapost.password" text="Password"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" path="integrationKeys['password']" />
+ </div>
+ <span class="help-inline">
+ <c:if test="${password!=null}">
+ <span id="identifiererrors" class="error"><s:message code="module.shipping.canadapost.message.password" text="Field in error"/></span>
+ </c:if>
+ </span>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.shipping.canadapost.apikey" text="API key"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" path="integrationKeys['apikey']" />
+ </div>
+ <span class="help-inline">
+ <c:if test="${apikey!=null}">
+ <span id="identifiererrors" class="error"><s:message code="module.shipping.canadapost.message.apikey" text="Field in error"/></span>
+ </c:if>
+ </span>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><strong><s:message code="module.shipping.canadapost.services" text="Services"/> - <s:message code="module.shipping.canada" text="Canada"/></strong></label>
+ <div class="controls">
+ <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-domestic']" value="DOM.RP" /> <s:message code="module.shipping.canadapost.DOM.RP" text="DOM.RP" /><br/>
+ <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-domestic']" value="DOM.EP" /> <s:message code="module.shipping.canadapost.DOM.EP" text="DOM.EP" /><br/>
+ <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-domestic']" value="DOM.XP" /> <s:message code="module.shipping.canadapost.DOM.XP" text="DOM.XP" /><br/>
+ <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-domestic']" value="DOM.XP.CERT" /> <s:message code="module.shipping.canadapost.DOM.XP.CERT" text="DOM.XP.CERT" /><br/>
+ <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-domestic']" value="DOM.PC" /> <s:message code="module.shipping.canadapost.DOM.PC" text="DOM.PC" /><br/>
+ <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-domestic']" value="DOM.DT" /> <s:message code="module.shipping.canadapost.DOM.DT" text="DOM.DT" /><br/>
+ <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-domestic']" value="DOM.LIB" /> <s:message code="module.shipping.canadapost.DOM.LIB" text="DOM.LIB" /><br/>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><strong><s:message code="module.shipping.canadapost.services" text="Services"/> - <s:message code="module.shipping.usa" text="United states"/></strong></label>
+ <div class="controls">
+ <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-usa']" value="USA.EP" /> <s:message code="module.shipping.canadapost.USA.EP" text="USA.EP" /><br/>
+ <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-usa']" value="USA.PW.ENV" /> <s:message code="module.shipping.canadapost.USA.PW.ENV" text="USA.PW.ENV" /><br/>
+ <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-usa']" value="USA.PW.PAK" /> <s:message code="module.shipping.canadapost.USA.PW.PAK" text="USA.PW.PAK" /><br/>
+ <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-usa']" value="USA.PW.PARCEL" /> <s:message code="module.shipping.canadapost.USA.PW.PARCEL" text="USA.PW.PARCEL" /><br/>
+ <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-usa']" value="USA.SP.AIR" /> <s:message code="module.shipping.canadapost.USA.SP.AIR" text="SA.SP.AIR" /><br/>
+ <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-usa']" value="USA.TP" /> <s:message code="module.shipping.canadapost.USA.TP" text="USA.TP" /><br/>
+ <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-usa']" value="USA.TP.LVM" /> <s:message code="module.shipping.canadapost.USA.TP.LVW" text="USA.TP.LVW" /><br/>
+ <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-usa']" value="USA.XP" /> <s:message code="module.shipping.canadapost.USA.XP" text="USA.XP" /><br/>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><strong><s:message code="module.shipping.canadapost.services" text="Services"/> - <s:message code="module.shipping.intl" text="International"/></strong></label>
+ <div class="controls">
+ <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-intl']" value="INT.XP" /> <s:message code="module.shipping.canadapost.INT.XP" text="INT.XP" /><br/>
+ <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-intl']" value="INT.IP.AIR" /> <s:message code="module.shipping.canadapost.USA.PW.ENV" text="INT.IP.AIR" /><br/>
+ <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-intl']" value="INT.IP.SURF" /> <s:message code="module.shipping.canadapost.INT.IP.SURF" text="INT.IP.SURF" /><br/>
+ <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-intl']" value="INT.PW.ENV" /> <s:message code="module.shipping.canadapost.INT.PW.ENV" text="INT.PW.ENV" /><br/>
+ <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-intl']" value="INT.PW.PAK" /> <s:message code="module.shipping.canadapost.INT.PW.PAK" text="INT.PW.PAK" /><br/>
+ <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-intl']" value="INT.PW.PARCEL" /> <s:message code="module.shipping.canadapost.INT.PW.PARCEL" text="INT.PW.PARCEL" /><br/>
+ <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-intl']" value="INT.SP.AIR" /> <s:message code="module.shipping.canadapost.INT.SP.AIR" text="INT.SP.AIR" /><br/>
+ <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-intl']" value="INT.SP.SURF" /> <s:message code="module.shipping.canadapost.INT.SP.SURF" text="INT.SP.SURF" /><br/>
+ <form:checkbox cssClass="input-large highlight" path="integrationOptions['services-intl']" value="INT.TP" /> <s:message code="module.shipping.canadapost.INT.TP" text="INT.TP" /><br/>
+ </div>
+ </div>
+
+
+
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/shipping/customShippingDetails.jsp b/sm-shop/src/main/webapp/pages/admin/shipping/customShippingDetails.jsp
index a6f3603..d237a5f 100644
--- a/sm-shop/src/main/webapp/pages/admin/shipping/customShippingDetails.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/shipping/customShippingDetails.jsp
@@ -1,149 +1,149 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-<script type="text/javascript">
-var priceFormatMessage = '<s:message code="message.price.cents" text="Wrong format" />';
-</script>
-
-<script src="<c:url value="/resources/js/jquery.formatCurrency-1.4.0.js" />"></script>
-<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
-<script src="<c:url value="/resources/js/adminFunctions.js" />"></script>
-
-<script type="text/javascript">
-
-$(document).ready(function() {
-
- $('#priceText').numeric({allow:"."});
- $('#maximumWeight').numeric();
-
-
- $('#priceText').blur(function() {
- $('#help-priceText').html(null);
- $(this).formatCurrency({ roundToDecimalPlace: 2, eventOnDecimalsEntered: true, symbol: ''});
- })
- .keyup(function(e) {
- var e = window.event || e;
- var keyUnicode = e.charCode || e.keyCode;
- if (e !== undefined) {
- switch (keyUnicode) {
- case 16: break; // Shift
- case 17: break; // Ctrl
- case 18: break; // Alt
- case 27: this.value = ''; break; // Esc: clear entry
- case 35: break; // End
- case 36: break; // Home
- case 37: break; // cursor left
- case 38: break; // cursor up
- case 39: break; // cursor right
- case 40: break; // cursor down
- case 78: break; // N (Opera 9.63+ maps the "." from the number key section to the "N" key too!) (See: http://unixpapa.com/js/key.html search for ". Del")
- case 110: break; // . number block (Opera 9.63+ maps the "." from the number block to the "N" key (78) !!!)
- case 190: break; // .
- default: $(this).formatCurrency({ colorize: true, negativeFormat: '-%s%n', roundToDecimalPlace: -1, eventOnDecimalsEntered: true, symbol: ''});
- }
- }
- })
- .bind('decimalsEntered', function(e, cents) {
- if (String(cents).length > 2) {
- var errorMsg = priceFormatMessage + ' (0.' + cents + ')';
- $('#help-priceText').html(errorMsg);
- }
- });
-
-});
-
-</script>
-
-
-<div class="tabbable">
-
-
- <jsp:include page="/common/adminTabs.jsp" />
-
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="shipping-section">
-
- <div class="sm-ui-component">
- <a href="<c:url value="/admin/shipping/weightBased.html"/>"><s:message code="label.generic.back" text="Back" /></a><br/><br/>
- <h3><s:message code="module.shipping.weightBased" text="module.shipping.weightBased" /> - <c:out value="${customRegion.customRegionName}" /></h3>
- <br/>
-
- <c:url var="addPrice" value="/admin/shipping/weightBased/addPrice.html"/>
- <form:form method="POST" commandName="customQuote" action="${addPrice}">
-
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
-
- <div class="control-group">
- <label><s:message code="label.shipping.maximumWeight" text="Maximum weight" /></label>
- <div class="controls">
- <input type="text" class="span3" name="maximumWeight" id="maximumWeight" value="0">
- </div>
- <span class="help-inline"><form:errors path="maximumWeight" cssClass="error" /></span>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.generic.price" text="Price" /></label>
- <div class="controls">
- <input type="text" class="span3" name="priceText" id="priceText">
- </div>
- <span id="help-priceText" class="help-inline"><form:errors path="priceText" cssClass="error" /></span>
- </div>
- <input type="hidden" name="region" value="${customRegion.customRegionName}" />
-
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
- </div>
- </div>
-
-
- </form:form>
-
-
-
- <br/>
-
-
-
- <!-- Listing grid include -->
- <c:set value="/admin/shipping/weightBasedDetails/page.html?region=${customRegion.customRegionName}" var="pagingUrl" scope="request"/>
- <c:set value="/admin/shipping/weightBased/removePrice.html?region=${customRegion.customRegionName}" var="removeUrl" scope="request"/>
- <c:set var="entityId" value="maximumWeight" scope="request"/>
- <c:set value="/admin/shipping/weightBased/edit.html?customRegionName=${customRegion.customRegionName}" var="afterRemoveUrl" scope="request"/>
- <c:set var="componentTitleKey" value="module.shipping.weightBased" scope="request"/>
- <c:set var="gridHeader" value="/pages/admin/shipping/weightBasedDetails-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="true" scope="request"/>
-
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
- <br/><br/>
- <c:url var="removeRegion" value="/admin/shipping/weightBased/deleteRegion.html"/>
- <form:form method="POST" enctype="multipart/form-data" commandName="region" action="${removeRegion}">
- <input type="hidden" name="customRegionName" value="${customRegion.customRegionName}" />
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn-danger"><i class="icon-trash icon-large"></i><s:message code="label.generic.remove" text="Remove"/></button>
- </div>
- </div>
-
- </form:form>
-
-
- </div>
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+<script type="text/javascript">
+var priceFormatMessage = '<s:message code="message.price.cents" text="Wrong format" />';
+</script>
+
+<script src="<c:url value="/resources/js/jquery.formatCurrency-1.4.0.js" />"></script>
+<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
+<script src="<c:url value="/resources/js/adminFunctions.js" />"></script>
+
+<script type="text/javascript">
+
+$(document).ready(function() {
+
+ $('#priceText').numeric({allow:"."});
+ $('#maximumWeight').numeric();
+
+
+ $('#priceText').blur(function() {
+ $('#help-priceText').html(null);
+ $(this).formatCurrency({ roundToDecimalPlace: 2, eventOnDecimalsEntered: true, symbol: ''});
+ })
+ .keyup(function(e) {
+ var e = window.event || e;
+ var keyUnicode = e.charCode || e.keyCode;
+ if (e !== undefined) {
+ switch (keyUnicode) {
+ case 16: break; // Shift
+ case 17: break; // Ctrl
+ case 18: break; // Alt
+ case 27: this.value = ''; break; // Esc: clear entry
+ case 35: break; // End
+ case 36: break; // Home
+ case 37: break; // cursor left
+ case 38: break; // cursor up
+ case 39: break; // cursor right
+ case 40: break; // cursor down
+ case 78: break; // N (Opera 9.63+ maps the "." from the number key section to the "N" key too!) (See: http://unixpapa.com/js/key.html search for ". Del")
+ case 110: break; // . number block (Opera 9.63+ maps the "." from the number block to the "N" key (78) !!!)
+ case 190: break; // .
+ default: $(this).formatCurrency({ colorize: true, negativeFormat: '-%s%n', roundToDecimalPlace: -1, eventOnDecimalsEntered: true, symbol: ''});
+ }
+ }
+ })
+ .bind('decimalsEntered', function(e, cents) {
+ if (String(cents).length > 2) {
+ var errorMsg = priceFormatMessage + ' (0.' + cents + ')';
+ $('#help-priceText').html(errorMsg);
+ }
+ });
+
+});
+
+</script>
+
+
+<div class="tabbable">
+
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="shipping-section">
+
+ <div class="sm-ui-component">
+ <a href="<c:url value="/admin/shipping/weightBased.html"/>"><s:message code="label.generic.back" text="Back" /></a><br/><br/>
+ <h3><s:message code="module.shipping.weightBased" text="module.shipping.weightBased" /> - <c:out value="${customRegion.customRegionName}" /></h3>
+ <br/>
+
+ <c:url var="addPrice" value="/admin/shipping/weightBased/addPrice.html"/>
+ <form:form method="POST" commandName="customQuote" action="${addPrice}">
+
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.shipping.maximumWeight" text="Maximum weight" /></label>
+ <div class="controls">
+ <input type="text" class="span3" name="maximumWeight" id="maximumWeight" value="0">
+ </div>
+ <span class="help-inline"><form:errors path="maximumWeight" cssClass="error" /></span>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.generic.price" text="Price" /></label>
+ <div class="controls">
+ <input type="text" class="span3" name="priceText" id="priceText">
+ </div>
+ <span id="help-priceText" class="help-inline"><form:errors path="priceText" cssClass="error" /></span>
+ </div>
+ <input type="hidden" name="region" value="${customRegion.customRegionName}" />
+
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
+ </div>
+ </div>
+
+
+ </form:form>
+
+
+
+ <br/>
+
+
+
+ <!-- Listing grid include -->
+ <c:set value="/admin/shipping/weightBasedDetails/page.html?region=${customRegion.customRegionName}" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/shipping/weightBased/removePrice.html?region=${customRegion.customRegionName}" var="removeUrl" scope="request"/>
+ <c:set var="entityId" value="maximumWeight" scope="request"/>
+ <c:set value="/admin/shipping/weightBased/edit.html?customRegionName=${customRegion.customRegionName}" var="afterRemoveUrl" scope="request"/>
+ <c:set var="componentTitleKey" value="module.shipping.weightBased" scope="request"/>
+ <c:set var="gridHeader" value="/pages/admin/shipping/weightBasedDetails-gridHeader.jsp" scope="request"/>
+ <c:set var="canRemoveEntry" value="true" scope="request"/>
+
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+ <br/><br/>
+ <c:url var="removeRegion" value="/admin/shipping/weightBased/deleteRegion.html"/>
+ <form:form method="POST" enctype="multipart/form-data" commandName="region" action="${removeRegion}">
+ <input type="hidden" name="customRegionName" value="${customRegion.customRegionName}" />
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn-danger"><i class="icon-trash icon-large"></i><s:message code="label.generic.remove" text="Remove"/></button>
+ </div>
+ </div>
+
+ </form:form>
+
+
+ </div>
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
sm-shop/src/main/webapp/pages/admin/shipping/packaging.jsp 240(+120 -120)
diff --git a/sm-shop/src/main/webapp/pages/admin/shipping/packaging.jsp b/sm-shop/src/main/webapp/pages/admin/shipping/packaging.jsp
index f62503d..1a50f87 100644
--- a/sm-shop/src/main/webapp/pages/admin/shipping/packaging.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/shipping/packaging.jsp
@@ -1,121 +1,121 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
-
-<script>
-
- $(function(){
- $('#boxWidth').numeric();
- $('#boxHeight').numeric();
- $('#boxLength').numeric();
- $('#boxWeight').numeric({allow:"."});
- });
-
-</script>
-
-
-<div class="tabbable">
-
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
-
- <div class="tab-pane active" id="shipping-methods">
-
-
- <div class="sm-ui-component">
- <h3><s:message code="label.shipping.packaging.title" text="Packaging information" /></h3>
- <br/>
-
-
- <c:url var="savePackaging" value="/admin/shipping/saveShippingPackaging.html"/>
- <form:form method="POST" commandName="configuration" action="${savePackaging}">
-
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
-
- <div class="control-group">
- <div class="controls">
- <form:radiobutton id="shipPackageType" path="shipPackageType" value="ITEM"/> <s:message code="label.shipping.packaging.individual" text="Items will be shipped individually" /><br/>
- <form:radiobutton id="shipPackageType" path="shipPackageType" value="BOX"/> <s:message code="label.shipping.packaging.boxes" text="Items will be combined and shipped in a box" /><br/>
- </div>
- </div>
- <div class="well">
- <div class="control-group">
- <div class="controls">
- <s:message code="label.store.weightunit" text="Weight units" /> <strong><c:out value="${store.weightunitcode}"/></strong><br/>
- <s:message code="label.store.sizeunits" text="Size units" /> <strong><c:out value="${store.seizeunitcode}"/></strong><br/>
- </div>
- </div>
- <div class="control-group">
- <label><s:message code="label.shipping.packaging.box.width" text="Box width"/></label>
- <div class="controls">
- <form:input cssClass="input-small" id="boxWidth" path="boxWidth" />
- </div>
- <span class="help-inline"><form:errors path="boxWidth" cssClass="error" /></span>
- </div>
- <div class="control-group">
- <label><s:message code="label.shipping.packaging.box.height" text="Box height"/></label>
- <div class="controls">
- <form:input cssClass="input-small" id="boxHeight" path="boxHeight" />
- </div>
- <span class="help-inline"><form:errors path="boxHeight" cssClass="error" /></span>
- </div>
-
-
- <div class="control-group">
- <label><s:message code="label.shipping.packaging.box.length" text="Box length"/></label>
- <div class="controls">
- <form:input cssClass="input-small" id="boxLength" path="boxLength" />
- </div>
- <span class="help-inline"><form:errors path="boxLength" cssClass="error" /></span>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.shipping.packaging.box.weight" text="Box weight"/></label>
- <div class="controls">
- <form:input cssClass="input-small" id="boxWeight" path="boxWeight" />
- </div>
- <span class="help-inline"><form:errors path="boxWeight" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
- </div>
- </div>
-
-
- </form:form>
-
-
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
+
+<script>
+
+ $(function(){
+ $('#boxWidth').numeric();
+ $('#boxHeight').numeric();
+ $('#boxLength').numeric();
+ $('#boxWeight').numeric({allow:"."});
+ });
+
+</script>
+
+
+<div class="tabbable">
+
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+
+ <div class="tab-pane active" id="shipping-methods">
+
+
+ <div class="sm-ui-component">
+ <h3><s:message code="label.shipping.packaging.title" text="Packaging information" /></h3>
+ <br/>
+
+
+ <c:url var="savePackaging" value="/admin/shipping/saveShippingPackaging.html"/>
+ <form:form method="POST" commandName="configuration" action="${savePackaging}">
+
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+
+ <div class="control-group">
+ <div class="controls">
+ <form:radiobutton id="shipPackageType" path="shipPackageType" value="ITEM"/> <s:message code="label.shipping.packaging.individual" text="Items will be shipped individually" /><br/>
+ <form:radiobutton id="shipPackageType" path="shipPackageType" value="BOX"/> <s:message code="label.shipping.packaging.boxes" text="Items will be combined and shipped in a box" /><br/>
+ </div>
+ </div>
+ <div class="well">
+ <div class="control-group">
+ <div class="controls">
+ <s:message code="label.store.weightunit" text="Weight units" /> <strong><c:out value="${store.weightunitcode}"/></strong><br/>
+ <s:message code="label.store.sizeunits" text="Size units" /> <strong><c:out value="${store.seizeunitcode}"/></strong><br/>
+ </div>
+ </div>
+ <div class="control-group">
+ <label><s:message code="label.shipping.packaging.box.width" text="Box width"/></label>
+ <div class="controls">
+ <form:input cssClass="input-small" id="boxWidth" path="boxWidth" />
+ </div>
+ <span class="help-inline"><form:errors path="boxWidth" cssClass="error" /></span>
+ </div>
+ <div class="control-group">
+ <label><s:message code="label.shipping.packaging.box.height" text="Box height"/></label>
+ <div class="controls">
+ <form:input cssClass="input-small" id="boxHeight" path="boxHeight" />
+ </div>
+ <span class="help-inline"><form:errors path="boxHeight" cssClass="error" /></span>
+ </div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.shipping.packaging.box.length" text="Box length"/></label>
+ <div class="controls">
+ <form:input cssClass="input-small" id="boxLength" path="boxLength" />
+ </div>
+ <span class="help-inline"><form:errors path="boxLength" cssClass="error" /></span>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.shipping.packaging.box.weight" text="Box weight"/></label>
+ <div class="controls">
+ <form:input cssClass="input-small" id="boxWeight" path="boxWeight" />
+ </div>
+ <span class="help-inline"><form:errors path="boxWeight" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
+ </div>
+ </div>
+
+
+ </form:form>
+
+
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/shipping/shippingConfig.jsp b/sm-shop/src/main/webapp/pages/admin/shipping/shippingConfig.jsp
index 27d1036..85a31fe 100644
--- a/sm-shop/src/main/webapp/pages/admin/shipping/shippingConfig.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/shipping/shippingConfig.jsp
@@ -1,104 +1,104 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-<script>
-
-
-
-</script>
-
-
-<div class="tabbable">
-
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
-
- <div class="tab-pane active" id="shipping-config">
-
-
- <div class="sm-ui-component">
- <h3><s:message code="label.shipping.title" text="Shipping configuration" /></h3>
- <br/>
-
-
- <c:url var="shippingConfigurationSave" value="/admin/shipping/saveShippingConfiguration.html"/>
-
-
- <form:form method="POST" commandName="configuration" action="${shippingConfigurationSave}">
-
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
-
-
-
- <div class="control-group">
- <label><s:message code="label.shipping.mode" text="Shipping mode"/></label>
- <div class="controls">
-
- <div class="controls">
- <form:radiobutton id="shipType" path="shipType" value="NATIONAL"/> <s:message code="label.shipping.national" text="National" />
- <form:radiobutton id="shipType" path="shipType" value="INTERNATIONAL"/> <s:message code="label.shipping.international" text="International" />
- <span class="help-inline"><form:errors path="shipType" cssClass="error" /></span>
- </div>
-
- </div>
- </div>
-
- <form:hidden path="shipBaseType"/>
- <form:hidden path="shipOptionPriceType"/>
-
-
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
- </div>
-
- </div>
- </form:form>
-
-
-
- <br/>
-
-
- <!-- Listing grid include -->
- <c:set value="/admin/shipping/countries/paging.html" var="pagingUrl" scope="request"/>
- <c:set value="/admin/shipping/countries/update.html" var="updateUrl" scope="request"/>
- <c:set value="/admin/shipping/shippingConfigs.html" var="refreshUrl" scope="request"/>
- <c:set var="entityId" value="code" scope="request"/>
- <c:set var="componentTitleKey" value="label.shipping.countries" scope="request"/>
- <c:set var="gridHeader" value="/pages/admin/shipping/shipping-countries-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="false" scope="request"/>
-
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+<script>
+
+
+
+</script>
+
+
+<div class="tabbable">
+
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+
+ <div class="tab-pane active" id="shipping-config">
+
+
+ <div class="sm-ui-component">
+ <h3><s:message code="label.shipping.title" text="Shipping configuration" /></h3>
+ <br/>
+
+
+ <c:url var="shippingConfigurationSave" value="/admin/shipping/saveShippingConfiguration.html"/>
+
+
+ <form:form method="POST" commandName="configuration" action="${shippingConfigurationSave}">
+
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+
+
+
+ <div class="control-group">
+ <label><s:message code="label.shipping.mode" text="Shipping mode"/></label>
+ <div class="controls">
+
+ <div class="controls">
+ <form:radiobutton id="shipType" path="shipType" value="NATIONAL"/> <s:message code="label.shipping.national" text="National" />
+ <form:radiobutton id="shipType" path="shipType" value="INTERNATIONAL"/> <s:message code="label.shipping.international" text="International" />
+ <span class="help-inline"><form:errors path="shipType" cssClass="error" /></span>
+ </div>
+
+ </div>
+ </div>
+
+ <form:hidden path="shipBaseType"/>
+ <form:hidden path="shipOptionPriceType"/>
+
+
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
+ </div>
+
+ </div>
+ </form:form>
+
+
+
+ <br/>
+
+
+ <!-- Listing grid include -->
+ <c:set value="/admin/shipping/countries/paging.html" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/shipping/countries/update.html" var="updateUrl" scope="request"/>
+ <c:set value="/admin/shipping/shippingConfigs.html" var="refreshUrl" scope="request"/>
+ <c:set var="entityId" value="code" scope="request"/>
+ <c:set var="componentTitleKey" value="label.shipping.countries" scope="request"/>
+ <c:set var="gridHeader" value="/pages/admin/shipping/shipping-countries-gridHeader.jsp" scope="request"/>
+ <c:set var="canRemoveEntry" value="false" scope="request"/>
+
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/shipping/shipping-countries-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/shipping/shipping-countries-gridHeader.jsp
index 2ee90fe..790e9e5 100644
--- a/sm-shop/src/main/webapp/pages/admin/shipping/shipping-countries-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/shipping/shipping-countries-gridHeader.jsp
@@ -1,11 +1,11 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
- {title:"<s:message code="label.entity.code" text="Code"/>", name:"code", primaryKey:true, canEdit:false, canFilter:false},
- {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canEdit:false, canFilter:true},
- {title:"<s:message code="label.entity.enabled" text="Enabled"/>", name:"supported", type:"boolean", canEdit:true, canFilter:true}
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+ {title:"<s:message code="label.entity.code" text="Code"/>", name:"code", primaryKey:true, canEdit:false, canFilter:false},
+ {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canEdit:false, canFilter:true},
+ {title:"<s:message code="label.entity.enabled" text="Enabled"/>", name:"supported", type:"boolean", canEdit:true, canFilter:true}
diff --git a/sm-shop/src/main/webapp/pages/admin/shipping/shippingMethod.jsp b/sm-shop/src/main/webapp/pages/admin/shipping/shippingMethod.jsp
index 484140a..6d317f1 100644
--- a/sm-shop/src/main/webapp/pages/admin/shipping/shippingMethod.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/shipping/shippingMethod.jsp
@@ -1,120 +1,120 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-<script>
-
-
-
-</script>
-
-
-<div class="tabbable">
-
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
-
- <div class="tab-pane active" id="shipping-method">
-
-
- <div class="sm-ui-component">
- <h3><s:message code="label.shipping.title" text="Shipping configuration" /> - <s:message code="module.shipping.${configuration.moduleCode}" arguments="${requestScope.ADMIN_STORE.storename}" text="No label found - ${configuration.moduleCode}"/></h3>
- <br/>
-
-
-
-
- <s:message code="module.shipping.${configuration.moduleCode}.note" text=""/><br/>
-
- <c:url var="saveShippingMethod" value="/admin/shipping/saveShippingMethod.html"/>
-
- <c:if test="${customConfiguration!=null}">
- <c:url var="saveShippingMethod" value="/admin/shipping/save${configuration.moduleCode}ShippingMethod.html"/>
-
- </c:if>
-
-
- <form:form method="POST" commandName="configuration" action="${saveShippingMethod}">
-
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
-
- <div class="control-group">
- <label><s:message code="label.entity.enabled" text="Module enabled"/></label>
- <div class="controls">
- <form:checkbox path="active" />
- </div>
- </div>
-
- <div class="controls">
- <label><s:message code="label.generic.environment" text="Environment"/></label>
- <div class="controls">
- <form:select path="environment">
- <form:options items="${environments}" />
- </form:select>
- </div>
- <span class="help-inline"><form:errors path="environment" cssClass="error" /></span>
- </div>
-
-
- <c:if test="${customConfiguration==null}">
- <jsp:include page="/pages/admin/shipping/${configuration.moduleCode}.jsp"></jsp:include>
- </c:if>
-
-
- <form:hidden path="moduleCode" />
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
- </div>
- </div>
-
-
- </form:form>
-
-
-
- <c:if test="${customConfiguration!=null}">
- <jsp:include page="/pages/admin/shipping/${configuration.moduleCode}.jsp"></jsp:include>
- </c:if>
-
-
- <c:if test="${configuration.active && validationError==null}">
- <c:url var="removeModule" value="/admin/shipping/deleteShippingMethod.html"/>
- <form:form method="POST" enctype="multipart/form-data" commandName="code" action="${removeModule}">
- <input type="hidden" name="code" value="${configuration.moduleCode}" />
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn-danger"><i class="icon-trash icon-large"></i><s:message code="label.generic.remove" text="Remove"/></button>
- </div>
- </div>
-
- </form:form>
- </c:if>
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+<script>
+
+
+
+</script>
+
+
+<div class="tabbable">
+
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+
+ <div class="tab-pane active" id="shipping-method">
+
+
+ <div class="sm-ui-component">
+ <h3><s:message code="label.shipping.title" text="Shipping configuration" /> - <s:message code="module.shipping.${configuration.moduleCode}" arguments="${requestScope.ADMIN_STORE.storename}" text="No label found - ${configuration.moduleCode}"/></h3>
+ <br/>
+
+
+
+
+ <s:message code="module.shipping.${configuration.moduleCode}.note" text=""/><br/>
+
+ <c:url var="saveShippingMethod" value="/admin/shipping/saveShippingMethod.html"/>
+
+ <c:if test="${customConfiguration!=null}">
+ <c:url var="saveShippingMethod" value="/admin/shipping/save${configuration.moduleCode}ShippingMethod.html"/>
+
+ </c:if>
+
+
+ <form:form method="POST" commandName="configuration" action="${saveShippingMethod}">
+
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.entity.enabled" text="Module enabled"/></label>
+ <div class="controls">
+ <form:checkbox path="active" />
+ </div>
+ </div>
+
+ <div class="controls">
+ <label><s:message code="label.generic.environment" text="Environment"/></label>
+ <div class="controls">
+ <form:select path="environment">
+ <form:options items="${environments}" />
+ </form:select>
+ </div>
+ <span class="help-inline"><form:errors path="environment" cssClass="error" /></span>
+ </div>
+
+
+ <c:if test="${customConfiguration==null}">
+ <jsp:include page="/pages/admin/shipping/${configuration.moduleCode}.jsp"></jsp:include>
+ </c:if>
+
+
+ <form:hidden path="moduleCode" />
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
+ </div>
+ </div>
+
+
+ </form:form>
+
+
+
+ <c:if test="${customConfiguration!=null}">
+ <jsp:include page="/pages/admin/shipping/${configuration.moduleCode}.jsp"></jsp:include>
+ </c:if>
+
+
+ <c:if test="${configuration.active && validationError==null}">
+ <c:url var="removeModule" value="/admin/shipping/deleteShippingMethod.html"/>
+ <form:form method="POST" enctype="multipart/form-data" commandName="code" action="${removeModule}">
+ <input type="hidden" name="code" value="${configuration.moduleCode}" />
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn-danger"><i class="icon-trash icon-large"></i><s:message code="label.generic.remove" text="Remove"/></button>
+ </div>
+ </div>
+
+ </form:form>
+ </c:if>
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/shipping/shippingMethods.jsp b/sm-shop/src/main/webapp/pages/admin/shipping/shippingMethods.jsp
index ec4ba43..2bfa422 100644
--- a/sm-shop/src/main/webapp/pages/admin/shipping/shippingMethods.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/shipping/shippingMethods.jsp
@@ -1,98 +1,98 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-<script>
-
-
-
-</script>
-
-
-<div class="tabbable">
-
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
-
- <div class="tab-pane active" id="shipping-methods">
-
-
- <div class="sm-ui-component">
- <h3><s:message code="label.shipping.title" text="Shipping configuration" /></h3>
- <br/>
-
- <c:url var="saveShippingMethods" value="/admin/shipping/saveShippingMethods.html"/>
- <form:form method="POST" commandName="configuration" action="${saveShippingMethods}">
-
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
- <div class="control-group">
- <table class="table table-hover">
-
- <c:forEach items="${modules}" var="module">
-
- <tr>
- <td>
- <c:choose>
- <c:when test="${configuredModules[module.code]!=null && configuredModules[module.code].active==true}">
- <img src="<c:url value="/resources/img/icon_green_on.gif"/>" width="12">
- </c:when>
- <c:otherwise>
- <img src="<c:url value="/resources/img/icon_red_on.gif"/>" width="12">
- </c:otherwise>
- </c:choose>
- </td>
- <td>
- <label>
- <c:choose>
- <c:when test="${module.customModule==true}">
- <a href="<c:url value="/admin/shipping/${module.code}.html"/>"><s:message code="module.shipping.${module.code}" text="No label found - ${module.code}"/></a>
- </c:when>
- <c:otherwise>
- <a href="<c:url value="/admin/shipping/shippingMethod.html?code="/><c:out value="${module.code}"/>"><s:message code="module.shipping.${module.code}" arguments="${requestScope.ADMIN_STORE.storename}" text="No label found - ${module.code}"/></a> (<c:out value="${module.code}"/>)
- </c:otherwise>
- </c:choose>
- </label>
- </td>
- <td>
- <c:if test="${module.image!=null}">
- <img src="<c:url value="/resources/img/shipping/${module.image}"/>">
- </c:if>
- </td>
- </tr>
- </c:forEach>
- </table>
-
- </div>
-
- </form:form>
-
-
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+<script>
+
+
+
+</script>
+
+
+<div class="tabbable">
+
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+
+ <div class="tab-pane active" id="shipping-methods">
+
+
+ <div class="sm-ui-component">
+ <h3><s:message code="label.shipping.title" text="Shipping configuration" /></h3>
+ <br/>
+
+ <c:url var="saveShippingMethods" value="/admin/shipping/saveShippingMethods.html"/>
+ <form:form method="POST" commandName="configuration" action="${saveShippingMethods}">
+
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+ <div class="control-group">
+ <table class="table table-hover">
+
+ <c:forEach items="${modules}" var="module">
+
+ <tr>
+ <td>
+ <c:choose>
+ <c:when test="${configuredModules[module.code]!=null && configuredModules[module.code].active==true}">
+ <img src="<c:url value="/resources/img/icon_green_on.gif"/>" width="12">
+ </c:when>
+ <c:otherwise>
+ <img src="<c:url value="/resources/img/icon_red_on.gif"/>" width="12">
+ </c:otherwise>
+ </c:choose>
+ </td>
+ <td>
+ <label>
+ <c:choose>
+ <c:when test="${module.customModule==true}">
+ <a href="<c:url value="/admin/shipping/${module.code}.html"/>"><s:message code="module.shipping.${module.code}" text="No label found - ${module.code}"/></a>
+ </c:when>
+ <c:otherwise>
+ <a href="<c:url value="/admin/shipping/shippingMethod.html?code="/><c:out value="${module.code}"/>"><s:message code="module.shipping.${module.code}" arguments="${requestScope.ADMIN_STORE.storename}" text="No label found - ${module.code}"/></a> (<c:out value="${module.code}"/>)
+ </c:otherwise>
+ </c:choose>
+ </label>
+ </td>
+ <td>
+ <c:if test="${module.image!=null}">
+ <img src="<c:url value="/resources/img/shipping/${module.image}"/>">
+ </c:if>
+ </td>
+ </tr>
+ </c:forEach>
+ </table>
+
+ </div>
+
+ </form:form>
+
+
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/shipping/shippingOptions.jsp b/sm-shop/src/main/webapp/pages/admin/shipping/shippingOptions.jsp
index 9bc8e21..e991cb0 100644
--- a/sm-shop/src/main/webapp/pages/admin/shipping/shippingOptions.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/shipping/shippingOptions.jsp
@@ -1,184 +1,184 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-<script type="text/javascript">
-var priceFormatMessage = '<s:message code="message.price.cents" text="Wrong format" />';
-</script>
-
-<script src="<c:url value="/resources/js/jquery.formatCurrency-1.4.0.js" />"></script>
-<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
-<script src="<c:url value="/resources/js/adminFunctions.js" />"></script>
-
-<script type="text/javascript">
-
-$(document).ready(function() {
-
- $('#orderTotalFreeShippingText').numeric({allow:"."});
- $('#handlingFeesText').numeric({allow:"."});
-
-
- $('#orderTotalFreeShippingText').blur(function() {
- $('#help-orderTotalFreeShippingText').html(null);
- $(this).formatCurrency({ roundToDecimalPlace: 2, eventOnDecimalsEntered: true, symbol: ''});
- })
- .keyup(function(e) {
- var e = window.event || e;
- var keyUnicode = e.charCode || e.keyCode;
- if (e !== undefined) {
- switch (keyUnicode) {
- case 16: break; // Shift
- case 17: break; // Ctrl
- case 18: break; // Alt
- case 27: this.value = ''; break; // Esc: clear entry
- case 35: break; // End
- case 36: break; // Home
- case 37: break; // cursor left
- case 38: break; // cursor up
- case 39: break; // cursor right
- case 40: break; // cursor down
- case 78: break; // N (Opera 9.63+ maps the "." from the number key section to the "N" key too!) (See: http://unixpapa.com/js/key.html search for ". Del")
- case 110: break; // . number block (Opera 9.63+ maps the "." from the number block to the "N" key (78) !!!)
- case 190: break; // .
- default: $(this).formatCurrency({ colorize: true, negativeFormat: '-%s%n', roundToDecimalPlace: -1, eventOnDecimalsEntered: true, symbol: ''});
- }
- }
- })
- .bind('decimalsEntered', function(e, cents) {
- if (String(cents).length > 2) {
- var errorMsg = priceFormatMessage + ' (0.' + cents + ')';
- $('#help-orderTotalFreeShippingText').html(errorMsg);
- }
- });
-
-
- $('#handlingFeesText').blur(function() {
- $('#help-handlingFeesText').html(null);
- $(this).formatCurrency({ roundToDecimalPlace: 2, eventOnDecimalsEntered: true, symbol: ''});
- })
- .keyup(function(e) {
- var e = window.event || e;
- var keyUnicode = e.charCode || e.keyCode;
- if (e !== undefined) {
- switch (keyUnicode) {
- case 16: break; // Shift
- case 17: break; // Ctrl
- case 18: break; // Alt
- case 27: this.value = ''; break; // Esc: clear entry
- case 35: break; // End
- case 36: break; // Home
- case 37: break; // cursor left
- case 38: break; // cursor up
- case 39: break; // cursor right
- case 40: break; // cursor down
- case 78: break; // N (Opera 9.63+ maps the "." from the number key section to the "N" key too!) (See: http://unixpapa.com/js/key.html search for ". Del")
- case 110: break; // . number block (Opera 9.63+ maps the "." from the number block to the "N" key (78) !!!)
- case 190: break; // .
- default: $(this).formatCurrency({ colorize: true, negativeFormat: '-%s%n', roundToDecimalPlace: -1, eventOnDecimalsEntered: true, symbol: ''});
- }
- }
- })
- .bind('decimalsEntered', function(e, cents) {
- if (String(cents).length > 2) {
- var errorMsg = priceFormatMessage + ' (0.' + cents + ')';
- $('#help-handlingFeesText').html(errorMsg);
- }
- });
-
-});
-
-</script>
-
-
-<div class="tabbable">
-
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
-
- <div class="tab-pane active" id="shipping-options">
-
-
- <div class="sm-ui-component">
- <h3><s:message code="label.shipping.options" text="Shipping options" /></h3>
- <br/>
-
-
- <c:url var="saveShippingOptions" value="/admin/shipping/saveShippingOptions.html"/>
- <form:form method="POST" commandName="configuration" action="${saveShippingOptions}">
-
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
- <!--
- <div class="control-group">
- <label><s:message code="label.shipping.taxonshipping" text="Apply tax on shipping" /></label>
- <div class="controls">
- <form:checkbox id="taxOnShipping" path="taxOnShipping" />
- </div>
- </div>
- -->
-
- <div class="control-group well">
- <label><s:message code="label.shipping.freeshippingandhandling=" text="Apply free shipping and handling"/></label>
- <div class="controls">
- <form:checkbox id="freeShippingEnabled" path="freeShippingEnabled" /><br/>
- <form:radiobutton id="shipFreeType" path="shipFreeType" value="NATIONAL"/> <s:message code="label.shipping.national" text="National" /><br/>
- <form:radiobutton id="shipFreeType" path="shipFreeType" value="INTERNATIONAL"/> <s:message code="label.generic.all" text="All" /><br/>
- <form:input cssClass="input-large" id="orderTotalFreeShippingText" path="orderTotalFreeShippingText" /> <s:message code="label.shipping.freeshippingamount" text="Order total over" />
- </div>
- <span id="help-orderTotalFreeShippingText" class="help-inline"><form:errors path="orderTotalFreeShippingText" cssClass="error" /></span>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.shipping.handlingfees" text="Handling fees"/></label>
- <div class="controls">
- <form:input cssClass="input-large" id="handlingFeesText" path="handlingFeesText" />
- </div>
- <span id="help-handlingFeesText" class="help-inline"><form:errors path="handlingFeesText" cssClass="error" /></span>
- </div>
-
- <div class="control-group">
- <div class="controls">
- <form:radiobutton id="shipOptionPriceType" path="shipOptionPriceType" value="ALL"/> <s:message code="label.shipping.allquotes" text="All quotes" /><br/>
- <form:radiobutton id="shipOptionPriceType" path="shipOptionPriceType" value="LEAST"/> <s:message code="label.shipping.leastexpensivequotes" text="Least expensive" /><br/>
- <form:radiobutton id="shipOptionPriceType" path="shipOptionPriceType" value="HIGHEST"/> <s:message code="label.shipping.moreexpensivequotes" text="Highest price" />
- </div>
- <span class="help-inline"><form:errors path="handlingFeesText" cssClass="error" /></span>
- </div>
-
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
- </div>
- </div>
-
-
- </form:form>
-
-
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+<script type="text/javascript">
+var priceFormatMessage = '<s:message code="message.price.cents" text="Wrong format" />';
+</script>
+
+<script src="<c:url value="/resources/js/jquery.formatCurrency-1.4.0.js" />"></script>
+<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
+<script src="<c:url value="/resources/js/adminFunctions.js" />"></script>
+
+<script type="text/javascript">
+
+$(document).ready(function() {
+
+ $('#orderTotalFreeShippingText').numeric({allow:"."});
+ $('#handlingFeesText').numeric({allow:"."});
+
+
+ $('#orderTotalFreeShippingText').blur(function() {
+ $('#help-orderTotalFreeShippingText').html(null);
+ $(this).formatCurrency({ roundToDecimalPlace: 2, eventOnDecimalsEntered: true, symbol: ''});
+ })
+ .keyup(function(e) {
+ var e = window.event || e;
+ var keyUnicode = e.charCode || e.keyCode;
+ if (e !== undefined) {
+ switch (keyUnicode) {
+ case 16: break; // Shift
+ case 17: break; // Ctrl
+ case 18: break; // Alt
+ case 27: this.value = ''; break; // Esc: clear entry
+ case 35: break; // End
+ case 36: break; // Home
+ case 37: break; // cursor left
+ case 38: break; // cursor up
+ case 39: break; // cursor right
+ case 40: break; // cursor down
+ case 78: break; // N (Opera 9.63+ maps the "." from the number key section to the "N" key too!) (See: http://unixpapa.com/js/key.html search for ". Del")
+ case 110: break; // . number block (Opera 9.63+ maps the "." from the number block to the "N" key (78) !!!)
+ case 190: break; // .
+ default: $(this).formatCurrency({ colorize: true, negativeFormat: '-%s%n', roundToDecimalPlace: -1, eventOnDecimalsEntered: true, symbol: ''});
+ }
+ }
+ })
+ .bind('decimalsEntered', function(e, cents) {
+ if (String(cents).length > 2) {
+ var errorMsg = priceFormatMessage + ' (0.' + cents + ')';
+ $('#help-orderTotalFreeShippingText').html(errorMsg);
+ }
+ });
+
+
+ $('#handlingFeesText').blur(function() {
+ $('#help-handlingFeesText').html(null);
+ $(this).formatCurrency({ roundToDecimalPlace: 2, eventOnDecimalsEntered: true, symbol: ''});
+ })
+ .keyup(function(e) {
+ var e = window.event || e;
+ var keyUnicode = e.charCode || e.keyCode;
+ if (e !== undefined) {
+ switch (keyUnicode) {
+ case 16: break; // Shift
+ case 17: break; // Ctrl
+ case 18: break; // Alt
+ case 27: this.value = ''; break; // Esc: clear entry
+ case 35: break; // End
+ case 36: break; // Home
+ case 37: break; // cursor left
+ case 38: break; // cursor up
+ case 39: break; // cursor right
+ case 40: break; // cursor down
+ case 78: break; // N (Opera 9.63+ maps the "." from the number key section to the "N" key too!) (See: http://unixpapa.com/js/key.html search for ". Del")
+ case 110: break; // . number block (Opera 9.63+ maps the "." from the number block to the "N" key (78) !!!)
+ case 190: break; // .
+ default: $(this).formatCurrency({ colorize: true, negativeFormat: '-%s%n', roundToDecimalPlace: -1, eventOnDecimalsEntered: true, symbol: ''});
+ }
+ }
+ })
+ .bind('decimalsEntered', function(e, cents) {
+ if (String(cents).length > 2) {
+ var errorMsg = priceFormatMessage + ' (0.' + cents + ')';
+ $('#help-handlingFeesText').html(errorMsg);
+ }
+ });
+
+});
+
+</script>
+
+
+<div class="tabbable">
+
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+
+ <div class="tab-pane active" id="shipping-options">
+
+
+ <div class="sm-ui-component">
+ <h3><s:message code="label.shipping.options" text="Shipping options" /></h3>
+ <br/>
+
+
+ <c:url var="saveShippingOptions" value="/admin/shipping/saveShippingOptions.html"/>
+ <form:form method="POST" commandName="configuration" action="${saveShippingOptions}">
+
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+ <!--
+ <div class="control-group">
+ <label><s:message code="label.shipping.taxonshipping" text="Apply tax on shipping" /></label>
+ <div class="controls">
+ <form:checkbox id="taxOnShipping" path="taxOnShipping" />
+ </div>
+ </div>
+ -->
+
+ <div class="control-group well">
+ <label><s:message code="label.shipping.freeshippingandhandling=" text="Apply free shipping and handling"/></label>
+ <div class="controls">
+ <form:checkbox id="freeShippingEnabled" path="freeShippingEnabled" /><br/>
+ <form:radiobutton id="shipFreeType" path="shipFreeType" value="NATIONAL"/> <s:message code="label.shipping.national" text="National" /><br/>
+ <form:radiobutton id="shipFreeType" path="shipFreeType" value="INTERNATIONAL"/> <s:message code="label.generic.all" text="All" /><br/>
+ <form:input cssClass="input-large" id="orderTotalFreeShippingText" path="orderTotalFreeShippingText" /> <s:message code="label.shipping.freeshippingamount" text="Order total over" />
+ </div>
+ <span id="help-orderTotalFreeShippingText" class="help-inline"><form:errors path="orderTotalFreeShippingText" cssClass="error" /></span>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.shipping.handlingfees" text="Handling fees"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large" id="handlingFeesText" path="handlingFeesText" />
+ </div>
+ <span id="help-handlingFeesText" class="help-inline"><form:errors path="handlingFeesText" cssClass="error" /></span>
+ </div>
+
+ <div class="control-group">
+ <div class="controls">
+ <form:radiobutton id="shipOptionPriceType" path="shipOptionPriceType" value="ALL"/> <s:message code="label.shipping.allquotes" text="All quotes" /><br/>
+ <form:radiobutton id="shipOptionPriceType" path="shipOptionPriceType" value="LEAST"/> <s:message code="label.shipping.leastexpensivequotes" text="Least expensive" /><br/>
+ <form:radiobutton id="shipOptionPriceType" path="shipOptionPriceType" value="HIGHEST"/> <s:message code="label.shipping.moreexpensivequotes" text="Highest price" />
+ </div>
+ <span class="help-inline"><form:errors path="handlingFeesText" cssClass="error" /></span>
+ </div>
+
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
+ </div>
+ </div>
+
+
+ </form:form>
+
+
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/shipping/shippingOrigin.jsp b/sm-shop/src/main/webapp/pages/admin/shipping/shippingOrigin.jsp
index 7c82960..0ecc5d4 100644
--- a/sm-shop/src/main/webapp/pages/admin/shipping/shippingOrigin.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/shipping/shippingOrigin.jsp
@@ -1,199 +1,199 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-
-<script>
-
-
-$(document).ready(function() {
-
-
-
- <c:choose>
- <c:when test="${origin.state!=null && origin.state!=''}">
- $('.zone-list').hide();
- $('#stateprovince').show();
- $('#stateprovince').val('<c:out value="${origin.state}"/>');
- </c:when>
- <c:otherwise>
- $('.zone-list').show();
- $('#stateprovince').hide();
- getZones('<c:out value="${origin.country.isoCode}" />');
- </c:otherwise>
- </c:choose>
-
- $(".country-list").change(function() {
- getZones($(this).val());
- })
-
-
-});
-
-$.fn.addItems = function(data) {
- $(".zone-list > option").remove();
- return this.each(function() {
- var list = this;
- $.each(data, function(index, itemData) {
- var option = new Option(itemData.name, itemData.code);
- list.add(option);
- });
- });
-};
-
-function getZones(countryCode){
- $.ajax({
- type: 'POST',
- url: '<c:url value="/admin/reference/provinces.html"/>',
- data: 'countryCode=' + countryCode,
- dataType: 'json',
- success: function(response){
-
- var status = isc.XMLTools.selectObjects(response, "/response/status");
- if(status==0 || status ==9999) {
-
- var data = isc.XMLTools.selectObjects(response, "/response/data");
- if(data && data.length>0) {
-
- $('.zone-list').show();
- $('#stateprovince').hide();
- $(".zone-list").addItems(data);
- <c:if test="${origin.zone!=null}">
- $('.zone-list').val('<c:out value="${origin.zone.code}"/>');
- $('#stateprovince').val('');
- </c:if>
- } else {
- $('.zone-list').hide();
- $('#stateprovince').show();
- <c:if test="${origin.merchantStore!=null}">
- $('#stateprovince').val('<c:out value="${origin.state}"/>');
- </c:if>
- }
- } else {
- $('.zone-list').hide();
- $('#stateprovince').show();
- }
-
-
- },
- error: function(xhr, textStatus, errorThrown) {
- alert('error ' + errorThrown);
- }
-
- });
-}
-
-
-
-</script>
-
-
-<div class="tabbable">
-
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <h3><s:message code="label.shipping.origin.title" text="Shipping address origin" /></h3>
- <br/>
- <p>
- <s:message code="label.shipping.origin.description" text="Used for the calculation of the distance between the origin and the destination of a delivery" />
- </p>
-
- <c:url var="origin" value="/admin/shipping/origin/post.html"/>
-
-
- <form:form method="POST" commandName="origin" action="${origin}">
-
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
- <div class="control-group">
- <label><s:message code="label.entity.active" text="Active"/></label>
- <div class="controls">
- <form:checkbox path="active" />
-
- </div>
- </div>
-
-
- <div class="control-group">
- <label><s:message code="label.generic.address" text="Address"/></label>
- <div class="controls">
- <form:input cssClass="input-large highlight" path="address" />
- <span class="help-inline"><form:errors path="address" cssClass="error" /></span>
- </div>
- </div>
-
-
- <div class="control-group">
- <label><s:message code="label.generic.city" text="City"/></label>
- <div class="controls">
- <form:input cssClass="input-large highlight" path="city" />
- <span class="help-inline"><form:errors path="city" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.generic.country" text="Country"/></label>
- <div class="controls">
-
- <form:select cssClass="country-list highlight" path="country.isoCode">
- <form:options items="${countries}" itemValue="isoCode" itemLabel="name"/>
- </form:select>
- <span class="help-inline"><form:errors path="country" cssClass="error" /></span>
- </div>
- </div>
-
-
- <div class="control-group">
- <label><s:message code="label.generic.stateprovince" text="State / province"/></label>
- <div class="controls">
- <form:select cssClass="zone-list highlight" path="zone.code"/>
- <input type="text" class="input-large highlight" id="stateprovince" name="state" />
- <span class="help-inline"><form:errors path="zone.code" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.generic.postalcode" text="Postal code"/></label>
- <div class="controls">
- <form:input cssClass="input-large highlight" path="postalCode" />
- <span class="help-inline"><form:errors path="postalCode" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit2" text="Submit"/></button>
- </div>
- </div>
-
-
-
- </form:form>
-
- <c:if test="origin!=null">
- <br/><br/>
- <c:url var="removeOrigin" value="/admin/shipping/origin/delete.html"/>
- <form:form method="POST" enctype="multipart/form-data" commandName="origin" action="${removeOrigin}">
- <input type="hidden" name="id" value="${origin.id}" />
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn-danger"><i class="icon-trash icon-large"></i><s:message code="label.generic.remove" text="Remove"/></button>
- </div>
- </div>
-
- </form:form>
- </c:if>
-
-
-
-
-
-
-
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+
+<script>
+
+
+$(document).ready(function() {
+
+
+
+ <c:choose>
+ <c:when test="${origin.state!=null && origin.state!=''}">
+ $('.zone-list').hide();
+ $('#stateprovince').show();
+ $('#stateprovince').val('<c:out value="${origin.state}"/>');
+ </c:when>
+ <c:otherwise>
+ $('.zone-list').show();
+ $('#stateprovince').hide();
+ getZones('<c:out value="${origin.country.isoCode}" />');
+ </c:otherwise>
+ </c:choose>
+
+ $(".country-list").change(function() {
+ getZones($(this).val());
+ })
+
+
+});
+
+$.fn.addItems = function(data) {
+ $(".zone-list > option").remove();
+ return this.each(function() {
+ var list = this;
+ $.each(data, function(index, itemData) {
+ var option = new Option(itemData.name, itemData.code);
+ list.add(option);
+ });
+ });
+};
+
+function getZones(countryCode){
+ $.ajax({
+ type: 'POST',
+ url: '<c:url value="/admin/reference/provinces.html"/>',
+ data: 'countryCode=' + countryCode,
+ dataType: 'json',
+ success: function(response){
+
+ var status = isc.XMLTools.selectObjects(response, "/response/status");
+ if(status==0 || status ==9999) {
+
+ var data = isc.XMLTools.selectObjects(response, "/response/data");
+ if(data && data.length>0) {
+
+ $('.zone-list').show();
+ $('#stateprovince').hide();
+ $(".zone-list").addItems(data);
+ <c:if test="${origin.zone!=null}">
+ $('.zone-list').val('<c:out value="${origin.zone.code}"/>');
+ $('#stateprovince').val('');
+ </c:if>
+ } else {
+ $('.zone-list').hide();
+ $('#stateprovince').show();
+ <c:if test="${origin.merchantStore!=null}">
+ $('#stateprovince').val('<c:out value="${origin.state}"/>');
+ </c:if>
+ }
+ } else {
+ $('.zone-list').hide();
+ $('#stateprovince').show();
+ }
+
+
+ },
+ error: function(xhr, textStatus, errorThrown) {
+ alert('error ' + errorThrown);
+ }
+
+ });
+}
+
+
+
+</script>
+
+
+<div class="tabbable">
+
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <h3><s:message code="label.shipping.origin.title" text="Shipping address origin" /></h3>
+ <br/>
+ <p>
+ <s:message code="label.shipping.origin.description" text="Used for the calculation of the distance between the origin and the destination of a delivery" />
+ </p>
+
+ <c:url var="origin" value="/admin/shipping/origin/post.html"/>
+
+
+ <form:form method="POST" commandName="origin" action="${origin}">
+
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+ <div class="control-group">
+ <label><s:message code="label.entity.active" text="Active"/></label>
+ <div class="controls">
+ <form:checkbox path="active" />
+
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.generic.address" text="Address"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" path="address" />
+ <span class="help-inline"><form:errors path="address" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.generic.city" text="City"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" path="city" />
+ <span class="help-inline"><form:errors path="city" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.generic.country" text="Country"/></label>
+ <div class="controls">
+
+ <form:select cssClass="country-list highlight" path="country.isoCode">
+ <form:options items="${countries}" itemValue="isoCode" itemLabel="name"/>
+ </form:select>
+ <span class="help-inline"><form:errors path="country" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label><s:message code="label.generic.stateprovince" text="State / province"/></label>
+ <div class="controls">
+ <form:select cssClass="zone-list highlight" path="zone.code"/>
+ <input type="text" class="input-large highlight" id="stateprovince" name="state" />
+ <span class="help-inline"><form:errors path="zone.code" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.generic.postalcode" text="Postal code"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" path="postalCode" />
+ <span class="help-inline"><form:errors path="postalCode" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit2" text="Submit"/></button>
+ </div>
+ </div>
+
+
+
+ </form:form>
+
+ <c:if test="origin!=null">
+ <br/><br/>
+ <c:url var="removeOrigin" value="/admin/shipping/origin/delete.html"/>
+ <form:form method="POST" enctype="multipart/form-data" commandName="origin" action="${removeOrigin}">
+ <input type="hidden" name="id" value="${origin.id}" />
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn-danger"><i class="icon-trash icon-large"></i><s:message code="label.generic.remove" text="Remove"/></button>
+ </div>
+ </div>
+
+ </form:form>
+ </c:if>
+
+
+
+
+
+
+
+
</div>
\ No newline at end of file
sm-shop/src/main/webapp/pages/admin/shipping/ups.jsp 152(+76 -76)
diff --git a/sm-shop/src/main/webapp/pages/admin/shipping/ups.jsp b/sm-shop/src/main/webapp/pages/admin/shipping/ups.jsp
index 9a812d1..a83ecdc 100644
--- a/sm-shop/src/main/webapp/pages/admin/shipping/ups.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/shipping/ups.jsp
@@ -1,77 +1,77 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
-
- <div class="control-group">
- <label class="required"><s:message code="module.shipping.ups.identifier" text="Access key"/></label>
- <div class="controls">
- <form:input cssClass="input-large highlight" path="integrationKeys['accessKey']" />
- </div>
- <span class="help-inline">
- <c:if test="${accessKey!=null}">
- <span id="identifiererrors" class="error"><s:message code="module.shipping.usps.message.identifier" text="Field in error"/></span>
- </c:if>
- </span>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="module.shipping.ups.userid" text="User id"/></label>
- <div class="controls">
- <form:input cssClass="input-large highlight" path="integrationKeys['userId']" />
- </div>
- <span class="help-inline">
- <c:if test="${userId!=null}">
- <span id="useriderrors" class="error"><s:message code="module.shipping.usps.message.userid" text="Field in error"/></span>
- </c:if>
- </span>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="module.shipping.ups.password" text="Password"/></label>
- <div class="controls">
- <form:password cssClass="input-large highlight" path="integrationKeys['password']" />
- </div>
- <span class="help-inline">
- <c:if test="${password!=null}">
- <span id="passworderrors" class="error"><s:message code="module.shipping.usps.message.password" text="Field in error"/></span>
- </c:if>
- </span>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="module.shipping.ups.packages" text="Packaging"/></label>
- <div class="controls">
- <form:radiobutton cssClass="input-large highlight" path="integrationOptions['packages']" value="01" /> <s:message code="module.shipping.ups.package.01" text="UPS Letter" /><br/>
- <form:radiobutton cssClass="input-large highlight" path="integrationOptions['packages']" value="02" /> <s:message code="module.shipping.ups.package.02" text="Customer Package" /></br>
- <form:radiobutton cssClass="input-large highlight" path="integrationOptions['packages']" value="03" /> <s:message code="module.shipping.ups.package.03" text="UPS Tube" /></br>
- <form:radiobutton cssClass="input-large highlight" path="integrationOptions['packages']" value="04" /> <s:message code="module.shipping.ups.package.04" text="UPS Pak" /></br>
- <form:radiobutton cssClass="input-large highlight" path="integrationOptions['packages']" value="21" /> <s:message code="module.shipping.ups.package.21" text="UPS Express Box" /></br>
- <form:radiobutton cssClass="input-large highlight" path="integrationOptions['packages']" value="24" /> <s:message code="module.shipping.ups.package.24" text="UPS 25kg Box" /></br>
- <form:radiobutton cssClass="input-large highlight" path="integrationOptions['packages']" value="10" /> <s:message code="module.shipping.ups.package.10" text="UPS 10kg box" /></br>
- <form:radiobutton cssClass="input-large highlight" path="integrationOptions['packages']" value="25" /> <s:message code="module.shipping.ups.package.25" text="Unknown" /></br>
- </div>
- <span class="help-inline">
- <c:if test="${packages!=null}">
- <span id="packageserrors" class="error"><s:message code="module.shipping.ups.message.packages" text="Field in error"/></span>
- </c:if>
- </span>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="module.shipping.ups.method" text="UPS Shipping method"/></label>
- <div class="controls">
- <!--<form:radiobutton cssClass="input-large highlight" path="integrationOptions['selectservice']" value="yes" /> <s:message code="module.shipping.ups.method.select" text="Select a specific UPS shipping method" /><br/>-->
- <form:radiobutton cssClass="input-large highlight" path="integrationOptions['selectservice']" value="no" /> <s:message code="module.shipping.ups.method.unselect" text="Let UPS propose all available shipping methods" /></br>
- </div>
- </div>
-
-
-
-
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.shipping.ups.identifier" text="Access key"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" path="integrationKeys['accessKey']" />
+ </div>
+ <span class="help-inline">
+ <c:if test="${accessKey!=null}">
+ <span id="identifiererrors" class="error"><s:message code="module.shipping.usps.message.identifier" text="Field in error"/></span>
+ </c:if>
+ </span>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.shipping.ups.userid" text="User id"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" path="integrationKeys['userId']" />
+ </div>
+ <span class="help-inline">
+ <c:if test="${userId!=null}">
+ <span id="useriderrors" class="error"><s:message code="module.shipping.usps.message.userid" text="Field in error"/></span>
+ </c:if>
+ </span>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.shipping.ups.password" text="Password"/></label>
+ <div class="controls">
+ <form:password cssClass="input-large highlight" path="integrationKeys['password']" />
+ </div>
+ <span class="help-inline">
+ <c:if test="${password!=null}">
+ <span id="passworderrors" class="error"><s:message code="module.shipping.usps.message.password" text="Field in error"/></span>
+ </c:if>
+ </span>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.shipping.ups.packages" text="Packaging"/></label>
+ <div class="controls">
+ <form:radiobutton cssClass="input-large highlight" path="integrationOptions['packages']" value="01" /> <s:message code="module.shipping.ups.package.01" text="UPS Letter" /><br/>
+ <form:radiobutton cssClass="input-large highlight" path="integrationOptions['packages']" value="02" /> <s:message code="module.shipping.ups.package.02" text="Customer Package" /></br>
+ <form:radiobutton cssClass="input-large highlight" path="integrationOptions['packages']" value="03" /> <s:message code="module.shipping.ups.package.03" text="UPS Tube" /></br>
+ <form:radiobutton cssClass="input-large highlight" path="integrationOptions['packages']" value="04" /> <s:message code="module.shipping.ups.package.04" text="UPS Pak" /></br>
+ <form:radiobutton cssClass="input-large highlight" path="integrationOptions['packages']" value="21" /> <s:message code="module.shipping.ups.package.21" text="UPS Express Box" /></br>
+ <form:radiobutton cssClass="input-large highlight" path="integrationOptions['packages']" value="24" /> <s:message code="module.shipping.ups.package.24" text="UPS 25kg Box" /></br>
+ <form:radiobutton cssClass="input-large highlight" path="integrationOptions['packages']" value="10" /> <s:message code="module.shipping.ups.package.10" text="UPS 10kg box" /></br>
+ <form:radiobutton cssClass="input-large highlight" path="integrationOptions['packages']" value="25" /> <s:message code="module.shipping.ups.package.25" text="Unknown" /></br>
+ </div>
+ <span class="help-inline">
+ <c:if test="${packages!=null}">
+ <span id="packageserrors" class="error"><s:message code="module.shipping.ups.message.packages" text="Field in error"/></span>
+ </c:if>
+ </span>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.shipping.ups.method" text="UPS Shipping method"/></label>
+ <div class="controls">
+ <!--<form:radiobutton cssClass="input-large highlight" path="integrationOptions['selectservice']" value="yes" /> <s:message code="module.shipping.ups.method.select" text="Select a specific UPS shipping method" /><br/>-->
+ <form:radiobutton cssClass="input-large highlight" path="integrationOptions['selectservice']" value="no" /> <s:message code="module.shipping.ups.method.unselect" text="Let UPS propose all available shipping methods" /></br>
+ </div>
+ </div>
+
+
+
+
+
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/shipping/usps.jsp b/sm-shop/src/main/webapp/pages/admin/shipping/usps.jsp
index 3540f9a..32b82a2 100644
--- a/sm-shop/src/main/webapp/pages/admin/shipping/usps.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/shipping/usps.jsp
@@ -1,40 +1,40 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
-
- <div class="control-group">
- <label class="required"><s:message code="module.shipping.usps.identifier" text="Account identifier"/></label>
- <div class="controls">
- <form:input cssClass="input-large highlight" path="integrationKeys['account']" />
- </div>
- <span class="help-inline">
- <c:if test="${identifier!=null}">
- <span id="identifiererrors" class="error"><s:message code="module.shipping.usps.message.identifier" text="Field in error"/></span>
- </c:if>
- </span>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="module.shipping.usps.packages" text="Packaging"/></label>
- <div class="controls">
- <form:radiobutton cssClass="input-large highlight" path="integrationOptions['packages']" value="Package" /> <s:message code="module.shipping.usps.package.08" text="Package" /><br/>
- <form:radiobutton cssClass="input-large highlight" path="integrationOptions['packages']" value="Envelope" /> <s:message code="module.shipping.usps.package.07" text="Envelope" /></br>
- </div>
- <span class="help-inline">
- <c:if test="${packages!=null}">
- <span id="packageserrors" class="error"><s:message code="module.shipping.usps.message.packages" text="Field in error"/></span>
- </c:if>
- </span>
- </div>
-
-
-
-
-
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.shipping.usps.identifier" text="Account identifier"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" path="integrationKeys['account']" />
+ </div>
+ <span class="help-inline">
+ <c:if test="${identifier!=null}">
+ <span id="identifiererrors" class="error"><s:message code="module.shipping.usps.message.identifier" text="Field in error"/></span>
+ </c:if>
+ </span>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="module.shipping.usps.packages" text="Packaging"/></label>
+ <div class="controls">
+ <form:radiobutton cssClass="input-large highlight" path="integrationOptions['packages']" value="Package" /> <s:message code="module.shipping.usps.package.08" text="Package" /><br/>
+ <form:radiobutton cssClass="input-large highlight" path="integrationOptions['packages']" value="Envelope" /> <s:message code="module.shipping.usps.package.07" text="Envelope" /></br>
+ </div>
+ <span class="help-inline">
+ <c:if test="${packages!=null}">
+ <span id="packageserrors" class="error"><s:message code="module.shipping.usps.message.packages" text="Field in error"/></span>
+ </c:if>
+ </span>
+ </div>
+
+
+
+
+
+
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/shipping/weightBased.jsp b/sm-shop/src/main/webapp/pages/admin/shipping/weightBased.jsp
index af7bd24..c87cfb2 100644
--- a/sm-shop/src/main/webapp/pages/admin/shipping/weightBased.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/shipping/weightBased.jsp
@@ -1,88 +1,88 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-
-
-
-
-
- <form action="<c:url value="/admin/shipping/addCustomRegion.html"/>" method="POST" class="form-inline">
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- 1- <label class="required"><s:message code="label.shipping.addregion" text="Add region" /></label>
- <input type="text" class="span3" name="region" id="region"><!-- must be unique -->
- <span class="help-inline"><div id="checkCodeStatus" style="display:none;"></div></span>
- <span class="help-inline">
- <c:if test="${errorMessage!=null}">
- <span id="identifiererrors" class="error"><c:out value="${errorMessage}"/></span>
- </c:if>
- </span>
- <button type="submit" class="btn btn-success"><s:message code="label.shipping.addregion" text="Add region"/></button>
- </form>
- <br/>
-
- <c:url var="addShipping" value="/admin/shipping/addCountryToRegion.html"/>
- <form:form method="POST" commandName="customRegion" action="${addShipping}" cssClass="form-inline">
-
-
- 2- <label><s:message code="label.region" text="Region"/></label>
-
- <form:select path="customRegionName">
- <form:options items="${customConfiguration.regions}" itemValue="customRegionName" itemLabel="customRegionName"/>
- </form:select>
-
-
-
- <label><s:message code="label.country" text="Country"/></label>
-
- <form:select path="countries[0]">
- <form:options items="${shippingCountries}" itemValue="isoCode" itemLabel="name"/>
- </form:select>
- <span class="help-inline">
- <c:if test="${errorMessageAssociation!=null}">
- <span id="identifiererrors" class="error"><c:out value="${errorMessage}"/></span>
- </c:if>
- </span>
-
-
- <button type="submit" class="btn btn-success"><s:message code="label.generic.add" text="Add"/></button>
-
- </form:form>
-
-
- <!-- Listing grid include -->
- <c:set value="/admin/shipping/weightBased/page.html" var="pagingUrl" scope="request"/>
- <c:set value="/admin/shipping/weightBased/removeCountry.html" var="removeUrl" scope="request"/>
- <c:set value="/admin/shipping/weightBased/edit.html" var="editUrl" scope="request"/>
- <c:set value="/admin/shipping/weightBased.html" var="refreshUrl" scope="request"/>
- <c:set var="entityId" value="regionCode" scope="request"/>
- <c:set var="groupByEntity" value="region" scope="request"/>
- <c:set var="componentTitleKey" value="module.shipping.weightBased" scope="request"/>
- <c:set var="gridHeader" value="/pages/admin/shipping/weightBased-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="true" scope="request"/>
-
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
- <br/><br/>
- <c:url var="addPrice" value="/admin/shipping/weightBased/edit.html"/>
- <form:form method="GET" commandName="customRegion" action="${addPrice}" cssClass="form-inline">
-
-
- 3- <label><s:message code="label.region" text="Region"/></label>
-
- <form:select path="customRegionName">
- <form:options items="${customConfiguration.regions}" itemValue="customRegionName" itemLabel="customRegionName"/>
- </form:select>
-
-
-
- <button type="submit" class="btn btn-success"><s:message code="label.entity.details" text="Details"/></button>
-
- </form:form>
-
-
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+
+
+
+
+
+ <form action="<c:url value="/admin/shipping/addCustomRegion.html"/>" method="POST" class="form-inline">
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ 1- <label class="required"><s:message code="label.shipping.addregion" text="Add region" /></label>
+ <input type="text" class="span3" name="region" id="region"><!-- must be unique -->
+ <span class="help-inline"><div id="checkCodeStatus" style="display:none;"></div></span>
+ <span class="help-inline">
+ <c:if test="${errorMessage!=null}">
+ <span id="identifiererrors" class="error"><c:out value="${errorMessage}"/></span>
+ </c:if>
+ </span>
+ <button type="submit" class="btn btn-success"><s:message code="label.shipping.addregion" text="Add region"/></button>
+ </form>
+ <br/>
+
+ <c:url var="addShipping" value="/admin/shipping/addCountryToRegion.html"/>
+ <form:form method="POST" commandName="customRegion" action="${addShipping}" cssClass="form-inline">
+
+
+ 2- <label><s:message code="label.region" text="Region"/></label>
+
+ <form:select path="customRegionName">
+ <form:options items="${customConfiguration.regions}" itemValue="customRegionName" itemLabel="customRegionName"/>
+ </form:select>
+
+
+
+ <label><s:message code="label.country" text="Country"/></label>
+
+ <form:select path="countries[0]">
+ <form:options items="${shippingCountries}" itemValue="isoCode" itemLabel="name"/>
+ </form:select>
+ <span class="help-inline">
+ <c:if test="${errorMessageAssociation!=null}">
+ <span id="identifiererrors" class="error"><c:out value="${errorMessage}"/></span>
+ </c:if>
+ </span>
+
+
+ <button type="submit" class="btn btn-success"><s:message code="label.generic.add" text="Add"/></button>
+
+ </form:form>
+
+
+ <!-- Listing grid include -->
+ <c:set value="/admin/shipping/weightBased/page.html" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/shipping/weightBased/removeCountry.html" var="removeUrl" scope="request"/>
+ <c:set value="/admin/shipping/weightBased/edit.html" var="editUrl" scope="request"/>
+ <c:set value="/admin/shipping/weightBased.html" var="refreshUrl" scope="request"/>
+ <c:set var="entityId" value="regionCode" scope="request"/>
+ <c:set var="groupByEntity" value="region" scope="request"/>
+ <c:set var="componentTitleKey" value="module.shipping.weightBased" scope="request"/>
+ <c:set var="gridHeader" value="/pages/admin/shipping/weightBased-gridHeader.jsp" scope="request"/>
+ <c:set var="canRemoveEntry" value="true" scope="request"/>
+
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+ <br/><br/>
+ <c:url var="addPrice" value="/admin/shipping/weightBased/edit.html"/>
+ <form:form method="GET" commandName="customRegion" action="${addPrice}" cssClass="form-inline">
+
+
+ 3- <label><s:message code="label.region" text="Region"/></label>
+
+ <form:select path="customRegionName">
+ <form:options items="${customConfiguration.regions}" itemValue="customRegionName" itemLabel="customRegionName"/>
+ </form:select>
+
+
+
+ <button type="submit" class="btn btn-success"><s:message code="label.entity.details" text="Details"/></button>
+
+ </form:form>
+
+
+
diff --git a/sm-shop/src/main/webapp/pages/admin/shipping/weightBasedDetails-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/shipping/weightBasedDetails-gridHeader.jsp
index 0e72640..e7fb79d 100644
--- a/sm-shop/src/main/webapp/pages/admin/shipping/weightBasedDetails-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/shipping/weightBasedDetails-gridHeader.jsp
@@ -1,10 +1,10 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
- {title:"<s:message code="label.shipping.maximumWeight" text="Maximum weight"/>", name:"weight", primaryKey:true, canEdit:false, canFilter:false},
- {title:"<s:message code="label.generic.price" text="Price"/>", name:"price", canEdit:false, canFilter:false}
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+ {title:"<s:message code="label.shipping.maximumWeight" text="Maximum weight"/>", name:"weight", primaryKey:true, canEdit:false, canFilter:false},
+ {title:"<s:message code="label.generic.price" text="Price"/>", name:"price", canEdit:false, canFilter:false}
diff --git a/sm-shop/src/main/webapp/pages/admin/shipping/weightBased-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/shipping/weightBased-gridHeader.jsp
index c675d54..58d94b0 100644
--- a/sm-shop/src/main/webapp/pages/admin/shipping/weightBased-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/shipping/weightBased-gridHeader.jsp
@@ -1,11 +1,11 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
- {title:"<s:message code="label.generic.country.code" text="Country code"/>", name:"regionCode", canEdit:false, canFilter:false},
- {title:"<s:message code="label.shipping.region" text="Region"/>", name:"region", canEdit:false, canFilter:false},
- {title:"<s:message code="label.generic.country" text="Country"/>", name:"country",primaryKey:true, canEdit:false, canFilter:false}
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+ {title:"<s:message code="label.generic.country.code" text="Country code"/>", name:"regionCode", canEdit:false, canFilter:false},
+ {title:"<s:message code="label.shipping.region" text="Region"/>", name:"region", canEdit:false, canFilter:false},
+ {title:"<s:message code="label.generic.country" text="Country"/>", name:"country",primaryKey:true, canEdit:false, canFilter:false}
sm-shop/src/main/webapp/pages/admin/tax/taxClass.jsp 184(+92 -92)
diff --git a/sm-shop/src/main/webapp/pages/admin/tax/taxClass.jsp b/sm-shop/src/main/webapp/pages/admin/tax/taxClass.jsp
index 1f4a666..bc3950b 100644
--- a/sm-shop/src/main/webapp/pages/admin/tax/taxClass.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/tax/taxClass.jsp
@@ -1,93 +1,93 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
-
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="taxrates-section">
-
- <div class="sm-ui-component">
- <h3><s:message code="label.tax.taxclass.title" text="Tax classes" /></h3>
- <br/>
-
- <c:url var="saveTaxClass" value="/admin/tax/taxclass/save.html"/>
-
- <form:form method="POST" modelAttribute="taxClass" action="${saveTaxClass}">
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
-
-
- <div class="control-group">
- <label class="required"><s:message code="label.tax.taxclass" text="Tax class"/></label>
- <div class="controls">
- <form:input cssClass="input-large" path="code" />
- </div>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="label.tax.taxclass.name" text="Tax class name"/></label>
- <div class="controls">
- <form:input cssClass="input-large" path="title" />
- </div>
- </div>
-
-
- <form:hidden path="id" />
- <form:hidden path="merchantStore.id" value="${requestScope.store.id}" />
-
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
- </div>
- </div>
-
- </form:form>
-
-
- <br/><br/>
- <!-- Listing grid include -->
- <c:set value="/admin/tax/taxclass/paging.html" var="pagingUrl" scope="request"/>
- <c:set value="/admin/tax/taxclass/remove.html" var="removeUrl" scope="request"/>
- <c:set value="/admin/tax/taxclass/list.html" var="refreshUrl" scope="request"/>
- <c:set value="/admin/tax/taxclass/edit.html" var="editUrl" scope="request"/>
- <c:set var="entityId" value="taxClassId" scope="request"/>
- <c:set var="componentTitleKey" value="label.tax.taxclass.title" scope="request"/>
- <c:set var="gridHeader" value="/pages/admin/tax/taxClass-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="true" scope="request"/>
-
-
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="taxrates-section">
+
+ <div class="sm-ui-component">
+ <h3><s:message code="label.tax.taxclass.title" text="Tax classes" /></h3>
+ <br/>
+
+ <c:url var="saveTaxClass" value="/admin/tax/taxclass/save.html"/>
+
+ <form:form method="POST" modelAttribute="taxClass" action="${saveTaxClass}">
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.tax.taxclass" text="Tax class"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large" path="code" />
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.tax.taxclass.name" text="Tax class name"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large" path="title" />
+ </div>
+ </div>
+
+
+ <form:hidden path="id" />
+ <form:hidden path="merchantStore.id" value="${requestScope.store.id}" />
+
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
+ </div>
+ </div>
+
+ </form:form>
+
+
+ <br/><br/>
+ <!-- Listing grid include -->
+ <c:set value="/admin/tax/taxclass/paging.html" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/tax/taxclass/remove.html" var="removeUrl" scope="request"/>
+ <c:set value="/admin/tax/taxclass/list.html" var="refreshUrl" scope="request"/>
+ <c:set value="/admin/tax/taxclass/edit.html" var="editUrl" scope="request"/>
+ <c:set var="entityId" value="taxClassId" scope="request"/>
+ <c:set var="componentTitleKey" value="label.tax.taxclass.title" scope="request"/>
+ <c:set var="gridHeader" value="/pages/admin/tax/taxClass-gridHeader.jsp" scope="request"/>
+ <c:set var="canRemoveEntry" value="true" scope="request"/>
+
+
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/tax/taxClassDetails.jsp b/sm-shop/src/main/webapp/pages/admin/tax/taxClassDetails.jsp
index 39a9df3..086c003 100644
--- a/sm-shop/src/main/webapp/pages/admin/tax/taxClassDetails.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/tax/taxClassDetails.jsp
@@ -1,69 +1,69 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-
-
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="taxrates-section">
- <a href="<c:url value="/admin/tax/taxclass/list.html"/>"><s:message code="label.generic.back" text="Back" /></a><br/><br/>
- <div class="sm-ui-component">
- <h3><s:message code="label.tax.taxclass.title" text="Tax classes" /></h3>
- <br/>
-
- <c:url var="saveTaxClass" value="/admin/tax/taxclass/update.html"/>
-
- <form:form method="POST" modelAttribute="taxClass" action="${saveTaxClass}">
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
-
-
- <div class="control-group">
- <label class="required"><s:message code="label.tax.taxclass" text="Tax class"/></label>
- <div class="controls">
- <form:input cssClass="input-large" path="code" />
- </div>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="label.tax.taxclass.name" text="Tax class name"/></label>
- <div class="controls">
- <form:input cssClass="input-large" path="title" />
- </div>
- </div>
-
-
- <form:hidden path="id" />
- <form:hidden path="merchantStore.id" value="${requestScope.store.id}" />
-
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
- </div>
- </div>
-
- </form:form>
-
-
- </div>
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+
+
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="taxrates-section">
+ <a href="<c:url value="/admin/tax/taxclass/list.html"/>"><s:message code="label.generic.back" text="Back" /></a><br/><br/>
+ <div class="sm-ui-component">
+ <h3><s:message code="label.tax.taxclass.title" text="Tax classes" /></h3>
+ <br/>
+
+ <c:url var="saveTaxClass" value="/admin/tax/taxclass/update.html"/>
+
+ <form:form method="POST" modelAttribute="taxClass" action="${saveTaxClass}">
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.tax.taxclass" text="Tax class"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large" path="code" />
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.tax.taxclass.name" text="Tax class name"/></label>
+ <div class="controls">
+ <form:input cssClass="input-large" path="title" />
+ </div>
+ </div>
+
+
+ <form:hidden path="id" />
+ <form:hidden path="merchantStore.id" value="${requestScope.store.id}" />
+
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
+ </div>
+ </div>
+
+ </form:form>
+
+
+ </div>
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/tax/taxClass-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/tax/taxClass-gridHeader.jsp
index 3faf146..132a34b 100644
--- a/sm-shop/src/main/webapp/pages/admin/tax/taxClass-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/tax/taxClass-gridHeader.jsp
@@ -1,13 +1,13 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
-<%@ page session="false" %>
-
-
-
- {title:"<s:message code="label.entity.id" text="Id"/>", name:"taxClassId", canFilter:false},
- {title:"<s:message code="label.entity.code" text="Code"/>", name:"code", canFilter:false},
- {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false},
- {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
+<%@ page session="false" %>
+
+
+
+ {title:"<s:message code="label.entity.id" text="Id"/>", name:"taxClassId", canFilter:false},
+ {title:"<s:message code="label.entity.code" text="Code"/>", name:"code", canFilter:false},
+ {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false},
+ {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
diff --git a/sm-shop/src/main/webapp/pages/admin/tax/taxConfiguration.jsp b/sm-shop/src/main/webapp/pages/admin/tax/taxConfiguration.jsp
index 1cfd0a9..00bb6be 100644
--- a/sm-shop/src/main/webapp/pages/admin/tax/taxConfiguration.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/tax/taxConfiguration.jsp
@@ -1,70 +1,70 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-
-
-<script src="<c:url value="/resources/js/ckeditor/ckeditor.js" />"></script>
-
-
-
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="taxrates-section">
-
- <div class="sm-ui-component">
- <h3><s:message code="label.tax.taxconfiguration" text="Tax basis calculation" /></h3>
- <br/>
-
- <c:url var="saveTaxConfiguration" value="/admin/tax/taxconfiguration/save.html"/>
-
- <form:form method="POST" modelAttribute="taxConfiguration" action="${saveTaxConfiguration}">
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
-
-
- <div class="control-group">
- <div class="controls">
- <form:radiobutton id="taxBasisCalculation" path="taxBasisCalculation" value="STOREADDRESS"/> <s:message code="label.tax.storeaddress" text="Store address" /><br/>
- <form:radiobutton id="taxBasisCalculation" path="taxBasisCalculation" value="SHIPPINGADDRESS"/> <s:message code="label.shipping.shippingaddress" text="Shipping address" /><br/>
- <form:radiobutton id="taxBasisCalculation" path="taxBasisCalculation" value="BILLINGADDRESS"/> <s:message code="label.shipping.billingaddress" text="Billing address" />
- </div>
- <span class="help-inline"><form:errors path="taxBasisCalculation" cssClass="error" /></span>
- </div>
-
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
- </div>
- </div>
-
- </form:form>
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+
+
+<script src="<c:url value="/resources/js/ckeditor/ckeditor.js" />"></script>
+
+
+
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="taxrates-section">
+
+ <div class="sm-ui-component">
+ <h3><s:message code="label.tax.taxconfiguration" text="Tax basis calculation" /></h3>
+ <br/>
+
+ <c:url var="saveTaxConfiguration" value="/admin/tax/taxconfiguration/save.html"/>
+
+ <form:form method="POST" modelAttribute="taxConfiguration" action="${saveTaxConfiguration}">
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+
+
+ <div class="control-group">
+ <div class="controls">
+ <form:radiobutton id="taxBasisCalculation" path="taxBasisCalculation" value="STOREADDRESS"/> <s:message code="label.tax.storeaddress" text="Store address" /><br/>
+ <form:radiobutton id="taxBasisCalculation" path="taxBasisCalculation" value="SHIPPINGADDRESS"/> <s:message code="label.shipping.shippingaddress" text="Shipping address" /><br/>
+ <form:radiobutton id="taxBasisCalculation" path="taxBasisCalculation" value="BILLINGADDRESS"/> <s:message code="label.shipping.billingaddress" text="Billing address" />
+ </div>
+ <span class="help-inline"><form:errors path="taxBasisCalculation" cssClass="error" /></span>
+ </div>
+
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
+ </div>
+ </div>
+
+ </form:form>
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
sm-shop/src/main/webapp/pages/admin/tax/taxRateDetails.jsp 500(+250 -250)
diff --git a/sm-shop/src/main/webapp/pages/admin/tax/taxRateDetails.jsp b/sm-shop/src/main/webapp/pages/admin/tax/taxRateDetails.jsp
index ed45517..b9546aa 100644
--- a/sm-shop/src/main/webapp/pages/admin/tax/taxRateDetails.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/tax/taxRateDetails.jsp
@@ -1,251 +1,251 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-<script type="text/javascript">
-var priceFormatMessage = '<s:message code="message.price.cents" text="Wrong format" />';
-</script>
-
- <script src="<c:url value="/resources/js/jquery.formatCurrency-1.4.0.js" />"></script>
- <script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
-
-<script>
-
-
-$(document).ready(function() {
-
- $('#code').alphanumeric();
- $('#taxPriority').numeric();
- $('#rateText').numeric({allow:"."});
- getZones('<c:out value="${taxRate.country.isoCode}"/>');
-
- $(".country-list").change(function() {
- getZones($(this).val());
- })
-
-
- $('#rateText').blur(function() {
- $('#help-rateText').html(null);
- $(this).formatCurrency({ roundToDecimalPlace: 3, eventOnDecimalsEntered: true, symbol: ''});
- })
- .keyup(function(e) {
- var e = window.event || e;
- var keyUnicode = e.charCode || e.keyCode;
- if (e !== undefined) {
- switch (keyUnicode) {
- case 16: break; // Shift
- case 17: break; // Ctrl
- case 18: break; // Alt
- case 27: this.value = ''; break; // Esc: clear entry
- case 35: break; // End
- case 36: break; // Home
- case 37: break; // cursor left
- case 38: break; // cursor up
- case 39: break; // cursor right
- case 40: break; // cursor down
- case 78: break; // N (Opera 9.63+ maps the "." from the number key section to the "N" key too!) (See: http://unixpapa.com/js/key.html search for ". Del")
- case 110: break; // . number block (Opera 9.63+ maps the "." from the number block to the "N" key (78) !!!)
- case 190: break; // .
- default: $(this).formatCurrency({ colorize: true, negativeFormat: '-%s%n', roundToDecimalPlace: -1, eventOnDecimalsEntered: true, symbol: ''});
- }
- }
- })
- .bind('decimalsEntered', function(e, cents) {
- if (String(cents).length > 3) {
- var errorMsg = priceFormatMessage + ' (0.' + cents + ')';
- $('#help-rateText').html(errorMsg);
- }
- });
-
-
-
-});
-
-$.fn.addItems = function(data) {
- $(".zone-list > option").remove();
- return this.each(function() {
- var list = this;
- $.each(data, function(index, itemData) {
- var option = new Option(itemData.name, itemData.id);
- list.add(option);
- });
- });
-};
-
-function getZones(countryCode){
- $.ajax({
- type: 'POST',
- url: '<c:url value="/admin/reference/provinces.html"/>',
- data: 'countryCode=' + countryCode,
- dataType: 'json',
- success: function(response){
-
- var status = isc.XMLTools.selectObjects(response, "/response/status");
- if(status==0 || status ==9999) {
-
- var data = isc.XMLTools.selectObjects(response, "/response/data");
- if(data && data.length>0) {
-
- $('.zone-list').show();
- $('#stateProvince').hide();
- $(".zone-list").addItems(data);
- <c:if test="${taxRate.zone!=null}">
- $('.zone-list').val('<c:out value="${taxRate.zone.id}"/>');
- $('#stateProvince').val('');
- </c:if>
- } else {
- $('.zone-list').hide();
- $('#stateProvince').show();
- <c:if test="${taxRate.stateProvince!=null}">
- $('#stateProvince').val('<c:out value="${taxRate.stateProvince}"/>');
- </c:if>
-
- }
- } else {
- $('.zone-list').hide();
- $('#stateProvince').show();
- }
-
-
- },
- error: function(xhr, textStatus, errorThrown) {
- alert('error ' + errorThrown);
- }
-
- });
-}
-
-
-</script>
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="taxrates-section">
- <a href="<c:url value="/admin/tax/taxrates/list.html"/>"><s:message code="label.generic.back" text="Back" /></a><br/><br/>
- <div class="sm-ui-component">
- <h3><s:message code="menu.taxrates.rate" text="Tax rate" /></h3>
- <br/>
-
- <c:url var="saveTaxRate" value="/admin/tax/taxrates/update.html"/>
-
- <form:form method="POST" modelAttribute="taxRate" action="${saveTaxRate}">
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
-
-
- <div class="control-group">
- <label><s:message code="label.country" text="Country"/></label>
- <div class="controls">
- <form:select path="country.isoCode" cssClass="country-list highlight">
- <form:options items="${countries}" itemValue="isoCode" itemLabel="name"/>
- </form:select>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.storezone" text="Store state / province"/></label>
- <div class="controls">
- <form:select cssClass="zone-list " path="zone.id"/>
- <input type="text" class="input-large" value="${taxRate.stateProvince}" id="stateProvince" name="stateProvince" />
- <span class="help-inline"><form:errors path="zone.code" cssClass="error" /></span>
- </div>
- </div>
-
- <c:forEach items="${taxRate.descriptions}" var="description" varStatus="counter">
-
- <div class="control-group">
-
- <label class="required"><s:message code="menu.taxrates.name" text="Tax name"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:input cssClass="input-large highlight" id="name${counter.index}" path="descriptions[${counter.index}].name"/>
- <span class="help-inline"><form:errors path="descriptions[${counter.index}].name" cssClass="error" /></span>
- </div>
-
- </div>
- <form:hidden path="descriptions[${counter.index}].id" />
- <form:hidden path="descriptions[${counter.index}].language.id" />
- <form:hidden path="descriptions[${counter.index}].language.code" />
- <form:hidden path="descriptions[${counter.index}].taxRate.id" />
-
- </c:forEach>
-
- <div class="control-group">
- <label class="required"><s:message code="menu.taxrates.code" text="Code"/></label>
-
- <div class="controls">
- <form:input id="code" cssClass="highlight" path="code"/>
- <span class="help-inline"><form:errors path="code" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="menu.taxrates.rate" text="Rate"/></label>
-
- <div class="controls">
- <form:input id="rateText" cssClass="highlight" path="rateText"/>
- <span id="help-rateText" class="help-inline"><form:errors path="rateText" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.tax.compound" text="Compound" /></label>
- <div class="controls">
- <form:checkbox id="piggyback" path="piggyback" /><br/>
- <span class="help-inline"><form:errors path="piggyback" cssClass="error" /></span>
- </div>
- </div>
-
-
- <div class="control-group">
- <label class="required"><s:message code="label.entity.order" text="Priority"/></label>
-
- <div class="controls">
- <form:input id="taxPriority" cssClass="highlight" path="taxPriority"/>
- <span class="help-inline"><form:errors path="taxPriority" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="label.tax.taxclass.name" text="Tax class name"/></label>
- <div class="controls">
- <form:select path="taxClass.id" cssClass="highlight">
- <form:options items="${taxClasses}" itemValue="id" itemLabel="code"/>
- </form:select>
- </div>
- </div>
-
-
-
- <form:hidden path="merchantStore.id" value="${requestScope.store.id}" />
- <form:hidden path="id" />
-
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
- </div>
- </div>
-
- </form:form>
-
-
-
-
- </div>
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+<script type="text/javascript">
+var priceFormatMessage = '<s:message code="message.price.cents" text="Wrong format" />';
+</script>
+
+ <script src="<c:url value="/resources/js/jquery.formatCurrency-1.4.0.js" />"></script>
+ <script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
+
+<script>
+
+
+$(document).ready(function() {
+
+ $('#code').alphanumeric();
+ $('#taxPriority').numeric();
+ $('#rateText').numeric({allow:"."});
+ getZones('<c:out value="${taxRate.country.isoCode}"/>');
+
+ $(".country-list").change(function() {
+ getZones($(this).val());
+ })
+
+
+ $('#rateText').blur(function() {
+ $('#help-rateText').html(null);
+ $(this).formatCurrency({ roundToDecimalPlace: 3, eventOnDecimalsEntered: true, symbol: ''});
+ })
+ .keyup(function(e) {
+ var e = window.event || e;
+ var keyUnicode = e.charCode || e.keyCode;
+ if (e !== undefined) {
+ switch (keyUnicode) {
+ case 16: break; // Shift
+ case 17: break; // Ctrl
+ case 18: break; // Alt
+ case 27: this.value = ''; break; // Esc: clear entry
+ case 35: break; // End
+ case 36: break; // Home
+ case 37: break; // cursor left
+ case 38: break; // cursor up
+ case 39: break; // cursor right
+ case 40: break; // cursor down
+ case 78: break; // N (Opera 9.63+ maps the "." from the number key section to the "N" key too!) (See: http://unixpapa.com/js/key.html search for ". Del")
+ case 110: break; // . number block (Opera 9.63+ maps the "." from the number block to the "N" key (78) !!!)
+ case 190: break; // .
+ default: $(this).formatCurrency({ colorize: true, negativeFormat: '-%s%n', roundToDecimalPlace: -1, eventOnDecimalsEntered: true, symbol: ''});
+ }
+ }
+ })
+ .bind('decimalsEntered', function(e, cents) {
+ if (String(cents).length > 3) {
+ var errorMsg = priceFormatMessage + ' (0.' + cents + ')';
+ $('#help-rateText').html(errorMsg);
+ }
+ });
+
+
+
+});
+
+$.fn.addItems = function(data) {
+ $(".zone-list > option").remove();
+ return this.each(function() {
+ var list = this;
+ $.each(data, function(index, itemData) {
+ var option = new Option(itemData.name, itemData.id);
+ list.add(option);
+ });
+ });
+};
+
+function getZones(countryCode){
+ $.ajax({
+ type: 'POST',
+ url: '<c:url value="/admin/reference/provinces.html"/>',
+ data: 'countryCode=' + countryCode,
+ dataType: 'json',
+ success: function(response){
+
+ var status = isc.XMLTools.selectObjects(response, "/response/status");
+ if(status==0 || status ==9999) {
+
+ var data = isc.XMLTools.selectObjects(response, "/response/data");
+ if(data && data.length>0) {
+
+ $('.zone-list').show();
+ $('#stateProvince').hide();
+ $(".zone-list").addItems(data);
+ <c:if test="${taxRate.zone!=null}">
+ $('.zone-list').val('<c:out value="${taxRate.zone.id}"/>');
+ $('#stateProvince').val('');
+ </c:if>
+ } else {
+ $('.zone-list').hide();
+ $('#stateProvince').show();
+ <c:if test="${taxRate.stateProvince!=null}">
+ $('#stateProvince').val('<c:out value="${taxRate.stateProvince}"/>');
+ </c:if>
+
+ }
+ } else {
+ $('.zone-list').hide();
+ $('#stateProvince').show();
+ }
+
+
+ },
+ error: function(xhr, textStatus, errorThrown) {
+ alert('error ' + errorThrown);
+ }
+
+ });
+}
+
+
+</script>
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="taxrates-section">
+ <a href="<c:url value="/admin/tax/taxrates/list.html"/>"><s:message code="label.generic.back" text="Back" /></a><br/><br/>
+ <div class="sm-ui-component">
+ <h3><s:message code="menu.taxrates.rate" text="Tax rate" /></h3>
+ <br/>
+
+ <c:url var="saveTaxRate" value="/admin/tax/taxrates/update.html"/>
+
+ <form:form method="POST" modelAttribute="taxRate" action="${saveTaxRate}">
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+
+
+ <div class="control-group">
+ <label><s:message code="label.country" text="Country"/></label>
+ <div class="controls">
+ <form:select path="country.isoCode" cssClass="country-list highlight">
+ <form:options items="${countries}" itemValue="isoCode" itemLabel="name"/>
+ </form:select>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.storezone" text="Store state / province"/></label>
+ <div class="controls">
+ <form:select cssClass="zone-list " path="zone.id"/>
+ <input type="text" class="input-large" value="${taxRate.stateProvince}" id="stateProvince" name="stateProvince" />
+ <span class="help-inline"><form:errors path="zone.code" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <c:forEach items="${taxRate.descriptions}" var="description" varStatus="counter">
+
+ <div class="control-group">
+
+ <label class="required"><s:message code="menu.taxrates.name" text="Tax name"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" id="name${counter.index}" path="descriptions[${counter.index}].name"/>
+ <span class="help-inline"><form:errors path="descriptions[${counter.index}].name" cssClass="error" /></span>
+ </div>
+
+ </div>
+ <form:hidden path="descriptions[${counter.index}].id" />
+ <form:hidden path="descriptions[${counter.index}].language.id" />
+ <form:hidden path="descriptions[${counter.index}].language.code" />
+ <form:hidden path="descriptions[${counter.index}].taxRate.id" />
+
+ </c:forEach>
+
+ <div class="control-group">
+ <label class="required"><s:message code="menu.taxrates.code" text="Code"/></label>
+
+ <div class="controls">
+ <form:input id="code" cssClass="highlight" path="code"/>
+ <span class="help-inline"><form:errors path="code" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="menu.taxrates.rate" text="Rate"/></label>
+
+ <div class="controls">
+ <form:input id="rateText" cssClass="highlight" path="rateText"/>
+ <span id="help-rateText" class="help-inline"><form:errors path="rateText" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.tax.compound" text="Compound" /></label>
+ <div class="controls">
+ <form:checkbox id="piggyback" path="piggyback" /><br/>
+ <span class="help-inline"><form:errors path="piggyback" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.entity.order" text="Priority"/></label>
+
+ <div class="controls">
+ <form:input id="taxPriority" cssClass="highlight" path="taxPriority"/>
+ <span class="help-inline"><form:errors path="taxPriority" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.tax.taxclass.name" text="Tax class name"/></label>
+ <div class="controls">
+ <form:select path="taxClass.id" cssClass="highlight">
+ <form:options items="${taxClasses}" itemValue="id" itemLabel="code"/>
+ </form:select>
+ </div>
+ </div>
+
+
+
+ <form:hidden path="merchantStore.id" value="${requestScope.store.id}" />
+ <form:hidden path="id" />
+
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
+ </div>
+ </div>
+
+ </form:form>
+
+
+
+
+ </div>
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
sm-shop/src/main/webapp/pages/admin/tax/taxRates.jsp 524(+262 -262)
diff --git a/sm-shop/src/main/webapp/pages/admin/tax/taxRates.jsp b/sm-shop/src/main/webapp/pages/admin/tax/taxRates.jsp
index 90dfb2f..999375e 100644
--- a/sm-shop/src/main/webapp/pages/admin/tax/taxRates.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/tax/taxRates.jsp
@@ -1,263 +1,263 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ page session="false" %>
-<script type="text/javascript">
-var priceFormatMessage = '<s:message code="message.price.cents" text="Wrong format" />';
-</script>
-
- <script src="<c:url value="/resources/js/jquery.formatCurrency-1.4.0.js" />"></script>
- <script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
-
-<script>
-
-
-$(document).ready(function() {
-
- $('#code').alphanumeric();
- $('#taxPriority').numeric();
- $('#rateText').numeric({allow:"."});
- getZones('<c:out value="${taxRate.country.isoCode}"/>');
-
- $(".country-list").change(function() {
- getZones($(this).val());
- })
-
-
- $('#rateText').blur(function() {
- $('#help-rateText').html(null);
- $(this).formatCurrency({ roundToDecimalPlace: 3, eventOnDecimalsEntered: true, symbol: ''});
- })
- .keyup(function(e) {
- var e = window.event || e;
- var keyUnicode = e.charCode || e.keyCode;
- if (e !== undefined) {
- switch (keyUnicode) {
- case 16: break; // Shift
- case 17: break; // Ctrl
- case 18: break; // Alt
- case 27: this.value = ''; break; // Esc: clear entry
- case 35: break; // End
- case 36: break; // Home
- case 37: break; // cursor left
- case 38: break; // cursor up
- case 39: break; // cursor right
- case 40: break; // cursor down
- case 78: break; // N (Opera 9.63+ maps the "." from the number key section to the "N" key too!) (See: http://unixpapa.com/js/key.html search for ". Del")
- case 110: break; // . number block (Opera 9.63+ maps the "." from the number block to the "N" key (78) !!!)
- case 190: break; // .
- default: $(this).formatCurrency({ colorize: true, negativeFormat: '-%s%n', roundToDecimalPlace: -1, eventOnDecimalsEntered: true, symbol: ''});
- }
- }
- })
- .bind('decimalsEntered', function(e, cents) {
- if (String(cents).length > 3) {
- var errorMsg = priceFormatMessage + ' (0.' + cents + ')';
- $('#help-rateText').html(errorMsg);
- }
- });
-
-
-
-});
-
-$.fn.addItems = function(data) {
- $(".zone-list > option").remove();
- return this.each(function() {
- var list = this;
- $.each(data, function(index, itemData) {
- //alert(itemData.name + " " + itemData.id)
- var option = new Option(itemData.name, itemData.id);
- list.add(option);
- });
- });
-};
-
-function getZones(countryCode){
- $.ajax({
- type: 'POST',
- url: '<c:url value="/admin/reference/provinces.html"/>',
- data: 'countryCode=' + countryCode,
- dataType: 'json',
- success: function(response){
-
- var status = isc.XMLTools.selectObjects(response, "/response/status");
- if(status==0 || status ==9999) {
-
- var data = isc.XMLTools.selectObjects(response, "/response/data");
- if(data && data.length>0) {
-
- $('.zone-list').show();
- $('#stateProvince').hide();
- $(".zone-list").addItems(data);
- } else {
- $('.zone-list').hide();
- $('#stateProvince').show();
-
- }
- } else {
- $('.zone-list').hide();
- $('#stateProvince').show();
- }
-
-
- },
- error: function(xhr, textStatus, errorThrown) {
- alert('error ' + errorThrown);
- }
-
- });
-}
-
-
-</script>
-
-
-
-<div class="tabbable">
-
- <jsp:include page="/common/adminTabs.jsp" />
-
- <div class="tab-content">
-
- <div class="tab-pane active" id="taxrates-section">
-
- <div class="sm-ui-component">
- <h3><s:message code="menu.taxrates" text="Tax rates" /></h3>
- <br/>
-
- <c:url var="saveTaxRate" value="/admin/tax/taxrates/save.html"/>
-
- <form:form method="POST" modelAttribute="taxRate" action="${saveTaxRate}">
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
-
-
-
- <div class="control-group">
- <label><s:message code="label.country" text="Country"/></label>
- <div class="controls">
- <form:select path="country.isoCode" cssClass="country-list highlight">
- <form:options items="${countries}" itemValue="isoCode" itemLabel="name"/>
- </form:select>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.storezone" text="Store state / province"/></label>
- <div class="controls">
- <form:select cssClass="zone-list " path="zone.id"/>
- <input type="text" class="input-large" id="stateProvince" name="stateProvince" />
- <span class="help-inline"><form:errors path="zone.code" cssClass="error" /></span>
- </div>
- </div>
-
- <c:forEach items="${taxRate.descriptions}" var="description" varStatus="counter">
-
- <div class="control-group">
-
- <label class="required"><s:message code="menu.taxrates.name" text="Tax name"/> (<c:out value="${description.language.code}"/>)</label>
- <div class="controls">
- <form:input cssClass="input-large highlight" id="name${counter.index}" path="descriptions[${counter.index}].name"/>
- <span class="help-inline"><form:errors path="descriptions[${counter.index}].name" cssClass="error" /></span>
- </div>
-
- </div>
- <form:hidden path="descriptions[${counter.index}].language.id" />
- <form:hidden path="descriptions[${counter.index}].language.code" />
-
- </c:forEach>
-
- <div class="control-group">
- <label class="required"><s:message code="menu.taxrates.code" text="Code"/></label>
-
- <div class="controls">
- <form:input id="code" cssClass="highlight" path="code"/>
- <span class="help-inline"><form:errors path="code" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="menu.taxrates.rate" text="Rate"/></label>
-
- <div class="controls">
- <form:input id="rateText" cssClass="highlight" path="rateText"/>
- <span id="help-rateText" class="help-inline"><form:errors path="rateText" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label><s:message code="label.tax.compound" text="Compound" /></label>
- <div class="controls">
- <form:checkbox id="piggyback" path="piggyback" /><br/>
- <span class="help-inline"><form:errors path="piggyback" cssClass="error" /></span>
- </div>
- </div>
-
-
- <div class="control-group">
- <label class="required"><s:message code="label.entity.order" text="Priority"/></label>
-
- <div class="controls">
- <form:input id="taxPriority" cssClass="highlight" path="taxPriority" value="0"/>
- <span class="help-inline"><form:errors path="taxPriority" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group">
- <label class="required"><s:message code="label.tax.taxclass.name" text="Tax class name"/></label>
- <div class="controls">
- <form:select path="taxClass.id" cssClass="highlight">
- <form:options items="${taxClasses}" itemValue="id" itemLabel="code"/>
- </form:select>
- </div>
- </div>
-
-
-
- <form:hidden path="merchantStore.id" value="${requestScope.store.id}" />
-
- <div class="form-actions">
- <div class="pull-right">
- <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
- </div>
- </div>
-
- </form:form>
-
-
- <br/><br/>
- <!-- Listing grid include -->
- <c:set value="/admin/tax/taxrates/page.html" var="pagingUrl" scope="request"/>
- <c:set value="/admin/tax/taxrates/remove.html" var="removeUrl" scope="request"/>
- <c:set value="/admin/tax/taxrates/list.html" var="refreshUrl" scope="request"/>
- <c:set value="/admin/tax/taxrates/edit.html" var="editUrl" scope="request"/>
- <c:set var="entityId" value="taxRateId" scope="request"/>
- <c:set var="componentTitleKey" value="label.tax.taxclass.title" scope="request"/>
- <c:set var="gridHeader" value="/pages/admin/tax/taxRates-gridHeader.jsp" scope="request"/>
- <c:set var="canRemoveEntry" value="true" scope="request"/>
-
-
- <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
- <!-- End listing grid include -->
-
-
- </div>
-
-
-
-
-
-
-
-
-
-
-
- </div>
-
-
- </div>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ page session="false" %>
+<script type="text/javascript">
+var priceFormatMessage = '<s:message code="message.price.cents" text="Wrong format" />';
+</script>
+
+ <script src="<c:url value="/resources/js/jquery.formatCurrency-1.4.0.js" />"></script>
+ <script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
+
+<script>
+
+
+$(document).ready(function() {
+
+ $('#code').alphanumeric();
+ $('#taxPriority').numeric();
+ $('#rateText').numeric({allow:"."});
+ getZones('<c:out value="${taxRate.country.isoCode}"/>');
+
+ $(".country-list").change(function() {
+ getZones($(this).val());
+ })
+
+
+ $('#rateText').blur(function() {
+ $('#help-rateText').html(null);
+ $(this).formatCurrency({ roundToDecimalPlace: 3, eventOnDecimalsEntered: true, symbol: ''});
+ })
+ .keyup(function(e) {
+ var e = window.event || e;
+ var keyUnicode = e.charCode || e.keyCode;
+ if (e !== undefined) {
+ switch (keyUnicode) {
+ case 16: break; // Shift
+ case 17: break; // Ctrl
+ case 18: break; // Alt
+ case 27: this.value = ''; break; // Esc: clear entry
+ case 35: break; // End
+ case 36: break; // Home
+ case 37: break; // cursor left
+ case 38: break; // cursor up
+ case 39: break; // cursor right
+ case 40: break; // cursor down
+ case 78: break; // N (Opera 9.63+ maps the "." from the number key section to the "N" key too!) (See: http://unixpapa.com/js/key.html search for ". Del")
+ case 110: break; // . number block (Opera 9.63+ maps the "." from the number block to the "N" key (78) !!!)
+ case 190: break; // .
+ default: $(this).formatCurrency({ colorize: true, negativeFormat: '-%s%n', roundToDecimalPlace: -1, eventOnDecimalsEntered: true, symbol: ''});
+ }
+ }
+ })
+ .bind('decimalsEntered', function(e, cents) {
+ if (String(cents).length > 3) {
+ var errorMsg = priceFormatMessage + ' (0.' + cents + ')';
+ $('#help-rateText').html(errorMsg);
+ }
+ });
+
+
+
+});
+
+$.fn.addItems = function(data) {
+ $(".zone-list > option").remove();
+ return this.each(function() {
+ var list = this;
+ $.each(data, function(index, itemData) {
+ //alert(itemData.name + " " + itemData.id)
+ var option = new Option(itemData.name, itemData.id);
+ list.add(option);
+ });
+ });
+};
+
+function getZones(countryCode){
+ $.ajax({
+ type: 'POST',
+ url: '<c:url value="/admin/reference/provinces.html"/>',
+ data: 'countryCode=' + countryCode,
+ dataType: 'json',
+ success: function(response){
+
+ var status = isc.XMLTools.selectObjects(response, "/response/status");
+ if(status==0 || status ==9999) {
+
+ var data = isc.XMLTools.selectObjects(response, "/response/data");
+ if(data && data.length>0) {
+
+ $('.zone-list').show();
+ $('#stateProvince').hide();
+ $(".zone-list").addItems(data);
+ } else {
+ $('.zone-list').hide();
+ $('#stateProvince').show();
+
+ }
+ } else {
+ $('.zone-list').hide();
+ $('#stateProvince').show();
+ }
+
+
+ },
+ error: function(xhr, textStatus, errorThrown) {
+ alert('error ' + errorThrown);
+ }
+
+ });
+}
+
+
+</script>
+
+
+
+<div class="tabbable">
+
+ <jsp:include page="/common/adminTabs.jsp" />
+
+ <div class="tab-content">
+
+ <div class="tab-pane active" id="taxrates-section">
+
+ <div class="sm-ui-component">
+ <h3><s:message code="menu.taxrates" text="Tax rates" /></h3>
+ <br/>
+
+ <c:url var="saveTaxRate" value="/admin/tax/taxrates/save.html"/>
+
+ <form:form method="POST" modelAttribute="taxRate" action="${saveTaxRate}">
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+
+
+
+ <div class="control-group">
+ <label><s:message code="label.country" text="Country"/></label>
+ <div class="controls">
+ <form:select path="country.isoCode" cssClass="country-list highlight">
+ <form:options items="${countries}" itemValue="isoCode" itemLabel="name"/>
+ </form:select>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.storezone" text="Store state / province"/></label>
+ <div class="controls">
+ <form:select cssClass="zone-list " path="zone.id"/>
+ <input type="text" class="input-large" id="stateProvince" name="stateProvince" />
+ <span class="help-inline"><form:errors path="zone.code" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <c:forEach items="${taxRate.descriptions}" var="description" varStatus="counter">
+
+ <div class="control-group">
+
+ <label class="required"><s:message code="menu.taxrates.name" text="Tax name"/> (<c:out value="${description.language.code}"/>)</label>
+ <div class="controls">
+ <form:input cssClass="input-large highlight" id="name${counter.index}" path="descriptions[${counter.index}].name"/>
+ <span class="help-inline"><form:errors path="descriptions[${counter.index}].name" cssClass="error" /></span>
+ </div>
+
+ </div>
+ <form:hidden path="descriptions[${counter.index}].language.id" />
+ <form:hidden path="descriptions[${counter.index}].language.code" />
+
+ </c:forEach>
+
+ <div class="control-group">
+ <label class="required"><s:message code="menu.taxrates.code" text="Code"/></label>
+
+ <div class="controls">
+ <form:input id="code" cssClass="highlight" path="code"/>
+ <span class="help-inline"><form:errors path="code" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="menu.taxrates.rate" text="Rate"/></label>
+
+ <div class="controls">
+ <form:input id="rateText" cssClass="highlight" path="rateText"/>
+ <span id="help-rateText" class="help-inline"><form:errors path="rateText" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label><s:message code="label.tax.compound" text="Compound" /></label>
+ <div class="controls">
+ <form:checkbox id="piggyback" path="piggyback" /><br/>
+ <span class="help-inline"><form:errors path="piggyback" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.entity.order" text="Priority"/></label>
+
+ <div class="controls">
+ <form:input id="taxPriority" cssClass="highlight" path="taxPriority" value="0"/>
+ <span class="help-inline"><form:errors path="taxPriority" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label class="required"><s:message code="label.tax.taxclass.name" text="Tax class name"/></label>
+ <div class="controls">
+ <form:select path="taxClass.id" cssClass="highlight">
+ <form:options items="${taxClasses}" itemValue="id" itemLabel="code"/>
+ </form:select>
+ </div>
+ </div>
+
+
+
+ <form:hidden path="merchantStore.id" value="${requestScope.store.id}" />
+
+ <div class="form-actions">
+ <div class="pull-right">
+ <button type="submit" class="btn btn-success"><s:message code="button.label.submit" text="Submit"/></button>
+ </div>
+ </div>
+
+ </form:form>
+
+
+ <br/><br/>
+ <!-- Listing grid include -->
+ <c:set value="/admin/tax/taxrates/page.html" var="pagingUrl" scope="request"/>
+ <c:set value="/admin/tax/taxrates/remove.html" var="removeUrl" scope="request"/>
+ <c:set value="/admin/tax/taxrates/list.html" var="refreshUrl" scope="request"/>
+ <c:set value="/admin/tax/taxrates/edit.html" var="editUrl" scope="request"/>
+ <c:set var="entityId" value="taxRateId" scope="request"/>
+ <c:set var="componentTitleKey" value="label.tax.taxclass.title" scope="request"/>
+ <c:set var="gridHeader" value="/pages/admin/tax/taxRates-gridHeader.jsp" scope="request"/>
+ <c:set var="canRemoveEntry" value="true" scope="request"/>
+
+
+ <jsp:include page="/pages/admin/components/list.jsp"></jsp:include>
+ <!-- End listing grid include -->
+
+
+ </div>
+
+
+
+
+
+
+
+
+
+
+
+ </div>
+
+
+ </div>
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/admin/tax/taxRates-gridHeader.jsp b/sm-shop/src/main/webapp/pages/admin/tax/taxRates-gridHeader.jsp
index 361d3e9..35cec9c 100644
--- a/sm-shop/src/main/webapp/pages/admin/tax/taxRates-gridHeader.jsp
+++ b/sm-shop/src/main/webapp/pages/admin/tax/taxRates-gridHeader.jsp
@@ -1,19 +1,19 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
-<%@ page session="false" %>
-
-
-
- {title:"<s:message code="label.entity.id" text="Id"/>", name:"taxRateId", canFilter:false},
- {title:"<s:message code="label.generic.country.code" text="Country dode"/>", name:"country", canFilter:false},
- {title:"<s:message code="label.generic.stateprovince" text="State / province"/>", name:"zone", canFilter:true},
- {title:"<s:message code="label.entity.code" text="Code"/>", name:"code", canFilter:false},
- {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false},
- {title:"<s:message code="menu.taxrates.rate" text="Rate"/>", name:"rate", canFilter:false},
- {title:"<s:message code="label.entity.order" text="Order"/>", name:"priority", canFilter:false},
- {title:"<s:message code="label.tax.compound" text="Compound"/>", name:"piggyback", type:"boolean", canFilter:false},
- {title:"<s:message code="label.taxclass" text="Tax class"/>", name:"taxClass", canFilter:false},
- {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
+<%@ page session="false" %>
+
+
+
+ {title:"<s:message code="label.entity.id" text="Id"/>", name:"taxRateId", canFilter:false},
+ {title:"<s:message code="label.generic.country.code" text="Country dode"/>", name:"country", canFilter:false},
+ {title:"<s:message code="label.generic.stateprovince" text="State / province"/>", name:"zone", canFilter:true},
+ {title:"<s:message code="label.entity.code" text="Code"/>", name:"code", canFilter:false},
+ {title:"<s:message code="label.entity.name" text="Name"/>", name:"name", canFilter:false},
+ {title:"<s:message code="menu.taxrates.rate" text="Rate"/>", name:"rate", canFilter:false},
+ {title:"<s:message code="label.entity.order" text="Order"/>", name:"priority", canFilter:false},
+ {title:"<s:message code="label.tax.compound" text="Compound"/>", name:"piggyback", type:"boolean", canFilter:false},
+ {title:"<s:message code="label.taxclass" text="Tax class"/>", name:"taxClass", canFilter:false},
+ {title:"<s:message code="label.entity.details" text="Details"/>", name: "buttonField", align: "center",canFilter:false,canSort:false, canReorder:false}
sm-shop/src/main/webapp/pages/shop/common/cart/cart.jsp 356(+196 -160)
diff --git a/sm-shop/src/main/webapp/pages/shop/common/cart/cart.jsp b/sm-shop/src/main/webapp/pages/shop/common/cart/cart.jsp
index f8f62dd..107ea5c 100644
--- a/sm-shop/src/main/webapp/pages/shop/common/cart/cart.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/common/cart/cart.jsp
@@ -4,7 +4,8 @@
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm"%>
-<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
+<script
+ src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
@@ -15,198 +16,233 @@
<div id="main-content" class="row-fluid show-grid container">
-<div class="span12 common-row">
+ <div class="span12 common-row">
-<h1 class="cart-title"><s:message code="label.cart.revieworder" text="Review your order" /></h1>
-<div id="store.error" class="alert alert-error alert-danger" style="display:none;"><s:message code="message.error.shoppingcart.update" text="An error occurred while updating the shopping cart"/></div>
+ <h1 class="cart-title">
+ <s:message code="label.cart.revieworder" text="Review your order" />
+ </h1>
+ <div id="store.error" class="alert alert-error alert-danger"
+ style="display: none;">
+ <s:message code="message.error.shoppingcart.update"
+ text="An error occurred while updating the shopping cart" />
+ </div>
- <!-- Unavailables -->
- <c:if test="${fn:length(cart.unavailables) gt 0}">
-
- <div id="store.error" class="alert alert-error" style="display:block;"><s:message code="message.error.shoppingcart.unavailables" text="Some of the item in your shopping cart are as of today unavailable for purchase. Those items will be removed from your shopping cart when the order form is displayed. If you are interested in purchasing this item, please send use a message with the item number, we will get back to you as soon as possible with an update on the availability of the item."/></div>
- <table>
- <c:forEach items="${cart.unavailables}" var="unavailable" varStatus="itemStatus">
-
- <c:if test="${itemStatus.index eq 0}">
- <thead>
- <tr>
- <th colspan="2" width="65%"> </th>
- <th colspan="1" width="35%"> </th>
- </tr>
- </thead>
- <tbody>
- </c:if>
-
-
- <tr>
- <td width="20%">
- <c:if test="${unavailable.image!=null}">
- <img width="60" src="<c:url value="${unavailable.image}"/>">
- </c:if>
- </td>
-
- <td style="border-left:none;">
- <strong>${unavailable.name}</strong>
- <c:if test="${fn:length(unavailable.shoppingCartAttributes)>0}">
- <br/>
- <ul>
- <c:forEach items="${unavailable.shoppingCartAttributes}" var="option">
- <li>${option.optionName} - ${option.optionValue}</li>
- </c:forEach>
- </ul>
- </c:if>
- <br/><s:message code="label.quantity" text="Quantity"/>: <c:out value="${unavailable.quantity}"/>
- <br/><s:message code="label.generic.price" text="Price"/>: <c:out value="${unavailable.price}"/>
-
-
- </td>
- <td>
-
- </td>
-
-
-
-
- </tr>
- </c:forEach>
- </table>
- <br/>
- </c:if>
+ <!-- Unavailables -->
+ <c:if test="${fn:length(cart.unavailables) gt 0}">
-<br/>
+ <div id="store.error" class="alert alert-error"
+ style="display: block;">
+ <s:message code="message.error.shoppingcart.unavailables"
+ text="Some of the item in your shopping cart are as of today unavailable for purchase. Those items will be removed from your shopping cart when the order form is displayed. If you are interested in purchasing this item, please send use a message with the item number, we will get back to you as soon as possible with an update on the availability of the item." />
+ </div>
+ <table>
+ <c:forEach items="${cart.unavailables}" var="unavailable"
+ varStatus="itemStatus">
+ <c:if test="${itemStatus.index eq 0}">
+ <thead>
+ <tr>
+ <th colspan="2" width="65%"> </th>
+ <th colspan="1" width="35%"> </th>
+ </tr>
+ </thead>
+ <tbody>
+ </c:if>
+ <tr>
+ <td width="20%"><c:if test="${unavailable.image!=null}">
+ <img width="60" src="<c:url value="${unavailable.image}"/>">
+ </c:if></td>
-<!-- ******* EX SHOPPING CART **********-->
-
-<table id="mainCartTable" class="table table-hover table-condensed">
+ <td style="border-left: none;"><strong>${unavailable.name}</strong>
+ <c:if test="${fn:length(unavailable.shoppingCartAttributes)>0}">
+ <br />
+ <ul>
+ <c:forEach items="${unavailable.shoppingCartAttributes}"
+ var="option">
+ <li>${option.optionName}- ${option.optionValue}</li>
+ </c:forEach>
+ </ul>
+ </c:if> <br />
+ <s:message code="label.quantity" text="Quantity" />: <c:out
+ value="${unavailable.quantity}" /> <br />
+ <s:message code="label.generic.price" text="Price" />: <c:out
+ value="${unavailable.price}" /></td>
+ <td> </td>
- <c:if test="${not empty cart}">
- <c:choose>
- <c:when test="${not empty cart.shoppingCartItems}">
- <c:forEach items="${cart.shoppingCartItems}" var="shoppingCartItem"
- varStatus="itemStatus">
- <c:if test="${itemStatus.index eq 0}">
- <thead>
- <tr>
- <th><s:message code="label.generic.item.title" text="Item"/></th>
- <th><s:message code="label.quantity" text="Quantity"/></th>
- <th><s:message code="label.generic.price" text="Price"/></th>
- <th><s:message code="label.order.total" text="Total"/></th>
- <th></th>
- </tr>
- </thead>
- <tbody>
- </c:if>
- <form:form action="${updateShoppingCartItemUrl}"
- id="shoppingCartLineitem_${shoppingCartItem.id}">
- <tr>
- <td data-th="<s:message code="label.generic.item.title" text="Item"/>">
- <div class="row-cart">
-
- <div class="col-sm-4 hidden-xs">
- <c:if test="${shoppingCartItem.image!=null}">
- <img width="60" src="<c:url value="${shoppingCartItem.image}"/>" class="">
- </c:if>
- </div>
- <div class="col-sm-8">
- <span class="nomargin"><strong>${shoppingCartItem.name}</strong></span>
-
- <c:if test="${fn:length(shoppingCartItem.shoppingCartAttributes)>0}">
- <p>
- <ul>
- <c:forEach items="${shoppingCartItem.shoppingCartAttributes}" var="option">
- <li>${option.optionName} - ${option.optionValue}</li>
- </c:forEach>
- </ul>
- </p>
- </c:if>
- </div>
- </div>
- </td>
- <td width="10%" data-th="<s:message code="label.quantity" text="Quantity"/>">
-
-<input type="number" class="input-small quantity form-control text-center" value="${shoppingCartItem.quantity}" name="quantity" id="${shoppingCartItem.id}" <c:if test="${shoppingCartItem.productVirtual==true}">readonly</c:if>>
-
- </td>
-
- <td data-th="<s:message code="label.generic.price" text="Price"/>"><strong>${shoppingCartItem.price}</strong></td>
- <td data-th="<s:message code="label.order.total" text="Total"/>" class=""><strong>${shoppingCartItem.subTotal}</strong></td>
-
- <td width="10%" class="actions" data-th="">
-<button type="button" class="btn btn-danger btn-sm" onclick="javascript:updateLineItem('${shoppingCartItem.id}','${removeShoppingCartItemUrl}'); return false;" style="margin-top:0px !important;"><i class="fa fa-trash-o"></i> <s:message code="label.generic.remove" text="Remove"/></button>
-<input type="hidden" name="lineItemId" id="lineItemId" value="${shoppingCartItem.id}"/>
-
- </td>
-
- </tr>
- </form:form>
+ </tr>
+ </c:forEach>
+ </table>
+ <br />
+ </c:if>
+ <br />
- </c:forEach>
- <c:forEach items="${cart.totals}" var="total">
- <tr class="subt" class="hidden-xs">
- <td colspan="2"> </td>
- <td><strong><s:message code="${total.code}" text="label [${total.code}] not found"/></strong></td>
- <td colspan="2"><strong><sm:monetary value="${total.value}" /></strong></td>
- </tr>
- </c:forEach>
- </tbody>
+ <!-- ******* EX SHOPPING CART **********-->
- <tfoot>
+ <table id="mainCartTable" class="table table-hover table-condensed">
+ <c:if test="${not empty cart}">
+ <c:choose>
+ <c:when test="${not empty cart.shoppingCartItems}">
+ <c:forEach items="${cart.shoppingCartItems}"
+ var="shoppingCartItem" varStatus="itemStatus">
+ <c:if test="${itemStatus.index eq 0}">
- <tr>
- <td colspan="3">
+ <thead>
+ <tr>
+ <th><s:message code="label.generic.item.title"
+ text="Item" /></th>
+ <th><s:message code="label.quantity" text="Quantity" /></th>
+ <th><s:message code="label.generic.price" text="Price" /></th>
+ <th><s:message code="label.order.total" text="Total" /></th>
+ <th></th>
-<a href="#" onClick="javascript:updateCart('#mainCartTable');" class="btn btn-regular"><s:message code="label.order.recalculate" text="Racalculate"/></a>
-<a href="<c:url value="/shop"/>" class="btn btn-warning"><i class="fa fa-angle-left"></i> <s:message code="button.label.continue" text="Continue shopping" /></a>
- </td>
- <td colspan="2">
- <button id="checkoutButton" type="submit" class="btn btn-success btn-block"><s:message code="label.cart.placeorder" text="Place your order" /> <i class="fa fa-angle-right"></i></button>
- </td>
+ </tr>
+ </thead>
+ <tbody>
+ </c:if>
+ <form:form action="${updateShoppingCartItemUrl}"
+ id="shoppingCartLineitem_${shoppingCartItem.id}">
+ <tr>
+ <td
+ data-th="<s:message code="label.generic.item.title" text="Item"/>">
+ <div class="row-cart">
+
+ <div class="col-sm-4 hidden-xs">
+ <c:if test="${shoppingCartItem.image!=null}">
+ <img width="60"
+ src="<c:url value="${shoppingCartItem.image}"/>" class="">
+ </c:if>
+ </div>
+ <div class="col-sm-8">
+ <span class="nomargin"><strong>${shoppingCartItem.name}</strong></span>
+
+ <c:if
+ test="${fn:length(shoppingCartItem.shoppingCartAttributes)>0}">
+ <p>
+ <ul>
+ <c:forEach
+ items="${shoppingCartItem.shoppingCartAttributes}"
+ var="option">
+ <li>${option.optionName}- ${option.optionValue}</li>
+ </c:forEach>
+ </ul>
+ </p>
+ </c:if>
+ </div>
+ </div>
+ </td>
+ <td width="10%"
+ data-th="<s:message code="label.quantity" text="Quantity"/>">
+ <input type="number"
+ class="input-small quantity form-control text-center"
+ value="${shoppingCartItem.quantity}" name="quantity"
+ id="${shoppingCartItem.id}"
+ <c:if test="${shoppingCartItem.productVirtual==true}">readonly</c:if>>
+ </td>
+
+ <td
+ data-th="<s:message code="label.generic.price" text="Price"/>"><strong>${shoppingCartItem.price}</strong></td>
+ <td
+ data-th="<s:message code="label.order.total" text="Total"/>"
+ class=""><strong>${shoppingCartItem.subTotal}</strong></td>
+
+ <td width="10%" class="actions" data-th="">
+ <button type="button" class="btn btn-danger btn-sm"
+ onclick="javascript:updateLineItem('${shoppingCartItem.id}','${removeShoppingCartItemUrl}'); return false;"
+ style="margin-top: 0px !important;">
+ <i class="fa fa-trash-o"></i>
+ <s:message code="label.generic.remove" text="Remove" />
+ </button> <input type="hidden" name="lineItemId" id="lineItemId"
+ value="${shoppingCartItem.id}" />
+ </td>
+
+ </tr>
+ </form:form>
+
+
+ </c:forEach>
+ <c:forEach items="${cart.totals}" var="total">
+ <tr class="subt" class="hidden-xs">
+ <td colspan="2"> </td>
+ <td><strong><s:message code="${total.code}"
+ text="label [${total.code}] not found" /></strong></td>
+ <td colspan="2"><strong><sm:monetary
+ value="${total.value}" /></strong></td>
+ </tr>
+ </c:forEach>
+
+
+
+ </tbody>
+
+ <tfoot>
+
+ <tr>
+ <td colspan="3"><a href="#"
+ onClick="javascript:updateCart('#mainCartTable');"
+ class="btn btn-regular"><s:message
+ code="label.order.recalculate" text="Racalculate" /></a> <a
+ href="<c:url value="/shop"/>" class="btn btn-warning"><i
+ class="fa fa-angle-left"></i> <s:message
+ code="button.label.continue" text="Continue shopping" /></a></td>
+ <td colspan="2">
+ <button id="checkoutButton" type="submit"
+ class="btn btn-success btn-block">
+ <s:message code="label.cart.placeorder"
+ text="Place your order" />
+ <i class="fa fa-angle-right"></i>
+ </button>
+ </td>
+ </tr>
+ </tfoot>
+
+ </c:when>
+ <c:otherwise>
+ <tr>
+ <td><s:message code="cart.empty"
+ text="Your Shopping cart is empty" /></td>
</tr>
- </tfoot>
-
- </c:when>
- <c:otherwise>
- <tr><td><s:message code="cart.empty" text="Your Shopping cart is empty" /></td></tr>
- </c:otherwise>
- </c:choose>
- </c:if>
+ </c:otherwise>
+ </c:choose>
+ </c:if>
-</table>
+ </table>
-<!-- ******* EX SHOPPING CART *********** -->
+ <!-- ******* EX SHOPPING CART *********** -->
-</div>
+ </div>
</div>
<c:if test="${empty cart}">
-<!-- load cart with cookie -->
-<script>
- $(document).ready(function(){
- var cartCode=getCartCode();
- if(cartCode!=null) {
- console.log('cart code ' + cartCode);
- location.href='<c:url value="/shop/cart/shoppingCartByCode" />?shoppingCartCode=' + cartCode;
- }
-
- });
-</script>
+ <!-- load cart with cookie -->
+ <script>
+ $(document)
+ .ready(
+ function() {
+ var cartCode = getCartCode();
+ if (cartCode != null) {
+ console.log('cart code ' + cartCode);
+ location.href = '<c:url value="/shop/cart/shoppingCartByCode" />?shoppingCartCode='
+ + cartCode;
+ }
+
+ });
+ </script>
</c:if>
<script>
diff --git a/sm-shop/src/main/webapp/pages/shop/common/cart/minicart.jsp b/sm-shop/src/main/webapp/pages/shop/common/cart/minicart.jsp
index fcad048..c50e748 100644
--- a/sm-shop/src/main/webapp/pages/shop/common/cart/minicart.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/common/cart/minicart.jsp
@@ -1,35 +1,35 @@
-
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm"%>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-
-
-
-<div class="cartbox" id="cart-box">
- <div class="box-content clearfix">
- <p id="shoppingcarttitle" class="lbw"><s:message code="label.cart" text="Shopping cart"/></p>
- <br />
- <div id="cartShowLoading" class="loading-indicator" style="width:100%;display:none;"></div>
- <div id="cartMessage" style="width:100%;display:none;"></div>
- <div id="shoppingcart">
- <table style="margin-bottom: 5px" class="table miniCartBox">
- <tbody id="shoppingcartProducts"><!-- products place holder -->
- </tbody>
- </table>
- <div id="total-box" class="total-box"></div><!-- totals place holder -->
- <button class="btn btn-large checkoutButton" style="width: 100%" type="button" onclick="viewShoppingCartPage();"><s:message code="label.checkout" text="Checkout"/></button>
- </div>
- </div>
+
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm"%>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+
+
+<div class="cartbox" id="cart-box">
+ <div class="box-content clearfix">
+ <p id="shoppingcarttitle" class="lbw"><s:message code="label.cart" text="Shopping cart"/></p>
+ <br />
+ <div id="cartShowLoading" class="loading-indicator" style="width:100%;display:none;"></div>
+ <div id="cartMessage" style="width:100%;display:none;"></div>
+ <div id="shoppingcart">
+ <table style="margin-bottom: 5px" class="table miniCartBox">
+ <tbody id="shoppingcartProducts"><!-- products place holder -->
+ </tbody>
+ </table>
+ <div id="total-box" class="total-box"></div><!-- totals place holder -->
+ <button class="btn btn-large checkoutButton" style="width: 100%" type="button" onclick="viewShoppingCartPage();"><s:message code="label.checkout" text="Checkout"/></button>
+ </div>
+ </div>
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/common/cart/minicartinfo.jsp b/sm-shop/src/main/webapp/pages/shop/common/cart/minicartinfo.jsp
index 0f16b49..f3960e3 100644
--- a/sm-shop/src/main/webapp/pages/shop/common/cart/minicartinfo.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/common/cart/minicartinfo.jsp
@@ -1,12 +1,12 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
- <!-- display is ajax driven -->
- <span id="cartinfo">
- <span id="cartqty">(0 <s:message code="label.generic.item" text="item" />)</span><span id="cartprice"></span>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+ <!-- display is ajax driven -->
+ <span id="cartinfo">
+ <span id="cartqty">(0 <s:message code="label.generic.item" text="item" />)</span><span id="cartprice"></span>
</span>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/common/catalog/addToCartProduct.jsp b/sm-shop/src/main/webapp/pages/shop/common/catalog/addToCartProduct.jsp
index 8fefea3..f57a502 100644
--- a/sm-shop/src/main/webapp/pages/shop/common/catalog/addToCartProduct.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/common/catalog/addToCartProduct.jsp
@@ -25,6 +25,11 @@ $(function(){
</script>
+ <c:set var="SKU" value="product_${product.sku}" scope="request" />
+ <c:if test="${requestScope.CONTENT[SKU]!=null}">
+ <sm:pageContent contentCode="${SKU}"/>
+ </c:if>
+
<!-- leave the form id as is -->
<form id="input-<c:out value="${product.id}" />">
@@ -48,7 +53,7 @@ $(function(){
<img src="<c:url value="${optionValue.image}"/>" height="40">
</c:if>
<input type="radio" class="attribute" id="${status.index}" name="${status.index}" value="<c:out value="${optionValue.id}"/>" <c:if test="${optionValue.defaultAttribute==true}"> checked="checked" </c:if> />
- <c:out value="${optionValue.name}"/><c:if test="${optionValue.price!=null}"> <c:out value="${optionValue.price}"/></c:if><br/>
+ <c:out value="${optionValue.name}"/><c:if test="${optionValue.price!=null}"> (<c:out value="${optionValue.price}"/>)</c:if><br/>
</c:forEach>
</c:when>
<c:when test="${option.type=='text'}">
@@ -60,7 +65,7 @@ $(function(){
<img src="<c:url value="${optionValue.image}"/>" height="40">
</c:if>
<input type="checkbox" class="attribute" id="${status.index}" name="${status.index}" value="<c:out value="${optionValue.id}"/>"<c:if test="${optionValue.defaultAttribute==true}"> checked="checked" </c:if> />
- <c:out value="${optionValue.name}"/><c:if test="${optionValue.price!=null}"> <c:out value="${optionValue.price}"/></c:if><br/>
+ <c:out value="${optionValue.name}"/><c:if test="${optionValue.price!=null}"> (<c:out value="${optionValue.price}"/>)</c:if><br/>
</c:forEach>
</c:when>
</c:choose>
diff --git a/sm-shop/src/main/webapp/pages/shop/common/checkout/braintree.jsp b/sm-shop/src/main/webapp/pages/shop/common/checkout/braintree.jsp
new file mode 100644
index 0000000..acc0ecb
--- /dev/null
+++ b/sm-shop/src/main/webapp/pages/shop/common/checkout/braintree.jsp
@@ -0,0 +1,396 @@
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+<style>
+/* Uses Bootstrap stylesheets for styling, see linked CSS*/
+body {
+ background-color: #fff;
+}
+
+.panel {
+ width: 80%;
+ margin: 2em auto;
+}
+
+.bootstrap-basic {
+ background: white;
+}
+
+.panel-body {
+ width: 90%;
+ margin: 2em auto;
+}
+
+.helper-text {
+ color: #8A6D3B;
+ font-size: 12px;
+ margin-top: 5px;
+ height: 12px;
+ display: block;
+}
+
+/* Braintree Hosted Fields styling classes*/
+.braintree-hosted-fields-focused {
+ border: 1px solid #0275d8;
+ box-shadow: inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);
+}
+
+
+.braintree-hosted-invalid {
+ /*border: 1px solid #ff0000 !important;*/
+ box-shadow: inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(100,100,0,.6);
+}
+
+.braintree-hosted-fields-focused.focused-invalid {
+ border: 1px solid #ff0000 !important;
+ box-shadow: inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(100,100,0,.6);
+}
+
+@media (max-width: 670px) {
+ .btn {
+ white-space: normal;
+ }
+}
+</style>
+
+<script type="text/javascript">
+
+function populateData(div, data, defaultValue) {
+ $.each(data, function() {
+ div.append($('<option/>').val(this).text(this));
+ });
+ if(defaultValue && (defaultValue!=null && defaultValue!='')) {
+ div.val(defaultValue);
+ }
+}
+
+</script>
+
+ <script src="<c:url value="/resources/js/jquery.creditCardValidator.js" />"></script>
+
+ <script>$.ajax({url: "<c:url value="/shop/reference/creditCardDates.html"/>",type: "GET",success: function(data){populateData($('#expiration-year-select'), data, '${order.payment['creditcard_card_expirationyear']}'); }})</script>
+ <script>$.ajax({url: "<c:url value="/shop/reference/monthsOfYear.html"/>",type: "GET",success: function(data){populateData($('#expiration-month-select'),data, '${order.payment['creditcard_card_expirationmonth']}'); }})</script>
+
+
+ <script src="https://js.braintreegateway.com/web/3.27.0/js/client.min.js"></script>
+ <script src="https://js.braintreegateway.com/web/3.27.0/js/hosted-fields.min.js"></script>
+
+
+ <!--<div style="display:none;">-->
+ <!-- Bootstrap inspired Braintree Hosted Fields example -->
+ <div id="creditCardBoxBraintree" class="panel panel-default bootstrap-basic credit-card-box-v2">
+ <form class="panel-body">
+ <div class="row" style="margin-left:15px !important;margin-right:5px !important;margin-top:15px !important;margin-bottom:15px !important">
+ <div class="panel-heading display-table">
+ <img class="img-responsive pull-right cc-image"
+ src="<c:url value="/resources/img/payment/icons/american-express-straight-32px.png"/>">
+ <img class="img-responsive pull-right cc-image"
+ src="<c:url value="/resources/img/payment/icons/mastercard-straight-32px.png"/>">
+ <img class="img-responsive pull-right cc-image"
+ src="<c:url value="/resources/img/payment/icons/visa-straight-32px.png"/>">
+ </div>
+ </div>
+ <div class="row" style="margin-left:5px !important;margin-right:5px !important;margin-top:15px !important;margin-bottom: 0px !important">
+ <div class="form-group col-sm-12">
+ <label for="cardNumber"><s:message
+ code="label.payment.creditcard.cardnumber"
+ text="Card number" /><span class="required">*</span></label>
+ <s:message code="NotEmpty.order.creditcard.cardnumber"
+ text="Card number is required"
+ var="msgCardNumber" />
+ <!-- Hosted Fields div container -->
+ <div class="form-control" id="creditcard_card_number" name="payment['creditcard_card_number']" autocomplete="off"></div>
+ <span class="helper-text"></span>
+ </div>
+ </div>
+ <div class="row" style="margin-left:5px !important;margin-right:5px !important;margin-top:0px !important;margin-bottom:0px !important">
+ <div class="form-group col-sm-6">
+ <!-- Hosted Fields div container -->
+ <label for="expiryMonth"><s:message
+ code="label.payment.creditcard.cardexpiry.month"
+ text="Card expiry month" /><span class="required">*</span></label>
+ <!--<select id="expiration-month-select" name="payment['creditcard_card_expirationmonth']" class="input-small form-control form-control-25"></select>-->
+ <div class="form-control" id="expiration-month" style=""></div>
+ <span class="helper-text"></span>
+ </div>
+ <div class="form-group col-sm-6">
+ <!-- Hosted Fields div container -->
+ <label for="expiryYear"><s:message
+ code="label.payment.creditcard.cardexpiry.year"
+ text="Card expiry year" /><span class="required">*</span></label>
+ <!--<select id="expiration-year-select" name="payment['creditcard_card_expirationyear']" class="input-medium form-control form-control"></select>-->
+ <div class="form-control" id="expiration-year" style=""></div>
+ <span class="helper-text"></span>
+ </div>
+ </div>
+ <div class="row" style="margin-left:5px !important;margin-right:5px !important;margin-top:0px !important;margin-bottom:0px !important">
+ <div class="form-group col-sm-6">
+ <label class="control-label"><s:message code="label.payment.creditcard.cardcvv" text="Card validation number" /></label>
+ <s:message code="NotEmpty.order.creditcard.cvv" text="Credit card validation digit is required" var="msgCardCvv"/>
+ <!-- Hosted Fields div container -->
+ <div class="form-control" id="cvv" name="payment['creditcard_card_cvv']"></div>
+ </div>
+ <div class="form-group col-sm-6">
+ <label class="control-label"><s:message code="label.generic.postalcode" text="Card owner postal code" /></label>
+ <!-- Hosted Fields div container -->
+ <div class="form-control" id="postal-code"></div>
+ </div>
+ </div>
+
+
+<%-- <button value="submit" style="margin-bottom:0px !important" id="submit" class="btn btn-success btn-lg center-block">Pay with <span id="card-type">Card</span></button>
+ <br/> --%>
+ </form>
+
+ </div>
+ <!--</div>-->
+
+
+ <script type="text/javascript">
+ var hfInstance = null;
+ var client = null;
+
+ $( document ).ready(function() {
+ <!-- replace generic payment box -->
+ //$( "#creditCardBox" ).replaceWith( $( "#creditCardBoxBraintree" ) );
+
+ var $form = $('#checkoutForm');
+
+ $form.find('button').prop('disabled', false);
+
+ braintree.client.create({
+ authorization: '<c:out value="${requestScope.paymentMethod.informations.integrationKeys['tokenization_key']}" escapeXml="false"/>'
+ }, function (err, clientInstance) {
+ if (err) {
+ console.error(err);
+ return;
+ }
+ client = clientInstance;
+ braintree.hostedFields.create({
+ client: clientInstance,
+ styles: {
+ 'input': {
+ 'font-size': '14px',
+ 'font-family': 'helvetica, tahoma, calibri, sans-serif',
+ 'color': '#3a3a3a'
+ },
+ ':focus': {
+ 'color': 'black'
+ }
+ },
+ fields: {
+ number: {
+ selector: '#creditcard_card_number',
+ placeholder: ''
+ },
+ cvv: {
+ selector: '#cvv',
+ placeholder: ''
+ },
+ expirationMonth: {
+ selector: '#expiration-month',
+ placeholder: 'MM'
+ },
+ expirationYear: {
+ selector: '#expiration-year',
+ placeholder: 'YY'
+ },
+ postalCode: {
+ selector: '#postal-code',
+ placeholder: ''
+ }
+ }
+ }, function (err, hostedFieldsInstance) {
+ if (err) {
+ console.error(err);
+ return;
+ }
+
+ hfInstance = hostedFieldsInstance;
+
+ //$('#expiration-year').val($('#expiration-year-select').val().substring(2, 4));
+ //$('#expiration-month').val($('#expiration-month-select').val());
+
+ //console.log('CC expiry year ' + $('#expiration-year').val());
+ //console.log('CC expiry month ' + $('#expiration-month').val());
+
+ hostedFieldsInstance.on('validityChange', function (event) {
+ var field = event.fields[event.emittedBy];
+ $form.find('button').prop('disabled', false);
+ //console.log('Validity change ' + event.emittedBy);
+ if (field.isValid) {
+ console.log('Field valid ' + event.emittedBy);
+ if (event.emittedBy === 'expirationMonth' || event.emittedBy === 'expirationYear') {
+ console.log('Field type ' + event.emittedBy);
+ if (!event.fields.expirationMonth.isValid || !event.fields.expirationYear.isValid) {
+ return;
+ }
+ } else if (event.emittedBy === 'number') {
+ $('#creditcard_card_number').next('span').text('');
+ } else {
+ console.log(event.emittedBy);
+ }
+
+ // Remove any previously applied error or warning classes
+ $(field.container).parents('.form-group').removeClass('has-warning');
+ $(field.container).parents('.form-group').removeClass('has-success');
+ // Apply styling for a valid field
+ $(field.container).parents('.form-group').addClass('has-success');
+ } else if (field.isPotentiallyValid) {
+ // Remove styling from potentially valid fields
+ $(field.container).parents('.form-group').removeClass('has-warning');
+ $(field.container).parents('.form-group').removeClass('has-success');
+ if (event.emittedBy === 'number') {
+ $('#creditcard_card_number').next('span').text('');
+ }
+ if (event.emittedBy === 'expirationMonth') {
+ $('#expiration-month').next('span').text('');
+ }
+ if (event.emittedBy === 'expirationYear') {
+ $('#expiration-year').next('span').text('');
+ }
+ } else {
+ console.log('Field invalid ' + event.emittedBy);
+ // Add styling to invalid fields
+ $(field.container).parents('.form-group').addClass('has-warning');
+ if (event.emittedBy === 'expirationMonth') {
+ $form.find('button').prop('disabled', true);
+ $('#expiration-month').next('span').text(getOrderValidationMessage('invalid_expiry_month'));
+
+ }
+ if (event.emittedBy === 'expirationYear') {
+ $form.find('button').prop('disabled', true);
+ $('#expiration-year').next('span').text(getOrderValidationMessage('invalid_expiry_year'));
+ }
+ // Add helper text for an invalid card number
+ if (event.emittedBy === 'number') {
+ $form.find('button').prop('disabled', true);
+ $('#creditcard_card_number').next('span').text(getOrderValidationMessage('invalid_number'));
+ }
+ }
+
+ //$('#expiration-year').val($('#expiration-year-select').val().substring(2, 4));
+ //$('#expiration-month').val($('#expiration-month-select').val());
+
+ //console.log('CC expiry year ' + $('#expiration-year').val());
+ //console.log('CC expiry month ' + $('#expiration-month').val());
+
+ });
+
+ hostedFieldsInstance.on('cardTypeChange', function (event) {
+ // Handle a field's change, such as a change in validity or credit card type
+ if (event.cards.length === 1) {
+ $('#card-type').text(event.cards[0].niceType);
+ } else {
+ $('#card-type').text('Card');
+ }
+
+ //$('#expiration-year').val($('#expiration-year-select').val().substring(2, 4));
+ //$('#expiration-month').val($('#expiration-month-select').val());
+
+ //console.log('CC expiry year ' + $('#expiration-year').val());
+ //console.log('CC expiry month ' + $('#expiration-month').val());
+
+ });
+
+/* $('#expiration-year-select').on('change', function() {
+ var $option = $(this).find('option:selected');
+ var value = $option.val();
+ $('#expiration-year').val(value);
+ $('#expiration-month').val($('#expiration-month-select').val());
+
+ console.log('CC expiry year ' + $('#expiration-year').val());
+ console.log('CC expiry month ' + $('#expiration-month').val());
+ }) */
+
+/* $('#expiration-month-select').on('change', function() {
+ var $option = $(this).find('option:selected');
+ var value = $option.val();
+ $('#expiration-year').val($('#expiration-year-select').val().substring(2, 4));
+ $('#expiration-month').val(value);
+
+ console.log('CC expiry year ' + $('#expiration-year').val());
+ console.log('CC expiry month ' + $('#expiration-month').val());
+ }) */
+
+/* $('#submit').submit(function (event) {
+ event.preventDefault();
+ hostedFieldsInstance.tokenize(function (err, payload) {
+ if (err) {
+ $form.find('button').prop('disabled', false);
+ alert('Error ' + err);
+ log(err);
+ return;
+ }
+
+ var token = payload.nonce;
+ // Insert the token into the form so it gets submitted to the server
+ var tokenField = '<input type="hidden" name="payment[\'paymentToken\']" value="' + token +'" /><input type="hidden" name="payment[\'null_creditcard\']" value="null_creditcard"/>';
+ $form.append(tokenField);
+ log(tokenField);
+ alert('PaymentToken ' + token);
+ // and submit
+ //$form.get(0).submit();
+
+ // This is where you would submit payload.nonce to your server
+ //alert('Submit your nonce to your server here!');
+ });
+ }); */
+ });
+ });
+ });
+
+ function initBraintreePayment(div, data, defaultValue) {
+
+ var $form = $('#checkoutForm');
+ $form.find('button').prop('disabled', true);
+ //console.log('expiryMonth ' + $('.expirationMonth').val());
+ // console.log('expiryYear ' + $('.expirationYear').val());
+ hfInstance.tokenize(function (err, payload) {
+ if (err) {
+ hideSMLoading('#pageContainer');
+ console.log(err.message);
+ showResponseErrorMessage(getOrderValidationMessage('error_creditcard'));
+ $form.find('button').prop('disabled', false);
+ log(err);
+ return;
+ }
+
+ var token = payload.nonce;
+ // Insert the token into the form so it gets submitted to the server
+ var tokenField = '<input type="hidden" name="payment[\'paymentToken\']" value="' + token +'" /><input type="hidden" name="payment[\'null_creditcard\']" value="null_creditcard"/>';
+ $form.append(tokenField);
+ log(tokenField);
+ //alert('PaymentToken ' + token);
+ // and submit
+ hideSMLoading('#pageContainer');
+ $form.submit();
+ });
+
+ }
+
+
+ </script>
+
+
+ <div class="control-group">
+ <label class="control-label"><s:message code="label.payment.creditcard.usecredicard" text="Use Credit Card"/></label>
+ <div class="controls">
+ <jsp:include page="/pages/shop/common/checkout/selectedPayment.jsp" />
+ </div>
+ </div>
+
+
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/common/checkout/checkout.jsp b/sm-shop/src/main/webapp/pages/shop/common/checkout/checkout.jsp
index db69fc9..6942ccc 100644
--- a/sm-shop/src/main/webapp/pages/shop/common/checkout/checkout.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/common/checkout/checkout.jsp
@@ -19,6 +19,8 @@ response.setDateHeader ("Expires", -1);
<script src="https://maps.googleapis.com/maps/api/js?key=<sm:config configurationCode="shopizer.googlemaps_key" />"></script>
</c:if>
+<c:set var="creditCardInformationsPage" value="creditCardInformations" scope="request" />
+
<script src="<c:url value="/resources/js/jquery.maskedinput.min.js" />"></script>
@@ -37,7 +39,7 @@ response.setDateHeader ("Expires", -1);
<span class="total-box-grand-total">
<font class="total-box-label">
<s:message code="order.total.total" text="Total"/>
- <font class="total-box-price">{{grandTotal}}</font>
+ <font class="total-box-price grand-total">{{grandTotal}}</font>
</font>
</span>
</script>
@@ -122,6 +124,7 @@ function isFormValid() {
var firstErrorMessage = null;
$inputs.each(function() {
if($(this).hasClass('required')) {
+ console.log('Before ischecout field valid');
var fieldValid = isCheckoutFieldValid($(this));
//log($(this).attr('id') + ' Is valid ' + fieldValid);
if(!fieldValid) {
@@ -188,7 +191,10 @@ function setPaymentModule(module) {
}
else if(module.indexOf('beanstream') >= 0) {
$('#paymentMethodType').val('CREDITCARD');
-
+ }
+ else if(module.indexOf('braintree') >= 0) {
+ $('#paymentMethodType').val('CREDITCARD');
+ console.log('TYPE ' + $('#paymentMethodType').val());
} else {
pType = pType.toUpperCase();
console.log('Other type - ' + pType);
@@ -201,6 +207,8 @@ function setPaymentModule(module) {
}
function isCheckoutFieldValid(field) {
+
+ console.log('Entering is checkout valid');
var validateField = true;
var fieldId = field.prop('id');
var value = field.val();
@@ -228,11 +236,13 @@ function isCheckoutFieldValid(field) {
var paymentType = $('input[name=paymentMethodType]').val();
console.log('Payment Method Type ' + paymentType);
if(paymentType=='CREDITCARD') {
+ console.log(paymentType);
+ console.log(fieldId);
if (fieldId.indexOf("creditcard") >= 0) {
- if(fieldId!='creditcard_card_number') {
+ if(fieldId!='creditcard_card_number' || fieldId!='creditcard-card-number') {
validateField = true;// but validate credit card fields when credit card is selected
}
- if(fieldId=='creditcard_card_number') {
+ if(fieldId=='creditcard_card_number' || fieldId=='creditcard-card-number') {
return isCreditCardValid();// validate credit card number differently
}
}
@@ -347,7 +357,6 @@ function getZones(listDiv, textDiv, countryCode, defaultValue, callBackFunction)
}
});
-
}
@@ -470,7 +479,13 @@ function bindActions() {
//console.log('Stripe ');
$('#paymentMethodType').val('CREDITCARD');
initStripePayment();
- }
+ }
+ else if(paymentSelection.indexOf('braintree') >= 0) {
+ //console.log('Braintree ');
+ $('#paymentMethodType').val('CREDITCARD');
+ console.log('Set payment method type ' + $('#paymentMethodType').val());
+ initBraintreePayment();
+ }
else if(paymentSelection.indexOf('beanstream') >= 0) {
//console.log('Beanstream ');
$('#paymentMethodType').val('CREDITCARD');
@@ -673,13 +688,18 @@ function validateConfirmShipping(shopOrder) {
}
function displayConfirmShipping(delivery,shippingMethod) {
+
+ /**
+ * Requires this div in the form
+ * <div class="checkout-box" id="confirmShippingAddress" style="height:250px;"></div>
+ *
+ **/
var $form = $('#checkoutForm');
$('#confirm_address').remove();
$("#confirmShippingAddress").hide();
var deliveryAddress = buildMailAddress(delivery);
- //alert('Use distance: ' + useDistanceWindow + ' lat: ' + delivery.latitude + ' lon: ' + delivery.longitude + ' postal code: ' + delivery.postalCode + ' shipping method: ' + shippingMethod);
-
+
/**
* quote =! storePickup
* postal code
@@ -724,15 +744,6 @@ function displayConfirmShipping(delivery,shippingMethod) {
// To add the marker to the map, call setMap();
marker.setMap(map);
-
-
-
- //var map;
- //function initMap() {
- //map = new google.maps.Map(document.getElementById('confirmShippingAddress'), {
- // center: {lat: lat, lng: lon},
- // zoom: 18
- //});
$("#confirmShippingAddress").show();
}
@@ -939,7 +950,7 @@ $(document).ready(function() {
<label><s:message code="label.generic.firstname" text="First Name"/></label>
<div class="controls">
<s:message code="NotEmpty.customer.firstName" text="First name is required" var="msgFirstName"/>
- <form:input id="customer.firstName" cssClass="input-large required form-control form-control-lg" path="customer.billing.firstName" title="${msgFirstName}"/>
+ <form:input id="customer.firstName" cssClass="input-large required form-control form-control-lg" path="customer.billing.firstName" autofocus="autofocus" title="${msgFirstName}"/>
<form:errors path="customer.billing.firstName" cssClass="error" />
<span id="error-customer.billing.firstName" class="error"></span>
</div>
@@ -1274,11 +1285,6 @@ $(document).ready(function() {
<!-- Confirm address box box -->
<!-- Shipping -->
<div class="checkout-box" id="confirmShippingAddress" style="height:250px;">
- <!--
- <span class="box-title">
- <p class="p-title"><s:message code="label.customer.confirmshippingaddress" text="Shipping address confirmation" /> </p>
- </span>
- -->
</div>
<!-- end confirm shipping box -->
<br/>
@@ -1337,7 +1343,7 @@ $(document).ready(function() {
<!-- exception for stripe which has it's own page -->
<c:choose>
- <c:when test="${paymentMethod.paymentMethodCode=='stripe'}">
+ <c:when test="${(paymentMethod.paymentMethodCode=='stripe') or (paymentMethod.paymentMethodCode=='braintree')}">
<c:set var="pageName" value="${fn:toLowerCase(paymentMethod.paymentMethodCode)}" />
</c:when>
<c:otherwise>
@@ -1428,7 +1434,7 @@ $(document).ready(function() {
<span class="total-box-grand-total">
<font class="total-box-label">
<s:message code="order.total.total" text="Total"/>
- <font class="total-box-price"><sm:monetary value="${order.orderTotalSummary.total}"/></font>
+ <font class="total-box-price grand-total"><sm:monetary value="${order.orderTotalSummary.total}"/></font>
</font>
</span>
</div>
diff --git a/sm-shop/src/main/webapp/pages/shop/common/checkout/creditcard.jsp b/sm-shop/src/main/webapp/pages/shop/common/checkout/creditcard.jsp
index 0ef38c2..21c2d65 100644
--- a/sm-shop/src/main/webapp/pages/shop/common/checkout/creditcard.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/common/checkout/creditcard.jsp
@@ -14,8 +14,6 @@ response.setDateHeader ("Expires", -1);
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
-
-
<div class="control-group">
<label class="control-label"><s:message code="label.payment.creditcard.usecredicard" text="Use your credit card" /></label>
<div class="controls">
@@ -23,4 +21,4 @@ response.setDateHeader ("Expires", -1);
</div>
</div>
- <jsp:include page="/pages/shop/common/checkout/creditCardInformations.jsp" />
\ No newline at end of file
+ <jsp:include page="/pages/shop/common/checkout/${creditCardInformationsPage}.jsp" />
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/common/checkout/creditCardInformations.jsp b/sm-shop/src/main/webapp/pages/shop/common/checkout/creditCardInformations.jsp
index 4d83b64..3d32616 100644
--- a/sm-shop/src/main/webapp/pages/shop/common/checkout/creditCardInformations.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/common/checkout/creditCardInformations.jsp
@@ -80,7 +80,7 @@ response.setDateHeader ("Expires", -1);
</script>
-
+ <div class="payment-method-box" id="creditCardBox">
<div class="control-group">
<label class="control-label"><s:message code="label.payment.creditcard.cardowner" text="Card Holder's Name" /></label>
<div class="controls">
@@ -130,5 +130,6 @@ response.setDateHeader ("Expires", -1);
</div>
</div>
</div>
+ </div>
<input type="hidden" name="payment['creditcard_card_type']" id="creditcard_type" value="" />
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/common/checkout/creditCardInformations-v2.jsp b/sm-shop/src/main/webapp/pages/shop/common/checkout/creditCardInformations-v2.jsp
new file mode 100644
index 0000000..f0ab62f
--- /dev/null
+++ b/sm-shop/src/main/webapp/pages/shop/common/checkout/creditCardInformations-v2.jsp
@@ -0,0 +1,186 @@
+
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
+<%@ taglib uri="http://www.springframework.org/security/tags"
+ prefix="sec"%>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+<script
+ src="<c:url value="/resources/js/jquery.creditCardValidator.js" />"></script>
+
+<script>$.ajax({url: "<c:url value="/shop/reference/creditCardDates.html"/>",type: "GET",success: function(data){populateData($('#creditCardYears'), data, '${order.payment['creditcard_card_expirationyear']}'); }})</script>
+<script>$.ajax({url: "<c:url value="/shop/reference/monthsOfYear.html"/>",type: "GET",success: function(data){populateData($('#creditCardDays'),data, '${order.payment['creditcard_card_expirationmonth']}'); }})</script>
+
+<script type="text/javascript">
+
+ var img = '<img src="<c:url value="/resources/img/cvv.jpg"/>" width="180">';
+ var ccValid = false;
+
+
+ $(document).ready(function() {
+ $("#cvvImage").popover({ title: '<s:message code="label.payment.creditcard.cardcvv" text="Card validation number" />', content: img, html: true });
+ var creditCardDiv = '#creditcard_card_number';
+ //set to invalid by default
+ invalidCreditCardNumber(creditCardDiv);
+ $(creditCardDiv).validateCreditCard(function(result) {
+ invalidCreditCardNumber(creditCardDiv);
+ if(result.card_type!=null) {
+ log('CC type: ' + result.card_type.name
+ + '\nLength validation: ' + result.length_valid
+ + '\nLuhn validation: + result.luhn_valid');
+ if(result.luhn_valid==true && result.length_valid==true) {
+ validCreditCardNumber(creditCardDiv, result);
+ } else {
+ invalidCreditCardNumber(creditCardDiv);
+ }
+ } else {
+ invalidCreditCardNumber(creditCardDiv);
+ }
+ },
+ { accept: ['visa', 'mastercard', 'amex'] }
+
+ );
+
+ })
+
+ function invalidCreditCardNumber(div) {
+ $('#creditcard_card_image').html('<i class="fa fa-credit-card"></i>');
+ $(div).removeClass("valid");
+ $(div).css('background-color', '#FFC');
+ ccValid = false;
+ }
+
+ function validCreditCardNumber(div, creditCard) {
+ $(div).addClass("valid");
+ $(div).css('background-color', '#FFF');
+ $('#creditcard_type').val(creditCard.card_type.name);
+ $('#creditcard_card_image').html('<img src="<c:url value="/resources/img/payment/icons/'+ creditCard.card_type.name +'-straight-32px.png" />"/>');
+ ccValid = true;
+ }
+
+ function isCreditCardValid() {
+ return ccValid;
+ }
+
+ function populateData(div, data, defaultValue) {
+ $.each(data, function() {
+ div.append($('<option/>').val(this).text(this));
+ });
+ if(defaultValue && (defaultValue!=null && defaultValue!='')) {
+ div.val(defaultValue);
+ }
+ }
+
+ </script>
+
+
+<!-- CREDIT CARD FORM STARTS HERE -->
+<div id="creditCardBox" class="panel panel-default credit-card-box-v2">
+ <div class="panel-heading display-table">
+ <img class="img-responsive pull-right cc-image"
+ src="<c:url value="/resources/img/payment/icons/american-express-straight-32px.png"/>">
+ <img class="img-responsive pull-right cc-image"
+ src="<c:url value="/resources/img/payment/icons/mastercard-straight-32px.png"/>">
+ <img class="img-responsive pull-right cc-image"
+ src="<c:url value="/resources/img/payment/icons/visa-straight-32px.png"/>">
+ </div>
+ <div class="panel-body panel-body-creditcard-v2">
+ <form role="form" id="payment-form">
+ <div class="row">
+ <div class="col-md-12">
+ <div class="checkout-form-list">
+ <label for="cardNumber"><s:message
+ code="label.payment.creditcard.cardowner"
+ text="Card Holder's Name" /><span class="required">*</span></label>
+ <s:message code="NotEmpty.order.creditcard.name"
+ text="Credit card holder's name is required"
+ var="msgCardHolderName" />
+ <input type="text" id="creditcard_card_holder"
+ name="payment['creditcard_card_holder']"
+ class="required form-control form-control-100"
+ title="${msgCardHolderName}"
+ value="${order.payment['creditcard_card_holder']}">
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-md-12">
+ <div class="checkout-form-list">
+ <label class="control-label"><s:message
+ code="label.payment.creditcard.cardnumber" text="Card number" /><span class="required">*</span></label>
+ <div class="input-group">
+ <s:message code="NotEmpty.order.creditcard.number"
+ text="A valid credit card number is required"
+ var="msgCardNumber" />
+ <input id="creditcard_card_number" creditcard_card_number" type="text"
+ class="form-control required"
+ name="payment['creditcard_card_number']"
+ title="${msgCardNumber}" autocomplete="off" data-stripe="number" required />
+ <span id="creditcard_card_image" class="input-group-addon">
+ <!--<i class="fa fa-credit-card"></i>-->
+ </span>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+
+ <div class="col-md-12">
+ <div class="checkout-form-list">
+ <label class="control-label"><s:message
+ code="label.payment.creditcard.cardexpiry"
+ text="Card expiry year" /><span class="required">*</span></label>
+ <div class="col-xs-4 no-padding-left">
+ <select id="creditCardDays"
+ name="payment['creditcard_card_expirationmonth']"
+ class="input-large form-control width-75"
+ data-stripe="exp-month"></select>
+ </div>
+ <div class="col-xs-4 no-padding-left">
+ <select id="creditCardYears"
+ name="payment['creditcard_card_expirationyear']"
+ class="input-large form-control width-75" data-stripe="exp-year"></select>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row margin-top-30">
+ <div class="col-md-12">
+ <div class="checkout-form-list">
+ <label class="control-label"><s:message
+ code="label.payment.creditcard.cardcvv"
+ text="Card validation number" /><span class="required">*</span></label>
+ <s:message code="NotEmpty.order.creditcard.cvv"
+ text="Credit card validation digit is required" var="msgCardCvv" />
+ <input type="text" id="creditcard_card_cvv"
+ name="payment['creditcard_card_cvv']"
+ class="required form-control form-control-25"
+ autocomplete="off" maxlength="3" pattern="\d{3}"
+ title="${msgCardCvv}" data-stripe="cvc">
+ <a href="#!" id="cvvImage" rel="popover">
+ <label class="control-label">
+ <s:message code="label.payment.creditcard.whatiscvv" text="What is a credit card validation number?" />
+ </label>
+ </a>
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
+</div>
+<!-- CREDIT CARD FORM ENDS HERE -->
+
+
+<input type="hidden" name="payment['creditcard_card_type']"
+ id="creditcard_type" value="" />
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/common/checkout/moneyorder.jsp b/sm-shop/src/main/webapp/pages/shop/common/checkout/moneyorder.jsp
index d3c5e94..89a5616 100644
--- a/sm-shop/src/main/webapp/pages/shop/common/checkout/moneyorder.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/common/checkout/moneyorder.jsp
@@ -22,7 +22,7 @@ response.setDateHeader ("Expires", -1);
</div>
</div>
- <div class="control-group">
+ <div class="control-group payment-method-box">
<s:message code="label.checkout.moneyorder" text="Please make your check or money order payable to:"/><br/>
<c:out value="${requestScope.paymentMethod.informations.integrationKeys['address']}" escapeXml="false"/>
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/common/checkout/paypal.jsp b/sm-shop/src/main/webapp/pages/shop/common/checkout/paypal.jsp
index 7cf9546..f320ef4 100644
--- a/sm-shop/src/main/webapp/pages/shop/common/checkout/paypal.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/common/checkout/paypal.jsp
@@ -23,6 +23,10 @@ response.setDateHeader ("Expires", -1);
</div>
<div class="control-group">
- <!-- PayPal Logo -->
+ <!-- PayPal Logo
<a href="https://www.paypal.com/webapps/mpp/paypal-popup" title="How PayPal Works" onclick="javascript:window.open('https://www.paypal.com/webapps/mpp/paypal-popup','WIPaypal','toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, width=1060, height=700'); return false;"><img src="https://www.paypalobjects.com/webstatic/mktg/logo/AM_mc_vs_dc_ae.jpg" width="200" border="0" alt="PayPal Acceptance Mark"></a>
+ -->
+
+ <!-- PayPal Logo -->
+ <table border="0" cellpadding="10" cellspacing="0" align="center"><tr><td align="center"></td></tr><tr><td align="center"><a href="https://www.paypal.com/webapps/mpp/paypal-popup" title="How PayPal Works" onclick="javascript:window.open('https://www.paypal.com/webapps/mpp/paypal-popup','WIPaypal','toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes, width=1060, height=700'); return false;"><img src="https://www.paypalobjects.com/webstatic/mktg/logo/pp_cc_mark_74x46.jpg" border="0" alt="PayPal Logo"></a></td></tr></table><!-- PayPal Logo -->
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/common/checkout/selectedPayment.jsp b/sm-shop/src/main/webapp/pages/shop/common/checkout/selectedPayment.jsp
index e9c91ea..eb06756 100644
--- a/sm-shop/src/main/webapp/pages/shop/common/checkout/selectedPayment.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/common/checkout/selectedPayment.jsp
@@ -14,11 +14,6 @@ response.setDateHeader ("Expires", -1);
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
- <!--
- <span style="margin-left:2px;">
- <input type="radio" onClick="setPaymentModule('${requestScope.paymentMethod.paymentMethodCode}');" name="paymentMethodType" value="<c:out value="${requestScope.paymentMethod.paymentType}"/>" <c:choose><c:when test="${requestScope.selectedPaymentMethod!=null && (requestScope.selectedPaymentMethod==requestScope.paymentMethod.paymentType)}"> checked</c:when><c:otherwise><c:if test="${requestScope.selectedPaymentMethod==null && requestScope.paymentMethod.defaultSelected==true}"> checked</c:if></c:otherwise></c:choose>/>
- </span>
- -->
diff --git a/sm-shop/src/main/webapp/pages/shop/common/checkout/stripe.jsp b/sm-shop/src/main/webapp/pages/shop/common/checkout/stripe.jsp
index 974a9e4..5829dd7 100644
--- a/sm-shop/src/main/webapp/pages/shop/common/checkout/stripe.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/common/checkout/stripe.jsp
@@ -25,16 +25,27 @@ response.setDateHeader ("Expires", -1);
function initStripePayment() {
var $form = $('#checkoutForm');
+
+ try {
// Disable the submit button to prevent repeated clicks
$form.find('button').prop('disabled', true);
Stripe.card.createToken($form, stripeResponseHandler);
+
+ }
+ catch(err) {
+ hideSMLoading('#pageContainer');
+ //log(err.message);
+ showResponseErrorMessage(err.message);
+ }
};
function stripeResponseHandler(status, response) {
var $form = $('#checkoutForm');
+
+ log('Stripe response');
if (response.error) {
// Show the errors on the form
@@ -44,7 +55,7 @@ response.setDateHeader ("Expires", -1);
orderValidationMessage = error.message;
}
showResponseErrorMessage(orderValidationMessage);
- $('#pageContainer').hideLoading();
+ hideSMLoading('#pageContainer');
$form.find('button').prop('disabled', false);
} else {
// response contains id and card, which contains additional card details
@@ -72,5 +83,5 @@ response.setDateHeader ("Expires", -1);
</div>
</div>
- <jsp:include page="/pages/shop/common/checkout/creditCardInformations.jsp" />
+ <jsp:include page="/pages/shop/common/checkout/${creditCardInformationsPage}.jsp" />
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/common/customer/address.jsp b/sm-shop/src/main/webapp/pages/shop/common/customer/address.jsp
index c6aa4c2..6f29b59 100644
--- a/sm-shop/src/main/webapp/pages/shop/common/customer/address.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/common/customer/address.jsp
@@ -1,138 +1,138 @@
-
-<%
- response.setCharacterEncoding( "UTF-8" );
- response.setHeader( "Cache-Control", "no-cache" );
- response.setHeader( "Pragma", "no-cache" );
- response.setDateHeader( "Expires", -1 );
-%>
-<script>
-function editAddress(formId){
- $( "#editBillingAddress_"+formId).submit();
-}
-function editShippingAddress(formId){
- $( "#editShippingAddress_"+formId).submit();
-}
-function addShippingAddress(formId){
- $( "#addShippingAddress_"+formId).submit();
-}
-
-
-</script>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm"%>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-<c:url var="editAddress" value="/shop/customer/editAddress.html"/>
-<div id="main-content" class="container clearfix row-fluid">
- <div class="span12 common-row">
-
- <div class="span8 col-md-8 no-padding">
- <div class="checkout-box">
- <span class="box-title">
- <p class="p-title">
- <s:message
- code="label.customer.billingaddress" text="Billing Address" />
- <a href="javascript:void(0)" onclick="editAddress('${customer.id}');"><s:message code="label.generic.edit" text="Edit"/></a>
- </p>
- </span>
-
- <c:if test="${not empty customer}">
-
- <form:form action="${editAddress}" method="GET" id="editBillingAddress_${customer.id}">
- <input type="hidden" name="customerId" value="${customer.id}">
- <input type="hidden" name="billingAddress" value="true"/>
- <address>
- <c:choose>
- <c:when test="${not empty customer.billing.company}">
- ${customer.billing.company}<br/>
- </c:when>
- <c:otherwise>
- ${customer.billing.firstName} ${customer.billing.lastName}<br />
- </c:otherwise>
- </c:choose>
-
-
- <c:if test="${not empty customer.billing.address}"> ${customer.billing.address} <br />
- </c:if>
-
-
- <c:if test="${not empty customer.billing.city}">${customer.billing.city} <br />
- </c:if>
- <c:choose><c:when test="${not empty customer.billing.stateProvince}"><c:out value="${customer.billing.stateProvince}"/></c:when><c:otherwise><script>$.ajax({url: "<c:url value="/shop/reference/zoneName"/>",type: "GET",data: "zoneCode=${customer.billing.zone}",success: function(data){$('#billingZoneName').html(data)}})</script><span id="billingZoneName"><c:out value="${customer.billing.zone}"/></span></c:otherwise></c:choose>,
-
- <c:if test="${not empty customer.billing.country}">
- <span id="customerCountryName"><script>$.ajax({url: "<c:url value="/shop/reference/countryName"/>",type: "GET",data: "countryCode=${customer.billing.country}",success: function(data){$('#customerCountryName').html(data)}})</script></span><br/>
- </c:if>
- <c:if test="${not empty customer.billing.postalCode}"> ${customer.billing.postalCode}<br />
- </c:if>
- <c:if test="${not empty customer.billing.phone}">${customer.billing.phone}</c:if>
-
-
- </address>
- </form:form>
- </c:if>
- </div>
- <br/>
- <div class="checkout-box">
- <span class="box-title">
- <p class="p-title">
- <s:message
- code="label.customer.shippingaddress" text="Shipping Address" />
-
-
- <c:if test="${not empty customer.delivery}">
- <a href="javascript:void(0)" onclick="editShippingAddress('${customer.id}');"><s:message code="label.generic.edit" text="Edit"/></a>
- </c:if>
-
- </p>
- </span>
- <c:if test="${not empty customer.delivery}">
- <form:form action="${editAddress}" id="editShippingAddress_${customer.id}">
- <input type="hidden" name="customerId" value="${customer.id}">
- <input type="hidden" name="billingAddress" value="false"/>
- <address>
- ${customer.delivery.firstName} ${customer.delivery.lastName}
- <br />
- <c:if test="${not empty customer.delivery.company}"> ${customer.delivery.company} <br />
- </c:if>
- <c:if test="${not empty customer.delivery.address}"> ${customer.delivery.address} <br />
- </c:if>
- <c:if test="${not empty customer.delivery.city}">${customer.delivery.city} <br />
- </c:if>
-
-
- <c:choose><c:when test="${not empty customer.delivery.stateProvince}"><c:out value="${customer.delivery.stateProvince}"/></c:when><c:otherwise><script>$.ajax({url: "<c:url value="/shop/reference/zoneName"/>",type: "GET",data: "zoneCode=${customer.delivery.zone}",success: function(data){$('#deliveryZoneName').html(data)}})</script><span id="deliveryZoneName"><c:out value="${customer.delivery.zone}"/></span></c:otherwise></c:choose>,
-
- <c:if test="${not empty customer.delivery.country}">
- <span id="customerDeliveryName"><script>$.ajax({url: "<c:url value="/shop/reference/countryName"/>",type: "GET",data: "countryCode=${customer.delivery.country}",success: function(data){$('#customerDeliveryName').html(data)}})</script></span><br/>
- </c:if>
- <c:if test="${not empty customer.delivery.postalCode}"> ${customer.delivery.postalCode}<br />
- </c:if>
- <c:if test="${not empty customer.delivery.phone}">${customer.delivery.phone} <br/></c:if>
-
- </address>
- </form:form>
- </c:if>
-
- <c:if test="${empty customer.delivery}">
- <form:form action="${editAddress}" id="addShippingAddress_${customer.id}">
- <input type="hidden" name="customerId" value="${customer.id}">
- <input type="hidden" name="billingAddress" value="false"/>
- <a href="javascript:void(0)" onclick="addShippingAddress('${customer.id}');"><s:message code="menu.addaddress" text="Add a new address" /></a> <br />
- </form:form>
- </c:if>
-
- </div>
- </div>
- <div class="span4 col-md-4">
- <jsp:include page="/pages/shop/common/customer/customerProfileMenu.jsp" />
- <jsp:include page="/pages/shop/common/customer/customerOrdersMenu.jsp" />
- </div>
- </div>
- </div>
-
+
+<%
+ response.setCharacterEncoding( "UTF-8" );
+ response.setHeader( "Cache-Control", "no-cache" );
+ response.setHeader( "Pragma", "no-cache" );
+ response.setDateHeader( "Expires", -1 );
+%>
+<script>
+function editAddress(formId){
+ $( "#editBillingAddress_"+formId).submit();
+}
+function editShippingAddress(formId){
+ $( "#editShippingAddress_"+formId).submit();
+}
+function addShippingAddress(formId){
+ $( "#addShippingAddress_"+formId).submit();
+}
+
+
+</script>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm"%>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+<c:url var="editAddress" value="/shop/customer/editAddress.html"/>
+<div id="main-content" class="container clearfix row-fluid">
+ <div class="span12 common-row">
+
+ <div class="span8 col-md-8 no-padding">
+ <div class="checkout-box">
+ <span class="box-title">
+ <p class="p-title">
+ <s:message
+ code="label.customer.billingaddress" text="Billing Address" />
+ <a href="javascript:void(0)" onclick="editAddress('${customer.id}');"><s:message code="label.generic.edit" text="Edit"/></a>
+ </p>
+ </span>
+
+ <c:if test="${not empty customer}">
+
+ <form:form action="${editAddress}" method="GET" id="editBillingAddress_${customer.id}">
+ <input type="hidden" name="customerId" value="${customer.id}">
+ <input type="hidden" name="billingAddress" value="true"/>
+ <address>
+ <c:choose>
+ <c:when test="${not empty customer.billing.company}">
+ ${customer.billing.company}<br/>
+ </c:when>
+ <c:otherwise>
+ ${customer.billing.firstName} ${customer.billing.lastName}<br />
+ </c:otherwise>
+ </c:choose>
+
+
+ <c:if test="${not empty customer.billing.address}"> ${customer.billing.address} <br />
+ </c:if>
+
+
+ <c:if test="${not empty customer.billing.city}">${customer.billing.city} <br />
+ </c:if>
+ <c:choose><c:when test="${not empty customer.billing.stateProvince}"><c:out value="${customer.billing.stateProvince}"/></c:when><c:otherwise><script>$.ajax({url: "<c:url value="/shop/reference/zoneName"/>",type: "GET",data: "zoneCode=${customer.billing.zone}",success: function(data){$('#billingZoneName').html(data)}})</script><span id="billingZoneName"><c:out value="${customer.billing.zone}"/></span></c:otherwise></c:choose>,
+
+ <c:if test="${not empty customer.billing.country}">
+ <span id="customerCountryName"><script>$.ajax({url: "<c:url value="/shop/reference/countryName"/>",type: "GET",data: "countryCode=${customer.billing.country}",success: function(data){$('#customerCountryName').html(data)}})</script></span><br/>
+ </c:if>
+ <c:if test="${not empty customer.billing.postalCode}"> ${customer.billing.postalCode}<br />
+ </c:if>
+ <c:if test="${not empty customer.billing.phone}">${customer.billing.phone}</c:if>
+
+
+ </address>
+ </form:form>
+ </c:if>
+ </div>
+ <br/>
+ <div class="checkout-box">
+ <span class="box-title">
+ <p class="p-title">
+ <s:message
+ code="label.customer.shippingaddress" text="Shipping Address" />
+
+
+ <c:if test="${not empty customer.delivery}">
+ <a href="javascript:void(0)" onclick="editShippingAddress('${customer.id}');"><s:message code="label.generic.edit" text="Edit"/></a>
+ </c:if>
+
+ </p>
+ </span>
+ <c:if test="${not empty customer.delivery}">
+ <form:form action="${editAddress}" id="editShippingAddress_${customer.id}">
+ <input type="hidden" name="customerId" value="${customer.id}">
+ <input type="hidden" name="billingAddress" value="false"/>
+ <address>
+ ${customer.delivery.firstName} ${customer.delivery.lastName}
+ <br />
+ <c:if test="${not empty customer.delivery.company}"> ${customer.delivery.company} <br />
+ </c:if>
+ <c:if test="${not empty customer.delivery.address}"> ${customer.delivery.address} <br />
+ </c:if>
+ <c:if test="${not empty customer.delivery.city}">${customer.delivery.city} <br />
+ </c:if>
+
+
+ <c:choose><c:when test="${not empty customer.delivery.stateProvince}"><c:out value="${customer.delivery.stateProvince}"/></c:when><c:otherwise><script>$.ajax({url: "<c:url value="/shop/reference/zoneName"/>",type: "GET",data: "zoneCode=${customer.delivery.zone}",success: function(data){$('#deliveryZoneName').html(data)}})</script><span id="deliveryZoneName"><c:out value="${customer.delivery.zone}"/></span></c:otherwise></c:choose>,
+
+ <c:if test="${not empty customer.delivery.country}">
+ <span id="customerDeliveryName"><script>$.ajax({url: "<c:url value="/shop/reference/countryName"/>",type: "GET",data: "countryCode=${customer.delivery.country}",success: function(data){$('#customerDeliveryName').html(data)}})</script></span><br/>
+ </c:if>
+ <c:if test="${not empty customer.delivery.postalCode}"> ${customer.delivery.postalCode}<br />
+ </c:if>
+ <c:if test="${not empty customer.delivery.phone}">${customer.delivery.phone} <br/></c:if>
+
+ </address>
+ </form:form>
+ </c:if>
+
+ <c:if test="${empty customer.delivery}">
+ <form:form action="${editAddress}" id="addShippingAddress_${customer.id}">
+ <input type="hidden" name="customerId" value="${customer.id}">
+ <input type="hidden" name="billingAddress" value="false"/>
+ <a href="javascript:void(0)" onclick="addShippingAddress('${customer.id}');"><s:message code="menu.addaddress" text="Add a new address" /></a> <br />
+ </form:form>
+ </c:if>
+
+ </div>
+ </div>
+ <div class="span4 col-md-4">
+ <jsp:include page="/pages/shop/common/customer/customerProfileMenu.jsp" />
+ <jsp:include page="/pages/shop/common/customer/customerOrdersMenu.jsp" />
+ </div>
+ </div>
+ </div>
+
<!--close .container "main-content" -->
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/common/customer/changePassword.jsp b/sm-shop/src/main/webapp/pages/shop/common/customer/changePassword.jsp
index 7c1b7c0..018e37f 100644
--- a/sm-shop/src/main/webapp/pages/shop/common/customer/changePassword.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/common/customer/changePassword.jsp
@@ -1,141 +1,141 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-
-<!-- requires functions.jsp -->
-<script src="<c:url value="/resources/js/shop-customer.js" />"></script>
-
-<script type="text/javascript">
-
-$(document).ready(function() {
-
-
- isFormValid();
- //bind fields to be validated
- $("input[type='text']").on("change keyup paste", function(){
- resetGlobalErrors();
- isFormValid();
- });
-
- $("input[type='password']").on("change keyup paste", function(){
- resetGlobalErrors();
- isFormValid();
- });
-
- $("#submitChangePassword").click(function(e) {
- e.preventDefault();//do not submit form
- resetGlobalErrors();
- if(isFormValid()) {
- $('#changePasswordForm').submit();
- }
- });
-
-
-});
-
-function isFormValid() {
-
- if($('.alert-error').is(":visible")) {
- return true;
- }
-
- if($('.alert-success').is(":visible")) {
- return true;
- }
-
- var msg = isCustomerFormValid($('#changePasswordForm'));
-
- if(msg!=null) {//disable submit button
- $('#submitChangePassword').addClass('btn-disabled');
- $('#submitChangePassword').prop('disabled', true);
- $('#formError').html(msg);
- $('#formError').show();
- return false;
- } else {
- $('#submitChangePassword').removeClass('btn-disabled');
- $('#submitChangePassword').prop('disabled', false);
- $('#formError').hide();
- return true;
- }
-}
-
-function resetGlobalErrors() {
- $('.alert-error').hide();
-}
-
-
-</script>
-
- <div id="main-content" class="container clearfix row-fluid">
- <div class="span12 col-md-12 no-padding common-row">
-
- <div class="span8 col-md-8 no-padding">
- <div class="checkout-box">
- <span class="box-title">
- <p class="p-title">
- <s:message code="label.generic.changepassword" text="Change password"/>
- </p>
- </span>
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
- <c:url var="changePassword" value="/shop/customer/changePassword.html"/>
- <div id="formError" class="alert alert-warning" style="display:none;"></div>
- <form:form method="post" action="${changePassword}" id="changePasswordForm" commandName="password">
- <form:errors path="*" cssClass="alert alert-error" element="div" />
- <div class="control-group form-group">
- <label class="required control-label" for="currentPassword"><s:message code="label.customer.currentpassword" text="Current password"/></label>
- <div class="controls">
- <s:message code="currentpassword.not.empty" text="Current password is required " var="msgCurrentPassword"/>
- <form:password path="currentPassword" cssClass="span3 input-large required form-control form-control-md" id="currentPassword" title="${msgCurrentPassword}"/>
- <form:errors path="currentPassword" cssClass="error" />
-
- </div>
- </div>
- <div class="control-group form-group">
- <label class="required control-label" for="password"><s:message code="label.customer.newpassword" text="New password"/></label>
- <div class="controls">
- <s:message code="newpassword.not.empty" text="New password is required" var="msgPassword"/>
- <form:password path="password" cssClass="span3 required password form-control form-control-md" id="password" title="${msgPassword}"/>
- <form:errors path="currentPassword" cssClass="error" />
-
- </div>
- </div>
- <div class="control-group form-group">
- <label class="required control-label" for="repeatPassword"><s:message code="label.customer.repeatpassword" text="Repeat password"/></label>
- <div class="controls">
- <s:message code="label.customer.repeatpassword" text="Current password is required" var="msgRepeatPassword"/>
- <form:password path="checkPassword" cssClass="span3 required checkPassword form-control form-control-md" id="checkPassword" title="${msgRepeatPassword}"/>
- <form:errors path="currentPassword" cssClass="error" />
-
- </div>
- </div>
-
- <div class="form-actions">
- <input id="submitChangePassword" class="btn btn-large btn-disabled" type="submit" name="changePassword" value="<s:message code="menu.change-password" text="Change password"/>" disabled="">
- </div>
-
-
- </form:form>
-
-
- </div>
- </div>
- <div class="span4 col-md-4">
- <jsp:include page="/pages/shop/common/customer/customerProfileMenu.jsp" />
- <jsp:include page="/pages/shop/common/customer/customerOrdersMenu.jsp" />
- </div>
- </div>
- <!--close .span12-->
- </div>
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+<!-- requires functions.jsp -->
+<script src="<c:url value="/resources/js/shop-customer.js" />"></script>
+
+<script type="text/javascript">
+
+$(document).ready(function() {
+
+
+ isFormValid();
+ //bind fields to be validated
+ $("input[type='text']").on("change keyup paste", function(){
+ resetGlobalErrors();
+ isFormValid();
+ });
+
+ $("input[type='password']").on("change keyup paste", function(){
+ resetGlobalErrors();
+ isFormValid();
+ });
+
+ $("#submitChangePassword").click(function(e) {
+ e.preventDefault();//do not submit form
+ resetGlobalErrors();
+ if(isFormValid()) {
+ $('#changePasswordForm').submit();
+ }
+ });
+
+
+});
+
+function isFormValid() {
+
+ if($('.alert-error').is(":visible")) {
+ return true;
+ }
+
+ if($('.alert-success').is(":visible")) {
+ return true;
+ }
+
+ var msg = isCustomerFormValid($('#changePasswordForm'));
+
+ if(msg!=null) {//disable submit button
+ $('#submitChangePassword').addClass('btn-disabled');
+ $('#submitChangePassword').prop('disabled', true);
+ $('#formError').html(msg);
+ $('#formError').show();
+ return false;
+ } else {
+ $('#submitChangePassword').removeClass('btn-disabled');
+ $('#submitChangePassword').prop('disabled', false);
+ $('#formError').hide();
+ return true;
+ }
+}
+
+function resetGlobalErrors() {
+ $('.alert-error').hide();
+}
+
+
+</script>
+
+ <div id="main-content" class="container clearfix row-fluid">
+ <div class="span12 col-md-12 no-padding common-row">
+
+ <div class="span8 col-md-8 no-padding">
+ <div class="checkout-box">
+ <span class="box-title">
+ <p class="p-title">
+ <s:message code="label.generic.changepassword" text="Change password"/>
+ </p>
+ </span>
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+ <c:url var="changePassword" value="/shop/customer/changePassword.html"/>
+ <div id="formError" class="alert alert-warning" style="display:none;"></div>
+ <form:form method="post" action="${changePassword}" id="changePasswordForm" commandName="password">
+ <form:errors path="*" cssClass="alert alert-error" element="div" />
+ <div class="control-group form-group">
+ <label class="required control-label" for="currentPassword"><s:message code="label.customer.currentpassword" text="Current password"/></label>
+ <div class="controls">
+ <s:message code="currentpassword.not.empty" text="Current password is required " var="msgCurrentPassword"/>
+ <form:password path="currentPassword" cssClass="span3 input-large required form-control form-control-md" id="currentPassword" title="${msgCurrentPassword}"/>
+ <form:errors path="currentPassword" cssClass="error" />
+
+ </div>
+ </div>
+ <div class="control-group form-group">
+ <label class="required control-label" for="password"><s:message code="label.customer.newpassword" text="New password"/></label>
+ <div class="controls">
+ <s:message code="newpassword.not.empty" text="New password is required" var="msgPassword"/>
+ <form:password path="password" cssClass="span3 required password form-control form-control-md" id="password" title="${msgPassword}"/>
+ <form:errors path="currentPassword" cssClass="error" />
+
+ </div>
+ </div>
+ <div class="control-group form-group">
+ <label class="required control-label" for="repeatPassword"><s:message code="label.customer.repeatpassword" text="Repeat password"/></label>
+ <div class="controls">
+ <s:message code="label.customer.repeatpassword" text="Current password is required" var="msgRepeatPassword"/>
+ <form:password path="checkPassword" cssClass="span3 required checkPassword form-control form-control-md" id="checkPassword" title="${msgRepeatPassword}"/>
+ <form:errors path="currentPassword" cssClass="error" />
+
+ </div>
+ </div>
+
+ <div class="form-actions">
+ <input id="submitChangePassword" class="btn btn-large btn-disabled template-btn" type="submit" name="changePassword" value="<s:message code="menu.change-password" text="Change password"/>" disabled="">
+ </div>
+
+
+ </form:form>
+
+
+ </div>
+ </div>
+ <div class="span4 col-md-4">
+ <jsp:include page="/pages/shop/common/customer/customerProfileMenu.jsp" />
+ <jsp:include page="/pages/shop/common/customer/customerOrdersMenu.jsp" />
+ </div>
+ </div>
+ <!--close .span12-->
+ </div>
<!--close .container "main-content" -->
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/common/customer/dashboard.jsp b/sm-shop/src/main/webapp/pages/shop/common/customer/dashboard.jsp
index 4c409ef..d7a4fe3 100644
--- a/sm-shop/src/main/webapp/pages/shop/common/customer/dashboard.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/common/customer/dashboard.jsp
@@ -1,171 +1,169 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
-
-<script>
-
-
-
-
-$(document).ready(function() {
-
-
- $('.textAttribute').alphanumeric({ichars:'&=?'});
-
- $('#attributes').on('submit',function (event) {
- $('#attributesBox').showLoading();
- $("#attributesError").hide();
- $("#attributesSuccess").hide();
- var data = $('#attributes').serialize();
- console.log('Saving attributes ' + data);
- $.ajax({
- url: '<c:url value="/shop/customer/attributes/save.html"/>',
- cache: false,
- type: 'POST',
- data : data,
- success: function(result) {
- $('#attributesBox').hideLoading();
- var response = result.response;
- if (response.status==0) {
- $("#attributesSuccess").show();
- } else {
- $("#attributesError").html(response.message);
- $("#attributesError").show();
- }
- },
- error: function(jqXHR,textStatus,errorThrown) {
- $('#attributesBox').hideLoading();
- alert('Error ' + jqXHR + "-" + textStatus + "-" + errorThrown);
- }
- });
-
- event.preventDefault();
- });
-});
-
-</script>
-
-
- <div id="main-content" class="container clearfix row-fluid">
- <div class="row-fluid">
-
- <c:if test="${options!=null && fn:length(options)>0}">
-
- <div class="span-12 col-md-12 no-padding-left">
- <div id="attributesSuccess" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
- <div id="attributesError" class="alert alert-error" style="display:none;"><s:message code="message.error" text="An error occured"/></div>
- <form action="#" id="attributes">
-
- <div id="attributesBox" class="checkout-box">
- <span class="box-title">
- <p class="p-title"><s:message code="label.customer.moredetails" text="More details"/></font></p>
- </span>
-
-
-
-
- <c:forEach items="${options}" var="option" varStatus="status">
- <div class="control-group form-group">
- <label><c:out value="${option.name}"/></label>
- <div class="controls">
- <c:choose>
- <c:when test="${option.type=='Select'}">
- <select id="<c:out value="${option.id}"/>" name="<c:out value="${option.id}"/>">
- <c:forEach items="${option.availableValues}" var="optionValue">
- <option value="${optionValue.id}" <c:if test="${option.defaultValue!=null && option.defaultValue.id==optionValue.id}"> SELECTED</c:if>>${optionValue.name}</option>
- </c:forEach>
- </select>
- </c:when>
- <c:when test="${option.type=='Radio'}">
- <c:forEach items="${option.availableValues}" var="optionValue">
- <input type="radio" id="<c:out value="${option.id}"/>" name="<c:out value="${option.id}"/>" value="<c:out value="${optionValue.id}"/>" <c:if test="${option.defaultValue!=null && option.defaultValue.id==optionValue.id}"> checked="checked" </c:if> />
- <c:out value="${optionValue.name}"/>
- </c:forEach>
- </c:when>
- <c:when test="${option.type=='Text'}">
- <input class="input-medium textAttribute form-control form-control-md form-control-50" type="text" id="<c:out value="${option.id}"/>-<c:out value="${option.availableValues[0].id}"/>" name="<c:out value="${option.id}"/>-<c:out value="${option.availableValues[0].id}"/>" class="input-large" value="<c:if test="${option.defaultValue!=null}">${option.defaultValue.name}</c:if>">
- </c:when>
- <c:when test="${option.type=='Checkbox'}">
- <c:forEach items="${option.availableValues}" var="optionValue">
- <input type="checkbox" id="<c:out value="${option.id}"/>-<c:out value="${optionValue.id}"/>" name="<c:out value="${option.id}"/>-<c:out value="${optionValue.id}"/>" <c:if test="${option.defaultValue!=null && option.defaultValue.id==optionValue.id}"> checked="checked" </c:if> />
- <c:out value="${optionValue.name}"/>
- </c:forEach>
- </c:when>
-
-
- </c:choose>
- <span class="help-inline"></span>
-
- </div>
- </div>
-
- </c:forEach>
- <input id="customer" type="hidden" value="<c:out value="${requestScope.CUSTOMER.id}"/>" name="customer">
-
- <div class="form-actions">
- <button type="submit" class="btn btn-large"><s:message code="button.label.submit2" text="Submit"/></button>
- </div>
-
-
-
-
- </div>
- </div>
-
- </form>
- </div>
-
- </c:if>
-
-
- </br>
- <c:if test="${requestScope.CONTENT['DASHBOARD']!=null}">
- <div class="row-fluid">
- <div class="span-12 col-md-12 common-row">
- <c:out value="${requestScope.CONTENT['DASHBOARD']}"/>
- </div>
- </div>
- </c:if>
-
- </br>
- <div class="row-fluid">
-
-
- <div class="span6 col-md-6 no-padding-left">
-
- <div class="checkout-box">
- <span class="box-title">
- <p class="p-title"><s:message code="label.customer.myaccount" text="My account"/></p>
- </span>
- <jsp:include page="/pages/shop/common/customer/customerProfileMenu.jsp" />
- </div>
-
-
- </div>
- <div class="span6 col-md-6 no-padding-left">
- <div class="checkout-box">
- <span class="box-title">
- <p class="p-title"><s:message code="label.order.pastorders" text="Past orders"/></p>
- </span>
- <jsp:include page="/pages/shop/common/customer/customerOrdersMenu.jsp" />
- </div>
-
- </div>
- </div>
- </div>
- <!-- close row-fluid-->
- </div>
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+<script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
+
+<script>
+
+
+
+
+$(document).ready(function() {
+
+
+ $('.textAttribute').alphanumeric({ichars:'&=?'});
+
+ $('#attributes').on('submit',function (event) {
+ $('#attributesBox').showLoading();
+ $("#attributesError").hide();
+ $("#attributesSuccess").hide();
+ var data = $('#attributes').serialize();
+ console.log('Saving attributes ' + data);
+ $.ajax({
+ url: '<c:url value="/shop/customer/attributes/save.html"/>',
+ cache: false,
+ type: 'POST',
+ data : data,
+ success: function(result) {
+ $('#attributesBox').hideLoading();
+ var response = result.response;
+ if (response.status==0) {
+ $("#attributesSuccess").show();
+ } else {
+ $("#attributesError").html(response.message);
+ $("#attributesError").show();
+ }
+ },
+ error: function(jqXHR,textStatus,errorThrown) {
+ $('#attributesBox').hideLoading();
+ alert('Error ' + jqXHR + "-" + textStatus + "-" + errorThrown);
+ }
+ });
+
+ event.preventDefault();
+ });
+});
+
+</script>
+
+
+ <div id="main-content" class="container clearfix row-fluid">
+ <div class="row-fluid">
+
+ <c:if test="${options!=null && fn:length(options)>0}">
+
+ <div class="span-12 col-md-12 no-padding-left">
+ <div id="attributesSuccess" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+ <div id="attributesError" class="alert alert-error" style="display:none;"><s:message code="message.error" text="An error occured"/></div>
+ <form action="#" id="attributes">
+
+ <div id="attributesBox" class="checkout-box">
+ <span class="box-title">
+ <p class="p-title"><s:message code="label.customer.moredetails" text="More details"/></font></p>
+ </span>
+
+
+
+
+ <c:forEach items="${options}" var="option" varStatus="status">
+ <div class="control-group form-group">
+ <label><c:out value="${option.name}"/></label>
+ <div class="controls">
+ <c:choose>
+ <c:when test="${option.type=='Select'}">
+ <select id="<c:out value="${option.id}"/>" name="<c:out value="${option.id}"/>">
+ <c:forEach items="${option.availableValues}" var="optionValue">
+ <option value="${optionValue.id}" <c:if test="${option.defaultValue!=null && option.defaultValue.id==optionValue.id}"> SELECTED</c:if>>${optionValue.name}</option>
+ </c:forEach>
+ </select>
+ </c:when>
+ <c:when test="${option.type=='Radio'}">
+ <c:forEach items="${option.availableValues}" var="optionValue">
+ <input type="radio" id="<c:out value="${option.id}"/>" name="<c:out value="${option.id}"/>" value="<c:out value="${optionValue.id}"/>" <c:if test="${option.defaultValue!=null && option.defaultValue.id==optionValue.id}"> checked="checked" </c:if> />
+ <c:out value="${optionValue.name}"/>
+ </c:forEach>
+ </c:when>
+ <c:when test="${option.type=='Text'}">
+ <input class="input-medium textAttribute form-control form-control-md form-control-50" type="text" id="<c:out value="${option.id}"/>-<c:out value="${option.availableValues[0].id}"/>" name="<c:out value="${option.id}"/>-<c:out value="${option.availableValues[0].id}"/>" class="input-large" value="<c:if test="${option.defaultValue!=null}">${option.defaultValue.name}</c:if>">
+ </c:when>
+ <c:when test="${option.type=='Checkbox'}">
+ <c:forEach items="${option.availableValues}" var="optionValue">
+ <input type="checkbox" id="<c:out value="${option.id}"/>-<c:out value="${optionValue.id}"/>" name="<c:out value="${option.id}"/>-<c:out value="${optionValue.id}"/>" <c:if test="${option.defaultValue!=null && option.defaultValue.id==optionValue.id}"> checked="checked" </c:if> />
+ <c:out value="${optionValue.name}"/>
+ </c:forEach>
+ </c:when>
+
+
+ </c:choose>
+ <span class="help-inline"></span>
+
+ </div>
+ </div>
+
+ </c:forEach>
+ <input id="customer" type="hidden" value="<c:out value="${requestScope.CUSTOMER.id}"/>" name="customer">
+
+ <div class="form-actions">
+ <button type="submit" class="btn btn-large template-btn"><s:message code="button.label.submit2" text="Submit"/></button>
+ </div>
+
+
+
+
+ </div>
+ </div>
+
+ </form>
+ </div>
+
+ </c:if>
+
+
+ <c:if test="${requestScope.CONTENT['DASHBOARD']!=null}">
+ <div class="row-fluid">
+ <div class="span-12 col-md-12 common-row">
+ <c:out value="${requestScope.CONTENT['DASHBOARD']}"/>
+ </div>
+ </div>
+ </c:if>
+
+ <div class="row-fluid">
+
+
+ <div class="span6 col-md-6 no-padding-left">
+
+ <div class="checkout-box">
+ <span class="box-title">
+ <p class="p-title"><s:message code="label.customer.myaccount" text="My account"/></p>
+ </span>
+ <jsp:include page="/pages/shop/common/customer/customerProfileMenu.jsp" />
+ </div>
+
+
+ </div>
+ <div class="span6 col-md-6 no-padding-left">
+ <div class="checkout-box">
+ <span class="box-title">
+ <p class="p-title"><s:message code="label.order.pastorders" text="Past orders"/></p>
+ </span>
+ <jsp:include page="/pages/shop/common/customer/customerOrdersMenu.jsp" />
+ </div>
+
+ </div>
+ </div>
+ </div>
+ <!-- close row-fluid-->
+ </div>
<!--close .container "main-content" -->
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/common/customer/editAddress.jsp b/sm-shop/src/main/webapp/pages/shop/common/customer/editAddress.jsp
index bf4c04a..bd66141 100644
--- a/sm-shop/src/main/webapp/pages/shop/common/customer/editAddress.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/common/customer/editAddress.jsp
@@ -1,202 +1,202 @@
-<%
- response.setCharacterEncoding( "UTF-8" );
- response.setHeader( "Cache-Control", "no-cache" );
- response.setHeader( "Pragma", "no-cache" );
- response.setDateHeader( "Expires", -1 );
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm"%>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-
-
-<!-- requires functions.jsp -->
-<script src="<c:url value="/resources/js/jquery.maskedinput.min.js" />"></script>
-<script src="<c:url value="/resources/js/shop-customer.js" />"></script>
-<script src="<c:url value="/resources/js/address.js" />"></script>
-
-
-
-<script type="text/javascript">
-
-$(document).ready(function() {
- //triggers form validation
- isFormValid();
- $("input[type='text']").on("change keyup paste", function(){
- isFormValid();
- });
- //apply mask
- setCountrySettings('customer',$('#customer_country').val());
- //populate zones combo
- getZones($('#customer_country').val(),'<c:out value="${address.zone}" />',isFormValid);
- $("#customer_country").change(function() {
- getZones($(this).val(),'<c:out value="${address.zone}" />',isFormValid);
- setCountrySettings('customer',$('#customer_country').val());
- })
-
-
-});
-
-function isFormValid() {
-
- if($('.alert-error').is(":visible")) {
- return true;
- }
-
- if($('.alert-success').is(":visible")) {
- return true;
- }
-
- var msg = isCustomerFormValid($('#changeAddressForm'));
-
- if(msg!=null) {//disable submit button
- $('#submitAddress').addClass('btn-disabled');
- $('#submitAddress').prop('disabled', true);
- $('#formError').html(msg);
- $('#formError').show();
- return false;
- } else {
- $('#submitAddress').removeClass('btn-disabled');
- $('#submitAddress').prop('disabled', false);
- $('#formError').hide();
- return true;
- }
-}
-
-</script>
-
-<c:url var="updateAddress" value="/shop/customer/updateAddress.html"/>
-<div id="main-content" class="container clearfix row-fluid">
- <div class="span12 common-row">
-
- <div class="span8 col-md-8 no-padding">
-
- <div class="checkout-box">
- <span class="box-title">
- <p class="p-title">
-
- <c:choose>
- <c:when test="${address.billingAddress eq true}">
- <s:message code="label.customer.edit.billingaddress" text="Edit Billing Address" />
- </c:when>
- <c:otherwise>
- <s:message code="label.customer.edit.shippinginformation" text="Edit Shipping Address" />
- </c:otherwise>
- </c:choose>
-
- </p>
- </span>
- <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
- <div id="formError" class="alert alert-warning" style="display:none;"></div>
- <form:form method="POST" id="changeAddressForm" commandName="address" action="${updateAddress}">
- <!-- TODO REMOVE -->
- <input type="hidden" name="customerId" value="${customerId}">
- <input type="hidden" name="billingAddress" value="${address.billingAddress}">
-
- <form:errors id="address.error" path="*" cssClass="alert alert-error" element="div" />
- <form:hidden path="${billingAddress}"/>
-
- <div class="control-group form-group">
- <label><s:message code="label.customer.firstname" text="First Name"/></label>
- <div class="controls">
- <s:message code="NotEmpty.customer.firstName" text="First name is required" var="msgFirstName"/>
- <form:input cssClass="input-large required form-control form-control-md" maxlength="64" path="firstName" title="${msgFirstName}"/>
- <span class="help-inline"><form:errors path="firstName" cssClass="error" /></span>
- </div>
- </div>
- <div class="control-group form-group">
- <label><s:message code="label.customer.lastname" text="Last Name"/></label>
- <div class="controls">
- <s:message code="NotEmpty.customer.lastName" text="Last name is required" var="msgLastName"/>
- <form:input cssClass="input-large required form-control form-control-md" maxlength="64" path="lastName" title="${msgLastName}"/>
- <span class="help-inline"><form:errors path="lastName" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group form-group">
- <label><s:message code="label.customer.companyname" text="Company"/></label>
- <div class="controls">
-
- <form:input cssClass="input-large form-control form-control-md" maxlength="100" path="company"/>
- </div>
- </div>
-
- <div class="control-group form-group">
- <label><s:message code="label.customer.streetaddress" text="Street Address"/></label>
- <div class="controls">
-
- <s:message code="NotEmpty.customer.address2" text="Address is required" var="msgAddress"/>
- <form:input cssClass="input-large required form-control form-control-md" maxlength="256" path="address" title="${msgAddress}"/>
- </div>
- </div>
-
- <div class="control-group form-group">
- <label><s:message code="label.customer.city" text="City"/></label>
- <div class="controls">
-
- <s:message code="NotEmpty.customer.city" text="City is required" var="msgCity"/>
- <form:input cssClass="input-large required form-control form-control-md" maxlength="100" path="city" title="${msgCity}"/>
- </div>
- </div>
-
- <div class="control-group form-group">
- <label><s:message code="label.customer.country" text="Country"/></label>
- <div class="controls">
- <form:select cssClass="billing-country-list form-control form-control-lg" path="country" id="customer_country">
- <form:options items="${countries}" itemValue="isoCode" itemLabel="name"/>
- </form:select>
- <span class="help-inline"><form:errors path="country" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group form-group">
- <label><s:message code="label.customer.zone" text="State / Province"/></label>
- <div class="controls">
- <form:select cssClass="billing-zone-list form-control form-control-lg" path="zone" id="customer_zones"/>
- <s:message code="NotEmpty.customer.stateProvince" text="State / Province is required" var="msgStateProvince"/>
- <form:input class="input-large required form-control form-control-md" id="hidden_zones" maxlength="100" name="stateProvince" path="stateProvince" title="${msgStateProvince}" />
- <span class="help-inline"><form:errors path="zone" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group form-group">
- <label><s:message code="label.generic.postalcode" text="Postal code"/></label>
- <div class="controls">
- <s:message code="NotEmpty.customer.billing.postalCode" text="Postal code is required" var="msgPostalCode"/>
- <form:input id="billingPostalCode" cssClass="input-large required customer-postalCode form-control form-control-md" maxlength="20" path="postalCode" title="${msgPostalCode}"/>
- <span class="help-inline"><form:errors path="postalCode" cssClass="error" /></span>
- </div>
- </div>
-
- <div class="control-group form-group">
- <label><s:message code="label.customer.telephone" text="Phone"/></label>
- <div class="controls">
- <s:message code="NotEmpty.customer.billing.phone" text="Phone number is required" var="msgPhone"/>
- <form:input cssClass="input-large required customer-phone form-control form-control-md" maxlength="32" path="phone" title="${msgPhone}"/>
- <span class="help-inline"><form:errors path="phone" cssClass="error" /></span>
- </div>
- </div>
-
-
-
- <div class="form-actions">
- <input id="submitAddress" class="btn btn-large btn-disabled" type="submit" name="submitAddress" value="<s:message code="menu.editaddress" text="Change address"/>" disabled="">
- </div>
-
-
-
-
- </form:form>
- </div>
- </div>
- <div class="span4 col-md-4">
- <jsp:include page="/pages/shop/common/customer/customerProfileMenu.jsp" />
- <jsp:include page="/pages/shop/common/customer/customerOrdersMenu.jsp" />
- </div>
- </div>
- </div>
+<%
+ response.setCharacterEncoding( "UTF-8" );
+ response.setHeader( "Cache-Control", "no-cache" );
+ response.setHeader( "Pragma", "no-cache" );
+ response.setDateHeader( "Expires", -1 );
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm"%>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+
+<!-- requires functions.jsp -->
+<script src="<c:url value="/resources/js/jquery.maskedinput.min.js" />"></script>
+<script src="<c:url value="/resources/js/shop-customer.js" />"></script>
+<script src="<c:url value="/resources/js/address.js" />"></script>
+
+
+
+<script type="text/javascript">
+
+$(document).ready(function() {
+ //triggers form validation
+ isFormValid();
+ $("input[type='text']").on("change keyup paste", function(){
+ isFormValid();
+ });
+ //apply mask
+ setCountrySettings('customer',$('#customer_country').val());
+ //populate zones combo
+ getZones($('#customer_country').val(),'<c:out value="${address.zone}" />',isFormValid);
+ $("#customer_country").change(function() {
+ getZones($(this).val(),'<c:out value="${address.zone}" />',isFormValid);
+ setCountrySettings('customer',$('#customer_country').val());
+ })
+
+
+});
+
+function isFormValid() {
+
+ if($('.alert-error').is(":visible")) {
+ return true;
+ }
+
+ if($('.alert-success').is(":visible")) {
+ return true;
+ }
+
+ var msg = isCustomerFormValid($('#changeAddressForm'));
+
+ if(msg!=null) {//disable submit button
+ $('#submitAddress').addClass('btn-disabled');
+ $('#submitAddress').prop('disabled', true);
+ $('#formError').html(msg);
+ $('#formError').show();
+ return false;
+ } else {
+ $('#submitAddress').removeClass('btn-disabled');
+ $('#submitAddress').prop('disabled', false);
+ $('#formError').hide();
+ return true;
+ }
+}
+
+</script>
+
+<c:url var="updateAddress" value="/shop/customer/updateAddress.html"/>
+<div id="main-content" class="container clearfix row-fluid">
+ <div class="span12 common-row">
+
+ <div class="span8 col-md-8 no-padding">
+
+ <div class="checkout-box">
+ <span class="box-title">
+ <p class="p-title">
+
+ <c:choose>
+ <c:when test="${address.billingAddress eq true}">
+ <s:message code="label.customer.edit.billingaddress" text="Edit Billing Address" />
+ </c:when>
+ <c:otherwise>
+ <s:message code="label.customer.edit.shippinginformation" text="Edit Shipping Address" />
+ </c:otherwise>
+ </c:choose>
+
+ </p>
+ </span>
+ <div id="store.success" class="alert alert-success" style="<c:choose><c:when test="${success!=null}">display:block;</c:when><c:otherwise>display:none;</c:otherwise></c:choose>"><s:message code="message.success" text="Request successfull"/></div>
+ <div id="formError" class="alert alert-warning" style="display:none;"></div>
+ <form:form method="POST" id="changeAddressForm" commandName="address" action="${updateAddress}">
+ <!-- TODO REMOVE -->
+ <input type="hidden" name="customerId" value="${customerId}">
+ <input type="hidden" name="billingAddress" value="${address.billingAddress}">
+
+ <form:errors id="address.error" path="*" cssClass="alert alert-error" element="div" />
+ <form:hidden path="${billingAddress}"/>
+
+ <div class="control-group form-group">
+ <label><s:message code="label.customer.firstname" text="First Name"/></label>
+ <div class="controls">
+ <s:message code="NotEmpty.customer.firstName" text="First name is required" var="msgFirstName"/>
+ <form:input cssClass="input-large required form-control form-control-md" maxlength="64" path="firstName" title="${msgFirstName}"/>
+ <span class="help-inline"><form:errors path="firstName" cssClass="error" /></span>
+ </div>
+ </div>
+ <div class="control-group form-group">
+ <label><s:message code="label.customer.lastname" text="Last Name"/></label>
+ <div class="controls">
+ <s:message code="NotEmpty.customer.lastName" text="Last name is required" var="msgLastName"/>
+ <form:input cssClass="input-large required form-control form-control-md" maxlength="64" path="lastName" title="${msgLastName}"/>
+ <span class="help-inline"><form:errors path="lastName" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group form-group">
+ <label><s:message code="label.customer.companyname" text="Company"/></label>
+ <div class="controls">
+
+ <form:input cssClass="input-large form-control form-control-md" maxlength="100" path="company"/>
+ </div>
+ </div>
+
+ <div class="control-group form-group">
+ <label><s:message code="label.customer.streetaddress" text="Street Address"/></label>
+ <div class="controls">
+
+ <s:message code="NotEmpty.customer.address2" text="Address is required" var="msgAddress"/>
+ <form:input cssClass="input-large required form-control form-control-md" maxlength="256" path="address" title="${msgAddress}"/>
+ </div>
+ </div>
+
+ <div class="control-group form-group">
+ <label><s:message code="label.customer.city" text="City"/></label>
+ <div class="controls">
+
+ <s:message code="NotEmpty.customer.city" text="City is required" var="msgCity"/>
+ <form:input cssClass="input-large required form-control form-control-md" maxlength="100" path="city" title="${msgCity}"/>
+ </div>
+ </div>
+
+ <div class="control-group form-group">
+ <label><s:message code="label.customer.country" text="Country"/></label>
+ <div class="controls">
+ <form:select cssClass="billing-country-list form-control form-control-lg" path="country" id="customer_country">
+ <form:options items="${countries}" itemValue="isoCode" itemLabel="name"/>
+ </form:select>
+ <span class="help-inline"><form:errors path="country" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group form-group">
+ <label><s:message code="label.customer.zone" text="State / Province"/></label>
+ <div class="controls">
+ <form:select cssClass="billing-zone-list form-control form-control-lg" path="zone" id="customer_zones"/>
+ <s:message code="NotEmpty.customer.stateProvince" text="State / Province is required" var="msgStateProvince"/>
+ <form:input class="input-large required form-control form-control-md" id="hidden_zones" maxlength="100" name="stateProvince" path="stateProvince" title="${msgStateProvince}" />
+ <span class="help-inline"><form:errors path="zone" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group form-group">
+ <label><s:message code="label.generic.postalcode" text="Postal code"/></label>
+ <div class="controls">
+ <s:message code="NotEmpty.customer.billing.postalCode" text="Postal code is required" var="msgPostalCode"/>
+ <form:input id="billingPostalCode" cssClass="input-large required customer-postalCode form-control form-control-md" maxlength="20" path="postalCode" title="${msgPostalCode}"/>
+ <span class="help-inline"><form:errors path="postalCode" cssClass="error" /></span>
+ </div>
+ </div>
+
+ <div class="control-group form-group">
+ <label><s:message code="label.customer.telephone" text="Phone"/></label>
+ <div class="controls">
+ <s:message code="NotEmpty.customer.billing.phone" text="Phone number is required" var="msgPhone"/>
+ <form:input cssClass="input-large required customer-phone form-control form-control-md" maxlength="32" path="phone" title="${msgPhone}"/>
+ <span class="help-inline"><form:errors path="phone" cssClass="error" /></span>
+ </div>
+ </div>
+
+
+
+ <div class="form-actions">
+ <input id="submitAddress" class="btn btn-large btn-disabled template-btn" type="submit" name="submitAddress" value="<s:message code="menu.editaddress" text="Change address"/>" disabled="">
+ </div>
+
+
+
+
+ </form:form>
+ </div>
+ </div>
+ <div class="span4 col-md-4">
+ <jsp:include page="/pages/shop/common/customer/customerProfileMenu.jsp" />
+ <jsp:include page="/pages/shop/common/customer/customerOrdersMenu.jsp" />
+ </div>
+ </div>
+ </div>
diff --git a/sm-shop/src/main/webapp/pages/shop/common/customer/logon.jsp b/sm-shop/src/main/webapp/pages/shop/common/customer/logon.jsp
index 4a37ed0..0ce46ed 100644
--- a/sm-shop/src/main/webapp/pages/shop/common/customer/logon.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/common/customer/logon.jsp
@@ -1,70 +1,70 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-
-
-
-<div class="container">
- <div class="row">
- <form class="form-signin mg-btm">
- <h3 class="heading-desc">
- <button type="button" class="close pull-right" aria-hidden="true">×</button>
- Login to Bootsnipp</h3>
- <div class="social-box">
- <div class="row mg-btm">
- <div class="col-md-12">
- <a href="#" class="btn btn-primary btn-block">
- <i class="icon-facebook"></i> Login with Facebook
- </a>
- </div>
- </div>
- <div class="row">
- <div class="col-md-12">
- <a href="#" class="btn btn-info btn-block" >
- <i class="icon-twitter"></i> Login with Twitter
- </a>
- </div>
- </div>
- </div>
- <div class="main">
-
- <input type="text" class="form-control" placeholder="Email" autofocus>
- <input type="password" class="form-control" placeholder="Password">
-
- Are you a business? <a href=""> Get started here</a>
- <span class="clearfix"></span>
- </div>
- <div class="login-footer">
- <div class="row">
- <div class="col-xs-6 col-md-6">
- <div class="left-section">
- <a href="">Forgot your password?</a>
- <a href="">Sign up now</a>
- </div>
- </div>
- <div class="col-xs-6 col-md-6 pull-right">
- <button type="submit" class="btn btn-large btn-danger pull-right">Login</button>
- </div>
- </div>
-
- </div>
- </form>
- </div>
-</div>
-
-
-
-
-
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+
+
+<div class="container">
+ <div class="row">
+ <form class="form-signin mg-btm">
+ <h3 class="heading-desc">
+ <button type="button" class="close pull-right" aria-hidden="true">×</button>
+ Login to Bootsnipp</h3>
+ <div class="social-box">
+ <div class="row mg-btm">
+ <div class="col-md-12">
+ <a href="#" class="btn btn-primary btn-block">
+ <i class="icon-facebook"></i> Login with Facebook
+ </a>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-md-12">
+ <a href="#" class="btn btn-info btn-block" >
+ <i class="icon-twitter"></i> Login with Twitter
+ </a>
+ </div>
+ </div>
+ </div>
+ <div class="main">
+
+ <input type="text" class="form-control" placeholder="Email" autofocus>
+ <input type="password" class="form-control" placeholder="Password">
+
+ Are you a business? <a href=""> Get started here</a>
+ <span class="clearfix"></span>
+ </div>
+ <div class="login-footer">
+ <div class="row">
+ <div class="col-xs-6 col-md-6">
+ <div class="left-section">
+ <a href="">Forgot your password?</a>
+ <a href="">Sign up now</a>
+ </div>
+ </div>
+ <div class="col-xs-6 col-md-6 pull-right">
+ <button type="submit" class="btn btn-large btn-danger pull-right">Login</button>
+ </div>
+ </div>
+
+ </div>
+ </form>
+ </div>
+</div>
+
+
+
+
+
sm-shop/src/main/webapp/pages/shop/common/customer/order.jsp 404(+202 -202)
diff --git a/sm-shop/src/main/webapp/pages/shop/common/customer/order.jsp b/sm-shop/src/main/webapp/pages/shop/common/customer/order.jsp
index 54d6dcc..5f13252 100644
--- a/sm-shop/src/main/webapp/pages/shop/common/customer/order.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/common/customer/order.jsp
@@ -1,202 +1,202 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm"%>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-
-<script src="<c:url value="/resources/js/jquery.print.js" />"></script>
-
-<script type="text/javascript">
-
-function print() {
- $('#printableOrder').print();
-}
-
-</script>
-
-
- <div id="main-content" class="container clearfix row-fluid">
-
-
-
-
- <header class="page-header">
- <h1><s:message code="label.order.details" text="Order details" /> # <c:out value="${order.id}"/></h1>
- </header>
-
-
- <div class="row-fluid">
- <!-- note class 'printable' - this area is printable only! -->
-
- <!-- Buttons -->
- <div class="alert-custom">
-
- <div class="row-fluid">
-
- <div class="col-md-8 col-sm-8 pull-left"><!-- left text -->
-
-
- <c:if test="${downloads!=null}">
- <p class="nomargin">
- <c:choose>
- <c:when test="${order.orderStatus.value=='processed'}">
- <strong><s:message code="label.checkout.downloads.completed" text="label.checkout.downloads.completed"/></strong><br/>
- <c:forEach items="${downloads}" var="download">
- <a href="<sm:orderProductDownload productDownload="${download}" orderId="${order.id}"/>"><c:out value="${download.fileName}" /></a>
- </c:forEach>
- </c:when>
- <c:otherwise>
- <s:message code="label.checkout.downloads.processing" text="*** An email with your file(s) download instructions will be sent once the payment for this order will be completed."/>
- </c:otherwise>
- </c:choose>
- </p>
- </c:if>
-
-
- </div><!-- /left text -->
-
-
- <div class="col-md-4 col-sm-4 text-right pull-right">
- <input type="button" onclick="print();" value="<s:message code="label.generic.print" text="Print" />" name="Print" class="btn btn-large">
- </div>
-
- </div>
-
- </div>
-
- <div id="printableOrder" class="row-fluid">
-
-
- <div class="row-fluid">
-
- <div class="col-md-12 col-sm-12 pull-left">
-
-
- <h2><s:message code="label.entity.order" text="Order" /> # <c:out value="${order.id}"/><br/></h2>
- <p class="lead">
- <fmt:formatDate type="both" dateStyle="long" value="${order.datePurchased}" /><br/>
- <s:message code="label.order.${order.orderStatus.value}" text="${order.orderStatus.value}" />
- </p>
- </div>
- </div>
-
- <!-- BILLING and SHIPPING ADDRESS -->
- <div class="row-fluid">
- <div class="col-md-6 col-sm-6">
- <c:if test="${not empty order.billing}">
- <h5><strong><s:message code="label.customer.billingaddress" text="Billing address" /></strong></h5>
- <p>
- <c:set var="address" value="${order.billing}" scope="request" />
- <c:set var="addressType" value="billing" scope="request" />
- <jsp:include page="/pages/shop/common/preBuiltBlocks/customerAddress.jsp"/>
- </p>
- </c:if>
- </div>
-
- <div class="col-md-6 col-sm-6">
- <c:if test="${not empty order.delivery}">
- <h5><strong><s:message code="label.customer.shippingaddress" text="Shipping address" /></strong></h5>
- <p>
- <c:set var="address" value="${order.delivery}" scope="request" />
- <c:set var="addressType" value="delivery" scope="request" />
- <jsp:include page="/pages/shop/common/preBuiltBlocks/customerAddress.jsp"/>
- </p>
- </c:if>
- </div>
- </div>
- <!-- /BILLING and SHIPPING ADDRESS -->
-
- <div id="orderTableTitle">
- <h2>
- <s:message code="label.entity.details" text="Details"/>
- </h2>
- </div>
-
- <!-- PRODUCTS TABLE -->
- <div id="cartContent">
- <!-- cart header -->
- <div class="item head">
- <span class="cartImage"></span>
- <span class="productName"><s:message code="label.productedit.productname" text="Product name" /></span>
- <span class="quantity"><s:message code="label.quantity" text="Quantity" /></span>
- <span class="totalPrice"><s:message code="label.generic.price" text="Price" /></span>
- <span class="subTotal"><s:message code="order.total.subtotal" text="Sub-total" /></span>
- <div class="clearfix"></div>
- </div>
- <!-- /cart header -->
-
- <!-- cart item -->
- <c:forEach items="${order.products}" var="product">
- <div class="item">
- <div class="cartImage">
- <c:if test="${not empty product.image}">
- <img width="60" src="<sm:shopProductImage imageName="${product.image}" sku="${product.sku}"/>"/>
- </c:if>
- </div>
-
- <span class="productName">
- <c:choose>
- <c:when test="${product.product!=null}">
- <a href="<c:url value="/shop/product/" /><c:out value="${product.product.description.friendlyUrl}"/>.html"><c:out value="${product.productName}"/></a>
- </c:when>
- <c:otherwise>
- <c:out value="${product.productName}"/>
- </c:otherwise>
- </c:choose>
- <br/>
- <c:if test="${product.attributes !=null}">
- <ul>
- <c:forEach items="${product.attributes}" var="attribute">
- <li><c:out value="${attribute.attributeName}"/>: <c:out value="${attribute.attributeValue}"/></li>
- </c:forEach>
- </ul>
- </c:if>
- </span>
- <div class="quantity"><c:out value="${product.orderedQuantity}"/></div>
- <div class="totalPrice"><c:out value="${product.price}"/></div>
- <div class="subTotal"><c:out value="${product.subTotal}"/></div>
- <div class="clearfix"></div>
- </div>
- </c:forEach>
- <!-- /cart item -->
-
-
- <!-- cart total -->
- <div class="total pull-right">
- <c:forEach items="${order.totals}" var="orderTotal" varStatus="counter">
- <small class="totalItem">
- <c:if test="${orderTotal.code=='refund'}"><font color="red"></c:if><s:message code="${orderTotal.code}" text="${orderTotal.code}"/>:<c:if test="${orderTotal.code=='refund'}"></font></c:if>
- <span <c:if test="orderTotal.code=='total'">class="totalToPay"</c:if>><strong><c:if test="${orderTotal.code=='refund'}"><font color="red"></c:if><sm:monetary value="${orderTotal.value}" /><c:if test="${orderTotal.code=='refund'}"></font></c:if></strong></span>
- </small>
- <br/>
- </c:forEach>
- </div>
- <!-- /cart total -->
-
- <div class="clearfix"></div>
- </div>
- <!-- /SUMMARY TABLE -->
-
-
- </div>
-
-
-
-
-
- </div>
-
- </div>
- <!--close .container "main-content" -->
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm"%>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+<script src="<c:url value="/resources/js/jquery.print.js" />"></script>
+
+<script type="text/javascript">
+
+function print() {
+ $('#printableOrder').print();
+}
+
+</script>
+
+
+ <div id="main-content" class="container clearfix row-fluid">
+
+
+
+
+ <header class="page-header">
+ <h1><s:message code="label.order.details" text="Order details" /> # <c:out value="${order.id}"/></h1>
+ </header>
+
+
+ <div class="row-fluid">
+ <!-- note class 'printable' - this area is printable only! -->
+
+ <!-- Buttons -->
+ <div class="alert-custom">
+
+ <div class="row-fluid">
+
+ <div class="col-md-8 col-sm-8 pull-left"><!-- left text -->
+
+
+ <c:if test="${downloads!=null}">
+ <p class="nomargin">
+ <c:choose>
+ <c:when test="${order.orderStatus.value=='processed'}">
+ <strong><s:message code="label.checkout.downloads.completed" text="label.checkout.downloads.completed"/></strong><br/>
+ <c:forEach items="${downloads}" var="download">
+ <a href="<sm:orderProductDownload productDownload="${download}" orderId="${order.id}"/>"><c:out value="${download.fileName}" /></a>
+ </c:forEach>
+ </c:when>
+ <c:otherwise>
+ <s:message code="label.checkout.downloads.processing" text="*** An email with your file(s) download instructions will be sent once the payment for this order will be completed."/>
+ </c:otherwise>
+ </c:choose>
+ </p>
+ </c:if>
+
+
+ </div><!-- /left text -->
+
+
+ <div class="col-md-4 col-sm-4 text-right pull-right">
+ <input type="button" onclick="print();" value="<s:message code="label.generic.print" text="Print" />" name="Print" class="btn btn-large">
+ </div>
+
+ </div>
+
+ </div>
+
+ <div id="printableOrder" class="row-fluid">
+
+
+ <div class="row-fluid">
+
+ <div class="col-md-12 col-sm-12 pull-left">
+
+
+ <h2><s:message code="label.entity.order" text="Order" /> # <c:out value="${order.id}"/><br/></h2>
+ <p class="lead">
+ <fmt:formatDate type="both" dateStyle="long" value="${order.datePurchased}" /><br/>
+ <s:message code="label.order.${order.orderStatus.value}" text="${order.orderStatus.value}" />
+ </p>
+ </div>
+ </div>
+
+ <!-- BILLING and SHIPPING ADDRESS -->
+ <div class="row-fluid">
+ <div class="col-md-6 col-sm-6">
+ <c:if test="${not empty order.billing}">
+ <h5><strong><s:message code="label.customer.billingaddress" text="Billing address" /></strong></h5>
+ <p>
+ <c:set var="address" value="${order.billing}" scope="request" />
+ <c:set var="addressType" value="billing" scope="request" />
+ <jsp:include page="/pages/shop/common/preBuiltBlocks/customerAddress.jsp"/>
+ </p>
+ </c:if>
+ </div>
+
+ <div class="col-md-6 col-sm-6">
+ <c:if test="${not empty order.delivery}">
+ <h5><strong><s:message code="label.customer.shippingaddress" text="Shipping address" /></strong></h5>
+ <p>
+ <c:set var="address" value="${order.delivery}" scope="request" />
+ <c:set var="addressType" value="delivery" scope="request" />
+ <jsp:include page="/pages/shop/common/preBuiltBlocks/customerAddress.jsp"/>
+ </p>
+ </c:if>
+ </div>
+ </div>
+ <!-- /BILLING and SHIPPING ADDRESS -->
+
+ <div id="orderTableTitle">
+ <h2>
+ <s:message code="label.entity.details" text="Details"/>
+ </h2>
+ </div>
+
+ <!-- PRODUCTS TABLE -->
+ <div id="cartContent">
+ <!-- cart header -->
+ <div class="item head">
+ <span class="cartImage"></span>
+ <span class="productName"><s:message code="label.productedit.productname" text="Product name" /></span>
+ <span class="quantity"><s:message code="label.quantity" text="Quantity" /></span>
+ <span class="totalPrice"><s:message code="label.generic.price" text="Price" /></span>
+ <span class="subTotal"><s:message code="order.total.subtotal" text="Sub-total" /></span>
+ <div class="clearfix"></div>
+ </div>
+ <!-- /cart header -->
+
+ <!-- cart item -->
+ <c:forEach items="${order.products}" var="product">
+ <div class="item">
+ <div class="cartImage">
+ <c:if test="${not empty product.image}">
+ <img width="60" src="<sm:shopProductImage imageName="${product.image}" sku="${product.sku}"/>"/>
+ </c:if>
+ </div>
+
+ <span class="productName">
+ <c:choose>
+ <c:when test="${product.product!=null}">
+ <a href="<c:url value="/shop/product/" /><c:out value="${product.product.description.friendlyUrl}"/>.html"><c:out value="${product.productName}"/></a>
+ </c:when>
+ <c:otherwise>
+ <c:out value="${product.productName}"/>
+ </c:otherwise>
+ </c:choose>
+ <br/>
+ <c:if test="${product.attributes !=null}">
+ <ul>
+ <c:forEach items="${product.attributes}" var="attribute">
+ <li><c:out value="${attribute.attributeName}"/>: <c:out value="${attribute.attributeValue}"/></li>
+ </c:forEach>
+ </ul>
+ </c:if>
+ </span>
+ <div class="quantity"><c:out value="${product.orderedQuantity}"/></div>
+ <div class="totalPrice"><c:out value="${product.price}"/></div>
+ <div class="subTotal"><c:out value="${product.subTotal}"/></div>
+ <div class="clearfix"></div>
+ </div>
+ </c:forEach>
+ <!-- /cart item -->
+
+
+ <!-- cart total -->
+ <div class="total pull-right">
+ <c:forEach items="${order.totals}" var="orderTotal" varStatus="counter">
+ <small class="totalItem">
+ <c:if test="${orderTotal.code=='refund'}"><font color="red"></c:if><s:message code="${orderTotal.code}" text="${orderTotal.code}"/>:<c:if test="${orderTotal.code=='refund'}"></font></c:if>
+ <span <c:if test="orderTotal.code=='total'">class="totalToPay"</c:if>><strong><c:if test="${orderTotal.code=='refund'}"><font color="red"></c:if><sm:monetary value="${orderTotal.value}" /><c:if test="${orderTotal.code=='refund'}"></font></c:if></strong></span>
+ </small>
+ <br/>
+ </c:forEach>
+ </div>
+ <!-- /cart total -->
+
+ <div class="clearfix"></div>
+ </div>
+ <!-- /SUMMARY TABLE -->
+
+
+ </div>
+
+
+
+
+
+ </div>
+
+ </div>
+ <!--close .container "main-content" -->
diff --git a/sm-shop/src/main/webapp/pages/shop/common/customer/orders.jsp b/sm-shop/src/main/webapp/pages/shop/common/customer/orders.jsp
index 27212da..96ca07d 100644
--- a/sm-shop/src/main/webapp/pages/shop/common/customer/orders.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/common/customer/orders.jsp
@@ -1,111 +1,111 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm"%>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-<c:set var="ordersAction" value="${pageContext.request.contextPath}/shop/customer/orders.html"/>
-<c:set var="customerOrder" value="${pageContext.request.contextPath}/shop/customer/order.html"/>
-
-<div id="main-content" class="container clearfix row-fluid">
- <div class="span12 col-md-12 common-row">
-
- <div class="span8 col-md-8 no-padding">
-
- <div class="checkout-box">
- <span class="box-title">
- <p class="p-title">
- <s:message
- code="menu.order-list" text="List of orders" />
-
- <span class="p-title-text">
- <c:if test="${not empty customerOrders.orders}">
-
- <s:message code="label.entitylist.paging"
- arguments="${(paginationData.offset)};${paginationData.countByPage};${paginationData.totalCount}"
- htmlEscape="false"
- argumentSeparator=";" text=""/>
-
- </c:if>
- </p>
- </span>
- <c:choose>
- <c:when test="${not empty customerOrders.orders}">
- <div id="shop">
-
- <!-- HISTORY TABLE -->
- <table class="table table-striped">
- <!-- table head -->
- <thead>
- <tr>
- <th><s:message code="label.entity.id" text="Id"/></th>
- <th><s:message code="label.customer.order.date" text="Order date"/></th>
- <th><s:message code="label.generic.amount" text="Amount"/></th>
- <th><s:message code="label.entity.status" text="Status"/></th>
- </tr>
- </thead>
-
- <!-- /HISTORY TABLE -->
- <tbody>
- <c:forEach items="${customerOrders.orders}" var="order" varStatus="orderStatus">
- <tr><!-- item -->
- <td><a href="${customerOrder}?orderId=${order.id}">${order.id}</a></td>
- <td><fmt:formatDate type="both" value="${order.datePurchased}" pattern="yyyy-MM-dd" /></td>
- <td><sm:monetary value="${order.total.value}" /> <small>(${fn:length(order.products)} <c:choose><c:when test="${fn:length(order.products)==1}"><s:message code="label.generic.item" text="item"/></c:when><c:otherwise><s:message code="label.generic.items" text="items"/></c:otherwise></c:choose>)</small></td>
- <td>${order.orderStatus}</td>
-
- </tr>
- </c:forEach>
-
- </tbody>
- </table>
-
-
-
-
- <!-- PAGINATION -->
- <br/>
- <ul class="pagination">
-
- <c:forEach begin="1" end="${paginationData.totalPages}" varStatus="paginationDataStatus">
- <li class="${paginationData.currentPage eq (paginationDataStatus.index) ? 'active' : ''}"><a href="${ordersAction}?page=${paginationDataStatus.index}">${paginationDataStatus.index}</a></li>
- </c:forEach>
-
- </ul>
- <!-- /PAGINATION -->
-
-
- </div>
- </c:when>
- <c:otherwise>
-
- </c:otherwise>
-
- </c:choose>
- </div>
-
- </div>
- <div class="span4 col-md-4 no-padding">
- <jsp:include page="/pages/shop/common/customer/customerProfileMenu.jsp" />
- <jsp:include page="/pages/shop/common/customer/customerOrdersMenu.jsp" />
- </div>
-
-
-
-
-
- </div>
- <!-- close row-fluid-->
- </div>
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm"%>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+<c:set var="ordersAction" value="${pageContext.request.contextPath}/shop/customer/orders.html"/>
+<c:set var="customerOrder" value="${pageContext.request.contextPath}/shop/customer/order.html"/>
+
+<div id="main-content" class="container clearfix row-fluid">
+ <div class="span12 col-md-12 common-row">
+
+ <div class="span8 col-md-8 no-padding">
+
+ <div class="checkout-box">
+ <span class="box-title">
+ <p class="p-title">
+ <s:message
+ code="menu.order-list" text="List of orders" />
+
+ <span class="p-title-text">
+ <c:if test="${not empty customerOrders.orders}">
+
+ <s:message code="label.entitylist.paging"
+ arguments="${(paginationData.offset)};${paginationData.countByPage};${paginationData.totalCount}"
+ htmlEscape="false"
+ argumentSeparator=";" text=""/>
+
+ </c:if>
+ </p>
+ </span>
+ <c:choose>
+ <c:when test="${not empty customerOrders.orders}">
+ <div id="shop">
+
+ <!-- HISTORY TABLE -->
+ <table class="table table-striped">
+ <!-- table head -->
+ <thead>
+ <tr>
+ <th><s:message code="label.entity.id" text="Id"/></th>
+ <th><s:message code="label.customer.order.date" text="Order date"/></th>
+ <th><s:message code="label.generic.amount" text="Amount"/></th>
+ <th><s:message code="label.entity.status" text="Status"/></th>
+ </tr>
+ </thead>
+
+ <!-- /HISTORY TABLE -->
+ <tbody>
+ <c:forEach items="${customerOrders.orders}" var="order" varStatus="orderStatus">
+ <tr><!-- item -->
+ <td><a href="${customerOrder}?orderId=${order.id}">${order.id}</a></td>
+ <td><fmt:formatDate type="both" value="${order.datePurchased}" pattern="yyyy-MM-dd" /></td>
+ <td><sm:monetary value="${order.total.value}" /> <small>(${fn:length(order.products)} <c:choose><c:when test="${fn:length(order.products)==1}"><s:message code="label.generic.item" text="item"/></c:when><c:otherwise><s:message code="label.generic.items" text="items"/></c:otherwise></c:choose>)</small></td>
+ <td>${order.orderStatus}</td>
+
+ </tr>
+ </c:forEach>
+
+ </tbody>
+ </table>
+
+
+
+
+ <!-- PAGINATION -->
+ <br/>
+ <ul class="pagination">
+
+ <c:forEach begin="1" end="${paginationData.totalPages}" varStatus="paginationDataStatus">
+ <li class="${paginationData.currentPage eq (paginationDataStatus.index) ? 'active' : ''}"><a href="${ordersAction}?page=${paginationDataStatus.index}">${paginationDataStatus.index}</a></li>
+ </c:forEach>
+
+ </ul>
+ <!-- /PAGINATION -->
+
+
+ </div>
+ </c:when>
+ <c:otherwise>
+
+ </c:otherwise>
+
+ </c:choose>
+ </div>
+
+ </div>
+ <div class="span4 col-md-4 no-padding">
+ <jsp:include page="/pages/shop/common/customer/customerProfileMenu.jsp" />
+ <jsp:include page="/pages/shop/common/customer/customerOrdersMenu.jsp" />
+ </div>
+
+
+
+
+
+ </div>
+ <!-- close row-fluid-->
+ </div>
<!--close .container "main-content" -->
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/common/customer/register.jsp b/sm-shop/src/main/webapp/pages/shop/common/customer/register.jsp
index 2d6dfd2..66105e6 100644
--- a/sm-shop/src/main/webapp/pages/shop/common/customer/register.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/common/customer/register.jsp
@@ -1,213 +1,212 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-
-<!-- requires functions.jsp -->
-<script src="<c:url value="/resources/js/jquery.maskedinput.min.js" />"></script>
-<script src="<c:url value="/resources/js/shop-customer.js" />"></script>
-<script src="<c:url value="/resources/js/address.js" />"></script>
-
-
-<script type="text/javascript">
-
-
-$(document).ready(function() {
-
-
-
- getZones($('#registration_country').val(),'<c:out value="${customer.billing.zone}" />',isFormValid);
- $("#hidden_zones").hide();
- $("#registration_country").change(function() {
- getZones($(this).val(),'<c:out value="${customer.billing.zone}" />',isFormValid);
- })
-
-
- isFormValid();
- $("input[type='text']").on("change keyup paste", function(){
- isFormValid();
- });
-
- $("input[type='password']").on("change keyup paste", function(){
- isFormValid();
- });
-
- $("#registration_country").change(function() {
- isFormValid();
- });
-
-});
-
-
-function isFormValid() {
-
- if($('.alert-error').is(":visible")) {
- return true;
- }
-
- if($('.alert-success').is(":visible")) {
- return true;
- }
-
- $('#registrationError').hide();//reset error message
- var msg = isCustomerFormValid($('#registrationForm'));
-
- if(msg!=null) {//disable submit button
- $('#submitRegistration').addClass('btn-disabled');
- $('#submitRegistration').prop('disabled', true);
- $('#registrationError').html(msg);
- $('#registrationError').show();
- return false;
- } else {
- $('#submitRegistration').removeClass('btn-disabled');
- $('#submitRegistration').prop('disabled', false);
- $('#registrationError').hide();
- return true;
- }
-}
-
-
-
-
- </script>
-
-
-
-<c:set var="register_url" value="${pageContext.request.contextPath}/shop/customer/register.html"/>
-
- <div id="main-content" class="container clearfix row-fluid">
- <div id="registrationError" class="alert alert-warning common-row" style="display:none;"></div>
- <div class="span7 col-md-7 no-padding">
- <form:form method="post" action="${register_url}" id="registrationForm" class="form-horizontal" commandName="customer">
- <form:errors path="*" cssClass="alert alert-error alert-danger form-group" element="div" />
- <fieldset>
- <div class="control-group form-group">
- <label class="required control-label" for="FirstNameRegister"><s:message code="label.generic.firstname" text="First Name"/></label>
- <div class="controls">
- <s:message code="NotEmpty.customer.firstName" text="First name is required" var="msgFirstName"/>
- <form:input path="billing.firstName" cssClass="span8 required input form-control form-control-md" id="firstName" title="${msgFirstName}"/>
- <form:errors path="billing.firstName" cssClass="error" />
-
- </div>
- </div>
- <div class="control-group form-group">
- <label class="required control-label" for="LastNameRegister"><s:message code="label.generic.lastname" text="Last Name"/></label>
- <div class="controls">
- <s:message code="NotEmpty.customer.lastName" text="Last name is required" var="msgLastName"/>
- <form:input path="billing.lastName" cssClass="span8 required form-control form-control-md" id="lastName" title="${msgLastName}"/>
- <form:errors path="billing.lastName" cssClass="error" />
-
- </div>
- </div>
-
- <div class="control-group form-group">
- <label class="required control-label" for="sex"><s:message code="label.generic.genre" text="Genre"/></label>
- <div class="controls">
- <form:select path="gender" class="form-control form-control-lg">
- <form:option value="M"><s:message code="label.generic.male" text="Male"/></form:option>
- <form:option value="F"><s:message code="label.generic.female" text="Female"/></form:option>
- </form:select>
- <form:errors path="gender" cssClass="error" />
- </div>
- </div>
-
- <div class="control-group form-group">
- <label class="control-label required"><s:message code="label.generic.country" text="Country"/></label>
- <div class="controls">
- <form:select path="billing.country" class="form-control form-control-lg" id="registration_country">
- <form:options items="${countryList}" itemValue="isoCode" itemLabel="name"/>
- </form:select>
- </div>
- </div>
-
-
-
- <div class="control-group form-group">
- <label class="control-label required"><s:message code="label.generic.stateprovince" text="State / Province"/></label>
- <div class="controls">
- <s:message code="NotEmpty.customer.billing.stateProvince" text="State / Province is required" var="msgStateProvince"/>
- <form:select path="billing.zone" id="customer_zones" class="form-control form-control-lg">
- </form:select>
- <form:input path="billing.stateProvince" cssClass="span8 required form-control form-control-md" id="hidden_zones" title="${msgStateProvince}"/>
- </div>
- </div>
-
-
- <div class="control-group form-group">
- <label class="required control-label" for="username"><s:message code="label.generic.username" text="User name" /></label>
- <div class="controls">
- <s:message code="NotEmpty.customer.userName" text="User name is required" var="msgUserName"/>
- <form:input path="userName" cssClass="span8 required userName form-control form-control-md" id="userName" title="${msgUserName}"/>
- <form:errors path="userName" cssClass="error" />
- </div>
- </div>
-
-
-
- <div class="control-group form-group">
- <label class="required control-label" for="email"><s:message code="label.generic.email" text="Email address"/></label>
- <div class="controls">
- <s:message code="NotEmpty.customer.emailAddress" text="Email address is required" var="msgEmail"/>
- <form:input path="emailAddress" cssClass="span8 required email form-control form-control-md" id="email" title="${msgEmail}"/>
- <form:errors path="emailAddress" cssClass="error" />
-
- </div>
- </div>
-
- <div class="control-group form-group">
- <label class="required control-label" for="password"><s:message code="label.generic.password" text="Password"/></label>
- <div class="controls">
- <s:message code="message.password.required" text="Password is required" var="msgPassword"/>
- <form:password path="password" class="span8 required password form-control form-control-md" id="password" title="${msgPassword}"/>
- <form:errors path="password" cssClass="error" />
- </div>
- </div>
-
- <div class="control-group form-group">
- <label class="required control-label" for="passwordAgain"><s:message code="label.generic.repeatpassword" text="Repeat password"/></label>
- <div class="controls">
- <s:message code="message.password.repeat.required" text="Repeated password is required" var="msgRepeatPassword"/>
- <form:password path="checkPassword" class="span8 required checkPassword form-control form-control-md" id="passwordAgain" title="${msgRepeatPassword}"/>
- <form:errors path="checkPassword" cssClass="error" />
- </div>
- </div>
-
- <div class="control-group form-group">
- <div class="controls">
-
- <script src="https://www.google.com/recaptcha/api.js?hl=<c:out value="${requestScope.LANGUAGE.code}"/>" async defer></script>
-
- <div class="g-recaptcha" data-sitekey="<c:out value="${recapatcha_public_key}"/>"></div>
-
- </div>
- </div>
-
- <div class="form-actions">
- <input id="submitRegistration" type="submit" value="<s:message code="label.generic.register" text="Register"/>" name="register" class="btn btn-large">
- </div>
- </fieldset>
- </form:form>
- <!-- end registration form-->
-
- </div>
- <!--close .span7-->
-
- <div id="why-join" class="span4 offset1 col-md-5">
- <h3 class="short_headline"><span><s:message code="label.register.whyregister" text="Why register?" /></span></h3>
- <p>
- <s:message code="label.register.registerreasons" text="Simplify a checkout process by having your information pre-filed, re-order an item from one click and get access to premium information." />
- </p>
- </div>
- </div>
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+<!-- requires functions.jsp -->
+<script src="<c:url value="/resources/js/jquery.maskedinput.min.js" />"></script>
+<script src="<c:url value="/resources/js/shop-customer.js" />"></script>
+<script src="<c:url value="/resources/js/address.js" />"></script>
+
+
+<script type="text/javascript">
+
+
+$(document).ready(function() {
+
+
+
+ getZones($('#registration_country').val(),'<c:out value="${customer.billing.zone}" />',isFormValid);
+ $("#hidden_zones").hide();
+ $("#registration_country").change(function() {
+ getZones($(this).val(),'<c:out value="${customer.billing.zone}" />',isFormValid);
+ })
+
+
+ isFormValid();
+ $("input[type='text']").on("change keyup paste", function(){
+ isFormValid();
+ });
+
+ $("input[type='password']").on("change keyup paste", function(){
+ isFormValid();
+ });
+
+ $("#registration_country").change(function() {
+ isFormValid();
+ });
+
+});
+
+
+function isFormValid() {
+
+ if($('.alert-error').is(":visible")) {
+ return true;
+ }
+
+ if($('.alert-success').is(":visible")) {
+ return true;
+ }
+
+ $('#registrationError').hide();//reset error message
+ var msg = isCustomerFormValid($('#registrationForm'));
+
+ if(msg!=null) {//disable submit button
+ $('#submitRegistration').addClass('btn-disabled');
+ $('#submitRegistration').prop('disabled', true);
+ $('#registrationError').html(msg);
+ $('#registrationError').show();
+ return false;
+ } else {
+ $('#submitRegistration').removeClass('btn-disabled');
+ $('#submitRegistration').prop('disabled', false);
+ $('#registrationError').hide();
+ return true;
+ }
+}
+
+
+
+
+ </script>
+
+
+
+<c:set var="register_url" value="${pageContext.request.contextPath}/shop/customer/register.html"/>
+
+ <div id="main-content" class="container clearfix row-fluid">
+ <div id="registrationError" class="alert alert-warning common-row" style="display:none;"></div>
+ <div class="span7 col-md-7 no-padding">
+ <form:form method="post" action="${register_url}" id="registrationForm" class="form-horizontal" commandName="customer">
+ <form:errors path="*" cssClass="alert alert-error alert-danger form-group" element="div" />
+ <fieldset>
+ <div class="control-group form-group">
+ <label class="required control-label" for="FirstNameRegister"><s:message code="label.generic.firstname" text="First Name"/></label>
+ <div class="controls">
+ <s:message code="NotEmpty.customer.firstName" text="First name is required" var="msgFirstName"/>
+ <form:input path="billing.firstName" cssClass="span8 required input form-control form-control-md" id="firstName" title="${msgFirstName}"/>
+ <form:errors path="billing.firstName" cssClass="error" />
+
+ </div>
+ </div>
+ <div class="control-group form-group">
+ <label class="required control-label" for="LastNameRegister"><s:message code="label.generic.lastname" text="Last Name"/></label>
+ <div class="controls">
+ <s:message code="NotEmpty.customer.lastName" text="Last name is required" var="msgLastName"/>
+ <form:input path="billing.lastName" cssClass="span8 required form-control form-control-md" id="lastName" title="${msgLastName}"/>
+ <form:errors path="billing.lastName" cssClass="error" />
+
+ </div>
+ </div>
+
+ <div class="control-group form-group">
+ <label class="required control-label" for="sex"><s:message code="label.generic.genre" text="Genre"/></label>
+ <div class="controls">
+ <form:select path="gender" class="form-control form-control-lg">
+ <form:option value="M"><s:message code="label.generic.male" text="Male"/></form:option>
+ <form:option value="F"><s:message code="label.generic.female" text="Female"/></form:option>
+ </form:select>
+ <form:errors path="gender" cssClass="error" />
+ </div>
+ </div>
+
+ <div class="control-group form-group">
+ <label class="control-label required"><s:message code="label.generic.country" text="Country"/></label>
+ <div class="controls">
+ <form:select path="billing.country" class="form-control form-control-lg" id="registration_country">
+ <form:options items="${countryList}" itemValue="isoCode" itemLabel="name"/>
+ </form:select>
+ </div>
+ </div>
+
+
+
+ <div class="control-group form-group">
+ <label class="control-label required"><s:message code="label.generic.stateprovince" text="State / Province"/></label>
+ <div class="controls">
+ <s:message code="NotEmpty.customer.billing.stateProvince" text="State / Province is required" var="msgStateProvince"/>
+ <form:select path="billing.zone" id="customer_zones" class="form-control form-control-lg">
+ </form:select>
+ <form:input path="billing.stateProvince" cssClass="span8 required form-control form-control-md" id="hidden_zones" title="${msgStateProvince}"/>
+ </div>
+ </div>
+
+
+ <div class="control-group form-group">
+ <label class="required control-label" for="username"><s:message code="label.generic.username" text="User name" /></label>
+ <div class="controls">
+ <s:message code="NotEmpty.customer.userName" text="User name is required" var="msgUserName"/>
+ <form:input path="userName" cssClass="span8 required userName form-control form-control-md" id="userName" title="${msgUserName}"/>
+ <form:errors path="userName" cssClass="error" />
+ </div>
+ </div>
+
+
+
+ <div class="control-group form-group">
+ <label class="required control-label" for="email"><s:message code="label.generic.email" text="Email address"/></label>
+ <div class="controls">
+ <s:message code="NotEmpty.customer.emailAddress" text="Email address is required" var="msgEmail"/>
+ <form:input path="emailAddress" cssClass="span8 required email form-control form-control-md" id="email" title="${msgEmail}"/>
+ <form:errors path="emailAddress" cssClass="error" />
+ </div>
+ </div>
+
+ <div class="control-group form-group">
+ <label class="required control-label" for="password"><s:message code="label.generic.password" text="Password"/></label>
+ <div class="controls">
+ <s:message code="message.password.required" text="Password is required" var="msgPassword"/>
+ <form:password path="password" class="span8 required password form-control form-control-md" id="password" title="${msgPassword}"/>
+ <form:errors path="password" cssClass="error" />
+ </div>
+ </div>
+
+ <div class="control-group form-group">
+ <label class="required control-label" for="passwordAgain"><s:message code="label.generic.repeatpassword" text="Repeat password"/></label>
+ <div class="controls">
+ <s:message code="message.password.repeat.required" text="Repeated password is required" var="msgRepeatPassword"/>
+ <form:password path="checkPassword" class="span8 required checkPassword form-control form-control-md" id="passwordAgain" title="${msgRepeatPassword}"/>
+ <form:errors path="checkPassword" cssClass="error" />
+ </div>
+ </div>
+
+ <div class="control-group form-group">
+ <div class="controls">
+
+ <script src="https://www.google.com/recaptcha/api.js?hl=<c:out value="${requestScope.LANGUAGE.code}"/>" async defer></script>
+
+ <div class="g-recaptcha" data-sitekey="<c:out value="${recapatcha_public_key}"/>"></div>
+
+ </div>
+ </div>
+
+ <div class="form-actions">
+ <input id="submitRegistration" type="submit" value="<s:message code="label.generic.register" text="Register"/>" name="register" class="btn btn-large template-btn">
+ </div>
+ </fieldset>
+ </form:form>
+ <!-- end registration form-->
+
+ </div>
+ <!--close .span7-->
+
+ <div id="why-join" class="span4 offset1 col-md-5">
+ <h3 class="short_headline"><span><s:message code="label.register.whyregister" text="Why register?" /></span></h3>
+ <p>
+ <s:message code="label.register.registerreasons" text="Simplify a checkout process by having your information pre-filed, re-order an item from one click and get access to premium information." />
+ </p>
+ </div>
+ </div>
<!--close .container "main-content" -->
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/common/merchant/contactus.jsp b/sm-shop/src/main/webapp/pages/shop/common/merchant/contactus.jsp
index 4103341..2f53c0d 100644
--- a/sm-shop/src/main/webapp/pages/shop/common/merchant/contactus.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/common/merchant/contactus.jsp
@@ -17,7 +17,7 @@ response.setDateHeader ("Expires", -1);
<!--Set google map API key -->
<c:if test="${requestScope.CONFIGS['displayStoreAddress'] == true}">
<script type="text/javascript"
- src="https://maps.googleapis.com/maps/api/js?sensor=true">
+ src="https://maps.googleapis.com/maps/api/js?key=<sm:config configurationCode="shopizer.googlemaps_key" />&sensor=true">
</script>
</c:if>
@@ -42,7 +42,8 @@ $(document).ready(function() {
function sendContact(){
- $('#pageContainer').showLoading();
+ //$('#pageContainer').showLoading();
+ showSMLoading('#pageContainer');
$(".alert-error").hide();
$(".alert-success").hide();
var data = $('#contactForm').serialize();
@@ -55,7 +56,8 @@ function sendContact(){
dataType: 'json',
success: function(response){
- $('#pageContainer').hideLoading();
+ //$('#pageContainer').hideLoading();
+ hideSMLoading('#pageContainer');
if(response.errorMessage!=null && response.errorMessage!='') {
$(".alert-error").show();
$(".alert-success").hide();
@@ -66,7 +68,8 @@ function sendContact(){
$(".alert-success").show();
},
error: function(xhr, textStatus, errorThrown) {
- $('#pageContainer').hideLoading();
+ //$('#pageContainer').hideLoading();
+ hideSMLoading('#pageContainer');
alert('error ' + errorThrown);
}
@@ -188,7 +191,7 @@ function sendContact(){
<!-- CUSTOM CONTENT -->
- <div class="row-fluid common-row">
+ <div class="row-fluid common-row" style="margin-top:30px;">
<div class="contactMapCanvas" id="map_canvas" style="width:600px; height:300px"></div>
</div>
@@ -234,7 +237,7 @@ var address = '<c:out value="${requestScope.MERCHANT_STORE.storeaddress}"/> <c:o
if(address!=null) {
geocoder = new google.maps.Geocoder();
var mapOptions = {
- zoom: 8,
+ zoom: 10,
mapTypeId: google.maps.MapTypeId.ROADMAP
}
map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
diff --git a/sm-shop/src/main/webapp/pages/shop/common/notFound.jsp b/sm-shop/src/main/webapp/pages/shop/common/notFound.jsp
index 87dd4eb..9417d9a 100644
--- a/sm-shop/src/main/webapp/pages/shop/common/notFound.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/common/notFound.jsp
@@ -1,29 +1,29 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-
-
-
- <table class="container">
- <tr>
- <td width="60"><img src="<c:url value="/resources/img/important-icon.png"/>" width="50"></td>
- <td valign="middle"><h3><s:message code="message.resource.notfound" text="Page not found"/></h3></td>
- </tr>
- </table>
-
-
-
-
-
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+
+
+ <table class="container">
+ <tr>
+ <td width="60"><img src="<c:url value="/resources/img/important-icon.png"/>" width="50"></td>
+ <td valign="middle"><h3><s:message code="message.resource.notfound" text="Page not found"/></h3></td>
+ </tr>
+ </table>
+
+
+
+
+
diff --git a/sm-shop/src/main/webapp/pages/shop/common/preBuiltBlocks/customerAddress.jsp b/sm-shop/src/main/webapp/pages/shop/common/preBuiltBlocks/customerAddress.jsp
index a0a4478..30c371c 100644
--- a/sm-shop/src/main/webapp/pages/shop/common/preBuiltBlocks/customerAddress.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/common/preBuiltBlocks/customerAddress.jsp
@@ -1,37 +1,37 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-
-
- <address>
- <c:choose>
- <c:when test="${not empty requestScope.address.company}">
- ${requestScope.address.company}<br/>
- </c:when>
- <c:otherwise>
- ${requestScope.address.firstName} ${requestScope.address.lastName}<br />
- </c:otherwise>
- </c:choose>
-
-
- <c:if test="${not empty requestScope.address.address}"> ${requestScope.address.address} <br />
- </c:if>
-
-
- <c:if test="${not empty requestScope.address.city}">${requestScope.address.city} <br />
- </c:if>
- <c:choose><c:when test="${not empty requestScope.address.stateProvince}"><c:out value="${requestScope.address.stateProvince}"/></c:when><c:otherwise><script>$.ajax({url: "<c:url value="/shop/reference/zoneName"/>",type: "GET",data: "zoneCode=${requestScope.address.zone}",success: function(data){$('#zone<c:out value="${requestScope.addressType}"/>').html(data)}})</script><span id="zone<c:out value="${requestScope.addressType}"/>"><c:out value="${requestScope.address.zone}"/></span></c:otherwise></c:choose>,
-
- <c:if test="${not empty requestScope.address.country}">
- <span id="country<c:out value="${requestScope.addressType}"/>"><script>$.ajax({url: "<c:url value="/shop/reference/countryName"/>",type: "GET",data: "countryCode=${requestScope.address.country}",success: function(data){$('#country<c:out value="${requestScope.addressType}"/>').html(data)}})</script></span><br/>
- </c:if>
- <c:if test="${not empty requestScope.address.postalCode}"> ${requestScope.address.postalCode}<br />
- </c:if>
- <c:if test="${not empty requestScope.address.phone}">${requestScope.address.phone}</c:if>
-
-
- </address>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+
+
+ <address>
+ <c:choose>
+ <c:when test="${not empty requestScope.address.company}">
+ ${requestScope.address.company}<br/>
+ </c:when>
+ <c:otherwise>
+ ${requestScope.address.firstName} ${requestScope.address.lastName}<br />
+ </c:otherwise>
+ </c:choose>
+
+
+ <c:if test="${not empty requestScope.address.address}"> ${requestScope.address.address} <br />
+ </c:if>
+
+
+ <c:if test="${not empty requestScope.address.city}">${requestScope.address.city} <br />
+ </c:if>
+ <c:choose><c:when test="${not empty requestScope.address.stateProvince}"><c:out value="${requestScope.address.stateProvince}"/></c:when><c:otherwise><script>$.ajax({url: "<c:url value="/shop/reference/zoneName"/>",type: "GET",data: "zoneCode=${requestScope.address.zone}",success: function(data){$('#zone<c:out value="${requestScope.addressType}"/>').html(data)}})</script><span id="zone<c:out value="${requestScope.addressType}"/>"><c:out value="${requestScope.address.zone}"/></span></c:otherwise></c:choose>,
+
+ <c:if test="${not empty requestScope.address.country}">
+ <span id="country<c:out value="${requestScope.addressType}"/>"><script>$.ajax({url: "<c:url value="/shop/reference/countryName"/>",type: "GET",data: "countryCode=${requestScope.address.country}",success: function(data){$('#country<c:out value="${requestScope.addressType}"/>').html(data)}})</script></span><br/>
+ </c:if>
+ <c:if test="${not empty requestScope.address.postalCode}"> ${requestScope.address.postalCode}<br />
+ </c:if>
+ <c:if test="${not empty requestScope.address.phone}">${requestScope.address.phone}</c:if>
+
+
+ </address>
diff --git a/sm-shop/src/main/webapp/pages/shop/common/preBuiltBlocks/storeAddress.jsp b/sm-shop/src/main/webapp/pages/shop/common/preBuiltBlocks/storeAddress.jsp
index 57279d4..821698a 100644
--- a/sm-shop/src/main/webapp/pages/shop/common/preBuiltBlocks/storeAddress.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/common/preBuiltBlocks/storeAddress.jsp
@@ -1,21 +1,21 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-
-
- <address>
- <div itemscope itemtype="http://schema.org/Organization">
- <strong><span itemprop="name"><c:out value="${requestScope.MERCHANT_STORE.storename}"/></span></strong><br/>
- <div itemprop="address" itemscope itemtype="http://schema.org/PostalAddress">
- <span itemprop="streetAddress"><c:out value="${requestScope.MERCHANT_STORE.storeaddress}"/> <c:out value="${requestScope.MERCHANT_STORE.storecity}"/></span><br/>
- <span itemprop="addressLocality"><c:choose><c:when test="${not empty requestScope.MERCHANT_STORE.storestateprovince}"><c:out value="${requestScope.MERCHANT_STORE.storestateprovince}"/></c:when><c:otherwise><script>$.ajax({url: "<c:url value="/shop/reference/zoneName"/>",type: "GET",data: "zoneCode=${requestScope.MERCHANT_STORE.zone.code}",success: function(data){$('#storeZoneName').html(data)}})</script><span id="storeZoneName"><c:out value="${requestScope.MERCHANT_STORE.zone.code}"/></span></c:otherwise></c:choose>,
- <span id="storeCountryName"><script>$.ajax({url: "<c:url value="/shop/reference/countryName"/>",type: "GET",data: "countryCode=${requestScope.MERCHANT_STORE.country.isoCode}",success: function(data){$('#storeCountryName').html(data)}})</script></span></span><br/>
- <span itemprop="postalCode"><c:out value="${requestScope.MERCHANT_STORE.storepostalcode}"/></span><br/>
- <abbr title="Phone"><s:message code="label.generic.phone" text="Phone" /></abbr>: <span itemprop="telephone"><c:out value="${requestScope.MERCHANT_STORE.storephone}"/></span>
- </div>
- </div>
- </address>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+
+
+ <address>
+ <div itemscope itemtype="http://schema.org/Organization">
+ <strong><span itemprop="name"><c:out value="${requestScope.MERCHANT_STORE.storename}"/></span></strong><br/>
+ <div itemprop="address" itemscope itemtype="http://schema.org/PostalAddress">
+ <span itemprop="streetAddress"><c:out value="${requestScope.MERCHANT_STORE.storeaddress}"/> <c:out value="${requestScope.MERCHANT_STORE.storecity}"/></span><br/>
+ <span itemprop="addressLocality"><c:choose><c:when test="${not empty requestScope.MERCHANT_STORE.storestateprovince}"><c:out value="${requestScope.MERCHANT_STORE.storestateprovince}"/></c:when><c:otherwise><script>$.ajax({url: "<c:url value="/shop/reference/zoneName"/>",type: "GET",data: "zoneCode=${requestScope.MERCHANT_STORE.zone.code}",success: function(data){$('#storeZoneName').html(data)}})</script><span id="storeZoneName"><c:out value="${requestScope.MERCHANT_STORE.zone.code}"/></span></c:otherwise></c:choose>,
+ <span id="storeCountryName"><script>$.ajax({url: "<c:url value="/shop/reference/countryName"/>",type: "GET",data: "countryCode=${requestScope.MERCHANT_STORE.country.isoCode}",success: function(data){$('#storeCountryName').html(data)}})</script></span></span><br/>
+ <span itemprop="postalCode"><c:out value="${requestScope.MERCHANT_STORE.storepostalcode}"/></span><br/>
+ <abbr title="Phone"><s:message code="label.generic.phone" text="Phone" /></abbr>: <span itemprop="telephone"><c:out value="${requestScope.MERCHANT_STORE.storephone}"/></span>
+ </div>
+ </div>
+ </address>
diff --git a/sm-shop/src/main/webapp/pages/shop/common/timeout.jsp b/sm-shop/src/main/webapp/pages/shop/common/timeout.jsp
index 7e89ef6..775ff39 100644
--- a/sm-shop/src/main/webapp/pages/shop/common/timeout.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/common/timeout.jsp
@@ -1,29 +1,29 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-
-
-
- <table class="container">
- <tr>
- <td width="60"><img src="<c:url value="/resources/img/important-icon.png"/>" width="50"></td>
- <td valign="middle"><h3><s:message code="message.timeout" text="The request timed out"/></h3></td>
- </tr>
- </table>
-
-
-
-
-
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+
+
+ <table class="container">
+ <tr>
+ <td width="60"><img src="<c:url value="/resources/img/important-icon.png"/>" width="50"></td>
+ <td valign="middle"><h3><s:message code="message.timeout" text="The request timed out"/></h3></td>
+ </tr>
+ </table>
+
+
+
+
+
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/catalogLayout.jsp b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/catalogLayout.jsp
index d776910..40cf819 100644
--- a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/catalogLayout.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/catalogLayout.jsp
@@ -1,56 +1,56 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
- <%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-
- <c:set var="lang" scope="request" value="${requestScope.locale.language}"/>
-
-
- <html xmlns="http://www.w3.org/1999/xhtml">
-
-
- <head>
- <meta charset="utf-8">
- <title><c:out value="${requestScope.PAGE_INFORMATION.pageTitle}" /></title>
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <meta name="description" content="<c:out value="${requestScope.PAGE_INFORMATION.pageDescription}" />">
- <meta name="author" content="<c:out value="${requestScope.MERCHANT_STORE.storename}"/>">
-
-
- <jsp:include page="/pages/shop/templates/bootstrap/sections/shopLinks.jsp" />
- </head>
-
- <body>
-
- <div id="pageContainer" class="container">
- <tiles:insertAttribute name="header" ignore="true"/>
-
- <tiles:insertAttribute name="navbar" ignore="true"/>
-
- <tiles:insertAttribute name="body" ignore="true"/>
-
- <tiles:insertAttribute name="footer" ignore="true"/>
- </div>
- <!-- end container -->
- <jsp:include page="/pages/shop/templates/bootstrap/sections/jsLinks.jsp" />
-
- </body>
-
- </html>
-
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+ <%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
+ <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+
+ <c:set var="lang" scope="request" value="${requestScope.locale.language}"/>
+
+
+ <html xmlns="http://www.w3.org/1999/xhtml">
+
+
+ <head>
+ <meta charset="utf-8">
+ <title><c:out value="${requestScope.PAGE_INFORMATION.pageTitle}" /></title>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="<c:out value="${requestScope.PAGE_INFORMATION.pageDescription}" />">
+ <meta name="author" content="<c:out value="${requestScope.MERCHANT_STORE.storename}"/>">
+
+
+ <jsp:include page="/pages/shop/templates/bootstrap/sections/shopLinks.jsp" />
+ </head>
+
+ <body>
+
+ <div id="pageContainer" class="container">
+ <tiles:insertAttribute name="header" ignore="true"/>
+
+ <tiles:insertAttribute name="navbar" ignore="true"/>
+
+ <tiles:insertAttribute name="body" ignore="true"/>
+
+ <tiles:insertAttribute name="footer" ignore="true"/>
+ </div>
+ <!-- end container -->
+ <jsp:include page="/pages/shop/templates/bootstrap/sections/jsLinks.jsp" />
+
+ </body>
+
+ </html>
+
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/pages/category.jsp b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/pages/category.jsp
index 2a71358..06fc310 100644
--- a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/pages/category.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/pages/category.jsp
@@ -1,219 +1,219 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-
- <script src="<c:url value="/resources/js/jquery.easing.1.3.js" />"></script>
- <script src="<c:url value="/resources/js/jquery.quicksand.js" />"></script>
- <script src="<c:url value="/resources/js/jquery-sort-filter-plugin.js" />"></script>
-
-
-
- <script>
-
- var START_COUNT_PRODUCTS = 0;
- var MAX_PRODUCTS = 16;
- var filter = null;
- var filterValue = null;
-
- $(function(){
-
- $('#filter').on('change', function() {
- var orderBy = getOrderBy();
- orderProducts(orderBy);
- });
-
- loadCategoryProducts();
-
- });
-
-
- <jsp:include page="/pages/shop/templates/bootstrap/sections/shop-listing.jsp" />
-
-
- function orderProducts(attribute) {
-
-
- if(attribute=='item-order') {
- return;
- }
-
- // get the first collection
- var $prods = $('#productsContainer');
-
- // clone applications to get a second collection
- var $data = $prods.clone();
-
- var $filteredData = $data.find('li');
- var $sortedData = $filteredData.sorted({
- by: function(v) {
- if(attribute=='item-price') {
- return parseFloat($(v).attr(attribute));
- } else {
- return $(v).attr(attribute);
- }
- }
- });
-
- // finally, call quicksand
- $prods.quicksand($sortedData, {
- duration: 800,
- easing: 'easeInOutQuad'
- });
-
-
- }
-
- function loadCategoryProducts() {
- var url = '<%=request.getContextPath()%>/services/public/products/page/' + START_COUNT_PRODUCTS + '/' + MAX_PRODUCTS + '/<c:out value="${requestScope.MERCHANT_STORE.code}"/>/<c:out value="${requestScope.LANGUAGE.code}"/>/<c:out value="${category.description.friendlyUrl}"/>';
-
- if(filter!=null) {
- url = url + '/filter=' + filter + '/filter-value=' + filterValue +'';
- }
- loadProducts(url,'#productsContainer');
- }
-
-
- function filterCategory(filterType,filterVal) {
- //reset product section
- $('#productsContainer').html('');
- START_COUNT_PRODUCTS = 0;
- filter = filterType;
- filterValue = filterVal;
- loadCategoryProducts();
- }
-
- function callBackLoadProducts(productList) {
- totalCount = productList.productCount;
- START_COUNT_PRODUCTS = START_COUNT_PRODUCTS + MAX_PRODUCTS;
- if(START_COUNT_PRODUCTS < totalCount) {
- $("#button_nav").show();
- } else {
- $("#button_nav").hide();
- }
- $('#productsContainer').hideLoading();
-
- //check option
- var orderBy = getOrderBy();
- orderProducts(orderBy);
-
- var productQty = productList.productCount + ' <s:message code="label.search.items.found" text="item(s) found" />';
- $('#products-qty').html(productQty);
-
- }
-
- function getOrderBy() {
- var orderBy = $("#filter").val();
- return orderBy;
- }
-
-
-
-
-</script>
-
- <jsp:include page="/pages/shop/templates/bootstrap/sections/breadcrumb.jsp" />
-
- <c:if test="${category.description.description!=null}">
- <!-- category description -->
- <div class="row-fluid">
- <p>
- <c:out value="${category.description.description}"/>
- </p>
- </div>
-
- </c:if>
-
- <div class="row-fluid">
-
-
- <div class="span12">
-
-
-
- <!-- left column -->
- <div class="span3">
- <div class="sidebar-nav">
-
-
- <br/>
-
- <ul class="nav nav-list">
- <c:if test="${parent!=null}">
- <li class="nav-header"><c:out value="${parent.description.name}" /></li>
- </c:if>
- <c:forEach items="${subCategories}" var="subCategory">
- <li>
- <a href="<c:url value="/shop/category/${subCategory.description.friendlyUrl}.html"/><sm:breadcrumbParam categoryId="${subCategory.id}"/>"><c:out value="${subCategory.description.name}" />
- <c:if test="${subCategory.productCount>0}"> <span class="countItems">(<c:out value="${subCategory.productCount}" />)</span></c:if></a></li>
- </c:forEach>
- </ul>
- </div>
-
- <c:if test="${fn:length(manufacturers) > 0}">
- <br/>
- <div class="sidebar-nav">
- <ul class="nav nav-list">
- <li class="nav-header"><s:message code="label.manufacturer.brand" text="Brands" /></li>
- <c:forEach items="${manufacturers}" var="manufacturer">
- <li>
- <a href="javascript:filterCategory('BRAND','${manufacturer.id}')"><c:out value="${manufacturer.description.name}" /></a></li>
- </c:forEach>
- </ul>
- </div>
- </c:if>
-
-
- </div><!--/span-->
-
- <!-- right column -->
- <div class="span9">
- <p class="lead"><c:out value="${category.description.name}" /></p>
- <div class="products-title row-fluid">
- <div class="span6">
- <p><div id="products-qty"></div></p>
- </div>
- <div class="span6">
- <div class="pull-right">
- <p>
- <ul class="nav nav-list">
- <li class="widget-header"><s:message code="label.generic.sortby" text="Sort by" />:
- <select id="filter">
- <option value="item-order"><s:message code="label.generic.default" text="Default" /></option>
- <option value="item-name"><s:message code="label.generic.name" text="Name" /></option>
- <option value="item-price"><s:message code="label.generic.price" text="Price" /></option>
- </select>
- </li>
- </ul>
- </p>
- </div>
- </div>
- </div>
-
-
- <!-- just copy that block for havimg products displayed -->
- <!-- products are loaded by ajax -->
- <ul id="productsContainer" class="thumbnails product-list"></ul>
-
- <nav id="button_nav" style="text-align:center;display:none;">
- <button class="btn btn-large" style="width:400px;" onClick="loadCategoryProducts();"><s:message code="label.product.moreitems" text="Display more items" />...</button>
- </nav>
- <span id="end_nav" style="display:none;"><s:message code="label.product.nomoreitems" text="No more items to be displayed" /></span>
- <!-- end block -->
-
- </div><!--/span-->
-
- </div><!-- 12 -->
-
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+ <script src="<c:url value="/resources/js/jquery.easing.1.3.js" />"></script>
+ <script src="<c:url value="/resources/js/jquery.quicksand.js" />"></script>
+ <script src="<c:url value="/resources/js/jquery-sort-filter-plugin.js" />"></script>
+
+
+
+ <script>
+
+ var START_COUNT_PRODUCTS = 0;
+ var MAX_PRODUCTS = 16;
+ var filter = null;
+ var filterValue = null;
+
+ $(function(){
+
+ $('#filter').on('change', function() {
+ var orderBy = getOrderBy();
+ orderProducts(orderBy);
+ });
+
+ loadCategoryProducts();
+
+ });
+
+
+ <jsp:include page="/pages/shop/templates/bootstrap/sections/shop-listing.jsp" />
+
+
+ function orderProducts(attribute) {
+
+
+ if(attribute=='item-order') {
+ return;
+ }
+
+ // get the first collection
+ var $prods = $('#productsContainer');
+
+ // clone applications to get a second collection
+ var $data = $prods.clone();
+
+ var $filteredData = $data.find('li');
+ var $sortedData = $filteredData.sorted({
+ by: function(v) {
+ if(attribute=='item-price') {
+ return parseFloat($(v).attr(attribute));
+ } else {
+ return $(v).attr(attribute);
+ }
+ }
+ });
+
+ // finally, call quicksand
+ $prods.quicksand($sortedData, {
+ duration: 800,
+ easing: 'easeInOutQuad'
+ });
+
+
+ }
+
+ function loadCategoryProducts() {
+ var url = '<%=request.getContextPath()%>/services/public/products/page/' + START_COUNT_PRODUCTS + '/' + MAX_PRODUCTS + '/<c:out value="${requestScope.MERCHANT_STORE.code}"/>/<c:out value="${requestScope.LANGUAGE.code}"/>/<c:out value="${category.description.friendlyUrl}"/>';
+
+ if(filter!=null) {
+ url = url + '/filter=' + filter + '/filter-value=' + filterValue +'';
+ }
+ loadProducts(url,'#productsContainer');
+ }
+
+
+ function filterCategory(filterType,filterVal) {
+ //reset product section
+ $('#productsContainer').html('');
+ START_COUNT_PRODUCTS = 0;
+ filter = filterType;
+ filterValue = filterVal;
+ loadCategoryProducts();
+ }
+
+ function callBackLoadProducts(productList) {
+ totalCount = productList.productCount;
+ START_COUNT_PRODUCTS = START_COUNT_PRODUCTS + MAX_PRODUCTS;
+ if(START_COUNT_PRODUCTS < totalCount) {
+ $("#button_nav").show();
+ } else {
+ $("#button_nav").hide();
+ }
+ $('#productsContainer').hideLoading();
+
+ //check option
+ var orderBy = getOrderBy();
+ orderProducts(orderBy);
+
+ var productQty = productList.productCount + ' <s:message code="label.search.items.found" text="item(s) found" />';
+ $('#products-qty').html(productQty);
+
+ }
+
+ function getOrderBy() {
+ var orderBy = $("#filter").val();
+ return orderBy;
+ }
+
+
+
+
+</script>
+
+ <jsp:include page="/pages/shop/templates/bootstrap/sections/breadcrumb.jsp" />
+
+ <c:if test="${category.description.description!=null}">
+ <!-- category description -->
+ <div class="row-fluid">
+ <p>
+ <c:out value="${category.description.description}"/>
+ </p>
+ </div>
+
+ </c:if>
+
+ <div class="row-fluid">
+
+
+ <div class="span12">
+
+
+
+ <!-- left column -->
+ <div class="span3">
+ <div class="sidebar-nav">
+
+
+ <br/>
+
+ <ul class="nav nav-list">
+ <c:if test="${parent!=null}">
+ <li class="nav-header"><c:out value="${parent.description.name}" /></li>
+ </c:if>
+ <c:forEach items="${subCategories}" var="subCategory">
+ <li>
+ <a href="<c:url value="/shop/category/${subCategory.description.friendlyUrl}.html"/><sm:breadcrumbParam categoryId="${subCategory.id}"/>"><c:out value="${subCategory.description.name}" />
+ <c:if test="${subCategory.productCount>0}"> <span class="countItems">(<c:out value="${subCategory.productCount}" />)</span></c:if></a></li>
+ </c:forEach>
+ </ul>
+ </div>
+
+ <c:if test="${fn:length(manufacturers) > 0}">
+ <br/>
+ <div class="sidebar-nav">
+ <ul class="nav nav-list">
+ <li class="nav-header"><s:message code="label.manufacturer.brand" text="Brands" /></li>
+ <c:forEach items="${manufacturers}" var="manufacturer">
+ <li>
+ <a href="javascript:filterCategory('BRAND','${manufacturer.id}')"><c:out value="${manufacturer.description.name}" /></a></li>
+ </c:forEach>
+ </ul>
+ </div>
+ </c:if>
+
+
+ </div><!--/span-->
+
+ <!-- right column -->
+ <div class="span9">
+ <p class="lead"><c:out value="${category.description.name}" /></p>
+ <div class="products-title row-fluid">
+ <div class="span6">
+ <p><div id="products-qty"></div></p>
+ </div>
+ <div class="span6">
+ <div class="pull-right">
+ <p>
+ <ul class="nav nav-list">
+ <li class="widget-header"><s:message code="label.generic.sortby" text="Sort by" />:
+ <select id="filter">
+ <option value="item-order"><s:message code="label.generic.default" text="Default" /></option>
+ <option value="item-name"><s:message code="label.generic.name" text="Name" /></option>
+ <option value="item-price"><s:message code="label.generic.price" text="Price" /></option>
+ </select>
+ </li>
+ </ul>
+ </p>
+ </div>
+ </div>
+ </div>
+
+
+ <!-- just copy that block for havimg products displayed -->
+ <!-- products are loaded by ajax -->
+ <ul id="productsContainer" class="thumbnails product-list"></ul>
+
+ <nav id="button_nav" style="text-align:center;display:none;">
+ <button class="btn btn-large" style="width:400px;" onClick="loadCategoryProducts();"><s:message code="label.product.moreitems" text="Display more items" />...</button>
+ </nav>
+ <span id="end_nav" style="display:none;"><s:message code="label.product.nomoreitems" text="No more items to be displayed" /></span>
+ <!-- end block -->
+
+ </div><!--/span-->
+
+ </div><!-- 12 -->
+
</div><!-- row fluid -->
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/pages/content.jsp b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/pages/content.jsp
index acc309b..fb340a2 100644
--- a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/pages/content.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/pages/content.jsp
@@ -1,31 +1,31 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-
- <jsp:include page="/pages/shop/templates/bootstrap/sections/breadcrumb.jsp" />
-
-
- <div class="row-fluid">
-
- <div class="span12">
- <c:out value="${content.description}" escapeXml="false"/>
- </div>
- </div>
-
-
-
-
-
-
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+ <jsp:include page="/pages/shop/templates/bootstrap/sections/breadcrumb.jsp" />
+
+
+ <div class="row-fluid">
+
+ <div class="span12">
+ <c:out value="${content.description}" escapeXml="false"/>
+ </div>
+ </div>
+
+
+
+
+
+
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/pages/customer.jsp b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/pages/customer.jsp
index 373471b..134280e 100644
--- a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/pages/customer.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/pages/customer.jsp
@@ -1,21 +1,21 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-
-<%
-/** Nothing just use the common customer dashboard page **/
-%>
-
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+<%
+/** Nothing just use the common customer dashboard page **/
+%>
+
<jsp:include page="/pages/shop/common/customer/dashboard.jsp" />
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/pages/product.jsp b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/pages/product.jsp
index 54ed48b..febd057 100644
--- a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/pages/product.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/pages/product.jsp
@@ -1,165 +1,165 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-
-<script src="<c:url value="/resources/js/jquery.elevateZoom-3.0.8.min.js" />"></script>
-<script src="<c:url value="/resources/js/jquery.raty.min.js" />"></script>
-
-
-
- <jsp:include page="/pages/shop/templates/bootstrap/sections/breadcrumb.jsp" />
-
- <div class="row-fluid">
-
- <div itemscope class="span12" itemtype="http://data-vocabulary.org/Product">
- <!-- Image column -->
- <div id="img" class="span4 productMainImage">
- <c:if test="${product.image!=null}">
- <span id="mainImg"><img id="im-<c:out value="${product.image.id}"/>" alt="<c:out value="${product.description.name}"/>" src="<c:url value="${product.image.imageUrl}"/>" data-zoom-image="<sm:shopProductImage imageName="${product.image.imageName}" sku="${product.sku}" size="LARGE"/>"></span>
- <script>
- $(function() {
- setImageZoom('im-<c:out value="${product.image.id}"/>');
- });
- </script>
- <c:if test="${product.images!=null && fn:length(product.images)>1}">
- <ul id="imageGallery" class="thumbnails small">
- <c:forEach items="${product.images}" var="thumbnail">
- <li class="span2">
- <a href="#img" class="thumbImg" title="<c:out value="${thumbnail.imageName}"/>"><img id="im-<c:out value="${thumbnail.id}"/>" src="<c:url value="${thumbnail.imageUrl}"/>" data-zoom-image="<sm:shopProductImage imageName="${thumbnail.imageName}" sku="${product.sku}" size="LARGE"/>" alt="<c:url value="${thumbnail.imageName}"/>" ></a>
- </li>
- </c:forEach>
- </ul>
- </c:if>
- </c:if>
- </div>
-
- <!-- Google rich snippets (http://blog.hubspot.com/power-google-rich-snippets-ecommerce-seo-ht) -->
- <!-- Product description column -->
- <div class="span8">
- <p class="lead"><strong>${product.description.name}</strong></p>
-
-
- <!-- product rating -->
- <jsp:include page="/pages/shop/common/catalog/rating.jsp" />
-
-
- <address>
- <strong><s:message code="label.product.brand" text="Brand"/></strong> <span itemprop="brand"><c:out value="${product.manufacturer.description.name}" /></span><br>
- <strong><s:message code="label.product.code" text="Product code"/></strong> <span itemprop="identifier" content="mpn:${product.sku}">${product.sku}</span><br>
- </address>
- <span itemprop="offerDetails" itemscope itemtype="http://data-vocabulary.org/Offer">
- <meta itemprop="seller" content="${requestScope.MERCHANT_STORE.storename}"/>
- <meta itemprop="currency" content="<c:out value="${requestScope.MERCHANT_STORE.currency.code}" />" />
- <h3 id="productPrice">
- <c:choose>
- <c:when test="${product.discounted}">
- <del><c:out value="${product.originalPrice}" /></del> <span class="specialPrice"><span itemprop="price"><c:out value="${product.finalPrice}" /></span></span>
- </c:when>
- <c:otherwise>
- <span itemprop="price"><c:out value="${product.finalPrice}" /></span>
- </c:otherwise>
- </c:choose>
- </h3>
- <c:if test="${not product.productVirtual}">
- <address>
- <strong><s:message code="label.product.available" text="Availability"/></strong> <span><c:choose><c:when test="${product.quantity>0}"><span itemprop="availability" content="in_stock">${product.quantity}</span></c:when><c:otherwise><span itemprop="availability" content="out_of_stock"><s:message code="label.product.outofstock" text="Out of stock" /></c:otherwise></c:choose></span><br>
- </address>
- </c:if>
- </span>
- <p>
- <jsp:include page="/pages/shop/common/catalog/addToCartProduct.jsp" />
- </p>
- </div>
-
- </div>
- </div>
- <div class="row-fluid">
- <div class="span12">
-
- <ul class="nav nav-tabs" id="productTabs">
- <li class="active"><a href="#description"><s:message code="label.productedit.productdesc" text="Product description" /></a></li>
- <c:if test="${attributes!=null}"><li><a href="#specifications"><s:message code="label.product.attribute.specifications" text="Specifications" /></a></li></c:if>
- <li><a href="#reviews"><s:message code="label.product.customer.reviews" text="Customer reviews" /></a></li>
- </ul>
- <div class="tab-content">
- <div class="tab-pane active" id="description">
- <c:out value="${product.description.description}" escapeXml="false"/>
- </div>
- <div class="tab-pane" id="specifications">
- <!-- read only properties -->
- <c:if test="${attributes!=null}">
- <table>
- <c:forEach items="${attributes}" var="attribute" varStatus="status">
- <tr>
- <td><c:out value="${attribute.name}"/> : </td>
- <td><c:out value="${attribute.readOnlyValue.description}" /></td>
- </tr>
- </c:forEach>
- </table>
- </c:if>
- </div>
- <div class="tab-pane" id="reviews">
-
- <!-- reviews -->
- <jsp:include page="/pages/shop/common/catalog/reviews.jsp" />
-
-
- </div>
- </div>
- <br/>
- <br/>
- <!-- Related items -->
- <c:if test="${relatedProducts!=null}">
- <h1><s:message code="label.product.related.title" text="Related items"/></h1>
- <ul class="thumbnails product-list">
- <!-- Iterate over featuredItems -->
- <c:set var="ITEMS" value="${relatedProducts}" scope="request" />
- <jsp:include page="/pages/shop/templates/bootstrap/sections/productBox.jsp" />
- </ul>
- </c:if>
-
-
- </div>
- </div>
-
-
-
- <script>
-
- $(function () {
- $('#productTabs a:first').tab('show');
- $('#productTabs a').click(function (e) {
- e.preventDefault();
- $(this).tab('show');
- })
- $('.thumbImg').click(function (e) {
- img = $(this).find('img').clone();
- $('#mainImg').html(img);
- setImageZoom(img.attr('id'));
- })
- })
-
- <!-- lens plugin -->
- function setImageZoom(id) {
- $('#' + id).elevateZoom({
- zoomType : "lens",
- lensShape : "square",
- lensSize : 240
- });
- }
-
-
- </script>
-
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+<script src="<c:url value="/resources/js/jquery.elevateZoom-3.0.8.min.js" />"></script>
+<script src="<c:url value="/resources/js/jquery.raty.min.js" />"></script>
+
+
+
+ <jsp:include page="/pages/shop/templates/bootstrap/sections/breadcrumb.jsp" />
+
+ <div class="row-fluid">
+
+ <div itemscope class="span12" itemtype="http://data-vocabulary.org/Product">
+ <!-- Image column -->
+ <div id="img" class="span4 productMainImage">
+ <c:if test="${product.image!=null}">
+ <span id="mainImg"><img id="im-<c:out value="${product.image.id}"/>" alt="<c:out value="${product.description.name}"/>" src="<c:url value="${product.image.imageUrl}"/>" data-zoom-image="<sm:shopProductImage imageName="${product.image.imageName}" sku="${product.sku}" size="LARGE"/>"></span>
+ <script>
+ $(function() {
+ setImageZoom('im-<c:out value="${product.image.id}"/>');
+ });
+ </script>
+ <c:if test="${product.images!=null && fn:length(product.images)>1}">
+ <ul id="imageGallery" class="thumbnails small">
+ <c:forEach items="${product.images}" var="thumbnail">
+ <li class="span2">
+ <a href="#img" class="thumbImg" title="<c:out value="${thumbnail.imageName}"/>"><img id="im-<c:out value="${thumbnail.id}"/>" src="<c:url value="${thumbnail.imageUrl}"/>" data-zoom-image="<sm:shopProductImage imageName="${thumbnail.imageName}" sku="${product.sku}" size="LARGE"/>" alt="<c:url value="${thumbnail.imageName}"/>" ></a>
+ </li>
+ </c:forEach>
+ </ul>
+ </c:if>
+ </c:if>
+ </div>
+
+ <!-- Google rich snippets (http://blog.hubspot.com/power-google-rich-snippets-ecommerce-seo-ht) -->
+ <!-- Product description column -->
+ <div class="span8">
+ <p class="lead"><strong>${product.description.name}</strong></p>
+
+
+ <!-- product rating -->
+ <jsp:include page="/pages/shop/common/catalog/rating.jsp" />
+
+
+ <address>
+ <strong><s:message code="label.product.brand" text="Brand"/></strong> <span itemprop="brand"><c:out value="${product.manufacturer.description.name}" /></span><br>
+ <strong><s:message code="label.product.code" text="Product code"/></strong> <span itemprop="identifier" content="mpn:${product.sku}">${product.sku}</span><br>
+ </address>
+ <span itemprop="offerDetails" itemscope itemtype="http://data-vocabulary.org/Offer">
+ <meta itemprop="seller" content="${requestScope.MERCHANT_STORE.storename}"/>
+ <meta itemprop="currency" content="<c:out value="${requestScope.MERCHANT_STORE.currency.code}" />" />
+ <h3 id="productPrice">
+ <c:choose>
+ <c:when test="${product.discounted}">
+ <del><c:out value="${product.originalPrice}" /></del> <span class="specialPrice"><span itemprop="price"><c:out value="${product.finalPrice}" /></span></span>
+ </c:when>
+ <c:otherwise>
+ <span itemprop="price"><c:out value="${product.finalPrice}" /></span>
+ </c:otherwise>
+ </c:choose>
+ </h3>
+ <c:if test="${not product.productVirtual}">
+ <address>
+ <strong><s:message code="label.product.available" text="Availability"/></strong> <span><c:choose><c:when test="${product.quantity>0}"><span itemprop="availability" content="in_stock">${product.quantity}</span></c:when><c:otherwise><span itemprop="availability" content="out_of_stock"><s:message code="label.product.outofstock" text="Out of stock" /></c:otherwise></c:choose></span><br>
+ </address>
+ </c:if>
+ </span>
+ <p>
+ <jsp:include page="/pages/shop/common/catalog/addToCartProduct.jsp" />
+ </p>
+ </div>
+
+ </div>
+ </div>
+ <div class="row-fluid">
+ <div class="span12">
+
+ <ul class="nav nav-tabs" id="productTabs">
+ <li class="active"><a href="#description"><s:message code="label.productedit.productdesc" text="Product description" /></a></li>
+ <c:if test="${attributes!=null}"><li><a href="#specifications"><s:message code="label.product.attribute.specifications" text="Specifications" /></a></li></c:if>
+ <li><a href="#reviews"><s:message code="label.product.customer.reviews" text="Customer reviews" /></a></li>
+ </ul>
+ <div class="tab-content">
+ <div class="tab-pane active" id="description">
+ <c:out value="${product.description.description}" escapeXml="false"/>
+ </div>
+ <div class="tab-pane" id="specifications">
+ <!-- read only properties -->
+ <c:if test="${attributes!=null}">
+ <table>
+ <c:forEach items="${attributes}" var="attribute" varStatus="status">
+ <tr>
+ <td><c:out value="${attribute.name}"/> : </td>
+ <td><c:out value="${attribute.readOnlyValue.description}" /></td>
+ </tr>
+ </c:forEach>
+ </table>
+ </c:if>
+ </div>
+ <div class="tab-pane" id="reviews">
+
+ <!-- reviews -->
+ <jsp:include page="/pages/shop/common/catalog/reviews.jsp" />
+
+
+ </div>
+ </div>
+ <br/>
+ <br/>
+ <!-- Related items -->
+ <c:if test="${relatedProducts!=null}">
+ <h1><s:message code="label.product.related.title" text="Related items"/></h1>
+ <ul class="thumbnails product-list">
+ <!-- Iterate over featuredItems -->
+ <c:set var="ITEMS" value="${relatedProducts}" scope="request" />
+ <jsp:include page="/pages/shop/templates/bootstrap/sections/productBox.jsp" />
+ </ul>
+ </c:if>
+
+
+ </div>
+ </div>
+
+
+
+ <script>
+
+ $(function () {
+ $('#productTabs a:first').tab('show');
+ $('#productTabs a').click(function (e) {
+ e.preventDefault();
+ $(this).tab('show');
+ })
+ $('.thumbImg').click(function (e) {
+ img = $(this).find('img').clone();
+ $('#mainImg').html(img);
+ setImageZoom(img.attr('id'));
+ })
+ })
+
+ <!-- lens plugin -->
+ function setImageZoom(id) {
+ $('#' + id).elevateZoom({
+ zoomType : "lens",
+ lensShape : "square",
+ lensSize : 240
+ });
+ }
+
+
+ </script>
+
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/pages/search.jsp b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/pages/search.jsp
index b1b3476..223810e 100644
--- a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/pages/search.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/pages/search.jsp
@@ -1,131 +1,131 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-
-
-
- <script>
-
- var START_COUNT_PRODUCTS = 0;
- var MAX_PRODUCTS = 12;
-
-
- $(function(){
-
- search();
-
- });
-
-
- <jsp:include page="/pages/shop/templates/bootstrap/sections/shop-listing.jsp" />
-
-
- function search() {
- $('#productsContainer').showLoading();
- var url = '<%=request.getContextPath()%>/services/public/search/<c:out value="${requestScope.MERCHANT_STORE.code}"/>/<c:out value="${requestScope.LANGUAGE.code}"/>/' + START_COUNT_PRODUCTS + '/' + MAX_PRODUCTS + '/search.json';
- searchProducts(url,'#productsContainer','<c:out value="${q}"/>',null);
- }
-
- function callBackSearchProducts(productList) {
- buildProductsList(productList,'#productsContainer', null);//generic list function
- totalCount = productList.productCount;
- START_COUNT_PRODUCTS = START_COUNT_PRODUCTS + MAX_PRODUCTS;
- if(START_COUNT_PRODUCTS < totalCount) {
- $("#button_nav").show();
- } else {
- $("#button_nav").hide();
- }
-
- //facets
- if(productList.categoryFacets!=null) {
- for (var i = 0; i < productList.categoryFacets.length; i++) {
- var categoryFacets = '<li>';
- categoryFacets = categoryFacets + '<a href="<c:url value="/shop"/>/category/' + productList.categoryFacets[i].description.friendlyUrl + '.html">' + productList.categoryFacets[i].description.name;
- if(productList.categoryFacets[i].productCount>0) {
- categoryFacets = categoryFacets + ' <span class="countItems">(' + productList.categoryFacets[i].productCount + ')</span>'
- }
- categoryFacets = categoryFacets + '</a>';
- categoryFacets = categoryFacets + '</li>';
- $(categoriesFacets).append(categoryFacets);
- }
- }
-
- $('#productsContainer').hideLoading();
-
-
- var productQty = productList.productCount + ' <s:message code="label.search.items.found" text="item(s) found" />';
- $('#products-qty').html(productQty);
-
- }
-
-
-
-
-</script>
-
-
- <div class="row-fluid">
-
-
- <div class="span12">
-
- <!-- left column -->
- <!--Search facets-->
- <div class="span3">
- <div class="sidebar-nav">
- <ul id="categoriesFacets" class="nav nav-list">
- </ul>
- </div>
- </div><!--/span-->
-
- <!-- right column -->
- <div class="span9">
-
- <div class="products-title row-fluid">
- <div class="span6">
- <p><div id="products-qty"></div></p>
- </div>
- <div class="span6">
- <div class="pull-right">
- <p>
- <ul class="nav nav-list">
- <li class="widget-header"><s:message code="label.generic.sortby" text="Sort by" />:
- <select id="filter">
- <option value="item-order"><s:message code="label.generic.default" text="Default" /></option>
- <option value="item-name"><s:message code="label.generic.name" text="Name" /></option>
- <option value="item-price"><s:message code="label.generic.price" text="Price" /></option>
- </select>
- </li>
- </ul>
- </p>
- </div>
- </div>
- </div>
-
-
- <ul id="productsContainer" class="thumbnails product-list">
- <!-- search ajax -->
- </ul>
- <nav id="button_nav" style="text-align:center;display:none;">
- <button class="btn btn-large" style="width:400px;" onClick="loadProducts();"><s:message code="label.product.moreitems" text="Display more items" />...</button>
- </nav>
- <span id="end_nav" style="display:none;"><s:message code="label.product.nomoreitems" text="No more items to be displayed" /></span>
-
-
- </div><!--/span-->
-
- </div><!-- 12 -->
-
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+
+
+ <script>
+
+ var START_COUNT_PRODUCTS = 0;
+ var MAX_PRODUCTS = 12;
+
+
+ $(function(){
+
+ search();
+
+ });
+
+
+ <jsp:include page="/pages/shop/templates/bootstrap/sections/shop-listing.jsp" />
+
+
+ function search() {
+ $('#productsContainer').showLoading();
+ var url = '<%=request.getContextPath()%>/services/public/search/<c:out value="${requestScope.MERCHANT_STORE.code}"/>/<c:out value="${requestScope.LANGUAGE.code}"/>/' + START_COUNT_PRODUCTS + '/' + MAX_PRODUCTS + '/search.json';
+ searchProducts(url,'#productsContainer','<c:out value="${q}"/>',null);
+ }
+
+ function callBackSearchProducts(productList) {
+ buildProductsList(productList,'#productsContainer', null);//generic list function
+ totalCount = productList.productCount;
+ START_COUNT_PRODUCTS = START_COUNT_PRODUCTS + MAX_PRODUCTS;
+ if(START_COUNT_PRODUCTS < totalCount) {
+ $("#button_nav").show();
+ } else {
+ $("#button_nav").hide();
+ }
+
+ //facets
+ if(productList.categoryFacets!=null) {
+ for (var i = 0; i < productList.categoryFacets.length; i++) {
+ var categoryFacets = '<li>';
+ categoryFacets = categoryFacets + '<a href="<c:url value="/shop"/>/category/' + productList.categoryFacets[i].description.friendlyUrl + '.html">' + productList.categoryFacets[i].description.name;
+ if(productList.categoryFacets[i].productCount>0) {
+ categoryFacets = categoryFacets + ' <span class="countItems">(' + productList.categoryFacets[i].productCount + ')</span>'
+ }
+ categoryFacets = categoryFacets + '</a>';
+ categoryFacets = categoryFacets + '</li>';
+ $(categoriesFacets).append(categoryFacets);
+ }
+ }
+
+ $('#productsContainer').hideLoading();
+
+
+ var productQty = productList.productCount + ' <s:message code="label.search.items.found" text="item(s) found" />';
+ $('#products-qty').html(productQty);
+
+ }
+
+
+
+
+</script>
+
+
+ <div class="row-fluid">
+
+
+ <div class="span12">
+
+ <!-- left column -->
+ <!--Search facets-->
+ <div class="span3">
+ <div class="sidebar-nav">
+ <ul id="categoriesFacets" class="nav nav-list">
+ </ul>
+ </div>
+ </div><!--/span-->
+
+ <!-- right column -->
+ <div class="span9">
+
+ <div class="products-title row-fluid">
+ <div class="span6">
+ <p><div id="products-qty"></div></p>
+ </div>
+ <div class="span6">
+ <div class="pull-right">
+ <p>
+ <ul class="nav nav-list">
+ <li class="widget-header"><s:message code="label.generic.sortby" text="Sort by" />:
+ <select id="filter">
+ <option value="item-order"><s:message code="label.generic.default" text="Default" /></option>
+ <option value="item-name"><s:message code="label.generic.name" text="Name" /></option>
+ <option value="item-price"><s:message code="label.generic.price" text="Price" /></option>
+ </select>
+ </li>
+ </ul>
+ </p>
+ </div>
+ </div>
+ </div>
+
+
+ <ul id="productsContainer" class="thumbnails product-list">
+ <!-- search ajax -->
+ </ul>
+ <nav id="button_nav" style="text-align:center;display:none;">
+ <button class="btn btn-large" style="width:400px;" onClick="loadProducts();"><s:message code="label.product.moreitems" text="Display more items" />...</button>
+ </nav>
+ <span id="end_nav" style="display:none;"><s:message code="label.product.nomoreitems" text="No more items to be displayed" /></span>
+
+
+ </div><!--/span-->
+
+ </div><!-- 12 -->
+
</div><!-- row fluid -->
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/breadcrumb.jsp b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/breadcrumb.jsp
index b7eb69a..b2da052 100644
--- a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/breadcrumb.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/breadcrumb.jsp
@@ -1,33 +1,33 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-
-<div class="row-fluid">
-
- <div class="span12">
-
- <ul class="breadcrumb">
-
-
- <c:forEach items="${requestScope.BREADCRUMB.breadCrumbs}" var="breadcrumb" varStatus="count">
- <li class="active">
- <a href="${breadcrumb.url}<sm:breadcrumbParam/>">${breadcrumb.label}</a> <span class="divider">/</span>
- </li>
- </c:forEach>
-
- </ul>
-
- </div>
-
-
-
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<div class="row-fluid">
+
+ <div class="span12">
+
+ <ul class="breadcrumb">
+
+
+ <c:forEach items="${requestScope.BREADCRUMB.breadCrumbs}" var="breadcrumb" varStatus="count">
+ <li class="active">
+ <a href="${breadcrumb.url}<sm:breadcrumbParam/>">${breadcrumb.label}</a> <span class="divider">/</span>
+ </li>
+ </c:forEach>
+
+ </ul>
+
+ </div>
+
+
+
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/footer.jsp b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/footer.jsp
index e14cee6..b3d5090 100644
--- a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/footer.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/footer.jsp
@@ -1,84 +1,84 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-
- <!-- footer -->
- <footer>
- <div id="footer" class="row-fluid">
- <c:if test="${requestScope.CONFIGS['displayStoreAddress'] == true}">
- <div class="span3">
- <div class="company">
- <p>
- <jsp:include page="/pages/shop/common/preBuiltBlocks/storeAddress.jsp"/>
- </p>
- </div>
- </div>
- </c:if>
- <c:if test="${not empty requestScope.CONTENT_PAGE}">
- <div class="span3 contentPages">
- <p class="lead"><s:message code="label.store.information.title" text="Informations"/></p>
- <!-- Pages -->
- <ul class="footerLiks">
- <c:forEach items="${requestScope.CONTENT_PAGE}" var="content">
- <li><a href="<c:url value="/shop/pages/${content.seUrl}.html"/>" class="current" style="color: #fff;">${content.name}</a></li>
- </c:forEach>
- <c:if test="${requestScope.CONFIGS['displayContactUs']==true}">
- <li><a href="<c:url value="/shop/store/contactus.html"/>" style="color: #fff;"><s:message code="label.customer.contactus" text="Contact us"/></a></li>
- </c:if>
- </ul>
- </div>
- </c:if>
- <div class="span3 customerSection">
- <c:if test="${requestScope.CONFIGS['displayCustomerSection'] == true}">
- <p class="lead"><s:message code="label.customer.myaccount" text="My Account" /></p>
- <ul class="footerLiks">
- <sec:authorize access="hasRole('AUTH_CUSTOMER') and fullyAuthenticated">
- <li><a href="<c:url value="/shop/customer/account.html"/>" style="color: #fff;"><s:message code="menu.profile" text="Profile"/></a></li>
- <li><a href="<c:url value="/shop/customer/billing.html"/>" style="color: #fff;"><s:message code="label.customer.billingshipping" text="Billing & shipping information"/></a></li>
- <li><s:message code="label.order.recent" text="Recent orders"/></li>
- </sec:authorize>
- <sec:authorize access="!hasRole('AUTH_CUSTOMER') and fullyAuthenticated">
- <li>
- <s:message code="label.security.loggedinas" text="You are logged in as"/> [<sec:authentication property="principal.username"/>]. <s:message code="label.security.nologinacces.store" text="We can't display store logon box"/>
- </li>
- </sec:authorize>
- <sec:authorize access="!hasRole('AUTH_CUSTOMER') and !fullyAuthenticated">
- <li><a href="#" style="color: #fff;"><s:message code="button.label.login" text="Login" /></a></li>
- </sec:authorize>
- </ul>
- </c:if>
- </div>
- <div class="span3 socialLinksSection">
- <!-- Social links -->
- <c:if test="${requestScope.CONFIGS['facebook_page_url'] != null}">
- <p class="lead"><s:message code="label.social.connect" text="Connect with us"/></p>
- <c:if test="${requestScope.CONFIGS['facebook_page_url'] != null}">
- <a href="<c:out value="${requestScope.CONFIGS['facebook_page_url']}"/>"><img src="<c:url value="/resources/img/facebook-transparent.png" />" width="40"></a>
- </c:if>
- <c:if test="${requestScope.CONFIGS['twitter_handle'] != null}">
- <a href="<c:out value="${requestScope.CONFIGS['twitter_handle']}"/>"><img src="<c:url value="/resources/img/twitter-transparent.png" />" width="50"></a>
- </c:if>
- </c:if>
- </div>
- </div>
- <div id="footer-bottom">
- <div class="container">
- <div class="row-fluid">
- <div class="span12 text">© <s:message code="label.generic.providedby" /> <a href="http://www.shopizer.com" class="footer-href" target="_blank">Shopizer</div>
- </div>
- </div>
- </div>
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+ <!-- footer -->
+ <footer>
+ <div id="footer" class="row-fluid">
+ <c:if test="${requestScope.CONFIGS['displayStoreAddress'] == true}">
+ <div class="span3">
+ <div class="company">
+ <p>
+ <jsp:include page="/pages/shop/common/preBuiltBlocks/storeAddress.jsp"/>
+ </p>
+ </div>
+ </div>
+ </c:if>
+ <c:if test="${not empty requestScope.CONTENT_PAGE}">
+ <div class="span3 contentPages">
+ <p class="lead"><s:message code="label.store.information.title" text="Informations"/></p>
+ <!-- Pages -->
+ <ul class="footerLiks">
+ <c:forEach items="${requestScope.CONTENT_PAGE}" var="content">
+ <li><a href="<c:url value="/shop/pages/${content.seUrl}.html"/>" class="current" style="color: #fff;">${content.name}</a></li>
+ </c:forEach>
+ <c:if test="${requestScope.CONFIGS['displayContactUs']==true}">
+ <li><a href="<c:url value="/shop/store/contactus.html"/>" style="color: #fff;"><s:message code="label.customer.contactus" text="Contact us"/></a></li>
+ </c:if>
+ </ul>
+ </div>
+ </c:if>
+ <div class="span3 customerSection">
+ <c:if test="${requestScope.CONFIGS['displayCustomerSection'] == true}">
+ <p class="lead"><s:message code="label.customer.myaccount" text="My Account" /></p>
+ <ul class="footerLiks">
+ <sec:authorize access="hasRole('AUTH_CUSTOMER') and fullyAuthenticated">
+ <li><a href="<c:url value="/shop/customer/account.html"/>" style="color: #fff;"><s:message code="menu.profile" text="Profile"/></a></li>
+ <li><a href="<c:url value="/shop/customer/billing.html"/>" style="color: #fff;"><s:message code="label.customer.billingshipping" text="Billing & shipping information"/></a></li>
+ <li><s:message code="label.order.recent" text="Recent orders"/></li>
+ </sec:authorize>
+ <sec:authorize access="!hasRole('AUTH_CUSTOMER') and fullyAuthenticated">
+ <li>
+ <s:message code="label.security.loggedinas" text="You are logged in as"/> [<sec:authentication property="principal.username"/>]. <s:message code="label.security.nologinacces.store" text="We can't display store logon box"/>
+ </li>
+ </sec:authorize>
+ <sec:authorize access="!hasRole('AUTH_CUSTOMER') and !fullyAuthenticated">
+ <li><a href="#" style="color: #fff;"><s:message code="button.label.login" text="Login" /></a></li>
+ </sec:authorize>
+ </ul>
+ </c:if>
+ </div>
+ <div class="span3 socialLinksSection">
+ <!-- Social links -->
+ <c:if test="${requestScope.CONFIGS['facebook_page_url'] != null}">
+ <p class="lead"><s:message code="label.social.connect" text="Connect with us"/></p>
+ <c:if test="${requestScope.CONFIGS['facebook_page_url'] != null}">
+ <a href="<c:out value="${requestScope.CONFIGS['facebook_page_url']}"/>"><img src="<c:url value="/resources/img/facebook-transparent.png" />" width="40"></a>
+ </c:if>
+ <c:if test="${requestScope.CONFIGS['twitter_handle'] != null}">
+ <a href="<c:out value="${requestScope.CONFIGS['twitter_handle']}"/>"><img src="<c:url value="/resources/img/twitter-transparent.png" />" width="50"></a>
+ </c:if>
+ </c:if>
+ </div>
+ </div>
+ <div id="footer-bottom">
+ <div class="container">
+ <div class="row-fluid">
+ <div class="span12 text">© <s:message code="label.generic.providedby" /> <a href="http://www.shopizer.com" class="footer-href" target="_blank">Shopizer</div>
+ </div>
+ </div>
+ </div>
</footer>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/header.jsp b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/header.jsp
index 6b04f62..808adec 100644
--- a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/header.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/header.jsp
@@ -1,122 +1,122 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-
- <!-- header -->
- <div id="mainmenu" class="row-fluid">
-
- <ul class="nav nav-pills pull-left" id="linkMenuLinks">
- <li class="active"><a href="<c:url value="/shop"/>"><s:message code="menu.home" text="Home"/></a></li>
- <c:forEach items="${requestScope.CONTENT_PAGE}" var="content">
- <li class="">
- <a href="<c:url value="/shop/pages/${content.seUrl}.html"/>" class="current">
- <span class="name">${content.name}</span>
- </a>
- </li>
- </c:forEach>
- <c:if test="${requestScope.CONFIGS['displayContactUs']==true}">
- <li><a href="<c:url value="/shop/store/contactus.html"/>"><s:message code="label.customer.contactus" text="Contact us"/></a></li>
- </c:if>
- </ul>
-
-
- <c:if test="${not fn:contains(requestScope['javax.servlet.forward.servlet_path'], 'order') && not fn:contains(requestScope['javax.servlet.forward.servlet_path'], 'cart')}">
- <!-- not displayed in checkout (order) and cart -->
- <div id="miniCart" style="padding-top: 8px;padding-bottom:10px;" class="btn-group pull-right">
-
- <i class="icon-shopping-cart icon-black"></i>
- <a style="box-shadow:none;color:FF8C00;" href="#" data-toggle="dropdown" class="open noboxshadow dropdown-toggle" id="open-cart"><s:message code="label.mycart" text="My cart"/></a>
- <jsp:include page="/pages/shop/common/cart/minicartinfo.jsp" />
-
- <ul class="dropdown-menu minicart" id="minicartComponent">
- <li>
- <jsp:include page="/pages/shop/common/cart/minicart.jsp" />
- </li>
- </ul>
- </div>
- </c:if>
-
- <!-- If display customer section -->
- <c:if test="${requestScope.CONFIGS['displayCustomerSection'] == true}">
- <sec:authorize access="hasRole('AUTH_CUSTOMER') and fullyAuthenticated">
- <!-- logged in user -->
- <c:if test="${requestScope.CUSTOMER!=null}">
- <ul class="logon-box pull-right">
- <li id="fat-menu" class="dropdown">
- <a class="dropdown-toggle noboxshadow" data-toggle="dropdown" href="#">
- <s:message code="label.generic.welcome" text="Welcome" />
- <c:if test="${not empty requestScope.CUSTOMER.billing.firstName}">
- <c:out value="${sessionScope.CUSTOMER.billing.firstName}"/>
- </c:if><b class="caret"></b>
- </a>
- <ul class="dropdown-menu">
- <li>
- <a onClick="javascript:location.href='<c:url value="/shop/customer/dashboard.html" />';" href="#"><i class="fa fa-user"></i><s:message code="label.customer.myaccount" text="My account"/></a>
- </li>
- <li class="divider"></li>
- <li>
- <a onClick="javascript:location.href='<c:url value="/shop/customer/logout" />';" href="#"><i class="fa fa-power-off"></i><s:message code="button.label.logout" text="Logout"/></a>
- </li>
- </ul>
- </li>
- </ul>
- </c:if>
- </sec:authorize>
- <sec:authorize access="!hasRole('AUTH_CUSTOMER') and fullyAuthenticated">
- <!-- no dual login -->
- <ul class="logon-box pull-right">
- <li>
- <s:message code="label.security.loggedinas" text="You are logged in as"/> [<sec:authentication property="principal.username"/>]. <s:message code="label.security.nologinacces.store" text="We can't display store logon box"/>
- </li>
- </ul>
- </sec:authorize>
- <sec:authorize access="!hasRole('AUTH_CUSTOMER') and !fullyAuthenticated">
- <!-- login box -->
- <ul class="pull-right" style="list-style-type: none;padding-top: 8px;z-index:500000;">
- <li id="fat-menu" class="dropdown">
- <a href="#" id="signinDrop" role="button" class="dropdown-toggle noboxshadow" data-toggle="dropdown"><s:message code="button.label.signin" text="Signin" /><b class="caret"></b></a>
-
-
- <div id="signinPane" class="dropdown-menu" style="padding: 15px; padding-bottom: 0px;">
- <div id="loginError" class="alert alert-error" style="display:none;"></div>
- <!-- form id must be login, form fields must be userName, password and storeCode -->
- <form id="login" method="post" accept-charset="UTF-8">
- <div class="control-group">
- <label><s:message code="label.username" text="Username" /></label>
- <div class="controls">
- <input id="signin_userName" style="margin-bottom: 15px;" type="text" name="userName" size="30" />
- </div>
- </div>
- <div class="control-group">
- <label><s:message code="label.password" text="Password" /></label>
- <div class="controls">
- <input id="signin_password" style="margin-bottom: 15px;" type="password" name="password" size="30" />
- </div>
- </div>
- <input id="signin_storeCode" name="storeCode" type="hidden" value="<c:out value="${requestScope.MERCHANT_STORE.code}"/>"/>
- <button type="submit" style="width:100%" class="btn btn-large" id="login-button"><s:message code="button.label.login" text="Login" /></button>
-
- </form>
- <a onClick="javascript:location.href='<c:url value="/shop/customer/registration.html" />';" href="" role="button" class="" data-toggle="modal"><s:message code="label.register.notyetregistered" text="Not yet registered ?" /></a>
- </div>
- </li>
- </ul>
- </sec:authorize>
- </c:if>
-
-
- </div>
- <!-- End main menu -->
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+ <!-- header -->
+ <div id="mainmenu" class="row-fluid">
+
+ <ul class="nav nav-pills pull-left" id="linkMenuLinks">
+ <li class="active"><a href="<c:url value="/shop"/>"><s:message code="menu.home" text="Home"/></a></li>
+ <c:forEach items="${requestScope.CONTENT_PAGE}" var="content">
+ <li class="">
+ <a href="<c:url value="/shop/pages/${content.seUrl}.html"/>" class="current">
+ <span class="name">${content.name}</span>
+ </a>
+ </li>
+ </c:forEach>
+ <c:if test="${requestScope.CONFIGS['displayContactUs']==true}">
+ <li><a href="<c:url value="/shop/store/contactus.html"/>"><s:message code="label.customer.contactus" text="Contact us"/></a></li>
+ </c:if>
+ </ul>
+
+
+ <c:if test="${not fn:contains(requestScope['javax.servlet.forward.servlet_path'], 'order') && not fn:contains(requestScope['javax.servlet.forward.servlet_path'], 'cart')}">
+ <!-- not displayed in checkout (order) and cart -->
+ <div id="miniCart" style="padding-top: 8px;padding-bottom:10px;" class="btn-group pull-right">
+
+ <i class="icon-shopping-cart icon-black"></i>
+ <a style="box-shadow:none;color:FF8C00;" href="#" data-toggle="dropdown" class="open noboxshadow dropdown-toggle" id="open-cart"><s:message code="label.mycart" text="My cart"/></a>
+ <jsp:include page="/pages/shop/common/cart/minicartinfo.jsp" />
+
+ <ul class="dropdown-menu minicart" id="minicartComponent">
+ <li>
+ <jsp:include page="/pages/shop/common/cart/minicart.jsp" />
+ </li>
+ </ul>
+ </div>
+ </c:if>
+
+ <!-- If display customer section -->
+ <c:if test="${requestScope.CONFIGS['displayCustomerSection'] == true}">
+ <sec:authorize access="hasRole('AUTH_CUSTOMER') and fullyAuthenticated">
+ <!-- logged in user -->
+ <c:if test="${requestScope.CUSTOMER!=null}">
+ <ul class="logon-box pull-right">
+ <li id="fat-menu" class="dropdown">
+ <a class="dropdown-toggle noboxshadow" data-toggle="dropdown" href="#">
+ <s:message code="label.generic.welcome" text="Welcome" />
+ <c:if test="${not empty requestScope.CUSTOMER.billing.firstName}">
+ <c:out value="${sessionScope.CUSTOMER.billing.firstName}"/>
+ </c:if><b class="caret"></b>
+ </a>
+ <ul class="dropdown-menu">
+ <li>
+ <a onClick="javascript:location.href='<c:url value="/shop/customer/dashboard.html" />';" href="#"><i class="fa fa-user"></i><s:message code="label.customer.myaccount" text="My account"/></a>
+ </li>
+ <li class="divider"></li>
+ <li>
+ <a onClick="javascript:location.href='<c:url value="/shop/customer/logout" />';" href="#"><i class="fa fa-power-off"></i><s:message code="button.label.logout" text="Logout"/></a>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </c:if>
+ </sec:authorize>
+ <sec:authorize access="!hasRole('AUTH_CUSTOMER') and fullyAuthenticated">
+ <!-- no dual login -->
+ <ul class="logon-box pull-right">
+ <li>
+ <s:message code="label.security.loggedinas" text="You are logged in as"/> [<sec:authentication property="principal.username"/>]. <s:message code="label.security.nologinacces.store" text="We can't display store logon box"/>
+ </li>
+ </ul>
+ </sec:authorize>
+ <sec:authorize access="!hasRole('AUTH_CUSTOMER') and !fullyAuthenticated">
+ <!-- login box -->
+ <ul class="pull-right" style="list-style-type: none;padding-top: 8px;z-index:500000;">
+ <li id="fat-menu" class="dropdown">
+ <a href="#" id="signinDrop" role="button" class="dropdown-toggle noboxshadow" data-toggle="dropdown"><s:message code="button.label.signin" text="Signin" /><b class="caret"></b></a>
+
+
+ <div id="signinPane" class="dropdown-menu" style="padding: 15px; padding-bottom: 0px;">
+ <div id="loginError" class="alert alert-error" style="display:none;"></div>
+ <!-- form id must be login, form fields must be userName, password and storeCode -->
+ <form id="login" method="post" accept-charset="UTF-8">
+ <div class="control-group">
+ <label><s:message code="label.username" text="Username" /></label>
+ <div class="controls">
+ <input id="signin_userName" style="margin-bottom: 15px;" type="text" name="userName" size="30" />
+ </div>
+ </div>
+ <div class="control-group">
+ <label><s:message code="label.password" text="Password" /></label>
+ <div class="controls">
+ <input id="signin_password" style="margin-bottom: 15px;" type="password" name="password" size="30" />
+ </div>
+ </div>
+ <input id="signin_storeCode" name="storeCode" type="hidden" value="<c:out value="${requestScope.MERCHANT_STORE.code}"/>"/>
+ <button type="submit" style="width:100%" class="btn btn-large" id="login-button"><s:message code="button.label.login" text="Login" /></button>
+
+ </form>
+ <a onClick="javascript:location.href='<c:url value="/shop/customer/registration.html" />';" href="" role="button" class="" data-toggle="modal"><s:message code="label.register.notyetregistered" text="Not yet registered ?" /></a>
+ </div>
+ </li>
+ </ul>
+ </sec:authorize>
+ </c:if>
+
+
+ </div>
+ <!-- End main menu -->
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/jsLinks.jsp b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/jsLinks.jsp
index 4305ecb..c78143f 100644
--- a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/jsLinks.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/jsLinks.jsp
@@ -1,34 +1,34 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
-
- <script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-button.js" />"></script>
- <script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-modal.js" />"></script>
- <script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-tab.js" />"></script>
- <!--<script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-transition.js" />"></script>-->
- <!--<script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-alert.js" />"></script>-->
- <script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-dropdown.js" />"></script>
- <!--<script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-scrollspy.js" />"></script>-->
- <script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-tooltip.js" />"></script>
- <!--<script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-popover.js" />"></script>-->
- <script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-collapse.js" />"></script>
- <!--<script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-carousel.js" />"></script>-->
-
-
- <script type="text/javascript">
-
- $('#product-tab a:first').tab('show');
- $('#product-tab a').click(function (e) {
- e.preventDefault();
- $(this).tab('show');
- })
-
-
- </script>
-
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+
+ <script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-button.js" />"></script>
+ <script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-modal.js" />"></script>
+ <script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-tab.js" />"></script>
+ <!--<script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-transition.js" />"></script>-->
+ <!--<script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-alert.js" />"></script>-->
+ <script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-dropdown.js" />"></script>
+ <!--<script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-scrollspy.js" />"></script>-->
+ <script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-tooltip.js" />"></script>
+ <!--<script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-popover.js" />"></script>-->
+ <script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-collapse.js" />"></script>
+ <!--<script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-carousel.js" />"></script>-->
+
+
+ <script type="text/javascript">
+
+ $('#product-tab a:first').tab('show');
+ $('#product-tab a').click(function (e) {
+ e.preventDefault();
+ $(this).tab('show');
+ })
+
+
+ </script>
+
+
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/navbar.jsp b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/navbar.jsp
index b2e166c..6ba79f3 100644
--- a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/navbar.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/navbar.jsp
@@ -1,118 +1,118 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-<%@ taglib uri="/WEB-INF/shopizer-functions.tld" prefix="display" %>
-
-<!-- TT Typeahead js files -->
-<script src="<c:url value="/resources/js/hogan.js" />"></script>
-<script src="<c:url value="/resources/js/typeahead.min.js" />"></script>
-
-<script type="text/javascript">
-
-$(document).ready(function() {
-
- $('#searchField').typeahead({
- name: 'shopizer-search',
- <c:if test="${requestScope.CONFIGS['useDefaultSearchConfig'][requestScope.LANGUAGE.code]==true}">
- <c:if test="${requestScope.CONFIGS['defaultSearchConfigPath'][requestScope.LANGUAGE.code]!=null}">
- prefetch: '<c:out value="${requestScope.CONFIGS['defaultSearchConfigPath'][requestScope.LANGUAGE.code]}"/>',
- </c:if>
- </c:if>
-
-
- remote: {
- url: '<c:url value="/services/public/search/${requestScope.MERCHANT_STORE.code}/${requestScope.LANGUAGE.code}/autocomplete.json"/>?q=%QUERY',
- filter: function (parsedResponse) {
- // parsedResponse is the array returned from your backend
- console.log(parsedResponse);
-
- // do whatever processing you need here
- return JSON.parse(parsedResponse);
- }
- },
- template: [
- '<p class="name">{{name}}</p>',
- '<p class="description">{{description}}</p>'
- ].join(''),
- engine: Hogan
- });
-
-
-
-
-});
-
-</script>
-
-<c:set var="req" value="${request}" />
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-
-
- <!-- Start Navbar-->
- <div id="storeBar" class="row-fluid">
-
- <div class="span4 pull-left">
- <nav class="logo">
- <c:choose>
- <c:when test="${not empty requestScope.MERCHANT_STORE.storeLogo}">
- <img class="logoImage" src="<sm:storeLogo/>"/>
- </c:when>
- <c:otherwise>
- <h1>
- <a href="<c:url value="/shop/"/>">
- <c:out value="${requestScope.MERCHANT_STORE.storename}"/>
- </a>
- </h1>
- </c:otherwise>
- </c:choose>
- </nav>
- </div>
- <div class="span8 pull-right">
-
- <nav id="menu" class="pull-right">
- <ul id="mainMenu">
- <!-- request contains url and url contains /shop -->
- <li class="">
- <a href="<c:url value="/shop"/>" class="current">
- <span class="name"><s:message code="menu.home" text="Home"/></span>
- <span class="desc"><s:message code="menu.home" text="Home"/></span>
- </a>
- </li>
-
-
- <c:forEach items="${requestScope.TOP_CATEGORIES}" var="category">
- <li class="">
- <a href="<c:url value="/shop/category/${category.description.friendlyUrl}.html"/><sm:breadcrumbParam categoryId="${category.id}"/>" class="current">
- <span class="name">${category.description.name}</span>
- <span class="desc">${category.description.highlights}</span>
- </a>
- </li>
- </c:forEach>
- </ul>
-
- <div id="searchGroup" class="btn-group pull-right">
- <form id="searchForm" class="form-inline" method="post" action="<c:url value="/shop/search/search.html"/>">
- <input id="searchField" class="tt-query" name="q" type="text" placeholder="<s:message code="label.search.searchQuery" text="Search query" />" autocomplete="off" spellcheck="false" dir="auto" value="<c:out value="${q}"/>">
- <button id="searchButton" class="btn" type="submit"><s:message code="label.generic.search" text="Search" /></button>
- </form>
- </div>
-
-
- </nav>
-
-
- </div>
- </div>
-
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+<%@ taglib uri="/WEB-INF/shopizer-functions.tld" prefix="display" %>
+
+<!-- TT Typeahead js files -->
+<script src="<c:url value="/resources/js/hogan.js" />"></script>
+<script src="<c:url value="/resources/js/typeahead.min.js" />"></script>
+
+<script type="text/javascript">
+
+$(document).ready(function() {
+
+ $('#searchField').typeahead({
+ name: 'shopizer-search',
+ <c:if test="${requestScope.CONFIGS['useDefaultSearchConfig'][requestScope.LANGUAGE.code]==true}">
+ <c:if test="${requestScope.CONFIGS['defaultSearchConfigPath'][requestScope.LANGUAGE.code]!=null}">
+ prefetch: '<c:out value="${requestScope.CONFIGS['defaultSearchConfigPath'][requestScope.LANGUAGE.code]}"/>',
+ </c:if>
+ </c:if>
+
+
+ remote: {
+ url: '<c:url value="/services/public/search/${requestScope.MERCHANT_STORE.code}/${requestScope.LANGUAGE.code}/autocomplete.json"/>?q=%QUERY',
+ filter: function (parsedResponse) {
+ // parsedResponse is the array returned from your backend
+ console.log(parsedResponse);
+
+ // do whatever processing you need here
+ return JSON.parse(parsedResponse);
+ }
+ },
+ template: [
+ '<p class="name">{{name}}</p>',
+ '<p class="description">{{description}}</p>'
+ ].join(''),
+ engine: Hogan
+ });
+
+
+
+
+});
+
+</script>
+
+<c:set var="req" value="${request}" />
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+
+ <!-- Start Navbar-->
+ <div id="storeBar" class="row-fluid">
+
+ <div class="span4 pull-left">
+ <nav class="logo">
+ <c:choose>
+ <c:when test="${not empty requestScope.MERCHANT_STORE.storeLogo}">
+ <img class="logoImage" src="<sm:storeLogo/>"/>
+ </c:when>
+ <c:otherwise>
+ <h1>
+ <a href="<c:url value="/shop/"/>">
+ <c:out value="${requestScope.MERCHANT_STORE.storename}"/>
+ </a>
+ </h1>
+ </c:otherwise>
+ </c:choose>
+ </nav>
+ </div>
+ <div class="span8 pull-right">
+
+ <nav id="menu" class="pull-right">
+ <ul id="mainMenu">
+ <!-- request contains url and url contains /shop -->
+ <li class="">
+ <a href="<c:url value="/shop"/>" class="current">
+ <span class="name"><s:message code="menu.home" text="Home"/></span>
+ <span class="desc"><s:message code="menu.home" text="Home"/></span>
+ </a>
+ </li>
+
+
+ <c:forEach items="${requestScope.TOP_CATEGORIES}" var="category">
+ <li class="">
+ <a href="<c:url value="/shop/category/${category.description.friendlyUrl}.html"/><sm:breadcrumbParam categoryId="${category.id}"/>" class="current">
+ <span class="name">${category.description.name}</span>
+ <span class="desc">${category.description.highlights}</span>
+ </a>
+ </li>
+ </c:forEach>
+ </ul>
+
+ <div id="searchGroup" class="btn-group pull-right">
+ <form id="searchForm" class="form-inline" method="post" action="<c:url value="/shop/search/search.html"/>">
+ <input id="searchField" class="tt-query" name="q" type="text" placeholder="<s:message code="label.search.searchQuery" text="Search query" />" autocomplete="off" spellcheck="false" dir="auto" value="<c:out value="${q}"/>">
+ <button id="searchButton" class="btn" type="submit"><s:message code="label.generic.search" text="Search" /></button>
+ </form>
+ </div>
+
+
+ </nav>
+
+
+ </div>
+ </div>
+
<!-- End Navbar-->
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/productBox.jsp b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/productBox.jsp
index 21539d6..91ab4d9 100644
--- a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/productBox.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/productBox.jsp
@@ -1,36 +1,36 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
- <c:forEach items="${requestScope.ITEMS}" var="product">
- <li class="span3" data-id="${product.id}" item-price="${product.price}" item-name="${product.description.name}" item-order="${product.sortOrder}">
- <div class="product-box">
- <a href="<c:url value="/shop/product/" /><c:out value="${product.description.friendlyUrl}"/>.html<sm:breadcrumbParam productId="${product.id}"/>"><h4><c:out value="${product.description.name}"/></h4></a>
- <h3>
- <c:choose>
- <c:when test="${product.discounted}">
- <del><c:out value="${product.originalPrice}" /></del> <span class="specialPrice"><c:out value="${product.finalPrice}" /></span>
- </c:when>
- <c:otherwise>
- <c:out value="${product.finalPrice}" />
- </c:otherwise>
- </c:choose>
- </h3>
- <c:if test="${product.image!=null}"><a href="<c:url value="/shop/product/" /><c:out value="${product.description.friendlyUrl}"/>.html"><img src="<sm:shopProductImage imageName="${product.image.imageName}" sku="${product.sku}"/>"/></a></c:if>
- <div class="bottom">
- <a href="<c:url value="/shop/product/" /><c:out value="${product.description.friendlyUrl}"/>.html<sm:breadcrumbParam productId="${product.id}"/>"><s:message code="button.label.view" text="Details" /></a> <c:choose><c:when test="${requestScope.FEATURED==true}"><c:if test="${requestScope.CONFIGS['displayAddToCartOnFeaturedItems']==true}">/ <a class="addToCart" href="#" productId="${product.id}"><s:message code="button.label.addToCart" text="Add to cart" /></a></c:if></c:when><c:otherwise>/ <a class="addToCart" href="#" productId="${product.id}"><s:message code="button.label.addToCart" text="Add to cart" /></a></c:otherwise></c:choose>
- </div>
- </div>
- </li>
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+ <c:forEach items="${requestScope.ITEMS}" var="product">
+ <li class="span3" data-id="${product.id}" item-price="${product.price}" item-name="${product.description.name}" item-order="${product.sortOrder}">
+ <div class="product-box">
+ <a href="<c:url value="/shop/product/" /><c:out value="${product.description.friendlyUrl}"/>.html<sm:breadcrumbParam productId="${product.id}"/>"><h4><c:out value="${product.description.name}"/></h4></a>
+ <h3>
+ <c:choose>
+ <c:when test="${product.discounted}">
+ <del><c:out value="${product.originalPrice}" /></del> <span class="specialPrice"><c:out value="${product.finalPrice}" /></span>
+ </c:when>
+ <c:otherwise>
+ <c:out value="${product.finalPrice}" />
+ </c:otherwise>
+ </c:choose>
+ </h3>
+ <c:if test="${product.image!=null}"><a href="<c:url value="/shop/product/" /><c:out value="${product.description.friendlyUrl}"/>.html"><img src="<sm:shopProductImage imageName="${product.image.imageName}" sku="${product.sku}"/>"/></a></c:if>
+ <div class="bottom">
+ <a href="<c:url value="/shop/product/" /><c:out value="${product.description.friendlyUrl}"/>.html<sm:breadcrumbParam productId="${product.id}"/>"><s:message code="button.label.view" text="Details" /></a> <c:choose><c:when test="${requestScope.FEATURED==true}"><c:if test="${requestScope.CONFIGS['displayAddToCartOnFeaturedItems']==true}">/ <a class="addToCart" href="#" productId="${product.id}"><s:message code="button.label.addToCart" text="Add to cart" /></a></c:if></c:when><c:otherwise>/ <a class="addToCart" href="#" productId="${product.id}"><s:message code="button.label.addToCart" text="Add to cart" /></a></c:otherwise></c:choose>
+ </div>
+ </div>
+ </li>
</c:forEach>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/shopLinks.jsp b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/shopLinks.jsp
index fc1a37b..0dee54d 100644
--- a/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/shopLinks.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/templates/bootstrap/sections/shopLinks.jsp
@@ -1,72 +1,72 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
- <!-- required common scripts -->
- <script src="<c:url value="/resources/js/shop-functions.js" />"></script>
- <jsp:include page="/resources/js/functions.jsp" />
- <script src="<c:url value="/resources/js/jquery-1.10.2.min.js" />"></script>
- <script src="<c:url value="/resources/js/json2.js" />"></script>
- <script src="<c:url value="/resources/js/jquery-cookie.js" />"></script>
- <script src="<c:url value="/resources/js/shopping-cart.js" />"></script>
- <script src="<c:url value="/resources/js/login.js" />"></script>
- <script src="<c:url value="/resources/js/jquery.showLoading.min.js" />"></script>
-
- <!-- specific css -->
- <link href="<c:url value="/resources/templates/bootstrap/css/bootstrap.min.css" />" rel="stylesheet">
- <link href="<c:url value="/resources/templates/bootstrap/css/bootstrap-responsive.min.css" />" rel="stylesheet">
-
- <!-- generic and common css file -->
- <link href="<c:url value="/resources/css/sm.css" />" rel="stylesheet">
- <link href="<c:url value="/resources/css/showLoading.css" />" rel="stylesheet">
-
- <!-- template css file -->
- <link href="<c:url value="/resources/templates/bootstrap/css/theme.css" />" rel="stylesheet">
-
- <script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-tooltip.js" />"></script>
- <script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-popover.js" />"></script>
-
- <link rel="icon" href="<c:url value="/resources/templates/bootstrap/img/favicon.ico"/> ">
-
-
- <!-- mini shopping cart template -->
- <script type="text/html" id="miniShoppingCartTemplate">
- {{#shoppingCartItems}}
- <tr id="{{productId}}" class="cart-product">
- <td>
- {{#image}}
- <img width="40" src="{{contextPath}}{{image}}">
- {{/image}}
- {{^image}}
-  
- {{/image}}
- </td>
- <td>{{quantity}}</td>
- <td>{{name}}</td>
- <td>{{price}}</td>
- <td><button productid="{{productId}}" class="close removeProductIcon" onclick="removeItemFromMinicart('{{id}}')">x</button></td>
- </tr>
- {{/shoppingCartItems}}
- </script>
-
- <c:if test="${requestScope.CONFIGS['google_analytics_url'] != null}">
- <script type="text/javascript">
- //<![CDATA[
- <!-- google analytics -->
- var _gaq = _gaq || [];
- _gaq.push(['_setAccount', '<c:out value="${requestScope.CONFIGS['google_analytics_url']}"/>']);
- _gaq.push(['_trackPageview']);
-
- (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);
- })();
- //]]>
- </script>
- </c:if>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+ <!-- required common scripts -->
+ <script src="<c:url value="/resources/js/shop-functions.js" />"></script>
+ <jsp:include page="/resources/js/functions.jsp" />
+ <script src="<c:url value="/resources/js/jquery-1.10.2.min.js" />"></script>
+ <script src="<c:url value="/resources/js/json2.js" />"></script>
+ <script src="<c:url value="/resources/js/jquery-cookie.js" />"></script>
+ <script src="<c:url value="/resources/js/shopping-cart.js" />"></script>
+ <script src="<c:url value="/resources/js/login.js" />"></script>
+ <script src="<c:url value="/resources/js/jquery.showLoading.min.js" />"></script>
+
+ <!-- specific css -->
+ <link href="<c:url value="/resources/templates/bootstrap/css/bootstrap.min.css" />" rel="stylesheet">
+ <link href="<c:url value="/resources/templates/bootstrap/css/bootstrap-responsive.min.css" />" rel="stylesheet">
+
+ <!-- generic and common css file -->
+ <link href="<c:url value="/resources/css/sm.css" />" rel="stylesheet">
+ <link href="<c:url value="/resources/css/showLoading.css" />" rel="stylesheet">
+
+ <!-- template css file -->
+ <link href="<c:url value="/resources/templates/bootstrap/css/theme.css" />" rel="stylesheet">
+
+ <script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-tooltip.js" />"></script>
+ <script src="<c:url value="/resources/templates/bootstrap/js/bootstrap-popover.js" />"></script>
+
+ <link rel="icon" href="<c:url value="/resources/templates/bootstrap/img/favicon.ico"/> ">
+
+
+ <!-- mini shopping cart template -->
+ <script type="text/html" id="miniShoppingCartTemplate">
+ {{#shoppingCartItems}}
+ <tr id="{{productId}}" class="cart-product">
+ <td>
+ {{#image}}
+ <img width="40" src="{{contextPath}}{{image}}">
+ {{/image}}
+ {{^image}}
+  
+ {{/image}}
+ </td>
+ <td>{{quantity}}</td>
+ <td>{{name}}</td>
+ <td>{{price}}</td>
+ <td><button productid="{{productId}}" class="close removeProductIcon" onclick="removeItemFromMinicart('{{id}}')">x</button></td>
+ </tr>
+ {{/shoppingCartItems}}
+ </script>
+
+ <c:if test="${requestScope.CONFIGS['google_analytics_url'] != null}">
+ <script type="text/javascript">
+ //<![CDATA[
+ <!-- google analytics -->
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', '<c:out value="${requestScope.CONFIGS['google_analytics_url']}"/>']);
+ _gaq.push(['_trackPageview']);
+
+ (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);
+ })();
+ //]]>
+ </script>
+ </c:if>
+
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/catalogLayout.jsp b/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/catalogLayout.jsp
index 01780b2..24b5b50 100644
--- a/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/catalogLayout.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/catalogLayout.jsp
@@ -1,69 +1,69 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-
-
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
- <%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-
- <c:set var="lang" scope="request" value="${requestScope.locale.language}"/>
-
-
- <html xmlns="http://www.w3.org/1999/xhtml">
-
-
- <head>
- <meta charset="utf-8">
- <title><c:out value="${requestScope.PAGE_INFORMATION.pageTitle}" /></title>
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <meta name="description" content="<c:out value="${requestScope.PAGE_INFORMATION.pageDescription}" />">
- <meta name="author" content="<c:out value="${requestScope.MERCHANT_STORE.storename}"/>">
-
- <!-- mobile settings -->
- <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
-
-
-
- <jsp:include page="/pages/shop/templates/exoticamobilia/sections/shopLinks.jsp" />
- </head>
-
- <body class="front wide">
-
- <!-- pageContainer id is essential for js page events -->
- <div id="pageContainer" class="">
- <!-- scrollToTop -->
- <!-- ================ -->
- <div style="" class="scrollToTop"><i class="icon-up-open"></i></div>
- <!-- page wrapper start -->
- <!-- ================ -->
- <div class="page-wrapper">
- <tiles:insertAttribute name="header" ignore="true"/>
-
- <tiles:insertAttribute name="navbar" ignore="true"/>
-
- <tiles:insertAttribute name="body" ignore="true"/>
-
- <tiles:insertAttribute name="footer" ignore="true"/>
- </div>
- </div>
-
- <!-- end container -->
- <jsp:include page="/pages/shop/templates/exoticamobilia/sections/jsLinks.jsp" />
-
- </body>
-
- </html>
-
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+ <%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
+ <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+
+ <c:set var="lang" scope="request" value="${requestScope.locale.language}"/>
+
+
+ <html xmlns="http://www.w3.org/1999/xhtml">
+
+
+ <head>
+ <meta charset="utf-8">
+ <title><c:out value="${requestScope.PAGE_INFORMATION.pageTitle}" /></title>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="<c:out value="${requestScope.PAGE_INFORMATION.pageDescription}" />">
+ <meta name="author" content="<c:out value="${requestScope.MERCHANT_STORE.storename}"/>">
+
+ <!-- mobile settings -->
+ <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+
+
+
+ <jsp:include page="/pages/shop/templates/exoticamobilia/sections/shopLinks.jsp" />
+ </head>
+
+ <body class="front wide">
+
+ <!-- pageContainer id is essential for js page events -->
+ <div id="pageContainer" class="">
+ <!-- scrollToTop -->
+ <!-- ================ -->
+ <div style="" class="scrollToTop"><i class="icon-up-open"></i></div>
+ <!-- page wrapper start -->
+ <!-- ================ -->
+ <div class="page-wrapper">
+ <tiles:insertAttribute name="header" ignore="true"/>
+
+ <tiles:insertAttribute name="navbar" ignore="true"/>
+
+ <tiles:insertAttribute name="body" ignore="true"/>
+
+ <tiles:insertAttribute name="footer" ignore="true"/>
+ </div>
+ </div>
+
+ <!-- end container -->
+ <jsp:include page="/pages/shop/templates/exoticamobilia/sections/jsLinks.jsp" />
+
+ </body>
+
+ </html>
+
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/pages/content.jsp b/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/pages/content.jsp
index d80d753..c0ee7cc 100644
--- a/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/pages/content.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/pages/content.jsp
@@ -1,131 +1,131 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-
-
- <script type="text/html" id="productBoxTemplate">
-{{#products}}
-<div itemscope itemtype="http://schema.org/Enumeration" class="col-md-4 productItem" item-order="{{sortOrder}}" item-name="{{description.name}}" item-price="{{price}}" data-id="{{id}}" class="col-sm-4">
-<div class="box-style-4 white-bg object-non-visible animated object-visible">
- {{#description.highlights}}
- <div class="ribbon-wrapper-green">
- <div class="ribbon-green">
- {{description.highlights}}
- </div>
- </div>
- {{/description.highlights}}
- {{^canBePurchased}}
- <div class="sold-out-box">
- <span class="sold-out-text"><s:message code="label.soldout" text="Sold out" /></span>
- </div>
- {{/canBePurchased}}
- <div class="product-image">
- {{#image}}
- <img class="product-img" src="<c:url value=""/>{{image.imageUrl}}"><a class="overlay" href="<c:url value="/shop/product/" />{{description.friendlyUrl}}.html<sm:breadcrumbParam/>"><img class="product-img" src="<c:url value="/"/>{{image.imageUrl}}"></a>
- {{/image}}
- </div>
- <!-- *** Product Name & Price Starts *** -->
- <div class="caption">
- <div class="product-details">
- <div class="clearfix">
- <h3 class="product-heading product-name" itemprop="name">{{description.name}}</h3>
- <h4 class="price">
- {{#discounted}}<del>{{originalPrice}}</del> <span itemprop="price" class="specialPrice">{{finalPrice}}</span>{{/discounted}}
- {{^discounted}}<span itemprop="price" class="specialPrice">{{finalPrice}}</span>{{/discounted}}
- </h4>
- <!-- Product Name & Price Ends -->
- <!-- Product Buttons Starts -->
- <div class="clearfix">
- <a class="btn btn-default pull-left" href="<c:url value="/shop/product/" />{{description.friendlyUrl}}.html<sm:breadcrumbParam/>" class="details"><s:message code="button.label.view" text="Details" /></a>
- <c:if test="${requestScope.CONFIGS['allowPurchaseItems'] == true}">
- {{#canBePurchased}}<a class="btn btn-buy pull-right addToCart" href="javascript:void(0);" class="addToCart" productId="{{id}}"><s:message code="button.label.addToCart" text="Add to cart" /></a>{{/canBePurchased}}
- </c:if>
- </div>
- </div>
- </div>
- </div>
-</div>
-</div>
-{{/products}}
-</script>
-
-
- <!-- don't change that script except max_oroducts -->
- <script>
-
- var START_COUNT_PRODUCTS = 0;
- var MAX_PRODUCTS = 500;
- var filter = null;
- var filterValue = null;
-
- $(function(){
-
- <c:if test="${productGroup!=null}">
- loadItemsProducts();
- </c:if>
-
- });
-
-
- function loadItemsProducts() {
-
- //services/public/{store}/products/group/{code}
- var url = '<%=request.getContextPath()%>/services/public/<c:out value="${requestScope.MERCHANT_STORE.code}"/>/products/group/<c:out value="${productGroup}"/>';
- loadProducts(url,'#productsContainer');
-
- }
-
-
- function buildProductsList(productList, divProductsContainer) {
- log('Products-> ' + productList.products.length);
- var productsTemplate = Hogan.compile(document.getElementById("productBoxTemplate").innerHTML);
- var productsRendred = productsTemplate.render(productList);
- $('#productsContainer').append(productsRendred);
- initBindings();
- }
-
- function callBackLoadProducts(productList) {
-
- var productQty = productList.productCount + ' <s:message code="label.search.items.found" text="item(s) found" />';
- $('#products-qty').html(productQty);
- $('#productsContainer').hideLoading();
-
- }
-
-</script>
-
-
- <div class="container">
- <div class="row">
- <div id="shop" class="col-md-12">
- <c:out value="${content.description}" escapeXml="false"/>
- </div>
- </div>
- <c:if test="${productGroup!=null}">
- <div class="col-md-12">
- <div class="product-list">
-
-
- <!-- just copy that block for havimg products displayed -->
- <!-- products are loaded by ajax -->
- <div id="productsContainer" class="list-unstyled"></div>
-
- <!-- end block -->
-
- </div>
-
- </div>
- </c:if>
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+
+ <script type="text/html" id="productBoxTemplate">
+{{#products}}
+<div itemscope itemtype="http://schema.org/Enumeration" class="col-md-4 productItem" item-order="{{sortOrder}}" item-name="{{description.name}}" item-price="{{price}}" data-id="{{id}}" class="col-sm-4">
+<div class="box-style-4 white-bg object-non-visible animated object-visible">
+ {{#description.highlights}}
+ <div class="ribbon-wrapper-green">
+ <div class="ribbon-green">
+ {{description.highlights}}
+ </div>
+ </div>
+ {{/description.highlights}}
+ {{^canBePurchased}}
+ <div class="sold-out-box">
+ <span class="sold-out-text"><s:message code="label.soldout" text="Sold out" /></span>
+ </div>
+ {{/canBePurchased}}
+ <div class="product-image">
+ {{#image}}
+ <img class="product-img" src="<c:url value=""/>{{image.imageUrl}}"><a class="overlay" href="<c:url value="/shop/product/" />{{description.friendlyUrl}}.html<sm:breadcrumbParam/>"><img class="product-img" src="<c:url value="/"/>{{image.imageUrl}}"></a>
+ {{/image}}
+ </div>
+ <!-- *** Product Name & Price Starts *** -->
+ <div class="caption">
+ <div class="product-details">
+ <div class="clearfix">
+ <h3 class="product-heading product-name" itemprop="name">{{description.name}}</h3>
+ <h4 class="price">
+ {{#discounted}}<del>{{originalPrice}}</del> <span itemprop="price" class="specialPrice">{{finalPrice}}</span>{{/discounted}}
+ {{^discounted}}<span itemprop="price" class="specialPrice">{{finalPrice}}</span>{{/discounted}}
+ </h4>
+ <!-- Product Name & Price Ends -->
+ <!-- Product Buttons Starts -->
+ <div class="clearfix">
+ <a class="btn btn-default pull-left" href="<c:url value="/shop/product/" />{{description.friendlyUrl}}.html<sm:breadcrumbParam/>" class="details"><s:message code="button.label.view" text="Details" /></a>
+ <c:if test="${requestScope.CONFIGS['allowPurchaseItems'] == true}">
+ {{#canBePurchased}}<a class="btn btn-buy pull-right addToCart" href="javascript:void(0);" class="addToCart" productId="{{id}}"><s:message code="button.label.addToCart" text="Add to cart" /></a>{{/canBePurchased}}
+ </c:if>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+</div>
+{{/products}}
+</script>
+
+
+ <!-- don't change that script except max_oroducts -->
+ <script>
+
+ var START_COUNT_PRODUCTS = 0;
+ var MAX_PRODUCTS = 500;
+ var filter = null;
+ var filterValue = null;
+
+ $(function(){
+
+ <c:if test="${productGroup!=null}">
+ loadItemsProducts();
+ </c:if>
+
+ });
+
+
+ function loadItemsProducts() {
+
+ //services/public/{store}/products/group/{code}
+ var url = '<%=request.getContextPath()%>/services/public/<c:out value="${requestScope.MERCHANT_STORE.code}"/>/products/group/<c:out value="${productGroup}"/>';
+ loadProducts(url,'#productsContainer');
+
+ }
+
+
+ function buildProductsList(productList, divProductsContainer) {
+ log('Products-> ' + productList.products.length);
+ var productsTemplate = Hogan.compile(document.getElementById("productBoxTemplate").innerHTML);
+ var productsRendred = productsTemplate.render(productList);
+ $('#productsContainer').append(productsRendred);
+ initBindings();
+ }
+
+ function callBackLoadProducts(productList) {
+
+ var productQty = productList.productCount + ' <s:message code="label.search.items.found" text="item(s) found" />';
+ $('#products-qty').html(productQty);
+ $('#productsContainer').hideLoading();
+
+ }
+
+</script>
+
+
+ <div class="container">
+ <div class="row">
+ <div id="shop" class="col-md-12">
+ <c:out value="${content.description}" escapeXml="false"/>
+ </div>
+ </div>
+ <c:if test="${productGroup!=null}">
+ <div class="col-md-12">
+ <div class="product-list">
+
+
+ <!-- just copy that block for havimg products displayed -->
+ <!-- products are loaded by ajax -->
+ <div id="productsContainer" class="list-unstyled"></div>
+
+ <!-- end block -->
+
+ </div>
+
+ </div>
+ </c:if>
</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/pages/customer.jsp b/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/pages/customer.jsp
index 373471b..134280e 100644
--- a/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/pages/customer.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/pages/customer.jsp
@@ -1,21 +1,21 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-
-<%
-/** Nothing just use the common customer dashboard page **/
-%>
-
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+<%
+/** Nothing just use the common customer dashboard page **/
+%>
+
<jsp:include page="/pages/shop/common/customer/dashboard.jsp" />
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/pages/product.jsp b/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/pages/product.jsp
index f9c6a39..8f240b9 100644
--- a/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/pages/product.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/pages/product.jsp
@@ -1,258 +1,258 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-
-<script src="<c:url value="/resources/js/jquery.elevateZoom-3.0.8.min.js" />"></script>
-<script src="<c:url value="/resources/js/jquery.raty.min.js" />"></script>
-
-
- <div id="shop" class="container">
-
-
- <jsp:include page="/pages/shop/templates/exoticamobilia/sections/breadcrumb.jsp" />
-
- <c:if test="${product.images!=null && fn:length(product.images) gt 1}">
- <c:forEach items="${product.images}" var="thumbnail">
- <c:if test="${thumbnail.videoUrl!=null}">
- <c:set var="VIDEO_URL" value="${thumbnail.videoUrl}" scope="request" />
- </c:if>
-
- </c:forEach>
- </c:if>
-
- <section class="main-container">
-
- <div class="main col-md-12 no-left-padding no-right-padding">
-
-
- <!-- page-title start -->
- <h1 class="page-title margin-top-clear">${product.description.name}</h1>
- <!-- page-title end -->
-
- <div class="row">
-
- <div class="col-md-4">
-
- <ul role="tablist" class="nav nav-pills white space-top">
- <li class="active">
- <a title="images" data-toggle="tab" role="tab" href="#product-images">
- <i class="fa fa-camera pr-5"></i> <s:message code="label.generic.pictures" text="Pictures" />
- </a>
- </li>
- <c:if test="${requestScope.VIDEO_URL!=null}">
- <li>
- <a title="video" data-toggle="tab" role="tab" href="#product-video">
- <i class="fa fa-video-camera pr-5"></i> <s:message code="label.generic.videos" text="Videos" />
- </a>
- </li>
- </c:if>
- </ul>
- <div class="tab-content clear-style">
- <c:if test="${product.image!=null}">
- <div id="product-images" class="tab-pane active">
-
-
- <div style="width:100%;" class="owl-item">
- <div id="largeImg" class="overlay-container image-container">
- <img src="<c:url value="${product.image.imageUrl}"/>" alt="<c:out value="${product.description.name}"/>">
- <a href="<sm:shopProductImage imageName="${product.image.imageName}" sku="${product.sku}" size="LARGE"/>" class="popup-img overlay" title="<c:out value="${product.description.name}"/>"><i class="fa fa-search-plus"></i></a>
- </div>
- </div>
-
- <c:if test="${product.images!=null && fn:length(product.images) gt 1}">
- <div id="imageGallery" class="row">
- <c:forEach items="${product.images}" var="thumbnail">
- <c:if test="${thumbnail.imageType==0}">
- <div class="col-xs-6 col-md-3">
- <c:choose>
- <c:when test="${thumbnail.externalUrl==null}">
- <a href="javascript:;"" class="detailsThumbImg thumbImg thumbnail" imgId="im-<c:out value="${thumbnail.id}"/>" title="<c:out value="${thumbnail.imageName}"/>" rel="<c:url value="${thumbnail.imageUrl}"/>"><img height="100" src="<c:url value="${thumbnail.imageUrl}"/>" alt="<c:url value="${thumbnail.imageName}"/>" ></a>
- </c:when>
- <c:otherwise>
- <a href="javascript:;"" class="detailsThumbImg thumbImg thumbnail" imgId="im-<c:out value="${thumbnail.id}"/>" title="<c:out value="${product.description.name}"/>" rel="<c:url value="${thumbnail.externalUrl}"/>"><img height="100" src="${thumbnail.externalUrl}" alt="<c:url value="${product.description.name}"/>" ></a>
- </c:otherwise>
- </c:choose>
- </div>
- </c:if>
- </c:forEach>
- </div>
- </c:if>
- </div>
- </c:if>
-
- <c:if test="${requestScope.VIDEO_URL!=null}">
- <div class="tab-pane" id="product-video">
- <div class="embed-responsive embed-responsive-16by9">
- <iframe class="embed-responsive-item" height="350" src="<c:out value="${requestScope.VIDEO_URL}"/>"></iframe>
-
- </div>
- </div>
- </c:if>
-
-
- <hr>
- <c:set var="HIDEACTION" value="TRUE" scope="request" />
- <!-- product rating -->
- <jsp:include page="/pages/shop/common/catalog/rating.jsp" />
- <span itemprop="offerDetails" itemscope itemtype="http://data-vocabulary.org/Offer">
- <meta itemprop="seller" content="${requestScope.MERCHANT_STORE.storename}"/>
- <meta itemprop="currency" content="<c:out value="${requestScope.MERCHANT_STORE.currency.code}" />" />
- <span id="productPrice" class="price">
- <c:choose>
- <c:when test="${product.discounted}">
- <del><c:out value="${product.originalPrice}" /></del> <span class="specialPrice"><span itemprop="price"><c:out value="${product.finalPrice}" /></span></span>
- </c:when>
- <c:otherwise>
- <span itemprop="price"><c:out value="${product.finalPrice}" /></span>
- </c:otherwise>
- </c:choose>
- </span>
- <c:if test="${not product.productVirtual}">
- <address>
- <strong><s:message code="label.product.available" text="Availability"/></strong>: <span><c:choose><c:when test="${product.quantity>0}"><span itemprop="availability" content="in_stock">${product.quantity}</span></c:when><c:otherwise><span itemprop="availability" content="out_of_stock"><s:message code="label.product.outofstock" text="Out of stock" /></c:otherwise></c:choose></span><br>
- </address>
- </c:if>
- </span>
- <p>
- <!--<div class="fb-like" data-href="<c:out value="${requestScope.MERCHANT_STORE.domainName}"/><c:url value="/shop/${product.description.friendlyUrl}.html"/>" data-layout="standard" data-action="like" data-show-faces="true" data-share="true"></div>-->
- <iframe src="https://www.facebook.com/plugins/share_button.php?href=<c:out value="${requestScope.CONFIGS['SHOP_SCHEME']}"/>%3A%2F%2F<c:out value="${requestScope.MERCHANT_STORE.domainName}"/><c:url value="/shop/${product.description.friendlyUrl}.html"/>&layout=button_count&size=large&mobile_iframe=true&appId=<c:out value="${requestScope.CONFIGS['shopizer.facebook-appid']}"/>&width=83&height=28" width="83" height="28" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowTransparency="true"></iframe>
- </p>
- <jsp:include page="/pages/shop/common/catalog/addToCartProduct.jsp" />
- </div>
- </div>
-
- <!--</div>-->
-
- <aside class="col-md-8">
- <div class="sidebar">
- <div class="side product-item vertical-divider-left">
- <div class="productItem tabs-style-2">
- <!-- Nav tabs -->
- <ul role="tablist" class="nav nav-tabs">
- <li class="active"><a data-toggle="tab" role="tab" href="#h2tab1" aria-expanded="true"><i class="fa fa-file-text-o pr-5"></i><s:message code="label.productedit.productdesc" text="Product description" /></a></li>
- <li class=""><a data-toggle="tab" role="tab" href="#h2tab2" aria-expanded="false"><i class="fa fa-files-o pr-5"></i><s:message code="label.product.attribute.specifications" text="Specifications" /></a></li>
- <li class=""><a data-toggle="tab" role="tab" href="#h2tab3"><i class="fa fa-star pr-5"></i><s:message code="label.product.customer.reviews" text="Customer reviews" /></a></li>
- </ul>
- <!-- Tab panes -->
- <div class="tab-content padding-top-clear padding-bottom-clear">
- <div id="h2tab1" class="tab-pane fade active in">
- <h4 class="space-top"></h4>
-
- <c:out value="${product.description.description}" escapeXml="false"/>
-
- <p>
- <dl class="dl-horizontal">
- <!--<dt><s:message code="label.product.weight" text="Weight" />:</dt>
- <dd><fmt:formatNumber value="${product.productWeight}" maxFractionDigits="2"/> <s:message code="label.generic.weightunit.${requestScope.MERCHANT_STORE.weightunitcode}" text="Pounds" /></dd>-->
- <dt><s:message code="label.product.height" text="Height" />:</dt>
- <dd><fmt:formatNumber value="${product.productHeight}" maxFractionDigits="2"/> <s:message code="label.generic.sizeunit.${requestScope.MERCHANT_STORE.seizeunitcode}" text="Inches" /></dd>
- <dt><s:message code="label.product.width" text="Width" />:</dt>
- <dd><fmt:formatNumber value="${product.productWidth}" maxFractionDigits="2"/> <s:message code="label.generic.sizeunit.${requestScope.MERCHANT_STORE.seizeunitcode}" text="Inches" /></dd>
- <dt><s:message code="label.product.length" text="Length" />:</dt>
- <dd><fmt:formatNumber value="${product.productLength}" maxFractionDigits="2"/> <s:message code="label.generic.sizeunit.${requestScope.MERCHANT_STORE.seizeunitcode}" text="Inches" /></dd>
- </dl>
- </p>
- <c:if test="${product.manufacturer.code=='green' || product.manufacturer.code=='local'}">
- <c:if test="${requestScope.CONTENT['fsa']!=null}">
- <sm:pageContent contentCode="fsa"/>
- </c:if>
- </c:if>
- </div>
- <div id="h2tab2" class="tab-pane fade">
-
- <!-- read only properties -->
-
- <h4 class="space-top"><s:message code="label.product.attribute.specifications" text="Specifications" /></h4>
-
-
- <dl class="dl-horizontal">
-
- <c:if test="${attributes!=null}">
- <c:forEach items="${attributes}" var="attribute" varStatus="status">
- <dt><c:out value="${attribute.name}"/></dt>
- <dd><c:out value="${attribute.readOnlyValue.description}" /></dd>
- </c:forEach>
- </c:if>
- </dl>
-
-
-
- </div>
- <div id="h2tab3" class="tab-pane fade">
- <!-- comments start -->
- <h4 class="space-top">
- <s:message code="label.product.customer.reviews" text="Customer reviews" />
- </h4>
-
- <!-- reviews -->
- <jsp:include page="/pages/shop/common/catalog/reviews.jsp" />
-
-
-
- </div>
- </div>
- </div>
- </div>
- </aside>
- <!--
- </div>
- </div>
- -->
- </section>
-
- <!-- Related items -->
- <c:if test="${relatedProducts!=null}">
- <div class="section clearfix main-container">
- <div class="container no-left-padding no-right-padding">
- <div class="row">
- <div class="col-md-12">
- <h2><s:message code="label.product.related.title" text="Related items"/></h2>
- <!--<p>Voici quelques suggestions de produits additionnels</p>-->
- <!-- Iterate over featuredItems -->
- <c:set var="ITEMS" value="${relatedProducts}" scope="request" />
- <jsp:include page="/pages/shop/templates/exoticamobilia/sections/productBox.jsp" />
- </div>
- </div>
- </div>
- </div>
- </c:if>
-
- </div>
-
-
-
- <script>
-
- $(function () {
-
- $('.popup-img').magnificPopup({type:'image'});
-
-
- $('.thumbImg').click(function(){
- var igId = $(this).attr('imgId');
- var url = $(this).attr('rel');
- var name = $(this).attr('title');
- $("#largeImg").html("<img src='" + url + "' /><a href='" + url + "' data-mfp-src='" + url + "' class='popup-img overlay' title='" + name + "'><i class='fa fa-search-plus'></i></a>");
- //re bind action
- $('.popup-img').magnificPopup({type:'image'});
- })
-
- })
-
-
-
- </script>
-
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+<script src="<c:url value="/resources/js/jquery.elevateZoom-3.0.8.min.js" />"></script>
+<script src="<c:url value="/resources/js/jquery.raty.min.js" />"></script>
+
+
+ <div id="shop" class="container">
+
+
+ <jsp:include page="/pages/shop/templates/exoticamobilia/sections/breadcrumb.jsp" />
+
+ <c:if test="${product.images!=null && fn:length(product.images) gt 1}">
+ <c:forEach items="${product.images}" var="thumbnail">
+ <c:if test="${thumbnail.videoUrl!=null}">
+ <c:set var="VIDEO_URL" value="${thumbnail.videoUrl}" scope="request" />
+ </c:if>
+
+ </c:forEach>
+ </c:if>
+
+ <section class="main-container">
+
+ <div class="main col-md-12 no-left-padding no-right-padding">
+
+
+ <!-- page-title start -->
+ <h1 class="page-title margin-top-clear">${product.description.name}</h1>
+ <!-- page-title end -->
+
+ <div class="row">
+
+ <div class="col-md-4">
+
+ <ul role="tablist" class="nav nav-pills white space-top">
+ <li class="active">
+ <a title="images" data-toggle="tab" role="tab" href="#product-images">
+ <i class="fa fa-camera pr-5"></i> <s:message code="label.generic.pictures" text="Pictures" />
+ </a>
+ </li>
+ <c:if test="${requestScope.VIDEO_URL!=null}">
+ <li>
+ <a title="video" data-toggle="tab" role="tab" href="#product-video">
+ <i class="fa fa-video-camera pr-5"></i> <s:message code="label.generic.videos" text="Videos" />
+ </a>
+ </li>
+ </c:if>
+ </ul>
+ <div class="tab-content clear-style">
+ <c:if test="${product.image!=null}">
+ <div id="product-images" class="tab-pane active">
+
+
+ <div style="width:100%;" class="owl-item">
+ <div id="largeImg" class="overlay-container image-container">
+ <img src="<c:url value="${product.image.imageUrl}"/>" alt="<c:out value="${product.description.name}"/>">
+ <a href="<sm:shopProductImage imageName="${product.image.imageName}" sku="${product.sku}" size="LARGE"/>" class="popup-img overlay" title="<c:out value="${product.description.name}"/>"><i class="fa fa-search-plus"></i></a>
+ </div>
+ </div>
+
+ <c:if test="${product.images!=null && fn:length(product.images) gt 1}">
+ <div id="imageGallery" class="row">
+ <c:forEach items="${product.images}" var="thumbnail">
+ <c:if test="${thumbnail.imageType==0}">
+ <div class="col-xs-6 col-md-3">
+ <c:choose>
+ <c:when test="${thumbnail.externalUrl==null}">
+ <a href="javascript:;"" class="detailsThumbImg thumbImg thumbnail" imgId="im-<c:out value="${thumbnail.id}"/>" title="<c:out value="${thumbnail.imageName}"/>" rel="<c:url value="${thumbnail.imageUrl}"/>"><img height="100" src="<c:url value="${thumbnail.imageUrl}"/>" alt="<c:url value="${thumbnail.imageName}"/>" ></a>
+ </c:when>
+ <c:otherwise>
+ <a href="javascript:;"" class="detailsThumbImg thumbImg thumbnail" imgId="im-<c:out value="${thumbnail.id}"/>" title="<c:out value="${product.description.name}"/>" rel="<c:url value="${thumbnail.externalUrl}"/>"><img height="100" src="${thumbnail.externalUrl}" alt="<c:url value="${product.description.name}"/>" ></a>
+ </c:otherwise>
+ </c:choose>
+ </div>
+ </c:if>
+ </c:forEach>
+ </div>
+ </c:if>
+ </div>
+ </c:if>
+
+ <c:if test="${requestScope.VIDEO_URL!=null}">
+ <div class="tab-pane" id="product-video">
+ <div class="embed-responsive embed-responsive-16by9">
+ <iframe class="embed-responsive-item" height="350" src="<c:out value="${requestScope.VIDEO_URL}"/>"></iframe>
+
+ </div>
+ </div>
+ </c:if>
+
+
+ <hr>
+ <c:set var="HIDEACTION" value="TRUE" scope="request" />
+ <!-- product rating -->
+ <jsp:include page="/pages/shop/common/catalog/rating.jsp" />
+ <span itemprop="offerDetails" itemscope itemtype="http://data-vocabulary.org/Offer">
+ <meta itemprop="seller" content="${requestScope.MERCHANT_STORE.storename}"/>
+ <meta itemprop="currency" content="<c:out value="${requestScope.MERCHANT_STORE.currency.code}" />" />
+ <span id="productPrice" class="price">
+ <c:choose>
+ <c:when test="${product.discounted}">
+ <del><c:out value="${product.originalPrice}" /></del> <span class="specialPrice"><span itemprop="price"><c:out value="${product.finalPrice}" /></span></span>
+ </c:when>
+ <c:otherwise>
+ <span itemprop="price"><c:out value="${product.finalPrice}" /></span>
+ </c:otherwise>
+ </c:choose>
+ </span>
+ <c:if test="${not product.productVirtual}">
+ <address>
+ <strong><s:message code="label.product.available" text="Availability"/></strong>: <span><c:choose><c:when test="${product.quantity>0}"><span itemprop="availability" content="in_stock">${product.quantity}</span></c:when><c:otherwise><span itemprop="availability" content="out_of_stock"><s:message code="label.product.outofstock" text="Out of stock" /></c:otherwise></c:choose></span><br>
+ </address>
+ </c:if>
+ </span>
+ <p>
+ <!--<div class="fb-like" data-href="<c:out value="${requestScope.MERCHANT_STORE.domainName}"/><c:url value="/shop/${product.description.friendlyUrl}.html"/>" data-layout="standard" data-action="like" data-show-faces="true" data-share="true"></div>-->
+ <iframe src="https://www.facebook.com/plugins/share_button.php?href=<c:out value="${requestScope.CONFIGS['SHOP_SCHEME']}"/>%3A%2F%2F<c:out value="${requestScope.MERCHANT_STORE.domainName}"/><c:url value="/shop/${product.description.friendlyUrl}.html"/>&layout=button_count&size=large&mobile_iframe=true&appId=<c:out value="${requestScope.CONFIGS['shopizer.facebook-appid']}"/>&width=83&height=28" width="83" height="28" style="border:none;overflow:hidden" scrolling="no" frameborder="0" allowTransparency="true"></iframe>
+ </p>
+ <jsp:include page="/pages/shop/common/catalog/addToCartProduct.jsp" />
+ </div>
+ </div>
+
+ <!--</div>-->
+
+ <aside class="col-md-8">
+ <div class="sidebar">
+ <div class="side product-item vertical-divider-left">
+ <div class="productItem tabs-style-2">
+ <!-- Nav tabs -->
+ <ul role="tablist" class="nav nav-tabs">
+ <li class="active"><a data-toggle="tab" role="tab" href="#h2tab1" aria-expanded="true"><i class="fa fa-file-text-o pr-5"></i><s:message code="label.productedit.productdesc" text="Product description" /></a></li>
+ <li class=""><a data-toggle="tab" role="tab" href="#h2tab2" aria-expanded="false"><i class="fa fa-files-o pr-5"></i><s:message code="label.product.attribute.specifications" text="Specifications" /></a></li>
+ <li class=""><a data-toggle="tab" role="tab" href="#h2tab3"><i class="fa fa-star pr-5"></i><s:message code="label.product.customer.reviews" text="Customer reviews" /></a></li>
+ </ul>
+ <!-- Tab panes -->
+ <div class="tab-content padding-top-clear padding-bottom-clear">
+ <div id="h2tab1" class="tab-pane fade active in">
+ <h4 class="space-top"></h4>
+
+ <c:out value="${product.description.description}" escapeXml="false"/>
+
+ <p>
+ <dl class="dl-horizontal">
+ <!--<dt><s:message code="label.product.weight" text="Weight" />:</dt>
+ <dd><fmt:formatNumber value="${product.productWeight}" maxFractionDigits="2"/> <s:message code="label.generic.weightunit.${requestScope.MERCHANT_STORE.weightunitcode}" text="Pounds" /></dd>-->
+ <dt><s:message code="label.product.height" text="Height" />:</dt>
+ <dd><fmt:formatNumber value="${product.productHeight}" maxFractionDigits="2"/> <s:message code="label.generic.sizeunit.${requestScope.MERCHANT_STORE.seizeunitcode}" text="Inches" /></dd>
+ <dt><s:message code="label.product.width" text="Width" />:</dt>
+ <dd><fmt:formatNumber value="${product.productWidth}" maxFractionDigits="2"/> <s:message code="label.generic.sizeunit.${requestScope.MERCHANT_STORE.seizeunitcode}" text="Inches" /></dd>
+ <dt><s:message code="label.product.length" text="Length" />:</dt>
+ <dd><fmt:formatNumber value="${product.productLength}" maxFractionDigits="2"/> <s:message code="label.generic.sizeunit.${requestScope.MERCHANT_STORE.seizeunitcode}" text="Inches" /></dd>
+ </dl>
+ </p>
+ <c:if test="${product.manufacturer.code=='green' || product.manufacturer.code=='local'}">
+ <c:if test="${requestScope.CONTENT['fsa']!=null}">
+ <sm:pageContent contentCode="fsa"/>
+ </c:if>
+ </c:if>
+ </div>
+ <div id="h2tab2" class="tab-pane fade">
+
+ <!-- read only properties -->
+
+ <h4 class="space-top"><s:message code="label.product.attribute.specifications" text="Specifications" /></h4>
+
+
+ <dl class="dl-horizontal">
+
+ <c:if test="${attributes!=null}">
+ <c:forEach items="${attributes}" var="attribute" varStatus="status">
+ <dt><c:out value="${attribute.name}"/></dt>
+ <dd><c:out value="${attribute.readOnlyValue.description}" /></dd>
+ </c:forEach>
+ </c:if>
+ </dl>
+
+
+
+ </div>
+ <div id="h2tab3" class="tab-pane fade">
+ <!-- comments start -->
+ <h4 class="space-top">
+ <s:message code="label.product.customer.reviews" text="Customer reviews" />
+ </h4>
+
+ <!-- reviews -->
+ <jsp:include page="/pages/shop/common/catalog/reviews.jsp" />
+
+
+
+ </div>
+ </div>
+ </div>
+ </div>
+ </aside>
+ <!--
+ </div>
+ </div>
+ -->
+ </section>
+
+ <!-- Related items -->
+ <c:if test="${relatedProducts!=null}">
+ <div class="section clearfix main-container">
+ <div class="container no-left-padding no-right-padding">
+ <div class="row">
+ <div class="col-md-12">
+ <h2><s:message code="label.product.related.title" text="Related items"/></h2>
+ <!--<p>Voici quelques suggestions de produits additionnels</p>-->
+ <!-- Iterate over featuredItems -->
+ <c:set var="ITEMS" value="${relatedProducts}" scope="request" />
+ <jsp:include page="/pages/shop/templates/exoticamobilia/sections/productBox.jsp" />
+ </div>
+ </div>
+ </div>
+ </div>
+ </c:if>
+
+ </div>
+
+
+
+ <script>
+
+ $(function () {
+
+ $('.popup-img').magnificPopup({type:'image'});
+
+
+ $('.thumbImg').click(function(){
+ var igId = $(this).attr('imgId');
+ var url = $(this).attr('rel');
+ var name = $(this).attr('title');
+ $("#largeImg").html("<img src='" + url + "' /><a href='" + url + "' data-mfp-src='" + url + "' class='popup-img overlay' title='" + name + "'><i class='fa fa-search-plus'></i></a>");
+ //re bind action
+ $('.popup-img').magnificPopup({type:'image'});
+ })
+
+ })
+
+
+
+ </script>
+
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/sections/breadcrumb.jsp b/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/sections/breadcrumb.jsp
index 06d0e4e..7f2b00b 100644
--- a/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/sections/breadcrumb.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/sections/breadcrumb.jsp
@@ -1,35 +1,35 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-
-
- <div class="page-intro" style="margin-top: 0px;">
- <div class="container">
- <div class="row">
- <div class="col-md-12">
- <ol class="breadcrumb">
- <c:forEach items="${requestScope.BREADCRUMB.breadCrumbs}" var="breadcrumb" varStatus="count">
- <li class="active"><c:if test="${count.index==0}"><i class="fa fa-home pr-10"></i></c:if>
- <a href="${breadcrumb.url}<sm:breadcrumbParam/>">${breadcrumb.label}</a>
- </li>
- </c:forEach>
- </ol>
- </div>
- </div>
- </div>
- </div>
-
-
-
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+
+ <div class="page-intro" style="margin-top: 0px;">
+ <div class="container">
+ <div class="row">
+ <div class="col-md-12">
+ <ol class="breadcrumb">
+ <c:forEach items="${requestScope.BREADCRUMB.breadCrumbs}" var="breadcrumb" varStatus="count">
+ <li class="active"><c:if test="${count.index==0}"><i class="fa fa-home pr-10"></i></c:if>
+ <a href="${breadcrumb.url}<sm:breadcrumbParam/>">${breadcrumb.label}</a>
+ </li>
+ </c:forEach>
+ </ol>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/sections/footer.jsp b/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/sections/footer.jsp
index d3f486d..89a6bf3 100644
--- a/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/sections/footer.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/sections/footer.jsp
@@ -1,173 +1,173 @@
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
-<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-
- <!-- footer -->
- <footer id="footer">
-
- <div class="footer">
-
- <div id="footer-section" class="container">
-
- <div class="row">
- <div class="col-md-6">
- <div class="logo">
- <a class="store-name" href="<c:url value="/shop/"/>"><c:out value="${requestScope.MERCHANT_STORE.storename}"/></a>
- </div>
- </div>
- </div>
-
- <br/>
- <div class="row">
-
- <div class="col-md-12">
- <div class="col-md-3 col-sm-6">
- <c:if test="${not empty requestScope.CONTENT_PAGE}">
- <p class="lead"><s:message code="label.store.information.title" text="Informations"/></p>
- <!-- Pages -->
- <ul class="footerLiks">
- <c:forEach items="${requestScope.CONTENT_PAGE}" var="content">
- <li><a href="<c:url value="/shop/pages/${content.seUrl}.html"/>" class="current">${content.name}</a></li>
- </c:forEach>
- <c:if test="${requestScope.CONFIGS['displayContactUs']==true}">
- <li><a href="<c:url value="/shop/store/contactus.html"/>"><s:message code="label.customer.contactus" text="Contact us"/></a></li>
- </c:if>
- </ul>
- </c:if>
-
-
- <c:if test="${requestScope.CONFIGS['facebook_page_url'] != null || requestScope.CONFIGS['twitter_handle'] != null || requestScope.CONFIGS['pinterest'] != null || requestScope.CONFIGS['instagram'] != null}">
- <ul class="social-links circle">
- <c:if test="${requestScope.CONFIGS['twitter_handle'] != null}">
- <li class="twitter"><a target="_blank" href="<c:out value="${requestScope.CONFIGS['twitter_handle']}"/>"><i class="fa fa-twitter"></i></a></li>
- </c:if>
- <c:if test="${requestScope.CONFIGS['facebook_page_url'] != null}">
- <li class="facebook"><a target="_blank" href="<c:out value="${requestScope.CONFIGS['facebook_page_url']}"/>"><i class="fa fa-facebook"></i></a></li>
- </c:if>
- <c:if test="${requestScope.CONFIGS['pinterest'] != null}">
- <li class="pinterest"><a target="_blank" href="<c:out value="${requestScope.CONFIGS['pinterest']}"/>"><i class="fa fa-pinterest"></i></a></li>
- </c:if>
- <c:if test="${requestScope.CONFIGS['instagram'] != null}">
- <li class="instagram"><a target="_blank" href="<c:out value="${requestScope.CONFIGS['instagram']}"/>"><i class="fa fa-instagram"></i></a></li>
- </c:if>
- </ul>
- </c:if>
-
- <c:if test="${requestScope.CONTENT['paymentDetails']!=null}">
- <sm:pageContent contentCode="paymentDetails"/>
- </c:if>
-
- <hr class="hidden-md hidden-lg hidden-sm">
-
- </div><!-- /.col-md-3 -->
-
- <div class="col-md-3 col-sm-6">
-
- <c:if test="${requestScope.CONFIGS['displayStoreAddress'] == true}">
- <ul class="list-icons">
- <jsp:include page="/pages/shop/common/preBuiltBlocks/storeAddress.jsp"/>
- <c:if test="${requestScope.CONTENT['contactUsDetails']!=null}">
- <br/>
- <sm:pageContent contentCode="contactUsDetails"/>
- </c:if>
- </ul>
- </c:if>
-
-
- <hr class="hidden-md hidden-lg">
-
- </div><!-- /.col-md-3 -->
-
- <div class="col-md-2 col-sm-6">
-
- <div class="footer-content">
- <c:if test="${not empty requestScope.TOP_CATEGORIES}">
- <%-- a verifier top categories EN/FR --%>
- <%-- <p class="lead">Top categories</p> --%>
- <ul class="nav nav-pills nav-stacked">
- <li class="<sm:activeLink linkCode="HOME" activeReturnCode="active"/>">
- <a href="<c:url value="/shop"/>"><s:message code="menu.home" text="Home"/></a>
- </li>
- <c:forEach items="${requestScope.TOP_CATEGORIES}" var="category">
- <li>
- <a href="<c:url value="/shop/category/${category.description.friendlyUrl}.html"/><sm:breadcrumbParam categoryId="${category.id}"/>" class="current">
- <span class="name">${category.description.name}</span>
- </a>
- </li>
- </c:forEach>
- <c:if test="${requestScope.CONFIGS['displayContactUs']==true}">
- <li class="<sm:activeLink linkCode="CONTACT" activeReturnCode="active"/>"><a href="<c:url value="/shop/store/contactus.html"/>"><s:message code="label.customer.contactus" text="Contact us"/></a></li>
- </c:if>
- </ul>
- </c:if>
- <c:if test="${requestScope.CONFIGS['displayCustomerSection'] == true}">
- <!--
- <ul class="nav nav-pills nav-stacked">
- <sec:authorize access="hasRole('AUTH_CUSTOMER') and fullyAuthenticated">
- <li><a href="<c:url value="/shop/customer/account.html"/>"><s:message code="menu.profile" text="Profile"/></a></li>
- <li><a href="<c:url value="/shop/customer/billing.html"/>"><s:message code="label.customer.billingshipping" text="Billing & shipping information"/></a></li>
- <li><s:message code="label.order.recent" text="Recent orders"/></li>
- </sec:authorize>
- <sec:authorize access="!hasRole('AUTH_CUSTOMER') and fullyAuthenticated">
- <li>
- <s:message code="label.security.loggedinas" text="You are logged in as"/> [<sec:authentication property="principal.username"/>]. <s:message code="label.security.nologinacces.store" text="We can't display store logon box"/>
- </li>
- </sec:authorize>
- <sec:authorize access="!hasRole('AUTH_CUSTOMER') and !fullyAuthenticated">
- <li><a href="#"><s:message code="button.label.signin" text="Signin" /></a></li>
- </sec:authorize>
- </ul>
- -->
- </c:if>
-
-
- <hr class="hidden-md hidden-lg hidden-sm">
- </div>
-
- </div><!-- /.col-md-2 -->
-
-
-
- <div class="col-md-4 col-sm-6">
- <c:if test="${requestScope.CONTENT['footerMessage']!=null}">
- <sm:pageContent contentCode="footerMessage"/>
- </c:if>
- </div><!-- /.col-md-3 -->
- </div>
-
- </div>
- </div>
- </div>
-
- <div class="subfooter">
- <div class="container">
- <div class="row">
- <div class="col-md-6"><sm:storeCopy/> - <s:message code="label.generic.providedby" /> <a href="http://www.shopizer.com" class="footer-href" target="_blank">Shopizer</a></div>
- <div class="col-md-6">
- <div id="navbar-collapse-2" class="collapse navbar-collapse">
- <ul class="nav navbar-nav">
- <li class="<sm:activeLink linkCode="HOME" activeReturnCode="active"/>">
- <a href="<c:url value="/shop"/>"><s:message code="menu.home" text="Home"/></a>
- </li>
- <c:if test="${requestScope.CONFIGS['displayContactUs']==true}">
- <li class="<sm:activeLink linkCode="CONTACT" activeReturnCode="active"/>"><a href="<c:url value="/shop/store/contactus.html"/>"><s:message code="label.customer.contactus" text="Contact us"/></a></li>
- </c:if>
- </ul>
- </div>
- </div>
- </div>
- </div>
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+ <!-- footer -->
+ <footer id="footer">
+
+ <div class="footer">
+
+ <div id="footer-section" class="container">
+
+ <div class="row">
+ <div class="col-md-6">
+ <div class="logo">
+ <a class="store-name" href="<c:url value="/shop/"/>"><c:out value="${requestScope.MERCHANT_STORE.storename}"/></a>
+ </div>
+ </div>
+ </div>
+
+ <br/>
+ <div class="row">
+
+ <div class="col-md-12">
+ <div class="col-md-3 col-sm-6">
+ <c:if test="${not empty requestScope.CONTENT_PAGE}">
+ <p class="lead"><s:message code="label.store.information.title" text="Informations"/></p>
+ <!-- Pages -->
+ <ul class="footerLiks">
+ <c:forEach items="${requestScope.CONTENT_PAGE}" var="content">
+ <li><a href="<c:url value="/shop/pages/${content.seUrl}.html"/>" class="current">${content.name}</a></li>
+ </c:forEach>
+ <c:if test="${requestScope.CONFIGS['displayContactUs']==true}">
+ <li><a href="<c:url value="/shop/store/contactus.html"/>"><s:message code="label.customer.contactus" text="Contact us"/></a></li>
+ </c:if>
+ </ul>
+ </c:if>
+
+
+ <c:if test="${requestScope.CONFIGS['facebook_page_url'] != null || requestScope.CONFIGS['twitter_handle'] != null || requestScope.CONFIGS['pinterest'] != null || requestScope.CONFIGS['instagram'] != null}">
+ <ul class="social-links circle">
+ <c:if test="${requestScope.CONFIGS['twitter_handle'] != null}">
+ <li class="twitter"><a target="_blank" href="<c:out value="${requestScope.CONFIGS['twitter_handle']}"/>"><i class="fa fa-twitter"></i></a></li>
+ </c:if>
+ <c:if test="${requestScope.CONFIGS['facebook_page_url'] != null}">
+ <li class="facebook"><a target="_blank" href="<c:out value="${requestScope.CONFIGS['facebook_page_url']}"/>"><i class="fa fa-facebook"></i></a></li>
+ </c:if>
+ <c:if test="${requestScope.CONFIGS['pinterest'] != null}">
+ <li class="pinterest"><a target="_blank" href="<c:out value="${requestScope.CONFIGS['pinterest']}"/>"><i class="fa fa-pinterest"></i></a></li>
+ </c:if>
+ <c:if test="${requestScope.CONFIGS['instagram'] != null}">
+ <li class="instagram"><a target="_blank" href="<c:out value="${requestScope.CONFIGS['instagram']}"/>"><i class="fa fa-instagram"></i></a></li>
+ </c:if>
+ </ul>
+ </c:if>
+
+ <c:if test="${requestScope.CONTENT['paymentDetails']!=null}">
+ <sm:pageContent contentCode="paymentDetails"/>
+ </c:if>
+
+ <hr class="hidden-md hidden-lg hidden-sm">
+
+ </div><!-- /.col-md-3 -->
+
+ <div class="col-md-3 col-sm-6">
+
+ <c:if test="${requestScope.CONFIGS['displayStoreAddress'] == true}">
+ <ul class="list-icons">
+ <jsp:include page="/pages/shop/common/preBuiltBlocks/storeAddress.jsp"/>
+ <c:if test="${requestScope.CONTENT['contactUsDetails']!=null}">
+ <br/>
+ <sm:pageContent contentCode="contactUsDetails"/>
+ </c:if>
+ </ul>
+ </c:if>
+
+
+ <hr class="hidden-md hidden-lg">
+
+ </div><!-- /.col-md-3 -->
+
+ <div class="col-md-2 col-sm-6">
+
+ <div class="footer-content">
+ <c:if test="${not empty requestScope.TOP_CATEGORIES}">
+ <%-- a verifier top categories EN/FR --%>
+ <%-- <p class="lead">Top categories</p> --%>
+ <ul class="nav nav-pills nav-stacked">
+ <li class="<sm:activeLink linkCode="HOME" activeReturnCode="active"/>">
+ <a href="<c:url value="/shop"/>"><s:message code="menu.home" text="Home"/></a>
+ </li>
+ <c:forEach items="${requestScope.TOP_CATEGORIES}" var="category">
+ <li>
+ <a href="<c:url value="/shop/category/${category.description.friendlyUrl}.html"/><sm:breadcrumbParam categoryId="${category.id}"/>" class="current">
+ <span class="name">${category.description.name}</span>
+ </a>
+ </li>
+ </c:forEach>
+ <c:if test="${requestScope.CONFIGS['displayContactUs']==true}">
+ <li class="<sm:activeLink linkCode="CONTACT" activeReturnCode="active"/>"><a href="<c:url value="/shop/store/contactus.html"/>"><s:message code="label.customer.contactus" text="Contact us"/></a></li>
+ </c:if>
+ </ul>
+ </c:if>
+ <c:if test="${requestScope.CONFIGS['displayCustomerSection'] == true}">
+ <!--
+ <ul class="nav nav-pills nav-stacked">
+ <sec:authorize access="hasRole('AUTH_CUSTOMER') and fullyAuthenticated">
+ <li><a href="<c:url value="/shop/customer/account.html"/>"><s:message code="menu.profile" text="Profile"/></a></li>
+ <li><a href="<c:url value="/shop/customer/billing.html"/>"><s:message code="label.customer.billingshipping" text="Billing & shipping information"/></a></li>
+ <li><s:message code="label.order.recent" text="Recent orders"/></li>
+ </sec:authorize>
+ <sec:authorize access="!hasRole('AUTH_CUSTOMER') and fullyAuthenticated">
+ <li>
+ <s:message code="label.security.loggedinas" text="You are logged in as"/> [<sec:authentication property="principal.username"/>]. <s:message code="label.security.nologinacces.store" text="We can't display store logon box"/>
+ </li>
+ </sec:authorize>
+ <sec:authorize access="!hasRole('AUTH_CUSTOMER') and !fullyAuthenticated">
+ <li><a href="#"><s:message code="button.label.signin" text="Signin" /></a></li>
+ </sec:authorize>
+ </ul>
+ -->
+ </c:if>
+
+
+ <hr class="hidden-md hidden-lg hidden-sm">
+ </div>
+
+ </div><!-- /.col-md-2 -->
+
+
+
+ <div class="col-md-4 col-sm-6">
+ <c:if test="${requestScope.CONTENT['footerMessage']!=null}">
+ <sm:pageContent contentCode="footerMessage"/>
+ </c:if>
+ </div><!-- /.col-md-3 -->
+ </div>
+
+ </div>
+ </div>
+ </div>
+
+ <div class="subfooter">
+ <div class="container">
+ <div class="row">
+ <div class="col-md-6"><sm:storeCopy/> - <s:message code="label.generic.providedby" /> <a href="http://www.shopizer.com" class="footer-href" target="_blank">Shopizer</a></div>
+ <div class="col-md-6">
+ <div id="navbar-collapse-2" class="collapse navbar-collapse">
+ <ul class="nav navbar-nav">
+ <li class="<sm:activeLink linkCode="HOME" activeReturnCode="active"/>">
+ <a href="<c:url value="/shop"/>"><s:message code="menu.home" text="Home"/></a>
+ </li>
+ <c:if test="${requestScope.CONFIGS['displayContactUs']==true}">
+ <li class="<sm:activeLink linkCode="CONTACT" activeReturnCode="active"/>"><a href="<c:url value="/shop/store/contactus.html"/>"><s:message code="label.customer.contactus" text="Contact us"/></a></li>
+ </c:if>
+ </ul>
+ </div>
+ </div>
+ </div>
+ </div>
</footer>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/sections/header.jsp b/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/sections/header.jsp
index afa3fdd..e2a78ea 100644
--- a/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/sections/header.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/sections/header.jsp
@@ -26,7 +26,7 @@ response.setDateHeader ("Expires", -1);
$(document).ready(function() {
//post search form
- $(".searchButton").click(function(){
+ $(".searchButton").click(function(e){
var searchQuery = $('#searchField').val();
var responsiveSearchField = $('#responsiveSearchField').val();
var q = searchQuery;
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/sections/jsLinks.jsp b/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/sections/jsLinks.jsp
index 54faefa..c4adaec 100644
--- a/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/sections/jsLinks.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/sections/jsLinks.jsp
@@ -1,52 +1,52 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
- <!-- specific js files -->
- <!-- do only change the list of js files -->
- <!-- ////////////// -->
-
-
-
- <script src="<c:url value="/resources/templates/exoticamobilia/js/bootstrap.js" />"></script>
- <script src="<c:url value="/resources/templates/exoticamobilia/js/iframe_api" />"></script>
- <script src="<c:url value="/resources/templates/exoticamobilia/js/jquery.magnific-popup.min.js" />"></script>
- <script src="<c:url value="/resources/templates/exoticamobilia/js/isotope.js" />"></script>
- <script src="<c:url value="/resources/templates/exoticamobilia/js/jquery.event.move.js" />"></script>
- <script src="<c:url value="/resources/templates/exoticamobilia/js/jquery.appear.js" />"></script>
- <script src="<c:url value="/resources/templates/exoticamobilia/js/responsive-slider.min.js" />"></script>
-
-
-
- <script src="<c:url value="/resources/templates/exoticamobilia/js/modernizr.js" />"></script>
- <script src="<c:url value="/resources/templates/exoticamobilia/js/owl.carousel.min.js" />"></script>
-
-
-
-
- <script src="<c:url value="/resources/templates/exoticamobilia/js/template.js" />"></script>
- <script src="<c:url value="/resources/templates/exoticamobilia/js/www-widgetapi.js" />"></script>
-
-
- <!-- required common scripts -->
- <script src="<c:url value="/resources/js/shop-functions.js" />"></script>
- <script src="<c:url value="/resources/js/shop-customer.js" />"></script>
- <jsp:include page="/resources/js/functions.jsp" />
- <script src="<c:url value="/resources/js/json2.js" />"></script>
- <script src="<c:url value="/resources/js/jquery-cookie.js" />"></script>
- <!--<script src="<c:url value="/resources/js/shopping-cart.js" />"></script>-->
- <script src="<c:url value="/resources/js/shop-minicart.js" />"></script>
- <script src="<c:url value="/resources/js/shop-account.js" />"></script>
- <script src="<c:url value="/resources/js/login.js" />"></script>
- <script src="<c:url value="/resources/js/jquery.showLoading.min.js" />"></script>
-
-
- <!-- ////////////// -->
-
-
-
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+ <!-- specific js files -->
+ <!-- do only change the list of js files -->
+ <!-- ////////////// -->
+
+
+
+ <script src="<c:url value="/resources/templates/exoticamobilia/js/bootstrap.js" />"></script>
+ <script src="<c:url value="/resources/templates/exoticamobilia/js/iframe_api" />"></script>
+ <script src="<c:url value="/resources/templates/exoticamobilia/js/jquery.magnific-popup.min.js" />"></script>
+ <script src="<c:url value="/resources/templates/exoticamobilia/js/isotope.js" />"></script>
+ <script src="<c:url value="/resources/templates/exoticamobilia/js/jquery.event.move.js" />"></script>
+ <script src="<c:url value="/resources/templates/exoticamobilia/js/jquery.appear.js" />"></script>
+ <script src="<c:url value="/resources/templates/exoticamobilia/js/responsive-slider.min.js" />"></script>
+
+
+
+ <script src="<c:url value="/resources/templates/exoticamobilia/js/modernizr.js" />"></script>
+ <script src="<c:url value="/resources/templates/exoticamobilia/js/owl.carousel.min.js" />"></script>
+
+
+
+
+ <script src="<c:url value="/resources/templates/exoticamobilia/js/template.js" />"></script>
+ <script src="<c:url value="/resources/templates/exoticamobilia/js/www-widgetapi.js" />"></script>
+
+
+ <!-- required common scripts -->
+ <script src="<c:url value="/resources/js/shop-functions.js" />"></script>
+ <script src="<c:url value="/resources/js/shop-customer.js" />"></script>
+ <jsp:include page="/resources/js/functions.jsp" />
+ <script src="<c:url value="/resources/js/json2.js" />"></script>
+ <script src="<c:url value="/resources/js/jquery-cookie.js" />"></script>
+ <!--<script src="<c:url value="/resources/js/shopping-cart.js" />"></script>-->
+ <script src="<c:url value="/resources/js/shop-minicart.js" />"></script>
+ <script src="<c:url value="/resources/js/shop-account.js" />"></script>
+ <script src="<c:url value="/resources/js/login.js" />"></script>
+ <script src="<c:url value="/resources/js/jquery.showLoading.min.js" />"></script>
+
+
+ <!-- ////////////// -->
+
+
+
+
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/sections/navbar.jsp b/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/sections/navbar.jsp
index 33516f8..7de696d 100644
--- a/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/sections/navbar.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/sections/navbar.jsp
@@ -1,106 +1,104 @@
-
-<%
-response.setCharacterEncoding("UTF-8");
-response.setHeader("Cache-Control","no-cache");
-response.setHeader("Pragma","no-cache");
-response.setDateHeader ("Expires", -1);
-%>
-
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
-<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm"%>
-<%@ taglib uri="/WEB-INF/shopizer-functions.tld" prefix="display"%>
-
-
-<c:set var="req" value="${request}" />
-
-<%@page contentType="text/html"%>
-<%@page pageEncoding="UTF-8"%>
-
-
-
-
- <!-- NAVIGATION MENU -->
- <div class="col-md-8">
- <div class="header-right clearfix">
- <div class="main-navigation animated">
- <nav class="navbar navbar-default" role="navigation">
- <div class="navbar-header">
- <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#mainNavigation">
- <span class="sr-only"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- <span class="icon-bar"></span>
- </button>
-
- <c:if test="${requestScope.CONFIGS['displaySearchBox'] == true}">
- <button type="button" class="navbar-toggle searchButton no-desktop">
- <i class="fa fa-search"></i>
- </button>
-
- <!-- search bar collapsed -->
- <div id="responsiveSearchFieldGroup" class="no-desktop">
- <input type="text" class="typeahead navbar-toggle"
- placeholder="" id="responsiveSearchField">
- </div>
- </c:if>
-
-
-
- </div>
-
-
- <div id="mainNavigation" class="collapse navbar-collapse">
-
- <ul class="nav navbar-nav navbar-right" id="topMain">
-
- <c:set var="code" value="${category.code}"/>
- <c:forEach items="${requestScope.TOP_CATEGORIES}" var="category">
- <li
- class="<sm:activeLink linkCode="${category.description.friendlyUrl}" activeReturnCode="active"/> <c:if test="${fn:length(category.children)>0}">dropdown mega-menu</c:if>">
- <a href="<c:url value="/shop/category/${category.description.friendlyUrl}.html"/><sm:breadcrumbParam categoryId="${category.id}"/>" class="<c:if test="${fn:length(category.children)>0}">dropdown-toggle</c:if> active <c:if test="${category.code==code}">currentSelectedLink</c:if>" <c:if test="${fn:length(category.children)>0}">data-toggle="dropdown"</c:if>> <span class="name">${category.description.name}</span></a>
- <c:if test="${fn:length(category.children)>0}">
- <ul class="dropdown-menu">
- <li>
- <div class="row">
-
- <c:if test="${requestScope.CONTENT[category.code]!=null}">
- <div class="col-sm-4 col-md-6">
- <c:if test="${requestScope.CONTENT[category.code].description!=null}">
- <c:out value="${requestScope.CONTENT[category.code].description}" escapeXml="false"/>
- </c:if>
- </div>
- </c:if>
-
- <div class="mega-menu-items <c:choose><c:when test="${requestScope.CONTENT[category.code]!=null}">col-sm-8 col-md-6</c:when><c:otherwise>col-sm-12 col-md-12</c:otherwise></c:choose>">
- <h4><a href="<c:url value="/shop/category/${category.description.friendlyUrl}.html"/><sm:breadcrumbParam categoryId="${child.id}"/>"><c:out value="${category.description.name}"/></a></h4>
- <div class="divider"></div>
- <ul class="menu">
- <c:forEach items="${category.children}" var="child">
- <li><a href="<c:url value="/shop/category/${child.description.friendlyUrl}.html"/><sm:breadcrumbParam categoryId="${child.id}"/>"><c:out value="${child.description.name}"/></a></li>
- </c:forEach>
- </ul>
- </div>
- </div>
- </li>
- </ul>
-
- <!-- mega-menu end -->
- </c:if>
-
- </li>
- </c:forEach>
-
- </ul>
- </div>
- </nav>
- <!-- /NAVIGATION MENU -->
- </div>
- </div>
- </div>
-
-
- </div>
+
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm"%>
+<%@ taglib uri="/WEB-INF/shopizer-functions.tld" prefix="display"%>
+
+
+<c:set var="req" value="${request}" />
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+
+
+
+ <!-- NAVIGATION MENU -->
+ <div class="col-md-8">
+ <div class="header-right clearfix">
+ <div class="main-navigation animated">
+ <nav class="navbar navbar-default" role="navigation">
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#mainNavigation">
+ <span class="sr-only"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </button>
+
+ <c:if test="${requestScope.CONFIGS['displaySearchBox'] == true}">
+ <button type="button" class="navbar-toggle searchButton no-desktop">
+ <i class="fa fa-search"></i>
+ </button>
+
+ <!-- search bar collapsed -->
+ <div id="responsiveSearchFieldGroup" class="no-desktop">
+ <input type="text" class="typeahead navbar-toggle"
+ placeholder="" id="responsiveSearchField">
+ </div>
+ </c:if>
+
+
+
+ </div>
+
+
+ <div id="mainNavigation" class="collapse navbar-collapse">
+
+ <ul class="nav navbar-nav navbar-right" id="topMain">
+
+ <c:set var="code" value="${category.code}"/>
+ <c:forEach items="${requestScope.TOP_CATEGORIES}" var="category">
+ <li
+ class="<sm:activeLink linkCode="${category.description.friendlyUrl}" activeReturnCode="active"/> <c:if test="${fn:length(category.children)>0}">dropdown mega-menu</c:if>">
+ <a href="<c:url value="/shop/category/${category.description.friendlyUrl}.html"/><sm:breadcrumbParam categoryId="${category.id}"/>" class="<c:if test="${fn:length(category.children)>0}">dropdown-toggle</c:if> active <c:if test="${category.code==code}">currentSelectedLink</c:if>" <c:if test="${fn:length(category.children)>0}">data-toggle="dropdown"</c:if>> <span class="name">${category.description.name}</span></a>
+ <c:if test="${fn:length(category.children)>0}">
+ <ul class="dropdown-menu">
+ <li>
+ <div class="row">
+ <c:if test="${requestScope.CONTENT[category.code]!=null}">
+ <div class="col-sm-4 col-md-6">
+ <c:if test="${requestScope.CONTENT[category.code].description!=null}">
+ <c:out value="${requestScope.CONTENT[category.code].description}" escapeXml="false"/>
+ </c:if>
+ </div>
+ </c:if>
+
+ <div class="mega-menu-items <c:choose><c:when test="${requestScope.CONTENT[category.code]!=null}">col-sm-8 col-md-6</c:when><c:otherwise>col-sm-12 col-md-12</c:otherwise></c:choose>">
+ <h4><a href="<c:url value="/shop/category/${category.description.friendlyUrl}.html"/><sm:breadcrumbParam categoryId="${child.id}"/>"><c:out value="${category.description.name}"/></a></h4>
+ <div class="divider"></div>
+ <ul class="menu">
+ <c:forEach items="${category.children}" var="child">
+ <li><a href="<c:url value="/shop/category/${child.description.friendlyUrl}.html"/><sm:breadcrumbParam categoryId="${child.id}"/>"><c:out value="${child.description.name}"/></a></li>
+ </c:forEach>
+ </ul>
+ </div>
+ </div>
+ </li>
+ </ul>
+
+ <!-- mega-menu end -->
+ </c:if>
+ </li>
+ </c:forEach>
+
+ </ul>
+ </div>
+ </nav>
+ <!-- /NAVIGATION MENU -->
+ </div>
+ </div>
+ </div>
+
+
+ </div>
</header>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/sections/shopLinks.jsp b/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/sections/shopLinks.jsp
index c05a954..5d88857 100644
--- a/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/sections/shopLinks.jsp
+++ b/sm-shop/src/main/webapp/pages/shop/templates/exoticamobilia/sections/shopLinks.jsp
@@ -1,74 +1,80 @@
-<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
-<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
-<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
-
-<%@ page session="false" %>
-
- <script src="<c:url value="/resources/templates/exoticamobilia/js/jquery-1.11.1.min.js" />"></script>
-
- <!-- CORE CSS -->
- <link href="<c:url value="/resources/templates/exoticamobilia/css/bootstrap.css" />" rel="stylesheet" type="text/css">
-
- <!-- more fonts, cursor up -->
- <link href="<c:url value="/resources/templates/exoticamobilia/css/fontello.css" />" rel="stylesheet" type="text/css">
- <link href="<c:url value="/resources/templates/exoticamobilia/css/magnific-popup.css" />" rel="stylesheet" type="text/css">
-
-
- <link href="<c:url value="/resources/templates/exoticamobilia/css/responsive-slider.css" />" rel="stylesheet" type="text/css">
- <link rel="icon" href="<c:url value="/resources/templates/exoticamobilia/img/favicon.ico"/>">
-
- <!-- Theme -->
-
- <link href="<c:url value="/resources/templates/exoticamobilia/css/style.css" />" rel="stylesheet" type="text/css">
- <link href="<c:url value="/resources/templates/exoticamobilia/css/template.css" />" rel="stylesheet" type="text/css">
- <link href="<c:url value="/resources/templates/exoticamobilia/font-awesome-4.2.0/css/font-awesome.css" />" rel="stylesheet" type="text/css">
-
-
- <link href="<c:url value="/resources/templates/exoticamobilia/css/dark_gray.css" />" rel="stylesheet" type="text/css">
-
-
- <!-- generic and common css file -->
- <link href="<c:url value="/resources/css/sm.css" />" rel="stylesheet">
- <link href="<c:url value="/resources/css/showLoading.css" />" rel="stylesheet">
-
- <!-- ////////////// -->
-
- <!-- mini shopping cart template -->
- <script type="text/html" id="miniShoppingCartTemplate">
- {{#shoppingCartItems}}
- <tr id="{{productId}}" class="cart-product">
- <td>
- {{#image}}
- <img width="40" src="{{contextPath}}{{image}}">
- {{/image}}
- {{^image}}
-  
- {{/image}}
- </td>
- <td>{{quantity}}</td>
- <td>{{name}}</td>
- <td>{{price}}</td>
- <td><button productid="{{productId}}" class="close removeProductIcon" onclick="removeItemFromMinicart('{{id}}')">x</button></td>
- </tr>
- {{/shoppingCartItems}}
- </script>
-
- <c:if test="${requestScope.CONFIGS['google_analytics_url'] != null}">
- <script type="text/javascript">
- //<![CDATA[
- <!-- google analytics -->
- var _gaq = _gaq || [];
- _gaq.push(['_setAccount', '<c:out value="${requestScope.CONFIGS['google_analytics_url']}"/>']);
- _gaq.push(['_trackPageview']);
-
- (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);
- })();
- //]]>
- </script>
- </c:if>
-
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+ <script src="<c:url value="/resources/templates/exoticamobilia/js/jquery-1.11.1.min.js" />"></script>
+
+ <!-- CORE CSS -->
+ <link href="<c:url value="/resources/templates/exoticamobilia/css/bootstrap.css" />" rel="stylesheet" type="text/css">
+
+ <!-- more fonts, cursor up -->
+ <link href="<c:url value="/resources/templates/exoticamobilia/css/fontello.css" />" rel="stylesheet" type="text/css">
+ <link href="<c:url value="/resources/templates/exoticamobilia/css/magnific-popup.css" />" rel="stylesheet" type="text/css">
+
+
+ <link href="<c:url value="/resources/templates/exoticamobilia/css/responsive-slider.css" />" rel="stylesheet" type="text/css">
+ <link rel="icon" href="<c:url value="/resources/templates/exoticamobilia/img/favicon.ico"/> ">
+
+ <!-- Theme -->
+
+ <link href="<c:url value="/resources/templates/exoticamobilia/css/style.css" />" rel="stylesheet" type="text/css">
+ <link href="<c:url value="/resources/templates/exoticamobilia/css/template.css" />" rel="stylesheet" type="text/css">
+ <link href="<c:url value="/resources/templates/exoticamobilia/font-awesome-4.2.0/css/font-awesome.css" />" rel="stylesheet" type="text/css">
+
+
+ <link href="<c:url value="/resources/templates/exoticamobilia/css/dark_gray.css" />" rel="stylesheet" type="text/css">
+
+
+ <!-- generic and common css file -->
+ <link href="<c:url value="/resources/css/sm.css" />" rel="stylesheet">
+ <link href="<c:url value="/resources/css/showLoading.css" />" rel="stylesheet">
+
+ <!-- ////////////// -->
+
+
+<!--
+
+//-->
+</script>
+
+ <!-- mini shopping cart template -->
+ <script type="text/html" id="miniShoppingCartTemplate">
+ {{#shoppingCartItems}}
+ <tr id="{{productId}}" class="cart-product">
+ <td>
+ {{#image}}
+ <img width="40" src="{{contextPath}}{{image}}">
+ {{/image}}
+ {{^image}}
+  
+ {{/image}}
+ </td>
+ <td>{{quantity}}</td>
+ <td>{{name}}</td>
+ <td>{{price}}</td>
+ <td><button productid="{{productId}}" class="close removeProductIcon" onclick="removeItemFromMinicart('{{id}}')">x</button></td>
+ </tr>
+ {{/shoppingCartItems}}
+ </script>
+
+ <c:if test="${requestScope.CONFIGS['google_analytics_url'] != null}">
+ <script type="text/javascript">
+ //<![CDATA[
+ <!-- google analytics -->
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', '<c:out value="${requestScope.CONFIGS['google_analytics_url']}"/>']);
+ _gaq.push(['_trackPageview']);
+
+ (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);
+ })();
+ //]]>
+ </script>
+ </c:if>
+
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/generic/catalogLayout.jsp b/sm-shop/src/main/webapp/pages/shop/templates/generic/catalogLayout.jsp
new file mode 100644
index 0000000..fbb14b9
--- /dev/null
+++ b/sm-shop/src/main/webapp/pages/shop/templates/generic/catalogLayout.jsp
@@ -0,0 +1,89 @@
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+ <%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
+ <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
+
+ <c:set var="lang" scope="request" value="${requestScope.locale.language}"/>
+
+
+ <html xmlns="http://www.w3.org/1999/xhtml">
+
+
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="x-ua-compatible" content="ie=edge">
+ <title><c:out value="${requestScope.PAGE_INFORMATION.pageTitle}" /></title>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="<c:out value="${requestScope.PAGE_INFORMATION.pageDescription}" />">
+ <meta name="author" content="<c:out value="${requestScope.MERCHANT_STORE.storename}"/>">
+
+ <!-- include all header js and css -->
+ <jsp:include page="/pages/shop/templates/generic/sections/shopLinks.jsp" />
+
+
+
+ <script type="text/html" id="productBoxTemplate">
+ {{#products}}
+ <div itemscope itemtype="http://schema.org/Enumeration" class="col-md-COLUMN-SIZE col-sm-6 col-xs-12 product" item-order="{{sortOrder}}" item-name="{{description.name}}" item-price="{{price}}" data-id="{{id}}">
+ <div class="thumbnail product-img">
+ {{#image}}
+ <a href="<c:url value="/shop/product/" />{{description.friendlyUrl}}.html">
+ <img src="<c:url value=""/>{{image.imageUrl}}" alt="" />
+ </a>
+ {{/image}}
+ </div>
+ <div class="product-content text-center">
+ <a class="listing-product-name" href="<c:url value="/shop/product/" />{{description.friendlyUrl}}.html"><h3 itemprop="name">{{description.name}}</h3></a>
+ <!--<span class="text-center width-100"><div class="stars" id="productRating_{{id}}"></div></span>-->
+ <h4>
+ {{#discounted}}<del>{{originalPrice}}</del> <span itemprop="price" class="specialPrice">{{finalPrice}}</span>{{/discounted}}
+ {{^discounted}}<span itemprop="price">{{finalPrice}}</span>{{/discounted}}
+ </h4>
+ <c:if test="${requestScope.CONFIGS['allowPurchaseItems'] == true}">
+ <div class="store-btn">
+ <div class="store-btn-addtocart"><a class="addToCart" href="javascript:void(0)" productId="{{id}}"><s:message code="button.label.addToCart" text="Add to cart"/></a></div>
+ </div>
+ </c:if>
+ </div>
+ </div>
+ {{/products}}
+ </script>
+
+ </head>
+
+ <body>
+
+ <!--[if lt IE 8]>
+ <p class="browserupgrade">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+ <![endif]-->
+
+ <tiles:insertAttribute name="header" ignore="true"/>
+
+ <tiles:insertAttribute name="navbar" ignore="true"/>
+
+ <tiles:insertAttribute name="body" ignore="true"/>
+
+ <tiles:insertAttribute name="footer" ignore="true"/>
+
+ <jsp:include page="/pages/shop/templates/generic/sections/jsLinks.jsp" />
+
+ </body>
+
+ </html>
+
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/cart.jsp b/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/cart.jsp
new file mode 100644
index 0000000..a1240d0
--- /dev/null
+++ b/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/cart.jsp
@@ -0,0 +1,302 @@
+
+<%
+ response.setCharacterEncoding("UTF-8");
+ response.setHeader("Cache-Control", "no-cache");
+ response.setHeader("Pragma", "no-cache");
+ response.setDateHeader("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm"%>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+<script
+ src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
+
+<div class="entry-header-area ptb-40">
+ <div class="container">
+ <div class="row">
+ <div class="col-md-12">
+ <div class="entry-header">
+ <h1 class="entry-title">
+ <s:message code="label.cart.revieworder" text="Review your order" />
+ </h1>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<c:url value="/shop/cart/removeShoppingCartItem.html"
+ var="removeShoppingCartItemUrl" />
+
+<div id="store.error" class="alert alert-error alert-danger"
+ style="display: none;">
+ <s:message code="message.error.shoppingcart.update"
+ text="An error occurred while updating the shopping cart" />
+</div>
+
+
+<!-- cart-main-area start -->
+<div class="cart-main-area ptb-40">
+ <div class="container">
+
+
+ <!-- Unavailables -->
+ <c:if test="${fn:length(cart.unavailables) gt 0}">
+ <div class="row">
+ <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
+ <div id="store.error" class="alert alert-error"
+ style="display: block;">
+ <s:message code="message.error.shoppingcart.unavailables"
+ text="Some of the item in your shopping cart are as of today unavailable for purchase. Those items will be removed from your shopping cart when the order form is displayed. If you are interested in purchasing this item, please send use a message with the item number, we will get back to you as soon as possible with an update on the availability of the item." />
+ </div>
+ <table>
+ <c:forEach items="${cart.unavailables}" var="unavailable"
+ varStatus="itemStatus">
+
+ <c:if test="${itemStatus.index eq 0}">
+ <thead>
+ <tr>
+ <th colspan="2" width="65%"> </th>
+ <th colspan="1" width="35%"> </th>
+ </tr>
+ </thead>
+ <tbody>
+ </c:if>
+
+
+ <tr>
+ <td width="20%"><c:if test="${unavailable.image!=null}">
+ <img width="60" src="<c:url value="${unavailable.image}"/>">
+ </c:if></td>
+
+ <td style="border-left: none;"><strong>${unavailable.name}</strong>
+ <c:if test="${fn:length(unavailable.shoppingCartAttributes)>0}">
+ <br />
+ <ul>
+ <c:forEach items="${unavailable.shoppingCartAttributes}"
+ var="option">
+ <li>${option.optionName}-${option.optionValue}</li>
+ </c:forEach>
+ </ul>
+ </c:if> <br /> <s:message code="label.quantity" text="Quantity" />:
+ <c:out value="${unavailable.quantity}" /> <br /> <s:message
+ code="label.generic.price" text="Price" />: <c:out
+ value="${unavailable.price}" /></td>
+ <td> </td>
+
+ </tr>
+ </c:forEach>
+ </table>
+
+ </div>
+ </div>
+ </c:if>
+ <c:choose>
+ <c:when test="${not empty cart}">
+ <c:choose>
+ <c:when test="${not empty cart.shoppingCartItems}">
+
+ <!-- cart-main-area start -->
+ <div class="cart-main-area ptb-40">
+ <div class="container">
+ <div class="row">
+ <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
+ <div class="table-content table-responsive">
+ <!--
+ Shopping cart has to be id=mainartTable
+ -->
+ <table id="mainCartTable"
+ class="table table-hover table-condensed">
+ <c:forEach items="${cart.shoppingCartItems}"
+ var="shoppingCartItem" varStatus="itemStatus">
+ <c:if test="${itemStatus.index eq 0}">
+
+ <thead>
+ <tr>
+ <th><s:message code="label.generic.item.title"
+ text="Item" /></th>
+ <th><s:message code="label.quantity"
+ text="Quantity" /></th>
+ <th><s:message code="label.generic.price"
+ text="Price" /></th>
+ <th><s:message code="label.order.total"
+ text="Total" /></th>
+ <th></th>
+
+
+ </tr>
+ </thead>
+ <tbody>
+ </c:if>
+ <form:form action="${updateShoppingCartItemUrl}"
+ id="shoppingCartLineitem_${shoppingCartItem.id}">
+ <tr>
+ <td
+ data-th="<s:message code="label.generic.item.title" text="Item"/>">
+ <div class="row-cart">
+
+ <div class="col-sm-4 hidden-xs">
+ <c:if test="${shoppingCartItem.image!=null}">
+ <img width="60"
+ src="<c:url value="${shoppingCartItem.image}"/>"
+ class="">
+ </c:if>
+ </div>
+ <div class="col-sm-8">
+ <span class="nomargin"><strong>${shoppingCartItem.name}</strong></span>
+
+ <c:if
+ test="${fn:length(shoppingCartItem.shoppingCartAttributes)>0}">
+ <p>
+ <ul>
+ <c:forEach
+ items="${shoppingCartItem.shoppingCartAttributes}"
+ var="option">
+ <li>${option.optionName} -
+ ${option.optionValue}</li>
+ </c:forEach>
+ </ul>
+ </p>
+ </c:if>
+ </div>
+ </div>
+ </td>
+ <td width="10%"
+ data-th="<s:message code="label.quantity" text="Quantity"/>">
+ <input type="number"
+ class="input-small quantity text-center"
+ value="${shoppingCartItem.quantity}" name="quantity"
+ id="${shoppingCartItem.id}"
+ <c:if test="${shoppingCartItem.productVirtual==true}">readonly</c:if>>
+ </td>
+
+ <td
+ data-th="<s:message code="label.generic.price" text="Price"/>"><strong>${shoppingCartItem.price}</strong></td>
+ <td
+ data-th="<s:message code="label.order.total" text="Total"/>"
+ class=""><strong>${shoppingCartItem.subTotal}</strong></td>
+
+ <td width="10%" class="actions" data-th="">
+ <div class="cart-del">
+ <a href="#" class="cart-close removeProductIcon"
+ style="clear: both !important;"
+ onclick="javascript:updateLineItem('${shoppingCartItem.id}','${removeShoppingCartItemUrl}'); return false;">
+ <i class="fa fa-times"></i>
+ </a> <input type="hidden" name="lineItemId" id="lineItemId"
+ value="${shoppingCartItem.id}" />
+ </div>
+ </td>
+
+ </tr>
+ </form:form>
+ </c:forEach>
+ </table>
+ </div>
+
+ <div class="row">
+ <div class="col-lg-8 col-md-8 col-sm-7 col-xs-12">
+ <div class="buttons-cart">
+ <a href="#"
+ onClick="javascript:updateCart('#mainCartTable');"><s:message
+ code="label.order.recalculate" text="Racalculate" /></a> <a
+ href="<c:url value="/shop"/>"><s:message
+ code="button.label.continue" text="Continue shopping" /></a>
+ </div>
+ <!--
+ <div class="coupon">
+ <h3>Coupon</h3>
+ <p>Enter your coupon code if you have one.</p>
+ <input type="text" placeholder="Coupon code" />
+ <input type="submit" value="Apply Coupon" />
+ </div>
+ -->
+ </div>
+ <div class="col-lg-4 col-md-4 col-sm-5 col-xs-12">
+ <div class="cart_totals">
+
+ <h2>
+ <s:message code="label.order.totals" text="Totals" />
+ </h2>
+ <div class="cart-totals-table">
+ <table>
+ <tbody>
+ <c:forEach items="${cart.totals}" var="total">
+ <tr class="cart-subtotal">
+ <th><s:message code="${total.code}"
+ text="label [${total.code}] not found" /></th>
+ <td><span class="amount"><sm:monetary
+ value="${total.value}" /></span></td>
+ </tr>
+ </c:forEach>
+ </tbody>
+ </table>
+ </div>
+ </div>
+ <div class="wc-proceed-to-checkout">
+ <a href="<c:url value="/shop/order/checkout.html"/>"><s:message
+ code="label.proceed.checkout" text="Proceed to checkout" /></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <!-- cart-main-area end -->
+
+ </c:when>
+ <c:otherwise>
+ <h4>
+ <s:message code="cart.empty" text="Your Shopping cart is empty" />
+ </h4>
+ </c:otherwise>
+ </c:choose>
+ </c:when>
+ <c:otherwise>
+ <h4>
+ <s:message code="cart.empty" text="Your Shopping cart is empty" />
+ </h4>
+ </c:otherwise>
+ </c:choose>
+ </div>
+</div>
+<!-- cart-main-area end -->
+
+
+<c:if test="${empty cart}">
+ <!-- load cart with cookie -->
+ <script>
+ $(document)
+ .ready(
+ function() {
+ var cartCode = getCartCode();
+ if (cartCode != null) {
+ console.log('cart code ' + cartCode);
+ location.href = '<c:url value="/shop/cart/shoppingCartByCode" />?shoppingCartCode='
+ + cartCode;
+ }
+
+ });
+ </script>
+</c:if>
+
+<script>
+ $(document).ready(function() {
+ $('.quantity').numeric();
+ $("input[type='text']").keypress(function(e) {
+ if (e.which == 13) {
+ e.preventDefault();
+ }
+ });
+ $('#checkoutButton').click(function(e) {
+ location.href = '<c:url value="/shop/order/checkout.html"/>';
+ });
+ });
+</script>
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/category.jsp b/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/category.jsp
new file mode 100644
index 0000000..aefa66a
--- /dev/null
+++ b/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/category.jsp
@@ -0,0 +1,305 @@
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+ <script src="<c:url value="/resources/js/jquery.easing.1.3.js" />"></script>
+ <script src="<c:url value="/resources/js/jquery.quicksand.js" />"></script>
+ <script src="<c:url value="/resources/js/jquery-sort-filter-plugin.js" />"></script>
+ <script src="<c:url value="/resources/js/jquery.alphanumeric.pack.js" />"></script>
+
+
+
+
+ <!-- don't change that script except max_oroducts -->
+ <script>
+
+ var START_COUNT_PRODUCTS = 0;
+ var MAX_PRODUCTS = 30;
+ var filter = null;
+ var filterValue = null;
+
+ $(function(){
+
+ /** specific to this template ***/
+ var tpl = $('#productBoxTemplate').text();
+ tpl = tpl.replace("COLUMN-SIZE", "4");//size of the div
+ $('#productBoxTemplate').text(tpl);
+ /*** ***/
+
+ //price minimum/maximum
+ $('.numeric').numeric();
+
+
+ $('#filter').on('change', function() {
+ visualize();
+ });
+
+ $('#priceFilterMinimum').on('blur', function() {
+ visualize();
+ });
+
+ $('#priceFilterMaximum').on('blur', function() {
+ visualize()
+ });
+
+
+ loadCategoryProducts();
+
+ });
+
+
+ function visualize() {
+ var orderBy = $("#filter").val();
+ var minimumPrice = $('#priceFilterMinimum').val();
+ var maximumPrice = $('#priceFilterMaximum').val();
+ orderProducts(orderBy, minimumPrice, maximumPrice);
+ }
+
+ /** used for ordering and filtering **/
+ //function orderProducts(attribute, minimum, maximum) {
+ function orderProducts(attribute, minimumPrice, maximumPrice) {
+
+ if(minimumPrice==undefined) {
+ minimumPrice = '';
+ }
+
+ if(maximumPrice==undefined) {
+ maximumPrice = '';
+ }
+
+ //log('Attribute ' + attribute + ' Minimum price ' + minimumPrice + ' Maximum price ' + maximumPrice);
+
+ if(minimumPrice == '' && maximumPrice == '') {
+
+ if(attribute=='item-order') {
+ return;
+ }
+ }
+
+ // get the first collection
+ var $prods = $('#productsContainer');
+
+
+ // clone applications to get a second collection
+ data = $('#hiddenProductsContainer').clone();
+
+ //console.log('Data');
+ //console.log(data);
+
+
+ listedData = data.find('.product');
+
+ //console.log('Listed Data');
+ //console.log(listedData);
+
+ filteredData = listedData;
+ var $sortedData = null;
+
+ if(minimumPrice != '' || maximumPrice != '') {
+ //filter filteredData
+ if(minimumPrice == '') {
+ minimumPrice = '0';
+ }
+ filteredData = listedData.filter(function() {
+
+ //log('Item price ' + $(this).attr('item-price'));
+
+ var price = parseFloat($(this).attr('item-price'));
+ if(maximumPrice != '') {
+ return price >= parseFloat(minimumPrice) && price <= parseFloat(maximumPrice);
+ } else {
+ return price >= parseFloat(minimumPrice);
+ }
+
+ });
+ }
+
+ //console.log('After filtered Data');
+ //console.log(filteredData);
+
+
+ if(attribute!='item-order') {
+
+ $sortedData = filteredData.sorted({
+ by: function(v) {
+ if(attribute=='item-price') {
+ return parseFloat($(v).attr(attribute));
+ } else {
+ return $(v).attr(attribute);
+ }
+ }
+ });
+
+ } else {
+ $sortedData = filteredData;
+ }
+
+ // finally, call quicksand
+ $prods.quicksand($sortedData, {
+ duration: 800,
+ easing: 'easeInOutQuad'
+ });
+
+
+ }
+
+ function loadCategoryProducts() {
+ var url = '<%=request.getContextPath()%>/services/public/products/page/' + START_COUNT_PRODUCTS + '/' + MAX_PRODUCTS + '/<c:out value="${requestScope.MERCHANT_STORE.code}"/>/<c:out value="${requestScope.LANGUAGE.code}"/>/<c:out value="${category.description.friendlyUrl}"/>';
+
+ if(filter!=null) {
+ url = url + '/filter=' + filter + '/filter-value=' + filterValue +'';
+ }
+ loadProducts(url,'#productsContainer');
+
+ }
+
+
+ function filterCategory(filterType,filterVal) {
+ //reset product section
+ $('#productsContainer').html('');
+ $('#hiddenProductsContainer').html('');
+ START_COUNT_PRODUCTS = 0;
+ filter = filterType;
+ filterValue = filterVal;
+ loadCategoryProducts();
+ }
+
+ function buildProductsList(productList, divProductsContainer) {
+ log('Products-> ' + productList.products.length);
+ var productsTemplate = Hogan.compile(document.getElementById("productBoxTemplate").innerHTML);
+ var productsRendred = productsTemplate.render(productList);
+ $('#productsContainer').append(productsRendred);
+ $('#hiddenProductsContainer').append(productsRendred);
+ initBindings();
+ }
+
+ function callBackLoadProducts(productList) {
+ totalCount = productList.productCount;
+ START_COUNT_PRODUCTS = START_COUNT_PRODUCTS + MAX_PRODUCTS;
+ if(START_COUNT_PRODUCTS < totalCount && START_COUNT_PRODUCTS <= productList.productCount) {
+ $("#button_nav").show();
+ } else {
+ $("#button_nav").hide();
+ }
+ hideSMLoading('#productsContainer');
+ visualize();
+
+ var productQty = productList.productCount + ' <s:message code="label.search.items.found" text="item(s) found" />';
+ $('#products-qty').html(productQty);
+
+
+ }
+
+
+
+
+</script>
+
+
+
+<div id="mainContent" class="container">
+
+ <header class="page-header row">
+ <c:if test="${category.description.name!=null}">
+ <div class="fixed-image section dark-translucent-bg parallax-bg-3">
+ <div class="container">
+ <h2 class="shop-banner-title lead"><c:out value="${category.description.name}"/></h2>
+ </div>
+ </div>
+ </c:if>
+ <jsp:include page="/pages/shop/templates/exoticamobilia/sections/breadcrumb.jsp" />
+ </header>
+
+
+ <c:if test="${category.description.description!=null}">
+ <div class="container">
+ <p><c:out value="${category.description.description}" escapeXml="false"/></p>
+ </div>
+ </c:if>
+
+
+ <div class="bedroom-all-product-area ptb-80">
+ <div class="container">
+ <div class="row">
+ <div class="col-lg-9 col-md-9 col-sm-9 col-xs-12">
+ <!-- category-products-area-start -->
+ <div class="caregory-products-area">
+ <div class="row">
+ <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
+ <div class="product-option">
+ <div class="porduct-option-left floatleft">
+ <div class="sort-by">
+ <label><s:message code="label.generic.sortby" text="Sort by" /></label>
+
+ <select id="filter" class="cust-select">
+ <option value="item-order"><s:message code="label.generic.default" text="Default" /></option>
+ <option value="item-name"><s:message code="label.generic.name" text="Name" /></option>
+ <option value="item-price"><s:message code="label.generic.price" text="Price" /></option>
+ </select>
+ </div>
+ </div>
+ <div class="product-option-right floatright">
+
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="tab-content category-products">
+ <div class="tab-pane active" id="viewed">
+ <div class="row">
+ <section class="products-grid">
+ <!-- Products here -->
+ <div id="productsContainer" class="list-unstyled"></div>
+ <span id="end_nav" style="display:none;"><s:message code="label.product.nomoreitems" text="No more items to be displayed" /></span>
+ <!-- end block -->
+ <!-- hidden -->
+ <div id="hiddenProductsContainer" style="display:none;"></div>
+ </section>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="col-lg-3 col-md-3 col-sm-3 col-xs-12">
+ <c:if test="${parent!=null}">
+ <h3><c:out value="${parent.description.name}" /></h3>
+ </c:if>
+ <ul class="nav nav-list">
+ <c:forEach items="${subCategories}" var="subCategory">
+ <c:if test="${subCategory.visible}">
+ <li>
+ <a href="<c:url value="/shop/category/${subCategory.description.friendlyUrl}.html"/><sm:breadcrumbParam categoryId="${subCategory.id}"/>"><i class="fa fa-angle-right"></i> <c:out value="${subCategory.description.name}" />
+ <c:if test="${subCategory.productCount>0}"> <span class="countItems">(<c:out value="${subCategory.productCount}" />)</span></c:if></a>
+ </li>
+ </c:if>
+ </c:forEach>
+ </ul>
+ <br/>
+ <c:if test="${fn:length(manufacturers) > 0}">
+ <h3><s:message code="label.manufacturer.collection" text="Collection" /></h3>
+ <ul class="nav nav-list">
+ <li class="nav-header"></li>
+ <c:forEach items="${manufacturers}" var="manufacturer">
+ <li>
+ <a href="javascript:filterCategory('BRAND','${manufacturer.id}')"><i class="fa fa-angle-right"></i> <c:out value="${manufacturer.description.name}" /></a></li>
+ </c:forEach>
+ </ul>
+ </div>
+ </c:if>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/checkout.jsp b/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/checkout.jsp
new file mode 100644
index 0000000..a89c818
--- /dev/null
+++ b/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/checkout.jsp
@@ -0,0 +1,1021 @@
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+<c:if test="${shippingMetaData.useDistanceModule==true}">
+ <script src="https://maps.googleapis.com/maps/api/js?key=<sm:config configurationCode="shopizer.googlemaps_key" />"></script>
+</c:if>
+
+<!-- overrides with v2 page -->
+<c:set var="creditCardInformationsPage" value="creditCardInformations-v2" scope="request"/>
+
+<!-- phone number mask -->
+<script src="<c:url value="/resources/js/jquery.maskedinput.min.js" />"></script>
+<!-- generic checkout script -->
+<script src="<c:url value="/resources/js/shop-checkout.js" />"></script>
+
+<!--
+Templates definition
+ -->
+
+ <!-- subtotals template -->
+<script type="text/html" id="subTotalsTemplate">
+ {{#subTotals}}
+ <tr id="cart-subtotal-{{code}}" class="cart-subtotal subt">
+ <td class="order-total-label">{{#discounted}}<s:message code="label.generic.rebate" text="Rebate" /> - {{text}}{{/discounted}}{{^discounted}}{{title}}{{/discounted}}</td>
+ <td class="order-total-label"><strong>{{#discounted}}<font color="red">-{{total}}</font>{{/discounted}}{{^discounted}}{{total}}{{/discounted}}</strong></td>
+ </tr>
+ {{/subTotals}}
+</script>
+
+<!-- total template -->
+<script type="text/html" id="totalTemplate">
+ <th><s:message code="order.total.total" text="Total"/></th>
+ <td><strong><span class="amount grand-total">{{grandTotal}}</td>
+</script>
+
+
+<!-- shipping template -->
+<script type="text/html" id="shippingTemplate">
+ <table id="shippingOptions">
+ {{#shippingOptions}}
+ <tr>
+ <td style="border: none !important;">
+ <input type="radio" name="selectedShippingOption.optionId" code="{{shippingModuleCode}}" class="shippingOption" id="{{optionId}}" value="{{optionId}}" {{#checked}} checked="checked"{{/checked}}>
+ </td>
+ <td style="border: none !important;">
+ <label>
+ {{description}} - {{optionPriceText}}
+ </label>
+ </td>
+ </tr>
+ {{#note}}
+ <tr>
+ <td colspan="2" style="border: none !important;">
+ <span><small>{{note}}</small></span>
+ </td>
+ </tr>
+ {{/note}}
+ {{/shippingOptions}}
+ </table>
+</script>
+
+
+<script>
+
+<!-- definitions -->
+<!-- checkout form id -->
+var checkoutFormId = '#checkoutForm';
+
+<!-- get shipping quote url -->
+var shippingQuotesUrl = '<c:url value="/shop/order/shippingQuotes.json"/>';
+
+var calculateTotalUrl = '<c:url value="/shop/order/calculateOrderTotal.json"/>'
+
+<!-- checkout field id -->
+var formErrorMessageId = '#formErrorMessage';
+var useDistanceWindow = <c:out value="${shippingMetaData.useDistanceModule}"/>;
+
+$(document).ready(function() {
+
+
+ //logic for initialyzing the form, needs to be maintained
+
+ //form displaying shipping address
+ $("#confirmShippingAddress").hide();
+
+ formValid = false;
+
+ <!--
+ //can use masked input for phone (USA - CANADA)
+ -->
+
+ setPaymentModule('${order.defaultPaymentMethodCode}');
+
+ formValid = isFormValid(); //first validation
+
+ bindActions();
+
+ <c:if test="${order.customer.billing.country!=null}">
+ $('.billing-country-list').val('${order.customer.billing.country}');
+ //apply mask
+ setCountrySettings('billing','${order.customer.billing.country}');
+ </c:if>
+ <c:if test="${order.customer.delivery.country!=null}">
+ $('.shipping-country-list').val('${order.customer.delivery.country}');
+ //apply mask
+ setCountrySettings('delivery','${order.customer.delivery.country}');
+ </c:if>
+
+ <!-- customer state is text -->
+ <c:if test="${order.customer.billing.stateProvince!=null && order.customer.billing.stateProvince!=null !=''}">
+ $('#billingStateList').hide();
+ $('#billingStateProvince').show();
+ $('#billingStateProvince').val('<c:out value="${order.customer.billing.stateProvince}"/>');
+ </c:if>
+ <!-- customer state is a know state -->
+ <c:if test="${order.customer.billing.stateProvince==null || order.customer.billing.stateProvince==''}">
+ $('#billingStateList').show();
+ $('#billingStateProvince').hide();
+ getZones('#billingStateList','#billingStateProvince','<c:out value="${order.customer.billing.country}" />','<c:out value="${order.customer.billing.zone}" />', '${requestScope.LANGUAGE.code}', validateForm);
+ </c:if>
+
+ <c:if test="${order.customer.delivery.stateProvince!=null && order.customer.delivery.stateProvince!=''}">
+ $('#deliveryStateList').hide();
+ $('#deliveryStateProvince').show();
+ $('#deliveryStateProvince').val('<c:out value="${order.customer.delivery.stateProvince}"/>');
+ </c:if>
+
+ <c:if test="${order.customer.delivery.stateProvince==null || order.customer.delivery.stateProvince==''}">
+ $('#deliveryStateList').show();
+ $('#deliveryStateProvince').hide();
+ //populate zones
+ getZones('#deliveryStateList','#deliveryStateProvince','<c:out value="${order.customer.delivery.country}" />','<c:out value="${order.customer.billing.zone}" />', '${requestScope.LANGUAGE.code}', validateForm);
+ </c:if>
+
+ //when the list of country changes in the billing section
+ $(".billing-country-list").change(function() {
+ //populate zones
+ getZones('#billingStateList','#billingStateProvince',$(this).val(),'<c:out value="${order.customer.billing.zone}" />', '${requestScope.LANGUAGE.code}', countryListChanged);
+ setCountrySettings('billing',$(this).val());
+ })
+
+ //when the list of country changes in the shipping section
+ $(".shipping-country-list").change(function() {
+ getZones('#deliveryStateList','#deliveryStateProvince',$(this).val(),'<c:out value="${order.customer.delivery.zone}" />', '${requestScope.LANGUAGE.code}', countryListChanged);
+ setCountrySettings('delivery',$(this).val());
+ })
+
+
+ //do we have a shipping address pre populated with a postal code
+ //var deliveryPostalCode = null;
+ var address = null;
+ <c:if test="${deliveryAddress!=null}">
+ //deliveryPostalCode='<c:out value="${shippingQuote.deliveryAddress.postalCode}"/>';
+ address = {address:'<c:out value="${deliveryAddress.address}"/>',postalCode:'<c:out value="${deliveryAddress.postalCode}"/>',province:'<c:out value="${deliveryAddress.provinceName}"/>',country:'<c:out value="${deliveryAddress.countryName}"/>'};
+ </c:if>
+
+ <c:if test="${shippingQuote.deliveryAddress!=null}">
+ address.latitude='<c:out value="${shippingQuote.deliveryAddress.latitude}"/>';
+ address.longitude='<c:out value="${shippingQuote.deliveryAddress.longitude}"/>';
+ </c:if>
+
+ //selected quote is not pickup
+ var shippingMethod = null;
+ <c:if test="${shippingQuote.shippingModuleCode!=null}">
+ shippingMethod='<c:out value="${shippingQuote.shippingModuleCode}"/>';
+ </c:if>
+
+
+
+ //console.log(address);
+ displayConfirmShipping(address,shippingMethod,useDistanceWindow);
+
+
+});
+
+function countryListChanged() {
+ validateForm();
+ shippingQuotes(shippingQuotesUrl,useDistanceWindow);
+}
+
+
+function validateForm() {
+ isFormValid(shippingQuotesUrl);
+}
+
+function isFormValid() {
+ $(formErrorMessageId).hide();//reset error message
+ var $inputs = $(checkoutFormId).find(':input');
+ var valid = true;
+ var firstErrorMessage = null;
+ $inputs.each(function() {
+ if($(this).hasClass('required')) {
+ var fieldValid = isCheckoutFieldValid($(this));
+ //log($(this).attr('id') + ' Is valid ' + fieldValid);
+ if(!fieldValid) {
+ if(firstErrorMessage==null) {
+ //log('Title ' + $(this).attr('title'));
+ if($(this).attr('title')) {
+ firstErrorMessage = $(this).attr('title');
+ }
+ }
+ valid = false;
+ }
+ }
+ if($(this).hasClass('email')) {
+ var emailValid = validateEmail($(this).val());
+ //console.log('Email is valid ? ' + emailValid);
+ if(!emailValid) {
+ if(firstErrorMessage==null) {
+ firstErrorMessage = '<s:message code="messages.invalid.email" text="Invalid email address"/>';
+ valid = false;
+ }
+ }
+ }
+ });
+
+
+ //console.log('Form is valid ? ' + valid);
+ if(valid==false) {//disable submit button
+ if(firstErrorMessage!=null) {
+ $(formErrorMessageId).addClass('alert-error alert-danger');
+ $(formErrorMessageId).removeClass('alert-success');
+ $(formErrorMessageId).html('<!--<img src="<c:url value="/resources/img/icon_error.png"/>" width="40"/> --><strong><font color="red">' + firstErrorMessage + '</font></strong>');
+ $(formErrorMessageId).show();
+ }
+ $('#submitOrder').addClass('btn-disabled');
+ $('#submitOrder').prop('disabled', true);
+ } else {
+ $(formErrorMessageId).removeClass('alert-error alert-danger');
+ $(formErrorMessageId).addClass('alert-success');
+ $(formErrorMessageId).html('<!--<img src="<c:url value="/resources/img/icon_success.png"/>" width="40"/> --><strong><s:message code="message.order.canprocess" text="The order can be completed"/></strong>');
+ $(formErrorMessageId).show();
+ $('#submitOrder').removeClass('btn-disabled');
+ $('#submitOrder').prop('disabled', false);
+ }
+
+
+ return valid;
+}
+
+function isCheckoutFieldValid(field) {
+
+ var validateField = true;
+ var fieldId = field.prop('id');
+ var value = field.val();
+ if (fieldId.indexOf("creditcard") >= 0) {
+ validateField = false; //ignore credit card number field
+ }
+ if(!field.is(':visible')) {
+ validateField = false; //ignore invisible fields
+ }
+
+
+ //shipping information
+ <c:if test="${shippingQuote!=null}">
+ if (!$('#shipToDeliveryAddress').is(':checked')) {
+ //validate shipping fields
+ if (fieldId.indexOf("delivery") >= 0) {
+ validateField = false; //ignore shipping fields when ship to billing
+ }
+ }
+ </c:if>
+ <c:if test="${fn:length(paymentMethods)>0}">
+ //if any payment option need validation insert here
+ //console.log($('input[name=paymentMethodType]:checked', checkoutFormId).val());
+ //var paymentMethod = $('input[name=paymentMethodType]:checked', checkoutFormId).val();
+ var paymentType = $('input[name=paymentMethodType]').val();
+ console.log('Payment Method Type ' + paymentType);
+ if(paymentType=='CREDITCARD') {
+ if (fieldId.indexOf("creditcard") >= 0) {
+ if(fieldId!='creditcard_card_number' || fieldId!='creditcard-card-number') {
+ validateField = true;// but validate credit card fields when credit card is selected
+ }
+ if(fieldId=='creditcard_card_number' || fieldId=='creditcard-card-number') {
+ return isCreditCardValid();// validate credit card number differently
+ }
+ }
+ }
+ </c:if>
+
+
+
+ if(!validateField) {
+ return true;
+ }
+
+ if(field.attr('type')=='checkbox') {
+ if(field.is(":checked")) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ if(!emptyString(value)) {
+ field.css('background-color', '#FFF');
+ return true;
+ } else {
+ field.css('background-color', '#FFC');
+ return false;
+ }
+}
+
+function showErrorMessage(message) {
+
+
+ showResponseErrorMessage(message);
+ $('#submitOrder').addClass('btn-disabled');
+ $('#submitOrder').prop('disabled', true);
+
+ $(formErrorMessageId).addClass('alert-error alert-danger');
+ $(formErrorMessageId).removeClass('alert-success');
+ $(formErrorMessageId).html('<!--<img src="<c:url value="/resources/img/icon_error.png"/>" width="40"/> --><strong><font color="red">' + message + '</font></strong>');
+ $(formErrorMessageId).show();
+
+}
+
+function showResponseErrorMessage(message) {
+
+ $('#checkoutError').addClass('alert');
+ $('#checkoutError').addClass('alert-error alert-danger');
+ $('#checkoutError').html(message);
+
+}
+
+function resetErrorMessage() {
+
+ $('#checkoutError').html('');
+ $('#checkoutError').removeClass('alert');
+ $('#checkoutError').removeClass('alert-error alert-danger');
+ $('.error').html('');
+
+}
+
+
+
+//different form actions
+function bindActions() {
+
+ $("#clickAgreement").click(function(){
+ $("#customer-agreement-area").slideToggle("slow");
+ });
+
+ bindCalculateShipping();
+
+ $("input[type='text']").on("change keyup paste", function(){
+ isFormValid();
+ });
+
+ $("input[type='checkbox']").on("change click", function(){
+ isFormValid();
+ });
+
+ $('input[name=paymentMethodType]', checkoutFormId).click(function() {
+ isFormValid();//change payment method
+ });
+
+ $("#billingStateList").change(function() {
+ shippingQuotes(shippingQuotesUrl,useDistanceWindow);
+ })
+
+ $("#shippingStateList").change(function() {
+ shippingQuotes(shippingQuotesUrl,useDistanceWindow);
+ })
+
+ $("input[id=billingPostalCode]").on('blur input', function() {
+ if (!$('#shipToDeliveryAddress').is(':checked')) {
+ shippingQuotes(shippingQuotesUrl,useDistanceWindow);
+ }
+ });
+
+ $("input[id=deliveryPostalCode]").on('blur input', function() {
+ if ($('#shipToDeliveryAddress').is(':checked')) {
+ shippingQuotes(shippingQuotesUrl,useDistanceWindow);
+ }
+ });
+
+ $(".paymentMethodSelected").click(function() {
+ var paymentClicked = $(this).attr("name");
+ //console.log('Selected payment' + paymentClicked);
+ setPaymentModule(paymentClicked);
+ isFormValid();
+ });
+
+ //shipping / billing decision checkbox
+ $("#shipToDeliveryAddress").click(function() {
+ shippingQuotes(shippingQuotesUrl,useDistanceWindow);
+ isFormValid();
+ $('#ship-box-info').slideToggle(1000);
+ });
+
+ //final order submission button
+ $("#submitOrder").click(function(e) {
+ e.preventDefault();//do not submit form
+ formValid = isFormValid();
+ resetErrorMessage();
+ setCountrySettings('billing',$('.billing-country-list').val());
+ setCountrySettings('delivery',$('.shipping-country-list').val());
+ //$('#submitOrder').disable();
+
+ //confirm shipping
+ if(formValid) {
+ //validateConfirmShipping(response);
+ if($('#confirm_address')) {
+ //add confirm address section to shipping
+ }
+ }
+
+ showSMLoading('#pageContainer');
+ var paymentSelection = $('#paymentModule').val();
+ console.log('Selection-> ' + paymentSelection);
+ if(paymentSelection.indexOf('paypal') >= 0 || paymentSelection.indexOf('PAYPAL') >= 0) {
+
+ //$('#paymentMethodType').val('PAYPAL');
+ $('#paymentMethodType').attr("value", 'PAYPAL');
+ initPayment('PAYPAL');
+ }
+ else if(paymentSelection.indexOf('stripe') >= 0) {
+ //console.log('Stripe ');
+ //$('#paymentMethodType').val('CREDITCARD');
+ $('#paymentMethodType').attr("value", 'CREDITCARD');
+ initStripePayment();
+ }
+ else if(paymentSelection.indexOf('braintree') >= 0) {
+ console.log('Braintree ' + $('input[name=paymentMethodType]').val());
+ //$('#paymentMethodType').val('CREDITCARD');
+ $('#paymentMethodType').attr("value", 'CREDITCARD');
+ console.log('Payment method type -> ' + $('input[name=paymentMethodType]').val());
+ initBraintreePayment();
+ }
+ else if(paymentSelection.indexOf('beanstream') >= 0) {
+ //console.log('Beanstream ');
+ //$('#paymentMethodType').val('CREDITCARD');
+ $('#paymentMethodType').attr("value", 'CREDITCARD');
+ } else {
+ //submit form
+ //console.log('Checkout ');
+ hideSMLoading('#pageContainer');
+ $('#checkoutForm').submit();
+
+ }
+ });
+}
+
+function initPayment(paymentSelection) {
+ var url = '<c:url value="/shop/order/payment/init/"/>' + paymentSelection + '.html';
+ var data = $(checkoutFormId).serialize();
+ $.ajax({
+ type: 'POST',
+ url: url,
+ data: data,
+ cache: false,
+ dataType: 'json',
+ success: function(response){
+ //$('#submitOrder').enable();
+ hideSMLoading('#pageContainer');
+ var resp = response.response;
+ var status = resp.status;
+ //console.log(status);
+ if(status==0 || status ==9999) {
+
+ var data = resp.url;
+ //console.log(resp.url);
+ location.href=resp.url;
+
+ } else if(status==-2) {//validation issues
+
+ //console.log(resp.validations);
+ var globalMessage = '';
+ for(var i = 0; i< resp.validations.length; i++) {
+ var fieldName = resp.validations[i].field;
+ var message = resp.validations[i].message;
+ //console.log(fieldName + ' - ' + message);
+ //query for the field
+ var f = $(document.getElementById('error-'+fieldName));
+ if(f) {
+ f.html(message);
+ }
+ globalMessage = globalMessage + message + '<br/>';
+
+ }
+
+ showResponseErrorMessage(globalMessage);
+
+
+ } else {
+ //console.log('Wrong status ' + status);
+ showResponseErrorMessage('<s:message code="error.code.99" text="An error message occured while trying to process the payment (99)"/>');
+
+ }
+ },
+ error: function(xhr, textStatus, errorThrown) {
+ hideSMLoading('#pageContainer');
+ //alert('error ' + errorThrown);
+ showResponseErrorMessage(errorThrown);
+ }
+
+ });
+
+}
+
+
+</script>
+
+ <!-- page-title-wrapper-end -->
+ <!-- entry-header-area start -->
+ <div class="entry-header-area ptb-40">
+ <div class="container">
+ <div class="row">
+ <div class="col-md-12">
+ <div class="entry-header">
+ <h1 class="entry-title"><s:message code="label.checkout" text="Checkout" /></h1>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <!-- entry-header-area end -->
+ <!-- coupon-area start -->
+ <div class="coupon-area">
+ <div class="container">
+ <div class="row">
+ <div class="col-md-12">
+ <div class="coupon-accordion">
+ <!-- ACCORDION START -->
+ <sec:authorize access="!hasRole('AUTH_CUSTOMER') and !fullyAuthenticated">
+ <p class="muted common-row"><a href="<c:url value="/shop/customer/customLogon.html"/>"><s:message code="label.checkout.logon" text="Logon or signup to simplify the online purchase process!"/></a></p>
+ </sec:authorize>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+
+ <!-- coupon-area end -->
+ <!-- checkout-area start -->
+ <div class="checkout-area pb-50">
+ <div class="container">
+ <div class="row">
+
+
+ <!-- If error messages -->
+ <div id="checkoutError" class="<c:if test="${errorMessages!=null}">alert alert-error alert-danger </c:if>">
+ <c:if test="${errorMessages!=null}">
+ <c:out value="${errorMessages}" />
+ </c:if>
+ </div>
+ <!--alert-error-->
+
+ <c:set var="commitUrl" value="${pageContext.request.contextPath}/shop/order/commitOrder.html"/>
+ <form:form id="checkoutForm" method="POST" enctype="multipart/form-data" commandName="order" action="${commitUrl}">
+ <input type="hidden" id="useDistanceWindow" name="useDistanceWindow" value="<c:out value="${shippingMetaData.useDistanceModule}"/>">
+ <div class="col-lg-6 col-md-6">
+ <div class="checkbox-form">
+ <h3><s:message code="label.customer.billinginformation" text="Billing information"/></h3>
+ <div class="row">
+ <div class="col-md-6">
+ <div class="checkout-form-list">
+ <label><s:message code="label.generic.firstname" text="First Name"/><span class="required">*</span></label>
+ <s:message code="NotEmpty.customer.firstName" text="First name is required" var="msgFirstName"/>
+ <form:input id="customer.firstName" cssClass="required" path="customer.billing.firstName" autofocus="autofocus" title="${msgFirstName}"/>
+ <form:errors path="customer.billing.firstName" cssClass="error" />
+ <span id="error-customer.billing.firstName" class="error"></span>
+ </div>
+ </div>
+ <div class="col-md-6">
+ <div class="checkout-form-list">
+ <label><s:message code="label.generic.lastname" text="Last Name"/><span class="required">*</span></label>
+ <s:message code="NotEmpty.customer.lastName" text="Last name is required" var="msgLastName"/>
+ <form:input id="customer.lastName" cssClass="required" maxlength="32" path="customer.billing.lastName" title="${msgLastName}" />
+ <form:errors path="customer.billing.lastName" cssClass="error" />
+ <span id="error-customer.billing.lastName" class="error"></span>
+ </div>
+ </div>
+ <div class="col-md-12">
+ <div class="checkout-form-list">
+ <label><s:message code="label.customer.billing.company" text="Billing company"/></label>
+ <form:input id="customer.billing.company" cssClass="" path="customer.billing.company"/>
+ <form:errors path="customer.billing.company" cssClass="error" />
+ <span id="error-customer.billing.company" class="error"></span>
+ </div>
+ </div>
+ <div class="col-md-12">
+ <div class="checkout-form-list">
+ <label><s:message code="label.generic.streetaddress" text="Street address"/> <span class="required">*</span></label>
+ <s:message code="NotEmpty.customer.billing.address" text="Address is required" var="msgAddress"/>
+ <form:input id="customer.billing.address" cssClass="required" path="customer.billing.address" title="${msgAddress}"/>
+ <form:errors path="customer.billing.address" cssClass="error" />
+ <span id="error-customer.billing.address" class="error"></span>
+ </div>
+ </div>
+ <div class="col-md-12">
+ <div class="checkout-form-list">
+ <label><s:message code="label.generic.city" text="City"/> <span class="required">*</span></label>
+ <s:message code="NotEmpty.customer.billing.city" text="City is required" var="msgCity"/>
+ <form:input id="customer.billing.city" cssClass="required" path="customer.billing.city" title="${msgCity}"/>
+ <form:errors path="customer.billing.city" cssClass="error" />
+ <span id="error-customer.billing.city" class="error"></span>
+ </div>
+ </div>
+ <div class="col-md-12">
+ <div class="country-select">
+ <label><s:message code="label.generic.country" text="Country"/> <span class="required">*</span></label>
+ <form:select cssClass="billing-country-list" path="customer.billing.country" style="background-color: rgb(255, 255, 255);">
+ <form:options items="${countries}" itemValue="isoCode" itemLabel="name"/>
+ </form:select>
+ </div>
+ </div>
+ <div class="col-md-6">
+ <div class="checkout-form-list zone-select">
+ <label><s:message code="label.generic.stateprovince" text="State / Province"/> <span class="required">*</span></label>
+ <form:select cssClass="zone-list" id="billingStateList" path="customer.billing.zone"/>
+ <s:message code="NotEmpty.customer.billing.stateProvince" text="State / Province is required" var="msgStateProvince"/>
+ <form:input class="required" id="billingStateProvince" maxlength="100" name="billingStateProvince" path="customer.billing.stateProvince" title="${msgStateProvince}"/>
+ <form:errors path="customer.billing.stateProvince" cssClass="error" />
+ <span id="error-customer.billing.stateProvince" class="error"></span>
+ </div>
+ </div>
+ <div class="col-md-6">
+ <div class="checkout-form-list">
+ <label><s:message code="label.generic.postalcode" text="Postal code"/> <span class="required">*</span></label>
+ <s:message code="NotEmpty.customer.billing.postalCode" text="Postal code is required" var="msgPostalCode"/>
+ <form:input id="billingPostalCode" cssClass="required billing-postalCode" path="customer.billing.postalCode" title="${msgPostalCode}"/>
+ <form:errors path="customer.billing.postalCode" cssClass="error" />
+ <span id="error-customer.billing.postalCode" class="error"></span>
+ </div>
+ </div>
+ <div class="col-md-6">
+ <div class="checkout-form-list">
+ <label><s:message code="label.generic.email" text="Email address"/> <span class="required">*</span></label>
+ <s:message code="NotEmpty.customer.emailAddress" text="Email address is required" var="msgEmail"/>
+ <form:input id="customer.emailAddress" cssClass="required" path="customer.emailAddress" title="${msgEmail}"/>
+ <form:errors path="customer.emailAddress" cssClass="error" />
+ <span id="error-customer.emailAddress" class="error"></span>
+ </div>
+ </div>
+ <div class="col-md-6">
+ <div class="checkout-form-list">
+ <label><s:message code="label.generic.phone" text="Phone number"/> <span class="required">*</span></label>
+ <s:message code="NotEmpty.customer.billing.phone" text="Phone number is required" var="msgPhone"/>
+ <form:input id="customer.billing.phone" cssClass="required" path="customer.billing.phone" title="${msgPhone}"/>
+ <form:errors path="customer.billing.phone" cssClass="error" />
+ <span id="error-customer.billing.phone" class="error"></span>
+ </div>
+ </div>
+ <sec:authorize access="!hasRole('AUTH_CUSTOMER') and !fullyAuthenticated">
+ <div class="col-md-12">
+ <div class="checkout-form-list create-acc">
+ <input id="cbox" type="checkbox" />
+ <label><s:message code="label.customer.createaccount" text="Create an account?"/></label>
+ </div>
+ <div id="cbox_info" class="checkout-form-list create-account">
+ <p><s:message code="label.customer.createaccount.text" text="Create an account by entering the information below. If you are a returning customer please login using the link at the top of the page."/></p>
+ <s:message code="message.password.required" text="Password is required" var="msgPassword"/>
+ <label><s:message code="label.customer.accountpassword" text="Account password"/> <span class="required">*</span></label>
+ <form:input id="customer.clearPassword" cssClass="required" path="customer.clearPassword" title="${msgPassword}"/>
+ </div>
+ </div>
+ </sec:authorize>
+ </div>
+ <c:if test="${shippingQuote!=null}">
+ <div class="different-address">
+ <div class="ship-different-title">
+ <h3>
+ <label><s:message code="label.customer.shipping.shipdifferentaddress" text="Ship to a different address?"/></label>
+ <form:checkbox path="shipToDeliveryAddress" id="shipToDeliveryAddress"/>
+ </h3>
+ </div>
+ <div id="ship-box-info" class="row">
+ <div class="col-md-6">
+ <div class="checkout-form-list">
+ <label><s:message code="label.customer.shipping.firstname" text="Shipping first name"/> <span class="required">*</span></label>
+ <s:message code="NotEmpty.customer.shipping.firstName" text="Shipping first name should not be empty" var="msgShippingFirstName"/>
+ <form:input id="customer.delivery.name" cssClass="required" path="customer.delivery.firstName" title="${msgShippingFirstName}"/>
+ </div>
+ </div>
+ <div class="col-md-6">
+ <div class="checkout-form-list">
+ <label><s:message code="label.customer.shipping.lastname" text="Shipping last name"/> <span class="required">*</span></label>
+ <s:message code="NotEmpty.customer.shipping.lastName" text="Shipping last name should not be empty" var="msgShippingLastName"/>
+ <form:input id="customer.delivery.name" cssClass="required" path="customer.delivery.lastName" title="${msgShippingLastName}"/>
+ </div>
+ </div>
+ <div class="col-md-12">
+ <div class="checkout-form-list">
+ <label><s:message code="label.customer.shipping.company" text="Shipping company"/></label>
+ <form:input id="customer.delivery.company" cssClass="" path="customer.delivery.company"/>
+ </div>
+ </div>
+ <div class="col-md-12">
+ <div class="checkout-form-list">
+ <label><s:message code="label.customer.shipping.streetaddress" text="Shipping street address"/> <span class="required">*</span></label>
+ <s:message code="NotEmpty.customer.shipping.address" text="Shipping street address should not be empty" var="msgShippingAddress"/>
+ <form:input id="customer.delivery.address" cssClass="required" path="customer.delivery.address" title="${msgShippingAddress}"/>
+ </div>
+ </div>
+ <div class="col-md-12">
+ <div class="checkout-form-list">
+ <label><s:message code="label.customer.shipping.city" text="Shipping city"/> <span class="required">*</span></label>
+ <s:message code="NotEmpty.customer.shipping.city" text="Shipping city should not be empty" var="msgShippingCity"/>
+ <form:input id="customer.delivery.city" cssClass="required" path="customer.delivery.city" title="${msgShippingCity}"/>
+ </div>
+ </div>
+ <div class="col-md-12">
+ <div class="country-select">
+ <label><s:message code="label.customer.shipping.country" text="Shipping country"/> <span class="required">*</span></label>
+ <form:select cssClass="shipping-country-list" path="customer.delivery.country">
+ <form:options items="${countries}" itemValue="isoCode" itemLabel="name"/>
+ </form:select>
+ </div>
+ </div>
+ <div class="col-md-6">
+ <div class="checkout-form-list zone-select">
+ <label><s:message code="label.customer.shipping.zone" text="Shipping state / province"/> <span class="required">*</span></label>
+ <form:select cssClass="zone-list" id="deliveryStateList" path="customer.delivery.zone"/>
+ <s:message code="NotEmpty.customer.shipping.stateProvince" text="Shipping State / Province is required" var="msgShippingState"/>
+ <form:input class="required" id="deliveryStateProvince" maxlength="100" name="shippingStateProvince" path="customer.delivery.stateProvince" title="${msgShippingState}"/>
+ </div>
+ </div>
+ <div class="col-md-6">
+ <div class="checkout-form-list">
+ <label><s:message code="label.customer.shipping.postalcode" text="Shipping postal code"/> <span class="required">*</span></label>
+ <s:message code="NotEmpty.customer.shipping.postalCode" text="Shipping postal code should not be empty" var="msgShippingPostal"/>
+ <form:input id="deliveryPostalCode" cssClass="required delivery-postalCode" path="customer.delivery.postalCode" title="${msgShippingPostal}"/>
+ </div>
+ </div>
+
+ </div>
+ <div class="order-notes">
+ <div class="checkout-form-list">
+ <label><s:message code="label.order.notes" text="Order notes"/></label>
+ <textarea id="comments" cols="30" rows="10" path="comments" placeholder="<s:message code="label.order.notes.eg" text="Notes for the order or delivery"/>" ></textarea>
+ </div>
+ </div>
+ </div>
+ </c:if>
+ </div>
+ </div>
+ <div class="col-lg-6 col-md-6">
+ <div class="your-order">
+ <h3><s:message code="label.order.summary" text="Order summary" /></h3>
+ <div class="your-order-table table-responsive">
+ <table id="summary-table"><!-- requires summary-table -->
+ <thead>
+ <tr>
+ <th class="product-name"><s:message code="label.order.item" text="Item" /></th>
+ <th class="product-total"><s:message code="label.order.total" text="Total" /></th>
+ </tr>
+ </thead>
+ <tbody id="summaryRows">
+ <c:forEach items="${cart.shoppingCartItems}" var="shoppingCartItem">
+ <tr class="cart_item">
+ <td class="product-name">
+ ${shoppingCartItem.name} <strong class="product-quantity"> x ${shoppingCartItem.quantity}</strong>
+ <c:if test="${fn:length(shoppingCartItem.shoppingCartAttributes)>0}">
+ <br/>
+ <ul>
+ <c:forEach items="${shoppingCartItem.shoppingCartAttributes}" var="option">
+ <li>${option.optionName} - ${option.optionValue}</li>
+ </c:forEach>
+ </ul>
+ </c:if>
+ </td>
+ <td class="product-total">
+ <span class="amount">${shoppingCartItem.subTotal}</span>
+ </td>
+ </tr>
+ </c:forEach>
+ </tbody>
+ <tfoot>
+ <!-- subtotals -->
+ <c:forEach items="${order.orderTotalSummary.totals}" var="total">
+ <c:if test="${total.orderTotalCode!='order.total.total'}">
+ <tr id="cart-subtotal-${total.orderTotalCode}" class="cart-subtotal subt">
+ <td class="order-total-label">
+ <c:choose>
+ <c:when test="${total.orderTotalCode=='order.total.discount'}">
+ <s:message code="label.generic.rebate" text="Rebate"/> - <s:message code="${total.text}" text="${total.text}"/>
+ </c:when>
+ <c:otherwise>
+ <s:message code="${total.orderTotalCode}" text="${total.orderTotalCode}"/>
+ </c:otherwise>
+ </c:choose>
+ </td>
+ <td><strong><c:choose><c:when test="${total.orderTotalCode=='order.total.discount'}"><font color="red">- <sm:monetary value="${total.value}" /></span></c:when><c:otherwise><sm:monetary value="${total.value}" /></c:otherwise></c:choose></strong></td>
+ </tr>
+ </c:if>
+ </c:forEach>
+
+ <!-- Shipping box THIS IS ALL BROKEN -->
+ <c:if test="${shippingQuote!=null}">
+ <tr class="shipping">
+ <td class="order-total-label" style="border:none !important;">
+ <s:message code="label.shipping.fees" text="Shipping fees" />
+ <input type="hidden" id="shippingModule" name="shippingModule" value="${shippingQuote.shippingModuleCode}">
+ </td>
+ <td id="shippingSection" style="border:none !important;">
+ <c:choose>
+ <c:when test="${fn:length(shippingQuote.shippingOptions)>0}">
+ <c:if test="${shippingQuote.shippingReturnCode=='NO_POSTAL_CODE'}">
+ <br/>
+ <font color="orange"><s:message code="label.shipping.nopostalcode" text="A shipping quote will be available after filling the postal code"/></font>
+ <br/><br/>
+ </c:if>
+ <table id="shippingOptions">
+ <c:forEach items="${shippingQuote.shippingOptions}" var="option" varStatus="status">
+ <tr>
+ <td style="border: none !important;">
+ <input type="radio" name="selectedShippingOption.optionId" class="shippingOption" code="${option.shippingModuleCode}" id="${option.optionId}" value="${option.optionId}" <c:if test="${shippingQuote.selectedShippingOption!=null && shippingQuote.selectedShippingOption.optionId==option.optionId}">checked="checked"</c:if>>
+ </td>
+ <td style="border: none !important;">
+ <label>
+ <s:message code="module.shipping.${option.shippingModuleCode}" arguments="${requestScope.MERCHANT_STORE.storename}" text="${option.shippingModuleCode}"/>: <span class="amount">${option.optionPriceText}</span>
+ </label>
+ </td>
+ </tr>
+ <c:if test="${option.note!=null}">
+ <tr>
+ <td colspan="2" style="border: none !important;"><span><small><c:out value="${option.note}"/></small></span></td>
+ </tr>
+ </c:if>
+ </c:forEach>
+ </table>
+ </c:when>
+ <c:otherwise>
+ <c:choose>
+ <c:when test="${shippingQuote.freeShipping==true && shippingQuote.freeShippingAmount!=null}" >
+ <s:message code="label.shipping.freeshipping.over" text="Free shipping for orders over"/> <strong><sm:monetary value="${shippingQuote.freeShippingAmount}"/></strong>
+ </c:when>
+ <c:otherwise>
+ <c:choose>
+ <c:when test="${shippingQuote.shippingReturnCode=='ERROR'}">
+ <font color="red"><c:out value="${shippingQuote.quoteError}" /></font>
+ </c:when>
+ <c:otherwise>
+ <c:choose>
+ <c:when test="${shippingQuote.shippingReturnCode=='NO_SHIPPING_MODULE_CONFIGURED'}">
+ <font color="red"><s:message code="message.noshipping.configured" text="No shipping method configured"/></font>
+ </c:when>
+ <c:otherwise>
+ <c:choose>
+ <c:when test="${shippingQuote.shippingReturnCode=='NO_POSTAL_CODE'}">
+ <div id="shippingSection" class="control-group">
+ <strong>
+ <font color="orange"><s:message code="label.shipping.nopostalcode" text="A shipping quote will be available after filling the postal code"/></font>
+ </strong>
+ </div>
+ </c:when>
+ <c:otherwise>
+ <strong><s:message code="label.shipping.freeshipping" text="Free shipping!"/></strong>
+ </c:otherwise>
+ </c:choose>
+ </c:otherwise>
+ </c:choose>
+ </c:otherwise>
+ </c:choose>
+ </c:otherwise>
+ </c:choose>
+ </c:otherwise>
+ </c:choose>
+ </td>
+ </tr>
+ <tr class="shipping">
+ <td colspan="2">
+ <!-- Confirm address box box -->
+ <div id="confirmShippingAddress" style="height:250px;"></div>
+ </td>
+ </tr>
+ </c:if>
+
+ <tr id="totalRow" class="total-box order-total">
+ <th><s:message code="order.total.total" text="Total"/></th>
+ <td><strong><span class="amount grand-total"><sm:monetary value="${order.orderTotalSummary.total}"/></td>
+ </tr>
+ </tfoot>
+ </table>
+ </div>
+ <!-- Payments -->
+ <c:if test="${fn:length(paymentMethods)>0}">
+ <div class="payment-method">
+ <ul class="nav nav-tabs" role="tablist">
+ <c:forEach items="${paymentMethods}" var="paymentMethod">
+
+ <li role="presentation"
+ class="<c:choose><c:when test="${order.paymentMethodType!=null && order.paymentMethodType==paymentMethod.paymentType}">active</c:when><c:otherwise><c:if test="${order.paymentMethodType==null && paymentMethod.defaultSelected==true}">active</c:if></c:otherwise></c:choose>">
+ <a href="#${paymentMethod.paymentType}"
+ class="paymentMethodSelected"
+ name="${paymentMethod.paymentMethodCode}"
+ aria-controls="#${paymentMethod.paymentType}" role="tab"
+ data-toggle="tab">
+
+ <h5>
+ <s:message
+ code="payment.type.${paymentMethod.paymentType}"
+ text="Payment method type [payment.type.${paymentMethod.paymentType}] not defined in payment.properties" />
+ </h5>
+
+ </a>
+ </li>
+
+ </c:forEach>
+ </ul>
+ <!-- redit card https://codepen.io/llgruff/pen/JdyJWR -->
+ <div class="v-margin20">
+
+
+ <div class="tab-content">
+
+ <c:forEach items="${paymentMethods}" var="paymentMethod">
+ <div
+ class="payment-tab tab-pane <c:choose><c:when test="${order.paymentMethodType!=null && order.paymentMethodType==paymentMethod.paymentType}">active</c:when><c:otherwise><c:if test="${order.paymentMethodType==null && paymentMethod.defaultSelected==true}">active</c:if></c:otherwise></c:choose>"
+ id="${paymentMethod.paymentType}">
+ <c:choose>
+ <c:when
+ test="${order.paymentMethodType!=null && order.paymentMethodType==paymentMethod.paymentType}">
+ <c:set var="paymentModule"
+ value="${order.paymentMethodType}" scope="request" />
+ </c:when>
+ <c:otherwise>
+ <c:if
+ test="${order.paymentMethodType==null && paymentMethod.defaultSelected==true}">
+ <c:set var="paymentModule"
+ value="${paymentMethod.paymentMethodCode}"
+ scope="request" />
+ </c:if>
+ </c:otherwise>
+ </c:choose>
+ <c:set var="selectedPaymentMethod"
+ value="${order.paymentMethodType}" scope="request" />
+ <c:set var="paymentMethod" value="${paymentMethod}"
+ scope="request" />
+
+ <!-- exception for stripe, braintree... which has it's own page -->
+ <c:choose>
+ <c:when
+ test="${(paymentMethod.paymentMethodCode=='stripe') or (paymentMethod.paymentMethodCode=='braintree')}">
+ <c:set var="pageName"
+ value="${fn:toLowerCase(paymentMethod.paymentMethodCode)}" />
+ </c:when>
+ <c:otherwise>
+ <c:set var="pageName"
+ value="${fn:toLowerCase(paymentMethod.paymentType)}" />
+ </c:otherwise>
+ </c:choose>
+ <jsp:include
+ page="/pages/shop/common/checkout/${pageName}.jsp" />
+
+ </div>
+ </c:forEach>
+ <!-- values set by javascript -->
+ <input type="hidden" id="paymentMethodType" name="paymentMethodType" value="<c:if test="${order.paymentType!=null}"><c:out value="${order.paymentType}"/></c:if>" />
+ <input type="hidden" id="paymentModule" name="paymentModule"
+ value="<c:choose><c:when test="${order.paymentModule!=null}"><c:out value="${order.paymentModule}"/></c:when><c:otherwise><c:out value="${paymentModule}" /></c:otherwise></c:choose>" />
+ </div>
+
+ </div>
+
+ <c:if
+ test="${requestScope.CONFIGS['displayCustomerAgreement']==true}">
+ <!-- customer agreement -->
+ <div class="checkout-box" id="customerAgreementSection"
+ class="">
+ <label id="customerAgreement" class="checkbox"> <s:message
+ code="NotEmpty.customer.agreement"
+ text="Please make sure you agree with terms and conditions"
+ var="msgAgreement" /> <form:checkbox path="customerAgreed"
+ id="customerAgreed" cssClass="required"
+ title="${msgAgreement}" /> <a
+ href="javascript:return false;" id="clickAgreement"><s:message
+ code="label.customer.order.agreement"
+ text="I agree with the terms and conditions" /></a>
+ </label>
+ <div id="customer-agreement-area">
+ <c:choose>
+ <c:when test="${requestScope.CONTENT['agreement']!=null}">
+ <sm:pageContent contentCode="agreement" />
+ </c:when>
+ <c:otherwise>
+ <s:message code="message.content.missing.agreement"
+ text="Content with code 'agreement' does not exist" />
+ </c:otherwise>
+ </c:choose>
+ </div>
+ </div>
+ </c:if>
+
+ <div id="formErrorMessage" class="alert"></div>
+ <div class="order-button-payment">
+ <button id="submitOrder" type="button" class="
+ <c:if test="${errorMessages!=null}"> btn-disabled</c:if>"
+ <c:if test="${errorMessages!=null}"> disabled="true"</c:if>
+ ><s:message code="button.label.submitorder" text="Submit order"/>
+ </button>
+
+ <!-- submit can be a post or a pre ajax query -->
+ </div>
+ </div>
+ </c:if>
+ </div>
+ </div>
+ </form:form>
+ </div>
+ </div>
+ </div>
+ <!-- checkout-area end -->
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/content.jsp b/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/content.jsp
new file mode 100644
index 0000000..7fca070
--- /dev/null
+++ b/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/content.jsp
@@ -0,0 +1,131 @@
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+
+ <script type="text/html" id="productBoxTemplate">
+{{#products}}
+<div itemscope itemtype="http://schema.org/Enumeration" class="col-md-4 productItem" item-order="{{sortOrder}}" item-name="{{description.name}}" item-price="{{price}}" data-id="{{id}}" class="col-sm-4">
+<div class="box-style-4 white-bg object-non-visible animated object-visible">
+ {{#description.highlights}}
+ <div class="ribbon-wrapper-green">
+ <div class="ribbon-green">
+ {{description.highlights}}
+ </div>
+ </div>
+ {{/description.highlights}}
+ {{^canBePurchased}}
+ <div class="sold-out-box">
+ <span class="sold-out-text"><s:message code="label.soldout" text="Sold out" /></span>
+ </div>
+ {{/canBePurchased}}
+ <div class="product-image">
+ {{#image}}
+ <img class="product-img" src="<c:url value=""/>{{image.imageUrl}}"><a class="overlay" href="<c:url value="/shop/product/" />{{description.friendlyUrl}}.html<sm:breadcrumbParam/>"><img class="product-img" src="<c:url value="/"/>{{image.imageUrl}}"></a>
+ {{/image}}
+ </div>
+ <!-- *** Product Name & Price Starts *** -->
+ <div class="caption">
+ <div class="product-details">
+ <div class="clearfix">
+ <h3 class="product-heading product-name" itemprop="name">{{description.name}}</h3>
+ <h4 class="price">
+ {{#discounted}}<del>{{originalPrice}}</del> <span itemprop="price" class="specialPrice">{{finalPrice}}</span>{{/discounted}}
+ {{^discounted}}<span itemprop="price" class="specialPrice">{{finalPrice}}</span>{{/discounted}}
+ </h4>
+ <!-- Product Name & Price Ends -->
+ <!-- Product Buttons Starts -->
+ <div class="clearfix">
+ <a class="btn btn-default pull-left" href="<c:url value="/shop/product/" />{{description.friendlyUrl}}.html<sm:breadcrumbParam/>" class="details"><s:message code="button.label.view" text="Details" /></a>
+ <c:if test="${requestScope.CONFIGS['allowPurchaseItems'] == true}">
+ {{#canBePurchased}}<a class="btn btn-buy pull-right addToCart" href="javascript:void(0);" class="addToCart" productId="{{id}}"><s:message code="button.label.addToCart" text="Add to cart" /></a>{{/canBePurchased}}
+ </c:if>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+</div>
+{{/products}}
+</script>
+
+
+ <!-- don't change that script except max_oroducts -->
+ <script>
+
+ var START_COUNT_PRODUCTS = 0;
+ var MAX_PRODUCTS = 500;
+ var filter = null;
+ var filterValue = null;
+
+ $(function(){
+
+ <c:if test="${productGroup!=null}">
+ loadItemsProducts();
+ </c:if>
+
+ });
+
+
+ function loadItemsProducts() {
+
+ //services/public/{store}/products/group/{code}
+ var url = '<%=request.getContextPath()%>/services/public/<c:out value="${requestScope.MERCHANT_STORE.code}"/>/products/group/<c:out value="${productGroup}"/>';
+ loadProducts(url,'#productsContainer');
+
+ }
+
+
+ function buildProductsList(productList, divProductsContainer) {
+ log('Products-> ' + productList.products.length);
+ var productsTemplate = Hogan.compile(document.getElementById("productBoxTemplate").innerHTML);
+ var productsRendred = productsTemplate.render(productList);
+ $('#productsContainer').append(productsRendred);
+ initBindings();
+ }
+
+ function callBackLoadProducts(productList) {
+
+ var productQty = productList.productCount + ' <s:message code="label.search.items.found" text="item(s) found" />';
+ $('#products-qty').html(productQty);
+ $('#productsContainer').hideLoading();
+
+ }
+
+</script>
+
+
+ <div class="container">
+ <div class="row">
+ <div id="shop" class="col-md-12">
+ <c:out value="${content.description}" escapeXml="false"/>
+ </div>
+ </div>
+ <c:if test="${productGroup!=null}">
+ <div class="col-md-12">
+ <div class="product-list">
+
+
+ <!-- just copy that block for havimg products displayed -->
+ <!-- products are loaded by ajax -->
+ <div id="productsContainer" class="list-unstyled"></div>
+
+ <!-- end block -->
+
+ </div>
+
+ </div>
+ </c:if>
+ </div>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/customer.jsp b/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/customer.jsp
new file mode 100644
index 0000000..134280e
--- /dev/null
+++ b/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/customer.jsp
@@ -0,0 +1,21 @@
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+<%
+/** Nothing just use the common customer dashboard page **/
+%>
+
+<jsp:include page="/pages/shop/common/customer/dashboard.jsp" />
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/landing.jsp b/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/landing.jsp
new file mode 100644
index 0000000..a8f6902
--- /dev/null
+++ b/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/landing.jsp
@@ -0,0 +1,195 @@
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+ <!-- home banner -->
+ <!-- slider-area-start -->
+ <div class="slider-area">
+ <c:choose>
+ <c:when test="${requestScope.CONTENT['bannerImage']!=null}">
+ <sm:pageContent contentCode="bannerImage"/>
+ </c:when>
+ <c:otherwise>
+<%--
+ <!-- idea of a banner -->
+ <section id="home-banner">
+ <article>
+ <div class="banner-text">
+ <h2>Barn wood siding</h2>
+ <p>Barn wood style. Several shades available</p>
+ <div class="slider-button store-btn button-link">
+ <div class="store-btn-addtocart">
+ <a class="more" href="#">More details</a>
+ </div>
+ </div>
+ </div>
+ <div class="image-content"><img src="/resources/templates/generic/img/carlos-place.jpg" alt="text"></div>
+ </article>
+ <article>
+ <div class="banner-text">
+ <h2>Antique beams reproduction</h2>
+ <p>Feel free to remove or change this slider '/generic/pages/landing.jsp'</p>
+ <div class="slider-button store-btn button-link">
+ <div class="store-btn-addtocart">
+ <a class="more" href="#">More details</a>
+ </div>
+ </div>
+ </div>
+ <div class="image-content"><img src="/resources/templates/generic/img/banner-beams-resized.jpg" alt="text"></div>
+ </article>
+ </section> --%>
+ </c:otherwise>
+ </c:choose>
+
+ </div>
+ <!-- slider-area-end -->
+
+ <!-- home page - top category CUSTOM CONTENT in home page -->
+ <c:if test="${page!=null}">
+ <div class="service-area pt-80">
+ <div class="container">
+ <c:out value="${page.description}" escapeXml="false"/>
+ </div>
+ </div>
+ </c:if>
+
+
+
+
+
+
+
+ <c:if test="${requestScope.CONTENT['homeMessage']!=null}">
+ <div class="service-area pt-80">
+ <div class="container">
+ <sm:pageContent contentCode="homeMessage"/>
+ </div>
+ </div>
+ </c:if>
+
+
+
+
+ <!-- featured items -->
+ <!-- Using ajax -->
+
+
+ <!-- service-area-end -->
+ <!--new-product-area-start -->
+ <c:if test="${requestScope.FEATURED_ITEM!=null}">
+ <div class="new-product-area pt-80 pb-20">
+ <div class="container">
+ <div class="row">
+ <div class="col-lg-12">
+ <div class="section-title text-center">
+ <h2><s:message code="menu.catalogue-featured" text="Featured items" /></h2>
+ <c:if test="${requestScope.CONTENT['featuredItemsText']!=null}">
+ <sm:pageContent contentCode="featuredItemsText"/>
+ </c:if>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </c:if>
+
+
+ <!-- featured items -->
+ <section class="products-grid">
+ <div class="container">
+ <div id="featuredItemsContainer" class="row products-container"></div>
+ </div>
+ </section>
+
+
+
+ <!-- PUT BACK LATEST BLOGS -->
+
+
+
+
+ <!-- signup box -->
+ <!-- purchase-progress-area-end -->
+ <!-- contact-area-start -->
+ <!--
+ <div class="contact-area ptb-40">
+ <div class="container">
+ <div class="row">
+ <div class="col-lg-4 col-md-4 col-sm-12 col-xs-12 mar_b-30">
+ <div class="contuct-info text-center">
+ <h4>Sign up for news & offers!</h4>
+ <p>You may safely unsubscribe at any time</p>
+ </div>
+ </div>
+ <div class="col-lg-6 col-md-8 col-sm-12 col-lg-offset-1 col-xs-12">
+ <div class="search-box">
+ <form action="#">
+ <input type="email" placeholder="Enter your email address"/>
+ <button><span class="lnr lnr-envelope"></span></button>
+ </form>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ -->
+ <!-- contact-area-end -->
+
+ <!-- load products -->
+ <script>
+ $(document).ready(function() {
+
+ $('#featuredItemsContainer').LoadingOverlay("show");
+
+ var tpl = $('#productBoxTemplate').text();
+ tpl = tpl.replace("COLUMN-SIZE", "3");
+ $('#productBoxTemplate').text(tpl);
+
+ //get products
+ loadFeaturedItems();
+
+ })
+
+
+
+ function loadFeaturedItems() {
+ $.ajax({
+ type: 'GET',
+ dataType: "json",
+ url: '<c:url value="/"/>services/public/<c:out value="${requestScope.MERCHANT_STORE.code}"/>/products/group/FEATURED_ITEM',
+ success: function(productList) {
+
+ //set in slider
+ var productsTemplate = Hogan.compile(document.getElementById("productBoxTemplate").innerHTML);
+ var productsRendred = productsTemplate.render(productList);
+ $('#featuredItemsContainer').append(productsRendred);
+ $('#featuredItemsContainer').LoadingOverlay("hide", true);
+ //call init bindings
+ initBindings();
+ setProductRating(productList.products);
+ },
+ error: function(jqXHR,textStatus,errorThrown) {
+ $(divProductsContainer).hideLoading();
+ alert('Error ' + jqXHR + "-" + textStatus + "-" + errorThrown);
+ }
+ });
+ }
+
+
+
+ </script>
+ <!--- END -->
+
+
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/logon.jsp b/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/logon.jsp
new file mode 100644
index 0000000..9119259
--- /dev/null
+++ b/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/logon.jsp
@@ -0,0 +1,70 @@
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<link href="<c:url value="/resources/css/assets/bootstrap-social.css" />" rel="stylesheet">
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+
+ <div class="login-area ptb-80">
+ <div class="container">
+ <div class="row">
+ <div class=" col-lg-6 col-md-6 col-sm-6 col-xs-12">
+ <div class="login-title">
+ <h3><s:message code="label.customer.registered" text="Registered customer"/></h3>
+ <span><s:message code="label.customer.registered.signinemail" text="If you have an account, sign in with your email address"/>.</span>
+ </div>
+ <div id="login-form" class="login-form">
+ <form>
+ <div class="form-group login-page">
+ <label for="inputEmail"><s:message code="label.customer.email" text="Customer email address"/> <span>*</span></label>
+ <input type="text" class="form-control" id="signin_userName" name="signin_userName">
+ </div>
+ <div class="form-group login-page">
+ <label for="password"><s:message code="label.generic.password" text="Password"/> <span>*</span></label>
+ <input type="Password" class="form-control" id="signin_password" name="signin_password">
+ </div>
+ <input type="hidden" id="signin_storeCode" name="signin_storeCode" value="<c:out value="${requestScope.MERCHANT_STORE.code}"/>"/>
+ <button type="submit" id="genericLogin-button" class="btn btn-default login-btn"><s:message code="button.label.signin" text="button.label.signin"/></button>
+ </form>
+
+ </div>
+ <!--
+ <a href="#" class="back">Forgot Your Password?</a>
+ -->
+ <!--
+ <br/>
+ <div class="login-title">
+
+ <span><s:message code="label.customer.signin.social" arguments="Facebook" text="Make it easier and sign in with your Facebook account!" /></span>
+ </div>
+
+ <ass="btn btn-block btn-social btn-lg btn-facebook">
+ <span class="fa fa-facebook"></span> <s:message code="label.customer.signin.social.system" arguments="Facebook" text="Sign in with Facebook" />
+ </a>
+ -->
+ </div>
+ <div class="col-lg-6 col-md-6 col-sm-6 col-xs-12">
+ <div class="login-title">
+ <h3><s:message code="label.customer.new" text="New customer"/></h3>
+ <span><s:message code="label.customer.faster" text="Creating an account has many benefits: check out faster, keep more than one address, track orders and more."/></span>
+ </div>
+ <a class="btn btn-default login-btn" href="<s:url value="/shop/customer/registration.html"/>"><s:message code="button.label.register" text="Register" /></a>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/product.jsp b/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/product.jsp
new file mode 100644
index 0000000..e9298bf
--- /dev/null
+++ b/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/product.jsp
@@ -0,0 +1,310 @@
+
+<%
+ response.setCharacterEncoding("UTF-8");
+ response.setHeader("Cache-Control", "no-cache");
+ response.setHeader("Pragma", "no-cache");
+ response.setDateHeader("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm"%>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+<script
+ src="<c:url value="/resources/js/jquery.elevateZoom-3.0.8.min.js" />"></script>
+<script src="<c:url value="/resources/js/jquery.raty.min.js" />"></script>
+
+
+<div id="shop" class="container">
+ <!-- all-hyperion-page-start -->
+ <div class="all-hyperion-page">
+ <div class="container">
+ <div class="row">
+ <div class="col-lg-9 col-md-9 col-sm-12 col-xs-12">
+ <!-- product-simple-area-start -->
+ <div class="product-simple-area ptb-80 ptb-40-md ptb-20-xs"
+ style="padding-top: 40px !important;">
+ <div class="row">
+ <div class="col-lg-5 col-md-7 col-sm-7 col-xs-12">
+ <div class="tab-content">
+ <div class="tab-pane active" id="view1">
+ <a class="image-link" href="${product.image.imageUrl}"><img
+ src="${product.image.imageUrl}" alt=""></a>
+ </div>
+ <c:if
+ test="${product.images!=null && fn:length(product.images) gt 1}">
+ <c:forEach items="${product.images}" var="thumbnail">
+ <c:if test="${thumbnail.imageType==0}">
+ <div class="tab-pane"
+ id="view<c:out value="${thumbnail.id}"/>">
+ <c:choose>
+ <c:when test="${thumbnail.externalUrl==null}">
+ <a href="<c:url value="${thumbnail.imageUrl}"/>"
+ class="image-link"
+ imgId="im-<c:out value="${thumbnail.id}"/>"
+ title="<c:out value="${thumbnail.imageName}"/>"
+ rel="<c:url value="${thumbnail.imageUrl}"/>"><img
+ src="<c:url value="${thumbnail.imageUrl}"/>"
+ alt="<c:url value="${thumbnail.imageName}"/>"></a>
+ </c:when>
+ <c:otherwise>
+ <a href="javascript:;"
+ " class="detailsThumbImg thumbImg thumbnail image-link"
+ imgId="im-<c:out value="${thumbnail.id}"/>"
+ title="<c:out value="${product.description.name}"/>"
+ rel="<c:url value="${thumbnail.externalUrl}"/>"><img
+ src="${thumbnail.externalUrl}"
+ alt="<c:url value="${product.description.name}"/>"></a>
+ </c:otherwise>
+ </c:choose>
+ </div>
+ </c:if>
+ </c:forEach>
+ </c:if>
+ </div>
+ <!-- Nav tabs -->
+ <ul class="sinple-tab-menu" role="tablist">
+ <c:if
+ test="${product.images!=null && fn:length(product.images) gt 1}">
+ <c:forEach items="${product.images}" var="thumbnail">
+ <c:if test="${thumbnail.imageType==0}">
+ <li><a href="#view<c:out value="${thumbnail.id}"/>"
+ data-toggle="tab"><img
+ src="<c:url value="${thumbnail.imageUrl}"/>"
+ alt="<c:url value="${thumbnail.imageName}"/>" /></a></li>
+ </c:if>
+ </c:forEach>
+ </c:if>
+ </ul>
+ </div>
+ <!-- fin col-lg -->
+ <div class="col-lg-7 col-md-5 col-sm-5 col-xs-12">
+ <div class="product-simple-content">
+ <div class="sinple-c-title">
+ <h3>${product.description.name}</h3>
+ </div>
+ <div class="checkbox">
+ <span><i class="fa fa-check-square" aria-hidden="true"></i>
+ <c:if test="${not product.productVirtual}">
+ <div class="checkbox">
+ <!-- availability -->
+ <strong><s:message code="label.product.available"
+ text="Availability" /></strong>: <span><c:choose>
+ <c:when test="${product.quantity>0}">
+ <span itemprop="availability" content="in_stock">${product.quantity}</span>
+ </c:when>
+ <c:otherwise>
+ <span itemprop="availability" content="out_of_stock"><s:message
+ code="label.product.outofstock" text="Out of stock" />
+ </c:otherwise>
+ </c:choose></span><br>
+ </div>
+ </c:if></span>
+ </div>
+ <!-- sku-->
+ <span> <s:message code="label.product.code"
+ text="Product code" /> ${product.sku}
+ </span>
+ <div class="product-price-star star-2">
+ <!-- Review -->
+ <jsp:include page="/pages/shop/common/catalog/rating.jsp" />
+ </div>
+ <!-- price -->
+ <h4>
+ <span itemprop="offerDetails" itemscope
+ itemtype="http://data-vocabulary.org/Offer">
+ <meta itemprop="seller"
+ content="${requestScope.MERCHANT_STORE.storename}" />
+ <meta itemprop="currency"
+ content="<c:out value="${requestScope.MERCHANT_STORE.currency.code}" />" />
+ <span id="productPrice" class="price"> <c:choose>
+ <c:when test="${product.discounted}">
+ <del>
+ <c:out value="${product.originalPrice}" />
+ </del> <span class="specialPrice"><span
+ itemprop="price"><c:out
+ value="${product.finalPrice}" /></span></span>
+ </c:when>
+ <c:otherwise>
+ <span itemprop="price"><c:out
+ value="${product.finalPrice}" /></span>
+ </c:otherwise>
+ </c:choose>
+ </span>
+ </span>
+ </h4>
+ <jsp:include
+ page="/pages/shop/common/catalog/addToCartProduct.jsp" />
+ <div class="action-heiper">
+ <iframe
+ src="https://www.facebook.com/plugins/share_button.php?locale=${LOCALE.language}_${LOCALE.country}&href=<c:out value="${requestScope.CONFIGS['SHOP_SCHEME']}"/>%3A%2F%2F<c:out value="${requestScope.MERCHANT_STORE.domainName}"/><c:url value="/shop/${product.description.friendlyUrl}.html"/>&layout=button_count&size=large&mobile_iframe=true&appId=<c:out value="${requestScope.CONFIGS['shopizer.facebook-appid']}"/>&width=83&height=28"
+ width="100" height="28" style="border: none; overflow: hidden"
+ scrolling="no" frameborder="0" allowTransparency="true"></iframe>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <!-- product-simple-area-end -->
+ <div class="product-info-detailed pb-80 ptb-40-md ptb-20-xs">
+ <div class="row">
+ <div class="col-lg-12">
+ <div class="product-info-tab">
+ <!-- Nav tabs -->
+ <ul class="product-info-tab-menu" role="tablist">
+ <li class="active"><a href="#details" data-toggle="tab"><i
+ class="fa fa-file-text-o pr-5"></i> <s:message
+ code="label.productedit.productdesc"
+ text="Product description" /></a></li>
+ <li><a href="#reviews" data-toggle="tab"><i
+ class="fa fa-star pr-5"></i> <s:message
+ code="label.product.customer.reviews"
+ text="Customer reviews" /></a></li>
+ </ul>
+ <!-- Tab panes -->
+ <div class="tab-content">
+ <div class="tab-pane active" id="details">
+ <div class="product-info-tab-content">
+ <c:out value="${product.description.description}"
+ escapeXml="false" />
+ <dl class="dl-horizontal">
+ <dt>
+ <s:message code="label.product.weight" text="Weight" />
+ :
+ </dt>
+ <dd>
+ <fmt:formatNumber value="${product.productWeight}"
+ maxFractionDigits="2" />
+
+ <s:message
+ code="label.generic.weightunit.${requestScope.MERCHANT_STORE.weightunitcode}"
+ text="Pounds" />
+ </dd>
+ <dt>
+ <s:message code="label.product.height" text="Height" />
+ :
+ </dt>
+ <dd>
+ <fmt:formatNumber value="${product.productHeight}"
+ maxFractionDigits="2" />
+
+ <s:message
+ code="label.generic.sizeunit.${requestScope.MERCHANT_STORE.seizeunitcode}"
+ text="Inches" />
+ </dd>
+ <dt>
+ <s:message code="label.product.width" text="Width" />
+ :
+ </dt>
+ <dd>
+ <fmt:formatNumber value="${product.productWidth}"
+ maxFractionDigits="2" />
+
+ <s:message
+ code="label.generic.sizeunit.${requestScope.MERCHANT_STORE.seizeunitcode}"
+ text="Inches" />
+ </dd>
+ <dt>
+ <s:message code="label.product.length" text="Length" />
+ :
+ </dt>
+ <dd>
+ <fmt:formatNumber value="${product.productLength}"
+ maxFractionDigits="2" />
+
+ <s:message
+ code="label.generic.sizeunit.${requestScope.MERCHANT_STORE.seizeunitcode}"
+ text="Inches" />
+ </dd>
+ </dl>
+ </div>
+ </div>
+ <div class="tab-pane" id="reviews">
+ <div class="customer-review-top">
+ <h4>
+ <s:message code="label.product.customer.reviews"
+ text="Customer reviews" />
+ </h4>
+ <!-- reviews -->
+ <jsp:include page="/pages/shop/common/catalog/reviews.jsp" />
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <!-- fin product info -->
+ </div>
+ <!--fin col 9 -->
+ </div>
+ </div>
+
+ <!-- Related items -->
+
+ <div class="col-lg-3 col-md-3 col-sm-12 col-xs-12">
+ <c:if test="${relatedProducts!=null}">
+ <div
+ class="feature-preduct-area hyperion home-page-2 pb-50 pb-50-md"
+ style="padding-top: 40px !important;padding-bottom:10px !important;">
+ <div class="row">
+ <div class="col-lg-12">
+ <div class="hyper-title">
+ <h4 class="text-uppercase">
+ <s:message code="label.product.related.title"
+ text="Related items" />
+ </h4>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="col-lg-12">
+ <div>
+ <div>
+ <!-- Iterate over featuredItems -->
+ <c:set var="ITEMS" value="${relatedProducts}" scope="request" />
+ <jsp:include
+ page="/pages/shop/templates/generic/sections/productBox.jsp" />
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ </c:if>
+ <c:if test="${requestScope.CONTENT['sideBar']!=null}">
+ <sm:pageContent contentCode="sideBar"/>
+ </c:if>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+</div>
+</div>
+
+<script>
+
+ $(function () {
+
+ $('.popup-img').magnificPopup({type:'image'});
+
+
+ $('.thumbImg').click(function(){
+ var igId = $(this).attr('imgId');
+ var url = $(this).attr('rel');
+ var name = $(this).attr('title');
+ $("#largeImg").html("<img src='" + url + "' /><a href='" + url + "' data-mfp-src='" + url + "' class='popup-img overlay' title='" + name + "'><i class='fa fa-search-plus'></i></a>");
+ //re bind action
+ $('.popup-img').magnificPopup({type:'image'});
+ })
+
+ })
+
+
+
+ </script>
+
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/register.jsp b/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/register.jsp
new file mode 100644
index 0000000..25c915a
--- /dev/null
+++ b/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/register.jsp
@@ -0,0 +1,179 @@
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<link href="<c:url value="/resources/css/assets/bootstrap-social.css" />" rel="stylesheet">
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+
+<!-- requires functions.jsp -->
+<script src="<c:url value="/resources/js/jquery.maskedinput.min.js" />"></script>
+<script src="<c:url value="/resources/js/shop-customer.js" />"></script>
+<script src="<c:url value="/resources/js/address.js" />"></script>
+
+
+<script type="text/javascript">
+
+
+$(document).ready(function() {
+
+
+ getZones($('#registration_country').val(),'<c:out value="${customer.billing.zone}" />',isFormValid);
+ $("#hidden_zones").hide();
+ $("#registration_country").change(function() {
+ getZones($(this).val(),'<c:out value="${customer.billing.zone}" />',isFormValid);
+ })
+
+ isFormValid();
+ $("input[type='text']").on("change keyup paste blur", function(){
+ $("#userName").val($("#emailAddress").val());
+ isFormValid();
+ });
+
+ $("input[type='password']").on("change keyup paste", function(){
+ $("#userName").val($("#emailAddress").val());
+ isFormValid();
+ });
+
+ $("#registration_country").change(function() {
+ $("#userName").val($("#emailAddress").val());
+ isFormValid();
+ });
+
+});
+
+
+function isFormValid() {
+
+ if($('.alert-error').is(":visible")) {
+ return true;
+ }
+
+ if($('.alert-success').is(":visible")) {
+ return true;
+ }
+
+ $('#registrationError').hide();//reset error message
+ var msg = isCustomerFormValid($('#registrationForm'));
+
+ if(msg!=null) {//disable submit button
+ $('#submitRegistration').addClass('btn-disabled');
+ $('#submitRegistration').prop('disabled', true);
+ $('#registrationError').html(msg);
+ $('#registrationError').show();
+ return false;
+ } else {
+ $('#submitRegistration').removeClass('btn-disabled');
+ $('#submitRegistration').prop('disabled', false);
+ $('#registrationError').hide();
+ return true;
+ }
+}
+
+
+
+
+ </script>
+
+<c:set var="register_url" value="${pageContext.request.contextPath}/shop/customer/register.html"/>
+<div id="registrationError" class="alert alert-warning common-row" style="display:none;"></div>
+
+
+ <!-- page-title-wrapper-end -->
+ <!-- contuct-form-area-start -->
+ <div class="login-area ptb-80">
+ <div class="container">
+ <div class="row">
+ <div class=" col-lg-6 col-md-6 col-sm-8 col-xs-12">
+ <div class="login-title">
+ <h3><s:message code="label.register.personal.information" text="Personal information"/></h3>
+ </div>
+ <div class="login-form">
+ <form:form method="post" action="${register_url}" id="registrationForm" commandName="customer">
+ <form:errors path="*" cssClass="alert alert-error alert-danger form-group" element="div" />
+ <div class="form-group login-page">
+ <label for="firstName"><s:message code="label.generic.firstname" text="First Name"/> <span>*</span></label>
+ <s:message code="NotEmpty.customer.firstName" text="First name is required" var="msgFirstName"/>
+ <form:input path="billing.firstName" cssClass="span8 required input form-control form-control-md" id="firstName" title="${msgFirstName}"/>
+ <form:errors path="billing.firstName" cssClass="error" />
+ </div>
+ <div class="form-group login-page">
+ <label for="lastName"><s:message code="label.generic.lastname" text="Last Name"/> <span>*</span></label>
+ <s:message code="NotEmpty.customer.lastName" text="Last name is required" var="msgLastName"/>
+ <form:input path="billing.lastName" cssClass="span8 required form-control form-control-md" id="lastName" title="${msgLastName}"/>
+ <form:errors path="billing.lastName" cssClass="error" />
+ </div>
+ <div class="form-group login-page">
+ <label for="country"><s:message code="label.generic.country" text="Country"/> <span>*</span></label>
+ <form:select path="billing.country" class="form-control form-control-lg" id="registration_country">
+ <form:options items="${countryList}" itemValue="isoCode" itemLabel="name"/>
+ </form:select>
+ </div>
+ <div class="form-group login-page">
+ <label for="stateProvince"><s:message code="label.generic.stateprovince" text="State / Province"/> <span>*</span></label>
+ <s:message code="NotEmpty.customer.billing.stateProvince" text="State / Province is required" var="msgStateProvince"/>
+ <form:select path="billing.zone" id="customer_zones" class="form-control form-control-lg">
+ </form:select>
+ <form:input path="billing.stateProvince" cssClass="span8 required form-control form-control-md" id="hidden_zones" title="${msgStateProvince}"/>
+ </div>
+ <!--
+ <div class="form-group">
+ <div class="checkbox">
+ <label>
+ <input type="checkbox"> Sign Up for Newsletter
+ </label>
+ </div>
+ </div>
+ -->
+ <div class="login-title">
+ <h3><s:message code="label.register.signin.information" text="Sign-in information"/></h3>
+ </div>
+ <div class="form-group login-page">
+ <label for="email"><s:message code="label.generic.email" text="Email address"/> <span>*</span></label>
+ <s:message code="NotEmpty.customer.emailAddress" text="Email address is required" var="msgEmail"/>
+ <form:input path="emailAddress" cssClass="span8 required email form-control form-control-md" id="emailAddress" title="${msgEmail}"/>
+ <form:errors path="emailAddress" cssClass="error" />
+ <form:hidden path="userName" />
+ </div>
+ <div class="form-group login-page">
+ <label for="password"><s:message code="label.generic.password" text="Password"/> <span>*</span></label>
+ <s:message code="message.password.required" text="Password is required" var="msgPassword"/>
+ <form:password path="password" class="span8 required password form-control form-control-md" id="password" title="${msgPassword}"/>
+ <form:errors path="password" cssClass="error" />
+ </div>
+ <div class="form-group login-page">
+ <label for="repeatPassword"><s:message code="label.generic.repeatpassword" text="Repeat password"/> <span>*</span></label>
+ <s:message code="message.password.repeat.required" text="Repeated password is required" var="msgRepeatPassword"/>
+ <form:password path="checkPassword" class="span8 required checkPassword form-control form-control-md" id="passwordAgain" title="${msgRepeatPassword}"/>
+ <form:errors path="checkPassword" cssClass="error" />
+ </div>
+ <button type="submit" class="btn btn-default login-btn"><s:message code="label.register.createaccount" text="Create an account"/></button>
+ </form:form>
+ </div>
+ </div>
+ <div class="col-lg-6 col-md-6 col-sm-4 hidden-xs">
+ <h3 class="short_headline"><span><s:message code="label.register.whyregister" text="Why register?" /></span></h3>
+ <p>
+ <s:message code="label.register.registerreasons" text="Simplify a checkout process by having your information pre-filed, re-order an item from one click and get access to premium information." />
+ </p>
+
+ </div>
+ </div>
+ </div>
+ </div>
+ <!-- contuct-form-area-end -->
+
+
+
+
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/search.jsp b/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/search.jsp
new file mode 100644
index 0000000..3777a68
--- /dev/null
+++ b/sm-shop/src/main/webapp/pages/shop/templates/generic/pages/search.jsp
@@ -0,0 +1,187 @@
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+ <script type="text/html" id="productBoxTemplate">
+{{#products}}
+<div itemscope itemtype="http://schema.org/Enumeration" class="col-md-4 productItem" item-order="{{sortOrder}}" item-name="{{description.name}}" item-price="{{price}}" data-id="{{id}}" class="col-sm-4">
+<div class="box-style-4 white-bg object-non-visible animated object-visible">
+ {{#description.highlights}}
+ <div class="ribbon-wrapper-green">
+ <div class="ribbon-green">
+ {{description.highlights}}
+ </div>
+ </div>
+ {{/description.highlights}}
+ {{^canBePurchased}}
+ <div class="sold-out-box">
+ <span class="sold-out-text"><s:message code="label.soldout" text="Sold out" /></span>
+ </div>
+ {{/canBePurchased}}
+ <div class="product-image">
+ {{#image}}
+ <img class="product-img" src="<c:url value=""/>{{image.imageUrl}}"><a class="overlay" href="<c:url value="/shop/product/" />{{description.friendlyUrl}}.html<sm:breadcrumbParam/>"><img class="product-img" src="<c:url value="/"/>{{image.imageUrl}}"></a>
+ {{/image}}
+ </div>
+ <!-- *** Product Name & Price Starts *** -->
+ <div class="caption">
+ <div class="product-details">
+ <div class="clearfix">
+ <h3 class="product-heading product-name" itemprop="name">{{description.name}}</h3>
+ <h4 class="price">
+ {{#discounted}}<del>{{originalPrice}}</del> <span itemprop="price" class="specialPrice">{{finalPrice}}</span>{{/discounted}}
+ {{^discounted}}<span itemprop="price" class="specialPrice">{{finalPrice}}</span>{{/discounted}}
+ </h4>
+ <!-- Product Name & Price Ends -->
+ <!-- Product Buttons Starts -->
+ <div class="clearfix">
+ <a class="btn btn-default pull-left" href="<c:url value="/shop/product/" />{{description.friendlyUrl}}.html<sm:breadcrumbParam/>" class="details"><s:message code="button.label.view" text="Details" /></a>
+ <c:if test="${requestScope.CONFIGS['allowPurchaseItems'] == true}">
+ {{#canBePurchased}}<a class="btn btn-buy pull-right addToCart" href="javascript:void(0);" class="addToCart" productId="{{id}}"><s:message code="button.label.addToCart" text="Add to cart" /></a>{{/canBePurchased}}
+ </c:if>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+</div>
+{{/products}}
+</script>
+</script>
+
+
+
+ <script>
+
+ var START_COUNT_PRODUCTS = 0;
+ var MAX_PRODUCTS = 18;
+
+
+ $(function(){
+
+ search();
+
+ });
+
+
+
+ function search() {
+ //Invoke search service
+ $('#productsContainer').showLoading();
+ var url = '<%=request.getContextPath()%>/services/public/search/<c:out value="${requestScope.MERCHANT_STORE.code}"/>/<c:out value="${requestScope.LANGUAGE.code}"/>/' + START_COUNT_PRODUCTS + '/' + MAX_PRODUCTS + '/search.json';
+ searchProducts(url,'#productsContainer','<c:out value="${q}"/>',null);
+ }
+
+ //inviked from callback below
+ function buildProductsList(productList) {
+ log('Products-> ' + productList.products.length);
+ var productsTemplate = Hogan.compile(document.getElementById("productBoxTemplate").innerHTML);
+ var productsRendred = productsTemplate.render(productList);
+ $('#productsContainer').append(productsRendred);
+ //$('#hiddenProductsContainer').append(productsRendred);//used for filtering products but no filter in search
+ initBindings();//add to cart etc...
+ }
+
+ //once the list of product is retrieved
+ function callBackSearchProducts(productList) {
+ buildProductsList(productList);
+ totalCount = productList.productCount;
+ START_COUNT_PRODUCTS = START_COUNT_PRODUCTS + MAX_PRODUCTS;
+ if(START_COUNT_PRODUCTS < totalCount) {
+ $("#button_nav").show();
+ } else {
+ $("#button_nav").hide();
+ }
+
+ $('#productsContainer').hideLoading();
+
+
+ var productQty = productList.productCount + ' <s:message code="label.search.items.found" text="item(s) found" />';
+ $('#products-qty').html(productQty);
+
+ //facets
+ if(productList.categoryFacets!=null && productList.categoryFacets.length>0) {
+ $('#categoryLabel').show();
+ for (var i = 0; i < productList.categoryFacets.length; i++) {
+ var categoryFacets = '<li>';
+ categoryFacets = categoryFacets + '<a href="<c:url value="/shop"/>/category/' + productList.categoryFacets[i].description.friendlyUrl + '.html">' + productList.categoryFacets[i].description.name;
+ if(productList.categoryFacets[i].productCount>0) {
+ categoryFacets = categoryFacets + ' <span class="countItems">(' + productList.categoryFacets[i].productCount + ')</span>'
+ }
+ categoryFacets = categoryFacets + '</a>';
+ categoryFacets = categoryFacets + '</li>';
+ $(categoriesFacets).append(categoryFacets);
+ }
+ } else {
+ $('#categoryLabel').hide();
+ }
+
+
+
+ }
+
+
+
+
+</script>
+
+
+ <div id="mainContent" class="container">
+
+
+
+ <div class="bedroom-all-product-area ptb-80">
+ <div class="container">
+ <div class="row">
+ <div class="col-lg-9 col-md-9 col-sm-9 col-xs-12">
+ <!-- category-products-area-start -->
+ <div class="caregory-products-area">
+ <div class="row">
+ <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
+ <div class="product-option">
+ <div class="porduct-option-left floatleft">
+ <strong><div id="products-qty"></div></strong>
+ </div>
+ <div class="product-option-right floatright">
+
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="tab-content category-products">
+ <div class="tab-pane active" id="viewed">
+ <div class="row">
+ <section class="products-grid">
+ <!-- Products here -->
+ <div id="productsContainer" class="list-unstyled"></div>
+ <span id="end_nav" style="display:none;"><s:message code="label.product.nomoreitems" text="No more items to be displayed" /></span>
+ <!-- end block -->
+ <!-- hidden -->
+ <div id="hiddenProductsContainer" style="display:none;"></div>
+ </section>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="col-lg-3 col-md-3 col-sm-3 col-xs-12">
+ <h3 id="categoryLabel"><s:message code="label.categories.title" text="Categories"/></h3>
+ <ul id="categoriesFacets" class="nav nav-list"></ul>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ </div><!-- container -->
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/generic/sections/footer.jsp b/sm-shop/src/main/webapp/pages/shop/templates/generic/sections/footer.jsp
new file mode 100644
index 0000000..289a34b
--- /dev/null
+++ b/sm-shop/src/main/webapp/pages/shop/templates/generic/sections/footer.jsp
@@ -0,0 +1,139 @@
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+ <!-- footer-area-start -->
+ <div class="footer-area ptb-80">
+ <div class="container">
+ <div class="row">
+ <div class="col-lg-4 col-md-4 col-sm-12 col-xs-12 mar_b-30">
+ <div class="footer-wrapper">
+ <c:if test="${requestScope.CONFIGS['displayStoreAddress'] == true}">
+ <ul>
+ <jsp:include page="/pages/shop/common/preBuiltBlocks/storeAddress.jsp"/>
+ <c:if test="${requestScope.CONTENT['contactUsDetails']!=null}">
+ <br/>
+ <sm:pageContent contentCode="contactUsDetails"/>
+ </c:if>
+ </ul>
+ </c:if>
+
+ <c:if test="${requestScope.CONFIGS['facebook_page_url'] != null || requestScope.CONFIGS['twitter_handle'] != null || requestScope.CONFIGS['pinterest'] != null || requestScope.CONFIGS['instagram'] != null}">
+ <ul class="footer-social">
+ <c:if test="${requestScope.CONFIGS['twitter_handle'] != null}">
+ <li class="twitter"><a target="_blank" href="<c:out value="${requestScope.CONFIGS['twitter_handle']}"/>"><i class="fa fa-twitter"></i></a></li>
+ </c:if>
+ <c:if test="${requestScope.CONFIGS['facebook_page_url'] != null}">
+ <li class="facebook"><a target="_blank" href="<c:out value="${requestScope.CONFIGS['facebook_page_url']}"/>"><i class="fa fa-facebook"></i></a></li>
+ </c:if>
+ <c:if test="${requestScope.CONFIGS['pinterest'] != null}">
+ <li class="pinterest"><a target="_blank" href="<c:out value="${requestScope.CONFIGS['pinterest']}"/>"><i class="fa fa-pinterest"></i></a></li>
+ </c:if>
+ <c:if test="${requestScope.CONFIGS['instagram'] != null}">
+ <li class="instagram"><a target="_blank" href="<c:out value="${requestScope.CONFIGS['instagram']}"/>"><i class="fa fa-instagram"></i></a></li>
+ </c:if>
+ </ul>
+ </c:if>
+
+ </div>
+ </div>
+ <!--<div class="col-lg-2 col-md-3 hidden-sm col-xs-12 mar_b-30">-->
+ <div class="col-lg-4 col-md-4 col-sm-12 col-xs-12 mar_b-30">
+ <div class="footer-wrapper">
+ <!--
+ <div class="footer-title">
+ <a href="#"><h3>useful links</h3></a>
+ </div>
+ -->
+ <div class="footer-wrapper">
+ <c:if test="${not empty requestScope.TOP_CATEGORIES}">
+ <ul class="usefull-link">
+ <li class="<sm:activeLink linkCode="HOME" activeReturnCode="active"/>">
+ <a href="<c:url value="/shop"/>"><s:message code="menu.home" text="Home"/></a>
+ </li>
+ <c:forEach items="${requestScope.TOP_CATEGORIES}" var="category">
+ <li>
+ <a href="<c:url value="/shop/category/${category.description.friendlyUrl}.html"/><sm:breadcrumbParam categoryId="${category.id}"/>" class="current">
+ <span class="name">${category.description.name}</span>
+ </a>
+ </li>
+ </c:forEach>
+ <c:forEach items="${requestScope.CONTENT_PAGE}" var="content">
+ <li><a href="<c:url value="/shop/pages/${content.seUrl}.html"/>" class="current">${content.name}</a></li>
+ </c:forEach>
+ <c:if test="${requestScope.CONFIGS['displayContactUs']==true}">
+ <li class="<sm:activeLink linkCode="CONTACT" activeReturnCode="active"/>"><a href="<c:url value="/shop/store/contactus.html"/>"><s:message code="label.customer.contactus" text="Contact us"/></a></li>
+ </c:if>
+ <c:if test="${fn:length(requestScope.MERCHANT_STORE.languages) > 1}">
+ <c:forEach items="${requestScope.MERCHANT_STORE.languages}" var="language">
+ <c:if test="${requestScope.LANGUAGE.code ne language.code}">
+ <li><a href="<c:url value="/shop?locale=${language.code}"/>"><s:message code="lang.${language.code}" text="${language.code}" /></a></li>
+ </c:if>
+ </c:forEach>
+ </c:if>
+ <c:if test="${requestScope.CONFIGS['displayCustomerSection'] == true}">
+ <sec:authorize access="hasRole('AUTH_CUSTOMER') and fullyAuthenticated">
+ <li><a href="<c:url value="/shop/customer/account.html"/>"><s:message code="label.customer.myaccount" text="My account"/></a></li>
+ <li><a href="<c:url value="/shop/customer/logout"/>"><s:message code="button.label.logout" text="Logout"/></a></li>
+ </sec:authorize>
+ <sec:authorize access="!hasRole('AUTH_CUSTOMER') and fullyAuthenticated">
+ <li>
+ <s:message code="label.security.loggedinas" text="You are logged in as"/> [<sec:authentication property="principal.username"/>]. <s:message code="label.security.nologinacces.store" text="We can't display store logon box"/>
+ </li>
+ </sec:authorize>
+ <sec:authorize access="!hasRole('AUTH_CUSTOMER') and !fullyAuthenticated">
+ <li><a href="<c:url value="/shop/customer/registration.html"/>"><s:message code="label.generic.register" text="Register" /></a></li>
+ <li><a href="<c:url value="/shop/customer/customLogon.html"/>"><s:message code="button.label.signin" text="Signin" /></a></li>
+ </sec:authorize>
+ </c:if>
+ </ul>
+ </c:if>
+ </div>
+ </div>
+ </div>
+ <div class="col-lg-4 col-md-4 col-sm-12 col-xs-12">
+ <div class="footer-wrapper">
+ <c:if test="${requestScope.CONTENT['footerImage']!=null}">
+ <div class="footer-logo">
+ <sm:pageContent contentCode="footerImage"/>
+ </div>
+ </c:if>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <!-- footer-area-end -->
+ <!-- .copyright-area-start -->
+ <div class="copyright-area">
+ <div class="container">
+ <div class="row">
+ <div class="col-lg-6 col-md-6 col-sm-6 col-xs-12 mar_b-30">
+ <div class="copyright text-left">
+ <p><sm:storeCopy/> - <s:message code="label.generic.providedby" /> <a href="http://www.shopizer.com" class="footer-href" target="_blank">Shopizer</a></p>
+ </div>
+ </div>
+ <div class="col-lg-6 col-md-6 col-sm-6 col-xs-12">
+ <c:if test="${requestScope.CONFIGS['allowPurchaseItems'] == true}">
+ <div class="copyright-img text-right">
+ <img src="/resources/img/payment/icons/MasterCard.png" width="50" alt="" /> <img src="/resources/img/payment/icons/Visa.png" width="50" alt="" /> <img src="/resources/img/payment/icons/AmericanExpress.png" width="50" alt="" /> <img src="/resources/img/payment/icons/PayPal.png" width="50" alt="" />
+ </div>
+ </c:if>
+ </div>
+ </div>
+ </div>
+ </div>
+ <!-- .copyright-area-end -->
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/generic/sections/header.jsp b/sm-shop/src/main/webapp/pages/shop/templates/generic/sections/header.jsp
new file mode 100644
index 0000000..fb83f78
--- /dev/null
+++ b/sm-shop/src/main/webapp/pages/shop/templates/generic/sections/header.jsp
@@ -0,0 +1,221 @@
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+<%@ taglib uri="/WEB-INF/shopizer-functions.tld" prefix="display" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+<script src="<c:url value="/resources/js/hogan.js" />"></script>
+<script src="<c:url value="/resources/templates/generic/js/bloodhound.min.js" />"></script>
+<script src="<c:url value="/resources/templates/generic/js/typeahead.bundle.min.js" />"></script>
+
+
+<!-- Customer account menu logged in customer will display in customerAccount placeholder -->
+<script type="text/html" id="customerLoggedInAccountTemplate">
+ <ul>
+ <li class="click_menu"><a href="#"><s:message code="label.generic.welcome" text="Welcome" /> <span>{{firstName}}</span><i class="fa fa-angle-down"></i></a>
+ <ul class="click_menu_show">
+ <li><a href="#" onClick="javascript:location.href='<c:url value="/shop/customer/dashboard.html" />';" href="#"><s:message code="label.customer.myaccount" text="My account"/></a></li>
+ <li><a href="#" onClick="javascript:location.href='<c:url value="/shop/customer/logout" />';" href="#"><s:message code="button.label.logout" text="Logout"/></a></li>
+ </ul>
+ </li>
+ </ul>
+ <script type="text/javascript">
+ (function($) {
+ $(".click_menu").on('click', function() {
+ $(".click_menu_show").slideToggle(400)
+ });
+ })(jQuery);
+ </script>
+</script>
+
+<!-- Customer account menu not logged in customer will display in customerAccount placeholder -->
+<script type="text/html" id="customerNotLoggedInAccountTemplate">
+ <ul>
+ <li class="click_menu"><a href="#"><s:message code="label.customer.myaccount" text="My Account"/><i class="fa fa-angle-down"></i></a>
+ <ul class="click_menu_show">
+ <li><a href="#" id="registerLink" onClick="javascript:location.href='<c:url value="/shop/customer/registration.html" />';"><s:message code="label.generic.register" text="Register" /></a></li>
+ <li><a href="#" id="registerLink" onClick="javascript:location.href='<c:url value="/shop/customer/customLogon.html" />';"><s:message code="button.label.signin" text="Signin" /></a></li>
+ </ul>
+ </li>
+ </ul>
+ <script type="text/javascript">
+ (function($) {
+ $(".click_menu").on('click', function() {
+ $(".click_menu_show").slideToggle(400)
+ });
+ })(jQuery);
+ </script>
+</script>
+
+<!-- Mini shopping cart JS template -->
+<script type="text/html" id="miniCartTemplate">
+ {{#code}}
+ {{#shoppingCartItems}}
+ <li>
+ <div class="cart-img">
+ {{#image}}
+ <img src="<c:out value="${pageContext.servletContext.contextPath}" />{{image}}">
+ {{/image}}
+ {{^image}}
+  
+ {{/image}}
+ </div>
+ <div class="cart-content">
+ <h4><a href="#">{{quantity}} x {{name}}</a></h4>
+ <span class="cart-price">{{price}}</span>
+ </div>
+ <div class="cart-del">
+ <button productid="{{productId}}" class="close removeProductIcon" onclick="removeItemFromMinicart('{{id}}')"><i class="fa fa-times-circle"></i></a>
+ </div>
+ </li>
+ {{/shoppingCartItems}}
+ <li> </li>
+ <li class="total-price"><s:message code="label.order.total" text="Total" /> {{total}}</li>
+ <li class="checkout-bg">
+ <a href="#" onclick="viewShoppingCartPage();"><s:message code="label.checkout" text="Checkout"/><i class="fa fa-angle-right"></i></a>
+ </li>
+ {{/code}}
+ {{^code}}
+ <h4 style="text-align: center;color:#666666;margin-top:10px;margin-bottom:10px;"><s:message code="label.emptycart" text="Your Shopping cart is empty" /></h4>
+ {{/code}}
+
+</script>
+
+<!-- mini cart label button template -->
+<script type="text/html" id="miniCartSummaryTemplate">
+ <!-- empty cart and full summary subTotal & quantity -->
+ {{^code}}
+ <a href="#"><span class="lnr lnr-cart"></span><s:message code="label.cart" text="Shopping cart"/> (0)</a>
+ {{/code}}
+ {{#code}}
+ <a href="#"><span class="lnr lnr-cart"></span><s:message code="label.cart" text="Shopping cart"/> <font color="red"><strong>({{quantity}})</strong></font></a>
+ {{/code}}
+</script>
+
+
+<!-- header-start -->
+ <header>
+ <div class="header-top-area ptb-10 hidden-xs">
+ <div class="container">
+ <div class="row">
+ <div class="col-lg-9 col-md-8 col-sm-8">
+ <c:if test="${fn:length(requestScope.MERCHANT_STORE.languages) > 1}">
+ <div class="dropdown header-left-menu">
+ <c:forEach items="${requestScope.MERCHANT_STORE.languages}" var="language">
+ <c:if test="${requestScope.LANGUAGE.code ne language.code}">
+ <a href="<c:url value="/shop?locale=${language.code}"/>"><s:message code="lang.${language.code}" text="${language.code}" /></a>
+ </c:if>
+ </c:forEach>
+ </div>
+ </c:if>
+ <c:if test="${requestScope.CONFIGS['displayCustomerSection'] == true}">
+ <!-- placeholder for customer account -->
+ <div class="header-top-left" id="customerAccount" style="margin-left:20px;"></div>
+ </c:if>
+ <c:if test="${requestScope.CONFIGS['displayContactUs']==true}">
+ <button class="btn btn-default header-left-menu type="button" onClick="javascript:location.href='<c:url value="/shop/store/contactus.html"/>';" aria-haspopup="true" aria-expanded="true">
+ <a href="<c:url value="/shop/store/contactus.html"/>"><s:message code="label.customer.contactus" text="Contact us"/></a>
+ </button>
+ </c:if>
+ </div>
+ <div class="col-lg-3 col-md-4 col-sm-4">
+ <div class="header-top-right">
+ <!-- Empty placeholder -->
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="header-bottom-area ptb-10">
+ <div class="container">
+ <div class="row">
+ <div class="col-lg-4 col-md-2 col-sm-3 col-xs-12">
+ <!-- logo -->
+ <div class="logo">
+ <c:choose>
+ <c:when test="${requestScope.CONTENT['logo']!=null}">
+ <!-- A content logo exist -->
+ <sm:pageContent contentCode="logo"/>
+ </c:when>
+ <c:otherwise>
+ <c:choose>
+ <c:when test="${not empty requestScope.MERCHANT_STORE.storeLogo}">
+ <!-- use merchant store logo -->
+ <a class="grey store-name" href="<c:url value="/shop/"/>">
+ <img class="logoImage" src="<sm:storeLogo/>"/>
+ </a>
+ </c:when>
+ <c:otherwise>
+ <!-- Use store name -->
+ <h1>
+ <a class="grey store-name" href="<c:url value="/shop/"/>">
+ <c:out value="${requestScope.MERCHANT_STORE.storename}"/>
+ </a>
+ </h1>
+ </c:otherwise>
+ </c:choose>
+ </c:otherwise>
+ </c:choose>
+ </div>
+ </div>
+ <div class="col-lg-4 col-md-5 hidden-sm hidden-xs">
+
+ <c:if test="${requestScope.CONTENT['headerMessage']!=null}">
+ <!-- A content logo exist -->
+ <sm:pageContent contentCode="headerMessage"/>
+ </c:if>
+
+ <!--
+ <div class="single-header-bottom-info">
+ <div class="header-bottom-icon">
+ <span class="lnr lnr-rocket"></span>
+ </div>
+ <div class="header-bottom-text">
+ </div>
+ </div>
+ -->
+ </div>
+ <div class="col-lg-4 col-md-4 col-sm-9 col-xs-12">
+ <!-- search box -->
+ <c:if test="${requestScope.CONFIGS['displaySearchBox'] == true}">
+
+ <div class="input-group menu-search-box">
+ <input type="text" class="form-control typeahead" type="search" name="q" id="searchField" placeholder="<s:message code="label.generic.search" text="Search"/>" value="" />
+ <span class="input-group-btn">
+ <button class="btn btn-default searchButton" type="submit"><s:message code="label.generic.search" text="Search"/></button>
+ </span>
+ <!-- important for submitting search -->
+ <form id="hiddenSearchForm" method="post" action="<c:url value="/shop/search/search.html"/>">
+ <input type="hidden" id="hiddenQuery" name="q">
+ </form>
+ </div>
+
+
+ </c:if>
+ <!-- Shopping cart -->
+ <c:if test="${requestScope.CONFIGS['allowPurchaseItems'] == true}">
+ <div class="header-bottom-right">
+ <div class="shop-cart" id="miniCartSummary"></div>
+ <div class="shop-cart-hover fix">
+ <ul id="miniCartDetails"></ul>
+ </div>
+ </div>
+ </c:if>
+ </div>
+ </div>
+ </div>
+ </div>
+ </header>
+ <!-- header-end -->
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/generic/sections/jsLinks.jsp b/sm-shop/src/main/webapp/pages/shop/templates/generic/sections/jsLinks.jsp
new file mode 100644
index 0000000..89a92f8
--- /dev/null
+++ b/sm-shop/src/main/webapp/pages/shop/templates/generic/sections/jsLinks.jsp
@@ -0,0 +1,52 @@
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+ <!-- specific js files -->
+ <!-- do only change the list of js files -->
+ <!-- ////////////// -->
+
+
+
+ <script src="<c:url value="/resources/templates/generic/js/bootstrap.min.js" />"></script>
+ <script src="<c:url value="/resources/templates/generic/js/owl.carousel.min.js" />"></script>
+ <script src="<c:url value="/resources/templates/generic/js/jquery.meanmenu.js" />"></script>
+ <script src="<c:url value="/resources/templates/generic/js/jquery-ui.min.js" />"></script>
+ <script src="<c:url value="/resources/templates/generic/js/slippry.min.js" />"></script>
+ <script src="<c:url value="/resources/templates/generic/js/wow.min.js" />"></script>
+ <script src="<c:url value="/resources/templates/generic/js/jquery.scrolly.js" />"></script>
+ <script src="<c:url value="/resources/templates/generic/js/loadingoverlay.min.js" />"></script>
+
+
+ <script src="<c:url value="/resources/templates/generic/js/jquery.magnific-popup.min.js" />"></script>
+ <script src="<c:url value="/resources/templates/generic/js/plugins.js" />"></script>
+
+
+
+
+ <script src="<c:url value="/resources/templates/generic/js/main.js" />"></script>
+
+
+
+ <!-- required common scripts for shopizer -->
+ <script src="<c:url value="/resources/js/jquery.raty.min.js" />"></script>
+ <script src="<c:url value="/resources/js/shop-functions.js" />"></script>
+ <script src="<c:url value="/resources/js/shop-customer.js" />"></script>
+ <jsp:include page="/resources/js/functions.jsp" />
+ <script src="<c:url value="/resources/js/json2.js" />"></script>
+ <script src="<c:url value="/resources/js/jquery-cookie.js" />"></script>
+ <script src="<c:url value="/resources/js/shop-minicart.js" />"></script>
+ <script src="<c:url value="/resources/js/shop-account.js" />"></script>
+ <script src="<c:url value="/resources/js/login.js" />"></script>
+ <script src="<c:url value="/resources/js/jquery.showLoading.min.js" />"></script>
+
+
+ <!-- ////////////// -->
+
+
+
+
+
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/generic/sections/navbar.jsp b/sm-shop/src/main/webapp/pages/shop/templates/generic/sections/navbar.jsp
new file mode 100644
index 0000000..a13d2df
--- /dev/null
+++ b/sm-shop/src/main/webapp/pages/shop/templates/generic/sections/navbar.jsp
@@ -0,0 +1,164 @@
+
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm"%>
+<%@ taglib uri="/WEB-INF/shopizer-functions.tld" prefix="display"%>
+
+
+<c:set var="req" value="${request}" />
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+
+<script type="text/javascript">
+//***** Search code *****
+$(document).ready(function() {
+
+ //post search form
+ $(".searchButton").click(function(e){
+ var searchQuery = $('#searchField').val();
+ var q = searchQuery;
+ if(q==null || q =='') {
+ return;
+ }
+ $('#hiddenQuery').val(q);
+ //log('Search string : ' + searchQuery);
+ var uri = '<c:url value="/shop/search/search.html"/>?q=' + q;
+ var res = encodeURI(uri);
+ e.preventDefault();//action url will be overriden
+ $('#hiddenSearchForm').attr('action',res).submit();
+ });
+
+
+
+
+ var searchElements = new Bloodhound({
+ datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
+ queryTokenizer: Bloodhound.tokenizers.whitespace,
+ <c:if test="${requestScope.CONFIGS['useDefaultSearchConfig'][requestScope.LANGUAGE.code]==true}">
+ <c:if test="${requestScope.CONFIGS['defaultSearchConfigPath'][requestScope.LANGUAGE.code]!=null}">
+ prefetch: '<c:out value="${requestScope.CONFIGS['defaultSearchConfigPath'][requestScope.LANGUAGE.code]}"/>',
+ </c:if>
+ </c:if>
+ remote: {
+ url: '<c:url value="/services/public/search/${requestScope.MERCHANT_STORE.code}/${requestScope.LANGUAGE.code}/autocomplete.json"/>?q=%QUERY',
+ filter: function (parsedResponse) {
+ // parsedResponse is the array returned from your backend
+ console.log(parsedResponse);
+
+ // do whatever processing you need here
+ return JSON.parse(parsedResponse);
+ }
+ }
+ });
+
+ searchElements.initialize();
+
+
+ var searchTemplate = Hogan.compile([
+ '<p class="suggestion-text"><font color="black">{{value}}</font></p>'
+ ].join(''));
+
+
+ //full view search
+ $('#searchField.typeahead').typeahead({
+ hint: true,
+ highlight: true,
+ minLength: 1
+ }, {
+ name: 'shopizer-search',
+ displayKey: 'value',
+ source: searchElements.ttAdapter(),
+ templates: {
+ suggestion: function (data) { return searchTemplate.render(data); }
+ }
+ });
+
+ //responsive
+ $('#responsiveSearchField.typeahead').typeahead({
+ hint: true,
+ highlight: true,
+ minLength: 1
+ }, {
+ name: 'modal-shopizer-search',
+ displayKey: 'value',
+ source: searchElements.ttAdapter(),
+ templates: {
+ suggestion: function (data) { return searchTemplate.render(data); }
+ }
+ });
+
+});
+
+</script>
+
+
+<!-- mainmenu-area-start -->
+ <div class="mainmenu-area bg-color-1" id="main_h">
+ <div class="container">
+ <div class="row">
+ <div class="col-lg-12 col-md-12 col-sm-12 hidden-xs">
+ <div class="mainmenu hidden-xs">
+ <nav>
+ <ul>
+ <c:set var="code" value="${category.code}"/>
+ <c:forEach items="${requestScope.TOP_CATEGORIES}" var="category">
+ <li class="<sm:activeLink linkCode="${category.description.friendlyUrl}" activeReturnCode="active"/>"><a href="<c:url value="/shop/category/${category.description.friendlyUrl}.html"/><sm:breadcrumbParam categoryId="${category.id}"/>"><c:out value="${category.description.name}"/></a>
+ <c:if test="${fn:length(category.children)>0}">
+ <ul>
+ <c:forEach items="${category.children}" var="child">
+ <li><a href="<c:url value="/shop/category/${child.description.friendlyUrl}.html"/><sm:breadcrumbParam categoryId="${child.id}"/>"><c:out value="${child.description.name}"/></a></li>
+ </c:forEach>
+ </ul>
+ </c:if>
+ </li>
+ </c:forEach>
+ <c:forEach items="${requestScope.CONTENT_PAGE}" var="content">
+ <c:if test="${content.content.linkToMenu}">
+ <li><a href="<c:url value="/shop/pages/${content.seUrl}.html"/>" class="current">${content.name}</a></li>
+ </c:if>
+ </c:forEach>
+ </ul>
+ </nav>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <!-- mobile menu -->
+ <div class="mobile-menu-area hidden-sm hidden-md hidden-lg">
+ <div class="container">
+ <div class="row">
+ <div class="col-md-12">
+ <div class="mobile-menu">
+ <nav id="mobile-menu">
+ <ul>
+ <c:set var="code" value="${category.code}"/>
+ <c:forEach items="${requestScope.TOP_CATEGORIES}" var="category">
+ <li class="<sm:activeLink linkCode="${category.description.friendlyUrl}" activeReturnCode="active"/>"><a href="<c:url value="/shop/category/${category.description.friendlyUrl}.html"/><sm:breadcrumbParam categoryId="${category.id}"/>"><c:out value="${category.description.name}"/></a>
+ <c:if test="${fn:length(category.children)>0}">
+ <ul>
+ <c:forEach items="${category.children}" var="child">
+ <li><a href="<c:url value="/shop/category/${child.description.friendlyUrl}.html"/><sm:breadcrumbParam categoryId="${child.id}"/>"><c:out value="${child.description.name}"/></a></li>
+ </c:forEach>
+ </ul>
+ </c:if>
+ </li>
+ </c:forEach>
+ </ul>
+ </nav>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <!-- mainmenu-area-end -->
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/generic/sections/productBox.jsp b/sm-shop/src/main/webapp/pages/shop/templates/generic/sections/productBox.jsp
new file mode 100644
index 0000000..af4c2ad
--- /dev/null
+++ b/sm-shop/src/main/webapp/pages/shop/templates/generic/sections/productBox.jsp
@@ -0,0 +1,38 @@
+<%
+response.setCharacterEncoding("UTF-8");
+response.setHeader("Cache-Control","no-cache");
+response.setHeader("Pragma","no-cache");
+response.setDateHeader ("Expires", -1);
+%>
+
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+<%@ taglib uri="/WEB-INF/shopizer-tags.tld" prefix="sm" %>
+
+<%@page contentType="text/html"%>
+<%@page pageEncoding="UTF-8"%>
+ <c:forEach items="${requestScope.ITEMS}" var="product">
+ <div class="single-new-product single-new-product-override">
+ <div class="product-img">
+ <c:if test="${product.image!=null}"><a href="<c:url value="/shop/product/" /><c:out value="${product.description.friendlyUrl}"/>.html"><img src="<sm:shopProductImage imageName="${product.image.imageName}" sku="${product.sku}"/>" class="first_img"/></a></c:if>
+ </div>
+ <div class="product-content text-center">
+ <h3>${product.description.name}</h3>
+ <h4><c:choose>
+ <c:when test="${product.discounted}">
+ <del><c:out value="${product.originalPrice}" /></del> <span class="specialPrice"><c:out value="${product.finalPrice}" /></span>
+ </c:when>
+ <c:otherwise>
+ <c:out value="${product.finalPrice}" />
+ </c:otherwise>
+ </c:choose>
+ </h4>
+ <br>
+ <h5>
+ <a href="<c:url value="/shop/product/" /><c:out value="${product.description.friendlyUrl}"/>.html<sm:breadcrumbParam productId="${product.id}"/>"><s:message code="button.label.view" text="Details" /></a> <c:choose><c:when test="${requestScope.FEATURED==true}"><c:if test="${requestScope.CONFIGS['displayAddToCartOnFeaturedItems']==true}">/ <a class="addToCart" href="#" productId="${product.id}"><s:message code="button.label.addToCart" text="Add to cart" /></a></c:if></c:when><c:otherwise>/ <a class="addToCart" href="#" productId="${product.id}"><s:message code="button.label.addToCart" text="Add to cart" /></a></c:otherwise></c:choose>
+ </h5>
+ </div>
+ </div>
+ </c:forEach>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/pages/shop/templates/generic/sections/shopLinks.jsp b/sm-shop/src/main/webapp/pages/shop/templates/generic/sections/shopLinks.jsp
new file mode 100644
index 0000000..eb93137
--- /dev/null
+++ b/sm-shop/src/main/webapp/pages/shop/templates/generic/sections/shopLinks.jsp
@@ -0,0 +1,96 @@
+<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
+<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
+<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
+<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
+
+<%@ page session="false" %>
+
+ <link href="https://fonts.googleapis.com/css?family=Lato:300,400,700,900" rel="stylesheet">
+
+
+ <!-- CORE CSS -->
+ <link href="<c:url value="/resources/templates/generic/css/bootstrap.min.css" />" rel="stylesheet" type="text/css">
+
+ <!-- more fonts, cursor up -->
+ <link href="<c:url value="/resources/templates/generic/css/animate.css" />" rel="stylesheet" type="text/css">
+ <link href="<c:url value="/resources/templates/generic/css/slippry.css" />" rel="stylesheet" type="text/css">
+ <link href="<c:url value="/resources/templates/generic/css/jquery-ui.min.css" />" rel="stylesheet" type="text/css">
+
+
+ <link href="<c:url value="/resources/templates/generic/css/meanmenu.min.css" />" rel="stylesheet" type="text/css">
+ <link href="<c:url value="/resources/templates/generic/css/magnific-popup.css" />" rel="stylesheet" type="text/css">
+ <link href="<c:url value="/resources/templates/generic/css/magnific-popup.css" />" rel="stylesheet" type="text/css">
+ <link href="<c:url value="/resources/templates/generic/css/owl.carousel.css" />" rel="stylesheet" type="text/css">
+ <link href="<c:url value="/resources/templates/generic/css/linearicons-icon-font.min.css" />" rel="stylesheet" type="text/css">
+ <link href="<c:url value="/resources/templates/generic/css/font-awesome.min.css" />" rel="stylesheet" type="text/css">
+
+
+ <link rel="icon" href="<c:url value="/resources/templates/generic/img/favicon.ico"/>">
+
+ <!-- Theme -->
+
+ <link href="<c:url value="/resources/templates/generic/css/style.css" />" rel="stylesheet" type="text/css">
+ <link href="<c:url value="/resources/templates/generic/css/template.css" />" rel="stylesheet" type="text/css">
+ <link href="<c:url value="/resources/templates/generic/css/responsive.css" />" rel="stylesheet" type="text/css">
+
+ <script src="<c:url value="/resources/templates/generic/js/vendor/modernizr-2.8.3.min.js" />"></script>
+ <script src="<c:url value="/resources/templates/generic/js/vendor/jquery-1.12.0.min.js" />"></script>
+
+ <!-- generic and common css file -->
+ <link href="<c:url value="/resources/css/sm.css" />" rel="stylesheet">
+ <link href="<c:url value="/resources/css/showLoading.css" />" rel="stylesheet">
+
+
+ <script type="text/javascript">
+ //show overlay wait
+ function showTemplateLoading(element) {
+ $.LoadingOverlay("show");
+ }
+
+ function hideTemplateLoading(element) {
+ $.LoadingOverlay("hide", true);
+ }
+
+ </script>
+
+ <!-- ////////////// -->
+
+ <!-- mini shopping cart template -->
+ <script type="text/html" id="miniShoppingCartTemplate">
+ {{#shoppingCartItems}}
+ <tr id="{{productId}}" class="cart-product">
+ <td>
+ {{#image}}
+ <img width="40" src="{{contextPath}}{{image}}">
+ {{/image}}
+ {{^image}}
+  
+ {{/image}}
+ </td>
+ <td>{{quantity}}</td>
+ <td>{{name}}</td>
+ <td>{{price}}</td>
+ <td><button productid="{{productId}}" class="close removeProductIcon" onclick="removeItemFromMinicart('{{id}}')">x</button></td>
+ </tr>
+ {{/shoppingCartItems}}
+ </script>
+
+ <c:if test="${requestScope.CONFIGS['google_analytics_url'] != null}">
+ <!-- Google analytics -->
+ <script type="text/javascript">
+ //<![CDATA[
+ <!-- google analytics -->
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', '<c:out value="${requestScope.CONFIGS['google_analytics_url']}"/>']);
+ _gaq.push(['_trackPageview']);
+
+ (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);
+ })();
+ //]]>
+ </script>
+ </c:if>
+
+
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/resources/css/assets/bootstrap-social.css b/sm-shop/src/main/webapp/resources/css/assets/bootstrap-social.css
new file mode 100644
index 0000000..93e16f7
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/css/assets/bootstrap-social.css
@@ -0,0 +1,147 @@
+/*
+ * Social Buttons for Bootstrap
+ *
+ * Copyright 2013-2016 Panayiotis Lipiridis
+ * Licensed under the MIT License
+ *
+ * https://github.com/lipis/bootstrap-social
+ */
+
+.btn-social{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.btn-social>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}
+.btn-social.btn-lg{padding-left:61px}.btn-social.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}
+.btn-social.btn-sm{padding-left:38px}.btn-social.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}
+.btn-social.btn-xs{padding-left:30px}.btn-social.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}
+.btn-social-icon{position:relative;padding-left:44px;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;height:34px;width:34px;padding:0}.btn-social-icon>:first-child{position:absolute;left:0;top:0;bottom:0;width:32px;line-height:34px;font-size:1.6em;text-align:center;border-right:1px solid rgba(0,0,0,0.2)}
+.btn-social-icon.btn-lg{padding-left:61px}.btn-social-icon.btn-lg>:first-child{line-height:45px;width:45px;font-size:1.8em}
+.btn-social-icon.btn-sm{padding-left:38px}.btn-social-icon.btn-sm>:first-child{line-height:28px;width:28px;font-size:1.4em}
+.btn-social-icon.btn-xs{padding-left:30px}.btn-social-icon.btn-xs>:first-child{line-height:20px;width:20px;font-size:1.2em}
+.btn-social-icon>:first-child{border:none;text-align:center;width:100% !important}
+.btn-social-icon.btn-lg{height:45px;width:45px;padding-left:0;padding-right:0}
+.btn-social-icon.btn-sm{height:30px;width:30px;padding-left:0;padding-right:0}
+.btn-social-icon.btn-xs{height:22px;width:22px;padding-left:0;padding-right:0}
+.btn-adn{color:#fff;background-color:#d87a68;border-color:rgba(0,0,0,0.2)}.btn-adn:focus,.btn-adn.focus{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}
+.btn-adn:hover{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}
+.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{color:#fff;background-color:#ce563f;border-color:rgba(0,0,0,0.2)}.btn-adn:active:hover,.btn-adn.active:hover,.open>.dropdown-toggle.btn-adn:hover,.btn-adn:active:focus,.btn-adn.active:focus,.open>.dropdown-toggle.btn-adn:focus,.btn-adn:active.focus,.btn-adn.active.focus,.open>.dropdown-toggle.btn-adn.focus{color:#fff;background-color:#b94630;border-color:rgba(0,0,0,0.2)}
+.btn-adn:active,.btn-adn.active,.open>.dropdown-toggle.btn-adn{background-image:none}
+.btn-adn.disabled:hover,.btn-adn[disabled]:hover,fieldset[disabled] .btn-adn:hover,.btn-adn.disabled:focus,.btn-adn[disabled]:focus,fieldset[disabled] .btn-adn:focus,.btn-adn.disabled.focus,.btn-adn[disabled].focus,fieldset[disabled] .btn-adn.focus{background-color:#d87a68;border-color:rgba(0,0,0,0.2)}
+.btn-adn .badge{color:#d87a68;background-color:#fff}
+.btn-bitbucket{color:#fff;background-color:#205081;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:focus,.btn-bitbucket.focus{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}
+.btn-bitbucket:hover{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}
+.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{color:#fff;background-color:#163758;border-color:rgba(0,0,0,0.2)}.btn-bitbucket:active:hover,.btn-bitbucket.active:hover,.open>.dropdown-toggle.btn-bitbucket:hover,.btn-bitbucket:active:focus,.btn-bitbucket.active:focus,.open>.dropdown-toggle.btn-bitbucket:focus,.btn-bitbucket:active.focus,.btn-bitbucket.active.focus,.open>.dropdown-toggle.btn-bitbucket.focus{color:#fff;background-color:#0f253c;border-color:rgba(0,0,0,0.2)}
+.btn-bitbucket:active,.btn-bitbucket.active,.open>.dropdown-toggle.btn-bitbucket{background-image:none}
+.btn-bitbucket.disabled:hover,.btn-bitbucket[disabled]:hover,fieldset[disabled] .btn-bitbucket:hover,.btn-bitbucket.disabled:focus,.btn-bitbucket[disabled]:focus,fieldset[disabled] .btn-bitbucket:focus,.btn-bitbucket.disabled.focus,.btn-bitbucket[disabled].focus,fieldset[disabled] .btn-bitbucket.focus{background-color:#205081;border-color:rgba(0,0,0,0.2)}
+.btn-bitbucket .badge{color:#205081;background-color:#fff}
+.btn-dropbox{color:#fff;background-color:#1087dd;border-color:rgba(0,0,0,0.2)}.btn-dropbox:focus,.btn-dropbox.focus{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}
+.btn-dropbox:hover{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}
+.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{color:#fff;background-color:#0d6aad;border-color:rgba(0,0,0,0.2)}.btn-dropbox:active:hover,.btn-dropbox.active:hover,.open>.dropdown-toggle.btn-dropbox:hover,.btn-dropbox:active:focus,.btn-dropbox.active:focus,.open>.dropdown-toggle.btn-dropbox:focus,.btn-dropbox:active.focus,.btn-dropbox.active.focus,.open>.dropdown-toggle.btn-dropbox.focus{color:#fff;background-color:#0a568c;border-color:rgba(0,0,0,0.2)}
+.btn-dropbox:active,.btn-dropbox.active,.open>.dropdown-toggle.btn-dropbox{background-image:none}
+.btn-dropbox.disabled:hover,.btn-dropbox[disabled]:hover,fieldset[disabled] .btn-dropbox:hover,.btn-dropbox.disabled:focus,.btn-dropbox[disabled]:focus,fieldset[disabled] .btn-dropbox:focus,.btn-dropbox.disabled.focus,.btn-dropbox[disabled].focus,fieldset[disabled] .btn-dropbox.focus{background-color:#1087dd;border-color:rgba(0,0,0,0.2)}
+.btn-dropbox .badge{color:#1087dd;background-color:#fff}
+.btn-facebook{color:#fff;background-color:#3b5998;border-color:rgba(0,0,0,0.2)}.btn-facebook:focus,.btn-facebook.focus{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}
+.btn-facebook:hover{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}
+.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{color:#fff;background-color:#2d4373;border-color:rgba(0,0,0,0.2)}.btn-facebook:active:hover,.btn-facebook.active:hover,.open>.dropdown-toggle.btn-facebook:hover,.btn-facebook:active:focus,.btn-facebook.active:focus,.open>.dropdown-toggle.btn-facebook:focus,.btn-facebook:active.focus,.btn-facebook.active.focus,.open>.dropdown-toggle.btn-facebook.focus{color:#fff;background-color:#23345a;border-color:rgba(0,0,0,0.2)}
+.btn-facebook:active,.btn-facebook.active,.open>.dropdown-toggle.btn-facebook{background-image:none}
+.btn-facebook.disabled:hover,.btn-facebook[disabled]:hover,fieldset[disabled] .btn-facebook:hover,.btn-facebook.disabled:focus,.btn-facebook[disabled]:focus,fieldset[disabled] .btn-facebook:focus,.btn-facebook.disabled.focus,.btn-facebook[disabled].focus,fieldset[disabled] .btn-facebook.focus{background-color:#3b5998;border-color:rgba(0,0,0,0.2)}
+.btn-facebook .badge{color:#3b5998;background-color:#fff}
+.btn-flickr{color:#fff;background-color:#ff0084;border-color:rgba(0,0,0,0.2)}.btn-flickr:focus,.btn-flickr.focus{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}
+.btn-flickr:hover{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}
+.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{color:#fff;background-color:#cc006a;border-color:rgba(0,0,0,0.2)}.btn-flickr:active:hover,.btn-flickr.active:hover,.open>.dropdown-toggle.btn-flickr:hover,.btn-flickr:active:focus,.btn-flickr.active:focus,.open>.dropdown-toggle.btn-flickr:focus,.btn-flickr:active.focus,.btn-flickr.active.focus,.open>.dropdown-toggle.btn-flickr.focus{color:#fff;background-color:#a80057;border-color:rgba(0,0,0,0.2)}
+.btn-flickr:active,.btn-flickr.active,.open>.dropdown-toggle.btn-flickr{background-image:none}
+.btn-flickr.disabled:hover,.btn-flickr[disabled]:hover,fieldset[disabled] .btn-flickr:hover,.btn-flickr.disabled:focus,.btn-flickr[disabled]:focus,fieldset[disabled] .btn-flickr:focus,.btn-flickr.disabled.focus,.btn-flickr[disabled].focus,fieldset[disabled] .btn-flickr.focus{background-color:#ff0084;border-color:rgba(0,0,0,0.2)}
+.btn-flickr .badge{color:#ff0084;background-color:#fff}
+.btn-foursquare{color:#fff;background-color:#f94877;border-color:rgba(0,0,0,0.2)}.btn-foursquare:focus,.btn-foursquare.focus{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}
+.btn-foursquare:hover{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}
+.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{color:#fff;background-color:#f71752;border-color:rgba(0,0,0,0.2)}.btn-foursquare:active:hover,.btn-foursquare.active:hover,.open>.dropdown-toggle.btn-foursquare:hover,.btn-foursquare:active:focus,.btn-foursquare.active:focus,.open>.dropdown-toggle.btn-foursquare:focus,.btn-foursquare:active.focus,.btn-foursquare.active.focus,.open>.dropdown-toggle.btn-foursquare.focus{color:#fff;background-color:#e30742;border-color:rgba(0,0,0,0.2)}
+.btn-foursquare:active,.btn-foursquare.active,.open>.dropdown-toggle.btn-foursquare{background-image:none}
+.btn-foursquare.disabled:hover,.btn-foursquare[disabled]:hover,fieldset[disabled] .btn-foursquare:hover,.btn-foursquare.disabled:focus,.btn-foursquare[disabled]:focus,fieldset[disabled] .btn-foursquare:focus,.btn-foursquare.disabled.focus,.btn-foursquare[disabled].focus,fieldset[disabled] .btn-foursquare.focus{background-color:#f94877;border-color:rgba(0,0,0,0.2)}
+.btn-foursquare .badge{color:#f94877;background-color:#fff}
+.btn-github{color:#fff;background-color:#444;border-color:rgba(0,0,0,0.2)}.btn-github:focus,.btn-github.focus{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}
+.btn-github:hover{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}
+.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{color:#fff;background-color:#2b2b2b;border-color:rgba(0,0,0,0.2)}.btn-github:active:hover,.btn-github.active:hover,.open>.dropdown-toggle.btn-github:hover,.btn-github:active:focus,.btn-github.active:focus,.open>.dropdown-toggle.btn-github:focus,.btn-github:active.focus,.btn-github.active.focus,.open>.dropdown-toggle.btn-github.focus{color:#fff;background-color:#191919;border-color:rgba(0,0,0,0.2)}
+.btn-github:active,.btn-github.active,.open>.dropdown-toggle.btn-github{background-image:none}
+.btn-github.disabled:hover,.btn-github[disabled]:hover,fieldset[disabled] .btn-github:hover,.btn-github.disabled:focus,.btn-github[disabled]:focus,fieldset[disabled] .btn-github:focus,.btn-github.disabled.focus,.btn-github[disabled].focus,fieldset[disabled] .btn-github.focus{background-color:#444;border-color:rgba(0,0,0,0.2)}
+.btn-github .badge{color:#444;background-color:#fff}
+.btn-google{color:#fff;background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}.btn-google:focus,.btn-google.focus{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}
+.btn-google:hover{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}
+.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{color:#fff;background-color:#c23321;border-color:rgba(0,0,0,0.2)}.btn-google:active:hover,.btn-google.active:hover,.open>.dropdown-toggle.btn-google:hover,.btn-google:active:focus,.btn-google.active:focus,.open>.dropdown-toggle.btn-google:focus,.btn-google:active.focus,.btn-google.active.focus,.open>.dropdown-toggle.btn-google.focus{color:#fff;background-color:#a32b1c;border-color:rgba(0,0,0,0.2)}
+.btn-google:active,.btn-google.active,.open>.dropdown-toggle.btn-google{background-image:none}
+.btn-google.disabled:hover,.btn-google[disabled]:hover,fieldset[disabled] .btn-google:hover,.btn-google.disabled:focus,.btn-google[disabled]:focus,fieldset[disabled] .btn-google:focus,.btn-google.disabled.focus,.btn-google[disabled].focus,fieldset[disabled] .btn-google.focus{background-color:#dd4b39;border-color:rgba(0,0,0,0.2)}
+.btn-google .badge{color:#dd4b39;background-color:#fff}
+.btn-instagram{color:#fff;background-color:#3f729b;border-color:rgba(0,0,0,0.2)}.btn-instagram:focus,.btn-instagram.focus{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}
+.btn-instagram:hover{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}
+.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{color:#fff;background-color:#305777;border-color:rgba(0,0,0,0.2)}.btn-instagram:active:hover,.btn-instagram.active:hover,.open>.dropdown-toggle.btn-instagram:hover,.btn-instagram:active:focus,.btn-instagram.active:focus,.open>.dropdown-toggle.btn-instagram:focus,.btn-instagram:active.focus,.btn-instagram.active.focus,.open>.dropdown-toggle.btn-instagram.focus{color:#fff;background-color:#26455d;border-color:rgba(0,0,0,0.2)}
+.btn-instagram:active,.btn-instagram.active,.open>.dropdown-toggle.btn-instagram{background-image:none}
+.btn-instagram.disabled:hover,.btn-instagram[disabled]:hover,fieldset[disabled] .btn-instagram:hover,.btn-instagram.disabled:focus,.btn-instagram[disabled]:focus,fieldset[disabled] .btn-instagram:focus,.btn-instagram.disabled.focus,.btn-instagram[disabled].focus,fieldset[disabled] .btn-instagram.focus{background-color:#3f729b;border-color:rgba(0,0,0,0.2)}
+.btn-instagram .badge{color:#3f729b;background-color:#fff}
+.btn-linkedin{color:#fff;background-color:#007bb6;border-color:rgba(0,0,0,0.2)}.btn-linkedin:focus,.btn-linkedin.focus{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}
+.btn-linkedin:hover{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}
+.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{color:#fff;background-color:#005983;border-color:rgba(0,0,0,0.2)}.btn-linkedin:active:hover,.btn-linkedin.active:hover,.open>.dropdown-toggle.btn-linkedin:hover,.btn-linkedin:active:focus,.btn-linkedin.active:focus,.open>.dropdown-toggle.btn-linkedin:focus,.btn-linkedin:active.focus,.btn-linkedin.active.focus,.open>.dropdown-toggle.btn-linkedin.focus{color:#fff;background-color:#00405f;border-color:rgba(0,0,0,0.2)}
+.btn-linkedin:active,.btn-linkedin.active,.open>.dropdown-toggle.btn-linkedin{background-image:none}
+.btn-linkedin.disabled:hover,.btn-linkedin[disabled]:hover,fieldset[disabled] .btn-linkedin:hover,.btn-linkedin.disabled:focus,.btn-linkedin[disabled]:focus,fieldset[disabled] .btn-linkedin:focus,.btn-linkedin.disabled.focus,.btn-linkedin[disabled].focus,fieldset[disabled] .btn-linkedin.focus{background-color:#007bb6;border-color:rgba(0,0,0,0.2)}
+.btn-linkedin .badge{color:#007bb6;background-color:#fff}
+.btn-microsoft{color:#fff;background-color:#2672ec;border-color:rgba(0,0,0,0.2)}.btn-microsoft:focus,.btn-microsoft.focus{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}
+.btn-microsoft:hover{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}
+.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{color:#fff;background-color:#125acd;border-color:rgba(0,0,0,0.2)}.btn-microsoft:active:hover,.btn-microsoft.active:hover,.open>.dropdown-toggle.btn-microsoft:hover,.btn-microsoft:active:focus,.btn-microsoft.active:focus,.open>.dropdown-toggle.btn-microsoft:focus,.btn-microsoft:active.focus,.btn-microsoft.active.focus,.open>.dropdown-toggle.btn-microsoft.focus{color:#fff;background-color:#0f4bac;border-color:rgba(0,0,0,0.2)}
+.btn-microsoft:active,.btn-microsoft.active,.open>.dropdown-toggle.btn-microsoft{background-image:none}
+.btn-microsoft.disabled:hover,.btn-microsoft[disabled]:hover,fieldset[disabled] .btn-microsoft:hover,.btn-microsoft.disabled:focus,.btn-microsoft[disabled]:focus,fieldset[disabled] .btn-microsoft:focus,.btn-microsoft.disabled.focus,.btn-microsoft[disabled].focus,fieldset[disabled] .btn-microsoft.focus{background-color:#2672ec;border-color:rgba(0,0,0,0.2)}
+.btn-microsoft .badge{color:#2672ec;background-color:#fff}
+.btn-odnoklassniki{color:#fff;background-color:#f4731c;border-color:rgba(0,0,0,0.2)}.btn-odnoklassniki:focus,.btn-odnoklassniki.focus{color:#fff;background-color:#d35b0a;border-color:rgba(0,0,0,0.2)}
+.btn-odnoklassniki:hover{color:#fff;background-color:#d35b0a;border-color:rgba(0,0,0,0.2)}
+.btn-odnoklassniki:active,.btn-odnoklassniki.active,.open>.dropdown-toggle.btn-odnoklassniki{color:#fff;background-color:#d35b0a;border-color:rgba(0,0,0,0.2)}.btn-odnoklassniki:active:hover,.btn-odnoklassniki.active:hover,.open>.dropdown-toggle.btn-odnoklassniki:hover,.btn-odnoklassniki:active:focus,.btn-odnoklassniki.active:focus,.open>.dropdown-toggle.btn-odnoklassniki:focus,.btn-odnoklassniki:active.focus,.btn-odnoklassniki.active.focus,.open>.dropdown-toggle.btn-odnoklassniki.focus{color:#fff;background-color:#b14c09;border-color:rgba(0,0,0,0.2)}
+.btn-odnoklassniki:active,.btn-odnoklassniki.active,.open>.dropdown-toggle.btn-odnoklassniki{background-image:none}
+.btn-odnoklassniki.disabled:hover,.btn-odnoklassniki[disabled]:hover,fieldset[disabled] .btn-odnoklassniki:hover,.btn-odnoklassniki.disabled:focus,.btn-odnoklassniki[disabled]:focus,fieldset[disabled] .btn-odnoklassniki:focus,.btn-odnoklassniki.disabled.focus,.btn-odnoklassniki[disabled].focus,fieldset[disabled] .btn-odnoklassniki.focus{background-color:#f4731c;border-color:rgba(0,0,0,0.2)}
+.btn-odnoklassniki .badge{color:#f4731c;background-color:#fff}
+.btn-openid{color:#fff;background-color:#f7931e;border-color:rgba(0,0,0,0.2)}.btn-openid:focus,.btn-openid.focus{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}
+.btn-openid:hover{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}
+.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{color:#fff;background-color:#da7908;border-color:rgba(0,0,0,0.2)}.btn-openid:active:hover,.btn-openid.active:hover,.open>.dropdown-toggle.btn-openid:hover,.btn-openid:active:focus,.btn-openid.active:focus,.open>.dropdown-toggle.btn-openid:focus,.btn-openid:active.focus,.btn-openid.active.focus,.open>.dropdown-toggle.btn-openid.focus{color:#fff;background-color:#b86607;border-color:rgba(0,0,0,0.2)}
+.btn-openid:active,.btn-openid.active,.open>.dropdown-toggle.btn-openid{background-image:none}
+.btn-openid.disabled:hover,.btn-openid[disabled]:hover,fieldset[disabled] .btn-openid:hover,.btn-openid.disabled:focus,.btn-openid[disabled]:focus,fieldset[disabled] .btn-openid:focus,.btn-openid.disabled.focus,.btn-openid[disabled].focus,fieldset[disabled] .btn-openid.focus{background-color:#f7931e;border-color:rgba(0,0,0,0.2)}
+.btn-openid .badge{color:#f7931e;background-color:#fff}
+.btn-pinterest{color:#fff;background-color:#cb2027;border-color:rgba(0,0,0,0.2)}.btn-pinterest:focus,.btn-pinterest.focus{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}
+.btn-pinterest:hover{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}
+.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{color:#fff;background-color:#9f191f;border-color:rgba(0,0,0,0.2)}.btn-pinterest:active:hover,.btn-pinterest.active:hover,.open>.dropdown-toggle.btn-pinterest:hover,.btn-pinterest:active:focus,.btn-pinterest.active:focus,.open>.dropdown-toggle.btn-pinterest:focus,.btn-pinterest:active.focus,.btn-pinterest.active.focus,.open>.dropdown-toggle.btn-pinterest.focus{color:#fff;background-color:#801419;border-color:rgba(0,0,0,0.2)}
+.btn-pinterest:active,.btn-pinterest.active,.open>.dropdown-toggle.btn-pinterest{background-image:none}
+.btn-pinterest.disabled:hover,.btn-pinterest[disabled]:hover,fieldset[disabled] .btn-pinterest:hover,.btn-pinterest.disabled:focus,.btn-pinterest[disabled]:focus,fieldset[disabled] .btn-pinterest:focus,.btn-pinterest.disabled.focus,.btn-pinterest[disabled].focus,fieldset[disabled] .btn-pinterest.focus{background-color:#cb2027;border-color:rgba(0,0,0,0.2)}
+.btn-pinterest .badge{color:#cb2027;background-color:#fff}
+.btn-reddit{color:#000;background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}.btn-reddit:focus,.btn-reddit.focus{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}
+.btn-reddit:hover{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}
+.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{color:#000;background-color:#bcddff;border-color:rgba(0,0,0,0.2)}.btn-reddit:active:hover,.btn-reddit.active:hover,.open>.dropdown-toggle.btn-reddit:hover,.btn-reddit:active:focus,.btn-reddit.active:focus,.open>.dropdown-toggle.btn-reddit:focus,.btn-reddit:active.focus,.btn-reddit.active.focus,.open>.dropdown-toggle.btn-reddit.focus{color:#000;background-color:#98ccff;border-color:rgba(0,0,0,0.2)}
+.btn-reddit:active,.btn-reddit.active,.open>.dropdown-toggle.btn-reddit{background-image:none}
+.btn-reddit.disabled:hover,.btn-reddit[disabled]:hover,fieldset[disabled] .btn-reddit:hover,.btn-reddit.disabled:focus,.btn-reddit[disabled]:focus,fieldset[disabled] .btn-reddit:focus,.btn-reddit.disabled.focus,.btn-reddit[disabled].focus,fieldset[disabled] .btn-reddit.focus{background-color:#eff7ff;border-color:rgba(0,0,0,0.2)}
+.btn-reddit .badge{color:#eff7ff;background-color:#000}
+.btn-soundcloud{color:#fff;background-color:#f50;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:focus,.btn-soundcloud.focus{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}
+.btn-soundcloud:hover{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}
+.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{color:#fff;background-color:#c40;border-color:rgba(0,0,0,0.2)}.btn-soundcloud:active:hover,.btn-soundcloud.active:hover,.open>.dropdown-toggle.btn-soundcloud:hover,.btn-soundcloud:active:focus,.btn-soundcloud.active:focus,.open>.dropdown-toggle.btn-soundcloud:focus,.btn-soundcloud:active.focus,.btn-soundcloud.active.focus,.open>.dropdown-toggle.btn-soundcloud.focus{color:#fff;background-color:#a83800;border-color:rgba(0,0,0,0.2)}
+.btn-soundcloud:active,.btn-soundcloud.active,.open>.dropdown-toggle.btn-soundcloud{background-image:none}
+.btn-soundcloud.disabled:hover,.btn-soundcloud[disabled]:hover,fieldset[disabled] .btn-soundcloud:hover,.btn-soundcloud.disabled:focus,.btn-soundcloud[disabled]:focus,fieldset[disabled] .btn-soundcloud:focus,.btn-soundcloud.disabled.focus,.btn-soundcloud[disabled].focus,fieldset[disabled] .btn-soundcloud.focus{background-color:#f50;border-color:rgba(0,0,0,0.2)}
+.btn-soundcloud .badge{color:#f50;background-color:#fff}
+.btn-tumblr{color:#fff;background-color:#2c4762;border-color:rgba(0,0,0,0.2)}.btn-tumblr:focus,.btn-tumblr.focus{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}
+.btn-tumblr:hover{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}
+.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{color:#fff;background-color:#1c2d3f;border-color:rgba(0,0,0,0.2)}.btn-tumblr:active:hover,.btn-tumblr.active:hover,.open>.dropdown-toggle.btn-tumblr:hover,.btn-tumblr:active:focus,.btn-tumblr.active:focus,.open>.dropdown-toggle.btn-tumblr:focus,.btn-tumblr:active.focus,.btn-tumblr.active.focus,.open>.dropdown-toggle.btn-tumblr.focus{color:#fff;background-color:#111c26;border-color:rgba(0,0,0,0.2)}
+.btn-tumblr:active,.btn-tumblr.active,.open>.dropdown-toggle.btn-tumblr{background-image:none}
+.btn-tumblr.disabled:hover,.btn-tumblr[disabled]:hover,fieldset[disabled] .btn-tumblr:hover,.btn-tumblr.disabled:focus,.btn-tumblr[disabled]:focus,fieldset[disabled] .btn-tumblr:focus,.btn-tumblr.disabled.focus,.btn-tumblr[disabled].focus,fieldset[disabled] .btn-tumblr.focus{background-color:#2c4762;border-color:rgba(0,0,0,0.2)}
+.btn-tumblr .badge{color:#2c4762;background-color:#fff}
+.btn-twitter{color:#fff;background-color:#55acee;border-color:rgba(0,0,0,0.2)}.btn-twitter:focus,.btn-twitter.focus{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}
+.btn-twitter:hover{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}
+.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{color:#fff;background-color:#2795e9;border-color:rgba(0,0,0,0.2)}.btn-twitter:active:hover,.btn-twitter.active:hover,.open>.dropdown-toggle.btn-twitter:hover,.btn-twitter:active:focus,.btn-twitter.active:focus,.open>.dropdown-toggle.btn-twitter:focus,.btn-twitter:active.focus,.btn-twitter.active.focus,.open>.dropdown-toggle.btn-twitter.focus{color:#fff;background-color:#1583d7;border-color:rgba(0,0,0,0.2)}
+.btn-twitter:active,.btn-twitter.active,.open>.dropdown-toggle.btn-twitter{background-image:none}
+.btn-twitter.disabled:hover,.btn-twitter[disabled]:hover,fieldset[disabled] .btn-twitter:hover,.btn-twitter.disabled:focus,.btn-twitter[disabled]:focus,fieldset[disabled] .btn-twitter:focus,.btn-twitter.disabled.focus,.btn-twitter[disabled].focus,fieldset[disabled] .btn-twitter.focus{background-color:#55acee;border-color:rgba(0,0,0,0.2)}
+.btn-twitter .badge{color:#55acee;background-color:#fff}
+.btn-vimeo{color:#fff;background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}.btn-vimeo:focus,.btn-vimeo.focus{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}
+.btn-vimeo:hover{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}
+.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{color:#fff;background-color:#1295bf;border-color:rgba(0,0,0,0.2)}.btn-vimeo:active:hover,.btn-vimeo.active:hover,.open>.dropdown-toggle.btn-vimeo:hover,.btn-vimeo:active:focus,.btn-vimeo.active:focus,.open>.dropdown-toggle.btn-vimeo:focus,.btn-vimeo:active.focus,.btn-vimeo.active.focus,.open>.dropdown-toggle.btn-vimeo.focus{color:#fff;background-color:#0f7b9f;border-color:rgba(0,0,0,0.2)}
+.btn-vimeo:active,.btn-vimeo.active,.open>.dropdown-toggle.btn-vimeo{background-image:none}
+.btn-vimeo.disabled:hover,.btn-vimeo[disabled]:hover,fieldset[disabled] .btn-vimeo:hover,.btn-vimeo.disabled:focus,.btn-vimeo[disabled]:focus,fieldset[disabled] .btn-vimeo:focus,.btn-vimeo.disabled.focus,.btn-vimeo[disabled].focus,fieldset[disabled] .btn-vimeo.focus{background-color:#1ab7ea;border-color:rgba(0,0,0,0.2)}
+.btn-vimeo .badge{color:#1ab7ea;background-color:#fff}
+.btn-vk{color:#fff;background-color:#587ea3;border-color:rgba(0,0,0,0.2)}.btn-vk:focus,.btn-vk.focus{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}
+.btn-vk:hover{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}
+.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{color:#fff;background-color:#466482;border-color:rgba(0,0,0,0.2)}.btn-vk:active:hover,.btn-vk.active:hover,.open>.dropdown-toggle.btn-vk:hover,.btn-vk:active:focus,.btn-vk.active:focus,.open>.dropdown-toggle.btn-vk:focus,.btn-vk:active.focus,.btn-vk.active.focus,.open>.dropdown-toggle.btn-vk.focus{color:#fff;background-color:#3a526b;border-color:rgba(0,0,0,0.2)}
+.btn-vk:active,.btn-vk.active,.open>.dropdown-toggle.btn-vk{background-image:none}
+.btn-vk.disabled:hover,.btn-vk[disabled]:hover,fieldset[disabled] .btn-vk:hover,.btn-vk.disabled:focus,.btn-vk[disabled]:focus,fieldset[disabled] .btn-vk:focus,.btn-vk.disabled.focus,.btn-vk[disabled].focus,fieldset[disabled] .btn-vk.focus{background-color:#587ea3;border-color:rgba(0,0,0,0.2)}
+.btn-vk .badge{color:#587ea3;background-color:#fff}
+.btn-yahoo{color:#fff;background-color:#720e9e;border-color:rgba(0,0,0,0.2)}.btn-yahoo:focus,.btn-yahoo.focus{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}
+.btn-yahoo:hover{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}
+.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{color:#fff;background-color:#500a6f;border-color:rgba(0,0,0,0.2)}.btn-yahoo:active:hover,.btn-yahoo.active:hover,.open>.dropdown-toggle.btn-yahoo:hover,.btn-yahoo:active:focus,.btn-yahoo.active:focus,.open>.dropdown-toggle.btn-yahoo:focus,.btn-yahoo:active.focus,.btn-yahoo.active.focus,.open>.dropdown-toggle.btn-yahoo.focus{color:#fff;background-color:#39074e;border-color:rgba(0,0,0,0.2)}
+.btn-yahoo:active,.btn-yahoo.active,.open>.dropdown-toggle.btn-yahoo{background-image:none}
+.btn-yahoo.disabled:hover,.btn-yahoo[disabled]:hover,fieldset[disabled] .btn-yahoo:hover,.btn-yahoo.disabled:focus,.btn-yahoo[disabled]:focus,fieldset[disabled] .btn-yahoo:focus,.btn-yahoo.disabled.focus,.btn-yahoo[disabled].focus,fieldset[disabled] .btn-yahoo.focus{background-color:#720e9e;border-color:rgba(0,0,0,0.2)}
+.btn-yahoo .badge{color:#720e9e;background-color:#fff}
diff --git a/sm-shop/src/main/webapp/resources/css/showLoading.css b/sm-shop/src/main/webapp/resources/css/showLoading.css
index 5084218..23a963d 100644
--- a/sm-shop/src/main/webapp/resources/css/showLoading.css
+++ b/sm-shop/src/main/webapp/resources/css/showLoading.css
@@ -1,15 +1,15 @@
-.loading-indicator {
- height: 120px;
- width: 240px;
- background: url( '../img/loading.gif' );
- background-repeat: no-repeat;
- background-position: center center;
- z-index: 100000;
-}
-
-.loading-indicator-overlay {
- background-color: #FFFFFF;
- opacity: 0.6;
- filter: alpha(opacity = 60);
- z-index: 100000;
+.loading-indicator {
+ height: 120px;
+ width: 240px;
+ background: url( '../img/loading.gif' );
+ background-repeat: no-repeat;
+ background-position: center center;
+ z-index: 100000;
+}
+
+.loading-indicator-overlay {
+ background-color: #FFFFFF;
+ opacity: 0.6;
+ filter: alpha(opacity = 60);
+ z-index: 100000;
}
\ No newline at end of file
sm-shop/src/main/webapp/resources/css/sm.css 55(+53 -2)
diff --git a/sm-shop/src/main/webapp/resources/css/sm.css b/sm-shop/src/main/webapp/resources/css/sm.css
index 06783f5..5e284b5 100644
--- a/sm-shop/src/main/webapp/resources/css/sm.css
+++ b/sm-shop/src/main/webapp/resources/css/sm.css
@@ -125,7 +125,7 @@
}
#summary-table {
- table-layout:fixed;
+ /**table-layout:fixed;**/
width:100%;
}
@@ -301,7 +301,58 @@ form input.valid {
max-width: 40px;
}
-@media screen and (max-width: 600px) {
+.credit-card-box-v2 {
+ background-color: #F9F9F9;
+}
+
+.credit-card-box-v2 .form-control.error {
+ border-color: red;
+ outline: 0;
+ box-shadow: inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(255,0,0,0.6);
+}
+.credit-card-box-v2 label.error {
+ font-weight: bold;
+ color: red;
+ padding: 2px 8px;
+ margin-top: 2px;
+}
+.credit-card-box-v2 .payment-errors {
+ font-weight: bold;
+ color: red;
+ padding: 2px 8px;
+ margin-top: 2px;
+}
+.credit-card-box-v2 .panel-heading {
+ padding-top: 0px !important;
+ padding-bottom: 0px !important;
+}
+
+.credit-card-box-v2 .cc-image {
+ margin-right:5px;
+ margin-top:10px;
+ width:32px;
+}
+
+
+.credit-card-box-v2 label {
+ display: block;
+ font-size: 14px;
+ font-weight:normal !important;
+}
+
+.form-control-100 {
+ width:100% !important;
+}
+
+.form-control-50 {
+ width:50% !important;
+}
+
+.form-control-25 {
+ width:25% !important;
+}
+
+@media screen and (max-width: 767px) {
table#mainCartTable tbody td .form-control{
diff --git a/sm-shop/src/main/webapp/resources/img/arrows.svg b/sm-shop/src/main/webapp/resources/img/arrows.svg
new file mode 100644
index 0000000..2793226
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/img/arrows.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ width="100px" height="50px" viewBox="0 0 100 50" enable-background="new 0 0 100 50" xml:space="preserve">
+<polyline fill="none" stroke="#4D4D4D" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
+ 26.232,35.01 15.039,23.817 25.865,12.99 "/>
+<polyline fill="none" stroke="#4D4D4D" stroke-width="4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
+ 73.693,35.69 85.578,23.805 74.083,12.31 "/>
+</svg>
diff --git a/sm-shop/src/main/webapp/resources/img/payment/braintree.jpg b/sm-shop/src/main/webapp/resources/img/payment/braintree.jpg
new file mode 100644
index 0000000..0ebfbe4
Binary files /dev/null and b/sm-shop/src/main/webapp/resources/img/payment/braintree.jpg differ
diff --git a/sm-shop/src/main/webapp/resources/img/payment/icons/AmericanExpress.png b/sm-shop/src/main/webapp/resources/img/payment/icons/AmericanExpress.png
new file mode 100644
index 0000000..27258a4
Binary files /dev/null and b/sm-shop/src/main/webapp/resources/img/payment/icons/AmericanExpress.png differ
diff --git a/sm-shop/src/main/webapp/resources/img/payment/icons/MasterCard.png b/sm-shop/src/main/webapp/resources/img/payment/icons/MasterCard.png
new file mode 100644
index 0000000..49fd017
Binary files /dev/null and b/sm-shop/src/main/webapp/resources/img/payment/icons/MasterCard.png differ
diff --git a/sm-shop/src/main/webapp/resources/img/payment/icons/PayPal.png b/sm-shop/src/main/webapp/resources/img/payment/icons/PayPal.png
new file mode 100644
index 0000000..0560358
Binary files /dev/null and b/sm-shop/src/main/webapp/resources/img/payment/icons/PayPal.png differ
diff --git a/sm-shop/src/main/webapp/resources/img/payment/icons/Visa.png b/sm-shop/src/main/webapp/resources/img/payment/icons/Visa.png
new file mode 100644
index 0000000..f431cb3
Binary files /dev/null and b/sm-shop/src/main/webapp/resources/img/payment/icons/Visa.png differ
sm-shop/src/main/webapp/resources/js/address.js 140(+70 -70)
diff --git a/sm-shop/src/main/webapp/resources/js/address.js b/sm-shop/src/main/webapp/resources/js/address.js
index b69fcf4..d58835f 100644
--- a/sm-shop/src/main/webapp/resources/js/address.js
+++ b/sm-shop/src/main/webapp/resources/js/address.js
@@ -1,70 +1,70 @@
- /**
- * customer functionality for store front
- */
-
-
-$.fn.addZoneItems = function(div, data, defaultValue) {
- //console.log('Populating div ' + div + ' defaultValue ' + defaultValue);
- var selector = div + ' > option';
- var defaultExist = false;
- $(selector).remove();
- return this.each(function() {
- var list = this;
- $.each(data, function(index, itemData) {
- //console.log(itemData.code + ' ' + defaultValue);
- if(itemData.code==defaultValue) {
- defaultExist = true;
- }
- var option = new Option(itemData.name, itemData.code);
- list.add(option);
- });
- if(defaultExist && (defaultValue!=null && defaultValue!='')) {
- $(div).val(defaultValue);
- }
- });
-};
-
-
-function getZones(countryCode, zoneCode, callBackFunction){
-
- //console.log('Zone code ' + zoneCode);
- var url = getContextPath() + '/shop/reference/provinces.html';
- var data = 'countryCode=' + countryCode + '&lang=' + getLanguageCode();
-
- $.ajax({
- type: 'POST',
- url: url,
- data: data,
- dataType: 'json',
- success: function(responseObj){
-
- if((responseObj.response.status == 0 || responseObj.response.status ==9999) && responseObj.response.data){
- //$("#registration_zones option").remove();
- $('#customer_zones').show();
- $('#hidden_zones').hide();
-
-
- //var zone = $('#registration_zones');
- $('#customer_zones').addZoneItems('#customer_zones', responseObj.response.data, zoneCode);
-
- } else {
- $('#customer_zones').hide();
- $('#hidden_zones').show();
-
- }
- if(callBackFunction!=null) {
- callBackFunction();
- }
- },
- error: function(xhr, textStatus, errorThrown) {
- alert('error ' + errorThrown);
- }
-
-
- });
-
-}
-
-
-
-
+ /**
+ * customer functionality for store front
+ */
+
+
+$.fn.addZoneItems = function(div, data, defaultValue) {
+ //console.log('Populating div ' + div + ' defaultValue ' + defaultValue);
+ var selector = div + ' > option';
+ var defaultExist = false;
+ $(selector).remove();
+ return this.each(function() {
+ var list = this;
+ $.each(data, function(index, itemData) {
+ //console.log(itemData.code + ' ' + defaultValue);
+ if(itemData.code==defaultValue) {
+ defaultExist = true;
+ }
+ var option = new Option(itemData.name, itemData.code);
+ list.add(option);
+ });
+ if(defaultExist && (defaultValue!=null && defaultValue!='')) {
+ $(div).val(defaultValue);
+ }
+ });
+};
+
+
+function getZones(countryCode, zoneCode, callBackFunction){
+
+ //console.log('Zone code ' + zoneCode);
+ var url = getContextPath() + '/shop/reference/provinces.html';
+ var data = 'countryCode=' + countryCode + '&lang=' + getLanguageCode();
+
+ $.ajax({
+ type: 'POST',
+ url: url,
+ data: data,
+ dataType: 'json',
+ success: function(responseObj){
+
+ if((responseObj.response.status == 0 || responseObj.response.status ==9999) && responseObj.response.data){
+ //$("#registration_zones option").remove();
+ $('#customer_zones').show();
+ $('#hidden_zones').hide();
+
+
+ //var zone = $('#registration_zones');
+ $('#customer_zones').addZoneItems('#customer_zones', responseObj.response.data, zoneCode);
+
+ } else {
+ $('#customer_zones').hide();
+ $('#hidden_zones').show();
+
+ }
+ if(callBackFunction!=null) {
+ callBackFunction();
+ }
+ },
+ error: function(xhr, textStatus, errorThrown) {
+ alert('error ' + errorThrown);
+ }
+
+
+ });
+
+}
+
+
+
+
sm-shop/src/main/webapp/resources/js/ckeditor/ckeditor.js 304(+152 -152)
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/ckeditor.js b/sm-shop/src/main/webapp/resources/js/ckeditor/ckeditor.js
index f3758ea..9f0b1e8 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/ckeditor.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/ckeditor.js
@@ -1,152 +1,152 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-(function(){if(window.CKEDITOR&&window.CKEDITOR.dom)return;if(!window.CKEDITOR)window.CKEDITOR=(function(){var a={timestamp:'C6HH5UF',version:'3.6.4',revision:'7575',rnd:Math.floor(Math.random()*900)+100,_:{},status:'unloaded',basePath:(function(){var d=window.CKEDITOR_BASEPATH||'';if(!d){var e=document.getElementsByTagName('script');for(var f=0;f<e.length;f++){var g=e[f].src.match(/(^|.*[\\\/])ckeditor(?:_basic)?(?:_source)?.js(?:\?.*)?$/i);if(g){d=g[1];break;}}}if(d.indexOf(':/')==-1)if(d.indexOf('/')===0)d=location.href.match(/^.*?:\/\/[^\/]*/)[0]+d;else d=location.href.match(/^[^\?]*\/(?:)/)[0]+d;if(!d)throw 'The CKEditor installation path could not be automatically detected. Please set the global variable "CKEDITOR_BASEPATH" before creating editor instances.';return d;})(),getUrl:function(d){if(d.indexOf(':/')==-1&&d.indexOf('/')!==0)d=this.basePath+d;if(this.timestamp&&d.charAt(d.length-1)!='/'&&!/[&?]t=/.test(d))d+=(d.indexOf('?')>=0?'&':'?')+'t='+this.timestamp;return d;}},b=window.CKEDITOR_GETURL;if(b){var c=a.getUrl;a.getUrl=function(d){return b.call(a,d)||c.call(a,d);};}return a;})();var a=CKEDITOR;if(!a.event){a.event=function(){};a.event.implementOn=function(b){var c=a.event.prototype;for(var d in c){if(b[d]==undefined)b[d]=c[d];}};a.event.prototype=(function(){var b=function(d){var e=d.getPrivate&&d.getPrivate()||d._||(d._={});return e.events||(e.events={});},c=function(d){this.name=d;this.listeners=[];};c.prototype={getListenerIndex:function(d){for(var e=0,f=this.listeners;e<f.length;e++){if(f[e].fn==d)return e;}return-1;}};return{on:function(d,e,f,g,h){var i=b(this),j=i[d]||(i[d]=new c(d));if(j.getListenerIndex(e)<0){var k=j.listeners;if(!f)f=this;if(isNaN(h))h=10;var l=this,m=function(o,p,q,r){var s={name:d,sender:this,editor:o,data:p,listenerData:g,stop:q,cancel:r,removeListener:function(){l.removeListener(d,e);}};e.call(f,s);return s.data;};m.fn=e;m.priority=h;for(var n=k.length-1;n>=0;n--){if(k[n].priority<=h){k.splice(n+1,0,m);return;}}k.unshift(m);}},fire:(function(){var d=false,e=function(){d=true;},f=false,g=function(){f=true;};return function(h,i,j){var k=b(this)[h],l=d,m=f;d=f=false;if(k){var n=k.listeners;if(n.length){n=n.slice(0);for(var o=0;o<n.length;o++){var p=n[o].call(this,j,i,e,g);if(typeof p!='undefined')i=p;if(d||f)break;}}}var q=f||(typeof i=='undefined'?false:i);d=l;f=m;return q;};})(),fireOnce:function(d,e,f){var g=this.fire(d,e,f);delete b(this)[d];return g;},removeListener:function(d,e){var f=b(this)[d];if(f){var g=f.getListenerIndex(e);
-if(g>=0)f.listeners.splice(g,1);}},hasListeners:function(d){var e=b(this)[d];return e&&e.listeners.length>0;}};})();}if(!a.editor){a.ELEMENT_MODE_NONE=0;a.ELEMENT_MODE_REPLACE=1;a.ELEMENT_MODE_APPENDTO=2;a.editor=function(b,c,d,e){var f=this;f._={instanceConfig:b,element:c,data:e};f.elementMode=d||0;a.event.call(f);f._init();};a.editor.replace=function(b,c){var d=b;if(typeof d!='object'){d=document.getElementById(b);if(d&&d.tagName.toLowerCase() in {style:1,script:1,base:1,link:1,meta:1,title:1})d=null;if(!d){var e=0,f=document.getElementsByName(b);while((d=f[e++])&&d.tagName.toLowerCase()!='textarea'){}}if(!d)throw '[CKEDITOR.editor.replace] The element with id or name "'+b+'" was not found.';}d.style.visibility='hidden';return new a.editor(c,d,1);};a.editor.appendTo=function(b,c,d){var e=b;if(typeof e!='object'){e=document.getElementById(b);if(!e)throw '[CKEDITOR.editor.appendTo] The element with id "'+b+'" was not found.';}return new a.editor(c,e,2,d);};a.editor.prototype={_init:function(){var b=a.editor._pending||(a.editor._pending=[]);b.push(this);},fire:function(b,c){return a.event.prototype.fire.call(this,b,c,this);},fireOnce:function(b,c){return a.event.prototype.fireOnce.call(this,b,c,this);}};a.event.implementOn(a.editor.prototype,true);}if(!a.env)a.env=(function(){var b=navigator.userAgent.toLowerCase(),c=window.opera,d={ie:/*@cc_on!@*/false,opera:!!c&&c.version,webkit:b.indexOf(' applewebkit/')>-1,air:b.indexOf(' adobeair/')>-1,mac:b.indexOf('macintosh')>-1,quirks:document.compatMode=='BackCompat',mobile:b.indexOf('mobile')>-1,iOS:/(ipad|iphone|ipod)/.test(b),isCustomDomain:function(){if(!this.ie)return false;var g=document.domain,h=window.location.hostname;return g!=h&&g!='['+h+']';},secure:location.protocol=='https:'};d.gecko=navigator.product=='Gecko'&&!d.webkit&&!d.opera;var e=0;if(d.ie){e=parseFloat(b.match(/msie (\d+)/)[1]);d.ie8=!!document.documentMode;d.ie8Compat=document.documentMode==8;d.ie9Compat=document.documentMode==9;d.ie7Compat=e==7&&!document.documentMode||document.documentMode==7;d.ie6Compat=e<7||d.quirks;}if(d.gecko){var f=b.match(/rv:([\d\.]+)/);if(f){f=f[1].split('.');e=f[0]*10000+(f[1]||0)*100+ +(f[2]||0);}}if(d.opera)e=parseFloat(c.version());if(d.air)e=parseFloat(b.match(/ adobeair\/(\d+)/)[1]);if(d.webkit)e=parseFloat(b.match(/ applewebkit\/(\d+)/)[1]);d.version=e;d.isCompatible=d.iOS&&e>=534||!d.mobile&&(d.ie&&e>=6||d.gecko&&e>=10801||d.opera&&e>=9.5||d.air&&e>=1||d.webkit&&e>=522||false);d.cssClass='cke_browser_'+(d.ie?'ie':d.gecko?'gecko':d.opera?'opera':d.webkit?'webkit':'unknown');
-if(d.quirks)d.cssClass+=' cke_browser_quirks';if(d.ie){d.cssClass+=' cke_browser_ie'+(d.version<7?'6':d.version>=8?document.documentMode:'7');if(d.quirks)d.cssClass+=' cke_browser_iequirks';}if(d.gecko&&e<10900)d.cssClass+=' cke_browser_gecko18';if(d.air)d.cssClass+=' cke_browser_air';return d;})();var b=a.env;var c=b.ie;if(a.status=='unloaded')(function(){a.event.implementOn(a);a.loadFullCore=function(){if(a.status!='basic_ready'){a.loadFullCore._load=1;return;}delete a.loadFullCore;var e=document.createElement('script');e.type='text/javascript';e.src=a.basePath+'ckeditor.js';document.getElementsByTagName('head')[0].appendChild(e);};a.loadFullCoreTimeout=0;a.replaceClass='ckeditor';a.replaceByClassEnabled=1;var d=function(e,f,g,h){if(b.isCompatible){if(a.loadFullCore)a.loadFullCore();var i=g(e,f,h);a.add(i);return i;}return null;};a.replace=function(e,f){return d(e,f,a.editor.replace);};a.appendTo=function(e,f,g){return d(e,f,a.editor.appendTo,g);};a.add=function(e){var f=this._.pending||(this._.pending=[]);f.push(e);};a.replaceAll=function(){var e=document.getElementsByTagName('textarea');for(var f=0;f<e.length;f++){var g=null,h=e[f];if(!h.name&&!h.id)continue;if(typeof arguments[0]=='string'){var i=new RegExp('(?:^|\\s)'+arguments[0]+'(?:$|\\s)');if(!i.test(h.className))continue;}else if(typeof arguments[0]=='function'){g={};if(arguments[0](h,g)===false)continue;}this.replace(h,g);}};(function(){var e=function(){var f=a.loadFullCore,g=a.loadFullCoreTimeout;if(a.replaceByClassEnabled)a.replaceAll(a.replaceClass);a.status='basic_ready';if(f&&f._load)f();else if(g)setTimeout(function(){if(a.loadFullCore)a.loadFullCore();},g*1000);};if(window.addEventListener)window.addEventListener('load',e,false);else if(window.attachEvent)window.attachEvent('onload',e);})();a.status='basic_loaded';})();a.dom={};var d=a.dom;(function(){var e=[];a.on('reset',function(){e=[];});a.tools={arrayCompare:function(f,g){if(!f&&!g)return true;if(!f||!g||f.length!=g.length)return false;for(var h=0;h<f.length;h++){if(f[h]!=g[h])return false;}return true;},clone:function(f){var g;if(f&&f instanceof Array){g=[];for(var h=0;h<f.length;h++)g[h]=this.clone(f[h]);return g;}if(f===null||typeof f!='object'||f instanceof String||f instanceof Number||f instanceof Boolean||f instanceof Date||f instanceof RegExp)return f;g=new f.constructor();for(var i in f){var j=f[i];g[i]=this.clone(j);}return g;},capitalize:function(f){return f.charAt(0).toUpperCase()+f.substring(1).toLowerCase();},extend:function(f){var g=arguments.length,h,i;
-if(typeof (h=arguments[g-1])=='boolean')g--;else if(typeof (h=arguments[g-2])=='boolean'){i=arguments[g-1];g-=2;}for(var j=1;j<g;j++){var k=arguments[j];for(var l in k){if(h===true||f[l]==undefined)if(!i||l in i)f[l]=k[l];}}return f;},prototypedCopy:function(f){var g=function(){};g.prototype=f;return new g();},isArray:function(f){return!!f&&f instanceof Array;},isEmpty:function(f){for(var g in f){if(f.hasOwnProperty(g))return false;}return true;},cssStyleToDomStyle:(function(){var f=document.createElement('div').style,g=typeof f.cssFloat!='undefined'?'cssFloat':typeof f.styleFloat!='undefined'?'styleFloat':'float';return function(h){if(h=='float')return g;else return h.replace(/-./g,function(i){return i.substr(1).toUpperCase();});};})(),buildStyleHtml:function(f){f=[].concat(f);var g,h=[];for(var i=0;i<f.length;i++){g=f[i];if(/@import|[{}]/.test(g))h.push('<style>'+g+'</style>');else h.push('<link type="text/css" rel=stylesheet href="'+g+'">');}return h.join('');},htmlEncode:function(f){var g=function(k){var l=new d.element('span');l.setText(k);return l.getHtml();},h=g('\n').toLowerCase()=='<br>'?function(k){return g(k).replace(/<br>/gi,'\n');}:g,i=g('>')=='>'?function(k){return h(k).replace(/>/g,'>');}:h,j=g(' ')==' '?function(k){return i(k).replace(/ /g,' ');}:i;this.htmlEncode=j;return this.htmlEncode(f);},htmlEncodeAttr:function(f){return f.replace(/"/g,'"').replace(/</g,'<').replace(/>/g,'>');},getNextNumber:(function(){var f=0;return function(){return++f;};})(),getNextId:function(){return 'cke_'+this.getNextNumber();},override:function(f,g){return g(f);},setTimeout:function(f,g,h,i,j){if(!j)j=window;if(!h)h=j;return j.setTimeout(function(){if(i)f.apply(h,[].concat(i));else f.apply(h);},g||0);},trim:(function(){var f=/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g;return function(g){return g.replace(f,'');};})(),ltrim:(function(){var f=/^[ \t\n\r]+/g;return function(g){return g.replace(f,'');};})(),rtrim:(function(){var f=/[ \t\n\r]+$/g;return function(g){return g.replace(f,'');};})(),indexOf:Array.prototype.indexOf?function(f,g){return f.indexOf(g);}:function(f,g){for(var h=0,i=f.length;h<i;h++){if(f[h]===g)return h;}return-1;},bind:function(f,g){return function(){return f.apply(g,arguments);};},createClass:function(f){var g=f.$,h=f.base,i=f.privates||f._,j=f.proto,k=f.statics;if(i){var l=g;g=function(){var p=this;var m=p._||(p._={});for(var n in i){var o=i[n];m[n]=typeof o=='function'?a.tools.bind(o,p):o;}l.apply(p,arguments);};}if(h){g.prototype=this.prototypedCopy(h.prototype);
-g.prototype['constructor']=g;g.prototype.base=function(){this.base=h.prototype.base;h.apply(this,arguments);this.base=arguments.callee;};}if(j)this.extend(g.prototype,j,true);if(k)this.extend(g,k,true);return g;},addFunction:function(f,g){return e.push(function(){return f.apply(g||this,arguments);})-1;},removeFunction:function(f){e[f]=null;},callFunction:function(f){var g=e[f];return g&&g.apply(window,Array.prototype.slice.call(arguments,1));},cssLength:(function(){return function(f){return f+(!f||isNaN(Number(f))?'':'px');};})(),convertToPx:(function(){var f;return function(g){if(!f){f=d.element.createFromHtml('<div style="position:absolute;left:-9999px;top:-9999px;margin:0px;padding:0px;border:0px;"></div>',a.document);a.document.getBody().append(f);}if(!/%$/.test(g)){f.setStyle('width',g);return f.$.clientWidth;}return g;};})(),repeat:function(f,g){return new Array(g+1).join(f);},tryThese:function(){var f;for(var g=0,h=arguments.length;g<h;g++){var i=arguments[g];try{f=i();break;}catch(j){}}return f;},genKey:function(){return Array.prototype.slice.call(arguments).join('-');}};})();var e=a.tools;a.dtd=(function(){var f=e.extend,g={isindex:1,fieldset:1},h={input:1,button:1,select:1,textarea:1,label:1},i=f({a:1},h),j=f({iframe:1},i),k={hr:1,ul:1,menu:1,div:1,section:1,header:1,footer:1,nav:1,article:1,aside:1,figure:1,dialog:1,hgroup:1,mark:1,time:1,meter:1,command:1,keygen:1,output:1,progress:1,audio:1,video:1,details:1,datagrid:1,datalist:1,blockquote:1,noscript:1,table:1,center:1,address:1,dir:1,pre:1,h5:1,dl:1,h4:1,noframes:1,h6:1,ol:1,h1:1,h3:1,h2:1},l={ins:1,del:1,script:1,style:1},m=f({b:1,acronym:1,bdo:1,'var':1,'#':1,abbr:1,code:1,br:1,i:1,cite:1,kbd:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,dfn:1,span:1,wbr:1},l),n=f({sub:1,img:1,object:1,sup:1,basefont:1,map:1,applet:1,font:1,big:1,small:1,mark:1},m),o=f({p:1},n),p=f({iframe:1},n,h),q={img:1,noscript:1,br:1,kbd:1,center:1,button:1,basefont:1,h5:1,h4:1,samp:1,h6:1,ol:1,h1:1,h3:1,h2:1,form:1,font:1,'#':1,select:1,menu:1,ins:1,abbr:1,label:1,code:1,table:1,script:1,cite:1,input:1,iframe:1,strong:1,textarea:1,noframes:1,big:1,small:1,span:1,hr:1,sub:1,bdo:1,'var':1,div:1,section:1,header:1,footer:1,nav:1,article:1,aside:1,figure:1,dialog:1,hgroup:1,mark:1,time:1,meter:1,menu:1,command:1,keygen:1,output:1,progress:1,audio:1,video:1,details:1,datagrid:1,datalist:1,object:1,sup:1,strike:1,dir:1,map:1,dl:1,applet:1,del:1,isindex:1,fieldset:1,ul:1,b:1,acronym:1,a:1,blockquote:1,i:1,u:1,s:1,tt:1,address:1,q:1,pre:1,p:1,em:1,dfn:1},r=f({a:1},p),s={tr:1},t={'#':1},u=f({param:1},q),v=f({form:1},g,j,k,o),w={li:1},x={style:1,script:1},y={base:1,link:1,meta:1,title:1},z=f(y,x),A={head:1,body:1},B={html:1},C={address:1,blockquote:1,center:1,dir:1,div:1,section:1,header:1,footer:1,nav:1,article:1,aside:1,figure:1,dialog:1,hgroup:1,time:1,meter:1,menu:1,command:1,keygen:1,output:1,progress:1,audio:1,video:1,details:1,datagrid:1,datalist:1,dl:1,fieldset:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,isindex:1,noframes:1,ol:1,p:1,pre:1,table:1,ul:1};
-return{$nonBodyContent:f(B,A,y),$block:C,$blockLimit:{body:1,div:1,section:1,header:1,footer:1,nav:1,article:1,aside:1,figure:1,dialog:1,hgroup:1,time:1,meter:1,menu:1,command:1,keygen:1,output:1,progress:1,audio:1,video:1,details:1,datagrid:1,datalist:1,td:1,th:1,caption:1,form:1},$inline:r,$body:f({script:1,style:1},C),$cdata:{script:1,style:1},$empty:{area:1,base:1,br:1,col:1,hr:1,img:1,input:1,link:1,meta:1,param:1,wbr:1},$listItem:{dd:1,dt:1,li:1},$list:{ul:1,ol:1,dl:1},$nonEditable:{applet:1,button:1,embed:1,iframe:1,map:1,object:1,option:1,script:1,textarea:1,param:1,audio:1,video:1},$captionBlock:{caption:1,legend:1},$removeEmpty:{abbr:1,acronym:1,address:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,s:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1,mark:1},$tabIndex:{a:1,area:1,button:1,input:1,object:1,select:1,textarea:1},$tableContent:{caption:1,col:1,colgroup:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1},html:A,head:z,style:t,script:t,body:v,base:{},link:{},meta:{},title:t,col:{},tr:{td:1,th:1},img:{},colgroup:{col:1},noscript:v,td:v,br:{},wbr:{},th:v,center:v,kbd:r,button:f(o,k),basefont:{},h5:r,h4:r,samp:r,h6:r,ol:w,h1:r,h3:r,option:t,h2:r,form:f(g,j,k,o),select:{optgroup:1,option:1},font:r,ins:r,menu:w,abbr:r,label:r,table:{thead:1,col:1,tbody:1,tr:1,colgroup:1,caption:1,tfoot:1},code:r,tfoot:s,cite:r,li:v,input:{},iframe:v,strong:r,textarea:t,noframes:v,big:r,small:r,span:r,hr:{},dt:r,sub:r,optgroup:{option:1},param:{},bdo:r,'var':r,div:v,object:u,sup:r,dd:v,strike:r,area:{},dir:w,map:f({area:1,form:1,p:1},g,l,k),applet:u,dl:{dt:1,dd:1},del:r,isindex:{},fieldset:f({legend:1},q),thead:s,ul:w,acronym:r,b:r,a:p,blockquote:v,caption:r,i:r,u:r,tbody:s,s:r,address:f(j,o),tt:r,legend:r,q:r,pre:f(m,i),p:r,em:r,dfn:r,section:v,header:v,footer:v,nav:v,article:v,aside:v,figure:v,dialog:v,hgroup:v,mark:r,time:r,meter:r,menu:r,command:r,keygen:r,output:r,progress:u,audio:u,video:u,details:u,datagrid:u,datalist:u};})();var f=a.dtd;d.event=function(g){this.$=g;};d.event.prototype={getKey:function(){return this.$.keyCode||this.$.which;},getKeystroke:function(){var h=this;var g=h.getKey();if(h.$.ctrlKey||h.$.metaKey)g+=1114112;if(h.$.shiftKey)g+=2228224;if(h.$.altKey)g+=4456448;return g;},preventDefault:function(g){var h=this.$;if(h.preventDefault)h.preventDefault();else h.returnValue=false;if(g)this.stopPropagation();},stopPropagation:function(){var g=this.$;if(g.stopPropagation)g.stopPropagation();else g.cancelBubble=true;
-},getTarget:function(){var g=this.$.target||this.$.srcElement;return g?new d.node(g):null;}};a.CTRL=1114112;a.SHIFT=2228224;a.ALT=4456448;d.domObject=function(g){if(g)this.$=g;};d.domObject.prototype=(function(){var g=function(h,i){return function(j){if(typeof a!='undefined')h.fire(i,new d.event(j));};};return{getPrivate:function(){var h;if(!(h=this.getCustomData('_')))this.setCustomData('_',h={});return h;},on:function(h){var k=this;var i=k.getCustomData('_cke_nativeListeners');if(!i){i={};k.setCustomData('_cke_nativeListeners',i);}if(!i[h]){var j=i[h]=g(k,h);if(k.$.addEventListener)k.$.addEventListener(h,j,!!a.event.useCapture);else if(k.$.attachEvent)k.$.attachEvent('on'+h,j);}return a.event.prototype.on.apply(k,arguments);},removeListener:function(h){var k=this;a.event.prototype.removeListener.apply(k,arguments);if(!k.hasListeners(h)){var i=k.getCustomData('_cke_nativeListeners'),j=i&&i[h];if(j){if(k.$.removeEventListener)k.$.removeEventListener(h,j,false);else if(k.$.detachEvent)k.$.detachEvent('on'+h,j);delete i[h];}}},removeAllListeners:function(){var k=this;var h=k.getCustomData('_cke_nativeListeners');for(var i in h){var j=h[i];if(k.$.detachEvent)k.$.detachEvent('on'+i,j);else if(k.$.removeEventListener)k.$.removeEventListener(i,j,false);delete h[i];}}};})();(function(g){var h={};a.on('reset',function(){h={};});g.equals=function(i){return i&&i.$===this.$;};g.setCustomData=function(i,j){var k=this.getUniqueId(),l=h[k]||(h[k]={});l[i]=j;return this;};g.getCustomData=function(i){var j=this.$['data-cke-expando'],k=j&&h[j];return k&&k[i];};g.removeCustomData=function(i){var j=this.$['data-cke-expando'],k=j&&h[j],l=k&&k[i];if(typeof l!='undefined')delete k[i];return l||null;};g.clearCustomData=function(){this.removeAllListeners();var i=this.$['data-cke-expando'];i&&delete h[i];};g.getUniqueId=function(){return this.$['data-cke-expando']||(this.$['data-cke-expando']=e.getNextNumber());};a.event.implementOn(g);})(d.domObject.prototype);d.window=function(g){d.domObject.call(this,g);};d.window.prototype=new d.domObject();e.extend(d.window.prototype,{focus:function(){if(b.webkit&&this.$.parent)this.$.parent.focus();this.$.focus();},getViewPaneSize:function(){var g=this.$.document,h=g.compatMode=='CSS1Compat';return{width:(h?g.documentElement.clientWidth:g.body.clientWidth)||0,height:(h?g.documentElement.clientHeight:g.body.clientHeight)||0};},getScrollPosition:function(){var g=this.$;if('pageXOffset' in g)return{x:g.pageXOffset||0,y:g.pageYOffset||0};else{var h=g.document;
-return{x:h.documentElement.scrollLeft||h.body.scrollLeft||0,y:h.documentElement.scrollTop||h.body.scrollTop||0};}}});d.document=function(g){d.domObject.call(this,g);};var g=d.document;g.prototype=new d.domObject();e.extend(g.prototype,{appendStyleSheet:function(h){if(this.$.createStyleSheet)this.$.createStyleSheet(h);else{var i=new d.element('link');i.setAttributes({rel:'stylesheet',type:'text/css',href:h});this.getHead().append(i);}},appendStyleText:function(h){var k=this;if(k.$.createStyleSheet){var i=k.$.createStyleSheet('');i.cssText=h;}else{var j=new d.element('style',k);j.append(new d.text(h,k));k.getHead().append(j);}},createElement:function(h,i){var j=new d.element(h,this);if(i){if(i.attributes)j.setAttributes(i.attributes);if(i.styles)j.setStyles(i.styles);}return j;},createText:function(h){return new d.text(h,this);},focus:function(){this.getWindow().focus();},getById:function(h){var i=this.$.getElementById(h);return i?new d.element(i):null;},getByAddress:function(h,i){var j=this.$.documentElement;for(var k=0;j&&k<h.length;k++){var l=h[k];if(!i){j=j.childNodes[l];continue;}var m=-1;for(var n=0;n<j.childNodes.length;n++){var o=j.childNodes[n];if(i===true&&o.nodeType==3&&o.previousSibling&&o.previousSibling.nodeType==3)continue;m++;if(m==l){j=o;break;}}}return j?new d.node(j):null;},getElementsByTag:function(h,i){if(!(c&&!(document.documentMode>8))&&i)h=i+':'+h;return new d.nodeList(this.$.getElementsByTagName(h));},getHead:function(){var h=this.$.getElementsByTagName('head')[0];if(!h)h=this.getDocumentElement().append(new d.element('head'),true);else h=new d.element(h);return(this.getHead=function(){return h;})();},getBody:function(){var h=new d.element(this.$.body);return(this.getBody=function(){return h;})();},getDocumentElement:function(){var h=new d.element(this.$.documentElement);return(this.getDocumentElement=function(){return h;})();},getWindow:function(){var h=new d.window(this.$.parentWindow||this.$.defaultView);return(this.getWindow=function(){return h;})();},write:function(h){var i=this;i.$.open('text/html','replace');b.isCustomDomain()&&(i.$.domain=document.domain);i.$.write(h);i.$.close();}});d.node=function(h){if(h){var i=h.nodeType==9?'document':h.nodeType==1?'element':h.nodeType==3?'text':h.nodeType==8?'comment':'domObject';return new d[i](h);}return this;};d.node.prototype=new d.domObject();a.NODE_ELEMENT=1;a.NODE_DOCUMENT=9;a.NODE_TEXT=3;a.NODE_COMMENT=8;a.NODE_DOCUMENT_FRAGMENT=11;a.POSITION_IDENTICAL=0;a.POSITION_DISCONNECTED=1;
-a.POSITION_FOLLOWING=2;a.POSITION_PRECEDING=4;a.POSITION_IS_CONTAINED=8;a.POSITION_CONTAINS=16;e.extend(d.node.prototype,{appendTo:function(h,i){h.append(this,i);return h;},clone:function(h,i){var j=this.$.cloneNode(h),k=function(l){if(l.nodeType!=1)return;if(!i)l.removeAttribute('id',false);l.removeAttribute('data-cke-expando',false);if(h){var m=l.childNodes;for(var n=0;n<m.length;n++)k(m[n]);}};k(j);return new d.node(j);},hasPrevious:function(){return!!this.$.previousSibling;},hasNext:function(){return!!this.$.nextSibling;},insertAfter:function(h){h.$.parentNode.insertBefore(this.$,h.$.nextSibling);return h;},insertBefore:function(h){h.$.parentNode.insertBefore(this.$,h.$);return h;},insertBeforeMe:function(h){this.$.parentNode.insertBefore(h.$,this.$);return h;},getAddress:function(h){var i=[],j=this.getDocument().$.documentElement,k=this.$;while(k&&k!=j){var l=k.parentNode;if(l)i.unshift(this.getIndex.call({$:k},h));k=l;}return i;},getDocument:function(){return new g(this.$.ownerDocument||this.$.parentNode.ownerDocument);},getIndex:function(h){var i=this.$,j=0;while(i=i.previousSibling){if(h&&i.nodeType==3&&(!i.nodeValue.length||i.previousSibling&&i.previousSibling.nodeType==3))continue;j++;}return j;},getNextSourceNode:function(h,i,j){if(j&&!j.call){var k=j;j=function(n){return!n.equals(k);};}var l=!h&&this.getFirst&&this.getFirst(),m;if(!l){if(this.type==1&&j&&j(this,true)===false)return null;l=this.getNext();}while(!l&&(m=(m||this).getParent())){if(j&&j(m,true)===false)return null;l=m.getNext();}if(!l)return null;if(j&&j(l)===false)return null;if(i&&i!=l.type)return l.getNextSourceNode(false,i,j);return l;},getPreviousSourceNode:function(h,i,j){if(j&&!j.call){var k=j;j=function(n){return!n.equals(k);};}var l=!h&&this.getLast&&this.getLast(),m;if(!l){if(this.type==1&&j&&j(this,true)===false)return null;l=this.getPrevious();}while(!l&&(m=(m||this).getParent())){if(j&&j(m,true)===false)return null;l=m.getPrevious();}if(!l)return null;if(j&&j(l)===false)return null;if(i&&l.type!=i)return l.getPreviousSourceNode(false,i,j);return l;},getPrevious:function(h){var i=this.$,j;do{i=i.previousSibling;j=i&&i.nodeType!=10&&new d.node(i);}while(j&&h&&!h(j));return j;},getNext:function(h){var i=this.$,j;do{i=i.nextSibling;j=i&&new d.node(i);}while(j&&h&&!h(j));return j;},getParent:function(){var h=this.$.parentNode;return h&&h.nodeType==1?new d.node(h):null;},getParents:function(h){var i=this,j=[];do j[h?'push':'unshift'](i);while(i=i.getParent());return j;},getCommonAncestor:function(h){var j=this;
-if(h.equals(j))return j;if(h.contains&&h.contains(j))return h;var i=j.contains?j:j.getParent();do{if(i.contains(h))return i;}while(i=i.getParent());return null;},getPosition:function(h){var i=this.$,j=h.$;if(i.compareDocumentPosition)return i.compareDocumentPosition(j);if(i==j)return 0;if(this.type==1&&h.type==1){if(i.contains){if(i.contains(j))return 16+4;if(j.contains(i))return 8+2;}if('sourceIndex' in i)return i.sourceIndex<0||j.sourceIndex<0?1:i.sourceIndex<j.sourceIndex?4:2;}var k=this.getAddress(),l=h.getAddress(),m=Math.min(k.length,l.length);for(var n=0;n<=m-1;n++){if(k[n]!=l[n]){if(n<m)return k[n]<l[n]?4:2;break;}}return k.length<l.length?16+4:8+2;},getAscendant:function(h,i){var j=this.$,k;if(!i)j=j.parentNode;while(j){if(j.nodeName&&(k=j.nodeName.toLowerCase(),typeof h=='string'?k==h:k in h))return new d.node(j);j=j.parentNode;}return null;},hasAscendant:function(h,i){var j=this.$;if(!i)j=j.parentNode;while(j){if(j.nodeName&&j.nodeName.toLowerCase()==h)return true;j=j.parentNode;}return false;},move:function(h,i){h.append(this.remove(),i);},remove:function(h){var i=this.$,j=i.parentNode;if(j){if(h)for(var k;k=i.firstChild;)j.insertBefore(i.removeChild(k),i);j.removeChild(i);}return this;},replace:function(h){this.insertBefore(h);h.remove();},trim:function(){this.ltrim();this.rtrim();},ltrim:function(){var k=this;var h;while(k.getFirst&&(h=k.getFirst())){if(h.type==3){var i=e.ltrim(h.getText()),j=h.getLength();if(!i){h.remove();continue;}else if(i.length<j){h.split(j-i.length);k.$.removeChild(k.$.firstChild);}}break;}},rtrim:function(){var k=this;var h;while(k.getLast&&(h=k.getLast())){if(h.type==3){var i=e.rtrim(h.getText()),j=h.getLength();if(!i){h.remove();continue;}else if(i.length<j){h.split(i.length);k.$.lastChild.parentNode.removeChild(k.$.lastChild);}}break;}if(!c&&!b.opera){h=k.$.lastChild;if(h&&h.type==1&&h.nodeName.toLowerCase()=='br')h.parentNode.removeChild(h);}},isReadOnly:function(){var h=this;if(this.type!=1)h=this.getParent();if(h&&typeof h.$.isContentEditable!='undefined')return!(h.$.isContentEditable||h.data('cke-editable'));else{var i=h;while(i){if(i.is('body')||!!i.data('cke-editable'))break;if(i.getAttribute('contentEditable')=='false')return true;else if(i.getAttribute('contentEditable')=='true')break;i=i.getParent();}return false;}}});d.nodeList=function(h){this.$=h;};d.nodeList.prototype={count:function(){return this.$.length;},getItem:function(h){var i=this.$[h];return i?new d.node(i):null;}};d.element=function(h,i){if(typeof h=='string')h=(i?i.$:document).createElement(h);
-d.domObject.call(this,h);};var h=d.element;h.get=function(i){return i&&(i.$?i:new h(i));};h.prototype=new d.node();h.createFromHtml=function(i,j){var k=new h('div',j);k.setHtml(i);return k.getFirst().remove();};h.setMarker=function(i,j,k,l){var m=j.getCustomData('list_marker_id')||j.setCustomData('list_marker_id',e.getNextNumber()).getCustomData('list_marker_id'),n=j.getCustomData('list_marker_names')||j.setCustomData('list_marker_names',{}).getCustomData('list_marker_names');i[m]=j;n[k]=1;return j.setCustomData(k,l);};h.clearAllMarkers=function(i){for(var j in i)h.clearMarkers(i,i[j],1);};h.clearMarkers=function(i,j,k){var l=j.getCustomData('list_marker_names'),m=j.getCustomData('list_marker_id');for(var n in l)j.removeCustomData(n);j.removeCustomData('list_marker_names');if(k){j.removeCustomData('list_marker_id');delete i[m];}};e.extend(h.prototype,{type:1,addClass:function(i){var j=this.$.className;if(j){var k=new RegExp('(?:^|\\s)'+i+'(?:\\s|$)','');if(!k.test(j))j+=' '+i;}this.$.className=j||i;},removeClass:function(i){var j=this.getAttribute('class');if(j){var k=new RegExp('(?:^|\\s+)'+i+'(?=\\s|$)','i');if(k.test(j)){j=j.replace(k,'').replace(/^\s+/,'');if(j)this.setAttribute('class',j);else this.removeAttribute('class');}}},hasClass:function(i){var j=new RegExp('(?:^|\\s+)'+i+'(?=\\s|$)','');return j.test(this.getAttribute('class'));},append:function(i,j){var k=this;if(typeof i=='string')i=k.getDocument().createElement(i);if(j)k.$.insertBefore(i.$,k.$.firstChild);else k.$.appendChild(i.$);return i;},appendHtml:function(i){var k=this;if(!k.$.childNodes.length)k.setHtml(i);else{var j=new h('div',k.getDocument());j.setHtml(i);j.moveChildren(k);}},appendText:function(i){if(this.$.text!=undefined)this.$.text+=i;else this.append(new d.text(i));},appendBogus:function(){var k=this;var i=k.getLast();while(i&&i.type==3&&!e.rtrim(i.getText()))i=i.getPrevious();if(!i||!i.is||!i.is('br')){var j=b.opera?k.getDocument().createText(''):k.getDocument().createElement('br');b.gecko&&j.setAttribute('type','_moz');k.append(j);}},breakParent:function(i){var l=this;var j=new d.range(l.getDocument());j.setStartAfter(l);j.setEndAfter(i);var k=j.extractContents();j.insertNode(l.remove());k.insertAfterNode(l);},contains:c||b.webkit?function(i){var j=this.$;return i.type!=1?j.contains(i.getParent().$):j!=i.$&&j.contains(i.$);}:function(i){return!!(this.$.compareDocumentPosition(i.$)&16);},focus:(function(){function i(){try{this.$.focus();}catch(j){}};return function(j){if(j)e.setTimeout(i,100,this);
-else i.call(this);};})(),getHtml:function(){var i=this.$.innerHTML;return c?i.replace(/<\?[^>]*>/g,''):i;},getOuterHtml:function(){var j=this;if(j.$.outerHTML)return j.$.outerHTML.replace(/<\?[^>]*>/,'');var i=j.$.ownerDocument.createElement('div');i.appendChild(j.$.cloneNode(true));return i.innerHTML;},setHtml:function(i){return this.$.innerHTML=i;},setText:function(i){h.prototype.setText=this.$.innerText!=undefined?function(j){return this.$.innerText=j;}:function(j){return this.$.textContent=j;};return this.setText(i);},getAttribute:(function(){var i=function(j){return this.$.getAttribute(j,2);};if(c&&(b.ie7Compat||b.ie6Compat))return function(j){var n=this;switch(j){case 'class':j='className';break;case 'http-equiv':j='httpEquiv';break;case 'name':return n.$.name;case 'tabindex':var k=i.call(n,j);if(k!==0&&n.$.tabIndex===0)k=null;return k;break;case 'checked':var l=n.$.attributes.getNamedItem(j),m=l.specified?l.nodeValue:n.$.checked;return m?'checked':null;case 'hspace':case 'value':return n.$[j];case 'style':return n.$.style.cssText;case 'contenteditable':case 'contentEditable':return n.$.attributes.getNamedItem('contentEditable').specified?n.$.getAttribute('contentEditable'):null;}return i.call(n,j);};else return i;})(),getChildren:function(){return new d.nodeList(this.$.childNodes);},getComputedStyle:c?function(i){return this.$.currentStyle[e.cssStyleToDomStyle(i)];}:function(i){return this.getWindow().$.getComputedStyle(this.$,'').getPropertyValue(i);},getDtd:function(){var i=f[this.getName()];this.getDtd=function(){return i;};return i;},getElementsByTag:g.prototype.getElementsByTag,getTabIndex:c?function(){var i=this.$.tabIndex;if(i===0&&!f.$tabIndex[this.getName()]&&parseInt(this.getAttribute('tabindex'),10)!==0)i=-1;return i;}:b.webkit?function(){var i=this.$.tabIndex;if(i==undefined){i=parseInt(this.getAttribute('tabindex'),10);if(isNaN(i))i=-1;}return i;}:function(){return this.$.tabIndex;},getText:function(){return this.$.textContent||this.$.innerText||'';},getWindow:function(){return this.getDocument().getWindow();},getId:function(){return this.$.id||null;},getNameAtt:function(){return this.$.name||null;},getName:function(){var i=this.$.nodeName.toLowerCase();if(c&&!(document.documentMode>8)){var j=this.$.scopeName;if(j!='HTML')i=j.toLowerCase()+':'+i;}return(this.getName=function(){return i;})();},getValue:function(){return this.$.value;},getFirst:function(i){var j=this.$.firstChild,k=j&&new d.node(j);if(k&&i&&!i(k))k=k.getNext(i);return k;},getLast:function(i){var j=this.$.lastChild,k=j&&new d.node(j);
-if(k&&i&&!i(k))k=k.getPrevious(i);return k;},getStyle:function(i){return this.$.style[e.cssStyleToDomStyle(i)];},is:function(){var i=this.getName();for(var j=0;j<arguments.length;j++){if(arguments[j]==i)return true;}return false;},isEditable:function(i){var l=this;var j=l.getName();if(l.isReadOnly()||l.getComputedStyle('display')=='none'||l.getComputedStyle('visibility')=='hidden'||l.is('a')&&l.data('cke-saved-name')&&!l.getChildCount()||f.$nonEditable[j]||f.$empty[j])return false;if(i!==false){var k=f[j]||f.span;return k&&k['#'];}return true;},isIdentical:function(i){if(this.getName()!=i.getName())return false;var j=this.$.attributes,k=i.$.attributes,l=j.length,m=k.length;for(var n=0;n<l;n++){var o=j[n];if(o.nodeName=='_moz_dirty')continue;if((!c||o.specified&&o.nodeName!='data-cke-expando')&&o.nodeValue!=i.getAttribute(o.nodeName))return false;}if(c)for(n=0;n<m;n++){o=k[n];if(o.specified&&o.nodeName!='data-cke-expando'&&o.nodeValue!=this.getAttribute(o.nodeName))return false;}return true;},isVisible:function(){var l=this;var i=(l.$.offsetHeight||l.$.offsetWidth)&&l.getComputedStyle('visibility')!='hidden',j,k;if(i&&(b.webkit||b.opera)){j=l.getWindow();if(!j.equals(a.document.getWindow())&&(k=j.$.frameElement))i=new h(k).isVisible();}return!!i;},isEmptyInlineRemoveable:function(){if(!f.$removeEmpty[this.getName()])return false;var i=this.getChildren();for(var j=0,k=i.count();j<k;j++){var l=i.getItem(j);if(l.type==1&&l.data('cke-bookmark'))continue;if(l.type==1&&!l.isEmptyInlineRemoveable()||l.type==3&&e.trim(l.getText()))return false;}return true;},hasAttributes:c&&(b.ie7Compat||b.ie6Compat)?function(){var i=this.$.attributes;for(var j=0;j<i.length;j++){var k=i[j];switch(k.nodeName){case 'class':if(this.getAttribute('class'))return true;case 'data-cke-expando':continue;default:if(k.specified)return true;}}return false;}:function(){var i=this.$.attributes,j=i.length,k={'data-cke-expando':1,_moz_dirty:1};return j>0&&(j>2||!k[i[0].nodeName]||j==2&&!k[i[1].nodeName]);},hasAttribute:(function(){function i(j){var k=this.$.attributes.getNamedItem(j);return!!(k&&k.specified);};return c&&b.version<8?function(j){if(j=='name')return!!this.$.name;return i.call(this,j);}:i;})(),hide:function(){this.setStyle('display','none');},moveChildren:function(i,j){var k=this.$;i=i.$;if(k==i)return;var l;if(j)while(l=k.lastChild)i.insertBefore(k.removeChild(l),i.firstChild);else while(l=k.firstChild)i.appendChild(k.removeChild(l));},mergeSiblings:(function(){function i(j,k,l){if(k&&k.type==1){var m=[];
-while(k.data('cke-bookmark')||k.isEmptyInlineRemoveable()){m.push(k);k=l?k.getNext():k.getPrevious();if(!k||k.type!=1)return;}if(j.isIdentical(k)){var n=l?j.getLast():j.getFirst();while(m.length)m.shift().move(j,!l);k.moveChildren(j,!l);k.remove();if(n&&n.type==1)n.mergeSiblings();}}};return function(j){var k=this;if(!(j===false||f.$removeEmpty[k.getName()]||k.is('a')))return;i(k,k.getNext(),true);i(k,k.getPrevious());};})(),show:function(){this.setStyles({display:'',visibility:''});},setAttribute:(function(){var i=function(j,k){this.$.setAttribute(j,k);return this;};if(c&&(b.ie7Compat||b.ie6Compat))return function(j,k){var l=this;if(j=='class')l.$.className=k;else if(j=='style')l.$.style.cssText=k;else if(j=='tabindex')l.$.tabIndex=k;else if(j=='checked')l.$.checked=k;else if(j=='contenteditable')i.call(l,'contentEditable',k);else i.apply(l,arguments);return l;};else if(b.ie8Compat&&b.secure)return function(j,k){if(j=='src'&&k.match(/^http:\/\//))try{i.apply(this,arguments);}catch(l){}else i.apply(this,arguments);return this;};else return i;})(),setAttributes:function(i){for(var j in i)this.setAttribute(j,i[j]);return this;},setValue:function(i){this.$.value=i;return this;},removeAttribute:(function(){var i=function(j){this.$.removeAttribute(j);};if(c&&(b.ie7Compat||b.ie6Compat))return function(j){if(j=='class')j='className';else if(j=='tabindex')j='tabIndex';else if(j=='contenteditable')j='contentEditable';i.call(this,j);};else return i;})(),removeAttributes:function(i){if(e.isArray(i))for(var j=0;j<i.length;j++)this.removeAttribute(i[j]);else for(var k in i)i.hasOwnProperty(k)&&this.removeAttribute(k);},removeStyle:function(i){var j=this.$.style;j.removeProperty?j.removeProperty(i):j.removeAttribute(e.cssStyleToDomStyle(i));if(!this.$.style.cssText)this.removeAttribute('style');},setStyle:function(i,j){this.$.style[e.cssStyleToDomStyle(i)]=j;return this;},setStyles:function(i){for(var j in i)this.setStyle(j,i[j]);return this;},setOpacity:function(i){if(c&&b.version<9){i=Math.round(i*100);this.setStyle('filter',i>=100?'':'progid:DXImageTransform.Microsoft.Alpha(opacity='+i+')');}else this.setStyle('opacity',i);},unselectable:b.gecko?function(){this.$.style.MozUserSelect='none';this.on('dragstart',function(i){i.data.preventDefault();});}:b.webkit?function(){this.$.style.KhtmlUserSelect='none';this.on('dragstart',function(i){i.data.preventDefault();});}:function(){if(c||b.opera){var i=this.$,j=i.getElementsByTagName('*'),k,l=0;i.unselectable='on';while(k=j[l++])switch(k.tagName.toLowerCase()){case 'iframe':case 'textarea':case 'input':case 'select':break;
-default:k.unselectable='on';}}},getPositionedAncestor:function(){var i=this;while(i.getName()!='html'){if(i.getComputedStyle('position')!='static')return i;i=i.getParent();}return null;},getDocumentPosition:function(i){var D=this;var j=0,k=0,l=D.getDocument(),m=l.getBody(),n=l.$.compatMode=='BackCompat';if(document.documentElement.getBoundingClientRect){var o=D.$.getBoundingClientRect(),p=l.$,q=p.documentElement,r=q.clientTop||m.$.clientTop||0,s=q.clientLeft||m.$.clientLeft||0,t=true;if(c){var u=l.getDocumentElement().contains(D),v=l.getBody().contains(D);t=n&&v||!n&&u;}if(t){j=o.left+(!n&&q.scrollLeft||m.$.scrollLeft);j-=s;k=o.top+(!n&&q.scrollTop||m.$.scrollTop);k-=r;}}else{var w=D,x=null,y;while(w&&!(w.getName()=='body'||w.getName()=='html')){j+=w.$.offsetLeft-w.$.scrollLeft;k+=w.$.offsetTop-w.$.scrollTop;if(!w.equals(D)){j+=w.$.clientLeft||0;k+=w.$.clientTop||0;}var z=x;while(z&&!z.equals(w)){j-=z.$.scrollLeft;k-=z.$.scrollTop;z=z.getParent();}x=w;w=(y=w.$.offsetParent)?new h(y):null;}}if(i){var A=D.getWindow(),B=i.getWindow();if(!A.equals(B)&&A.$.frameElement){var C=new h(A.$.frameElement).getDocumentPosition(i);j+=C.x;k+=C.y;}}if(!document.documentElement.getBoundingClientRect)if(b.gecko&&!n){j+=D.$.clientLeft?1:0;k+=D.$.clientTop?1:0;}return{x:j,y:k};},scrollIntoView:function(i){var j=this.getParent();if(!j)return;do{var k=j.$.clientWidth&&j.$.clientWidth<j.$.scrollWidth||j.$.clientHeight&&j.$.clientHeight<j.$.scrollHeight;if(k)this.scrollIntoParent(j,i,1);if(j.is('html')){var l=j.getWindow();try{var m=l.$.frameElement;m&&(j=new h(m));}catch(n){}}}while(j=j.getParent());},scrollIntoParent:function(i,j,k){!i&&(i=this.getWindow());var l=i.getDocument(),m=l.$.compatMode=='BackCompat';if(i instanceof d.window)i=m?l.getBody():l.getDocumentElement();function n(z,A){if(/body|html/.test(i.getName()))i.getWindow().$.scrollBy(z,A);else{i.$.scrollLeft+=z;i.$.scrollTop+=A;}};function o(z,A){var B={x:0,y:0};if(!z.is(m?'body':'html')){var C=z.$.getBoundingClientRect();B.x=C.left,B.y=C.top;}var D=z.getWindow();if(!D.equals(A)){var E=o(h.get(D.$.frameElement),A);B.x+=E.x,B.y+=E.y;}return B;};function p(z,A){return parseInt(z.getComputedStyle('margin-'+A)||0,10)||0;};var q=i.getWindow(),r=o(this,q),s=o(i,q),t=this.$.offsetHeight,u=this.$.offsetWidth,v=i.$.clientHeight,w=i.$.clientWidth,x,y;x={x:r.x-p(this,'left')-s.x||0,y:r.y-p(this,'top')-s.y||0};y={x:r.x+u+p(this,'right')-(s.x+w)||0,y:r.y+t+p(this,'bottom')-(s.y+v)||0};if(x.y<0||y.y>0)n(0,j===true?x.y:j===false?y.y:x.y<0?x.y:y.y);
-if(k&&(x.x<0||y.x>0))n(x.x<0?x.x:y.x,0);},setState:function(i){var j=this;switch(i){case 1:j.addClass('cke_on');j.removeClass('cke_off');j.removeClass('cke_disabled');break;case 0:j.addClass('cke_disabled');j.removeClass('cke_off');j.removeClass('cke_on');break;default:j.addClass('cke_off');j.removeClass('cke_on');j.removeClass('cke_disabled');break;}},getFrameDocument:function(){var i=this.$;try{i.contentWindow.document;}catch(j){i.src=i.src;if(c&&b.version<7)window.showModalDialog('javascript:document.write("<script>window.setTimeout(function(){window.close();},50);</script>")');}return i&&new g(i.contentWindow.document);},copyAttributes:function(i,j){var p=this;var k=p.$.attributes;j=j||{};for(var l=0;l<k.length;l++){var m=k[l],n=m.nodeName.toLowerCase(),o;if(n in j)continue;if(n=='checked'&&(o=p.getAttribute(n)))i.setAttribute(n,o);else if(m.specified||c&&m.nodeValue&&n=='value'){o=p.getAttribute(n);if(o===null)o=m.nodeValue;i.setAttribute(n,o);}}if(p.$.style.cssText!=='')i.$.style.cssText=p.$.style.cssText;},renameNode:function(i){var l=this;if(l.getName()==i)return;var j=l.getDocument(),k=new h(i,j);l.copyAttributes(k);l.moveChildren(k);l.getParent()&&l.$.parentNode.replaceChild(k.$,l.$);k.$['data-cke-expando']=l.$['data-cke-expando'];l.$=k.$;},getChild:function(i){var j=this.$;if(!i.slice)j=j.childNodes[i];else while(i.length>0&&j)j=j.childNodes[i.shift()];return j?new d.node(j):null;},getChildCount:function(){return this.$.childNodes.length;},disableContextMenu:function(){this.on('contextmenu',function(i){if(!i.data.getTarget().hasClass('cke_enable_context_menu'))i.data.preventDefault();});},getDirection:function(i){var j=this;return i?j.getComputedStyle('direction')||j.getDirection()||j.getDocument().$.dir||j.getDocument().getBody().getDirection(1):j.getStyle('direction')||j.getAttribute('dir');},data:function(i,j){i='data-'+i;if(j===undefined)return this.getAttribute(i);else if(j===false)this.removeAttribute(i);else this.setAttribute(i,j);return null;}});(function(){var i={width:['border-left-width','border-right-width','padding-left','padding-right'],height:['border-top-width','border-bottom-width','padding-top','padding-bottom']};function j(k){var l=0;for(var m=0,n=i[k].length;m<n;m++)l+=parseInt(this.getComputedStyle(i[k][m])||0,10)||0;return l;};h.prototype.setSize=function(k,l,m){if(typeof l=='number'){if(m&&!(c&&b.quirks))l-=j.call(this,k);this.setStyle(k,l+'px');}};h.prototype.getSize=function(k,l){var m=Math.max(this.$['offset'+e.capitalize(k)],this.$['client'+e.capitalize(k)])||0;
-if(l)m-=j.call(this,k);return m;};})();a.command=function(i,j){this.uiItems=[];this.exec=function(k){var l=this;if(l.state==0)return false;if(l.editorFocus)i.focus();if(l.fire('exec')===true)return true;return j.exec.call(l,i,k)!==false;};this.refresh=function(){if(this.fire('refresh')===true)return true;return j.refresh&&j.refresh.apply(this,arguments)!==false;};e.extend(this,j,{modes:{wysiwyg:1},editorFocus:1,state:2});a.event.call(this);};a.command.prototype={enable:function(){var i=this;if(i.state==0)i.setState(!i.preserveState||typeof i.previousState=='undefined'?2:i.previousState);},disable:function(){this.setState(0);},setState:function(i){var j=this;if(j.state==i)return false;j.previousState=j.state;j.state=i;j.fire('state');return true;},toggleState:function(){var i=this;if(i.state==2)i.setState(1);else if(i.state==1)i.setState(2);}};a.event.implementOn(a.command.prototype,true);a.ENTER_P=1;a.ENTER_BR=2;a.ENTER_DIV=3;a.config={customConfig:'config.js',autoUpdateElement:true,baseHref:'',contentsCss:a.basePath+'contents.css',contentsLangDirection:'ui',contentsLanguage:'',language:'',defaultLanguage:'en',enterMode:1,forceEnterMode:false,shiftEnterMode:2,corePlugins:'',docType:'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',bodyId:'',bodyClass:'',fullPage:false,height:200,plugins:'about,a11yhelp,basicstyles,bidi,blockquote,button,clipboard,colorbutton,colordialog,contextmenu,dialogadvtab,div,elementspath,enterkey,entities,filebrowser,find,flash,font,format,forms,horizontalrule,htmldataprocessor,iframe,image,indent,justify,keystrokes,link,list,liststyle,maximize,newpage,pagebreak,pastefromword,pastetext,popup,preview,print,removeformat,resize,save,scayt,showblocks,showborders,smiley,sourcearea,specialchar,stylescombo,tab,table,tabletools,templates,toolbar,undo,wsc,wysiwygarea',extraPlugins:'',removePlugins:'',protectedSource:[],tabIndex:0,theme:'default',skin:'kama',width:'',baseFloatZIndex:10000};var i=a.config;a.focusManager=function(j){if(j.focusManager)return j.focusManager;this.hasFocus=false;this._={editor:j};return this;};a.focusManager.prototype={focus:function(){var k=this;if(k._.timer)clearTimeout(k._.timer);if(!k.hasFocus){if(a.currentInstance)a.currentInstance.focusManager.forceBlur();var j=k._.editor;j.container.getChild(1).addClass('cke_focus');k.hasFocus=true;j.fire('focus');}},blur:function(){var j=this;if(j._.timer)clearTimeout(j._.timer);j._.timer=setTimeout(function(){delete j._.timer;
-j.forceBlur();},100);},forceBlur:function(){if(this.hasFocus){var j=this._.editor;j.container.getChild(1).removeClass('cke_focus');this.hasFocus=false;j.fire('blur');}}};(function(){var j={};a.lang={languages:{af:1,ar:1,bg:1,bn:1,bs:1,ca:1,cs:1,cy:1,da:1,de:1,el:1,'en-au':1,'en-ca':1,'en-gb':1,en:1,eo:1,es:1,et:1,eu:1,fa:1,fi:1,fo:1,'fr-ca':1,fr:1,gl:1,gu:1,he:1,hi:1,hr:1,hu:1,is:1,it:1,ja:1,ka:1,km:1,ko:1,lt:1,lv:1,mn:1,ms:1,nb:1,nl:1,no:1,pl:1,'pt-br':1,pt:1,ro:1,ru:1,sk:1,sl:1,'sr-latn':1,sr:1,sv:1,th:1,tr:1,uk:1,vi:1,'zh-cn':1,zh:1},load:function(k,l,m){if(!k||!a.lang.languages[k])k=this.detect(l,k);if(!this[k])a.scriptLoader.load(a.getUrl('lang/'+k+'.js'),function(){m(k,this[k]);},this);else m(k,this[k]);},detect:function(k,l){var m=this.languages;l=l||navigator.userLanguage||navigator.language||k;var n=l.toLowerCase().match(/([a-z]+)(?:-([a-z]+))?/),o=n[1],p=n[2];if(m[o+'-'+p])o=o+'-'+p;else if(!m[o])o=null;a.lang.detect=o?function(){return o;}:function(q){return q;};return o||k;}};})();a.scriptLoader=(function(){var j={},k={};return{load:function(l,m,n,o){var p=typeof l=='string';if(p)l=[l];if(!n)n=a;var q=l.length,r=[],s=[],t=function(y){if(m)if(p)m.call(n,y);else m.call(n,r,s);};if(q===0){t(true);return;}var u=function(y,z){(z?r:s).push(y);if(--q<=0){o&&a.document.getDocumentElement().removeStyle('cursor');t(z);}},v=function(y,z){j[y]=1;var A=k[y];delete k[y];for(var B=0;B<A.length;B++)A[B](y,z);},w=function(y){if(j[y]){u(y,true);return;}var z=k[y]||(k[y]=[]);z.push(u);if(z.length>1)return;var A=new h('script');A.setAttributes({type:'text/javascript',src:y});if(m)if(c)A.$.onreadystatechange=function(){if(A.$.readyState=='loaded'||A.$.readyState=='complete'){A.$.onreadystatechange=null;v(y,true);}};else{A.$.onload=function(){setTimeout(function(){v(y,true);},0);};A.$.onerror=function(){v(y,false);};}A.appendTo(a.document.getHead());};o&&a.document.getDocumentElement().setStyle('cursor','wait');for(var x=0;x<q;x++)w(l[x]);}};})();a.resourceManager=function(j,k){var l=this;l.basePath=j;l.fileName=k;l.registered={};l.loaded={};l.externals={};l._={waitingList:{}};};a.resourceManager.prototype={add:function(j,k){if(this.registered[j])throw '[CKEDITOR.resourceManager.add] The resource name "'+j+'" is already registered.';a.fire(j+e.capitalize(this.fileName)+'Ready',this.registered[j]=k||{});},get:function(j){return this.registered[j]||null;},getPath:function(j){var k=this.externals[j];return a.getUrl(k&&k.dir||this.basePath+j+'/');},getFilePath:function(j){var k=this.externals[j];
-return a.getUrl(this.getPath(j)+(k&&typeof k.file=='string'?k.file:this.fileName+'.js'));},addExternal:function(j,k,l){j=j.split(',');for(var m=0;m<j.length;m++){var n=j[m];this.externals[n]={dir:k,file:l};}},load:function(j,k,l){if(!e.isArray(j))j=j?[j]:[];var m=this.loaded,n=this.registered,o=[],p={},q={};for(var r=0;r<j.length;r++){var s=j[r];if(!s)continue;if(!m[s]&&!n[s]){var t=this.getFilePath(s);o.push(t);if(!(t in p))p[t]=[];p[t].push(s);}else q[s]=this.get(s);}a.scriptLoader.load(o,function(u,v){if(v.length)throw '[CKEDITOR.resourceManager.load] Resource name "'+p[v[0]].join(',')+'" was not found at "'+v[0]+'".';for(var w=0;w<u.length;w++){var x=p[u[w]];for(var y=0;y<x.length;y++){var z=x[y];q[z]=this.get(z);m[z]=1;}}k.call(l,q);},this);}};a.plugins=new a.resourceManager('plugins/','plugin');var j=a.plugins;j.load=e.override(j.load,function(k){return function(l,m,n){var o={},p=function(q){k.call(this,q,function(r){e.extend(o,r);var s=[];for(var t in r){var u=r[t],v=u&&u.requires;if(v)for(var w=0;w<v.length;w++){if(!o[v[w]])s.push(v[w]);}}if(s.length)p.call(this,s);else{for(t in o){u=o[t];if(u.onLoad&&!u.onLoad._called){u.onLoad();u.onLoad._called=1;}}if(m)m.call(n||window,o);}},this);};p.call(this,l);};});j.setLang=function(k,l,m){var n=this.get(k),o=n.langEntries||(n.langEntries={}),p=n.lang||(n.lang=[]);if(e.indexOf(p,l)==-1)p.push(l);o[l]=m;};a.skins=(function(){var k={},l={},m=function(n,o,p,q){var r=k[o];if(!n.skin){n.skin=r;if(r.init)r.init(n);}var s=function(B){for(var C=0;C<B.length;C++)B[C]=a.getUrl(l[o]+B[C]);};function t(B,C){return B.replace(/url\s*\(([\s'"]*)(.*?)([\s"']*)\)/g,function(D,E,F,G){if(/^\/|^\w?:/.test(F))return D;else return 'url('+C+E+F+G+')';});};p=r[p];var u=!p||!!p._isLoaded;if(u)q&&q();else{var v=p._pending||(p._pending=[]);v.push(q);if(v.length>1)return;var w=!p.css||!p.css.length,x=!p.js||!p.js.length,y=function(){if(w&&x){p._isLoaded=1;for(var B=0;B<v.length;B++){if(v[B])v[B]();}}};if(!w){var z=p.css;if(e.isArray(z)){s(z);for(var A=0;A<z.length;A++)a.document.appendStyleSheet(z[A]);}else{z=t(z,a.getUrl(l[o]));a.document.appendStyleText(z);}p.css=z;w=1;}if(!x){s(p.js);a.scriptLoader.load(p.js,function(){x=1;y();});}y();}};return{add:function(n,o){k[n]=o;o.skinPath=l[n]||(l[n]=a.getUrl('skins/'+n+'/'));},load:function(n,o,p){var q=n.skinName,r=n.skinPath;if(k[q])m(n,q,o,p);else{l[q]=r;a.scriptLoader.load(a.getUrl(r+'skin.js'),function(){m(n,q,o,p);});}}};})();a.themes=new a.resourceManager('themes/','theme');a.ui=function(k){if(k.ui)return k.ui;
-this._={handlers:{},items:{},editor:k};return this;};var k=a.ui;k.prototype={add:function(l,m,n){this._.items[l]={type:m,command:n.command||null,args:Array.prototype.slice.call(arguments,2)};},create:function(l){var q=this;var m=q._.items[l],n=m&&q._.handlers[m.type],o=m&&m.command&&q._.editor.getCommand(m.command),p=n&&n.create.apply(q,m.args);m&&(p=e.extend(p,q._.editor.skin[m.type],true));if(o)o.uiItems.push(p);return p;},addHandler:function(l,m){this._.handlers[l]=m;}};a.event.implementOn(k);(function(){var l=0,m=function(){var x='editor'+ ++l;return a.instances&&a.instances[x]?m():x;},n={},o=function(x){var y=x.config.customConfig;if(!y)return false;y=a.getUrl(y);var z=n[y]||(n[y]={});if(z.fn){z.fn.call(x,x.config);if(a.getUrl(x.config.customConfig)==y||!o(x))x.fireOnce('customConfigLoaded');}else a.scriptLoader.load(y,function(){if(a.editorConfig)z.fn=a.editorConfig;else z.fn=function(){};o(x);});return true;},p=function(x,y){x.on('customConfigLoaded',function(){if(y){if(y.on)for(var z in y.on)x.on(z,y.on[z]);e.extend(x.config,y,true);delete x.config.on;}q(x);});if(y&&y.customConfig!=undefined)x.config.customConfig=y.customConfig;if(!o(x))x.fireOnce('customConfigLoaded');},q=function(x){var y=x.config.skin.split(','),z=y[0],A=a.getUrl(y[1]||'skins/'+z+'/');x.skinName=z;x.skinPath=A;x.skinClass='cke_skin_'+z;x.tabIndex=x.config.tabIndex||x.element.getAttribute('tabindex')||0;x.readOnly=!!(x.config.readOnly||x.element.getAttribute('disabled'));x.fireOnce('configLoaded');t(x);},r=function(x){a.lang.load(x.config.language,x.config.defaultLanguage,function(y,z){x.langCode=y;x.lang=e.prototypedCopy(z);if(b.gecko&&b.version<10900&&x.lang.dir=='rtl')x.lang.dir='ltr';x.fire('langLoaded');var A=x.config;A.contentsLangDirection=='ui'&&(A.contentsLangDirection=x.lang.dir);s(x);});},s=function(x){var y=x.config,z=y.plugins,A=y.extraPlugins,B=y.removePlugins;if(A){var C=new RegExp('(?:^|,)(?:'+A.replace(/\s*,\s*/g,'|')+')(?=,|$)','g');z=z.replace(C,'');z+=','+A;}if(B){C=new RegExp('(?:^|,)(?:'+B.replace(/\s*,\s*/g,'|')+')(?=,|$)','g');z=z.replace(C,'');}b.air&&(z+=',adobeair');j.load(z.split(','),function(D){var E=[],F=[],G=[];x.plugins=D;for(var H in D){var I=D[H],J=I.lang,K=j.getPath(H),L=null;I.path=K;if(J){L=e.indexOf(J,x.langCode)>=0?x.langCode:J[0];if(!I.langEntries||!I.langEntries[L])G.push(a.getUrl(K+'lang/'+L+'.js'));else{e.extend(x.lang,I.langEntries[L]);L=null;}}F.push(L);E.push(I);}a.scriptLoader.load(G,function(){var M=['beforeInit','init','afterInit'];
-for(var N=0;N<M.length;N++)for(var O=0;O<E.length;O++){var P=E[O];if(N===0&&F[O]&&P.lang)e.extend(x.lang,P.langEntries[F[O]]);if(P[M[N]])P[M[N]](x);}x.fire('pluginsLoaded');u(x);});});},t=function(x){a.skins.load(x,'editor',function(){r(x);});},u=function(x){var y=x.config.theme;a.themes.load(y,function(){var z=x.theme=a.themes.get(y);z.path=a.themes.getPath(y);z.build(x);if(x.config.autoUpdateElement)v(x);});},v=function(x){var y=x.element;if(x.elementMode==1&&y.is('textarea')){var z=y.$.form&&new h(y.$.form);if(z){function A(){x.updateElement();};z.on('submit',A);if(!z.$.submit.nodeName&&!z.$.submit.length)z.$.submit=e.override(z.$.submit,function(B){return function(){x.updateElement();if(B.apply)B.apply(this,arguments);else B();};});x.on('destroy',function(){z.removeListener('submit',A);});}}};function w(){var x,y=this._.commands,z=this.mode;if(!z)return;for(var A in y){x=y[A];x[x.startDisabled?'disable':this.readOnly&&!x.readOnly?'disable':x.modes[z]?'enable':'disable']();}};a.editor.prototype._init=function(){var z=this;var x=h.get(z._.element),y=z._.instanceConfig;delete z._.element;delete z._.instanceConfig;z._.commands={};z._.styles=[];z.element=x;z.name=x&&z.elementMode==1&&(x.getId()||x.getNameAtt())||m();if(z.name in a.instances)throw '[CKEDITOR.editor] The instance "'+z.name+'" already exists.';z.id=e.getNextId();z.config=e.prototypedCopy(i);z.ui=new k(z);z.focusManager=new a.focusManager(z);a.fire('instanceCreated',null,z);z.on('mode',w,null,null,1);z.on('readOnly',w,null,null,1);p(z,y);};})();e.extend(a.editor.prototype,{addCommand:function(l,m){return this._.commands[l]=new a.command(this,m);},addCss:function(l){this._.styles.push(l);},destroy:function(l){var m=this;if(!l)m.updateElement();m.fire('destroy');m.theme&&m.theme.destroy(m);a.remove(m);a.fire('instanceDestroyed',null,m);},execCommand:function(l,m){var n=this.getCommand(l),o={name:l,commandData:m,command:n};if(n&&n.state!=0)if(this.fire('beforeCommandExec',o)!==true){o.returnValue=n.exec(o.commandData);if(!n.async&&this.fire('afterCommandExec',o)!==true)return o.returnValue;}return false;},getCommand:function(l){return this._.commands[l];},getData:function(){var n=this;n.fire('beforeGetData');var l=n._.data;if(typeof l!='string'){var m=n.element;if(m&&n.elementMode==1)l=m.is('textarea')?m.getValue():m.getHtml();else l='';}l={dataValue:l};n.fire('getData',l);return l.dataValue;},getSnapshot:function(){var l=this.fire('getSnapshot');if(typeof l!='string'){var m=this.element;if(m&&this.elementMode==1)l=m.is('textarea')?m.getValue():m.getHtml();
-}return l;},loadSnapshot:function(l){this.fire('loadSnapshot',l);},setData:function(l,m,n){if(m)this.on('dataReady',function(p){p.removeListener();m.call(p.editor);});var o={dataValue:l};!n&&this.fire('setData',o);this._.data=o.dataValue;!n&&this.fire('afterSetData',o);},setReadOnly:function(l){l=l==undefined||l;if(this.readOnly!=l){this.readOnly=l;this.fire('readOnly');}},insertHtml:function(l){this.fire('insertHtml',l);},insertText:function(l){this.fire('insertText',l);},insertElement:function(l){this.fire('insertElement',l);},checkDirty:function(){return this.mayBeDirty&&this._.previousValue!==this.getSnapshot();},resetDirty:function(){if(this.mayBeDirty)this._.previousValue=this.getSnapshot();},updateElement:function(){var n=this;var l=n.element;if(l&&n.elementMode==1){var m=n.getData();if(n.config.htmlEncodeOutput)m=e.htmlEncode(m);if(l.is('textarea'))l.setValue(m);else l.setHtml(m);}}});a.on('loaded',function(){var l=a.editor._pending;if(l){delete a.editor._pending;for(var m=0;m<l.length;m++)l[m]._init();}});a.htmlParser=function(){this._={htmlPartsRegex:new RegExp("<(?:(?:\\/([^>]+)>)|(?:!--([\\S|\\s]*?)-->)|(?:([^\\s>]+)\\s*((?:(?:\"[^\"]*\")|(?:'[^']*')|[^\"'>])*)\\/?>))",'g')};};(function(){var l=/([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,m={checked:1,compact:1,declare:1,defer:1,disabled:1,ismap:1,multiple:1,nohref:1,noresize:1,noshade:1,nowrap:1,readonly:1,selected:1};a.htmlParser.prototype={onTagOpen:function(){},onTagClose:function(){},onText:function(){},onCDATA:function(){},onComment:function(){},parse:function(n){var A=this;var o,p,q=0,r;while(o=A._.htmlPartsRegex.exec(n)){var s=o.index;if(s>q){var t=n.substring(q,s);if(r)r.push(t);else A.onText(t);}q=A._.htmlPartsRegex.lastIndex;if(p=o[1]){p=p.toLowerCase();if(r&&f.$cdata[p]){A.onCDATA(r.join(''));r=null;}if(!r){A.onTagClose(p);continue;}}if(r){r.push(o[0]);continue;}if(p=o[3]){p=p.toLowerCase();if(/="/.test(p))continue;var u={},v,w=o[4],x=!!(w&&w.charAt(w.length-1)=='/');if(w)while(v=l.exec(w)){var y=v[1].toLowerCase(),z=v[2]||v[3]||v[4]||'';if(!z&&m[y])u[y]=y;else u[y]=z;}A.onTagOpen(p,u,x);if(!r&&f.$cdata[p])r=[];continue;}if(p=o[2])A.onComment(p);}if(n.length>q)A.onText(n.substring(q,n.length));}};})();a.htmlParser.comment=function(l){this.value=l;this._={isBlockLike:false};};a.htmlParser.comment.prototype={type:8,writeHtml:function(l,m){var n=this.value;if(m){if(!(n=m.onComment(n,this)))return;if(typeof n!='string'){n.parent=this.parent;n.writeHtml(l,m);
-return;}}l.comment(n);}};(function(){a.htmlParser.text=function(l){this.value=l;this._={isBlockLike:false};};a.htmlParser.text.prototype={type:3,writeHtml:function(l,m){var n=this.value;if(m&&!(n=m.onText(n,this)))return;l.text(n);}};})();(function(){a.htmlParser.cdata=function(l){this.value=l;};a.htmlParser.cdata.prototype={type:3,writeHtml:function(l){l.write(this.value);}};})();a.htmlParser.fragment=function(){this.children=[];this.parent=null;this._={isBlockLike:true,hasInlineStarted:false};};(function(){var l=e.extend({table:1,ul:1,ol:1,dl:1},f.table,f.ul,f.ol,f.dl),m=c&&b.version<8?{dd:1,dt:1}:{},n={ol:1,ul:1},o=e.extend({},{html:1},f.html,f.body,f.head,{style:1,script:1});function p(q){return q.name=='a'&&q.attributes.href||f.$removeEmpty[q.name];};a.htmlParser.fragment.fromHtml=function(q,r,s){var t=new a.htmlParser(),u=s||new a.htmlParser.fragment(),v=[],w=[],x=u,y=false,z=false;function A(D){var E;if(v.length>0)for(var F=0;F<v.length;F++){var G=v[F],H=G.name,I=f[H],J=x.name&&f[x.name];if((!J||J[H])&&(!D||!I||I[D]||!f[D])){if(!E){B();E=1;}G=G.clone();G.parent=x;x=G;v.splice(F,1);F--;}else if(H==x.name)C(x,x.parent,1),F--;}};function B(){while(w.length)C(w.shift(),x);};function C(D,E,F){if(D.previous!==undefined)return;E=E||x||u;var G=x;if(r&&(!E.type||E.name=='body')){var H,I;if(D.attributes&&(I=D.attributes['data-cke-real-element-type']))H=I;else H=D.name;if(H&&!(H in f.$body||H=='body'||D.isOrphan)){x=E;t.onTagOpen(r,{});D.returnPoint=E=x;}}if(D._.isBlockLike&&D.name!='pre'&&D.name!='textarea'){var J=D.children.length,K=D.children[J-1],L;if(K&&K.type==3)if(!(L=e.rtrim(K.value)))D.children.length=J-1;else K.value=L;}E.add(D);if(D.name=='pre')z=false;if(D.name=='textarea')y=false;if(D.returnPoint){x=D.returnPoint;delete D.returnPoint;}else x=F?E:G;};t.onTagOpen=function(D,E,F,G){var H=new a.htmlParser.element(D,E);if(H.isUnknown&&F)H.isEmpty=true;H.isOptionalClose=D in m||G;if(p(H)){v.push(H);return;}else if(D=='pre')z=true;else if(D=='br'&&z){x.add(new a.htmlParser.text('\n'));return;}else if(D=='textarea')y=true;if(D=='br'){w.push(H);return;}while(1){var I=x.name,J=I?f[I]||(x._.isBlockLike?f.div:f.span):o;if(!H.isUnknown&&!x.isUnknown&&!J[D]){if(x.isOptionalClose)t.onTagClose(I);else if(D in n&&I in n){var K=x.children,L=K[K.length-1];if(!(L&&L.name=='li'))C(L=new a.htmlParser.element('li'),x);!H.returnPoint&&(H.returnPoint=x);x=L;}else if(D in f.$listItem&&I!=D)t.onTagOpen(D=='li'?'ul':'dl',{},0,1);else if(I in l&&I!=D){!H.returnPoint&&(H.returnPoint=x);
-x=x.parent;}else{if(I in f.$inline)v.unshift(x);if(x.parent)C(x,x.parent,1);else{H.isOrphan=1;break;}}}else break;}A(D);B();H.parent=x;if(H.isEmpty)C(H);else x=H;};t.onTagClose=function(D){for(var E=v.length-1;E>=0;E--){if(D==v[E].name){v.splice(E,1);return;}}var F=[],G=[],H=x;while(H!=u&&H.name!=D){if(!H._.isBlockLike)G.unshift(H);F.push(H);H=H.returnPoint||H.parent;}if(H!=u){for(E=0;E<F.length;E++){var I=F[E];C(I,I.parent);}x=H;if(H._.isBlockLike)B();C(H,H.parent);if(H==x)x=x.parent;v=v.concat(G);}if(D=='body')r=false;};t.onText=function(D){if((!x._.hasInlineStarted||w.length)&&!z&&!y){D=e.ltrim(D);if(D.length===0)return;}var E=x.name,F=E?f[E]||(x._.isBlockLike?f.div:f.span):o;if(!y&&!F['#']&&E in l){t.onTagOpen(E in n?'li':E=='dl'?'dd':E=='table'?'tr':E=='tr'?'td':'');t.onText(D);return;}B();A();if(r&&(!x.type||x.name=='body')&&e.trim(D))this.onTagOpen(r,{},0,1);if(!z&&!y)D=D.replace(/[\t\r\n ]{2,}|[\t\r\n]/g,' ');x.add(new a.htmlParser.text(D));};t.onCDATA=function(D){x.add(new a.htmlParser.cdata(D));};t.onComment=function(D){B();A();x.add(new a.htmlParser.comment(D));};t.parse(q);B(!c&&1);while(x!=u)C(x,x.parent,1);return u;};a.htmlParser.fragment.prototype={add:function(q,r){var t=this;isNaN(r)&&(r=t.children.length);var s=r>0?t.children[r-1]:null;if(s){if(q._.isBlockLike&&s.type==3){s.value=e.rtrim(s.value);if(s.value.length===0){t.children.pop();t.add(q);return;}}s.next=q;}q.previous=s;q.parent=t;t.children.splice(r,0,q);t._.hasInlineStarted=q.type==3||q.type==1&&!q._.isBlockLike;},writeHtml:function(q,r){var s;this.filterChildren=function(){var t=new a.htmlParser.basicWriter();this.writeChildrenHtml.call(this,t,r,true);var u=t.getHtml();this.children=new a.htmlParser.fragment.fromHtml(u).children;s=1;};!this.name&&r&&r.onFragment(this);this.writeChildrenHtml(q,s?null:r);},writeChildrenHtml:function(q,r){for(var s=0;s<this.children.length;s++)this.children[s].writeHtml(q,r);}};})();a.htmlParser.element=function(l,m){var q=this;q.name=l;q.attributes=m||{};q.children=[];var n=l||'',o=n.match(/^cke:(.*)/);o&&(n=o[1]);var p=!!(f.$nonBodyContent[n]||f.$block[n]||f.$listItem[n]||f.$tableContent[n]||f.$nonEditable[n]||n=='br');q.isEmpty=!!f.$empty[l];q.isUnknown=!f[l];q._={isBlockLike:p,hasInlineStarted:q.isEmpty||!p};};a.htmlParser.cssStyle=function(){var l,m=arguments[0],n={};l=m instanceof a.htmlParser.element?m.attributes.style:m;(l||'').replace(/"/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(o,p,q){p=='font-family'&&(q=q.replace(/["']/g,''));
-n[p.toLowerCase()]=q;});return{rules:n,populate:function(o){var p=this.toString();if(p)o instanceof h?o.setAttribute('style',p):o instanceof a.htmlParser.element?o.attributes.style=p:o.style=p;},'toString':function(){var o=[];for(var p in n)n[p]&&o.push(p,':',n[p],';');return o.join('');}};};(function(){var l=function(m,n){m=m[0];n=n[0];return m<n?-1:m>n?1:0;};a.htmlParser.element.prototype={type:1,add:a.htmlParser.fragment.prototype.add,clone:function(){return new a.htmlParser.element(this.name,this.attributes);},writeHtml:function(m,n){var o=this.attributes,p=this,q=p.name,r,s,t,u;p.filterChildren=function(){if(!u){var B=new a.htmlParser.basicWriter();a.htmlParser.fragment.prototype.writeChildrenHtml.call(p,B,n);p.children=new a.htmlParser.fragment.fromHtml(B.getHtml(),0,p.clone()).children;u=1;}};if(n){for(;;){if(!(q=n.onElementName(q)))return;p.name=q;if(!(p=n.onElement(p)))return;p.parent=this.parent;if(p.name==q)break;if(p.type!=1){p.writeHtml(m,n);return;}q=p.name;if(!q){for(var v=0,w=this.children.length;v<w;v++)this.children[v].parent=p.parent;this.writeChildrenHtml.call(p,m,u?null:n);return;}}o=p.attributes;}m.openTag(q,o);var x=[];for(var y=0;y<2;y++)for(r in o){s=r;t=o[r];if(y==1)x.push([r,t]);else if(n){for(;;){if(!(s=n.onAttributeName(r))){delete o[r];break;}else if(s!=r){delete o[r];r=s;continue;}else break;}if(s)if((t=n.onAttribute(p,s,t))===false)delete o[s];else o[s]=t;}}if(m.sortAttributes)x.sort(l);var z=x.length;for(y=0;y<z;y++){var A=x[y];m.attribute(A[0],A[1]);}m.openTagClose(q,p.isEmpty);if(!p.isEmpty){this.writeChildrenHtml.call(p,m,u?null:n);m.closeTag(q);}},writeChildrenHtml:function(m,n){a.htmlParser.fragment.prototype.writeChildrenHtml.apply(this,arguments);}};})();(function(){a.htmlParser.filter=e.createClass({$:function(q){this._={elementNames:[],attributeNames:[],elements:{$length:0},attributes:{$length:0}};if(q)this.addRules(q,10);},proto:{addRules:function(q,r){var s=this;if(typeof r!='number')r=10;m(s._.elementNames,q.elementNames,r);m(s._.attributeNames,q.attributeNames,r);n(s._.elements,q.elements,r);n(s._.attributes,q.attributes,r);s._.text=o(s._.text,q.text,r)||s._.text;s._.comment=o(s._.comment,q.comment,r)||s._.comment;s._.root=o(s._.root,q.root,r)||s._.root;},onElementName:function(q){return l(q,this._.elementNames);},onAttributeName:function(q){return l(q,this._.attributeNames);},onText:function(q){var r=this._.text;return r?r.filter(q):q;},onComment:function(q,r){var s=this._.comment;return s?s.filter(q,r):q;},onFragment:function(q){var r=this._.root;
-return r?r.filter(q):q;},onElement:function(q){var v=this;var r=[v._.elements['^'],v._.elements[q.name],v._.elements.$],s,t;for(var u=0;u<3;u++){s=r[u];if(s){t=s.filter(q,v);if(t===false)return null;if(t&&t!=q)return v.onNode(t);if(q.parent&&!q.name)break;}}return q;},onNode:function(q){var r=q.type;return r==1?this.onElement(q):r==3?new a.htmlParser.text(this.onText(q.value)):r==8?new a.htmlParser.comment(this.onComment(q.value)):null;},onAttribute:function(q,r,s){var t=this._.attributes[r];if(t){var u=t.filter(s,q,this);if(u===false)return false;if(typeof u!='undefined')return u;}return s;}}});function l(q,r){for(var s=0;q&&s<r.length;s++){var t=r[s];q=q.replace(t[0],t[1]);}return q;};function m(q,r,s){if(typeof r=='function')r=[r];var t,u,v=q.length,w=r&&r.length;if(w){for(t=0;t<v&&q[t].pri<s;t++){}for(u=w-1;u>=0;u--){var x=r[u];if(x){x.pri=s;q.splice(t,0,x);}}}};function n(q,r,s){if(r)for(var t in r){var u=q[t];q[t]=o(u,r[t],s);if(!u)q.$length++;}};function o(q,r,s){if(r){r.pri=s;if(q){if(!q.splice){if(q.pri>s)q=[r,q];else q=[q,r];q.filter=p;}else m(q,r,s);return q;}else{r.filter=r;return r;}}};function p(q){var r=q.type||q instanceof a.htmlParser.fragment;for(var s=0;s<this.length;s++){if(r)var t=q.type,u=q.name;var v=this[s],w=v.apply(window,arguments);if(w===false)return w;if(r){if(w&&(w.name!=u||w.type!=t))return w;}else if(typeof w!='string')return w;w!=undefined&&(q=w);}return q;};})();a.htmlParser.basicWriter=e.createClass({$:function(){this._={output:[]};},proto:{openTag:function(l,m){this._.output.push('<',l);},openTagClose:function(l,m){if(m)this._.output.push(' />');else this._.output.push('>');},attribute:function(l,m){if(typeof m=='string')m=e.htmlEncodeAttr(m);this._.output.push(' ',l,'="',m,'"');},closeTag:function(l){this._.output.push('</',l,'>');},text:function(l){this._.output.push(l);},comment:function(l){this._.output.push('<!--',l,'-->');},write:function(l){this._.output.push(l);},reset:function(){this._.output=[];this._.indent=false;},getHtml:function(l){var m=this._.output.join('');if(l)this.reset();return m;}}});delete a.loadFullCore;a.instances={};a.document=new g(document);a.add=function(l){a.instances[l.name]=l;l.on('focus',function(){if(a.currentInstance!=l){a.currentInstance=l;a.fire('currentInstance');}});l.on('blur',function(){if(a.currentInstance==l){a.currentInstance=null;a.fire('currentInstance');}});};a.remove=function(l){delete a.instances[l.name];};a.on('instanceDestroyed',function(){if(e.isEmpty(this.instances))a.fire('reset');
-});a.TRISTATE_ON=1;a.TRISTATE_OFF=2;a.TRISTATE_DISABLED=0;d.comment=function(l,m){if(typeof l=='string')l=(m?m.$:document).createComment(l);d.domObject.call(this,l);};d.comment.prototype=new d.node();e.extend(d.comment.prototype,{type:8,getOuterHtml:function(){return '<!--'+this.$.nodeValue+'-->';}});(function(){var l={address:1,blockquote:1,dl:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,li:1,dt:1,dd:1,legend:1,caption:1},m={body:1,div:1,table:1,tbody:1,tr:1,td:1,th:1,form:1,fieldset:1},n=function(o){var p=o.getChildren();for(var q=0,r=p.count();q<r;q++){var s=p.getItem(q);if(s.type==1&&f.$block[s.getName()])return true;}return false;};d.elementPath=function(o){var u=this;var p=null,q=null,r=[],s=o;while(s){if(s.type==1){if(!u.lastElement)u.lastElement=s;var t=s.getName();if(!q){if(!p&&l[t])p=s;if(m[t])if(!p&&t=='div'&&!n(s))p=s;else q=s;}r.push(s);if(t=='body')break;}s=s.getParent();}u.block=p;u.blockLimit=q;u.elements=r;};})();d.elementPath.prototype={compare:function(l){var m=this.elements,n=l&&l.elements;if(!n||m.length!=n.length)return false;for(var o=0;o<m.length;o++){if(!m[o].equals(n[o]))return false;}return true;},contains:function(l){var m=this.elements;for(var n=0;n<m.length;n++){if(m[n].getName() in l)return m[n];}return null;}};d.text=function(l,m){if(typeof l=='string')l=(m?m.$:document).createTextNode(l);this.$=l;};d.text.prototype=new d.node();e.extend(d.text.prototype,{type:3,getLength:function(){return this.$.nodeValue.length;},getText:function(){return this.$.nodeValue;},setText:function(l){this.$.nodeValue=l;},split:function(l){var q=this;if(c&&l==q.getLength()){var m=q.getDocument().createText('');m.insertAfter(q);return m;}var n=q.getDocument(),o=new d.text(q.$.splitText(l),n);if(b.ie8){var p=new d.text('',n);p.insertAfter(o);p.remove();}return o;},substring:function(l,m){if(typeof m!='number')return this.$.nodeValue.substr(l);else return this.$.nodeValue.substring(l,m);}});d.documentFragment=function(l){l=l||a.document;this.$=l.$.createDocumentFragment();};e.extend(d.documentFragment.prototype,h.prototype,{type:11,insertAfterNode:function(l){l=l.$;l.parentNode.insertBefore(this.$,l.nextSibling);}},true,{append:1,appendBogus:1,getFirst:1,getLast:1,appendTo:1,moveChildren:1,insertBefore:1,insertAfterNode:1,replace:1,trim:1,type:1,ltrim:1,rtrim:1,getDocument:1,getChildCount:1,getChild:1,getChildren:1});(function(){function l(s,t){var u=this.range;if(this._.end)return null;if(!this._.start){this._.start=1;if(u.collapsed){this.end();return null;
-}u.optimize();}var v,w=u.startContainer,x=u.endContainer,y=u.startOffset,z=u.endOffset,A,B=this.guard,C=this.type,D=s?'getPreviousSourceNode':'getNextSourceNode';if(!s&&!this._.guardLTR){var E=x.type==1?x:x.getParent(),F=x.type==1?x.getChild(z):x.getNext();this._.guardLTR=function(J,K){return(!K||!E.equals(J))&&(!F||!J.equals(F))&&(J.type!=1||!K||J.getName()!='body');};}if(s&&!this._.guardRTL){var G=w.type==1?w:w.getParent(),H=w.type==1?y?w.getChild(y-1):null:w.getPrevious();this._.guardRTL=function(J,K){return(!K||!G.equals(J))&&(!H||!J.equals(H))&&(J.type!=1||!K||J.getName()!='body');};}var I=s?this._.guardRTL:this._.guardLTR;if(B)A=function(J,K){if(I(J,K)===false)return false;return B(J,K);};else A=I;if(this.current)v=this.current[D](false,C,A);else{if(s){v=x;if(v.type==1)if(z>0)v=v.getChild(z-1);else v=A(v,true)===false?null:v.getPreviousSourceNode(true,C,A);}else{v=w;if(v.type==1)if(!(v=v.getChild(y)))v=A(w,true)===false?null:w.getNextSourceNode(true,C,A);}if(v&&A(v)===false)v=null;}while(v&&!this._.end){this.current=v;if(!this.evaluator||this.evaluator(v)!==false){if(!t)return v;}else if(t&&this.evaluator)return false;v=v[D](false,C,A);}this.end();return this.current=null;};function m(s){var t,u=null;while(t=l.call(this,s))u=t;return u;};d.walker=e.createClass({$:function(s){this.range=s;this._={};},proto:{end:function(){this._.end=1;},next:function(){return l.call(this);},previous:function(){return l.call(this,1);},checkForward:function(){return l.call(this,0,1)!==false;},checkBackward:function(){return l.call(this,1,1)!==false;},lastForward:function(){return m.call(this);},lastBackward:function(){return m.call(this,1);},reset:function(){delete this.current;this._={};}}});var n={block:1,'list-item':1,table:1,'table-row-group':1,'table-header-group':1,'table-footer-group':1,'table-row':1,'table-column-group':1,'table-column':1,'table-cell':1,'table-caption':1};h.prototype.isBlockBoundary=function(s){var t=s?e.extend({},f.$block,s||{}):f.$block;return this.getComputedStyle('float')=='none'&&n[this.getComputedStyle('display')]||t[this.getName()];};d.walker.blockBoundary=function(s){return function(t,u){return!(t.type==1&&t.isBlockBoundary(s));};};d.walker.listItemBoundary=function(){return this.blockBoundary({br:1});};d.walker.bookmark=function(s,t){function u(v){return v&&v.getName&&v.getName()=='span'&&v.data('cke-bookmark');};return function(v){var w,x;w=v&&!v.getName&&(x=v.getParent())&&u(x);w=s?w:w||u(v);return!!(t^w);};};d.walker.whitespaces=function(s){return function(t){var u=t&&t.type==3&&!e.trim(t.getText());
-return!!(s^u);};};d.walker.invisible=function(s){var t=d.walker.whitespaces();return function(u){var v=t(u)||u.is&&!u.$.offsetHeight;return!!(s^v);};};d.walker.nodeType=function(s,t){return function(u){return!!(t^u.type==s);};};d.walker.bogus=function(s){function t(u){return!p(u)&&!q(u);};return function(u){var v=!c?u.is&&u.is('br'):u.getText&&o.test(u.getText());if(v){var w=u.getParent(),x=u.getNext(t);v=w.isBlockBoundary()&&(!x||x.type==1&&x.isBlockBoundary());}return!!(s^v);};};var o=/^[\t\r\n ]*(?: |\xa0)$/,p=d.walker.whitespaces(),q=d.walker.bookmark(),r=function(s){return q(s)||p(s)||s.type==1&&s.getName() in f.$inline&&!(s.getName() in f.$empty);};h.prototype.getBogus=function(){var s=this;do s=s.getPreviousSourceNode();while(r(s));if(s&&(!c?s.is&&s.is('br'):s.getText&&o.test(s.getText())))return s;return false;};})();d.range=function(l){var m=this;m.startContainer=null;m.startOffset=null;m.endContainer=null;m.endOffset=null;m.collapsed=true;m.document=l;};(function(){var l=function(u){u.collapsed=u.startContainer&&u.endContainer&&u.startContainer.equals(u.endContainer)&&u.startOffset==u.endOffset;},m=function(u,v,w,x){u.optimizeBookmark();var y=u.startContainer,z=u.endContainer,A=u.startOffset,B=u.endOffset,C,D;if(z.type==3)z=z.split(B);else if(z.getChildCount()>0)if(B>=z.getChildCount()){z=z.append(u.document.createText(''));D=true;}else z=z.getChild(B);if(y.type==3){y.split(A);if(y.equals(z))z=y.getNext();}else if(!A){y=y.getFirst().insertBeforeMe(u.document.createText(''));C=true;}else if(A>=y.getChildCount()){y=y.append(u.document.createText(''));C=true;}else y=y.getChild(A).getPrevious();var E=y.getParents(),F=z.getParents(),G,H,I;for(G=0;G<E.length;G++){H=E[G];I=F[G];if(!H.equals(I))break;}var J=w,K,L,M,N;for(var O=G;O<E.length;O++){K=E[O];if(J&&!K.equals(y))L=J.append(K.clone());M=K.getNext();while(M){if(M.equals(F[O])||M.equals(z))break;N=M.getNext();if(v==2)J.append(M.clone(true));else{M.remove();if(v==1)J.append(M);}M=N;}if(J)J=L;}J=w;for(var P=G;P<F.length;P++){K=F[P];if(v>0&&!K.equals(z))L=J.append(K.clone());if(!E[P]||K.$.parentNode!=E[P].$.parentNode){M=K.getPrevious();while(M){if(M.equals(E[P])||M.equals(y))break;N=M.getPrevious();if(v==2)J.$.insertBefore(M.$.cloneNode(true),J.$.firstChild);else{M.remove();if(v==1)J.$.insertBefore(M.$,J.$.firstChild);}M=N;}}if(J)J=L;}if(v==2){var Q=u.startContainer;if(Q.type==3){Q.$.data+=Q.$.nextSibling.data;Q.$.parentNode.removeChild(Q.$.nextSibling);}var R=u.endContainer;if(R.type==3&&R.$.nextSibling){R.$.data+=R.$.nextSibling.data;
-R.$.parentNode.removeChild(R.$.nextSibling);}}else{if(H&&I&&(y.$.parentNode!=H.$.parentNode||z.$.parentNode!=I.$.parentNode)){var S=I.getIndex();if(C&&I.$.parentNode==y.$.parentNode)S--;if(x&&H.type==1){var T=h.createFromHtml('<span data-cke-bookmark="1" style="display:none"> </span>',u.document);T.insertAfter(H);H.mergeSiblings(false);u.moveToBookmark({startNode:T});}else u.setStart(I.getParent(),S);}u.collapse(true);}if(C)y.remove();if(D&&z.$.parentNode)z.remove();},n={abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1};function o(u){var v=false,w=d.walker.bookmark(true),x=/^[\t\r\n ]*(?: |\xa0)$/;return function(y){if(w(y))return true;if(y.type==3){if(c&&x.test(y.getText())&&!v&&!(u&&y.getNext()))v=true;else if(y.hasAscendant('pre')||e.trim(y.getText()).length)return false;}else if(y.type==1)if(!n[y.getName()])if(!c&&y.is('br')&&!v&&!(u&&y.getNext()))v=true;else return false;return true;};};var p=d.walker.bogus();function q(u){return function(v){return!u&&p(v)||(v.type==3?!e.trim(v.getText())||!!v.getParent().data('cke-bookmark'):v.getName() in f.$removeEmpty);};};var r=new d.walker.whitespaces(),s=new d.walker.bookmark();function t(u){return!r(u)&&!s(u);};d.range.prototype={clone:function(){var v=this;var u=new d.range(v.document);u.startContainer=v.startContainer;u.startOffset=v.startOffset;u.endContainer=v.endContainer;u.endOffset=v.endOffset;u.collapsed=v.collapsed;return u;},collapse:function(u){var v=this;if(u){v.endContainer=v.startContainer;v.endOffset=v.startOffset;}else{v.startContainer=v.endContainer;v.startOffset=v.endOffset;}v.collapsed=true;},cloneContents:function(){var u=new d.documentFragment(this.document);if(!this.collapsed)m(this,2,u);return u;},deleteContents:function(u){if(this.collapsed)return;m(this,0,null,u);},extractContents:function(u){var v=new d.documentFragment(this.document);if(!this.collapsed)m(this,1,v,u);return v;},createBookmark:function(u){var A=this;var v,w,x,y,z=A.collapsed;v=A.document.createElement('span');v.data('cke-bookmark',1);v.setStyle('display','none');v.setHtml(' ');if(u){x='cke_bm_'+e.getNextNumber();v.setAttribute('id',x+(z?'C':'S'));}if(!z){w=v.clone();w.setHtml(' ');if(u)w.setAttribute('id',x+'E');y=A.clone();y.collapse();y.insertNode(w);}y=A.clone();y.collapse(true);y.insertNode(v);if(w){A.setStartAfter(v);A.setEndBefore(w);}else A.moveToPosition(v,4);return{startNode:u?x+(z?'C':'S'):v,endNode:u?x+'E':w,serializable:u,collapsed:z};
-},createBookmark2:function(u){var C=this;var v=C.startContainer,w=C.endContainer,x=C.startOffset,y=C.endOffset,z=C.collapsed,A,B;if(!v||!w)return{start:0,end:0};if(u){if(v.type==1){A=v.getChild(x);if(A&&A.type==3&&x>0&&A.getPrevious().type==3){v=A;x=0;}if(A&&A.type==1)x=A.getIndex(1);}while(v.type==3&&(B=v.getPrevious())&&B.type==3){v=B;x+=B.getLength();}if(!z){if(w.type==1){A=w.getChild(y);if(A&&A.type==3&&y>0&&A.getPrevious().type==3){w=A;y=0;}if(A&&A.type==1)y=A.getIndex(1);}while(w.type==3&&(B=w.getPrevious())&&B.type==3){w=B;y+=B.getLength();}}}return{start:v.getAddress(u),end:z?null:w.getAddress(u),startOffset:x,endOffset:y,normalized:u,collapsed:z,is2:true};},moveToBookmark:function(u){var C=this;if(u.is2){var v=C.document.getByAddress(u.start,u.normalized),w=u.startOffset,x=u.end&&C.document.getByAddress(u.end,u.normalized),y=u.endOffset;C.setStart(v,w);if(x)C.setEnd(x,y);else C.collapse(true);}else{var z=u.serializable,A=z?C.document.getById(u.startNode):u.startNode,B=z?C.document.getById(u.endNode):u.endNode;C.setStartBefore(A);A.remove();if(B){C.setEndBefore(B);B.remove();}else C.collapse(true);}},getBoundaryNodes:function(){var z=this;var u=z.startContainer,v=z.endContainer,w=z.startOffset,x=z.endOffset,y;if(u.type==1){y=u.getChildCount();if(y>w)u=u.getChild(w);else if(y<1)u=u.getPreviousSourceNode();else{u=u.$;while(u.lastChild)u=u.lastChild;u=new d.node(u);u=u.getNextSourceNode()||u;}}if(v.type==1){y=v.getChildCount();if(y>x)v=v.getChild(x).getPreviousSourceNode(true);else if(y<1)v=v.getPreviousSourceNode();else{v=v.$;while(v.lastChild)v=v.lastChild;v=new d.node(v);}}if(u.getPosition(v)&2)u=v;return{startNode:u,endNode:v};},getCommonAncestor:function(u,v){var z=this;var w=z.startContainer,x=z.endContainer,y;if(w.equals(x)){if(u&&w.type==1&&z.startOffset==z.endOffset-1)y=w.getChild(z.startOffset);else y=w;}else y=w.getCommonAncestor(x);return v&&!y.is?y.getParent():y;},optimize:function(){var w=this;var u=w.startContainer,v=w.startOffset;if(u.type!=1)if(!v)w.setStartBefore(u);else if(v>=u.getLength())w.setStartAfter(u);u=w.endContainer;v=w.endOffset;if(u.type!=1)if(!v)w.setEndBefore(u);else if(v>=u.getLength())w.setEndAfter(u);},optimizeBookmark:function(){var w=this;var u=w.startContainer,v=w.endContainer;if(u.is&&u.is('span')&&u.data('cke-bookmark'))w.setStartAt(u,3);if(v&&v.is&&v.is('span')&&v.data('cke-bookmark'))w.setEndAt(v,4);},trim:function(u,v){var C=this;var w=C.startContainer,x=C.startOffset,y=C.collapsed;if((!u||y)&&w&&w.type==3){if(!x){x=w.getIndex();
-w=w.getParent();}else if(x>=w.getLength()){x=w.getIndex()+1;w=w.getParent();}else{var z=w.split(x);x=w.getIndex()+1;w=w.getParent();if(C.startContainer.equals(C.endContainer))C.setEnd(z,C.endOffset-C.startOffset);else if(w.equals(C.endContainer))C.endOffset+=1;}C.setStart(w,x);if(y){C.collapse(true);return;}}var A=C.endContainer,B=C.endOffset;if(!(v||y)&&A&&A.type==3){if(!B){B=A.getIndex();A=A.getParent();}else if(B>=A.getLength()){B=A.getIndex()+1;A=A.getParent();}else{A.split(B);B=A.getIndex()+1;A=A.getParent();}C.setEnd(A,B);}},enlarge:function(u,v){switch(u){case 1:if(this.collapsed)return;var w=this.getCommonAncestor(),x=this.document.getBody(),y,z,A,B,C,D=false,E,F,G=this.startContainer,H=this.startOffset;if(G.type==3){if(H){G=!e.trim(G.substring(0,H)).length&&G;D=!!G;}if(G)if(!(B=G.getPrevious()))A=G.getParent();}else{if(H)B=G.getChild(H-1)||G.getLast();if(!B)A=G;}while(A||B){if(A&&!B){if(!C&&A.equals(w))C=true;if(!x.contains(A))break;if(!D||A.getComputedStyle('display')!='inline'){D=false;if(C)y=A;else this.setStartBefore(A);}B=A.getPrevious();}while(B){E=false;if(B.type==8){B=B.getPrevious();continue;}else if(B.type==3){F=B.getText();if(/[^\s\ufeff]/.test(F))B=null;E=/[\s\ufeff]$/.test(F);}else if((B.$.offsetWidth>0||v&&B.is('br'))&&!B.data('cke-bookmark'))if(D&&f.$removeEmpty[B.getName()]){F=B.getText();if(/[^\s\ufeff]/.test(F))B=null;else{var I=B.$.getElementsByTagName('*');for(var J=0,K;K=I[J++];){if(!f.$removeEmpty[K.nodeName.toLowerCase()]){B=null;break;}}}if(B)E=!!F.length;}else B=null;if(E)if(D){if(C)y=A;else if(A)this.setStartBefore(A);}else D=true;if(B){var L=B.getPrevious();if(!A&&!L){A=B;B=null;break;}B=L;}else A=null;}if(A)A=A.getParent();}G=this.endContainer;H=this.endOffset;A=B=null;C=D=false;if(G.type==3){G=!e.trim(G.substring(H)).length&&G;D=!(G&&G.getLength());if(G)if(!(B=G.getNext()))A=G.getParent();}else{B=G.getChild(H);if(!B)A=G;}while(A||B){if(A&&!B){if(!C&&A.equals(w))C=true;if(!x.contains(A))break;if(!D||A.getComputedStyle('display')!='inline'){D=false;if(C)z=A;else if(A)this.setEndAfter(A);}B=A.getNext();}while(B){E=false;if(B.type==3){F=B.getText();if(/[^\s\ufeff]/.test(F))B=null;E=/^[\s\ufeff]/.test(F);}else if(B.type==1){if((B.$.offsetWidth>0||v&&B.is('br'))&&!B.data('cke-bookmark'))if(D&&f.$removeEmpty[B.getName()]){F=B.getText();if(/[^\s\ufeff]/.test(F))B=null;else{I=B.$.getElementsByTagName('*');for(J=0;K=I[J++];){if(!f.$removeEmpty[K.nodeName.toLowerCase()]){B=null;break;}}}if(B)E=!!F.length;}else B=null;}else E=1;if(E)if(D)if(C)z=A;
-else this.setEndAfter(A);if(B){L=B.getNext();if(!A&&!L){A=B;B=null;break;}B=L;}else A=null;}if(A)A=A.getParent();}if(y&&z){w=y.contains(z)?z:y;this.setStartBefore(w);this.setEndAfter(w);}break;case 2:case 3:var M=new d.range(this.document);x=this.document.getBody();M.setStartAt(x,1);M.setEnd(this.startContainer,this.startOffset);var N=new d.walker(M),O,P,Q=d.walker.blockBoundary(u==3?{br:1}:null),R=function(X){var Y=Q(X);if(!Y)O=X;return Y;},S=function(X){var Y=R(X);if(!Y&&X.is&&X.is('br'))P=X;return Y;};N.guard=R;A=N.lastBackward();O=O||x;this.setStartAt(O,!O.is('br')&&(!A&&this.checkStartOfBlock()||A&&O.contains(A))?1:4);if(u==3){var T=this.clone();N=new d.walker(T);var U=d.walker.whitespaces(),V=d.walker.bookmark();N.evaluator=function(X){return!U(X)&&!V(X);};var W=N.previous();if(W&&W.type==1&&W.is('br'))return;}M=this.clone();M.collapse();M.setEndAt(x,2);N=new d.walker(M);N.guard=u==3?S:R;O=null;A=N.lastForward();O=O||x;this.setEndAt(O,!A&&this.checkEndOfBlock()||A&&O.contains(A)?2:3);if(P)this.setEndAfter(P);}},shrink:function(u,v){if(!this.collapsed){u=u||2;var w=this.clone(),x=this.startContainer,y=this.endContainer,z=this.startOffset,A=this.endOffset,B=this.collapsed,C=1,D=1;if(x&&x.type==3)if(!z)w.setStartBefore(x);else if(z>=x.getLength())w.setStartAfter(x);else{w.setStartBefore(x);C=0;}if(y&&y.type==3)if(!A)w.setEndBefore(y);else if(A>=y.getLength())w.setEndAfter(y);else{w.setEndAfter(y);D=0;}var E=new d.walker(w),F=d.walker.bookmark();E.evaluator=function(J){return J.type==(u==1?1:3);};var G;E.guard=function(J,K){if(F(J))return true;if(u==1&&J.type==3)return false;if(K&&J.equals(G))return false;if(!K&&J.type==1)G=J;return true;};if(C){var H=E[u==1?'lastForward':'next']();H&&this.setStartAt(H,v?1:3);}if(D){E.reset();var I=E[u==1?'lastBackward':'previous']();I&&this.setEndAt(I,v?2:4);}return!!(C||D);}},insertNode:function(u){var y=this;y.optimizeBookmark();y.trim(false,true);var v=y.startContainer,w=y.startOffset,x=v.getChild(w);if(x)u.insertBefore(x);else v.append(u);if(u.getParent().equals(y.endContainer))y.endOffset++;y.setStartBefore(u);},moveToPosition:function(u,v){this.setStartAt(u,v);this.collapse(true);},selectNodeContents:function(u){this.setStart(u,0);this.setEnd(u,u.type==3?u.getLength():u.getChildCount());},setStart:function(u,v){var w=this;if(u.type==1&&f.$empty[u.getName()])v=u.getIndex(),u=u.getParent();w.startContainer=u;w.startOffset=v;if(!w.endContainer){w.endContainer=u;w.endOffset=v;}l(w);},setEnd:function(u,v){var w=this;if(u.type==1&&f.$empty[u.getName()])v=u.getIndex()+1,u=u.getParent();
-w.endContainer=u;w.endOffset=v;if(!w.startContainer){w.startContainer=u;w.startOffset=v;}l(w);},setStartAfter:function(u){this.setStart(u.getParent(),u.getIndex()+1);},setStartBefore:function(u){this.setStart(u.getParent(),u.getIndex());},setEndAfter:function(u){this.setEnd(u.getParent(),u.getIndex()+1);},setEndBefore:function(u){this.setEnd(u.getParent(),u.getIndex());},setStartAt:function(u,v){var w=this;switch(v){case 1:w.setStart(u,0);break;case 2:if(u.type==3)w.setStart(u,u.getLength());else w.setStart(u,u.getChildCount());break;case 3:w.setStartBefore(u);break;case 4:w.setStartAfter(u);}l(w);},setEndAt:function(u,v){var w=this;switch(v){case 1:w.setEnd(u,0);break;case 2:if(u.type==3)w.setEnd(u,u.getLength());else w.setEnd(u,u.getChildCount());break;case 3:w.setEndBefore(u);break;case 4:w.setEndAfter(u);}l(w);},fixBlock:function(u,v){var y=this;var w=y.createBookmark(),x=y.document.createElement(v);y.collapse(u);y.enlarge(2);y.extractContents().appendTo(x);x.trim();if(!c)x.appendBogus();y.insertNode(x);y.moveToBookmark(w);return x;},splitBlock:function(u){var E=this;var v=new d.elementPath(E.startContainer),w=new d.elementPath(E.endContainer),x=v.blockLimit,y=w.blockLimit,z=v.block,A=w.block,B=null;if(!x.equals(y))return null;if(u!='br'){if(!z){z=E.fixBlock(true,u);A=new d.elementPath(E.endContainer).block;}if(!A)A=E.fixBlock(false,u);}var C=z&&E.checkStartOfBlock(),D=A&&E.checkEndOfBlock();E.deleteContents();if(z&&z.equals(A))if(D){B=new d.elementPath(E.startContainer);E.moveToPosition(A,4);A=null;}else if(C){B=new d.elementPath(E.startContainer);E.moveToPosition(z,3);z=null;}else{A=E.splitElement(z);if(!c&&!z.is('ul','ol'))z.appendBogus();}return{previousBlock:z,nextBlock:A,wasStartOfBlock:C,wasEndOfBlock:D,elementPath:B};},splitElement:function(u){var x=this;if(!x.collapsed)return null;x.setEndAt(u,2);var v=x.extractContents(),w=u.clone(false);v.appendTo(w);w.insertAfter(u);x.moveToPosition(u,4);return w;},checkBoundaryOfElement:function(u,v){var w=v==1,x=this.clone();x.collapse(w);x[w?'setStartAt':'setEndAt'](u,w?1:2);var y=new d.walker(x);y.evaluator=q(w);return y[w?'checkBackward':'checkForward']();},checkStartOfBlock:function(){var A=this;var u=A.startContainer,v=A.startOffset;if(v&&u.type==3){var w=e.ltrim(u.substring(0,v));if(w.length)return false;}var x=new d.elementPath(A.startContainer),y=A.clone();y.collapse(true);y.setStartAt(x.block||x.blockLimit,1);var z=new d.walker(y);z.evaluator=o(true);return z.checkBackward();},checkEndOfBlock:function(){var A=this;
-var u=A.endContainer,v=A.endOffset;if(u.type==3){var w=e.rtrim(u.substring(v));if(w.length)return false;}var x=new d.elementPath(A.endContainer),y=A.clone();y.collapse(false);y.setEndAt(x.block||x.blockLimit,2);var z=new d.walker(y);z.evaluator=o(false);return z.checkForward();},checkReadOnly:(function(){function u(v,w){while(v){if(v.type==1)if(v.getAttribute('contentEditable')=='false'&&!v.data('cke-editable'))return 0;else if(v.is('html')||v.getAttribute('contentEditable')=='true'&&(v.contains(w)||v.equals(w)))break;v=v.getParent();}return 1;};return function(){var v=this.startContainer,w=this.endContainer;return!(u(v,w)&&u(w,v));};})(),moveToElementEditablePosition:function(u,v){var w=/^[\t\r\n ]*(?: |\xa0)$/;function x(z,A){var B;if(z.type==1&&z.isEditable(false))B=z[v?'getLast':'getFirst'](t);if(!A&&!B)B=z[v?'getPrevious':'getNext'](t);return B;};if(u.type==1&&!u.isEditable(false)){this.moveToPosition(u,v?4:3);return true;}var y=0;while(u){if(u.type==3){if(v&&this.checkEndOfBlock()&&w.test(u.getText()))this.moveToPosition(u,3);else this.moveToPosition(u,v?4:3);y=1;break;}if(u.type==1)if(u.isEditable()){this.moveToPosition(u,v?2:1);y=1;}else if(v&&u.is('br')&&this.checkEndOfBlock())this.moveToPosition(u,3);u=x(u,y);}return!!y;},moveToElementEditStart:function(u){return this.moveToElementEditablePosition(u);},moveToElementEditEnd:function(u){return this.moveToElementEditablePosition(u,true);},getEnclosedNode:function(){var u=this.clone();u.optimize();if(u.startContainer.type!=1||u.endContainer.type!=1)return null;var v=new d.walker(u),w=d.walker.bookmark(true),x=d.walker.whitespaces(true),y=function(A){return x(A)&&w(A);};u.evaluator=y;var z=v.next();v.reset();return z&&z.equals(v.previous())?z:null;},getTouchedStartNode:function(){var u=this.startContainer;if(this.collapsed||u.type!=1)return u;return u.getChild(this.startOffset)||u;},getTouchedEndNode:function(){var u=this.endContainer;if(this.collapsed||u.type!=1)return u;return u.getChild(this.endOffset-1)||u;}};})();a.POSITION_AFTER_START=1;a.POSITION_BEFORE_END=2;a.POSITION_BEFORE_START=3;a.POSITION_AFTER_END=4;a.ENLARGE_ELEMENT=1;a.ENLARGE_BLOCK_CONTENTS=2;a.ENLARGE_LIST_ITEM_CONTENTS=3;a.START=1;a.END=2;a.STARTEND=3;a.SHRINK_ELEMENT=1;a.SHRINK_TEXT=2;(function(){d.rangeList=function(n){if(n instanceof d.rangeList)return n;if(!n)n=[];else if(n instanceof d.range)n=[n];return e.extend(n,l);};var l={createIterator:function(){var n=this,o=d.walker.bookmark(),p=function(s){return!(s.is&&s.is('tr'));
-},q=[],r;return{getNextRange:function(s){r=r==undefined?0:r+1;var t=n[r];if(t&&n.length>1){if(!r)for(var u=n.length-1;u>=0;u--)q.unshift(n[u].createBookmark(true));if(s){var v=0;while(n[r+v+1]){var w=t.document,x=0,y=w.getById(q[v].endNode),z=w.getById(q[v+1].startNode),A;while(1){A=y.getNextSourceNode(false);if(!z.equals(A)){if(o(A)||A.type==1&&A.isBlockBoundary()){y=A;continue;}}else x=1;break;}if(!x)break;v++;}}t.moveToBookmark(q.shift());while(v--){A=n[++r];A.moveToBookmark(q.shift());t.setEnd(A.endContainer,A.endOffset);}}return t;}};},createBookmarks:function(n){var s=this;var o=[],p;for(var q=0;q<s.length;q++){o.push(p=s[q].createBookmark(n,true));for(var r=q+1;r<s.length;r++){s[r]=m(p,s[r]);s[r]=m(p,s[r],true);}}return o;},createBookmarks2:function(n){var o=[];for(var p=0;p<this.length;p++)o.push(this[p].createBookmark2(n));return o;},moveToBookmarks:function(n){for(var o=0;o<this.length;o++)this[o].moveToBookmark(n[o]);}};function m(n,o,p){var q=n.serializable,r=o[p?'endContainer':'startContainer'],s=p?'endOffset':'startOffset',t=q?o.document.getById(n.startNode):n.startNode,u=q?o.document.getById(n.endNode):n.endNode;if(r.equals(t.getPrevious())){o.startOffset=o.startOffset-r.getLength()-u.getPrevious().getLength();r=u.getNext();}else if(r.equals(u.getPrevious())){o.startOffset=o.startOffset-r.getLength();r=u.getNext();}r.equals(t.getParent())&&o[s]++;r.equals(u.getParent())&&o[s]++;o[p?'endContainer':'startContainer']=r;return o;};})();(function(){if(b.webkit){b.hc=false;return;}var l=h.createFromHtml('<div style="width:0px;height:0px;position:absolute;left:-10000px;border: 1px solid;border-color: red blue;"></div>',a.document);l.appendTo(a.document.getHead());try{b.hc=l.getComputedStyle('border-top-color')==l.getComputedStyle('border-right-color');}catch(m){b.hc=false;}if(b.hc)b.cssClass+=' cke_hc';l.remove();})();j.load(i.corePlugins.split(','),function(){a.status='loaded';a.fire('loaded');var l=a._.pending;if(l){delete a._.pending;for(var m=0;m<l.length;m++)a.add(l[m]);}});if(c)try{document.execCommand('BackgroundImageCache',false,true);}catch(l){}a.skins.add('kama',(function(){var m='cke_ui_color';return{editor:{css:['editor.css']},dialog:{css:['dialog.css']},richcombo:{canGroup:false},templates:{css:['templates.css']},margins:[0,0,0,0],init:function(n){if(n.config.width&&!isNaN(n.config.width))n.config.width-=12;var o=[],p=/\$color/g,q='/* UI Color Support */.cke_skin_kama .cke_menuitem .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuitem a:hover .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:focus .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:active .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuitem a:hover .cke_label,.cke_skin_kama .cke_menuitem a:focus .cke_label,.cke_skin_kama .cke_menuitem a:active .cke_label{\tbackground-color: $color !important;}.cke_skin_kama .cke_menuitem a.cke_disabled:hover .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:focus .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:active .cke_label{\tbackground-color: transparent !important;}.cke_skin_kama .cke_menuitem a.cke_disabled:hover .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a.cke_disabled:focus .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a.cke_disabled:active .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuitem a.cke_disabled .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuseparator{\tbackground-color: $color !important;}.cke_skin_kama .cke_menuitem a:hover,.cke_skin_kama .cke_menuitem a:focus,.cke_skin_kama .cke_menuitem a:active{\tbackground-color: $color !important;}';
-if(b.webkit){q=q.split('}').slice(0,-1);for(var r=0;r<q.length;r++)q[r]=q[r].split('{');}function s(v){var w=v.getById(m);if(!w){w=v.getHead().append('style');w.setAttribute('id',m);w.setAttribute('type','text/css');}return w;};function t(v,w,x){var y,z,A;for(var B=0;B<v.length;B++){if(b.webkit)for(z=0;z<w.length;z++){A=w[z][1];for(y=0;y<x.length;y++)A=A.replace(x[y][0],x[y][1]);v[B].$.sheet.addRule(w[z][0],A);}else{A=w;for(y=0;y<x.length;y++)A=A.replace(x[y][0],x[y][1]);if(c)v[B].$.styleSheet.cssText+=A;else v[B].$.innerHTML+=A;}}};var u=/\$color/g;e.extend(n,{uiColor:null,getUiColor:function(){return this.uiColor;},setUiColor:function(v){var w,x=s(a.document),y='.'+n.id,z=[y+' .cke_wrapper',y+'_dialog .cke_dialog_contents',y+'_dialog a.cke_dialog_tab',y+'_dialog .cke_dialog_footer'].join(','),A='background-color: $color !important;';if(b.webkit)w=[[z,A]];else w=z+'{'+A+'}';return(this.setUiColor=function(B){var C=[[u,B]];n.uiColor=B;t([x],w,C);t(o,q,C);})(v);}});n.on('menuShow',function(v){var w=v.data[0],x=w.element.getElementsByTag('iframe').getItem(0).getFrameDocument();if(!x.getById('cke_ui_color')){var y=s(x);o.push(y);var z=n.getUiColor();if(z)t([y],q,[[u,z]]);}});if(n.config.uiColor)n.setUiColor(n.config.uiColor);}};})());(function(){a.dialog?m():a.on('dialogPluginReady',m);function m(){a.dialog.on('resize',function(n){var o=n.data,p=o.width,q=o.height,r=o.dialog,s=r.parts.contents;if(o.skin!='kama')return;s.setStyles({width:p+'px',height:q+'px'});});};})();j.add('about',{requires:['dialog'],init:function(m){var n=m.addCommand('about',new a.dialogCommand('about'));n.modes={wysiwyg:1,source:1};n.canUndo=false;n.readOnly=1;m.ui.addButton('About',{label:m.lang.about.title,command:'about'});a.dialog.add('about',this.path+'dialogs/about.js');}});(function(){var m='a11yhelp',n='a11yHelp';j.add(m,{requires:['dialog'],availableLangs:{cs:1,cy:1,da:1,de:1,el:1,en:1,eo:1,fa:1,fi:1,fr:1,gu:1,he:1,it:1,mk:1,nb:1,nl:1,no:1,'pt-br':1,ro:1,tr:1,ug:1,vi:1,'zh-cn':1},init:function(o){var p=this;o.addCommand(n,{exec:function(){var q=o.langCode;q=p.availableLangs[q]?q:'en';a.scriptLoader.load(a.getUrl(p.path+'lang/'+q+'.js'),function(){e.extend(o.lang,p.langEntries[q]);o.openDialog(n);});},modes:{wysiwyg:1,source:1},readOnly:1,canUndo:false});a.dialog.add(n,this.path+'dialogs/a11yhelp.js');}});})();j.add('basicstyles',{requires:['styles','button'],init:function(m){var n=function(q,r,s,t){var u=new a.style(t);m.attachStyleStateChange(u,function(v){!m.readOnly&&m.getCommand(s).setState(v);
-});m.addCommand(s,new a.styleCommand(u));m.ui.addButton(q,{label:r,command:s});},o=m.config,p=m.lang;n('Bold',p.bold,'bold',o.coreStyles_bold);n('Italic',p.italic,'italic',o.coreStyles_italic);n('Underline',p.underline,'underline',o.coreStyles_underline);n('Strike',p.strike,'strike',o.coreStyles_strike);n('Subscript',p.subscript,'subscript',o.coreStyles_subscript);n('Superscript',p.superscript,'superscript',o.coreStyles_superscript);}});i.coreStyles_bold={element:'strong',overrides:'b'};i.coreStyles_italic={element:'em',overrides:'i'};i.coreStyles_underline={element:'u'};i.coreStyles_strike={element:'strike'};i.coreStyles_subscript={element:'sub'};i.coreStyles_superscript={element:'sup'};(function(){var m={table:1,ul:1,ol:1,blockquote:1,div:1},n={},o={};e.extend(n,m,{tr:1,p:1,div:1,li:1});e.extend(o,n,{td:1});function p(B){q(B);r(B);};function q(B){var C=B.editor,D=B.data.path;if(C.readOnly)return;var E=C.config.useComputedState,F;E=E===undefined||E;if(!E)F=s(D.lastElement);F=F||D.block||D.blockLimit;if(F.is('body')){var G=C.getSelection().getRanges()[0].getEnclosedNode();G&&G.type==1&&(F=G);}if(!F)return;var H=E?F.getComputedStyle('direction'):F.getStyle('direction')||F.getAttribute('dir');C.getCommand('bidirtl').setState(H=='rtl'?1:2);C.getCommand('bidiltr').setState(H=='ltr'?1:2);};function r(B){var C=B.editor,D=B.data.path.block||B.data.path.blockLimit;C.fire('contentDirChanged',D?D.getComputedStyle('direction'):C.lang.dir);};function s(B){while(B&&!(B.getName() in o||B.is('body'))){var C=B.getParent();if(!C)break;B=C;}return B;};function t(B,C,D,E){if(B.isReadOnly())return;h.setMarker(E,B,'bidi_processed',1);var F=B;while((F=F.getParent())&&!F.is('body')){if(F.getCustomData('bidi_processed')){B.removeStyle('direction');B.removeAttribute('dir');return;}}var G='useComputedState' in D.config?D.config.useComputedState:1,H=G?B.getComputedStyle('direction'):B.getStyle('direction')||B.hasAttribute('dir');if(H==C)return;B.removeStyle('direction');if(G){B.removeAttribute('dir');if(C!=B.getComputedStyle('direction'))B.setAttribute('dir',C);}else B.setAttribute('dir',C);D.forceNextSelectionCheck();};function u(B,C,D){var E=B.getCommonAncestor(false,true);B=B.clone();B.enlarge(D==2?3:2);if(B.checkBoundaryOfElement(E,1)&&B.checkBoundaryOfElement(E,2)){var F;while(E&&E.type==1&&(F=E.getParent())&&F.getChildCount()==1&&!(E.getName() in C))E=F;return E.type==1&&E.getName() in C&&E;}};function v(B){return function(C){var D=C.getSelection(),E=C.config.enterMode,F=D.getRanges();
-if(F&&F.length){var G={},H=D.createBookmarks(),I=F.createIterator(),J,K=0;while(J=I.getNextRange(1)){var L=J.getEnclosedNode();if(!L||L&&!(L.type==1&&L.getName() in n))L=u(J,m,E);L&&t(L,B,C,G);var M,N,O=new d.walker(J),P=H[K].startNode,Q=H[K++].endNode;O.evaluator=function(R){return!!(R.type==1&&R.getName() in m&&!(R.getName()==(E==1?'p':'div')&&R.getParent().type==1&&R.getParent().getName()=='blockquote')&&R.getPosition(P)&2&&(R.getPosition(Q)&4+16)==4);};while(N=O.next())t(N,B,C,G);M=J.createIterator();M.enlargeBr=E!=2;while(N=M.getNextParagraph(E==1?'p':'div'))t(N,B,C,G);}h.clearAllMarkers(G);C.forceNextSelectionCheck();D.selectBookmarks(H);C.focus();}};};j.add('bidi',{requires:['styles','button'],init:function(B){var C=function(E,F,G,H){B.addCommand(G,new a.command(B,{exec:H}));B.ui.addButton(E,{label:F,command:G});},D=B.lang.bidi;C('BidiLtr',D.ltr,'bidiltr',v('ltr'));C('BidiRtl',D.rtl,'bidirtl',v('rtl'));B.on('selectionChange',p);B.on('contentDom',function(){B.document.on('dirChanged',function(E){B.fire('dirChanged',{node:E.data,dir:E.data.getDirection(1)});});});}});function w(B){var C=B.getDocument().getBody().getParent();while(B){if(B.equals(C))return false;B=B.getParent();}return true;};function x(B){var C=B==y.setAttribute,D=B==y.removeAttribute,E=/\bdirection\s*:\s*(.*?)\s*(:?$|;)/;return function(F,G){var J=this;if(!J.getDocument().equals(a.document)){var H;if((F==(C||D?'dir':'direction')||F=='style'&&(D||E.test(G)))&&!w(J)){H=J.getDirection(1);var I=B.apply(J,arguments);if(H!=J.getDirection(1)){J.getDocument().fire('dirChanged',J);return I;}}}return B.apply(J,arguments);};};var y=h.prototype,z=['setStyle','removeStyle','setAttribute','removeAttribute'];for(var A=0;A<z.length;A++)y[z[A]]=e.override(y[z[A]],x);})();(function(){function m(q,r){var s=r.block||r.blockLimit;if(!s||s.getName()=='body')return 2;if(s.getAscendant('blockquote',true))return 1;return 2;};function n(q){var r=q.editor;if(r.readOnly)return;var s=r.getCommand('blockquote');s.state=m(r,q.data.path);s.fire('state');};function o(q){for(var r=0,s=q.getChildCount(),t;r<s&&(t=q.getChild(r));r++){if(t.type==1&&t.isBlockBoundary())return false;}return true;};var p={exec:function(q){var r=q.getCommand('blockquote').state,s=q.getSelection(),t=s&&s.getRanges(true)[0];if(!t)return;var u=s.createBookmarks();if(c){var v=u[0].startNode,w=u[0].endNode,x;if(v&&v.getParent().getName()=='blockquote'){x=v;while(x=x.getNext()){if(x.type==1&&x.isBlockBoundary()){v.move(x,true);break;}}}if(w&&w.getParent().getName()=='blockquote'){x=w;
-while(x=x.getPrevious()){if(x.type==1&&x.isBlockBoundary()){w.move(x);break;}}}}var y=t.createIterator(),z;y.enlargeBr=q.config.enterMode!=2;if(r==2){var A=[];while(z=y.getNextParagraph())A.push(z);if(A.length<1){var B=q.document.createElement(q.config.enterMode==1?'p':'div'),C=u.shift();t.insertNode(B);B.append(new d.text('\ufeff',q.document));t.moveToBookmark(C);t.selectNodeContents(B);t.collapse(true);C=t.createBookmark();A.push(B);u.unshift(C);}var D=A[0].getParent(),E=[];for(var F=0;F<A.length;F++){z=A[F];D=D.getCommonAncestor(z.getParent());}var G={table:1,tbody:1,tr:1,ol:1,ul:1};while(G[D.getName()])D=D.getParent();var H=null;while(A.length>0){z=A.shift();while(!z.getParent().equals(D))z=z.getParent();if(!z.equals(H))E.push(z);H=z;}while(E.length>0){z=E.shift();if(z.getName()=='blockquote'){var I=new d.documentFragment(q.document);while(z.getFirst()){I.append(z.getFirst().remove());A.push(I.getLast());}I.replace(z);}else A.push(z);}var J=q.document.createElement('blockquote');J.insertBefore(A[0]);while(A.length>0){z=A.shift();J.append(z);}}else if(r==1){var K=[],L={};while(z=y.getNextParagraph()){var M=null,N=null;while(z.getParent()){if(z.getParent().getName()=='blockquote'){M=z.getParent();N=z;break;}z=z.getParent();}if(M&&N&&!N.getCustomData('blockquote_moveout')){K.push(N);h.setMarker(L,N,'blockquote_moveout',true);}}h.clearAllMarkers(L);var O=[],P=[];L={};while(K.length>0){var Q=K.shift();J=Q.getParent();if(!Q.getPrevious())Q.remove().insertBefore(J);else if(!Q.getNext())Q.remove().insertAfter(J);else{Q.breakParent(Q.getParent());P.push(Q.getNext());}if(!J.getCustomData('blockquote_processed')){P.push(J);h.setMarker(L,J,'blockquote_processed',true);}O.push(Q);}h.clearAllMarkers(L);for(F=P.length-1;F>=0;F--){J=P[F];if(o(J))J.remove();}if(q.config.enterMode==2){var R=true;while(O.length){Q=O.shift();if(Q.getName()=='div'){I=new d.documentFragment(q.document);var S=R&&Q.getPrevious()&&!(Q.getPrevious().type==1&&Q.getPrevious().isBlockBoundary());if(S)I.append(q.document.createElement('br'));var T=Q.getNext()&&!(Q.getNext().type==1&&Q.getNext().isBlockBoundary());while(Q.getFirst())Q.getFirst().remove().appendTo(I);if(T)I.append(q.document.createElement('br'));I.replace(Q);R=false;}}}}s.selectBookmarks(u);q.focus();}};j.add('blockquote',{init:function(q){q.addCommand('blockquote',p);q.ui.addButton('Blockquote',{label:q.lang.blockquote,command:'blockquote'});q.on('selectionChange',n);},requires:['domiterator']});})();j.add('button',{beforeInit:function(m){m.ui.addHandler('button',k.button.handler);
-}});a.UI_BUTTON='button';k.button=function(m){e.extend(this,m,{title:m.label,className:m.className||m.command&&'cke_button_'+m.command||'',click:m.click||(function(n){n.execCommand(m.command);})});this._={};};k.button.handler={create:function(m){return new k.button(m);}};(function(){k.button.prototype={render:function(m,n){var o=b,p=this._.id=e.getNextId(),q='',r=this.command,s;this._.editor=m;var t={id:p,button:this,editor:m,focus:function(){var z=a.document.getById(p);z.focus();},execute:function(){if(c&&b.version<7)e.setTimeout(function(){this.button.click(m);},0,this);else this.button.click(m);}},u=e.addFunction(function(z){if(t.onkey){z=new d.event(z);return t.onkey(t,z.getKeystroke())!==false;}}),v=e.addFunction(function(z){var A;if(t.onfocus)A=t.onfocus(t,new d.event(z))!==false;if(b.gecko&&b.version<10900)z.preventBubble();return A;});t.clickFn=s=e.addFunction(t.execute,t);if(this.modes){var w={};function x(){var z=m.mode;if(z){var A=this.modes[z]?w[z]!=undefined?w[z]:2:0;this.setState(m.readOnly&&!this.readOnly?0:A);}};m.on('beforeModeUnload',function(){if(m.mode&&this._.state!=0)w[m.mode]=this._.state;},this);m.on('mode',x,this);!this.readOnly&&m.on('readOnly',x,this);}else if(r){r=m.getCommand(r);if(r){r.on('state',function(){this.setState(r.state);},this);q+='cke_'+(r.state==1?'on':r.state==0?'disabled':'off');}}if(!r)q+='cke_off';if(this.className)q+=' '+this.className;n.push('<span class="cke_button'+(this.icon&&this.icon.indexOf('.png')==-1?' cke_noalphafix':'')+'">','<a id="',p,'" class="',q,'"',o.gecko&&o.version>=10900&&!o.hc?'':'" href="javascript:void(\''+(this.title||'').replace("'",'')+"')\"",' title="',this.title,'" tabindex="-1" hidefocus="true" role="button" aria-labelledby="'+p+'_label"'+(this.hasArrow?' aria-haspopup="true"':''));if(o.opera||o.gecko&&o.mac)n.push(' onkeypress="return false;"');if(o.gecko)n.push(' onblur="this.style.cssText = this.style.cssText;"');n.push(' onkeydown="return CKEDITOR.tools.callFunction(',u,', event);" onfocus="return CKEDITOR.tools.callFunction(',v,', event);" '+(c?'onclick="return false;" onmouseup':'onclick')+'="CKEDITOR.tools.callFunction(',s,', this); return false;"><span class="cke_icon"');if(this.icon){var y=(this.iconOffset||0)*-16;n.push(' style="background-image:url(',a.getUrl(this.icon),');background-position:0 '+y+'px;"');}n.push('> </span><span id="',p,'_label" class="cke_label">',this.label,'</span>');if(this.hasArrow)n.push('<span class="cke_buttonarrow">'+(b.hc?'▼':' ')+'</span>');
-n.push('</a>','</span>');if(this.onRender)this.onRender();return t;},setState:function(m){if(this._.state==m)return false;this._.state=m;var n=a.document.getById(this._.id);if(n){n.setState(m);m==0?n.setAttribute('aria-disabled',true):n.removeAttribute('aria-disabled');m==1?n.setAttribute('aria-pressed',true):n.removeAttribute('aria-pressed');return true;}else return false;}};})();k.prototype.addButton=function(m,n){this.add(m,'button',n);};(function(){var m=function(y,z){var A=y.document,B=A.getBody(),C=false,D=function(){C=true;};B.on(z,D);(b.version>7?A.$:A.$.selection.createRange()).execCommand(z);B.removeListener(z,D);return C;},n=c?function(y,z){return m(y,z);}:function(y,z){try{return y.document.$.execCommand(z,false,null);}catch(A){return false;}},o=function(y){var z=this;z.type=y;z.canUndo=z.type=='cut';z.startDisabled=true;};o.prototype={exec:function(y,z){this.type=='cut'&&t(y);var A=n(y,this.type);if(!A)alert(y.lang.clipboard[this.type+'Error']);return A;}};var p={canUndo:false,exec:c?function(y){y.focus();if(!y.document.getBody().fire('beforepaste')&&!m(y,'paste')){y.fire('pasteDialog');return false;}}:function(y){try{if(!y.document.getBody().fire('beforepaste')&&!y.document.$.execCommand('Paste',false,null))throw 0;}catch(z){setTimeout(function(){y.fire('pasteDialog');},0);return false;}}},q=function(y){if(this.mode!='wysiwyg')return;switch(y.data.keyCode){case 1114112+86:case 2228224+45:var z=this.document.getBody();if(b.opera||b.gecko)z.fire('paste');return;case 1114112+88:case 2228224+46:var A=this;this.fire('saveSnapshot');setTimeout(function(){A.fire('saveSnapshot');},0);}};function r(y){y.cancel();};function s(y,z,A){var B=this.document;if(B.getById('cke_pastebin'))return;if(z=='text'&&y.data&&y.data.$.clipboardData){var C=y.data.$.clipboardData.getData('text/plain');if(C){y.data.preventDefault();A(C);return;}}var D=this.getSelection(),E=new d.range(B),F=new h(z=='text'?'textarea':b.webkit?'body':'div',B);F.setAttribute('id','cke_pastebin');b.webkit&&F.append(B.createText('\xa0'));B.getBody().append(F);F.setStyles({position:'absolute',top:D.getStartElement().getDocumentPosition().y+'px',width:'1px',height:'1px',overflow:'hidden'});F.setStyle(this.config.contentsLangDirection=='ltr'?'left':'right','-1000px');var G=D.createBookmarks();this.on('selectionChange',r,null,null,0);if(z=='text')F.$.focus();else{E.setStartAt(F,1);E.setEndAt(F,2);E.select(true);}var H=this;window.setTimeout(function(){H.document.getBody().focus();H.removeListener('selectionChange',r);
-if(b.ie7Compat){D.selectBookmarks(G);F.remove();}else{F.remove();D.selectBookmarks(G);}var I;F=b.webkit&&(I=F.getFirst())&&I.is&&I.hasClass('Apple-style-span')?I:F;A(F['get'+(z=='text'?'Value':'Html')]());},0);};function t(y){if(!c||b.quirks)return;var z=y.getSelection(),A;if(z.getType()==3&&(A=z.getSelectedElement())){var B=z.getRanges()[0],C=y.document.createText('');C.insertBefore(A);B.setStartBefore(C);B.setEndAfter(A);z.selectRanges([B]);setTimeout(function(){if(A.getParent()){C.remove();z.selectElement(A);}},0);}};var u,v;function w(y,z){var A;if(v&&y in {Paste:1,Cut:1})return 0;if(y=='Paste'){c&&(u=1);try{A=z.document.$.queryCommandEnabled(y)||b.webkit;}catch(D){}u=0;}else{var B=z.getSelection(),C=B&&B.getRanges();A=B&&!(C.length==1&&C[0].collapsed);}return A?2:0;};function x(){var z=this;if(z.mode!='wysiwyg')return;var y=w('Paste',z);z.getCommand('cut').setState(w('Cut',z));z.getCommand('copy').setState(w('Copy',z));z.getCommand('paste').setState(y);z.fire('pasteState',y);};j.add('clipboard',{requires:['dialog','htmldataprocessor'],init:function(y){y.on('paste',function(A){var B=A.data;if(B.html)y.insertHtml(B.html);else if(B.text)y.insertText(B.text);setTimeout(function(){y.fire('afterPaste');},0);},null,null,1000);y.on('pasteDialog',function(A){setTimeout(function(){y.openDialog('paste');},0);});y.on('pasteState',function(A){y.getCommand('paste').setState(A.data);});function z(A,B,C,D){var E=y.lang[B];y.addCommand(B,C);y.ui.addButton(A,{label:E,command:B});if(y.addMenuItems)y.addMenuItem(B,{label:E,command:B,group:'clipboard',order:D});};z('Cut','cut',new o('cut'),1);z('Copy','copy',new o('copy'),4);z('Paste','paste',p,8);a.dialog.add('paste',a.getUrl(this.path+'dialogs/paste.js'));y.on('key',q,y);y.on('contentDom',function(){var A=y.document.getBody();A.on(!c?'paste':'beforepaste',function(B){if(u)return;var C=B.data&&B.data.$;if(c&&C&&!C.ctrlKey)return;var D={mode:'html'};y.fire('beforePaste',D);s.call(y,B,D.mode,function(E){if(!(E=e.trim(E.replace(/<span[^>]+data-cke-bookmark[^<]*?<\/span>/ig,''))))return;var F={};F[D.mode]=E;y.fire('paste',F);});});if(c){A.on('contextmenu',function(){u=1;setTimeout(function(){u=0;},0);});A.on('paste',function(B){if(!y.document.getById('cke_pastebin')){B.data.preventDefault();u=0;p.exec(y);}});}A.on('beforecut',function(){!u&&t(y);});A.on('mouseup',function(){setTimeout(function(){x.call(y);},0);},y);A.on('keyup',x,y);});y.on('selectionChange',function(A){v=A.data.selection.getRanges()[0].checkReadOnly();x.call(y);
-});if(y.contextMenu)y.contextMenu.addListener(function(A,B){var C=B.getRanges()[0].checkReadOnly();return{cut:w('Cut',y),copy:w('Copy',y),paste:w('Paste',y)};});}});})();j.add('colorbutton',{requires:['panelbutton','floatpanel','styles'],init:function(m){var n=m.config,o=m.lang.colorButton,p;if(!b.hc){q('TextColor','fore',o.textColorTitle);q('BGColor','back',o.bgColorTitle);}function q(t,u,v){var w=e.getNextId()+'_colorBox';m.ui.add(t,'panelbutton',{label:v,title:v,className:'cke_button_'+t.toLowerCase(),modes:{wysiwyg:1},panel:{css:m.skin.editor.css,attributes:{role:'listbox','aria-label':o.panelTitle}},onBlock:function(x,y){y.autoSize=true;y.element.addClass('cke_colorblock');y.element.setHtml(r(x,u,w));y.element.getDocument().getBody().setStyle('overflow','hidden');k.fire('ready',this);var z=y.keys,A=m.lang.dir=='rtl';z[A?37:39]='next';z[40]='next';z[9]='next';z[A?39:37]='prev';z[38]='prev';z[2228224+9]='prev';z[32]='click';},onOpen:function(){var x=m.getSelection(),y=x&&x.getStartElement(),z=new d.elementPath(y),A;y=z.block||z.blockLimit||m.document.getBody();do A=y&&y.getComputedStyle(u=='back'?'background-color':'color')||'transparent';while(u=='back'&&A=='transparent'&&y&&(y=y.getParent()));if(!A||A=='transparent')A='#ffffff';this._.panel._.iframe.getFrameDocument().getById(w).setStyle('background-color',A);}});};function r(t,u,v){var w=[],x=n.colorButton_colors.split(','),y=e.addFunction(function(E,F){if(E=='?'){var G=arguments.callee;function H(J){this.removeListener('ok',H);this.removeListener('cancel',H);J.name=='ok'&&G(this.getContentElement('picker','selectedColor').getValue(),F);};m.openDialog('colordialog',function(){this.on('ok',H);this.on('cancel',H);});return;}m.focus();t.hide(false);m.fire('saveSnapshot');new a.style(n['colorButton_'+F+'Style'],{color:'inherit'}).remove(m.document);if(E){var I=n['colorButton_'+F+'Style'];I.childRule=F=='back'?function(J){return s(J);}:function(J){return!(J.is('a')||J.getElementsByTag('a').count())||s(J);};new a.style(I,{color:E}).apply(m.document);}m.fire('saveSnapshot');});w.push('<a class="cke_colorauto" _cke_focus=1 hidefocus=true title="',o.auto,'" onclick="CKEDITOR.tools.callFunction(',y,",null,'",u,"');return false;\" href=\"javascript:void('",o.auto,'\')" role="option"><table role="presentation" cellspacing=0 cellpadding=0 width="100%"><tr><td><span class="cke_colorbox" id="',v,'"></span></td><td colspan=7 align=center>',o.auto,'</td></tr></table></a><table role="presentation" cellspacing=0 cellpadding=0 width="100%">');
-for(var z=0;z<x.length;z++){if(z%8===0)w.push('</tr><tr>');var A=x[z].split('/'),B=A[0],C=A[1]||B;if(!A[1])B='#'+B.replace(/^(.)(.)(.)$/,'$1$1$2$2$3$3');var D=m.lang.colors[C]||C;w.push('<td><a class="cke_colorbox" _cke_focus=1 hidefocus=true title="',D,'" onclick="CKEDITOR.tools.callFunction(',y,",'",B,"','",u,"'); return false;\" href=\"javascript:void('",D,'\')" role="option"><span class="cke_colorbox" style="background-color:#',C,'"></span></a></td>');}if(n.colorButton_enableMore===undefined||n.colorButton_enableMore)w.push('</tr><tr><td colspan=8 align=center><a class="cke_colormore" _cke_focus=1 hidefocus=true title="',o.more,'" onclick="CKEDITOR.tools.callFunction(',y,",'?','",u,"');return false;\" href=\"javascript:void('",o.more,"')\"",' role="option">',o.more,'</a></td>');w.push('</tr></table>');return w.join('');};function s(t){return t.getAttribute('contentEditable')=='false'||t.getAttribute('data-nostyle');};}});i.colorButton_colors='000,800000,8B4513,2F4F4F,008080,000080,4B0082,696969,B22222,A52A2A,DAA520,006400,40E0D0,0000CD,800080,808080,F00,FF8C00,FFD700,008000,0FF,00F,EE82EE,A9A9A9,FFA07A,FFA500,FFFF00,00FF00,AFEEEE,ADD8E6,DDA0DD,D3D3D3,FFF0F5,FAEBD7,FFFFE0,F0FFF0,F0FFFF,F0F8FF,E6E6FA,FFF';i.colorButton_foreStyle={element:'span',styles:{color:'#(color)'},overrides:[{element:'font',attributes:{color:null}}]};i.colorButton_backStyle={element:'span',styles:{'background-color':'#(color)'}};j.colordialog={requires:['dialog'],init:function(m){m.addCommand('colordialog',new a.dialogCommand('colordialog'));a.dialog.add('colordialog',this.path+'dialogs/colordialog.js');}};j.add('colordialog',j.colordialog);j.add('contextmenu',{requires:['menu'],onLoad:function(){j.contextMenu=e.createClass({base:a.menu,$:function(m){this.base.call(this,m,{panel:{className:m.skinClass+' cke_contextmenu',attributes:{'aria-label':m.lang.contextmenu.options}}});},proto:{addTarget:function(m,n){if(b.opera&&!('oncontextmenu' in document.body)){var o;m.on('mousedown',function(s){s=s.data;if(s.$.button!=2){if(s.getKeystroke()==1114112+1)m.fire('contextmenu',s);return;}if(n&&(b.mac?s.$.metaKey:s.$.ctrlKey))return;var t=s.getTarget();if(!o){var u=t.getDocument();o=u.createElement('input');o.$.type='button';u.getBody().append(o);}o.setAttribute('style','position:absolute;top:'+(s.$.clientY-2)+'px;left:'+(s.$.clientX-2)+'px;width:5px;height:5px;opacity:0.01');});m.on('mouseup',function(s){if(o){o.remove();o=undefined;m.fire('contextmenu',s.data);}});}m.on('contextmenu',function(s){var t=s.data;
-if(n&&(b.webkit?p:b.mac?t.$.metaKey:t.$.ctrlKey))return;t.preventDefault();var u=t.getTarget().getDocument().getDocumentElement(),v=t.$.clientX,w=t.$.clientY;e.setTimeout(function(){this.open(u,null,v,w);},c?200:0,this);},this);if(b.opera)m.on('keypress',function(s){var t=s.data;if(t.$.keyCode===0)t.preventDefault();});if(b.webkit){var p,q=function(s){p=b.mac?s.data.$.metaKey:s.data.$.ctrlKey;},r=function(){p=0;};m.on('keydown',q);m.on('keyup',r);m.on('contextmenu',r);}},open:function(m,n,o,p){this.editor.focus();m=m||a.document.getDocumentElement();this.show(m,n,o,p);}}});},beforeInit:function(m){m.contextMenu=new j.contextMenu(m);m.addCommand('contextMenu',{exec:function(){m.contextMenu.open(m.document.getBody());}});}});(function(){function m(o){var p=this.att,q=o&&o.hasAttribute(p)&&o.getAttribute(p)||'';if(q!==undefined)this.setValue(q);};function n(){var o;for(var p=0;p<arguments.length;p++){if(arguments[p] instanceof h){o=arguments[p];break;}}if(o){var q=this.att,r=this.getValue();if(r)o.setAttribute(q,r);else o.removeAttribute(q,r);}};j.add('dialogadvtab',{createAdvancedTab:function(o,p){if(!p)p={id:1,dir:1,classes:1,styles:1};var q=o.lang.common,r={id:'advanced',label:q.advancedTab,title:q.advancedTab,elements:[{type:'vbox',padding:1,children:[]}]},s=[];if(p.id||p.dir){if(p.id)s.push({id:'advId',att:'id',type:'text',label:q.id,setup:m,commit:n});if(p.dir)s.push({id:'advLangDir',att:'dir',type:'select',label:q.langDir,'default':'',style:'width:100%',items:[[q.notSet,''],[q.langDirLTR,'ltr'],[q.langDirRTL,'rtl']],setup:m,commit:n});r.elements[0].children.push({type:'hbox',widths:['50%','50%'],children:[].concat(s)});}if(p.styles||p.classes){s=[];if(p.styles)s.push({id:'advStyles',att:'style',type:'text',label:q.styles,'default':'',validate:a.dialog.validate.inlineStyle(q.invalidInlineStyle),onChange:function(){},getStyle:function(t,u){var v=this.getValue().match(new RegExp(t+'\\s*:\\s*([^;]*)','i'));return v?v[1]:u;},updateStyle:function(t,u){var v=this.getValue();if(v)v=v.replace(new RegExp('\\s*'+t+'s*:[^;]*(?:$|;s*)','i'),'').replace(/^[;\s]+/,'').replace(/\s+$/,'');if(u){v&&!/;\s*$/.test(v)&&(v+='; ');v+=t+': '+u;}this.setValue(v,1);},setup:m,commit:n});if(p.classes)s.push({type:'hbox',widths:['45%','55%'],children:[{id:'advCSSClasses',att:'class',type:'text',label:q.cssClasses,'default':'',setup:m,commit:n}]});r.elements[0].children.push({type:'hbox',widths:['50%','50%'],children:[].concat(s)});}return r;}});})();(function(){j.add('div',{requires:['editingblock','dialog','domiterator','styles'],init:function(m){var n=m.lang.div;
-m.addCommand('creatediv',new a.dialogCommand('creatediv'));m.addCommand('editdiv',new a.dialogCommand('editdiv'));m.addCommand('removediv',{exec:function(o){var p=o.getSelection(),q=p&&p.getRanges(),r,s=p.createBookmarks(),t,u=[];function v(x){var y=new d.elementPath(x),z=y.blockLimit,A=z.is('div')&&z;if(A&&!A.data('cke-div-added')){u.push(A);A.data('cke-div-added');}};for(var w=0;w<q.length;w++){r=q[w];if(r.collapsed)v(p.getStartElement());else{t=new d.walker(r);t.evaluator=v;t.lastForward();}}for(w=0;w<u.length;w++)u[w].remove(true);p.selectBookmarks(s);}});m.ui.addButton('CreateDiv',{label:n.toolbar,command:'creatediv'});if(m.addMenuItems){m.addMenuItems({editdiv:{label:n.edit,command:'editdiv',group:'div',order:1},removediv:{label:n.remove,command:'removediv',group:'div',order:5}});if(m.contextMenu)m.contextMenu.addListener(function(o,p){if(!o||o.isReadOnly())return null;var q=new d.elementPath(o),r=q.blockLimit;if(r&&r.getAscendant('div',true))return{editdiv:2,removediv:2};return null;});}a.dialog.add('creatediv',this.path+'dialogs/div.js');a.dialog.add('editdiv',this.path+'dialogs/div.js');}});})();(function(){var m={toolbarFocus:{editorFocus:false,readOnly:1,exec:function(o){var p=o._.elementsPath.idBase,q=a.document.getById(p+'0');q&&q.focus(c||b.air);}}},n='<span class="cke_empty"> </span>';j.add('elementspath',{requires:['selection'],init:function(o){var p='cke_path_'+o.name,q,r=function(){if(!q)q=a.document.getById(p);return q;},s='cke_elementspath_'+e.getNextNumber()+'_';o._.elementsPath={idBase:s,filters:[]};o.on('themeSpace',function(x){if(x.data.space=='bottom')x.data.html+='<span id="'+p+'_label" class="cke_voice_label">'+o.lang.elementsPath.eleLabel+'</span>'+'<div id="'+p+'" class="cke_path" role="group" aria-labelledby="'+p+'_label">'+n+'</div>';});function t(x){o.focus();var y=o._.elementsPath.list[x];if(y.is('body')){var z=new d.range(o.document);z.selectNodeContents(y);z.select();}else o.getSelection().selectElement(y);};var u=e.addFunction(t),v=e.addFunction(function(x,y){var z=o._.elementsPath.idBase,A;y=new d.event(y);var B=o.lang.dir=='rtl';switch(y.getKeystroke()){case B?39:37:case 9:A=a.document.getById(z+(x+1));if(!A)A=a.document.getById(z+'0');A.focus();return false;case B?37:39:case 2228224+9:A=a.document.getById(z+(x-1));if(!A)A=a.document.getById(z+(o._.elementsPath.list.length-1));A.focus();return false;case 27:o.focus();return false;case 13:case 32:t(x);return false;}return true;});o.on('selectionChange',function(x){var y=b,z=x.data.selection,A=z.getStartElement(),B=[],C=x.editor,D=C._.elementsPath.list=[],E=C._.elementsPath.filters;
-while(A){var F=0,G;if(A.data('cke-display-name'))G=A.data('cke-display-name');else if(A.data('cke-real-element-type'))G=A.data('cke-real-element-type');else G=A.getName();for(var H=0;H<E.length;H++){var I=E[H](A,G);if(I===false){F=1;break;}G=I||G;}if(!F){var J=D.push(A)-1,K='';if(y.opera||y.gecko&&y.mac)K+=' onkeypress="return false;"';if(y.gecko)K+=' onblur="this.style.cssText = this.style.cssText;"';var L=C.lang.elementsPath.eleTitle.replace(/%1/,G);B.unshift('<a id="',s,J,'" href="javascript:void(\'',G,'\')" tabindex="-1" title="',L,'"'+(b.gecko&&b.version<10900?' onfocus="event.preventBubble();"':'')+' hidefocus="true" '+' onkeydown="return CKEDITOR.tools.callFunction(',v,',',J,', event );"'+K,' onclick="CKEDITOR.tools.callFunction('+u,',',J,'); return false;"',' role="button" aria-labelledby="'+s+J+'_label">',G,'<span id="',s,J,'_label" class="cke_label">'+L+'</span>','</a>');}if(G=='body')break;A=A.getParent();}var M=r();M.setHtml(B.join('')+n);C.fire('elementsPathUpdate',{space:M});});function w(){q&&q.setHtml(n);delete o._.elementsPath.list;};o.on('readOnly',w);o.on('contentDomUnload',w);o.addCommand('elementsPathFocus',m.toolbarFocus);}});})();(function(){j.add('enterkey',{requires:['keystrokes','indent'],init:function(t){t.addCommand('enter',{modes:{wysiwyg:1},editorFocus:false,exec:function(v){r(v);}});t.addCommand('shiftEnter',{modes:{wysiwyg:1},editorFocus:false,exec:function(v){q(v);}});var u=t.keystrokeHandler.keystrokes;u[13]='enter';u[2228224+13]='shiftEnter';}});j.enterkey={enterBlock:function(t,u,v,w){v=v||s(t);if(!v)return;var x=v.document,y=v.checkStartOfBlock(),z=v.checkEndOfBlock(),A=new d.elementPath(v.startContainer),B=A.block;if(y&&z){if(B&&(B.is('li')||B.getParent().is('li'))){t.execCommand('outdent');return;}if(B&&B.getParent().is('blockquote')){B.breakParent(B.getParent());if(!B.getPrevious().getFirst(d.walker.invisible(1)))B.getPrevious().remove();if(!B.getNext().getFirst(d.walker.invisible(1)))B.getNext().remove();v.moveToElementEditStart(B);v.select();return;}}else if(B&&B.is('pre')){if(!z){n(t,u,v,w);return;}}else if(B&&f.$captionBlock[B.getName()]){n(t,u,v,w);return;}var C=u==3?'div':'p',D=v.splitBlock(C);if(!D)return;var E=D.previousBlock,F=D.nextBlock,G=D.wasStartOfBlock,H=D.wasEndOfBlock,I;if(F){I=F.getParent();if(I.is('li')){F.breakParent(I);F.move(F.getNext(),1);}}else if(E&&(I=E.getParent())&&I.is('li')){E.breakParent(I);I=E.getNext();v.moveToElementEditStart(I);E.move(E.getPrevious());}if(!G&&!H){if(F.is('li')&&(I=F.getFirst(d.walker.invisible(true)))&&I.is&&I.is('ul','ol'))(c?x.createText('\xa0'):x.createElement('br')).insertBefore(I);
-if(F)v.moveToElementEditStart(F);}else{var J,K;if(E){if(E.is('li')||!(p.test(E.getName())||E.is('pre')))J=E.clone();}else if(F)J=F.clone();if(!J){if(I&&I.is('li'))J=I;else{J=x.createElement(C);if(E&&(K=E.getDirection()))J.setAttribute('dir',K);}}else if(w&&!J.is('li'))J.renameNode(C);var L=D.elementPath;if(L)for(var M=0,N=L.elements.length;M<N;M++){var O=L.elements[M];if(O.equals(L.block)||O.equals(L.blockLimit))break;if(f.$removeEmpty[O.getName()]){O=O.clone();J.moveChildren(O);J.append(O);}}if(!c)J.appendBogus();if(!J.getParent())v.insertNode(J);J.is('li')&&J.removeAttribute('value');if(c&&G&&(!H||!E.getChildCount())){v.moveToElementEditStart(H?E:J);v.select();}v.moveToElementEditStart(G&&!H?F:J);}if(!c)if(F){var P=x.createElement('span');P.setHtml(' ');v.insertNode(P);P.scrollIntoView();v.deleteContents();}else J.scrollIntoView();v.select();},enterBr:function(t,u,v,w){v=v||s(t);if(!v)return;var x=v.document,y=u==3?'div':'p',z=v.checkEndOfBlock(),A=new d.elementPath(t.getSelection().getStartElement()),B=A.block,C=B&&A.block.getName(),D=false;if(!w&&C=='li'){o(t,u,v,w);return;}if(!w&&z&&p.test(C)){var E,F;if(F=B.getDirection()){E=x.createElement('div');E.setAttribute('dir',F);E.insertAfter(B);v.setStart(E,0);}else{x.createElement('br').insertAfter(B);if(b.gecko)x.createText('').insertAfter(B);v.setStartAt(B.getNext(),c?3:1);}}else{var G;D=C=='pre';if(D&&!b.gecko)G=x.createText(c?'\r':'\n');else G=x.createElement('br');v.deleteContents();v.insertNode(G);if(c)v.setStartAt(G,4);else{x.createText('\ufeff').insertAfter(G);if(z)G.getParent().appendBogus();G.getNext().$.nodeValue='';v.setStartAt(G.getNext(),1);var H=null;if(!b.gecko){H=x.createElement('span');H.setHtml(' ');}else H=x.createElement('br');H.insertBefore(G.getNext());H.scrollIntoView();H.remove();}}v.collapse(true);v.select(D);}};var m=j.enterkey,n=m.enterBr,o=m.enterBlock,p=/^h[1-6]$/;function q(t){if(t.mode!='wysiwyg')return false;return r(t,t.config.shiftEnterMode,1);};function r(t,u,v){v=t.config.forceEnterMode||v;if(t.mode!='wysiwyg')return false;if(!u)u=t.config.enterMode;setTimeout(function(){t.fire('saveSnapshot');if(u==2)n(t,u,null,v);else o(t,u,null,v);t.fire('saveSnapshot');},0);return true;};function s(t){var u=t.getSelection().getRanges(true);for(var v=u.length-1;v>0;v--)u[v].deleteContents();return u[0];};})();(function(){var m='nbsp,gt,lt,amp',n='quot,iexcl,cent,pound,curren,yen,brvbar,sect,uml,copy,ordf,laquo,not,shy,reg,macr,deg,plusmn,sup2,sup3,acute,micro,para,middot,cedil,sup1,ordm,raquo,frac14,frac12,frac34,iquest,times,divide,fnof,bull,hellip,prime,Prime,oline,frasl,weierp,image,real,trade,alefsym,larr,uarr,rarr,darr,harr,crarr,lArr,uArr,rArr,dArr,hArr,forall,part,exist,empty,nabla,isin,notin,ni,prod,sum,minus,lowast,radic,prop,infin,ang,and,or,cap,cup,int,there4,sim,cong,asymp,ne,equiv,le,ge,sub,sup,nsub,sube,supe,oplus,otimes,perp,sdot,lceil,rceil,lfloor,rfloor,lang,rang,loz,spades,clubs,hearts,diams,circ,tilde,ensp,emsp,thinsp,zwnj,zwj,lrm,rlm,ndash,mdash,lsquo,rsquo,sbquo,ldquo,rdquo,bdquo,dagger,Dagger,permil,lsaquo,rsaquo,euro',o='Agrave,Aacute,Acirc,Atilde,Auml,Aring,AElig,Ccedil,Egrave,Eacute,Ecirc,Euml,Igrave,Iacute,Icirc,Iuml,ETH,Ntilde,Ograve,Oacute,Ocirc,Otilde,Ouml,Oslash,Ugrave,Uacute,Ucirc,Uuml,Yacute,THORN,szlig,agrave,aacute,acirc,atilde,auml,aring,aelig,ccedil,egrave,eacute,ecirc,euml,igrave,iacute,icirc,iuml,eth,ntilde,ograve,oacute,ocirc,otilde,ouml,oslash,ugrave,uacute,ucirc,uuml,yacute,thorn,yuml,OElig,oelig,Scaron,scaron,Yuml',p='Alpha,Beta,Gamma,Delta,Epsilon,Zeta,Eta,Theta,Iota,Kappa,Lambda,Mu,Nu,Xi,Omicron,Pi,Rho,Sigma,Tau,Upsilon,Phi,Chi,Psi,Omega,alpha,beta,gamma,delta,epsilon,zeta,eta,theta,iota,kappa,lambda,mu,nu,xi,omicron,pi,rho,sigmaf,sigma,tau,upsilon,phi,chi,psi,omega,thetasym,upsih,piv';
-function q(r,s){var t={},u=[],v={nbsp:'\xa0',shy:'',gt:'>',lt:'<',amp:'&',apos:"'",quot:'"'};r=r.replace(/\b(nbsp|shy|gt|lt|amp|apos|quot)(?:,|$)/g,function(A,B){var C=s?'&'+B+';':v[B],D=s?v[B]:'&'+B+';';t[C]=D;u.push(C);return '';});if(!s&&r){r=r.split(',');var w=document.createElement('div'),x;w.innerHTML='&'+r.join(';&')+';';x=w.innerHTML;w=null;for(var y=0;y<x.length;y++){var z=x.charAt(y);t[z]='&'+r[y]+';';u.push(z);}}t.regex=u.join(s?'|':'');return t;};j.add('entities',{afterInit:function(r){var s=r.config,t=r.dataProcessor,u=t&&t.htmlFilter;if(u){var v=[];if(s.basicEntities!==false)v.push(m);if(s.entities){if(v.length)v.push(n);if(s.entities_latin)v.push(o);if(s.entities_greek)v.push(p);if(s.entities_additional)v.push(s.entities_additional);}var w=q(v.join(',')),x=w.regex?'['+w.regex+']':'a^';delete w.regex;if(s.entities&&s.entities_processNumerical)x='[^ -~]|'+x;x=new RegExp(x,'g');function y(C){return s.entities_processNumerical=='force'||!w[C]?'&#'+C.charCodeAt(0)+';':w[C];};var z=q([m,'shy'].join(','),true),A=new RegExp(z.regex,'g');function B(C){return z[C];};u.addRules({text:function(C){return C.replace(A,B).replace(x,y);}});}}});})();i.basicEntities=true;i.entities=true;i.entities_latin=true;i.entities_greek=true;i.entities_additional='#39';(function(){function m(v,w){var x=[];if(!w)return v;else for(var y in w)x.push(y+'='+encodeURIComponent(w[y]));return v+(v.indexOf('?')!=-1?'&':'?')+x.join('&');};function n(v){v+='';var w=v.charAt(0).toUpperCase();return w+v.substr(1);};function o(v){var C=this;var w=C.getDialog(),x=w.getParentEditor();x._.filebrowserSe=C;var y=x.config['filebrowser'+n(w.getName())+'WindowWidth']||x.config.filebrowserWindowWidth||'80%',z=x.config['filebrowser'+n(w.getName())+'WindowHeight']||x.config.filebrowserWindowHeight||'70%',A=C.filebrowser.params||{};A.CKEditor=x.name;A.CKEditorFuncNum=x._.filebrowserFn;if(!A.langCode)A.langCode=x.langCode;var B=m(C.filebrowser.url,A);x.popup(B,y,z,x.config.filebrowserWindowFeatures||x.config.fileBrowserWindowFeatures);};function p(v){var y=this;var w=y.getDialog(),x=w.getParentEditor();x._.filebrowserSe=y;if(!w.getContentElement(y['for'][0],y['for'][1]).getInputElement().$.value)return false;if(!w.getContentElement(y['for'][0],y['for'][1]).getAction())return false;return true;};function q(v,w,x){var y=x.params||{};y.CKEditor=v.name;y.CKEditorFuncNum=v._.filebrowserFn;if(!y.langCode)y.langCode=v.langCode;w.action=m(x.url,y);w.filebrowser=x;};function r(v,w,x,y){var z,A;for(var B in y){z=y[B];
-if(z.type=='hbox'||z.type=='vbox'||z.type=='fieldset')r(v,w,x,z.children);if(!z.filebrowser)continue;if(typeof z.filebrowser=='string'){var C={action:z.type=='fileButton'?'QuickUpload':'Browse',target:z.filebrowser};z.filebrowser=C;}if(z.filebrowser.action=='Browse'){var D=z.filebrowser.url;if(D===undefined){D=v.config['filebrowser'+n(w)+'BrowseUrl'];if(D===undefined)D=v.config.filebrowserBrowseUrl;}if(D){z.onClick=o;z.filebrowser.url=D;z.hidden=false;}}else if(z.filebrowser.action=='QuickUpload'&&z['for']){D=z.filebrowser.url;if(D===undefined){D=v.config['filebrowser'+n(w)+'UploadUrl'];if(D===undefined)D=v.config.filebrowserUploadUrl;}if(D){var E=z.onClick;z.onClick=function(F){var G=F.sender;if(E&&E.call(G,F)===false)return false;return p.call(G,F);};z.filebrowser.url=D;z.hidden=false;q(v,x.getContents(z['for'][0]).get(z['for'][1]),z.filebrowser);}}}};function s(v,w){var x=w.getDialog(),y=w.filebrowser.target||null;if(y){var z=y.split(':'),A=x.getContentElement(z[0],z[1]);if(A){A.setValue(v);x.selectPage(z[0]);}}};function t(v,w,x){if(x.indexOf(';')!==-1){var y=x.split(';');for(var z=0;z<y.length;z++){if(t(v,w,y[z]))return true;}return false;}var A=v.getContents(w).get(x).filebrowser;return A&&A.url;};function u(v,w){var A=this;var x=A._.filebrowserSe.getDialog(),y=A._.filebrowserSe['for'],z=A._.filebrowserSe.filebrowser.onSelect;if(y)x.getContentElement(y[0],y[1]).reset();if(typeof w=='function'&&w.call(A._.filebrowserSe)===false)return;if(z&&z.call(A._.filebrowserSe,v,w)===false)return;if(typeof w=='string'&&w)alert(w);if(v)s(v,A._.filebrowserSe);};j.add('filebrowser',{init:function(v,w){v._.filebrowserFn=e.addFunction(u,v);v.on('destroy',function(){e.removeFunction(this._.filebrowserFn);});}});a.on('dialogDefinition',function(v){var w=v.data.definition,x;for(var y in w.contents){if(x=w.contents[y]){r(v.editor,v.data.name,w,x.elements);if(x.hidden&&x.filebrowser)x.hidden=!t(w,x.id,x.filebrowser);}}});})();j.add('find',{requires:['dialog'],init:function(m){var n=j.find;m.ui.addButton('Find',{label:m.lang.findAndReplace.find,command:'find'});var o=m.addCommand('find',new a.dialogCommand('find'));o.canUndo=false;o.readOnly=1;m.ui.addButton('Replace',{label:m.lang.findAndReplace.replace,command:'replace'});var p=m.addCommand('replace',new a.dialogCommand('replace'));p.canUndo=false;a.dialog.add('find',this.path+'dialogs/find.js');a.dialog.add('replace',this.path+'dialogs/find.js');},requires:['styles']});i.find_highlight={element:'span',styles:{'background-color':'#004',color:'#fff'}};
-(function(){var m=/\.swf(?:$|\?)/i;function n(p){var q=p.attributes;return q.type=='application/x-shockwave-flash'||m.test(q.src||'');};function o(p,q){return p.createFakeParserElement(q,'cke_flash','flash',true);};j.add('flash',{init:function(p){p.addCommand('flash',new a.dialogCommand('flash'));p.ui.addButton('Flash',{label:p.lang.common.flash,command:'flash'});a.dialog.add('flash',this.path+'dialogs/flash.js');p.addCss('img.cke_flash{background-image: url('+a.getUrl(this.path+'images/placeholder.png')+');'+'background-position: center center;'+'background-repeat: no-repeat;'+'border: 1px solid #a9a9a9;'+'width: 80px;'+'height: 80px;'+'}');if(p.addMenuItems)p.addMenuItems({flash:{label:p.lang.flash.properties,command:'flash',group:'flash'}});p.on('doubleclick',function(q){var r=q.data.element;if(r.is('img')&&r.data('cke-real-element-type')=='flash')q.data.dialog='flash';});if(p.contextMenu)p.contextMenu.addListener(function(q,r){if(q&&q.is('img')&&!q.isReadOnly()&&q.data('cke-real-element-type')=='flash')return{flash:2};});},afterInit:function(p){var q=p.dataProcessor,r=q&&q.dataFilter;if(r)r.addRules({elements:{'cke:object':function(s){var t=s.attributes,u=t.classid&&String(t.classid).toLowerCase();if(!u&&!n(s)){for(var v=0;v<s.children.length;v++){if(s.children[v].name=='cke:embed'){if(!n(s.children[v]))return null;return o(p,s);}}return null;}return o(p,s);},'cke:embed':function(s){if(!n(s))return null;return o(p,s);}}},5);},requires:['fakeobjects']});})();e.extend(i,{flashEmbedTagOnly:false,flashAddEmbedTag:true,flashConvertOnEdit:false});(function(){function m(n,o,p,q,r,s,t){var u=n.config,v=r.split(';'),w=[],x={};for(var y=0;y<v.length;y++){var z=v[y];if(z){z=z.split('/');var A={},B=v[y]=z[0];A[p]=w[y]=z[1]||B;x[B]=new a.style(t,A);x[B]._.definition.name=B;}else v.splice(y--,1);}n.ui.addRichCombo(o,{label:q.label,title:q.panelTitle,className:'cke_'+(p=='size'?'fontSize':'font'),panel:{css:n.skin.editor.css.concat(u.contentsCss),multiSelect:false,attributes:{'aria-label':q.panelTitle}},init:function(){this.startGroup(q.panelTitle);for(var C=0;C<v.length;C++){var D=v[C];this.add(D,x[D].buildPreview(),D);}},onClick:function(C){n.focus();n.fire('saveSnapshot');var D=x[C];if(this.getValue()==C)D.remove(n.document);else D.apply(n.document);n.fire('saveSnapshot');},onRender:function(){n.on('selectionChange',function(C){var D=this.getValue(),E=C.data.path,F=E.elements;for(var G=0,H;G<F.length;G++){H=F[G];for(var I in x){if(x[I].checkElementMatch(H,true)){if(I!=D)this.setValue(I);
-return;}}}this.setValue('',s);},this);}});};j.add('font',{requires:['richcombo','styles'],init:function(n){var o=n.config;m(n,'Font','family',n.lang.font,o.font_names,o.font_defaultLabel,o.font_style);m(n,'FontSize','size',n.lang.fontSize,o.fontSize_sizes,o.fontSize_defaultLabel,o.fontSize_style);}});})();i.font_names='Arial/Arial, Helvetica, sans-serif;Comic Sans MS/Comic Sans MS, cursive;Courier New/Courier New, Courier, monospace;Georgia/Georgia, serif;Lucida Sans Unicode/Lucida Sans Unicode, Lucida Grande, sans-serif;Tahoma/Tahoma, Geneva, sans-serif;Times New Roman/Times New Roman, Times, serif;Trebuchet MS/Trebuchet MS, Helvetica, sans-serif;Verdana/Verdana, Geneva, sans-serif';i.font_defaultLabel='';i.font_style={element:'span',styles:{'font-family':'#(family)'},overrides:[{element:'font',attributes:{face:null}}]};i.fontSize_sizes='8/8px;9/9px;10/10px;11/11px;12/12px;14/14px;16/16px;18/18px;20/20px;22/22px;24/24px;26/26px;28/28px;36/36px;48/48px;72/72px';i.fontSize_defaultLabel='';i.fontSize_style={element:'span',styles:{'font-size':'#(size)'},overrides:[{element:'font',attributes:{size:null}}]};j.add('format',{requires:['richcombo','styles'],init:function(m){var n=m.config,o=m.lang.format,p=n.format_tags.split(';'),q={};for(var r=0;r<p.length;r++){var s=p[r];q[s]=new a.style(n['format_'+s]);q[s]._.enterMode=m.config.enterMode;}m.ui.addRichCombo('Format',{label:o.label,title:o.panelTitle,className:'cke_format',panel:{css:m.skin.editor.css.concat(n.contentsCss),multiSelect:false,attributes:{'aria-label':o.panelTitle}},init:function(){this.startGroup(o.panelTitle);for(var t in q){var u=o['tag_'+t];this.add(t,q[t].buildPreview(u),u);}},onClick:function(t){m.focus();m.fire('saveSnapshot');var u=q[t],v=new d.elementPath(m.getSelection().getStartElement());u[u.checkActive(v)?'remove':'apply'](m.document);setTimeout(function(){m.fire('saveSnapshot');},0);},onRender:function(){m.on('selectionChange',function(t){var u=this.getValue(),v=t.data.path;for(var w in q){if(q[w].checkActive(v)){if(w!=u)this.setValue(w,m.lang.format['tag_'+w]);return;}}this.setValue('');},this);}});}});i.format_tags='p;h1;h2;h3;h4;h5;h6;pre;address;div';i.format_p={element:'p'};i.format_div={element:'div'};i.format_pre={element:'pre'};i.format_address={element:'address'};i.format_h1={element:'h1'};i.format_h2={element:'h2'};i.format_h3={element:'h3'};i.format_h4={element:'h4'};i.format_h5={element:'h5'};i.format_h6={element:'h6'};j.add('forms',{requires:['dialog'],init:function(m){var n=m.lang;
-m.addCss('form{border: 1px dotted #FF0000;padding: 2px;}\n');m.addCss('img.cke_hidden{background-image: url('+a.getUrl(this.path+'images/hiddenfield.gif')+');'+'background-position: center center;'+'background-repeat: no-repeat;'+'border: 1px solid #a9a9a9;'+'width: 16px !important;'+'height: 16px !important;'+'}');var o=function(q,r,s){m.addCommand(r,new a.dialogCommand(r));m.ui.addButton(q,{label:n.common[q.charAt(0).toLowerCase()+q.slice(1)],command:r});a.dialog.add(r,s);},p=this.path+'dialogs/';o('Form','form',p+'form.js');o('Checkbox','checkbox',p+'checkbox.js');o('Radio','radio',p+'radio.js');o('TextField','textfield',p+'textfield.js');o('Textarea','textarea',p+'textarea.js');o('Select','select',p+'select.js');o('Button','button',p+'button.js');o('ImageButton','imagebutton',j.getPath('image')+'dialogs/image.js');o('HiddenField','hiddenfield',p+'hiddenfield.js');if(m.addMenuItems)m.addMenuItems({form:{label:n.form.menu,command:'form',group:'form'},checkbox:{label:n.checkboxAndRadio.checkboxTitle,command:'checkbox',group:'checkbox'},radio:{label:n.checkboxAndRadio.radioTitle,command:'radio',group:'radio'},textfield:{label:n.textfield.title,command:'textfield',group:'textfield'},hiddenfield:{label:n.hidden.title,command:'hiddenfield',group:'hiddenfield'},imagebutton:{label:n.image.titleButton,command:'imagebutton',group:'imagebutton'},button:{label:n.button.title,command:'button',group:'button'},select:{label:n.select.title,command:'select',group:'select'},textarea:{label:n.textarea.title,command:'textarea',group:'textarea'}});if(m.contextMenu){m.contextMenu.addListener(function(q){if(q&&q.hasAscendant('form',true)&&!q.isReadOnly())return{form:2};});m.contextMenu.addListener(function(q){if(q&&!q.isReadOnly()){var r=q.getName();if(r=='select')return{select:2};if(r=='textarea')return{textarea:2};if(r=='input')switch(q.getAttribute('type')){case 'button':case 'submit':case 'reset':return{button:2};case 'checkbox':return{checkbox:2};case 'radio':return{radio:2};case 'image':return{imagebutton:2};default:return{textfield:2};}if(r=='img'&&q.data('cke-real-element-type')=='hiddenfield')return{hiddenfield:2};}});}m.on('doubleclick',function(q){var r=q.data.element;if(r.is('form'))q.data.dialog='form';else if(r.is('select'))q.data.dialog='select';else if(r.is('textarea'))q.data.dialog='textarea';else if(r.is('img')&&r.data('cke-real-element-type')=='hiddenfield')q.data.dialog='hiddenfield';else if(r.is('input'))switch(r.getAttribute('type')){case 'button':case 'submit':case 'reset':q.data.dialog='button';
-break;case 'checkbox':q.data.dialog='checkbox';break;case 'radio':q.data.dialog='radio';break;case 'image':q.data.dialog='imagebutton';break;default:q.data.dialog='textfield';break;}});},afterInit:function(m){var n=m.dataProcessor,o=n&&n.htmlFilter,p=n&&n.dataFilter;if(c)o&&o.addRules({elements:{input:function(q){var r=q.attributes,s=r.type;if(!s)r.type='text';if(s=='checkbox'||s=='radio')r.value=='on'&&delete r.value;}}});if(p)p.addRules({elements:{input:function(q){if(q.attributes.type=='hidden')return m.createFakeParserElement(q,'cke_hidden','hiddenfield');}}});},requires:['image','fakeobjects']});if(c)h.prototype.hasAttribute=e.override(h.prototype.hasAttribute,function(m){return function(n){var q=this;var o=q.$.attributes.getNamedItem(n);if(q.getName()=='input')switch(n){case 'class':return q.$.className.length>0;case 'checked':return!!q.$.checked;case 'value':var p=q.getAttribute('type');return p=='checkbox'||p=='radio'?q.$.value!='on':q.$.value;}return m.apply(q,arguments);};});(function(){var m={canUndo:false,exec:function(o){var p=o.document.createElement('hr');o.insertElement(p);}},n='horizontalrule';j.add(n,{init:function(o){o.addCommand(n,m);o.ui.addButton('HorizontalRule',{label:o.lang.horizontalrule,command:n});}});})();(function(){var m=/^[\t\r\n ]*(?: |\xa0)$/,n='{cke_protected}';function o(T){var U=T.children.length,V=T.children[U-1];while(V&&V.type==3&&!e.trim(V.value))V=T.children[--U];return V;};function p(T,U){var V=T.children,W=o(T);if(W){if((U||!c)&&W.type==1&&W.name=='br')V.pop();if(W.type==3&&m.test(W.value))V.pop();}};function q(T,U,V){if(!U&&(!V||typeof V=='function'&&V(T)===false))return false;if(U&&c&&(document.documentMode>7||T.name in f.tr||T.name in f.$listItem))return false;var W=o(T);return!W||W&&(W.type==1&&W.name=='br'||T.name=='form'&&W.name=='input');};function r(T,U){return function(V){p(V,!T);if(q(V,!T,U))if(T||c)V.add(new a.htmlParser.text('\xa0'));else V.add(new a.htmlParser.element('br',{}));};};var s=f,t=['caption','colgroup','col','thead','tfoot','tbody'],u=e.extend({},s.$block,s.$listItem,s.$tableContent);for(var v in u){if(!('br' in s[v]))delete u[v];}delete u.pre;var w={elements:{},attributeNames:[[/^on/,'data-cke-pa-on']]},x={elements:{}};for(v in u)x.elements[v]=r();var y={elementNames:[[/^cke:/,''],[/^\?xml:namespace$/,'']],attributeNames:[[/^data-cke-(saved|pa)-/,''],[/^data-cke-.*/,''],['hidefocus','']],elements:{$:function(T){var U=T.attributes;if(U){if(U['data-cke-temp'])return false;var V=['name','href','src'],W;
-for(var X=0;X<V.length;X++){W='data-cke-saved-'+V[X];W in U&&delete U[V[X]];}}return T;},table:function(T){var U=T.children;U.sort(function(V,W){return V.type==1&&W.type==V.type?e.indexOf(t,V.name)>e.indexOf(t,W.name)?1:-1:0;});},embed:function(T){var U=T.parent;if(U&&U.name=='object'){var V=U.attributes.width,W=U.attributes.height;V&&(T.attributes.width=V);W&&(T.attributes.height=W);}},param:function(T){T.children=[];T.isEmpty=true;return T;},a:function(T){if(!(T.children.length||T.attributes.name||T.attributes['data-cke-saved-name']))return false;},span:function(T){if(T.attributes['class']=='Apple-style-span')delete T.name;},pre:function(T){c&&p(T);},html:function(T){delete T.attributes.contenteditable;delete T.attributes['class'];},body:function(T){delete T.attributes.spellcheck;delete T.attributes.contenteditable;},style:function(T){var U=T.children[0];U&&U.value&&(U.value=e.trim(U.value));if(!T.attributes.type)T.attributes.type='text/css';},title:function(T){var U=T.children[0];U&&(U.value=T.attributes['data-cke-title']||'');}},attributes:{'class':function(T,U){return e.ltrim(T.replace(/(?:^|\s+)cke_[^\s]*/g,''))||false;}}};if(c)y.attributes.style=function(T,U){return T.replace(/(^|;)([^\:]+)/g,function(V){return V.toLowerCase();});};function z(T){var U=T.attributes;if(U.contenteditable!='false')U['data-cke-editable']=U.contenteditable?'true':1;U.contenteditable='false';};function A(T){var U=T.attributes;switch(U['data-cke-editable']){case 'true':U.contenteditable='true';break;case '1':delete U.contenteditable;break;}};for(v in {input:1,textarea:1}){w.elements[v]=z;y.elements[v]=A;}var B=/<(a|area|img|input)\b([^>]*)>/gi,C=/\b(on\w+|href|src|name)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+))/gi,D=/(?:<style(?=[ >])[^>]*>[\s\S]*<\/style>)|(?:<(:?link|meta|base)[^>]*>)/gi,E=/<cke:encoded>([^<]*)<\/cke:encoded>/gi,F=/(<\/?)((?:object|embed|param|html|body|head|title)[^>]*>)/gi,G=/(<\/?)cke:((?:html|body|head|title)[^>]*>)/gi,H=/<cke:(param|embed)([^>]*?)\/?>(?!\s*<\/cke:\1)/gi;function I(T){return T.replace(B,function(U,V,W){return '<'+V+W.replace(C,function(X,Y){if(!/^on/.test(Y)&&W.indexOf('data-cke-saved-'+Y)==-1)return ' data-cke-saved-'+X+' data-cke-'+a.rnd+'-'+X;return X;})+'>';});};function J(T){return T.replace(D,function(U){return '<cke:encoded>'+encodeURIComponent(U)+'</cke:encoded>';});};function K(T){return T.replace(E,function(U,V){return decodeURIComponent(V);});};function L(T){return T.replace(F,'$1cke:$2');};function M(T){return T.replace(G,'$1$2');
-};function N(T){return T.replace(H,'<cke:$1$2></cke:$1>');};function O(T){return T.replace(/(<pre\b[^>]*>)(\r\n|\n)/g,'$1$2$2');};function P(T){return T.replace(/<!--(?!{cke_protected})[\s\S]+?-->/g,function(U){return '<!--'+n+'{C}'+encodeURIComponent(U).replace(/--/g,'%2D%2D')+'-->';});};function Q(T){return T.replace(/<!--\{cke_protected\}\{C\}([\s\S]+?)-->/g,function(U,V){return decodeURIComponent(V);});};function R(T,U){var V=U._.dataStore;return T.replace(/<!--\{cke_protected\}([\s\S]+?)-->/g,function(W,X){return decodeURIComponent(X);}).replace(/\{cke_protected_(\d+)\}/g,function(W,X){return V&&V[X]||'';});};function S(T,U){var V=[],W=U.config.protectedSource,X=U._.dataStore||(U._.dataStore={id:1}),Y=/<\!--\{cke_temp(comment)?\}(\d*?)-->/g,Z=[/<script[\s\S]*?<\/script>/gi,/<noscript[\s\S]*?<\/noscript>/gi].concat(W);T=T.replace(/<!--[\s\S]*?-->/g,function(ab){return '<!--{cke_tempcomment}'+(V.push(ab)-1)+'-->';});for(var aa=0;aa<Z.length;aa++)T=T.replace(Z[aa],function(ab){ab=ab.replace(Y,function(ac,ad,ae){return V[ae];});return/cke_temp(comment)?/.test(ab)?ab:'<!--{cke_temp}'+(V.push(ab)-1)+'-->';});T=T.replace(Y,function(ab,ac,ad){return '<!--'+n+(ac?'{C}':'')+encodeURIComponent(V[ad]).replace(/--/g,'%2D%2D')+'-->';});return T.replace(/(['"]).*?\1/g,function(ab){return ab.replace(/<!--\{cke_protected\}([\s\S]+?)-->/g,function(ac,ad){X[X.id]=decodeURIComponent(ad);return '{cke_protected_'+X.id++ +'}';});});};j.add('htmldataprocessor',{requires:['htmlwriter'],init:function(T){var U=T.dataProcessor=new a.htmlDataProcessor(T);U.writer.forceSimpleAmpersand=T.config.forceSimpleAmpersand;U.dataFilter.addRules(w);U.dataFilter.addRules(x);U.htmlFilter.addRules(y);var V={elements:{}};for(v in u)V.elements[v]=r(true,T.config.fillEmptyBlocks);U.htmlFilter.addRules(V);},onLoad:function(){!('fillEmptyBlocks' in i)&&(i.fillEmptyBlocks=1);}});a.htmlDataProcessor=function(T){var U=this;U.editor=T;U.writer=new a.htmlWriter();U.dataFilter=new a.htmlParser.filter();U.htmlFilter=new a.htmlParser.filter();};a.htmlDataProcessor.prototype={toHtml:function(T,U){T=S(T,this.editor);T=I(T);T=J(T);T=L(T);T=N(T);T=O(T);var V=new h('div');V.setHtml('a'+T);T=V.getHtml().substr(1);T=T.replace(new RegExp(' data-cke-'+a.rnd+'-','ig'),' ');T=M(T);T=K(T);T=Q(T);var W=a.htmlParser.fragment.fromHtml(T,U),X=new a.htmlParser.basicWriter();W.writeHtml(X,this.dataFilter);T=X.getHtml(true);T=P(T);return T;},toDataFormat:function(T,U){var V=this.writer,W=a.htmlParser.fragment.fromHtml(T,U);V.reset();
-W.writeHtml(V,this.htmlFilter);var X=V.getHtml(true);X=Q(X);X=R(X,this.editor);return X;}};})();(function(){j.add('iframe',{requires:['dialog','fakeobjects'],init:function(m){var n='iframe',o=m.lang.iframe;a.dialog.add(n,this.path+'dialogs/iframe.js');m.addCommand(n,new a.dialogCommand(n));m.addCss('img.cke_iframe{background-image: url('+a.getUrl(this.path+'images/placeholder.png')+');'+'background-position: center center;'+'background-repeat: no-repeat;'+'border: 1px solid #a9a9a9;'+'width: 80px;'+'height: 80px;'+'}');m.ui.addButton('Iframe',{label:o.toolbar,command:n});m.on('doubleclick',function(p){var q=p.data.element;if(q.is('img')&&q.data('cke-real-element-type')=='iframe')p.data.dialog='iframe';});if(m.addMenuItems)m.addMenuItems({iframe:{label:o.title,command:'iframe',group:'image'}});if(m.contextMenu)m.contextMenu.addListener(function(p,q){if(p&&p.is('img')&&p.data('cke-real-element-type')=='iframe')return{iframe:2};});},afterInit:function(m){var n=m.dataProcessor,o=n&&n.dataFilter;if(o)o.addRules({elements:{iframe:function(p){return m.createFakeParserElement(p,'cke_iframe','iframe',true);}}});}});})();(function(){j.add('image',{requires:['dialog'],init:function(o){var p='image';a.dialog.add(p,this.path+'dialogs/image.js');o.addCommand(p,new a.dialogCommand(p));o.ui.addButton('Image',{label:o.lang.common.image,command:p});o.on('doubleclick',function(q){var r=q.data.element;if(r.is('img')&&!r.data('cke-realelement')&&!r.isReadOnly())q.data.dialog='image';});if(o.addMenuItems)o.addMenuItems({image:{label:o.lang.image.menu,command:'image',group:'image'}});if(o.contextMenu)o.contextMenu.addListener(function(q,r){if(m(o,q))return{image:2};});},afterInit:function(o){p('left');p('right');p('center');p('block');function p(q){var r=o.getCommand('justify'+q);if(r){if(q=='left'||q=='right')r.on('exec',function(s){var t=m(o),u;if(t){u=n(t);if(u==q){t.removeStyle('float');if(q==n(t))t.removeAttribute('align');}else t.setStyle('float',q);s.cancel();}});r.on('refresh',function(s){var t=m(o),u;if(t){u=n(t);this.setState(u==q?1:q=='right'||q=='left'?2:0);s.cancel();}});}};}});function m(o,p){if(!p){var q=o.getSelection();p=q.getType()==3&&q.getSelectedElement();}if(p&&p.is('img')&&!p.data('cke-realelement')&&!p.isReadOnly())return p;};function n(o){var p=o.getStyle('float');if(p=='inherit'||p=='none')p=0;if(!p)p=o.getAttribute('align');return p;};})();i.image_removeLinkByEmptyURL=true;(function(){var m={ol:1,ul:1},n=d.walker.whitespaces(true),o=d.walker.bookmark(false,true);
-function p(t){var B=this;if(t.editor.readOnly)return null;var u=t.editor,v=t.data.path,w=v&&v.contains(m),x=v.block||v.blockLimit;if(w)return B.setState(2);if(!B.useIndentClasses&&B.name=='indent')return B.setState(2);if(!x)return B.setState(0);if(B.useIndentClasses){var y=x.$.className.match(B.classNameRegex),z=0;if(y){y=y[1];z=B.indentClassMap[y];}if(B.name=='outdent'&&!z||B.name=='indent'&&z==u.config.indentClasses.length)return B.setState(0);return B.setState(2);}else{var A=parseInt(x.getStyle(r(x)),10);if(isNaN(A))A=0;if(A<=0)return B.setState(0);return B.setState(2);}};function q(t,u){var w=this;w.name=u;w.useIndentClasses=t.config.indentClasses&&t.config.indentClasses.length>0;if(w.useIndentClasses){w.classNameRegex=new RegExp('(?:^|\\s+)('+t.config.indentClasses.join('|')+')(?=$|\\s)');w.indentClassMap={};for(var v=0;v<t.config.indentClasses.length;v++)w.indentClassMap[t.config.indentClasses[v]]=v+1;}w.startDisabled=u=='outdent';};function r(t,u){return(u||t.getComputedStyle('direction'))=='ltr'?'margin-left':'margin-right';};function s(t){return t.type==1&&t.is('li');};q.prototype={exec:function(t){var u=this,v={};function w(M){var N=C.startContainer,O=C.endContainer;while(N&&!N.getParent().equals(M))N=N.getParent();while(O&&!O.getParent().equals(M))O=O.getParent();if(!N||!O)return;var P=N,Q=[],R=false;while(!R){if(P.equals(O))R=true;Q.push(P);P=P.getNext();}if(Q.length<1)return;var S=M.getParents(true);for(var T=0;T<S.length;T++){if(S[T].getName&&m[S[T].getName()]){M=S[T];break;}}var U=u.name=='indent'?1:-1,V=Q[0],W=Q[Q.length-1],X=j.list.listToArray(M,v),Y=X[W.getCustomData('listarray_index')].indent;for(T=V.getCustomData('listarray_index');T<=W.getCustomData('listarray_index');T++){X[T].indent+=U;if(U>0){var Z=X[T].parent;X[T].parent=new h(Z.getName(),Z.getDocument());}}for(T=W.getCustomData('listarray_index')+1;T<X.length&&X[T].indent>Y;T++)X[T].indent+=U;var aa=j.list.arrayToList(X,v,null,t.config.enterMode,M.getDirection());if(u.name=='outdent'){var ab;if((ab=M.getParent())&&ab.is('li')){var ac=aa.listNode.getChildren(),ad=[],ae=ac.count(),af;for(T=ae-1;T>=0;T--){if((af=ac.getItem(T))&&af.is&&af.is('li'))ad.push(af);}}}if(aa)aa.listNode.replace(M);if(ad&&ad.length)for(T=0;T<ad.length;T++){var ag=ad[T],ah=ag;while((ah=ah.getNext())&&ah.is&&ah.getName() in m){if(c&&!ag.getFirst(function(ai){return n(ai)&&o(ai);}))ag.append(C.document.createText('\xa0'));ag.append(ah);}ag.insertAfter(ab);}};function x(){var M=C.createIterator(),N=t.config.enterMode;
-M.enforceRealBlocks=true;M.enlargeBr=N!=2;var O;while(O=M.getNextParagraph(N==1?'p':'div'))y(O);};function y(M,N){if(M.getCustomData('indent_processed'))return false;if(u.useIndentClasses){var O=M.$.className.match(u.classNameRegex),P=0;if(O){O=O[1];P=u.indentClassMap[O];}if(u.name=='outdent')P--;else P++;if(P<0)return false;P=Math.min(P,t.config.indentClasses.length);P=Math.max(P,0);M.$.className=e.ltrim(M.$.className.replace(u.classNameRegex,''));if(P>0)M.addClass(t.config.indentClasses[P-1]);}else{var Q=r(M,N),R=parseInt(M.getStyle(Q),10);if(isNaN(R))R=0;var S=t.config.indentOffset||40;R+=(u.name=='indent'?1:-1)*S;if(R<0)return false;R=Math.max(R,0);R=Math.ceil(R/S)*S;M.setStyle(Q,R?R+(t.config.indentUnit||'px'):'');if(M.getAttribute('style')==='')M.removeAttribute('style');}h.setMarker(v,M,'indent_processed',1);return true;};var z=t.getSelection(),A=z.createBookmarks(1),B=z&&z.getRanges(1),C,D=B.createIterator();while(C=D.getNextRange()){var E=C.getCommonAncestor(),F=E;while(F&&!(F.type==1&&m[F.getName()]))F=F.getParent();if(!F){var G=C.getEnclosedNode();if(G&&G.type==1&&G.getName() in m){C.setStartAt(G,1);C.setEndAt(G,2);F=G;}}if(F&&C.startContainer.type==1&&C.startContainer.getName() in m){var H=new d.walker(C);H.evaluator=s;C.startContainer=H.next();}if(F&&C.endContainer.type==1&&C.endContainer.getName() in m){H=new d.walker(C);H.evaluator=s;C.endContainer=H.previous();}if(F){var I=F.getFirst(s),J=!!I.getNext(s),K=C.startContainer,L=I.equals(K)||I.contains(K);if(!(L&&(u.name=='indent'||u.useIndentClasses||parseInt(F.getStyle(r(F)),10))&&y(F,!J&&I.getDirection())))w(F);}else x();}h.clearAllMarkers(v);t.forceNextSelectionCheck();z.selectBookmarks(A);}};j.add('indent',{init:function(t){var u=t.addCommand('indent',new q(t,'indent')),v=t.addCommand('outdent',new q(t,'outdent'));t.ui.addButton('Indent',{label:t.lang.indent,command:'indent'});t.ui.addButton('Outdent',{label:t.lang.outdent,command:'outdent'});t.on('selectionChange',e.bind(p,u));t.on('selectionChange',e.bind(p,v));if(b.ie6Compat||b.ie7Compat)t.addCss('ul,ol{\tmargin-left: 0px;\tpadding-left: 40px;}');t.on('dirChanged',function(w){var x=new d.range(t.document);x.setStartBefore(w.data.node);x.setEndAfter(w.data.node);var y=new d.walker(x),z;while(z=y.next()){if(z.type==1){if(!z.equals(w.data.node)&&z.getDirection()){x.setStartAfter(z);y=new d.walker(x);continue;}var A=t.config.indentClasses;if(A){var B=w.data.dir=='ltr'?['_rtl','']:['','_rtl'];for(var C=0;C<A.length;C++){if(z.hasClass(A[C]+B[0])){z.removeClass(A[C]+B[0]);
-z.addClass(A[C]+B[1]);}}}var D=z.getStyle('margin-right'),E=z.getStyle('margin-left');D?z.setStyle('margin-left',D):z.removeStyle('margin-left');E?z.setStyle('margin-right',E):z.removeStyle('margin-right');}}});},requires:['domiterator','list']});})();(function(){function m(q,r){r=r===undefined||r;var s;if(r)s=q.getComputedStyle('text-align');else{while(!q.hasAttribute||!(q.hasAttribute('align')||q.getStyle('text-align'))){var t=q.getParent();if(!t)break;q=t;}s=q.getStyle('text-align')||q.getAttribute('align')||'';}s&&(s=s.replace(/(?:-(?:moz|webkit)-)?(?:start|auto)/i,''));!s&&r&&(s=q.getComputedStyle('direction')=='rtl'?'right':'left');return s;};function n(q){if(q.editor.readOnly)return;q.editor.getCommand(this.name).refresh(q.data.path);};function o(q,r,s){var u=this;u.editor=q;u.name=r;u.value=s;var t=q.config.justifyClasses;if(t){switch(s){case 'left':u.cssClassName=t[0];break;case 'center':u.cssClassName=t[1];break;case 'right':u.cssClassName=t[2];break;case 'justify':u.cssClassName=t[3];break;}u.cssClassRegex=new RegExp('(?:^|\\s+)(?:'+t.join('|')+')(?=$|\\s)');}};function p(q){var r=q.editor,s=new d.range(r.document);s.setStartBefore(q.data.node);s.setEndAfter(q.data.node);var t=new d.walker(s),u;while(u=t.next()){if(u.type==1){if(!u.equals(q.data.node)&&u.getDirection()){s.setStartAfter(u);t=new d.walker(s);continue;}var v=r.config.justifyClasses;if(v)if(u.hasClass(v[0])){u.removeClass(v[0]);u.addClass(v[2]);}else if(u.hasClass(v[2])){u.removeClass(v[2]);u.addClass(v[0]);}var w='text-align',x=u.getStyle(w);if(x=='left')u.setStyle(w,'right');else if(x=='right')u.setStyle(w,'left');}}};o.prototype={exec:function(q){var C=this;var r=q.getSelection(),s=q.config.enterMode;if(!r)return;var t=r.createBookmarks(),u=r.getRanges(true),v=C.cssClassName,w,x,y=q.config.useComputedState;y=y===undefined||y;for(var z=u.length-1;z>=0;z--){w=u[z].createIterator();w.enlargeBr=s!=2;while(x=w.getNextParagraph(s==1?'p':'div')){x.removeAttribute('align');x.removeStyle('text-align');var A=v&&(x.$.className=e.ltrim(x.$.className.replace(C.cssClassRegex,''))),B=C.state==2&&(!y||m(x,true)!=C.value);if(v){if(B)x.addClass(v);else if(!A)x.removeAttribute('class');}else if(B)x.setStyle('text-align',C.value);}}q.focus();q.forceNextSelectionCheck();r.selectBookmarks(t);},refresh:function(q){var r=q.block||q.blockLimit;this.setState(r.getName()!='body'&&m(r,this.editor.config.useComputedState)==this.value?1:2);}};j.add('justify',{init:function(q){var r=new o(q,'justifyleft','left'),s=new o(q,'justifycenter','center'),t=new o(q,'justifyright','right'),u=new o(q,'justifyblock','justify');
-q.addCommand('justifyleft',r);q.addCommand('justifycenter',s);q.addCommand('justifyright',t);q.addCommand('justifyblock',u);q.ui.addButton('JustifyLeft',{label:q.lang.justify.left,command:'justifyleft'});q.ui.addButton('JustifyCenter',{label:q.lang.justify.center,command:'justifycenter'});q.ui.addButton('JustifyRight',{label:q.lang.justify.right,command:'justifyright'});q.ui.addButton('JustifyBlock',{label:q.lang.justify.block,command:'justifyblock'});q.on('selectionChange',e.bind(n,r));q.on('selectionChange',e.bind(n,t));q.on('selectionChange',e.bind(n,s));q.on('selectionChange',e.bind(n,u));q.on('dirChanged',p);},requires:['domiterator']});})();j.add('keystrokes',{beforeInit:function(m){m.keystrokeHandler=new a.keystrokeHandler(m);m.specialKeys={};},init:function(m){var n=m.config.keystrokes,o=m.config.blockedKeystrokes,p=m.keystrokeHandler.keystrokes,q=m.keystrokeHandler.blockedKeystrokes;for(var r=0;r<n.length;r++)p[n[r][0]]=n[r][1];for(r=0;r<o.length;r++)q[o[r]]=1;}});a.keystrokeHandler=function(m){var n=this;if(m.keystrokeHandler)return m.keystrokeHandler;n.keystrokes={};n.blockedKeystrokes={};n._={editor:m};return n;};(function(){var m,n=function(p){p=p.data;var q=p.getKeystroke(),r=this.keystrokes[q],s=this._.editor;m=s.fire('key',{keyCode:q})===true;if(!m){if(r){var t={from:'keystrokeHandler'};m=s.execCommand(r,t)!==false;}if(!m){var u=s.specialKeys[q];m=u&&u(s)===true;if(!m)m=!!this.blockedKeystrokes[q];}}if(m)p.preventDefault(true);return!m;},o=function(p){if(m){m=false;p.data.preventDefault(true);}};a.keystrokeHandler.prototype={attach:function(p){p.on('keydown',n,this);if(b.opera||b.gecko&&b.mac)p.on('keypress',o,this);}};})();i.blockedKeystrokes=[1114112+66,1114112+73,1114112+85];i.keystrokes=[[4456448+121,'toolbarFocus'],[4456448+122,'elementsPathFocus'],[2228224+121,'contextMenu'],[1114112+2228224+121,'contextMenu'],[1114112+90,'undo'],[1114112+89,'redo'],[1114112+2228224+90,'redo'],[1114112+76,'link'],[1114112+66,'bold'],[1114112+73,'italic'],[1114112+85,'underline'],[4456448+(c||b.webkit?189:109),'toolbarCollapse'],[4456448+48,'a11yHelp']];j.add('link',{requires:['fakeobjects','dialog'],init:function(m){m.addCommand('link',new a.dialogCommand('link'));m.addCommand('anchor',new a.dialogCommand('anchor'));m.addCommand('unlink',new a.unlinkCommand());m.addCommand('removeAnchor',new a.removeAnchorCommand());m.ui.addButton('Link',{label:m.lang.link.toolbar,command:'link'});m.ui.addButton('Unlink',{label:m.lang.unlink,command:'unlink'});m.ui.addButton('Anchor',{label:m.lang.anchor.toolbar,command:'anchor'});
-a.dialog.add('link',this.path+'dialogs/link.js');a.dialog.add('anchor',this.path+'dialogs/anchor.js');var n=m.lang.dir=='rtl'?'right':'left',o='background:url('+a.getUrl(this.path+'images/anchor.gif')+') no-repeat '+n+' center;'+'border:1px dotted #00f;';m.addCss('a.cke_anchor,a.cke_anchor_empty'+(c&&b.version<7?'':',a[name],a[data-cke-saved-name]')+'{'+o+'padding-'+n+':18px;'+'cursor:auto;'+'}'+(c?'a.cke_anchor_empty{display:inline-block;}':'')+'img.cke_anchor'+'{'+o+'width:16px;'+'min-height:15px;'+'height:1.15em;'+'vertical-align:'+(b.opera?'middle':'text-bottom')+';'+'}');m.on('selectionChange',function(p){if(m.readOnly)return;var q=m.getCommand('unlink'),r=p.data.path.lastElement&&p.data.path.lastElement.getAscendant('a',true);if(r&&r.getName()=='a'&&r.getAttribute('href')&&r.getChildCount())q.setState(2);else q.setState(0);});m.on('doubleclick',function(p){var q=j.link.getSelectedLink(m)||p.data.element;if(!q.isReadOnly())if(q.is('a')){p.data.dialog=q.getAttribute('name')&&(!q.getAttribute('href')||!q.getChildCount())?'anchor':'link';m.getSelection().selectElement(q);}else if(j.link.tryRestoreFakeAnchor(m,q))p.data.dialog='anchor';});if(m.addMenuItems)m.addMenuItems({anchor:{label:m.lang.anchor.menu,command:'anchor',group:'anchor',order:1},removeAnchor:{label:m.lang.anchor.remove,command:'removeAnchor',group:'anchor',order:5},link:{label:m.lang.link.menu,command:'link',group:'link',order:1},unlink:{label:m.lang.unlink,command:'unlink',group:'link',order:5}});if(m.contextMenu)m.contextMenu.addListener(function(p,q){if(!p||p.isReadOnly())return null;var r=j.link.tryRestoreFakeAnchor(m,p);if(!r&&!(r=j.link.getSelectedLink(m)))return null;var s={};if(r.getAttribute('href')&&r.getChildCount())s={link:2,unlink:2};if(r&&r.hasAttribute('name'))s.anchor=s.removeAnchor=2;return s;});},afterInit:function(m){var n=m.dataProcessor,o=n&&n.dataFilter,p=n&&n.htmlFilter,q=m._.elementsPath&&m._.elementsPath.filters;if(o)o.addRules({elements:{a:function(r){var s=r.attributes;if(!s.name)return null;var t=!r.children.length;if(j.link.synAnchorSelector){var u=t?'cke_anchor_empty':'cke_anchor',v=s['class'];if(s.name&&(!v||v.indexOf(u)<0))s['class']=(v||'')+' '+u;if(t&&j.link.emptyAnchorFix){s.contenteditable='false';s['data-cke-editable']=1;}}else if(j.link.fakeAnchor&&t)return m.createFakeParserElement(r,'cke_anchor','anchor');return null;}}});if(j.link.emptyAnchorFix&&p)p.addRules({elements:{a:function(r){delete r.attributes.contenteditable;}}});if(q)q.push(function(r,s){if(s=='a')if(j.link.tryRestoreFakeAnchor(m,r)||r.getAttribute('name')&&(!r.getAttribute('href')||!r.getChildCount()))return 'anchor';
-});}});j.link={getSelectedLink:function(m){try{var n=m.getSelection();if(n.getType()==3){var o=n.getSelectedElement();if(o.is('a'))return o;}var p=n.getRanges(true)[0];p.shrink(2);var q=p.getCommonAncestor();return q.getAscendant('a',true);}catch(r){return null;}},fakeAnchor:b.opera||b.webkit,synAnchorSelector:c,emptyAnchorFix:c&&b.version<8,tryRestoreFakeAnchor:function(m,n){if(n&&n.data('cke-real-element-type')&&n.data('cke-real-element-type')=='anchor'){var o=m.restoreRealElement(n);if(o.data('cke-saved-name'))return o;}}};a.unlinkCommand=function(){};a.unlinkCommand.prototype={exec:function(m){var n=m.getSelection(),o=n.createBookmarks(),p=n.getRanges(),q,r;for(var s=0;s<p.length;s++){q=p[s].getCommonAncestor(true);r=q.getAscendant('a',true);if(!r)continue;p[s].selectNodeContents(r);}n.selectRanges(p);m.document.$.execCommand('unlink',false,null);n.selectBookmarks(o);},startDisabled:true};a.removeAnchorCommand=function(){};a.removeAnchorCommand.prototype={exec:function(m){var n=m.getSelection(),o=n.createBookmarks(),p;if(n&&(p=n.getSelectedElement())&&(j.link.fakeAnchor&&!p.getChildCount()?j.link.tryRestoreFakeAnchor(m,p):p.is('a')))p.remove(1);else if(p=j.link.getSelectedLink(m))if(p.hasAttribute('href')){p.removeAttributes({name:1,'data-cke-saved-name':1});p.removeClass('cke_anchor');}else p.remove(1);n.selectBookmarks(o);}};e.extend(i,{linkShowAdvancedTab:true,linkShowTargetTab:true});(function(){var m={ol:1,ul:1},n=/^[\n\r\t ]*$/,o=d.walker.whitespaces(),p=d.walker.bookmark(),q=function(N){return!(o(N)||p(N));},r=d.walker.bogus();function s(N){var O,P,Q;if(O=N.getDirection()){P=N.getParent();while(P&&!(Q=P.getDirection()))P=P.getParent();if(O==Q)N.removeAttribute('dir');}};function t(N,O){var P=N.getAttribute('style');P&&O.setAttribute('style',P.replace(/([^;])$/,'$1;')+(O.getAttribute('style')||''));};j.list={listToArray:function(N,O,P,Q,R){if(!m[N.getName()])return[];if(!Q)Q=0;if(!P)P=[];for(var S=0,T=N.getChildCount();S<T;S++){var U=N.getChild(S);if(U.type==1&&U.getName() in f.$list)j.list.listToArray(U,O,P,Q+1);if(U.$.nodeName.toLowerCase()!='li')continue;var V={parent:N,indent:Q,element:U,contents:[]};if(!R){V.grandparent=N.getParent();if(V.grandparent&&V.grandparent.$.nodeName.toLowerCase()=='li')V.grandparent=V.grandparent.getParent();}else V.grandparent=R;if(O)h.setMarker(O,U,'listarray_index',P.length);P.push(V);for(var W=0,X=U.getChildCount(),Y;W<X;W++){Y=U.getChild(W);if(Y.type==1&&m[Y.getName()])j.list.listToArray(Y,O,P,Q+1,V.grandparent);
-else V.contents.push(Y);}}return P;},arrayToList:function(N,O,P,Q,R){if(!P)P=0;if(!N||N.length<P+1)return null;var S,T=N[P].parent.getDocument(),U=new d.documentFragment(T),V=null,W=P,X=Math.max(N[P].indent,0),Y=null,Z,aa,ab=Q==1?'p':'div';while(1){var ac=N[W],ad=ac.grandparent;Z=ac.element.getDirection(1);if(ac.indent==X){if(!V||N[W].parent.getName()!=V.getName()){V=N[W].parent.clone(false,1);R&&V.setAttribute('dir',R);U.append(V);}Y=V.append(ac.element.clone(0,1));if(Z!=V.getDirection(1))Y.setAttribute('dir',Z);for(S=0;S<ac.contents.length;S++)Y.append(ac.contents[S].clone(1,1));W++;}else if(ac.indent==Math.max(X,0)+1){var ae=N[W-1].element.getDirection(1),af=j.list.arrayToList(N,null,W,Q,ae!=Z?Z:null);if(!Y.getChildCount()&&c&&!(T.$.documentMode>7))Y.append(T.createText('\xa0'));Y.append(af.listNode);W=af.nextIndex;}else if(ac.indent==-1&&!P&&ad){if(m[ad.getName()]){Y=ac.element.clone(false,true);if(Z!=ad.getDirection(1))Y.setAttribute('dir',Z);}else Y=new d.documentFragment(T);var ag=ad.getDirection(1)!=Z,ah=ac.element,ai=ah.getAttribute('class'),aj=ah.getAttribute('style'),ak=Y.type==11&&(Q!=2||ag||aj||ai),al,am=ac.contents.length;for(S=0;S<am;S++){al=ac.contents[S];if(al.type==1&&al.isBlockBoundary()){if(ag&&!al.getDirection())al.setAttribute('dir',Z);t(ah,al);ai&&al.addClass(ai);}else if(ak){if(!aa){aa=T.createElement(ab);ag&&aa.setAttribute('dir',Z);}aj&&aa.setAttribute('style',aj);ai&&aa.setAttribute('class',ai);aa.append(al.clone(1,1));}Y.append(aa||al.clone(1,1));}if(Y.type==11&&W!=N.length-1){var an=Y.getLast();if(an&&an.type==1&&an.getAttribute('type')=='_moz')an.remove();if(!(an=Y.getLast(q)&&an.type==1&&an.getName() in f.$block))Y.append(T.createElement('br'));}var ao=Y.$.nodeName.toLowerCase();if(!c&&(ao=='div'||ao=='p'))Y.appendBogus();U.append(Y);V=null;W++;}else return null;aa=null;if(N.length<=W||Math.max(N[W].indent,0)<X)break;}if(O){var ap=U.getFirst(),aq=N[0].parent;while(ap){if(ap.type==1){h.clearMarkers(O,ap);if(ap.getName() in f.$listItem)s(ap);}ap=ap.getNextSourceNode();}}return{listNode:U,nextIndex:W};}};function u(N){if(N.editor.readOnly)return null;var O=N.data.path,P=O.blockLimit,Q=O.elements,R,S;for(S=0;S<Q.length&&(R=Q[S])&&!R.equals(P);S++){if(m[Q[S].getName()])return this.setState(this.type==Q[S].getName()?1:2);}return this.setState(2);};function v(N,O,P,Q){var R=j.list.listToArray(O.root,P),S=[];for(var T=0;T<O.contents.length;T++){var U=O.contents[T];U=U.getAscendant('li',true);if(!U||U.getCustomData('list_item_processed'))continue;
-S.push(U);h.setMarker(P,U,'list_item_processed',true);}var V=O.root,W=V.getDocument(),X,Y;for(T=0;T<S.length;T++){var Z=S[T].getCustomData('listarray_index');X=R[Z].parent;if(!X.is(this.type)){Y=W.createElement(this.type);X.copyAttributes(Y,{start:1,type:1});Y.removeStyle('list-style-type');R[Z].parent=Y;}}var aa=j.list.arrayToList(R,P,null,N.config.enterMode),ab,ac=aa.listNode.getChildCount();for(T=0;T<ac&&(ab=aa.listNode.getChild(T));T++){if(ab.getName()==this.type)Q.push(ab);}aa.listNode.replace(O.root);};var w=/^h[1-6]$/;function x(N,O,P){var Q=O.contents,R=O.root.getDocument(),S=[];if(Q.length==1&&Q[0].equals(O.root)){var T=R.createElement('div');Q[0].moveChildren&&Q[0].moveChildren(T);Q[0].append(T);Q[0]=T;}var U=O.contents[0].getParent();for(var V=0;V<Q.length;V++)U=U.getCommonAncestor(Q[V].getParent());var W=N.config.useComputedState,X,Y;W=W===undefined||W;for(V=0;V<Q.length;V++){var Z=Q[V],aa;while(aa=Z.getParent()){if(aa.equals(U)){S.push(Z);if(!Y&&Z.getDirection())Y=1;var ab=Z.getDirection(W);if(X!==null)if(X&&X!=ab)X=null;else X=ab;break;}Z=aa;}}if(S.length<1)return;var ac=S[S.length-1].getNext(),ad=R.createElement(this.type);P.push(ad);var ae,af;while(S.length){ae=S.shift();af=R.createElement('li');if(ae.is('pre')||w.test(ae.getName()))ae.appendTo(af);else{ae.copyAttributes(af);if(X&&ae.getDirection()){af.removeStyle('direction');af.removeAttribute('dir');}ae.moveChildren(af);ae.remove();}af.appendTo(ad);}if(X&&Y)ad.setAttribute('dir',X);if(ac)ad.insertBefore(ac);else ad.appendTo(U);};function y(N,O,P){var Q=j.list.listToArray(O.root,P),R=[];for(var S=0;S<O.contents.length;S++){var T=O.contents[S];T=T.getAscendant('li',true);if(!T||T.getCustomData('list_item_processed'))continue;R.push(T);h.setMarker(P,T,'list_item_processed',true);}var U=null;for(S=0;S<R.length;S++){var V=R[S].getCustomData('listarray_index');Q[V].indent=-1;U=V;}for(S=U+1;S<Q.length;S++){if(Q[S].indent>Q[S-1].indent+1){var W=Q[S-1].indent+1-Q[S].indent,X=Q[S].indent;while(Q[S]&&Q[S].indent>=X){Q[S].indent+=W;S++;}S--;}}var Y=j.list.arrayToList(Q,P,null,N.config.enterMode,O.root.getAttribute('dir')),Z=Y.listNode,aa,ab;function ac(ad){if((aa=Z[ad?'getFirst':'getLast']())&&!(aa.is&&aa.isBlockBoundary())&&(ab=O.root[ad?'getPrevious':'getNext'](d.walker.whitespaces(true)))&&!(ab.is&&ab.isBlockBoundary({br:1})))N.document.createElement('br')[ad?'insertBefore':'insertAfter'](aa);};ac(true);ac();Z.replace(O.root);};function z(N,O){this.name=N;this.type=O;};var A=d.walker.nodeType(1);function B(N,O,P,Q){var R,S;
-while(R=N[Q?'getLast':'getFirst'](A)){if((S=R.getDirection(1))!==O.getDirection(1))R.setAttribute('dir',S);R.remove();P?R[Q?'insertBefore':'insertAfter'](P):O.append(R,Q);}};z.prototype={exec:function(N){var aq=this;var O=N.document,P=N.config,Q=N.getSelection(),R=Q&&Q.getRanges(true);if(!R||R.length<1)return;if(aq.state==2){var S=O.getBody();if(!S.getFirst(q)){P.enterMode==2?S.appendBogus():R[0].fixBlock(1,P.enterMode==1?'p':'div');Q.selectRanges(R);}else{var T=R.length==1&&R[0],U=T&&T.getEnclosedNode();if(U&&U.is&&aq.type==U.getName())aq.setState(1);}}var V=Q.createBookmarks(true),W=[],X={},Y=R.createIterator(),Z=0;while((T=Y.getNextRange())&&++Z){var aa=T.getBoundaryNodes(),ab=aa.startNode,ac=aa.endNode;if(ab.type==1&&ab.getName()=='td')T.setStartAt(aa.startNode,1);if(ac.type==1&&ac.getName()=='td')T.setEndAt(aa.endNode,2);var ad=T.createIterator(),ae;ad.forceBrBreak=aq.state==2;while(ae=ad.getNextParagraph()){if(ae.getCustomData('list_block'))continue;else h.setMarker(X,ae,'list_block',1);var af=new d.elementPath(ae),ag=af.elements,ah=ag.length,ai=null,aj=0,ak=af.blockLimit,al;for(var am=ah-1;am>=0&&(al=ag[am]);am--){if(m[al.getName()]&&ak.contains(al)){ak.removeCustomData('list_group_object_'+Z);var an=al.getCustomData('list_group_object');if(an)an.contents.push(ae);else{an={root:al,contents:[ae]};W.push(an);h.setMarker(X,al,'list_group_object',an);}aj=1;break;}}if(aj)continue;var ao=ak;if(ao.getCustomData('list_group_object_'+Z))ao.getCustomData('list_group_object_'+Z).contents.push(ae);else{an={root:ao,contents:[ae]};h.setMarker(X,ao,'list_group_object_'+Z,an);W.push(an);}}}var ap=[];while(W.length>0){an=W.shift();if(aq.state==2){if(m[an.root.getName()])v.call(aq,N,an,X,ap);else x.call(aq,N,an,ap);}else if(aq.state==1&&m[an.root.getName()])y.call(aq,N,an,X);}for(am=0;am<ap.length;am++)C(ap[am]);h.clearAllMarkers(X);Q.selectBookmarks(V);N.focus();}};function C(N){var O;(O=function(P){var Q=N[P?'getPrevious':'getNext'](q);if(Q&&Q.type==1&&Q.is(N.getName())){B(N,Q,null,!P);N.remove();N=Q;}})();O(1);};var D=f,E=/[\t\r\n ]*(?: |\xa0)$/;function F(N,O){var P,Q=N.children,R=Q.length;for(var S=0;S<R;S++){P=Q[S];if(P.name&&P.name in O)return S;}return R;};function G(N){return function(O){var P=O.children,Q=F(O,D.$list),R=P[Q],S=R&&R.previous,T;if(S&&(S.name&&S.name=='br'||S.value&&(T=S.value.match(E)))){var U=S;if(!(T&&T.index)&&U==P[0])P[0]=N||c?new a.htmlParser.text('\xa0'):new a.htmlParser.element('br',{});else if(U.name=='br')P.splice(Q-1,1);else U.value=U.value.replace(E,'');
-}};};var H={elements:{}};for(var I in D.$listItem)H.elements[I]=G();var J={elements:{}};for(I in D.$listItem)J.elements[I]=G(true);function K(N){return N.type==1&&(N.getName() in f.$block||N.getName() in f.$listItem)&&f[N.getName()]['#'];};function L(N,O,P){N.fire('saveSnapshot');P.enlarge(3);var Q=P.extractContents();O.trim(false,true);var R=O.createBookmark(),S=new d.elementPath(O.startContainer),T=S.lastElement.getAscendant('li',1),U=S.block.getBogus();U&&U.remove();var V=Q.getLast();if(V&&V.type==1&&V.is('br'))V.remove();var W=O.startContainer.getChild(O.startOffset);if(W)Q.insertBefore(W);else O.startContainer.append(Q);var X=new d.elementPath(P.startContainer),Y=P.startContainer.getAscendant('li',1);if(Y){var Z=M(Y);if(Z)if(T.contains(Y)){B(Z,Y.getParent(),Y);Z.remove();}else T.append(Z);}while(P.checkStartOfBlock()&&P.checkEndOfBlock()){X=new d.elementPath(P.startContainer);var aa=X.block,ab;if(aa.is('li')){ab=aa.getParent();if(aa.equals(ab.getLast(q))&&aa.equals(ab.getFirst(q)))aa=ab;}P.moveToPosition(aa,3);aa.remove();}var ac=P.clone(),ad=N.document.getBody();ac.setEndAt(ad,2);var ae=new d.walker(ac);ae.evaluator=function(ag){return q(ag)&&!r(ag);};var af=ae.next();if(af&&af.type==1&&af.getName() in f.$list)C(af);O.moveToBookmark(R);O.select();N.selectionChange(1);N.fire('saveSnapshot');};function M(N){var O=N.getLast(q);return O&&O.type==1&&O.getName() in m?O:null;};j.add('list',{init:function(N){var O=N.addCommand('numberedlist',new z('numberedlist','ol')),P=N.addCommand('bulletedlist',new z('bulletedlist','ul'));N.ui.addButton('NumberedList',{label:N.lang.numberedlist,command:'numberedlist'});N.ui.addButton('BulletedList',{label:N.lang.bulletedlist,command:'bulletedlist'});N.on('selectionChange',e.bind(u,O));N.on('selectionChange',e.bind(u,P));N.on('key',function(Q){var R=Q.data.keyCode;if(N.mode=='wysiwyg'&&R in {8:1,46:1}){var S=N.getSelection(),T=S.getRanges()[0];if(!T.collapsed)return;var U=R==8,V=N.document.getBody(),W=new d.walker(T.clone());W.evaluator=function(ah){return q(ah)&&!r(ah);};var X=T.clone();if(U){var Y,Z,aa=new d.elementPath(T.startContainer);if((Y=aa.contains(m))&&T.checkBoundaryOfElement(Y,1)&&(Y=Y.getParent())&&Y.is('li')&&(Y=M(Y))){Z=Y;Y=Y.getPrevious(q);X.moveToPosition(Y&&r(Y)?Y:Z,3);}else{W.range.setStartAt(V,1);W.range.setEnd(T.startContainer,T.startOffset);Y=W.previous();if(Y&&Y.type==1&&(Y.getName() in m||Y.is('li'))){if(!Y.is('li')){W.range.selectNodeContents(Y);W.reset();W.evaluator=K;Y=W.previous();}Z=Y;X.moveToElementEditEnd(Z);
-}}if(Z){L(N,X,T);Q.cancel();}}else{var ab=T.startContainer.getAscendant('li',1);if(ab){W.range.setEndAt(V,2);var ac=ab.getLast(q),ad=ac&&K(ac)?ac:ab,ae=0,af=W.next();if(af&&af.type==1&&af.getName() in m&&af.equals(ac)){ae=1;af=W.next();}else if(T.checkBoundaryOfElement(ad,2))ae=1;if(ae&&af){var ag=T.clone();ag.moveToElementEditStart(af);L(N,X,ag);Q.cancel();}}}setTimeout(function(){N.selectionChange(1);});}});},afterInit:function(N){var O=N.dataProcessor;if(O){O.dataFilter.addRules(H);O.htmlFilter.addRules(J);}},requires:['domiterator']});})();(function(){j.liststyle={requires:['dialog'],init:function(m){m.addCommand('numberedListStyle',new a.dialogCommand('numberedListStyle'));a.dialog.add('numberedListStyle',this.path+'dialogs/liststyle.js');m.addCommand('bulletedListStyle',new a.dialogCommand('bulletedListStyle'));a.dialog.add('bulletedListStyle',this.path+'dialogs/liststyle.js');if(m.addMenuItems){m.addMenuGroup('list',108);m.addMenuItems({numberedlist:{label:m.lang.list.numberedTitle,group:'list',command:'numberedListStyle'},bulletedlist:{label:m.lang.list.bulletedTitle,group:'list',command:'bulletedListStyle'}});}if(m.contextMenu)m.contextMenu.addListener(function(n,o){if(!n||n.isReadOnly())return null;while(n){var p=n.getName();if(p=='ol')return{numberedlist:2};else if(p=='ul')return{bulletedlist:2};n=n.getParent();}return null;});}};j.add('liststyle',j.liststyle);})();(function(){function m(s){if(!s||s.type!=1||s.getName()!='form')return[];var t=[],u=['style','className'];for(var v=0;v<u.length;v++){var w=u[v],x=s.$.elements.namedItem(w);if(x){var y=new h(x);t.push([y,y.nextSibling]);y.remove();}}return t;};function n(s,t){if(!s||s.type!=1||s.getName()!='form')return;if(t.length>0)for(var u=t.length-1;u>=0;u--){var v=t[u][0],w=t[u][1];if(w)v.insertBefore(w);else v.appendTo(s);}};function o(s,t){var u=m(s),v={},w=s.$;if(!t){v['class']=w.className||'';w.className='';}v.inline=w.style.cssText||'';if(!t)w.style.cssText='position: static; overflow: visible';n(u);return v;};function p(s,t){var u=m(s),v=s.$;if('class' in t)v.className=t['class'];if('inline' in t)v.style.cssText=t.inline;n(u);};function q(s){var t=a.instances;for(var u in t){var v=t[u];if(v.mode=='wysiwyg'&&!v.readOnly){var w=v.document.getBody();w.setAttribute('contentEditable',false);w.setAttribute('contentEditable',true);}}if(s.focusManager.hasFocus){s.toolbox.focus();s.focus();}};function r(s){if(!c||b.version>6)return null;var t=h.createFromHtml('<iframe frameborder="0" tabindex="-1" src="javascript:void((function(){document.open();'+(b.isCustomDomain()?"document.domain='"+this.getDocument().$.domain+"';":'')+'document.close();'+'})())"'+' style="display:block;position:absolute;z-index:-1;'+'progid:DXImageTransform.Microsoft.Alpha(opacity=0);'+'"></iframe>');
-return s.append(t,true);};j.add('maximize',{init:function(s){var t=s.lang,u=a.document,v=u.getWindow(),w,x,y,z;function A(){var C=v.getViewPaneSize();z&&z.setStyles({width:C.width+'px',height:C.height+'px'});s.resize(C.width,C.height,null,true);};var B=2;s.addCommand('maximize',{modes:{wysiwyg:!b.iOS,source:!b.iOS},readOnly:1,editorFocus:false,exec:function(){var C=s.container.getChild(1),D=s.getThemeSpace('contents');if(s.mode=='wysiwyg'){var E=s.getSelection();w=E&&E.getRanges();x=v.getScrollPosition();}else{var F=s.textarea.$;w=!c&&[F.selectionStart,F.selectionEnd];x=[F.scrollLeft,F.scrollTop];}if(this.state==2){v.on('resize',A);y=v.getScrollPosition();var G=s.container;while(G=G.getParent()){G.setCustomData('maximize_saved_styles',o(G));G.setStyle('z-index',s.config.baseFloatZIndex-1);}D.setCustomData('maximize_saved_styles',o(D,true));C.setCustomData('maximize_saved_styles',o(C,true));var H={overflow:b.webkit?'':'hidden',width:0,height:0};u.getDocumentElement().setStyles(H);!b.gecko&&u.getDocumentElement().setStyle('position','fixed');!(b.gecko&&b.quirks)&&u.getBody().setStyles(H);c?setTimeout(function(){v.$.scrollTo(0,0);},0):v.$.scrollTo(0,0);C.setStyle('position',b.gecko&&b.quirks?'fixed':'absolute');C.$.offsetLeft;C.setStyles({'z-index':s.config.baseFloatZIndex-1,left:'0px',top:'0px'});z=r(C);C.addClass('cke_maximized');A();var I=C.getDocumentPosition();C.setStyles({left:-1*I.x+'px',top:-1*I.y+'px'});b.gecko&&q(s);}else if(this.state==1){v.removeListener('resize',A);var J=[D,C];for(var K=0;K<J.length;K++){p(J[K],J[K].getCustomData('maximize_saved_styles'));J[K].removeCustomData('maximize_saved_styles');}G=s.container;while(G=G.getParent()){p(G,G.getCustomData('maximize_saved_styles'));G.removeCustomData('maximize_saved_styles');}c?setTimeout(function(){v.$.scrollTo(y.x,y.y);},0):v.$.scrollTo(y.x,y.y);C.removeClass('cke_maximized');if(b.webkit){C.setStyle('display','inline');setTimeout(function(){C.setStyle('display','block');},0);}if(z){z.remove();z=null;}s.fire('resize');}this.toggleState();var L=this.uiItems[0];if(L){var M=this.state==2?t.maximize:t.minimize,N=s.element.getDocument().getById(L._.id);N.getChild(1).setHtml(M);N.setAttribute('title',M);N.setAttribute('href','javascript:void("'+M+'");');}if(s.mode=='wysiwyg'){if(w){b.gecko&&q(s);s.getSelection().selectRanges(w);var O=s.getSelection().getStartElement();O&&O.scrollIntoView(true);}else v.$.scrollTo(x.x,x.y);}else{if(w){F.selectionStart=w[0];F.selectionEnd=w[1];}F.scrollLeft=x[0];F.scrollTop=x[1];
-}w=x=null;B=this.state;},canUndo:false});s.ui.addButton('Maximize',{label:t.maximize,command:'maximize'});s.on('mode',function(){var C=s.getCommand('maximize');C.setState(C.state==0?0:B);},null,null,100);}});})();j.add('newpage',{init:function(m){m.addCommand('newpage',{modes:{wysiwyg:1,source:1},exec:function(n){var o=this;n.setData(n.config.newpage_html||'',function(){setTimeout(function(){n.fire('afterCommandExec',{name:'newpage',command:o});n.selectionChange();},200);});n.focus();},async:true});m.ui.addButton('NewPage',{label:m.lang.newPage,command:'newpage'});}});j.add('pagebreak',{init:function(m){m.addCommand('pagebreak',j.pagebreakCmd);m.ui.addButton('PageBreak',{label:m.lang.pagebreak,command:'pagebreak'});var n=['{','background: url('+a.getUrl(this.path+'images/pagebreak.gif')+') no-repeat center center;','clear: both;','width:100%; _width:99.9%;','border-top: #999999 1px dotted;','border-bottom: #999999 1px dotted;','padding:0;','height: 5px;','cursor: default;','}'].join('').replace(/;/g,' !important;');m.addCss('div.cke_pagebreak'+n);b.opera&&m.on('contentDom',function(){m.document.on('click',function(o){var p=o.data.getTarget();if(p.is('div')&&p.hasClass('cke_pagebreak'))m.getSelection().selectElement(p);});});},afterInit:function(m){var n=m.lang.pagebreakAlt,o=m.dataProcessor,p=o&&o.dataFilter,q=o&&o.htmlFilter;if(q)q.addRules({attributes:{'class':function(r,s){var t=r.replace('cke_pagebreak','');if(t!=r){var u=a.htmlParser.fragment.fromHtml('<span style="display: none;"> </span>');s.children.length=0;s.add(u);var v=s.attributes;delete v['aria-label'];delete v.contenteditable;delete v.title;}return t;}}},5);if(p)p.addRules({elements:{div:function(r){var s=r.attributes,t=s&&s.style,u=t&&r.children.length==1&&r.children[0],v=u&&u.name=='span'&&u.attributes.style;if(v&&/page-break-after\s*:\s*always/i.test(t)&&/display\s*:\s*none/i.test(v)){s.contenteditable='false';s['class']='cke_pagebreak';s['data-cke-display-name']='pagebreak';s['aria-label']=n;s.title=n;r.children.length=0;}}}});},requires:['fakeobjects']});j.pagebreakCmd={exec:function(m){var n=m.lang.pagebreakAlt,o=h.createFromHtml('<div style="page-break-after: always;"contenteditable="false" title="'+n+'" '+'aria-label="'+n+'" '+'data-cke-display-name="pagebreak" '+'class="cke_pagebreak">'+'</div>',m.document),p=m.getSelection().getRanges(true);m.fire('saveSnapshot');for(var q,r=p.length-1;r>=0;r--){q=p[r];if(r<p.length-1)o=o.clone(true);q.splitBlock('p');q.insertNode(o);if(r==p.length-1){var s=o.getNext();
-q.moveToPosition(o,4);if(!s||s.type==1&&!s.isEditable())q.fixBlock(true,m.config.enterMode==3?'div':'p');q.select();}}m.fire('saveSnapshot');}};(function(){function m(n){n.data.mode='html';};j.add('pastefromword',{init:function(n){var o=0,p=function(q){q&&q.removeListener();n.removeListener('beforePaste',m);o&&setTimeout(function(){o=0;},0);};n.addCommand('pastefromword',{canUndo:false,exec:function(){o=1;n.on('beforePaste',m);if(n.execCommand('paste','html')===false){n.on('dialogShow',function(q){q.removeListener();q.data.on('cancel',p);});n.on('dialogHide',function(q){q.data.removeListener('cancel',p);});}n.on('afterPaste',p);}});n.ui.addButton('PasteFromWord',{label:n.lang.pastefromword.toolbar,command:'pastefromword'});n.on('pasteState',function(q){n.getCommand('pastefromword').setState(q.data);});n.on('paste',function(q){var r=q.data,s;if((s=r.html)&&(o||/(class=\"?Mso|style=\"[^\"]*\bmso\-|w:WordDocument)/.test(s))){var t=this.loadFilterRules(function(){if(t)n.fire('paste',r);else if(!n.config.pasteFromWordPromptCleanup||o||confirm(n.lang.pastefromword.confirmCleanup))r.html=a.cleanWord(s,n);});t&&q.cancel();}},this);},loadFilterRules:function(n){var o=a.cleanWord;if(o)n();else{var p=a.getUrl(i.pasteFromWordCleanupFile||this.path+'filter/default.js');a.scriptLoader.load(p,n,null,true);}return!o;},requires:['clipboard']});})();(function(){var m={exec:function(n){var o=e.tryThese(function(){var p=window.clipboardData.getData('Text');if(!p)throw 0;return p;});if(!o){n.openDialog('pastetext');return false;}else n.fire('paste',{text:o});return true;}};j.add('pastetext',{init:function(n){var o='pastetext',p=n.addCommand(o,m);n.ui.addButton('PasteText',{label:n.lang.pasteText.button,command:o});a.dialog.add(o,a.getUrl(this.path+'dialogs/pastetext.js'));if(n.config.forcePasteAsPlainText){n.on('beforeCommandExec',function(q){var r=q.data.commandData;if(q.data.name=='paste'&&r!='html'){n.execCommand('pastetext');q.cancel();}},null,null,0);n.on('beforePaste',function(q){q.data.mode='text';});}n.on('pasteState',function(q){n.getCommand('pastetext').setState(q.data);});},requires:['clipboard']});})();j.add('popup');e.extend(a.editor.prototype,{popup:function(m,n,o,p){n=n||'80%';o=o||'70%';if(typeof n=='string'&&n.length>1&&n.substr(n.length-1,1)=='%')n=parseInt(window.screen.width*parseInt(n,10)/100,10);if(typeof o=='string'&&o.length>1&&o.substr(o.length-1,1)=='%')o=parseInt(window.screen.height*parseInt(o,10)/100,10);if(n<640)n=640;if(o<420)o=420;var q=parseInt((window.screen.height-o)/2,10),r=parseInt((window.screen.width-n)/2,10);
-p=(p||'location=no,menubar=no,toolbar=no,dependent=yes,minimizable=no,modal=yes,alwaysRaised=yes,resizable=yes,scrollbars=yes')+',width='+n+',height='+o+',top='+q+',left='+r;var s=window.open('',null,p,true);if(!s)return false;try{var t=navigator.userAgent.toLowerCase();if(t.indexOf(' chrome/')==-1){s.moveTo(r,q);s.resizeTo(n,o);}s.focus();s.location.href=m;}catch(u){s=window.open(m,null,p,true);}return true;}});(function(){var m,n={modes:{wysiwyg:1,source:1},canUndo:false,readOnly:1,exec:function(p){var q,r=p.config,s=r.baseHref?'<base href="'+r.baseHref+'"/>':'',t=b.isCustomDomain();if(r.fullPage)q=p.getData().replace(/<head>/,'$&'+s).replace(/[^>]*(?=<\/title>)/,'$& — '+p.lang.preview);else{var u='<body ',v=p.document&&p.document.getBody();if(v){if(v.getAttribute('id'))u+='id="'+v.getAttribute('id')+'" ';if(v.getAttribute('class'))u+='class="'+v.getAttribute('class')+'" ';}u+='>';q=p.config.docType+'<html dir="'+p.config.contentsLangDirection+'">'+'<head>'+s+'<title>'+p.lang.preview+'</title>'+e.buildStyleHtml(p.config.contentsCss)+'</head>'+u+p.getData()+'</body></html>';}var w=640,x=420,y=80;try{var z=window.screen;w=Math.round(z.width*0.8);x=Math.round(z.height*0.7);y=Math.round(z.width*0.1);}catch(D){}var A='';if(t){window._cke_htmlToLoad=q;A='javascript:void( (function(){document.open();document.domain="'+document.domain+'";'+'document.write( window.opener._cke_htmlToLoad );'+'document.close();'+'window.opener._cke_htmlToLoad = null;'+'})() )';}if(b.gecko){window._cke_htmlToLoad=q;A=m+'preview.html';}var B=window.open(A,null,'toolbar=yes,location=no,status=yes,menubar=yes,scrollbars=yes,resizable=yes,width='+w+',height='+x+',left='+y);if(!t&&!b.gecko){var C=B.document;C.open();C.write(q);C.close();b.webkit&&setTimeout(function(){C.body.innerHTML+='';},0);}}},o='preview';j.add(o,{init:function(p){m=this.path;p.addCommand(o,n);p.ui.addButton('Preview',{label:p.lang.preview,command:o});}});})();j.add('print',{init:function(m){var n='print',o=m.addCommand(n,j.print);m.ui.addButton('Print',{label:m.lang.print,command:n});}});j.print={exec:function(m){if(b.opera)return;else if(b.gecko)m.window.$.print();else m.document.$.execCommand('Print');},canUndo:false,readOnly:1,modes:{wysiwyg:!b.opera}};j.add('removeformat',{requires:['selection'],init:function(m){m.addCommand('removeFormat',j.removeformat.commands.removeformat);m.ui.addButton('RemoveFormat',{label:m.lang.removeFormat,command:'removeFormat'});m._.removeFormat={filters:[]};}});j.removeformat={commands:{removeformat:{exec:function(m){var n=m._.removeFormatRegex||(m._.removeFormatRegex=new RegExp('^(?:'+m.config.removeFormatTags.replace(/,/g,'|')+')$','i')),o=m._.removeAttributes||(m._.removeAttributes=m.config.removeFormatAttributes.split(',')),p=j.removeformat.filter,q=m.getSelection().getRanges(1),r=q.createIterator(),s;
-while(s=r.getNextRange()){if(!s.collapsed)s.enlarge(1);var t=s.createBookmark(),u=t.startNode,v=t.endNode,w,x=function(z){var A=new d.elementPath(z),B=A.elements;for(var C=1,D;D=B[C];C++){if(D.equals(A.block)||D.equals(A.blockLimit))break;if(n.test(D.getName())&&p(m,D))z.breakParent(D);}};x(u);if(v){x(v);w=u.getNextSourceNode(true,1);while(w){if(w.equals(v))break;var y=w.getNextSourceNode(false,1);if(!(w.getName()=='img'&&w.data('cke-realelement'))&&p(m,w))if(n.test(w.getName()))w.remove(1);else{w.removeAttributes(o);m.fire('removeFormatCleanup',w);}w=y;}}s.moveToBookmark(t);}m.getSelection().selectRanges(q);}}},filter:function(m,n){var o=m._.removeFormat.filters;for(var p=0;p<o.length;p++){if(o[p](n)===false)return false;}return true;}};a.editor.prototype.addRemoveFormatFilter=function(m){this._.removeFormat.filters.push(m);};i.removeFormatTags='b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var';i.removeFormatAttributes='class,style,lang,width,height,align,hspace,valign';j.add('resize',{init:function(m){var n=m.config,o=m.element.getDirection(1);!n.resize_dir&&(n.resize_dir='both');n.resize_maxWidth==undefined&&(n.resize_maxWidth=3000);n.resize_maxHeight==undefined&&(n.resize_maxHeight=3000);n.resize_minWidth==undefined&&(n.resize_minWidth=750);n.resize_minHeight==undefined&&(n.resize_minHeight=250);if(n.resize_enabled!==false){var p=null,q,r,s=(n.resize_dir=='both'||n.resize_dir=='horizontal')&&n.resize_minWidth!=n.resize_maxWidth,t=(n.resize_dir=='both'||n.resize_dir=='vertical')&&n.resize_minHeight!=n.resize_maxHeight;function u(x){var y=x.data.$.screenX-q.x,z=x.data.$.screenY-q.y,A=r.width,B=r.height,C=A+y*(o=='rtl'?-1:1),D=B+z;if(s)A=Math.max(n.resize_minWidth,Math.min(C,n.resize_maxWidth));if(t)B=Math.max(n.resize_minHeight,Math.min(D,n.resize_maxHeight));m.resize(s?A:null,B);};function v(x){a.document.removeListener('mousemove',u);a.document.removeListener('mouseup',v);if(m.document){m.document.removeListener('mousemove',u);m.document.removeListener('mouseup',v);}};var w=e.addFunction(function(x){if(!p)p=m.getResizable();r={width:p.$.offsetWidth||0,height:p.$.offsetHeight||0};q={x:x.screenX,y:x.screenY};n.resize_minWidth>r.width&&(n.resize_minWidth=r.width);n.resize_minHeight>r.height&&(n.resize_minHeight=r.height);a.document.on('mousemove',u);a.document.on('mouseup',v);if(m.document){m.document.on('mousemove',u);m.document.on('mouseup',v);}});m.on('destroy',function(){e.removeFunction(w);});m.on('themeSpace',function(x){if(x.data.space=='bottom'){var y='';
-if(s&&!t)y=' cke_resizer_horizontal';if(!s&&t)y=' cke_resizer_vertical';var z='<div class="cke_resizer'+y+' cke_resizer_'+o+'"'+' title="'+e.htmlEncode(m.lang.resize)+'"'+' onmousedown="CKEDITOR.tools.callFunction('+w+', event)"'+'></div>';o=='ltr'&&y=='ltr'?x.data.html+=z:x.data.html=z+x.data.html;}},m,null,100);}}});(function(){var m={modes:{wysiwyg:1,source:1},readOnly:1,exec:function(o){var p=o.element.$.form;if(p)try{p.submit();}catch(q){if(p.submit.click)p.submit.click();}}},n='save';j.add(n,{init:function(o){var p=o.addCommand(n,m);p.modes={wysiwyg:!!o.element.$.form};o.ui.addButton('Save',{label:o.lang.save,command:n});}});})();(function(){var m='scaytcheck',n='';function o(t,u){var v=0,w;for(w in u){if(u[w]==t){v=1;break;}}return v;};var p=function(){var t=this,u=function(){var y=t.config,z={};z.srcNodeRef=t.document.getWindow().$.frameElement;z.assocApp='CKEDITOR.'+a.version+'@'+a.revision;z.customerid=y.scayt_customerid||'1:WvF0D4-UtPqN1-43nkD4-NKvUm2-daQqk3-LmNiI-z7Ysb4-mwry24-T8YrS3-Q2tpq2';z.customDictionaryIds=y.scayt_customDictionaryIds||'';z.userDictionaryName=y.scayt_userDictionaryName||'';z.sLang=y.scayt_sLang||'en_US';z.onLoad=function(){if(!(c&&b.version<8))this.addStyle(this.selectorCss(),'padding-bottom: 2px !important;');if(t.focusManager.hasFocus&&!q.isControlRestored(t))this.focus();};z.onBeforeChange=function(){if(q.getScayt(t)&&!t.checkDirty())setTimeout(function(){t.resetDirty();},0);};var A=window.scayt_custom_params;if(typeof A=='object')for(var B in A)z[B]=A[B];if(q.getControlId(t))z.id=q.getControlId(t);var C=new window.scayt(z);C.afterMarkupRemove.push(function(E){new h(E,C.document).mergeSiblings();});var D=q.instances[t.name];if(D){C.sLang=D.sLang;C.option(D.option());C.paused=D.paused;}q.instances[t.name]=C;try{C.setDisabled(q.isPaused(t)===false);}catch(E){}t.fire('showScaytState');};t.on('contentDom',u);t.on('contentDomUnload',function(){var y=a.document.getElementsByTag('script'),z=/^dojoIoScript(\d+)$/i,A=/^https?:\/\/svc\.webspellchecker\.net\/spellcheck\/script\/ssrv\.cgi/i;for(var B=0;B<y.count();B++){var C=y.getItem(B),D=C.getId(),E=C.getAttribute('src');if(D&&E&&D.match(z)&&E.match(A))C.remove();}});t.on('beforeCommandExec',function(y){if((y.data.name=='source'||y.data.name=='newpage')&&t.mode=='wysiwyg'){var z=q.getScayt(t);if(z){q.setPaused(t,!z.disabled);q.setControlId(t,z.id);z.destroy(true);delete q.instances[t.name];}}else if(y.data.name=='source'&&t.mode=='source')q.markControlRestore(t);});t.on('afterCommandExec',function(y){if(!q.isScaytEnabled(t))return;
-if(t.mode=='wysiwyg'&&(y.data.name=='undo'||y.data.name=='redo'))window.setTimeout(function(){q.getScayt(t).refresh();},10);});t.on('destroy',function(y){var z=y.editor,A=q.getScayt(z);if(!A)return;delete q.instances[z.name];q.setControlId(z,A.id);A.destroy(true);});t.on('afterSetData',function(){if(q.isScaytEnabled(t))window.setTimeout(function(){var y=q.getScayt(t);y&&y.refresh();},10);});t.on('insertElement',function(){var y=q.getScayt(t);if(q.isScaytEnabled(t)){if(c)t.getSelection().unlock(true);window.setTimeout(function(){y.focus();y.refresh();},10);}},this,null,50);t.on('insertHtml',function(){var y=q.getScayt(t);if(q.isScaytEnabled(t)){if(c)t.getSelection().unlock(true);window.setTimeout(function(){y.focus();y.refresh();},10);}},this,null,50);t.on('scaytDialog',function(y){y.data.djConfig=window.djConfig;y.data.scayt_control=q.getScayt(t);y.data.tab=n;y.data.scayt=window.scayt;});var v=t.dataProcessor,w=v&&v.htmlFilter;if(w)w.addRules({elements:{span:function(y){if(y.attributes['data-scayt_word']&&y.attributes['data-scaytid']){delete y.name;return y;}}}});var x=j.undo.Image.prototype;x.equals=e.override(x.equals,function(y){return function(z){var E=this;var A=E.contents,B=z.contents,C=q.getScayt(E.editor);if(C&&q.isScaytReady(E.editor)){E.contents=C.reset(A)||'';z.contents=C.reset(B)||'';}var D=y.apply(E,arguments);E.contents=A;z.contents=B;return D;};});if(t.document)u();};j.scayt={engineLoaded:false,instances:{},controlInfo:{},setControlInfo:function(t,u){if(t&&t.name&&typeof this.controlInfo[t.name]!='object')this.controlInfo[t.name]={};for(var v in u)this.controlInfo[t.name][v]=u[v];},isControlRestored:function(t){if(t&&t.name&&this.controlInfo[t.name])return this.controlInfo[t.name].restored;return false;},markControlRestore:function(t){this.setControlInfo(t,{restored:true});},setControlId:function(t,u){this.setControlInfo(t,{id:u});},getControlId:function(t){if(t&&t.name&&this.controlInfo[t.name]&&this.controlInfo[t.name].id)return this.controlInfo[t.name].id;return null;},setPaused:function(t,u){this.setControlInfo(t,{paused:u});},isPaused:function(t){if(t&&t.name&&this.controlInfo[t.name])return this.controlInfo[t.name].paused;return undefined;},getScayt:function(t){return this.instances[t.name];},isScaytReady:function(t){return this.engineLoaded===true&&'undefined'!==typeof window.scayt&&this.getScayt(t);},isScaytEnabled:function(t){var u=this.getScayt(t);return u?u.disabled===false:false;},getUiTabs:function(t){var u=[],v=t.config.scayt_uiTabs||'1,1,1';
-v=v.split(',');v[3]='1';for(var w=0;w<4;w++)u[w]=typeof window.scayt!='undefined'&&typeof window.scayt.uiTags!='undefined'?parseInt(v[w],10)&&window.scayt.uiTags[w]:parseInt(v[w],10);return u;},loadEngine:function(t){if(b.gecko&&b.version<10900||b.opera||b.air)return t.fire('showScaytState');if(this.engineLoaded===true)return p.apply(t);else if(this.engineLoaded==-1)return a.on('scaytReady',function(){p.apply(t);});a.on('scaytReady',p,t);a.on('scaytReady',function(){this.engineLoaded=true;},this,null,0);this.engineLoaded=-1;var u=document.location.protocol;u=u.search(/https?:/)!=-1?u:'http:';var v='svc.webspellchecker.net/scayt26/loader__base.js',w=t.config.scayt_srcUrl||u+'//'+v,x=q.parseUrl(w).path+'/';if(window.scayt==undefined){a._djScaytConfig={baseUrl:x,addOnLoad:[function(){a.fireOnce('scaytReady');}],isDebug:false};a.document.getHead().append(a.document.createElement('script',{attributes:{type:'text/javascript',async:'true',src:w}}));}else a.fireOnce('scaytReady');return null;},parseUrl:function(t){var u;if(t.match&&(u=t.match(/(.*)[\/\\](.*?\.\w+)$/)))return{path:u[1],file:u[2]};else return t;}};var q=j.scayt,r=function(t,u,v,w,x,y,z){t.addCommand(w,x);t.addMenuItem(w,{label:v,command:w,group:y,order:z});},s={preserveState:true,editorFocus:false,canUndo:false,exec:function(t){if(q.isScaytReady(t)){var u=q.isScaytEnabled(t);this.setState(u?2:1);var v=q.getScayt(t);v.focus();v.setDisabled(u);}else if(!t.config.scayt_autoStartup&&q.engineLoaded>=0){this.setState(0);q.loadEngine(t);}}};j.add('scayt',{requires:['menubutton'],beforeInit:function(t){var u=t.config.scayt_contextMenuItemsOrder||'suggest|moresuggest|control',v='';u=u.split('|');if(u&&u.length)for(var w=0;w<u.length;w++)v+='scayt_'+u[w]+(u.length!=parseInt(w,10)+1?',':'');t.config.menu_groups=v+','+t.config.menu_groups;},init:function(t){var u=t.dataProcessor&&t.dataProcessor.dataFilter,v={elements:{span:function(E){var F=E.attributes;if(F&&F['data-scaytid'])delete E.name;}}};u&&u.addRules(v);var w={},x={},y=t.addCommand(m,s);a.dialog.add(m,a.getUrl(this.path+'dialogs/options.js'));var z=q.getUiTabs(t),A='scaytButton';t.addMenuGroup(A);var B={},C=t.lang.scayt;B.scaytToggle={label:C.enable,command:m,group:A};if(z[0]==1)B.scaytOptions={label:C.options,group:A,onClick:function(){n='options';t.openDialog(m);}};if(z[1]==1)B.scaytLangs={label:C.langs,group:A,onClick:function(){n='langs';t.openDialog(m);}};if(z[2]==1)B.scaytDict={label:C.dictionariesTab,group:A,onClick:function(){n='dictionaries';t.openDialog(m);
-}};B.scaytAbout={label:t.lang.scayt.about,group:A,onClick:function(){n='about';t.openDialog(m);}};t.addMenuItems(B);t.ui.add('Scayt','menubutton',{label:C.title,title:b.opera?C.opera_title:C.title,className:'cke_button_scayt',modes:{wysiwyg:1},onRender:function(){y.on('state',function(){this.setState(y.state);},this);},onMenu:function(){var E=q.isScaytEnabled(t);t.getMenuItem('scaytToggle').label=C[E?'disable':'enable'];var F=q.getUiTabs(t);return{scaytToggle:2,scaytOptions:E&&F[0]?2:0,scaytLangs:E&&F[1]?2:0,scaytDict:E&&F[2]?2:0,scaytAbout:E&&F[3]?2:0};}});if(t.contextMenu&&t.addMenuItems)t.contextMenu.addListener(function(E,F){if(!q.isScaytEnabled(t)||F.getRanges()[0].checkReadOnly())return null;var G=q.getScayt(t),H=G.getScaytNode();if(!H)return null;var I=G.getWord(H);if(!I)return null;var J=G.getLang(),K={},L=window.scayt.getSuggestion(I,J);if(!L||!L.length)return null;for(var M in w){delete t._.menuItems[M];delete t._.commands[M];}for(M in x){delete t._.menuItems[M];delete t._.commands[M];}w={};x={};var N=t.config.scayt_moreSuggestions||'on',O=false,P=t.config.scayt_maxSuggestions;typeof P!='number'&&(P=5);!P&&(P=L.length);var Q=t.config.scayt_contextCommands||'all';Q=Q.split('|');for(var R=0,S=L.length;R<S;R+=1){var T='scayt_suggestion_'+L[R].replace(' ','_'),U=(function(Y,Z){return{exec:function(){G.replace(Y,Z);}};})(H,L[R]);if(R<P){r(t,'button_'+T,L[R],T,U,'scayt_suggest',R+1);K[T]=2;x[T]=2;}else if(N=='on'){r(t,'button_'+T,L[R],T,U,'scayt_moresuggest',R+1);w[T]=2;O=true;}}if(O){t.addMenuItem('scayt_moresuggest',{label:C.moreSuggestions,group:'scayt_moresuggest',order:10,getItems:function(){return w;}});x.scayt_moresuggest=2;}if(o('all',Q)||o('ignore',Q)){var V={exec:function(){G.ignore(H);}};r(t,'ignore',C.ignore,'scayt_ignore',V,'scayt_control',1);x.scayt_ignore=2;}if(o('all',Q)||o('ignoreall',Q)){var W={exec:function(){G.ignoreAll(H);}};r(t,'ignore_all',C.ignoreAll,'scayt_ignore_all',W,'scayt_control',2);x.scayt_ignore_all=2;}if(o('all',Q)||o('add',Q)){var X={exec:function(){window.scayt.addWordToUserDictionary(H);}};r(t,'add_word',C.addWord,'scayt_add_word',X,'scayt_control',3);x.scayt_add_word=2;}if(G.fireOnContextMenu)G.fireOnContextMenu(t);return x;});var D=function(){t.removeListener('showScaytState',D);if(!b.opera&&!b.air)y.setState(q.isScaytEnabled(t)?1:2);else y.setState(0);};t.on('showScaytState',D);if(b.opera||b.air)t.on('instanceReady',function(){D();});if(t.config.scayt_autoStartup)t.on('instanceReady',function(){q.loadEngine(t);});
-},afterInit:function(t){var u,v=function(w){if(w.hasAttribute('data-scaytid'))return false;};if(t._.elementsPath&&(u=t._.elementsPath.filters))u.push(v);t.addRemoveFormatFilter&&t.addRemoveFormatFilter(v);}});})();j.add('smiley',{requires:['dialog'],init:function(m){m.config.smiley_path=m.config.smiley_path||this.path+'images/';m.addCommand('smiley',new a.dialogCommand('smiley'));m.ui.addButton('Smiley',{label:m.lang.smiley.toolbar,command:'smiley'});a.dialog.add('smiley',this.path+'dialogs/smiley.js');}});i.smiley_images=['regular_smile.gif','sad_smile.gif','wink_smile.gif','teeth_smile.gif','confused_smile.gif','tounge_smile.gif','embaressed_smile.gif','omg_smile.gif','whatchutalkingabout_smile.gif','angry_smile.gif','angel_smile.gif','shades_smile.gif','devil_smile.gif','cry_smile.gif','lightbulb.gif','thumbs_down.gif','thumbs_up.gif','heart.gif','broken_heart.gif','kiss.gif','envelope.gif'];i.smiley_descriptions=['smiley','sad','wink','laugh','frown','cheeky','blush','surprise','indecision','angry','angel','cool','devil','crying','enlightened','no','yes','heart','broken heart','kiss','mail'];(function(){var m='.%2 p,.%2 div,.%2 pre,.%2 address,.%2 blockquote,.%2 h1,.%2 h2,.%2 h3,.%2 h4,.%2 h5,.%2 h6{background-repeat: no-repeat;background-position: top %3;border: 1px dotted gray;padding-top: 8px;padding-%3: 8px;}.%2 p{%1p.png);}.%2 div{%1div.png);}.%2 pre{%1pre.png);}.%2 address{%1address.png);}.%2 blockquote{%1blockquote.png);}.%2 h1{%1h1.png);}.%2 h2{%1h2.png);}.%2 h3{%1h3.png);}.%2 h4{%1h4.png);}.%2 h5{%1h5.png);}.%2 h6{%1h6.png);}',n=/%1/g,o=/%2/g,p=/%3/g,q={readOnly:1,preserveState:true,editorFocus:false,exec:function(r){this.toggleState();this.refresh(r);},refresh:function(r){if(r.document){var s=this.state==1?'addClass':'removeClass';r.document.getBody()[s]('cke_show_blocks');}}};j.add('showblocks',{requires:['wysiwygarea'],init:function(r){var s=r.addCommand('showblocks',q);s.canUndo=false;if(r.config.startupOutlineBlocks)s.setState(1);r.addCss(m.replace(n,'background-image: url('+a.getUrl(this.path)+'images/block_').replace(o,'cke_show_blocks ').replace(p,r.lang.dir=='rtl'?'right':'left'));r.ui.addButton('ShowBlocks',{label:r.lang.showBlocks,command:'showblocks'});r.on('mode',function(){if(s.state!=0)s.refresh(r);});r.on('contentDom',function(){if(s.state!=0)s.refresh(r);});}});})();(function(){var m='cke_show_border',n,o=(b.ie6Compat?['.%1 table.%2,','.%1 table.%2 td, .%1 table.%2 th','{','border : #d3d3d3 1px dotted','}']:['.%1 table.%2,','.%1 table.%2 > tr > td, .%1 table.%2 > tr > th,','.%1 table.%2 > tbody > tr > td, .%1 table.%2 > tbody > tr > th,','.%1 table.%2 > thead > tr > td, .%1 table.%2 > thead > tr > th,','.%1 table.%2 > tfoot > tr > td, .%1 table.%2 > tfoot > tr > th','{','border : #d3d3d3 1px dotted','}']).join('');
-n=o.replace(/%2/g,m).replace(/%1/g,'cke_show_borders ');var p={preserveState:true,editorFocus:false,readOnly:1,exec:function(q){this.toggleState();this.refresh(q);},refresh:function(q){if(q.document){var r=this.state==1?'addClass':'removeClass';q.document.getBody()[r]('cke_show_borders');}}};j.add('showborders',{requires:['wysiwygarea'],modes:{wysiwyg:1},init:function(q){var r=q.addCommand('showborders',p);r.canUndo=false;if(q.config.startupShowBorders!==false)r.setState(1);q.addCss(n);q.on('mode',function(){if(r.state!=0)r.refresh(q);},null,null,100);q.on('contentDom',function(){if(r.state!=0)r.refresh(q);});q.on('removeFormatCleanup',function(s){var t=s.data;if(q.getCommand('showborders').state==1&&t.is('table')&&(!t.hasAttribute('border')||parseInt(t.getAttribute('border'),10)<=0))t.addClass(m);});},afterInit:function(q){var r=q.dataProcessor,s=r&&r.dataFilter,t=r&&r.htmlFilter;if(s)s.addRules({elements:{table:function(u){var v=u.attributes,w=v['class'],x=parseInt(v.border,10);if((!x||x<=0)&&(!w||w.indexOf(m)==-1))v['class']=(w||'')+' '+m;}}});if(t)t.addRules({elements:{table:function(u){var v=u.attributes,w=v['class'];w&&(v['class']=w.replace(m,'').replace(/\s{2}/,' ').replace(/^\s+|\s+$/,''));}}});}});a.on('dialogDefinition',function(q){var r=q.data.name;if(r=='table'||r=='tableProperties'){var s=q.data.definition,t=s.getContents('info'),u=t.get('txtBorder'),v=u.commit;u.commit=e.override(v,function(y){return function(z,A){y.apply(this,arguments);var B=parseInt(this.getValue(),10);A[!B||B<=0?'addClass':'removeClass'](m);};});var w=s.getContents('advanced'),x=w&&w.get('advCSSClasses');if(x){x.setup=e.override(x.setup,function(y){return function(){y.apply(this,arguments);this.setValue(this.getValue().replace(/cke_show_border/,''));};});x.commit=e.override(x.commit,function(y){return function(z,A){y.apply(this,arguments);if(!parseInt(A.getAttribute('border'),10))A.addClass('cke_show_border');};});}}});})();j.add('sourcearea',{requires:['editingblock'],init:function(m){var n=j.sourcearea,o=a.document.getWindow();m.on('editingBlockReady',function(){var p,q;m.addMode('source',{load:function(r,s){if(c&&b.version<8)r.setStyle('position','relative');m.textarea=p=new h('textarea');p.setAttributes({dir:'ltr',tabIndex:b.webkit?-1:m.tabIndex,role:'textbox','aria-label':m.lang.editorTitle.replace('%1',m.name)});p.addClass('cke_source');p.addClass('cke_enable_context_menu');m.readOnly&&p.setAttribute('readOnly','readonly');var t={width:b.ie7Compat?'99%':'100%',height:'100%',resize:'none',outline:'none','text-align':'left'};
-if(c){q=function(){p.hide();p.setStyle('height',r.$.clientHeight+'px');p.setStyle('width',r.$.clientWidth+'px');p.show();};m.on('resize',q);o.on('resize',q);setTimeout(q,0);}r.setHtml('');r.append(p);p.setStyles(t);m.fire('ariaWidget',p);p.on('blur',function(){m.focusManager.blur();});p.on('focus',function(){m.focusManager.focus();});m.mayBeDirty=true;this.loadData(s);var u=m.keystrokeHandler;if(u)u.attach(p);setTimeout(function(){m.mode='source';m.fire('mode',{previousMode:m._.previousMode});},b.gecko||b.webkit?100:0);},loadData:function(r){p.setValue(r);m.fire('dataReady');},getData:function(){return p.getValue();},getSnapshotData:function(){return p.getValue();},unload:function(r){p.clearCustomData();m.textarea=p=null;if(q){m.removeListener('resize',q);o.removeListener('resize',q);}if(c&&b.version<8)r.removeStyle('position');},focus:function(){p.focus();}});});m.on('readOnly',function(){if(m.mode=='source')if(m.readOnly)m.textarea.setAttribute('readOnly','readonly');else m.textarea.removeAttribute('readOnly');});m.addCommand('source',n.commands.source);if(m.ui.addButton)m.ui.addButton('Source',{label:m.lang.source,command:'source'});m.on('mode',function(){m.getCommand('source').setState(m.mode=='source'?1:2);});}});j.sourcearea={commands:{source:{modes:{wysiwyg:1,source:1},editorFocus:false,readOnly:1,exec:function(m){if(m.mode=='wysiwyg')m.fire('saveSnapshot');m.getCommand('source').setState(0);m.setMode(m.mode=='source'?'wysiwyg':'source');},canUndo:false}}};(function(){j.add('stylescombo',{requires:['richcombo','styles'],init:function(n){var o=n.config,p=n.lang.stylesCombo,q={},r=[],s;function t(u){n.getStylesSet(function(v){if(!r.length){var w,x;for(var y=0,z=v.length;y<z;y++){var A=v[y];x=A.name;w=q[x]=new a.style(A);w._name=x;w._.enterMode=o.enterMode;r.push(w);}r.sort(m);}u&&u();});};n.ui.addRichCombo('Styles',{label:p.label,title:p.panelTitle,className:'cke_styles',panel:{css:n.skin.editor.css.concat(o.contentsCss),multiSelect:true,attributes:{'aria-label':p.panelTitle}},init:function(){s=this;t(function(){var u,v,w,x,y,z;for(y=0,z=r.length;y<z;y++){u=r[y];v=u._name;x=u.type;if(x!=w){s.startGroup(p['panelTitle'+String(x)]);w=x;}s.add(v,u.type==3?v:u.buildPreview(),v);}s.commit();});},onClick:function(u){n.focus();n.fire('saveSnapshot');var v=q[u],w=n.getSelection(),x=new d.elementPath(w.getStartElement());v[v.checkActive(x)?'remove':'apply'](n.document);n.fire('saveSnapshot');},onRender:function(){n.on('selectionChange',function(u){var v=this.getValue(),w=u.data.path,x=w.elements;
-for(var y=0,z=x.length,A;y<z;y++){A=x[y];for(var B in q){if(q[B].checkElementRemovable(A,true)){if(B!=v)this.setValue(B);return;}}}this.setValue('');},this);},onOpen:function(){var B=this;if(c||b.webkit)n.focus();var u=n.getSelection(),v=u.getSelectedElement(),w=new d.elementPath(v||u.getStartElement()),x=[0,0,0,0];B.showAll();B.unmarkAll();for(var y in q){var z=q[y],A=z.type;if(z.checkActive(w))B.mark(y);else if(A==3&&!z.checkApplicable(w)){B.hideItem(y);x[A]--;}x[A]++;}if(!x[1])B.hideGroup(p['panelTitle'+String(1)]);if(!x[2])B.hideGroup(p['panelTitle'+String(2)]);if(!x[3])B.hideGroup(p['panelTitle'+String(3)]);},reset:function(){if(s){delete s._.panel;delete s._.list;s._.committed=0;s._.items={};s._.state=2;}q={};r=[];t();}});n.on('instanceReady',function(){t();});}});function m(n,o){var p=n.type,q=o.type;return p==q?0:p==3?-1:q==3?1:q==1?1:-1;};})();j.add('table',{requires:['dialog'],init:function(m){var n=j.table,o=m.lang.table;m.addCommand('table',new a.dialogCommand('table'));m.addCommand('tableProperties',new a.dialogCommand('tableProperties'));m.ui.addButton('Table',{label:o.toolbar,command:'table'});a.dialog.add('table',this.path+'dialogs/table.js');a.dialog.add('tableProperties',this.path+'dialogs/table.js');if(m.addMenuItems)m.addMenuItems({table:{label:o.menu,command:'tableProperties',group:'table',order:5},tabledelete:{label:o.deleteTable,command:'tableDelete',group:'table',order:1}});m.on('doubleclick',function(p){var q=p.data.element;if(q.is('table'))p.data.dialog='tableProperties';});if(m.contextMenu)m.contextMenu.addListener(function(p,q){if(!p||p.isReadOnly())return null;var r=p.hasAscendant('table',1);if(r)return{tabledelete:2,table:2};return null;});}});(function(){var m=/^(?:td|th)$/;function n(G){var H=G.getRanges(),I=[],J={};function K(S){if(I.length>0)return;if(S.type==1&&m.test(S.getName())&&!S.getCustomData('selected_cell')){h.setMarker(J,S,'selected_cell',true);I.push(S);}};for(var L=0;L<H.length;L++){var M=H[L];if(M.collapsed){var N=M.getCommonAncestor(),O=N.getAscendant('td',true)||N.getAscendant('th',true);if(O)I.push(O);}else{var P=new d.walker(M),Q;P.guard=K;while(Q=P.next()){var R=Q.getAscendant('td')||Q.getAscendant('th');if(R&&!R.getCustomData('selected_cell')){h.setMarker(J,R,'selected_cell',true);I.push(R);}}}}h.clearAllMarkers(J);return I;};function o(G){var H=0,I=G.length-1,J={},K,L,M;while(K=G[H++])h.setMarker(J,K,'delete_cell',true);H=0;while(K=G[H++]){if((L=K.getPrevious())&&!L.getCustomData('delete_cell')||(L=K.getNext())&&!L.getCustomData('delete_cell')){h.clearAllMarkers(J);
-return L;}}h.clearAllMarkers(J);M=G[0].getParent();if(M=M.getPrevious())return M.getLast();M=G[I].getParent();if(M=M.getNext())return M.getChild(0);return null;};function p(G,H){var I=n(G),J=I[0],K=J.getAscendant('table'),L=J.getDocument(),M=I[0].getParent(),N=M.$.rowIndex,O=I[I.length-1],P=O.getParent().$.rowIndex+O.$.rowSpan-1,Q=new h(K.$.rows[P]),R=H?N:P,S=H?M:Q,T=e.buildTableMap(K),U=T[R],V=H?T[R-1]:T[R+1],W=T[0].length,X=L.createElement('tr');for(var Y=0;U[Y]&&Y<W;Y++){var Z;if(U[Y].rowSpan>1&&V&&U[Y]==V[Y]){Z=U[Y];Z.rowSpan+=1;}else{Z=new h(U[Y]).clone();Z.removeAttribute('rowSpan');!c&&Z.appendBogus();X.append(Z);Z=Z.$;}Y+=Z.colSpan-1;}H?X.insertBefore(S):X.insertAfter(S);};function q(G){if(G instanceof d.selection){var H=n(G),I=H[0],J=I.getAscendant('table'),K=e.buildTableMap(J),L=H[0].getParent(),M=L.$.rowIndex,N=H[H.length-1],O=N.getParent().$.rowIndex+N.$.rowSpan-1,P=[];for(var Q=M;Q<=O;Q++){var R=K[Q],S=new h(J.$.rows[Q]);for(var T=0;T<R.length;T++){var U=new h(R[T]),V=U.getParent().$.rowIndex;if(U.$.rowSpan==1)U.remove();else{U.$.rowSpan-=1;if(V==Q){var W=K[Q+1];W[T-1]?U.insertAfter(new h(W[T-1])):new h(J.$.rows[Q+1]).append(U,1);}}T+=U.$.colSpan-1;}P.push(S);}var X=J.$.rows,Y=new h(X[O+1]||(M>0?X[M-1]:null)||J.$.parentNode);for(Q=P.length;Q>=0;Q--)q(P[Q]);return Y;}else if(G instanceof h){J=G.getAscendant('table');if(J.$.rows.length==1)J.remove();else G.remove();}return null;};function r(G,H){var I=G.getParent(),J=I.$.cells,K=0;for(var L=0;L<J.length;L++){var M=J[L];K+=H?1:M.colSpan;if(M==G.$)break;}return K-1;};function s(G,H){var I=H?Infinity:0;for(var J=0;J<G.length;J++){var K=r(G[J],H);if(H?K<I:K>I)I=K;}return I;};function t(G,H){var I=n(G),J=I[0],K=J.getAscendant('table'),L=s(I,1),M=s(I),N=H?L:M,O=e.buildTableMap(K),P=[],Q=[],R=O.length;for(var S=0;S<R;S++){P.push(O[S][N]);var T=H?O[S][N-1]:O[S][N+1];T&&Q.push(T);}for(S=0;S<R;S++){var U;if(P[S].colSpan>1&&Q.length&&Q[S]==P[S]){U=P[S];U.colSpan+=1;}else{U=new h(P[S]).clone();U.removeAttribute('colSpan');!c&&U.appendBogus();U[H?'insertBefore':'insertAfter'].call(U,new h(P[S]));U=U.$;}S+=U.rowSpan-1;}};function u(G){var H=n(G),I=H[0],J=H[H.length-1],K=I.getAscendant('table'),L=e.buildTableMap(K),M,N,O=[];for(var P=0,Q=L.length;P<Q;P++)for(var R=0,S=L[P].length;R<S;R++){if(L[P][R]==I.$)M=R;if(L[P][R]==J.$)N=R;}for(P=M;P<=N;P++)for(R=0;R<L.length;R++){var T=L[R],U=new h(K.$.rows[R]),V=new h(T[P]);if(V.$){if(V.$.colSpan==1)V.remove();else V.$.colSpan-=1;R+=V.$.rowSpan-1;if(!U.$.cells.length)O.push(U);
-}}var W=K.$.rows[0]&&K.$.rows[0].cells,X=new h(W[M]||(M?W[M-1]:K.$.parentNode));if(O.length==Q)K.remove();return X;};function v(G){var H=[],I=G[0]&&G[0].getAscendant('table'),J,K,L,M;for(J=0,K=G.length;J<K;J++)H.push(G[J].$.cellIndex);H.sort();for(J=1,K=H.length;J<K;J++){if(H[J]-H[J-1]>1){L=H[J-1]+1;break;}}if(!L)L=H[0]>0?H[0]-1:H[H.length-1]+1;var N=I.$.rows;for(J=0,K=N.length;J<K;J++){M=N[J].cells[L];if(M)break;}return M?new h(M):I.getPrevious();};function w(G,H){var I=G.getStartElement(),J=I.getAscendant('td',1)||I.getAscendant('th',1);if(!J)return;var K=J.clone();if(!c)K.appendBogus();if(H)K.insertBefore(J);else K.insertAfter(J);};function x(G){if(G instanceof d.selection){var H=n(G),I=H[0]&&H[0].getAscendant('table'),J=o(H);for(var K=H.length-1;K>=0;K--)x(H[K]);if(J)z(J,true);else if(I)I.remove();}else if(G instanceof h){var L=G.getParent();if(L.getChildCount()==1)L.remove();else G.remove();}};function y(G){var H=G.getBogus();H&&H.remove();G.trim();};function z(G,H){var I=new d.range(G.getDocument());if(!I['moveToElementEdit'+(H?'End':'Start')](G)){I.selectNodeContents(G);I.collapse(H?false:true);}I.select(true);};function A(G,H,I){var J=G[H];if(typeof I=='undefined')return J;for(var K=0;J&&K<J.length;K++){if(I.is&&J[K]==I.$)return K;else if(K==I)return new h(J[K]);}return I.is?-1:null;};function B(G,H){var I=[];for(var J=0;J<G.length;J++){var K=G[J];I.push(K[H]);if(K[H].rowSpan>1)J+=K[H].rowSpan-1;}return I;};function C(G,H,I){var J=n(G),K;if((H?J.length!=1:J.length<2)||(K=G.getCommonAncestor())&&K.type==1&&K.is('table'))return false;var L,M=J[0],N=M.getAscendant('table'),O=e.buildTableMap(N),P=O.length,Q=O[0].length,R=M.getParent().$.rowIndex,S=A(O,R,M);if(H){var T;try{var U=parseInt(M.getAttribute('rowspan'),10)||1,V=parseInt(M.getAttribute('colspan'),10)||1;T=O[H=='up'?R-U:H=='down'?R+U:R][H=='left'?S-V:H=='right'?S+V:S];}catch(an){return false;}if(!T||M.$==T)return false;J[H=='up'||H=='left'?'unshift':'push'](new h(T));}var W=M.getDocument(),X=R,Y=0,Z=0,aa=!I&&new d.documentFragment(W),ab=0;for(var ac=0;ac<J.length;ac++){L=J[ac];var ad=L.getParent(),ae=L.getFirst(),af=L.$.colSpan,ag=L.$.rowSpan,ah=ad.$.rowIndex,ai=A(O,ah,L);ab+=af*ag;Z=Math.max(Z,ai-S+af);Y=Math.max(Y,ah-R+ag);if(!I){if(y(L),L.getChildren().count()){if(ah!=X&&ae&&!(ae.isBlockBoundary&&ae.isBlockBoundary({br:1}))){var aj=aa.getLast(d.walker.whitespaces(true));if(aj&&!(aj.is&&aj.is('br')))aa.append('br');}L.moveChildren(aa);}ac?L.remove():L.setHtml('');}X=ah;}if(!I){aa.moveChildren(M);
-if(!c)M.appendBogus();if(Z>=Q)M.removeAttribute('rowSpan');else M.$.rowSpan=Y;if(Y>=P)M.removeAttribute('colSpan');else M.$.colSpan=Z;var ak=new d.nodeList(N.$.rows),al=ak.count();for(ac=al-1;ac>=0;ac--){var am=ak.getItem(ac);if(!am.$.cells.length){am.remove();al++;continue;}}return M;}else return Y*Z==ab;};function D(G,H){var I=n(G);if(I.length>1)return false;else if(H)return true;var J=I[0],K=J.getParent(),L=K.getAscendant('table'),M=e.buildTableMap(L),N=K.$.rowIndex,O=A(M,N,J),P=J.$.rowSpan,Q,R,S,T;if(P>1){R=Math.ceil(P/2);S=Math.floor(P/2);T=N+R;var U=new h(L.$.rows[T]),V=A(M,T),W;Q=J.clone();for(var X=0;X<V.length;X++){W=V[X];if(W.parentNode==U.$&&X>O){Q.insertBefore(new h(W));break;}else W=null;}if(!W)U.append(Q,true);}else{S=R=1;U=K.clone();U.insertAfter(K);U.append(Q=J.clone());var Y=A(M,N);for(var Z=0;Z<Y.length;Z++)Y[Z].rowSpan++;}if(!c)Q.appendBogus();J.$.rowSpan=R;Q.$.rowSpan=S;if(R==1)J.removeAttribute('rowSpan');if(S==1)Q.removeAttribute('rowSpan');return Q;};function E(G,H){var I=n(G);if(I.length>1)return false;else if(H)return true;var J=I[0],K=J.getParent(),L=K.getAscendant('table'),M=e.buildTableMap(L),N=K.$.rowIndex,O=A(M,N,J),P=J.$.colSpan,Q,R,S;if(P>1){R=Math.ceil(P/2);S=Math.floor(P/2);}else{S=R=1;var T=B(M,O);for(var U=0;U<T.length;U++)T[U].colSpan++;}Q=J.clone();Q.insertAfter(J);if(!c)Q.appendBogus();J.$.colSpan=R;Q.$.colSpan=S;if(R==1)J.removeAttribute('colSpan');if(S==1)Q.removeAttribute('colSpan');return Q;};var F={thead:1,tbody:1,tfoot:1,td:1,tr:1,th:1};j.tabletools={requires:['table','dialog','contextmenu'],init:function(G){var H=G.lang.table;G.addCommand('cellProperties',new a.dialogCommand('cellProperties'));a.dialog.add('cellProperties',this.path+'dialogs/tableCell.js');G.addCommand('tableDelete',{exec:function(I){var J=I.getSelection(),K=J&&J.getStartElement(),L=K&&K.getAscendant('table',1);if(!L)return;var M=L.getParent();if(M.getChildCount()==1&&!M.is('body','td','th'))L=M;var N=new d.range(I.document);N.moveToPosition(L,3);L.remove();N.select();}});G.addCommand('rowDelete',{exec:function(I){var J=I.getSelection();z(q(J));}});G.addCommand('rowInsertBefore',{exec:function(I){var J=I.getSelection();p(J,true);}});G.addCommand('rowInsertAfter',{exec:function(I){var J=I.getSelection();p(J);}});G.addCommand('columnDelete',{exec:function(I){var J=I.getSelection(),K=u(J);K&&z(K,true);}});G.addCommand('columnInsertBefore',{exec:function(I){var J=I.getSelection();t(J,true);}});G.addCommand('columnInsertAfter',{exec:function(I){var J=I.getSelection();
-t(J);}});G.addCommand('cellDelete',{exec:function(I){var J=I.getSelection();x(J);}});G.addCommand('cellMerge',{exec:function(I){z(C(I.getSelection()),true);}});G.addCommand('cellMergeRight',{exec:function(I){z(C(I.getSelection(),'right'),true);}});G.addCommand('cellMergeDown',{exec:function(I){z(C(I.getSelection(),'down'),true);}});G.addCommand('cellVerticalSplit',{exec:function(I){z(D(I.getSelection()));}});G.addCommand('cellHorizontalSplit',{exec:function(I){z(E(I.getSelection()));}});G.addCommand('cellInsertBefore',{exec:function(I){var J=I.getSelection();w(J,true);}});G.addCommand('cellInsertAfter',{exec:function(I){var J=I.getSelection();w(J);}});if(G.addMenuItems)G.addMenuItems({tablecell:{label:H.cell.menu,group:'tablecell',order:1,getItems:function(){var I=G.getSelection(),J=n(I);return{tablecell_insertBefore:2,tablecell_insertAfter:2,tablecell_delete:2,tablecell_merge:C(I,null,true)?2:0,tablecell_merge_right:C(I,'right',true)?2:0,tablecell_merge_down:C(I,'down',true)?2:0,tablecell_split_vertical:D(I,true)?2:0,tablecell_split_horizontal:E(I,true)?2:0,tablecell_properties:J.length>0?2:0};}},tablecell_insertBefore:{label:H.cell.insertBefore,group:'tablecell',command:'cellInsertBefore',order:5},tablecell_insertAfter:{label:H.cell.insertAfter,group:'tablecell',command:'cellInsertAfter',order:10},tablecell_delete:{label:H.cell.deleteCell,group:'tablecell',command:'cellDelete',order:15},tablecell_merge:{label:H.cell.merge,group:'tablecell',command:'cellMerge',order:16},tablecell_merge_right:{label:H.cell.mergeRight,group:'tablecell',command:'cellMergeRight',order:17},tablecell_merge_down:{label:H.cell.mergeDown,group:'tablecell',command:'cellMergeDown',order:18},tablecell_split_horizontal:{label:H.cell.splitHorizontal,group:'tablecell',command:'cellHorizontalSplit',order:19},tablecell_split_vertical:{label:H.cell.splitVertical,group:'tablecell',command:'cellVerticalSplit',order:20},tablecell_properties:{label:H.cell.title,group:'tablecellproperties',command:'cellProperties',order:21},tablerow:{label:H.row.menu,group:'tablerow',order:1,getItems:function(){return{tablerow_insertBefore:2,tablerow_insertAfter:2,tablerow_delete:2};}},tablerow_insertBefore:{label:H.row.insertBefore,group:'tablerow',command:'rowInsertBefore',order:5},tablerow_insertAfter:{label:H.row.insertAfter,group:'tablerow',command:'rowInsertAfter',order:10},tablerow_delete:{label:H.row.deleteRow,group:'tablerow',command:'rowDelete',order:15},tablecolumn:{label:H.column.menu,group:'tablecolumn',order:1,getItems:function(){return{tablecolumn_insertBefore:2,tablecolumn_insertAfter:2,tablecolumn_delete:2};
-}},tablecolumn_insertBefore:{label:H.column.insertBefore,group:'tablecolumn',command:'columnInsertBefore',order:5},tablecolumn_insertAfter:{label:H.column.insertAfter,group:'tablecolumn',command:'columnInsertAfter',order:10},tablecolumn_delete:{label:H.column.deleteColumn,group:'tablecolumn',command:'columnDelete',order:15}});if(G.contextMenu)G.contextMenu.addListener(function(I,J){if(!I||I.isReadOnly())return null;while(I){if(I.getName() in F)return{tablecell:2,tablerow:2,tablecolumn:2};I=I.getParent();}return null;});},getSelectedCells:n};j.add('tabletools',j.tabletools);})();e.buildTableMap=function(m){var n=m.$.rows,o=-1,p=[];for(var q=0;q<n.length;q++){o++;!p[o]&&(p[o]=[]);var r=-1;for(var s=0;s<n[q].cells.length;s++){var t=n[q].cells[s];r++;while(p[o][r])r++;var u=isNaN(t.colSpan)?1:t.colSpan,v=isNaN(t.rowSpan)?1:t.rowSpan;for(var w=0;w<v;w++){if(!p[o+w])p[o+w]=[];for(var x=0;x<u;x++)p[o+w][r+x]=n[q].cells[s];}r+=u-1;}}return p;};j.add('specialchar',{requires:['dialog'],availableLangs:{cs:1,cy:1,de:1,el:1,en:1,eo:1,et:1,fa:1,fi:1,fr:1,he:1,hr:1,it:1,nb:1,nl:1,no:1,'pt-br':1,tr:1,ug:1,'zh-cn':1},init:function(m){var n='specialchar',o=this;a.dialog.add(n,this.path+'dialogs/specialchar.js');m.addCommand(n,{exec:function(){var p=m.langCode;p=o.availableLangs[p]?p:'en';a.scriptLoader.load(a.getUrl(o.path+'lang/'+p+'.js'),function(){e.extend(m.lang.specialChar,o.langEntries[p]);m.openDialog(n);});},modes:{wysiwyg:1},canUndo:false});m.ui.addButton('SpecialChar',{label:m.lang.specialChar.toolbar,command:n});}});i.specialChars=['!','"','#','$','%','&',"'",'(',')','*','+','-','.','/','0','1','2','3','4','5','6','7','8','9',':',';','<','=','>','?','@','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','[',']','^','_','`','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','{','|','}','~','€','‘','’','“','”','–','—','¡','¢','£','¤','¥','¦','§','¨','©','ª','«','¬','®','¯','°','²','³','´','µ','¶','·','¸','¹','º','»','¼','½','¾','¿','À','Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë','Ì','Í','Î','Ï','Ð','Ñ','Ò','Ó','Ô','Õ','Ö','×','Ø','Ù','Ú','Û','Ü','Ý','Þ','ß','à','á','â','ã','ä','å','æ','ç','è','é','ê','ë','ì','í','î','ï','ð','ñ','ò','ó','ô','õ','ö','÷','ø','ù','ú','û','ü','ý','þ','ÿ','Œ','œ','Ŵ','Ŷ','ŵ','ŷ','‚','‛','„','…','™','►','•','→','⇒','⇔','♦','≈'];
-(function(){var m={editorFocus:false,modes:{wysiwyg:1,source:1}},n={exec:function(q){q.container.focusNext(true,q.tabIndex);}},o={exec:function(q){q.container.focusPrevious(true,q.tabIndex);}};function p(q){return{editorFocus:false,canUndo:false,modes:{wysiwyg:1},exec:function(r){if(r.focusManager.hasFocus){var s=r.getSelection(),t=s.getCommonAncestor(),u;if(u=t.getAscendant('td',true)||t.getAscendant('th',true)){var v=new d.range(r.document),w=e.tryThese(function(){var D=u.getParent(),E=D.$.cells[u.$.cellIndex+(q?-1:1)];E.parentNode.parentNode;return E;},function(){var D=u.getParent(),E=D.getAscendant('table'),F=E.$.rows[D.$.rowIndex+(q?-1:1)];return F.cells[q?F.cells.length-1:0];});if(!(w||q)){var x=u.getAscendant('table').$,y=u.getParent().$.cells,z=new h(x.insertRow(-1),r.document);for(var A=0,B=y.length;A<B;A++){var C=z.append(new h(y[A],r.document).clone(false,false));!c&&C.appendBogus();}v.moveToElementEditStart(z);}else if(w){w=new h(w);v.moveToElementEditStart(w);if(!(v.checkStartOfBlock()&&v.checkEndOfBlock()))v.selectNodeContents(w);}else return true;v.select(true);return true;}}return false;}};};j.add('tab',{requires:['keystrokes'],init:function(q){var r=q.config.enableTabKeyTools!==false,s=q.config.tabSpaces||0,t='';while(s--)t+='\xa0';if(t)q.on('key',function(u){if(u.data.keyCode==9){q.insertHtml(t);u.cancel();}});if(r)q.on('key',function(u){if(u.data.keyCode==9&&q.execCommand('selectNextCell')||u.data.keyCode==2228224+9&&q.execCommand('selectPreviousCell'))u.cancel();});if(b.webkit||b.gecko)q.on('key',function(u){var v=u.data.keyCode;if(v==9&&!t){u.cancel();q.execCommand('blur');}if(v==2228224+9){q.execCommand('blurBack');u.cancel();}});q.addCommand('blur',e.extend(n,m));q.addCommand('blurBack',e.extend(o,m));q.addCommand('selectNextCell',p());q.addCommand('selectPreviousCell',p(true));}});})();h.prototype.focusNext=function(m,n){var w=this;var o=w.$,p=n===undefined?w.getTabIndex():n,q,r,s,t,u,v;if(p<=0){u=w.getNextSourceNode(m,1);while(u){if(u.isVisible()&&u.getTabIndex()===0){s=u;break;}u=u.getNextSourceNode(false,1);}}else{u=w.getDocument().getBody().getFirst();while(u=u.getNextSourceNode(false,1)){if(!q)if(!r&&u.equals(w)){r=true;if(m){if(!(u=u.getNextSourceNode(true,1)))break;q=1;}}else if(r&&!w.contains(u))q=1;if(!u.isVisible()||(v=u.getTabIndex())<0)continue;if(q&&v==p){s=u;break;}if(v>p&&(!s||!t||v<t)){s=u;t=v;}else if(!s&&v===0){s=u;t=v;}}}if(s)s.focus();};h.prototype.focusPrevious=function(m,n){var w=this;var o=w.$,p=n===undefined?w.getTabIndex():n,q,r,s,t=0,u,v=w.getDocument().getBody().getLast();
-while(v=v.getPreviousSourceNode(false,1)){if(!q)if(!r&&v.equals(w)){r=true;if(m){if(!(v=v.getPreviousSourceNode(true,1)))break;q=1;}}else if(r&&!w.contains(v))q=1;if(!v.isVisible()||(u=v.getTabIndex())<0)continue;if(p<=0){if(q&&u===0){s=v;break;}if(u>t){s=v;t=u;}}else{if(q&&u==p){s=v;break;}if(u<p&&(!s||u>t)){s=v;t=u;}}}if(s)s.focus();};(function(){j.add('templates',{requires:['dialog'],init:function(o){a.dialog.add('templates',a.getUrl(this.path+'dialogs/templates.js'));o.addCommand('templates',new a.dialogCommand('templates'));o.ui.addButton('Templates',{label:o.lang.templates.button,command:'templates'});}});var m={},n={};a.addTemplates=function(o,p){m[o]=p;};a.getTemplates=function(o){return m[o];};a.loadTemplates=function(o,p){var q=[];for(var r=0,s=o.length;r<s;r++){if(!n[o[r]]){q.push(o[r]);n[o[r]]=1;}}if(q.length)a.scriptLoader.load(q,p);else setTimeout(p,0);};})();i.templates_files=[a.getUrl('plugins/templates/templates/default.js')];i.templates_replaceContent=true;(function(){var m=function(){this.toolbars=[];this.focusCommandExecuted=false;};m.prototype.focus=function(){for(var o=0,p;p=this.toolbars[o++];)for(var q=0,r;r=p.items[q++];){if(r.focus){r.focus();return;}}};var n={toolbarFocus:{modes:{wysiwyg:1,source:1},readOnly:1,exec:function(o){if(o.toolbox){o.toolbox.focusCommandExecuted=true;if(c||b.air)setTimeout(function(){o.toolbox.focus();},100);else o.toolbox.focus();}}}};j.add('toolbar',{requires:['button'],init:function(o){var p,q=function(r,s){var t,u,v=o.lang.dir=='rtl',w=o.config.toolbarGroupCycling;w=w===undefined||w;switch(s){case 9:case 2228224+9:while(!u||!u.items.length){u=s==9?(u?u.next:r.toolbar.next)||o.toolbox.toolbars[0]:(u?u.previous:r.toolbar.previous)||o.toolbox.toolbars[o.toolbox.toolbars.length-1];if(u.items.length){r=u.items[p?u.items.length-1:0];while(r&&!r.focus){r=p?r.previous:r.next;if(!r)u=0;}}}if(r)r.focus();return false;case v?37:39:case 40:t=r;do{t=t.next;if(!t&&w)t=r.toolbar.items[0];}while(t&&!t.focus);if(t)t.focus();else q(r,9);return false;case v?39:37:case 38:t=r;do{t=t.previous;if(!t&&w)t=r.toolbar.items[r.toolbar.items.length-1];}while(t&&!t.focus);if(t)t.focus();else{p=1;q(r,2228224+9);p=0;}return false;case 27:o.focus();return false;case 13:case 32:r.execute();return false;}return true;};o.on('themeSpace',function(r){if(r.data.space==o.config.toolbarLocation){o.toolbox=new m();var s=e.getNextId(),t=['<div class="cke_toolbox" role="group" aria-labelledby="',s,'" onmousedown="return false;"'],u=o.config.toolbarStartupExpanded!==false,v;
-t.push(u?'>':' style="display:none">');t.push('<span id="',s,'" class="cke_voice_label">',o.lang.toolbars,'</span>');var w=o.toolbox.toolbars,x=o.config.toolbar instanceof Array?o.config.toolbar:o.config['toolbar_'+o.config.toolbar];for(var y=0;y<x.length;y++){var z,A=0,B,C=x[y],D;if(!C)continue;if(v){t.push('</div>');v=0;}if(C==='/'){t.push('<div class="cke_break"></div>');continue;}D=C.items||C;for(var E=0;E<D.length;E++){var F,G=D[E],H;F=o.ui.create(G);if(F){H=F.canGroup!==false;if(!A){z=e.getNextId();A={id:z,items:[]};B=C.name&&(o.lang.toolbarGroups[C.name]||C.name);t.push('<span id="',z,'" class="cke_toolbar"',B?' aria-labelledby="'+z+'_label"':'',' role="toolbar">');B&&t.push('<span id="',z,'_label" class="cke_voice_label">',B,'</span>');t.push('<span class="cke_toolbar_start"></span>');var I=w.push(A)-1;if(I>0){A.previous=w[I-1];A.previous.next=A;}}if(H){if(!v){t.push('<span class="cke_toolgroup" role="presentation">');v=1;}}else if(v){t.push('</span>');v=0;}var J=F.render(o,t);I=A.items.push(J)-1;if(I>0){J.previous=A.items[I-1];J.previous.next=J;}J.toolbar=A;J.onkey=q;J.onfocus=function(){if(!o.toolbox.focusCommandExecuted)o.focus();};}}if(v){t.push('</span>');v=0;}if(A)t.push('<span class="cke_toolbar_end"></span></span>');}t.push('</div>');if(o.config.toolbarCanCollapse){var K=e.addFunction(function(){o.execCommand('toolbarCollapse');});o.on('destroy',function(){e.removeFunction(K);});var L=e.getNextId();o.addCommand('toolbarCollapse',{readOnly:1,exec:function(M){var N=a.document.getById(L),O=N.getPrevious(),P=M.getThemeSpace('contents'),Q=O.getParent(),R=parseInt(P.$.style.height,10),S=Q.$.offsetHeight,T=!O.isVisible();if(!T){O.hide();N.addClass('cke_toolbox_collapser_min');N.setAttribute('title',M.lang.toolbarExpand);}else{O.show();N.removeClass('cke_toolbox_collapser_min');N.setAttribute('title',M.lang.toolbarCollapse);}N.getFirst().setText(T?'▲':'◀');var U=Q.$.offsetHeight-S;P.setStyle('height',R-U+'px');M.fire('resize');},modes:{wysiwyg:1,source:1}});t.push('<a title="'+(u?o.lang.toolbarCollapse:o.lang.toolbarExpand)+'" id="'+L+'" tabIndex="-1" class="cke_toolbox_collapser');if(!u)t.push(' cke_toolbox_collapser_min');t.push('" onclick="CKEDITOR.tools.callFunction('+K+')">','<span>▲</span>','</a>');}r.data.html+=t.join('');}});o.on('destroy',function(){var r,s=0,t,u,v;r=this.toolbox.toolbars;for(;s<r.length;s++){u=r[s].items;for(t=0;t<u.length;t++){v=u[t];if(v.clickFn)e.removeFunction(v.clickFn);if(v.keyDownFn)e.removeFunction(v.keyDownFn);
-}}});o.addCommand('toolbarFocus',n.toolbarFocus);o.ui.add('-',a.UI_SEPARATOR,{});o.ui.addHandler(a.UI_SEPARATOR,{create:function(){return{render:function(r,s){s.push('<span class="cke_separator" role="separator"></span>');return{};}};}});}});})();a.UI_SEPARATOR='separator';i.toolbarLocation='top';i.toolbar_Basic=[['Bold','Italic','-','NumberedList','BulletedList','-','Link','Unlink','-','About']];i.toolbar_Full=[{name:'document',items:['Source','-','Save','NewPage','DocProps','Preview','Print','-','Templates']},{name:'clipboard',items:['Cut','Copy','Paste','PasteText','PasteFromWord','-','Undo','Redo']},{name:'editing',items:['Find','Replace','-','SelectAll','-','SpellChecker','Scayt']},{name:'forms',items:['Form','Checkbox','Radio','TextField','Textarea','Select','Button','ImageButton','HiddenField']},'/',{name:'basicstyles',items:['Bold','Italic','Underline','Strike','Subscript','Superscript','-','RemoveFormat']},{name:'paragraph',items:['NumberedList','BulletedList','-','Outdent','Indent','-','Blockquote','CreateDiv','-','JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock','-','BidiLtr','BidiRtl']},{name:'links',items:['Link','Unlink','Anchor']},{name:'insert',items:['Image','Flash','Table','HorizontalRule','Smiley','SpecialChar','PageBreak','Iframe']},'/',{name:'styles',items:['Styles','Format','Font','FontSize']},{name:'colors',items:['TextColor','BGColor']},{name:'tools',items:['Maximize','ShowBlocks','-','About']}];i.toolbar='Full';i.toolbarCanCollapse=true;(function(){j.add('undo',{requires:['selection','wysiwygarea'],init:function(s){var t=new o(s),u=s.addCommand('undo',{exec:function(){if(t.undo()){s.selectionChange();this.fire('afterUndo');}},state:0,canUndo:false}),v=s.addCommand('redo',{exec:function(){if(t.redo()){s.selectionChange();this.fire('afterRedo');}},state:0,canUndo:false});t.onChange=function(){u.setState(t.undoable()?2:0);v.setState(t.redoable()?2:0);};function w(x){if(t.enabled&&x.data.command.canUndo!==false)t.save();};s.on('beforeCommandExec',w);s.on('afterCommandExec',w);s.on('saveSnapshot',function(x){t.save(x.data&&x.data.contentOnly);});s.on('contentDom',function(){s.document.on('keydown',function(x){if(!x.data.$.ctrlKey&&!x.data.$.metaKey)t.type(x);});});s.on('beforeModeUnload',function(){s.mode=='wysiwyg'&&t.save(true);});s.on('mode',function(){t.enabled=s.readOnly?false:s.mode=='wysiwyg';t.onChange();});s.ui.addButton('Undo',{label:s.lang.undo,command:'undo'});s.ui.addButton('Redo',{label:s.lang.redo,command:'redo'});
-s.resetUndo=function(){t.reset();s.fire('saveSnapshot');};s.on('updateSnapshot',function(){if(t.currentImage)t.update();});}});j.undo={};var m=j.undo.Image=function(s){this.editor=s;s.fire('beforeUndoImage');var t=s.getSnapshot(),u=t&&s.getSelection();c&&t&&(t=t.replace(/\s+data-cke-expando=".*?"/g,''));this.contents=t;this.bookmarks=u&&u.createBookmarks2(true);s.fire('afterUndoImage');},n=/\b(?:href|src|name)="[^"]*?"/gi;m.prototype={equals:function(s,t){var u=this.contents,v=s.contents;if(c&&(b.ie7Compat||b.ie6Compat)){u=u.replace(n,'');v=v.replace(n,'');}if(u!=v)return false;if(t)return true;var w=this.bookmarks,x=s.bookmarks;if(w||x){if(!w||!x||w.length!=x.length)return false;for(var y=0;y<w.length;y++){var z=w[y],A=x[y];if(z.startOffset!=A.startOffset||z.endOffset!=A.endOffset||!e.arrayCompare(z.start,A.start)||!e.arrayCompare(z.end,A.end))return false;}}return true;}};function o(s){this.editor=s;this.reset();};var p={8:1,46:1},q={16:1,17:1,18:1},r={37:1,38:1,39:1,40:1};o.prototype={type:function(s){var t=s&&s.data.getKey(),u=t in q,v=t in p,w=this.lastKeystroke in p,x=v&&t==this.lastKeystroke,y=t in r,z=this.lastKeystroke in r,A=!v&&!y,B=v&&!x,C=!(u||this.typing)||A&&(w||z);if(C||B){var D=new m(this.editor),E=this.snapshots.length;e.setTimeout(function(){var G=this;var F=G.editor.getSnapshot();if(c)F=F.replace(/\s+data-cke-expando=".*?"/g,'');if(D.contents!=F&&E==G.snapshots.length){G.typing=true;if(!G.save(false,D,false))G.snapshots.splice(G.index+1,G.snapshots.length-G.index-1);G.hasUndo=true;G.hasRedo=false;G.typesCount=1;G.modifiersCount=1;G.onChange();}},0,this);}this.lastKeystroke=t;if(v){this.typesCount=0;this.modifiersCount++;if(this.modifiersCount>25){this.save(false,null,false);this.modifiersCount=1;}}else if(!y){this.modifiersCount=0;this.typesCount++;if(this.typesCount>25){this.save(false,null,false);this.typesCount=1;}}},reset:function(){var s=this;s.lastKeystroke=0;s.snapshots=[];s.index=-1;s.limit=s.editor.config.undoStackSize||20;s.currentImage=null;s.hasUndo=false;s.hasRedo=false;s.resetType();},resetType:function(){var s=this;s.typing=false;delete s.lastKeystroke;s.typesCount=0;s.modifiersCount=0;},fireChange:function(){var s=this;s.hasUndo=!!s.getNextImage(true);s.hasRedo=!!s.getNextImage(false);s.resetType();s.onChange();},save:function(s,t,u){var w=this;var v=w.snapshots;if(!t)t=new m(w.editor);if(t.contents===false)return false;if(w.currentImage&&t.equals(w.currentImage,s))return false;v.splice(w.index+1,v.length-w.index-1);if(v.length==w.limit)v.shift();
-w.index=v.push(t)-1;w.currentImage=t;if(u!==false)w.fireChange();return true;},restoreImage:function(s){var w=this;var t=w.editor,u;if(s.bookmarks){t.focus();u=t.getSelection();}w.editor.loadSnapshot(s.contents);if(s.bookmarks)u.selectBookmarks(s.bookmarks);else if(c){var v=w.editor.document.getBody().$.createTextRange();v.collapse(true);v.select();}w.index=s.index;w.update();w.fireChange();},getNextImage:function(s){var x=this;var t=x.snapshots,u=x.currentImage,v,w;if(u)if(s)for(w=x.index-1;w>=0;w--){v=t[w];if(!u.equals(v,true)){v.index=w;return v;}}else for(w=x.index+1;w<t.length;w++){v=t[w];if(!u.equals(v,true)){v.index=w;return v;}}return null;},redoable:function(){return this.enabled&&this.hasRedo;},undoable:function(){return this.enabled&&this.hasUndo;},undo:function(){var t=this;if(t.undoable()){t.save(true);var s=t.getNextImage(true);if(s)return t.restoreImage(s),true;}return false;},redo:function(){var t=this;if(t.redoable()){t.save(true);if(t.redoable()){var s=t.getNextImage(false);if(s)return t.restoreImage(s),true;}}return false;},update:function(){var s=this;s.snapshots.splice(s.index,1,s.currentImage=new m(s.editor));}};})();(function(){var m=/(^|<body\b[^>]*>)\s*<(p|div|address|h\d|center|pre)[^>]*>\s*(?:<br[^>]*>| |\u00A0| )?\s*(:?<\/\2>)?\s*(?=$|<\/body>)/gi,n=d.walker.whitespaces(true),o=d.walker.bogus(true),p=function(E){return n(E)&&o(E);};function q(E){return E.isBlockBoundary()&&f.$empty[E.getName()];};function r(E){return function(F){if(this.mode=='wysiwyg'){this.focus();var G=this.getSelection(),H=G.isLocked;H&&G.unlock();this.fire('saveSnapshot');E.call(this,F.data);H&&this.getSelection().lock();e.setTimeout(function(){this.fire('saveSnapshot');},0,this);}};};function s(E){var N=this;if(N.dataProcessor)E=N.dataProcessor.toHtml(E);if(!E)return;var F=N.getSelection(),G=F.getRanges()[0];if(G.checkReadOnly())return;if(b.opera){var H=new d.elementPath(G.startContainer);if(H.block){var I=a.htmlParser.fragment.fromHtml(E,false).children;for(var J=0,K=I.length;J<K;J++){if(I[J]._.isBlockLike){G.splitBlock(N.enterMode==3?'div':'p');G.insertNode(G.document.createText(''));G.select();break;}}}}if(c){var L=F.getNative();if(L.type=='Control')L.clear();else if(F.getType()==2){G=F.getRanges()[0];var M=G&&G.endContainer;if(M&&M.type==1&&M.getAttribute('contenteditable')=='false'&&G.checkBoundaryOfElement(M,2)){G.setEndAfter(G.endContainer);G.deleteContents();}}L.createRange().pasteHTML(E);}else N.document.$.execCommand('inserthtml',false,E);
-if(b.webkit){F=N.getSelection();F.scrollIntoView();}};function t(E){var F=this.getSelection(),G=F.getStartElement().hasAscendant('pre',true)?2:this.config.enterMode,H=G==2,I=e.htmlEncode(E.replace(/\r\n|\r/g,'\n'));I=I.replace(/^[ \t]+|[ \t]+$/g,function(O,P,Q){if(O.length==1)return ' ';else if(!P)return e.repeat(' ',O.length-1)+' ';else return ' '+e.repeat(' ',O.length-1);});I=I.replace(/[ \t]{2,}/g,function(O){return e.repeat(' ',O.length-1)+' ';});var J=G==1?'p':'div';if(!H)I=I.replace(/(\n{2})([\s\S]*?)(?:$|\1)/g,function(O,P,Q){return '<'+J+'>'+Q+'</'+J+'>';});I=I.replace(/\n/g,'<br>');if(!(H||c))I=I.replace(new RegExp('<br>(?=</'+J+'>)'),function(O){return e.repeat(O,2);});if(b.gecko||b.webkit){var K=new d.elementPath(F.getStartElement()),L=[];for(var M=0;M<K.elements.length;M++){var N=K.elements[M].getName();if(N in f.$inline)L.unshift(K.elements[M].getOuterHtml().match(/^<.*?>/));else if(N in f.$block)break;}I=L.join('')+I;}s.call(this,I);};function u(E){var F=this.getSelection(),G=F.getRanges(),H=E.getName(),I=f.$block[H],J=F.isLocked;if(J)F.unlock();var K,L,M,N;for(var O=G.length-1;O>=0;O--){K=G[O];if(!K.checkReadOnly()){K.deleteContents(1);L=!O&&E||E.clone(1);var P,Q;if(I)while((P=K.getCommonAncestor(0,1))&&(Q=f[P.getName()])&&!(Q&&Q[H])){if(P.getName() in f.span)K.splitElement(P);else if(K.checkStartOfBlock()&&K.checkEndOfBlock()){K.setStartBefore(P);K.collapse(true);P.remove();}else K.splitBlock();}K.insertNode(L);if(!M)M=L;}}if(M){K.moveToPosition(M,4);if(I){var R=M.getNext(p),S=R&&R.type==1&&R.getName();if(S&&f.$block[S]){if(f[S]['#'])K.moveToElementEditStart(R);else K.moveToElementEditEnd(M);}else if(!R){R=K.fixBlock(true,this.config.enterMode==3?'div':'p');K.moveToElementEditStart(R);}}}F.selectRanges([K]);if(J)this.getSelection().lock();};function v(E){if(!E.checkDirty())setTimeout(function(){E.resetDirty();},0);};var w=d.walker.whitespaces(true),x=d.walker.bookmark(false,true);function y(E){return w(E)&&x(E);};function z(E){return E.type==3&&e.trim(E.getText()).match(/^(?: |\xa0)$/);};function A(E){if(E.isLocked){E.unlock();setTimeout(function(){E.lock();},0);}};function B(E){return E.getOuterHtml().match(m);};w=d.walker.whitespaces(true);function C(E){var F=E.window,G=E.document,H=E.document.getBody(),I=H.getFirst(),J=H.getChildren().count();if(!J||J==1&&I.type==1&&I.hasAttribute('_moz_editor_bogus_node')){v(E);var K=E.element.getDocument(),L=K.getDocumentElement(),M=L.$.scrollTop,N=L.$.scrollLeft,O=G.$.createEvent('KeyEvents');
-O.initKeyEvent('keypress',true,true,F.$,false,false,false,false,0,32);G.$.dispatchEvent(O);if(M!=L.$.scrollTop||N!=L.$.scrollLeft)K.getWindow().$.scrollTo(N,M);J&&H.getFirst().remove();G.getBody().appendBogus();var P=new d.range(G);P.setStartAt(H,1);P.select();}};function D(E){var F=E.editor,G=E.data.path,H=G.blockLimit,I=E.data.selection,J=I.getRanges()[0],K=F.document.getBody(),L=F.config.enterMode;if(b.gecko){C(F);var M=G.block||G.blockLimit,N=M&&M.getLast(y);if(M&&M.isBlockBoundary()&&!(N&&N.type==1&&N.isBlockBoundary())&&!M.is('pre')&&!M.getBogus())M.appendBogus();}if(F.config.autoParagraph!==false&&L!=2&&J.collapsed&&H.getName()=='body'&&!G.block){var O=J.fixBlock(true,F.config.enterMode==3?'div':'p');if(c){var P=O.getFirst(y);P&&z(P)&&P.remove();}if(B(O)){var Q=O.getNext(w);if(Q&&Q.type==1&&!q(Q)){J.moveToElementEditStart(Q);O.remove();}else{Q=O.getPrevious(w);if(Q&&Q.type==1&&!q(Q)){J.moveToElementEditEnd(Q);O.remove();}}}J.select();E.cancel();}var R=new d.range(F.document);R.moveToElementEditEnd(F.document.getBody());var S=new d.elementPath(R.startContainer);if(!S.blockLimit.is('body')){var T;if(L!=2)T=K.append(F.document.createElement(L==1?'p':'div'));else T=K;if(!c)T.appendBogus();}};j.add('wysiwygarea',{requires:['editingblock'],init:function(E){var F=E.config.enterMode!=2&&E.config.autoParagraph!==false?E.config.enterMode==3?'div':'p':false,G=E.lang.editorTitle.replace('%1',E.name),H=E.lang.editorHelp;if(c)G+=', '+H;var I=a.document.getWindow(),J;E.on('editingBlockReady',function(){var M,N,O,P,Q,R,S,T=b.isCustomDomain(),U=function(X){if(N)N.remove();var Y='document.open();'+(T?'document.domain="'+document.domain+'";':'')+'document.close();';Y=b.air?'javascript:void(0)':c?'javascript:void(function(){'+encodeURIComponent(Y)+'}())':'';var Z=e.getNextId();N=h.createFromHtml('<iframe style="width:100%;height:100%" frameBorder="0" aria-describedby="'+Z+'"'+' title="'+G+'"'+' src="'+Y+'"'+' tabIndex="'+(b.webkit?-1:E.tabIndex)+'"'+' allowTransparency="true"'+'></iframe>');if(document.location.protocol=='chrome:')a.event.useCapture=true;N.on('load',function(aa){Q=1;aa.removeListener();var ab=N.getFrameDocument();ab.write(X);b.air&&W(ab.getWindow().$);});if(document.location.protocol=='chrome:')a.event.useCapture=false;M.append(h.createFromHtml('<span id="'+Z+'" class="cke_voice_label">'+H+'</span>'));M.append(N);if(b.webkit){S=function(){M.setStyle('width','100%');N.hide();N.setSize('width',M.getSize('width'));M.removeStyle('width');N.show();};I.on('resize',S);
-}};J=e.addFunction(W);var V='<script id="cke_actscrpt" type="text/javascript" data-cke-temp="1">'+(T?'document.domain="'+document.domain+'";':'')+'window.parent.CKEDITOR.tools.callFunction( '+J+', window );'+'</script>';function W(X){if(!Q)return;Q=0;E.fire('ariaWidget',N);var Y=X.document,Z=Y.body,aa=Y.getElementById('cke_actscrpt');aa&&aa.parentNode.removeChild(aa);Z.spellcheck=!E.config.disableNativeSpellChecker;var ab=!E.readOnly;if(c){Z.hideFocus=true;Z.disabled=true;Z.contentEditable=ab;Z.removeAttribute('disabled');}else setTimeout(function(){if(b.gecko&&b.version>=10900||b.opera)Y.$.body.contentEditable=ab;else if(b.webkit)Y.$.body.parentNode.contentEditable=ab;else Y.$.designMode=ab?'off':'on';},0);ab&&b.gecko&&e.setTimeout(C,0,null,E);X=E.window=new d.window(X);Y=E.document=new g(Y);ab&&Y.on('dblclick',function(ag){var ah=ag.data.getTarget(),ai={element:ah,dialog:''};E.fire('doubleclick',ai);ai.dialog&&E.openDialog(ai.dialog);});c&&Y.on('click',function(ag){var ah=ag.data.getTarget();if(ah.is('input')){var ai=ah.getAttribute('type');if(ai=='submit'||ai=='reset')ag.data.preventDefault();}});if(!(c||b.opera))Y.on('mousedown',function(ag){var ah=ag.data.getTarget();if(ah.is('img','hr','input','textarea','select'))E.getSelection().selectElement(ah);});if(b.gecko)Y.on('mouseup',function(ag){if(ag.data.$.button==2){var ah=ag.data.getTarget();if(!ah.getOuterHtml().replace(m,'')){var ai=new d.range(Y);ai.moveToElementEditStart(ah);ai.select(true);}}});Y.on('click',function(ag){ag=ag.data;if(ag.getTarget().is('a')&&ag.$.button!=2)ag.preventDefault();});if(b.webkit){Y.on('mousedown',function(){ad=1;});Y.on('click',function(ag){if(ag.data.getTarget().is('input','select'))ag.data.preventDefault();});Y.on('mouseup',function(ag){if(ag.data.getTarget().is('input','textarea'))ag.data.preventDefault();});}var ac=c?N:X;ac.on('blur',function(){E.focusManager.blur();});var ad;ac.on('focus',function(){var ag=E.document;if(b.gecko||b.opera)ag.getBody().focus();else if(b.webkit)if(!ad){E.document.getDocumentElement().focus();ad=1;}E.focusManager.focus();});var ae=E.keystrokeHandler;ae.blockedKeystrokes[8]=!ab;ae.attach(Y);Y.getDocumentElement().addClass(Y.$.compatMode);ab&&Y.on('keydown',function(ag){var ah=ag.data.getKeystroke();if(ah in {8:1,46:1}){var ai=E.getSelection(),aj=ai.getSelectedElement(),ak=ai.getRanges()[0],al=new d.elementPath(ak.startContainer),am,an,ao,ap=ah==8;if(aj){E.fire('saveSnapshot');ak.moveToPosition(aj,3);aj.remove();ak.select();E.fire('saveSnapshot');
-ag.data.preventDefault();}else if((am=al.block)&&ak[ap?'checkStartOfBlock':'checkEndOfBlock']()&&(ao=am[ap?'getPrevious':'getNext'](n))&&ao.is('table')){E.fire('saveSnapshot');if(ak[ap?'checkEndOfBlock':'checkStartOfBlock']())am.remove();ak['moveToElementEdit'+(ap?'End':'Start')](ao);ak.select();E.fire('saveSnapshot');ag.data.preventDefault();}else if(al.blockLimit.is('td')&&(an=al.blockLimit.getAscendant('table'))&&ak.checkBoundaryOfElement(an,ap?1:2)&&(ao=an[ap?'getPrevious':'getNext'](n))){E.fire('saveSnapshot');ak['moveToElementEdit'+(ap?'End':'Start')](ao);if(ak.checkStartOfBlock()&&ak.checkEndOfBlock())ao.remove();else ak.select();E.fire('saveSnapshot');ag.data.preventDefault();}}if(ah==33||ah==34)if(b.gecko){var aq=Y.getBody();if(X.$.innerHeight>aq.$.offsetHeight){ak=new d.range(Y);ak[ah==33?'moveToElementEditStart':'moveToElementEditEnd'](aq);ak.select();ag.data.preventDefault();}}});if(c&&Y.$.compatMode=='CSS1Compat'){var af={33:1,34:1};Y.on('keydown',function(ag){if(ag.data.getKeystroke() in af)setTimeout(function(){E.getSelection().scrollIntoView();},0);});}if(c&&E.config.enterMode!=1)Y.on('selectionchange',function(){var ag=Y.getBody(),ah=E.getSelection(),ai=ah&&ah.getRanges()[0];if(ai&&ag.getHtml().match(/^<p> <\/p>$/i)&&ai.startContainer.equals(ag))setTimeout(function(){ai=E.getSelection().getRanges()[0];if(!ai.startContainer.equals('body')){ag.getFirst().remove(1);ai.moveToElementEditEnd(ag);ai.select(1);}},0);});if(E.contextMenu)E.contextMenu.addTarget(Y,E.config.browserContextMenuOnCtrl!==false);setTimeout(function(){E.fire('contentDom');if(R){E.mode='wysiwyg';E.fire('mode',{previousMode:E._.previousMode});R=false;}O=false;if(P){E.focus();P=false;}setTimeout(function(){E.fire('dataReady');},0);try{E.document.$.execCommand('2D-position',false,true);}catch(ag){}try{E.document.$.execCommand('enableInlineTableEditing',false,!E.config.disableNativeTableHandles);}catch(ah){}if(E.config.disableObjectResizing)try{E.document.$.execCommand('enableObjectResizing',false,false);}catch(ai){E.document.getBody().on(c?'resizestart':'resize',function(aj){aj.data.preventDefault();});}if(c)setTimeout(function(){if(E.document){var aj=E.document.$.body;aj.runtimeStyle.marginBottom='0px';aj.runtimeStyle.marginBottom='';}},1000);},0);};E.addMode('wysiwyg',{load:function(X,Y,Z){M=X;if(c&&b.quirks)X.setStyle('position','relative');E.mayBeDirty=true;R=true;if(Z)this.loadSnapshotData(Y);else this.loadData(Y);},loadData:function(X){O=true;E._.dataStore={id:1};var Y=E.config,Z=Y.fullPage,aa=Y.docType,ab='<style type="text/css" data-cke-temp="1">'+E._.styles.join('\n')+'</style>';
-!Z&&(ab=e.buildStyleHtml(E.config.contentsCss)+ab);var ac=Y.baseHref?'<base href="'+Y.baseHref+'" data-cke-temp="1" />':'';if(Z)X=X.replace(/<!DOCTYPE[^>]*>/i,function(ad){E.docType=aa=ad;return '';}).replace(/<\?xml\s[^\?]*\?>/i,function(ad){E.xmlDeclaration=ad;return '';});if(E.dataProcessor)X=E.dataProcessor.toHtml(X,F);if(Z){if(!/<body[\s|>]/.test(X))X='<body>'+X;if(!/<html[\s|>]/.test(X))X='<html>'+X+'</html>';if(!/<head[\s|>]/.test(X))X=X.replace(/<html[^>]*>/,'$&<head><title></title></head>');else if(!/<title[\s|>]/.test(X))X=X.replace(/<head[^>]*>/,'$&<title></title>');ac&&(X=X.replace(/<head>/,'$&'+ac));X=X.replace(/<\/head\s*>/,ab+'$&');X=aa+X;}else X=Y.docType+'<html dir="'+Y.contentsLangDirection+'"'+' lang="'+(Y.contentsLanguage||E.langCode)+'">'+'<head>'+'<title>'+G+'</title>'+ac+ab+'</head>'+'<body'+(Y.bodyId?' id="'+Y.bodyId+'"':'')+(Y.bodyClass?' class="'+Y.bodyClass+'"':'')+'>'+X+'</html>';if(b.gecko)X=X.replace(/<br \/>(?=\s*<\/(:?html|body)>)/,'$&<br type="_moz" />');X+=V;this.onDispose();U(X);},getData:function(){var X=E.config,Y=X.fullPage,Z=Y&&E.docType,aa=Y&&E.xmlDeclaration,ab=N.getFrameDocument(),ac=Y?ab.getDocumentElement().getOuterHtml():ab.getBody().getHtml();if(b.gecko)ac=ac.replace(/<br>(?=\s*(:?$|<\/body>))/,'');if(E.dataProcessor)ac=E.dataProcessor.toDataFormat(ac,F);if(X.ignoreEmptyParagraph)ac=ac.replace(m,function(ad,ae){return ae;});if(aa)ac=aa+'\n'+ac;if(Z)ac=Z+'\n'+ac;return ac;},getSnapshotData:function(){return N.getFrameDocument().getBody().getHtml();},loadSnapshotData:function(X){N.getFrameDocument().getBody().setHtml(X);},onDispose:function(){if(!E.document)return;E.document.getDocumentElement().clearCustomData();E.document.getBody().clearCustomData();E.window.clearCustomData();E.document.clearCustomData();N.clearCustomData();N.remove();},unload:function(X){this.onDispose();if(S)I.removeListener('resize',S);E.window=E.document=N=M=P=null;E.fire('contentDomUnload');},focus:function(){var X=E.window;if(O)P=true;else if(X){var Y=E.getSelection(),Z=Y&&Y.getNative();if(Z&&Z.type=='Control')return;b.air?setTimeout(function(){X.focus();},0):X.focus();E.selectionChange();}}});E.on('insertHtml',r(s),null,null,20);E.on('insertElement',r(u),null,null,20);E.on('insertText',r(t),null,null,20);E.on('selectionChange',function(X){if(E.readOnly)return;var Y=E.getSelection();if(Y&&!Y.isLocked){var Z=E.checkDirty();E.fire('saveSnapshot',{contentOnly:1});D.call(this,X);E.fire('updateSnapshot');!Z&&E.resetDirty();}},null,null,1);});E.on('contentDom',function(){var M=E.document.getElementsByTag('title').getItem(0);
-M.data('cke-title',E.document.$.title);c&&(E.document.$.title=G);});E.on('readOnly',function(){if(E.mode=='wysiwyg'){var M=E.getMode();M.loadData(M.getData());}});if(a.document.$.documentMode>=8){E.addCss('html.CSS1Compat [contenteditable=false]{ min-height:0 !important;}');var K=[];for(var L in f.$removeEmpty)K.push('html.CSS1Compat '+L+'[contenteditable=false]');E.addCss(K.join(',')+'{ display:inline-block;}');}else if(b.gecko){E.addCss('html { height: 100% !important; }');E.addCss('img:-moz-broken { -moz-force-broken-image-icon : 1;\tmin-width : 24px; min-height : 24px; }');}else if(c&&b.version<8&&E.config.contentsLangDirection=='ltr')E.addCss('body{margin-right:0;}');E.addCss('html {\t_overflow-y: scroll; cursor: text;\t*cursor:auto;}');E.addCss('img, input, textarea { cursor: default;}');E.on('insertElement',function(M){var N=M.data;if(N.type==1&&(N.is('input')||N.is('textarea'))){var O=N.getAttribute('contenteditable')=='false';if(!O){N.data('cke-editable',N.hasAttribute('contenteditable')?'true':'1');N.setAttribute('contenteditable',false);}}});}});if(b.gecko)(function(){var E=document.body;if(!E)window.addEventListener('load',arguments.callee,false);else{var F=E.getAttribute('onpageshow');E.setAttribute('onpageshow',(F?F+';':'')+'event.persisted && (function(){'+'var allInstances = CKEDITOR.instances, editor, doc;'+'for ( var i in allInstances )'+'{'+'\teditor = allInstances[ i ];'+'\tdoc = editor.document;'+'\tif ( doc )'+'\t{'+'\t\tdoc.$.designMode = "off";'+'\t\tdoc.$.designMode = "on";'+'\t}'+'}'+'})();');}})();})();i.disableObjectResizing=false;i.disableNativeTableHandles=true;i.disableNativeSpellChecker=true;i.ignoreEmptyParagraph=true;j.add('wsc',{requires:['dialog'],init:function(m){var n='checkspell',o=m.addCommand(n,new a.dialogCommand(n));o.modes={wysiwyg:!b.opera&&!b.air&&document.domain==window.location.hostname};m.ui.addButton('SpellChecker',{label:m.lang.spellCheck.toolbar,command:n});a.dialog.add(n,this.path+'dialogs/wsc.js');}});i.wsc_customerId=i.wsc_customerId||'1:ua3xw1-2XyGJ3-GWruD3-6OFNT1-oXcuB1-nR6Bp4-hgQHc-EcYng3-sdRXG3-NOfFk';i.wsc_customLoaderScript=i.wsc_customLoaderScript||null;a.DIALOG_RESIZE_NONE=0;a.DIALOG_RESIZE_WIDTH=1;a.DIALOG_RESIZE_HEIGHT=2;a.DIALOG_RESIZE_BOTH=3;(function(){var m=e.cssLength;function n(Q){return!!this._.tabs[Q][0].$.offsetHeight;};function o(){var U=this;var Q=U._.currentTabId,R=U._.tabIdList.length,S=e.indexOf(U._.tabIdList,Q)+R;for(var T=S-1;T>S-R;T--){if(n.call(U,U._.tabIdList[T%R]))return U._.tabIdList[T%R];
-}return null;};function p(){var U=this;var Q=U._.currentTabId,R=U._.tabIdList.length,S=e.indexOf(U._.tabIdList,Q);for(var T=S+1;T<S+R;T++){if(n.call(U,U._.tabIdList[T%R]))return U._.tabIdList[T%R];}return null;};function q(Q,R){var S=Q.$.getElementsByTagName('input');for(var T=0,U=S.length;T<U;T++){var V=new h(S[T]);if(V.getAttribute('type').toLowerCase()=='text')if(R){V.setAttribute('value',V.getCustomData('fake_value')||'');V.removeCustomData('fake_value');}else{V.setCustomData('fake_value',V.getAttribute('value'));V.setAttribute('value','');}}};function r(Q,R){var T=this;var S=T.getInputElement();if(S)Q?S.removeAttribute('aria-invalid'):S.setAttribute('aria-invalid',true);if(!Q)if(T.select)T.select();else T.focus();R&&alert(R);T.fire('validated',{valid:Q,msg:R});};function s(){var Q=this.getInputElement();Q&&Q.removeAttribute('aria-invalid');};a.dialog=function(Q,R){var S=a.dialog._.dialogDefinitions[R],T=e.clone(u),U=Q.config.dialog_buttonsOrder||'OS',V=Q.lang.dir,W={},X,Y,Z;if(U=='OS'&&b.mac||U=='rtl'&&V=='ltr'||U=='ltr'&&V=='rtl')T.buttons.reverse();S=e.extend(S(Q),T);S=e.clone(S);S=new y(this,S);var aa=a.document,ab=Q.theme.buildDialog(Q);this._={editor:Q,element:ab.element,name:R,contentSize:{width:0,height:0},size:{width:0,height:0},contents:{},buttons:{},accessKeyMap:{},tabs:{},tabIdList:[],currentTabId:null,currentTabIndex:null,pageCount:0,lastTab:null,tabBarMode:false,focusList:[],currentFocusIndex:0,hasFocus:false};this.parts=ab.parts;e.setTimeout(function(){Q.fire('ariaWidget',this.parts.contents);},0,this);var ac={position:b.ie6Compat?'absolute':'fixed',top:0,visibility:'hidden'};ac[V=='rtl'?'right':'left']=0;this.parts.dialog.setStyles(ac);a.event.call(this);this.definition=S=a.fire('dialogDefinition',{name:R,definition:S},Q).definition;if(!('removeDialogTabs' in Q._)&&Q.config.removeDialogTabs){var ad=Q.config.removeDialogTabs.split(';');for(X=0;X<ad.length;X++){var ae=ad[X].split(':');if(ae.length==2){var af=ae[0];if(!W[af])W[af]=[];W[af].push(ae[1]);}}Q._.removeDialogTabs=W;}if(Q._.removeDialogTabs&&(W=Q._.removeDialogTabs[R]))for(X=0;X<W.length;X++)S.removeContents(W[X]);if(S.onLoad)this.on('load',S.onLoad);if(S.onShow)this.on('show',S.onShow);if(S.onHide)this.on('hide',S.onHide);if(S.onOk)this.on('ok',function(aq){Q.fire('saveSnapshot');setTimeout(function(){Q.fire('saveSnapshot');},0);if(S.onOk.call(this,aq)===false)aq.data.hide=false;});if(S.onCancel)this.on('cancel',function(aq){if(S.onCancel.call(this,aq)===false)aq.data.hide=false;
-});var ag=this,ah=function(aq){var ar=ag._.contents,as=false;for(var at in ar)for(var au in ar[at]){as=aq.call(this,ar[at][au]);if(as)return;}};this.on('ok',function(aq){ah(function(ar){if(ar.validate){var as=ar.validate(this),at=typeof as=='string'||as===false;if(at){aq.data.hide=false;aq.stop();}r.call(ar,!at,typeof as=='string'?as:undefined);return at;}});},this,null,0);this.on('cancel',function(aq){ah(function(ar){if(ar.isChanged()){if(!confirm(Q.lang.common.confirmCancel))aq.data.hide=false;return true;}});},this,null,0);this.parts.close.on('click',function(aq){if(this.fire('cancel',{hide:true}).hide!==false)this.hide();aq.data.preventDefault();},this);function ai(){var aq=ag._.focusList;aq.sort(function(at,au){if(at.tabIndex!=au.tabIndex)return au.tabIndex-at.tabIndex;else return at.focusIndex-au.focusIndex;});var ar=aq.length;for(var as=0;as<ar;as++)aq[as].focusIndex=as;};function aj(aq){var ar=ag._.focusList;aq=aq||0;if(ar.length<1)return;var as=ag._.currentFocusIndex;try{ar[as].getInputElement().$.blur();}catch(av){}var at=(as+aq+ar.length)%ar.length,au=at;while(aq&&!ar[au].isFocusable()){au=(au+aq+ar.length)%ar.length;if(au==at)break;}ar[au].focus();if(ar[au].type=='text')ar[au].select();};this.changeFocus=aj;function ak(aq){var ax=this;if(ag!=a.dialog._.currentTop)return;var ar=aq.data.getKeystroke(),as=Q.lang.dir=='rtl',at;Y=Z=0;if(ar==9||ar==2228224+9){var au=ar==2228224+9;if(ag._.tabBarMode){var av=au?o.call(ag):p.call(ag);ag.selectPage(av);ag._.tabs[av][0].focus();}else aj(au?-1:1);Y=1;}else if(ar==4456448+121&&!ag._.tabBarMode&&ag.getPageCount()>1){ag._.tabBarMode=true;ag._.tabs[ag._.currentTabId][0].focus();Y=1;}else if((ar==37||ar==39)&&ag._.tabBarMode){av=ar==(as?39:37)?o.call(ag):p.call(ag);ag.selectPage(av);ag._.tabs[av][0].focus();Y=1;}else if((ar==13||ar==32)&&ag._.tabBarMode){ax.selectPage(ax._.currentTabId);ax._.tabBarMode=false;ax._.currentFocusIndex=-1;aj(1);Y=1;}else if(ar==13){var aw=aq.data.getTarget();if(!aw.is('a','button','select')&&(!aw.is('input')||aw.$.type!='button')){at=ax.getButton('ok');at&&e.setTimeout(at.click,0,at);Y=1;}Z=1;}else if(ar==27){at=ax.getButton('cancel');if(at)e.setTimeout(at.click,0,at);else if(ax.fire('cancel',{hide:true}).hide!==false)ax.hide();Z=1;}else return;al(aq);};function al(aq){if(Y)aq.data.preventDefault(1);else if(Z)aq.data.stopPropagation();};var am=this._.element;this.on('show',function(){am.on('keydown',ak,this);if(b.opera||b.gecko)am.on('keypress',al,this);});this.on('hide',function(){am.removeListener('keydown',ak);
-if(b.opera||b.gecko)am.removeListener('keypress',al);ah(function(aq){s.apply(aq);});});this.on('iframeAdded',function(aq){var ar=new g(aq.data.iframe.$.contentWindow.document);ar.on('keydown',ak,this,null,0);});this.on('show',function(){var au=this;ai();if(Q.config.dialog_startupFocusTab&&ag._.pageCount>1){ag._.tabBarMode=true;ag._.tabs[ag._.currentTabId][0].focus();}else if(!au._.hasFocus){au._.currentFocusIndex=-1;if(S.onFocus){var aq=S.onFocus.call(au);aq&&aq.focus();}else aj(1);if(au._.editor.mode=='wysiwyg'&&c){var ar=Q.document.$.selection,as=ar.createRange();if(as)if(as.parentElement&&as.parentElement().ownerDocument==Q.document.$||as.item&&as.item(0).ownerDocument==Q.document.$){var at=document.body.createTextRange();at.moveToElementText(au.getElement().getFirst().$);at.collapse(true);at.select();}}}},this,null,4294967295);if(b.ie6Compat)this.on('load',function(aq){var ar=this.getElement(),as=ar.getFirst();as.remove();as.appendTo(ar);},this);A(this);B(this);new d.text(S.title,a.document).appendTo(this.parts.title);for(X=0;X<S.contents.length;X++){var an=S.contents[X];an&&this.addPage(an);}this.parts.tabs.on('click',function(aq){var at=this;var ar=aq.data.getTarget();if(ar.hasClass('cke_dialog_tab')){var as=ar.$.id;at.selectPage(as.substring(4,as.lastIndexOf('_')));if(at._.tabBarMode){at._.tabBarMode=false;at._.currentFocusIndex=-1;aj(1);}aq.data.preventDefault();}},this);var ao=[],ap=a.dialog._.uiElementBuilders.hbox.build(this,{type:'hbox',className:'cke_dialog_footer_buttons',widths:[],children:S.buttons},ao).getChild();this.parts.footer.setHtml(ao.join(''));for(X=0;X<ap.length;X++)this._.buttons[ap[X].id]=ap[X];};function t(Q,R,S){this.element=R;this.focusIndex=S;this.tabIndex=0;this.isFocusable=function(){return!R.getAttribute('disabled')&&R.isVisible();};this.focus=function(){Q._.currentFocusIndex=this.focusIndex;this.element.focus();};R.on('keydown',function(T){if(T.data.getKeystroke() in {32:1,13:1})this.fire('click');});R.on('focus',function(){this.fire('mouseover');});R.on('blur',function(){this.fire('mouseout');});};a.dialog.prototype={destroy:function(){this.hide();this._.element.remove();},resize:(function(){return function(Q,R){var S=this;if(S._.contentSize&&S._.contentSize.width==Q&&S._.contentSize.height==R)return;a.dialog.fire('resize',{dialog:S,skin:S._.editor.skinName,width:Q,height:R},S._.editor);S.fire('resize',{skin:S._.editor.skinName,width:Q,height:R},S._.editor);if(S._.editor.lang.dir=='rtl'&&S._.position)S._.position.x=a.document.getWindow().getViewPaneSize().width-S._.contentSize.width-parseInt(S._.element.getFirst().getStyle('right'),10);
-S._.contentSize={width:Q,height:R};};})(),getSize:function(){var Q=this._.element.getFirst();return{width:Q.$.offsetWidth||0,height:Q.$.offsetHeight||0};},move:(function(){var Q;return function(R,S,T){var aa=this;var U=aa._.element.getFirst(),V=aa._.editor.lang.dir=='rtl';if(Q===undefined)Q=U.getComputedStyle('position')=='fixed';if(Q&&aa._.position&&aa._.position.x==R&&aa._.position.y==S)return;aa._.position={x:R,y:S};if(!Q){var W=a.document.getWindow().getScrollPosition();R+=W.x;S+=W.y;}if(V){var X=aa.getSize(),Y=a.document.getWindow().getViewPaneSize();R=Y.width-X.width-R;}var Z={top:(S>0?S:0)+'px'};Z[V?'right':'left']=(R>0?R:0)+'px';U.setStyles(Z);T&&(aa._.moved=1);};})(),getPosition:function(){return e.extend({},this._.position);},show:function(){var Q=this._.element,R=this.definition;if(!(Q.getParent()&&Q.getParent().equals(a.document.getBody())))Q.appendTo(a.document.getBody());else Q.setStyle('display','block');if(b.gecko&&b.version<10900){var S=this.parts.dialog;S.setStyle('position','absolute');setTimeout(function(){S.setStyle('position','fixed');},0);}this.resize(this._.contentSize&&this._.contentSize.width||R.width||R.minWidth,this._.contentSize&&this._.contentSize.height||R.height||R.minHeight);this.reset();this.selectPage(this.definition.contents[0].id);if(a.dialog._.currentZIndex===null)a.dialog._.currentZIndex=this._.editor.config.baseFloatZIndex;this._.element.getFirst().setStyle('z-index',a.dialog._.currentZIndex+=10);if(a.dialog._.currentTop===null){a.dialog._.currentTop=this;this._.parentDialog=null;G(this._.editor);}else{this._.parentDialog=a.dialog._.currentTop;var T=this._.parentDialog.getElement().getFirst();T.$.style.zIndex-=Math.floor(this._.editor.config.baseFloatZIndex/2);a.dialog._.currentTop=this;}Q.on('keydown',K);Q.on(b.opera?'keypress':'keyup',L);this._.hasFocus=false;e.setTimeout(function(){this.layout();this.parts.dialog.setStyle('visibility','');this.fireOnce('load',{});k.fire('ready',this);this.fire('show',{});this._.editor.fire('dialogShow',this);this.foreach(function(U){U.setInitValue&&U.setInitValue();});},100,this);},layout:function(){var S=this;var Q=a.document.getWindow().getViewPaneSize(),R=S.getSize();S.move(S._.moved?S._.position.x:(Q.width-R.width)/2,S._.moved?S._.position.y:(Q.height-R.height)/2);},foreach:function(Q){var T=this;for(var R in T._.contents)for(var S in T._.contents[R])Q.call(T,T._.contents[R][S]);return T;},reset:(function(){var Q=function(R){if(R.reset)R.reset(1);};return function(){this.foreach(Q);
-return this;};})(),setupContent:function(){var Q=arguments;this.foreach(function(R){if(R.setup)R.setup.apply(R,Q);});},commitContent:function(){var Q=arguments;this.foreach(function(R){if(c&&this._.currentFocusIndex==R.focusIndex)R.getInputElement().$.blur();if(R.commit)R.commit.apply(R,Q);});},hide:function(){if(!this.parts.dialog.isVisible())return;this.fire('hide',{});this._.editor.fire('dialogHide',this);this.selectPage(this._.tabIdList[0]);var Q=this._.element;Q.setStyle('display','none');this.parts.dialog.setStyle('visibility','hidden');N(this);while(a.dialog._.currentTop!=this)a.dialog._.currentTop.hide();if(!this._.parentDialog)H();else{var R=this._.parentDialog.getElement().getFirst();R.setStyle('z-index',parseInt(R.$.style.zIndex,10)+Math.floor(this._.editor.config.baseFloatZIndex/2));}a.dialog._.currentTop=this._.parentDialog;if(!this._.parentDialog){a.dialog._.currentZIndex=null;Q.removeListener('keydown',K);Q.removeListener(b.opera?'keypress':'keyup',L);var S=this._.editor;S.focus();if(S.mode=='wysiwyg'&&c){var T=S.getSelection();T&&T.unlock(true);}}else a.dialog._.currentZIndex-=10;delete this._.parentDialog;this.foreach(function(U){U.resetInitValue&&U.resetInitValue();});},addPage:function(Q){var ac=this;var R=[],S=Q.label?' title="'+e.htmlEncode(Q.label)+'"':'',T=Q.elements,U=a.dialog._.uiElementBuilders.vbox.build(ac,{type:'vbox',className:'cke_dialog_page_contents',children:Q.elements,expand:!!Q.expand,padding:Q.padding,style:Q.style||'width: 100%;height:100%'},R),V=h.createFromHtml(R.join(''));V.setAttribute('role','tabpanel');var W=b,X='cke_'+Q.id+'_'+e.getNextNumber(),Y=h.createFromHtml(['<a class="cke_dialog_tab"',ac._.pageCount>0?' cke_last':'cke_first',S,!!Q.hidden?' style="display:none"':'',' id="',X,'"',W.gecko&&W.version>=10900&&!W.hc?'':' href="javascript:void(0)"',' tabIndex="-1"',' hidefocus="true"',' role="tab">',Q.label,'</a>'].join(''));V.setAttribute('aria-labelledby',X);ac._.tabs[Q.id]=[Y,V];ac._.tabIdList.push(Q.id);!Q.hidden&&ac._.pageCount++;ac._.lastTab=Y;ac.updateStyle();var Z=ac._.contents[Q.id]={},aa,ab=U.getChild();while(aa=ab.shift()){Z[aa.id]=aa;if(typeof aa.getChild=='function')ab.push.apply(ab,aa.getChild());}V.setAttribute('name',Q.id);V.appendTo(ac.parts.contents);Y.unselectable();ac.parts.tabs.append(Y);if(Q.accessKey){M(ac,ac,'CTRL+'+Q.accessKey,P,O);ac._.accessKeyMap['CTRL+'+Q.accessKey]=Q.id;}},selectPage:function(Q){if(this._.currentTabId==Q)return;if(this.fire('selectPage',{page:Q,currentPage:this._.currentTabId})===true)return;
-for(var R in this._.tabs){var S=this._.tabs[R][0],T=this._.tabs[R][1];if(R!=Q){S.removeClass('cke_dialog_tab_selected');T.hide();}T.setAttribute('aria-hidden',R!=Q);}var U=this._.tabs[Q];U[0].addClass('cke_dialog_tab_selected');if(b.ie6Compat||b.ie7Compat){q(U[1]);U[1].show();setTimeout(function(){q(U[1],1);},0);}else U[1].show();this._.currentTabId=Q;this._.currentTabIndex=e.indexOf(this._.tabIdList,Q);},updateStyle:function(){this.parts.dialog[(this._.pageCount===1?'add':'remove')+'Class']('cke_single_page');},hidePage:function(Q){var S=this;var R=S._.tabs[Q]&&S._.tabs[Q][0];if(!R||S._.pageCount==1||!R.isVisible())return;else if(Q==S._.currentTabId)S.selectPage(o.call(S));R.hide();S._.pageCount--;S.updateStyle();},showPage:function(Q){var S=this;var R=S._.tabs[Q]&&S._.tabs[Q][0];if(!R)return;R.show();S._.pageCount++;S.updateStyle();},getElement:function(){return this._.element;},getName:function(){return this._.name;},getContentElement:function(Q,R){var S=this._.contents[Q];return S&&S[R];},getValueOf:function(Q,R){return this.getContentElement(Q,R).getValue();},setValueOf:function(Q,R,S){return this.getContentElement(Q,R).setValue(S);},getButton:function(Q){return this._.buttons[Q];},click:function(Q){return this._.buttons[Q].click();},disableButton:function(Q){return this._.buttons[Q].disable();},enableButton:function(Q){return this._.buttons[Q].enable();},getPageCount:function(){return this._.pageCount;},getParentEditor:function(){return this._.editor;},getSelectedElement:function(){return this.getParentEditor().getSelection().getSelectedElement();},addFocusable:function(Q,R){var T=this;if(typeof R=='undefined'){R=T._.focusList.length;T._.focusList.push(new t(T,Q,R));}else{T._.focusList.splice(R,0,new t(T,Q,R));for(var S=R+1;S<T._.focusList.length;S++)T._.focusList[S].focusIndex++;}}};e.extend(a.dialog,{add:function(Q,R){if(!this._.dialogDefinitions[Q]||typeof R=='function')this._.dialogDefinitions[Q]=R;},exists:function(Q){return!!this._.dialogDefinitions[Q];},getCurrent:function(){return a.dialog._.currentTop;},okButton:(function(){var Q=function(R,S){S=S||{};return e.extend({id:'ok',type:'button',label:R.lang.common.ok,'class':'cke_dialog_ui_button_ok',onClick:function(T){var U=T.data.dialog;if(U.fire('ok',{hide:true}).hide!==false)U.hide();}},S,true);};Q.type='button';Q.override=function(R){return e.extend(function(S){return Q(S,R);},{type:'button'},true);};return Q;})(),cancelButton:(function(){var Q=function(R,S){S=S||{};return e.extend({id:'cancel',type:'button',label:R.lang.common.cancel,'class':'cke_dialog_ui_button_cancel',onClick:function(T){var U=T.data.dialog;
-if(U.fire('cancel',{hide:true}).hide!==false)U.hide();}},S,true);};Q.type='button';Q.override=function(R){return e.extend(function(S){return Q(S,R);},{type:'button'},true);};return Q;})(),addUIElement:function(Q,R){this._.uiElementBuilders[Q]=R;}});a.dialog._={uiElementBuilders:{},dialogDefinitions:{},currentTop:null,currentZIndex:null};a.event.implementOn(a.dialog);a.event.implementOn(a.dialog.prototype,true);var u={resizable:3,minWidth:600,minHeight:400,buttons:[a.dialog.okButton,a.dialog.cancelButton]},v=function(Q,R,S){for(var T=0,U;U=Q[T];T++){if(U.id==R)return U;if(S&&U[S]){var V=v(U[S],R,S);if(V)return V;}}return null;},w=function(Q,R,S,T,U){if(S){for(var V=0,W;W=Q[V];V++){if(W.id==S){Q.splice(V,0,R);return R;}if(T&&W[T]){var X=w(W[T],R,S,T,true);if(X)return X;}}if(U)return null;}Q.push(R);return R;},x=function(Q,R,S){for(var T=0,U;U=Q[T];T++){if(U.id==R)return Q.splice(T,1);if(S&&U[S]){var V=x(U[S],R,S);if(V)return V;}}return null;},y=function(Q,R){this.dialog=Q;var S=R.contents;for(var T=0,U;U=S[T];T++)S[T]=U&&new z(Q,U);e.extend(this,R);};y.prototype={getContents:function(Q){return v(this.contents,Q);},getButton:function(Q){return v(this.buttons,Q);},addContents:function(Q,R){return w(this.contents,Q,R);},addButton:function(Q,R){return w(this.buttons,Q,R);},removeContents:function(Q){x(this.contents,Q);},removeButton:function(Q){x(this.buttons,Q);}};function z(Q,R){this._={dialog:Q};e.extend(this,R);};z.prototype={get:function(Q){return v(this.elements,Q,'children');},add:function(Q,R){return w(this.elements,Q,R,'children');},remove:function(Q){x(this.elements,Q,'children');}};function A(Q){var R=null,S=null,T=Q.getElement().getFirst(),U=Q.getParentEditor(),V=U.config.dialog_magnetDistance,W=U.skin.margins||[0,0,0,0];if(typeof V=='undefined')V=20;function X(Z){var aa=Q.getSize(),ab=a.document.getWindow().getViewPaneSize(),ac=Z.data.$.screenX,ad=Z.data.$.screenY,ae=ac-R.x,af=ad-R.y,ag,ah;R={x:ac,y:ad};S.x+=ae;S.y+=af;if(S.x+W[3]<V)ag=-W[3];else if(S.x-W[1]>ab.width-aa.width-V)ag=ab.width-aa.width+(U.lang.dir=='rtl'?0:W[1]);else ag=S.x;if(S.y+W[0]<V)ah=-W[0];else if(S.y-W[2]>ab.height-aa.height-V)ah=ab.height-aa.height+W[2];else ah=S.y;Q.move(ag,ah,1);Z.data.preventDefault();};function Y(Z){a.document.removeListener('mousemove',X);a.document.removeListener('mouseup',Y);if(b.ie6Compat){var aa=E.getChild(0).getFrameDocument();aa.removeListener('mousemove',X);aa.removeListener('mouseup',Y);}};Q.parts.title.on('mousedown',function(Z){R={x:Z.data.$.screenX,y:Z.data.$.screenY};
-a.document.on('mousemove',X);a.document.on('mouseup',Y);S=Q.getPosition();if(b.ie6Compat){var aa=E.getChild(0).getFrameDocument();aa.on('mousemove',X);aa.on('mouseup',Y);}Z.data.preventDefault();},Q);};function B(Q){var R=Q.definition,S=R.resizable;if(S==0)return;var T=Q.getParentEditor(),U,V,W,X,Y,Z,aa=e.addFunction(function(ad){Y=Q.getSize();var ae=Q.parts.contents,af=ae.$.getElementsByTagName('iframe').length;if(af){Z=h.createFromHtml('<div class="cke_dialog_resize_cover" style="height: 100%; position: absolute; width: 100%;"></div>');ae.append(Z);}V=Y.height-Q.parts.contents.getSize('height',!(b.gecko||b.opera||c&&b.quirks));U=Y.width-Q.parts.contents.getSize('width',1);X={x:ad.screenX,y:ad.screenY};W=a.document.getWindow().getViewPaneSize();a.document.on('mousemove',ab);a.document.on('mouseup',ac);if(b.ie6Compat){var ag=E.getChild(0).getFrameDocument();ag.on('mousemove',ab);ag.on('mouseup',ac);}ad.preventDefault&&ad.preventDefault();});Q.on('load',function(){var ad='';if(S==1)ad=' cke_resizer_horizontal';else if(S==2)ad=' cke_resizer_vertical';var ae=h.createFromHtml('<div class="cke_resizer'+ad+' cke_resizer_'+T.lang.dir+'"'+' title="'+e.htmlEncode(T.lang.resize)+'"'+' onmousedown="CKEDITOR.tools.callFunction('+aa+', event )"></div>');Q.parts.footer.append(ae,1);});T.on('destroy',function(){e.removeFunction(aa);});function ab(ad){var ae=T.lang.dir=='rtl',af=(ad.data.$.screenX-X.x)*(ae?-1:1),ag=ad.data.$.screenY-X.y,ah=Y.width,ai=Y.height,aj=ah+af*(Q._.moved?1:2),ak=ai+ag*(Q._.moved?1:2),al=Q._.element.getFirst(),am=ae&&al.getComputedStyle('right'),an=Q.getPosition();if(an.y+ak>W.height)ak=W.height-an.y;if((ae?am:an.x)+aj>W.width)aj=W.width-(ae?am:an.x);if(S==1||S==3)ah=Math.max(R.minWidth||0,aj-U);if(S==2||S==3)ai=Math.max(R.minHeight||0,ak-V);Q.resize(ah,ai);if(!Q._.moved)Q.layout();ad.data.preventDefault();};function ac(){a.document.removeListener('mouseup',ac);a.document.removeListener('mousemove',ab);if(Z){Z.remove();Z=null;}if(b.ie6Compat){var ad=E.getChild(0).getFrameDocument();ad.removeListener('mouseup',ac);ad.removeListener('mousemove',ab);}};};var C,D={},E;function F(Q){Q.data.preventDefault(1);};function G(Q){var R=a.document.getWindow(),S=Q.config,T=S.dialog_backgroundCoverColor||'white',U=S.dialog_backgroundCoverOpacity,V=S.baseFloatZIndex,W=e.genKey(T,U,V),X=D[W];if(!X){var Y=['<div tabIndex="-1" style="position: ',b.ie6Compat?'absolute':'fixed','; z-index: ',V,'; top: 0px; left: 0px; ',!b.ie6Compat?'background-color: '+T:'','" class="cke_dialog_background_cover">'];
-if(b.ie6Compat){var Z=b.isCustomDomain(),aa="<html><body style=\\'background-color:"+T+";\\'></body></html>";Y.push('<iframe hidefocus="true" frameborder="0" id="cke_dialog_background_iframe" src="javascript:');Y.push('void((function(){document.open();'+(Z?"document.domain='"+document.domain+"';":'')+"document.write( '"+aa+"' );"+'document.close();'+'})())');Y.push('" style="position:absolute;left:0;top:0;width:100%;height: 100%;progid:DXImageTransform.Microsoft.Alpha(opacity=0)"></iframe>');}Y.push('</div>');X=h.createFromHtml(Y.join(''));X.setOpacity(U!=undefined?U:0.5);X.on('keydown',F);X.on('keypress',F);X.on('keyup',F);X.appendTo(a.document.getBody());D[W]=X;}else X.show();E=X;var ab=function(){var ae=R.getViewPaneSize();X.setStyles({width:ae.width+'px',height:ae.height+'px'});},ac=function(){var ae=R.getScrollPosition(),af=a.dialog._.currentTop;X.setStyles({left:ae.x+'px',top:ae.y+'px'});if(af)do{var ag=af.getPosition();af.move(ag.x,ag.y);}while(af=af._.parentDialog)};C=ab;R.on('resize',ab);ab();if(!(b.mac&&b.webkit))X.focus();if(b.ie6Compat){var ad=function(){ac();arguments.callee.prevScrollHandler.apply(this,arguments);};R.$.setTimeout(function(){ad.prevScrollHandler=window.onscroll||(function(){});window.onscroll=ad;},0);ac();}};function H(){if(!E)return;var Q=a.document.getWindow();E.hide();Q.removeListener('resize',C);if(b.ie6Compat)Q.$.setTimeout(function(){var R=window.onscroll&&window.onscroll.prevScrollHandler;window.onscroll=R||null;},0);C=null;};function I(){for(var Q in D)D[Q].remove();D={};};var J={},K=function(Q){var R=Q.data.$.ctrlKey||Q.data.$.metaKey,S=Q.data.$.altKey,T=Q.data.$.shiftKey,U=String.fromCharCode(Q.data.$.keyCode),V=J[(R?'CTRL+':'')+(S?'ALT+':'')+(T?'SHIFT+':'')+U];if(!V||!V.length)return;V=V[V.length-1];V.keydown&&V.keydown.call(V.uiElement,V.dialog,V.key);Q.data.preventDefault();},L=function(Q){var R=Q.data.$.ctrlKey||Q.data.$.metaKey,S=Q.data.$.altKey,T=Q.data.$.shiftKey,U=String.fromCharCode(Q.data.$.keyCode),V=J[(R?'CTRL+':'')+(S?'ALT+':'')+(T?'SHIFT+':'')+U];if(!V||!V.length)return;V=V[V.length-1];if(V.keyup){V.keyup.call(V.uiElement,V.dialog,V.key);Q.data.preventDefault();}},M=function(Q,R,S,T,U){var V=J[S]||(J[S]=[]);V.push({uiElement:Q,dialog:R,key:S,keyup:U||Q.accessKeyUp,keydown:T||Q.accessKeyDown});},N=function(Q){for(var R in J){var S=J[R];for(var T=S.length-1;T>=0;T--){if(S[T].dialog==Q||S[T].uiElement==Q)S.splice(T,1);}if(S.length===0)delete J[R];}},O=function(Q,R){if(Q._.accessKeyMap[R])Q.selectPage(Q._.accessKeyMap[R]);
-},P=function(Q,R){};(function(){k.dialog={uiElement:function(Q,R,S,T,U,V,W){if(arguments.length<4)return;var X=(T.call?T(R):T)||'div',Y=['<',X,' '],Z=(U&&U.call?U(R):U)||{},aa=(V&&V.call?V(R):V)||{},ab=(W&&W.call?W.call(this,Q,R):W)||'',ac=this.domId=aa.id||e.getNextId()+'_uiElement',ad=this.id=R.id,ae;aa.id=ac;var af={};if(R.type)af['cke_dialog_ui_'+R.type]=1;if(R.className)af[R.className]=1;if(R.disabled)af.cke_disabled=1;var ag=aa['class']&&aa['class'].split?aa['class'].split(' '):[];for(ae=0;ae<ag.length;ae++){if(ag[ae])af[ag[ae]]=1;}var ah=[];for(ae in af)ah.push(ae);aa['class']=ah.join(' ');if(R.title)aa.title=R.title;var ai=(R.style||'').split(';');if(R.align){var aj=R.align;Z['margin-left']=aj=='left'?0:'auto';Z['margin-right']=aj=='right'?0:'auto';}for(ae in Z)ai.push(ae+':'+Z[ae]);if(R.hidden)ai.push('display:none');for(ae=ai.length-1;ae>=0;ae--){if(ai[ae]==='')ai.splice(ae,1);}if(ai.length>0)aa.style=(aa.style?aa.style+'; ':'')+ai.join('; ');for(ae in aa)Y.push(ae+'="'+e.htmlEncode(aa[ae])+'" ');Y.push('>',ab,'</',X,'>');S.push(Y.join(''));(this._||(this._={})).dialog=Q;if(typeof R.isChanged=='boolean')this.isChanged=function(){return R.isChanged;};if(typeof R.isChanged=='function')this.isChanged=R.isChanged;if(typeof R.setValue=='function')this.setValue=e.override(this.setValue,function(al){return function(am){al.call(this,R.setValue.call(this,am));};});if(typeof R.getValue=='function')this.getValue=e.override(this.getValue,function(al){return function(){return R.getValue.call(this,al.call(this));};});a.event.implementOn(this);this.registerEvents(R);if(this.accessKeyUp&&this.accessKeyDown&&R.accessKey)M(this,Q,'CTRL+'+R.accessKey);var ak=this;Q.on('load',function(){var al=ak.getInputElement();if(al){var am=ak.type in {checkbox:1,ratio:1}&&c&&b.version<8?'cke_dialog_ui_focused':'';al.on('focus',function(){Q._.tabBarMode=false;Q._.hasFocus=true;ak.fire('focus');am&&this.addClass(am);});al.on('blur',function(){ak.fire('blur');am&&this.removeClass(am);});}});if(this.keyboardFocusable){this.tabIndex=R.tabIndex||0;this.focusIndex=Q._.focusList.push(this)-1;this.on('focus',function(){Q._.currentFocusIndex=ak.focusIndex;});}e.extend(this,R);},hbox:function(Q,R,S,T,U){if(arguments.length<4)return;this._||(this._={});var V=this._.children=R,W=U&&U.widths||null,X=U&&U.height||null,Y={},Z,aa=function(){var ac=['<tbody><tr class="cke_dialog_ui_hbox">'];for(Z=0;Z<S.length;Z++){var ad='cke_dialog_ui_hbox_child',ae=[];if(Z===0)ad='cke_dialog_ui_hbox_first';if(Z==S.length-1)ad='cke_dialog_ui_hbox_last';
-ac.push('<td class="',ad,'" role="presentation" ');if(W){if(W[Z])ae.push('width:'+m(W[Z]));}else ae.push('width:'+Math.floor(100/S.length)+'%');if(X)ae.push('height:'+m(X));if(U&&U.padding!=undefined)ae.push('padding:'+m(U.padding));if(c&&b.quirks&&V[Z].align)ae.push('text-align:'+V[Z].align);if(ae.length>0)ac.push('style="'+ae.join('; ')+'" ');ac.push('>',S[Z],'</td>');}ac.push('</tr></tbody>');return ac.join('');},ab={role:'presentation'};U&&U.align&&(ab.align=U.align);k.dialog.uiElement.call(this,Q,U||{type:'hbox'},T,'table',Y,ab,aa);},vbox:function(Q,R,S,T,U){if(arguments.length<3)return;this._||(this._={});var V=this._.children=R,W=U&&U.width||null,X=U&&U.heights||null,Y=function(){var Z=['<table role="presentation" cellspacing="0" border="0" '];Z.push('style="');if(U&&U.expand)Z.push('height:100%;');Z.push('width:'+m(W||'100%'),';');Z.push('"');Z.push('align="',e.htmlEncode(U&&U.align||(Q.getParentEditor().lang.dir=='ltr'?'left':'right')),'" ');Z.push('><tbody>');for(var aa=0;aa<S.length;aa++){var ab=[];Z.push('<tr><td role="presentation" ');if(W)ab.push('width:'+m(W||'100%'));if(X)ab.push('height:'+m(X[aa]));else if(U&&U.expand)ab.push('height:'+Math.floor(100/S.length)+'%');if(U&&U.padding!=undefined)ab.push('padding:'+m(U.padding));if(c&&b.quirks&&V[aa].align)ab.push('text-align:'+V[aa].align);if(ab.length>0)Z.push('style="',ab.join('; '),'" ');Z.push(' class="cke_dialog_ui_vbox_child">',S[aa],'</td></tr>');}Z.push('</tbody></table>');return Z.join('');};k.dialog.uiElement.call(this,Q,U||{type:'vbox'},T,'div',null,{role:'presentation'},Y);}};})();k.dialog.uiElement.prototype={getElement:function(){return a.document.getById(this.domId);},getInputElement:function(){return this.getElement();},getDialog:function(){return this._.dialog;},setValue:function(Q,R){this.getInputElement().setValue(Q);!R&&this.fire('change',{value:Q});return this;},getValue:function(){return this.getInputElement().getValue();},isChanged:function(){return false;},selectParentTab:function(){var T=this;var Q=T.getInputElement(),R=Q,S;while((R=R.getParent())&&R.$.className.search('cke_dialog_page_contents')==-1){}if(!R)return T;S=R.getAttribute('name');if(T._.dialog._.currentTabId!=S)T._.dialog.selectPage(S);return T;},focus:function(){this.selectParentTab().getInputElement().focus();return this;},registerEvents:function(Q){var R=/^on([A-Z]\w+)/,S,T=function(V,W,X,Y){W.on('load',function(){V.getInputElement().on(X,Y,V);});};for(var U in Q){if(!(S=U.match(R)))continue;if(this.eventProcessors[U])this.eventProcessors[U].call(this,this._.dialog,Q[U]);
-else T(this,this._.dialog,S[1].toLowerCase(),Q[U]);}return this;},eventProcessors:{onLoad:function(Q,R){Q.on('load',R,this);},onShow:function(Q,R){Q.on('show',R,this);},onHide:function(Q,R){Q.on('hide',R,this);}},accessKeyDown:function(Q,R){this.focus();},accessKeyUp:function(Q,R){},disable:function(){var Q=this.getElement(),R=this.getInputElement();R.setAttribute('disabled','true');Q.addClass('cke_disabled');},enable:function(){var Q=this.getElement(),R=this.getInputElement();R.removeAttribute('disabled');Q.removeClass('cke_disabled');},isEnabled:function(){return!this.getElement().hasClass('cke_disabled');},isVisible:function(){return this.getInputElement().isVisible();},isFocusable:function(){if(!this.isEnabled()||!this.isVisible())return false;return true;}};k.dialog.hbox.prototype=e.extend(new k.dialog.uiElement(),{getChild:function(Q){var R=this;if(arguments.length<1)return R._.children.concat();if(!Q.splice)Q=[Q];if(Q.length<2)return R._.children[Q[0]];else return R._.children[Q[0]]&&R._.children[Q[0]].getChild?R._.children[Q[0]].getChild(Q.slice(1,Q.length)):null;}},true);k.dialog.vbox.prototype=new k.dialog.hbox();(function(){var Q={build:function(R,S,T){var U=S.children,V,W=[],X=[];for(var Y=0;Y<U.length&&(V=U[Y]);Y++){var Z=[];W.push(Z);X.push(a.dialog._.uiElementBuilders[V.type].build(R,V,Z));}return new k.dialog[S.type](R,X,W,T,S);}};a.dialog.addUIElement('hbox',Q);a.dialog.addUIElement('vbox',Q);})();a.dialogCommand=function(Q){this.dialogName=Q;};a.dialogCommand.prototype={exec:function(Q){b.opera?e.setTimeout(function(){Q.openDialog(this.dialogName);},0,this):Q.openDialog(this.dialogName);},canUndo:false,editorFocus:c||b.webkit};(function(){var Q=/^([a]|[^a])+$/,R=/^\d*$/,S=/^\d*(?:\.\d+)?$/,T=/^(((\d*(\.\d+))|(\d*))(px|\%)?)?$/,U=/^(((\d*(\.\d+))|(\d*))(px|em|ex|in|cm|mm|pt|pc|\%)?)?$/i,V=/^(\s*[\w-]+\s*:\s*[^:;]+(?:;|$))*$/;a.VALIDATE_OR=1;a.VALIDATE_AND=2;a.dialog.validate={functions:function(){var W=arguments;return function(){var X=this&&this.getValue?this.getValue():W[0],Y=undefined,Z=2,aa=[],ab;for(ab=0;ab<W.length;ab++){if(typeof W[ab]=='function')aa.push(W[ab]);else break;}if(ab<W.length&&typeof W[ab]=='string'){Y=W[ab];ab++;}if(ab<W.length&&typeof W[ab]=='number')Z=W[ab];var ac=Z==2?true:false;for(ab=0;ab<aa.length;ab++){if(Z==2)ac=ac&&aa[ab](X);else ac=ac||aa[ab](X);}return!ac?Y:true;};},regex:function(W,X){return function(){var Y=this&&this.getValue?this.getValue():arguments[0];return!W.test(Y)?X:true;};},notEmpty:function(W){return this.regex(Q,W);
-},integer:function(W){return this.regex(R,W);},number:function(W){return this.regex(S,W);},cssLength:function(W){return this.functions(function(X){return U.test(e.trim(X));},W);},htmlLength:function(W){return this.functions(function(X){return T.test(e.trim(X));},W);},inlineStyle:function(W){return this.functions(function(X){return V.test(e.trim(X));},W);},equals:function(W,X){return this.functions(function(Y){return Y==W;},X);},notEqual:function(W,X){return this.functions(function(Y){return Y!=W;},X);}};a.on('instanceDestroyed',function(W){if(e.isEmpty(a.instances)){var X;while(X=a.dialog._.currentTop)X.hide();I();}var Y=W.editor._.storedDialogs;for(var Z in Y)Y[Z].destroy();});})();e.extend(a.editor.prototype,{openDialog:function(Q,R){if(this.mode=='wysiwyg'&&c){var S=this.getSelection();S&&S.lock();}var T=a.dialog._.dialogDefinitions[Q],U=this.skin.dialog;if(a.dialog._.currentTop===null)G(this);if(typeof T=='function'&&U._isLoaded){var V=this._.storedDialogs||(this._.storedDialogs={}),W=V[Q]||(V[Q]=new a.dialog(this,Q));R&&R.call(W,W);W.show();return W;}else if(T=='failed'){H();throw new Error('[CKEDITOR.dialog.openDialog] Dialog "'+Q+'" failed when loading definition.');}var X=this;function Y(aa){var ab=a.dialog._.dialogDefinitions[Q],ac=X.skin.dialog;if(!ac._isLoaded||Z&&typeof aa=='undefined')return;if(typeof ab!='function')a.dialog._.dialogDefinitions[Q]='failed';X.openDialog(Q,R);};if(typeof T=='string'){var Z=1;a.scriptLoader.load(a.getUrl(T),Y,null,0,1);}a.skins.load(this,'dialog',Y);return null;}});})();j.add('dialog',{requires:['dialogui']});j.add('styles',{requires:['selection'],init:function(m){m.on('contentDom',function(){m.document.setCustomData('cke_includeReadonly',!m.config.disableReadonlyStyling);});}});a.editor.prototype.attachStyleStateChange=function(m,n){var o=this._.styleStateChangeCallbacks;if(!o){o=this._.styleStateChangeCallbacks=[];this.on('selectionChange',function(p){for(var q=0;q<o.length;q++){var r=o[q],s=r.style.checkActive(p.data.path)?1:2;r.fn.call(this,s);}});}o.push({style:m,fn:n});};a.STYLE_BLOCK=1;a.STYLE_INLINE=2;a.STYLE_OBJECT=3;(function(){var m={address:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,section:1,header:1,footer:1,nav:1,article:1,aside:1,figure:1,dialog:1,hgroup:1,time:1,meter:1,menu:1,command:1,keygen:1,output:1,progress:1,details:1,datagrid:1,datalist:1},n={a:1,embed:1,hr:1,img:1,li:1,object:1,ol:1,table:1,td:1,tr:1,th:1,ul:1,dl:1,dt:1,dd:1,form:1,audio:1,video:1},o=/\s*(?:;\s*|$)/,p=/#\((.+?)\)/g,q=d.walker.bookmark(0,1),r=d.walker.whitespaces(1);
-a.style=function(T,U){var W=this;if(U){T=e.clone(T);L(T.attributes,U);L(T.styles,U);}var V=W.element=T.element?typeof T.element=='string'?T.element.toLowerCase():T.element:'*';W.type=m[V]?1:n[V]?3:2;if(typeof W.element=='object')W.type=3;W._={definition:T};};a.style.prototype={apply:function(T){S.call(this,T,false);},remove:function(T){S.call(this,T,true);},applyToRange:function(T){var U=this;return(U.applyToRange=U.type==2?t:U.type==1?x:U.type==3?v:null).call(U,T);},removeFromRange:function(T){var U=this;return(U.removeFromRange=U.type==2?u:U.type==1?y:U.type==3?w:null).call(U,T);},applyToObject:function(T){K(T,this);},checkActive:function(T){var Y=this;switch(Y.type){case 1:return Y.checkElementRemovable(T.block||T.blockLimit,true);case 3:case 2:var U=T.elements;for(var V=0,W;V<U.length;V++){W=U[V];if(Y.type==2&&(W==T.block||W==T.blockLimit))continue;if(Y.type==3){var X=W.getName();if(!(typeof Y.element=='string'?X==Y.element:X in Y.element))continue;}if(Y.checkElementRemovable(W,true))return true;}}return false;},checkApplicable:function(T){switch(this.type){case 2:case 1:break;case 3:return T.lastElement.getAscendant(this.element,true);}return true;},checkElementMatch:function(T,U){var aa=this;var V=aa._.definition;if(!T||!V.ignoreReadonly&&T.isReadOnly())return false;var W,X=T.getName();if(typeof aa.element=='string'?X==aa.element:X in aa.element){if(!U&&!T.hasAttributes())return true;W=M(V);if(W._length){for(var Y in W){if(Y=='_length')continue;var Z=T.getAttribute(Y)||'';if(Y=='style'?R(W[Y],P(Z,false)):W[Y]==Z){if(!U)return true;}else if(U)return false;}if(U)return true;}else return true;}return false;},checkElementRemovable:function(T,U){if(this.checkElementMatch(T,U))return true;var V=N(this)[T.getName()];if(V){var W,X;if(!(W=V.attributes))return true;for(var Y=0;Y<W.length;Y++){X=W[Y][0];var Z=T.getAttribute(X);if(Z){var aa=W[Y][1];if(aa===null||typeof aa=='string'&&Z==aa||aa.test(Z))return true;}}}return false;},buildPreview:function(T){var U=this._.definition,V=[],W=U.element;if(W=='bdo')W='span';V=['<',W];var X=U.attributes;if(X)for(var Y in X)V.push(' ',Y,'="',X[Y],'"');var Z=a.style.getStyleText(U);if(Z)V.push(' style="',Z,'"');V.push('>',T||U.name,'</',W,'>');return V.join('');}};a.style.getStyleText=function(T){var U=T._ST;if(U)return U;U=T.styles;var V=T.attributes&&T.attributes.style||'',W='';if(V.length)V=V.replace(o,';');for(var X in U){var Y=U[X],Z=(X+':'+Y).replace(o,';');if(Y=='inherit')W+=Z;else V+=Z;}if(V.length)V=P(V);V+=W;return T._ST=V;
-};function s(T){var U,V;while(T=T.getParent()){if(T.getName()=='body')break;if(T.getAttribute('data-nostyle'))U=T;else if(!V){var W=T.getAttribute('contentEditable');if(W=='false')U=T;else if(W=='true')V=1;}}return U;};function t(T){var ay=this;var U=T.document;if(T.collapsed){var V=J(ay,U);T.insertNode(V);T.moveToPosition(V,2);return;}var W=ay.element,X=ay._.definition,Y,Z=X.ignoreReadonly,aa=Z||X.includeReadonly;if(aa==undefined)aa=U.getCustomData('cke_includeReadonly');var ab=f[W]||(Y=true,f.span);T.enlarge(1,1);T.trim();var ac=T.createBookmark(),ad=ac.startNode,ae=ac.endNode,af=ad,ag;if(!Z){var ah=s(ad),ai=s(ae);if(ah)af=ah.getNextSourceNode(true);if(ai)ae=ai;}if(af.getPosition(ae)==2)af=0;while(af){var aj=false;if(af.equals(ae)){af=null;aj=true;}else{var ak=af.type,al=ak==1?af.getName():null,am=al&&af.getAttribute('contentEditable')=='false',an=al&&af.getAttribute('data-nostyle');if(al&&af.data('cke-bookmark')){af=af.getNextSourceNode(true);continue;}if(!al||ab[al]&&!an&&(!am||aa)&&(af.getPosition(ae)|4|0|8)==4+0+8&&(!X.childRule||X.childRule(af))){var ao=af.getParent();if(ao&&((ao.getDtd()||f.span)[W]||Y)&&(!X.parentRule||X.parentRule(ao))){if(!ag&&(!al||!f.$removeEmpty[al]||(af.getPosition(ae)|4|0|8)==4+0+8)){ag=new d.range(U);ag.setStartBefore(af);}if(ak==3||am||ak==1&&!af.getChildCount()){var ap=af,aq;while((aj=!ap.getNext(q))&&(aq=ap.getParent(),ab[aq.getName()])&&(aq.getPosition(ad)|2|0|8)==2+0+8&&(!X.childRule||X.childRule(aq)))ap=aq;ag.setEndAfter(ap);}}else aj=true;}else aj=true;af=af.getNextSourceNode(an||am);}if(aj&&ag&&!ag.collapsed){var ar=J(ay,U),as=ar.hasAttributes(),at=ag.getCommonAncestor(),au={styles:{},attrs:{},blockedStyles:{},blockedAttrs:{}},av,aw,ax;while(ar&&at){if(at.getName()==W){for(av in X.attributes){if(au.blockedAttrs[av]||!(ax=at.getAttribute(aw)))continue;if(ar.getAttribute(av)==ax)au.attrs[av]=1;else au.blockedAttrs[av]=1;}for(aw in X.styles){if(au.blockedStyles[aw]||!(ax=at.getStyle(aw)))continue;if(ar.getStyle(aw)==ax)au.styles[aw]=1;else au.blockedStyles[aw]=1;}}at=at.getParent();}for(av in au.attrs)ar.removeAttribute(av);for(aw in au.styles)ar.removeStyle(aw);if(as&&!ar.hasAttributes())ar=null;if(ar){ag.extractContents().appendTo(ar);G(ay,ar);ag.insertNode(ar);ar.mergeSiblings();if(!c)ar.$.normalize();}else{ar=new h('span');ag.extractContents().appendTo(ar);ag.insertNode(ar);G(ay,ar);ar.remove(true);}ag=null;}}T.moveToBookmark(ac);T.shrink(2);};function u(T){T.enlarge(1,1);var U=T.createBookmark(),V=U.startNode;if(T.collapsed){var W=new d.elementPath(V.getParent()),X;
-for(var Y=0,Z;Y<W.elements.length&&(Z=W.elements[Y]);Y++){if(Z==W.block||Z==W.blockLimit)break;if(this.checkElementRemovable(Z)){var aa;if(T.collapsed&&(T.checkBoundaryOfElement(Z,2)||(aa=T.checkBoundaryOfElement(Z,1)))){X=Z;X.match=aa?'start':'end';}else{Z.mergeSiblings();if(Z.getName()==this.element)F(this,Z);else H(Z,N(this)[Z.getName()]);}}}if(X){var ab=V;for(Y=0;true;Y++){var ac=W.elements[Y];if(ac.equals(X))break;else if(ac.match)continue;else ac=ac.clone();ac.append(ab);ab=ac;}ab[X.match=='start'?'insertBefore':'insertAfter'](X);}}else{var ad=U.endNode,ae=this;function af(){var ai=new d.elementPath(V.getParent()),aj=new d.elementPath(ad.getParent()),ak=null,al=null;for(var am=0;am<ai.elements.length;am++){var an=ai.elements[am];if(an==ai.block||an==ai.blockLimit)break;if(ae.checkElementRemovable(an))ak=an;}for(am=0;am<aj.elements.length;am++){an=aj.elements[am];if(an==aj.block||an==aj.blockLimit)break;if(ae.checkElementRemovable(an))al=an;}if(al)ad.breakParent(al);if(ak)V.breakParent(ak);};af();var ag=V;while(!ag.equals(ad)){var ah=ag.getNextSourceNode();if(ag.type==1&&this.checkElementRemovable(ag)){if(ag.getName()==this.element)F(this,ag);else H(ag,N(this)[ag.getName()]);if(ah.type==1&&ah.contains(V)){af();ah=V.getNext();}}ag=ah;}}T.moveToBookmark(U);};function v(T){var U=T.getCommonAncestor(true,true),V=U.getAscendant(this.element,true);V&&!V.isReadOnly()&&K(V,this);};function w(T){var U=T.getCommonAncestor(true,true),V=U.getAscendant(this.element,true);if(!V)return;var W=this,X=W._.definition,Y=X.attributes;if(Y)for(var Z in Y)V.removeAttribute(Z,Y[Z]);if(X.styles)for(var aa in X.styles){if(!X.styles.hasOwnProperty(aa))continue;V.removeStyle(aa);}};function x(T){var U=T.createBookmark(true),V=T.createIterator();V.enforceRealBlocks=true;if(this._.enterMode)V.enlargeBr=this._.enterMode!=2;var W,X=T.document,Y;while(W=V.getNextParagraph()){if(!W.isReadOnly()){var Z=J(this,X,W);z(W,Z);}}T.moveToBookmark(U);};function y(T){var Y=this;var U=T.createBookmark(1),V=T.createIterator();V.enforceRealBlocks=true;V.enlargeBr=Y._.enterMode!=2;var W;while(W=V.getNextParagraph()){if(Y.checkElementRemovable(W))if(W.is('pre')){var X=Y._.enterMode==2?null:T.document.createElement(Y._.enterMode==1?'p':'div');X&&W.copyAttributes(X);z(W,X);}else F(Y,W,1);}T.moveToBookmark(U);};function z(T,U){var V=!U;if(V){U=T.getDocument().createElement('div');T.copyAttributes(U);}var W=U&&U.is('pre'),X=T.is('pre'),Y=W&&!X,Z=!W&&X;if(Y)U=E(T,U);else if(Z)U=D(V?[T.getHtml()]:B(T),U);else T.moveChildren(U);
-U.replace(T);if(W)A(U);else if(V)I(U);};function A(T){var U;if(!((U=T.getPrevious(r))&&U.is&&U.is('pre')))return;var V=C(U.getHtml(),/\n$/,'')+'\n\n'+C(T.getHtml(),/^\n/,'');if(c)T.$.outerHTML='<pre>'+V+'</pre>';else T.setHtml(V);U.remove();};function B(T){var U=/(\S\s*)\n(?:\s|(<span[^>]+data-cke-bookmark.*?\/span>))*\n(?!$)/gi,V=T.getName(),W=C(T.getOuterHtml(),U,function(Y,Z,aa){return Z+'</pre>'+aa+'<pre>';}),X=[];W.replace(/<pre\b.*?>([\s\S]*?)<\/pre>/gi,function(Y,Z){X.push(Z);});return X;};function C(T,U,V){var W='',X='';T=T.replace(/(^<span[^>]+data-cke-bookmark.*?\/span>)|(<span[^>]+data-cke-bookmark.*?\/span>$)/gi,function(Y,Z,aa){Z&&(W=Z);aa&&(X=aa);return '';});return W+T.replace(U,V)+X;};function D(T,U){var V;if(T.length>1)V=new d.documentFragment(U.getDocument());for(var W=0;W<T.length;W++){var X=T[W];X=X.replace(/(\r\n|\r)/g,'\n');X=C(X,/^[ \t]*\n/,'');X=C(X,/\n$/,'');X=C(X,/^[ \t]+|[ \t]+$/g,function(Z,aa,ab){if(Z.length==1)return ' ';else if(!aa)return e.repeat(' ',Z.length-1)+' ';else return ' '+e.repeat(' ',Z.length-1);});X=X.replace(/\n/g,'<br>');X=X.replace(/[ \t]{2,}/g,function(Z){return e.repeat(' ',Z.length-1)+' ';});if(V){var Y=U.clone();Y.setHtml(X);V.append(Y);}else U.setHtml(X);}return V||U;};function E(T,U){var V=T.getBogus();V&&V.remove();var W=T.getHtml();W=C(W,/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g,'');W=W.replace(/[ \t\r\n]*(<br[^>]*>)[ \t\r\n]*/gi,'$1');W=W.replace(/([ \t\n\r]+| )/g,' ');W=W.replace(/<br\b[^>]*>/gi,'\n');if(c){var X=T.getDocument().createElement('div');X.append(U);U.$.outerHTML='<pre>'+W+'</pre>';U.copyAttributes(X.getFirst());U=X.getFirst().remove();}else U.setHtml(W);return U;};function F(T,U){var V=T._.definition,W=V.attributes,X=V.styles,Y=N(T)[U.getName()],Z=e.isEmpty(W)&&e.isEmpty(X);for(var aa in W){if((aa=='class'||T._.definition.fullMatch)&&U.getAttribute(aa)!=O(aa,W[aa]))continue;Z=U.hasAttribute(aa);U.removeAttribute(aa);}for(var ab in X){if(T._.definition.fullMatch&&U.getStyle(ab)!=O(ab,X[ab],true))continue;Z=Z||!!U.getStyle(ab);U.removeStyle(ab);}H(U,Y,m[U.getName()]);if(Z)!f.$block[U.getName()]||T._.enterMode==2&&!U.hasAttributes()?I(U):U.renameNode(T._.enterMode==1?'p':'div');};function G(T,U){var V=T._.definition,W=V.attributes,X=V.styles,Y=N(T),Z=U.getElementsByTag(T.element);for(var aa=Z.count();--aa>=0;)F(T,Z.getItem(aa));for(var ab in Y){if(ab!=T.element){Z=U.getElementsByTag(ab);for(aa=Z.count()-1;aa>=0;aa--){var ac=Z.getItem(aa);H(ac,Y[ab]);}}}};function H(T,U,V){var W=U&&U.attributes;
-if(W)for(var X=0;X<W.length;X++){var Y=W[X][0],Z;if(Z=T.getAttribute(Y)){var aa=W[X][1];if(aa===null||aa.test&&aa.test(Z)||typeof aa=='string'&&Z==aa)T.removeAttribute(Y);}}if(!V)I(T);};function I(T){if(!T.hasAttributes())if(f.$block[T.getName()]){var U=T.getPrevious(r),V=T.getNext(r);if(U&&(U.type==3||!U.isBlockBoundary({br:1})))T.append('br',1);if(V&&(V.type==3||!V.isBlockBoundary({br:1})))T.append('br');T.remove(true);}else{var W=T.getFirst(),X=T.getLast();T.remove(true);if(W){W.type==1&&W.mergeSiblings();if(X&&!W.equals(X)&&X.type==1)X.mergeSiblings();}}};function J(T,U,V){var W,X=T._.definition,Y=T.element;if(Y=='*')Y='span';W=new h(Y,U);if(V)V.copyAttributes(W);W=K(W,T);if(U.getCustomData('doc_processing_style')&&W.hasAttribute('id'))W.removeAttribute('id');else U.setCustomData('doc_processing_style',1);return W;};function K(T,U){var V=U._.definition,W=V.attributes,X=a.style.getStyleText(V);if(W)for(var Y in W)T.setAttribute(Y,W[Y]);if(X)T.setAttribute('style',X);return T;};function L(T,U){for(var V in T)T[V]=T[V].replace(p,function(W,X){return U[X];});};function M(T){var U=T._AC;if(U)return U;U={};var V=0,W=T.attributes;if(W)for(var X in W){V++;U[X]=W[X];}var Y=a.style.getStyleText(T);if(Y){if(!U.style)V++;U.style=Y;}U._length=V;return T._AC=U;};function N(T){if(T._.overrides)return T._.overrides;var U=T._.overrides={},V=T._.definition.overrides;if(V){if(!e.isArray(V))V=[V];for(var W=0;W<V.length;W++){var X=V[W],Y,Z,aa;if(typeof X=='string')Y=X.toLowerCase();else{Y=X.element?X.element.toLowerCase():T.element;aa=X.attributes;}Z=U[Y]||(U[Y]={});if(aa){var ab=Z.attributes=Z.attributes||[];for(var ac in aa)ab.push([ac.toLowerCase(),aa[ac]]);}}}return U;};function O(T,U,V){var W=new h('span');W[V?'setStyle':'setAttribute'](T,U);return W[V?'getStyle':'getAttribute'](T);};function P(T,U){var V;if(U!==false){var W=new h('span');W.setAttribute('style',T);V=W.getAttribute('style')||'';}else V=T;V=V.replace(/(font-family:)(.*?)(?=;|$)/,function(X,Y,Z){var aa=Z.split(',');for(var ab=0;ab<aa.length;ab++)aa[ab]=e.trim(aa[ab].replace(/["']/g,''));return Y+aa.join(',');});return V.replace(/\s*([;:])\s*/,'$1').replace(/([^\s;])$/,'$1;').replace(/,\s+/g,',').replace(/\"/g,'').toLowerCase();};function Q(T){var U={};T.replace(/"/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(V,W,X){U[W]=X;});return U;};function R(T,U){typeof T=='string'&&(T=Q(T));typeof U=='string'&&(U=Q(U));for(var V in T){if(!(V in U&&(U[V]==T[V]||T[V]=='inherit'||U[V]=='inherit')))return false;
-}return true;};function S(T,U){var V=T.getSelection(),W=V.createBookmarks(1),X=V.getRanges(),Y=U?this.removeFromRange:this.applyToRange,Z,aa=X.createIterator();while(Z=aa.getNextRange())Y.call(this,Z);if(W.length==1&&W[0].collapsed){V.selectRanges(X);T.getById(W[0].startNode).remove();}else V.selectBookmarks(W);T.removeCustomData('doc_processing_style');};})();a.styleCommand=function(m){this.style=m;};a.styleCommand.prototype.exec=function(m){var o=this;m.focus();var n=m.document;if(n)if(o.state==2)o.style.apply(n);else if(o.state==1)o.style.remove(n);return!!n;};a.stylesSet=new a.resourceManager('','stylesSet');a.addStylesSet=e.bind(a.stylesSet.add,a.stylesSet);a.loadStylesSet=function(m,n,o){a.stylesSet.addExternal(m,n,'');a.stylesSet.load(m,o);};a.editor.prototype.getStylesSet=function(m){if(!this._.stylesDefinitions){var n=this,o=n.config.stylesCombo_stylesSet||n.config.stylesSet||'default';if(o instanceof Array){n._.stylesDefinitions=o;m(o);return;}var p=o.split(':'),q=p[0],r=p[1],s=j.registered.styles.path;a.stylesSet.addExternal(q,r?p.slice(1).join(':'):s+'styles/'+q+'.js','');a.stylesSet.load(q,function(t){n._.stylesDefinitions=t[q];m(n._.stylesDefinitions);});}else m(this._.stylesDefinitions);};j.add('domiterator');(function(){function m(s){var t=this;if(arguments.length<1)return;t.range=s;t.forceBrBreak=0;t.enlargeBr=1;t.enforceRealBlocks=0;t._||(t._={});};var n=/^[\r\n\t ]+$/,o=d.walker.bookmark(false,true),p=d.walker.whitespaces(true),q=function(s){return o(s)&&p(s);};function r(s,t,u){var v=s.getNextSourceNode(t,null,u);while(!o(v))v=v.getNextSourceNode(t,null,u);return v;};m.prototype={getNextParagraph:function(s){var S=this;var t,u,v,w,x,y;if(!S._.started){u=S.range.clone();u.shrink(1,true);w=u.endContainer.hasAscendant('pre',true)||u.startContainer.hasAscendant('pre',true);u.enlarge(S.forceBrBreak&&!w||!S.enlargeBr?3:2);if(!u.collapsed){var z=new d.walker(u.clone()),A=d.walker.bookmark(true,true);z.evaluator=A;S._.nextNode=z.next();z=new d.walker(u.clone());z.evaluator=A;var B=z.previous();S._.lastNode=B.getNextSourceNode(true);if(S._.lastNode&&S._.lastNode.type==3&&!e.trim(S._.lastNode.getText())&&S._.lastNode.getParent().isBlockBoundary()){var C=new d.range(u.document);C.moveToPosition(S._.lastNode,4);if(C.checkEndOfBlock()){var D=new d.elementPath(C.endContainer),E=D.block||D.blockLimit;S._.lastNode=E.getNextSourceNode(true);}}if(!S._.lastNode){S._.lastNode=S._.docEndMarker=u.document.createText('');S._.lastNode.insertAfter(B);}u=null;}S._.started=1;
-}var F=S._.nextNode;B=S._.lastNode;S._.nextNode=null;while(F){var G=0,H=F.hasAscendant('pre'),I=F.type!=1,J=0;if(!I){var K=F.getName();if(F.isBlockBoundary(S.forceBrBreak&&!H&&{br:1})){if(K=='br')I=1;else if(!u&&!F.getChildCount()&&K!='hr'){t=F;v=F.equals(B);break;}if(u){u.setEndAt(F,3);if(K!='br')S._.nextNode=F;}G=1;}else{if(F.getFirst()){if(!u){u=new d.range(S.range.document);u.setStartAt(F,3);}F=F.getFirst();continue;}I=1;}}else if(F.type==3)if(n.test(F.getText()))I=0;if(I&&!u){u=new d.range(S.range.document);u.setStartAt(F,3);}v=(!G||I)&&F.equals(B);if(u&&!G)while(!F.getNext(q)&&!v){var L=F.getParent();if(L.isBlockBoundary(S.forceBrBreak&&!H&&{br:1})){G=1;I=0;v=v||L.equals(B);u.setEndAt(L,2);break;}F=L;I=1;v=F.equals(B);J=1;}if(I)u.setEndAt(F,4);F=r(F,J,B);v=!F;if(v||G&&u)break;}if(!t){if(!u){S._.docEndMarker&&S._.docEndMarker.remove();S._.nextNode=null;return null;}var M=new d.elementPath(u.startContainer),N=M.blockLimit,O={div:1,th:1,td:1};t=M.block;if(!t&&!S.enforceRealBlocks&&O[N.getName()]&&u.checkStartOfBlock()&&u.checkEndOfBlock())t=N;else if(!t||S.enforceRealBlocks&&t.getName()=='li'){t=S.range.document.createElement(s||'p');u.extractContents().appendTo(t);t.trim();u.insertNode(t);x=y=true;}else if(t.getName()!='li'){if(!u.checkStartOfBlock()||!u.checkEndOfBlock()){t=t.clone(false);u.extractContents().appendTo(t);t.trim();var P=u.splitBlock();x=!P.wasStartOfBlock;y=!P.wasEndOfBlock;u.insertNode(t);}}else if(!v)S._.nextNode=t.equals(B)?null:r(u.getBoundaryNodes().endNode,1,B);}if(x){var Q=t.getPrevious();if(Q&&Q.type==1)if(Q.getName()=='br')Q.remove();else if(Q.getLast()&&Q.getLast().$.nodeName.toLowerCase()=='br')Q.getLast().remove();}if(y){var R=t.getLast();if(R&&R.type==1&&R.getName()=='br')if(c||R.getPrevious(o)||R.getNext(o))R.remove();}if(!S._.nextNode)S._.nextNode=v||t.equals(B)||!B?null:r(t,1,B);return t;}};d.range.prototype.createIterator=function(){return new m(this);};})();j.add('panelbutton',{requires:['button'],onLoad:function(){function m(n){var p=this;var o=p._;if(o.state==0)return;p.createPanel(n);if(o.on){o.panel.hide();return;}o.panel.showBlock(p._.id,p.document.getById(p._.id),4);};k.panelButton=e.createClass({base:k.button,$:function(n){var p=this;var o=n.panel;delete n.panel;p.base(n);p.document=o&&o.parent&&o.parent.getDocument()||a.document;o.block={attributes:o.attributes};p.hasArrow=true;p.click=m;p._={panelDefinition:o};},statics:{handler:{create:function(n){return new k.panelButton(n);}}},proto:{createPanel:function(n){var o=this._;
-if(o.panel)return;var p=this._.panelDefinition||{},q=this._.panelDefinition.block,r=p.parent||a.document.getBody(),s=this._.panel=new k.floatPanel(n,r,p),t=s.addBlock(o.id,q),u=this;s.onShow=function(){if(u.className)this.element.getFirst().addClass(u.className+'_panel');u.setState(1);o.on=1;if(u.onOpen)u.onOpen();};s.onHide=function(v){if(u.className)this.element.getFirst().removeClass(u.className+'_panel');u.setState(u.modes&&u.modes[n.mode]?2:0);o.on=0;if(!v&&u.onClose)u.onClose();};s.onEscape=function(){s.hide();u.document.getById(o.id).focus();};if(this.onBlock)this.onBlock(s,t);t.onHide=function(){o.on=0;u.setState(2);};}}});},beforeInit:function(m){m.ui.addHandler('panelbutton',k.panelButton.handler);}});a.UI_PANELBUTTON='panelbutton';j.add('floatpanel',{requires:['panel']});(function(){var m={},n=false;function o(p,q,r,s,t){var u=e.genKey(q.getUniqueId(),r.getUniqueId(),p.skinName,p.lang.dir,p.uiColor||'',s.css||'',t||''),v=m[u];if(!v){v=m[u]=new k.panel(q,s);v.element=r.append(h.createFromHtml(v.renderHtml(p),q));v.element.setStyles({display:'none',position:'absolute'});}return v;};k.floatPanel=e.createClass({$:function(p,q,r,s){r.forceIFrame=1;var t=q.getDocument(),u=o(p,t,q,r,s||0),v=u.element,w=v.getFirst().getFirst();v.disableContextMenu();this.element=v;this._={editor:p,panel:u,parentElement:q,definition:r,document:t,iframe:w,children:[],dir:p.lang.dir};p.on('mode',function(){this.hide();},this);},proto:{addBlock:function(p,q){return this._.panel.addBlock(p,q);},addListBlock:function(p,q){return this._.panel.addListBlock(p,q);},getBlock:function(p){return this._.panel.getBlock(p);},showBlock:function(p,q,r,s,t){var u=this._.panel,v=u.showBlock(p);this.allowBlur(false);n=1;this._.returnFocus=this._.editor.focusManager.hasFocus?this._.editor:new h(a.document.$.activeElement);var w=this.element,x=this._.iframe,y=this._.definition,z=q.getDocumentPosition(w.getDocument()),A=this._.dir=='rtl',B=z.x+(s||0),C=z.y+(t||0);if(A&&(r==1||r==4))B+=q.$.offsetWidth;else if(!A&&(r==2||r==3))B+=q.$.offsetWidth-1;if(r==3||r==4)C+=q.$.offsetHeight-1;this._.panel._.offsetParentId=q.getId();w.setStyles({top:C+'px',left:0,display:''});w.setOpacity(0);w.getFirst().removeStyle('width');if(!this._.blurSet){var D=c?x:new d.window(x.$.contentWindow);a.event.useCapture=true;D.on('blur',function(E){var G=this;if(!G.allowBlur())return;var F=E.data.getTarget();if(F.getName&&F.getName()!='iframe')return;if(G.visible&&!G._.activeChild&&!n){delete G._.returnFocus;G.hide();}},this);
-D.on('focus',function(){this._.focused=true;this.hideChild();this.allowBlur(true);},this);a.event.useCapture=false;this._.blurSet=1;}u.onEscape=e.bind(function(E){if(this.onEscape&&this.onEscape(E)===false)return false;},this);e.setTimeout(function(){var E=e.bind(function(){var F=w.getFirst();if(v.autoSize){var G=v.element.$;if(b.gecko||b.opera)G=G.parentNode;if(c)G=G.document.body;var H=G.scrollWidth;if(c&&b.quirks&&H>0)H+=(F.$.offsetWidth||0)-(F.$.clientWidth||0)+3;H+=4;F.setStyle('width',H+'px');v.element.addClass('cke_frameLoaded');var I=v.element.$.scrollHeight;if(c&&b.quirks&&I>0)I+=(F.$.offsetHeight||0)-(F.$.clientHeight||0)+3;F.setStyle('height',I+'px');u._.currentBlock.element.setStyle('display','none').removeStyle('display');}else F.removeStyle('height');if(A)B-=w.$.offsetWidth;w.setStyle('left',B+'px');var J=u.element,K=J.getWindow(),L=w.$.getBoundingClientRect(),M=K.getViewPaneSize(),N=L.width||L.right-L.left,O=L.height||L.bottom-L.top,P=A?L.right:M.width-L.left,Q=A?M.width-L.right:L.left;if(A){if(P<N)if(Q>N)B+=N;else if(M.width>N)B-=L.left;else B=B-L.right+M.width;}else if(P<N)if(Q>N)B-=N;else if(M.width>N)B=B-L.right+M.width;else B-=L.left;var R=M.height-L.top,S=L.top;if(R<O)if(S>O)C-=O;else if(M.height>O)C=C-L.bottom+M.height;else C-=L.top;if(c){var T=new h(w.$.offsetParent),U=T;if(U.getName()=='html')U=U.getDocument().getBody();if(U.getComputedStyle('direction')=='rtl')if(b.ie8Compat)B-=w.getDocument().getDocumentElement().$.scrollLeft*2;else B-=T.$.scrollWidth-T.$.clientWidth;}var V=w.getFirst(),W;if(W=V.getCustomData('activePanel'))W.onHide&&W.onHide.call(this,1);V.setCustomData('activePanel',this);w.setStyles({top:C+'px',left:B+'px'});w.setOpacity(1);},this);u.isLoaded?E():u.onLoad=E;e.setTimeout(function(){x.$.contentWindow.focus();this.allowBlur(true);},0,this);},b.air?200:0,this);this.visible=1;if(this.onShow)this.onShow.call(this);n=0;},hide:function(p){var r=this;if(r.visible&&(!r.onHide||r.onHide.call(r)!==true)){r.hideChild();b.gecko&&r._.iframe.getFrameDocument().$.activeElement.blur();r.element.setStyle('display','none');r.visible=0;r.element.getFirst().removeCustomData('activePanel');var q=p!==false&&r._.returnFocus;if(q){if(b.webkit&&q.type)q.getWindow().$.focus();q.focus();}}},allowBlur:function(p){var q=this._.panel;if(p!=undefined)q.allowBlur=p;return q.allowBlur;},showAsChild:function(p,q,r,s,t,u){if(this._.activeChild==p&&p._.panel._.offsetParentId==r.getId())return;this.hideChild();p.onHide=e.bind(function(){e.setTimeout(function(){if(!this._.focused)this.hide();
-},0,this);},this);this._.activeChild=p;this._.focused=false;p.showBlock(q,r,s,t,u);if(b.ie7Compat||b.ie8&&b.ie6Compat)setTimeout(function(){p.element.getChild(0).$.style.cssText+='';},100);},hideChild:function(){var p=this._.activeChild;if(p){delete p.onHide;delete p._.returnFocus;delete this._.activeChild;p.hide();}}}});a.on('instanceDestroyed',function(){var p=e.isEmpty(a.instances);for(var q in m){var r=m[q];if(p)r.destroy();else r.element.hide();}p&&(m={});});})();j.add('menu',{beforeInit:function(m){var n=m.config.menu_groups.split(','),o=m._.menuGroups={},p=m._.menuItems={};for(var q=0;q<n.length;q++)o[n[q]]=q+1;m.addMenuGroup=function(r,s){o[r]=s||100;};m.addMenuItem=function(r,s){if(o[s.group])p[r]=new a.menuItem(this,r,s);};m.addMenuItems=function(r){for(var s in r)this.addMenuItem(s,r[s]);};m.getMenuItem=function(r){return p[r];};m.removeMenuItem=function(r){delete p[r];};},requires:['floatpanel']});(function(){a.menu=e.createClass({$:function(n,o){var r=this;o=r._.definition=o||{};r.id=e.getNextId();r.editor=n;r.items=[];r._.listeners=[];r._.level=o.level||1;var p=e.extend({},o.panel,{css:n.skin.editor.css,level:r._.level-1,block:{}}),q=p.block.attributes=p.attributes||{};!q.role&&(q.role='menu');r._.panelDefinition=p;},_:{onShow:function(){var v=this;var n=v.editor.getSelection();if(c)n&&n.lock();var o=n&&n.getStartElement(),p=v._.listeners,q=[];v.removeAll();for(var r=0;r<p.length;r++){var s=p[r](o,n);if(s)for(var t in s){var u=v.editor.getMenuItem(t);if(u&&(!u.command||v.editor.getCommand(u.command).state)){u.state=s[t];v.add(u);}}}},onClick:function(n){this.hide(false);if(n.onClick)n.onClick();else if(n.command)this.editor.execCommand(n.command);},onEscape:function(n){var o=this.parent;if(o){o._.panel.hideChild();var p=o._.panel._.panel._.currentBlock,q=p._.focusIndex;p._.markItem(q);}else if(n==27)this.hide();return false;},onHide:function(){var o=this;if(c&&!o.parent){var n=o.editor.getSelection();n&&n.unlock(true);}o.onHide&&o.onHide();},showSubMenu:function(n){var v=this;var o=v._.subMenu,p=v.items[n],q=p.getItems&&p.getItems();if(!q){v._.panel.hideChild();return;}var r=v._.panel.getBlock(v.id);r._.focusIndex=n;if(o)o.removeAll();else{o=v._.subMenu=new a.menu(v.editor,e.extend({},v._.definition,{level:v._.level+1},true));o.parent=v;o._.onClick=e.bind(v._.onClick,v);}for(var s in q){var t=v.editor.getMenuItem(s);if(t){t.state=q[s];o.add(t);}}var u=v._.panel.getBlock(v.id).element.getDocument().getById(v.id+String(n));o.show(u,2);}},proto:{add:function(n){if(!n.order)n.order=this.items.length;
-this.items.push(n);},removeAll:function(){this.items=[];},show:function(n,o,p,q){if(!this.parent){this._.onShow();if(!this.items.length)return;}o=o||(this.editor.lang.dir=='rtl'?2:1);var r=this.items,s=this.editor,t=this._.panel,u=this._.element;if(!t){t=this._.panel=new k.floatPanel(this.editor,a.document.getBody(),this._.panelDefinition,this._.level);t.onEscape=e.bind(function(F){if(this._.onEscape(F)===false)return false;},this);t.onHide=e.bind(function(){this._.onHide&&this._.onHide();},this);var v=t.addBlock(this.id,this._.panelDefinition.block);v.autoSize=true;var w=v.keys;w[40]='next';w[9]='next';w[38]='prev';w[2228224+9]='prev';w[s.lang.dir=='rtl'?37:39]=c?'mouseup':'click';w[32]=c?'mouseup':'click';c&&(w[13]='mouseup');u=this._.element=v.element;u.addClass(s.skinClass);var x=u.getDocument();x.getBody().setStyle('overflow','hidden');x.getElementsByTag('html').getItem(0).setStyle('overflow','hidden');this._.itemOverFn=e.addFunction(function(F){var G=this;clearTimeout(G._.showSubTimeout);G._.showSubTimeout=e.setTimeout(G._.showSubMenu,s.config.menu_subMenuDelay||400,G,[F]);},this);this._.itemOutFn=e.addFunction(function(F){clearTimeout(this._.showSubTimeout);},this);this._.itemClickFn=e.addFunction(function(F){var H=this;var G=H.items[F];if(G.state==0){H.hide();return;}if(G.getItems)H._.showSubMenu(F);else H._.onClick(G);},this);}m(r);var y=s.container.getChild(1),z=y.hasClass('cke_mixed_dir_content')?' cke_mixed_dir_content':'',A=['<div class="cke_menu'+z+'" role="presentation">'],B=r.length,C=B&&r[0].group;for(var D=0;D<B;D++){var E=r[D];if(C!=E.group){A.push('<div class="cke_menuseparator" role="separator"></div>');C=E.group;}E.render(this,D,A);}A.push('</div>');u.setHtml(A.join(''));k.fire('ready',this);if(this.parent)this.parent._.panel.showAsChild(t,this.id,n,o,p,q);else t.showBlock(this.id,n,o,p,q);s.fire('menuShow',[t]);},addListener:function(n){this._.listeners.push(n);},hide:function(n){var o=this;o._.onHide&&o._.onHide();o._.panel&&o._.panel.hide(n);}}});function m(n){n.sort(function(o,p){if(o.group<p.group)return-1;else if(o.group>p.group)return 1;return o.order<p.order?-1:o.order>p.order?1:0;});};a.menuItem=e.createClass({$:function(n,o,p){var q=this;e.extend(q,p,{order:0,className:'cke_button_'+o});q.group=n._.menuGroups[q.group];q.editor=n;q.name=o;},proto:{render:function(n,o,p){var w=this;var q=n.id+String(o),r=typeof w.state=='undefined'?2:w.state,s=' cke_'+(r==1?'on':r==0?'disabled':'off'),t=w.label;if(w.className)s+=' '+w.className;
-var u=w.getItems;p.push('<span class="cke_menuitem'+(w.icon&&w.icon.indexOf('.png')==-1?' cke_noalphafix':'')+'">'+'<a id="',q,'" class="',s,'" href="javascript:void(\'',(w.label||'').replace("'",''),'\')" title="',w.label,'" tabindex="-1"_cke_focus=1 hidefocus="true" role="menuitem"'+(u?'aria-haspopup="true"':'')+(r==0?'aria-disabled="true"':'')+(r==1?'aria-pressed="true"':''));if(b.opera||b.gecko&&b.mac)p.push(' onkeypress="return false;"');if(b.gecko)p.push(' onblur="this.style.cssText = this.style.cssText;"');var v=(w.iconOffset||0)*-16;p.push(' onmouseover="CKEDITOR.tools.callFunction(',n._.itemOverFn,',',o,');" onmouseout="CKEDITOR.tools.callFunction(',n._.itemOutFn,',',o,');" '+(c?'onclick="return false;" onmouseup':'onclick')+'="CKEDITOR.tools.callFunction(',n._.itemClickFn,',',o,'); return false;"><span class="cke_icon_wrapper"><span class="cke_icon"'+(w.icon?' style="background-image:url('+a.getUrl(w.icon)+');background-position:0 '+v+'px;"':'')+'></span></span>'+'<span class="cke_label">');if(u)p.push('<span class="cke_menuarrow">','<span>&#',w.editor.lang.dir=='rtl'?'9668':'9658',';</span>','</span>');p.push(t,'</span></a></span>');}}});})();i.menu_groups='clipboard,form,tablecell,tablecellproperties,tablerow,tablecolumn,table,anchor,link,image,flash,checkbox,radio,textfield,hiddenfield,imagebutton,button,select,textarea,div';(function(){var m;j.add('editingblock',{init:function(n){if(!n.config.editingBlock)return;n.on('themeSpace',function(o){if(o.data.space=='contents')o.data.html+='<br>';});n.on('themeLoaded',function(){n.fireOnce('editingBlockReady');});n.on('uiReady',function(){n.setMode(n.config.startupMode);});n.on('afterSetData',function(){if(!m){function o(){m=true;n.getMode().loadData(n.getData());m=false;};if(n.mode)o();else n.on('mode',function(){if(n.mode){o();n.removeListener('mode',arguments.callee);}});}});n.on('beforeGetData',function(){if(!m&&n.mode){m=true;n.setData(n.getMode().getData(),null,1);m=false;}});n.on('getSnapshot',function(o){if(n.mode)o.data=n.getMode().getSnapshotData();});n.on('loadSnapshot',function(o){if(n.mode)n.getMode().loadSnapshotData(o.data);});n.on('mode',function(o){o.removeListener();b.webkit&&n.container.on('focus',function(){n.focus();});if(n.config.startupFocus)n.focus();setTimeout(function(){n.fireOnce('instanceReady');a.fire('instanceReady',null,n);},0);});n.on('destroy',function(){var o=this;if(o.mode)o._.modes[o.mode].unload(o.getThemeSpace('contents'));});}});a.editor.prototype.mode='';a.editor.prototype.addMode=function(n,o){o.name=n;
-(this._.modes||(this._.modes={}))[n]=o;};a.editor.prototype.setMode=function(n){this.fire('beforeSetMode',{newMode:n});var o,p=this.getThemeSpace('contents'),q=this.checkDirty();if(this.mode){if(n==this.mode)return;this._.previousMode=this.mode;this.fire('beforeModeUnload');var r=this.getMode();o=r.getData();r.unload(p);this.mode='';}p.setHtml('');var s=this.getMode(n);if(!s)throw '[CKEDITOR.editor.setMode] Unknown mode "'+n+'".';if(!q)this.on('mode',function(){this.resetDirty();this.removeListener('mode',arguments.callee);});s.load(p,typeof o!='string'?this.getData():o);};a.editor.prototype.getMode=function(n){return this._.modes&&this._.modes[n||this.mode];};a.editor.prototype.focus=function(){this.forceNextSelectionCheck();var n=this.getMode();if(n)n.focus();};})();i.startupMode='wysiwyg';i.editingBlock=true;(function(){function m(){var C=this;try{var z=C.getSelection();if(!z||!z.document.getWindow().$)return;var A=z.getStartElement(),B=new d.elementPath(A);if(!B.compare(C._.selectionPreviousPath)){C._.selectionPreviousPath=B;C.fire('selectionChange',{selection:z,path:B,element:A});}}catch(D){}};var n,o;function p(){o=true;if(n)return;q.call(this);n=e.setTimeout(q,200,this);};function q(){n=null;if(o){e.setTimeout(m,0,this);o=false;}};function r(z){function A(E){return E&&E.type==1&&E.getName() in f.$removeEmpty;};function B(E){var F=z.document.getBody();return!E.is('body')&&F.getChildCount()==1;};var C=z.startContainer,D=z.startOffset;if(C.type==3)return false;return!e.trim(C.getHtml())?A(C)||B(C):A(C.getChild(D-1))||A(C.getChild(D));};var s={modes:{wysiwyg:1,source:1},readOnly:c||b.webkit,exec:function(z){switch(z.mode){case 'wysiwyg':z.document.$.execCommand('SelectAll',false,null);z.forceNextSelectionCheck();z.selectionChange();break;case 'source':var A=z.textarea.$;if(c)A.createTextRange().execCommand('SelectAll');else{A.selectionStart=0;A.selectionEnd=A.value.length;}A.focus();}},canUndo:false};function t(z){w(z);var A=z.createText('');z.setCustomData('cke-fillingChar',A);return A;};function u(z){return z&&z.getCustomData('cke-fillingChar');};function v(z){var A=z&&u(z);if(A)if(A.getCustomData('ready'))w(z);else A.setCustomData('ready',1);};function w(z){var A=z&&z.removeCustomData('cke-fillingChar');if(A){var B,C=z.getSelection().getNative(),D=C&&C.type!='None'&&C.getRangeAt(0);if(A.getLength()>1&&D&&D.intersectsNode(A.$)){B=[C.anchorOffset,C.focusOffset];var E=C.anchorNode==A.$&&C.anchorOffset>0,F=C.focusNode==A.$&&C.focusOffset>0;E&&B[0]--;F&&B[1]--;
-x(C)&&B.unshift(B.pop());}A.setText(A.getText().replace(/\u200B/g,''));if(B){var G=C.getRangeAt(0);G.setStart(G.startContainer,B[0]);G.setEnd(G.startContainer,B[1]);C.removeAllRanges();C.addRange(G);}}};function x(z){if(!z.isCollapsed){var A=z.getRangeAt(0);A.setStart(z.anchorNode,z.anchorOffset);A.setEnd(z.focusNode,z.focusOffset);return A.collapsed;}};j.add('selection',{init:function(z){if(b.webkit){z.on('selectionChange',function(){v(z.document);});z.on('beforeSetMode',function(){w(z.document);});var A,B;function C(){var E=z.document,F=u(E);if(F){var G=E.$.defaultView.getSelection();if(G.type=='Caret'&&G.anchorNode==F.$)B=1;A=F.getText();F.setText(A.replace(/\u200B/g,''));}};function D(){var E=z.document,F=u(E);if(F){F.setText(A);if(B){E.$.defaultView.getSelection().setPosition(F.$,F.getLength());B=0;}}};z.on('beforeUndoImage',C);z.on('afterUndoImage',D);z.on('beforeGetData',C,null,null,0);z.on('getData',D);}z.on('contentDom',function(){var E=z.document,F=E.getBody(),G=E.getDocumentElement();if(c){var H,I,J=1;F.on('focusin',function(O){if(O.data.$.srcElement.nodeName!='BODY')return;var P=E.getCustomData('cke_locked_selection');if(P){P.unlock(1);P.lock();}else if(H&&J){try{H.select();}catch(Q){}H=null;}});F.on('focus',function(){I=1;N();});F.on('beforedeactivate',function(O){if(O.data.$.toElement)return;I=0;J=1;});c&&z.on('blur',function(){try{E.$.selection.empty();}catch(O){}});G.on('mousedown',function(){J=0;});G.on('mouseup',function(){J=1;});var K;F.on('mousedown',function(O){if(O.data.$.button==2){var P=z.document.$.selection;if(P.type=='None')K=z.window.getScrollPosition();}M();});F.on('mouseup',function(O){if(O.data.$.button==2&&K){z.document.$.documentElement.scrollLeft=K.x;z.document.$.documentElement.scrollTop=K.y;}K=null;I=1;setTimeout(function(){N(true);},0);});F.on('keydown',M);F.on('keyup',function(){I=1;N();});if((b.ie7Compat||b.ie6Compat)&&E.$.compatMode!='BackCompat'){function L(O,P,Q){try{O.moveToPoint(P,Q);}catch(R){}};G.on('mousedown',function(O){function P(R){R=R.data.$;if(Q){var S=F.$.createTextRange();L(S,R.x,R.y);Q.setEndPoint(Q.compareEndPoints('StartToStart',S)<0?'EndToEnd':'StartToStart',S);Q.select();}};O=O.data.$;if(O.y<G.$.clientHeight&&O.y>F.$.offsetTop+F.$.clientHeight&&O.x<G.$.clientWidth){var Q=F.$.createTextRange();L(Q,O.x,O.y);G.on('mousemove',P);G.on('mouseup',function(R){G.removeListener('mousemove',P);R.removeListener();Q.select();});}});}if(b.ie8)G.on('mouseup',function(O){if(O.data.getTarget().getName()=='html'){var P=a.document.$.selection,Q=P.createRange();
-if(P.type!='None'&&Q.parentElement().ownerDocument==E.$)Q.select();}});E.on('selectionchange',N);function M(){I=0;};function N(O){if(I){var P=z.document,Q=z.getSelection(),R=Q&&Q.getNative();if(O&&R&&R.type=='None')if(!P.$.queryCommandEnabled('InsertImage')){e.setTimeout(N,50,this,true);return;}var S;if(R&&R.type&&R.type!='Control'&&(S=R.createRange())&&(S=S.parentElement())&&(S=S.nodeName)&&S.toLowerCase() in {input:1,textarea:1})return;H=R&&Q.getRanges()[0];p.call(z);}};}else{E.on('mouseup',p,z);E.on('keyup',p,z);E.on('selectionchange',p,z);}if(b.webkit)E.on('keydown',function(O){var P=O.data.getKey();switch(P){case 13:case 33:case 34:case 35:case 36:case 37:case 39:case 8:case 45:case 46:w(z.document);}},null,null,10);});z.on('contentDomUnload',z.forceNextSelectionCheck,z);z.addCommand('selectAll',s);z.ui.addButton('SelectAll',{label:z.lang.selectAll,command:'selectAll'});z.selectionChange=function(E){(E?m:p).call(this);};b.ie9Compat&&z.on('destroy',function(){var E=z.getSelection();E&&E.getNative().clear();},null,null,9);}});a.editor.prototype.getSelection=function(){return this.document&&this.document.getSelection();};a.editor.prototype.forceNextSelectionCheck=function(){delete this._.selectionPreviousPath;};g.prototype.getSelection=function(){var z=new d.selection(this);return!z||z.isInvalid?null:z;};a.SELECTION_NONE=1;a.SELECTION_TEXT=2;a.SELECTION_ELEMENT=3;d.selection=function(z){var C=this;var A=z.getCustomData('cke_locked_selection');if(A)return A;C.document=z;C.isLocked=0;C._={cache:{}};if(c)try{var B=C.getNative().createRange();if(!B||B.item&&B.item(0).ownerDocument!=C.document.$||B.parentElement&&B.parentElement().ownerDocument!=C.document.$)throw 0;}catch(D){C.isInvalid=true;}return C;};var y={img:1,hr:1,li:1,table:1,tr:1,td:1,th:1,embed:1,object:1,ol:1,ul:1,a:1,input:1,form:1,select:1,textarea:1,button:1,fieldset:1,thead:1,tfoot:1};d.selection.prototype={getNative:c?function(){return this._.cache.nativeSel||(this._.cache.nativeSel=this.document.$.selection);}:function(){return this._.cache.nativeSel||(this._.cache.nativeSel=this.document.getWindow().$.getSelection());},getType:c?function(){var z=this._.cache;if(z.type)return z.type;var A=1;try{var B=this.getNative(),C=B.type;if(C=='Text')A=2;if(C=='Control')A=3;if(B.createRange().parentElement)A=2;}catch(D){}return z.type=A;}:function(){var z=this._.cache;if(z.type)return z.type;var A=2,B=this.getNative();if(!B)A=1;else if(B.rangeCount==1){var C=B.getRangeAt(0),D=C.startContainer;if(D==C.endContainer&&D.nodeType==1&&C.endOffset-C.startOffset==1&&y[D.childNodes[C.startOffset].nodeName.toLowerCase()])A=3;
-}return z.type=A;},getRanges:(function(){var z=c?(function(){function A(C){return new d.node(C).getIndex();};var B=function(C,D){C=C.duplicate();C.collapse(D);var E=C.parentElement(),F=E.ownerDocument;if(!E.hasChildNodes())return{container:E,offset:0};var G=E.children,H,I,J=C.duplicate(),K=0,L=G.length-1,M=-1,N,O,P;while(K<=L){M=Math.floor((K+L)/2);H=G[M];J.moveToElementText(H);N=J.compareEndPoints('StartToStart',C);if(N>0)L=M-1;else if(N<0)K=M+1;else if(b.ie9Compat&&H.tagName=='BR'){var Q=F.defaultView.getSelection();return{container:Q[D?'anchorNode':'focusNode'],offset:Q[D?'anchorOffset':'focusOffset']};}else return{container:E,offset:A(H)};}if(M==-1||M==G.length-1&&N<0){J.moveToElementText(E);J.setEndPoint('StartToStart',C);O=J.text.replace(/(\r\n|\r)/g,'\n').length;G=E.childNodes;if(!O){H=G[G.length-1];if(H.nodeType!=3)return{container:E,offset:G.length};else return{container:H,offset:H.nodeValue.length};}var R=G.length;while(O>0&&R>0){I=G[--R];if(I.nodeType==3){P=I;O-=I.nodeValue.length;}}return{container:P,offset:-O};}else{J.collapse(N>0?true:false);J.setEndPoint(N>0?'StartToStart':'EndToStart',C);O=J.text.replace(/(\r\n|\r)/g,'\n').length;if(!O)return{container:E,offset:A(H)+(N>0?0:1)};while(O>0)try{I=H[N>0?'previousSibling':'nextSibling'];if(I.nodeType==3){O-=I.nodeValue.length;P=I;}H=I;}catch(S){return{container:E,offset:A(H)};}return{container:P,offset:N>0?-O:P.nodeValue.length+O};}};return function(){var M=this;var C=M.getNative(),D=C&&C.createRange(),E=M.getType(),F;if(!C)return[];if(E==2){F=new d.range(M.document);var G=B(D,true);F.setStart(new d.node(G.container),G.offset);G=B(D);F.setEnd(new d.node(G.container),G.offset);if(F.endContainer.getPosition(F.startContainer)&4&&F.endOffset<=F.startContainer.getIndex())F.collapse();return[F];}else if(E==3){var H=[];for(var I=0;I<D.length;I++){var J=D.item(I),K=J.parentNode,L=0;F=new d.range(M.document);for(;L<K.childNodes.length&&K.childNodes[L]!=J;L++){}F.setStart(new d.node(K),L);F.setEnd(new d.node(K),L+1);H.push(F);}return H;}return[];};})():function(){var A=[],B,C=this.document,D=this.getNative();if(!D)return A;if(!D.rangeCount){B=new d.range(C);B.moveToElementEditStart(C.getBody());A.push(B);}for(var E=0;E<D.rangeCount;E++){var F=D.getRangeAt(E);B=new d.range(C);B.setStart(new d.node(F.startContainer),F.startOffset);B.setEnd(new d.node(F.endContainer),F.endOffset);A.push(B);}return A;};return function(A){var B=this._.cache;if(B.ranges&&!A)return B.ranges;else if(!B.ranges)B.ranges=new d.rangeList(z.call(this));
-if(A){var C=B.ranges;for(var D=0;D<C.length;D++){var E=C[D],F=E.getCommonAncestor();if(F.isReadOnly())C.splice(D,1);if(E.collapsed)continue;if(E.startContainer.isReadOnly()){var G=E.startContainer;while(G){if(G.is('body')||!G.isReadOnly())break;if(G.type==1&&G.getAttribute('contentEditable')=='false')E.setStartAfter(G);G=G.getParent();}}var H=E.startContainer,I=E.endContainer,J=E.startOffset,K=E.endOffset,L=E.clone();if(H&&H.type==3)if(J>=H.getLength())L.setStartAfter(H);else L.setStartBefore(H);if(I&&I.type==3)if(!K)L.setEndBefore(I);else L.setEndAfter(I);var M=new d.walker(L);M.evaluator=function(N){if(N.type==1&&N.isReadOnly()){var O=E.clone();E.setEndBefore(N);if(E.collapsed)C.splice(D--,1);if(!(N.getPosition(L.endContainer)&16)){O.setStartAfter(N);if(!O.collapsed)C.splice(D+1,0,O);}return true;}return false;};M.next();}}return B.ranges;};})(),getStartElement:function(){var G=this;var z=G._.cache;if(z.startElement!==undefined)return z.startElement;var A,B=G.getNative();switch(G.getType()){case 3:return G.getSelectedElement();case 2:var C=G.getRanges()[0];if(C){if(!C.collapsed){C.optimize();while(1){var D=C.startContainer,E=C.startOffset;if(E==(D.getChildCount?D.getChildCount():D.getLength())&&!D.isBlockBoundary())C.setStartAfter(D);else break;}A=C.startContainer;if(A.type!=1)return A.getParent();A=A.getChild(C.startOffset);if(!A||A.type!=1)A=C.startContainer;else{var F=A.getFirst();while(F&&F.type==1){A=F;F=F.getFirst();}}}else{A=C.startContainer;if(A.type!=1)A=A.getParent();}A=A.$;}}return z.startElement=A?new h(A):null;},getSelectedElement:function(){var z=this._.cache;if(z.selectedElement!==undefined)return z.selectedElement;var A=this,B=e.tryThese(function(){return A.getNative().createRange().item(0);},function(){var C,D,E=A.getRanges()[0],F=E.getCommonAncestor(1,1),G={table:1,ul:1,ol:1,dl:1};for(var H in G){if(C=F.getAscendant(H,1))break;}if(C){var I=new d.range(this.document);I.setStartAt(C,1);I.setEnd(E.startContainer,E.startOffset);var J=e.extend(G,f.$listItem,f.$tableContent),K=new d.walker(I),L=function(M,N){return function(O,P){if(O.type==3&&(!e.trim(O.getText())||O.getParent().data('cke-bookmark')))return true;var Q;if(O.type==1){Q=O.getName();if(Q=='br'&&N&&O.equals(O.getParent().getBogus()))return true;if(P&&Q in J||Q in f.$removeEmpty)return true;}M.halted=1;return false;};};K.guard=L(K);if(K.checkBackward()&&!K.halted){K=new d.walker(I);I.setStart(E.endContainer,E.endOffset);I.setEndAt(C,2);K.guard=L(K,1);if(K.checkForward()&&!K.halted)D=C.$;
-}}if(!D)throw 0;return D;},function(){var C=A.getRanges()[0],D,E;for(var F=2;F&&!((D=C.getEnclosedNode())&&D.type==1&&y[D.getName()]&&(E=D));F--)C.shrink(1);return E.$;});return z.selectedElement=B?new h(B):null;},getSelectedText:function(){var z=this._.cache;if(z.selectedText!==undefined)return z.selectedText;var A='',B=this.getNative();if(this.getType()==2)A=c?B.createRange().text:B.toString();return z.selectedText=A;},lock:function(){var z=this;z.getRanges();z.getStartElement();z.getSelectedElement();z.getSelectedText();z._.cache.nativeSel={};z.isLocked=1;z.document.setCustomData('cke_locked_selection',z);},unlock:function(z){var E=this;var A=E.document,B=A.getCustomData('cke_locked_selection');if(B){A.setCustomData('cke_locked_selection',null);if(z){var C=B.getSelectedElement(),D=!C&&B.getRanges();E.isLocked=0;E.reset();if(C)E.selectElement(C);else E.selectRanges(D);}}if(!B||!z){E.isLocked=0;E.reset();}},reset:function(){this._.cache={};},selectElement:function(z){var B=this;if(B.isLocked){var A=new d.range(B.document);A.setStartBefore(z);A.setEndAfter(z);B._.cache.selectedElement=z;B._.cache.startElement=z;B._.cache.ranges=new d.rangeList(A);B._.cache.type=3;return;}A=new d.range(z.getDocument());A.setStartBefore(z);A.setEndAfter(z);A.select();B.document.fire('selectionchange');B.reset();},selectRanges:function(z){var N=this;if(N.isLocked){N._.cache.selectedElement=null;N._.cache.startElement=z[0]&&z[0].getTouchedStartNode();N._.cache.ranges=new d.rangeList(z);N._.cache.type=2;return;}if(c){if(z.length>1){var A=z[z.length-1];z[0].setEnd(A.endContainer,A.endOffset);z.length=1;}if(z[0])z[0].select();N.reset();}else{var B=N.getNative();if(!B)return;if(z.length){B.removeAllRanges();b.webkit&&w(N.document);}for(var C=0;C<z.length;C++){if(C<z.length-1){var D=z[C],E=z[C+1],F=D.clone();F.setStart(D.endContainer,D.endOffset);F.setEnd(E.startContainer,E.startOffset);if(!F.collapsed){F.shrink(1,true);var G=F.getCommonAncestor(),H=F.getEnclosedNode();if(G.isReadOnly()||H&&H.isReadOnly()){E.setStart(D.startContainer,D.startOffset);z.splice(C--,1);continue;}}}var I=z[C],J=N.document.$.createRange(),K=I.startContainer;if(I.collapsed&&(b.opera||b.gecko&&b.version<10900)&&K.type==1&&!K.getChildCount())K.appendText('');if(I.collapsed&&b.webkit&&r(I)){var L=t(N.document);I.insertNode(L);var M=L.getNext();if(M&&!L.getPrevious()&&M.type==1&&M.getName()=='br'){w(N.document);I.moveToPosition(M,3);}else I.moveToPosition(L,4);}J.setStart(I.startContainer.$,I.startOffset);try{J.setEnd(I.endContainer.$,I.endOffset);
-}catch(O){if(O.toString().indexOf('NS_ERROR_ILLEGAL_VALUE')>=0){I.collapse(1);J.setEnd(I.endContainer.$,I.endOffset);}else throw O;}B.addRange(J);}N.document.fire('selectionchange');N.reset();}},createBookmarks:function(z){return this.getRanges().createBookmarks(z);},createBookmarks2:function(z){return this.getRanges().createBookmarks2(z);},selectBookmarks:function(z){var A=[];for(var B=0;B<z.length;B++){var C=new d.range(this.document);C.moveToBookmark(z[B]);A.push(C);}this.selectRanges(A);return this;},getCommonAncestor:function(){var z=this.getRanges(),A=z[0].startContainer,B=z[z.length-1].endContainer;return A.getCommonAncestor(B);},scrollIntoView:function(){var z=this.getStartElement();z.scrollIntoView();}};})();(function(){var m=d.walker.whitespaces(true),n=/\ufeff|\u00a0/,o={table:1,tbody:1,tr:1};d.range.prototype.select=c?function(p){var A=this;var q=A.collapsed,r,s,t,u=A.getEnclosedNode();if(u)try{t=A.document.$.body.createControlRange();t.addElement(u.$);t.select();return;}catch(B){}if(A.startContainer.type==1&&A.startContainer.getName() in o||A.endContainer.type==1&&A.endContainer.getName() in o)A.shrink(1,true);var v=A.createBookmark(),w=v.startNode,x;if(!q)x=v.endNode;t=A.document.$.body.createTextRange();t.moveToElementText(w.$);t.moveStart('character',1);if(x){var y=A.document.$.body.createTextRange();y.moveToElementText(x.$);t.setEndPoint('EndToEnd',y);t.moveEnd('character',-1);}else{var z=w.getNext(m);r=!(z&&z.getText&&z.getText().match(n))&&(p||!w.hasPrevious()||w.getPrevious().is&&w.getPrevious().is('br'));s=A.document.createElement('span');s.setHtml('');s.insertBefore(w);if(r)A.document.createText('\ufeff').insertBefore(w);}A.setStartBefore(w);w.remove();if(q){if(r){t.moveStart('character',-1);t.select();A.document.$.selection.clear();}else t.select();A.moveToPosition(s,3);s.remove();}else{A.setEndBefore(x);x.remove();t.select();}A.document.fire('selectionchange');}:function(){this.document.getSelection().selectRanges([this]);};})();(function(){var m=a.htmlParser.cssStyle,n=e.cssLength,o=/^((?:\d*(?:\.\d+))|(?:\d+))(.*)?$/i;function p(r,s){var t=o.exec(r),u=o.exec(s);if(t){if(!t[2]&&u[2]=='px')return u[1];if(t[2]=='px'&&!u[2])return u[1]+'px';}return s;};var q={elements:{$:function(r){var s=r.attributes,t=s&&s['data-cke-realelement'],u=t&&new a.htmlParser.fragment.fromHtml(decodeURIComponent(t)),v=u&&u.children[0];if(v&&r.attributes['data-cke-resizable']){var w=new m(r).rules,x=v.attributes,y=w.width,z=w.height;y&&(x.width=p(x.width,y));
-z&&(x.height=p(x.height,z));}return v;}}};j.add('fakeobjects',{requires:['htmlwriter'],afterInit:function(r){var s=r.dataProcessor,t=s&&s.htmlFilter;if(t)t.addRules(q);}});a.editor.prototype.createFakeElement=function(r,s,t,u){var v=this.lang.fakeobjects,w=v[t]||v.unknown,x={'class':s,'data-cke-realelement':encodeURIComponent(r.getOuterHtml()),'data-cke-real-node-type':r.type,alt:w,title:w,align:r.getAttribute('align')||''};if(!b.hc)x.src=a.getUrl('images/spacer.gif');if(t)x['data-cke-real-element-type']=t;if(u){x['data-cke-resizable']=u;var y=new m(),z=r.getAttribute('width'),A=r.getAttribute('height');z&&(y.rules.width=n(z));A&&(y.rules.height=n(A));y.populate(x);}return this.document.createElement('img',{attributes:x});};a.editor.prototype.createFakeParserElement=function(r,s,t,u){var v=this.lang.fakeobjects,w=v[t]||v.unknown,x,y=new a.htmlParser.basicWriter();r.writeHtml(y);x=y.getHtml();var z={'class':s,'data-cke-realelement':encodeURIComponent(x),'data-cke-real-node-type':r.type,alt:w,title:w,align:r.attributes.align||''};if(!b.hc)z.src=a.getUrl('images/spacer.gif');if(t)z['data-cke-real-element-type']=t;if(u){z['data-cke-resizable']=u;var A=r.attributes,B=new m(),C=A.width,D=A.height;C!=undefined&&(B.rules.width=n(C));D!=undefined&&(B.rules.height=n(D));B.populate(z);}return new a.htmlParser.element('img',z);};a.editor.prototype.restoreRealElement=function(r){if(r.data('cke-real-node-type')!=1)return null;var s=h.createFromHtml(decodeURIComponent(r.data('cke-realelement')),this.document);if(r.data('cke-resizable')){var t=r.getStyle('width'),u=r.getStyle('height');t&&s.setAttribute('width',p(s.getAttribute('width'),t));u&&s.setAttribute('height',p(s.getAttribute('height'),u));}return s;};})();j.add('richcombo',{requires:['floatpanel','listblock','button'],beforeInit:function(m){m.ui.addHandler('richcombo',k.richCombo.handler);}});a.UI_RICHCOMBO='richcombo';k.richCombo=e.createClass({$:function(m){var o=this;e.extend(o,m,{title:m.label,modes:{wysiwyg:1}});var n=o.panel||{};delete o.panel;o.id=e.getNextNumber();o.document=n&&n.parent&&n.parent.getDocument()||a.document;n.className=(n.className||'')+' cke_rcombopanel';n.block={multiSelect:n.multiSelect,attributes:n.attributes};o._={panelDefinition:n,items:{},state:2};},statics:{handler:{create:function(m){return new k.richCombo(m);}}},proto:{renderHtml:function(m){var n=[];this.render(m,n);return n.join('');},render:function(m,n){var o=b,p='cke_'+this.id,q=e.addFunction(function(v){var y=this;var w=y._;if(w.state==0)return;
-y.createPanel(m);if(w.on){w.panel.hide();return;}y.commit();var x=y.getValue();if(x)w.list.mark(x);else w.list.unmarkAll();w.panel.showBlock(y.id,new h(v),4);},this),r={id:p,combo:this,focus:function(){var v=a.document.getById(p).getChild(1);v.focus();},clickFn:q};function s(){var w=this;var v=w.modes[m.mode]?2:0;w.setState(m.readOnly&&!w.readOnly?0:v);w.setValue('');};m.on('mode',s,this);!this.readOnly&&m.on('readOnly',s,this);var t=e.addFunction(function(v,w){v=new d.event(v);var x=v.getKeystroke();switch(x){case 13:case 32:case 40:e.callFunction(q,w);break;default:r.onkey(r,x);}v.preventDefault();}),u=e.addFunction(function(){r.onfocus&&r.onfocus();});r.keyDownFn=t;n.push('<span class="cke_rcombo" role="presentation">','<span id=',p);if(this.className)n.push(' class="',this.className,' cke_off"');n.push(' role="presentation">','<span id="'+p+'_label" class=cke_label>',this.label,'</span>','<a hidefocus=true title="',this.title,'" tabindex="-1"',o.gecko&&o.version>=10900&&!o.hc?'':" href=\"javascript:void('"+this.label+"')\"",' role="button" aria-labelledby="',p,'_label" aria-describedby="',p,'_text" aria-haspopup="true"');if(b.opera||b.gecko&&b.mac)n.push(' onkeypress="return false;"');if(b.gecko)n.push(' onblur="this.style.cssText = this.style.cssText;"');n.push(' onkeydown="CKEDITOR.tools.callFunction( ',t,', event, this );" onfocus="return CKEDITOR.tools.callFunction(',u,', event);" '+(c?'onclick="return false;" onmouseup':'onclick')+'="CKEDITOR.tools.callFunction(',q,', this); return false;"><span><span id="'+p+'_text" class="cke_text cke_inline_label">'+this.label+'</span>'+'</span>'+'<span class=cke_openbutton><span class=cke_icon>'+(b.hc?'▼':b.air?' ':'')+'</span></span>'+'</a>'+'</span>'+'</span>');if(this.onRender)this.onRender();return r;},createPanel:function(m){if(this._.panel)return;var n=this._.panelDefinition,o=this._.panelDefinition.block,p=n.parent||a.document.getBody(),q=new k.floatPanel(m,p,n),r=q.addListBlock(this.id,o),s=this;q.onShow=function(){if(s.className)this.element.getFirst().addClass(s.className+'_panel');s.setState(1);r.focus(!s.multiSelect&&s.getValue());s._.on=1;if(s.onOpen)s.onOpen();};q.onHide=function(t){if(s.className)this.element.getFirst().removeClass(s.className+'_panel');s.setState(s.modes&&s.modes[m.mode]?2:0);s._.on=0;if(!t&&s.onClose)s.onClose();};q.onEscape=function(){q.hide();};r.onClick=function(t,u){s.document.getWindow().focus();if(s.onClick)s.onClick.call(s,t,u);if(u)s.setValue(t,s._.items[t]);
-else s.setValue('');q.hide(false);};this._.panel=q;this._.list=r;q.getBlock(this.id).onHide=function(){s._.on=0;s.setState(2);};if(this.init)this.init();},setValue:function(m,n){var p=this;p._.value=m;var o=p.document.getById('cke_'+p.id+'_text');if(o){if(!(m||n)){n=p.label;o.addClass('cke_inline_label');}else o.removeClass('cke_inline_label');o.setHtml(typeof n!='undefined'?n:m);}},getValue:function(){return this._.value||'';},unmarkAll:function(){this._.list.unmarkAll();},mark:function(m){this._.list.mark(m);},hideItem:function(m){this._.list.hideItem(m);},hideGroup:function(m){this._.list.hideGroup(m);},showAll:function(){this._.list.showAll();},add:function(m,n,o){this._.items[m]=o||m;this._.list.add(m,n,o);},startGroup:function(m){this._.list.startGroup(m);},commit:function(){var m=this;if(!m._.committed){m._.list.commit();m._.committed=1;k.fire('ready',m);}m._.committed=1;},setState:function(m){var n=this;if(n._.state==m)return;n.document.getById('cke_'+n.id).setState(m);n._.state=m;}}});k.prototype.addRichCombo=function(m,n){this.add(m,'richcombo',n);};j.add('htmlwriter');a.htmlWriter=e.createClass({base:a.htmlParser.basicWriter,$:function(){var o=this;o.base();o.indentationChars='\t';o.selfClosingEnd=' />';o.lineBreakChars='\n';o.forceSimpleAmpersand=0;o.sortAttributes=1;o._.indent=0;o._.indentation='';o._.inPre=0;o._.rules={};var m=f;for(var n in e.extend({},m.$nonBodyContent,m.$block,m.$listItem,m.$tableContent))o.setRules(n,{indent:1,breakBeforeOpen:1,breakAfterOpen:1,breakBeforeClose:!m[n]['#'],breakAfterClose:1});o.setRules('br',{breakAfterOpen:1});o.setRules('title',{indent:0,breakAfterOpen:0});o.setRules('style',{indent:0,breakBeforeClose:1});o.setRules('pre',{indent:0});},proto:{openTag:function(m,n){var p=this;var o=p._.rules[m];if(p._.indent)p.indentation();else if(o&&o.breakBeforeOpen){p.lineBreak();p.indentation();}p._.output.push('<',m);},openTagClose:function(m,n){var p=this;var o=p._.rules[m];if(n)p._.output.push(p.selfClosingEnd);else{p._.output.push('>');if(o&&o.indent)p._.indentation+=p.indentationChars;}if(o&&o.breakAfterOpen)p.lineBreak();m=='pre'&&(p._.inPre=1);},attribute:function(m,n){if(typeof n=='string'){this.forceSimpleAmpersand&&(n=n.replace(/&/g,'&'));n=e.htmlEncodeAttr(n);}this._.output.push(' ',m,'="',n,'"');},closeTag:function(m){var o=this;var n=o._.rules[m];if(n&&n.indent)o._.indentation=o._.indentation.substr(o.indentationChars.length);if(o._.indent)o.indentation();else if(n&&n.breakBeforeClose){o.lineBreak();o.indentation();
-}o._.output.push('</',m,'>');m=='pre'&&(o._.inPre=0);if(n&&n.breakAfterClose)o.lineBreak();},text:function(m){var n=this;if(n._.indent){n.indentation();!n._.inPre&&(m=e.ltrim(m));}n._.output.push(m);},comment:function(m){if(this._.indent)this.indentation();this._.output.push('<!--',m,'-->');},lineBreak:function(){var m=this;if(!m._.inPre&&m._.output.length>0)m._.output.push(m.lineBreakChars);m._.indent=1;},indentation:function(){var m=this;if(!m._.inPre)m._.output.push(m._.indentation);m._.indent=0;},setRules:function(m,n){var o=this._.rules[m];if(o)e.extend(o,n,true);else this._.rules[m]=n;}}});j.add('menubutton',{requires:['button','menu'],beforeInit:function(m){m.ui.addHandler('menubutton',k.menuButton.handler);}});a.UI_MENUBUTTON='menubutton';(function(){var m=function(n){var o=this._;if(o.state===0)return;o.previousState=o.state;var p=o.menu;if(!p){p=o.menu=new a.menu(n,{panel:{className:n.skinClass+' cke_contextmenu',attributes:{'aria-label':n.lang.common.options}}});p.onHide=e.bind(function(){this.setState(this.modes&&this.modes[n.mode]?o.previousState:0);},this);if(this.onMenu)p.addListener(this.onMenu);}if(o.on){p.hide();return;}this.setState(1);p.show(a.document.getById(this._.id),4);};k.menuButton=e.createClass({base:k.button,$:function(n){var o=n.panel;delete n.panel;this.base(n);this.hasArrow=true;this.click=m;},statics:{handler:{create:function(n){return new k.menuButton(n);}}}});})();j.add('dialogui');(function(){var m=function(u){var x=this;x._||(x._={});x._['default']=x._.initValue=u['default']||'';x._.required=u.required||false;var v=[x._];for(var w=1;w<arguments.length;w++)v.push(arguments[w]);v.push(true);e.extend.apply(e,v);return x._;},n={build:function(u,v,w){return new k.dialog.textInput(u,v,w);}},o={build:function(u,v,w){return new k.dialog[v.type](u,v,w);}},p={build:function(u,v,w){var x=v.children,y,z=[],A=[];for(var B=0;B<x.length&&(y=x[B]);B++){var C=[];z.push(C);A.push(a.dialog._.uiElementBuilders[y.type].build(u,y,C));}return new k.dialog[v.type](u,A,z,w,v);}},q={isChanged:function(){return this.getValue()!=this.getInitValue();},reset:function(u){this.setValue(this.getInitValue(),u);},setInitValue:function(){this._.initValue=this.getValue();},resetInitValue:function(){this._.initValue=this._['default'];},getInitValue:function(){return this._.initValue;}},r=e.extend({},k.dialog.uiElement.prototype.eventProcessors,{onChange:function(u,v){if(!this._.domOnChangeRegistered){u.on('load',function(){this.getInputElement().on('change',function(){if(!u.parts.dialog.isVisible())return;
-this.fire('change',{value:this.getValue()});},this);},this);this._.domOnChangeRegistered=true;}this.on('change',v);}},true),s=/^on([A-Z]\w+)/,t=function(u){for(var v in u){if(s.test(v)||v=='title'||v=='type')delete u[v];}return u;};e.extend(k.dialog,{labeledElement:function(u,v,w,x){if(arguments.length<4)return;var y=m.call(this,v);y.labelId=e.getNextId()+'_label';var z=this._.children=[],A=function(){var B=[],C=v.required?' cke_required':'';if(v.labelLayout!='horizontal')B.push('<label class="cke_dialog_ui_labeled_label'+C+'" ',' id="'+y.labelId+'"',y.inputId?' for="'+y.inputId+'"':'',(v.labelStyle?' style="'+v.labelStyle+'"':'')+'>',v.label,'</label>','<div class="cke_dialog_ui_labeled_content"'+(v.controlStyle?' style="'+v.controlStyle+'"':'')+' role="presentation">',x.call(this,u,v),'</div>');else{var D={type:'hbox',widths:v.widths,padding:0,children:[{type:'html',html:'<label class="cke_dialog_ui_labeled_label'+C+'"'+' id="'+y.labelId+'"'+' for="'+y.inputId+'"'+(v.labelStyle?' style="'+v.labelStyle+'"':'')+'>'+e.htmlEncode(v.label)+'</span>'},{type:'html',html:'<span class="cke_dialog_ui_labeled_content"'+(v.controlStyle?' style="'+v.controlStyle+'"':'')+'>'+x.call(this,u,v)+'</span>'}]};a.dialog._.uiElementBuilders.hbox.build(u,D,B);}return B.join('');};k.dialog.uiElement.call(this,u,v,w,'div',null,{role:'presentation'},A);},textInput:function(u,v,w){if(arguments.length<3)return;m.call(this,v);var x=this._.inputId=e.getNextId()+'_textInput',y={'class':'cke_dialog_ui_input_'+v.type,id:x,type:v.type},z;if(v.validate)this.validate=v.validate;if(v.maxLength)y.maxlength=v.maxLength;if(v.size)y.size=v.size;if(v.inputStyle)y.style=v.inputStyle;var A=function(){var B=['<div class="cke_dialog_ui_input_',v.type,'" role="presentation"'];if(v.width)B.push('style="width:'+v.width+'" ');B.push('><input ');y['aria-labelledby']=this._.labelId;this._.required&&(y['aria-required']=this._.required);for(var C in y)B.push(C+'="'+y[C]+'" ');B.push(' /></div>');return B.join('');};k.dialog.labeledElement.call(this,u,v,w,A);},textarea:function(u,v,w){if(arguments.length<3)return;m.call(this,v);var x=this,y=this._.inputId=e.getNextId()+'_textarea',z={};if(v.validate)this.validate=v.validate;z.rows=v.rows||5;z.cols=v.cols||20;if(typeof v.inputStyle!='undefined')z.style=v.inputStyle;var A=function(){z['aria-labelledby']=this._.labelId;this._.required&&(z['aria-required']=this._.required);var B=['<div class="cke_dialog_ui_input_textarea" role="presentation"><textarea class="cke_dialog_ui_input_textarea" id="',y,'" '];
-for(var C in z)B.push(C+'="'+e.htmlEncode(z[C])+'" ');B.push('>',e.htmlEncode(x._['default']),'</textarea></div>');return B.join('');};k.dialog.labeledElement.call(this,u,v,w,A);},checkbox:function(u,v,w){if(arguments.length<3)return;var x=m.call(this,v,{'default':!!v['default']});if(v.validate)this.validate=v.validate;var y=function(){var z=e.extend({},v,{id:v.id?v.id+'_checkbox':e.getNextId()+'_checkbox'},true),A=[],B=e.getNextId()+'_label',C={'class':'cke_dialog_ui_checkbox_input',type:'checkbox','aria-labelledby':B};t(z);if(v['default'])C.checked='checked';if(typeof z.inputStyle!='undefined')z.style=z.inputStyle;x.checkbox=new k.dialog.uiElement(u,z,A,'input',null,C);A.push(' <label id="',B,'" for="',C.id,'"'+(v.labelStyle?' style="'+v.labelStyle+'"':'')+'>',e.htmlEncode(v.label),'</label>');return A.join('');};k.dialog.uiElement.call(this,u,v,w,'span',null,null,y);},radio:function(u,v,w){if(arguments.length<3)return;m.call(this,v);if(!this._['default'])this._['default']=this._.initValue=v.items[0][1];if(v.validate)this.validate=v.valdiate;var x=[],y=this,z=function(){var A=[],B=[],C={'class':'cke_dialog_ui_radio_item','aria-labelledby':this._.labelId},D=v.id?v.id+'_radio':e.getNextId()+'_radio';for(var E=0;E<v.items.length;E++){var F=v.items[E],G=F[2]!==undefined?F[2]:F[0],H=F[1]!==undefined?F[1]:F[0],I=e.getNextId()+'_radio_input',J=I+'_label',K=e.extend({},v,{id:I,title:null,type:null},true),L=e.extend({},K,{title:G},true),M={type:'radio','class':'cke_dialog_ui_radio_input',name:D,value:H,'aria-labelledby':J},N=[];if(y._['default']==H)M.checked='checked';t(K);t(L);if(typeof K.inputStyle!='undefined')K.style=K.inputStyle;x.push(new k.dialog.uiElement(u,K,N,'input',null,M));N.push(' ');new k.dialog.uiElement(u,L,N,'label',null,{id:J,'for':M.id},F[0]);A.push(N.join(''));}new k.dialog.hbox(u,x,A,B);return B.join('');};k.dialog.labeledElement.call(this,u,v,w,z);this._.children=x;},button:function(u,v,w){if(!arguments.length)return;if(typeof v=='function')v=v(u.getParentEditor());m.call(this,v,{disabled:v.disabled||false});a.event.implementOn(this);var x=this;u.on('load',function(A){var B=this.getElement();(function(){B.on('click',function(C){x.fire('click',{dialog:x.getDialog()});C.data.preventDefault();});B.on('keydown',function(C){if(C.data.getKeystroke() in {32:1}){x.click();C.data.preventDefault();}});})();B.unselectable();},this);var y=e.extend({},v);delete y.style;var z=e.getNextId()+'_label';k.dialog.uiElement.call(this,u,y,w,'a',null,{style:v.style,href:'javascript:void(0)',title:v.label,hidefocus:'true','class':v['class'],role:'button','aria-labelledby':z},'<span id="'+z+'" class="cke_dialog_ui_button">'+e.htmlEncode(v.label)+'</span>');
-},select:function(u,v,w){if(arguments.length<3)return;var x=m.call(this,v);if(v.validate)this.validate=v.validate;x.inputId=e.getNextId()+'_select';var y=function(){var z=e.extend({},v,{id:v.id?v.id+'_select':e.getNextId()+'_select'},true),A=[],B=[],C={id:x.inputId,'class':'cke_dialog_ui_input_select','aria-labelledby':this._.labelId};if(v.size!=undefined)C.size=v.size;if(v.multiple!=undefined)C.multiple=v.multiple;t(z);for(var D=0,E;D<v.items.length&&(E=v.items[D]);D++)B.push('<option value="',e.htmlEncode(E[1]!==undefined?E[1]:E[0]).replace(/"/g,'"'),'" /> ',e.htmlEncode(E[0]));if(typeof z.inputStyle!='undefined')z.style=z.inputStyle;x.select=new k.dialog.uiElement(u,z,A,'select',null,C,B.join(''));return A.join('');};k.dialog.labeledElement.call(this,u,v,w,y);},file:function(u,v,w){if(arguments.length<3)return;if(v['default']===undefined)v['default']='';var x=e.extend(m.call(this,v),{definition:v,buttons:[]});if(v.validate)this.validate=v.validate;var y=function(){x.frameId=e.getNextId()+'_fileInput';var z=b.isCustomDomain(),A=['<iframe frameborder="0" allowtransparency="0" class="cke_dialog_ui_input_file" role="presentation" id="',x.frameId,'" title="',v.label,'" src="javascript:void('];A.push(z?"(function(){document.open();document.domain='"+document.domain+"';"+'document.close();'+'})()':'0');A.push(')"></iframe>');return A.join('');};u.on('load',function(){var z=a.document.getById(x.frameId),A=z.getParent();A.addClass('cke_dialog_ui_input_file');});k.dialog.labeledElement.call(this,u,v,w,y);},fileButton:function(u,v,w){if(arguments.length<3)return;var x=m.call(this,v),y=this;if(v.validate)this.validate=v.validate;var z=e.extend({},v),A=z.onClick;z.className=(z.className?z.className+' ':'')+'cke_dialog_ui_button';z.onClick=function(B){var C=v['for'];if(!A||A.call(this,B)!==false){u.getContentElement(C[0],C[1]).submit();this.disable();}};u.on('load',function(){u.getContentElement(v['for'][0],v['for'][1])._.buttons.push(y);});k.dialog.button.call(this,u,z,w);},html:(function(){var u=/^\s*<[\w:]+\s+([^>]*)?>/,v=/^(\s*<[\w:]+(?:\s+[^>]*)?)((?:.|\r|\n)+)$/,w=/\/$/;return function(x,y,z){if(arguments.length<3)return;var A=[],B,C=y.html,D,E;if(C.charAt(0)!='<')C='<span>'+C+'</span>';var F=y.focus;if(F){var G=this.focus;this.focus=function(){G.call(this);typeof F=='function'&&F.call(this);this.fire('focus');};if(y.isFocusable){var H=this.isFocusable;this.isFocusable=H;}this.keyboardFocusable=true;}k.dialog.uiElement.call(this,x,y,A,'span',null,null,'');B=A.join('');
-D=B.match(u);E=C.match(v)||['','',''];if(w.test(E[1])){E[1]=E[1].slice(0,-1);E[2]='/'+E[2];}z.push([E[1],' ',D[1]||'',E[2]].join(''));};})(),fieldset:function(u,v,w,x,y){var z=y.label,A=function(){var B=[];z&&B.push('<legend'+(y.labelStyle?' style="'+y.labelStyle+'"':'')+'>'+z+'</legend>');for(var C=0;C<w.length;C++)B.push(w[C]);return B.join('');};this._={children:v};k.dialog.uiElement.call(this,u,y,x,'fieldset',null,null,A);}},true);k.dialog.html.prototype=new k.dialog.uiElement();k.dialog.labeledElement.prototype=e.extend(new k.dialog.uiElement(),{setLabel:function(u){var v=a.document.getById(this._.labelId);if(v.getChildCount()<1)new d.text(u,a.document).appendTo(v);else v.getChild(0).$.nodeValue=u;return this;},getLabel:function(){var u=a.document.getById(this._.labelId);if(!u||u.getChildCount()<1)return '';else return u.getChild(0).getText();},eventProcessors:r},true);k.dialog.button.prototype=e.extend(new k.dialog.uiElement(),{click:function(){var u=this;if(!u._.disabled)return u.fire('click',{dialog:u._.dialog});u.getElement().$.blur();return false;},enable:function(){this._.disabled=false;var u=this.getElement();u&&u.removeClass('cke_disabled');},disable:function(){this._.disabled=true;this.getElement().addClass('cke_disabled');},isVisible:function(){return this.getElement().getFirst().isVisible();},isEnabled:function(){return!this._.disabled;},eventProcessors:e.extend({},k.dialog.uiElement.prototype.eventProcessors,{onClick:function(u,v){this.on('click',function(){this.getElement().focus();v.apply(this,arguments);});}},true),accessKeyUp:function(){this.click();},accessKeyDown:function(){this.focus();},keyboardFocusable:true},true);k.dialog.textInput.prototype=e.extend(new k.dialog.labeledElement(),{getInputElement:function(){return a.document.getById(this._.inputId);},focus:function(){var u=this.selectParentTab();setTimeout(function(){var v=u.getInputElement();v&&v.$.focus();},0);},select:function(){var u=this.selectParentTab();setTimeout(function(){var v=u.getInputElement();if(v){v.$.focus();v.$.select();}},0);},accessKeyUp:function(){this.select();},setValue:function(u){!u&&(u='');return k.dialog.uiElement.prototype.setValue.apply(this,arguments);},keyboardFocusable:true},q,true);k.dialog.textarea.prototype=new k.dialog.textInput();k.dialog.select.prototype=e.extend(new k.dialog.labeledElement(),{getInputElement:function(){return this._.select.getElement();},add:function(u,v,w){var x=new h('option',this.getDialog().getParentEditor().document),y=this.getInputElement().$;
-x.$.text=u;x.$.value=v===undefined||v===null?u:v;if(w===undefined||w===null){if(c)y.add(x.$);else y.add(x.$,null);}else y.add(x.$,w);return this;},remove:function(u){var v=this.getInputElement().$;v.remove(u);return this;},clear:function(){var u=this.getInputElement().$;while(u.length>0)u.remove(0);return this;},keyboardFocusable:true},q,true);k.dialog.checkbox.prototype=e.extend(new k.dialog.uiElement(),{getInputElement:function(){return this._.checkbox.getElement();},setValue:function(u,v){this.getInputElement().$.checked=u;!v&&this.fire('change',{value:u});},getValue:function(){return this.getInputElement().$.checked;},accessKeyUp:function(){this.setValue(!this.getValue());},eventProcessors:{onChange:function(u,v){if(!c)return r.onChange.apply(this,arguments);else{u.on('load',function(){var w=this._.checkbox.getElement();w.on('propertychange',function(x){x=x.data.$;if(x.propertyName=='checked')this.fire('change',{value:w.$.checked});},this);},this);this.on('change',v);}return null;}},keyboardFocusable:true},q,true);k.dialog.radio.prototype=e.extend(new k.dialog.uiElement(),{setValue:function(u,v){var w=this._.children,x;for(var y=0;y<w.length&&(x=w[y]);y++)x.getElement().$.checked=x.getValue()==u;!v&&this.fire('change',{value:u});},getValue:function(){var u=this._.children;for(var v=0;v<u.length;v++){if(u[v].getElement().$.checked)return u[v].getValue();}return null;},accessKeyUp:function(){var u=this._.children,v;for(v=0;v<u.length;v++){if(u[v].getElement().$.checked){u[v].getElement().focus();return;}}u[0].getElement().focus();},eventProcessors:{onChange:function(u,v){if(!c)return r.onChange.apply(this,arguments);else{u.on('load',function(){var w=this._.children,x=this;for(var y=0;y<w.length;y++){var z=w[y].getElement();z.on('propertychange',function(A){A=A.data.$;if(A.propertyName=='checked'&&this.$.checked)x.fire('change',{value:this.getAttribute('value')});});}},this);this.on('change',v);}return null;}},keyboardFocusable:true},q,true);k.dialog.file.prototype=e.extend(new k.dialog.labeledElement(),q,{getInputElement:function(){var u=a.document.getById(this._.frameId).getFrameDocument();return u.$.forms.length>0?new h(u.$.forms[0].elements[0]):this.getElement();},submit:function(){this.getInputElement().getParent().$.submit();return this;},getAction:function(){return this.getInputElement().getParent().$.action;},registerEvents:function(u){var v=/^on([A-Z]\w+)/,w,x=function(z,A,B,C){z.on('formLoaded',function(){z.getInputElement().on(B,C,z);});};for(var y in u){if(!(w=y.match(v)))continue;
-if(this.eventProcessors[y])this.eventProcessors[y].call(this,this._.dialog,u[y]);else x(this,this._.dialog,w[1].toLowerCase(),u[y]);}return this;},reset:function(){var u=this._,v=a.document.getById(u.frameId),w=v.getFrameDocument(),x=u.definition,y=u.buttons,z=this.formLoadedNumber,A=this.formUnloadNumber,B=u.dialog._.editor.lang.dir,C=u.dialog._.editor.langCode;if(!z){z=this.formLoadedNumber=e.addFunction(function(){this.fire('formLoaded');},this);A=this.formUnloadNumber=e.addFunction(function(){this.getInputElement().clearCustomData();},this);this.getDialog()._.editor.on('destroy',function(){e.removeFunction(z);e.removeFunction(A);});}function D(){w.$.open();if(b.isCustomDomain())w.$.domain=document.domain;var E='';if(x.size)E=x.size-(c?7:0);var F=u.frameId+'_input';w.$.write(['<html dir="'+B+'" lang="'+C+'"><head><title></title></head><body style="margin: 0; overflow: hidden; background: transparent;">','<form enctype="multipart/form-data" method="POST" dir="'+B+'" lang="'+C+'" action="',e.htmlEncode(x.action),'">','<label id="',u.labelId,'" for="',F,'" style="display:none">',e.htmlEncode(x.label),'</label>','<input id="',F,'" aria-labelledby="',u.labelId,'" type="file" name="',e.htmlEncode(x.id||'cke_upload'),'" size="',e.htmlEncode(E>0?E:''),'" />','</form>','</body></html>','<script>window.parent.CKEDITOR.tools.callFunction('+z+');','window.onbeforeunload = function() {window.parent.CKEDITOR.tools.callFunction('+A+')}</script>'].join(''));w.$.close();for(var G=0;G<y.length;G++)y[G].enable();};if(b.gecko)setTimeout(D,500);else D();},getValue:function(){return this.getInputElement().$.value||'';},setInitValue:function(){this._.initValue='';},eventProcessors:{onChange:function(u,v){if(!this._.domOnChangeRegistered){this.on('formLoaded',function(){this.getInputElement().on('change',function(){this.fire('change',{value:this.getValue()});},this);},this);this._.domOnChangeRegistered=true;}this.on('change',v);}},keyboardFocusable:true},true);k.dialog.fileButton.prototype=new k.dialog.button();k.dialog.fieldset.prototype=e.clone(k.dialog.hbox.prototype);a.dialog.addUIElement('text',n);a.dialog.addUIElement('password',n);a.dialog.addUIElement('textarea',o);a.dialog.addUIElement('checkbox',o);a.dialog.addUIElement('radio',o);a.dialog.addUIElement('button',o);a.dialog.addUIElement('select',o);a.dialog.addUIElement('file',o);a.dialog.addUIElement('fileButton',o);a.dialog.addUIElement('html',o);a.dialog.addUIElement('fieldset',p);})();j.add('panel',{beforeInit:function(m){m.ui.addHandler('panel',k.panel.handler);
-}});a.UI_PANEL='panel';k.panel=function(m,n){var o=this;if(n)e.extend(o,n);e.extend(o,{className:'',css:[]});o.id=e.getNextId();o.document=m;o._={blocks:{}};};k.panel.handler={create:function(m){return new k.panel(m);}};k.panel.prototype={renderHtml:function(m){var n=[];this.render(m,n);return n.join('');},render:function(m,n){var p=this;var o=p.id;n.push('<div class="',m.skinClass,'" lang="',m.langCode,'" role="presentation" style="display:none;z-index:'+(m.config.baseFloatZIndex+1)+'">'+'<div'+' id=',o,' dir=',m.lang.dir,' role="presentation" class="cke_panel cke_',m.lang.dir);if(p.className)n.push(' ',p.className);n.push('">');if(p.forceIFrame||p.css.length){n.push('<iframe id="',o,'_frame" frameborder="0" role="application" src="javascript:void(');n.push(b.isCustomDomain()?"(function(){document.open();document.domain='"+document.domain+"';"+'document.close();'+'})()':'0');n.push(')"></iframe>');}n.push('</div></div>');return o;},getHolderElement:function(){var m=this._.holder;if(!m){if(this.forceIFrame||this.css.length){var n=this.document.getById(this.id+'_frame'),o=n.getParent(),p=o.getAttribute('dir'),q=o.getParent().getAttribute('class'),r=o.getParent().getAttribute('lang'),s=n.getFrameDocument();b.iOS&&o.setStyles({overflow:'scroll','-webkit-overflow-scrolling':'touch'});var t=e.addFunction(e.bind(function(w){this.isLoaded=true;if(this.onLoad)this.onLoad();},this)),u='<!DOCTYPE html><html dir="'+p+'" class="'+q+'_container" lang="'+r+'">'+'<head>'+'<style>.'+q+'_container{visibility:hidden}</style>'+e.buildStyleHtml(this.css)+'</head>'+'<body class="cke_'+p+' cke_panel_frame '+b.cssClass+'" style="margin:0;padding:0"'+' onload="( window.CKEDITOR || window.parent.CKEDITOR ).tools.callFunction('+t+');"></body>'+'</html>';s.write(u);var v=s.getWindow();v.$.CKEDITOR=a;s.on('key'+(b.opera?'press':'down'),function(w){var z=this;var x=w.data.getKeystroke(),y=z.document.getById(z.id).getAttribute('dir');if(z._.onKeyDown&&z._.onKeyDown(x)===false){w.data.preventDefault();return;}if(x==27||x==(y=='rtl'?39:37))if(z.onEscape&&z.onEscape(x)===false)w.data.preventDefault();},this);m=s.getBody();m.unselectable();b.air&&e.callFunction(t);}else m=this.document.getById(this.id);this._.holder=m;}return m;},addBlock:function(m,n){var o=this;n=o._.blocks[m]=n instanceof k.panel.block?n:new k.panel.block(o.getHolderElement(),n);if(!o._.currentBlock)o.showBlock(m);return n;},getBlock:function(m){return this._.blocks[m];},showBlock:function(m){var r=this;var n=r._.blocks,o=n[m],p=r._.currentBlock,q=!r.forceIFrame||c?r._.holder:r.document.getById(r.id+'_frame');
-if(p){q.removeAttributes(p.attributes);p.hide();}r._.currentBlock=o;q.setAttributes(o.attributes);a.fire('ariaWidget',q);o._.focusIndex=-1;r._.onKeyDown=o.onKeyDown&&e.bind(o.onKeyDown,o);o.show();return o;},destroy:function(){this.element&&this.element.remove();}};k.panel.block=e.createClass({$:function(m,n){var o=this;o.element=m.append(m.getDocument().createElement('div',{attributes:{tabIndex:-1,'class':'cke_panel_block',role:'presentation'},styles:{display:'none'}}));if(n)e.extend(o,n);if(!o.attributes.title)o.attributes.title=o.attributes['aria-label'];o.keys={};o._.focusIndex=-1;o.element.disableContextMenu();},_:{markItem:function(m){var p=this;if(m==-1)return;var n=p.element.getElementsByTag('a'),o=n.getItem(p._.focusIndex=m);if(b.webkit||b.opera)o.getDocument().getWindow().focus();o.focus();p.onMark&&p.onMark(o);}},proto:{show:function(){this.element.setStyle('display','');},hide:function(){var m=this;if(!m.onHide||m.onHide.call(m)!==true)m.element.setStyle('display','none');},onKeyDown:function(m){var r=this;var n=r.keys[m];switch(n){case 'next':var o=r._.focusIndex,p=r.element.getElementsByTag('a'),q;while(q=p.getItem(++o)){if(q.getAttribute('_cke_focus')&&q.$.offsetWidth){r._.focusIndex=o;q.focus();break;}}return false;case 'prev':o=r._.focusIndex;p=r.element.getElementsByTag('a');while(o>0&&(q=p.getItem(--o))){if(q.getAttribute('_cke_focus')&&q.$.offsetWidth){r._.focusIndex=o;q.focus();break;}}return false;case 'click':case 'mouseup':o=r._.focusIndex;q=o>=0&&r.element.getElementsByTag('a').getItem(o);if(q)q.$[n]?q.$[n]():q.$['on'+n]();return false;}return true;}}});j.add('listblock',{requires:['panel'],onLoad:function(){k.panel.prototype.addListBlock=function(m,n){return this.addBlock(m,new k.listBlock(this.getHolderElement(),n));};k.listBlock=e.createClass({base:k.panel.block,$:function(m,n){var q=this;n=n||{};var o=n.attributes||(n.attributes={});(q.multiSelect=!!n.multiSelect)&&(o['aria-multiselectable']=true);!o.role&&(o.role='listbox');q.base.apply(q,arguments);var p=q.keys;p[40]='next';p[9]='next';p[38]='prev';p[2228224+9]='prev';p[32]=c?'mouseup':'click';c&&(p[13]='mouseup');q._.pendingHtml=[];q._.items={};q._.groups={};},_:{close:function(){if(this._.started){this._.pendingHtml.push('</ul>');delete this._.started;}},getClick:function(){if(!this._.click)this._.click=e.addFunction(function(m){var o=this;var n=true;if(o.multiSelect)n=o.toggle(m);else o.mark(m);if(o.onClick)o.onClick(m,n);},this);return this._.click;}},proto:{add:function(m,n,o){var r=this;
-var p=r._.pendingHtml,q=e.getNextId();if(!r._.started){p.push('<ul role="presentation" class=cke_panel_list>');r._.started=1;r._.size=r._.size||0;}r._.items[m]=q;p.push('<li id=',q,' class=cke_panel_listItem role=presentation><a id="',q,'_option" _cke_focus=1 hidefocus=true title="',o||m,'" href="javascript:void(\'',m,"')\" "+(c?'onclick="return false;" onmouseup':'onclick')+'="CKEDITOR.tools.callFunction(',r._.getClick(),",'",m,"'); return false;\"",' role="option">',n||m,'</a></li>');},startGroup:function(m){this._.close();var n=e.getNextId();this._.groups[m]=n;this._.pendingHtml.push('<h1 role="presentation" id=',n,' class=cke_panel_grouptitle>',m,'</h1>');},commit:function(){var m=this;m._.close();m.element.appendHtml(m._.pendingHtml.join(''));delete m._.size;m._.pendingHtml=[];},toggle:function(m){var n=this.isMarked(m);if(n)this.unmark(m);else this.mark(m);return!n;},hideGroup:function(m){var n=this.element.getDocument().getById(this._.groups[m]),o=n&&n.getNext();if(n){n.setStyle('display','none');if(o&&o.getName()=='ul')o.setStyle('display','none');}},hideItem:function(m){this.element.getDocument().getById(this._.items[m]).setStyle('display','none');},showAll:function(){var m=this._.items,n=this._.groups,o=this.element.getDocument();for(var p in m)o.getById(m[p]).setStyle('display','');for(var q in n){var r=o.getById(n[q]),s=r.getNext();r.setStyle('display','');if(s&&s.getName()=='ul')s.setStyle('display','');}},mark:function(m){var p=this;if(!p.multiSelect)p.unmarkAll();var n=p._.items[m],o=p.element.getDocument().getById(n);o.addClass('cke_selected');p.element.getDocument().getById(n+'_option').setAttribute('aria-selected',true);p.onMark&&p.onMark(o);},unmark:function(m){var q=this;var n=q.element.getDocument(),o=q._.items[m],p=n.getById(o);p.removeClass('cke_selected');n.getById(o+'_option').removeAttribute('aria-selected');q.onUnmark&&q.onUnmark(p);},unmarkAll:function(){var q=this;var m=q._.items,n=q.element.getDocument();for(var o in m){var p=m[o];n.getById(p).removeClass('cke_selected');n.getById(p+'_option').removeAttribute('aria-selected');}q.onUnmark&&q.onUnmark();},isMarked:function(m){return this.element.getDocument().getById(this._.items[m]).hasClass('cke_selected');},focus:function(m){this._.focusIndex=-1;if(m){var n=this.element.getDocument().getById(this._.items[m]).getFirst(),o=this.element.getElementsByTag('a'),p,q=-1;while(p=o.getItem(++q)){if(p.equals(n)){this._.focusIndex=q;break;}}setTimeout(function(){n.focus();},0);}}}});}});a.themes.add('default',(function(){var m={};
-function n(o,p){var q,r;r=o.config.sharedSpaces;r=r&&r[p];r=r&&a.document.getById(r);if(r){var s='<span class="cke_shared " dir="'+o.lang.dir+'"'+'>'+'<span class="'+o.skinClass+' '+o.id+' cke_editor_'+o.name+'">'+'<span class="'+b.cssClass+'">'+'<span class="cke_wrapper cke_'+o.lang.dir+'">'+'<span class="cke_editor">'+'<div class="cke_'+p+'">'+'</div></span></span></span></span></span>',t=r.append(h.createFromHtml(s,r.getDocument()));if(r.getCustomData('cke_hasshared'))t.hide();else r.setCustomData('cke_hasshared',1);q=t.getChild([0,0,0,0]);!o.sharedSpaces&&(o.sharedSpaces={});o.sharedSpaces[p]=q;o.on('focus',function(){for(var u=0,v,w=r.getChildren();v=w.getItem(u);u++){if(v.type==1&&!v.equals(t)&&v.hasClass('cke_shared'))v.hide();}t.show();});o.on('destroy',function(){t.remove();});}return q;};return{build:function(o,p){var q=o.name,r=o.element,s=o.elementMode;if(!r||s==0)return;if(s==1)r.hide();var t=o.fire('themeSpace',{space:'top',html:''}).html,u=o.fire('themeSpace',{space:'contents',html:''}).html,v=o.fireOnce('themeSpace',{space:'bottom',html:''}).html,w=u&&o.config.height,x=o.config.tabIndex||o.element.getAttribute('tabindex')||0;if(!u)w='auto';else if(!isNaN(w))w+='px';var y='',z=o.config.width;if(z){if(!isNaN(z))z+='px';y+='width: '+z+';';}var A=t&&n(o,'top'),B=n(o,'bottom');A&&(A.setHtml(t),t='');B&&(B.setHtml(v),v='');var C='<style>.'+o.skinClass+'{visibility:hidden;}</style>';if(m[o.skinClass])C='';else m[o.skinClass]=1;var D=h.createFromHtml(['<span id="cke_',q,'" class="',o.skinClass,' ',o.id,' cke_editor_',q,'" dir="',o.lang.dir,'" title="',b.gecko?' ':'','" lang="',o.langCode,'"'+(b.webkit?' tabindex="'+x+'"':'')+' role="application"'+' aria-labelledby="cke_',q,'_arialbl"'+(y?' style="'+y+'"':'')+'>'+'<span id="cke_',q,'_arialbl" class="cke_voice_label">'+o.lang.editor+'</span>'+'<span class="',b.cssClass,'" role="presentation"><span class="cke_wrapper cke_',o.lang.dir,'" role="presentation"><table class="cke_editor" border="0" cellspacing="0" cellpadding="0" role="presentation"><tbody><tr',t?'':' style="display:none"',' role="presentation"><td id="cke_top_',q,'" class="cke_top" role="presentation">',t,'</td></tr><tr',u?'':' style="display:none"',' role="presentation"><td id="cke_contents_',q,'" class="cke_contents" style="height:',w,'" role="presentation">',u,'</td></tr><tr',v?'':' style="display:none"',' role="presentation"><td id="cke_bottom_',q,'" class="cke_bottom" role="presentation">',v,'</td></tr></tbody></table>'+C+'</span>'+'</span>'+'</span>'].join(''));
-D.getChild([1,0,0,0,0]).unselectable();D.getChild([1,0,0,0,2]).unselectable();if(s==1)D.insertAfter(r);else r.append(D);o.container=D;D.disableContextMenu();o.on('contentDirChanged',function(E){var F=(o.lang.dir!=E.data?'add':'remove')+'Class';D.getChild(1)[F]('cke_mixed_dir_content');var G=this.sharedSpaces&&this.sharedSpaces[this.config.toolbarLocation];G&&G.getParent().getParent()[F]('cke_mixed_dir_content');});o.fireOnce('themeLoaded');o.fireOnce('uiReady');},buildDialog:function(o){var p=e.getNextNumber(),q=h.createFromHtml(['<div class="',o.id,'_dialog cke_editor_',o.name.replace('.','\\.'),'_dialog cke_skin_',o.skinName,'" dir="',o.lang.dir,'" lang="',o.langCode,'" role="dialog" aria-labelledby="%title#"><table class="cke_dialog',' '+b.cssClass,' cke_',o.lang.dir,'" style="position:absolute" role="presentation"><tr><td role="presentation"><div class="%body" role="presentation"><div id="%title#" class="%title" role="presentation"></div><a id="%close_button#" class="%close_button" href="javascript:void(0)" title="'+o.lang.common.close+'" role="button"><span class="cke_label">X</span></a>'+'<div id="%tabs#" class="%tabs" role="tablist"></div>'+'<table class="%contents" role="presentation">'+'<tr>'+'<td id="%contents#" class="%contents" role="presentation"></td>'+'</tr>'+'<tr>'+'<td id="%footer#" class="%footer" role="presentation"></td>'+'</tr>'+'</table>'+'</div>'+'<div id="%tl#" class="%tl"></div>'+'<div id="%tc#" class="%tc"></div>'+'<div id="%tr#" class="%tr"></div>'+'<div id="%ml#" class="%ml"></div>'+'<div id="%mr#" class="%mr"></div>'+'<div id="%bl#" class="%bl"></div>'+'<div id="%bc#" class="%bc"></div>'+'<div id="%br#" class="%br"></div>'+'</td></tr>'+'</table>',c?'':'<style>.cke_dialog{visibility:hidden;}</style>','</div>'].join('').replace(/#/g,'_'+p).replace(/%/g,'cke_dialog_')),r=q.getChild([0,0,0,0,0]),s=r.getChild(0),t=r.getChild(1);if(c&&!b.ie6Compat){var u=b.isCustomDomain(),v='javascript:void(function(){'+encodeURIComponent('document.open();'+(u?'document.domain="'+document.domain+'";':'')+'document.close();')+'}())',w=h.createFromHtml('<iframe frameBorder="0" class="cke_iframe_shim" src="'+v+'"'+' tabIndex="-1"'+'></iframe>');w.appendTo(r.getParent());}s.unselectable();t.unselectable();return{element:q,parts:{dialog:q.getChild(0),title:s,close:t,tabs:r.getChild(2),contents:r.getChild([3,0,0,0]),footer:r.getChild([3,0,1,0])}};},destroy:function(o){var p=o.container,q=o.element;if(p){p.clearCustomData();p.remove();}if(q){q.clearCustomData();
-o.elementMode==1&&q.show();delete o.element;}}};})());a.editor.prototype.getThemeSpace=function(m){var n='cke_'+m,o=this._[n]||(this._[n]=a.document.getById(n+'_'+this.name));return o;};a.editor.prototype.resize=function(m,n,o,p){var v=this;var q=v.container,r=a.document.getById('cke_contents_'+v.name),s=b.webkit&&v.document&&v.document.getWindow().$.frameElement,t=p?q.getChild(1):q;t.setSize('width',m,true);s&&(s.style.width='1%');var u=o?0:(t.$.offsetHeight||0)-(r.$.clientHeight||0);r.setStyle('height',Math.max(n-u,0)+'px');s&&(s.style.width='100%');v.fire('resize');};a.editor.prototype.getResizable=function(m){return m?a.document.getById('cke_contents_'+this.name):this.container;};})();
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function(){if(window.CKEDITOR&&window.CKEDITOR.dom)return;if(!window.CKEDITOR)window.CKEDITOR=(function(){var a={timestamp:'C6HH5UF',version:'3.6.4',revision:'7575',rnd:Math.floor(Math.random()*900)+100,_:{},status:'unloaded',basePath:(function(){var d=window.CKEDITOR_BASEPATH||'';if(!d){var e=document.getElementsByTagName('script');for(var f=0;f<e.length;f++){var g=e[f].src.match(/(^|.*[\\\/])ckeditor(?:_basic)?(?:_source)?.js(?:\?.*)?$/i);if(g){d=g[1];break;}}}if(d.indexOf(':/')==-1)if(d.indexOf('/')===0)d=location.href.match(/^.*?:\/\/[^\/]*/)[0]+d;else d=location.href.match(/^[^\?]*\/(?:)/)[0]+d;if(!d)throw 'The CKEditor installation path could not be automatically detected. Please set the global variable "CKEDITOR_BASEPATH" before creating editor instances.';return d;})(),getUrl:function(d){if(d.indexOf(':/')==-1&&d.indexOf('/')!==0)d=this.basePath+d;if(this.timestamp&&d.charAt(d.length-1)!='/'&&!/[&?]t=/.test(d))d+=(d.indexOf('?')>=0?'&':'?')+'t='+this.timestamp;return d;}},b=window.CKEDITOR_GETURL;if(b){var c=a.getUrl;a.getUrl=function(d){return b.call(a,d)||c.call(a,d);};}return a;})();var a=CKEDITOR;if(!a.event){a.event=function(){};a.event.implementOn=function(b){var c=a.event.prototype;for(var d in c){if(b[d]==undefined)b[d]=c[d];}};a.event.prototype=(function(){var b=function(d){var e=d.getPrivate&&d.getPrivate()||d._||(d._={});return e.events||(e.events={});},c=function(d){this.name=d;this.listeners=[];};c.prototype={getListenerIndex:function(d){for(var e=0,f=this.listeners;e<f.length;e++){if(f[e].fn==d)return e;}return-1;}};return{on:function(d,e,f,g,h){var i=b(this),j=i[d]||(i[d]=new c(d));if(j.getListenerIndex(e)<0){var k=j.listeners;if(!f)f=this;if(isNaN(h))h=10;var l=this,m=function(o,p,q,r){var s={name:d,sender:this,editor:o,data:p,listenerData:g,stop:q,cancel:r,removeListener:function(){l.removeListener(d,e);}};e.call(f,s);return s.data;};m.fn=e;m.priority=h;for(var n=k.length-1;n>=0;n--){if(k[n].priority<=h){k.splice(n+1,0,m);return;}}k.unshift(m);}},fire:(function(){var d=false,e=function(){d=true;},f=false,g=function(){f=true;};return function(h,i,j){var k=b(this)[h],l=d,m=f;d=f=false;if(k){var n=k.listeners;if(n.length){n=n.slice(0);for(var o=0;o<n.length;o++){var p=n[o].call(this,j,i,e,g);if(typeof p!='undefined')i=p;if(d||f)break;}}}var q=f||(typeof i=='undefined'?false:i);d=l;f=m;return q;};})(),fireOnce:function(d,e,f){var g=this.fire(d,e,f);delete b(this)[d];return g;},removeListener:function(d,e){var f=b(this)[d];if(f){var g=f.getListenerIndex(e);
+if(g>=0)f.listeners.splice(g,1);}},hasListeners:function(d){var e=b(this)[d];return e&&e.listeners.length>0;}};})();}if(!a.editor){a.ELEMENT_MODE_NONE=0;a.ELEMENT_MODE_REPLACE=1;a.ELEMENT_MODE_APPENDTO=2;a.editor=function(b,c,d,e){var f=this;f._={instanceConfig:b,element:c,data:e};f.elementMode=d||0;a.event.call(f);f._init();};a.editor.replace=function(b,c){var d=b;if(typeof d!='object'){d=document.getElementById(b);if(d&&d.tagName.toLowerCase() in {style:1,script:1,base:1,link:1,meta:1,title:1})d=null;if(!d){var e=0,f=document.getElementsByName(b);while((d=f[e++])&&d.tagName.toLowerCase()!='textarea'){}}if(!d)throw '[CKEDITOR.editor.replace] The element with id or name "'+b+'" was not found.';}d.style.visibility='hidden';return new a.editor(c,d,1);};a.editor.appendTo=function(b,c,d){var e=b;if(typeof e!='object'){e=document.getElementById(b);if(!e)throw '[CKEDITOR.editor.appendTo] The element with id "'+b+'" was not found.';}return new a.editor(c,e,2,d);};a.editor.prototype={_init:function(){var b=a.editor._pending||(a.editor._pending=[]);b.push(this);},fire:function(b,c){return a.event.prototype.fire.call(this,b,c,this);},fireOnce:function(b,c){return a.event.prototype.fireOnce.call(this,b,c,this);}};a.event.implementOn(a.editor.prototype,true);}if(!a.env)a.env=(function(){var b=navigator.userAgent.toLowerCase(),c=window.opera,d={ie:/*@cc_on!@*/false,opera:!!c&&c.version,webkit:b.indexOf(' applewebkit/')>-1,air:b.indexOf(' adobeair/')>-1,mac:b.indexOf('macintosh')>-1,quirks:document.compatMode=='BackCompat',mobile:b.indexOf('mobile')>-1,iOS:/(ipad|iphone|ipod)/.test(b),isCustomDomain:function(){if(!this.ie)return false;var g=document.domain,h=window.location.hostname;return g!=h&&g!='['+h+']';},secure:location.protocol=='https:'};d.gecko=navigator.product=='Gecko'&&!d.webkit&&!d.opera;var e=0;if(d.ie){e=parseFloat(b.match(/msie (\d+)/)[1]);d.ie8=!!document.documentMode;d.ie8Compat=document.documentMode==8;d.ie9Compat=document.documentMode==9;d.ie7Compat=e==7&&!document.documentMode||document.documentMode==7;d.ie6Compat=e<7||d.quirks;}if(d.gecko){var f=b.match(/rv:([\d\.]+)/);if(f){f=f[1].split('.');e=f[0]*10000+(f[1]||0)*100+ +(f[2]||0);}}if(d.opera)e=parseFloat(c.version());if(d.air)e=parseFloat(b.match(/ adobeair\/(\d+)/)[1]);if(d.webkit)e=parseFloat(b.match(/ applewebkit\/(\d+)/)[1]);d.version=e;d.isCompatible=d.iOS&&e>=534||!d.mobile&&(d.ie&&e>=6||d.gecko&&e>=10801||d.opera&&e>=9.5||d.air&&e>=1||d.webkit&&e>=522||false);d.cssClass='cke_browser_'+(d.ie?'ie':d.gecko?'gecko':d.opera?'opera':d.webkit?'webkit':'unknown');
+if(d.quirks)d.cssClass+=' cke_browser_quirks';if(d.ie){d.cssClass+=' cke_browser_ie'+(d.version<7?'6':d.version>=8?document.documentMode:'7');if(d.quirks)d.cssClass+=' cke_browser_iequirks';}if(d.gecko&&e<10900)d.cssClass+=' cke_browser_gecko18';if(d.air)d.cssClass+=' cke_browser_air';return d;})();var b=a.env;var c=b.ie;if(a.status=='unloaded')(function(){a.event.implementOn(a);a.loadFullCore=function(){if(a.status!='basic_ready'){a.loadFullCore._load=1;return;}delete a.loadFullCore;var e=document.createElement('script');e.type='text/javascript';e.src=a.basePath+'ckeditor.js';document.getElementsByTagName('head')[0].appendChild(e);};a.loadFullCoreTimeout=0;a.replaceClass='ckeditor';a.replaceByClassEnabled=1;var d=function(e,f,g,h){if(b.isCompatible){if(a.loadFullCore)a.loadFullCore();var i=g(e,f,h);a.add(i);return i;}return null;};a.replace=function(e,f){return d(e,f,a.editor.replace);};a.appendTo=function(e,f,g){return d(e,f,a.editor.appendTo,g);};a.add=function(e){var f=this._.pending||(this._.pending=[]);f.push(e);};a.replaceAll=function(){var e=document.getElementsByTagName('textarea');for(var f=0;f<e.length;f++){var g=null,h=e[f];if(!h.name&&!h.id)continue;if(typeof arguments[0]=='string'){var i=new RegExp('(?:^|\\s)'+arguments[0]+'(?:$|\\s)');if(!i.test(h.className))continue;}else if(typeof arguments[0]=='function'){g={};if(arguments[0](h,g)===false)continue;}this.replace(h,g);}};(function(){var e=function(){var f=a.loadFullCore,g=a.loadFullCoreTimeout;if(a.replaceByClassEnabled)a.replaceAll(a.replaceClass);a.status='basic_ready';if(f&&f._load)f();else if(g)setTimeout(function(){if(a.loadFullCore)a.loadFullCore();},g*1000);};if(window.addEventListener)window.addEventListener('load',e,false);else if(window.attachEvent)window.attachEvent('onload',e);})();a.status='basic_loaded';})();a.dom={};var d=a.dom;(function(){var e=[];a.on('reset',function(){e=[];});a.tools={arrayCompare:function(f,g){if(!f&&!g)return true;if(!f||!g||f.length!=g.length)return false;for(var h=0;h<f.length;h++){if(f[h]!=g[h])return false;}return true;},clone:function(f){var g;if(f&&f instanceof Array){g=[];for(var h=0;h<f.length;h++)g[h]=this.clone(f[h]);return g;}if(f===null||typeof f!='object'||f instanceof String||f instanceof Number||f instanceof Boolean||f instanceof Date||f instanceof RegExp)return f;g=new f.constructor();for(var i in f){var j=f[i];g[i]=this.clone(j);}return g;},capitalize:function(f){return f.charAt(0).toUpperCase()+f.substring(1).toLowerCase();},extend:function(f){var g=arguments.length,h,i;
+if(typeof (h=arguments[g-1])=='boolean')g--;else if(typeof (h=arguments[g-2])=='boolean'){i=arguments[g-1];g-=2;}for(var j=1;j<g;j++){var k=arguments[j];for(var l in k){if(h===true||f[l]==undefined)if(!i||l in i)f[l]=k[l];}}return f;},prototypedCopy:function(f){var g=function(){};g.prototype=f;return new g();},isArray:function(f){return!!f&&f instanceof Array;},isEmpty:function(f){for(var g in f){if(f.hasOwnProperty(g))return false;}return true;},cssStyleToDomStyle:(function(){var f=document.createElement('div').style,g=typeof f.cssFloat!='undefined'?'cssFloat':typeof f.styleFloat!='undefined'?'styleFloat':'float';return function(h){if(h=='float')return g;else return h.replace(/-./g,function(i){return i.substr(1).toUpperCase();});};})(),buildStyleHtml:function(f){f=[].concat(f);var g,h=[];for(var i=0;i<f.length;i++){g=f[i];if(/@import|[{}]/.test(g))h.push('<style>'+g+'</style>');else h.push('<link type="text/css" rel=stylesheet href="'+g+'">');}return h.join('');},htmlEncode:function(f){var g=function(k){var l=new d.element('span');l.setText(k);return l.getHtml();},h=g('\n').toLowerCase()=='<br>'?function(k){return g(k).replace(/<br>/gi,'\n');}:g,i=g('>')=='>'?function(k){return h(k).replace(/>/g,'>');}:h,j=g(' ')==' '?function(k){return i(k).replace(/ /g,' ');}:i;this.htmlEncode=j;return this.htmlEncode(f);},htmlEncodeAttr:function(f){return f.replace(/"/g,'"').replace(/</g,'<').replace(/>/g,'>');},getNextNumber:(function(){var f=0;return function(){return++f;};})(),getNextId:function(){return 'cke_'+this.getNextNumber();},override:function(f,g){return g(f);},setTimeout:function(f,g,h,i,j){if(!j)j=window;if(!h)h=j;return j.setTimeout(function(){if(i)f.apply(h,[].concat(i));else f.apply(h);},g||0);},trim:(function(){var f=/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g;return function(g){return g.replace(f,'');};})(),ltrim:(function(){var f=/^[ \t\n\r]+/g;return function(g){return g.replace(f,'');};})(),rtrim:(function(){var f=/[ \t\n\r]+$/g;return function(g){return g.replace(f,'');};})(),indexOf:Array.prototype.indexOf?function(f,g){return f.indexOf(g);}:function(f,g){for(var h=0,i=f.length;h<i;h++){if(f[h]===g)return h;}return-1;},bind:function(f,g){return function(){return f.apply(g,arguments);};},createClass:function(f){var g=f.$,h=f.base,i=f.privates||f._,j=f.proto,k=f.statics;if(i){var l=g;g=function(){var p=this;var m=p._||(p._={});for(var n in i){var o=i[n];m[n]=typeof o=='function'?a.tools.bind(o,p):o;}l.apply(p,arguments);};}if(h){g.prototype=this.prototypedCopy(h.prototype);
+g.prototype['constructor']=g;g.prototype.base=function(){this.base=h.prototype.base;h.apply(this,arguments);this.base=arguments.callee;};}if(j)this.extend(g.prototype,j,true);if(k)this.extend(g,k,true);return g;},addFunction:function(f,g){return e.push(function(){return f.apply(g||this,arguments);})-1;},removeFunction:function(f){e[f]=null;},callFunction:function(f){var g=e[f];return g&&g.apply(window,Array.prototype.slice.call(arguments,1));},cssLength:(function(){return function(f){return f+(!f||isNaN(Number(f))?'':'px');};})(),convertToPx:(function(){var f;return function(g){if(!f){f=d.element.createFromHtml('<div style="position:absolute;left:-9999px;top:-9999px;margin:0px;padding:0px;border:0px;"></div>',a.document);a.document.getBody().append(f);}if(!/%$/.test(g)){f.setStyle('width',g);return f.$.clientWidth;}return g;};})(),repeat:function(f,g){return new Array(g+1).join(f);},tryThese:function(){var f;for(var g=0,h=arguments.length;g<h;g++){var i=arguments[g];try{f=i();break;}catch(j){}}return f;},genKey:function(){return Array.prototype.slice.call(arguments).join('-');}};})();var e=a.tools;a.dtd=(function(){var f=e.extend,g={isindex:1,fieldset:1},h={input:1,button:1,select:1,textarea:1,label:1},i=f({a:1},h),j=f({iframe:1},i),k={hr:1,ul:1,menu:1,div:1,section:1,header:1,footer:1,nav:1,article:1,aside:1,figure:1,dialog:1,hgroup:1,mark:1,time:1,meter:1,command:1,keygen:1,output:1,progress:1,audio:1,video:1,details:1,datagrid:1,datalist:1,blockquote:1,noscript:1,table:1,center:1,address:1,dir:1,pre:1,h5:1,dl:1,h4:1,noframes:1,h6:1,ol:1,h1:1,h3:1,h2:1},l={ins:1,del:1,script:1,style:1},m=f({b:1,acronym:1,bdo:1,'var':1,'#':1,abbr:1,code:1,br:1,i:1,cite:1,kbd:1,u:1,strike:1,s:1,tt:1,strong:1,q:1,samp:1,em:1,dfn:1,span:1,wbr:1},l),n=f({sub:1,img:1,object:1,sup:1,basefont:1,map:1,applet:1,font:1,big:1,small:1,mark:1},m),o=f({p:1},n),p=f({iframe:1},n,h),q={img:1,noscript:1,br:1,kbd:1,center:1,button:1,basefont:1,h5:1,h4:1,samp:1,h6:1,ol:1,h1:1,h3:1,h2:1,form:1,font:1,'#':1,select:1,menu:1,ins:1,abbr:1,label:1,code:1,table:1,script:1,cite:1,input:1,iframe:1,strong:1,textarea:1,noframes:1,big:1,small:1,span:1,hr:1,sub:1,bdo:1,'var':1,div:1,section:1,header:1,footer:1,nav:1,article:1,aside:1,figure:1,dialog:1,hgroup:1,mark:1,time:1,meter:1,menu:1,command:1,keygen:1,output:1,progress:1,audio:1,video:1,details:1,datagrid:1,datalist:1,object:1,sup:1,strike:1,dir:1,map:1,dl:1,applet:1,del:1,isindex:1,fieldset:1,ul:1,b:1,acronym:1,a:1,blockquote:1,i:1,u:1,s:1,tt:1,address:1,q:1,pre:1,p:1,em:1,dfn:1},r=f({a:1},p),s={tr:1},t={'#':1},u=f({param:1},q),v=f({form:1},g,j,k,o),w={li:1},x={style:1,script:1},y={base:1,link:1,meta:1,title:1},z=f(y,x),A={head:1,body:1},B={html:1},C={address:1,blockquote:1,center:1,dir:1,div:1,section:1,header:1,footer:1,nav:1,article:1,aside:1,figure:1,dialog:1,hgroup:1,time:1,meter:1,menu:1,command:1,keygen:1,output:1,progress:1,audio:1,video:1,details:1,datagrid:1,datalist:1,dl:1,fieldset:1,form:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,hr:1,isindex:1,noframes:1,ol:1,p:1,pre:1,table:1,ul:1};
+return{$nonBodyContent:f(B,A,y),$block:C,$blockLimit:{body:1,div:1,section:1,header:1,footer:1,nav:1,article:1,aside:1,figure:1,dialog:1,hgroup:1,time:1,meter:1,menu:1,command:1,keygen:1,output:1,progress:1,audio:1,video:1,details:1,datagrid:1,datalist:1,td:1,th:1,caption:1,form:1},$inline:r,$body:f({script:1,style:1},C),$cdata:{script:1,style:1},$empty:{area:1,base:1,br:1,col:1,hr:1,img:1,input:1,link:1,meta:1,param:1,wbr:1},$listItem:{dd:1,dt:1,li:1},$list:{ul:1,ol:1,dl:1},$nonEditable:{applet:1,button:1,embed:1,iframe:1,map:1,object:1,option:1,script:1,textarea:1,param:1,audio:1,video:1},$captionBlock:{caption:1,legend:1},$removeEmpty:{abbr:1,acronym:1,address:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,s:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1,mark:1},$tabIndex:{a:1,area:1,button:1,input:1,object:1,select:1,textarea:1},$tableContent:{caption:1,col:1,colgroup:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1},html:A,head:z,style:t,script:t,body:v,base:{},link:{},meta:{},title:t,col:{},tr:{td:1,th:1},img:{},colgroup:{col:1},noscript:v,td:v,br:{},wbr:{},th:v,center:v,kbd:r,button:f(o,k),basefont:{},h5:r,h4:r,samp:r,h6:r,ol:w,h1:r,h3:r,option:t,h2:r,form:f(g,j,k,o),select:{optgroup:1,option:1},font:r,ins:r,menu:w,abbr:r,label:r,table:{thead:1,col:1,tbody:1,tr:1,colgroup:1,caption:1,tfoot:1},code:r,tfoot:s,cite:r,li:v,input:{},iframe:v,strong:r,textarea:t,noframes:v,big:r,small:r,span:r,hr:{},dt:r,sub:r,optgroup:{option:1},param:{},bdo:r,'var':r,div:v,object:u,sup:r,dd:v,strike:r,area:{},dir:w,map:f({area:1,form:1,p:1},g,l,k),applet:u,dl:{dt:1,dd:1},del:r,isindex:{},fieldset:f({legend:1},q),thead:s,ul:w,acronym:r,b:r,a:p,blockquote:v,caption:r,i:r,u:r,tbody:s,s:r,address:f(j,o),tt:r,legend:r,q:r,pre:f(m,i),p:r,em:r,dfn:r,section:v,header:v,footer:v,nav:v,article:v,aside:v,figure:v,dialog:v,hgroup:v,mark:r,time:r,meter:r,menu:r,command:r,keygen:r,output:r,progress:u,audio:u,video:u,details:u,datagrid:u,datalist:u};})();var f=a.dtd;d.event=function(g){this.$=g;};d.event.prototype={getKey:function(){return this.$.keyCode||this.$.which;},getKeystroke:function(){var h=this;var g=h.getKey();if(h.$.ctrlKey||h.$.metaKey)g+=1114112;if(h.$.shiftKey)g+=2228224;if(h.$.altKey)g+=4456448;return g;},preventDefault:function(g){var h=this.$;if(h.preventDefault)h.preventDefault();else h.returnValue=false;if(g)this.stopPropagation();},stopPropagation:function(){var g=this.$;if(g.stopPropagation)g.stopPropagation();else g.cancelBubble=true;
+},getTarget:function(){var g=this.$.target||this.$.srcElement;return g?new d.node(g):null;}};a.CTRL=1114112;a.SHIFT=2228224;a.ALT=4456448;d.domObject=function(g){if(g)this.$=g;};d.domObject.prototype=(function(){var g=function(h,i){return function(j){if(typeof a!='undefined')h.fire(i,new d.event(j));};};return{getPrivate:function(){var h;if(!(h=this.getCustomData('_')))this.setCustomData('_',h={});return h;},on:function(h){var k=this;var i=k.getCustomData('_cke_nativeListeners');if(!i){i={};k.setCustomData('_cke_nativeListeners',i);}if(!i[h]){var j=i[h]=g(k,h);if(k.$.addEventListener)k.$.addEventListener(h,j,!!a.event.useCapture);else if(k.$.attachEvent)k.$.attachEvent('on'+h,j);}return a.event.prototype.on.apply(k,arguments);},removeListener:function(h){var k=this;a.event.prototype.removeListener.apply(k,arguments);if(!k.hasListeners(h)){var i=k.getCustomData('_cke_nativeListeners'),j=i&&i[h];if(j){if(k.$.removeEventListener)k.$.removeEventListener(h,j,false);else if(k.$.detachEvent)k.$.detachEvent('on'+h,j);delete i[h];}}},removeAllListeners:function(){var k=this;var h=k.getCustomData('_cke_nativeListeners');for(var i in h){var j=h[i];if(k.$.detachEvent)k.$.detachEvent('on'+i,j);else if(k.$.removeEventListener)k.$.removeEventListener(i,j,false);delete h[i];}}};})();(function(g){var h={};a.on('reset',function(){h={};});g.equals=function(i){return i&&i.$===this.$;};g.setCustomData=function(i,j){var k=this.getUniqueId(),l=h[k]||(h[k]={});l[i]=j;return this;};g.getCustomData=function(i){var j=this.$['data-cke-expando'],k=j&&h[j];return k&&k[i];};g.removeCustomData=function(i){var j=this.$['data-cke-expando'],k=j&&h[j],l=k&&k[i];if(typeof l!='undefined')delete k[i];return l||null;};g.clearCustomData=function(){this.removeAllListeners();var i=this.$['data-cke-expando'];i&&delete h[i];};g.getUniqueId=function(){return this.$['data-cke-expando']||(this.$['data-cke-expando']=e.getNextNumber());};a.event.implementOn(g);})(d.domObject.prototype);d.window=function(g){d.domObject.call(this,g);};d.window.prototype=new d.domObject();e.extend(d.window.prototype,{focus:function(){if(b.webkit&&this.$.parent)this.$.parent.focus();this.$.focus();},getViewPaneSize:function(){var g=this.$.document,h=g.compatMode=='CSS1Compat';return{width:(h?g.documentElement.clientWidth:g.body.clientWidth)||0,height:(h?g.documentElement.clientHeight:g.body.clientHeight)||0};},getScrollPosition:function(){var g=this.$;if('pageXOffset' in g)return{x:g.pageXOffset||0,y:g.pageYOffset||0};else{var h=g.document;
+return{x:h.documentElement.scrollLeft||h.body.scrollLeft||0,y:h.documentElement.scrollTop||h.body.scrollTop||0};}}});d.document=function(g){d.domObject.call(this,g);};var g=d.document;g.prototype=new d.domObject();e.extend(g.prototype,{appendStyleSheet:function(h){if(this.$.createStyleSheet)this.$.createStyleSheet(h);else{var i=new d.element('link');i.setAttributes({rel:'stylesheet',type:'text/css',href:h});this.getHead().append(i);}},appendStyleText:function(h){var k=this;if(k.$.createStyleSheet){var i=k.$.createStyleSheet('');i.cssText=h;}else{var j=new d.element('style',k);j.append(new d.text(h,k));k.getHead().append(j);}},createElement:function(h,i){var j=new d.element(h,this);if(i){if(i.attributes)j.setAttributes(i.attributes);if(i.styles)j.setStyles(i.styles);}return j;},createText:function(h){return new d.text(h,this);},focus:function(){this.getWindow().focus();},getById:function(h){var i=this.$.getElementById(h);return i?new d.element(i):null;},getByAddress:function(h,i){var j=this.$.documentElement;for(var k=0;j&&k<h.length;k++){var l=h[k];if(!i){j=j.childNodes[l];continue;}var m=-1;for(var n=0;n<j.childNodes.length;n++){var o=j.childNodes[n];if(i===true&&o.nodeType==3&&o.previousSibling&&o.previousSibling.nodeType==3)continue;m++;if(m==l){j=o;break;}}}return j?new d.node(j):null;},getElementsByTag:function(h,i){if(!(c&&!(document.documentMode>8))&&i)h=i+':'+h;return new d.nodeList(this.$.getElementsByTagName(h));},getHead:function(){var h=this.$.getElementsByTagName('head')[0];if(!h)h=this.getDocumentElement().append(new d.element('head'),true);else h=new d.element(h);return(this.getHead=function(){return h;})();},getBody:function(){var h=new d.element(this.$.body);return(this.getBody=function(){return h;})();},getDocumentElement:function(){var h=new d.element(this.$.documentElement);return(this.getDocumentElement=function(){return h;})();},getWindow:function(){var h=new d.window(this.$.parentWindow||this.$.defaultView);return(this.getWindow=function(){return h;})();},write:function(h){var i=this;i.$.open('text/html','replace');b.isCustomDomain()&&(i.$.domain=document.domain);i.$.write(h);i.$.close();}});d.node=function(h){if(h){var i=h.nodeType==9?'document':h.nodeType==1?'element':h.nodeType==3?'text':h.nodeType==8?'comment':'domObject';return new d[i](h);}return this;};d.node.prototype=new d.domObject();a.NODE_ELEMENT=1;a.NODE_DOCUMENT=9;a.NODE_TEXT=3;a.NODE_COMMENT=8;a.NODE_DOCUMENT_FRAGMENT=11;a.POSITION_IDENTICAL=0;a.POSITION_DISCONNECTED=1;
+a.POSITION_FOLLOWING=2;a.POSITION_PRECEDING=4;a.POSITION_IS_CONTAINED=8;a.POSITION_CONTAINS=16;e.extend(d.node.prototype,{appendTo:function(h,i){h.append(this,i);return h;},clone:function(h,i){var j=this.$.cloneNode(h),k=function(l){if(l.nodeType!=1)return;if(!i)l.removeAttribute('id',false);l.removeAttribute('data-cke-expando',false);if(h){var m=l.childNodes;for(var n=0;n<m.length;n++)k(m[n]);}};k(j);return new d.node(j);},hasPrevious:function(){return!!this.$.previousSibling;},hasNext:function(){return!!this.$.nextSibling;},insertAfter:function(h){h.$.parentNode.insertBefore(this.$,h.$.nextSibling);return h;},insertBefore:function(h){h.$.parentNode.insertBefore(this.$,h.$);return h;},insertBeforeMe:function(h){this.$.parentNode.insertBefore(h.$,this.$);return h;},getAddress:function(h){var i=[],j=this.getDocument().$.documentElement,k=this.$;while(k&&k!=j){var l=k.parentNode;if(l)i.unshift(this.getIndex.call({$:k},h));k=l;}return i;},getDocument:function(){return new g(this.$.ownerDocument||this.$.parentNode.ownerDocument);},getIndex:function(h){var i=this.$,j=0;while(i=i.previousSibling){if(h&&i.nodeType==3&&(!i.nodeValue.length||i.previousSibling&&i.previousSibling.nodeType==3))continue;j++;}return j;},getNextSourceNode:function(h,i,j){if(j&&!j.call){var k=j;j=function(n){return!n.equals(k);};}var l=!h&&this.getFirst&&this.getFirst(),m;if(!l){if(this.type==1&&j&&j(this,true)===false)return null;l=this.getNext();}while(!l&&(m=(m||this).getParent())){if(j&&j(m,true)===false)return null;l=m.getNext();}if(!l)return null;if(j&&j(l)===false)return null;if(i&&i!=l.type)return l.getNextSourceNode(false,i,j);return l;},getPreviousSourceNode:function(h,i,j){if(j&&!j.call){var k=j;j=function(n){return!n.equals(k);};}var l=!h&&this.getLast&&this.getLast(),m;if(!l){if(this.type==1&&j&&j(this,true)===false)return null;l=this.getPrevious();}while(!l&&(m=(m||this).getParent())){if(j&&j(m,true)===false)return null;l=m.getPrevious();}if(!l)return null;if(j&&j(l)===false)return null;if(i&&l.type!=i)return l.getPreviousSourceNode(false,i,j);return l;},getPrevious:function(h){var i=this.$,j;do{i=i.previousSibling;j=i&&i.nodeType!=10&&new d.node(i);}while(j&&h&&!h(j));return j;},getNext:function(h){var i=this.$,j;do{i=i.nextSibling;j=i&&new d.node(i);}while(j&&h&&!h(j));return j;},getParent:function(){var h=this.$.parentNode;return h&&h.nodeType==1?new d.node(h):null;},getParents:function(h){var i=this,j=[];do j[h?'push':'unshift'](i);while(i=i.getParent());return j;},getCommonAncestor:function(h){var j=this;
+if(h.equals(j))return j;if(h.contains&&h.contains(j))return h;var i=j.contains?j:j.getParent();do{if(i.contains(h))return i;}while(i=i.getParent());return null;},getPosition:function(h){var i=this.$,j=h.$;if(i.compareDocumentPosition)return i.compareDocumentPosition(j);if(i==j)return 0;if(this.type==1&&h.type==1){if(i.contains){if(i.contains(j))return 16+4;if(j.contains(i))return 8+2;}if('sourceIndex' in i)return i.sourceIndex<0||j.sourceIndex<0?1:i.sourceIndex<j.sourceIndex?4:2;}var k=this.getAddress(),l=h.getAddress(),m=Math.min(k.length,l.length);for(var n=0;n<=m-1;n++){if(k[n]!=l[n]){if(n<m)return k[n]<l[n]?4:2;break;}}return k.length<l.length?16+4:8+2;},getAscendant:function(h,i){var j=this.$,k;if(!i)j=j.parentNode;while(j){if(j.nodeName&&(k=j.nodeName.toLowerCase(),typeof h=='string'?k==h:k in h))return new d.node(j);j=j.parentNode;}return null;},hasAscendant:function(h,i){var j=this.$;if(!i)j=j.parentNode;while(j){if(j.nodeName&&j.nodeName.toLowerCase()==h)return true;j=j.parentNode;}return false;},move:function(h,i){h.append(this.remove(),i);},remove:function(h){var i=this.$,j=i.parentNode;if(j){if(h)for(var k;k=i.firstChild;)j.insertBefore(i.removeChild(k),i);j.removeChild(i);}return this;},replace:function(h){this.insertBefore(h);h.remove();},trim:function(){this.ltrim();this.rtrim();},ltrim:function(){var k=this;var h;while(k.getFirst&&(h=k.getFirst())){if(h.type==3){var i=e.ltrim(h.getText()),j=h.getLength();if(!i){h.remove();continue;}else if(i.length<j){h.split(j-i.length);k.$.removeChild(k.$.firstChild);}}break;}},rtrim:function(){var k=this;var h;while(k.getLast&&(h=k.getLast())){if(h.type==3){var i=e.rtrim(h.getText()),j=h.getLength();if(!i){h.remove();continue;}else if(i.length<j){h.split(i.length);k.$.lastChild.parentNode.removeChild(k.$.lastChild);}}break;}if(!c&&!b.opera){h=k.$.lastChild;if(h&&h.type==1&&h.nodeName.toLowerCase()=='br')h.parentNode.removeChild(h);}},isReadOnly:function(){var h=this;if(this.type!=1)h=this.getParent();if(h&&typeof h.$.isContentEditable!='undefined')return!(h.$.isContentEditable||h.data('cke-editable'));else{var i=h;while(i){if(i.is('body')||!!i.data('cke-editable'))break;if(i.getAttribute('contentEditable')=='false')return true;else if(i.getAttribute('contentEditable')=='true')break;i=i.getParent();}return false;}}});d.nodeList=function(h){this.$=h;};d.nodeList.prototype={count:function(){return this.$.length;},getItem:function(h){var i=this.$[h];return i?new d.node(i):null;}};d.element=function(h,i){if(typeof h=='string')h=(i?i.$:document).createElement(h);
+d.domObject.call(this,h);};var h=d.element;h.get=function(i){return i&&(i.$?i:new h(i));};h.prototype=new d.node();h.createFromHtml=function(i,j){var k=new h('div',j);k.setHtml(i);return k.getFirst().remove();};h.setMarker=function(i,j,k,l){var m=j.getCustomData('list_marker_id')||j.setCustomData('list_marker_id',e.getNextNumber()).getCustomData('list_marker_id'),n=j.getCustomData('list_marker_names')||j.setCustomData('list_marker_names',{}).getCustomData('list_marker_names');i[m]=j;n[k]=1;return j.setCustomData(k,l);};h.clearAllMarkers=function(i){for(var j in i)h.clearMarkers(i,i[j],1);};h.clearMarkers=function(i,j,k){var l=j.getCustomData('list_marker_names'),m=j.getCustomData('list_marker_id');for(var n in l)j.removeCustomData(n);j.removeCustomData('list_marker_names');if(k){j.removeCustomData('list_marker_id');delete i[m];}};e.extend(h.prototype,{type:1,addClass:function(i){var j=this.$.className;if(j){var k=new RegExp('(?:^|\\s)'+i+'(?:\\s|$)','');if(!k.test(j))j+=' '+i;}this.$.className=j||i;},removeClass:function(i){var j=this.getAttribute('class');if(j){var k=new RegExp('(?:^|\\s+)'+i+'(?=\\s|$)','i');if(k.test(j)){j=j.replace(k,'').replace(/^\s+/,'');if(j)this.setAttribute('class',j);else this.removeAttribute('class');}}},hasClass:function(i){var j=new RegExp('(?:^|\\s+)'+i+'(?=\\s|$)','');return j.test(this.getAttribute('class'));},append:function(i,j){var k=this;if(typeof i=='string')i=k.getDocument().createElement(i);if(j)k.$.insertBefore(i.$,k.$.firstChild);else k.$.appendChild(i.$);return i;},appendHtml:function(i){var k=this;if(!k.$.childNodes.length)k.setHtml(i);else{var j=new h('div',k.getDocument());j.setHtml(i);j.moveChildren(k);}},appendText:function(i){if(this.$.text!=undefined)this.$.text+=i;else this.append(new d.text(i));},appendBogus:function(){var k=this;var i=k.getLast();while(i&&i.type==3&&!e.rtrim(i.getText()))i=i.getPrevious();if(!i||!i.is||!i.is('br')){var j=b.opera?k.getDocument().createText(''):k.getDocument().createElement('br');b.gecko&&j.setAttribute('type','_moz');k.append(j);}},breakParent:function(i){var l=this;var j=new d.range(l.getDocument());j.setStartAfter(l);j.setEndAfter(i);var k=j.extractContents();j.insertNode(l.remove());k.insertAfterNode(l);},contains:c||b.webkit?function(i){var j=this.$;return i.type!=1?j.contains(i.getParent().$):j!=i.$&&j.contains(i.$);}:function(i){return!!(this.$.compareDocumentPosition(i.$)&16);},focus:(function(){function i(){try{this.$.focus();}catch(j){}};return function(j){if(j)e.setTimeout(i,100,this);
+else i.call(this);};})(),getHtml:function(){var i=this.$.innerHTML;return c?i.replace(/<\?[^>]*>/g,''):i;},getOuterHtml:function(){var j=this;if(j.$.outerHTML)return j.$.outerHTML.replace(/<\?[^>]*>/,'');var i=j.$.ownerDocument.createElement('div');i.appendChild(j.$.cloneNode(true));return i.innerHTML;},setHtml:function(i){return this.$.innerHTML=i;},setText:function(i){h.prototype.setText=this.$.innerText!=undefined?function(j){return this.$.innerText=j;}:function(j){return this.$.textContent=j;};return this.setText(i);},getAttribute:(function(){var i=function(j){return this.$.getAttribute(j,2);};if(c&&(b.ie7Compat||b.ie6Compat))return function(j){var n=this;switch(j){case 'class':j='className';break;case 'http-equiv':j='httpEquiv';break;case 'name':return n.$.name;case 'tabindex':var k=i.call(n,j);if(k!==0&&n.$.tabIndex===0)k=null;return k;break;case 'checked':var l=n.$.attributes.getNamedItem(j),m=l.specified?l.nodeValue:n.$.checked;return m?'checked':null;case 'hspace':case 'value':return n.$[j];case 'style':return n.$.style.cssText;case 'contenteditable':case 'contentEditable':return n.$.attributes.getNamedItem('contentEditable').specified?n.$.getAttribute('contentEditable'):null;}return i.call(n,j);};else return i;})(),getChildren:function(){return new d.nodeList(this.$.childNodes);},getComputedStyle:c?function(i){return this.$.currentStyle[e.cssStyleToDomStyle(i)];}:function(i){return this.getWindow().$.getComputedStyle(this.$,'').getPropertyValue(i);},getDtd:function(){var i=f[this.getName()];this.getDtd=function(){return i;};return i;},getElementsByTag:g.prototype.getElementsByTag,getTabIndex:c?function(){var i=this.$.tabIndex;if(i===0&&!f.$tabIndex[this.getName()]&&parseInt(this.getAttribute('tabindex'),10)!==0)i=-1;return i;}:b.webkit?function(){var i=this.$.tabIndex;if(i==undefined){i=parseInt(this.getAttribute('tabindex'),10);if(isNaN(i))i=-1;}return i;}:function(){return this.$.tabIndex;},getText:function(){return this.$.textContent||this.$.innerText||'';},getWindow:function(){return this.getDocument().getWindow();},getId:function(){return this.$.id||null;},getNameAtt:function(){return this.$.name||null;},getName:function(){var i=this.$.nodeName.toLowerCase();if(c&&!(document.documentMode>8)){var j=this.$.scopeName;if(j!='HTML')i=j.toLowerCase()+':'+i;}return(this.getName=function(){return i;})();},getValue:function(){return this.$.value;},getFirst:function(i){var j=this.$.firstChild,k=j&&new d.node(j);if(k&&i&&!i(k))k=k.getNext(i);return k;},getLast:function(i){var j=this.$.lastChild,k=j&&new d.node(j);
+if(k&&i&&!i(k))k=k.getPrevious(i);return k;},getStyle:function(i){return this.$.style[e.cssStyleToDomStyle(i)];},is:function(){var i=this.getName();for(var j=0;j<arguments.length;j++){if(arguments[j]==i)return true;}return false;},isEditable:function(i){var l=this;var j=l.getName();if(l.isReadOnly()||l.getComputedStyle('display')=='none'||l.getComputedStyle('visibility')=='hidden'||l.is('a')&&l.data('cke-saved-name')&&!l.getChildCount()||f.$nonEditable[j]||f.$empty[j])return false;if(i!==false){var k=f[j]||f.span;return k&&k['#'];}return true;},isIdentical:function(i){if(this.getName()!=i.getName())return false;var j=this.$.attributes,k=i.$.attributes,l=j.length,m=k.length;for(var n=0;n<l;n++){var o=j[n];if(o.nodeName=='_moz_dirty')continue;if((!c||o.specified&&o.nodeName!='data-cke-expando')&&o.nodeValue!=i.getAttribute(o.nodeName))return false;}if(c)for(n=0;n<m;n++){o=k[n];if(o.specified&&o.nodeName!='data-cke-expando'&&o.nodeValue!=this.getAttribute(o.nodeName))return false;}return true;},isVisible:function(){var l=this;var i=(l.$.offsetHeight||l.$.offsetWidth)&&l.getComputedStyle('visibility')!='hidden',j,k;if(i&&(b.webkit||b.opera)){j=l.getWindow();if(!j.equals(a.document.getWindow())&&(k=j.$.frameElement))i=new h(k).isVisible();}return!!i;},isEmptyInlineRemoveable:function(){if(!f.$removeEmpty[this.getName()])return false;var i=this.getChildren();for(var j=0,k=i.count();j<k;j++){var l=i.getItem(j);if(l.type==1&&l.data('cke-bookmark'))continue;if(l.type==1&&!l.isEmptyInlineRemoveable()||l.type==3&&e.trim(l.getText()))return false;}return true;},hasAttributes:c&&(b.ie7Compat||b.ie6Compat)?function(){var i=this.$.attributes;for(var j=0;j<i.length;j++){var k=i[j];switch(k.nodeName){case 'class':if(this.getAttribute('class'))return true;case 'data-cke-expando':continue;default:if(k.specified)return true;}}return false;}:function(){var i=this.$.attributes,j=i.length,k={'data-cke-expando':1,_moz_dirty:1};return j>0&&(j>2||!k[i[0].nodeName]||j==2&&!k[i[1].nodeName]);},hasAttribute:(function(){function i(j){var k=this.$.attributes.getNamedItem(j);return!!(k&&k.specified);};return c&&b.version<8?function(j){if(j=='name')return!!this.$.name;return i.call(this,j);}:i;})(),hide:function(){this.setStyle('display','none');},moveChildren:function(i,j){var k=this.$;i=i.$;if(k==i)return;var l;if(j)while(l=k.lastChild)i.insertBefore(k.removeChild(l),i.firstChild);else while(l=k.firstChild)i.appendChild(k.removeChild(l));},mergeSiblings:(function(){function i(j,k,l){if(k&&k.type==1){var m=[];
+while(k.data('cke-bookmark')||k.isEmptyInlineRemoveable()){m.push(k);k=l?k.getNext():k.getPrevious();if(!k||k.type!=1)return;}if(j.isIdentical(k)){var n=l?j.getLast():j.getFirst();while(m.length)m.shift().move(j,!l);k.moveChildren(j,!l);k.remove();if(n&&n.type==1)n.mergeSiblings();}}};return function(j){var k=this;if(!(j===false||f.$removeEmpty[k.getName()]||k.is('a')))return;i(k,k.getNext(),true);i(k,k.getPrevious());};})(),show:function(){this.setStyles({display:'',visibility:''});},setAttribute:(function(){var i=function(j,k){this.$.setAttribute(j,k);return this;};if(c&&(b.ie7Compat||b.ie6Compat))return function(j,k){var l=this;if(j=='class')l.$.className=k;else if(j=='style')l.$.style.cssText=k;else if(j=='tabindex')l.$.tabIndex=k;else if(j=='checked')l.$.checked=k;else if(j=='contenteditable')i.call(l,'contentEditable',k);else i.apply(l,arguments);return l;};else if(b.ie8Compat&&b.secure)return function(j,k){if(j=='src'&&k.match(/^http:\/\//))try{i.apply(this,arguments);}catch(l){}else i.apply(this,arguments);return this;};else return i;})(),setAttributes:function(i){for(var j in i)this.setAttribute(j,i[j]);return this;},setValue:function(i){this.$.value=i;return this;},removeAttribute:(function(){var i=function(j){this.$.removeAttribute(j);};if(c&&(b.ie7Compat||b.ie6Compat))return function(j){if(j=='class')j='className';else if(j=='tabindex')j='tabIndex';else if(j=='contenteditable')j='contentEditable';i.call(this,j);};else return i;})(),removeAttributes:function(i){if(e.isArray(i))for(var j=0;j<i.length;j++)this.removeAttribute(i[j]);else for(var k in i)i.hasOwnProperty(k)&&this.removeAttribute(k);},removeStyle:function(i){var j=this.$.style;j.removeProperty?j.removeProperty(i):j.removeAttribute(e.cssStyleToDomStyle(i));if(!this.$.style.cssText)this.removeAttribute('style');},setStyle:function(i,j){this.$.style[e.cssStyleToDomStyle(i)]=j;return this;},setStyles:function(i){for(var j in i)this.setStyle(j,i[j]);return this;},setOpacity:function(i){if(c&&b.version<9){i=Math.round(i*100);this.setStyle('filter',i>=100?'':'progid:DXImageTransform.Microsoft.Alpha(opacity='+i+')');}else this.setStyle('opacity',i);},unselectable:b.gecko?function(){this.$.style.MozUserSelect='none';this.on('dragstart',function(i){i.data.preventDefault();});}:b.webkit?function(){this.$.style.KhtmlUserSelect='none';this.on('dragstart',function(i){i.data.preventDefault();});}:function(){if(c||b.opera){var i=this.$,j=i.getElementsByTagName('*'),k,l=0;i.unselectable='on';while(k=j[l++])switch(k.tagName.toLowerCase()){case 'iframe':case 'textarea':case 'input':case 'select':break;
+default:k.unselectable='on';}}},getPositionedAncestor:function(){var i=this;while(i.getName()!='html'){if(i.getComputedStyle('position')!='static')return i;i=i.getParent();}return null;},getDocumentPosition:function(i){var D=this;var j=0,k=0,l=D.getDocument(),m=l.getBody(),n=l.$.compatMode=='BackCompat';if(document.documentElement.getBoundingClientRect){var o=D.$.getBoundingClientRect(),p=l.$,q=p.documentElement,r=q.clientTop||m.$.clientTop||0,s=q.clientLeft||m.$.clientLeft||0,t=true;if(c){var u=l.getDocumentElement().contains(D),v=l.getBody().contains(D);t=n&&v||!n&&u;}if(t){j=o.left+(!n&&q.scrollLeft||m.$.scrollLeft);j-=s;k=o.top+(!n&&q.scrollTop||m.$.scrollTop);k-=r;}}else{var w=D,x=null,y;while(w&&!(w.getName()=='body'||w.getName()=='html')){j+=w.$.offsetLeft-w.$.scrollLeft;k+=w.$.offsetTop-w.$.scrollTop;if(!w.equals(D)){j+=w.$.clientLeft||0;k+=w.$.clientTop||0;}var z=x;while(z&&!z.equals(w)){j-=z.$.scrollLeft;k-=z.$.scrollTop;z=z.getParent();}x=w;w=(y=w.$.offsetParent)?new h(y):null;}}if(i){var A=D.getWindow(),B=i.getWindow();if(!A.equals(B)&&A.$.frameElement){var C=new h(A.$.frameElement).getDocumentPosition(i);j+=C.x;k+=C.y;}}if(!document.documentElement.getBoundingClientRect)if(b.gecko&&!n){j+=D.$.clientLeft?1:0;k+=D.$.clientTop?1:0;}return{x:j,y:k};},scrollIntoView:function(i){var j=this.getParent();if(!j)return;do{var k=j.$.clientWidth&&j.$.clientWidth<j.$.scrollWidth||j.$.clientHeight&&j.$.clientHeight<j.$.scrollHeight;if(k)this.scrollIntoParent(j,i,1);if(j.is('html')){var l=j.getWindow();try{var m=l.$.frameElement;m&&(j=new h(m));}catch(n){}}}while(j=j.getParent());},scrollIntoParent:function(i,j,k){!i&&(i=this.getWindow());var l=i.getDocument(),m=l.$.compatMode=='BackCompat';if(i instanceof d.window)i=m?l.getBody():l.getDocumentElement();function n(z,A){if(/body|html/.test(i.getName()))i.getWindow().$.scrollBy(z,A);else{i.$.scrollLeft+=z;i.$.scrollTop+=A;}};function o(z,A){var B={x:0,y:0};if(!z.is(m?'body':'html')){var C=z.$.getBoundingClientRect();B.x=C.left,B.y=C.top;}var D=z.getWindow();if(!D.equals(A)){var E=o(h.get(D.$.frameElement),A);B.x+=E.x,B.y+=E.y;}return B;};function p(z,A){return parseInt(z.getComputedStyle('margin-'+A)||0,10)||0;};var q=i.getWindow(),r=o(this,q),s=o(i,q),t=this.$.offsetHeight,u=this.$.offsetWidth,v=i.$.clientHeight,w=i.$.clientWidth,x,y;x={x:r.x-p(this,'left')-s.x||0,y:r.y-p(this,'top')-s.y||0};y={x:r.x+u+p(this,'right')-(s.x+w)||0,y:r.y+t+p(this,'bottom')-(s.y+v)||0};if(x.y<0||y.y>0)n(0,j===true?x.y:j===false?y.y:x.y<0?x.y:y.y);
+if(k&&(x.x<0||y.x>0))n(x.x<0?x.x:y.x,0);},setState:function(i){var j=this;switch(i){case 1:j.addClass('cke_on');j.removeClass('cke_off');j.removeClass('cke_disabled');break;case 0:j.addClass('cke_disabled');j.removeClass('cke_off');j.removeClass('cke_on');break;default:j.addClass('cke_off');j.removeClass('cke_on');j.removeClass('cke_disabled');break;}},getFrameDocument:function(){var i=this.$;try{i.contentWindow.document;}catch(j){i.src=i.src;if(c&&b.version<7)window.showModalDialog('javascript:document.write("<script>window.setTimeout(function(){window.close();},50);</script>")');}return i&&new g(i.contentWindow.document);},copyAttributes:function(i,j){var p=this;var k=p.$.attributes;j=j||{};for(var l=0;l<k.length;l++){var m=k[l],n=m.nodeName.toLowerCase(),o;if(n in j)continue;if(n=='checked'&&(o=p.getAttribute(n)))i.setAttribute(n,o);else if(m.specified||c&&m.nodeValue&&n=='value'){o=p.getAttribute(n);if(o===null)o=m.nodeValue;i.setAttribute(n,o);}}if(p.$.style.cssText!=='')i.$.style.cssText=p.$.style.cssText;},renameNode:function(i){var l=this;if(l.getName()==i)return;var j=l.getDocument(),k=new h(i,j);l.copyAttributes(k);l.moveChildren(k);l.getParent()&&l.$.parentNode.replaceChild(k.$,l.$);k.$['data-cke-expando']=l.$['data-cke-expando'];l.$=k.$;},getChild:function(i){var j=this.$;if(!i.slice)j=j.childNodes[i];else while(i.length>0&&j)j=j.childNodes[i.shift()];return j?new d.node(j):null;},getChildCount:function(){return this.$.childNodes.length;},disableContextMenu:function(){this.on('contextmenu',function(i){if(!i.data.getTarget().hasClass('cke_enable_context_menu'))i.data.preventDefault();});},getDirection:function(i){var j=this;return i?j.getComputedStyle('direction')||j.getDirection()||j.getDocument().$.dir||j.getDocument().getBody().getDirection(1):j.getStyle('direction')||j.getAttribute('dir');},data:function(i,j){i='data-'+i;if(j===undefined)return this.getAttribute(i);else if(j===false)this.removeAttribute(i);else this.setAttribute(i,j);return null;}});(function(){var i={width:['border-left-width','border-right-width','padding-left','padding-right'],height:['border-top-width','border-bottom-width','padding-top','padding-bottom']};function j(k){var l=0;for(var m=0,n=i[k].length;m<n;m++)l+=parseInt(this.getComputedStyle(i[k][m])||0,10)||0;return l;};h.prototype.setSize=function(k,l,m){if(typeof l=='number'){if(m&&!(c&&b.quirks))l-=j.call(this,k);this.setStyle(k,l+'px');}};h.prototype.getSize=function(k,l){var m=Math.max(this.$['offset'+e.capitalize(k)],this.$['client'+e.capitalize(k)])||0;
+if(l)m-=j.call(this,k);return m;};})();a.command=function(i,j){this.uiItems=[];this.exec=function(k){var l=this;if(l.state==0)return false;if(l.editorFocus)i.focus();if(l.fire('exec')===true)return true;return j.exec.call(l,i,k)!==false;};this.refresh=function(){if(this.fire('refresh')===true)return true;return j.refresh&&j.refresh.apply(this,arguments)!==false;};e.extend(this,j,{modes:{wysiwyg:1},editorFocus:1,state:2});a.event.call(this);};a.command.prototype={enable:function(){var i=this;if(i.state==0)i.setState(!i.preserveState||typeof i.previousState=='undefined'?2:i.previousState);},disable:function(){this.setState(0);},setState:function(i){var j=this;if(j.state==i)return false;j.previousState=j.state;j.state=i;j.fire('state');return true;},toggleState:function(){var i=this;if(i.state==2)i.setState(1);else if(i.state==1)i.setState(2);}};a.event.implementOn(a.command.prototype,true);a.ENTER_P=1;a.ENTER_BR=2;a.ENTER_DIV=3;a.config={customConfig:'config.js',autoUpdateElement:true,baseHref:'',contentsCss:a.basePath+'contents.css',contentsLangDirection:'ui',contentsLanguage:'',language:'',defaultLanguage:'en',enterMode:1,forceEnterMode:false,shiftEnterMode:2,corePlugins:'',docType:'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">',bodyId:'',bodyClass:'',fullPage:false,height:200,plugins:'about,a11yhelp,basicstyles,bidi,blockquote,button,clipboard,colorbutton,colordialog,contextmenu,dialogadvtab,div,elementspath,enterkey,entities,filebrowser,find,flash,font,format,forms,horizontalrule,htmldataprocessor,iframe,image,indent,justify,keystrokes,link,list,liststyle,maximize,newpage,pagebreak,pastefromword,pastetext,popup,preview,print,removeformat,resize,save,scayt,showblocks,showborders,smiley,sourcearea,specialchar,stylescombo,tab,table,tabletools,templates,toolbar,undo,wsc,wysiwygarea',extraPlugins:'',removePlugins:'',protectedSource:[],tabIndex:0,theme:'default',skin:'kama',width:'',baseFloatZIndex:10000};var i=a.config;a.focusManager=function(j){if(j.focusManager)return j.focusManager;this.hasFocus=false;this._={editor:j};return this;};a.focusManager.prototype={focus:function(){var k=this;if(k._.timer)clearTimeout(k._.timer);if(!k.hasFocus){if(a.currentInstance)a.currentInstance.focusManager.forceBlur();var j=k._.editor;j.container.getChild(1).addClass('cke_focus');k.hasFocus=true;j.fire('focus');}},blur:function(){var j=this;if(j._.timer)clearTimeout(j._.timer);j._.timer=setTimeout(function(){delete j._.timer;
+j.forceBlur();},100);},forceBlur:function(){if(this.hasFocus){var j=this._.editor;j.container.getChild(1).removeClass('cke_focus');this.hasFocus=false;j.fire('blur');}}};(function(){var j={};a.lang={languages:{af:1,ar:1,bg:1,bn:1,bs:1,ca:1,cs:1,cy:1,da:1,de:1,el:1,'en-au':1,'en-ca':1,'en-gb':1,en:1,eo:1,es:1,et:1,eu:1,fa:1,fi:1,fo:1,'fr-ca':1,fr:1,gl:1,gu:1,he:1,hi:1,hr:1,hu:1,is:1,it:1,ja:1,ka:1,km:1,ko:1,lt:1,lv:1,mn:1,ms:1,nb:1,nl:1,no:1,pl:1,'pt-br':1,pt:1,ro:1,ru:1,sk:1,sl:1,'sr-latn':1,sr:1,sv:1,th:1,tr:1,uk:1,vi:1,'zh-cn':1,zh:1},load:function(k,l,m){if(!k||!a.lang.languages[k])k=this.detect(l,k);if(!this[k])a.scriptLoader.load(a.getUrl('lang/'+k+'.js'),function(){m(k,this[k]);},this);else m(k,this[k]);},detect:function(k,l){var m=this.languages;l=l||navigator.userLanguage||navigator.language||k;var n=l.toLowerCase().match(/([a-z]+)(?:-([a-z]+))?/),o=n[1],p=n[2];if(m[o+'-'+p])o=o+'-'+p;else if(!m[o])o=null;a.lang.detect=o?function(){return o;}:function(q){return q;};return o||k;}};})();a.scriptLoader=(function(){var j={},k={};return{load:function(l,m,n,o){var p=typeof l=='string';if(p)l=[l];if(!n)n=a;var q=l.length,r=[],s=[],t=function(y){if(m)if(p)m.call(n,y);else m.call(n,r,s);};if(q===0){t(true);return;}var u=function(y,z){(z?r:s).push(y);if(--q<=0){o&&a.document.getDocumentElement().removeStyle('cursor');t(z);}},v=function(y,z){j[y]=1;var A=k[y];delete k[y];for(var B=0;B<A.length;B++)A[B](y,z);},w=function(y){if(j[y]){u(y,true);return;}var z=k[y]||(k[y]=[]);z.push(u);if(z.length>1)return;var A=new h('script');A.setAttributes({type:'text/javascript',src:y});if(m)if(c)A.$.onreadystatechange=function(){if(A.$.readyState=='loaded'||A.$.readyState=='complete'){A.$.onreadystatechange=null;v(y,true);}};else{A.$.onload=function(){setTimeout(function(){v(y,true);},0);};A.$.onerror=function(){v(y,false);};}A.appendTo(a.document.getHead());};o&&a.document.getDocumentElement().setStyle('cursor','wait');for(var x=0;x<q;x++)w(l[x]);}};})();a.resourceManager=function(j,k){var l=this;l.basePath=j;l.fileName=k;l.registered={};l.loaded={};l.externals={};l._={waitingList:{}};};a.resourceManager.prototype={add:function(j,k){if(this.registered[j])throw '[CKEDITOR.resourceManager.add] The resource name "'+j+'" is already registered.';a.fire(j+e.capitalize(this.fileName)+'Ready',this.registered[j]=k||{});},get:function(j){return this.registered[j]||null;},getPath:function(j){var k=this.externals[j];return a.getUrl(k&&k.dir||this.basePath+j+'/');},getFilePath:function(j){var k=this.externals[j];
+return a.getUrl(this.getPath(j)+(k&&typeof k.file=='string'?k.file:this.fileName+'.js'));},addExternal:function(j,k,l){j=j.split(',');for(var m=0;m<j.length;m++){var n=j[m];this.externals[n]={dir:k,file:l};}},load:function(j,k,l){if(!e.isArray(j))j=j?[j]:[];var m=this.loaded,n=this.registered,o=[],p={},q={};for(var r=0;r<j.length;r++){var s=j[r];if(!s)continue;if(!m[s]&&!n[s]){var t=this.getFilePath(s);o.push(t);if(!(t in p))p[t]=[];p[t].push(s);}else q[s]=this.get(s);}a.scriptLoader.load(o,function(u,v){if(v.length)throw '[CKEDITOR.resourceManager.load] Resource name "'+p[v[0]].join(',')+'" was not found at "'+v[0]+'".';for(var w=0;w<u.length;w++){var x=p[u[w]];for(var y=0;y<x.length;y++){var z=x[y];q[z]=this.get(z);m[z]=1;}}k.call(l,q);},this);}};a.plugins=new a.resourceManager('plugins/','plugin');var j=a.plugins;j.load=e.override(j.load,function(k){return function(l,m,n){var o={},p=function(q){k.call(this,q,function(r){e.extend(o,r);var s=[];for(var t in r){var u=r[t],v=u&&u.requires;if(v)for(var w=0;w<v.length;w++){if(!o[v[w]])s.push(v[w]);}}if(s.length)p.call(this,s);else{for(t in o){u=o[t];if(u.onLoad&&!u.onLoad._called){u.onLoad();u.onLoad._called=1;}}if(m)m.call(n||window,o);}},this);};p.call(this,l);};});j.setLang=function(k,l,m){var n=this.get(k),o=n.langEntries||(n.langEntries={}),p=n.lang||(n.lang=[]);if(e.indexOf(p,l)==-1)p.push(l);o[l]=m;};a.skins=(function(){var k={},l={},m=function(n,o,p,q){var r=k[o];if(!n.skin){n.skin=r;if(r.init)r.init(n);}var s=function(B){for(var C=0;C<B.length;C++)B[C]=a.getUrl(l[o]+B[C]);};function t(B,C){return B.replace(/url\s*\(([\s'"]*)(.*?)([\s"']*)\)/g,function(D,E,F,G){if(/^\/|^\w?:/.test(F))return D;else return 'url('+C+E+F+G+')';});};p=r[p];var u=!p||!!p._isLoaded;if(u)q&&q();else{var v=p._pending||(p._pending=[]);v.push(q);if(v.length>1)return;var w=!p.css||!p.css.length,x=!p.js||!p.js.length,y=function(){if(w&&x){p._isLoaded=1;for(var B=0;B<v.length;B++){if(v[B])v[B]();}}};if(!w){var z=p.css;if(e.isArray(z)){s(z);for(var A=0;A<z.length;A++)a.document.appendStyleSheet(z[A]);}else{z=t(z,a.getUrl(l[o]));a.document.appendStyleText(z);}p.css=z;w=1;}if(!x){s(p.js);a.scriptLoader.load(p.js,function(){x=1;y();});}y();}};return{add:function(n,o){k[n]=o;o.skinPath=l[n]||(l[n]=a.getUrl('skins/'+n+'/'));},load:function(n,o,p){var q=n.skinName,r=n.skinPath;if(k[q])m(n,q,o,p);else{l[q]=r;a.scriptLoader.load(a.getUrl(r+'skin.js'),function(){m(n,q,o,p);});}}};})();a.themes=new a.resourceManager('themes/','theme');a.ui=function(k){if(k.ui)return k.ui;
+this._={handlers:{},items:{},editor:k};return this;};var k=a.ui;k.prototype={add:function(l,m,n){this._.items[l]={type:m,command:n.command||null,args:Array.prototype.slice.call(arguments,2)};},create:function(l){var q=this;var m=q._.items[l],n=m&&q._.handlers[m.type],o=m&&m.command&&q._.editor.getCommand(m.command),p=n&&n.create.apply(q,m.args);m&&(p=e.extend(p,q._.editor.skin[m.type],true));if(o)o.uiItems.push(p);return p;},addHandler:function(l,m){this._.handlers[l]=m;}};a.event.implementOn(k);(function(){var l=0,m=function(){var x='editor'+ ++l;return a.instances&&a.instances[x]?m():x;},n={},o=function(x){var y=x.config.customConfig;if(!y)return false;y=a.getUrl(y);var z=n[y]||(n[y]={});if(z.fn){z.fn.call(x,x.config);if(a.getUrl(x.config.customConfig)==y||!o(x))x.fireOnce('customConfigLoaded');}else a.scriptLoader.load(y,function(){if(a.editorConfig)z.fn=a.editorConfig;else z.fn=function(){};o(x);});return true;},p=function(x,y){x.on('customConfigLoaded',function(){if(y){if(y.on)for(var z in y.on)x.on(z,y.on[z]);e.extend(x.config,y,true);delete x.config.on;}q(x);});if(y&&y.customConfig!=undefined)x.config.customConfig=y.customConfig;if(!o(x))x.fireOnce('customConfigLoaded');},q=function(x){var y=x.config.skin.split(','),z=y[0],A=a.getUrl(y[1]||'skins/'+z+'/');x.skinName=z;x.skinPath=A;x.skinClass='cke_skin_'+z;x.tabIndex=x.config.tabIndex||x.element.getAttribute('tabindex')||0;x.readOnly=!!(x.config.readOnly||x.element.getAttribute('disabled'));x.fireOnce('configLoaded');t(x);},r=function(x){a.lang.load(x.config.language,x.config.defaultLanguage,function(y,z){x.langCode=y;x.lang=e.prototypedCopy(z);if(b.gecko&&b.version<10900&&x.lang.dir=='rtl')x.lang.dir='ltr';x.fire('langLoaded');var A=x.config;A.contentsLangDirection=='ui'&&(A.contentsLangDirection=x.lang.dir);s(x);});},s=function(x){var y=x.config,z=y.plugins,A=y.extraPlugins,B=y.removePlugins;if(A){var C=new RegExp('(?:^|,)(?:'+A.replace(/\s*,\s*/g,'|')+')(?=,|$)','g');z=z.replace(C,'');z+=','+A;}if(B){C=new RegExp('(?:^|,)(?:'+B.replace(/\s*,\s*/g,'|')+')(?=,|$)','g');z=z.replace(C,'');}b.air&&(z+=',adobeair');j.load(z.split(','),function(D){var E=[],F=[],G=[];x.plugins=D;for(var H in D){var I=D[H],J=I.lang,K=j.getPath(H),L=null;I.path=K;if(J){L=e.indexOf(J,x.langCode)>=0?x.langCode:J[0];if(!I.langEntries||!I.langEntries[L])G.push(a.getUrl(K+'lang/'+L+'.js'));else{e.extend(x.lang,I.langEntries[L]);L=null;}}F.push(L);E.push(I);}a.scriptLoader.load(G,function(){var M=['beforeInit','init','afterInit'];
+for(var N=0;N<M.length;N++)for(var O=0;O<E.length;O++){var P=E[O];if(N===0&&F[O]&&P.lang)e.extend(x.lang,P.langEntries[F[O]]);if(P[M[N]])P[M[N]](x);}x.fire('pluginsLoaded');u(x);});});},t=function(x){a.skins.load(x,'editor',function(){r(x);});},u=function(x){var y=x.config.theme;a.themes.load(y,function(){var z=x.theme=a.themes.get(y);z.path=a.themes.getPath(y);z.build(x);if(x.config.autoUpdateElement)v(x);});},v=function(x){var y=x.element;if(x.elementMode==1&&y.is('textarea')){var z=y.$.form&&new h(y.$.form);if(z){function A(){x.updateElement();};z.on('submit',A);if(!z.$.submit.nodeName&&!z.$.submit.length)z.$.submit=e.override(z.$.submit,function(B){return function(){x.updateElement();if(B.apply)B.apply(this,arguments);else B();};});x.on('destroy',function(){z.removeListener('submit',A);});}}};function w(){var x,y=this._.commands,z=this.mode;if(!z)return;for(var A in y){x=y[A];x[x.startDisabled?'disable':this.readOnly&&!x.readOnly?'disable':x.modes[z]?'enable':'disable']();}};a.editor.prototype._init=function(){var z=this;var x=h.get(z._.element),y=z._.instanceConfig;delete z._.element;delete z._.instanceConfig;z._.commands={};z._.styles=[];z.element=x;z.name=x&&z.elementMode==1&&(x.getId()||x.getNameAtt())||m();if(z.name in a.instances)throw '[CKEDITOR.editor] The instance "'+z.name+'" already exists.';z.id=e.getNextId();z.config=e.prototypedCopy(i);z.ui=new k(z);z.focusManager=new a.focusManager(z);a.fire('instanceCreated',null,z);z.on('mode',w,null,null,1);z.on('readOnly',w,null,null,1);p(z,y);};})();e.extend(a.editor.prototype,{addCommand:function(l,m){return this._.commands[l]=new a.command(this,m);},addCss:function(l){this._.styles.push(l);},destroy:function(l){var m=this;if(!l)m.updateElement();m.fire('destroy');m.theme&&m.theme.destroy(m);a.remove(m);a.fire('instanceDestroyed',null,m);},execCommand:function(l,m){var n=this.getCommand(l),o={name:l,commandData:m,command:n};if(n&&n.state!=0)if(this.fire('beforeCommandExec',o)!==true){o.returnValue=n.exec(o.commandData);if(!n.async&&this.fire('afterCommandExec',o)!==true)return o.returnValue;}return false;},getCommand:function(l){return this._.commands[l];},getData:function(){var n=this;n.fire('beforeGetData');var l=n._.data;if(typeof l!='string'){var m=n.element;if(m&&n.elementMode==1)l=m.is('textarea')?m.getValue():m.getHtml();else l='';}l={dataValue:l};n.fire('getData',l);return l.dataValue;},getSnapshot:function(){var l=this.fire('getSnapshot');if(typeof l!='string'){var m=this.element;if(m&&this.elementMode==1)l=m.is('textarea')?m.getValue():m.getHtml();
+}return l;},loadSnapshot:function(l){this.fire('loadSnapshot',l);},setData:function(l,m,n){if(m)this.on('dataReady',function(p){p.removeListener();m.call(p.editor);});var o={dataValue:l};!n&&this.fire('setData',o);this._.data=o.dataValue;!n&&this.fire('afterSetData',o);},setReadOnly:function(l){l=l==undefined||l;if(this.readOnly!=l){this.readOnly=l;this.fire('readOnly');}},insertHtml:function(l){this.fire('insertHtml',l);},insertText:function(l){this.fire('insertText',l);},insertElement:function(l){this.fire('insertElement',l);},checkDirty:function(){return this.mayBeDirty&&this._.previousValue!==this.getSnapshot();},resetDirty:function(){if(this.mayBeDirty)this._.previousValue=this.getSnapshot();},updateElement:function(){var n=this;var l=n.element;if(l&&n.elementMode==1){var m=n.getData();if(n.config.htmlEncodeOutput)m=e.htmlEncode(m);if(l.is('textarea'))l.setValue(m);else l.setHtml(m);}}});a.on('loaded',function(){var l=a.editor._pending;if(l){delete a.editor._pending;for(var m=0;m<l.length;m++)l[m]._init();}});a.htmlParser=function(){this._={htmlPartsRegex:new RegExp("<(?:(?:\\/([^>]+)>)|(?:!--([\\S|\\s]*?)-->)|(?:([^\\s>]+)\\s*((?:(?:\"[^\"]*\")|(?:'[^']*')|[^\"'>])*)\\/?>))",'g')};};(function(){var l=/([\w\-:.]+)(?:(?:\s*=\s*(?:(?:"([^"]*)")|(?:'([^']*)')|([^\s>]+)))|(?=\s|$))/g,m={checked:1,compact:1,declare:1,defer:1,disabled:1,ismap:1,multiple:1,nohref:1,noresize:1,noshade:1,nowrap:1,readonly:1,selected:1};a.htmlParser.prototype={onTagOpen:function(){},onTagClose:function(){},onText:function(){},onCDATA:function(){},onComment:function(){},parse:function(n){var A=this;var o,p,q=0,r;while(o=A._.htmlPartsRegex.exec(n)){var s=o.index;if(s>q){var t=n.substring(q,s);if(r)r.push(t);else A.onText(t);}q=A._.htmlPartsRegex.lastIndex;if(p=o[1]){p=p.toLowerCase();if(r&&f.$cdata[p]){A.onCDATA(r.join(''));r=null;}if(!r){A.onTagClose(p);continue;}}if(r){r.push(o[0]);continue;}if(p=o[3]){p=p.toLowerCase();if(/="/.test(p))continue;var u={},v,w=o[4],x=!!(w&&w.charAt(w.length-1)=='/');if(w)while(v=l.exec(w)){var y=v[1].toLowerCase(),z=v[2]||v[3]||v[4]||'';if(!z&&m[y])u[y]=y;else u[y]=z;}A.onTagOpen(p,u,x);if(!r&&f.$cdata[p])r=[];continue;}if(p=o[2])A.onComment(p);}if(n.length>q)A.onText(n.substring(q,n.length));}};})();a.htmlParser.comment=function(l){this.value=l;this._={isBlockLike:false};};a.htmlParser.comment.prototype={type:8,writeHtml:function(l,m){var n=this.value;if(m){if(!(n=m.onComment(n,this)))return;if(typeof n!='string'){n.parent=this.parent;n.writeHtml(l,m);
+return;}}l.comment(n);}};(function(){a.htmlParser.text=function(l){this.value=l;this._={isBlockLike:false};};a.htmlParser.text.prototype={type:3,writeHtml:function(l,m){var n=this.value;if(m&&!(n=m.onText(n,this)))return;l.text(n);}};})();(function(){a.htmlParser.cdata=function(l){this.value=l;};a.htmlParser.cdata.prototype={type:3,writeHtml:function(l){l.write(this.value);}};})();a.htmlParser.fragment=function(){this.children=[];this.parent=null;this._={isBlockLike:true,hasInlineStarted:false};};(function(){var l=e.extend({table:1,ul:1,ol:1,dl:1},f.table,f.ul,f.ol,f.dl),m=c&&b.version<8?{dd:1,dt:1}:{},n={ol:1,ul:1},o=e.extend({},{html:1},f.html,f.body,f.head,{style:1,script:1});function p(q){return q.name=='a'&&q.attributes.href||f.$removeEmpty[q.name];};a.htmlParser.fragment.fromHtml=function(q,r,s){var t=new a.htmlParser(),u=s||new a.htmlParser.fragment(),v=[],w=[],x=u,y=false,z=false;function A(D){var E;if(v.length>0)for(var F=0;F<v.length;F++){var G=v[F],H=G.name,I=f[H],J=x.name&&f[x.name];if((!J||J[H])&&(!D||!I||I[D]||!f[D])){if(!E){B();E=1;}G=G.clone();G.parent=x;x=G;v.splice(F,1);F--;}else if(H==x.name)C(x,x.parent,1),F--;}};function B(){while(w.length)C(w.shift(),x);};function C(D,E,F){if(D.previous!==undefined)return;E=E||x||u;var G=x;if(r&&(!E.type||E.name=='body')){var H,I;if(D.attributes&&(I=D.attributes['data-cke-real-element-type']))H=I;else H=D.name;if(H&&!(H in f.$body||H=='body'||D.isOrphan)){x=E;t.onTagOpen(r,{});D.returnPoint=E=x;}}if(D._.isBlockLike&&D.name!='pre'&&D.name!='textarea'){var J=D.children.length,K=D.children[J-1],L;if(K&&K.type==3)if(!(L=e.rtrim(K.value)))D.children.length=J-1;else K.value=L;}E.add(D);if(D.name=='pre')z=false;if(D.name=='textarea')y=false;if(D.returnPoint){x=D.returnPoint;delete D.returnPoint;}else x=F?E:G;};t.onTagOpen=function(D,E,F,G){var H=new a.htmlParser.element(D,E);if(H.isUnknown&&F)H.isEmpty=true;H.isOptionalClose=D in m||G;if(p(H)){v.push(H);return;}else if(D=='pre')z=true;else if(D=='br'&&z){x.add(new a.htmlParser.text('\n'));return;}else if(D=='textarea')y=true;if(D=='br'){w.push(H);return;}while(1){var I=x.name,J=I?f[I]||(x._.isBlockLike?f.div:f.span):o;if(!H.isUnknown&&!x.isUnknown&&!J[D]){if(x.isOptionalClose)t.onTagClose(I);else if(D in n&&I in n){var K=x.children,L=K[K.length-1];if(!(L&&L.name=='li'))C(L=new a.htmlParser.element('li'),x);!H.returnPoint&&(H.returnPoint=x);x=L;}else if(D in f.$listItem&&I!=D)t.onTagOpen(D=='li'?'ul':'dl',{},0,1);else if(I in l&&I!=D){!H.returnPoint&&(H.returnPoint=x);
+x=x.parent;}else{if(I in f.$inline)v.unshift(x);if(x.parent)C(x,x.parent,1);else{H.isOrphan=1;break;}}}else break;}A(D);B();H.parent=x;if(H.isEmpty)C(H);else x=H;};t.onTagClose=function(D){for(var E=v.length-1;E>=0;E--){if(D==v[E].name){v.splice(E,1);return;}}var F=[],G=[],H=x;while(H!=u&&H.name!=D){if(!H._.isBlockLike)G.unshift(H);F.push(H);H=H.returnPoint||H.parent;}if(H!=u){for(E=0;E<F.length;E++){var I=F[E];C(I,I.parent);}x=H;if(H._.isBlockLike)B();C(H,H.parent);if(H==x)x=x.parent;v=v.concat(G);}if(D=='body')r=false;};t.onText=function(D){if((!x._.hasInlineStarted||w.length)&&!z&&!y){D=e.ltrim(D);if(D.length===0)return;}var E=x.name,F=E?f[E]||(x._.isBlockLike?f.div:f.span):o;if(!y&&!F['#']&&E in l){t.onTagOpen(E in n?'li':E=='dl'?'dd':E=='table'?'tr':E=='tr'?'td':'');t.onText(D);return;}B();A();if(r&&(!x.type||x.name=='body')&&e.trim(D))this.onTagOpen(r,{},0,1);if(!z&&!y)D=D.replace(/[\t\r\n ]{2,}|[\t\r\n]/g,' ');x.add(new a.htmlParser.text(D));};t.onCDATA=function(D){x.add(new a.htmlParser.cdata(D));};t.onComment=function(D){B();A();x.add(new a.htmlParser.comment(D));};t.parse(q);B(!c&&1);while(x!=u)C(x,x.parent,1);return u;};a.htmlParser.fragment.prototype={add:function(q,r){var t=this;isNaN(r)&&(r=t.children.length);var s=r>0?t.children[r-1]:null;if(s){if(q._.isBlockLike&&s.type==3){s.value=e.rtrim(s.value);if(s.value.length===0){t.children.pop();t.add(q);return;}}s.next=q;}q.previous=s;q.parent=t;t.children.splice(r,0,q);t._.hasInlineStarted=q.type==3||q.type==1&&!q._.isBlockLike;},writeHtml:function(q,r){var s;this.filterChildren=function(){var t=new a.htmlParser.basicWriter();this.writeChildrenHtml.call(this,t,r,true);var u=t.getHtml();this.children=new a.htmlParser.fragment.fromHtml(u).children;s=1;};!this.name&&r&&r.onFragment(this);this.writeChildrenHtml(q,s?null:r);},writeChildrenHtml:function(q,r){for(var s=0;s<this.children.length;s++)this.children[s].writeHtml(q,r);}};})();a.htmlParser.element=function(l,m){var q=this;q.name=l;q.attributes=m||{};q.children=[];var n=l||'',o=n.match(/^cke:(.*)/);o&&(n=o[1]);var p=!!(f.$nonBodyContent[n]||f.$block[n]||f.$listItem[n]||f.$tableContent[n]||f.$nonEditable[n]||n=='br');q.isEmpty=!!f.$empty[l];q.isUnknown=!f[l];q._={isBlockLike:p,hasInlineStarted:q.isEmpty||!p};};a.htmlParser.cssStyle=function(){var l,m=arguments[0],n={};l=m instanceof a.htmlParser.element?m.attributes.style:m;(l||'').replace(/"/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(o,p,q){p=='font-family'&&(q=q.replace(/["']/g,''));
+n[p.toLowerCase()]=q;});return{rules:n,populate:function(o){var p=this.toString();if(p)o instanceof h?o.setAttribute('style',p):o instanceof a.htmlParser.element?o.attributes.style=p:o.style=p;},'toString':function(){var o=[];for(var p in n)n[p]&&o.push(p,':',n[p],';');return o.join('');}};};(function(){var l=function(m,n){m=m[0];n=n[0];return m<n?-1:m>n?1:0;};a.htmlParser.element.prototype={type:1,add:a.htmlParser.fragment.prototype.add,clone:function(){return new a.htmlParser.element(this.name,this.attributes);},writeHtml:function(m,n){var o=this.attributes,p=this,q=p.name,r,s,t,u;p.filterChildren=function(){if(!u){var B=new a.htmlParser.basicWriter();a.htmlParser.fragment.prototype.writeChildrenHtml.call(p,B,n);p.children=new a.htmlParser.fragment.fromHtml(B.getHtml(),0,p.clone()).children;u=1;}};if(n){for(;;){if(!(q=n.onElementName(q)))return;p.name=q;if(!(p=n.onElement(p)))return;p.parent=this.parent;if(p.name==q)break;if(p.type!=1){p.writeHtml(m,n);return;}q=p.name;if(!q){for(var v=0,w=this.children.length;v<w;v++)this.children[v].parent=p.parent;this.writeChildrenHtml.call(p,m,u?null:n);return;}}o=p.attributes;}m.openTag(q,o);var x=[];for(var y=0;y<2;y++)for(r in o){s=r;t=o[r];if(y==1)x.push([r,t]);else if(n){for(;;){if(!(s=n.onAttributeName(r))){delete o[r];break;}else if(s!=r){delete o[r];r=s;continue;}else break;}if(s)if((t=n.onAttribute(p,s,t))===false)delete o[s];else o[s]=t;}}if(m.sortAttributes)x.sort(l);var z=x.length;for(y=0;y<z;y++){var A=x[y];m.attribute(A[0],A[1]);}m.openTagClose(q,p.isEmpty);if(!p.isEmpty){this.writeChildrenHtml.call(p,m,u?null:n);m.closeTag(q);}},writeChildrenHtml:function(m,n){a.htmlParser.fragment.prototype.writeChildrenHtml.apply(this,arguments);}};})();(function(){a.htmlParser.filter=e.createClass({$:function(q){this._={elementNames:[],attributeNames:[],elements:{$length:0},attributes:{$length:0}};if(q)this.addRules(q,10);},proto:{addRules:function(q,r){var s=this;if(typeof r!='number')r=10;m(s._.elementNames,q.elementNames,r);m(s._.attributeNames,q.attributeNames,r);n(s._.elements,q.elements,r);n(s._.attributes,q.attributes,r);s._.text=o(s._.text,q.text,r)||s._.text;s._.comment=o(s._.comment,q.comment,r)||s._.comment;s._.root=o(s._.root,q.root,r)||s._.root;},onElementName:function(q){return l(q,this._.elementNames);},onAttributeName:function(q){return l(q,this._.attributeNames);},onText:function(q){var r=this._.text;return r?r.filter(q):q;},onComment:function(q,r){var s=this._.comment;return s?s.filter(q,r):q;},onFragment:function(q){var r=this._.root;
+return r?r.filter(q):q;},onElement:function(q){var v=this;var r=[v._.elements['^'],v._.elements[q.name],v._.elements.$],s,t;for(var u=0;u<3;u++){s=r[u];if(s){t=s.filter(q,v);if(t===false)return null;if(t&&t!=q)return v.onNode(t);if(q.parent&&!q.name)break;}}return q;},onNode:function(q){var r=q.type;return r==1?this.onElement(q):r==3?new a.htmlParser.text(this.onText(q.value)):r==8?new a.htmlParser.comment(this.onComment(q.value)):null;},onAttribute:function(q,r,s){var t=this._.attributes[r];if(t){var u=t.filter(s,q,this);if(u===false)return false;if(typeof u!='undefined')return u;}return s;}}});function l(q,r){for(var s=0;q&&s<r.length;s++){var t=r[s];q=q.replace(t[0],t[1]);}return q;};function m(q,r,s){if(typeof r=='function')r=[r];var t,u,v=q.length,w=r&&r.length;if(w){for(t=0;t<v&&q[t].pri<s;t++){}for(u=w-1;u>=0;u--){var x=r[u];if(x){x.pri=s;q.splice(t,0,x);}}}};function n(q,r,s){if(r)for(var t in r){var u=q[t];q[t]=o(u,r[t],s);if(!u)q.$length++;}};function o(q,r,s){if(r){r.pri=s;if(q){if(!q.splice){if(q.pri>s)q=[r,q];else q=[q,r];q.filter=p;}else m(q,r,s);return q;}else{r.filter=r;return r;}}};function p(q){var r=q.type||q instanceof a.htmlParser.fragment;for(var s=0;s<this.length;s++){if(r)var t=q.type,u=q.name;var v=this[s],w=v.apply(window,arguments);if(w===false)return w;if(r){if(w&&(w.name!=u||w.type!=t))return w;}else if(typeof w!='string')return w;w!=undefined&&(q=w);}return q;};})();a.htmlParser.basicWriter=e.createClass({$:function(){this._={output:[]};},proto:{openTag:function(l,m){this._.output.push('<',l);},openTagClose:function(l,m){if(m)this._.output.push(' />');else this._.output.push('>');},attribute:function(l,m){if(typeof m=='string')m=e.htmlEncodeAttr(m);this._.output.push(' ',l,'="',m,'"');},closeTag:function(l){this._.output.push('</',l,'>');},text:function(l){this._.output.push(l);},comment:function(l){this._.output.push('<!--',l,'-->');},write:function(l){this._.output.push(l);},reset:function(){this._.output=[];this._.indent=false;},getHtml:function(l){var m=this._.output.join('');if(l)this.reset();return m;}}});delete a.loadFullCore;a.instances={};a.document=new g(document);a.add=function(l){a.instances[l.name]=l;l.on('focus',function(){if(a.currentInstance!=l){a.currentInstance=l;a.fire('currentInstance');}});l.on('blur',function(){if(a.currentInstance==l){a.currentInstance=null;a.fire('currentInstance');}});};a.remove=function(l){delete a.instances[l.name];};a.on('instanceDestroyed',function(){if(e.isEmpty(this.instances))a.fire('reset');
+});a.TRISTATE_ON=1;a.TRISTATE_OFF=2;a.TRISTATE_DISABLED=0;d.comment=function(l,m){if(typeof l=='string')l=(m?m.$:document).createComment(l);d.domObject.call(this,l);};d.comment.prototype=new d.node();e.extend(d.comment.prototype,{type:8,getOuterHtml:function(){return '<!--'+this.$.nodeValue+'-->';}});(function(){var l={address:1,blockquote:1,dl:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,li:1,dt:1,dd:1,legend:1,caption:1},m={body:1,div:1,table:1,tbody:1,tr:1,td:1,th:1,form:1,fieldset:1},n=function(o){var p=o.getChildren();for(var q=0,r=p.count();q<r;q++){var s=p.getItem(q);if(s.type==1&&f.$block[s.getName()])return true;}return false;};d.elementPath=function(o){var u=this;var p=null,q=null,r=[],s=o;while(s){if(s.type==1){if(!u.lastElement)u.lastElement=s;var t=s.getName();if(!q){if(!p&&l[t])p=s;if(m[t])if(!p&&t=='div'&&!n(s))p=s;else q=s;}r.push(s);if(t=='body')break;}s=s.getParent();}u.block=p;u.blockLimit=q;u.elements=r;};})();d.elementPath.prototype={compare:function(l){var m=this.elements,n=l&&l.elements;if(!n||m.length!=n.length)return false;for(var o=0;o<m.length;o++){if(!m[o].equals(n[o]))return false;}return true;},contains:function(l){var m=this.elements;for(var n=0;n<m.length;n++){if(m[n].getName() in l)return m[n];}return null;}};d.text=function(l,m){if(typeof l=='string')l=(m?m.$:document).createTextNode(l);this.$=l;};d.text.prototype=new d.node();e.extend(d.text.prototype,{type:3,getLength:function(){return this.$.nodeValue.length;},getText:function(){return this.$.nodeValue;},setText:function(l){this.$.nodeValue=l;},split:function(l){var q=this;if(c&&l==q.getLength()){var m=q.getDocument().createText('');m.insertAfter(q);return m;}var n=q.getDocument(),o=new d.text(q.$.splitText(l),n);if(b.ie8){var p=new d.text('',n);p.insertAfter(o);p.remove();}return o;},substring:function(l,m){if(typeof m!='number')return this.$.nodeValue.substr(l);else return this.$.nodeValue.substring(l,m);}});d.documentFragment=function(l){l=l||a.document;this.$=l.$.createDocumentFragment();};e.extend(d.documentFragment.prototype,h.prototype,{type:11,insertAfterNode:function(l){l=l.$;l.parentNode.insertBefore(this.$,l.nextSibling);}},true,{append:1,appendBogus:1,getFirst:1,getLast:1,appendTo:1,moveChildren:1,insertBefore:1,insertAfterNode:1,replace:1,trim:1,type:1,ltrim:1,rtrim:1,getDocument:1,getChildCount:1,getChild:1,getChildren:1});(function(){function l(s,t){var u=this.range;if(this._.end)return null;if(!this._.start){this._.start=1;if(u.collapsed){this.end();return null;
+}u.optimize();}var v,w=u.startContainer,x=u.endContainer,y=u.startOffset,z=u.endOffset,A,B=this.guard,C=this.type,D=s?'getPreviousSourceNode':'getNextSourceNode';if(!s&&!this._.guardLTR){var E=x.type==1?x:x.getParent(),F=x.type==1?x.getChild(z):x.getNext();this._.guardLTR=function(J,K){return(!K||!E.equals(J))&&(!F||!J.equals(F))&&(J.type!=1||!K||J.getName()!='body');};}if(s&&!this._.guardRTL){var G=w.type==1?w:w.getParent(),H=w.type==1?y?w.getChild(y-1):null:w.getPrevious();this._.guardRTL=function(J,K){return(!K||!G.equals(J))&&(!H||!J.equals(H))&&(J.type!=1||!K||J.getName()!='body');};}var I=s?this._.guardRTL:this._.guardLTR;if(B)A=function(J,K){if(I(J,K)===false)return false;return B(J,K);};else A=I;if(this.current)v=this.current[D](false,C,A);else{if(s){v=x;if(v.type==1)if(z>0)v=v.getChild(z-1);else v=A(v,true)===false?null:v.getPreviousSourceNode(true,C,A);}else{v=w;if(v.type==1)if(!(v=v.getChild(y)))v=A(w,true)===false?null:w.getNextSourceNode(true,C,A);}if(v&&A(v)===false)v=null;}while(v&&!this._.end){this.current=v;if(!this.evaluator||this.evaluator(v)!==false){if(!t)return v;}else if(t&&this.evaluator)return false;v=v[D](false,C,A);}this.end();return this.current=null;};function m(s){var t,u=null;while(t=l.call(this,s))u=t;return u;};d.walker=e.createClass({$:function(s){this.range=s;this._={};},proto:{end:function(){this._.end=1;},next:function(){return l.call(this);},previous:function(){return l.call(this,1);},checkForward:function(){return l.call(this,0,1)!==false;},checkBackward:function(){return l.call(this,1,1)!==false;},lastForward:function(){return m.call(this);},lastBackward:function(){return m.call(this,1);},reset:function(){delete this.current;this._={};}}});var n={block:1,'list-item':1,table:1,'table-row-group':1,'table-header-group':1,'table-footer-group':1,'table-row':1,'table-column-group':1,'table-column':1,'table-cell':1,'table-caption':1};h.prototype.isBlockBoundary=function(s){var t=s?e.extend({},f.$block,s||{}):f.$block;return this.getComputedStyle('float')=='none'&&n[this.getComputedStyle('display')]||t[this.getName()];};d.walker.blockBoundary=function(s){return function(t,u){return!(t.type==1&&t.isBlockBoundary(s));};};d.walker.listItemBoundary=function(){return this.blockBoundary({br:1});};d.walker.bookmark=function(s,t){function u(v){return v&&v.getName&&v.getName()=='span'&&v.data('cke-bookmark');};return function(v){var w,x;w=v&&!v.getName&&(x=v.getParent())&&u(x);w=s?w:w||u(v);return!!(t^w);};};d.walker.whitespaces=function(s){return function(t){var u=t&&t.type==3&&!e.trim(t.getText());
+return!!(s^u);};};d.walker.invisible=function(s){var t=d.walker.whitespaces();return function(u){var v=t(u)||u.is&&!u.$.offsetHeight;return!!(s^v);};};d.walker.nodeType=function(s,t){return function(u){return!!(t^u.type==s);};};d.walker.bogus=function(s){function t(u){return!p(u)&&!q(u);};return function(u){var v=!c?u.is&&u.is('br'):u.getText&&o.test(u.getText());if(v){var w=u.getParent(),x=u.getNext(t);v=w.isBlockBoundary()&&(!x||x.type==1&&x.isBlockBoundary());}return!!(s^v);};};var o=/^[\t\r\n ]*(?: |\xa0)$/,p=d.walker.whitespaces(),q=d.walker.bookmark(),r=function(s){return q(s)||p(s)||s.type==1&&s.getName() in f.$inline&&!(s.getName() in f.$empty);};h.prototype.getBogus=function(){var s=this;do s=s.getPreviousSourceNode();while(r(s));if(s&&(!c?s.is&&s.is('br'):s.getText&&o.test(s.getText())))return s;return false;};})();d.range=function(l){var m=this;m.startContainer=null;m.startOffset=null;m.endContainer=null;m.endOffset=null;m.collapsed=true;m.document=l;};(function(){var l=function(u){u.collapsed=u.startContainer&&u.endContainer&&u.startContainer.equals(u.endContainer)&&u.startOffset==u.endOffset;},m=function(u,v,w,x){u.optimizeBookmark();var y=u.startContainer,z=u.endContainer,A=u.startOffset,B=u.endOffset,C,D;if(z.type==3)z=z.split(B);else if(z.getChildCount()>0)if(B>=z.getChildCount()){z=z.append(u.document.createText(''));D=true;}else z=z.getChild(B);if(y.type==3){y.split(A);if(y.equals(z))z=y.getNext();}else if(!A){y=y.getFirst().insertBeforeMe(u.document.createText(''));C=true;}else if(A>=y.getChildCount()){y=y.append(u.document.createText(''));C=true;}else y=y.getChild(A).getPrevious();var E=y.getParents(),F=z.getParents(),G,H,I;for(G=0;G<E.length;G++){H=E[G];I=F[G];if(!H.equals(I))break;}var J=w,K,L,M,N;for(var O=G;O<E.length;O++){K=E[O];if(J&&!K.equals(y))L=J.append(K.clone());M=K.getNext();while(M){if(M.equals(F[O])||M.equals(z))break;N=M.getNext();if(v==2)J.append(M.clone(true));else{M.remove();if(v==1)J.append(M);}M=N;}if(J)J=L;}J=w;for(var P=G;P<F.length;P++){K=F[P];if(v>0&&!K.equals(z))L=J.append(K.clone());if(!E[P]||K.$.parentNode!=E[P].$.parentNode){M=K.getPrevious();while(M){if(M.equals(E[P])||M.equals(y))break;N=M.getPrevious();if(v==2)J.$.insertBefore(M.$.cloneNode(true),J.$.firstChild);else{M.remove();if(v==1)J.$.insertBefore(M.$,J.$.firstChild);}M=N;}}if(J)J=L;}if(v==2){var Q=u.startContainer;if(Q.type==3){Q.$.data+=Q.$.nextSibling.data;Q.$.parentNode.removeChild(Q.$.nextSibling);}var R=u.endContainer;if(R.type==3&&R.$.nextSibling){R.$.data+=R.$.nextSibling.data;
+R.$.parentNode.removeChild(R.$.nextSibling);}}else{if(H&&I&&(y.$.parentNode!=H.$.parentNode||z.$.parentNode!=I.$.parentNode)){var S=I.getIndex();if(C&&I.$.parentNode==y.$.parentNode)S--;if(x&&H.type==1){var T=h.createFromHtml('<span data-cke-bookmark="1" style="display:none"> </span>',u.document);T.insertAfter(H);H.mergeSiblings(false);u.moveToBookmark({startNode:T});}else u.setStart(I.getParent(),S);}u.collapse(true);}if(C)y.remove();if(D&&z.$.parentNode)z.remove();},n={abbr:1,acronym:1,b:1,bdo:1,big:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,ins:1,label:1,kbd:1,q:1,samp:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,tt:1,u:1,'var':1};function o(u){var v=false,w=d.walker.bookmark(true),x=/^[\t\r\n ]*(?: |\xa0)$/;return function(y){if(w(y))return true;if(y.type==3){if(c&&x.test(y.getText())&&!v&&!(u&&y.getNext()))v=true;else if(y.hasAscendant('pre')||e.trim(y.getText()).length)return false;}else if(y.type==1)if(!n[y.getName()])if(!c&&y.is('br')&&!v&&!(u&&y.getNext()))v=true;else return false;return true;};};var p=d.walker.bogus();function q(u){return function(v){return!u&&p(v)||(v.type==3?!e.trim(v.getText())||!!v.getParent().data('cke-bookmark'):v.getName() in f.$removeEmpty);};};var r=new d.walker.whitespaces(),s=new d.walker.bookmark();function t(u){return!r(u)&&!s(u);};d.range.prototype={clone:function(){var v=this;var u=new d.range(v.document);u.startContainer=v.startContainer;u.startOffset=v.startOffset;u.endContainer=v.endContainer;u.endOffset=v.endOffset;u.collapsed=v.collapsed;return u;},collapse:function(u){var v=this;if(u){v.endContainer=v.startContainer;v.endOffset=v.startOffset;}else{v.startContainer=v.endContainer;v.startOffset=v.endOffset;}v.collapsed=true;},cloneContents:function(){var u=new d.documentFragment(this.document);if(!this.collapsed)m(this,2,u);return u;},deleteContents:function(u){if(this.collapsed)return;m(this,0,null,u);},extractContents:function(u){var v=new d.documentFragment(this.document);if(!this.collapsed)m(this,1,v,u);return v;},createBookmark:function(u){var A=this;var v,w,x,y,z=A.collapsed;v=A.document.createElement('span');v.data('cke-bookmark',1);v.setStyle('display','none');v.setHtml(' ');if(u){x='cke_bm_'+e.getNextNumber();v.setAttribute('id',x+(z?'C':'S'));}if(!z){w=v.clone();w.setHtml(' ');if(u)w.setAttribute('id',x+'E');y=A.clone();y.collapse();y.insertNode(w);}y=A.clone();y.collapse(true);y.insertNode(v);if(w){A.setStartAfter(v);A.setEndBefore(w);}else A.moveToPosition(v,4);return{startNode:u?x+(z?'C':'S'):v,endNode:u?x+'E':w,serializable:u,collapsed:z};
+},createBookmark2:function(u){var C=this;var v=C.startContainer,w=C.endContainer,x=C.startOffset,y=C.endOffset,z=C.collapsed,A,B;if(!v||!w)return{start:0,end:0};if(u){if(v.type==1){A=v.getChild(x);if(A&&A.type==3&&x>0&&A.getPrevious().type==3){v=A;x=0;}if(A&&A.type==1)x=A.getIndex(1);}while(v.type==3&&(B=v.getPrevious())&&B.type==3){v=B;x+=B.getLength();}if(!z){if(w.type==1){A=w.getChild(y);if(A&&A.type==3&&y>0&&A.getPrevious().type==3){w=A;y=0;}if(A&&A.type==1)y=A.getIndex(1);}while(w.type==3&&(B=w.getPrevious())&&B.type==3){w=B;y+=B.getLength();}}}return{start:v.getAddress(u),end:z?null:w.getAddress(u),startOffset:x,endOffset:y,normalized:u,collapsed:z,is2:true};},moveToBookmark:function(u){var C=this;if(u.is2){var v=C.document.getByAddress(u.start,u.normalized),w=u.startOffset,x=u.end&&C.document.getByAddress(u.end,u.normalized),y=u.endOffset;C.setStart(v,w);if(x)C.setEnd(x,y);else C.collapse(true);}else{var z=u.serializable,A=z?C.document.getById(u.startNode):u.startNode,B=z?C.document.getById(u.endNode):u.endNode;C.setStartBefore(A);A.remove();if(B){C.setEndBefore(B);B.remove();}else C.collapse(true);}},getBoundaryNodes:function(){var z=this;var u=z.startContainer,v=z.endContainer,w=z.startOffset,x=z.endOffset,y;if(u.type==1){y=u.getChildCount();if(y>w)u=u.getChild(w);else if(y<1)u=u.getPreviousSourceNode();else{u=u.$;while(u.lastChild)u=u.lastChild;u=new d.node(u);u=u.getNextSourceNode()||u;}}if(v.type==1){y=v.getChildCount();if(y>x)v=v.getChild(x).getPreviousSourceNode(true);else if(y<1)v=v.getPreviousSourceNode();else{v=v.$;while(v.lastChild)v=v.lastChild;v=new d.node(v);}}if(u.getPosition(v)&2)u=v;return{startNode:u,endNode:v};},getCommonAncestor:function(u,v){var z=this;var w=z.startContainer,x=z.endContainer,y;if(w.equals(x)){if(u&&w.type==1&&z.startOffset==z.endOffset-1)y=w.getChild(z.startOffset);else y=w;}else y=w.getCommonAncestor(x);return v&&!y.is?y.getParent():y;},optimize:function(){var w=this;var u=w.startContainer,v=w.startOffset;if(u.type!=1)if(!v)w.setStartBefore(u);else if(v>=u.getLength())w.setStartAfter(u);u=w.endContainer;v=w.endOffset;if(u.type!=1)if(!v)w.setEndBefore(u);else if(v>=u.getLength())w.setEndAfter(u);},optimizeBookmark:function(){var w=this;var u=w.startContainer,v=w.endContainer;if(u.is&&u.is('span')&&u.data('cke-bookmark'))w.setStartAt(u,3);if(v&&v.is&&v.is('span')&&v.data('cke-bookmark'))w.setEndAt(v,4);},trim:function(u,v){var C=this;var w=C.startContainer,x=C.startOffset,y=C.collapsed;if((!u||y)&&w&&w.type==3){if(!x){x=w.getIndex();
+w=w.getParent();}else if(x>=w.getLength()){x=w.getIndex()+1;w=w.getParent();}else{var z=w.split(x);x=w.getIndex()+1;w=w.getParent();if(C.startContainer.equals(C.endContainer))C.setEnd(z,C.endOffset-C.startOffset);else if(w.equals(C.endContainer))C.endOffset+=1;}C.setStart(w,x);if(y){C.collapse(true);return;}}var A=C.endContainer,B=C.endOffset;if(!(v||y)&&A&&A.type==3){if(!B){B=A.getIndex();A=A.getParent();}else if(B>=A.getLength()){B=A.getIndex()+1;A=A.getParent();}else{A.split(B);B=A.getIndex()+1;A=A.getParent();}C.setEnd(A,B);}},enlarge:function(u,v){switch(u){case 1:if(this.collapsed)return;var w=this.getCommonAncestor(),x=this.document.getBody(),y,z,A,B,C,D=false,E,F,G=this.startContainer,H=this.startOffset;if(G.type==3){if(H){G=!e.trim(G.substring(0,H)).length&&G;D=!!G;}if(G)if(!(B=G.getPrevious()))A=G.getParent();}else{if(H)B=G.getChild(H-1)||G.getLast();if(!B)A=G;}while(A||B){if(A&&!B){if(!C&&A.equals(w))C=true;if(!x.contains(A))break;if(!D||A.getComputedStyle('display')!='inline'){D=false;if(C)y=A;else this.setStartBefore(A);}B=A.getPrevious();}while(B){E=false;if(B.type==8){B=B.getPrevious();continue;}else if(B.type==3){F=B.getText();if(/[^\s\ufeff]/.test(F))B=null;E=/[\s\ufeff]$/.test(F);}else if((B.$.offsetWidth>0||v&&B.is('br'))&&!B.data('cke-bookmark'))if(D&&f.$removeEmpty[B.getName()]){F=B.getText();if(/[^\s\ufeff]/.test(F))B=null;else{var I=B.$.getElementsByTagName('*');for(var J=0,K;K=I[J++];){if(!f.$removeEmpty[K.nodeName.toLowerCase()]){B=null;break;}}}if(B)E=!!F.length;}else B=null;if(E)if(D){if(C)y=A;else if(A)this.setStartBefore(A);}else D=true;if(B){var L=B.getPrevious();if(!A&&!L){A=B;B=null;break;}B=L;}else A=null;}if(A)A=A.getParent();}G=this.endContainer;H=this.endOffset;A=B=null;C=D=false;if(G.type==3){G=!e.trim(G.substring(H)).length&&G;D=!(G&&G.getLength());if(G)if(!(B=G.getNext()))A=G.getParent();}else{B=G.getChild(H);if(!B)A=G;}while(A||B){if(A&&!B){if(!C&&A.equals(w))C=true;if(!x.contains(A))break;if(!D||A.getComputedStyle('display')!='inline'){D=false;if(C)z=A;else if(A)this.setEndAfter(A);}B=A.getNext();}while(B){E=false;if(B.type==3){F=B.getText();if(/[^\s\ufeff]/.test(F))B=null;E=/^[\s\ufeff]/.test(F);}else if(B.type==1){if((B.$.offsetWidth>0||v&&B.is('br'))&&!B.data('cke-bookmark'))if(D&&f.$removeEmpty[B.getName()]){F=B.getText();if(/[^\s\ufeff]/.test(F))B=null;else{I=B.$.getElementsByTagName('*');for(J=0;K=I[J++];){if(!f.$removeEmpty[K.nodeName.toLowerCase()]){B=null;break;}}}if(B)E=!!F.length;}else B=null;}else E=1;if(E)if(D)if(C)z=A;
+else this.setEndAfter(A);if(B){L=B.getNext();if(!A&&!L){A=B;B=null;break;}B=L;}else A=null;}if(A)A=A.getParent();}if(y&&z){w=y.contains(z)?z:y;this.setStartBefore(w);this.setEndAfter(w);}break;case 2:case 3:var M=new d.range(this.document);x=this.document.getBody();M.setStartAt(x,1);M.setEnd(this.startContainer,this.startOffset);var N=new d.walker(M),O,P,Q=d.walker.blockBoundary(u==3?{br:1}:null),R=function(X){var Y=Q(X);if(!Y)O=X;return Y;},S=function(X){var Y=R(X);if(!Y&&X.is&&X.is('br'))P=X;return Y;};N.guard=R;A=N.lastBackward();O=O||x;this.setStartAt(O,!O.is('br')&&(!A&&this.checkStartOfBlock()||A&&O.contains(A))?1:4);if(u==3){var T=this.clone();N=new d.walker(T);var U=d.walker.whitespaces(),V=d.walker.bookmark();N.evaluator=function(X){return!U(X)&&!V(X);};var W=N.previous();if(W&&W.type==1&&W.is('br'))return;}M=this.clone();M.collapse();M.setEndAt(x,2);N=new d.walker(M);N.guard=u==3?S:R;O=null;A=N.lastForward();O=O||x;this.setEndAt(O,!A&&this.checkEndOfBlock()||A&&O.contains(A)?2:3);if(P)this.setEndAfter(P);}},shrink:function(u,v){if(!this.collapsed){u=u||2;var w=this.clone(),x=this.startContainer,y=this.endContainer,z=this.startOffset,A=this.endOffset,B=this.collapsed,C=1,D=1;if(x&&x.type==3)if(!z)w.setStartBefore(x);else if(z>=x.getLength())w.setStartAfter(x);else{w.setStartBefore(x);C=0;}if(y&&y.type==3)if(!A)w.setEndBefore(y);else if(A>=y.getLength())w.setEndAfter(y);else{w.setEndAfter(y);D=0;}var E=new d.walker(w),F=d.walker.bookmark();E.evaluator=function(J){return J.type==(u==1?1:3);};var G;E.guard=function(J,K){if(F(J))return true;if(u==1&&J.type==3)return false;if(K&&J.equals(G))return false;if(!K&&J.type==1)G=J;return true;};if(C){var H=E[u==1?'lastForward':'next']();H&&this.setStartAt(H,v?1:3);}if(D){E.reset();var I=E[u==1?'lastBackward':'previous']();I&&this.setEndAt(I,v?2:4);}return!!(C||D);}},insertNode:function(u){var y=this;y.optimizeBookmark();y.trim(false,true);var v=y.startContainer,w=y.startOffset,x=v.getChild(w);if(x)u.insertBefore(x);else v.append(u);if(u.getParent().equals(y.endContainer))y.endOffset++;y.setStartBefore(u);},moveToPosition:function(u,v){this.setStartAt(u,v);this.collapse(true);},selectNodeContents:function(u){this.setStart(u,0);this.setEnd(u,u.type==3?u.getLength():u.getChildCount());},setStart:function(u,v){var w=this;if(u.type==1&&f.$empty[u.getName()])v=u.getIndex(),u=u.getParent();w.startContainer=u;w.startOffset=v;if(!w.endContainer){w.endContainer=u;w.endOffset=v;}l(w);},setEnd:function(u,v){var w=this;if(u.type==1&&f.$empty[u.getName()])v=u.getIndex()+1,u=u.getParent();
+w.endContainer=u;w.endOffset=v;if(!w.startContainer){w.startContainer=u;w.startOffset=v;}l(w);},setStartAfter:function(u){this.setStart(u.getParent(),u.getIndex()+1);},setStartBefore:function(u){this.setStart(u.getParent(),u.getIndex());},setEndAfter:function(u){this.setEnd(u.getParent(),u.getIndex()+1);},setEndBefore:function(u){this.setEnd(u.getParent(),u.getIndex());},setStartAt:function(u,v){var w=this;switch(v){case 1:w.setStart(u,0);break;case 2:if(u.type==3)w.setStart(u,u.getLength());else w.setStart(u,u.getChildCount());break;case 3:w.setStartBefore(u);break;case 4:w.setStartAfter(u);}l(w);},setEndAt:function(u,v){var w=this;switch(v){case 1:w.setEnd(u,0);break;case 2:if(u.type==3)w.setEnd(u,u.getLength());else w.setEnd(u,u.getChildCount());break;case 3:w.setEndBefore(u);break;case 4:w.setEndAfter(u);}l(w);},fixBlock:function(u,v){var y=this;var w=y.createBookmark(),x=y.document.createElement(v);y.collapse(u);y.enlarge(2);y.extractContents().appendTo(x);x.trim();if(!c)x.appendBogus();y.insertNode(x);y.moveToBookmark(w);return x;},splitBlock:function(u){var E=this;var v=new d.elementPath(E.startContainer),w=new d.elementPath(E.endContainer),x=v.blockLimit,y=w.blockLimit,z=v.block,A=w.block,B=null;if(!x.equals(y))return null;if(u!='br'){if(!z){z=E.fixBlock(true,u);A=new d.elementPath(E.endContainer).block;}if(!A)A=E.fixBlock(false,u);}var C=z&&E.checkStartOfBlock(),D=A&&E.checkEndOfBlock();E.deleteContents();if(z&&z.equals(A))if(D){B=new d.elementPath(E.startContainer);E.moveToPosition(A,4);A=null;}else if(C){B=new d.elementPath(E.startContainer);E.moveToPosition(z,3);z=null;}else{A=E.splitElement(z);if(!c&&!z.is('ul','ol'))z.appendBogus();}return{previousBlock:z,nextBlock:A,wasStartOfBlock:C,wasEndOfBlock:D,elementPath:B};},splitElement:function(u){var x=this;if(!x.collapsed)return null;x.setEndAt(u,2);var v=x.extractContents(),w=u.clone(false);v.appendTo(w);w.insertAfter(u);x.moveToPosition(u,4);return w;},checkBoundaryOfElement:function(u,v){var w=v==1,x=this.clone();x.collapse(w);x[w?'setStartAt':'setEndAt'](u,w?1:2);var y=new d.walker(x);y.evaluator=q(w);return y[w?'checkBackward':'checkForward']();},checkStartOfBlock:function(){var A=this;var u=A.startContainer,v=A.startOffset;if(v&&u.type==3){var w=e.ltrim(u.substring(0,v));if(w.length)return false;}var x=new d.elementPath(A.startContainer),y=A.clone();y.collapse(true);y.setStartAt(x.block||x.blockLimit,1);var z=new d.walker(y);z.evaluator=o(true);return z.checkBackward();},checkEndOfBlock:function(){var A=this;
+var u=A.endContainer,v=A.endOffset;if(u.type==3){var w=e.rtrim(u.substring(v));if(w.length)return false;}var x=new d.elementPath(A.endContainer),y=A.clone();y.collapse(false);y.setEndAt(x.block||x.blockLimit,2);var z=new d.walker(y);z.evaluator=o(false);return z.checkForward();},checkReadOnly:(function(){function u(v,w){while(v){if(v.type==1)if(v.getAttribute('contentEditable')=='false'&&!v.data('cke-editable'))return 0;else if(v.is('html')||v.getAttribute('contentEditable')=='true'&&(v.contains(w)||v.equals(w)))break;v=v.getParent();}return 1;};return function(){var v=this.startContainer,w=this.endContainer;return!(u(v,w)&&u(w,v));};})(),moveToElementEditablePosition:function(u,v){var w=/^[\t\r\n ]*(?: |\xa0)$/;function x(z,A){var B;if(z.type==1&&z.isEditable(false))B=z[v?'getLast':'getFirst'](t);if(!A&&!B)B=z[v?'getPrevious':'getNext'](t);return B;};if(u.type==1&&!u.isEditable(false)){this.moveToPosition(u,v?4:3);return true;}var y=0;while(u){if(u.type==3){if(v&&this.checkEndOfBlock()&&w.test(u.getText()))this.moveToPosition(u,3);else this.moveToPosition(u,v?4:3);y=1;break;}if(u.type==1)if(u.isEditable()){this.moveToPosition(u,v?2:1);y=1;}else if(v&&u.is('br')&&this.checkEndOfBlock())this.moveToPosition(u,3);u=x(u,y);}return!!y;},moveToElementEditStart:function(u){return this.moveToElementEditablePosition(u);},moveToElementEditEnd:function(u){return this.moveToElementEditablePosition(u,true);},getEnclosedNode:function(){var u=this.clone();u.optimize();if(u.startContainer.type!=1||u.endContainer.type!=1)return null;var v=new d.walker(u),w=d.walker.bookmark(true),x=d.walker.whitespaces(true),y=function(A){return x(A)&&w(A);};u.evaluator=y;var z=v.next();v.reset();return z&&z.equals(v.previous())?z:null;},getTouchedStartNode:function(){var u=this.startContainer;if(this.collapsed||u.type!=1)return u;return u.getChild(this.startOffset)||u;},getTouchedEndNode:function(){var u=this.endContainer;if(this.collapsed||u.type!=1)return u;return u.getChild(this.endOffset-1)||u;}};})();a.POSITION_AFTER_START=1;a.POSITION_BEFORE_END=2;a.POSITION_BEFORE_START=3;a.POSITION_AFTER_END=4;a.ENLARGE_ELEMENT=1;a.ENLARGE_BLOCK_CONTENTS=2;a.ENLARGE_LIST_ITEM_CONTENTS=3;a.START=1;a.END=2;a.STARTEND=3;a.SHRINK_ELEMENT=1;a.SHRINK_TEXT=2;(function(){d.rangeList=function(n){if(n instanceof d.rangeList)return n;if(!n)n=[];else if(n instanceof d.range)n=[n];return e.extend(n,l);};var l={createIterator:function(){var n=this,o=d.walker.bookmark(),p=function(s){return!(s.is&&s.is('tr'));
+},q=[],r;return{getNextRange:function(s){r=r==undefined?0:r+1;var t=n[r];if(t&&n.length>1){if(!r)for(var u=n.length-1;u>=0;u--)q.unshift(n[u].createBookmark(true));if(s){var v=0;while(n[r+v+1]){var w=t.document,x=0,y=w.getById(q[v].endNode),z=w.getById(q[v+1].startNode),A;while(1){A=y.getNextSourceNode(false);if(!z.equals(A)){if(o(A)||A.type==1&&A.isBlockBoundary()){y=A;continue;}}else x=1;break;}if(!x)break;v++;}}t.moveToBookmark(q.shift());while(v--){A=n[++r];A.moveToBookmark(q.shift());t.setEnd(A.endContainer,A.endOffset);}}return t;}};},createBookmarks:function(n){var s=this;var o=[],p;for(var q=0;q<s.length;q++){o.push(p=s[q].createBookmark(n,true));for(var r=q+1;r<s.length;r++){s[r]=m(p,s[r]);s[r]=m(p,s[r],true);}}return o;},createBookmarks2:function(n){var o=[];for(var p=0;p<this.length;p++)o.push(this[p].createBookmark2(n));return o;},moveToBookmarks:function(n){for(var o=0;o<this.length;o++)this[o].moveToBookmark(n[o]);}};function m(n,o,p){var q=n.serializable,r=o[p?'endContainer':'startContainer'],s=p?'endOffset':'startOffset',t=q?o.document.getById(n.startNode):n.startNode,u=q?o.document.getById(n.endNode):n.endNode;if(r.equals(t.getPrevious())){o.startOffset=o.startOffset-r.getLength()-u.getPrevious().getLength();r=u.getNext();}else if(r.equals(u.getPrevious())){o.startOffset=o.startOffset-r.getLength();r=u.getNext();}r.equals(t.getParent())&&o[s]++;r.equals(u.getParent())&&o[s]++;o[p?'endContainer':'startContainer']=r;return o;};})();(function(){if(b.webkit){b.hc=false;return;}var l=h.createFromHtml('<div style="width:0px;height:0px;position:absolute;left:-10000px;border: 1px solid;border-color: red blue;"></div>',a.document);l.appendTo(a.document.getHead());try{b.hc=l.getComputedStyle('border-top-color')==l.getComputedStyle('border-right-color');}catch(m){b.hc=false;}if(b.hc)b.cssClass+=' cke_hc';l.remove();})();j.load(i.corePlugins.split(','),function(){a.status='loaded';a.fire('loaded');var l=a._.pending;if(l){delete a._.pending;for(var m=0;m<l.length;m++)a.add(l[m]);}});if(c)try{document.execCommand('BackgroundImageCache',false,true);}catch(l){}a.skins.add('kama',(function(){var m='cke_ui_color';return{editor:{css:['editor.css']},dialog:{css:['dialog.css']},richcombo:{canGroup:false},templates:{css:['templates.css']},margins:[0,0,0,0],init:function(n){if(n.config.width&&!isNaN(n.config.width))n.config.width-=12;var o=[],p=/\$color/g,q='/* UI Color Support */.cke_skin_kama .cke_menuitem .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuitem a:hover .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:focus .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:active .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuitem a:hover .cke_label,.cke_skin_kama .cke_menuitem a:focus .cke_label,.cke_skin_kama .cke_menuitem a:active .cke_label{\tbackground-color: $color !important;}.cke_skin_kama .cke_menuitem a.cke_disabled:hover .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:focus .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:active .cke_label{\tbackground-color: transparent !important;}.cke_skin_kama .cke_menuitem a.cke_disabled:hover .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a.cke_disabled:focus .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a.cke_disabled:active .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuitem a.cke_disabled .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuseparator{\tbackground-color: $color !important;}.cke_skin_kama .cke_menuitem a:hover,.cke_skin_kama .cke_menuitem a:focus,.cke_skin_kama .cke_menuitem a:active{\tbackground-color: $color !important;}';
+if(b.webkit){q=q.split('}').slice(0,-1);for(var r=0;r<q.length;r++)q[r]=q[r].split('{');}function s(v){var w=v.getById(m);if(!w){w=v.getHead().append('style');w.setAttribute('id',m);w.setAttribute('type','text/css');}return w;};function t(v,w,x){var y,z,A;for(var B=0;B<v.length;B++){if(b.webkit)for(z=0;z<w.length;z++){A=w[z][1];for(y=0;y<x.length;y++)A=A.replace(x[y][0],x[y][1]);v[B].$.sheet.addRule(w[z][0],A);}else{A=w;for(y=0;y<x.length;y++)A=A.replace(x[y][0],x[y][1]);if(c)v[B].$.styleSheet.cssText+=A;else v[B].$.innerHTML+=A;}}};var u=/\$color/g;e.extend(n,{uiColor:null,getUiColor:function(){return this.uiColor;},setUiColor:function(v){var w,x=s(a.document),y='.'+n.id,z=[y+' .cke_wrapper',y+'_dialog .cke_dialog_contents',y+'_dialog a.cke_dialog_tab',y+'_dialog .cke_dialog_footer'].join(','),A='background-color: $color !important;';if(b.webkit)w=[[z,A]];else w=z+'{'+A+'}';return(this.setUiColor=function(B){var C=[[u,B]];n.uiColor=B;t([x],w,C);t(o,q,C);})(v);}});n.on('menuShow',function(v){var w=v.data[0],x=w.element.getElementsByTag('iframe').getItem(0).getFrameDocument();if(!x.getById('cke_ui_color')){var y=s(x);o.push(y);var z=n.getUiColor();if(z)t([y],q,[[u,z]]);}});if(n.config.uiColor)n.setUiColor(n.config.uiColor);}};})());(function(){a.dialog?m():a.on('dialogPluginReady',m);function m(){a.dialog.on('resize',function(n){var o=n.data,p=o.width,q=o.height,r=o.dialog,s=r.parts.contents;if(o.skin!='kama')return;s.setStyles({width:p+'px',height:q+'px'});});};})();j.add('about',{requires:['dialog'],init:function(m){var n=m.addCommand('about',new a.dialogCommand('about'));n.modes={wysiwyg:1,source:1};n.canUndo=false;n.readOnly=1;m.ui.addButton('About',{label:m.lang.about.title,command:'about'});a.dialog.add('about',this.path+'dialogs/about.js');}});(function(){var m='a11yhelp',n='a11yHelp';j.add(m,{requires:['dialog'],availableLangs:{cs:1,cy:1,da:1,de:1,el:1,en:1,eo:1,fa:1,fi:1,fr:1,gu:1,he:1,it:1,mk:1,nb:1,nl:1,no:1,'pt-br':1,ro:1,tr:1,ug:1,vi:1,'zh-cn':1},init:function(o){var p=this;o.addCommand(n,{exec:function(){var q=o.langCode;q=p.availableLangs[q]?q:'en';a.scriptLoader.load(a.getUrl(p.path+'lang/'+q+'.js'),function(){e.extend(o.lang,p.langEntries[q]);o.openDialog(n);});},modes:{wysiwyg:1,source:1},readOnly:1,canUndo:false});a.dialog.add(n,this.path+'dialogs/a11yhelp.js');}});})();j.add('basicstyles',{requires:['styles','button'],init:function(m){var n=function(q,r,s,t){var u=new a.style(t);m.attachStyleStateChange(u,function(v){!m.readOnly&&m.getCommand(s).setState(v);
+});m.addCommand(s,new a.styleCommand(u));m.ui.addButton(q,{label:r,command:s});},o=m.config,p=m.lang;n('Bold',p.bold,'bold',o.coreStyles_bold);n('Italic',p.italic,'italic',o.coreStyles_italic);n('Underline',p.underline,'underline',o.coreStyles_underline);n('Strike',p.strike,'strike',o.coreStyles_strike);n('Subscript',p.subscript,'subscript',o.coreStyles_subscript);n('Superscript',p.superscript,'superscript',o.coreStyles_superscript);}});i.coreStyles_bold={element:'strong',overrides:'b'};i.coreStyles_italic={element:'em',overrides:'i'};i.coreStyles_underline={element:'u'};i.coreStyles_strike={element:'strike'};i.coreStyles_subscript={element:'sub'};i.coreStyles_superscript={element:'sup'};(function(){var m={table:1,ul:1,ol:1,blockquote:1,div:1},n={},o={};e.extend(n,m,{tr:1,p:1,div:1,li:1});e.extend(o,n,{td:1});function p(B){q(B);r(B);};function q(B){var C=B.editor,D=B.data.path;if(C.readOnly)return;var E=C.config.useComputedState,F;E=E===undefined||E;if(!E)F=s(D.lastElement);F=F||D.block||D.blockLimit;if(F.is('body')){var G=C.getSelection().getRanges()[0].getEnclosedNode();G&&G.type==1&&(F=G);}if(!F)return;var H=E?F.getComputedStyle('direction'):F.getStyle('direction')||F.getAttribute('dir');C.getCommand('bidirtl').setState(H=='rtl'?1:2);C.getCommand('bidiltr').setState(H=='ltr'?1:2);};function r(B){var C=B.editor,D=B.data.path.block||B.data.path.blockLimit;C.fire('contentDirChanged',D?D.getComputedStyle('direction'):C.lang.dir);};function s(B){while(B&&!(B.getName() in o||B.is('body'))){var C=B.getParent();if(!C)break;B=C;}return B;};function t(B,C,D,E){if(B.isReadOnly())return;h.setMarker(E,B,'bidi_processed',1);var F=B;while((F=F.getParent())&&!F.is('body')){if(F.getCustomData('bidi_processed')){B.removeStyle('direction');B.removeAttribute('dir');return;}}var G='useComputedState' in D.config?D.config.useComputedState:1,H=G?B.getComputedStyle('direction'):B.getStyle('direction')||B.hasAttribute('dir');if(H==C)return;B.removeStyle('direction');if(G){B.removeAttribute('dir');if(C!=B.getComputedStyle('direction'))B.setAttribute('dir',C);}else B.setAttribute('dir',C);D.forceNextSelectionCheck();};function u(B,C,D){var E=B.getCommonAncestor(false,true);B=B.clone();B.enlarge(D==2?3:2);if(B.checkBoundaryOfElement(E,1)&&B.checkBoundaryOfElement(E,2)){var F;while(E&&E.type==1&&(F=E.getParent())&&F.getChildCount()==1&&!(E.getName() in C))E=F;return E.type==1&&E.getName() in C&&E;}};function v(B){return function(C){var D=C.getSelection(),E=C.config.enterMode,F=D.getRanges();
+if(F&&F.length){var G={},H=D.createBookmarks(),I=F.createIterator(),J,K=0;while(J=I.getNextRange(1)){var L=J.getEnclosedNode();if(!L||L&&!(L.type==1&&L.getName() in n))L=u(J,m,E);L&&t(L,B,C,G);var M,N,O=new d.walker(J),P=H[K].startNode,Q=H[K++].endNode;O.evaluator=function(R){return!!(R.type==1&&R.getName() in m&&!(R.getName()==(E==1?'p':'div')&&R.getParent().type==1&&R.getParent().getName()=='blockquote')&&R.getPosition(P)&2&&(R.getPosition(Q)&4+16)==4);};while(N=O.next())t(N,B,C,G);M=J.createIterator();M.enlargeBr=E!=2;while(N=M.getNextParagraph(E==1?'p':'div'))t(N,B,C,G);}h.clearAllMarkers(G);C.forceNextSelectionCheck();D.selectBookmarks(H);C.focus();}};};j.add('bidi',{requires:['styles','button'],init:function(B){var C=function(E,F,G,H){B.addCommand(G,new a.command(B,{exec:H}));B.ui.addButton(E,{label:F,command:G});},D=B.lang.bidi;C('BidiLtr',D.ltr,'bidiltr',v('ltr'));C('BidiRtl',D.rtl,'bidirtl',v('rtl'));B.on('selectionChange',p);B.on('contentDom',function(){B.document.on('dirChanged',function(E){B.fire('dirChanged',{node:E.data,dir:E.data.getDirection(1)});});});}});function w(B){var C=B.getDocument().getBody().getParent();while(B){if(B.equals(C))return false;B=B.getParent();}return true;};function x(B){var C=B==y.setAttribute,D=B==y.removeAttribute,E=/\bdirection\s*:\s*(.*?)\s*(:?$|;)/;return function(F,G){var J=this;if(!J.getDocument().equals(a.document)){var H;if((F==(C||D?'dir':'direction')||F=='style'&&(D||E.test(G)))&&!w(J)){H=J.getDirection(1);var I=B.apply(J,arguments);if(H!=J.getDirection(1)){J.getDocument().fire('dirChanged',J);return I;}}}return B.apply(J,arguments);};};var y=h.prototype,z=['setStyle','removeStyle','setAttribute','removeAttribute'];for(var A=0;A<z.length;A++)y[z[A]]=e.override(y[z[A]],x);})();(function(){function m(q,r){var s=r.block||r.blockLimit;if(!s||s.getName()=='body')return 2;if(s.getAscendant('blockquote',true))return 1;return 2;};function n(q){var r=q.editor;if(r.readOnly)return;var s=r.getCommand('blockquote');s.state=m(r,q.data.path);s.fire('state');};function o(q){for(var r=0,s=q.getChildCount(),t;r<s&&(t=q.getChild(r));r++){if(t.type==1&&t.isBlockBoundary())return false;}return true;};var p={exec:function(q){var r=q.getCommand('blockquote').state,s=q.getSelection(),t=s&&s.getRanges(true)[0];if(!t)return;var u=s.createBookmarks();if(c){var v=u[0].startNode,w=u[0].endNode,x;if(v&&v.getParent().getName()=='blockquote'){x=v;while(x=x.getNext()){if(x.type==1&&x.isBlockBoundary()){v.move(x,true);break;}}}if(w&&w.getParent().getName()=='blockquote'){x=w;
+while(x=x.getPrevious()){if(x.type==1&&x.isBlockBoundary()){w.move(x);break;}}}}var y=t.createIterator(),z;y.enlargeBr=q.config.enterMode!=2;if(r==2){var A=[];while(z=y.getNextParagraph())A.push(z);if(A.length<1){var B=q.document.createElement(q.config.enterMode==1?'p':'div'),C=u.shift();t.insertNode(B);B.append(new d.text('\ufeff',q.document));t.moveToBookmark(C);t.selectNodeContents(B);t.collapse(true);C=t.createBookmark();A.push(B);u.unshift(C);}var D=A[0].getParent(),E=[];for(var F=0;F<A.length;F++){z=A[F];D=D.getCommonAncestor(z.getParent());}var G={table:1,tbody:1,tr:1,ol:1,ul:1};while(G[D.getName()])D=D.getParent();var H=null;while(A.length>0){z=A.shift();while(!z.getParent().equals(D))z=z.getParent();if(!z.equals(H))E.push(z);H=z;}while(E.length>0){z=E.shift();if(z.getName()=='blockquote'){var I=new d.documentFragment(q.document);while(z.getFirst()){I.append(z.getFirst().remove());A.push(I.getLast());}I.replace(z);}else A.push(z);}var J=q.document.createElement('blockquote');J.insertBefore(A[0]);while(A.length>0){z=A.shift();J.append(z);}}else if(r==1){var K=[],L={};while(z=y.getNextParagraph()){var M=null,N=null;while(z.getParent()){if(z.getParent().getName()=='blockquote'){M=z.getParent();N=z;break;}z=z.getParent();}if(M&&N&&!N.getCustomData('blockquote_moveout')){K.push(N);h.setMarker(L,N,'blockquote_moveout',true);}}h.clearAllMarkers(L);var O=[],P=[];L={};while(K.length>0){var Q=K.shift();J=Q.getParent();if(!Q.getPrevious())Q.remove().insertBefore(J);else if(!Q.getNext())Q.remove().insertAfter(J);else{Q.breakParent(Q.getParent());P.push(Q.getNext());}if(!J.getCustomData('blockquote_processed')){P.push(J);h.setMarker(L,J,'blockquote_processed',true);}O.push(Q);}h.clearAllMarkers(L);for(F=P.length-1;F>=0;F--){J=P[F];if(o(J))J.remove();}if(q.config.enterMode==2){var R=true;while(O.length){Q=O.shift();if(Q.getName()=='div'){I=new d.documentFragment(q.document);var S=R&&Q.getPrevious()&&!(Q.getPrevious().type==1&&Q.getPrevious().isBlockBoundary());if(S)I.append(q.document.createElement('br'));var T=Q.getNext()&&!(Q.getNext().type==1&&Q.getNext().isBlockBoundary());while(Q.getFirst())Q.getFirst().remove().appendTo(I);if(T)I.append(q.document.createElement('br'));I.replace(Q);R=false;}}}}s.selectBookmarks(u);q.focus();}};j.add('blockquote',{init:function(q){q.addCommand('blockquote',p);q.ui.addButton('Blockquote',{label:q.lang.blockquote,command:'blockquote'});q.on('selectionChange',n);},requires:['domiterator']});})();j.add('button',{beforeInit:function(m){m.ui.addHandler('button',k.button.handler);
+}});a.UI_BUTTON='button';k.button=function(m){e.extend(this,m,{title:m.label,className:m.className||m.command&&'cke_button_'+m.command||'',click:m.click||(function(n){n.execCommand(m.command);})});this._={};};k.button.handler={create:function(m){return new k.button(m);}};(function(){k.button.prototype={render:function(m,n){var o=b,p=this._.id=e.getNextId(),q='',r=this.command,s;this._.editor=m;var t={id:p,button:this,editor:m,focus:function(){var z=a.document.getById(p);z.focus();},execute:function(){if(c&&b.version<7)e.setTimeout(function(){this.button.click(m);},0,this);else this.button.click(m);}},u=e.addFunction(function(z){if(t.onkey){z=new d.event(z);return t.onkey(t,z.getKeystroke())!==false;}}),v=e.addFunction(function(z){var A;if(t.onfocus)A=t.onfocus(t,new d.event(z))!==false;if(b.gecko&&b.version<10900)z.preventBubble();return A;});t.clickFn=s=e.addFunction(t.execute,t);if(this.modes){var w={};function x(){var z=m.mode;if(z){var A=this.modes[z]?w[z]!=undefined?w[z]:2:0;this.setState(m.readOnly&&!this.readOnly?0:A);}};m.on('beforeModeUnload',function(){if(m.mode&&this._.state!=0)w[m.mode]=this._.state;},this);m.on('mode',x,this);!this.readOnly&&m.on('readOnly',x,this);}else if(r){r=m.getCommand(r);if(r){r.on('state',function(){this.setState(r.state);},this);q+='cke_'+(r.state==1?'on':r.state==0?'disabled':'off');}}if(!r)q+='cke_off';if(this.className)q+=' '+this.className;n.push('<span class="cke_button'+(this.icon&&this.icon.indexOf('.png')==-1?' cke_noalphafix':'')+'">','<a id="',p,'" class="',q,'"',o.gecko&&o.version>=10900&&!o.hc?'':'" href="javascript:void(\''+(this.title||'').replace("'",'')+"')\"",' title="',this.title,'" tabindex="-1" hidefocus="true" role="button" aria-labelledby="'+p+'_label"'+(this.hasArrow?' aria-haspopup="true"':''));if(o.opera||o.gecko&&o.mac)n.push(' onkeypress="return false;"');if(o.gecko)n.push(' onblur="this.style.cssText = this.style.cssText;"');n.push(' onkeydown="return CKEDITOR.tools.callFunction(',u,', event);" onfocus="return CKEDITOR.tools.callFunction(',v,', event);" '+(c?'onclick="return false;" onmouseup':'onclick')+'="CKEDITOR.tools.callFunction(',s,', this); return false;"><span class="cke_icon"');if(this.icon){var y=(this.iconOffset||0)*-16;n.push(' style="background-image:url(',a.getUrl(this.icon),');background-position:0 '+y+'px;"');}n.push('> </span><span id="',p,'_label" class="cke_label">',this.label,'</span>');if(this.hasArrow)n.push('<span class="cke_buttonarrow">'+(b.hc?'▼':' ')+'</span>');
+n.push('</a>','</span>');if(this.onRender)this.onRender();return t;},setState:function(m){if(this._.state==m)return false;this._.state=m;var n=a.document.getById(this._.id);if(n){n.setState(m);m==0?n.setAttribute('aria-disabled',true):n.removeAttribute('aria-disabled');m==1?n.setAttribute('aria-pressed',true):n.removeAttribute('aria-pressed');return true;}else return false;}};})();k.prototype.addButton=function(m,n){this.add(m,'button',n);};(function(){var m=function(y,z){var A=y.document,B=A.getBody(),C=false,D=function(){C=true;};B.on(z,D);(b.version>7?A.$:A.$.selection.createRange()).execCommand(z);B.removeListener(z,D);return C;},n=c?function(y,z){return m(y,z);}:function(y,z){try{return y.document.$.execCommand(z,false,null);}catch(A){return false;}},o=function(y){var z=this;z.type=y;z.canUndo=z.type=='cut';z.startDisabled=true;};o.prototype={exec:function(y,z){this.type=='cut'&&t(y);var A=n(y,this.type);if(!A)alert(y.lang.clipboard[this.type+'Error']);return A;}};var p={canUndo:false,exec:c?function(y){y.focus();if(!y.document.getBody().fire('beforepaste')&&!m(y,'paste')){y.fire('pasteDialog');return false;}}:function(y){try{if(!y.document.getBody().fire('beforepaste')&&!y.document.$.execCommand('Paste',false,null))throw 0;}catch(z){setTimeout(function(){y.fire('pasteDialog');},0);return false;}}},q=function(y){if(this.mode!='wysiwyg')return;switch(y.data.keyCode){case 1114112+86:case 2228224+45:var z=this.document.getBody();if(b.opera||b.gecko)z.fire('paste');return;case 1114112+88:case 2228224+46:var A=this;this.fire('saveSnapshot');setTimeout(function(){A.fire('saveSnapshot');},0);}};function r(y){y.cancel();};function s(y,z,A){var B=this.document;if(B.getById('cke_pastebin'))return;if(z=='text'&&y.data&&y.data.$.clipboardData){var C=y.data.$.clipboardData.getData('text/plain');if(C){y.data.preventDefault();A(C);return;}}var D=this.getSelection(),E=new d.range(B),F=new h(z=='text'?'textarea':b.webkit?'body':'div',B);F.setAttribute('id','cke_pastebin');b.webkit&&F.append(B.createText('\xa0'));B.getBody().append(F);F.setStyles({position:'absolute',top:D.getStartElement().getDocumentPosition().y+'px',width:'1px',height:'1px',overflow:'hidden'});F.setStyle(this.config.contentsLangDirection=='ltr'?'left':'right','-1000px');var G=D.createBookmarks();this.on('selectionChange',r,null,null,0);if(z=='text')F.$.focus();else{E.setStartAt(F,1);E.setEndAt(F,2);E.select(true);}var H=this;window.setTimeout(function(){H.document.getBody().focus();H.removeListener('selectionChange',r);
+if(b.ie7Compat){D.selectBookmarks(G);F.remove();}else{F.remove();D.selectBookmarks(G);}var I;F=b.webkit&&(I=F.getFirst())&&I.is&&I.hasClass('Apple-style-span')?I:F;A(F['get'+(z=='text'?'Value':'Html')]());},0);};function t(y){if(!c||b.quirks)return;var z=y.getSelection(),A;if(z.getType()==3&&(A=z.getSelectedElement())){var B=z.getRanges()[0],C=y.document.createText('');C.insertBefore(A);B.setStartBefore(C);B.setEndAfter(A);z.selectRanges([B]);setTimeout(function(){if(A.getParent()){C.remove();z.selectElement(A);}},0);}};var u,v;function w(y,z){var A;if(v&&y in {Paste:1,Cut:1})return 0;if(y=='Paste'){c&&(u=1);try{A=z.document.$.queryCommandEnabled(y)||b.webkit;}catch(D){}u=0;}else{var B=z.getSelection(),C=B&&B.getRanges();A=B&&!(C.length==1&&C[0].collapsed);}return A?2:0;};function x(){var z=this;if(z.mode!='wysiwyg')return;var y=w('Paste',z);z.getCommand('cut').setState(w('Cut',z));z.getCommand('copy').setState(w('Copy',z));z.getCommand('paste').setState(y);z.fire('pasteState',y);};j.add('clipboard',{requires:['dialog','htmldataprocessor'],init:function(y){y.on('paste',function(A){var B=A.data;if(B.html)y.insertHtml(B.html);else if(B.text)y.insertText(B.text);setTimeout(function(){y.fire('afterPaste');},0);},null,null,1000);y.on('pasteDialog',function(A){setTimeout(function(){y.openDialog('paste');},0);});y.on('pasteState',function(A){y.getCommand('paste').setState(A.data);});function z(A,B,C,D){var E=y.lang[B];y.addCommand(B,C);y.ui.addButton(A,{label:E,command:B});if(y.addMenuItems)y.addMenuItem(B,{label:E,command:B,group:'clipboard',order:D});};z('Cut','cut',new o('cut'),1);z('Copy','copy',new o('copy'),4);z('Paste','paste',p,8);a.dialog.add('paste',a.getUrl(this.path+'dialogs/paste.js'));y.on('key',q,y);y.on('contentDom',function(){var A=y.document.getBody();A.on(!c?'paste':'beforepaste',function(B){if(u)return;var C=B.data&&B.data.$;if(c&&C&&!C.ctrlKey)return;var D={mode:'html'};y.fire('beforePaste',D);s.call(y,B,D.mode,function(E){if(!(E=e.trim(E.replace(/<span[^>]+data-cke-bookmark[^<]*?<\/span>/ig,''))))return;var F={};F[D.mode]=E;y.fire('paste',F);});});if(c){A.on('contextmenu',function(){u=1;setTimeout(function(){u=0;},0);});A.on('paste',function(B){if(!y.document.getById('cke_pastebin')){B.data.preventDefault();u=0;p.exec(y);}});}A.on('beforecut',function(){!u&&t(y);});A.on('mouseup',function(){setTimeout(function(){x.call(y);},0);},y);A.on('keyup',x,y);});y.on('selectionChange',function(A){v=A.data.selection.getRanges()[0].checkReadOnly();x.call(y);
+});if(y.contextMenu)y.contextMenu.addListener(function(A,B){var C=B.getRanges()[0].checkReadOnly();return{cut:w('Cut',y),copy:w('Copy',y),paste:w('Paste',y)};});}});})();j.add('colorbutton',{requires:['panelbutton','floatpanel','styles'],init:function(m){var n=m.config,o=m.lang.colorButton,p;if(!b.hc){q('TextColor','fore',o.textColorTitle);q('BGColor','back',o.bgColorTitle);}function q(t,u,v){var w=e.getNextId()+'_colorBox';m.ui.add(t,'panelbutton',{label:v,title:v,className:'cke_button_'+t.toLowerCase(),modes:{wysiwyg:1},panel:{css:m.skin.editor.css,attributes:{role:'listbox','aria-label':o.panelTitle}},onBlock:function(x,y){y.autoSize=true;y.element.addClass('cke_colorblock');y.element.setHtml(r(x,u,w));y.element.getDocument().getBody().setStyle('overflow','hidden');k.fire('ready',this);var z=y.keys,A=m.lang.dir=='rtl';z[A?37:39]='next';z[40]='next';z[9]='next';z[A?39:37]='prev';z[38]='prev';z[2228224+9]='prev';z[32]='click';},onOpen:function(){var x=m.getSelection(),y=x&&x.getStartElement(),z=new d.elementPath(y),A;y=z.block||z.blockLimit||m.document.getBody();do A=y&&y.getComputedStyle(u=='back'?'background-color':'color')||'transparent';while(u=='back'&&A=='transparent'&&y&&(y=y.getParent()));if(!A||A=='transparent')A='#ffffff';this._.panel._.iframe.getFrameDocument().getById(w).setStyle('background-color',A);}});};function r(t,u,v){var w=[],x=n.colorButton_colors.split(','),y=e.addFunction(function(E,F){if(E=='?'){var G=arguments.callee;function H(J){this.removeListener('ok',H);this.removeListener('cancel',H);J.name=='ok'&&G(this.getContentElement('picker','selectedColor').getValue(),F);};m.openDialog('colordialog',function(){this.on('ok',H);this.on('cancel',H);});return;}m.focus();t.hide(false);m.fire('saveSnapshot');new a.style(n['colorButton_'+F+'Style'],{color:'inherit'}).remove(m.document);if(E){var I=n['colorButton_'+F+'Style'];I.childRule=F=='back'?function(J){return s(J);}:function(J){return!(J.is('a')||J.getElementsByTag('a').count())||s(J);};new a.style(I,{color:E}).apply(m.document);}m.fire('saveSnapshot');});w.push('<a class="cke_colorauto" _cke_focus=1 hidefocus=true title="',o.auto,'" onclick="CKEDITOR.tools.callFunction(',y,",null,'",u,"');return false;\" href=\"javascript:void('",o.auto,'\')" role="option"><table role="presentation" cellspacing=0 cellpadding=0 width="100%"><tr><td><span class="cke_colorbox" id="',v,'"></span></td><td colspan=7 align=center>',o.auto,'</td></tr></table></a><table role="presentation" cellspacing=0 cellpadding=0 width="100%">');
+for(var z=0;z<x.length;z++){if(z%8===0)w.push('</tr><tr>');var A=x[z].split('/'),B=A[0],C=A[1]||B;if(!A[1])B='#'+B.replace(/^(.)(.)(.)$/,'$1$1$2$2$3$3');var D=m.lang.colors[C]||C;w.push('<td><a class="cke_colorbox" _cke_focus=1 hidefocus=true title="',D,'" onclick="CKEDITOR.tools.callFunction(',y,",'",B,"','",u,"'); return false;\" href=\"javascript:void('",D,'\')" role="option"><span class="cke_colorbox" style="background-color:#',C,'"></span></a></td>');}if(n.colorButton_enableMore===undefined||n.colorButton_enableMore)w.push('</tr><tr><td colspan=8 align=center><a class="cke_colormore" _cke_focus=1 hidefocus=true title="',o.more,'" onclick="CKEDITOR.tools.callFunction(',y,",'?','",u,"');return false;\" href=\"javascript:void('",o.more,"')\"",' role="option">',o.more,'</a></td>');w.push('</tr></table>');return w.join('');};function s(t){return t.getAttribute('contentEditable')=='false'||t.getAttribute('data-nostyle');};}});i.colorButton_colors='000,800000,8B4513,2F4F4F,008080,000080,4B0082,696969,B22222,A52A2A,DAA520,006400,40E0D0,0000CD,800080,808080,F00,FF8C00,FFD700,008000,0FF,00F,EE82EE,A9A9A9,FFA07A,FFA500,FFFF00,00FF00,AFEEEE,ADD8E6,DDA0DD,D3D3D3,FFF0F5,FAEBD7,FFFFE0,F0FFF0,F0FFFF,F0F8FF,E6E6FA,FFF';i.colorButton_foreStyle={element:'span',styles:{color:'#(color)'},overrides:[{element:'font',attributes:{color:null}}]};i.colorButton_backStyle={element:'span',styles:{'background-color':'#(color)'}};j.colordialog={requires:['dialog'],init:function(m){m.addCommand('colordialog',new a.dialogCommand('colordialog'));a.dialog.add('colordialog',this.path+'dialogs/colordialog.js');}};j.add('colordialog',j.colordialog);j.add('contextmenu',{requires:['menu'],onLoad:function(){j.contextMenu=e.createClass({base:a.menu,$:function(m){this.base.call(this,m,{panel:{className:m.skinClass+' cke_contextmenu',attributes:{'aria-label':m.lang.contextmenu.options}}});},proto:{addTarget:function(m,n){if(b.opera&&!('oncontextmenu' in document.body)){var o;m.on('mousedown',function(s){s=s.data;if(s.$.button!=2){if(s.getKeystroke()==1114112+1)m.fire('contextmenu',s);return;}if(n&&(b.mac?s.$.metaKey:s.$.ctrlKey))return;var t=s.getTarget();if(!o){var u=t.getDocument();o=u.createElement('input');o.$.type='button';u.getBody().append(o);}o.setAttribute('style','position:absolute;top:'+(s.$.clientY-2)+'px;left:'+(s.$.clientX-2)+'px;width:5px;height:5px;opacity:0.01');});m.on('mouseup',function(s){if(o){o.remove();o=undefined;m.fire('contextmenu',s.data);}});}m.on('contextmenu',function(s){var t=s.data;
+if(n&&(b.webkit?p:b.mac?t.$.metaKey:t.$.ctrlKey))return;t.preventDefault();var u=t.getTarget().getDocument().getDocumentElement(),v=t.$.clientX,w=t.$.clientY;e.setTimeout(function(){this.open(u,null,v,w);},c?200:0,this);},this);if(b.opera)m.on('keypress',function(s){var t=s.data;if(t.$.keyCode===0)t.preventDefault();});if(b.webkit){var p,q=function(s){p=b.mac?s.data.$.metaKey:s.data.$.ctrlKey;},r=function(){p=0;};m.on('keydown',q);m.on('keyup',r);m.on('contextmenu',r);}},open:function(m,n,o,p){this.editor.focus();m=m||a.document.getDocumentElement();this.show(m,n,o,p);}}});},beforeInit:function(m){m.contextMenu=new j.contextMenu(m);m.addCommand('contextMenu',{exec:function(){m.contextMenu.open(m.document.getBody());}});}});(function(){function m(o){var p=this.att,q=o&&o.hasAttribute(p)&&o.getAttribute(p)||'';if(q!==undefined)this.setValue(q);};function n(){var o;for(var p=0;p<arguments.length;p++){if(arguments[p] instanceof h){o=arguments[p];break;}}if(o){var q=this.att,r=this.getValue();if(r)o.setAttribute(q,r);else o.removeAttribute(q,r);}};j.add('dialogadvtab',{createAdvancedTab:function(o,p){if(!p)p={id:1,dir:1,classes:1,styles:1};var q=o.lang.common,r={id:'advanced',label:q.advancedTab,title:q.advancedTab,elements:[{type:'vbox',padding:1,children:[]}]},s=[];if(p.id||p.dir){if(p.id)s.push({id:'advId',att:'id',type:'text',label:q.id,setup:m,commit:n});if(p.dir)s.push({id:'advLangDir',att:'dir',type:'select',label:q.langDir,'default':'',style:'width:100%',items:[[q.notSet,''],[q.langDirLTR,'ltr'],[q.langDirRTL,'rtl']],setup:m,commit:n});r.elements[0].children.push({type:'hbox',widths:['50%','50%'],children:[].concat(s)});}if(p.styles||p.classes){s=[];if(p.styles)s.push({id:'advStyles',att:'style',type:'text',label:q.styles,'default':'',validate:a.dialog.validate.inlineStyle(q.invalidInlineStyle),onChange:function(){},getStyle:function(t,u){var v=this.getValue().match(new RegExp(t+'\\s*:\\s*([^;]*)','i'));return v?v[1]:u;},updateStyle:function(t,u){var v=this.getValue();if(v)v=v.replace(new RegExp('\\s*'+t+'s*:[^;]*(?:$|;s*)','i'),'').replace(/^[;\s]+/,'').replace(/\s+$/,'');if(u){v&&!/;\s*$/.test(v)&&(v+='; ');v+=t+': '+u;}this.setValue(v,1);},setup:m,commit:n});if(p.classes)s.push({type:'hbox',widths:['45%','55%'],children:[{id:'advCSSClasses',att:'class',type:'text',label:q.cssClasses,'default':'',setup:m,commit:n}]});r.elements[0].children.push({type:'hbox',widths:['50%','50%'],children:[].concat(s)});}return r;}});})();(function(){j.add('div',{requires:['editingblock','dialog','domiterator','styles'],init:function(m){var n=m.lang.div;
+m.addCommand('creatediv',new a.dialogCommand('creatediv'));m.addCommand('editdiv',new a.dialogCommand('editdiv'));m.addCommand('removediv',{exec:function(o){var p=o.getSelection(),q=p&&p.getRanges(),r,s=p.createBookmarks(),t,u=[];function v(x){var y=new d.elementPath(x),z=y.blockLimit,A=z.is('div')&&z;if(A&&!A.data('cke-div-added')){u.push(A);A.data('cke-div-added');}};for(var w=0;w<q.length;w++){r=q[w];if(r.collapsed)v(p.getStartElement());else{t=new d.walker(r);t.evaluator=v;t.lastForward();}}for(w=0;w<u.length;w++)u[w].remove(true);p.selectBookmarks(s);}});m.ui.addButton('CreateDiv',{label:n.toolbar,command:'creatediv'});if(m.addMenuItems){m.addMenuItems({editdiv:{label:n.edit,command:'editdiv',group:'div',order:1},removediv:{label:n.remove,command:'removediv',group:'div',order:5}});if(m.contextMenu)m.contextMenu.addListener(function(o,p){if(!o||o.isReadOnly())return null;var q=new d.elementPath(o),r=q.blockLimit;if(r&&r.getAscendant('div',true))return{editdiv:2,removediv:2};return null;});}a.dialog.add('creatediv',this.path+'dialogs/div.js');a.dialog.add('editdiv',this.path+'dialogs/div.js');}});})();(function(){var m={toolbarFocus:{editorFocus:false,readOnly:1,exec:function(o){var p=o._.elementsPath.idBase,q=a.document.getById(p+'0');q&&q.focus(c||b.air);}}},n='<span class="cke_empty"> </span>';j.add('elementspath',{requires:['selection'],init:function(o){var p='cke_path_'+o.name,q,r=function(){if(!q)q=a.document.getById(p);return q;},s='cke_elementspath_'+e.getNextNumber()+'_';o._.elementsPath={idBase:s,filters:[]};o.on('themeSpace',function(x){if(x.data.space=='bottom')x.data.html+='<span id="'+p+'_label" class="cke_voice_label">'+o.lang.elementsPath.eleLabel+'</span>'+'<div id="'+p+'" class="cke_path" role="group" aria-labelledby="'+p+'_label">'+n+'</div>';});function t(x){o.focus();var y=o._.elementsPath.list[x];if(y.is('body')){var z=new d.range(o.document);z.selectNodeContents(y);z.select();}else o.getSelection().selectElement(y);};var u=e.addFunction(t),v=e.addFunction(function(x,y){var z=o._.elementsPath.idBase,A;y=new d.event(y);var B=o.lang.dir=='rtl';switch(y.getKeystroke()){case B?39:37:case 9:A=a.document.getById(z+(x+1));if(!A)A=a.document.getById(z+'0');A.focus();return false;case B?37:39:case 2228224+9:A=a.document.getById(z+(x-1));if(!A)A=a.document.getById(z+(o._.elementsPath.list.length-1));A.focus();return false;case 27:o.focus();return false;case 13:case 32:t(x);return false;}return true;});o.on('selectionChange',function(x){var y=b,z=x.data.selection,A=z.getStartElement(),B=[],C=x.editor,D=C._.elementsPath.list=[],E=C._.elementsPath.filters;
+while(A){var F=0,G;if(A.data('cke-display-name'))G=A.data('cke-display-name');else if(A.data('cke-real-element-type'))G=A.data('cke-real-element-type');else G=A.getName();for(var H=0;H<E.length;H++){var I=E[H](A,G);if(I===false){F=1;break;}G=I||G;}if(!F){var J=D.push(A)-1,K='';if(y.opera||y.gecko&&y.mac)K+=' onkeypress="return false;"';if(y.gecko)K+=' onblur="this.style.cssText = this.style.cssText;"';var L=C.lang.elementsPath.eleTitle.replace(/%1/,G);B.unshift('<a id="',s,J,'" href="javascript:void(\'',G,'\')" tabindex="-1" title="',L,'"'+(b.gecko&&b.version<10900?' onfocus="event.preventBubble();"':'')+' hidefocus="true" '+' onkeydown="return CKEDITOR.tools.callFunction(',v,',',J,', event );"'+K,' onclick="CKEDITOR.tools.callFunction('+u,',',J,'); return false;"',' role="button" aria-labelledby="'+s+J+'_label">',G,'<span id="',s,J,'_label" class="cke_label">'+L+'</span>','</a>');}if(G=='body')break;A=A.getParent();}var M=r();M.setHtml(B.join('')+n);C.fire('elementsPathUpdate',{space:M});});function w(){q&&q.setHtml(n);delete o._.elementsPath.list;};o.on('readOnly',w);o.on('contentDomUnload',w);o.addCommand('elementsPathFocus',m.toolbarFocus);}});})();(function(){j.add('enterkey',{requires:['keystrokes','indent'],init:function(t){t.addCommand('enter',{modes:{wysiwyg:1},editorFocus:false,exec:function(v){r(v);}});t.addCommand('shiftEnter',{modes:{wysiwyg:1},editorFocus:false,exec:function(v){q(v);}});var u=t.keystrokeHandler.keystrokes;u[13]='enter';u[2228224+13]='shiftEnter';}});j.enterkey={enterBlock:function(t,u,v,w){v=v||s(t);if(!v)return;var x=v.document,y=v.checkStartOfBlock(),z=v.checkEndOfBlock(),A=new d.elementPath(v.startContainer),B=A.block;if(y&&z){if(B&&(B.is('li')||B.getParent().is('li'))){t.execCommand('outdent');return;}if(B&&B.getParent().is('blockquote')){B.breakParent(B.getParent());if(!B.getPrevious().getFirst(d.walker.invisible(1)))B.getPrevious().remove();if(!B.getNext().getFirst(d.walker.invisible(1)))B.getNext().remove();v.moveToElementEditStart(B);v.select();return;}}else if(B&&B.is('pre')){if(!z){n(t,u,v,w);return;}}else if(B&&f.$captionBlock[B.getName()]){n(t,u,v,w);return;}var C=u==3?'div':'p',D=v.splitBlock(C);if(!D)return;var E=D.previousBlock,F=D.nextBlock,G=D.wasStartOfBlock,H=D.wasEndOfBlock,I;if(F){I=F.getParent();if(I.is('li')){F.breakParent(I);F.move(F.getNext(),1);}}else if(E&&(I=E.getParent())&&I.is('li')){E.breakParent(I);I=E.getNext();v.moveToElementEditStart(I);E.move(E.getPrevious());}if(!G&&!H){if(F.is('li')&&(I=F.getFirst(d.walker.invisible(true)))&&I.is&&I.is('ul','ol'))(c?x.createText('\xa0'):x.createElement('br')).insertBefore(I);
+if(F)v.moveToElementEditStart(F);}else{var J,K;if(E){if(E.is('li')||!(p.test(E.getName())||E.is('pre')))J=E.clone();}else if(F)J=F.clone();if(!J){if(I&&I.is('li'))J=I;else{J=x.createElement(C);if(E&&(K=E.getDirection()))J.setAttribute('dir',K);}}else if(w&&!J.is('li'))J.renameNode(C);var L=D.elementPath;if(L)for(var M=0,N=L.elements.length;M<N;M++){var O=L.elements[M];if(O.equals(L.block)||O.equals(L.blockLimit))break;if(f.$removeEmpty[O.getName()]){O=O.clone();J.moveChildren(O);J.append(O);}}if(!c)J.appendBogus();if(!J.getParent())v.insertNode(J);J.is('li')&&J.removeAttribute('value');if(c&&G&&(!H||!E.getChildCount())){v.moveToElementEditStart(H?E:J);v.select();}v.moveToElementEditStart(G&&!H?F:J);}if(!c)if(F){var P=x.createElement('span');P.setHtml(' ');v.insertNode(P);P.scrollIntoView();v.deleteContents();}else J.scrollIntoView();v.select();},enterBr:function(t,u,v,w){v=v||s(t);if(!v)return;var x=v.document,y=u==3?'div':'p',z=v.checkEndOfBlock(),A=new d.elementPath(t.getSelection().getStartElement()),B=A.block,C=B&&A.block.getName(),D=false;if(!w&&C=='li'){o(t,u,v,w);return;}if(!w&&z&&p.test(C)){var E,F;if(F=B.getDirection()){E=x.createElement('div');E.setAttribute('dir',F);E.insertAfter(B);v.setStart(E,0);}else{x.createElement('br').insertAfter(B);if(b.gecko)x.createText('').insertAfter(B);v.setStartAt(B.getNext(),c?3:1);}}else{var G;D=C=='pre';if(D&&!b.gecko)G=x.createText(c?'\r':'\n');else G=x.createElement('br');v.deleteContents();v.insertNode(G);if(c)v.setStartAt(G,4);else{x.createText('\ufeff').insertAfter(G);if(z)G.getParent().appendBogus();G.getNext().$.nodeValue='';v.setStartAt(G.getNext(),1);var H=null;if(!b.gecko){H=x.createElement('span');H.setHtml(' ');}else H=x.createElement('br');H.insertBefore(G.getNext());H.scrollIntoView();H.remove();}}v.collapse(true);v.select(D);}};var m=j.enterkey,n=m.enterBr,o=m.enterBlock,p=/^h[1-6]$/;function q(t){if(t.mode!='wysiwyg')return false;return r(t,t.config.shiftEnterMode,1);};function r(t,u,v){v=t.config.forceEnterMode||v;if(t.mode!='wysiwyg')return false;if(!u)u=t.config.enterMode;setTimeout(function(){t.fire('saveSnapshot');if(u==2)n(t,u,null,v);else o(t,u,null,v);t.fire('saveSnapshot');},0);return true;};function s(t){var u=t.getSelection().getRanges(true);for(var v=u.length-1;v>0;v--)u[v].deleteContents();return u[0];};})();(function(){var m='nbsp,gt,lt,amp',n='quot,iexcl,cent,pound,curren,yen,brvbar,sect,uml,copy,ordf,laquo,not,shy,reg,macr,deg,plusmn,sup2,sup3,acute,micro,para,middot,cedil,sup1,ordm,raquo,frac14,frac12,frac34,iquest,times,divide,fnof,bull,hellip,prime,Prime,oline,frasl,weierp,image,real,trade,alefsym,larr,uarr,rarr,darr,harr,crarr,lArr,uArr,rArr,dArr,hArr,forall,part,exist,empty,nabla,isin,notin,ni,prod,sum,minus,lowast,radic,prop,infin,ang,and,or,cap,cup,int,there4,sim,cong,asymp,ne,equiv,le,ge,sub,sup,nsub,sube,supe,oplus,otimes,perp,sdot,lceil,rceil,lfloor,rfloor,lang,rang,loz,spades,clubs,hearts,diams,circ,tilde,ensp,emsp,thinsp,zwnj,zwj,lrm,rlm,ndash,mdash,lsquo,rsquo,sbquo,ldquo,rdquo,bdquo,dagger,Dagger,permil,lsaquo,rsaquo,euro',o='Agrave,Aacute,Acirc,Atilde,Auml,Aring,AElig,Ccedil,Egrave,Eacute,Ecirc,Euml,Igrave,Iacute,Icirc,Iuml,ETH,Ntilde,Ograve,Oacute,Ocirc,Otilde,Ouml,Oslash,Ugrave,Uacute,Ucirc,Uuml,Yacute,THORN,szlig,agrave,aacute,acirc,atilde,auml,aring,aelig,ccedil,egrave,eacute,ecirc,euml,igrave,iacute,icirc,iuml,eth,ntilde,ograve,oacute,ocirc,otilde,ouml,oslash,ugrave,uacute,ucirc,uuml,yacute,thorn,yuml,OElig,oelig,Scaron,scaron,Yuml',p='Alpha,Beta,Gamma,Delta,Epsilon,Zeta,Eta,Theta,Iota,Kappa,Lambda,Mu,Nu,Xi,Omicron,Pi,Rho,Sigma,Tau,Upsilon,Phi,Chi,Psi,Omega,alpha,beta,gamma,delta,epsilon,zeta,eta,theta,iota,kappa,lambda,mu,nu,xi,omicron,pi,rho,sigmaf,sigma,tau,upsilon,phi,chi,psi,omega,thetasym,upsih,piv';
+function q(r,s){var t={},u=[],v={nbsp:'\xa0',shy:'',gt:'>',lt:'<',amp:'&',apos:"'",quot:'"'};r=r.replace(/\b(nbsp|shy|gt|lt|amp|apos|quot)(?:,|$)/g,function(A,B){var C=s?'&'+B+';':v[B],D=s?v[B]:'&'+B+';';t[C]=D;u.push(C);return '';});if(!s&&r){r=r.split(',');var w=document.createElement('div'),x;w.innerHTML='&'+r.join(';&')+';';x=w.innerHTML;w=null;for(var y=0;y<x.length;y++){var z=x.charAt(y);t[z]='&'+r[y]+';';u.push(z);}}t.regex=u.join(s?'|':'');return t;};j.add('entities',{afterInit:function(r){var s=r.config,t=r.dataProcessor,u=t&&t.htmlFilter;if(u){var v=[];if(s.basicEntities!==false)v.push(m);if(s.entities){if(v.length)v.push(n);if(s.entities_latin)v.push(o);if(s.entities_greek)v.push(p);if(s.entities_additional)v.push(s.entities_additional);}var w=q(v.join(',')),x=w.regex?'['+w.regex+']':'a^';delete w.regex;if(s.entities&&s.entities_processNumerical)x='[^ -~]|'+x;x=new RegExp(x,'g');function y(C){return s.entities_processNumerical=='force'||!w[C]?'&#'+C.charCodeAt(0)+';':w[C];};var z=q([m,'shy'].join(','),true),A=new RegExp(z.regex,'g');function B(C){return z[C];};u.addRules({text:function(C){return C.replace(A,B).replace(x,y);}});}}});})();i.basicEntities=true;i.entities=true;i.entities_latin=true;i.entities_greek=true;i.entities_additional='#39';(function(){function m(v,w){var x=[];if(!w)return v;else for(var y in w)x.push(y+'='+encodeURIComponent(w[y]));return v+(v.indexOf('?')!=-1?'&':'?')+x.join('&');};function n(v){v+='';var w=v.charAt(0).toUpperCase();return w+v.substr(1);};function o(v){var C=this;var w=C.getDialog(),x=w.getParentEditor();x._.filebrowserSe=C;var y=x.config['filebrowser'+n(w.getName())+'WindowWidth']||x.config.filebrowserWindowWidth||'80%',z=x.config['filebrowser'+n(w.getName())+'WindowHeight']||x.config.filebrowserWindowHeight||'70%',A=C.filebrowser.params||{};A.CKEditor=x.name;A.CKEditorFuncNum=x._.filebrowserFn;if(!A.langCode)A.langCode=x.langCode;var B=m(C.filebrowser.url,A);x.popup(B,y,z,x.config.filebrowserWindowFeatures||x.config.fileBrowserWindowFeatures);};function p(v){var y=this;var w=y.getDialog(),x=w.getParentEditor();x._.filebrowserSe=y;if(!w.getContentElement(y['for'][0],y['for'][1]).getInputElement().$.value)return false;if(!w.getContentElement(y['for'][0],y['for'][1]).getAction())return false;return true;};function q(v,w,x){var y=x.params||{};y.CKEditor=v.name;y.CKEditorFuncNum=v._.filebrowserFn;if(!y.langCode)y.langCode=v.langCode;w.action=m(x.url,y);w.filebrowser=x;};function r(v,w,x,y){var z,A;for(var B in y){z=y[B];
+if(z.type=='hbox'||z.type=='vbox'||z.type=='fieldset')r(v,w,x,z.children);if(!z.filebrowser)continue;if(typeof z.filebrowser=='string'){var C={action:z.type=='fileButton'?'QuickUpload':'Browse',target:z.filebrowser};z.filebrowser=C;}if(z.filebrowser.action=='Browse'){var D=z.filebrowser.url;if(D===undefined){D=v.config['filebrowser'+n(w)+'BrowseUrl'];if(D===undefined)D=v.config.filebrowserBrowseUrl;}if(D){z.onClick=o;z.filebrowser.url=D;z.hidden=false;}}else if(z.filebrowser.action=='QuickUpload'&&z['for']){D=z.filebrowser.url;if(D===undefined){D=v.config['filebrowser'+n(w)+'UploadUrl'];if(D===undefined)D=v.config.filebrowserUploadUrl;}if(D){var E=z.onClick;z.onClick=function(F){var G=F.sender;if(E&&E.call(G,F)===false)return false;return p.call(G,F);};z.filebrowser.url=D;z.hidden=false;q(v,x.getContents(z['for'][0]).get(z['for'][1]),z.filebrowser);}}}};function s(v,w){var x=w.getDialog(),y=w.filebrowser.target||null;if(y){var z=y.split(':'),A=x.getContentElement(z[0],z[1]);if(A){A.setValue(v);x.selectPage(z[0]);}}};function t(v,w,x){if(x.indexOf(';')!==-1){var y=x.split(';');for(var z=0;z<y.length;z++){if(t(v,w,y[z]))return true;}return false;}var A=v.getContents(w).get(x).filebrowser;return A&&A.url;};function u(v,w){var A=this;var x=A._.filebrowserSe.getDialog(),y=A._.filebrowserSe['for'],z=A._.filebrowserSe.filebrowser.onSelect;if(y)x.getContentElement(y[0],y[1]).reset();if(typeof w=='function'&&w.call(A._.filebrowserSe)===false)return;if(z&&z.call(A._.filebrowserSe,v,w)===false)return;if(typeof w=='string'&&w)alert(w);if(v)s(v,A._.filebrowserSe);};j.add('filebrowser',{init:function(v,w){v._.filebrowserFn=e.addFunction(u,v);v.on('destroy',function(){e.removeFunction(this._.filebrowserFn);});}});a.on('dialogDefinition',function(v){var w=v.data.definition,x;for(var y in w.contents){if(x=w.contents[y]){r(v.editor,v.data.name,w,x.elements);if(x.hidden&&x.filebrowser)x.hidden=!t(w,x.id,x.filebrowser);}}});})();j.add('find',{requires:['dialog'],init:function(m){var n=j.find;m.ui.addButton('Find',{label:m.lang.findAndReplace.find,command:'find'});var o=m.addCommand('find',new a.dialogCommand('find'));o.canUndo=false;o.readOnly=1;m.ui.addButton('Replace',{label:m.lang.findAndReplace.replace,command:'replace'});var p=m.addCommand('replace',new a.dialogCommand('replace'));p.canUndo=false;a.dialog.add('find',this.path+'dialogs/find.js');a.dialog.add('replace',this.path+'dialogs/find.js');},requires:['styles']});i.find_highlight={element:'span',styles:{'background-color':'#004',color:'#fff'}};
+(function(){var m=/\.swf(?:$|\?)/i;function n(p){var q=p.attributes;return q.type=='application/x-shockwave-flash'||m.test(q.src||'');};function o(p,q){return p.createFakeParserElement(q,'cke_flash','flash',true);};j.add('flash',{init:function(p){p.addCommand('flash',new a.dialogCommand('flash'));p.ui.addButton('Flash',{label:p.lang.common.flash,command:'flash'});a.dialog.add('flash',this.path+'dialogs/flash.js');p.addCss('img.cke_flash{background-image: url('+a.getUrl(this.path+'images/placeholder.png')+');'+'background-position: center center;'+'background-repeat: no-repeat;'+'border: 1px solid #a9a9a9;'+'width: 80px;'+'height: 80px;'+'}');if(p.addMenuItems)p.addMenuItems({flash:{label:p.lang.flash.properties,command:'flash',group:'flash'}});p.on('doubleclick',function(q){var r=q.data.element;if(r.is('img')&&r.data('cke-real-element-type')=='flash')q.data.dialog='flash';});if(p.contextMenu)p.contextMenu.addListener(function(q,r){if(q&&q.is('img')&&!q.isReadOnly()&&q.data('cke-real-element-type')=='flash')return{flash:2};});},afterInit:function(p){var q=p.dataProcessor,r=q&&q.dataFilter;if(r)r.addRules({elements:{'cke:object':function(s){var t=s.attributes,u=t.classid&&String(t.classid).toLowerCase();if(!u&&!n(s)){for(var v=0;v<s.children.length;v++){if(s.children[v].name=='cke:embed'){if(!n(s.children[v]))return null;return o(p,s);}}return null;}return o(p,s);},'cke:embed':function(s){if(!n(s))return null;return o(p,s);}}},5);},requires:['fakeobjects']});})();e.extend(i,{flashEmbedTagOnly:false,flashAddEmbedTag:true,flashConvertOnEdit:false});(function(){function m(n,o,p,q,r,s,t){var u=n.config,v=r.split(';'),w=[],x={};for(var y=0;y<v.length;y++){var z=v[y];if(z){z=z.split('/');var A={},B=v[y]=z[0];A[p]=w[y]=z[1]||B;x[B]=new a.style(t,A);x[B]._.definition.name=B;}else v.splice(y--,1);}n.ui.addRichCombo(o,{label:q.label,title:q.panelTitle,className:'cke_'+(p=='size'?'fontSize':'font'),panel:{css:n.skin.editor.css.concat(u.contentsCss),multiSelect:false,attributes:{'aria-label':q.panelTitle}},init:function(){this.startGroup(q.panelTitle);for(var C=0;C<v.length;C++){var D=v[C];this.add(D,x[D].buildPreview(),D);}},onClick:function(C){n.focus();n.fire('saveSnapshot');var D=x[C];if(this.getValue()==C)D.remove(n.document);else D.apply(n.document);n.fire('saveSnapshot');},onRender:function(){n.on('selectionChange',function(C){var D=this.getValue(),E=C.data.path,F=E.elements;for(var G=0,H;G<F.length;G++){H=F[G];for(var I in x){if(x[I].checkElementMatch(H,true)){if(I!=D)this.setValue(I);
+return;}}}this.setValue('',s);},this);}});};j.add('font',{requires:['richcombo','styles'],init:function(n){var o=n.config;m(n,'Font','family',n.lang.font,o.font_names,o.font_defaultLabel,o.font_style);m(n,'FontSize','size',n.lang.fontSize,o.fontSize_sizes,o.fontSize_defaultLabel,o.fontSize_style);}});})();i.font_names='Arial/Arial, Helvetica, sans-serif;Comic Sans MS/Comic Sans MS, cursive;Courier New/Courier New, Courier, monospace;Georgia/Georgia, serif;Lucida Sans Unicode/Lucida Sans Unicode, Lucida Grande, sans-serif;Tahoma/Tahoma, Geneva, sans-serif;Times New Roman/Times New Roman, Times, serif;Trebuchet MS/Trebuchet MS, Helvetica, sans-serif;Verdana/Verdana, Geneva, sans-serif';i.font_defaultLabel='';i.font_style={element:'span',styles:{'font-family':'#(family)'},overrides:[{element:'font',attributes:{face:null}}]};i.fontSize_sizes='8/8px;9/9px;10/10px;11/11px;12/12px;14/14px;16/16px;18/18px;20/20px;22/22px;24/24px;26/26px;28/28px;36/36px;48/48px;72/72px';i.fontSize_defaultLabel='';i.fontSize_style={element:'span',styles:{'font-size':'#(size)'},overrides:[{element:'font',attributes:{size:null}}]};j.add('format',{requires:['richcombo','styles'],init:function(m){var n=m.config,o=m.lang.format,p=n.format_tags.split(';'),q={};for(var r=0;r<p.length;r++){var s=p[r];q[s]=new a.style(n['format_'+s]);q[s]._.enterMode=m.config.enterMode;}m.ui.addRichCombo('Format',{label:o.label,title:o.panelTitle,className:'cke_format',panel:{css:m.skin.editor.css.concat(n.contentsCss),multiSelect:false,attributes:{'aria-label':o.panelTitle}},init:function(){this.startGroup(o.panelTitle);for(var t in q){var u=o['tag_'+t];this.add(t,q[t].buildPreview(u),u);}},onClick:function(t){m.focus();m.fire('saveSnapshot');var u=q[t],v=new d.elementPath(m.getSelection().getStartElement());u[u.checkActive(v)?'remove':'apply'](m.document);setTimeout(function(){m.fire('saveSnapshot');},0);},onRender:function(){m.on('selectionChange',function(t){var u=this.getValue(),v=t.data.path;for(var w in q){if(q[w].checkActive(v)){if(w!=u)this.setValue(w,m.lang.format['tag_'+w]);return;}}this.setValue('');},this);}});}});i.format_tags='p;h1;h2;h3;h4;h5;h6;pre;address;div';i.format_p={element:'p'};i.format_div={element:'div'};i.format_pre={element:'pre'};i.format_address={element:'address'};i.format_h1={element:'h1'};i.format_h2={element:'h2'};i.format_h3={element:'h3'};i.format_h4={element:'h4'};i.format_h5={element:'h5'};i.format_h6={element:'h6'};j.add('forms',{requires:['dialog'],init:function(m){var n=m.lang;
+m.addCss('form{border: 1px dotted #FF0000;padding: 2px;}\n');m.addCss('img.cke_hidden{background-image: url('+a.getUrl(this.path+'images/hiddenfield.gif')+');'+'background-position: center center;'+'background-repeat: no-repeat;'+'border: 1px solid #a9a9a9;'+'width: 16px !important;'+'height: 16px !important;'+'}');var o=function(q,r,s){m.addCommand(r,new a.dialogCommand(r));m.ui.addButton(q,{label:n.common[q.charAt(0).toLowerCase()+q.slice(1)],command:r});a.dialog.add(r,s);},p=this.path+'dialogs/';o('Form','form',p+'form.js');o('Checkbox','checkbox',p+'checkbox.js');o('Radio','radio',p+'radio.js');o('TextField','textfield',p+'textfield.js');o('Textarea','textarea',p+'textarea.js');o('Select','select',p+'select.js');o('Button','button',p+'button.js');o('ImageButton','imagebutton',j.getPath('image')+'dialogs/image.js');o('HiddenField','hiddenfield',p+'hiddenfield.js');if(m.addMenuItems)m.addMenuItems({form:{label:n.form.menu,command:'form',group:'form'},checkbox:{label:n.checkboxAndRadio.checkboxTitle,command:'checkbox',group:'checkbox'},radio:{label:n.checkboxAndRadio.radioTitle,command:'radio',group:'radio'},textfield:{label:n.textfield.title,command:'textfield',group:'textfield'},hiddenfield:{label:n.hidden.title,command:'hiddenfield',group:'hiddenfield'},imagebutton:{label:n.image.titleButton,command:'imagebutton',group:'imagebutton'},button:{label:n.button.title,command:'button',group:'button'},select:{label:n.select.title,command:'select',group:'select'},textarea:{label:n.textarea.title,command:'textarea',group:'textarea'}});if(m.contextMenu){m.contextMenu.addListener(function(q){if(q&&q.hasAscendant('form',true)&&!q.isReadOnly())return{form:2};});m.contextMenu.addListener(function(q){if(q&&!q.isReadOnly()){var r=q.getName();if(r=='select')return{select:2};if(r=='textarea')return{textarea:2};if(r=='input')switch(q.getAttribute('type')){case 'button':case 'submit':case 'reset':return{button:2};case 'checkbox':return{checkbox:2};case 'radio':return{radio:2};case 'image':return{imagebutton:2};default:return{textfield:2};}if(r=='img'&&q.data('cke-real-element-type')=='hiddenfield')return{hiddenfield:2};}});}m.on('doubleclick',function(q){var r=q.data.element;if(r.is('form'))q.data.dialog='form';else if(r.is('select'))q.data.dialog='select';else if(r.is('textarea'))q.data.dialog='textarea';else if(r.is('img')&&r.data('cke-real-element-type')=='hiddenfield')q.data.dialog='hiddenfield';else if(r.is('input'))switch(r.getAttribute('type')){case 'button':case 'submit':case 'reset':q.data.dialog='button';
+break;case 'checkbox':q.data.dialog='checkbox';break;case 'radio':q.data.dialog='radio';break;case 'image':q.data.dialog='imagebutton';break;default:q.data.dialog='textfield';break;}});},afterInit:function(m){var n=m.dataProcessor,o=n&&n.htmlFilter,p=n&&n.dataFilter;if(c)o&&o.addRules({elements:{input:function(q){var r=q.attributes,s=r.type;if(!s)r.type='text';if(s=='checkbox'||s=='radio')r.value=='on'&&delete r.value;}}});if(p)p.addRules({elements:{input:function(q){if(q.attributes.type=='hidden')return m.createFakeParserElement(q,'cke_hidden','hiddenfield');}}});},requires:['image','fakeobjects']});if(c)h.prototype.hasAttribute=e.override(h.prototype.hasAttribute,function(m){return function(n){var q=this;var o=q.$.attributes.getNamedItem(n);if(q.getName()=='input')switch(n){case 'class':return q.$.className.length>0;case 'checked':return!!q.$.checked;case 'value':var p=q.getAttribute('type');return p=='checkbox'||p=='radio'?q.$.value!='on':q.$.value;}return m.apply(q,arguments);};});(function(){var m={canUndo:false,exec:function(o){var p=o.document.createElement('hr');o.insertElement(p);}},n='horizontalrule';j.add(n,{init:function(o){o.addCommand(n,m);o.ui.addButton('HorizontalRule',{label:o.lang.horizontalrule,command:n});}});})();(function(){var m=/^[\t\r\n ]*(?: |\xa0)$/,n='{cke_protected}';function o(T){var U=T.children.length,V=T.children[U-1];while(V&&V.type==3&&!e.trim(V.value))V=T.children[--U];return V;};function p(T,U){var V=T.children,W=o(T);if(W){if((U||!c)&&W.type==1&&W.name=='br')V.pop();if(W.type==3&&m.test(W.value))V.pop();}};function q(T,U,V){if(!U&&(!V||typeof V=='function'&&V(T)===false))return false;if(U&&c&&(document.documentMode>7||T.name in f.tr||T.name in f.$listItem))return false;var W=o(T);return!W||W&&(W.type==1&&W.name=='br'||T.name=='form'&&W.name=='input');};function r(T,U){return function(V){p(V,!T);if(q(V,!T,U))if(T||c)V.add(new a.htmlParser.text('\xa0'));else V.add(new a.htmlParser.element('br',{}));};};var s=f,t=['caption','colgroup','col','thead','tfoot','tbody'],u=e.extend({},s.$block,s.$listItem,s.$tableContent);for(var v in u){if(!('br' in s[v]))delete u[v];}delete u.pre;var w={elements:{},attributeNames:[[/^on/,'data-cke-pa-on']]},x={elements:{}};for(v in u)x.elements[v]=r();var y={elementNames:[[/^cke:/,''],[/^\?xml:namespace$/,'']],attributeNames:[[/^data-cke-(saved|pa)-/,''],[/^data-cke-.*/,''],['hidefocus','']],elements:{$:function(T){var U=T.attributes;if(U){if(U['data-cke-temp'])return false;var V=['name','href','src'],W;
+for(var X=0;X<V.length;X++){W='data-cke-saved-'+V[X];W in U&&delete U[V[X]];}}return T;},table:function(T){var U=T.children;U.sort(function(V,W){return V.type==1&&W.type==V.type?e.indexOf(t,V.name)>e.indexOf(t,W.name)?1:-1:0;});},embed:function(T){var U=T.parent;if(U&&U.name=='object'){var V=U.attributes.width,W=U.attributes.height;V&&(T.attributes.width=V);W&&(T.attributes.height=W);}},param:function(T){T.children=[];T.isEmpty=true;return T;},a:function(T){if(!(T.children.length||T.attributes.name||T.attributes['data-cke-saved-name']))return false;},span:function(T){if(T.attributes['class']=='Apple-style-span')delete T.name;},pre:function(T){c&&p(T);},html:function(T){delete T.attributes.contenteditable;delete T.attributes['class'];},body:function(T){delete T.attributes.spellcheck;delete T.attributes.contenteditable;},style:function(T){var U=T.children[0];U&&U.value&&(U.value=e.trim(U.value));if(!T.attributes.type)T.attributes.type='text/css';},title:function(T){var U=T.children[0];U&&(U.value=T.attributes['data-cke-title']||'');}},attributes:{'class':function(T,U){return e.ltrim(T.replace(/(?:^|\s+)cke_[^\s]*/g,''))||false;}}};if(c)y.attributes.style=function(T,U){return T.replace(/(^|;)([^\:]+)/g,function(V){return V.toLowerCase();});};function z(T){var U=T.attributes;if(U.contenteditable!='false')U['data-cke-editable']=U.contenteditable?'true':1;U.contenteditable='false';};function A(T){var U=T.attributes;switch(U['data-cke-editable']){case 'true':U.contenteditable='true';break;case '1':delete U.contenteditable;break;}};for(v in {input:1,textarea:1}){w.elements[v]=z;y.elements[v]=A;}var B=/<(a|area|img|input)\b([^>]*)>/gi,C=/\b(on\w+|href|src|name)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+))/gi,D=/(?:<style(?=[ >])[^>]*>[\s\S]*<\/style>)|(?:<(:?link|meta|base)[^>]*>)/gi,E=/<cke:encoded>([^<]*)<\/cke:encoded>/gi,F=/(<\/?)((?:object|embed|param|html|body|head|title)[^>]*>)/gi,G=/(<\/?)cke:((?:html|body|head|title)[^>]*>)/gi,H=/<cke:(param|embed)([^>]*?)\/?>(?!\s*<\/cke:\1)/gi;function I(T){return T.replace(B,function(U,V,W){return '<'+V+W.replace(C,function(X,Y){if(!/^on/.test(Y)&&W.indexOf('data-cke-saved-'+Y)==-1)return ' data-cke-saved-'+X+' data-cke-'+a.rnd+'-'+X;return X;})+'>';});};function J(T){return T.replace(D,function(U){return '<cke:encoded>'+encodeURIComponent(U)+'</cke:encoded>';});};function K(T){return T.replace(E,function(U,V){return decodeURIComponent(V);});};function L(T){return T.replace(F,'$1cke:$2');};function M(T){return T.replace(G,'$1$2');
+};function N(T){return T.replace(H,'<cke:$1$2></cke:$1>');};function O(T){return T.replace(/(<pre\b[^>]*>)(\r\n|\n)/g,'$1$2$2');};function P(T){return T.replace(/<!--(?!{cke_protected})[\s\S]+?-->/g,function(U){return '<!--'+n+'{C}'+encodeURIComponent(U).replace(/--/g,'%2D%2D')+'-->';});};function Q(T){return T.replace(/<!--\{cke_protected\}\{C\}([\s\S]+?)-->/g,function(U,V){return decodeURIComponent(V);});};function R(T,U){var V=U._.dataStore;return T.replace(/<!--\{cke_protected\}([\s\S]+?)-->/g,function(W,X){return decodeURIComponent(X);}).replace(/\{cke_protected_(\d+)\}/g,function(W,X){return V&&V[X]||'';});};function S(T,U){var V=[],W=U.config.protectedSource,X=U._.dataStore||(U._.dataStore={id:1}),Y=/<\!--\{cke_temp(comment)?\}(\d*?)-->/g,Z=[/<script[\s\S]*?<\/script>/gi,/<noscript[\s\S]*?<\/noscript>/gi].concat(W);T=T.replace(/<!--[\s\S]*?-->/g,function(ab){return '<!--{cke_tempcomment}'+(V.push(ab)-1)+'-->';});for(var aa=0;aa<Z.length;aa++)T=T.replace(Z[aa],function(ab){ab=ab.replace(Y,function(ac,ad,ae){return V[ae];});return/cke_temp(comment)?/.test(ab)?ab:'<!--{cke_temp}'+(V.push(ab)-1)+'-->';});T=T.replace(Y,function(ab,ac,ad){return '<!--'+n+(ac?'{C}':'')+encodeURIComponent(V[ad]).replace(/--/g,'%2D%2D')+'-->';});return T.replace(/(['"]).*?\1/g,function(ab){return ab.replace(/<!--\{cke_protected\}([\s\S]+?)-->/g,function(ac,ad){X[X.id]=decodeURIComponent(ad);return '{cke_protected_'+X.id++ +'}';});});};j.add('htmldataprocessor',{requires:['htmlwriter'],init:function(T){var U=T.dataProcessor=new a.htmlDataProcessor(T);U.writer.forceSimpleAmpersand=T.config.forceSimpleAmpersand;U.dataFilter.addRules(w);U.dataFilter.addRules(x);U.htmlFilter.addRules(y);var V={elements:{}};for(v in u)V.elements[v]=r(true,T.config.fillEmptyBlocks);U.htmlFilter.addRules(V);},onLoad:function(){!('fillEmptyBlocks' in i)&&(i.fillEmptyBlocks=1);}});a.htmlDataProcessor=function(T){var U=this;U.editor=T;U.writer=new a.htmlWriter();U.dataFilter=new a.htmlParser.filter();U.htmlFilter=new a.htmlParser.filter();};a.htmlDataProcessor.prototype={toHtml:function(T,U){T=S(T,this.editor);T=I(T);T=J(T);T=L(T);T=N(T);T=O(T);var V=new h('div');V.setHtml('a'+T);T=V.getHtml().substr(1);T=T.replace(new RegExp(' data-cke-'+a.rnd+'-','ig'),' ');T=M(T);T=K(T);T=Q(T);var W=a.htmlParser.fragment.fromHtml(T,U),X=new a.htmlParser.basicWriter();W.writeHtml(X,this.dataFilter);T=X.getHtml(true);T=P(T);return T;},toDataFormat:function(T,U){var V=this.writer,W=a.htmlParser.fragment.fromHtml(T,U);V.reset();
+W.writeHtml(V,this.htmlFilter);var X=V.getHtml(true);X=Q(X);X=R(X,this.editor);return X;}};})();(function(){j.add('iframe',{requires:['dialog','fakeobjects'],init:function(m){var n='iframe',o=m.lang.iframe;a.dialog.add(n,this.path+'dialogs/iframe.js');m.addCommand(n,new a.dialogCommand(n));m.addCss('img.cke_iframe{background-image: url('+a.getUrl(this.path+'images/placeholder.png')+');'+'background-position: center center;'+'background-repeat: no-repeat;'+'border: 1px solid #a9a9a9;'+'width: 80px;'+'height: 80px;'+'}');m.ui.addButton('Iframe',{label:o.toolbar,command:n});m.on('doubleclick',function(p){var q=p.data.element;if(q.is('img')&&q.data('cke-real-element-type')=='iframe')p.data.dialog='iframe';});if(m.addMenuItems)m.addMenuItems({iframe:{label:o.title,command:'iframe',group:'image'}});if(m.contextMenu)m.contextMenu.addListener(function(p,q){if(p&&p.is('img')&&p.data('cke-real-element-type')=='iframe')return{iframe:2};});},afterInit:function(m){var n=m.dataProcessor,o=n&&n.dataFilter;if(o)o.addRules({elements:{iframe:function(p){return m.createFakeParserElement(p,'cke_iframe','iframe',true);}}});}});})();(function(){j.add('image',{requires:['dialog'],init:function(o){var p='image';a.dialog.add(p,this.path+'dialogs/image.js');o.addCommand(p,new a.dialogCommand(p));o.ui.addButton('Image',{label:o.lang.common.image,command:p});o.on('doubleclick',function(q){var r=q.data.element;if(r.is('img')&&!r.data('cke-realelement')&&!r.isReadOnly())q.data.dialog='image';});if(o.addMenuItems)o.addMenuItems({image:{label:o.lang.image.menu,command:'image',group:'image'}});if(o.contextMenu)o.contextMenu.addListener(function(q,r){if(m(o,q))return{image:2};});},afterInit:function(o){p('left');p('right');p('center');p('block');function p(q){var r=o.getCommand('justify'+q);if(r){if(q=='left'||q=='right')r.on('exec',function(s){var t=m(o),u;if(t){u=n(t);if(u==q){t.removeStyle('float');if(q==n(t))t.removeAttribute('align');}else t.setStyle('float',q);s.cancel();}});r.on('refresh',function(s){var t=m(o),u;if(t){u=n(t);this.setState(u==q?1:q=='right'||q=='left'?2:0);s.cancel();}});}};}});function m(o,p){if(!p){var q=o.getSelection();p=q.getType()==3&&q.getSelectedElement();}if(p&&p.is('img')&&!p.data('cke-realelement')&&!p.isReadOnly())return p;};function n(o){var p=o.getStyle('float');if(p=='inherit'||p=='none')p=0;if(!p)p=o.getAttribute('align');return p;};})();i.image_removeLinkByEmptyURL=true;(function(){var m={ol:1,ul:1},n=d.walker.whitespaces(true),o=d.walker.bookmark(false,true);
+function p(t){var B=this;if(t.editor.readOnly)return null;var u=t.editor,v=t.data.path,w=v&&v.contains(m),x=v.block||v.blockLimit;if(w)return B.setState(2);if(!B.useIndentClasses&&B.name=='indent')return B.setState(2);if(!x)return B.setState(0);if(B.useIndentClasses){var y=x.$.className.match(B.classNameRegex),z=0;if(y){y=y[1];z=B.indentClassMap[y];}if(B.name=='outdent'&&!z||B.name=='indent'&&z==u.config.indentClasses.length)return B.setState(0);return B.setState(2);}else{var A=parseInt(x.getStyle(r(x)),10);if(isNaN(A))A=0;if(A<=0)return B.setState(0);return B.setState(2);}};function q(t,u){var w=this;w.name=u;w.useIndentClasses=t.config.indentClasses&&t.config.indentClasses.length>0;if(w.useIndentClasses){w.classNameRegex=new RegExp('(?:^|\\s+)('+t.config.indentClasses.join('|')+')(?=$|\\s)');w.indentClassMap={};for(var v=0;v<t.config.indentClasses.length;v++)w.indentClassMap[t.config.indentClasses[v]]=v+1;}w.startDisabled=u=='outdent';};function r(t,u){return(u||t.getComputedStyle('direction'))=='ltr'?'margin-left':'margin-right';};function s(t){return t.type==1&&t.is('li');};q.prototype={exec:function(t){var u=this,v={};function w(M){var N=C.startContainer,O=C.endContainer;while(N&&!N.getParent().equals(M))N=N.getParent();while(O&&!O.getParent().equals(M))O=O.getParent();if(!N||!O)return;var P=N,Q=[],R=false;while(!R){if(P.equals(O))R=true;Q.push(P);P=P.getNext();}if(Q.length<1)return;var S=M.getParents(true);for(var T=0;T<S.length;T++){if(S[T].getName&&m[S[T].getName()]){M=S[T];break;}}var U=u.name=='indent'?1:-1,V=Q[0],W=Q[Q.length-1],X=j.list.listToArray(M,v),Y=X[W.getCustomData('listarray_index')].indent;for(T=V.getCustomData('listarray_index');T<=W.getCustomData('listarray_index');T++){X[T].indent+=U;if(U>0){var Z=X[T].parent;X[T].parent=new h(Z.getName(),Z.getDocument());}}for(T=W.getCustomData('listarray_index')+1;T<X.length&&X[T].indent>Y;T++)X[T].indent+=U;var aa=j.list.arrayToList(X,v,null,t.config.enterMode,M.getDirection());if(u.name=='outdent'){var ab;if((ab=M.getParent())&&ab.is('li')){var ac=aa.listNode.getChildren(),ad=[],ae=ac.count(),af;for(T=ae-1;T>=0;T--){if((af=ac.getItem(T))&&af.is&&af.is('li'))ad.push(af);}}}if(aa)aa.listNode.replace(M);if(ad&&ad.length)for(T=0;T<ad.length;T++){var ag=ad[T],ah=ag;while((ah=ah.getNext())&&ah.is&&ah.getName() in m){if(c&&!ag.getFirst(function(ai){return n(ai)&&o(ai);}))ag.append(C.document.createText('\xa0'));ag.append(ah);}ag.insertAfter(ab);}};function x(){var M=C.createIterator(),N=t.config.enterMode;
+M.enforceRealBlocks=true;M.enlargeBr=N!=2;var O;while(O=M.getNextParagraph(N==1?'p':'div'))y(O);};function y(M,N){if(M.getCustomData('indent_processed'))return false;if(u.useIndentClasses){var O=M.$.className.match(u.classNameRegex),P=0;if(O){O=O[1];P=u.indentClassMap[O];}if(u.name=='outdent')P--;else P++;if(P<0)return false;P=Math.min(P,t.config.indentClasses.length);P=Math.max(P,0);M.$.className=e.ltrim(M.$.className.replace(u.classNameRegex,''));if(P>0)M.addClass(t.config.indentClasses[P-1]);}else{var Q=r(M,N),R=parseInt(M.getStyle(Q),10);if(isNaN(R))R=0;var S=t.config.indentOffset||40;R+=(u.name=='indent'?1:-1)*S;if(R<0)return false;R=Math.max(R,0);R=Math.ceil(R/S)*S;M.setStyle(Q,R?R+(t.config.indentUnit||'px'):'');if(M.getAttribute('style')==='')M.removeAttribute('style');}h.setMarker(v,M,'indent_processed',1);return true;};var z=t.getSelection(),A=z.createBookmarks(1),B=z&&z.getRanges(1),C,D=B.createIterator();while(C=D.getNextRange()){var E=C.getCommonAncestor(),F=E;while(F&&!(F.type==1&&m[F.getName()]))F=F.getParent();if(!F){var G=C.getEnclosedNode();if(G&&G.type==1&&G.getName() in m){C.setStartAt(G,1);C.setEndAt(G,2);F=G;}}if(F&&C.startContainer.type==1&&C.startContainer.getName() in m){var H=new d.walker(C);H.evaluator=s;C.startContainer=H.next();}if(F&&C.endContainer.type==1&&C.endContainer.getName() in m){H=new d.walker(C);H.evaluator=s;C.endContainer=H.previous();}if(F){var I=F.getFirst(s),J=!!I.getNext(s),K=C.startContainer,L=I.equals(K)||I.contains(K);if(!(L&&(u.name=='indent'||u.useIndentClasses||parseInt(F.getStyle(r(F)),10))&&y(F,!J&&I.getDirection())))w(F);}else x();}h.clearAllMarkers(v);t.forceNextSelectionCheck();z.selectBookmarks(A);}};j.add('indent',{init:function(t){var u=t.addCommand('indent',new q(t,'indent')),v=t.addCommand('outdent',new q(t,'outdent'));t.ui.addButton('Indent',{label:t.lang.indent,command:'indent'});t.ui.addButton('Outdent',{label:t.lang.outdent,command:'outdent'});t.on('selectionChange',e.bind(p,u));t.on('selectionChange',e.bind(p,v));if(b.ie6Compat||b.ie7Compat)t.addCss('ul,ol{\tmargin-left: 0px;\tpadding-left: 40px;}');t.on('dirChanged',function(w){var x=new d.range(t.document);x.setStartBefore(w.data.node);x.setEndAfter(w.data.node);var y=new d.walker(x),z;while(z=y.next()){if(z.type==1){if(!z.equals(w.data.node)&&z.getDirection()){x.setStartAfter(z);y=new d.walker(x);continue;}var A=t.config.indentClasses;if(A){var B=w.data.dir=='ltr'?['_rtl','']:['','_rtl'];for(var C=0;C<A.length;C++){if(z.hasClass(A[C]+B[0])){z.removeClass(A[C]+B[0]);
+z.addClass(A[C]+B[1]);}}}var D=z.getStyle('margin-right'),E=z.getStyle('margin-left');D?z.setStyle('margin-left',D):z.removeStyle('margin-left');E?z.setStyle('margin-right',E):z.removeStyle('margin-right');}}});},requires:['domiterator','list']});})();(function(){function m(q,r){r=r===undefined||r;var s;if(r)s=q.getComputedStyle('text-align');else{while(!q.hasAttribute||!(q.hasAttribute('align')||q.getStyle('text-align'))){var t=q.getParent();if(!t)break;q=t;}s=q.getStyle('text-align')||q.getAttribute('align')||'';}s&&(s=s.replace(/(?:-(?:moz|webkit)-)?(?:start|auto)/i,''));!s&&r&&(s=q.getComputedStyle('direction')=='rtl'?'right':'left');return s;};function n(q){if(q.editor.readOnly)return;q.editor.getCommand(this.name).refresh(q.data.path);};function o(q,r,s){var u=this;u.editor=q;u.name=r;u.value=s;var t=q.config.justifyClasses;if(t){switch(s){case 'left':u.cssClassName=t[0];break;case 'center':u.cssClassName=t[1];break;case 'right':u.cssClassName=t[2];break;case 'justify':u.cssClassName=t[3];break;}u.cssClassRegex=new RegExp('(?:^|\\s+)(?:'+t.join('|')+')(?=$|\\s)');}};function p(q){var r=q.editor,s=new d.range(r.document);s.setStartBefore(q.data.node);s.setEndAfter(q.data.node);var t=new d.walker(s),u;while(u=t.next()){if(u.type==1){if(!u.equals(q.data.node)&&u.getDirection()){s.setStartAfter(u);t=new d.walker(s);continue;}var v=r.config.justifyClasses;if(v)if(u.hasClass(v[0])){u.removeClass(v[0]);u.addClass(v[2]);}else if(u.hasClass(v[2])){u.removeClass(v[2]);u.addClass(v[0]);}var w='text-align',x=u.getStyle(w);if(x=='left')u.setStyle(w,'right');else if(x=='right')u.setStyle(w,'left');}}};o.prototype={exec:function(q){var C=this;var r=q.getSelection(),s=q.config.enterMode;if(!r)return;var t=r.createBookmarks(),u=r.getRanges(true),v=C.cssClassName,w,x,y=q.config.useComputedState;y=y===undefined||y;for(var z=u.length-1;z>=0;z--){w=u[z].createIterator();w.enlargeBr=s!=2;while(x=w.getNextParagraph(s==1?'p':'div')){x.removeAttribute('align');x.removeStyle('text-align');var A=v&&(x.$.className=e.ltrim(x.$.className.replace(C.cssClassRegex,''))),B=C.state==2&&(!y||m(x,true)!=C.value);if(v){if(B)x.addClass(v);else if(!A)x.removeAttribute('class');}else if(B)x.setStyle('text-align',C.value);}}q.focus();q.forceNextSelectionCheck();r.selectBookmarks(t);},refresh:function(q){var r=q.block||q.blockLimit;this.setState(r.getName()!='body'&&m(r,this.editor.config.useComputedState)==this.value?1:2);}};j.add('justify',{init:function(q){var r=new o(q,'justifyleft','left'),s=new o(q,'justifycenter','center'),t=new o(q,'justifyright','right'),u=new o(q,'justifyblock','justify');
+q.addCommand('justifyleft',r);q.addCommand('justifycenter',s);q.addCommand('justifyright',t);q.addCommand('justifyblock',u);q.ui.addButton('JustifyLeft',{label:q.lang.justify.left,command:'justifyleft'});q.ui.addButton('JustifyCenter',{label:q.lang.justify.center,command:'justifycenter'});q.ui.addButton('JustifyRight',{label:q.lang.justify.right,command:'justifyright'});q.ui.addButton('JustifyBlock',{label:q.lang.justify.block,command:'justifyblock'});q.on('selectionChange',e.bind(n,r));q.on('selectionChange',e.bind(n,t));q.on('selectionChange',e.bind(n,s));q.on('selectionChange',e.bind(n,u));q.on('dirChanged',p);},requires:['domiterator']});})();j.add('keystrokes',{beforeInit:function(m){m.keystrokeHandler=new a.keystrokeHandler(m);m.specialKeys={};},init:function(m){var n=m.config.keystrokes,o=m.config.blockedKeystrokes,p=m.keystrokeHandler.keystrokes,q=m.keystrokeHandler.blockedKeystrokes;for(var r=0;r<n.length;r++)p[n[r][0]]=n[r][1];for(r=0;r<o.length;r++)q[o[r]]=1;}});a.keystrokeHandler=function(m){var n=this;if(m.keystrokeHandler)return m.keystrokeHandler;n.keystrokes={};n.blockedKeystrokes={};n._={editor:m};return n;};(function(){var m,n=function(p){p=p.data;var q=p.getKeystroke(),r=this.keystrokes[q],s=this._.editor;m=s.fire('key',{keyCode:q})===true;if(!m){if(r){var t={from:'keystrokeHandler'};m=s.execCommand(r,t)!==false;}if(!m){var u=s.specialKeys[q];m=u&&u(s)===true;if(!m)m=!!this.blockedKeystrokes[q];}}if(m)p.preventDefault(true);return!m;},o=function(p){if(m){m=false;p.data.preventDefault(true);}};a.keystrokeHandler.prototype={attach:function(p){p.on('keydown',n,this);if(b.opera||b.gecko&&b.mac)p.on('keypress',o,this);}};})();i.blockedKeystrokes=[1114112+66,1114112+73,1114112+85];i.keystrokes=[[4456448+121,'toolbarFocus'],[4456448+122,'elementsPathFocus'],[2228224+121,'contextMenu'],[1114112+2228224+121,'contextMenu'],[1114112+90,'undo'],[1114112+89,'redo'],[1114112+2228224+90,'redo'],[1114112+76,'link'],[1114112+66,'bold'],[1114112+73,'italic'],[1114112+85,'underline'],[4456448+(c||b.webkit?189:109),'toolbarCollapse'],[4456448+48,'a11yHelp']];j.add('link',{requires:['fakeobjects','dialog'],init:function(m){m.addCommand('link',new a.dialogCommand('link'));m.addCommand('anchor',new a.dialogCommand('anchor'));m.addCommand('unlink',new a.unlinkCommand());m.addCommand('removeAnchor',new a.removeAnchorCommand());m.ui.addButton('Link',{label:m.lang.link.toolbar,command:'link'});m.ui.addButton('Unlink',{label:m.lang.unlink,command:'unlink'});m.ui.addButton('Anchor',{label:m.lang.anchor.toolbar,command:'anchor'});
+a.dialog.add('link',this.path+'dialogs/link.js');a.dialog.add('anchor',this.path+'dialogs/anchor.js');var n=m.lang.dir=='rtl'?'right':'left',o='background:url('+a.getUrl(this.path+'images/anchor.gif')+') no-repeat '+n+' center;'+'border:1px dotted #00f;';m.addCss('a.cke_anchor,a.cke_anchor_empty'+(c&&b.version<7?'':',a[name],a[data-cke-saved-name]')+'{'+o+'padding-'+n+':18px;'+'cursor:auto;'+'}'+(c?'a.cke_anchor_empty{display:inline-block;}':'')+'img.cke_anchor'+'{'+o+'width:16px;'+'min-height:15px;'+'height:1.15em;'+'vertical-align:'+(b.opera?'middle':'text-bottom')+';'+'}');m.on('selectionChange',function(p){if(m.readOnly)return;var q=m.getCommand('unlink'),r=p.data.path.lastElement&&p.data.path.lastElement.getAscendant('a',true);if(r&&r.getName()=='a'&&r.getAttribute('href')&&r.getChildCount())q.setState(2);else q.setState(0);});m.on('doubleclick',function(p){var q=j.link.getSelectedLink(m)||p.data.element;if(!q.isReadOnly())if(q.is('a')){p.data.dialog=q.getAttribute('name')&&(!q.getAttribute('href')||!q.getChildCount())?'anchor':'link';m.getSelection().selectElement(q);}else if(j.link.tryRestoreFakeAnchor(m,q))p.data.dialog='anchor';});if(m.addMenuItems)m.addMenuItems({anchor:{label:m.lang.anchor.menu,command:'anchor',group:'anchor',order:1},removeAnchor:{label:m.lang.anchor.remove,command:'removeAnchor',group:'anchor',order:5},link:{label:m.lang.link.menu,command:'link',group:'link',order:1},unlink:{label:m.lang.unlink,command:'unlink',group:'link',order:5}});if(m.contextMenu)m.contextMenu.addListener(function(p,q){if(!p||p.isReadOnly())return null;var r=j.link.tryRestoreFakeAnchor(m,p);if(!r&&!(r=j.link.getSelectedLink(m)))return null;var s={};if(r.getAttribute('href')&&r.getChildCount())s={link:2,unlink:2};if(r&&r.hasAttribute('name'))s.anchor=s.removeAnchor=2;return s;});},afterInit:function(m){var n=m.dataProcessor,o=n&&n.dataFilter,p=n&&n.htmlFilter,q=m._.elementsPath&&m._.elementsPath.filters;if(o)o.addRules({elements:{a:function(r){var s=r.attributes;if(!s.name)return null;var t=!r.children.length;if(j.link.synAnchorSelector){var u=t?'cke_anchor_empty':'cke_anchor',v=s['class'];if(s.name&&(!v||v.indexOf(u)<0))s['class']=(v||'')+' '+u;if(t&&j.link.emptyAnchorFix){s.contenteditable='false';s['data-cke-editable']=1;}}else if(j.link.fakeAnchor&&t)return m.createFakeParserElement(r,'cke_anchor','anchor');return null;}}});if(j.link.emptyAnchorFix&&p)p.addRules({elements:{a:function(r){delete r.attributes.contenteditable;}}});if(q)q.push(function(r,s){if(s=='a')if(j.link.tryRestoreFakeAnchor(m,r)||r.getAttribute('name')&&(!r.getAttribute('href')||!r.getChildCount()))return 'anchor';
+});}});j.link={getSelectedLink:function(m){try{var n=m.getSelection();if(n.getType()==3){var o=n.getSelectedElement();if(o.is('a'))return o;}var p=n.getRanges(true)[0];p.shrink(2);var q=p.getCommonAncestor();return q.getAscendant('a',true);}catch(r){return null;}},fakeAnchor:b.opera||b.webkit,synAnchorSelector:c,emptyAnchorFix:c&&b.version<8,tryRestoreFakeAnchor:function(m,n){if(n&&n.data('cke-real-element-type')&&n.data('cke-real-element-type')=='anchor'){var o=m.restoreRealElement(n);if(o.data('cke-saved-name'))return o;}}};a.unlinkCommand=function(){};a.unlinkCommand.prototype={exec:function(m){var n=m.getSelection(),o=n.createBookmarks(),p=n.getRanges(),q,r;for(var s=0;s<p.length;s++){q=p[s].getCommonAncestor(true);r=q.getAscendant('a',true);if(!r)continue;p[s].selectNodeContents(r);}n.selectRanges(p);m.document.$.execCommand('unlink',false,null);n.selectBookmarks(o);},startDisabled:true};a.removeAnchorCommand=function(){};a.removeAnchorCommand.prototype={exec:function(m){var n=m.getSelection(),o=n.createBookmarks(),p;if(n&&(p=n.getSelectedElement())&&(j.link.fakeAnchor&&!p.getChildCount()?j.link.tryRestoreFakeAnchor(m,p):p.is('a')))p.remove(1);else if(p=j.link.getSelectedLink(m))if(p.hasAttribute('href')){p.removeAttributes({name:1,'data-cke-saved-name':1});p.removeClass('cke_anchor');}else p.remove(1);n.selectBookmarks(o);}};e.extend(i,{linkShowAdvancedTab:true,linkShowTargetTab:true});(function(){var m={ol:1,ul:1},n=/^[\n\r\t ]*$/,o=d.walker.whitespaces(),p=d.walker.bookmark(),q=function(N){return!(o(N)||p(N));},r=d.walker.bogus();function s(N){var O,P,Q;if(O=N.getDirection()){P=N.getParent();while(P&&!(Q=P.getDirection()))P=P.getParent();if(O==Q)N.removeAttribute('dir');}};function t(N,O){var P=N.getAttribute('style');P&&O.setAttribute('style',P.replace(/([^;])$/,'$1;')+(O.getAttribute('style')||''));};j.list={listToArray:function(N,O,P,Q,R){if(!m[N.getName()])return[];if(!Q)Q=0;if(!P)P=[];for(var S=0,T=N.getChildCount();S<T;S++){var U=N.getChild(S);if(U.type==1&&U.getName() in f.$list)j.list.listToArray(U,O,P,Q+1);if(U.$.nodeName.toLowerCase()!='li')continue;var V={parent:N,indent:Q,element:U,contents:[]};if(!R){V.grandparent=N.getParent();if(V.grandparent&&V.grandparent.$.nodeName.toLowerCase()=='li')V.grandparent=V.grandparent.getParent();}else V.grandparent=R;if(O)h.setMarker(O,U,'listarray_index',P.length);P.push(V);for(var W=0,X=U.getChildCount(),Y;W<X;W++){Y=U.getChild(W);if(Y.type==1&&m[Y.getName()])j.list.listToArray(Y,O,P,Q+1,V.grandparent);
+else V.contents.push(Y);}}return P;},arrayToList:function(N,O,P,Q,R){if(!P)P=0;if(!N||N.length<P+1)return null;var S,T=N[P].parent.getDocument(),U=new d.documentFragment(T),V=null,W=P,X=Math.max(N[P].indent,0),Y=null,Z,aa,ab=Q==1?'p':'div';while(1){var ac=N[W],ad=ac.grandparent;Z=ac.element.getDirection(1);if(ac.indent==X){if(!V||N[W].parent.getName()!=V.getName()){V=N[W].parent.clone(false,1);R&&V.setAttribute('dir',R);U.append(V);}Y=V.append(ac.element.clone(0,1));if(Z!=V.getDirection(1))Y.setAttribute('dir',Z);for(S=0;S<ac.contents.length;S++)Y.append(ac.contents[S].clone(1,1));W++;}else if(ac.indent==Math.max(X,0)+1){var ae=N[W-1].element.getDirection(1),af=j.list.arrayToList(N,null,W,Q,ae!=Z?Z:null);if(!Y.getChildCount()&&c&&!(T.$.documentMode>7))Y.append(T.createText('\xa0'));Y.append(af.listNode);W=af.nextIndex;}else if(ac.indent==-1&&!P&&ad){if(m[ad.getName()]){Y=ac.element.clone(false,true);if(Z!=ad.getDirection(1))Y.setAttribute('dir',Z);}else Y=new d.documentFragment(T);var ag=ad.getDirection(1)!=Z,ah=ac.element,ai=ah.getAttribute('class'),aj=ah.getAttribute('style'),ak=Y.type==11&&(Q!=2||ag||aj||ai),al,am=ac.contents.length;for(S=0;S<am;S++){al=ac.contents[S];if(al.type==1&&al.isBlockBoundary()){if(ag&&!al.getDirection())al.setAttribute('dir',Z);t(ah,al);ai&&al.addClass(ai);}else if(ak){if(!aa){aa=T.createElement(ab);ag&&aa.setAttribute('dir',Z);}aj&&aa.setAttribute('style',aj);ai&&aa.setAttribute('class',ai);aa.append(al.clone(1,1));}Y.append(aa||al.clone(1,1));}if(Y.type==11&&W!=N.length-1){var an=Y.getLast();if(an&&an.type==1&&an.getAttribute('type')=='_moz')an.remove();if(!(an=Y.getLast(q)&&an.type==1&&an.getName() in f.$block))Y.append(T.createElement('br'));}var ao=Y.$.nodeName.toLowerCase();if(!c&&(ao=='div'||ao=='p'))Y.appendBogus();U.append(Y);V=null;W++;}else return null;aa=null;if(N.length<=W||Math.max(N[W].indent,0)<X)break;}if(O){var ap=U.getFirst(),aq=N[0].parent;while(ap){if(ap.type==1){h.clearMarkers(O,ap);if(ap.getName() in f.$listItem)s(ap);}ap=ap.getNextSourceNode();}}return{listNode:U,nextIndex:W};}};function u(N){if(N.editor.readOnly)return null;var O=N.data.path,P=O.blockLimit,Q=O.elements,R,S;for(S=0;S<Q.length&&(R=Q[S])&&!R.equals(P);S++){if(m[Q[S].getName()])return this.setState(this.type==Q[S].getName()?1:2);}return this.setState(2);};function v(N,O,P,Q){var R=j.list.listToArray(O.root,P),S=[];for(var T=0;T<O.contents.length;T++){var U=O.contents[T];U=U.getAscendant('li',true);if(!U||U.getCustomData('list_item_processed'))continue;
+S.push(U);h.setMarker(P,U,'list_item_processed',true);}var V=O.root,W=V.getDocument(),X,Y;for(T=0;T<S.length;T++){var Z=S[T].getCustomData('listarray_index');X=R[Z].parent;if(!X.is(this.type)){Y=W.createElement(this.type);X.copyAttributes(Y,{start:1,type:1});Y.removeStyle('list-style-type');R[Z].parent=Y;}}var aa=j.list.arrayToList(R,P,null,N.config.enterMode),ab,ac=aa.listNode.getChildCount();for(T=0;T<ac&&(ab=aa.listNode.getChild(T));T++){if(ab.getName()==this.type)Q.push(ab);}aa.listNode.replace(O.root);};var w=/^h[1-6]$/;function x(N,O,P){var Q=O.contents,R=O.root.getDocument(),S=[];if(Q.length==1&&Q[0].equals(O.root)){var T=R.createElement('div');Q[0].moveChildren&&Q[0].moveChildren(T);Q[0].append(T);Q[0]=T;}var U=O.contents[0].getParent();for(var V=0;V<Q.length;V++)U=U.getCommonAncestor(Q[V].getParent());var W=N.config.useComputedState,X,Y;W=W===undefined||W;for(V=0;V<Q.length;V++){var Z=Q[V],aa;while(aa=Z.getParent()){if(aa.equals(U)){S.push(Z);if(!Y&&Z.getDirection())Y=1;var ab=Z.getDirection(W);if(X!==null)if(X&&X!=ab)X=null;else X=ab;break;}Z=aa;}}if(S.length<1)return;var ac=S[S.length-1].getNext(),ad=R.createElement(this.type);P.push(ad);var ae,af;while(S.length){ae=S.shift();af=R.createElement('li');if(ae.is('pre')||w.test(ae.getName()))ae.appendTo(af);else{ae.copyAttributes(af);if(X&&ae.getDirection()){af.removeStyle('direction');af.removeAttribute('dir');}ae.moveChildren(af);ae.remove();}af.appendTo(ad);}if(X&&Y)ad.setAttribute('dir',X);if(ac)ad.insertBefore(ac);else ad.appendTo(U);};function y(N,O,P){var Q=j.list.listToArray(O.root,P),R=[];for(var S=0;S<O.contents.length;S++){var T=O.contents[S];T=T.getAscendant('li',true);if(!T||T.getCustomData('list_item_processed'))continue;R.push(T);h.setMarker(P,T,'list_item_processed',true);}var U=null;for(S=0;S<R.length;S++){var V=R[S].getCustomData('listarray_index');Q[V].indent=-1;U=V;}for(S=U+1;S<Q.length;S++){if(Q[S].indent>Q[S-1].indent+1){var W=Q[S-1].indent+1-Q[S].indent,X=Q[S].indent;while(Q[S]&&Q[S].indent>=X){Q[S].indent+=W;S++;}S--;}}var Y=j.list.arrayToList(Q,P,null,N.config.enterMode,O.root.getAttribute('dir')),Z=Y.listNode,aa,ab;function ac(ad){if((aa=Z[ad?'getFirst':'getLast']())&&!(aa.is&&aa.isBlockBoundary())&&(ab=O.root[ad?'getPrevious':'getNext'](d.walker.whitespaces(true)))&&!(ab.is&&ab.isBlockBoundary({br:1})))N.document.createElement('br')[ad?'insertBefore':'insertAfter'](aa);};ac(true);ac();Z.replace(O.root);};function z(N,O){this.name=N;this.type=O;};var A=d.walker.nodeType(1);function B(N,O,P,Q){var R,S;
+while(R=N[Q?'getLast':'getFirst'](A)){if((S=R.getDirection(1))!==O.getDirection(1))R.setAttribute('dir',S);R.remove();P?R[Q?'insertBefore':'insertAfter'](P):O.append(R,Q);}};z.prototype={exec:function(N){var aq=this;var O=N.document,P=N.config,Q=N.getSelection(),R=Q&&Q.getRanges(true);if(!R||R.length<1)return;if(aq.state==2){var S=O.getBody();if(!S.getFirst(q)){P.enterMode==2?S.appendBogus():R[0].fixBlock(1,P.enterMode==1?'p':'div');Q.selectRanges(R);}else{var T=R.length==1&&R[0],U=T&&T.getEnclosedNode();if(U&&U.is&&aq.type==U.getName())aq.setState(1);}}var V=Q.createBookmarks(true),W=[],X={},Y=R.createIterator(),Z=0;while((T=Y.getNextRange())&&++Z){var aa=T.getBoundaryNodes(),ab=aa.startNode,ac=aa.endNode;if(ab.type==1&&ab.getName()=='td')T.setStartAt(aa.startNode,1);if(ac.type==1&&ac.getName()=='td')T.setEndAt(aa.endNode,2);var ad=T.createIterator(),ae;ad.forceBrBreak=aq.state==2;while(ae=ad.getNextParagraph()){if(ae.getCustomData('list_block'))continue;else h.setMarker(X,ae,'list_block',1);var af=new d.elementPath(ae),ag=af.elements,ah=ag.length,ai=null,aj=0,ak=af.blockLimit,al;for(var am=ah-1;am>=0&&(al=ag[am]);am--){if(m[al.getName()]&&ak.contains(al)){ak.removeCustomData('list_group_object_'+Z);var an=al.getCustomData('list_group_object');if(an)an.contents.push(ae);else{an={root:al,contents:[ae]};W.push(an);h.setMarker(X,al,'list_group_object',an);}aj=1;break;}}if(aj)continue;var ao=ak;if(ao.getCustomData('list_group_object_'+Z))ao.getCustomData('list_group_object_'+Z).contents.push(ae);else{an={root:ao,contents:[ae]};h.setMarker(X,ao,'list_group_object_'+Z,an);W.push(an);}}}var ap=[];while(W.length>0){an=W.shift();if(aq.state==2){if(m[an.root.getName()])v.call(aq,N,an,X,ap);else x.call(aq,N,an,ap);}else if(aq.state==1&&m[an.root.getName()])y.call(aq,N,an,X);}for(am=0;am<ap.length;am++)C(ap[am]);h.clearAllMarkers(X);Q.selectBookmarks(V);N.focus();}};function C(N){var O;(O=function(P){var Q=N[P?'getPrevious':'getNext'](q);if(Q&&Q.type==1&&Q.is(N.getName())){B(N,Q,null,!P);N.remove();N=Q;}})();O(1);};var D=f,E=/[\t\r\n ]*(?: |\xa0)$/;function F(N,O){var P,Q=N.children,R=Q.length;for(var S=0;S<R;S++){P=Q[S];if(P.name&&P.name in O)return S;}return R;};function G(N){return function(O){var P=O.children,Q=F(O,D.$list),R=P[Q],S=R&&R.previous,T;if(S&&(S.name&&S.name=='br'||S.value&&(T=S.value.match(E)))){var U=S;if(!(T&&T.index)&&U==P[0])P[0]=N||c?new a.htmlParser.text('\xa0'):new a.htmlParser.element('br',{});else if(U.name=='br')P.splice(Q-1,1);else U.value=U.value.replace(E,'');
+}};};var H={elements:{}};for(var I in D.$listItem)H.elements[I]=G();var J={elements:{}};for(I in D.$listItem)J.elements[I]=G(true);function K(N){return N.type==1&&(N.getName() in f.$block||N.getName() in f.$listItem)&&f[N.getName()]['#'];};function L(N,O,P){N.fire('saveSnapshot');P.enlarge(3);var Q=P.extractContents();O.trim(false,true);var R=O.createBookmark(),S=new d.elementPath(O.startContainer),T=S.lastElement.getAscendant('li',1),U=S.block.getBogus();U&&U.remove();var V=Q.getLast();if(V&&V.type==1&&V.is('br'))V.remove();var W=O.startContainer.getChild(O.startOffset);if(W)Q.insertBefore(W);else O.startContainer.append(Q);var X=new d.elementPath(P.startContainer),Y=P.startContainer.getAscendant('li',1);if(Y){var Z=M(Y);if(Z)if(T.contains(Y)){B(Z,Y.getParent(),Y);Z.remove();}else T.append(Z);}while(P.checkStartOfBlock()&&P.checkEndOfBlock()){X=new d.elementPath(P.startContainer);var aa=X.block,ab;if(aa.is('li')){ab=aa.getParent();if(aa.equals(ab.getLast(q))&&aa.equals(ab.getFirst(q)))aa=ab;}P.moveToPosition(aa,3);aa.remove();}var ac=P.clone(),ad=N.document.getBody();ac.setEndAt(ad,2);var ae=new d.walker(ac);ae.evaluator=function(ag){return q(ag)&&!r(ag);};var af=ae.next();if(af&&af.type==1&&af.getName() in f.$list)C(af);O.moveToBookmark(R);O.select();N.selectionChange(1);N.fire('saveSnapshot');};function M(N){var O=N.getLast(q);return O&&O.type==1&&O.getName() in m?O:null;};j.add('list',{init:function(N){var O=N.addCommand('numberedlist',new z('numberedlist','ol')),P=N.addCommand('bulletedlist',new z('bulletedlist','ul'));N.ui.addButton('NumberedList',{label:N.lang.numberedlist,command:'numberedlist'});N.ui.addButton('BulletedList',{label:N.lang.bulletedlist,command:'bulletedlist'});N.on('selectionChange',e.bind(u,O));N.on('selectionChange',e.bind(u,P));N.on('key',function(Q){var R=Q.data.keyCode;if(N.mode=='wysiwyg'&&R in {8:1,46:1}){var S=N.getSelection(),T=S.getRanges()[0];if(!T.collapsed)return;var U=R==8,V=N.document.getBody(),W=new d.walker(T.clone());W.evaluator=function(ah){return q(ah)&&!r(ah);};var X=T.clone();if(U){var Y,Z,aa=new d.elementPath(T.startContainer);if((Y=aa.contains(m))&&T.checkBoundaryOfElement(Y,1)&&(Y=Y.getParent())&&Y.is('li')&&(Y=M(Y))){Z=Y;Y=Y.getPrevious(q);X.moveToPosition(Y&&r(Y)?Y:Z,3);}else{W.range.setStartAt(V,1);W.range.setEnd(T.startContainer,T.startOffset);Y=W.previous();if(Y&&Y.type==1&&(Y.getName() in m||Y.is('li'))){if(!Y.is('li')){W.range.selectNodeContents(Y);W.reset();W.evaluator=K;Y=W.previous();}Z=Y;X.moveToElementEditEnd(Z);
+}}if(Z){L(N,X,T);Q.cancel();}}else{var ab=T.startContainer.getAscendant('li',1);if(ab){W.range.setEndAt(V,2);var ac=ab.getLast(q),ad=ac&&K(ac)?ac:ab,ae=0,af=W.next();if(af&&af.type==1&&af.getName() in m&&af.equals(ac)){ae=1;af=W.next();}else if(T.checkBoundaryOfElement(ad,2))ae=1;if(ae&&af){var ag=T.clone();ag.moveToElementEditStart(af);L(N,X,ag);Q.cancel();}}}setTimeout(function(){N.selectionChange(1);});}});},afterInit:function(N){var O=N.dataProcessor;if(O){O.dataFilter.addRules(H);O.htmlFilter.addRules(J);}},requires:['domiterator']});})();(function(){j.liststyle={requires:['dialog'],init:function(m){m.addCommand('numberedListStyle',new a.dialogCommand('numberedListStyle'));a.dialog.add('numberedListStyle',this.path+'dialogs/liststyle.js');m.addCommand('bulletedListStyle',new a.dialogCommand('bulletedListStyle'));a.dialog.add('bulletedListStyle',this.path+'dialogs/liststyle.js');if(m.addMenuItems){m.addMenuGroup('list',108);m.addMenuItems({numberedlist:{label:m.lang.list.numberedTitle,group:'list',command:'numberedListStyle'},bulletedlist:{label:m.lang.list.bulletedTitle,group:'list',command:'bulletedListStyle'}});}if(m.contextMenu)m.contextMenu.addListener(function(n,o){if(!n||n.isReadOnly())return null;while(n){var p=n.getName();if(p=='ol')return{numberedlist:2};else if(p=='ul')return{bulletedlist:2};n=n.getParent();}return null;});}};j.add('liststyle',j.liststyle);})();(function(){function m(s){if(!s||s.type!=1||s.getName()!='form')return[];var t=[],u=['style','className'];for(var v=0;v<u.length;v++){var w=u[v],x=s.$.elements.namedItem(w);if(x){var y=new h(x);t.push([y,y.nextSibling]);y.remove();}}return t;};function n(s,t){if(!s||s.type!=1||s.getName()!='form')return;if(t.length>0)for(var u=t.length-1;u>=0;u--){var v=t[u][0],w=t[u][1];if(w)v.insertBefore(w);else v.appendTo(s);}};function o(s,t){var u=m(s),v={},w=s.$;if(!t){v['class']=w.className||'';w.className='';}v.inline=w.style.cssText||'';if(!t)w.style.cssText='position: static; overflow: visible';n(u);return v;};function p(s,t){var u=m(s),v=s.$;if('class' in t)v.className=t['class'];if('inline' in t)v.style.cssText=t.inline;n(u);};function q(s){var t=a.instances;for(var u in t){var v=t[u];if(v.mode=='wysiwyg'&&!v.readOnly){var w=v.document.getBody();w.setAttribute('contentEditable',false);w.setAttribute('contentEditable',true);}}if(s.focusManager.hasFocus){s.toolbox.focus();s.focus();}};function r(s){if(!c||b.version>6)return null;var t=h.createFromHtml('<iframe frameborder="0" tabindex="-1" src="javascript:void((function(){document.open();'+(b.isCustomDomain()?"document.domain='"+this.getDocument().$.domain+"';":'')+'document.close();'+'})())"'+' style="display:block;position:absolute;z-index:-1;'+'progid:DXImageTransform.Microsoft.Alpha(opacity=0);'+'"></iframe>');
+return s.append(t,true);};j.add('maximize',{init:function(s){var t=s.lang,u=a.document,v=u.getWindow(),w,x,y,z;function A(){var C=v.getViewPaneSize();z&&z.setStyles({width:C.width+'px',height:C.height+'px'});s.resize(C.width,C.height,null,true);};var B=2;s.addCommand('maximize',{modes:{wysiwyg:!b.iOS,source:!b.iOS},readOnly:1,editorFocus:false,exec:function(){var C=s.container.getChild(1),D=s.getThemeSpace('contents');if(s.mode=='wysiwyg'){var E=s.getSelection();w=E&&E.getRanges();x=v.getScrollPosition();}else{var F=s.textarea.$;w=!c&&[F.selectionStart,F.selectionEnd];x=[F.scrollLeft,F.scrollTop];}if(this.state==2){v.on('resize',A);y=v.getScrollPosition();var G=s.container;while(G=G.getParent()){G.setCustomData('maximize_saved_styles',o(G));G.setStyle('z-index',s.config.baseFloatZIndex-1);}D.setCustomData('maximize_saved_styles',o(D,true));C.setCustomData('maximize_saved_styles',o(C,true));var H={overflow:b.webkit?'':'hidden',width:0,height:0};u.getDocumentElement().setStyles(H);!b.gecko&&u.getDocumentElement().setStyle('position','fixed');!(b.gecko&&b.quirks)&&u.getBody().setStyles(H);c?setTimeout(function(){v.$.scrollTo(0,0);},0):v.$.scrollTo(0,0);C.setStyle('position',b.gecko&&b.quirks?'fixed':'absolute');C.$.offsetLeft;C.setStyles({'z-index':s.config.baseFloatZIndex-1,left:'0px',top:'0px'});z=r(C);C.addClass('cke_maximized');A();var I=C.getDocumentPosition();C.setStyles({left:-1*I.x+'px',top:-1*I.y+'px'});b.gecko&&q(s);}else if(this.state==1){v.removeListener('resize',A);var J=[D,C];for(var K=0;K<J.length;K++){p(J[K],J[K].getCustomData('maximize_saved_styles'));J[K].removeCustomData('maximize_saved_styles');}G=s.container;while(G=G.getParent()){p(G,G.getCustomData('maximize_saved_styles'));G.removeCustomData('maximize_saved_styles');}c?setTimeout(function(){v.$.scrollTo(y.x,y.y);},0):v.$.scrollTo(y.x,y.y);C.removeClass('cke_maximized');if(b.webkit){C.setStyle('display','inline');setTimeout(function(){C.setStyle('display','block');},0);}if(z){z.remove();z=null;}s.fire('resize');}this.toggleState();var L=this.uiItems[0];if(L){var M=this.state==2?t.maximize:t.minimize,N=s.element.getDocument().getById(L._.id);N.getChild(1).setHtml(M);N.setAttribute('title',M);N.setAttribute('href','javascript:void("'+M+'");');}if(s.mode=='wysiwyg'){if(w){b.gecko&&q(s);s.getSelection().selectRanges(w);var O=s.getSelection().getStartElement();O&&O.scrollIntoView(true);}else v.$.scrollTo(x.x,x.y);}else{if(w){F.selectionStart=w[0];F.selectionEnd=w[1];}F.scrollLeft=x[0];F.scrollTop=x[1];
+}w=x=null;B=this.state;},canUndo:false});s.ui.addButton('Maximize',{label:t.maximize,command:'maximize'});s.on('mode',function(){var C=s.getCommand('maximize');C.setState(C.state==0?0:B);},null,null,100);}});})();j.add('newpage',{init:function(m){m.addCommand('newpage',{modes:{wysiwyg:1,source:1},exec:function(n){var o=this;n.setData(n.config.newpage_html||'',function(){setTimeout(function(){n.fire('afterCommandExec',{name:'newpage',command:o});n.selectionChange();},200);});n.focus();},async:true});m.ui.addButton('NewPage',{label:m.lang.newPage,command:'newpage'});}});j.add('pagebreak',{init:function(m){m.addCommand('pagebreak',j.pagebreakCmd);m.ui.addButton('PageBreak',{label:m.lang.pagebreak,command:'pagebreak'});var n=['{','background: url('+a.getUrl(this.path+'images/pagebreak.gif')+') no-repeat center center;','clear: both;','width:100%; _width:99.9%;','border-top: #999999 1px dotted;','border-bottom: #999999 1px dotted;','padding:0;','height: 5px;','cursor: default;','}'].join('').replace(/;/g,' !important;');m.addCss('div.cke_pagebreak'+n);b.opera&&m.on('contentDom',function(){m.document.on('click',function(o){var p=o.data.getTarget();if(p.is('div')&&p.hasClass('cke_pagebreak'))m.getSelection().selectElement(p);});});},afterInit:function(m){var n=m.lang.pagebreakAlt,o=m.dataProcessor,p=o&&o.dataFilter,q=o&&o.htmlFilter;if(q)q.addRules({attributes:{'class':function(r,s){var t=r.replace('cke_pagebreak','');if(t!=r){var u=a.htmlParser.fragment.fromHtml('<span style="display: none;"> </span>');s.children.length=0;s.add(u);var v=s.attributes;delete v['aria-label'];delete v.contenteditable;delete v.title;}return t;}}},5);if(p)p.addRules({elements:{div:function(r){var s=r.attributes,t=s&&s.style,u=t&&r.children.length==1&&r.children[0],v=u&&u.name=='span'&&u.attributes.style;if(v&&/page-break-after\s*:\s*always/i.test(t)&&/display\s*:\s*none/i.test(v)){s.contenteditable='false';s['class']='cke_pagebreak';s['data-cke-display-name']='pagebreak';s['aria-label']=n;s.title=n;r.children.length=0;}}}});},requires:['fakeobjects']});j.pagebreakCmd={exec:function(m){var n=m.lang.pagebreakAlt,o=h.createFromHtml('<div style="page-break-after: always;"contenteditable="false" title="'+n+'" '+'aria-label="'+n+'" '+'data-cke-display-name="pagebreak" '+'class="cke_pagebreak">'+'</div>',m.document),p=m.getSelection().getRanges(true);m.fire('saveSnapshot');for(var q,r=p.length-1;r>=0;r--){q=p[r];if(r<p.length-1)o=o.clone(true);q.splitBlock('p');q.insertNode(o);if(r==p.length-1){var s=o.getNext();
+q.moveToPosition(o,4);if(!s||s.type==1&&!s.isEditable())q.fixBlock(true,m.config.enterMode==3?'div':'p');q.select();}}m.fire('saveSnapshot');}};(function(){function m(n){n.data.mode='html';};j.add('pastefromword',{init:function(n){var o=0,p=function(q){q&&q.removeListener();n.removeListener('beforePaste',m);o&&setTimeout(function(){o=0;},0);};n.addCommand('pastefromword',{canUndo:false,exec:function(){o=1;n.on('beforePaste',m);if(n.execCommand('paste','html')===false){n.on('dialogShow',function(q){q.removeListener();q.data.on('cancel',p);});n.on('dialogHide',function(q){q.data.removeListener('cancel',p);});}n.on('afterPaste',p);}});n.ui.addButton('PasteFromWord',{label:n.lang.pastefromword.toolbar,command:'pastefromword'});n.on('pasteState',function(q){n.getCommand('pastefromword').setState(q.data);});n.on('paste',function(q){var r=q.data,s;if((s=r.html)&&(o||/(class=\"?Mso|style=\"[^\"]*\bmso\-|w:WordDocument)/.test(s))){var t=this.loadFilterRules(function(){if(t)n.fire('paste',r);else if(!n.config.pasteFromWordPromptCleanup||o||confirm(n.lang.pastefromword.confirmCleanup))r.html=a.cleanWord(s,n);});t&&q.cancel();}},this);},loadFilterRules:function(n){var o=a.cleanWord;if(o)n();else{var p=a.getUrl(i.pasteFromWordCleanupFile||this.path+'filter/default.js');a.scriptLoader.load(p,n,null,true);}return!o;},requires:['clipboard']});})();(function(){var m={exec:function(n){var o=e.tryThese(function(){var p=window.clipboardData.getData('Text');if(!p)throw 0;return p;});if(!o){n.openDialog('pastetext');return false;}else n.fire('paste',{text:o});return true;}};j.add('pastetext',{init:function(n){var o='pastetext',p=n.addCommand(o,m);n.ui.addButton('PasteText',{label:n.lang.pasteText.button,command:o});a.dialog.add(o,a.getUrl(this.path+'dialogs/pastetext.js'));if(n.config.forcePasteAsPlainText){n.on('beforeCommandExec',function(q){var r=q.data.commandData;if(q.data.name=='paste'&&r!='html'){n.execCommand('pastetext');q.cancel();}},null,null,0);n.on('beforePaste',function(q){q.data.mode='text';});}n.on('pasteState',function(q){n.getCommand('pastetext').setState(q.data);});},requires:['clipboard']});})();j.add('popup');e.extend(a.editor.prototype,{popup:function(m,n,o,p){n=n||'80%';o=o||'70%';if(typeof n=='string'&&n.length>1&&n.substr(n.length-1,1)=='%')n=parseInt(window.screen.width*parseInt(n,10)/100,10);if(typeof o=='string'&&o.length>1&&o.substr(o.length-1,1)=='%')o=parseInt(window.screen.height*parseInt(o,10)/100,10);if(n<640)n=640;if(o<420)o=420;var q=parseInt((window.screen.height-o)/2,10),r=parseInt((window.screen.width-n)/2,10);
+p=(p||'location=no,menubar=no,toolbar=no,dependent=yes,minimizable=no,modal=yes,alwaysRaised=yes,resizable=yes,scrollbars=yes')+',width='+n+',height='+o+',top='+q+',left='+r;var s=window.open('',null,p,true);if(!s)return false;try{var t=navigator.userAgent.toLowerCase();if(t.indexOf(' chrome/')==-1){s.moveTo(r,q);s.resizeTo(n,o);}s.focus();s.location.href=m;}catch(u){s=window.open(m,null,p,true);}return true;}});(function(){var m,n={modes:{wysiwyg:1,source:1},canUndo:false,readOnly:1,exec:function(p){var q,r=p.config,s=r.baseHref?'<base href="'+r.baseHref+'"/>':'',t=b.isCustomDomain();if(r.fullPage)q=p.getData().replace(/<head>/,'$&'+s).replace(/[^>]*(?=<\/title>)/,'$& — '+p.lang.preview);else{var u='<body ',v=p.document&&p.document.getBody();if(v){if(v.getAttribute('id'))u+='id="'+v.getAttribute('id')+'" ';if(v.getAttribute('class'))u+='class="'+v.getAttribute('class')+'" ';}u+='>';q=p.config.docType+'<html dir="'+p.config.contentsLangDirection+'">'+'<head>'+s+'<title>'+p.lang.preview+'</title>'+e.buildStyleHtml(p.config.contentsCss)+'</head>'+u+p.getData()+'</body></html>';}var w=640,x=420,y=80;try{var z=window.screen;w=Math.round(z.width*0.8);x=Math.round(z.height*0.7);y=Math.round(z.width*0.1);}catch(D){}var A='';if(t){window._cke_htmlToLoad=q;A='javascript:void( (function(){document.open();document.domain="'+document.domain+'";'+'document.write( window.opener._cke_htmlToLoad );'+'document.close();'+'window.opener._cke_htmlToLoad = null;'+'})() )';}if(b.gecko){window._cke_htmlToLoad=q;A=m+'preview.html';}var B=window.open(A,null,'toolbar=yes,location=no,status=yes,menubar=yes,scrollbars=yes,resizable=yes,width='+w+',height='+x+',left='+y);if(!t&&!b.gecko){var C=B.document;C.open();C.write(q);C.close();b.webkit&&setTimeout(function(){C.body.innerHTML+='';},0);}}},o='preview';j.add(o,{init:function(p){m=this.path;p.addCommand(o,n);p.ui.addButton('Preview',{label:p.lang.preview,command:o});}});})();j.add('print',{init:function(m){var n='print',o=m.addCommand(n,j.print);m.ui.addButton('Print',{label:m.lang.print,command:n});}});j.print={exec:function(m){if(b.opera)return;else if(b.gecko)m.window.$.print();else m.document.$.execCommand('Print');},canUndo:false,readOnly:1,modes:{wysiwyg:!b.opera}};j.add('removeformat',{requires:['selection'],init:function(m){m.addCommand('removeFormat',j.removeformat.commands.removeformat);m.ui.addButton('RemoveFormat',{label:m.lang.removeFormat,command:'removeFormat'});m._.removeFormat={filters:[]};}});j.removeformat={commands:{removeformat:{exec:function(m){var n=m._.removeFormatRegex||(m._.removeFormatRegex=new RegExp('^(?:'+m.config.removeFormatTags.replace(/,/g,'|')+')$','i')),o=m._.removeAttributes||(m._.removeAttributes=m.config.removeFormatAttributes.split(',')),p=j.removeformat.filter,q=m.getSelection().getRanges(1),r=q.createIterator(),s;
+while(s=r.getNextRange()){if(!s.collapsed)s.enlarge(1);var t=s.createBookmark(),u=t.startNode,v=t.endNode,w,x=function(z){var A=new d.elementPath(z),B=A.elements;for(var C=1,D;D=B[C];C++){if(D.equals(A.block)||D.equals(A.blockLimit))break;if(n.test(D.getName())&&p(m,D))z.breakParent(D);}};x(u);if(v){x(v);w=u.getNextSourceNode(true,1);while(w){if(w.equals(v))break;var y=w.getNextSourceNode(false,1);if(!(w.getName()=='img'&&w.data('cke-realelement'))&&p(m,w))if(n.test(w.getName()))w.remove(1);else{w.removeAttributes(o);m.fire('removeFormatCleanup',w);}w=y;}}s.moveToBookmark(t);}m.getSelection().selectRanges(q);}}},filter:function(m,n){var o=m._.removeFormat.filters;for(var p=0;p<o.length;p++){if(o[p](n)===false)return false;}return true;}};a.editor.prototype.addRemoveFormatFilter=function(m){this._.removeFormat.filters.push(m);};i.removeFormatTags='b,big,code,del,dfn,em,font,i,ins,kbd,q,samp,small,span,strike,strong,sub,sup,tt,u,var';i.removeFormatAttributes='class,style,lang,width,height,align,hspace,valign';j.add('resize',{init:function(m){var n=m.config,o=m.element.getDirection(1);!n.resize_dir&&(n.resize_dir='both');n.resize_maxWidth==undefined&&(n.resize_maxWidth=3000);n.resize_maxHeight==undefined&&(n.resize_maxHeight=3000);n.resize_minWidth==undefined&&(n.resize_minWidth=750);n.resize_minHeight==undefined&&(n.resize_minHeight=250);if(n.resize_enabled!==false){var p=null,q,r,s=(n.resize_dir=='both'||n.resize_dir=='horizontal')&&n.resize_minWidth!=n.resize_maxWidth,t=(n.resize_dir=='both'||n.resize_dir=='vertical')&&n.resize_minHeight!=n.resize_maxHeight;function u(x){var y=x.data.$.screenX-q.x,z=x.data.$.screenY-q.y,A=r.width,B=r.height,C=A+y*(o=='rtl'?-1:1),D=B+z;if(s)A=Math.max(n.resize_minWidth,Math.min(C,n.resize_maxWidth));if(t)B=Math.max(n.resize_minHeight,Math.min(D,n.resize_maxHeight));m.resize(s?A:null,B);};function v(x){a.document.removeListener('mousemove',u);a.document.removeListener('mouseup',v);if(m.document){m.document.removeListener('mousemove',u);m.document.removeListener('mouseup',v);}};var w=e.addFunction(function(x){if(!p)p=m.getResizable();r={width:p.$.offsetWidth||0,height:p.$.offsetHeight||0};q={x:x.screenX,y:x.screenY};n.resize_minWidth>r.width&&(n.resize_minWidth=r.width);n.resize_minHeight>r.height&&(n.resize_minHeight=r.height);a.document.on('mousemove',u);a.document.on('mouseup',v);if(m.document){m.document.on('mousemove',u);m.document.on('mouseup',v);}});m.on('destroy',function(){e.removeFunction(w);});m.on('themeSpace',function(x){if(x.data.space=='bottom'){var y='';
+if(s&&!t)y=' cke_resizer_horizontal';if(!s&&t)y=' cke_resizer_vertical';var z='<div class="cke_resizer'+y+' cke_resizer_'+o+'"'+' title="'+e.htmlEncode(m.lang.resize)+'"'+' onmousedown="CKEDITOR.tools.callFunction('+w+', event)"'+'></div>';o=='ltr'&&y=='ltr'?x.data.html+=z:x.data.html=z+x.data.html;}},m,null,100);}}});(function(){var m={modes:{wysiwyg:1,source:1},readOnly:1,exec:function(o){var p=o.element.$.form;if(p)try{p.submit();}catch(q){if(p.submit.click)p.submit.click();}}},n='save';j.add(n,{init:function(o){var p=o.addCommand(n,m);p.modes={wysiwyg:!!o.element.$.form};o.ui.addButton('Save',{label:o.lang.save,command:n});}});})();(function(){var m='scaytcheck',n='';function o(t,u){var v=0,w;for(w in u){if(u[w]==t){v=1;break;}}return v;};var p=function(){var t=this,u=function(){var y=t.config,z={};z.srcNodeRef=t.document.getWindow().$.frameElement;z.assocApp='CKEDITOR.'+a.version+'@'+a.revision;z.customerid=y.scayt_customerid||'1:WvF0D4-UtPqN1-43nkD4-NKvUm2-daQqk3-LmNiI-z7Ysb4-mwry24-T8YrS3-Q2tpq2';z.customDictionaryIds=y.scayt_customDictionaryIds||'';z.userDictionaryName=y.scayt_userDictionaryName||'';z.sLang=y.scayt_sLang||'en_US';z.onLoad=function(){if(!(c&&b.version<8))this.addStyle(this.selectorCss(),'padding-bottom: 2px !important;');if(t.focusManager.hasFocus&&!q.isControlRestored(t))this.focus();};z.onBeforeChange=function(){if(q.getScayt(t)&&!t.checkDirty())setTimeout(function(){t.resetDirty();},0);};var A=window.scayt_custom_params;if(typeof A=='object')for(var B in A)z[B]=A[B];if(q.getControlId(t))z.id=q.getControlId(t);var C=new window.scayt(z);C.afterMarkupRemove.push(function(E){new h(E,C.document).mergeSiblings();});var D=q.instances[t.name];if(D){C.sLang=D.sLang;C.option(D.option());C.paused=D.paused;}q.instances[t.name]=C;try{C.setDisabled(q.isPaused(t)===false);}catch(E){}t.fire('showScaytState');};t.on('contentDom',u);t.on('contentDomUnload',function(){var y=a.document.getElementsByTag('script'),z=/^dojoIoScript(\d+)$/i,A=/^https?:\/\/svc\.webspellchecker\.net\/spellcheck\/script\/ssrv\.cgi/i;for(var B=0;B<y.count();B++){var C=y.getItem(B),D=C.getId(),E=C.getAttribute('src');if(D&&E&&D.match(z)&&E.match(A))C.remove();}});t.on('beforeCommandExec',function(y){if((y.data.name=='source'||y.data.name=='newpage')&&t.mode=='wysiwyg'){var z=q.getScayt(t);if(z){q.setPaused(t,!z.disabled);q.setControlId(t,z.id);z.destroy(true);delete q.instances[t.name];}}else if(y.data.name=='source'&&t.mode=='source')q.markControlRestore(t);});t.on('afterCommandExec',function(y){if(!q.isScaytEnabled(t))return;
+if(t.mode=='wysiwyg'&&(y.data.name=='undo'||y.data.name=='redo'))window.setTimeout(function(){q.getScayt(t).refresh();},10);});t.on('destroy',function(y){var z=y.editor,A=q.getScayt(z);if(!A)return;delete q.instances[z.name];q.setControlId(z,A.id);A.destroy(true);});t.on('afterSetData',function(){if(q.isScaytEnabled(t))window.setTimeout(function(){var y=q.getScayt(t);y&&y.refresh();},10);});t.on('insertElement',function(){var y=q.getScayt(t);if(q.isScaytEnabled(t)){if(c)t.getSelection().unlock(true);window.setTimeout(function(){y.focus();y.refresh();},10);}},this,null,50);t.on('insertHtml',function(){var y=q.getScayt(t);if(q.isScaytEnabled(t)){if(c)t.getSelection().unlock(true);window.setTimeout(function(){y.focus();y.refresh();},10);}},this,null,50);t.on('scaytDialog',function(y){y.data.djConfig=window.djConfig;y.data.scayt_control=q.getScayt(t);y.data.tab=n;y.data.scayt=window.scayt;});var v=t.dataProcessor,w=v&&v.htmlFilter;if(w)w.addRules({elements:{span:function(y){if(y.attributes['data-scayt_word']&&y.attributes['data-scaytid']){delete y.name;return y;}}}});var x=j.undo.Image.prototype;x.equals=e.override(x.equals,function(y){return function(z){var E=this;var A=E.contents,B=z.contents,C=q.getScayt(E.editor);if(C&&q.isScaytReady(E.editor)){E.contents=C.reset(A)||'';z.contents=C.reset(B)||'';}var D=y.apply(E,arguments);E.contents=A;z.contents=B;return D;};});if(t.document)u();};j.scayt={engineLoaded:false,instances:{},controlInfo:{},setControlInfo:function(t,u){if(t&&t.name&&typeof this.controlInfo[t.name]!='object')this.controlInfo[t.name]={};for(var v in u)this.controlInfo[t.name][v]=u[v];},isControlRestored:function(t){if(t&&t.name&&this.controlInfo[t.name])return this.controlInfo[t.name].restored;return false;},markControlRestore:function(t){this.setControlInfo(t,{restored:true});},setControlId:function(t,u){this.setControlInfo(t,{id:u});},getControlId:function(t){if(t&&t.name&&this.controlInfo[t.name]&&this.controlInfo[t.name].id)return this.controlInfo[t.name].id;return null;},setPaused:function(t,u){this.setControlInfo(t,{paused:u});},isPaused:function(t){if(t&&t.name&&this.controlInfo[t.name])return this.controlInfo[t.name].paused;return undefined;},getScayt:function(t){return this.instances[t.name];},isScaytReady:function(t){return this.engineLoaded===true&&'undefined'!==typeof window.scayt&&this.getScayt(t);},isScaytEnabled:function(t){var u=this.getScayt(t);return u?u.disabled===false:false;},getUiTabs:function(t){var u=[],v=t.config.scayt_uiTabs||'1,1,1';
+v=v.split(',');v[3]='1';for(var w=0;w<4;w++)u[w]=typeof window.scayt!='undefined'&&typeof window.scayt.uiTags!='undefined'?parseInt(v[w],10)&&window.scayt.uiTags[w]:parseInt(v[w],10);return u;},loadEngine:function(t){if(b.gecko&&b.version<10900||b.opera||b.air)return t.fire('showScaytState');if(this.engineLoaded===true)return p.apply(t);else if(this.engineLoaded==-1)return a.on('scaytReady',function(){p.apply(t);});a.on('scaytReady',p,t);a.on('scaytReady',function(){this.engineLoaded=true;},this,null,0);this.engineLoaded=-1;var u=document.location.protocol;u=u.search(/https?:/)!=-1?u:'http:';var v='svc.webspellchecker.net/scayt26/loader__base.js',w=t.config.scayt_srcUrl||u+'//'+v,x=q.parseUrl(w).path+'/';if(window.scayt==undefined){a._djScaytConfig={baseUrl:x,addOnLoad:[function(){a.fireOnce('scaytReady');}],isDebug:false};a.document.getHead().append(a.document.createElement('script',{attributes:{type:'text/javascript',async:'true',src:w}}));}else a.fireOnce('scaytReady');return null;},parseUrl:function(t){var u;if(t.match&&(u=t.match(/(.*)[\/\\](.*?\.\w+)$/)))return{path:u[1],file:u[2]};else return t;}};var q=j.scayt,r=function(t,u,v,w,x,y,z){t.addCommand(w,x);t.addMenuItem(w,{label:v,command:w,group:y,order:z});},s={preserveState:true,editorFocus:false,canUndo:false,exec:function(t){if(q.isScaytReady(t)){var u=q.isScaytEnabled(t);this.setState(u?2:1);var v=q.getScayt(t);v.focus();v.setDisabled(u);}else if(!t.config.scayt_autoStartup&&q.engineLoaded>=0){this.setState(0);q.loadEngine(t);}}};j.add('scayt',{requires:['menubutton'],beforeInit:function(t){var u=t.config.scayt_contextMenuItemsOrder||'suggest|moresuggest|control',v='';u=u.split('|');if(u&&u.length)for(var w=0;w<u.length;w++)v+='scayt_'+u[w]+(u.length!=parseInt(w,10)+1?',':'');t.config.menu_groups=v+','+t.config.menu_groups;},init:function(t){var u=t.dataProcessor&&t.dataProcessor.dataFilter,v={elements:{span:function(E){var F=E.attributes;if(F&&F['data-scaytid'])delete E.name;}}};u&&u.addRules(v);var w={},x={},y=t.addCommand(m,s);a.dialog.add(m,a.getUrl(this.path+'dialogs/options.js'));var z=q.getUiTabs(t),A='scaytButton';t.addMenuGroup(A);var B={},C=t.lang.scayt;B.scaytToggle={label:C.enable,command:m,group:A};if(z[0]==1)B.scaytOptions={label:C.options,group:A,onClick:function(){n='options';t.openDialog(m);}};if(z[1]==1)B.scaytLangs={label:C.langs,group:A,onClick:function(){n='langs';t.openDialog(m);}};if(z[2]==1)B.scaytDict={label:C.dictionariesTab,group:A,onClick:function(){n='dictionaries';t.openDialog(m);
+}};B.scaytAbout={label:t.lang.scayt.about,group:A,onClick:function(){n='about';t.openDialog(m);}};t.addMenuItems(B);t.ui.add('Scayt','menubutton',{label:C.title,title:b.opera?C.opera_title:C.title,className:'cke_button_scayt',modes:{wysiwyg:1},onRender:function(){y.on('state',function(){this.setState(y.state);},this);},onMenu:function(){var E=q.isScaytEnabled(t);t.getMenuItem('scaytToggle').label=C[E?'disable':'enable'];var F=q.getUiTabs(t);return{scaytToggle:2,scaytOptions:E&&F[0]?2:0,scaytLangs:E&&F[1]?2:0,scaytDict:E&&F[2]?2:0,scaytAbout:E&&F[3]?2:0};}});if(t.contextMenu&&t.addMenuItems)t.contextMenu.addListener(function(E,F){if(!q.isScaytEnabled(t)||F.getRanges()[0].checkReadOnly())return null;var G=q.getScayt(t),H=G.getScaytNode();if(!H)return null;var I=G.getWord(H);if(!I)return null;var J=G.getLang(),K={},L=window.scayt.getSuggestion(I,J);if(!L||!L.length)return null;for(var M in w){delete t._.menuItems[M];delete t._.commands[M];}for(M in x){delete t._.menuItems[M];delete t._.commands[M];}w={};x={};var N=t.config.scayt_moreSuggestions||'on',O=false,P=t.config.scayt_maxSuggestions;typeof P!='number'&&(P=5);!P&&(P=L.length);var Q=t.config.scayt_contextCommands||'all';Q=Q.split('|');for(var R=0,S=L.length;R<S;R+=1){var T='scayt_suggestion_'+L[R].replace(' ','_'),U=(function(Y,Z){return{exec:function(){G.replace(Y,Z);}};})(H,L[R]);if(R<P){r(t,'button_'+T,L[R],T,U,'scayt_suggest',R+1);K[T]=2;x[T]=2;}else if(N=='on'){r(t,'button_'+T,L[R],T,U,'scayt_moresuggest',R+1);w[T]=2;O=true;}}if(O){t.addMenuItem('scayt_moresuggest',{label:C.moreSuggestions,group:'scayt_moresuggest',order:10,getItems:function(){return w;}});x.scayt_moresuggest=2;}if(o('all',Q)||o('ignore',Q)){var V={exec:function(){G.ignore(H);}};r(t,'ignore',C.ignore,'scayt_ignore',V,'scayt_control',1);x.scayt_ignore=2;}if(o('all',Q)||o('ignoreall',Q)){var W={exec:function(){G.ignoreAll(H);}};r(t,'ignore_all',C.ignoreAll,'scayt_ignore_all',W,'scayt_control',2);x.scayt_ignore_all=2;}if(o('all',Q)||o('add',Q)){var X={exec:function(){window.scayt.addWordToUserDictionary(H);}};r(t,'add_word',C.addWord,'scayt_add_word',X,'scayt_control',3);x.scayt_add_word=2;}if(G.fireOnContextMenu)G.fireOnContextMenu(t);return x;});var D=function(){t.removeListener('showScaytState',D);if(!b.opera&&!b.air)y.setState(q.isScaytEnabled(t)?1:2);else y.setState(0);};t.on('showScaytState',D);if(b.opera||b.air)t.on('instanceReady',function(){D();});if(t.config.scayt_autoStartup)t.on('instanceReady',function(){q.loadEngine(t);});
+},afterInit:function(t){var u,v=function(w){if(w.hasAttribute('data-scaytid'))return false;};if(t._.elementsPath&&(u=t._.elementsPath.filters))u.push(v);t.addRemoveFormatFilter&&t.addRemoveFormatFilter(v);}});})();j.add('smiley',{requires:['dialog'],init:function(m){m.config.smiley_path=m.config.smiley_path||this.path+'images/';m.addCommand('smiley',new a.dialogCommand('smiley'));m.ui.addButton('Smiley',{label:m.lang.smiley.toolbar,command:'smiley'});a.dialog.add('smiley',this.path+'dialogs/smiley.js');}});i.smiley_images=['regular_smile.gif','sad_smile.gif','wink_smile.gif','teeth_smile.gif','confused_smile.gif','tounge_smile.gif','embaressed_smile.gif','omg_smile.gif','whatchutalkingabout_smile.gif','angry_smile.gif','angel_smile.gif','shades_smile.gif','devil_smile.gif','cry_smile.gif','lightbulb.gif','thumbs_down.gif','thumbs_up.gif','heart.gif','broken_heart.gif','kiss.gif','envelope.gif'];i.smiley_descriptions=['smiley','sad','wink','laugh','frown','cheeky','blush','surprise','indecision','angry','angel','cool','devil','crying','enlightened','no','yes','heart','broken heart','kiss','mail'];(function(){var m='.%2 p,.%2 div,.%2 pre,.%2 address,.%2 blockquote,.%2 h1,.%2 h2,.%2 h3,.%2 h4,.%2 h5,.%2 h6{background-repeat: no-repeat;background-position: top %3;border: 1px dotted gray;padding-top: 8px;padding-%3: 8px;}.%2 p{%1p.png);}.%2 div{%1div.png);}.%2 pre{%1pre.png);}.%2 address{%1address.png);}.%2 blockquote{%1blockquote.png);}.%2 h1{%1h1.png);}.%2 h2{%1h2.png);}.%2 h3{%1h3.png);}.%2 h4{%1h4.png);}.%2 h5{%1h5.png);}.%2 h6{%1h6.png);}',n=/%1/g,o=/%2/g,p=/%3/g,q={readOnly:1,preserveState:true,editorFocus:false,exec:function(r){this.toggleState();this.refresh(r);},refresh:function(r){if(r.document){var s=this.state==1?'addClass':'removeClass';r.document.getBody()[s]('cke_show_blocks');}}};j.add('showblocks',{requires:['wysiwygarea'],init:function(r){var s=r.addCommand('showblocks',q);s.canUndo=false;if(r.config.startupOutlineBlocks)s.setState(1);r.addCss(m.replace(n,'background-image: url('+a.getUrl(this.path)+'images/block_').replace(o,'cke_show_blocks ').replace(p,r.lang.dir=='rtl'?'right':'left'));r.ui.addButton('ShowBlocks',{label:r.lang.showBlocks,command:'showblocks'});r.on('mode',function(){if(s.state!=0)s.refresh(r);});r.on('contentDom',function(){if(s.state!=0)s.refresh(r);});}});})();(function(){var m='cke_show_border',n,o=(b.ie6Compat?['.%1 table.%2,','.%1 table.%2 td, .%1 table.%2 th','{','border : #d3d3d3 1px dotted','}']:['.%1 table.%2,','.%1 table.%2 > tr > td, .%1 table.%2 > tr > th,','.%1 table.%2 > tbody > tr > td, .%1 table.%2 > tbody > tr > th,','.%1 table.%2 > thead > tr > td, .%1 table.%2 > thead > tr > th,','.%1 table.%2 > tfoot > tr > td, .%1 table.%2 > tfoot > tr > th','{','border : #d3d3d3 1px dotted','}']).join('');
+n=o.replace(/%2/g,m).replace(/%1/g,'cke_show_borders ');var p={preserveState:true,editorFocus:false,readOnly:1,exec:function(q){this.toggleState();this.refresh(q);},refresh:function(q){if(q.document){var r=this.state==1?'addClass':'removeClass';q.document.getBody()[r]('cke_show_borders');}}};j.add('showborders',{requires:['wysiwygarea'],modes:{wysiwyg:1},init:function(q){var r=q.addCommand('showborders',p);r.canUndo=false;if(q.config.startupShowBorders!==false)r.setState(1);q.addCss(n);q.on('mode',function(){if(r.state!=0)r.refresh(q);},null,null,100);q.on('contentDom',function(){if(r.state!=0)r.refresh(q);});q.on('removeFormatCleanup',function(s){var t=s.data;if(q.getCommand('showborders').state==1&&t.is('table')&&(!t.hasAttribute('border')||parseInt(t.getAttribute('border'),10)<=0))t.addClass(m);});},afterInit:function(q){var r=q.dataProcessor,s=r&&r.dataFilter,t=r&&r.htmlFilter;if(s)s.addRules({elements:{table:function(u){var v=u.attributes,w=v['class'],x=parseInt(v.border,10);if((!x||x<=0)&&(!w||w.indexOf(m)==-1))v['class']=(w||'')+' '+m;}}});if(t)t.addRules({elements:{table:function(u){var v=u.attributes,w=v['class'];w&&(v['class']=w.replace(m,'').replace(/\s{2}/,' ').replace(/^\s+|\s+$/,''));}}});}});a.on('dialogDefinition',function(q){var r=q.data.name;if(r=='table'||r=='tableProperties'){var s=q.data.definition,t=s.getContents('info'),u=t.get('txtBorder'),v=u.commit;u.commit=e.override(v,function(y){return function(z,A){y.apply(this,arguments);var B=parseInt(this.getValue(),10);A[!B||B<=0?'addClass':'removeClass'](m);};});var w=s.getContents('advanced'),x=w&&w.get('advCSSClasses');if(x){x.setup=e.override(x.setup,function(y){return function(){y.apply(this,arguments);this.setValue(this.getValue().replace(/cke_show_border/,''));};});x.commit=e.override(x.commit,function(y){return function(z,A){y.apply(this,arguments);if(!parseInt(A.getAttribute('border'),10))A.addClass('cke_show_border');};});}}});})();j.add('sourcearea',{requires:['editingblock'],init:function(m){var n=j.sourcearea,o=a.document.getWindow();m.on('editingBlockReady',function(){var p,q;m.addMode('source',{load:function(r,s){if(c&&b.version<8)r.setStyle('position','relative');m.textarea=p=new h('textarea');p.setAttributes({dir:'ltr',tabIndex:b.webkit?-1:m.tabIndex,role:'textbox','aria-label':m.lang.editorTitle.replace('%1',m.name)});p.addClass('cke_source');p.addClass('cke_enable_context_menu');m.readOnly&&p.setAttribute('readOnly','readonly');var t={width:b.ie7Compat?'99%':'100%',height:'100%',resize:'none',outline:'none','text-align':'left'};
+if(c){q=function(){p.hide();p.setStyle('height',r.$.clientHeight+'px');p.setStyle('width',r.$.clientWidth+'px');p.show();};m.on('resize',q);o.on('resize',q);setTimeout(q,0);}r.setHtml('');r.append(p);p.setStyles(t);m.fire('ariaWidget',p);p.on('blur',function(){m.focusManager.blur();});p.on('focus',function(){m.focusManager.focus();});m.mayBeDirty=true;this.loadData(s);var u=m.keystrokeHandler;if(u)u.attach(p);setTimeout(function(){m.mode='source';m.fire('mode',{previousMode:m._.previousMode});},b.gecko||b.webkit?100:0);},loadData:function(r){p.setValue(r);m.fire('dataReady');},getData:function(){return p.getValue();},getSnapshotData:function(){return p.getValue();},unload:function(r){p.clearCustomData();m.textarea=p=null;if(q){m.removeListener('resize',q);o.removeListener('resize',q);}if(c&&b.version<8)r.removeStyle('position');},focus:function(){p.focus();}});});m.on('readOnly',function(){if(m.mode=='source')if(m.readOnly)m.textarea.setAttribute('readOnly','readonly');else m.textarea.removeAttribute('readOnly');});m.addCommand('source',n.commands.source);if(m.ui.addButton)m.ui.addButton('Source',{label:m.lang.source,command:'source'});m.on('mode',function(){m.getCommand('source').setState(m.mode=='source'?1:2);});}});j.sourcearea={commands:{source:{modes:{wysiwyg:1,source:1},editorFocus:false,readOnly:1,exec:function(m){if(m.mode=='wysiwyg')m.fire('saveSnapshot');m.getCommand('source').setState(0);m.setMode(m.mode=='source'?'wysiwyg':'source');},canUndo:false}}};(function(){j.add('stylescombo',{requires:['richcombo','styles'],init:function(n){var o=n.config,p=n.lang.stylesCombo,q={},r=[],s;function t(u){n.getStylesSet(function(v){if(!r.length){var w,x;for(var y=0,z=v.length;y<z;y++){var A=v[y];x=A.name;w=q[x]=new a.style(A);w._name=x;w._.enterMode=o.enterMode;r.push(w);}r.sort(m);}u&&u();});};n.ui.addRichCombo('Styles',{label:p.label,title:p.panelTitle,className:'cke_styles',panel:{css:n.skin.editor.css.concat(o.contentsCss),multiSelect:true,attributes:{'aria-label':p.panelTitle}},init:function(){s=this;t(function(){var u,v,w,x,y,z;for(y=0,z=r.length;y<z;y++){u=r[y];v=u._name;x=u.type;if(x!=w){s.startGroup(p['panelTitle'+String(x)]);w=x;}s.add(v,u.type==3?v:u.buildPreview(),v);}s.commit();});},onClick:function(u){n.focus();n.fire('saveSnapshot');var v=q[u],w=n.getSelection(),x=new d.elementPath(w.getStartElement());v[v.checkActive(x)?'remove':'apply'](n.document);n.fire('saveSnapshot');},onRender:function(){n.on('selectionChange',function(u){var v=this.getValue(),w=u.data.path,x=w.elements;
+for(var y=0,z=x.length,A;y<z;y++){A=x[y];for(var B in q){if(q[B].checkElementRemovable(A,true)){if(B!=v)this.setValue(B);return;}}}this.setValue('');},this);},onOpen:function(){var B=this;if(c||b.webkit)n.focus();var u=n.getSelection(),v=u.getSelectedElement(),w=new d.elementPath(v||u.getStartElement()),x=[0,0,0,0];B.showAll();B.unmarkAll();for(var y in q){var z=q[y],A=z.type;if(z.checkActive(w))B.mark(y);else if(A==3&&!z.checkApplicable(w)){B.hideItem(y);x[A]--;}x[A]++;}if(!x[1])B.hideGroup(p['panelTitle'+String(1)]);if(!x[2])B.hideGroup(p['panelTitle'+String(2)]);if(!x[3])B.hideGroup(p['panelTitle'+String(3)]);},reset:function(){if(s){delete s._.panel;delete s._.list;s._.committed=0;s._.items={};s._.state=2;}q={};r=[];t();}});n.on('instanceReady',function(){t();});}});function m(n,o){var p=n.type,q=o.type;return p==q?0:p==3?-1:q==3?1:q==1?1:-1;};})();j.add('table',{requires:['dialog'],init:function(m){var n=j.table,o=m.lang.table;m.addCommand('table',new a.dialogCommand('table'));m.addCommand('tableProperties',new a.dialogCommand('tableProperties'));m.ui.addButton('Table',{label:o.toolbar,command:'table'});a.dialog.add('table',this.path+'dialogs/table.js');a.dialog.add('tableProperties',this.path+'dialogs/table.js');if(m.addMenuItems)m.addMenuItems({table:{label:o.menu,command:'tableProperties',group:'table',order:5},tabledelete:{label:o.deleteTable,command:'tableDelete',group:'table',order:1}});m.on('doubleclick',function(p){var q=p.data.element;if(q.is('table'))p.data.dialog='tableProperties';});if(m.contextMenu)m.contextMenu.addListener(function(p,q){if(!p||p.isReadOnly())return null;var r=p.hasAscendant('table',1);if(r)return{tabledelete:2,table:2};return null;});}});(function(){var m=/^(?:td|th)$/;function n(G){var H=G.getRanges(),I=[],J={};function K(S){if(I.length>0)return;if(S.type==1&&m.test(S.getName())&&!S.getCustomData('selected_cell')){h.setMarker(J,S,'selected_cell',true);I.push(S);}};for(var L=0;L<H.length;L++){var M=H[L];if(M.collapsed){var N=M.getCommonAncestor(),O=N.getAscendant('td',true)||N.getAscendant('th',true);if(O)I.push(O);}else{var P=new d.walker(M),Q;P.guard=K;while(Q=P.next()){var R=Q.getAscendant('td')||Q.getAscendant('th');if(R&&!R.getCustomData('selected_cell')){h.setMarker(J,R,'selected_cell',true);I.push(R);}}}}h.clearAllMarkers(J);return I;};function o(G){var H=0,I=G.length-1,J={},K,L,M;while(K=G[H++])h.setMarker(J,K,'delete_cell',true);H=0;while(K=G[H++]){if((L=K.getPrevious())&&!L.getCustomData('delete_cell')||(L=K.getNext())&&!L.getCustomData('delete_cell')){h.clearAllMarkers(J);
+return L;}}h.clearAllMarkers(J);M=G[0].getParent();if(M=M.getPrevious())return M.getLast();M=G[I].getParent();if(M=M.getNext())return M.getChild(0);return null;};function p(G,H){var I=n(G),J=I[0],K=J.getAscendant('table'),L=J.getDocument(),M=I[0].getParent(),N=M.$.rowIndex,O=I[I.length-1],P=O.getParent().$.rowIndex+O.$.rowSpan-1,Q=new h(K.$.rows[P]),R=H?N:P,S=H?M:Q,T=e.buildTableMap(K),U=T[R],V=H?T[R-1]:T[R+1],W=T[0].length,X=L.createElement('tr');for(var Y=0;U[Y]&&Y<W;Y++){var Z;if(U[Y].rowSpan>1&&V&&U[Y]==V[Y]){Z=U[Y];Z.rowSpan+=1;}else{Z=new h(U[Y]).clone();Z.removeAttribute('rowSpan');!c&&Z.appendBogus();X.append(Z);Z=Z.$;}Y+=Z.colSpan-1;}H?X.insertBefore(S):X.insertAfter(S);};function q(G){if(G instanceof d.selection){var H=n(G),I=H[0],J=I.getAscendant('table'),K=e.buildTableMap(J),L=H[0].getParent(),M=L.$.rowIndex,N=H[H.length-1],O=N.getParent().$.rowIndex+N.$.rowSpan-1,P=[];for(var Q=M;Q<=O;Q++){var R=K[Q],S=new h(J.$.rows[Q]);for(var T=0;T<R.length;T++){var U=new h(R[T]),V=U.getParent().$.rowIndex;if(U.$.rowSpan==1)U.remove();else{U.$.rowSpan-=1;if(V==Q){var W=K[Q+1];W[T-1]?U.insertAfter(new h(W[T-1])):new h(J.$.rows[Q+1]).append(U,1);}}T+=U.$.colSpan-1;}P.push(S);}var X=J.$.rows,Y=new h(X[O+1]||(M>0?X[M-1]:null)||J.$.parentNode);for(Q=P.length;Q>=0;Q--)q(P[Q]);return Y;}else if(G instanceof h){J=G.getAscendant('table');if(J.$.rows.length==1)J.remove();else G.remove();}return null;};function r(G,H){var I=G.getParent(),J=I.$.cells,K=0;for(var L=0;L<J.length;L++){var M=J[L];K+=H?1:M.colSpan;if(M==G.$)break;}return K-1;};function s(G,H){var I=H?Infinity:0;for(var J=0;J<G.length;J++){var K=r(G[J],H);if(H?K<I:K>I)I=K;}return I;};function t(G,H){var I=n(G),J=I[0],K=J.getAscendant('table'),L=s(I,1),M=s(I),N=H?L:M,O=e.buildTableMap(K),P=[],Q=[],R=O.length;for(var S=0;S<R;S++){P.push(O[S][N]);var T=H?O[S][N-1]:O[S][N+1];T&&Q.push(T);}for(S=0;S<R;S++){var U;if(P[S].colSpan>1&&Q.length&&Q[S]==P[S]){U=P[S];U.colSpan+=1;}else{U=new h(P[S]).clone();U.removeAttribute('colSpan');!c&&U.appendBogus();U[H?'insertBefore':'insertAfter'].call(U,new h(P[S]));U=U.$;}S+=U.rowSpan-1;}};function u(G){var H=n(G),I=H[0],J=H[H.length-1],K=I.getAscendant('table'),L=e.buildTableMap(K),M,N,O=[];for(var P=0,Q=L.length;P<Q;P++)for(var R=0,S=L[P].length;R<S;R++){if(L[P][R]==I.$)M=R;if(L[P][R]==J.$)N=R;}for(P=M;P<=N;P++)for(R=0;R<L.length;R++){var T=L[R],U=new h(K.$.rows[R]),V=new h(T[P]);if(V.$){if(V.$.colSpan==1)V.remove();else V.$.colSpan-=1;R+=V.$.rowSpan-1;if(!U.$.cells.length)O.push(U);
+}}var W=K.$.rows[0]&&K.$.rows[0].cells,X=new h(W[M]||(M?W[M-1]:K.$.parentNode));if(O.length==Q)K.remove();return X;};function v(G){var H=[],I=G[0]&&G[0].getAscendant('table'),J,K,L,M;for(J=0,K=G.length;J<K;J++)H.push(G[J].$.cellIndex);H.sort();for(J=1,K=H.length;J<K;J++){if(H[J]-H[J-1]>1){L=H[J-1]+1;break;}}if(!L)L=H[0]>0?H[0]-1:H[H.length-1]+1;var N=I.$.rows;for(J=0,K=N.length;J<K;J++){M=N[J].cells[L];if(M)break;}return M?new h(M):I.getPrevious();};function w(G,H){var I=G.getStartElement(),J=I.getAscendant('td',1)||I.getAscendant('th',1);if(!J)return;var K=J.clone();if(!c)K.appendBogus();if(H)K.insertBefore(J);else K.insertAfter(J);};function x(G){if(G instanceof d.selection){var H=n(G),I=H[0]&&H[0].getAscendant('table'),J=o(H);for(var K=H.length-1;K>=0;K--)x(H[K]);if(J)z(J,true);else if(I)I.remove();}else if(G instanceof h){var L=G.getParent();if(L.getChildCount()==1)L.remove();else G.remove();}};function y(G){var H=G.getBogus();H&&H.remove();G.trim();};function z(G,H){var I=new d.range(G.getDocument());if(!I['moveToElementEdit'+(H?'End':'Start')](G)){I.selectNodeContents(G);I.collapse(H?false:true);}I.select(true);};function A(G,H,I){var J=G[H];if(typeof I=='undefined')return J;for(var K=0;J&&K<J.length;K++){if(I.is&&J[K]==I.$)return K;else if(K==I)return new h(J[K]);}return I.is?-1:null;};function B(G,H){var I=[];for(var J=0;J<G.length;J++){var K=G[J];I.push(K[H]);if(K[H].rowSpan>1)J+=K[H].rowSpan-1;}return I;};function C(G,H,I){var J=n(G),K;if((H?J.length!=1:J.length<2)||(K=G.getCommonAncestor())&&K.type==1&&K.is('table'))return false;var L,M=J[0],N=M.getAscendant('table'),O=e.buildTableMap(N),P=O.length,Q=O[0].length,R=M.getParent().$.rowIndex,S=A(O,R,M);if(H){var T;try{var U=parseInt(M.getAttribute('rowspan'),10)||1,V=parseInt(M.getAttribute('colspan'),10)||1;T=O[H=='up'?R-U:H=='down'?R+U:R][H=='left'?S-V:H=='right'?S+V:S];}catch(an){return false;}if(!T||M.$==T)return false;J[H=='up'||H=='left'?'unshift':'push'](new h(T));}var W=M.getDocument(),X=R,Y=0,Z=0,aa=!I&&new d.documentFragment(W),ab=0;for(var ac=0;ac<J.length;ac++){L=J[ac];var ad=L.getParent(),ae=L.getFirst(),af=L.$.colSpan,ag=L.$.rowSpan,ah=ad.$.rowIndex,ai=A(O,ah,L);ab+=af*ag;Z=Math.max(Z,ai-S+af);Y=Math.max(Y,ah-R+ag);if(!I){if(y(L),L.getChildren().count()){if(ah!=X&&ae&&!(ae.isBlockBoundary&&ae.isBlockBoundary({br:1}))){var aj=aa.getLast(d.walker.whitespaces(true));if(aj&&!(aj.is&&aj.is('br')))aa.append('br');}L.moveChildren(aa);}ac?L.remove():L.setHtml('');}X=ah;}if(!I){aa.moveChildren(M);
+if(!c)M.appendBogus();if(Z>=Q)M.removeAttribute('rowSpan');else M.$.rowSpan=Y;if(Y>=P)M.removeAttribute('colSpan');else M.$.colSpan=Z;var ak=new d.nodeList(N.$.rows),al=ak.count();for(ac=al-1;ac>=0;ac--){var am=ak.getItem(ac);if(!am.$.cells.length){am.remove();al++;continue;}}return M;}else return Y*Z==ab;};function D(G,H){var I=n(G);if(I.length>1)return false;else if(H)return true;var J=I[0],K=J.getParent(),L=K.getAscendant('table'),M=e.buildTableMap(L),N=K.$.rowIndex,O=A(M,N,J),P=J.$.rowSpan,Q,R,S,T;if(P>1){R=Math.ceil(P/2);S=Math.floor(P/2);T=N+R;var U=new h(L.$.rows[T]),V=A(M,T),W;Q=J.clone();for(var X=0;X<V.length;X++){W=V[X];if(W.parentNode==U.$&&X>O){Q.insertBefore(new h(W));break;}else W=null;}if(!W)U.append(Q,true);}else{S=R=1;U=K.clone();U.insertAfter(K);U.append(Q=J.clone());var Y=A(M,N);for(var Z=0;Z<Y.length;Z++)Y[Z].rowSpan++;}if(!c)Q.appendBogus();J.$.rowSpan=R;Q.$.rowSpan=S;if(R==1)J.removeAttribute('rowSpan');if(S==1)Q.removeAttribute('rowSpan');return Q;};function E(G,H){var I=n(G);if(I.length>1)return false;else if(H)return true;var J=I[0],K=J.getParent(),L=K.getAscendant('table'),M=e.buildTableMap(L),N=K.$.rowIndex,O=A(M,N,J),P=J.$.colSpan,Q,R,S;if(P>1){R=Math.ceil(P/2);S=Math.floor(P/2);}else{S=R=1;var T=B(M,O);for(var U=0;U<T.length;U++)T[U].colSpan++;}Q=J.clone();Q.insertAfter(J);if(!c)Q.appendBogus();J.$.colSpan=R;Q.$.colSpan=S;if(R==1)J.removeAttribute('colSpan');if(S==1)Q.removeAttribute('colSpan');return Q;};var F={thead:1,tbody:1,tfoot:1,td:1,tr:1,th:1};j.tabletools={requires:['table','dialog','contextmenu'],init:function(G){var H=G.lang.table;G.addCommand('cellProperties',new a.dialogCommand('cellProperties'));a.dialog.add('cellProperties',this.path+'dialogs/tableCell.js');G.addCommand('tableDelete',{exec:function(I){var J=I.getSelection(),K=J&&J.getStartElement(),L=K&&K.getAscendant('table',1);if(!L)return;var M=L.getParent();if(M.getChildCount()==1&&!M.is('body','td','th'))L=M;var N=new d.range(I.document);N.moveToPosition(L,3);L.remove();N.select();}});G.addCommand('rowDelete',{exec:function(I){var J=I.getSelection();z(q(J));}});G.addCommand('rowInsertBefore',{exec:function(I){var J=I.getSelection();p(J,true);}});G.addCommand('rowInsertAfter',{exec:function(I){var J=I.getSelection();p(J);}});G.addCommand('columnDelete',{exec:function(I){var J=I.getSelection(),K=u(J);K&&z(K,true);}});G.addCommand('columnInsertBefore',{exec:function(I){var J=I.getSelection();t(J,true);}});G.addCommand('columnInsertAfter',{exec:function(I){var J=I.getSelection();
+t(J);}});G.addCommand('cellDelete',{exec:function(I){var J=I.getSelection();x(J);}});G.addCommand('cellMerge',{exec:function(I){z(C(I.getSelection()),true);}});G.addCommand('cellMergeRight',{exec:function(I){z(C(I.getSelection(),'right'),true);}});G.addCommand('cellMergeDown',{exec:function(I){z(C(I.getSelection(),'down'),true);}});G.addCommand('cellVerticalSplit',{exec:function(I){z(D(I.getSelection()));}});G.addCommand('cellHorizontalSplit',{exec:function(I){z(E(I.getSelection()));}});G.addCommand('cellInsertBefore',{exec:function(I){var J=I.getSelection();w(J,true);}});G.addCommand('cellInsertAfter',{exec:function(I){var J=I.getSelection();w(J);}});if(G.addMenuItems)G.addMenuItems({tablecell:{label:H.cell.menu,group:'tablecell',order:1,getItems:function(){var I=G.getSelection(),J=n(I);return{tablecell_insertBefore:2,tablecell_insertAfter:2,tablecell_delete:2,tablecell_merge:C(I,null,true)?2:0,tablecell_merge_right:C(I,'right',true)?2:0,tablecell_merge_down:C(I,'down',true)?2:0,tablecell_split_vertical:D(I,true)?2:0,tablecell_split_horizontal:E(I,true)?2:0,tablecell_properties:J.length>0?2:0};}},tablecell_insertBefore:{label:H.cell.insertBefore,group:'tablecell',command:'cellInsertBefore',order:5},tablecell_insertAfter:{label:H.cell.insertAfter,group:'tablecell',command:'cellInsertAfter',order:10},tablecell_delete:{label:H.cell.deleteCell,group:'tablecell',command:'cellDelete',order:15},tablecell_merge:{label:H.cell.merge,group:'tablecell',command:'cellMerge',order:16},tablecell_merge_right:{label:H.cell.mergeRight,group:'tablecell',command:'cellMergeRight',order:17},tablecell_merge_down:{label:H.cell.mergeDown,group:'tablecell',command:'cellMergeDown',order:18},tablecell_split_horizontal:{label:H.cell.splitHorizontal,group:'tablecell',command:'cellHorizontalSplit',order:19},tablecell_split_vertical:{label:H.cell.splitVertical,group:'tablecell',command:'cellVerticalSplit',order:20},tablecell_properties:{label:H.cell.title,group:'tablecellproperties',command:'cellProperties',order:21},tablerow:{label:H.row.menu,group:'tablerow',order:1,getItems:function(){return{tablerow_insertBefore:2,tablerow_insertAfter:2,tablerow_delete:2};}},tablerow_insertBefore:{label:H.row.insertBefore,group:'tablerow',command:'rowInsertBefore',order:5},tablerow_insertAfter:{label:H.row.insertAfter,group:'tablerow',command:'rowInsertAfter',order:10},tablerow_delete:{label:H.row.deleteRow,group:'tablerow',command:'rowDelete',order:15},tablecolumn:{label:H.column.menu,group:'tablecolumn',order:1,getItems:function(){return{tablecolumn_insertBefore:2,tablecolumn_insertAfter:2,tablecolumn_delete:2};
+}},tablecolumn_insertBefore:{label:H.column.insertBefore,group:'tablecolumn',command:'columnInsertBefore',order:5},tablecolumn_insertAfter:{label:H.column.insertAfter,group:'tablecolumn',command:'columnInsertAfter',order:10},tablecolumn_delete:{label:H.column.deleteColumn,group:'tablecolumn',command:'columnDelete',order:15}});if(G.contextMenu)G.contextMenu.addListener(function(I,J){if(!I||I.isReadOnly())return null;while(I){if(I.getName() in F)return{tablecell:2,tablerow:2,tablecolumn:2};I=I.getParent();}return null;});},getSelectedCells:n};j.add('tabletools',j.tabletools);})();e.buildTableMap=function(m){var n=m.$.rows,o=-1,p=[];for(var q=0;q<n.length;q++){o++;!p[o]&&(p[o]=[]);var r=-1;for(var s=0;s<n[q].cells.length;s++){var t=n[q].cells[s];r++;while(p[o][r])r++;var u=isNaN(t.colSpan)?1:t.colSpan,v=isNaN(t.rowSpan)?1:t.rowSpan;for(var w=0;w<v;w++){if(!p[o+w])p[o+w]=[];for(var x=0;x<u;x++)p[o+w][r+x]=n[q].cells[s];}r+=u-1;}}return p;};j.add('specialchar',{requires:['dialog'],availableLangs:{cs:1,cy:1,de:1,el:1,en:1,eo:1,et:1,fa:1,fi:1,fr:1,he:1,hr:1,it:1,nb:1,nl:1,no:1,'pt-br':1,tr:1,ug:1,'zh-cn':1},init:function(m){var n='specialchar',o=this;a.dialog.add(n,this.path+'dialogs/specialchar.js');m.addCommand(n,{exec:function(){var p=m.langCode;p=o.availableLangs[p]?p:'en';a.scriptLoader.load(a.getUrl(o.path+'lang/'+p+'.js'),function(){e.extend(m.lang.specialChar,o.langEntries[p]);m.openDialog(n);});},modes:{wysiwyg:1},canUndo:false});m.ui.addButton('SpecialChar',{label:m.lang.specialChar.toolbar,command:n});}});i.specialChars=['!','"','#','$','%','&',"'",'(',')','*','+','-','.','/','0','1','2','3','4','5','6','7','8','9',':',';','<','=','>','?','@','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','[',']','^','_','`','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','{','|','}','~','€','‘','’','“','”','–','—','¡','¢','£','¤','¥','¦','§','¨','©','ª','«','¬','®','¯','°','²','³','´','µ','¶','·','¸','¹','º','»','¼','½','¾','¿','À','Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë','Ì','Í','Î','Ï','Ð','Ñ','Ò','Ó','Ô','Õ','Ö','×','Ø','Ù','Ú','Û','Ü','Ý','Þ','ß','à','á','â','ã','ä','å','æ','ç','è','é','ê','ë','ì','í','î','ï','ð','ñ','ò','ó','ô','õ','ö','÷','ø','ù','ú','û','ü','ý','þ','ÿ','Œ','œ','Ŵ','Ŷ','ŵ','ŷ','‚','‛','„','…','™','►','•','→','⇒','⇔','♦','≈'];
+(function(){var m={editorFocus:false,modes:{wysiwyg:1,source:1}},n={exec:function(q){q.container.focusNext(true,q.tabIndex);}},o={exec:function(q){q.container.focusPrevious(true,q.tabIndex);}};function p(q){return{editorFocus:false,canUndo:false,modes:{wysiwyg:1},exec:function(r){if(r.focusManager.hasFocus){var s=r.getSelection(),t=s.getCommonAncestor(),u;if(u=t.getAscendant('td',true)||t.getAscendant('th',true)){var v=new d.range(r.document),w=e.tryThese(function(){var D=u.getParent(),E=D.$.cells[u.$.cellIndex+(q?-1:1)];E.parentNode.parentNode;return E;},function(){var D=u.getParent(),E=D.getAscendant('table'),F=E.$.rows[D.$.rowIndex+(q?-1:1)];return F.cells[q?F.cells.length-1:0];});if(!(w||q)){var x=u.getAscendant('table').$,y=u.getParent().$.cells,z=new h(x.insertRow(-1),r.document);for(var A=0,B=y.length;A<B;A++){var C=z.append(new h(y[A],r.document).clone(false,false));!c&&C.appendBogus();}v.moveToElementEditStart(z);}else if(w){w=new h(w);v.moveToElementEditStart(w);if(!(v.checkStartOfBlock()&&v.checkEndOfBlock()))v.selectNodeContents(w);}else return true;v.select(true);return true;}}return false;}};};j.add('tab',{requires:['keystrokes'],init:function(q){var r=q.config.enableTabKeyTools!==false,s=q.config.tabSpaces||0,t='';while(s--)t+='\xa0';if(t)q.on('key',function(u){if(u.data.keyCode==9){q.insertHtml(t);u.cancel();}});if(r)q.on('key',function(u){if(u.data.keyCode==9&&q.execCommand('selectNextCell')||u.data.keyCode==2228224+9&&q.execCommand('selectPreviousCell'))u.cancel();});if(b.webkit||b.gecko)q.on('key',function(u){var v=u.data.keyCode;if(v==9&&!t){u.cancel();q.execCommand('blur');}if(v==2228224+9){q.execCommand('blurBack');u.cancel();}});q.addCommand('blur',e.extend(n,m));q.addCommand('blurBack',e.extend(o,m));q.addCommand('selectNextCell',p());q.addCommand('selectPreviousCell',p(true));}});})();h.prototype.focusNext=function(m,n){var w=this;var o=w.$,p=n===undefined?w.getTabIndex():n,q,r,s,t,u,v;if(p<=0){u=w.getNextSourceNode(m,1);while(u){if(u.isVisible()&&u.getTabIndex()===0){s=u;break;}u=u.getNextSourceNode(false,1);}}else{u=w.getDocument().getBody().getFirst();while(u=u.getNextSourceNode(false,1)){if(!q)if(!r&&u.equals(w)){r=true;if(m){if(!(u=u.getNextSourceNode(true,1)))break;q=1;}}else if(r&&!w.contains(u))q=1;if(!u.isVisible()||(v=u.getTabIndex())<0)continue;if(q&&v==p){s=u;break;}if(v>p&&(!s||!t||v<t)){s=u;t=v;}else if(!s&&v===0){s=u;t=v;}}}if(s)s.focus();};h.prototype.focusPrevious=function(m,n){var w=this;var o=w.$,p=n===undefined?w.getTabIndex():n,q,r,s,t=0,u,v=w.getDocument().getBody().getLast();
+while(v=v.getPreviousSourceNode(false,1)){if(!q)if(!r&&v.equals(w)){r=true;if(m){if(!(v=v.getPreviousSourceNode(true,1)))break;q=1;}}else if(r&&!w.contains(v))q=1;if(!v.isVisible()||(u=v.getTabIndex())<0)continue;if(p<=0){if(q&&u===0){s=v;break;}if(u>t){s=v;t=u;}}else{if(q&&u==p){s=v;break;}if(u<p&&(!s||u>t)){s=v;t=u;}}}if(s)s.focus();};(function(){j.add('templates',{requires:['dialog'],init:function(o){a.dialog.add('templates',a.getUrl(this.path+'dialogs/templates.js'));o.addCommand('templates',new a.dialogCommand('templates'));o.ui.addButton('Templates',{label:o.lang.templates.button,command:'templates'});}});var m={},n={};a.addTemplates=function(o,p){m[o]=p;};a.getTemplates=function(o){return m[o];};a.loadTemplates=function(o,p){var q=[];for(var r=0,s=o.length;r<s;r++){if(!n[o[r]]){q.push(o[r]);n[o[r]]=1;}}if(q.length)a.scriptLoader.load(q,p);else setTimeout(p,0);};})();i.templates_files=[a.getUrl('plugins/templates/templates/default.js')];i.templates_replaceContent=true;(function(){var m=function(){this.toolbars=[];this.focusCommandExecuted=false;};m.prototype.focus=function(){for(var o=0,p;p=this.toolbars[o++];)for(var q=0,r;r=p.items[q++];){if(r.focus){r.focus();return;}}};var n={toolbarFocus:{modes:{wysiwyg:1,source:1},readOnly:1,exec:function(o){if(o.toolbox){o.toolbox.focusCommandExecuted=true;if(c||b.air)setTimeout(function(){o.toolbox.focus();},100);else o.toolbox.focus();}}}};j.add('toolbar',{requires:['button'],init:function(o){var p,q=function(r,s){var t,u,v=o.lang.dir=='rtl',w=o.config.toolbarGroupCycling;w=w===undefined||w;switch(s){case 9:case 2228224+9:while(!u||!u.items.length){u=s==9?(u?u.next:r.toolbar.next)||o.toolbox.toolbars[0]:(u?u.previous:r.toolbar.previous)||o.toolbox.toolbars[o.toolbox.toolbars.length-1];if(u.items.length){r=u.items[p?u.items.length-1:0];while(r&&!r.focus){r=p?r.previous:r.next;if(!r)u=0;}}}if(r)r.focus();return false;case v?37:39:case 40:t=r;do{t=t.next;if(!t&&w)t=r.toolbar.items[0];}while(t&&!t.focus);if(t)t.focus();else q(r,9);return false;case v?39:37:case 38:t=r;do{t=t.previous;if(!t&&w)t=r.toolbar.items[r.toolbar.items.length-1];}while(t&&!t.focus);if(t)t.focus();else{p=1;q(r,2228224+9);p=0;}return false;case 27:o.focus();return false;case 13:case 32:r.execute();return false;}return true;};o.on('themeSpace',function(r){if(r.data.space==o.config.toolbarLocation){o.toolbox=new m();var s=e.getNextId(),t=['<div class="cke_toolbox" role="group" aria-labelledby="',s,'" onmousedown="return false;"'],u=o.config.toolbarStartupExpanded!==false,v;
+t.push(u?'>':' style="display:none">');t.push('<span id="',s,'" class="cke_voice_label">',o.lang.toolbars,'</span>');var w=o.toolbox.toolbars,x=o.config.toolbar instanceof Array?o.config.toolbar:o.config['toolbar_'+o.config.toolbar];for(var y=0;y<x.length;y++){var z,A=0,B,C=x[y],D;if(!C)continue;if(v){t.push('</div>');v=0;}if(C==='/'){t.push('<div class="cke_break"></div>');continue;}D=C.items||C;for(var E=0;E<D.length;E++){var F,G=D[E],H;F=o.ui.create(G);if(F){H=F.canGroup!==false;if(!A){z=e.getNextId();A={id:z,items:[]};B=C.name&&(o.lang.toolbarGroups[C.name]||C.name);t.push('<span id="',z,'" class="cke_toolbar"',B?' aria-labelledby="'+z+'_label"':'',' role="toolbar">');B&&t.push('<span id="',z,'_label" class="cke_voice_label">',B,'</span>');t.push('<span class="cke_toolbar_start"></span>');var I=w.push(A)-1;if(I>0){A.previous=w[I-1];A.previous.next=A;}}if(H){if(!v){t.push('<span class="cke_toolgroup" role="presentation">');v=1;}}else if(v){t.push('</span>');v=0;}var J=F.render(o,t);I=A.items.push(J)-1;if(I>0){J.previous=A.items[I-1];J.previous.next=J;}J.toolbar=A;J.onkey=q;J.onfocus=function(){if(!o.toolbox.focusCommandExecuted)o.focus();};}}if(v){t.push('</span>');v=0;}if(A)t.push('<span class="cke_toolbar_end"></span></span>');}t.push('</div>');if(o.config.toolbarCanCollapse){var K=e.addFunction(function(){o.execCommand('toolbarCollapse');});o.on('destroy',function(){e.removeFunction(K);});var L=e.getNextId();o.addCommand('toolbarCollapse',{readOnly:1,exec:function(M){var N=a.document.getById(L),O=N.getPrevious(),P=M.getThemeSpace('contents'),Q=O.getParent(),R=parseInt(P.$.style.height,10),S=Q.$.offsetHeight,T=!O.isVisible();if(!T){O.hide();N.addClass('cke_toolbox_collapser_min');N.setAttribute('title',M.lang.toolbarExpand);}else{O.show();N.removeClass('cke_toolbox_collapser_min');N.setAttribute('title',M.lang.toolbarCollapse);}N.getFirst().setText(T?'▲':'◀');var U=Q.$.offsetHeight-S;P.setStyle('height',R-U+'px');M.fire('resize');},modes:{wysiwyg:1,source:1}});t.push('<a title="'+(u?o.lang.toolbarCollapse:o.lang.toolbarExpand)+'" id="'+L+'" tabIndex="-1" class="cke_toolbox_collapser');if(!u)t.push(' cke_toolbox_collapser_min');t.push('" onclick="CKEDITOR.tools.callFunction('+K+')">','<span>▲</span>','</a>');}r.data.html+=t.join('');}});o.on('destroy',function(){var r,s=0,t,u,v;r=this.toolbox.toolbars;for(;s<r.length;s++){u=r[s].items;for(t=0;t<u.length;t++){v=u[t];if(v.clickFn)e.removeFunction(v.clickFn);if(v.keyDownFn)e.removeFunction(v.keyDownFn);
+}}});o.addCommand('toolbarFocus',n.toolbarFocus);o.ui.add('-',a.UI_SEPARATOR,{});o.ui.addHandler(a.UI_SEPARATOR,{create:function(){return{render:function(r,s){s.push('<span class="cke_separator" role="separator"></span>');return{};}};}});}});})();a.UI_SEPARATOR='separator';i.toolbarLocation='top';i.toolbar_Basic=[['Bold','Italic','-','NumberedList','BulletedList','-','Link','Unlink','-','About']];i.toolbar_Full=[{name:'document',items:['Source','-','Save','NewPage','DocProps','Preview','Print','-','Templates']},{name:'clipboard',items:['Cut','Copy','Paste','PasteText','PasteFromWord','-','Undo','Redo']},{name:'editing',items:['Find','Replace','-','SelectAll','-','SpellChecker','Scayt']},{name:'forms',items:['Form','Checkbox','Radio','TextField','Textarea','Select','Button','ImageButton','HiddenField']},'/',{name:'basicstyles',items:['Bold','Italic','Underline','Strike','Subscript','Superscript','-','RemoveFormat']},{name:'paragraph',items:['NumberedList','BulletedList','-','Outdent','Indent','-','Blockquote','CreateDiv','-','JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock','-','BidiLtr','BidiRtl']},{name:'links',items:['Link','Unlink','Anchor']},{name:'insert',items:['Image','Flash','Table','HorizontalRule','Smiley','SpecialChar','PageBreak','Iframe']},'/',{name:'styles',items:['Styles','Format','Font','FontSize']},{name:'colors',items:['TextColor','BGColor']},{name:'tools',items:['Maximize','ShowBlocks','-','About']}];i.toolbar='Full';i.toolbarCanCollapse=true;(function(){j.add('undo',{requires:['selection','wysiwygarea'],init:function(s){var t=new o(s),u=s.addCommand('undo',{exec:function(){if(t.undo()){s.selectionChange();this.fire('afterUndo');}},state:0,canUndo:false}),v=s.addCommand('redo',{exec:function(){if(t.redo()){s.selectionChange();this.fire('afterRedo');}},state:0,canUndo:false});t.onChange=function(){u.setState(t.undoable()?2:0);v.setState(t.redoable()?2:0);};function w(x){if(t.enabled&&x.data.command.canUndo!==false)t.save();};s.on('beforeCommandExec',w);s.on('afterCommandExec',w);s.on('saveSnapshot',function(x){t.save(x.data&&x.data.contentOnly);});s.on('contentDom',function(){s.document.on('keydown',function(x){if(!x.data.$.ctrlKey&&!x.data.$.metaKey)t.type(x);});});s.on('beforeModeUnload',function(){s.mode=='wysiwyg'&&t.save(true);});s.on('mode',function(){t.enabled=s.readOnly?false:s.mode=='wysiwyg';t.onChange();});s.ui.addButton('Undo',{label:s.lang.undo,command:'undo'});s.ui.addButton('Redo',{label:s.lang.redo,command:'redo'});
+s.resetUndo=function(){t.reset();s.fire('saveSnapshot');};s.on('updateSnapshot',function(){if(t.currentImage)t.update();});}});j.undo={};var m=j.undo.Image=function(s){this.editor=s;s.fire('beforeUndoImage');var t=s.getSnapshot(),u=t&&s.getSelection();c&&t&&(t=t.replace(/\s+data-cke-expando=".*?"/g,''));this.contents=t;this.bookmarks=u&&u.createBookmarks2(true);s.fire('afterUndoImage');},n=/\b(?:href|src|name)="[^"]*?"/gi;m.prototype={equals:function(s,t){var u=this.contents,v=s.contents;if(c&&(b.ie7Compat||b.ie6Compat)){u=u.replace(n,'');v=v.replace(n,'');}if(u!=v)return false;if(t)return true;var w=this.bookmarks,x=s.bookmarks;if(w||x){if(!w||!x||w.length!=x.length)return false;for(var y=0;y<w.length;y++){var z=w[y],A=x[y];if(z.startOffset!=A.startOffset||z.endOffset!=A.endOffset||!e.arrayCompare(z.start,A.start)||!e.arrayCompare(z.end,A.end))return false;}}return true;}};function o(s){this.editor=s;this.reset();};var p={8:1,46:1},q={16:1,17:1,18:1},r={37:1,38:1,39:1,40:1};o.prototype={type:function(s){var t=s&&s.data.getKey(),u=t in q,v=t in p,w=this.lastKeystroke in p,x=v&&t==this.lastKeystroke,y=t in r,z=this.lastKeystroke in r,A=!v&&!y,B=v&&!x,C=!(u||this.typing)||A&&(w||z);if(C||B){var D=new m(this.editor),E=this.snapshots.length;e.setTimeout(function(){var G=this;var F=G.editor.getSnapshot();if(c)F=F.replace(/\s+data-cke-expando=".*?"/g,'');if(D.contents!=F&&E==G.snapshots.length){G.typing=true;if(!G.save(false,D,false))G.snapshots.splice(G.index+1,G.snapshots.length-G.index-1);G.hasUndo=true;G.hasRedo=false;G.typesCount=1;G.modifiersCount=1;G.onChange();}},0,this);}this.lastKeystroke=t;if(v){this.typesCount=0;this.modifiersCount++;if(this.modifiersCount>25){this.save(false,null,false);this.modifiersCount=1;}}else if(!y){this.modifiersCount=0;this.typesCount++;if(this.typesCount>25){this.save(false,null,false);this.typesCount=1;}}},reset:function(){var s=this;s.lastKeystroke=0;s.snapshots=[];s.index=-1;s.limit=s.editor.config.undoStackSize||20;s.currentImage=null;s.hasUndo=false;s.hasRedo=false;s.resetType();},resetType:function(){var s=this;s.typing=false;delete s.lastKeystroke;s.typesCount=0;s.modifiersCount=0;},fireChange:function(){var s=this;s.hasUndo=!!s.getNextImage(true);s.hasRedo=!!s.getNextImage(false);s.resetType();s.onChange();},save:function(s,t,u){var w=this;var v=w.snapshots;if(!t)t=new m(w.editor);if(t.contents===false)return false;if(w.currentImage&&t.equals(w.currentImage,s))return false;v.splice(w.index+1,v.length-w.index-1);if(v.length==w.limit)v.shift();
+w.index=v.push(t)-1;w.currentImage=t;if(u!==false)w.fireChange();return true;},restoreImage:function(s){var w=this;var t=w.editor,u;if(s.bookmarks){t.focus();u=t.getSelection();}w.editor.loadSnapshot(s.contents);if(s.bookmarks)u.selectBookmarks(s.bookmarks);else if(c){var v=w.editor.document.getBody().$.createTextRange();v.collapse(true);v.select();}w.index=s.index;w.update();w.fireChange();},getNextImage:function(s){var x=this;var t=x.snapshots,u=x.currentImage,v,w;if(u)if(s)for(w=x.index-1;w>=0;w--){v=t[w];if(!u.equals(v,true)){v.index=w;return v;}}else for(w=x.index+1;w<t.length;w++){v=t[w];if(!u.equals(v,true)){v.index=w;return v;}}return null;},redoable:function(){return this.enabled&&this.hasRedo;},undoable:function(){return this.enabled&&this.hasUndo;},undo:function(){var t=this;if(t.undoable()){t.save(true);var s=t.getNextImage(true);if(s)return t.restoreImage(s),true;}return false;},redo:function(){var t=this;if(t.redoable()){t.save(true);if(t.redoable()){var s=t.getNextImage(false);if(s)return t.restoreImage(s),true;}}return false;},update:function(){var s=this;s.snapshots.splice(s.index,1,s.currentImage=new m(s.editor));}};})();(function(){var m=/(^|<body\b[^>]*>)\s*<(p|div|address|h\d|center|pre)[^>]*>\s*(?:<br[^>]*>| |\u00A0| )?\s*(:?<\/\2>)?\s*(?=$|<\/body>)/gi,n=d.walker.whitespaces(true),o=d.walker.bogus(true),p=function(E){return n(E)&&o(E);};function q(E){return E.isBlockBoundary()&&f.$empty[E.getName()];};function r(E){return function(F){if(this.mode=='wysiwyg'){this.focus();var G=this.getSelection(),H=G.isLocked;H&&G.unlock();this.fire('saveSnapshot');E.call(this,F.data);H&&this.getSelection().lock();e.setTimeout(function(){this.fire('saveSnapshot');},0,this);}};};function s(E){var N=this;if(N.dataProcessor)E=N.dataProcessor.toHtml(E);if(!E)return;var F=N.getSelection(),G=F.getRanges()[0];if(G.checkReadOnly())return;if(b.opera){var H=new d.elementPath(G.startContainer);if(H.block){var I=a.htmlParser.fragment.fromHtml(E,false).children;for(var J=0,K=I.length;J<K;J++){if(I[J]._.isBlockLike){G.splitBlock(N.enterMode==3?'div':'p');G.insertNode(G.document.createText(''));G.select();break;}}}}if(c){var L=F.getNative();if(L.type=='Control')L.clear();else if(F.getType()==2){G=F.getRanges()[0];var M=G&&G.endContainer;if(M&&M.type==1&&M.getAttribute('contenteditable')=='false'&&G.checkBoundaryOfElement(M,2)){G.setEndAfter(G.endContainer);G.deleteContents();}}L.createRange().pasteHTML(E);}else N.document.$.execCommand('inserthtml',false,E);
+if(b.webkit){F=N.getSelection();F.scrollIntoView();}};function t(E){var F=this.getSelection(),G=F.getStartElement().hasAscendant('pre',true)?2:this.config.enterMode,H=G==2,I=e.htmlEncode(E.replace(/\r\n|\r/g,'\n'));I=I.replace(/^[ \t]+|[ \t]+$/g,function(O,P,Q){if(O.length==1)return ' ';else if(!P)return e.repeat(' ',O.length-1)+' ';else return ' '+e.repeat(' ',O.length-1);});I=I.replace(/[ \t]{2,}/g,function(O){return e.repeat(' ',O.length-1)+' ';});var J=G==1?'p':'div';if(!H)I=I.replace(/(\n{2})([\s\S]*?)(?:$|\1)/g,function(O,P,Q){return '<'+J+'>'+Q+'</'+J+'>';});I=I.replace(/\n/g,'<br>');if(!(H||c))I=I.replace(new RegExp('<br>(?=</'+J+'>)'),function(O){return e.repeat(O,2);});if(b.gecko||b.webkit){var K=new d.elementPath(F.getStartElement()),L=[];for(var M=0;M<K.elements.length;M++){var N=K.elements[M].getName();if(N in f.$inline)L.unshift(K.elements[M].getOuterHtml().match(/^<.*?>/));else if(N in f.$block)break;}I=L.join('')+I;}s.call(this,I);};function u(E){var F=this.getSelection(),G=F.getRanges(),H=E.getName(),I=f.$block[H],J=F.isLocked;if(J)F.unlock();var K,L,M,N;for(var O=G.length-1;O>=0;O--){K=G[O];if(!K.checkReadOnly()){K.deleteContents(1);L=!O&&E||E.clone(1);var P,Q;if(I)while((P=K.getCommonAncestor(0,1))&&(Q=f[P.getName()])&&!(Q&&Q[H])){if(P.getName() in f.span)K.splitElement(P);else if(K.checkStartOfBlock()&&K.checkEndOfBlock()){K.setStartBefore(P);K.collapse(true);P.remove();}else K.splitBlock();}K.insertNode(L);if(!M)M=L;}}if(M){K.moveToPosition(M,4);if(I){var R=M.getNext(p),S=R&&R.type==1&&R.getName();if(S&&f.$block[S]){if(f[S]['#'])K.moveToElementEditStart(R);else K.moveToElementEditEnd(M);}else if(!R){R=K.fixBlock(true,this.config.enterMode==3?'div':'p');K.moveToElementEditStart(R);}}}F.selectRanges([K]);if(J)this.getSelection().lock();};function v(E){if(!E.checkDirty())setTimeout(function(){E.resetDirty();},0);};var w=d.walker.whitespaces(true),x=d.walker.bookmark(false,true);function y(E){return w(E)&&x(E);};function z(E){return E.type==3&&e.trim(E.getText()).match(/^(?: |\xa0)$/);};function A(E){if(E.isLocked){E.unlock();setTimeout(function(){E.lock();},0);}};function B(E){return E.getOuterHtml().match(m);};w=d.walker.whitespaces(true);function C(E){var F=E.window,G=E.document,H=E.document.getBody(),I=H.getFirst(),J=H.getChildren().count();if(!J||J==1&&I.type==1&&I.hasAttribute('_moz_editor_bogus_node')){v(E);var K=E.element.getDocument(),L=K.getDocumentElement(),M=L.$.scrollTop,N=L.$.scrollLeft,O=G.$.createEvent('KeyEvents');
+O.initKeyEvent('keypress',true,true,F.$,false,false,false,false,0,32);G.$.dispatchEvent(O);if(M!=L.$.scrollTop||N!=L.$.scrollLeft)K.getWindow().$.scrollTo(N,M);J&&H.getFirst().remove();G.getBody().appendBogus();var P=new d.range(G);P.setStartAt(H,1);P.select();}};function D(E){var F=E.editor,G=E.data.path,H=G.blockLimit,I=E.data.selection,J=I.getRanges()[0],K=F.document.getBody(),L=F.config.enterMode;if(b.gecko){C(F);var M=G.block||G.blockLimit,N=M&&M.getLast(y);if(M&&M.isBlockBoundary()&&!(N&&N.type==1&&N.isBlockBoundary())&&!M.is('pre')&&!M.getBogus())M.appendBogus();}if(F.config.autoParagraph!==false&&L!=2&&J.collapsed&&H.getName()=='body'&&!G.block){var O=J.fixBlock(true,F.config.enterMode==3?'div':'p');if(c){var P=O.getFirst(y);P&&z(P)&&P.remove();}if(B(O)){var Q=O.getNext(w);if(Q&&Q.type==1&&!q(Q)){J.moveToElementEditStart(Q);O.remove();}else{Q=O.getPrevious(w);if(Q&&Q.type==1&&!q(Q)){J.moveToElementEditEnd(Q);O.remove();}}}J.select();E.cancel();}var R=new d.range(F.document);R.moveToElementEditEnd(F.document.getBody());var S=new d.elementPath(R.startContainer);if(!S.blockLimit.is('body')){var T;if(L!=2)T=K.append(F.document.createElement(L==1?'p':'div'));else T=K;if(!c)T.appendBogus();}};j.add('wysiwygarea',{requires:['editingblock'],init:function(E){var F=E.config.enterMode!=2&&E.config.autoParagraph!==false?E.config.enterMode==3?'div':'p':false,G=E.lang.editorTitle.replace('%1',E.name),H=E.lang.editorHelp;if(c)G+=', '+H;var I=a.document.getWindow(),J;E.on('editingBlockReady',function(){var M,N,O,P,Q,R,S,T=b.isCustomDomain(),U=function(X){if(N)N.remove();var Y='document.open();'+(T?'document.domain="'+document.domain+'";':'')+'document.close();';Y=b.air?'javascript:void(0)':c?'javascript:void(function(){'+encodeURIComponent(Y)+'}())':'';var Z=e.getNextId();N=h.createFromHtml('<iframe style="width:100%;height:100%" frameBorder="0" aria-describedby="'+Z+'"'+' title="'+G+'"'+' src="'+Y+'"'+' tabIndex="'+(b.webkit?-1:E.tabIndex)+'"'+' allowTransparency="true"'+'></iframe>');if(document.location.protocol=='chrome:')a.event.useCapture=true;N.on('load',function(aa){Q=1;aa.removeListener();var ab=N.getFrameDocument();ab.write(X);b.air&&W(ab.getWindow().$);});if(document.location.protocol=='chrome:')a.event.useCapture=false;M.append(h.createFromHtml('<span id="'+Z+'" class="cke_voice_label">'+H+'</span>'));M.append(N);if(b.webkit){S=function(){M.setStyle('width','100%');N.hide();N.setSize('width',M.getSize('width'));M.removeStyle('width');N.show();};I.on('resize',S);
+}};J=e.addFunction(W);var V='<script id="cke_actscrpt" type="text/javascript" data-cke-temp="1">'+(T?'document.domain="'+document.domain+'";':'')+'window.parent.CKEDITOR.tools.callFunction( '+J+', window );'+'</script>';function W(X){if(!Q)return;Q=0;E.fire('ariaWidget',N);var Y=X.document,Z=Y.body,aa=Y.getElementById('cke_actscrpt');aa&&aa.parentNode.removeChild(aa);Z.spellcheck=!E.config.disableNativeSpellChecker;var ab=!E.readOnly;if(c){Z.hideFocus=true;Z.disabled=true;Z.contentEditable=ab;Z.removeAttribute('disabled');}else setTimeout(function(){if(b.gecko&&b.version>=10900||b.opera)Y.$.body.contentEditable=ab;else if(b.webkit)Y.$.body.parentNode.contentEditable=ab;else Y.$.designMode=ab?'off':'on';},0);ab&&b.gecko&&e.setTimeout(C,0,null,E);X=E.window=new d.window(X);Y=E.document=new g(Y);ab&&Y.on('dblclick',function(ag){var ah=ag.data.getTarget(),ai={element:ah,dialog:''};E.fire('doubleclick',ai);ai.dialog&&E.openDialog(ai.dialog);});c&&Y.on('click',function(ag){var ah=ag.data.getTarget();if(ah.is('input')){var ai=ah.getAttribute('type');if(ai=='submit'||ai=='reset')ag.data.preventDefault();}});if(!(c||b.opera))Y.on('mousedown',function(ag){var ah=ag.data.getTarget();if(ah.is('img','hr','input','textarea','select'))E.getSelection().selectElement(ah);});if(b.gecko)Y.on('mouseup',function(ag){if(ag.data.$.button==2){var ah=ag.data.getTarget();if(!ah.getOuterHtml().replace(m,'')){var ai=new d.range(Y);ai.moveToElementEditStart(ah);ai.select(true);}}});Y.on('click',function(ag){ag=ag.data;if(ag.getTarget().is('a')&&ag.$.button!=2)ag.preventDefault();});if(b.webkit){Y.on('mousedown',function(){ad=1;});Y.on('click',function(ag){if(ag.data.getTarget().is('input','select'))ag.data.preventDefault();});Y.on('mouseup',function(ag){if(ag.data.getTarget().is('input','textarea'))ag.data.preventDefault();});}var ac=c?N:X;ac.on('blur',function(){E.focusManager.blur();});var ad;ac.on('focus',function(){var ag=E.document;if(b.gecko||b.opera)ag.getBody().focus();else if(b.webkit)if(!ad){E.document.getDocumentElement().focus();ad=1;}E.focusManager.focus();});var ae=E.keystrokeHandler;ae.blockedKeystrokes[8]=!ab;ae.attach(Y);Y.getDocumentElement().addClass(Y.$.compatMode);ab&&Y.on('keydown',function(ag){var ah=ag.data.getKeystroke();if(ah in {8:1,46:1}){var ai=E.getSelection(),aj=ai.getSelectedElement(),ak=ai.getRanges()[0],al=new d.elementPath(ak.startContainer),am,an,ao,ap=ah==8;if(aj){E.fire('saveSnapshot');ak.moveToPosition(aj,3);aj.remove();ak.select();E.fire('saveSnapshot');
+ag.data.preventDefault();}else if((am=al.block)&&ak[ap?'checkStartOfBlock':'checkEndOfBlock']()&&(ao=am[ap?'getPrevious':'getNext'](n))&&ao.is('table')){E.fire('saveSnapshot');if(ak[ap?'checkEndOfBlock':'checkStartOfBlock']())am.remove();ak['moveToElementEdit'+(ap?'End':'Start')](ao);ak.select();E.fire('saveSnapshot');ag.data.preventDefault();}else if(al.blockLimit.is('td')&&(an=al.blockLimit.getAscendant('table'))&&ak.checkBoundaryOfElement(an,ap?1:2)&&(ao=an[ap?'getPrevious':'getNext'](n))){E.fire('saveSnapshot');ak['moveToElementEdit'+(ap?'End':'Start')](ao);if(ak.checkStartOfBlock()&&ak.checkEndOfBlock())ao.remove();else ak.select();E.fire('saveSnapshot');ag.data.preventDefault();}}if(ah==33||ah==34)if(b.gecko){var aq=Y.getBody();if(X.$.innerHeight>aq.$.offsetHeight){ak=new d.range(Y);ak[ah==33?'moveToElementEditStart':'moveToElementEditEnd'](aq);ak.select();ag.data.preventDefault();}}});if(c&&Y.$.compatMode=='CSS1Compat'){var af={33:1,34:1};Y.on('keydown',function(ag){if(ag.data.getKeystroke() in af)setTimeout(function(){E.getSelection().scrollIntoView();},0);});}if(c&&E.config.enterMode!=1)Y.on('selectionchange',function(){var ag=Y.getBody(),ah=E.getSelection(),ai=ah&&ah.getRanges()[0];if(ai&&ag.getHtml().match(/^<p> <\/p>$/i)&&ai.startContainer.equals(ag))setTimeout(function(){ai=E.getSelection().getRanges()[0];if(!ai.startContainer.equals('body')){ag.getFirst().remove(1);ai.moveToElementEditEnd(ag);ai.select(1);}},0);});if(E.contextMenu)E.contextMenu.addTarget(Y,E.config.browserContextMenuOnCtrl!==false);setTimeout(function(){E.fire('contentDom');if(R){E.mode='wysiwyg';E.fire('mode',{previousMode:E._.previousMode});R=false;}O=false;if(P){E.focus();P=false;}setTimeout(function(){E.fire('dataReady');},0);try{E.document.$.execCommand('2D-position',false,true);}catch(ag){}try{E.document.$.execCommand('enableInlineTableEditing',false,!E.config.disableNativeTableHandles);}catch(ah){}if(E.config.disableObjectResizing)try{E.document.$.execCommand('enableObjectResizing',false,false);}catch(ai){E.document.getBody().on(c?'resizestart':'resize',function(aj){aj.data.preventDefault();});}if(c)setTimeout(function(){if(E.document){var aj=E.document.$.body;aj.runtimeStyle.marginBottom='0px';aj.runtimeStyle.marginBottom='';}},1000);},0);};E.addMode('wysiwyg',{load:function(X,Y,Z){M=X;if(c&&b.quirks)X.setStyle('position','relative');E.mayBeDirty=true;R=true;if(Z)this.loadSnapshotData(Y);else this.loadData(Y);},loadData:function(X){O=true;E._.dataStore={id:1};var Y=E.config,Z=Y.fullPage,aa=Y.docType,ab='<style type="text/css" data-cke-temp="1">'+E._.styles.join('\n')+'</style>';
+!Z&&(ab=e.buildStyleHtml(E.config.contentsCss)+ab);var ac=Y.baseHref?'<base href="'+Y.baseHref+'" data-cke-temp="1" />':'';if(Z)X=X.replace(/<!DOCTYPE[^>]*>/i,function(ad){E.docType=aa=ad;return '';}).replace(/<\?xml\s[^\?]*\?>/i,function(ad){E.xmlDeclaration=ad;return '';});if(E.dataProcessor)X=E.dataProcessor.toHtml(X,F);if(Z){if(!/<body[\s|>]/.test(X))X='<body>'+X;if(!/<html[\s|>]/.test(X))X='<html>'+X+'</html>';if(!/<head[\s|>]/.test(X))X=X.replace(/<html[^>]*>/,'$&<head><title></title></head>');else if(!/<title[\s|>]/.test(X))X=X.replace(/<head[^>]*>/,'$&<title></title>');ac&&(X=X.replace(/<head>/,'$&'+ac));X=X.replace(/<\/head\s*>/,ab+'$&');X=aa+X;}else X=Y.docType+'<html dir="'+Y.contentsLangDirection+'"'+' lang="'+(Y.contentsLanguage||E.langCode)+'">'+'<head>'+'<title>'+G+'</title>'+ac+ab+'</head>'+'<body'+(Y.bodyId?' id="'+Y.bodyId+'"':'')+(Y.bodyClass?' class="'+Y.bodyClass+'"':'')+'>'+X+'</html>';if(b.gecko)X=X.replace(/<br \/>(?=\s*<\/(:?html|body)>)/,'$&<br type="_moz" />');X+=V;this.onDispose();U(X);},getData:function(){var X=E.config,Y=X.fullPage,Z=Y&&E.docType,aa=Y&&E.xmlDeclaration,ab=N.getFrameDocument(),ac=Y?ab.getDocumentElement().getOuterHtml():ab.getBody().getHtml();if(b.gecko)ac=ac.replace(/<br>(?=\s*(:?$|<\/body>))/,'');if(E.dataProcessor)ac=E.dataProcessor.toDataFormat(ac,F);if(X.ignoreEmptyParagraph)ac=ac.replace(m,function(ad,ae){return ae;});if(aa)ac=aa+'\n'+ac;if(Z)ac=Z+'\n'+ac;return ac;},getSnapshotData:function(){return N.getFrameDocument().getBody().getHtml();},loadSnapshotData:function(X){N.getFrameDocument().getBody().setHtml(X);},onDispose:function(){if(!E.document)return;E.document.getDocumentElement().clearCustomData();E.document.getBody().clearCustomData();E.window.clearCustomData();E.document.clearCustomData();N.clearCustomData();N.remove();},unload:function(X){this.onDispose();if(S)I.removeListener('resize',S);E.window=E.document=N=M=P=null;E.fire('contentDomUnload');},focus:function(){var X=E.window;if(O)P=true;else if(X){var Y=E.getSelection(),Z=Y&&Y.getNative();if(Z&&Z.type=='Control')return;b.air?setTimeout(function(){X.focus();},0):X.focus();E.selectionChange();}}});E.on('insertHtml',r(s),null,null,20);E.on('insertElement',r(u),null,null,20);E.on('insertText',r(t),null,null,20);E.on('selectionChange',function(X){if(E.readOnly)return;var Y=E.getSelection();if(Y&&!Y.isLocked){var Z=E.checkDirty();E.fire('saveSnapshot',{contentOnly:1});D.call(this,X);E.fire('updateSnapshot');!Z&&E.resetDirty();}},null,null,1);});E.on('contentDom',function(){var M=E.document.getElementsByTag('title').getItem(0);
+M.data('cke-title',E.document.$.title);c&&(E.document.$.title=G);});E.on('readOnly',function(){if(E.mode=='wysiwyg'){var M=E.getMode();M.loadData(M.getData());}});if(a.document.$.documentMode>=8){E.addCss('html.CSS1Compat [contenteditable=false]{ min-height:0 !important;}');var K=[];for(var L in f.$removeEmpty)K.push('html.CSS1Compat '+L+'[contenteditable=false]');E.addCss(K.join(',')+'{ display:inline-block;}');}else if(b.gecko){E.addCss('html { height: 100% !important; }');E.addCss('img:-moz-broken { -moz-force-broken-image-icon : 1;\tmin-width : 24px; min-height : 24px; }');}else if(c&&b.version<8&&E.config.contentsLangDirection=='ltr')E.addCss('body{margin-right:0;}');E.addCss('html {\t_overflow-y: scroll; cursor: text;\t*cursor:auto;}');E.addCss('img, input, textarea { cursor: default;}');E.on('insertElement',function(M){var N=M.data;if(N.type==1&&(N.is('input')||N.is('textarea'))){var O=N.getAttribute('contenteditable')=='false';if(!O){N.data('cke-editable',N.hasAttribute('contenteditable')?'true':'1');N.setAttribute('contenteditable',false);}}});}});if(b.gecko)(function(){var E=document.body;if(!E)window.addEventListener('load',arguments.callee,false);else{var F=E.getAttribute('onpageshow');E.setAttribute('onpageshow',(F?F+';':'')+'event.persisted && (function(){'+'var allInstances = CKEDITOR.instances, editor, doc;'+'for ( var i in allInstances )'+'{'+'\teditor = allInstances[ i ];'+'\tdoc = editor.document;'+'\tif ( doc )'+'\t{'+'\t\tdoc.$.designMode = "off";'+'\t\tdoc.$.designMode = "on";'+'\t}'+'}'+'})();');}})();})();i.disableObjectResizing=false;i.disableNativeTableHandles=true;i.disableNativeSpellChecker=true;i.ignoreEmptyParagraph=true;j.add('wsc',{requires:['dialog'],init:function(m){var n='checkspell',o=m.addCommand(n,new a.dialogCommand(n));o.modes={wysiwyg:!b.opera&&!b.air&&document.domain==window.location.hostname};m.ui.addButton('SpellChecker',{label:m.lang.spellCheck.toolbar,command:n});a.dialog.add(n,this.path+'dialogs/wsc.js');}});i.wsc_customerId=i.wsc_customerId||'1:ua3xw1-2XyGJ3-GWruD3-6OFNT1-oXcuB1-nR6Bp4-hgQHc-EcYng3-sdRXG3-NOfFk';i.wsc_customLoaderScript=i.wsc_customLoaderScript||null;a.DIALOG_RESIZE_NONE=0;a.DIALOG_RESIZE_WIDTH=1;a.DIALOG_RESIZE_HEIGHT=2;a.DIALOG_RESIZE_BOTH=3;(function(){var m=e.cssLength;function n(Q){return!!this._.tabs[Q][0].$.offsetHeight;};function o(){var U=this;var Q=U._.currentTabId,R=U._.tabIdList.length,S=e.indexOf(U._.tabIdList,Q)+R;for(var T=S-1;T>S-R;T--){if(n.call(U,U._.tabIdList[T%R]))return U._.tabIdList[T%R];
+}return null;};function p(){var U=this;var Q=U._.currentTabId,R=U._.tabIdList.length,S=e.indexOf(U._.tabIdList,Q);for(var T=S+1;T<S+R;T++){if(n.call(U,U._.tabIdList[T%R]))return U._.tabIdList[T%R];}return null;};function q(Q,R){var S=Q.$.getElementsByTagName('input');for(var T=0,U=S.length;T<U;T++){var V=new h(S[T]);if(V.getAttribute('type').toLowerCase()=='text')if(R){V.setAttribute('value',V.getCustomData('fake_value')||'');V.removeCustomData('fake_value');}else{V.setCustomData('fake_value',V.getAttribute('value'));V.setAttribute('value','');}}};function r(Q,R){var T=this;var S=T.getInputElement();if(S)Q?S.removeAttribute('aria-invalid'):S.setAttribute('aria-invalid',true);if(!Q)if(T.select)T.select();else T.focus();R&&alert(R);T.fire('validated',{valid:Q,msg:R});};function s(){var Q=this.getInputElement();Q&&Q.removeAttribute('aria-invalid');};a.dialog=function(Q,R){var S=a.dialog._.dialogDefinitions[R],T=e.clone(u),U=Q.config.dialog_buttonsOrder||'OS',V=Q.lang.dir,W={},X,Y,Z;if(U=='OS'&&b.mac||U=='rtl'&&V=='ltr'||U=='ltr'&&V=='rtl')T.buttons.reverse();S=e.extend(S(Q),T);S=e.clone(S);S=new y(this,S);var aa=a.document,ab=Q.theme.buildDialog(Q);this._={editor:Q,element:ab.element,name:R,contentSize:{width:0,height:0},size:{width:0,height:0},contents:{},buttons:{},accessKeyMap:{},tabs:{},tabIdList:[],currentTabId:null,currentTabIndex:null,pageCount:0,lastTab:null,tabBarMode:false,focusList:[],currentFocusIndex:0,hasFocus:false};this.parts=ab.parts;e.setTimeout(function(){Q.fire('ariaWidget',this.parts.contents);},0,this);var ac={position:b.ie6Compat?'absolute':'fixed',top:0,visibility:'hidden'};ac[V=='rtl'?'right':'left']=0;this.parts.dialog.setStyles(ac);a.event.call(this);this.definition=S=a.fire('dialogDefinition',{name:R,definition:S},Q).definition;if(!('removeDialogTabs' in Q._)&&Q.config.removeDialogTabs){var ad=Q.config.removeDialogTabs.split(';');for(X=0;X<ad.length;X++){var ae=ad[X].split(':');if(ae.length==2){var af=ae[0];if(!W[af])W[af]=[];W[af].push(ae[1]);}}Q._.removeDialogTabs=W;}if(Q._.removeDialogTabs&&(W=Q._.removeDialogTabs[R]))for(X=0;X<W.length;X++)S.removeContents(W[X]);if(S.onLoad)this.on('load',S.onLoad);if(S.onShow)this.on('show',S.onShow);if(S.onHide)this.on('hide',S.onHide);if(S.onOk)this.on('ok',function(aq){Q.fire('saveSnapshot');setTimeout(function(){Q.fire('saveSnapshot');},0);if(S.onOk.call(this,aq)===false)aq.data.hide=false;});if(S.onCancel)this.on('cancel',function(aq){if(S.onCancel.call(this,aq)===false)aq.data.hide=false;
+});var ag=this,ah=function(aq){var ar=ag._.contents,as=false;for(var at in ar)for(var au in ar[at]){as=aq.call(this,ar[at][au]);if(as)return;}};this.on('ok',function(aq){ah(function(ar){if(ar.validate){var as=ar.validate(this),at=typeof as=='string'||as===false;if(at){aq.data.hide=false;aq.stop();}r.call(ar,!at,typeof as=='string'?as:undefined);return at;}});},this,null,0);this.on('cancel',function(aq){ah(function(ar){if(ar.isChanged()){if(!confirm(Q.lang.common.confirmCancel))aq.data.hide=false;return true;}});},this,null,0);this.parts.close.on('click',function(aq){if(this.fire('cancel',{hide:true}).hide!==false)this.hide();aq.data.preventDefault();},this);function ai(){var aq=ag._.focusList;aq.sort(function(at,au){if(at.tabIndex!=au.tabIndex)return au.tabIndex-at.tabIndex;else return at.focusIndex-au.focusIndex;});var ar=aq.length;for(var as=0;as<ar;as++)aq[as].focusIndex=as;};function aj(aq){var ar=ag._.focusList;aq=aq||0;if(ar.length<1)return;var as=ag._.currentFocusIndex;try{ar[as].getInputElement().$.blur();}catch(av){}var at=(as+aq+ar.length)%ar.length,au=at;while(aq&&!ar[au].isFocusable()){au=(au+aq+ar.length)%ar.length;if(au==at)break;}ar[au].focus();if(ar[au].type=='text')ar[au].select();};this.changeFocus=aj;function ak(aq){var ax=this;if(ag!=a.dialog._.currentTop)return;var ar=aq.data.getKeystroke(),as=Q.lang.dir=='rtl',at;Y=Z=0;if(ar==9||ar==2228224+9){var au=ar==2228224+9;if(ag._.tabBarMode){var av=au?o.call(ag):p.call(ag);ag.selectPage(av);ag._.tabs[av][0].focus();}else aj(au?-1:1);Y=1;}else if(ar==4456448+121&&!ag._.tabBarMode&&ag.getPageCount()>1){ag._.tabBarMode=true;ag._.tabs[ag._.currentTabId][0].focus();Y=1;}else if((ar==37||ar==39)&&ag._.tabBarMode){av=ar==(as?39:37)?o.call(ag):p.call(ag);ag.selectPage(av);ag._.tabs[av][0].focus();Y=1;}else if((ar==13||ar==32)&&ag._.tabBarMode){ax.selectPage(ax._.currentTabId);ax._.tabBarMode=false;ax._.currentFocusIndex=-1;aj(1);Y=1;}else if(ar==13){var aw=aq.data.getTarget();if(!aw.is('a','button','select')&&(!aw.is('input')||aw.$.type!='button')){at=ax.getButton('ok');at&&e.setTimeout(at.click,0,at);Y=1;}Z=1;}else if(ar==27){at=ax.getButton('cancel');if(at)e.setTimeout(at.click,0,at);else if(ax.fire('cancel',{hide:true}).hide!==false)ax.hide();Z=1;}else return;al(aq);};function al(aq){if(Y)aq.data.preventDefault(1);else if(Z)aq.data.stopPropagation();};var am=this._.element;this.on('show',function(){am.on('keydown',ak,this);if(b.opera||b.gecko)am.on('keypress',al,this);});this.on('hide',function(){am.removeListener('keydown',ak);
+if(b.opera||b.gecko)am.removeListener('keypress',al);ah(function(aq){s.apply(aq);});});this.on('iframeAdded',function(aq){var ar=new g(aq.data.iframe.$.contentWindow.document);ar.on('keydown',ak,this,null,0);});this.on('show',function(){var au=this;ai();if(Q.config.dialog_startupFocusTab&&ag._.pageCount>1){ag._.tabBarMode=true;ag._.tabs[ag._.currentTabId][0].focus();}else if(!au._.hasFocus){au._.currentFocusIndex=-1;if(S.onFocus){var aq=S.onFocus.call(au);aq&&aq.focus();}else aj(1);if(au._.editor.mode=='wysiwyg'&&c){var ar=Q.document.$.selection,as=ar.createRange();if(as)if(as.parentElement&&as.parentElement().ownerDocument==Q.document.$||as.item&&as.item(0).ownerDocument==Q.document.$){var at=document.body.createTextRange();at.moveToElementText(au.getElement().getFirst().$);at.collapse(true);at.select();}}}},this,null,4294967295);if(b.ie6Compat)this.on('load',function(aq){var ar=this.getElement(),as=ar.getFirst();as.remove();as.appendTo(ar);},this);A(this);B(this);new d.text(S.title,a.document).appendTo(this.parts.title);for(X=0;X<S.contents.length;X++){var an=S.contents[X];an&&this.addPage(an);}this.parts.tabs.on('click',function(aq){var at=this;var ar=aq.data.getTarget();if(ar.hasClass('cke_dialog_tab')){var as=ar.$.id;at.selectPage(as.substring(4,as.lastIndexOf('_')));if(at._.tabBarMode){at._.tabBarMode=false;at._.currentFocusIndex=-1;aj(1);}aq.data.preventDefault();}},this);var ao=[],ap=a.dialog._.uiElementBuilders.hbox.build(this,{type:'hbox',className:'cke_dialog_footer_buttons',widths:[],children:S.buttons},ao).getChild();this.parts.footer.setHtml(ao.join(''));for(X=0;X<ap.length;X++)this._.buttons[ap[X].id]=ap[X];};function t(Q,R,S){this.element=R;this.focusIndex=S;this.tabIndex=0;this.isFocusable=function(){return!R.getAttribute('disabled')&&R.isVisible();};this.focus=function(){Q._.currentFocusIndex=this.focusIndex;this.element.focus();};R.on('keydown',function(T){if(T.data.getKeystroke() in {32:1,13:1})this.fire('click');});R.on('focus',function(){this.fire('mouseover');});R.on('blur',function(){this.fire('mouseout');});};a.dialog.prototype={destroy:function(){this.hide();this._.element.remove();},resize:(function(){return function(Q,R){var S=this;if(S._.contentSize&&S._.contentSize.width==Q&&S._.contentSize.height==R)return;a.dialog.fire('resize',{dialog:S,skin:S._.editor.skinName,width:Q,height:R},S._.editor);S.fire('resize',{skin:S._.editor.skinName,width:Q,height:R},S._.editor);if(S._.editor.lang.dir=='rtl'&&S._.position)S._.position.x=a.document.getWindow().getViewPaneSize().width-S._.contentSize.width-parseInt(S._.element.getFirst().getStyle('right'),10);
+S._.contentSize={width:Q,height:R};};})(),getSize:function(){var Q=this._.element.getFirst();return{width:Q.$.offsetWidth||0,height:Q.$.offsetHeight||0};},move:(function(){var Q;return function(R,S,T){var aa=this;var U=aa._.element.getFirst(),V=aa._.editor.lang.dir=='rtl';if(Q===undefined)Q=U.getComputedStyle('position')=='fixed';if(Q&&aa._.position&&aa._.position.x==R&&aa._.position.y==S)return;aa._.position={x:R,y:S};if(!Q){var W=a.document.getWindow().getScrollPosition();R+=W.x;S+=W.y;}if(V){var X=aa.getSize(),Y=a.document.getWindow().getViewPaneSize();R=Y.width-X.width-R;}var Z={top:(S>0?S:0)+'px'};Z[V?'right':'left']=(R>0?R:0)+'px';U.setStyles(Z);T&&(aa._.moved=1);};})(),getPosition:function(){return e.extend({},this._.position);},show:function(){var Q=this._.element,R=this.definition;if(!(Q.getParent()&&Q.getParent().equals(a.document.getBody())))Q.appendTo(a.document.getBody());else Q.setStyle('display','block');if(b.gecko&&b.version<10900){var S=this.parts.dialog;S.setStyle('position','absolute');setTimeout(function(){S.setStyle('position','fixed');},0);}this.resize(this._.contentSize&&this._.contentSize.width||R.width||R.minWidth,this._.contentSize&&this._.contentSize.height||R.height||R.minHeight);this.reset();this.selectPage(this.definition.contents[0].id);if(a.dialog._.currentZIndex===null)a.dialog._.currentZIndex=this._.editor.config.baseFloatZIndex;this._.element.getFirst().setStyle('z-index',a.dialog._.currentZIndex+=10);if(a.dialog._.currentTop===null){a.dialog._.currentTop=this;this._.parentDialog=null;G(this._.editor);}else{this._.parentDialog=a.dialog._.currentTop;var T=this._.parentDialog.getElement().getFirst();T.$.style.zIndex-=Math.floor(this._.editor.config.baseFloatZIndex/2);a.dialog._.currentTop=this;}Q.on('keydown',K);Q.on(b.opera?'keypress':'keyup',L);this._.hasFocus=false;e.setTimeout(function(){this.layout();this.parts.dialog.setStyle('visibility','');this.fireOnce('load',{});k.fire('ready',this);this.fire('show',{});this._.editor.fire('dialogShow',this);this.foreach(function(U){U.setInitValue&&U.setInitValue();});},100,this);},layout:function(){var S=this;var Q=a.document.getWindow().getViewPaneSize(),R=S.getSize();S.move(S._.moved?S._.position.x:(Q.width-R.width)/2,S._.moved?S._.position.y:(Q.height-R.height)/2);},foreach:function(Q){var T=this;for(var R in T._.contents)for(var S in T._.contents[R])Q.call(T,T._.contents[R][S]);return T;},reset:(function(){var Q=function(R){if(R.reset)R.reset(1);};return function(){this.foreach(Q);
+return this;};})(),setupContent:function(){var Q=arguments;this.foreach(function(R){if(R.setup)R.setup.apply(R,Q);});},commitContent:function(){var Q=arguments;this.foreach(function(R){if(c&&this._.currentFocusIndex==R.focusIndex)R.getInputElement().$.blur();if(R.commit)R.commit.apply(R,Q);});},hide:function(){if(!this.parts.dialog.isVisible())return;this.fire('hide',{});this._.editor.fire('dialogHide',this);this.selectPage(this._.tabIdList[0]);var Q=this._.element;Q.setStyle('display','none');this.parts.dialog.setStyle('visibility','hidden');N(this);while(a.dialog._.currentTop!=this)a.dialog._.currentTop.hide();if(!this._.parentDialog)H();else{var R=this._.parentDialog.getElement().getFirst();R.setStyle('z-index',parseInt(R.$.style.zIndex,10)+Math.floor(this._.editor.config.baseFloatZIndex/2));}a.dialog._.currentTop=this._.parentDialog;if(!this._.parentDialog){a.dialog._.currentZIndex=null;Q.removeListener('keydown',K);Q.removeListener(b.opera?'keypress':'keyup',L);var S=this._.editor;S.focus();if(S.mode=='wysiwyg'&&c){var T=S.getSelection();T&&T.unlock(true);}}else a.dialog._.currentZIndex-=10;delete this._.parentDialog;this.foreach(function(U){U.resetInitValue&&U.resetInitValue();});},addPage:function(Q){var ac=this;var R=[],S=Q.label?' title="'+e.htmlEncode(Q.label)+'"':'',T=Q.elements,U=a.dialog._.uiElementBuilders.vbox.build(ac,{type:'vbox',className:'cke_dialog_page_contents',children:Q.elements,expand:!!Q.expand,padding:Q.padding,style:Q.style||'width: 100%;height:100%'},R),V=h.createFromHtml(R.join(''));V.setAttribute('role','tabpanel');var W=b,X='cke_'+Q.id+'_'+e.getNextNumber(),Y=h.createFromHtml(['<a class="cke_dialog_tab"',ac._.pageCount>0?' cke_last':'cke_first',S,!!Q.hidden?' style="display:none"':'',' id="',X,'"',W.gecko&&W.version>=10900&&!W.hc?'':' href="javascript:void(0)"',' tabIndex="-1"',' hidefocus="true"',' role="tab">',Q.label,'</a>'].join(''));V.setAttribute('aria-labelledby',X);ac._.tabs[Q.id]=[Y,V];ac._.tabIdList.push(Q.id);!Q.hidden&&ac._.pageCount++;ac._.lastTab=Y;ac.updateStyle();var Z=ac._.contents[Q.id]={},aa,ab=U.getChild();while(aa=ab.shift()){Z[aa.id]=aa;if(typeof aa.getChild=='function')ab.push.apply(ab,aa.getChild());}V.setAttribute('name',Q.id);V.appendTo(ac.parts.contents);Y.unselectable();ac.parts.tabs.append(Y);if(Q.accessKey){M(ac,ac,'CTRL+'+Q.accessKey,P,O);ac._.accessKeyMap['CTRL+'+Q.accessKey]=Q.id;}},selectPage:function(Q){if(this._.currentTabId==Q)return;if(this.fire('selectPage',{page:Q,currentPage:this._.currentTabId})===true)return;
+for(var R in this._.tabs){var S=this._.tabs[R][0],T=this._.tabs[R][1];if(R!=Q){S.removeClass('cke_dialog_tab_selected');T.hide();}T.setAttribute('aria-hidden',R!=Q);}var U=this._.tabs[Q];U[0].addClass('cke_dialog_tab_selected');if(b.ie6Compat||b.ie7Compat){q(U[1]);U[1].show();setTimeout(function(){q(U[1],1);},0);}else U[1].show();this._.currentTabId=Q;this._.currentTabIndex=e.indexOf(this._.tabIdList,Q);},updateStyle:function(){this.parts.dialog[(this._.pageCount===1?'add':'remove')+'Class']('cke_single_page');},hidePage:function(Q){var S=this;var R=S._.tabs[Q]&&S._.tabs[Q][0];if(!R||S._.pageCount==1||!R.isVisible())return;else if(Q==S._.currentTabId)S.selectPage(o.call(S));R.hide();S._.pageCount--;S.updateStyle();},showPage:function(Q){var S=this;var R=S._.tabs[Q]&&S._.tabs[Q][0];if(!R)return;R.show();S._.pageCount++;S.updateStyle();},getElement:function(){return this._.element;},getName:function(){return this._.name;},getContentElement:function(Q,R){var S=this._.contents[Q];return S&&S[R];},getValueOf:function(Q,R){return this.getContentElement(Q,R).getValue();},setValueOf:function(Q,R,S){return this.getContentElement(Q,R).setValue(S);},getButton:function(Q){return this._.buttons[Q];},click:function(Q){return this._.buttons[Q].click();},disableButton:function(Q){return this._.buttons[Q].disable();},enableButton:function(Q){return this._.buttons[Q].enable();},getPageCount:function(){return this._.pageCount;},getParentEditor:function(){return this._.editor;},getSelectedElement:function(){return this.getParentEditor().getSelection().getSelectedElement();},addFocusable:function(Q,R){var T=this;if(typeof R=='undefined'){R=T._.focusList.length;T._.focusList.push(new t(T,Q,R));}else{T._.focusList.splice(R,0,new t(T,Q,R));for(var S=R+1;S<T._.focusList.length;S++)T._.focusList[S].focusIndex++;}}};e.extend(a.dialog,{add:function(Q,R){if(!this._.dialogDefinitions[Q]||typeof R=='function')this._.dialogDefinitions[Q]=R;},exists:function(Q){return!!this._.dialogDefinitions[Q];},getCurrent:function(){return a.dialog._.currentTop;},okButton:(function(){var Q=function(R,S){S=S||{};return e.extend({id:'ok',type:'button',label:R.lang.common.ok,'class':'cke_dialog_ui_button_ok',onClick:function(T){var U=T.data.dialog;if(U.fire('ok',{hide:true}).hide!==false)U.hide();}},S,true);};Q.type='button';Q.override=function(R){return e.extend(function(S){return Q(S,R);},{type:'button'},true);};return Q;})(),cancelButton:(function(){var Q=function(R,S){S=S||{};return e.extend({id:'cancel',type:'button',label:R.lang.common.cancel,'class':'cke_dialog_ui_button_cancel',onClick:function(T){var U=T.data.dialog;
+if(U.fire('cancel',{hide:true}).hide!==false)U.hide();}},S,true);};Q.type='button';Q.override=function(R){return e.extend(function(S){return Q(S,R);},{type:'button'},true);};return Q;})(),addUIElement:function(Q,R){this._.uiElementBuilders[Q]=R;}});a.dialog._={uiElementBuilders:{},dialogDefinitions:{},currentTop:null,currentZIndex:null};a.event.implementOn(a.dialog);a.event.implementOn(a.dialog.prototype,true);var u={resizable:3,minWidth:600,minHeight:400,buttons:[a.dialog.okButton,a.dialog.cancelButton]},v=function(Q,R,S){for(var T=0,U;U=Q[T];T++){if(U.id==R)return U;if(S&&U[S]){var V=v(U[S],R,S);if(V)return V;}}return null;},w=function(Q,R,S,T,U){if(S){for(var V=0,W;W=Q[V];V++){if(W.id==S){Q.splice(V,0,R);return R;}if(T&&W[T]){var X=w(W[T],R,S,T,true);if(X)return X;}}if(U)return null;}Q.push(R);return R;},x=function(Q,R,S){for(var T=0,U;U=Q[T];T++){if(U.id==R)return Q.splice(T,1);if(S&&U[S]){var V=x(U[S],R,S);if(V)return V;}}return null;},y=function(Q,R){this.dialog=Q;var S=R.contents;for(var T=0,U;U=S[T];T++)S[T]=U&&new z(Q,U);e.extend(this,R);};y.prototype={getContents:function(Q){return v(this.contents,Q);},getButton:function(Q){return v(this.buttons,Q);},addContents:function(Q,R){return w(this.contents,Q,R);},addButton:function(Q,R){return w(this.buttons,Q,R);},removeContents:function(Q){x(this.contents,Q);},removeButton:function(Q){x(this.buttons,Q);}};function z(Q,R){this._={dialog:Q};e.extend(this,R);};z.prototype={get:function(Q){return v(this.elements,Q,'children');},add:function(Q,R){return w(this.elements,Q,R,'children');},remove:function(Q){x(this.elements,Q,'children');}};function A(Q){var R=null,S=null,T=Q.getElement().getFirst(),U=Q.getParentEditor(),V=U.config.dialog_magnetDistance,W=U.skin.margins||[0,0,0,0];if(typeof V=='undefined')V=20;function X(Z){var aa=Q.getSize(),ab=a.document.getWindow().getViewPaneSize(),ac=Z.data.$.screenX,ad=Z.data.$.screenY,ae=ac-R.x,af=ad-R.y,ag,ah;R={x:ac,y:ad};S.x+=ae;S.y+=af;if(S.x+W[3]<V)ag=-W[3];else if(S.x-W[1]>ab.width-aa.width-V)ag=ab.width-aa.width+(U.lang.dir=='rtl'?0:W[1]);else ag=S.x;if(S.y+W[0]<V)ah=-W[0];else if(S.y-W[2]>ab.height-aa.height-V)ah=ab.height-aa.height+W[2];else ah=S.y;Q.move(ag,ah,1);Z.data.preventDefault();};function Y(Z){a.document.removeListener('mousemove',X);a.document.removeListener('mouseup',Y);if(b.ie6Compat){var aa=E.getChild(0).getFrameDocument();aa.removeListener('mousemove',X);aa.removeListener('mouseup',Y);}};Q.parts.title.on('mousedown',function(Z){R={x:Z.data.$.screenX,y:Z.data.$.screenY};
+a.document.on('mousemove',X);a.document.on('mouseup',Y);S=Q.getPosition();if(b.ie6Compat){var aa=E.getChild(0).getFrameDocument();aa.on('mousemove',X);aa.on('mouseup',Y);}Z.data.preventDefault();},Q);};function B(Q){var R=Q.definition,S=R.resizable;if(S==0)return;var T=Q.getParentEditor(),U,V,W,X,Y,Z,aa=e.addFunction(function(ad){Y=Q.getSize();var ae=Q.parts.contents,af=ae.$.getElementsByTagName('iframe').length;if(af){Z=h.createFromHtml('<div class="cke_dialog_resize_cover" style="height: 100%; position: absolute; width: 100%;"></div>');ae.append(Z);}V=Y.height-Q.parts.contents.getSize('height',!(b.gecko||b.opera||c&&b.quirks));U=Y.width-Q.parts.contents.getSize('width',1);X={x:ad.screenX,y:ad.screenY};W=a.document.getWindow().getViewPaneSize();a.document.on('mousemove',ab);a.document.on('mouseup',ac);if(b.ie6Compat){var ag=E.getChild(0).getFrameDocument();ag.on('mousemove',ab);ag.on('mouseup',ac);}ad.preventDefault&&ad.preventDefault();});Q.on('load',function(){var ad='';if(S==1)ad=' cke_resizer_horizontal';else if(S==2)ad=' cke_resizer_vertical';var ae=h.createFromHtml('<div class="cke_resizer'+ad+' cke_resizer_'+T.lang.dir+'"'+' title="'+e.htmlEncode(T.lang.resize)+'"'+' onmousedown="CKEDITOR.tools.callFunction('+aa+', event )"></div>');Q.parts.footer.append(ae,1);});T.on('destroy',function(){e.removeFunction(aa);});function ab(ad){var ae=T.lang.dir=='rtl',af=(ad.data.$.screenX-X.x)*(ae?-1:1),ag=ad.data.$.screenY-X.y,ah=Y.width,ai=Y.height,aj=ah+af*(Q._.moved?1:2),ak=ai+ag*(Q._.moved?1:2),al=Q._.element.getFirst(),am=ae&&al.getComputedStyle('right'),an=Q.getPosition();if(an.y+ak>W.height)ak=W.height-an.y;if((ae?am:an.x)+aj>W.width)aj=W.width-(ae?am:an.x);if(S==1||S==3)ah=Math.max(R.minWidth||0,aj-U);if(S==2||S==3)ai=Math.max(R.minHeight||0,ak-V);Q.resize(ah,ai);if(!Q._.moved)Q.layout();ad.data.preventDefault();};function ac(){a.document.removeListener('mouseup',ac);a.document.removeListener('mousemove',ab);if(Z){Z.remove();Z=null;}if(b.ie6Compat){var ad=E.getChild(0).getFrameDocument();ad.removeListener('mouseup',ac);ad.removeListener('mousemove',ab);}};};var C,D={},E;function F(Q){Q.data.preventDefault(1);};function G(Q){var R=a.document.getWindow(),S=Q.config,T=S.dialog_backgroundCoverColor||'white',U=S.dialog_backgroundCoverOpacity,V=S.baseFloatZIndex,W=e.genKey(T,U,V),X=D[W];if(!X){var Y=['<div tabIndex="-1" style="position: ',b.ie6Compat?'absolute':'fixed','; z-index: ',V,'; top: 0px; left: 0px; ',!b.ie6Compat?'background-color: '+T:'','" class="cke_dialog_background_cover">'];
+if(b.ie6Compat){var Z=b.isCustomDomain(),aa="<html><body style=\\'background-color:"+T+";\\'></body></html>";Y.push('<iframe hidefocus="true" frameborder="0" id="cke_dialog_background_iframe" src="javascript:');Y.push('void((function(){document.open();'+(Z?"document.domain='"+document.domain+"';":'')+"document.write( '"+aa+"' );"+'document.close();'+'})())');Y.push('" style="position:absolute;left:0;top:0;width:100%;height: 100%;progid:DXImageTransform.Microsoft.Alpha(opacity=0)"></iframe>');}Y.push('</div>');X=h.createFromHtml(Y.join(''));X.setOpacity(U!=undefined?U:0.5);X.on('keydown',F);X.on('keypress',F);X.on('keyup',F);X.appendTo(a.document.getBody());D[W]=X;}else X.show();E=X;var ab=function(){var ae=R.getViewPaneSize();X.setStyles({width:ae.width+'px',height:ae.height+'px'});},ac=function(){var ae=R.getScrollPosition(),af=a.dialog._.currentTop;X.setStyles({left:ae.x+'px',top:ae.y+'px'});if(af)do{var ag=af.getPosition();af.move(ag.x,ag.y);}while(af=af._.parentDialog)};C=ab;R.on('resize',ab);ab();if(!(b.mac&&b.webkit))X.focus();if(b.ie6Compat){var ad=function(){ac();arguments.callee.prevScrollHandler.apply(this,arguments);};R.$.setTimeout(function(){ad.prevScrollHandler=window.onscroll||(function(){});window.onscroll=ad;},0);ac();}};function H(){if(!E)return;var Q=a.document.getWindow();E.hide();Q.removeListener('resize',C);if(b.ie6Compat)Q.$.setTimeout(function(){var R=window.onscroll&&window.onscroll.prevScrollHandler;window.onscroll=R||null;},0);C=null;};function I(){for(var Q in D)D[Q].remove();D={};};var J={},K=function(Q){var R=Q.data.$.ctrlKey||Q.data.$.metaKey,S=Q.data.$.altKey,T=Q.data.$.shiftKey,U=String.fromCharCode(Q.data.$.keyCode),V=J[(R?'CTRL+':'')+(S?'ALT+':'')+(T?'SHIFT+':'')+U];if(!V||!V.length)return;V=V[V.length-1];V.keydown&&V.keydown.call(V.uiElement,V.dialog,V.key);Q.data.preventDefault();},L=function(Q){var R=Q.data.$.ctrlKey||Q.data.$.metaKey,S=Q.data.$.altKey,T=Q.data.$.shiftKey,U=String.fromCharCode(Q.data.$.keyCode),V=J[(R?'CTRL+':'')+(S?'ALT+':'')+(T?'SHIFT+':'')+U];if(!V||!V.length)return;V=V[V.length-1];if(V.keyup){V.keyup.call(V.uiElement,V.dialog,V.key);Q.data.preventDefault();}},M=function(Q,R,S,T,U){var V=J[S]||(J[S]=[]);V.push({uiElement:Q,dialog:R,key:S,keyup:U||Q.accessKeyUp,keydown:T||Q.accessKeyDown});},N=function(Q){for(var R in J){var S=J[R];for(var T=S.length-1;T>=0;T--){if(S[T].dialog==Q||S[T].uiElement==Q)S.splice(T,1);}if(S.length===0)delete J[R];}},O=function(Q,R){if(Q._.accessKeyMap[R])Q.selectPage(Q._.accessKeyMap[R]);
+},P=function(Q,R){};(function(){k.dialog={uiElement:function(Q,R,S,T,U,V,W){if(arguments.length<4)return;var X=(T.call?T(R):T)||'div',Y=['<',X,' '],Z=(U&&U.call?U(R):U)||{},aa=(V&&V.call?V(R):V)||{},ab=(W&&W.call?W.call(this,Q,R):W)||'',ac=this.domId=aa.id||e.getNextId()+'_uiElement',ad=this.id=R.id,ae;aa.id=ac;var af={};if(R.type)af['cke_dialog_ui_'+R.type]=1;if(R.className)af[R.className]=1;if(R.disabled)af.cke_disabled=1;var ag=aa['class']&&aa['class'].split?aa['class'].split(' '):[];for(ae=0;ae<ag.length;ae++){if(ag[ae])af[ag[ae]]=1;}var ah=[];for(ae in af)ah.push(ae);aa['class']=ah.join(' ');if(R.title)aa.title=R.title;var ai=(R.style||'').split(';');if(R.align){var aj=R.align;Z['margin-left']=aj=='left'?0:'auto';Z['margin-right']=aj=='right'?0:'auto';}for(ae in Z)ai.push(ae+':'+Z[ae]);if(R.hidden)ai.push('display:none');for(ae=ai.length-1;ae>=0;ae--){if(ai[ae]==='')ai.splice(ae,1);}if(ai.length>0)aa.style=(aa.style?aa.style+'; ':'')+ai.join('; ');for(ae in aa)Y.push(ae+'="'+e.htmlEncode(aa[ae])+'" ');Y.push('>',ab,'</',X,'>');S.push(Y.join(''));(this._||(this._={})).dialog=Q;if(typeof R.isChanged=='boolean')this.isChanged=function(){return R.isChanged;};if(typeof R.isChanged=='function')this.isChanged=R.isChanged;if(typeof R.setValue=='function')this.setValue=e.override(this.setValue,function(al){return function(am){al.call(this,R.setValue.call(this,am));};});if(typeof R.getValue=='function')this.getValue=e.override(this.getValue,function(al){return function(){return R.getValue.call(this,al.call(this));};});a.event.implementOn(this);this.registerEvents(R);if(this.accessKeyUp&&this.accessKeyDown&&R.accessKey)M(this,Q,'CTRL+'+R.accessKey);var ak=this;Q.on('load',function(){var al=ak.getInputElement();if(al){var am=ak.type in {checkbox:1,ratio:1}&&c&&b.version<8?'cke_dialog_ui_focused':'';al.on('focus',function(){Q._.tabBarMode=false;Q._.hasFocus=true;ak.fire('focus');am&&this.addClass(am);});al.on('blur',function(){ak.fire('blur');am&&this.removeClass(am);});}});if(this.keyboardFocusable){this.tabIndex=R.tabIndex||0;this.focusIndex=Q._.focusList.push(this)-1;this.on('focus',function(){Q._.currentFocusIndex=ak.focusIndex;});}e.extend(this,R);},hbox:function(Q,R,S,T,U){if(arguments.length<4)return;this._||(this._={});var V=this._.children=R,W=U&&U.widths||null,X=U&&U.height||null,Y={},Z,aa=function(){var ac=['<tbody><tr class="cke_dialog_ui_hbox">'];for(Z=0;Z<S.length;Z++){var ad='cke_dialog_ui_hbox_child',ae=[];if(Z===0)ad='cke_dialog_ui_hbox_first';if(Z==S.length-1)ad='cke_dialog_ui_hbox_last';
+ac.push('<td class="',ad,'" role="presentation" ');if(W){if(W[Z])ae.push('width:'+m(W[Z]));}else ae.push('width:'+Math.floor(100/S.length)+'%');if(X)ae.push('height:'+m(X));if(U&&U.padding!=undefined)ae.push('padding:'+m(U.padding));if(c&&b.quirks&&V[Z].align)ae.push('text-align:'+V[Z].align);if(ae.length>0)ac.push('style="'+ae.join('; ')+'" ');ac.push('>',S[Z],'</td>');}ac.push('</tr></tbody>');return ac.join('');},ab={role:'presentation'};U&&U.align&&(ab.align=U.align);k.dialog.uiElement.call(this,Q,U||{type:'hbox'},T,'table',Y,ab,aa);},vbox:function(Q,R,S,T,U){if(arguments.length<3)return;this._||(this._={});var V=this._.children=R,W=U&&U.width||null,X=U&&U.heights||null,Y=function(){var Z=['<table role="presentation" cellspacing="0" border="0" '];Z.push('style="');if(U&&U.expand)Z.push('height:100%;');Z.push('width:'+m(W||'100%'),';');Z.push('"');Z.push('align="',e.htmlEncode(U&&U.align||(Q.getParentEditor().lang.dir=='ltr'?'left':'right')),'" ');Z.push('><tbody>');for(var aa=0;aa<S.length;aa++){var ab=[];Z.push('<tr><td role="presentation" ');if(W)ab.push('width:'+m(W||'100%'));if(X)ab.push('height:'+m(X[aa]));else if(U&&U.expand)ab.push('height:'+Math.floor(100/S.length)+'%');if(U&&U.padding!=undefined)ab.push('padding:'+m(U.padding));if(c&&b.quirks&&V[aa].align)ab.push('text-align:'+V[aa].align);if(ab.length>0)Z.push('style="',ab.join('; '),'" ');Z.push(' class="cke_dialog_ui_vbox_child">',S[aa],'</td></tr>');}Z.push('</tbody></table>');return Z.join('');};k.dialog.uiElement.call(this,Q,U||{type:'vbox'},T,'div',null,{role:'presentation'},Y);}};})();k.dialog.uiElement.prototype={getElement:function(){return a.document.getById(this.domId);},getInputElement:function(){return this.getElement();},getDialog:function(){return this._.dialog;},setValue:function(Q,R){this.getInputElement().setValue(Q);!R&&this.fire('change',{value:Q});return this;},getValue:function(){return this.getInputElement().getValue();},isChanged:function(){return false;},selectParentTab:function(){var T=this;var Q=T.getInputElement(),R=Q,S;while((R=R.getParent())&&R.$.className.search('cke_dialog_page_contents')==-1){}if(!R)return T;S=R.getAttribute('name');if(T._.dialog._.currentTabId!=S)T._.dialog.selectPage(S);return T;},focus:function(){this.selectParentTab().getInputElement().focus();return this;},registerEvents:function(Q){var R=/^on([A-Z]\w+)/,S,T=function(V,W,X,Y){W.on('load',function(){V.getInputElement().on(X,Y,V);});};for(var U in Q){if(!(S=U.match(R)))continue;if(this.eventProcessors[U])this.eventProcessors[U].call(this,this._.dialog,Q[U]);
+else T(this,this._.dialog,S[1].toLowerCase(),Q[U]);}return this;},eventProcessors:{onLoad:function(Q,R){Q.on('load',R,this);},onShow:function(Q,R){Q.on('show',R,this);},onHide:function(Q,R){Q.on('hide',R,this);}},accessKeyDown:function(Q,R){this.focus();},accessKeyUp:function(Q,R){},disable:function(){var Q=this.getElement(),R=this.getInputElement();R.setAttribute('disabled','true');Q.addClass('cke_disabled');},enable:function(){var Q=this.getElement(),R=this.getInputElement();R.removeAttribute('disabled');Q.removeClass('cke_disabled');},isEnabled:function(){return!this.getElement().hasClass('cke_disabled');},isVisible:function(){return this.getInputElement().isVisible();},isFocusable:function(){if(!this.isEnabled()||!this.isVisible())return false;return true;}};k.dialog.hbox.prototype=e.extend(new k.dialog.uiElement(),{getChild:function(Q){var R=this;if(arguments.length<1)return R._.children.concat();if(!Q.splice)Q=[Q];if(Q.length<2)return R._.children[Q[0]];else return R._.children[Q[0]]&&R._.children[Q[0]].getChild?R._.children[Q[0]].getChild(Q.slice(1,Q.length)):null;}},true);k.dialog.vbox.prototype=new k.dialog.hbox();(function(){var Q={build:function(R,S,T){var U=S.children,V,W=[],X=[];for(var Y=0;Y<U.length&&(V=U[Y]);Y++){var Z=[];W.push(Z);X.push(a.dialog._.uiElementBuilders[V.type].build(R,V,Z));}return new k.dialog[S.type](R,X,W,T,S);}};a.dialog.addUIElement('hbox',Q);a.dialog.addUIElement('vbox',Q);})();a.dialogCommand=function(Q){this.dialogName=Q;};a.dialogCommand.prototype={exec:function(Q){b.opera?e.setTimeout(function(){Q.openDialog(this.dialogName);},0,this):Q.openDialog(this.dialogName);},canUndo:false,editorFocus:c||b.webkit};(function(){var Q=/^([a]|[^a])+$/,R=/^\d*$/,S=/^\d*(?:\.\d+)?$/,T=/^(((\d*(\.\d+))|(\d*))(px|\%)?)?$/,U=/^(((\d*(\.\d+))|(\d*))(px|em|ex|in|cm|mm|pt|pc|\%)?)?$/i,V=/^(\s*[\w-]+\s*:\s*[^:;]+(?:;|$))*$/;a.VALIDATE_OR=1;a.VALIDATE_AND=2;a.dialog.validate={functions:function(){var W=arguments;return function(){var X=this&&this.getValue?this.getValue():W[0],Y=undefined,Z=2,aa=[],ab;for(ab=0;ab<W.length;ab++){if(typeof W[ab]=='function')aa.push(W[ab]);else break;}if(ab<W.length&&typeof W[ab]=='string'){Y=W[ab];ab++;}if(ab<W.length&&typeof W[ab]=='number')Z=W[ab];var ac=Z==2?true:false;for(ab=0;ab<aa.length;ab++){if(Z==2)ac=ac&&aa[ab](X);else ac=ac||aa[ab](X);}return!ac?Y:true;};},regex:function(W,X){return function(){var Y=this&&this.getValue?this.getValue():arguments[0];return!W.test(Y)?X:true;};},notEmpty:function(W){return this.regex(Q,W);
+},integer:function(W){return this.regex(R,W);},number:function(W){return this.regex(S,W);},cssLength:function(W){return this.functions(function(X){return U.test(e.trim(X));},W);},htmlLength:function(W){return this.functions(function(X){return T.test(e.trim(X));},W);},inlineStyle:function(W){return this.functions(function(X){return V.test(e.trim(X));},W);},equals:function(W,X){return this.functions(function(Y){return Y==W;},X);},notEqual:function(W,X){return this.functions(function(Y){return Y!=W;},X);}};a.on('instanceDestroyed',function(W){if(e.isEmpty(a.instances)){var X;while(X=a.dialog._.currentTop)X.hide();I();}var Y=W.editor._.storedDialogs;for(var Z in Y)Y[Z].destroy();});})();e.extend(a.editor.prototype,{openDialog:function(Q,R){if(this.mode=='wysiwyg'&&c){var S=this.getSelection();S&&S.lock();}var T=a.dialog._.dialogDefinitions[Q],U=this.skin.dialog;if(a.dialog._.currentTop===null)G(this);if(typeof T=='function'&&U._isLoaded){var V=this._.storedDialogs||(this._.storedDialogs={}),W=V[Q]||(V[Q]=new a.dialog(this,Q));R&&R.call(W,W);W.show();return W;}else if(T=='failed'){H();throw new Error('[CKEDITOR.dialog.openDialog] Dialog "'+Q+'" failed when loading definition.');}var X=this;function Y(aa){var ab=a.dialog._.dialogDefinitions[Q],ac=X.skin.dialog;if(!ac._isLoaded||Z&&typeof aa=='undefined')return;if(typeof ab!='function')a.dialog._.dialogDefinitions[Q]='failed';X.openDialog(Q,R);};if(typeof T=='string'){var Z=1;a.scriptLoader.load(a.getUrl(T),Y,null,0,1);}a.skins.load(this,'dialog',Y);return null;}});})();j.add('dialog',{requires:['dialogui']});j.add('styles',{requires:['selection'],init:function(m){m.on('contentDom',function(){m.document.setCustomData('cke_includeReadonly',!m.config.disableReadonlyStyling);});}});a.editor.prototype.attachStyleStateChange=function(m,n){var o=this._.styleStateChangeCallbacks;if(!o){o=this._.styleStateChangeCallbacks=[];this.on('selectionChange',function(p){for(var q=0;q<o.length;q++){var r=o[q],s=r.style.checkActive(p.data.path)?1:2;r.fn.call(this,s);}});}o.push({style:m,fn:n});};a.STYLE_BLOCK=1;a.STYLE_INLINE=2;a.STYLE_OBJECT=3;(function(){var m={address:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1,p:1,pre:1,section:1,header:1,footer:1,nav:1,article:1,aside:1,figure:1,dialog:1,hgroup:1,time:1,meter:1,menu:1,command:1,keygen:1,output:1,progress:1,details:1,datagrid:1,datalist:1},n={a:1,embed:1,hr:1,img:1,li:1,object:1,ol:1,table:1,td:1,tr:1,th:1,ul:1,dl:1,dt:1,dd:1,form:1,audio:1,video:1},o=/\s*(?:;\s*|$)/,p=/#\((.+?)\)/g,q=d.walker.bookmark(0,1),r=d.walker.whitespaces(1);
+a.style=function(T,U){var W=this;if(U){T=e.clone(T);L(T.attributes,U);L(T.styles,U);}var V=W.element=T.element?typeof T.element=='string'?T.element.toLowerCase():T.element:'*';W.type=m[V]?1:n[V]?3:2;if(typeof W.element=='object')W.type=3;W._={definition:T};};a.style.prototype={apply:function(T){S.call(this,T,false);},remove:function(T){S.call(this,T,true);},applyToRange:function(T){var U=this;return(U.applyToRange=U.type==2?t:U.type==1?x:U.type==3?v:null).call(U,T);},removeFromRange:function(T){var U=this;return(U.removeFromRange=U.type==2?u:U.type==1?y:U.type==3?w:null).call(U,T);},applyToObject:function(T){K(T,this);},checkActive:function(T){var Y=this;switch(Y.type){case 1:return Y.checkElementRemovable(T.block||T.blockLimit,true);case 3:case 2:var U=T.elements;for(var V=0,W;V<U.length;V++){W=U[V];if(Y.type==2&&(W==T.block||W==T.blockLimit))continue;if(Y.type==3){var X=W.getName();if(!(typeof Y.element=='string'?X==Y.element:X in Y.element))continue;}if(Y.checkElementRemovable(W,true))return true;}}return false;},checkApplicable:function(T){switch(this.type){case 2:case 1:break;case 3:return T.lastElement.getAscendant(this.element,true);}return true;},checkElementMatch:function(T,U){var aa=this;var V=aa._.definition;if(!T||!V.ignoreReadonly&&T.isReadOnly())return false;var W,X=T.getName();if(typeof aa.element=='string'?X==aa.element:X in aa.element){if(!U&&!T.hasAttributes())return true;W=M(V);if(W._length){for(var Y in W){if(Y=='_length')continue;var Z=T.getAttribute(Y)||'';if(Y=='style'?R(W[Y],P(Z,false)):W[Y]==Z){if(!U)return true;}else if(U)return false;}if(U)return true;}else return true;}return false;},checkElementRemovable:function(T,U){if(this.checkElementMatch(T,U))return true;var V=N(this)[T.getName()];if(V){var W,X;if(!(W=V.attributes))return true;for(var Y=0;Y<W.length;Y++){X=W[Y][0];var Z=T.getAttribute(X);if(Z){var aa=W[Y][1];if(aa===null||typeof aa=='string'&&Z==aa||aa.test(Z))return true;}}}return false;},buildPreview:function(T){var U=this._.definition,V=[],W=U.element;if(W=='bdo')W='span';V=['<',W];var X=U.attributes;if(X)for(var Y in X)V.push(' ',Y,'="',X[Y],'"');var Z=a.style.getStyleText(U);if(Z)V.push(' style="',Z,'"');V.push('>',T||U.name,'</',W,'>');return V.join('');}};a.style.getStyleText=function(T){var U=T._ST;if(U)return U;U=T.styles;var V=T.attributes&&T.attributes.style||'',W='';if(V.length)V=V.replace(o,';');for(var X in U){var Y=U[X],Z=(X+':'+Y).replace(o,';');if(Y=='inherit')W+=Z;else V+=Z;}if(V.length)V=P(V);V+=W;return T._ST=V;
+};function s(T){var U,V;while(T=T.getParent()){if(T.getName()=='body')break;if(T.getAttribute('data-nostyle'))U=T;else if(!V){var W=T.getAttribute('contentEditable');if(W=='false')U=T;else if(W=='true')V=1;}}return U;};function t(T){var ay=this;var U=T.document;if(T.collapsed){var V=J(ay,U);T.insertNode(V);T.moveToPosition(V,2);return;}var W=ay.element,X=ay._.definition,Y,Z=X.ignoreReadonly,aa=Z||X.includeReadonly;if(aa==undefined)aa=U.getCustomData('cke_includeReadonly');var ab=f[W]||(Y=true,f.span);T.enlarge(1,1);T.trim();var ac=T.createBookmark(),ad=ac.startNode,ae=ac.endNode,af=ad,ag;if(!Z){var ah=s(ad),ai=s(ae);if(ah)af=ah.getNextSourceNode(true);if(ai)ae=ai;}if(af.getPosition(ae)==2)af=0;while(af){var aj=false;if(af.equals(ae)){af=null;aj=true;}else{var ak=af.type,al=ak==1?af.getName():null,am=al&&af.getAttribute('contentEditable')=='false',an=al&&af.getAttribute('data-nostyle');if(al&&af.data('cke-bookmark')){af=af.getNextSourceNode(true);continue;}if(!al||ab[al]&&!an&&(!am||aa)&&(af.getPosition(ae)|4|0|8)==4+0+8&&(!X.childRule||X.childRule(af))){var ao=af.getParent();if(ao&&((ao.getDtd()||f.span)[W]||Y)&&(!X.parentRule||X.parentRule(ao))){if(!ag&&(!al||!f.$removeEmpty[al]||(af.getPosition(ae)|4|0|8)==4+0+8)){ag=new d.range(U);ag.setStartBefore(af);}if(ak==3||am||ak==1&&!af.getChildCount()){var ap=af,aq;while((aj=!ap.getNext(q))&&(aq=ap.getParent(),ab[aq.getName()])&&(aq.getPosition(ad)|2|0|8)==2+0+8&&(!X.childRule||X.childRule(aq)))ap=aq;ag.setEndAfter(ap);}}else aj=true;}else aj=true;af=af.getNextSourceNode(an||am);}if(aj&&ag&&!ag.collapsed){var ar=J(ay,U),as=ar.hasAttributes(),at=ag.getCommonAncestor(),au={styles:{},attrs:{},blockedStyles:{},blockedAttrs:{}},av,aw,ax;while(ar&&at){if(at.getName()==W){for(av in X.attributes){if(au.blockedAttrs[av]||!(ax=at.getAttribute(aw)))continue;if(ar.getAttribute(av)==ax)au.attrs[av]=1;else au.blockedAttrs[av]=1;}for(aw in X.styles){if(au.blockedStyles[aw]||!(ax=at.getStyle(aw)))continue;if(ar.getStyle(aw)==ax)au.styles[aw]=1;else au.blockedStyles[aw]=1;}}at=at.getParent();}for(av in au.attrs)ar.removeAttribute(av);for(aw in au.styles)ar.removeStyle(aw);if(as&&!ar.hasAttributes())ar=null;if(ar){ag.extractContents().appendTo(ar);G(ay,ar);ag.insertNode(ar);ar.mergeSiblings();if(!c)ar.$.normalize();}else{ar=new h('span');ag.extractContents().appendTo(ar);ag.insertNode(ar);G(ay,ar);ar.remove(true);}ag=null;}}T.moveToBookmark(ac);T.shrink(2);};function u(T){T.enlarge(1,1);var U=T.createBookmark(),V=U.startNode;if(T.collapsed){var W=new d.elementPath(V.getParent()),X;
+for(var Y=0,Z;Y<W.elements.length&&(Z=W.elements[Y]);Y++){if(Z==W.block||Z==W.blockLimit)break;if(this.checkElementRemovable(Z)){var aa;if(T.collapsed&&(T.checkBoundaryOfElement(Z,2)||(aa=T.checkBoundaryOfElement(Z,1)))){X=Z;X.match=aa?'start':'end';}else{Z.mergeSiblings();if(Z.getName()==this.element)F(this,Z);else H(Z,N(this)[Z.getName()]);}}}if(X){var ab=V;for(Y=0;true;Y++){var ac=W.elements[Y];if(ac.equals(X))break;else if(ac.match)continue;else ac=ac.clone();ac.append(ab);ab=ac;}ab[X.match=='start'?'insertBefore':'insertAfter'](X);}}else{var ad=U.endNode,ae=this;function af(){var ai=new d.elementPath(V.getParent()),aj=new d.elementPath(ad.getParent()),ak=null,al=null;for(var am=0;am<ai.elements.length;am++){var an=ai.elements[am];if(an==ai.block||an==ai.blockLimit)break;if(ae.checkElementRemovable(an))ak=an;}for(am=0;am<aj.elements.length;am++){an=aj.elements[am];if(an==aj.block||an==aj.blockLimit)break;if(ae.checkElementRemovable(an))al=an;}if(al)ad.breakParent(al);if(ak)V.breakParent(ak);};af();var ag=V;while(!ag.equals(ad)){var ah=ag.getNextSourceNode();if(ag.type==1&&this.checkElementRemovable(ag)){if(ag.getName()==this.element)F(this,ag);else H(ag,N(this)[ag.getName()]);if(ah.type==1&&ah.contains(V)){af();ah=V.getNext();}}ag=ah;}}T.moveToBookmark(U);};function v(T){var U=T.getCommonAncestor(true,true),V=U.getAscendant(this.element,true);V&&!V.isReadOnly()&&K(V,this);};function w(T){var U=T.getCommonAncestor(true,true),V=U.getAscendant(this.element,true);if(!V)return;var W=this,X=W._.definition,Y=X.attributes;if(Y)for(var Z in Y)V.removeAttribute(Z,Y[Z]);if(X.styles)for(var aa in X.styles){if(!X.styles.hasOwnProperty(aa))continue;V.removeStyle(aa);}};function x(T){var U=T.createBookmark(true),V=T.createIterator();V.enforceRealBlocks=true;if(this._.enterMode)V.enlargeBr=this._.enterMode!=2;var W,X=T.document,Y;while(W=V.getNextParagraph()){if(!W.isReadOnly()){var Z=J(this,X,W);z(W,Z);}}T.moveToBookmark(U);};function y(T){var Y=this;var U=T.createBookmark(1),V=T.createIterator();V.enforceRealBlocks=true;V.enlargeBr=Y._.enterMode!=2;var W;while(W=V.getNextParagraph()){if(Y.checkElementRemovable(W))if(W.is('pre')){var X=Y._.enterMode==2?null:T.document.createElement(Y._.enterMode==1?'p':'div');X&&W.copyAttributes(X);z(W,X);}else F(Y,W,1);}T.moveToBookmark(U);};function z(T,U){var V=!U;if(V){U=T.getDocument().createElement('div');T.copyAttributes(U);}var W=U&&U.is('pre'),X=T.is('pre'),Y=W&&!X,Z=!W&&X;if(Y)U=E(T,U);else if(Z)U=D(V?[T.getHtml()]:B(T),U);else T.moveChildren(U);
+U.replace(T);if(W)A(U);else if(V)I(U);};function A(T){var U;if(!((U=T.getPrevious(r))&&U.is&&U.is('pre')))return;var V=C(U.getHtml(),/\n$/,'')+'\n\n'+C(T.getHtml(),/^\n/,'');if(c)T.$.outerHTML='<pre>'+V+'</pre>';else T.setHtml(V);U.remove();};function B(T){var U=/(\S\s*)\n(?:\s|(<span[^>]+data-cke-bookmark.*?\/span>))*\n(?!$)/gi,V=T.getName(),W=C(T.getOuterHtml(),U,function(Y,Z,aa){return Z+'</pre>'+aa+'<pre>';}),X=[];W.replace(/<pre\b.*?>([\s\S]*?)<\/pre>/gi,function(Y,Z){X.push(Z);});return X;};function C(T,U,V){var W='',X='';T=T.replace(/(^<span[^>]+data-cke-bookmark.*?\/span>)|(<span[^>]+data-cke-bookmark.*?\/span>$)/gi,function(Y,Z,aa){Z&&(W=Z);aa&&(X=aa);return '';});return W+T.replace(U,V)+X;};function D(T,U){var V;if(T.length>1)V=new d.documentFragment(U.getDocument());for(var W=0;W<T.length;W++){var X=T[W];X=X.replace(/(\r\n|\r)/g,'\n');X=C(X,/^[ \t]*\n/,'');X=C(X,/\n$/,'');X=C(X,/^[ \t]+|[ \t]+$/g,function(Z,aa,ab){if(Z.length==1)return ' ';else if(!aa)return e.repeat(' ',Z.length-1)+' ';else return ' '+e.repeat(' ',Z.length-1);});X=X.replace(/\n/g,'<br>');X=X.replace(/[ \t]{2,}/g,function(Z){return e.repeat(' ',Z.length-1)+' ';});if(V){var Y=U.clone();Y.setHtml(X);V.append(Y);}else U.setHtml(X);}return V||U;};function E(T,U){var V=T.getBogus();V&&V.remove();var W=T.getHtml();W=C(W,/(?:^[ \t\n\r]+)|(?:[ \t\n\r]+$)/g,'');W=W.replace(/[ \t\r\n]*(<br[^>]*>)[ \t\r\n]*/gi,'$1');W=W.replace(/([ \t\n\r]+| )/g,' ');W=W.replace(/<br\b[^>]*>/gi,'\n');if(c){var X=T.getDocument().createElement('div');X.append(U);U.$.outerHTML='<pre>'+W+'</pre>';U.copyAttributes(X.getFirst());U=X.getFirst().remove();}else U.setHtml(W);return U;};function F(T,U){var V=T._.definition,W=V.attributes,X=V.styles,Y=N(T)[U.getName()],Z=e.isEmpty(W)&&e.isEmpty(X);for(var aa in W){if((aa=='class'||T._.definition.fullMatch)&&U.getAttribute(aa)!=O(aa,W[aa]))continue;Z=U.hasAttribute(aa);U.removeAttribute(aa);}for(var ab in X){if(T._.definition.fullMatch&&U.getStyle(ab)!=O(ab,X[ab],true))continue;Z=Z||!!U.getStyle(ab);U.removeStyle(ab);}H(U,Y,m[U.getName()]);if(Z)!f.$block[U.getName()]||T._.enterMode==2&&!U.hasAttributes()?I(U):U.renameNode(T._.enterMode==1?'p':'div');};function G(T,U){var V=T._.definition,W=V.attributes,X=V.styles,Y=N(T),Z=U.getElementsByTag(T.element);for(var aa=Z.count();--aa>=0;)F(T,Z.getItem(aa));for(var ab in Y){if(ab!=T.element){Z=U.getElementsByTag(ab);for(aa=Z.count()-1;aa>=0;aa--){var ac=Z.getItem(aa);H(ac,Y[ab]);}}}};function H(T,U,V){var W=U&&U.attributes;
+if(W)for(var X=0;X<W.length;X++){var Y=W[X][0],Z;if(Z=T.getAttribute(Y)){var aa=W[X][1];if(aa===null||aa.test&&aa.test(Z)||typeof aa=='string'&&Z==aa)T.removeAttribute(Y);}}if(!V)I(T);};function I(T){if(!T.hasAttributes())if(f.$block[T.getName()]){var U=T.getPrevious(r),V=T.getNext(r);if(U&&(U.type==3||!U.isBlockBoundary({br:1})))T.append('br',1);if(V&&(V.type==3||!V.isBlockBoundary({br:1})))T.append('br');T.remove(true);}else{var W=T.getFirst(),X=T.getLast();T.remove(true);if(W){W.type==1&&W.mergeSiblings();if(X&&!W.equals(X)&&X.type==1)X.mergeSiblings();}}};function J(T,U,V){var W,X=T._.definition,Y=T.element;if(Y=='*')Y='span';W=new h(Y,U);if(V)V.copyAttributes(W);W=K(W,T);if(U.getCustomData('doc_processing_style')&&W.hasAttribute('id'))W.removeAttribute('id');else U.setCustomData('doc_processing_style',1);return W;};function K(T,U){var V=U._.definition,W=V.attributes,X=a.style.getStyleText(V);if(W)for(var Y in W)T.setAttribute(Y,W[Y]);if(X)T.setAttribute('style',X);return T;};function L(T,U){for(var V in T)T[V]=T[V].replace(p,function(W,X){return U[X];});};function M(T){var U=T._AC;if(U)return U;U={};var V=0,W=T.attributes;if(W)for(var X in W){V++;U[X]=W[X];}var Y=a.style.getStyleText(T);if(Y){if(!U.style)V++;U.style=Y;}U._length=V;return T._AC=U;};function N(T){if(T._.overrides)return T._.overrides;var U=T._.overrides={},V=T._.definition.overrides;if(V){if(!e.isArray(V))V=[V];for(var W=0;W<V.length;W++){var X=V[W],Y,Z,aa;if(typeof X=='string')Y=X.toLowerCase();else{Y=X.element?X.element.toLowerCase():T.element;aa=X.attributes;}Z=U[Y]||(U[Y]={});if(aa){var ab=Z.attributes=Z.attributes||[];for(var ac in aa)ab.push([ac.toLowerCase(),aa[ac]]);}}}return U;};function O(T,U,V){var W=new h('span');W[V?'setStyle':'setAttribute'](T,U);return W[V?'getStyle':'getAttribute'](T);};function P(T,U){var V;if(U!==false){var W=new h('span');W.setAttribute('style',T);V=W.getAttribute('style')||'';}else V=T;V=V.replace(/(font-family:)(.*?)(?=;|$)/,function(X,Y,Z){var aa=Z.split(',');for(var ab=0;ab<aa.length;ab++)aa[ab]=e.trim(aa[ab].replace(/["']/g,''));return Y+aa.join(',');});return V.replace(/\s*([;:])\s*/,'$1').replace(/([^\s;])$/,'$1;').replace(/,\s+/g,',').replace(/\"/g,'').toLowerCase();};function Q(T){var U={};T.replace(/"/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(V,W,X){U[W]=X;});return U;};function R(T,U){typeof T=='string'&&(T=Q(T));typeof U=='string'&&(U=Q(U));for(var V in T){if(!(V in U&&(U[V]==T[V]||T[V]=='inherit'||U[V]=='inherit')))return false;
+}return true;};function S(T,U){var V=T.getSelection(),W=V.createBookmarks(1),X=V.getRanges(),Y=U?this.removeFromRange:this.applyToRange,Z,aa=X.createIterator();while(Z=aa.getNextRange())Y.call(this,Z);if(W.length==1&&W[0].collapsed){V.selectRanges(X);T.getById(W[0].startNode).remove();}else V.selectBookmarks(W);T.removeCustomData('doc_processing_style');};})();a.styleCommand=function(m){this.style=m;};a.styleCommand.prototype.exec=function(m){var o=this;m.focus();var n=m.document;if(n)if(o.state==2)o.style.apply(n);else if(o.state==1)o.style.remove(n);return!!n;};a.stylesSet=new a.resourceManager('','stylesSet');a.addStylesSet=e.bind(a.stylesSet.add,a.stylesSet);a.loadStylesSet=function(m,n,o){a.stylesSet.addExternal(m,n,'');a.stylesSet.load(m,o);};a.editor.prototype.getStylesSet=function(m){if(!this._.stylesDefinitions){var n=this,o=n.config.stylesCombo_stylesSet||n.config.stylesSet||'default';if(o instanceof Array){n._.stylesDefinitions=o;m(o);return;}var p=o.split(':'),q=p[0],r=p[1],s=j.registered.styles.path;a.stylesSet.addExternal(q,r?p.slice(1).join(':'):s+'styles/'+q+'.js','');a.stylesSet.load(q,function(t){n._.stylesDefinitions=t[q];m(n._.stylesDefinitions);});}else m(this._.stylesDefinitions);};j.add('domiterator');(function(){function m(s){var t=this;if(arguments.length<1)return;t.range=s;t.forceBrBreak=0;t.enlargeBr=1;t.enforceRealBlocks=0;t._||(t._={});};var n=/^[\r\n\t ]+$/,o=d.walker.bookmark(false,true),p=d.walker.whitespaces(true),q=function(s){return o(s)&&p(s);};function r(s,t,u){var v=s.getNextSourceNode(t,null,u);while(!o(v))v=v.getNextSourceNode(t,null,u);return v;};m.prototype={getNextParagraph:function(s){var S=this;var t,u,v,w,x,y;if(!S._.started){u=S.range.clone();u.shrink(1,true);w=u.endContainer.hasAscendant('pre',true)||u.startContainer.hasAscendant('pre',true);u.enlarge(S.forceBrBreak&&!w||!S.enlargeBr?3:2);if(!u.collapsed){var z=new d.walker(u.clone()),A=d.walker.bookmark(true,true);z.evaluator=A;S._.nextNode=z.next();z=new d.walker(u.clone());z.evaluator=A;var B=z.previous();S._.lastNode=B.getNextSourceNode(true);if(S._.lastNode&&S._.lastNode.type==3&&!e.trim(S._.lastNode.getText())&&S._.lastNode.getParent().isBlockBoundary()){var C=new d.range(u.document);C.moveToPosition(S._.lastNode,4);if(C.checkEndOfBlock()){var D=new d.elementPath(C.endContainer),E=D.block||D.blockLimit;S._.lastNode=E.getNextSourceNode(true);}}if(!S._.lastNode){S._.lastNode=S._.docEndMarker=u.document.createText('');S._.lastNode.insertAfter(B);}u=null;}S._.started=1;
+}var F=S._.nextNode;B=S._.lastNode;S._.nextNode=null;while(F){var G=0,H=F.hasAscendant('pre'),I=F.type!=1,J=0;if(!I){var K=F.getName();if(F.isBlockBoundary(S.forceBrBreak&&!H&&{br:1})){if(K=='br')I=1;else if(!u&&!F.getChildCount()&&K!='hr'){t=F;v=F.equals(B);break;}if(u){u.setEndAt(F,3);if(K!='br')S._.nextNode=F;}G=1;}else{if(F.getFirst()){if(!u){u=new d.range(S.range.document);u.setStartAt(F,3);}F=F.getFirst();continue;}I=1;}}else if(F.type==3)if(n.test(F.getText()))I=0;if(I&&!u){u=new d.range(S.range.document);u.setStartAt(F,3);}v=(!G||I)&&F.equals(B);if(u&&!G)while(!F.getNext(q)&&!v){var L=F.getParent();if(L.isBlockBoundary(S.forceBrBreak&&!H&&{br:1})){G=1;I=0;v=v||L.equals(B);u.setEndAt(L,2);break;}F=L;I=1;v=F.equals(B);J=1;}if(I)u.setEndAt(F,4);F=r(F,J,B);v=!F;if(v||G&&u)break;}if(!t){if(!u){S._.docEndMarker&&S._.docEndMarker.remove();S._.nextNode=null;return null;}var M=new d.elementPath(u.startContainer),N=M.blockLimit,O={div:1,th:1,td:1};t=M.block;if(!t&&!S.enforceRealBlocks&&O[N.getName()]&&u.checkStartOfBlock()&&u.checkEndOfBlock())t=N;else if(!t||S.enforceRealBlocks&&t.getName()=='li'){t=S.range.document.createElement(s||'p');u.extractContents().appendTo(t);t.trim();u.insertNode(t);x=y=true;}else if(t.getName()!='li'){if(!u.checkStartOfBlock()||!u.checkEndOfBlock()){t=t.clone(false);u.extractContents().appendTo(t);t.trim();var P=u.splitBlock();x=!P.wasStartOfBlock;y=!P.wasEndOfBlock;u.insertNode(t);}}else if(!v)S._.nextNode=t.equals(B)?null:r(u.getBoundaryNodes().endNode,1,B);}if(x){var Q=t.getPrevious();if(Q&&Q.type==1)if(Q.getName()=='br')Q.remove();else if(Q.getLast()&&Q.getLast().$.nodeName.toLowerCase()=='br')Q.getLast().remove();}if(y){var R=t.getLast();if(R&&R.type==1&&R.getName()=='br')if(c||R.getPrevious(o)||R.getNext(o))R.remove();}if(!S._.nextNode)S._.nextNode=v||t.equals(B)||!B?null:r(t,1,B);return t;}};d.range.prototype.createIterator=function(){return new m(this);};})();j.add('panelbutton',{requires:['button'],onLoad:function(){function m(n){var p=this;var o=p._;if(o.state==0)return;p.createPanel(n);if(o.on){o.panel.hide();return;}o.panel.showBlock(p._.id,p.document.getById(p._.id),4);};k.panelButton=e.createClass({base:k.button,$:function(n){var p=this;var o=n.panel;delete n.panel;p.base(n);p.document=o&&o.parent&&o.parent.getDocument()||a.document;o.block={attributes:o.attributes};p.hasArrow=true;p.click=m;p._={panelDefinition:o};},statics:{handler:{create:function(n){return new k.panelButton(n);}}},proto:{createPanel:function(n){var o=this._;
+if(o.panel)return;var p=this._.panelDefinition||{},q=this._.panelDefinition.block,r=p.parent||a.document.getBody(),s=this._.panel=new k.floatPanel(n,r,p),t=s.addBlock(o.id,q),u=this;s.onShow=function(){if(u.className)this.element.getFirst().addClass(u.className+'_panel');u.setState(1);o.on=1;if(u.onOpen)u.onOpen();};s.onHide=function(v){if(u.className)this.element.getFirst().removeClass(u.className+'_panel');u.setState(u.modes&&u.modes[n.mode]?2:0);o.on=0;if(!v&&u.onClose)u.onClose();};s.onEscape=function(){s.hide();u.document.getById(o.id).focus();};if(this.onBlock)this.onBlock(s,t);t.onHide=function(){o.on=0;u.setState(2);};}}});},beforeInit:function(m){m.ui.addHandler('panelbutton',k.panelButton.handler);}});a.UI_PANELBUTTON='panelbutton';j.add('floatpanel',{requires:['panel']});(function(){var m={},n=false;function o(p,q,r,s,t){var u=e.genKey(q.getUniqueId(),r.getUniqueId(),p.skinName,p.lang.dir,p.uiColor||'',s.css||'',t||''),v=m[u];if(!v){v=m[u]=new k.panel(q,s);v.element=r.append(h.createFromHtml(v.renderHtml(p),q));v.element.setStyles({display:'none',position:'absolute'});}return v;};k.floatPanel=e.createClass({$:function(p,q,r,s){r.forceIFrame=1;var t=q.getDocument(),u=o(p,t,q,r,s||0),v=u.element,w=v.getFirst().getFirst();v.disableContextMenu();this.element=v;this._={editor:p,panel:u,parentElement:q,definition:r,document:t,iframe:w,children:[],dir:p.lang.dir};p.on('mode',function(){this.hide();},this);},proto:{addBlock:function(p,q){return this._.panel.addBlock(p,q);},addListBlock:function(p,q){return this._.panel.addListBlock(p,q);},getBlock:function(p){return this._.panel.getBlock(p);},showBlock:function(p,q,r,s,t){var u=this._.panel,v=u.showBlock(p);this.allowBlur(false);n=1;this._.returnFocus=this._.editor.focusManager.hasFocus?this._.editor:new h(a.document.$.activeElement);var w=this.element,x=this._.iframe,y=this._.definition,z=q.getDocumentPosition(w.getDocument()),A=this._.dir=='rtl',B=z.x+(s||0),C=z.y+(t||0);if(A&&(r==1||r==4))B+=q.$.offsetWidth;else if(!A&&(r==2||r==3))B+=q.$.offsetWidth-1;if(r==3||r==4)C+=q.$.offsetHeight-1;this._.panel._.offsetParentId=q.getId();w.setStyles({top:C+'px',left:0,display:''});w.setOpacity(0);w.getFirst().removeStyle('width');if(!this._.blurSet){var D=c?x:new d.window(x.$.contentWindow);a.event.useCapture=true;D.on('blur',function(E){var G=this;if(!G.allowBlur())return;var F=E.data.getTarget();if(F.getName&&F.getName()!='iframe')return;if(G.visible&&!G._.activeChild&&!n){delete G._.returnFocus;G.hide();}},this);
+D.on('focus',function(){this._.focused=true;this.hideChild();this.allowBlur(true);},this);a.event.useCapture=false;this._.blurSet=1;}u.onEscape=e.bind(function(E){if(this.onEscape&&this.onEscape(E)===false)return false;},this);e.setTimeout(function(){var E=e.bind(function(){var F=w.getFirst();if(v.autoSize){var G=v.element.$;if(b.gecko||b.opera)G=G.parentNode;if(c)G=G.document.body;var H=G.scrollWidth;if(c&&b.quirks&&H>0)H+=(F.$.offsetWidth||0)-(F.$.clientWidth||0)+3;H+=4;F.setStyle('width',H+'px');v.element.addClass('cke_frameLoaded');var I=v.element.$.scrollHeight;if(c&&b.quirks&&I>0)I+=(F.$.offsetHeight||0)-(F.$.clientHeight||0)+3;F.setStyle('height',I+'px');u._.currentBlock.element.setStyle('display','none').removeStyle('display');}else F.removeStyle('height');if(A)B-=w.$.offsetWidth;w.setStyle('left',B+'px');var J=u.element,K=J.getWindow(),L=w.$.getBoundingClientRect(),M=K.getViewPaneSize(),N=L.width||L.right-L.left,O=L.height||L.bottom-L.top,P=A?L.right:M.width-L.left,Q=A?M.width-L.right:L.left;if(A){if(P<N)if(Q>N)B+=N;else if(M.width>N)B-=L.left;else B=B-L.right+M.width;}else if(P<N)if(Q>N)B-=N;else if(M.width>N)B=B-L.right+M.width;else B-=L.left;var R=M.height-L.top,S=L.top;if(R<O)if(S>O)C-=O;else if(M.height>O)C=C-L.bottom+M.height;else C-=L.top;if(c){var T=new h(w.$.offsetParent),U=T;if(U.getName()=='html')U=U.getDocument().getBody();if(U.getComputedStyle('direction')=='rtl')if(b.ie8Compat)B-=w.getDocument().getDocumentElement().$.scrollLeft*2;else B-=T.$.scrollWidth-T.$.clientWidth;}var V=w.getFirst(),W;if(W=V.getCustomData('activePanel'))W.onHide&&W.onHide.call(this,1);V.setCustomData('activePanel',this);w.setStyles({top:C+'px',left:B+'px'});w.setOpacity(1);},this);u.isLoaded?E():u.onLoad=E;e.setTimeout(function(){x.$.contentWindow.focus();this.allowBlur(true);},0,this);},b.air?200:0,this);this.visible=1;if(this.onShow)this.onShow.call(this);n=0;},hide:function(p){var r=this;if(r.visible&&(!r.onHide||r.onHide.call(r)!==true)){r.hideChild();b.gecko&&r._.iframe.getFrameDocument().$.activeElement.blur();r.element.setStyle('display','none');r.visible=0;r.element.getFirst().removeCustomData('activePanel');var q=p!==false&&r._.returnFocus;if(q){if(b.webkit&&q.type)q.getWindow().$.focus();q.focus();}}},allowBlur:function(p){var q=this._.panel;if(p!=undefined)q.allowBlur=p;return q.allowBlur;},showAsChild:function(p,q,r,s,t,u){if(this._.activeChild==p&&p._.panel._.offsetParentId==r.getId())return;this.hideChild();p.onHide=e.bind(function(){e.setTimeout(function(){if(!this._.focused)this.hide();
+},0,this);},this);this._.activeChild=p;this._.focused=false;p.showBlock(q,r,s,t,u);if(b.ie7Compat||b.ie8&&b.ie6Compat)setTimeout(function(){p.element.getChild(0).$.style.cssText+='';},100);},hideChild:function(){var p=this._.activeChild;if(p){delete p.onHide;delete p._.returnFocus;delete this._.activeChild;p.hide();}}}});a.on('instanceDestroyed',function(){var p=e.isEmpty(a.instances);for(var q in m){var r=m[q];if(p)r.destroy();else r.element.hide();}p&&(m={});});})();j.add('menu',{beforeInit:function(m){var n=m.config.menu_groups.split(','),o=m._.menuGroups={},p=m._.menuItems={};for(var q=0;q<n.length;q++)o[n[q]]=q+1;m.addMenuGroup=function(r,s){o[r]=s||100;};m.addMenuItem=function(r,s){if(o[s.group])p[r]=new a.menuItem(this,r,s);};m.addMenuItems=function(r){for(var s in r)this.addMenuItem(s,r[s]);};m.getMenuItem=function(r){return p[r];};m.removeMenuItem=function(r){delete p[r];};},requires:['floatpanel']});(function(){a.menu=e.createClass({$:function(n,o){var r=this;o=r._.definition=o||{};r.id=e.getNextId();r.editor=n;r.items=[];r._.listeners=[];r._.level=o.level||1;var p=e.extend({},o.panel,{css:n.skin.editor.css,level:r._.level-1,block:{}}),q=p.block.attributes=p.attributes||{};!q.role&&(q.role='menu');r._.panelDefinition=p;},_:{onShow:function(){var v=this;var n=v.editor.getSelection();if(c)n&&n.lock();var o=n&&n.getStartElement(),p=v._.listeners,q=[];v.removeAll();for(var r=0;r<p.length;r++){var s=p[r](o,n);if(s)for(var t in s){var u=v.editor.getMenuItem(t);if(u&&(!u.command||v.editor.getCommand(u.command).state)){u.state=s[t];v.add(u);}}}},onClick:function(n){this.hide(false);if(n.onClick)n.onClick();else if(n.command)this.editor.execCommand(n.command);},onEscape:function(n){var o=this.parent;if(o){o._.panel.hideChild();var p=o._.panel._.panel._.currentBlock,q=p._.focusIndex;p._.markItem(q);}else if(n==27)this.hide();return false;},onHide:function(){var o=this;if(c&&!o.parent){var n=o.editor.getSelection();n&&n.unlock(true);}o.onHide&&o.onHide();},showSubMenu:function(n){var v=this;var o=v._.subMenu,p=v.items[n],q=p.getItems&&p.getItems();if(!q){v._.panel.hideChild();return;}var r=v._.panel.getBlock(v.id);r._.focusIndex=n;if(o)o.removeAll();else{o=v._.subMenu=new a.menu(v.editor,e.extend({},v._.definition,{level:v._.level+1},true));o.parent=v;o._.onClick=e.bind(v._.onClick,v);}for(var s in q){var t=v.editor.getMenuItem(s);if(t){t.state=q[s];o.add(t);}}var u=v._.panel.getBlock(v.id).element.getDocument().getById(v.id+String(n));o.show(u,2);}},proto:{add:function(n){if(!n.order)n.order=this.items.length;
+this.items.push(n);},removeAll:function(){this.items=[];},show:function(n,o,p,q){if(!this.parent){this._.onShow();if(!this.items.length)return;}o=o||(this.editor.lang.dir=='rtl'?2:1);var r=this.items,s=this.editor,t=this._.panel,u=this._.element;if(!t){t=this._.panel=new k.floatPanel(this.editor,a.document.getBody(),this._.panelDefinition,this._.level);t.onEscape=e.bind(function(F){if(this._.onEscape(F)===false)return false;},this);t.onHide=e.bind(function(){this._.onHide&&this._.onHide();},this);var v=t.addBlock(this.id,this._.panelDefinition.block);v.autoSize=true;var w=v.keys;w[40]='next';w[9]='next';w[38]='prev';w[2228224+9]='prev';w[s.lang.dir=='rtl'?37:39]=c?'mouseup':'click';w[32]=c?'mouseup':'click';c&&(w[13]='mouseup');u=this._.element=v.element;u.addClass(s.skinClass);var x=u.getDocument();x.getBody().setStyle('overflow','hidden');x.getElementsByTag('html').getItem(0).setStyle('overflow','hidden');this._.itemOverFn=e.addFunction(function(F){var G=this;clearTimeout(G._.showSubTimeout);G._.showSubTimeout=e.setTimeout(G._.showSubMenu,s.config.menu_subMenuDelay||400,G,[F]);},this);this._.itemOutFn=e.addFunction(function(F){clearTimeout(this._.showSubTimeout);},this);this._.itemClickFn=e.addFunction(function(F){var H=this;var G=H.items[F];if(G.state==0){H.hide();return;}if(G.getItems)H._.showSubMenu(F);else H._.onClick(G);},this);}m(r);var y=s.container.getChild(1),z=y.hasClass('cke_mixed_dir_content')?' cke_mixed_dir_content':'',A=['<div class="cke_menu'+z+'" role="presentation">'],B=r.length,C=B&&r[0].group;for(var D=0;D<B;D++){var E=r[D];if(C!=E.group){A.push('<div class="cke_menuseparator" role="separator"></div>');C=E.group;}E.render(this,D,A);}A.push('</div>');u.setHtml(A.join(''));k.fire('ready',this);if(this.parent)this.parent._.panel.showAsChild(t,this.id,n,o,p,q);else t.showBlock(this.id,n,o,p,q);s.fire('menuShow',[t]);},addListener:function(n){this._.listeners.push(n);},hide:function(n){var o=this;o._.onHide&&o._.onHide();o._.panel&&o._.panel.hide(n);}}});function m(n){n.sort(function(o,p){if(o.group<p.group)return-1;else if(o.group>p.group)return 1;return o.order<p.order?-1:o.order>p.order?1:0;});};a.menuItem=e.createClass({$:function(n,o,p){var q=this;e.extend(q,p,{order:0,className:'cke_button_'+o});q.group=n._.menuGroups[q.group];q.editor=n;q.name=o;},proto:{render:function(n,o,p){var w=this;var q=n.id+String(o),r=typeof w.state=='undefined'?2:w.state,s=' cke_'+(r==1?'on':r==0?'disabled':'off'),t=w.label;if(w.className)s+=' '+w.className;
+var u=w.getItems;p.push('<span class="cke_menuitem'+(w.icon&&w.icon.indexOf('.png')==-1?' cke_noalphafix':'')+'">'+'<a id="',q,'" class="',s,'" href="javascript:void(\'',(w.label||'').replace("'",''),'\')" title="',w.label,'" tabindex="-1"_cke_focus=1 hidefocus="true" role="menuitem"'+(u?'aria-haspopup="true"':'')+(r==0?'aria-disabled="true"':'')+(r==1?'aria-pressed="true"':''));if(b.opera||b.gecko&&b.mac)p.push(' onkeypress="return false;"');if(b.gecko)p.push(' onblur="this.style.cssText = this.style.cssText;"');var v=(w.iconOffset||0)*-16;p.push(' onmouseover="CKEDITOR.tools.callFunction(',n._.itemOverFn,',',o,');" onmouseout="CKEDITOR.tools.callFunction(',n._.itemOutFn,',',o,');" '+(c?'onclick="return false;" onmouseup':'onclick')+'="CKEDITOR.tools.callFunction(',n._.itemClickFn,',',o,'); return false;"><span class="cke_icon_wrapper"><span class="cke_icon"'+(w.icon?' style="background-image:url('+a.getUrl(w.icon)+');background-position:0 '+v+'px;"':'')+'></span></span>'+'<span class="cke_label">');if(u)p.push('<span class="cke_menuarrow">','<span>&#',w.editor.lang.dir=='rtl'?'9668':'9658',';</span>','</span>');p.push(t,'</span></a></span>');}}});})();i.menu_groups='clipboard,form,tablecell,tablecellproperties,tablerow,tablecolumn,table,anchor,link,image,flash,checkbox,radio,textfield,hiddenfield,imagebutton,button,select,textarea,div';(function(){var m;j.add('editingblock',{init:function(n){if(!n.config.editingBlock)return;n.on('themeSpace',function(o){if(o.data.space=='contents')o.data.html+='<br>';});n.on('themeLoaded',function(){n.fireOnce('editingBlockReady');});n.on('uiReady',function(){n.setMode(n.config.startupMode);});n.on('afterSetData',function(){if(!m){function o(){m=true;n.getMode().loadData(n.getData());m=false;};if(n.mode)o();else n.on('mode',function(){if(n.mode){o();n.removeListener('mode',arguments.callee);}});}});n.on('beforeGetData',function(){if(!m&&n.mode){m=true;n.setData(n.getMode().getData(),null,1);m=false;}});n.on('getSnapshot',function(o){if(n.mode)o.data=n.getMode().getSnapshotData();});n.on('loadSnapshot',function(o){if(n.mode)n.getMode().loadSnapshotData(o.data);});n.on('mode',function(o){o.removeListener();b.webkit&&n.container.on('focus',function(){n.focus();});if(n.config.startupFocus)n.focus();setTimeout(function(){n.fireOnce('instanceReady');a.fire('instanceReady',null,n);},0);});n.on('destroy',function(){var o=this;if(o.mode)o._.modes[o.mode].unload(o.getThemeSpace('contents'));});}});a.editor.prototype.mode='';a.editor.prototype.addMode=function(n,o){o.name=n;
+(this._.modes||(this._.modes={}))[n]=o;};a.editor.prototype.setMode=function(n){this.fire('beforeSetMode',{newMode:n});var o,p=this.getThemeSpace('contents'),q=this.checkDirty();if(this.mode){if(n==this.mode)return;this._.previousMode=this.mode;this.fire('beforeModeUnload');var r=this.getMode();o=r.getData();r.unload(p);this.mode='';}p.setHtml('');var s=this.getMode(n);if(!s)throw '[CKEDITOR.editor.setMode] Unknown mode "'+n+'".';if(!q)this.on('mode',function(){this.resetDirty();this.removeListener('mode',arguments.callee);});s.load(p,typeof o!='string'?this.getData():o);};a.editor.prototype.getMode=function(n){return this._.modes&&this._.modes[n||this.mode];};a.editor.prototype.focus=function(){this.forceNextSelectionCheck();var n=this.getMode();if(n)n.focus();};})();i.startupMode='wysiwyg';i.editingBlock=true;(function(){function m(){var C=this;try{var z=C.getSelection();if(!z||!z.document.getWindow().$)return;var A=z.getStartElement(),B=new d.elementPath(A);if(!B.compare(C._.selectionPreviousPath)){C._.selectionPreviousPath=B;C.fire('selectionChange',{selection:z,path:B,element:A});}}catch(D){}};var n,o;function p(){o=true;if(n)return;q.call(this);n=e.setTimeout(q,200,this);};function q(){n=null;if(o){e.setTimeout(m,0,this);o=false;}};function r(z){function A(E){return E&&E.type==1&&E.getName() in f.$removeEmpty;};function B(E){var F=z.document.getBody();return!E.is('body')&&F.getChildCount()==1;};var C=z.startContainer,D=z.startOffset;if(C.type==3)return false;return!e.trim(C.getHtml())?A(C)||B(C):A(C.getChild(D-1))||A(C.getChild(D));};var s={modes:{wysiwyg:1,source:1},readOnly:c||b.webkit,exec:function(z){switch(z.mode){case 'wysiwyg':z.document.$.execCommand('SelectAll',false,null);z.forceNextSelectionCheck();z.selectionChange();break;case 'source':var A=z.textarea.$;if(c)A.createTextRange().execCommand('SelectAll');else{A.selectionStart=0;A.selectionEnd=A.value.length;}A.focus();}},canUndo:false};function t(z){w(z);var A=z.createText('');z.setCustomData('cke-fillingChar',A);return A;};function u(z){return z&&z.getCustomData('cke-fillingChar');};function v(z){var A=z&&u(z);if(A)if(A.getCustomData('ready'))w(z);else A.setCustomData('ready',1);};function w(z){var A=z&&z.removeCustomData('cke-fillingChar');if(A){var B,C=z.getSelection().getNative(),D=C&&C.type!='None'&&C.getRangeAt(0);if(A.getLength()>1&&D&&D.intersectsNode(A.$)){B=[C.anchorOffset,C.focusOffset];var E=C.anchorNode==A.$&&C.anchorOffset>0,F=C.focusNode==A.$&&C.focusOffset>0;E&&B[0]--;F&&B[1]--;
+x(C)&&B.unshift(B.pop());}A.setText(A.getText().replace(/\u200B/g,''));if(B){var G=C.getRangeAt(0);G.setStart(G.startContainer,B[0]);G.setEnd(G.startContainer,B[1]);C.removeAllRanges();C.addRange(G);}}};function x(z){if(!z.isCollapsed){var A=z.getRangeAt(0);A.setStart(z.anchorNode,z.anchorOffset);A.setEnd(z.focusNode,z.focusOffset);return A.collapsed;}};j.add('selection',{init:function(z){if(b.webkit){z.on('selectionChange',function(){v(z.document);});z.on('beforeSetMode',function(){w(z.document);});var A,B;function C(){var E=z.document,F=u(E);if(F){var G=E.$.defaultView.getSelection();if(G.type=='Caret'&&G.anchorNode==F.$)B=1;A=F.getText();F.setText(A.replace(/\u200B/g,''));}};function D(){var E=z.document,F=u(E);if(F){F.setText(A);if(B){E.$.defaultView.getSelection().setPosition(F.$,F.getLength());B=0;}}};z.on('beforeUndoImage',C);z.on('afterUndoImage',D);z.on('beforeGetData',C,null,null,0);z.on('getData',D);}z.on('contentDom',function(){var E=z.document,F=E.getBody(),G=E.getDocumentElement();if(c){var H,I,J=1;F.on('focusin',function(O){if(O.data.$.srcElement.nodeName!='BODY')return;var P=E.getCustomData('cke_locked_selection');if(P){P.unlock(1);P.lock();}else if(H&&J){try{H.select();}catch(Q){}H=null;}});F.on('focus',function(){I=1;N();});F.on('beforedeactivate',function(O){if(O.data.$.toElement)return;I=0;J=1;});c&&z.on('blur',function(){try{E.$.selection.empty();}catch(O){}});G.on('mousedown',function(){J=0;});G.on('mouseup',function(){J=1;});var K;F.on('mousedown',function(O){if(O.data.$.button==2){var P=z.document.$.selection;if(P.type=='None')K=z.window.getScrollPosition();}M();});F.on('mouseup',function(O){if(O.data.$.button==2&&K){z.document.$.documentElement.scrollLeft=K.x;z.document.$.documentElement.scrollTop=K.y;}K=null;I=1;setTimeout(function(){N(true);},0);});F.on('keydown',M);F.on('keyup',function(){I=1;N();});if((b.ie7Compat||b.ie6Compat)&&E.$.compatMode!='BackCompat'){function L(O,P,Q){try{O.moveToPoint(P,Q);}catch(R){}};G.on('mousedown',function(O){function P(R){R=R.data.$;if(Q){var S=F.$.createTextRange();L(S,R.x,R.y);Q.setEndPoint(Q.compareEndPoints('StartToStart',S)<0?'EndToEnd':'StartToStart',S);Q.select();}};O=O.data.$;if(O.y<G.$.clientHeight&&O.y>F.$.offsetTop+F.$.clientHeight&&O.x<G.$.clientWidth){var Q=F.$.createTextRange();L(Q,O.x,O.y);G.on('mousemove',P);G.on('mouseup',function(R){G.removeListener('mousemove',P);R.removeListener();Q.select();});}});}if(b.ie8)G.on('mouseup',function(O){if(O.data.getTarget().getName()=='html'){var P=a.document.$.selection,Q=P.createRange();
+if(P.type!='None'&&Q.parentElement().ownerDocument==E.$)Q.select();}});E.on('selectionchange',N);function M(){I=0;};function N(O){if(I){var P=z.document,Q=z.getSelection(),R=Q&&Q.getNative();if(O&&R&&R.type=='None')if(!P.$.queryCommandEnabled('InsertImage')){e.setTimeout(N,50,this,true);return;}var S;if(R&&R.type&&R.type!='Control'&&(S=R.createRange())&&(S=S.parentElement())&&(S=S.nodeName)&&S.toLowerCase() in {input:1,textarea:1})return;H=R&&Q.getRanges()[0];p.call(z);}};}else{E.on('mouseup',p,z);E.on('keyup',p,z);E.on('selectionchange',p,z);}if(b.webkit)E.on('keydown',function(O){var P=O.data.getKey();switch(P){case 13:case 33:case 34:case 35:case 36:case 37:case 39:case 8:case 45:case 46:w(z.document);}},null,null,10);});z.on('contentDomUnload',z.forceNextSelectionCheck,z);z.addCommand('selectAll',s);z.ui.addButton('SelectAll',{label:z.lang.selectAll,command:'selectAll'});z.selectionChange=function(E){(E?m:p).call(this);};b.ie9Compat&&z.on('destroy',function(){var E=z.getSelection();E&&E.getNative().clear();},null,null,9);}});a.editor.prototype.getSelection=function(){return this.document&&this.document.getSelection();};a.editor.prototype.forceNextSelectionCheck=function(){delete this._.selectionPreviousPath;};g.prototype.getSelection=function(){var z=new d.selection(this);return!z||z.isInvalid?null:z;};a.SELECTION_NONE=1;a.SELECTION_TEXT=2;a.SELECTION_ELEMENT=3;d.selection=function(z){var C=this;var A=z.getCustomData('cke_locked_selection');if(A)return A;C.document=z;C.isLocked=0;C._={cache:{}};if(c)try{var B=C.getNative().createRange();if(!B||B.item&&B.item(0).ownerDocument!=C.document.$||B.parentElement&&B.parentElement().ownerDocument!=C.document.$)throw 0;}catch(D){C.isInvalid=true;}return C;};var y={img:1,hr:1,li:1,table:1,tr:1,td:1,th:1,embed:1,object:1,ol:1,ul:1,a:1,input:1,form:1,select:1,textarea:1,button:1,fieldset:1,thead:1,tfoot:1};d.selection.prototype={getNative:c?function(){return this._.cache.nativeSel||(this._.cache.nativeSel=this.document.$.selection);}:function(){return this._.cache.nativeSel||(this._.cache.nativeSel=this.document.getWindow().$.getSelection());},getType:c?function(){var z=this._.cache;if(z.type)return z.type;var A=1;try{var B=this.getNative(),C=B.type;if(C=='Text')A=2;if(C=='Control')A=3;if(B.createRange().parentElement)A=2;}catch(D){}return z.type=A;}:function(){var z=this._.cache;if(z.type)return z.type;var A=2,B=this.getNative();if(!B)A=1;else if(B.rangeCount==1){var C=B.getRangeAt(0),D=C.startContainer;if(D==C.endContainer&&D.nodeType==1&&C.endOffset-C.startOffset==1&&y[D.childNodes[C.startOffset].nodeName.toLowerCase()])A=3;
+}return z.type=A;},getRanges:(function(){var z=c?(function(){function A(C){return new d.node(C).getIndex();};var B=function(C,D){C=C.duplicate();C.collapse(D);var E=C.parentElement(),F=E.ownerDocument;if(!E.hasChildNodes())return{container:E,offset:0};var G=E.children,H,I,J=C.duplicate(),K=0,L=G.length-1,M=-1,N,O,P;while(K<=L){M=Math.floor((K+L)/2);H=G[M];J.moveToElementText(H);N=J.compareEndPoints('StartToStart',C);if(N>0)L=M-1;else if(N<0)K=M+1;else if(b.ie9Compat&&H.tagName=='BR'){var Q=F.defaultView.getSelection();return{container:Q[D?'anchorNode':'focusNode'],offset:Q[D?'anchorOffset':'focusOffset']};}else return{container:E,offset:A(H)};}if(M==-1||M==G.length-1&&N<0){J.moveToElementText(E);J.setEndPoint('StartToStart',C);O=J.text.replace(/(\r\n|\r)/g,'\n').length;G=E.childNodes;if(!O){H=G[G.length-1];if(H.nodeType!=3)return{container:E,offset:G.length};else return{container:H,offset:H.nodeValue.length};}var R=G.length;while(O>0&&R>0){I=G[--R];if(I.nodeType==3){P=I;O-=I.nodeValue.length;}}return{container:P,offset:-O};}else{J.collapse(N>0?true:false);J.setEndPoint(N>0?'StartToStart':'EndToStart',C);O=J.text.replace(/(\r\n|\r)/g,'\n').length;if(!O)return{container:E,offset:A(H)+(N>0?0:1)};while(O>0)try{I=H[N>0?'previousSibling':'nextSibling'];if(I.nodeType==3){O-=I.nodeValue.length;P=I;}H=I;}catch(S){return{container:E,offset:A(H)};}return{container:P,offset:N>0?-O:P.nodeValue.length+O};}};return function(){var M=this;var C=M.getNative(),D=C&&C.createRange(),E=M.getType(),F;if(!C)return[];if(E==2){F=new d.range(M.document);var G=B(D,true);F.setStart(new d.node(G.container),G.offset);G=B(D);F.setEnd(new d.node(G.container),G.offset);if(F.endContainer.getPosition(F.startContainer)&4&&F.endOffset<=F.startContainer.getIndex())F.collapse();return[F];}else if(E==3){var H=[];for(var I=0;I<D.length;I++){var J=D.item(I),K=J.parentNode,L=0;F=new d.range(M.document);for(;L<K.childNodes.length&&K.childNodes[L]!=J;L++){}F.setStart(new d.node(K),L);F.setEnd(new d.node(K),L+1);H.push(F);}return H;}return[];};})():function(){var A=[],B,C=this.document,D=this.getNative();if(!D)return A;if(!D.rangeCount){B=new d.range(C);B.moveToElementEditStart(C.getBody());A.push(B);}for(var E=0;E<D.rangeCount;E++){var F=D.getRangeAt(E);B=new d.range(C);B.setStart(new d.node(F.startContainer),F.startOffset);B.setEnd(new d.node(F.endContainer),F.endOffset);A.push(B);}return A;};return function(A){var B=this._.cache;if(B.ranges&&!A)return B.ranges;else if(!B.ranges)B.ranges=new d.rangeList(z.call(this));
+if(A){var C=B.ranges;for(var D=0;D<C.length;D++){var E=C[D],F=E.getCommonAncestor();if(F.isReadOnly())C.splice(D,1);if(E.collapsed)continue;if(E.startContainer.isReadOnly()){var G=E.startContainer;while(G){if(G.is('body')||!G.isReadOnly())break;if(G.type==1&&G.getAttribute('contentEditable')=='false')E.setStartAfter(G);G=G.getParent();}}var H=E.startContainer,I=E.endContainer,J=E.startOffset,K=E.endOffset,L=E.clone();if(H&&H.type==3)if(J>=H.getLength())L.setStartAfter(H);else L.setStartBefore(H);if(I&&I.type==3)if(!K)L.setEndBefore(I);else L.setEndAfter(I);var M=new d.walker(L);M.evaluator=function(N){if(N.type==1&&N.isReadOnly()){var O=E.clone();E.setEndBefore(N);if(E.collapsed)C.splice(D--,1);if(!(N.getPosition(L.endContainer)&16)){O.setStartAfter(N);if(!O.collapsed)C.splice(D+1,0,O);}return true;}return false;};M.next();}}return B.ranges;};})(),getStartElement:function(){var G=this;var z=G._.cache;if(z.startElement!==undefined)return z.startElement;var A,B=G.getNative();switch(G.getType()){case 3:return G.getSelectedElement();case 2:var C=G.getRanges()[0];if(C){if(!C.collapsed){C.optimize();while(1){var D=C.startContainer,E=C.startOffset;if(E==(D.getChildCount?D.getChildCount():D.getLength())&&!D.isBlockBoundary())C.setStartAfter(D);else break;}A=C.startContainer;if(A.type!=1)return A.getParent();A=A.getChild(C.startOffset);if(!A||A.type!=1)A=C.startContainer;else{var F=A.getFirst();while(F&&F.type==1){A=F;F=F.getFirst();}}}else{A=C.startContainer;if(A.type!=1)A=A.getParent();}A=A.$;}}return z.startElement=A?new h(A):null;},getSelectedElement:function(){var z=this._.cache;if(z.selectedElement!==undefined)return z.selectedElement;var A=this,B=e.tryThese(function(){return A.getNative().createRange().item(0);},function(){var C,D,E=A.getRanges()[0],F=E.getCommonAncestor(1,1),G={table:1,ul:1,ol:1,dl:1};for(var H in G){if(C=F.getAscendant(H,1))break;}if(C){var I=new d.range(this.document);I.setStartAt(C,1);I.setEnd(E.startContainer,E.startOffset);var J=e.extend(G,f.$listItem,f.$tableContent),K=new d.walker(I),L=function(M,N){return function(O,P){if(O.type==3&&(!e.trim(O.getText())||O.getParent().data('cke-bookmark')))return true;var Q;if(O.type==1){Q=O.getName();if(Q=='br'&&N&&O.equals(O.getParent().getBogus()))return true;if(P&&Q in J||Q in f.$removeEmpty)return true;}M.halted=1;return false;};};K.guard=L(K);if(K.checkBackward()&&!K.halted){K=new d.walker(I);I.setStart(E.endContainer,E.endOffset);I.setEndAt(C,2);K.guard=L(K,1);if(K.checkForward()&&!K.halted)D=C.$;
+}}if(!D)throw 0;return D;},function(){var C=A.getRanges()[0],D,E;for(var F=2;F&&!((D=C.getEnclosedNode())&&D.type==1&&y[D.getName()]&&(E=D));F--)C.shrink(1);return E.$;});return z.selectedElement=B?new h(B):null;},getSelectedText:function(){var z=this._.cache;if(z.selectedText!==undefined)return z.selectedText;var A='',B=this.getNative();if(this.getType()==2)A=c?B.createRange().text:B.toString();return z.selectedText=A;},lock:function(){var z=this;z.getRanges();z.getStartElement();z.getSelectedElement();z.getSelectedText();z._.cache.nativeSel={};z.isLocked=1;z.document.setCustomData('cke_locked_selection',z);},unlock:function(z){var E=this;var A=E.document,B=A.getCustomData('cke_locked_selection');if(B){A.setCustomData('cke_locked_selection',null);if(z){var C=B.getSelectedElement(),D=!C&&B.getRanges();E.isLocked=0;E.reset();if(C)E.selectElement(C);else E.selectRanges(D);}}if(!B||!z){E.isLocked=0;E.reset();}},reset:function(){this._.cache={};},selectElement:function(z){var B=this;if(B.isLocked){var A=new d.range(B.document);A.setStartBefore(z);A.setEndAfter(z);B._.cache.selectedElement=z;B._.cache.startElement=z;B._.cache.ranges=new d.rangeList(A);B._.cache.type=3;return;}A=new d.range(z.getDocument());A.setStartBefore(z);A.setEndAfter(z);A.select();B.document.fire('selectionchange');B.reset();},selectRanges:function(z){var N=this;if(N.isLocked){N._.cache.selectedElement=null;N._.cache.startElement=z[0]&&z[0].getTouchedStartNode();N._.cache.ranges=new d.rangeList(z);N._.cache.type=2;return;}if(c){if(z.length>1){var A=z[z.length-1];z[0].setEnd(A.endContainer,A.endOffset);z.length=1;}if(z[0])z[0].select();N.reset();}else{var B=N.getNative();if(!B)return;if(z.length){B.removeAllRanges();b.webkit&&w(N.document);}for(var C=0;C<z.length;C++){if(C<z.length-1){var D=z[C],E=z[C+1],F=D.clone();F.setStart(D.endContainer,D.endOffset);F.setEnd(E.startContainer,E.startOffset);if(!F.collapsed){F.shrink(1,true);var G=F.getCommonAncestor(),H=F.getEnclosedNode();if(G.isReadOnly()||H&&H.isReadOnly()){E.setStart(D.startContainer,D.startOffset);z.splice(C--,1);continue;}}}var I=z[C],J=N.document.$.createRange(),K=I.startContainer;if(I.collapsed&&(b.opera||b.gecko&&b.version<10900)&&K.type==1&&!K.getChildCount())K.appendText('');if(I.collapsed&&b.webkit&&r(I)){var L=t(N.document);I.insertNode(L);var M=L.getNext();if(M&&!L.getPrevious()&&M.type==1&&M.getName()=='br'){w(N.document);I.moveToPosition(M,3);}else I.moveToPosition(L,4);}J.setStart(I.startContainer.$,I.startOffset);try{J.setEnd(I.endContainer.$,I.endOffset);
+}catch(O){if(O.toString().indexOf('NS_ERROR_ILLEGAL_VALUE')>=0){I.collapse(1);J.setEnd(I.endContainer.$,I.endOffset);}else throw O;}B.addRange(J);}N.document.fire('selectionchange');N.reset();}},createBookmarks:function(z){return this.getRanges().createBookmarks(z);},createBookmarks2:function(z){return this.getRanges().createBookmarks2(z);},selectBookmarks:function(z){var A=[];for(var B=0;B<z.length;B++){var C=new d.range(this.document);C.moveToBookmark(z[B]);A.push(C);}this.selectRanges(A);return this;},getCommonAncestor:function(){var z=this.getRanges(),A=z[0].startContainer,B=z[z.length-1].endContainer;return A.getCommonAncestor(B);},scrollIntoView:function(){var z=this.getStartElement();z.scrollIntoView();}};})();(function(){var m=d.walker.whitespaces(true),n=/\ufeff|\u00a0/,o={table:1,tbody:1,tr:1};d.range.prototype.select=c?function(p){var A=this;var q=A.collapsed,r,s,t,u=A.getEnclosedNode();if(u)try{t=A.document.$.body.createControlRange();t.addElement(u.$);t.select();return;}catch(B){}if(A.startContainer.type==1&&A.startContainer.getName() in o||A.endContainer.type==1&&A.endContainer.getName() in o)A.shrink(1,true);var v=A.createBookmark(),w=v.startNode,x;if(!q)x=v.endNode;t=A.document.$.body.createTextRange();t.moveToElementText(w.$);t.moveStart('character',1);if(x){var y=A.document.$.body.createTextRange();y.moveToElementText(x.$);t.setEndPoint('EndToEnd',y);t.moveEnd('character',-1);}else{var z=w.getNext(m);r=!(z&&z.getText&&z.getText().match(n))&&(p||!w.hasPrevious()||w.getPrevious().is&&w.getPrevious().is('br'));s=A.document.createElement('span');s.setHtml('');s.insertBefore(w);if(r)A.document.createText('\ufeff').insertBefore(w);}A.setStartBefore(w);w.remove();if(q){if(r){t.moveStart('character',-1);t.select();A.document.$.selection.clear();}else t.select();A.moveToPosition(s,3);s.remove();}else{A.setEndBefore(x);x.remove();t.select();}A.document.fire('selectionchange');}:function(){this.document.getSelection().selectRanges([this]);};})();(function(){var m=a.htmlParser.cssStyle,n=e.cssLength,o=/^((?:\d*(?:\.\d+))|(?:\d+))(.*)?$/i;function p(r,s){var t=o.exec(r),u=o.exec(s);if(t){if(!t[2]&&u[2]=='px')return u[1];if(t[2]=='px'&&!u[2])return u[1]+'px';}return s;};var q={elements:{$:function(r){var s=r.attributes,t=s&&s['data-cke-realelement'],u=t&&new a.htmlParser.fragment.fromHtml(decodeURIComponent(t)),v=u&&u.children[0];if(v&&r.attributes['data-cke-resizable']){var w=new m(r).rules,x=v.attributes,y=w.width,z=w.height;y&&(x.width=p(x.width,y));
+z&&(x.height=p(x.height,z));}return v;}}};j.add('fakeobjects',{requires:['htmlwriter'],afterInit:function(r){var s=r.dataProcessor,t=s&&s.htmlFilter;if(t)t.addRules(q);}});a.editor.prototype.createFakeElement=function(r,s,t,u){var v=this.lang.fakeobjects,w=v[t]||v.unknown,x={'class':s,'data-cke-realelement':encodeURIComponent(r.getOuterHtml()),'data-cke-real-node-type':r.type,alt:w,title:w,align:r.getAttribute('align')||''};if(!b.hc)x.src=a.getUrl('images/spacer.gif');if(t)x['data-cke-real-element-type']=t;if(u){x['data-cke-resizable']=u;var y=new m(),z=r.getAttribute('width'),A=r.getAttribute('height');z&&(y.rules.width=n(z));A&&(y.rules.height=n(A));y.populate(x);}return this.document.createElement('img',{attributes:x});};a.editor.prototype.createFakeParserElement=function(r,s,t,u){var v=this.lang.fakeobjects,w=v[t]||v.unknown,x,y=new a.htmlParser.basicWriter();r.writeHtml(y);x=y.getHtml();var z={'class':s,'data-cke-realelement':encodeURIComponent(x),'data-cke-real-node-type':r.type,alt:w,title:w,align:r.attributes.align||''};if(!b.hc)z.src=a.getUrl('images/spacer.gif');if(t)z['data-cke-real-element-type']=t;if(u){z['data-cke-resizable']=u;var A=r.attributes,B=new m(),C=A.width,D=A.height;C!=undefined&&(B.rules.width=n(C));D!=undefined&&(B.rules.height=n(D));B.populate(z);}return new a.htmlParser.element('img',z);};a.editor.prototype.restoreRealElement=function(r){if(r.data('cke-real-node-type')!=1)return null;var s=h.createFromHtml(decodeURIComponent(r.data('cke-realelement')),this.document);if(r.data('cke-resizable')){var t=r.getStyle('width'),u=r.getStyle('height');t&&s.setAttribute('width',p(s.getAttribute('width'),t));u&&s.setAttribute('height',p(s.getAttribute('height'),u));}return s;};})();j.add('richcombo',{requires:['floatpanel','listblock','button'],beforeInit:function(m){m.ui.addHandler('richcombo',k.richCombo.handler);}});a.UI_RICHCOMBO='richcombo';k.richCombo=e.createClass({$:function(m){var o=this;e.extend(o,m,{title:m.label,modes:{wysiwyg:1}});var n=o.panel||{};delete o.panel;o.id=e.getNextNumber();o.document=n&&n.parent&&n.parent.getDocument()||a.document;n.className=(n.className||'')+' cke_rcombopanel';n.block={multiSelect:n.multiSelect,attributes:n.attributes};o._={panelDefinition:n,items:{},state:2};},statics:{handler:{create:function(m){return new k.richCombo(m);}}},proto:{renderHtml:function(m){var n=[];this.render(m,n);return n.join('');},render:function(m,n){var o=b,p='cke_'+this.id,q=e.addFunction(function(v){var y=this;var w=y._;if(w.state==0)return;
+y.createPanel(m);if(w.on){w.panel.hide();return;}y.commit();var x=y.getValue();if(x)w.list.mark(x);else w.list.unmarkAll();w.panel.showBlock(y.id,new h(v),4);},this),r={id:p,combo:this,focus:function(){var v=a.document.getById(p).getChild(1);v.focus();},clickFn:q};function s(){var w=this;var v=w.modes[m.mode]?2:0;w.setState(m.readOnly&&!w.readOnly?0:v);w.setValue('');};m.on('mode',s,this);!this.readOnly&&m.on('readOnly',s,this);var t=e.addFunction(function(v,w){v=new d.event(v);var x=v.getKeystroke();switch(x){case 13:case 32:case 40:e.callFunction(q,w);break;default:r.onkey(r,x);}v.preventDefault();}),u=e.addFunction(function(){r.onfocus&&r.onfocus();});r.keyDownFn=t;n.push('<span class="cke_rcombo" role="presentation">','<span id=',p);if(this.className)n.push(' class="',this.className,' cke_off"');n.push(' role="presentation">','<span id="'+p+'_label" class=cke_label>',this.label,'</span>','<a hidefocus=true title="',this.title,'" tabindex="-1"',o.gecko&&o.version>=10900&&!o.hc?'':" href=\"javascript:void('"+this.label+"')\"",' role="button" aria-labelledby="',p,'_label" aria-describedby="',p,'_text" aria-haspopup="true"');if(b.opera||b.gecko&&b.mac)n.push(' onkeypress="return false;"');if(b.gecko)n.push(' onblur="this.style.cssText = this.style.cssText;"');n.push(' onkeydown="CKEDITOR.tools.callFunction( ',t,', event, this );" onfocus="return CKEDITOR.tools.callFunction(',u,', event);" '+(c?'onclick="return false;" onmouseup':'onclick')+'="CKEDITOR.tools.callFunction(',q,', this); return false;"><span><span id="'+p+'_text" class="cke_text cke_inline_label">'+this.label+'</span>'+'</span>'+'<span class=cke_openbutton><span class=cke_icon>'+(b.hc?'▼':b.air?' ':'')+'</span></span>'+'</a>'+'</span>'+'</span>');if(this.onRender)this.onRender();return r;},createPanel:function(m){if(this._.panel)return;var n=this._.panelDefinition,o=this._.panelDefinition.block,p=n.parent||a.document.getBody(),q=new k.floatPanel(m,p,n),r=q.addListBlock(this.id,o),s=this;q.onShow=function(){if(s.className)this.element.getFirst().addClass(s.className+'_panel');s.setState(1);r.focus(!s.multiSelect&&s.getValue());s._.on=1;if(s.onOpen)s.onOpen();};q.onHide=function(t){if(s.className)this.element.getFirst().removeClass(s.className+'_panel');s.setState(s.modes&&s.modes[m.mode]?2:0);s._.on=0;if(!t&&s.onClose)s.onClose();};q.onEscape=function(){q.hide();};r.onClick=function(t,u){s.document.getWindow().focus();if(s.onClick)s.onClick.call(s,t,u);if(u)s.setValue(t,s._.items[t]);
+else s.setValue('');q.hide(false);};this._.panel=q;this._.list=r;q.getBlock(this.id).onHide=function(){s._.on=0;s.setState(2);};if(this.init)this.init();},setValue:function(m,n){var p=this;p._.value=m;var o=p.document.getById('cke_'+p.id+'_text');if(o){if(!(m||n)){n=p.label;o.addClass('cke_inline_label');}else o.removeClass('cke_inline_label');o.setHtml(typeof n!='undefined'?n:m);}},getValue:function(){return this._.value||'';},unmarkAll:function(){this._.list.unmarkAll();},mark:function(m){this._.list.mark(m);},hideItem:function(m){this._.list.hideItem(m);},hideGroup:function(m){this._.list.hideGroup(m);},showAll:function(){this._.list.showAll();},add:function(m,n,o){this._.items[m]=o||m;this._.list.add(m,n,o);},startGroup:function(m){this._.list.startGroup(m);},commit:function(){var m=this;if(!m._.committed){m._.list.commit();m._.committed=1;k.fire('ready',m);}m._.committed=1;},setState:function(m){var n=this;if(n._.state==m)return;n.document.getById('cke_'+n.id).setState(m);n._.state=m;}}});k.prototype.addRichCombo=function(m,n){this.add(m,'richcombo',n);};j.add('htmlwriter');a.htmlWriter=e.createClass({base:a.htmlParser.basicWriter,$:function(){var o=this;o.base();o.indentationChars='\t';o.selfClosingEnd=' />';o.lineBreakChars='\n';o.forceSimpleAmpersand=0;o.sortAttributes=1;o._.indent=0;o._.indentation='';o._.inPre=0;o._.rules={};var m=f;for(var n in e.extend({},m.$nonBodyContent,m.$block,m.$listItem,m.$tableContent))o.setRules(n,{indent:1,breakBeforeOpen:1,breakAfterOpen:1,breakBeforeClose:!m[n]['#'],breakAfterClose:1});o.setRules('br',{breakAfterOpen:1});o.setRules('title',{indent:0,breakAfterOpen:0});o.setRules('style',{indent:0,breakBeforeClose:1});o.setRules('pre',{indent:0});},proto:{openTag:function(m,n){var p=this;var o=p._.rules[m];if(p._.indent)p.indentation();else if(o&&o.breakBeforeOpen){p.lineBreak();p.indentation();}p._.output.push('<',m);},openTagClose:function(m,n){var p=this;var o=p._.rules[m];if(n)p._.output.push(p.selfClosingEnd);else{p._.output.push('>');if(o&&o.indent)p._.indentation+=p.indentationChars;}if(o&&o.breakAfterOpen)p.lineBreak();m=='pre'&&(p._.inPre=1);},attribute:function(m,n){if(typeof n=='string'){this.forceSimpleAmpersand&&(n=n.replace(/&/g,'&'));n=e.htmlEncodeAttr(n);}this._.output.push(' ',m,'="',n,'"');},closeTag:function(m){var o=this;var n=o._.rules[m];if(n&&n.indent)o._.indentation=o._.indentation.substr(o.indentationChars.length);if(o._.indent)o.indentation();else if(n&&n.breakBeforeClose){o.lineBreak();o.indentation();
+}o._.output.push('</',m,'>');m=='pre'&&(o._.inPre=0);if(n&&n.breakAfterClose)o.lineBreak();},text:function(m){var n=this;if(n._.indent){n.indentation();!n._.inPre&&(m=e.ltrim(m));}n._.output.push(m);},comment:function(m){if(this._.indent)this.indentation();this._.output.push('<!--',m,'-->');},lineBreak:function(){var m=this;if(!m._.inPre&&m._.output.length>0)m._.output.push(m.lineBreakChars);m._.indent=1;},indentation:function(){var m=this;if(!m._.inPre)m._.output.push(m._.indentation);m._.indent=0;},setRules:function(m,n){var o=this._.rules[m];if(o)e.extend(o,n,true);else this._.rules[m]=n;}}});j.add('menubutton',{requires:['button','menu'],beforeInit:function(m){m.ui.addHandler('menubutton',k.menuButton.handler);}});a.UI_MENUBUTTON='menubutton';(function(){var m=function(n){var o=this._;if(o.state===0)return;o.previousState=o.state;var p=o.menu;if(!p){p=o.menu=new a.menu(n,{panel:{className:n.skinClass+' cke_contextmenu',attributes:{'aria-label':n.lang.common.options}}});p.onHide=e.bind(function(){this.setState(this.modes&&this.modes[n.mode]?o.previousState:0);},this);if(this.onMenu)p.addListener(this.onMenu);}if(o.on){p.hide();return;}this.setState(1);p.show(a.document.getById(this._.id),4);};k.menuButton=e.createClass({base:k.button,$:function(n){var o=n.panel;delete n.panel;this.base(n);this.hasArrow=true;this.click=m;},statics:{handler:{create:function(n){return new k.menuButton(n);}}}});})();j.add('dialogui');(function(){var m=function(u){var x=this;x._||(x._={});x._['default']=x._.initValue=u['default']||'';x._.required=u.required||false;var v=[x._];for(var w=1;w<arguments.length;w++)v.push(arguments[w]);v.push(true);e.extend.apply(e,v);return x._;},n={build:function(u,v,w){return new k.dialog.textInput(u,v,w);}},o={build:function(u,v,w){return new k.dialog[v.type](u,v,w);}},p={build:function(u,v,w){var x=v.children,y,z=[],A=[];for(var B=0;B<x.length&&(y=x[B]);B++){var C=[];z.push(C);A.push(a.dialog._.uiElementBuilders[y.type].build(u,y,C));}return new k.dialog[v.type](u,A,z,w,v);}},q={isChanged:function(){return this.getValue()!=this.getInitValue();},reset:function(u){this.setValue(this.getInitValue(),u);},setInitValue:function(){this._.initValue=this.getValue();},resetInitValue:function(){this._.initValue=this._['default'];},getInitValue:function(){return this._.initValue;}},r=e.extend({},k.dialog.uiElement.prototype.eventProcessors,{onChange:function(u,v){if(!this._.domOnChangeRegistered){u.on('load',function(){this.getInputElement().on('change',function(){if(!u.parts.dialog.isVisible())return;
+this.fire('change',{value:this.getValue()});},this);},this);this._.domOnChangeRegistered=true;}this.on('change',v);}},true),s=/^on([A-Z]\w+)/,t=function(u){for(var v in u){if(s.test(v)||v=='title'||v=='type')delete u[v];}return u;};e.extend(k.dialog,{labeledElement:function(u,v,w,x){if(arguments.length<4)return;var y=m.call(this,v);y.labelId=e.getNextId()+'_label';var z=this._.children=[],A=function(){var B=[],C=v.required?' cke_required':'';if(v.labelLayout!='horizontal')B.push('<label class="cke_dialog_ui_labeled_label'+C+'" ',' id="'+y.labelId+'"',y.inputId?' for="'+y.inputId+'"':'',(v.labelStyle?' style="'+v.labelStyle+'"':'')+'>',v.label,'</label>','<div class="cke_dialog_ui_labeled_content"'+(v.controlStyle?' style="'+v.controlStyle+'"':'')+' role="presentation">',x.call(this,u,v),'</div>');else{var D={type:'hbox',widths:v.widths,padding:0,children:[{type:'html',html:'<label class="cke_dialog_ui_labeled_label'+C+'"'+' id="'+y.labelId+'"'+' for="'+y.inputId+'"'+(v.labelStyle?' style="'+v.labelStyle+'"':'')+'>'+e.htmlEncode(v.label)+'</span>'},{type:'html',html:'<span class="cke_dialog_ui_labeled_content"'+(v.controlStyle?' style="'+v.controlStyle+'"':'')+'>'+x.call(this,u,v)+'</span>'}]};a.dialog._.uiElementBuilders.hbox.build(u,D,B);}return B.join('');};k.dialog.uiElement.call(this,u,v,w,'div',null,{role:'presentation'},A);},textInput:function(u,v,w){if(arguments.length<3)return;m.call(this,v);var x=this._.inputId=e.getNextId()+'_textInput',y={'class':'cke_dialog_ui_input_'+v.type,id:x,type:v.type},z;if(v.validate)this.validate=v.validate;if(v.maxLength)y.maxlength=v.maxLength;if(v.size)y.size=v.size;if(v.inputStyle)y.style=v.inputStyle;var A=function(){var B=['<div class="cke_dialog_ui_input_',v.type,'" role="presentation"'];if(v.width)B.push('style="width:'+v.width+'" ');B.push('><input ');y['aria-labelledby']=this._.labelId;this._.required&&(y['aria-required']=this._.required);for(var C in y)B.push(C+'="'+y[C]+'" ');B.push(' /></div>');return B.join('');};k.dialog.labeledElement.call(this,u,v,w,A);},textarea:function(u,v,w){if(arguments.length<3)return;m.call(this,v);var x=this,y=this._.inputId=e.getNextId()+'_textarea',z={};if(v.validate)this.validate=v.validate;z.rows=v.rows||5;z.cols=v.cols||20;if(typeof v.inputStyle!='undefined')z.style=v.inputStyle;var A=function(){z['aria-labelledby']=this._.labelId;this._.required&&(z['aria-required']=this._.required);var B=['<div class="cke_dialog_ui_input_textarea" role="presentation"><textarea class="cke_dialog_ui_input_textarea" id="',y,'" '];
+for(var C in z)B.push(C+'="'+e.htmlEncode(z[C])+'" ');B.push('>',e.htmlEncode(x._['default']),'</textarea></div>');return B.join('');};k.dialog.labeledElement.call(this,u,v,w,A);},checkbox:function(u,v,w){if(arguments.length<3)return;var x=m.call(this,v,{'default':!!v['default']});if(v.validate)this.validate=v.validate;var y=function(){var z=e.extend({},v,{id:v.id?v.id+'_checkbox':e.getNextId()+'_checkbox'},true),A=[],B=e.getNextId()+'_label',C={'class':'cke_dialog_ui_checkbox_input',type:'checkbox','aria-labelledby':B};t(z);if(v['default'])C.checked='checked';if(typeof z.inputStyle!='undefined')z.style=z.inputStyle;x.checkbox=new k.dialog.uiElement(u,z,A,'input',null,C);A.push(' <label id="',B,'" for="',C.id,'"'+(v.labelStyle?' style="'+v.labelStyle+'"':'')+'>',e.htmlEncode(v.label),'</label>');return A.join('');};k.dialog.uiElement.call(this,u,v,w,'span',null,null,y);},radio:function(u,v,w){if(arguments.length<3)return;m.call(this,v);if(!this._['default'])this._['default']=this._.initValue=v.items[0][1];if(v.validate)this.validate=v.valdiate;var x=[],y=this,z=function(){var A=[],B=[],C={'class':'cke_dialog_ui_radio_item','aria-labelledby':this._.labelId},D=v.id?v.id+'_radio':e.getNextId()+'_radio';for(var E=0;E<v.items.length;E++){var F=v.items[E],G=F[2]!==undefined?F[2]:F[0],H=F[1]!==undefined?F[1]:F[0],I=e.getNextId()+'_radio_input',J=I+'_label',K=e.extend({},v,{id:I,title:null,type:null},true),L=e.extend({},K,{title:G},true),M={type:'radio','class':'cke_dialog_ui_radio_input',name:D,value:H,'aria-labelledby':J},N=[];if(y._['default']==H)M.checked='checked';t(K);t(L);if(typeof K.inputStyle!='undefined')K.style=K.inputStyle;x.push(new k.dialog.uiElement(u,K,N,'input',null,M));N.push(' ');new k.dialog.uiElement(u,L,N,'label',null,{id:J,'for':M.id},F[0]);A.push(N.join(''));}new k.dialog.hbox(u,x,A,B);return B.join('');};k.dialog.labeledElement.call(this,u,v,w,z);this._.children=x;},button:function(u,v,w){if(!arguments.length)return;if(typeof v=='function')v=v(u.getParentEditor());m.call(this,v,{disabled:v.disabled||false});a.event.implementOn(this);var x=this;u.on('load',function(A){var B=this.getElement();(function(){B.on('click',function(C){x.fire('click',{dialog:x.getDialog()});C.data.preventDefault();});B.on('keydown',function(C){if(C.data.getKeystroke() in {32:1}){x.click();C.data.preventDefault();}});})();B.unselectable();},this);var y=e.extend({},v);delete y.style;var z=e.getNextId()+'_label';k.dialog.uiElement.call(this,u,y,w,'a',null,{style:v.style,href:'javascript:void(0)',title:v.label,hidefocus:'true','class':v['class'],role:'button','aria-labelledby':z},'<span id="'+z+'" class="cke_dialog_ui_button">'+e.htmlEncode(v.label)+'</span>');
+},select:function(u,v,w){if(arguments.length<3)return;var x=m.call(this,v);if(v.validate)this.validate=v.validate;x.inputId=e.getNextId()+'_select';var y=function(){var z=e.extend({},v,{id:v.id?v.id+'_select':e.getNextId()+'_select'},true),A=[],B=[],C={id:x.inputId,'class':'cke_dialog_ui_input_select','aria-labelledby':this._.labelId};if(v.size!=undefined)C.size=v.size;if(v.multiple!=undefined)C.multiple=v.multiple;t(z);for(var D=0,E;D<v.items.length&&(E=v.items[D]);D++)B.push('<option value="',e.htmlEncode(E[1]!==undefined?E[1]:E[0]).replace(/"/g,'"'),'" /> ',e.htmlEncode(E[0]));if(typeof z.inputStyle!='undefined')z.style=z.inputStyle;x.select=new k.dialog.uiElement(u,z,A,'select',null,C,B.join(''));return A.join('');};k.dialog.labeledElement.call(this,u,v,w,y);},file:function(u,v,w){if(arguments.length<3)return;if(v['default']===undefined)v['default']='';var x=e.extend(m.call(this,v),{definition:v,buttons:[]});if(v.validate)this.validate=v.validate;var y=function(){x.frameId=e.getNextId()+'_fileInput';var z=b.isCustomDomain(),A=['<iframe frameborder="0" allowtransparency="0" class="cke_dialog_ui_input_file" role="presentation" id="',x.frameId,'" title="',v.label,'" src="javascript:void('];A.push(z?"(function(){document.open();document.domain='"+document.domain+"';"+'document.close();'+'})()':'0');A.push(')"></iframe>');return A.join('');};u.on('load',function(){var z=a.document.getById(x.frameId),A=z.getParent();A.addClass('cke_dialog_ui_input_file');});k.dialog.labeledElement.call(this,u,v,w,y);},fileButton:function(u,v,w){if(arguments.length<3)return;var x=m.call(this,v),y=this;if(v.validate)this.validate=v.validate;var z=e.extend({},v),A=z.onClick;z.className=(z.className?z.className+' ':'')+'cke_dialog_ui_button';z.onClick=function(B){var C=v['for'];if(!A||A.call(this,B)!==false){u.getContentElement(C[0],C[1]).submit();this.disable();}};u.on('load',function(){u.getContentElement(v['for'][0],v['for'][1])._.buttons.push(y);});k.dialog.button.call(this,u,z,w);},html:(function(){var u=/^\s*<[\w:]+\s+([^>]*)?>/,v=/^(\s*<[\w:]+(?:\s+[^>]*)?)((?:.|\r|\n)+)$/,w=/\/$/;return function(x,y,z){if(arguments.length<3)return;var A=[],B,C=y.html,D,E;if(C.charAt(0)!='<')C='<span>'+C+'</span>';var F=y.focus;if(F){var G=this.focus;this.focus=function(){G.call(this);typeof F=='function'&&F.call(this);this.fire('focus');};if(y.isFocusable){var H=this.isFocusable;this.isFocusable=H;}this.keyboardFocusable=true;}k.dialog.uiElement.call(this,x,y,A,'span',null,null,'');B=A.join('');
+D=B.match(u);E=C.match(v)||['','',''];if(w.test(E[1])){E[1]=E[1].slice(0,-1);E[2]='/'+E[2];}z.push([E[1],' ',D[1]||'',E[2]].join(''));};})(),fieldset:function(u,v,w,x,y){var z=y.label,A=function(){var B=[];z&&B.push('<legend'+(y.labelStyle?' style="'+y.labelStyle+'"':'')+'>'+z+'</legend>');for(var C=0;C<w.length;C++)B.push(w[C]);return B.join('');};this._={children:v};k.dialog.uiElement.call(this,u,y,x,'fieldset',null,null,A);}},true);k.dialog.html.prototype=new k.dialog.uiElement();k.dialog.labeledElement.prototype=e.extend(new k.dialog.uiElement(),{setLabel:function(u){var v=a.document.getById(this._.labelId);if(v.getChildCount()<1)new d.text(u,a.document).appendTo(v);else v.getChild(0).$.nodeValue=u;return this;},getLabel:function(){var u=a.document.getById(this._.labelId);if(!u||u.getChildCount()<1)return '';else return u.getChild(0).getText();},eventProcessors:r},true);k.dialog.button.prototype=e.extend(new k.dialog.uiElement(),{click:function(){var u=this;if(!u._.disabled)return u.fire('click',{dialog:u._.dialog});u.getElement().$.blur();return false;},enable:function(){this._.disabled=false;var u=this.getElement();u&&u.removeClass('cke_disabled');},disable:function(){this._.disabled=true;this.getElement().addClass('cke_disabled');},isVisible:function(){return this.getElement().getFirst().isVisible();},isEnabled:function(){return!this._.disabled;},eventProcessors:e.extend({},k.dialog.uiElement.prototype.eventProcessors,{onClick:function(u,v){this.on('click',function(){this.getElement().focus();v.apply(this,arguments);});}},true),accessKeyUp:function(){this.click();},accessKeyDown:function(){this.focus();},keyboardFocusable:true},true);k.dialog.textInput.prototype=e.extend(new k.dialog.labeledElement(),{getInputElement:function(){return a.document.getById(this._.inputId);},focus:function(){var u=this.selectParentTab();setTimeout(function(){var v=u.getInputElement();v&&v.$.focus();},0);},select:function(){var u=this.selectParentTab();setTimeout(function(){var v=u.getInputElement();if(v){v.$.focus();v.$.select();}},0);},accessKeyUp:function(){this.select();},setValue:function(u){!u&&(u='');return k.dialog.uiElement.prototype.setValue.apply(this,arguments);},keyboardFocusable:true},q,true);k.dialog.textarea.prototype=new k.dialog.textInput();k.dialog.select.prototype=e.extend(new k.dialog.labeledElement(),{getInputElement:function(){return this._.select.getElement();},add:function(u,v,w){var x=new h('option',this.getDialog().getParentEditor().document),y=this.getInputElement().$;
+x.$.text=u;x.$.value=v===undefined||v===null?u:v;if(w===undefined||w===null){if(c)y.add(x.$);else y.add(x.$,null);}else y.add(x.$,w);return this;},remove:function(u){var v=this.getInputElement().$;v.remove(u);return this;},clear:function(){var u=this.getInputElement().$;while(u.length>0)u.remove(0);return this;},keyboardFocusable:true},q,true);k.dialog.checkbox.prototype=e.extend(new k.dialog.uiElement(),{getInputElement:function(){return this._.checkbox.getElement();},setValue:function(u,v){this.getInputElement().$.checked=u;!v&&this.fire('change',{value:u});},getValue:function(){return this.getInputElement().$.checked;},accessKeyUp:function(){this.setValue(!this.getValue());},eventProcessors:{onChange:function(u,v){if(!c)return r.onChange.apply(this,arguments);else{u.on('load',function(){var w=this._.checkbox.getElement();w.on('propertychange',function(x){x=x.data.$;if(x.propertyName=='checked')this.fire('change',{value:w.$.checked});},this);},this);this.on('change',v);}return null;}},keyboardFocusable:true},q,true);k.dialog.radio.prototype=e.extend(new k.dialog.uiElement(),{setValue:function(u,v){var w=this._.children,x;for(var y=0;y<w.length&&(x=w[y]);y++)x.getElement().$.checked=x.getValue()==u;!v&&this.fire('change',{value:u});},getValue:function(){var u=this._.children;for(var v=0;v<u.length;v++){if(u[v].getElement().$.checked)return u[v].getValue();}return null;},accessKeyUp:function(){var u=this._.children,v;for(v=0;v<u.length;v++){if(u[v].getElement().$.checked){u[v].getElement().focus();return;}}u[0].getElement().focus();},eventProcessors:{onChange:function(u,v){if(!c)return r.onChange.apply(this,arguments);else{u.on('load',function(){var w=this._.children,x=this;for(var y=0;y<w.length;y++){var z=w[y].getElement();z.on('propertychange',function(A){A=A.data.$;if(A.propertyName=='checked'&&this.$.checked)x.fire('change',{value:this.getAttribute('value')});});}},this);this.on('change',v);}return null;}},keyboardFocusable:true},q,true);k.dialog.file.prototype=e.extend(new k.dialog.labeledElement(),q,{getInputElement:function(){var u=a.document.getById(this._.frameId).getFrameDocument();return u.$.forms.length>0?new h(u.$.forms[0].elements[0]):this.getElement();},submit:function(){this.getInputElement().getParent().$.submit();return this;},getAction:function(){return this.getInputElement().getParent().$.action;},registerEvents:function(u){var v=/^on([A-Z]\w+)/,w,x=function(z,A,B,C){z.on('formLoaded',function(){z.getInputElement().on(B,C,z);});};for(var y in u){if(!(w=y.match(v)))continue;
+if(this.eventProcessors[y])this.eventProcessors[y].call(this,this._.dialog,u[y]);else x(this,this._.dialog,w[1].toLowerCase(),u[y]);}return this;},reset:function(){var u=this._,v=a.document.getById(u.frameId),w=v.getFrameDocument(),x=u.definition,y=u.buttons,z=this.formLoadedNumber,A=this.formUnloadNumber,B=u.dialog._.editor.lang.dir,C=u.dialog._.editor.langCode;if(!z){z=this.formLoadedNumber=e.addFunction(function(){this.fire('formLoaded');},this);A=this.formUnloadNumber=e.addFunction(function(){this.getInputElement().clearCustomData();},this);this.getDialog()._.editor.on('destroy',function(){e.removeFunction(z);e.removeFunction(A);});}function D(){w.$.open();if(b.isCustomDomain())w.$.domain=document.domain;var E='';if(x.size)E=x.size-(c?7:0);var F=u.frameId+'_input';w.$.write(['<html dir="'+B+'" lang="'+C+'"><head><title></title></head><body style="margin: 0; overflow: hidden; background: transparent;">','<form enctype="multipart/form-data" method="POST" dir="'+B+'" lang="'+C+'" action="',e.htmlEncode(x.action),'">','<label id="',u.labelId,'" for="',F,'" style="display:none">',e.htmlEncode(x.label),'</label>','<input id="',F,'" aria-labelledby="',u.labelId,'" type="file" name="',e.htmlEncode(x.id||'cke_upload'),'" size="',e.htmlEncode(E>0?E:''),'" />','</form>','</body></html>','<script>window.parent.CKEDITOR.tools.callFunction('+z+');','window.onbeforeunload = function() {window.parent.CKEDITOR.tools.callFunction('+A+')}</script>'].join(''));w.$.close();for(var G=0;G<y.length;G++)y[G].enable();};if(b.gecko)setTimeout(D,500);else D();},getValue:function(){return this.getInputElement().$.value||'';},setInitValue:function(){this._.initValue='';},eventProcessors:{onChange:function(u,v){if(!this._.domOnChangeRegistered){this.on('formLoaded',function(){this.getInputElement().on('change',function(){this.fire('change',{value:this.getValue()});},this);},this);this._.domOnChangeRegistered=true;}this.on('change',v);}},keyboardFocusable:true},true);k.dialog.fileButton.prototype=new k.dialog.button();k.dialog.fieldset.prototype=e.clone(k.dialog.hbox.prototype);a.dialog.addUIElement('text',n);a.dialog.addUIElement('password',n);a.dialog.addUIElement('textarea',o);a.dialog.addUIElement('checkbox',o);a.dialog.addUIElement('radio',o);a.dialog.addUIElement('button',o);a.dialog.addUIElement('select',o);a.dialog.addUIElement('file',o);a.dialog.addUIElement('fileButton',o);a.dialog.addUIElement('html',o);a.dialog.addUIElement('fieldset',p);})();j.add('panel',{beforeInit:function(m){m.ui.addHandler('panel',k.panel.handler);
+}});a.UI_PANEL='panel';k.panel=function(m,n){var o=this;if(n)e.extend(o,n);e.extend(o,{className:'',css:[]});o.id=e.getNextId();o.document=m;o._={blocks:{}};};k.panel.handler={create:function(m){return new k.panel(m);}};k.panel.prototype={renderHtml:function(m){var n=[];this.render(m,n);return n.join('');},render:function(m,n){var p=this;var o=p.id;n.push('<div class="',m.skinClass,'" lang="',m.langCode,'" role="presentation" style="display:none;z-index:'+(m.config.baseFloatZIndex+1)+'">'+'<div'+' id=',o,' dir=',m.lang.dir,' role="presentation" class="cke_panel cke_',m.lang.dir);if(p.className)n.push(' ',p.className);n.push('">');if(p.forceIFrame||p.css.length){n.push('<iframe id="',o,'_frame" frameborder="0" role="application" src="javascript:void(');n.push(b.isCustomDomain()?"(function(){document.open();document.domain='"+document.domain+"';"+'document.close();'+'})()':'0');n.push(')"></iframe>');}n.push('</div></div>');return o;},getHolderElement:function(){var m=this._.holder;if(!m){if(this.forceIFrame||this.css.length){var n=this.document.getById(this.id+'_frame'),o=n.getParent(),p=o.getAttribute('dir'),q=o.getParent().getAttribute('class'),r=o.getParent().getAttribute('lang'),s=n.getFrameDocument();b.iOS&&o.setStyles({overflow:'scroll','-webkit-overflow-scrolling':'touch'});var t=e.addFunction(e.bind(function(w){this.isLoaded=true;if(this.onLoad)this.onLoad();},this)),u='<!DOCTYPE html><html dir="'+p+'" class="'+q+'_container" lang="'+r+'">'+'<head>'+'<style>.'+q+'_container{visibility:hidden}</style>'+e.buildStyleHtml(this.css)+'</head>'+'<body class="cke_'+p+' cke_panel_frame '+b.cssClass+'" style="margin:0;padding:0"'+' onload="( window.CKEDITOR || window.parent.CKEDITOR ).tools.callFunction('+t+');"></body>'+'</html>';s.write(u);var v=s.getWindow();v.$.CKEDITOR=a;s.on('key'+(b.opera?'press':'down'),function(w){var z=this;var x=w.data.getKeystroke(),y=z.document.getById(z.id).getAttribute('dir');if(z._.onKeyDown&&z._.onKeyDown(x)===false){w.data.preventDefault();return;}if(x==27||x==(y=='rtl'?39:37))if(z.onEscape&&z.onEscape(x)===false)w.data.preventDefault();},this);m=s.getBody();m.unselectable();b.air&&e.callFunction(t);}else m=this.document.getById(this.id);this._.holder=m;}return m;},addBlock:function(m,n){var o=this;n=o._.blocks[m]=n instanceof k.panel.block?n:new k.panel.block(o.getHolderElement(),n);if(!o._.currentBlock)o.showBlock(m);return n;},getBlock:function(m){return this._.blocks[m];},showBlock:function(m){var r=this;var n=r._.blocks,o=n[m],p=r._.currentBlock,q=!r.forceIFrame||c?r._.holder:r.document.getById(r.id+'_frame');
+if(p){q.removeAttributes(p.attributes);p.hide();}r._.currentBlock=o;q.setAttributes(o.attributes);a.fire('ariaWidget',q);o._.focusIndex=-1;r._.onKeyDown=o.onKeyDown&&e.bind(o.onKeyDown,o);o.show();return o;},destroy:function(){this.element&&this.element.remove();}};k.panel.block=e.createClass({$:function(m,n){var o=this;o.element=m.append(m.getDocument().createElement('div',{attributes:{tabIndex:-1,'class':'cke_panel_block',role:'presentation'},styles:{display:'none'}}));if(n)e.extend(o,n);if(!o.attributes.title)o.attributes.title=o.attributes['aria-label'];o.keys={};o._.focusIndex=-1;o.element.disableContextMenu();},_:{markItem:function(m){var p=this;if(m==-1)return;var n=p.element.getElementsByTag('a'),o=n.getItem(p._.focusIndex=m);if(b.webkit||b.opera)o.getDocument().getWindow().focus();o.focus();p.onMark&&p.onMark(o);}},proto:{show:function(){this.element.setStyle('display','');},hide:function(){var m=this;if(!m.onHide||m.onHide.call(m)!==true)m.element.setStyle('display','none');},onKeyDown:function(m){var r=this;var n=r.keys[m];switch(n){case 'next':var o=r._.focusIndex,p=r.element.getElementsByTag('a'),q;while(q=p.getItem(++o)){if(q.getAttribute('_cke_focus')&&q.$.offsetWidth){r._.focusIndex=o;q.focus();break;}}return false;case 'prev':o=r._.focusIndex;p=r.element.getElementsByTag('a');while(o>0&&(q=p.getItem(--o))){if(q.getAttribute('_cke_focus')&&q.$.offsetWidth){r._.focusIndex=o;q.focus();break;}}return false;case 'click':case 'mouseup':o=r._.focusIndex;q=o>=0&&r.element.getElementsByTag('a').getItem(o);if(q)q.$[n]?q.$[n]():q.$['on'+n]();return false;}return true;}}});j.add('listblock',{requires:['panel'],onLoad:function(){k.panel.prototype.addListBlock=function(m,n){return this.addBlock(m,new k.listBlock(this.getHolderElement(),n));};k.listBlock=e.createClass({base:k.panel.block,$:function(m,n){var q=this;n=n||{};var o=n.attributes||(n.attributes={});(q.multiSelect=!!n.multiSelect)&&(o['aria-multiselectable']=true);!o.role&&(o.role='listbox');q.base.apply(q,arguments);var p=q.keys;p[40]='next';p[9]='next';p[38]='prev';p[2228224+9]='prev';p[32]=c?'mouseup':'click';c&&(p[13]='mouseup');q._.pendingHtml=[];q._.items={};q._.groups={};},_:{close:function(){if(this._.started){this._.pendingHtml.push('</ul>');delete this._.started;}},getClick:function(){if(!this._.click)this._.click=e.addFunction(function(m){var o=this;var n=true;if(o.multiSelect)n=o.toggle(m);else o.mark(m);if(o.onClick)o.onClick(m,n);},this);return this._.click;}},proto:{add:function(m,n,o){var r=this;
+var p=r._.pendingHtml,q=e.getNextId();if(!r._.started){p.push('<ul role="presentation" class=cke_panel_list>');r._.started=1;r._.size=r._.size||0;}r._.items[m]=q;p.push('<li id=',q,' class=cke_panel_listItem role=presentation><a id="',q,'_option" _cke_focus=1 hidefocus=true title="',o||m,'" href="javascript:void(\'',m,"')\" "+(c?'onclick="return false;" onmouseup':'onclick')+'="CKEDITOR.tools.callFunction(',r._.getClick(),",'",m,"'); return false;\"",' role="option">',n||m,'</a></li>');},startGroup:function(m){this._.close();var n=e.getNextId();this._.groups[m]=n;this._.pendingHtml.push('<h1 role="presentation" id=',n,' class=cke_panel_grouptitle>',m,'</h1>');},commit:function(){var m=this;m._.close();m.element.appendHtml(m._.pendingHtml.join(''));delete m._.size;m._.pendingHtml=[];},toggle:function(m){var n=this.isMarked(m);if(n)this.unmark(m);else this.mark(m);return!n;},hideGroup:function(m){var n=this.element.getDocument().getById(this._.groups[m]),o=n&&n.getNext();if(n){n.setStyle('display','none');if(o&&o.getName()=='ul')o.setStyle('display','none');}},hideItem:function(m){this.element.getDocument().getById(this._.items[m]).setStyle('display','none');},showAll:function(){var m=this._.items,n=this._.groups,o=this.element.getDocument();for(var p in m)o.getById(m[p]).setStyle('display','');for(var q in n){var r=o.getById(n[q]),s=r.getNext();r.setStyle('display','');if(s&&s.getName()=='ul')s.setStyle('display','');}},mark:function(m){var p=this;if(!p.multiSelect)p.unmarkAll();var n=p._.items[m],o=p.element.getDocument().getById(n);o.addClass('cke_selected');p.element.getDocument().getById(n+'_option').setAttribute('aria-selected',true);p.onMark&&p.onMark(o);},unmark:function(m){var q=this;var n=q.element.getDocument(),o=q._.items[m],p=n.getById(o);p.removeClass('cke_selected');n.getById(o+'_option').removeAttribute('aria-selected');q.onUnmark&&q.onUnmark(p);},unmarkAll:function(){var q=this;var m=q._.items,n=q.element.getDocument();for(var o in m){var p=m[o];n.getById(p).removeClass('cke_selected');n.getById(p+'_option').removeAttribute('aria-selected');}q.onUnmark&&q.onUnmark();},isMarked:function(m){return this.element.getDocument().getById(this._.items[m]).hasClass('cke_selected');},focus:function(m){this._.focusIndex=-1;if(m){var n=this.element.getDocument().getById(this._.items[m]).getFirst(),o=this.element.getElementsByTag('a'),p,q=-1;while(p=o.getItem(++q)){if(p.equals(n)){this._.focusIndex=q;break;}}setTimeout(function(){n.focus();},0);}}}});}});a.themes.add('default',(function(){var m={};
+function n(o,p){var q,r;r=o.config.sharedSpaces;r=r&&r[p];r=r&&a.document.getById(r);if(r){var s='<span class="cke_shared " dir="'+o.lang.dir+'"'+'>'+'<span class="'+o.skinClass+' '+o.id+' cke_editor_'+o.name+'">'+'<span class="'+b.cssClass+'">'+'<span class="cke_wrapper cke_'+o.lang.dir+'">'+'<span class="cke_editor">'+'<div class="cke_'+p+'">'+'</div></span></span></span></span></span>',t=r.append(h.createFromHtml(s,r.getDocument()));if(r.getCustomData('cke_hasshared'))t.hide();else r.setCustomData('cke_hasshared',1);q=t.getChild([0,0,0,0]);!o.sharedSpaces&&(o.sharedSpaces={});o.sharedSpaces[p]=q;o.on('focus',function(){for(var u=0,v,w=r.getChildren();v=w.getItem(u);u++){if(v.type==1&&!v.equals(t)&&v.hasClass('cke_shared'))v.hide();}t.show();});o.on('destroy',function(){t.remove();});}return q;};return{build:function(o,p){var q=o.name,r=o.element,s=o.elementMode;if(!r||s==0)return;if(s==1)r.hide();var t=o.fire('themeSpace',{space:'top',html:''}).html,u=o.fire('themeSpace',{space:'contents',html:''}).html,v=o.fireOnce('themeSpace',{space:'bottom',html:''}).html,w=u&&o.config.height,x=o.config.tabIndex||o.element.getAttribute('tabindex')||0;if(!u)w='auto';else if(!isNaN(w))w+='px';var y='',z=o.config.width;if(z){if(!isNaN(z))z+='px';y+='width: '+z+';';}var A=t&&n(o,'top'),B=n(o,'bottom');A&&(A.setHtml(t),t='');B&&(B.setHtml(v),v='');var C='<style>.'+o.skinClass+'{visibility:hidden;}</style>';if(m[o.skinClass])C='';else m[o.skinClass]=1;var D=h.createFromHtml(['<span id="cke_',q,'" class="',o.skinClass,' ',o.id,' cke_editor_',q,'" dir="',o.lang.dir,'" title="',b.gecko?' ':'','" lang="',o.langCode,'"'+(b.webkit?' tabindex="'+x+'"':'')+' role="application"'+' aria-labelledby="cke_',q,'_arialbl"'+(y?' style="'+y+'"':'')+'>'+'<span id="cke_',q,'_arialbl" class="cke_voice_label">'+o.lang.editor+'</span>'+'<span class="',b.cssClass,'" role="presentation"><span class="cke_wrapper cke_',o.lang.dir,'" role="presentation"><table class="cke_editor" border="0" cellspacing="0" cellpadding="0" role="presentation"><tbody><tr',t?'':' style="display:none"',' role="presentation"><td id="cke_top_',q,'" class="cke_top" role="presentation">',t,'</td></tr><tr',u?'':' style="display:none"',' role="presentation"><td id="cke_contents_',q,'" class="cke_contents" style="height:',w,'" role="presentation">',u,'</td></tr><tr',v?'':' style="display:none"',' role="presentation"><td id="cke_bottom_',q,'" class="cke_bottom" role="presentation">',v,'</td></tr></tbody></table>'+C+'</span>'+'</span>'+'</span>'].join(''));
+D.getChild([1,0,0,0,0]).unselectable();D.getChild([1,0,0,0,2]).unselectable();if(s==1)D.insertAfter(r);else r.append(D);o.container=D;D.disableContextMenu();o.on('contentDirChanged',function(E){var F=(o.lang.dir!=E.data?'add':'remove')+'Class';D.getChild(1)[F]('cke_mixed_dir_content');var G=this.sharedSpaces&&this.sharedSpaces[this.config.toolbarLocation];G&&G.getParent().getParent()[F]('cke_mixed_dir_content');});o.fireOnce('themeLoaded');o.fireOnce('uiReady');},buildDialog:function(o){var p=e.getNextNumber(),q=h.createFromHtml(['<div class="',o.id,'_dialog cke_editor_',o.name.replace('.','\\.'),'_dialog cke_skin_',o.skinName,'" dir="',o.lang.dir,'" lang="',o.langCode,'" role="dialog" aria-labelledby="%title#"><table class="cke_dialog',' '+b.cssClass,' cke_',o.lang.dir,'" style="position:absolute" role="presentation"><tr><td role="presentation"><div class="%body" role="presentation"><div id="%title#" class="%title" role="presentation"></div><a id="%close_button#" class="%close_button" href="javascript:void(0)" title="'+o.lang.common.close+'" role="button"><span class="cke_label">X</span></a>'+'<div id="%tabs#" class="%tabs" role="tablist"></div>'+'<table class="%contents" role="presentation">'+'<tr>'+'<td id="%contents#" class="%contents" role="presentation"></td>'+'</tr>'+'<tr>'+'<td id="%footer#" class="%footer" role="presentation"></td>'+'</tr>'+'</table>'+'</div>'+'<div id="%tl#" class="%tl"></div>'+'<div id="%tc#" class="%tc"></div>'+'<div id="%tr#" class="%tr"></div>'+'<div id="%ml#" class="%ml"></div>'+'<div id="%mr#" class="%mr"></div>'+'<div id="%bl#" class="%bl"></div>'+'<div id="%bc#" class="%bc"></div>'+'<div id="%br#" class="%br"></div>'+'</td></tr>'+'</table>',c?'':'<style>.cke_dialog{visibility:hidden;}</style>','</div>'].join('').replace(/#/g,'_'+p).replace(/%/g,'cke_dialog_')),r=q.getChild([0,0,0,0,0]),s=r.getChild(0),t=r.getChild(1);if(c&&!b.ie6Compat){var u=b.isCustomDomain(),v='javascript:void(function(){'+encodeURIComponent('document.open();'+(u?'document.domain="'+document.domain+'";':'')+'document.close();')+'}())',w=h.createFromHtml('<iframe frameBorder="0" class="cke_iframe_shim" src="'+v+'"'+' tabIndex="-1"'+'></iframe>');w.appendTo(r.getParent());}s.unselectable();t.unselectable();return{element:q,parts:{dialog:q.getChild(0),title:s,close:t,tabs:r.getChild(2),contents:r.getChild([3,0,0,0]),footer:r.getChild([3,0,1,0])}};},destroy:function(o){var p=o.container,q=o.element;if(p){p.clearCustomData();p.remove();}if(q){q.clearCustomData();
+o.elementMode==1&&q.show();delete o.element;}}};})());a.editor.prototype.getThemeSpace=function(m){var n='cke_'+m,o=this._[n]||(this._[n]=a.document.getById(n+'_'+this.name));return o;};a.editor.prototype.resize=function(m,n,o,p){var v=this;var q=v.container,r=a.document.getById('cke_contents_'+v.name),s=b.webkit&&v.document&&v.document.getWindow().$.frameElement,t=p?q.getChild(1):q;t.setSize('width',m,true);s&&(s.style.width='1%');var u=o?0:(t.$.offsetHeight||0)-(r.$.clientHeight||0);r.setStyle('height',Math.max(n-u,0)+'px');s&&(s.style.width='100%');v.fire('resize');};a.editor.prototype.getResizable=function(m){return m?a.document.getById('cke_contents_'+this.name):this.container;};})();
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/config.js b/sm-shop/src/main/webapp/resources/js/ckeditor/config.js
index 44dd1e4..d56e510 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/config.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/config.js
@@ -1,11 +1,11 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.editorConfig = function( config )
-{
- // Define changes to default configuration here. For example:
- // config.language = 'fr';
- // config.uiColor = '#AADC6E';
-};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.editorConfig = function( config )
+{
+ // Define changes to default configuration here. For example:
+ // config.language = 'fr';
+ // config.uiColor = '#AADC6E';
+};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/_languages.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/_languages.js
index b738583..ead1fb9 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/_languages.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/_languages.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-var CKEDITOR_LANGS=(function(){var b={af:'Afrikaans',ar:'Arabic',bg:'Bulgarian',bn:'Bengali/Bangla',bs:'Bosnian',ca:'Catalan',cs:'Czech',cy:'Welsh',da:'Danish',de:'German',el:'Greek',en:'English','en-au':'English (Australia)','en-ca':'English (Canadian)','en-gb':'English (United Kingdom)',eo:'Esperanto',es:'Spanish',et:'Estonian',eu:'Basque',fa:'Persian',fi:'Finnish',fo:'Faroese',fr:'French','fr-ca':'French (Canada)',gl:'Galician',gu:'Gujarati',he:'Hebrew',hi:'Hindi',hr:'Croatian',hu:'Hungarian',is:'Icelandic',it:'Italian',ja:'Japanese',ka:'Georgian',km:'Khmer',ko:'Korean',lt:'Lithuanian',lv:'Latvian',mn:'Mongolian',ms:'Malay',nb:'Norwegian Bokmal',nl:'Dutch',no:'Norwegian',pl:'Polish',pt:'Portuguese (Portugal)','pt-br':'Portuguese (Brazil)',ro:'Romanian',ru:'Russian',sk:'Slovak',sl:'Slovenian',sr:'Serbian (Cyrillic)','sr-latn':'Serbian (Latin)',sv:'Swedish',th:'Thai',tr:'Turkish',uk:'Ukrainian',vi:'Vietnamese',zh:'Chinese Traditional','zh-cn':'Chinese Simplified'},c=[];for(var d in b)c.push({code:d,name:b[d]});c.sort(function(e,f){return e.name<f.name?-1:1;});return c;})();
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+var CKEDITOR_LANGS=(function(){var b={af:'Afrikaans',ar:'Arabic',bg:'Bulgarian',bn:'Bengali/Bangla',bs:'Bosnian',ca:'Catalan',cs:'Czech',cy:'Welsh',da:'Danish',de:'German',el:'Greek',en:'English','en-au':'English (Australia)','en-ca':'English (Canadian)','en-gb':'English (United Kingdom)',eo:'Esperanto',es:'Spanish',et:'Estonian',eu:'Basque',fa:'Persian',fi:'Finnish',fo:'Faroese',fr:'French','fr-ca':'French (Canada)',gl:'Galician',gu:'Gujarati',he:'Hebrew',hi:'Hindi',hr:'Croatian',hu:'Hungarian',is:'Icelandic',it:'Italian',ja:'Japanese',ka:'Georgian',km:'Khmer',ko:'Korean',lt:'Lithuanian',lv:'Latvian',mn:'Mongolian',ms:'Malay',nb:'Norwegian Bokmal',nl:'Dutch',no:'Norwegian',pl:'Polish',pt:'Portuguese (Portugal)','pt-br':'Portuguese (Brazil)',ro:'Romanian',ru:'Russian',sk:'Slovak',sl:'Slovenian',sr:'Serbian (Cyrillic)','sr-latn':'Serbian (Latin)',sv:'Swedish',th:'Thai',tr:'Turkish',uk:'Ukrainian',vi:'Vietnamese',zh:'Chinese Traditional','zh-cn':'Chinese Simplified'},c=[];for(var d in b)c.push({code:d,name:b[d]});c.sort(function(e,f){return e.name<f.name?-1:1;});return c;})();
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/_translationstatus.txt b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/_translationstatus.txt
index 467a733..4a7c033 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/_translationstatus.txt
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/_translationstatus.txt
@@ -1,64 +1,64 @@
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-
-af.js Found: 548 Missing: 29
-ar.js Found: 470 Missing: 107
-bg.js Found: 394 Missing: 183
-bn.js Found: 292 Missing: 285
-bs.js Found: 175 Missing: 402
-ca.js Found: 549 Missing: 28
-cs.js Found: 577 Missing: 0
-cy.js Found: 575 Missing: 2
-da.js Found: 575 Missing: 2
-de.js Found: 575 Missing: 2
-el.js Found: 391 Missing: 186
-en-au.js Found: 347 Missing: 230
-en-ca.js Found: 345 Missing: 232
-en-gb.js Found: 517 Missing: 60
-eo.js Found: 577 Missing: 0
-es.js Found: 575 Missing: 2
-et.js Found: 577 Missing: 0
-eu.js Found: 417 Missing: 160
-fa.js Found: 575 Missing: 2
-fi.js Found: 575 Missing: 2
-fo.js Found: 575 Missing: 2
-fr-ca.js Found: 319 Missing: 258
-fr.js Found: 575 Missing: 2
-gl.js Found: 292 Missing: 285
-gu.js Found: 575 Missing: 2
-he.js Found: 575 Missing: 2
-hi.js Found: 327 Missing: 250
-hr.js Found: 575 Missing: 2
-hu.js Found: 572 Missing: 5
-id.js Found: 1 Missing: 576
-is.js Found: 326 Missing: 251
-it.js Found: 577 Missing: 0
-ja.js Found: 493 Missing: 84
-ka.js Found: 568 Missing: 9
-km.js Found: 286 Missing: 291
-ko.js Found: 304 Missing: 273
-lt.js Found: 575 Missing: 2
-lv.js Found: 294 Missing: 283
-mk.js Found: 0 Missing: 577
-mn.js Found: 320 Missing: 257
-ms.js Found: 276 Missing: 301
-nb.js Found: 577 Missing: 0
-nl.js Found: 575 Missing: 2
-no.js Found: 577 Missing: 0
-pl.js Found: 575 Missing: 2
-pt-br.js Found: 577 Missing: 0
-pt.js Found: 326 Missing: 251
-ro.js Found: 432 Missing: 145
-ru.js Found: 575 Missing: 2
-sk.js Found: 364 Missing: 213
-sl.js Found: 426 Missing: 151
-sr-latn.js Found: 287 Missing: 290
-sr.js Found: 286 Missing: 291
-sv.js Found: 550 Missing: 27
-th.js Found: 298 Missing: 279
-tr.js Found: 575 Missing: 2
-ug.js Found: 572 Missing: 5
-uk.js Found: 575 Missing: 2
-vi.js Found: 577 Missing: 0
-zh-cn.js Found: 577 Missing: 0
-zh.js Found: 433 Missing: 144
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+
+af.js Found: 548 Missing: 29
+ar.js Found: 470 Missing: 107
+bg.js Found: 394 Missing: 183
+bn.js Found: 292 Missing: 285
+bs.js Found: 175 Missing: 402
+ca.js Found: 549 Missing: 28
+cs.js Found: 577 Missing: 0
+cy.js Found: 575 Missing: 2
+da.js Found: 575 Missing: 2
+de.js Found: 575 Missing: 2
+el.js Found: 391 Missing: 186
+en-au.js Found: 347 Missing: 230
+en-ca.js Found: 345 Missing: 232
+en-gb.js Found: 517 Missing: 60
+eo.js Found: 577 Missing: 0
+es.js Found: 575 Missing: 2
+et.js Found: 577 Missing: 0
+eu.js Found: 417 Missing: 160
+fa.js Found: 575 Missing: 2
+fi.js Found: 575 Missing: 2
+fo.js Found: 575 Missing: 2
+fr-ca.js Found: 319 Missing: 258
+fr.js Found: 575 Missing: 2
+gl.js Found: 292 Missing: 285
+gu.js Found: 575 Missing: 2
+he.js Found: 575 Missing: 2
+hi.js Found: 327 Missing: 250
+hr.js Found: 575 Missing: 2
+hu.js Found: 572 Missing: 5
+id.js Found: 1 Missing: 576
+is.js Found: 326 Missing: 251
+it.js Found: 577 Missing: 0
+ja.js Found: 493 Missing: 84
+ka.js Found: 568 Missing: 9
+km.js Found: 286 Missing: 291
+ko.js Found: 304 Missing: 273
+lt.js Found: 575 Missing: 2
+lv.js Found: 294 Missing: 283
+mk.js Found: 0 Missing: 577
+mn.js Found: 320 Missing: 257
+ms.js Found: 276 Missing: 301
+nb.js Found: 577 Missing: 0
+nl.js Found: 575 Missing: 2
+no.js Found: 577 Missing: 0
+pl.js Found: 575 Missing: 2
+pt-br.js Found: 577 Missing: 0
+pt.js Found: 326 Missing: 251
+ro.js Found: 432 Missing: 145
+ru.js Found: 575 Missing: 2
+sk.js Found: 364 Missing: 213
+sl.js Found: 426 Missing: 151
+sr-latn.js Found: 287 Missing: 290
+sr.js Found: 286 Missing: 291
+sv.js Found: 550 Missing: 27
+th.js Found: 298 Missing: 279
+tr.js Found: 575 Missing: 2
+ug.js Found: 572 Missing: 5
+uk.js Found: 575 Missing: 2
+vi.js Found: 577 Missing: 0
+zh-cn.js Found: 577 Missing: 0
+zh.js Found: 433 Missing: 144
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/af.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/af.js
index 8cc3c7c..a408661 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/af.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/af.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.af={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Teksverwerker',source:'Bron',newPage:'Nuwe bladsy',save:'Bewaar',preview:'Voorbeeld',cut:'Knip',copy:'Kopiëer',paste:'Plak',print:'Druk',underline:'Onderstreep',bold:'Vet',italic:'Skuins',selectAll:'Selekteer alles',removeFormat:'Verwyder opmaak',strike:'Deurstreep',subscript:'Onderskrif',superscript:'Bo-skrif',horizontalrule:'Horisontale lyn invoeg',pagebreak:'Bladsy-einde invoeg',pagebreakAlt:'Bladsy-einde',unlink:'Verwyder skakel',undo:'Ontdoen',redo:'Oordoen',common:{browseServer:'Blaai op bediener',url:'URL',protocol:'Protokol',upload:'Oplaai',uploadSubmit:'Stuur na bediener',image:'Afbeelding',flash:'Flash',form:'Vorm',checkbox:'Merkhokkie',radio:'Radioknoppie',textField:'Teksveld',textarea:'Teks-area',hiddenField:'Blinde veld',button:'Knop',select:'Keuseveld',imageButton:'Afbeeldingsknop',notSet:'<geen instelling>',id:'Id',name:'Naam',langDir:'Skryfrigting',langDirLtr:'Links na regs (LTR)',langDirRtl:'Regs na links (RTL)',langCode:'Taalkode',longDescr:'Lang beskrywing URL',cssClass:'CSS klasse',advisoryTitle:'Aanbevole titel',cssStyle:'Styl',ok:'OK',cancel:'Kanselleer',close:'Sluit',preview:'Voorbeeld',generalTab:'Algemeen',advancedTab:'Gevorderd',validateNumberFailed:"Hierdie waarde is nie 'n getal nie.",confirmNewPage:"Alle wysiginge sal verlore gaan. Is u seker dat u 'n nuwe bladsy wil laai?",confirmCancel:'Sommige opsies is gewysig. Is u seker dat u hierdie dialoogvenster wil sluit?',options:'Opsies',target:'Doel',targetNew:'Nuwe venster (_blank)',targetTop:'Boonste venster (_top)',targetSelf:'Selfde venster (_self)',targetParent:'Oorspronklike venster (_parent)',langDirLTR:'Links na Regs (LTR)',langDirRTL:'Regs na Links (RTL)',styles:'Styl',cssClasses:'CSS klasse',width:'Breedte',height:'Hoogte',align:'Oplyn',alignLeft:'Links',alignRight:'Regs',alignCenter:'Sentreer',alignTop:'Bo',alignMiddle:'Middel',alignBottom:'Onder',invalidHeight:"Hoogte moet 'n getal wees",invalidWidth:"Breedte moet 'n getal wees.",invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, nie beskikbaar nie</span>'},contextmenu:{options:'Konteks Spyskaart-opsies'},specialChar:{toolbar:'Voeg spesiaale karakter in',title:'Kies spesiale karakter',options:'Spesiale karakter-opsies'},link:{toolbar:'Skakel invoeg/wysig',other:'<ander>',menu:'Wysig skakel',title:'Skakel',info:'Skakel informasie',target:'Doel',upload:'Oplaai',advanced:'Gevorderd',type:'Skakelsoort',toUrl:'URL',toAnchor:'Anker in bladsy',toEmail:'E-pos',targetFrame:'<raam>',targetPopup:'<opspringvenster>',targetFrameName:'Naam van doelraam',targetPopupName:'Naam van opspringvenster',popupFeatures:'Eienskappe van opspringvenster',popupResizable:'Herskaalbaar',popupStatusBar:'Statusbalk',popupLocationBar:'Adresbalk',popupToolbar:'Werkbalk',popupMenuBar:'Spyskaartbalk',popupFullScreen:'Volskerm (IE)',popupScrollBars:'Skuifbalke',popupDependent:'Afhanklik (Netscape)',popupLeft:'Posisie links',popupTop:'Posisie bo',id:'Id',langDir:'Skryfrigting',langDirLTR:'Links na regs (LTR)',langDirRTL:'Regs na links (RTL)',acccessKey:'Toegangsleutel',name:'Naam',langCode:'Taalkode',tabIndex:'Tab indeks',advisoryTitle:'Aanbevole titel',advisoryContentType:'Aanbevole inhoudstipe',cssClasses:'CSS klasse',charset:'Karakterstel van geskakelde bron',styles:'Styl',rel:'Relationship',selectAnchor:"Kies 'n anker",anchorName:'Op ankernaam',anchorId:'Op element Id',emailAddress:'E-posadres',emailSubject:'Berig-onderwerp',emailBody:'Berig-inhoud',noAnchors:'(Geen ankers beskikbaar in dokument)',noUrl:'Gee die skakel se URL',noEmail:'Gee die e-posadres'},anchor:{toolbar:'Anker byvoeg/verander',menu:'Anker-eienskappe',title:'Anker-eienskappe',name:'Ankernaam',errorName:'Voltooi die ankernaam asseblief',remove:'Remove Anchor'},list:{numberedTitle:'Eienskappe van genommerde lys',bulletedTitle:'Eienskappe van ongenommerde lys',type:'Tipe',start:'Begin',validateStartNumber:"Beginnommer van lys moet 'n heelgetal wees.",circle:'Sirkel',disc:'Skyf',square:'Vierkant',none:'Geen',notset:'<nie ingestel nie>',armenian:'Armeense nommering',georgian:'Georgiese nommering (an, ban, gan, ens.)',lowerRoman:'Romeinse kleinletters (i, ii, iii, iv, v, ens.)',upperRoman:'Romeinse hoofletters (I, II, III, IV, V, ens.)',lowerAlpha:'Kleinletters (a, b, c, d, e, ens.)',upperAlpha:'Hoofletters (A, B, C, D, E, ens.)',lowerGreek:'Griekse kleinletters (alpha, beta, gamma, ens.)',decimal:'Desimale syfers (1, 2, 3, ens.)',decimalLeadingZero:'Desimale syfers met voorloopnul (01, 02, 03, ens.)'},findAndReplace:{title:'Soek en vervang',find:'Soek',replace:'Vervang',findWhat:'Soek na:',replaceWith:'Vervang met:',notFoundMsg:'Teks nie gevind nie.',findOptions:'Find Options',matchCase:'Hoof/kleinletter sensitief',matchWord:'Hele woord moet voorkom',matchCyclic:'Soek deurlopend',replaceAll:'Vervang alles',replaceSuccessMsg:'%1 voorkoms(te) vervang.'},table:{toolbar:'Tabel',title:'Tabel eienskappe',menu:'Tabel eienskappe',deleteTable:'Verwyder tabel',rows:'Rye',columns:'Kolomme',border:'Randbreedte',widthPx:'piksels',widthPc:'persent',widthUnit:'breedte-eenheid',cellSpace:'Sel-afstand',cellPad:'Sel-spasie',caption:'Naam',summary:'Opsomming',headers:'Opskrifte',headersNone:'Geen',headersColumn:'Eerste kolom',headersRow:'Eerste ry',headersBoth:'Beide ',invalidRows:"Aantal rye moet 'n getal groter as 0 wees.",invalidCols:"Aantal kolomme moet 'n getal groter as 0 wees.",invalidBorder:"Randbreedte moet 'n getal wees.",invalidWidth:"Tabelbreedte moet 'n getal wees.",invalidHeight:"Tabelhoogte moet 'n getal wees.",invalidCellSpacing:"Sel-afstand moet 'n getal wees.",invalidCellPadding:"Sel-spasie moet 'n getal wees.",cell:{menu:'Sel',insertBefore:'Voeg sel in voor',insertAfter:'Voeg sel in na',deleteCell:'Verwyder sel',merge:'Voeg selle saam',mergeRight:'Voeg saam na regs',mergeDown:'Voeg saam ondertoe',splitHorizontal:'Splits sel horisontaal',splitVertical:'Splits sel vertikaal',title:'Sel eienskappe',cellType:'Sel tipe',rowSpan:'Omspan rye',colSpan:'Omspan kolomme',wordWrap:'Woord terugloop',hAlign:'Horisontale oplyning',vAlign:'Vertikale oplyning',alignBaseline:'Basislyn',bgColor:'Agtergrondkleur',borderColor:'Randkleur',data:'Inhoud',header:'Opskrif',yes:'Ja',no:'Nee',invalidWidth:"Selbreedte moet 'n getal wees.",invalidHeight:"Selhoogte moet 'n getal wees.",invalidRowSpan:"Omspan rye moet 'n heelgetal wees.",invalidColSpan:"Omspan kolomme moet 'n heelgetal wees.",chooseColor:'Kies'},row:{menu:'Ry',insertBefore:'Voeg ry in voor',insertAfter:'Voeg ry in na',deleteRow:'Verwyder ry'},column:{menu:'Kolom',insertBefore:'Voeg kolom in voor',insertAfter:'Voeg kolom in na',deleteColumn:'Verwyder kolom'}},button:{title:'Knop eienskappe',text:'Teks (Waarde)',type:'Soort',typeBtn:'Knop',typeSbm:'Stuur',typeRst:'Maak leeg'},checkboxAndRadio:{checkboxTitle:'Merkhokkie eienskappe',radioTitle:'Radioknoppie eienskappe',value:'Waarde',selected:'Geselekteer'},form:{title:'Vorm eienskappe',menu:'Vorm eienskappe',action:'Aksie',method:'Metode',encoding:'Kodering'},select:{title:'Keuseveld eienskappe',selectInfo:'Info',opAvail:'Beskikbare opsies',value:'Waarde',size:'Grootte',lines:'Lyne',chkMulti:'Laat meer as een keuse toe',opText:'Teks',opValue:'Waarde',btnAdd:'Byvoeg',btnModify:'Wysig',btnUp:'Op',btnDown:'Af',btnSetValue:'Stel as geselekteerde waarde',btnDelete:'Verwyder'},textarea:{title:'Teks-area eienskappe',cols:'Kolomme',rows:'Rye'},textfield:{title:'Teksveld eienskappe',name:'Naam',value:'Waarde',charWidth:'Breedte (karakters)',maxChars:'Maksimum karakters',type:'Soort',typeText:'Teks',typePass:'Wagwoord'},hidden:{title:'Verborge veld eienskappe',name:'Naam',value:'Waarde'},image:{title:'Afbeelding eienskappe',titleButton:'Afbeeldingsknop eienskappe',menu:'Afbeelding eienskappe',infoTab:'Afbeelding informasie',btnUpload:'Stuur na bediener',upload:'Oplaai',alt:'Alternatiewe teks',lockRatio:'Vaste proporsie',resetSize:'Herstel grootte',border:'Rand',hSpace:'HSpasie',vSpace:'VSpasie',alertUrl:'Gee URL van afbeelding.',linkTab:'Skakel',button2Img:"Wil u die geselekteerde afbeeldingsknop vervang met 'n eenvoudige afbeelding?",img2Button:"Wil u die geselekteerde afbeelding vervang met 'n afbeeldingsknop?",urlMissing:'Die URL na die afbeelding ontbreek.',validateBorder:"Rand moet 'n heelgetal wees.",validateHSpace:"HSpasie moet 'n heelgetal wees.",validateVSpace:"VSpasie moet 'n heelgetal wees."},flash:{properties:'Flash eienskappe',propertiesTab:'Eienskappe',title:'Flash eienskappe',chkPlay:'Speel outomaties',chkLoop:'Herhaal',chkMenu:'Flash spyskaart aan',chkFull:'Laat volledige skerm toe',scale:'Skaal',scaleAll:'Wys alles',scaleNoBorder:'Geen rand',scaleFit:'Presiese pas',access:'Skrip toegang',accessAlways:'Altyd',accessSameDomain:'Selfde domeinnaam',accessNever:'Nooit',alignAbsBottom:'Absoluut-onder',alignAbsMiddle:'Absoluut-middel',alignBaseline:'Basislyn',alignTextTop:'Teks bo',quality:'Kwaliteit',qualityBest:'Beste',qualityHigh:'Hoog',qualityAutoHigh:'Outomaties hoog',qualityMedium:'Gemiddeld',qualityAutoLow:'Outomaties laag',qualityLow:'Laag',windowModeWindow:'Venster',windowModeOpaque:'Ondeursigtig',windowModeTransparent:'Deursigtig',windowMode:'Venster modus',flashvars:'Veranderlikes vir Flash',bgcolor:'Agtergrondkleur',hSpace:'HSpasie',vSpace:'VSpasie',validateSrc:'Voeg die URL in',validateHSpace:"HSpasie moet 'n heelgetal wees.",validateVSpace:"VSpasie moet 'n heelgetal wees."},spellCheck:{toolbar:'Speltoets',title:'Speltoetser',notAvailable:'Jammer, hierdie diens is nie nou beskikbaar nie.',errorLoading:'Fout by inlaai van diens: %s.',notInDic:'Nie in woordeboek nie',changeTo:'Verander na',btnIgnore:'Ignoreer',btnIgnoreAll:'Ignoreer alles',btnReplace:'Vervang',btnReplaceAll:'vervang alles',btnUndo:'Ontdoen',noSuggestions:'- Geen voorstel -',progress:'Spelling word getoets...',noMispell:'Klaar met speltoets: Geen foute nie',noChanges:'Klaar met speltoets: Geen woorde verander nie',oneChange:'Klaar met speltoets: Een woord verander',manyChanges:'Klaar met speltoets: %1 woorde verander',ieSpellDownload:'Speltoetser is nie geïnstalleer nie. Wil u dit nou aflaai?'},smiley:{toolbar:'Lagbekkie',title:'Voeg lagbekkie by',options:'Lagbekkie opsies'},elementsPath:{eleLabel:'Elemente-pad',eleTitle:'%1 element'},numberedlist:'Genommerde lys',bulletedlist:'Ongenommerde lys',indent:'Vergroot inspring',outdent:'Verklein inspring',justify:{left:'Links oplyn',center:'Sentreer',right:'Regs oplyn',block:'Uitvul'},blockquote:'Sitaatblok',clipboard:{title:'Byvoeg',cutError:'U blaaier se sekuriteitsinstelling belet die outomatiese knip-aksie. Gebruik die sleutelbordkombinasie (Ctrl/Cmd+X).',copyError:'U blaaier se sekuriteitsinstelling belet die kopiëringsaksie. Gebruik die sleutelbordkombinasie (Ctrl/Cmd+C).',pasteMsg:'Plak die teks in die volgende teks-area met die sleutelbordkombinasie (<STRONG>Ctrl/Cmd+V</STRONG>) en druk <STRONG>OK</STRONG>.',securityMsg:'Weens u blaaier se sekuriteitsinstelling is data op die knipbord nie toeganklik nie. U kan dit eers weer in hierdie venster plak.',pasteArea:'Plak-area'},pastefromword:{confirmCleanup:'Die teks wat u wil plak lyk asof dit uit Word gekopiëer is. Wil u dit eers skoonmaak voordat dit geplak word?',toolbar:'Plak vanuit Word',title:'Plak vanuit Word',error:"Die geplakte teks kon nie skoongemaak word nie, weens 'n interne fout"},pasteText:{button:'Plak as eenvoudige teks',title:'Plak as eenvoudige teks'},templates:{button:'Sjablone',title:'Inhoud Sjablone',options:'Sjabloon opsies',insertOption:'Vervang huidige inhoud',selectPromptMsg:'Kies die sjabloon om te gebruik in die redigeerder (huidige inhoud gaan verlore):',emptyListMsg:'(Geen sjablone gedefineer nie)'},showBlocks:'Toon blokke',stylesCombo:{label:'Styl',panelTitle:'Opmaak style',panelTitle1:'Blok style',panelTitle2:'Inlyn style',panelTitle3:'Objek style'},format:{label:'Opmaak',panelTitle:'Opmaak',tag_p:'Normaal',tag_pre:'Opgemaak',tag_address:'Adres',tag_h1:'Opskrif 1',tag_h2:'Opskrif 2',tag_h3:'Opskrif 3',tag_h4:'Opskrif 4',tag_h5:'Opskrif 5',tag_h6:'Opskrif 6',tag_div:'Normaal (DIV)'},div:{title:'Skep Div houer',toolbar:'Skep Div houer',cssClassInputLabel:'CSS klasse',styleSelectLabel:'Styl',IdInputLabel:'Id',languageCodeInputLabel:' Taalkode',inlineStyleInputLabel:'Inlyn Styl',advisoryTitleInputLabel:'Aanbevole Titel',langDirLabel:'Skryfrigting',langDirLTRLabel:'Links na regs (LTR)',langDirRTLLabel:'Regs na links (RTL)',edit:'Wysig Div',remove:'Verwyder Div'},iframe:{title:'IFrame Eienskappe',toolbar:'IFrame',noUrl:'Gee die iframe URL',scrolling:'Skuifbalke aan',border:'Wys rand van raam'},font:{label:'Font',voiceLabel:'Font',panelTitle:'Fontnaam'},fontSize:{label:'Grootte',voiceLabel:'Fontgrootte',panelTitle:'Fontgrootte'},colorButton:{textColorTitle:'Tekskleur',bgColorTitle:'Agtergrondkleur',panelTitle:'Kleure',auto:'Outomaties',more:'Meer Kleure...'},colors:{'000':'Swart',800000:'Meroen','8B4513':'Sjokoladebruin','2F4F4F':'Donkerleisteengrys','008080':'Blougroen','000080':'Vlootblou','4B0082':'Indigo',696969:'Donkergrys',B22222:'Rooibaksteen',A52A2A:'Bruin',DAA520:'Donkergeel','006400':'Donkergroen','40E0D0':'Turkoois','0000CD':'Middelblou',800080:'Pers',808080:'Grys',F00:'Rooi',FF8C00:'Donkeroranje',FFD700:'Goud','008000':'Groen','0FF':'Siaan','00F':'Blou',EE82EE:'Viooltjieblou',A9A9A9:'Donkergrys',FFA07A:'Ligsalm',FFA500:'Oranje',FFFF00:'Geel','00FF00':'Lemmetjie',AFEEEE:'Ligturkoois',ADD8E6:'Ligblou',DDA0DD:'Pruim',D3D3D3:'Liggrys',FFF0F5:'Linne',FAEBD7:'Ivoor',FFFFE0:'Liggeel',F0FFF0:'Heuningdou',F0FFFF:'Asuur',F0F8FF:'Ligte hemelsblou',E6E6FA:'Laventel',FFF:'Wit'},scayt:{title:'Speltoets terwyl u tik',opera_title:'Nie ondersteun deur Opera nie',enable:'SCAYT aan',disable:'SCAYT af',about:'SCAYT info',toggle:'SCAYT wissel aan/af',options:'Opsies',langs:'Tale',moreSuggestions:'Meer voorstelle',ignore:'Ignoreer',ignoreAll:'Ignoreer alles',addWord:'Voeg woord by',emptyDic:'Woordeboeknaam mag nie leeg wees nie.',optionsTab:'Opsies',allCaps:'Ignoreer woorde in hoofletters',ignoreDomainNames:'Ignoreer domeinname',mixedCase:'Ignoreer woorde met hoof- en kleinletters',mixedWithDigits:'Ignoreer woorde met syfers',languagesTab:'Tale',dictionariesTab:'Woordeboeke',dic_field_name:'Naam van woordeboek',dic_create:'Skep',dic_restore:'Herstel',dic_delete:'Verwijder',dic_rename:'Hernoem',dic_info:"Aanvanklik word die gebruikerswoordeboek in 'n koekie gestoor. Koekies is egter beperk in grootte. Wanneer die gebruikerswoordeboek te groot vir 'n koekie geword het, kan dit op ons bediener gestoor word. Om u persoonlike woordeboek op ons bediener te stoor, gee asb. 'n naam vir u woordeboek. Indien u alreeds 'n gestoorde woordeboek het, tik die naam en kliek op die Herstel knop.",aboutTab:'Info'},about:{title:'Info oor CKEditor',dlgTitle:'Info oor CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'Vir lisensie-informasie, besoek asb. ons webwerf:',copy:'Kopiereg © $1. Alle regte voorbehou.'},maximize:'Maksimaliseer',minimize:'Minimaliseer',fakeobjects:{anchor:'Anker',flash:'Flash animasie',iframe:'IFrame',hiddenfield:'Verborge veld',unknown:'Onbekende objek'},resize:'Sleep om te herskaal',colordialog:{title:'Kies kleur',options:'Kleuropsies',highlight:'Aktief',selected:'Geselekteer',clear:'Herstel'},toolbarCollapse:'Verklein werkbalk',toolbarExpand:'Vergroot werkbalk',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Skryfrigting van links na regs',rtl:'Skryfrigting van regs na links'},docprops:{label:'Dokument Eienskappe',title:'Dokument Eienskappe',design:'Design',meta:'Meta Data',chooseColor:'Kies',other:'<ander>',docTitle:'Bladsy Opskrif',charset:'Karakterstel Kodeering',charsetOther:'Ander Karakterstel Kodeering',charsetASCII:'ASCII',charsetCE:'Sentraal Europa',charsetCT:'Chinees Traditioneel (Big5)',charsetCR:'Cyrillic',charsetGR:'Grieks',charsetJP:'Japanees',charsetKR:'Koreans',charsetTR:'Turks',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Dokument Opskrif Soort',docTypeOther:'Ander Dokument Opskrif Soort',xhtmlDec:'Voeg XHTML verklaring by',bgColor:'Agtergrond kleur',bgImage:'Agtergrond Beeld URL',bgFixed:'Vasgeklemde Agtergrond',txtColor:'Tekskleur',margin:'Bladsy Rante',marginTop:'Bo',marginLeft:'Links',marginRight:'Regs',marginBottom:'Onder',metaKeywords:'Dokument Index Sleutelwoorde(comma verdeelt)',metaDescription:'Dokument Beskrywing',metaAuthor:'Skrywer',metaCopyright:'Kopiereg',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.af={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Teksverwerker',source:'Bron',newPage:'Nuwe bladsy',save:'Bewaar',preview:'Voorbeeld',cut:'Knip',copy:'Kopiëer',paste:'Plak',print:'Druk',underline:'Onderstreep',bold:'Vet',italic:'Skuins',selectAll:'Selekteer alles',removeFormat:'Verwyder opmaak',strike:'Deurstreep',subscript:'Onderskrif',superscript:'Bo-skrif',horizontalrule:'Horisontale lyn invoeg',pagebreak:'Bladsy-einde invoeg',pagebreakAlt:'Bladsy-einde',unlink:'Verwyder skakel',undo:'Ontdoen',redo:'Oordoen',common:{browseServer:'Blaai op bediener',url:'URL',protocol:'Protokol',upload:'Oplaai',uploadSubmit:'Stuur na bediener',image:'Afbeelding',flash:'Flash',form:'Vorm',checkbox:'Merkhokkie',radio:'Radioknoppie',textField:'Teksveld',textarea:'Teks-area',hiddenField:'Blinde veld',button:'Knop',select:'Keuseveld',imageButton:'Afbeeldingsknop',notSet:'<geen instelling>',id:'Id',name:'Naam',langDir:'Skryfrigting',langDirLtr:'Links na regs (LTR)',langDirRtl:'Regs na links (RTL)',langCode:'Taalkode',longDescr:'Lang beskrywing URL',cssClass:'CSS klasse',advisoryTitle:'Aanbevole titel',cssStyle:'Styl',ok:'OK',cancel:'Kanselleer',close:'Sluit',preview:'Voorbeeld',generalTab:'Algemeen',advancedTab:'Gevorderd',validateNumberFailed:"Hierdie waarde is nie 'n getal nie.",confirmNewPage:"Alle wysiginge sal verlore gaan. Is u seker dat u 'n nuwe bladsy wil laai?",confirmCancel:'Sommige opsies is gewysig. Is u seker dat u hierdie dialoogvenster wil sluit?',options:'Opsies',target:'Doel',targetNew:'Nuwe venster (_blank)',targetTop:'Boonste venster (_top)',targetSelf:'Selfde venster (_self)',targetParent:'Oorspronklike venster (_parent)',langDirLTR:'Links na Regs (LTR)',langDirRTL:'Regs na Links (RTL)',styles:'Styl',cssClasses:'CSS klasse',width:'Breedte',height:'Hoogte',align:'Oplyn',alignLeft:'Links',alignRight:'Regs',alignCenter:'Sentreer',alignTop:'Bo',alignMiddle:'Middel',alignBottom:'Onder',invalidHeight:"Hoogte moet 'n getal wees",invalidWidth:"Breedte moet 'n getal wees.",invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, nie beskikbaar nie</span>'},contextmenu:{options:'Konteks Spyskaart-opsies'},specialChar:{toolbar:'Voeg spesiaale karakter in',title:'Kies spesiale karakter',options:'Spesiale karakter-opsies'},link:{toolbar:'Skakel invoeg/wysig',other:'<ander>',menu:'Wysig skakel',title:'Skakel',info:'Skakel informasie',target:'Doel',upload:'Oplaai',advanced:'Gevorderd',type:'Skakelsoort',toUrl:'URL',toAnchor:'Anker in bladsy',toEmail:'E-pos',targetFrame:'<raam>',targetPopup:'<opspringvenster>',targetFrameName:'Naam van doelraam',targetPopupName:'Naam van opspringvenster',popupFeatures:'Eienskappe van opspringvenster',popupResizable:'Herskaalbaar',popupStatusBar:'Statusbalk',popupLocationBar:'Adresbalk',popupToolbar:'Werkbalk',popupMenuBar:'Spyskaartbalk',popupFullScreen:'Volskerm (IE)',popupScrollBars:'Skuifbalke',popupDependent:'Afhanklik (Netscape)',popupLeft:'Posisie links',popupTop:'Posisie bo',id:'Id',langDir:'Skryfrigting',langDirLTR:'Links na regs (LTR)',langDirRTL:'Regs na links (RTL)',acccessKey:'Toegangsleutel',name:'Naam',langCode:'Taalkode',tabIndex:'Tab indeks',advisoryTitle:'Aanbevole titel',advisoryContentType:'Aanbevole inhoudstipe',cssClasses:'CSS klasse',charset:'Karakterstel van geskakelde bron',styles:'Styl',rel:'Relationship',selectAnchor:"Kies 'n anker",anchorName:'Op ankernaam',anchorId:'Op element Id',emailAddress:'E-posadres',emailSubject:'Berig-onderwerp',emailBody:'Berig-inhoud',noAnchors:'(Geen ankers beskikbaar in dokument)',noUrl:'Gee die skakel se URL',noEmail:'Gee die e-posadres'},anchor:{toolbar:'Anker byvoeg/verander',menu:'Anker-eienskappe',title:'Anker-eienskappe',name:'Ankernaam',errorName:'Voltooi die ankernaam asseblief',remove:'Remove Anchor'},list:{numberedTitle:'Eienskappe van genommerde lys',bulletedTitle:'Eienskappe van ongenommerde lys',type:'Tipe',start:'Begin',validateStartNumber:"Beginnommer van lys moet 'n heelgetal wees.",circle:'Sirkel',disc:'Skyf',square:'Vierkant',none:'Geen',notset:'<nie ingestel nie>',armenian:'Armeense nommering',georgian:'Georgiese nommering (an, ban, gan, ens.)',lowerRoman:'Romeinse kleinletters (i, ii, iii, iv, v, ens.)',upperRoman:'Romeinse hoofletters (I, II, III, IV, V, ens.)',lowerAlpha:'Kleinletters (a, b, c, d, e, ens.)',upperAlpha:'Hoofletters (A, B, C, D, E, ens.)',lowerGreek:'Griekse kleinletters (alpha, beta, gamma, ens.)',decimal:'Desimale syfers (1, 2, 3, ens.)',decimalLeadingZero:'Desimale syfers met voorloopnul (01, 02, 03, ens.)'},findAndReplace:{title:'Soek en vervang',find:'Soek',replace:'Vervang',findWhat:'Soek na:',replaceWith:'Vervang met:',notFoundMsg:'Teks nie gevind nie.',findOptions:'Find Options',matchCase:'Hoof/kleinletter sensitief',matchWord:'Hele woord moet voorkom',matchCyclic:'Soek deurlopend',replaceAll:'Vervang alles',replaceSuccessMsg:'%1 voorkoms(te) vervang.'},table:{toolbar:'Tabel',title:'Tabel eienskappe',menu:'Tabel eienskappe',deleteTable:'Verwyder tabel',rows:'Rye',columns:'Kolomme',border:'Randbreedte',widthPx:'piksels',widthPc:'persent',widthUnit:'breedte-eenheid',cellSpace:'Sel-afstand',cellPad:'Sel-spasie',caption:'Naam',summary:'Opsomming',headers:'Opskrifte',headersNone:'Geen',headersColumn:'Eerste kolom',headersRow:'Eerste ry',headersBoth:'Beide ',invalidRows:"Aantal rye moet 'n getal groter as 0 wees.",invalidCols:"Aantal kolomme moet 'n getal groter as 0 wees.",invalidBorder:"Randbreedte moet 'n getal wees.",invalidWidth:"Tabelbreedte moet 'n getal wees.",invalidHeight:"Tabelhoogte moet 'n getal wees.",invalidCellSpacing:"Sel-afstand moet 'n getal wees.",invalidCellPadding:"Sel-spasie moet 'n getal wees.",cell:{menu:'Sel',insertBefore:'Voeg sel in voor',insertAfter:'Voeg sel in na',deleteCell:'Verwyder sel',merge:'Voeg selle saam',mergeRight:'Voeg saam na regs',mergeDown:'Voeg saam ondertoe',splitHorizontal:'Splits sel horisontaal',splitVertical:'Splits sel vertikaal',title:'Sel eienskappe',cellType:'Sel tipe',rowSpan:'Omspan rye',colSpan:'Omspan kolomme',wordWrap:'Woord terugloop',hAlign:'Horisontale oplyning',vAlign:'Vertikale oplyning',alignBaseline:'Basislyn',bgColor:'Agtergrondkleur',borderColor:'Randkleur',data:'Inhoud',header:'Opskrif',yes:'Ja',no:'Nee',invalidWidth:"Selbreedte moet 'n getal wees.",invalidHeight:"Selhoogte moet 'n getal wees.",invalidRowSpan:"Omspan rye moet 'n heelgetal wees.",invalidColSpan:"Omspan kolomme moet 'n heelgetal wees.",chooseColor:'Kies'},row:{menu:'Ry',insertBefore:'Voeg ry in voor',insertAfter:'Voeg ry in na',deleteRow:'Verwyder ry'},column:{menu:'Kolom',insertBefore:'Voeg kolom in voor',insertAfter:'Voeg kolom in na',deleteColumn:'Verwyder kolom'}},button:{title:'Knop eienskappe',text:'Teks (Waarde)',type:'Soort',typeBtn:'Knop',typeSbm:'Stuur',typeRst:'Maak leeg'},checkboxAndRadio:{checkboxTitle:'Merkhokkie eienskappe',radioTitle:'Radioknoppie eienskappe',value:'Waarde',selected:'Geselekteer'},form:{title:'Vorm eienskappe',menu:'Vorm eienskappe',action:'Aksie',method:'Metode',encoding:'Kodering'},select:{title:'Keuseveld eienskappe',selectInfo:'Info',opAvail:'Beskikbare opsies',value:'Waarde',size:'Grootte',lines:'Lyne',chkMulti:'Laat meer as een keuse toe',opText:'Teks',opValue:'Waarde',btnAdd:'Byvoeg',btnModify:'Wysig',btnUp:'Op',btnDown:'Af',btnSetValue:'Stel as geselekteerde waarde',btnDelete:'Verwyder'},textarea:{title:'Teks-area eienskappe',cols:'Kolomme',rows:'Rye'},textfield:{title:'Teksveld eienskappe',name:'Naam',value:'Waarde',charWidth:'Breedte (karakters)',maxChars:'Maksimum karakters',type:'Soort',typeText:'Teks',typePass:'Wagwoord'},hidden:{title:'Verborge veld eienskappe',name:'Naam',value:'Waarde'},image:{title:'Afbeelding eienskappe',titleButton:'Afbeeldingsknop eienskappe',menu:'Afbeelding eienskappe',infoTab:'Afbeelding informasie',btnUpload:'Stuur na bediener',upload:'Oplaai',alt:'Alternatiewe teks',lockRatio:'Vaste proporsie',resetSize:'Herstel grootte',border:'Rand',hSpace:'HSpasie',vSpace:'VSpasie',alertUrl:'Gee URL van afbeelding.',linkTab:'Skakel',button2Img:"Wil u die geselekteerde afbeeldingsknop vervang met 'n eenvoudige afbeelding?",img2Button:"Wil u die geselekteerde afbeelding vervang met 'n afbeeldingsknop?",urlMissing:'Die URL na die afbeelding ontbreek.',validateBorder:"Rand moet 'n heelgetal wees.",validateHSpace:"HSpasie moet 'n heelgetal wees.",validateVSpace:"VSpasie moet 'n heelgetal wees."},flash:{properties:'Flash eienskappe',propertiesTab:'Eienskappe',title:'Flash eienskappe',chkPlay:'Speel outomaties',chkLoop:'Herhaal',chkMenu:'Flash spyskaart aan',chkFull:'Laat volledige skerm toe',scale:'Skaal',scaleAll:'Wys alles',scaleNoBorder:'Geen rand',scaleFit:'Presiese pas',access:'Skrip toegang',accessAlways:'Altyd',accessSameDomain:'Selfde domeinnaam',accessNever:'Nooit',alignAbsBottom:'Absoluut-onder',alignAbsMiddle:'Absoluut-middel',alignBaseline:'Basislyn',alignTextTop:'Teks bo',quality:'Kwaliteit',qualityBest:'Beste',qualityHigh:'Hoog',qualityAutoHigh:'Outomaties hoog',qualityMedium:'Gemiddeld',qualityAutoLow:'Outomaties laag',qualityLow:'Laag',windowModeWindow:'Venster',windowModeOpaque:'Ondeursigtig',windowModeTransparent:'Deursigtig',windowMode:'Venster modus',flashvars:'Veranderlikes vir Flash',bgcolor:'Agtergrondkleur',hSpace:'HSpasie',vSpace:'VSpasie',validateSrc:'Voeg die URL in',validateHSpace:"HSpasie moet 'n heelgetal wees.",validateVSpace:"VSpasie moet 'n heelgetal wees."},spellCheck:{toolbar:'Speltoets',title:'Speltoetser',notAvailable:'Jammer, hierdie diens is nie nou beskikbaar nie.',errorLoading:'Fout by inlaai van diens: %s.',notInDic:'Nie in woordeboek nie',changeTo:'Verander na',btnIgnore:'Ignoreer',btnIgnoreAll:'Ignoreer alles',btnReplace:'Vervang',btnReplaceAll:'vervang alles',btnUndo:'Ontdoen',noSuggestions:'- Geen voorstel -',progress:'Spelling word getoets...',noMispell:'Klaar met speltoets: Geen foute nie',noChanges:'Klaar met speltoets: Geen woorde verander nie',oneChange:'Klaar met speltoets: Een woord verander',manyChanges:'Klaar met speltoets: %1 woorde verander',ieSpellDownload:'Speltoetser is nie geïnstalleer nie. Wil u dit nou aflaai?'},smiley:{toolbar:'Lagbekkie',title:'Voeg lagbekkie by',options:'Lagbekkie opsies'},elementsPath:{eleLabel:'Elemente-pad',eleTitle:'%1 element'},numberedlist:'Genommerde lys',bulletedlist:'Ongenommerde lys',indent:'Vergroot inspring',outdent:'Verklein inspring',justify:{left:'Links oplyn',center:'Sentreer',right:'Regs oplyn',block:'Uitvul'},blockquote:'Sitaatblok',clipboard:{title:'Byvoeg',cutError:'U blaaier se sekuriteitsinstelling belet die outomatiese knip-aksie. Gebruik die sleutelbordkombinasie (Ctrl/Cmd+X).',copyError:'U blaaier se sekuriteitsinstelling belet die kopiëringsaksie. Gebruik die sleutelbordkombinasie (Ctrl/Cmd+C).',pasteMsg:'Plak die teks in die volgende teks-area met die sleutelbordkombinasie (<STRONG>Ctrl/Cmd+V</STRONG>) en druk <STRONG>OK</STRONG>.',securityMsg:'Weens u blaaier se sekuriteitsinstelling is data op die knipbord nie toeganklik nie. U kan dit eers weer in hierdie venster plak.',pasteArea:'Plak-area'},pastefromword:{confirmCleanup:'Die teks wat u wil plak lyk asof dit uit Word gekopiëer is. Wil u dit eers skoonmaak voordat dit geplak word?',toolbar:'Plak vanuit Word',title:'Plak vanuit Word',error:"Die geplakte teks kon nie skoongemaak word nie, weens 'n interne fout"},pasteText:{button:'Plak as eenvoudige teks',title:'Plak as eenvoudige teks'},templates:{button:'Sjablone',title:'Inhoud Sjablone',options:'Sjabloon opsies',insertOption:'Vervang huidige inhoud',selectPromptMsg:'Kies die sjabloon om te gebruik in die redigeerder (huidige inhoud gaan verlore):',emptyListMsg:'(Geen sjablone gedefineer nie)'},showBlocks:'Toon blokke',stylesCombo:{label:'Styl',panelTitle:'Opmaak style',panelTitle1:'Blok style',panelTitle2:'Inlyn style',panelTitle3:'Objek style'},format:{label:'Opmaak',panelTitle:'Opmaak',tag_p:'Normaal',tag_pre:'Opgemaak',tag_address:'Adres',tag_h1:'Opskrif 1',tag_h2:'Opskrif 2',tag_h3:'Opskrif 3',tag_h4:'Opskrif 4',tag_h5:'Opskrif 5',tag_h6:'Opskrif 6',tag_div:'Normaal (DIV)'},div:{title:'Skep Div houer',toolbar:'Skep Div houer',cssClassInputLabel:'CSS klasse',styleSelectLabel:'Styl',IdInputLabel:'Id',languageCodeInputLabel:' Taalkode',inlineStyleInputLabel:'Inlyn Styl',advisoryTitleInputLabel:'Aanbevole Titel',langDirLabel:'Skryfrigting',langDirLTRLabel:'Links na regs (LTR)',langDirRTLLabel:'Regs na links (RTL)',edit:'Wysig Div',remove:'Verwyder Div'},iframe:{title:'IFrame Eienskappe',toolbar:'IFrame',noUrl:'Gee die iframe URL',scrolling:'Skuifbalke aan',border:'Wys rand van raam'},font:{label:'Font',voiceLabel:'Font',panelTitle:'Fontnaam'},fontSize:{label:'Grootte',voiceLabel:'Fontgrootte',panelTitle:'Fontgrootte'},colorButton:{textColorTitle:'Tekskleur',bgColorTitle:'Agtergrondkleur',panelTitle:'Kleure',auto:'Outomaties',more:'Meer Kleure...'},colors:{'000':'Swart',800000:'Meroen','8B4513':'Sjokoladebruin','2F4F4F':'Donkerleisteengrys','008080':'Blougroen','000080':'Vlootblou','4B0082':'Indigo',696969:'Donkergrys',B22222:'Rooibaksteen',A52A2A:'Bruin',DAA520:'Donkergeel','006400':'Donkergroen','40E0D0':'Turkoois','0000CD':'Middelblou',800080:'Pers',808080:'Grys',F00:'Rooi',FF8C00:'Donkeroranje',FFD700:'Goud','008000':'Groen','0FF':'Siaan','00F':'Blou',EE82EE:'Viooltjieblou',A9A9A9:'Donkergrys',FFA07A:'Ligsalm',FFA500:'Oranje',FFFF00:'Geel','00FF00':'Lemmetjie',AFEEEE:'Ligturkoois',ADD8E6:'Ligblou',DDA0DD:'Pruim',D3D3D3:'Liggrys',FFF0F5:'Linne',FAEBD7:'Ivoor',FFFFE0:'Liggeel',F0FFF0:'Heuningdou',F0FFFF:'Asuur',F0F8FF:'Ligte hemelsblou',E6E6FA:'Laventel',FFF:'Wit'},scayt:{title:'Speltoets terwyl u tik',opera_title:'Nie ondersteun deur Opera nie',enable:'SCAYT aan',disable:'SCAYT af',about:'SCAYT info',toggle:'SCAYT wissel aan/af',options:'Opsies',langs:'Tale',moreSuggestions:'Meer voorstelle',ignore:'Ignoreer',ignoreAll:'Ignoreer alles',addWord:'Voeg woord by',emptyDic:'Woordeboeknaam mag nie leeg wees nie.',optionsTab:'Opsies',allCaps:'Ignoreer woorde in hoofletters',ignoreDomainNames:'Ignoreer domeinname',mixedCase:'Ignoreer woorde met hoof- en kleinletters',mixedWithDigits:'Ignoreer woorde met syfers',languagesTab:'Tale',dictionariesTab:'Woordeboeke',dic_field_name:'Naam van woordeboek',dic_create:'Skep',dic_restore:'Herstel',dic_delete:'Verwijder',dic_rename:'Hernoem',dic_info:"Aanvanklik word die gebruikerswoordeboek in 'n koekie gestoor. Koekies is egter beperk in grootte. Wanneer die gebruikerswoordeboek te groot vir 'n koekie geword het, kan dit op ons bediener gestoor word. Om u persoonlike woordeboek op ons bediener te stoor, gee asb. 'n naam vir u woordeboek. Indien u alreeds 'n gestoorde woordeboek het, tik die naam en kliek op die Herstel knop.",aboutTab:'Info'},about:{title:'Info oor CKEditor',dlgTitle:'Info oor CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'Vir lisensie-informasie, besoek asb. ons webwerf:',copy:'Kopiereg © $1. Alle regte voorbehou.'},maximize:'Maksimaliseer',minimize:'Minimaliseer',fakeobjects:{anchor:'Anker',flash:'Flash animasie',iframe:'IFrame',hiddenfield:'Verborge veld',unknown:'Onbekende objek'},resize:'Sleep om te herskaal',colordialog:{title:'Kies kleur',options:'Kleuropsies',highlight:'Aktief',selected:'Geselekteer',clear:'Herstel'},toolbarCollapse:'Verklein werkbalk',toolbarExpand:'Vergroot werkbalk',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Skryfrigting van links na regs',rtl:'Skryfrigting van regs na links'},docprops:{label:'Dokument Eienskappe',title:'Dokument Eienskappe',design:'Design',meta:'Meta Data',chooseColor:'Kies',other:'<ander>',docTitle:'Bladsy Opskrif',charset:'Karakterstel Kodeering',charsetOther:'Ander Karakterstel Kodeering',charsetASCII:'ASCII',charsetCE:'Sentraal Europa',charsetCT:'Chinees Traditioneel (Big5)',charsetCR:'Cyrillic',charsetGR:'Grieks',charsetJP:'Japanees',charsetKR:'Koreans',charsetTR:'Turks',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Dokument Opskrif Soort',docTypeOther:'Ander Dokument Opskrif Soort',xhtmlDec:'Voeg XHTML verklaring by',bgColor:'Agtergrond kleur',bgImage:'Agtergrond Beeld URL',bgFixed:'Vasgeklemde Agtergrond',txtColor:'Tekskleur',margin:'Bladsy Rante',marginTop:'Bo',marginLeft:'Links',marginRight:'Regs',marginBottom:'Onder',metaKeywords:'Dokument Index Sleutelwoorde(comma verdeelt)',metaDescription:'Dokument Beskrywing',metaAuthor:'Skrywer',metaCopyright:'Kopiereg',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ar.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ar.js
index 0e0a892..114a193 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ar.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ar.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.ar={dir:'rtl',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'المصدر',newPage:'صفحة جديدة',save:'حفظ',preview:'معاينة الصفحة',cut:'قص',copy:'نسخ',paste:'لصق',print:'طباعة',underline:'تسطير',bold:'غامق',italic:'مائل',selectAll:'تحديد الكل',removeFormat:'إزالة التنسيقات',strike:'يتوسطه خط',subscript:'منخفض',superscript:'مرتفع',horizontalrule:'خط فاصل',pagebreak:'إدخال صفحة جديدة',pagebreakAlt:'Page Break',unlink:'إزالة رابط',undo:'تراجع',redo:'إعادة',common:{browseServer:'تصفح',url:'الرابط',protocol:'البروتوكول',upload:'رفع',uploadSubmit:'أرسل',image:'صورة',flash:'فلاش',form:'نموذج',checkbox:'خانة إختيار',radio:'زر اختيار',textField:'مربع نص',textarea:'مساحة نصية',hiddenField:'إدراج حقل خفي',button:'زر ضغط',select:'اختار',imageButton:'زر صورة',notSet:'<بدون تحديد>',id:'الرقم',name:'الاسم',langDir:'إتجاه النص',langDirLtr:'اليسار لليمين (LTR)',langDirRtl:'اليمين لليسار (RTL)',langCode:'رمز اللغة',longDescr:'الوصف التفصيلى',cssClass:'فئات التنسيق',advisoryTitle:'عنوان التقرير',cssStyle:'نمط',ok:'موافق',cancel:'إلغاء الأمر',close:'أغلق',preview:'استعراض',generalTab:'عام',advancedTab:'متقدم',validateNumberFailed:'لايوجد نتيجة',confirmNewPage:'ستفقد أي متغييرات اذا لم تقم بحفظها اولا. هل أنت متأكد أنك تريد صفحة جديدة؟',confirmCancel:'بعض الخيارات قد تغيرت. هل أنت متأكد من إغلاق مربع النص؟',options:'خيارات',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'العرض',height:'الإرتفاع',align:'محاذاة',alignLeft:'يسار',alignRight:'يمين',alignCenter:'وسط',alignTop:'أعلى',alignMiddle:'وسط',alignBottom:'أسفل',invalidHeight:'الارتفاع يجب أن يكون عدداً.',invalidWidth:'العرض يجب أن يكون عدداً.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, غير متاح</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'إدراج خاص.ِ',title:'اختر الخواص',options:'Special Character Options'},link:{toolbar:'رابط',other:'<أخرى>',menu:'تحرير رابط',title:'إرتباط تشعبي',info:'معلومات الرابط',target:'هدف الرابط',upload:'رفع',advanced:'متقدم',type:'نوع الربط',toUrl:'URL',toAnchor:'مكان في هذا المستند',toEmail:'بريد إلكتروني',targetFrame:'<إطار>',targetPopup:'<نافذة منبثقة>',targetFrameName:'اسم الإطار المستهدف',targetPopupName:'اسم النافذة المنبثقة',popupFeatures:'خصائص النافذة المنبثقة',popupResizable:'قابلة التشكيل',popupStatusBar:'شريط الحالة',popupLocationBar:'شريط العنوان',popupToolbar:'شريط الأدوات',popupMenuBar:'القوائم الرئيسية',popupFullScreen:'ملئ الشاشة (IE)',popupScrollBars:'أشرطة التمرير',popupDependent:'تابع (Netscape)',popupLeft:'التمركز لليسار',popupTop:'التمركز للأعلى',id:'هوية',langDir:'إتجاه النص',langDirLTR:'اليسار لليمين (LTR)',langDirRTL:'اليمين لليسار (RTL)',acccessKey:'مفاتيح الإختصار',name:'الاسم',langCode:'كود النص',tabIndex:'الترتيب',advisoryTitle:'عنوان التقرير',advisoryContentType:'نوع التقرير',cssClasses:'فئات التنسيق',charset:'ترميز المادة المطلوبة',styles:'نمط',rel:'Relationship',selectAnchor:'اختر علامة مرجعية',anchorName:'حسب الاسم',anchorId:'حسب رقم العنصر',emailAddress:'عنوان البريد إلكتروني',emailSubject:'موضوع الرسالة',emailBody:'محتوى الرسالة',noAnchors:'(لا توجد علامات مرجعية في هذا المستند)',noUrl:'من فضلك أدخل عنوان الموقع الذي يشير إليه الرابط',noEmail:'من فضلك أدخل عنوان البريد الإلكتروني'},anchor:{toolbar:'إشارة مرجعية',menu:'تحرير الإشارة المرجعية',title:'خصائص الإشارة المرجعية',name:'اسم الإشارة المرجعية',errorName:'الرجاء كتابة اسم الإشارة المرجعية',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'بحث واستبدال',find:'بحث',replace:'إستبدال',findWhat:'البحث بـ:',replaceWith:'إستبدال بـ:',notFoundMsg:'لم يتم العثور على النص المحدد.',findOptions:'Find Options',matchCase:'مطابقة حالة الأحرف',matchWord:'مطابقة بالكامل',matchCyclic:'مطابقة دورية',replaceAll:'إستبدال الكل',replaceSuccessMsg:'تم استبدال 1% من الحالات '},table:{toolbar:'جدول',title:'خصائص الجدول',menu:'خصائص الجدول',deleteTable:'حذف الجدول',rows:'صفوف',columns:'أعمدة',border:'الحدود',widthPx:'بكسل',widthPc:'بالمئة',widthUnit:'width unit',cellSpace:'تباعد الخلايا',cellPad:'المسافة البادئة',caption:'الوصف',summary:'الخلاصة',headers:'العناوين',headersNone:'بدون',headersColumn:'العمود الأول',headersRow:'الصف الأول',headersBoth:'كلاهما',invalidRows:'عدد الصفوف يجب أن يكون عدداً أكبر من صفر.',invalidCols:'عدد الأعمدة يجب أن يكون عدداً أكبر من صفر.',invalidBorder:'حجم الحد يجب أن يكون عدداً.',invalidWidth:'عرض الجدول يجب أن يكون عدداً.',invalidHeight:'ارتفاع الجدول يجب أن يكون عدداً.',invalidCellSpacing:'المسافة بين الخلايا يجب أن تكون عدداً.',invalidCellPadding:'المسافة البادئة يجب أن تكون عدداً',cell:{menu:'خلية',insertBefore:'إدراج خلية قبل',insertAfter:'إدراج خلية بعد',deleteCell:'حذف خلية',merge:'دمج خلايا',mergeRight:'دمج لليمين',mergeDown:'دمج للأسفل',splitHorizontal:'تقسيم الخلية أفقياً',splitVertical:'تقسيم الخلية عمودياً',title:'خصائص الخلية',cellType:'نوع الخلية',rowSpan:'امتداد الصفوف',colSpan:'امتداد الأعمدة',wordWrap:'التفاف النص',hAlign:'محاذاة أفقية',vAlign:'محاذاة رأسية',alignBaseline:'خط القاعدة',bgColor:'لون الخلفية',borderColor:'لون الحدود',data:'بيانات',header:'عنوان',yes:'نعم',no:'لا',invalidWidth:'عرض الخلية يجب أن يكون عدداً.',invalidHeight:'ارتفاع الخلية يجب أن يكون عدداً.',invalidRowSpan:'امتداد الصفوف يجب أن يكون عدداً صحيحاً.',invalidColSpan:'امتداد الأعمدة يجب أن يكون عدداً صحيحاً.',chooseColor:'اختر'},row:{menu:'صف',insertBefore:'إدراج صف قبل',insertAfter:'إدراج صف بعد',deleteRow:'حذف صفوف'},column:{menu:'عمود',insertBefore:'إدراج عمود قبل',insertAfter:'إدراج عمود بعد',deleteColumn:'حذف أعمدة'}},button:{title:'خصائص زر الضغط',text:'القيمة/التسمية',type:'نوع الزر',typeBtn:'زر',typeSbm:'إرسال',typeRst:'إعادة تعيين'},checkboxAndRadio:{checkboxTitle:'خصائص خانة الإختيار',radioTitle:'خصائص زر الخيار',value:'القيمة',selected:'محدد'},form:{title:'خصائص النموذج',menu:'خصائص النموذج',action:'اسم الملف',method:'الأسلوب',encoding:'تشفير'},select:{title:'خصائص اختيار الحقل',selectInfo:'اختار معلومات',opAvail:'الخيارات المتاحة',value:'القيمة',size:'الحجم',lines:'الأسطر',chkMulti:'السماح بتحديدات متعددة',opText:'النص',opValue:'القيمة',btnAdd:'إضافة',btnModify:'تعديل',btnUp:'أعلى',btnDown:'أسفل',btnSetValue:'إجعلها محددة',btnDelete:'إزالة'},textarea:{title:'خصائص مساحة النص',cols:'الأعمدة',rows:'الصفوف'},textfield:{title:'خصائص مربع النص',name:'الاسم',value:'القيمة',charWidth:'عرض السمات',maxChars:'اقصى عدد للسمات',type:'نوع المحتوى',typeText:'نص',typePass:'كلمة مرور'},hidden:{title:'خصائص الحقل المخفي',name:'الاسم',value:'القيمة'},image:{title:'خصائص الصورة',titleButton:'خصائص زر الصورة',menu:'خصائص الصورة',infoTab:'معلومات الصورة',btnUpload:'أرسلها للخادم',upload:'رفع',alt:'عنوان الصورة',lockRatio:'تناسق الحجم',resetSize:'إستعادة الحجم الأصلي',border:'سمك الحدود',hSpace:'تباعد أفقي',vSpace:'تباعد عمودي',alertUrl:'فضلاً أكتب الموقع الذي توجد عليه هذه الصورة.',linkTab:'الرابط',button2Img:'هل تريد تحويل زر الصورة المختار إلى صورة بسيطة؟',img2Button:'هل تريد تحويل الصورة المختارة إلى زر صورة؟',urlMissing:'عنوان مصدر الصورة مفقود',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'خصائص الفلاش',propertiesTab:'الخصائص',title:'خصائص فيلم الفلاش',chkPlay:'تشغيل تلقائي',chkLoop:'تكرار',chkMenu:'تمكين قائمة فيلم الفلاش',chkFull:'ملء الشاشة',scale:'الحجم',scaleAll:'إظهار الكل',scaleNoBorder:'بلا حدود',scaleFit:'ضبط تام',access:'دخول النص البرمجي',accessAlways:'دائماً',accessSameDomain:'نفس النطاق',accessNever:'مطلقاً',alignAbsBottom:'أسفل النص',alignAbsMiddle:'وسط السطر',alignBaseline:'على السطر',alignTextTop:'أعلى النص',quality:'جودة',qualityBest:'أفضل',qualityHigh:'عالية',qualityAutoHigh:'عالية تلقائياً',qualityMedium:'متوسطة',qualityAutoLow:'منخفضة تلقائياً',qualityLow:'منخفضة',windowModeWindow:'نافذة',windowModeOpaque:'غير شفاف',windowModeTransparent:'شفاف',windowMode:'وضع النافذة',flashvars:'متغيرات الفلاش',bgcolor:'لون الخلفية',hSpace:'تباعد أفقي',vSpace:'تباعد عمودي',validateSrc:'فضلاً أدخل عنوان الموقع الذي يشير إليه الرابط',validateHSpace:'HSpace يجب أن يكون عدداً.',validateVSpace:'VSpace يجب أن يكون عدداً.'},spellCheck:{toolbar:'تدقيق إملائي',title:'التدقيق الإملائي',notAvailable:'عفواً، ولكن هذه الخدمة غير متاحة الان',errorLoading:'خطأ في تحميل تطبيق خدمة الاستضافة: %s.',notInDic:'ليست في القاموس',changeTo:'التغيير إلى',btnIgnore:'تجاهل',btnIgnoreAll:'تجاهل الكل',btnReplace:'تغيير',btnReplaceAll:'تغيير الكل',btnUndo:'تراجع',noSuggestions:'- لا توجد إقتراحات -',progress:'جاري التدقيق الاملائى',noMispell:'تم التدقيق الإملائي: لم يتم العثور على أي أخطاء إملائية',noChanges:'تم التدقيق الإملائي: لم يتم تغيير أي كلمة',oneChange:'تم التدقيق الإملائي: تم تغيير كلمة واحدة فقط',manyChanges:'تم إكمال التدقيق الإملائي: تم تغيير %1 من كلمات',ieSpellDownload:'المدقق الإملائي (الإنجليزي) غير مثبّت. هل تود تحميله الآن؟'},smiley:{toolbar:'ابتسامات',title:'إدراج ابتسامات',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'عنصر 1%'},numberedlist:'ادخال/حذف تعداد رقمي',bulletedlist:'ادخال/حذف تعداد نقطي',indent:'زيادة المسافة البادئة',outdent:'إنقاص المسافة البادئة',justify:{left:'محاذاة إلى اليسار',center:'توسيط',right:'محاذاة إلى اليمين',block:'ضبط'},blockquote:'اقتباس',clipboard:{title:'لصق',cutError:'الإعدادات الأمنية للمتصفح الذي تستخدمه تمنع القص التلقائي. فضلاً إستخدم لوحة المفاتيح لفعل ذلك (Ctrl/Cmd+X).',copyError:'الإعدادات الأمنية للمتصفح الذي تستخدمه تمنع النسخ التلقائي. فضلاً إستخدم لوحة المفاتيح لفعل ذلك (Ctrl/Cmd+C).',pasteMsg:'الصق داخل الصندوق بإستخدام زرائر (<STRONG>Ctrl/Cmd+V</STRONG>) في لوحة المفاتيح، ثم اضغط زر <STRONG>موافق</STRONG>.',securityMsg:'نظراً لإعدادات الأمان الخاصة بمتصفحك، لن يتمكن هذا المحرر من الوصول لمحتوى حافظتك، لذلك يجب عليك لصق المحتوى مرة أخرى في هذه النافذة.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'يبدو أن النص المراد لصقه منسوخ من برنامج وورد. هل تود تنظيفه قبل الشروع في عملية اللصق؟',toolbar:'لصق من وورد',title:'لصق من وورد',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'لصق كنص بسيط',title:'لصق كنص بسيط'},templates:{button:'القوالب',title:'قوالب المحتوى',options:'Template Options',insertOption:'استبدال المحتوى',selectPromptMsg:'اختر القالب الذي تود وضعه في المحرر',emptyListMsg:'(لم يتم تعريف أي قالب)'},showBlocks:'مخطط تفصيلي',stylesCombo:{label:'أنماط',panelTitle:'Formatting Styles',panelTitle1:'أنماط الفقرة',panelTitle2:'أنماط مضمنة',panelTitle3:'أنماط الكائن'},format:{label:'تنسيق',panelTitle:'تنسيق الفقرة',tag_p:'عادي',tag_pre:'منسّق',tag_address:'عنوان',tag_h1:'العنوان 1',tag_h2:'العنوان 2',tag_h3:'العنوان 3',tag_h4:'العنوان 4',tag_h5:'العنوان 5',tag_h6:'العنوان 6',tag_div:'عادي (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'خط',voiceLabel:'حجم الخط',panelTitle:'حجم الخط'},fontSize:{label:'حجم الخط',voiceLabel:'حجم الخط',panelTitle:'حجم الخط'},colorButton:{textColorTitle:'لون النص',bgColorTitle:'لون الخلفية',panelTitle:'Colors',auto:'تلقائي',more:'ألوان إضافية...'},colors:{'000':'أسود',800000:'كستنائي','8B4513':'بني فاتح','2F4F4F':'رمادي أردوازي غامق','008080':'أزرق مخضر','000080':'أزرق داكن','4B0082':'كحلي',696969:'رمادي داكن',B22222:'طوبي',A52A2A:'بني',DAA520:'ذهبي داكن','006400':'أخضر داكن','40E0D0':'فيروزي','0000CD':'أزرق متوسط',800080:'بنفسجي غامق',808080:'رمادي',F00:'أحمر',FF8C00:'برتقالي داكن',FFD700:'ذهبي','008000':'أخضر','0FF':'تركواز','00F':'أزرق',EE82EE:'بنفسجي',A9A9A9:'رمادي شاحب',FFA07A:'برتقالي وردي',FFA500:'برتقالي',FFFF00:'أصفر','00FF00':'ليموني',AFEEEE:'فيروزي شاحب',ADD8E6:'أزرق فاتح',DDA0DD:'بنفسجي فاتح',D3D3D3:'رمادي فاتح',FFF0F5:'وردي فاتح',FAEBD7:'أبيض عتيق',FFFFE0:'أصفر فاتح',F0FFF0:'أبيض مائل للأخضر',F0FFFF:'سماوي',F0F8FF:'لبني',E6E6FA:'أرجواني',FFF:'أبيض'},scayt:{title:'تدقيق إملائي أثناء الكتابة',opera_title:'Not supported by Opera',enable:'تفعيل SCAYT',disable:'تعطيل SCAYT',about:'عن SCAYT',toggle:'تثبيت SCAYT',options:'خيارات',langs:'لغات',moreSuggestions:'المزيد من المقترحات',ignore:'تجاهل',ignoreAll:'تجاهل الكل',addWord:'إضافة كلمة',emptyDic:'اسم القاموس يجب ألا يكون فارغاً.',optionsTab:'خيارات',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'لغات',dictionariesTab:'قواميس',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'عن'},about:{title:'عن CKEditor',dlgTitle:'عن CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'للحصول على معلومات الترخيص ، يرجى زيارة موقعنا على شبكة الانترنت:',copy:'حقوق النشر © $1. جميع الحقوق محفوظة.'},maximize:'تكبير',minimize:'تصغير',fakeobjects:{anchor:'إرساء',flash:'رسم متحرك بالفلاش',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'كائن غير معروف'},resize:'اسحب لتغيير الحجم',colordialog:{title:'اختر لون',options:'Color Options',highlight:'إلقاء الضوء',selected:'مُختار',clear:'مسح'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'خصائص الصفحة',title:'خصائص الصفحة',design:'Design',meta:'المعرّفات الرأسية',chooseColor:'اختر',other:'<أخرى>',docTitle:'عنوان الصفحة',charset:'ترميز الحروف',charsetOther:'ترميز آخر',charsetASCII:'ASCII',charsetCE:'أوروبا الوسطى',charsetCT:'الصينية التقليدية (Big5)',charsetCR:'السيريلية',charsetGR:'اليونانية',charsetJP:'اليابانية',charsetKR:'الكورية',charsetTR:'التركية',charsetUN:'Unicode (UTF-8)',charsetWE:'أوروبا الغربية',docType:'ترويسة نوع الصفحة',docTypeOther:'ترويسة نوع صفحة أخرى',xhtmlDec:'تضمين إعلانات لغة XHTMLَ',bgColor:'لون الخلفية',bgImage:'رابط الصورة الخلفية',bgFixed:'جعلها علامة مائية',txtColor:'لون النص',margin:'هوامش الصفحة',marginTop:'علوي',marginLeft:'أيسر',marginRight:'أيمن',marginBottom:'سفلي',metaKeywords:'الكلمات الأساسية (مفصولة بفواصل)َ',metaDescription:'وصف الصفحة',metaAuthor:'الكاتب',metaCopyright:'المالك',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.ar={dir:'rtl',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'المصدر',newPage:'صفحة جديدة',save:'حفظ',preview:'معاينة الصفحة',cut:'قص',copy:'نسخ',paste:'لصق',print:'طباعة',underline:'تسطير',bold:'غامق',italic:'مائل',selectAll:'تحديد الكل',removeFormat:'إزالة التنسيقات',strike:'يتوسطه خط',subscript:'منخفض',superscript:'مرتفع',horizontalrule:'خط فاصل',pagebreak:'إدخال صفحة جديدة',pagebreakAlt:'Page Break',unlink:'إزالة رابط',undo:'تراجع',redo:'إعادة',common:{browseServer:'تصفح',url:'الرابط',protocol:'البروتوكول',upload:'رفع',uploadSubmit:'أرسل',image:'صورة',flash:'فلاش',form:'نموذج',checkbox:'خانة إختيار',radio:'زر اختيار',textField:'مربع نص',textarea:'مساحة نصية',hiddenField:'إدراج حقل خفي',button:'زر ضغط',select:'اختار',imageButton:'زر صورة',notSet:'<بدون تحديد>',id:'الرقم',name:'الاسم',langDir:'إتجاه النص',langDirLtr:'اليسار لليمين (LTR)',langDirRtl:'اليمين لليسار (RTL)',langCode:'رمز اللغة',longDescr:'الوصف التفصيلى',cssClass:'فئات التنسيق',advisoryTitle:'عنوان التقرير',cssStyle:'نمط',ok:'موافق',cancel:'إلغاء الأمر',close:'أغلق',preview:'استعراض',generalTab:'عام',advancedTab:'متقدم',validateNumberFailed:'لايوجد نتيجة',confirmNewPage:'ستفقد أي متغييرات اذا لم تقم بحفظها اولا. هل أنت متأكد أنك تريد صفحة جديدة؟',confirmCancel:'بعض الخيارات قد تغيرت. هل أنت متأكد من إغلاق مربع النص؟',options:'خيارات',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'العرض',height:'الإرتفاع',align:'محاذاة',alignLeft:'يسار',alignRight:'يمين',alignCenter:'وسط',alignTop:'أعلى',alignMiddle:'وسط',alignBottom:'أسفل',invalidHeight:'الارتفاع يجب أن يكون عدداً.',invalidWidth:'العرض يجب أن يكون عدداً.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, غير متاح</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'إدراج خاص.ِ',title:'اختر الخواص',options:'Special Character Options'},link:{toolbar:'رابط',other:'<أخرى>',menu:'تحرير رابط',title:'إرتباط تشعبي',info:'معلومات الرابط',target:'هدف الرابط',upload:'رفع',advanced:'متقدم',type:'نوع الربط',toUrl:'URL',toAnchor:'مكان في هذا المستند',toEmail:'بريد إلكتروني',targetFrame:'<إطار>',targetPopup:'<نافذة منبثقة>',targetFrameName:'اسم الإطار المستهدف',targetPopupName:'اسم النافذة المنبثقة',popupFeatures:'خصائص النافذة المنبثقة',popupResizable:'قابلة التشكيل',popupStatusBar:'شريط الحالة',popupLocationBar:'شريط العنوان',popupToolbar:'شريط الأدوات',popupMenuBar:'القوائم الرئيسية',popupFullScreen:'ملئ الشاشة (IE)',popupScrollBars:'أشرطة التمرير',popupDependent:'تابع (Netscape)',popupLeft:'التمركز لليسار',popupTop:'التمركز للأعلى',id:'هوية',langDir:'إتجاه النص',langDirLTR:'اليسار لليمين (LTR)',langDirRTL:'اليمين لليسار (RTL)',acccessKey:'مفاتيح الإختصار',name:'الاسم',langCode:'كود النص',tabIndex:'الترتيب',advisoryTitle:'عنوان التقرير',advisoryContentType:'نوع التقرير',cssClasses:'فئات التنسيق',charset:'ترميز المادة المطلوبة',styles:'نمط',rel:'Relationship',selectAnchor:'اختر علامة مرجعية',anchorName:'حسب الاسم',anchorId:'حسب رقم العنصر',emailAddress:'عنوان البريد إلكتروني',emailSubject:'موضوع الرسالة',emailBody:'محتوى الرسالة',noAnchors:'(لا توجد علامات مرجعية في هذا المستند)',noUrl:'من فضلك أدخل عنوان الموقع الذي يشير إليه الرابط',noEmail:'من فضلك أدخل عنوان البريد الإلكتروني'},anchor:{toolbar:'إشارة مرجعية',menu:'تحرير الإشارة المرجعية',title:'خصائص الإشارة المرجعية',name:'اسم الإشارة المرجعية',errorName:'الرجاء كتابة اسم الإشارة المرجعية',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'بحث واستبدال',find:'بحث',replace:'إستبدال',findWhat:'البحث بـ:',replaceWith:'إستبدال بـ:',notFoundMsg:'لم يتم العثور على النص المحدد.',findOptions:'Find Options',matchCase:'مطابقة حالة الأحرف',matchWord:'مطابقة بالكامل',matchCyclic:'مطابقة دورية',replaceAll:'إستبدال الكل',replaceSuccessMsg:'تم استبدال 1% من الحالات '},table:{toolbar:'جدول',title:'خصائص الجدول',menu:'خصائص الجدول',deleteTable:'حذف الجدول',rows:'صفوف',columns:'أعمدة',border:'الحدود',widthPx:'بكسل',widthPc:'بالمئة',widthUnit:'width unit',cellSpace:'تباعد الخلايا',cellPad:'المسافة البادئة',caption:'الوصف',summary:'الخلاصة',headers:'العناوين',headersNone:'بدون',headersColumn:'العمود الأول',headersRow:'الصف الأول',headersBoth:'كلاهما',invalidRows:'عدد الصفوف يجب أن يكون عدداً أكبر من صفر.',invalidCols:'عدد الأعمدة يجب أن يكون عدداً أكبر من صفر.',invalidBorder:'حجم الحد يجب أن يكون عدداً.',invalidWidth:'عرض الجدول يجب أن يكون عدداً.',invalidHeight:'ارتفاع الجدول يجب أن يكون عدداً.',invalidCellSpacing:'المسافة بين الخلايا يجب أن تكون عدداً.',invalidCellPadding:'المسافة البادئة يجب أن تكون عدداً',cell:{menu:'خلية',insertBefore:'إدراج خلية قبل',insertAfter:'إدراج خلية بعد',deleteCell:'حذف خلية',merge:'دمج خلايا',mergeRight:'دمج لليمين',mergeDown:'دمج للأسفل',splitHorizontal:'تقسيم الخلية أفقياً',splitVertical:'تقسيم الخلية عمودياً',title:'خصائص الخلية',cellType:'نوع الخلية',rowSpan:'امتداد الصفوف',colSpan:'امتداد الأعمدة',wordWrap:'التفاف النص',hAlign:'محاذاة أفقية',vAlign:'محاذاة رأسية',alignBaseline:'خط القاعدة',bgColor:'لون الخلفية',borderColor:'لون الحدود',data:'بيانات',header:'عنوان',yes:'نعم',no:'لا',invalidWidth:'عرض الخلية يجب أن يكون عدداً.',invalidHeight:'ارتفاع الخلية يجب أن يكون عدداً.',invalidRowSpan:'امتداد الصفوف يجب أن يكون عدداً صحيحاً.',invalidColSpan:'امتداد الأعمدة يجب أن يكون عدداً صحيحاً.',chooseColor:'اختر'},row:{menu:'صف',insertBefore:'إدراج صف قبل',insertAfter:'إدراج صف بعد',deleteRow:'حذف صفوف'},column:{menu:'عمود',insertBefore:'إدراج عمود قبل',insertAfter:'إدراج عمود بعد',deleteColumn:'حذف أعمدة'}},button:{title:'خصائص زر الضغط',text:'القيمة/التسمية',type:'نوع الزر',typeBtn:'زر',typeSbm:'إرسال',typeRst:'إعادة تعيين'},checkboxAndRadio:{checkboxTitle:'خصائص خانة الإختيار',radioTitle:'خصائص زر الخيار',value:'القيمة',selected:'محدد'},form:{title:'خصائص النموذج',menu:'خصائص النموذج',action:'اسم الملف',method:'الأسلوب',encoding:'تشفير'},select:{title:'خصائص اختيار الحقل',selectInfo:'اختار معلومات',opAvail:'الخيارات المتاحة',value:'القيمة',size:'الحجم',lines:'الأسطر',chkMulti:'السماح بتحديدات متعددة',opText:'النص',opValue:'القيمة',btnAdd:'إضافة',btnModify:'تعديل',btnUp:'أعلى',btnDown:'أسفل',btnSetValue:'إجعلها محددة',btnDelete:'إزالة'},textarea:{title:'خصائص مساحة النص',cols:'الأعمدة',rows:'الصفوف'},textfield:{title:'خصائص مربع النص',name:'الاسم',value:'القيمة',charWidth:'عرض السمات',maxChars:'اقصى عدد للسمات',type:'نوع المحتوى',typeText:'نص',typePass:'كلمة مرور'},hidden:{title:'خصائص الحقل المخفي',name:'الاسم',value:'القيمة'},image:{title:'خصائص الصورة',titleButton:'خصائص زر الصورة',menu:'خصائص الصورة',infoTab:'معلومات الصورة',btnUpload:'أرسلها للخادم',upload:'رفع',alt:'عنوان الصورة',lockRatio:'تناسق الحجم',resetSize:'إستعادة الحجم الأصلي',border:'سمك الحدود',hSpace:'تباعد أفقي',vSpace:'تباعد عمودي',alertUrl:'فضلاً أكتب الموقع الذي توجد عليه هذه الصورة.',linkTab:'الرابط',button2Img:'هل تريد تحويل زر الصورة المختار إلى صورة بسيطة؟',img2Button:'هل تريد تحويل الصورة المختارة إلى زر صورة؟',urlMissing:'عنوان مصدر الصورة مفقود',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'خصائص الفلاش',propertiesTab:'الخصائص',title:'خصائص فيلم الفلاش',chkPlay:'تشغيل تلقائي',chkLoop:'تكرار',chkMenu:'تمكين قائمة فيلم الفلاش',chkFull:'ملء الشاشة',scale:'الحجم',scaleAll:'إظهار الكل',scaleNoBorder:'بلا حدود',scaleFit:'ضبط تام',access:'دخول النص البرمجي',accessAlways:'دائماً',accessSameDomain:'نفس النطاق',accessNever:'مطلقاً',alignAbsBottom:'أسفل النص',alignAbsMiddle:'وسط السطر',alignBaseline:'على السطر',alignTextTop:'أعلى النص',quality:'جودة',qualityBest:'أفضل',qualityHigh:'عالية',qualityAutoHigh:'عالية تلقائياً',qualityMedium:'متوسطة',qualityAutoLow:'منخفضة تلقائياً',qualityLow:'منخفضة',windowModeWindow:'نافذة',windowModeOpaque:'غير شفاف',windowModeTransparent:'شفاف',windowMode:'وضع النافذة',flashvars:'متغيرات الفلاش',bgcolor:'لون الخلفية',hSpace:'تباعد أفقي',vSpace:'تباعد عمودي',validateSrc:'فضلاً أدخل عنوان الموقع الذي يشير إليه الرابط',validateHSpace:'HSpace يجب أن يكون عدداً.',validateVSpace:'VSpace يجب أن يكون عدداً.'},spellCheck:{toolbar:'تدقيق إملائي',title:'التدقيق الإملائي',notAvailable:'عفواً، ولكن هذه الخدمة غير متاحة الان',errorLoading:'خطأ في تحميل تطبيق خدمة الاستضافة: %s.',notInDic:'ليست في القاموس',changeTo:'التغيير إلى',btnIgnore:'تجاهل',btnIgnoreAll:'تجاهل الكل',btnReplace:'تغيير',btnReplaceAll:'تغيير الكل',btnUndo:'تراجع',noSuggestions:'- لا توجد إقتراحات -',progress:'جاري التدقيق الاملائى',noMispell:'تم التدقيق الإملائي: لم يتم العثور على أي أخطاء إملائية',noChanges:'تم التدقيق الإملائي: لم يتم تغيير أي كلمة',oneChange:'تم التدقيق الإملائي: تم تغيير كلمة واحدة فقط',manyChanges:'تم إكمال التدقيق الإملائي: تم تغيير %1 من كلمات',ieSpellDownload:'المدقق الإملائي (الإنجليزي) غير مثبّت. هل تود تحميله الآن؟'},smiley:{toolbar:'ابتسامات',title:'إدراج ابتسامات',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'عنصر 1%'},numberedlist:'ادخال/حذف تعداد رقمي',bulletedlist:'ادخال/حذف تعداد نقطي',indent:'زيادة المسافة البادئة',outdent:'إنقاص المسافة البادئة',justify:{left:'محاذاة إلى اليسار',center:'توسيط',right:'محاذاة إلى اليمين',block:'ضبط'},blockquote:'اقتباس',clipboard:{title:'لصق',cutError:'الإعدادات الأمنية للمتصفح الذي تستخدمه تمنع القص التلقائي. فضلاً إستخدم لوحة المفاتيح لفعل ذلك (Ctrl/Cmd+X).',copyError:'الإعدادات الأمنية للمتصفح الذي تستخدمه تمنع النسخ التلقائي. فضلاً إستخدم لوحة المفاتيح لفعل ذلك (Ctrl/Cmd+C).',pasteMsg:'الصق داخل الصندوق بإستخدام زرائر (<STRONG>Ctrl/Cmd+V</STRONG>) في لوحة المفاتيح، ثم اضغط زر <STRONG>موافق</STRONG>.',securityMsg:'نظراً لإعدادات الأمان الخاصة بمتصفحك، لن يتمكن هذا المحرر من الوصول لمحتوى حافظتك، لذلك يجب عليك لصق المحتوى مرة أخرى في هذه النافذة.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'يبدو أن النص المراد لصقه منسوخ من برنامج وورد. هل تود تنظيفه قبل الشروع في عملية اللصق؟',toolbar:'لصق من وورد',title:'لصق من وورد',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'لصق كنص بسيط',title:'لصق كنص بسيط'},templates:{button:'القوالب',title:'قوالب المحتوى',options:'Template Options',insertOption:'استبدال المحتوى',selectPromptMsg:'اختر القالب الذي تود وضعه في المحرر',emptyListMsg:'(لم يتم تعريف أي قالب)'},showBlocks:'مخطط تفصيلي',stylesCombo:{label:'أنماط',panelTitle:'Formatting Styles',panelTitle1:'أنماط الفقرة',panelTitle2:'أنماط مضمنة',panelTitle3:'أنماط الكائن'},format:{label:'تنسيق',panelTitle:'تنسيق الفقرة',tag_p:'عادي',tag_pre:'منسّق',tag_address:'عنوان',tag_h1:'العنوان 1',tag_h2:'العنوان 2',tag_h3:'العنوان 3',tag_h4:'العنوان 4',tag_h5:'العنوان 5',tag_h6:'العنوان 6',tag_div:'عادي (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'خط',voiceLabel:'حجم الخط',panelTitle:'حجم الخط'},fontSize:{label:'حجم الخط',voiceLabel:'حجم الخط',panelTitle:'حجم الخط'},colorButton:{textColorTitle:'لون النص',bgColorTitle:'لون الخلفية',panelTitle:'Colors',auto:'تلقائي',more:'ألوان إضافية...'},colors:{'000':'أسود',800000:'كستنائي','8B4513':'بني فاتح','2F4F4F':'رمادي أردوازي غامق','008080':'أزرق مخضر','000080':'أزرق داكن','4B0082':'كحلي',696969:'رمادي داكن',B22222:'طوبي',A52A2A:'بني',DAA520:'ذهبي داكن','006400':'أخضر داكن','40E0D0':'فيروزي','0000CD':'أزرق متوسط',800080:'بنفسجي غامق',808080:'رمادي',F00:'أحمر',FF8C00:'برتقالي داكن',FFD700:'ذهبي','008000':'أخضر','0FF':'تركواز','00F':'أزرق',EE82EE:'بنفسجي',A9A9A9:'رمادي شاحب',FFA07A:'برتقالي وردي',FFA500:'برتقالي',FFFF00:'أصفر','00FF00':'ليموني',AFEEEE:'فيروزي شاحب',ADD8E6:'أزرق فاتح',DDA0DD:'بنفسجي فاتح',D3D3D3:'رمادي فاتح',FFF0F5:'وردي فاتح',FAEBD7:'أبيض عتيق',FFFFE0:'أصفر فاتح',F0FFF0:'أبيض مائل للأخضر',F0FFFF:'سماوي',F0F8FF:'لبني',E6E6FA:'أرجواني',FFF:'أبيض'},scayt:{title:'تدقيق إملائي أثناء الكتابة',opera_title:'Not supported by Opera',enable:'تفعيل SCAYT',disable:'تعطيل SCAYT',about:'عن SCAYT',toggle:'تثبيت SCAYT',options:'خيارات',langs:'لغات',moreSuggestions:'المزيد من المقترحات',ignore:'تجاهل',ignoreAll:'تجاهل الكل',addWord:'إضافة كلمة',emptyDic:'اسم القاموس يجب ألا يكون فارغاً.',optionsTab:'خيارات',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'لغات',dictionariesTab:'قواميس',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'عن'},about:{title:'عن CKEditor',dlgTitle:'عن CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'للحصول على معلومات الترخيص ، يرجى زيارة موقعنا على شبكة الانترنت:',copy:'حقوق النشر © $1. جميع الحقوق محفوظة.'},maximize:'تكبير',minimize:'تصغير',fakeobjects:{anchor:'إرساء',flash:'رسم متحرك بالفلاش',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'كائن غير معروف'},resize:'اسحب لتغيير الحجم',colordialog:{title:'اختر لون',options:'Color Options',highlight:'إلقاء الضوء',selected:'مُختار',clear:'مسح'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'خصائص الصفحة',title:'خصائص الصفحة',design:'Design',meta:'المعرّفات الرأسية',chooseColor:'اختر',other:'<أخرى>',docTitle:'عنوان الصفحة',charset:'ترميز الحروف',charsetOther:'ترميز آخر',charsetASCII:'ASCII',charsetCE:'أوروبا الوسطى',charsetCT:'الصينية التقليدية (Big5)',charsetCR:'السيريلية',charsetGR:'اليونانية',charsetJP:'اليابانية',charsetKR:'الكورية',charsetTR:'التركية',charsetUN:'Unicode (UTF-8)',charsetWE:'أوروبا الغربية',docType:'ترويسة نوع الصفحة',docTypeOther:'ترويسة نوع صفحة أخرى',xhtmlDec:'تضمين إعلانات لغة XHTMLَ',bgColor:'لون الخلفية',bgImage:'رابط الصورة الخلفية',bgFixed:'جعلها علامة مائية',txtColor:'لون النص',margin:'هوامش الصفحة',marginTop:'علوي',marginLeft:'أيسر',marginRight:'أيمن',marginBottom:'سفلي',metaKeywords:'الكلمات الأساسية (مفصولة بفواصل)َ',metaDescription:'وصف الصفحة',metaAuthor:'الكاتب',metaCopyright:'المالك',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/bg.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/bg.js
index e8b8b92..5ed74a1 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/bg.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/bg.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.bg={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Ленти с инструменти',editor:'Текстов редактор за форматиран текст',source:'Източник',newPage:'Нова страница',save:'Запис',preview:'Преглед',cut:'Отрежи',copy:'Копирай',paste:'Вмъкни',print:'Печат',underline:'Подчертан',bold:'Удебелен',italic:'Наклонен',selectAll:'Избери всичко',removeFormat:'Премахване на форматирането',strike:'Зачертан текст',subscript:'Индексиран текст',superscript:'Суперскрипт',horizontalrule:'Вмъкване на хоризонтална линия',pagebreak:'Вмъкване на нова страница при печат',pagebreakAlt:'Разделяне на страници',unlink:'Премахни връзката',undo:'Възтанови',redo:'Връщане на предишен статус',common:{browseServer:'Избор от сървъра',url:'URL',protocol:'Протокол',upload:'Качване',uploadSubmit:'Изпращане към сървъра',image:'Снимка',flash:'Флаш',form:'Форма',checkbox:'Поле за избор',radio:'Радио бутон',textField:'Текстово поле',textarea:'Текстова зона',hiddenField:'Скрито поле',button:'Бутон',select:'Поле за избор',imageButton:'Бутон за снимка',notSet:'<не е избрано>',id:'ID',name:'Име',langDir:'Посока на езика',langDirLtr:'Ляво на дясно (ЛнД)',langDirRtl:'Дясно на ляво (ДнЛ)',langCode:'Код на езика',longDescr:'Уеб адрес за дълго описание',cssClass:'Класове за CSS',advisoryTitle:'Advisory Title',cssStyle:'Стил',ok:'ОК',cancel:'Отказ',close:'Затвори',preview:'Преглед',generalTab:'Общо',advancedTab:'Разширено',validateNumberFailed:'Тази стойност не е число',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Опции',target:'Цел',targetNew:'Нов прозорец (_blank)',targetTop:'Горна позиция (_top)',targetSelf:'Текущия прозорец (_self)',targetParent:'Основен прозорец (_parent)',langDirLTR:'Ляво на дясно (ЛнД)',langDirRTL:'Дясно на ляво (ДнЛ)',styles:'Стил',cssClasses:'Класове за CSS',width:'Ширина',height:'Височина',align:'Подравняване',alignLeft:'Ляво',alignRight:'Дясно',alignCenter:'Център',alignTop:'Горе',alignMiddle:'По средата',alignBottom:'Долу',invalidHeight:'Височината трябва да е число.',invalidWidth:'Ширина требе да е число.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Опции на контекстното меню'},specialChar:{toolbar:'Вмъкване на специален знак',title:'Избор на специален знак',options:'Опции за специален знак'},link:{toolbar:'Връзка',other:'<друго>',menu:'Промяна на връзка',title:'Връзка',info:'Инфо за връзката',target:'Цел',upload:'Качване',advanced:'Разширено',type:'Тип на връзката',toUrl:'Уеб адрес',toAnchor:'Връзка към котва в текста',toEmail:'E-mail',targetFrame:'<frame>',targetPopup:'<изкачащ прозорец>',targetFrameName:'Име на целевият прозорец',targetPopupName:'Име на изкачащ прозорец',popupFeatures:'Функции на изкачащ прозорец',popupResizable:'Оразмеряем',popupStatusBar:'Статусна лента',popupLocationBar:'Лента с локацията',popupToolbar:'Лента с инструменти',popupMenuBar:'Лента за меню',popupFullScreen:'Цял екран (IE)',popupScrollBars:'Скролери',popupDependent:'Зависимост (Netscape)',popupLeft:'Лява позиция',popupTop:'Горна позиция',id:'ID',langDir:'Посока на езика',langDirLTR:'Ляво на Дясно (ЛнД)',langDirRTL:'Дясно на Ляво (ДнЛ)',acccessKey:'Ключ за достъп',name:'Име',langCode:'Код за езика',tabIndex:'Tab Index',advisoryTitle:'Advisory Title',advisoryContentType:'Advisory Content Type',cssClasses:'Класове за CSS',charset:'Linked Resource Charset',styles:'Стил',rel:'Връзка',selectAnchor:'Изберете котва',anchorName:'По име на котва',anchorId:'По ID на елемент',emailAddress:'E-mail aдрес',emailSubject:'Тема',emailBody:'Съдържание',noAnchors:'(No anchors available in the document)',noUrl:'Моля въведете URL адреса',noEmail:'Моля въведете e-mail aдрес'},anchor:{toolbar:'Котва',menu:'Промяна на котва',title:'Настройки на котва',name:'Име на котва',errorName:'Моля въведете име на котвата',remove:'Премахване на котва'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Тип',start:'Старт',validateStartNumber:'List start number must be a whole number.',circle:'Кръг',disc:'Диск',square:'Квадрат',none:'Няма',notset:'<не е указано>',armenian:'Арменско номериране',georgian:'Грузинско номериране (an, ban, gan, и т.н.)',lowerRoman:'Малки римски числа (i, ii, iii, iv, v и т.н.)',upperRoman:'Големи римски числа (I, II, III, IV, V и т.н.)',lowerAlpha:'Малки букви (а, б, в, г, д и т.н.)',upperAlpha:'Големи букви (А, Б, В, Г, Д и т.н.)',lowerGreek:'Малки гръцки букви (алфа, бета, гама и т.н.)',decimal:'Числа (1, 2, 3 и др.)',decimalLeadingZero:'Числа с водеща нула (01, 02, 03 и т.н.)'},findAndReplace:{title:'Търсене и препокриване',find:'Търсене',replace:'Препокриване',findWhat:'Търси за:',replaceWith:'Препокрива с:',notFoundMsg:'Указаният текст не е намерен.',findOptions:'Find Options',matchCase:'Съвпадение',matchWord:'Съвпадение с дума',matchCyclic:'Циклично съвпадение',replaceAll:'Препокрий всички',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Таблица',title:'Настройки на таблицата',menu:'Настройки на таблицата',deleteTable:'Изтриване на таблица',rows:'Редове',columns:'Колони',border:'Размер на рамката',widthPx:'пиксела',widthPc:'процент',widthUnit:'единица за ширина',cellSpace:'Разтояние между клетките',cellPad:'Отделяне на клетките',caption:'Заглавие',summary:'Обща информация',headers:'Хедъри',headersNone:'Няма',headersColumn:'Първа колона',headersRow:'Първи ред',headersBoth:'Заедно',invalidRows:'Броят редове трябва да е по-голям от 0.',invalidCols:'Броят колони трябва да е по-голям от 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Клетка',insertBefore:'Вмъкване на клетка преди',insertAfter:'Вмъкване на клетка след',deleteCell:'Изтриване на клетки',merge:'Сливане на клетки',mergeRight:'Сливане в дясно',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Настройки на клетката',cellType:'Тип на клетката',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Авто. пренос',hAlign:'Хоризонтално подравняване',vAlign:'Вертикално подравняване',alignBaseline:'Базова линия',bgColor:'Фон',borderColor:'Цвят на рамката',data:'Данни',header:'Хедър',yes:'Да',no:'Не',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Изберете'},row:{menu:'Ред',insertBefore:'Insert Row Before',insertAfter:'Вмъкване на ред след',deleteRow:'Изтриване на редове'},column:{menu:'Колона',insertBefore:'Вмъкване на колона преди',insertAfter:'Вмъкване на колона след',deleteColumn:'Изтриване на колони'}},button:{title:'Настройки на бутона',text:'Текст (стойност)',type:'Тип',typeBtn:'Бутон',typeSbm:'Добави',typeRst:'Нулиране'},checkboxAndRadio:{checkboxTitle:'Checkbox Properties',radioTitle:'Настройки на радиобутон',value:'Стойност',selected:'Избрано'},form:{title:'Настройки на формата',menu:'Настройки на формата',action:'Действие',method:'Метод',encoding:'Кодиране'},select:{title:'Selection Field Properties',selectInfo:'Select Info',opAvail:'Налични опции',value:'Стойност',size:'Размер',lines:'линии',chkMulti:'Allow multiple selections',opText:'Текст',opValue:'Стойност',btnAdd:'Добави',btnModify:'Промени',btnUp:'На горе',btnDown:'На долу',btnSetValue:'Set as selected value',btnDelete:'Изтриване'},textarea:{title:'Опции за текстовата зона',cols:'Колони',rows:'Редове'},textfield:{title:'Настройки за текстово поле',name:'Име',value:'Стойност',charWidth:'Ширина на знаците',maxChars:'Макс. знаци',type:'Тип',typeText:'Текст',typePass:'Парола'},hidden:{title:'Настройки за скрито поле',name:'Име',value:'Стойност'},image:{title:'Настройки за снимка',titleButton:'Настойки за бутон за снимка',menu:'Настройки за снимка',infoTab:'Инфо за снимка',btnUpload:'Изпрати я на сървъра',upload:'Качване',alt:'Алтернативен текст',lockRatio:'Заключване на съотношението',resetSize:'Нулиране на размер',border:'Рамка',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Please type the image URL',linkTab:'Връзка',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Настройки за флаш',propertiesTab:'Настройки',title:'Настройки за флаш',chkPlay:'Авто. пускане',chkLoop:'Цикъл',chkMenu:'Enable Flash Menu',chkFull:'Allow Fullscreen',scale:'Scale',scaleAll:'Показва всичко',scaleNoBorder:'Без рамка',scaleFit:'Exact Fit',access:'Script Access',accessAlways:'Винаги',accessSameDomain:'Същият домейн',accessNever:'Никога',alignAbsBottom:'Abs Bottom',alignAbsMiddle:'Abs Middle',alignBaseline:'Baseline',alignTextTop:'Text Top',quality:'Качество',qualityBest:'Отлично',qualityHigh:'Високо',qualityAutoHigh:'Авто. високо',qualityMedium:'Средно',qualityAutoLow:'Авто. ниско',qualityLow:'Ниско',windowModeWindow:'Прозорец',windowModeOpaque:'Плътност',windowModeTransparent:'Прозрачност',windowMode:'Режим на прозореца',flashvars:'Променливи за Флаш',bgcolor:'Background color',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'Уеб адреса не трябва да е празен.',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Проверка на правопис',title:'Проверка на правопис',notAvailable:'Съжаляваме, но услугата не е достъпна за момента',errorLoading:'Error loading application service host: %s.',notInDic:'Не е в речника',changeTo:'Промени на',btnIgnore:'Игнорирай',btnIgnoreAll:'Игнорирай всичко',btnReplace:'Препокриване',btnReplaceAll:'Препокрий всичко',btnUndo:'Възтанови',noSuggestions:'- Няма препоръчани -',progress:'Проверява се правописа...',noMispell:'Spell check complete: No misspellings found',noChanges:'Spell check complete: No words changed',oneChange:'Spell check complete: One word changed',manyChanges:'Spell check complete: %1 words changed',ieSpellDownload:'Spell checker not installed. Do you want to download it now?'},smiley:{toolbar:'Усмивка',title:'Вмъкване на усмивка',options:'Опции за усмивката'},elementsPath:{eleLabel:'Път за елементите',eleTitle:'%1 елемент'},numberedlist:'Вмъкване/Премахване на номериран списък',bulletedlist:'Вмъкване/Премахване на точков списък',indent:'Увеличаване на отстъпа',outdent:'Намаляване на отстъпа',justify:{left:'Подравни в ляво',center:'Център',right:'Подравни в дясно',block:'Justify'},blockquote:'Блок за цитат',clipboard:{title:'Paste',cutError:'Настройките за сигурност на Вашия браузър не позволяват на редактора автоматично да изъплни действията за отрязване. Моля ползвайте клавиатурните команди за целта (ctrl+x).',copyError:"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).",pasteMsg:'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Paste from Word',title:'Paste from Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Paste as plain text',title:'Paste as Plain Text'},templates:{button:'Templates',title:'Content Templates',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Please select the template to open in the editor',emptyListMsg:'(No templates defined)'},showBlocks:'Показва блокове',stylesCombo:{label:'Styles',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Format',panelTitle:'Paragraph Format',tag_p:'Normal',tag_pre:'Formatted',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Стил',IdInputLabel:'ID',languageCodeInputLabel:' Код на езика',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Промяна на Div',remove:'Премахване на Div'},iframe:{title:'IFrame настройки',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Шрифт',voiceLabel:'Шрифт',panelTitle:'Име на шрифт'},fontSize:{label:'Размер',voiceLabel:'Размер на шрифт',panelTitle:'Размер на шрифт'},colorButton:{textColorTitle:'Цвят на шрифт',bgColorTitle:'Фонов цвят',panelTitle:'Цветове',auto:'Автоматично',more:'Още цветове'},colors:{'000':'Черно',800000:'Кестеняво','8B4513':'Светлокафяво','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Индиго',696969:'Тъмно сиво',B22222:'Огнено червено',A52A2A:'Кафяво',DAA520:'Златисто','006400':'Тъмно зелено','40E0D0':'Тюркуазено','0000CD':'Средно синьо',800080:'Пурпурно',808080:'Сиво',F00:'Червено',FF8C00:'Тъмно оранжево',FFD700:'Златно','008000':'Зелено','0FF':'Светло синьо','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Игнорирани думи и цифри',languagesTab:'Езици',dictionariesTab:'Речници',dic_field_name:'Име на речнк',dic_create:'Нов',dic_restore:'Възтановяване',dic_delete:'Изтриване',dic_rename:'Преименуване',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'Относно'},about:{title:'Относно CKEditor',dlgTitle:'Относно CKEditor',help:'Проверете $1 за помощ.',userGuide:"CKEditor User's Guide",moreInfo:'За лицензионна информация моля посетете сайта ни:',copy:'Copyright © $1. All rights reserved.'},maximize:'Максимизиране',minimize:'Минимизиране',fakeobjects:{anchor:'Кука',flash:'Флаш анимация',iframe:'IFrame',hiddenfield:'Скрито поле',unknown:'Неизвестен обект'},resize:'Влачете за да оразмерите',colordialog:{title:'Изберете цвят',options:'Цветови опции',highlight:'Осветяване',selected:'Изберете цвят',clear:'Изчистване'},toolbarCollapse:'Свиване на лентата с инструменти',toolbarExpand:'Разширяване на лентата с инструменти',toolbarGroups:{document:'Документ',clipboard:'Clipboard/Undo',editing:'Промяна',forms:'Форми',basicstyles:'Базови стилове',paragraph:'Параграф',links:'Връзки',insert:'Вмъкване',styles:'Стилове',colors:'Цветове',tools:'Инструменти'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Настройки на документа',title:'Настройки на документа',design:'Дизайн',meta:'Мета етикети',chooseColor:'Изберете',other:'Други...',docTitle:'Заглавие на страницата',charset:'Кодова таблица',charsetOther:'Друга кодова таблица',charsetASCII:'ASCII',charsetCE:'Централна европейска',charsetCT:'Китайски традиционен',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Document Type Heading',docTypeOther:'Other Document Type Heading',xhtmlDec:'Include XHTML Declarations',bgColor:'Background Color',bgImage:'Background Image URL',bgFixed:'Non-scrolling (Fixed) Background',txtColor:'Text Color',margin:'Page Margins',marginTop:'Top',marginLeft:'Left',marginRight:'Right',marginBottom:'Bottom',metaKeywords:'Document Indexing Keywords (comma separated)',metaDescription:'Document Description',metaAuthor:'Author',metaCopyright:'Copyright',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.bg={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Ленти с инструменти',editor:'Текстов редактор за форматиран текст',source:'Източник',newPage:'Нова страница',save:'Запис',preview:'Преглед',cut:'Отрежи',copy:'Копирай',paste:'Вмъкни',print:'Печат',underline:'Подчертан',bold:'Удебелен',italic:'Наклонен',selectAll:'Избери всичко',removeFormat:'Премахване на форматирането',strike:'Зачертан текст',subscript:'Индексиран текст',superscript:'Суперскрипт',horizontalrule:'Вмъкване на хоризонтална линия',pagebreak:'Вмъкване на нова страница при печат',pagebreakAlt:'Разделяне на страници',unlink:'Премахни връзката',undo:'Възтанови',redo:'Връщане на предишен статус',common:{browseServer:'Избор от сървъра',url:'URL',protocol:'Протокол',upload:'Качване',uploadSubmit:'Изпращане към сървъра',image:'Снимка',flash:'Флаш',form:'Форма',checkbox:'Поле за избор',radio:'Радио бутон',textField:'Текстово поле',textarea:'Текстова зона',hiddenField:'Скрито поле',button:'Бутон',select:'Поле за избор',imageButton:'Бутон за снимка',notSet:'<не е избрано>',id:'ID',name:'Име',langDir:'Посока на езика',langDirLtr:'Ляво на дясно (ЛнД)',langDirRtl:'Дясно на ляво (ДнЛ)',langCode:'Код на езика',longDescr:'Уеб адрес за дълго описание',cssClass:'Класове за CSS',advisoryTitle:'Advisory Title',cssStyle:'Стил',ok:'ОК',cancel:'Отказ',close:'Затвори',preview:'Преглед',generalTab:'Общо',advancedTab:'Разширено',validateNumberFailed:'Тази стойност не е число',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Опции',target:'Цел',targetNew:'Нов прозорец (_blank)',targetTop:'Горна позиция (_top)',targetSelf:'Текущия прозорец (_self)',targetParent:'Основен прозорец (_parent)',langDirLTR:'Ляво на дясно (ЛнД)',langDirRTL:'Дясно на ляво (ДнЛ)',styles:'Стил',cssClasses:'Класове за CSS',width:'Ширина',height:'Височина',align:'Подравняване',alignLeft:'Ляво',alignRight:'Дясно',alignCenter:'Център',alignTop:'Горе',alignMiddle:'По средата',alignBottom:'Долу',invalidHeight:'Височината трябва да е число.',invalidWidth:'Ширина требе да е число.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Опции на контекстното меню'},specialChar:{toolbar:'Вмъкване на специален знак',title:'Избор на специален знак',options:'Опции за специален знак'},link:{toolbar:'Връзка',other:'<друго>',menu:'Промяна на връзка',title:'Връзка',info:'Инфо за връзката',target:'Цел',upload:'Качване',advanced:'Разширено',type:'Тип на връзката',toUrl:'Уеб адрес',toAnchor:'Връзка към котва в текста',toEmail:'E-mail',targetFrame:'<frame>',targetPopup:'<изкачащ прозорец>',targetFrameName:'Име на целевият прозорец',targetPopupName:'Име на изкачащ прозорец',popupFeatures:'Функции на изкачащ прозорец',popupResizable:'Оразмеряем',popupStatusBar:'Статусна лента',popupLocationBar:'Лента с локацията',popupToolbar:'Лента с инструменти',popupMenuBar:'Лента за меню',popupFullScreen:'Цял екран (IE)',popupScrollBars:'Скролери',popupDependent:'Зависимост (Netscape)',popupLeft:'Лява позиция',popupTop:'Горна позиция',id:'ID',langDir:'Посока на езика',langDirLTR:'Ляво на Дясно (ЛнД)',langDirRTL:'Дясно на Ляво (ДнЛ)',acccessKey:'Ключ за достъп',name:'Име',langCode:'Код за езика',tabIndex:'Tab Index',advisoryTitle:'Advisory Title',advisoryContentType:'Advisory Content Type',cssClasses:'Класове за CSS',charset:'Linked Resource Charset',styles:'Стил',rel:'Връзка',selectAnchor:'Изберете котва',anchorName:'По име на котва',anchorId:'По ID на елемент',emailAddress:'E-mail aдрес',emailSubject:'Тема',emailBody:'Съдържание',noAnchors:'(No anchors available in the document)',noUrl:'Моля въведете URL адреса',noEmail:'Моля въведете e-mail aдрес'},anchor:{toolbar:'Котва',menu:'Промяна на котва',title:'Настройки на котва',name:'Име на котва',errorName:'Моля въведете име на котвата',remove:'Премахване на котва'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Тип',start:'Старт',validateStartNumber:'List start number must be a whole number.',circle:'Кръг',disc:'Диск',square:'Квадрат',none:'Няма',notset:'<не е указано>',armenian:'Арменско номериране',georgian:'Грузинско номериране (an, ban, gan, и т.н.)',lowerRoman:'Малки римски числа (i, ii, iii, iv, v и т.н.)',upperRoman:'Големи римски числа (I, II, III, IV, V и т.н.)',lowerAlpha:'Малки букви (а, б, в, г, д и т.н.)',upperAlpha:'Големи букви (А, Б, В, Г, Д и т.н.)',lowerGreek:'Малки гръцки букви (алфа, бета, гама и т.н.)',decimal:'Числа (1, 2, 3 и др.)',decimalLeadingZero:'Числа с водеща нула (01, 02, 03 и т.н.)'},findAndReplace:{title:'Търсене и препокриване',find:'Търсене',replace:'Препокриване',findWhat:'Търси за:',replaceWith:'Препокрива с:',notFoundMsg:'Указаният текст не е намерен.',findOptions:'Find Options',matchCase:'Съвпадение',matchWord:'Съвпадение с дума',matchCyclic:'Циклично съвпадение',replaceAll:'Препокрий всички',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Таблица',title:'Настройки на таблицата',menu:'Настройки на таблицата',deleteTable:'Изтриване на таблица',rows:'Редове',columns:'Колони',border:'Размер на рамката',widthPx:'пиксела',widthPc:'процент',widthUnit:'единица за ширина',cellSpace:'Разтояние между клетките',cellPad:'Отделяне на клетките',caption:'Заглавие',summary:'Обща информация',headers:'Хедъри',headersNone:'Няма',headersColumn:'Първа колона',headersRow:'Първи ред',headersBoth:'Заедно',invalidRows:'Броят редове трябва да е по-голям от 0.',invalidCols:'Броят колони трябва да е по-голям от 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Клетка',insertBefore:'Вмъкване на клетка преди',insertAfter:'Вмъкване на клетка след',deleteCell:'Изтриване на клетки',merge:'Сливане на клетки',mergeRight:'Сливане в дясно',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Настройки на клетката',cellType:'Тип на клетката',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Авто. пренос',hAlign:'Хоризонтално подравняване',vAlign:'Вертикално подравняване',alignBaseline:'Базова линия',bgColor:'Фон',borderColor:'Цвят на рамката',data:'Данни',header:'Хедър',yes:'Да',no:'Не',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Изберете'},row:{menu:'Ред',insertBefore:'Insert Row Before',insertAfter:'Вмъкване на ред след',deleteRow:'Изтриване на редове'},column:{menu:'Колона',insertBefore:'Вмъкване на колона преди',insertAfter:'Вмъкване на колона след',deleteColumn:'Изтриване на колони'}},button:{title:'Настройки на бутона',text:'Текст (стойност)',type:'Тип',typeBtn:'Бутон',typeSbm:'Добави',typeRst:'Нулиране'},checkboxAndRadio:{checkboxTitle:'Checkbox Properties',radioTitle:'Настройки на радиобутон',value:'Стойност',selected:'Избрано'},form:{title:'Настройки на формата',menu:'Настройки на формата',action:'Действие',method:'Метод',encoding:'Кодиране'},select:{title:'Selection Field Properties',selectInfo:'Select Info',opAvail:'Налични опции',value:'Стойност',size:'Размер',lines:'линии',chkMulti:'Allow multiple selections',opText:'Текст',opValue:'Стойност',btnAdd:'Добави',btnModify:'Промени',btnUp:'На горе',btnDown:'На долу',btnSetValue:'Set as selected value',btnDelete:'Изтриване'},textarea:{title:'Опции за текстовата зона',cols:'Колони',rows:'Редове'},textfield:{title:'Настройки за текстово поле',name:'Име',value:'Стойност',charWidth:'Ширина на знаците',maxChars:'Макс. знаци',type:'Тип',typeText:'Текст',typePass:'Парола'},hidden:{title:'Настройки за скрито поле',name:'Име',value:'Стойност'},image:{title:'Настройки за снимка',titleButton:'Настойки за бутон за снимка',menu:'Настройки за снимка',infoTab:'Инфо за снимка',btnUpload:'Изпрати я на сървъра',upload:'Качване',alt:'Алтернативен текст',lockRatio:'Заключване на съотношението',resetSize:'Нулиране на размер',border:'Рамка',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Please type the image URL',linkTab:'Връзка',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Настройки за флаш',propertiesTab:'Настройки',title:'Настройки за флаш',chkPlay:'Авто. пускане',chkLoop:'Цикъл',chkMenu:'Enable Flash Menu',chkFull:'Allow Fullscreen',scale:'Scale',scaleAll:'Показва всичко',scaleNoBorder:'Без рамка',scaleFit:'Exact Fit',access:'Script Access',accessAlways:'Винаги',accessSameDomain:'Същият домейн',accessNever:'Никога',alignAbsBottom:'Abs Bottom',alignAbsMiddle:'Abs Middle',alignBaseline:'Baseline',alignTextTop:'Text Top',quality:'Качество',qualityBest:'Отлично',qualityHigh:'Високо',qualityAutoHigh:'Авто. високо',qualityMedium:'Средно',qualityAutoLow:'Авто. ниско',qualityLow:'Ниско',windowModeWindow:'Прозорец',windowModeOpaque:'Плътност',windowModeTransparent:'Прозрачност',windowMode:'Режим на прозореца',flashvars:'Променливи за Флаш',bgcolor:'Background color',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'Уеб адреса не трябва да е празен.',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Проверка на правопис',title:'Проверка на правопис',notAvailable:'Съжаляваме, но услугата не е достъпна за момента',errorLoading:'Error loading application service host: %s.',notInDic:'Не е в речника',changeTo:'Промени на',btnIgnore:'Игнорирай',btnIgnoreAll:'Игнорирай всичко',btnReplace:'Препокриване',btnReplaceAll:'Препокрий всичко',btnUndo:'Възтанови',noSuggestions:'- Няма препоръчани -',progress:'Проверява се правописа...',noMispell:'Spell check complete: No misspellings found',noChanges:'Spell check complete: No words changed',oneChange:'Spell check complete: One word changed',manyChanges:'Spell check complete: %1 words changed',ieSpellDownload:'Spell checker not installed. Do you want to download it now?'},smiley:{toolbar:'Усмивка',title:'Вмъкване на усмивка',options:'Опции за усмивката'},elementsPath:{eleLabel:'Път за елементите',eleTitle:'%1 елемент'},numberedlist:'Вмъкване/Премахване на номериран списък',bulletedlist:'Вмъкване/Премахване на точков списък',indent:'Увеличаване на отстъпа',outdent:'Намаляване на отстъпа',justify:{left:'Подравни в ляво',center:'Център',right:'Подравни в дясно',block:'Justify'},blockquote:'Блок за цитат',clipboard:{title:'Paste',cutError:'Настройките за сигурност на Вашия браузър не позволяват на редактора автоматично да изъплни действията за отрязване. Моля ползвайте клавиатурните команди за целта (ctrl+x).',copyError:"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).",pasteMsg:'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Paste from Word',title:'Paste from Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Paste as plain text',title:'Paste as Plain Text'},templates:{button:'Templates',title:'Content Templates',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Please select the template to open in the editor',emptyListMsg:'(No templates defined)'},showBlocks:'Показва блокове',stylesCombo:{label:'Styles',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Format',panelTitle:'Paragraph Format',tag_p:'Normal',tag_pre:'Formatted',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Стил',IdInputLabel:'ID',languageCodeInputLabel:' Код на езика',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Промяна на Div',remove:'Премахване на Div'},iframe:{title:'IFrame настройки',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Шрифт',voiceLabel:'Шрифт',panelTitle:'Име на шрифт'},fontSize:{label:'Размер',voiceLabel:'Размер на шрифт',panelTitle:'Размер на шрифт'},colorButton:{textColorTitle:'Цвят на шрифт',bgColorTitle:'Фонов цвят',panelTitle:'Цветове',auto:'Автоматично',more:'Още цветове'},colors:{'000':'Черно',800000:'Кестеняво','8B4513':'Светлокафяво','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Индиго',696969:'Тъмно сиво',B22222:'Огнено червено',A52A2A:'Кафяво',DAA520:'Златисто','006400':'Тъмно зелено','40E0D0':'Тюркуазено','0000CD':'Средно синьо',800080:'Пурпурно',808080:'Сиво',F00:'Червено',FF8C00:'Тъмно оранжево',FFD700:'Златно','008000':'Зелено','0FF':'Светло синьо','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Игнорирани думи и цифри',languagesTab:'Езици',dictionariesTab:'Речници',dic_field_name:'Име на речнк',dic_create:'Нов',dic_restore:'Възтановяване',dic_delete:'Изтриване',dic_rename:'Преименуване',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'Относно'},about:{title:'Относно CKEditor',dlgTitle:'Относно CKEditor',help:'Проверете $1 за помощ.',userGuide:"CKEditor User's Guide",moreInfo:'За лицензионна информация моля посетете сайта ни:',copy:'Copyright © $1. All rights reserved.'},maximize:'Максимизиране',minimize:'Минимизиране',fakeobjects:{anchor:'Кука',flash:'Флаш анимация',iframe:'IFrame',hiddenfield:'Скрито поле',unknown:'Неизвестен обект'},resize:'Влачете за да оразмерите',colordialog:{title:'Изберете цвят',options:'Цветови опции',highlight:'Осветяване',selected:'Изберете цвят',clear:'Изчистване'},toolbarCollapse:'Свиване на лентата с инструменти',toolbarExpand:'Разширяване на лентата с инструменти',toolbarGroups:{document:'Документ',clipboard:'Clipboard/Undo',editing:'Промяна',forms:'Форми',basicstyles:'Базови стилове',paragraph:'Параграф',links:'Връзки',insert:'Вмъкване',styles:'Стилове',colors:'Цветове',tools:'Инструменти'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Настройки на документа',title:'Настройки на документа',design:'Дизайн',meta:'Мета етикети',chooseColor:'Изберете',other:'Други...',docTitle:'Заглавие на страницата',charset:'Кодова таблица',charsetOther:'Друга кодова таблица',charsetASCII:'ASCII',charsetCE:'Централна европейска',charsetCT:'Китайски традиционен',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Document Type Heading',docTypeOther:'Other Document Type Heading',xhtmlDec:'Include XHTML Declarations',bgColor:'Background Color',bgImage:'Background Image URL',bgFixed:'Non-scrolling (Fixed) Background',txtColor:'Text Color',margin:'Page Margins',marginTop:'Top',marginLeft:'Left',marginRight:'Right',marginBottom:'Bottom',metaKeywords:'Document Indexing Keywords (comma separated)',metaDescription:'Document Description',metaAuthor:'Author',metaCopyright:'Copyright',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/bn.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/bn.js
index beb38f6..4d98cc5 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/bn.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/bn.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.bn={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'সোর্স',newPage:'নতুন পেজ',save:'সংরক্ষন কর',preview:'প্রিভিউ',cut:'কাট',copy:'কপি',paste:'পেস্ট',print:'প্রিন্ট',underline:'আন্ডারলাইন',bold:'বোল্ড',italic:'ইটালিক',selectAll:'সব সিলেক্ট কর',removeFormat:'ফরমেট সরাও',strike:'স্ট্রাইক থ্রু',subscript:'অধোলেখ',superscript:'অভিলেখ',horizontalrule:'রেখা যুক্ত কর',pagebreak:'পেজ ব্রেক',pagebreakAlt:'Page Break',unlink:'লিংক সরাও',undo:'আনডু',redo:'রি-ডু',common:{browseServer:'ব্রাউজ সার্ভার',url:'URL',protocol:'প্রোটোকল',upload:'আপলোড',uploadSubmit:'ইহাকে সার্ভারে প্রেরন কর',image:'ছবির লেবেল যুক্ত কর',flash:'ফ্লাশ লেবেল যুক্ত কর',form:'ফর্ম',checkbox:'চেক বাক্স',radio:'রেডিও বাটন',textField:'টেক্সট ফীল্ড',textarea:'টেক্সট এরিয়া',hiddenField:'গুপ্ত ফীল্ড',button:'বাটন',select:'বাছাই ফীল্ড',imageButton:'ছবির বাটন',notSet:'<সেট নেই>',id:'আইডি',name:'নাম',langDir:'ভাষা লেখার দিক',langDirLtr:'বাম থেকে ডান (LTR)',langDirRtl:'ডান থেকে বাম (RTL)',langCode:'ভাষা কোড',longDescr:'URL এর লম্বা বর্ণনা',cssClass:'স্টাইল-শীট ক্লাস',advisoryTitle:'পরামর্শ শীর্ষক',cssStyle:'স্টাইল',ok:'ওকে',cancel:'বাতিল',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'এডভান্সড',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'প্রস্থ',height:'দৈর্ঘ্য',align:'এলাইন',alignLeft:'বামে',alignRight:'ডানে',alignCenter:'মাঝখানে',alignTop:'উপর',alignMiddle:'মধ্য',alignBottom:'নীচে',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'বিশেষ অক্ষর যুক্ত কর',title:'বিশেষ ক্যারেক্টার বাছাই কর',options:'Special Character Options'},link:{toolbar:'লিংক যুক্ত কর',other:'<other>',menu:'লিংক সম্পাদন',title:'লিংক',info:'লিংক তথ্য',target:'টার্গেট',upload:'আপলোড',advanced:'এডভান্সড',type:'লিংক প্রকার',toUrl:'URL',toAnchor:'এই পেজে নোঙর কর',toEmail:'ইমেইল',targetFrame:'<ফ্রেম>',targetPopup:'<পপআপ উইন্ডো>',targetFrameName:'টার্গেট ফ্রেমের নাম',targetPopupName:'পপআপ উইন্ডোর নাম',popupFeatures:'পপআপ উইন্ডো ফীচার সমূহ',popupResizable:'Resizable',popupStatusBar:'স্ট্যাটাস বার',popupLocationBar:'লোকেশন বার',popupToolbar:'টুল বার',popupMenuBar:'মেন্যু বার',popupFullScreen:'পূর্ণ পর্দা জুড়ে (IE)',popupScrollBars:'স্ক্রল বার',popupDependent:'ডিপেন্ডেন্ট (Netscape)',popupLeft:'বামের পজিশন',popupTop:'ডানের পজিশন',id:'Id',langDir:'ভাষা লেখার দিক',langDirLTR:'বাম থেকে ডান (LTR)',langDirRTL:'ডান থেকে বাম (RTL)',acccessKey:'এক্সেস কী',name:'নাম',langCode:'ভাষা লেখার দিক',tabIndex:'ট্যাব ইন্ডেক্স',advisoryTitle:'পরামর্শ শীর্ষক',advisoryContentType:'পরামর্শ কন্টেন্টের প্রকার',cssClasses:'স্টাইল-শীট ক্লাস',charset:'লিংক রিসোর্স ক্যারেক্টর সেট',styles:'স্টাইল',rel:'Relationship',selectAnchor:'নোঙর বাছাই',anchorName:'নোঙরের নাম দিয়ে',anchorId:'নোঙরের আইডি দিয়ে',emailAddress:'ইমেইল ঠিকানা',emailSubject:'মেসেজের বিষয়',emailBody:'মেসেজের দেহ',noAnchors:'(No anchors available in the document)',noUrl:'অনুগ্রহ করে URL লিংক টাইপ করুন',noEmail:'অনুগ্রহ করে ইমেইল এড্রেস টাইপ করুন'},anchor:{toolbar:'নোঙ্গর',menu:'নোঙর প্রোপার্টি',title:'নোঙর প্রোপার্টি',name:'নোঙরের নাম',errorName:'নোঙরের নাম টাইপ করুন',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'খোজো',replace:'রিপ্লেস',findWhat:'যা খুঁজতে হবে:',replaceWith:'যার সাথে বদলাতে হবে:',notFoundMsg:'আপনার উল্লেখিত টেকস্ট পাওয়া যায়নি',findOptions:'Find Options',matchCase:'কেস মিলাও',matchWord:'পুরা শব্দ মেলাও',matchCyclic:'Match cyclic',replaceAll:'সব বদলে দাও',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'টেবিলের লেবেল যুক্ত কর',title:'টেবিল প্রোপার্টি',menu:'টেবিল প্রোপার্টি',deleteTable:'টেবিল ডিলীট কর',rows:'রো',columns:'কলাম',border:'বর্ডার সাইজ',widthPx:'পিক্সেল',widthPc:'শতকরা',widthUnit:'width unit',cellSpace:'সেল স্পেস',cellPad:'সেল প্যাডিং',caption:'শীর্ষক',summary:'সারাংশ',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'সেল',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'সেল মুছে দাও',merge:'সেল জোড়া দাও',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'রো',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'রো মুছে দাও'},column:{menu:'কলাম',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'কলাম মুছে দাও'}},button:{title:'বাটন প্রোপার্টি',text:'টেক্সট (ভ্যালু)',type:'প্রকার',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'চেক বক্স প্রোপার্টি',radioTitle:'রেডিও বাটন প্রোপার্টি',value:'ভ্যালু',selected:'সিলেক্টেড'},form:{title:'ফর্ম প্রোপার্টি',menu:'ফর্ম প্রোপার্টি',action:'একশ্যন',method:'পদ্ধতি',encoding:'Encoding'},select:{title:'বাছাই ফীল্ড প্রোপার্টি',selectInfo:'তথ্য',opAvail:'অন্যান্য বিকল্প',value:'ভ্যালু',size:'সাইজ',lines:'লাইন সমূহ',chkMulti:'একাধিক সিলেকশন এলাউ কর',opText:'টেক্সট',opValue:'ভ্যালু',btnAdd:'যুক্ত',btnModify:'বদলে দাও',btnUp:'উপর',btnDown:'নীচে',btnSetValue:'বাছাই করা ভ্যালু হিসেবে সেট কর',btnDelete:'ডিলীট'},textarea:{title:'টেক্সট এরিয়া প্রোপার্টি',cols:'কলাম',rows:'রো'},textfield:{title:'টেক্সট ফীল্ড প্রোপার্টি',name:'নাম',value:'ভ্যালু',charWidth:'ক্যারেক্টার প্রশস্ততা',maxChars:'সর্বাধিক ক্যারেক্টার',type:'টাইপ',typeText:'টেক্সট',typePass:'পাসওয়ার্ড'},hidden:{title:'গুপ্ত ফীল্ড প্রোপার্টি',name:'নাম',value:'ভ্যালু'},image:{title:'ছবির প্রোপার্টি',titleButton:'ছবি বাটন প্রোপার্টি',menu:'ছবির প্রোপার্টি',infoTab:'ছবির তথ্য',btnUpload:'ইহাকে সার্ভারে প্রেরন কর',upload:'আপলোড',alt:'বিকল্প টেক্সট',lockRatio:'অনুপাত লক কর',resetSize:'সাইজ পূর্বাবস্থায় ফিরিয়ে দাও',border:'বর্ডার',hSpace:'হরাইজন্টাল স্পেস',vSpace:'ভার্টিকেল স্পেস',alertUrl:'অনুগ্রহক করে ছবির URL টাইপ করুন',linkTab:'লিংক',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'ফ্লাশ প্রোপার্টি',propertiesTab:'Properties',title:'ফ্ল্যাশ প্রোপার্টি',chkPlay:'অটো প্লে',chkLoop:'লূপ',chkMenu:'ফ্ল্যাশ মেনু এনাবল কর',chkFull:'Allow Fullscreen',scale:'স্কেল',scaleAll:'সব দেখাও',scaleNoBorder:'কোনো বর্ডার নেই',scaleFit:'নিখুঁত ফিট',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs নীচে',alignAbsMiddle:'Abs উপর',alignBaseline:'মূল রেখা',alignTextTop:'টেক্সট উপর',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'বেকগ্রাউন্ড রং',hSpace:'হরাইজন্টাল স্পেস',vSpace:'ভার্টিকেল স্পেস',validateSrc:'অনুগ্রহ করে URL লিংক টাইপ করুন',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'বানান চেক',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'শব্দকোষে নেই',changeTo:'এতে বদলাও',btnIgnore:'ইগনোর কর',btnIgnoreAll:'সব ইগনোর কর',btnReplace:'বদলে দাও',btnReplaceAll:'সব বদলে দাও',btnUndo:'আন্ডু',noSuggestions:'- কোন সাজেশন নেই -',progress:'বানান পরীক্ষা চলছে...',noMispell:'বানান পরীক্ষা শেষ: কোন ভুল বানান পাওয়া যায়নি',noChanges:'বানান পরীক্ষা শেষ: কোন শব্দ পরিবর্তন করা হয়নি',oneChange:'বানান পরীক্ষা শেষ: একটি মাত্র শব্দ পরিবর্তন করা হয়েছে',manyChanges:'বানান পরীক্ষা শেষ: %1 গুলো শব্দ বদলে গ্যাছে',ieSpellDownload:'বানান পরীক্ষক ইনস্টল করা নেই। আপনি কি এখনই এটা ডাউনলোড করতে চান?'},smiley:{toolbar:'স্মাইলী',title:'স্মাইলী যুক্ত কর',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'সাংখ্যিক লিস্টের লেবেল',bulletedlist:'বুলেট লিস্ট লেবেল',indent:'ইনডেন্ট বাড়াও',outdent:'ইনডেন্ট কমাও',justify:{left:'বা দিকে ঘেঁষা',center:'মাঝ বরাবর ঘেষা',right:'ডান দিকে ঘেঁষা',block:'ব্লক জাস্টিফাই'},blockquote:'Block Quote',clipboard:{title:'পেস্ট',cutError:'আপনার ব্রাউজারের সুরক্ষা সেটিংস এডিটরকে অটোমেটিক কাট করার অনুমতি দেয়নি। দয়া করে এই কাজের জন্য কিবোর্ড ব্যবহার করুন (Ctrl/Cmd+X)।',copyError:'আপনার ব্রাউজারের সুরক্ষা সেটিংস এডিটরকে অটোমেটিক কপি করার অনুমতি দেয়নি। দয়া করে এই কাজের জন্য কিবোর্ড ব্যবহার করুন (Ctrl/Cmd+C)।',pasteMsg:'অনুগ্রহ করে নীচের বাক্সে কিবোর্ড ব্যবহার করে (<STRONG>Ctrl/Cmd+V</STRONG>) পেস্ট করুন এবং <STRONG>OK</STRONG> চাপ দিন',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'পেস্ট (শব্দ)',title:'পেস্ট (শব্দ)',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'সাদা টেক্সট হিসেবে পেস্ট কর',title:'সাদা টেক্সট হিসেবে পেস্ট কর'},templates:{button:'টেমপ্লেট',title:'কনটেন্ট টেমপ্লেট',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'অনুগ্রহ করে এডিটরে ওপেন করার জন্য টেমপ্লেট বাছাই করুন<br>(আসল কনটেন্ট হারিয়ে যাবে):',emptyListMsg:'(কোন টেমপ্লেট ডিফাইন করা নেই)'},showBlocks:'Show Blocks',stylesCombo:{label:'স্টাইল',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'ফন্ট ফরমেট',panelTitle:'ফন্ট ফরমেট',tag_p:'সাধারণ',tag_pre:'ফর্মেটেড',tag_address:'ঠিকানা',tag_h1:'শীর্ষক ১',tag_h2:'শীর্ষক ২',tag_h3:'শীর্ষক ৩',tag_h4:'শীর্ষক ৪',tag_h5:'শীর্ষক ৫',tag_h6:'শীর্ষক ৬',tag_div:'শীর্ষক (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'ফন্ট',voiceLabel:'Font',panelTitle:'ফন্ট'},fontSize:{label:'সাইজ',voiceLabel:'Font Size',panelTitle:'সাইজ'},colorButton:{textColorTitle:'টেক্স্ট রং',bgColorTitle:'বেকগ্রাউন্ড রং',panelTitle:'Colors',auto:'অটোমেটিক',more:'আরও রং...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'ডক্যুমেন্ট প্রোপার্টি',title:'ডক্যুমেন্ট প্রোপার্টি',design:'Design',meta:'মেটাডেটা',chooseColor:'Choose',other:'<other>',docTitle:'পেজ শীর্ষক',charset:'ক্যারেক্টার সেট এনকোডিং',charsetOther:'অন্য ক্যারেক্টার সেট এনকোডিং',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'ডক্যুমেন্ট টাইপ হেডিং',docTypeOther:'অন্য ডক্যুমেন্ট টাইপ হেডিং',xhtmlDec:'XHTML ডেক্লারেশন যুক্ত কর',bgColor:'ব্যাকগ্রাউন্ড রং',bgImage:'ব্যাকগ্রাউন্ড ছবির URL',bgFixed:'স্ক্রলহীন ব্যাকগ্রাউন্ড',txtColor:'টেক্স্ট রং',margin:'পেজ মার্জিন',marginTop:'উপর',marginLeft:'বামে',marginRight:'ডানে',marginBottom:'নীচে',metaKeywords:'ডক্যুমেন্ট ইন্ডেক্স কিওয়ার্ড (কমা দ্বারা বিচ্ছিন্ন)',metaDescription:'ডক্যূমেন্ট বর্ণনা',metaAuthor:'লেখক',metaCopyright:'কপীরাইট',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.bn={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'সোর্স',newPage:'নতুন পেজ',save:'সংরক্ষন কর',preview:'প্রিভিউ',cut:'কাট',copy:'কপি',paste:'পেস্ট',print:'প্রিন্ট',underline:'আন্ডারলাইন',bold:'বোল্ড',italic:'ইটালিক',selectAll:'সব সিলেক্ট কর',removeFormat:'ফরমেট সরাও',strike:'স্ট্রাইক থ্রু',subscript:'অধোলেখ',superscript:'অভিলেখ',horizontalrule:'রেখা যুক্ত কর',pagebreak:'পেজ ব্রেক',pagebreakAlt:'Page Break',unlink:'লিংক সরাও',undo:'আনডু',redo:'রি-ডু',common:{browseServer:'ব্রাউজ সার্ভার',url:'URL',protocol:'প্রোটোকল',upload:'আপলোড',uploadSubmit:'ইহাকে সার্ভারে প্রেরন কর',image:'ছবির লেবেল যুক্ত কর',flash:'ফ্লাশ লেবেল যুক্ত কর',form:'ফর্ম',checkbox:'চেক বাক্স',radio:'রেডিও বাটন',textField:'টেক্সট ফীল্ড',textarea:'টেক্সট এরিয়া',hiddenField:'গুপ্ত ফীল্ড',button:'বাটন',select:'বাছাই ফীল্ড',imageButton:'ছবির বাটন',notSet:'<সেট নেই>',id:'আইডি',name:'নাম',langDir:'ভাষা লেখার দিক',langDirLtr:'বাম থেকে ডান (LTR)',langDirRtl:'ডান থেকে বাম (RTL)',langCode:'ভাষা কোড',longDescr:'URL এর লম্বা বর্ণনা',cssClass:'স্টাইল-শীট ক্লাস',advisoryTitle:'পরামর্শ শীর্ষক',cssStyle:'স্টাইল',ok:'ওকে',cancel:'বাতিল',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'এডভান্সড',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'প্রস্থ',height:'দৈর্ঘ্য',align:'এলাইন',alignLeft:'বামে',alignRight:'ডানে',alignCenter:'মাঝখানে',alignTop:'উপর',alignMiddle:'মধ্য',alignBottom:'নীচে',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'বিশেষ অক্ষর যুক্ত কর',title:'বিশেষ ক্যারেক্টার বাছাই কর',options:'Special Character Options'},link:{toolbar:'লিংক যুক্ত কর',other:'<other>',menu:'লিংক সম্পাদন',title:'লিংক',info:'লিংক তথ্য',target:'টার্গেট',upload:'আপলোড',advanced:'এডভান্সড',type:'লিংক প্রকার',toUrl:'URL',toAnchor:'এই পেজে নোঙর কর',toEmail:'ইমেইল',targetFrame:'<ফ্রেম>',targetPopup:'<পপআপ উইন্ডো>',targetFrameName:'টার্গেট ফ্রেমের নাম',targetPopupName:'পপআপ উইন্ডোর নাম',popupFeatures:'পপআপ উইন্ডো ফীচার সমূহ',popupResizable:'Resizable',popupStatusBar:'স্ট্যাটাস বার',popupLocationBar:'লোকেশন বার',popupToolbar:'টুল বার',popupMenuBar:'মেন্যু বার',popupFullScreen:'পূর্ণ পর্দা জুড়ে (IE)',popupScrollBars:'স্ক্রল বার',popupDependent:'ডিপেন্ডেন্ট (Netscape)',popupLeft:'বামের পজিশন',popupTop:'ডানের পজিশন',id:'Id',langDir:'ভাষা লেখার দিক',langDirLTR:'বাম থেকে ডান (LTR)',langDirRTL:'ডান থেকে বাম (RTL)',acccessKey:'এক্সেস কী',name:'নাম',langCode:'ভাষা লেখার দিক',tabIndex:'ট্যাব ইন্ডেক্স',advisoryTitle:'পরামর্শ শীর্ষক',advisoryContentType:'পরামর্শ কন্টেন্টের প্রকার',cssClasses:'স্টাইল-শীট ক্লাস',charset:'লিংক রিসোর্স ক্যারেক্টর সেট',styles:'স্টাইল',rel:'Relationship',selectAnchor:'নোঙর বাছাই',anchorName:'নোঙরের নাম দিয়ে',anchorId:'নোঙরের আইডি দিয়ে',emailAddress:'ইমেইল ঠিকানা',emailSubject:'মেসেজের বিষয়',emailBody:'মেসেজের দেহ',noAnchors:'(No anchors available in the document)',noUrl:'অনুগ্রহ করে URL লিংক টাইপ করুন',noEmail:'অনুগ্রহ করে ইমেইল এড্রেস টাইপ করুন'},anchor:{toolbar:'নোঙ্গর',menu:'নোঙর প্রোপার্টি',title:'নোঙর প্রোপার্টি',name:'নোঙরের নাম',errorName:'নোঙরের নাম টাইপ করুন',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'খোজো',replace:'রিপ্লেস',findWhat:'যা খুঁজতে হবে:',replaceWith:'যার সাথে বদলাতে হবে:',notFoundMsg:'আপনার উল্লেখিত টেকস্ট পাওয়া যায়নি',findOptions:'Find Options',matchCase:'কেস মিলাও',matchWord:'পুরা শব্দ মেলাও',matchCyclic:'Match cyclic',replaceAll:'সব বদলে দাও',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'টেবিলের লেবেল যুক্ত কর',title:'টেবিল প্রোপার্টি',menu:'টেবিল প্রোপার্টি',deleteTable:'টেবিল ডিলীট কর',rows:'রো',columns:'কলাম',border:'বর্ডার সাইজ',widthPx:'পিক্সেল',widthPc:'শতকরা',widthUnit:'width unit',cellSpace:'সেল স্পেস',cellPad:'সেল প্যাডিং',caption:'শীর্ষক',summary:'সারাংশ',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'সেল',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'সেল মুছে দাও',merge:'সেল জোড়া দাও',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'রো',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'রো মুছে দাও'},column:{menu:'কলাম',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'কলাম মুছে দাও'}},button:{title:'বাটন প্রোপার্টি',text:'টেক্সট (ভ্যালু)',type:'প্রকার',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'চেক বক্স প্রোপার্টি',radioTitle:'রেডিও বাটন প্রোপার্টি',value:'ভ্যালু',selected:'সিলেক্টেড'},form:{title:'ফর্ম প্রোপার্টি',menu:'ফর্ম প্রোপার্টি',action:'একশ্যন',method:'পদ্ধতি',encoding:'Encoding'},select:{title:'বাছাই ফীল্ড প্রোপার্টি',selectInfo:'তথ্য',opAvail:'অন্যান্য বিকল্প',value:'ভ্যালু',size:'সাইজ',lines:'লাইন সমূহ',chkMulti:'একাধিক সিলেকশন এলাউ কর',opText:'টেক্সট',opValue:'ভ্যালু',btnAdd:'যুক্ত',btnModify:'বদলে দাও',btnUp:'উপর',btnDown:'নীচে',btnSetValue:'বাছাই করা ভ্যালু হিসেবে সেট কর',btnDelete:'ডিলীট'},textarea:{title:'টেক্সট এরিয়া প্রোপার্টি',cols:'কলাম',rows:'রো'},textfield:{title:'টেক্সট ফীল্ড প্রোপার্টি',name:'নাম',value:'ভ্যালু',charWidth:'ক্যারেক্টার প্রশস্ততা',maxChars:'সর্বাধিক ক্যারেক্টার',type:'টাইপ',typeText:'টেক্সট',typePass:'পাসওয়ার্ড'},hidden:{title:'গুপ্ত ফীল্ড প্রোপার্টি',name:'নাম',value:'ভ্যালু'},image:{title:'ছবির প্রোপার্টি',titleButton:'ছবি বাটন প্রোপার্টি',menu:'ছবির প্রোপার্টি',infoTab:'ছবির তথ্য',btnUpload:'ইহাকে সার্ভারে প্রেরন কর',upload:'আপলোড',alt:'বিকল্প টেক্সট',lockRatio:'অনুপাত লক কর',resetSize:'সাইজ পূর্বাবস্থায় ফিরিয়ে দাও',border:'বর্ডার',hSpace:'হরাইজন্টাল স্পেস',vSpace:'ভার্টিকেল স্পেস',alertUrl:'অনুগ্রহক করে ছবির URL টাইপ করুন',linkTab:'লিংক',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'ফ্লাশ প্রোপার্টি',propertiesTab:'Properties',title:'ফ্ল্যাশ প্রোপার্টি',chkPlay:'অটো প্লে',chkLoop:'লূপ',chkMenu:'ফ্ল্যাশ মেনু এনাবল কর',chkFull:'Allow Fullscreen',scale:'স্কেল',scaleAll:'সব দেখাও',scaleNoBorder:'কোনো বর্ডার নেই',scaleFit:'নিখুঁত ফিট',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs নীচে',alignAbsMiddle:'Abs উপর',alignBaseline:'মূল রেখা',alignTextTop:'টেক্সট উপর',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'বেকগ্রাউন্ড রং',hSpace:'হরাইজন্টাল স্পেস',vSpace:'ভার্টিকেল স্পেস',validateSrc:'অনুগ্রহ করে URL লিংক টাইপ করুন',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'বানান চেক',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'শব্দকোষে নেই',changeTo:'এতে বদলাও',btnIgnore:'ইগনোর কর',btnIgnoreAll:'সব ইগনোর কর',btnReplace:'বদলে দাও',btnReplaceAll:'সব বদলে দাও',btnUndo:'আন্ডু',noSuggestions:'- কোন সাজেশন নেই -',progress:'বানান পরীক্ষা চলছে...',noMispell:'বানান পরীক্ষা শেষ: কোন ভুল বানান পাওয়া যায়নি',noChanges:'বানান পরীক্ষা শেষ: কোন শব্দ পরিবর্তন করা হয়নি',oneChange:'বানান পরীক্ষা শেষ: একটি মাত্র শব্দ পরিবর্তন করা হয়েছে',manyChanges:'বানান পরীক্ষা শেষ: %1 গুলো শব্দ বদলে গ্যাছে',ieSpellDownload:'বানান পরীক্ষক ইনস্টল করা নেই। আপনি কি এখনই এটা ডাউনলোড করতে চান?'},smiley:{toolbar:'স্মাইলী',title:'স্মাইলী যুক্ত কর',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'সাংখ্যিক লিস্টের লেবেল',bulletedlist:'বুলেট লিস্ট লেবেল',indent:'ইনডেন্ট বাড়াও',outdent:'ইনডেন্ট কমাও',justify:{left:'বা দিকে ঘেঁষা',center:'মাঝ বরাবর ঘেষা',right:'ডান দিকে ঘেঁষা',block:'ব্লক জাস্টিফাই'},blockquote:'Block Quote',clipboard:{title:'পেস্ট',cutError:'আপনার ব্রাউজারের সুরক্ষা সেটিংস এডিটরকে অটোমেটিক কাট করার অনুমতি দেয়নি। দয়া করে এই কাজের জন্য কিবোর্ড ব্যবহার করুন (Ctrl/Cmd+X)।',copyError:'আপনার ব্রাউজারের সুরক্ষা সেটিংস এডিটরকে অটোমেটিক কপি করার অনুমতি দেয়নি। দয়া করে এই কাজের জন্য কিবোর্ড ব্যবহার করুন (Ctrl/Cmd+C)।',pasteMsg:'অনুগ্রহ করে নীচের বাক্সে কিবোর্ড ব্যবহার করে (<STRONG>Ctrl/Cmd+V</STRONG>) পেস্ট করুন এবং <STRONG>OK</STRONG> চাপ দিন',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'পেস্ট (শব্দ)',title:'পেস্ট (শব্দ)',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'সাদা টেক্সট হিসেবে পেস্ট কর',title:'সাদা টেক্সট হিসেবে পেস্ট কর'},templates:{button:'টেমপ্লেট',title:'কনটেন্ট টেমপ্লেট',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'অনুগ্রহ করে এডিটরে ওপেন করার জন্য টেমপ্লেট বাছাই করুন<br>(আসল কনটেন্ট হারিয়ে যাবে):',emptyListMsg:'(কোন টেমপ্লেট ডিফাইন করা নেই)'},showBlocks:'Show Blocks',stylesCombo:{label:'স্টাইল',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'ফন্ট ফরমেট',panelTitle:'ফন্ট ফরমেট',tag_p:'সাধারণ',tag_pre:'ফর্মেটেড',tag_address:'ঠিকানা',tag_h1:'শীর্ষক ১',tag_h2:'শীর্ষক ২',tag_h3:'শীর্ষক ৩',tag_h4:'শীর্ষক ৪',tag_h5:'শীর্ষক ৫',tag_h6:'শীর্ষক ৬',tag_div:'শীর্ষক (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'ফন্ট',voiceLabel:'Font',panelTitle:'ফন্ট'},fontSize:{label:'সাইজ',voiceLabel:'Font Size',panelTitle:'সাইজ'},colorButton:{textColorTitle:'টেক্স্ট রং',bgColorTitle:'বেকগ্রাউন্ড রং',panelTitle:'Colors',auto:'অটোমেটিক',more:'আরও রং...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'ডক্যুমেন্ট প্রোপার্টি',title:'ডক্যুমেন্ট প্রোপার্টি',design:'Design',meta:'মেটাডেটা',chooseColor:'Choose',other:'<other>',docTitle:'পেজ শীর্ষক',charset:'ক্যারেক্টার সেট এনকোডিং',charsetOther:'অন্য ক্যারেক্টার সেট এনকোডিং',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'ডক্যুমেন্ট টাইপ হেডিং',docTypeOther:'অন্য ডক্যুমেন্ট টাইপ হেডিং',xhtmlDec:'XHTML ডেক্লারেশন যুক্ত কর',bgColor:'ব্যাকগ্রাউন্ড রং',bgImage:'ব্যাকগ্রাউন্ড ছবির URL',bgFixed:'স্ক্রলহীন ব্যাকগ্রাউন্ড',txtColor:'টেক্স্ট রং',margin:'পেজ মার্জিন',marginTop:'উপর',marginLeft:'বামে',marginRight:'ডানে',marginBottom:'নীচে',metaKeywords:'ডক্যুমেন্ট ইন্ডেক্স কিওয়ার্ড (কমা দ্বারা বিচ্ছিন্ন)',metaDescription:'ডক্যূমেন্ট বর্ণনা',metaAuthor:'লেখক',metaCopyright:'কপীরাইট',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/bs.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/bs.js
index ba59d3b..e9d0f46 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/bs.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/bs.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.bs={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'HTML kôd',newPage:'Novi dokument',save:'Snimi',preview:'Prikaži',cut:'Izreži',copy:'Kopiraj',paste:'Zalijepi',print:'Štampaj',underline:'Podvuci',bold:'Boldiraj',italic:'Ukosi',selectAll:'Selektuj sve',removeFormat:'Poništi format',strike:'Precrtaj',subscript:'Subscript',superscript:'Superscript',horizontalrule:'Ubaci horizontalnu liniju',pagebreak:'Insert Page Break for Printing',pagebreakAlt:'Page Break',unlink:'Izbriši link',undo:'Vrati',redo:'Ponovi',common:{browseServer:'Browse Server',url:'URL',protocol:'Protokol',upload:'Šalji',uploadSubmit:'Šalji na server',image:'Slika',flash:'Flash',form:'Form',checkbox:'Checkbox',radio:'Radio Button',textField:'Text Field',textarea:'Textarea',hiddenField:'Hidden Field',button:'Button',select:'Selection Field',imageButton:'Image Button',notSet:'<nije podešeno>',id:'Id',name:'Naziv',langDir:'Smjer pisanja',langDirLtr:'S lijeva na desno (LTR)',langDirRtl:'S desna na lijevo (RTL)',langCode:'Jezièni kôd',longDescr:'Dugaèki opis URL-a',cssClass:'Klase CSS stilova',advisoryTitle:'Advisory title',cssStyle:'Stil',ok:'OK',cancel:'Odustani',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Naprednije',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Širina',height:'Visina',align:'Poravnanje',alignLeft:'Lijevo',alignRight:'Desno',alignCenter:'Centar',alignTop:'Vrh',alignMiddle:'Sredina',alignBottom:'Dno',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Ubaci specijalni karater',title:'Izaberi specijalni karakter',options:'Special Character Options'},link:{toolbar:'Ubaci/Izmjeni link',other:'<other>',menu:'Izmjeni link',title:'Link',info:'Link info',target:'Prozor',upload:'Šalji',advanced:'Naprednije',type:'Tip linka',toUrl:'URL',toAnchor:'Sidro na ovoj stranici',toEmail:'E-Mail',targetFrame:'<frejm>',targetPopup:'<popup prozor>',targetFrameName:'Target Frame Name',targetPopupName:'Naziv popup prozora',popupFeatures:'Moguænosti popup prozora',popupResizable:'Resizable',popupStatusBar:'Statusna traka',popupLocationBar:'Traka za lokaciju',popupToolbar:'Traka sa alatima',popupMenuBar:'Izborna traka',popupFullScreen:'Cijeli ekran (IE)',popupScrollBars:'Scroll traka',popupDependent:'Ovisno (Netscape)',popupLeft:'Lijeva pozicija',popupTop:'Gornja pozicija',id:'Id',langDir:'Smjer pisanja',langDirLTR:'S lijeva na desno (LTR)',langDirRTL:'S desna na lijevo (RTL)',acccessKey:'Pristupna tipka',name:'Naziv',langCode:'Smjer pisanja',tabIndex:'Tab indeks',advisoryTitle:'Advisory title',advisoryContentType:'Advisory vrsta sadržaja',cssClasses:'Klase CSS stilova',charset:'Linked Resource Charset',styles:'Stil',rel:'Relationship',selectAnchor:'Izaberi sidro',anchorName:'Po nazivu sidra',anchorId:'Po Id-u elementa',emailAddress:'E-Mail Adresa',emailSubject:'Subjekt poruke',emailBody:'Poruka',noAnchors:'(Nema dostupnih sidra na stranici)',noUrl:'Molimo ukucajte URL link',noEmail:'Molimo ukucajte e-mail adresu'},anchor:{toolbar:'Anchor',menu:'Edit Anchor',title:'Anchor Properties',name:'Anchor Name',errorName:'Please type the anchor name',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Naði',replace:'Zamjeni',findWhat:'Naði šta:',replaceWith:'Zamjeni sa:',notFoundMsg:'Traženi tekst nije pronaðen.',findOptions:'Find Options',matchCase:'Uporeðuj velika/mala slova',matchWord:'Uporeðuj samo cijelu rijeè',matchCyclic:'Match cyclic',replaceAll:'Zamjeni sve',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Tabela',title:'Svojstva tabele',menu:'Svojstva tabele',deleteTable:'Delete Table',rows:'Redova',columns:'Kolona',border:'Okvir',widthPx:'piksela',widthPc:'posto',widthUnit:'width unit',cellSpace:'Razmak æelija',cellPad:'Uvod æelija',caption:'Naslov',summary:'Summary',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Cell',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Briši æelije',merge:'Spoji æelije',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Row',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Briši redove'},column:{menu:'Column',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Briši kolone'}},button:{title:'Button Properties',text:'Text (Value)',type:'Type',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Checkbox Properties',radioTitle:'Radio Button Properties',value:'Value',selected:'Selected'},form:{title:'Form Properties',menu:'Form Properties',action:'Action',method:'Method',encoding:'Encoding'},select:{title:'Selection Field Properties',selectInfo:'Select Info',opAvail:'Available Options',value:'Value',size:'Size',lines:'lines',chkMulti:'Allow multiple selections',opText:'Text',opValue:'Value',btnAdd:'Add',btnModify:'Modify',btnUp:'Up',btnDown:'Down',btnSetValue:'Set as selected value',btnDelete:'Delete'},textarea:{title:'Textarea Properties',cols:'Columns',rows:'Rows'},textfield:{title:'Text Field Properties',name:'Name',value:'Value',charWidth:'Character Width',maxChars:'Maximum Characters',type:'Type',typeText:'Text',typePass:'Password'},hidden:{title:'Hidden Field Properties',name:'Name',value:'Value'},image:{title:'Svojstva slike',titleButton:'Image Button Properties',menu:'Svojstva slike',infoTab:'Info slike',btnUpload:'Šalji na server',upload:'Šalji',alt:'Tekst na slici',lockRatio:'Zakljuèaj odnos',resetSize:'Resetuj dimenzije',border:'Okvir',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Molimo ukucajte URL od slike.',linkTab:'Link',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Flash Properties',propertiesTab:'Properties',title:'Flash Properties',chkPlay:'Auto Play',chkLoop:'Loop',chkMenu:'Enable Flash Menu',chkFull:'Allow Fullscreen',scale:'Scale',scaleAll:'Show all',scaleNoBorder:'No Border',scaleFit:'Exact Fit',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs dole',alignAbsMiddle:'Abs sredina',alignBaseline:'Bazno',alignTextTop:'Vrh teksta',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Boja pozadine',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'Molimo ukucajte URL link',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Check Spelling',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Not in dictionary',changeTo:'Change to',btnIgnore:'Ignore',btnIgnoreAll:'Ignore All',btnReplace:'Replace',btnReplaceAll:'Replace All',btnUndo:'Undo',noSuggestions:'- No suggestions -',progress:'Spell check in progress...',noMispell:'Spell check complete: No misspellings found',noChanges:'Spell check complete: No words changed',oneChange:'Spell check complete: One word changed',manyChanges:'Spell check complete: %1 words changed',ieSpellDownload:'Spell checker not installed. Do you want to download it now?'},smiley:{toolbar:'Smješko',title:'Ubaci smješka',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Numerisana lista',bulletedlist:'Lista',indent:'Poveæaj uvod',outdent:'Smanji uvod',justify:{left:'Lijevo poravnanje',center:'Centralno poravnanje',right:'Desno poravnanje',block:'Puno poravnanje'},blockquote:'Block Quote',clipboard:{title:'Zalijepi',cutError:'Sigurnosne postavke vašeg pretraživaèa ne dozvoljavaju operacije automatskog rezanja. Molimo koristite kraticu na tastaturi (Ctrl/Cmd+X).',copyError:'Sigurnosne postavke Vašeg pretraživaèa ne dozvoljavaju operacije automatskog kopiranja. Molimo koristite kraticu na tastaturi (Ctrl/Cmd+C).',pasteMsg:'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Zalijepi iz Word-a',title:'Zalijepi iz Word-a',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Zalijepi kao obièan tekst',title:'Zalijepi kao obièan tekst'},templates:{button:'Templates',title:'Content Templates',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Please select the template to open in the editor',emptyListMsg:'(No templates defined)'},showBlocks:'Show Blocks',stylesCombo:{label:'Stil',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Format',panelTitle:'Format',tag_p:'Normal',tag_pre:'Formatted',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Font',voiceLabel:'Font',panelTitle:'Font'},fontSize:{label:'Velièina',voiceLabel:'Font Size',panelTitle:'Velièina'},colorButton:{textColorTitle:'Boja teksta',bgColorTitle:'Boja pozadine',panelTitle:'Colors',auto:'Automatska',more:'Više boja...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Document Properties',title:'Document Properties',design:'Design',meta:'Meta Tags',chooseColor:'Choose',other:'Other...',docTitle:'Page Title',charset:'Character Set Encoding',charsetOther:'Other Character Set Encoding',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Document Type Heading',docTypeOther:'Other Document Type Heading',xhtmlDec:'Include XHTML Declarations',bgColor:'Background Color',bgImage:'Background Image URL',bgFixed:'Non-scrolling (Fixed) Background',txtColor:'Text Color',margin:'Page Margins',marginTop:'Top',marginLeft:'Left',marginRight:'Right',marginBottom:'Bottom',metaKeywords:'Document Indexing Keywords (comma separated)',metaDescription:'Document Description',metaAuthor:'Author',metaCopyright:'Copyright',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.bs={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'HTML kôd',newPage:'Novi dokument',save:'Snimi',preview:'Prikaži',cut:'Izreži',copy:'Kopiraj',paste:'Zalijepi',print:'Štampaj',underline:'Podvuci',bold:'Boldiraj',italic:'Ukosi',selectAll:'Selektuj sve',removeFormat:'Poništi format',strike:'Precrtaj',subscript:'Subscript',superscript:'Superscript',horizontalrule:'Ubaci horizontalnu liniju',pagebreak:'Insert Page Break for Printing',pagebreakAlt:'Page Break',unlink:'Izbriši link',undo:'Vrati',redo:'Ponovi',common:{browseServer:'Browse Server',url:'URL',protocol:'Protokol',upload:'Šalji',uploadSubmit:'Šalji na server',image:'Slika',flash:'Flash',form:'Form',checkbox:'Checkbox',radio:'Radio Button',textField:'Text Field',textarea:'Textarea',hiddenField:'Hidden Field',button:'Button',select:'Selection Field',imageButton:'Image Button',notSet:'<nije podešeno>',id:'Id',name:'Naziv',langDir:'Smjer pisanja',langDirLtr:'S lijeva na desno (LTR)',langDirRtl:'S desna na lijevo (RTL)',langCode:'Jezièni kôd',longDescr:'Dugaèki opis URL-a',cssClass:'Klase CSS stilova',advisoryTitle:'Advisory title',cssStyle:'Stil',ok:'OK',cancel:'Odustani',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Naprednije',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Širina',height:'Visina',align:'Poravnanje',alignLeft:'Lijevo',alignRight:'Desno',alignCenter:'Centar',alignTop:'Vrh',alignMiddle:'Sredina',alignBottom:'Dno',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Ubaci specijalni karater',title:'Izaberi specijalni karakter',options:'Special Character Options'},link:{toolbar:'Ubaci/Izmjeni link',other:'<other>',menu:'Izmjeni link',title:'Link',info:'Link info',target:'Prozor',upload:'Šalji',advanced:'Naprednije',type:'Tip linka',toUrl:'URL',toAnchor:'Sidro na ovoj stranici',toEmail:'E-Mail',targetFrame:'<frejm>',targetPopup:'<popup prozor>',targetFrameName:'Target Frame Name',targetPopupName:'Naziv popup prozora',popupFeatures:'Moguænosti popup prozora',popupResizable:'Resizable',popupStatusBar:'Statusna traka',popupLocationBar:'Traka za lokaciju',popupToolbar:'Traka sa alatima',popupMenuBar:'Izborna traka',popupFullScreen:'Cijeli ekran (IE)',popupScrollBars:'Scroll traka',popupDependent:'Ovisno (Netscape)',popupLeft:'Lijeva pozicija',popupTop:'Gornja pozicija',id:'Id',langDir:'Smjer pisanja',langDirLTR:'S lijeva na desno (LTR)',langDirRTL:'S desna na lijevo (RTL)',acccessKey:'Pristupna tipka',name:'Naziv',langCode:'Smjer pisanja',tabIndex:'Tab indeks',advisoryTitle:'Advisory title',advisoryContentType:'Advisory vrsta sadržaja',cssClasses:'Klase CSS stilova',charset:'Linked Resource Charset',styles:'Stil',rel:'Relationship',selectAnchor:'Izaberi sidro',anchorName:'Po nazivu sidra',anchorId:'Po Id-u elementa',emailAddress:'E-Mail Adresa',emailSubject:'Subjekt poruke',emailBody:'Poruka',noAnchors:'(Nema dostupnih sidra na stranici)',noUrl:'Molimo ukucajte URL link',noEmail:'Molimo ukucajte e-mail adresu'},anchor:{toolbar:'Anchor',menu:'Edit Anchor',title:'Anchor Properties',name:'Anchor Name',errorName:'Please type the anchor name',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Naði',replace:'Zamjeni',findWhat:'Naði šta:',replaceWith:'Zamjeni sa:',notFoundMsg:'Traženi tekst nije pronaðen.',findOptions:'Find Options',matchCase:'Uporeðuj velika/mala slova',matchWord:'Uporeðuj samo cijelu rijeè',matchCyclic:'Match cyclic',replaceAll:'Zamjeni sve',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Tabela',title:'Svojstva tabele',menu:'Svojstva tabele',deleteTable:'Delete Table',rows:'Redova',columns:'Kolona',border:'Okvir',widthPx:'piksela',widthPc:'posto',widthUnit:'width unit',cellSpace:'Razmak æelija',cellPad:'Uvod æelija',caption:'Naslov',summary:'Summary',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Cell',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Briši æelije',merge:'Spoji æelije',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Row',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Briši redove'},column:{menu:'Column',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Briši kolone'}},button:{title:'Button Properties',text:'Text (Value)',type:'Type',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Checkbox Properties',radioTitle:'Radio Button Properties',value:'Value',selected:'Selected'},form:{title:'Form Properties',menu:'Form Properties',action:'Action',method:'Method',encoding:'Encoding'},select:{title:'Selection Field Properties',selectInfo:'Select Info',opAvail:'Available Options',value:'Value',size:'Size',lines:'lines',chkMulti:'Allow multiple selections',opText:'Text',opValue:'Value',btnAdd:'Add',btnModify:'Modify',btnUp:'Up',btnDown:'Down',btnSetValue:'Set as selected value',btnDelete:'Delete'},textarea:{title:'Textarea Properties',cols:'Columns',rows:'Rows'},textfield:{title:'Text Field Properties',name:'Name',value:'Value',charWidth:'Character Width',maxChars:'Maximum Characters',type:'Type',typeText:'Text',typePass:'Password'},hidden:{title:'Hidden Field Properties',name:'Name',value:'Value'},image:{title:'Svojstva slike',titleButton:'Image Button Properties',menu:'Svojstva slike',infoTab:'Info slike',btnUpload:'Šalji na server',upload:'Šalji',alt:'Tekst na slici',lockRatio:'Zakljuèaj odnos',resetSize:'Resetuj dimenzije',border:'Okvir',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Molimo ukucajte URL od slike.',linkTab:'Link',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Flash Properties',propertiesTab:'Properties',title:'Flash Properties',chkPlay:'Auto Play',chkLoop:'Loop',chkMenu:'Enable Flash Menu',chkFull:'Allow Fullscreen',scale:'Scale',scaleAll:'Show all',scaleNoBorder:'No Border',scaleFit:'Exact Fit',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs dole',alignAbsMiddle:'Abs sredina',alignBaseline:'Bazno',alignTextTop:'Vrh teksta',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Boja pozadine',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'Molimo ukucajte URL link',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Check Spelling',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Not in dictionary',changeTo:'Change to',btnIgnore:'Ignore',btnIgnoreAll:'Ignore All',btnReplace:'Replace',btnReplaceAll:'Replace All',btnUndo:'Undo',noSuggestions:'- No suggestions -',progress:'Spell check in progress...',noMispell:'Spell check complete: No misspellings found',noChanges:'Spell check complete: No words changed',oneChange:'Spell check complete: One word changed',manyChanges:'Spell check complete: %1 words changed',ieSpellDownload:'Spell checker not installed. Do you want to download it now?'},smiley:{toolbar:'Smješko',title:'Ubaci smješka',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Numerisana lista',bulletedlist:'Lista',indent:'Poveæaj uvod',outdent:'Smanji uvod',justify:{left:'Lijevo poravnanje',center:'Centralno poravnanje',right:'Desno poravnanje',block:'Puno poravnanje'},blockquote:'Block Quote',clipboard:{title:'Zalijepi',cutError:'Sigurnosne postavke vašeg pretraživaèa ne dozvoljavaju operacije automatskog rezanja. Molimo koristite kraticu na tastaturi (Ctrl/Cmd+X).',copyError:'Sigurnosne postavke Vašeg pretraživaèa ne dozvoljavaju operacije automatskog kopiranja. Molimo koristite kraticu na tastaturi (Ctrl/Cmd+C).',pasteMsg:'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Zalijepi iz Word-a',title:'Zalijepi iz Word-a',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Zalijepi kao obièan tekst',title:'Zalijepi kao obièan tekst'},templates:{button:'Templates',title:'Content Templates',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Please select the template to open in the editor',emptyListMsg:'(No templates defined)'},showBlocks:'Show Blocks',stylesCombo:{label:'Stil',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Format',panelTitle:'Format',tag_p:'Normal',tag_pre:'Formatted',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Font',voiceLabel:'Font',panelTitle:'Font'},fontSize:{label:'Velièina',voiceLabel:'Font Size',panelTitle:'Velièina'},colorButton:{textColorTitle:'Boja teksta',bgColorTitle:'Boja pozadine',panelTitle:'Colors',auto:'Automatska',more:'Više boja...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Document Properties',title:'Document Properties',design:'Design',meta:'Meta Tags',chooseColor:'Choose',other:'Other...',docTitle:'Page Title',charset:'Character Set Encoding',charsetOther:'Other Character Set Encoding',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Document Type Heading',docTypeOther:'Other Document Type Heading',xhtmlDec:'Include XHTML Declarations',bgColor:'Background Color',bgImage:'Background Image URL',bgFixed:'Non-scrolling (Fixed) Background',txtColor:'Text Color',margin:'Page Margins',marginTop:'Top',marginLeft:'Left',marginRight:'Right',marginBottom:'Bottom',metaKeywords:'Document Indexing Keywords (comma separated)',metaDescription:'Document Description',metaAuthor:'Author',metaCopyright:'Copyright',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ca.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ca.js
index bcecf8a..966b076 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ca.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ca.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.ca={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Editor de text enriquit',source:'Codi font',newPage:'Nova pàgina',save:'Desa',preview:'Visualització prèvia',cut:'Retalla',copy:'Copia',paste:'Enganxa',print:'Imprimeix',underline:'Subratllat',bold:'Negreta',italic:'Cursiva',selectAll:'Selecciona-ho tot',removeFormat:'Elimina Format',strike:'Barrat',subscript:'Subíndex',superscript:'Superíndex',horizontalrule:'Insereix línia horitzontal',pagebreak:'Insereix salt de pàgina',pagebreakAlt:'Salt de pàgina',unlink:"Elimina l'enllaç",undo:'Desfés',redo:'Refés',common:{browseServer:'Veure servidor',url:'URL',protocol:'Protocol',upload:'Puja',uploadSubmit:'Envia-la al servidor',image:'Imatge',flash:'Flash',form:'Formulari',checkbox:'Casella de verificació',radio:"Botó d'opció",textField:'Camp de text',textarea:'Àrea de text',hiddenField:'Camp ocult',button:'Botó',select:'Camp de selecció',imageButton:"Botó d'imatge",notSet:'<no definit>',id:'Id',name:'Nom',langDir:"Direcció de l'idioma",langDirLtr:"D'esquerra a dreta (LTR)",langDirRtl:'De dreta a esquerra (RTL)',langCode:"Codi d'idioma",longDescr:'Descripció llarga de la URL',cssClass:"Classes del full d'estil",advisoryTitle:'Títol consultiu',cssStyle:'Estil',ok:"D'acord",cancel:'Cancel·la',close:'Tanca',preview:'Previsualitza',generalTab:'General',advancedTab:'Avançat',validateNumberFailed:'Aquest valor no és un número.',confirmNewPage:'Els canvis en aquest contingut que no es desin es perdran. Esteu segur que voleu carregar una pàgina nova?',confirmCancel:"Algunes opcions s'han canviat. Esteu segur que voleu tancar la finestra de diàleg?",options:'Opcions',target:'Destí',targetNew:'Nova finestra (_blank)',targetTop:'Finestra major (_top)',targetSelf:'Mateixa finestra (_self)',targetParent:'Finestra pare (_parent)',langDirLTR:"D'esquerra a dreta (LTR)",langDirRTL:'De dreta a esquerra (RTL)',styles:'Estil',cssClasses:"Classes del full d'estil",width:'Amplada',height:'Alçada',align:'Alineació',alignLeft:"Ajusta a l'esquerra",alignRight:'Ajusta a la dreta',alignCenter:'Centre',alignTop:'Superior',alignMiddle:'Centre',alignBottom:'Inferior',invalidHeight:"L'alçada ha de ser un nombre.",invalidWidth:"L'amplada ha de ser un nombre.",invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, no disponible</span>'},contextmenu:{options:'Opcions del menú contextual'},specialChar:{toolbar:'Insereix caràcter especial',title:'Selecciona el caràcter especial',options:'Opcions de caràcters especials'},link:{toolbar:'Insereix/Edita enllaç',other:'<altre>',menu:"Edita l'enllaç",title:'Enllaç',info:"Informació de l'enllaç",target:'Destí',upload:'Puja',advanced:'Avançat',type:"Tipus d'enllaç",toUrl:'URL',toAnchor:'Àncora en aquesta pàgina',toEmail:'Correu electrònic',targetFrame:'<marc>',targetPopup:'<finestra emergent>',targetFrameName:'Nom del marc de destí',targetPopupName:'Nom finestra popup',popupFeatures:'Característiques finestra popup',popupResizable:'Redimensionable',popupStatusBar:"Barra d'estat",popupLocationBar:"Barra d'adreça",popupToolbar:"Barra d'eines",popupMenuBar:'Barra de menú',popupFullScreen:'Pantalla completa (IE)',popupScrollBars:"Barres d'scroll",popupDependent:'Depenent (Netscape)',popupLeft:'Posició esquerra',popupTop:'Posició dalt',id:'Id',langDir:"Direcció de l'idioma",langDirLTR:"D'esquerra a dreta (LTR)",langDirRTL:'De dreta a esquerra (RTL)',acccessKey:"Clau d'accés",name:'Nom',langCode:"Direcció de l'idioma",tabIndex:'Index de Tab',advisoryTitle:'Títol consultiu',advisoryContentType:'Tipus de contingut consultiu',cssClasses:"Classes del full d'estil",charset:'Conjunt de caràcters font enllaçat',styles:'Estil',rel:'Relationship',selectAnchor:'Selecciona una àncora',anchorName:"Per nom d'àncora",anchorId:"Per Id d'element",emailAddress:'Adreça de correu electrònic',emailSubject:'Assumpte del missatge',emailBody:'Cos del missatge',noAnchors:'(No hi ha àncores disponibles en aquest document)',noUrl:"Si us plau, escrigui l'enllaç URL",noEmail:"Si us plau, escrigui l'adreça correu electrònic"},anchor:{toolbar:'Insereix/Edita àncora',menu:"Propietats de l'àncora",title:"Propietats de l'àncora",name:"Nom de l'àncora",errorName:"Si us plau, escriviu el nom de l'ancora",remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Cerca i reemplaça',find:'Cerca',replace:'Reemplaça',findWhat:'Cerca:',replaceWith:'Remplaça amb:',notFoundMsg:"El text especificat no s'ha trobat.",findOptions:'Find Options',matchCase:'Distingeix majúscules/minúscules',matchWord:'Només paraules completes',matchCyclic:'Match cyclic',replaceAll:'Reemplaça-ho tot',replaceSuccessMsg:'%1 ocurrència/es reemplaçada/es.'},table:{toolbar:'Taula',title:'Propietats de la taula',menu:'Propietats de la taula',deleteTable:'Suprimeix la taula',rows:'Files',columns:'Columnes',border:'Mida vora',widthPx:'píxels',widthPc:'percentatge',widthUnit:"unitat d'amplada",cellSpace:'Espaiat de cel·les',cellPad:'Encoixinament de cel·les',caption:'Títol',summary:'Resum',headers:'Capçaleres',headersNone:'Cap',headersColumn:'Primera columna',headersRow:'Primera fila',headersBoth:'Ambdues',invalidRows:'El nombre de files ha de ser un nombre major que 0.',invalidCols:'El nombre de columnes ha de ser un nombre major que 0.',invalidBorder:'El gruix de la vora ha de ser un nombre.',invalidWidth:"L'amplada de la taula ha de ser un nombre.",invalidHeight:"L'alçada de la taula ha de ser un nombre.",invalidCellSpacing:"L'espaiat de cel·la ha de ser un nombre.",invalidCellPadding:"L'encoixinament de cel·la ha de ser un nombre.",cell:{menu:'Cel·la',insertBefore:'Insereix abans',insertAfter:'Insereix després',deleteCell:'Suprimeix',merge:'Fusiona',mergeRight:'Fusiona a la dreta',mergeDown:'Fusiona avall',splitHorizontal:'Divideix horitzontalment',splitVertical:'Divideix verticalment',title:'Propietats de la cel·la',cellType:'Tipus de cel·la',rowSpan:'Expansió de files',colSpan:'Expansió de columnes',wordWrap:'Ajustar al contingut',hAlign:'Alineació Horizontal',vAlign:'Alineació Vertical',alignBaseline:'A la línia base',bgColor:'Color de fons',borderColor:'Color de la vora',data:'Dades',header:'Capçalera',yes:'Sí',no:'No',invalidWidth:"L'amplada de cel·la ha de ser un nombre.",invalidHeight:"L'alçada de cel·la ha de ser un nombre.",invalidRowSpan:"L'expansió de files ha de ser un nombre enter.",invalidColSpan:"L'expansió de columnes ha de ser un nombre enter.",chooseColor:'Trieu'},row:{menu:'Fila',insertBefore:'Insereix fila abans de',insertAfter:'Insereix fila darrera',deleteRow:'Suprimeix una fila'},column:{menu:'Columna',insertBefore:'Insereix columna abans de',insertAfter:'Insereix columna darrera',deleteColumn:'Suprimeix una columna'}},button:{title:'Propietats del botó',text:'Text (Valor)',type:'Tipus',typeBtn:'Botó',typeSbm:'Transmet formulari',typeRst:'Reinicia formulari'},checkboxAndRadio:{checkboxTitle:'Propietats de la casella de verificació',radioTitle:"Propietats del botó d'opció",value:'Valor',selected:'Seleccionat'},form:{title:'Propietats del formulari',menu:'Propietats del formulari',action:'Acció',method:'Mètode',encoding:'Codificació'},select:{title:'Propietats del camp de selecció',selectInfo:'Info',opAvail:'Opcions disponibles',value:'Valor',size:'Mida',lines:'Línies',chkMulti:'Permet múltiples seleccions',opText:'Text',opValue:'Valor',btnAdd:'Afegeix',btnModify:'Modifica',btnUp:'Amunt',btnDown:'Avall',btnSetValue:'Selecciona per defecte',btnDelete:'Elimina'},textarea:{title:"Propietats de l'àrea de text",cols:'Columnes',rows:'Files'},textfield:{title:'Propietats del camp de text',name:'Nom',value:'Valor',charWidth:'Amplada',maxChars:'Nombre màxim de caràcters',type:'Tipus',typeText:'Text',typePass:'Contrasenya'},hidden:{title:'Propietats del camp ocult',name:'Nom',value:'Valor'},image:{title:'Propietats de la imatge',titleButton:"Propietats del botó d'imatge",menu:'Propietats de la imatge',infoTab:'Informació de la imatge',btnUpload:'Envia-la al servidor',upload:'Puja',alt:'Text alternatiu',lockRatio:'Bloqueja les proporcions',resetSize:'Restaura la mida',border:'Vora',hSpace:'Espaiat horit.',vSpace:'Espaiat vert.',alertUrl:'Si us plau, escriviu la URL de la imatge',linkTab:'Enllaç',button2Img:"Voleu transformar el botó d'imatge seleccionat en una simple imatge?",img2Button:"Voleu transformar la imatge seleccionada en un botó d'imatge?",urlMissing:'Falta la URL de la imatge.',validateBorder:'La vora ha de ser un nombre enter.',validateHSpace:'HSpace ha de ser un nombre enter.',validateVSpace:'VSpace ha de ser un nombre enter.'},flash:{properties:'Propietats del Flash',propertiesTab:'Propietats',title:'Propietats del Flash',chkPlay:'Reprodució automàtica',chkLoop:'Bucle',chkMenu:'Habilita menú Flash',chkFull:'Permetre la pantalla completa',scale:'Escala',scaleAll:'Mostra-ho tot',scaleNoBorder:'Sense vores',scaleFit:'Mida exacta',access:'Accés a scripts',accessAlways:'Sempre',accessSameDomain:'El mateix domini',accessNever:'Mai',alignAbsBottom:'Abs Bottom',alignAbsMiddle:'Abs Middle',alignBaseline:'Baseline',alignTextTop:'Text Top',quality:'Qualitat',qualityBest:'La millor',qualityHigh:'Alta',qualityAutoHigh:'Alta automàtica',qualityMedium:'Mitjana',qualityAutoLow:'Baixa automàtica',qualityLow:'Baixa',windowModeWindow:'Finestra',windowModeOpaque:'Opaca',windowModeTransparent:'Transparent',windowMode:'Mode de la finestra',flashvars:'Variables de Flash',bgcolor:'Color de Fons',hSpace:'Espaiat horit.',vSpace:'Espaiat vert.',validateSrc:"Si us plau, escrigui l'enllaç URL",validateHSpace:"L'espaiat horitzonatal ha de ser un nombre.",validateVSpace:"L'espaiat vertical ha de ser un nombre."},spellCheck:{toolbar:"Revisa l'ortografia",title:"Comprova l'ortografia",notAvailable:'El servei no es troba disponible ara.',errorLoading:'Error carregant el servidor: %s.',notInDic:'No és al diccionari',changeTo:'Reemplaça amb',btnIgnore:'Ignora',btnIgnoreAll:'Ignora-les totes',btnReplace:'Canvia',btnReplaceAll:'Canvia-les totes',btnUndo:'Desfés',noSuggestions:'Cap suggeriment',progress:'Verificació ortogràfica en curs...',noMispell:'Verificació ortogràfica acabada: no hi ha cap paraula mal escrita',noChanges:"Verificació ortogràfica: no s'ha canviat cap paraula",oneChange:"Verificació ortogràfica: s'ha canviat una paraula",manyChanges:"Verificació ortogràfica: s'han canviat %1 paraules",ieSpellDownload:'Verificació ortogràfica no instal·lada. Voleu descarregar-ho ara?'},smiley:{toolbar:'Icona',title:'Insereix una icona',options:"Opcions d'emoticones"},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Llista numerada',bulletedlist:'Llista de pics',indent:'Augmenta el sagnat',outdent:'Redueix el sagnat',justify:{left:"Alinea a l'esquerra",center:'Centrat',right:'Alinea a la dreta',block:'Justificat'},blockquote:'Bloc de cita',clipboard:{title:'Enganxa',cutError:'La seguretat del vostre navegador no permet executar automàticament les operacions de retallar. Si us plau, utilitzeu el teclat (Ctrl+X).',copyError:'La seguretat del vostre navegador no permet executar automàticament les operacions de copiar. Si us plau, utilitzeu el teclat (Ctrl+C).',pasteMsg:'Si us plau, enganxeu dins del següent camp utilitzant el teclat (<STRONG>Ctrl+V</STRONG>) i premeu <STRONG>OK</STRONG>.',securityMsg:"A causa de la configuració de seguretat del vostre navegador, l'editor no pot accedir al porta-retalls directament. Enganxeu-ho un altre cop en aquesta finestra.",pasteArea:"Àrea d'enganxat"},pastefromword:{confirmCleanup:'El text que voleu enganxar sembla provenir de Word. Voleu netejar aquest text abans que sigui enganxat?',toolbar:'Enganxa des del Word',title:'Enganxa des del Word',error:'No ha estat possible netejar les dades enganxades degut a un error intern'},pasteText:{button:'Enganxa com a text no formatat',title:'Enganxa com a text no formatat'},templates:{button:'Plantilles',title:'Plantilles de contingut',options:'Opcions de plantilla',insertOption:'Reemplaça el contingut actual',selectPromptMsg:"Seleccioneu una plantilla per usar a l'editor<br>(per defecte s'elimina el contingut actual):",emptyListMsg:'(No hi ha plantilles definides)'},showBlocks:'Mostra els blocs',stylesCombo:{label:'Estil',panelTitle:'Estils de format',panelTitle1:'Estils de bloc',panelTitle2:'Estils incrustats',panelTitle3:"Estils d'objecte"},format:{label:'Format',panelTitle:'Format',tag_p:'Normal',tag_pre:'Formatejat',tag_address:'Adreça',tag_h1:'Encapçalament 1',tag_h2:'Encapçalament 2',tag_h3:'Encapçalament 3',tag_h4:'Encapçalament 4',tag_h5:'Encapçalament 5',tag_h6:'Encapçalament 6',tag_div:'Normal (DIV)'},div:{title:'Crea un contenidor Div',toolbar:'Crea un contenidor Div',cssClassInputLabel:"Classes de la fulla d'estils",styleSelectLabel:'Estil',IdInputLabel:'Id',languageCodeInputLabel:" Codi d'idioma",inlineStyleInputLabel:'Estil en línia',advisoryTitleInputLabel:'Títol de guia',langDirLabel:"Direcció de l'idioma",langDirLTRLabel:"D'esquerra a dreta (LTR)",langDirRTLLabel:'De dreta a esquerra (RTL)',edit:'Edita Div',remove:'Elimina Div'},iframe:{title:'Propietats IFrame',toolbar:'IFrame',noUrl:"Si us plau, introduïu la URL de l'iframe URL",scrolling:'Activa les barrres de desplaçament',border:'Mostra la vora del marc'},font:{label:'Tipus de lletra',voiceLabel:'Tipus de lletra',panelTitle:'Tipus de lletra'},fontSize:{label:'Mida',voiceLabel:'Mida de la lletra',panelTitle:'Mida'},colorButton:{textColorTitle:'Color de Text',bgColorTitle:'Color de Fons',panelTitle:'Colors',auto:'Automàtic',more:'Més colors...'},colors:{'000':'Negre',800000:'Granat','8B4513':'Marró sella','2F4F4F':'Gris pissarra fosca','008080':'Blau xarxet','000080':'Blau marí','4B0082':'Indi',696969:'Gris intens',B22222:'Maó',A52A2A:'Marró (web)',DAA520:'Solidago','006400':'Verd fosc','40E0D0':'Turquesa','0000CD':'Atzur',800080:'Lila',808080:'Gris',F00:'Vermell',FF8C00:'Taronja fosc',FFD700:'Or','008000':'Verd','0FF':'Cian','00F':'Blau',EE82EE:'Lavanda rosat',A9A9A9:'Gris clar',FFA07A:'Salmó clar',FFA500:'Taronja',FFFF00:'Groc','00FF00':'Verd llima',AFEEEE:'Blau pàlid',ADD8E6:'Blau clar',DDA0DD:'Pruna',D3D3D3:'Gris clar',FFF0F5:'Lavanda rosat',FAEBD7:'Blanc antic',FFFFE0:'Groc clar',F0FFF0:'Verd pàlid',F0FFFF:'Blau cel pàlid',F0F8FF:'Cian pàlid',E6E6FA:'Lavanda',FFF:'Blanc'},scayt:{title:'Spell Check As You Type',opera_title:"No és compatible amb l'Opera",enable:"Habilitat l'SCAYT",disable:'Deshabilita SCAYT',about:"Quant a l'SCAYT",toggle:"Commuta l'SCAYT",options:'Opcions',langs:'Idiomes',moreSuggestions:'Més suggerències',ignore:'Ignora',ignoreAll:"Ignora'ls tots",addWord:'Afegeix una paraula',emptyDic:"El nom del diccionari no hauria d'estar buit.",optionsTab:'Opcions',allCaps:'Ignora paraules en majúscules',ignoreDomainNames:'Ignora els noms de domini',mixedCase:'Ignora paraules amb majúscules i minúscules',mixedWithDigits:'Ignora paraules amb números ',languagesTab:'Idiomes',dictionariesTab:'Diccionaris',dic_field_name:'Nom del diccionari',dic_create:'Crea',dic_restore:'Restaura',dic_delete:'Elimina',dic_rename:'Canvia el nom',dic_info:"Inicialment el diccionari d'usuari s'emmagatzema en una galeta. De totes maneres, les galetes tenen la mida limitada. Quan el diccionari creix massa, llavors el diccionari es pot emmagatzemar al nostre servidor. Per desar el vostre diccionari personal al nostre servidor heu d.'especificar un nom pel diccionari. Si ja heu desat un diccionari, teclegeu si us plau el seu nom i cliqueu el botó de restauració.",aboutTab:'Quant a'},about:{title:'Quant al CKEditor',dlgTitle:'Quant al CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'Per informació sobre llicències visiteu el web:',copy:'Copyright © $1. Tots els drets reservats.'},maximize:'Maximitza',minimize:'Minimitza',fakeobjects:{anchor:'Àncora',flash:'Animació Flash',iframe:'IFrame',hiddenfield:'Camp ocult',unknown:'Objecte desconegut'},resize:'Arrossegueu per redimensionar',colordialog:{title:'Selecciona el color',options:'Opcions del color',highlight:'Destacat',selected:'Seleccionat',clear:'Neteja'},toolbarCollapse:"Redueix la barra d'eines",toolbarExpand:"Amplia la barra d'eines",toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:"Direcció del text d'esquerra a dreta",rtl:'Direcció del text de dreta a esquerra'},docprops:{label:'Propietats del document',title:'Propietats del document',design:'Design',meta:'Metadades',chooseColor:'Trieu',other:'<altre>',docTitle:'Títol de la pàgina',charset:'Codificació de conjunt de caràcters',charsetOther:'Una altra codificació de caràcters',charsetASCII:'ASCII',charsetCE:'Centreeuropeu',charsetCT:'Xinès tradicional (Big5)',charsetCR:'Ciríl·lic',charsetGR:'Grec',charsetJP:'Japonès',charsetKR:'Coreà',charsetTR:'Turc',charsetUN:'Unicode (UTF-8)',charsetWE:'Europeu occidental',docType:'Capçalera de tipus de document',docTypeOther:'Un altra capçalera de tipus de document',xhtmlDec:'Incloure declaracions XHTML',bgColor:'Color de fons',bgImage:'URL de la imatge de fons',bgFixed:'Fons fixe',txtColor:'Color de Text',margin:'Marges de pàgina',marginTop:'Cap',marginLeft:'Esquerra',marginRight:'Dreta',marginBottom:'Peu',metaKeywords:'Mots clau per a indexació (separats per coma)',metaDescription:'Descripció del document',metaAuthor:'Autor',metaCopyright:'Copyright',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.ca={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Editor de text enriquit',source:'Codi font',newPage:'Nova pàgina',save:'Desa',preview:'Visualització prèvia',cut:'Retalla',copy:'Copia',paste:'Enganxa',print:'Imprimeix',underline:'Subratllat',bold:'Negreta',italic:'Cursiva',selectAll:'Selecciona-ho tot',removeFormat:'Elimina Format',strike:'Barrat',subscript:'Subíndex',superscript:'Superíndex',horizontalrule:'Insereix línia horitzontal',pagebreak:'Insereix salt de pàgina',pagebreakAlt:'Salt de pàgina',unlink:"Elimina l'enllaç",undo:'Desfés',redo:'Refés',common:{browseServer:'Veure servidor',url:'URL',protocol:'Protocol',upload:'Puja',uploadSubmit:'Envia-la al servidor',image:'Imatge',flash:'Flash',form:'Formulari',checkbox:'Casella de verificació',radio:"Botó d'opció",textField:'Camp de text',textarea:'Àrea de text',hiddenField:'Camp ocult',button:'Botó',select:'Camp de selecció',imageButton:"Botó d'imatge",notSet:'<no definit>',id:'Id',name:'Nom',langDir:"Direcció de l'idioma",langDirLtr:"D'esquerra a dreta (LTR)",langDirRtl:'De dreta a esquerra (RTL)',langCode:"Codi d'idioma",longDescr:'Descripció llarga de la URL',cssClass:"Classes del full d'estil",advisoryTitle:'Títol consultiu',cssStyle:'Estil',ok:"D'acord",cancel:'Cancel·la',close:'Tanca',preview:'Previsualitza',generalTab:'General',advancedTab:'Avançat',validateNumberFailed:'Aquest valor no és un número.',confirmNewPage:'Els canvis en aquest contingut que no es desin es perdran. Esteu segur que voleu carregar una pàgina nova?',confirmCancel:"Algunes opcions s'han canviat. Esteu segur que voleu tancar la finestra de diàleg?",options:'Opcions',target:'Destí',targetNew:'Nova finestra (_blank)',targetTop:'Finestra major (_top)',targetSelf:'Mateixa finestra (_self)',targetParent:'Finestra pare (_parent)',langDirLTR:"D'esquerra a dreta (LTR)",langDirRTL:'De dreta a esquerra (RTL)',styles:'Estil',cssClasses:"Classes del full d'estil",width:'Amplada',height:'Alçada',align:'Alineació',alignLeft:"Ajusta a l'esquerra",alignRight:'Ajusta a la dreta',alignCenter:'Centre',alignTop:'Superior',alignMiddle:'Centre',alignBottom:'Inferior',invalidHeight:"L'alçada ha de ser un nombre.",invalidWidth:"L'amplada ha de ser un nombre.",invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, no disponible</span>'},contextmenu:{options:'Opcions del menú contextual'},specialChar:{toolbar:'Insereix caràcter especial',title:'Selecciona el caràcter especial',options:'Opcions de caràcters especials'},link:{toolbar:'Insereix/Edita enllaç',other:'<altre>',menu:"Edita l'enllaç",title:'Enllaç',info:"Informació de l'enllaç",target:'Destí',upload:'Puja',advanced:'Avançat',type:"Tipus d'enllaç",toUrl:'URL',toAnchor:'Àncora en aquesta pàgina',toEmail:'Correu electrònic',targetFrame:'<marc>',targetPopup:'<finestra emergent>',targetFrameName:'Nom del marc de destí',targetPopupName:'Nom finestra popup',popupFeatures:'Característiques finestra popup',popupResizable:'Redimensionable',popupStatusBar:"Barra d'estat",popupLocationBar:"Barra d'adreça",popupToolbar:"Barra d'eines",popupMenuBar:'Barra de menú',popupFullScreen:'Pantalla completa (IE)',popupScrollBars:"Barres d'scroll",popupDependent:'Depenent (Netscape)',popupLeft:'Posició esquerra',popupTop:'Posició dalt',id:'Id',langDir:"Direcció de l'idioma",langDirLTR:"D'esquerra a dreta (LTR)",langDirRTL:'De dreta a esquerra (RTL)',acccessKey:"Clau d'accés",name:'Nom',langCode:"Direcció de l'idioma",tabIndex:'Index de Tab',advisoryTitle:'Títol consultiu',advisoryContentType:'Tipus de contingut consultiu',cssClasses:"Classes del full d'estil",charset:'Conjunt de caràcters font enllaçat',styles:'Estil',rel:'Relationship',selectAnchor:'Selecciona una àncora',anchorName:"Per nom d'àncora",anchorId:"Per Id d'element",emailAddress:'Adreça de correu electrònic',emailSubject:'Assumpte del missatge',emailBody:'Cos del missatge',noAnchors:'(No hi ha àncores disponibles en aquest document)',noUrl:"Si us plau, escrigui l'enllaç URL",noEmail:"Si us plau, escrigui l'adreça correu electrònic"},anchor:{toolbar:'Insereix/Edita àncora',menu:"Propietats de l'àncora",title:"Propietats de l'àncora",name:"Nom de l'àncora",errorName:"Si us plau, escriviu el nom de l'ancora",remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Cerca i reemplaça',find:'Cerca',replace:'Reemplaça',findWhat:'Cerca:',replaceWith:'Remplaça amb:',notFoundMsg:"El text especificat no s'ha trobat.",findOptions:'Find Options',matchCase:'Distingeix majúscules/minúscules',matchWord:'Només paraules completes',matchCyclic:'Match cyclic',replaceAll:'Reemplaça-ho tot',replaceSuccessMsg:'%1 ocurrència/es reemplaçada/es.'},table:{toolbar:'Taula',title:'Propietats de la taula',menu:'Propietats de la taula',deleteTable:'Suprimeix la taula',rows:'Files',columns:'Columnes',border:'Mida vora',widthPx:'píxels',widthPc:'percentatge',widthUnit:"unitat d'amplada",cellSpace:'Espaiat de cel·les',cellPad:'Encoixinament de cel·les',caption:'Títol',summary:'Resum',headers:'Capçaleres',headersNone:'Cap',headersColumn:'Primera columna',headersRow:'Primera fila',headersBoth:'Ambdues',invalidRows:'El nombre de files ha de ser un nombre major que 0.',invalidCols:'El nombre de columnes ha de ser un nombre major que 0.',invalidBorder:'El gruix de la vora ha de ser un nombre.',invalidWidth:"L'amplada de la taula ha de ser un nombre.",invalidHeight:"L'alçada de la taula ha de ser un nombre.",invalidCellSpacing:"L'espaiat de cel·la ha de ser un nombre.",invalidCellPadding:"L'encoixinament de cel·la ha de ser un nombre.",cell:{menu:'Cel·la',insertBefore:'Insereix abans',insertAfter:'Insereix després',deleteCell:'Suprimeix',merge:'Fusiona',mergeRight:'Fusiona a la dreta',mergeDown:'Fusiona avall',splitHorizontal:'Divideix horitzontalment',splitVertical:'Divideix verticalment',title:'Propietats de la cel·la',cellType:'Tipus de cel·la',rowSpan:'Expansió de files',colSpan:'Expansió de columnes',wordWrap:'Ajustar al contingut',hAlign:'Alineació Horizontal',vAlign:'Alineació Vertical',alignBaseline:'A la línia base',bgColor:'Color de fons',borderColor:'Color de la vora',data:'Dades',header:'Capçalera',yes:'Sí',no:'No',invalidWidth:"L'amplada de cel·la ha de ser un nombre.",invalidHeight:"L'alçada de cel·la ha de ser un nombre.",invalidRowSpan:"L'expansió de files ha de ser un nombre enter.",invalidColSpan:"L'expansió de columnes ha de ser un nombre enter.",chooseColor:'Trieu'},row:{menu:'Fila',insertBefore:'Insereix fila abans de',insertAfter:'Insereix fila darrera',deleteRow:'Suprimeix una fila'},column:{menu:'Columna',insertBefore:'Insereix columna abans de',insertAfter:'Insereix columna darrera',deleteColumn:'Suprimeix una columna'}},button:{title:'Propietats del botó',text:'Text (Valor)',type:'Tipus',typeBtn:'Botó',typeSbm:'Transmet formulari',typeRst:'Reinicia formulari'},checkboxAndRadio:{checkboxTitle:'Propietats de la casella de verificació',radioTitle:"Propietats del botó d'opció",value:'Valor',selected:'Seleccionat'},form:{title:'Propietats del formulari',menu:'Propietats del formulari',action:'Acció',method:'Mètode',encoding:'Codificació'},select:{title:'Propietats del camp de selecció',selectInfo:'Info',opAvail:'Opcions disponibles',value:'Valor',size:'Mida',lines:'Línies',chkMulti:'Permet múltiples seleccions',opText:'Text',opValue:'Valor',btnAdd:'Afegeix',btnModify:'Modifica',btnUp:'Amunt',btnDown:'Avall',btnSetValue:'Selecciona per defecte',btnDelete:'Elimina'},textarea:{title:"Propietats de l'àrea de text",cols:'Columnes',rows:'Files'},textfield:{title:'Propietats del camp de text',name:'Nom',value:'Valor',charWidth:'Amplada',maxChars:'Nombre màxim de caràcters',type:'Tipus',typeText:'Text',typePass:'Contrasenya'},hidden:{title:'Propietats del camp ocult',name:'Nom',value:'Valor'},image:{title:'Propietats de la imatge',titleButton:"Propietats del botó d'imatge",menu:'Propietats de la imatge',infoTab:'Informació de la imatge',btnUpload:'Envia-la al servidor',upload:'Puja',alt:'Text alternatiu',lockRatio:'Bloqueja les proporcions',resetSize:'Restaura la mida',border:'Vora',hSpace:'Espaiat horit.',vSpace:'Espaiat vert.',alertUrl:'Si us plau, escriviu la URL de la imatge',linkTab:'Enllaç',button2Img:"Voleu transformar el botó d'imatge seleccionat en una simple imatge?",img2Button:"Voleu transformar la imatge seleccionada en un botó d'imatge?",urlMissing:'Falta la URL de la imatge.',validateBorder:'La vora ha de ser un nombre enter.',validateHSpace:'HSpace ha de ser un nombre enter.',validateVSpace:'VSpace ha de ser un nombre enter.'},flash:{properties:'Propietats del Flash',propertiesTab:'Propietats',title:'Propietats del Flash',chkPlay:'Reprodució automàtica',chkLoop:'Bucle',chkMenu:'Habilita menú Flash',chkFull:'Permetre la pantalla completa',scale:'Escala',scaleAll:'Mostra-ho tot',scaleNoBorder:'Sense vores',scaleFit:'Mida exacta',access:'Accés a scripts',accessAlways:'Sempre',accessSameDomain:'El mateix domini',accessNever:'Mai',alignAbsBottom:'Abs Bottom',alignAbsMiddle:'Abs Middle',alignBaseline:'Baseline',alignTextTop:'Text Top',quality:'Qualitat',qualityBest:'La millor',qualityHigh:'Alta',qualityAutoHigh:'Alta automàtica',qualityMedium:'Mitjana',qualityAutoLow:'Baixa automàtica',qualityLow:'Baixa',windowModeWindow:'Finestra',windowModeOpaque:'Opaca',windowModeTransparent:'Transparent',windowMode:'Mode de la finestra',flashvars:'Variables de Flash',bgcolor:'Color de Fons',hSpace:'Espaiat horit.',vSpace:'Espaiat vert.',validateSrc:"Si us plau, escrigui l'enllaç URL",validateHSpace:"L'espaiat horitzonatal ha de ser un nombre.",validateVSpace:"L'espaiat vertical ha de ser un nombre."},spellCheck:{toolbar:"Revisa l'ortografia",title:"Comprova l'ortografia",notAvailable:'El servei no es troba disponible ara.',errorLoading:'Error carregant el servidor: %s.',notInDic:'No és al diccionari',changeTo:'Reemplaça amb',btnIgnore:'Ignora',btnIgnoreAll:'Ignora-les totes',btnReplace:'Canvia',btnReplaceAll:'Canvia-les totes',btnUndo:'Desfés',noSuggestions:'Cap suggeriment',progress:'Verificació ortogràfica en curs...',noMispell:'Verificació ortogràfica acabada: no hi ha cap paraula mal escrita',noChanges:"Verificació ortogràfica: no s'ha canviat cap paraula",oneChange:"Verificació ortogràfica: s'ha canviat una paraula",manyChanges:"Verificació ortogràfica: s'han canviat %1 paraules",ieSpellDownload:'Verificació ortogràfica no instal·lada. Voleu descarregar-ho ara?'},smiley:{toolbar:'Icona',title:'Insereix una icona',options:"Opcions d'emoticones"},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Llista numerada',bulletedlist:'Llista de pics',indent:'Augmenta el sagnat',outdent:'Redueix el sagnat',justify:{left:"Alinea a l'esquerra",center:'Centrat',right:'Alinea a la dreta',block:'Justificat'},blockquote:'Bloc de cita',clipboard:{title:'Enganxa',cutError:'La seguretat del vostre navegador no permet executar automàticament les operacions de retallar. Si us plau, utilitzeu el teclat (Ctrl+X).',copyError:'La seguretat del vostre navegador no permet executar automàticament les operacions de copiar. Si us plau, utilitzeu el teclat (Ctrl+C).',pasteMsg:'Si us plau, enganxeu dins del següent camp utilitzant el teclat (<STRONG>Ctrl+V</STRONG>) i premeu <STRONG>OK</STRONG>.',securityMsg:"A causa de la configuració de seguretat del vostre navegador, l'editor no pot accedir al porta-retalls directament. Enganxeu-ho un altre cop en aquesta finestra.",pasteArea:"Àrea d'enganxat"},pastefromword:{confirmCleanup:'El text que voleu enganxar sembla provenir de Word. Voleu netejar aquest text abans que sigui enganxat?',toolbar:'Enganxa des del Word',title:'Enganxa des del Word',error:'No ha estat possible netejar les dades enganxades degut a un error intern'},pasteText:{button:'Enganxa com a text no formatat',title:'Enganxa com a text no formatat'},templates:{button:'Plantilles',title:'Plantilles de contingut',options:'Opcions de plantilla',insertOption:'Reemplaça el contingut actual',selectPromptMsg:"Seleccioneu una plantilla per usar a l'editor<br>(per defecte s'elimina el contingut actual):",emptyListMsg:'(No hi ha plantilles definides)'},showBlocks:'Mostra els blocs',stylesCombo:{label:'Estil',panelTitle:'Estils de format',panelTitle1:'Estils de bloc',panelTitle2:'Estils incrustats',panelTitle3:"Estils d'objecte"},format:{label:'Format',panelTitle:'Format',tag_p:'Normal',tag_pre:'Formatejat',tag_address:'Adreça',tag_h1:'Encapçalament 1',tag_h2:'Encapçalament 2',tag_h3:'Encapçalament 3',tag_h4:'Encapçalament 4',tag_h5:'Encapçalament 5',tag_h6:'Encapçalament 6',tag_div:'Normal (DIV)'},div:{title:'Crea un contenidor Div',toolbar:'Crea un contenidor Div',cssClassInputLabel:"Classes de la fulla d'estils",styleSelectLabel:'Estil',IdInputLabel:'Id',languageCodeInputLabel:" Codi d'idioma",inlineStyleInputLabel:'Estil en línia',advisoryTitleInputLabel:'Títol de guia',langDirLabel:"Direcció de l'idioma",langDirLTRLabel:"D'esquerra a dreta (LTR)",langDirRTLLabel:'De dreta a esquerra (RTL)',edit:'Edita Div',remove:'Elimina Div'},iframe:{title:'Propietats IFrame',toolbar:'IFrame',noUrl:"Si us plau, introduïu la URL de l'iframe URL",scrolling:'Activa les barrres de desplaçament',border:'Mostra la vora del marc'},font:{label:'Tipus de lletra',voiceLabel:'Tipus de lletra',panelTitle:'Tipus de lletra'},fontSize:{label:'Mida',voiceLabel:'Mida de la lletra',panelTitle:'Mida'},colorButton:{textColorTitle:'Color de Text',bgColorTitle:'Color de Fons',panelTitle:'Colors',auto:'Automàtic',more:'Més colors...'},colors:{'000':'Negre',800000:'Granat','8B4513':'Marró sella','2F4F4F':'Gris pissarra fosca','008080':'Blau xarxet','000080':'Blau marí','4B0082':'Indi',696969:'Gris intens',B22222:'Maó',A52A2A:'Marró (web)',DAA520:'Solidago','006400':'Verd fosc','40E0D0':'Turquesa','0000CD':'Atzur',800080:'Lila',808080:'Gris',F00:'Vermell',FF8C00:'Taronja fosc',FFD700:'Or','008000':'Verd','0FF':'Cian','00F':'Blau',EE82EE:'Lavanda rosat',A9A9A9:'Gris clar',FFA07A:'Salmó clar',FFA500:'Taronja',FFFF00:'Groc','00FF00':'Verd llima',AFEEEE:'Blau pàlid',ADD8E6:'Blau clar',DDA0DD:'Pruna',D3D3D3:'Gris clar',FFF0F5:'Lavanda rosat',FAEBD7:'Blanc antic',FFFFE0:'Groc clar',F0FFF0:'Verd pàlid',F0FFFF:'Blau cel pàlid',F0F8FF:'Cian pàlid',E6E6FA:'Lavanda',FFF:'Blanc'},scayt:{title:'Spell Check As You Type',opera_title:"No és compatible amb l'Opera",enable:"Habilitat l'SCAYT",disable:'Deshabilita SCAYT',about:"Quant a l'SCAYT",toggle:"Commuta l'SCAYT",options:'Opcions',langs:'Idiomes',moreSuggestions:'Més suggerències',ignore:'Ignora',ignoreAll:"Ignora'ls tots",addWord:'Afegeix una paraula',emptyDic:"El nom del diccionari no hauria d'estar buit.",optionsTab:'Opcions',allCaps:'Ignora paraules en majúscules',ignoreDomainNames:'Ignora els noms de domini',mixedCase:'Ignora paraules amb majúscules i minúscules',mixedWithDigits:'Ignora paraules amb números ',languagesTab:'Idiomes',dictionariesTab:'Diccionaris',dic_field_name:'Nom del diccionari',dic_create:'Crea',dic_restore:'Restaura',dic_delete:'Elimina',dic_rename:'Canvia el nom',dic_info:"Inicialment el diccionari d'usuari s'emmagatzema en una galeta. De totes maneres, les galetes tenen la mida limitada. Quan el diccionari creix massa, llavors el diccionari es pot emmagatzemar al nostre servidor. Per desar el vostre diccionari personal al nostre servidor heu d.'especificar un nom pel diccionari. Si ja heu desat un diccionari, teclegeu si us plau el seu nom i cliqueu el botó de restauració.",aboutTab:'Quant a'},about:{title:'Quant al CKEditor',dlgTitle:'Quant al CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'Per informació sobre llicències visiteu el web:',copy:'Copyright © $1. Tots els drets reservats.'},maximize:'Maximitza',minimize:'Minimitza',fakeobjects:{anchor:'Àncora',flash:'Animació Flash',iframe:'IFrame',hiddenfield:'Camp ocult',unknown:'Objecte desconegut'},resize:'Arrossegueu per redimensionar',colordialog:{title:'Selecciona el color',options:'Opcions del color',highlight:'Destacat',selected:'Seleccionat',clear:'Neteja'},toolbarCollapse:"Redueix la barra d'eines",toolbarExpand:"Amplia la barra d'eines",toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:"Direcció del text d'esquerra a dreta",rtl:'Direcció del text de dreta a esquerra'},docprops:{label:'Propietats del document',title:'Propietats del document',design:'Design',meta:'Metadades',chooseColor:'Trieu',other:'<altre>',docTitle:'Títol de la pàgina',charset:'Codificació de conjunt de caràcters',charsetOther:'Una altra codificació de caràcters',charsetASCII:'ASCII',charsetCE:'Centreeuropeu',charsetCT:'Xinès tradicional (Big5)',charsetCR:'Ciríl·lic',charsetGR:'Grec',charsetJP:'Japonès',charsetKR:'Coreà',charsetTR:'Turc',charsetUN:'Unicode (UTF-8)',charsetWE:'Europeu occidental',docType:'Capçalera de tipus de document',docTypeOther:'Un altra capçalera de tipus de document',xhtmlDec:'Incloure declaracions XHTML',bgColor:'Color de fons',bgImage:'URL de la imatge de fons',bgFixed:'Fons fixe',txtColor:'Color de Text',margin:'Marges de pàgina',marginTop:'Cap',marginLeft:'Esquerra',marginRight:'Dreta',marginBottom:'Peu',metaKeywords:'Mots clau per a indexació (separats per coma)',metaDescription:'Descripció del document',metaAuthor:'Autor',metaCopyright:'Copyright',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/cs.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/cs.js
index 74709c7..c05af76 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/cs.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/cs.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.cs={dir:'ltr',editorTitle:'Textový editor, %1',editorHelp:'Stiskněte ALT 0 pro nápovědu',toolbars:'Panely nástrojů editoru',editor:'Textový editor',source:'Zdroj',newPage:'Nová stránka',save:'Uložit',preview:'Náhled',cut:'Vyjmout',copy:'Kopírovat',paste:'Vložit',print:'Tisk',underline:'Podtržené',bold:'Tučné',italic:'Kurzíva',selectAll:'Vybrat vše',removeFormat:'Odstranit formátování',strike:'Přeškrtnuté',subscript:'Dolní index',superscript:'Horní index',horizontalrule:'Vložit vodorovnou linku',pagebreak:'Vložit konec stránky',pagebreakAlt:'Konec stránky',unlink:'Odstranit odkaz',undo:'Zpět',redo:'Znovu',common:{browseServer:'Vybrat na serveru',url:'URL',protocol:'Protokol',upload:'Odeslat',uploadSubmit:'Odeslat na server',image:'Obrázek',flash:'Flash',form:'Formulář',checkbox:'Zaškrtávací políčko',radio:'Přepínač',textField:'Textové pole',textarea:'Textová oblast',hiddenField:'Skryté pole',button:'Tlačítko',select:'Seznam',imageButton:'Obrázkové tlačítko',notSet:'<nenastaveno>',id:'Id',name:'Jméno',langDir:'Směr jazyka',langDirLtr:'Zleva doprava (LTR)',langDirRtl:'Zprava doleva (RTL)',langCode:'Kód jazyka',longDescr:'Dlouhý popis URL',cssClass:'Třída stylu',advisoryTitle:'Pomocný titulek',cssStyle:'Styl',ok:'OK',cancel:'Zrušit',close:'Zavřít',preview:'Náhled',generalTab:'Obecné',advancedTab:'Rozšířené',validateNumberFailed:'Zadaná hodnota není číselná.',confirmNewPage:'Jakékoliv neuložené změny obsahu budou ztraceny. Skutečně chcete otevřít novou stránku?',confirmCancel:'Některá z nastavení byla změněna. Skutečně chcete zavřít dialogové okno?',options:'Nastavení',target:'Cíl',targetNew:'Nové okno (_blank)',targetTop:'Okno nejvyšší úrovně (_top)',targetSelf:'Stejné okno (_self)',targetParent:'Rodičovské okno (_parent)',langDirLTR:'Zleva doprava (LTR)',langDirRTL:'Zprava doleva (RTL)',styles:'Styly',cssClasses:'Třídy stylů',width:'Šířka',height:'Výška',align:'Zarovnání',alignLeft:'Vlevo',alignRight:'Vpravo',alignCenter:'Na střed',alignTop:'Nahoru',alignMiddle:'Na střed',alignBottom:'Dolů',invalidHeight:'Zadaná výška musí být číslo.',invalidWidth:'Šířka musí být číslo.',invalidCssLength:'Hodnota určená pro pole "%1" musí být kladné číslo bez nebo s platnou jednotkou míry CSS (px, %, in, cm, mm, em, ex, pt, nebo pc).',invalidHtmlLength:'Hodnota určená pro pole "%1" musí být kladné číslo bez nebo s platnou jednotkou míry HTML (px nebo %).',invalidInlineStyle:'Hodnota určená pro řádkový styl se musí skládat z jedné nebo více n-tic ve formátu "název : hodnota", oddělené středníky',cssLengthTooltip:'Zadejte číslo jako hodnotu v pixelech nebo číslo s platnou jednotkou CSS (px, %, v cm, mm, em, ex, pt, nebo pc).',unavailable:'%1<span class="cke_accessibility">, nedostupné</span>'},contextmenu:{options:'Nastavení kontextové nabídky'},specialChar:{toolbar:'Vložit speciální znaky',title:'Výběr speciálního znaku',options:'Nastavení speciálních znaků'},link:{toolbar:'Odkaz',other:'<jiný>',menu:'Změnit odkaz',title:'Odkaz',info:'Informace o odkazu',target:'Cíl',upload:'Odeslat',advanced:'Rozšířené',type:'Typ odkazu',toUrl:'URL',toAnchor:'Kotva v této stránce',toEmail:'E-mail',targetFrame:'<rámec>',targetPopup:'<vyskakovací okno>',targetFrameName:'Název cílového rámu',targetPopupName:'Název vyskakovacího okna',popupFeatures:'Vlastnosti vyskakovacího okna',popupResizable:'Umožňující měnit velikost',popupStatusBar:'Stavový řádek',popupLocationBar:'Panel umístění',popupToolbar:'Panel nástrojů',popupMenuBar:'Panel nabídky',popupFullScreen:'Celá obrazovka (IE)',popupScrollBars:'Posuvníky',popupDependent:'Závislost (Netscape)',popupLeft:'Levý okraj',popupTop:'Horní okraj',id:'Id',langDir:'Směr jazyka',langDirLTR:'Zleva doprava (LTR)',langDirRTL:'Zprava doleva (RTL)',acccessKey:'Přístupový klíč',name:'Jméno',langCode:'Kód jazyka',tabIndex:'Pořadí prvku',advisoryTitle:'Pomocný titulek',advisoryContentType:'Pomocný typ obsahu',cssClasses:'Třída stylu',charset:'Přiřazená znaková sada',styles:'Styl',rel:'Vztah',selectAnchor:'Vybrat kotvu',anchorName:'Podle jména kotvy',anchorId:'Podle Id objektu',emailAddress:'E-mailová adresa',emailSubject:'Předmět zprávy',emailBody:'Tělo zprávy',noAnchors:'(Ve stránce není definována žádná kotva!)',noUrl:'Zadejte prosím URL odkazu',noEmail:'Zadejte prosím e-mailovou adresu'},anchor:{toolbar:'Záložka',menu:'Vlastnosti záložky',title:'Vlastnosti záložky',name:'Název záložky',errorName:'Zadejte prosím název záložky',remove:'Odstranit záložku'},list:{numberedTitle:'Vlastnosti číslování',bulletedTitle:'Vlastnosti odrážek',type:'Typ',start:'Počátek',validateStartNumber:'Číslování musí začínat celým číslem.',circle:'Kroužky',disc:'Kolečka',square:'Čtverce',none:'Nic',notset:'<nenastaveno>',armenian:'Arménské',georgian:'Gruzínské (an, ban, gan, atd.)',lowerRoman:'Malé římské (i, ii, iii, iv, v, atd.)',upperRoman:'Velké římské (I, II, III, IV, V, atd.)',lowerAlpha:'Malá latinka (a, b, c, d, e, atd.)',upperAlpha:'Velká latinka (A, B, C, D, E, atd.)',lowerGreek:'Malé řecké (alpha, beta, gamma, atd.)',decimal:'Arabská čísla (1, 2, 3, atd.)',decimalLeadingZero:'Arabská čísla uvozená nulou (01, 02, 03, atd.)'},findAndReplace:{title:'Najít a nahradit',find:'Hledat',replace:'Nahradit',findWhat:'Co hledat:',replaceWith:'Čím nahradit:',notFoundMsg:'Hledaný text nebyl nalezen.',findOptions:'Možnosti hledání',matchCase:'Rozlišovat velikost písma',matchWord:'Pouze celá slova',matchCyclic:'Procházet opakovaně',replaceAll:'Nahradit vše',replaceSuccessMsg:'%1 nahrazení.'},table:{toolbar:'Tabulka',title:'Vlastnosti tabulky',menu:'Vlastnosti tabulky',deleteTable:'Smazat tabulku',rows:'Řádky',columns:'Sloupce',border:'Ohraničení',widthPx:'bodů',widthPc:'procent',widthUnit:'jednotka šířky',cellSpace:'Vzdálenost buněk',cellPad:'Odsazení obsahu v buňce',caption:'Popis',summary:'Souhrn',headers:'Záhlaví',headersNone:'Žádné',headersColumn:'První sloupec',headersRow:'První řádek',headersBoth:'Obojí',invalidRows:'Počet řádků musí být číslo větší než 0.',invalidCols:'Počet sloupců musí být číslo větší než 0.',invalidBorder:'Zdaná velikost okraje musí být číselná.',invalidWidth:'Šířka tabulky musí být číslo.',invalidHeight:'Zadaná výška tabulky musí být číselná.',invalidCellSpacing:'Zadaná vzdálenost buněk musí být číselná.',invalidCellPadding:'Zadané odsazení obsahu v buňce musí být číselné.',cell:{menu:'Buňka',insertBefore:'Vložit buňku před',insertAfter:'Vložit buňku za',deleteCell:'Smazat buňky',merge:'Sloučit buňky',mergeRight:'Sloučit doprava',mergeDown:'Sloučit dolů',splitHorizontal:'Rozdělit buňky vodorovně',splitVertical:'Rozdělit buňky svisle',title:'Vlastnosti buňky',cellType:'Typ buňky',rowSpan:'Spojit řádky',colSpan:'Spojit sloupce',wordWrap:'Zalamování',hAlign:'Vodorovné zarovnání',vAlign:'Svislé zarovnání',alignBaseline:'Na účaří',bgColor:'Barva pozadí',borderColor:'Barva okraje',data:'Data',header:'Hlavička',yes:'Ano',no:'Ne',invalidWidth:'Šířka buňky musí být číslo.',invalidHeight:'Zadaná výška buňky musí být číslená.',invalidRowSpan:'Zadaný počet sloučených řádků musí být celé číslo.',invalidColSpan:'Zadaný počet sloučených sloupců musí být celé číslo.',chooseColor:'Výběr'},row:{menu:'Řádek',insertBefore:'Vložit řádek před',insertAfter:'Vložit řádek za',deleteRow:'Smazat řádky'},column:{menu:'Sloupec',insertBefore:'Vložit sloupec před',insertAfter:'Vložit sloupec za',deleteColumn:'Smazat sloupec'}},button:{title:'Vlastnosti tlačítka',text:'Popisek',type:'Typ',typeBtn:'Tlačítko',typeSbm:'Odeslat',typeRst:'Obnovit'},checkboxAndRadio:{checkboxTitle:'Vlastnosti zaškrtávacího políčka',radioTitle:'Vlastnosti přepínače',value:'Hodnota',selected:'Zaškrtnuto'},form:{title:'Vlastnosti formuláře',menu:'Vlastnosti formuláře',action:'Akce',method:'Metoda',encoding:'Kódování'},select:{title:'Vlastnosti seznamu',selectInfo:'Info',opAvail:'Dostupná nastavení',value:'Hodnota',size:'Velikost',lines:'Řádků',chkMulti:'Povolit mnohonásobné výběry',opText:'Text',opValue:'Hodnota',btnAdd:'Přidat',btnModify:'Změnit',btnUp:'Nahoru',btnDown:'Dolů',btnSetValue:'Nastavit jako vybranou hodnotu',btnDelete:'Smazat'},textarea:{title:'Vlastnosti textové oblasti',cols:'Sloupců',rows:'Řádků'},textfield:{title:'Vlastnosti textového pole',name:'Název',value:'Hodnota',charWidth:'Šířka ve znacích',maxChars:'Maximální počet znaků',type:'Typ',typeText:'Text',typePass:'Heslo'},hidden:{title:'Vlastnosti skrytého pole',name:'Název',value:'Hodnota'},image:{title:'Vlastnosti obrázku',titleButton:'Vlastností obrázkového tlačítka',menu:'Vlastnosti obrázku',infoTab:'Informace o obrázku',btnUpload:'Odeslat na server',upload:'Odeslat',alt:'Alternativní text',lockRatio:'Zámek',resetSize:'Původní velikost',border:'Okraje',hSpace:'Horizontální mezera',vSpace:'Vertikální mezera',alertUrl:'Zadejte prosím URL obrázku',linkTab:'Odkaz',button2Img:'Skutečně chcete převést zvolené obrázkové tlačítko na obyčejný obrázek?',img2Button:'Skutečně chcete převést zvolený obrázek na obrázkové tlačítko?',urlMissing:'Zadané URL zdroje obrázku nebylo nalezeno.',validateBorder:'Okraj musí být nastaven v celých číslech.',validateHSpace:'Horizontální mezera musí být nastavena v celých číslech.',validateVSpace:'Vertikální mezera musí být nastavena v celých číslech.'},flash:{properties:'Vlastnosti Flashe',propertiesTab:'Vlastnosti',title:'Vlastnosti Flashe',chkPlay:'Automatické spuštění',chkLoop:'Opakování',chkMenu:'Nabídka Flash',chkFull:'Povolit celoobrazovkový režim',scale:'Zobrazit',scaleAll:'Zobrazit vše',scaleNoBorder:'Bez okraje',scaleFit:'Přizpůsobit',access:'Přístup ke skriptu',accessAlways:'Vždy',accessSameDomain:'Ve stejné doméně',accessNever:'Nikdy',alignAbsBottom:'Zcela dolů',alignAbsMiddle:'Doprostřed',alignBaseline:'Na účaří',alignTextTop:'Na horní okraj textu',quality:'Kvalita',qualityBest:'Nejlepší',qualityHigh:'Vysoká',qualityAutoHigh:'Vysoká - auto',qualityMedium:'Střední',qualityAutoLow:'Nízká - auto',qualityLow:'Nejnižší',windowModeWindow:'Okno',windowModeOpaque:'Neprůhledné',windowModeTransparent:'Průhledné',windowMode:'Režim okna',flashvars:'Proměnné pro Flash',bgcolor:'Barva pozadí',hSpace:'Horizontální mezera',vSpace:'Vertikální mezera',validateSrc:'Zadejte prosím URL odkazu',validateHSpace:'Zadaná horizontální mezera musí být číslo.',validateVSpace:'Zadaná vertikální mezera musí být číslo.'},spellCheck:{toolbar:'Zkontrolovat pravopis',title:'Kontrola pravopisu',notAvailable:'Omlouváme se, ale služba nyní není dostupná.',errorLoading:'Chyba nahrávání služby aplikace z: %s.',notInDic:'Není ve slovníku',changeTo:'Změnit na',btnIgnore:'Přeskočit',btnIgnoreAll:'Přeskakovat vše',btnReplace:'Zaměnit',btnReplaceAll:'Zaměňovat vše',btnUndo:'Zpět',noSuggestions:'- žádné návrhy -',progress:'Probíhá kontrola pravopisu...',noMispell:'Kontrola pravopisu dokončena: Žádné pravopisné chyby nenalezeny',noChanges:'Kontrola pravopisu dokončena: Beze změn',oneChange:'Kontrola pravopisu dokončena: Jedno slovo změněno',manyChanges:'Kontrola pravopisu dokončena: %1 slov změněno',ieSpellDownload:'Kontrola pravopisu není nainstalována. Chcete ji nyní stáhnout?'},smiley:{toolbar:'Smajlíci',title:'Vkládání smajlíků',options:'Nastavení smajlíků'},elementsPath:{eleLabel:'Cesta objektu',eleTitle:'%1 objekt'},numberedlist:'Číslování',bulletedlist:'Odrážky',indent:'Zvětšit odsazení',outdent:'Zmenšit odsazení',justify:{left:'Zarovnat vlevo',center:'Zarovnat na střed',right:'Zarovnat vpravo',block:'Zarovnat do bloku'},blockquote:'Citace',clipboard:{title:'Vložit',cutError:'Bezpečnostní nastavení vašeho prohlížeče nedovolují editoru spustit funkci pro vyjmutí zvoleného textu do schránky. Prosím vyjměte zvolený text do schránky pomocí klávesnice (Ctrl/Cmd+X).',copyError:'Bezpečnostní nastavení vašeho prohlížeče nedovolují editoru spustit funkci pro kopírování zvoleného textu do schránky. Prosím zkopírujte zvolený text do schránky pomocí klávesnice (Ctrl/Cmd+C).',pasteMsg:'Do následujícího pole vložte požadovaný obsah pomocí klávesnice (<STRONG>Ctrl/Cmd+V</STRONG>) a stiskněte <STRONG>OK</STRONG>.',securityMsg:'Z důvodů nastavení bezpečnosti vašeho prohlížeče nemůže editor přistupovat přímo do schránky. Obsah schránky prosím vložte znovu do tohoto okna.',pasteArea:'Oblast vkládání'},pastefromword:{confirmCleanup:'Jak je vidět, vkládaný text je kopírován z Wordu. Chcete jej před vložením vyčistit?',toolbar:'Vložit z Wordu',title:'Vložit z Wordu',error:'Z důvodu vnitřní chyby nebylo možné provést vyčištění vkládaného textu.'},pasteText:{button:'Vložit jako čistý text',title:'Vložit jako čistý text'},templates:{button:'Šablony',title:'Šablony obsahu',options:'Nastavení šablon',insertOption:'Nahradit aktuální obsah',selectPromptMsg:'Prosím zvolte šablonu pro otevření v editoru<br>(aktuální obsah editoru bude ztracen):',emptyListMsg:'(Není definována žádná šablona)'},showBlocks:'Ukázat bloky',stylesCombo:{label:'Styl',panelTitle:'Formátovací styly',panelTitle1:'Blokové styly',panelTitle2:'Řádkové styly',panelTitle3:'Objektové styly'},format:{label:'Formát',panelTitle:'Formát',tag_p:'Normální',tag_pre:'Naformátováno',tag_address:'Adresa',tag_h1:'Nadpis 1',tag_h2:'Nadpis 2',tag_h3:'Nadpis 3',tag_h4:'Nadpis 4',tag_h5:'Nadpis 5',tag_h6:'Nadpis 6',tag_div:'Normální (DIV)'},div:{title:'Vytvořit Div kontejner',toolbar:'Vytvořit Div kontejner',cssClassInputLabel:'Třídy stylů',styleSelectLabel:'Styly',IdInputLabel:'Id',languageCodeInputLabel:' Kód jazyka',inlineStyleInputLabel:'Vnitřní styly',advisoryTitleInputLabel:'Nápovědní titulek',langDirLabel:'Směr jazyka',langDirLTRLabel:'Zleva doprava (LTR)',langDirRTLLabel:'Zprava doleva (RTL)',edit:'Změnit Div',remove:'Odstranit Div'},iframe:{title:'Vlastnosti IFrame',toolbar:'IFrame',noUrl:'Zadejte prosím URL obsahu pro IFrame',scrolling:'Zapnout posuvníky',border:'Zobrazit okraj'},font:{label:'Písmo',voiceLabel:'Písmo',panelTitle:'Písmo'},fontSize:{label:'Velikost',voiceLabel:'Velikost písma',panelTitle:'Velikost'},colorButton:{textColorTitle:'Barva textu',bgColorTitle:'Barva pozadí',panelTitle:'Barvy',auto:'Automaticky',more:'Více barev...'},colors:{'000':'Černá',800000:'Kaštanová','8B4513':'Sedlová hněď','2F4F4F':'Tmavě bledě šedá','008080':'Čírka','000080':'Námořnická modř','4B0082':'Inkoustová',696969:'Tmavě šedá',B22222:'Pálená cihla',A52A2A:'Hnědá',DAA520:'Zlatý prut','006400':'Tmavě zelená','40E0D0':'Tyrkisová','0000CD':'Středně modrá',800080:'Purpurová',808080:'Šedá',F00:'Červená',FF8C00:'Tmavě oranžová',FFD700:'Zlatá','008000':'Zelená','0FF':'Azurová','00F':'Modrá',EE82EE:'Fialová',A9A9A9:'Kalně šedá',FFA07A:'Světle lososová',FFA500:'Oranžová',FFFF00:'Žlutá','00FF00':'Limetková',AFEEEE:'Bledě tyrkisová',ADD8E6:'Světle modrá',DDA0DD:'Švestková',D3D3D3:'Světle šedá',FFF0F5:'Levandulově ruměnná',FAEBD7:'Antická bílá',FFFFE0:'Světle žlutá',F0FFF0:'Medová rosa',F0FFFF:'Azurová',F0F8FF:'Alenčina modrá',E6E6FA:'Levandulová',FFF:'Bílá'},scayt:{title:'Kontrola pravopisu během psaní (SCAYT)',opera_title:'Toto Opera nepodporuje',enable:'Zapnout SCAYT',disable:'Vypnout SCAYT',about:'O aplikaci SCAYT',toggle:'Vypínač SCAYT',options:'Nastavení',langs:'Jazyky',moreSuggestions:'Více návrhů',ignore:'Přeskočit',ignoreAll:'Přeskočit vše',addWord:'Přidat slovo',emptyDic:'Název slovníku nesmí být prázdný.',optionsTab:'Nastavení',allCaps:'Ignorovat slova tvořená velkými písmeny',ignoreDomainNames:'Ignorovat doménová jména',mixedCase:'Ignorovat slova obsahující různou velikost písma',mixedWithDigits:'Ignorovat slova obsahující čísla',languagesTab:'Jazyky',dictionariesTab:'Slovníky',dic_field_name:'Název slovníku',dic_create:'Vytvořit',dic_restore:'Obnovit',dic_delete:'Smazat',dic_rename:'Přejmenovat',dic_info:'Zpočátku se uživatelský slovník ukládá do cookies ve vašem prohlížeči. Ovšem cookies mají omezenou velikost, takže když slovník dosáhne velikosti, kdy se již do cookies nevejde, může být uložen na našem serveru. Chcete-li uložit váš osobní slovník na našem serveru, je třeba slovník nejdříve pojmenovat. Máte-li již slovník pojmenován a uložen, zadejte jeho název a klepněte na tlačítko Obnovit.',aboutTab:'O aplikaci'},about:{title:'O aplikaci CKEditor',dlgTitle:'O aplikaci CKEditor',help:'Prohlédněte si $1 pro nápovědu.',userGuide:'Uživatelská příručka CKEditor',moreInfo:'Pro informace o lincenci navštivte naši webovou stránku:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximalizovat',minimize:'Minimalizovat',fakeobjects:{anchor:'Záložka',flash:'Flash animace',iframe:'IFrame',hiddenfield:'Skryté pole',unknown:'Neznámý objekt'},resize:'Uchopit pro změnu velikosti',colordialog:{title:'Výběr barvy',options:'Nastavení barvy',highlight:'Zvýraznit',selected:'Vybráno',clear:'Vyčistit'},toolbarCollapse:'Skrýt panel nástrojů',toolbarExpand:'Zobrazit panel nástrojů',toolbarGroups:{document:'Dokument',clipboard:'Schránka/Zpět',editing:'Úpravy',forms:'Formuláře',basicstyles:'Základní styly',paragraph:'Odstavec',links:'Odkazy',insert:'Vložit',styles:'Styly',colors:'Barvy',tools:'Nástroje'},bidi:{ltr:'Směr textu zleva doprava',rtl:'Směr textu zprava doleva'},docprops:{label:'Vlastnosti dokumentu',title:'Vlastnosti dokumentu',design:'Vzhled',meta:'Metadata',chooseColor:'Výběr',other:'<jiný>',docTitle:'Titulek stránky',charset:'Znaková sada',charsetOther:'Další znaková sada',charsetASCII:'ASCII',charsetCE:'Středoevropské jazyky',charsetCT:'Tradiční čínština (Big5)',charsetCR:'Cyrilice',charsetGR:'Řečtina',charsetJP:'Japonština',charsetKR:'Korejština',charsetTR:'Turečtina',charsetUN:'Unicode (UTF-8)',charsetWE:'Západoevropské jazyky',docType:'Typ dokumentu',docTypeOther:'Jiný typ dokumetu',xhtmlDec:'Zahrnout deklarace XHTML',bgColor:'Barva pozadí',bgImage:'URL obrázku na pozadí',bgFixed:'Nerolovatelné (Pevné) pozadí',txtColor:'Barva textu',margin:'Okraje stránky',marginTop:'Horní',marginLeft:'Levý',marginRight:'Pravý',marginBottom:'Dolní',metaKeywords:'Klíčová slova (oddělená čárkou)',metaDescription:'Popis dokumentu',metaAuthor:'Autor',metaCopyright:'Autorská práva',previewHtml:'<p>Toto je <strong>ukázkový text</strong>. Používáte <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.cs={dir:'ltr',editorTitle:'Textový editor, %1',editorHelp:'Stiskněte ALT 0 pro nápovědu',toolbars:'Panely nástrojů editoru',editor:'Textový editor',source:'Zdroj',newPage:'Nová stránka',save:'Uložit',preview:'Náhled',cut:'Vyjmout',copy:'Kopírovat',paste:'Vložit',print:'Tisk',underline:'Podtržené',bold:'Tučné',italic:'Kurzíva',selectAll:'Vybrat vše',removeFormat:'Odstranit formátování',strike:'Přeškrtnuté',subscript:'Dolní index',superscript:'Horní index',horizontalrule:'Vložit vodorovnou linku',pagebreak:'Vložit konec stránky',pagebreakAlt:'Konec stránky',unlink:'Odstranit odkaz',undo:'Zpět',redo:'Znovu',common:{browseServer:'Vybrat na serveru',url:'URL',protocol:'Protokol',upload:'Odeslat',uploadSubmit:'Odeslat na server',image:'Obrázek',flash:'Flash',form:'Formulář',checkbox:'Zaškrtávací políčko',radio:'Přepínač',textField:'Textové pole',textarea:'Textová oblast',hiddenField:'Skryté pole',button:'Tlačítko',select:'Seznam',imageButton:'Obrázkové tlačítko',notSet:'<nenastaveno>',id:'Id',name:'Jméno',langDir:'Směr jazyka',langDirLtr:'Zleva doprava (LTR)',langDirRtl:'Zprava doleva (RTL)',langCode:'Kód jazyka',longDescr:'Dlouhý popis URL',cssClass:'Třída stylu',advisoryTitle:'Pomocný titulek',cssStyle:'Styl',ok:'OK',cancel:'Zrušit',close:'Zavřít',preview:'Náhled',generalTab:'Obecné',advancedTab:'Rozšířené',validateNumberFailed:'Zadaná hodnota není číselná.',confirmNewPage:'Jakékoliv neuložené změny obsahu budou ztraceny. Skutečně chcete otevřít novou stránku?',confirmCancel:'Některá z nastavení byla změněna. Skutečně chcete zavřít dialogové okno?',options:'Nastavení',target:'Cíl',targetNew:'Nové okno (_blank)',targetTop:'Okno nejvyšší úrovně (_top)',targetSelf:'Stejné okno (_self)',targetParent:'Rodičovské okno (_parent)',langDirLTR:'Zleva doprava (LTR)',langDirRTL:'Zprava doleva (RTL)',styles:'Styly',cssClasses:'Třídy stylů',width:'Šířka',height:'Výška',align:'Zarovnání',alignLeft:'Vlevo',alignRight:'Vpravo',alignCenter:'Na střed',alignTop:'Nahoru',alignMiddle:'Na střed',alignBottom:'Dolů',invalidHeight:'Zadaná výška musí být číslo.',invalidWidth:'Šířka musí být číslo.',invalidCssLength:'Hodnota určená pro pole "%1" musí být kladné číslo bez nebo s platnou jednotkou míry CSS (px, %, in, cm, mm, em, ex, pt, nebo pc).',invalidHtmlLength:'Hodnota určená pro pole "%1" musí být kladné číslo bez nebo s platnou jednotkou míry HTML (px nebo %).',invalidInlineStyle:'Hodnota určená pro řádkový styl se musí skládat z jedné nebo více n-tic ve formátu "název : hodnota", oddělené středníky',cssLengthTooltip:'Zadejte číslo jako hodnotu v pixelech nebo číslo s platnou jednotkou CSS (px, %, v cm, mm, em, ex, pt, nebo pc).',unavailable:'%1<span class="cke_accessibility">, nedostupné</span>'},contextmenu:{options:'Nastavení kontextové nabídky'},specialChar:{toolbar:'Vložit speciální znaky',title:'Výběr speciálního znaku',options:'Nastavení speciálních znaků'},link:{toolbar:'Odkaz',other:'<jiný>',menu:'Změnit odkaz',title:'Odkaz',info:'Informace o odkazu',target:'Cíl',upload:'Odeslat',advanced:'Rozšířené',type:'Typ odkazu',toUrl:'URL',toAnchor:'Kotva v této stránce',toEmail:'E-mail',targetFrame:'<rámec>',targetPopup:'<vyskakovací okno>',targetFrameName:'Název cílového rámu',targetPopupName:'Název vyskakovacího okna',popupFeatures:'Vlastnosti vyskakovacího okna',popupResizable:'Umožňující měnit velikost',popupStatusBar:'Stavový řádek',popupLocationBar:'Panel umístění',popupToolbar:'Panel nástrojů',popupMenuBar:'Panel nabídky',popupFullScreen:'Celá obrazovka (IE)',popupScrollBars:'Posuvníky',popupDependent:'Závislost (Netscape)',popupLeft:'Levý okraj',popupTop:'Horní okraj',id:'Id',langDir:'Směr jazyka',langDirLTR:'Zleva doprava (LTR)',langDirRTL:'Zprava doleva (RTL)',acccessKey:'Přístupový klíč',name:'Jméno',langCode:'Kód jazyka',tabIndex:'Pořadí prvku',advisoryTitle:'Pomocný titulek',advisoryContentType:'Pomocný typ obsahu',cssClasses:'Třída stylu',charset:'Přiřazená znaková sada',styles:'Styl',rel:'Vztah',selectAnchor:'Vybrat kotvu',anchorName:'Podle jména kotvy',anchorId:'Podle Id objektu',emailAddress:'E-mailová adresa',emailSubject:'Předmět zprávy',emailBody:'Tělo zprávy',noAnchors:'(Ve stránce není definována žádná kotva!)',noUrl:'Zadejte prosím URL odkazu',noEmail:'Zadejte prosím e-mailovou adresu'},anchor:{toolbar:'Záložka',menu:'Vlastnosti záložky',title:'Vlastnosti záložky',name:'Název záložky',errorName:'Zadejte prosím název záložky',remove:'Odstranit záložku'},list:{numberedTitle:'Vlastnosti číslování',bulletedTitle:'Vlastnosti odrážek',type:'Typ',start:'Počátek',validateStartNumber:'Číslování musí začínat celým číslem.',circle:'Kroužky',disc:'Kolečka',square:'Čtverce',none:'Nic',notset:'<nenastaveno>',armenian:'Arménské',georgian:'Gruzínské (an, ban, gan, atd.)',lowerRoman:'Malé římské (i, ii, iii, iv, v, atd.)',upperRoman:'Velké římské (I, II, III, IV, V, atd.)',lowerAlpha:'Malá latinka (a, b, c, d, e, atd.)',upperAlpha:'Velká latinka (A, B, C, D, E, atd.)',lowerGreek:'Malé řecké (alpha, beta, gamma, atd.)',decimal:'Arabská čísla (1, 2, 3, atd.)',decimalLeadingZero:'Arabská čísla uvozená nulou (01, 02, 03, atd.)'},findAndReplace:{title:'Najít a nahradit',find:'Hledat',replace:'Nahradit',findWhat:'Co hledat:',replaceWith:'Čím nahradit:',notFoundMsg:'Hledaný text nebyl nalezen.',findOptions:'Možnosti hledání',matchCase:'Rozlišovat velikost písma',matchWord:'Pouze celá slova',matchCyclic:'Procházet opakovaně',replaceAll:'Nahradit vše',replaceSuccessMsg:'%1 nahrazení.'},table:{toolbar:'Tabulka',title:'Vlastnosti tabulky',menu:'Vlastnosti tabulky',deleteTable:'Smazat tabulku',rows:'Řádky',columns:'Sloupce',border:'Ohraničení',widthPx:'bodů',widthPc:'procent',widthUnit:'jednotka šířky',cellSpace:'Vzdálenost buněk',cellPad:'Odsazení obsahu v buňce',caption:'Popis',summary:'Souhrn',headers:'Záhlaví',headersNone:'Žádné',headersColumn:'První sloupec',headersRow:'První řádek',headersBoth:'Obojí',invalidRows:'Počet řádků musí být číslo větší než 0.',invalidCols:'Počet sloupců musí být číslo větší než 0.',invalidBorder:'Zdaná velikost okraje musí být číselná.',invalidWidth:'Šířka tabulky musí být číslo.',invalidHeight:'Zadaná výška tabulky musí být číselná.',invalidCellSpacing:'Zadaná vzdálenost buněk musí být číselná.',invalidCellPadding:'Zadané odsazení obsahu v buňce musí být číselné.',cell:{menu:'Buňka',insertBefore:'Vložit buňku před',insertAfter:'Vložit buňku za',deleteCell:'Smazat buňky',merge:'Sloučit buňky',mergeRight:'Sloučit doprava',mergeDown:'Sloučit dolů',splitHorizontal:'Rozdělit buňky vodorovně',splitVertical:'Rozdělit buňky svisle',title:'Vlastnosti buňky',cellType:'Typ buňky',rowSpan:'Spojit řádky',colSpan:'Spojit sloupce',wordWrap:'Zalamování',hAlign:'Vodorovné zarovnání',vAlign:'Svislé zarovnání',alignBaseline:'Na účaří',bgColor:'Barva pozadí',borderColor:'Barva okraje',data:'Data',header:'Hlavička',yes:'Ano',no:'Ne',invalidWidth:'Šířka buňky musí být číslo.',invalidHeight:'Zadaná výška buňky musí být číslená.',invalidRowSpan:'Zadaný počet sloučených řádků musí být celé číslo.',invalidColSpan:'Zadaný počet sloučených sloupců musí být celé číslo.',chooseColor:'Výběr'},row:{menu:'Řádek',insertBefore:'Vložit řádek před',insertAfter:'Vložit řádek za',deleteRow:'Smazat řádky'},column:{menu:'Sloupec',insertBefore:'Vložit sloupec před',insertAfter:'Vložit sloupec za',deleteColumn:'Smazat sloupec'}},button:{title:'Vlastnosti tlačítka',text:'Popisek',type:'Typ',typeBtn:'Tlačítko',typeSbm:'Odeslat',typeRst:'Obnovit'},checkboxAndRadio:{checkboxTitle:'Vlastnosti zaškrtávacího políčka',radioTitle:'Vlastnosti přepínače',value:'Hodnota',selected:'Zaškrtnuto'},form:{title:'Vlastnosti formuláře',menu:'Vlastnosti formuláře',action:'Akce',method:'Metoda',encoding:'Kódování'},select:{title:'Vlastnosti seznamu',selectInfo:'Info',opAvail:'Dostupná nastavení',value:'Hodnota',size:'Velikost',lines:'Řádků',chkMulti:'Povolit mnohonásobné výběry',opText:'Text',opValue:'Hodnota',btnAdd:'Přidat',btnModify:'Změnit',btnUp:'Nahoru',btnDown:'Dolů',btnSetValue:'Nastavit jako vybranou hodnotu',btnDelete:'Smazat'},textarea:{title:'Vlastnosti textové oblasti',cols:'Sloupců',rows:'Řádků'},textfield:{title:'Vlastnosti textového pole',name:'Název',value:'Hodnota',charWidth:'Šířka ve znacích',maxChars:'Maximální počet znaků',type:'Typ',typeText:'Text',typePass:'Heslo'},hidden:{title:'Vlastnosti skrytého pole',name:'Název',value:'Hodnota'},image:{title:'Vlastnosti obrázku',titleButton:'Vlastností obrázkového tlačítka',menu:'Vlastnosti obrázku',infoTab:'Informace o obrázku',btnUpload:'Odeslat na server',upload:'Odeslat',alt:'Alternativní text',lockRatio:'Zámek',resetSize:'Původní velikost',border:'Okraje',hSpace:'Horizontální mezera',vSpace:'Vertikální mezera',alertUrl:'Zadejte prosím URL obrázku',linkTab:'Odkaz',button2Img:'Skutečně chcete převést zvolené obrázkové tlačítko na obyčejný obrázek?',img2Button:'Skutečně chcete převést zvolený obrázek na obrázkové tlačítko?',urlMissing:'Zadané URL zdroje obrázku nebylo nalezeno.',validateBorder:'Okraj musí být nastaven v celých číslech.',validateHSpace:'Horizontální mezera musí být nastavena v celých číslech.',validateVSpace:'Vertikální mezera musí být nastavena v celých číslech.'},flash:{properties:'Vlastnosti Flashe',propertiesTab:'Vlastnosti',title:'Vlastnosti Flashe',chkPlay:'Automatické spuštění',chkLoop:'Opakování',chkMenu:'Nabídka Flash',chkFull:'Povolit celoobrazovkový režim',scale:'Zobrazit',scaleAll:'Zobrazit vše',scaleNoBorder:'Bez okraje',scaleFit:'Přizpůsobit',access:'Přístup ke skriptu',accessAlways:'Vždy',accessSameDomain:'Ve stejné doméně',accessNever:'Nikdy',alignAbsBottom:'Zcela dolů',alignAbsMiddle:'Doprostřed',alignBaseline:'Na účaří',alignTextTop:'Na horní okraj textu',quality:'Kvalita',qualityBest:'Nejlepší',qualityHigh:'Vysoká',qualityAutoHigh:'Vysoká - auto',qualityMedium:'Střední',qualityAutoLow:'Nízká - auto',qualityLow:'Nejnižší',windowModeWindow:'Okno',windowModeOpaque:'Neprůhledné',windowModeTransparent:'Průhledné',windowMode:'Režim okna',flashvars:'Proměnné pro Flash',bgcolor:'Barva pozadí',hSpace:'Horizontální mezera',vSpace:'Vertikální mezera',validateSrc:'Zadejte prosím URL odkazu',validateHSpace:'Zadaná horizontální mezera musí být číslo.',validateVSpace:'Zadaná vertikální mezera musí být číslo.'},spellCheck:{toolbar:'Zkontrolovat pravopis',title:'Kontrola pravopisu',notAvailable:'Omlouváme se, ale služba nyní není dostupná.',errorLoading:'Chyba nahrávání služby aplikace z: %s.',notInDic:'Není ve slovníku',changeTo:'Změnit na',btnIgnore:'Přeskočit',btnIgnoreAll:'Přeskakovat vše',btnReplace:'Zaměnit',btnReplaceAll:'Zaměňovat vše',btnUndo:'Zpět',noSuggestions:'- žádné návrhy -',progress:'Probíhá kontrola pravopisu...',noMispell:'Kontrola pravopisu dokončena: Žádné pravopisné chyby nenalezeny',noChanges:'Kontrola pravopisu dokončena: Beze změn',oneChange:'Kontrola pravopisu dokončena: Jedno slovo změněno',manyChanges:'Kontrola pravopisu dokončena: %1 slov změněno',ieSpellDownload:'Kontrola pravopisu není nainstalována. Chcete ji nyní stáhnout?'},smiley:{toolbar:'Smajlíci',title:'Vkládání smajlíků',options:'Nastavení smajlíků'},elementsPath:{eleLabel:'Cesta objektu',eleTitle:'%1 objekt'},numberedlist:'Číslování',bulletedlist:'Odrážky',indent:'Zvětšit odsazení',outdent:'Zmenšit odsazení',justify:{left:'Zarovnat vlevo',center:'Zarovnat na střed',right:'Zarovnat vpravo',block:'Zarovnat do bloku'},blockquote:'Citace',clipboard:{title:'Vložit',cutError:'Bezpečnostní nastavení vašeho prohlížeče nedovolují editoru spustit funkci pro vyjmutí zvoleného textu do schránky. Prosím vyjměte zvolený text do schránky pomocí klávesnice (Ctrl/Cmd+X).',copyError:'Bezpečnostní nastavení vašeho prohlížeče nedovolují editoru spustit funkci pro kopírování zvoleného textu do schránky. Prosím zkopírujte zvolený text do schránky pomocí klávesnice (Ctrl/Cmd+C).',pasteMsg:'Do následujícího pole vložte požadovaný obsah pomocí klávesnice (<STRONG>Ctrl/Cmd+V</STRONG>) a stiskněte <STRONG>OK</STRONG>.',securityMsg:'Z důvodů nastavení bezpečnosti vašeho prohlížeče nemůže editor přistupovat přímo do schránky. Obsah schránky prosím vložte znovu do tohoto okna.',pasteArea:'Oblast vkládání'},pastefromword:{confirmCleanup:'Jak je vidět, vkládaný text je kopírován z Wordu. Chcete jej před vložením vyčistit?',toolbar:'Vložit z Wordu',title:'Vložit z Wordu',error:'Z důvodu vnitřní chyby nebylo možné provést vyčištění vkládaného textu.'},pasteText:{button:'Vložit jako čistý text',title:'Vložit jako čistý text'},templates:{button:'Šablony',title:'Šablony obsahu',options:'Nastavení šablon',insertOption:'Nahradit aktuální obsah',selectPromptMsg:'Prosím zvolte šablonu pro otevření v editoru<br>(aktuální obsah editoru bude ztracen):',emptyListMsg:'(Není definována žádná šablona)'},showBlocks:'Ukázat bloky',stylesCombo:{label:'Styl',panelTitle:'Formátovací styly',panelTitle1:'Blokové styly',panelTitle2:'Řádkové styly',panelTitle3:'Objektové styly'},format:{label:'Formát',panelTitle:'Formát',tag_p:'Normální',tag_pre:'Naformátováno',tag_address:'Adresa',tag_h1:'Nadpis 1',tag_h2:'Nadpis 2',tag_h3:'Nadpis 3',tag_h4:'Nadpis 4',tag_h5:'Nadpis 5',tag_h6:'Nadpis 6',tag_div:'Normální (DIV)'},div:{title:'Vytvořit Div kontejner',toolbar:'Vytvořit Div kontejner',cssClassInputLabel:'Třídy stylů',styleSelectLabel:'Styly',IdInputLabel:'Id',languageCodeInputLabel:' Kód jazyka',inlineStyleInputLabel:'Vnitřní styly',advisoryTitleInputLabel:'Nápovědní titulek',langDirLabel:'Směr jazyka',langDirLTRLabel:'Zleva doprava (LTR)',langDirRTLLabel:'Zprava doleva (RTL)',edit:'Změnit Div',remove:'Odstranit Div'},iframe:{title:'Vlastnosti IFrame',toolbar:'IFrame',noUrl:'Zadejte prosím URL obsahu pro IFrame',scrolling:'Zapnout posuvníky',border:'Zobrazit okraj'},font:{label:'Písmo',voiceLabel:'Písmo',panelTitle:'Písmo'},fontSize:{label:'Velikost',voiceLabel:'Velikost písma',panelTitle:'Velikost'},colorButton:{textColorTitle:'Barva textu',bgColorTitle:'Barva pozadí',panelTitle:'Barvy',auto:'Automaticky',more:'Více barev...'},colors:{'000':'Černá',800000:'Kaštanová','8B4513':'Sedlová hněď','2F4F4F':'Tmavě bledě šedá','008080':'Čírka','000080':'Námořnická modř','4B0082':'Inkoustová',696969:'Tmavě šedá',B22222:'Pálená cihla',A52A2A:'Hnědá',DAA520:'Zlatý prut','006400':'Tmavě zelená','40E0D0':'Tyrkisová','0000CD':'Středně modrá',800080:'Purpurová',808080:'Šedá',F00:'Červená',FF8C00:'Tmavě oranžová',FFD700:'Zlatá','008000':'Zelená','0FF':'Azurová','00F':'Modrá',EE82EE:'Fialová',A9A9A9:'Kalně šedá',FFA07A:'Světle lososová',FFA500:'Oranžová',FFFF00:'Žlutá','00FF00':'Limetková',AFEEEE:'Bledě tyrkisová',ADD8E6:'Světle modrá',DDA0DD:'Švestková',D3D3D3:'Světle šedá',FFF0F5:'Levandulově ruměnná',FAEBD7:'Antická bílá',FFFFE0:'Světle žlutá',F0FFF0:'Medová rosa',F0FFFF:'Azurová',F0F8FF:'Alenčina modrá',E6E6FA:'Levandulová',FFF:'Bílá'},scayt:{title:'Kontrola pravopisu během psaní (SCAYT)',opera_title:'Toto Opera nepodporuje',enable:'Zapnout SCAYT',disable:'Vypnout SCAYT',about:'O aplikaci SCAYT',toggle:'Vypínač SCAYT',options:'Nastavení',langs:'Jazyky',moreSuggestions:'Více návrhů',ignore:'Přeskočit',ignoreAll:'Přeskočit vše',addWord:'Přidat slovo',emptyDic:'Název slovníku nesmí být prázdný.',optionsTab:'Nastavení',allCaps:'Ignorovat slova tvořená velkými písmeny',ignoreDomainNames:'Ignorovat doménová jména',mixedCase:'Ignorovat slova obsahující různou velikost písma',mixedWithDigits:'Ignorovat slova obsahující čísla',languagesTab:'Jazyky',dictionariesTab:'Slovníky',dic_field_name:'Název slovníku',dic_create:'Vytvořit',dic_restore:'Obnovit',dic_delete:'Smazat',dic_rename:'Přejmenovat',dic_info:'Zpočátku se uživatelský slovník ukládá do cookies ve vašem prohlížeči. Ovšem cookies mají omezenou velikost, takže když slovník dosáhne velikosti, kdy se již do cookies nevejde, může být uložen na našem serveru. Chcete-li uložit váš osobní slovník na našem serveru, je třeba slovník nejdříve pojmenovat. Máte-li již slovník pojmenován a uložen, zadejte jeho název a klepněte na tlačítko Obnovit.',aboutTab:'O aplikaci'},about:{title:'O aplikaci CKEditor',dlgTitle:'O aplikaci CKEditor',help:'Prohlédněte si $1 pro nápovědu.',userGuide:'Uživatelská příručka CKEditor',moreInfo:'Pro informace o lincenci navštivte naši webovou stránku:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximalizovat',minimize:'Minimalizovat',fakeobjects:{anchor:'Záložka',flash:'Flash animace',iframe:'IFrame',hiddenfield:'Skryté pole',unknown:'Neznámý objekt'},resize:'Uchopit pro změnu velikosti',colordialog:{title:'Výběr barvy',options:'Nastavení barvy',highlight:'Zvýraznit',selected:'Vybráno',clear:'Vyčistit'},toolbarCollapse:'Skrýt panel nástrojů',toolbarExpand:'Zobrazit panel nástrojů',toolbarGroups:{document:'Dokument',clipboard:'Schránka/Zpět',editing:'Úpravy',forms:'Formuláře',basicstyles:'Základní styly',paragraph:'Odstavec',links:'Odkazy',insert:'Vložit',styles:'Styly',colors:'Barvy',tools:'Nástroje'},bidi:{ltr:'Směr textu zleva doprava',rtl:'Směr textu zprava doleva'},docprops:{label:'Vlastnosti dokumentu',title:'Vlastnosti dokumentu',design:'Vzhled',meta:'Metadata',chooseColor:'Výběr',other:'<jiný>',docTitle:'Titulek stránky',charset:'Znaková sada',charsetOther:'Další znaková sada',charsetASCII:'ASCII',charsetCE:'Středoevropské jazyky',charsetCT:'Tradiční čínština (Big5)',charsetCR:'Cyrilice',charsetGR:'Řečtina',charsetJP:'Japonština',charsetKR:'Korejština',charsetTR:'Turečtina',charsetUN:'Unicode (UTF-8)',charsetWE:'Západoevropské jazyky',docType:'Typ dokumentu',docTypeOther:'Jiný typ dokumetu',xhtmlDec:'Zahrnout deklarace XHTML',bgColor:'Barva pozadí',bgImage:'URL obrázku na pozadí',bgFixed:'Nerolovatelné (Pevné) pozadí',txtColor:'Barva textu',margin:'Okraje stránky',marginTop:'Horní',marginLeft:'Levý',marginRight:'Pravý',marginBottom:'Dolní',metaKeywords:'Klíčová slova (oddělená čárkou)',metaDescription:'Popis dokumentu',metaAuthor:'Autor',metaCopyright:'Autorská práva',previewHtml:'<p>Toto je <strong>ukázkový text</strong>. Používáte <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/cy.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/cy.js
index 94b49c1..52241bd 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/cy.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/cy.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.cy={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Bariau offer golygydd',editor:'Golygydd Testun Cyfoethog',source:'HTML',newPage:'Tudalen newydd',save:'Cadw',preview:'Rhagolwg',cut:'Torri',copy:'Copïo',paste:'Gludo',print:'Argraffu',underline:'Tanlinellu',bold:'Bras',italic:'Italig',selectAll:'Dewis Popeth',removeFormat:'Tynnu Fformat',strike:'Llinell Trwyddo',subscript:'Is-sgript',superscript:'Uwchsgript',horizontalrule:'Mewnosod Llinell Lorweddol',pagebreak:'Mewnosod Toriad Tudalen i Argraffu',pagebreakAlt:'Toriad Tudalen',unlink:'Datgysylltu',undo:'Dadwneud',redo:'Ailadrodd',common:{browseServer:"Pori'r Gweinydd",url:'URL',protocol:'Protocol',upload:'Lanlwytho',uploadSubmit:"Anfon i'r Gweinydd",image:'Delwedd',flash:'Flash',form:'Ffurflen',checkbox:'Blwch ticio',radio:'Botwm Radio',textField:'Maes Testun',textarea:'Ardal Testun',hiddenField:'Maes Cudd',button:'Botwm',select:'Maes Dewis',imageButton:'Botwm Delwedd',notSet:'<heb osod>',id:'Id',name:'Name',langDir:'Cyfeiriad Iaith',langDirLtr:"Chwith i'r Dde (LTR)",langDirRtl:"Dde i'r Chwith (RTL)",langCode:'Cod Iaith',longDescr:'URL Disgrifiad Hir',cssClass:'Dosbarth Dalen Arddull',advisoryTitle:'Teitl Cynghorol',cssStyle:'Arddull',ok:'Iawn',cancel:'Diddymu',close:'Cau',preview:'Rhagolwg',generalTab:'Cyffredinol',advancedTab:'Uwch',validateNumberFailed:"Nid yw'r gwerth hwn yn rhif.",confirmNewPage:"Byddwch yn colli unrhyw newidiadau i'r cynnwys sydd heb eu cadw. A ydych am barhau i lwytho tudalen newydd?",confirmCancel:"Mae rhai o'r opsiynau wedi'u newid. A ydych wir am gau'r deialog?",options:'Opsiynau',target:'Targed',targetNew:'Ffenest Newydd (_blank)',targetTop:'Ffenest ar y Brig (_top)',targetSelf:'Yr un Ffenest (_self)',targetParent:'Ffenest y Rhiant (_parent)',langDirLTR:"Chwith i'r Dde (LTR)",langDirRTL:"Dde i'r Chwith (RTL)",styles:'Arddull',cssClasses:'Dosbarthiadau Ffeil Ddiwyg',width:'Lled',height:'Uchder',align:'Alinio',alignLeft:'Chwith',alignRight:'Dde',alignCenter:'Canol',alignTop:'Brig',alignMiddle:'Canol',alignBottom:'Gwaelod',invalidHeight:"Rhaid i'r Uchder fod yn rhif.",invalidWidth:"Rhaid i'r Lled fod yn rhif.",invalidCssLength:"Mae'n rhaid i'r gwerth ar gyfer maes \"%1\" fod yn rhif positif gyda neu heb uned fesuriad CSS dilys (px, %, in, cm, mm, em, ex, pt, neu pc).",invalidHtmlLength:"Mae'n rhaid i'r gwerth ar gyfer maes \"%1\" fod yn rhif positif gyda neu heb uned fesuriad HTML dilys (px neu %).",invalidInlineStyle:"Mae'n rhaid i'r gwerth ar gyfer arddull mewn-llinell gynnwys un set neu fwy ar y fformat \"enw:gwerth\", wedi'u gwahanu gyda hanner colon.",cssLengthTooltip:'Rhowch rif ar gyfer gwerth mewn picsel neu rhif gydag uned CSS dilys (px, %, in, cm, mm, em, pt neu pc).',unavailable:'%1<span class="cke_accessibility">, ddim ar gael</span>'},contextmenu:{options:'Opsiynau Dewislen Cyd-destun'},specialChar:{toolbar:'Mewnosod Nodau Arbennig',title:'Dewis Nod Arbennig',options:'Opsiynau Nodau Arbennig'},link:{toolbar:'Dolen',other:'<eraill>',menu:'Golygu Dolen',title:'Dolen',info:'Gwyb ar y Ddolen',target:'Targed',upload:'Lanlwytho',advanced:'Uwch',type:'Math y Ddolen',toUrl:'URL',toAnchor:'Dolen at angor yn y testun',toEmail:'E-bost',targetFrame:'<ffrâm>',targetPopup:'<ffenestr bop>',targetFrameName:'Enw Ffrâm y Targed',targetPopupName:'Enw Ffenestr Bop',popupFeatures:'Nodweddion Ffenestr Bop',popupResizable:'Ailfeintiol',popupStatusBar:'Bar Statws',popupLocationBar:'Bar Safle',popupToolbar:'Bar Offer',popupMenuBar:'Dewislen',popupFullScreen:'Sgrin Llawn (IE)',popupScrollBars:'Barrau Sgrolio',popupDependent:'Dibynnol (Netscape)',popupLeft:'Safle Chwith',popupTop:'Safle Top',id:'Id',langDir:'Cyfeiriad Iaith',langDirLTR:"Chwith i'r Dde (LTR)",langDirRTL:"Dde i'r Chwith (RTL)",acccessKey:'Allwedd Mynediad',name:'Enw',langCode:'Cod Iaith',tabIndex:'Indecs Tab',advisoryTitle:'Teitl Cynghorol',advisoryContentType:'Math y Cynnwys Cynghorol',cssClasses:'Dosbarthiadau Dalen Arddull',charset:"Set nodau'r Adnodd Cysylltiedig",styles:'Arddull',rel:'Perthynas',selectAnchor:'Dewiswch Angor',anchorName:"Gan Enw'r Angor",anchorId:'Gan Id yr Elfen',emailAddress:'Cyfeiriad E-Bost',emailSubject:'Testun y Message Subject',emailBody:'Pwnc y Neges',noAnchors:'(Dim angorau ar gael yn y ddogfen)',noUrl:'Teipiwch URL y ddolen',noEmail:'Teipiwch gyfeiriad yr e-bost'},anchor:{toolbar:'Angor',menu:'Golygwch yr Angor',title:"Priodweddau'r Angor",name:"Enw'r Angor",errorName:"Teipiwch enw'r angor",remove:'Tynnwch yr Angor'},list:{numberedTitle:'Priodweddau Rhestr Rifol',bulletedTitle:'Priodweddau Rhestr Fwled',type:'Math',start:'Dechrau',validateStartNumber:'Rhaid bod y rhif cychwynnol yn gyfanrif.',circle:'Cylch',disc:'Disg',square:'Sgwâr',none:'Dim',notset:'<heb osod>',armenian:'Rhifau Armeneg',georgian:'Rhifau Sioraidd (an, ban, gan, ayyb.)',lowerRoman:'Rhufeinig Is (i, ii, iii, iv, v, ayyb.)',upperRoman:'Rhufeinig Uwch (I, II, III, IV, V, ayyb.)',lowerAlpha:'Alffa Is (a, b, c, d, e, ayyb.)',upperAlpha:'Alffa Uwch (A, B, C, D, E, ayyb.)',lowerGreek:'Groeg Is (alpha, beta, gamma, ayyb.)',decimal:'Degol (1, 2, 3, ayyb.)',decimalLeadingZero:'Degol â sero arweiniol (01, 02, 03, ayyb.)'},findAndReplace:{title:'Chwilio ac Amnewid',find:'Chwilio',replace:'Amnewid',findWhat:"Chwilio'r term:",replaceWith:'Amnewid gyda:',notFoundMsg:"Nid oedd y testun wedi'i ddarganfod.",findOptions:'Chwilio Opsiynau',matchCase:"Cyfateb i'r cas",matchWord:'Cyfateb gair cyfan',matchCyclic:'Cyfateb cylchol',replaceAll:'Amnewid pob un',replaceSuccessMsg:'Amnewidiwyd %1 achlysur.'},table:{toolbar:'Tabl',title:'Nodweddion Tabl',menu:'Nodweddion Tabl',deleteTable:'Dileu Tabl',rows:'Rhesi',columns:'Colofnau',border:'Maint yr Ymyl',widthPx:'picsel',widthPc:'y cant',widthUnit:'uned lled',cellSpace:"Bylchu'r gell",cellPad:"Padio'r gell",caption:'Pennawd',summary:'Crynodeb',headers:'Penynnau',headersNone:'Dim',headersColumn:'Colofn gyntaf',headersRow:'Rhes gyntaf',headersBoth:'Y Ddau',invalidRows:"Mae'n rhaid cael o leiaf un rhes.",invalidCols:"Mae'n rhaid cael o leiaf un golofn.",invalidBorder:"Mae'n rhaid i faint yr ymyl fod yn rhif.",invalidWidth:"Mae'n rhaid i led y tabl fod yn rhif.",invalidHeight:"Mae'n rhaid i uchder y tabl fod yn rhif.",invalidCellSpacing:"Mae'n rhaid i fylchiad y gell fod yn rhif positif.",invalidCellPadding:"Mae'n rhaid i badiad y gell fod yn rhif positif.",cell:{menu:'Cell',insertBefore:'Mewnosod Cell Cyn',insertAfter:'Mewnosod Cell Ar Ôl',deleteCell:'Dileu Celloedd',merge:'Cyfuno Celloedd',mergeRight:"Cyfuno i'r Dde",mergeDown:'Cyfuno i Lawr',splitHorizontal:"Hollti'r Gell yn Lorweddol",splitVertical:"Hollti'r Gell yn Fertigol",title:"Priodweddau'r Gell",cellType:'Math y Gell',rowSpan:'Rhychwant Rhesi',colSpan:'Rhychwant Colofnau',wordWrap:'Lapio Geiriau',hAlign:'Aliniad Llorweddol',vAlign:'Aliniad Fertigol',alignBaseline:'Baslinell',bgColor:'Lliw Cefndir',borderColor:'Lliw Ymyl',data:'Data',header:'Pennyn',yes:'Ie',no:'Na',invalidWidth:"Mae'n rhaid i led y gell fod yn rhif.",invalidHeight:"Mae'n rhaid i uchder y gell fod yn rhif.",invalidRowSpan:"Mae'n rhaid i rychwant y rhesi fod yn gyfanrif.",invalidColSpan:"Mae'n rhaid i rychwant y colofnau fod yn gyfanrif.",chooseColor:'Choose'},row:{menu:'Rhes',insertBefore:'Mewnosod Rhes Cyn',insertAfter:'Mewnosod Rhes Ar Ôl',deleteRow:'Dileu Rhesi'},column:{menu:'Colofn',insertBefore:'Mewnosod Colofn Cyn',insertAfter:'Mewnosod Colofn Ar Ôl',deleteColumn:'Dileu Colofnau'}},button:{title:'Priodweddau Botymau',text:'Testun (Gwerth)',type:'Math',typeBtn:'Botwm',typeSbm:'Gyrru',typeRst:'Ailosod'},checkboxAndRadio:{checkboxTitle:'Priodweddau Blwch Ticio',radioTitle:'Priodweddau Botwm Radio',value:'Gwerth',selected:'Dewiswyd'},form:{title:'Priodweddau Ffurflen',menu:'Priodweddau Ffurflen',action:'Gweithred',method:'Dull',encoding:'Amgodio'},select:{title:'Priodweddau Maes Dewis',selectInfo:'Gwyb Dewis',opAvail:'Opsiynau ar Gael',value:'Gwerth',size:'Maint',lines:'llinellau',chkMulti:'Caniatàu aml-ddewisiadau',opText:'Testun',opValue:'Gwerth',btnAdd:'Ychwanegu',btnModify:'Newid',btnUp:'Lan',btnDown:'Lawr',btnSetValue:'Gosod fel gwerth a ddewiswyd',btnDelete:'Dileu'},textarea:{title:'Priodweddau Ardal Testun',cols:'Colofnau',rows:'Rhesi'},textfield:{title:'Priodweddau Maes Testun',name:'Enw',value:'Gwerth',charWidth:'Lled Nod',maxChars:'Uchafswm y Nodau',type:'Math',typeText:'Testun',typePass:'Cyfrinair'},hidden:{title:'Priodweddau Maes Cudd',name:'Enw',value:'Gwerth'},image:{title:'Priodweddau Delwedd',titleButton:'Priodweddau Botwm Delwedd',menu:'Priodweddau Delwedd',infoTab:'Gwyb Delwedd',btnUpload:"Anfon i'r Gweinydd",upload:'lanlwytho',alt:'Testun Amgen',lockRatio:'Cloi Cymhareb',resetSize:'Ailosod Maint',border:'Ymyl',hSpace:'BwlchLl',vSpace:'BwlchF',alertUrl:'Rhowch URL y ddelwedd',linkTab:'Dolen',button2Img:"Ydych am drawsffurfio'r botwm ddelwedd hwn ar ddelwedd syml?",img2Button:"Ydych am drawsffurfio'r ddelwedd hon ar fotwm delwedd?",urlMissing:'URL gwreiddiol y ddelwedd ar goll.',validateBorder:"Rhaid i'r ymyl fod yn gyfanrif.",validateHSpace:"Rhaid i'r HSpace fod yn gyfanrif.",validateVSpace:"Rhaid i'r VSpace fod yn gyfanrif."},flash:{properties:'Priodweddau Flash',propertiesTab:'Priodweddau',title:'Priodweddau Flash',chkPlay:'AwtoChwarae',chkLoop:'Lwpio',chkMenu:'Galluogi Dewislen Flash',chkFull:'Caniatàu Sgrin Llawn',scale:'Graddfa',scaleAll:'Dangos pob',scaleNoBorder:'Dim Ymyl',scaleFit:'Ffit Union',access:'Mynediad Sgript',accessAlways:'Pob amser',accessSameDomain:"R'un parth",accessNever:'Byth',alignAbsBottom:'Gwaelod Abs',alignAbsMiddle:'Canol Abs',alignBaseline:'Baslinell',alignTextTop:'Testun Top',quality:'Ansawdd',qualityBest:'Gorau',qualityHigh:'Uchel',qualityAutoHigh:'Uchel Awto',qualityMedium:'Canolig',qualityAutoLow:'Isel Awto',qualityLow:'Isel',windowModeWindow:'Ffenestr',windowModeOpaque:'Afloyw',windowModeTransparent:'Tryloyw',windowMode:'Modd ffenestr',flashvars:'Newidynnau ar gyfer Flash',bgcolor:'Lliw cefndir',hSpace:'BwlchLl',vSpace:'BwlchF',validateSrc:'Ni all yr URL fod yn wag.',validateHSpace:"Rhaid i'r BwlchLl fod yn rhif.",validateVSpace:"Rhaid i'r BwlchF fod yn rhif."},spellCheck:{toolbar:'Gwirio Sillafu',title:'Gwirio Sillafu',notAvailable:"Nid yw'r gwasanaeth hwn ar gael yn bresennol.",errorLoading:'Error loading application service host: %s.',notInDic:"Nid i'w gael yn y geiriadur",changeTo:'Newid i',btnIgnore:'Anwybyddu Un',btnIgnoreAll:'Anwybyddu Pob',btnReplace:'Amnewid Un',btnReplaceAll:'Amnewid Pob',btnUndo:'Dadwneud',noSuggestions:'- Dim awgrymiadau -',progress:'Gwirio sillafu yn ar y gweill...',noMispell:'Gwirio sillafu wedi gorffen: Dim camsillaf.',noChanges:'Gwirio sillafu wedi gorffen: Dim newidiadau',oneChange:'Gwirio sillafu wedi gorffen: Newidiwyd 1 gair',manyChanges:'Gwirio sillafu wedi gorffen: Newidiwyd %1 gair',ieSpellDownload:'Gwirydd sillafu heb ei arsefydlu. A ydych am ei lawrlwytho nawr?'},smiley:{toolbar:'Gwenoglun',title:'Mewnosod Gwenoglun',options:'Opsiynau Gwenogluniau'},elementsPath:{eleLabel:'Llwybr elfennau',eleTitle:'Elfen %1'},numberedlist:'Mewnosod/Tynnu Rhestr Rhifol',bulletedlist:'Mewnosod/Tynnu Rhestr Bwled',indent:"Cynyddu'r Mewnoliad",outdent:"Lleihau'r Mewnoliad",justify:{left:"Alinio i'r Chwith",center:"Alinio i'r Canol",right:"Alinio i'r Dde",block:'Aliniad Bloc'},blockquote:'Dyfyniad bloc',clipboard:{title:'Gludo',cutError:"Nid yw gosodiadau diogelwch eich porwr yn caniatàu'r golygydd i gynnal 'gweithredoedd torri' yn awtomatig. Defnyddiwch y bysellfwrdd (Ctrl/Cmd+X).",copyError:"Nid yw gosodiadau diogelwch eich porwr yn caniatàu'r golygydd i gynnal 'gweithredoedd copïo' yn awtomatig. Defnyddiwch y bysellfwrdd (Ctrl/Cmd+C).",pasteMsg:"Gludwch i mewn i'r blwch canlynol gan ddefnyddio'r bysellfwrdd (<strong>Ctrl/Cmd+V</strong>) a phwyso <strong>Iawn</strong>.",securityMsg:"Oherwydd gosodiadau diogelwch eich porwr, nid yw'r porwr yn gallu ennill mynediad i'r data ar y clipfwrdd yn uniongyrchol. Mae angen i chi ei ludo eto i'r ffenestr hon.",pasteArea:'Ardal Gludo'},pastefromword:{confirmCleanup:"Mae'r testun rydych chi am ludo wedi'i gopïo o Word. Ydych chi am ei lanhau cyn ei ludo?",toolbar:'Gludo o Word',title:'Gludo o Word',error:'Doedd dim modd glanhau y data a ludwyd oherwydd gwall mewnol'},pasteText:{button:'Gludo fel testun plaen',title:'Gludo fel Testun Plaen'},templates:{button:'Templedi',title:'Templedi Cynnwys',options:'Opsiynau Templedi',insertOption:'Amnewid y cynnwys go iawn',selectPromptMsg:"Dewiswch dempled i'w agor yn y golygydd",emptyListMsg:"(Dim templedi wedi'u diffinio)"},showBlocks:'Dangos Blociau',stylesCombo:{label:'Arddulliau',panelTitle:'Arddulliau Fformatio',panelTitle1:'Arddulliau Bloc',panelTitle2:'Arddulliau Mewnol',panelTitle3:'Arddulliau Gwrthrych'},format:{label:'Fformat',panelTitle:'Fformat Paragraff',tag_p:'Normal',tag_pre:"Wedi'i Fformatio",tag_address:'Cyfeiriad',tag_h1:'Pennawd 1',tag_h2:'Pennawd 2',tag_h3:'Pennawd 3',tag_h4:'Pennawd 4',tag_h5:'Pennawd 5',tag_h6:'Pennawd 6',tag_div:'Normal (DIV)'},div:{title:'Creu Cynhwysydd Div',toolbar:'Creu Cynhwysydd Div',cssClassInputLabel:'Dosbarthiadau Ffeil Ddiwyg',styleSelectLabel:'Arddull',IdInputLabel:'Id',languageCodeInputLabel:' Cod Iaith',inlineStyleInputLabel:'Arddull Mewn Llinell',advisoryTitleInputLabel:'Teitl Cynghorol',langDirLabel:'Cyfeiriad yr Iaith',langDirLTRLabel:"Chwith i'r Dde (LTR)",langDirRTLLabel:"Dde i'r Chwith (RTL)",edit:'Golygu Div',remove:'Tynnu Div'},iframe:{title:'Priodweddau IFrame',toolbar:'IFrame',noUrl:'Rhowch fath URL yr iframe',scrolling:'Galluogi bariau sgrolio',border:'Dangos ymyl y ffrâm'},font:{label:'Ffont',voiceLabel:'Ffont',panelTitle:"Enw'r Ffont"},fontSize:{label:'Maint',voiceLabel:'Maint y Ffont',panelTitle:'Maint y Ffont'},colorButton:{textColorTitle:'Lliw Testun',bgColorTitle:'Lliw Cefndir',panelTitle:'Lliwiau',auto:'Awtomatig',more:'Mwy o Liwiau...'},colors:{'000':'Du',800000:'Marwn','8B4513':'Brown Cyfrwy','2F4F4F':'Llechen Tywyll','008080':'Corhwyad','000080':'Nefi','4B0082':'Indigo',696969:'Llwyd Pwl',B22222:'Bric Tân',A52A2A:'Brown',DAA520:'Rhoden Aur','006400':'Gwyrdd Tywyll','40E0D0':'Gwyrddlas','0000CD':'Glas Canolig',800080:'Porffor',808080:'Llwyd',F00:'Coch',FF8C00:'Oren Tywyll',FFD700:'Aur','008000':'Gwyrdd','0FF':'Cyan','00F':'Glas',EE82EE:'Fioled',A9A9A9:'Llwyd Tywyll',FFA07A:'Samwn Golau',FFA500:'Oren',FFFF00:'Melyn','00FF00':'Leim',AFEEEE:'Gwyrddlas Golau',ADD8E6:'Glas Golau',DDA0DD:'Eirinen',D3D3D3:'Llwyd Golau',FFF0F5:'Gwrid Lafant',FAEBD7:'Gwyn Hynafol',FFFFE0:'Melyn Golau',F0FFF0:'Melwn Gwyrdd Golau',F0FFFF:'Aswr',F0F8FF:'Glas Alys',E6E6FA:'Lafant',FFF:'Gwyn'},scayt:{title:"Gwirio'r Sillafu Wrth Deipio",opera_title:'Heb ei gynnal gan Opera',enable:'Galluogi SCAYT',disable:'Analluogi SCAYT',about:'Ynghylch SCAYT',toggle:'Togl SCAYT',options:'Opsiynau',langs:'Ieithoedd',moreSuggestions:'Awgrymiadau pellach',ignore:'Anwybyddu',ignoreAll:'Anwybyddu pob',addWord:'Ychwanegu Gair',emptyDic:"Ni ddylai enw'r geiriadur fod yn wag.",optionsTab:'Opsiynau',allCaps:'Anwybyddu Geiriau Nodau Uwch i Gyd',ignoreDomainNames:'Anwybyddu Enwau Parth',mixedCase:'Anwybyddu Geiriau â Chymysgedd Nodau Uwch ac Is',mixedWithDigits:'Anwybyddu Geiriau â Rhifau',languagesTab:'Ieithoedd',dictionariesTab:'Geiriaduron',dic_field_name:"Enw'r geiriadur",dic_create:'Creu',dic_restore:'Adfer',dic_delete:'Dileu',dic_rename:'Ailenwi',dic_info:"Ar y cychwyn, caiff y Geiriadur ei storio mewn Cwci. Er, mae terfyn ar faint cwcis. Pan fydd Gweiriadur Defnyddiwr yn tyfu tu hwnt i gyfyngiadau maint Cwci, caiff y geiriadur ei storio ar ein gweinydd ni. er mwyn storio eich geiriadur poersonol chi ar ein gweinydd, bydd angen i chi osod enw ar gyfer y geiriadur. Os oes geiriadur 'da chi ar ein gweinydd yn barod, teipiwch ei enw a chliciwch y botwm Adfer.",aboutTab:'Ynghylch'},about:{title:'Ynghylch CKEditor',dlgTitle:'Ynghylch CKEditor',help:'Gwirio $1 am gymorth.',userGuide:'Canllawiau Defnyddiwr CKEditor',moreInfo:"Am wybodaeth ynghylch trwyddedau, ewch i'n gwefan:",copy:'Hawlfraint © $1. Cedwir pob hawl.'},maximize:'Mwyhau',minimize:'Lleihau',fakeobjects:{anchor:'Angor',flash:'Animeiddiant Flash',iframe:'IFrame',hiddenfield:'Maes Cudd',unknown:'Gwrthrych Anhysbys'},resize:'Llusgo i ailfeintio',colordialog:{title:'Dewis lliw',options:'Opsiynau Lliw',highlight:'Uwcholeuo',selected:'Dewiswyd',clear:'Clirio'},toolbarCollapse:"Cyfangu'r Bar Offer",toolbarExpand:"Ehangu'r Bar Offer",toolbarGroups:{document:'Dogfen',clipboard:'Clipfwrdd/Dadwneud',editing:'Golygu',forms:'Ffurflenni',basicstyles:'Arddulliau Sylfaenol',paragraph:'Paragraff',links:'Dolenni',insert:'Mewnosod',styles:'Arddulliau',colors:'Lliwiau',tools:'Offer'},bidi:{ltr:"Cyfeiriad testun o'r chwith i'r dde",rtl:"Cyfeiriad testun o'r dde i'r chwith"},docprops:{label:'Priodweddau Dogfen',title:'Priodweddau Dogfen',design:'Cynllunio',meta:'Tagiau Meta',chooseColor:'Dewis',other:'Arall...',docTitle:'Teitl y Dudalen',charset:'Amgodio Set Nodau',charsetOther:'Amgodio Set Nodau Arall',charsetASCII:'ASCII',charsetCE:'Ewropeaidd Canol',charsetCT:'Tsieinëeg Traddodiadol (Big5)',charsetCR:'Syrilig',charsetGR:'Groeg',charsetJP:'Siapanëeg',charsetKR:'Corëeg',charsetTR:'Tyrceg',charsetUN:'Unicode (UTF-8)',charsetWE:'Ewropeaidd Gorllewinol',docType:'Pennawd Math y Ddogfen',docTypeOther:'Pennawd Math y Ddogfen Arall',xhtmlDec:'Cynnwys Datganiadau XHTML',bgColor:'Lliw Cefndir',bgImage:'URL Delwedd Cefndir',bgFixed:'Cefndir Sefydlog (Ddim yn Sgrolio)',txtColor:'Lliw y Testun',margin:'Ffin y Dudalen',marginTop:'Brig',marginLeft:'Chwith',marginRight:'Dde',marginBottom:'Gwaelod',metaKeywords:'Allweddeiriau Indecsio Dogfen (gwahanu gyda choma)',metaDescription:'Disgrifiad y Ddogfen',metaAuthor:'Awdur',metaCopyright:'Hawlfraint',previewHtml:'<p>Dyma ychydig o <strong>destun sampl</strong>. Rydych chi\'n defnyddio <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.cy={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Bariau offer golygydd',editor:'Golygydd Testun Cyfoethog',source:'HTML',newPage:'Tudalen newydd',save:'Cadw',preview:'Rhagolwg',cut:'Torri',copy:'Copïo',paste:'Gludo',print:'Argraffu',underline:'Tanlinellu',bold:'Bras',italic:'Italig',selectAll:'Dewis Popeth',removeFormat:'Tynnu Fformat',strike:'Llinell Trwyddo',subscript:'Is-sgript',superscript:'Uwchsgript',horizontalrule:'Mewnosod Llinell Lorweddol',pagebreak:'Mewnosod Toriad Tudalen i Argraffu',pagebreakAlt:'Toriad Tudalen',unlink:'Datgysylltu',undo:'Dadwneud',redo:'Ailadrodd',common:{browseServer:"Pori'r Gweinydd",url:'URL',protocol:'Protocol',upload:'Lanlwytho',uploadSubmit:"Anfon i'r Gweinydd",image:'Delwedd',flash:'Flash',form:'Ffurflen',checkbox:'Blwch ticio',radio:'Botwm Radio',textField:'Maes Testun',textarea:'Ardal Testun',hiddenField:'Maes Cudd',button:'Botwm',select:'Maes Dewis',imageButton:'Botwm Delwedd',notSet:'<heb osod>',id:'Id',name:'Name',langDir:'Cyfeiriad Iaith',langDirLtr:"Chwith i'r Dde (LTR)",langDirRtl:"Dde i'r Chwith (RTL)",langCode:'Cod Iaith',longDescr:'URL Disgrifiad Hir',cssClass:'Dosbarth Dalen Arddull',advisoryTitle:'Teitl Cynghorol',cssStyle:'Arddull',ok:'Iawn',cancel:'Diddymu',close:'Cau',preview:'Rhagolwg',generalTab:'Cyffredinol',advancedTab:'Uwch',validateNumberFailed:"Nid yw'r gwerth hwn yn rhif.",confirmNewPage:"Byddwch yn colli unrhyw newidiadau i'r cynnwys sydd heb eu cadw. A ydych am barhau i lwytho tudalen newydd?",confirmCancel:"Mae rhai o'r opsiynau wedi'u newid. A ydych wir am gau'r deialog?",options:'Opsiynau',target:'Targed',targetNew:'Ffenest Newydd (_blank)',targetTop:'Ffenest ar y Brig (_top)',targetSelf:'Yr un Ffenest (_self)',targetParent:'Ffenest y Rhiant (_parent)',langDirLTR:"Chwith i'r Dde (LTR)",langDirRTL:"Dde i'r Chwith (RTL)",styles:'Arddull',cssClasses:'Dosbarthiadau Ffeil Ddiwyg',width:'Lled',height:'Uchder',align:'Alinio',alignLeft:'Chwith',alignRight:'Dde',alignCenter:'Canol',alignTop:'Brig',alignMiddle:'Canol',alignBottom:'Gwaelod',invalidHeight:"Rhaid i'r Uchder fod yn rhif.",invalidWidth:"Rhaid i'r Lled fod yn rhif.",invalidCssLength:"Mae'n rhaid i'r gwerth ar gyfer maes \"%1\" fod yn rhif positif gyda neu heb uned fesuriad CSS dilys (px, %, in, cm, mm, em, ex, pt, neu pc).",invalidHtmlLength:"Mae'n rhaid i'r gwerth ar gyfer maes \"%1\" fod yn rhif positif gyda neu heb uned fesuriad HTML dilys (px neu %).",invalidInlineStyle:"Mae'n rhaid i'r gwerth ar gyfer arddull mewn-llinell gynnwys un set neu fwy ar y fformat \"enw:gwerth\", wedi'u gwahanu gyda hanner colon.",cssLengthTooltip:'Rhowch rif ar gyfer gwerth mewn picsel neu rhif gydag uned CSS dilys (px, %, in, cm, mm, em, pt neu pc).',unavailable:'%1<span class="cke_accessibility">, ddim ar gael</span>'},contextmenu:{options:'Opsiynau Dewislen Cyd-destun'},specialChar:{toolbar:'Mewnosod Nodau Arbennig',title:'Dewis Nod Arbennig',options:'Opsiynau Nodau Arbennig'},link:{toolbar:'Dolen',other:'<eraill>',menu:'Golygu Dolen',title:'Dolen',info:'Gwyb ar y Ddolen',target:'Targed',upload:'Lanlwytho',advanced:'Uwch',type:'Math y Ddolen',toUrl:'URL',toAnchor:'Dolen at angor yn y testun',toEmail:'E-bost',targetFrame:'<ffrâm>',targetPopup:'<ffenestr bop>',targetFrameName:'Enw Ffrâm y Targed',targetPopupName:'Enw Ffenestr Bop',popupFeatures:'Nodweddion Ffenestr Bop',popupResizable:'Ailfeintiol',popupStatusBar:'Bar Statws',popupLocationBar:'Bar Safle',popupToolbar:'Bar Offer',popupMenuBar:'Dewislen',popupFullScreen:'Sgrin Llawn (IE)',popupScrollBars:'Barrau Sgrolio',popupDependent:'Dibynnol (Netscape)',popupLeft:'Safle Chwith',popupTop:'Safle Top',id:'Id',langDir:'Cyfeiriad Iaith',langDirLTR:"Chwith i'r Dde (LTR)",langDirRTL:"Dde i'r Chwith (RTL)",acccessKey:'Allwedd Mynediad',name:'Enw',langCode:'Cod Iaith',tabIndex:'Indecs Tab',advisoryTitle:'Teitl Cynghorol',advisoryContentType:'Math y Cynnwys Cynghorol',cssClasses:'Dosbarthiadau Dalen Arddull',charset:"Set nodau'r Adnodd Cysylltiedig",styles:'Arddull',rel:'Perthynas',selectAnchor:'Dewiswch Angor',anchorName:"Gan Enw'r Angor",anchorId:'Gan Id yr Elfen',emailAddress:'Cyfeiriad E-Bost',emailSubject:'Testun y Message Subject',emailBody:'Pwnc y Neges',noAnchors:'(Dim angorau ar gael yn y ddogfen)',noUrl:'Teipiwch URL y ddolen',noEmail:'Teipiwch gyfeiriad yr e-bost'},anchor:{toolbar:'Angor',menu:'Golygwch yr Angor',title:"Priodweddau'r Angor",name:"Enw'r Angor",errorName:"Teipiwch enw'r angor",remove:'Tynnwch yr Angor'},list:{numberedTitle:'Priodweddau Rhestr Rifol',bulletedTitle:'Priodweddau Rhestr Fwled',type:'Math',start:'Dechrau',validateStartNumber:'Rhaid bod y rhif cychwynnol yn gyfanrif.',circle:'Cylch',disc:'Disg',square:'Sgwâr',none:'Dim',notset:'<heb osod>',armenian:'Rhifau Armeneg',georgian:'Rhifau Sioraidd (an, ban, gan, ayyb.)',lowerRoman:'Rhufeinig Is (i, ii, iii, iv, v, ayyb.)',upperRoman:'Rhufeinig Uwch (I, II, III, IV, V, ayyb.)',lowerAlpha:'Alffa Is (a, b, c, d, e, ayyb.)',upperAlpha:'Alffa Uwch (A, B, C, D, E, ayyb.)',lowerGreek:'Groeg Is (alpha, beta, gamma, ayyb.)',decimal:'Degol (1, 2, 3, ayyb.)',decimalLeadingZero:'Degol â sero arweiniol (01, 02, 03, ayyb.)'},findAndReplace:{title:'Chwilio ac Amnewid',find:'Chwilio',replace:'Amnewid',findWhat:"Chwilio'r term:",replaceWith:'Amnewid gyda:',notFoundMsg:"Nid oedd y testun wedi'i ddarganfod.",findOptions:'Chwilio Opsiynau',matchCase:"Cyfateb i'r cas",matchWord:'Cyfateb gair cyfan',matchCyclic:'Cyfateb cylchol',replaceAll:'Amnewid pob un',replaceSuccessMsg:'Amnewidiwyd %1 achlysur.'},table:{toolbar:'Tabl',title:'Nodweddion Tabl',menu:'Nodweddion Tabl',deleteTable:'Dileu Tabl',rows:'Rhesi',columns:'Colofnau',border:'Maint yr Ymyl',widthPx:'picsel',widthPc:'y cant',widthUnit:'uned lled',cellSpace:"Bylchu'r gell",cellPad:"Padio'r gell",caption:'Pennawd',summary:'Crynodeb',headers:'Penynnau',headersNone:'Dim',headersColumn:'Colofn gyntaf',headersRow:'Rhes gyntaf',headersBoth:'Y Ddau',invalidRows:"Mae'n rhaid cael o leiaf un rhes.",invalidCols:"Mae'n rhaid cael o leiaf un golofn.",invalidBorder:"Mae'n rhaid i faint yr ymyl fod yn rhif.",invalidWidth:"Mae'n rhaid i led y tabl fod yn rhif.",invalidHeight:"Mae'n rhaid i uchder y tabl fod yn rhif.",invalidCellSpacing:"Mae'n rhaid i fylchiad y gell fod yn rhif positif.",invalidCellPadding:"Mae'n rhaid i badiad y gell fod yn rhif positif.",cell:{menu:'Cell',insertBefore:'Mewnosod Cell Cyn',insertAfter:'Mewnosod Cell Ar Ôl',deleteCell:'Dileu Celloedd',merge:'Cyfuno Celloedd',mergeRight:"Cyfuno i'r Dde",mergeDown:'Cyfuno i Lawr',splitHorizontal:"Hollti'r Gell yn Lorweddol",splitVertical:"Hollti'r Gell yn Fertigol",title:"Priodweddau'r Gell",cellType:'Math y Gell',rowSpan:'Rhychwant Rhesi',colSpan:'Rhychwant Colofnau',wordWrap:'Lapio Geiriau',hAlign:'Aliniad Llorweddol',vAlign:'Aliniad Fertigol',alignBaseline:'Baslinell',bgColor:'Lliw Cefndir',borderColor:'Lliw Ymyl',data:'Data',header:'Pennyn',yes:'Ie',no:'Na',invalidWidth:"Mae'n rhaid i led y gell fod yn rhif.",invalidHeight:"Mae'n rhaid i uchder y gell fod yn rhif.",invalidRowSpan:"Mae'n rhaid i rychwant y rhesi fod yn gyfanrif.",invalidColSpan:"Mae'n rhaid i rychwant y colofnau fod yn gyfanrif.",chooseColor:'Choose'},row:{menu:'Rhes',insertBefore:'Mewnosod Rhes Cyn',insertAfter:'Mewnosod Rhes Ar Ôl',deleteRow:'Dileu Rhesi'},column:{menu:'Colofn',insertBefore:'Mewnosod Colofn Cyn',insertAfter:'Mewnosod Colofn Ar Ôl',deleteColumn:'Dileu Colofnau'}},button:{title:'Priodweddau Botymau',text:'Testun (Gwerth)',type:'Math',typeBtn:'Botwm',typeSbm:'Gyrru',typeRst:'Ailosod'},checkboxAndRadio:{checkboxTitle:'Priodweddau Blwch Ticio',radioTitle:'Priodweddau Botwm Radio',value:'Gwerth',selected:'Dewiswyd'},form:{title:'Priodweddau Ffurflen',menu:'Priodweddau Ffurflen',action:'Gweithred',method:'Dull',encoding:'Amgodio'},select:{title:'Priodweddau Maes Dewis',selectInfo:'Gwyb Dewis',opAvail:'Opsiynau ar Gael',value:'Gwerth',size:'Maint',lines:'llinellau',chkMulti:'Caniatàu aml-ddewisiadau',opText:'Testun',opValue:'Gwerth',btnAdd:'Ychwanegu',btnModify:'Newid',btnUp:'Lan',btnDown:'Lawr',btnSetValue:'Gosod fel gwerth a ddewiswyd',btnDelete:'Dileu'},textarea:{title:'Priodweddau Ardal Testun',cols:'Colofnau',rows:'Rhesi'},textfield:{title:'Priodweddau Maes Testun',name:'Enw',value:'Gwerth',charWidth:'Lled Nod',maxChars:'Uchafswm y Nodau',type:'Math',typeText:'Testun',typePass:'Cyfrinair'},hidden:{title:'Priodweddau Maes Cudd',name:'Enw',value:'Gwerth'},image:{title:'Priodweddau Delwedd',titleButton:'Priodweddau Botwm Delwedd',menu:'Priodweddau Delwedd',infoTab:'Gwyb Delwedd',btnUpload:"Anfon i'r Gweinydd",upload:'lanlwytho',alt:'Testun Amgen',lockRatio:'Cloi Cymhareb',resetSize:'Ailosod Maint',border:'Ymyl',hSpace:'BwlchLl',vSpace:'BwlchF',alertUrl:'Rhowch URL y ddelwedd',linkTab:'Dolen',button2Img:"Ydych am drawsffurfio'r botwm ddelwedd hwn ar ddelwedd syml?",img2Button:"Ydych am drawsffurfio'r ddelwedd hon ar fotwm delwedd?",urlMissing:'URL gwreiddiol y ddelwedd ar goll.',validateBorder:"Rhaid i'r ymyl fod yn gyfanrif.",validateHSpace:"Rhaid i'r HSpace fod yn gyfanrif.",validateVSpace:"Rhaid i'r VSpace fod yn gyfanrif."},flash:{properties:'Priodweddau Flash',propertiesTab:'Priodweddau',title:'Priodweddau Flash',chkPlay:'AwtoChwarae',chkLoop:'Lwpio',chkMenu:'Galluogi Dewislen Flash',chkFull:'Caniatàu Sgrin Llawn',scale:'Graddfa',scaleAll:'Dangos pob',scaleNoBorder:'Dim Ymyl',scaleFit:'Ffit Union',access:'Mynediad Sgript',accessAlways:'Pob amser',accessSameDomain:"R'un parth",accessNever:'Byth',alignAbsBottom:'Gwaelod Abs',alignAbsMiddle:'Canol Abs',alignBaseline:'Baslinell',alignTextTop:'Testun Top',quality:'Ansawdd',qualityBest:'Gorau',qualityHigh:'Uchel',qualityAutoHigh:'Uchel Awto',qualityMedium:'Canolig',qualityAutoLow:'Isel Awto',qualityLow:'Isel',windowModeWindow:'Ffenestr',windowModeOpaque:'Afloyw',windowModeTransparent:'Tryloyw',windowMode:'Modd ffenestr',flashvars:'Newidynnau ar gyfer Flash',bgcolor:'Lliw cefndir',hSpace:'BwlchLl',vSpace:'BwlchF',validateSrc:'Ni all yr URL fod yn wag.',validateHSpace:"Rhaid i'r BwlchLl fod yn rhif.",validateVSpace:"Rhaid i'r BwlchF fod yn rhif."},spellCheck:{toolbar:'Gwirio Sillafu',title:'Gwirio Sillafu',notAvailable:"Nid yw'r gwasanaeth hwn ar gael yn bresennol.",errorLoading:'Error loading application service host: %s.',notInDic:"Nid i'w gael yn y geiriadur",changeTo:'Newid i',btnIgnore:'Anwybyddu Un',btnIgnoreAll:'Anwybyddu Pob',btnReplace:'Amnewid Un',btnReplaceAll:'Amnewid Pob',btnUndo:'Dadwneud',noSuggestions:'- Dim awgrymiadau -',progress:'Gwirio sillafu yn ar y gweill...',noMispell:'Gwirio sillafu wedi gorffen: Dim camsillaf.',noChanges:'Gwirio sillafu wedi gorffen: Dim newidiadau',oneChange:'Gwirio sillafu wedi gorffen: Newidiwyd 1 gair',manyChanges:'Gwirio sillafu wedi gorffen: Newidiwyd %1 gair',ieSpellDownload:'Gwirydd sillafu heb ei arsefydlu. A ydych am ei lawrlwytho nawr?'},smiley:{toolbar:'Gwenoglun',title:'Mewnosod Gwenoglun',options:'Opsiynau Gwenogluniau'},elementsPath:{eleLabel:'Llwybr elfennau',eleTitle:'Elfen %1'},numberedlist:'Mewnosod/Tynnu Rhestr Rhifol',bulletedlist:'Mewnosod/Tynnu Rhestr Bwled',indent:"Cynyddu'r Mewnoliad",outdent:"Lleihau'r Mewnoliad",justify:{left:"Alinio i'r Chwith",center:"Alinio i'r Canol",right:"Alinio i'r Dde",block:'Aliniad Bloc'},blockquote:'Dyfyniad bloc',clipboard:{title:'Gludo',cutError:"Nid yw gosodiadau diogelwch eich porwr yn caniatàu'r golygydd i gynnal 'gweithredoedd torri' yn awtomatig. Defnyddiwch y bysellfwrdd (Ctrl/Cmd+X).",copyError:"Nid yw gosodiadau diogelwch eich porwr yn caniatàu'r golygydd i gynnal 'gweithredoedd copïo' yn awtomatig. Defnyddiwch y bysellfwrdd (Ctrl/Cmd+C).",pasteMsg:"Gludwch i mewn i'r blwch canlynol gan ddefnyddio'r bysellfwrdd (<strong>Ctrl/Cmd+V</strong>) a phwyso <strong>Iawn</strong>.",securityMsg:"Oherwydd gosodiadau diogelwch eich porwr, nid yw'r porwr yn gallu ennill mynediad i'r data ar y clipfwrdd yn uniongyrchol. Mae angen i chi ei ludo eto i'r ffenestr hon.",pasteArea:'Ardal Gludo'},pastefromword:{confirmCleanup:"Mae'r testun rydych chi am ludo wedi'i gopïo o Word. Ydych chi am ei lanhau cyn ei ludo?",toolbar:'Gludo o Word',title:'Gludo o Word',error:'Doedd dim modd glanhau y data a ludwyd oherwydd gwall mewnol'},pasteText:{button:'Gludo fel testun plaen',title:'Gludo fel Testun Plaen'},templates:{button:'Templedi',title:'Templedi Cynnwys',options:'Opsiynau Templedi',insertOption:'Amnewid y cynnwys go iawn',selectPromptMsg:"Dewiswch dempled i'w agor yn y golygydd",emptyListMsg:"(Dim templedi wedi'u diffinio)"},showBlocks:'Dangos Blociau',stylesCombo:{label:'Arddulliau',panelTitle:'Arddulliau Fformatio',panelTitle1:'Arddulliau Bloc',panelTitle2:'Arddulliau Mewnol',panelTitle3:'Arddulliau Gwrthrych'},format:{label:'Fformat',panelTitle:'Fformat Paragraff',tag_p:'Normal',tag_pre:"Wedi'i Fformatio",tag_address:'Cyfeiriad',tag_h1:'Pennawd 1',tag_h2:'Pennawd 2',tag_h3:'Pennawd 3',tag_h4:'Pennawd 4',tag_h5:'Pennawd 5',tag_h6:'Pennawd 6',tag_div:'Normal (DIV)'},div:{title:'Creu Cynhwysydd Div',toolbar:'Creu Cynhwysydd Div',cssClassInputLabel:'Dosbarthiadau Ffeil Ddiwyg',styleSelectLabel:'Arddull',IdInputLabel:'Id',languageCodeInputLabel:' Cod Iaith',inlineStyleInputLabel:'Arddull Mewn Llinell',advisoryTitleInputLabel:'Teitl Cynghorol',langDirLabel:'Cyfeiriad yr Iaith',langDirLTRLabel:"Chwith i'r Dde (LTR)",langDirRTLLabel:"Dde i'r Chwith (RTL)",edit:'Golygu Div',remove:'Tynnu Div'},iframe:{title:'Priodweddau IFrame',toolbar:'IFrame',noUrl:'Rhowch fath URL yr iframe',scrolling:'Galluogi bariau sgrolio',border:'Dangos ymyl y ffrâm'},font:{label:'Ffont',voiceLabel:'Ffont',panelTitle:"Enw'r Ffont"},fontSize:{label:'Maint',voiceLabel:'Maint y Ffont',panelTitle:'Maint y Ffont'},colorButton:{textColorTitle:'Lliw Testun',bgColorTitle:'Lliw Cefndir',panelTitle:'Lliwiau',auto:'Awtomatig',more:'Mwy o Liwiau...'},colors:{'000':'Du',800000:'Marwn','8B4513':'Brown Cyfrwy','2F4F4F':'Llechen Tywyll','008080':'Corhwyad','000080':'Nefi','4B0082':'Indigo',696969:'Llwyd Pwl',B22222:'Bric Tân',A52A2A:'Brown',DAA520:'Rhoden Aur','006400':'Gwyrdd Tywyll','40E0D0':'Gwyrddlas','0000CD':'Glas Canolig',800080:'Porffor',808080:'Llwyd',F00:'Coch',FF8C00:'Oren Tywyll',FFD700:'Aur','008000':'Gwyrdd','0FF':'Cyan','00F':'Glas',EE82EE:'Fioled',A9A9A9:'Llwyd Tywyll',FFA07A:'Samwn Golau',FFA500:'Oren',FFFF00:'Melyn','00FF00':'Leim',AFEEEE:'Gwyrddlas Golau',ADD8E6:'Glas Golau',DDA0DD:'Eirinen',D3D3D3:'Llwyd Golau',FFF0F5:'Gwrid Lafant',FAEBD7:'Gwyn Hynafol',FFFFE0:'Melyn Golau',F0FFF0:'Melwn Gwyrdd Golau',F0FFFF:'Aswr',F0F8FF:'Glas Alys',E6E6FA:'Lafant',FFF:'Gwyn'},scayt:{title:"Gwirio'r Sillafu Wrth Deipio",opera_title:'Heb ei gynnal gan Opera',enable:'Galluogi SCAYT',disable:'Analluogi SCAYT',about:'Ynghylch SCAYT',toggle:'Togl SCAYT',options:'Opsiynau',langs:'Ieithoedd',moreSuggestions:'Awgrymiadau pellach',ignore:'Anwybyddu',ignoreAll:'Anwybyddu pob',addWord:'Ychwanegu Gair',emptyDic:"Ni ddylai enw'r geiriadur fod yn wag.",optionsTab:'Opsiynau',allCaps:'Anwybyddu Geiriau Nodau Uwch i Gyd',ignoreDomainNames:'Anwybyddu Enwau Parth',mixedCase:'Anwybyddu Geiriau â Chymysgedd Nodau Uwch ac Is',mixedWithDigits:'Anwybyddu Geiriau â Rhifau',languagesTab:'Ieithoedd',dictionariesTab:'Geiriaduron',dic_field_name:"Enw'r geiriadur",dic_create:'Creu',dic_restore:'Adfer',dic_delete:'Dileu',dic_rename:'Ailenwi',dic_info:"Ar y cychwyn, caiff y Geiriadur ei storio mewn Cwci. Er, mae terfyn ar faint cwcis. Pan fydd Gweiriadur Defnyddiwr yn tyfu tu hwnt i gyfyngiadau maint Cwci, caiff y geiriadur ei storio ar ein gweinydd ni. er mwyn storio eich geiriadur poersonol chi ar ein gweinydd, bydd angen i chi osod enw ar gyfer y geiriadur. Os oes geiriadur 'da chi ar ein gweinydd yn barod, teipiwch ei enw a chliciwch y botwm Adfer.",aboutTab:'Ynghylch'},about:{title:'Ynghylch CKEditor',dlgTitle:'Ynghylch CKEditor',help:'Gwirio $1 am gymorth.',userGuide:'Canllawiau Defnyddiwr CKEditor',moreInfo:"Am wybodaeth ynghylch trwyddedau, ewch i'n gwefan:",copy:'Hawlfraint © $1. Cedwir pob hawl.'},maximize:'Mwyhau',minimize:'Lleihau',fakeobjects:{anchor:'Angor',flash:'Animeiddiant Flash',iframe:'IFrame',hiddenfield:'Maes Cudd',unknown:'Gwrthrych Anhysbys'},resize:'Llusgo i ailfeintio',colordialog:{title:'Dewis lliw',options:'Opsiynau Lliw',highlight:'Uwcholeuo',selected:'Dewiswyd',clear:'Clirio'},toolbarCollapse:"Cyfangu'r Bar Offer",toolbarExpand:"Ehangu'r Bar Offer",toolbarGroups:{document:'Dogfen',clipboard:'Clipfwrdd/Dadwneud',editing:'Golygu',forms:'Ffurflenni',basicstyles:'Arddulliau Sylfaenol',paragraph:'Paragraff',links:'Dolenni',insert:'Mewnosod',styles:'Arddulliau',colors:'Lliwiau',tools:'Offer'},bidi:{ltr:"Cyfeiriad testun o'r chwith i'r dde",rtl:"Cyfeiriad testun o'r dde i'r chwith"},docprops:{label:'Priodweddau Dogfen',title:'Priodweddau Dogfen',design:'Cynllunio',meta:'Tagiau Meta',chooseColor:'Dewis',other:'Arall...',docTitle:'Teitl y Dudalen',charset:'Amgodio Set Nodau',charsetOther:'Amgodio Set Nodau Arall',charsetASCII:'ASCII',charsetCE:'Ewropeaidd Canol',charsetCT:'Tsieinëeg Traddodiadol (Big5)',charsetCR:'Syrilig',charsetGR:'Groeg',charsetJP:'Siapanëeg',charsetKR:'Corëeg',charsetTR:'Tyrceg',charsetUN:'Unicode (UTF-8)',charsetWE:'Ewropeaidd Gorllewinol',docType:'Pennawd Math y Ddogfen',docTypeOther:'Pennawd Math y Ddogfen Arall',xhtmlDec:'Cynnwys Datganiadau XHTML',bgColor:'Lliw Cefndir',bgImage:'URL Delwedd Cefndir',bgFixed:'Cefndir Sefydlog (Ddim yn Sgrolio)',txtColor:'Lliw y Testun',margin:'Ffin y Dudalen',marginTop:'Brig',marginLeft:'Chwith',marginRight:'Dde',marginBottom:'Gwaelod',metaKeywords:'Allweddeiriau Indecsio Dogfen (gwahanu gyda choma)',metaDescription:'Disgrifiad y Ddogfen',metaAuthor:'Awdur',metaCopyright:'Hawlfraint',previewHtml:'<p>Dyma ychydig o <strong>destun sampl</strong>. Rydych chi\'n defnyddio <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/da.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/da.js
index 819da50..0e676e4 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/da.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/da.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.da={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editors værktøjslinjer',editor:'Rich Text Editor',source:'Kilde',newPage:'Ny side',save:'Gem',preview:'Vis eksempel',cut:'Klip',copy:'Kopiér',paste:'Indsæt',print:'Udskriv',underline:'Understreget',bold:'Fed',italic:'Kursiv',selectAll:'Vælg alt',removeFormat:'Fjern formatering',strike:'Gennemstreget',subscript:'Sænket skrift',superscript:'Hævet skrift',horizontalrule:'Indsæt vandret streg',pagebreak:'Indsæt sideskift',pagebreakAlt:'Sideskift',unlink:'Fjern hyperlink',undo:'Fortryd',redo:'Annullér fortryd',common:{browseServer:'Gennemse...',url:'URL',protocol:'Protokol',upload:'Upload',uploadSubmit:'Upload',image:'Indsæt billede',flash:'Indsæt Flash',form:'Indsæt formular',checkbox:'Indsæt afkrydsningsfelt',radio:'Indsæt alternativknap',textField:'Indsæt tekstfelt',textarea:'Indsæt tekstboks',hiddenField:'Indsæt skjult felt',button:'Indsæt knap',select:'Indsæt liste',imageButton:'Indsæt billedknap',notSet:'<intet valgt>',id:'Id',name:'Navn',langDir:'Tekstretning',langDirLtr:'Fra venstre mod højre (LTR)',langDirRtl:'Fra højre mod venstre (RTL)',langCode:'Sprogkode',longDescr:'Udvidet beskrivelse',cssClass:'Typografiark (CSS)',advisoryTitle:'Titel',cssStyle:'Typografi (CSS)',ok:'OK',cancel:'Annullér',close:'Luk',preview:'Forhåndsvisning',generalTab:'Generelt',advancedTab:'Avanceret',validateNumberFailed:'Værdien er ikke et tal.',confirmNewPage:'Alt indhold, der ikke er blevet gemt, vil gå tabt. Er du sikker på, at du vil indlæse en ny side?',confirmCancel:'Nogle af indstillingerne er blevet ændret. Er du sikker på, at du vil lukke vinduet?',options:'Vis muligheder',target:'Mål',targetNew:'Nyt vindue (_blank)',targetTop:'Øverste vindue (_top)',targetSelf:'Samme vindue (_self)',targetParent:'Samme vindue (_parent)',langDirLTR:'Venstre til højre (LTR)',langDirRTL:'Højre til venstre (RTL)',styles:'Style',cssClasses:'Stylesheetklasser',width:'Bredde',height:'Højde',align:'Justering',alignLeft:'Venstre',alignRight:'Højre',alignCenter:'Centreret',alignTop:'Øverst',alignMiddle:'Centreret',alignBottom:'Nederst',invalidHeight:'Højde skal være et tal.',invalidWidth:'Bredde skal være et tal.',invalidCssLength:'Værdien specificeret for "%1" feltet skal være et positivt nummer med eller uden en CSS måleenhed (px, %, in, cm, mm, em, ex, pt, eller pc).',invalidHtmlLength:'Værdien specificeret for "%1" feltet skal være et positivt nummer med eller uden en CSS måleenhed (px eller %).',invalidInlineStyle:'Værdien specificeret for inline style skal indeholde en eller flere elementer med et format som "name:value", separeret af semikoloner',cssLengthTooltip:'Indsæt en numerisk værdi i pixel eller nummer med en gyldig CSS værdi (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, ikke tilgængelig</span>'},contextmenu:{options:'Muligheder for hjælpemenu'},specialChar:{toolbar:'Indsæt symbol',title:'Vælg symbol',options:'Muligheder for specialkarakterer'},link:{toolbar:'Indsæt/redigér hyperlink',other:'<anden>',menu:'Redigér hyperlink',title:'Egenskaber for hyperlink',info:'Generelt',target:'Mål',upload:'Upload',advanced:'Avanceret',type:'Type',toUrl:'URL',toAnchor:'Bogmærke på denne side',toEmail:'E-mail',targetFrame:'<ramme>',targetPopup:'<popup vindue>',targetFrameName:'Destinationsvinduets navn',targetPopupName:'Popupvinduets navn',popupFeatures:'Egenskaber for popup',popupResizable:'Justérbar',popupStatusBar:'Statuslinje',popupLocationBar:'Adresselinje',popupToolbar:'Værktøjslinje',popupMenuBar:'Menulinje',popupFullScreen:'Fuld skærm (IE)',popupScrollBars:'Scrollbar',popupDependent:'Koblet/dependent (Netscape)',popupLeft:'Position fra venstre',popupTop:'Position fra toppen',id:'Id',langDir:'Tekstretning',langDirLTR:'Fra venstre mod højre (LTR)',langDirRTL:'Fra højre mod venstre (RTL)',acccessKey:'Genvejstast',name:'Navn',langCode:'Tekstretning',tabIndex:'Tabulatorindeks',advisoryTitle:'Titel',advisoryContentType:'Indholdstype',cssClasses:'Typografiark',charset:'Tegnsæt',styles:'Typografi',rel:'Relation',selectAnchor:'Vælg et anker',anchorName:'Efter ankernavn',anchorId:'Efter element-Id',emailAddress:'E-mailadresse',emailSubject:'Emne',emailBody:'Besked',noAnchors:'(Ingen bogmærker i dokumentet)',noUrl:'Indtast hyperlink-URL!',noEmail:'Indtast e-mailadresse!'},anchor:{toolbar:'Indsæt/redigér bogmærke',menu:'Egenskaber for bogmærke',title:'Egenskaber for bogmærke',name:'Bogmærkenavn',errorName:'Indtast bogmærkenavn',remove:'Fjern bogmærke'},list:{numberedTitle:'Egenskaber for nummereret liste',bulletedTitle:'Værdier for cirkelpunktopstilling',type:'Type',start:'Start',validateStartNumber:'Den nummererede liste skal starte med et rundt nummer',circle:'Cirkel',disc:'Værdier for diskpunktopstilling',square:'Firkant',none:'Ingen',notset:'<ikke defineret>',armenian:'Armensk nummering',georgian:'Georgiansk nummering (an, ban, gan, etc.)',lowerRoman:'Små romerske (i, ii, iii, iv, v, etc.)',upperRoman:'Store romerske (I, II, III, IV, V, etc.)',lowerAlpha:'Små alfabet (a, b, c, d, e, etc.)',upperAlpha:'Store alfabet (A, B, C, D, E, etc.)',lowerGreek:'Små græsk (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, osv.)',decimalLeadingZero:'Decimaler med 0 først (01, 02, 03, etc.)'},findAndReplace:{title:'Søg og erstat',find:'Søg',replace:'Erstat',findWhat:'Søg efter:',replaceWith:'Erstat med:',notFoundMsg:'Søgeteksten blev ikke fundet',findOptions:'Find muligheder',matchCase:'Forskel på store og små bogstaver',matchWord:'Kun hele ord',matchCyclic:'Match cyklisk',replaceAll:'Erstat alle',replaceSuccessMsg:'%1 forekomst(er) erstattet.'},table:{toolbar:'Tabel',title:'Egenskaber for tabel',menu:'Egenskaber for tabel',deleteTable:'Slet tabel',rows:'Rækker',columns:'Kolonner',border:'Rammebredde',widthPx:'pixels',widthPc:'procent',widthUnit:'Bredde på enhed',cellSpace:'Celleafstand',cellPad:'Cellemargen',caption:'Titel',summary:'Resumé',headers:'Hoved',headersNone:'Ingen',headersColumn:'Første kolonne',headersRow:'Første række',headersBoth:'Begge',invalidRows:'Antallet af rækker skal være større end 0.',invalidCols:'Antallet af kolonner skal være større end 0.',invalidBorder:'Rammetykkelse skal være et tal.',invalidWidth:'Tabelbredde skal være et tal.',invalidHeight:'Tabelhøjde skal være et tal.',invalidCellSpacing:'Celleafstand skal være et tal.',invalidCellPadding:'Cellemargen skal være et tal.',cell:{menu:'Celle',insertBefore:'Indsæt celle før',insertAfter:'Indsæt celle efter',deleteCell:'Slet celle',merge:'Flet celler',mergeRight:'Flet til højre',mergeDown:'Flet nedad',splitHorizontal:'Del celle vandret',splitVertical:'Del celle lodret',title:'Celleegenskaber',cellType:'Celletype',rowSpan:'Række span (rows span)',colSpan:'Kolonne span (columns span)',wordWrap:'Tekstombrydning',hAlign:'Vandret justering',vAlign:'Lodret justering',alignBaseline:'Grundlinje',bgColor:'Baggrundsfarve',borderColor:'Rammefarve',data:'Data',header:'Hoved',yes:'Ja',no:'Nej',invalidWidth:'Cellebredde skal være et tal.',invalidHeight:'Cellehøjde skal være et tal.',invalidRowSpan:'Række span skal være et heltal.',invalidColSpan:'Kolonne span skal være et heltal.',chooseColor:'Vælg'},row:{menu:'Række',insertBefore:'Indsæt række før',insertAfter:'Indsæt række efter',deleteRow:'Slet række'},column:{menu:'Kolonne',insertBefore:'Indsæt kolonne før',insertAfter:'Indsæt kolonne efter',deleteColumn:'Slet kolonne'}},button:{title:'Egenskaber for knap',text:'Tekst',type:'Type',typeBtn:'Knap',typeSbm:'Send',typeRst:'Nulstil'},checkboxAndRadio:{checkboxTitle:'Egenskaber for afkrydsningsfelt',radioTitle:'Egenskaber for alternativknap',value:'Værdi',selected:'Valgt'},form:{title:'Egenskaber for formular',menu:'Egenskaber for formular',action:'Handling',method:'Metode',encoding:'Kodning (encoding)'},select:{title:'Egenskaber for liste',selectInfo:'Generelt',opAvail:'Valgmuligheder',value:'Værdi',size:'Størrelse',lines:'Linjer',chkMulti:'Tillad flere valg',opText:'Tekst',opValue:'Værdi',btnAdd:'Tilføj',btnModify:'Redigér',btnUp:'Op',btnDown:'Ned',btnSetValue:'Sæt som valgt',btnDelete:'Slet'},textarea:{title:'Egenskaber for tekstboks',cols:'Kolonner',rows:'Rækker'},textfield:{title:'Egenskaber for tekstfelt',name:'Navn',value:'Værdi',charWidth:'Bredde (tegn)',maxChars:'Max. antal tegn',type:'Type',typeText:'Tekst',typePass:'Adgangskode'},hidden:{title:'Egenskaber for skjult felt',name:'Navn',value:'Værdi'},image:{title:'Egenskaber for billede',titleButton:'Egenskaber for billedknap',menu:'Egenskaber for billede',infoTab:'Generelt',btnUpload:'Upload fil til serveren',upload:'Upload',alt:'Alternativ tekst',lockRatio:'Lås størrelsesforhold',resetSize:'Nulstil størrelse',border:'Ramme',hSpace:'Vandret margen',vSpace:'Lodret margen',alertUrl:'Indtast stien til billedet',linkTab:'Hyperlink',button2Img:'Vil du lave billedknappen om til et almindeligt billede?',img2Button:'Vil du lave billedet om til en billedknap?',urlMissing:'Kilde på billed-URL mangler',validateBorder:'Kant skal være et helt nummer.',validateHSpace:'HSpace skal være et helt nummer.',validateVSpace:'VSpace skal være et helt nummer.'},flash:{properties:'Egenskaber for Flash',propertiesTab:'Egenskaber',title:'Egenskaber for Flash',chkPlay:'Automatisk afspilning',chkLoop:'Gentagelse',chkMenu:'Vis Flash-menu',chkFull:'Tillad fuldskærm',scale:'Skalér',scaleAll:'Vis alt',scaleNoBorder:'Ingen ramme',scaleFit:'Tilpas størrelse',access:'Scriptadgang',accessAlways:'Altid',accessSameDomain:'Samme domæne',accessNever:'Aldrig',alignAbsBottom:'Absolut nederst',alignAbsMiddle:'Absolut centreret',alignBaseline:'Grundlinje',alignTextTop:'Toppen af teksten',quality:'Kvalitet',qualityBest:'Bedste',qualityHigh:'Høj',qualityAutoHigh:'Auto høj',qualityMedium:'Medium',qualityAutoLow:'Auto lav',qualityLow:'Lav',windowModeWindow:'Vindue',windowModeOpaque:'Gennemsigtig (opaque)',windowModeTransparent:'Transparent',windowMode:'Vinduestilstand',flashvars:'Variabler for Flash',bgcolor:'Baggrundsfarve',hSpace:'Vandret margen',vSpace:'Lodret margen',validateSrc:'Indtast hyperlink URL!',validateHSpace:'Vandret margen skal være et tal.',validateVSpace:'Lodret margen skal være et tal.'},spellCheck:{toolbar:'Stavekontrol',title:'Stavekontrol',notAvailable:'Stavekontrol er desværre ikke tilgængelig.',errorLoading:'Fejl ved indlæsning af host: %s.',notInDic:'Ikke i ordbogen',changeTo:'Forslag',btnIgnore:'Ignorér',btnIgnoreAll:'Ignorér alle',btnReplace:'Erstat',btnReplaceAll:'Erstat alle',btnUndo:'Tilbage',noSuggestions:'(ingen forslag)',progress:'Stavekontrollen arbejder...',noMispell:'Stavekontrol færdig: Ingen fejl fundet',noChanges:'Stavekontrol færdig: Ingen ord ændret',oneChange:'Stavekontrol færdig: Et ord ændret',manyChanges:'Stavekontrol færdig: %1 ord ændret',ieSpellDownload:'Stavekontrol ikke installeret. Vil du installere den nu?'},smiley:{toolbar:'Smiley',title:'Vælg smiley',options:'Smileymuligheder'},elementsPath:{eleLabel:'Sti på element',eleTitle:'%1 element'},numberedlist:'Talopstilling',bulletedlist:'Punktopstilling',indent:'Forøg indrykning',outdent:'Formindsk indrykning',justify:{left:'Venstrestillet',center:'Centreret',right:'Højrestillet',block:'Lige margener'},blockquote:'Blokcitat',clipboard:{title:'Indsæt',cutError:'Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.<br><br>Brug i stedet tastaturet til at klippe teksten (Ctrl/Cmd+X).',copyError:'Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.<br><br>Brug i stedet tastaturet til at kopiere teksten (Ctrl/Cmd+C).',pasteMsg:'Indsæt i feltet herunder (<STRONG>Ctrl/Cmd+V</STRONG>) og klik på <STRONG>OK</STRONG>.',securityMsg:'Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.<br><br>Du skal indsætte udklipsholderens indhold i dette vindue igen.',pasteArea:'Indsæt område'},pastefromword:{confirmCleanup:'Den tekst du forsøger at indsætte ser ud til at komme fra Word. Vil du rense teksten før den indsættes?',toolbar:'Indsæt fra Word',title:'Indsæt fra Word',error:'Det var ikke muligt at fjerne formatteringen på den indsatte tekst grundet en intern fejl'},pasteText:{button:'Indsæt som ikke-formateret tekst',title:'Indsæt som ikke-formateret tekst'},templates:{button:'Skabeloner',title:'Indholdsskabeloner',options:'Skabelon muligheder',insertOption:'Erstat det faktiske indhold',selectPromptMsg:'Vælg den skabelon, som skal åbnes i editoren (nuværende indhold vil blive overskrevet):',emptyListMsg:'(Der er ikke defineret nogen skabelon)'},showBlocks:'Vis afsnitsmærker',stylesCombo:{label:'Typografi',panelTitle:'Formattering på stylesheet',panelTitle1:'Block typografi',panelTitle2:'Inline typografi',panelTitle3:'Object typografi'},format:{label:'Formatering',panelTitle:'Formatering',tag_p:'Normal',tag_pre:'Formateret',tag_address:'Adresse',tag_h1:'Overskrift 1',tag_h2:'Overskrift 2',tag_h3:'Overskrift 3',tag_h4:'Overskrift 4',tag_h5:'Overskrift 5',tag_h6:'Overskrift 6',tag_div:'Normal (DIV)'},div:{title:'Opret Div Container',toolbar:'Opret Div Container',cssClassInputLabel:'Typografiark',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Sprogkode',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Vejledende titel',langDirLabel:'Sprogretning',langDirLTRLabel:'Venstre til højre (LTR)',langDirRTLLabel:'Højre til venstre (RTL)',edit:'Rediger Div',remove:'Slet Div'},iframe:{title:'Iframe egenskaber',toolbar:'Iframe',noUrl:'Venligst indsæt URL på iframen',scrolling:'Aktiver scrollbars',border:'Vis kant på rammen'},font:{label:'Skrifttype',voiceLabel:'Skrifttype',panelTitle:'Skrifttype'},fontSize:{label:'Skriftstørrelse',voiceLabel:'Skriftstørrelse',panelTitle:'Skriftstørrelse'},colorButton:{textColorTitle:'Tekstfarve',bgColorTitle:'Baggrundsfarve',panelTitle:'Farver',auto:'Automatisk',more:'Flere farver...'},colors:{'000':'Sort',800000:'Mørkerød','8B4513':'Mørk orange','2F4F4F':'Dark Slate Grå','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Mørkegrå',B22222:'Scarlet / Rød',A52A2A:'Brun',DAA520:'Guld','006400':'Mørkegrøn','40E0D0':'Tyrkis','0000CD':'Mellemblå',800080:'Lilla',808080:'Grå',F00:'Rød',FF8C00:'Mørk orange',FFD700:'Guld','008000':'Grøn','0FF':'Cyan','00F':'Blå',EE82EE:'Violet',A9A9A9:'Matgrå',FFA07A:'Laksefarve',FFA500:'Orange',FFFF00:'Gul','00FF00':'Lime',AFEEEE:'Mat tyrkis',ADD8E6:'Lyseblå',DDA0DD:'Plum',D3D3D3:'Lysegrå',FFF0F5:'Lavender Blush',FAEBD7:'Antikhvid',FFFFE0:'Lysegul',F0FFF0:'Gul / Beige',F0FFFF:'Himmeblå',F0F8FF:'Alice blue',E6E6FA:'Lavendel',FFF:'Hvid'},scayt:{title:'Stavekontrol mens du skriver',opera_title:'Ikke supporteret af Opera',enable:'Aktivér SCAYT',disable:'Deaktivér SCAYT',about:'Om SCAYT',toggle:'Skift/toggle SCAYT',options:'Indstillinger',langs:'Sprog',moreSuggestions:'Flere forslag',ignore:'Ignorér',ignoreAll:'Ignorér alle',addWord:'Tilføj ord',emptyDic:'Ordbogsnavn må ikke være tom.',optionsTab:'Indstillinger',allCaps:'Ignorer alle store bogstaver',ignoreDomainNames:'Ignorér domænenavne',mixedCase:'Ignorer ord med store og små bogstaver',mixedWithDigits:'Ignorér ord med numre',languagesTab:'Sprog',dictionariesTab:'Ordbøger',dic_field_name:'Navn på ordbog',dic_create:'Opret',dic_restore:'Gendan',dic_delete:'Slet',dic_rename:'Omdøb',dic_info:'Til start er brugerordbogen gemt i en Cookie. Dog har Cookies en begrænsning på størrelse. Når ordbogen når en bestemt størrelse kan den blive gemt på vores server. For at gemme din personlige ordbog på vores server skal du angive et navn for denne. Såfremt du allerede har gemt en ordbog, skriv navnet på denne og klik på Gendan knappen.',aboutTab:'Om'},about:{title:'Om CKEditor',dlgTitle:'Om CKEditor',help:'Se $1 for at få hjælp.',userGuide:'CKEditor-brugermanual',moreInfo:'For informationer omkring licens, se venligst vores hjemmeside (på engelsk):',copy:'Copyright © $1. Alle rettigheder forbeholdes.'},maximize:'Maksimér',minimize:'Minimér',fakeobjects:{anchor:'Anker',flash:'Flashanimation',iframe:'Iframe',hiddenfield:'Skjult felt',unknown:'Ukendt objekt'},resize:'Træk for at skalere',colordialog:{title:'Vælg farve',options:'Farvemuligheder',highlight:'Markér',selected:'Valgt farve',clear:'Nulstil'},toolbarCollapse:'Sammenklap værktøjslinje',toolbarExpand:'Udvid værktøjslinje',toolbarGroups:{document:'Dokument',clipboard:'Udklipsholder/Fortryd',editing:'Redigering',forms:'Formularer',basicstyles:'Basis styles',paragraph:'Paragraf',links:'Links',insert:'Indsæt',styles:'Typografier',colors:'Farver',tools:'Værktøjer'},bidi:{ltr:'Tekstretning fra venstre til højre',rtl:'Tekstretning fra højre til venstre'},docprops:{label:'Egenskaber for dokument',title:'Egenskaber for dokument',design:'Design',meta:'Metatags',chooseColor:'Vælg',other:'<anden>',docTitle:'Sidetitel',charset:'Tegnsætskode',charsetOther:'Anden tegnsætskode',charsetASCII:'ASCII',charsetCE:'Centraleuropæisk',charsetCT:'Traditionel kinesisk (Big5)',charsetCR:'Kyrillisk',charsetGR:'Græsk',charsetJP:'Japansk',charsetKR:'Koreansk',charsetTR:'Tyrkisk',charsetUN:'Unicode (UTF-8)',charsetWE:'Vesteuropæisk',docType:'Dokumenttype kategori',docTypeOther:'Anden dokumenttype kategori',xhtmlDec:'Inkludere XHTML deklartion',bgColor:'Baggrundsfarve',bgImage:'Baggrundsbillede URL',bgFixed:'Fastlåst baggrund',txtColor:'Tekstfarve',margin:'Sidemargen',marginTop:'Øverst',marginLeft:'Venstre',marginRight:'Højre',marginBottom:'Nederst',metaKeywords:'Dokument index nøgleord (kommasepareret)',metaDescription:'Dokumentbeskrivelse',metaAuthor:'Forfatter',metaCopyright:'Copyright',previewHtml:'<p>Dette er et <strong>eksempel på noget tekst</strong>. Du benytter <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.da={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editors værktøjslinjer',editor:'Rich Text Editor',source:'Kilde',newPage:'Ny side',save:'Gem',preview:'Vis eksempel',cut:'Klip',copy:'Kopiér',paste:'Indsæt',print:'Udskriv',underline:'Understreget',bold:'Fed',italic:'Kursiv',selectAll:'Vælg alt',removeFormat:'Fjern formatering',strike:'Gennemstreget',subscript:'Sænket skrift',superscript:'Hævet skrift',horizontalrule:'Indsæt vandret streg',pagebreak:'Indsæt sideskift',pagebreakAlt:'Sideskift',unlink:'Fjern hyperlink',undo:'Fortryd',redo:'Annullér fortryd',common:{browseServer:'Gennemse...',url:'URL',protocol:'Protokol',upload:'Upload',uploadSubmit:'Upload',image:'Indsæt billede',flash:'Indsæt Flash',form:'Indsæt formular',checkbox:'Indsæt afkrydsningsfelt',radio:'Indsæt alternativknap',textField:'Indsæt tekstfelt',textarea:'Indsæt tekstboks',hiddenField:'Indsæt skjult felt',button:'Indsæt knap',select:'Indsæt liste',imageButton:'Indsæt billedknap',notSet:'<intet valgt>',id:'Id',name:'Navn',langDir:'Tekstretning',langDirLtr:'Fra venstre mod højre (LTR)',langDirRtl:'Fra højre mod venstre (RTL)',langCode:'Sprogkode',longDescr:'Udvidet beskrivelse',cssClass:'Typografiark (CSS)',advisoryTitle:'Titel',cssStyle:'Typografi (CSS)',ok:'OK',cancel:'Annullér',close:'Luk',preview:'Forhåndsvisning',generalTab:'Generelt',advancedTab:'Avanceret',validateNumberFailed:'Værdien er ikke et tal.',confirmNewPage:'Alt indhold, der ikke er blevet gemt, vil gå tabt. Er du sikker på, at du vil indlæse en ny side?',confirmCancel:'Nogle af indstillingerne er blevet ændret. Er du sikker på, at du vil lukke vinduet?',options:'Vis muligheder',target:'Mål',targetNew:'Nyt vindue (_blank)',targetTop:'Øverste vindue (_top)',targetSelf:'Samme vindue (_self)',targetParent:'Samme vindue (_parent)',langDirLTR:'Venstre til højre (LTR)',langDirRTL:'Højre til venstre (RTL)',styles:'Style',cssClasses:'Stylesheetklasser',width:'Bredde',height:'Højde',align:'Justering',alignLeft:'Venstre',alignRight:'Højre',alignCenter:'Centreret',alignTop:'Øverst',alignMiddle:'Centreret',alignBottom:'Nederst',invalidHeight:'Højde skal være et tal.',invalidWidth:'Bredde skal være et tal.',invalidCssLength:'Værdien specificeret for "%1" feltet skal være et positivt nummer med eller uden en CSS måleenhed (px, %, in, cm, mm, em, ex, pt, eller pc).',invalidHtmlLength:'Værdien specificeret for "%1" feltet skal være et positivt nummer med eller uden en CSS måleenhed (px eller %).',invalidInlineStyle:'Værdien specificeret for inline style skal indeholde en eller flere elementer med et format som "name:value", separeret af semikoloner',cssLengthTooltip:'Indsæt en numerisk værdi i pixel eller nummer med en gyldig CSS værdi (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, ikke tilgængelig</span>'},contextmenu:{options:'Muligheder for hjælpemenu'},specialChar:{toolbar:'Indsæt symbol',title:'Vælg symbol',options:'Muligheder for specialkarakterer'},link:{toolbar:'Indsæt/redigér hyperlink',other:'<anden>',menu:'Redigér hyperlink',title:'Egenskaber for hyperlink',info:'Generelt',target:'Mål',upload:'Upload',advanced:'Avanceret',type:'Type',toUrl:'URL',toAnchor:'Bogmærke på denne side',toEmail:'E-mail',targetFrame:'<ramme>',targetPopup:'<popup vindue>',targetFrameName:'Destinationsvinduets navn',targetPopupName:'Popupvinduets navn',popupFeatures:'Egenskaber for popup',popupResizable:'Justérbar',popupStatusBar:'Statuslinje',popupLocationBar:'Adresselinje',popupToolbar:'Værktøjslinje',popupMenuBar:'Menulinje',popupFullScreen:'Fuld skærm (IE)',popupScrollBars:'Scrollbar',popupDependent:'Koblet/dependent (Netscape)',popupLeft:'Position fra venstre',popupTop:'Position fra toppen',id:'Id',langDir:'Tekstretning',langDirLTR:'Fra venstre mod højre (LTR)',langDirRTL:'Fra højre mod venstre (RTL)',acccessKey:'Genvejstast',name:'Navn',langCode:'Tekstretning',tabIndex:'Tabulatorindeks',advisoryTitle:'Titel',advisoryContentType:'Indholdstype',cssClasses:'Typografiark',charset:'Tegnsæt',styles:'Typografi',rel:'Relation',selectAnchor:'Vælg et anker',anchorName:'Efter ankernavn',anchorId:'Efter element-Id',emailAddress:'E-mailadresse',emailSubject:'Emne',emailBody:'Besked',noAnchors:'(Ingen bogmærker i dokumentet)',noUrl:'Indtast hyperlink-URL!',noEmail:'Indtast e-mailadresse!'},anchor:{toolbar:'Indsæt/redigér bogmærke',menu:'Egenskaber for bogmærke',title:'Egenskaber for bogmærke',name:'Bogmærkenavn',errorName:'Indtast bogmærkenavn',remove:'Fjern bogmærke'},list:{numberedTitle:'Egenskaber for nummereret liste',bulletedTitle:'Værdier for cirkelpunktopstilling',type:'Type',start:'Start',validateStartNumber:'Den nummererede liste skal starte med et rundt nummer',circle:'Cirkel',disc:'Værdier for diskpunktopstilling',square:'Firkant',none:'Ingen',notset:'<ikke defineret>',armenian:'Armensk nummering',georgian:'Georgiansk nummering (an, ban, gan, etc.)',lowerRoman:'Små romerske (i, ii, iii, iv, v, etc.)',upperRoman:'Store romerske (I, II, III, IV, V, etc.)',lowerAlpha:'Små alfabet (a, b, c, d, e, etc.)',upperAlpha:'Store alfabet (A, B, C, D, E, etc.)',lowerGreek:'Små græsk (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, osv.)',decimalLeadingZero:'Decimaler med 0 først (01, 02, 03, etc.)'},findAndReplace:{title:'Søg og erstat',find:'Søg',replace:'Erstat',findWhat:'Søg efter:',replaceWith:'Erstat med:',notFoundMsg:'Søgeteksten blev ikke fundet',findOptions:'Find muligheder',matchCase:'Forskel på store og små bogstaver',matchWord:'Kun hele ord',matchCyclic:'Match cyklisk',replaceAll:'Erstat alle',replaceSuccessMsg:'%1 forekomst(er) erstattet.'},table:{toolbar:'Tabel',title:'Egenskaber for tabel',menu:'Egenskaber for tabel',deleteTable:'Slet tabel',rows:'Rækker',columns:'Kolonner',border:'Rammebredde',widthPx:'pixels',widthPc:'procent',widthUnit:'Bredde på enhed',cellSpace:'Celleafstand',cellPad:'Cellemargen',caption:'Titel',summary:'Resumé',headers:'Hoved',headersNone:'Ingen',headersColumn:'Første kolonne',headersRow:'Første række',headersBoth:'Begge',invalidRows:'Antallet af rækker skal være større end 0.',invalidCols:'Antallet af kolonner skal være større end 0.',invalidBorder:'Rammetykkelse skal være et tal.',invalidWidth:'Tabelbredde skal være et tal.',invalidHeight:'Tabelhøjde skal være et tal.',invalidCellSpacing:'Celleafstand skal være et tal.',invalidCellPadding:'Cellemargen skal være et tal.',cell:{menu:'Celle',insertBefore:'Indsæt celle før',insertAfter:'Indsæt celle efter',deleteCell:'Slet celle',merge:'Flet celler',mergeRight:'Flet til højre',mergeDown:'Flet nedad',splitHorizontal:'Del celle vandret',splitVertical:'Del celle lodret',title:'Celleegenskaber',cellType:'Celletype',rowSpan:'Række span (rows span)',colSpan:'Kolonne span (columns span)',wordWrap:'Tekstombrydning',hAlign:'Vandret justering',vAlign:'Lodret justering',alignBaseline:'Grundlinje',bgColor:'Baggrundsfarve',borderColor:'Rammefarve',data:'Data',header:'Hoved',yes:'Ja',no:'Nej',invalidWidth:'Cellebredde skal være et tal.',invalidHeight:'Cellehøjde skal være et tal.',invalidRowSpan:'Række span skal være et heltal.',invalidColSpan:'Kolonne span skal være et heltal.',chooseColor:'Vælg'},row:{menu:'Række',insertBefore:'Indsæt række før',insertAfter:'Indsæt række efter',deleteRow:'Slet række'},column:{menu:'Kolonne',insertBefore:'Indsæt kolonne før',insertAfter:'Indsæt kolonne efter',deleteColumn:'Slet kolonne'}},button:{title:'Egenskaber for knap',text:'Tekst',type:'Type',typeBtn:'Knap',typeSbm:'Send',typeRst:'Nulstil'},checkboxAndRadio:{checkboxTitle:'Egenskaber for afkrydsningsfelt',radioTitle:'Egenskaber for alternativknap',value:'Værdi',selected:'Valgt'},form:{title:'Egenskaber for formular',menu:'Egenskaber for formular',action:'Handling',method:'Metode',encoding:'Kodning (encoding)'},select:{title:'Egenskaber for liste',selectInfo:'Generelt',opAvail:'Valgmuligheder',value:'Værdi',size:'Størrelse',lines:'Linjer',chkMulti:'Tillad flere valg',opText:'Tekst',opValue:'Værdi',btnAdd:'Tilføj',btnModify:'Redigér',btnUp:'Op',btnDown:'Ned',btnSetValue:'Sæt som valgt',btnDelete:'Slet'},textarea:{title:'Egenskaber for tekstboks',cols:'Kolonner',rows:'Rækker'},textfield:{title:'Egenskaber for tekstfelt',name:'Navn',value:'Værdi',charWidth:'Bredde (tegn)',maxChars:'Max. antal tegn',type:'Type',typeText:'Tekst',typePass:'Adgangskode'},hidden:{title:'Egenskaber for skjult felt',name:'Navn',value:'Værdi'},image:{title:'Egenskaber for billede',titleButton:'Egenskaber for billedknap',menu:'Egenskaber for billede',infoTab:'Generelt',btnUpload:'Upload fil til serveren',upload:'Upload',alt:'Alternativ tekst',lockRatio:'Lås størrelsesforhold',resetSize:'Nulstil størrelse',border:'Ramme',hSpace:'Vandret margen',vSpace:'Lodret margen',alertUrl:'Indtast stien til billedet',linkTab:'Hyperlink',button2Img:'Vil du lave billedknappen om til et almindeligt billede?',img2Button:'Vil du lave billedet om til en billedknap?',urlMissing:'Kilde på billed-URL mangler',validateBorder:'Kant skal være et helt nummer.',validateHSpace:'HSpace skal være et helt nummer.',validateVSpace:'VSpace skal være et helt nummer.'},flash:{properties:'Egenskaber for Flash',propertiesTab:'Egenskaber',title:'Egenskaber for Flash',chkPlay:'Automatisk afspilning',chkLoop:'Gentagelse',chkMenu:'Vis Flash-menu',chkFull:'Tillad fuldskærm',scale:'Skalér',scaleAll:'Vis alt',scaleNoBorder:'Ingen ramme',scaleFit:'Tilpas størrelse',access:'Scriptadgang',accessAlways:'Altid',accessSameDomain:'Samme domæne',accessNever:'Aldrig',alignAbsBottom:'Absolut nederst',alignAbsMiddle:'Absolut centreret',alignBaseline:'Grundlinje',alignTextTop:'Toppen af teksten',quality:'Kvalitet',qualityBest:'Bedste',qualityHigh:'Høj',qualityAutoHigh:'Auto høj',qualityMedium:'Medium',qualityAutoLow:'Auto lav',qualityLow:'Lav',windowModeWindow:'Vindue',windowModeOpaque:'Gennemsigtig (opaque)',windowModeTransparent:'Transparent',windowMode:'Vinduestilstand',flashvars:'Variabler for Flash',bgcolor:'Baggrundsfarve',hSpace:'Vandret margen',vSpace:'Lodret margen',validateSrc:'Indtast hyperlink URL!',validateHSpace:'Vandret margen skal være et tal.',validateVSpace:'Lodret margen skal være et tal.'},spellCheck:{toolbar:'Stavekontrol',title:'Stavekontrol',notAvailable:'Stavekontrol er desværre ikke tilgængelig.',errorLoading:'Fejl ved indlæsning af host: %s.',notInDic:'Ikke i ordbogen',changeTo:'Forslag',btnIgnore:'Ignorér',btnIgnoreAll:'Ignorér alle',btnReplace:'Erstat',btnReplaceAll:'Erstat alle',btnUndo:'Tilbage',noSuggestions:'(ingen forslag)',progress:'Stavekontrollen arbejder...',noMispell:'Stavekontrol færdig: Ingen fejl fundet',noChanges:'Stavekontrol færdig: Ingen ord ændret',oneChange:'Stavekontrol færdig: Et ord ændret',manyChanges:'Stavekontrol færdig: %1 ord ændret',ieSpellDownload:'Stavekontrol ikke installeret. Vil du installere den nu?'},smiley:{toolbar:'Smiley',title:'Vælg smiley',options:'Smileymuligheder'},elementsPath:{eleLabel:'Sti på element',eleTitle:'%1 element'},numberedlist:'Talopstilling',bulletedlist:'Punktopstilling',indent:'Forøg indrykning',outdent:'Formindsk indrykning',justify:{left:'Venstrestillet',center:'Centreret',right:'Højrestillet',block:'Lige margener'},blockquote:'Blokcitat',clipboard:{title:'Indsæt',cutError:'Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.<br><br>Brug i stedet tastaturet til at klippe teksten (Ctrl/Cmd+X).',copyError:'Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.<br><br>Brug i stedet tastaturet til at kopiere teksten (Ctrl/Cmd+C).',pasteMsg:'Indsæt i feltet herunder (<STRONG>Ctrl/Cmd+V</STRONG>) og klik på <STRONG>OK</STRONG>.',securityMsg:'Din browsers sikkerhedsindstillinger tillader ikke editoren at få automatisk adgang til udklipsholderen.<br><br>Du skal indsætte udklipsholderens indhold i dette vindue igen.',pasteArea:'Indsæt område'},pastefromword:{confirmCleanup:'Den tekst du forsøger at indsætte ser ud til at komme fra Word. Vil du rense teksten før den indsættes?',toolbar:'Indsæt fra Word',title:'Indsæt fra Word',error:'Det var ikke muligt at fjerne formatteringen på den indsatte tekst grundet en intern fejl'},pasteText:{button:'Indsæt som ikke-formateret tekst',title:'Indsæt som ikke-formateret tekst'},templates:{button:'Skabeloner',title:'Indholdsskabeloner',options:'Skabelon muligheder',insertOption:'Erstat det faktiske indhold',selectPromptMsg:'Vælg den skabelon, som skal åbnes i editoren (nuværende indhold vil blive overskrevet):',emptyListMsg:'(Der er ikke defineret nogen skabelon)'},showBlocks:'Vis afsnitsmærker',stylesCombo:{label:'Typografi',panelTitle:'Formattering på stylesheet',panelTitle1:'Block typografi',panelTitle2:'Inline typografi',panelTitle3:'Object typografi'},format:{label:'Formatering',panelTitle:'Formatering',tag_p:'Normal',tag_pre:'Formateret',tag_address:'Adresse',tag_h1:'Overskrift 1',tag_h2:'Overskrift 2',tag_h3:'Overskrift 3',tag_h4:'Overskrift 4',tag_h5:'Overskrift 5',tag_h6:'Overskrift 6',tag_div:'Normal (DIV)'},div:{title:'Opret Div Container',toolbar:'Opret Div Container',cssClassInputLabel:'Typografiark',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Sprogkode',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Vejledende titel',langDirLabel:'Sprogretning',langDirLTRLabel:'Venstre til højre (LTR)',langDirRTLLabel:'Højre til venstre (RTL)',edit:'Rediger Div',remove:'Slet Div'},iframe:{title:'Iframe egenskaber',toolbar:'Iframe',noUrl:'Venligst indsæt URL på iframen',scrolling:'Aktiver scrollbars',border:'Vis kant på rammen'},font:{label:'Skrifttype',voiceLabel:'Skrifttype',panelTitle:'Skrifttype'},fontSize:{label:'Skriftstørrelse',voiceLabel:'Skriftstørrelse',panelTitle:'Skriftstørrelse'},colorButton:{textColorTitle:'Tekstfarve',bgColorTitle:'Baggrundsfarve',panelTitle:'Farver',auto:'Automatisk',more:'Flere farver...'},colors:{'000':'Sort',800000:'Mørkerød','8B4513':'Mørk orange','2F4F4F':'Dark Slate Grå','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Mørkegrå',B22222:'Scarlet / Rød',A52A2A:'Brun',DAA520:'Guld','006400':'Mørkegrøn','40E0D0':'Tyrkis','0000CD':'Mellemblå',800080:'Lilla',808080:'Grå',F00:'Rød',FF8C00:'Mørk orange',FFD700:'Guld','008000':'Grøn','0FF':'Cyan','00F':'Blå',EE82EE:'Violet',A9A9A9:'Matgrå',FFA07A:'Laksefarve',FFA500:'Orange',FFFF00:'Gul','00FF00':'Lime',AFEEEE:'Mat tyrkis',ADD8E6:'Lyseblå',DDA0DD:'Plum',D3D3D3:'Lysegrå',FFF0F5:'Lavender Blush',FAEBD7:'Antikhvid',FFFFE0:'Lysegul',F0FFF0:'Gul / Beige',F0FFFF:'Himmeblå',F0F8FF:'Alice blue',E6E6FA:'Lavendel',FFF:'Hvid'},scayt:{title:'Stavekontrol mens du skriver',opera_title:'Ikke supporteret af Opera',enable:'Aktivér SCAYT',disable:'Deaktivér SCAYT',about:'Om SCAYT',toggle:'Skift/toggle SCAYT',options:'Indstillinger',langs:'Sprog',moreSuggestions:'Flere forslag',ignore:'Ignorér',ignoreAll:'Ignorér alle',addWord:'Tilføj ord',emptyDic:'Ordbogsnavn må ikke være tom.',optionsTab:'Indstillinger',allCaps:'Ignorer alle store bogstaver',ignoreDomainNames:'Ignorér domænenavne',mixedCase:'Ignorer ord med store og små bogstaver',mixedWithDigits:'Ignorér ord med numre',languagesTab:'Sprog',dictionariesTab:'Ordbøger',dic_field_name:'Navn på ordbog',dic_create:'Opret',dic_restore:'Gendan',dic_delete:'Slet',dic_rename:'Omdøb',dic_info:'Til start er brugerordbogen gemt i en Cookie. Dog har Cookies en begrænsning på størrelse. Når ordbogen når en bestemt størrelse kan den blive gemt på vores server. For at gemme din personlige ordbog på vores server skal du angive et navn for denne. Såfremt du allerede har gemt en ordbog, skriv navnet på denne og klik på Gendan knappen.',aboutTab:'Om'},about:{title:'Om CKEditor',dlgTitle:'Om CKEditor',help:'Se $1 for at få hjælp.',userGuide:'CKEditor-brugermanual',moreInfo:'For informationer omkring licens, se venligst vores hjemmeside (på engelsk):',copy:'Copyright © $1. Alle rettigheder forbeholdes.'},maximize:'Maksimér',minimize:'Minimér',fakeobjects:{anchor:'Anker',flash:'Flashanimation',iframe:'Iframe',hiddenfield:'Skjult felt',unknown:'Ukendt objekt'},resize:'Træk for at skalere',colordialog:{title:'Vælg farve',options:'Farvemuligheder',highlight:'Markér',selected:'Valgt farve',clear:'Nulstil'},toolbarCollapse:'Sammenklap værktøjslinje',toolbarExpand:'Udvid værktøjslinje',toolbarGroups:{document:'Dokument',clipboard:'Udklipsholder/Fortryd',editing:'Redigering',forms:'Formularer',basicstyles:'Basis styles',paragraph:'Paragraf',links:'Links',insert:'Indsæt',styles:'Typografier',colors:'Farver',tools:'Værktøjer'},bidi:{ltr:'Tekstretning fra venstre til højre',rtl:'Tekstretning fra højre til venstre'},docprops:{label:'Egenskaber for dokument',title:'Egenskaber for dokument',design:'Design',meta:'Metatags',chooseColor:'Vælg',other:'<anden>',docTitle:'Sidetitel',charset:'Tegnsætskode',charsetOther:'Anden tegnsætskode',charsetASCII:'ASCII',charsetCE:'Centraleuropæisk',charsetCT:'Traditionel kinesisk (Big5)',charsetCR:'Kyrillisk',charsetGR:'Græsk',charsetJP:'Japansk',charsetKR:'Koreansk',charsetTR:'Tyrkisk',charsetUN:'Unicode (UTF-8)',charsetWE:'Vesteuropæisk',docType:'Dokumenttype kategori',docTypeOther:'Anden dokumenttype kategori',xhtmlDec:'Inkludere XHTML deklartion',bgColor:'Baggrundsfarve',bgImage:'Baggrundsbillede URL',bgFixed:'Fastlåst baggrund',txtColor:'Tekstfarve',margin:'Sidemargen',marginTop:'Øverst',marginLeft:'Venstre',marginRight:'Højre',marginBottom:'Nederst',metaKeywords:'Dokument index nøgleord (kommasepareret)',metaDescription:'Dokumentbeskrivelse',metaAuthor:'Forfatter',metaCopyright:'Copyright',previewHtml:'<p>Dette er et <strong>eksempel på noget tekst</strong>. Du benytter <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/de.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/de.js
index 5ec37fd..688c653 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/de.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/de.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.de={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor Symbolleisten',editor:'WYSIWYG-Editor',source:'Quellcode',newPage:'Neue Seite',save:'Speichern',preview:'Vorschau',cut:'Ausschneiden',copy:'Kopieren',paste:'Einfügen',print:'Drucken',underline:'Unterstrichen',bold:'Fett',italic:'Kursiv',selectAll:'Alles auswählen',removeFormat:'Formatierungen entfernen',strike:'Durchgestrichen',subscript:'Tiefgestellt',superscript:'Hochgestellt',horizontalrule:'Horizontale Linie einfügen',pagebreak:'Seitenumbruch einfügen',pagebreakAlt:'Seitenumbruch einfügen',unlink:'Link entfernen',undo:'Rückgängig',redo:'Wiederherstellen',common:{browseServer:'Server durchsuchen',url:'URL',protocol:'Protokoll',upload:'Hochladen',uploadSubmit:'Zum Server senden',image:'Bild',flash:'Flash',form:'Formular',checkbox:'Checkbox',radio:'Radiobutton',textField:'Textfeld einzeilig',textarea:'Textfeld mehrzeilig',hiddenField:'Verstecktes Feld',button:'Klickbutton',select:'Auswahlfeld',imageButton:'Bildbutton',notSet:'<nichts>',id:'ID',name:'Name',langDir:'Schreibrichtung',langDirLtr:'Links nach Rechts (LTR)',langDirRtl:'Rechts nach Links (RTL)',langCode:'Sprachenkürzel',longDescr:'Langform URL',cssClass:'Stylesheet Klasse',advisoryTitle:'Titel Beschreibung',cssStyle:'Style',ok:'OK',cancel:'Abbrechen',close:'Schließen',preview:'Vorschau',generalTab:'Allgemein',advancedTab:'Erweitert',validateNumberFailed:'Dieser Wert ist keine Nummer.',confirmNewPage:'Alle nicht gespeicherten Änderungen gehen verlohren. Sind Sie sicher die neue Seite zu laden?',confirmCancel:'Einige Optionen wurden geändert. Wollen Sie den Dialog dennoch schließen?',options:'Optionen',target:'Zielseite',targetNew:'Neues Fenster (_blank)',targetTop:'Oberstes Fenster (_top)',targetSelf:'Gleiches Fenster (_self)',targetParent:'Oberes Fenster (_parent)',langDirLTR:'Links nach Rechts (LNR)',langDirRTL:'Rechts nach Links (RNL)',styles:'Style',cssClasses:'Stylesheet Klasse',width:'Breite',height:'Höhe',align:'Ausrichtung',alignLeft:'Links',alignRight:'Rechts',alignCenter:'Zentriert',alignTop:'Oben',alignMiddle:'Mitte',alignBottom:'Unten',invalidHeight:'Höhe muss eine Zahl sein.',invalidWidth:'Breite muss eine Zahl sein.',invalidCssLength:'Wert spezifiziert für "%1" Feld muss ein positiver numerischer Wert sein mit oder ohne korrekte CSS Messeinheit (px, %, in, cm, mm, em, ex, pt oder pc).',invalidHtmlLength:'Wert spezifiziert für "%1" Feld muss ein positiver numerischer Wert sein mit oder ohne korrekte HTML Messeinheit (px oder %).',invalidInlineStyle:'Wert spezifiziert für inline Stilart muss enthalten ein oder mehr Tupels mit dem Format "Name : Wert" getrennt mit Semikolons.',cssLengthTooltip:'Gebe eine Zahl ein für ein Wert in pixels oder eine Zahl mit einer korrekten CSS Messeinheit (px, %, in, cm, mm, em, ex, pt oder pc).',unavailable:'%1<span class="cke_accessibility">, nicht verfügbar</span>'},contextmenu:{options:'Kontextmenü Optionen'},specialChar:{toolbar:'Sonderzeichen einfügen/editieren',title:'Sonderzeichen auswählen',options:'Sonderzeichen Optionen'},link:{toolbar:'Link einfügen/editieren',other:'<andere>',menu:'Link editieren',title:'Link',info:'Link-Info',target:'Zielseite',upload:'Hochladen',advanced:'Erweitert',type:'Link-Typ',toUrl:'URL',toAnchor:'Anker in dieser Seite',toEmail:'E-Mail',targetFrame:'<Frame>',targetPopup:'<Pop-up Fenster>',targetFrameName:'Ziel-Fenster-Name',targetPopupName:'Pop-up Fenster-Name',popupFeatures:'Pop-up Fenster-Eigenschaften',popupResizable:'Größe änderbar',popupStatusBar:'Statusleiste',popupLocationBar:'Adress-Leiste',popupToolbar:'Symbolleiste',popupMenuBar:'Menü-Leiste',popupFullScreen:'Vollbild (IE)',popupScrollBars:'Rollbalken',popupDependent:'Abhängig (Netscape)',popupLeft:'Linke Position',popupTop:'Obere Position',id:'Id',langDir:'Schreibrichtung',langDirLTR:'Links nach Rechts (LTR)',langDirRTL:'Rechts nach Links (RTL)',acccessKey:'Zugriffstaste',name:'Name',langCode:'Sprachenkürzel',tabIndex:'Tab-Index',advisoryTitle:'Titel Beschreibung',advisoryContentType:'Inhaltstyp',cssClasses:'Stylesheet Klasse',charset:'Ziel-Zeichensatz',styles:'Style',rel:'Beziehung',selectAnchor:'Anker auswählen',anchorName:'nach Anker Name',anchorId:'nach Element Id',emailAddress:'E-Mail Adresse',emailSubject:'Betreffzeile',emailBody:'Nachrichtentext',noAnchors:'(keine Anker im Dokument vorhanden)',noUrl:'Bitte geben Sie die Link-URL an',noEmail:'Bitte geben Sie e-Mail Adresse an'},anchor:{toolbar:'Anker einfügen/editieren',menu:'Anker-Eigenschaften',title:'Anker-Eigenschaften',name:'Anker Name',errorName:'Bitte geben Sie den Namen des Ankers ein',remove:'Anker entfernen'},list:{numberedTitle:'Nummerierte Listen-Eigenschaften',bulletedTitle:'Listen-Eigenschaften',type:'Typ',start:'Start',validateStartNumber:'List Startnummer muss eine ganze Zahl sein.',circle:'Ring',disc:'Kreis',square:'Quadrat',none:'Keine',notset:'<nicht gesetzt>',armenian:'Armenisch Nummerierung',georgian:'Georgisch Nummerierung (an, ban, gan, etc.)',lowerRoman:'Klein römisch (i, ii, iii, iv, v, etc.)',upperRoman:'Groß römisch (I, II, III, IV, V, etc.)',lowerAlpha:'Klein alpha (a, b, c, d, e, etc.)',upperAlpha:'Groß alpha (A, B, C, D, E, etc.)',lowerGreek:'Klein griechisch (alpha, beta, gamma, etc.)',decimal:'Dezimal (1, 2, 3, etc.)',decimalLeadingZero:'Dezimal mit führende Null (01, 02, 03, etc.)'},findAndReplace:{title:'Suchen und Ersetzen',find:'Suchen',replace:'Ersetzen',findWhat:'Suche nach:',replaceWith:'Ersetze mit:',notFoundMsg:'Der gesuchte Text wurde nicht gefunden.',findOptions:'Suchoptionen',matchCase:'Groß-Kleinschreibung beachten',matchWord:'Nur ganze Worte suchen',matchCyclic:'Zyklische Suche',replaceAll:'Alle ersetzen',replaceSuccessMsg:'%1 vorkommen ersetzt.'},table:{toolbar:'Tabelle',title:'Tabellen-Eigenschaften',menu:'Tabellen-Eigenschaften',deleteTable:'Tabelle löschen',rows:'Zeile',columns:'Spalte',border:'Rahmen',widthPx:'Pixel',widthPc:'%',widthUnit:'Breite Einheit',cellSpace:'Zellenabstand außen',cellPad:'Zellenabstand innen',caption:'Überschrift',summary:'Inhaltsübersicht',headers:'Kopfzeile',headersNone:'Keine',headersColumn:'Erste Spalte',headersRow:'Erste Zeile',headersBoth:'Beide',invalidRows:'Die Anzahl der Zeilen muß größer als 0 sein.',invalidCols:'Die Anzahl der Spalten muß größer als 0 sein..',invalidBorder:'Die Rahmenbreite muß eine Zahl sein.',invalidWidth:'Die Tabellenbreite muss eine Zahl sein.',invalidHeight:'Die Tabellenbreite muß eine Zahl sein.',invalidCellSpacing:'Der Zellenabstand außen muß eine positive Zahl sein.',invalidCellPadding:'Der Zellenabstand innen muß eine positive Zahl sein.',cell:{menu:'Zelle',insertBefore:'Zelle davor einfügen',insertAfter:'Zelle danach einfügen',deleteCell:'Zelle löschen',merge:'Zellen verbinden',mergeRight:'Nach rechts verbinden',mergeDown:'Nach unten verbinden',splitHorizontal:'Zelle horizontal teilen',splitVertical:'Zelle vertikal teilen',title:'Zellen-Eigenschaften',cellType:'Zellart',rowSpan:'Anzahl Zeilen verbinden',colSpan:'Anzahl Spalten verbinden',wordWrap:'Zeilenumbruch',hAlign:'Horizontale Ausrichtung',vAlign:'Vertikale Ausrichtung',alignBaseline:'Grundlinie',bgColor:'Hintergrundfarbe',borderColor:'Rahmenfarbe',data:'Daten',header:'Überschrift',yes:'Ja',no:'Nein',invalidWidth:'Zellenbreite muß eine Zahl sein.',invalidHeight:'Zellenhöhe muß eine Zahl sein.',invalidRowSpan:'"Anzahl Zeilen verbinden" muss eine Ganzzahl sein.',invalidColSpan:'"Anzahl Spalten verbinden" muss eine Ganzzahl sein.',chooseColor:'Wählen'},row:{menu:'Zeile',insertBefore:'Zeile oberhalb einfügen',insertAfter:'Zeile unterhalb einfügen',deleteRow:'Zeile entfernen'},column:{menu:'Spalte',insertBefore:'Spalte links davor einfügen',insertAfter:'Spalte rechts danach einfügen',deleteColumn:'Spalte löschen'}},button:{title:'Button-Eigenschaften',text:'Text (Wert)',type:'Typ',typeBtn:'Button',typeSbm:'Absenden',typeRst:'Zurücksetzen'},checkboxAndRadio:{checkboxTitle:'Checkbox-Eigenschaften',radioTitle:'Optionsfeld-Eigenschaften',value:'Wert',selected:'ausgewählt'},form:{title:'Formular-Eigenschaften',menu:'Formular-Eigenschaften',action:'Action',method:'Method',encoding:'Zeichenkodierung'},select:{title:'Auswahlfeld-Eigenschaften',selectInfo:'Info',opAvail:'Mögliche Optionen',value:'Wert',size:'Größe',lines:'Linien',chkMulti:'Erlaube Mehrfachauswahl',opText:'Text',opValue:'Wert',btnAdd:'Hinzufügen',btnModify:'Ändern',btnUp:'Hoch',btnDown:'Runter',btnSetValue:'Setze als Standardwert',btnDelete:'Entfernen'},textarea:{title:'Textfeld (mehrzeilig) Eigenschaften',cols:'Spalten',rows:'Reihen'},textfield:{title:'Textfeld (einzeilig) Eigenschaften',name:'Name',value:'Wert',charWidth:'Zeichenbreite',maxChars:'Max. Zeichen',type:'Typ',typeText:'Text',typePass:'Passwort'},hidden:{title:'Verstecktes Feld-Eigenschaften',name:'Name',value:'Wert'},image:{title:'Bild-Eigenschaften',titleButton:'Bildbutton-Eigenschaften',menu:'Bild-Eigenschaften',infoTab:'Bild-Info',btnUpload:'Zum Server senden',upload:'Hochladen',alt:'Alternativer Text',lockRatio:'Größenverhältnis beibehalten',resetSize:'Größe zurücksetzen',border:'Rahmen',hSpace:'Horizontal-Abstand',vSpace:'Vertikal-Abstand',alertUrl:'Bitte geben Sie die Bild-URL an',linkTab:'Link',button2Img:'Möchten Sie den gewählten Bild-Button in ein einfaches Bild umwandeln?',img2Button:'Möchten Sie das gewählten Bild in einen Bild-Button umwandeln?',urlMissing:'Imagequelle URL fehlt.',validateBorder:'Rahmen muß eine ganze Zahl sein.',validateHSpace:'Horizontal-Abstand muß eine ganze Zahl sein.',validateVSpace:'Vertikal-Abstand muß eine ganze Zahl sein.'},flash:{properties:'Flash-Eigenschaften',propertiesTab:'Eigenschaften',title:'Flash-Eigenschaften',chkPlay:'Automatisch Abspielen',chkLoop:'Endlosschleife',chkMenu:'Flash-Menü aktivieren',chkFull:'Vollbildmodus erlauben',scale:'Skalierung',scaleAll:'Alles anzeigen',scaleNoBorder:'Ohne Rand',scaleFit:'Passgenau',access:'Skript Zugang',accessAlways:'Immer',accessSameDomain:'Gleiche Domain',accessNever:'Nie',alignAbsBottom:'Abs Unten',alignAbsMiddle:'Abs Mitte',alignBaseline:'Baseline',alignTextTop:'Text Oben',quality:'Qualität',qualityBest:'Beste',qualityHigh:'Hoch',qualityAutoHigh:'Auto Hoch',qualityMedium:'Medium',qualityAutoLow:'Auto Niedrig',qualityLow:'Niedrig',windowModeWindow:'Fenster',windowModeOpaque:'Deckend',windowModeTransparent:'Transparent',windowMode:'Fenster Modus',flashvars:'Variablen für Flash',bgcolor:'Hintergrundfarbe',hSpace:'Horizontal-Abstand',vSpace:'Vertikal-Abstand',validateSrc:'Bitte geben Sie die Link-URL an',validateHSpace:'HSpace muss eine Zahl sein.',validateVSpace:'VSpace muss eine Zahl sein.'},spellCheck:{toolbar:'Rechtschreibprüfung',title:'Rechtschreibprüfung',notAvailable:'Entschuldigung, aber dieser Dienst steht im Moment nicht zur Verfügung.',errorLoading:'Fehler beim laden des Dienstanbieters: %s.',notInDic:'Nicht im Wörterbuch',changeTo:'Ändern in',btnIgnore:'Ignorieren',btnIgnoreAll:'Alle Ignorieren',btnReplace:'Ersetzen',btnReplaceAll:'Alle Ersetzen',btnUndo:'Rückgängig',noSuggestions:' - keine Vorschläge - ',progress:'Rechtschreibprüfung läuft...',noMispell:'Rechtschreibprüfung abgeschlossen - keine Fehler gefunden',noChanges:'Rechtschreibprüfung abgeschlossen - keine Worte geändert',oneChange:'Rechtschreibprüfung abgeschlossen - ein Wort geändert',manyChanges:'Rechtschreibprüfung abgeschlossen - %1 Wörter geändert',ieSpellDownload:'Rechtschreibprüfung nicht installiert. Möchten Sie sie jetzt herunterladen?'},smiley:{toolbar:'Smiley',title:'Smiley auswählen',options:'Smiley Optionen'},elementsPath:{eleLabel:'Elements Pfad',eleTitle:'%1 Element'},numberedlist:'Nummerierte Liste',bulletedlist:'Liste',indent:'Einzug erhöhen',outdent:'Einzug verringern',justify:{left:'Linksbündig',center:'Zentriert',right:'Rechtsbündig',block:'Blocksatz'},blockquote:'Zitatblock',clipboard:{title:'Einfügen',cutError:'Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch auszuschneiden. Bitte benutzen Sie die System-Zwischenablage über STRG-X (ausschneiden) und STRG-V (einfügen).',copyError:'Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch kopieren. Bitte benutzen Sie die System-Zwischenablage über STRG-C (kopieren).',pasteMsg:'Bitte fügen Sie den Text in der folgenden Box über die Tastatur (mit <STRONG>Strg+V</STRONG>) ein und bestätigen Sie mit <STRONG>OK</STRONG>.',securityMsg:'Aufgrund von Sicherheitsbeschränkungen Ihres Browsers kann der Editor nicht direkt auf die Zwischenablage zugreifen. Bitte fügen Sie den Inhalt erneut in diesem Fenster ein.',pasteArea:'Einfügebereich'},pastefromword:{confirmCleanup:'Der Text, den Sie einfügen möchten, scheint aus MS-Word kopiert zu sein. Möchten Sie ihn zuvor bereinigen lassen?',toolbar:'Aus MS-Word einfügen',title:'Aus MS-Word einfügen',error:'Aufgrund eines internen Fehlers war es nicht möglich die eingefügten Daten zu bereinigen'},pasteText:{button:'Als Text einfügen',title:'Als Text einfügen'},templates:{button:'Vorlagen',title:'Vorlagen',options:'Vorlagen Optionen',insertOption:'Aktuellen Inhalt ersetzen',selectPromptMsg:'Klicken Sie auf eine Vorlage, um sie im Editor zu öffnen (der aktuelle Inhalt wird dabei gelöscht!):',emptyListMsg:'(keine Vorlagen definiert)'},showBlocks:'Blöcke anzeigen',stylesCombo:{label:'Stil',panelTitle:'Formatierungenstil',panelTitle1:'Block Stilart',panelTitle2:'Inline Stilart',panelTitle3:'Objekt Stilart'},format:{label:'Format',panelTitle:'Format',tag_p:'Normal',tag_pre:'Formatiert',tag_address:'Addresse',tag_h1:'Überschrift 1',tag_h2:'Überschrift 2',tag_h3:'Überschrift 3',tag_h4:'Überschrift 4',tag_h5:'Überschrift 5',tag_h6:'Überschrift 6',tag_div:'Normal (DIV)'},div:{title:'Div Container erzeugen',toolbar:'Div Container erzeugen',cssClassInputLabel:'Stylesheet Klasse',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:'Sprachenkürzel',inlineStyleInputLabel:'Inline Stil',advisoryTitleInputLabel:'Tooltip',langDirLabel:'Sprache Richtung',langDirLTRLabel:'Links nach Rechs (LTR)',langDirRTLLabel:'Rechs nach Links (RTL)',edit:'Div bearbeiten',remove:'Div entfernen'},iframe:{title:'IFrame-Eigenschaften',toolbar:'IFrame',noUrl:'Bitte geben Sie die IFrame-URL an',scrolling:'Rollbalken anzeigen',border:'Rahmen anzeigen'},font:{label:'Schriftart',voiceLabel:'Schriftart',panelTitle:'Schriftart'},fontSize:{label:'Größe',voiceLabel:'Schrifgröße',panelTitle:'Größe'},colorButton:{textColorTitle:'Textfarbe',bgColorTitle:'Hintergrundfarbe',panelTitle:'Farben',auto:'Automatisch',more:'Weitere Farben...'},colors:{'000':'Schwarz',800000:'Kastanienbraun','8B4513':'Braun','2F4F4F':'Dunkles Schiefergrau','008080':'Blaugrün','000080':'Navy','4B0082':'Indigo',696969:'Dunkelgrau',B22222:'Ziegelrot',A52A2A:'Braun',DAA520:'Goldgelb','006400':'Dunkelgrün','40E0D0':'Türkis','0000CD':'Medium Blau',800080:'Lila',808080:'Grau',F00:'Rot',FF8C00:'Dunkelorange',FFD700:'Gold','008000':'Grün','0FF':'Cyan','00F':'Blau',EE82EE:'Hellviolett',A9A9A9:'Dunkelgrau',FFA07A:'Helles Lachsrosa',FFA500:'Orange',FFFF00:'Gelb','00FF00':'Lime',AFEEEE:'Blaß-Türkis',ADD8E6:'Hellblau',DDA0DD:'Pflaumenblau',D3D3D3:'Hellgrau',FFF0F5:'Lavendel',FAEBD7:'Antik Weiß',FFFFE0:'Hellgelb',F0FFF0:'Honigtau',F0FFFF:'Azurblau',F0F8FF:'Alice Blau',E6E6FA:'Lavendel',FFF:'Weiß'},scayt:{title:'Rechtschreibprüfung während der Texteingabe (SCAYT)',opera_title:'Nicht von Opera unterstützt',enable:'SCAYT einschalten',disable:'SCAYT ausschalten',about:'Über SCAYT',toggle:'SCAYT umschalten',options:'Optionen',langs:'Sprachen',moreSuggestions:'Mehr Vorschläge',ignore:'Ignorieren',ignoreAll:'Alle ignorieren',addWord:'Wort hinzufügen',emptyDic:'Wörterbuchname sollte leer sein.',optionsTab:'Optionen',allCaps:'Groß geschriebenen Wörter ignorieren',ignoreDomainNames:'Domain-Namen ignorieren',mixedCase:'Wörter mit gemischte Setzkasten ignorieren',mixedWithDigits:'Wörter mit Zahlen ignorieren',languagesTab:'Sprachen',dictionariesTab:'Wörterbücher',dic_field_name:'Wörterbuchname',dic_create:'Erzeugen',dic_restore:'Wiederherstellen',dic_delete:'Löschen',dic_rename:'Umbenennen',dic_info:'Anfangs wird das Benutzerwörterbuch in einem Cookie gespeichert. Allerdings sind Cookies in der Größe begrenzt. Wenn das Benutzerwörterbuch bis zu einem Punkt wächst, wo es nicht mehr in einem Cookie gespeichert werden kann, wird das Benutzerwörterbuch auf dem Server gespeichert. Um Ihr persönliches Wörterbuch auf dem Server zu speichern, müssen Sie einen Namen für das Wörterbuch angeben. Falls Sie schon ein gespeicherte Wörterbuch haben, geben Sie bitte dessen Namen ein und klicken Sie auf die Schaltfläche Wiederherstellen.',aboutTab:'Über'},about:{title:'Über CKEditor',dlgTitle:'Über CKEditor',help:'Prüfe $1 für Hilfe.',userGuide:'CKEditor Benutzerhandbuch',moreInfo:'Für Informationen über unsere Lizenzbestimmungen besuchen sie bitte unsere Webseite:',copy:'Copyright © $1. Alle Rechte vorbehalten.'},maximize:'Maximieren',minimize:'Minimieren',fakeobjects:{anchor:'Anker',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Verstecktes Feld',unknown:'Unbekanntes Objekt'},resize:'Zum Vergrößern ziehen',colordialog:{title:'Farbe wählen',options:'Farbeoptionen',highlight:'Hervorheben',selected:'Ausgewählte Farbe',clear:'Entfernen'},toolbarCollapse:'Symbolleiste einklappen',toolbarExpand:'Symbolleiste ausklappen',toolbarGroups:{document:'Dokument',clipboard:'Zwischenablage/Rückgängig',editing:'Editieren',forms:'Formularen',basicstyles:'Grundstile',paragraph:'Absatz',links:'Links',insert:'Einfügen',styles:'Stile',colors:'Farben',tools:'Werkzeuge'},bidi:{ltr:'Leserichtung von Links nach Rechts',rtl:'Leserichtung von Rechts nach Links'},docprops:{label:'Dokument-Eigenschaften',title:'Dokument-Eigenschaften',design:'Design',meta:'Metadaten',chooseColor:'Wählen',other:'<andere>',docTitle:'Seitentitel',charset:'Zeichenkodierung',charsetOther:'Andere Zeichenkodierung',charsetASCII:'ASCII',charsetCE:'Zentraleuropäisch',charsetCT:'traditionell Chinesisch (Big5)',charsetCR:'Kyrillisch',charsetGR:'Griechisch',charsetJP:'Japanisch',charsetKR:'Koreanisch',charsetTR:'Türkisch',charsetUN:'Unicode (UTF-8)',charsetWE:'Westeuropäisch',docType:'Dokumententyp',docTypeOther:'Anderer Dokumententyp',xhtmlDec:'Beziehe XHTML Deklarationen ein',bgColor:'Hintergrundfarbe',bgImage:'Hintergrundbild URL',bgFixed:'feststehender Hintergrund',txtColor:'Textfarbe',margin:'Seitenränder',marginTop:'Oben',marginLeft:'Links',marginRight:'Rechts',marginBottom:'Unten',metaKeywords:'Schlüsselwörter (durch Komma getrennt)',metaDescription:'Dokument-Beschreibung',metaAuthor:'Autor',metaCopyright:'Copyright',previewHtml:'<p>Das ist ein <strong>Beispieltext</strong>. Du schreibst in <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.de={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor Symbolleisten',editor:'WYSIWYG-Editor',source:'Quellcode',newPage:'Neue Seite',save:'Speichern',preview:'Vorschau',cut:'Ausschneiden',copy:'Kopieren',paste:'Einfügen',print:'Drucken',underline:'Unterstrichen',bold:'Fett',italic:'Kursiv',selectAll:'Alles auswählen',removeFormat:'Formatierungen entfernen',strike:'Durchgestrichen',subscript:'Tiefgestellt',superscript:'Hochgestellt',horizontalrule:'Horizontale Linie einfügen',pagebreak:'Seitenumbruch einfügen',pagebreakAlt:'Seitenumbruch einfügen',unlink:'Link entfernen',undo:'Rückgängig',redo:'Wiederherstellen',common:{browseServer:'Server durchsuchen',url:'URL',protocol:'Protokoll',upload:'Hochladen',uploadSubmit:'Zum Server senden',image:'Bild',flash:'Flash',form:'Formular',checkbox:'Checkbox',radio:'Radiobutton',textField:'Textfeld einzeilig',textarea:'Textfeld mehrzeilig',hiddenField:'Verstecktes Feld',button:'Klickbutton',select:'Auswahlfeld',imageButton:'Bildbutton',notSet:'<nichts>',id:'ID',name:'Name',langDir:'Schreibrichtung',langDirLtr:'Links nach Rechts (LTR)',langDirRtl:'Rechts nach Links (RTL)',langCode:'Sprachenkürzel',longDescr:'Langform URL',cssClass:'Stylesheet Klasse',advisoryTitle:'Titel Beschreibung',cssStyle:'Style',ok:'OK',cancel:'Abbrechen',close:'Schließen',preview:'Vorschau',generalTab:'Allgemein',advancedTab:'Erweitert',validateNumberFailed:'Dieser Wert ist keine Nummer.',confirmNewPage:'Alle nicht gespeicherten Änderungen gehen verlohren. Sind Sie sicher die neue Seite zu laden?',confirmCancel:'Einige Optionen wurden geändert. Wollen Sie den Dialog dennoch schließen?',options:'Optionen',target:'Zielseite',targetNew:'Neues Fenster (_blank)',targetTop:'Oberstes Fenster (_top)',targetSelf:'Gleiches Fenster (_self)',targetParent:'Oberes Fenster (_parent)',langDirLTR:'Links nach Rechts (LNR)',langDirRTL:'Rechts nach Links (RNL)',styles:'Style',cssClasses:'Stylesheet Klasse',width:'Breite',height:'Höhe',align:'Ausrichtung',alignLeft:'Links',alignRight:'Rechts',alignCenter:'Zentriert',alignTop:'Oben',alignMiddle:'Mitte',alignBottom:'Unten',invalidHeight:'Höhe muss eine Zahl sein.',invalidWidth:'Breite muss eine Zahl sein.',invalidCssLength:'Wert spezifiziert für "%1" Feld muss ein positiver numerischer Wert sein mit oder ohne korrekte CSS Messeinheit (px, %, in, cm, mm, em, ex, pt oder pc).',invalidHtmlLength:'Wert spezifiziert für "%1" Feld muss ein positiver numerischer Wert sein mit oder ohne korrekte HTML Messeinheit (px oder %).',invalidInlineStyle:'Wert spezifiziert für inline Stilart muss enthalten ein oder mehr Tupels mit dem Format "Name : Wert" getrennt mit Semikolons.',cssLengthTooltip:'Gebe eine Zahl ein für ein Wert in pixels oder eine Zahl mit einer korrekten CSS Messeinheit (px, %, in, cm, mm, em, ex, pt oder pc).',unavailable:'%1<span class="cke_accessibility">, nicht verfügbar</span>'},contextmenu:{options:'Kontextmenü Optionen'},specialChar:{toolbar:'Sonderzeichen einfügen/editieren',title:'Sonderzeichen auswählen',options:'Sonderzeichen Optionen'},link:{toolbar:'Link einfügen/editieren',other:'<andere>',menu:'Link editieren',title:'Link',info:'Link-Info',target:'Zielseite',upload:'Hochladen',advanced:'Erweitert',type:'Link-Typ',toUrl:'URL',toAnchor:'Anker in dieser Seite',toEmail:'E-Mail',targetFrame:'<Frame>',targetPopup:'<Pop-up Fenster>',targetFrameName:'Ziel-Fenster-Name',targetPopupName:'Pop-up Fenster-Name',popupFeatures:'Pop-up Fenster-Eigenschaften',popupResizable:'Größe änderbar',popupStatusBar:'Statusleiste',popupLocationBar:'Adress-Leiste',popupToolbar:'Symbolleiste',popupMenuBar:'Menü-Leiste',popupFullScreen:'Vollbild (IE)',popupScrollBars:'Rollbalken',popupDependent:'Abhängig (Netscape)',popupLeft:'Linke Position',popupTop:'Obere Position',id:'Id',langDir:'Schreibrichtung',langDirLTR:'Links nach Rechts (LTR)',langDirRTL:'Rechts nach Links (RTL)',acccessKey:'Zugriffstaste',name:'Name',langCode:'Sprachenkürzel',tabIndex:'Tab-Index',advisoryTitle:'Titel Beschreibung',advisoryContentType:'Inhaltstyp',cssClasses:'Stylesheet Klasse',charset:'Ziel-Zeichensatz',styles:'Style',rel:'Beziehung',selectAnchor:'Anker auswählen',anchorName:'nach Anker Name',anchorId:'nach Element Id',emailAddress:'E-Mail Adresse',emailSubject:'Betreffzeile',emailBody:'Nachrichtentext',noAnchors:'(keine Anker im Dokument vorhanden)',noUrl:'Bitte geben Sie die Link-URL an',noEmail:'Bitte geben Sie e-Mail Adresse an'},anchor:{toolbar:'Anker einfügen/editieren',menu:'Anker-Eigenschaften',title:'Anker-Eigenschaften',name:'Anker Name',errorName:'Bitte geben Sie den Namen des Ankers ein',remove:'Anker entfernen'},list:{numberedTitle:'Nummerierte Listen-Eigenschaften',bulletedTitle:'Listen-Eigenschaften',type:'Typ',start:'Start',validateStartNumber:'List Startnummer muss eine ganze Zahl sein.',circle:'Ring',disc:'Kreis',square:'Quadrat',none:'Keine',notset:'<nicht gesetzt>',armenian:'Armenisch Nummerierung',georgian:'Georgisch Nummerierung (an, ban, gan, etc.)',lowerRoman:'Klein römisch (i, ii, iii, iv, v, etc.)',upperRoman:'Groß römisch (I, II, III, IV, V, etc.)',lowerAlpha:'Klein alpha (a, b, c, d, e, etc.)',upperAlpha:'Groß alpha (A, B, C, D, E, etc.)',lowerGreek:'Klein griechisch (alpha, beta, gamma, etc.)',decimal:'Dezimal (1, 2, 3, etc.)',decimalLeadingZero:'Dezimal mit führende Null (01, 02, 03, etc.)'},findAndReplace:{title:'Suchen und Ersetzen',find:'Suchen',replace:'Ersetzen',findWhat:'Suche nach:',replaceWith:'Ersetze mit:',notFoundMsg:'Der gesuchte Text wurde nicht gefunden.',findOptions:'Suchoptionen',matchCase:'Groß-Kleinschreibung beachten',matchWord:'Nur ganze Worte suchen',matchCyclic:'Zyklische Suche',replaceAll:'Alle ersetzen',replaceSuccessMsg:'%1 vorkommen ersetzt.'},table:{toolbar:'Tabelle',title:'Tabellen-Eigenschaften',menu:'Tabellen-Eigenschaften',deleteTable:'Tabelle löschen',rows:'Zeile',columns:'Spalte',border:'Rahmen',widthPx:'Pixel',widthPc:'%',widthUnit:'Breite Einheit',cellSpace:'Zellenabstand außen',cellPad:'Zellenabstand innen',caption:'Überschrift',summary:'Inhaltsübersicht',headers:'Kopfzeile',headersNone:'Keine',headersColumn:'Erste Spalte',headersRow:'Erste Zeile',headersBoth:'Beide',invalidRows:'Die Anzahl der Zeilen muß größer als 0 sein.',invalidCols:'Die Anzahl der Spalten muß größer als 0 sein..',invalidBorder:'Die Rahmenbreite muß eine Zahl sein.',invalidWidth:'Die Tabellenbreite muss eine Zahl sein.',invalidHeight:'Die Tabellenbreite muß eine Zahl sein.',invalidCellSpacing:'Der Zellenabstand außen muß eine positive Zahl sein.',invalidCellPadding:'Der Zellenabstand innen muß eine positive Zahl sein.',cell:{menu:'Zelle',insertBefore:'Zelle davor einfügen',insertAfter:'Zelle danach einfügen',deleteCell:'Zelle löschen',merge:'Zellen verbinden',mergeRight:'Nach rechts verbinden',mergeDown:'Nach unten verbinden',splitHorizontal:'Zelle horizontal teilen',splitVertical:'Zelle vertikal teilen',title:'Zellen-Eigenschaften',cellType:'Zellart',rowSpan:'Anzahl Zeilen verbinden',colSpan:'Anzahl Spalten verbinden',wordWrap:'Zeilenumbruch',hAlign:'Horizontale Ausrichtung',vAlign:'Vertikale Ausrichtung',alignBaseline:'Grundlinie',bgColor:'Hintergrundfarbe',borderColor:'Rahmenfarbe',data:'Daten',header:'Überschrift',yes:'Ja',no:'Nein',invalidWidth:'Zellenbreite muß eine Zahl sein.',invalidHeight:'Zellenhöhe muß eine Zahl sein.',invalidRowSpan:'"Anzahl Zeilen verbinden" muss eine Ganzzahl sein.',invalidColSpan:'"Anzahl Spalten verbinden" muss eine Ganzzahl sein.',chooseColor:'Wählen'},row:{menu:'Zeile',insertBefore:'Zeile oberhalb einfügen',insertAfter:'Zeile unterhalb einfügen',deleteRow:'Zeile entfernen'},column:{menu:'Spalte',insertBefore:'Spalte links davor einfügen',insertAfter:'Spalte rechts danach einfügen',deleteColumn:'Spalte löschen'}},button:{title:'Button-Eigenschaften',text:'Text (Wert)',type:'Typ',typeBtn:'Button',typeSbm:'Absenden',typeRst:'Zurücksetzen'},checkboxAndRadio:{checkboxTitle:'Checkbox-Eigenschaften',radioTitle:'Optionsfeld-Eigenschaften',value:'Wert',selected:'ausgewählt'},form:{title:'Formular-Eigenschaften',menu:'Formular-Eigenschaften',action:'Action',method:'Method',encoding:'Zeichenkodierung'},select:{title:'Auswahlfeld-Eigenschaften',selectInfo:'Info',opAvail:'Mögliche Optionen',value:'Wert',size:'Größe',lines:'Linien',chkMulti:'Erlaube Mehrfachauswahl',opText:'Text',opValue:'Wert',btnAdd:'Hinzufügen',btnModify:'Ändern',btnUp:'Hoch',btnDown:'Runter',btnSetValue:'Setze als Standardwert',btnDelete:'Entfernen'},textarea:{title:'Textfeld (mehrzeilig) Eigenschaften',cols:'Spalten',rows:'Reihen'},textfield:{title:'Textfeld (einzeilig) Eigenschaften',name:'Name',value:'Wert',charWidth:'Zeichenbreite',maxChars:'Max. Zeichen',type:'Typ',typeText:'Text',typePass:'Passwort'},hidden:{title:'Verstecktes Feld-Eigenschaften',name:'Name',value:'Wert'},image:{title:'Bild-Eigenschaften',titleButton:'Bildbutton-Eigenschaften',menu:'Bild-Eigenschaften',infoTab:'Bild-Info',btnUpload:'Zum Server senden',upload:'Hochladen',alt:'Alternativer Text',lockRatio:'Größenverhältnis beibehalten',resetSize:'Größe zurücksetzen',border:'Rahmen',hSpace:'Horizontal-Abstand',vSpace:'Vertikal-Abstand',alertUrl:'Bitte geben Sie die Bild-URL an',linkTab:'Link',button2Img:'Möchten Sie den gewählten Bild-Button in ein einfaches Bild umwandeln?',img2Button:'Möchten Sie das gewählten Bild in einen Bild-Button umwandeln?',urlMissing:'Imagequelle URL fehlt.',validateBorder:'Rahmen muß eine ganze Zahl sein.',validateHSpace:'Horizontal-Abstand muß eine ganze Zahl sein.',validateVSpace:'Vertikal-Abstand muß eine ganze Zahl sein.'},flash:{properties:'Flash-Eigenschaften',propertiesTab:'Eigenschaften',title:'Flash-Eigenschaften',chkPlay:'Automatisch Abspielen',chkLoop:'Endlosschleife',chkMenu:'Flash-Menü aktivieren',chkFull:'Vollbildmodus erlauben',scale:'Skalierung',scaleAll:'Alles anzeigen',scaleNoBorder:'Ohne Rand',scaleFit:'Passgenau',access:'Skript Zugang',accessAlways:'Immer',accessSameDomain:'Gleiche Domain',accessNever:'Nie',alignAbsBottom:'Abs Unten',alignAbsMiddle:'Abs Mitte',alignBaseline:'Baseline',alignTextTop:'Text Oben',quality:'Qualität',qualityBest:'Beste',qualityHigh:'Hoch',qualityAutoHigh:'Auto Hoch',qualityMedium:'Medium',qualityAutoLow:'Auto Niedrig',qualityLow:'Niedrig',windowModeWindow:'Fenster',windowModeOpaque:'Deckend',windowModeTransparent:'Transparent',windowMode:'Fenster Modus',flashvars:'Variablen für Flash',bgcolor:'Hintergrundfarbe',hSpace:'Horizontal-Abstand',vSpace:'Vertikal-Abstand',validateSrc:'Bitte geben Sie die Link-URL an',validateHSpace:'HSpace muss eine Zahl sein.',validateVSpace:'VSpace muss eine Zahl sein.'},spellCheck:{toolbar:'Rechtschreibprüfung',title:'Rechtschreibprüfung',notAvailable:'Entschuldigung, aber dieser Dienst steht im Moment nicht zur Verfügung.',errorLoading:'Fehler beim laden des Dienstanbieters: %s.',notInDic:'Nicht im Wörterbuch',changeTo:'Ändern in',btnIgnore:'Ignorieren',btnIgnoreAll:'Alle Ignorieren',btnReplace:'Ersetzen',btnReplaceAll:'Alle Ersetzen',btnUndo:'Rückgängig',noSuggestions:' - keine Vorschläge - ',progress:'Rechtschreibprüfung läuft...',noMispell:'Rechtschreibprüfung abgeschlossen - keine Fehler gefunden',noChanges:'Rechtschreibprüfung abgeschlossen - keine Worte geändert',oneChange:'Rechtschreibprüfung abgeschlossen - ein Wort geändert',manyChanges:'Rechtschreibprüfung abgeschlossen - %1 Wörter geändert',ieSpellDownload:'Rechtschreibprüfung nicht installiert. Möchten Sie sie jetzt herunterladen?'},smiley:{toolbar:'Smiley',title:'Smiley auswählen',options:'Smiley Optionen'},elementsPath:{eleLabel:'Elements Pfad',eleTitle:'%1 Element'},numberedlist:'Nummerierte Liste',bulletedlist:'Liste',indent:'Einzug erhöhen',outdent:'Einzug verringern',justify:{left:'Linksbündig',center:'Zentriert',right:'Rechtsbündig',block:'Blocksatz'},blockquote:'Zitatblock',clipboard:{title:'Einfügen',cutError:'Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch auszuschneiden. Bitte benutzen Sie die System-Zwischenablage über STRG-X (ausschneiden) und STRG-V (einfügen).',copyError:'Die Sicherheitseinstellungen Ihres Browsers lassen es nicht zu, den Text automatisch kopieren. Bitte benutzen Sie die System-Zwischenablage über STRG-C (kopieren).',pasteMsg:'Bitte fügen Sie den Text in der folgenden Box über die Tastatur (mit <STRONG>Strg+V</STRONG>) ein und bestätigen Sie mit <STRONG>OK</STRONG>.',securityMsg:'Aufgrund von Sicherheitsbeschränkungen Ihres Browsers kann der Editor nicht direkt auf die Zwischenablage zugreifen. Bitte fügen Sie den Inhalt erneut in diesem Fenster ein.',pasteArea:'Einfügebereich'},pastefromword:{confirmCleanup:'Der Text, den Sie einfügen möchten, scheint aus MS-Word kopiert zu sein. Möchten Sie ihn zuvor bereinigen lassen?',toolbar:'Aus MS-Word einfügen',title:'Aus MS-Word einfügen',error:'Aufgrund eines internen Fehlers war es nicht möglich die eingefügten Daten zu bereinigen'},pasteText:{button:'Als Text einfügen',title:'Als Text einfügen'},templates:{button:'Vorlagen',title:'Vorlagen',options:'Vorlagen Optionen',insertOption:'Aktuellen Inhalt ersetzen',selectPromptMsg:'Klicken Sie auf eine Vorlage, um sie im Editor zu öffnen (der aktuelle Inhalt wird dabei gelöscht!):',emptyListMsg:'(keine Vorlagen definiert)'},showBlocks:'Blöcke anzeigen',stylesCombo:{label:'Stil',panelTitle:'Formatierungenstil',panelTitle1:'Block Stilart',panelTitle2:'Inline Stilart',panelTitle3:'Objekt Stilart'},format:{label:'Format',panelTitle:'Format',tag_p:'Normal',tag_pre:'Formatiert',tag_address:'Addresse',tag_h1:'Überschrift 1',tag_h2:'Überschrift 2',tag_h3:'Überschrift 3',tag_h4:'Überschrift 4',tag_h5:'Überschrift 5',tag_h6:'Überschrift 6',tag_div:'Normal (DIV)'},div:{title:'Div Container erzeugen',toolbar:'Div Container erzeugen',cssClassInputLabel:'Stylesheet Klasse',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:'Sprachenkürzel',inlineStyleInputLabel:'Inline Stil',advisoryTitleInputLabel:'Tooltip',langDirLabel:'Sprache Richtung',langDirLTRLabel:'Links nach Rechs (LTR)',langDirRTLLabel:'Rechs nach Links (RTL)',edit:'Div bearbeiten',remove:'Div entfernen'},iframe:{title:'IFrame-Eigenschaften',toolbar:'IFrame',noUrl:'Bitte geben Sie die IFrame-URL an',scrolling:'Rollbalken anzeigen',border:'Rahmen anzeigen'},font:{label:'Schriftart',voiceLabel:'Schriftart',panelTitle:'Schriftart'},fontSize:{label:'Größe',voiceLabel:'Schrifgröße',panelTitle:'Größe'},colorButton:{textColorTitle:'Textfarbe',bgColorTitle:'Hintergrundfarbe',panelTitle:'Farben',auto:'Automatisch',more:'Weitere Farben...'},colors:{'000':'Schwarz',800000:'Kastanienbraun','8B4513':'Braun','2F4F4F':'Dunkles Schiefergrau','008080':'Blaugrün','000080':'Navy','4B0082':'Indigo',696969:'Dunkelgrau',B22222:'Ziegelrot',A52A2A:'Braun',DAA520:'Goldgelb','006400':'Dunkelgrün','40E0D0':'Türkis','0000CD':'Medium Blau',800080:'Lila',808080:'Grau',F00:'Rot',FF8C00:'Dunkelorange',FFD700:'Gold','008000':'Grün','0FF':'Cyan','00F':'Blau',EE82EE:'Hellviolett',A9A9A9:'Dunkelgrau',FFA07A:'Helles Lachsrosa',FFA500:'Orange',FFFF00:'Gelb','00FF00':'Lime',AFEEEE:'Blaß-Türkis',ADD8E6:'Hellblau',DDA0DD:'Pflaumenblau',D3D3D3:'Hellgrau',FFF0F5:'Lavendel',FAEBD7:'Antik Weiß',FFFFE0:'Hellgelb',F0FFF0:'Honigtau',F0FFFF:'Azurblau',F0F8FF:'Alice Blau',E6E6FA:'Lavendel',FFF:'Weiß'},scayt:{title:'Rechtschreibprüfung während der Texteingabe (SCAYT)',opera_title:'Nicht von Opera unterstützt',enable:'SCAYT einschalten',disable:'SCAYT ausschalten',about:'Über SCAYT',toggle:'SCAYT umschalten',options:'Optionen',langs:'Sprachen',moreSuggestions:'Mehr Vorschläge',ignore:'Ignorieren',ignoreAll:'Alle ignorieren',addWord:'Wort hinzufügen',emptyDic:'Wörterbuchname sollte leer sein.',optionsTab:'Optionen',allCaps:'Groß geschriebenen Wörter ignorieren',ignoreDomainNames:'Domain-Namen ignorieren',mixedCase:'Wörter mit gemischte Setzkasten ignorieren',mixedWithDigits:'Wörter mit Zahlen ignorieren',languagesTab:'Sprachen',dictionariesTab:'Wörterbücher',dic_field_name:'Wörterbuchname',dic_create:'Erzeugen',dic_restore:'Wiederherstellen',dic_delete:'Löschen',dic_rename:'Umbenennen',dic_info:'Anfangs wird das Benutzerwörterbuch in einem Cookie gespeichert. Allerdings sind Cookies in der Größe begrenzt. Wenn das Benutzerwörterbuch bis zu einem Punkt wächst, wo es nicht mehr in einem Cookie gespeichert werden kann, wird das Benutzerwörterbuch auf dem Server gespeichert. Um Ihr persönliches Wörterbuch auf dem Server zu speichern, müssen Sie einen Namen für das Wörterbuch angeben. Falls Sie schon ein gespeicherte Wörterbuch haben, geben Sie bitte dessen Namen ein und klicken Sie auf die Schaltfläche Wiederherstellen.',aboutTab:'Über'},about:{title:'Über CKEditor',dlgTitle:'Über CKEditor',help:'Prüfe $1 für Hilfe.',userGuide:'CKEditor Benutzerhandbuch',moreInfo:'Für Informationen über unsere Lizenzbestimmungen besuchen sie bitte unsere Webseite:',copy:'Copyright © $1. Alle Rechte vorbehalten.'},maximize:'Maximieren',minimize:'Minimieren',fakeobjects:{anchor:'Anker',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Verstecktes Feld',unknown:'Unbekanntes Objekt'},resize:'Zum Vergrößern ziehen',colordialog:{title:'Farbe wählen',options:'Farbeoptionen',highlight:'Hervorheben',selected:'Ausgewählte Farbe',clear:'Entfernen'},toolbarCollapse:'Symbolleiste einklappen',toolbarExpand:'Symbolleiste ausklappen',toolbarGroups:{document:'Dokument',clipboard:'Zwischenablage/Rückgängig',editing:'Editieren',forms:'Formularen',basicstyles:'Grundstile',paragraph:'Absatz',links:'Links',insert:'Einfügen',styles:'Stile',colors:'Farben',tools:'Werkzeuge'},bidi:{ltr:'Leserichtung von Links nach Rechts',rtl:'Leserichtung von Rechts nach Links'},docprops:{label:'Dokument-Eigenschaften',title:'Dokument-Eigenschaften',design:'Design',meta:'Metadaten',chooseColor:'Wählen',other:'<andere>',docTitle:'Seitentitel',charset:'Zeichenkodierung',charsetOther:'Andere Zeichenkodierung',charsetASCII:'ASCII',charsetCE:'Zentraleuropäisch',charsetCT:'traditionell Chinesisch (Big5)',charsetCR:'Kyrillisch',charsetGR:'Griechisch',charsetJP:'Japanisch',charsetKR:'Koreanisch',charsetTR:'Türkisch',charsetUN:'Unicode (UTF-8)',charsetWE:'Westeuropäisch',docType:'Dokumententyp',docTypeOther:'Anderer Dokumententyp',xhtmlDec:'Beziehe XHTML Deklarationen ein',bgColor:'Hintergrundfarbe',bgImage:'Hintergrundbild URL',bgFixed:'feststehender Hintergrund',txtColor:'Textfarbe',margin:'Seitenränder',marginTop:'Oben',marginLeft:'Links',marginRight:'Rechts',marginBottom:'Unten',metaKeywords:'Schlüsselwörter (durch Komma getrennt)',metaDescription:'Dokument-Beschreibung',metaAuthor:'Autor',metaCopyright:'Copyright',previewHtml:'<p>Das ist ein <strong>Beispieltext</strong>. Du schreibst in <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/el.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/el.js
index d25d42a..7bccad1 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/el.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/el.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.el={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Εργαλειοθήκες Επεξεργαστή',editor:'Επεξεργαστής Πλούσιου Κειμένου',source:'HTML κώδικας',newPage:'Νέα Σελίδα',save:'Αποθήκευση',preview:'Προεπισκόπιση',cut:'Αποκοπή',copy:'Αντιγραφή',paste:'Επικόλληση',print:'Εκτύπωση',underline:'Υπογράμμιση',bold:'Έντονα',italic:'Πλάγια',selectAll:'Επιλογή όλων',removeFormat:'Αφαίρεση Μορφοποίησης',strike:'Διαγράμμιση',subscript:'Δείκτης',superscript:'Εκθέτης',horizontalrule:'Εισαγωγή Οριζόντιας Γραμμής',pagebreak:'Εισαγωγή τέλους σελίδας',pagebreakAlt:'Αλλαγή Σελίδας',unlink:'Αφαίρεση Συνδέσμου (Link)',undo:'Αναίρεση',redo:'Επαναφορά',common:{browseServer:'Εξερεύνηση διακομιστή',url:'URL',protocol:'Πρωτόκολλο',upload:'Ανέβασμα',uploadSubmit:'Αποστολή στον Διακομιστή',image:'Εικόνα',flash:'Εισαγωγή Flash',form:'Φόρμα',checkbox:'Κουτί επιλογής',radio:'Κουμπί επιλογής',textField:'Πεδίο κειμένου',textarea:'Περιοχή κειμένου',hiddenField:'Κρυφό πεδίο',button:'Κουμπί',select:'Πεδίο επιλογής',imageButton:'Κουμπί εικόνας',notSet:'<δεν έχει ρυθμιστεί>',id:'Id',name:'Όνομα',langDir:'Κατεύθυνση κειμένου',langDirLtr:'Αριστερά προς Δεξιά (LTR)',langDirRtl:'Δεξιά προς Αριστερά (RTL)',langCode:'Κωδικός Γλώσσας',longDescr:'Αναλυτική περιγραφή URL',cssClass:'Stylesheet Classes',advisoryTitle:'Ενδεικτικός τίτλος',cssStyle:'Μορφή κειμένου',ok:'OK',cancel:'Ακύρωση',close:'Κλείσιμο',preview:'Προεπισκόπηση',generalTab:'Γενικά',advancedTab:'Για προχωρημένους',validateNumberFailed:'Αυτή η τιμή δεν είναι αριθμός.',confirmNewPage:'Οι όποιες αλλαγές στο περιεχόμενο θα χαθούν. Είσαστε σίγουροι ότι θέλετε να φορτώσετε μια νέα σελίδα;',confirmCancel:'Μερικές επιλογές έχουν αλλάξει. Είσαστε σίγουροι ότι θέλετε να κλείσετε το παράθυρο διαλόγου;',options:'Επιλογές',target:'Προορισμός',targetNew:'Νέο Παράθυρο (_blank)',targetTop:'Αρχική Περιοχή (_top)',targetSelf:'Ίδια Περιοχή (_self)',targetParent:'Γονεϊκό Παράθυρο (_parent)',langDirLTR:'Αριστερά προς Δεξιά (LTR)',langDirRTL:'Δεξιά προς Αριστερά (RTL)',styles:'Μορφή',cssClasses:'Stylesheet Classes',width:'Πλάτος',height:'Ύψος',align:'Στοίχιση',alignLeft:'Αριστερά',alignRight:'Δεξιά',alignCenter:'Κέντρο',alignTop:'Πάνω',alignMiddle:'Μέση',alignBottom:'Κάτω',invalidHeight:'Το ύψος πρέπει να είναι ένας αριθμός.',invalidWidth:'Το πλάτος πρέπει να είναι ένας αριθμός.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Επιλογές Αναδυόμενου Μενού'},specialChar:{toolbar:'Εισαγωγή Ειδικού Χαρακτήρα',title:'Επιλέξτε έναν Ειδικό Χαρακτήρα',options:'Επιλογές Ειδικών Χαρακτήρων'},link:{toolbar:'Σύνδεσμος',other:'<άλλο>',menu:'Επεξεργασία Συνδέσμου',title:'Σύνδεσμος',info:'Πληροφορίες Συνδέσμου',target:'Παράθυρο Προορισμού',upload:'Ανέβασμα',advanced:'Για προχωρημένους',type:'Τύπος Συνδέσμου',toUrl:'URL',toAnchor:'Άγκυρα σε αυτή τη σελίδα',toEmail:'E-Mail',targetFrame:'<πλαίσιο>',targetPopup:'<αναδυόμενο παράθυρο>',targetFrameName:'Όνομα Παραθύρου Προορισμού',targetPopupName:'Όνομα Αναδυόμενου Παραθύρου',popupFeatures:'Επιλογές Αναδυόμενου Παραθύρου',popupResizable:'Προσαρμοζόμενο Μέγεθος',popupStatusBar:'Γραμμή Κατάστασης',popupLocationBar:'Γραμμή Τοποθεσίας',popupToolbar:'Εργαλειοθήκη',popupMenuBar:'Γραμμή Επιλογών',popupFullScreen:'Πλήρης Οθόνη (IE)',popupScrollBars:'Μπάρες Κύλισης',popupDependent:'Εξαρτημένο (Netscape)',popupLeft:'Θέση Αριστερά',popupTop:'Θέση Πάνω',id:'Id',langDir:'Κατεύθυνση Κειμένου',langDirLTR:'Αριστερά προς Δεξιά (LTR)',langDirRTL:'Δεξιά προς Αριστερά (RTL)',acccessKey:'Συντόμευση',name:'Όνομα',langCode:'Κατεύθυνση Κειμένου',tabIndex:'Σειρά Μεταπήδησης',advisoryTitle:'Ενδεικτικός Τίτλος',advisoryContentType:'Ενδεικτικός Τύπος Περιεχομένου',cssClasses:'Stylesheet Classes',charset:'Κωδικοποίηση Χαρακτήρων Προσαρτημένης Πηγής',styles:'Μορφή',rel:'Σχέση',selectAnchor:'Επιλέξτε μια άγκυρα',anchorName:'Βάσει του Ονόματος της άγκυρας',anchorId:'Βάσει του Element Id',emailAddress:'Διεύθυνση e-mail',emailSubject:'Θέμα Μηνύματος',emailBody:'Κείμενο Μηνύματος',noAnchors:'(Δεν υπάρχουν άγκυρες στο κείμενο)',noUrl:'Εισάγετε την τοποθεσία (URL) του υπερσυνδέσμου (Link)',noEmail:'Εισάγετε την διεύθυνση ηλεκτρονικού ταχυδρομείου'},anchor:{toolbar:'Εισαγωγή/επεξεργασία Άγκυρας',menu:'Ιδιότητες άγκυρας',title:'Ιδιότητες άγκυρας',name:'Όνομα άγκυρας',errorName:'Παρακαλούμε εισάγετε όνομα άγκυρας',remove:'Αφαίρεση Άγκυρας'},list:{numberedTitle:'Ιδιότητες Αριθμημένης Λίστας ',bulletedTitle:'Ιδιότητες Λίστας Σημείων',type:'Τύπος',start:'Εκκίνηση',validateStartNumber:'Ο αριθμός εκκίνησης της αρίθμησης πρέπει να είναι ακέραιος αριθμός.',circle:'Κύκλος',disc:'Δίσκος',square:'Τετράγωνο',none:'Τίποτα',notset:'<δεν έχει οριστεί>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Δεκαδικός (1, 2, 3, κτλ)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Αναζήτηση και Αντικατάσταση',find:'Αναζήτηση',replace:'Αντικατάσταση',findWhat:'Αναζήτηση για:',replaceWith:'Αντικατάσταση με:',notFoundMsg:'Το κείμενο δεν βρέθηκε.',findOptions:'Find Options',matchCase:'Έλεγχος πεζών/κεφαλαίων',matchWord:'Εύρεση πλήρους λέξης',matchCyclic:'Match cyclic',replaceAll:'Αντικατάσταση Όλων',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Πίνακας',title:'Ιδιότητες Πίνακα',menu:'Ιδιότητες Πίνακα',deleteTable:'Διαγραφή πίνακα',rows:'Γραμμές',columns:'Κολώνες',border:'Πάχος Περιγράμματος',widthPx:'pixels',widthPc:'τοις εκατό',widthUnit:'μονάδα πλάτους',cellSpace:'Διάστημα κελιών',cellPad:'Γέμισμα κελιών',caption:'Λεζάντα',summary:'Περίληψη',headers:'Κεφαλίδες',headersNone:'Κανένα',headersColumn:'Πρώτη Στήλη',headersRow:'Πρώτη Σειρά',headersBoth:'Και τα δύο',invalidRows:'Ο αριθμός των σειρών πρέπει να είναι μεγαλύτερος από 0.',invalidCols:'Ο αριθμός των στηλών πρέπει να είναι μεγαλύτερος από 0.',invalidBorder:'Το πάχος του περιγράμματος πρέπει να είναι ένας αριθμός.',invalidWidth:'Το πλάτος του πίνακα πρέπει να είναι ένας αριθμός.',invalidHeight:'Το ύψος του πίνακα πρέπει να είναι ένας αριθμός.',invalidCellSpacing:'Η απόσταση μεταξύ των κελιών πρέπει να είναι ένας θετικός αριθμός.',invalidCellPadding:'Το γέμισμα μέσα στα κελιά πρέπει να είναι ένας θετικός αριθμός.',cell:{menu:'Κελί',insertBefore:'Εισαγωγή Κελιού Πριν',insertAfter:'Εισαγωγή Κελιού Μετά',deleteCell:'Διαγραφή Κελιών',merge:'Ενοποίηση Κελιών',mergeRight:'Συγχώνευση Με Δεξιά',mergeDown:'Συγχώνευση Με Κάτω',splitHorizontal:'Οριζόντιο Μοίρασμα Κελιού',splitVertical:'Κατακόρυφο Μοίρασμα Κελιού',title:'Ιδιότητες Κελιού',cellType:'Τύπος Κελιού',rowSpan:'Εύρος Σειρών',colSpan:'Εύρος Στηλών',wordWrap:'Word Wrap',hAlign:'Οριζόντια Στοίχιση',vAlign:'Κάθετη Στοίχιση',alignBaseline:'Baseline',bgColor:'Χρώμα Φόντου',borderColor:'Χρώμα Περιγράμματος',data:'Δεδομένα',header:'Κεφαλίδα',yes:'Ναι',no:'Όχι',invalidWidth:'Το πλάτος του κελιού πρέπει να είναι ένας αριθμός.',invalidHeight:'Το ύψος του κελιού πρέπει να είναι ένας αριθμός.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Επιλέξτε'},row:{menu:'Σειρά',insertBefore:'Εισαγωγή Σειράς Από Πάνω',insertAfter:'Εισαγωγή Σειράς Από Κάτω',deleteRow:'Διαγραφή Γραμμών'},column:{menu:'Στήλη',insertBefore:'Εισαγωγή Στήλης Πριν',insertAfter:'Εισαγωγή Σειράς Μετά',deleteColumn:'Διαγραφή Κολωνών'}},button:{title:'Ιδιότητες Κουμπιού',text:'Κείμενο (Τιμή)',type:'Τύπος',typeBtn:'Κουμπί',typeSbm:'Υποβολή',typeRst:'Επαναφορά'},checkboxAndRadio:{checkboxTitle:'Ιδιότητες Κουτιού Επιλογής',radioTitle:'Ιδιότητες Κουμπιού Επιλογής',value:'Τιμή',selected:'Επιλεγμένο'},form:{title:'Ιδιότητες Φόρμας',menu:'Ιδιότητες Φόρμας',action:'Δράση',method:'Μέθοδος',encoding:'Κωδικοποίηση'},select:{title:'Ιδιότητες Πεδίου Επιλογής',selectInfo:'Πληροφορίες Πεδίου Επιλογής',opAvail:'Διαθέσιμες Επιλογές',value:'Τιμή',size:'Μέγεθος',lines:'γραμμές',chkMulti:'Να επιτρέπονται οι πολλαπλές επιλογές',opText:'Κείμενο',opValue:'Τιμή',btnAdd:'Προσθήκη',btnModify:'Τροποποίηση',btnUp:'Πάνω',btnDown:'Κάτω',btnSetValue:'Προεπιλογή',btnDelete:'Διαγραφή'},textarea:{title:'Ιδιότητες Περιοχής Κειμένου',cols:'Στήλες',rows:'Σειρές'},textfield:{title:'Ιδιότητες Πεδίου Κειμένου',name:'Όνομα',value:'Τιμή',charWidth:'Πλάτος Χαρακτήρων',maxChars:'Μέγιστοι χαρακτήρες',type:'Τύπος',typeText:'Κείμενο',typePass:'Κωδικός'},hidden:{title:'Ιδιότητες Κρυφού Πεδίου',name:'Όνομα',value:'Τιμή'},image:{title:'Ιδιότητες Εικόνας',titleButton:'Ιδιότητες Κουμπιού Εικόνας',menu:'Ιδιότητες Εικόνας',infoTab:'Πληροφορίες Εικόνας',btnUpload:'Αποστολή στον Διακομιστή',upload:'Ανέβασμα',alt:'Εναλλακτικό Κείμενο',lockRatio:'Κλείδωμα Αναλογίας',resetSize:'Επαναφορά Αρχικού Μεγέθους',border:'Περίγραμμα',hSpace:'Οριζόντιο Διάστημα',vSpace:'Κάθετο Διάστημα',alertUrl:'Εισάγετε την τοποθεσία (URL) της εικόνας',linkTab:'Σύνδεσμος',button2Img:'Θέλετε να μετατρέψετε το επιλεγμένο κουμπί εικόνας σε απλή εικόνα;',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Ιδιότητες Flash',propertiesTab:'Ιδιότητες',title:'Ιδιότητες Flash',chkPlay:'Αυτόματη Εκτέλεση',chkLoop:'Επανάληψη',chkMenu:'Ενεργοποίηση Flash Menu',chkFull:'Allow Fullscreen',scale:'Μεγέθυνση',scaleAll:'Εμφάνιση όλων',scaleNoBorder:'Χωρίς Περίγραμμα',scaleFit:'Ακριβές Μέγεθος',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Απόλυτα Κάτω',alignAbsMiddle:'Απόλυτα στη Μέση',alignBaseline:'Γραμμή Βάσης',alignTextTop:'Κορυφή Κειμένου',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Χρώμα Υποβάθρου',hSpace:'Οριζόντιο Διάστημα',vSpace:'Κάθετο Διάστημα',validateSrc:'Εισάγετε την τοποθεσία (URL) του υπερσυνδέσμου (Link)',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Ορθογραφικός Έλεγχος',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Δεν υπάρχει στο λεξικό',changeTo:'Αλλαγή σε',btnIgnore:'Αγνόηση',btnIgnoreAll:'Αγνόηση όλων',btnReplace:'Αντικατάσταση',btnReplaceAll:'Αντικατάσταση όλων',btnUndo:'Αναίρεση',noSuggestions:'- Δεν υπάρχουν προτάσεις -',progress:'Γίνεται ορθογραφικός έλεγχος...',noMispell:'Ο ορθογραφικός έλεγχος ολοκληρώθηκε: Δεν βρέθηκαν λάθη',noChanges:'Ο ορθογραφικός έλεγχος ολοκληρώθηκε: Δεν άλλαξαν λέξεις',oneChange:'Ο ορθογραφικός έλεγχος ολοκληρώθηκε: Άλλαξε μια λέξη',manyChanges:'Ο ορθογραφικός έλεγχος ολοκληρώθηκε: Άλλαξαν %1 λέξεις',ieSpellDownload:'Δεν υπάρχει εγκατεστημένος ορθογράφος. Θέλετε να τον κατεβάσετε τώρα;'},smiley:{toolbar:'Smiley',title:'Επιλέξτε ένα Smiley',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Εισαγωγή/Απομάκρυνση Αριθμημένης Λίστας',bulletedlist:'Εισαγωγή/Απομάκρυνση Λίστας Κουκκίδων',indent:'Αύξηση Εσοχής',outdent:'Μείωση Εσοχής',justify:{left:'Στοίχιση Αριστερά',center:'Στοίχιση στο Κέντρο',right:'Στοίχιση Δεξιά',block:'Πλήρης Στοίχιση'},blockquote:'Περιοχή Παράθεσης',clipboard:{title:'Επικόλληση',cutError:'Οι ρυθμίσεις ασφαλείας του φυλλομετρητή σας δεν επιτρέπουν την επιλεγμένη εργασία αποκοπής. Χρησιμοποιείστε το πληκτρολόγιο (Ctrl/Cmd+X).',copyError:'Οι ρυθμίσεις ασφαλείας του φυλλομετρητή σας δεν επιτρέπουν την επιλεγμένη εργασία αντιγραφής. Χρησιμοποιείστε το πληκτρολόγιο (Ctrl/Cmd+C).',pasteMsg:'Παρακαλώ επικολήστε στο ακόλουθο κουτί χρησιμοποιόντας το πληκτρολόγιο (<strong>Ctrl/Cmd+V</strong>) και πατήστε OK.',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Επικόλληση από το Word',title:'Επικόλληση από το Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Επικόλληση ως Απλό Κείμενο',title:'Επικόλληση ως Απλό Κείμενο'},templates:{button:'Πρότυπα',title:'Πρότυπα Περιεχομένου',options:'Template Options',insertOption:'Αντικατάσταση υπάρχοντων περιεχομένων',selectPromptMsg:'Παρακαλώ επιλέξτε πρότυπο για εισαγωγή στο πρόγραμμα',emptyListMsg:'(Δεν έχουν καθοριστεί πρότυπα)'},showBlocks:'Προβολή Περιοχών',stylesCombo:{label:'Μορφές',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Μορφοποίηση',panelTitle:'Μορφοποίηση Παραγράφου',tag_p:'Κανονικό',tag_pre:'Μορφοποιημένο',tag_address:'Διεύθυνση',tag_h1:'Επικεφαλίδα 1',tag_h2:'Επικεφαλίδα 2',tag_h3:'Επικεφαλίδα 3',tag_h4:'Επικεφαλίδα 4',tag_h5:'Επικεφαλίδα 5',tag_h6:'Επικεφαλίδα 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Γραμματοσειρά',voiceLabel:'Font',panelTitle:'Όνομα Γραμματοσειράς'},fontSize:{label:'Μέγεθος',voiceLabel:'Font Size',panelTitle:'Μέγεθος Γραμματοσειράς'},colorButton:{textColorTitle:'Χρώμα Κειμένου',bgColorTitle:'Χρώμα Φόντου',panelTitle:'Colors',auto:'Αυτόματα',more:'Περισσότερα χρώματα...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Μεγιστοποίηση',minimize:'Ελαχιστοποίηση',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Σύρσιμο για αλλαγή μεγέθους',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Σύμπτηξη Εργαλειοθήκης',toolbarExpand:'Ανάπτυξη Εργαλειοθήκης',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Ιδιότητες Εγγράφου',title:'Ιδιότητες Εγγράφου',design:'Design',meta:'Δεδομένα Meta',chooseColor:'Choose',other:'Άλλο...',docTitle:'Τίτλος Σελίδας',charset:'Κωδικοποίηση Χαρακτήρων',charsetOther:'Άλλη Κωδικοποίηση Χαρακτήρων',charsetASCII:'ASCII',charsetCE:'Κεντρικής Ευρώπης',charsetCT:'Παραδοσιακά κινέζικα (Big5)',charsetCR:'Κυριλλική',charsetGR:'Ελληνική',charsetJP:'Ιαπωνική',charsetKR:'Κορεάτικη',charsetTR:'Τουρκική',charsetUN:'Διεθνής (UTF-8)',charsetWE:'Δυτικής Ευρώπης',docType:'Επικεφαλίδα τύπου εγγράφου',docTypeOther:'Άλλη επικεφαλίδα τύπου εγγράφου',xhtmlDec:'Να συμπεριληφθούν οι δηλώσεις XHTML',bgColor:'Χρώμα φόντου',bgImage:'Διεύθυνση εικόνας φόντου',bgFixed:'Φόντο χωρίς κύλιση',txtColor:'Χρώμα Γραμμάτων',margin:'Περιθώρια σελίδας',marginTop:'Κορυφή',marginLeft:'Αριστερά',marginRight:'Δεξιά',marginBottom:'Κάτω',metaKeywords:'Λέξεις κλειδιά δείκτες εγγράφου (διαχωρισμός με κόμμα)',metaDescription:'Περιγραφή εγγράφου',metaAuthor:'Συγγραφέας',metaCopyright:'Πνευματικά Δικαιώματα',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.el={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Εργαλειοθήκες Επεξεργαστή',editor:'Επεξεργαστής Πλούσιου Κειμένου',source:'HTML κώδικας',newPage:'Νέα Σελίδα',save:'Αποθήκευση',preview:'Προεπισκόπιση',cut:'Αποκοπή',copy:'Αντιγραφή',paste:'Επικόλληση',print:'Εκτύπωση',underline:'Υπογράμμιση',bold:'Έντονα',italic:'Πλάγια',selectAll:'Επιλογή όλων',removeFormat:'Αφαίρεση Μορφοποίησης',strike:'Διαγράμμιση',subscript:'Δείκτης',superscript:'Εκθέτης',horizontalrule:'Εισαγωγή Οριζόντιας Γραμμής',pagebreak:'Εισαγωγή τέλους σελίδας',pagebreakAlt:'Αλλαγή Σελίδας',unlink:'Αφαίρεση Συνδέσμου (Link)',undo:'Αναίρεση',redo:'Επαναφορά',common:{browseServer:'Εξερεύνηση διακομιστή',url:'URL',protocol:'Πρωτόκολλο',upload:'Ανέβασμα',uploadSubmit:'Αποστολή στον Διακομιστή',image:'Εικόνα',flash:'Εισαγωγή Flash',form:'Φόρμα',checkbox:'Κουτί επιλογής',radio:'Κουμπί επιλογής',textField:'Πεδίο κειμένου',textarea:'Περιοχή κειμένου',hiddenField:'Κρυφό πεδίο',button:'Κουμπί',select:'Πεδίο επιλογής',imageButton:'Κουμπί εικόνας',notSet:'<δεν έχει ρυθμιστεί>',id:'Id',name:'Όνομα',langDir:'Κατεύθυνση κειμένου',langDirLtr:'Αριστερά προς Δεξιά (LTR)',langDirRtl:'Δεξιά προς Αριστερά (RTL)',langCode:'Κωδικός Γλώσσας',longDescr:'Αναλυτική περιγραφή URL',cssClass:'Stylesheet Classes',advisoryTitle:'Ενδεικτικός τίτλος',cssStyle:'Μορφή κειμένου',ok:'OK',cancel:'Ακύρωση',close:'Κλείσιμο',preview:'Προεπισκόπηση',generalTab:'Γενικά',advancedTab:'Για προχωρημένους',validateNumberFailed:'Αυτή η τιμή δεν είναι αριθμός.',confirmNewPage:'Οι όποιες αλλαγές στο περιεχόμενο θα χαθούν. Είσαστε σίγουροι ότι θέλετε να φορτώσετε μια νέα σελίδα;',confirmCancel:'Μερικές επιλογές έχουν αλλάξει. Είσαστε σίγουροι ότι θέλετε να κλείσετε το παράθυρο διαλόγου;',options:'Επιλογές',target:'Προορισμός',targetNew:'Νέο Παράθυρο (_blank)',targetTop:'Αρχική Περιοχή (_top)',targetSelf:'Ίδια Περιοχή (_self)',targetParent:'Γονεϊκό Παράθυρο (_parent)',langDirLTR:'Αριστερά προς Δεξιά (LTR)',langDirRTL:'Δεξιά προς Αριστερά (RTL)',styles:'Μορφή',cssClasses:'Stylesheet Classes',width:'Πλάτος',height:'Ύψος',align:'Στοίχιση',alignLeft:'Αριστερά',alignRight:'Δεξιά',alignCenter:'Κέντρο',alignTop:'Πάνω',alignMiddle:'Μέση',alignBottom:'Κάτω',invalidHeight:'Το ύψος πρέπει να είναι ένας αριθμός.',invalidWidth:'Το πλάτος πρέπει να είναι ένας αριθμός.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Επιλογές Αναδυόμενου Μενού'},specialChar:{toolbar:'Εισαγωγή Ειδικού Χαρακτήρα',title:'Επιλέξτε έναν Ειδικό Χαρακτήρα',options:'Επιλογές Ειδικών Χαρακτήρων'},link:{toolbar:'Σύνδεσμος',other:'<άλλο>',menu:'Επεξεργασία Συνδέσμου',title:'Σύνδεσμος',info:'Πληροφορίες Συνδέσμου',target:'Παράθυρο Προορισμού',upload:'Ανέβασμα',advanced:'Για προχωρημένους',type:'Τύπος Συνδέσμου',toUrl:'URL',toAnchor:'Άγκυρα σε αυτή τη σελίδα',toEmail:'E-Mail',targetFrame:'<πλαίσιο>',targetPopup:'<αναδυόμενο παράθυρο>',targetFrameName:'Όνομα Παραθύρου Προορισμού',targetPopupName:'Όνομα Αναδυόμενου Παραθύρου',popupFeatures:'Επιλογές Αναδυόμενου Παραθύρου',popupResizable:'Προσαρμοζόμενο Μέγεθος',popupStatusBar:'Γραμμή Κατάστασης',popupLocationBar:'Γραμμή Τοποθεσίας',popupToolbar:'Εργαλειοθήκη',popupMenuBar:'Γραμμή Επιλογών',popupFullScreen:'Πλήρης Οθόνη (IE)',popupScrollBars:'Μπάρες Κύλισης',popupDependent:'Εξαρτημένο (Netscape)',popupLeft:'Θέση Αριστερά',popupTop:'Θέση Πάνω',id:'Id',langDir:'Κατεύθυνση Κειμένου',langDirLTR:'Αριστερά προς Δεξιά (LTR)',langDirRTL:'Δεξιά προς Αριστερά (RTL)',acccessKey:'Συντόμευση',name:'Όνομα',langCode:'Κατεύθυνση Κειμένου',tabIndex:'Σειρά Μεταπήδησης',advisoryTitle:'Ενδεικτικός Τίτλος',advisoryContentType:'Ενδεικτικός Τύπος Περιεχομένου',cssClasses:'Stylesheet Classes',charset:'Κωδικοποίηση Χαρακτήρων Προσαρτημένης Πηγής',styles:'Μορφή',rel:'Σχέση',selectAnchor:'Επιλέξτε μια άγκυρα',anchorName:'Βάσει του Ονόματος της άγκυρας',anchorId:'Βάσει του Element Id',emailAddress:'Διεύθυνση e-mail',emailSubject:'Θέμα Μηνύματος',emailBody:'Κείμενο Μηνύματος',noAnchors:'(Δεν υπάρχουν άγκυρες στο κείμενο)',noUrl:'Εισάγετε την τοποθεσία (URL) του υπερσυνδέσμου (Link)',noEmail:'Εισάγετε την διεύθυνση ηλεκτρονικού ταχυδρομείου'},anchor:{toolbar:'Εισαγωγή/επεξεργασία Άγκυρας',menu:'Ιδιότητες άγκυρας',title:'Ιδιότητες άγκυρας',name:'Όνομα άγκυρας',errorName:'Παρακαλούμε εισάγετε όνομα άγκυρας',remove:'Αφαίρεση Άγκυρας'},list:{numberedTitle:'Ιδιότητες Αριθμημένης Λίστας ',bulletedTitle:'Ιδιότητες Λίστας Σημείων',type:'Τύπος',start:'Εκκίνηση',validateStartNumber:'Ο αριθμός εκκίνησης της αρίθμησης πρέπει να είναι ακέραιος αριθμός.',circle:'Κύκλος',disc:'Δίσκος',square:'Τετράγωνο',none:'Τίποτα',notset:'<δεν έχει οριστεί>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Δεκαδικός (1, 2, 3, κτλ)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Αναζήτηση και Αντικατάσταση',find:'Αναζήτηση',replace:'Αντικατάσταση',findWhat:'Αναζήτηση για:',replaceWith:'Αντικατάσταση με:',notFoundMsg:'Το κείμενο δεν βρέθηκε.',findOptions:'Find Options',matchCase:'Έλεγχος πεζών/κεφαλαίων',matchWord:'Εύρεση πλήρους λέξης',matchCyclic:'Match cyclic',replaceAll:'Αντικατάσταση Όλων',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Πίνακας',title:'Ιδιότητες Πίνακα',menu:'Ιδιότητες Πίνακα',deleteTable:'Διαγραφή πίνακα',rows:'Γραμμές',columns:'Κολώνες',border:'Πάχος Περιγράμματος',widthPx:'pixels',widthPc:'τοις εκατό',widthUnit:'μονάδα πλάτους',cellSpace:'Διάστημα κελιών',cellPad:'Γέμισμα κελιών',caption:'Λεζάντα',summary:'Περίληψη',headers:'Κεφαλίδες',headersNone:'Κανένα',headersColumn:'Πρώτη Στήλη',headersRow:'Πρώτη Σειρά',headersBoth:'Και τα δύο',invalidRows:'Ο αριθμός των σειρών πρέπει να είναι μεγαλύτερος από 0.',invalidCols:'Ο αριθμός των στηλών πρέπει να είναι μεγαλύτερος από 0.',invalidBorder:'Το πάχος του περιγράμματος πρέπει να είναι ένας αριθμός.',invalidWidth:'Το πλάτος του πίνακα πρέπει να είναι ένας αριθμός.',invalidHeight:'Το ύψος του πίνακα πρέπει να είναι ένας αριθμός.',invalidCellSpacing:'Η απόσταση μεταξύ των κελιών πρέπει να είναι ένας θετικός αριθμός.',invalidCellPadding:'Το γέμισμα μέσα στα κελιά πρέπει να είναι ένας θετικός αριθμός.',cell:{menu:'Κελί',insertBefore:'Εισαγωγή Κελιού Πριν',insertAfter:'Εισαγωγή Κελιού Μετά',deleteCell:'Διαγραφή Κελιών',merge:'Ενοποίηση Κελιών',mergeRight:'Συγχώνευση Με Δεξιά',mergeDown:'Συγχώνευση Με Κάτω',splitHorizontal:'Οριζόντιο Μοίρασμα Κελιού',splitVertical:'Κατακόρυφο Μοίρασμα Κελιού',title:'Ιδιότητες Κελιού',cellType:'Τύπος Κελιού',rowSpan:'Εύρος Σειρών',colSpan:'Εύρος Στηλών',wordWrap:'Word Wrap',hAlign:'Οριζόντια Στοίχιση',vAlign:'Κάθετη Στοίχιση',alignBaseline:'Baseline',bgColor:'Χρώμα Φόντου',borderColor:'Χρώμα Περιγράμματος',data:'Δεδομένα',header:'Κεφαλίδα',yes:'Ναι',no:'Όχι',invalidWidth:'Το πλάτος του κελιού πρέπει να είναι ένας αριθμός.',invalidHeight:'Το ύψος του κελιού πρέπει να είναι ένας αριθμός.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Επιλέξτε'},row:{menu:'Σειρά',insertBefore:'Εισαγωγή Σειράς Από Πάνω',insertAfter:'Εισαγωγή Σειράς Από Κάτω',deleteRow:'Διαγραφή Γραμμών'},column:{menu:'Στήλη',insertBefore:'Εισαγωγή Στήλης Πριν',insertAfter:'Εισαγωγή Σειράς Μετά',deleteColumn:'Διαγραφή Κολωνών'}},button:{title:'Ιδιότητες Κουμπιού',text:'Κείμενο (Τιμή)',type:'Τύπος',typeBtn:'Κουμπί',typeSbm:'Υποβολή',typeRst:'Επαναφορά'},checkboxAndRadio:{checkboxTitle:'Ιδιότητες Κουτιού Επιλογής',radioTitle:'Ιδιότητες Κουμπιού Επιλογής',value:'Τιμή',selected:'Επιλεγμένο'},form:{title:'Ιδιότητες Φόρμας',menu:'Ιδιότητες Φόρμας',action:'Δράση',method:'Μέθοδος',encoding:'Κωδικοποίηση'},select:{title:'Ιδιότητες Πεδίου Επιλογής',selectInfo:'Πληροφορίες Πεδίου Επιλογής',opAvail:'Διαθέσιμες Επιλογές',value:'Τιμή',size:'Μέγεθος',lines:'γραμμές',chkMulti:'Να επιτρέπονται οι πολλαπλές επιλογές',opText:'Κείμενο',opValue:'Τιμή',btnAdd:'Προσθήκη',btnModify:'Τροποποίηση',btnUp:'Πάνω',btnDown:'Κάτω',btnSetValue:'Προεπιλογή',btnDelete:'Διαγραφή'},textarea:{title:'Ιδιότητες Περιοχής Κειμένου',cols:'Στήλες',rows:'Σειρές'},textfield:{title:'Ιδιότητες Πεδίου Κειμένου',name:'Όνομα',value:'Τιμή',charWidth:'Πλάτος Χαρακτήρων',maxChars:'Μέγιστοι χαρακτήρες',type:'Τύπος',typeText:'Κείμενο',typePass:'Κωδικός'},hidden:{title:'Ιδιότητες Κρυφού Πεδίου',name:'Όνομα',value:'Τιμή'},image:{title:'Ιδιότητες Εικόνας',titleButton:'Ιδιότητες Κουμπιού Εικόνας',menu:'Ιδιότητες Εικόνας',infoTab:'Πληροφορίες Εικόνας',btnUpload:'Αποστολή στον Διακομιστή',upload:'Ανέβασμα',alt:'Εναλλακτικό Κείμενο',lockRatio:'Κλείδωμα Αναλογίας',resetSize:'Επαναφορά Αρχικού Μεγέθους',border:'Περίγραμμα',hSpace:'Οριζόντιο Διάστημα',vSpace:'Κάθετο Διάστημα',alertUrl:'Εισάγετε την τοποθεσία (URL) της εικόνας',linkTab:'Σύνδεσμος',button2Img:'Θέλετε να μετατρέψετε το επιλεγμένο κουμπί εικόνας σε απλή εικόνα;',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Ιδιότητες Flash',propertiesTab:'Ιδιότητες',title:'Ιδιότητες Flash',chkPlay:'Αυτόματη Εκτέλεση',chkLoop:'Επανάληψη',chkMenu:'Ενεργοποίηση Flash Menu',chkFull:'Allow Fullscreen',scale:'Μεγέθυνση',scaleAll:'Εμφάνιση όλων',scaleNoBorder:'Χωρίς Περίγραμμα',scaleFit:'Ακριβές Μέγεθος',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Απόλυτα Κάτω',alignAbsMiddle:'Απόλυτα στη Μέση',alignBaseline:'Γραμμή Βάσης',alignTextTop:'Κορυφή Κειμένου',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Χρώμα Υποβάθρου',hSpace:'Οριζόντιο Διάστημα',vSpace:'Κάθετο Διάστημα',validateSrc:'Εισάγετε την τοποθεσία (URL) του υπερσυνδέσμου (Link)',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Ορθογραφικός Έλεγχος',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Δεν υπάρχει στο λεξικό',changeTo:'Αλλαγή σε',btnIgnore:'Αγνόηση',btnIgnoreAll:'Αγνόηση όλων',btnReplace:'Αντικατάσταση',btnReplaceAll:'Αντικατάσταση όλων',btnUndo:'Αναίρεση',noSuggestions:'- Δεν υπάρχουν προτάσεις -',progress:'Γίνεται ορθογραφικός έλεγχος...',noMispell:'Ο ορθογραφικός έλεγχος ολοκληρώθηκε: Δεν βρέθηκαν λάθη',noChanges:'Ο ορθογραφικός έλεγχος ολοκληρώθηκε: Δεν άλλαξαν λέξεις',oneChange:'Ο ορθογραφικός έλεγχος ολοκληρώθηκε: Άλλαξε μια λέξη',manyChanges:'Ο ορθογραφικός έλεγχος ολοκληρώθηκε: Άλλαξαν %1 λέξεις',ieSpellDownload:'Δεν υπάρχει εγκατεστημένος ορθογράφος. Θέλετε να τον κατεβάσετε τώρα;'},smiley:{toolbar:'Smiley',title:'Επιλέξτε ένα Smiley',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Εισαγωγή/Απομάκρυνση Αριθμημένης Λίστας',bulletedlist:'Εισαγωγή/Απομάκρυνση Λίστας Κουκκίδων',indent:'Αύξηση Εσοχής',outdent:'Μείωση Εσοχής',justify:{left:'Στοίχιση Αριστερά',center:'Στοίχιση στο Κέντρο',right:'Στοίχιση Δεξιά',block:'Πλήρης Στοίχιση'},blockquote:'Περιοχή Παράθεσης',clipboard:{title:'Επικόλληση',cutError:'Οι ρυθμίσεις ασφαλείας του φυλλομετρητή σας δεν επιτρέπουν την επιλεγμένη εργασία αποκοπής. Χρησιμοποιείστε το πληκτρολόγιο (Ctrl/Cmd+X).',copyError:'Οι ρυθμίσεις ασφαλείας του φυλλομετρητή σας δεν επιτρέπουν την επιλεγμένη εργασία αντιγραφής. Χρησιμοποιείστε το πληκτρολόγιο (Ctrl/Cmd+C).',pasteMsg:'Παρακαλώ επικολήστε στο ακόλουθο κουτί χρησιμοποιόντας το πληκτρολόγιο (<strong>Ctrl/Cmd+V</strong>) και πατήστε OK.',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Επικόλληση από το Word',title:'Επικόλληση από το Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Επικόλληση ως Απλό Κείμενο',title:'Επικόλληση ως Απλό Κείμενο'},templates:{button:'Πρότυπα',title:'Πρότυπα Περιεχομένου',options:'Template Options',insertOption:'Αντικατάσταση υπάρχοντων περιεχομένων',selectPromptMsg:'Παρακαλώ επιλέξτε πρότυπο για εισαγωγή στο πρόγραμμα',emptyListMsg:'(Δεν έχουν καθοριστεί πρότυπα)'},showBlocks:'Προβολή Περιοχών',stylesCombo:{label:'Μορφές',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Μορφοποίηση',panelTitle:'Μορφοποίηση Παραγράφου',tag_p:'Κανονικό',tag_pre:'Μορφοποιημένο',tag_address:'Διεύθυνση',tag_h1:'Επικεφαλίδα 1',tag_h2:'Επικεφαλίδα 2',tag_h3:'Επικεφαλίδα 3',tag_h4:'Επικεφαλίδα 4',tag_h5:'Επικεφαλίδα 5',tag_h6:'Επικεφαλίδα 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Γραμματοσειρά',voiceLabel:'Font',panelTitle:'Όνομα Γραμματοσειράς'},fontSize:{label:'Μέγεθος',voiceLabel:'Font Size',panelTitle:'Μέγεθος Γραμματοσειράς'},colorButton:{textColorTitle:'Χρώμα Κειμένου',bgColorTitle:'Χρώμα Φόντου',panelTitle:'Colors',auto:'Αυτόματα',more:'Περισσότερα χρώματα...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Μεγιστοποίηση',minimize:'Ελαχιστοποίηση',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Σύρσιμο για αλλαγή μεγέθους',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Σύμπτηξη Εργαλειοθήκης',toolbarExpand:'Ανάπτυξη Εργαλειοθήκης',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Ιδιότητες Εγγράφου',title:'Ιδιότητες Εγγράφου',design:'Design',meta:'Δεδομένα Meta',chooseColor:'Choose',other:'Άλλο...',docTitle:'Τίτλος Σελίδας',charset:'Κωδικοποίηση Χαρακτήρων',charsetOther:'Άλλη Κωδικοποίηση Χαρακτήρων',charsetASCII:'ASCII',charsetCE:'Κεντρικής Ευρώπης',charsetCT:'Παραδοσιακά κινέζικα (Big5)',charsetCR:'Κυριλλική',charsetGR:'Ελληνική',charsetJP:'Ιαπωνική',charsetKR:'Κορεάτικη',charsetTR:'Τουρκική',charsetUN:'Διεθνής (UTF-8)',charsetWE:'Δυτικής Ευρώπης',docType:'Επικεφαλίδα τύπου εγγράφου',docTypeOther:'Άλλη επικεφαλίδα τύπου εγγράφου',xhtmlDec:'Να συμπεριληφθούν οι δηλώσεις XHTML',bgColor:'Χρώμα φόντου',bgImage:'Διεύθυνση εικόνας φόντου',bgFixed:'Φόντο χωρίς κύλιση',txtColor:'Χρώμα Γραμμάτων',margin:'Περιθώρια σελίδας',marginTop:'Κορυφή',marginLeft:'Αριστερά',marginRight:'Δεξιά',marginBottom:'Κάτω',metaKeywords:'Λέξεις κλειδιά δείκτες εγγράφου (διαχωρισμός με κόμμα)',metaDescription:'Περιγραφή εγγράφου',metaAuthor:'Συγγραφέας',metaCopyright:'Πνευματικά Δικαιώματα',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/en.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/en.js
index 5c5fcf3..9349a6a 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/en.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/en.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.en={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Source',newPage:'New Page',save:'Save',preview:'Preview',cut:'Cut',copy:'Copy',paste:'Paste',print:'Print',underline:'Underline',bold:'Bold',italic:'Italic',selectAll:'Select All',removeFormat:'Remove Format',strike:'Strike Through',subscript:'Subscript',superscript:'Superscript',horizontalrule:'Insert Horizontal Line',pagebreak:'Insert Page Break for Printing',pagebreakAlt:'Page Break',unlink:'Unlink',undo:'Undo',redo:'Redo',common:{browseServer:'Browse Server',url:'URL',protocol:'Protocol',upload:'Upload',uploadSubmit:'Send it to the Server',image:'Image',flash:'Flash',form:'Form',checkbox:'Checkbox',radio:'Radio Button',textField:'Text Field',textarea:'Textarea',hiddenField:'Hidden Field',button:'Button',select:'Selection Field',imageButton:'Image Button',notSet:'<not set>',id:'Id',name:'Name',langDir:'Language Direction',langDirLtr:'Left to Right (LTR)',langDirRtl:'Right to Left (RTL)',langCode:'Language Code',longDescr:'Long Description URL',cssClass:'Stylesheet Classes',advisoryTitle:'Advisory Title',cssStyle:'Style',ok:'OK',cancel:'Cancel',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Advanced',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Width',height:'Height',align:'Alignment',alignLeft:'Left',alignRight:'Right',alignCenter:'Center',alignTop:'Top',alignMiddle:'Middle',alignBottom:'Bottom',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Insert Special Character',title:'Select Special Character',options:'Special Character Options'},link:{toolbar:'Link',other:'<other>',menu:'Edit Link',title:'Link',info:'Link Info',target:'Target',upload:'Upload',advanced:'Advanced',type:'Link Type',toUrl:'URL',toAnchor:'Link to anchor in the text',toEmail:'E-mail',targetFrame:'<frame>',targetPopup:'<popup window>',targetFrameName:'Target Frame Name',targetPopupName:'Popup Window Name',popupFeatures:'Popup Window Features',popupResizable:'Resizable',popupStatusBar:'Status Bar',popupLocationBar:'Location Bar',popupToolbar:'Toolbar',popupMenuBar:'Menu Bar',popupFullScreen:'Full Screen (IE)',popupScrollBars:'Scroll Bars',popupDependent:'Dependent (Netscape)',popupLeft:'Left Position',popupTop:'Top Position',id:'Id',langDir:'Language Direction',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',acccessKey:'Access Key',name:'Name',langCode:'Language Code',tabIndex:'Tab Index',advisoryTitle:'Advisory Title',advisoryContentType:'Advisory Content Type',cssClasses:'Stylesheet Classes',charset:'Linked Resource Charset',styles:'Style',rel:'Relationship',selectAnchor:'Select an Anchor',anchorName:'By Anchor Name',anchorId:'By Element Id',emailAddress:'E-Mail Address',emailSubject:'Message Subject',emailBody:'Message Body',noAnchors:'(No anchors available in the document)',noUrl:'Please type the link URL',noEmail:'Please type the e-mail address'},anchor:{toolbar:'Anchor',menu:'Edit Anchor',title:'Anchor Properties',name:'Anchor Name',errorName:'Please type the anchor name',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Find',replace:'Replace',findWhat:'Find what:',replaceWith:'Replace with:',notFoundMsg:'The specified text was not found.',findOptions:'Find Options',matchCase:'Match case',matchWord:'Match whole word',matchCyclic:'Match cyclic',replaceAll:'Replace All',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Table',title:'Table Properties',menu:'Table Properties',deleteTable:'Delete Table',rows:'Rows',columns:'Columns',border:'Border size',widthPx:'pixels',widthPc:'percent',widthUnit:'width unit',cellSpace:'Cell spacing',cellPad:'Cell padding',caption:'Caption',summary:'Summary',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Cell',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Delete Cells',merge:'Merge Cells',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Row',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Delete Rows'},column:{menu:'Column',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Delete Columns'}},button:{title:'Button Properties',text:'Text (Value)',type:'Type',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Checkbox Properties',radioTitle:'Radio Button Properties',value:'Value',selected:'Selected'},form:{title:'Form Properties',menu:'Form Properties',action:'Action',method:'Method',encoding:'Encoding'},select:{title:'Selection Field Properties',selectInfo:'Select Info',opAvail:'Available Options',value:'Value',size:'Size',lines:'lines',chkMulti:'Allow multiple selections',opText:'Text',opValue:'Value',btnAdd:'Add',btnModify:'Modify',btnUp:'Up',btnDown:'Down',btnSetValue:'Set as selected value',btnDelete:'Delete'},textarea:{title:'Textarea Properties',cols:'Columns',rows:'Rows'},textfield:{title:'Text Field Properties',name:'Name',value:'Value',charWidth:'Character Width',maxChars:'Maximum Characters',type:'Type',typeText:'Text',typePass:'Password'},hidden:{title:'Hidden Field Properties',name:'Name',value:'Value'},image:{title:'Image Properties',titleButton:'Image Button Properties',menu:'Image Properties',infoTab:'Image Info',btnUpload:'Send it to the Server',upload:'Upload',alt:'Alternative Text',lockRatio:'Lock Ratio',resetSize:'Reset Size',border:'Border',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Please type the image URL',linkTab:'Link',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Flash Properties',propertiesTab:'Properties',title:'Flash Properties',chkPlay:'Auto Play',chkLoop:'Loop',chkMenu:'Enable Flash Menu',chkFull:'Allow Fullscreen',scale:'Scale',scaleAll:'Show all',scaleNoBorder:'No Border',scaleFit:'Exact Fit',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs Bottom',alignAbsMiddle:'Abs Middle',alignBaseline:'Baseline',alignTextTop:'Text Top',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Background color',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'URL must not be empty.',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Check Spelling',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Not in dictionary',changeTo:'Change to',btnIgnore:'Ignore',btnIgnoreAll:'Ignore All',btnReplace:'Replace',btnReplaceAll:'Replace All',btnUndo:'Undo',noSuggestions:'- No suggestions -',progress:'Spell check in progress...',noMispell:'Spell check complete: No misspellings found',noChanges:'Spell check complete: No words changed',oneChange:'Spell check complete: One word changed',manyChanges:'Spell check complete: %1 words changed',ieSpellDownload:'Spell checker not installed. Do you want to download it now?'},smiley:{toolbar:'Smiley',title:'Insert a Smiley',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Insert/Remove Numbered List',bulletedlist:'Insert/Remove Bulleted List',indent:'Increase Indent',outdent:'Decrease Indent',justify:{left:'Align Left',center:'Center',right:'Align Right',block:'Justify'},blockquote:'Block Quote',clipboard:{title:'Paste',cutError:"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).",copyError:"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).",pasteMsg:'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Paste from Word',title:'Paste from Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Paste as plain text',title:'Paste as Plain Text'},templates:{button:'Templates',title:'Content Templates',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Please select the template to open in the editor',emptyListMsg:'(No templates defined)'},showBlocks:'Show Blocks',stylesCombo:{label:'Styles',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Format',panelTitle:'Paragraph Format',tag_p:'Normal',tag_pre:'Formatted',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Font',voiceLabel:'Font',panelTitle:'Font Name'},fontSize:{label:'Size',voiceLabel:'Font Size',panelTitle:'Font Size'},colorButton:{textColorTitle:'Text Color',bgColorTitle:'Background Color',panelTitle:'Colors',auto:'Automatic',more:'More Colors...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Document Properties',title:'Document Properties',design:'Design',meta:'Meta Tags',chooseColor:'Choose',other:'Other...',docTitle:'Page Title',charset:'Character Set Encoding',charsetOther:'Other Character Set Encoding',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Document Type Heading',docTypeOther:'Other Document Type Heading',xhtmlDec:'Include XHTML Declarations',bgColor:'Background Color',bgImage:'Background Image URL',bgFixed:'Non-scrolling (Fixed) Background',txtColor:'Text Color',margin:'Page Margins',marginTop:'Top',marginLeft:'Left',marginRight:'Right',marginBottom:'Bottom',metaKeywords:'Document Indexing Keywords (comma separated)',metaDescription:'Document Description',metaAuthor:'Author',metaCopyright:'Copyright',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.en={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Source',newPage:'New Page',save:'Save',preview:'Preview',cut:'Cut',copy:'Copy',paste:'Paste',print:'Print',underline:'Underline',bold:'Bold',italic:'Italic',selectAll:'Select All',removeFormat:'Remove Format',strike:'Strike Through',subscript:'Subscript',superscript:'Superscript',horizontalrule:'Insert Horizontal Line',pagebreak:'Insert Page Break for Printing',pagebreakAlt:'Page Break',unlink:'Unlink',undo:'Undo',redo:'Redo',common:{browseServer:'Browse Server',url:'URL',protocol:'Protocol',upload:'Upload',uploadSubmit:'Send it to the Server',image:'Image',flash:'Flash',form:'Form',checkbox:'Checkbox',radio:'Radio Button',textField:'Text Field',textarea:'Textarea',hiddenField:'Hidden Field',button:'Button',select:'Selection Field',imageButton:'Image Button',notSet:'<not set>',id:'Id',name:'Name',langDir:'Language Direction',langDirLtr:'Left to Right (LTR)',langDirRtl:'Right to Left (RTL)',langCode:'Language Code',longDescr:'Long Description URL',cssClass:'Stylesheet Classes',advisoryTitle:'Advisory Title',cssStyle:'Style',ok:'OK',cancel:'Cancel',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Advanced',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Width',height:'Height',align:'Alignment',alignLeft:'Left',alignRight:'Right',alignCenter:'Center',alignTop:'Top',alignMiddle:'Middle',alignBottom:'Bottom',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Insert Special Character',title:'Select Special Character',options:'Special Character Options'},link:{toolbar:'Link',other:'<other>',menu:'Edit Link',title:'Link',info:'Link Info',target:'Target',upload:'Upload',advanced:'Advanced',type:'Link Type',toUrl:'URL',toAnchor:'Link to anchor in the text',toEmail:'E-mail',targetFrame:'<frame>',targetPopup:'<popup window>',targetFrameName:'Target Frame Name',targetPopupName:'Popup Window Name',popupFeatures:'Popup Window Features',popupResizable:'Resizable',popupStatusBar:'Status Bar',popupLocationBar:'Location Bar',popupToolbar:'Toolbar',popupMenuBar:'Menu Bar',popupFullScreen:'Full Screen (IE)',popupScrollBars:'Scroll Bars',popupDependent:'Dependent (Netscape)',popupLeft:'Left Position',popupTop:'Top Position',id:'Id',langDir:'Language Direction',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',acccessKey:'Access Key',name:'Name',langCode:'Language Code',tabIndex:'Tab Index',advisoryTitle:'Advisory Title',advisoryContentType:'Advisory Content Type',cssClasses:'Stylesheet Classes',charset:'Linked Resource Charset',styles:'Style',rel:'Relationship',selectAnchor:'Select an Anchor',anchorName:'By Anchor Name',anchorId:'By Element Id',emailAddress:'E-Mail Address',emailSubject:'Message Subject',emailBody:'Message Body',noAnchors:'(No anchors available in the document)',noUrl:'Please type the link URL',noEmail:'Please type the e-mail address'},anchor:{toolbar:'Anchor',menu:'Edit Anchor',title:'Anchor Properties',name:'Anchor Name',errorName:'Please type the anchor name',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Find',replace:'Replace',findWhat:'Find what:',replaceWith:'Replace with:',notFoundMsg:'The specified text was not found.',findOptions:'Find Options',matchCase:'Match case',matchWord:'Match whole word',matchCyclic:'Match cyclic',replaceAll:'Replace All',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Table',title:'Table Properties',menu:'Table Properties',deleteTable:'Delete Table',rows:'Rows',columns:'Columns',border:'Border size',widthPx:'pixels',widthPc:'percent',widthUnit:'width unit',cellSpace:'Cell spacing',cellPad:'Cell padding',caption:'Caption',summary:'Summary',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Cell',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Delete Cells',merge:'Merge Cells',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Row',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Delete Rows'},column:{menu:'Column',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Delete Columns'}},button:{title:'Button Properties',text:'Text (Value)',type:'Type',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Checkbox Properties',radioTitle:'Radio Button Properties',value:'Value',selected:'Selected'},form:{title:'Form Properties',menu:'Form Properties',action:'Action',method:'Method',encoding:'Encoding'},select:{title:'Selection Field Properties',selectInfo:'Select Info',opAvail:'Available Options',value:'Value',size:'Size',lines:'lines',chkMulti:'Allow multiple selections',opText:'Text',opValue:'Value',btnAdd:'Add',btnModify:'Modify',btnUp:'Up',btnDown:'Down',btnSetValue:'Set as selected value',btnDelete:'Delete'},textarea:{title:'Textarea Properties',cols:'Columns',rows:'Rows'},textfield:{title:'Text Field Properties',name:'Name',value:'Value',charWidth:'Character Width',maxChars:'Maximum Characters',type:'Type',typeText:'Text',typePass:'Password'},hidden:{title:'Hidden Field Properties',name:'Name',value:'Value'},image:{title:'Image Properties',titleButton:'Image Button Properties',menu:'Image Properties',infoTab:'Image Info',btnUpload:'Send it to the Server',upload:'Upload',alt:'Alternative Text',lockRatio:'Lock Ratio',resetSize:'Reset Size',border:'Border',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Please type the image URL',linkTab:'Link',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Flash Properties',propertiesTab:'Properties',title:'Flash Properties',chkPlay:'Auto Play',chkLoop:'Loop',chkMenu:'Enable Flash Menu',chkFull:'Allow Fullscreen',scale:'Scale',scaleAll:'Show all',scaleNoBorder:'No Border',scaleFit:'Exact Fit',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs Bottom',alignAbsMiddle:'Abs Middle',alignBaseline:'Baseline',alignTextTop:'Text Top',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Background color',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'URL must not be empty.',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Check Spelling',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Not in dictionary',changeTo:'Change to',btnIgnore:'Ignore',btnIgnoreAll:'Ignore All',btnReplace:'Replace',btnReplaceAll:'Replace All',btnUndo:'Undo',noSuggestions:'- No suggestions -',progress:'Spell check in progress...',noMispell:'Spell check complete: No misspellings found',noChanges:'Spell check complete: No words changed',oneChange:'Spell check complete: One word changed',manyChanges:'Spell check complete: %1 words changed',ieSpellDownload:'Spell checker not installed. Do you want to download it now?'},smiley:{toolbar:'Smiley',title:'Insert a Smiley',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Insert/Remove Numbered List',bulletedlist:'Insert/Remove Bulleted List',indent:'Increase Indent',outdent:'Decrease Indent',justify:{left:'Align Left',center:'Center',right:'Align Right',block:'Justify'},blockquote:'Block Quote',clipboard:{title:'Paste',cutError:"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).",copyError:"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).",pasteMsg:'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Paste from Word',title:'Paste from Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Paste as plain text',title:'Paste as Plain Text'},templates:{button:'Templates',title:'Content Templates',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Please select the template to open in the editor',emptyListMsg:'(No templates defined)'},showBlocks:'Show Blocks',stylesCombo:{label:'Styles',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Format',panelTitle:'Paragraph Format',tag_p:'Normal',tag_pre:'Formatted',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Font',voiceLabel:'Font',panelTitle:'Font Name'},fontSize:{label:'Size',voiceLabel:'Font Size',panelTitle:'Font Size'},colorButton:{textColorTitle:'Text Color',bgColorTitle:'Background Color',panelTitle:'Colors',auto:'Automatic',more:'More Colors...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Document Properties',title:'Document Properties',design:'Design',meta:'Meta Tags',chooseColor:'Choose',other:'Other...',docTitle:'Page Title',charset:'Character Set Encoding',charsetOther:'Other Character Set Encoding',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Document Type Heading',docTypeOther:'Other Document Type Heading',xhtmlDec:'Include XHTML Declarations',bgColor:'Background Color',bgImage:'Background Image URL',bgFixed:'Non-scrolling (Fixed) Background',txtColor:'Text Color',margin:'Page Margins',marginTop:'Top',marginLeft:'Left',marginRight:'Right',marginBottom:'Bottom',metaKeywords:'Document Indexing Keywords (comma separated)',metaDescription:'Document Description',metaAuthor:'Author',metaCopyright:'Copyright',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/en-au.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/en-au.js
index 4461727..c6dda1a 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/en-au.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/en-au.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang['en-au']={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Source',newPage:'New Page',save:'Save',preview:'Preview',cut:'Cut',copy:'Copy',paste:'Paste',print:'Print',underline:'Underline',bold:'Bold',italic:'Italic',selectAll:'Select All',removeFormat:'Remove Format',strike:'Strike Through',subscript:'Subscript',superscript:'Superscript',horizontalrule:'Insert Horizontal Line',pagebreak:'Insert Page Break for Printing',pagebreakAlt:'Page Break',unlink:'Unlink',undo:'Undo',redo:'Redo',common:{browseServer:'Browse Server',url:'URL',protocol:'Protocol',upload:'Upload',uploadSubmit:'Send it to the Server',image:'Image',flash:'Flash',form:'Form',checkbox:'Checkbox',radio:'Radio Button',textField:'Text Field',textarea:'Textarea',hiddenField:'Hidden Field',button:'Button',select:'Selection Field',imageButton:'Image Button',notSet:'<not set>',id:'Id',name:'Name',langDir:'Language Direction',langDirLtr:'Left to Right (LTR)',langDirRtl:'Right to Left (RTL)',langCode:'Language Code',longDescr:'Long Description URL',cssClass:'Stylesheet Classes',advisoryTitle:'Advisory Title',cssStyle:'Style',ok:'OK',cancel:'Cancel',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Advanced',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Width',height:'Height',align:'Align',alignLeft:'Left',alignRight:'Right',alignCenter:'Centre',alignTop:'Top',alignMiddle:'Middle',alignBottom:'Bottom',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Insert Special Character',title:'Select Special Character',options:'Special Character Options'},link:{toolbar:'Link',other:'<other>',menu:'Edit Link',title:'Link',info:'Link Info',target:'Target',upload:'Upload',advanced:'Advanced',type:'Link Type',toUrl:'URL',toAnchor:'Link to anchor in the text',toEmail:'E-mail',targetFrame:'<frame>',targetPopup:'<popup window>',targetFrameName:'Target Frame Name',targetPopupName:'Popup Window Name',popupFeatures:'Popup Window Features',popupResizable:'Resizable',popupStatusBar:'Status Bar',popupLocationBar:'Location Bar',popupToolbar:'Toolbar',popupMenuBar:'Menu Bar',popupFullScreen:'Full Screen (IE)',popupScrollBars:'Scroll Bars',popupDependent:'Dependent (Netscape)',popupLeft:'Left Position',popupTop:'Top Position',id:'Id',langDir:'Language Direction',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',acccessKey:'Access Key',name:'Name',langCode:'Language Code',tabIndex:'Tab Index',advisoryTitle:'Advisory Title',advisoryContentType:'Advisory Content Type',cssClasses:'Stylesheet Classes',charset:'Linked Resource Charset',styles:'Style',rel:'Relationship',selectAnchor:'Select an Anchor',anchorName:'By Anchor Name',anchorId:'By Element Id',emailAddress:'E-Mail Address',emailSubject:'Message Subject',emailBody:'Message Body',noAnchors:'(No anchors available in the document)',noUrl:'Please type the link URL',noEmail:'Please type the e-mail address'},anchor:{toolbar:'Anchor',menu:'Edit Anchor',title:'Anchor Properties',name:'Anchor Name',errorName:'Please type the anchor name',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Find',replace:'Replace',findWhat:'Find what:',replaceWith:'Replace with:',notFoundMsg:'The specified text was not found.',findOptions:'Find Options',matchCase:'Match case',matchWord:'Match whole word',matchCyclic:'Match cyclic',replaceAll:'Replace All',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Table',title:'Table Properties',menu:'Table Properties',deleteTable:'Delete Table',rows:'Rows',columns:'Columns',border:'Border size',widthPx:'pixels',widthPc:'percent',widthUnit:'width unit',cellSpace:'Cell spacing',cellPad:'Cell padding',caption:'Caption',summary:'Summary',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a number.',invalidCellPadding:'Cell padding must be a number.',cell:{menu:'Cell',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Delete Cells',merge:'Merge Cells',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Row',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Delete Rows'},column:{menu:'Column',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Delete Columns'}},button:{title:'Button Properties',text:'Text (Value)',type:'Type',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Checkbox Properties',radioTitle:'Radio Button Properties',value:'Value',selected:'Selected'},form:{title:'Form Properties',menu:'Form Properties',action:'Action',method:'Method',encoding:'Encoding'},select:{title:'Selection Field Properties',selectInfo:'Select Info',opAvail:'Available Options',value:'Value',size:'Size',lines:'lines',chkMulti:'Allow multiple selections',opText:'Text',opValue:'Value',btnAdd:'Add',btnModify:'Modify',btnUp:'Up',btnDown:'Down',btnSetValue:'Set as selected value',btnDelete:'Delete'},textarea:{title:'Textarea Properties',cols:'Columns',rows:'Rows'},textfield:{title:'Text Field Properties',name:'Name',value:'Value',charWidth:'Character Width',maxChars:'Maximum Characters',type:'Type',typeText:'Text',typePass:'Password'},hidden:{title:'Hidden Field Properties',name:'Name',value:'Value'},image:{title:'Image Properties',titleButton:'Image Button Properties',menu:'Image Properties',infoTab:'Image Info',btnUpload:'Send it to the Server',upload:'Upload',alt:'Alternative Text',lockRatio:'Lock Ratio',resetSize:'Reset Size',border:'Border',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Please type the image URL',linkTab:'Link',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Flash Properties',propertiesTab:'Properties',title:'Flash Properties',chkPlay:'Auto Play',chkLoop:'Loop',chkMenu:'Enable Flash Menu',chkFull:'Allow Fullscreen',scale:'Scale',scaleAll:'Show all',scaleNoBorder:'No Border',scaleFit:'Exact Fit',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs Bottom',alignAbsMiddle:'Abs Middle',alignBaseline:'Baseline',alignTextTop:'Text Top',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Background colour',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'URL must not be empty.',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Check Spelling',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Not in dictionary',changeTo:'Change to',btnIgnore:'Ignore',btnIgnoreAll:'Ignore All',btnReplace:'Replace',btnReplaceAll:'Replace All',btnUndo:'Undo',noSuggestions:'- No suggestions -',progress:'Spell check in progress...',noMispell:'Spell check complete: No misspellings found',noChanges:'Spell check complete: No words changed',oneChange:'Spell check complete: One word changed',manyChanges:'Spell check complete: %1 words changed',ieSpellDownload:'Spell checker not installed. Do you want to download it now?'},smiley:{toolbar:'Smiley',title:'Insert a Smiley',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Insert/Remove Numbered List',bulletedlist:'Insert/Remove Bulleted List',indent:'Increase Indent',outdent:'Decrease Indent',justify:{left:'Align Left',center:'Centre',right:'Align Right',block:'Justify'},blockquote:'Block Quote',clipboard:{title:'Paste',cutError:"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).",copyError:"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).",pasteMsg:'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Paste from Word',title:'Paste from Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Paste as plain text',title:'Paste as Plain Text'},templates:{button:'Templates',title:'Content Templates',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Please select the template to open in the editor',emptyListMsg:'(No templates defined)'},showBlocks:'Show Blocks',stylesCombo:{label:'Styles',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Format',panelTitle:'Paragraph Format',tag_p:'Normal',tag_pre:'Formatted',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Font',voiceLabel:'Font',panelTitle:'Font Name'},fontSize:{label:'Size',voiceLabel:'Font Size',panelTitle:'Font Size'},colorButton:{textColorTitle:'Text Colour',bgColorTitle:'Background Colour',panelTitle:'Colors',auto:'Automatic',more:'More Colours...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Document Properties',title:'Document Properties',design:'Design',meta:'Meta Tags',chooseColor:'Choose',other:'Other...',docTitle:'Page Title',charset:'Character Set Encoding',charsetOther:'Other Character Set Encoding',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Document Type Heading',docTypeOther:'Other Document Type Heading',xhtmlDec:'Include XHTML Declarations',bgColor:'Background Color',bgImage:'Background Image URL',bgFixed:'Non-scrolling (Fixed) Background',txtColor:'Text Color',margin:'Page Margins',marginTop:'Top',marginLeft:'Left',marginRight:'Right',marginBottom:'Bottom',metaKeywords:'Document Indexing Keywords (comma separated)',metaDescription:'Document Description',metaAuthor:'Author',metaCopyright:'Copyright',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang['en-au']={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Source',newPage:'New Page',save:'Save',preview:'Preview',cut:'Cut',copy:'Copy',paste:'Paste',print:'Print',underline:'Underline',bold:'Bold',italic:'Italic',selectAll:'Select All',removeFormat:'Remove Format',strike:'Strike Through',subscript:'Subscript',superscript:'Superscript',horizontalrule:'Insert Horizontal Line',pagebreak:'Insert Page Break for Printing',pagebreakAlt:'Page Break',unlink:'Unlink',undo:'Undo',redo:'Redo',common:{browseServer:'Browse Server',url:'URL',protocol:'Protocol',upload:'Upload',uploadSubmit:'Send it to the Server',image:'Image',flash:'Flash',form:'Form',checkbox:'Checkbox',radio:'Radio Button',textField:'Text Field',textarea:'Textarea',hiddenField:'Hidden Field',button:'Button',select:'Selection Field',imageButton:'Image Button',notSet:'<not set>',id:'Id',name:'Name',langDir:'Language Direction',langDirLtr:'Left to Right (LTR)',langDirRtl:'Right to Left (RTL)',langCode:'Language Code',longDescr:'Long Description URL',cssClass:'Stylesheet Classes',advisoryTitle:'Advisory Title',cssStyle:'Style',ok:'OK',cancel:'Cancel',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Advanced',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Width',height:'Height',align:'Align',alignLeft:'Left',alignRight:'Right',alignCenter:'Centre',alignTop:'Top',alignMiddle:'Middle',alignBottom:'Bottom',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Insert Special Character',title:'Select Special Character',options:'Special Character Options'},link:{toolbar:'Link',other:'<other>',menu:'Edit Link',title:'Link',info:'Link Info',target:'Target',upload:'Upload',advanced:'Advanced',type:'Link Type',toUrl:'URL',toAnchor:'Link to anchor in the text',toEmail:'E-mail',targetFrame:'<frame>',targetPopup:'<popup window>',targetFrameName:'Target Frame Name',targetPopupName:'Popup Window Name',popupFeatures:'Popup Window Features',popupResizable:'Resizable',popupStatusBar:'Status Bar',popupLocationBar:'Location Bar',popupToolbar:'Toolbar',popupMenuBar:'Menu Bar',popupFullScreen:'Full Screen (IE)',popupScrollBars:'Scroll Bars',popupDependent:'Dependent (Netscape)',popupLeft:'Left Position',popupTop:'Top Position',id:'Id',langDir:'Language Direction',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',acccessKey:'Access Key',name:'Name',langCode:'Language Code',tabIndex:'Tab Index',advisoryTitle:'Advisory Title',advisoryContentType:'Advisory Content Type',cssClasses:'Stylesheet Classes',charset:'Linked Resource Charset',styles:'Style',rel:'Relationship',selectAnchor:'Select an Anchor',anchorName:'By Anchor Name',anchorId:'By Element Id',emailAddress:'E-Mail Address',emailSubject:'Message Subject',emailBody:'Message Body',noAnchors:'(No anchors available in the document)',noUrl:'Please type the link URL',noEmail:'Please type the e-mail address'},anchor:{toolbar:'Anchor',menu:'Edit Anchor',title:'Anchor Properties',name:'Anchor Name',errorName:'Please type the anchor name',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Find',replace:'Replace',findWhat:'Find what:',replaceWith:'Replace with:',notFoundMsg:'The specified text was not found.',findOptions:'Find Options',matchCase:'Match case',matchWord:'Match whole word',matchCyclic:'Match cyclic',replaceAll:'Replace All',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Table',title:'Table Properties',menu:'Table Properties',deleteTable:'Delete Table',rows:'Rows',columns:'Columns',border:'Border size',widthPx:'pixels',widthPc:'percent',widthUnit:'width unit',cellSpace:'Cell spacing',cellPad:'Cell padding',caption:'Caption',summary:'Summary',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a number.',invalidCellPadding:'Cell padding must be a number.',cell:{menu:'Cell',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Delete Cells',merge:'Merge Cells',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Row',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Delete Rows'},column:{menu:'Column',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Delete Columns'}},button:{title:'Button Properties',text:'Text (Value)',type:'Type',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Checkbox Properties',radioTitle:'Radio Button Properties',value:'Value',selected:'Selected'},form:{title:'Form Properties',menu:'Form Properties',action:'Action',method:'Method',encoding:'Encoding'},select:{title:'Selection Field Properties',selectInfo:'Select Info',opAvail:'Available Options',value:'Value',size:'Size',lines:'lines',chkMulti:'Allow multiple selections',opText:'Text',opValue:'Value',btnAdd:'Add',btnModify:'Modify',btnUp:'Up',btnDown:'Down',btnSetValue:'Set as selected value',btnDelete:'Delete'},textarea:{title:'Textarea Properties',cols:'Columns',rows:'Rows'},textfield:{title:'Text Field Properties',name:'Name',value:'Value',charWidth:'Character Width',maxChars:'Maximum Characters',type:'Type',typeText:'Text',typePass:'Password'},hidden:{title:'Hidden Field Properties',name:'Name',value:'Value'},image:{title:'Image Properties',titleButton:'Image Button Properties',menu:'Image Properties',infoTab:'Image Info',btnUpload:'Send it to the Server',upload:'Upload',alt:'Alternative Text',lockRatio:'Lock Ratio',resetSize:'Reset Size',border:'Border',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Please type the image URL',linkTab:'Link',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Flash Properties',propertiesTab:'Properties',title:'Flash Properties',chkPlay:'Auto Play',chkLoop:'Loop',chkMenu:'Enable Flash Menu',chkFull:'Allow Fullscreen',scale:'Scale',scaleAll:'Show all',scaleNoBorder:'No Border',scaleFit:'Exact Fit',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs Bottom',alignAbsMiddle:'Abs Middle',alignBaseline:'Baseline',alignTextTop:'Text Top',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Background colour',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'URL must not be empty.',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Check Spelling',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Not in dictionary',changeTo:'Change to',btnIgnore:'Ignore',btnIgnoreAll:'Ignore All',btnReplace:'Replace',btnReplaceAll:'Replace All',btnUndo:'Undo',noSuggestions:'- No suggestions -',progress:'Spell check in progress...',noMispell:'Spell check complete: No misspellings found',noChanges:'Spell check complete: No words changed',oneChange:'Spell check complete: One word changed',manyChanges:'Spell check complete: %1 words changed',ieSpellDownload:'Spell checker not installed. Do you want to download it now?'},smiley:{toolbar:'Smiley',title:'Insert a Smiley',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Insert/Remove Numbered List',bulletedlist:'Insert/Remove Bulleted List',indent:'Increase Indent',outdent:'Decrease Indent',justify:{left:'Align Left',center:'Centre',right:'Align Right',block:'Justify'},blockquote:'Block Quote',clipboard:{title:'Paste',cutError:"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).",copyError:"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).",pasteMsg:'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Paste from Word',title:'Paste from Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Paste as plain text',title:'Paste as Plain Text'},templates:{button:'Templates',title:'Content Templates',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Please select the template to open in the editor',emptyListMsg:'(No templates defined)'},showBlocks:'Show Blocks',stylesCombo:{label:'Styles',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Format',panelTitle:'Paragraph Format',tag_p:'Normal',tag_pre:'Formatted',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Font',voiceLabel:'Font',panelTitle:'Font Name'},fontSize:{label:'Size',voiceLabel:'Font Size',panelTitle:'Font Size'},colorButton:{textColorTitle:'Text Colour',bgColorTitle:'Background Colour',panelTitle:'Colors',auto:'Automatic',more:'More Colours...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Document Properties',title:'Document Properties',design:'Design',meta:'Meta Tags',chooseColor:'Choose',other:'Other...',docTitle:'Page Title',charset:'Character Set Encoding',charsetOther:'Other Character Set Encoding',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Document Type Heading',docTypeOther:'Other Document Type Heading',xhtmlDec:'Include XHTML Declarations',bgColor:'Background Color',bgImage:'Background Image URL',bgFixed:'Non-scrolling (Fixed) Background',txtColor:'Text Color',margin:'Page Margins',marginTop:'Top',marginLeft:'Left',marginRight:'Right',marginBottom:'Bottom',metaKeywords:'Document Indexing Keywords (comma separated)',metaDescription:'Document Description',metaAuthor:'Author',metaCopyright:'Copyright',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/en-ca.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/en-ca.js
index 470209b..9250c07 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/en-ca.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/en-ca.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang['en-ca']={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Source',newPage:'New Page',save:'Save',preview:'Preview',cut:'Cut',copy:'Copy',paste:'Paste',print:'Print',underline:'Underline',bold:'Bold',italic:'Italic',selectAll:'Select All',removeFormat:'Remove Format',strike:'Strike Through',subscript:'Subscript',superscript:'Superscript',horizontalrule:'Insert Horizontal Line',pagebreak:'Insert Page Break for Printing',pagebreakAlt:'Page Break',unlink:'Unlink',undo:'Undo',redo:'Redo',common:{browseServer:'Browse Server',url:'URL',protocol:'Protocol',upload:'Upload',uploadSubmit:'Send it to the Server',image:'Image',flash:'Flash',form:'Form',checkbox:'Checkbox',radio:'Radio Button',textField:'Text Field',textarea:'Textarea',hiddenField:'Hidden Field',button:'Button',select:'Selection Field',imageButton:'Image Button',notSet:'<not set>',id:'Id',name:'Name',langDir:'Language Direction',langDirLtr:'Left to Right (LTR)',langDirRtl:'Right to Left (RTL)',langCode:'Language Code',longDescr:'Long Description URL',cssClass:'Stylesheet Classes',advisoryTitle:'Advisory Title',cssStyle:'Style',ok:'OK',cancel:'Cancel',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Advanced',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Width',height:'Height',align:'Align',alignLeft:'Left',alignRight:'Right',alignCenter:'Centre',alignTop:'Top',alignMiddle:'Middle',alignBottom:'Bottom',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Insert Special Character',title:'Select Special Character',options:'Special Character Options'},link:{toolbar:'Link',other:'<other>',menu:'Edit Link',title:'Link',info:'Link Info',target:'Target',upload:'Upload',advanced:'Advanced',type:'Link Type',toUrl:'URL',toAnchor:'Link to anchor in the text',toEmail:'E-mail',targetFrame:'<frame>',targetPopup:'<popup window>',targetFrameName:'Target Frame Name',targetPopupName:'Popup Window Name',popupFeatures:'Popup Window Features',popupResizable:'Resizable',popupStatusBar:'Status Bar',popupLocationBar:'Location Bar',popupToolbar:'Toolbar',popupMenuBar:'Menu Bar',popupFullScreen:'Full Screen (IE)',popupScrollBars:'Scroll Bars',popupDependent:'Dependent (Netscape)',popupLeft:'Left Position',popupTop:'Top Position',id:'Id',langDir:'Language Direction',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',acccessKey:'Access Key',name:'Name',langCode:'Language Code',tabIndex:'Tab Index',advisoryTitle:'Advisory Title',advisoryContentType:'Advisory Content Type',cssClasses:'Stylesheet Classes',charset:'Linked Resource Charset',styles:'Style',rel:'Relationship',selectAnchor:'Select an Anchor',anchorName:'By Anchor Name',anchorId:'By Element Id',emailAddress:'E-Mail Address',emailSubject:'Message Subject',emailBody:'Message Body',noAnchors:'(No anchors available in the document)',noUrl:'Please type the link URL',noEmail:'Please type the e-mail address'},anchor:{toolbar:'Anchor',menu:'Edit Anchor',title:'Anchor Properties',name:'Anchor Name',errorName:'Please type the anchor name',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Find',replace:'Replace',findWhat:'Find what:',replaceWith:'Replace with:',notFoundMsg:'The specified text was not found.',findOptions:'Find Options',matchCase:'Match case',matchWord:'Match whole word',matchCyclic:'Match cyclic',replaceAll:'Replace All',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Table',title:'Table Properties',menu:'Table Properties',deleteTable:'Delete Table',rows:'Rows',columns:'Columns',border:'Border size',widthPx:'pixels',widthPc:'percent',widthUnit:'width unit',cellSpace:'Cell spacing',cellPad:'Cell padding',caption:'Caption',summary:'Summary',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a number.',invalidCellPadding:'Cell padding must be a number.',cell:{menu:'Cell',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Delete Cells',merge:'Merge Cells',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Row',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Delete Rows'},column:{menu:'Column',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Delete Columns'}},button:{title:'Button Properties',text:'Text (Value)',type:'Type',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Checkbox Properties',radioTitle:'Radio Button Properties',value:'Value',selected:'Selected'},form:{title:'Form Properties',menu:'Form Properties',action:'Action',method:'Method',encoding:'Encoding'},select:{title:'Selection Field Properties',selectInfo:'Select Info',opAvail:'Available Options',value:'Value',size:'Size',lines:'lines',chkMulti:'Allow multiple selections',opText:'Text',opValue:'Value',btnAdd:'Add',btnModify:'Modify',btnUp:'Up',btnDown:'Down',btnSetValue:'Set as selected value',btnDelete:'Delete'},textarea:{title:'Textarea Properties',cols:'Columns',rows:'Rows'},textfield:{title:'Text Field Properties',name:'Name',value:'Value',charWidth:'Character Width',maxChars:'Maximum Characters',type:'Type',typeText:'Text',typePass:'Password'},hidden:{title:'Hidden Field Properties',name:'Name',value:'Value'},image:{title:'Image Properties',titleButton:'Image Button Properties',menu:'Image Properties',infoTab:'Image Info',btnUpload:'Send it to the Server',upload:'Upload',alt:'Alternative Text',lockRatio:'Lock Ratio',resetSize:'Reset Size',border:'Border',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Please type the image URL',linkTab:'Link',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Flash Properties',propertiesTab:'Properties',title:'Flash Properties',chkPlay:'Auto Play',chkLoop:'Loop',chkMenu:'Enable Flash Menu',chkFull:'Allow Fullscreen',scale:'Scale',scaleAll:'Show all',scaleNoBorder:'No Border',scaleFit:'Exact Fit',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs Bottom',alignAbsMiddle:'Abs Middle',alignBaseline:'Baseline',alignTextTop:'Text Top',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Background colour',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'URL must not be empty.',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Check Spelling',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Not in dictionary',changeTo:'Change to',btnIgnore:'Ignore',btnIgnoreAll:'Ignore All',btnReplace:'Replace',btnReplaceAll:'Replace All',btnUndo:'Undo',noSuggestions:'- No suggestions -',progress:'Spell check in progress...',noMispell:'Spell check complete: No misspellings found',noChanges:'Spell check complete: No words changed',oneChange:'Spell check complete: One word changed',manyChanges:'Spell check complete: %1 words changed',ieSpellDownload:'Spell checker not installed. Do you want to download it now?'},smiley:{toolbar:'Smiley',title:'Insert a Smiley',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Insert/Remove Numbered List',bulletedlist:'Insert/Remove Bulleted List',indent:'Increase Indent',outdent:'Decrease Indent',justify:{left:'Align Left',center:'Centre',right:'Align Right',block:'Justify'},blockquote:'Block Quote',clipboard:{title:'Paste',cutError:"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).",copyError:"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).",pasteMsg:'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Paste from Word',title:'Paste from Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Paste as plain text',title:'Paste as Plain Text'},templates:{button:'Templates',title:'Content Templates',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Please select the template to open in the editor',emptyListMsg:'(No templates defined)'},showBlocks:'Show Blocks',stylesCombo:{label:'Styles',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Format',panelTitle:'Paragraph Format',tag_p:'Normal',tag_pre:'Formatted',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Font',voiceLabel:'Font',panelTitle:'Font Name'},fontSize:{label:'Size',voiceLabel:'Font Size',panelTitle:'Font Size'},colorButton:{textColorTitle:'Text Colour',bgColorTitle:'Background Colour',panelTitle:'Colors',auto:'Automatic',more:'More Colours...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Document Properties',title:'Document Properties',design:'Design',meta:'Meta Tags',chooseColor:'Choose',other:'Other...',docTitle:'Page Title',charset:'Character Set Encoding',charsetOther:'Other Character Set Encoding',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Document Type Heading',docTypeOther:'Other Document Type Heading',xhtmlDec:'Include XHTML Declarations',bgColor:'Background Color',bgImage:'Background Image URL',bgFixed:'Non-scrolling (Fixed) Background',txtColor:'Text Color',margin:'Page Margins',marginTop:'Top',marginLeft:'Left',marginRight:'Right',marginBottom:'Bottom',metaKeywords:'Document Indexing Keywords (comma separated)',metaDescription:'Document Description',metaAuthor:'Author',metaCopyright:'Copyright',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang['en-ca']={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Source',newPage:'New Page',save:'Save',preview:'Preview',cut:'Cut',copy:'Copy',paste:'Paste',print:'Print',underline:'Underline',bold:'Bold',italic:'Italic',selectAll:'Select All',removeFormat:'Remove Format',strike:'Strike Through',subscript:'Subscript',superscript:'Superscript',horizontalrule:'Insert Horizontal Line',pagebreak:'Insert Page Break for Printing',pagebreakAlt:'Page Break',unlink:'Unlink',undo:'Undo',redo:'Redo',common:{browseServer:'Browse Server',url:'URL',protocol:'Protocol',upload:'Upload',uploadSubmit:'Send it to the Server',image:'Image',flash:'Flash',form:'Form',checkbox:'Checkbox',radio:'Radio Button',textField:'Text Field',textarea:'Textarea',hiddenField:'Hidden Field',button:'Button',select:'Selection Field',imageButton:'Image Button',notSet:'<not set>',id:'Id',name:'Name',langDir:'Language Direction',langDirLtr:'Left to Right (LTR)',langDirRtl:'Right to Left (RTL)',langCode:'Language Code',longDescr:'Long Description URL',cssClass:'Stylesheet Classes',advisoryTitle:'Advisory Title',cssStyle:'Style',ok:'OK',cancel:'Cancel',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Advanced',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Width',height:'Height',align:'Align',alignLeft:'Left',alignRight:'Right',alignCenter:'Centre',alignTop:'Top',alignMiddle:'Middle',alignBottom:'Bottom',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Insert Special Character',title:'Select Special Character',options:'Special Character Options'},link:{toolbar:'Link',other:'<other>',menu:'Edit Link',title:'Link',info:'Link Info',target:'Target',upload:'Upload',advanced:'Advanced',type:'Link Type',toUrl:'URL',toAnchor:'Link to anchor in the text',toEmail:'E-mail',targetFrame:'<frame>',targetPopup:'<popup window>',targetFrameName:'Target Frame Name',targetPopupName:'Popup Window Name',popupFeatures:'Popup Window Features',popupResizable:'Resizable',popupStatusBar:'Status Bar',popupLocationBar:'Location Bar',popupToolbar:'Toolbar',popupMenuBar:'Menu Bar',popupFullScreen:'Full Screen (IE)',popupScrollBars:'Scroll Bars',popupDependent:'Dependent (Netscape)',popupLeft:'Left Position',popupTop:'Top Position',id:'Id',langDir:'Language Direction',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',acccessKey:'Access Key',name:'Name',langCode:'Language Code',tabIndex:'Tab Index',advisoryTitle:'Advisory Title',advisoryContentType:'Advisory Content Type',cssClasses:'Stylesheet Classes',charset:'Linked Resource Charset',styles:'Style',rel:'Relationship',selectAnchor:'Select an Anchor',anchorName:'By Anchor Name',anchorId:'By Element Id',emailAddress:'E-Mail Address',emailSubject:'Message Subject',emailBody:'Message Body',noAnchors:'(No anchors available in the document)',noUrl:'Please type the link URL',noEmail:'Please type the e-mail address'},anchor:{toolbar:'Anchor',menu:'Edit Anchor',title:'Anchor Properties',name:'Anchor Name',errorName:'Please type the anchor name',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Find',replace:'Replace',findWhat:'Find what:',replaceWith:'Replace with:',notFoundMsg:'The specified text was not found.',findOptions:'Find Options',matchCase:'Match case',matchWord:'Match whole word',matchCyclic:'Match cyclic',replaceAll:'Replace All',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Table',title:'Table Properties',menu:'Table Properties',deleteTable:'Delete Table',rows:'Rows',columns:'Columns',border:'Border size',widthPx:'pixels',widthPc:'percent',widthUnit:'width unit',cellSpace:'Cell spacing',cellPad:'Cell padding',caption:'Caption',summary:'Summary',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a number.',invalidCellPadding:'Cell padding must be a number.',cell:{menu:'Cell',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Delete Cells',merge:'Merge Cells',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Row',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Delete Rows'},column:{menu:'Column',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Delete Columns'}},button:{title:'Button Properties',text:'Text (Value)',type:'Type',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Checkbox Properties',radioTitle:'Radio Button Properties',value:'Value',selected:'Selected'},form:{title:'Form Properties',menu:'Form Properties',action:'Action',method:'Method',encoding:'Encoding'},select:{title:'Selection Field Properties',selectInfo:'Select Info',opAvail:'Available Options',value:'Value',size:'Size',lines:'lines',chkMulti:'Allow multiple selections',opText:'Text',opValue:'Value',btnAdd:'Add',btnModify:'Modify',btnUp:'Up',btnDown:'Down',btnSetValue:'Set as selected value',btnDelete:'Delete'},textarea:{title:'Textarea Properties',cols:'Columns',rows:'Rows'},textfield:{title:'Text Field Properties',name:'Name',value:'Value',charWidth:'Character Width',maxChars:'Maximum Characters',type:'Type',typeText:'Text',typePass:'Password'},hidden:{title:'Hidden Field Properties',name:'Name',value:'Value'},image:{title:'Image Properties',titleButton:'Image Button Properties',menu:'Image Properties',infoTab:'Image Info',btnUpload:'Send it to the Server',upload:'Upload',alt:'Alternative Text',lockRatio:'Lock Ratio',resetSize:'Reset Size',border:'Border',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Please type the image URL',linkTab:'Link',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Flash Properties',propertiesTab:'Properties',title:'Flash Properties',chkPlay:'Auto Play',chkLoop:'Loop',chkMenu:'Enable Flash Menu',chkFull:'Allow Fullscreen',scale:'Scale',scaleAll:'Show all',scaleNoBorder:'No Border',scaleFit:'Exact Fit',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs Bottom',alignAbsMiddle:'Abs Middle',alignBaseline:'Baseline',alignTextTop:'Text Top',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Background colour',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'URL must not be empty.',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Check Spelling',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Not in dictionary',changeTo:'Change to',btnIgnore:'Ignore',btnIgnoreAll:'Ignore All',btnReplace:'Replace',btnReplaceAll:'Replace All',btnUndo:'Undo',noSuggestions:'- No suggestions -',progress:'Spell check in progress...',noMispell:'Spell check complete: No misspellings found',noChanges:'Spell check complete: No words changed',oneChange:'Spell check complete: One word changed',manyChanges:'Spell check complete: %1 words changed',ieSpellDownload:'Spell checker not installed. Do you want to download it now?'},smiley:{toolbar:'Smiley',title:'Insert a Smiley',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Insert/Remove Numbered List',bulletedlist:'Insert/Remove Bulleted List',indent:'Increase Indent',outdent:'Decrease Indent',justify:{left:'Align Left',center:'Centre',right:'Align Right',block:'Justify'},blockquote:'Block Quote',clipboard:{title:'Paste',cutError:"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).",copyError:"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).",pasteMsg:'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Paste from Word',title:'Paste from Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Paste as plain text',title:'Paste as Plain Text'},templates:{button:'Templates',title:'Content Templates',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Please select the template to open in the editor',emptyListMsg:'(No templates defined)'},showBlocks:'Show Blocks',stylesCombo:{label:'Styles',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Format',panelTitle:'Paragraph Format',tag_p:'Normal',tag_pre:'Formatted',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Font',voiceLabel:'Font',panelTitle:'Font Name'},fontSize:{label:'Size',voiceLabel:'Font Size',panelTitle:'Font Size'},colorButton:{textColorTitle:'Text Colour',bgColorTitle:'Background Colour',panelTitle:'Colors',auto:'Automatic',more:'More Colours...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Document Properties',title:'Document Properties',design:'Design',meta:'Meta Tags',chooseColor:'Choose',other:'Other...',docTitle:'Page Title',charset:'Character Set Encoding',charsetOther:'Other Character Set Encoding',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Document Type Heading',docTypeOther:'Other Document Type Heading',xhtmlDec:'Include XHTML Declarations',bgColor:'Background Color',bgImage:'Background Image URL',bgFixed:'Non-scrolling (Fixed) Background',txtColor:'Text Color',margin:'Page Margins',marginTop:'Top',marginLeft:'Left',marginRight:'Right',marginBottom:'Bottom',metaKeywords:'Document Indexing Keywords (comma separated)',metaDescription:'Document Description',metaAuthor:'Author',metaCopyright:'Copyright',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/en-gb.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/en-gb.js
index 6d3b073..62cfca4 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/en-gb.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/en-gb.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang['en-gb']={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Source',newPage:'New Page',save:'Save',preview:'Preview',cut:'Cut',copy:'Copy',paste:'Paste',print:'Print',underline:'Underline',bold:'Bold',italic:'Italic',selectAll:'Select All',removeFormat:'Remove Format',strike:'Strike Through',subscript:'Subscript',superscript:'Superscript',horizontalrule:'Insert Horizontal Line',pagebreak:'Insert Page Break for Printing',pagebreakAlt:'Page Break',unlink:'Unlink',undo:'Undo',redo:'Redo',common:{browseServer:'Browse Server',url:'URL',protocol:'Protocol',upload:'Upload',uploadSubmit:'Send it to the Server',image:'Image',flash:'Flash',form:'Form',checkbox:'Checkbox',radio:'Radio Button',textField:'Text Field',textarea:'Textarea',hiddenField:'Hidden Field',button:'Button',select:'Selection Field',imageButton:'Image Button',notSet:'<not set>',id:'Id',name:'Name',langDir:'Language Direction',langDirLtr:'Left to Right (LTR)',langDirRtl:'Right to Left (RTL)',langCode:'Language Code',longDescr:'Long Description URL',cssClass:'Stylesheet Classes',advisoryTitle:'Advisory Title',cssStyle:'Style',ok:'OK',cancel:'Cancel',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Advanced',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Width',height:'Height',align:'Align',alignLeft:'Left',alignRight:'Right',alignCenter:'Centre',alignTop:'Top',alignMiddle:'Middle',alignBottom:'Bottom',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Insert Special Character',title:'Select Special Character',options:'Special Character Options'},link:{toolbar:'Link',other:'<other>',menu:'Edit Link',title:'Link',info:'Link Info',target:'Target',upload:'Upload',advanced:'Advanced',type:'Link Type',toUrl:'URL',toAnchor:'Link to anchor in the text',toEmail:'E-mail',targetFrame:'<frame>',targetPopup:'<popup window>',targetFrameName:'Target Frame Name',targetPopupName:'Popup Window Name',popupFeatures:'Popup Window Features',popupResizable:'Resizable',popupStatusBar:'Status Bar',popupLocationBar:'Location Bar',popupToolbar:'Toolbar',popupMenuBar:'Menu Bar',popupFullScreen:'Full Screen (IE)',popupScrollBars:'Scroll Bars',popupDependent:'Dependent (Netscape)',popupLeft:'Left Position',popupTop:'Top Position',id:'Id',langDir:'Language Direction',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',acccessKey:'Access Key',name:'Name',langCode:'Language Code',tabIndex:'Tab Index',advisoryTitle:'Advisory Title',advisoryContentType:'Advisory Content Type',cssClasses:'Stylesheet Classes',charset:'Linked Resource Charset',styles:'Style',rel:'Relationship',selectAnchor:'Select an Anchor',anchorName:'By Anchor Name',anchorId:'By Element Id',emailAddress:'E-Mail Address',emailSubject:'Message Subject',emailBody:'Message Body',noAnchors:'(No anchors available in the document)',noUrl:'Please type the link URL',noEmail:'Please type the e-mail address'},anchor:{toolbar:'Anchor',menu:'Edit Anchor',title:'Anchor Properties',name:'Anchor Name',errorName:'Please type the anchor name',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Find',replace:'Replace',findWhat:'Find what:',replaceWith:'Replace with:',notFoundMsg:'The specified text was not found.',findOptions:'Find Options',matchCase:'Match case',matchWord:'Match whole word',matchCyclic:'Match cyclic',replaceAll:'Replace All',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Table',title:'Table Properties',menu:'Table Properties',deleteTable:'Delete Table',rows:'Rows',columns:'Columns',border:'Border size',widthPx:'pixels',widthPc:'percent',widthUnit:'width unit',cellSpace:'Cell spacing',cellPad:'Cell padding',caption:'Caption',summary:'Summary',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a number.',invalidCellPadding:'Cell padding must be a number.',cell:{menu:'Cell',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Delete Cells',merge:'Merge Cells',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Row',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Delete Rows'},column:{menu:'Column',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Delete Columns'}},button:{title:'Button Properties',text:'Text (Value)',type:'Type',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Checkbox Properties',radioTitle:'Radio Button Properties',value:'Value',selected:'Selected'},form:{title:'Form Properties',menu:'Form Properties',action:'Action',method:'Method',encoding:'Encoding'},select:{title:'Selection Field Properties',selectInfo:'Select Info',opAvail:'Available Options',value:'Value',size:'Size',lines:'lines',chkMulti:'Allow multiple selections',opText:'Text',opValue:'Value',btnAdd:'Add',btnModify:'Modify',btnUp:'Up',btnDown:'Down',btnSetValue:'Set as selected value',btnDelete:'Delete'},textarea:{title:'Textarea Properties',cols:'Columns',rows:'Rows'},textfield:{title:'Text Field Properties',name:'Name',value:'Value',charWidth:'Character Width',maxChars:'Maximum Characters',type:'Type',typeText:'Text',typePass:'Password'},hidden:{title:'Hidden Field Properties',name:'Name',value:'Value'},image:{title:'Image Properties',titleButton:'Image Button Properties',menu:'Image Properties',infoTab:'Image Info',btnUpload:'Send it to the Server',upload:'Upload',alt:'Alternative Text',lockRatio:'Lock Ratio',resetSize:'Reset Size',border:'Border',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Please type the image URL',linkTab:'Link',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Flash Properties',propertiesTab:'Properties',title:'Flash Properties',chkPlay:'Auto Play',chkLoop:'Loop',chkMenu:'Enable Flash Menu',chkFull:'Allow Fullscreen',scale:'Scale',scaleAll:'Show all',scaleNoBorder:'No Border',scaleFit:'Exact Fit',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs Bottom',alignAbsMiddle:'Abs Middle',alignBaseline:'Baseline',alignTextTop:'Text Top',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Background colour',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'URL must not be empty.',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Check Spelling',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Not in dictionary',changeTo:'Change to',btnIgnore:'Ignore',btnIgnoreAll:'Ignore All',btnReplace:'Replace',btnReplaceAll:'Replace All',btnUndo:'Undo',noSuggestions:'- No suggestions -',progress:'Spell check in progress...',noMispell:'Spell check complete: No misspellings found',noChanges:'Spell check complete: No words changed',oneChange:'Spell check complete: One word changed',manyChanges:'Spell check complete: %1 words changed',ieSpellDownload:'Spell checker not installed. Do you want to download it now?'},smiley:{toolbar:'Smiley',title:'Insert a Smiley',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Insert/Remove Numbered List',bulletedlist:'Insert/Remove Bulleted List',indent:'Increase Indent',outdent:'Decrease Indent',justify:{left:'Align Left',center:'Centre',right:'Align Right',block:'Justify'},blockquote:'Block Quote',clipboard:{title:'Paste',cutError:"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).",copyError:"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).",pasteMsg:'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Paste from Word',title:'Paste from Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Paste as plain text',title:'Paste as Plain Text'},templates:{button:'Templates',title:'Content Templates',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Please select the template to open in the editor',emptyListMsg:'(No templates defined)'},showBlocks:'Show Blocks',stylesCombo:{label:'Styles',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Format',panelTitle:'Paragraph Format',tag_p:'Normal',tag_pre:'Formatted',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Font',voiceLabel:'Font',panelTitle:'Font Name'},fontSize:{label:'Size',voiceLabel:'Font Size',panelTitle:'Font Size'},colorButton:{textColorTitle:'Text Colour',bgColorTitle:'Background Colour',panelTitle:'Colours',auto:'Automatic',more:'More Colours...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Grey','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Grey',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Grey',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Grey',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximise',minimize:'Minimise',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select colour',options:'Colour Options',highlight:'Highlight',selected:'Selected Colour',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Document Properties',title:'Document Properties',design:'Design',meta:'Meta Tags',chooseColor:'Choose',other:'Other...',docTitle:'Page Title',charset:'Character Set Encoding',charsetOther:'Other Character Set Encoding',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Document Type Heading',docTypeOther:'Other Document Type Heading',xhtmlDec:'Include XHTML Declarations',bgColor:'Background Color',bgImage:'Background Image URL',bgFixed:'Non-scrolling (Fixed) Background',txtColor:'Text Color',margin:'Page Margins',marginTop:'Top',marginLeft:'Left',marginRight:'Right',marginBottom:'Bottom',metaKeywords:'Document Indexing Keywords (comma separated)',metaDescription:'Document Description',metaAuthor:'Author',metaCopyright:'Copyright',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang['en-gb']={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Source',newPage:'New Page',save:'Save',preview:'Preview',cut:'Cut',copy:'Copy',paste:'Paste',print:'Print',underline:'Underline',bold:'Bold',italic:'Italic',selectAll:'Select All',removeFormat:'Remove Format',strike:'Strike Through',subscript:'Subscript',superscript:'Superscript',horizontalrule:'Insert Horizontal Line',pagebreak:'Insert Page Break for Printing',pagebreakAlt:'Page Break',unlink:'Unlink',undo:'Undo',redo:'Redo',common:{browseServer:'Browse Server',url:'URL',protocol:'Protocol',upload:'Upload',uploadSubmit:'Send it to the Server',image:'Image',flash:'Flash',form:'Form',checkbox:'Checkbox',radio:'Radio Button',textField:'Text Field',textarea:'Textarea',hiddenField:'Hidden Field',button:'Button',select:'Selection Field',imageButton:'Image Button',notSet:'<not set>',id:'Id',name:'Name',langDir:'Language Direction',langDirLtr:'Left to Right (LTR)',langDirRtl:'Right to Left (RTL)',langCode:'Language Code',longDescr:'Long Description URL',cssClass:'Stylesheet Classes',advisoryTitle:'Advisory Title',cssStyle:'Style',ok:'OK',cancel:'Cancel',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Advanced',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Width',height:'Height',align:'Align',alignLeft:'Left',alignRight:'Right',alignCenter:'Centre',alignTop:'Top',alignMiddle:'Middle',alignBottom:'Bottom',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Insert Special Character',title:'Select Special Character',options:'Special Character Options'},link:{toolbar:'Link',other:'<other>',menu:'Edit Link',title:'Link',info:'Link Info',target:'Target',upload:'Upload',advanced:'Advanced',type:'Link Type',toUrl:'URL',toAnchor:'Link to anchor in the text',toEmail:'E-mail',targetFrame:'<frame>',targetPopup:'<popup window>',targetFrameName:'Target Frame Name',targetPopupName:'Popup Window Name',popupFeatures:'Popup Window Features',popupResizable:'Resizable',popupStatusBar:'Status Bar',popupLocationBar:'Location Bar',popupToolbar:'Toolbar',popupMenuBar:'Menu Bar',popupFullScreen:'Full Screen (IE)',popupScrollBars:'Scroll Bars',popupDependent:'Dependent (Netscape)',popupLeft:'Left Position',popupTop:'Top Position',id:'Id',langDir:'Language Direction',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',acccessKey:'Access Key',name:'Name',langCode:'Language Code',tabIndex:'Tab Index',advisoryTitle:'Advisory Title',advisoryContentType:'Advisory Content Type',cssClasses:'Stylesheet Classes',charset:'Linked Resource Charset',styles:'Style',rel:'Relationship',selectAnchor:'Select an Anchor',anchorName:'By Anchor Name',anchorId:'By Element Id',emailAddress:'E-Mail Address',emailSubject:'Message Subject',emailBody:'Message Body',noAnchors:'(No anchors available in the document)',noUrl:'Please type the link URL',noEmail:'Please type the e-mail address'},anchor:{toolbar:'Anchor',menu:'Edit Anchor',title:'Anchor Properties',name:'Anchor Name',errorName:'Please type the anchor name',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Find',replace:'Replace',findWhat:'Find what:',replaceWith:'Replace with:',notFoundMsg:'The specified text was not found.',findOptions:'Find Options',matchCase:'Match case',matchWord:'Match whole word',matchCyclic:'Match cyclic',replaceAll:'Replace All',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Table',title:'Table Properties',menu:'Table Properties',deleteTable:'Delete Table',rows:'Rows',columns:'Columns',border:'Border size',widthPx:'pixels',widthPc:'percent',widthUnit:'width unit',cellSpace:'Cell spacing',cellPad:'Cell padding',caption:'Caption',summary:'Summary',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a number.',invalidCellPadding:'Cell padding must be a number.',cell:{menu:'Cell',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Delete Cells',merge:'Merge Cells',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Row',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Delete Rows'},column:{menu:'Column',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Delete Columns'}},button:{title:'Button Properties',text:'Text (Value)',type:'Type',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Checkbox Properties',radioTitle:'Radio Button Properties',value:'Value',selected:'Selected'},form:{title:'Form Properties',menu:'Form Properties',action:'Action',method:'Method',encoding:'Encoding'},select:{title:'Selection Field Properties',selectInfo:'Select Info',opAvail:'Available Options',value:'Value',size:'Size',lines:'lines',chkMulti:'Allow multiple selections',opText:'Text',opValue:'Value',btnAdd:'Add',btnModify:'Modify',btnUp:'Up',btnDown:'Down',btnSetValue:'Set as selected value',btnDelete:'Delete'},textarea:{title:'Textarea Properties',cols:'Columns',rows:'Rows'},textfield:{title:'Text Field Properties',name:'Name',value:'Value',charWidth:'Character Width',maxChars:'Maximum Characters',type:'Type',typeText:'Text',typePass:'Password'},hidden:{title:'Hidden Field Properties',name:'Name',value:'Value'},image:{title:'Image Properties',titleButton:'Image Button Properties',menu:'Image Properties',infoTab:'Image Info',btnUpload:'Send it to the Server',upload:'Upload',alt:'Alternative Text',lockRatio:'Lock Ratio',resetSize:'Reset Size',border:'Border',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Please type the image URL',linkTab:'Link',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Flash Properties',propertiesTab:'Properties',title:'Flash Properties',chkPlay:'Auto Play',chkLoop:'Loop',chkMenu:'Enable Flash Menu',chkFull:'Allow Fullscreen',scale:'Scale',scaleAll:'Show all',scaleNoBorder:'No Border',scaleFit:'Exact Fit',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs Bottom',alignAbsMiddle:'Abs Middle',alignBaseline:'Baseline',alignTextTop:'Text Top',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Background colour',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'URL must not be empty.',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Check Spelling',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Not in dictionary',changeTo:'Change to',btnIgnore:'Ignore',btnIgnoreAll:'Ignore All',btnReplace:'Replace',btnReplaceAll:'Replace All',btnUndo:'Undo',noSuggestions:'- No suggestions -',progress:'Spell check in progress...',noMispell:'Spell check complete: No misspellings found',noChanges:'Spell check complete: No words changed',oneChange:'Spell check complete: One word changed',manyChanges:'Spell check complete: %1 words changed',ieSpellDownload:'Spell checker not installed. Do you want to download it now?'},smiley:{toolbar:'Smiley',title:'Insert a Smiley',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Insert/Remove Numbered List',bulletedlist:'Insert/Remove Bulleted List',indent:'Increase Indent',outdent:'Decrease Indent',justify:{left:'Align Left',center:'Centre',right:'Align Right',block:'Justify'},blockquote:'Block Quote',clipboard:{title:'Paste',cutError:"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).",copyError:"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).",pasteMsg:'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Paste from Word',title:'Paste from Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Paste as plain text',title:'Paste as Plain Text'},templates:{button:'Templates',title:'Content Templates',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Please select the template to open in the editor',emptyListMsg:'(No templates defined)'},showBlocks:'Show Blocks',stylesCombo:{label:'Styles',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Format',panelTitle:'Paragraph Format',tag_p:'Normal',tag_pre:'Formatted',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Font',voiceLabel:'Font',panelTitle:'Font Name'},fontSize:{label:'Size',voiceLabel:'Font Size',panelTitle:'Font Size'},colorButton:{textColorTitle:'Text Colour',bgColorTitle:'Background Colour',panelTitle:'Colours',auto:'Automatic',more:'More Colours...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Grey','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Grey',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Grey',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Grey',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximise',minimize:'Minimise',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select colour',options:'Colour Options',highlight:'Highlight',selected:'Selected Colour',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Document Properties',title:'Document Properties',design:'Design',meta:'Meta Tags',chooseColor:'Choose',other:'Other...',docTitle:'Page Title',charset:'Character Set Encoding',charsetOther:'Other Character Set Encoding',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Document Type Heading',docTypeOther:'Other Document Type Heading',xhtmlDec:'Include XHTML Declarations',bgColor:'Background Color',bgImage:'Background Image URL',bgFixed:'Non-scrolling (Fixed) Background',txtColor:'Text Color',margin:'Page Margins',marginTop:'Top',marginLeft:'Left',marginRight:'Right',marginBottom:'Bottom',metaKeywords:'Document Indexing Keywords (comma separated)',metaDescription:'Document Description',metaAuthor:'Author',metaCopyright:'Copyright',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/es.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/es.js
index e48c580..fc2c631 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/es.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/es.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.es={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Barras de herramientas del editor',editor:'Editor de texto enriquecido',source:'Fuente HTML',newPage:'Nueva Página',save:'Guardar',preview:'Vista Previa',cut:'Cortar',copy:'Copiar',paste:'Pegar',print:'Imprimir',underline:'Subrayado',bold:'Negrita',italic:'Cursiva',selectAll:'Seleccionar Todo',removeFormat:'Eliminar Formato',strike:'Tachado',subscript:'Subíndice',superscript:'Superíndice',horizontalrule:'Insertar Línea Horizontal',pagebreak:'Insertar Salto de Página',pagebreakAlt:'Salto de página',unlink:'Eliminar Vínculo',undo:'Deshacer',redo:'Rehacer',common:{browseServer:'Ver Servidor',url:'URL',protocol:'Protocolo',upload:'Cargar',uploadSubmit:'Enviar al Servidor',image:'Imagen',flash:'Flash',form:'Formulario',checkbox:'Casilla de Verificación',radio:'Botones de Radio',textField:'Campo de Texto',textarea:'Area de Texto',hiddenField:'Campo Oculto',button:'Botón',select:'Campo de Selección',imageButton:'Botón Imagen',notSet:'<No definido>',id:'Id',name:'Nombre',langDir:'Orientación',langDirLtr:'Izquierda a Derecha (LTR)',langDirRtl:'Derecha a Izquierda (RTL)',langCode:'Cód. de idioma',longDescr:'Descripción larga URL',cssClass:'Clases de hojas de estilo',advisoryTitle:'Título',cssStyle:'Estilo',ok:'Aceptar',cancel:'Cancelar',close:'Cerrar',preview:'Previsualización',generalTab:'General',advancedTab:'Avanzado',validateNumberFailed:'El valor no es un número.',confirmNewPage:'Cualquier cambio que no se haya guardado se perderá.\r\n¿Está seguro de querer crear una nueva página?',confirmCancel:'Algunas de las opciones se han cambiado.\r\n¿Está seguro de querer cerrar el diálogo?',options:'Opciones',target:'Destino',targetNew:'Nueva ventana (_blank)',targetTop:'Ventana principal (_top)',targetSelf:'Misma ventana (_self)',targetParent:'Ventana padre (_parent)',langDirLTR:'Izquierda a derecha (LTR)',langDirRTL:'Derecha a izquierda (RTL)',styles:'Estilos',cssClasses:'Clase de la hoja de estilos',width:'Anchura',height:'Altura',align:'Alineación',alignLeft:'Izquierda',alignRight:'Derecha',alignCenter:'Centrado',alignTop:'Tope',alignMiddle:'Centro',alignBottom:'Pie',invalidHeight:'Altura debe ser un número.',invalidWidth:'Anchura debe ser un número.',invalidCssLength:'El valor especificado para el campo "%1" debe ser un número positivo, incluyendo optionalmente una unidad de medida CSS válida (px, %, in, cm, mm, em, ex, pt, o pc).',invalidHtmlLength:'El valor especificado para el campo "%1" debe ser un número positivo, incluyendo optionalmente una unidad de medida HTML válida (px o %).',invalidInlineStyle:'El valor especificado para el estilo debe consistir en uno o más pares con el formato "nombre: valor", separados por punto y coma.',cssLengthTooltip:'Introduca un número para el valor en pixels o un número con una unidad de medida CSS válida (px, %, in, cm, mm, em, ex, pt, o pc).',unavailable:'%1<span class="cke_accessibility">, no disponible</span>'},contextmenu:{options:'Opciones del menú contextual'},specialChar:{toolbar:'Insertar Caracter Especial',title:'Seleccione un caracter especial',options:'Opciones de caracteres especiales'},link:{toolbar:'Insertar/Editar Vínculo',other:'<otro>',menu:'Editar Vínculo',title:'Vínculo',info:'Información de Vínculo',target:'Destino',upload:'Cargar',advanced:'Avanzado',type:'Tipo de vínculo',toUrl:'URL',toAnchor:'Referencia en esta página',toEmail:'E-Mail',targetFrame:'<marco>',targetPopup:'<ventana emergente>',targetFrameName:'Nombre del Marco Destino',targetPopupName:'Nombre de Ventana Emergente',popupFeatures:'Características de Ventana Emergente',popupResizable:'Redimensionable',popupStatusBar:'Barra de Estado',popupLocationBar:'Barra de ubicación',popupToolbar:'Barra de Herramientas',popupMenuBar:'Barra de Menú',popupFullScreen:'Pantalla Completa (IE)',popupScrollBars:'Barras de desplazamiento',popupDependent:'Dependiente (Netscape)',popupLeft:'Posición Izquierda',popupTop:'Posición Derecha',id:'Id',langDir:'Orientación',langDirLTR:'Izquierda a Derecha (LTR)',langDirRTL:'Derecha a Izquierda (RTL)',acccessKey:'Tecla de Acceso',name:'Nombre',langCode:'Código idioma',tabIndex:'Indice de tabulación',advisoryTitle:'Título',advisoryContentType:'Tipo de Contenido',cssClasses:'Clases de hojas de estilo',charset:'Fuente de caracteres vinculado',styles:'Estilo',rel:'Relación',selectAnchor:'Seleccionar una referencia',anchorName:'Por Nombre de Referencia',anchorId:'Por ID de elemento',emailAddress:'Dirección de E-Mail',emailSubject:'Título del Mensaje',emailBody:'Cuerpo del Mensaje',noAnchors:'(No hay referencias disponibles en el documento)',noUrl:'Por favor escriba el vínculo URL',noEmail:'Por favor escriba la dirección de e-mail'},anchor:{toolbar:'Referencia',menu:'Propiedades de Referencia',title:'Propiedades de Referencia',name:'Nombre de la Referencia',errorName:'Por favor, complete el nombre de la Referencia',remove:'Quitar Referencia'},list:{numberedTitle:'Propiedades de lista numerada',bulletedTitle:'Propiedades de viñetas',type:'Tipo',start:'Inicio',validateStartNumber:'El Inicio debe ser un número entero.',circle:'Círculo',disc:'Disco',square:'Cuadrado',none:'Ninguno',notset:'<sin establecer>',armenian:'Numeración armenia',georgian:'Numeración georgiana (an, ban, gan, etc.)',lowerRoman:'Números romanos en minúsculas (i, ii, iii, iv, v, etc.)',upperRoman:'Números romanos en mayúsculas (I, II, III, IV, V, etc.)',lowerAlpha:'Alfabeto en minúsculas (a, b, c, d, e, etc.)',upperAlpha:'Alfabeto en mayúsculas (A, B, C, D, E, etc.)',lowerGreek:'Letras griegas (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal con cero inicial (01, 02, 03, etc.)'},findAndReplace:{title:'Buscar y Reemplazar',find:'Buscar',replace:'Reemplazar',findWhat:'Texto a buscar:',replaceWith:'Reemplazar con:',notFoundMsg:'El texto especificado no ha sido encontrado.',findOptions:'Opciones de búsqueda',matchCase:'Coincidir may/min',matchWord:'Coincidir toda la palabra',matchCyclic:'Buscar en todo el contenido',replaceAll:'Reemplazar Todo',replaceSuccessMsg:'La expresión buscada ha sido reemplazada %1 veces.'},table:{toolbar:'Tabla',title:'Propiedades de Tabla',menu:'Propiedades de Tabla',deleteTable:'Eliminar Tabla',rows:'Filas',columns:'Columnas',border:'Tamaño de Borde',widthPx:'pixeles',widthPc:'porcentaje',widthUnit:'unidad de la anchura',cellSpace:'Esp. e/celdas',cellPad:'Esp. interior',caption:'Título',summary:'Síntesis',headers:'Encabezados',headersNone:'Ninguno',headersColumn:'Primera columna',headersRow:'Primera fila',headersBoth:'Ambas',invalidRows:'El número de filas debe ser un número mayor que 0.',invalidCols:'El número de columnas debe ser un número mayor que 0.',invalidBorder:'El tamaño del borde debe ser un número.',invalidWidth:'La anchura de tabla debe ser un número.',invalidHeight:'La altura de tabla debe ser un número.',invalidCellSpacing:'El espaciado entre celdas debe ser un número.',invalidCellPadding:'El espaciado interior debe ser un número.',cell:{menu:'Celda',insertBefore:'Insertar celda a la izquierda',insertAfter:'Insertar celda a la derecha',deleteCell:'Eliminar Celdas',merge:'Combinar Celdas',mergeRight:'Combinar a la derecha',mergeDown:'Combinar hacia abajo',splitHorizontal:'Dividir la celda horizontalmente',splitVertical:'Dividir la celda verticalmente',title:'Propiedades de celda',cellType:'Tipo de Celda',rowSpan:'Expandir filas',colSpan:'Expandir columnas',wordWrap:'Ajustar al contenido',hAlign:'Alineación Horizontal',vAlign:'Alineación Vertical',alignBaseline:'Linea de base',bgColor:'Color de fondo',borderColor:'Color de borde',data:'Datos',header:'Encabezado',yes:'Sí',no:'No',invalidWidth:'La anchura de celda debe ser un número.',invalidHeight:'La altura de celda debe ser un número.',invalidRowSpan:'La expansión de filas debe ser un número entero.',invalidColSpan:'La expansión de columnas debe ser un número entero.',chooseColor:'Elegir'},row:{menu:'Fila',insertBefore:'Insertar fila en la parte superior',insertAfter:'Insertar fila en la parte inferior',deleteRow:'Eliminar Filas'},column:{menu:'Columna',insertBefore:'Insertar columna a la izquierda',insertAfter:'Insertar columna a la derecha',deleteColumn:'Eliminar Columnas'}},button:{title:'Propiedades de Botón',text:'Texto (Valor)',type:'Tipo',typeBtn:'Boton',typeSbm:'Enviar',typeRst:'Reestablecer'},checkboxAndRadio:{checkboxTitle:'Propiedades de Casilla',radioTitle:'Propiedades de Botón de Radio',value:'Valor',selected:'Seleccionado'},form:{title:'Propiedades de Formulario',menu:'Propiedades de Formulario',action:'Acción',method:'Método',encoding:'Codificación'},select:{title:'Propiedades de Campo de Selección',selectInfo:'Información',opAvail:'Opciones disponibles',value:'Valor',size:'Tamaño',lines:'Lineas',chkMulti:'Permitir múltiple selección',opText:'Texto',opValue:'Valor',btnAdd:'Agregar',btnModify:'Modificar',btnUp:'Subir',btnDown:'Bajar',btnSetValue:'Establecer como predeterminado',btnDelete:'Eliminar'},textarea:{title:'Propiedades de Area de Texto',cols:'Columnas',rows:'Filas'},textfield:{title:'Propiedades de Campo de Texto',name:'Nombre',value:'Valor',charWidth:'Caracteres de ancho',maxChars:'Máximo caracteres',type:'Tipo',typeText:'Texto',typePass:'Contraseña'},hidden:{title:'Propiedades de Campo Oculto',name:'Nombre',value:'Valor'},image:{title:'Propiedades de Imagen',titleButton:'Propiedades de Botón de Imagen',menu:'Propiedades de Imagen',infoTab:'Información de Imagen',btnUpload:'Enviar al Servidor',upload:'Cargar',alt:'Texto Alternativo',lockRatio:'Proporcional',resetSize:'Tamaño Original',border:'Borde',hSpace:'Esp.Horiz',vSpace:'Esp.Vert',alertUrl:'Por favor escriba la URL de la imagen',linkTab:'Vínculo',button2Img:'¿Desea convertir el botón de imagen en una simple imagen?',img2Button:'¿Desea convertir la imagen en un botón de imagen?',urlMissing:'Debe indicar la URL de la imagen.',validateBorder:'El borde debe ser un número.',validateHSpace:'El espaciado horizontal debe ser un número.',validateVSpace:'El espaciado vertical debe ser un número.'},flash:{properties:'Propiedades de Flash',propertiesTab:'Propiedades',title:'Propiedades de Flash',chkPlay:'Autoejecución',chkLoop:'Repetir',chkMenu:'Activar Menú Flash',chkFull:'Permitir pantalla completa',scale:'Escala',scaleAll:'Mostrar todo',scaleNoBorder:'Sin Borde',scaleFit:'Ajustado',access:'Acceso de scripts',accessAlways:'Siempre',accessSameDomain:'Mismo dominio',accessNever:'Nunca',alignAbsBottom:'Abs inferior',alignAbsMiddle:'Abs centro',alignBaseline:'Línea de base',alignTextTop:'Tope del texto',quality:'Calidad',qualityBest:'La mejor',qualityHigh:'Alta',qualityAutoHigh:'Auto Alta',qualityMedium:'Media',qualityAutoLow:'Auto Baja',qualityLow:'Baja',windowModeWindow:'Ventana',windowModeOpaque:'Opaco',windowModeTransparent:'Transparente',windowMode:'WindowMode',flashvars:'Opciones',bgcolor:'Color de Fondo',hSpace:'Esp.Horiz',vSpace:'Esp.Vert',validateSrc:'Por favor escriba el vínculo URL',validateHSpace:'Esp.Horiz debe ser un número.',validateVSpace:'Esp.Vert debe ser un número.'},spellCheck:{toolbar:'Ortografía',title:'Comprobar ortografía',notAvailable:'Lo sentimos pero el servicio no está disponible.',errorLoading:'Error cargando la aplicación del servidor: %s.',notInDic:'No se encuentra en el Diccionario',changeTo:'Cambiar a',btnIgnore:'Ignorar',btnIgnoreAll:'Ignorar Todo',btnReplace:'Reemplazar',btnReplaceAll:'Reemplazar Todo',btnUndo:'Deshacer',noSuggestions:'- No hay sugerencias -',progress:'Control de Ortografía en progreso...',noMispell:'Control finalizado: no se encontraron errores',noChanges:'Control finalizado: no se ha cambiado ninguna palabra',oneChange:'Control finalizado: se ha cambiado una palabra',manyChanges:'Control finalizado: se ha cambiado %1 palabras',ieSpellDownload:'Módulo de Control de Ortografía no instalado.\r\n¿Desea descargarlo ahora?'},smiley:{toolbar:'Emoticonos',title:'Insertar un Emoticon',options:'Opciones de emoticonos'},elementsPath:{eleLabel:'Ruta de los elementos',eleTitle:'%1 elemento'},numberedlist:'Numeración',bulletedlist:'Viñetas',indent:'Aumentar Sangría',outdent:'Disminuir Sangría',justify:{left:'Alinear a Izquierda',center:'Centrar',right:'Alinear a Derecha',block:'Justificado'},blockquote:'Cita',clipboard:{title:'Pegar',cutError:'La configuración de seguridad de este navegador no permite la ejecución automática de operaciones de cortado.\r\nPor favor use el teclado (Ctrl/Cmd+X).',copyError:'La configuración de seguridad de este navegador no permite la ejecución automática de operaciones de copiado.\r\nPor favor use el teclado (Ctrl/Cmd+C).',pasteMsg:'Por favor pegue dentro del cuadro utilizando el teclado (<STRONG>Ctrl/Cmd+V</STRONG>);\r\nluego presione <STRONG>Aceptar</STRONG>.',securityMsg:'Debido a la configuración de seguridad de su navegador, el editor no tiene acceso al portapapeles.\r\nEs necesario que lo pegue de nuevo en esta ventana.',pasteArea:'Zona de pegado'},pastefromword:{confirmCleanup:'El texto que desea parece provenir de Word.\r\n¿Desea depurarlo antes de pegarlo?',toolbar:'Pegar desde Word',title:'Pegar desde Word',error:'No ha sido posible limpiar los datos debido a un error interno'},pasteText:{button:'Pegar como Texto Plano',title:'Pegar como Texto Plano'},templates:{button:'Plantillas',title:'Contenido de Plantillas',options:'Opciones de plantillas',insertOption:'Reemplazar el contenido actual',selectPromptMsg:'Por favor selecciona la plantilla a abrir en el editor<br>(el contenido actual se perderá):',emptyListMsg:'(No hay plantillas definidas)'},showBlocks:'Mostrar bloques',stylesCombo:{label:'Estilo',panelTitle:'Estilos para formatear',panelTitle1:'Estilos de párrafo',panelTitle2:'Estilos de carácter',panelTitle3:'Estilos de objeto'},format:{label:'Formato',panelTitle:'Formato',tag_p:'Normal',tag_pre:'Con formato',tag_address:'Dirección',tag_h1:'Encabezado 1',tag_h2:'Encabezado 2',tag_h3:'Encabezado 3',tag_h4:'Encabezado 4',tag_h5:'Encabezado 5',tag_h6:'Encabezado 6',tag_div:'Normal (DIV)'},div:{title:'Crear contenedor DIV',toolbar:'Crear contenedor DIV',cssClassInputLabel:'Clase de hoja de estilos',styleSelectLabel:'Estilo',IdInputLabel:'Id',languageCodeInputLabel:' Codigo de idioma',inlineStyleInputLabel:'Estilo',advisoryTitleInputLabel:'Título',langDirLabel:'Orientación',langDirLTRLabel:'Izquierda a Derecha (LTR)',langDirRTLLabel:'Derecha a Izquierda (RTL)',edit:'Editar Div',remove:'Quitar Div'},iframe:{title:'Propiedades de iframe',toolbar:'IFrame',noUrl:'Por favor, escriba la dirección del iframe',scrolling:'Activar barras de desplazamiento',border:'Mostrar borde del marco'},font:{label:'Fuente',voiceLabel:'Fuente',panelTitle:'Fuente'},fontSize:{label:'Tamaño',voiceLabel:'Tamaño de fuente',panelTitle:'Tamaño'},colorButton:{textColorTitle:'Color de Texto',bgColorTitle:'Color de Fondo',panelTitle:'Colores',auto:'Automático',more:'Más Colores...'},colors:{'000':'Negro',800000:'Marrón oscuro','8B4513':'Marrón tierra','2F4F4F':'Pizarra Oscuro','008080':'Azul verdoso','000080':'Azul marino','4B0082':'Añil',696969:'Gris oscuro',B22222:'Ladrillo',A52A2A:'Marrón',DAA520:'Oro oscuro','006400':'Verde oscuro','40E0D0':'Turquesa','0000CD':'Azul medio-oscuro',800080:'Púrpura',808080:'Gris',F00:'Rojo',FF8C00:'Naranja oscuro',FFD700:'Oro','008000':'Verde','0FF':'Cian','00F':'Azul',EE82EE:'Violeta',A9A9A9:'Gris medio',FFA07A:'Salmón claro',FFA500:'Naranja',FFFF00:'Amarillo','00FF00':'Lima',AFEEEE:'Turquesa claro',ADD8E6:'Azul claro',DDA0DD:'Violeta claro',D3D3D3:'Gris claro',FFF0F5:'Lavanda rojizo',FAEBD7:'Blanco antiguo',FFFFE0:'Amarillo claro',F0FFF0:'Miel',F0FFFF:'Azul celeste',F0F8FF:'Azul pálido',E6E6FA:'Lavanda',FFF:'Blanco'},scayt:{title:'Comprobar Ortografía Mientras Escribe',opera_title:'No soportado en Opera',enable:'Activar Corrector',disable:'Desactivar Corrector',about:'Acerca de Corrector',toggle:'Cambiar Corrector',options:'Opciones',langs:'Idiomas',moreSuggestions:'Más sugerencias',ignore:'Ignorar',ignoreAll:'Ignorar Todas',addWord:'Añadir palabra',emptyDic:'El nombre del diccionario no puede estar en blanco.',optionsTab:'Opciones',allCaps:'Omitir palabras en MAYÚSCULAS',ignoreDomainNames:'Omitir nombres de dominio',mixedCase:'Ignorar palabras con combinación de mayúsculas y minúsculas',mixedWithDigits:'Omitir palabras con números',languagesTab:'Idiomas',dictionariesTab:'Diccionarios',dic_field_name:'Nombre del diccionario',dic_create:'Crear',dic_restore:'Recuperar',dic_delete:'Borrar',dic_rename:'Renombrar',dic_info:'Inicialmente el Diccionario de usuario se guarda en una Cookie. Sin embargo, las cookies están limitadas en tamaño. Cuando el diccionario crece a un punto en el que no se puede guardar en una Cookie, el diccionario puede ser almacenado en nuestro servidor. Para almacenar su diccionario personalizado en nuestro servidor debe especificar un nombre para su diccionario. Si ya ha guardado un diccionaro, por favor, escriba su nombre y pulse el botón Recuperar',aboutTab:'Acerca de'},about:{title:'Acerca de CKEditor',dlgTitle:'Acerca de CKEditor',help:'Lea la $1 para resolver sus dudas.',userGuide:'Guía de usuario de CKEditor',moreInfo:'Para información de licencia, por favor visite nuestro sitio web:',copy:'Copyright © $1. Todos los derechos reservados.'},maximize:'Maximizar',minimize:'Minimizar',fakeobjects:{anchor:'Ancla',flash:'Animación flash',iframe:'IFrame',hiddenfield:'Campo oculto',unknown:'Objeto desconocido'},resize:'Arrastre para redimensionar',colordialog:{title:'Elegir color',options:'Opciones de colores',highlight:'Muestra',selected:'Elegido',clear:'Borrar'},toolbarCollapse:'Contraer barra de herramientas',toolbarExpand:'Expandir barra de herramientas',toolbarGroups:{document:'Documento',clipboard:'Portapapeles/Deshacer',editing:'Edición',forms:'Formularios',basicstyles:'Estilos básicos',paragraph:'Párrafo',links:'Enlaces',insert:'Insertar',styles:'Estilos',colors:'Colores',tools:'Herramientas'},bidi:{ltr:'Dirección del texto de izquierda a derecha',rtl:'Dirección del texto de derecha a izquierda'},docprops:{label:'Propiedades del documento',title:'Propiedades del documento',design:'Diseño',meta:'Meta Tags',chooseColor:'Elegir',other:'Otro...',docTitle:'Título de página',charset:'Codificación de caracteres',charsetOther:'Otra codificación de caracteres',charsetASCII:'ASCII',charsetCE:'Centro Europeo',charsetCT:'Chino Tradicional (Big5)',charsetCR:'Ruso',charsetGR:'Griego',charsetJP:'Japonés',charsetKR:'Koreano',charsetTR:'Turco',charsetUN:'Unicode (UTF-8)',charsetWE:'Europeo occidental',docType:'Tipo de documento',docTypeOther:'Otro tipo de documento',xhtmlDec:'Incluir declaración XHTML',bgColor:'Color de fondo',bgImage:'Imagen de fondo',bgFixed:'Fondo fijo (no se desplaza)',txtColor:'Color del texto',margin:'Márgenes',marginTop:'Superior',marginLeft:'Izquierdo',marginRight:'Derecho',marginBottom:'Inferior',metaKeywords:'Palabras claves del documento separadas por coma (meta keywords)',metaDescription:'Descripción del documento',metaAuthor:'Autor',metaCopyright:'Copyright',previewHtml:'<p>Este es un <strong>texto de ejemplo</strong>. Usted está usando <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.es={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Barras de herramientas del editor',editor:'Editor de texto enriquecido',source:'Fuente HTML',newPage:'Nueva Página',save:'Guardar',preview:'Vista Previa',cut:'Cortar',copy:'Copiar',paste:'Pegar',print:'Imprimir',underline:'Subrayado',bold:'Negrita',italic:'Cursiva',selectAll:'Seleccionar Todo',removeFormat:'Eliminar Formato',strike:'Tachado',subscript:'Subíndice',superscript:'Superíndice',horizontalrule:'Insertar Línea Horizontal',pagebreak:'Insertar Salto de Página',pagebreakAlt:'Salto de página',unlink:'Eliminar Vínculo',undo:'Deshacer',redo:'Rehacer',common:{browseServer:'Ver Servidor',url:'URL',protocol:'Protocolo',upload:'Cargar',uploadSubmit:'Enviar al Servidor',image:'Imagen',flash:'Flash',form:'Formulario',checkbox:'Casilla de Verificación',radio:'Botones de Radio',textField:'Campo de Texto',textarea:'Area de Texto',hiddenField:'Campo Oculto',button:'Botón',select:'Campo de Selección',imageButton:'Botón Imagen',notSet:'<No definido>',id:'Id',name:'Nombre',langDir:'Orientación',langDirLtr:'Izquierda a Derecha (LTR)',langDirRtl:'Derecha a Izquierda (RTL)',langCode:'Cód. de idioma',longDescr:'Descripción larga URL',cssClass:'Clases de hojas de estilo',advisoryTitle:'Título',cssStyle:'Estilo',ok:'Aceptar',cancel:'Cancelar',close:'Cerrar',preview:'Previsualización',generalTab:'General',advancedTab:'Avanzado',validateNumberFailed:'El valor no es un número.',confirmNewPage:'Cualquier cambio que no se haya guardado se perderá.\r\n¿Está seguro de querer crear una nueva página?',confirmCancel:'Algunas de las opciones se han cambiado.\r\n¿Está seguro de querer cerrar el diálogo?',options:'Opciones',target:'Destino',targetNew:'Nueva ventana (_blank)',targetTop:'Ventana principal (_top)',targetSelf:'Misma ventana (_self)',targetParent:'Ventana padre (_parent)',langDirLTR:'Izquierda a derecha (LTR)',langDirRTL:'Derecha a izquierda (RTL)',styles:'Estilos',cssClasses:'Clase de la hoja de estilos',width:'Anchura',height:'Altura',align:'Alineación',alignLeft:'Izquierda',alignRight:'Derecha',alignCenter:'Centrado',alignTop:'Tope',alignMiddle:'Centro',alignBottom:'Pie',invalidHeight:'Altura debe ser un número.',invalidWidth:'Anchura debe ser un número.',invalidCssLength:'El valor especificado para el campo "%1" debe ser un número positivo, incluyendo optionalmente una unidad de medida CSS válida (px, %, in, cm, mm, em, ex, pt, o pc).',invalidHtmlLength:'El valor especificado para el campo "%1" debe ser un número positivo, incluyendo optionalmente una unidad de medida HTML válida (px o %).',invalidInlineStyle:'El valor especificado para el estilo debe consistir en uno o más pares con el formato "nombre: valor", separados por punto y coma.',cssLengthTooltip:'Introduca un número para el valor en pixels o un número con una unidad de medida CSS válida (px, %, in, cm, mm, em, ex, pt, o pc).',unavailable:'%1<span class="cke_accessibility">, no disponible</span>'},contextmenu:{options:'Opciones del menú contextual'},specialChar:{toolbar:'Insertar Caracter Especial',title:'Seleccione un caracter especial',options:'Opciones de caracteres especiales'},link:{toolbar:'Insertar/Editar Vínculo',other:'<otro>',menu:'Editar Vínculo',title:'Vínculo',info:'Información de Vínculo',target:'Destino',upload:'Cargar',advanced:'Avanzado',type:'Tipo de vínculo',toUrl:'URL',toAnchor:'Referencia en esta página',toEmail:'E-Mail',targetFrame:'<marco>',targetPopup:'<ventana emergente>',targetFrameName:'Nombre del Marco Destino',targetPopupName:'Nombre de Ventana Emergente',popupFeatures:'Características de Ventana Emergente',popupResizable:'Redimensionable',popupStatusBar:'Barra de Estado',popupLocationBar:'Barra de ubicación',popupToolbar:'Barra de Herramientas',popupMenuBar:'Barra de Menú',popupFullScreen:'Pantalla Completa (IE)',popupScrollBars:'Barras de desplazamiento',popupDependent:'Dependiente (Netscape)',popupLeft:'Posición Izquierda',popupTop:'Posición Derecha',id:'Id',langDir:'Orientación',langDirLTR:'Izquierda a Derecha (LTR)',langDirRTL:'Derecha a Izquierda (RTL)',acccessKey:'Tecla de Acceso',name:'Nombre',langCode:'Código idioma',tabIndex:'Indice de tabulación',advisoryTitle:'Título',advisoryContentType:'Tipo de Contenido',cssClasses:'Clases de hojas de estilo',charset:'Fuente de caracteres vinculado',styles:'Estilo',rel:'Relación',selectAnchor:'Seleccionar una referencia',anchorName:'Por Nombre de Referencia',anchorId:'Por ID de elemento',emailAddress:'Dirección de E-Mail',emailSubject:'Título del Mensaje',emailBody:'Cuerpo del Mensaje',noAnchors:'(No hay referencias disponibles en el documento)',noUrl:'Por favor escriba el vínculo URL',noEmail:'Por favor escriba la dirección de e-mail'},anchor:{toolbar:'Referencia',menu:'Propiedades de Referencia',title:'Propiedades de Referencia',name:'Nombre de la Referencia',errorName:'Por favor, complete el nombre de la Referencia',remove:'Quitar Referencia'},list:{numberedTitle:'Propiedades de lista numerada',bulletedTitle:'Propiedades de viñetas',type:'Tipo',start:'Inicio',validateStartNumber:'El Inicio debe ser un número entero.',circle:'Círculo',disc:'Disco',square:'Cuadrado',none:'Ninguno',notset:'<sin establecer>',armenian:'Numeración armenia',georgian:'Numeración georgiana (an, ban, gan, etc.)',lowerRoman:'Números romanos en minúsculas (i, ii, iii, iv, v, etc.)',upperRoman:'Números romanos en mayúsculas (I, II, III, IV, V, etc.)',lowerAlpha:'Alfabeto en minúsculas (a, b, c, d, e, etc.)',upperAlpha:'Alfabeto en mayúsculas (A, B, C, D, E, etc.)',lowerGreek:'Letras griegas (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal con cero inicial (01, 02, 03, etc.)'},findAndReplace:{title:'Buscar y Reemplazar',find:'Buscar',replace:'Reemplazar',findWhat:'Texto a buscar:',replaceWith:'Reemplazar con:',notFoundMsg:'El texto especificado no ha sido encontrado.',findOptions:'Opciones de búsqueda',matchCase:'Coincidir may/min',matchWord:'Coincidir toda la palabra',matchCyclic:'Buscar en todo el contenido',replaceAll:'Reemplazar Todo',replaceSuccessMsg:'La expresión buscada ha sido reemplazada %1 veces.'},table:{toolbar:'Tabla',title:'Propiedades de Tabla',menu:'Propiedades de Tabla',deleteTable:'Eliminar Tabla',rows:'Filas',columns:'Columnas',border:'Tamaño de Borde',widthPx:'pixeles',widthPc:'porcentaje',widthUnit:'unidad de la anchura',cellSpace:'Esp. e/celdas',cellPad:'Esp. interior',caption:'Título',summary:'Síntesis',headers:'Encabezados',headersNone:'Ninguno',headersColumn:'Primera columna',headersRow:'Primera fila',headersBoth:'Ambas',invalidRows:'El número de filas debe ser un número mayor que 0.',invalidCols:'El número de columnas debe ser un número mayor que 0.',invalidBorder:'El tamaño del borde debe ser un número.',invalidWidth:'La anchura de tabla debe ser un número.',invalidHeight:'La altura de tabla debe ser un número.',invalidCellSpacing:'El espaciado entre celdas debe ser un número.',invalidCellPadding:'El espaciado interior debe ser un número.',cell:{menu:'Celda',insertBefore:'Insertar celda a la izquierda',insertAfter:'Insertar celda a la derecha',deleteCell:'Eliminar Celdas',merge:'Combinar Celdas',mergeRight:'Combinar a la derecha',mergeDown:'Combinar hacia abajo',splitHorizontal:'Dividir la celda horizontalmente',splitVertical:'Dividir la celda verticalmente',title:'Propiedades de celda',cellType:'Tipo de Celda',rowSpan:'Expandir filas',colSpan:'Expandir columnas',wordWrap:'Ajustar al contenido',hAlign:'Alineación Horizontal',vAlign:'Alineación Vertical',alignBaseline:'Linea de base',bgColor:'Color de fondo',borderColor:'Color de borde',data:'Datos',header:'Encabezado',yes:'Sí',no:'No',invalidWidth:'La anchura de celda debe ser un número.',invalidHeight:'La altura de celda debe ser un número.',invalidRowSpan:'La expansión de filas debe ser un número entero.',invalidColSpan:'La expansión de columnas debe ser un número entero.',chooseColor:'Elegir'},row:{menu:'Fila',insertBefore:'Insertar fila en la parte superior',insertAfter:'Insertar fila en la parte inferior',deleteRow:'Eliminar Filas'},column:{menu:'Columna',insertBefore:'Insertar columna a la izquierda',insertAfter:'Insertar columna a la derecha',deleteColumn:'Eliminar Columnas'}},button:{title:'Propiedades de Botón',text:'Texto (Valor)',type:'Tipo',typeBtn:'Boton',typeSbm:'Enviar',typeRst:'Reestablecer'},checkboxAndRadio:{checkboxTitle:'Propiedades de Casilla',radioTitle:'Propiedades de Botón de Radio',value:'Valor',selected:'Seleccionado'},form:{title:'Propiedades de Formulario',menu:'Propiedades de Formulario',action:'Acción',method:'Método',encoding:'Codificación'},select:{title:'Propiedades de Campo de Selección',selectInfo:'Información',opAvail:'Opciones disponibles',value:'Valor',size:'Tamaño',lines:'Lineas',chkMulti:'Permitir múltiple selección',opText:'Texto',opValue:'Valor',btnAdd:'Agregar',btnModify:'Modificar',btnUp:'Subir',btnDown:'Bajar',btnSetValue:'Establecer como predeterminado',btnDelete:'Eliminar'},textarea:{title:'Propiedades de Area de Texto',cols:'Columnas',rows:'Filas'},textfield:{title:'Propiedades de Campo de Texto',name:'Nombre',value:'Valor',charWidth:'Caracteres de ancho',maxChars:'Máximo caracteres',type:'Tipo',typeText:'Texto',typePass:'Contraseña'},hidden:{title:'Propiedades de Campo Oculto',name:'Nombre',value:'Valor'},image:{title:'Propiedades de Imagen',titleButton:'Propiedades de Botón de Imagen',menu:'Propiedades de Imagen',infoTab:'Información de Imagen',btnUpload:'Enviar al Servidor',upload:'Cargar',alt:'Texto Alternativo',lockRatio:'Proporcional',resetSize:'Tamaño Original',border:'Borde',hSpace:'Esp.Horiz',vSpace:'Esp.Vert',alertUrl:'Por favor escriba la URL de la imagen',linkTab:'Vínculo',button2Img:'¿Desea convertir el botón de imagen en una simple imagen?',img2Button:'¿Desea convertir la imagen en un botón de imagen?',urlMissing:'Debe indicar la URL de la imagen.',validateBorder:'El borde debe ser un número.',validateHSpace:'El espaciado horizontal debe ser un número.',validateVSpace:'El espaciado vertical debe ser un número.'},flash:{properties:'Propiedades de Flash',propertiesTab:'Propiedades',title:'Propiedades de Flash',chkPlay:'Autoejecución',chkLoop:'Repetir',chkMenu:'Activar Menú Flash',chkFull:'Permitir pantalla completa',scale:'Escala',scaleAll:'Mostrar todo',scaleNoBorder:'Sin Borde',scaleFit:'Ajustado',access:'Acceso de scripts',accessAlways:'Siempre',accessSameDomain:'Mismo dominio',accessNever:'Nunca',alignAbsBottom:'Abs inferior',alignAbsMiddle:'Abs centro',alignBaseline:'Línea de base',alignTextTop:'Tope del texto',quality:'Calidad',qualityBest:'La mejor',qualityHigh:'Alta',qualityAutoHigh:'Auto Alta',qualityMedium:'Media',qualityAutoLow:'Auto Baja',qualityLow:'Baja',windowModeWindow:'Ventana',windowModeOpaque:'Opaco',windowModeTransparent:'Transparente',windowMode:'WindowMode',flashvars:'Opciones',bgcolor:'Color de Fondo',hSpace:'Esp.Horiz',vSpace:'Esp.Vert',validateSrc:'Por favor escriba el vínculo URL',validateHSpace:'Esp.Horiz debe ser un número.',validateVSpace:'Esp.Vert debe ser un número.'},spellCheck:{toolbar:'Ortografía',title:'Comprobar ortografía',notAvailable:'Lo sentimos pero el servicio no está disponible.',errorLoading:'Error cargando la aplicación del servidor: %s.',notInDic:'No se encuentra en el Diccionario',changeTo:'Cambiar a',btnIgnore:'Ignorar',btnIgnoreAll:'Ignorar Todo',btnReplace:'Reemplazar',btnReplaceAll:'Reemplazar Todo',btnUndo:'Deshacer',noSuggestions:'- No hay sugerencias -',progress:'Control de Ortografía en progreso...',noMispell:'Control finalizado: no se encontraron errores',noChanges:'Control finalizado: no se ha cambiado ninguna palabra',oneChange:'Control finalizado: se ha cambiado una palabra',manyChanges:'Control finalizado: se ha cambiado %1 palabras',ieSpellDownload:'Módulo de Control de Ortografía no instalado.\r\n¿Desea descargarlo ahora?'},smiley:{toolbar:'Emoticonos',title:'Insertar un Emoticon',options:'Opciones de emoticonos'},elementsPath:{eleLabel:'Ruta de los elementos',eleTitle:'%1 elemento'},numberedlist:'Numeración',bulletedlist:'Viñetas',indent:'Aumentar Sangría',outdent:'Disminuir Sangría',justify:{left:'Alinear a Izquierda',center:'Centrar',right:'Alinear a Derecha',block:'Justificado'},blockquote:'Cita',clipboard:{title:'Pegar',cutError:'La configuración de seguridad de este navegador no permite la ejecución automática de operaciones de cortado.\r\nPor favor use el teclado (Ctrl/Cmd+X).',copyError:'La configuración de seguridad de este navegador no permite la ejecución automática de operaciones de copiado.\r\nPor favor use el teclado (Ctrl/Cmd+C).',pasteMsg:'Por favor pegue dentro del cuadro utilizando el teclado (<STRONG>Ctrl/Cmd+V</STRONG>);\r\nluego presione <STRONG>Aceptar</STRONG>.',securityMsg:'Debido a la configuración de seguridad de su navegador, el editor no tiene acceso al portapapeles.\r\nEs necesario que lo pegue de nuevo en esta ventana.',pasteArea:'Zona de pegado'},pastefromword:{confirmCleanup:'El texto que desea parece provenir de Word.\r\n¿Desea depurarlo antes de pegarlo?',toolbar:'Pegar desde Word',title:'Pegar desde Word',error:'No ha sido posible limpiar los datos debido a un error interno'},pasteText:{button:'Pegar como Texto Plano',title:'Pegar como Texto Plano'},templates:{button:'Plantillas',title:'Contenido de Plantillas',options:'Opciones de plantillas',insertOption:'Reemplazar el contenido actual',selectPromptMsg:'Por favor selecciona la plantilla a abrir en el editor<br>(el contenido actual se perderá):',emptyListMsg:'(No hay plantillas definidas)'},showBlocks:'Mostrar bloques',stylesCombo:{label:'Estilo',panelTitle:'Estilos para formatear',panelTitle1:'Estilos de párrafo',panelTitle2:'Estilos de carácter',panelTitle3:'Estilos de objeto'},format:{label:'Formato',panelTitle:'Formato',tag_p:'Normal',tag_pre:'Con formato',tag_address:'Dirección',tag_h1:'Encabezado 1',tag_h2:'Encabezado 2',tag_h3:'Encabezado 3',tag_h4:'Encabezado 4',tag_h5:'Encabezado 5',tag_h6:'Encabezado 6',tag_div:'Normal (DIV)'},div:{title:'Crear contenedor DIV',toolbar:'Crear contenedor DIV',cssClassInputLabel:'Clase de hoja de estilos',styleSelectLabel:'Estilo',IdInputLabel:'Id',languageCodeInputLabel:' Codigo de idioma',inlineStyleInputLabel:'Estilo',advisoryTitleInputLabel:'Título',langDirLabel:'Orientación',langDirLTRLabel:'Izquierda a Derecha (LTR)',langDirRTLLabel:'Derecha a Izquierda (RTL)',edit:'Editar Div',remove:'Quitar Div'},iframe:{title:'Propiedades de iframe',toolbar:'IFrame',noUrl:'Por favor, escriba la dirección del iframe',scrolling:'Activar barras de desplazamiento',border:'Mostrar borde del marco'},font:{label:'Fuente',voiceLabel:'Fuente',panelTitle:'Fuente'},fontSize:{label:'Tamaño',voiceLabel:'Tamaño de fuente',panelTitle:'Tamaño'},colorButton:{textColorTitle:'Color de Texto',bgColorTitle:'Color de Fondo',panelTitle:'Colores',auto:'Automático',more:'Más Colores...'},colors:{'000':'Negro',800000:'Marrón oscuro','8B4513':'Marrón tierra','2F4F4F':'Pizarra Oscuro','008080':'Azul verdoso','000080':'Azul marino','4B0082':'Añil',696969:'Gris oscuro',B22222:'Ladrillo',A52A2A:'Marrón',DAA520:'Oro oscuro','006400':'Verde oscuro','40E0D0':'Turquesa','0000CD':'Azul medio-oscuro',800080:'Púrpura',808080:'Gris',F00:'Rojo',FF8C00:'Naranja oscuro',FFD700:'Oro','008000':'Verde','0FF':'Cian','00F':'Azul',EE82EE:'Violeta',A9A9A9:'Gris medio',FFA07A:'Salmón claro',FFA500:'Naranja',FFFF00:'Amarillo','00FF00':'Lima',AFEEEE:'Turquesa claro',ADD8E6:'Azul claro',DDA0DD:'Violeta claro',D3D3D3:'Gris claro',FFF0F5:'Lavanda rojizo',FAEBD7:'Blanco antiguo',FFFFE0:'Amarillo claro',F0FFF0:'Miel',F0FFFF:'Azul celeste',F0F8FF:'Azul pálido',E6E6FA:'Lavanda',FFF:'Blanco'},scayt:{title:'Comprobar Ortografía Mientras Escribe',opera_title:'No soportado en Opera',enable:'Activar Corrector',disable:'Desactivar Corrector',about:'Acerca de Corrector',toggle:'Cambiar Corrector',options:'Opciones',langs:'Idiomas',moreSuggestions:'Más sugerencias',ignore:'Ignorar',ignoreAll:'Ignorar Todas',addWord:'Añadir palabra',emptyDic:'El nombre del diccionario no puede estar en blanco.',optionsTab:'Opciones',allCaps:'Omitir palabras en MAYÚSCULAS',ignoreDomainNames:'Omitir nombres de dominio',mixedCase:'Ignorar palabras con combinación de mayúsculas y minúsculas',mixedWithDigits:'Omitir palabras con números',languagesTab:'Idiomas',dictionariesTab:'Diccionarios',dic_field_name:'Nombre del diccionario',dic_create:'Crear',dic_restore:'Recuperar',dic_delete:'Borrar',dic_rename:'Renombrar',dic_info:'Inicialmente el Diccionario de usuario se guarda en una Cookie. Sin embargo, las cookies están limitadas en tamaño. Cuando el diccionario crece a un punto en el que no se puede guardar en una Cookie, el diccionario puede ser almacenado en nuestro servidor. Para almacenar su diccionario personalizado en nuestro servidor debe especificar un nombre para su diccionario. Si ya ha guardado un diccionaro, por favor, escriba su nombre y pulse el botón Recuperar',aboutTab:'Acerca de'},about:{title:'Acerca de CKEditor',dlgTitle:'Acerca de CKEditor',help:'Lea la $1 para resolver sus dudas.',userGuide:'Guía de usuario de CKEditor',moreInfo:'Para información de licencia, por favor visite nuestro sitio web:',copy:'Copyright © $1. Todos los derechos reservados.'},maximize:'Maximizar',minimize:'Minimizar',fakeobjects:{anchor:'Ancla',flash:'Animación flash',iframe:'IFrame',hiddenfield:'Campo oculto',unknown:'Objeto desconocido'},resize:'Arrastre para redimensionar',colordialog:{title:'Elegir color',options:'Opciones de colores',highlight:'Muestra',selected:'Elegido',clear:'Borrar'},toolbarCollapse:'Contraer barra de herramientas',toolbarExpand:'Expandir barra de herramientas',toolbarGroups:{document:'Documento',clipboard:'Portapapeles/Deshacer',editing:'Edición',forms:'Formularios',basicstyles:'Estilos básicos',paragraph:'Párrafo',links:'Enlaces',insert:'Insertar',styles:'Estilos',colors:'Colores',tools:'Herramientas'},bidi:{ltr:'Dirección del texto de izquierda a derecha',rtl:'Dirección del texto de derecha a izquierda'},docprops:{label:'Propiedades del documento',title:'Propiedades del documento',design:'Diseño',meta:'Meta Tags',chooseColor:'Elegir',other:'Otro...',docTitle:'Título de página',charset:'Codificación de caracteres',charsetOther:'Otra codificación de caracteres',charsetASCII:'ASCII',charsetCE:'Centro Europeo',charsetCT:'Chino Tradicional (Big5)',charsetCR:'Ruso',charsetGR:'Griego',charsetJP:'Japonés',charsetKR:'Koreano',charsetTR:'Turco',charsetUN:'Unicode (UTF-8)',charsetWE:'Europeo occidental',docType:'Tipo de documento',docTypeOther:'Otro tipo de documento',xhtmlDec:'Incluir declaración XHTML',bgColor:'Color de fondo',bgImage:'Imagen de fondo',bgFixed:'Fondo fijo (no se desplaza)',txtColor:'Color del texto',margin:'Márgenes',marginTop:'Superior',marginLeft:'Izquierdo',marginRight:'Derecho',marginBottom:'Inferior',metaKeywords:'Palabras claves del documento separadas por coma (meta keywords)',metaDescription:'Descripción del documento',metaAuthor:'Autor',metaCopyright:'Copyright',previewHtml:'<p>Este es un <strong>texto de ejemplo</strong>. Usted está usando <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/et.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/et.js
index 4369767..461b73d 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/et.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/et.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.et={dir:'ltr',editorTitle:'Vormindatud teksti redaktor %1',editorHelp:'Abi saamiseks vajuta ALT 0',toolbars:'Redaktori tööriistaribad',editor:'Rikkalik tekstiredaktor',source:'Lähtekood',newPage:'Uus leht',save:'Salvestamine',preview:'Eelvaade',cut:'Lõika',copy:'Kopeeri',paste:'Aseta',print:'Printimine',underline:'Allajoonitud',bold:'Paks',italic:'Kursiiv',selectAll:'Kõige valimine',removeFormat:'Vormingu eemaldamine',strike:'Läbijoonitud',subscript:'Allindeks',superscript:'Ülaindeks',horizontalrule:'Horisontaaljoone sisestamine',pagebreak:'Lehevahetuskoha sisestamine',pagebreakAlt:'Lehevahetuskoht',unlink:'Lingi eemaldamine',undo:'Tagasivõtmine',redo:'Toimingu kordamine',common:{browseServer:'Serveri sirvimine',url:'URL',protocol:'Protokoll',upload:'Laadi üles',uploadSubmit:'Saada serverisse',image:'Pilt',flash:'Flash',form:'Vorm',checkbox:'Märkeruut',radio:'Raadionupp',textField:'Tekstilahter',textarea:'Tekstiala',hiddenField:'Varjatud lahter',button:'Nupp',select:'Valiklahter',imageButton:'Piltnupp',notSet:'<määramata>',id:'ID',name:'Nimi',langDir:'Keele suund',langDirLtr:'Vasakult paremale (LTR)',langDirRtl:'Paremalt vasakule (RTL)',langCode:'Keele kood',longDescr:'Pikk kirjeldus URL',cssClass:'Stiilistiku klassid',advisoryTitle:'Soovituslik pealkiri',cssStyle:'Laad',ok:'OK',cancel:'Loobu',close:'Sulge',preview:'Eelvaade',generalTab:'Üldine',advancedTab:'Täpsemalt',validateNumberFailed:'See väärtus pole number.',confirmNewPage:'Kõik salvestamata muudatused lähevad kaotsi. Kas oled kindel, et tahad laadida uue lehe?',confirmCancel:'Mõned valikud on muudetud. Kas oled kindel, et tahad dialoogi sulgeda?',options:'Valikud',target:'Sihtkoht',targetNew:'Uus aken (_blank)',targetTop:'Kõige ülemine aken (_top)',targetSelf:'Sama aken (_self)',targetParent:'Vanemaken (_parent)',langDirLTR:'Vasakult paremale (LTR)',langDirRTL:'Paremalt vasakule (RTL)',styles:'Stiili',cssClasses:'Stiililehe klassid',width:'Laius',height:'Kõrgus',align:'Joondus',alignLeft:'Vasak',alignRight:'Paremale',alignCenter:'Kesk',alignTop:'Üles',alignMiddle:'Keskele',alignBottom:'Alla',invalidHeight:'Kõrgus peab olema number.',invalidWidth:'Laius peab olema number.',invalidCssLength:'"%1" välja jaoks määratud väärtus peab olema positiivne täisarv CSS ühikuga (px, %, in, cm, mm, em, ex, pt või pc) või ilma.',invalidHtmlLength:'"%1" välja jaoks määratud väärtus peab olema positiivne täisarv HTML ühikuga (px või %) või ilma.',invalidInlineStyle:'Reasisese stiili määrangud peavad koosnema paarisväärtustest (tuples), mis on semikoolonitega eraldatult järgnevas vormingus: "nimi : väärtus".',cssLengthTooltip:'Sisesta väärtus pikslites või number koos sobiva CSS-i ühikuga (px, %, in, cm, mm, em, ex, pt või pc).',unavailable:'%1<span class="cke_accessibility">, pole saadaval</span>'},contextmenu:{options:'Kontekstimenüü valikud'},specialChar:{toolbar:'Erimärgi sisestamine',title:'Erimärgi valimine',options:'Erimärkide valikud'},link:{toolbar:'Lingi lisamine/muutmine',other:'<muu>',menu:'Muuda linki',title:'Link',info:'Lingi info',target:'Sihtkoht',upload:'Lae üles',advanced:'Täpsemalt',type:'Lingi liik',toUrl:'URL',toAnchor:'Ankur sellel lehel',toEmail:'E-post',targetFrame:'<raam>',targetPopup:'<hüpikaken>',targetFrameName:'Sihtmärk raami nimi',targetPopupName:'Hüpikakna nimi',popupFeatures:'Hüpikakna omadused',popupResizable:'Suurust saab muuta',popupStatusBar:'Olekuriba',popupLocationBar:'Aadressiriba',popupToolbar:'Tööriistariba',popupMenuBar:'Menüüriba',popupFullScreen:'Täisekraan (IE)',popupScrollBars:'Kerimisribad',popupDependent:'Sõltuv (Netscape)',popupLeft:'Vasak asukoht',popupTop:'Ülemine asukoht',id:'ID',langDir:'Keele suund',langDirLTR:'Vasakult paremale (LTR)',langDirRTL:'Paremalt vasakule (RTL)',acccessKey:'Juurdepääsu võti',name:'Nimi',langCode:'Keele suund',tabIndex:'Tab indeks',advisoryTitle:'Juhendav tiitel',advisoryContentType:'Juhendava sisu tüüp',cssClasses:'Stiilistiku klassid',charset:'Lingitud ressursi märgistik',styles:'Laad',rel:'Suhe',selectAnchor:'Vali ankur',anchorName:'Ankru nime järgi',anchorId:'Elemendi id järgi',emailAddress:'E-posti aadress',emailSubject:'Sõnumi teema',emailBody:'Sõnumi tekst',noAnchors:'(Selles dokumendis pole ankruid)',noUrl:'Palun kirjuta lingi URL',noEmail:'Palun kirjuta e-posti aadress'},anchor:{toolbar:'Ankru sisestamine/muutmine',menu:'Ankru omadused',title:'Ankru omadused',name:'Ankru nimi',errorName:'Palun sisesta ankru nimi',remove:'Eemalda ankur'},list:{numberedTitle:'Numberloendi omadused',bulletedTitle:'Punktloendi omadused',type:'Liik',start:'Algus',validateStartNumber:'Loendi algusnumber peab olema täisarv.',circle:'Ring',disc:'Täpp',square:'Ruut',none:'Puudub',notset:'<pole määratud>',armenian:'Armeenia numbrid',georgian:'Gruusia numbrid (an, ban, gan, jne)',lowerRoman:'Väiksed rooma numbrid (i, ii, iii, iv, v, jne)',upperRoman:'Suured rooma numbrid (I, II, III, IV, V, jne)',lowerAlpha:'Väiketähed (a, b, c, d, e, jne)',upperAlpha:'Suurtähed (A, B, C, D, E, jne)',lowerGreek:'Kreeka väiketähed (alpha, beta, gamma, jne)',decimal:'Numbrid (1, 2, 3, jne)',decimalLeadingZero:'Numbrid algusnulliga (01, 02, 03, jne)'},findAndReplace:{title:'Otsimine ja asendamine',find:'Otsi',replace:'Asenda',findWhat:'Otsitav:',replaceWith:'Asendus:',notFoundMsg:'Otsitud teksti ei leitud.',findOptions:'Otsingu valikud',matchCase:'Suur- ja väiketähtede eristamine',matchWord:'Ainult terved sõnad',matchCyclic:'Jätkatakse algusest',replaceAll:'Asenda kõik',replaceSuccessMsg:'%1 vastet asendati.'},table:{toolbar:'Tabel',title:'Tabeli omadused',menu:'Tabeli omadused',deleteTable:'Kustuta tabel',rows:'Read',columns:'Veerud',border:'Joone suurus',widthPx:'pikslit',widthPc:'protsenti',widthUnit:'laiuse ühik',cellSpace:'Lahtri vahe',cellPad:'Lahtri täidis',caption:'Tabeli tiitel',summary:'Kokkuvõte',headers:'Päised',headersNone:'Puudub',headersColumn:'Esimene tulp',headersRow:'Esimene rida',headersBoth:'Mõlemad',invalidRows:'Ridade arv peab olema nullist suurem.',invalidCols:'Tulpade arv peab olema nullist suurem.',invalidBorder:'Äärise suurus peab olema number.',invalidWidth:'Tabeli laius peab olema number.',invalidHeight:'Tabeli kõrgus peab olema number.',invalidCellSpacing:'Lahtrite vahe peab olema positiivne arv.',invalidCellPadding:'Lahtrite polsterdus (padding) peab olema positiivne arv.',cell:{menu:'Lahter',insertBefore:'Sisesta lahter enne',insertAfter:'Sisesta lahter peale',deleteCell:'Eemalda lahtrid',merge:'Ühenda lahtrid',mergeRight:'Ühenda paremale',mergeDown:'Ühenda alla',splitHorizontal:'Poolita lahter horisontaalselt',splitVertical:'Poolita lahter vertikaalselt',title:'Lahtri omadused',cellType:'Lahtri liik',rowSpan:'Ridade vahe',colSpan:'Tulpade vahe',wordWrap:'Sõnade murdmine',hAlign:'Horisontaalne joondus',vAlign:'Vertikaalne joondus',alignBaseline:'Baasjoon',bgColor:'Tausta värv',borderColor:'Äärise värv',data:'Andmed',header:'Päis',yes:'Jah',no:'Ei',invalidWidth:'Lahtri laius peab olema number.',invalidHeight:'Lahtri kõrgus peab olema number.',invalidRowSpan:'Ridade vahe peab olema täisarv.',invalidColSpan:'Tulpade vahe peab olema täisarv.',chooseColor:'Vali'},row:{menu:'Rida',insertBefore:'Sisesta rida enne',insertAfter:'Sisesta rida peale',deleteRow:'Eemalda read'},column:{menu:'Veerg',insertBefore:'Sisesta veerg enne',insertAfter:'Sisesta veerg peale',deleteColumn:'Eemalda veerud'}},button:{title:'Nupu omadused',text:'Tekst (väärtus)',type:'Liik',typeBtn:'Nupp',typeSbm:'Saada',typeRst:'Lähtesta'},checkboxAndRadio:{checkboxTitle:'Märkeruudu omadused',radioTitle:'Raadionupu omadused',value:'Väärtus',selected:'Märgitud'},form:{title:'Vormi omadused',menu:'Vormi omadused',action:'Toiming',method:'Meetod',encoding:'Kodeering'},select:{title:'Valiklahtri omadused',selectInfo:'Info',opAvail:'Võimalikud valikud:',value:'Väärtus',size:'Suurus',lines:'ridu',chkMulti:'Võimalik mitu valikut',opText:'Tekst',opValue:'Väärtus',btnAdd:'Lisa',btnModify:'Muuda',btnUp:'Üles',btnDown:'Alla',btnSetValue:'Määra vaikimisi',btnDelete:'Kustuta'},textarea:{title:'Tekstiala omadused',cols:'Veerge',rows:'Ridu'},textfield:{title:'Tekstilahtri omadused',name:'Nimi',value:'Väärtus',charWidth:'Laius (tähemärkides)',maxChars:'Maksimaalselt tähemärke',type:'Liik',typeText:'Tekst',typePass:'Parool'},hidden:{title:'Varjatud lahtri omadused',name:'Nimi',value:'Väärtus'},image:{title:'Pildi omadused',titleButton:'Piltnupu omadused',menu:'Pildi omadused',infoTab:'Pildi info',btnUpload:'Saada serverisse',upload:'Lae üles',alt:'Alternatiivne tekst',lockRatio:'Lukusta kuvasuhe',resetSize:'Lähtesta suurus',border:'Joon',hSpace:'H. vaheruum',vSpace:'V. vaheruum',alertUrl:'Palun kirjuta pildi URL',linkTab:'Link',button2Img:'Kas tahad teisendada valitud pildiga nupu tavaliseks pildiks?',img2Button:'Kas tahad teisendada valitud tavalise pildi pildiga nupuks?',urlMissing:'Pildi lähte-URL on puudu.',validateBorder:'Äärise laius peab olema täisarv.',validateHSpace:'Horisontaalne vaheruum peab olema täisarv.',validateVSpace:'Vertikaalne vaheruum peab olema täisarv.'},flash:{properties:'Flashi omadused',propertiesTab:'Omadused',title:'Flashi omadused',chkPlay:'Automaatne start ',chkLoop:'Korduv',chkMenu:'Flashi menüü lubatud',chkFull:'Täisekraan lubatud',scale:'Mastaap',scaleAll:'Näidatakse kõike',scaleNoBorder:'Äärist ei ole',scaleFit:'Täpne sobivus',access:'Skriptide ligipääs',accessAlways:'Kõigile',accessSameDomain:'Samalt domeenilt',accessNever:'Mitte ühelegi',alignAbsBottom:'Abs alla',alignAbsMiddle:'Abs keskele',alignBaseline:'Baasjoonele',alignTextTop:'Tekstist üles',quality:'Kvaliteet',qualityBest:'Parim',qualityHigh:'Kõrge',qualityAutoHigh:'Automaatne kõrge',qualityMedium:'Keskmine',qualityAutoLow:'Automaatne madal',qualityLow:'Madal',windowModeWindow:'Aken',windowModeOpaque:'Läbipaistmatu',windowModeTransparent:'Läbipaistev',windowMode:'Akna režiim',flashvars:'Flashi muutujad',bgcolor:'Tausta värv',hSpace:'H. vaheruum',vSpace:'V. vaheruum',validateSrc:'Palun kirjuta lingi URL',validateHSpace:'H. vaheruum peab olema number.',validateVSpace:'V. vaheruum peab olema number.'},spellCheck:{toolbar:'Õigekirjakontroll',title:'Õigekirjakontroll',notAvailable:'Kahjuks ei ole teenus praegu saadaval.',errorLoading:'Viga rakenduse teenushosti laadimisel: %s.',notInDic:'Puudub sõnastikust',changeTo:'Muuda',btnIgnore:'Ignoreeri',btnIgnoreAll:'Ignoreeri kõiki',btnReplace:'Asenda',btnReplaceAll:'Asenda kõik',btnUndo:'Võta tagasi',noSuggestions:'- Soovitused puuduvad -',progress:'Toimub õigekirja kontroll...',noMispell:'Õigekirja kontroll sooritatud: õigekirjuvigu ei leitud',noChanges:'Õigekirja kontroll sooritatud: ühtegi sõna ei muudetud',oneChange:'Õigekirja kontroll sooritatud: üks sõna muudeti',manyChanges:'Õigekirja kontroll sooritatud: %1 sõna muudetud',ieSpellDownload:'Õigekirja kontrollija ei ole paigaldatud. Soovid sa selle alla laadida?'},smiley:{toolbar:'Emotikon',title:'Sisesta emotikon',options:'Emotikonide valikud'},elementsPath:{eleLabel:'Elementide asukoht',eleTitle:'%1 element'},numberedlist:'Numberloend',bulletedlist:'Punktloend',indent:'Taande suurendamine',outdent:'Taande vähendamine',justify:{left:'Vasakjoondus',center:'Keskjoondus',right:'Paremjoondus',block:'Rööpjoondus'},blockquote:'Blokktsitaat',clipboard:{title:'Asetamine',cutError:'Sinu veebisirvija turvaseaded ei luba redaktoril automaatselt lõigata. Palun kasutage selleks klaviatuuri klahvikombinatsiooni (Ctrl/Cmd+X).',copyError:'Sinu veebisirvija turvaseaded ei luba redaktoril automaatselt kopeerida. Palun kasutage selleks klaviatuuri klahvikombinatsiooni (Ctrl/Cmd+C).',pasteMsg:'Palun aseta tekst järgnevasse kasti kasutades klaviatuuri klahvikombinatsiooni (<STRONG>Ctrl/Cmd+V</STRONG>) ja vajuta seejärel <STRONG>OK</STRONG>.',securityMsg:'Sinu veebisirvija turvaseadete tõttu ei oma redaktor otsest ligipääsu lõikelaua andmetele. Sa pead asetama need uuesti siia aknasse.',pasteArea:'Asetamise ala'},pastefromword:{confirmCleanup:'Tekst, mida tahad asetada näib pärinevat Wordist. Kas tahad selle enne asetamist puhastada?',toolbar:'Asetamine Wordist',title:'Asetamine Wordist',error:'Asetatud andmete puhastamine ei olnud sisemise vea tõttu võimalik'},pasteText:{button:'Asetamine tavalise tekstina',title:'Asetamine tavalise tekstina'},templates:{button:'Mall',title:'Sisumallid',options:'Malli valikud',insertOption:'Praegune sisu asendatakse',selectPromptMsg:'Palun vali mall, mis avada redaktoris<br />(praegune sisu läheb kaotsi):',emptyListMsg:'(Ühtegi malli ei ole defineeritud)'},showBlocks:'Blokkide näitamine',stylesCombo:{label:'Stiil',panelTitle:'Vormindusstiilid',panelTitle1:'Blokkstiilid',panelTitle2:'Reasisesed stiilid',panelTitle3:'Objektistiilid'},format:{label:'Vorming',panelTitle:'Vorming',tag_p:'Tavaline',tag_pre:'Vormindatud',tag_address:'Aadress',tag_h1:'Pealkiri 1',tag_h2:'Pealkiri 2',tag_h3:'Pealkiri 3',tag_h4:'Pealkiri 4',tag_h5:'Pealkiri 5',tag_h6:'Pealkiri 6',tag_div:'Tavaline (DIV)'},div:{title:'Div-konteineri loomine',toolbar:'Div-konteineri loomine',cssClassInputLabel:'Stiililehe klassid',styleSelectLabel:'Stiil',IdInputLabel:'ID',languageCodeInputLabel:' Keelekood',inlineStyleInputLabel:'Reasisene stiil',advisoryTitleInputLabel:'Soovitatav pealkiri',langDirLabel:'Keele suund',langDirLTRLabel:'Vasakult paremale (LTR)',langDirRTLLabel:'Paremalt vasakule (RTL)',edit:'Muuda Div',remove:'Eemalda Div'},iframe:{title:'IFrame omadused',toolbar:'IFrame',noUrl:'Vali iframe URLi liik',scrolling:'Kerimisribade lubamine',border:'Raami äärise näitamine'},font:{label:'Kiri',voiceLabel:'Kiri',panelTitle:'Kiri'},fontSize:{label:'Suurus',voiceLabel:'Kirja suurus',panelTitle:'Suurus'},colorButton:{textColorTitle:'Teksti värv',bgColorTitle:'Tausta värv',panelTitle:'Värvid',auto:'Automaatne',more:'Rohkem värve...'},colors:{'000':'Must',800000:'Kastanpruun','8B4513':'Sadulapruun','2F4F4F':'Tume paehall','008080':'Sinakasroheline','000080':'Meresinine','4B0082':'Indigosinine',696969:'Tumehall',B22222:'Šamottkivi',A52A2A:'Pruun',DAA520:'Kuldkollane','006400':'Tumeroheline','40E0D0':'Türkiissinine','0000CD':'Keskmine sinine',800080:'Lilla',808080:'Hall',F00:'Punanae',FF8C00:'Tumeoranž',FFD700:'Kuldne','008000':'Roheline','0FF':'Tsüaniidsinine','00F':'Sinine',EE82EE:'Violetne',A9A9A9:'Tuhm hall',FFA07A:'Hele lõhe',FFA500:'Oranž',FFFF00:'Kollane','00FF00':'Lubja hall',AFEEEE:'Kahvatu türkiis',ADD8E6:'Helesinine',DDA0DD:'Ploomililla',D3D3D3:'Helehall',FFF0F5:'Lavendlipunane',FAEBD7:'Antiikvalge',FFFFE0:'Helekollane',F0FFF0:'Meloniroheline',F0FFFF:'Taevasinine',F0F8FF:'Beebisinine',E6E6FA:'Lavendel',FFF:'Valge'},scayt:{title:'Õigekirjakontroll kirjutamise ajal',opera_title:'Operas pole toetatud',enable:'SCAYT lubatud',disable:'SCAYT keelatud',about:'SCAYT-ist lähemalt',toggle:'SCAYT sisse/välja lülitamine',options:'Valikud',langs:'Keeled',moreSuggestions:'Veel soovitusi',ignore:'Eira',ignoreAll:'Eira kõiki',addWord:'Lisa sõna',emptyDic:'Sõnaraamatu nimi ei tohi olla tühi.',optionsTab:'Valikud',allCaps:'Läbivate suurtähtedega sõnade eiramine',ignoreDomainNames:'Domeeninimede eiramine',mixedCase:'Tavapäratu tõstuga sõnade eiramine',mixedWithDigits:'Numbreid sisaldavate sõnade eiramine',languagesTab:'Keeled',dictionariesTab:'Sõnaraamatud',dic_field_name:'Sõnaraamatu nimi',dic_create:'Loo',dic_restore:'Taasta',dic_delete:'Kustuta',dic_rename:'Nimeta ümber',dic_info:'Alguses säilitatakse kasutaja sõnaraamatut küpsises. Küpsise suurus on piiratud. Pärast sõnaraamatu kasvamist nii suureks, et see küpsisesse ei mahu, võib sõnaraamatut hoida meie serveris. Oma isikliku sõnaraamatu hoidmiseks meie serveris pead andma sellele nime. Kui sa juba oled sõnaraamatu salvestanud, sisesta selle nimi ja klõpsa taastamise nupule.',aboutTab:'Lähemalt'},about:{title:'CKEditorist',dlgTitle:'CKEditorist',help:'Abi jaoks vaata $1.',userGuide:'CKEditori kasutusjuhendit',moreInfo:'Litsentsi andmed leiab meie veebilehelt:',copy:'Copyright © $1. Kõik õigused kaitstud.'},maximize:'Maksimeerimine',minimize:'Minimeerimine',fakeobjects:{anchor:'Ankur',flash:'Flashi animatsioon',iframe:'IFrame',hiddenfield:'Varjatud väli',unknown:'Tundmatu objekt'},resize:'Suuruse muutmiseks lohista',colordialog:{title:'Värvi valimine',options:'Värvi valikud',highlight:'Näidis',selected:'Valitud värv',clear:'Eemalda'},toolbarCollapse:'Tööriistariba peitmine',toolbarExpand:'Tööriistariba näitamine',toolbarGroups:{document:'Dokument',clipboard:'Lõikelaud/tagasivõtmine',editing:'Muutmine',forms:'Vormid',basicstyles:'Põhistiilid',paragraph:'Lõik',links:'Lingid',insert:'Sisesta',styles:'Stiilid',colors:'Värvid',tools:'Tööriistad'},bidi:{ltr:'Teksti suund vasakult paremale',rtl:'Teksti suund paremalt vasakule'},docprops:{label:'Dokumendi omadused',title:'Dokumendi omadused',design:'Disain',meta:'Meta andmed',chooseColor:'Vali',other:'<muu>',docTitle:'Lehekülje tiitel',charset:'Märgistiku kodeering',charsetOther:'Ülejäänud märgistike kodeeringud',charsetASCII:'ASCII',charsetCE:'Kesk-Euroopa',charsetCT:'Hiina traditsiooniline (Big5)',charsetCR:'Kirillisa',charsetGR:'Kreeka',charsetJP:'Jaapani',charsetKR:'Korea',charsetTR:'Türgi',charsetUN:'Unicode (UTF-8)',charsetWE:'Lääne-Euroopa',docType:'Dokumendi tüüppäis',docTypeOther:'Teised dokumendi tüüppäised',xhtmlDec:'Arva kaasa XHTML deklaratsioonid',bgColor:'Taustavärv',bgImage:'Taustapildi URL',bgFixed:'Mittekeritav tagataust',txtColor:'Teksti värv',margin:'Lehekülje äärised',marginTop:'Ülaserv',marginLeft:'Vasakserv',marginRight:'Paremserv',marginBottom:'Alaserv',metaKeywords:'Dokumendi võtmesõnad (eraldatud komadega)',metaDescription:'Dokumendi kirjeldus',metaAuthor:'Autor',metaCopyright:'Autoriõigus',previewHtml:'<p>See on <strong>näidistekst</strong>. Sa kasutad <a href="javascript:void(0)">CKEditori</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.et={dir:'ltr',editorTitle:'Vormindatud teksti redaktor %1',editorHelp:'Abi saamiseks vajuta ALT 0',toolbars:'Redaktori tööriistaribad',editor:'Rikkalik tekstiredaktor',source:'Lähtekood',newPage:'Uus leht',save:'Salvestamine',preview:'Eelvaade',cut:'Lõika',copy:'Kopeeri',paste:'Aseta',print:'Printimine',underline:'Allajoonitud',bold:'Paks',italic:'Kursiiv',selectAll:'Kõige valimine',removeFormat:'Vormingu eemaldamine',strike:'Läbijoonitud',subscript:'Allindeks',superscript:'Ülaindeks',horizontalrule:'Horisontaaljoone sisestamine',pagebreak:'Lehevahetuskoha sisestamine',pagebreakAlt:'Lehevahetuskoht',unlink:'Lingi eemaldamine',undo:'Tagasivõtmine',redo:'Toimingu kordamine',common:{browseServer:'Serveri sirvimine',url:'URL',protocol:'Protokoll',upload:'Laadi üles',uploadSubmit:'Saada serverisse',image:'Pilt',flash:'Flash',form:'Vorm',checkbox:'Märkeruut',radio:'Raadionupp',textField:'Tekstilahter',textarea:'Tekstiala',hiddenField:'Varjatud lahter',button:'Nupp',select:'Valiklahter',imageButton:'Piltnupp',notSet:'<määramata>',id:'ID',name:'Nimi',langDir:'Keele suund',langDirLtr:'Vasakult paremale (LTR)',langDirRtl:'Paremalt vasakule (RTL)',langCode:'Keele kood',longDescr:'Pikk kirjeldus URL',cssClass:'Stiilistiku klassid',advisoryTitle:'Soovituslik pealkiri',cssStyle:'Laad',ok:'OK',cancel:'Loobu',close:'Sulge',preview:'Eelvaade',generalTab:'Üldine',advancedTab:'Täpsemalt',validateNumberFailed:'See väärtus pole number.',confirmNewPage:'Kõik salvestamata muudatused lähevad kaotsi. Kas oled kindel, et tahad laadida uue lehe?',confirmCancel:'Mõned valikud on muudetud. Kas oled kindel, et tahad dialoogi sulgeda?',options:'Valikud',target:'Sihtkoht',targetNew:'Uus aken (_blank)',targetTop:'Kõige ülemine aken (_top)',targetSelf:'Sama aken (_self)',targetParent:'Vanemaken (_parent)',langDirLTR:'Vasakult paremale (LTR)',langDirRTL:'Paremalt vasakule (RTL)',styles:'Stiili',cssClasses:'Stiililehe klassid',width:'Laius',height:'Kõrgus',align:'Joondus',alignLeft:'Vasak',alignRight:'Paremale',alignCenter:'Kesk',alignTop:'Üles',alignMiddle:'Keskele',alignBottom:'Alla',invalidHeight:'Kõrgus peab olema number.',invalidWidth:'Laius peab olema number.',invalidCssLength:'"%1" välja jaoks määratud väärtus peab olema positiivne täisarv CSS ühikuga (px, %, in, cm, mm, em, ex, pt või pc) või ilma.',invalidHtmlLength:'"%1" välja jaoks määratud väärtus peab olema positiivne täisarv HTML ühikuga (px või %) või ilma.',invalidInlineStyle:'Reasisese stiili määrangud peavad koosnema paarisväärtustest (tuples), mis on semikoolonitega eraldatult järgnevas vormingus: "nimi : väärtus".',cssLengthTooltip:'Sisesta väärtus pikslites või number koos sobiva CSS-i ühikuga (px, %, in, cm, mm, em, ex, pt või pc).',unavailable:'%1<span class="cke_accessibility">, pole saadaval</span>'},contextmenu:{options:'Kontekstimenüü valikud'},specialChar:{toolbar:'Erimärgi sisestamine',title:'Erimärgi valimine',options:'Erimärkide valikud'},link:{toolbar:'Lingi lisamine/muutmine',other:'<muu>',menu:'Muuda linki',title:'Link',info:'Lingi info',target:'Sihtkoht',upload:'Lae üles',advanced:'Täpsemalt',type:'Lingi liik',toUrl:'URL',toAnchor:'Ankur sellel lehel',toEmail:'E-post',targetFrame:'<raam>',targetPopup:'<hüpikaken>',targetFrameName:'Sihtmärk raami nimi',targetPopupName:'Hüpikakna nimi',popupFeatures:'Hüpikakna omadused',popupResizable:'Suurust saab muuta',popupStatusBar:'Olekuriba',popupLocationBar:'Aadressiriba',popupToolbar:'Tööriistariba',popupMenuBar:'Menüüriba',popupFullScreen:'Täisekraan (IE)',popupScrollBars:'Kerimisribad',popupDependent:'Sõltuv (Netscape)',popupLeft:'Vasak asukoht',popupTop:'Ülemine asukoht',id:'ID',langDir:'Keele suund',langDirLTR:'Vasakult paremale (LTR)',langDirRTL:'Paremalt vasakule (RTL)',acccessKey:'Juurdepääsu võti',name:'Nimi',langCode:'Keele suund',tabIndex:'Tab indeks',advisoryTitle:'Juhendav tiitel',advisoryContentType:'Juhendava sisu tüüp',cssClasses:'Stiilistiku klassid',charset:'Lingitud ressursi märgistik',styles:'Laad',rel:'Suhe',selectAnchor:'Vali ankur',anchorName:'Ankru nime järgi',anchorId:'Elemendi id järgi',emailAddress:'E-posti aadress',emailSubject:'Sõnumi teema',emailBody:'Sõnumi tekst',noAnchors:'(Selles dokumendis pole ankruid)',noUrl:'Palun kirjuta lingi URL',noEmail:'Palun kirjuta e-posti aadress'},anchor:{toolbar:'Ankru sisestamine/muutmine',menu:'Ankru omadused',title:'Ankru omadused',name:'Ankru nimi',errorName:'Palun sisesta ankru nimi',remove:'Eemalda ankur'},list:{numberedTitle:'Numberloendi omadused',bulletedTitle:'Punktloendi omadused',type:'Liik',start:'Algus',validateStartNumber:'Loendi algusnumber peab olema täisarv.',circle:'Ring',disc:'Täpp',square:'Ruut',none:'Puudub',notset:'<pole määratud>',armenian:'Armeenia numbrid',georgian:'Gruusia numbrid (an, ban, gan, jne)',lowerRoman:'Väiksed rooma numbrid (i, ii, iii, iv, v, jne)',upperRoman:'Suured rooma numbrid (I, II, III, IV, V, jne)',lowerAlpha:'Väiketähed (a, b, c, d, e, jne)',upperAlpha:'Suurtähed (A, B, C, D, E, jne)',lowerGreek:'Kreeka väiketähed (alpha, beta, gamma, jne)',decimal:'Numbrid (1, 2, 3, jne)',decimalLeadingZero:'Numbrid algusnulliga (01, 02, 03, jne)'},findAndReplace:{title:'Otsimine ja asendamine',find:'Otsi',replace:'Asenda',findWhat:'Otsitav:',replaceWith:'Asendus:',notFoundMsg:'Otsitud teksti ei leitud.',findOptions:'Otsingu valikud',matchCase:'Suur- ja väiketähtede eristamine',matchWord:'Ainult terved sõnad',matchCyclic:'Jätkatakse algusest',replaceAll:'Asenda kõik',replaceSuccessMsg:'%1 vastet asendati.'},table:{toolbar:'Tabel',title:'Tabeli omadused',menu:'Tabeli omadused',deleteTable:'Kustuta tabel',rows:'Read',columns:'Veerud',border:'Joone suurus',widthPx:'pikslit',widthPc:'protsenti',widthUnit:'laiuse ühik',cellSpace:'Lahtri vahe',cellPad:'Lahtri täidis',caption:'Tabeli tiitel',summary:'Kokkuvõte',headers:'Päised',headersNone:'Puudub',headersColumn:'Esimene tulp',headersRow:'Esimene rida',headersBoth:'Mõlemad',invalidRows:'Ridade arv peab olema nullist suurem.',invalidCols:'Tulpade arv peab olema nullist suurem.',invalidBorder:'Äärise suurus peab olema number.',invalidWidth:'Tabeli laius peab olema number.',invalidHeight:'Tabeli kõrgus peab olema number.',invalidCellSpacing:'Lahtrite vahe peab olema positiivne arv.',invalidCellPadding:'Lahtrite polsterdus (padding) peab olema positiivne arv.',cell:{menu:'Lahter',insertBefore:'Sisesta lahter enne',insertAfter:'Sisesta lahter peale',deleteCell:'Eemalda lahtrid',merge:'Ühenda lahtrid',mergeRight:'Ühenda paremale',mergeDown:'Ühenda alla',splitHorizontal:'Poolita lahter horisontaalselt',splitVertical:'Poolita lahter vertikaalselt',title:'Lahtri omadused',cellType:'Lahtri liik',rowSpan:'Ridade vahe',colSpan:'Tulpade vahe',wordWrap:'Sõnade murdmine',hAlign:'Horisontaalne joondus',vAlign:'Vertikaalne joondus',alignBaseline:'Baasjoon',bgColor:'Tausta värv',borderColor:'Äärise värv',data:'Andmed',header:'Päis',yes:'Jah',no:'Ei',invalidWidth:'Lahtri laius peab olema number.',invalidHeight:'Lahtri kõrgus peab olema number.',invalidRowSpan:'Ridade vahe peab olema täisarv.',invalidColSpan:'Tulpade vahe peab olema täisarv.',chooseColor:'Vali'},row:{menu:'Rida',insertBefore:'Sisesta rida enne',insertAfter:'Sisesta rida peale',deleteRow:'Eemalda read'},column:{menu:'Veerg',insertBefore:'Sisesta veerg enne',insertAfter:'Sisesta veerg peale',deleteColumn:'Eemalda veerud'}},button:{title:'Nupu omadused',text:'Tekst (väärtus)',type:'Liik',typeBtn:'Nupp',typeSbm:'Saada',typeRst:'Lähtesta'},checkboxAndRadio:{checkboxTitle:'Märkeruudu omadused',radioTitle:'Raadionupu omadused',value:'Väärtus',selected:'Märgitud'},form:{title:'Vormi omadused',menu:'Vormi omadused',action:'Toiming',method:'Meetod',encoding:'Kodeering'},select:{title:'Valiklahtri omadused',selectInfo:'Info',opAvail:'Võimalikud valikud:',value:'Väärtus',size:'Suurus',lines:'ridu',chkMulti:'Võimalik mitu valikut',opText:'Tekst',opValue:'Väärtus',btnAdd:'Lisa',btnModify:'Muuda',btnUp:'Üles',btnDown:'Alla',btnSetValue:'Määra vaikimisi',btnDelete:'Kustuta'},textarea:{title:'Tekstiala omadused',cols:'Veerge',rows:'Ridu'},textfield:{title:'Tekstilahtri omadused',name:'Nimi',value:'Väärtus',charWidth:'Laius (tähemärkides)',maxChars:'Maksimaalselt tähemärke',type:'Liik',typeText:'Tekst',typePass:'Parool'},hidden:{title:'Varjatud lahtri omadused',name:'Nimi',value:'Väärtus'},image:{title:'Pildi omadused',titleButton:'Piltnupu omadused',menu:'Pildi omadused',infoTab:'Pildi info',btnUpload:'Saada serverisse',upload:'Lae üles',alt:'Alternatiivne tekst',lockRatio:'Lukusta kuvasuhe',resetSize:'Lähtesta suurus',border:'Joon',hSpace:'H. vaheruum',vSpace:'V. vaheruum',alertUrl:'Palun kirjuta pildi URL',linkTab:'Link',button2Img:'Kas tahad teisendada valitud pildiga nupu tavaliseks pildiks?',img2Button:'Kas tahad teisendada valitud tavalise pildi pildiga nupuks?',urlMissing:'Pildi lähte-URL on puudu.',validateBorder:'Äärise laius peab olema täisarv.',validateHSpace:'Horisontaalne vaheruum peab olema täisarv.',validateVSpace:'Vertikaalne vaheruum peab olema täisarv.'},flash:{properties:'Flashi omadused',propertiesTab:'Omadused',title:'Flashi omadused',chkPlay:'Automaatne start ',chkLoop:'Korduv',chkMenu:'Flashi menüü lubatud',chkFull:'Täisekraan lubatud',scale:'Mastaap',scaleAll:'Näidatakse kõike',scaleNoBorder:'Äärist ei ole',scaleFit:'Täpne sobivus',access:'Skriptide ligipääs',accessAlways:'Kõigile',accessSameDomain:'Samalt domeenilt',accessNever:'Mitte ühelegi',alignAbsBottom:'Abs alla',alignAbsMiddle:'Abs keskele',alignBaseline:'Baasjoonele',alignTextTop:'Tekstist üles',quality:'Kvaliteet',qualityBest:'Parim',qualityHigh:'Kõrge',qualityAutoHigh:'Automaatne kõrge',qualityMedium:'Keskmine',qualityAutoLow:'Automaatne madal',qualityLow:'Madal',windowModeWindow:'Aken',windowModeOpaque:'Läbipaistmatu',windowModeTransparent:'Läbipaistev',windowMode:'Akna režiim',flashvars:'Flashi muutujad',bgcolor:'Tausta värv',hSpace:'H. vaheruum',vSpace:'V. vaheruum',validateSrc:'Palun kirjuta lingi URL',validateHSpace:'H. vaheruum peab olema number.',validateVSpace:'V. vaheruum peab olema number.'},spellCheck:{toolbar:'Õigekirjakontroll',title:'Õigekirjakontroll',notAvailable:'Kahjuks ei ole teenus praegu saadaval.',errorLoading:'Viga rakenduse teenushosti laadimisel: %s.',notInDic:'Puudub sõnastikust',changeTo:'Muuda',btnIgnore:'Ignoreeri',btnIgnoreAll:'Ignoreeri kõiki',btnReplace:'Asenda',btnReplaceAll:'Asenda kõik',btnUndo:'Võta tagasi',noSuggestions:'- Soovitused puuduvad -',progress:'Toimub õigekirja kontroll...',noMispell:'Õigekirja kontroll sooritatud: õigekirjuvigu ei leitud',noChanges:'Õigekirja kontroll sooritatud: ühtegi sõna ei muudetud',oneChange:'Õigekirja kontroll sooritatud: üks sõna muudeti',manyChanges:'Õigekirja kontroll sooritatud: %1 sõna muudetud',ieSpellDownload:'Õigekirja kontrollija ei ole paigaldatud. Soovid sa selle alla laadida?'},smiley:{toolbar:'Emotikon',title:'Sisesta emotikon',options:'Emotikonide valikud'},elementsPath:{eleLabel:'Elementide asukoht',eleTitle:'%1 element'},numberedlist:'Numberloend',bulletedlist:'Punktloend',indent:'Taande suurendamine',outdent:'Taande vähendamine',justify:{left:'Vasakjoondus',center:'Keskjoondus',right:'Paremjoondus',block:'Rööpjoondus'},blockquote:'Blokktsitaat',clipboard:{title:'Asetamine',cutError:'Sinu veebisirvija turvaseaded ei luba redaktoril automaatselt lõigata. Palun kasutage selleks klaviatuuri klahvikombinatsiooni (Ctrl/Cmd+X).',copyError:'Sinu veebisirvija turvaseaded ei luba redaktoril automaatselt kopeerida. Palun kasutage selleks klaviatuuri klahvikombinatsiooni (Ctrl/Cmd+C).',pasteMsg:'Palun aseta tekst järgnevasse kasti kasutades klaviatuuri klahvikombinatsiooni (<STRONG>Ctrl/Cmd+V</STRONG>) ja vajuta seejärel <STRONG>OK</STRONG>.',securityMsg:'Sinu veebisirvija turvaseadete tõttu ei oma redaktor otsest ligipääsu lõikelaua andmetele. Sa pead asetama need uuesti siia aknasse.',pasteArea:'Asetamise ala'},pastefromword:{confirmCleanup:'Tekst, mida tahad asetada näib pärinevat Wordist. Kas tahad selle enne asetamist puhastada?',toolbar:'Asetamine Wordist',title:'Asetamine Wordist',error:'Asetatud andmete puhastamine ei olnud sisemise vea tõttu võimalik'},pasteText:{button:'Asetamine tavalise tekstina',title:'Asetamine tavalise tekstina'},templates:{button:'Mall',title:'Sisumallid',options:'Malli valikud',insertOption:'Praegune sisu asendatakse',selectPromptMsg:'Palun vali mall, mis avada redaktoris<br />(praegune sisu läheb kaotsi):',emptyListMsg:'(Ühtegi malli ei ole defineeritud)'},showBlocks:'Blokkide näitamine',stylesCombo:{label:'Stiil',panelTitle:'Vormindusstiilid',panelTitle1:'Blokkstiilid',panelTitle2:'Reasisesed stiilid',panelTitle3:'Objektistiilid'},format:{label:'Vorming',panelTitle:'Vorming',tag_p:'Tavaline',tag_pre:'Vormindatud',tag_address:'Aadress',tag_h1:'Pealkiri 1',tag_h2:'Pealkiri 2',tag_h3:'Pealkiri 3',tag_h4:'Pealkiri 4',tag_h5:'Pealkiri 5',tag_h6:'Pealkiri 6',tag_div:'Tavaline (DIV)'},div:{title:'Div-konteineri loomine',toolbar:'Div-konteineri loomine',cssClassInputLabel:'Stiililehe klassid',styleSelectLabel:'Stiil',IdInputLabel:'ID',languageCodeInputLabel:' Keelekood',inlineStyleInputLabel:'Reasisene stiil',advisoryTitleInputLabel:'Soovitatav pealkiri',langDirLabel:'Keele suund',langDirLTRLabel:'Vasakult paremale (LTR)',langDirRTLLabel:'Paremalt vasakule (RTL)',edit:'Muuda Div',remove:'Eemalda Div'},iframe:{title:'IFrame omadused',toolbar:'IFrame',noUrl:'Vali iframe URLi liik',scrolling:'Kerimisribade lubamine',border:'Raami äärise näitamine'},font:{label:'Kiri',voiceLabel:'Kiri',panelTitle:'Kiri'},fontSize:{label:'Suurus',voiceLabel:'Kirja suurus',panelTitle:'Suurus'},colorButton:{textColorTitle:'Teksti värv',bgColorTitle:'Tausta värv',panelTitle:'Värvid',auto:'Automaatne',more:'Rohkem värve...'},colors:{'000':'Must',800000:'Kastanpruun','8B4513':'Sadulapruun','2F4F4F':'Tume paehall','008080':'Sinakasroheline','000080':'Meresinine','4B0082':'Indigosinine',696969:'Tumehall',B22222:'Šamottkivi',A52A2A:'Pruun',DAA520:'Kuldkollane','006400':'Tumeroheline','40E0D0':'Türkiissinine','0000CD':'Keskmine sinine',800080:'Lilla',808080:'Hall',F00:'Punanae',FF8C00:'Tumeoranž',FFD700:'Kuldne','008000':'Roheline','0FF':'Tsüaniidsinine','00F':'Sinine',EE82EE:'Violetne',A9A9A9:'Tuhm hall',FFA07A:'Hele lõhe',FFA500:'Oranž',FFFF00:'Kollane','00FF00':'Lubja hall',AFEEEE:'Kahvatu türkiis',ADD8E6:'Helesinine',DDA0DD:'Ploomililla',D3D3D3:'Helehall',FFF0F5:'Lavendlipunane',FAEBD7:'Antiikvalge',FFFFE0:'Helekollane',F0FFF0:'Meloniroheline',F0FFFF:'Taevasinine',F0F8FF:'Beebisinine',E6E6FA:'Lavendel',FFF:'Valge'},scayt:{title:'Õigekirjakontroll kirjutamise ajal',opera_title:'Operas pole toetatud',enable:'SCAYT lubatud',disable:'SCAYT keelatud',about:'SCAYT-ist lähemalt',toggle:'SCAYT sisse/välja lülitamine',options:'Valikud',langs:'Keeled',moreSuggestions:'Veel soovitusi',ignore:'Eira',ignoreAll:'Eira kõiki',addWord:'Lisa sõna',emptyDic:'Sõnaraamatu nimi ei tohi olla tühi.',optionsTab:'Valikud',allCaps:'Läbivate suurtähtedega sõnade eiramine',ignoreDomainNames:'Domeeninimede eiramine',mixedCase:'Tavapäratu tõstuga sõnade eiramine',mixedWithDigits:'Numbreid sisaldavate sõnade eiramine',languagesTab:'Keeled',dictionariesTab:'Sõnaraamatud',dic_field_name:'Sõnaraamatu nimi',dic_create:'Loo',dic_restore:'Taasta',dic_delete:'Kustuta',dic_rename:'Nimeta ümber',dic_info:'Alguses säilitatakse kasutaja sõnaraamatut küpsises. Küpsise suurus on piiratud. Pärast sõnaraamatu kasvamist nii suureks, et see küpsisesse ei mahu, võib sõnaraamatut hoida meie serveris. Oma isikliku sõnaraamatu hoidmiseks meie serveris pead andma sellele nime. Kui sa juba oled sõnaraamatu salvestanud, sisesta selle nimi ja klõpsa taastamise nupule.',aboutTab:'Lähemalt'},about:{title:'CKEditorist',dlgTitle:'CKEditorist',help:'Abi jaoks vaata $1.',userGuide:'CKEditori kasutusjuhendit',moreInfo:'Litsentsi andmed leiab meie veebilehelt:',copy:'Copyright © $1. Kõik õigused kaitstud.'},maximize:'Maksimeerimine',minimize:'Minimeerimine',fakeobjects:{anchor:'Ankur',flash:'Flashi animatsioon',iframe:'IFrame',hiddenfield:'Varjatud väli',unknown:'Tundmatu objekt'},resize:'Suuruse muutmiseks lohista',colordialog:{title:'Värvi valimine',options:'Värvi valikud',highlight:'Näidis',selected:'Valitud värv',clear:'Eemalda'},toolbarCollapse:'Tööriistariba peitmine',toolbarExpand:'Tööriistariba näitamine',toolbarGroups:{document:'Dokument',clipboard:'Lõikelaud/tagasivõtmine',editing:'Muutmine',forms:'Vormid',basicstyles:'Põhistiilid',paragraph:'Lõik',links:'Lingid',insert:'Sisesta',styles:'Stiilid',colors:'Värvid',tools:'Tööriistad'},bidi:{ltr:'Teksti suund vasakult paremale',rtl:'Teksti suund paremalt vasakule'},docprops:{label:'Dokumendi omadused',title:'Dokumendi omadused',design:'Disain',meta:'Meta andmed',chooseColor:'Vali',other:'<muu>',docTitle:'Lehekülje tiitel',charset:'Märgistiku kodeering',charsetOther:'Ülejäänud märgistike kodeeringud',charsetASCII:'ASCII',charsetCE:'Kesk-Euroopa',charsetCT:'Hiina traditsiooniline (Big5)',charsetCR:'Kirillisa',charsetGR:'Kreeka',charsetJP:'Jaapani',charsetKR:'Korea',charsetTR:'Türgi',charsetUN:'Unicode (UTF-8)',charsetWE:'Lääne-Euroopa',docType:'Dokumendi tüüppäis',docTypeOther:'Teised dokumendi tüüppäised',xhtmlDec:'Arva kaasa XHTML deklaratsioonid',bgColor:'Taustavärv',bgImage:'Taustapildi URL',bgFixed:'Mittekeritav tagataust',txtColor:'Teksti värv',margin:'Lehekülje äärised',marginTop:'Ülaserv',marginLeft:'Vasakserv',marginRight:'Paremserv',marginBottom:'Alaserv',metaKeywords:'Dokumendi võtmesõnad (eraldatud komadega)',metaDescription:'Dokumendi kirjeldus',metaAuthor:'Autor',metaCopyright:'Autoriõigus',previewHtml:'<p>See on <strong>näidistekst</strong>. Sa kasutad <a href="javascript:void(0)">CKEditori</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/eu.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/eu.js
index 5826bcf..21a9708 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/eu.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/eu.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.eu={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'HTML Iturburua',newPage:'Orrialde Berria',save:'Gorde',preview:'Aurrebista',cut:'Ebaki',copy:'Kopiatu',paste:'Itsatsi',print:'Inprimatu',underline:'Azpimarratu',bold:'Lodia',italic:'Etzana',selectAll:'Hautatu dena',removeFormat:'Kendu Formatua',strike:'Marratua',subscript:'Azpi-indize',superscript:'Goi-indize',horizontalrule:'Txertatu Marra Horizontala',pagebreak:'Txertatu Orrialde-jauzia',pagebreakAlt:'Page Break',unlink:'Kendu Esteka',undo:'Desegin',redo:'Berregin',common:{browseServer:'Zerbitzaria arakatu',url:'URL',protocol:'Protokoloa',upload:'Gora kargatu',uploadSubmit:'Zerbitzarira bidalia',image:'Irudia',flash:'Flasha',form:'Formularioa',checkbox:'Kontrol-laukia',radio:'Aukera-botoia',textField:'Testu Eremua',textarea:'Testu-area',hiddenField:'Ezkutuko Eremua',button:'Botoia',select:'Hautespen Eremua',imageButton:'Irudi Botoia',notSet:'<Ezarri gabe>',id:'Id',name:'Izena',langDir:'Hizkuntzaren Norabidea',langDirLtr:'Ezkerretik Eskumara(LTR)',langDirRtl:'Eskumatik Ezkerrera (RTL)',langCode:'Hizkuntza Kodea',longDescr:'URL Deskribapen Luzea',cssClass:'Estilo-orriko Klaseak',advisoryTitle:'Izenburua',cssStyle:'Estiloa',ok:'Ados',cancel:'Utzi',close:'Close',preview:'Preview',generalTab:'Orokorra',advancedTab:'Aurreratua',validateNumberFailed:'Balio hau ez da zenbaki bat.',confirmNewPage:'Eduki honetan gorde gabe dauden aldaketak galduko dira. Ziur zaude orri berri bat kargatu nahi duzula?',confirmCancel:'Aukera batzuk aldatu egin dira. Ziur zaude elkarrizketa-koadroa itxi nahi duzula?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Zabalera',height:'Altuera',align:'Lerrokatu',alignLeft:'Ezkerrera',alignRight:'Eskuman',alignCenter:'Erdian',alignTop:'Goian',alignMiddle:'Erdian',alignBottom:'Behean',invalidHeight:'Altuera zenbaki bat izan behar da.',invalidWidth:'Zabalera zenbaki bat izan behar da.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, erabilezina</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Txertatu Karaktere Berezia',title:'Karaktere Berezia Aukeratu',options:'Special Character Options'},link:{toolbar:'Txertatu/Editatu Esteka',other:'<other>',menu:'Aldatu Esteka',title:'Esteka',info:'Estekaren Informazioa',target:'Target (Helburua)',upload:'Gora kargatu',advanced:'Aurreratua',type:'Esteka Mota',toUrl:'URL',toAnchor:'Aingura orrialde honetan',toEmail:'ePosta',targetFrame:'<marko>',targetPopup:'<popup leihoa>',targetFrameName:'Marko Helburuaren Izena',targetPopupName:'Popup Leihoaren Izena',popupFeatures:'Popup Leihoaren Ezaugarriak',popupResizable:'Tamaina Aldakorra',popupStatusBar:'Egoera Barra',popupLocationBar:'Kokaleku Barra',popupToolbar:'Tresna Barra',popupMenuBar:'Menu Barra',popupFullScreen:'Pantaila Osoa (IE)',popupScrollBars:'Korritze Barrak',popupDependent:'Menpekoa (Netscape)',popupLeft:'Ezkerreko Posizioa',popupTop:'Goiko Posizioa',id:'Id',langDir:'Hizkuntzaren Norabidea',langDirLTR:'Ezkerretik Eskumara(LTR)',langDirRTL:'Eskumatik Ezkerrera (RTL)',acccessKey:'Sarbide-gakoa',name:'Izena',langCode:'Hizkuntzaren Norabidea',tabIndex:'Tabulazio Indizea',advisoryTitle:'Izenburua',advisoryContentType:'Eduki Mota (Content Type)',cssClasses:'Estilo-orriko Klaseak',charset:'Estekatutako Karaktere Multzoa',styles:'Estiloa',rel:'Relationship',selectAnchor:'Aingura bat hautatu',anchorName:'Aingura izenagatik',anchorId:'Elementuaren ID-gatik',emailAddress:'ePosta Helbidea',emailSubject:'Mezuaren Gaia',emailBody:'Mezuaren Gorputza',noAnchors:'(Ez daude aingurak eskuragarri dokumentuan)',noUrl:'Mesedez URL esteka idatzi',noEmail:'Mesedez ePosta helbidea idatzi'},anchor:{toolbar:'Aingura',menu:'Ainguraren Ezaugarriak',title:'Ainguraren Ezaugarriak',name:'Ainguraren Izena',errorName:'Idatzi ainguraren izena',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Bilatu eta Ordeztu',find:'Bilatu',replace:'Ordezkatu',findWhat:'Zer bilatu:',replaceWith:'Zerekin ordeztu:',notFoundMsg:'Idatzitako testua ez da topatu.',findOptions:'Find Options',matchCase:'Maiuskula/minuskula',matchWord:'Esaldi osoa bilatu',matchCyclic:'Bilaketa ziklikoa',replaceAll:'Ordeztu Guztiak',replaceSuccessMsg:'Zenbat aldiz ordeztua: %1'},table:{toolbar:'Taula',title:'Taularen Ezaugarriak',menu:'Taularen Ezaugarriak',deleteTable:'Ezabatu Taula',rows:'Lerroak',columns:'Zutabeak',border:'Ertzaren Zabalera',widthPx:'pixel',widthPc:'ehuneko',widthUnit:'width unit',cellSpace:'Gelaxka arteko tartea',cellPad:'Gelaxken betegarria',caption:'Epigrafea',summary:'Laburpena',headers:'Goiburuak',headersNone:'Bat ere ez',headersColumn:'Lehen zutabea',headersRow:'Lehen lerroa',headersBoth:'Biak',invalidRows:'Lerro kopurua 0 baino handiagoa den zenbakia izan behar da.',invalidCols:'Zutabe kopurua 0 baino handiagoa den zenbakia izan behar da.',invalidBorder:'Ertzaren tamaina zenbaki bat izan behar da.',invalidWidth:'Taularen zabalera zenbaki bat izan behar da.',invalidHeight:'Taularen altuera zenbaki bat izan behar da.',invalidCellSpacing:'Gelaxka arteko tartea zenbaki bat izan behar da.',invalidCellPadding:'Gelaxken betegarria zenbaki bat izan behar da.',cell:{menu:'Gelaxka',insertBefore:'Txertatu Gelaxka Aurretik',insertAfter:'Txertatu Gelaxka Ostean',deleteCell:'Kendu Gelaxkak',merge:'Batu Gelaxkak',mergeRight:'Elkartu Eskumara',mergeDown:'Elkartu Behera',splitHorizontal:'Banatu Gelaxkak Horizontalki',splitVertical:'Banatu Gelaxkak Bertikalki',title:'Gelaxken Ezaugarriak',cellType:'Gelaxka Mota',rowSpan:'Hedatutako Lerroak',colSpan:'Hedatutako Zutabeak',wordWrap:'Itzulbira',hAlign:'Lerrokatze Horizontala',vAlign:'Lerrokatze Bertikala',alignBaseline:'Oinarri-lerroan',bgColor:'Fondoaren Kolorea',borderColor:'Ertzaren Kolorea',data:'Data',header:'Goiburua',yes:'Bai',no:'Ez',invalidWidth:'Gelaxkaren zabalera zenbaki bat izan behar da.',invalidHeight:'Gelaxkaren altuera zenbaki bat izan behar da.',invalidRowSpan:'Lerroen hedapena zenbaki osoa izan behar da.',invalidColSpan:'Zutabeen hedapena zenbaki osoa izan behar da.',chooseColor:'Choose'},row:{menu:'Lerroa',insertBefore:'Txertatu Lerroa Aurretik',insertAfter:'Txertatu Lerroa Ostean',deleteRow:'Ezabatu Lerroak'},column:{menu:'Zutabea',insertBefore:'Txertatu Zutabea Aurretik',insertAfter:'Txertatu Zutabea Ostean',deleteColumn:'Ezabatu Zutabeak'}},button:{title:'Botoiaren Ezaugarriak',text:'Testua (Balorea)',type:'Mota',typeBtn:'Botoia',typeSbm:'Bidali',typeRst:'Garbitu'},checkboxAndRadio:{checkboxTitle:'Kontrol-laukiko Ezaugarriak',radioTitle:'Aukera-botoiaren Ezaugarriak',value:'Balorea',selected:'Hautatuta'},form:{title:'Formularioaren Ezaugarriak',menu:'Formularioaren Ezaugarriak',action:'Ekintza',method:'Metodoa',encoding:'Kodeketa'},select:{title:'Hautespen Eremuaren Ezaugarriak',selectInfo:'Informazioa',opAvail:'Aukera Eskuragarriak',value:'Balorea',size:'Tamaina',lines:'lerro kopurura',chkMulti:'Hautaketa anitzak baimendu',opText:'Testua',opValue:'Balorea',btnAdd:'Gehitu',btnModify:'Aldatu',btnUp:'Gora',btnDown:'Behera',btnSetValue:'Aukeratutako balorea ezarri',btnDelete:'Ezabatu'},textarea:{title:'Testu-arearen Ezaugarriak',cols:'Zutabeak',rows:'Lerroak'},textfield:{title:'Testu Eremuaren Ezaugarriak',name:'Izena',value:'Balorea',charWidth:'Zabalera',maxChars:'Zenbat karaktere gehienez',type:'Mota',typeText:'Testua',typePass:'Pasahitza'},hidden:{title:'Ezkutuko Eremuaren Ezaugarriak',name:'Izena',value:'Balorea'},image:{title:'Irudi Ezaugarriak',titleButton:'Irudi Botoiaren Ezaugarriak',menu:'Irudi Ezaugarriak',infoTab:'Irudi informazioa',btnUpload:'Zerbitzarira bidalia',upload:'Gora Kargatu',alt:'Ordezko Testua',lockRatio:'Erlazioa Blokeatu',resetSize:'Tamaina Berrezarri',border:'Ertza',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Mesedez Irudiaren URLa idatzi',linkTab:'Esteka',button2Img:'Aukeratutako irudi botoia, irudi normal batean eraldatu nahi duzu?',img2Button:'Aukeratutako irudia, irudi botoi batean eraldatu nahi duzu?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Flasharen Ezaugarriak',propertiesTab:'Ezaugarriak',title:'Flasharen Ezaugarriak',chkPlay:'Automatikoki Erreproduzitu',chkLoop:'Begizta',chkMenu:'Flasharen Menua Gaitu',chkFull:'Onartu Pantaila osoa',scale:'Eskalatu',scaleAll:'Dena erakutsi',scaleNoBorder:'Ertzik gabe',scaleFit:'Doitu',access:'Scriptak baimendu',accessAlways:'Beti',accessSameDomain:'Domeinu berdinekoak',accessNever:'Inoiz ere ez',alignAbsBottom:'Abs Behean',alignAbsMiddle:'Abs Erdian',alignBaseline:'Oinan',alignTextTop:'Testua Goian',quality:'Kalitatea',qualityBest:'Hoberena',qualityHigh:'Altua',qualityAutoHigh:'Auto Altua',qualityMedium:'Ertaina',qualityAutoLow:'Auto Baxua',qualityLow:'Baxua',windowModeWindow:'Leihoa',windowModeOpaque:'Opakoa',windowModeTransparent:'Gardena',windowMode:'Leihoaren modua',flashvars:'Flash Aldagaiak',bgcolor:'Atzeko kolorea',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'Mesedez URL esteka idatzi',validateHSpace:'HSpace zenbaki bat izan behar da.',validateVSpace:'VSpace zenbaki bat izan behar da.'},spellCheck:{toolbar:'Ortografia',title:'Ortografia zuzenketa',notAvailable:'Barkatu baina momentu honetan zerbitzua ez dago erabilgarri.',errorLoading:'Errorea gertatu da aplikazioa zerbitzaritik kargatzean: %s.',notInDic:'Ez dago hiztegian',changeTo:'Honekin ordezkatu',btnIgnore:'Ezikusi',btnIgnoreAll:'Denak Ezikusi',btnReplace:'Ordezkatu',btnReplaceAll:'Denak Ordezkatu',btnUndo:'Desegin',noSuggestions:'- Iradokizunik ez -',progress:'Zuzenketa ortografikoa martxan...',noMispell:'Zuzenketa ortografikoa bukatuta: Akatsik ez',noChanges:'Zuzenketa ortografikoa bukatuta: Ez da ezer aldatu',oneChange:'Zuzenketa ortografikoa bukatuta: Hitz bat aldatu da',manyChanges:'Zuzenketa ortografikoa bukatuta: %1 hitz aldatu dira',ieSpellDownload:'Zuzentzaile ortografikoa ez dago instalatuta. Deskargatu nahi duzu?'},smiley:{toolbar:'Aurpegierak',title:'Aurpegiera Sartu',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 elementua'},numberedlist:'Zenbakidun Zerrenda',bulletedlist:'Buletdun Zerrenda',indent:'Handitu Koska',outdent:'Txikitu Koska',justify:{left:'Lerrokatu Ezkerrean',center:'Lerrokatu Erdian',right:'Lerrokatu Eskuman',block:'Justifikatu'},blockquote:'Aipamen blokea',clipboard:{title:'Itsatsi',cutError:'Zure web nabigatzailearen segurtasun ezarpenak testuak automatikoki moztea ez dute baimentzen. Mesedez teklatua erabili ezazu (Ctrl/Cmd+X).',copyError:'Zure web nabigatzailearen segurtasun ezarpenak testuak automatikoki kopiatzea ez dute baimentzen. Mesedez teklatua erabili ezazu (Ctrl/Cmd+C).',pasteMsg:'Mesedez teklatua erabilita (<STRONG>Ctrl/Cmd+V</STRONG>) ondorego eremuan testua itsatsi eta <STRONG>OK</STRONG> sakatu.',securityMsg:'Nabigatzailearen segurtasun ezarpenak direla eta, editoreak ezin du arbela zuzenean erabili. Leiho honetan berriro itsatsi behar duzu.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'Itsatsi nahi duzun testua Wordetik hartua dela dirudi. Itsatsi baino lehen garbitu nahi duzu?',toolbar:'Itsatsi Word-etik',title:'Itsatsi Word-etik',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Testu Arrunta bezala Itsatsi',title:'Testu Arrunta bezala Itsatsi'},templates:{button:'Txantiloiak',title:'Eduki Txantiloiak',options:'Template Options',insertOption:'Ordeztu oraingo edukiak',selectPromptMsg:'Mesedez txantiloia aukeratu editorean kargatzeko<br>(orain dauden edukiak galduko dira):',emptyListMsg:'(Ez dago definitutako txantiloirik)'},showBlocks:'Blokeak erakutsi',stylesCombo:{label:'Estiloa',panelTitle:'Formatting Styles',panelTitle1:'Bloke Estiloak',panelTitle2:'Inline Estiloak',panelTitle3:'Objektu Estiloak'},format:{label:'Formatua',panelTitle:'Formatua',tag_p:'Arrunta',tag_pre:'Formateatua',tag_address:'Helbidea',tag_h1:'Izenburua 1',tag_h2:'Izenburua 2',tag_h3:'Izenburua 3',tag_h4:'Izenburua 4',tag_h5:'Izenburua 5',tag_h6:'Izenburua 6',tag_div:'Paragrafoa (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Letra-tipoa',voiceLabel:'Letra-tipoa',panelTitle:'Letra-tipoa'},fontSize:{label:'Tamaina',voiceLabel:'Tamaina',panelTitle:'Tamaina'},colorButton:{textColorTitle:'Testu Kolorea',bgColorTitle:'Atzeko kolorea',panelTitle:'Colors',auto:'Automatikoa',more:'Kolore gehiago...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Ortografia Zuzenketa Idatzi Ahala (SCAYT)',opera_title:'Not supported by Opera',enable:'Gaitu SCAYT',disable:'Desgaitu SCAYT',about:'SCAYTi buruz',toggle:'SCAYT aldatu',options:'Aukerak',langs:'Hizkuntzak',moreSuggestions:'Iradokizun gehiago',ignore:'Baztertu',ignoreAll:'Denak baztertu',addWord:'Hitza Gehitu',emptyDic:'Hiztegiaren izena ezin da hutsik egon.',optionsTab:'Aukerak',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Hizkuntzak',dictionariesTab:'Hiztegiak',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'Honi buruz'},about:{title:'CKEditor(r)i buruz',dlgTitle:'CKEditor(r)i buruz',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'Lizentziari buruzko informazioa gure webgunean:',copy:'Copyright © $1. Eskubide guztiak erreserbaturik.'},maximize:'Maximizatu',minimize:'Minimize',fakeobjects:{anchor:'Aingura',flash:'Flash Animazioa',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Objektu ezezaguna'},resize:'Arrastatu tamaina aldatzeko',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Dokumentuaren Ezarpenak',title:'Dokumentuaren Ezarpenak',design:'Design',meta:'Meta Informazioa',chooseColor:'Choose',other:'<other>',docTitle:'Orriaren Izenburua',charset:'Karaktere Multzoaren Kodeketa',charsetOther:'Beste Karaktere Multzoko Kodeketa',charsetASCII:'ASCII',charsetCE:'Erdialdeko Europakoa',charsetCT:'Txinatar Tradizionala (Big5)',charsetCR:'Zirilikoa',charsetGR:'Grekoa',charsetJP:'Japoniarra',charsetKR:'Korearra',charsetTR:'Turkiarra',charsetUN:'Unicode (UTF-8)',charsetWE:'Mendebaldeko Europakoa',docType:'Document Type Goiburua',docTypeOther:'Beste Document Type Goiburua',xhtmlDec:'XHTML Ezarpenak',bgColor:'Atzeko Kolorea',bgImage:'Atzeko Irudiaren URL-a',bgFixed:'Korritze gabeko Atzealdea',txtColor:'Testu Kolorea',margin:'Orrialdearen marjinak',marginTop:'Goian',marginLeft:'Ezkerrean',marginRight:'Eskuman',marginBottom:'Behean',metaKeywords:'Dokumentuaren Gako-hitzak (komarekin bananduta)',metaDescription:'Dokumentuaren Deskribapena',metaAuthor:'Egilea',metaCopyright:'Copyright',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.eu={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'HTML Iturburua',newPage:'Orrialde Berria',save:'Gorde',preview:'Aurrebista',cut:'Ebaki',copy:'Kopiatu',paste:'Itsatsi',print:'Inprimatu',underline:'Azpimarratu',bold:'Lodia',italic:'Etzana',selectAll:'Hautatu dena',removeFormat:'Kendu Formatua',strike:'Marratua',subscript:'Azpi-indize',superscript:'Goi-indize',horizontalrule:'Txertatu Marra Horizontala',pagebreak:'Txertatu Orrialde-jauzia',pagebreakAlt:'Page Break',unlink:'Kendu Esteka',undo:'Desegin',redo:'Berregin',common:{browseServer:'Zerbitzaria arakatu',url:'URL',protocol:'Protokoloa',upload:'Gora kargatu',uploadSubmit:'Zerbitzarira bidalia',image:'Irudia',flash:'Flasha',form:'Formularioa',checkbox:'Kontrol-laukia',radio:'Aukera-botoia',textField:'Testu Eremua',textarea:'Testu-area',hiddenField:'Ezkutuko Eremua',button:'Botoia',select:'Hautespen Eremua',imageButton:'Irudi Botoia',notSet:'<Ezarri gabe>',id:'Id',name:'Izena',langDir:'Hizkuntzaren Norabidea',langDirLtr:'Ezkerretik Eskumara(LTR)',langDirRtl:'Eskumatik Ezkerrera (RTL)',langCode:'Hizkuntza Kodea',longDescr:'URL Deskribapen Luzea',cssClass:'Estilo-orriko Klaseak',advisoryTitle:'Izenburua',cssStyle:'Estiloa',ok:'Ados',cancel:'Utzi',close:'Close',preview:'Preview',generalTab:'Orokorra',advancedTab:'Aurreratua',validateNumberFailed:'Balio hau ez da zenbaki bat.',confirmNewPage:'Eduki honetan gorde gabe dauden aldaketak galduko dira. Ziur zaude orri berri bat kargatu nahi duzula?',confirmCancel:'Aukera batzuk aldatu egin dira. Ziur zaude elkarrizketa-koadroa itxi nahi duzula?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Zabalera',height:'Altuera',align:'Lerrokatu',alignLeft:'Ezkerrera',alignRight:'Eskuman',alignCenter:'Erdian',alignTop:'Goian',alignMiddle:'Erdian',alignBottom:'Behean',invalidHeight:'Altuera zenbaki bat izan behar da.',invalidWidth:'Zabalera zenbaki bat izan behar da.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, erabilezina</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Txertatu Karaktere Berezia',title:'Karaktere Berezia Aukeratu',options:'Special Character Options'},link:{toolbar:'Txertatu/Editatu Esteka',other:'<other>',menu:'Aldatu Esteka',title:'Esteka',info:'Estekaren Informazioa',target:'Target (Helburua)',upload:'Gora kargatu',advanced:'Aurreratua',type:'Esteka Mota',toUrl:'URL',toAnchor:'Aingura orrialde honetan',toEmail:'ePosta',targetFrame:'<marko>',targetPopup:'<popup leihoa>',targetFrameName:'Marko Helburuaren Izena',targetPopupName:'Popup Leihoaren Izena',popupFeatures:'Popup Leihoaren Ezaugarriak',popupResizable:'Tamaina Aldakorra',popupStatusBar:'Egoera Barra',popupLocationBar:'Kokaleku Barra',popupToolbar:'Tresna Barra',popupMenuBar:'Menu Barra',popupFullScreen:'Pantaila Osoa (IE)',popupScrollBars:'Korritze Barrak',popupDependent:'Menpekoa (Netscape)',popupLeft:'Ezkerreko Posizioa',popupTop:'Goiko Posizioa',id:'Id',langDir:'Hizkuntzaren Norabidea',langDirLTR:'Ezkerretik Eskumara(LTR)',langDirRTL:'Eskumatik Ezkerrera (RTL)',acccessKey:'Sarbide-gakoa',name:'Izena',langCode:'Hizkuntzaren Norabidea',tabIndex:'Tabulazio Indizea',advisoryTitle:'Izenburua',advisoryContentType:'Eduki Mota (Content Type)',cssClasses:'Estilo-orriko Klaseak',charset:'Estekatutako Karaktere Multzoa',styles:'Estiloa',rel:'Relationship',selectAnchor:'Aingura bat hautatu',anchorName:'Aingura izenagatik',anchorId:'Elementuaren ID-gatik',emailAddress:'ePosta Helbidea',emailSubject:'Mezuaren Gaia',emailBody:'Mezuaren Gorputza',noAnchors:'(Ez daude aingurak eskuragarri dokumentuan)',noUrl:'Mesedez URL esteka idatzi',noEmail:'Mesedez ePosta helbidea idatzi'},anchor:{toolbar:'Aingura',menu:'Ainguraren Ezaugarriak',title:'Ainguraren Ezaugarriak',name:'Ainguraren Izena',errorName:'Idatzi ainguraren izena',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Bilatu eta Ordeztu',find:'Bilatu',replace:'Ordezkatu',findWhat:'Zer bilatu:',replaceWith:'Zerekin ordeztu:',notFoundMsg:'Idatzitako testua ez da topatu.',findOptions:'Find Options',matchCase:'Maiuskula/minuskula',matchWord:'Esaldi osoa bilatu',matchCyclic:'Bilaketa ziklikoa',replaceAll:'Ordeztu Guztiak',replaceSuccessMsg:'Zenbat aldiz ordeztua: %1'},table:{toolbar:'Taula',title:'Taularen Ezaugarriak',menu:'Taularen Ezaugarriak',deleteTable:'Ezabatu Taula',rows:'Lerroak',columns:'Zutabeak',border:'Ertzaren Zabalera',widthPx:'pixel',widthPc:'ehuneko',widthUnit:'width unit',cellSpace:'Gelaxka arteko tartea',cellPad:'Gelaxken betegarria',caption:'Epigrafea',summary:'Laburpena',headers:'Goiburuak',headersNone:'Bat ere ez',headersColumn:'Lehen zutabea',headersRow:'Lehen lerroa',headersBoth:'Biak',invalidRows:'Lerro kopurua 0 baino handiagoa den zenbakia izan behar da.',invalidCols:'Zutabe kopurua 0 baino handiagoa den zenbakia izan behar da.',invalidBorder:'Ertzaren tamaina zenbaki bat izan behar da.',invalidWidth:'Taularen zabalera zenbaki bat izan behar da.',invalidHeight:'Taularen altuera zenbaki bat izan behar da.',invalidCellSpacing:'Gelaxka arteko tartea zenbaki bat izan behar da.',invalidCellPadding:'Gelaxken betegarria zenbaki bat izan behar da.',cell:{menu:'Gelaxka',insertBefore:'Txertatu Gelaxka Aurretik',insertAfter:'Txertatu Gelaxka Ostean',deleteCell:'Kendu Gelaxkak',merge:'Batu Gelaxkak',mergeRight:'Elkartu Eskumara',mergeDown:'Elkartu Behera',splitHorizontal:'Banatu Gelaxkak Horizontalki',splitVertical:'Banatu Gelaxkak Bertikalki',title:'Gelaxken Ezaugarriak',cellType:'Gelaxka Mota',rowSpan:'Hedatutako Lerroak',colSpan:'Hedatutako Zutabeak',wordWrap:'Itzulbira',hAlign:'Lerrokatze Horizontala',vAlign:'Lerrokatze Bertikala',alignBaseline:'Oinarri-lerroan',bgColor:'Fondoaren Kolorea',borderColor:'Ertzaren Kolorea',data:'Data',header:'Goiburua',yes:'Bai',no:'Ez',invalidWidth:'Gelaxkaren zabalera zenbaki bat izan behar da.',invalidHeight:'Gelaxkaren altuera zenbaki bat izan behar da.',invalidRowSpan:'Lerroen hedapena zenbaki osoa izan behar da.',invalidColSpan:'Zutabeen hedapena zenbaki osoa izan behar da.',chooseColor:'Choose'},row:{menu:'Lerroa',insertBefore:'Txertatu Lerroa Aurretik',insertAfter:'Txertatu Lerroa Ostean',deleteRow:'Ezabatu Lerroak'},column:{menu:'Zutabea',insertBefore:'Txertatu Zutabea Aurretik',insertAfter:'Txertatu Zutabea Ostean',deleteColumn:'Ezabatu Zutabeak'}},button:{title:'Botoiaren Ezaugarriak',text:'Testua (Balorea)',type:'Mota',typeBtn:'Botoia',typeSbm:'Bidali',typeRst:'Garbitu'},checkboxAndRadio:{checkboxTitle:'Kontrol-laukiko Ezaugarriak',radioTitle:'Aukera-botoiaren Ezaugarriak',value:'Balorea',selected:'Hautatuta'},form:{title:'Formularioaren Ezaugarriak',menu:'Formularioaren Ezaugarriak',action:'Ekintza',method:'Metodoa',encoding:'Kodeketa'},select:{title:'Hautespen Eremuaren Ezaugarriak',selectInfo:'Informazioa',opAvail:'Aukera Eskuragarriak',value:'Balorea',size:'Tamaina',lines:'lerro kopurura',chkMulti:'Hautaketa anitzak baimendu',opText:'Testua',opValue:'Balorea',btnAdd:'Gehitu',btnModify:'Aldatu',btnUp:'Gora',btnDown:'Behera',btnSetValue:'Aukeratutako balorea ezarri',btnDelete:'Ezabatu'},textarea:{title:'Testu-arearen Ezaugarriak',cols:'Zutabeak',rows:'Lerroak'},textfield:{title:'Testu Eremuaren Ezaugarriak',name:'Izena',value:'Balorea',charWidth:'Zabalera',maxChars:'Zenbat karaktere gehienez',type:'Mota',typeText:'Testua',typePass:'Pasahitza'},hidden:{title:'Ezkutuko Eremuaren Ezaugarriak',name:'Izena',value:'Balorea'},image:{title:'Irudi Ezaugarriak',titleButton:'Irudi Botoiaren Ezaugarriak',menu:'Irudi Ezaugarriak',infoTab:'Irudi informazioa',btnUpload:'Zerbitzarira bidalia',upload:'Gora Kargatu',alt:'Ordezko Testua',lockRatio:'Erlazioa Blokeatu',resetSize:'Tamaina Berrezarri',border:'Ertza',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Mesedez Irudiaren URLa idatzi',linkTab:'Esteka',button2Img:'Aukeratutako irudi botoia, irudi normal batean eraldatu nahi duzu?',img2Button:'Aukeratutako irudia, irudi botoi batean eraldatu nahi duzu?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Flasharen Ezaugarriak',propertiesTab:'Ezaugarriak',title:'Flasharen Ezaugarriak',chkPlay:'Automatikoki Erreproduzitu',chkLoop:'Begizta',chkMenu:'Flasharen Menua Gaitu',chkFull:'Onartu Pantaila osoa',scale:'Eskalatu',scaleAll:'Dena erakutsi',scaleNoBorder:'Ertzik gabe',scaleFit:'Doitu',access:'Scriptak baimendu',accessAlways:'Beti',accessSameDomain:'Domeinu berdinekoak',accessNever:'Inoiz ere ez',alignAbsBottom:'Abs Behean',alignAbsMiddle:'Abs Erdian',alignBaseline:'Oinan',alignTextTop:'Testua Goian',quality:'Kalitatea',qualityBest:'Hoberena',qualityHigh:'Altua',qualityAutoHigh:'Auto Altua',qualityMedium:'Ertaina',qualityAutoLow:'Auto Baxua',qualityLow:'Baxua',windowModeWindow:'Leihoa',windowModeOpaque:'Opakoa',windowModeTransparent:'Gardena',windowMode:'Leihoaren modua',flashvars:'Flash Aldagaiak',bgcolor:'Atzeko kolorea',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'Mesedez URL esteka idatzi',validateHSpace:'HSpace zenbaki bat izan behar da.',validateVSpace:'VSpace zenbaki bat izan behar da.'},spellCheck:{toolbar:'Ortografia',title:'Ortografia zuzenketa',notAvailable:'Barkatu baina momentu honetan zerbitzua ez dago erabilgarri.',errorLoading:'Errorea gertatu da aplikazioa zerbitzaritik kargatzean: %s.',notInDic:'Ez dago hiztegian',changeTo:'Honekin ordezkatu',btnIgnore:'Ezikusi',btnIgnoreAll:'Denak Ezikusi',btnReplace:'Ordezkatu',btnReplaceAll:'Denak Ordezkatu',btnUndo:'Desegin',noSuggestions:'- Iradokizunik ez -',progress:'Zuzenketa ortografikoa martxan...',noMispell:'Zuzenketa ortografikoa bukatuta: Akatsik ez',noChanges:'Zuzenketa ortografikoa bukatuta: Ez da ezer aldatu',oneChange:'Zuzenketa ortografikoa bukatuta: Hitz bat aldatu da',manyChanges:'Zuzenketa ortografikoa bukatuta: %1 hitz aldatu dira',ieSpellDownload:'Zuzentzaile ortografikoa ez dago instalatuta. Deskargatu nahi duzu?'},smiley:{toolbar:'Aurpegierak',title:'Aurpegiera Sartu',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 elementua'},numberedlist:'Zenbakidun Zerrenda',bulletedlist:'Buletdun Zerrenda',indent:'Handitu Koska',outdent:'Txikitu Koska',justify:{left:'Lerrokatu Ezkerrean',center:'Lerrokatu Erdian',right:'Lerrokatu Eskuman',block:'Justifikatu'},blockquote:'Aipamen blokea',clipboard:{title:'Itsatsi',cutError:'Zure web nabigatzailearen segurtasun ezarpenak testuak automatikoki moztea ez dute baimentzen. Mesedez teklatua erabili ezazu (Ctrl/Cmd+X).',copyError:'Zure web nabigatzailearen segurtasun ezarpenak testuak automatikoki kopiatzea ez dute baimentzen. Mesedez teklatua erabili ezazu (Ctrl/Cmd+C).',pasteMsg:'Mesedez teklatua erabilita (<STRONG>Ctrl/Cmd+V</STRONG>) ondorego eremuan testua itsatsi eta <STRONG>OK</STRONG> sakatu.',securityMsg:'Nabigatzailearen segurtasun ezarpenak direla eta, editoreak ezin du arbela zuzenean erabili. Leiho honetan berriro itsatsi behar duzu.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'Itsatsi nahi duzun testua Wordetik hartua dela dirudi. Itsatsi baino lehen garbitu nahi duzu?',toolbar:'Itsatsi Word-etik',title:'Itsatsi Word-etik',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Testu Arrunta bezala Itsatsi',title:'Testu Arrunta bezala Itsatsi'},templates:{button:'Txantiloiak',title:'Eduki Txantiloiak',options:'Template Options',insertOption:'Ordeztu oraingo edukiak',selectPromptMsg:'Mesedez txantiloia aukeratu editorean kargatzeko<br>(orain dauden edukiak galduko dira):',emptyListMsg:'(Ez dago definitutako txantiloirik)'},showBlocks:'Blokeak erakutsi',stylesCombo:{label:'Estiloa',panelTitle:'Formatting Styles',panelTitle1:'Bloke Estiloak',panelTitle2:'Inline Estiloak',panelTitle3:'Objektu Estiloak'},format:{label:'Formatua',panelTitle:'Formatua',tag_p:'Arrunta',tag_pre:'Formateatua',tag_address:'Helbidea',tag_h1:'Izenburua 1',tag_h2:'Izenburua 2',tag_h3:'Izenburua 3',tag_h4:'Izenburua 4',tag_h5:'Izenburua 5',tag_h6:'Izenburua 6',tag_div:'Paragrafoa (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Letra-tipoa',voiceLabel:'Letra-tipoa',panelTitle:'Letra-tipoa'},fontSize:{label:'Tamaina',voiceLabel:'Tamaina',panelTitle:'Tamaina'},colorButton:{textColorTitle:'Testu Kolorea',bgColorTitle:'Atzeko kolorea',panelTitle:'Colors',auto:'Automatikoa',more:'Kolore gehiago...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Ortografia Zuzenketa Idatzi Ahala (SCAYT)',opera_title:'Not supported by Opera',enable:'Gaitu SCAYT',disable:'Desgaitu SCAYT',about:'SCAYTi buruz',toggle:'SCAYT aldatu',options:'Aukerak',langs:'Hizkuntzak',moreSuggestions:'Iradokizun gehiago',ignore:'Baztertu',ignoreAll:'Denak baztertu',addWord:'Hitza Gehitu',emptyDic:'Hiztegiaren izena ezin da hutsik egon.',optionsTab:'Aukerak',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Hizkuntzak',dictionariesTab:'Hiztegiak',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'Honi buruz'},about:{title:'CKEditor(r)i buruz',dlgTitle:'CKEditor(r)i buruz',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'Lizentziari buruzko informazioa gure webgunean:',copy:'Copyright © $1. Eskubide guztiak erreserbaturik.'},maximize:'Maximizatu',minimize:'Minimize',fakeobjects:{anchor:'Aingura',flash:'Flash Animazioa',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Objektu ezezaguna'},resize:'Arrastatu tamaina aldatzeko',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Dokumentuaren Ezarpenak',title:'Dokumentuaren Ezarpenak',design:'Design',meta:'Meta Informazioa',chooseColor:'Choose',other:'<other>',docTitle:'Orriaren Izenburua',charset:'Karaktere Multzoaren Kodeketa',charsetOther:'Beste Karaktere Multzoko Kodeketa',charsetASCII:'ASCII',charsetCE:'Erdialdeko Europakoa',charsetCT:'Txinatar Tradizionala (Big5)',charsetCR:'Zirilikoa',charsetGR:'Grekoa',charsetJP:'Japoniarra',charsetKR:'Korearra',charsetTR:'Turkiarra',charsetUN:'Unicode (UTF-8)',charsetWE:'Mendebaldeko Europakoa',docType:'Document Type Goiburua',docTypeOther:'Beste Document Type Goiburua',xhtmlDec:'XHTML Ezarpenak',bgColor:'Atzeko Kolorea',bgImage:'Atzeko Irudiaren URL-a',bgFixed:'Korritze gabeko Atzealdea',txtColor:'Testu Kolorea',margin:'Orrialdearen marjinak',marginTop:'Goian',marginLeft:'Ezkerrean',marginRight:'Eskuman',marginBottom:'Behean',metaKeywords:'Dokumentuaren Gako-hitzak (komarekin bananduta)',metaDescription:'Dokumentuaren Deskribapena',metaAuthor:'Egilea',metaCopyright:'Copyright',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/fa.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/fa.js
index e20714d..df533c2 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/fa.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/fa.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.fa={dir:'rtl',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'نوار ابزار',editor:'ویرایشگر متن غنی',source:'منبع',newPage:'برگهٴ تازه',save:'ذخیره',preview:'پیشنمایش',cut:'برش',copy:'کپی',paste:'چسباندن',print:'چاپ',underline:'زیرخطدار',bold:'درشت',italic:'خمیده',selectAll:'گزینش همه',removeFormat:'برداشتن فرمت',strike:'میانخط',subscript:'زیرنویس',superscript:'بالانویس',horizontalrule:'گنجاندن خط افقی',pagebreak:'گنجاندن شکستگی پایان برگه',pagebreakAlt:'شکستن صفحه',unlink:'برداشتن پیوند',undo:'واچیدن',redo:'بازچیدن',common:{browseServer:'فهرستنمایی سرور',url:'URL',protocol:'پروتکل',upload:'انتقال به سرور',uploadSubmit:'به سرور بفرست',image:'تصویر',flash:'فلش',form:'فرم',checkbox:'خانهٴ گزینهای',radio:'دکمهٴ رادیویی',textField:'فیلد متنی',textarea:'ناحیهٴ متنی',hiddenField:'فیلد پنهان',button:'دکمه',select:'فیلد چندگزینهای',imageButton:'دکمهٴ تصویری',notSet:'<تعین نشده>',id:'شناسه',name:'نام',langDir:'جهتنمای زبان',langDirLtr:'چپ به راست (LTR)',langDirRtl:'راست به چپ (RTL)',langCode:'کد زبان',longDescr:'URL توصیف طولانی',cssClass:'کلاسهای شیوهنامه(Stylesheet)',advisoryTitle:'عنوان کمکی',cssStyle:'شیوه(style)',ok:'پذیرش',cancel:'انصراف',close:'بستن',preview:'پیشنمایش',generalTab:'عمومی',advancedTab:'پیشرفته',validateNumberFailed:'این مقدار یک عدد نیست.',confirmNewPage:'هر تغییر ایجاد شدهی ذخیره نشده از بین خواهد رفت. آیا اطمینان دارید که قصد بارگیری صفحه جدیدی را دارید؟',confirmCancel:'برخی از گزینهها تغییر کردهاند. آیا واقعا قصد بستن این پنجره را دارید؟',options:'گزینهها',target:'مسیر',targetNew:'پنجره جدید (_blank)',targetTop:'بالاترین پنجره (_top)',targetSelf:'همان پنجره (_self)',targetParent:'پنجره والد (_parent)',langDirLTR:'چپ به راست (LTR)',langDirRTL:'راست به چپ (RTL)',styles:'سبک',cssClasses:'کلاسهای شیوهنامه',width:'پهنا',height:'درازا',align:'چینش',alignLeft:'چپ',alignRight:'راست',alignCenter:'وسط',alignTop:'بالا',alignMiddle:'وسط',alignBottom:'پائین',invalidHeight:'ارتفاع باید یک عدد باشد.',invalidWidth:'پهنا باید یک عدد باشد.',invalidCssLength:'عدد تعیین شده برای فیلد "%1" باید یک عدد مثبت با یا بدون یک واحد اندازه گیری CSS معتبر باشد (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'عدد تعیین شده برای فیلد "%1" باید یک عدد مثبت با یا بدون یک واحد اندازه گیری HTML معتبر باشد (px or %).',invalidInlineStyle:'عدد تعیین شده برای سبک درونخطی(Inline Style) باید دارای یک یا چند چندتایی با شکلی شبیه "name : value" که باید با یک ","(semi-colons) از هم جدا شوند.',cssLengthTooltip:'یک عدد برای یک مقدار بر حسب پیکسل و یا یک عدد با یک واحد CSS معتبر وارد کنید (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">، غیر قابل دسترس</span>'},contextmenu:{options:'گزینههای منوی زمینه'},specialChar:{toolbar:'گنجاندن نویسهٴ ویژه',title:'گزینش نویسهٴ ویژه',options:'گزینههای نویسههای ویژه'},link:{toolbar:'گنجاندن/ویرایش پیوند',other:'<سایر>',menu:'ویرایش پیوند',title:'پیوند',info:'اطلاعات پیوند',target:'مقصد',upload:'انتقال به سرور',advanced:'پیشرفته',type:'نوع پیوند',toUrl:'URL',toAnchor:'لنگر در همین صفحه',toEmail:'پست الکترونیکی',targetFrame:'<فریم>',targetPopup:'<پنجرهٴ پاپاپ>',targetFrameName:'نام فریم مقصد',targetPopupName:'نام پنجرهٴ پاپاپ',popupFeatures:'ویژگیهای پنجرهٴ پاپاپ',popupResizable:'قابل تغییر اندازه',popupStatusBar:'نوار وضعیت',popupLocationBar:'نوار موقعیت',popupToolbar:'نوارابزار',popupMenuBar:'نوار منو',popupFullScreen:'تمامصفحه (IE)',popupScrollBars:'میلههای پیمایش',popupDependent:'وابسته (Netscape)',popupLeft:'موقعیت چپ',popupTop:'موقعیت بالا',id:'شناسه',langDir:'جهتنمای زبان',langDirLTR:'چپ به راست (LTR)',langDirRTL:'راست به چپ (RTL)',acccessKey:'کلید دستیابی',name:'نام',langCode:'جهتنمای زبان',tabIndex:'نمایهٴ دسترسی با برگه',advisoryTitle:'عنوان کمکی',advisoryContentType:'نوع محتوای کمکی',cssClasses:'کلاسهای شیوهنامه(Stylesheet)',charset:'نویسهگان منبع پیوند شده',styles:'شیوه(style)',rel:'وابستگی',selectAnchor:'یک لنگر برگزینید',anchorName:'با نام لنگر',anchorId:'با شناسهٴ المان',emailAddress:'نشانی پست الکترونیکی',emailSubject:'موضوع پیام',emailBody:'متن پیام',noAnchors:'(در این سند لنگری دردسترس نیست)',noUrl:'لطفا URL پیوند را بنویسید',noEmail:'لطفا نشانی پست الکترونیکی را بنویسید'},anchor:{toolbar:'گنجاندن/ویرایش لنگر',menu:'ویژگیهای لنگر',title:'ویژگیهای لنگر',name:'نام لنگر',errorName:'لطفا نام لنگر را بنویسید',remove:'حذف لنگر'},list:{numberedTitle:'ویژگیهای فهرست شمارهدار',bulletedTitle:'ویژگیهای فهرست گلولهدار',type:'نوع',start:'شروع',validateStartNumber:'فهرست شماره شروع باید یک عدد صحیح باشد.',circle:'دایره',disc:'صفحه گرد',square:'چهارگوش',none:'هیچ',notset:'<تنظیم نشده>',armenian:'شمارهگذاری ارمنی',georgian:'شمارهگذاری گریگورین (an, ban, gan, etc.)',lowerRoman:'پانویس رومی (i, ii, iii, iv, v, etc.)',upperRoman:'بالانویس رومی (I, II, III, IV, V, etc.)',lowerAlpha:'پانویس الفبایی (a, b, c, d, e, etc.)',upperAlpha:'بالانویس الفبایی (A, B, C, D, E, etc.)',lowerGreek:'پانویس یونانی (alpha, beta, gamma, etc.)',decimal:'دهدهی (1, 2, 3, etc.)',decimalLeadingZero:'دهدهی همراه با صفر (01, 02, 03, etc.)'},findAndReplace:{title:'جستجو و جایگزینی',find:'جستجو',replace:'جایگزینی',findWhat:'چه چیز را مییابید:',replaceWith:'جایگزینی با:',notFoundMsg:'متن موردنظر یافت نشد.',findOptions:'گزینههای جستجو',matchCase:'همسانی در بزرگی و کوچکی نویسهها',matchWord:'همسانی با واژهٴ کامل',matchCyclic:'همسانی با چرخه',replaceAll:'جایگزینی همهٴ یافتهها',replaceSuccessMsg:'%1 رخداد جایگزین شد.'},table:{toolbar:'جدول',title:'ویژگیهای جدول',menu:'ویژگیهای جدول',deleteTable:'پاک کردن جدول',rows:'سطرها',columns:'ستونها',border:'اندازهٴ لبه',widthPx:'پیکسل',widthPc:'درصد',widthUnit:'واحد پهنا',cellSpace:'فاصلهٴ میان سلولها',cellPad:'فاصلهٴ پرشده در سلول',caption:'عنوان',summary:'خلاصه',headers:'سرنویسها',headersNone:'هیچ',headersColumn:'اولین ستون',headersRow:'اولین ردیف',headersBoth:'هردو',invalidRows:'تعداد ردیفها باید یک عدد بزرگتر از 0 باشد.',invalidCols:'تعداد ستونها باید یک عدد بزرگتر از 0 باشد.',invalidBorder:'مقدار اندازه خطوط باید یک عدد باشد.',invalidWidth:'مقدار پهنای جدول باید یک عدد باشد.',invalidHeight:'مقدار ارتفاع جدول باید یک عدد باشد.',invalidCellSpacing:'مقدار فاصلهگذاری سلول باید یک عدد باشد.',invalidCellPadding:'بالشتک سلول باید یک عدد باشد.',cell:{menu:'سلول',insertBefore:'افزودن سلول قبل از',insertAfter:'افزودن سلول بعد از',deleteCell:'حذف سلولها',merge:'ادغام سلولها',mergeRight:'ادغام به راست',mergeDown:'ادغام به پایین',splitHorizontal:'جدا کردن افقی سلول',splitVertical:'جدا کردن عمودی سلول',title:'ویژگیهای سلول',cellType:'نوع سلول',rowSpan:'محدوده ردیفها',colSpan:'محدوده ستونها',wordWrap:'شکستن کلمه',hAlign:'چینش افقی',vAlign:'چینش عمودی',alignBaseline:'خط مبنا',bgColor:'رنگ زمینه',borderColor:'رنگ خطوط',data:'اطلاعات',header:'سرنویس',yes:'بله',no:'خیر',invalidWidth:'عرض سلول باید یک عدد باشد.',invalidHeight:'ارتفاع سلول باید عدد باشد.',invalidRowSpan:'مقدار محدوده ردیفها باید یک عدد باشد.',invalidColSpan:'مقدار محدوده ستونها باید یک عدد باشد.',chooseColor:'انتخاب'},row:{menu:'سطر',insertBefore:'افزودن سطر قبل از',insertAfter:'افزودن سطر بعد از',deleteRow:'حذف سطرها'},column:{menu:'ستون',insertBefore:'افزودن ستون قبل از',insertAfter:'افزودن ستون بعد از',deleteColumn:'حذف ستونها'}},button:{title:'ویژگیهای دکمه',text:'متن (مقدار)',type:'نوع',typeBtn:'دکمه',typeSbm:'ثبت',typeRst:'بازنشانی (Reset)'},checkboxAndRadio:{checkboxTitle:'ویژگیهای خانهٴ گزینهای',radioTitle:'ویژگیهای دکمهٴ رادیویی',value:'مقدار',selected:'برگزیده'},form:{title:'ویژگیهای فرم',menu:'ویژگیهای فرم',action:'رویداد',method:'متد',encoding:'رمزنگاری'},select:{title:'ویژگیهای فیلد چندگزینهای',selectInfo:'اطلاعات',opAvail:'گزینههای دردسترس',value:'مقدار',size:'اندازه',lines:'خطوط',chkMulti:'گزینش چندگانه فراهم باشد',opText:'متن',opValue:'مقدار',btnAdd:'افزودن',btnModify:'ویرایش',btnUp:'بالا',btnDown:'پائین',btnSetValue:'تنظیم به عنوان مقدار برگزیده',btnDelete:'پاککردن'},textarea:{title:'ویژگیهای ناحیهٴ متنی',cols:'ستونها',rows:'سطرها'},textfield:{title:'ویژگیهای فیلد متنی',name:'نام',value:'مقدار',charWidth:'پهنای نویسه',maxChars:'بیشینهٴ نویسهها',type:'نوع',typeText:'متن',typePass:'گذرواژه'},hidden:{title:'ویژگیهای فیلد پنهان',name:'نام',value:'مقدار'},image:{title:'ویژگیهای تصویر',titleButton:'ویژگیهای دکمهٴ تصویری',menu:'ویژگیهای تصویر',infoTab:'اطلاعات تصویر',btnUpload:'به سرور بفرست',upload:'انتقال به سرور',alt:'متن جایگزین',lockRatio:'قفل کردن نسبت',resetSize:'بازنشانی اندازه',border:'لبه',hSpace:'فاصلهٴ افقی',vSpace:'فاصلهٴ عمودی',alertUrl:'لطفا URL تصویر را بنویسید',linkTab:'پیوند',button2Img:'آیا مایلید از یک تصویر ساده روی دکمه تصویری انتخاب شده استفاده کنید؟',img2Button:'آیا مایلید از یک دکمه تصویری روی تصویر انتخاب شده استفاده کنید؟',urlMissing:'آدرس URL اصلی تصویر یافت نشد.',validateBorder:'مقدار خطوط باید یک عدد باشد.',validateHSpace:'مقدار فاصلهگذاری افقی باید یک عدد باشد.',validateVSpace:'مقدار فاصلهگذاری عمودی باید یک عدد باشد.'},flash:{properties:'ویژگیهای فلش',propertiesTab:'ویژگیها',title:'ویژگیهای فلش',chkPlay:'آغاز خودکار',chkLoop:'اجرای پیاپی',chkMenu:'در دسترس بودن منوی فلش',chkFull:'اجازه تمام صفحه',scale:'مقیاس',scaleAll:'نمایش همه',scaleNoBorder:'بدون کران',scaleFit:'جایگیری کامل',access:'دسترسی به اسکریپت',accessAlways:'همیشه',accessSameDomain:'همان دامنه',accessNever:'هرگز',alignAbsBottom:'پائین مطلق',alignAbsMiddle:'وسط مطلق',alignBaseline:'خط پایه',alignTextTop:'متن بالا',quality:'کیفیت',qualityBest:'بهترین',qualityHigh:'بالا',qualityAutoHigh:'بالا - خودکار',qualityMedium:'متوسط',qualityAutoLow:'پایین - خودکار',qualityLow:'پایین',windowModeWindow:'پنجره',windowModeOpaque:'مات',windowModeTransparent:'شفاف',windowMode:'حالت پنجره',flashvars:'مقادیر برای فلش',bgcolor:'رنگ پسزمینه',hSpace:'فاصلهٴ افقی',vSpace:'فاصلهٴ عمودی',validateSrc:'لطفا URL پیوند را بنویسید',validateHSpace:'مقدار فاصلهگذاری افقی باید یک عدد باشد.',validateVSpace:'مقدار فاصلهگذاری عمودی باید یک عدد باشد.'},spellCheck:{toolbar:'بررسی املا',title:'بررسی املا',notAvailable:'با عرض پوزش خدمات الان در دسترس نیستند.',errorLoading:'خطا در بارگیری برنامه خدمات میزبان: %s.',notInDic:'در واژه~نامه یافت نشد',changeTo:'تغییر به',btnIgnore:'چشمپوشی',btnIgnoreAll:'چشمپوشی همه',btnReplace:'جایگزینی',btnReplaceAll:'جایگزینی همه',btnUndo:'واچینش',noSuggestions:'- پیشنهادی نیست -',progress:'بررسی املا در حال انجام...',noMispell:'بررسی املا انجام شد. هیچ غلط املائی یافت نشد',noChanges:'بررسی املا انجام شد. هیچ واژهای تغییر نیافت',oneChange:'بررسی املا انجام شد. یک واژه تغییر یافت',manyChanges:'بررسی املا انجام شد. %1 واژه تغییر یافت',ieSpellDownload:'بررسی کنندهٴ املا نصب نشده است. آیا میخواهید آن را هماکنون دریافت کنید؟'},smiley:{toolbar:'خندانک',title:'گنجاندن خندانک',options:'گزینههای خندانک'},elementsPath:{eleLabel:'مسیر عناصر',eleTitle:'%1 عنصر'},numberedlist:'فهرست شمارهدار',bulletedlist:'فهرست نقطهای',indent:'افزایش تورفتگی',outdent:'کاهش تورفتگی',justify:{left:'چپچین',center:'میانچین',right:'راستچین',block:'بلوکچین'},blockquote:'بلوک نقل قول',clipboard:{title:'چسباندن',cutError:'تنظیمات امنیتی مرورگر شما اجازه نمیدهد که ویرایشگر به طور خودکار عملکردهای برش را انجام دهد. لطفا با دکمههای صفحه کلید این کار را انجام دهید (Ctrl/Cmd+X).',copyError:'تنظیمات امنیتی مرورگر شما اجازه نمیدهد که ویرایشگر به طور خودکار عملکردهای کپی کردن را انجام دهد. لطفا با دکمههای صفحه کلید این کار را انجام دهید (Ctrl/Cmd+C).',pasteMsg:'لطفا متن را با کلیدهای (<STRONG>Ctrl/Cmd+V</STRONG>) در این جعبهٴ متنی بچسبانید و <STRONG>پذیرش</STRONG> را بزنید.',securityMsg:'به خاطر تنظیمات امنیتی مرورگر شما، ویرایشگر نمیتواند دسترسی مستقیم به دادههای clipboard داشته باشد. شما باید دوباره آنرا در این پنجره بچسبانید.',pasteArea:'محل چسباندن'},pastefromword:{confirmCleanup:'متنی که میخواهید بچسبانید به نظر میرسد که از Word کپی شده است. آیا میخواهید قبل از چسباندن آن را پاکسازی کنید؟',toolbar:'چسباندن از Word',title:'چسباندن از Word',error:'به دلیل بروز خطای داخلی امکان پاکسازی اطلاعات بازنشانی شده وجود ندارد.'},pasteText:{button:'چسباندن به عنوان متن ِساده',title:'چسباندن به عنوان متن ِساده'},templates:{button:'الگوها',title:'الگوهای محتویات',options:'گزینههای الگو',insertOption:'محتویات کنونی جایگزین شوند',selectPromptMsg:'لطفا الگوی موردنظر را برای بازکردن در ویرایشگر برگزینید<br>(محتویات کنونی از دست خواهند رفت):',emptyListMsg:'(الگوئی تعریف نشده است)'},showBlocks:'نمایش بلوکها',stylesCombo:{label:'سبک',panelTitle:'سبکهای قالببندی',panelTitle1:'سبکهای بلوک',panelTitle2:'سبکهای درونخطی',panelTitle3:'سبکهای شیء'},format:{label:'فرمت',panelTitle:'فرمت',tag_p:'نرمال',tag_pre:'فرمت شده',tag_address:'آدرس',tag_h1:'سرنویس 1',tag_h2:'سرنویس 2',tag_h3:'سرنویس 3',tag_h4:'سرنویس 4',tag_h5:'سرنویس 5',tag_h6:'سرنویس 6',tag_div:'بند'},div:{title:'ایجاد یک محل DIV',toolbar:'ایجاد یک محل DIV',cssClassInputLabel:'کلاسهای شیوهنامه',styleSelectLabel:'سبک',IdInputLabel:'شناسه',languageCodeInputLabel:' کد زبان',inlineStyleInputLabel:'سبک درونخطی(Inline Style)',advisoryTitleInputLabel:'عنوان مشاوره',langDirLabel:'جهت نوشتاری زبان',langDirLTRLabel:'چپ به راست (LTR)',langDirRTLLabel:'راست به چپ (RTL)',edit:'ویرایش Div',remove:'حذف Div'},iframe:{title:'ویژگیهای IFrame',toolbar:'IFrame',noUrl:'لطفا مسیر URL iframe را درج کنید',scrolling:'نمایش خطکشها',border:'نمایش خطوط frame'},font:{label:'قلم',voiceLabel:'قلم',panelTitle:'قلم'},fontSize:{label:'اندازه',voiceLabel:'اندازه قلم',panelTitle:'اندازه'},colorButton:{textColorTitle:'رنگ متن',bgColorTitle:'رنگ پسزمینه',panelTitle:'رنگها',auto:'خودکار',more:'رنگهای بیشتر...'},colors:{'000':'سیاه',800000:'خرمایی','8B4513':'قهوهای شکلاتی','2F4F4F':'ارغوانی مایل به خاکستری','008080':'آبی مایل به خاکستری','000080':'آبی سیر','4B0082':'نیلی',696969:'خاکستری تیره',B22222:'آتش آجری',A52A2A:'قهوهای',DAA520:'میلهی طلایی','006400':'سبز تیره','40E0D0':'فیروزهای','0000CD':'آبی روشن',800080:'ارغوانی',808080:'خاکستری',F00:'قرمز',FF8C00:'نارنجی پررنگ',FFD700:'طلایی','008000':'سبز','0FF':'آبی مایل به سبز','00F':'آبی',EE82EE:'بنفش',A9A9A9:'خاکستری مات',FFA07A:'صورتی کدر روشن',FFA500:'نارنجی',FFFF00:'زرد','00FF00':'فسفری',AFEEEE:'فیروزهای رنگ پریده',ADD8E6:'آبی کمرنگ',DDA0DD:'آلویی',D3D3D3:'خاکستری روشن',FFF0F5:'بنفش کمرنگ',FAEBD7:'عتیقه سفید',FFFFE0:'زرد روشن',F0FFF0:'عسلی',F0FFFF:'لاجوردی',F0F8FF:'آبی براق',E6E6FA:'بنفش کمرنگ',FFF:'سفید'},scayt:{title:'بررسی املای تایپ شما',opera_title:'توسط اپرا پشتیبانی نمیشود',enable:'فعالسازی SCAYT',disable:'غیرفعالسازی SCAYT',about:'درباره SCAYT',toggle:'ضامن SCAYT',options:'گزینهها',langs:'زبانها',moreSuggestions:'پیشنهادهای بیشتر',ignore:'عبور کردن',ignoreAll:'عبور کردن از همه',addWord:'افزودن Word',emptyDic:'نام دیکشنری نباید خالی باشد.',optionsTab:'گزینهها',allCaps:'نادیده گرفتن همه کلاه-واژهها',ignoreDomainNames:'عبور از نامهای دامنه',mixedCase:'عبور از کلماتی مرکب از حروف بزرگ و کوچک',mixedWithDigits:'عبور از کلمات به همراه عدد',languagesTab:'زبانها',dictionariesTab:'دیکشنریها',dic_field_name:'نام دیکشنری',dic_create:'ایجاد',dic_restore:'بازیافت',dic_delete:'حذف',dic_rename:'تغییر نام',dic_info:'در ابتدا دیکشنری کاربر در کوکی ذخیره میشود. با این حال، کوکیها در اندازه محدود شدهاند. وقتی که دیکشنری کاربری بزرگ میشود و به نقطهای که نمیتواند در کوکی ذخیره شود، پس از آن دیکشنری ممکن است بر روی سرور ما ذخیره شود. برای ذخیره دیکشنری شخصی شما بر روی سرور ما، باید یک نام برای دیکشنری خود مشخص نمایید. اگر شما قبلا یک دیکشنری روی سرور ما ذخیره کردهاید، لطفا نام آنرا درج و روی دکمه بازیافت کلیک نمایید.',aboutTab:'درباره'},about:{title:'درباره CKEditor',dlgTitle:'درباره CKEditor',help:'بررسی $1 برای راهنمایی.',userGuide:'راهنمای کاربران CKEditor',moreInfo:'برای کسب اطلاعات مجوز لطفا به وب سایت ما مراجعه کنید:',copy:'حق نشر © $1. کلیه حقوق محفوظ است.'},maximize:'حداکثر کردن',minimize:'حداقل کردن',fakeobjects:{anchor:'لنگر',flash:'انیمشن فلش',iframe:'IFrame',hiddenfield:'فیلد پنهان',unknown:'شیء ناشناخته'},resize:'کشیدن برای تغییر اندازه',colordialog:{title:'انتخاب رنگ',options:'گزینههای رنگ',highlight:'متمایز',selected:'رنگ انتخاب شده',clear:'پاک کردن'},toolbarCollapse:'بستن نوار ابزار',toolbarExpand:'بازکردن نوار ابزار',toolbarGroups:{document:'سند',clipboard:'حافظه موقت/برگشت',editing:'در حال ویرایش',forms:'فرمها',basicstyles:'شیوههای پایه',paragraph:'بند',links:'پیوندها',insert:'ورود',styles:'شیوهها',colors:'رنگها',tools:'ابزارها'},bidi:{ltr:'نوشتار متن از چپ به راست',rtl:'نوشتار متن از راست به چپ'},docprops:{label:'ویژگیهای سند',title:'ویژگیهای سند',design:'طراحی',meta:'فراداده',chooseColor:'انتخاب',other:'<سایر>',docTitle:'عنوان صفحه',charset:'رمزگذاری نویسهگان',charsetOther:'رمزگذاری نویسهگان دیگر',charsetASCII:'ASCII',charsetCE:'اروپای مرکزی',charsetCT:'چینی رسمی (Big5)',charsetCR:'سیریلیک',charsetGR:'یونانی',charsetJP:'ژاپنی',charsetKR:'کرهای',charsetTR:'ترکی',charsetUN:'یونیکُد (UTF-8)',charsetWE:'اروپای غربی',docType:'عنوان نوع سند',docTypeOther:'عنوان نوع سند دیگر',xhtmlDec:'شامل تعاریف XHTML',bgColor:'رنگ پسزمینه',bgImage:'URL تصویر پسزمینه',bgFixed:'پسزمینهٴ پیمایش ناپذیر',txtColor:'رنگ متن',margin:'حاشیههای صفحه',marginTop:'بالا',marginLeft:'چپ',marginRight:'راست',marginBottom:'پایین',metaKeywords:'کلیدواژگان نمایهگذاری سند (با کاما جدا شوند)',metaDescription:'توصیف سند',metaAuthor:'نویسنده',metaCopyright:'حق انتشار',previewHtml:'<p>این یک <strong>متن نمونه</strong> است. شما در حال استفاده از <a href="javascript:void(0)">CKEditor</a> هستید.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.fa={dir:'rtl',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'نوار ابزار',editor:'ویرایشگر متن غنی',source:'منبع',newPage:'برگهٴ تازه',save:'ذخیره',preview:'پیشنمایش',cut:'برش',copy:'کپی',paste:'چسباندن',print:'چاپ',underline:'زیرخطدار',bold:'درشت',italic:'خمیده',selectAll:'گزینش همه',removeFormat:'برداشتن فرمت',strike:'میانخط',subscript:'زیرنویس',superscript:'بالانویس',horizontalrule:'گنجاندن خط افقی',pagebreak:'گنجاندن شکستگی پایان برگه',pagebreakAlt:'شکستن صفحه',unlink:'برداشتن پیوند',undo:'واچیدن',redo:'بازچیدن',common:{browseServer:'فهرستنمایی سرور',url:'URL',protocol:'پروتکل',upload:'انتقال به سرور',uploadSubmit:'به سرور بفرست',image:'تصویر',flash:'فلش',form:'فرم',checkbox:'خانهٴ گزینهای',radio:'دکمهٴ رادیویی',textField:'فیلد متنی',textarea:'ناحیهٴ متنی',hiddenField:'فیلد پنهان',button:'دکمه',select:'فیلد چندگزینهای',imageButton:'دکمهٴ تصویری',notSet:'<تعین نشده>',id:'شناسه',name:'نام',langDir:'جهتنمای زبان',langDirLtr:'چپ به راست (LTR)',langDirRtl:'راست به چپ (RTL)',langCode:'کد زبان',longDescr:'URL توصیف طولانی',cssClass:'کلاسهای شیوهنامه(Stylesheet)',advisoryTitle:'عنوان کمکی',cssStyle:'شیوه(style)',ok:'پذیرش',cancel:'انصراف',close:'بستن',preview:'پیشنمایش',generalTab:'عمومی',advancedTab:'پیشرفته',validateNumberFailed:'این مقدار یک عدد نیست.',confirmNewPage:'هر تغییر ایجاد شدهی ذخیره نشده از بین خواهد رفت. آیا اطمینان دارید که قصد بارگیری صفحه جدیدی را دارید؟',confirmCancel:'برخی از گزینهها تغییر کردهاند. آیا واقعا قصد بستن این پنجره را دارید؟',options:'گزینهها',target:'مسیر',targetNew:'پنجره جدید (_blank)',targetTop:'بالاترین پنجره (_top)',targetSelf:'همان پنجره (_self)',targetParent:'پنجره والد (_parent)',langDirLTR:'چپ به راست (LTR)',langDirRTL:'راست به چپ (RTL)',styles:'سبک',cssClasses:'کلاسهای شیوهنامه',width:'پهنا',height:'درازا',align:'چینش',alignLeft:'چپ',alignRight:'راست',alignCenter:'وسط',alignTop:'بالا',alignMiddle:'وسط',alignBottom:'پائین',invalidHeight:'ارتفاع باید یک عدد باشد.',invalidWidth:'پهنا باید یک عدد باشد.',invalidCssLength:'عدد تعیین شده برای فیلد "%1" باید یک عدد مثبت با یا بدون یک واحد اندازه گیری CSS معتبر باشد (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'عدد تعیین شده برای فیلد "%1" باید یک عدد مثبت با یا بدون یک واحد اندازه گیری HTML معتبر باشد (px or %).',invalidInlineStyle:'عدد تعیین شده برای سبک درونخطی(Inline Style) باید دارای یک یا چند چندتایی با شکلی شبیه "name : value" که باید با یک ","(semi-colons) از هم جدا شوند.',cssLengthTooltip:'یک عدد برای یک مقدار بر حسب پیکسل و یا یک عدد با یک واحد CSS معتبر وارد کنید (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">، غیر قابل دسترس</span>'},contextmenu:{options:'گزینههای منوی زمینه'},specialChar:{toolbar:'گنجاندن نویسهٴ ویژه',title:'گزینش نویسهٴ ویژه',options:'گزینههای نویسههای ویژه'},link:{toolbar:'گنجاندن/ویرایش پیوند',other:'<سایر>',menu:'ویرایش پیوند',title:'پیوند',info:'اطلاعات پیوند',target:'مقصد',upload:'انتقال به سرور',advanced:'پیشرفته',type:'نوع پیوند',toUrl:'URL',toAnchor:'لنگر در همین صفحه',toEmail:'پست الکترونیکی',targetFrame:'<فریم>',targetPopup:'<پنجرهٴ پاپاپ>',targetFrameName:'نام فریم مقصد',targetPopupName:'نام پنجرهٴ پاپاپ',popupFeatures:'ویژگیهای پنجرهٴ پاپاپ',popupResizable:'قابل تغییر اندازه',popupStatusBar:'نوار وضعیت',popupLocationBar:'نوار موقعیت',popupToolbar:'نوارابزار',popupMenuBar:'نوار منو',popupFullScreen:'تمامصفحه (IE)',popupScrollBars:'میلههای پیمایش',popupDependent:'وابسته (Netscape)',popupLeft:'موقعیت چپ',popupTop:'موقعیت بالا',id:'شناسه',langDir:'جهتنمای زبان',langDirLTR:'چپ به راست (LTR)',langDirRTL:'راست به چپ (RTL)',acccessKey:'کلید دستیابی',name:'نام',langCode:'جهتنمای زبان',tabIndex:'نمایهٴ دسترسی با برگه',advisoryTitle:'عنوان کمکی',advisoryContentType:'نوع محتوای کمکی',cssClasses:'کلاسهای شیوهنامه(Stylesheet)',charset:'نویسهگان منبع پیوند شده',styles:'شیوه(style)',rel:'وابستگی',selectAnchor:'یک لنگر برگزینید',anchorName:'با نام لنگر',anchorId:'با شناسهٴ المان',emailAddress:'نشانی پست الکترونیکی',emailSubject:'موضوع پیام',emailBody:'متن پیام',noAnchors:'(در این سند لنگری دردسترس نیست)',noUrl:'لطفا URL پیوند را بنویسید',noEmail:'لطفا نشانی پست الکترونیکی را بنویسید'},anchor:{toolbar:'گنجاندن/ویرایش لنگر',menu:'ویژگیهای لنگر',title:'ویژگیهای لنگر',name:'نام لنگر',errorName:'لطفا نام لنگر را بنویسید',remove:'حذف لنگر'},list:{numberedTitle:'ویژگیهای فهرست شمارهدار',bulletedTitle:'ویژگیهای فهرست گلولهدار',type:'نوع',start:'شروع',validateStartNumber:'فهرست شماره شروع باید یک عدد صحیح باشد.',circle:'دایره',disc:'صفحه گرد',square:'چهارگوش',none:'هیچ',notset:'<تنظیم نشده>',armenian:'شمارهگذاری ارمنی',georgian:'شمارهگذاری گریگورین (an, ban, gan, etc.)',lowerRoman:'پانویس رومی (i, ii, iii, iv, v, etc.)',upperRoman:'بالانویس رومی (I, II, III, IV, V, etc.)',lowerAlpha:'پانویس الفبایی (a, b, c, d, e, etc.)',upperAlpha:'بالانویس الفبایی (A, B, C, D, E, etc.)',lowerGreek:'پانویس یونانی (alpha, beta, gamma, etc.)',decimal:'دهدهی (1, 2, 3, etc.)',decimalLeadingZero:'دهدهی همراه با صفر (01, 02, 03, etc.)'},findAndReplace:{title:'جستجو و جایگزینی',find:'جستجو',replace:'جایگزینی',findWhat:'چه چیز را مییابید:',replaceWith:'جایگزینی با:',notFoundMsg:'متن موردنظر یافت نشد.',findOptions:'گزینههای جستجو',matchCase:'همسانی در بزرگی و کوچکی نویسهها',matchWord:'همسانی با واژهٴ کامل',matchCyclic:'همسانی با چرخه',replaceAll:'جایگزینی همهٴ یافتهها',replaceSuccessMsg:'%1 رخداد جایگزین شد.'},table:{toolbar:'جدول',title:'ویژگیهای جدول',menu:'ویژگیهای جدول',deleteTable:'پاک کردن جدول',rows:'سطرها',columns:'ستونها',border:'اندازهٴ لبه',widthPx:'پیکسل',widthPc:'درصد',widthUnit:'واحد پهنا',cellSpace:'فاصلهٴ میان سلولها',cellPad:'فاصلهٴ پرشده در سلول',caption:'عنوان',summary:'خلاصه',headers:'سرنویسها',headersNone:'هیچ',headersColumn:'اولین ستون',headersRow:'اولین ردیف',headersBoth:'هردو',invalidRows:'تعداد ردیفها باید یک عدد بزرگتر از 0 باشد.',invalidCols:'تعداد ستونها باید یک عدد بزرگتر از 0 باشد.',invalidBorder:'مقدار اندازه خطوط باید یک عدد باشد.',invalidWidth:'مقدار پهنای جدول باید یک عدد باشد.',invalidHeight:'مقدار ارتفاع جدول باید یک عدد باشد.',invalidCellSpacing:'مقدار فاصلهگذاری سلول باید یک عدد باشد.',invalidCellPadding:'بالشتک سلول باید یک عدد باشد.',cell:{menu:'سلول',insertBefore:'افزودن سلول قبل از',insertAfter:'افزودن سلول بعد از',deleteCell:'حذف سلولها',merge:'ادغام سلولها',mergeRight:'ادغام به راست',mergeDown:'ادغام به پایین',splitHorizontal:'جدا کردن افقی سلول',splitVertical:'جدا کردن عمودی سلول',title:'ویژگیهای سلول',cellType:'نوع سلول',rowSpan:'محدوده ردیفها',colSpan:'محدوده ستونها',wordWrap:'شکستن کلمه',hAlign:'چینش افقی',vAlign:'چینش عمودی',alignBaseline:'خط مبنا',bgColor:'رنگ زمینه',borderColor:'رنگ خطوط',data:'اطلاعات',header:'سرنویس',yes:'بله',no:'خیر',invalidWidth:'عرض سلول باید یک عدد باشد.',invalidHeight:'ارتفاع سلول باید عدد باشد.',invalidRowSpan:'مقدار محدوده ردیفها باید یک عدد باشد.',invalidColSpan:'مقدار محدوده ستونها باید یک عدد باشد.',chooseColor:'انتخاب'},row:{menu:'سطر',insertBefore:'افزودن سطر قبل از',insertAfter:'افزودن سطر بعد از',deleteRow:'حذف سطرها'},column:{menu:'ستون',insertBefore:'افزودن ستون قبل از',insertAfter:'افزودن ستون بعد از',deleteColumn:'حذف ستونها'}},button:{title:'ویژگیهای دکمه',text:'متن (مقدار)',type:'نوع',typeBtn:'دکمه',typeSbm:'ثبت',typeRst:'بازنشانی (Reset)'},checkboxAndRadio:{checkboxTitle:'ویژگیهای خانهٴ گزینهای',radioTitle:'ویژگیهای دکمهٴ رادیویی',value:'مقدار',selected:'برگزیده'},form:{title:'ویژگیهای فرم',menu:'ویژگیهای فرم',action:'رویداد',method:'متد',encoding:'رمزنگاری'},select:{title:'ویژگیهای فیلد چندگزینهای',selectInfo:'اطلاعات',opAvail:'گزینههای دردسترس',value:'مقدار',size:'اندازه',lines:'خطوط',chkMulti:'گزینش چندگانه فراهم باشد',opText:'متن',opValue:'مقدار',btnAdd:'افزودن',btnModify:'ویرایش',btnUp:'بالا',btnDown:'پائین',btnSetValue:'تنظیم به عنوان مقدار برگزیده',btnDelete:'پاککردن'},textarea:{title:'ویژگیهای ناحیهٴ متنی',cols:'ستونها',rows:'سطرها'},textfield:{title:'ویژگیهای فیلد متنی',name:'نام',value:'مقدار',charWidth:'پهنای نویسه',maxChars:'بیشینهٴ نویسهها',type:'نوع',typeText:'متن',typePass:'گذرواژه'},hidden:{title:'ویژگیهای فیلد پنهان',name:'نام',value:'مقدار'},image:{title:'ویژگیهای تصویر',titleButton:'ویژگیهای دکمهٴ تصویری',menu:'ویژگیهای تصویر',infoTab:'اطلاعات تصویر',btnUpload:'به سرور بفرست',upload:'انتقال به سرور',alt:'متن جایگزین',lockRatio:'قفل کردن نسبت',resetSize:'بازنشانی اندازه',border:'لبه',hSpace:'فاصلهٴ افقی',vSpace:'فاصلهٴ عمودی',alertUrl:'لطفا URL تصویر را بنویسید',linkTab:'پیوند',button2Img:'آیا مایلید از یک تصویر ساده روی دکمه تصویری انتخاب شده استفاده کنید؟',img2Button:'آیا مایلید از یک دکمه تصویری روی تصویر انتخاب شده استفاده کنید؟',urlMissing:'آدرس URL اصلی تصویر یافت نشد.',validateBorder:'مقدار خطوط باید یک عدد باشد.',validateHSpace:'مقدار فاصلهگذاری افقی باید یک عدد باشد.',validateVSpace:'مقدار فاصلهگذاری عمودی باید یک عدد باشد.'},flash:{properties:'ویژگیهای فلش',propertiesTab:'ویژگیها',title:'ویژگیهای فلش',chkPlay:'آغاز خودکار',chkLoop:'اجرای پیاپی',chkMenu:'در دسترس بودن منوی فلش',chkFull:'اجازه تمام صفحه',scale:'مقیاس',scaleAll:'نمایش همه',scaleNoBorder:'بدون کران',scaleFit:'جایگیری کامل',access:'دسترسی به اسکریپت',accessAlways:'همیشه',accessSameDomain:'همان دامنه',accessNever:'هرگز',alignAbsBottom:'پائین مطلق',alignAbsMiddle:'وسط مطلق',alignBaseline:'خط پایه',alignTextTop:'متن بالا',quality:'کیفیت',qualityBest:'بهترین',qualityHigh:'بالا',qualityAutoHigh:'بالا - خودکار',qualityMedium:'متوسط',qualityAutoLow:'پایین - خودکار',qualityLow:'پایین',windowModeWindow:'پنجره',windowModeOpaque:'مات',windowModeTransparent:'شفاف',windowMode:'حالت پنجره',flashvars:'مقادیر برای فلش',bgcolor:'رنگ پسزمینه',hSpace:'فاصلهٴ افقی',vSpace:'فاصلهٴ عمودی',validateSrc:'لطفا URL پیوند را بنویسید',validateHSpace:'مقدار فاصلهگذاری افقی باید یک عدد باشد.',validateVSpace:'مقدار فاصلهگذاری عمودی باید یک عدد باشد.'},spellCheck:{toolbar:'بررسی املا',title:'بررسی املا',notAvailable:'با عرض پوزش خدمات الان در دسترس نیستند.',errorLoading:'خطا در بارگیری برنامه خدمات میزبان: %s.',notInDic:'در واژه~نامه یافت نشد',changeTo:'تغییر به',btnIgnore:'چشمپوشی',btnIgnoreAll:'چشمپوشی همه',btnReplace:'جایگزینی',btnReplaceAll:'جایگزینی همه',btnUndo:'واچینش',noSuggestions:'- پیشنهادی نیست -',progress:'بررسی املا در حال انجام...',noMispell:'بررسی املا انجام شد. هیچ غلط املائی یافت نشد',noChanges:'بررسی املا انجام شد. هیچ واژهای تغییر نیافت',oneChange:'بررسی املا انجام شد. یک واژه تغییر یافت',manyChanges:'بررسی املا انجام شد. %1 واژه تغییر یافت',ieSpellDownload:'بررسی کنندهٴ املا نصب نشده است. آیا میخواهید آن را هماکنون دریافت کنید؟'},smiley:{toolbar:'خندانک',title:'گنجاندن خندانک',options:'گزینههای خندانک'},elementsPath:{eleLabel:'مسیر عناصر',eleTitle:'%1 عنصر'},numberedlist:'فهرست شمارهدار',bulletedlist:'فهرست نقطهای',indent:'افزایش تورفتگی',outdent:'کاهش تورفتگی',justify:{left:'چپچین',center:'میانچین',right:'راستچین',block:'بلوکچین'},blockquote:'بلوک نقل قول',clipboard:{title:'چسباندن',cutError:'تنظیمات امنیتی مرورگر شما اجازه نمیدهد که ویرایشگر به طور خودکار عملکردهای برش را انجام دهد. لطفا با دکمههای صفحه کلید این کار را انجام دهید (Ctrl/Cmd+X).',copyError:'تنظیمات امنیتی مرورگر شما اجازه نمیدهد که ویرایشگر به طور خودکار عملکردهای کپی کردن را انجام دهد. لطفا با دکمههای صفحه کلید این کار را انجام دهید (Ctrl/Cmd+C).',pasteMsg:'لطفا متن را با کلیدهای (<STRONG>Ctrl/Cmd+V</STRONG>) در این جعبهٴ متنی بچسبانید و <STRONG>پذیرش</STRONG> را بزنید.',securityMsg:'به خاطر تنظیمات امنیتی مرورگر شما، ویرایشگر نمیتواند دسترسی مستقیم به دادههای clipboard داشته باشد. شما باید دوباره آنرا در این پنجره بچسبانید.',pasteArea:'محل چسباندن'},pastefromword:{confirmCleanup:'متنی که میخواهید بچسبانید به نظر میرسد که از Word کپی شده است. آیا میخواهید قبل از چسباندن آن را پاکسازی کنید؟',toolbar:'چسباندن از Word',title:'چسباندن از Word',error:'به دلیل بروز خطای داخلی امکان پاکسازی اطلاعات بازنشانی شده وجود ندارد.'},pasteText:{button:'چسباندن به عنوان متن ِساده',title:'چسباندن به عنوان متن ِساده'},templates:{button:'الگوها',title:'الگوهای محتویات',options:'گزینههای الگو',insertOption:'محتویات کنونی جایگزین شوند',selectPromptMsg:'لطفا الگوی موردنظر را برای بازکردن در ویرایشگر برگزینید<br>(محتویات کنونی از دست خواهند رفت):',emptyListMsg:'(الگوئی تعریف نشده است)'},showBlocks:'نمایش بلوکها',stylesCombo:{label:'سبک',panelTitle:'سبکهای قالببندی',panelTitle1:'سبکهای بلوک',panelTitle2:'سبکهای درونخطی',panelTitle3:'سبکهای شیء'},format:{label:'فرمت',panelTitle:'فرمت',tag_p:'نرمال',tag_pre:'فرمت شده',tag_address:'آدرس',tag_h1:'سرنویس 1',tag_h2:'سرنویس 2',tag_h3:'سرنویس 3',tag_h4:'سرنویس 4',tag_h5:'سرنویس 5',tag_h6:'سرنویس 6',tag_div:'بند'},div:{title:'ایجاد یک محل DIV',toolbar:'ایجاد یک محل DIV',cssClassInputLabel:'کلاسهای شیوهنامه',styleSelectLabel:'سبک',IdInputLabel:'شناسه',languageCodeInputLabel:' کد زبان',inlineStyleInputLabel:'سبک درونخطی(Inline Style)',advisoryTitleInputLabel:'عنوان مشاوره',langDirLabel:'جهت نوشتاری زبان',langDirLTRLabel:'چپ به راست (LTR)',langDirRTLLabel:'راست به چپ (RTL)',edit:'ویرایش Div',remove:'حذف Div'},iframe:{title:'ویژگیهای IFrame',toolbar:'IFrame',noUrl:'لطفا مسیر URL iframe را درج کنید',scrolling:'نمایش خطکشها',border:'نمایش خطوط frame'},font:{label:'قلم',voiceLabel:'قلم',panelTitle:'قلم'},fontSize:{label:'اندازه',voiceLabel:'اندازه قلم',panelTitle:'اندازه'},colorButton:{textColorTitle:'رنگ متن',bgColorTitle:'رنگ پسزمینه',panelTitle:'رنگها',auto:'خودکار',more:'رنگهای بیشتر...'},colors:{'000':'سیاه',800000:'خرمایی','8B4513':'قهوهای شکلاتی','2F4F4F':'ارغوانی مایل به خاکستری','008080':'آبی مایل به خاکستری','000080':'آبی سیر','4B0082':'نیلی',696969:'خاکستری تیره',B22222:'آتش آجری',A52A2A:'قهوهای',DAA520:'میلهی طلایی','006400':'سبز تیره','40E0D0':'فیروزهای','0000CD':'آبی روشن',800080:'ارغوانی',808080:'خاکستری',F00:'قرمز',FF8C00:'نارنجی پررنگ',FFD700:'طلایی','008000':'سبز','0FF':'آبی مایل به سبز','00F':'آبی',EE82EE:'بنفش',A9A9A9:'خاکستری مات',FFA07A:'صورتی کدر روشن',FFA500:'نارنجی',FFFF00:'زرد','00FF00':'فسفری',AFEEEE:'فیروزهای رنگ پریده',ADD8E6:'آبی کمرنگ',DDA0DD:'آلویی',D3D3D3:'خاکستری روشن',FFF0F5:'بنفش کمرنگ',FAEBD7:'عتیقه سفید',FFFFE0:'زرد روشن',F0FFF0:'عسلی',F0FFFF:'لاجوردی',F0F8FF:'آبی براق',E6E6FA:'بنفش کمرنگ',FFF:'سفید'},scayt:{title:'بررسی املای تایپ شما',opera_title:'توسط اپرا پشتیبانی نمیشود',enable:'فعالسازی SCAYT',disable:'غیرفعالسازی SCAYT',about:'درباره SCAYT',toggle:'ضامن SCAYT',options:'گزینهها',langs:'زبانها',moreSuggestions:'پیشنهادهای بیشتر',ignore:'عبور کردن',ignoreAll:'عبور کردن از همه',addWord:'افزودن Word',emptyDic:'نام دیکشنری نباید خالی باشد.',optionsTab:'گزینهها',allCaps:'نادیده گرفتن همه کلاه-واژهها',ignoreDomainNames:'عبور از نامهای دامنه',mixedCase:'عبور از کلماتی مرکب از حروف بزرگ و کوچک',mixedWithDigits:'عبور از کلمات به همراه عدد',languagesTab:'زبانها',dictionariesTab:'دیکشنریها',dic_field_name:'نام دیکشنری',dic_create:'ایجاد',dic_restore:'بازیافت',dic_delete:'حذف',dic_rename:'تغییر نام',dic_info:'در ابتدا دیکشنری کاربر در کوکی ذخیره میشود. با این حال، کوکیها در اندازه محدود شدهاند. وقتی که دیکشنری کاربری بزرگ میشود و به نقطهای که نمیتواند در کوکی ذخیره شود، پس از آن دیکشنری ممکن است بر روی سرور ما ذخیره شود. برای ذخیره دیکشنری شخصی شما بر روی سرور ما، باید یک نام برای دیکشنری خود مشخص نمایید. اگر شما قبلا یک دیکشنری روی سرور ما ذخیره کردهاید، لطفا نام آنرا درج و روی دکمه بازیافت کلیک نمایید.',aboutTab:'درباره'},about:{title:'درباره CKEditor',dlgTitle:'درباره CKEditor',help:'بررسی $1 برای راهنمایی.',userGuide:'راهنمای کاربران CKEditor',moreInfo:'برای کسب اطلاعات مجوز لطفا به وب سایت ما مراجعه کنید:',copy:'حق نشر © $1. کلیه حقوق محفوظ است.'},maximize:'حداکثر کردن',minimize:'حداقل کردن',fakeobjects:{anchor:'لنگر',flash:'انیمشن فلش',iframe:'IFrame',hiddenfield:'فیلد پنهان',unknown:'شیء ناشناخته'},resize:'کشیدن برای تغییر اندازه',colordialog:{title:'انتخاب رنگ',options:'گزینههای رنگ',highlight:'متمایز',selected:'رنگ انتخاب شده',clear:'پاک کردن'},toolbarCollapse:'بستن نوار ابزار',toolbarExpand:'بازکردن نوار ابزار',toolbarGroups:{document:'سند',clipboard:'حافظه موقت/برگشت',editing:'در حال ویرایش',forms:'فرمها',basicstyles:'شیوههای پایه',paragraph:'بند',links:'پیوندها',insert:'ورود',styles:'شیوهها',colors:'رنگها',tools:'ابزارها'},bidi:{ltr:'نوشتار متن از چپ به راست',rtl:'نوشتار متن از راست به چپ'},docprops:{label:'ویژگیهای سند',title:'ویژگیهای سند',design:'طراحی',meta:'فراداده',chooseColor:'انتخاب',other:'<سایر>',docTitle:'عنوان صفحه',charset:'رمزگذاری نویسهگان',charsetOther:'رمزگذاری نویسهگان دیگر',charsetASCII:'ASCII',charsetCE:'اروپای مرکزی',charsetCT:'چینی رسمی (Big5)',charsetCR:'سیریلیک',charsetGR:'یونانی',charsetJP:'ژاپنی',charsetKR:'کرهای',charsetTR:'ترکی',charsetUN:'یونیکُد (UTF-8)',charsetWE:'اروپای غربی',docType:'عنوان نوع سند',docTypeOther:'عنوان نوع سند دیگر',xhtmlDec:'شامل تعاریف XHTML',bgColor:'رنگ پسزمینه',bgImage:'URL تصویر پسزمینه',bgFixed:'پسزمینهٴ پیمایش ناپذیر',txtColor:'رنگ متن',margin:'حاشیههای صفحه',marginTop:'بالا',marginLeft:'چپ',marginRight:'راست',marginBottom:'پایین',metaKeywords:'کلیدواژگان نمایهگذاری سند (با کاما جدا شوند)',metaDescription:'توصیف سند',metaAuthor:'نویسنده',metaCopyright:'حق انتشار',previewHtml:'<p>این یک <strong>متن نمونه</strong> است. شما در حال استفاده از <a href="javascript:void(0)">CKEditor</a> هستید.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/fi.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/fi.js
index 12cc26d..e0f741c 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/fi.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/fi.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.fi={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editorin työkalupalkit',editor:'Rikastekstieditori',source:'Koodi',newPage:'Tyhjennä',save:'Tallenna',preview:'Esikatsele',cut:'Leikkaa',copy:'Kopioi',paste:'Liitä',print:'Tulosta',underline:'Alleviivattu',bold:'Lihavoitu',italic:'Kursivoitu',selectAll:'Valitse kaikki',removeFormat:'Poista muotoilu',strike:'Yliviivattu',subscript:'Alaindeksi',superscript:'Yläindeksi',horizontalrule:'Lisää murtoviiva',pagebreak:'Lisää sivunvaihto',pagebreakAlt:'Sivunvaihto',unlink:'Poista linkki',undo:'Kumoa',redo:'Toista',common:{browseServer:'Selaa palvelinta',url:'Osoite',protocol:'Protokolla',upload:'Lisää tiedosto',uploadSubmit:'Lähetä palvelimelle',image:'Kuva',flash:'Flash-animaatio',form:'Lomake',checkbox:'Valintaruutu',radio:'Radiopainike',textField:'Tekstikenttä',textarea:'Tekstilaatikko',hiddenField:'Piilokenttä',button:'Painike',select:'Valintakenttä',imageButton:'Kuvapainike',notSet:'<ei asetettu>',id:'Tunniste',name:'Nimi',langDir:'Kielen suunta',langDirLtr:'Vasemmalta oikealle (LTR)',langDirRtl:'Oikealta vasemmalle (RTL)',langCode:'Kielikoodi',longDescr:'Pitkän kuvauksen URL',cssClass:'Tyyliluokat',advisoryTitle:'Avustava otsikko',cssStyle:'Tyyli',ok:'OK',cancel:'Peruuta',close:'Sulje',preview:'Esikatselu',generalTab:'Yleinen',advancedTab:'Lisäominaisuudet',validateNumberFailed:'Arvon pitää olla numero.',confirmNewPage:'Kaikki tallentamattomat muutokset tähän sisältöön menetetään. Oletko varma, että haluat ladata uuden sivun?',confirmCancel:'Jotkut asetuksista on muuttuneet. Oletko varma, että haluat sulkea valintaikkunan?',options:'Asetukset',target:'Kohde',targetNew:'Uusi ikkuna (_blank)',targetTop:'Päällimmäinen ikkuna (_top)',targetSelf:'Sama ikkuna (_self)',targetParent:'Ylemmän tason ikkuna (_parent)',langDirLTR:'Vasemmalta oikealle (LTR)',langDirRTL:'Oikealta vasemmalle (RTL)',styles:'Tyyli',cssClasses:'Tyylitiedoston luokat',width:'Leveys',height:'Korkeus',align:'Kohdistus',alignLeft:'Vasemmalle',alignRight:'Oikealle',alignCenter:'Keskelle',alignTop:'Ylös',alignMiddle:'Keskelle',alignBottom:'Alas',invalidHeight:'Korkeuden täytyy olla numero.',invalidWidth:'Leveyden täytyy olla numero.',invalidCssLength:'Kentän "%1" arvon täytyy olla positiivinen luku CSS mittayksikön (px, %, in, cm, mm, em, ex, pt tai pc) kanssa tai ilman.',invalidHtmlLength:'Kentän "%1" arvon täytyy olla positiivinen luku HTML mittayksikön (px tai %) kanssa tai ilman.',invalidInlineStyle:'Tyylille annetun arvon täytyy koostua yhdestä tai useammasta "nimi : arvo" parista, jotka ovat eroteltuna toisistaan puolipisteillä.',cssLengthTooltip:'Anna numeroarvo pikseleinä tai numeroarvo CSS mittayksikön kanssa (px, %, in, cm, mm, em, ex, pt, tai pc).',unavailable:'%1<span class="cke_accessibility">, ei saatavissa</span>'},contextmenu:{options:'Pikavalikon ominaisuudet'},specialChar:{toolbar:'Lisää erikoismerkki',title:'Valitse erikoismerkki',options:'Erikoismerkin ominaisuudet'},link:{toolbar:'Lisää linkki/muokkaa linkkiä',other:'<muu>',menu:'Muokkaa linkkiä',title:'Linkki',info:'Linkin tiedot',target:'Kohde',upload:'Lisää tiedosto',advanced:'Lisäominaisuudet',type:'Linkkityyppi',toUrl:'Osoite',toAnchor:'Ankkuri tässä sivussa',toEmail:'Sähköposti',targetFrame:'<kehys>',targetPopup:'<popup ikkuna>',targetFrameName:'Kohdekehyksen nimi',targetPopupName:'Popup ikkunan nimi',popupFeatures:'Popup ikkunan ominaisuudet',popupResizable:'Venytettävä',popupStatusBar:'Tilarivi',popupLocationBar:'Osoiterivi',popupToolbar:'Vakiopainikkeet',popupMenuBar:'Valikkorivi',popupFullScreen:'Täysi ikkuna (IE)',popupScrollBars:'Vierityspalkit',popupDependent:'Riippuva (Netscape)',popupLeft:'Vasemmalta (px)',popupTop:'Ylhäältä (px)',id:'Tunniste',langDir:'Kielen suunta',langDirLTR:'Vasemmalta oikealle (LTR)',langDirRTL:'Oikealta vasemmalle (RTL)',acccessKey:'Pikanäppäin',name:'Nimi',langCode:'Kielen suunta',tabIndex:'Tabulaattori indeksi',advisoryTitle:'Avustava otsikko',advisoryContentType:'Avustava sisällön tyyppi',cssClasses:'Tyyliluokat',charset:'Linkitetty kirjaimisto',styles:'Tyyli',rel:'Suhde',selectAnchor:'Valitse ankkuri',anchorName:'Ankkurin nimen mukaan',anchorId:'Ankkurin ID:n mukaan',emailAddress:'Sähköpostiosoite',emailSubject:'Aihe',emailBody:'Viesti',noAnchors:'(Ei ankkureita tässä dokumentissa)',noUrl:'Linkille on kirjoitettava URL',noEmail:'Kirjoita sähköpostiosoite'},anchor:{toolbar:'Lisää ankkuri/muokkaa ankkuria',menu:'Ankkurin ominaisuudet',title:'Ankkurin ominaisuudet',name:'Nimi',errorName:'Ankkurille on kirjoitettava nimi',remove:'Poista ankkuri'},list:{numberedTitle:'Numeroidun listan ominaisuudet',bulletedTitle:'Numeroimattoman listan ominaisuudet',type:'Tyyppi',start:'Alku',validateStartNumber:'Listan ensimmäisen numeron tulee olla kokonaisluku.',circle:'Ympyrä',disc:'Levy',square:'Neliö',none:'Ei mikään',notset:'<ei asetettu>',armenian:'Armeenialainen numerointi',georgian:'Georgialainen numerointi (an, ban, gan, etc.)',lowerRoman:'Pienet roomalaiset (i, ii, iii, iv, v, jne.)',upperRoman:'Isot roomalaiset (I, II, III, IV, V, jne.)',lowerAlpha:'Pienet aakkoset (a, b, c, d, e, jne.)',upperAlpha:'Isot aakkoset (A, B, C, D, E, jne.)',lowerGreek:'Pienet kreikkalaiset (alpha, beta, gamma, jne.)',decimal:'Desimaalit (1, 2, 3, jne.)',decimalLeadingZero:'Desimaalit, alussa nolla (01, 02, 03, jne.)'},findAndReplace:{title:'Etsi ja korvaa',find:'Etsi',replace:'Korvaa',findWhat:'Etsi mitä:',replaceWith:'Korvaa tällä:',notFoundMsg:'Etsittyä tekstiä ei löytynyt.',findOptions:'Hakuasetukset',matchCase:'Sama kirjainkoko',matchWord:'Koko sana',matchCyclic:'Kierrä ympäri',replaceAll:'Korvaa kaikki',replaceSuccessMsg:'%1 esiintymä(ä) korvattu.'},table:{toolbar:'Taulu',title:'Taulun ominaisuudet',menu:'Taulun ominaisuudet',deleteTable:'Poista taulu',rows:'Rivit',columns:'Sarakkeet',border:'Rajan paksuus',widthPx:'pikseliä',widthPc:'prosenttia',widthUnit:'leveysyksikkö',cellSpace:'Solujen väli',cellPad:'Solujen sisennys',caption:'Otsikko',summary:'Yhteenveto',headers:'Ylätunnisteet',headersNone:'Ei',headersColumn:'Ensimmäinen sarake',headersRow:'Ensimmäinen rivi',headersBoth:'Molemmat',invalidRows:'Rivien määrän täytyy olla suurempi kuin 0.',invalidCols:'Sarakkeiden määrän täytyy olla suurempi kuin 0.',invalidBorder:'Reunan koon täytyy olla numero.',invalidWidth:'Taulun leveyden täytyy olla numero.',invalidHeight:'Taulun korkeuden täytyy olla numero.',invalidCellSpacing:'Solujen välin täytyy olla numero.',invalidCellPadding:'Solujen sisennyksen täytyy olla numero.',cell:{menu:'Solu',insertBefore:'Lisää solu eteen',insertAfter:'Lisää solu perään',deleteCell:'Poista solut',merge:'Yhdistä solut',mergeRight:'Yhdistä oikealla olevan kanssa',mergeDown:'Yhdistä alla olevan kanssa',splitHorizontal:'Jaa solu vaakasuunnassa',splitVertical:'Jaa solu pystysuunnassa',title:'Solun ominaisuudet',cellType:'Solun tyyppi',rowSpan:'Rivin jatkuvuus',colSpan:'Solun jatkuvuus',wordWrap:'Rivitys',hAlign:'Horisontaali kohdistus',vAlign:'Vertikaali kohdistus',alignBaseline:'Alas (teksti)',bgColor:'Taustan väri',borderColor:'Reunan väri',data:'Data',header:'Ylätunniste',yes:'Kyllä',no:'Ei',invalidWidth:'Solun leveyden täytyy olla numero.',invalidHeight:'Solun korkeuden täytyy olla numero.',invalidRowSpan:'Rivin jatkuvuuden täytyy olla kokonaisluku.',invalidColSpan:'Solun jatkuvuuden täytyy olla kokonaisluku.',chooseColor:'Valitse'},row:{menu:'Rivi',insertBefore:'Lisää rivi yläpuolelle',insertAfter:'Lisää rivi alapuolelle',deleteRow:'Poista rivit'},column:{menu:'Sarake',insertBefore:'Lisää sarake vasemmalle',insertAfter:'Lisää sarake oikealle',deleteColumn:'Poista sarakkeet'}},button:{title:'Painikkeen ominaisuudet',text:'Teksti (arvo)',type:'Tyyppi',typeBtn:'Painike',typeSbm:'Lähetä',typeRst:'Tyhjennä'},checkboxAndRadio:{checkboxTitle:'Valintaruudun ominaisuudet',radioTitle:'Radiopainikkeen ominaisuudet',value:'Arvo',selected:'Valittu'},form:{title:'Lomakkeen ominaisuudet',menu:'Lomakkeen ominaisuudet',action:'Toiminto',method:'Tapa',encoding:'Enkoodaus'},select:{title:'Valintakentän ominaisuudet',selectInfo:'Info',opAvail:'Ominaisuudet',value:'Arvo',size:'Koko',lines:'Rivit',chkMulti:'Salli usea valinta',opText:'Teksti',opValue:'Arvo',btnAdd:'Lisää',btnModify:'Muuta',btnUp:'Ylös',btnDown:'Alas',btnSetValue:'Aseta valituksi',btnDelete:'Poista'},textarea:{title:'Tekstilaatikon ominaisuudet',cols:'Sarakkeita',rows:'Rivejä'},textfield:{title:'Tekstikentän ominaisuudet',name:'Nimi',value:'Arvo',charWidth:'Leveys',maxChars:'Maksimi merkkimäärä',type:'Tyyppi',typeText:'Teksti',typePass:'Salasana'},hidden:{title:'Piilokentän ominaisuudet',name:'Nimi',value:'Arvo'},image:{title:'Kuvan ominaisuudet',titleButton:'Kuvapainikkeen ominaisuudet',menu:'Kuvan ominaisuudet',infoTab:'Kuvan tiedot',btnUpload:'Lähetä palvelimelle',upload:'Lisää kuva',alt:'Vaihtoehtoinen teksti',lockRatio:'Lukitse suhteet',resetSize:'Alkuperäinen koko',border:'Kehys',hSpace:'Vaakatila',vSpace:'Pystytila',alertUrl:'Kirjoita kuvan osoite (URL)',linkTab:'Linkki',button2Img:'Haluatko muuntaa valitun kuvanäppäimen kuvaksi?',img2Button:'Haluatko muuntaa valitun kuvan kuvanäppäimeksi?',urlMissing:'Kuvan lähdeosoite puuttuu.',validateBorder:'Kehyksen täytyy olla kokonaisluku.',validateHSpace:'HSpace-määrityksen täytyy olla kokonaisluku.',validateVSpace:'VSpace-määrityksen täytyy olla kokonaisluku.'},flash:{properties:'Flash-ominaisuudet',propertiesTab:'Ominaisuudet',title:'Flash ominaisuudet',chkPlay:'Automaattinen käynnistys',chkLoop:'Toisto',chkMenu:'Näytä Flash-valikko',chkFull:'Salli kokoruututila',scale:'Levitä',scaleAll:'Näytä kaikki',scaleNoBorder:'Ei rajaa',scaleFit:'Tarkka koko',access:'Skriptien pääsy',accessAlways:'Aina',accessSameDomain:'Sama verkkotunnus',accessNever:'Ei koskaan',alignAbsBottom:'Aivan alas',alignAbsMiddle:'Aivan keskelle',alignBaseline:'Alas (teksti)',alignTextTop:'Ylös (teksti)',quality:'Laatu',qualityBest:'Paras',qualityHigh:'Korkea',qualityAutoHigh:'Automaattinen korkea',qualityMedium:'Keskitaso',qualityAutoLow:'Automaattinen matala',qualityLow:'Matala',windowModeWindow:'Ikkuna',windowModeOpaque:'Läpinäkyvyys',windowModeTransparent:'Läpinäkyvä',windowMode:'Ikkuna tila',flashvars:'Muuttujat Flash:lle',bgcolor:'Taustaväri',hSpace:'Vaakatila',vSpace:'Pystytila',validateSrc:'Linkille on kirjoitettava URL',validateHSpace:'Vaakatilan täytyy olla numero.',validateVSpace:'Pystytilan täytyy olla numero.'},spellCheck:{toolbar:'Tarkista oikeinkirjoitus',title:'Oikoluku',notAvailable:'Valitettavasti oikoluku ei ole käytössä tällä hetkellä.',errorLoading:'Virhe ladattaessa oikolukupalvelua isännältä: %s.',notInDic:'Ei sanakirjassa',changeTo:'Vaihda',btnIgnore:'Jätä huomioimatta',btnIgnoreAll:'Jätä kaikki huomioimatta',btnReplace:'Korvaa',btnReplaceAll:'Korvaa kaikki',btnUndo:'Kumoa',noSuggestions:'Ei ehdotuksia',progress:'Tarkistus käynnissä...',noMispell:'Tarkistus valmis: Ei virheitä',noChanges:'Tarkistus valmis: Yhtään sanaa ei muutettu',oneChange:'Tarkistus valmis: Yksi sana muutettiin',manyChanges:'Tarkistus valmis: %1 sanaa muutettiin',ieSpellDownload:'Oikeinkirjoituksen tarkistusta ei ole asennettu. Haluatko ladata sen nyt?'},smiley:{toolbar:'Hymiö',title:'Lisää hymiö',options:'Hymiön ominaisuudet'},elementsPath:{eleLabel:'Elementin polku',eleTitle:'%1 elementti'},numberedlist:'Numerointi',bulletedlist:'Luottelomerkit',indent:'Suurenna sisennystä',outdent:'Pienennä sisennystä',justify:{left:'Tasaa vasemmat reunat',center:'Keskitä',right:'Tasaa oikeat reunat',block:'Tasaa molemmat reunat'},blockquote:'Lainaus',clipboard:{title:'Liitä',cutError:'Selaimesi turva-asetukset eivät salli editorin toteuttaa leikkaamista. Käytä näppäimistöä leikkaamiseen (Ctrl+X).',copyError:'Selaimesi turva-asetukset eivät salli editorin toteuttaa kopioimista. Käytä näppäimistöä kopioimiseen (Ctrl+C).',pasteMsg:'Liitä painamalla (<STRONG>Ctrl+V</STRONG>) ja painamalla <STRONG>OK</STRONG>.',securityMsg:'Selaimesi turva-asetukset eivät salli editorin käyttää leikepöytää suoraan. Sinun pitää suorittaa liittäminen tässä ikkunassa.',pasteArea:'Leikealue'},pastefromword:{confirmCleanup:'Liittämäsi teksti näyttäisi olevan Word-dokumentista. Haluatko siivota sen ennen liittämistä? (Suositus: Kyllä)',toolbar:'Liitä Word-dokumentista',title:'Liitä Word-dokumentista',error:'Liitetyn tiedon siivoaminen ei onnistunut sisäisen virheen takia'},pasteText:{button:'Liitä tekstinä',title:'Liitä tekstinä'},templates:{button:'Pohjat',title:'Sisältöpohjat',options:'Sisältöpohjan ominaisuudet',insertOption:'Korvaa editorin koko sisältö',selectPromptMsg:'Valitse pohja editoriin<br>(aiempi sisältö menetetään):',emptyListMsg:'(Ei määriteltyjä pohjia)'},showBlocks:'Näytä elementit',stylesCombo:{label:'Tyyli',panelTitle:'Muotoilujen tyylit',panelTitle1:'Lohkojen tyylit',panelTitle2:'Rivinsisäiset tyylit',panelTitle3:'Objektien tyylit'},format:{label:'Muotoilu',panelTitle:'Muotoilu',tag_p:'Normaali',tag_pre:'Muotoiltu',tag_address:'Osoite',tag_h1:'Otsikko 1',tag_h2:'Otsikko 2',tag_h3:'Otsikko 3',tag_h4:'Otsikko 4',tag_h5:'Otsikko 5',tag_h6:'Otsikko 6',tag_div:'Normaali (DIV)'},div:{title:'Luo div-kehikko',toolbar:'Luo div-kehikko',cssClassInputLabel:'Tyylitiedoston luokat',styleSelectLabel:'Tyyli',IdInputLabel:'Id',languageCodeInputLabel:' Kielen koodi',inlineStyleInputLabel:'Sisätyyli',advisoryTitleInputLabel:'Ohjeistava otsikko',langDirLabel:'Kielen suunta',langDirLTRLabel:'Vasemmalta oikealle (LTR)',langDirRTLLabel:'Oikealta vasemmalle (RTL)',edit:'Muokkaa Diviä',remove:'Poista Div'},iframe:{title:'IFrame-kehyksen ominaisuudet',toolbar:'IFrame-kehys',noUrl:'Anna IFrame-kehykselle lähdeosoite (src)',scrolling:'Näytä vierityspalkit',border:'Näytä kehyksen reunat'},font:{label:'Kirjaisinlaji',voiceLabel:'Kirjaisinlaji',panelTitle:'Kirjaisinlaji'},fontSize:{label:'Koko',voiceLabel:'Kirjaisimen koko',panelTitle:'Koko'},colorButton:{textColorTitle:'Tekstiväri',bgColorTitle:'Taustaväri',panelTitle:'Värit',auto:'Automaattinen',more:'Lisää värejä...'},colors:{'000':'Musta',800000:'Kastanjanruskea','8B4513':'Satulanruskea','2F4F4F':'Tumma liuskekivenharmaa','008080':'Sinivihreä','000080':'Laivastonsininen','4B0082':'Indigonsininen',696969:'Tummanharmaa',B22222:'Tiili',A52A2A:'Ruskea',DAA520:'Kultapiisku','006400':'Tummanvihreä','40E0D0':'Turkoosi','0000CD':'Keskisininen',800080:'Purppura',808080:'Harmaa',F00:'Punainen',FF8C00:'Tumma oranssi',FFD700:'Kulta','008000':'Vihreä','0FF':'Syaani','00F':'Sininen',EE82EE:'Violetti',A9A9A9:'Tummanharmaa',FFA07A:'Vaaleanlohenpunainen',FFA500:'Oranssi',FFFF00:'Keltainen','00FF00':'Limetin vihreä',AFEEEE:'Haalea turkoosi',ADD8E6:'Vaaleansininen',DDA0DD:'Luumu',D3D3D3:'Vaaleanharmaa',FFF0F5:'Laventelinpunainen',FAEBD7:'Antiikinvalkoinen',FFFFE0:'Vaaleankeltainen',F0FFF0:'Hunajameloni',F0FFFF:'Asurinsininen',F0F8FF:'Alice Blue -sininen',E6E6FA:'Lavanteli',FFF:'Valkoinen'},scayt:{title:'Oikolue kirjoitettaessa',opera_title:'Opera ei tue tätä ominaisuutta',enable:'Ota käyttöön oikoluku kirjoitettaessa',disable:'Poista käytöstä oikoluku kirjoitetaessa',about:'Tietoja oikoluvusta kirjoitetaessa',toggle:'Vaihda oikoluku kirjoittaessa tilaa',options:'Asetukset',langs:'Kielet',moreSuggestions:'Lisää ehdotuksia',ignore:'Ohita',ignoreAll:'Ohita kaikki',addWord:'Lisää sana',emptyDic:'Sanakirjan nimi on annettava.',optionsTab:'Asetukset',allCaps:'Ohita sanat, jotka on kirjoitettu kokonaan isoilla kirjaimilla',ignoreDomainNames:'Ohita verkkotunnukset',mixedCase:'Ohita sanat, joissa on sekoitettu isoja ja pieniä kirjaimia',mixedWithDigits:'Ohita sanat, joissa on numeroita',languagesTab:'Kielet',dictionariesTab:'Sanakirjat',dic_field_name:'Sanakirjan nimi',dic_create:'Luo',dic_restore:'Palauta',dic_delete:'Poista',dic_rename:'Nimeä uudelleen',dic_info:'Oletuksena sanakirjat tallennetaan evästeeseen, mutta evästeiden koko on kuitenkin rajallinen. Sanakirjan kasvaessa niin suureksi, ettei se enää mahdu evästeeseen, sanakirja täytyy tallentaa palvelimellemme. Tallentaaksesi sanakirjasi palvelimellemme tulee sinun antaa sille nimi. Jos olet jo tallentanut sanakirjan, anna sen nimi ja klikkaa Palauta-painiketta',aboutTab:'Tietoa'},about:{title:'Tietoa CKEditorista',dlgTitle:'Tietoa CKEditorista',help:'Katso ohjeet: $1.',userGuide:'CKEditorin käyttäjäopas',moreInfo:'Lisenssitiedot löytyvät kotisivuiltamme:',copy:'Copyright © $1. Kaikki oikeuden pidätetään.'},maximize:'Suurenna',minimize:'Pienennä',fakeobjects:{anchor:'Ankkuri',flash:'Flash animaatio',iframe:'IFrame-kehys',hiddenfield:'Piilokenttä',unknown:'Tuntematon objekti'},resize:'Raahaa muuttaaksesi kokoa',colordialog:{title:'Valitse väri',options:'Värin ominaisuudet',highlight:'Korostus',selected:'Valittu',clear:'Poista'},toolbarCollapse:'Kutista työkalupalkki',toolbarExpand:'Laajenna työkalupalkki',toolbarGroups:{document:'Dokumentti',clipboard:'Leikepöytä/Kumoa',editing:'Muokkaus',forms:'Lomakkeet',basicstyles:'Perustyylit',paragraph:'Kappale',links:'Linkit',insert:'Lisää',styles:'Tyylit',colors:'Värit',tools:'Työkalut'},bidi:{ltr:'Tekstin suunta vasemmalta oikealle',rtl:'Tekstin suunta oikealta vasemmalle'},docprops:{label:'Dokumentin ominaisuudet',title:'Dokumentin ominaisuudet',design:'Sommittelu',meta:'Metatieto',chooseColor:'Valitse',other:'<muu>',docTitle:'Sivun nimi',charset:'Merkistökoodaus',charsetOther:'Muu merkistökoodaus',charsetASCII:'ASCII',charsetCE:'Keskieurooppalainen',charsetCT:'Kiina, perinteinen (Big5)',charsetCR:'Kyrillinen',charsetGR:'Kreikka',charsetJP:'Japani',charsetKR:'Korealainen',charsetTR:'Turkkilainen',charsetUN:'Unicode (UTF-8)',charsetWE:'Länsieurooppalainen',docType:'Dokumentin tyyppi',docTypeOther:'Muu dokumentin tyyppi',xhtmlDec:'Lisää XHTML julistukset',bgColor:'Taustaväri',bgImage:'Taustakuva',bgFixed:'Paikallaanpysyvä tausta',txtColor:'Tekstiväri',margin:'Sivun marginaalit',marginTop:'Ylä',marginLeft:'Vasen',marginRight:'Oikea',marginBottom:'Ala',metaKeywords:'Hakusanat (pilkulla erotettuna)',metaDescription:'Kuvaus',metaAuthor:'Tekijä',metaCopyright:'Tekijänoikeudet',previewHtml:'<p>Tämä on <strong>esimerkkitekstiä</strong>. Käytät juuri <a href="javascript:void(0)">CKEditoria</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.fi={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editorin työkalupalkit',editor:'Rikastekstieditori',source:'Koodi',newPage:'Tyhjennä',save:'Tallenna',preview:'Esikatsele',cut:'Leikkaa',copy:'Kopioi',paste:'Liitä',print:'Tulosta',underline:'Alleviivattu',bold:'Lihavoitu',italic:'Kursivoitu',selectAll:'Valitse kaikki',removeFormat:'Poista muotoilu',strike:'Yliviivattu',subscript:'Alaindeksi',superscript:'Yläindeksi',horizontalrule:'Lisää murtoviiva',pagebreak:'Lisää sivunvaihto',pagebreakAlt:'Sivunvaihto',unlink:'Poista linkki',undo:'Kumoa',redo:'Toista',common:{browseServer:'Selaa palvelinta',url:'Osoite',protocol:'Protokolla',upload:'Lisää tiedosto',uploadSubmit:'Lähetä palvelimelle',image:'Kuva',flash:'Flash-animaatio',form:'Lomake',checkbox:'Valintaruutu',radio:'Radiopainike',textField:'Tekstikenttä',textarea:'Tekstilaatikko',hiddenField:'Piilokenttä',button:'Painike',select:'Valintakenttä',imageButton:'Kuvapainike',notSet:'<ei asetettu>',id:'Tunniste',name:'Nimi',langDir:'Kielen suunta',langDirLtr:'Vasemmalta oikealle (LTR)',langDirRtl:'Oikealta vasemmalle (RTL)',langCode:'Kielikoodi',longDescr:'Pitkän kuvauksen URL',cssClass:'Tyyliluokat',advisoryTitle:'Avustava otsikko',cssStyle:'Tyyli',ok:'OK',cancel:'Peruuta',close:'Sulje',preview:'Esikatselu',generalTab:'Yleinen',advancedTab:'Lisäominaisuudet',validateNumberFailed:'Arvon pitää olla numero.',confirmNewPage:'Kaikki tallentamattomat muutokset tähän sisältöön menetetään. Oletko varma, että haluat ladata uuden sivun?',confirmCancel:'Jotkut asetuksista on muuttuneet. Oletko varma, että haluat sulkea valintaikkunan?',options:'Asetukset',target:'Kohde',targetNew:'Uusi ikkuna (_blank)',targetTop:'Päällimmäinen ikkuna (_top)',targetSelf:'Sama ikkuna (_self)',targetParent:'Ylemmän tason ikkuna (_parent)',langDirLTR:'Vasemmalta oikealle (LTR)',langDirRTL:'Oikealta vasemmalle (RTL)',styles:'Tyyli',cssClasses:'Tyylitiedoston luokat',width:'Leveys',height:'Korkeus',align:'Kohdistus',alignLeft:'Vasemmalle',alignRight:'Oikealle',alignCenter:'Keskelle',alignTop:'Ylös',alignMiddle:'Keskelle',alignBottom:'Alas',invalidHeight:'Korkeuden täytyy olla numero.',invalidWidth:'Leveyden täytyy olla numero.',invalidCssLength:'Kentän "%1" arvon täytyy olla positiivinen luku CSS mittayksikön (px, %, in, cm, mm, em, ex, pt tai pc) kanssa tai ilman.',invalidHtmlLength:'Kentän "%1" arvon täytyy olla positiivinen luku HTML mittayksikön (px tai %) kanssa tai ilman.',invalidInlineStyle:'Tyylille annetun arvon täytyy koostua yhdestä tai useammasta "nimi : arvo" parista, jotka ovat eroteltuna toisistaan puolipisteillä.',cssLengthTooltip:'Anna numeroarvo pikseleinä tai numeroarvo CSS mittayksikön kanssa (px, %, in, cm, mm, em, ex, pt, tai pc).',unavailable:'%1<span class="cke_accessibility">, ei saatavissa</span>'},contextmenu:{options:'Pikavalikon ominaisuudet'},specialChar:{toolbar:'Lisää erikoismerkki',title:'Valitse erikoismerkki',options:'Erikoismerkin ominaisuudet'},link:{toolbar:'Lisää linkki/muokkaa linkkiä',other:'<muu>',menu:'Muokkaa linkkiä',title:'Linkki',info:'Linkin tiedot',target:'Kohde',upload:'Lisää tiedosto',advanced:'Lisäominaisuudet',type:'Linkkityyppi',toUrl:'Osoite',toAnchor:'Ankkuri tässä sivussa',toEmail:'Sähköposti',targetFrame:'<kehys>',targetPopup:'<popup ikkuna>',targetFrameName:'Kohdekehyksen nimi',targetPopupName:'Popup ikkunan nimi',popupFeatures:'Popup ikkunan ominaisuudet',popupResizable:'Venytettävä',popupStatusBar:'Tilarivi',popupLocationBar:'Osoiterivi',popupToolbar:'Vakiopainikkeet',popupMenuBar:'Valikkorivi',popupFullScreen:'Täysi ikkuna (IE)',popupScrollBars:'Vierityspalkit',popupDependent:'Riippuva (Netscape)',popupLeft:'Vasemmalta (px)',popupTop:'Ylhäältä (px)',id:'Tunniste',langDir:'Kielen suunta',langDirLTR:'Vasemmalta oikealle (LTR)',langDirRTL:'Oikealta vasemmalle (RTL)',acccessKey:'Pikanäppäin',name:'Nimi',langCode:'Kielen suunta',tabIndex:'Tabulaattori indeksi',advisoryTitle:'Avustava otsikko',advisoryContentType:'Avustava sisällön tyyppi',cssClasses:'Tyyliluokat',charset:'Linkitetty kirjaimisto',styles:'Tyyli',rel:'Suhde',selectAnchor:'Valitse ankkuri',anchorName:'Ankkurin nimen mukaan',anchorId:'Ankkurin ID:n mukaan',emailAddress:'Sähköpostiosoite',emailSubject:'Aihe',emailBody:'Viesti',noAnchors:'(Ei ankkureita tässä dokumentissa)',noUrl:'Linkille on kirjoitettava URL',noEmail:'Kirjoita sähköpostiosoite'},anchor:{toolbar:'Lisää ankkuri/muokkaa ankkuria',menu:'Ankkurin ominaisuudet',title:'Ankkurin ominaisuudet',name:'Nimi',errorName:'Ankkurille on kirjoitettava nimi',remove:'Poista ankkuri'},list:{numberedTitle:'Numeroidun listan ominaisuudet',bulletedTitle:'Numeroimattoman listan ominaisuudet',type:'Tyyppi',start:'Alku',validateStartNumber:'Listan ensimmäisen numeron tulee olla kokonaisluku.',circle:'Ympyrä',disc:'Levy',square:'Neliö',none:'Ei mikään',notset:'<ei asetettu>',armenian:'Armeenialainen numerointi',georgian:'Georgialainen numerointi (an, ban, gan, etc.)',lowerRoman:'Pienet roomalaiset (i, ii, iii, iv, v, jne.)',upperRoman:'Isot roomalaiset (I, II, III, IV, V, jne.)',lowerAlpha:'Pienet aakkoset (a, b, c, d, e, jne.)',upperAlpha:'Isot aakkoset (A, B, C, D, E, jne.)',lowerGreek:'Pienet kreikkalaiset (alpha, beta, gamma, jne.)',decimal:'Desimaalit (1, 2, 3, jne.)',decimalLeadingZero:'Desimaalit, alussa nolla (01, 02, 03, jne.)'},findAndReplace:{title:'Etsi ja korvaa',find:'Etsi',replace:'Korvaa',findWhat:'Etsi mitä:',replaceWith:'Korvaa tällä:',notFoundMsg:'Etsittyä tekstiä ei löytynyt.',findOptions:'Hakuasetukset',matchCase:'Sama kirjainkoko',matchWord:'Koko sana',matchCyclic:'Kierrä ympäri',replaceAll:'Korvaa kaikki',replaceSuccessMsg:'%1 esiintymä(ä) korvattu.'},table:{toolbar:'Taulu',title:'Taulun ominaisuudet',menu:'Taulun ominaisuudet',deleteTable:'Poista taulu',rows:'Rivit',columns:'Sarakkeet',border:'Rajan paksuus',widthPx:'pikseliä',widthPc:'prosenttia',widthUnit:'leveysyksikkö',cellSpace:'Solujen väli',cellPad:'Solujen sisennys',caption:'Otsikko',summary:'Yhteenveto',headers:'Ylätunnisteet',headersNone:'Ei',headersColumn:'Ensimmäinen sarake',headersRow:'Ensimmäinen rivi',headersBoth:'Molemmat',invalidRows:'Rivien määrän täytyy olla suurempi kuin 0.',invalidCols:'Sarakkeiden määrän täytyy olla suurempi kuin 0.',invalidBorder:'Reunan koon täytyy olla numero.',invalidWidth:'Taulun leveyden täytyy olla numero.',invalidHeight:'Taulun korkeuden täytyy olla numero.',invalidCellSpacing:'Solujen välin täytyy olla numero.',invalidCellPadding:'Solujen sisennyksen täytyy olla numero.',cell:{menu:'Solu',insertBefore:'Lisää solu eteen',insertAfter:'Lisää solu perään',deleteCell:'Poista solut',merge:'Yhdistä solut',mergeRight:'Yhdistä oikealla olevan kanssa',mergeDown:'Yhdistä alla olevan kanssa',splitHorizontal:'Jaa solu vaakasuunnassa',splitVertical:'Jaa solu pystysuunnassa',title:'Solun ominaisuudet',cellType:'Solun tyyppi',rowSpan:'Rivin jatkuvuus',colSpan:'Solun jatkuvuus',wordWrap:'Rivitys',hAlign:'Horisontaali kohdistus',vAlign:'Vertikaali kohdistus',alignBaseline:'Alas (teksti)',bgColor:'Taustan väri',borderColor:'Reunan väri',data:'Data',header:'Ylätunniste',yes:'Kyllä',no:'Ei',invalidWidth:'Solun leveyden täytyy olla numero.',invalidHeight:'Solun korkeuden täytyy olla numero.',invalidRowSpan:'Rivin jatkuvuuden täytyy olla kokonaisluku.',invalidColSpan:'Solun jatkuvuuden täytyy olla kokonaisluku.',chooseColor:'Valitse'},row:{menu:'Rivi',insertBefore:'Lisää rivi yläpuolelle',insertAfter:'Lisää rivi alapuolelle',deleteRow:'Poista rivit'},column:{menu:'Sarake',insertBefore:'Lisää sarake vasemmalle',insertAfter:'Lisää sarake oikealle',deleteColumn:'Poista sarakkeet'}},button:{title:'Painikkeen ominaisuudet',text:'Teksti (arvo)',type:'Tyyppi',typeBtn:'Painike',typeSbm:'Lähetä',typeRst:'Tyhjennä'},checkboxAndRadio:{checkboxTitle:'Valintaruudun ominaisuudet',radioTitle:'Radiopainikkeen ominaisuudet',value:'Arvo',selected:'Valittu'},form:{title:'Lomakkeen ominaisuudet',menu:'Lomakkeen ominaisuudet',action:'Toiminto',method:'Tapa',encoding:'Enkoodaus'},select:{title:'Valintakentän ominaisuudet',selectInfo:'Info',opAvail:'Ominaisuudet',value:'Arvo',size:'Koko',lines:'Rivit',chkMulti:'Salli usea valinta',opText:'Teksti',opValue:'Arvo',btnAdd:'Lisää',btnModify:'Muuta',btnUp:'Ylös',btnDown:'Alas',btnSetValue:'Aseta valituksi',btnDelete:'Poista'},textarea:{title:'Tekstilaatikon ominaisuudet',cols:'Sarakkeita',rows:'Rivejä'},textfield:{title:'Tekstikentän ominaisuudet',name:'Nimi',value:'Arvo',charWidth:'Leveys',maxChars:'Maksimi merkkimäärä',type:'Tyyppi',typeText:'Teksti',typePass:'Salasana'},hidden:{title:'Piilokentän ominaisuudet',name:'Nimi',value:'Arvo'},image:{title:'Kuvan ominaisuudet',titleButton:'Kuvapainikkeen ominaisuudet',menu:'Kuvan ominaisuudet',infoTab:'Kuvan tiedot',btnUpload:'Lähetä palvelimelle',upload:'Lisää kuva',alt:'Vaihtoehtoinen teksti',lockRatio:'Lukitse suhteet',resetSize:'Alkuperäinen koko',border:'Kehys',hSpace:'Vaakatila',vSpace:'Pystytila',alertUrl:'Kirjoita kuvan osoite (URL)',linkTab:'Linkki',button2Img:'Haluatko muuntaa valitun kuvanäppäimen kuvaksi?',img2Button:'Haluatko muuntaa valitun kuvan kuvanäppäimeksi?',urlMissing:'Kuvan lähdeosoite puuttuu.',validateBorder:'Kehyksen täytyy olla kokonaisluku.',validateHSpace:'HSpace-määrityksen täytyy olla kokonaisluku.',validateVSpace:'VSpace-määrityksen täytyy olla kokonaisluku.'},flash:{properties:'Flash-ominaisuudet',propertiesTab:'Ominaisuudet',title:'Flash ominaisuudet',chkPlay:'Automaattinen käynnistys',chkLoop:'Toisto',chkMenu:'Näytä Flash-valikko',chkFull:'Salli kokoruututila',scale:'Levitä',scaleAll:'Näytä kaikki',scaleNoBorder:'Ei rajaa',scaleFit:'Tarkka koko',access:'Skriptien pääsy',accessAlways:'Aina',accessSameDomain:'Sama verkkotunnus',accessNever:'Ei koskaan',alignAbsBottom:'Aivan alas',alignAbsMiddle:'Aivan keskelle',alignBaseline:'Alas (teksti)',alignTextTop:'Ylös (teksti)',quality:'Laatu',qualityBest:'Paras',qualityHigh:'Korkea',qualityAutoHigh:'Automaattinen korkea',qualityMedium:'Keskitaso',qualityAutoLow:'Automaattinen matala',qualityLow:'Matala',windowModeWindow:'Ikkuna',windowModeOpaque:'Läpinäkyvyys',windowModeTransparent:'Läpinäkyvä',windowMode:'Ikkuna tila',flashvars:'Muuttujat Flash:lle',bgcolor:'Taustaväri',hSpace:'Vaakatila',vSpace:'Pystytila',validateSrc:'Linkille on kirjoitettava URL',validateHSpace:'Vaakatilan täytyy olla numero.',validateVSpace:'Pystytilan täytyy olla numero.'},spellCheck:{toolbar:'Tarkista oikeinkirjoitus',title:'Oikoluku',notAvailable:'Valitettavasti oikoluku ei ole käytössä tällä hetkellä.',errorLoading:'Virhe ladattaessa oikolukupalvelua isännältä: %s.',notInDic:'Ei sanakirjassa',changeTo:'Vaihda',btnIgnore:'Jätä huomioimatta',btnIgnoreAll:'Jätä kaikki huomioimatta',btnReplace:'Korvaa',btnReplaceAll:'Korvaa kaikki',btnUndo:'Kumoa',noSuggestions:'Ei ehdotuksia',progress:'Tarkistus käynnissä...',noMispell:'Tarkistus valmis: Ei virheitä',noChanges:'Tarkistus valmis: Yhtään sanaa ei muutettu',oneChange:'Tarkistus valmis: Yksi sana muutettiin',manyChanges:'Tarkistus valmis: %1 sanaa muutettiin',ieSpellDownload:'Oikeinkirjoituksen tarkistusta ei ole asennettu. Haluatko ladata sen nyt?'},smiley:{toolbar:'Hymiö',title:'Lisää hymiö',options:'Hymiön ominaisuudet'},elementsPath:{eleLabel:'Elementin polku',eleTitle:'%1 elementti'},numberedlist:'Numerointi',bulletedlist:'Luottelomerkit',indent:'Suurenna sisennystä',outdent:'Pienennä sisennystä',justify:{left:'Tasaa vasemmat reunat',center:'Keskitä',right:'Tasaa oikeat reunat',block:'Tasaa molemmat reunat'},blockquote:'Lainaus',clipboard:{title:'Liitä',cutError:'Selaimesi turva-asetukset eivät salli editorin toteuttaa leikkaamista. Käytä näppäimistöä leikkaamiseen (Ctrl+X).',copyError:'Selaimesi turva-asetukset eivät salli editorin toteuttaa kopioimista. Käytä näppäimistöä kopioimiseen (Ctrl+C).',pasteMsg:'Liitä painamalla (<STRONG>Ctrl+V</STRONG>) ja painamalla <STRONG>OK</STRONG>.',securityMsg:'Selaimesi turva-asetukset eivät salli editorin käyttää leikepöytää suoraan. Sinun pitää suorittaa liittäminen tässä ikkunassa.',pasteArea:'Leikealue'},pastefromword:{confirmCleanup:'Liittämäsi teksti näyttäisi olevan Word-dokumentista. Haluatko siivota sen ennen liittämistä? (Suositus: Kyllä)',toolbar:'Liitä Word-dokumentista',title:'Liitä Word-dokumentista',error:'Liitetyn tiedon siivoaminen ei onnistunut sisäisen virheen takia'},pasteText:{button:'Liitä tekstinä',title:'Liitä tekstinä'},templates:{button:'Pohjat',title:'Sisältöpohjat',options:'Sisältöpohjan ominaisuudet',insertOption:'Korvaa editorin koko sisältö',selectPromptMsg:'Valitse pohja editoriin<br>(aiempi sisältö menetetään):',emptyListMsg:'(Ei määriteltyjä pohjia)'},showBlocks:'Näytä elementit',stylesCombo:{label:'Tyyli',panelTitle:'Muotoilujen tyylit',panelTitle1:'Lohkojen tyylit',panelTitle2:'Rivinsisäiset tyylit',panelTitle3:'Objektien tyylit'},format:{label:'Muotoilu',panelTitle:'Muotoilu',tag_p:'Normaali',tag_pre:'Muotoiltu',tag_address:'Osoite',tag_h1:'Otsikko 1',tag_h2:'Otsikko 2',tag_h3:'Otsikko 3',tag_h4:'Otsikko 4',tag_h5:'Otsikko 5',tag_h6:'Otsikko 6',tag_div:'Normaali (DIV)'},div:{title:'Luo div-kehikko',toolbar:'Luo div-kehikko',cssClassInputLabel:'Tyylitiedoston luokat',styleSelectLabel:'Tyyli',IdInputLabel:'Id',languageCodeInputLabel:' Kielen koodi',inlineStyleInputLabel:'Sisätyyli',advisoryTitleInputLabel:'Ohjeistava otsikko',langDirLabel:'Kielen suunta',langDirLTRLabel:'Vasemmalta oikealle (LTR)',langDirRTLLabel:'Oikealta vasemmalle (RTL)',edit:'Muokkaa Diviä',remove:'Poista Div'},iframe:{title:'IFrame-kehyksen ominaisuudet',toolbar:'IFrame-kehys',noUrl:'Anna IFrame-kehykselle lähdeosoite (src)',scrolling:'Näytä vierityspalkit',border:'Näytä kehyksen reunat'},font:{label:'Kirjaisinlaji',voiceLabel:'Kirjaisinlaji',panelTitle:'Kirjaisinlaji'},fontSize:{label:'Koko',voiceLabel:'Kirjaisimen koko',panelTitle:'Koko'},colorButton:{textColorTitle:'Tekstiväri',bgColorTitle:'Taustaväri',panelTitle:'Värit',auto:'Automaattinen',more:'Lisää värejä...'},colors:{'000':'Musta',800000:'Kastanjanruskea','8B4513':'Satulanruskea','2F4F4F':'Tumma liuskekivenharmaa','008080':'Sinivihreä','000080':'Laivastonsininen','4B0082':'Indigonsininen',696969:'Tummanharmaa',B22222:'Tiili',A52A2A:'Ruskea',DAA520:'Kultapiisku','006400':'Tummanvihreä','40E0D0':'Turkoosi','0000CD':'Keskisininen',800080:'Purppura',808080:'Harmaa',F00:'Punainen',FF8C00:'Tumma oranssi',FFD700:'Kulta','008000':'Vihreä','0FF':'Syaani','00F':'Sininen',EE82EE:'Violetti',A9A9A9:'Tummanharmaa',FFA07A:'Vaaleanlohenpunainen',FFA500:'Oranssi',FFFF00:'Keltainen','00FF00':'Limetin vihreä',AFEEEE:'Haalea turkoosi',ADD8E6:'Vaaleansininen',DDA0DD:'Luumu',D3D3D3:'Vaaleanharmaa',FFF0F5:'Laventelinpunainen',FAEBD7:'Antiikinvalkoinen',FFFFE0:'Vaaleankeltainen',F0FFF0:'Hunajameloni',F0FFFF:'Asurinsininen',F0F8FF:'Alice Blue -sininen',E6E6FA:'Lavanteli',FFF:'Valkoinen'},scayt:{title:'Oikolue kirjoitettaessa',opera_title:'Opera ei tue tätä ominaisuutta',enable:'Ota käyttöön oikoluku kirjoitettaessa',disable:'Poista käytöstä oikoluku kirjoitetaessa',about:'Tietoja oikoluvusta kirjoitetaessa',toggle:'Vaihda oikoluku kirjoittaessa tilaa',options:'Asetukset',langs:'Kielet',moreSuggestions:'Lisää ehdotuksia',ignore:'Ohita',ignoreAll:'Ohita kaikki',addWord:'Lisää sana',emptyDic:'Sanakirjan nimi on annettava.',optionsTab:'Asetukset',allCaps:'Ohita sanat, jotka on kirjoitettu kokonaan isoilla kirjaimilla',ignoreDomainNames:'Ohita verkkotunnukset',mixedCase:'Ohita sanat, joissa on sekoitettu isoja ja pieniä kirjaimia',mixedWithDigits:'Ohita sanat, joissa on numeroita',languagesTab:'Kielet',dictionariesTab:'Sanakirjat',dic_field_name:'Sanakirjan nimi',dic_create:'Luo',dic_restore:'Palauta',dic_delete:'Poista',dic_rename:'Nimeä uudelleen',dic_info:'Oletuksena sanakirjat tallennetaan evästeeseen, mutta evästeiden koko on kuitenkin rajallinen. Sanakirjan kasvaessa niin suureksi, ettei se enää mahdu evästeeseen, sanakirja täytyy tallentaa palvelimellemme. Tallentaaksesi sanakirjasi palvelimellemme tulee sinun antaa sille nimi. Jos olet jo tallentanut sanakirjan, anna sen nimi ja klikkaa Palauta-painiketta',aboutTab:'Tietoa'},about:{title:'Tietoa CKEditorista',dlgTitle:'Tietoa CKEditorista',help:'Katso ohjeet: $1.',userGuide:'CKEditorin käyttäjäopas',moreInfo:'Lisenssitiedot löytyvät kotisivuiltamme:',copy:'Copyright © $1. Kaikki oikeuden pidätetään.'},maximize:'Suurenna',minimize:'Pienennä',fakeobjects:{anchor:'Ankkuri',flash:'Flash animaatio',iframe:'IFrame-kehys',hiddenfield:'Piilokenttä',unknown:'Tuntematon objekti'},resize:'Raahaa muuttaaksesi kokoa',colordialog:{title:'Valitse väri',options:'Värin ominaisuudet',highlight:'Korostus',selected:'Valittu',clear:'Poista'},toolbarCollapse:'Kutista työkalupalkki',toolbarExpand:'Laajenna työkalupalkki',toolbarGroups:{document:'Dokumentti',clipboard:'Leikepöytä/Kumoa',editing:'Muokkaus',forms:'Lomakkeet',basicstyles:'Perustyylit',paragraph:'Kappale',links:'Linkit',insert:'Lisää',styles:'Tyylit',colors:'Värit',tools:'Työkalut'},bidi:{ltr:'Tekstin suunta vasemmalta oikealle',rtl:'Tekstin suunta oikealta vasemmalle'},docprops:{label:'Dokumentin ominaisuudet',title:'Dokumentin ominaisuudet',design:'Sommittelu',meta:'Metatieto',chooseColor:'Valitse',other:'<muu>',docTitle:'Sivun nimi',charset:'Merkistökoodaus',charsetOther:'Muu merkistökoodaus',charsetASCII:'ASCII',charsetCE:'Keskieurooppalainen',charsetCT:'Kiina, perinteinen (Big5)',charsetCR:'Kyrillinen',charsetGR:'Kreikka',charsetJP:'Japani',charsetKR:'Korealainen',charsetTR:'Turkkilainen',charsetUN:'Unicode (UTF-8)',charsetWE:'Länsieurooppalainen',docType:'Dokumentin tyyppi',docTypeOther:'Muu dokumentin tyyppi',xhtmlDec:'Lisää XHTML julistukset',bgColor:'Taustaväri',bgImage:'Taustakuva',bgFixed:'Paikallaanpysyvä tausta',txtColor:'Tekstiväri',margin:'Sivun marginaalit',marginTop:'Ylä',marginLeft:'Vasen',marginRight:'Oikea',marginBottom:'Ala',metaKeywords:'Hakusanat (pilkulla erotettuna)',metaDescription:'Kuvaus',metaAuthor:'Tekijä',metaCopyright:'Tekijänoikeudet',previewHtml:'<p>Tämä on <strong>esimerkkitekstiä</strong>. Käytät juuri <a href="javascript:void(0)">CKEditoria</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/fo.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/fo.js
index 0f4c0d5..a141544 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/fo.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/fo.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.fo={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Kelda',newPage:'Nýggj síða',save:'Goym',preview:'Frumsýning',cut:'Kvett',copy:'Avrita',paste:'Innrita',print:'Prenta',underline:'Undirstrikað',bold:'Feit skrift',italic:'Skráskrift',selectAll:'Markera alt',removeFormat:'Strika sniðgeving',strike:'Yvirstrikað',subscript:'Lækkað skrift',superscript:'Hækkað skrift',horizontalrule:'Ger vatnrætta linju',pagebreak:'Ger síðuskift',pagebreakAlt:'Síðuskift',unlink:'Strika tilknýti',undo:'Angra',redo:'Vend aftur',common:{browseServer:'Ambætarakagi',url:'URL',protocol:'Protokoll',upload:'Send til ambætaran',uploadSubmit:'Send til ambætaran',image:'Myndir',flash:'Flash',form:'Formur',checkbox:'Flugubein',radio:'Radioknøttur',textField:'Tekstteigur',textarea:'Tekstumráði',hiddenField:'Fjaldur teigur',button:'Knøttur',select:'Valskrá',imageButton:'Myndaknøttur',notSet:'<ikki sett>',id:'Id',name:'Navn',langDir:'Tekstkós',langDirLtr:'Frá vinstru til høgru (LTR)',langDirRtl:'Frá høgru til vinstru (RTL)',langCode:'Málkoda',longDescr:'Víðkað URL frágreiðing',cssClass:'Typografi klassar',advisoryTitle:'Vegleiðandi heiti',cssStyle:'Typografi',ok:'Góðkent',cancel:'Avlýst',close:'Lat aftur',preview:'Frumsýn',generalTab:'Generelt',advancedTab:'Fjølbroytt',validateNumberFailed:'Hetta er ikki eitt tal.',confirmNewPage:'Allar ikki goymdar broytingar í hesum innihaldið hvørva. Skal nýggj síða lesast kortini?',confirmCancel:'Nakrir valmøguleikar eru broyttir. Ert tú vísur í, at dialogurin skal latast aftur?',options:'Options',target:'Target',targetNew:'Nýtt vindeyga (_blank)',targetTop:'Vindeyga ovast (_top)',targetSelf:'Sama vindeyga (_self)',targetParent:'Upphavligt vindeyga (_parent)',langDirLTR:'Frá vinstru til høgru (LTR)',langDirRTL:'Frá høgru til vinstru (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Breidd',height:'Hædd',align:'Justering',alignLeft:'Vinstra',alignRight:'Høgra',alignCenter:'Miðsett',alignTop:'Ovast',alignMiddle:'Miðja',alignBottom:'Botnur',invalidHeight:'Hædd má vera eitt tal.',invalidWidth:'Breidd má vera eitt tal.',invalidCssLength:'Virðið sett í "%1" feltið má vera eitt positivt tal, við ella uttan gyldugum CSS mátieind (px, %, in, cm, mm, em, ex, pt, ella pc).',invalidHtmlLength:'Virðið sett í "%1" feltiðield má vera eitt positivt tal, við ella uttan gyldugum CSS mátieind (px ella %).',invalidInlineStyle:'Virði specifiserað fyri inline style má hava eitt ella fleiri pør (tuples) skrivað sum "name : value", hvørt parið sundurskilt við semi-colon.',cssLengthTooltip:'Skriva eitt tal fyri eitt virði í pixels ella eitt tal við gyldigum CSS eind (px, %, in, cm, mm, em, ex, pt, ella pc).',unavailable:'%1<span class="cke_accessibility">, ikki tøkt</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Set inn sertekn',title:'Vel sertekn',options:'Møguleikar við serteknum'},link:{toolbar:'Ger/broyt tilknýti',other:'<annað>',menu:'Broyt tilknýti',title:'Tilknýti',info:'Tilknýtis upplýsingar',target:'Target',upload:'Send til ambætaran',advanced:'Fjølbroytt',type:'Tilknýtisslag',toUrl:'URL',toAnchor:'Tilknýti til marknastein í tekstinum',toEmail:'Teldupostur',targetFrame:'<ramma>',targetPopup:'<popup vindeyga>',targetFrameName:'Vís navn vindeygans',targetPopupName:'Popup vindeygans navn',popupFeatures:'Popup vindeygans víðkaðu eginleikar',popupResizable:'Stødd kann broytast',popupStatusBar:'Støðufrágreiðingarbjálki',popupLocationBar:'Adressulinja',popupToolbar:'Amboðsbjálki',popupMenuBar:'Skrábjálki',popupFullScreen:'Fullur skermur (IE)',popupScrollBars:'Rullibjálki',popupDependent:'Bundið (Netscape)',popupLeft:'Frástøða frá vinstru',popupTop:'Frástøða frá íerva',id:'Id',langDir:'Tekstkós',langDirLTR:'Frá vinstru til høgru (LTR)',langDirRTL:'Frá høgru til vinstru (RTL)',acccessKey:'Snarvegisknöttur',name:'Navn',langCode:'Tekstkós',tabIndex:'Tabulator indeks',advisoryTitle:'Vegleiðandi heiti',advisoryContentType:'Vegleiðandi innihaldsslag',cssClasses:'Typografi klassar',charset:'Atknýtt teknsett',styles:'Typografi',rel:'Relatión',selectAnchor:'Vel ein marknastein',anchorName:'Eftir navni á marknasteini',anchorId:'Eftir element Id',emailAddress:'Teldupost-adressa',emailSubject:'Evni',emailBody:'Breyðtekstur',noAnchors:'(Eingir marknasteinar eru í hesum dokumentið)',noUrl:'Vinarliga skriva tilknýti (URL)',noEmail:'Vinarliga skriva teldupost-adressu'},anchor:{toolbar:'Ger/broyt marknastein',menu:'Eginleikar fyri marknastein',title:'Eginleikar fyri marknastein',name:'Heiti marknasteinsins',errorName:'Vinarliga rita marknasteinsins heiti',remove:'Strika marknastein'},list:{numberedTitle:'Eginleikar fyri lista við tølum',bulletedTitle:'Eginleikar fyri lista við prikkum',type:'Slag',start:'Byrjan',validateStartNumber:'Byrjunartalið fyri lista má vera eitt heiltal.',circle:'Sirkul',disc:'Disc',square:'Fýrkantur',none:'Einki',notset:'<ikki sett>',armenian:'Armensk talskipan',georgian:'Georgisk talskipan (an, ban, gan, osv.)',lowerRoman:'Lítil rómaratøl (i, ii, iii, iv, v, etc.)',upperRoman:'Stór rómaratøl (I, II, III, IV, V, etc.)',lowerAlpha:'Lítlir bókstavir (a, b, c, d, e, etc.)',upperAlpha:'Stórir bókstavir (A, B, C, D, E, etc.)',lowerGreek:'Grikskt við lítlum (alpha, beta, gamma, etc.)',decimal:'Vanlig tøl (1, 2, 3, etc.)',decimalLeadingZero:'Tøl við null frammanfyri (01, 02, 03, etc.)'},findAndReplace:{title:'Finn og broyt',find:'Leita',replace:'Yvirskriva',findWhat:'Finn:',replaceWith:'Yvirskriva við:',notFoundMsg:'Leititeksturin varð ikki funnin',findOptions:'Finn møguleikar',matchCase:'Munur á stórum og smáum bókstavum',matchWord:'Bert heil orð',matchCyclic:'Match cyclic',replaceAll:'Yvirskriva alt',replaceSuccessMsg:'%1 úrslit broytt.'},table:{toolbar:'Tabell',title:'Eginleikar fyri tabell',menu:'Eginleikar fyri tabell',deleteTable:'Strika tabell',rows:'Røðir',columns:'Kolonnur',border:'Bordabreidd',widthPx:'pixels',widthPc:'prosent',widthUnit:'breiddar unit',cellSpace:'Fjarstøða millum meskar',cellPad:'Meskubreddi',caption:'Tabellfrágreiðing',summary:'Samandráttur',headers:'Yvirskriftir',headersNone:'Eingin',headersColumn:'Fyrsta kolonna',headersRow:'Fyrsta rað',headersBoth:'Báðir',invalidRows:'Talið av røðum má vera eitt tal størri enn 0.',invalidCols:'Talið av kolonnum má vera eitt tal størri enn 0.',invalidBorder:'Borda-stødd má vera eitt tal.',invalidWidth:'Tabell-breidd má vera eitt tal.',invalidHeight:'Tabell-hædd má vera eitt tal.',invalidCellSpacing:'Cell spacing má vera eitt tal.',invalidCellPadding:'Cell padding má vera eitt tal.',cell:{menu:'Meski',insertBefore:'Set meska inn áðrenn',insertAfter:'Set meska inn aftaná',deleteCell:'Strika meskar',merge:'Flætta meskar',mergeRight:'Flætta meskar til høgru',mergeDown:'Flætta saman',splitHorizontal:'Kloyv meska vatnrætt',splitVertical:'Kloyv meska loddrætt',title:'Mesku eginleikar',cellType:'Mesku slag',rowSpan:'Ræð spenni',colSpan:'Kolonnu spenni',wordWrap:'Orðkloyving',hAlign:'Horisontal plasering',vAlign:'Loddrøtt plasering',alignBaseline:'Basislinja',bgColor:'Bakgrundslitur',borderColor:'Bordalitur',data:'Data',header:'Header',yes:'Ja',no:'Nei',invalidWidth:'Meskubreidd má vera eitt tal.',invalidHeight:'Meskuhædd má vera eitt tal.',invalidRowSpan:'Raðspennið má vera eitt heiltal.',invalidColSpan:'Kolonnuspennið má vera eitt heiltal.',chooseColor:'Vel'},row:{menu:'Rað',insertBefore:'Set rað inn áðrenn',insertAfter:'Set rað inn aftaná',deleteRow:'Strika røðir'},column:{menu:'Kolonna',insertBefore:'Set kolonnu inn áðrenn',insertAfter:'Set kolonnu inn aftaná',deleteColumn:'Strika kolonnur'}},button:{title:'Eginleikar fyri knøtt',text:'Tekstur',type:'Slag',typeBtn:'Knøttur',typeSbm:'Send',typeRst:'Nullstilla'},checkboxAndRadio:{checkboxTitle:'Eginleikar fyri flugubein',radioTitle:'Eginleikar fyri radioknøtt',value:'Virði',selected:'Valt'},form:{title:'Eginleikar fyri Form',menu:'Eginleikar fyri Form',action:'Hending',method:'Háttur',encoding:'Encoding'},select:{title:'Eginleikar fyri valskrá',selectInfo:'Upplýsingar',opAvail:'Tøkir møguleikar',value:'Virði',size:'Stødd',lines:'Linjur',chkMulti:'Loyv fleiri valmøguleikum samstundis',opText:'Tekstur',opValue:'Virði',btnAdd:'Legg afturat',btnModify:'Broyt',btnUp:'Upp',btnDown:'Niður',btnSetValue:'Set sum valt virði',btnDelete:'Strika'},textarea:{title:'Eginleikar fyri tekstumráði',cols:'kolonnur',rows:'røðir'},textfield:{title:'Eginleikar fyri tekstteig',name:'Navn',value:'Virði',charWidth:'Breidd (sjónlig tekn)',maxChars:'Mest loyvdu tekn',type:'Slag',typeText:'Tekstur',typePass:'Loyniorð'},hidden:{title:'Eginleikar fyri fjaldan teig',name:'Navn',value:'Virði'},image:{title:'Myndaeginleikar',titleButton:'Eginleikar fyri myndaknøtt',menu:'Myndaeginleikar',infoTab:'Myndaupplýsingar',btnUpload:'Send til ambætaran',upload:'Send',alt:'Alternativur tekstur',lockRatio:'Læs lutfallið',resetSize:'Upprunastødd',border:'Bordi',hSpace:'Høgri breddi',vSpace:'Vinstri breddi',alertUrl:'Rita slóðina til myndina',linkTab:'Tilknýti',button2Img:'Skal valdi myndaknøttur gerast til vanliga mynd?',img2Button:'Skal valda mynd gerast til myndaknøtt?',urlMissing:'URL til mynd manglar.',validateBorder:'Bordi má vera eitt heiltal.',validateHSpace:'HSpace má vera eitt heiltal.',validateVSpace:'VSpace má vera eitt heiltal.'},flash:{properties:'Flash eginleikar',propertiesTab:'Eginleikar',title:'Flash eginleikar',chkPlay:'Avspælingin byrjar sjálv',chkLoop:'Endurspæl',chkMenu:'Ger Flash skrá virkna',chkFull:'Loyv fullan skerm',scale:'Skalering',scaleAll:'Vís alt',scaleNoBorder:'Eingin bordi',scaleFit:'Neyv skalering',access:'Script atgongd',accessAlways:'Altíð',accessSameDomain:'Sama navnaøki',accessNever:'Ongantíð',alignAbsBottom:'Abs botnur',alignAbsMiddle:'Abs miðja',alignBaseline:'Basislinja',alignTextTop:'Tekst toppur',quality:'Góðska',qualityBest:'Besta',qualityHigh:'Høg',qualityAutoHigh:'Auto høg',qualityMedium:'Meðal',qualityAutoLow:'Auto Lág',qualityLow:'Lág',windowModeWindow:'Rútur',windowModeOpaque:'Ikki transparent',windowModeTransparent:'Transparent',windowMode:'Slag av rúti',flashvars:'Variablar fyri Flash',bgcolor:'Bakgrundslitur',hSpace:'Høgri breddi',vSpace:'Vinstri breddi',validateSrc:'Vinarliga skriva tilknýti (URL)',validateHSpace:'HSpace má vera eitt tal.',validateVSpace:'VSpace má vera eitt tal.'},spellCheck:{toolbar:'Kanna stavseting',title:'Kanna stavseting',notAvailable:'Tíverri, ikki tøkt í løtuni.',errorLoading:'Feilur við innlesing av application service host: %s.',notInDic:'Finst ikki í orðabókini',changeTo:'Broyt til',btnIgnore:'Forfjóna',btnIgnoreAll:'Forfjóna alt',btnReplace:'Yvirskriva',btnReplaceAll:'Yvirskriva alt',btnUndo:'Angra',noSuggestions:'- Einki uppskot -',progress:'Rættstavarin arbeiðir...',noMispell:'Rættstavarin liðugur: Eingin feilur funnin',noChanges:'Rættstavarin liðugur: Einki orð varð broytt',oneChange:'Rættstavarin liðugur: Eitt orð er broytt',manyChanges:'Rættstavarin liðugur: %1 orð broytt',ieSpellDownload:'Rættstavarin er ikki tøkur í tekstviðgeranum. Vilt tú heinta hann nú?'},smiley:{toolbar:'Smiley',title:'Vel Smiley',options:'Møguleikar fyri Smiley'},elementsPath:{eleLabel:'Slóð til elementir',eleTitle:'%1 element'},numberedlist:'Talmerktur listi',bulletedlist:'Punktmerktur listi',indent:'Økja reglubrotarinntriv',outdent:'Minka reglubrotarinntriv',justify:{left:'Vinstrasett',center:'Miðsett',right:'Høgrasett',block:'Javnir tekstkantar'},blockquote:'Blockquote',clipboard:{title:'Innrita',cutError:'Trygdaruppseting alnótskagans forðar tekstviðgeranum í at kvetta tekstin. Vinarliga nýt knappaborðið til at kvetta tekstin (Ctrl/Cmd+X).',copyError:'Trygdaruppseting alnótskagans forðar tekstviðgeranum í at avrita tekstin. Vinarliga nýt knappaborðið til at avrita tekstin (Ctrl/Cmd+C).',pasteMsg:'Vinarliga koyr tekstin í hendan rútin við knappaborðinum (<strong>Ctrl/Cmd+V</strong>) og klikk á <strong>Góðtak</strong>.',securityMsg:'Trygdaruppseting alnótskagans forðar tekstviðgeranum í beinleiðis atgongd til avritingarminnið. Tygum mugu royna aftur í hesum rútinum.',pasteArea:'Avritingarumráði'},pastefromword:{confirmCleanup:'Teksturin, tú roynir at seta inn, sýnist at stava frá Word. Skal teksturin reinsast fyrst?',toolbar:'Innrita frá Word',title:'Innrita frá Word',error:'Tað eydnaðist ikki at reinsa tekstin vegna ein internan feil'},pasteText:{button:'Innrita som reinan tekst',title:'Innrita som reinan tekst'},templates:{button:'Skabelónir',title:'Innihaldsskabelónir',options:'Møguleikar fyri Template',insertOption:'Yvirskriva núverandi innihald',selectPromptMsg:'Vinarliga vel ta skabelón, ið skal opnast í tekstviðgeranum<br>(Hetta yvirskrivar núverandi innihald):',emptyListMsg:'(Ongar skabelónir tøkar)'},showBlocks:'Vís blokkar',stylesCombo:{label:'Typografi',panelTitle:'Formatterings stílir',panelTitle1:'Blokk stílir',panelTitle2:'Inline stílir',panelTitle3:'Object stílir'},format:{label:'Skriftsnið',panelTitle:'Skriftsnið',tag_p:'Vanligt',tag_pre:'Sniðgivið',tag_address:'Adressa',tag_h1:'Yvirskrift 1',tag_h2:'Yvirskrift 2',tag_h3:'Yvirskrift 3',tag_h4:'Yvirskrift 4',tag_h5:'Yvirskrift 5',tag_h6:'Yvirskrift 6',tag_div:'Vanligt (DIV)'},div:{title:'Ger Div Container',toolbar:'Ger Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Vinstru til høgru (LTR)',langDirRTLLabel:'Høgru til vinstru (RTL)',edit:'Redigera Div',remove:'Strika Div'},iframe:{title:'Møguleikar fyri IFrame',toolbar:'IFrame',noUrl:'Vinarliga skriva URL til iframe',scrolling:'Loyv scrollbars',border:'Vís frame kant'},font:{label:'Skrift',voiceLabel:'Skrift',panelTitle:'Skrift'},fontSize:{label:'Skriftstødd',voiceLabel:'Skriftstødd',panelTitle:'Skriftstødd'},colorButton:{textColorTitle:'Tekstlitur',bgColorTitle:'Bakgrundslitur',panelTitle:'Litir',auto:'Automatiskt',more:'Fleiri litir...'},colors:{'000':'Svart',800000:'Maroon','8B4513':'Saðilsbrúnt','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Myrkagrátt',B22222:'Fire Brick',A52A2A:'Brúnt',DAA520:'Gullstavur','006400':'Myrkagrønt','40E0D0':'Turquoise','0000CD':'Meðal blátt',800080:'Purple',808080:'Grátt',F00:'Reytt',FF8C00:'Myrkt appelsingult',FFD700:'Gull','008000':'Grønt','0FF':'Cyan','00F':'Blátt',EE82EE:'Violet',A9A9A9:'Døkt grátt',FFA07A:'Ljósur laksur',FFA500:'Appelsingult',FFFF00:'Gult','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Ljósablátt',DDA0DD:'Plum',D3D3D3:'Ljósagrátt',FFF0F5:'Lavender Blush',FAEBD7:'Klassiskt hvítt',FFFFE0:'Ljósagult',F0FFF0:'Hunangsdøggur',F0FFFF:'Azure',F0F8FF:'Alice Blátt',E6E6FA:'Lavender',FFF:'Hvítt'},scayt:{title:'Kanna stavseting, meðan tú skrivar',opera_title:'Ikki stuðlað í Opera',enable:'Loyv SCAYT',disable:'Nokta SCAYT',about:'Um SCAYT',toggle:'Toggle SCAYT',options:'Uppseting',langs:'Tungumál',moreSuggestions:'Fleiri tilráðingar',ignore:'Ignorera',ignoreAll:'Ignorera alt',addWord:'Legg orð afturat',emptyDic:'Heiti á orðabók eigur ikki at vera tómt.',optionsTab:'Uppseting',allCaps:'Loyp orð við bert stórum stavum um',ignoreDomainNames:'loyp økisnøvn um',mixedCase:'Loyp orð við blandaðum smáum og stórum stavum um',mixedWithDigits:'Loyp orð við tølum um',languagesTab:'Tungumál',dictionariesTab:'Orðabøkur',dic_field_name:'Orðabókanavn',dic_create:'Upprætta nýggja',dic_restore:'Endurskapa',dic_delete:'Strika',dic_rename:'Broyt',dic_info:'Upprunaliga er brúkara-orðabókin goymd í eini cookie í tínum egna kaga. Men hesar cookies eru avmarkaðar í stødd. Tá brúkara-orðabókin veksur seg ov stóra til eina cookie, so er møguligt at goyma hana á ambætara okkara. Fyri at goyma persónligu orðabókina á ambætaranum eigur tú at velja eitt navn til tína skuffu. Hevur tú longu goymt eina orðabók, so vinarliga skriva navnið og klikk á knøttin Endurskapa.',aboutTab:'Um'},about:{title:'Um CKEditor',dlgTitle:'Um CKEditor',help:'Kekka $1 fyri hjálp.',userGuide:'CKEditor Brúkaravegleiðing',moreInfo:'Licens upplýsingar finnast á heimasíðu okkara:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maksimera',minimize:'Minimera',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Fjaldur teigur',unknown:'Ókent Object'},resize:'Drag fyri at broyta stødd',colordialog:{title:'Vel lit',options:'Litmøguleikar',highlight:'Framheva',selected:'Valdur litur',clear:'Strika'},toolbarCollapse:'Lat Toolbar aftur',toolbarExpand:'Vís Toolbar',toolbarGroups:{document:'Dokument',clipboard:'Clipboard/Undo',editing:'Editering',forms:'Formar',basicstyles:'Grundleggjandi Styles',paragraph:'Reglubrot',links:'Leinkjur',insert:'Set inn',styles:'Styles',colors:'Litir',tools:'Tól'},bidi:{ltr:'Tekstkós frá vinstru til høgru',rtl:'Tekstkós frá høgru til vinstru'},docprops:{label:'Eginleikar fyri dokument',title:'Eginleikar fyri dokument',design:'Design',meta:'META-upplýsingar',chooseColor:'Vel',other:'<annað>',docTitle:'Síðuheiti',charset:'Teknsett koda',charsetOther:'Onnur teknsett koda',charsetASCII:'ASCII',charsetCE:'Miðeuropa',charsetCT:'Kinesiskt traditionelt (Big5)',charsetCR:'Cyrilliskt',charsetGR:'Grikst',charsetJP:'Japanskt',charsetKR:'Koreanskt',charsetTR:'Turkiskt',charsetUN:'Unicode (UTF-8)',charsetWE:'Vestureuropa',docType:'Dokumentslag yvirskrift',docTypeOther:'Annað dokumentslag yvirskrift',xhtmlDec:'Viðfest XHTML deklaratiónir',bgColor:'Bakgrundslitur',bgImage:'Leið til bakgrundsmynd (URL)',bgFixed:'Læst bakgrund (rullar ikki)',txtColor:'Tekstlitur',margin:'Síðubreddar',marginTop:'Ovast',marginLeft:'Vinstra',marginRight:'Høgra',marginBottom:'Niðast',metaKeywords:'Dokument index lyklaorð (sundurbýtt við komma)',metaDescription:'Dokumentlýsing',metaAuthor:'Høvundur',metaCopyright:'Upphavsrættindi',previewHtml:'<p>Hetta er ein <strong>royndartekstur</strong>. Tygum brúka <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.fo={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Kelda',newPage:'Nýggj síða',save:'Goym',preview:'Frumsýning',cut:'Kvett',copy:'Avrita',paste:'Innrita',print:'Prenta',underline:'Undirstrikað',bold:'Feit skrift',italic:'Skráskrift',selectAll:'Markera alt',removeFormat:'Strika sniðgeving',strike:'Yvirstrikað',subscript:'Lækkað skrift',superscript:'Hækkað skrift',horizontalrule:'Ger vatnrætta linju',pagebreak:'Ger síðuskift',pagebreakAlt:'Síðuskift',unlink:'Strika tilknýti',undo:'Angra',redo:'Vend aftur',common:{browseServer:'Ambætarakagi',url:'URL',protocol:'Protokoll',upload:'Send til ambætaran',uploadSubmit:'Send til ambætaran',image:'Myndir',flash:'Flash',form:'Formur',checkbox:'Flugubein',radio:'Radioknøttur',textField:'Tekstteigur',textarea:'Tekstumráði',hiddenField:'Fjaldur teigur',button:'Knøttur',select:'Valskrá',imageButton:'Myndaknøttur',notSet:'<ikki sett>',id:'Id',name:'Navn',langDir:'Tekstkós',langDirLtr:'Frá vinstru til høgru (LTR)',langDirRtl:'Frá høgru til vinstru (RTL)',langCode:'Málkoda',longDescr:'Víðkað URL frágreiðing',cssClass:'Typografi klassar',advisoryTitle:'Vegleiðandi heiti',cssStyle:'Typografi',ok:'Góðkent',cancel:'Avlýst',close:'Lat aftur',preview:'Frumsýn',generalTab:'Generelt',advancedTab:'Fjølbroytt',validateNumberFailed:'Hetta er ikki eitt tal.',confirmNewPage:'Allar ikki goymdar broytingar í hesum innihaldið hvørva. Skal nýggj síða lesast kortini?',confirmCancel:'Nakrir valmøguleikar eru broyttir. Ert tú vísur í, at dialogurin skal latast aftur?',options:'Options',target:'Target',targetNew:'Nýtt vindeyga (_blank)',targetTop:'Vindeyga ovast (_top)',targetSelf:'Sama vindeyga (_self)',targetParent:'Upphavligt vindeyga (_parent)',langDirLTR:'Frá vinstru til høgru (LTR)',langDirRTL:'Frá høgru til vinstru (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Breidd',height:'Hædd',align:'Justering',alignLeft:'Vinstra',alignRight:'Høgra',alignCenter:'Miðsett',alignTop:'Ovast',alignMiddle:'Miðja',alignBottom:'Botnur',invalidHeight:'Hædd má vera eitt tal.',invalidWidth:'Breidd má vera eitt tal.',invalidCssLength:'Virðið sett í "%1" feltið má vera eitt positivt tal, við ella uttan gyldugum CSS mátieind (px, %, in, cm, mm, em, ex, pt, ella pc).',invalidHtmlLength:'Virðið sett í "%1" feltiðield má vera eitt positivt tal, við ella uttan gyldugum CSS mátieind (px ella %).',invalidInlineStyle:'Virði specifiserað fyri inline style má hava eitt ella fleiri pør (tuples) skrivað sum "name : value", hvørt parið sundurskilt við semi-colon.',cssLengthTooltip:'Skriva eitt tal fyri eitt virði í pixels ella eitt tal við gyldigum CSS eind (px, %, in, cm, mm, em, ex, pt, ella pc).',unavailable:'%1<span class="cke_accessibility">, ikki tøkt</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Set inn sertekn',title:'Vel sertekn',options:'Møguleikar við serteknum'},link:{toolbar:'Ger/broyt tilknýti',other:'<annað>',menu:'Broyt tilknýti',title:'Tilknýti',info:'Tilknýtis upplýsingar',target:'Target',upload:'Send til ambætaran',advanced:'Fjølbroytt',type:'Tilknýtisslag',toUrl:'URL',toAnchor:'Tilknýti til marknastein í tekstinum',toEmail:'Teldupostur',targetFrame:'<ramma>',targetPopup:'<popup vindeyga>',targetFrameName:'Vís navn vindeygans',targetPopupName:'Popup vindeygans navn',popupFeatures:'Popup vindeygans víðkaðu eginleikar',popupResizable:'Stødd kann broytast',popupStatusBar:'Støðufrágreiðingarbjálki',popupLocationBar:'Adressulinja',popupToolbar:'Amboðsbjálki',popupMenuBar:'Skrábjálki',popupFullScreen:'Fullur skermur (IE)',popupScrollBars:'Rullibjálki',popupDependent:'Bundið (Netscape)',popupLeft:'Frástøða frá vinstru',popupTop:'Frástøða frá íerva',id:'Id',langDir:'Tekstkós',langDirLTR:'Frá vinstru til høgru (LTR)',langDirRTL:'Frá høgru til vinstru (RTL)',acccessKey:'Snarvegisknöttur',name:'Navn',langCode:'Tekstkós',tabIndex:'Tabulator indeks',advisoryTitle:'Vegleiðandi heiti',advisoryContentType:'Vegleiðandi innihaldsslag',cssClasses:'Typografi klassar',charset:'Atknýtt teknsett',styles:'Typografi',rel:'Relatión',selectAnchor:'Vel ein marknastein',anchorName:'Eftir navni á marknasteini',anchorId:'Eftir element Id',emailAddress:'Teldupost-adressa',emailSubject:'Evni',emailBody:'Breyðtekstur',noAnchors:'(Eingir marknasteinar eru í hesum dokumentið)',noUrl:'Vinarliga skriva tilknýti (URL)',noEmail:'Vinarliga skriva teldupost-adressu'},anchor:{toolbar:'Ger/broyt marknastein',menu:'Eginleikar fyri marknastein',title:'Eginleikar fyri marknastein',name:'Heiti marknasteinsins',errorName:'Vinarliga rita marknasteinsins heiti',remove:'Strika marknastein'},list:{numberedTitle:'Eginleikar fyri lista við tølum',bulletedTitle:'Eginleikar fyri lista við prikkum',type:'Slag',start:'Byrjan',validateStartNumber:'Byrjunartalið fyri lista má vera eitt heiltal.',circle:'Sirkul',disc:'Disc',square:'Fýrkantur',none:'Einki',notset:'<ikki sett>',armenian:'Armensk talskipan',georgian:'Georgisk talskipan (an, ban, gan, osv.)',lowerRoman:'Lítil rómaratøl (i, ii, iii, iv, v, etc.)',upperRoman:'Stór rómaratøl (I, II, III, IV, V, etc.)',lowerAlpha:'Lítlir bókstavir (a, b, c, d, e, etc.)',upperAlpha:'Stórir bókstavir (A, B, C, D, E, etc.)',lowerGreek:'Grikskt við lítlum (alpha, beta, gamma, etc.)',decimal:'Vanlig tøl (1, 2, 3, etc.)',decimalLeadingZero:'Tøl við null frammanfyri (01, 02, 03, etc.)'},findAndReplace:{title:'Finn og broyt',find:'Leita',replace:'Yvirskriva',findWhat:'Finn:',replaceWith:'Yvirskriva við:',notFoundMsg:'Leititeksturin varð ikki funnin',findOptions:'Finn møguleikar',matchCase:'Munur á stórum og smáum bókstavum',matchWord:'Bert heil orð',matchCyclic:'Match cyclic',replaceAll:'Yvirskriva alt',replaceSuccessMsg:'%1 úrslit broytt.'},table:{toolbar:'Tabell',title:'Eginleikar fyri tabell',menu:'Eginleikar fyri tabell',deleteTable:'Strika tabell',rows:'Røðir',columns:'Kolonnur',border:'Bordabreidd',widthPx:'pixels',widthPc:'prosent',widthUnit:'breiddar unit',cellSpace:'Fjarstøða millum meskar',cellPad:'Meskubreddi',caption:'Tabellfrágreiðing',summary:'Samandráttur',headers:'Yvirskriftir',headersNone:'Eingin',headersColumn:'Fyrsta kolonna',headersRow:'Fyrsta rað',headersBoth:'Báðir',invalidRows:'Talið av røðum má vera eitt tal størri enn 0.',invalidCols:'Talið av kolonnum má vera eitt tal størri enn 0.',invalidBorder:'Borda-stødd má vera eitt tal.',invalidWidth:'Tabell-breidd má vera eitt tal.',invalidHeight:'Tabell-hædd má vera eitt tal.',invalidCellSpacing:'Cell spacing má vera eitt tal.',invalidCellPadding:'Cell padding má vera eitt tal.',cell:{menu:'Meski',insertBefore:'Set meska inn áðrenn',insertAfter:'Set meska inn aftaná',deleteCell:'Strika meskar',merge:'Flætta meskar',mergeRight:'Flætta meskar til høgru',mergeDown:'Flætta saman',splitHorizontal:'Kloyv meska vatnrætt',splitVertical:'Kloyv meska loddrætt',title:'Mesku eginleikar',cellType:'Mesku slag',rowSpan:'Ræð spenni',colSpan:'Kolonnu spenni',wordWrap:'Orðkloyving',hAlign:'Horisontal plasering',vAlign:'Loddrøtt plasering',alignBaseline:'Basislinja',bgColor:'Bakgrundslitur',borderColor:'Bordalitur',data:'Data',header:'Header',yes:'Ja',no:'Nei',invalidWidth:'Meskubreidd má vera eitt tal.',invalidHeight:'Meskuhædd má vera eitt tal.',invalidRowSpan:'Raðspennið má vera eitt heiltal.',invalidColSpan:'Kolonnuspennið má vera eitt heiltal.',chooseColor:'Vel'},row:{menu:'Rað',insertBefore:'Set rað inn áðrenn',insertAfter:'Set rað inn aftaná',deleteRow:'Strika røðir'},column:{menu:'Kolonna',insertBefore:'Set kolonnu inn áðrenn',insertAfter:'Set kolonnu inn aftaná',deleteColumn:'Strika kolonnur'}},button:{title:'Eginleikar fyri knøtt',text:'Tekstur',type:'Slag',typeBtn:'Knøttur',typeSbm:'Send',typeRst:'Nullstilla'},checkboxAndRadio:{checkboxTitle:'Eginleikar fyri flugubein',radioTitle:'Eginleikar fyri radioknøtt',value:'Virði',selected:'Valt'},form:{title:'Eginleikar fyri Form',menu:'Eginleikar fyri Form',action:'Hending',method:'Háttur',encoding:'Encoding'},select:{title:'Eginleikar fyri valskrá',selectInfo:'Upplýsingar',opAvail:'Tøkir møguleikar',value:'Virði',size:'Stødd',lines:'Linjur',chkMulti:'Loyv fleiri valmøguleikum samstundis',opText:'Tekstur',opValue:'Virði',btnAdd:'Legg afturat',btnModify:'Broyt',btnUp:'Upp',btnDown:'Niður',btnSetValue:'Set sum valt virði',btnDelete:'Strika'},textarea:{title:'Eginleikar fyri tekstumráði',cols:'kolonnur',rows:'røðir'},textfield:{title:'Eginleikar fyri tekstteig',name:'Navn',value:'Virði',charWidth:'Breidd (sjónlig tekn)',maxChars:'Mest loyvdu tekn',type:'Slag',typeText:'Tekstur',typePass:'Loyniorð'},hidden:{title:'Eginleikar fyri fjaldan teig',name:'Navn',value:'Virði'},image:{title:'Myndaeginleikar',titleButton:'Eginleikar fyri myndaknøtt',menu:'Myndaeginleikar',infoTab:'Myndaupplýsingar',btnUpload:'Send til ambætaran',upload:'Send',alt:'Alternativur tekstur',lockRatio:'Læs lutfallið',resetSize:'Upprunastødd',border:'Bordi',hSpace:'Høgri breddi',vSpace:'Vinstri breddi',alertUrl:'Rita slóðina til myndina',linkTab:'Tilknýti',button2Img:'Skal valdi myndaknøttur gerast til vanliga mynd?',img2Button:'Skal valda mynd gerast til myndaknøtt?',urlMissing:'URL til mynd manglar.',validateBorder:'Bordi má vera eitt heiltal.',validateHSpace:'HSpace má vera eitt heiltal.',validateVSpace:'VSpace má vera eitt heiltal.'},flash:{properties:'Flash eginleikar',propertiesTab:'Eginleikar',title:'Flash eginleikar',chkPlay:'Avspælingin byrjar sjálv',chkLoop:'Endurspæl',chkMenu:'Ger Flash skrá virkna',chkFull:'Loyv fullan skerm',scale:'Skalering',scaleAll:'Vís alt',scaleNoBorder:'Eingin bordi',scaleFit:'Neyv skalering',access:'Script atgongd',accessAlways:'Altíð',accessSameDomain:'Sama navnaøki',accessNever:'Ongantíð',alignAbsBottom:'Abs botnur',alignAbsMiddle:'Abs miðja',alignBaseline:'Basislinja',alignTextTop:'Tekst toppur',quality:'Góðska',qualityBest:'Besta',qualityHigh:'Høg',qualityAutoHigh:'Auto høg',qualityMedium:'Meðal',qualityAutoLow:'Auto Lág',qualityLow:'Lág',windowModeWindow:'Rútur',windowModeOpaque:'Ikki transparent',windowModeTransparent:'Transparent',windowMode:'Slag av rúti',flashvars:'Variablar fyri Flash',bgcolor:'Bakgrundslitur',hSpace:'Høgri breddi',vSpace:'Vinstri breddi',validateSrc:'Vinarliga skriva tilknýti (URL)',validateHSpace:'HSpace má vera eitt tal.',validateVSpace:'VSpace má vera eitt tal.'},spellCheck:{toolbar:'Kanna stavseting',title:'Kanna stavseting',notAvailable:'Tíverri, ikki tøkt í løtuni.',errorLoading:'Feilur við innlesing av application service host: %s.',notInDic:'Finst ikki í orðabókini',changeTo:'Broyt til',btnIgnore:'Forfjóna',btnIgnoreAll:'Forfjóna alt',btnReplace:'Yvirskriva',btnReplaceAll:'Yvirskriva alt',btnUndo:'Angra',noSuggestions:'- Einki uppskot -',progress:'Rættstavarin arbeiðir...',noMispell:'Rættstavarin liðugur: Eingin feilur funnin',noChanges:'Rættstavarin liðugur: Einki orð varð broytt',oneChange:'Rættstavarin liðugur: Eitt orð er broytt',manyChanges:'Rættstavarin liðugur: %1 orð broytt',ieSpellDownload:'Rættstavarin er ikki tøkur í tekstviðgeranum. Vilt tú heinta hann nú?'},smiley:{toolbar:'Smiley',title:'Vel Smiley',options:'Møguleikar fyri Smiley'},elementsPath:{eleLabel:'Slóð til elementir',eleTitle:'%1 element'},numberedlist:'Talmerktur listi',bulletedlist:'Punktmerktur listi',indent:'Økja reglubrotarinntriv',outdent:'Minka reglubrotarinntriv',justify:{left:'Vinstrasett',center:'Miðsett',right:'Høgrasett',block:'Javnir tekstkantar'},blockquote:'Blockquote',clipboard:{title:'Innrita',cutError:'Trygdaruppseting alnótskagans forðar tekstviðgeranum í at kvetta tekstin. Vinarliga nýt knappaborðið til at kvetta tekstin (Ctrl/Cmd+X).',copyError:'Trygdaruppseting alnótskagans forðar tekstviðgeranum í at avrita tekstin. Vinarliga nýt knappaborðið til at avrita tekstin (Ctrl/Cmd+C).',pasteMsg:'Vinarliga koyr tekstin í hendan rútin við knappaborðinum (<strong>Ctrl/Cmd+V</strong>) og klikk á <strong>Góðtak</strong>.',securityMsg:'Trygdaruppseting alnótskagans forðar tekstviðgeranum í beinleiðis atgongd til avritingarminnið. Tygum mugu royna aftur í hesum rútinum.',pasteArea:'Avritingarumráði'},pastefromword:{confirmCleanup:'Teksturin, tú roynir at seta inn, sýnist at stava frá Word. Skal teksturin reinsast fyrst?',toolbar:'Innrita frá Word',title:'Innrita frá Word',error:'Tað eydnaðist ikki at reinsa tekstin vegna ein internan feil'},pasteText:{button:'Innrita som reinan tekst',title:'Innrita som reinan tekst'},templates:{button:'Skabelónir',title:'Innihaldsskabelónir',options:'Møguleikar fyri Template',insertOption:'Yvirskriva núverandi innihald',selectPromptMsg:'Vinarliga vel ta skabelón, ið skal opnast í tekstviðgeranum<br>(Hetta yvirskrivar núverandi innihald):',emptyListMsg:'(Ongar skabelónir tøkar)'},showBlocks:'Vís blokkar',stylesCombo:{label:'Typografi',panelTitle:'Formatterings stílir',panelTitle1:'Blokk stílir',panelTitle2:'Inline stílir',panelTitle3:'Object stílir'},format:{label:'Skriftsnið',panelTitle:'Skriftsnið',tag_p:'Vanligt',tag_pre:'Sniðgivið',tag_address:'Adressa',tag_h1:'Yvirskrift 1',tag_h2:'Yvirskrift 2',tag_h3:'Yvirskrift 3',tag_h4:'Yvirskrift 4',tag_h5:'Yvirskrift 5',tag_h6:'Yvirskrift 6',tag_div:'Vanligt (DIV)'},div:{title:'Ger Div Container',toolbar:'Ger Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Vinstru til høgru (LTR)',langDirRTLLabel:'Høgru til vinstru (RTL)',edit:'Redigera Div',remove:'Strika Div'},iframe:{title:'Møguleikar fyri IFrame',toolbar:'IFrame',noUrl:'Vinarliga skriva URL til iframe',scrolling:'Loyv scrollbars',border:'Vís frame kant'},font:{label:'Skrift',voiceLabel:'Skrift',panelTitle:'Skrift'},fontSize:{label:'Skriftstødd',voiceLabel:'Skriftstødd',panelTitle:'Skriftstødd'},colorButton:{textColorTitle:'Tekstlitur',bgColorTitle:'Bakgrundslitur',panelTitle:'Litir',auto:'Automatiskt',more:'Fleiri litir...'},colors:{'000':'Svart',800000:'Maroon','8B4513':'Saðilsbrúnt','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Myrkagrátt',B22222:'Fire Brick',A52A2A:'Brúnt',DAA520:'Gullstavur','006400':'Myrkagrønt','40E0D0':'Turquoise','0000CD':'Meðal blátt',800080:'Purple',808080:'Grátt',F00:'Reytt',FF8C00:'Myrkt appelsingult',FFD700:'Gull','008000':'Grønt','0FF':'Cyan','00F':'Blátt',EE82EE:'Violet',A9A9A9:'Døkt grátt',FFA07A:'Ljósur laksur',FFA500:'Appelsingult',FFFF00:'Gult','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Ljósablátt',DDA0DD:'Plum',D3D3D3:'Ljósagrátt',FFF0F5:'Lavender Blush',FAEBD7:'Klassiskt hvítt',FFFFE0:'Ljósagult',F0FFF0:'Hunangsdøggur',F0FFFF:'Azure',F0F8FF:'Alice Blátt',E6E6FA:'Lavender',FFF:'Hvítt'},scayt:{title:'Kanna stavseting, meðan tú skrivar',opera_title:'Ikki stuðlað í Opera',enable:'Loyv SCAYT',disable:'Nokta SCAYT',about:'Um SCAYT',toggle:'Toggle SCAYT',options:'Uppseting',langs:'Tungumál',moreSuggestions:'Fleiri tilráðingar',ignore:'Ignorera',ignoreAll:'Ignorera alt',addWord:'Legg orð afturat',emptyDic:'Heiti á orðabók eigur ikki at vera tómt.',optionsTab:'Uppseting',allCaps:'Loyp orð við bert stórum stavum um',ignoreDomainNames:'loyp økisnøvn um',mixedCase:'Loyp orð við blandaðum smáum og stórum stavum um',mixedWithDigits:'Loyp orð við tølum um',languagesTab:'Tungumál',dictionariesTab:'Orðabøkur',dic_field_name:'Orðabókanavn',dic_create:'Upprætta nýggja',dic_restore:'Endurskapa',dic_delete:'Strika',dic_rename:'Broyt',dic_info:'Upprunaliga er brúkara-orðabókin goymd í eini cookie í tínum egna kaga. Men hesar cookies eru avmarkaðar í stødd. Tá brúkara-orðabókin veksur seg ov stóra til eina cookie, so er møguligt at goyma hana á ambætara okkara. Fyri at goyma persónligu orðabókina á ambætaranum eigur tú at velja eitt navn til tína skuffu. Hevur tú longu goymt eina orðabók, so vinarliga skriva navnið og klikk á knøttin Endurskapa.',aboutTab:'Um'},about:{title:'Um CKEditor',dlgTitle:'Um CKEditor',help:'Kekka $1 fyri hjálp.',userGuide:'CKEditor Brúkaravegleiðing',moreInfo:'Licens upplýsingar finnast á heimasíðu okkara:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maksimera',minimize:'Minimera',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Fjaldur teigur',unknown:'Ókent Object'},resize:'Drag fyri at broyta stødd',colordialog:{title:'Vel lit',options:'Litmøguleikar',highlight:'Framheva',selected:'Valdur litur',clear:'Strika'},toolbarCollapse:'Lat Toolbar aftur',toolbarExpand:'Vís Toolbar',toolbarGroups:{document:'Dokument',clipboard:'Clipboard/Undo',editing:'Editering',forms:'Formar',basicstyles:'Grundleggjandi Styles',paragraph:'Reglubrot',links:'Leinkjur',insert:'Set inn',styles:'Styles',colors:'Litir',tools:'Tól'},bidi:{ltr:'Tekstkós frá vinstru til høgru',rtl:'Tekstkós frá høgru til vinstru'},docprops:{label:'Eginleikar fyri dokument',title:'Eginleikar fyri dokument',design:'Design',meta:'META-upplýsingar',chooseColor:'Vel',other:'<annað>',docTitle:'Síðuheiti',charset:'Teknsett koda',charsetOther:'Onnur teknsett koda',charsetASCII:'ASCII',charsetCE:'Miðeuropa',charsetCT:'Kinesiskt traditionelt (Big5)',charsetCR:'Cyrilliskt',charsetGR:'Grikst',charsetJP:'Japanskt',charsetKR:'Koreanskt',charsetTR:'Turkiskt',charsetUN:'Unicode (UTF-8)',charsetWE:'Vestureuropa',docType:'Dokumentslag yvirskrift',docTypeOther:'Annað dokumentslag yvirskrift',xhtmlDec:'Viðfest XHTML deklaratiónir',bgColor:'Bakgrundslitur',bgImage:'Leið til bakgrundsmynd (URL)',bgFixed:'Læst bakgrund (rullar ikki)',txtColor:'Tekstlitur',margin:'Síðubreddar',marginTop:'Ovast',marginLeft:'Vinstra',marginRight:'Høgra',marginBottom:'Niðast',metaKeywords:'Dokument index lyklaorð (sundurbýtt við komma)',metaDescription:'Dokumentlýsing',metaAuthor:'Høvundur',metaCopyright:'Upphavsrættindi',previewHtml:'<p>Hetta er ein <strong>royndartekstur</strong>. Tygum brúka <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/fr.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/fr.js
index f1b3ce4..4ad2543 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/fr.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/fr.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.fr={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:"Barre d'outils de l'éditeur",editor:'Éditeur de Texte Enrichi',source:'Source',newPage:'Nouvelle page',save:'Enregistrer',preview:'Aperçu',cut:'Couper',copy:'Copier',paste:'Coller',print:'Imprimer',underline:'Souligné',bold:'Gras',italic:'Italique',selectAll:'Tout sélectionner',removeFormat:'Supprimer la mise en forme',strike:'Barré',subscript:'Indice',superscript:'Exposant',horizontalrule:'Ligne horizontale',pagebreak:'Saut de page',pagebreakAlt:'Saut de page',unlink:'Supprimer le lien',undo:'Annuler',redo:'Rétablir',common:{browseServer:'Explorer le serveur',url:'URL',protocol:'Protocole',upload:'Envoyer',uploadSubmit:'Envoyer sur le serveur',image:'Image',flash:'Flash',form:'Formulaire',checkbox:'Case à cocher',radio:'Bouton Radio',textField:'Champ texte',textarea:'Zone de texte',hiddenField:'Champ caché',button:'Bouton',select:'Liste déroulante',imageButton:'Bouton image',notSet:'<non défini>',id:'Id',name:'Nom',langDir:"Sens d'écriture",langDirLtr:'Gauche à droite (LTR)',langDirRtl:'Droite à gauche (RTL)',langCode:'Code de langue',longDescr:'URL de description longue (longdesc => malvoyant)',cssClass:'Classe CSS',advisoryTitle:'Description (title)',cssStyle:'Style',ok:'OK',cancel:'Annuler',close:'Fermer',preview:'Aperçu',generalTab:'Général',advancedTab:'Avancé',validateNumberFailed:"Cette valeur n'est pas un nombre.",confirmNewPage:'Les changements non sauvegardés seront perdus. Êtes-vous sûr de vouloir charger une nouvelle page?',confirmCancel:'Certaines options ont été modifiées. Êtes-vous sûr de vouloir fermer?',options:'Options',target:'Cible (Target)',targetNew:'Nouvelle fenêtre (_blank)',targetTop:'Fenêtre supérieure (_top)',targetSelf:'Même fenêtre (_self)',targetParent:'Fenêtre parent (_parent)',langDirLTR:'Gauche à Droite (LTR)',langDirRTL:'Droite à Gauche (RTL)',styles:'Style',cssClasses:'Classes de style',width:'Largeur',height:'Hauteur',align:'Alignement',alignLeft:'Gauche',alignRight:'Droite',alignCenter:'Centré',alignTop:'Haut',alignMiddle:'Milieu',alignBottom:'Bas',invalidHeight:'La hauteur doit être un nombre.',invalidWidth:'La largeur doit être un nombre.',invalidCssLength:'La valeur spécifiée pour le champ "%1" doit être un nombre positif avec ou sans unité de mesure CSS valide (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'La valeur spécifiée pour le champ "%1" doit être un nombre positif avec ou sans unité de mesure HTML valide (px or %).',invalidInlineStyle:'La valeur spécifiée pour le style inline doit être composée d\'un ou plusieurs couples de valeur au format "nom : valeur", separés par des points-virgules.',cssLengthTooltip:'Entrer un nombre pour une valeur en pixels ou un nombre avec une unité de mesure CSS valide (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, Indisponible</span>'},contextmenu:{options:'Options du menu contextuel'},specialChar:{toolbar:'Insérer un caractère spécial',title:'Sélectionnez un caractère',options:'Options des caractères spéciaux'},link:{toolbar:'Lien',other:'<autre>',menu:'Editer le lien',title:'Lien',info:'Infos sur le lien',target:'Cible',upload:'Envoyer',advanced:'Avancé',type:'Type de lien',toUrl:'URL',toAnchor:'Transformer le lien en ancre dans le texte',toEmail:'E-mail',targetFrame:'<cadre>',targetPopup:'<fenêtre popup>',targetFrameName:'Nom du Cadre destination',targetPopupName:'Nom de la fenêtre popup',popupFeatures:'Options de la fenêtre popup',popupResizable:'Redimensionnable',popupStatusBar:'Barre de status',popupLocationBar:"Barre d'adresse",popupToolbar:"Barre d'outils",popupMenuBar:'Barre de menu',popupFullScreen:'Plein écran (IE)',popupScrollBars:'Barres de défilement',popupDependent:'Dépendante (Netscape)',popupLeft:'Position gauche',popupTop:'Position haute',id:'Id',langDir:"Sens d'écriture",langDirLTR:'Gauche à droite',langDirRTL:'Droite à gauche',acccessKey:"Touche d'accessibilité",name:'Nom',langCode:'Code de langue',tabIndex:'Index de tabulation',advisoryTitle:'Description (title)',advisoryContentType:'Type de contenu (ex: text/html)',cssClasses:'Classe CSS',charset:'Charset de la cible',styles:'Style',rel:'Relation',selectAnchor:"Sélectionner l'ancre",anchorName:"Par nom d'ancre",anchorId:"Par ID d'élément",emailAddress:'Adresse E-Mail',emailSubject:'Sujet du message',emailBody:'Corps du message',noAnchors:'(Aucune ancre disponible dans ce document)',noUrl:"Veuillez entrer l'adresse du lien",noEmail:"Veuillez entrer l'adresse e-mail"},anchor:{toolbar:'Ancre',menu:"Editer l'ancre",title:"Propriétés de l'ancre",name:"Nom de l'ancre",errorName:"Veuillez entrer le nom de l'ancre.",remove:"Supprimer l'ancre"},list:{numberedTitle:'Propriétés de la liste numérotée',bulletedTitle:'Propriétés de la liste à puces',type:'Type',start:'Début',validateStartNumber:'Le premier élément de la liste doit être un nombre entier.',circle:'Cercle',disc:'Disque',square:'Carré',none:'Aucun',notset:'<Non défini>',armenian:'Numération arménienne',georgian:'Numération géorgienne (an, ban, gan, etc.)',lowerRoman:'Nombres romains minuscules (i, ii, iii, iv, v, etc.)',upperRoman:'Nombres romains majuscules (I, II, III, IV, V, etc.)',lowerAlpha:'Alphabétique minuscules (a, b, c, d, e, etc.)',upperAlpha:'Alphabétique majuscules (A, B, C, D, E, etc.)',lowerGreek:'Grec minuscule (alpha, beta, gamma, etc.)',decimal:'Décimal (1, 2, 3, etc.)',decimalLeadingZero:'Décimal précédé par un 0 (01, 02, 03, etc.)'},findAndReplace:{title:'Trouver et remplacer',find:'Trouver',replace:'Remplacer',findWhat:'Expression à trouver: ',replaceWith:'Remplacer par: ',notFoundMsg:'Le texte spécifié ne peut être trouvé.',findOptions:'Options de recherche',matchCase:'Respecter la casse',matchWord:'Mot entier uniquement',matchCyclic:'Boucler',replaceAll:'Remplacer tout',replaceSuccessMsg:'%1 occurrence(s) replacée(s).'},table:{toolbar:'Tableau',title:'Propriétés du tableau',menu:'Propriétés du tableau',deleteTable:'Supprimer le tableau',rows:'Lignes',columns:'Colonnes',border:'Taille de la bordure',widthPx:'pixels',widthPc:'% pourcents',widthUnit:'unité de largeur',cellSpace:'Espacement des cellules',cellPad:'Marge interne des cellules',caption:'Titre du tableau',summary:'Résumé (description)',headers:'En-Têtes',headersNone:'Aucunes',headersColumn:'Première colonne',headersRow:'Première ligne',headersBoth:'Les deux',invalidRows:'Le nombre de lignes doit être supérieur à 0.',invalidCols:'Le nombre de colonnes doit être supérieur à 0.',invalidBorder:'La taille de la bordure doit être un nombre.',invalidWidth:'La largeur du tableau doit être un nombre.',invalidHeight:'La hauteur du tableau doit être un nombre.',invalidCellSpacing:"L'espacement des cellules doit être un nombre positif.",invalidCellPadding:'La marge intérieure des cellules doit être un nombre positif.',cell:{menu:'Cellule',insertBefore:'Insérer une cellule avant',insertAfter:'Insérer une cellule après',deleteCell:'Supprimer les cellules',merge:'Fusionner les cellules',mergeRight:'Fusionner à droite',mergeDown:'Fusionner en bas',splitHorizontal:'Fractionner horizontalement',splitVertical:'Fractionner verticalement',title:'Propriétés de la cellule',cellType:'Type de cellule',rowSpan:'Fusion de lignes',colSpan:'Fusion de colonnes',wordWrap:'Césure',hAlign:'Alignement Horizontal',vAlign:'Alignement Vertical',alignBaseline:'Bas du texte',bgColor:"Couleur d'arrière-plan",borderColor:'Couleur de Bordure',data:'Données',header:'Entête',yes:'Oui',no:'Non',invalidWidth:'La Largeur de Cellule doit être un nombre.',invalidHeight:'La Hauteur de Cellule doit être un nombre.',invalidRowSpan:'La fusion de lignes doit être un nombre entier.',invalidColSpan:'La fusion de colonnes doit être un nombre entier.',chooseColor:'Choisissez'},row:{menu:'Ligne',insertBefore:'Insérer une ligne avant',insertAfter:'Insérer une ligne après',deleteRow:'Supprimer les lignes'},column:{menu:'Colonnes',insertBefore:'Insérer une colonne avant',insertAfter:'Insérer une colonne après',deleteColumn:'Supprimer les colonnes'}},button:{title:'Propriétés du bouton',text:'Texte (Value)',type:'Type',typeBtn:'Bouton',typeSbm:'Validation (submit)',typeRst:'Remise à zéro'},checkboxAndRadio:{checkboxTitle:'Propriétés de la case à cocher',radioTitle:'Propriétés du bouton Radio',value:'Valeur',selected:'Sélectionné'},form:{title:'Propriétés du formulaire',menu:'Propriétés du formulaire',action:'Action',method:'Méthode',encoding:'Encodage'},select:{title:'Propriétés du menu déroulant',selectInfo:'Informations sur le menu déroulant',opAvail:'Options disponibles',value:'Valeur',size:'Taille',lines:'Lignes',chkMulti:'Permettre les sélections multiples',opText:'Texte',opValue:'Valeur',btnAdd:'Ajouter',btnModify:'Modifier',btnUp:'Haut',btnDown:'Bas',btnSetValue:'Définir comme valeur sélectionnée',btnDelete:'Supprimer'},textarea:{title:'Propriétés de la zone de texte',cols:'Colonnes',rows:'Lignes'},textfield:{title:'Propriétés du champ texte',name:'Nom',value:'Valeur',charWidth:'Taille des caractères',maxChars:'Nombre maximum de caractères',type:'Type',typeText:'Texte',typePass:'Mot de passe'},hidden:{title:'Propriétés du champ caché',name:'Nom',value:'Valeur'},image:{title:"Propriétés de l'image",titleButton:'Propriétés du bouton image',menu:"Propriétés de l'image",infoTab:"Informations sur l'image",btnUpload:'Envoyer sur le serveur',upload:'Envoyer',alt:'Texte de remplacement',lockRatio:'Conserver les proportions',resetSize:"Taille d'origine",border:'Bordure',hSpace:'Espacement horizontal',vSpace:'Espacement vertical',alertUrl:"Veuillez entrer l'adresse de l'image",linkTab:'Lien',button2Img:'Voulez-vous transformer le bouton image sélectionné en simple image?',img2Button:"Voulez-vous transformer l'image en bouton image?",urlMissing:"L'adresse source de l'image est manquante.",validateBorder:'Bordure doit être un entier.',validateHSpace:'HSpace doit être un entier.',validateVSpace:'VSpace doit être un entier.'},flash:{properties:'Propriétés du Flash',propertiesTab:'Propriétés',title:'Propriétés du Flash',chkPlay:'Jouer automatiquement',chkLoop:'Boucle',chkMenu:'Activer le menu Flash',chkFull:'Permettre le plein écran',scale:'Echelle',scaleAll:'Afficher tout',scaleNoBorder:'Pas de bordure',scaleFit:"Taille d'origine",access:'Accès aux scripts',accessAlways:'Toujours',accessSameDomain:'Même domaine',accessNever:'Jamais',alignAbsBottom:'Bas absolu',alignAbsMiddle:'Milieu absolu',alignBaseline:'Bas du texte',alignTextTop:'Haut du texte',quality:'Qualité',qualityBest:'Meilleure',qualityHigh:'Haute',qualityAutoHigh:'Haute Auto',qualityMedium:'Moyenne',qualityAutoLow:'Basse Auto',qualityLow:'Basse',windowModeWindow:'Fenêtre',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Mode fenêtre',flashvars:'Variables du Flash',bgcolor:"Couleur d'arrière-plan",hSpace:'Espacement horizontal',vSpace:'Espacement vertical',validateSrc:"L'adresse ne doit pas être vide.",validateHSpace:"L'espacement horizontal doit être un nombre.",validateVSpace:"L'espacement vertical doit être un nombre."},spellCheck:{toolbar:"Vérifier l'orthographe",title:"Vérifier l'orthographe",notAvailable:'Désolé, le service est indisponible actuellement.',errorLoading:"Erreur du chargement du service depuis l'hôte : %s.",notInDic:"N'existe pas dans le dictionnaire.",changeTo:'Modifier pour',btnIgnore:'Ignorer',btnIgnoreAll:'Ignorer tout',btnReplace:'Remplacer',btnReplaceAll:'Remplacer tout',btnUndo:'Annuler',noSuggestions:'- Aucune suggestion -',progress:"Vérification de l'orthographe en cours...",noMispell:"Vérification de l'orthographe terminée : aucune erreur trouvée.",noChanges:"Vérification de l'orthographe terminée : Aucun mot corrigé.",oneChange:"Vérification de l'orthographe terminée : Un seul mot corrigé.",manyChanges:"Vérification de l'orthographe terminée : %1 mots corrigés.",ieSpellDownload:"La vérification d'orthographe n'est pas installée. Voulez-vous la télécharger maintenant?"},smiley:{toolbar:'Émoticones',title:'Insérer un émoticone',options:'Options des émoticones'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 éléments'},numberedlist:'Insérer/Supprimer la liste numérotée',bulletedlist:'Insérer/Supprimer la liste à puces',indent:'Augmenter le retrait (tabulation)',outdent:'Diminuer le retrait (tabulation)',justify:{left:'Aligner à gauche',center:'Centrer',right:'Aligner à droite',block:'Justifier'},blockquote:'Citation',clipboard:{title:'Coller',cutError:"Les paramètres de sécurité de votre navigateur ne permettent pas à l'éditeur d'exécuter automatiquement l'opération \"couper\". Veuillez utiliser le raccourci clavier (Ctrl/Cmd+X).",copyError:"Les paramètres de sécurité de votre navigateur ne permettent pas à l'éditeur d'exécuter automatiquement des opérations de copie. Veuillez utiliser le raccourci clavier (Ctrl/Cmd+C).",pasteMsg:'Veuillez coller le texte dans la zone suivante en utilisant le raccourci clavier (<strong>Ctrl/Cmd+V</strong>) et cliquez sur OK.',securityMsg:"A cause des paramètres de sécurité de votre navigateur, l'éditeur n'est pas en mesure d'accéder directement à vos données contenues dans le presse-papier. Vous devriez réessayer de coller les données dans la fenêtre.",pasteArea:'Coller la zone'},pastefromword:{confirmCleanup:'Le texte à coller semble provenir de Word. Désirez-vous le nettoyer avant de coller?',toolbar:'Coller depuis Word',title:'Coller depuis Word',error:"Il n'a pas été possible de nettoyer les données collées à la suite d'une erreur interne."},pasteText:{button:'Coller comme texte sans mise en forme',title:'Coller comme texte sans mise en forme'},templates:{button:'Modèles',title:'Contenu des modèles',options:'Options des modèles',insertOption:'Remplacer le contenu actuel',selectPromptMsg:"Veuillez sélectionner le modèle pour l'ouvrir dans l'éditeur",emptyListMsg:'(Aucun modèle disponible)'},showBlocks:'Afficher les blocs',stylesCombo:{label:'Styles',panelTitle:'Styles de mise en page',panelTitle1:'Styles de blocs',panelTitle2:'Styles en ligne',panelTitle3:"Styles d'objet"},format:{label:'Format',panelTitle:'Format de paragraphe',tag_p:'Normal',tag_pre:'Formaté',tag_address:'Adresse',tag_h1:'Titre 1',tag_h2:'Titre 2',tag_h3:'Titre 3',tag_h4:'Titre 4',tag_h5:'Titre 5',tag_h6:'Titre 6',tag_div:'Normal (DIV)'},div:{title:'Créer un container DIV',toolbar:'Créer un container DIV',cssClassInputLabel:'Classe CSS',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:'Code de langue',inlineStyleInputLabel:'Style en ligne',advisoryTitleInputLabel:'Advisory Title',langDirLabel:"Sens d'écriture",langDirLTRLabel:'Gauche à droite (LTR)',langDirRTLLabel:'Droite à gauche (RTL)',edit:'Éditer la DIV',remove:'Enlever la DIV'},iframe:{title:'Propriétés de la IFrame',toolbar:'IFrame',noUrl:"Veuillez entrer l'adresse du lien de la IFrame",scrolling:'Permettre à la barre de défilement',border:'Afficher une bordure de la IFrame'},font:{label:'Police',voiceLabel:'Police',panelTitle:'Style de police'},fontSize:{label:'Taille',voiceLabel:'Taille de police',panelTitle:'Taille de police'},colorButton:{textColorTitle:'Couleur de texte',bgColorTitle:"Couleur d'arrière plan",panelTitle:'Couleurs',auto:'Automatique',more:'Plus de couleurs...'},colors:{'000':'Noir',800000:'Marron','8B4513':'Brun moyen','2F4F4F':'Vert sombre','008080':'Canard','000080':'Bleu marine','4B0082':'Indigo',696969:'Gris foncé',B22222:'Rouge brique',A52A2A:'Brun',DAA520:'Or terni','006400':'Vert foncé','40E0D0':'Turquoise','0000CD':'Bleu royal',800080:'Pourpre',808080:'Gris',F00:'Rouge',FF8C00:'Orange foncé',FFD700:'Or','008000':'Vert','0FF':'Cyan','00F':'Bleu',EE82EE:'Violet',A9A9A9:'Gris moyen',FFA07A:'Saumon',FFA500:'Orange',FFFF00:'Jaune','00FF00':'Lime',AFEEEE:'Turquoise clair',ADD8E6:'Bleu clair',DDA0DD:'Prune',D3D3D3:'Gris clair',FFF0F5:'Fard Lavande',FAEBD7:'Blanc antique',FFFFE0:'Jaune clair',F0FFF0:'Honeydew',F0FFFF:'Azur',F0F8FF:'Bleu Alice',E6E6FA:'Lavande',FFF:'Blanc'},scayt:{title:"Vérification de l'Orthographe en Cours de Frappe (SCAYT)",opera_title:'Non supporté par Opera',enable:'Activer SCAYT',disable:'Désactiver SCAYT',about:'A propos de SCAYT',toggle:'Activer/Désactiver SCAYT',options:'Options',langs:'Langues',moreSuggestions:'Plus de suggestions',ignore:'Ignorer',ignoreAll:'Ignorer Tout',addWord:'Ajouter le mot',emptyDic:'Le nom du dictionnaire ne devrait pas être vide.',optionsTab:'Options',allCaps:'Ignorer les mots entièrement en majuscules',ignoreDomainNames:'Ignorer les noms de domaines',mixedCase:'Ignorer les mots à casse multiple',mixedWithDigits:'Ignorer les mots contenant des chiffres',languagesTab:'Langues',dictionariesTab:'Dictionnaires',dic_field_name:'Nom du dictionnaire',dic_create:'Créer',dic_restore:'Restaurer',dic_delete:'Effacer',dic_rename:'Renommer',dic_info:"Initialement, le dictionnaire de l'utilisateur est stocké dans un cookie. Cependant, les cookies sont limités en taille. Quand le dictionnaire atteint une taille qu'il n'est plus possible de stocker dans un cookie, il peut alors être stocké sur nos serveurs. Afin de stocker votre dictionnaire personnel sur nos serveurs, vous devez spécifier un nom pour ce dictionnaire. Si vous avez déjà un dictionnaire stocké, merci de taper son nom puis cliquer sur Restaurer pour le récupérer.",aboutTab:'À propos de'},about:{title:'À propos de CKEditor',dlgTitle:'À propos de CKEditor',help:"Consulter $1 pour l'aide.",userGuide:"Guide de l'utilisateur CKEditor en anglais",moreInfo:'Pour les informations de licence, veuillez visiter notre site web:',copy:'Copyright © $1. Tous droits réservés.'},maximize:'Agrandir',minimize:'Minimiser',fakeobjects:{anchor:'Ancre',flash:'Animation Flash',iframe:'IFrame',hiddenfield:'Champ caché',unknown:'Objet inconnu'},resize:'Déplacer pour modifier la taille',colordialog:{title:'Choisir une couleur',options:'Option des couleurs',highlight:'Détails',selected:'Couleur choisie',clear:'Effacer'},toolbarCollapse:"Enrouler la barre d'outils",toolbarExpand:"Dérouler la barre d'outils",toolbarGroups:{document:'Document',clipboard:'Presse-papier/Défaire',editing:'Editer',forms:'Formulaires',basicstyles:'Styles de base',paragraph:'Paragraphe',links:'Liens',insert:'Insérer',styles:'Styles',colors:'Couleurs',tools:'Outils'},bidi:{ltr:'Direction du texte de la gauche vers la droite',rtl:'Direction du texte de la droite vers la gauche'},docprops:{label:'Propriétés du document',title:'Propriétés du document',design:'Design',meta:'Métadonnées',chooseColor:'Choisissez',other:'<autre>',docTitle:'Titre de la page',charset:'Encodage de caractère',charsetOther:'Autre encodage de caractère',charsetASCII:'ASCII',charsetCE:'Europe Centrale',charsetCT:'Chinois Traditionnel (Big5)',charsetCR:'Cyrillique',charsetGR:'Grec',charsetJP:'Japonais',charsetKR:'Coréen',charsetTR:'Turc',charsetUN:'Unicode (UTF-8)',charsetWE:'Occidental',docType:'Type de document',docTypeOther:'Autre type de document',xhtmlDec:'Inclure les déclarations XHTML',bgColor:'Couleur de fond',bgImage:'Image de fond',bgFixed:'Image fixe sans défilement',txtColor:'Couleur de texte',margin:'Marges',marginTop:'Haut',marginLeft:'Gauche',marginRight:'Droite',marginBottom:'Bas',metaKeywords:'Mots-clés (séparés par des virgules)',metaDescription:'Description',metaAuthor:'Auteur',metaCopyright:'Copyright',previewHtml:'<p>Ceci est un <strong>texte d\'exemple</strong>. Vous utilisez <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.fr={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:"Barre d'outils de l'éditeur",editor:'Éditeur de Texte Enrichi',source:'Source',newPage:'Nouvelle page',save:'Enregistrer',preview:'Aperçu',cut:'Couper',copy:'Copier',paste:'Coller',print:'Imprimer',underline:'Souligné',bold:'Gras',italic:'Italique',selectAll:'Tout sélectionner',removeFormat:'Supprimer la mise en forme',strike:'Barré',subscript:'Indice',superscript:'Exposant',horizontalrule:'Ligne horizontale',pagebreak:'Saut de page',pagebreakAlt:'Saut de page',unlink:'Supprimer le lien',undo:'Annuler',redo:'Rétablir',common:{browseServer:'Explorer le serveur',url:'URL',protocol:'Protocole',upload:'Envoyer',uploadSubmit:'Envoyer sur le serveur',image:'Image',flash:'Flash',form:'Formulaire',checkbox:'Case à cocher',radio:'Bouton Radio',textField:'Champ texte',textarea:'Zone de texte',hiddenField:'Champ caché',button:'Bouton',select:'Liste déroulante',imageButton:'Bouton image',notSet:'<non défini>',id:'Id',name:'Nom',langDir:"Sens d'écriture",langDirLtr:'Gauche à droite (LTR)',langDirRtl:'Droite à gauche (RTL)',langCode:'Code de langue',longDescr:'URL de description longue (longdesc => malvoyant)',cssClass:'Classe CSS',advisoryTitle:'Description (title)',cssStyle:'Style',ok:'OK',cancel:'Annuler',close:'Fermer',preview:'Aperçu',generalTab:'Général',advancedTab:'Avancé',validateNumberFailed:"Cette valeur n'est pas un nombre.",confirmNewPage:'Les changements non sauvegardés seront perdus. Êtes-vous sûr de vouloir charger une nouvelle page?',confirmCancel:'Certaines options ont été modifiées. Êtes-vous sûr de vouloir fermer?',options:'Options',target:'Cible (Target)',targetNew:'Nouvelle fenêtre (_blank)',targetTop:'Fenêtre supérieure (_top)',targetSelf:'Même fenêtre (_self)',targetParent:'Fenêtre parent (_parent)',langDirLTR:'Gauche à Droite (LTR)',langDirRTL:'Droite à Gauche (RTL)',styles:'Style',cssClasses:'Classes de style',width:'Largeur',height:'Hauteur',align:'Alignement',alignLeft:'Gauche',alignRight:'Droite',alignCenter:'Centré',alignTop:'Haut',alignMiddle:'Milieu',alignBottom:'Bas',invalidHeight:'La hauteur doit être un nombre.',invalidWidth:'La largeur doit être un nombre.',invalidCssLength:'La valeur spécifiée pour le champ "%1" doit être un nombre positif avec ou sans unité de mesure CSS valide (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'La valeur spécifiée pour le champ "%1" doit être un nombre positif avec ou sans unité de mesure HTML valide (px or %).',invalidInlineStyle:'La valeur spécifiée pour le style inline doit être composée d\'un ou plusieurs couples de valeur au format "nom : valeur", separés par des points-virgules.',cssLengthTooltip:'Entrer un nombre pour une valeur en pixels ou un nombre avec une unité de mesure CSS valide (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, Indisponible</span>'},contextmenu:{options:'Options du menu contextuel'},specialChar:{toolbar:'Insérer un caractère spécial',title:'Sélectionnez un caractère',options:'Options des caractères spéciaux'},link:{toolbar:'Lien',other:'<autre>',menu:'Editer le lien',title:'Lien',info:'Infos sur le lien',target:'Cible',upload:'Envoyer',advanced:'Avancé',type:'Type de lien',toUrl:'URL',toAnchor:'Transformer le lien en ancre dans le texte',toEmail:'E-mail',targetFrame:'<cadre>',targetPopup:'<fenêtre popup>',targetFrameName:'Nom du Cadre destination',targetPopupName:'Nom de la fenêtre popup',popupFeatures:'Options de la fenêtre popup',popupResizable:'Redimensionnable',popupStatusBar:'Barre de status',popupLocationBar:"Barre d'adresse",popupToolbar:"Barre d'outils",popupMenuBar:'Barre de menu',popupFullScreen:'Plein écran (IE)',popupScrollBars:'Barres de défilement',popupDependent:'Dépendante (Netscape)',popupLeft:'Position gauche',popupTop:'Position haute',id:'Id',langDir:"Sens d'écriture",langDirLTR:'Gauche à droite',langDirRTL:'Droite à gauche',acccessKey:"Touche d'accessibilité",name:'Nom',langCode:'Code de langue',tabIndex:'Index de tabulation',advisoryTitle:'Description (title)',advisoryContentType:'Type de contenu (ex: text/html)',cssClasses:'Classe CSS',charset:'Charset de la cible',styles:'Style',rel:'Relation',selectAnchor:"Sélectionner l'ancre",anchorName:"Par nom d'ancre",anchorId:"Par ID d'élément",emailAddress:'Adresse E-Mail',emailSubject:'Sujet du message',emailBody:'Corps du message',noAnchors:'(Aucune ancre disponible dans ce document)',noUrl:"Veuillez entrer l'adresse du lien",noEmail:"Veuillez entrer l'adresse e-mail"},anchor:{toolbar:'Ancre',menu:"Editer l'ancre",title:"Propriétés de l'ancre",name:"Nom de l'ancre",errorName:"Veuillez entrer le nom de l'ancre.",remove:"Supprimer l'ancre"},list:{numberedTitle:'Propriétés de la liste numérotée',bulletedTitle:'Propriétés de la liste à puces',type:'Type',start:'Début',validateStartNumber:'Le premier élément de la liste doit être un nombre entier.',circle:'Cercle',disc:'Disque',square:'Carré',none:'Aucun',notset:'<Non défini>',armenian:'Numération arménienne',georgian:'Numération géorgienne (an, ban, gan, etc.)',lowerRoman:'Nombres romains minuscules (i, ii, iii, iv, v, etc.)',upperRoman:'Nombres romains majuscules (I, II, III, IV, V, etc.)',lowerAlpha:'Alphabétique minuscules (a, b, c, d, e, etc.)',upperAlpha:'Alphabétique majuscules (A, B, C, D, E, etc.)',lowerGreek:'Grec minuscule (alpha, beta, gamma, etc.)',decimal:'Décimal (1, 2, 3, etc.)',decimalLeadingZero:'Décimal précédé par un 0 (01, 02, 03, etc.)'},findAndReplace:{title:'Trouver et remplacer',find:'Trouver',replace:'Remplacer',findWhat:'Expression à trouver: ',replaceWith:'Remplacer par: ',notFoundMsg:'Le texte spécifié ne peut être trouvé.',findOptions:'Options de recherche',matchCase:'Respecter la casse',matchWord:'Mot entier uniquement',matchCyclic:'Boucler',replaceAll:'Remplacer tout',replaceSuccessMsg:'%1 occurrence(s) replacée(s).'},table:{toolbar:'Tableau',title:'Propriétés du tableau',menu:'Propriétés du tableau',deleteTable:'Supprimer le tableau',rows:'Lignes',columns:'Colonnes',border:'Taille de la bordure',widthPx:'pixels',widthPc:'% pourcents',widthUnit:'unité de largeur',cellSpace:'Espacement des cellules',cellPad:'Marge interne des cellules',caption:'Titre du tableau',summary:'Résumé (description)',headers:'En-Têtes',headersNone:'Aucunes',headersColumn:'Première colonne',headersRow:'Première ligne',headersBoth:'Les deux',invalidRows:'Le nombre de lignes doit être supérieur à 0.',invalidCols:'Le nombre de colonnes doit être supérieur à 0.',invalidBorder:'La taille de la bordure doit être un nombre.',invalidWidth:'La largeur du tableau doit être un nombre.',invalidHeight:'La hauteur du tableau doit être un nombre.',invalidCellSpacing:"L'espacement des cellules doit être un nombre positif.",invalidCellPadding:'La marge intérieure des cellules doit être un nombre positif.',cell:{menu:'Cellule',insertBefore:'Insérer une cellule avant',insertAfter:'Insérer une cellule après',deleteCell:'Supprimer les cellules',merge:'Fusionner les cellules',mergeRight:'Fusionner à droite',mergeDown:'Fusionner en bas',splitHorizontal:'Fractionner horizontalement',splitVertical:'Fractionner verticalement',title:'Propriétés de la cellule',cellType:'Type de cellule',rowSpan:'Fusion de lignes',colSpan:'Fusion de colonnes',wordWrap:'Césure',hAlign:'Alignement Horizontal',vAlign:'Alignement Vertical',alignBaseline:'Bas du texte',bgColor:"Couleur d'arrière-plan",borderColor:'Couleur de Bordure',data:'Données',header:'Entête',yes:'Oui',no:'Non',invalidWidth:'La Largeur de Cellule doit être un nombre.',invalidHeight:'La Hauteur de Cellule doit être un nombre.',invalidRowSpan:'La fusion de lignes doit être un nombre entier.',invalidColSpan:'La fusion de colonnes doit être un nombre entier.',chooseColor:'Choisissez'},row:{menu:'Ligne',insertBefore:'Insérer une ligne avant',insertAfter:'Insérer une ligne après',deleteRow:'Supprimer les lignes'},column:{menu:'Colonnes',insertBefore:'Insérer une colonne avant',insertAfter:'Insérer une colonne après',deleteColumn:'Supprimer les colonnes'}},button:{title:'Propriétés du bouton',text:'Texte (Value)',type:'Type',typeBtn:'Bouton',typeSbm:'Validation (submit)',typeRst:'Remise à zéro'},checkboxAndRadio:{checkboxTitle:'Propriétés de la case à cocher',radioTitle:'Propriétés du bouton Radio',value:'Valeur',selected:'Sélectionné'},form:{title:'Propriétés du formulaire',menu:'Propriétés du formulaire',action:'Action',method:'Méthode',encoding:'Encodage'},select:{title:'Propriétés du menu déroulant',selectInfo:'Informations sur le menu déroulant',opAvail:'Options disponibles',value:'Valeur',size:'Taille',lines:'Lignes',chkMulti:'Permettre les sélections multiples',opText:'Texte',opValue:'Valeur',btnAdd:'Ajouter',btnModify:'Modifier',btnUp:'Haut',btnDown:'Bas',btnSetValue:'Définir comme valeur sélectionnée',btnDelete:'Supprimer'},textarea:{title:'Propriétés de la zone de texte',cols:'Colonnes',rows:'Lignes'},textfield:{title:'Propriétés du champ texte',name:'Nom',value:'Valeur',charWidth:'Taille des caractères',maxChars:'Nombre maximum de caractères',type:'Type',typeText:'Texte',typePass:'Mot de passe'},hidden:{title:'Propriétés du champ caché',name:'Nom',value:'Valeur'},image:{title:"Propriétés de l'image",titleButton:'Propriétés du bouton image',menu:"Propriétés de l'image",infoTab:"Informations sur l'image",btnUpload:'Envoyer sur le serveur',upload:'Envoyer',alt:'Texte de remplacement',lockRatio:'Conserver les proportions',resetSize:"Taille d'origine",border:'Bordure',hSpace:'Espacement horizontal',vSpace:'Espacement vertical',alertUrl:"Veuillez entrer l'adresse de l'image",linkTab:'Lien',button2Img:'Voulez-vous transformer le bouton image sélectionné en simple image?',img2Button:"Voulez-vous transformer l'image en bouton image?",urlMissing:"L'adresse source de l'image est manquante.",validateBorder:'Bordure doit être un entier.',validateHSpace:'HSpace doit être un entier.',validateVSpace:'VSpace doit être un entier.'},flash:{properties:'Propriétés du Flash',propertiesTab:'Propriétés',title:'Propriétés du Flash',chkPlay:'Jouer automatiquement',chkLoop:'Boucle',chkMenu:'Activer le menu Flash',chkFull:'Permettre le plein écran',scale:'Echelle',scaleAll:'Afficher tout',scaleNoBorder:'Pas de bordure',scaleFit:"Taille d'origine",access:'Accès aux scripts',accessAlways:'Toujours',accessSameDomain:'Même domaine',accessNever:'Jamais',alignAbsBottom:'Bas absolu',alignAbsMiddle:'Milieu absolu',alignBaseline:'Bas du texte',alignTextTop:'Haut du texte',quality:'Qualité',qualityBest:'Meilleure',qualityHigh:'Haute',qualityAutoHigh:'Haute Auto',qualityMedium:'Moyenne',qualityAutoLow:'Basse Auto',qualityLow:'Basse',windowModeWindow:'Fenêtre',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Mode fenêtre',flashvars:'Variables du Flash',bgcolor:"Couleur d'arrière-plan",hSpace:'Espacement horizontal',vSpace:'Espacement vertical',validateSrc:"L'adresse ne doit pas être vide.",validateHSpace:"L'espacement horizontal doit être un nombre.",validateVSpace:"L'espacement vertical doit être un nombre."},spellCheck:{toolbar:"Vérifier l'orthographe",title:"Vérifier l'orthographe",notAvailable:'Désolé, le service est indisponible actuellement.',errorLoading:"Erreur du chargement du service depuis l'hôte : %s.",notInDic:"N'existe pas dans le dictionnaire.",changeTo:'Modifier pour',btnIgnore:'Ignorer',btnIgnoreAll:'Ignorer tout',btnReplace:'Remplacer',btnReplaceAll:'Remplacer tout',btnUndo:'Annuler',noSuggestions:'- Aucune suggestion -',progress:"Vérification de l'orthographe en cours...",noMispell:"Vérification de l'orthographe terminée : aucune erreur trouvée.",noChanges:"Vérification de l'orthographe terminée : Aucun mot corrigé.",oneChange:"Vérification de l'orthographe terminée : Un seul mot corrigé.",manyChanges:"Vérification de l'orthographe terminée : %1 mots corrigés.",ieSpellDownload:"La vérification d'orthographe n'est pas installée. Voulez-vous la télécharger maintenant?"},smiley:{toolbar:'Émoticones',title:'Insérer un émoticone',options:'Options des émoticones'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 éléments'},numberedlist:'Insérer/Supprimer la liste numérotée',bulletedlist:'Insérer/Supprimer la liste à puces',indent:'Augmenter le retrait (tabulation)',outdent:'Diminuer le retrait (tabulation)',justify:{left:'Aligner à gauche',center:'Centrer',right:'Aligner à droite',block:'Justifier'},blockquote:'Citation',clipboard:{title:'Coller',cutError:"Les paramètres de sécurité de votre navigateur ne permettent pas à l'éditeur d'exécuter automatiquement l'opération \"couper\". Veuillez utiliser le raccourci clavier (Ctrl/Cmd+X).",copyError:"Les paramètres de sécurité de votre navigateur ne permettent pas à l'éditeur d'exécuter automatiquement des opérations de copie. Veuillez utiliser le raccourci clavier (Ctrl/Cmd+C).",pasteMsg:'Veuillez coller le texte dans la zone suivante en utilisant le raccourci clavier (<strong>Ctrl/Cmd+V</strong>) et cliquez sur OK.',securityMsg:"A cause des paramètres de sécurité de votre navigateur, l'éditeur n'est pas en mesure d'accéder directement à vos données contenues dans le presse-papier. Vous devriez réessayer de coller les données dans la fenêtre.",pasteArea:'Coller la zone'},pastefromword:{confirmCleanup:'Le texte à coller semble provenir de Word. Désirez-vous le nettoyer avant de coller?',toolbar:'Coller depuis Word',title:'Coller depuis Word',error:"Il n'a pas été possible de nettoyer les données collées à la suite d'une erreur interne."},pasteText:{button:'Coller comme texte sans mise en forme',title:'Coller comme texte sans mise en forme'},templates:{button:'Modèles',title:'Contenu des modèles',options:'Options des modèles',insertOption:'Remplacer le contenu actuel',selectPromptMsg:"Veuillez sélectionner le modèle pour l'ouvrir dans l'éditeur",emptyListMsg:'(Aucun modèle disponible)'},showBlocks:'Afficher les blocs',stylesCombo:{label:'Styles',panelTitle:'Styles de mise en page',panelTitle1:'Styles de blocs',panelTitle2:'Styles en ligne',panelTitle3:"Styles d'objet"},format:{label:'Format',panelTitle:'Format de paragraphe',tag_p:'Normal',tag_pre:'Formaté',tag_address:'Adresse',tag_h1:'Titre 1',tag_h2:'Titre 2',tag_h3:'Titre 3',tag_h4:'Titre 4',tag_h5:'Titre 5',tag_h6:'Titre 6',tag_div:'Normal (DIV)'},div:{title:'Créer un container DIV',toolbar:'Créer un container DIV',cssClassInputLabel:'Classe CSS',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:'Code de langue',inlineStyleInputLabel:'Style en ligne',advisoryTitleInputLabel:'Advisory Title',langDirLabel:"Sens d'écriture",langDirLTRLabel:'Gauche à droite (LTR)',langDirRTLLabel:'Droite à gauche (RTL)',edit:'Éditer la DIV',remove:'Enlever la DIV'},iframe:{title:'Propriétés de la IFrame',toolbar:'IFrame',noUrl:"Veuillez entrer l'adresse du lien de la IFrame",scrolling:'Permettre à la barre de défilement',border:'Afficher une bordure de la IFrame'},font:{label:'Police',voiceLabel:'Police',panelTitle:'Style de police'},fontSize:{label:'Taille',voiceLabel:'Taille de police',panelTitle:'Taille de police'},colorButton:{textColorTitle:'Couleur de texte',bgColorTitle:"Couleur d'arrière plan",panelTitle:'Couleurs',auto:'Automatique',more:'Plus de couleurs...'},colors:{'000':'Noir',800000:'Marron','8B4513':'Brun moyen','2F4F4F':'Vert sombre','008080':'Canard','000080':'Bleu marine','4B0082':'Indigo',696969:'Gris foncé',B22222:'Rouge brique',A52A2A:'Brun',DAA520:'Or terni','006400':'Vert foncé','40E0D0':'Turquoise','0000CD':'Bleu royal',800080:'Pourpre',808080:'Gris',F00:'Rouge',FF8C00:'Orange foncé',FFD700:'Or','008000':'Vert','0FF':'Cyan','00F':'Bleu',EE82EE:'Violet',A9A9A9:'Gris moyen',FFA07A:'Saumon',FFA500:'Orange',FFFF00:'Jaune','00FF00':'Lime',AFEEEE:'Turquoise clair',ADD8E6:'Bleu clair',DDA0DD:'Prune',D3D3D3:'Gris clair',FFF0F5:'Fard Lavande',FAEBD7:'Blanc antique',FFFFE0:'Jaune clair',F0FFF0:'Honeydew',F0FFFF:'Azur',F0F8FF:'Bleu Alice',E6E6FA:'Lavande',FFF:'Blanc'},scayt:{title:"Vérification de l'Orthographe en Cours de Frappe (SCAYT)",opera_title:'Non supporté par Opera',enable:'Activer SCAYT',disable:'Désactiver SCAYT',about:'A propos de SCAYT',toggle:'Activer/Désactiver SCAYT',options:'Options',langs:'Langues',moreSuggestions:'Plus de suggestions',ignore:'Ignorer',ignoreAll:'Ignorer Tout',addWord:'Ajouter le mot',emptyDic:'Le nom du dictionnaire ne devrait pas être vide.',optionsTab:'Options',allCaps:'Ignorer les mots entièrement en majuscules',ignoreDomainNames:'Ignorer les noms de domaines',mixedCase:'Ignorer les mots à casse multiple',mixedWithDigits:'Ignorer les mots contenant des chiffres',languagesTab:'Langues',dictionariesTab:'Dictionnaires',dic_field_name:'Nom du dictionnaire',dic_create:'Créer',dic_restore:'Restaurer',dic_delete:'Effacer',dic_rename:'Renommer',dic_info:"Initialement, le dictionnaire de l'utilisateur est stocké dans un cookie. Cependant, les cookies sont limités en taille. Quand le dictionnaire atteint une taille qu'il n'est plus possible de stocker dans un cookie, il peut alors être stocké sur nos serveurs. Afin de stocker votre dictionnaire personnel sur nos serveurs, vous devez spécifier un nom pour ce dictionnaire. Si vous avez déjà un dictionnaire stocké, merci de taper son nom puis cliquer sur Restaurer pour le récupérer.",aboutTab:'À propos de'},about:{title:'À propos de CKEditor',dlgTitle:'À propos de CKEditor',help:"Consulter $1 pour l'aide.",userGuide:"Guide de l'utilisateur CKEditor en anglais",moreInfo:'Pour les informations de licence, veuillez visiter notre site web:',copy:'Copyright © $1. Tous droits réservés.'},maximize:'Agrandir',minimize:'Minimiser',fakeobjects:{anchor:'Ancre',flash:'Animation Flash',iframe:'IFrame',hiddenfield:'Champ caché',unknown:'Objet inconnu'},resize:'Déplacer pour modifier la taille',colordialog:{title:'Choisir une couleur',options:'Option des couleurs',highlight:'Détails',selected:'Couleur choisie',clear:'Effacer'},toolbarCollapse:"Enrouler la barre d'outils",toolbarExpand:"Dérouler la barre d'outils",toolbarGroups:{document:'Document',clipboard:'Presse-papier/Défaire',editing:'Editer',forms:'Formulaires',basicstyles:'Styles de base',paragraph:'Paragraphe',links:'Liens',insert:'Insérer',styles:'Styles',colors:'Couleurs',tools:'Outils'},bidi:{ltr:'Direction du texte de la gauche vers la droite',rtl:'Direction du texte de la droite vers la gauche'},docprops:{label:'Propriétés du document',title:'Propriétés du document',design:'Design',meta:'Métadonnées',chooseColor:'Choisissez',other:'<autre>',docTitle:'Titre de la page',charset:'Encodage de caractère',charsetOther:'Autre encodage de caractère',charsetASCII:'ASCII',charsetCE:'Europe Centrale',charsetCT:'Chinois Traditionnel (Big5)',charsetCR:'Cyrillique',charsetGR:'Grec',charsetJP:'Japonais',charsetKR:'Coréen',charsetTR:'Turc',charsetUN:'Unicode (UTF-8)',charsetWE:'Occidental',docType:'Type de document',docTypeOther:'Autre type de document',xhtmlDec:'Inclure les déclarations XHTML',bgColor:'Couleur de fond',bgImage:'Image de fond',bgFixed:'Image fixe sans défilement',txtColor:'Couleur de texte',margin:'Marges',marginTop:'Haut',marginLeft:'Gauche',marginRight:'Droite',marginBottom:'Bas',metaKeywords:'Mots-clés (séparés par des virgules)',metaDescription:'Description',metaAuthor:'Auteur',metaCopyright:'Copyright',previewHtml:'<p>Ceci est un <strong>texte d\'exemple</strong>. Vous utilisez <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/fr-ca.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/fr-ca.js
index 09e9922..6cb0e11 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/fr-ca.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/fr-ca.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang['fr-ca']={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Source',newPage:'Nouvelle page',save:'Sauvegarder',preview:'Previsualiser',cut:'Couper',copy:'Copier',paste:'Coller',print:'Imprimer',underline:'Souligné',bold:'Gras',italic:'Italique',selectAll:'Tout sélectionner',removeFormat:'Supprimer le formatage',strike:'Barrer',subscript:'Indice',superscript:'Exposant',horizontalrule:'Insérer un séparateur',pagebreak:'Insérer un saut de page',pagebreakAlt:'Page Break',unlink:'Supprimer le lien',undo:'Annuler',redo:'Refaire',common:{browseServer:'Parcourir le serveur',url:'URL',protocol:'Protocole',upload:'Télécharger',uploadSubmit:'Envoyer sur le serveur',image:'Image',flash:'Animation Flash',form:'Formulaire',checkbox:'Case à cocher',radio:'Bouton radio',textField:'Champ texte',textarea:'Zone de texte',hiddenField:'Champ caché',button:'Bouton',select:'Champ de sélection',imageButton:'Bouton image',notSet:'<Par défaut>',id:'Id',name:'Nom',langDir:"Sens d'écriture",langDirLtr:'De gauche à droite (LTR)',langDirRtl:'De droite à gauche (RTL)',langCode:'Code langue',longDescr:'URL de description longue',cssClass:'Classes de feuilles de style',advisoryTitle:'Titre',cssStyle:'Style',ok:'OK',cancel:'Annuler',close:'Close',preview:'Preview',generalTab:'Général',advancedTab:'Avancée',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Largeur',height:'Hauteur',align:'Alignement',alignLeft:'Gauche',alignRight:'Droite',alignCenter:'Centré',alignTop:'Haut',alignMiddle:'Milieu',alignBottom:'Bas',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Insérer un caractère spécial',title:'Insérer un caractère spécial',options:'Special Character Options'},link:{toolbar:'Insérer/modifier le lien',other:'<other>',menu:'Modifier le lien',title:'Propriétés du lien',info:'Informations sur le lien',target:'Destination',upload:'Télécharger',advanced:'Avancée',type:'Type de lien',toUrl:'URL',toAnchor:'Ancre dans cette page',toEmail:'E-Mail',targetFrame:'<Cadre>',targetPopup:'<fenêtre popup>',targetFrameName:'Nom du cadre de destination',targetPopupName:'Nom de la fenêtre popup',popupFeatures:'Caractéristiques de la fenêtre popup',popupResizable:'Resizable',popupStatusBar:"Barre d'état",popupLocationBar:"Barre d'adresses",popupToolbar:"Barre d'outils",popupMenuBar:'Barre de menu',popupFullScreen:'Plein écran (IE)',popupScrollBars:'Barres de défilement',popupDependent:'Dépendante (Netscape)',popupLeft:'Position à partir de la gauche',popupTop:'Position à partir du haut',id:'Id',langDir:"Sens d'écriture",langDirLTR:'De gauche à droite (LTR)',langDirRTL:'De droite à gauche (RTL)',acccessKey:'Équivalent clavier',name:'Nom',langCode:"Sens d'écriture",tabIndex:'Ordre de tabulation',advisoryTitle:'Titre',advisoryContentType:'Type de contenu',cssClasses:'Classes de feuilles de style',charset:'Encodage de caractère',styles:'Style',rel:'Relationship',selectAnchor:'Sélectionner une ancre',anchorName:'Par nom',anchorId:'Par id',emailAddress:'Adresse E-Mail',emailSubject:'Sujet du message',emailBody:'Corps du message',noAnchors:"(Pas d'ancre disponible dans le document)",noUrl:"Veuillez saisir l'URL",noEmail:"Veuillez saisir l'adresse e-mail"},anchor:{toolbar:"Insérer/modifier l'ancre",menu:"Propriétés de l'ancre",title:"Propriétés de l'ancre",name:"Nom de l'ancre",errorName:"Veuillez saisir le nom de l'ancre",remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Chercher et Remplacer',find:'Chercher',replace:'Remplacer',findWhat:'Rechercher:',replaceWith:'Remplacer par:',notFoundMsg:'Le texte indiqué est introuvable.',findOptions:'Find Options',matchCase:'Respecter la casse',matchWord:'Mot entier',matchCyclic:'Match cyclic',replaceAll:'Tout remplacer',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Tableau',title:'Propriétés du tableau',menu:'Propriétés du tableau',deleteTable:'Supprimer le tableau',rows:'Lignes',columns:'Colonnes',border:'Taille de la bordure',widthPx:'pixels',widthPc:'pourcentage',widthUnit:'width unit',cellSpace:'Espacement',cellPad:'Contour',caption:'Titre',summary:'Résumé',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Cellule',insertBefore:'Insérer une cellule avant',insertAfter:'Insérer une cellule après',deleteCell:'Supprimer des cellules',merge:'Fusionner les cellules',mergeRight:'Fusionner à droite',mergeDown:'Fusionner en bas',splitHorizontal:'Scinder la cellule horizontalement',splitVertical:'Scinder la cellule verticalement',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Ligne',insertBefore:'Insérer une ligne avant',insertAfter:'Insérer une ligne après',deleteRow:'Supprimer des lignes'},column:{menu:'Colonne',insertBefore:'Insérer une colonne avant',insertAfter:'Insérer une colonne après',deleteColumn:'Supprimer des colonnes'}},button:{title:'Propriétés du bouton',text:'Texte (Valeur)',type:'Type',typeBtn:'Bouton',typeSbm:'Soumettre',typeRst:'Réinitialiser'},checkboxAndRadio:{checkboxTitle:'Propriétés de la case à cocher',radioTitle:'Propriétés du bouton radio',value:'Valeur',selected:'Sélectionné'},form:{title:'Propriétés du formulaire',menu:'Propriétés du formulaire',action:'Action',method:'Méthode',encoding:'Encoding'},select:{title:'Propriétés de la liste/du menu',selectInfo:'Info',opAvail:'Options disponibles',value:'Valeur',size:'Taille',lines:'lignes',chkMulti:'Sélection multiple',opText:'Texte',opValue:'Valeur',btnAdd:'Ajouter',btnModify:'Modifier',btnUp:'Monter',btnDown:'Descendre',btnSetValue:'Valeur sélectionnée',btnDelete:'Supprimer'},textarea:{title:'Propriétés de la zone de texte',cols:'Colonnes',rows:'Lignes'},textfield:{title:'Propriétés du champ texte',name:'Nom',value:'Valeur',charWidth:'Largeur en caractères',maxChars:'Nombre maximum de caractères',type:'Type',typeText:'Texte',typePass:'Mot de passe'},hidden:{title:'Propriétés du champ caché',name:'Nom',value:'Valeur'},image:{title:"Propriétés de l'image",titleButton:'Propriétés du bouton image',menu:"Propriétés de l'image",infoTab:"Informations sur l'image",btnUpload:'Envoyer sur le serveur',upload:'Télécharger',alt:'Texte de remplacement',lockRatio:'Garder les proportions',resetSize:'Taille originale',border:'Bordure',hSpace:'Espacement horizontal',vSpace:'Espacement vertical',alertUrl:"Veuillez saisir l'URL de l'image",linkTab:'Lien',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:"Propriétés de l'animation Flash",propertiesTab:'Properties',title:"Propriétés de l'animation Flash",chkPlay:'Lecture automatique',chkLoop:'Boucle',chkMenu:'Activer le menu Flash',chkFull:'Allow Fullscreen',scale:'Affichage',scaleAll:'Par défaut (tout montrer)',scaleNoBorder:'Sans bordure',scaleFit:'Ajuster aux dimensions',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs Bas',alignAbsMiddle:'Abs Milieu',alignBaseline:'Bas du texte',alignTextTop:'Haut du texte',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Couleur de fond',hSpace:'Espacement horizontal',vSpace:'Espacement vertical',validateSrc:"Veuillez saisir l'URL",validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Orthographe',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Pas dans le dictionnaire',changeTo:'Changer en',btnIgnore:'Ignorer',btnIgnoreAll:'Ignorer tout',btnReplace:'Remplacer',btnReplaceAll:'Remplacer tout',btnUndo:'Annuler',noSuggestions:'- Pas de suggestion -',progress:"Vérification d'orthographe en cours...",noMispell:"Vérification d'orthographe terminée: pas d'erreur trouvée",noChanges:"Vérification d'orthographe terminée: Pas de modifications",oneChange:"Vérification d'orthographe terminée: Un mot modifié",manyChanges:"Vérification d'orthographe terminée: %1 mots modifiés",ieSpellDownload:"Le Correcteur d'orthographe n'est pas installé. Souhaitez-vous le télécharger maintenant?"},smiley:{toolbar:'Emoticon',title:'Insérer un Emoticon',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Liste numérotée',bulletedlist:'Liste à puces',indent:'Augmenter le retrait',outdent:'Diminuer le retrait',justify:{left:'Aligner à gauche',center:'Centrer',right:'Aligner à Droite',block:'Texte justifié'},blockquote:'Citation',clipboard:{title:'Coller',cutError:"Les paramètres de sécurité de votre navigateur empêchent l'éditeur de couper automatiquement vos données. Veuillez utiliser les équivalents claviers (Ctrl/Cmd+X).",copyError:"Les paramètres de sécurité de votre navigateur empêchent l'éditeur de copier automatiquement vos données. Veuillez utiliser les équivalents claviers (Ctrl/Cmd+C).",pasteMsg:'Veuillez coller dans la zone ci-dessous en utilisant le clavier (<STRONG>Ctrl/Cmd+V</STRONG>) et appuyer sur <STRONG>OK</STRONG>.',securityMsg:"A cause des paramètres de sécurité de votre navigateur, l'éditeur ne peut accéder au presse-papier directement. Vous devez coller à nouveau le contenu dans cette fenêtre.",pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Coller en tant que Word (formaté)',title:'Coller en tant que Word (formaté)',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Coller comme texte',title:'Coller comme texte'},templates:{button:'Modèles',title:'Modèles de contenu',options:'Template Options',insertOption:'Remplacer tout le contenu actuel',selectPromptMsg:"Sélectionner le modèle à ouvrir dans l'éditeur<br>(le contenu actuel sera remplacé):",emptyListMsg:'(Aucun modèle disponible)'},showBlocks:'Afficher les blocs',stylesCombo:{label:'Style',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Format',panelTitle:'Format',tag_p:'Normal',tag_pre:'Formaté',tag_address:'Adresse',tag_h1:'En-tête 1',tag_h2:'En-tête 2',tag_h3:'En-tête 3',tag_h4:'En-tête 4',tag_h5:'En-tête 5',tag_h6:'En-tête 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Police',voiceLabel:'Font',panelTitle:'Police'},fontSize:{label:'Taille',voiceLabel:'Font Size',panelTitle:'Taille'},colorButton:{textColorTitle:'Couleur de caractère',bgColorTitle:'Couleur de fond',panelTitle:'Colors',auto:'Automatique',more:'Plus de couleurs...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Propriétés du document',title:'Propriétés du document',design:'Design',meta:'Méta-Données',chooseColor:'Choose',other:'<other>',docTitle:'Titre de la page',charset:'Encodage de caractère',charsetOther:'Autre encodage de caractère',charsetASCII:'ASCII',charsetCE:'Europe Centrale',charsetCT:'Chinois Traditionnel (Big5)',charsetCR:'Cyrillique',charsetGR:'Grecque',charsetJP:'Japonais',charsetKR:'Coréen',charsetTR:'Turcque',charsetUN:'Unicode (UTF-8)',charsetWE:'Occidental',docType:'Type de document',docTypeOther:'Autre type de document',xhtmlDec:'Inclure les déclarations XHTML',bgColor:'Couleur de fond',bgImage:'Image de fond',bgFixed:'Image fixe sans défilement',txtColor:'Couleur de caractère',margin:'Marges',marginTop:'Haut',marginLeft:'Gauche',marginRight:'Droite',marginBottom:'Bas',metaKeywords:'Mots-clés (séparés par des virgules)',metaDescription:'Description',metaAuthor:'Auteur',metaCopyright:'Copyright',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang['fr-ca']={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Source',newPage:'Nouvelle page',save:'Sauvegarder',preview:'Previsualiser',cut:'Couper',copy:'Copier',paste:'Coller',print:'Imprimer',underline:'Souligné',bold:'Gras',italic:'Italique',selectAll:'Tout sélectionner',removeFormat:'Supprimer le formatage',strike:'Barrer',subscript:'Indice',superscript:'Exposant',horizontalrule:'Insérer un séparateur',pagebreak:'Insérer un saut de page',pagebreakAlt:'Page Break',unlink:'Supprimer le lien',undo:'Annuler',redo:'Refaire',common:{browseServer:'Parcourir le serveur',url:'URL',protocol:'Protocole',upload:'Télécharger',uploadSubmit:'Envoyer sur le serveur',image:'Image',flash:'Animation Flash',form:'Formulaire',checkbox:'Case à cocher',radio:'Bouton radio',textField:'Champ texte',textarea:'Zone de texte',hiddenField:'Champ caché',button:'Bouton',select:'Champ de sélection',imageButton:'Bouton image',notSet:'<Par défaut>',id:'Id',name:'Nom',langDir:"Sens d'écriture",langDirLtr:'De gauche à droite (LTR)',langDirRtl:'De droite à gauche (RTL)',langCode:'Code langue',longDescr:'URL de description longue',cssClass:'Classes de feuilles de style',advisoryTitle:'Titre',cssStyle:'Style',ok:'OK',cancel:'Annuler',close:'Close',preview:'Preview',generalTab:'Général',advancedTab:'Avancée',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Largeur',height:'Hauteur',align:'Alignement',alignLeft:'Gauche',alignRight:'Droite',alignCenter:'Centré',alignTop:'Haut',alignMiddle:'Milieu',alignBottom:'Bas',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Insérer un caractère spécial',title:'Insérer un caractère spécial',options:'Special Character Options'},link:{toolbar:'Insérer/modifier le lien',other:'<other>',menu:'Modifier le lien',title:'Propriétés du lien',info:'Informations sur le lien',target:'Destination',upload:'Télécharger',advanced:'Avancée',type:'Type de lien',toUrl:'URL',toAnchor:'Ancre dans cette page',toEmail:'E-Mail',targetFrame:'<Cadre>',targetPopup:'<fenêtre popup>',targetFrameName:'Nom du cadre de destination',targetPopupName:'Nom de la fenêtre popup',popupFeatures:'Caractéristiques de la fenêtre popup',popupResizable:'Resizable',popupStatusBar:"Barre d'état",popupLocationBar:"Barre d'adresses",popupToolbar:"Barre d'outils",popupMenuBar:'Barre de menu',popupFullScreen:'Plein écran (IE)',popupScrollBars:'Barres de défilement',popupDependent:'Dépendante (Netscape)',popupLeft:'Position à partir de la gauche',popupTop:'Position à partir du haut',id:'Id',langDir:"Sens d'écriture",langDirLTR:'De gauche à droite (LTR)',langDirRTL:'De droite à gauche (RTL)',acccessKey:'Équivalent clavier',name:'Nom',langCode:"Sens d'écriture",tabIndex:'Ordre de tabulation',advisoryTitle:'Titre',advisoryContentType:'Type de contenu',cssClasses:'Classes de feuilles de style',charset:'Encodage de caractère',styles:'Style',rel:'Relationship',selectAnchor:'Sélectionner une ancre',anchorName:'Par nom',anchorId:'Par id',emailAddress:'Adresse E-Mail',emailSubject:'Sujet du message',emailBody:'Corps du message',noAnchors:"(Pas d'ancre disponible dans le document)",noUrl:"Veuillez saisir l'URL",noEmail:"Veuillez saisir l'adresse e-mail"},anchor:{toolbar:"Insérer/modifier l'ancre",menu:"Propriétés de l'ancre",title:"Propriétés de l'ancre",name:"Nom de l'ancre",errorName:"Veuillez saisir le nom de l'ancre",remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Chercher et Remplacer',find:'Chercher',replace:'Remplacer',findWhat:'Rechercher:',replaceWith:'Remplacer par:',notFoundMsg:'Le texte indiqué est introuvable.',findOptions:'Find Options',matchCase:'Respecter la casse',matchWord:'Mot entier',matchCyclic:'Match cyclic',replaceAll:'Tout remplacer',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Tableau',title:'Propriétés du tableau',menu:'Propriétés du tableau',deleteTable:'Supprimer le tableau',rows:'Lignes',columns:'Colonnes',border:'Taille de la bordure',widthPx:'pixels',widthPc:'pourcentage',widthUnit:'width unit',cellSpace:'Espacement',cellPad:'Contour',caption:'Titre',summary:'Résumé',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Cellule',insertBefore:'Insérer une cellule avant',insertAfter:'Insérer une cellule après',deleteCell:'Supprimer des cellules',merge:'Fusionner les cellules',mergeRight:'Fusionner à droite',mergeDown:'Fusionner en bas',splitHorizontal:'Scinder la cellule horizontalement',splitVertical:'Scinder la cellule verticalement',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Ligne',insertBefore:'Insérer une ligne avant',insertAfter:'Insérer une ligne après',deleteRow:'Supprimer des lignes'},column:{menu:'Colonne',insertBefore:'Insérer une colonne avant',insertAfter:'Insérer une colonne après',deleteColumn:'Supprimer des colonnes'}},button:{title:'Propriétés du bouton',text:'Texte (Valeur)',type:'Type',typeBtn:'Bouton',typeSbm:'Soumettre',typeRst:'Réinitialiser'},checkboxAndRadio:{checkboxTitle:'Propriétés de la case à cocher',radioTitle:'Propriétés du bouton radio',value:'Valeur',selected:'Sélectionné'},form:{title:'Propriétés du formulaire',menu:'Propriétés du formulaire',action:'Action',method:'Méthode',encoding:'Encoding'},select:{title:'Propriétés de la liste/du menu',selectInfo:'Info',opAvail:'Options disponibles',value:'Valeur',size:'Taille',lines:'lignes',chkMulti:'Sélection multiple',opText:'Texte',opValue:'Valeur',btnAdd:'Ajouter',btnModify:'Modifier',btnUp:'Monter',btnDown:'Descendre',btnSetValue:'Valeur sélectionnée',btnDelete:'Supprimer'},textarea:{title:'Propriétés de la zone de texte',cols:'Colonnes',rows:'Lignes'},textfield:{title:'Propriétés du champ texte',name:'Nom',value:'Valeur',charWidth:'Largeur en caractères',maxChars:'Nombre maximum de caractères',type:'Type',typeText:'Texte',typePass:'Mot de passe'},hidden:{title:'Propriétés du champ caché',name:'Nom',value:'Valeur'},image:{title:"Propriétés de l'image",titleButton:'Propriétés du bouton image',menu:"Propriétés de l'image",infoTab:"Informations sur l'image",btnUpload:'Envoyer sur le serveur',upload:'Télécharger',alt:'Texte de remplacement',lockRatio:'Garder les proportions',resetSize:'Taille originale',border:'Bordure',hSpace:'Espacement horizontal',vSpace:'Espacement vertical',alertUrl:"Veuillez saisir l'URL de l'image",linkTab:'Lien',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:"Propriétés de l'animation Flash",propertiesTab:'Properties',title:"Propriétés de l'animation Flash",chkPlay:'Lecture automatique',chkLoop:'Boucle',chkMenu:'Activer le menu Flash',chkFull:'Allow Fullscreen',scale:'Affichage',scaleAll:'Par défaut (tout montrer)',scaleNoBorder:'Sans bordure',scaleFit:'Ajuster aux dimensions',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs Bas',alignAbsMiddle:'Abs Milieu',alignBaseline:'Bas du texte',alignTextTop:'Haut du texte',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Couleur de fond',hSpace:'Espacement horizontal',vSpace:'Espacement vertical',validateSrc:"Veuillez saisir l'URL",validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Orthographe',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Pas dans le dictionnaire',changeTo:'Changer en',btnIgnore:'Ignorer',btnIgnoreAll:'Ignorer tout',btnReplace:'Remplacer',btnReplaceAll:'Remplacer tout',btnUndo:'Annuler',noSuggestions:'- Pas de suggestion -',progress:"Vérification d'orthographe en cours...",noMispell:"Vérification d'orthographe terminée: pas d'erreur trouvée",noChanges:"Vérification d'orthographe terminée: Pas de modifications",oneChange:"Vérification d'orthographe terminée: Un mot modifié",manyChanges:"Vérification d'orthographe terminée: %1 mots modifiés",ieSpellDownload:"Le Correcteur d'orthographe n'est pas installé. Souhaitez-vous le télécharger maintenant?"},smiley:{toolbar:'Emoticon',title:'Insérer un Emoticon',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Liste numérotée',bulletedlist:'Liste à puces',indent:'Augmenter le retrait',outdent:'Diminuer le retrait',justify:{left:'Aligner à gauche',center:'Centrer',right:'Aligner à Droite',block:'Texte justifié'},blockquote:'Citation',clipboard:{title:'Coller',cutError:"Les paramètres de sécurité de votre navigateur empêchent l'éditeur de couper automatiquement vos données. Veuillez utiliser les équivalents claviers (Ctrl/Cmd+X).",copyError:"Les paramètres de sécurité de votre navigateur empêchent l'éditeur de copier automatiquement vos données. Veuillez utiliser les équivalents claviers (Ctrl/Cmd+C).",pasteMsg:'Veuillez coller dans la zone ci-dessous en utilisant le clavier (<STRONG>Ctrl/Cmd+V</STRONG>) et appuyer sur <STRONG>OK</STRONG>.',securityMsg:"A cause des paramètres de sécurité de votre navigateur, l'éditeur ne peut accéder au presse-papier directement. Vous devez coller à nouveau le contenu dans cette fenêtre.",pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Coller en tant que Word (formaté)',title:'Coller en tant que Word (formaté)',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Coller comme texte',title:'Coller comme texte'},templates:{button:'Modèles',title:'Modèles de contenu',options:'Template Options',insertOption:'Remplacer tout le contenu actuel',selectPromptMsg:"Sélectionner le modèle à ouvrir dans l'éditeur<br>(le contenu actuel sera remplacé):",emptyListMsg:'(Aucun modèle disponible)'},showBlocks:'Afficher les blocs',stylesCombo:{label:'Style',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Format',panelTitle:'Format',tag_p:'Normal',tag_pre:'Formaté',tag_address:'Adresse',tag_h1:'En-tête 1',tag_h2:'En-tête 2',tag_h3:'En-tête 3',tag_h4:'En-tête 4',tag_h5:'En-tête 5',tag_h6:'En-tête 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Police',voiceLabel:'Font',panelTitle:'Police'},fontSize:{label:'Taille',voiceLabel:'Font Size',panelTitle:'Taille'},colorButton:{textColorTitle:'Couleur de caractère',bgColorTitle:'Couleur de fond',panelTitle:'Colors',auto:'Automatique',more:'Plus de couleurs...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Propriétés du document',title:'Propriétés du document',design:'Design',meta:'Méta-Données',chooseColor:'Choose',other:'<other>',docTitle:'Titre de la page',charset:'Encodage de caractère',charsetOther:'Autre encodage de caractère',charsetASCII:'ASCII',charsetCE:'Europe Centrale',charsetCT:'Chinois Traditionnel (Big5)',charsetCR:'Cyrillique',charsetGR:'Grecque',charsetJP:'Japonais',charsetKR:'Coréen',charsetTR:'Turcque',charsetUN:'Unicode (UTF-8)',charsetWE:'Occidental',docType:'Type de document',docTypeOther:'Autre type de document',xhtmlDec:'Inclure les déclarations XHTML',bgColor:'Couleur de fond',bgImage:'Image de fond',bgFixed:'Image fixe sans défilement',txtColor:'Couleur de caractère',margin:'Marges',marginTop:'Haut',marginLeft:'Gauche',marginRight:'Droite',marginBottom:'Bas',metaKeywords:'Mots-clés (séparés par des virgules)',metaDescription:'Description',metaAuthor:'Auteur',metaCopyright:'Copyright',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/gl.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/gl.js
index fce8547..90d2fb1 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/gl.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/gl.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.gl={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Código Fonte',newPage:'Nova Páxina',save:'Gardar',preview:'Vista Previa',cut:'Cortar',copy:'Copiar',paste:'Pegar',print:'Imprimir',underline:'Sub-raiado',bold:'Negrita',italic:'Cursiva',selectAll:'Seleccionar todo',removeFormat:'Eliminar Formato',strike:'Tachado',subscript:'Subíndice',superscript:'Superíndice',horizontalrule:'Inserir Liña Horizontal',pagebreak:'Inserir Salto de Páxina',pagebreakAlt:'Page Break',unlink:'Eliminar Ligazón',undo:'Desfacer',redo:'Refacer',common:{browseServer:'Navegar no Servidor',url:'URL',protocol:'Protocolo',upload:'Carregar',uploadSubmit:'Enviar ó Servidor',image:'Imaxe',flash:'Flash',form:'Formulario',checkbox:'Cadro de Verificación',radio:'Botón de Radio',textField:'Campo de Texto',textarea:'Área de Texto',hiddenField:'Campo Oculto',button:'Botón',select:'Campo de Selección',imageButton:'Botón de Imaxe',notSet:'<non definido>',id:'Id',name:'Nome',langDir:'Orientación do Idioma',langDirLtr:'Esquerda a Dereita (LTR)',langDirRtl:'Dereita a Esquerda (RTL)',langCode:'Código do Idioma',longDescr:'Descrición Completa da URL',cssClass:'Clases da Folla de Estilos',advisoryTitle:'Título',cssStyle:'Estilo',ok:'OK',cancel:'Cancelar',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Advanzado',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Largura',height:'Altura',align:'Aliñamento',alignLeft:'Esquerda',alignRight:'Dereita',alignCenter:'Centro',alignTop:'Tope',alignMiddle:'Centro',alignBottom:'Pé',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Inserir Carácter Especial',title:'Seleccione Caracter Especial',options:'Special Character Options'},link:{toolbar:'Inserir/Editar Ligazón',other:'<outro>',menu:'Editar Ligazón',title:'Ligazón',info:'Información da Ligazón',target:'Destino',upload:'Carregar',advanced:'Advanzado',type:'Tipo de Ligazón',toUrl:'URL',toAnchor:'Referencia nesta páxina',toEmail:'E-Mail',targetFrame:'<frame>',targetPopup:'<Xanela Emerxente>',targetFrameName:'Nome do Marco Destino',targetPopupName:'Nome da Xanela Emerxente',popupFeatures:'Características da Xanela Emerxente',popupResizable:'Resizable',popupStatusBar:'Barra de Estado',popupLocationBar:'Barra de Localización',popupToolbar:'Barra de Ferramentas',popupMenuBar:'Barra de Menú',popupFullScreen:'A Toda Pantalla (IE)',popupScrollBars:'Barras de Desplazamento',popupDependent:'Dependente (Netscape)',popupLeft:'Posición Esquerda',popupTop:'Posición dende Arriba',id:'Id',langDir:'Orientación do Idioma',langDirLTR:'Esquerda a Dereita (LTR)',langDirRTL:'Dereita a Esquerda (RTL)',acccessKey:'Chave de Acceso',name:'Nome',langCode:'Orientación do Idioma',tabIndex:'Índice de Tabulación',advisoryTitle:'Título',advisoryContentType:'Tipo de Contido',cssClasses:'Clases da Folla de Estilos',charset:'Fonte de Caracteres Vinculado',styles:'Estilo',rel:'Relationship',selectAnchor:'Seleccionar unha Referencia',anchorName:'Por Nome de Referencia',anchorId:'Por Element Id',emailAddress:'Enderezo de E-Mail',emailSubject:'Asunto do Mensaxe',emailBody:'Corpo do Mensaxe',noAnchors:'(Non hai referencias disponibles no documento)',noUrl:'Por favor, escriba a ligazón URL',noEmail:'Por favor, escriba o enderezo de e-mail'},anchor:{toolbar:'Inserir/Editar Referencia',menu:'Propriedades da Referencia',title:'Propriedades da Referencia',name:'Nome da Referencia',errorName:'Por favor, escriba o nome da referencia',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Procurar',replace:'Substituir',findWhat:'Texto a procurar:',replaceWith:'Substituir con:',notFoundMsg:'Non te atopou o texto indicado.',findOptions:'Find Options',matchCase:'Coincidir Mai./min.',matchWord:'Coincidir con toda a palabra',matchCyclic:'Match cyclic',replaceAll:'Substitiur Todo',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Tabla',title:'Propiedades da Táboa',menu:'Propiedades da Táboa',deleteTable:'Borrar Táboa',rows:'Filas',columns:'Columnas',border:'Tamaño do Borde',widthPx:'pixels',widthPc:'percent',widthUnit:'width unit',cellSpace:'Marxe entre Celas',cellPad:'Marxe interior',caption:'Título',summary:'Sumario',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Cela',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Borrar Cela',merge:'Unir Celas',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Fila',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Borrar Filas'},column:{menu:'Columna',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Borrar Columnas'}},button:{title:'Propriedades do Botón',text:'Texto (Valor)',type:'Tipo',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Propriedades do Cadro de Verificación',radioTitle:'Propriedades do Botón de Radio',value:'Valor',selected:'Seleccionado'},form:{title:'Propriedades do Formulario',menu:'Propriedades do Formulario',action:'Acción',method:'Método',encoding:'Encoding'},select:{title:'Propriedades do Campo de Selección',selectInfo:'Info',opAvail:'Opcións Disponibles',value:'Valor',size:'Tamaño',lines:'liñas',chkMulti:'Permitir múltiples seleccións',opText:'Texto',opValue:'Valor',btnAdd:'Engadir',btnModify:'Modificar',btnUp:'Subir',btnDown:'Baixar',btnSetValue:'Definir como valor por defecto',btnDelete:'Borrar'},textarea:{title:'Propriedades da Área de Texto',cols:'Columnas',rows:'Filas'},textfield:{title:'Propriedades do Campo de Texto',name:'Nome',value:'Valor',charWidth:'Tamaño do Caracter',maxChars:'Máximo de Caracteres',type:'Tipo',typeText:'Texto',typePass:'Chave'},hidden:{title:'Propriedades do Campo Oculto',name:'Nome',value:'Valor'},image:{title:'Propriedades da Imaxe',titleButton:'Propriedades do Botón de Imaxe',menu:'Propriedades da Imaxe',infoTab:'Información da Imaxe',btnUpload:'Enviar ó Servidor',upload:'Carregar',alt:'Texto Alternativo',lockRatio:'Proporcional',resetSize:'Tamaño Orixinal',border:'Límite',hSpace:'Esp. Horiz.',vSpace:'Esp. Vert.',alertUrl:'Por favor, escriba a URL da imaxe',linkTab:'Ligazón',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Propriedades Flash',propertiesTab:'Properties',title:'Propriedades Flash',chkPlay:'Auto Execución',chkLoop:'Bucle',chkMenu:'Activar Menú Flash',chkFull:'Allow Fullscreen',scale:'Escalar',scaleAll:'Amosar Todo',scaleNoBorder:'Sen Borde',scaleFit:'Encaixar axustando',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs Inferior',alignAbsMiddle:'Abs Centro',alignBaseline:'Liña Base',alignTextTop:'Tope do Texto',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Cor do Fondo',hSpace:'Esp. Horiz.',vSpace:'Esp. Vert.',validateSrc:'Por favor, escriba a ligazón URL',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Corrección Ortográfica',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Non está no diccionario',changeTo:'Cambiar a',btnIgnore:'Ignorar',btnIgnoreAll:'Ignorar Todas',btnReplace:'Substituir',btnReplaceAll:'Substituir Todas',btnUndo:'Desfacer',noSuggestions:'- Sen candidatos -',progress:'Corrección ortográfica en progreso...',noMispell:'Corrección ortográfica rematada: Non se atoparon erros',noChanges:'Corrección ortográfica rematada: Non se substituiu nengunha verba',oneChange:'Corrección ortográfica rematada: Unha verba substituida',manyChanges:'Corrección ortográfica rematada: %1 verbas substituidas',ieSpellDownload:'O corrector ortográfico non está instalado. ¿Quere descargalo agora?'},smiley:{toolbar:'Smiley',title:'Inserte un Smiley',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Lista Numerada',bulletedlist:'Marcas',indent:'Aumentar Sangría',outdent:'Disminuir Sangría',justify:{left:'Aliñar á Esquerda',center:'Centrado',right:'Aliñar á Dereita',block:'Xustificado'},blockquote:'Block Quote',clipboard:{title:'Pegar',cutError:'Os axustes de seguridade do seu navegador non permiten que o editor realice automáticamente as tarefas de corte. Por favor, use o teclado para iso (Ctrl/Cmd+X).',copyError:'Os axustes de seguridade do seu navegador non permiten que o editor realice automáticamente as tarefas de copia. Por favor, use o teclado para iso (Ctrl/Cmd+C).',pasteMsg:'Por favor, pegue dentro do seguinte cadro usando o teclado (<STRONG>Ctrl/Cmd+V</STRONG>) e pulse <STRONG>OK</STRONG>.',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Pegar dende Word',title:'Pegar dende Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Pegar como texto plano',title:'Pegar como texto plano'},templates:{button:'Plantillas',title:'Plantillas de Contido',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Por favor, seleccione a plantilla a abrir no editor<br>(o contido actual perderase):',emptyListMsg:'(Non hai plantillas definidas)'},showBlocks:'Show Blocks',stylesCombo:{label:'Estilo',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Formato',panelTitle:'Formato',tag_p:'Normal',tag_pre:'Formateado',tag_address:'Enderezo',tag_h1:'Enacabezado 1',tag_h2:'Encabezado 2',tag_h3:'Encabezado 3',tag_h4:'Encabezado 4',tag_h5:'Encabezado 5',tag_h6:'Encabezado 6',tag_div:'Paragraph (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Tipo',voiceLabel:'Font',panelTitle:'Tipo'},fontSize:{label:'Tamaño',voiceLabel:'Font Size',panelTitle:'Tamaño'},colorButton:{textColorTitle:'Cor do Texto',bgColorTitle:'Cor do Fondo',panelTitle:'Colors',auto:'Automático',more:'Máis Cores...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Propriedades do Documento',title:'Propriedades do Documento',design:'Design',meta:'Meta Tags',chooseColor:'Choose',other:'<outro>',docTitle:'Título da Páxina',charset:'Codificación do Xogo de Caracteres',charsetOther:'Outra Codificación do Xogo de Caracteres',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Encabezado do Tipo de Documento',docTypeOther:'Outro Encabezado do Tipo de Documento',xhtmlDec:'Incluir Declaracións XHTML',bgColor:'Cor de Fondo',bgImage:'URL da Imaxe de Fondo',bgFixed:'Fondo Fixo',txtColor:'Cor do Texto',margin:'Marxes da Páxina',marginTop:'Arriba',marginLeft:'Esquerda',marginRight:'Dereita',marginBottom:'Abaixo',metaKeywords:'Palabras Chave de Indexación do Documento (separadas por comas)',metaDescription:'Descripción do Documento',metaAuthor:'Autor',metaCopyright:'Copyright',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.gl={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Código Fonte',newPage:'Nova Páxina',save:'Gardar',preview:'Vista Previa',cut:'Cortar',copy:'Copiar',paste:'Pegar',print:'Imprimir',underline:'Sub-raiado',bold:'Negrita',italic:'Cursiva',selectAll:'Seleccionar todo',removeFormat:'Eliminar Formato',strike:'Tachado',subscript:'Subíndice',superscript:'Superíndice',horizontalrule:'Inserir Liña Horizontal',pagebreak:'Inserir Salto de Páxina',pagebreakAlt:'Page Break',unlink:'Eliminar Ligazón',undo:'Desfacer',redo:'Refacer',common:{browseServer:'Navegar no Servidor',url:'URL',protocol:'Protocolo',upload:'Carregar',uploadSubmit:'Enviar ó Servidor',image:'Imaxe',flash:'Flash',form:'Formulario',checkbox:'Cadro de Verificación',radio:'Botón de Radio',textField:'Campo de Texto',textarea:'Área de Texto',hiddenField:'Campo Oculto',button:'Botón',select:'Campo de Selección',imageButton:'Botón de Imaxe',notSet:'<non definido>',id:'Id',name:'Nome',langDir:'Orientación do Idioma',langDirLtr:'Esquerda a Dereita (LTR)',langDirRtl:'Dereita a Esquerda (RTL)',langCode:'Código do Idioma',longDescr:'Descrición Completa da URL',cssClass:'Clases da Folla de Estilos',advisoryTitle:'Título',cssStyle:'Estilo',ok:'OK',cancel:'Cancelar',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Advanzado',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Largura',height:'Altura',align:'Aliñamento',alignLeft:'Esquerda',alignRight:'Dereita',alignCenter:'Centro',alignTop:'Tope',alignMiddle:'Centro',alignBottom:'Pé',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Inserir Carácter Especial',title:'Seleccione Caracter Especial',options:'Special Character Options'},link:{toolbar:'Inserir/Editar Ligazón',other:'<outro>',menu:'Editar Ligazón',title:'Ligazón',info:'Información da Ligazón',target:'Destino',upload:'Carregar',advanced:'Advanzado',type:'Tipo de Ligazón',toUrl:'URL',toAnchor:'Referencia nesta páxina',toEmail:'E-Mail',targetFrame:'<frame>',targetPopup:'<Xanela Emerxente>',targetFrameName:'Nome do Marco Destino',targetPopupName:'Nome da Xanela Emerxente',popupFeatures:'Características da Xanela Emerxente',popupResizable:'Resizable',popupStatusBar:'Barra de Estado',popupLocationBar:'Barra de Localización',popupToolbar:'Barra de Ferramentas',popupMenuBar:'Barra de Menú',popupFullScreen:'A Toda Pantalla (IE)',popupScrollBars:'Barras de Desplazamento',popupDependent:'Dependente (Netscape)',popupLeft:'Posición Esquerda',popupTop:'Posición dende Arriba',id:'Id',langDir:'Orientación do Idioma',langDirLTR:'Esquerda a Dereita (LTR)',langDirRTL:'Dereita a Esquerda (RTL)',acccessKey:'Chave de Acceso',name:'Nome',langCode:'Orientación do Idioma',tabIndex:'Índice de Tabulación',advisoryTitle:'Título',advisoryContentType:'Tipo de Contido',cssClasses:'Clases da Folla de Estilos',charset:'Fonte de Caracteres Vinculado',styles:'Estilo',rel:'Relationship',selectAnchor:'Seleccionar unha Referencia',anchorName:'Por Nome de Referencia',anchorId:'Por Element Id',emailAddress:'Enderezo de E-Mail',emailSubject:'Asunto do Mensaxe',emailBody:'Corpo do Mensaxe',noAnchors:'(Non hai referencias disponibles no documento)',noUrl:'Por favor, escriba a ligazón URL',noEmail:'Por favor, escriba o enderezo de e-mail'},anchor:{toolbar:'Inserir/Editar Referencia',menu:'Propriedades da Referencia',title:'Propriedades da Referencia',name:'Nome da Referencia',errorName:'Por favor, escriba o nome da referencia',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Procurar',replace:'Substituir',findWhat:'Texto a procurar:',replaceWith:'Substituir con:',notFoundMsg:'Non te atopou o texto indicado.',findOptions:'Find Options',matchCase:'Coincidir Mai./min.',matchWord:'Coincidir con toda a palabra',matchCyclic:'Match cyclic',replaceAll:'Substitiur Todo',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Tabla',title:'Propiedades da Táboa',menu:'Propiedades da Táboa',deleteTable:'Borrar Táboa',rows:'Filas',columns:'Columnas',border:'Tamaño do Borde',widthPx:'pixels',widthPc:'percent',widthUnit:'width unit',cellSpace:'Marxe entre Celas',cellPad:'Marxe interior',caption:'Título',summary:'Sumario',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Cela',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Borrar Cela',merge:'Unir Celas',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Fila',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Borrar Filas'},column:{menu:'Columna',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Borrar Columnas'}},button:{title:'Propriedades do Botón',text:'Texto (Valor)',type:'Tipo',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Propriedades do Cadro de Verificación',radioTitle:'Propriedades do Botón de Radio',value:'Valor',selected:'Seleccionado'},form:{title:'Propriedades do Formulario',menu:'Propriedades do Formulario',action:'Acción',method:'Método',encoding:'Encoding'},select:{title:'Propriedades do Campo de Selección',selectInfo:'Info',opAvail:'Opcións Disponibles',value:'Valor',size:'Tamaño',lines:'liñas',chkMulti:'Permitir múltiples seleccións',opText:'Texto',opValue:'Valor',btnAdd:'Engadir',btnModify:'Modificar',btnUp:'Subir',btnDown:'Baixar',btnSetValue:'Definir como valor por defecto',btnDelete:'Borrar'},textarea:{title:'Propriedades da Área de Texto',cols:'Columnas',rows:'Filas'},textfield:{title:'Propriedades do Campo de Texto',name:'Nome',value:'Valor',charWidth:'Tamaño do Caracter',maxChars:'Máximo de Caracteres',type:'Tipo',typeText:'Texto',typePass:'Chave'},hidden:{title:'Propriedades do Campo Oculto',name:'Nome',value:'Valor'},image:{title:'Propriedades da Imaxe',titleButton:'Propriedades do Botón de Imaxe',menu:'Propriedades da Imaxe',infoTab:'Información da Imaxe',btnUpload:'Enviar ó Servidor',upload:'Carregar',alt:'Texto Alternativo',lockRatio:'Proporcional',resetSize:'Tamaño Orixinal',border:'Límite',hSpace:'Esp. Horiz.',vSpace:'Esp. Vert.',alertUrl:'Por favor, escriba a URL da imaxe',linkTab:'Ligazón',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Propriedades Flash',propertiesTab:'Properties',title:'Propriedades Flash',chkPlay:'Auto Execución',chkLoop:'Bucle',chkMenu:'Activar Menú Flash',chkFull:'Allow Fullscreen',scale:'Escalar',scaleAll:'Amosar Todo',scaleNoBorder:'Sen Borde',scaleFit:'Encaixar axustando',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs Inferior',alignAbsMiddle:'Abs Centro',alignBaseline:'Liña Base',alignTextTop:'Tope do Texto',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Cor do Fondo',hSpace:'Esp. Horiz.',vSpace:'Esp. Vert.',validateSrc:'Por favor, escriba a ligazón URL',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Corrección Ortográfica',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Non está no diccionario',changeTo:'Cambiar a',btnIgnore:'Ignorar',btnIgnoreAll:'Ignorar Todas',btnReplace:'Substituir',btnReplaceAll:'Substituir Todas',btnUndo:'Desfacer',noSuggestions:'- Sen candidatos -',progress:'Corrección ortográfica en progreso...',noMispell:'Corrección ortográfica rematada: Non se atoparon erros',noChanges:'Corrección ortográfica rematada: Non se substituiu nengunha verba',oneChange:'Corrección ortográfica rematada: Unha verba substituida',manyChanges:'Corrección ortográfica rematada: %1 verbas substituidas',ieSpellDownload:'O corrector ortográfico non está instalado. ¿Quere descargalo agora?'},smiley:{toolbar:'Smiley',title:'Inserte un Smiley',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Lista Numerada',bulletedlist:'Marcas',indent:'Aumentar Sangría',outdent:'Disminuir Sangría',justify:{left:'Aliñar á Esquerda',center:'Centrado',right:'Aliñar á Dereita',block:'Xustificado'},blockquote:'Block Quote',clipboard:{title:'Pegar',cutError:'Os axustes de seguridade do seu navegador non permiten que o editor realice automáticamente as tarefas de corte. Por favor, use o teclado para iso (Ctrl/Cmd+X).',copyError:'Os axustes de seguridade do seu navegador non permiten que o editor realice automáticamente as tarefas de copia. Por favor, use o teclado para iso (Ctrl/Cmd+C).',pasteMsg:'Por favor, pegue dentro do seguinte cadro usando o teclado (<STRONG>Ctrl/Cmd+V</STRONG>) e pulse <STRONG>OK</STRONG>.',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Pegar dende Word',title:'Pegar dende Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Pegar como texto plano',title:'Pegar como texto plano'},templates:{button:'Plantillas',title:'Plantillas de Contido',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Por favor, seleccione a plantilla a abrir no editor<br>(o contido actual perderase):',emptyListMsg:'(Non hai plantillas definidas)'},showBlocks:'Show Blocks',stylesCombo:{label:'Estilo',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Formato',panelTitle:'Formato',tag_p:'Normal',tag_pre:'Formateado',tag_address:'Enderezo',tag_h1:'Enacabezado 1',tag_h2:'Encabezado 2',tag_h3:'Encabezado 3',tag_h4:'Encabezado 4',tag_h5:'Encabezado 5',tag_h6:'Encabezado 6',tag_div:'Paragraph (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Tipo',voiceLabel:'Font',panelTitle:'Tipo'},fontSize:{label:'Tamaño',voiceLabel:'Font Size',panelTitle:'Tamaño'},colorButton:{textColorTitle:'Cor do Texto',bgColorTitle:'Cor do Fondo',panelTitle:'Colors',auto:'Automático',more:'Máis Cores...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Propriedades do Documento',title:'Propriedades do Documento',design:'Design',meta:'Meta Tags',chooseColor:'Choose',other:'<outro>',docTitle:'Título da Páxina',charset:'Codificación do Xogo de Caracteres',charsetOther:'Outra Codificación do Xogo de Caracteres',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Encabezado do Tipo de Documento',docTypeOther:'Outro Encabezado do Tipo de Documento',xhtmlDec:'Incluir Declaracións XHTML',bgColor:'Cor de Fondo',bgImage:'URL da Imaxe de Fondo',bgFixed:'Fondo Fixo',txtColor:'Cor do Texto',margin:'Marxes da Páxina',marginTop:'Arriba',marginLeft:'Esquerda',marginRight:'Dereita',marginBottom:'Abaixo',metaKeywords:'Palabras Chave de Indexación do Documento (separadas por comas)',metaDescription:'Descripción do Documento',metaAuthor:'Autor',metaCopyright:'Copyright',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/gu.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/gu.js
index 0cb6076..177ddcd 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/gu.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/gu.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.gu={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'એડીટર ટૂલ બાર',editor:'રીચ ટેક્ષ્ત્ એડીટર',source:'મૂળ કે પ્રાથમિક દસ્તાવેજ',newPage:'નવુ પાનું',save:'સેવ',preview:'પૂર્વદર્શન',cut:'કાપવું',copy:'નકલ',paste:'પેસ્ટ',print:'પ્રિન્ટ',underline:'અન્ડર્લાઇન, નીચે લીટી',bold:'બોલ્ડ/સ્પષ્ટ',italic:'ઇટેલિક, ત્રાંસા',selectAll:'બઘું પસંદ કરવું',removeFormat:'ફૉર્મટ કાઢવું',strike:'છેકી નાખવું',subscript:'એક ચિહ્નની નીચે કરેલું બીજું ચિહ્ન',superscript:'એક ચિહ્ન ઉપર કરેલું બીજું ચિહ્ન.',horizontalrule:'સમસ્તરીય રેખા ઇન્સર્ટ/દાખલ કરવી',pagebreak:'ઇન્સર્ટ પેજબ્રેક/પાનાને અલગ કરવું/દાખલ કરવું',pagebreakAlt:'નવું પાનું',unlink:'લિંક કાઢવી',undo:'રદ કરવું; પહેલાં હતી એવી સ્થિતિ પાછી લાવવી',redo:'રિડૂ; પછી હતી એવી સ્થિતિ પાછી લાવવી',common:{browseServer:'સર્વર બ્રાઉઝ કરો',url:'URL',protocol:'પ્રોટોકૉલ',upload:'અપલોડ',uploadSubmit:'આ સર્વરને મોકલવું',image:'ચિત્ર',flash:'ફ્લૅશ',form:'ફૉર્મ/પત્રક',checkbox:'ચેક બોક્સ',radio:'રેડિઓ બટન',textField:'ટેક્સ્ટ ફીલ્ડ, શબ્દ ક્ષેત્ર',textarea:'ટેક્સ્ટ એરિઆ, શબ્દ વિસ્તાર',hiddenField:'ગુપ્ત ક્ષેત્ર',button:'બટન',select:'પસંદગી ક્ષેત્ર',imageButton:'ચિત્ર બટન',notSet:'<સેટ નથી>',id:'Id',name:'નામ',langDir:'ભાષા લેખવાની પદ્ધતિ',langDirLtr:'ડાબે થી જમણે (LTR)',langDirRtl:'જમણે થી ડાબે (RTL)',langCode:'ભાષા કોડ',longDescr:'વધારે માહિતી માટે URL',cssClass:'સ્ટાઇલ-શીટ ક્લાસ',advisoryTitle:'મુખ્ય મથાળું',cssStyle:'સ્ટાઇલ',ok:'ઠીક છે',cancel:'રદ કરવું',close:'બંધ કરવું',preview:'જોવું',generalTab:'જનરલ',advancedTab:'અડ્વાન્સડ',validateNumberFailed:'આ રકમ આકડો નથી.',confirmNewPage:'સવે કાર્ય વગરનું ફકરો ખોવાઈ જશે. તમને ખાતરી છે કે તમને નવું પાનું ખોલવું છે?',confirmCancel:'ઘણા વિકલ્પો બદલાયા છે. તમારે આ બોક્ષ્ બંધ કરવું છે?',options:'વિકલ્પો',target:'લક્ષ્ય',targetNew:'નવી વિન્ડો (_blank)',targetTop:'ઉપરની વિન્ડો (_top)',targetSelf:'એજ વિન્ડો (_self)',targetParent:'પેરનટ વિન્ડો (_parent)',langDirLTR:'ડાબે થી જમણે (LTR)',langDirRTL:'જમણે થી ડાબે (RTL)',styles:'શૈલી',cssClasses:'શૈલી કલાસીસ',width:'પહોળાઈ',height:'ઊંચાઈ',align:'લાઇનદોરીમાં ગોઠવવું',alignLeft:'ડાબી બાજુ ગોઠવવું',alignRight:'જમણી',alignCenter:'મધ્ય સેન્ટર',alignTop:'ઉપર',alignMiddle:'વચ્ચે',alignBottom:'નીચે',invalidHeight:'ઉંચાઈ એક આંકડો હોવો જોઈએ.',invalidWidth:'પોહળ ઈ એક આંકડો હોવો જોઈએ.',invalidCssLength:'"%1" ની વેલ્યુ એક પોસીટીવ આંકડો હોવો જોઈએ અથવા CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc) વગર.',invalidHtmlLength:'"%1" ની વેલ્યુ એક પોસીટીવ આંકડો હોવો જોઈએ અથવા HTML measurement unit (px or %) વગર.',invalidInlineStyle:'ઈનલાઈન સ્ટાઈલ ની વેલ્યુ "name : value" ના ફોર્મેટ માં હોવી જોઈએ, વચ્ચે સેમી-કોલોન જોઈએ.',cssLengthTooltip:'પિક્ષ્લ્ નો આંકડો CSS unit (px, %, in, cm, mm, em, ex, pt, or pc) માં નાખો.',unavailable:'%1<span class="cke_accessibility">, નથી મળતું</span>'},contextmenu:{options:'કોન્તેક્ષ્ત્ મેનુના વિકલ્પો'},specialChar:{toolbar:'વિશિષ્ટ અક્ષર ઇન્સર્ટ/દાખલ કરવું',title:'સ્પેશિઅલ વિશિષ્ટ અક્ષર પસંદ કરો',options:'સ્પેશિઅલ કરેક્ટરના વિકલ્પો'},link:{toolbar:'લિંક ઇન્સર્ટ/દાખલ કરવી',other:'<other> <અન્ય>',menu:' લિંક એડિટ/માં ફેરફાર કરવો',title:'લિંક',info:'લિંક ઇન્ફૉ ટૅબ',target:'ટાર્ગેટ/લક્ષ્ય',upload:'અપલોડ',advanced:'અડ્વાન્સડ',type:'લિંક પ્રકાર',toUrl:'URL',toAnchor:'આ પેજનો ઍંકર',toEmail:'ઈ-મેલ',targetFrame:'<ફ્રેમ>',targetPopup:'<પૉપ-અપ વિન્ડો>',targetFrameName:'ટાર્ગેટ ફ્રેમ નું નામ',targetPopupName:'પૉપ-અપ વિન્ડો નું નામ',popupFeatures:'પૉપ-અપ વિન્ડો ફીચરસૅ',popupResizable:'રીસાઈઝએબલ',popupStatusBar:'સ્ટૅટસ બાર',popupLocationBar:'લોકેશન બાર',popupToolbar:'ટૂલ બાર',popupMenuBar:'મેન્યૂ બાર',popupFullScreen:'ફુલ સ્ક્રીન (IE)',popupScrollBars:'સ્ક્રોલ બાર',popupDependent:'ડિપેન્ડન્ટ (Netscape)',popupLeft:'ડાબી બાજુ',popupTop:'જમણી બાજુ',id:'Id',langDir:'ભાષા લેખવાની પદ્ધતિ',langDirLTR:'ડાબે થી જમણે (LTR)',langDirRTL:'જમણે થી ડાબે (RTL)',acccessKey:'ઍક્સેસ કી',name:'નામ',langCode:'ભાષા લેખવાની પદ્ધતિ',tabIndex:'ટૅબ ઇન્ડેક્સ',advisoryTitle:'મુખ્ય મથાળું',advisoryContentType:'મુખ્ય કન્ટેન્ટ પ્રકાર',cssClasses:'સ્ટાઇલ-શીટ ક્લાસ',charset:'લિંક રિસૉર્સ કૅરિક્ટર સેટ',styles:'સ્ટાઇલ',rel:'સંબંધની સ્થિતિ',selectAnchor:'ઍંકર પસંદ કરો',anchorName:'ઍંકર નામથી પસંદ કરો',anchorId:'ઍંકર એલિમન્ટ Id થી પસંદ કરો',emailAddress:'ઈ-મેલ સરનામું',emailSubject:'ઈ-મેલ વિષય',emailBody:'સંદેશ',noAnchors:'(ડૉક્યુમન્ટમાં ઍંકરની સંખ્યા)',noUrl:'લિંક URL ટાઇપ કરો',noEmail:'ઈ-મેલ સરનામું ટાઇપ કરો'},anchor:{toolbar:'ઍંકર ઇન્સર્ટ/દાખલ કરવી',menu:'ઍંકરના ગુણ',title:'ઍંકરના ગુણ',name:'ઍંકરનું નામ',errorName:'ઍંકરનું નામ ટાઈપ કરો',remove:'સ્થિર નકરવું'},list:{numberedTitle:'આંકડાના લીસ્ટના ગુણ',bulletedTitle:'બુલેટેડ લીસ્ટના ગુણ',type:'પ્રકાર',start:'શરુ કરવું',validateStartNumber:'લીસ્ટના સરુઆતનો આંકડો પુરો હોવો જોઈએ.',circle:'વર્તુળ',disc:'ડિસ્ક',square:'ચોરસ',none:'કસુ ',notset:'<સેટ નથી>',armenian:'અરમેનિયન આંકડા પદ્ધતિ',georgian:'ગેઓર્ગિયન આંકડા પદ્ધતિ (an, ban, gan, etc.)',lowerRoman:'રોમન નાના (i, ii, iii, iv, v, etc.)',upperRoman:'રોમન મોટા (I, II, III, IV, V, etc.)',lowerAlpha:'આલ્ફા નાના (a, b, c, d, e, etc.)',upperAlpha:'આલ્ફા મોટા (A, B, C, D, E, etc.)',lowerGreek:'ગ્રીક નાના (alpha, beta, gamma, etc.)',decimal:'આંકડા (1, 2, 3, etc.)',decimalLeadingZero:'સુન્ય આગળ આંકડા (01, 02, 03, etc.)'},findAndReplace:{title:'શોધવું અને બદલવું',find:'શોધવું',replace:'રિપ્લેસ/બદલવું',findWhat:'આ શોધો',replaceWith:'આનાથી બદલો',notFoundMsg:'તમે શોધેલી ટેક્સ્ટ નથી મળી',findOptions:'વીકલ્પ શોધો',matchCase:'કેસ સરખા રાખો',matchWord:'બઘા શબ્દ સરખા રાખો',matchCyclic:'સરખાવવા બધા',replaceAll:'બઘા બદલી ',replaceSuccessMsg:'%1 ફેરફારો બાદલાયા છે.'},table:{toolbar:'ટેબલ, કોઠો',title:'ટેબલ, કોઠાનું મથાળું',menu:'ટેબલ, કોઠાનું મથાળું',deleteTable:'કોઠો ડિલીટ/કાઢી નાખવું',rows:'પંક્તિના ખાના',columns:'કૉલમ/ઊભી કટાર',border:'કોઠાની બાજુ(બોર્ડર) સાઇઝ',widthPx:'પિકસલ',widthPc:'પ્રતિશત',widthUnit:'પોહાલાઈ એકમ',cellSpace:'સેલ અંતર',cellPad:'સેલ પૅડિંગ',caption:'મથાળું/કૅપ્શન ',summary:'ટૂંકો એહેવાલ',headers:'મથાળા',headersNone:'નથી ',headersColumn:'પહેલી ઊભી કટાર',headersRow:'પહેલી કટાર',headersBoth:'બેવું',invalidRows:'આડી કટાર, 0 કરતા વધારે હોવી જોઈએ.',invalidCols:'ઉભી કટાર, 0 કરતા વધારે હોવી જોઈએ.',invalidBorder:'બોર્ડર એક આંકડો હોવો જોઈએ',invalidWidth:'ટેબલની પોહલાઈ આંકડો હોવો જોઈએ.',invalidHeight:'ટેબલની ઊંચાઈ આંકડો હોવો જોઈએ.',invalidCellSpacing:'સેલ વચ્ચેની જગ્યા સુન્ય કરતા વધારે હોવી જોઈએ.',invalidCellPadding:'સેલની અંદરની જગ્યા સુન્ય કરતા વધારે હોવી જોઈએ.',cell:{menu:'કોષના ખાના',insertBefore:'પહેલાં કોષ ઉમેરવો',insertAfter:'પછી કોષ ઉમેરવો',deleteCell:'કોષ ડિલીટ/કાઢી નાખવો',merge:'કોષ ભેગા કરવા',mergeRight:'જમણી બાજુ ભેગા કરવા',mergeDown:'નીચે ભેગા કરવા',splitHorizontal:'કોષને સમસ્તરીય વિભાજન કરવું',splitVertical:'કોષને સીધું ને ઊભું વિભાજન કરવું',title:'સેલના ગુણ',cellType:'સેલનો પ્રકાર',rowSpan:'આડી કટારની જગ્યા',colSpan:'ઊભી કતારની જગ્યા',wordWrap:'વર્ડ રેપ',hAlign:'સપાટ લાઈનદોરી',vAlign:'ઊભી લાઈનદોરી',alignBaseline:'બસે લાઈન',bgColor:'પાછાળનો રંગ',borderColor:'બોર્ડેર રંગ',data:'સ્વીકૃત માહિતી',header:'મથાળું',yes:'હા',no:'ના',invalidWidth:'સેલની પોહલાઈ આંકડો હોવો જોઈએ.',invalidHeight:'સેલની ઊંચાઈ આંકડો હોવો જોઈએ.',invalidRowSpan:'રો સ્પાન આંકડો હોવો જોઈએ.',invalidColSpan:'કોલમ સ્પાન આંકડો હોવો જોઈએ.',chooseColor:'પસંદ કરવું'},row:{menu:'પંક્તિના ખાના',insertBefore:'પહેલાં પંક્તિ ઉમેરવી',insertAfter:'પછી પંક્તિ ઉમેરવી',deleteRow:'પંક્તિઓ ડિલીટ/કાઢી નાખવી'},column:{menu:'કૉલમ/ઊભી કટાર',insertBefore:'પહેલાં કૉલમ/ઊભી કટાર ઉમેરવી',insertAfter:'પછી કૉલમ/ઊભી કટાર ઉમેરવી',deleteColumn:'કૉલમ/ઊભી કટાર ડિલીટ/કાઢી નાખવી'}},button:{title:'બટનના ગુણ',text:'ટેક્સ્ટ (વૅલ્યૂ)',type:'પ્રકાર',typeBtn:'બટન',typeSbm:'સબ્મિટ',typeRst:'રિસેટ'},checkboxAndRadio:{checkboxTitle:'ચેક બોક્સ ગુણ',radioTitle:'રેડિઓ બટનના ગુણ',value:'વૅલ્યૂ',selected:'સિલેક્ટેડ'},form:{title:'ફૉર્મ/પત્રકના ગુણ',menu:'ફૉર્મ/પત્રકના ગુણ',action:'ક્રિયા',method:'પદ્ધતિ',encoding:'અન્કોડીન્ગ'},select:{title:'પસંદગી ક્ષેત્રના ગુણ',selectInfo:'સૂચના',opAvail:'ઉપલબ્ધ વિકલ્પ',value:'વૅલ્યૂ',size:'સાઇઝ',lines:'લીટીઓ',chkMulti:'એકથી વધારે પસંદ કરી શકો',opText:'ટેક્સ્ટ',opValue:'વૅલ્યૂ',btnAdd:'ઉમેરવું',btnModify:'બદલવું',btnUp:'ઉપર',btnDown:'નીચે',btnSetValue:'પસંદ કરલી વૅલ્યૂ સેટ કરો',btnDelete:'રદ કરવું'},textarea:{title:'ટેક્સ્ટ એઅરિઆ, શબ્દ વિસ્તારના ગુણ',cols:'કૉલમ/ઊભી કટાર',rows:'પંક્તિઓ'},textfield:{title:'ટેક્સ્ટ ફીલ્ડ, શબ્દ ક્ષેત્રના ગુણ',name:'નામ',value:'વૅલ્યૂ',charWidth:'કેરેક્ટરની પહોળાઈ',maxChars:'અધિકતમ કેરેક્ટર',type:'ટાઇપ',typeText:'ટેક્સ્ટ',typePass:'પાસવર્ડ'},hidden:{title:'ગુપ્ત ક્ષેત્રના ગુણ',name:'નામ',value:'વૅલ્યૂ'},image:{title:'ચિત્રના ગુણ',titleButton:'ચિત્ર બટનના ગુણ',menu:'ચિત્રના ગુણ',infoTab:'ચિત્ર ની જાણકારી',btnUpload:'આ સર્વરને મોકલવું',upload:'અપલોડ',alt:'ઑલ્ટર્નટ ટેક્સ્ટ',lockRatio:'લૉક ગુણોત્તર',resetSize:'રીસેટ સાઇઝ',border:'બોર્ડર',hSpace:'સમસ્તરીય જગ્યા',vSpace:'લંબરૂપ જગ્યા',alertUrl:'ચિત્રની URL ટાઇપ કરો',linkTab:'લિંક',button2Img:'તમારે ઈમેજ બટનને સાદી ઈમેજમાં બદલવું છે.',img2Button:'તમારે સાદી ઈમેજને ઈમેજ બટનમાં બદલવું છે.',urlMissing:'ઈમેજની મૂળ URL છે નહી.',validateBorder:'બોર્ડેર આંકડો હોવો જોઈએ.',validateHSpace:'HSpaceઆંકડો હોવો જોઈએ.',validateVSpace:'VSpace આંકડો હોવો જોઈએ. '},flash:{properties:'ફ્લૅશના ગુણ',propertiesTab:'ગુણ',title:'ફ્લૅશ ગુણ',chkPlay:'ઑટો/સ્વયં પ્લે',chkLoop:'લૂપ',chkMenu:'ફ્લૅશ મેન્યૂ નો પ્રયોગ કરો',chkFull:'ફૂલ સ્ક્રીન કરવું',scale:'સ્કેલ',scaleAll:'સ્કેલ ઓલ/બધુ બતાવો',scaleNoBorder:'સ્કેલ બોર્ડર વગર',scaleFit:'સ્કેલ એકદમ ફીટ',access:'સ્ક્રીપ્ટ એક્સેસ',accessAlways:'હમેશાં',accessSameDomain:'એજ ડોમેન',accessNever:'નહી',alignAbsBottom:'Abs નીચે',alignAbsMiddle:'Abs ઉપર',alignBaseline:'આધાર લીટી',alignTextTop:'ટેક્સ્ટ ઉપર',quality:'ગુણધર્મ',qualityBest:'શ્રેષ્ઠ',qualityHigh:'ઊંચું',qualityAutoHigh:'ઓટો ઊંચું',qualityMedium:'મધ્યમ',qualityAutoLow:'ઓટો નીચું',qualityLow:'નીચું',windowModeWindow:'વિન્ડો',windowModeOpaque:'અપારદર્શક',windowModeTransparent:'પારદર્શક',windowMode:'વિન્ડો મોડ',flashvars:'ફલેશ ના વિકલ્પો',bgcolor:'બૅકગ્રાઉન્ડ રંગ,',hSpace:'સમસ્તરીય જગ્યા',vSpace:'લંબરૂપ જગ્યા',validateSrc:'લિંક URL ટાઇપ કરો',validateHSpace:'HSpace આંકડો હોવો જોઈએ.',validateVSpace:'VSpace આંકડો હોવો જોઈએ.'},spellCheck:{toolbar:'જોડણી (સ્પેલિંગ) તપાસવી',title:'સ્પેલ ',notAvailable:'માફ કરશો, આ સુવિધા ઉપલબ્ધ નથી',errorLoading:'સર્વિસ એપ્લીકેશન લોડ નથી થ: %s.',notInDic:'શબ્દકોશમાં નથી',changeTo:'આનાથી બદલવું',btnIgnore:'ઇગ્નોર/અવગણના કરવી',btnIgnoreAll:'બધાની ઇગ્નોર/અવગણના કરવી',btnReplace:'બદલવું',btnReplaceAll:'બધા બદલી કરો',btnUndo:'અન્ડૂ',noSuggestions:'- કઇ સજેશન નથી -',progress:'શબ્દની જોડણી/સ્પેલ ચેક ચાલુ છે...',noMispell:'શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: ખોટી જોડણી મળી નથી',noChanges:'શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: એકપણ શબ્દ બદલયો નથી',oneChange:'શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: એક શબ્દ બદલયો છે',manyChanges:'શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: %1 શબ્દ બદલયા છે',ieSpellDownload:'સ્પેલ-ચેકર ઇન્સ્ટોલ નથી. શું તમે ડાઉનલોડ કરવા માંગો છો?'},smiley:{toolbar:'સ્માઇલી',title:'સ્માઇલી પસંદ કરો',options:'સમ્ય્લી વિકલ્પો'},elementsPath:{eleLabel:'એલીમેન્ટ્સ નો ',eleTitle:'એલીમેન્ટ %1'},numberedlist:'સંખ્યાંકન સૂચિ',bulletedlist:'બુલેટ સૂચિ',indent:'ઇન્ડેન્ટ, લીટીના આરંભમાં જગ્યા વધારવી',outdent:'ઇન્ડેન્ટ લીટીના આરંભમાં જગ્યા ઘટાડવી',justify:{left:'ડાબી બાજુએ/બાજુ તરફ',center:'સંકેંદ્રણ/સેંટરિંગ',right:'જમણી બાજુએ/બાજુ તરફ',block:'બ્લૉક, અંતરાય જસ્ટિફાઇ'},blockquote:'બ્લૉક-કોટ, અવતરણચિહ્નો',clipboard:{title:'પેસ્ટ',cutError:'તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસ કટ કરવાની પરવાનગી નથી આપતી. (Ctrl/Cmd+X) નો ઉપયોગ કરો.',copyError:'તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસ કોપી કરવાની પરવાનગી નથી આપતી. (Ctrl/Cmd+C) का प्रयोग करें।',pasteMsg:'Ctrl/Cmd+V નો પ્રયોગ કરી પેસ્ટ કરો',securityMsg:'તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસના કારણે,એડિટર તમારા કિલ્પબોર્ડ ડેટા ને કોપી નથી કરી શકતો. તમારે આ વિન્ડોમાં ફરીથી પેસ્ટ કરવું પડશે.',pasteArea:'પેસ્ટ કરવાની જગ્યા'},pastefromword:{confirmCleanup:'તમે જે ટેક્ષ્ત્ કોપી કરી રહ્યા છો ટે વર્ડ ની છે. કોપી કરતા પેહલા સાફ કરવી છે?',toolbar:'પેસ્ટ (વડૅ ટેક્સ્ટ)',title:'પેસ્ટ (વડૅ ટેક્સ્ટ)',error:'પેસ્ટ કરેલો ડેટા ઇન્ટરનલ એરર ના લીથે સાફ કરી શકાયો નથી.'},pasteText:{button:'પેસ્ટ (ટેક્સ્ટ)',title:'પેસ્ટ (ટેક્સ્ટ)'},templates:{button:'ટેમ્પ્લેટ',title:'કન્ટેન્ટ ટેમ્પ્લેટ',options:'ટેમ્પ્લેટના વિકલ્પો',insertOption:'મૂળ શબ્દને બદલો',selectPromptMsg:'એડિટરમાં ઓપન કરવા ટેમ્પ્લેટ પસંદ કરો (વર્તમાન કન્ટેન્ટ સેવ નહીં થાય):',emptyListMsg:'(કોઈ ટેમ્પ્લેટ ડિફાઇન નથી)'},showBlocks:'બ્લૉક બતાવવું',stylesCombo:{label:'શૈલી/રીત',panelTitle:'ફોર્મેટ ',panelTitle1:'બ્લોક ',panelTitle2:'ઈનલાઈન ',panelTitle3:'ઓબ્જેક્ટ પદ્ધતિ'},format:{label:'ફૉન્ટ ફૉર્મટ, રચનાની શૈલી',panelTitle:'ફૉન્ટ ફૉર્મટ, રચનાની શૈલી',tag_p:'સામાન્ય',tag_pre:'ફૉર્મટેડ',tag_address:'સરનામું',tag_h1:'શીર્ષક 1',tag_h2:'શીર્ષક 2',tag_h3:'શીર્ષક 3',tag_h4:'શીર્ષક 4',tag_h5:'શીર્ષક 5',tag_h6:'શીર્ષક 6',tag_div:'શીર્ષક (DIV)'},div:{title:'Div કન્ટેનર બનાવુંવું',toolbar:'Div કન્ટેનર બનાવુંવું',cssClassInputLabel:'સ્ટાઈલશીટ કલાસીસ',styleSelectLabel:'સ્ટાઈલ',IdInputLabel:'Id',languageCodeInputLabel:'ભાષાનો કોડ',inlineStyleInputLabel:'ઈનલાઈન પદ્ધતિ',advisoryTitleInputLabel:'એડવાઈઝર શીર્ષક',langDirLabel:'ભાષાની દિશા',langDirLTRLabel:'ડાબે થી જમણે (LTR)',langDirRTLLabel:'જમણે થી ડાબે (RTL)',edit:'ડીવીમાં ફેરફાર કરવો',remove:'ડીવી કાઢી કાઢવું'},iframe:{title:'IFrame વિકલ્પો',toolbar:'IFrame',noUrl:'iframe URL ટાઈપ્ કરો',scrolling:'સ્ક્રોલબાર ચાલુ કરવા',border:'ફ્રેમ બોર્ડેર બતાવવી'},font:{label:'ફૉન્ટ',voiceLabel:'ફોન્ટ',panelTitle:'ફૉન્ટ'},fontSize:{label:'ફૉન્ટ સાઇઝ/કદ',voiceLabel:'ફોન્ટ સાઈઝ',panelTitle:'ફૉન્ટ સાઇઝ/કદ'},colorButton:{textColorTitle:'શબ્દનો રંગ',bgColorTitle:'બૅકગ્રાઉન્ડ રંગ,',panelTitle:'રંગ',auto:'સ્વચાલિત',more:'ઔર રંગ...'},colors:{'000':'કાળો',800000:'મરુન','8B4513':'છીક','2F4F4F':'ડાર્ક સ્લેટ ગ્રે ','008080':'ટીલ','000080':'નેવી','4B0082':'જામલી',696969:'ડાર્ક ગ્રે',B22222:'ઈટ',A52A2A:'બ્રાઉન',DAA520:'ગોલ્ડન રોડ','006400':'ડાર્ક લીલો','40E0D0':'ટ્રકોઈસ','0000CD':'મધ્યમ વાદળી',800080:'પર્પલ',808080:'ગ્રે',F00:'લાલ',FF8C00:'ડાર્ક ઓરંજ',FFD700:'ગોલ્ડ','008000':'ગ્રીન','0FF':'સાયન','00F':'વાદળી',EE82EE:'વાયોલેટ',A9A9A9:'ડીમ ',FFA07A:'લાઈટ સાલમન',FFA500:'ઓરંજ',FFFF00:'પીળો','00FF00':'લાઈમ',AFEEEE:'પેલ કોઈસ',ADD8E6:'લાઈટ બ્લુ',DDA0DD:'પલ્મ',D3D3D3:'લાઈટ ગ્રે',FFF0F5:'લવંડર ',FAEBD7:'એન્ટીક સફેદ',FFFFE0:'લાઈટ પીળો',F0FFF0:'હનીડઉય',F0FFFF:'અઝુરે',F0F8FF:'એલીસ બ્લુ',E6E6FA:'લવંડર',FFF:'સફેદ'},scayt:{title:'ટાઈપ કરતા સ્પેલ તપાસો',opera_title:'ઓપેરામાં સપોર્ટ નથી',enable:'SCAYT એનેબલ કરવું',disable:'SCAYT ડિસેબલ કરવું',about:'SCAYT વિષે',toggle:'SCAYT ટોગલ',options:'વિકલ્પો',langs:'ભાષાઓ',moreSuggestions:'વધારે વિકલ્પો',ignore:'ઇગ્નોર',ignoreAll:'બધા ઇગ્નોર ',addWord:'શબ્દ ઉમેરવો',emptyDic:'ડિક્સનરીનું નામ ખાલી ના હોય.',optionsTab:'વિકલ્પો',allCaps:'ઓલ-કેપ્સ વર્ડ છોડી દો.',ignoreDomainNames:'ડોમેન નામ છોડી દો.',mixedCase:'મિક્સ કેસ વર્ડ છોડી દો.',mixedWithDigits:'આંકડા વાળા શબ્દ છોડી દો.',languagesTab:'ભાષા',dictionariesTab:'શબ્દકોશ',dic_field_name:'શબ્દકોશ નામ',dic_create:'બનાવવું',dic_restore:'પાછું ',dic_delete:'કાઢી નાખવું',dic_rename:'નવું નામ આપવું',dic_info:'પેહલા User Dictionary, Cookie તરીકે સ્ટોર થાય છે. પણ Cookie ની સમતા ઓછી છે. જયારે User Dictionary, Cookie તરીકે સ્ટોર ના કરી શકાય, ત્યારે તે અમારા સર્વર પર સ્ટોર થાય છે. તમારી વ્યતિગત ડીકસ્નરી ને સર્વર પર સ્ટોર કરવા માટે તમારે તેનું નામ આપવું પડશે. જો તમે તમારી ડીકસ્નરી નું નામ આપેલું હોય તો તમે રિસ્ટોર બટન ક્લીક કરી શકો.',aboutTab:'વિષે'},about:{title:'CKEditor વિષે',dlgTitle:'CKEditor વિષે',help:'મદદ માટે $1 તપાસો',userGuide:'CKEditor યુઝર્સ ગાઈડ',moreInfo:'લાયસનસની માહિતી માટે અમારી વેબ સાઈટ',copy:'કોપીરાઈટ © $1. ઓલ રાઈટ્સ '},maximize:'મોટું કરવું',minimize:'નાનું કરવું',fakeobjects:{anchor:'અનકર',flash:'ફ્લેશ ',iframe:'IFrame',hiddenfield:'હિડન ',unknown:'અનનોન ઓબ્જેક્ટ'},resize:'ખેંચી ને યોગ્ય કરવું',colordialog:{title:'રંગ પસંદ કરો',options:'રંગના વિકલ્પ',highlight:'હાઈઈટ',selected:'પસંદ કરેલો રંગ',clear:'સાફ કરવું'},toolbarCollapse:'ટૂલબાર નાનું કરવું',toolbarExpand:'ટૂલબાર મોટું કરવું',toolbarGroups:{document:'દસ્તાવેજ',clipboard:'ક્લિપબોર્ડ/અન',editing:'એડીટ કરવું',forms:'ફોર્મ',basicstyles:'બેસિક્ સ્ટાઇલ',paragraph:'ફકરો',links:'લીંક',insert:'ઉમેરવું',styles:'સ્ટાઇલ',colors:'રંગ',tools:'ટૂલ્સ'},bidi:{ltr:'ટેક્ષ્ત્ ની દિશા ડાબે થી જમણે',rtl:'ટેક્ષ્ત્ ની દિશા જમણે થી ડાબે'},docprops:{label:'ડૉક્યુમન્ટ ગુણ/પ્રૉપર્ટિઝ',title:'ડૉક્યુમન્ટ ગુણ/પ્રૉપર્ટિઝ',design:'ડીસા',meta:'મેટાડૅટા',chooseColor:'વિકલ્પ',other:'<other>',docTitle:'પેજ મથાળું/ટાઇટલ',charset:'કેરેક્ટર સેટ એન્કોડિંગ',charsetOther:'અન્ય કેરેક્ટર સેટ એન્કોડિંગ',charsetASCII:'ASCII',charsetCE:'મધ્ય યુરોપિઅન (Central European)',charsetCT:'ચાઇનીઝ (Chinese Traditional Big5)',charsetCR:'સિરીલિક (Cyrillic)',charsetGR:'ગ્રીક (Greek)',charsetJP:'જાપાનિઝ (Japanese)',charsetKR:'કોરીયન (Korean)',charsetTR:'ટર્કિ (Turkish)',charsetUN:'યૂનિકોડ (UTF-8)',charsetWE:'પશ્ચિમ યુરોપિઅન (Western European)',docType:'ડૉક્યુમન્ટ પ્રકાર શીર્ષક',docTypeOther:'અન્ય ડૉક્યુમન્ટ પ્રકાર શીર્ષક',xhtmlDec:'XHTML સૂચના સમાવિષ્ટ કરવી',bgColor:'બૅકગ્રાઉન્ડ રંગ',bgImage:'બૅકગ્રાઉન્ડ ચિત્ર URL',bgFixed:'સ્ક્રોલ ન થાય તેવું બૅકગ્રાઉન્ડ',txtColor:'શબ્દનો રંગ',margin:'પેજ માર્જિન',marginTop:'ઉપર',marginLeft:'ડાબી',marginRight:'જમણી',marginBottom:'નીચે',metaKeywords:'ડૉક્યુમન્ટ ઇન્ડેક્સ સંકેતશબ્દ (અલ્પવિરામ (,) થી અલગ કરો)',metaDescription:'ડૉક્યુમન્ટ વર્ણન',metaAuthor:'લેખક',metaCopyright:'કૉપિરાઇટ',previewHtml:'<p>આ એક <strong>સેમ્પલ ટેક્ષ્ત્</strong> છે. તમે <a href="javascript:void(0)">CKEditor</a> વાપરો છો.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.gu={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'એડીટર ટૂલ બાર',editor:'રીચ ટેક્ષ્ત્ એડીટર',source:'મૂળ કે પ્રાથમિક દસ્તાવેજ',newPage:'નવુ પાનું',save:'સેવ',preview:'પૂર્વદર્શન',cut:'કાપવું',copy:'નકલ',paste:'પેસ્ટ',print:'પ્રિન્ટ',underline:'અન્ડર્લાઇન, નીચે લીટી',bold:'બોલ્ડ/સ્પષ્ટ',italic:'ઇટેલિક, ત્રાંસા',selectAll:'બઘું પસંદ કરવું',removeFormat:'ફૉર્મટ કાઢવું',strike:'છેકી નાખવું',subscript:'એક ચિહ્નની નીચે કરેલું બીજું ચિહ્ન',superscript:'એક ચિહ્ન ઉપર કરેલું બીજું ચિહ્ન.',horizontalrule:'સમસ્તરીય રેખા ઇન્સર્ટ/દાખલ કરવી',pagebreak:'ઇન્સર્ટ પેજબ્રેક/પાનાને અલગ કરવું/દાખલ કરવું',pagebreakAlt:'નવું પાનું',unlink:'લિંક કાઢવી',undo:'રદ કરવું; પહેલાં હતી એવી સ્થિતિ પાછી લાવવી',redo:'રિડૂ; પછી હતી એવી સ્થિતિ પાછી લાવવી',common:{browseServer:'સર્વર બ્રાઉઝ કરો',url:'URL',protocol:'પ્રોટોકૉલ',upload:'અપલોડ',uploadSubmit:'આ સર્વરને મોકલવું',image:'ચિત્ર',flash:'ફ્લૅશ',form:'ફૉર્મ/પત્રક',checkbox:'ચેક બોક્સ',radio:'રેડિઓ બટન',textField:'ટેક્સ્ટ ફીલ્ડ, શબ્દ ક્ષેત્ર',textarea:'ટેક્સ્ટ એરિઆ, શબ્દ વિસ્તાર',hiddenField:'ગુપ્ત ક્ષેત્ર',button:'બટન',select:'પસંદગી ક્ષેત્ર',imageButton:'ચિત્ર બટન',notSet:'<સેટ નથી>',id:'Id',name:'નામ',langDir:'ભાષા લેખવાની પદ્ધતિ',langDirLtr:'ડાબે થી જમણે (LTR)',langDirRtl:'જમણે થી ડાબે (RTL)',langCode:'ભાષા કોડ',longDescr:'વધારે માહિતી માટે URL',cssClass:'સ્ટાઇલ-શીટ ક્લાસ',advisoryTitle:'મુખ્ય મથાળું',cssStyle:'સ્ટાઇલ',ok:'ઠીક છે',cancel:'રદ કરવું',close:'બંધ કરવું',preview:'જોવું',generalTab:'જનરલ',advancedTab:'અડ્વાન્સડ',validateNumberFailed:'આ રકમ આકડો નથી.',confirmNewPage:'સવે કાર્ય વગરનું ફકરો ખોવાઈ જશે. તમને ખાતરી છે કે તમને નવું પાનું ખોલવું છે?',confirmCancel:'ઘણા વિકલ્પો બદલાયા છે. તમારે આ બોક્ષ્ બંધ કરવું છે?',options:'વિકલ્પો',target:'લક્ષ્ય',targetNew:'નવી વિન્ડો (_blank)',targetTop:'ઉપરની વિન્ડો (_top)',targetSelf:'એજ વિન્ડો (_self)',targetParent:'પેરનટ વિન્ડો (_parent)',langDirLTR:'ડાબે થી જમણે (LTR)',langDirRTL:'જમણે થી ડાબે (RTL)',styles:'શૈલી',cssClasses:'શૈલી કલાસીસ',width:'પહોળાઈ',height:'ઊંચાઈ',align:'લાઇનદોરીમાં ગોઠવવું',alignLeft:'ડાબી બાજુ ગોઠવવું',alignRight:'જમણી',alignCenter:'મધ્ય સેન્ટર',alignTop:'ઉપર',alignMiddle:'વચ્ચે',alignBottom:'નીચે',invalidHeight:'ઉંચાઈ એક આંકડો હોવો જોઈએ.',invalidWidth:'પોહળ ઈ એક આંકડો હોવો જોઈએ.',invalidCssLength:'"%1" ની વેલ્યુ એક પોસીટીવ આંકડો હોવો જોઈએ અથવા CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc) વગર.',invalidHtmlLength:'"%1" ની વેલ્યુ એક પોસીટીવ આંકડો હોવો જોઈએ અથવા HTML measurement unit (px or %) વગર.',invalidInlineStyle:'ઈનલાઈન સ્ટાઈલ ની વેલ્યુ "name : value" ના ફોર્મેટ માં હોવી જોઈએ, વચ્ચે સેમી-કોલોન જોઈએ.',cssLengthTooltip:'પિક્ષ્લ્ નો આંકડો CSS unit (px, %, in, cm, mm, em, ex, pt, or pc) માં નાખો.',unavailable:'%1<span class="cke_accessibility">, નથી મળતું</span>'},contextmenu:{options:'કોન્તેક્ષ્ત્ મેનુના વિકલ્પો'},specialChar:{toolbar:'વિશિષ્ટ અક્ષર ઇન્સર્ટ/દાખલ કરવું',title:'સ્પેશિઅલ વિશિષ્ટ અક્ષર પસંદ કરો',options:'સ્પેશિઅલ કરેક્ટરના વિકલ્પો'},link:{toolbar:'લિંક ઇન્સર્ટ/દાખલ કરવી',other:'<other> <અન્ય>',menu:' લિંક એડિટ/માં ફેરફાર કરવો',title:'લિંક',info:'લિંક ઇન્ફૉ ટૅબ',target:'ટાર્ગેટ/લક્ષ્ય',upload:'અપલોડ',advanced:'અડ્વાન્સડ',type:'લિંક પ્રકાર',toUrl:'URL',toAnchor:'આ પેજનો ઍંકર',toEmail:'ઈ-મેલ',targetFrame:'<ફ્રેમ>',targetPopup:'<પૉપ-અપ વિન્ડો>',targetFrameName:'ટાર્ગેટ ફ્રેમ નું નામ',targetPopupName:'પૉપ-અપ વિન્ડો નું નામ',popupFeatures:'પૉપ-અપ વિન્ડો ફીચરસૅ',popupResizable:'રીસાઈઝએબલ',popupStatusBar:'સ્ટૅટસ બાર',popupLocationBar:'લોકેશન બાર',popupToolbar:'ટૂલ બાર',popupMenuBar:'મેન્યૂ બાર',popupFullScreen:'ફુલ સ્ક્રીન (IE)',popupScrollBars:'સ્ક્રોલ બાર',popupDependent:'ડિપેન્ડન્ટ (Netscape)',popupLeft:'ડાબી બાજુ',popupTop:'જમણી બાજુ',id:'Id',langDir:'ભાષા લેખવાની પદ્ધતિ',langDirLTR:'ડાબે થી જમણે (LTR)',langDirRTL:'જમણે થી ડાબે (RTL)',acccessKey:'ઍક્સેસ કી',name:'નામ',langCode:'ભાષા લેખવાની પદ્ધતિ',tabIndex:'ટૅબ ઇન્ડેક્સ',advisoryTitle:'મુખ્ય મથાળું',advisoryContentType:'મુખ્ય કન્ટેન્ટ પ્રકાર',cssClasses:'સ્ટાઇલ-શીટ ક્લાસ',charset:'લિંક રિસૉર્સ કૅરિક્ટર સેટ',styles:'સ્ટાઇલ',rel:'સંબંધની સ્થિતિ',selectAnchor:'ઍંકર પસંદ કરો',anchorName:'ઍંકર નામથી પસંદ કરો',anchorId:'ઍંકર એલિમન્ટ Id થી પસંદ કરો',emailAddress:'ઈ-મેલ સરનામું',emailSubject:'ઈ-મેલ વિષય',emailBody:'સંદેશ',noAnchors:'(ડૉક્યુમન્ટમાં ઍંકરની સંખ્યા)',noUrl:'લિંક URL ટાઇપ કરો',noEmail:'ઈ-મેલ સરનામું ટાઇપ કરો'},anchor:{toolbar:'ઍંકર ઇન્સર્ટ/દાખલ કરવી',menu:'ઍંકરના ગુણ',title:'ઍંકરના ગુણ',name:'ઍંકરનું નામ',errorName:'ઍંકરનું નામ ટાઈપ કરો',remove:'સ્થિર નકરવું'},list:{numberedTitle:'આંકડાના લીસ્ટના ગુણ',bulletedTitle:'બુલેટેડ લીસ્ટના ગુણ',type:'પ્રકાર',start:'શરુ કરવું',validateStartNumber:'લીસ્ટના સરુઆતનો આંકડો પુરો હોવો જોઈએ.',circle:'વર્તુળ',disc:'ડિસ્ક',square:'ચોરસ',none:'કસુ ',notset:'<સેટ નથી>',armenian:'અરમેનિયન આંકડા પદ્ધતિ',georgian:'ગેઓર્ગિયન આંકડા પદ્ધતિ (an, ban, gan, etc.)',lowerRoman:'રોમન નાના (i, ii, iii, iv, v, etc.)',upperRoman:'રોમન મોટા (I, II, III, IV, V, etc.)',lowerAlpha:'આલ્ફા નાના (a, b, c, d, e, etc.)',upperAlpha:'આલ્ફા મોટા (A, B, C, D, E, etc.)',lowerGreek:'ગ્રીક નાના (alpha, beta, gamma, etc.)',decimal:'આંકડા (1, 2, 3, etc.)',decimalLeadingZero:'સુન્ય આગળ આંકડા (01, 02, 03, etc.)'},findAndReplace:{title:'શોધવું અને બદલવું',find:'શોધવું',replace:'રિપ્લેસ/બદલવું',findWhat:'આ શોધો',replaceWith:'આનાથી બદલો',notFoundMsg:'તમે શોધેલી ટેક્સ્ટ નથી મળી',findOptions:'વીકલ્પ શોધો',matchCase:'કેસ સરખા રાખો',matchWord:'બઘા શબ્દ સરખા રાખો',matchCyclic:'સરખાવવા બધા',replaceAll:'બઘા બદલી ',replaceSuccessMsg:'%1 ફેરફારો બાદલાયા છે.'},table:{toolbar:'ટેબલ, કોઠો',title:'ટેબલ, કોઠાનું મથાળું',menu:'ટેબલ, કોઠાનું મથાળું',deleteTable:'કોઠો ડિલીટ/કાઢી નાખવું',rows:'પંક્તિના ખાના',columns:'કૉલમ/ઊભી કટાર',border:'કોઠાની બાજુ(બોર્ડર) સાઇઝ',widthPx:'પિકસલ',widthPc:'પ્રતિશત',widthUnit:'પોહાલાઈ એકમ',cellSpace:'સેલ અંતર',cellPad:'સેલ પૅડિંગ',caption:'મથાળું/કૅપ્શન ',summary:'ટૂંકો એહેવાલ',headers:'મથાળા',headersNone:'નથી ',headersColumn:'પહેલી ઊભી કટાર',headersRow:'પહેલી કટાર',headersBoth:'બેવું',invalidRows:'આડી કટાર, 0 કરતા વધારે હોવી જોઈએ.',invalidCols:'ઉભી કટાર, 0 કરતા વધારે હોવી જોઈએ.',invalidBorder:'બોર્ડર એક આંકડો હોવો જોઈએ',invalidWidth:'ટેબલની પોહલાઈ આંકડો હોવો જોઈએ.',invalidHeight:'ટેબલની ઊંચાઈ આંકડો હોવો જોઈએ.',invalidCellSpacing:'સેલ વચ્ચેની જગ્યા સુન્ય કરતા વધારે હોવી જોઈએ.',invalidCellPadding:'સેલની અંદરની જગ્યા સુન્ય કરતા વધારે હોવી જોઈએ.',cell:{menu:'કોષના ખાના',insertBefore:'પહેલાં કોષ ઉમેરવો',insertAfter:'પછી કોષ ઉમેરવો',deleteCell:'કોષ ડિલીટ/કાઢી નાખવો',merge:'કોષ ભેગા કરવા',mergeRight:'જમણી બાજુ ભેગા કરવા',mergeDown:'નીચે ભેગા કરવા',splitHorizontal:'કોષને સમસ્તરીય વિભાજન કરવું',splitVertical:'કોષને સીધું ને ઊભું વિભાજન કરવું',title:'સેલના ગુણ',cellType:'સેલનો પ્રકાર',rowSpan:'આડી કટારની જગ્યા',colSpan:'ઊભી કતારની જગ્યા',wordWrap:'વર્ડ રેપ',hAlign:'સપાટ લાઈનદોરી',vAlign:'ઊભી લાઈનદોરી',alignBaseline:'બસે લાઈન',bgColor:'પાછાળનો રંગ',borderColor:'બોર્ડેર રંગ',data:'સ્વીકૃત માહિતી',header:'મથાળું',yes:'હા',no:'ના',invalidWidth:'સેલની પોહલાઈ આંકડો હોવો જોઈએ.',invalidHeight:'સેલની ઊંચાઈ આંકડો હોવો જોઈએ.',invalidRowSpan:'રો સ્પાન આંકડો હોવો જોઈએ.',invalidColSpan:'કોલમ સ્પાન આંકડો હોવો જોઈએ.',chooseColor:'પસંદ કરવું'},row:{menu:'પંક્તિના ખાના',insertBefore:'પહેલાં પંક્તિ ઉમેરવી',insertAfter:'પછી પંક્તિ ઉમેરવી',deleteRow:'પંક્તિઓ ડિલીટ/કાઢી નાખવી'},column:{menu:'કૉલમ/ઊભી કટાર',insertBefore:'પહેલાં કૉલમ/ઊભી કટાર ઉમેરવી',insertAfter:'પછી કૉલમ/ઊભી કટાર ઉમેરવી',deleteColumn:'કૉલમ/ઊભી કટાર ડિલીટ/કાઢી નાખવી'}},button:{title:'બટનના ગુણ',text:'ટેક્સ્ટ (વૅલ્યૂ)',type:'પ્રકાર',typeBtn:'બટન',typeSbm:'સબ્મિટ',typeRst:'રિસેટ'},checkboxAndRadio:{checkboxTitle:'ચેક બોક્સ ગુણ',radioTitle:'રેડિઓ બટનના ગુણ',value:'વૅલ્યૂ',selected:'સિલેક્ટેડ'},form:{title:'ફૉર્મ/પત્રકના ગુણ',menu:'ફૉર્મ/પત્રકના ગુણ',action:'ક્રિયા',method:'પદ્ધતિ',encoding:'અન્કોડીન્ગ'},select:{title:'પસંદગી ક્ષેત્રના ગુણ',selectInfo:'સૂચના',opAvail:'ઉપલબ્ધ વિકલ્પ',value:'વૅલ્યૂ',size:'સાઇઝ',lines:'લીટીઓ',chkMulti:'એકથી વધારે પસંદ કરી શકો',opText:'ટેક્સ્ટ',opValue:'વૅલ્યૂ',btnAdd:'ઉમેરવું',btnModify:'બદલવું',btnUp:'ઉપર',btnDown:'નીચે',btnSetValue:'પસંદ કરલી વૅલ્યૂ સેટ કરો',btnDelete:'રદ કરવું'},textarea:{title:'ટેક્સ્ટ એઅરિઆ, શબ્દ વિસ્તારના ગુણ',cols:'કૉલમ/ઊભી કટાર',rows:'પંક્તિઓ'},textfield:{title:'ટેક્સ્ટ ફીલ્ડ, શબ્દ ક્ષેત્રના ગુણ',name:'નામ',value:'વૅલ્યૂ',charWidth:'કેરેક્ટરની પહોળાઈ',maxChars:'અધિકતમ કેરેક્ટર',type:'ટાઇપ',typeText:'ટેક્સ્ટ',typePass:'પાસવર્ડ'},hidden:{title:'ગુપ્ત ક્ષેત્રના ગુણ',name:'નામ',value:'વૅલ્યૂ'},image:{title:'ચિત્રના ગુણ',titleButton:'ચિત્ર બટનના ગુણ',menu:'ચિત્રના ગુણ',infoTab:'ચિત્ર ની જાણકારી',btnUpload:'આ સર્વરને મોકલવું',upload:'અપલોડ',alt:'ઑલ્ટર્નટ ટેક્સ્ટ',lockRatio:'લૉક ગુણોત્તર',resetSize:'રીસેટ સાઇઝ',border:'બોર્ડર',hSpace:'સમસ્તરીય જગ્યા',vSpace:'લંબરૂપ જગ્યા',alertUrl:'ચિત્રની URL ટાઇપ કરો',linkTab:'લિંક',button2Img:'તમારે ઈમેજ બટનને સાદી ઈમેજમાં બદલવું છે.',img2Button:'તમારે સાદી ઈમેજને ઈમેજ બટનમાં બદલવું છે.',urlMissing:'ઈમેજની મૂળ URL છે નહી.',validateBorder:'બોર્ડેર આંકડો હોવો જોઈએ.',validateHSpace:'HSpaceઆંકડો હોવો જોઈએ.',validateVSpace:'VSpace આંકડો હોવો જોઈએ. '},flash:{properties:'ફ્લૅશના ગુણ',propertiesTab:'ગુણ',title:'ફ્લૅશ ગુણ',chkPlay:'ઑટો/સ્વયં પ્લે',chkLoop:'લૂપ',chkMenu:'ફ્લૅશ મેન્યૂ નો પ્રયોગ કરો',chkFull:'ફૂલ સ્ક્રીન કરવું',scale:'સ્કેલ',scaleAll:'સ્કેલ ઓલ/બધુ બતાવો',scaleNoBorder:'સ્કેલ બોર્ડર વગર',scaleFit:'સ્કેલ એકદમ ફીટ',access:'સ્ક્રીપ્ટ એક્સેસ',accessAlways:'હમેશાં',accessSameDomain:'એજ ડોમેન',accessNever:'નહી',alignAbsBottom:'Abs નીચે',alignAbsMiddle:'Abs ઉપર',alignBaseline:'આધાર લીટી',alignTextTop:'ટેક્સ્ટ ઉપર',quality:'ગુણધર્મ',qualityBest:'શ્રેષ્ઠ',qualityHigh:'ઊંચું',qualityAutoHigh:'ઓટો ઊંચું',qualityMedium:'મધ્યમ',qualityAutoLow:'ઓટો નીચું',qualityLow:'નીચું',windowModeWindow:'વિન્ડો',windowModeOpaque:'અપારદર્શક',windowModeTransparent:'પારદર્શક',windowMode:'વિન્ડો મોડ',flashvars:'ફલેશ ના વિકલ્પો',bgcolor:'બૅકગ્રાઉન્ડ રંગ,',hSpace:'સમસ્તરીય જગ્યા',vSpace:'લંબરૂપ જગ્યા',validateSrc:'લિંક URL ટાઇપ કરો',validateHSpace:'HSpace આંકડો હોવો જોઈએ.',validateVSpace:'VSpace આંકડો હોવો જોઈએ.'},spellCheck:{toolbar:'જોડણી (સ્પેલિંગ) તપાસવી',title:'સ્પેલ ',notAvailable:'માફ કરશો, આ સુવિધા ઉપલબ્ધ નથી',errorLoading:'સર્વિસ એપ્લીકેશન લોડ નથી થ: %s.',notInDic:'શબ્દકોશમાં નથી',changeTo:'આનાથી બદલવું',btnIgnore:'ઇગ્નોર/અવગણના કરવી',btnIgnoreAll:'બધાની ઇગ્નોર/અવગણના કરવી',btnReplace:'બદલવું',btnReplaceAll:'બધા બદલી કરો',btnUndo:'અન્ડૂ',noSuggestions:'- કઇ સજેશન નથી -',progress:'શબ્દની જોડણી/સ્પેલ ચેક ચાલુ છે...',noMispell:'શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: ખોટી જોડણી મળી નથી',noChanges:'શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: એકપણ શબ્દ બદલયો નથી',oneChange:'શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: એક શબ્દ બદલયો છે',manyChanges:'શબ્દની જોડણી/સ્પેલ ચેક પૂર્ણ: %1 શબ્દ બદલયા છે',ieSpellDownload:'સ્પેલ-ચેકર ઇન્સ્ટોલ નથી. શું તમે ડાઉનલોડ કરવા માંગો છો?'},smiley:{toolbar:'સ્માઇલી',title:'સ્માઇલી પસંદ કરો',options:'સમ્ય્લી વિકલ્પો'},elementsPath:{eleLabel:'એલીમેન્ટ્સ નો ',eleTitle:'એલીમેન્ટ %1'},numberedlist:'સંખ્યાંકન સૂચિ',bulletedlist:'બુલેટ સૂચિ',indent:'ઇન્ડેન્ટ, લીટીના આરંભમાં જગ્યા વધારવી',outdent:'ઇન્ડેન્ટ લીટીના આરંભમાં જગ્યા ઘટાડવી',justify:{left:'ડાબી બાજુએ/બાજુ તરફ',center:'સંકેંદ્રણ/સેંટરિંગ',right:'જમણી બાજુએ/બાજુ તરફ',block:'બ્લૉક, અંતરાય જસ્ટિફાઇ'},blockquote:'બ્લૉક-કોટ, અવતરણચિહ્નો',clipboard:{title:'પેસ્ટ',cutError:'તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસ કટ કરવાની પરવાનગી નથી આપતી. (Ctrl/Cmd+X) નો ઉપયોગ કરો.',copyError:'તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસ કોપી કરવાની પરવાનગી નથી આપતી. (Ctrl/Cmd+C) का प्रयोग करें।',pasteMsg:'Ctrl/Cmd+V નો પ્રયોગ કરી પેસ્ટ કરો',securityMsg:'તમારા બ્રાઉઝર ની સુરક્ષિત સેટિંગસના કારણે,એડિટર તમારા કિલ્પબોર્ડ ડેટા ને કોપી નથી કરી શકતો. તમારે આ વિન્ડોમાં ફરીથી પેસ્ટ કરવું પડશે.',pasteArea:'પેસ્ટ કરવાની જગ્યા'},pastefromword:{confirmCleanup:'તમે જે ટેક્ષ્ત્ કોપી કરી રહ્યા છો ટે વર્ડ ની છે. કોપી કરતા પેહલા સાફ કરવી છે?',toolbar:'પેસ્ટ (વડૅ ટેક્સ્ટ)',title:'પેસ્ટ (વડૅ ટેક્સ્ટ)',error:'પેસ્ટ કરેલો ડેટા ઇન્ટરનલ એરર ના લીથે સાફ કરી શકાયો નથી.'},pasteText:{button:'પેસ્ટ (ટેક્સ્ટ)',title:'પેસ્ટ (ટેક્સ્ટ)'},templates:{button:'ટેમ્પ્લેટ',title:'કન્ટેન્ટ ટેમ્પ્લેટ',options:'ટેમ્પ્લેટના વિકલ્પો',insertOption:'મૂળ શબ્દને બદલો',selectPromptMsg:'એડિટરમાં ઓપન કરવા ટેમ્પ્લેટ પસંદ કરો (વર્તમાન કન્ટેન્ટ સેવ નહીં થાય):',emptyListMsg:'(કોઈ ટેમ્પ્લેટ ડિફાઇન નથી)'},showBlocks:'બ્લૉક બતાવવું',stylesCombo:{label:'શૈલી/રીત',panelTitle:'ફોર્મેટ ',panelTitle1:'બ્લોક ',panelTitle2:'ઈનલાઈન ',panelTitle3:'ઓબ્જેક્ટ પદ્ધતિ'},format:{label:'ફૉન્ટ ફૉર્મટ, રચનાની શૈલી',panelTitle:'ફૉન્ટ ફૉર્મટ, રચનાની શૈલી',tag_p:'સામાન્ય',tag_pre:'ફૉર્મટેડ',tag_address:'સરનામું',tag_h1:'શીર્ષક 1',tag_h2:'શીર્ષક 2',tag_h3:'શીર્ષક 3',tag_h4:'શીર્ષક 4',tag_h5:'શીર્ષક 5',tag_h6:'શીર્ષક 6',tag_div:'શીર્ષક (DIV)'},div:{title:'Div કન્ટેનર બનાવુંવું',toolbar:'Div કન્ટેનર બનાવુંવું',cssClassInputLabel:'સ્ટાઈલશીટ કલાસીસ',styleSelectLabel:'સ્ટાઈલ',IdInputLabel:'Id',languageCodeInputLabel:'ભાષાનો કોડ',inlineStyleInputLabel:'ઈનલાઈન પદ્ધતિ',advisoryTitleInputLabel:'એડવાઈઝર શીર્ષક',langDirLabel:'ભાષાની દિશા',langDirLTRLabel:'ડાબે થી જમણે (LTR)',langDirRTLLabel:'જમણે થી ડાબે (RTL)',edit:'ડીવીમાં ફેરફાર કરવો',remove:'ડીવી કાઢી કાઢવું'},iframe:{title:'IFrame વિકલ્પો',toolbar:'IFrame',noUrl:'iframe URL ટાઈપ્ કરો',scrolling:'સ્ક્રોલબાર ચાલુ કરવા',border:'ફ્રેમ બોર્ડેર બતાવવી'},font:{label:'ફૉન્ટ',voiceLabel:'ફોન્ટ',panelTitle:'ફૉન્ટ'},fontSize:{label:'ફૉન્ટ સાઇઝ/કદ',voiceLabel:'ફોન્ટ સાઈઝ',panelTitle:'ફૉન્ટ સાઇઝ/કદ'},colorButton:{textColorTitle:'શબ્દનો રંગ',bgColorTitle:'બૅકગ્રાઉન્ડ રંગ,',panelTitle:'રંગ',auto:'સ્વચાલિત',more:'ઔર રંગ...'},colors:{'000':'કાળો',800000:'મરુન','8B4513':'છીક','2F4F4F':'ડાર્ક સ્લેટ ગ્રે ','008080':'ટીલ','000080':'નેવી','4B0082':'જામલી',696969:'ડાર્ક ગ્રે',B22222:'ઈટ',A52A2A:'બ્રાઉન',DAA520:'ગોલ્ડન રોડ','006400':'ડાર્ક લીલો','40E0D0':'ટ્રકોઈસ','0000CD':'મધ્યમ વાદળી',800080:'પર્પલ',808080:'ગ્રે',F00:'લાલ',FF8C00:'ડાર્ક ઓરંજ',FFD700:'ગોલ્ડ','008000':'ગ્રીન','0FF':'સાયન','00F':'વાદળી',EE82EE:'વાયોલેટ',A9A9A9:'ડીમ ',FFA07A:'લાઈટ સાલમન',FFA500:'ઓરંજ',FFFF00:'પીળો','00FF00':'લાઈમ',AFEEEE:'પેલ કોઈસ',ADD8E6:'લાઈટ બ્લુ',DDA0DD:'પલ્મ',D3D3D3:'લાઈટ ગ્રે',FFF0F5:'લવંડર ',FAEBD7:'એન્ટીક સફેદ',FFFFE0:'લાઈટ પીળો',F0FFF0:'હનીડઉય',F0FFFF:'અઝુરે',F0F8FF:'એલીસ બ્લુ',E6E6FA:'લવંડર',FFF:'સફેદ'},scayt:{title:'ટાઈપ કરતા સ્પેલ તપાસો',opera_title:'ઓપેરામાં સપોર્ટ નથી',enable:'SCAYT એનેબલ કરવું',disable:'SCAYT ડિસેબલ કરવું',about:'SCAYT વિષે',toggle:'SCAYT ટોગલ',options:'વિકલ્પો',langs:'ભાષાઓ',moreSuggestions:'વધારે વિકલ્પો',ignore:'ઇગ્નોર',ignoreAll:'બધા ઇગ્નોર ',addWord:'શબ્દ ઉમેરવો',emptyDic:'ડિક્સનરીનું નામ ખાલી ના હોય.',optionsTab:'વિકલ્પો',allCaps:'ઓલ-કેપ્સ વર્ડ છોડી દો.',ignoreDomainNames:'ડોમેન નામ છોડી દો.',mixedCase:'મિક્સ કેસ વર્ડ છોડી દો.',mixedWithDigits:'આંકડા વાળા શબ્દ છોડી દો.',languagesTab:'ભાષા',dictionariesTab:'શબ્દકોશ',dic_field_name:'શબ્દકોશ નામ',dic_create:'બનાવવું',dic_restore:'પાછું ',dic_delete:'કાઢી નાખવું',dic_rename:'નવું નામ આપવું',dic_info:'પેહલા User Dictionary, Cookie તરીકે સ્ટોર થાય છે. પણ Cookie ની સમતા ઓછી છે. જયારે User Dictionary, Cookie તરીકે સ્ટોર ના કરી શકાય, ત્યારે તે અમારા સર્વર પર સ્ટોર થાય છે. તમારી વ્યતિગત ડીકસ્નરી ને સર્વર પર સ્ટોર કરવા માટે તમારે તેનું નામ આપવું પડશે. જો તમે તમારી ડીકસ્નરી નું નામ આપેલું હોય તો તમે રિસ્ટોર બટન ક્લીક કરી શકો.',aboutTab:'વિષે'},about:{title:'CKEditor વિષે',dlgTitle:'CKEditor વિષે',help:'મદદ માટે $1 તપાસો',userGuide:'CKEditor યુઝર્સ ગાઈડ',moreInfo:'લાયસનસની માહિતી માટે અમારી વેબ સાઈટ',copy:'કોપીરાઈટ © $1. ઓલ રાઈટ્સ '},maximize:'મોટું કરવું',minimize:'નાનું કરવું',fakeobjects:{anchor:'અનકર',flash:'ફ્લેશ ',iframe:'IFrame',hiddenfield:'હિડન ',unknown:'અનનોન ઓબ્જેક્ટ'},resize:'ખેંચી ને યોગ્ય કરવું',colordialog:{title:'રંગ પસંદ કરો',options:'રંગના વિકલ્પ',highlight:'હાઈઈટ',selected:'પસંદ કરેલો રંગ',clear:'સાફ કરવું'},toolbarCollapse:'ટૂલબાર નાનું કરવું',toolbarExpand:'ટૂલબાર મોટું કરવું',toolbarGroups:{document:'દસ્તાવેજ',clipboard:'ક્લિપબોર્ડ/અન',editing:'એડીટ કરવું',forms:'ફોર્મ',basicstyles:'બેસિક્ સ્ટાઇલ',paragraph:'ફકરો',links:'લીંક',insert:'ઉમેરવું',styles:'સ્ટાઇલ',colors:'રંગ',tools:'ટૂલ્સ'},bidi:{ltr:'ટેક્ષ્ત્ ની દિશા ડાબે થી જમણે',rtl:'ટેક્ષ્ત્ ની દિશા જમણે થી ડાબે'},docprops:{label:'ડૉક્યુમન્ટ ગુણ/પ્રૉપર્ટિઝ',title:'ડૉક્યુમન્ટ ગુણ/પ્રૉપર્ટિઝ',design:'ડીસા',meta:'મેટાડૅટા',chooseColor:'વિકલ્પ',other:'<other>',docTitle:'પેજ મથાળું/ટાઇટલ',charset:'કેરેક્ટર સેટ એન્કોડિંગ',charsetOther:'અન્ય કેરેક્ટર સેટ એન્કોડિંગ',charsetASCII:'ASCII',charsetCE:'મધ્ય યુરોપિઅન (Central European)',charsetCT:'ચાઇનીઝ (Chinese Traditional Big5)',charsetCR:'સિરીલિક (Cyrillic)',charsetGR:'ગ્રીક (Greek)',charsetJP:'જાપાનિઝ (Japanese)',charsetKR:'કોરીયન (Korean)',charsetTR:'ટર્કિ (Turkish)',charsetUN:'યૂનિકોડ (UTF-8)',charsetWE:'પશ્ચિમ યુરોપિઅન (Western European)',docType:'ડૉક્યુમન્ટ પ્રકાર શીર્ષક',docTypeOther:'અન્ય ડૉક્યુમન્ટ પ્રકાર શીર્ષક',xhtmlDec:'XHTML સૂચના સમાવિષ્ટ કરવી',bgColor:'બૅકગ્રાઉન્ડ રંગ',bgImage:'બૅકગ્રાઉન્ડ ચિત્ર URL',bgFixed:'સ્ક્રોલ ન થાય તેવું બૅકગ્રાઉન્ડ',txtColor:'શબ્દનો રંગ',margin:'પેજ માર્જિન',marginTop:'ઉપર',marginLeft:'ડાબી',marginRight:'જમણી',marginBottom:'નીચે',metaKeywords:'ડૉક્યુમન્ટ ઇન્ડેક્સ સંકેતશબ્દ (અલ્પવિરામ (,) થી અલગ કરો)',metaDescription:'ડૉક્યુમન્ટ વર્ણન',metaAuthor:'લેખક',metaCopyright:'કૉપિરાઇટ',previewHtml:'<p>આ એક <strong>સેમ્પલ ટેક્ષ્ત્</strong> છે. તમે <a href="javascript:void(0)">CKEditor</a> વાપરો છો.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/he.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/he.js
index 93ffb37..37079ca 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/he.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/he.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.he={dir:'rtl',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'סרגלי כלים של העורך',editor:'עורך טקסט עשיר',source:'מקור',newPage:'דף חדש',save:'שמירה',preview:'תצוגה מקדימה',cut:'גזירה',copy:'העתקה',paste:'הדבקה',print:'הדפסה',underline:'קו תחתון',bold:'מודגש',italic:'נטוי',selectAll:'בחירת הכל',removeFormat:'הסרת העיצוב',strike:'כתיב מחוק',subscript:'כתיב תחתון',superscript:'כתיב עליון',horizontalrule:'הוספת קו אופקי',pagebreak:'הוספת שבירת דף',pagebreakAlt:'שבירת דף',unlink:'הסרת הקישור',undo:'ביטול צעד אחרון',redo:'חזרה על צעד אחרון',common:{browseServer:'סייר השרת',url:'כתובת (URL)',protocol:'פרוטוקול',upload:'העלאה',uploadSubmit:'שליחה לשרת',image:'תמונה',flash:'פלאש',form:'טופס',checkbox:'תיבת סימון',radio:'לחצן אפשרויות',textField:'שדה טקסט',textarea:'איזור טקסט',hiddenField:'שדה חבוי',button:'כפתור',select:'שדה בחירה',imageButton:'כפתור תמונה',notSet:'<לא נקבע>',id:'זיהוי (ID)',name:'שם',langDir:'כיוון שפה',langDirLtr:'שמאל לימין (LTR)',langDirRtl:'ימין לשמאל (RTL)',langCode:'קוד שפה',longDescr:'קישור לתיאור מפורט',cssClass:'מחלקת עיצוב (CSS Class)',advisoryTitle:'כותרת מוצעת',cssStyle:'סגנון',ok:'אישור',cancel:'ביטול',close:'סגירה',preview:'תצוגה מקדימה',generalTab:'כללי',advancedTab:'אפשרויות מתקדמות',validateNumberFailed:'הערך חייב להיות מספרי.',confirmNewPage:'כל השינויים שלא נשמרו יאבדו. האם להעלות דף חדש?',confirmCancel:'חלק מהאפשרויות שונו, האם לסגור את הדיאלוג?',options:'אפשרויות',target:'מטרה',targetNew:'חלון חדש (_blank)',targetTop:'החלון העליון ביותר (_top)',targetSelf:'אותו חלון (_self)',targetParent:'חלון האב (_parent)',langDirLTR:'שמאל לימין (LTR)',langDirRTL:'ימין לשמאל (RTL)',styles:'סגנון',cssClasses:'מחלקות גליונות סגנון',width:'רוחב',height:'גובה',align:'יישור',alignLeft:'לשמאל',alignRight:'לימין',alignCenter:'מרכז',alignTop:'למעלה',alignMiddle:'לאמצע',alignBottom:'לתחתית',invalidHeight:'הגובה חייב להיות מספר.',invalidWidth:'הרוחב חייב להיות מספר.',invalidCssLength:'הערך שצוין לשדה "%1" חייב להיות מספר חיובי עם או ללא יחידת מידה חוקית של CSS (px, %, in, cm, mm, em, ex, pt, או pc).',invalidHtmlLength:'הערך שצוין לשדה "%1" חייב להיות מספר חיובי עם או ללא יחידת מידה חוקית של HTML (px או %).',invalidInlineStyle:'הערך שצויין לשדה הסגנון חייב להכיל זוג ערכים אחד או יותר בפורמט "שם : ערך", מופרדים על ידי נקודה-פסיק.',cssLengthTooltip:'יש להכניס מספר המייצג פיקסלים או מספר עם יחידת גליונות סגנון תקינה (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, לא זמין</span>'},contextmenu:{options:'אפשרויות תפריט ההקשר'},specialChar:{toolbar:'הוספת תו מיוחד',title:'בחירת תו מיוחד',options:'אפשרויות תווים מיוחדים'},link:{toolbar:'הוספת/עריכת קישור',other:'<אחר>',menu:'מאפייני קישור',title:'קישור',info:'מידע על הקישור',target:'מטרה',upload:'העלאה',advanced:'אפשרויות מתקדמות',type:'סוג קישור',toUrl:'כתובת (URL)',toAnchor:'עוגן בעמוד זה',toEmail:'דוא"ל',targetFrame:'<מסגרת>',targetPopup:'<חלון קופץ>',targetFrameName:'שם מסגרת היעד',targetPopupName:'שם החלון הקופץ',popupFeatures:'תכונות החלון הקופץ',popupResizable:'שינוי גודל',popupStatusBar:'סרגל חיווי',popupLocationBar:'סרגל כתובת',popupToolbar:'סרגל הכלים',popupMenuBar:'סרגל תפריט',popupFullScreen:'מסך מלא (IE)',popupScrollBars:'ניתן לגלילה',popupDependent:'תלוי (Netscape)',popupLeft:'מיקום צד שמאל',popupTop:'מיקום צד עליון',id:'זיהוי (ID)',langDir:'כיוון שפה',langDirLTR:'שמאל לימין (LTR)',langDirRTL:'ימין לשמאל (RTL)',acccessKey:'מקש גישה',name:'שם',langCode:'קוד שפה',tabIndex:'מספר טאב',advisoryTitle:'כותרת מוצעת',advisoryContentType:'Content Type מוצע',cssClasses:'גיליונות עיצוב קבוצות',charset:'קידוד המשאב המקושר',styles:'סגנון',rel:'קשר גומלין',selectAnchor:'בחירת עוגן',anchorName:'עפ"י שם העוגן',anchorId:'עפ"י זיהוי (ID) האלמנט',emailAddress:'כתובת הדוא"ל',emailSubject:'נושא ההודעה',emailBody:'גוף ההודעה',noAnchors:'(אין עוגנים זמינים בדף)',noUrl:'יש להקליד את כתובת הקישור (URL)',noEmail:'יש להקליד את כתובת הדוא"ל'},anchor:{toolbar:'הוספת/עריכת נקודת עיגון',menu:'מאפייני נקודת עיגון',title:'מאפייני נקודת עיגון',name:'שם לנקודת עיגון',errorName:'יש להקליד שם לנקודת עיגון',remove:'מחיקת נקודת עיגון'},list:{numberedTitle:'תכונות רשימה ממוספרת',bulletedTitle:'תכונות רשימת תבליטים',type:'סוג',start:'תחילת מספור',validateStartNumber:'שדה תחילת המספור חייב להכיל מספר שלם.',circle:'עיגול ריק',disc:'עיגול מלא',square:'ריבוע',none:'ללא',notset:'<לא נקבע>',armenian:'ספרות ארמניות',georgian:"ספרות גיאורגיות (an, ban, gan וכו')",lowerRoman:"ספירה רומית באותיות קטנות (i, ii, iii, iv, v וכו')",upperRoman:"ספירה רומיות באותיות גדולות (I, II, III, IV, V וכו')",lowerAlpha:"אותיות אנגליות קטנות (a, b, c, d, e וכו')",upperAlpha:"אותיות אנגליות גדולות (A, B, C, D, E וכו')",lowerGreek:"אותיות יווניות קטנות (alpha, beta, gamma וכו')",decimal:"ספרות (1, 2, 3 וכו')",decimalLeadingZero:"ספרות עם 0 בהתחלה (01, 02, 03 וכו')"},findAndReplace:{title:'חיפוש והחלפה',find:'חיפוש',replace:'החלפה',findWhat:'חיפוש מחרוזת:',replaceWith:'החלפה במחרוזת:',notFoundMsg:'הטקסט המבוקש לא נמצא.',findOptions:'אפשרויות חיפוש',matchCase:'הבחנה בין אותיות רשיות לקטנות (Case)',matchWord:'התאמה למילה המלאה',matchCyclic:'התאמה מחזורית',replaceAll:'החלפה בכל העמוד',replaceSuccessMsg:'%1 טקסטים הוחלפו.'},table:{toolbar:'טבלה',title:'מאפייני טבלה',menu:'מאפייני טבלה',deleteTable:'מחק טבלה',rows:'שורות',columns:'עמודות',border:'גודל מסגרת',widthPx:'פיקסלים',widthPc:'אחוז',widthUnit:'יחידת רוחב',cellSpace:'מרווח תא',cellPad:'ריפוד תא',caption:'כיתוב',summary:'תקציר',headers:'כותרות',headersNone:'אין',headersColumn:'עמודה ראשונה',headersRow:'שורה ראשונה',headersBoth:'שניהם',invalidRows:'שדה מספר השורות חייב להיות מספר גדול מ 0.',invalidCols:'שדה מספר העמודות חייב להיות מספר גדול מ 0.',invalidBorder:'שדה גודל המסגרת חייב להיות מספר.',invalidWidth:'שדה רוחב הטבלה חייב להיות מספר.',invalidHeight:'שדה גובה הטבלה חייב להיות מספר.',invalidCellSpacing:'שדה ריווח התאים חייב להיות מספר חיובי.',invalidCellPadding:'שדה ריפוד התאים חייב להיות מספר חיובי.',cell:{menu:'מאפייני תא',insertBefore:'הוספת תא לפני',insertAfter:'הוספת תא אחרי',deleteCell:'מחיקת תאים',merge:'מיזוג תאים',mergeRight:'מזג ימינה',mergeDown:'מזג למטה',splitHorizontal:'פיצול תא אופקית',splitVertical:'פיצול תא אנכית',title:'תכונות התא',cellType:'סוג התא',rowSpan:'מתיחת השורות',colSpan:'מתיחת התאים',wordWrap:'מניעת גלישת שורות',hAlign:'יישור אופקי',vAlign:'יישור אנכי',alignBaseline:'שורת בסיס',bgColor:'צבע רקע',borderColor:'צבע מסגרת',data:'מידע',header:'כותרת',yes:'כן',no:'לא',invalidWidth:'שדה רוחב התא חייב להיות מספר.',invalidHeight:'שדה גובה התא חייב להיות מספר.',invalidRowSpan:'שדה מתיחת השורות חייב להיות מספר שלם.',invalidColSpan:'שדה מתיחת העמודות חייב להיות מספר שלם.',chooseColor:'בחר'},row:{menu:'שורה',insertBefore:'הוספת שורה לפני',insertAfter:'הוספת שורה אחרי',deleteRow:'מחיקת שורות'},column:{menu:'עמודה',insertBefore:'הוספת עמודה לפני',insertAfter:'הוספת עמודה אחרי',deleteColumn:'מחיקת עמודות'}},button:{title:'מאפייני כפתור',text:'טקסט (ערך)',type:'סוג',typeBtn:'כפתור',typeSbm:'שליחה',typeRst:'איפוס'},checkboxAndRadio:{checkboxTitle:'מאפייני תיבת סימון',radioTitle:'מאפייני לחצן אפשרויות',value:'ערך',selected:'מסומן'},form:{title:'מאפיני טופס',menu:'מאפיני טופס',action:'שלח אל',method:'סוג שליחה',encoding:'קידוד'},select:{title:'מאפייני שדה בחירה',selectInfo:'מידע',opAvail:'אפשרויות זמינות',value:'ערך',size:'גודל',lines:'שורות',chkMulti:'איפשור בחירות מרובות',opText:'טקסט',opValue:'ערך',btnAdd:'הוספה',btnModify:'שינוי',btnUp:'למעלה',btnDown:'למטה',btnSetValue:'קביעה כברירת מחדל',btnDelete:'מחיקה'},textarea:{title:'מאפייני איזור טקסט',cols:'עמודות',rows:'שורות'},textfield:{title:'מאפייני שדה טקסט',name:'שם',value:'ערך',charWidth:'רוחב לפי תווים',maxChars:'מקסימום תווים',type:'סוג',typeText:'טקסט',typePass:'סיסמה'},hidden:{title:'מאפיני שדה חבוי',name:'שם',value:'ערך'},image:{title:'מאפייני התמונה',titleButton:'מאפיני כפתור תמונה',menu:'תכונות התמונה',infoTab:'מידע על התמונה',btnUpload:'שליחה לשרת',upload:'העלאה',alt:'טקסט חלופי',lockRatio:'נעילת היחס',resetSize:'איפוס הגודל',border:'מסגרת',hSpace:'מרווח אופקי',vSpace:'מרווח אנכי',alertUrl:'יש להקליד את כתובת התמונה',linkTab:'קישור',button2Img:'האם להפוך את תמונת הכפתור לתמונה פשוטה?',img2Button:'האם להפוך את התמונה לכפתור תמונה?',urlMissing:'כתובת התמונה חסרה.',validateBorder:'שדה המסגרת חייב להיות מספר שלם.',validateHSpace:'שדה המרווח האופקי חייב להיות מספר שלם.',validateVSpace:'שדה המרווח האנכי חייב להיות מספר שלם.'},flash:{properties:'מאפייני פלאש',propertiesTab:'מאפיינים',title:'מאפיני פלאש',chkPlay:'ניגון אוטומטי',chkLoop:'לולאה',chkMenu:'אפשר תפריט פלאש',chkFull:'אפשר חלון מלא',scale:'גודל',scaleAll:'הצג הכל',scaleNoBorder:'ללא גבולות',scaleFit:'התאמה מושלמת',access:'גישת סקריפט',accessAlways:'תמיד',accessSameDomain:'דומיין זהה',accessNever:'אף פעם',alignAbsBottom:'לתחתית האבסולוטית',alignAbsMiddle:'מרכוז אבסולוטי',alignBaseline:'לקו התחתית',alignTextTop:'לראש הטקסט',quality:'איכות',qualityBest:'מעולה',qualityHigh:'גבוהה',qualityAutoHigh:'גבוהה אוטומטית',qualityMedium:'ממוצעת',qualityAutoLow:'נמוכה אוטומטית',qualityLow:'נמוכה',windowModeWindow:'חלון',windowModeOpaque:'אטום',windowModeTransparent:'שקוף',windowMode:'מצב חלון',flashvars:'משתנים לפלאש',bgcolor:'צבע רקע',hSpace:'מרווח אופקי',vSpace:'מרווח אנכי',validateSrc:'יש להקליד את כתובת סרטון הפלאש (URL)',validateHSpace:'המרווח האופקי חייב להיות מספר.',validateVSpace:'המרווח האנכי חייב להיות מספר.'},spellCheck:{toolbar:'בדיקת איות',title:'בדיקת איות',notAvailable:'לא נמצא שירות זמין.',errorLoading:'שגיאה בהעלאת השירות: %s.',notInDic:'לא נמצא במילון',changeTo:'שינוי ל',btnIgnore:'התעלמות',btnIgnoreAll:'התעלמות מהכל',btnReplace:'החלפה',btnReplaceAll:'החלפת הכל',btnUndo:'החזרה',noSuggestions:'- אין הצעות -',progress:'בודק האיות בתהליך בדיקה....',noMispell:'בדיקות איות הסתיימה: לא נמצאו שגיאות כתיב',noChanges:'בדיקות איות הסתיימה: לא שונתה אף מילה',oneChange:'בדיקות איות הסתיימה: שונתה מילה אחת',manyChanges:'בדיקות איות הסתיימה: %1 מילים שונו',ieSpellDownload:'בודק האיות לא מותקן, האם להורידו?'},smiley:{toolbar:'סמיילי',title:'הוספת סמיילי',options:'אפשרויות סמיילים'},elementsPath:{eleLabel:'עץ האלמנטים',eleTitle:'%1 אלמנט'},numberedlist:'רשימה ממוספרת',bulletedlist:'רשימת נקודות',indent:'הגדלת הזחה',outdent:'הקטנת הזחה',justify:{left:'יישור לשמאל',center:'מרכוז',right:'יישור לימין',block:'יישור לשוליים'},blockquote:'בלוק ציטוט',clipboard:{title:'הדבקה',cutError:'הגדרות האבטחה בדפדפן שלך לא מאפשרות לעורך לבצע פעולות גזירה אוטומטיות. יש להשתמש במקלדת לשם כך (Ctrl/Cmd+X).',copyError:'הגדרות האבטחה בדפדפן שלך לא מאפשרות לעורך לבצע פעולות העתקה אוטומטיות. יש להשתמש במקלדת לשם כך (Ctrl/Cmd+C).',pasteMsg:'נא להדביק בתוך הקופסה באמצעות (<b>Ctrl/Cmd+V</b>) וללחוץ על <b>אישור</b>.',securityMsg:'עקב הגדרות אבטחה בדפדפן, לא ניתן לגשת אל לוח הגזירים (Clipboard) בצורה ישירה. נא להדביק שוב בחלון זה.',pasteArea:'איזור הדבקה'},pastefromword:{confirmCleanup:'נראה הטקסט שבכוונתך להדביק מקורו בקובץ וורד. האם ברצונך לנקות אותו טרם ההדבקה?',toolbar:'הדבקה מ-Word',title:'הדבקה מ-Word',error:'לא ניתן היה לנקות את המידע בשל תקלה פנימית.'},pasteText:{button:'הדבקה כטקסט פשוט',title:'הדבקה כטקסט פשוט'},templates:{button:'תבניות',title:'תביות תוכן',options:'אפשרויות התבניות',insertOption:'החלפת תוכן ממשי',selectPromptMsg:'יש לבחור תבנית לפתיחה בעורך.<br />התוכן המקורי ימחק:',emptyListMsg:'(לא הוגדרו תבניות)'},showBlocks:'הצגת בלוקים',stylesCombo:{label:'סגנון',panelTitle:'סגנונות פורמט',panelTitle1:'סגנונות בלוק',panelTitle2:'סגנונות רצף',panelTitle3:'סגנונות אובייקט'},format:{label:'עיצוב',panelTitle:'עיצוב',tag_p:'נורמלי',tag_pre:'קוד',tag_address:'כתובת',tag_h1:'כותרת',tag_h2:'כותרת 2',tag_h3:'כותרת 3',tag_h4:'כותרת 4',tag_h5:'כותרת 5',tag_h6:'כותרת 6',tag_div:'נורמלי (DIV)'},div:{title:'יצירת מיכל (Div)',toolbar:'יצירת מיכל (Div)',cssClassInputLabel:'מחלקת עיצוב',styleSelectLabel:'סגנון',IdInputLabel:'מזהה (ID)',languageCodeInputLabel:'קוד שפה',inlineStyleInputLabel:'סגנון פנימי',advisoryTitleInputLabel:'כותרת מוצעת',langDirLabel:'כיוון שפה',langDirLTRLabel:'שמאל לימין (LTR)',langDirRTLLabel:'ימין לשמאל (RTL)',edit:'עריכת מיכל (Div)',remove:'הסרת מיכל (Div)'},iframe:{title:'מאפייני חלון פנימי (iframe)',toolbar:'חלון פנימי (iframe)',noUrl:'יש להכניס כתובת לחלון.',scrolling:'אפשר פסי גלילה',border:'הראה מסגרת לחלון'},font:{label:'גופן',voiceLabel:'גופן',panelTitle:'גופן'},fontSize:{label:'גודל',voiceLabel:'גודל',panelTitle:'גודל'},colorButton:{textColorTitle:'צבע טקסט',bgColorTitle:'צבע רקע',panelTitle:'צבעים',auto:'אוטומטי',more:'צבעים נוספים...'},colors:{'000':'שחור',800000:'סגול כהה','8B4513':'חום בהיר','2F4F4F':'אפור צפחה','008080':'כחול-ירוק','000080':'כחול-סגול','4B0082':'אינדיגו',696969:'אפור מעומעם',B22222:'אדום-חום',A52A2A:'חום',DAA520:'כתום זהב','006400':'ירוק כהה','40E0D0':'טורקיז','0000CD':'כחול בינוני',800080:'סגול',808080:'אפור',F00:'אדום',FF8C00:'כתום כהה',FFD700:'זהב','008000':'ירוק','0FF':'ציאן','00F':'כחול',EE82EE:'סגלגל',A9A9A9:'אפור כהה',FFA07A:'כתום-וורוד',FFA500:'כתום',FFFF00:'צהוב','00FF00':'ליים',AFEEEE:'טורקיז בהיר',ADD8E6:'כחול בהיר',DDA0DD:'שזיף',D3D3D3:'אפור בהיר',FFF0F5:'לבנדר מסמיק',FAEBD7:'לבן עתיק',FFFFE0:'צהוב בהיר',F0FFF0:'טל דבש',F0FFFF:'תכלת',F0F8FF:'כחול טיפת מים',E6E6FA:'לבנדר',FFF:'לבן'},scayt:{title:'בדיקת איות בזמן כתיבה (SCAYT)',opera_title:'לא זמין בדפדפן אופרה',enable:'אפשר SCAYT',disable:'בטל SCAYT',about:'אודות SCAYT',toggle:'שינוי SCAYT',options:'אפשרויות',langs:'שפות',moreSuggestions:'הצעות נוספות',ignore:'התעלמות',ignoreAll:'התעלמות מהכל',addWord:'הוספת מילה',emptyDic:'יש לבחור מילון.',optionsTab:'אפשרויות',allCaps:'התעלם ממילים שכל אותיותיהן גדולות',ignoreDomainNames:'התעלם משמות מתחם',mixedCase:'התעלם ממילים עם אותיות גדולות וקטנות ביחד',mixedWithDigits:'התעלם ממילים עם מספרים',languagesTab:'שפות',dictionariesTab:'מילון',dic_field_name:'שם המילון',dic_create:'יצירה',dic_restore:'שחזור',dic_delete:'מחיקה',dic_rename:'שינוי שם',dic_info:'בהתחלה מילון המשתמש מאוחסן בעוגיה, אך עוגיות מוגבלות במקום. כאשר המילון מגיע לגודל בו הוא אינו יכול להתאכסן בעוגיה, המילון צריך להתאכסן בשרתנו. לשם כך עליך לתת שם למילון. אם כבר יש לך מילון מאוחסן, יש להכניס את שמו וללחוץ על כפתור השחזור.',aboutTab:'אודות'},about:{title:'אודות CKEditor',dlgTitle:'אודות CKEditor',help:'היכנסו ל$1 לעזרה.',userGuide:'מדריך המשתמש של CKEditor',moreInfo:'למידע נוסף בקרו באתרנו:',copy:'Copyright © $1. כל הזכויות שמורות.'},maximize:'הגדלה למקסימום',minimize:'הקטנה למינימום',fakeobjects:{anchor:'עוגן',flash:'סרטון פלאש',iframe:'חלון פנימי (iframe)',hiddenfield:'שדה חבוי',unknown:'אובייקט לא ידוע'},resize:'יש לגרור בכדי לשנות את הגודל',colordialog:{title:'בחירת צבע',options:'אפשרויות צבע',highlight:'סימון',selected:'בחירה',clear:'ניקוי'},toolbarCollapse:'מזעור סרגל כלים',toolbarExpand:'הרחבת סרגל כלים',toolbarGroups:{document:'מסמך',clipboard:'לוח הגזירים (Clipboard)/צעד אחרון',editing:'עריכה',forms:'טפסים',basicstyles:'עיצוב בסיסי',paragraph:'פסקה',links:'קישורים',insert:'הכנסה',styles:'עיצוב',colors:'צבעים',tools:'כלים'},bidi:{ltr:'כיוון טקסט משמאל לימין (LTR)',rtl:'כיוון טקסט מימין לשמאל (RTL)'},docprops:{label:'מאפייני מסמך',title:'מאפייני מסמך',design:'עיצוב',meta:'תגי Meta',chooseColor:'בחירה',other:'אחר...',docTitle:'כותרת עמוד',charset:'קידוד תווים',charsetOther:'קידוד תווים אחר',charsetASCII:'ASCII',charsetCE:'מרכז אירופאי',charsetCT:'סיני מסורתי (Big5)',charsetCR:'קירילי',charsetGR:'יווני',charsetJP:'יפני',charsetKR:'קוריאני',charsetTR:'טורקי',charsetUN:'יוניקוד (UTF-8)',charsetWE:'מערב אירופאי',docType:'כותר סוג מסמך',docTypeOther:'כותר סוג מסמך אחר',xhtmlDec:'כלול הכרזות XHTML',bgColor:'צבע רקע',bgImage:'כתובת של תמונת רקע',bgFixed:'רקע לא נגלל (צמוד)',txtColor:'צבע טקסט',margin:'מרווחי עמוד',marginTop:'עליון',marginLeft:'שמאלי',marginRight:'ימני',marginBottom:'תחתון',metaKeywords:'מילות מפתח של המסמך (מופרדות בפסיק)',metaDescription:'תיאור המסמך',metaAuthor:'מחבר/ת',metaCopyright:'זכויות יוצרים',previewHtml:'<p>זהו <strong>טקסט הדגמה</strong>. את/ה משתמש/ת ב<a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.he={dir:'rtl',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'סרגלי כלים של העורך',editor:'עורך טקסט עשיר',source:'מקור',newPage:'דף חדש',save:'שמירה',preview:'תצוגה מקדימה',cut:'גזירה',copy:'העתקה',paste:'הדבקה',print:'הדפסה',underline:'קו תחתון',bold:'מודגש',italic:'נטוי',selectAll:'בחירת הכל',removeFormat:'הסרת העיצוב',strike:'כתיב מחוק',subscript:'כתיב תחתון',superscript:'כתיב עליון',horizontalrule:'הוספת קו אופקי',pagebreak:'הוספת שבירת דף',pagebreakAlt:'שבירת דף',unlink:'הסרת הקישור',undo:'ביטול צעד אחרון',redo:'חזרה על צעד אחרון',common:{browseServer:'סייר השרת',url:'כתובת (URL)',protocol:'פרוטוקול',upload:'העלאה',uploadSubmit:'שליחה לשרת',image:'תמונה',flash:'פלאש',form:'טופס',checkbox:'תיבת סימון',radio:'לחצן אפשרויות',textField:'שדה טקסט',textarea:'איזור טקסט',hiddenField:'שדה חבוי',button:'כפתור',select:'שדה בחירה',imageButton:'כפתור תמונה',notSet:'<לא נקבע>',id:'זיהוי (ID)',name:'שם',langDir:'כיוון שפה',langDirLtr:'שמאל לימין (LTR)',langDirRtl:'ימין לשמאל (RTL)',langCode:'קוד שפה',longDescr:'קישור לתיאור מפורט',cssClass:'מחלקת עיצוב (CSS Class)',advisoryTitle:'כותרת מוצעת',cssStyle:'סגנון',ok:'אישור',cancel:'ביטול',close:'סגירה',preview:'תצוגה מקדימה',generalTab:'כללי',advancedTab:'אפשרויות מתקדמות',validateNumberFailed:'הערך חייב להיות מספרי.',confirmNewPage:'כל השינויים שלא נשמרו יאבדו. האם להעלות דף חדש?',confirmCancel:'חלק מהאפשרויות שונו, האם לסגור את הדיאלוג?',options:'אפשרויות',target:'מטרה',targetNew:'חלון חדש (_blank)',targetTop:'החלון העליון ביותר (_top)',targetSelf:'אותו חלון (_self)',targetParent:'חלון האב (_parent)',langDirLTR:'שמאל לימין (LTR)',langDirRTL:'ימין לשמאל (RTL)',styles:'סגנון',cssClasses:'מחלקות גליונות סגנון',width:'רוחב',height:'גובה',align:'יישור',alignLeft:'לשמאל',alignRight:'לימין',alignCenter:'מרכז',alignTop:'למעלה',alignMiddle:'לאמצע',alignBottom:'לתחתית',invalidHeight:'הגובה חייב להיות מספר.',invalidWidth:'הרוחב חייב להיות מספר.',invalidCssLength:'הערך שצוין לשדה "%1" חייב להיות מספר חיובי עם או ללא יחידת מידה חוקית של CSS (px, %, in, cm, mm, em, ex, pt, או pc).',invalidHtmlLength:'הערך שצוין לשדה "%1" חייב להיות מספר חיובי עם או ללא יחידת מידה חוקית של HTML (px או %).',invalidInlineStyle:'הערך שצויין לשדה הסגנון חייב להכיל זוג ערכים אחד או יותר בפורמט "שם : ערך", מופרדים על ידי נקודה-פסיק.',cssLengthTooltip:'יש להכניס מספר המייצג פיקסלים או מספר עם יחידת גליונות סגנון תקינה (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, לא זמין</span>'},contextmenu:{options:'אפשרויות תפריט ההקשר'},specialChar:{toolbar:'הוספת תו מיוחד',title:'בחירת תו מיוחד',options:'אפשרויות תווים מיוחדים'},link:{toolbar:'הוספת/עריכת קישור',other:'<אחר>',menu:'מאפייני קישור',title:'קישור',info:'מידע על הקישור',target:'מטרה',upload:'העלאה',advanced:'אפשרויות מתקדמות',type:'סוג קישור',toUrl:'כתובת (URL)',toAnchor:'עוגן בעמוד זה',toEmail:'דוא"ל',targetFrame:'<מסגרת>',targetPopup:'<חלון קופץ>',targetFrameName:'שם מסגרת היעד',targetPopupName:'שם החלון הקופץ',popupFeatures:'תכונות החלון הקופץ',popupResizable:'שינוי גודל',popupStatusBar:'סרגל חיווי',popupLocationBar:'סרגל כתובת',popupToolbar:'סרגל הכלים',popupMenuBar:'סרגל תפריט',popupFullScreen:'מסך מלא (IE)',popupScrollBars:'ניתן לגלילה',popupDependent:'תלוי (Netscape)',popupLeft:'מיקום צד שמאל',popupTop:'מיקום צד עליון',id:'זיהוי (ID)',langDir:'כיוון שפה',langDirLTR:'שמאל לימין (LTR)',langDirRTL:'ימין לשמאל (RTL)',acccessKey:'מקש גישה',name:'שם',langCode:'קוד שפה',tabIndex:'מספר טאב',advisoryTitle:'כותרת מוצעת',advisoryContentType:'Content Type מוצע',cssClasses:'גיליונות עיצוב קבוצות',charset:'קידוד המשאב המקושר',styles:'סגנון',rel:'קשר גומלין',selectAnchor:'בחירת עוגן',anchorName:'עפ"י שם העוגן',anchorId:'עפ"י זיהוי (ID) האלמנט',emailAddress:'כתובת הדוא"ל',emailSubject:'נושא ההודעה',emailBody:'גוף ההודעה',noAnchors:'(אין עוגנים זמינים בדף)',noUrl:'יש להקליד את כתובת הקישור (URL)',noEmail:'יש להקליד את כתובת הדוא"ל'},anchor:{toolbar:'הוספת/עריכת נקודת עיגון',menu:'מאפייני נקודת עיגון',title:'מאפייני נקודת עיגון',name:'שם לנקודת עיגון',errorName:'יש להקליד שם לנקודת עיגון',remove:'מחיקת נקודת עיגון'},list:{numberedTitle:'תכונות רשימה ממוספרת',bulletedTitle:'תכונות רשימת תבליטים',type:'סוג',start:'תחילת מספור',validateStartNumber:'שדה תחילת המספור חייב להכיל מספר שלם.',circle:'עיגול ריק',disc:'עיגול מלא',square:'ריבוע',none:'ללא',notset:'<לא נקבע>',armenian:'ספרות ארמניות',georgian:"ספרות גיאורגיות (an, ban, gan וכו')",lowerRoman:"ספירה רומית באותיות קטנות (i, ii, iii, iv, v וכו')",upperRoman:"ספירה רומיות באותיות גדולות (I, II, III, IV, V וכו')",lowerAlpha:"אותיות אנגליות קטנות (a, b, c, d, e וכו')",upperAlpha:"אותיות אנגליות גדולות (A, B, C, D, E וכו')",lowerGreek:"אותיות יווניות קטנות (alpha, beta, gamma וכו')",decimal:"ספרות (1, 2, 3 וכו')",decimalLeadingZero:"ספרות עם 0 בהתחלה (01, 02, 03 וכו')"},findAndReplace:{title:'חיפוש והחלפה',find:'חיפוש',replace:'החלפה',findWhat:'חיפוש מחרוזת:',replaceWith:'החלפה במחרוזת:',notFoundMsg:'הטקסט המבוקש לא נמצא.',findOptions:'אפשרויות חיפוש',matchCase:'הבחנה בין אותיות רשיות לקטנות (Case)',matchWord:'התאמה למילה המלאה',matchCyclic:'התאמה מחזורית',replaceAll:'החלפה בכל העמוד',replaceSuccessMsg:'%1 טקסטים הוחלפו.'},table:{toolbar:'טבלה',title:'מאפייני טבלה',menu:'מאפייני טבלה',deleteTable:'מחק טבלה',rows:'שורות',columns:'עמודות',border:'גודל מסגרת',widthPx:'פיקסלים',widthPc:'אחוז',widthUnit:'יחידת רוחב',cellSpace:'מרווח תא',cellPad:'ריפוד תא',caption:'כיתוב',summary:'תקציר',headers:'כותרות',headersNone:'אין',headersColumn:'עמודה ראשונה',headersRow:'שורה ראשונה',headersBoth:'שניהם',invalidRows:'שדה מספר השורות חייב להיות מספר גדול מ 0.',invalidCols:'שדה מספר העמודות חייב להיות מספר גדול מ 0.',invalidBorder:'שדה גודל המסגרת חייב להיות מספר.',invalidWidth:'שדה רוחב הטבלה חייב להיות מספר.',invalidHeight:'שדה גובה הטבלה חייב להיות מספר.',invalidCellSpacing:'שדה ריווח התאים חייב להיות מספר חיובי.',invalidCellPadding:'שדה ריפוד התאים חייב להיות מספר חיובי.',cell:{menu:'מאפייני תא',insertBefore:'הוספת תא לפני',insertAfter:'הוספת תא אחרי',deleteCell:'מחיקת תאים',merge:'מיזוג תאים',mergeRight:'מזג ימינה',mergeDown:'מזג למטה',splitHorizontal:'פיצול תא אופקית',splitVertical:'פיצול תא אנכית',title:'תכונות התא',cellType:'סוג התא',rowSpan:'מתיחת השורות',colSpan:'מתיחת התאים',wordWrap:'מניעת גלישת שורות',hAlign:'יישור אופקי',vAlign:'יישור אנכי',alignBaseline:'שורת בסיס',bgColor:'צבע רקע',borderColor:'צבע מסגרת',data:'מידע',header:'כותרת',yes:'כן',no:'לא',invalidWidth:'שדה רוחב התא חייב להיות מספר.',invalidHeight:'שדה גובה התא חייב להיות מספר.',invalidRowSpan:'שדה מתיחת השורות חייב להיות מספר שלם.',invalidColSpan:'שדה מתיחת העמודות חייב להיות מספר שלם.',chooseColor:'בחר'},row:{menu:'שורה',insertBefore:'הוספת שורה לפני',insertAfter:'הוספת שורה אחרי',deleteRow:'מחיקת שורות'},column:{menu:'עמודה',insertBefore:'הוספת עמודה לפני',insertAfter:'הוספת עמודה אחרי',deleteColumn:'מחיקת עמודות'}},button:{title:'מאפייני כפתור',text:'טקסט (ערך)',type:'סוג',typeBtn:'כפתור',typeSbm:'שליחה',typeRst:'איפוס'},checkboxAndRadio:{checkboxTitle:'מאפייני תיבת סימון',radioTitle:'מאפייני לחצן אפשרויות',value:'ערך',selected:'מסומן'},form:{title:'מאפיני טופס',menu:'מאפיני טופס',action:'שלח אל',method:'סוג שליחה',encoding:'קידוד'},select:{title:'מאפייני שדה בחירה',selectInfo:'מידע',opAvail:'אפשרויות זמינות',value:'ערך',size:'גודל',lines:'שורות',chkMulti:'איפשור בחירות מרובות',opText:'טקסט',opValue:'ערך',btnAdd:'הוספה',btnModify:'שינוי',btnUp:'למעלה',btnDown:'למטה',btnSetValue:'קביעה כברירת מחדל',btnDelete:'מחיקה'},textarea:{title:'מאפייני איזור טקסט',cols:'עמודות',rows:'שורות'},textfield:{title:'מאפייני שדה טקסט',name:'שם',value:'ערך',charWidth:'רוחב לפי תווים',maxChars:'מקסימום תווים',type:'סוג',typeText:'טקסט',typePass:'סיסמה'},hidden:{title:'מאפיני שדה חבוי',name:'שם',value:'ערך'},image:{title:'מאפייני התמונה',titleButton:'מאפיני כפתור תמונה',menu:'תכונות התמונה',infoTab:'מידע על התמונה',btnUpload:'שליחה לשרת',upload:'העלאה',alt:'טקסט חלופי',lockRatio:'נעילת היחס',resetSize:'איפוס הגודל',border:'מסגרת',hSpace:'מרווח אופקי',vSpace:'מרווח אנכי',alertUrl:'יש להקליד את כתובת התמונה',linkTab:'קישור',button2Img:'האם להפוך את תמונת הכפתור לתמונה פשוטה?',img2Button:'האם להפוך את התמונה לכפתור תמונה?',urlMissing:'כתובת התמונה חסרה.',validateBorder:'שדה המסגרת חייב להיות מספר שלם.',validateHSpace:'שדה המרווח האופקי חייב להיות מספר שלם.',validateVSpace:'שדה המרווח האנכי חייב להיות מספר שלם.'},flash:{properties:'מאפייני פלאש',propertiesTab:'מאפיינים',title:'מאפיני פלאש',chkPlay:'ניגון אוטומטי',chkLoop:'לולאה',chkMenu:'אפשר תפריט פלאש',chkFull:'אפשר חלון מלא',scale:'גודל',scaleAll:'הצג הכל',scaleNoBorder:'ללא גבולות',scaleFit:'התאמה מושלמת',access:'גישת סקריפט',accessAlways:'תמיד',accessSameDomain:'דומיין זהה',accessNever:'אף פעם',alignAbsBottom:'לתחתית האבסולוטית',alignAbsMiddle:'מרכוז אבסולוטי',alignBaseline:'לקו התחתית',alignTextTop:'לראש הטקסט',quality:'איכות',qualityBest:'מעולה',qualityHigh:'גבוהה',qualityAutoHigh:'גבוהה אוטומטית',qualityMedium:'ממוצעת',qualityAutoLow:'נמוכה אוטומטית',qualityLow:'נמוכה',windowModeWindow:'חלון',windowModeOpaque:'אטום',windowModeTransparent:'שקוף',windowMode:'מצב חלון',flashvars:'משתנים לפלאש',bgcolor:'צבע רקע',hSpace:'מרווח אופקי',vSpace:'מרווח אנכי',validateSrc:'יש להקליד את כתובת סרטון הפלאש (URL)',validateHSpace:'המרווח האופקי חייב להיות מספר.',validateVSpace:'המרווח האנכי חייב להיות מספר.'},spellCheck:{toolbar:'בדיקת איות',title:'בדיקת איות',notAvailable:'לא נמצא שירות זמין.',errorLoading:'שגיאה בהעלאת השירות: %s.',notInDic:'לא נמצא במילון',changeTo:'שינוי ל',btnIgnore:'התעלמות',btnIgnoreAll:'התעלמות מהכל',btnReplace:'החלפה',btnReplaceAll:'החלפת הכל',btnUndo:'החזרה',noSuggestions:'- אין הצעות -',progress:'בודק האיות בתהליך בדיקה....',noMispell:'בדיקות איות הסתיימה: לא נמצאו שגיאות כתיב',noChanges:'בדיקות איות הסתיימה: לא שונתה אף מילה',oneChange:'בדיקות איות הסתיימה: שונתה מילה אחת',manyChanges:'בדיקות איות הסתיימה: %1 מילים שונו',ieSpellDownload:'בודק האיות לא מותקן, האם להורידו?'},smiley:{toolbar:'סמיילי',title:'הוספת סמיילי',options:'אפשרויות סמיילים'},elementsPath:{eleLabel:'עץ האלמנטים',eleTitle:'%1 אלמנט'},numberedlist:'רשימה ממוספרת',bulletedlist:'רשימת נקודות',indent:'הגדלת הזחה',outdent:'הקטנת הזחה',justify:{left:'יישור לשמאל',center:'מרכוז',right:'יישור לימין',block:'יישור לשוליים'},blockquote:'בלוק ציטוט',clipboard:{title:'הדבקה',cutError:'הגדרות האבטחה בדפדפן שלך לא מאפשרות לעורך לבצע פעולות גזירה אוטומטיות. יש להשתמש במקלדת לשם כך (Ctrl/Cmd+X).',copyError:'הגדרות האבטחה בדפדפן שלך לא מאפשרות לעורך לבצע פעולות העתקה אוטומטיות. יש להשתמש במקלדת לשם כך (Ctrl/Cmd+C).',pasteMsg:'נא להדביק בתוך הקופסה באמצעות (<b>Ctrl/Cmd+V</b>) וללחוץ על <b>אישור</b>.',securityMsg:'עקב הגדרות אבטחה בדפדפן, לא ניתן לגשת אל לוח הגזירים (Clipboard) בצורה ישירה. נא להדביק שוב בחלון זה.',pasteArea:'איזור הדבקה'},pastefromword:{confirmCleanup:'נראה הטקסט שבכוונתך להדביק מקורו בקובץ וורד. האם ברצונך לנקות אותו טרם ההדבקה?',toolbar:'הדבקה מ-Word',title:'הדבקה מ-Word',error:'לא ניתן היה לנקות את המידע בשל תקלה פנימית.'},pasteText:{button:'הדבקה כטקסט פשוט',title:'הדבקה כטקסט פשוט'},templates:{button:'תבניות',title:'תביות תוכן',options:'אפשרויות התבניות',insertOption:'החלפת תוכן ממשי',selectPromptMsg:'יש לבחור תבנית לפתיחה בעורך.<br />התוכן המקורי ימחק:',emptyListMsg:'(לא הוגדרו תבניות)'},showBlocks:'הצגת בלוקים',stylesCombo:{label:'סגנון',panelTitle:'סגנונות פורמט',panelTitle1:'סגנונות בלוק',panelTitle2:'סגנונות רצף',panelTitle3:'סגנונות אובייקט'},format:{label:'עיצוב',panelTitle:'עיצוב',tag_p:'נורמלי',tag_pre:'קוד',tag_address:'כתובת',tag_h1:'כותרת',tag_h2:'כותרת 2',tag_h3:'כותרת 3',tag_h4:'כותרת 4',tag_h5:'כותרת 5',tag_h6:'כותרת 6',tag_div:'נורמלי (DIV)'},div:{title:'יצירת מיכל (Div)',toolbar:'יצירת מיכל (Div)',cssClassInputLabel:'מחלקת עיצוב',styleSelectLabel:'סגנון',IdInputLabel:'מזהה (ID)',languageCodeInputLabel:'קוד שפה',inlineStyleInputLabel:'סגנון פנימי',advisoryTitleInputLabel:'כותרת מוצעת',langDirLabel:'כיוון שפה',langDirLTRLabel:'שמאל לימין (LTR)',langDirRTLLabel:'ימין לשמאל (RTL)',edit:'עריכת מיכל (Div)',remove:'הסרת מיכל (Div)'},iframe:{title:'מאפייני חלון פנימי (iframe)',toolbar:'חלון פנימי (iframe)',noUrl:'יש להכניס כתובת לחלון.',scrolling:'אפשר פסי גלילה',border:'הראה מסגרת לחלון'},font:{label:'גופן',voiceLabel:'גופן',panelTitle:'גופן'},fontSize:{label:'גודל',voiceLabel:'גודל',panelTitle:'גודל'},colorButton:{textColorTitle:'צבע טקסט',bgColorTitle:'צבע רקע',panelTitle:'צבעים',auto:'אוטומטי',more:'צבעים נוספים...'},colors:{'000':'שחור',800000:'סגול כהה','8B4513':'חום בהיר','2F4F4F':'אפור צפחה','008080':'כחול-ירוק','000080':'כחול-סגול','4B0082':'אינדיגו',696969:'אפור מעומעם',B22222:'אדום-חום',A52A2A:'חום',DAA520:'כתום זהב','006400':'ירוק כהה','40E0D0':'טורקיז','0000CD':'כחול בינוני',800080:'סגול',808080:'אפור',F00:'אדום',FF8C00:'כתום כהה',FFD700:'זהב','008000':'ירוק','0FF':'ציאן','00F':'כחול',EE82EE:'סגלגל',A9A9A9:'אפור כהה',FFA07A:'כתום-וורוד',FFA500:'כתום',FFFF00:'צהוב','00FF00':'ליים',AFEEEE:'טורקיז בהיר',ADD8E6:'כחול בהיר',DDA0DD:'שזיף',D3D3D3:'אפור בהיר',FFF0F5:'לבנדר מסמיק',FAEBD7:'לבן עתיק',FFFFE0:'צהוב בהיר',F0FFF0:'טל דבש',F0FFFF:'תכלת',F0F8FF:'כחול טיפת מים',E6E6FA:'לבנדר',FFF:'לבן'},scayt:{title:'בדיקת איות בזמן כתיבה (SCAYT)',opera_title:'לא זמין בדפדפן אופרה',enable:'אפשר SCAYT',disable:'בטל SCAYT',about:'אודות SCAYT',toggle:'שינוי SCAYT',options:'אפשרויות',langs:'שפות',moreSuggestions:'הצעות נוספות',ignore:'התעלמות',ignoreAll:'התעלמות מהכל',addWord:'הוספת מילה',emptyDic:'יש לבחור מילון.',optionsTab:'אפשרויות',allCaps:'התעלם ממילים שכל אותיותיהן גדולות',ignoreDomainNames:'התעלם משמות מתחם',mixedCase:'התעלם ממילים עם אותיות גדולות וקטנות ביחד',mixedWithDigits:'התעלם ממילים עם מספרים',languagesTab:'שפות',dictionariesTab:'מילון',dic_field_name:'שם המילון',dic_create:'יצירה',dic_restore:'שחזור',dic_delete:'מחיקה',dic_rename:'שינוי שם',dic_info:'בהתחלה מילון המשתמש מאוחסן בעוגיה, אך עוגיות מוגבלות במקום. כאשר המילון מגיע לגודל בו הוא אינו יכול להתאכסן בעוגיה, המילון צריך להתאכסן בשרתנו. לשם כך עליך לתת שם למילון. אם כבר יש לך מילון מאוחסן, יש להכניס את שמו וללחוץ על כפתור השחזור.',aboutTab:'אודות'},about:{title:'אודות CKEditor',dlgTitle:'אודות CKEditor',help:'היכנסו ל$1 לעזרה.',userGuide:'מדריך המשתמש של CKEditor',moreInfo:'למידע נוסף בקרו באתרנו:',copy:'Copyright © $1. כל הזכויות שמורות.'},maximize:'הגדלה למקסימום',minimize:'הקטנה למינימום',fakeobjects:{anchor:'עוגן',flash:'סרטון פלאש',iframe:'חלון פנימי (iframe)',hiddenfield:'שדה חבוי',unknown:'אובייקט לא ידוע'},resize:'יש לגרור בכדי לשנות את הגודל',colordialog:{title:'בחירת צבע',options:'אפשרויות צבע',highlight:'סימון',selected:'בחירה',clear:'ניקוי'},toolbarCollapse:'מזעור סרגל כלים',toolbarExpand:'הרחבת סרגל כלים',toolbarGroups:{document:'מסמך',clipboard:'לוח הגזירים (Clipboard)/צעד אחרון',editing:'עריכה',forms:'טפסים',basicstyles:'עיצוב בסיסי',paragraph:'פסקה',links:'קישורים',insert:'הכנסה',styles:'עיצוב',colors:'צבעים',tools:'כלים'},bidi:{ltr:'כיוון טקסט משמאל לימין (LTR)',rtl:'כיוון טקסט מימין לשמאל (RTL)'},docprops:{label:'מאפייני מסמך',title:'מאפייני מסמך',design:'עיצוב',meta:'תגי Meta',chooseColor:'בחירה',other:'אחר...',docTitle:'כותרת עמוד',charset:'קידוד תווים',charsetOther:'קידוד תווים אחר',charsetASCII:'ASCII',charsetCE:'מרכז אירופאי',charsetCT:'סיני מסורתי (Big5)',charsetCR:'קירילי',charsetGR:'יווני',charsetJP:'יפני',charsetKR:'קוריאני',charsetTR:'טורקי',charsetUN:'יוניקוד (UTF-8)',charsetWE:'מערב אירופאי',docType:'כותר סוג מסמך',docTypeOther:'כותר סוג מסמך אחר',xhtmlDec:'כלול הכרזות XHTML',bgColor:'צבע רקע',bgImage:'כתובת של תמונת רקע',bgFixed:'רקע לא נגלל (צמוד)',txtColor:'צבע טקסט',margin:'מרווחי עמוד',marginTop:'עליון',marginLeft:'שמאלי',marginRight:'ימני',marginBottom:'תחתון',metaKeywords:'מילות מפתח של המסמך (מופרדות בפסיק)',metaDescription:'תיאור המסמך',metaAuthor:'מחבר/ת',metaCopyright:'זכויות יוצרים',previewHtml:'<p>זהו <strong>טקסט הדגמה</strong>. את/ה משתמש/ת ב<a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/hi.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/hi.js
index 158d9c4..ea269ac 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/hi.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/hi.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.hi={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'एडिटर टूलबार',editor:'रिच टेक्स्ट एडिटर',source:'सोर्स',newPage:'नया पेज',save:'सेव',preview:'प्रीव्यू',cut:'कट',copy:'कॉपी',paste:'पेस्ट',print:'प्रिन्ट',underline:'रेखांकण',bold:'बोल्ड',italic:'इटैलिक',selectAll:'सब सॅलॅक्ट करें',removeFormat:'फ़ॉर्मैट हटायें',strike:'स्ट्राइक थ्रू',subscript:'अधोलेख',superscript:'अभिलेख',horizontalrule:'हॉरिज़ॉन्टल रेखा इन्सर्ट करें',pagebreak:'पेज ब्रेक इन्सर्ट् करें',pagebreakAlt:'पेज ब्रेक',unlink:'लिंक हटायें',undo:'अन्डू',redo:'रीडू',common:{browseServer:'सर्वर ब्राउज़ करें',url:'URL',protocol:'प्रोटोकॉल',upload:'अपलोड',uploadSubmit:'इसे सर्वर को भेजें',image:'तस्वीर',flash:'फ़्लैश',form:'फ़ॉर्म',checkbox:'चॅक बॉक्स',radio:'रेडिओ बटन',textField:'टेक्स्ट फ़ील्ड',textarea:'टेक्स्ट एरिया',hiddenField:'गुप्त फ़ील्ड',button:'बटन',select:'चुनाव फ़ील्ड',imageButton:'तस्वीर बटन',notSet:'<सॅट नहीं>',id:'Id',name:'नाम',langDir:'भाषा लिखने की दिशा',langDirLtr:'बायें से दायें (LTR)',langDirRtl:'दायें से बायें (RTL)',langCode:'भाषा कोड',longDescr:'अधिक विवरण के लिए URL',cssClass:'स्टाइल-शीट क्लास',advisoryTitle:'परामर्श शीर्शक',cssStyle:'स्टाइल',ok:'ठीक है',cancel:'रद्द करें',close:'Close',preview:'Preview',generalTab:'सामान्य',advancedTab:'ऍड्वान्स्ड',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'चौड़ाई',height:'ऊँचाई',align:'ऍलाइन',alignLeft:'दायें',alignRight:'दायें',alignCenter:'बीच में',alignTop:'ऊपर',alignMiddle:'मध्य',alignBottom:'नीचे',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'विशेष करॅक्टर इन्सर्ट करें',title:'विशेष करॅक्टर चुनें',options:'Special Character Options'},link:{toolbar:'लिंक इन्सर्ट/संपादन',other:'<अन्य>',menu:'लिंक संपादन',title:'लिंक',info:'लिंक ',target:'टार्गेट',upload:'अपलोड',advanced:'ऍड्वान्स्ड',type:'लिंक प्रकार',toUrl:'URL',toAnchor:'इस पेज का ऐंकर',toEmail:'ई-मेल',targetFrame:'<फ़्रेम>',targetPopup:'<पॉप-अप विन्डो>',targetFrameName:'टार्गेट फ़्रेम का नाम',targetPopupName:'पॉप-अप विन्डो का नाम',popupFeatures:'पॉप-अप विन्डो फ़ीचर्स',popupResizable:'Resizable',popupStatusBar:'स्टेटस बार',popupLocationBar:'लोकेशन बार',popupToolbar:'टूल बार',popupMenuBar:'मॅन्यू बार',popupFullScreen:'फ़ुल स्क्रीन (IE)',popupScrollBars:'स्क्रॉल बार',popupDependent:'डिपेन्डॅन्ट (Netscape)',popupLeft:'बायीं तरफ',popupTop:'दायीं तरफ',id:'Id',langDir:'भाषा लिखने की दिशा',langDirLTR:'बायें से दायें (LTR)',langDirRTL:'दायें से बायें (RTL)',acccessKey:'ऍक्सॅस की',name:'नाम',langCode:'भाषा लिखने की दिशा',tabIndex:'टैब इन्डॅक्स',advisoryTitle:'परामर्श शीर्शक',advisoryContentType:'परामर्श कन्टॅन्ट प्रकार',cssClasses:'स्टाइल-शीट क्लास',charset:'लिंक रिसोर्स करॅक्टर सॅट',styles:'स्टाइल',rel:'Relationship',selectAnchor:'ऐंकर चुनें',anchorName:'ऐंकर नाम से',anchorId:'ऍलीमॅन्ट Id से',emailAddress:'ई-मेल पता',emailSubject:'संदेश विषय',emailBody:'संदेश',noAnchors:'(डॉक्यूमॅन्ट में ऐंकर्स की संख्या)',noUrl:'लिंक URL टाइप करें',noEmail:'ई-मेल पता टाइप करें'},anchor:{toolbar:'ऐंकर इन्सर्ट/संपादन',menu:'ऐंकर प्रॉपर्टीज़',title:'ऐंकर प्रॉपर्टीज़',name:'ऐंकर का नाम',errorName:'ऐंकर का नाम टाइप करें',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'खोजें और बदलें',find:'खोजें',replace:'रीप्लेस',findWhat:'यह खोजें:',replaceWith:'इससे रिप्लेस करें:',notFoundMsg:'आपके द्वारा दिया गया टेक्स्ट नहीं मिला',findOptions:'Find Options',matchCase:'केस मिलायें',matchWord:'पूरा शब्द मिलायें',matchCyclic:'Match cyclic',replaceAll:'सभी रिप्लेस करें',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'टेबल',title:'टेबल प्रॉपर्टीज़',menu:'टेबल प्रॉपर्टीज़',deleteTable:'टेबल डिलीट करें',rows:'पंक्तियाँ',columns:'कालम',border:'बॉर्डर साइज़',widthPx:'पिक्सैल',widthPc:'प्रतिशत',widthUnit:'width unit',cellSpace:'सैल अंतर',cellPad:'सैल पैडिंग',caption:'शीर्षक',summary:'सारांश',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'खाना',insertBefore:'पहले सैल डालें',insertAfter:'बाद में सैल डालें',deleteCell:'सैल डिलीट करें',merge:'सैल मिलायें',mergeRight:'बाँया विलय',mergeDown:'नीचे विलय करें',splitHorizontal:'सैल को क्षैतिज स्थिति में विभाजित करें',splitVertical:'सैल को लम्बाकार में विभाजित करें',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'पंक्ति',insertBefore:'पहले पंक्ति डालें',insertAfter:'बाद में पंक्ति डालें',deleteRow:'पंक्तियाँ डिलीट करें'},column:{menu:'कालम',insertBefore:'पहले कालम डालें',insertAfter:'बाद में कालम डालें',deleteColumn:'कालम डिलीट करें'}},button:{title:'बटन प्रॉपर्टीज़',text:'टेक्स्ट (वैल्यू)',type:'प्रकार',typeBtn:'बटन',typeSbm:'सब्मिट',typeRst:'रिसेट'},checkboxAndRadio:{checkboxTitle:'चॅक बॉक्स प्रॉपर्टीज़',radioTitle:'रेडिओ बटन प्रॉपर्टीज़',value:'वैल्यू',selected:'सॅलॅक्टॅड'},form:{title:'फ़ॉर्म प्रॉपर्टीज़',menu:'फ़ॉर्म प्रॉपर्टीज़',action:'क्रिया',method:'तरीका',encoding:'Encoding'},select:{title:'चुनाव फ़ील्ड प्रॉपर्टीज़',selectInfo:'सूचना',opAvail:'उपलब्ध विकल्प',value:'वैल्यू',size:'साइज़',lines:'पंक्तियाँ',chkMulti:'एक से ज्यादा विकल्प चुनने दें',opText:'टेक्स्ट',opValue:'वैल्यू',btnAdd:'जोड़ें',btnModify:'बदलें',btnUp:'ऊपर',btnDown:'नीचे',btnSetValue:'चुनी गई वैल्यू सॅट करें',btnDelete:'डिलीट'},textarea:{title:'टेक्स्त एरिया प्रॉपर्टीज़',cols:'कालम',rows:'पंक्तियां'},textfield:{title:'टेक्स्ट फ़ील्ड प्रॉपर्टीज़',name:'नाम',value:'वैल्यू',charWidth:'करॅक्टर की चौढ़ाई',maxChars:'अधिकतम करॅक्टर',type:'टाइप',typeText:'टेक्स्ट',typePass:'पास्वर्ड'},hidden:{title:'गुप्त फ़ील्ड प्रॉपर्टीज़',name:'नाम',value:'वैल्यू'},image:{title:'तस्वीर प्रॉपर्टीज़',titleButton:'तस्वीर बटन प्रॉपर्टीज़',menu:'तस्वीर प्रॉपर्टीज़',infoTab:'तस्वीर की जानकारी',btnUpload:'इसे सर्वर को भेजें',upload:'अपलोड',alt:'वैकल्पिक टेक्स्ट',lockRatio:'लॉक अनुपात',resetSize:'रीसॅट साइज़',border:'बॉर्डर',hSpace:'हॉरिज़ॉन्टल स्पेस',vSpace:'वर्टिकल स्पेस',alertUrl:'तस्वीर का URL टाइप करें ',linkTab:'लिंक',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'फ़्लैश प्रॉपर्टीज़',propertiesTab:'Properties',title:'फ़्लैश प्रॉपर्टीज़',chkPlay:'ऑटो प्ले',chkLoop:'लूप',chkMenu:'फ़्लैश मॅन्यू का प्रयोग करें',chkFull:'Allow Fullscreen',scale:'स्केल',scaleAll:'सभी दिखायें',scaleNoBorder:'कोई बॉर्डर नहीं',scaleFit:'बिल्कुल फ़िट',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs नीचे',alignAbsMiddle:'Abs ऊपर',alignBaseline:'मूल रेखा',alignTextTop:'टेक्स्ट ऊपर',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'बैक्ग्राउन्ड रंग',hSpace:'हॉरिज़ॉन्टल स्पेस',vSpace:'वर्टिकल स्पेस',validateSrc:'लिंक URL टाइप करें',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'वर्तनी (स्पेलिंग) जाँच',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'शब्दकोश में नहीं',changeTo:'इसमें बदलें',btnIgnore:'इग्नोर',btnIgnoreAll:'सभी इग्नोर करें',btnReplace:'रिप्लेस',btnReplaceAll:'सभी रिप्लेस करें',btnUndo:'अन्डू',noSuggestions:'- कोई सुझाव नहीं -',progress:'वर्तनी की जाँच (स्पॅल-चॅक) जारी है...',noMispell:'वर्तनी की जाँच : कोई गलत वर्तनी (स्पॅलिंग) नहीं पाई गई',noChanges:'वर्तनी की जाँच :कोई शब्द नहीं बदला गया',oneChange:'वर्तनी की जाँच : एक शब्द बदला गया',manyChanges:'वर्तनी की जाँच : %1 शब्द बदले गये',ieSpellDownload:'स्पॅल-चॅकर इन्स्टाल नहीं किया गया है। क्या आप इसे डाउनलोड करना चाहेंगे?'},smiley:{toolbar:'स्माइली',title:'स्माइली इन्सर्ट करें',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'अंकीय सूची',bulletedlist:'बुलॅट सूची',indent:'इन्डॅन्ट बढ़ायें',outdent:'इन्डॅन्ट कम करें',justify:{left:'बायीं तरफ',center:'बीच में',right:'दायीं तरफ',block:'ब्लॉक जस्टीफ़ाई'},blockquote:'ब्लॉक-कोट',clipboard:{title:'पेस्ट',cutError:'आपके ब्राउज़र की सुरक्षा सॅटिन्ग्स ने कट करने की अनुमति नहीं प्रदान की है। (Ctrl/Cmd+X) का प्रयोग करें।',copyError:'आपके ब्राआउज़र की सुरक्षा सॅटिन्ग्स ने कॉपी करने की अनुमति नहीं प्रदान की है। (Ctrl/Cmd+C) का प्रयोग करें।',pasteMsg:'Ctrl/Cmd+V का प्रयोग करके पेस्ट करें और ठीक है करें.',securityMsg:'आपके ब्राउज़र की सुरक्षा आपके ब्राउज़र की सुरKश सैटिंग के कारण, एडिटर आपके क्लिपबोर्ड डेटा को नहीं पा सकता है. आपको उसे इस विन्डो में दोबारा पेस्ट करना होगा.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'पेस्ट (वर्ड से)',title:'पेस्ट (वर्ड से)',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'पेस्ट (सादा टॅक्स्ट)',title:'पेस्ट (सादा टॅक्स्ट)'},templates:{button:'टॅम्प्लेट',title:'कन्टेन्ट टॅम्प्लेट',options:'Template Options',insertOption:'मूल शब्दों को बदलें',selectPromptMsg:'ऍडिटर में ओपन करने हेतु टॅम्प्लेट चुनें(वर्तमान कन्टॅन्ट सेव नहीं होंगे):',emptyListMsg:'(कोई टॅम्प्लेट डिफ़ाइन नहीं किया गया है)'},showBlocks:'ब्लॉक दिखायें',stylesCombo:{label:'स्टाइल',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'फ़ॉर्मैट',panelTitle:'फ़ॉर्मैट',tag_p:'साधारण',tag_pre:'फ़ॉर्मैटॅड',tag_address:'पता',tag_h1:'शीर्षक 1',tag_h2:'शीर्षक 2',tag_h3:'शीर्षक 3',tag_h4:'शीर्षक 4',tag_h5:'शीर्षक 5',tag_h6:'शीर्षक 6',tag_div:'शीर्षक (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'फ़ॉन्ट',voiceLabel:'Font',panelTitle:'फ़ॉन्ट'},fontSize:{label:'साइज़',voiceLabel:'Font Size',panelTitle:'साइज़'},colorButton:{textColorTitle:'टेक्स्ट रंग',bgColorTitle:'बैक्ग्राउन्ड रंग',panelTitle:'Colors',auto:'स्वचालित',more:'और रंग...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'मेक्सिमाईज़',minimize:'मिनिमाईज़',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'डॉक्यूमॅन्ट प्रॉपर्टीज़',title:'डॉक्यूमॅन्ट प्रॉपर्टीज़',design:'Design',meta:'मॅटाडेटा',chooseColor:'Choose',other:'<अन्य>',docTitle:'पेज शीर्षक',charset:'करेक्टर सॅट ऍन्कोडिंग',charsetOther:'अन्य करेक्टर सॅट ऍन्कोडिंग',charsetASCII:'ASCII',charsetCE:'मध्य यूरोपीय (Central European)',charsetCT:'चीनी (Chinese Traditional Big5)',charsetCR:'सिरीलिक (Cyrillic)',charsetGR:'यवन (Greek)',charsetJP:'जापानी (Japanese)',charsetKR:'कोरीयन (Korean)',charsetTR:'तुर्की (Turkish)',charsetUN:'यूनीकोड (UTF-8)',charsetWE:'पश्चिम यूरोपीय (Western European)',docType:'डॉक्यूमॅन्ट प्रकार शीर्षक',docTypeOther:'अन्य डॉक्यूमॅन्ट प्रकार शीर्षक',xhtmlDec:'XHTML सूचना सम्मिलित करें',bgColor:'बैक्ग्राउन्ड रंग',bgImage:'बैक्ग्राउन्ड तस्वीर URL',bgFixed:'स्क्रॉल न करने वाला बैक्ग्राउन्ड',txtColor:'टेक्स्ट रंग',margin:'पेज मार्जिन',marginTop:'ऊपर',marginLeft:'बायें',marginRight:'दायें',marginBottom:'नीचे',metaKeywords:'डॉक्युमॅन्ट इन्डेक्स संकेतशब्द (अल्पविराम से अलग करें)',metaDescription:'डॉक्यूमॅन्ट करॅक्टरन',metaAuthor:'लेखक',metaCopyright:'कॉपीराइट',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.hi={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'एडिटर टूलबार',editor:'रिच टेक्स्ट एडिटर',source:'सोर्स',newPage:'नया पेज',save:'सेव',preview:'प्रीव्यू',cut:'कट',copy:'कॉपी',paste:'पेस्ट',print:'प्रिन्ट',underline:'रेखांकण',bold:'बोल्ड',italic:'इटैलिक',selectAll:'सब सॅलॅक्ट करें',removeFormat:'फ़ॉर्मैट हटायें',strike:'स्ट्राइक थ्रू',subscript:'अधोलेख',superscript:'अभिलेख',horizontalrule:'हॉरिज़ॉन्टल रेखा इन्सर्ट करें',pagebreak:'पेज ब्रेक इन्सर्ट् करें',pagebreakAlt:'पेज ब्रेक',unlink:'लिंक हटायें',undo:'अन्डू',redo:'रीडू',common:{browseServer:'सर्वर ब्राउज़ करें',url:'URL',protocol:'प्रोटोकॉल',upload:'अपलोड',uploadSubmit:'इसे सर्वर को भेजें',image:'तस्वीर',flash:'फ़्लैश',form:'फ़ॉर्म',checkbox:'चॅक बॉक्स',radio:'रेडिओ बटन',textField:'टेक्स्ट फ़ील्ड',textarea:'टेक्स्ट एरिया',hiddenField:'गुप्त फ़ील्ड',button:'बटन',select:'चुनाव फ़ील्ड',imageButton:'तस्वीर बटन',notSet:'<सॅट नहीं>',id:'Id',name:'नाम',langDir:'भाषा लिखने की दिशा',langDirLtr:'बायें से दायें (LTR)',langDirRtl:'दायें से बायें (RTL)',langCode:'भाषा कोड',longDescr:'अधिक विवरण के लिए URL',cssClass:'स्टाइल-शीट क्लास',advisoryTitle:'परामर्श शीर्शक',cssStyle:'स्टाइल',ok:'ठीक है',cancel:'रद्द करें',close:'Close',preview:'Preview',generalTab:'सामान्य',advancedTab:'ऍड्वान्स्ड',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'चौड़ाई',height:'ऊँचाई',align:'ऍलाइन',alignLeft:'दायें',alignRight:'दायें',alignCenter:'बीच में',alignTop:'ऊपर',alignMiddle:'मध्य',alignBottom:'नीचे',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'विशेष करॅक्टर इन्सर्ट करें',title:'विशेष करॅक्टर चुनें',options:'Special Character Options'},link:{toolbar:'लिंक इन्सर्ट/संपादन',other:'<अन्य>',menu:'लिंक संपादन',title:'लिंक',info:'लिंक ',target:'टार्गेट',upload:'अपलोड',advanced:'ऍड्वान्स्ड',type:'लिंक प्रकार',toUrl:'URL',toAnchor:'इस पेज का ऐंकर',toEmail:'ई-मेल',targetFrame:'<फ़्रेम>',targetPopup:'<पॉप-अप विन्डो>',targetFrameName:'टार्गेट फ़्रेम का नाम',targetPopupName:'पॉप-अप विन्डो का नाम',popupFeatures:'पॉप-अप विन्डो फ़ीचर्स',popupResizable:'Resizable',popupStatusBar:'स्टेटस बार',popupLocationBar:'लोकेशन बार',popupToolbar:'टूल बार',popupMenuBar:'मॅन्यू बार',popupFullScreen:'फ़ुल स्क्रीन (IE)',popupScrollBars:'स्क्रॉल बार',popupDependent:'डिपेन्डॅन्ट (Netscape)',popupLeft:'बायीं तरफ',popupTop:'दायीं तरफ',id:'Id',langDir:'भाषा लिखने की दिशा',langDirLTR:'बायें से दायें (LTR)',langDirRTL:'दायें से बायें (RTL)',acccessKey:'ऍक्सॅस की',name:'नाम',langCode:'भाषा लिखने की दिशा',tabIndex:'टैब इन्डॅक्स',advisoryTitle:'परामर्श शीर्शक',advisoryContentType:'परामर्श कन्टॅन्ट प्रकार',cssClasses:'स्टाइल-शीट क्लास',charset:'लिंक रिसोर्स करॅक्टर सॅट',styles:'स्टाइल',rel:'Relationship',selectAnchor:'ऐंकर चुनें',anchorName:'ऐंकर नाम से',anchorId:'ऍलीमॅन्ट Id से',emailAddress:'ई-मेल पता',emailSubject:'संदेश विषय',emailBody:'संदेश',noAnchors:'(डॉक्यूमॅन्ट में ऐंकर्स की संख्या)',noUrl:'लिंक URL टाइप करें',noEmail:'ई-मेल पता टाइप करें'},anchor:{toolbar:'ऐंकर इन्सर्ट/संपादन',menu:'ऐंकर प्रॉपर्टीज़',title:'ऐंकर प्रॉपर्टीज़',name:'ऐंकर का नाम',errorName:'ऐंकर का नाम टाइप करें',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'खोजें और बदलें',find:'खोजें',replace:'रीप्लेस',findWhat:'यह खोजें:',replaceWith:'इससे रिप्लेस करें:',notFoundMsg:'आपके द्वारा दिया गया टेक्स्ट नहीं मिला',findOptions:'Find Options',matchCase:'केस मिलायें',matchWord:'पूरा शब्द मिलायें',matchCyclic:'Match cyclic',replaceAll:'सभी रिप्लेस करें',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'टेबल',title:'टेबल प्रॉपर्टीज़',menu:'टेबल प्रॉपर्टीज़',deleteTable:'टेबल डिलीट करें',rows:'पंक्तियाँ',columns:'कालम',border:'बॉर्डर साइज़',widthPx:'पिक्सैल',widthPc:'प्रतिशत',widthUnit:'width unit',cellSpace:'सैल अंतर',cellPad:'सैल पैडिंग',caption:'शीर्षक',summary:'सारांश',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'खाना',insertBefore:'पहले सैल डालें',insertAfter:'बाद में सैल डालें',deleteCell:'सैल डिलीट करें',merge:'सैल मिलायें',mergeRight:'बाँया विलय',mergeDown:'नीचे विलय करें',splitHorizontal:'सैल को क्षैतिज स्थिति में विभाजित करें',splitVertical:'सैल को लम्बाकार में विभाजित करें',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'पंक्ति',insertBefore:'पहले पंक्ति डालें',insertAfter:'बाद में पंक्ति डालें',deleteRow:'पंक्तियाँ डिलीट करें'},column:{menu:'कालम',insertBefore:'पहले कालम डालें',insertAfter:'बाद में कालम डालें',deleteColumn:'कालम डिलीट करें'}},button:{title:'बटन प्रॉपर्टीज़',text:'टेक्स्ट (वैल्यू)',type:'प्रकार',typeBtn:'बटन',typeSbm:'सब्मिट',typeRst:'रिसेट'},checkboxAndRadio:{checkboxTitle:'चॅक बॉक्स प्रॉपर्टीज़',radioTitle:'रेडिओ बटन प्रॉपर्टीज़',value:'वैल्यू',selected:'सॅलॅक्टॅड'},form:{title:'फ़ॉर्म प्रॉपर्टीज़',menu:'फ़ॉर्म प्रॉपर्टीज़',action:'क्रिया',method:'तरीका',encoding:'Encoding'},select:{title:'चुनाव फ़ील्ड प्रॉपर्टीज़',selectInfo:'सूचना',opAvail:'उपलब्ध विकल्प',value:'वैल्यू',size:'साइज़',lines:'पंक्तियाँ',chkMulti:'एक से ज्यादा विकल्प चुनने दें',opText:'टेक्स्ट',opValue:'वैल्यू',btnAdd:'जोड़ें',btnModify:'बदलें',btnUp:'ऊपर',btnDown:'नीचे',btnSetValue:'चुनी गई वैल्यू सॅट करें',btnDelete:'डिलीट'},textarea:{title:'टेक्स्त एरिया प्रॉपर्टीज़',cols:'कालम',rows:'पंक्तियां'},textfield:{title:'टेक्स्ट फ़ील्ड प्रॉपर्टीज़',name:'नाम',value:'वैल्यू',charWidth:'करॅक्टर की चौढ़ाई',maxChars:'अधिकतम करॅक्टर',type:'टाइप',typeText:'टेक्स्ट',typePass:'पास्वर्ड'},hidden:{title:'गुप्त फ़ील्ड प्रॉपर्टीज़',name:'नाम',value:'वैल्यू'},image:{title:'तस्वीर प्रॉपर्टीज़',titleButton:'तस्वीर बटन प्रॉपर्टीज़',menu:'तस्वीर प्रॉपर्टीज़',infoTab:'तस्वीर की जानकारी',btnUpload:'इसे सर्वर को भेजें',upload:'अपलोड',alt:'वैकल्पिक टेक्स्ट',lockRatio:'लॉक अनुपात',resetSize:'रीसॅट साइज़',border:'बॉर्डर',hSpace:'हॉरिज़ॉन्टल स्पेस',vSpace:'वर्टिकल स्पेस',alertUrl:'तस्वीर का URL टाइप करें ',linkTab:'लिंक',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'फ़्लैश प्रॉपर्टीज़',propertiesTab:'Properties',title:'फ़्लैश प्रॉपर्टीज़',chkPlay:'ऑटो प्ले',chkLoop:'लूप',chkMenu:'फ़्लैश मॅन्यू का प्रयोग करें',chkFull:'Allow Fullscreen',scale:'स्केल',scaleAll:'सभी दिखायें',scaleNoBorder:'कोई बॉर्डर नहीं',scaleFit:'बिल्कुल फ़िट',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs नीचे',alignAbsMiddle:'Abs ऊपर',alignBaseline:'मूल रेखा',alignTextTop:'टेक्स्ट ऊपर',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'बैक्ग्राउन्ड रंग',hSpace:'हॉरिज़ॉन्टल स्पेस',vSpace:'वर्टिकल स्पेस',validateSrc:'लिंक URL टाइप करें',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'वर्तनी (स्पेलिंग) जाँच',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'शब्दकोश में नहीं',changeTo:'इसमें बदलें',btnIgnore:'इग्नोर',btnIgnoreAll:'सभी इग्नोर करें',btnReplace:'रिप्लेस',btnReplaceAll:'सभी रिप्लेस करें',btnUndo:'अन्डू',noSuggestions:'- कोई सुझाव नहीं -',progress:'वर्तनी की जाँच (स्पॅल-चॅक) जारी है...',noMispell:'वर्तनी की जाँच : कोई गलत वर्तनी (स्पॅलिंग) नहीं पाई गई',noChanges:'वर्तनी की जाँच :कोई शब्द नहीं बदला गया',oneChange:'वर्तनी की जाँच : एक शब्द बदला गया',manyChanges:'वर्तनी की जाँच : %1 शब्द बदले गये',ieSpellDownload:'स्पॅल-चॅकर इन्स्टाल नहीं किया गया है। क्या आप इसे डाउनलोड करना चाहेंगे?'},smiley:{toolbar:'स्माइली',title:'स्माइली इन्सर्ट करें',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'अंकीय सूची',bulletedlist:'बुलॅट सूची',indent:'इन्डॅन्ट बढ़ायें',outdent:'इन्डॅन्ट कम करें',justify:{left:'बायीं तरफ',center:'बीच में',right:'दायीं तरफ',block:'ब्लॉक जस्टीफ़ाई'},blockquote:'ब्लॉक-कोट',clipboard:{title:'पेस्ट',cutError:'आपके ब्राउज़र की सुरक्षा सॅटिन्ग्स ने कट करने की अनुमति नहीं प्रदान की है। (Ctrl/Cmd+X) का प्रयोग करें।',copyError:'आपके ब्राआउज़र की सुरक्षा सॅटिन्ग्स ने कॉपी करने की अनुमति नहीं प्रदान की है। (Ctrl/Cmd+C) का प्रयोग करें।',pasteMsg:'Ctrl/Cmd+V का प्रयोग करके पेस्ट करें और ठीक है करें.',securityMsg:'आपके ब्राउज़र की सुरक्षा आपके ब्राउज़र की सुरKश सैटिंग के कारण, एडिटर आपके क्लिपबोर्ड डेटा को नहीं पा सकता है. आपको उसे इस विन्डो में दोबारा पेस्ट करना होगा.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'पेस्ट (वर्ड से)',title:'पेस्ट (वर्ड से)',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'पेस्ट (सादा टॅक्स्ट)',title:'पेस्ट (सादा टॅक्स्ट)'},templates:{button:'टॅम्प्लेट',title:'कन्टेन्ट टॅम्प्लेट',options:'Template Options',insertOption:'मूल शब्दों को बदलें',selectPromptMsg:'ऍडिटर में ओपन करने हेतु टॅम्प्लेट चुनें(वर्तमान कन्टॅन्ट सेव नहीं होंगे):',emptyListMsg:'(कोई टॅम्प्लेट डिफ़ाइन नहीं किया गया है)'},showBlocks:'ब्लॉक दिखायें',stylesCombo:{label:'स्टाइल',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'फ़ॉर्मैट',panelTitle:'फ़ॉर्मैट',tag_p:'साधारण',tag_pre:'फ़ॉर्मैटॅड',tag_address:'पता',tag_h1:'शीर्षक 1',tag_h2:'शीर्षक 2',tag_h3:'शीर्षक 3',tag_h4:'शीर्षक 4',tag_h5:'शीर्षक 5',tag_h6:'शीर्षक 6',tag_div:'शीर्षक (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'फ़ॉन्ट',voiceLabel:'Font',panelTitle:'फ़ॉन्ट'},fontSize:{label:'साइज़',voiceLabel:'Font Size',panelTitle:'साइज़'},colorButton:{textColorTitle:'टेक्स्ट रंग',bgColorTitle:'बैक्ग्राउन्ड रंग',panelTitle:'Colors',auto:'स्वचालित',more:'और रंग...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'मेक्सिमाईज़',minimize:'मिनिमाईज़',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'डॉक्यूमॅन्ट प्रॉपर्टीज़',title:'डॉक्यूमॅन्ट प्रॉपर्टीज़',design:'Design',meta:'मॅटाडेटा',chooseColor:'Choose',other:'<अन्य>',docTitle:'पेज शीर्षक',charset:'करेक्टर सॅट ऍन्कोडिंग',charsetOther:'अन्य करेक्टर सॅट ऍन्कोडिंग',charsetASCII:'ASCII',charsetCE:'मध्य यूरोपीय (Central European)',charsetCT:'चीनी (Chinese Traditional Big5)',charsetCR:'सिरीलिक (Cyrillic)',charsetGR:'यवन (Greek)',charsetJP:'जापानी (Japanese)',charsetKR:'कोरीयन (Korean)',charsetTR:'तुर्की (Turkish)',charsetUN:'यूनीकोड (UTF-8)',charsetWE:'पश्चिम यूरोपीय (Western European)',docType:'डॉक्यूमॅन्ट प्रकार शीर्षक',docTypeOther:'अन्य डॉक्यूमॅन्ट प्रकार शीर्षक',xhtmlDec:'XHTML सूचना सम्मिलित करें',bgColor:'बैक्ग्राउन्ड रंग',bgImage:'बैक्ग्राउन्ड तस्वीर URL',bgFixed:'स्क्रॉल न करने वाला बैक्ग्राउन्ड',txtColor:'टेक्स्ट रंग',margin:'पेज मार्जिन',marginTop:'ऊपर',marginLeft:'बायें',marginRight:'दायें',marginBottom:'नीचे',metaKeywords:'डॉक्युमॅन्ट इन्डेक्स संकेतशब्द (अल्पविराम से अलग करें)',metaDescription:'डॉक्यूमॅन्ट करॅक्टरन',metaAuthor:'लेखक',metaCopyright:'कॉपीराइट',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/hr.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/hr.js
index 56167cf..9eb4591 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/hr.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/hr.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.hr={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Alatne trake uređivača teksta',editor:'Bogati uređivač teksta',source:'Kôd',newPage:'Nova stranica',save:'Snimi',preview:'Pregledaj',cut:'Izreži',copy:'Kopiraj',paste:'Zalijepi',print:'Ispiši',underline:'Potcrtano',bold:'Podebljaj',italic:'Ukosi',selectAll:'Odaberi sve',removeFormat:'Ukloni formatiranje',strike:'Precrtano',subscript:'Subscript',superscript:'Superscript',horizontalrule:'Ubaci vodoravnu liniju',pagebreak:'Ubaci prijelom stranice',pagebreakAlt:'Prijelom stranice',unlink:'Ukloni link',undo:'Poništi',redo:'Ponovi',common:{browseServer:'Pretraži server',url:'URL',protocol:'Protokol',upload:'Pošalji',uploadSubmit:'Pošalji na server',image:'Slika',flash:'Flash',form:'Form',checkbox:'Checkbox',radio:'Radio Button',textField:'Text Field',textarea:'Textarea',hiddenField:'Hidden Field',button:'Button',select:'Selection Field',imageButton:'Image Button',notSet:'<nije postavljeno>',id:'Id',name:'Naziv',langDir:'Smjer jezika',langDirLtr:'S lijeva na desno (LTR)',langDirRtl:'S desna na lijevo (RTL)',langCode:'Kôd jezika',longDescr:'Dugački opis URL',cssClass:'Stylesheet klase',advisoryTitle:'Advisory naslov',cssStyle:'Stil',ok:'OK',cancel:'Poništi',close:'Zatvori',preview:'Pregledaj',generalTab:'Općenito',advancedTab:'Napredno',validateNumberFailed:'Ova vrijednost nije broj.',confirmNewPage:'Sve napravljene promjene će biti izgubljene ukoliko ih niste snimili. Sigurno želite učitati novu stranicu?',confirmCancel:'Neke od opcija su promjenjene. Sigurno želite zatvoriti ovaj prozor?',options:'Opcije',target:'Odredište',targetNew:'Novi prozor (_blank)',targetTop:'Vršni prozor (_top)',targetSelf:'Isti prozor (_self)',targetParent:'Roditeljski prozor (_parent)',langDirLTR:'S lijeva na desno (LTR)',langDirRTL:'S desna na lijevo (RTL)',styles:'Stil',cssClasses:'Klase stilova',width:'Širina',height:'Visina',align:'Poravnaj',alignLeft:'Lijevo',alignRight:'Desno',alignCenter:'Središnje',alignTop:'Vrh',alignMiddle:'Sredina',alignBottom:'Dolje',invalidHeight:'Visina mora biti broj.',invalidWidth:'Širina mora biti broj.',invalidCssLength:'Vrijednost određena za "%1" polje mora biti pozitivni broj sa ili bez važećih CSS mjernih jedinica (px, %, in, cm, mm, em, ex, pt ili pc).',invalidHtmlLength:'Vrijednost određena za "%1" polje mora biti pozitivni broj sa ili bez važećih HTML mjernih jedinica (px ili %).',invalidInlineStyle:'Vrijednost za linijski stil mora sadržavati jednu ili više definicija s formatom "naziv:vrijednost", odvojenih točka-zarezom.',cssLengthTooltip:'Unesite broj za vrijednost u pikselima ili broj s važećim CSS mjernim jedinicama (px, %, in, cm, mm, em, ex, pt ili pc).',unavailable:'%1<span class="cke_accessibility">, nedostupno</span>'},contextmenu:{options:'Opcije izbornika'},specialChar:{toolbar:'Ubaci posebne znakove',title:'Odaberite posebni karakter',options:'Opcije specijalnih znakova'},link:{toolbar:'Ubaci/promijeni link',other:'<drugi>',menu:'Promijeni link',title:'Link',info:'Link Info',target:'Meta',upload:'Pošalji',advanced:'Napredno',type:'Link vrsta',toUrl:'URL',toAnchor:'Sidro na ovoj stranici',toEmail:'E-Mail',targetFrame:'<okvir>',targetPopup:'<popup prozor>',targetFrameName:'Ime ciljnog okvira',targetPopupName:'Naziv popup prozora',popupFeatures:'Mogućnosti popup prozora',popupResizable:'Promjenjiva veličina',popupStatusBar:'Statusna traka',popupLocationBar:'Traka za lokaciju',popupToolbar:'Traka s alatima',popupMenuBar:'Izborna traka',popupFullScreen:'Cijeli ekran (IE)',popupScrollBars:'Scroll traka',popupDependent:'Ovisno (Netscape)',popupLeft:'Lijeva pozicija',popupTop:'Gornja pozicija',id:'Id',langDir:'Smjer jezika',langDirLTR:'S lijeva na desno (LTR)',langDirRTL:'S desna na lijevo (RTL)',acccessKey:'Pristupna tipka',name:'Naziv',langCode:'Smjer jezika',tabIndex:'Tab Indeks',advisoryTitle:'Advisory naslov',advisoryContentType:'Advisory vrsta sadržaja',cssClasses:'Stylesheet klase',charset:'Kodna stranica povezanih resursa',styles:'Stil',rel:'Veza',selectAnchor:'Odaberi sidro',anchorName:'Po nazivu sidra',anchorId:'Po Id elementa',emailAddress:'E-Mail adresa',emailSubject:'Naslov',emailBody:'Sadržaj poruke',noAnchors:'(Nema dostupnih sidra)',noUrl:'Molimo upišite URL link',noEmail:'Molimo upišite e-mail adresu'},anchor:{toolbar:'Ubaci/promijeni sidro',menu:'Svojstva sidra',title:'Svojstva sidra',name:'Ime sidra',errorName:'Molimo unesite ime sidra',remove:'Ukloni sidro'},list:{numberedTitle:'Svojstva brojčane liste',bulletedTitle:'Svojstva liste',type:'Vrsta',start:'Početak',validateStartNumber:'Početak brojčane liste mora biti cijeli broj.',circle:'Krug',disc:'Disk',square:'Kvadrat',none:'Bez',notset:'<nije određen>',armenian:'Armenijska numeracija',georgian:'Gruzijska numeracija(an, ban, gan, etc.)',lowerRoman:'Romanska numeracija mala slova (i, ii, iii, iv, v, itd.)',upperRoman:'Romanska numeracija velika slova (I, II, III, IV, V, itd.)',lowerAlpha:'Znakovi mala slova (a, b, c, d, e, itd.)',upperAlpha:'Znakovi velika slova (A, B, C, D, E, itd.)',lowerGreek:'Grčka numeracija mala slova (alfa, beta, gama, itd).',decimal:'Decimalna numeracija (1, 2, 3, itd.)',decimalLeadingZero:'Decimalna s vodećom nulom (01, 02, 03, itd)'},findAndReplace:{title:'Pronađi i zamijeni',find:'Pronađi',replace:'Zamijeni',findWhat:'Pronađi:',replaceWith:'Zamijeni s:',notFoundMsg:'Traženi tekst nije pronađen.',findOptions:'Opcije traženja',matchCase:'Usporedi mala/velika slova',matchWord:'Usporedi cijele riječi',matchCyclic:'Usporedi kružno',replaceAll:'Zamijeni sve',replaceSuccessMsg:'Zamijenjeno %1 pojmova.'},table:{toolbar:'Tablica',title:'Svojstva tablice',menu:'Svojstva tablice',deleteTable:'Izbriši tablicu',rows:'Redova',columns:'Kolona',border:'Veličina okvira',widthPx:'piksela',widthPc:'postotaka',widthUnit:'jedinica širine',cellSpace:'Prostornost ćelija',cellPad:'Razmak ćelija',caption:'Naslov',summary:'Sažetak',headers:'Zaglavlje',headersNone:'Ništa',headersColumn:'Prva kolona',headersRow:'Prvi red',headersBoth:'Oba',invalidRows:'Broj redova mora biti broj veći od 0.',invalidCols:'Broj kolona mora biti broj veći od 0.',invalidBorder:'Debljina ruba mora biti broj.',invalidWidth:'Širina tablice mora biti broj.',invalidHeight:'Visina tablice mora biti broj.',invalidCellSpacing:'Prostornost ćelija mora biti broj.',invalidCellPadding:'Razmak ćelija mora biti broj.',cell:{menu:'Ćelija',insertBefore:'Ubaci ćeliju prije',insertAfter:'Ubaci ćeliju poslije',deleteCell:'Izbriši ćelije',merge:'Spoji ćelije',mergeRight:'Spoji desno',mergeDown:'Spoji dolje',splitHorizontal:'Podijeli ćeliju vodoravno',splitVertical:'Podijeli ćeliju okomito',title:'Svojstva ćelije',cellType:'Vrsta ćelije',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Prelazak u novi red',hAlign:'Vodoravno poravnanje',vAlign:'Okomito poravnanje',alignBaseline:'Osnovna linija',bgColor:'Boja pozadine',borderColor:'Boja ruba',data:'Podatak',header:'Zaglavlje',yes:'Da',no:'ne',invalidWidth:'Širina ćelije mora biti broj.',invalidHeight:'Visina ćelije mora biti broj.',invalidRowSpan:'Rows span mora biti cijeli broj.',invalidColSpan:'Columns span mora biti cijeli broj.',chooseColor:'Odaberi'},row:{menu:'Red',insertBefore:'Ubaci red prije',insertAfter:'Ubaci red poslije',deleteRow:'Izbriši redove'},column:{menu:'Kolona',insertBefore:'Ubaci kolonu prije',insertAfter:'Ubaci kolonu poslije',deleteColumn:'Izbriši kolone'}},button:{title:'Image Button svojstva',text:'Tekst (vrijednost)',type:'Vrsta',typeBtn:'Gumb',typeSbm:'Pošalji',typeRst:'Poništi'},checkboxAndRadio:{checkboxTitle:'Checkbox svojstva',radioTitle:'Radio Button svojstva',value:'Vrijednost',selected:'Odabrano'},form:{title:'Form svojstva',menu:'Form svojstva',action:'Akcija',method:'Metoda',encoding:'Encoding'},select:{title:'Selection svojstva',selectInfo:'Info',opAvail:'Dostupne opcije',value:'Vrijednost',size:'Veličina',lines:'linija',chkMulti:'Dozvoli višestruki odabir',opText:'Tekst',opValue:'Vrijednost',btnAdd:'Dodaj',btnModify:'Promijeni',btnUp:'Gore',btnDown:'Dolje',btnSetValue:'Postavi kao odabranu vrijednost',btnDelete:'Obriši'},textarea:{title:'Textarea svojstva',cols:'Kolona',rows:'Redova'},textfield:{title:'Text Field svojstva',name:'Ime',value:'Vrijednost',charWidth:'Širina',maxChars:'Najviše karaktera',type:'Vrsta',typeText:'Tekst',typePass:'Šifra'},hidden:{title:'Hidden Field svojstva',name:'Ime',value:'Vrijednost'},image:{title:'Svojstva slika',titleButton:'Image Button svojstva',menu:'Svojstva slika',infoTab:'Info slike',btnUpload:'Pošalji na server',upload:'Pošalji',alt:'Alternativni tekst',lockRatio:'Zaključaj odnos',resetSize:'Obriši veličinu',border:'Okvir',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Unesite URL slike',linkTab:'Link',button2Img:'Želite li promijeniti odabrani gumb u jednostavnu sliku?',img2Button:'Želite li promijeniti odabranu sliku u gumb?',urlMissing:'Nedostaje URL slike.',validateBorder:'Okvir mora biti cijeli broj.',validateHSpace:'HSpace mora biti cijeli broj',validateVSpace:'VSpace mora biti cijeli broj.'},flash:{properties:'Flash svojstva',propertiesTab:'Svojstva',title:'Flash svojstva',chkPlay:'Auto Play',chkLoop:'Ponavljaj',chkMenu:'Omogući Flash izbornik',chkFull:'Omogući Fullscreen',scale:'Omjer',scaleAll:'Prikaži sve',scaleNoBorder:'Bez okvira',scaleFit:'Točna veličina',access:'Script Access',accessAlways:'Uvijek',accessSameDomain:'Ista domena',accessNever:'Nikad',alignAbsBottom:'Abs dolje',alignAbsMiddle:'Abs sredina',alignBaseline:'Bazno',alignTextTop:'Vrh teksta',quality:'Kvaliteta',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Vrsta prozora',flashvars:'Varijable za Flash',bgcolor:'Boja pozadine',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'Molimo upišite URL link',validateHSpace:'HSpace mora biti broj.',validateVSpace:'VSpace mora biti broj.'},spellCheck:{toolbar:'Provjeri pravopis',title:'Provjera pravopisa',notAvailable:'Žao nam je, ali usluga trenutno nije dostupna.',errorLoading:'Greška učitavanja aplikacije: %s.',notInDic:'Nije u rječniku',changeTo:'Promijeni u',btnIgnore:'Zanemari',btnIgnoreAll:'Zanemari sve',btnReplace:'Zamijeni',btnReplaceAll:'Zamijeni sve',btnUndo:'Vrati',noSuggestions:'-Nema preporuke-',progress:'Provjera u tijeku...',noMispell:'Provjera završena: Nema grešaka',noChanges:'Provjera završena: Nije napravljena promjena',oneChange:'Provjera završena: Jedna riječ promjenjena',manyChanges:'Provjera završena: Promijenjeno %1 riječi',ieSpellDownload:'Provjera pravopisa nije instalirana. Želite li skinuti provjeru pravopisa?'},smiley:{toolbar:'Smješko',title:'Ubaci smješka',options:'Opcije smješka'},elementsPath:{eleLabel:'Putanja elemenata',eleTitle:'%1 element'},numberedlist:'Brojčana lista',bulletedlist:'Obična lista',indent:'Pomakni udesno',outdent:'Pomakni ulijevo',justify:{left:'Lijevo poravnanje',center:'Središnje poravnanje',right:'Desno poravnanje',block:'Blok poravnanje'},blockquote:'Blockquote',clipboard:{title:'Zalijepi',cutError:'Sigurnosne postavke Vašeg pretraživača ne dozvoljavaju operacije automatskog izrezivanja. Molimo koristite kraticu na tipkovnici (Ctrl/Cmd+X).',copyError:'Sigurnosne postavke Vašeg pretraživača ne dozvoljavaju operacije automatskog kopiranja. Molimo koristite kraticu na tipkovnici (Ctrl/Cmd+C).',pasteMsg:'Molimo zaljepite unutar doljnjeg okvira koristeći tipkovnicu (<STRONG>Ctrl/Cmd+V</STRONG>) i kliknite <STRONG>OK</STRONG>.',securityMsg:'Zbog sigurnosnih postavki Vašeg pretraživača, editor nema direktan pristup Vašem međuspremniku. Potrebno je ponovno zalijepiti tekst u ovaj prozor.',pasteArea:'Prostor za ljepljenje'},pastefromword:{confirmCleanup:'Tekst koji želite zalijepiti čini se da je kopiran iz Worda. Želite li prije očistiti tekst?',toolbar:'Zalijepi iz Worda',title:'Zalijepi iz Worda',error:'Nije moguće očistiti podatke za ljepljenje zbog interne greške'},pasteText:{button:'Zalijepi kao čisti tekst',title:'Zalijepi kao čisti tekst'},templates:{button:'Predlošci',title:'Predlošci sadržaja',options:'Opcije predložaka',insertOption:'Zamijeni trenutne sadržaje',selectPromptMsg:'Molimo odaberite predložak koji želite otvoriti<br>(stvarni sadržaj će biti izgubljen):',emptyListMsg:'(Nema definiranih predložaka)'},showBlocks:'Prikaži blokove',stylesCombo:{label:'Stil',panelTitle:'Stilovi formatiranja',panelTitle1:'Block stilovi',panelTitle2:'Inline stilovi',panelTitle3:'Object stilovi'},format:{label:'Format',panelTitle:'Format',tag_p:'Normal',tag_pre:'Formatirano',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Napravi DIV kontejner',toolbar:'Napravi DIV kontejner',cssClassInputLabel:'Klase stilova',styleSelectLabel:'Stil',IdInputLabel:'Id',languageCodeInputLabel:'Jezični kod',inlineStyleInputLabel:'Stil u liniji',advisoryTitleInputLabel:'Savjetodavni naslov',langDirLabel:'Smjer jezika',langDirLTRLabel:'S lijeva na desno (LTR)',langDirRTLLabel:'S desna na lijevo (RTL)',edit:'Uredi DIV',remove:'Ukloni DIV'},iframe:{title:'IFrame svojstva',toolbar:'IFrame',noUrl:'Unesite URL iframe-a',scrolling:'Omogući trake za skrolanje',border:'Prikaži okvir IFrame-a'},font:{label:'Font',voiceLabel:'Font',panelTitle:'Font'},fontSize:{label:'Veličina',voiceLabel:'Veličina slova',panelTitle:'Veličina'},colorButton:{textColorTitle:'Boja teksta',bgColorTitle:'Boja pozadine',panelTitle:'Boje',auto:'Automatski',more:'Više boja...'},colors:{'000':'Crna',800000:'Kesten','8B4513':'Smeđa','2F4F4F':'Tamno siva','008080':'Teal','000080':'Mornarska','4B0082':'Indigo',696969:'Tamno siva',B22222:'Vatrena cigla',A52A2A:'Smeđa',DAA520:'Zlatna','006400':'Tamno zelena','40E0D0':'Tirkizna','0000CD':'Srednje plava',800080:'Ljubičasta',808080:'Siva',F00:'Crvena',FF8C00:'Tamno naranđasta',FFD700:'Zlatna','008000':'Zelena','0FF':'Cijan','00F':'Plava',EE82EE:'Ljubičasta',A9A9A9:'Mutno siva',FFA07A:'Svijetli losos',FFA500:'Naranđasto',FFFF00:'Žuto','00FF00':'Limun',AFEEEE:'Blijedo tirkizna',ADD8E6:'Svijetlo plava',DDA0DD:'Šljiva',D3D3D3:'Svijetlo siva',FFF0F5:'Lavanda rumeno',FAEBD7:'Antikno bijela',FFFFE0:'Svijetlo žuta',F0FFF0:'Med',F0FFFF:'Azurna',F0F8FF:'Alice plava',E6E6FA:'Lavanda',FFF:'Bijela'},scayt:{title:'Provjeri pravopis tijekom tipkanja (SCAYT)',opera_title:'Nije podržano u Operi',enable:'Omogući SCAYT',disable:'Onemogući SCAYT',about:'O SCAYT',toggle:'Omoguću/Onemogući SCAYT',options:'Opcije',langs:'Jezici',moreSuggestions:'Više prijedloga',ignore:'Zanemari',ignoreAll:'Zanemari sve',addWord:'Dodaj riječ',emptyDic:'Naziv rječnika ne smije biti prazno.',optionsTab:'Opcije',allCaps:'Ignoriraj riječi s velikim slovima',ignoreDomainNames:'Ignoriraj nazive domena',mixedCase:'Ignoriraj riječi s miješanim slovima',mixedWithDigits:'Ignoriraj riječi s brojevima',languagesTab:'Jezici',dictionariesTab:'Rječnici',dic_field_name:'Naziv riječnika',dic_create:'Napravi',dic_restore:'Povrati',dic_delete:'Obriši',dic_rename:'Promijeni naziv',dic_info:'Na početku se korisnički Riječnik sprema u Cookie. Nažalost, veličina im je ograničena. Kada korisnički Riječnik naraste preko te veličine, Riječnik će biti smješten na naš server. Kako bi se korisnički Riječnik spremio na naš server morate odabrati naziv Vašeg Riječnika. Ukoliko ste već prije spremali Riječnik na naše servere, unesite naziv Riječnika i pritisnite na Povrati.',aboutTab:'O SCAYT'},about:{title:'O CKEditoru',dlgTitle:'O CKEditoru',help:'Provjeri $1 za pomoć.',userGuide:'Vodič za CKEditor korisnike',moreInfo:'Za informacije o licencama posjetite našu web stranicu:',copy:'Copyright © $1. All rights reserved.'},maximize:'Povećaj',minimize:'Smanji',fakeobjects:{anchor:'Sidro',flash:'Flash animacija',iframe:'IFrame',hiddenfield:'Sakriveno polje',unknown:'Nepoznati objekt'},resize:'Povuci za promjenu veličine',colordialog:{title:'Odaberi boju',options:'Opcije boje',highlight:'Istaknuto',selected:'Odabrana boja',clear:'Očisti'},toolbarCollapse:'Smanji alatnu traku',toolbarExpand:'Proširi alatnu traku',toolbarGroups:{document:'Dokument',clipboard:'Međuspremnik/Poništi',editing:'Uređivanje',forms:'Forme',basicstyles:'Osnovni stilovi',paragraph:'Paragraf',links:'Veze',insert:'Umetni',styles:'Stilovi',colors:'Boje',tools:'Alatke'},bidi:{ltr:'Smjer teksta s lijeva na desno',rtl:'Smjer teksta s desna na lijevo'},docprops:{label:'Svojstva dokumenta',title:'Svojstva dokumenta',design:'Dizajn',meta:'Meta Data',chooseColor:'Odaberi',other:'<drugi>',docTitle:'Naslov stranice',charset:'Enkodiranje znakova',charsetOther:'Ostalo enkodiranje znakova',charsetASCII:'ASCII',charsetCE:'Središnja Europa',charsetCT:'Tradicionalna kineska (Big5)',charsetCR:'Ćirilica',charsetGR:'Grčka',charsetJP:'Japanska',charsetKR:'Koreanska',charsetTR:'Turska',charsetUN:'Unicode (UTF-8)',charsetWE:'Zapadna Europa',docType:'Zaglavlje vrste dokumenta',docTypeOther:'Ostalo zaglavlje vrste dokumenta',xhtmlDec:'Ubaci XHTML deklaracije',bgColor:'Boja pozadine',bgImage:'URL slike pozadine',bgFixed:'Pozadine se ne pomiče',txtColor:'Boja teksta',margin:'Margine stranice',marginTop:'Vrh',marginLeft:'Lijevo',marginRight:'Desno',marginBottom:'Dolje',metaKeywords:'Ključne riječi dokumenta (odvojene zarezom)',metaDescription:'Opis dokumenta',metaAuthor:'Autor',metaCopyright:'Autorska prava',previewHtml:'<p>Ovo je neki <strong>primjer teksta</strong>. Vi koristite <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.hr={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Alatne trake uređivača teksta',editor:'Bogati uređivač teksta',source:'Kôd',newPage:'Nova stranica',save:'Snimi',preview:'Pregledaj',cut:'Izreži',copy:'Kopiraj',paste:'Zalijepi',print:'Ispiši',underline:'Potcrtano',bold:'Podebljaj',italic:'Ukosi',selectAll:'Odaberi sve',removeFormat:'Ukloni formatiranje',strike:'Precrtano',subscript:'Subscript',superscript:'Superscript',horizontalrule:'Ubaci vodoravnu liniju',pagebreak:'Ubaci prijelom stranice',pagebreakAlt:'Prijelom stranice',unlink:'Ukloni link',undo:'Poništi',redo:'Ponovi',common:{browseServer:'Pretraži server',url:'URL',protocol:'Protokol',upload:'Pošalji',uploadSubmit:'Pošalji na server',image:'Slika',flash:'Flash',form:'Form',checkbox:'Checkbox',radio:'Radio Button',textField:'Text Field',textarea:'Textarea',hiddenField:'Hidden Field',button:'Button',select:'Selection Field',imageButton:'Image Button',notSet:'<nije postavljeno>',id:'Id',name:'Naziv',langDir:'Smjer jezika',langDirLtr:'S lijeva na desno (LTR)',langDirRtl:'S desna na lijevo (RTL)',langCode:'Kôd jezika',longDescr:'Dugački opis URL',cssClass:'Stylesheet klase',advisoryTitle:'Advisory naslov',cssStyle:'Stil',ok:'OK',cancel:'Poništi',close:'Zatvori',preview:'Pregledaj',generalTab:'Općenito',advancedTab:'Napredno',validateNumberFailed:'Ova vrijednost nije broj.',confirmNewPage:'Sve napravljene promjene će biti izgubljene ukoliko ih niste snimili. Sigurno želite učitati novu stranicu?',confirmCancel:'Neke od opcija su promjenjene. Sigurno želite zatvoriti ovaj prozor?',options:'Opcije',target:'Odredište',targetNew:'Novi prozor (_blank)',targetTop:'Vršni prozor (_top)',targetSelf:'Isti prozor (_self)',targetParent:'Roditeljski prozor (_parent)',langDirLTR:'S lijeva na desno (LTR)',langDirRTL:'S desna na lijevo (RTL)',styles:'Stil',cssClasses:'Klase stilova',width:'Širina',height:'Visina',align:'Poravnaj',alignLeft:'Lijevo',alignRight:'Desno',alignCenter:'Središnje',alignTop:'Vrh',alignMiddle:'Sredina',alignBottom:'Dolje',invalidHeight:'Visina mora biti broj.',invalidWidth:'Širina mora biti broj.',invalidCssLength:'Vrijednost određena za "%1" polje mora biti pozitivni broj sa ili bez važećih CSS mjernih jedinica (px, %, in, cm, mm, em, ex, pt ili pc).',invalidHtmlLength:'Vrijednost određena za "%1" polje mora biti pozitivni broj sa ili bez važećih HTML mjernih jedinica (px ili %).',invalidInlineStyle:'Vrijednost za linijski stil mora sadržavati jednu ili više definicija s formatom "naziv:vrijednost", odvojenih točka-zarezom.',cssLengthTooltip:'Unesite broj za vrijednost u pikselima ili broj s važećim CSS mjernim jedinicama (px, %, in, cm, mm, em, ex, pt ili pc).',unavailable:'%1<span class="cke_accessibility">, nedostupno</span>'},contextmenu:{options:'Opcije izbornika'},specialChar:{toolbar:'Ubaci posebne znakove',title:'Odaberite posebni karakter',options:'Opcije specijalnih znakova'},link:{toolbar:'Ubaci/promijeni link',other:'<drugi>',menu:'Promijeni link',title:'Link',info:'Link Info',target:'Meta',upload:'Pošalji',advanced:'Napredno',type:'Link vrsta',toUrl:'URL',toAnchor:'Sidro na ovoj stranici',toEmail:'E-Mail',targetFrame:'<okvir>',targetPopup:'<popup prozor>',targetFrameName:'Ime ciljnog okvira',targetPopupName:'Naziv popup prozora',popupFeatures:'Mogućnosti popup prozora',popupResizable:'Promjenjiva veličina',popupStatusBar:'Statusna traka',popupLocationBar:'Traka za lokaciju',popupToolbar:'Traka s alatima',popupMenuBar:'Izborna traka',popupFullScreen:'Cijeli ekran (IE)',popupScrollBars:'Scroll traka',popupDependent:'Ovisno (Netscape)',popupLeft:'Lijeva pozicija',popupTop:'Gornja pozicija',id:'Id',langDir:'Smjer jezika',langDirLTR:'S lijeva na desno (LTR)',langDirRTL:'S desna na lijevo (RTL)',acccessKey:'Pristupna tipka',name:'Naziv',langCode:'Smjer jezika',tabIndex:'Tab Indeks',advisoryTitle:'Advisory naslov',advisoryContentType:'Advisory vrsta sadržaja',cssClasses:'Stylesheet klase',charset:'Kodna stranica povezanih resursa',styles:'Stil',rel:'Veza',selectAnchor:'Odaberi sidro',anchorName:'Po nazivu sidra',anchorId:'Po Id elementa',emailAddress:'E-Mail adresa',emailSubject:'Naslov',emailBody:'Sadržaj poruke',noAnchors:'(Nema dostupnih sidra)',noUrl:'Molimo upišite URL link',noEmail:'Molimo upišite e-mail adresu'},anchor:{toolbar:'Ubaci/promijeni sidro',menu:'Svojstva sidra',title:'Svojstva sidra',name:'Ime sidra',errorName:'Molimo unesite ime sidra',remove:'Ukloni sidro'},list:{numberedTitle:'Svojstva brojčane liste',bulletedTitle:'Svojstva liste',type:'Vrsta',start:'Početak',validateStartNumber:'Početak brojčane liste mora biti cijeli broj.',circle:'Krug',disc:'Disk',square:'Kvadrat',none:'Bez',notset:'<nije određen>',armenian:'Armenijska numeracija',georgian:'Gruzijska numeracija(an, ban, gan, etc.)',lowerRoman:'Romanska numeracija mala slova (i, ii, iii, iv, v, itd.)',upperRoman:'Romanska numeracija velika slova (I, II, III, IV, V, itd.)',lowerAlpha:'Znakovi mala slova (a, b, c, d, e, itd.)',upperAlpha:'Znakovi velika slova (A, B, C, D, E, itd.)',lowerGreek:'Grčka numeracija mala slova (alfa, beta, gama, itd).',decimal:'Decimalna numeracija (1, 2, 3, itd.)',decimalLeadingZero:'Decimalna s vodećom nulom (01, 02, 03, itd)'},findAndReplace:{title:'Pronađi i zamijeni',find:'Pronađi',replace:'Zamijeni',findWhat:'Pronađi:',replaceWith:'Zamijeni s:',notFoundMsg:'Traženi tekst nije pronađen.',findOptions:'Opcije traženja',matchCase:'Usporedi mala/velika slova',matchWord:'Usporedi cijele riječi',matchCyclic:'Usporedi kružno',replaceAll:'Zamijeni sve',replaceSuccessMsg:'Zamijenjeno %1 pojmova.'},table:{toolbar:'Tablica',title:'Svojstva tablice',menu:'Svojstva tablice',deleteTable:'Izbriši tablicu',rows:'Redova',columns:'Kolona',border:'Veličina okvira',widthPx:'piksela',widthPc:'postotaka',widthUnit:'jedinica širine',cellSpace:'Prostornost ćelija',cellPad:'Razmak ćelija',caption:'Naslov',summary:'Sažetak',headers:'Zaglavlje',headersNone:'Ništa',headersColumn:'Prva kolona',headersRow:'Prvi red',headersBoth:'Oba',invalidRows:'Broj redova mora biti broj veći od 0.',invalidCols:'Broj kolona mora biti broj veći od 0.',invalidBorder:'Debljina ruba mora biti broj.',invalidWidth:'Širina tablice mora biti broj.',invalidHeight:'Visina tablice mora biti broj.',invalidCellSpacing:'Prostornost ćelija mora biti broj.',invalidCellPadding:'Razmak ćelija mora biti broj.',cell:{menu:'Ćelija',insertBefore:'Ubaci ćeliju prije',insertAfter:'Ubaci ćeliju poslije',deleteCell:'Izbriši ćelije',merge:'Spoji ćelije',mergeRight:'Spoji desno',mergeDown:'Spoji dolje',splitHorizontal:'Podijeli ćeliju vodoravno',splitVertical:'Podijeli ćeliju okomito',title:'Svojstva ćelije',cellType:'Vrsta ćelije',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Prelazak u novi red',hAlign:'Vodoravno poravnanje',vAlign:'Okomito poravnanje',alignBaseline:'Osnovna linija',bgColor:'Boja pozadine',borderColor:'Boja ruba',data:'Podatak',header:'Zaglavlje',yes:'Da',no:'ne',invalidWidth:'Širina ćelije mora biti broj.',invalidHeight:'Visina ćelije mora biti broj.',invalidRowSpan:'Rows span mora biti cijeli broj.',invalidColSpan:'Columns span mora biti cijeli broj.',chooseColor:'Odaberi'},row:{menu:'Red',insertBefore:'Ubaci red prije',insertAfter:'Ubaci red poslije',deleteRow:'Izbriši redove'},column:{menu:'Kolona',insertBefore:'Ubaci kolonu prije',insertAfter:'Ubaci kolonu poslije',deleteColumn:'Izbriši kolone'}},button:{title:'Image Button svojstva',text:'Tekst (vrijednost)',type:'Vrsta',typeBtn:'Gumb',typeSbm:'Pošalji',typeRst:'Poništi'},checkboxAndRadio:{checkboxTitle:'Checkbox svojstva',radioTitle:'Radio Button svojstva',value:'Vrijednost',selected:'Odabrano'},form:{title:'Form svojstva',menu:'Form svojstva',action:'Akcija',method:'Metoda',encoding:'Encoding'},select:{title:'Selection svojstva',selectInfo:'Info',opAvail:'Dostupne opcije',value:'Vrijednost',size:'Veličina',lines:'linija',chkMulti:'Dozvoli višestruki odabir',opText:'Tekst',opValue:'Vrijednost',btnAdd:'Dodaj',btnModify:'Promijeni',btnUp:'Gore',btnDown:'Dolje',btnSetValue:'Postavi kao odabranu vrijednost',btnDelete:'Obriši'},textarea:{title:'Textarea svojstva',cols:'Kolona',rows:'Redova'},textfield:{title:'Text Field svojstva',name:'Ime',value:'Vrijednost',charWidth:'Širina',maxChars:'Najviše karaktera',type:'Vrsta',typeText:'Tekst',typePass:'Šifra'},hidden:{title:'Hidden Field svojstva',name:'Ime',value:'Vrijednost'},image:{title:'Svojstva slika',titleButton:'Image Button svojstva',menu:'Svojstva slika',infoTab:'Info slike',btnUpload:'Pošalji na server',upload:'Pošalji',alt:'Alternativni tekst',lockRatio:'Zaključaj odnos',resetSize:'Obriši veličinu',border:'Okvir',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Unesite URL slike',linkTab:'Link',button2Img:'Želite li promijeniti odabrani gumb u jednostavnu sliku?',img2Button:'Želite li promijeniti odabranu sliku u gumb?',urlMissing:'Nedostaje URL slike.',validateBorder:'Okvir mora biti cijeli broj.',validateHSpace:'HSpace mora biti cijeli broj',validateVSpace:'VSpace mora biti cijeli broj.'},flash:{properties:'Flash svojstva',propertiesTab:'Svojstva',title:'Flash svojstva',chkPlay:'Auto Play',chkLoop:'Ponavljaj',chkMenu:'Omogući Flash izbornik',chkFull:'Omogući Fullscreen',scale:'Omjer',scaleAll:'Prikaži sve',scaleNoBorder:'Bez okvira',scaleFit:'Točna veličina',access:'Script Access',accessAlways:'Uvijek',accessSameDomain:'Ista domena',accessNever:'Nikad',alignAbsBottom:'Abs dolje',alignAbsMiddle:'Abs sredina',alignBaseline:'Bazno',alignTextTop:'Vrh teksta',quality:'Kvaliteta',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Vrsta prozora',flashvars:'Varijable za Flash',bgcolor:'Boja pozadine',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'Molimo upišite URL link',validateHSpace:'HSpace mora biti broj.',validateVSpace:'VSpace mora biti broj.'},spellCheck:{toolbar:'Provjeri pravopis',title:'Provjera pravopisa',notAvailable:'Žao nam je, ali usluga trenutno nije dostupna.',errorLoading:'Greška učitavanja aplikacije: %s.',notInDic:'Nije u rječniku',changeTo:'Promijeni u',btnIgnore:'Zanemari',btnIgnoreAll:'Zanemari sve',btnReplace:'Zamijeni',btnReplaceAll:'Zamijeni sve',btnUndo:'Vrati',noSuggestions:'-Nema preporuke-',progress:'Provjera u tijeku...',noMispell:'Provjera završena: Nema grešaka',noChanges:'Provjera završena: Nije napravljena promjena',oneChange:'Provjera završena: Jedna riječ promjenjena',manyChanges:'Provjera završena: Promijenjeno %1 riječi',ieSpellDownload:'Provjera pravopisa nije instalirana. Želite li skinuti provjeru pravopisa?'},smiley:{toolbar:'Smješko',title:'Ubaci smješka',options:'Opcije smješka'},elementsPath:{eleLabel:'Putanja elemenata',eleTitle:'%1 element'},numberedlist:'Brojčana lista',bulletedlist:'Obična lista',indent:'Pomakni udesno',outdent:'Pomakni ulijevo',justify:{left:'Lijevo poravnanje',center:'Središnje poravnanje',right:'Desno poravnanje',block:'Blok poravnanje'},blockquote:'Blockquote',clipboard:{title:'Zalijepi',cutError:'Sigurnosne postavke Vašeg pretraživača ne dozvoljavaju operacije automatskog izrezivanja. Molimo koristite kraticu na tipkovnici (Ctrl/Cmd+X).',copyError:'Sigurnosne postavke Vašeg pretraživača ne dozvoljavaju operacije automatskog kopiranja. Molimo koristite kraticu na tipkovnici (Ctrl/Cmd+C).',pasteMsg:'Molimo zaljepite unutar doljnjeg okvira koristeći tipkovnicu (<STRONG>Ctrl/Cmd+V</STRONG>) i kliknite <STRONG>OK</STRONG>.',securityMsg:'Zbog sigurnosnih postavki Vašeg pretraživača, editor nema direktan pristup Vašem međuspremniku. Potrebno je ponovno zalijepiti tekst u ovaj prozor.',pasteArea:'Prostor za ljepljenje'},pastefromword:{confirmCleanup:'Tekst koji želite zalijepiti čini se da je kopiran iz Worda. Želite li prije očistiti tekst?',toolbar:'Zalijepi iz Worda',title:'Zalijepi iz Worda',error:'Nije moguće očistiti podatke za ljepljenje zbog interne greške'},pasteText:{button:'Zalijepi kao čisti tekst',title:'Zalijepi kao čisti tekst'},templates:{button:'Predlošci',title:'Predlošci sadržaja',options:'Opcije predložaka',insertOption:'Zamijeni trenutne sadržaje',selectPromptMsg:'Molimo odaberite predložak koji želite otvoriti<br>(stvarni sadržaj će biti izgubljen):',emptyListMsg:'(Nema definiranih predložaka)'},showBlocks:'Prikaži blokove',stylesCombo:{label:'Stil',panelTitle:'Stilovi formatiranja',panelTitle1:'Block stilovi',panelTitle2:'Inline stilovi',panelTitle3:'Object stilovi'},format:{label:'Format',panelTitle:'Format',tag_p:'Normal',tag_pre:'Formatirano',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Napravi DIV kontejner',toolbar:'Napravi DIV kontejner',cssClassInputLabel:'Klase stilova',styleSelectLabel:'Stil',IdInputLabel:'Id',languageCodeInputLabel:'Jezični kod',inlineStyleInputLabel:'Stil u liniji',advisoryTitleInputLabel:'Savjetodavni naslov',langDirLabel:'Smjer jezika',langDirLTRLabel:'S lijeva na desno (LTR)',langDirRTLLabel:'S desna na lijevo (RTL)',edit:'Uredi DIV',remove:'Ukloni DIV'},iframe:{title:'IFrame svojstva',toolbar:'IFrame',noUrl:'Unesite URL iframe-a',scrolling:'Omogući trake za skrolanje',border:'Prikaži okvir IFrame-a'},font:{label:'Font',voiceLabel:'Font',panelTitle:'Font'},fontSize:{label:'Veličina',voiceLabel:'Veličina slova',panelTitle:'Veličina'},colorButton:{textColorTitle:'Boja teksta',bgColorTitle:'Boja pozadine',panelTitle:'Boje',auto:'Automatski',more:'Više boja...'},colors:{'000':'Crna',800000:'Kesten','8B4513':'Smeđa','2F4F4F':'Tamno siva','008080':'Teal','000080':'Mornarska','4B0082':'Indigo',696969:'Tamno siva',B22222:'Vatrena cigla',A52A2A:'Smeđa',DAA520:'Zlatna','006400':'Tamno zelena','40E0D0':'Tirkizna','0000CD':'Srednje plava',800080:'Ljubičasta',808080:'Siva',F00:'Crvena',FF8C00:'Tamno naranđasta',FFD700:'Zlatna','008000':'Zelena','0FF':'Cijan','00F':'Plava',EE82EE:'Ljubičasta',A9A9A9:'Mutno siva',FFA07A:'Svijetli losos',FFA500:'Naranđasto',FFFF00:'Žuto','00FF00':'Limun',AFEEEE:'Blijedo tirkizna',ADD8E6:'Svijetlo plava',DDA0DD:'Šljiva',D3D3D3:'Svijetlo siva',FFF0F5:'Lavanda rumeno',FAEBD7:'Antikno bijela',FFFFE0:'Svijetlo žuta',F0FFF0:'Med',F0FFFF:'Azurna',F0F8FF:'Alice plava',E6E6FA:'Lavanda',FFF:'Bijela'},scayt:{title:'Provjeri pravopis tijekom tipkanja (SCAYT)',opera_title:'Nije podržano u Operi',enable:'Omogući SCAYT',disable:'Onemogući SCAYT',about:'O SCAYT',toggle:'Omoguću/Onemogući SCAYT',options:'Opcije',langs:'Jezici',moreSuggestions:'Više prijedloga',ignore:'Zanemari',ignoreAll:'Zanemari sve',addWord:'Dodaj riječ',emptyDic:'Naziv rječnika ne smije biti prazno.',optionsTab:'Opcije',allCaps:'Ignoriraj riječi s velikim slovima',ignoreDomainNames:'Ignoriraj nazive domena',mixedCase:'Ignoriraj riječi s miješanim slovima',mixedWithDigits:'Ignoriraj riječi s brojevima',languagesTab:'Jezici',dictionariesTab:'Rječnici',dic_field_name:'Naziv riječnika',dic_create:'Napravi',dic_restore:'Povrati',dic_delete:'Obriši',dic_rename:'Promijeni naziv',dic_info:'Na početku se korisnički Riječnik sprema u Cookie. Nažalost, veličina im je ograničena. Kada korisnički Riječnik naraste preko te veličine, Riječnik će biti smješten na naš server. Kako bi se korisnički Riječnik spremio na naš server morate odabrati naziv Vašeg Riječnika. Ukoliko ste već prije spremali Riječnik na naše servere, unesite naziv Riječnika i pritisnite na Povrati.',aboutTab:'O SCAYT'},about:{title:'O CKEditoru',dlgTitle:'O CKEditoru',help:'Provjeri $1 za pomoć.',userGuide:'Vodič za CKEditor korisnike',moreInfo:'Za informacije o licencama posjetite našu web stranicu:',copy:'Copyright © $1. All rights reserved.'},maximize:'Povećaj',minimize:'Smanji',fakeobjects:{anchor:'Sidro',flash:'Flash animacija',iframe:'IFrame',hiddenfield:'Sakriveno polje',unknown:'Nepoznati objekt'},resize:'Povuci za promjenu veličine',colordialog:{title:'Odaberi boju',options:'Opcije boje',highlight:'Istaknuto',selected:'Odabrana boja',clear:'Očisti'},toolbarCollapse:'Smanji alatnu traku',toolbarExpand:'Proširi alatnu traku',toolbarGroups:{document:'Dokument',clipboard:'Međuspremnik/Poništi',editing:'Uređivanje',forms:'Forme',basicstyles:'Osnovni stilovi',paragraph:'Paragraf',links:'Veze',insert:'Umetni',styles:'Stilovi',colors:'Boje',tools:'Alatke'},bidi:{ltr:'Smjer teksta s lijeva na desno',rtl:'Smjer teksta s desna na lijevo'},docprops:{label:'Svojstva dokumenta',title:'Svojstva dokumenta',design:'Dizajn',meta:'Meta Data',chooseColor:'Odaberi',other:'<drugi>',docTitle:'Naslov stranice',charset:'Enkodiranje znakova',charsetOther:'Ostalo enkodiranje znakova',charsetASCII:'ASCII',charsetCE:'Središnja Europa',charsetCT:'Tradicionalna kineska (Big5)',charsetCR:'Ćirilica',charsetGR:'Grčka',charsetJP:'Japanska',charsetKR:'Koreanska',charsetTR:'Turska',charsetUN:'Unicode (UTF-8)',charsetWE:'Zapadna Europa',docType:'Zaglavlje vrste dokumenta',docTypeOther:'Ostalo zaglavlje vrste dokumenta',xhtmlDec:'Ubaci XHTML deklaracije',bgColor:'Boja pozadine',bgImage:'URL slike pozadine',bgFixed:'Pozadine se ne pomiče',txtColor:'Boja teksta',margin:'Margine stranice',marginTop:'Vrh',marginLeft:'Lijevo',marginRight:'Desno',marginBottom:'Dolje',metaKeywords:'Ključne riječi dokumenta (odvojene zarezom)',metaDescription:'Opis dokumenta',metaAuthor:'Autor',metaCopyright:'Autorska prava',previewHtml:'<p>Ovo je neki <strong>primjer teksta</strong>. Vi koristite <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/hu.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/hu.js
index 4a33899..9c3316f 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/hu.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/hu.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.hu={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Szerkesztő Eszköztár',editor:'HTML szerkesztő',source:'Forráskód',newPage:'Új oldal',save:'Mentés',preview:'Előnézet',cut:'Kivágás',copy:'Másolás',paste:'Beillesztés',print:'Nyomtatás',underline:'Aláhúzott',bold:'Félkövér',italic:'Dőlt',selectAll:'Mindent kijelöl',removeFormat:'Formázás eltávolítása',strike:'Áthúzott',subscript:'Alsó index',superscript:'Felső index',horizontalrule:'Elválasztóvonal beillesztése',pagebreak:'Oldaltörés beillesztése',pagebreakAlt:'Oldaltörés',unlink:'Hivatkozás törlése',undo:'Visszavonás',redo:'Ismétlés',common:{browseServer:'Böngészés a szerveren',url:'Hivatkozás',protocol:'Protokoll',upload:'Feltöltés',uploadSubmit:'Küldés a szerverre',image:'Kép',flash:'Flash',form:'Űrlap',checkbox:'Jelölőnégyzet',radio:'Választógomb',textField:'Szövegmező',textarea:'Szövegterület',hiddenField:'Rejtettmező',button:'Gomb',select:'Legördülő lista',imageButton:'Képgomb',notSet:'<nincs beállítva>',id:'Azonosító',name:'Név',langDir:'Írás iránya',langDirLtr:'Balról jobbra',langDirRtl:'Jobbról balra',langCode:'Nyelv kódja',longDescr:'Részletes leírás webcíme',cssClass:'Stíluskészlet',advisoryTitle:'Súgócimke',cssStyle:'Stílus',ok:'Rendben',cancel:'Mégsem',close:'Bezárás',preview:'Előnézet',generalTab:'Általános',advancedTab:'További opciók',validateNumberFailed:'A mezőbe csak számokat írhat.',confirmNewPage:'Minden nem mentett változás el fog veszni! Biztosan be szeretné tölteni az oldalt?',confirmCancel:'Az űrlap tartalma megváltozott, ám a változásokat nem rögzítette. Biztosan be szeretné zárni az űrlapot?',options:'Beállítások',target:'Cél',targetNew:'Új ablak (_blank)',targetTop:'Legfelső ablak (_top)',targetSelf:'Aktuális ablakban (_self)',targetParent:'Szülő ablak (_parent)',langDirLTR:'Balról jobbra (LTR)',langDirRTL:'Jobbról balra (RTL)',styles:'Stílus',cssClasses:'Stíluslap osztály',width:'Szélesség',height:'Magasság',align:'Igazítás',alignLeft:'Bal',alignRight:'Jobbra',alignCenter:'Középre',alignTop:'Tetejére',alignMiddle:'Középre',alignBottom:'Aljára',invalidHeight:'A magasság mezőbe csak számokat írhat.',invalidWidth:'A szélesség mezőbe csak számokat írhat.',invalidCssLength:'"%1"-hez megadott érték csakis egy pozitív szám lehet, esetleg egy érvényes CSS egységgel megjelölve(px, %, in, cm, mm, em, ex, pt vagy pc).',invalidHtmlLength:'"%1"-hez megadott érték csakis egy pozitív szám lehet, esetleg egy érvényes HTML egységgel megjelölve(px vagy %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, nem elérhető</span>'},contextmenu:{options:'Helyi menü opciók'},specialChar:{toolbar:'Speciális karakter beillesztése',title:'Speciális karakter választása',options:'Speciális karakter opciók'},link:{toolbar:'Hivatkozás beillesztése/módosítása',other:'<más>',menu:'Hivatkozás módosítása',title:'Hivatkozás tulajdonságai',info:'Alaptulajdonságok',target:'Tartalom megjelenítése',upload:'Feltöltés',advanced:'További opciók',type:'Hivatkozás típusa',toUrl:'URL',toAnchor:'Horgony az oldalon',toEmail:'E-Mail',targetFrame:'<keretben>',targetPopup:'<felugró ablakban>',targetFrameName:'Keret neve',targetPopupName:'Felugró ablak neve',popupFeatures:'Felugró ablak jellemzői',popupResizable:'Átméretezés',popupStatusBar:'Állapotsor',popupLocationBar:'Címsor',popupToolbar:'Eszköztár',popupMenuBar:'Menü sor',popupFullScreen:'Teljes képernyő (csak IE)',popupScrollBars:'Gördítősáv',popupDependent:'Szülőhöz kapcsolt (csak Netscape)',popupLeft:'Bal pozíció',popupTop:'Felső pozíció',id:'Id',langDir:'Írás iránya',langDirLTR:'Balról jobbra',langDirRTL:'Jobbról balra',acccessKey:'Billentyűkombináció',name:'Név',langCode:'Írás iránya',tabIndex:'Tabulátor index',advisoryTitle:'Súgócimke',advisoryContentType:'Súgó tartalomtípusa',cssClasses:'Stíluskészlet',charset:'Hivatkozott tartalom kódlapja',styles:'Stílus',rel:'Kapcsolat típusa',selectAnchor:'Horgony választása',anchorName:'Horgony név szerint',anchorId:'Azonosító szerint',emailAddress:'E-Mail cím',emailSubject:'Üzenet tárgya',emailBody:'Üzenet',noAnchors:'(Nincs horgony a dokumentumban)',noUrl:'Adja meg a hivatkozás webcímét',noEmail:'Adja meg az E-Mail címet'},anchor:{toolbar:'Horgony beillesztése/szerkesztése',menu:'Horgony tulajdonságai',title:'Horgony tulajdonságai',name:'Horgony neve',errorName:'Kérem adja meg a horgony nevét',remove:'Horgony eltávolítása'},list:{numberedTitle:'Sorszámozott lista tulajdonságai',bulletedTitle:'Pontozott lista tulajdonságai',type:'Típus',start:'Kezdőszám',validateStartNumber:'A kezdőszám nem lehet tört érték.',circle:'Kör',disc:'Korong',square:'Négyzet',none:'Nincs',notset:'<Nincs beállítva>',armenian:'Örmény számozás',georgian:'Grúz számozás (an, ban, gan, stb.)',lowerRoman:'Római kisbetűs (i, ii, iii, iv, v, stb.)',upperRoman:'Római nagybetűs (I, II, III, IV, V, stb.)',lowerAlpha:'Kisbetűs (a, b, c, d, e, stb.)',upperAlpha:'Nagybetűs (A, B, C, D, E, stb.)',lowerGreek:'Görög (alpha, beta, gamma, stb.)',decimal:'Arab számozás (1, 2, 3, stb.)',decimalLeadingZero:'Számozás bevezető nullákkal (01, 02, 03, stb.)'},findAndReplace:{title:'Keresés és csere',find:'Keresés',replace:'Csere',findWhat:'Keresett szöveg:',replaceWith:'Csere erre:',notFoundMsg:'A keresett szöveg nem található.',findOptions:'Find Options',matchCase:'kis- és nagybetű megkülönböztetése',matchWord:'csak ha ez a teljes szó',matchCyclic:'Ciklikus keresés',replaceAll:'Az összes cseréje',replaceSuccessMsg:'%1 egyezőség cserélve.'},table:{toolbar:'Táblázat',title:'Táblázat tulajdonságai',menu:'Táblázat tulajdonságai',deleteTable:'Táblázat törlése',rows:'Sorok',columns:'Oszlopok',border:'Szegélyméret',widthPx:'képpont',widthPc:'százalék',widthUnit:'Szélesség egység',cellSpace:'Cella térköz',cellPad:'Cella belső margó',caption:'Felirat',summary:'Leírás',headers:'Fejlécek',headersNone:'Nincsenek',headersColumn:'Első oszlop',headersRow:'Első sor',headersBoth:'Mindkettő',invalidRows:'A sorok számának nagyobbnak kell lenni mint 0.',invalidCols:'Az oszlopok számának nagyobbnak kell lenni mint 0.',invalidBorder:'A szegélyméret mezőbe csak számokat írhat.',invalidWidth:'A szélesség mezőbe csak számokat írhat.',invalidHeight:'A magasság mezőbe csak számokat írhat.',invalidCellSpacing:'A cella térköz mezőbe csak számokat írhat.',invalidCellPadding:'A cella belső margó mezőbe csak számokat írhat.',cell:{menu:'Cella',insertBefore:'Beszúrás balra',insertAfter:'Beszúrás jobbra',deleteCell:'Cellák törlése',merge:'Cellák egyesítése',mergeRight:'Cellák egyesítése jobbra',mergeDown:'Cellák egyesítése lefelé',splitHorizontal:'Cellák szétválasztása vízszintesen',splitVertical:'Cellák szétválasztása függőlegesen',title:'Cella tulajdonságai',cellType:'Cella típusa',rowSpan:'Függőleges egyesítés',colSpan:'Vízszintes egyesítés',wordWrap:'Hosszú sorok törése',hAlign:'Vízszintes igazítás',vAlign:'Függőleges igazítás',alignBaseline:'Alapvonalra',bgColor:'Háttér színe',borderColor:'Keret színe',data:'Adat',header:'Fejléc',yes:'Igen',no:'Nem',invalidWidth:'A szélesség mezőbe csak számokat írhat.',invalidHeight:'A magasság mezőbe csak számokat írhat.',invalidRowSpan:'A függőleges egyesítés mezőbe csak számokat írhat.',invalidColSpan:'A vízszintes egyesítés mezőbe csak számokat írhat.',chooseColor:'Válasszon'},row:{menu:'Sor',insertBefore:'Beszúrás fölé',insertAfter:'Beszúrás alá',deleteRow:'Sorok törlése'},column:{menu:'Oszlop',insertBefore:'Beszúrás balra',insertAfter:'Beszúrás jobbra',deleteColumn:'Oszlopok törlése'}},button:{title:'Gomb tulajdonságai',text:'Szöveg (Érték)',type:'Típus',typeBtn:'Gomb',typeSbm:'Küldés',typeRst:'Alaphelyzet'},checkboxAndRadio:{checkboxTitle:'Jelölőnégyzet tulajdonságai',radioTitle:'Választógomb tulajdonságai',value:'Érték',selected:'Kiválasztott'},form:{title:'Űrlap tulajdonságai',menu:'Űrlap tulajdonságai',action:'Adatfeldolgozást végző hivatkozás',method:'Adatküldés módja',encoding:'Kódolás'},select:{title:'Legördülő lista tulajdonságai',selectInfo:'Alaptulajdonságok',opAvail:'Elérhető opciók',value:'Érték',size:'Méret',lines:'sor',chkMulti:'több sor is kiválasztható',opText:'Szöveg',opValue:'Érték',btnAdd:'Hozzáad',btnModify:'Módosít',btnUp:'Fel',btnDown:'Le',btnSetValue:'Legyen az alapértelmezett érték',btnDelete:'Töröl'},textarea:{title:'Szövegterület tulajdonságai',cols:'Karakterek száma egy sorban',rows:'Sorok száma'},textfield:{title:'Szövegmező tulajdonságai',name:'Név',value:'Érték',charWidth:'Megjelenített karakterek száma',maxChars:'Maximális karakterszám',type:'Típus',typeText:'Szöveg',typePass:'Jelszó'},hidden:{title:'Rejtett mező tulajdonságai',name:'Név',value:'Érték'},image:{title:'Kép tulajdonságai',titleButton:'Képgomb tulajdonságai',menu:'Kép tulajdonságai',infoTab:'Alaptulajdonságok',btnUpload:'Küldés a szerverre',upload:'Feltöltés',alt:'Buborék szöveg',lockRatio:'Arány megtartása',resetSize:'Eredeti méret',border:'Keret',hSpace:'Vízsz. táv',vSpace:'Függ. táv',alertUrl:'Töltse ki a kép webcímét',linkTab:'Hivatkozás',button2Img:'A kiválasztott képgombból sima képet szeretne csinálni?',img2Button:'A kiválasztott képből képgombot szeretne csinálni?',urlMissing:'Hiányzik a kép URL-je',validateBorder:'A keret méretének egész számot kell beírni!',validateHSpace:'Vízszintes távolságnak egész számot kell beírni!',validateVSpace:'Függőleges távolságnak egész számot kell beírni!'},flash:{properties:'Flash tulajdonságai',propertiesTab:'Tulajdonságok',title:'Flash tulajdonságai',chkPlay:'Automata lejátszás',chkLoop:'Folyamatosan',chkMenu:'Flash menü engedélyezése',chkFull:'Teljes képernyő engedélyezése',scale:'Méretezés',scaleAll:'Mindent mutat',scaleNoBorder:'Keret nélkül',scaleFit:'Teljes kitöltés',access:'Szkript hozzáférés',accessAlways:'Mindig',accessSameDomain:'Azonos domainről',accessNever:'Soha',alignAbsBottom:'Legaljára',alignAbsMiddle:'Közepére',alignBaseline:'Alapvonalhoz',alignTextTop:'Szöveg tetejére',quality:'Minőség',qualityBest:'Legjobb',qualityHigh:'Jó',qualityAutoHigh:'Automata jó',qualityMedium:'Közepes',qualityAutoLow:'Automata gyenge',qualityLow:'Gyenge',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Ablak mód',flashvars:'Flash változók',bgcolor:'Háttérszín',hSpace:'Vízsz. táv',vSpace:'Függ. táv',validateSrc:'Adja meg a hivatkozás webcímét',validateHSpace:'A vízszintes távolsűág mezőbe csak számokat írhat.',validateVSpace:'A függőleges távolsűág mezőbe csak számokat írhat.'},spellCheck:{toolbar:'Helyesírás-ellenőrzés',title:'Helyesírás ellenörző',notAvailable:'Sajnálom, de a szolgáltatás jelenleg nem elérhető.',errorLoading:'Hiba a szolgáltatás host betöltése közben: %s.',notInDic:'Nincs a szótárban',changeTo:'Módosítás',btnIgnore:'Kihagyja',btnIgnoreAll:'Mindet kihagyja',btnReplace:'Csere',btnReplaceAll:'Összes cseréje',btnUndo:'Visszavonás',noSuggestions:'Nincs javaslat',progress:'Helyesírás-ellenőrzés folyamatban...',noMispell:'Helyesírás-ellenőrzés kész: Nem találtam hibát',noChanges:'Helyesírás-ellenőrzés kész: Nincs változtatott szó',oneChange:'Helyesírás-ellenőrzés kész: Egy szó cserélve',manyChanges:'Helyesírás-ellenőrzés kész: %1 szó cserélve',ieSpellDownload:'A helyesírás-ellenőrző nincs telepítve. Szeretné letölteni most?'},smiley:{toolbar:'Hangulatjelek',title:'Hangulatjel beszúrása',options:'Hangulatjel opciók'},elementsPath:{eleLabel:'Elem utak',eleTitle:'%1 elem'},numberedlist:'Számozás',bulletedlist:'Felsorolás',indent:'Behúzás növelése',outdent:'Behúzás csökkentése',justify:{left:'Balra',center:'Középre',right:'Jobbra',block:'Sorkizárt'},blockquote:'Idézet blokk',clipboard:{title:'Beillesztés',cutError:'A böngésző biztonsági beállításai nem engedélyezik a szerkesztőnek, hogy végrehajtsa a kivágás műveletet. Használja az alábbi billentyűkombinációt (Ctrl/Cmd+X).',copyError:'A böngésző biztonsági beállításai nem engedélyezik a szerkesztőnek, hogy végrehajtsa a másolás műveletet. Használja az alábbi billentyűkombinációt (Ctrl/Cmd+X).',pasteMsg:'Másolja be az alábbi mezőbe a <STRONG>Ctrl/Cmd+V</STRONG> billentyűk lenyomásával, majd nyomjon <STRONG>Rendben</STRONG>-t.',securityMsg:'A böngésző biztonsági beállításai miatt a szerkesztő nem képes hozzáférni a vágólap adataihoz. Illeszd be újra ebben az ablakban.',pasteArea:'Beszúrás mező'},pastefromword:{confirmCleanup:'Úgy tűnik a beillesztett szöveget Word-ből másolt át. Meg szeretné tisztítani a szöveget? (ajánlott)',toolbar:'Beillesztés Word-ből',title:'Beillesztés Word-ből',error:'Egy belső hiba miatt nem sikerült megtisztítani a szöveget'},pasteText:{button:'Beillesztés formázatlan szövegként',title:'Beillesztés formázatlan szövegként'},templates:{button:'Sablonok',title:'Elérhető sablonok',options:'Sablon opciók',insertOption:'Kicseréli a jelenlegi tartalmat',selectPromptMsg:'Válassza ki melyik sablon nyíljon meg a szerkesztőben<br>(a jelenlegi tartalom elveszik):',emptyListMsg:'(Nincs sablon megadva)'},showBlocks:'Blokkok megjelenítése',stylesCombo:{label:'Stílus',panelTitle:'Formázási stílusok',panelTitle1:'Blokk stílusok',panelTitle2:'Inline stílusok',panelTitle3:'Objektum stílusok'},format:{label:'Formátum',panelTitle:'Formátum',tag_p:'Normál',tag_pre:'Formázott',tag_address:'Címsor',tag_h1:'Fejléc 1',tag_h2:'Fejléc 2',tag_h3:'Fejléc 3',tag_h4:'Fejléc 4',tag_h5:'Fejléc 5',tag_h6:'Fejléc 6',tag_div:'Bekezdés (DIV)'},div:{title:'DIV tároló létrehozása',toolbar:'DIV tároló létrehozása',cssClassInputLabel:'Stíluslap osztály',styleSelectLabel:'Stílus',IdInputLabel:'Azonosító',languageCodeInputLabel:' Nyelv kódja',inlineStyleInputLabel:'Inline stílus',advisoryTitleInputLabel:'Tipp szöveg',langDirLabel:'Nyelvi irány',langDirLTRLabel:'Balról jobbra (LTR)',langDirRTLLabel:'Jobbról balra (RTL)',edit:'DIV szerkesztése',remove:'DIV eltávolítása'},iframe:{title:'IFrame Tulajdonságok',toolbar:'IFrame',noUrl:'Kérem írja be a iframe URL-t',scrolling:'Gördítősáv bekapcsolása',border:'Legyen keret'},font:{label:'Betűtípus',voiceLabel:'Betűtípus',panelTitle:'Betűtípus'},fontSize:{label:'Méret',voiceLabel:'Betűméret',panelTitle:'Méret'},colorButton:{textColorTitle:'Betűszín',bgColorTitle:'Háttérszín',panelTitle:'Színek',auto:'Automatikus',more:'További színek...'},colors:{'000':'Fekete',800000:'Bordó','8B4513':'Barna','2F4F4F':'Sötét türkiz','008080':'Türkiz','000080':'Király kék','4B0082':'Indigó kék',696969:'Szürke',B22222:'Tégla vörös',A52A2A:'Vörös',DAA520:'Arany sárga','006400':'Sötét zöld','40E0D0':'Türkiz','0000CD':'Kék',800080:'Lila',808080:'Szürke',F00:'Piros',FF8C00:'Sötét narancs',FFD700:'Arany','008000':'Zöld','0FF':'Türkiz','00F':'Kék',EE82EE:'Rózsaszín',A9A9A9:'Sötét szürke',FFA07A:'Lazac',FFA500:'Narancs',FFFF00:'Citromsárga','00FF00':'Neon zöld',AFEEEE:'Világos türkiz',ADD8E6:'Világos kék',DDA0DD:'Világos lila',D3D3D3:'Világos szürke',FFF0F5:'Lavender Blush',FAEBD7:'Törtfehér',FFFFE0:'Világos sárga',F0FFF0:'Menta',F0FFFF:'Azúr kék',F0F8FF:'Halvány kék',E6E6FA:'Lavender',FFF:'Fehér'},scayt:{title:'Helyesírás ellenőrzés gépelés közben',opera_title:'Az Opera nem támogatja',enable:'SCAYT engedélyezése',disable:'SCAYT letiltása',about:'SCAYT névjegy',toggle:'SCAYT kapcsolása',options:'Beállítások',langs:'Nyelvek',moreSuggestions:'További javaslatok',ignore:'Kihagy',ignoreAll:'Összes kihagyása',addWord:'Szó hozzáadása',emptyDic:'A szótár nevét meg kell adni.',optionsTab:'Beállítások',allCaps:'Nagybetűs szavak kihagyása',ignoreDomainNames:'Domain nevek kihagyása',mixedCase:'Kis és nagybetűt is tartalmazó szavak kihagyása',mixedWithDigits:'Számokat tartalmazó szavak kihagyása',languagesTab:'Nyelvek',dictionariesTab:'Szótár',dic_field_name:'Szótár neve',dic_create:'Létrehozás',dic_restore:'Visszaállítás',dic_delete:'Törlés',dic_rename:'Átnevezés',dic_info:'Kezdetben a felhasználói szótár böngésző sütiben tárolódik. Azonban a sütik maximális mérete korlátozott. Amikora a szótár akkora lesz, hogy már sütiben nem lehet tárolni, akkor a szótárat tárolhatja a szerveren is. Ehhez egy nevet kell megadni a szótárhoz. Amennyiben már van szerveren tárolt szótára, adja meg a nevét és kattintson a visszaállítás gombra.',aboutTab:'Névjegy'},about:{title:'CKEditor névjegy',dlgTitle:'CKEditor névjegy',help:'Itt találsz segítséget: $1',userGuide:'CKEditor Felhasználói útmutató',moreInfo:'Licenszelési információkért kérjük látogassa meg weboldalunkat:',copy:'Copyright © $1. Minden jog fenntartva.'},maximize:'Teljes méret',minimize:'Kis méret',fakeobjects:{anchor:'Horgony',flash:'Flash animáció',iframe:'IFrame',hiddenfield:'Rejtett mezõ',unknown:'Ismeretlen objektum'},resize:'Húzza az átméretezéshez',colordialog:{title:'Válasszon színt',options:'Szín opciók',highlight:'Nagyítás',selected:'Kiválasztott',clear:'Ürítés'},toolbarCollapse:'Eszköztár összecsukása',toolbarExpand:'Eszköztár szétnyitása',toolbarGroups:{document:'Dokumentum',clipboard:'Vágólap/Visszavonás',editing:'Szerkesztés',forms:'Űrlapok',basicstyles:'Alapstílusok',paragraph:'Bekezdés',links:'Hivatkozások',insert:'Beszúrás',styles:'Stílusok',colors:'Színek',tools:'Eszközök'},bidi:{ltr:'Szöveg iránya balról jobbra',rtl:'Szöveg iránya jobbról balra'},docprops:{label:'Dokumentum tulajdonságai',title:'Dokumentum tulajdonságai',design:'Design',meta:'Meta adatok',chooseColor:'Válasszon',other:'<más>',docTitle:'Oldalcím',charset:'Karakterkódolás',charsetOther:'Más karakterkódolás',charsetASCII:'ASCII',charsetCE:'Közép-Európai',charsetCT:'Kínai Tradicionális (Big5)',charsetCR:'Cyrill',charsetGR:'Görög',charsetJP:'Japán',charsetKR:'Koreai',charsetTR:'Török',charsetUN:'Unicode (UTF-8)',charsetWE:'Nyugat-Európai',docType:'Dokumentum típus fejléc',docTypeOther:'Más dokumentum típus fejléc',xhtmlDec:'XHTML deklarációk beillesztése',bgColor:'Háttérszín',bgImage:'Háttérkép cím',bgFixed:'Nem gördíthető háttér',txtColor:'Betűszín',margin:'Oldal margók',marginTop:'Felső',marginLeft:'Bal',marginRight:'Jobb',marginBottom:'Alsó',metaKeywords:'Dokumentum keresőszavak (vesszővel elválasztva)',metaDescription:'Dokumentum leírás',metaAuthor:'Szerző',metaCopyright:'Szerzői jog',previewHtml:'<p>Ez itt egy <strong>példa</strong>. A <a href="javascript:void(0)">CKEditor</a>-t használod.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.hu={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Szerkesztő Eszköztár',editor:'HTML szerkesztő',source:'Forráskód',newPage:'Új oldal',save:'Mentés',preview:'Előnézet',cut:'Kivágás',copy:'Másolás',paste:'Beillesztés',print:'Nyomtatás',underline:'Aláhúzott',bold:'Félkövér',italic:'Dőlt',selectAll:'Mindent kijelöl',removeFormat:'Formázás eltávolítása',strike:'Áthúzott',subscript:'Alsó index',superscript:'Felső index',horizontalrule:'Elválasztóvonal beillesztése',pagebreak:'Oldaltörés beillesztése',pagebreakAlt:'Oldaltörés',unlink:'Hivatkozás törlése',undo:'Visszavonás',redo:'Ismétlés',common:{browseServer:'Böngészés a szerveren',url:'Hivatkozás',protocol:'Protokoll',upload:'Feltöltés',uploadSubmit:'Küldés a szerverre',image:'Kép',flash:'Flash',form:'Űrlap',checkbox:'Jelölőnégyzet',radio:'Választógomb',textField:'Szövegmező',textarea:'Szövegterület',hiddenField:'Rejtettmező',button:'Gomb',select:'Legördülő lista',imageButton:'Képgomb',notSet:'<nincs beállítva>',id:'Azonosító',name:'Név',langDir:'Írás iránya',langDirLtr:'Balról jobbra',langDirRtl:'Jobbról balra',langCode:'Nyelv kódja',longDescr:'Részletes leírás webcíme',cssClass:'Stíluskészlet',advisoryTitle:'Súgócimke',cssStyle:'Stílus',ok:'Rendben',cancel:'Mégsem',close:'Bezárás',preview:'Előnézet',generalTab:'Általános',advancedTab:'További opciók',validateNumberFailed:'A mezőbe csak számokat írhat.',confirmNewPage:'Minden nem mentett változás el fog veszni! Biztosan be szeretné tölteni az oldalt?',confirmCancel:'Az űrlap tartalma megváltozott, ám a változásokat nem rögzítette. Biztosan be szeretné zárni az űrlapot?',options:'Beállítások',target:'Cél',targetNew:'Új ablak (_blank)',targetTop:'Legfelső ablak (_top)',targetSelf:'Aktuális ablakban (_self)',targetParent:'Szülő ablak (_parent)',langDirLTR:'Balról jobbra (LTR)',langDirRTL:'Jobbról balra (RTL)',styles:'Stílus',cssClasses:'Stíluslap osztály',width:'Szélesség',height:'Magasság',align:'Igazítás',alignLeft:'Bal',alignRight:'Jobbra',alignCenter:'Középre',alignTop:'Tetejére',alignMiddle:'Középre',alignBottom:'Aljára',invalidHeight:'A magasság mezőbe csak számokat írhat.',invalidWidth:'A szélesség mezőbe csak számokat írhat.',invalidCssLength:'"%1"-hez megadott érték csakis egy pozitív szám lehet, esetleg egy érvényes CSS egységgel megjelölve(px, %, in, cm, mm, em, ex, pt vagy pc).',invalidHtmlLength:'"%1"-hez megadott érték csakis egy pozitív szám lehet, esetleg egy érvényes HTML egységgel megjelölve(px vagy %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, nem elérhető</span>'},contextmenu:{options:'Helyi menü opciók'},specialChar:{toolbar:'Speciális karakter beillesztése',title:'Speciális karakter választása',options:'Speciális karakter opciók'},link:{toolbar:'Hivatkozás beillesztése/módosítása',other:'<más>',menu:'Hivatkozás módosítása',title:'Hivatkozás tulajdonságai',info:'Alaptulajdonságok',target:'Tartalom megjelenítése',upload:'Feltöltés',advanced:'További opciók',type:'Hivatkozás típusa',toUrl:'URL',toAnchor:'Horgony az oldalon',toEmail:'E-Mail',targetFrame:'<keretben>',targetPopup:'<felugró ablakban>',targetFrameName:'Keret neve',targetPopupName:'Felugró ablak neve',popupFeatures:'Felugró ablak jellemzői',popupResizable:'Átméretezés',popupStatusBar:'Állapotsor',popupLocationBar:'Címsor',popupToolbar:'Eszköztár',popupMenuBar:'Menü sor',popupFullScreen:'Teljes képernyő (csak IE)',popupScrollBars:'Gördítősáv',popupDependent:'Szülőhöz kapcsolt (csak Netscape)',popupLeft:'Bal pozíció',popupTop:'Felső pozíció',id:'Id',langDir:'Írás iránya',langDirLTR:'Balról jobbra',langDirRTL:'Jobbról balra',acccessKey:'Billentyűkombináció',name:'Név',langCode:'Írás iránya',tabIndex:'Tabulátor index',advisoryTitle:'Súgócimke',advisoryContentType:'Súgó tartalomtípusa',cssClasses:'Stíluskészlet',charset:'Hivatkozott tartalom kódlapja',styles:'Stílus',rel:'Kapcsolat típusa',selectAnchor:'Horgony választása',anchorName:'Horgony név szerint',anchorId:'Azonosító szerint',emailAddress:'E-Mail cím',emailSubject:'Üzenet tárgya',emailBody:'Üzenet',noAnchors:'(Nincs horgony a dokumentumban)',noUrl:'Adja meg a hivatkozás webcímét',noEmail:'Adja meg az E-Mail címet'},anchor:{toolbar:'Horgony beillesztése/szerkesztése',menu:'Horgony tulajdonságai',title:'Horgony tulajdonságai',name:'Horgony neve',errorName:'Kérem adja meg a horgony nevét',remove:'Horgony eltávolítása'},list:{numberedTitle:'Sorszámozott lista tulajdonságai',bulletedTitle:'Pontozott lista tulajdonságai',type:'Típus',start:'Kezdőszám',validateStartNumber:'A kezdőszám nem lehet tört érték.',circle:'Kör',disc:'Korong',square:'Négyzet',none:'Nincs',notset:'<Nincs beállítva>',armenian:'Örmény számozás',georgian:'Grúz számozás (an, ban, gan, stb.)',lowerRoman:'Római kisbetűs (i, ii, iii, iv, v, stb.)',upperRoman:'Római nagybetűs (I, II, III, IV, V, stb.)',lowerAlpha:'Kisbetűs (a, b, c, d, e, stb.)',upperAlpha:'Nagybetűs (A, B, C, D, E, stb.)',lowerGreek:'Görög (alpha, beta, gamma, stb.)',decimal:'Arab számozás (1, 2, 3, stb.)',decimalLeadingZero:'Számozás bevezető nullákkal (01, 02, 03, stb.)'},findAndReplace:{title:'Keresés és csere',find:'Keresés',replace:'Csere',findWhat:'Keresett szöveg:',replaceWith:'Csere erre:',notFoundMsg:'A keresett szöveg nem található.',findOptions:'Find Options',matchCase:'kis- és nagybetű megkülönböztetése',matchWord:'csak ha ez a teljes szó',matchCyclic:'Ciklikus keresés',replaceAll:'Az összes cseréje',replaceSuccessMsg:'%1 egyezőség cserélve.'},table:{toolbar:'Táblázat',title:'Táblázat tulajdonságai',menu:'Táblázat tulajdonságai',deleteTable:'Táblázat törlése',rows:'Sorok',columns:'Oszlopok',border:'Szegélyméret',widthPx:'képpont',widthPc:'százalék',widthUnit:'Szélesség egység',cellSpace:'Cella térköz',cellPad:'Cella belső margó',caption:'Felirat',summary:'Leírás',headers:'Fejlécek',headersNone:'Nincsenek',headersColumn:'Első oszlop',headersRow:'Első sor',headersBoth:'Mindkettő',invalidRows:'A sorok számának nagyobbnak kell lenni mint 0.',invalidCols:'Az oszlopok számának nagyobbnak kell lenni mint 0.',invalidBorder:'A szegélyméret mezőbe csak számokat írhat.',invalidWidth:'A szélesség mezőbe csak számokat írhat.',invalidHeight:'A magasság mezőbe csak számokat írhat.',invalidCellSpacing:'A cella térköz mezőbe csak számokat írhat.',invalidCellPadding:'A cella belső margó mezőbe csak számokat írhat.',cell:{menu:'Cella',insertBefore:'Beszúrás balra',insertAfter:'Beszúrás jobbra',deleteCell:'Cellák törlése',merge:'Cellák egyesítése',mergeRight:'Cellák egyesítése jobbra',mergeDown:'Cellák egyesítése lefelé',splitHorizontal:'Cellák szétválasztása vízszintesen',splitVertical:'Cellák szétválasztása függőlegesen',title:'Cella tulajdonságai',cellType:'Cella típusa',rowSpan:'Függőleges egyesítés',colSpan:'Vízszintes egyesítés',wordWrap:'Hosszú sorok törése',hAlign:'Vízszintes igazítás',vAlign:'Függőleges igazítás',alignBaseline:'Alapvonalra',bgColor:'Háttér színe',borderColor:'Keret színe',data:'Adat',header:'Fejléc',yes:'Igen',no:'Nem',invalidWidth:'A szélesség mezőbe csak számokat írhat.',invalidHeight:'A magasság mezőbe csak számokat írhat.',invalidRowSpan:'A függőleges egyesítés mezőbe csak számokat írhat.',invalidColSpan:'A vízszintes egyesítés mezőbe csak számokat írhat.',chooseColor:'Válasszon'},row:{menu:'Sor',insertBefore:'Beszúrás fölé',insertAfter:'Beszúrás alá',deleteRow:'Sorok törlése'},column:{menu:'Oszlop',insertBefore:'Beszúrás balra',insertAfter:'Beszúrás jobbra',deleteColumn:'Oszlopok törlése'}},button:{title:'Gomb tulajdonságai',text:'Szöveg (Érték)',type:'Típus',typeBtn:'Gomb',typeSbm:'Küldés',typeRst:'Alaphelyzet'},checkboxAndRadio:{checkboxTitle:'Jelölőnégyzet tulajdonságai',radioTitle:'Választógomb tulajdonságai',value:'Érték',selected:'Kiválasztott'},form:{title:'Űrlap tulajdonságai',menu:'Űrlap tulajdonságai',action:'Adatfeldolgozást végző hivatkozás',method:'Adatküldés módja',encoding:'Kódolás'},select:{title:'Legördülő lista tulajdonságai',selectInfo:'Alaptulajdonságok',opAvail:'Elérhető opciók',value:'Érték',size:'Méret',lines:'sor',chkMulti:'több sor is kiválasztható',opText:'Szöveg',opValue:'Érték',btnAdd:'Hozzáad',btnModify:'Módosít',btnUp:'Fel',btnDown:'Le',btnSetValue:'Legyen az alapértelmezett érték',btnDelete:'Töröl'},textarea:{title:'Szövegterület tulajdonságai',cols:'Karakterek száma egy sorban',rows:'Sorok száma'},textfield:{title:'Szövegmező tulajdonságai',name:'Név',value:'Érték',charWidth:'Megjelenített karakterek száma',maxChars:'Maximális karakterszám',type:'Típus',typeText:'Szöveg',typePass:'Jelszó'},hidden:{title:'Rejtett mező tulajdonságai',name:'Név',value:'Érték'},image:{title:'Kép tulajdonságai',titleButton:'Képgomb tulajdonságai',menu:'Kép tulajdonságai',infoTab:'Alaptulajdonságok',btnUpload:'Küldés a szerverre',upload:'Feltöltés',alt:'Buborék szöveg',lockRatio:'Arány megtartása',resetSize:'Eredeti méret',border:'Keret',hSpace:'Vízsz. táv',vSpace:'Függ. táv',alertUrl:'Töltse ki a kép webcímét',linkTab:'Hivatkozás',button2Img:'A kiválasztott képgombból sima képet szeretne csinálni?',img2Button:'A kiválasztott képből képgombot szeretne csinálni?',urlMissing:'Hiányzik a kép URL-je',validateBorder:'A keret méretének egész számot kell beírni!',validateHSpace:'Vízszintes távolságnak egész számot kell beírni!',validateVSpace:'Függőleges távolságnak egész számot kell beírni!'},flash:{properties:'Flash tulajdonságai',propertiesTab:'Tulajdonságok',title:'Flash tulajdonságai',chkPlay:'Automata lejátszás',chkLoop:'Folyamatosan',chkMenu:'Flash menü engedélyezése',chkFull:'Teljes képernyő engedélyezése',scale:'Méretezés',scaleAll:'Mindent mutat',scaleNoBorder:'Keret nélkül',scaleFit:'Teljes kitöltés',access:'Szkript hozzáférés',accessAlways:'Mindig',accessSameDomain:'Azonos domainről',accessNever:'Soha',alignAbsBottom:'Legaljára',alignAbsMiddle:'Közepére',alignBaseline:'Alapvonalhoz',alignTextTop:'Szöveg tetejére',quality:'Minőség',qualityBest:'Legjobb',qualityHigh:'Jó',qualityAutoHigh:'Automata jó',qualityMedium:'Közepes',qualityAutoLow:'Automata gyenge',qualityLow:'Gyenge',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Ablak mód',flashvars:'Flash változók',bgcolor:'Háttérszín',hSpace:'Vízsz. táv',vSpace:'Függ. táv',validateSrc:'Adja meg a hivatkozás webcímét',validateHSpace:'A vízszintes távolsűág mezőbe csak számokat írhat.',validateVSpace:'A függőleges távolsűág mezőbe csak számokat írhat.'},spellCheck:{toolbar:'Helyesírás-ellenőrzés',title:'Helyesírás ellenörző',notAvailable:'Sajnálom, de a szolgáltatás jelenleg nem elérhető.',errorLoading:'Hiba a szolgáltatás host betöltése közben: %s.',notInDic:'Nincs a szótárban',changeTo:'Módosítás',btnIgnore:'Kihagyja',btnIgnoreAll:'Mindet kihagyja',btnReplace:'Csere',btnReplaceAll:'Összes cseréje',btnUndo:'Visszavonás',noSuggestions:'Nincs javaslat',progress:'Helyesírás-ellenőrzés folyamatban...',noMispell:'Helyesírás-ellenőrzés kész: Nem találtam hibát',noChanges:'Helyesírás-ellenőrzés kész: Nincs változtatott szó',oneChange:'Helyesírás-ellenőrzés kész: Egy szó cserélve',manyChanges:'Helyesírás-ellenőrzés kész: %1 szó cserélve',ieSpellDownload:'A helyesírás-ellenőrző nincs telepítve. Szeretné letölteni most?'},smiley:{toolbar:'Hangulatjelek',title:'Hangulatjel beszúrása',options:'Hangulatjel opciók'},elementsPath:{eleLabel:'Elem utak',eleTitle:'%1 elem'},numberedlist:'Számozás',bulletedlist:'Felsorolás',indent:'Behúzás növelése',outdent:'Behúzás csökkentése',justify:{left:'Balra',center:'Középre',right:'Jobbra',block:'Sorkizárt'},blockquote:'Idézet blokk',clipboard:{title:'Beillesztés',cutError:'A böngésző biztonsági beállításai nem engedélyezik a szerkesztőnek, hogy végrehajtsa a kivágás műveletet. Használja az alábbi billentyűkombinációt (Ctrl/Cmd+X).',copyError:'A böngésző biztonsági beállításai nem engedélyezik a szerkesztőnek, hogy végrehajtsa a másolás műveletet. Használja az alábbi billentyűkombinációt (Ctrl/Cmd+X).',pasteMsg:'Másolja be az alábbi mezőbe a <STRONG>Ctrl/Cmd+V</STRONG> billentyűk lenyomásával, majd nyomjon <STRONG>Rendben</STRONG>-t.',securityMsg:'A böngésző biztonsági beállításai miatt a szerkesztő nem képes hozzáférni a vágólap adataihoz. Illeszd be újra ebben az ablakban.',pasteArea:'Beszúrás mező'},pastefromword:{confirmCleanup:'Úgy tűnik a beillesztett szöveget Word-ből másolt át. Meg szeretné tisztítani a szöveget? (ajánlott)',toolbar:'Beillesztés Word-ből',title:'Beillesztés Word-ből',error:'Egy belső hiba miatt nem sikerült megtisztítani a szöveget'},pasteText:{button:'Beillesztés formázatlan szövegként',title:'Beillesztés formázatlan szövegként'},templates:{button:'Sablonok',title:'Elérhető sablonok',options:'Sablon opciók',insertOption:'Kicseréli a jelenlegi tartalmat',selectPromptMsg:'Válassza ki melyik sablon nyíljon meg a szerkesztőben<br>(a jelenlegi tartalom elveszik):',emptyListMsg:'(Nincs sablon megadva)'},showBlocks:'Blokkok megjelenítése',stylesCombo:{label:'Stílus',panelTitle:'Formázási stílusok',panelTitle1:'Blokk stílusok',panelTitle2:'Inline stílusok',panelTitle3:'Objektum stílusok'},format:{label:'Formátum',panelTitle:'Formátum',tag_p:'Normál',tag_pre:'Formázott',tag_address:'Címsor',tag_h1:'Fejléc 1',tag_h2:'Fejléc 2',tag_h3:'Fejléc 3',tag_h4:'Fejléc 4',tag_h5:'Fejléc 5',tag_h6:'Fejléc 6',tag_div:'Bekezdés (DIV)'},div:{title:'DIV tároló létrehozása',toolbar:'DIV tároló létrehozása',cssClassInputLabel:'Stíluslap osztály',styleSelectLabel:'Stílus',IdInputLabel:'Azonosító',languageCodeInputLabel:' Nyelv kódja',inlineStyleInputLabel:'Inline stílus',advisoryTitleInputLabel:'Tipp szöveg',langDirLabel:'Nyelvi irány',langDirLTRLabel:'Balról jobbra (LTR)',langDirRTLLabel:'Jobbról balra (RTL)',edit:'DIV szerkesztése',remove:'DIV eltávolítása'},iframe:{title:'IFrame Tulajdonságok',toolbar:'IFrame',noUrl:'Kérem írja be a iframe URL-t',scrolling:'Gördítősáv bekapcsolása',border:'Legyen keret'},font:{label:'Betűtípus',voiceLabel:'Betűtípus',panelTitle:'Betűtípus'},fontSize:{label:'Méret',voiceLabel:'Betűméret',panelTitle:'Méret'},colorButton:{textColorTitle:'Betűszín',bgColorTitle:'Háttérszín',panelTitle:'Színek',auto:'Automatikus',more:'További színek...'},colors:{'000':'Fekete',800000:'Bordó','8B4513':'Barna','2F4F4F':'Sötét türkiz','008080':'Türkiz','000080':'Király kék','4B0082':'Indigó kék',696969:'Szürke',B22222:'Tégla vörös',A52A2A:'Vörös',DAA520:'Arany sárga','006400':'Sötét zöld','40E0D0':'Türkiz','0000CD':'Kék',800080:'Lila',808080:'Szürke',F00:'Piros',FF8C00:'Sötét narancs',FFD700:'Arany','008000':'Zöld','0FF':'Türkiz','00F':'Kék',EE82EE:'Rózsaszín',A9A9A9:'Sötét szürke',FFA07A:'Lazac',FFA500:'Narancs',FFFF00:'Citromsárga','00FF00':'Neon zöld',AFEEEE:'Világos türkiz',ADD8E6:'Világos kék',DDA0DD:'Világos lila',D3D3D3:'Világos szürke',FFF0F5:'Lavender Blush',FAEBD7:'Törtfehér',FFFFE0:'Világos sárga',F0FFF0:'Menta',F0FFFF:'Azúr kék',F0F8FF:'Halvány kék',E6E6FA:'Lavender',FFF:'Fehér'},scayt:{title:'Helyesírás ellenőrzés gépelés közben',opera_title:'Az Opera nem támogatja',enable:'SCAYT engedélyezése',disable:'SCAYT letiltása',about:'SCAYT névjegy',toggle:'SCAYT kapcsolása',options:'Beállítások',langs:'Nyelvek',moreSuggestions:'További javaslatok',ignore:'Kihagy',ignoreAll:'Összes kihagyása',addWord:'Szó hozzáadása',emptyDic:'A szótár nevét meg kell adni.',optionsTab:'Beállítások',allCaps:'Nagybetűs szavak kihagyása',ignoreDomainNames:'Domain nevek kihagyása',mixedCase:'Kis és nagybetűt is tartalmazó szavak kihagyása',mixedWithDigits:'Számokat tartalmazó szavak kihagyása',languagesTab:'Nyelvek',dictionariesTab:'Szótár',dic_field_name:'Szótár neve',dic_create:'Létrehozás',dic_restore:'Visszaállítás',dic_delete:'Törlés',dic_rename:'Átnevezés',dic_info:'Kezdetben a felhasználói szótár böngésző sütiben tárolódik. Azonban a sütik maximális mérete korlátozott. Amikora a szótár akkora lesz, hogy már sütiben nem lehet tárolni, akkor a szótárat tárolhatja a szerveren is. Ehhez egy nevet kell megadni a szótárhoz. Amennyiben már van szerveren tárolt szótára, adja meg a nevét és kattintson a visszaállítás gombra.',aboutTab:'Névjegy'},about:{title:'CKEditor névjegy',dlgTitle:'CKEditor névjegy',help:'Itt találsz segítséget: $1',userGuide:'CKEditor Felhasználói útmutató',moreInfo:'Licenszelési információkért kérjük látogassa meg weboldalunkat:',copy:'Copyright © $1. Minden jog fenntartva.'},maximize:'Teljes méret',minimize:'Kis méret',fakeobjects:{anchor:'Horgony',flash:'Flash animáció',iframe:'IFrame',hiddenfield:'Rejtett mezõ',unknown:'Ismeretlen objektum'},resize:'Húzza az átméretezéshez',colordialog:{title:'Válasszon színt',options:'Szín opciók',highlight:'Nagyítás',selected:'Kiválasztott',clear:'Ürítés'},toolbarCollapse:'Eszköztár összecsukása',toolbarExpand:'Eszköztár szétnyitása',toolbarGroups:{document:'Dokumentum',clipboard:'Vágólap/Visszavonás',editing:'Szerkesztés',forms:'Űrlapok',basicstyles:'Alapstílusok',paragraph:'Bekezdés',links:'Hivatkozások',insert:'Beszúrás',styles:'Stílusok',colors:'Színek',tools:'Eszközök'},bidi:{ltr:'Szöveg iránya balról jobbra',rtl:'Szöveg iránya jobbról balra'},docprops:{label:'Dokumentum tulajdonságai',title:'Dokumentum tulajdonságai',design:'Design',meta:'Meta adatok',chooseColor:'Válasszon',other:'<más>',docTitle:'Oldalcím',charset:'Karakterkódolás',charsetOther:'Más karakterkódolás',charsetASCII:'ASCII',charsetCE:'Közép-Európai',charsetCT:'Kínai Tradicionális (Big5)',charsetCR:'Cyrill',charsetGR:'Görög',charsetJP:'Japán',charsetKR:'Koreai',charsetTR:'Török',charsetUN:'Unicode (UTF-8)',charsetWE:'Nyugat-Európai',docType:'Dokumentum típus fejléc',docTypeOther:'Más dokumentum típus fejléc',xhtmlDec:'XHTML deklarációk beillesztése',bgColor:'Háttérszín',bgImage:'Háttérkép cím',bgFixed:'Nem gördíthető háttér',txtColor:'Betűszín',margin:'Oldal margók',marginTop:'Felső',marginLeft:'Bal',marginRight:'Jobb',marginBottom:'Alsó',metaKeywords:'Dokumentum keresőszavak (vesszővel elválasztva)',metaDescription:'Dokumentum leírás',metaAuthor:'Szerző',metaCopyright:'Szerzői jog',previewHtml:'<p>Ez itt egy <strong>példa</strong>. A <a href="javascript:void(0)">CKEditor</a>-t használod.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/id.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/id.js
index 7ac08a3..305fd1d 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/id.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/id.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.id={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Source',newPage:'New Page',save:'Save',preview:'Preview',cut:'Cut',copy:'Copy',paste:'Paste',print:'Print',underline:'Underline',bold:'Bold',italic:'Italic',selectAll:'Select All',removeFormat:'Remove Format',strike:'Strike Through',subscript:'Subscript',superscript:'Superscript',horizontalrule:'Insert Horizontal Line',pagebreak:'Insert Page Break for Printing',pagebreakAlt:'Page Break',unlink:'Unlink',undo:'Undo',redo:'Redo',common:{browseServer:'Browse Server',url:'URL',protocol:'Protocol',upload:'Upload',uploadSubmit:'Send it to the Server',image:'Image',flash:'Flash',form:'Form',checkbox:'Checkbox',radio:'Radio Button',textField:'Text Field',textarea:'Textarea',hiddenField:'Hidden Field',button:'Button',select:'Selection Field',imageButton:'Image Button',notSet:'<not set>',id:'Id',name:'Name',langDir:'Language Direction',langDirLtr:'Left to Right (LTR)',langDirRtl:'Right to Left (RTL)',langCode:'Language Code',longDescr:'Long Description URL',cssClass:'Stylesheet Classes',advisoryTitle:'Advisory Title',cssStyle:'Style',ok:'OK',cancel:'Cancel',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Advanced',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Width',height:'Height',align:'Alignment',alignLeft:'Left',alignRight:'Right',alignCenter:'Center',alignTop:'Top',alignMiddle:'Middle',alignBottom:'Bottom',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Insert Special Character',title:'Select Special Character',options:'Special Character Options'},link:{toolbar:'Link',other:'<other>',menu:'Edit Link',title:'Link',info:'Link Info',target:'Target',upload:'Upload',advanced:'Advanced',type:'Link Type',toUrl:'URL',toAnchor:'Link to anchor in the text',toEmail:'E-mail',targetFrame:'<frame>',targetPopup:'<popup window>',targetFrameName:'Target Frame Name',targetPopupName:'Popup Window Name',popupFeatures:'Popup Window Features',popupResizable:'Resizable',popupStatusBar:'Status Bar',popupLocationBar:'Location Bar',popupToolbar:'Toolbar',popupMenuBar:'Menu Bar',popupFullScreen:'Full Screen (IE)',popupScrollBars:'Scroll Bars',popupDependent:'Dependent (Netscape)',popupLeft:'Left Position',popupTop:'Top Position',id:'Id',langDir:'Language Direction',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',acccessKey:'Access Key',name:'Name',langCode:'Language Code',tabIndex:'Tab Index',advisoryTitle:'Advisory Title',advisoryContentType:'Advisory Content Type',cssClasses:'Stylesheet Classes',charset:'Linked Resource Charset',styles:'Style',rel:'Relationship',selectAnchor:'Select an Anchor',anchorName:'By Anchor Name',anchorId:'By Element Id',emailAddress:'E-Mail Address',emailSubject:'Message Subject',emailBody:'Message Body',noAnchors:'(No anchors available in the document)',noUrl:'Please type the link URL',noEmail:'Please type the e-mail address'},anchor:{toolbar:'Anchor',menu:'Edit Anchor',title:'Anchor Properties',name:'Anchor Name',errorName:'Please type the anchor name',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Find',replace:'Replace',findWhat:'Find what:',replaceWith:'Replace with:',notFoundMsg:'The specified text was not found.',findOptions:'Find Options',matchCase:'Match case',matchWord:'Match whole word',matchCyclic:'Match cyclic',replaceAll:'Replace All',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Table',title:'Table Properties',menu:'Table Properties',deleteTable:'Delete Table',rows:'Rows',columns:'Columns',border:'Border size',widthPx:'pixels',widthPc:'percent',widthUnit:'width unit',cellSpace:'Cell spacing',cellPad:'Cell padding',caption:'Caption',summary:'Summary',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Cell',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Delete Cells',merge:'Merge Cells',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Row',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Delete Rows'},column:{menu:'Column',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Delete Columns'}},button:{title:'Button Properties',text:'Text (Value)',type:'Type',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Checkbox Properties',radioTitle:'Radio Button Properties',value:'Value',selected:'Selected'},form:{title:'Form Properties',menu:'Form Properties',action:'Action',method:'Method',encoding:'Encoding'},select:{title:'Selection Field Properties',selectInfo:'Select Info',opAvail:'Available Options',value:'Value',size:'Size',lines:'lines',chkMulti:'Allow multiple selections',opText:'Text',opValue:'Value',btnAdd:'Add',btnModify:'Modify',btnUp:'Up',btnDown:'Down',btnSetValue:'Set as selected value',btnDelete:'Delete'},textarea:{title:'Textarea Properties',cols:'Columns',rows:'Rows'},textfield:{title:'Text Field Properties',name:'Name',value:'Value',charWidth:'Character Width',maxChars:'Maximum Characters',type:'Type',typeText:'Text',typePass:'Password'},hidden:{title:'Hidden Field Properties',name:'Name',value:'Value'},image:{title:'Image Properties',titleButton:'Image Button Properties',menu:'Image Properties',infoTab:'Image Info',btnUpload:'Send it to the Server',upload:'Upload',alt:'Alternative Text',lockRatio:'Lock Ratio',resetSize:'Reset Size',border:'Border',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Please type the image URL',linkTab:'Link',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Flash Properties',propertiesTab:'Properties',title:'Flash Properties',chkPlay:'Auto Play',chkLoop:'Loop',chkMenu:'Enable Flash Menu',chkFull:'Allow Fullscreen',scale:'Scale',scaleAll:'Show all',scaleNoBorder:'No Border',scaleFit:'Exact Fit',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs Bottom',alignAbsMiddle:'Abs Middle',alignBaseline:'Baseline',alignTextTop:'Text Top',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Background color',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'URL must not be empty.',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Check Spelling',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Not in dictionary',changeTo:'Change to',btnIgnore:'Ignore',btnIgnoreAll:'Ignore All',btnReplace:'Replace',btnReplaceAll:'Replace All',btnUndo:'Undo',noSuggestions:'- No suggestions -',progress:'Spell check in progress...',noMispell:'Spell check complete: No misspellings found',noChanges:'Spell check complete: No words changed',oneChange:'Spell check complete: One word changed',manyChanges:'Spell check complete: %1 words changed',ieSpellDownload:'Spell checker not installed. Do you want to download it now?'},smiley:{toolbar:'Smiley',title:'Insert a Smiley',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Insert/Remove Numbered List',bulletedlist:'Insert/Remove Bulleted List',indent:'Increase Indent',outdent:'Decrease Indent',justify:{left:'Align Left',center:'Center',right:'Align Right',block:'Justify'},blockquote:'Block Quote',clipboard:{title:'Paste',cutError:"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).",copyError:"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).",pasteMsg:'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Paste from Word',title:'Paste from Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Paste as plain text',title:'Paste as Plain Text'},templates:{button:'Templates',title:'Content Templates',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Please select the template to open in the editor',emptyListMsg:'(No templates defined)'},showBlocks:'Show Blocks',stylesCombo:{label:'Styles',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Format',panelTitle:'Paragraph Format',tag_p:'Normal',tag_pre:'Formatted',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Font',voiceLabel:'Font',panelTitle:'Font Name'},fontSize:{label:'Size',voiceLabel:'Font Size',panelTitle:'Font Size'},colorButton:{textColorTitle:'Text Color',bgColorTitle:'Background Color',panelTitle:'Colors',auto:'Automatic',more:'More Colors...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Document Properties',title:'Document Properties',design:'Design',meta:'Meta Tags',chooseColor:'Choose',other:'Other...',docTitle:'Page Title',charset:'Character Set Encoding',charsetOther:'Other Character Set Encoding',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Document Type Heading',docTypeOther:'Other Document Type Heading',xhtmlDec:'Include XHTML Declarations',bgColor:'Background Color',bgImage:'Background Image URL',bgFixed:'Non-scrolling (Fixed) Background',txtColor:'Text Color',margin:'Page Margins',marginTop:'Top',marginLeft:'Left',marginRight:'Right',marginBottom:'Bottom',metaKeywords:'Document Indexing Keywords (comma separated)',metaDescription:'Document Description',metaAuthor:'Author',metaCopyright:'Copyright',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.id={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Source',newPage:'New Page',save:'Save',preview:'Preview',cut:'Cut',copy:'Copy',paste:'Paste',print:'Print',underline:'Underline',bold:'Bold',italic:'Italic',selectAll:'Select All',removeFormat:'Remove Format',strike:'Strike Through',subscript:'Subscript',superscript:'Superscript',horizontalrule:'Insert Horizontal Line',pagebreak:'Insert Page Break for Printing',pagebreakAlt:'Page Break',unlink:'Unlink',undo:'Undo',redo:'Redo',common:{browseServer:'Browse Server',url:'URL',protocol:'Protocol',upload:'Upload',uploadSubmit:'Send it to the Server',image:'Image',flash:'Flash',form:'Form',checkbox:'Checkbox',radio:'Radio Button',textField:'Text Field',textarea:'Textarea',hiddenField:'Hidden Field',button:'Button',select:'Selection Field',imageButton:'Image Button',notSet:'<not set>',id:'Id',name:'Name',langDir:'Language Direction',langDirLtr:'Left to Right (LTR)',langDirRtl:'Right to Left (RTL)',langCode:'Language Code',longDescr:'Long Description URL',cssClass:'Stylesheet Classes',advisoryTitle:'Advisory Title',cssStyle:'Style',ok:'OK',cancel:'Cancel',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Advanced',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Width',height:'Height',align:'Alignment',alignLeft:'Left',alignRight:'Right',alignCenter:'Center',alignTop:'Top',alignMiddle:'Middle',alignBottom:'Bottom',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Insert Special Character',title:'Select Special Character',options:'Special Character Options'},link:{toolbar:'Link',other:'<other>',menu:'Edit Link',title:'Link',info:'Link Info',target:'Target',upload:'Upload',advanced:'Advanced',type:'Link Type',toUrl:'URL',toAnchor:'Link to anchor in the text',toEmail:'E-mail',targetFrame:'<frame>',targetPopup:'<popup window>',targetFrameName:'Target Frame Name',targetPopupName:'Popup Window Name',popupFeatures:'Popup Window Features',popupResizable:'Resizable',popupStatusBar:'Status Bar',popupLocationBar:'Location Bar',popupToolbar:'Toolbar',popupMenuBar:'Menu Bar',popupFullScreen:'Full Screen (IE)',popupScrollBars:'Scroll Bars',popupDependent:'Dependent (Netscape)',popupLeft:'Left Position',popupTop:'Top Position',id:'Id',langDir:'Language Direction',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',acccessKey:'Access Key',name:'Name',langCode:'Language Code',tabIndex:'Tab Index',advisoryTitle:'Advisory Title',advisoryContentType:'Advisory Content Type',cssClasses:'Stylesheet Classes',charset:'Linked Resource Charset',styles:'Style',rel:'Relationship',selectAnchor:'Select an Anchor',anchorName:'By Anchor Name',anchorId:'By Element Id',emailAddress:'E-Mail Address',emailSubject:'Message Subject',emailBody:'Message Body',noAnchors:'(No anchors available in the document)',noUrl:'Please type the link URL',noEmail:'Please type the e-mail address'},anchor:{toolbar:'Anchor',menu:'Edit Anchor',title:'Anchor Properties',name:'Anchor Name',errorName:'Please type the anchor name',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Find',replace:'Replace',findWhat:'Find what:',replaceWith:'Replace with:',notFoundMsg:'The specified text was not found.',findOptions:'Find Options',matchCase:'Match case',matchWord:'Match whole word',matchCyclic:'Match cyclic',replaceAll:'Replace All',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Table',title:'Table Properties',menu:'Table Properties',deleteTable:'Delete Table',rows:'Rows',columns:'Columns',border:'Border size',widthPx:'pixels',widthPc:'percent',widthUnit:'width unit',cellSpace:'Cell spacing',cellPad:'Cell padding',caption:'Caption',summary:'Summary',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Cell',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Delete Cells',merge:'Merge Cells',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Row',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Delete Rows'},column:{menu:'Column',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Delete Columns'}},button:{title:'Button Properties',text:'Text (Value)',type:'Type',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Checkbox Properties',radioTitle:'Radio Button Properties',value:'Value',selected:'Selected'},form:{title:'Form Properties',menu:'Form Properties',action:'Action',method:'Method',encoding:'Encoding'},select:{title:'Selection Field Properties',selectInfo:'Select Info',opAvail:'Available Options',value:'Value',size:'Size',lines:'lines',chkMulti:'Allow multiple selections',opText:'Text',opValue:'Value',btnAdd:'Add',btnModify:'Modify',btnUp:'Up',btnDown:'Down',btnSetValue:'Set as selected value',btnDelete:'Delete'},textarea:{title:'Textarea Properties',cols:'Columns',rows:'Rows'},textfield:{title:'Text Field Properties',name:'Name',value:'Value',charWidth:'Character Width',maxChars:'Maximum Characters',type:'Type',typeText:'Text',typePass:'Password'},hidden:{title:'Hidden Field Properties',name:'Name',value:'Value'},image:{title:'Image Properties',titleButton:'Image Button Properties',menu:'Image Properties',infoTab:'Image Info',btnUpload:'Send it to the Server',upload:'Upload',alt:'Alternative Text',lockRatio:'Lock Ratio',resetSize:'Reset Size',border:'Border',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Please type the image URL',linkTab:'Link',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Flash Properties',propertiesTab:'Properties',title:'Flash Properties',chkPlay:'Auto Play',chkLoop:'Loop',chkMenu:'Enable Flash Menu',chkFull:'Allow Fullscreen',scale:'Scale',scaleAll:'Show all',scaleNoBorder:'No Border',scaleFit:'Exact Fit',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs Bottom',alignAbsMiddle:'Abs Middle',alignBaseline:'Baseline',alignTextTop:'Text Top',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Background color',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'URL must not be empty.',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Check Spelling',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Not in dictionary',changeTo:'Change to',btnIgnore:'Ignore',btnIgnoreAll:'Ignore All',btnReplace:'Replace',btnReplaceAll:'Replace All',btnUndo:'Undo',noSuggestions:'- No suggestions -',progress:'Spell check in progress...',noMispell:'Spell check complete: No misspellings found',noChanges:'Spell check complete: No words changed',oneChange:'Spell check complete: One word changed',manyChanges:'Spell check complete: %1 words changed',ieSpellDownload:'Spell checker not installed. Do you want to download it now?'},smiley:{toolbar:'Smiley',title:'Insert a Smiley',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Insert/Remove Numbered List',bulletedlist:'Insert/Remove Bulleted List',indent:'Increase Indent',outdent:'Decrease Indent',justify:{left:'Align Left',center:'Center',right:'Align Right',block:'Justify'},blockquote:'Block Quote',clipboard:{title:'Paste',cutError:"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).",copyError:"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).",pasteMsg:'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Paste from Word',title:'Paste from Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Paste as plain text',title:'Paste as Plain Text'},templates:{button:'Templates',title:'Content Templates',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Please select the template to open in the editor',emptyListMsg:'(No templates defined)'},showBlocks:'Show Blocks',stylesCombo:{label:'Styles',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Format',panelTitle:'Paragraph Format',tag_p:'Normal',tag_pre:'Formatted',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Font',voiceLabel:'Font',panelTitle:'Font Name'},fontSize:{label:'Size',voiceLabel:'Font Size',panelTitle:'Font Size'},colorButton:{textColorTitle:'Text Color',bgColorTitle:'Background Color',panelTitle:'Colors',auto:'Automatic',more:'More Colors...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Document Properties',title:'Document Properties',design:'Design',meta:'Meta Tags',chooseColor:'Choose',other:'Other...',docTitle:'Page Title',charset:'Character Set Encoding',charsetOther:'Other Character Set Encoding',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Document Type Heading',docTypeOther:'Other Document Type Heading',xhtmlDec:'Include XHTML Declarations',bgColor:'Background Color',bgImage:'Background Image URL',bgFixed:'Non-scrolling (Fixed) Background',txtColor:'Text Color',margin:'Page Margins',marginTop:'Top',marginLeft:'Left',marginRight:'Right',marginBottom:'Bottom',metaKeywords:'Document Indexing Keywords (comma separated)',metaDescription:'Document Description',metaAuthor:'Author',metaCopyright:'Copyright',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/is.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/is.js
index 6b1829d..3bf4436 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/is.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/is.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.is={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Kóði',newPage:'Ný síða',save:'Vista',preview:'Forskoða',cut:'Klippa',copy:'Afrita',paste:'Líma',print:'Prenta',underline:'Undirstrikað',bold:'Feitletrað',italic:'Skáletrað',selectAll:'Velja allt',removeFormat:'Fjarlægja snið',strike:'Yfirstrikað',subscript:'Niðurskrifað',superscript:'Uppskrifað',horizontalrule:'Lóðrétt lína',pagebreak:'Setja inn síðuskil',pagebreakAlt:'Page Break',unlink:'Fjarlægja stiklu',undo:'Afturkalla',redo:'Hætta við afturköllun',common:{browseServer:'Fletta í skjalasafni',url:'Vefslóð',protocol:'Samskiptastaðall',upload:'Senda upp',uploadSubmit:'Hlaða upp',image:'Setja inn mynd',flash:'Flash',form:'Setja inn innsláttarform',checkbox:'Setja inn hökunarreit',radio:'Setja inn valhnapp',textField:'Setja inn textareit',textarea:'Setja inn textasvæði',hiddenField:'Setja inn falið svæði',button:'Setja inn hnapp',select:'Setja inn lista',imageButton:'Setja inn myndahnapp',notSet:'<ekkert valið>',id:'Auðkenni',name:'Nafn',langDir:'Lesstefna',langDirLtr:'Frá vinstri til hægri (LTR)',langDirRtl:'Frá hægri til vinstri (RTL)',langCode:'Tungumálakóði',longDescr:'Nánari lýsing',cssClass:'Stílsniðsflokkur',advisoryTitle:'Titill',cssStyle:'Stíll',ok:'Í lagi',cancel:'Hætta við',close:'Close',preview:'Preview',generalTab:'Almennt',advancedTab:'Tæknilegt',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Breidd',height:'Hæð',align:'Jöfnun',alignLeft:'Vinstri',alignRight:'Hægri',alignCenter:'Miðjað',alignTop:'Efst',alignMiddle:'Miðjuð',alignBottom:'Neðst',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Setja inn merki',title:'Velja tákn',options:'Special Character Options'},link:{toolbar:'Stofna/breyta stiklu',other:'<annar>',menu:'Breyta stiklu',title:'Stikla',info:'Almennt',target:'Mark',upload:'Senda upp',advanced:'Tæknilegt',type:'Stikluflokkur',toUrl:'URL',toAnchor:'Bókamerki á þessari síðu',toEmail:'Netfang',targetFrame:'<rammi>',targetPopup:'<sprettigluggi>',targetFrameName:'Nafn markglugga',targetPopupName:'Nafn sprettiglugga',popupFeatures:'Eigindi sprettiglugga',popupResizable:'Resizable',popupStatusBar:'Stöðustika',popupLocationBar:'Fanglína',popupToolbar:'Verkfærastika',popupMenuBar:'Vallína',popupFullScreen:'Heilskjár (IE)',popupScrollBars:'Skrunstikur',popupDependent:'Háð venslum (Netscape)',popupLeft:'Fjarlægð frá vinstri',popupTop:'Fjarlægð frá efri brún',id:'Id',langDir:'Lesstefna',langDirLTR:'Frá vinstri til hægri (LTR)',langDirRTL:'Frá hægri til vinstri (RTL)',acccessKey:'Skammvalshnappur',name:'Nafn',langCode:'Lesstefna',tabIndex:'Raðnúmer innsláttarreits',advisoryTitle:'Titill',advisoryContentType:'Tegund innihalds',cssClasses:'Stílsniðsflokkur',charset:'Táknróf',styles:'Stíll',rel:'Relationship',selectAnchor:'Veldu akkeri',anchorName:'Eftir akkerisnafni',anchorId:'Eftir auðkenni einingar',emailAddress:'Netfang',emailSubject:'Efni',emailBody:'Meginmál',noAnchors:'<Engin bókamerki á skrá>',noUrl:'Sláðu inn veffang stiklunnar!',noEmail:'Sláðu inn netfang!'},anchor:{toolbar:'Stofna/breyta kaflamerki',menu:'Eigindi kaflamerkis',title:'Eigindi kaflamerkis',name:'Nafn bókamerkis',errorName:'Sláðu inn nafn bókamerkis!',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Finna og skipta',find:'Leita',replace:'Skipta út',findWhat:'Leita að:',replaceWith:'Skipta út fyrir:',notFoundMsg:'Leitartexti fannst ekki!',findOptions:'Find Options',matchCase:'Gera greinarmun á¡ há¡- og lágstöfum',matchWord:'Aðeins heil orð',matchCyclic:'Match cyclic',replaceAll:'Skipta út allsstaðar',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Tafla',title:'Eigindi töflu',menu:'Eigindi töflu',deleteTable:'Fella töflu',rows:'Raðir',columns:'Dálkar',border:'Breidd ramma',widthPx:'myndeindir',widthPc:'prósent',widthUnit:'width unit',cellSpace:'Bil milli reita',cellPad:'Reitaspássía',caption:'Titill',summary:'Áfram',headers:'Fyrirsagnir',headersNone:'Engar',headersColumn:'Fyrsti dálkur',headersRow:'Fyrsta röð',headersBoth:'Hvort tveggja',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Reitur',insertBefore:'Skjóta inn reiti fyrir aftan',insertAfter:'Skjóta inn reiti fyrir framan',deleteCell:'Fella reit',merge:'Sameina reiti',mergeRight:'Sameina til hægri',mergeDown:'Sameina niður á við',splitHorizontal:'Kljúfa reit lárétt',splitVertical:'Kljúfa reit lóðrétt',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Röð',insertBefore:'Skjóta inn röð fyrir ofan',insertAfter:'Skjóta inn röð fyrir neðan',deleteRow:'Eyða röð'},column:{menu:'Dálkur',insertBefore:'Skjóta inn dálki vinstra megin',insertAfter:'Skjóta inn dálki hægra megin',deleteColumn:'Fella dálk'}},button:{title:'Eigindi hnapps',text:'Texti',type:'Gerð',typeBtn:'Hnappur',typeSbm:'Staðfesta',typeRst:'Hreinsa'},checkboxAndRadio:{checkboxTitle:'Eigindi markreits',radioTitle:'Eigindi valhnapps',value:'Gildi',selected:'Valið'},form:{title:'Eigindi innsláttarforms',menu:'Eigindi innsláttarforms',action:'Aðgerð',method:'Aðferð',encoding:'Encoding'},select:{title:'Eigindi lista',selectInfo:'Upplýsingar',opAvail:'Kostir',value:'Gildi',size:'Stærð',lines:'línur',chkMulti:'Leyfa fleiri kosti',opText:'Texti',opValue:'Gildi',btnAdd:'Bæta við',btnModify:'Breyta',btnUp:'Upp',btnDown:'Niður',btnSetValue:'Merkja sem valið',btnDelete:'Eyða'},textarea:{title:'Eigindi textasvæðis',cols:'Dálkar',rows:'Línur'},textfield:{title:'Eigindi textareits',name:'Nafn',value:'Gildi',charWidth:'Breidd (leturtákn)',maxChars:'Hámarksfjöldi leturtákna',type:'Gerð',typeText:'Texti',typePass:'Lykilorð'},hidden:{title:'Eigindi falins svæðis',name:'Nafn',value:'Gildi'},image:{title:'Eigindi myndar',titleButton:'Eigindi myndahnapps',menu:'Eigindi myndar',infoTab:'Almennt',btnUpload:'Hlaða upp',upload:'Hlaða upp',alt:'Baklægur texti',lockRatio:'Festa stærðarhlutfall',resetSize:'Reikna stærð',border:'Rammi',hSpace:'Vinstri bil',vSpace:'Hægri bil',alertUrl:'Sláðu inn slóðina að myndinni',linkTab:'Stikla',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Eigindi Flash',propertiesTab:'Properties',title:'Eigindi Flash',chkPlay:'Sjálfvirk spilun',chkLoop:'Endurtekning',chkMenu:'Sýna Flash-valmynd',chkFull:'Allow Fullscreen',scale:'Skali',scaleAll:'Sýna allt',scaleNoBorder:'Án ramma',scaleFit:'Fella skala að stærð',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs neðst',alignAbsMiddle:'Abs miðjuð',alignBaseline:'Grunnlína',alignTextTop:'Efri brún texta',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Bakgrunnslitur',hSpace:'Vinstri bil',vSpace:'Hægri bil',validateSrc:'Sláðu inn veffang stiklunnar!',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Villuleit',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Ekki í orðabókinni',changeTo:'Tillaga',btnIgnore:'Hunsa',btnIgnoreAll:'Hunsa allt',btnReplace:'Skipta',btnReplaceAll:'Skipta öllu',btnUndo:'Til baka',noSuggestions:'- engar tillögur -',progress:'Villuleit í gangi...',noMispell:'Villuleit lokið: Engin villa fannst',noChanges:'Villuleit lokið: Engu orði breytt',oneChange:'Villuleit lokið: Einu orði breytt',manyChanges:'Villuleit lokið: %1 orðum breytt',ieSpellDownload:'Villuleit ekki sett upp.<br>Viltu setja hana upp?'},smiley:{toolbar:'Svipur',title:'Velja svip',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Númeraður listi',bulletedlist:'Punktalisti',indent:'Minnka inndrátt',outdent:'Auka inndrátt',justify:{left:'Vinstrijöfnun',center:'Miðja texta',right:'Hægrijöfnun',block:'Jafna báðum megin'},blockquote:'Inndráttur',clipboard:{title:'Líma',cutError:'Öryggisstillingar vafrans þíns leyfa ekki klippingu texta með músaraðgerð. Notaðu lyklaborðið í klippa (Ctrl/Cmd+X).',copyError:'Öryggisstillingar vafrans þíns leyfa ekki afritun texta með músaraðgerð. Notaðu lyklaborðið í afrita (Ctrl/Cmd+C).',pasteMsg:'Límdu í svæðið hér að neðan og (<STRONG>Ctrl/Cmd+V</STRONG>) og smelltu á <STRONG>OK</STRONG>.',securityMsg:'Vegna öryggisstillinga í vafranum þínum fær ritillinn ekki beinan aðgang að klippuborðinu. Þú verður að líma innihaldið aftur inn í þennan glugga.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Líma úr Word',title:'Líma úr Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Líma sem ósniðinn texta',title:'Líma sem ósniðinn texta'},templates:{button:'Sniðmát',title:'Innihaldssniðmát',options:'Template Options',insertOption:'Skipta út raunverulegu innihaldi',selectPromptMsg:'Veldu sniðmát til að opna í ritlinum.<br>(Núverandi innihald víkur fyrir því!):',emptyListMsg:'(Ekkert sniðmát er skilgreint!)'},showBlocks:'Sýna blokkir',stylesCombo:{label:'Stílflokkur',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Stílsnið',panelTitle:'Stílsnið',tag_p:'Venjulegt letur',tag_pre:'Forsniðið',tag_address:'Vistfang',tag_h1:'Fyrirsögn 1',tag_h2:'Fyrirsögn 2',tag_h3:'Fyrirsögn 3',tag_h4:'Fyrirsögn 4',tag_h5:'Fyrirsögn 5',tag_h6:'Fyrirsögn 6',tag_div:'Venjulegt (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Leturgerð ',voiceLabel:'Font',panelTitle:'Leturgerð '},fontSize:{label:'Leturstærð ',voiceLabel:'Font Size',panelTitle:'Leturstærð '},colorButton:{textColorTitle:'Litur texta',bgColorTitle:'Bakgrunnslitur',panelTitle:'Colors',auto:'Sjálfval',more:'Fleiri liti...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Eigindi skjals',title:'Eigindi skjals',design:'Design',meta:'Lýsigögn',chooseColor:'Choose',other:'<annar>',docTitle:'Titill síðu',charset:'Letursett',charsetOther:'Annað letursett',charsetASCII:'ASCII',charsetCE:'Mið-evrópskt',charsetCT:'Kínverskt, hefðbundið (Big5)',charsetCR:'Kýrilskt',charsetGR:'Grískt',charsetJP:'Japanskt',charsetKR:'Kóreskt',charsetTR:'Tyrkneskt',charsetUN:'Unicode (UTF-8)',charsetWE:'Vestur-evrópst',docType:'Flokkur skjalategunda',docTypeOther:'Annar flokkur skjalategunda',xhtmlDec:'Fella inn XHTML lýsingu',bgColor:'Bakgrunnslitur',bgImage:'Slóð bakgrunnsmyndar',bgFixed:'Læstur bakgrunnur',txtColor:'Litur texta',margin:'Hliðarspássía',marginTop:'Efst',marginLeft:'Vinstri',marginRight:'Hægri',marginBottom:'Neðst',metaKeywords:'Lykilorð efnisorðaskrár (aðgreind með kommum)',metaDescription:'Lýsing skjals',metaAuthor:'Höfundur',metaCopyright:'Höfundarréttur',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.is={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Kóði',newPage:'Ný síða',save:'Vista',preview:'Forskoða',cut:'Klippa',copy:'Afrita',paste:'Líma',print:'Prenta',underline:'Undirstrikað',bold:'Feitletrað',italic:'Skáletrað',selectAll:'Velja allt',removeFormat:'Fjarlægja snið',strike:'Yfirstrikað',subscript:'Niðurskrifað',superscript:'Uppskrifað',horizontalrule:'Lóðrétt lína',pagebreak:'Setja inn síðuskil',pagebreakAlt:'Page Break',unlink:'Fjarlægja stiklu',undo:'Afturkalla',redo:'Hætta við afturköllun',common:{browseServer:'Fletta í skjalasafni',url:'Vefslóð',protocol:'Samskiptastaðall',upload:'Senda upp',uploadSubmit:'Hlaða upp',image:'Setja inn mynd',flash:'Flash',form:'Setja inn innsláttarform',checkbox:'Setja inn hökunarreit',radio:'Setja inn valhnapp',textField:'Setja inn textareit',textarea:'Setja inn textasvæði',hiddenField:'Setja inn falið svæði',button:'Setja inn hnapp',select:'Setja inn lista',imageButton:'Setja inn myndahnapp',notSet:'<ekkert valið>',id:'Auðkenni',name:'Nafn',langDir:'Lesstefna',langDirLtr:'Frá vinstri til hægri (LTR)',langDirRtl:'Frá hægri til vinstri (RTL)',langCode:'Tungumálakóði',longDescr:'Nánari lýsing',cssClass:'Stílsniðsflokkur',advisoryTitle:'Titill',cssStyle:'Stíll',ok:'Í lagi',cancel:'Hætta við',close:'Close',preview:'Preview',generalTab:'Almennt',advancedTab:'Tæknilegt',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Breidd',height:'Hæð',align:'Jöfnun',alignLeft:'Vinstri',alignRight:'Hægri',alignCenter:'Miðjað',alignTop:'Efst',alignMiddle:'Miðjuð',alignBottom:'Neðst',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Setja inn merki',title:'Velja tákn',options:'Special Character Options'},link:{toolbar:'Stofna/breyta stiklu',other:'<annar>',menu:'Breyta stiklu',title:'Stikla',info:'Almennt',target:'Mark',upload:'Senda upp',advanced:'Tæknilegt',type:'Stikluflokkur',toUrl:'URL',toAnchor:'Bókamerki á þessari síðu',toEmail:'Netfang',targetFrame:'<rammi>',targetPopup:'<sprettigluggi>',targetFrameName:'Nafn markglugga',targetPopupName:'Nafn sprettiglugga',popupFeatures:'Eigindi sprettiglugga',popupResizable:'Resizable',popupStatusBar:'Stöðustika',popupLocationBar:'Fanglína',popupToolbar:'Verkfærastika',popupMenuBar:'Vallína',popupFullScreen:'Heilskjár (IE)',popupScrollBars:'Skrunstikur',popupDependent:'Háð venslum (Netscape)',popupLeft:'Fjarlægð frá vinstri',popupTop:'Fjarlægð frá efri brún',id:'Id',langDir:'Lesstefna',langDirLTR:'Frá vinstri til hægri (LTR)',langDirRTL:'Frá hægri til vinstri (RTL)',acccessKey:'Skammvalshnappur',name:'Nafn',langCode:'Lesstefna',tabIndex:'Raðnúmer innsláttarreits',advisoryTitle:'Titill',advisoryContentType:'Tegund innihalds',cssClasses:'Stílsniðsflokkur',charset:'Táknróf',styles:'Stíll',rel:'Relationship',selectAnchor:'Veldu akkeri',anchorName:'Eftir akkerisnafni',anchorId:'Eftir auðkenni einingar',emailAddress:'Netfang',emailSubject:'Efni',emailBody:'Meginmál',noAnchors:'<Engin bókamerki á skrá>',noUrl:'Sláðu inn veffang stiklunnar!',noEmail:'Sláðu inn netfang!'},anchor:{toolbar:'Stofna/breyta kaflamerki',menu:'Eigindi kaflamerkis',title:'Eigindi kaflamerkis',name:'Nafn bókamerkis',errorName:'Sláðu inn nafn bókamerkis!',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Finna og skipta',find:'Leita',replace:'Skipta út',findWhat:'Leita að:',replaceWith:'Skipta út fyrir:',notFoundMsg:'Leitartexti fannst ekki!',findOptions:'Find Options',matchCase:'Gera greinarmun á¡ há¡- og lágstöfum',matchWord:'Aðeins heil orð',matchCyclic:'Match cyclic',replaceAll:'Skipta út allsstaðar',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Tafla',title:'Eigindi töflu',menu:'Eigindi töflu',deleteTable:'Fella töflu',rows:'Raðir',columns:'Dálkar',border:'Breidd ramma',widthPx:'myndeindir',widthPc:'prósent',widthUnit:'width unit',cellSpace:'Bil milli reita',cellPad:'Reitaspássía',caption:'Titill',summary:'Áfram',headers:'Fyrirsagnir',headersNone:'Engar',headersColumn:'Fyrsti dálkur',headersRow:'Fyrsta röð',headersBoth:'Hvort tveggja',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Reitur',insertBefore:'Skjóta inn reiti fyrir aftan',insertAfter:'Skjóta inn reiti fyrir framan',deleteCell:'Fella reit',merge:'Sameina reiti',mergeRight:'Sameina til hægri',mergeDown:'Sameina niður á við',splitHorizontal:'Kljúfa reit lárétt',splitVertical:'Kljúfa reit lóðrétt',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Röð',insertBefore:'Skjóta inn röð fyrir ofan',insertAfter:'Skjóta inn röð fyrir neðan',deleteRow:'Eyða röð'},column:{menu:'Dálkur',insertBefore:'Skjóta inn dálki vinstra megin',insertAfter:'Skjóta inn dálki hægra megin',deleteColumn:'Fella dálk'}},button:{title:'Eigindi hnapps',text:'Texti',type:'Gerð',typeBtn:'Hnappur',typeSbm:'Staðfesta',typeRst:'Hreinsa'},checkboxAndRadio:{checkboxTitle:'Eigindi markreits',radioTitle:'Eigindi valhnapps',value:'Gildi',selected:'Valið'},form:{title:'Eigindi innsláttarforms',menu:'Eigindi innsláttarforms',action:'Aðgerð',method:'Aðferð',encoding:'Encoding'},select:{title:'Eigindi lista',selectInfo:'Upplýsingar',opAvail:'Kostir',value:'Gildi',size:'Stærð',lines:'línur',chkMulti:'Leyfa fleiri kosti',opText:'Texti',opValue:'Gildi',btnAdd:'Bæta við',btnModify:'Breyta',btnUp:'Upp',btnDown:'Niður',btnSetValue:'Merkja sem valið',btnDelete:'Eyða'},textarea:{title:'Eigindi textasvæðis',cols:'Dálkar',rows:'Línur'},textfield:{title:'Eigindi textareits',name:'Nafn',value:'Gildi',charWidth:'Breidd (leturtákn)',maxChars:'Hámarksfjöldi leturtákna',type:'Gerð',typeText:'Texti',typePass:'Lykilorð'},hidden:{title:'Eigindi falins svæðis',name:'Nafn',value:'Gildi'},image:{title:'Eigindi myndar',titleButton:'Eigindi myndahnapps',menu:'Eigindi myndar',infoTab:'Almennt',btnUpload:'Hlaða upp',upload:'Hlaða upp',alt:'Baklægur texti',lockRatio:'Festa stærðarhlutfall',resetSize:'Reikna stærð',border:'Rammi',hSpace:'Vinstri bil',vSpace:'Hægri bil',alertUrl:'Sláðu inn slóðina að myndinni',linkTab:'Stikla',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Eigindi Flash',propertiesTab:'Properties',title:'Eigindi Flash',chkPlay:'Sjálfvirk spilun',chkLoop:'Endurtekning',chkMenu:'Sýna Flash-valmynd',chkFull:'Allow Fullscreen',scale:'Skali',scaleAll:'Sýna allt',scaleNoBorder:'Án ramma',scaleFit:'Fella skala að stærð',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs neðst',alignAbsMiddle:'Abs miðjuð',alignBaseline:'Grunnlína',alignTextTop:'Efri brún texta',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Bakgrunnslitur',hSpace:'Vinstri bil',vSpace:'Hægri bil',validateSrc:'Sláðu inn veffang stiklunnar!',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Villuleit',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Ekki í orðabókinni',changeTo:'Tillaga',btnIgnore:'Hunsa',btnIgnoreAll:'Hunsa allt',btnReplace:'Skipta',btnReplaceAll:'Skipta öllu',btnUndo:'Til baka',noSuggestions:'- engar tillögur -',progress:'Villuleit í gangi...',noMispell:'Villuleit lokið: Engin villa fannst',noChanges:'Villuleit lokið: Engu orði breytt',oneChange:'Villuleit lokið: Einu orði breytt',manyChanges:'Villuleit lokið: %1 orðum breytt',ieSpellDownload:'Villuleit ekki sett upp.<br>Viltu setja hana upp?'},smiley:{toolbar:'Svipur',title:'Velja svip',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Númeraður listi',bulletedlist:'Punktalisti',indent:'Minnka inndrátt',outdent:'Auka inndrátt',justify:{left:'Vinstrijöfnun',center:'Miðja texta',right:'Hægrijöfnun',block:'Jafna báðum megin'},blockquote:'Inndráttur',clipboard:{title:'Líma',cutError:'Öryggisstillingar vafrans þíns leyfa ekki klippingu texta með músaraðgerð. Notaðu lyklaborðið í klippa (Ctrl/Cmd+X).',copyError:'Öryggisstillingar vafrans þíns leyfa ekki afritun texta með músaraðgerð. Notaðu lyklaborðið í afrita (Ctrl/Cmd+C).',pasteMsg:'Límdu í svæðið hér að neðan og (<STRONG>Ctrl/Cmd+V</STRONG>) og smelltu á <STRONG>OK</STRONG>.',securityMsg:'Vegna öryggisstillinga í vafranum þínum fær ritillinn ekki beinan aðgang að klippuborðinu. Þú verður að líma innihaldið aftur inn í þennan glugga.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Líma úr Word',title:'Líma úr Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Líma sem ósniðinn texta',title:'Líma sem ósniðinn texta'},templates:{button:'Sniðmát',title:'Innihaldssniðmát',options:'Template Options',insertOption:'Skipta út raunverulegu innihaldi',selectPromptMsg:'Veldu sniðmát til að opna í ritlinum.<br>(Núverandi innihald víkur fyrir því!):',emptyListMsg:'(Ekkert sniðmát er skilgreint!)'},showBlocks:'Sýna blokkir',stylesCombo:{label:'Stílflokkur',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Stílsnið',panelTitle:'Stílsnið',tag_p:'Venjulegt letur',tag_pre:'Forsniðið',tag_address:'Vistfang',tag_h1:'Fyrirsögn 1',tag_h2:'Fyrirsögn 2',tag_h3:'Fyrirsögn 3',tag_h4:'Fyrirsögn 4',tag_h5:'Fyrirsögn 5',tag_h6:'Fyrirsögn 6',tag_div:'Venjulegt (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Leturgerð ',voiceLabel:'Font',panelTitle:'Leturgerð '},fontSize:{label:'Leturstærð ',voiceLabel:'Font Size',panelTitle:'Leturstærð '},colorButton:{textColorTitle:'Litur texta',bgColorTitle:'Bakgrunnslitur',panelTitle:'Colors',auto:'Sjálfval',more:'Fleiri liti...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Eigindi skjals',title:'Eigindi skjals',design:'Design',meta:'Lýsigögn',chooseColor:'Choose',other:'<annar>',docTitle:'Titill síðu',charset:'Letursett',charsetOther:'Annað letursett',charsetASCII:'ASCII',charsetCE:'Mið-evrópskt',charsetCT:'Kínverskt, hefðbundið (Big5)',charsetCR:'Kýrilskt',charsetGR:'Grískt',charsetJP:'Japanskt',charsetKR:'Kóreskt',charsetTR:'Tyrkneskt',charsetUN:'Unicode (UTF-8)',charsetWE:'Vestur-evrópst',docType:'Flokkur skjalategunda',docTypeOther:'Annar flokkur skjalategunda',xhtmlDec:'Fella inn XHTML lýsingu',bgColor:'Bakgrunnslitur',bgImage:'Slóð bakgrunnsmyndar',bgFixed:'Læstur bakgrunnur',txtColor:'Litur texta',margin:'Hliðarspássía',marginTop:'Efst',marginLeft:'Vinstri',marginRight:'Hægri',marginBottom:'Neðst',metaKeywords:'Lykilorð efnisorðaskrár (aðgreind með kommum)',metaDescription:'Lýsing skjals',metaAuthor:'Höfundur',metaCopyright:'Höfundarréttur',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/it.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/it.js
index 67eb31f..28621d5 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/it.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/it.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.it={dir:'ltr',editorTitle:'Editor di testo Rich Text, %1',editorHelp:'Premi ALT 0 per aiuto',toolbars:'Editor toolbar',editor:'Rich Text Editor',source:'Codice Sorgente',newPage:'Nuova pagina vuota',save:'Salva',preview:'Anteprima',cut:'Taglia',copy:'Copia',paste:'Incolla',print:'Stampa',underline:'Sottolineato',bold:'Grassetto',italic:'Corsivo',selectAll:'Seleziona tutto',removeFormat:'Elimina formattazione',strike:'Barrato',subscript:'Pedice',superscript:'Apice',horizontalrule:'Inserisci riga orizzontale',pagebreak:'Inserisci interruzione di pagina',pagebreakAlt:'Interruzione di pagina',unlink:'Elimina collegamento',undo:'Annulla',redo:'Ripristina',common:{browseServer:'Cerca sul server',url:'URL',protocol:'Protocollo',upload:'Carica',uploadSubmit:'Invia al server',image:'Immagine',flash:'Oggetto Flash',form:'Modulo',checkbox:'Checkbox',radio:'Radio Button',textField:'Campo di testo',textarea:'Area di testo',hiddenField:'Campo nascosto',button:'Bottone',select:'Menu di selezione',imageButton:'Bottone immagine',notSet:'<non impostato>',id:'Id',name:'Nome',langDir:'Direzione scrittura',langDirLtr:'Da Sinistra a Destra (LTR)',langDirRtl:'Da Destra a Sinistra (RTL)',langCode:'Codice Lingua',longDescr:'URL descrizione estesa',cssClass:'Nome classe CSS',advisoryTitle:'Titolo',cssStyle:'Stile',ok:'OK',cancel:'Annulla',close:'Chiudi',preview:'Anteprima',generalTab:'Generale',advancedTab:'Avanzate',validateNumberFailed:'Il valore inserito non è un numero.',confirmNewPage:'Ogni modifica non salvata sarà persa. Sei sicuro di voler caricare una nuova pagina?',confirmCancel:'Alcune delle opzioni sono state cambiate. Sei sicuro di voler chiudere la finestra di dialogo?',options:'Opzioni',target:'Destinazione',targetNew:'Nuova finestra (_blank)',targetTop:'Finestra in primo piano (_top)',targetSelf:'Stessa finestra (_self)',targetParent:'Finestra Padre (_parent)',langDirLTR:'Da sinistra a destra (LTR)',langDirRTL:'Da destra a sinistra (RTL)',styles:'Stile',cssClasses:'Classi di stile',width:'Larghezza',height:'Altezza',align:'Allineamento',alignLeft:'Sinistra',alignRight:'Destra',alignCenter:'Centrato',alignTop:'In Alto',alignMiddle:'Centrato',alignBottom:'In Basso',invalidHeight:"L'altezza dev'essere un numero",invalidWidth:"La Larghezza dev'essere un numero",invalidCssLength:'Il valore indicato per il campo "%1" deve essere un numero positivo con o senza indicazione di una valida unità di misura per le classi CSS (px, %, in, cm, mm, em, ex, pt, o pc).',invalidHtmlLength:'Il valore indicato per il campo "%1" deve essere un numero positivo con o senza indicazione di una valida unità di misura per le pagine HTML (px o %).',invalidInlineStyle:'Il valore specificato per lo stile inline deve consistere in una o più tuple con il formato di "name : value", separati da semicolonne.',cssLengthTooltip:'Inserisci un numero per il valore in pixel oppure un numero con una valida unità CSS (px, %, in, cm, mm, ex, pt, o pc).',unavailable:'%1<span class="cke_accessibility">, non disponibile</span>'},contextmenu:{options:'Opzioni del menù contestuale'},specialChar:{toolbar:'Inserisci carattere speciale',title:'Seleziona carattere speciale',options:'Opzioni carattere speciale'},link:{toolbar:'Inserisci/Modifica collegamento',other:'<altro>',menu:'Modifica collegamento',title:'Collegamento',info:'Informazioni collegamento',target:'Destinazione',upload:'Carica',advanced:'Avanzate',type:'Tipo di Collegamento',toUrl:'URL',toAnchor:'Ancora nella pagina',toEmail:'E-Mail',targetFrame:'<riquadro>',targetPopup:'<finestra popup>',targetFrameName:'Nome del riquadro di destinazione',targetPopupName:'Nome finestra popup',popupFeatures:'Caratteristiche finestra popup',popupResizable:'Ridimensionabile',popupStatusBar:'Barra di stato',popupLocationBar:'Barra degli indirizzi',popupToolbar:'Barra degli strumenti',popupMenuBar:'Barra del menu',popupFullScreen:'A tutto schermo (IE)',popupScrollBars:'Barre di scorrimento',popupDependent:'Dipendente (Netscape)',popupLeft:'Posizione da sinistra',popupTop:"Posizione dall'alto",id:'Id',langDir:'Direzione scrittura',langDirLTR:'Da Sinistra a Destra (LTR)',langDirRTL:'Da Destra a Sinistra (RTL)',acccessKey:'Scorciatoia<br />da tastiera',name:'Nome',langCode:'Direzione scrittura',tabIndex:'Ordine di tabulazione',advisoryTitle:'Titolo',advisoryContentType:'Tipo della risorsa collegata',cssClasses:'Nome classe CSS',charset:'Set di caretteri della risorsa collegata',styles:'Stile',rel:'Relazioni',selectAnchor:'Scegli Ancora',anchorName:'Per Nome',anchorId:'Per id elemento',emailAddress:'Indirizzo E-Mail',emailSubject:'Oggetto del messaggio',emailBody:'Corpo del messaggio',noAnchors:'(Nessuna ancora disponibile nel documento)',noUrl:"Devi inserire l'URL del collegamento",noEmail:"Devi inserire un'indirizzo e-mail"},anchor:{toolbar:'Inserisci/Modifica Ancora',menu:'Proprietà ancora',title:'Proprietà ancora',name:'Nome ancora',errorName:"Inserici il nome dell'ancora",remove:"Rimuovi l'ancora"},list:{numberedTitle:'Proprietà liste numerate',bulletedTitle:'Proprietà liste puntate',type:'Tipo',start:'Inizio',validateStartNumber:'Il numero di inizio di una lista numerata deve essere un numero intero.',circle:'Cerchio',disc:'Disco',square:'Quadrato',none:'Nessuno',notset:'<non impostato>',armenian:'Numerazione Armena',georgian:'Numerazione Georgiana (an, ban, gan, ecc.)',lowerRoman:'Numerazione Romana minuscola (i, ii, iii, iv, v, ecc.)',upperRoman:'Numerazione Romana maiuscola (I, II, III, IV, V, ecc.)',lowerAlpha:'Alfabetico minuscolo (a, b, c, d, e, ecc.)',upperAlpha:'Alfabetico maiuscolo (A, B, C, D, E, ecc.)',lowerGreek:'Greco minuscolo (alpha, beta, gamma, ecc.)',decimal:'Decimale (1, 2, 3, ecc.)',decimalLeadingZero:'Decimale preceduto da 0 (01, 02, 03, ecc.)'},findAndReplace:{title:'Cerca e Sostituisci',find:'Trova',replace:'Sostituisci',findWhat:'Trova:',replaceWith:'Sostituisci con:',notFoundMsg:"L'elemento cercato non è stato trovato.",findOptions:'Opzioni di ricerca',matchCase:'Maiuscole/minuscole',matchWord:'Solo parole intere',matchCyclic:'Ricerca ciclica',replaceAll:'Sostituisci tutto',replaceSuccessMsg:'%1 occorrenza(e) sostituite.'},table:{toolbar:'Tabella',title:'Proprietà tabella',menu:'Proprietà tabella',deleteTable:'Cancella Tabella',rows:'Righe',columns:'Colonne',border:'Dimensione bordo',widthPx:'pixel',widthPc:'percento',widthUnit:'unità larghezza',cellSpace:'Spaziatura celle',cellPad:'Padding celle',caption:'Intestazione',summary:'Indice',headers:'Intestazione',headersNone:'Nessuna',headersColumn:'Prima Colonna',headersRow:'Prima Riga',headersBoth:'Entrambe',invalidRows:"Il numero di righe dev'essere un numero maggiore di 0.",invalidCols:"Il numero di colonne dev'essere un numero maggiore di 0.",invalidBorder:"La dimensione del bordo dev'essere un numero.",invalidWidth:"La larghezza della tabella dev'essere un numero.",invalidHeight:"L'altezza della tabella dev'essere un numero.",invalidCellSpacing:"La spaziatura tra le celle dev'essere un numero.",invalidCellPadding:"Il paging delle celle dev'essere un numero",cell:{menu:'Cella',insertBefore:'Inserisci Cella Prima',insertAfter:'Inserisci Cella Dopo',deleteCell:'Elimina celle',merge:'Unisce celle',mergeRight:'Unisci a Destra',mergeDown:'Unisci in Basso',splitHorizontal:'Dividi Cella Orizzontalmente',splitVertical:'Dividi Cella Verticalmente',title:'Proprietà della cella',cellType:'Tipo di cella',rowSpan:'Su più righe',colSpan:'Su più colonne',wordWrap:'Ritorno a capo',hAlign:'Allineamento orizzontale',vAlign:'Allineamento verticale',alignBaseline:'Linea Base',bgColor:'Colore di Sfondo',borderColor:'Colore del Bordo',data:'Dati',header:'Intestazione',yes:'Si',no:'No',invalidWidth:"La larghezza della cella dev'essere un numero.",invalidHeight:"L'altezza della cella dev'essere un numero.",invalidRowSpan:"Il numero di righe dev'essere un numero intero.",invalidColSpan:"Il numero di colonne dev'essere un numero intero.",chooseColor:'Scegli'},row:{menu:'Riga',insertBefore:'Inserisci Riga Prima',insertAfter:'Inserisci Riga Dopo',deleteRow:'Elimina righe'},column:{menu:'Colonna',insertBefore:'Inserisci Colonna Prima',insertAfter:'Inserisci Colonna Dopo',deleteColumn:'Elimina colonne'}},button:{title:'Proprietà bottone',text:'Testo (Valore)',type:'Tipo',typeBtn:'Bottone',typeSbm:'Invio',typeRst:'Annulla'},checkboxAndRadio:{checkboxTitle:'Proprietà checkbox',radioTitle:'Proprietà radio button',value:'Valore',selected:'Selezionato'},form:{title:'Proprietà modulo',menu:'Proprietà modulo',action:'Azione',method:'Metodo',encoding:'Codifica'},select:{title:'Proprietà menu di selezione',selectInfo:'Info',opAvail:'Opzioni disponibili',value:'Valore',size:'Dimensione',lines:'righe',chkMulti:'Permetti selezione multipla',opText:'Testo',opValue:'Valore',btnAdd:'Aggiungi',btnModify:'Modifica',btnUp:'Su',btnDown:'Gi',btnSetValue:'Imposta come predefinito',btnDelete:'Rimuovi'},textarea:{title:'Proprietà area di testo',cols:'Colonne',rows:'Righe'},textfield:{title:'Proprietà campo di testo',name:'Nome',value:'Valore',charWidth:'Larghezza',maxChars:'Numero massimo di caratteri',type:'Tipo',typeText:'Testo',typePass:'Password'},hidden:{title:'Proprietà campo nascosto',name:'Nome',value:'Valore'},image:{title:'Proprietà immagine',titleButton:'Proprietà bottone immagine',menu:'Proprietà immagine',infoTab:'Informazioni immagine',btnUpload:'Invia al server',upload:'Carica',alt:'Testo alternativo',lockRatio:'Blocca rapporto',resetSize:'Reimposta dimensione',border:'Bordo',hSpace:'HSpace',vSpace:'VSpace',alertUrl:"Devi inserire l'URL per l'immagine",linkTab:'Collegamento',button2Img:"Vuoi trasformare il bottone immagine selezionato in un'immagine semplice?",img2Button:"Vuoi trasferomare l'immagine selezionata in un bottone immagine?",urlMissing:"Manca l'URL dell'immagine.",validateBorder:'Il campo Bordo deve essere un numero intero.',validateHSpace:'Il campo HSpace deve essere un numero intero.',validateVSpace:'Il campo VSpace deve essere un numero intero.'},flash:{properties:'Proprietà Oggetto Flash',propertiesTab:'Proprietà',title:'Proprietà Oggetto Flash',chkPlay:'Avvio Automatico',chkLoop:'Riavvio automatico',chkMenu:'Abilita Menu di Flash',chkFull:'Permetti la modalità tutto schermo',scale:'Ridimensiona',scaleAll:'Mostra Tutto',scaleNoBorder:'Senza Bordo',scaleFit:'Dimensione Esatta',access:'Accesso Script',accessAlways:'Sempre',accessSameDomain:'Solo stesso dominio',accessNever:'Mai',alignAbsBottom:'In basso assoluto',alignAbsMiddle:'Centrato assoluto',alignBaseline:'Linea base',alignTextTop:'In alto al testo',quality:'Qualità',qualityBest:'Massima',qualityHigh:'Alta',qualityAutoHigh:'Alta Automatica',qualityMedium:'Intermedia',qualityAutoLow:'Bassa Automatica',qualityLow:'Bassa',windowModeWindow:'Finestra',windowModeOpaque:'Opaca',windowModeTransparent:'Trasparente',windowMode:'Modalità finestra',flashvars:'Variabili per Flash',bgcolor:'Colore sfondo',hSpace:'HSpace',vSpace:'VSpace',validateSrc:"Devi inserire l'URL del collegamento",validateHSpace:"L'HSpace dev'essere un numero.",validateVSpace:"Il VSpace dev'essere un numero."},spellCheck:{toolbar:'Correttore ortografico',title:'Controllo ortografico',notAvailable:'Il servizio non è momentaneamente disponibile.',errorLoading:"Errore nel caricamento dell'host col servizio applicativo: %s.",notInDic:'Non nel dizionario',changeTo:'Cambia in',btnIgnore:'Ignora',btnIgnoreAll:'Ignora tutto',btnReplace:'Cambia',btnReplaceAll:'Cambia tutto',btnUndo:'Annulla',noSuggestions:'- Nessun suggerimento -',progress:'Controllo ortografico in corso',noMispell:'Controllo ortografico completato: nessun errore trovato',noChanges:'Controllo ortografico completato: nessuna parola cambiata',oneChange:'Controllo ortografico completato: 1 parola cambiata',manyChanges:'Controllo ortografico completato: %1 parole cambiate',ieSpellDownload:'Contollo ortografico non installato. Lo vuoi scaricare ora?'},smiley:{toolbar:'Emoticon',title:'Inserisci emoticon',options:'Opzioni Smiley'},elementsPath:{eleLabel:'Percorso degli elementi',eleTitle:'%1 elemento'},numberedlist:'Elenco numerato',bulletedlist:'Elenco puntato',indent:'Aumenta rientro',outdent:'Riduci rientro',justify:{left:'Allinea a sinistra',center:'Centra',right:'Allinea a destra',block:'Giustifica'},blockquote:'Citazione',clipboard:{title:'Incolla',cutError:'Le impostazioni di sicurezza del browser non permettono di tagliare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+X).',copyError:'Le impostazioni di sicurezza del browser non permettono di copiare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+C).',pasteMsg:"Incolla il testo all'interno dell'area sottostante usando la scorciatoia di tastiere (<STRONG>Ctrl/Cmd+V</STRONG>) e premi <STRONG>OK</STRONG>.",securityMsg:"A causa delle impostazioni di sicurezza del browser,l'editor non è in grado di accedere direttamente agli appunti. E' pertanto necessario incollarli di nuovo in questa finestra.",pasteArea:'Incolla'},pastefromword:{confirmCleanup:'Il testo da incollare sembra provenire da Word. Desideri pulirlo prima di incollare?',toolbar:'Incolla da Word',title:'Incolla da Word',error:'Non è stato possibile eliminarre il testo incollato a causa di un errore interno.'},pasteText:{button:'Incolla come testo semplice',title:'Incolla come testo semplice'},templates:{button:'Modelli',title:'Contenuto dei modelli',options:'Opzioni del Modello',insertOption:'Cancella il contenuto corrente',selectPromptMsg:"Seleziona il modello da aprire nell'editor<br />(il contenuto attuale verrà eliminato):",emptyListMsg:'(Nessun modello definito)'},showBlocks:'Visualizza Blocchi',stylesCombo:{label:'Stile',panelTitle:'Stili di formattazione',panelTitle1:'Stili per blocchi',panelTitle2:'Stili in linea',panelTitle3:'Stili per oggetti'},format:{label:'Formato',panelTitle:'Formato',tag_p:'Normale',tag_pre:'Formattato',tag_address:'Indirizzo',tag_h1:'Titolo 1',tag_h2:'Titolo 2',tag_h3:'Titolo 3',tag_h4:'Titolo 4',tag_h5:'Titolo 5',tag_h6:'Titolo 6',tag_div:'Paragrafo (DIV)'},div:{title:'Crea DIV contenitore',toolbar:'Crea DIV contenitore',cssClassInputLabel:'Classi di stile',styleSelectLabel:'Stile',IdInputLabel:'Id',languageCodeInputLabel:'Codice lingua',inlineStyleInputLabel:'Stile Inline',advisoryTitleInputLabel:'Titolo Avviso',langDirLabel:'Direzione di scrittura',langDirLTRLabel:'Da sinistra a destra (LTR)',langDirRTLLabel:'Da destra a sinistra (RTL)',edit:'Modifica DIV',remove:'Rimuovi DIV'},iframe:{title:'Proprietà IFrame',toolbar:'IFrame',noUrl:"Inserire l'URL del campo IFrame",scrolling:'Abilita scrollbar',border:'Mostra il bordo'},font:{label:'Carattere',voiceLabel:'Carattere',panelTitle:'Carattere'},fontSize:{label:'Dimensione',voiceLabel:'Dimensione Carattere',panelTitle:'Dimensione'},colorButton:{textColorTitle:'Colore testo',bgColorTitle:'Colore sfondo',panelTitle:'Colori',auto:'Automatico',more:'Altri colori...'},colors:{'000':'Nero',800000:'Marrone Castagna','8B4513':'Marrone Cuoio','2F4F4F':'Grigio Fumo di Londra','008080':'Acquamarina','000080':'Blu Oceano','4B0082':'Indigo',696969:'Grigio Scuro',B22222:'Giallo Fiamma',A52A2A:'Marrone',DAA520:'Giallo Mimosa','006400':'Verde Scuro','40E0D0':'Turchese','0000CD':'Blue Scuro',800080:'Viola',808080:'Grigio',F00:'Rosso',FF8C00:'Arancio Scuro',FFD700:'Oro','008000':'Verde','0FF':'Ciano','00F':'Blu',EE82EE:'Violetto',A9A9A9:'Grigio Scuro',FFA07A:'Salmone',FFA500:'Arancio',FFFF00:'Giallo','00FF00':'Lime',AFEEEE:'Turchese Chiaro',ADD8E6:'Blu Chiaro',DDA0DD:'Rosso Ciliegia',D3D3D3:'Grigio Chiaro',FFF0F5:'Lavanda Chiara',FAEBD7:'Bianco Antico',FFFFE0:'Giallo Chiaro',F0FFF0:'Verde Mela',F0FFFF:'Azzurro',F0F8FF:'Celeste',E6E6FA:'Lavanda',FFF:'Bianco'},scayt:{title:'Controllo Ortografico Mentre Scrivi',opera_title:'Non supportato da Opera',enable:'Abilita COMS',disable:'Disabilita COMS',about:'About COMS',toggle:'Inverti abilitazione SCOMS',options:'Opzioni',langs:'Lingue',moreSuggestions:'Altri suggerimenti',ignore:'Ignora',ignoreAll:'Ignora tutti',addWord:'Aggiungi Parola',emptyDic:'Il nome del dizionario non può essere vuoto.',optionsTab:'Opzioni',allCaps:'Ignora Parole in maiuscolo',ignoreDomainNames:'Ignora nomi di dominio',mixedCase:'Ignora parole con maiuscole e minuscole',mixedWithDigits:'Ignora parole con numeri',languagesTab:'Lingue',dictionariesTab:'Dizionari',dic_field_name:'Nome del dizionario',dic_create:'Crea',dic_restore:'Ripristina',dic_delete:'Cancella',dic_rename:'Rinomina',dic_info:'Inizialmente il dizionario utente è memorizzato in un Cookie. I Cookie però hanno una dimensioni massima limitata. Quando il dizionario utente creasce a tal punto da non poter più essere memorizzato in un Cookie, allora il dizionario può essere memorizzato sul nostro server. Per memorizzare il proprio dizionario personale sul nostro server, è necessario specificare un nome per il proprio dizionario. Se avete già memorizzato un dizionario, inserite il nome che gli avete dato e premete il pulsante Ripristina.',aboutTab:'Info'},about:{title:'Riguardo CKEditor',dlgTitle:'Riguardo CKEditor',help:"Vedi $1 per l'aiuto.",userGuide:'Guida Utente CKEditor',moreInfo:'Per le informazioni sulla licenza si prega di visitare il nostro sito:',copy:'Copyright © $1. Tutti i diritti riservati.'},maximize:'Massimizza',minimize:'Minimizza',fakeobjects:{anchor:'Ancora',flash:'Animazione Flash',iframe:'IFrame',hiddenfield:'Campo Nascosto',unknown:'Oggetto sconosciuto'},resize:'Trascina per ridimensionare',colordialog:{title:'Selezionare il colore',options:'Opzioni colore',highlight:'Evidenzia',selected:'Seleziona il colore',clear:'cancella'},toolbarCollapse:'Minimizza Toolbar',toolbarExpand:'Espandi Toolbar',toolbarGroups:{document:'Documento',clipboard:'Copia negli appunti/Indietro',editing:'Modifica',forms:'Form',basicstyles:'Stili di base',paragraph:'Paragrafo',links:'Link',insert:'Inserisci',styles:'Stili',colors:'Colori',tools:'Strumenti'},bidi:{ltr:'Direzione del testo da sinistra verso destra',rtl:'Direzione del testo da destra verso sinistra'},docprops:{label:'Proprietà del Documento',title:'Proprietà del Documento',design:'Disegna',meta:'Meta Data',chooseColor:'Scegli',other:'<altro>',docTitle:'Titolo pagina',charset:'Set di caretteri',charsetOther:'Altro set di caretteri',charsetASCII:'ASCII',charsetCE:'Europa Centrale',charsetCT:'Cinese Tradizionale (Big5)',charsetCR:'Cirillico',charsetGR:'Greco',charsetJP:'Giapponese',charsetKR:'Coreano',charsetTR:'Turco',charsetUN:'Unicode (UTF-8)',charsetWE:'Europa Occidentale',docType:'Intestazione DocType',docTypeOther:'Altra intestazione DocType',xhtmlDec:'Includi dichiarazione XHTML',bgColor:'Colore di sfondo',bgImage:'Immagine di sfondo',bgFixed:'Sfondo fissato',txtColor:'Colore testo',margin:'Margini',marginTop:'In Alto',marginLeft:'A Sinistra',marginRight:'A Destra',marginBottom:'In Basso',metaKeywords:'Chiavi di indicizzazione documento (separate da virgola)',metaDescription:'Descrizione documento',metaAuthor:'Autore',metaCopyright:'Copyright',previewHtml:'<p>Questo è un <strong>testo di esempio</strong>. State usando <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.it={dir:'ltr',editorTitle:'Editor di testo Rich Text, %1',editorHelp:'Premi ALT 0 per aiuto',toolbars:'Editor toolbar',editor:'Rich Text Editor',source:'Codice Sorgente',newPage:'Nuova pagina vuota',save:'Salva',preview:'Anteprima',cut:'Taglia',copy:'Copia',paste:'Incolla',print:'Stampa',underline:'Sottolineato',bold:'Grassetto',italic:'Corsivo',selectAll:'Seleziona tutto',removeFormat:'Elimina formattazione',strike:'Barrato',subscript:'Pedice',superscript:'Apice',horizontalrule:'Inserisci riga orizzontale',pagebreak:'Inserisci interruzione di pagina',pagebreakAlt:'Interruzione di pagina',unlink:'Elimina collegamento',undo:'Annulla',redo:'Ripristina',common:{browseServer:'Cerca sul server',url:'URL',protocol:'Protocollo',upload:'Carica',uploadSubmit:'Invia al server',image:'Immagine',flash:'Oggetto Flash',form:'Modulo',checkbox:'Checkbox',radio:'Radio Button',textField:'Campo di testo',textarea:'Area di testo',hiddenField:'Campo nascosto',button:'Bottone',select:'Menu di selezione',imageButton:'Bottone immagine',notSet:'<non impostato>',id:'Id',name:'Nome',langDir:'Direzione scrittura',langDirLtr:'Da Sinistra a Destra (LTR)',langDirRtl:'Da Destra a Sinistra (RTL)',langCode:'Codice Lingua',longDescr:'URL descrizione estesa',cssClass:'Nome classe CSS',advisoryTitle:'Titolo',cssStyle:'Stile',ok:'OK',cancel:'Annulla',close:'Chiudi',preview:'Anteprima',generalTab:'Generale',advancedTab:'Avanzate',validateNumberFailed:'Il valore inserito non è un numero.',confirmNewPage:'Ogni modifica non salvata sarà persa. Sei sicuro di voler caricare una nuova pagina?',confirmCancel:'Alcune delle opzioni sono state cambiate. Sei sicuro di voler chiudere la finestra di dialogo?',options:'Opzioni',target:'Destinazione',targetNew:'Nuova finestra (_blank)',targetTop:'Finestra in primo piano (_top)',targetSelf:'Stessa finestra (_self)',targetParent:'Finestra Padre (_parent)',langDirLTR:'Da sinistra a destra (LTR)',langDirRTL:'Da destra a sinistra (RTL)',styles:'Stile',cssClasses:'Classi di stile',width:'Larghezza',height:'Altezza',align:'Allineamento',alignLeft:'Sinistra',alignRight:'Destra',alignCenter:'Centrato',alignTop:'In Alto',alignMiddle:'Centrato',alignBottom:'In Basso',invalidHeight:"L'altezza dev'essere un numero",invalidWidth:"La Larghezza dev'essere un numero",invalidCssLength:'Il valore indicato per il campo "%1" deve essere un numero positivo con o senza indicazione di una valida unità di misura per le classi CSS (px, %, in, cm, mm, em, ex, pt, o pc).',invalidHtmlLength:'Il valore indicato per il campo "%1" deve essere un numero positivo con o senza indicazione di una valida unità di misura per le pagine HTML (px o %).',invalidInlineStyle:'Il valore specificato per lo stile inline deve consistere in una o più tuple con il formato di "name : value", separati da semicolonne.',cssLengthTooltip:'Inserisci un numero per il valore in pixel oppure un numero con una valida unità CSS (px, %, in, cm, mm, ex, pt, o pc).',unavailable:'%1<span class="cke_accessibility">, non disponibile</span>'},contextmenu:{options:'Opzioni del menù contestuale'},specialChar:{toolbar:'Inserisci carattere speciale',title:'Seleziona carattere speciale',options:'Opzioni carattere speciale'},link:{toolbar:'Inserisci/Modifica collegamento',other:'<altro>',menu:'Modifica collegamento',title:'Collegamento',info:'Informazioni collegamento',target:'Destinazione',upload:'Carica',advanced:'Avanzate',type:'Tipo di Collegamento',toUrl:'URL',toAnchor:'Ancora nella pagina',toEmail:'E-Mail',targetFrame:'<riquadro>',targetPopup:'<finestra popup>',targetFrameName:'Nome del riquadro di destinazione',targetPopupName:'Nome finestra popup',popupFeatures:'Caratteristiche finestra popup',popupResizable:'Ridimensionabile',popupStatusBar:'Barra di stato',popupLocationBar:'Barra degli indirizzi',popupToolbar:'Barra degli strumenti',popupMenuBar:'Barra del menu',popupFullScreen:'A tutto schermo (IE)',popupScrollBars:'Barre di scorrimento',popupDependent:'Dipendente (Netscape)',popupLeft:'Posizione da sinistra',popupTop:"Posizione dall'alto",id:'Id',langDir:'Direzione scrittura',langDirLTR:'Da Sinistra a Destra (LTR)',langDirRTL:'Da Destra a Sinistra (RTL)',acccessKey:'Scorciatoia<br />da tastiera',name:'Nome',langCode:'Direzione scrittura',tabIndex:'Ordine di tabulazione',advisoryTitle:'Titolo',advisoryContentType:'Tipo della risorsa collegata',cssClasses:'Nome classe CSS',charset:'Set di caretteri della risorsa collegata',styles:'Stile',rel:'Relazioni',selectAnchor:'Scegli Ancora',anchorName:'Per Nome',anchorId:'Per id elemento',emailAddress:'Indirizzo E-Mail',emailSubject:'Oggetto del messaggio',emailBody:'Corpo del messaggio',noAnchors:'(Nessuna ancora disponibile nel documento)',noUrl:"Devi inserire l'URL del collegamento",noEmail:"Devi inserire un'indirizzo e-mail"},anchor:{toolbar:'Inserisci/Modifica Ancora',menu:'Proprietà ancora',title:'Proprietà ancora',name:'Nome ancora',errorName:"Inserici il nome dell'ancora",remove:"Rimuovi l'ancora"},list:{numberedTitle:'Proprietà liste numerate',bulletedTitle:'Proprietà liste puntate',type:'Tipo',start:'Inizio',validateStartNumber:'Il numero di inizio di una lista numerata deve essere un numero intero.',circle:'Cerchio',disc:'Disco',square:'Quadrato',none:'Nessuno',notset:'<non impostato>',armenian:'Numerazione Armena',georgian:'Numerazione Georgiana (an, ban, gan, ecc.)',lowerRoman:'Numerazione Romana minuscola (i, ii, iii, iv, v, ecc.)',upperRoman:'Numerazione Romana maiuscola (I, II, III, IV, V, ecc.)',lowerAlpha:'Alfabetico minuscolo (a, b, c, d, e, ecc.)',upperAlpha:'Alfabetico maiuscolo (A, B, C, D, E, ecc.)',lowerGreek:'Greco minuscolo (alpha, beta, gamma, ecc.)',decimal:'Decimale (1, 2, 3, ecc.)',decimalLeadingZero:'Decimale preceduto da 0 (01, 02, 03, ecc.)'},findAndReplace:{title:'Cerca e Sostituisci',find:'Trova',replace:'Sostituisci',findWhat:'Trova:',replaceWith:'Sostituisci con:',notFoundMsg:"L'elemento cercato non è stato trovato.",findOptions:'Opzioni di ricerca',matchCase:'Maiuscole/minuscole',matchWord:'Solo parole intere',matchCyclic:'Ricerca ciclica',replaceAll:'Sostituisci tutto',replaceSuccessMsg:'%1 occorrenza(e) sostituite.'},table:{toolbar:'Tabella',title:'Proprietà tabella',menu:'Proprietà tabella',deleteTable:'Cancella Tabella',rows:'Righe',columns:'Colonne',border:'Dimensione bordo',widthPx:'pixel',widthPc:'percento',widthUnit:'unità larghezza',cellSpace:'Spaziatura celle',cellPad:'Padding celle',caption:'Intestazione',summary:'Indice',headers:'Intestazione',headersNone:'Nessuna',headersColumn:'Prima Colonna',headersRow:'Prima Riga',headersBoth:'Entrambe',invalidRows:"Il numero di righe dev'essere un numero maggiore di 0.",invalidCols:"Il numero di colonne dev'essere un numero maggiore di 0.",invalidBorder:"La dimensione del bordo dev'essere un numero.",invalidWidth:"La larghezza della tabella dev'essere un numero.",invalidHeight:"L'altezza della tabella dev'essere un numero.",invalidCellSpacing:"La spaziatura tra le celle dev'essere un numero.",invalidCellPadding:"Il paging delle celle dev'essere un numero",cell:{menu:'Cella',insertBefore:'Inserisci Cella Prima',insertAfter:'Inserisci Cella Dopo',deleteCell:'Elimina celle',merge:'Unisce celle',mergeRight:'Unisci a Destra',mergeDown:'Unisci in Basso',splitHorizontal:'Dividi Cella Orizzontalmente',splitVertical:'Dividi Cella Verticalmente',title:'Proprietà della cella',cellType:'Tipo di cella',rowSpan:'Su più righe',colSpan:'Su più colonne',wordWrap:'Ritorno a capo',hAlign:'Allineamento orizzontale',vAlign:'Allineamento verticale',alignBaseline:'Linea Base',bgColor:'Colore di Sfondo',borderColor:'Colore del Bordo',data:'Dati',header:'Intestazione',yes:'Si',no:'No',invalidWidth:"La larghezza della cella dev'essere un numero.",invalidHeight:"L'altezza della cella dev'essere un numero.",invalidRowSpan:"Il numero di righe dev'essere un numero intero.",invalidColSpan:"Il numero di colonne dev'essere un numero intero.",chooseColor:'Scegli'},row:{menu:'Riga',insertBefore:'Inserisci Riga Prima',insertAfter:'Inserisci Riga Dopo',deleteRow:'Elimina righe'},column:{menu:'Colonna',insertBefore:'Inserisci Colonna Prima',insertAfter:'Inserisci Colonna Dopo',deleteColumn:'Elimina colonne'}},button:{title:'Proprietà bottone',text:'Testo (Valore)',type:'Tipo',typeBtn:'Bottone',typeSbm:'Invio',typeRst:'Annulla'},checkboxAndRadio:{checkboxTitle:'Proprietà checkbox',radioTitle:'Proprietà radio button',value:'Valore',selected:'Selezionato'},form:{title:'Proprietà modulo',menu:'Proprietà modulo',action:'Azione',method:'Metodo',encoding:'Codifica'},select:{title:'Proprietà menu di selezione',selectInfo:'Info',opAvail:'Opzioni disponibili',value:'Valore',size:'Dimensione',lines:'righe',chkMulti:'Permetti selezione multipla',opText:'Testo',opValue:'Valore',btnAdd:'Aggiungi',btnModify:'Modifica',btnUp:'Su',btnDown:'Gi',btnSetValue:'Imposta come predefinito',btnDelete:'Rimuovi'},textarea:{title:'Proprietà area di testo',cols:'Colonne',rows:'Righe'},textfield:{title:'Proprietà campo di testo',name:'Nome',value:'Valore',charWidth:'Larghezza',maxChars:'Numero massimo di caratteri',type:'Tipo',typeText:'Testo',typePass:'Password'},hidden:{title:'Proprietà campo nascosto',name:'Nome',value:'Valore'},image:{title:'Proprietà immagine',titleButton:'Proprietà bottone immagine',menu:'Proprietà immagine',infoTab:'Informazioni immagine',btnUpload:'Invia al server',upload:'Carica',alt:'Testo alternativo',lockRatio:'Blocca rapporto',resetSize:'Reimposta dimensione',border:'Bordo',hSpace:'HSpace',vSpace:'VSpace',alertUrl:"Devi inserire l'URL per l'immagine",linkTab:'Collegamento',button2Img:"Vuoi trasformare il bottone immagine selezionato in un'immagine semplice?",img2Button:"Vuoi trasferomare l'immagine selezionata in un bottone immagine?",urlMissing:"Manca l'URL dell'immagine.",validateBorder:'Il campo Bordo deve essere un numero intero.',validateHSpace:'Il campo HSpace deve essere un numero intero.',validateVSpace:'Il campo VSpace deve essere un numero intero.'},flash:{properties:'Proprietà Oggetto Flash',propertiesTab:'Proprietà',title:'Proprietà Oggetto Flash',chkPlay:'Avvio Automatico',chkLoop:'Riavvio automatico',chkMenu:'Abilita Menu di Flash',chkFull:'Permetti la modalità tutto schermo',scale:'Ridimensiona',scaleAll:'Mostra Tutto',scaleNoBorder:'Senza Bordo',scaleFit:'Dimensione Esatta',access:'Accesso Script',accessAlways:'Sempre',accessSameDomain:'Solo stesso dominio',accessNever:'Mai',alignAbsBottom:'In basso assoluto',alignAbsMiddle:'Centrato assoluto',alignBaseline:'Linea base',alignTextTop:'In alto al testo',quality:'Qualità',qualityBest:'Massima',qualityHigh:'Alta',qualityAutoHigh:'Alta Automatica',qualityMedium:'Intermedia',qualityAutoLow:'Bassa Automatica',qualityLow:'Bassa',windowModeWindow:'Finestra',windowModeOpaque:'Opaca',windowModeTransparent:'Trasparente',windowMode:'Modalità finestra',flashvars:'Variabili per Flash',bgcolor:'Colore sfondo',hSpace:'HSpace',vSpace:'VSpace',validateSrc:"Devi inserire l'URL del collegamento",validateHSpace:"L'HSpace dev'essere un numero.",validateVSpace:"Il VSpace dev'essere un numero."},spellCheck:{toolbar:'Correttore ortografico',title:'Controllo ortografico',notAvailable:'Il servizio non è momentaneamente disponibile.',errorLoading:"Errore nel caricamento dell'host col servizio applicativo: %s.",notInDic:'Non nel dizionario',changeTo:'Cambia in',btnIgnore:'Ignora',btnIgnoreAll:'Ignora tutto',btnReplace:'Cambia',btnReplaceAll:'Cambia tutto',btnUndo:'Annulla',noSuggestions:'- Nessun suggerimento -',progress:'Controllo ortografico in corso',noMispell:'Controllo ortografico completato: nessun errore trovato',noChanges:'Controllo ortografico completato: nessuna parola cambiata',oneChange:'Controllo ortografico completato: 1 parola cambiata',manyChanges:'Controllo ortografico completato: %1 parole cambiate',ieSpellDownload:'Contollo ortografico non installato. Lo vuoi scaricare ora?'},smiley:{toolbar:'Emoticon',title:'Inserisci emoticon',options:'Opzioni Smiley'},elementsPath:{eleLabel:'Percorso degli elementi',eleTitle:'%1 elemento'},numberedlist:'Elenco numerato',bulletedlist:'Elenco puntato',indent:'Aumenta rientro',outdent:'Riduci rientro',justify:{left:'Allinea a sinistra',center:'Centra',right:'Allinea a destra',block:'Giustifica'},blockquote:'Citazione',clipboard:{title:'Incolla',cutError:'Le impostazioni di sicurezza del browser non permettono di tagliare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+X).',copyError:'Le impostazioni di sicurezza del browser non permettono di copiare automaticamente il testo. Usa la tastiera (Ctrl/Cmd+C).',pasteMsg:"Incolla il testo all'interno dell'area sottostante usando la scorciatoia di tastiere (<STRONG>Ctrl/Cmd+V</STRONG>) e premi <STRONG>OK</STRONG>.",securityMsg:"A causa delle impostazioni di sicurezza del browser,l'editor non è in grado di accedere direttamente agli appunti. E' pertanto necessario incollarli di nuovo in questa finestra.",pasteArea:'Incolla'},pastefromword:{confirmCleanup:'Il testo da incollare sembra provenire da Word. Desideri pulirlo prima di incollare?',toolbar:'Incolla da Word',title:'Incolla da Word',error:'Non è stato possibile eliminarre il testo incollato a causa di un errore interno.'},pasteText:{button:'Incolla come testo semplice',title:'Incolla come testo semplice'},templates:{button:'Modelli',title:'Contenuto dei modelli',options:'Opzioni del Modello',insertOption:'Cancella il contenuto corrente',selectPromptMsg:"Seleziona il modello da aprire nell'editor<br />(il contenuto attuale verrà eliminato):",emptyListMsg:'(Nessun modello definito)'},showBlocks:'Visualizza Blocchi',stylesCombo:{label:'Stile',panelTitle:'Stili di formattazione',panelTitle1:'Stili per blocchi',panelTitle2:'Stili in linea',panelTitle3:'Stili per oggetti'},format:{label:'Formato',panelTitle:'Formato',tag_p:'Normale',tag_pre:'Formattato',tag_address:'Indirizzo',tag_h1:'Titolo 1',tag_h2:'Titolo 2',tag_h3:'Titolo 3',tag_h4:'Titolo 4',tag_h5:'Titolo 5',tag_h6:'Titolo 6',tag_div:'Paragrafo (DIV)'},div:{title:'Crea DIV contenitore',toolbar:'Crea DIV contenitore',cssClassInputLabel:'Classi di stile',styleSelectLabel:'Stile',IdInputLabel:'Id',languageCodeInputLabel:'Codice lingua',inlineStyleInputLabel:'Stile Inline',advisoryTitleInputLabel:'Titolo Avviso',langDirLabel:'Direzione di scrittura',langDirLTRLabel:'Da sinistra a destra (LTR)',langDirRTLLabel:'Da destra a sinistra (RTL)',edit:'Modifica DIV',remove:'Rimuovi DIV'},iframe:{title:'Proprietà IFrame',toolbar:'IFrame',noUrl:"Inserire l'URL del campo IFrame",scrolling:'Abilita scrollbar',border:'Mostra il bordo'},font:{label:'Carattere',voiceLabel:'Carattere',panelTitle:'Carattere'},fontSize:{label:'Dimensione',voiceLabel:'Dimensione Carattere',panelTitle:'Dimensione'},colorButton:{textColorTitle:'Colore testo',bgColorTitle:'Colore sfondo',panelTitle:'Colori',auto:'Automatico',more:'Altri colori...'},colors:{'000':'Nero',800000:'Marrone Castagna','8B4513':'Marrone Cuoio','2F4F4F':'Grigio Fumo di Londra','008080':'Acquamarina','000080':'Blu Oceano','4B0082':'Indigo',696969:'Grigio Scuro',B22222:'Giallo Fiamma',A52A2A:'Marrone',DAA520:'Giallo Mimosa','006400':'Verde Scuro','40E0D0':'Turchese','0000CD':'Blue Scuro',800080:'Viola',808080:'Grigio',F00:'Rosso',FF8C00:'Arancio Scuro',FFD700:'Oro','008000':'Verde','0FF':'Ciano','00F':'Blu',EE82EE:'Violetto',A9A9A9:'Grigio Scuro',FFA07A:'Salmone',FFA500:'Arancio',FFFF00:'Giallo','00FF00':'Lime',AFEEEE:'Turchese Chiaro',ADD8E6:'Blu Chiaro',DDA0DD:'Rosso Ciliegia',D3D3D3:'Grigio Chiaro',FFF0F5:'Lavanda Chiara',FAEBD7:'Bianco Antico',FFFFE0:'Giallo Chiaro',F0FFF0:'Verde Mela',F0FFFF:'Azzurro',F0F8FF:'Celeste',E6E6FA:'Lavanda',FFF:'Bianco'},scayt:{title:'Controllo Ortografico Mentre Scrivi',opera_title:'Non supportato da Opera',enable:'Abilita COMS',disable:'Disabilita COMS',about:'About COMS',toggle:'Inverti abilitazione SCOMS',options:'Opzioni',langs:'Lingue',moreSuggestions:'Altri suggerimenti',ignore:'Ignora',ignoreAll:'Ignora tutti',addWord:'Aggiungi Parola',emptyDic:'Il nome del dizionario non può essere vuoto.',optionsTab:'Opzioni',allCaps:'Ignora Parole in maiuscolo',ignoreDomainNames:'Ignora nomi di dominio',mixedCase:'Ignora parole con maiuscole e minuscole',mixedWithDigits:'Ignora parole con numeri',languagesTab:'Lingue',dictionariesTab:'Dizionari',dic_field_name:'Nome del dizionario',dic_create:'Crea',dic_restore:'Ripristina',dic_delete:'Cancella',dic_rename:'Rinomina',dic_info:'Inizialmente il dizionario utente è memorizzato in un Cookie. I Cookie però hanno una dimensioni massima limitata. Quando il dizionario utente creasce a tal punto da non poter più essere memorizzato in un Cookie, allora il dizionario può essere memorizzato sul nostro server. Per memorizzare il proprio dizionario personale sul nostro server, è necessario specificare un nome per il proprio dizionario. Se avete già memorizzato un dizionario, inserite il nome che gli avete dato e premete il pulsante Ripristina.',aboutTab:'Info'},about:{title:'Riguardo CKEditor',dlgTitle:'Riguardo CKEditor',help:"Vedi $1 per l'aiuto.",userGuide:'Guida Utente CKEditor',moreInfo:'Per le informazioni sulla licenza si prega di visitare il nostro sito:',copy:'Copyright © $1. Tutti i diritti riservati.'},maximize:'Massimizza',minimize:'Minimizza',fakeobjects:{anchor:'Ancora',flash:'Animazione Flash',iframe:'IFrame',hiddenfield:'Campo Nascosto',unknown:'Oggetto sconosciuto'},resize:'Trascina per ridimensionare',colordialog:{title:'Selezionare il colore',options:'Opzioni colore',highlight:'Evidenzia',selected:'Seleziona il colore',clear:'cancella'},toolbarCollapse:'Minimizza Toolbar',toolbarExpand:'Espandi Toolbar',toolbarGroups:{document:'Documento',clipboard:'Copia negli appunti/Indietro',editing:'Modifica',forms:'Form',basicstyles:'Stili di base',paragraph:'Paragrafo',links:'Link',insert:'Inserisci',styles:'Stili',colors:'Colori',tools:'Strumenti'},bidi:{ltr:'Direzione del testo da sinistra verso destra',rtl:'Direzione del testo da destra verso sinistra'},docprops:{label:'Proprietà del Documento',title:'Proprietà del Documento',design:'Disegna',meta:'Meta Data',chooseColor:'Scegli',other:'<altro>',docTitle:'Titolo pagina',charset:'Set di caretteri',charsetOther:'Altro set di caretteri',charsetASCII:'ASCII',charsetCE:'Europa Centrale',charsetCT:'Cinese Tradizionale (Big5)',charsetCR:'Cirillico',charsetGR:'Greco',charsetJP:'Giapponese',charsetKR:'Coreano',charsetTR:'Turco',charsetUN:'Unicode (UTF-8)',charsetWE:'Europa Occidentale',docType:'Intestazione DocType',docTypeOther:'Altra intestazione DocType',xhtmlDec:'Includi dichiarazione XHTML',bgColor:'Colore di sfondo',bgImage:'Immagine di sfondo',bgFixed:'Sfondo fissato',txtColor:'Colore testo',margin:'Margini',marginTop:'In Alto',marginLeft:'A Sinistra',marginRight:'A Destra',marginBottom:'In Basso',metaKeywords:'Chiavi di indicizzazione documento (separate da virgola)',metaDescription:'Descrizione documento',metaAuthor:'Autore',metaCopyright:'Copyright',previewHtml:'<p>Questo è un <strong>testo di esempio</strong>. State usando <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ja.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ja.js
index 48cdb54..1e2054d 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ja.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ja.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.ja={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'リッチテキストエディタ',source:'ソース',newPage:'新しいページ',save:'保存',preview:'プレビュー',cut:'切り取り',copy:'コピー',paste:'貼り付け',print:'印刷',underline:'下線',bold:'太字',italic:'斜体',selectAll:'すべて選択',removeFormat:'フォーマット削除',strike:'打ち消し線',subscript:'添え字',superscript:'上付き文字',horizontalrule:'横罫線',pagebreak:'改ページ挿入',pagebreakAlt:'Page Break',unlink:'リンク削除',undo:'元に戻す',redo:'やり直し',common:{browseServer:'サーバーブラウザー',url:'URL',protocol:'プロトコル',upload:'アップロード',uploadSubmit:'サーバーに送信',image:'イメージ',flash:'Flash',form:'フォーム',checkbox:'チェックボックス',radio:'ラジオボタン',textField:'1行テキスト',textarea:'テキストエリア',hiddenField:'不可視フィールド',button:'ボタン',select:'選択フィールド',imageButton:'画像ボタン',notSet:'<なし>',id:'Id',name:'Name属性',langDir:'文字表記の方向',langDirLtr:'左から右 (LTR)',langDirRtl:'右から左 (RTL)',langCode:'言語コード',longDescr:'longdesc属性(長文説明)',cssClass:'スタイルシートクラス',advisoryTitle:'Title属性',cssStyle:'スタイルシート',ok:'OK',cancel:'キャンセル',close:'閉じる',preview:'プレビュー',generalTab:'全般',advancedTab:'高度な設定',validateNumberFailed:'値が数ではありません',confirmNewPage:'変更内容を保存せず、 新しいページを開いてもよろしいでしょうか?',confirmCancel:'オプション設定を変更しました。ダイアログを閉じてもよろしいでしょうか?',options:'オプション',target:'ターゲット',targetNew:'新しいウィンドウ (_空白)',targetTop:'最上部ウィンドウ (_トップ)',targetSelf:'同じウィンドウ (_同一)',targetParent:'親ウィンドウ (_親)',langDirLTR:'左から右 (LTR)',langDirRTL:'右から左 (RTL)',styles:'スタイル',cssClasses:'スタイルシートクラス',width:'幅',height:'高さ',align:'行揃え',alignLeft:'左',alignRight:'右',alignCenter:'中央',alignTop:'上',alignMiddle:'中央',alignBottom:'下',invalidHeight:'高さは数値で入力してください。',invalidWidth:'幅は数値で入力してください。',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, 利用不可能</span>'},contextmenu:{options:'コンテキストメニューオプション'},specialChar:{toolbar:'特殊文字挿入',title:'特殊文字選択',options:'特殊文字オプション'},link:{toolbar:'リンク挿入/編集',other:'<その他の>',menu:'リンク編集',title:'ハイパーリンク',info:'ハイパーリンク 情報',target:'ターゲット',upload:'アップロード',advanced:'高度な設定',type:'リンクタイプ',toUrl:'URL',toAnchor:'このページのアンカー',toEmail:'E-Mail',targetFrame:'<フレーム>',targetPopup:'<ポップアップウィンドウ>',targetFrameName:'目的のフレーム名',targetPopupName:'ポップアップウィンドウ名',popupFeatures:'ポップアップウィンドウ特徴',popupResizable:'サイズ可変',popupStatusBar:'ステータスバー',popupLocationBar:'ロケーションバー',popupToolbar:'ツールバー',popupMenuBar:'メニューバー',popupFullScreen:'全画面モード(IE)',popupScrollBars:'スクロールバー',popupDependent:'開いたウィンドウに連動して閉じる (Netscape)',popupLeft:'左端からの座標で指定',popupTop:'上端からの座標で指定',id:'Id',langDir:'文字表記の方向',langDirLTR:'左から右 (LTR)',langDirRTL:'右から左 (RTL)',acccessKey:'アクセスキー',name:'Name属性',langCode:'言語コード',tabIndex:'タブインデックス',advisoryTitle:'Title属性',advisoryContentType:'Content Type属性',cssClasses:'スタイルシートクラス',charset:'リンクcharset属性',styles:'スタイルシート',rel:'Relationship',selectAnchor:'アンカーを選択',anchorName:'アンカー名',anchorId:'エレメントID',emailAddress:'E-Mail アドレス',emailSubject:'件名',emailBody:'本文',noAnchors:'(ドキュメントにおいて利用可能なアンカーはありません。)',noUrl:'リンクURLを入力してください。',noEmail:'メールアドレスを入力してください。'},anchor:{toolbar:'アンカー挿入/編集',menu:'アンカー プロパティ',title:'アンカー プロパティ',name:'アンカー名',errorName:'アンカー名を必ず入力してください。',remove:'Remove Anchor'},list:{numberedTitle:'段落番号 プロパティ',bulletedTitle:'箇条書き プロパティ',type:'タイプ',start:'開始',validateStartNumber:'リスト開始番号は数値で入力してください。',circle:'白丸',disc:'黒丸',square:'四角',none:'なし',notset:'<なし>',armenian:'アルメニア数字',georgian:'グルジア数字 (an, ban, gan, etc.)',lowerRoman:'小文字ローマ数字 (i, ii, iii, iv, v, etc.)',upperRoman:'大文字ローマ数字 (I, II, III, IV, V, etc.)',lowerAlpha:'小文字アルファベット (a, b, c, d, e, etc.)',upperAlpha:'大文字アルファベット (A, B, C, D, E, etc.)',lowerGreek:'小文字ギリシャ文字 (alpha, beta, gamma, etc.)',decimal:'数字 (1, 2, 3, etc.)',decimalLeadingZero:'上位桁に0をつけた数字 (01, 02, 03, etc.)'},findAndReplace:{title:'検索して置換',find:'検索',replace:'置き換え',findWhat:'検索する文字列:',replaceWith:'置換えする文字列:',notFoundMsg:'指定された文字列は見つかりませんでした。',findOptions:'Find Options',matchCase:'大文字と小文字を区別する',matchWord:'単語単位で探す',matchCyclic:'一周する',replaceAll:'すべて置換え',replaceSuccessMsg:'%1 個置換しました。'},table:{toolbar:'テーブル',title:'テーブル プロパティ',menu:'テーブル プロパティ',deleteTable:'テーブル削除',rows:'行',columns:'列',border:'ボーダーサイズ',widthPx:'ピクセル',widthPc:'パーセント',widthUnit:'ユニット',cellSpace:'セル内余白',cellPad:'セル内間隔',caption:'キャプション',summary:'テーブルの概要',headers:'テーブルヘッダ(th)',headersNone:'なし',headersColumn:'初めの列のみ',headersRow:'初めの行のみ',headersBoth:'両方',invalidRows:'行は0より大きな数値で入力してください。',invalidCols:'列は0より大きな数値で入力してください。',invalidBorder:'ボーダーサイズは数値で入力してください。',invalidWidth:'幅は数値で入力してください。',invalidHeight:'高さは数値で入力してください。',invalidCellSpacing:'セル内余白は数値で入力してください。',invalidCellPadding:'セル内間隔は数値で入力してください。',cell:{menu:'セル',insertBefore:'セルの前に挿入',insertAfter:'セルの後に挿入',deleteCell:'セル削除',merge:'セル結合',mergeRight:'右に結合',mergeDown:'下に結合',splitHorizontal:'セルを水平方向分割',splitVertical:'セルを垂直方向に分割',title:'セルプロパティ',cellType:'セルタイプ',rowSpan:'縦幅(行数)',colSpan:'横幅(列数)',wordWrap:'折り返し',hAlign:'セル横の整列',vAlign:'セル縦の整列',alignBaseline:'ベースライン',bgColor:'背景色',borderColor:'ボーダーカラー',data:'テーブルデータ(td)',header:'テーブルヘッダ(th)',yes:'Yes',no:'No',invalidWidth:'セル幅は数値で入力してください。',invalidHeight:'セル高さは数値で入力してください。',invalidRowSpan:'縦幅(行数)は数値で入力してください。',invalidColSpan:'横幅(列数)は数値で入力してください。',chooseColor:'色の選択'},row:{menu:'行',insertBefore:'行の前に挿入',insertAfter:'行の後に挿入',deleteRow:'行削除'},column:{menu:'カラム',insertBefore:'カラムの前に挿入',insertAfter:'カラムの後に挿入',deleteColumn:'列削除'}},button:{title:'ボタン プロパティ',text:'テキスト (値)',type:'タイプ',typeBtn:'ボタン',typeSbm:'送信',typeRst:'リセット'},checkboxAndRadio:{checkboxTitle:'チェックボックス プロパティ',radioTitle:'ラジオボタン プロパティ',value:'値',selected:'選択済み'},form:{title:'フォーム プロパティ',menu:'フォーム プロパティ',action:'アクション',method:'メソッド',encoding:'エンコーディング'},select:{title:'選択フィールド プロパティ',selectInfo:'情報',opAvail:'利用可能なオプション',value:'選択項目値',size:'サイズ',lines:'行',chkMulti:'複数項目選択を許可',opText:'選択項目名',opValue:'値',btnAdd:'追加',btnModify:'編集',btnUp:'上へ',btnDown:'下へ',btnSetValue:'選択した値を設定',btnDelete:'削除'},textarea:{title:'テキストエリア プロパティ',cols:'列',rows:'行'},textfield:{title:'1行テキスト プロパティ',name:'名前',value:'値',charWidth:'サイズ',maxChars:'最大長',type:'タイプ',typeText:'テキスト',typePass:'パスワード入力'},hidden:{title:'不可視フィールド プロパティ',name:'名前',value:'値'},image:{title:'イメージ プロパティ',titleButton:'画像ボタン プロパティ',menu:'イメージ プロパティ',infoTab:'イメージ 情報',btnUpload:'サーバーに送信',upload:'アップロード',alt:'代替テキスト',lockRatio:'ロック比率',resetSize:'サイズリセット',border:'ボーダー',hSpace:'横間隔',vSpace:'縦間隔',alertUrl:'イメージのURLを入力してください。',linkTab:'リンク',button2Img:'選択したボタンを画像に置き換えますか?',img2Button:'選択した画像をボタンに置き換えますか?',urlMissing:'イメージのURLを入力してください。',validateBorder:'ボーダーは数値で入力してください。',validateHSpace:'横間隔は数値で入力してください。',validateVSpace:'縦間隔は数値で入力してください。'},flash:{properties:'Flash プロパティ',propertiesTab:'プロパティ',title:'Flash プロパティ',chkPlay:'再生',chkLoop:'ループ再生',chkMenu:'Flashメニュー可能',chkFull:'フルスクリーン許可',scale:'拡大縮小設定',scaleAll:'すべて表示',scaleNoBorder:'外が見えない様に拡大',scaleFit:'上下左右にフィット',access:'スプリクトアクセス(AllowScriptAccess)',accessAlways:'すべての場合に通信可能(Always)',accessSameDomain:'同一ドメインのみに通信可能(Same domain)',accessNever:'すべての場合に通信不可能(Never)',alignAbsBottom:'下部(絶対的)',alignAbsMiddle:'中央(絶対的)',alignBaseline:'ベースライン',alignTextTop:'テキスト上部',quality:'画質',qualityBest:'品質優先',qualityHigh:'高',qualityAutoHigh:'自動/高',qualityMedium:'中',qualityAutoLow:'自動/低',qualityLow:'低',windowModeWindow:'標準',windowModeOpaque:'背景を不透明設定',windowModeTransparent:'背景を透過設定',windowMode:'ウィンドウモード',flashvars:'フラッシュに渡す変数(FlashVars)',bgcolor:'背景色',hSpace:'横間隔',vSpace:'縦間隔',validateSrc:'リンクURLを入力してください。',validateHSpace:'横間隔は数値で入力してください。',validateVSpace:'縦間隔は数値で入力してください。'},spellCheck:{toolbar:'スペルチェック',title:'スペルチェック',notAvailable:'申し訳ありません、現在サービスを利用することができません',errorLoading:'アプリケーションサービスホスト読込みエラー: %s.',notInDic:'辞書にありません',changeTo:'変更',btnIgnore:'無視',btnIgnoreAll:'すべて無視',btnReplace:'置換',btnReplaceAll:'すべて置換',btnUndo:'やり直し',noSuggestions:'- 該当なし -',progress:'スペルチェック処理中...',noMispell:'スペルチェック完了: スペルの誤りはありませんでした',noChanges:'スペルチェック完了: 語句は変更されませんでした',oneChange:'スペルチェック完了: 1語句変更されました',manyChanges:'スペルチェック完了: %1 語句変更されました',ieSpellDownload:'スペルチェッカーがインストールされていません。今すぐダウンロードしますか?'},smiley:{toolbar:'絵文字',title:'顔文字挿入',options:'絵文字オプション'},elementsPath:{eleLabel:'エレメントパス',eleTitle:'%1 エレメント'},numberedlist:'段落番号',bulletedlist:'箇条書き',indent:'インデント',outdent:'インデント解除',justify:{left:'左揃え',center:'中央揃え',right:'右揃え',block:'両端揃え'},blockquote:'ブロック引用',clipboard:{title:'貼り付け',cutError:'ブラウザーのセキュリティ設定によりエディタの切り取り操作が自動で実行することができません。実行するには手動でキーボードの(Ctrl/Cmd+X)を使用してください。',copyError:'ブラウザーのセキュリティ設定によりエディタのコピー操作が自動で実行することができません。実行するには手動でキーボードの(Ctrl/Cmd+C)を使用してください。',pasteMsg:'キーボード(<STRONG>Ctrl/Cmd+V</STRONG>)を使用して、次の入力エリア内で貼って、<STRONG>OK</STRONG>を押してください。',securityMsg:'ブラウザのセキュリティ設定により、エディタはクリップボード・データに直接アクセスすることができません。このウィンドウは貼り付け操作を行う度に表示されます。',pasteArea:'貼り付け場所'},pastefromword:{confirmCleanup:'貼り付けを行うテキストは、ワード文章からコピーされようとしています。貼り付ける前にクリーニングを行いますか?',toolbar:'ワード文章から貼り付け',title:'ワード文章から貼り付け',error:'内部エラーにより貼り付けたデータがクリアできませんでした'},pasteText:{button:'プレーンテキスト貼り付け',title:'プレーンテキスト貼り付け'},templates:{button:'テンプレート(雛形)',title:'テンプレート内容',options:'テンプレートオプション',insertOption:'現在のエディタの内容と置換えをします',selectPromptMsg:'エディターで使用するテンプレートを選択してください。<br>(現在のエディタの内容は失われます):',emptyListMsg:'(テンプレートが定義されていません)'},showBlocks:'ブロック表示',stylesCombo:{label:'スタイル',panelTitle:'スタイル',panelTitle1:'ブロックスタイル',panelTitle2:'インラインスタイル',panelTitle3:'オブジェクトスタイル'},format:{label:'フォーマット',panelTitle:'フォーマット',tag_p:'標準',tag_pre:'書式付き',tag_address:'アドレス',tag_h1:'見出し 1',tag_h2:'見出し 2',tag_h3:'見出し 3',tag_h4:'見出し 4',tag_h5:'見出し 5',tag_h6:'見出し 6',tag_div:'標準 (DIV)'},div:{title:'Divコンテナ',toolbar:'Divコンテナ',cssClassInputLabel:'スタイルシートクラス',styleSelectLabel:'スタイル',IdInputLabel:'Id',languageCodeInputLabel:' 言語コード',inlineStyleInputLabel:'インラインスタイル',advisoryTitleInputLabel:'Title属性',langDirLabel:'文字表記の方向',langDirLTRLabel:'左から右 (LTR)',langDirRTLLabel:'右から左 (RTL)',edit:'Divコンテナ 編集',remove:'Divコンテナ 削除'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'フォント',voiceLabel:'フォント',panelTitle:'フォント'},fontSize:{label:'サイズ',voiceLabel:'フォントサイズ',panelTitle:'サイズ'},colorButton:{textColorTitle:'テキスト色',bgColorTitle:'背景色',panelTitle:'色',auto:'自動',more:'その他の色...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'スペルチェック設定(SCAYT)',opera_title:'Operaではサポートされません',enable:'SCAYT有効',disable:'SCAYT無効',about:'SCAYTバージョン',toggle:'SCAYT切替',options:'オプション',langs:'言語',moreSuggestions:'他の候補',ignore:'無視',ignoreAll:'すべて無視',addWord:'語句追加',emptyDic:'辞書名は必ず入力してください',optionsTab:'オプション',allCaps:'全て大文字の単語を無視',ignoreDomainNames:'ドメイン名を無視',mixedCase:'大文字小文字混在の単語を無視',mixedWithDigits:'数字付き単語を無視',languagesTab:'言語',dictionariesTab:'辞書',dic_field_name:'辞書名',dic_create:'登録',dic_restore:'元に戻す',dic_delete:'削除',dic_rename:'名前変更',dic_info:'始めユーザーディレクトリは、Cookieに保存されます。但し Cookie はサイズに制限があります。ユーザーディレクトリがCookieに保存できないサイズに到達するとディレクトリはサーバー上に保存されます。個人のディレクトリをサーバー上に保存するには、ディレクトリ名を明示する必要があります。もし既に保存されたディレクトリがある場合、その名前を入力し、元に戻すボタンを押してください。',aboutTab:'バージョン情報'},about:{title:'CKEditorバージョン情報',dlgTitle:'CKEditorバージョン情報',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'ライセンス情報の詳細はウェブサイトにて確認してください:',copy:'Copyright © $1. All rights reserved.'},maximize:'最大化',minimize:'最小化',fakeobjects:{anchor:'アンカー',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'ドラッグしてリサイズ',colordialog:{title:'色選択',options:'カラーオプション',highlight:'ハイライト',selected:'選択された色',clear:'クリア'},toolbarCollapse:'ツールバーを閉じる',toolbarExpand:'ツールバーを開く',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'テキストの向き : 左から右へ',rtl:'テキストの向き : 右から左へ'},docprops:{label:'文書 プロパティ',title:'文書 プロパティ',design:'Design',meta:'メタデータ',chooseColor:'色の選択',other:'<その他の>',docTitle:'ページタイトル',charset:'文字セット符号化',charsetOther:'他の文字セット符号化',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'文書タイプヘッダー',docTypeOther:'その他文書タイプヘッダー',xhtmlDec:'XHTML宣言をインクルード',bgColor:'背景色',bgImage:'背景画像 URL',bgFixed:'スクロールしない背景',txtColor:'テキスト色',margin:'ページ・マージン',marginTop:'上部',marginLeft:'左',marginRight:'右',marginBottom:'下部',metaKeywords:'文書のキーワード(カンマ区切り)',metaDescription:'文書の概要',metaAuthor:'文書の作者',metaCopyright:'文書の著作権',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.ja={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'リッチテキストエディタ',source:'ソース',newPage:'新しいページ',save:'保存',preview:'プレビュー',cut:'切り取り',copy:'コピー',paste:'貼り付け',print:'印刷',underline:'下線',bold:'太字',italic:'斜体',selectAll:'すべて選択',removeFormat:'フォーマット削除',strike:'打ち消し線',subscript:'添え字',superscript:'上付き文字',horizontalrule:'横罫線',pagebreak:'改ページ挿入',pagebreakAlt:'Page Break',unlink:'リンク削除',undo:'元に戻す',redo:'やり直し',common:{browseServer:'サーバーブラウザー',url:'URL',protocol:'プロトコル',upload:'アップロード',uploadSubmit:'サーバーに送信',image:'イメージ',flash:'Flash',form:'フォーム',checkbox:'チェックボックス',radio:'ラジオボタン',textField:'1行テキスト',textarea:'テキストエリア',hiddenField:'不可視フィールド',button:'ボタン',select:'選択フィールド',imageButton:'画像ボタン',notSet:'<なし>',id:'Id',name:'Name属性',langDir:'文字表記の方向',langDirLtr:'左から右 (LTR)',langDirRtl:'右から左 (RTL)',langCode:'言語コード',longDescr:'longdesc属性(長文説明)',cssClass:'スタイルシートクラス',advisoryTitle:'Title属性',cssStyle:'スタイルシート',ok:'OK',cancel:'キャンセル',close:'閉じる',preview:'プレビュー',generalTab:'全般',advancedTab:'高度な設定',validateNumberFailed:'値が数ではありません',confirmNewPage:'変更内容を保存せず、 新しいページを開いてもよろしいでしょうか?',confirmCancel:'オプション設定を変更しました。ダイアログを閉じてもよろしいでしょうか?',options:'オプション',target:'ターゲット',targetNew:'新しいウィンドウ (_空白)',targetTop:'最上部ウィンドウ (_トップ)',targetSelf:'同じウィンドウ (_同一)',targetParent:'親ウィンドウ (_親)',langDirLTR:'左から右 (LTR)',langDirRTL:'右から左 (RTL)',styles:'スタイル',cssClasses:'スタイルシートクラス',width:'幅',height:'高さ',align:'行揃え',alignLeft:'左',alignRight:'右',alignCenter:'中央',alignTop:'上',alignMiddle:'中央',alignBottom:'下',invalidHeight:'高さは数値で入力してください。',invalidWidth:'幅は数値で入力してください。',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, 利用不可能</span>'},contextmenu:{options:'コンテキストメニューオプション'},specialChar:{toolbar:'特殊文字挿入',title:'特殊文字選択',options:'特殊文字オプション'},link:{toolbar:'リンク挿入/編集',other:'<その他の>',menu:'リンク編集',title:'ハイパーリンク',info:'ハイパーリンク 情報',target:'ターゲット',upload:'アップロード',advanced:'高度な設定',type:'リンクタイプ',toUrl:'URL',toAnchor:'このページのアンカー',toEmail:'E-Mail',targetFrame:'<フレーム>',targetPopup:'<ポップアップウィンドウ>',targetFrameName:'目的のフレーム名',targetPopupName:'ポップアップウィンドウ名',popupFeatures:'ポップアップウィンドウ特徴',popupResizable:'サイズ可変',popupStatusBar:'ステータスバー',popupLocationBar:'ロケーションバー',popupToolbar:'ツールバー',popupMenuBar:'メニューバー',popupFullScreen:'全画面モード(IE)',popupScrollBars:'スクロールバー',popupDependent:'開いたウィンドウに連動して閉じる (Netscape)',popupLeft:'左端からの座標で指定',popupTop:'上端からの座標で指定',id:'Id',langDir:'文字表記の方向',langDirLTR:'左から右 (LTR)',langDirRTL:'右から左 (RTL)',acccessKey:'アクセスキー',name:'Name属性',langCode:'言語コード',tabIndex:'タブインデックス',advisoryTitle:'Title属性',advisoryContentType:'Content Type属性',cssClasses:'スタイルシートクラス',charset:'リンクcharset属性',styles:'スタイルシート',rel:'Relationship',selectAnchor:'アンカーを選択',anchorName:'アンカー名',anchorId:'エレメントID',emailAddress:'E-Mail アドレス',emailSubject:'件名',emailBody:'本文',noAnchors:'(ドキュメントにおいて利用可能なアンカーはありません。)',noUrl:'リンクURLを入力してください。',noEmail:'メールアドレスを入力してください。'},anchor:{toolbar:'アンカー挿入/編集',menu:'アンカー プロパティ',title:'アンカー プロパティ',name:'アンカー名',errorName:'アンカー名を必ず入力してください。',remove:'Remove Anchor'},list:{numberedTitle:'段落番号 プロパティ',bulletedTitle:'箇条書き プロパティ',type:'タイプ',start:'開始',validateStartNumber:'リスト開始番号は数値で入力してください。',circle:'白丸',disc:'黒丸',square:'四角',none:'なし',notset:'<なし>',armenian:'アルメニア数字',georgian:'グルジア数字 (an, ban, gan, etc.)',lowerRoman:'小文字ローマ数字 (i, ii, iii, iv, v, etc.)',upperRoman:'大文字ローマ数字 (I, II, III, IV, V, etc.)',lowerAlpha:'小文字アルファベット (a, b, c, d, e, etc.)',upperAlpha:'大文字アルファベット (A, B, C, D, E, etc.)',lowerGreek:'小文字ギリシャ文字 (alpha, beta, gamma, etc.)',decimal:'数字 (1, 2, 3, etc.)',decimalLeadingZero:'上位桁に0をつけた数字 (01, 02, 03, etc.)'},findAndReplace:{title:'検索して置換',find:'検索',replace:'置き換え',findWhat:'検索する文字列:',replaceWith:'置換えする文字列:',notFoundMsg:'指定された文字列は見つかりませんでした。',findOptions:'Find Options',matchCase:'大文字と小文字を区別する',matchWord:'単語単位で探す',matchCyclic:'一周する',replaceAll:'すべて置換え',replaceSuccessMsg:'%1 個置換しました。'},table:{toolbar:'テーブル',title:'テーブル プロパティ',menu:'テーブル プロパティ',deleteTable:'テーブル削除',rows:'行',columns:'列',border:'ボーダーサイズ',widthPx:'ピクセル',widthPc:'パーセント',widthUnit:'ユニット',cellSpace:'セル内余白',cellPad:'セル内間隔',caption:'キャプション',summary:'テーブルの概要',headers:'テーブルヘッダ(th)',headersNone:'なし',headersColumn:'初めの列のみ',headersRow:'初めの行のみ',headersBoth:'両方',invalidRows:'行は0より大きな数値で入力してください。',invalidCols:'列は0より大きな数値で入力してください。',invalidBorder:'ボーダーサイズは数値で入力してください。',invalidWidth:'幅は数値で入力してください。',invalidHeight:'高さは数値で入力してください。',invalidCellSpacing:'セル内余白は数値で入力してください。',invalidCellPadding:'セル内間隔は数値で入力してください。',cell:{menu:'セル',insertBefore:'セルの前に挿入',insertAfter:'セルの後に挿入',deleteCell:'セル削除',merge:'セル結合',mergeRight:'右に結合',mergeDown:'下に結合',splitHorizontal:'セルを水平方向分割',splitVertical:'セルを垂直方向に分割',title:'セルプロパティ',cellType:'セルタイプ',rowSpan:'縦幅(行数)',colSpan:'横幅(列数)',wordWrap:'折り返し',hAlign:'セル横の整列',vAlign:'セル縦の整列',alignBaseline:'ベースライン',bgColor:'背景色',borderColor:'ボーダーカラー',data:'テーブルデータ(td)',header:'テーブルヘッダ(th)',yes:'Yes',no:'No',invalidWidth:'セル幅は数値で入力してください。',invalidHeight:'セル高さは数値で入力してください。',invalidRowSpan:'縦幅(行数)は数値で入力してください。',invalidColSpan:'横幅(列数)は数値で入力してください。',chooseColor:'色の選択'},row:{menu:'行',insertBefore:'行の前に挿入',insertAfter:'行の後に挿入',deleteRow:'行削除'},column:{menu:'カラム',insertBefore:'カラムの前に挿入',insertAfter:'カラムの後に挿入',deleteColumn:'列削除'}},button:{title:'ボタン プロパティ',text:'テキスト (値)',type:'タイプ',typeBtn:'ボタン',typeSbm:'送信',typeRst:'リセット'},checkboxAndRadio:{checkboxTitle:'チェックボックス プロパティ',radioTitle:'ラジオボタン プロパティ',value:'値',selected:'選択済み'},form:{title:'フォーム プロパティ',menu:'フォーム プロパティ',action:'アクション',method:'メソッド',encoding:'エンコーディング'},select:{title:'選択フィールド プロパティ',selectInfo:'情報',opAvail:'利用可能なオプション',value:'選択項目値',size:'サイズ',lines:'行',chkMulti:'複数項目選択を許可',opText:'選択項目名',opValue:'値',btnAdd:'追加',btnModify:'編集',btnUp:'上へ',btnDown:'下へ',btnSetValue:'選択した値を設定',btnDelete:'削除'},textarea:{title:'テキストエリア プロパティ',cols:'列',rows:'行'},textfield:{title:'1行テキスト プロパティ',name:'名前',value:'値',charWidth:'サイズ',maxChars:'最大長',type:'タイプ',typeText:'テキスト',typePass:'パスワード入力'},hidden:{title:'不可視フィールド プロパティ',name:'名前',value:'値'},image:{title:'イメージ プロパティ',titleButton:'画像ボタン プロパティ',menu:'イメージ プロパティ',infoTab:'イメージ 情報',btnUpload:'サーバーに送信',upload:'アップロード',alt:'代替テキスト',lockRatio:'ロック比率',resetSize:'サイズリセット',border:'ボーダー',hSpace:'横間隔',vSpace:'縦間隔',alertUrl:'イメージのURLを入力してください。',linkTab:'リンク',button2Img:'選択したボタンを画像に置き換えますか?',img2Button:'選択した画像をボタンに置き換えますか?',urlMissing:'イメージのURLを入力してください。',validateBorder:'ボーダーは数値で入力してください。',validateHSpace:'横間隔は数値で入力してください。',validateVSpace:'縦間隔は数値で入力してください。'},flash:{properties:'Flash プロパティ',propertiesTab:'プロパティ',title:'Flash プロパティ',chkPlay:'再生',chkLoop:'ループ再生',chkMenu:'Flashメニュー可能',chkFull:'フルスクリーン許可',scale:'拡大縮小設定',scaleAll:'すべて表示',scaleNoBorder:'外が見えない様に拡大',scaleFit:'上下左右にフィット',access:'スプリクトアクセス(AllowScriptAccess)',accessAlways:'すべての場合に通信可能(Always)',accessSameDomain:'同一ドメインのみに通信可能(Same domain)',accessNever:'すべての場合に通信不可能(Never)',alignAbsBottom:'下部(絶対的)',alignAbsMiddle:'中央(絶対的)',alignBaseline:'ベースライン',alignTextTop:'テキスト上部',quality:'画質',qualityBest:'品質優先',qualityHigh:'高',qualityAutoHigh:'自動/高',qualityMedium:'中',qualityAutoLow:'自動/低',qualityLow:'低',windowModeWindow:'標準',windowModeOpaque:'背景を不透明設定',windowModeTransparent:'背景を透過設定',windowMode:'ウィンドウモード',flashvars:'フラッシュに渡す変数(FlashVars)',bgcolor:'背景色',hSpace:'横間隔',vSpace:'縦間隔',validateSrc:'リンクURLを入力してください。',validateHSpace:'横間隔は数値で入力してください。',validateVSpace:'縦間隔は数値で入力してください。'},spellCheck:{toolbar:'スペルチェック',title:'スペルチェック',notAvailable:'申し訳ありません、現在サービスを利用することができません',errorLoading:'アプリケーションサービスホスト読込みエラー: %s.',notInDic:'辞書にありません',changeTo:'変更',btnIgnore:'無視',btnIgnoreAll:'すべて無視',btnReplace:'置換',btnReplaceAll:'すべて置換',btnUndo:'やり直し',noSuggestions:'- 該当なし -',progress:'スペルチェック処理中...',noMispell:'スペルチェック完了: スペルの誤りはありませんでした',noChanges:'スペルチェック完了: 語句は変更されませんでした',oneChange:'スペルチェック完了: 1語句変更されました',manyChanges:'スペルチェック完了: %1 語句変更されました',ieSpellDownload:'スペルチェッカーがインストールされていません。今すぐダウンロードしますか?'},smiley:{toolbar:'絵文字',title:'顔文字挿入',options:'絵文字オプション'},elementsPath:{eleLabel:'エレメントパス',eleTitle:'%1 エレメント'},numberedlist:'段落番号',bulletedlist:'箇条書き',indent:'インデント',outdent:'インデント解除',justify:{left:'左揃え',center:'中央揃え',right:'右揃え',block:'両端揃え'},blockquote:'ブロック引用',clipboard:{title:'貼り付け',cutError:'ブラウザーのセキュリティ設定によりエディタの切り取り操作が自動で実行することができません。実行するには手動でキーボードの(Ctrl/Cmd+X)を使用してください。',copyError:'ブラウザーのセキュリティ設定によりエディタのコピー操作が自動で実行することができません。実行するには手動でキーボードの(Ctrl/Cmd+C)を使用してください。',pasteMsg:'キーボード(<STRONG>Ctrl/Cmd+V</STRONG>)を使用して、次の入力エリア内で貼って、<STRONG>OK</STRONG>を押してください。',securityMsg:'ブラウザのセキュリティ設定により、エディタはクリップボード・データに直接アクセスすることができません。このウィンドウは貼り付け操作を行う度に表示されます。',pasteArea:'貼り付け場所'},pastefromword:{confirmCleanup:'貼り付けを行うテキストは、ワード文章からコピーされようとしています。貼り付ける前にクリーニングを行いますか?',toolbar:'ワード文章から貼り付け',title:'ワード文章から貼り付け',error:'内部エラーにより貼り付けたデータがクリアできませんでした'},pasteText:{button:'プレーンテキスト貼り付け',title:'プレーンテキスト貼り付け'},templates:{button:'テンプレート(雛形)',title:'テンプレート内容',options:'テンプレートオプション',insertOption:'現在のエディタの内容と置換えをします',selectPromptMsg:'エディターで使用するテンプレートを選択してください。<br>(現在のエディタの内容は失われます):',emptyListMsg:'(テンプレートが定義されていません)'},showBlocks:'ブロック表示',stylesCombo:{label:'スタイル',panelTitle:'スタイル',panelTitle1:'ブロックスタイル',panelTitle2:'インラインスタイル',panelTitle3:'オブジェクトスタイル'},format:{label:'フォーマット',panelTitle:'フォーマット',tag_p:'標準',tag_pre:'書式付き',tag_address:'アドレス',tag_h1:'見出し 1',tag_h2:'見出し 2',tag_h3:'見出し 3',tag_h4:'見出し 4',tag_h5:'見出し 5',tag_h6:'見出し 6',tag_div:'標準 (DIV)'},div:{title:'Divコンテナ',toolbar:'Divコンテナ',cssClassInputLabel:'スタイルシートクラス',styleSelectLabel:'スタイル',IdInputLabel:'Id',languageCodeInputLabel:' 言語コード',inlineStyleInputLabel:'インラインスタイル',advisoryTitleInputLabel:'Title属性',langDirLabel:'文字表記の方向',langDirLTRLabel:'左から右 (LTR)',langDirRTLLabel:'右から左 (RTL)',edit:'Divコンテナ 編集',remove:'Divコンテナ 削除'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'フォント',voiceLabel:'フォント',panelTitle:'フォント'},fontSize:{label:'サイズ',voiceLabel:'フォントサイズ',panelTitle:'サイズ'},colorButton:{textColorTitle:'テキスト色',bgColorTitle:'背景色',panelTitle:'色',auto:'自動',more:'その他の色...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'スペルチェック設定(SCAYT)',opera_title:'Operaではサポートされません',enable:'SCAYT有効',disable:'SCAYT無効',about:'SCAYTバージョン',toggle:'SCAYT切替',options:'オプション',langs:'言語',moreSuggestions:'他の候補',ignore:'無視',ignoreAll:'すべて無視',addWord:'語句追加',emptyDic:'辞書名は必ず入力してください',optionsTab:'オプション',allCaps:'全て大文字の単語を無視',ignoreDomainNames:'ドメイン名を無視',mixedCase:'大文字小文字混在の単語を無視',mixedWithDigits:'数字付き単語を無視',languagesTab:'言語',dictionariesTab:'辞書',dic_field_name:'辞書名',dic_create:'登録',dic_restore:'元に戻す',dic_delete:'削除',dic_rename:'名前変更',dic_info:'始めユーザーディレクトリは、Cookieに保存されます。但し Cookie はサイズに制限があります。ユーザーディレクトリがCookieに保存できないサイズに到達するとディレクトリはサーバー上に保存されます。個人のディレクトリをサーバー上に保存するには、ディレクトリ名を明示する必要があります。もし既に保存されたディレクトリがある場合、その名前を入力し、元に戻すボタンを押してください。',aboutTab:'バージョン情報'},about:{title:'CKEditorバージョン情報',dlgTitle:'CKEditorバージョン情報',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'ライセンス情報の詳細はウェブサイトにて確認してください:',copy:'Copyright © $1. All rights reserved.'},maximize:'最大化',minimize:'最小化',fakeobjects:{anchor:'アンカー',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'ドラッグしてリサイズ',colordialog:{title:'色選択',options:'カラーオプション',highlight:'ハイライト',selected:'選択された色',clear:'クリア'},toolbarCollapse:'ツールバーを閉じる',toolbarExpand:'ツールバーを開く',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'テキストの向き : 左から右へ',rtl:'テキストの向き : 右から左へ'},docprops:{label:'文書 プロパティ',title:'文書 プロパティ',design:'Design',meta:'メタデータ',chooseColor:'色の選択',other:'<その他の>',docTitle:'ページタイトル',charset:'文字セット符号化',charsetOther:'他の文字セット符号化',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'文書タイプヘッダー',docTypeOther:'その他文書タイプヘッダー',xhtmlDec:'XHTML宣言をインクルード',bgColor:'背景色',bgImage:'背景画像 URL',bgFixed:'スクロールしない背景',txtColor:'テキスト色',margin:'ページ・マージン',marginTop:'上部',marginLeft:'左',marginRight:'右',marginBottom:'下部',metaKeywords:'文書のキーワード(カンマ区切り)',metaDescription:'文書の概要',metaAuthor:'文書の作者',metaCopyright:'文書の著作権',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ka.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ka.js
index 6d671bd..00cf1b5 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ka.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ka.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.ka={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'ტექსტის რედაქტორი',source:'კოდები',newPage:'ახალი გვერდი',save:'ჩაწერა',preview:'გადახედვა',cut:'ამოჭრა',copy:'ასლი',paste:'ჩასმა',print:'ბეჭდვა',underline:'გახაზული',bold:'მსხვილი',italic:'დახრილი',selectAll:'ყველაფრის მონიშნვა',removeFormat:'ფორმატირების მოხსნა',strike:'გადახაზული',subscript:'ინდექსი',superscript:'ხარისხი',horizontalrule:'ჰორიზონტალური ხაზის ჩასმა',pagebreak:'გვერდის წყვეტა ბეჭდვისთვის',pagebreakAlt:'გვერდის წყვეტა',unlink:'ბმულის მოხსნა',undo:'გაუქმება',redo:'გამეორება',common:{browseServer:'სერვერზე დათვალიერება',url:'URL',protocol:'პროტოკოლი',upload:'ატვირთვა',uploadSubmit:'სერვერზე გაგზავნა',image:'სურათი',flash:'Flash',form:'ფორმა',checkbox:'მონიშვნის ღილაკი',radio:'ამორჩევის ღილაკი',textField:'ტექსტური ველი',textarea:'ტექსტური არე',hiddenField:'მალული ველი',button:'ღილაკი',select:'არჩევის ველი',imageButton:'სურათიანი ღილაკი',notSet:'<არაფერი>',id:'Id',name:'სახელი',langDir:'ენის მიმართულება',langDirLtr:'მარცხნიდან მარჯვნივ (LTR)',langDirRtl:'მარჯვნიდან მარცხნივ (RTL)',langCode:'ენის კოდი',longDescr:'დიდი აღწერის URL',cssClass:'CSS კლასი',advisoryTitle:'სათაური',cssStyle:'CSS სტილი',ok:'დიახ',cancel:'გაუქმება',close:'დახურვა',preview:'გადახედვა',generalTab:'ინფორმაცია',advancedTab:'გაფართოებული',validateNumberFailed:'ეს მნიშვნელობა არაა რიცხვი.',confirmNewPage:'ამ დოკუმენტში ყველა ჩაუწერელი ცვლილება დაიკარგება. დარწმუნებული ხართ რომ ახალი გვერდის ჩატვირთვა გინდათ?',confirmCancel:'ზოგიერთი პარამეტრი შეცვლილია, დარწმუნებულილ ხართ რომ ფანჯრის დახურვა გსურთ?',options:'პარამეტრები',target:'გახსნის ადგილი',targetNew:'ახალი ფანჯარა (_blank)',targetTop:'ზედა ფანჯარა (_top)',targetSelf:'იგივე ფანჯარა (_self)',targetParent:'მშობელი ფანჯარა (_parent)',langDirLTR:'მარცხნიდან მარჯვნივ (LTR)',langDirRTL:'მარჯვნიდან მარცხნივ (RTL)',styles:'სტილი',cssClasses:'CSS კლასი',width:'სიგანე',height:'სიმაღლე',align:'სწორება',alignLeft:'მარცხენა',alignRight:'მარჯვენა',alignCenter:'შუა',alignTop:'ზემოთა',alignMiddle:'შუა',alignBottom:'ქვემოთა',invalidHeight:'სიმაღლე რიცხვით უნდა იყოს წარმოდგენილი.',invalidWidth:'სიგანე რიცხვით უნდა იყოს წარმოდგენილი.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, მიუწვდომელია</span>'},contextmenu:{options:'კონტექსტური მენიუს პარამეტრები'},specialChar:{toolbar:'სპეციალური სიმბოლოს ჩასმა',title:'სპეციალური სიმბოლოს არჩევა',options:'სპეციალური სიმბოლოს პარამეტრები'},link:{toolbar:'ბმული',other:'<სხვა>',menu:'ბმულის რედაქტირება',title:'ბმული',info:'ბმულის ინფორმაცია',target:'გახსნის ადგილი',upload:'აქაჩვა',advanced:'დაწვრილებით',type:'ბმულის ტიპი',toUrl:'URL',toAnchor:'ბმული ტექსტში ღუზაზე',toEmail:'ელფოსტა',targetFrame:'<frame>',targetPopup:'<popup ფანჯარა>',targetFrameName:'Frame-ის სახელი',targetPopupName:'Popup ფანჯრის სახელი',popupFeatures:'Popup ფანჯრის პარამეტრები',popupResizable:'ცვალებადი ზომით',popupStatusBar:'სტატუსის ზოლი',popupLocationBar:'ნავიგაციის ზოლი',popupToolbar:'ხელსაწყოთა ზოლი',popupMenuBar:'მენიუს ზოლი',popupFullScreen:'მთელი ეკრანი (IE)',popupScrollBars:'გადახვევის ზოლები',popupDependent:'დამოკიდებული (Netscape)',popupLeft:'მარცხენა პოზიცია',popupTop:'ზედა პოზიცია',id:'Id',langDir:'ენის მიმართულება',langDirLTR:'მარცხნიდან მარჯვნივ (LTR)',langDirRTL:'მარჯვნიდან მარცხნივ (RTL)',acccessKey:'წვდომის ღილაკი',name:'სახელი',langCode:'ენის კოდი',tabIndex:'Tab-ის ინდექსი',advisoryTitle:'სათაური',advisoryContentType:'შიგთავსის ტიპი',cssClasses:'CSS კლასი',charset:'კოდირება',styles:'CSS სტილი',rel:'კავშირი',selectAnchor:'აირჩიეთ ღუზა',anchorName:'ღუზის სახელით',anchorId:'ელემენტის Id-თ',emailAddress:'ელფოსტის მისამართები',emailSubject:'წერილის სათაური',emailBody:'წერილის ტექსტი',noAnchors:'(ამ დოკუმენტში ღუზა არაა)',noUrl:'აკრიფეთ ბმულის URL',noEmail:'აკრიფეთ ელფოსტის მისამართი'},anchor:{toolbar:'ღუზა',menu:'ღუზის რედაქტირება',title:'ღუზის პარამეტრები',name:'ღუზუს სახელი',errorName:'აკრიფეთ ღუზის სახელი',remove:'Remove Anchor'},list:{numberedTitle:'გადანომრილი სიის პარამეტრები',bulletedTitle:'ღილებიანი სიის პარამეტრები',type:'ტიპი',start:'საწყისი',validateStartNumber:'სიის საწყისი მთელი რიცხვი უნდა იყოს.',circle:'წრეწირი',disc:'წრე',square:'კვადრატი',none:'არაფერი',notset:'<არაფერი>',armenian:'სომხური გადანომრვა',georgian:'ქართული გადანომრვა (ან, ბან, გან, ..)',lowerRoman:'რომაული გადანომრვცა პატარა ციფრებით (i, ii, iii, iv, v, ..)',upperRoman:'რომაული გადანომრვა დიდი ციფრებით (I, II, III, IV, V, etc.)',lowerAlpha:'პატარა ლათინური ასოებით (a, b, c, d, e, ..)',upperAlpha:'დიდი ლათინური ასოებით (A, B, C, D, E, ..)',lowerGreek:'პატარა ბერძნული ასოებით (ალფა, ბეტა, გამა, ..)',decimal:'რიცხვებით (1, 2, 3, ..)',decimalLeadingZero:'ნულით დაწყებული რიცხვებით (01, 02, 03, ..)'},findAndReplace:{title:'ძებნა და შეცვლა',find:'ძებნა',replace:'შეცვლა',findWhat:'საძიებელი ტექსტი:',replaceWith:'შეცვლის ტექსტი:',notFoundMsg:'მითითებული ტექსტი არ მოიძებნა.',findOptions:'Find Options',matchCase:'დიდი და პატარა ასოების დამთხვევა',matchWord:'მთელი სიტყვის დამთხვევა',matchCyclic:'დოკუმენტის ბოლოში გასვლის მერე თავიდან დაწყება',replaceAll:'ყველას შეცვლა',replaceSuccessMsg:'%1 მოძებნილი შეიცვალა.'},table:{toolbar:'ცხრილი',title:'ცხრილის პარამეტრები',menu:'ცხრილის პარამეტრები',deleteTable:'ცხრილის წაშლა',rows:'სტრიქონი',columns:'სვეტი',border:'ჩარჩოს ზომა',widthPx:'წერტილი',widthPc:'პროცენტი',widthUnit:'საზომი ერთეული',cellSpace:'უჯრის სივრცე (spacing)',cellPad:'უჯრის კიდე (padding)',caption:'სათაური',summary:'შეჯამება',headers:'სათაურები',headersNone:'არაფერი',headersColumn:'პირველი სვეტი',headersRow:'პირველი სტრიქონი',headersBoth:'ორივე',invalidRows:'სტრიქონების რაოდენობა დადებითი რიცხვი უნდა იყოს.',invalidCols:'სვეტების რაოდენობა დადებითი რიცხვი უნდა იყოს.',invalidBorder:'ჩარჩოს ზომა რიცხვით უდნა იყოს წარმოდგენილი.',invalidWidth:'ცხრილის სიგანე რიცხვით უნდა იყოს წარმოდგენილი.',invalidHeight:'ცხრილის სიმაღლე რიცხვით უნდა იყოს წარმოდგენილი.',invalidCellSpacing:'უჯრის სივრცე (spacing) რიცხვით უნდა იყოს წარმოდგენილი.',invalidCellPadding:'უჯრის კიდე (padding) რიცხვით უნდა იყოს წარმოდგენილი.',cell:{menu:'უჯრა',insertBefore:'უჯრის ჩასმა მანამდე',insertAfter:'უჯრის ჩასმა მერე',deleteCell:'უჯრების წაშლა',merge:'უჯრების შეერთება',mergeRight:'შეერთება მარჯვენასთან',mergeDown:'შეერთება ქვემოთასთან',splitHorizontal:'გაყოფა ჰორიზონტალურად',splitVertical:'გაყოფა ვერტიკალურად',title:'უჯრის პარამეტრები',cellType:'უჯრის ტიპი',rowSpan:'სტრიქონების ოდენობა',colSpan:'სვეტების ოდენობა',wordWrap:'სტრიქონის გადატანა (Word Wrap)',hAlign:'ჰორიზონტალური სწორება',vAlign:'ვერტიკალური სწორება',alignBaseline:'ძირითადი ხაზის გასწვრივ',bgColor:'ფონის ფერი',borderColor:'ჩარჩოს ფერი',data:'მონაცემები',header:'სათაური',yes:'დიახ',no:'არა',invalidWidth:'უჯრის სიგანე რიცხვით უნდა იყოს წარმოდგენილი.',invalidHeight:'უჯრის სიმაღლე რიცხვით უნდა იყოს წარმოდგენილი.',invalidRowSpan:'სტრიქონების რაოდენობა მთელი რიცხვი უნდა იყოს.',invalidColSpan:'სვეტების რაოდენობა მთელი რიცხვი უნდა იყოს.',chooseColor:'არჩევა'},row:{menu:'სტრიქონი',insertBefore:'სტრიქონის ჩამატება წინ',insertAfter:'სტრიქონის ჩამატება მერე',deleteRow:'სტრიქონების წაშლა'},column:{menu:'სვეტი',insertBefore:'სვეტის ჩამატება წინ',insertAfter:'სვეტის ჩამატება მერე',deleteColumn:'სვეტების წაშლა'}},button:{title:'ღილაკის პარამეტრები',text:'ტექსტი',type:'ტიპი',typeBtn:'ღილაკი',typeSbm:'გაგზავნა',typeRst:'გასუფთავება'},checkboxAndRadio:{checkboxTitle:'მონიშვნის ღილაკის (Checkbox) პარამეტრები',radioTitle:'ასარჩევი ღილაკის (Radio) პარამეტრები',value:'ტექსტი',selected:'არჩეული'},form:{title:'ფორმის პარამეტრები',menu:'ფორმის პარამეტრები',action:'ქმედება',method:'მეთოდი',encoding:'კოდირება'},select:{title:'არჩევის ველის პარამეტრები',selectInfo:'ინფორმაცია',opAvail:'შესაძლებელი ვარიანტები',value:'მნიშვნელობა',size:'ზომა',lines:'ხაზები',chkMulti:'მრავლობითი არჩევანის საშუალება',opText:'ტექსტი',opValue:'მნიშვნელობა',btnAdd:'დამატება',btnModify:'შეცვლა',btnUp:'ზემოთ',btnDown:'ქვემოთ',btnSetValue:'ამორჩეულ მნიშვნელოვნად დაყენება',btnDelete:'წაშლა'},textarea:{title:'ტექსტური არის პარამეტრები',cols:'სვეტები',rows:'სტრიქონები'},textfield:{title:'ტექსტური ველის პარამეტრები',name:'სახელი',value:'მნიშვნელობა',charWidth:'სიმბოლოს ზომა',maxChars:'ასოების მაქსიმალური ოდენობა',type:'ტიპი',typeText:'ტექსტი',typePass:'პაროლი'},hidden:{title:'მალული ველის პარამეტრები',name:'სახელი',value:'მნიშვნელობა'},image:{title:'სურათის პარამეტრები',titleButton:'სურათიანი ღილაკის პარამეტრები',menu:'სურათის პარამეტრები',infoTab:'სურათის ინფორმცია',btnUpload:'სერვერისთვის გაგზავნა',upload:'ატვირთვა',alt:'სანაცვლო ტექსტი',lockRatio:'პროპორციის შენარჩუნება',resetSize:'ზომის დაბრუნება',border:'ჩარჩო',hSpace:'ჰორიზონტალური სივრცე',vSpace:'ვერტიკალური სივრცე',alertUrl:'აკრიფეთ სურათის URL',linkTab:'ბმული',button2Img:'გსურთ არჩეული სურათიანი ღილაკის გადაქცევა ჩვეულებრივ ღილაკად?',img2Button:'გსურთ არჩეული ჩვეულებრივი ღილაკის გადაქცევა სურათიან ღილაკად?',urlMissing:'სურათის URL არაა შევსებული.',validateBorder:'ჩარჩო მთელი რიცხვი უნდა იყოს.',validateHSpace:'ჰორიზონტალური სივრცე მთელი რიცხვი უნდა იყოს.',validateVSpace:'ვერტიკალური სივრცე მთელი რიცხვი უნდა იყოს.'},flash:{properties:'Flash-ის პარამეტრები',propertiesTab:'პარამეტრები',title:'Flash-ის პარამეტრები',chkPlay:'ავტო გაშვება',chkLoop:'ჩაციკლვა',chkMenu:'Flash-ის მენიუს დაშვება',chkFull:'მთელი ეკრანის დაშვება',scale:'მასშტაბირება',scaleAll:'ყველაფრის ჩვენება',scaleNoBorder:'ჩარჩოს გარეშე',scaleFit:'ზუსტი ჩასმა',access:'სკრიპტის წვდომა',accessAlways:'ყოველთვის',accessSameDomain:'იგივე დომენი',accessNever:'არასდროს',alignAbsBottom:'ჩარჩოს ქვემოთა ნაწილის სწორება ტექსტისთვის',alignAbsMiddle:'ჩარჩოს შუა ნაწილის სწორება ტექსტისთვის',alignBaseline:'საბაზისო ხაზის სწორება',alignTextTop:'ტექსტი ზემოდან',quality:'ხარისხი',qualityBest:'საუკეთესო',qualityHigh:'მაღალი',qualityAutoHigh:'მაღალი (ავტომატური)',qualityMedium:'საშუალო',qualityAutoLow:'ძალიან დაბალი',qualityLow:'დაბალი',windowModeWindow:'ფანჯარა',windowModeOpaque:'გაუმჭვირვალე',windowModeTransparent:'გამჭვირვალე',windowMode:'ფანჯრის რეჟიმი',flashvars:'ცვლადები Flash-ისთვის',bgcolor:'ფონის ფერი',hSpace:'ჰორიზ. სივრცე',vSpace:'ვერტ. სივრცე',validateSrc:'URL არ უნდა იყოს ცარიელი.',validateHSpace:'ჰორიზონტალური სივრცე არ უნდა იყოს ცარიელი.',validateVSpace:'ვერტიკალური სივრცე არ უნდა იყოს ცარიელი.'},spellCheck:{toolbar:'მართლწერა',title:'მართლწერა',notAvailable:'უკაცრავად, ეს სერვისი ამჟამად მიუწვდომელია.',errorLoading:'სერვისის გამოძახების შეცდომა: %s.',notInDic:'არაა ლექსიკონში',changeTo:'შეცვლელი',btnIgnore:'უგულებელყოფა',btnIgnoreAll:'ყველას უგულებელყოფა',btnReplace:'შეცვლა',btnReplaceAll:'ყველას შეცვლა',btnUndo:'გაუქმება',noSuggestions:'- არაა შემოთავაზება -',progress:'მიმდინარეობს მართლწერის შემოწმება...',noMispell:'მართლწერის შემოწმება: შეცდომა არ მოიძებნა',noChanges:'მართლწერის შემოწმება: არაფერი შეცვლილა',oneChange:'მართლწერის შემოწმება: ერთი სიტყვა შეიცვალა',manyChanges:'მართლწერის შემოწმება: %1 სიტყვა შეიცვალა',ieSpellDownload:'მართლწერის შემოწმება არაა დაინსტალირებული. ჩამოვქაჩოთ ინტერნეტიდან?'},smiley:{toolbar:'სიცილაკები',title:'სიცილაკის ჩასმა',options:'სიცილაკის პარამეტრები'},elementsPath:{eleLabel:'ელემეტის გზა',eleTitle:'%1 ელემენტი'},numberedlist:'გადანომრილი სია',bulletedlist:'ღილიანი სია',indent:'მეტად შეწევა',outdent:'ნაკლებად შეწევა',justify:{left:'მარცხნივ სწორება',center:'შუაში სწორება',right:'მარჯვნივ სწორება',block:'გადასწორება'},blockquote:'ციტატა',clipboard:{title:'ჩასმა',cutError:'თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა ამოჭრის ოპერაციის ავტომატურად განხორციელების საშუალებას. გამოიყენეთ კლავიატურა ამისთვის (Ctrl/Cmd+X).',copyError:'თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა ასლის ოპერაციის ავტომატურად განხორციელების საშუალებას. გამოიყენეთ კლავიატურა ამისთვის (Ctrl/Cmd+C).',pasteMsg:'ჩასვით ამ არის შიგნით კლავიატურის გამოყენებით (<strong>Ctrl/Cmd+V</strong>) და დააჭირეთ OK-ს',securityMsg:'თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა clipboard-ის მონაცემების წვდომის უფლებას. კიდევ უნდა ჩასვათ ტექსტი ამ ფანჯარაში.',pasteArea:'ჩასმის არე'},pastefromword:{confirmCleanup:'ჩასასმელი ტექსტი ვორდიდან გადმოტანილს გავს - გინდათ მისი წინასწარ გაწმენდა?',toolbar:'ვორდიდან ჩასმა',title:'ვორდიდან ჩასმა',error:'შიდა შეცდომის გამო ვერ მოხერხდა ტექსტის გაწმენდა'},pasteText:{button:'მხოლოდ ტექსტის ჩასმა',title:'მხოლოდ ტექსტის ჩასმა'},templates:{button:'თარგები',title:'თარგები',options:'თარგების პარამეტრები',insertOption:'მიმდინარე შეგთავსის შეცვლა',selectPromptMsg:'აირჩიეთ თარგი რედაქტორისთვის',emptyListMsg:'(თარგი არაა განსაზღვრული)'},showBlocks:'არეების ჩვენება',stylesCombo:{label:'სტილები',panelTitle:'ფორმატირების სტილები',panelTitle1:'არის სტილები',panelTitle2:'თანდართული სტილები',panelTitle3:'ობიექტის სტილები'},format:{label:'ფიორმატირება',panelTitle:'ფორმატირება',tag_p:'ჩვეულებრივი',tag_pre:'ფორმატირებული',tag_address:'მისამართი',tag_h1:'სათაური 1',tag_h2:'სათაური 2',tag_h3:'სათაური 3',tag_h4:'სათაური 4',tag_h5:'სათაური 5',tag_h6:'სათაური 6',tag_div:'ჩვეულებრივი (DIV)'},div:{title:'Div კონტეინერის შექმნა',toolbar:'Div კონტეინერის შექმნა',cssClassInputLabel:'CSS კლასები',styleSelectLabel:'სტილი',IdInputLabel:'Id',languageCodeInputLabel:'ენის კოდი',inlineStyleInputLabel:'თანდართული სტილი',advisoryTitleInputLabel:'სათაური',langDirLabel:'ენის მინართულება',langDirLTRLabel:'მარცხნიდან მარჯვნიც (LTR)',langDirRTLLabel:'მარჯვნიდან მარცხნივ (RTL)',edit:'Div-ის რედაქტირება',remove:'Div-ის წაშლა'},iframe:{title:'IFrame-ის პარამეტრები',toolbar:'IFrame',noUrl:'აკრიფეთ iframe-ის URL',scrolling:'გადახვევის ზოლების დაშვება',border:'ჩარჩოს გამოჩენა'},font:{label:'ფონტი',voiceLabel:'ფონტი',panelTitle:'ფონტის სახელი'},fontSize:{label:'ზომა',voiceLabel:'ტექსტის ზომა',panelTitle:'ტექსტის ზომა'},colorButton:{textColorTitle:'ტექსტის ფერი',bgColorTitle:'ფონის ფერი',panelTitle:'ფერები',auto:'ავტომატური',more:'მეტი ფერი...'},colors:{'000':'შავი',800000:'მუქი შინდისფერი','8B4513':'ყავისფერი','2F4F4F':'მოლურჯო ნაცრისფერი','008080':'ჩამქრალი ლურჯი','000080':'მუქი ლურჯი','4B0082':'იასამნისფერი',696969:'მუქი ნაცრისფერი',B22222:'აგურისფერი',A52A2A:'მუქი ყავისფერი',DAA520:'მოყვითალო','006400':'მუქი მწვანე','40E0D0':'ცისფერი','0000CD':'ზომიერად ლურჯი',800080:'იისფერი',808080:'ნაცრისფერი',F00:'წითელი',FF8C00:'მუქი სტაფილოსფერი',FFD700:'ოქროსფერი','008000':'მწვანე','0FF':'ღია ცისფერი','00F':'ლურჯი',EE82EE:'იისფერი',A9A9A9:'ბაცი ნაცრისფერი',FFA07A:'ჩამქრალი ვარდისფერი',FFA500:'სტაფილოსფერი',FFFF00:'ყვითელი','00FF00':'ლურჯი',AFEEEE:'ცისფერი',ADD8E6:'ღია ლურჯი',DDA0DD:'ღია იისფერი',D3D3D3:'ღია ნაცრისფერი',FFF0F5:'ღია ვარდისფერი',FAEBD7:'ღია ყავისფერი',FFFFE0:'ნათელი ყვითელი',F0FFF0:'ღია მწვანე',F0FFFF:'ღია ცისფერი 2',F0F8FF:'ღია ცისფერი 3',E6E6FA:'ღია იისფერი 2',FFF:'თეთრი'},scayt:{title:'მართლწერის შემოწმება კრეფისას',opera_title:'არაა მხარდაჭერილი Opera-ს მიერ',enable:'SCAYT-ის ჩართვა',disable:'SCAYT-ის გამორთვა',about:'SCAYT-ის შესახებ',toggle:'SCAYT-ის გადართვა',options:'პარამეტრები',langs:'ენები',moreSuggestions:'მეტი შემოთავაზება',ignore:'უგულებელყოფა',ignoreAll:'ყველას უგულებელყოფა',addWord:'სიტყვის დამატება',emptyDic:'ლექსიკონის სიტყვა არ უნდა იყოს ცარიელი.',optionsTab:'პარამეტრები',allCaps:'დიდი ასოებით დაწერილი სიტყვების უგულებელყოფა',ignoreDomainNames:'დომენური სახელების უგულებელყოფა',mixedCase:'შერეული ასოებანი სიტყვების უგულებელყოფა',mixedWithDigits:'ციფრებიანი სიტყვების უგულებელყოფა',languagesTab:'ენები',dictionariesTab:'ლექსიკონები',dic_field_name:'ლექსიკონის სახელი',dic_create:'შექმნა',dic_restore:'დაბრუნება',dic_delete:'წაშლა',dic_rename:'გადარქმევა',dic_info:'თავდაპირველად მომხმარებლის ლექსიკონი ინახება Cookie-ში. თუმცა Cookie შეზღუდულია ზომაში. როცა ლექსიკონის ზომა გაიზრდება საკმაოდ ის შეიძლება შევინახოთ ჩვენს სერვერზე. ჩვენს სერვერზე ლექსიკონს შესანახად უნდა მიუთითოთ მისი სახელი. თუ უკე გაქვთ ლექსიკონი, აკრიფეთ მისი სახელი და დააჭირეთ "დაბრუნების" ღილაკს.',aboutTab:'ინფორმაცია'},about:{title:'CKEditor-ის შესახებ',dlgTitle:'CKEditor-ის შესახებ',help:'დახმარებისთვის იხილეთ $1.',userGuide:'CKEditor-ის მომხმარებლის სახელმძღვანელო',moreInfo:'ლიცენზიის ინფორმაციისთვის ეწვიეთ ჩვენს საიტს:',copy:'Copyright © $1. ყველა უფლება დაცულია.'},maximize:'გადიდება',minimize:'დაპატარავება',fakeobjects:{anchor:'ღუზა',flash:'Flash ანიმაცია',iframe:'IFrame',hiddenfield:'მალული ველი',unknown:'უცნობი ობიექტი'},resize:'გაწიე ზომის შესაცვლელად',colordialog:{title:'ფერის შეცვლა',options:'ფერის პარამეტრები',highlight:'ჩვენება',selected:'არჩეული ფერი',clear:'გასუფთავება'},toolbarCollapse:'ხელსაწყოთა ზოლის შეწევა',toolbarExpand:'ხელსაწყოთა ზოლის გამოწევა',toolbarGroups:{document:'დოკუმენტი',clipboard:'Clipboard/გაუქმება',editing:'რედაქტირება',forms:'ფორმები',basicstyles:'ძირითადი სტილები',paragraph:'აბზაცი',links:'ბმულები',insert:'ჩასმა',styles:'სტილები',colors:'ფერები',tools:'ხელსაწყოები'},bidi:{ltr:'ტექსტის მიმართულება მარცხნიდან მარჯვნივ',rtl:'ტექსტის მიმართულება მარჯვნიდან მარცხნივ'},docprops:{label:'დოკუმენტის პარამეტრები',title:'დოკუმენტის პარამეტრები',design:'დიზაინი',meta:'მეტაTag-ები',chooseColor:'არჩევა',other:'სხვა...',docTitle:'გვერდის სათაური',charset:'კოდირება',charsetOther:'სხვა კოდირებები',charsetASCII:'ამერიკული (ASCII)',charsetCE:'ცენტრალურ ევროპული',charsetCT:'ტრადიციული ჩინური (Big5)',charsetCR:'კირილური',charsetGR:'ბერძნული',charsetJP:'იაპონური',charsetKR:'კორეული',charsetTR:'თურქული',charsetUN:'უნიკოდი (UTF-8)',charsetWE:'დასავლეთ ევროპული',docType:'დოკუმენტის ტიპი',docTypeOther:'სხვა ტიპის დოკუმენტი',xhtmlDec:'XHTML დეკლარაციების ჩართვა',bgColor:'ფონის ფერი',bgImage:'ფონური სურათის URL',bgFixed:'უმოძრაო (ფიქსირებული) ფონი',txtColor:'ტექსტის ფერი',margin:'გვერდის კიდეები',marginTop:'ზედა',marginLeft:'მარცხენა',marginRight:'მარჯვენა',marginBottom:'ქვედა',metaKeywords:'დოკუმენტის საკვანძო სიტყვები (მძიმით გამოყოფილი)',metaDescription:'დოკუმენტის აღწერა',metaAuthor:'ავტორი',metaCopyright:'Copyright',previewHtml:'<p>ეს არის <strong>საცდელი ტექსტი</strong>. თქვენ <a href="javascript:void(0)">CKEditor</a>-ით სარგებლობთ.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.ka={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'ტექსტის რედაქტორი',source:'კოდები',newPage:'ახალი გვერდი',save:'ჩაწერა',preview:'გადახედვა',cut:'ამოჭრა',copy:'ასლი',paste:'ჩასმა',print:'ბეჭდვა',underline:'გახაზული',bold:'მსხვილი',italic:'დახრილი',selectAll:'ყველაფრის მონიშნვა',removeFormat:'ფორმატირების მოხსნა',strike:'გადახაზული',subscript:'ინდექსი',superscript:'ხარისხი',horizontalrule:'ჰორიზონტალური ხაზის ჩასმა',pagebreak:'გვერდის წყვეტა ბეჭდვისთვის',pagebreakAlt:'გვერდის წყვეტა',unlink:'ბმულის მოხსნა',undo:'გაუქმება',redo:'გამეორება',common:{browseServer:'სერვერზე დათვალიერება',url:'URL',protocol:'პროტოკოლი',upload:'ატვირთვა',uploadSubmit:'სერვერზე გაგზავნა',image:'სურათი',flash:'Flash',form:'ფორმა',checkbox:'მონიშვნის ღილაკი',radio:'ამორჩევის ღილაკი',textField:'ტექსტური ველი',textarea:'ტექსტური არე',hiddenField:'მალული ველი',button:'ღილაკი',select:'არჩევის ველი',imageButton:'სურათიანი ღილაკი',notSet:'<არაფერი>',id:'Id',name:'სახელი',langDir:'ენის მიმართულება',langDirLtr:'მარცხნიდან მარჯვნივ (LTR)',langDirRtl:'მარჯვნიდან მარცხნივ (RTL)',langCode:'ენის კოდი',longDescr:'დიდი აღწერის URL',cssClass:'CSS კლასი',advisoryTitle:'სათაური',cssStyle:'CSS სტილი',ok:'დიახ',cancel:'გაუქმება',close:'დახურვა',preview:'გადახედვა',generalTab:'ინფორმაცია',advancedTab:'გაფართოებული',validateNumberFailed:'ეს მნიშვნელობა არაა რიცხვი.',confirmNewPage:'ამ დოკუმენტში ყველა ჩაუწერელი ცვლილება დაიკარგება. დარწმუნებული ხართ რომ ახალი გვერდის ჩატვირთვა გინდათ?',confirmCancel:'ზოგიერთი პარამეტრი შეცვლილია, დარწმუნებულილ ხართ რომ ფანჯრის დახურვა გსურთ?',options:'პარამეტრები',target:'გახსნის ადგილი',targetNew:'ახალი ფანჯარა (_blank)',targetTop:'ზედა ფანჯარა (_top)',targetSelf:'იგივე ფანჯარა (_self)',targetParent:'მშობელი ფანჯარა (_parent)',langDirLTR:'მარცხნიდან მარჯვნივ (LTR)',langDirRTL:'მარჯვნიდან მარცხნივ (RTL)',styles:'სტილი',cssClasses:'CSS კლასი',width:'სიგანე',height:'სიმაღლე',align:'სწორება',alignLeft:'მარცხენა',alignRight:'მარჯვენა',alignCenter:'შუა',alignTop:'ზემოთა',alignMiddle:'შუა',alignBottom:'ქვემოთა',invalidHeight:'სიმაღლე რიცხვით უნდა იყოს წარმოდგენილი.',invalidWidth:'სიგანე რიცხვით უნდა იყოს წარმოდგენილი.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, მიუწვდომელია</span>'},contextmenu:{options:'კონტექსტური მენიუს პარამეტრები'},specialChar:{toolbar:'სპეციალური სიმბოლოს ჩასმა',title:'სპეციალური სიმბოლოს არჩევა',options:'სპეციალური სიმბოლოს პარამეტრები'},link:{toolbar:'ბმული',other:'<სხვა>',menu:'ბმულის რედაქტირება',title:'ბმული',info:'ბმულის ინფორმაცია',target:'გახსნის ადგილი',upload:'აქაჩვა',advanced:'დაწვრილებით',type:'ბმულის ტიპი',toUrl:'URL',toAnchor:'ბმული ტექსტში ღუზაზე',toEmail:'ელფოსტა',targetFrame:'<frame>',targetPopup:'<popup ფანჯარა>',targetFrameName:'Frame-ის სახელი',targetPopupName:'Popup ფანჯრის სახელი',popupFeatures:'Popup ფანჯრის პარამეტრები',popupResizable:'ცვალებადი ზომით',popupStatusBar:'სტატუსის ზოლი',popupLocationBar:'ნავიგაციის ზოლი',popupToolbar:'ხელსაწყოთა ზოლი',popupMenuBar:'მენიუს ზოლი',popupFullScreen:'მთელი ეკრანი (IE)',popupScrollBars:'გადახვევის ზოლები',popupDependent:'დამოკიდებული (Netscape)',popupLeft:'მარცხენა პოზიცია',popupTop:'ზედა პოზიცია',id:'Id',langDir:'ენის მიმართულება',langDirLTR:'მარცხნიდან მარჯვნივ (LTR)',langDirRTL:'მარჯვნიდან მარცხნივ (RTL)',acccessKey:'წვდომის ღილაკი',name:'სახელი',langCode:'ენის კოდი',tabIndex:'Tab-ის ინდექსი',advisoryTitle:'სათაური',advisoryContentType:'შიგთავსის ტიპი',cssClasses:'CSS კლასი',charset:'კოდირება',styles:'CSS სტილი',rel:'კავშირი',selectAnchor:'აირჩიეთ ღუზა',anchorName:'ღუზის სახელით',anchorId:'ელემენტის Id-თ',emailAddress:'ელფოსტის მისამართები',emailSubject:'წერილის სათაური',emailBody:'წერილის ტექსტი',noAnchors:'(ამ დოკუმენტში ღუზა არაა)',noUrl:'აკრიფეთ ბმულის URL',noEmail:'აკრიფეთ ელფოსტის მისამართი'},anchor:{toolbar:'ღუზა',menu:'ღუზის რედაქტირება',title:'ღუზის პარამეტრები',name:'ღუზუს სახელი',errorName:'აკრიფეთ ღუზის სახელი',remove:'Remove Anchor'},list:{numberedTitle:'გადანომრილი სიის პარამეტრები',bulletedTitle:'ღილებიანი სიის პარამეტრები',type:'ტიპი',start:'საწყისი',validateStartNumber:'სიის საწყისი მთელი რიცხვი უნდა იყოს.',circle:'წრეწირი',disc:'წრე',square:'კვადრატი',none:'არაფერი',notset:'<არაფერი>',armenian:'სომხური გადანომრვა',georgian:'ქართული გადანომრვა (ან, ბან, გან, ..)',lowerRoman:'რომაული გადანომრვცა პატარა ციფრებით (i, ii, iii, iv, v, ..)',upperRoman:'რომაული გადანომრვა დიდი ციფრებით (I, II, III, IV, V, etc.)',lowerAlpha:'პატარა ლათინური ასოებით (a, b, c, d, e, ..)',upperAlpha:'დიდი ლათინური ასოებით (A, B, C, D, E, ..)',lowerGreek:'პატარა ბერძნული ასოებით (ალფა, ბეტა, გამა, ..)',decimal:'რიცხვებით (1, 2, 3, ..)',decimalLeadingZero:'ნულით დაწყებული რიცხვებით (01, 02, 03, ..)'},findAndReplace:{title:'ძებნა და შეცვლა',find:'ძებნა',replace:'შეცვლა',findWhat:'საძიებელი ტექსტი:',replaceWith:'შეცვლის ტექსტი:',notFoundMsg:'მითითებული ტექსტი არ მოიძებნა.',findOptions:'Find Options',matchCase:'დიდი და პატარა ასოების დამთხვევა',matchWord:'მთელი სიტყვის დამთხვევა',matchCyclic:'დოკუმენტის ბოლოში გასვლის მერე თავიდან დაწყება',replaceAll:'ყველას შეცვლა',replaceSuccessMsg:'%1 მოძებნილი შეიცვალა.'},table:{toolbar:'ცხრილი',title:'ცხრილის პარამეტრები',menu:'ცხრილის პარამეტრები',deleteTable:'ცხრილის წაშლა',rows:'სტრიქონი',columns:'სვეტი',border:'ჩარჩოს ზომა',widthPx:'წერტილი',widthPc:'პროცენტი',widthUnit:'საზომი ერთეული',cellSpace:'უჯრის სივრცე (spacing)',cellPad:'უჯრის კიდე (padding)',caption:'სათაური',summary:'შეჯამება',headers:'სათაურები',headersNone:'არაფერი',headersColumn:'პირველი სვეტი',headersRow:'პირველი სტრიქონი',headersBoth:'ორივე',invalidRows:'სტრიქონების რაოდენობა დადებითი რიცხვი უნდა იყოს.',invalidCols:'სვეტების რაოდენობა დადებითი რიცხვი უნდა იყოს.',invalidBorder:'ჩარჩოს ზომა რიცხვით უდნა იყოს წარმოდგენილი.',invalidWidth:'ცხრილის სიგანე რიცხვით უნდა იყოს წარმოდგენილი.',invalidHeight:'ცხრილის სიმაღლე რიცხვით უნდა იყოს წარმოდგენილი.',invalidCellSpacing:'უჯრის სივრცე (spacing) რიცხვით უნდა იყოს წარმოდგენილი.',invalidCellPadding:'უჯრის კიდე (padding) რიცხვით უნდა იყოს წარმოდგენილი.',cell:{menu:'უჯრა',insertBefore:'უჯრის ჩასმა მანამდე',insertAfter:'უჯრის ჩასმა მერე',deleteCell:'უჯრების წაშლა',merge:'უჯრების შეერთება',mergeRight:'შეერთება მარჯვენასთან',mergeDown:'შეერთება ქვემოთასთან',splitHorizontal:'გაყოფა ჰორიზონტალურად',splitVertical:'გაყოფა ვერტიკალურად',title:'უჯრის პარამეტრები',cellType:'უჯრის ტიპი',rowSpan:'სტრიქონების ოდენობა',colSpan:'სვეტების ოდენობა',wordWrap:'სტრიქონის გადატანა (Word Wrap)',hAlign:'ჰორიზონტალური სწორება',vAlign:'ვერტიკალური სწორება',alignBaseline:'ძირითადი ხაზის გასწვრივ',bgColor:'ფონის ფერი',borderColor:'ჩარჩოს ფერი',data:'მონაცემები',header:'სათაური',yes:'დიახ',no:'არა',invalidWidth:'უჯრის სიგანე რიცხვით უნდა იყოს წარმოდგენილი.',invalidHeight:'უჯრის სიმაღლე რიცხვით უნდა იყოს წარმოდგენილი.',invalidRowSpan:'სტრიქონების რაოდენობა მთელი რიცხვი უნდა იყოს.',invalidColSpan:'სვეტების რაოდენობა მთელი რიცხვი უნდა იყოს.',chooseColor:'არჩევა'},row:{menu:'სტრიქონი',insertBefore:'სტრიქონის ჩამატება წინ',insertAfter:'სტრიქონის ჩამატება მერე',deleteRow:'სტრიქონების წაშლა'},column:{menu:'სვეტი',insertBefore:'სვეტის ჩამატება წინ',insertAfter:'სვეტის ჩამატება მერე',deleteColumn:'სვეტების წაშლა'}},button:{title:'ღილაკის პარამეტრები',text:'ტექსტი',type:'ტიპი',typeBtn:'ღილაკი',typeSbm:'გაგზავნა',typeRst:'გასუფთავება'},checkboxAndRadio:{checkboxTitle:'მონიშვნის ღილაკის (Checkbox) პარამეტრები',radioTitle:'ასარჩევი ღილაკის (Radio) პარამეტრები',value:'ტექსტი',selected:'არჩეული'},form:{title:'ფორმის პარამეტრები',menu:'ფორმის პარამეტრები',action:'ქმედება',method:'მეთოდი',encoding:'კოდირება'},select:{title:'არჩევის ველის პარამეტრები',selectInfo:'ინფორმაცია',opAvail:'შესაძლებელი ვარიანტები',value:'მნიშვნელობა',size:'ზომა',lines:'ხაზები',chkMulti:'მრავლობითი არჩევანის საშუალება',opText:'ტექსტი',opValue:'მნიშვნელობა',btnAdd:'დამატება',btnModify:'შეცვლა',btnUp:'ზემოთ',btnDown:'ქვემოთ',btnSetValue:'ამორჩეულ მნიშვნელოვნად დაყენება',btnDelete:'წაშლა'},textarea:{title:'ტექსტური არის პარამეტრები',cols:'სვეტები',rows:'სტრიქონები'},textfield:{title:'ტექსტური ველის პარამეტრები',name:'სახელი',value:'მნიშვნელობა',charWidth:'სიმბოლოს ზომა',maxChars:'ასოების მაქსიმალური ოდენობა',type:'ტიპი',typeText:'ტექსტი',typePass:'პაროლი'},hidden:{title:'მალული ველის პარამეტრები',name:'სახელი',value:'მნიშვნელობა'},image:{title:'სურათის პარამეტრები',titleButton:'სურათიანი ღილაკის პარამეტრები',menu:'სურათის პარამეტრები',infoTab:'სურათის ინფორმცია',btnUpload:'სერვერისთვის გაგზავნა',upload:'ატვირთვა',alt:'სანაცვლო ტექსტი',lockRatio:'პროპორციის შენარჩუნება',resetSize:'ზომის დაბრუნება',border:'ჩარჩო',hSpace:'ჰორიზონტალური სივრცე',vSpace:'ვერტიკალური სივრცე',alertUrl:'აკრიფეთ სურათის URL',linkTab:'ბმული',button2Img:'გსურთ არჩეული სურათიანი ღილაკის გადაქცევა ჩვეულებრივ ღილაკად?',img2Button:'გსურთ არჩეული ჩვეულებრივი ღილაკის გადაქცევა სურათიან ღილაკად?',urlMissing:'სურათის URL არაა შევსებული.',validateBorder:'ჩარჩო მთელი რიცხვი უნდა იყოს.',validateHSpace:'ჰორიზონტალური სივრცე მთელი რიცხვი უნდა იყოს.',validateVSpace:'ვერტიკალური სივრცე მთელი რიცხვი უნდა იყოს.'},flash:{properties:'Flash-ის პარამეტრები',propertiesTab:'პარამეტრები',title:'Flash-ის პარამეტრები',chkPlay:'ავტო გაშვება',chkLoop:'ჩაციკლვა',chkMenu:'Flash-ის მენიუს დაშვება',chkFull:'მთელი ეკრანის დაშვება',scale:'მასშტაბირება',scaleAll:'ყველაფრის ჩვენება',scaleNoBorder:'ჩარჩოს გარეშე',scaleFit:'ზუსტი ჩასმა',access:'სკრიპტის წვდომა',accessAlways:'ყოველთვის',accessSameDomain:'იგივე დომენი',accessNever:'არასდროს',alignAbsBottom:'ჩარჩოს ქვემოთა ნაწილის სწორება ტექსტისთვის',alignAbsMiddle:'ჩარჩოს შუა ნაწილის სწორება ტექსტისთვის',alignBaseline:'საბაზისო ხაზის სწორება',alignTextTop:'ტექსტი ზემოდან',quality:'ხარისხი',qualityBest:'საუკეთესო',qualityHigh:'მაღალი',qualityAutoHigh:'მაღალი (ავტომატური)',qualityMedium:'საშუალო',qualityAutoLow:'ძალიან დაბალი',qualityLow:'დაბალი',windowModeWindow:'ფანჯარა',windowModeOpaque:'გაუმჭვირვალე',windowModeTransparent:'გამჭვირვალე',windowMode:'ფანჯრის რეჟიმი',flashvars:'ცვლადები Flash-ისთვის',bgcolor:'ფონის ფერი',hSpace:'ჰორიზ. სივრცე',vSpace:'ვერტ. სივრცე',validateSrc:'URL არ უნდა იყოს ცარიელი.',validateHSpace:'ჰორიზონტალური სივრცე არ უნდა იყოს ცარიელი.',validateVSpace:'ვერტიკალური სივრცე არ უნდა იყოს ცარიელი.'},spellCheck:{toolbar:'მართლწერა',title:'მართლწერა',notAvailable:'უკაცრავად, ეს სერვისი ამჟამად მიუწვდომელია.',errorLoading:'სერვისის გამოძახების შეცდომა: %s.',notInDic:'არაა ლექსიკონში',changeTo:'შეცვლელი',btnIgnore:'უგულებელყოფა',btnIgnoreAll:'ყველას უგულებელყოფა',btnReplace:'შეცვლა',btnReplaceAll:'ყველას შეცვლა',btnUndo:'გაუქმება',noSuggestions:'- არაა შემოთავაზება -',progress:'მიმდინარეობს მართლწერის შემოწმება...',noMispell:'მართლწერის შემოწმება: შეცდომა არ მოიძებნა',noChanges:'მართლწერის შემოწმება: არაფერი შეცვლილა',oneChange:'მართლწერის შემოწმება: ერთი სიტყვა შეიცვალა',manyChanges:'მართლწერის შემოწმება: %1 სიტყვა შეიცვალა',ieSpellDownload:'მართლწერის შემოწმება არაა დაინსტალირებული. ჩამოვქაჩოთ ინტერნეტიდან?'},smiley:{toolbar:'სიცილაკები',title:'სიცილაკის ჩასმა',options:'სიცილაკის პარამეტრები'},elementsPath:{eleLabel:'ელემეტის გზა',eleTitle:'%1 ელემენტი'},numberedlist:'გადანომრილი სია',bulletedlist:'ღილიანი სია',indent:'მეტად შეწევა',outdent:'ნაკლებად შეწევა',justify:{left:'მარცხნივ სწორება',center:'შუაში სწორება',right:'მარჯვნივ სწორება',block:'გადასწორება'},blockquote:'ციტატა',clipboard:{title:'ჩასმა',cutError:'თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა ამოჭრის ოპერაციის ავტომატურად განხორციელების საშუალებას. გამოიყენეთ კლავიატურა ამისთვის (Ctrl/Cmd+X).',copyError:'თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა ასლის ოპერაციის ავტომატურად განხორციელების საშუალებას. გამოიყენეთ კლავიატურა ამისთვის (Ctrl/Cmd+C).',pasteMsg:'ჩასვით ამ არის შიგნით კლავიატურის გამოყენებით (<strong>Ctrl/Cmd+V</strong>) და დააჭირეთ OK-ს',securityMsg:'თქვენი ბროუზერის უსაფრთხოების პარამეტრები არ იძლევა clipboard-ის მონაცემების წვდომის უფლებას. კიდევ უნდა ჩასვათ ტექსტი ამ ფანჯარაში.',pasteArea:'ჩასმის არე'},pastefromword:{confirmCleanup:'ჩასასმელი ტექსტი ვორდიდან გადმოტანილს გავს - გინდათ მისი წინასწარ გაწმენდა?',toolbar:'ვორდიდან ჩასმა',title:'ვორდიდან ჩასმა',error:'შიდა შეცდომის გამო ვერ მოხერხდა ტექსტის გაწმენდა'},pasteText:{button:'მხოლოდ ტექსტის ჩასმა',title:'მხოლოდ ტექსტის ჩასმა'},templates:{button:'თარგები',title:'თარგები',options:'თარგების პარამეტრები',insertOption:'მიმდინარე შეგთავსის შეცვლა',selectPromptMsg:'აირჩიეთ თარგი რედაქტორისთვის',emptyListMsg:'(თარგი არაა განსაზღვრული)'},showBlocks:'არეების ჩვენება',stylesCombo:{label:'სტილები',panelTitle:'ფორმატირების სტილები',panelTitle1:'არის სტილები',panelTitle2:'თანდართული სტილები',panelTitle3:'ობიექტის სტილები'},format:{label:'ფიორმატირება',panelTitle:'ფორმატირება',tag_p:'ჩვეულებრივი',tag_pre:'ფორმატირებული',tag_address:'მისამართი',tag_h1:'სათაური 1',tag_h2:'სათაური 2',tag_h3:'სათაური 3',tag_h4:'სათაური 4',tag_h5:'სათაური 5',tag_h6:'სათაური 6',tag_div:'ჩვეულებრივი (DIV)'},div:{title:'Div კონტეინერის შექმნა',toolbar:'Div კონტეინერის შექმნა',cssClassInputLabel:'CSS კლასები',styleSelectLabel:'სტილი',IdInputLabel:'Id',languageCodeInputLabel:'ენის კოდი',inlineStyleInputLabel:'თანდართული სტილი',advisoryTitleInputLabel:'სათაური',langDirLabel:'ენის მინართულება',langDirLTRLabel:'მარცხნიდან მარჯვნიც (LTR)',langDirRTLLabel:'მარჯვნიდან მარცხნივ (RTL)',edit:'Div-ის რედაქტირება',remove:'Div-ის წაშლა'},iframe:{title:'IFrame-ის პარამეტრები',toolbar:'IFrame',noUrl:'აკრიფეთ iframe-ის URL',scrolling:'გადახვევის ზოლების დაშვება',border:'ჩარჩოს გამოჩენა'},font:{label:'ფონტი',voiceLabel:'ფონტი',panelTitle:'ფონტის სახელი'},fontSize:{label:'ზომა',voiceLabel:'ტექსტის ზომა',panelTitle:'ტექსტის ზომა'},colorButton:{textColorTitle:'ტექსტის ფერი',bgColorTitle:'ფონის ფერი',panelTitle:'ფერები',auto:'ავტომატური',more:'მეტი ფერი...'},colors:{'000':'შავი',800000:'მუქი შინდისფერი','8B4513':'ყავისფერი','2F4F4F':'მოლურჯო ნაცრისფერი','008080':'ჩამქრალი ლურჯი','000080':'მუქი ლურჯი','4B0082':'იასამნისფერი',696969:'მუქი ნაცრისფერი',B22222:'აგურისფერი',A52A2A:'მუქი ყავისფერი',DAA520:'მოყვითალო','006400':'მუქი მწვანე','40E0D0':'ცისფერი','0000CD':'ზომიერად ლურჯი',800080:'იისფერი',808080:'ნაცრისფერი',F00:'წითელი',FF8C00:'მუქი სტაფილოსფერი',FFD700:'ოქროსფერი','008000':'მწვანე','0FF':'ღია ცისფერი','00F':'ლურჯი',EE82EE:'იისფერი',A9A9A9:'ბაცი ნაცრისფერი',FFA07A:'ჩამქრალი ვარდისფერი',FFA500:'სტაფილოსფერი',FFFF00:'ყვითელი','00FF00':'ლურჯი',AFEEEE:'ცისფერი',ADD8E6:'ღია ლურჯი',DDA0DD:'ღია იისფერი',D3D3D3:'ღია ნაცრისფერი',FFF0F5:'ღია ვარდისფერი',FAEBD7:'ღია ყავისფერი',FFFFE0:'ნათელი ყვითელი',F0FFF0:'ღია მწვანე',F0FFFF:'ღია ცისფერი 2',F0F8FF:'ღია ცისფერი 3',E6E6FA:'ღია იისფერი 2',FFF:'თეთრი'},scayt:{title:'მართლწერის შემოწმება კრეფისას',opera_title:'არაა მხარდაჭერილი Opera-ს მიერ',enable:'SCAYT-ის ჩართვა',disable:'SCAYT-ის გამორთვა',about:'SCAYT-ის შესახებ',toggle:'SCAYT-ის გადართვა',options:'პარამეტრები',langs:'ენები',moreSuggestions:'მეტი შემოთავაზება',ignore:'უგულებელყოფა',ignoreAll:'ყველას უგულებელყოფა',addWord:'სიტყვის დამატება',emptyDic:'ლექსიკონის სიტყვა არ უნდა იყოს ცარიელი.',optionsTab:'პარამეტრები',allCaps:'დიდი ასოებით დაწერილი სიტყვების უგულებელყოფა',ignoreDomainNames:'დომენური სახელების უგულებელყოფა',mixedCase:'შერეული ასოებანი სიტყვების უგულებელყოფა',mixedWithDigits:'ციფრებიანი სიტყვების უგულებელყოფა',languagesTab:'ენები',dictionariesTab:'ლექსიკონები',dic_field_name:'ლექსიკონის სახელი',dic_create:'შექმნა',dic_restore:'დაბრუნება',dic_delete:'წაშლა',dic_rename:'გადარქმევა',dic_info:'თავდაპირველად მომხმარებლის ლექსიკონი ინახება Cookie-ში. თუმცა Cookie შეზღუდულია ზომაში. როცა ლექსიკონის ზომა გაიზრდება საკმაოდ ის შეიძლება შევინახოთ ჩვენს სერვერზე. ჩვენს სერვერზე ლექსიკონს შესანახად უნდა მიუთითოთ მისი სახელი. თუ უკე გაქვთ ლექსიკონი, აკრიფეთ მისი სახელი და დააჭირეთ "დაბრუნების" ღილაკს.',aboutTab:'ინფორმაცია'},about:{title:'CKEditor-ის შესახებ',dlgTitle:'CKEditor-ის შესახებ',help:'დახმარებისთვის იხილეთ $1.',userGuide:'CKEditor-ის მომხმარებლის სახელმძღვანელო',moreInfo:'ლიცენზიის ინფორმაციისთვის ეწვიეთ ჩვენს საიტს:',copy:'Copyright © $1. ყველა უფლება დაცულია.'},maximize:'გადიდება',minimize:'დაპატარავება',fakeobjects:{anchor:'ღუზა',flash:'Flash ანიმაცია',iframe:'IFrame',hiddenfield:'მალული ველი',unknown:'უცნობი ობიექტი'},resize:'გაწიე ზომის შესაცვლელად',colordialog:{title:'ფერის შეცვლა',options:'ფერის პარამეტრები',highlight:'ჩვენება',selected:'არჩეული ფერი',clear:'გასუფთავება'},toolbarCollapse:'ხელსაწყოთა ზოლის შეწევა',toolbarExpand:'ხელსაწყოთა ზოლის გამოწევა',toolbarGroups:{document:'დოკუმენტი',clipboard:'Clipboard/გაუქმება',editing:'რედაქტირება',forms:'ფორმები',basicstyles:'ძირითადი სტილები',paragraph:'აბზაცი',links:'ბმულები',insert:'ჩასმა',styles:'სტილები',colors:'ფერები',tools:'ხელსაწყოები'},bidi:{ltr:'ტექსტის მიმართულება მარცხნიდან მარჯვნივ',rtl:'ტექსტის მიმართულება მარჯვნიდან მარცხნივ'},docprops:{label:'დოკუმენტის პარამეტრები',title:'დოკუმენტის პარამეტრები',design:'დიზაინი',meta:'მეტაTag-ები',chooseColor:'არჩევა',other:'სხვა...',docTitle:'გვერდის სათაური',charset:'კოდირება',charsetOther:'სხვა კოდირებები',charsetASCII:'ამერიკული (ASCII)',charsetCE:'ცენტრალურ ევროპული',charsetCT:'ტრადიციული ჩინური (Big5)',charsetCR:'კირილური',charsetGR:'ბერძნული',charsetJP:'იაპონური',charsetKR:'კორეული',charsetTR:'თურქული',charsetUN:'უნიკოდი (UTF-8)',charsetWE:'დასავლეთ ევროპული',docType:'დოკუმენტის ტიპი',docTypeOther:'სხვა ტიპის დოკუმენტი',xhtmlDec:'XHTML დეკლარაციების ჩართვა',bgColor:'ფონის ფერი',bgImage:'ფონური სურათის URL',bgFixed:'უმოძრაო (ფიქსირებული) ფონი',txtColor:'ტექსტის ფერი',margin:'გვერდის კიდეები',marginTop:'ზედა',marginLeft:'მარცხენა',marginRight:'მარჯვენა',marginBottom:'ქვედა',metaKeywords:'დოკუმენტის საკვანძო სიტყვები (მძიმით გამოყოფილი)',metaDescription:'დოკუმენტის აღწერა',metaAuthor:'ავტორი',metaCopyright:'Copyright',previewHtml:'<p>ეს არის <strong>საცდელი ტექსტი</strong>. თქვენ <a href="javascript:void(0)">CKEditor</a>-ით სარგებლობთ.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/km.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/km.js
index b24faea..a50f0d6 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/km.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/km.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.km={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'កូត',newPage:'ទំព័រថ្មី',save:'រក្សាទុក',preview:'មើលសាកល្បង',cut:'កាត់យក',copy:'ចំលងយក',paste:'ចំលងដាក់',print:'បោះពុម្ភ',underline:'ដិតបន្ទាត់ពីក្រោមអក្សរ',bold:'អក្សរដិតធំ',italic:'អក្សរផ្តេក',selectAll:'ជ្រើសរើសទាំងអស់',removeFormat:'លប់ចោល ការរចនា',strike:'ដិតបន្ទាត់ពាក់កណ្តាលអក្សរ',subscript:'អក្សរតូចក្រោម',superscript:'អក្សរតូចលើ',horizontalrule:'បន្ថែមបន្ទាត់ផ្តេក',pagebreak:'បន្ថែម ការផ្តាច់ទំព័រ',pagebreakAlt:'Page Break',unlink:'លប់ឈ្នាប់',undo:'សារឡើងវិញ',redo:'ធ្វើឡើងវិញ',common:{browseServer:'មើល',url:'URL',protocol:'ប្រូតូកូល',upload:'ទាញយក',uploadSubmit:'បញ្ជូនទៅកាន់ម៉ាស៊ីនផ្តល់សេវា',image:'រូបភាព',flash:'Flash',form:'បែបបទ',checkbox:'ប្រអប់ជ្រើសរើស',radio:'ប៉ូតុនរង្វង់មូល',textField:'ជួរសរសេរអត្ថបទ',textarea:'តំបន់សរសេរអត្ថបទ',hiddenField:'ជួរលាក់',button:'ប៉ូតុន',select:'ជួរជ្រើសរើស',imageButton:'ប៉ូតុនរូបភាព',notSet:'<មិនមែន>',id:'Id',name:'ឈ្មោះ',langDir:'ទិសដៅភាសា',langDirLtr:'ពីឆ្វេងទៅស្តាំ(LTR)',langDirRtl:'ពីស្តាំទៅឆ្វេង(RTL)',langCode:'លេខកូតភាសា',longDescr:'អធិប្បាយ URL វែង',cssClass:'Stylesheet Classes',advisoryTitle:'ចំណងជើង ប្រឹក្សា',cssStyle:'ម៉ូត',ok:'យល់ព្រម',cancel:'មិនយល់ព្រម',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'កំរិតខ្ពស់',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'ទទឹង',height:'កំពស់',align:'កំណត់ទីតាំង',alignLeft:'ខាងឆ្វង',alignRight:'ខាងស្តាំ',alignCenter:'កណ្តាល',alignTop:'ខាងលើ',alignMiddle:'កណ្តាល',alignBottom:'ខាងក្រោម',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'បន្ថែមអក្សរពិសេស',title:'តូអក្សរពិសេស',options:'Special Character Options'},link:{toolbar:'បន្ថែម/កែប្រែ ឈ្នាប់',other:'<other>',menu:'កែប្រែឈ្នាប់',title:'ឈ្នាប់',info:'ពត៌មានអំពីឈ្នាប់',target:'គោលដៅ',upload:'ទាញយក',advanced:'កំរិតខ្ពស់',type:'ប្រភេទឈ្នាប់',toUrl:'URL',toAnchor:'យុថ្កានៅក្នុងទំព័រនេះ',toEmail:'អ៊ីមែល',targetFrame:'<ហ្វ្រេម>',targetPopup:'<វីនដូវ លោត>',targetFrameName:'ឈ្មោះហ្រ្វេមដែលជាគោលដៅ',targetPopupName:'ឈ្មោះវីនដូវលោត',popupFeatures:'លក្ខណះរបស់វីនដូលលោត',popupResizable:'Resizable',popupStatusBar:'របា ពត៌មាន',popupLocationBar:'របា ទីតាំង',popupToolbar:'របា ឩបករណ៍',popupMenuBar:'របា មឺនុយ',popupFullScreen:'អេក្រុងពេញ(IE)',popupScrollBars:'របា ទាញ',popupDependent:'អាស្រ័យលើ (Netscape)',popupLeft:'ទីតាំងខាងឆ្វេង',popupTop:'ទីតាំងខាងលើ',id:'Id',langDir:'ទិសដៅភាសា',langDirLTR:'ពីឆ្វេងទៅស្តាំ(LTR)',langDirRTL:'ពីស្តាំទៅឆ្វេង(RTL)',acccessKey:'ឃី សំរាប់ចូល',name:'ឈ្មោះ',langCode:'ទិសដៅភាសា',tabIndex:'លេខ Tab',advisoryTitle:'ចំណងជើង ប្រឹក្សា',advisoryContentType:'ប្រភេទអត្ថបទ ប្រឹក្សា',cssClasses:'Stylesheet Classes',charset:'លេខកូតអក្សររបស់ឈ្នាប់',styles:'ម៉ូត',rel:'Relationship',selectAnchor:'ជ្រើសរើសយុថ្កា',anchorName:'តាមឈ្មោះរបស់យុថ្កា',anchorId:'តាម Id',emailAddress:'អ៊ីមែល',emailSubject:'ចំណងជើងអត្ថបទ',emailBody:'អត្ថបទ',noAnchors:'(No anchors available in the document)',noUrl:'សូមសរសេរ អាស័យដ្ឋាន URL',noEmail:'សូមសរសេរ អាស័យដ្ឋាន អ៊ីមែល'},anchor:{toolbar:'បន្ថែម/កែប្រែ យុថ្កា',menu:'ការកំណត់យុថ្កា',title:'ការកំណត់យុថ្កា',name:'ឈ្មោះយុទ្ធថ្កា',errorName:'សូមសរសេរ ឈ្មោះយុទ្ធថ្កា',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'ស្វែងរក',replace:'ជំនួស',findWhat:'ស្វែងរកអ្វី:',replaceWith:'ជំនួសជាមួយ:',notFoundMsg:'ពាក្យនេះ រកមិនឃើញទេ ។',findOptions:'Find Options',matchCase:'ករណ៉ត្រូវរក',matchWord:'ត្រូវពាក្យទាំងអស់',matchCyclic:'Match cyclic',replaceAll:'ជំនួសទាំងអស់',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'តារាង',title:'ការកំណត់ តារាង',menu:'ការកំណត់ តារាង',deleteTable:'លប់តារាង',rows:'ជួរផ្តេក',columns:'ជួរឈរ',border:'ទំហំស៊ុម',widthPx:'ភីកសែល',widthPc:'ភាគរយ',widthUnit:'width unit',cellSpace:'គំលាតសែល',cellPad:'គែមសែល',caption:'ចំណងជើង',summary:'សេចក្តីសង្ខេប',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Cell',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'លប់សែល',merge:'បញ្ជូលសែល',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Row',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'លប់ជួរផ្តេក'},column:{menu:'Column',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'លប់ជួរឈរ'}},button:{title:'ការកំណត់ ប៉ូតុន',text:'អត្ថបទ(តំលៃ)',type:'ប្រភេទ',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'ការកំណត់ប្រអប់ជ្រើសរើស',radioTitle:'ការកំណត់ប៉ូតុនរង្វង់',value:'តំលៃ',selected:'បានជ្រើសរើស'},form:{title:'ការកំណត់បែបបទ',menu:'ការកំណត់បែបបទ',action:'សកម្មភាព',method:'វិធី',encoding:'Encoding'},select:{title:'ការកំណត់ជួរជ្រើសរើស',selectInfo:'ពត៌មាន',opAvail:'ការកំណត់ជ្រើសរើស ដែលអាចកំណត់បាន',value:'តំលៃ',size:'ទំហំ',lines:'បន្ទាត់',chkMulti:'អនុញ្ញាតអោយជ្រើសរើសច្រើន',opText:'ពាក្យ',opValue:'តំលៃ',btnAdd:'បន្ថែម',btnModify:'ផ្លាស់ប្តូរ',btnUp:'លើ',btnDown:'ក្រោម',btnSetValue:'Set as selected value',btnDelete:'លប់'},textarea:{title:'ការកំណត់កន្លែងសរសេរអត្ថបទ',cols:'ជូរឈរ',rows:'ជូរផ្តេក'},textfield:{title:'ការកំណត់ជួរអត្ថបទ',name:'ឈ្មោះ',value:'តំលៃ',charWidth:'ទទឹង អក្សរ',maxChars:'អក្សរអតិបរិមា',type:'ប្រភេទ',typeText:'ពាក្យ',typePass:'ពាក្យសំងាត់'},hidden:{title:'ការកំណត់ជួរលាក់',name:'ឈ្មោះ',value:'តំលៃ'},image:{title:'ការកំណត់រូបភាព',titleButton:'ការកំណត់ប៉ូតុនរូបភាព',menu:'ការកំណត់រូបភាព',infoTab:'ពត៌មានអំពីរូបភាព',btnUpload:'បញ្ជូនទៅកាន់ម៉ាស៊ីនផ្តល់សេវា',upload:'ទាញយក',alt:'អត្ថបទជំនួស',lockRatio:'អត្រាឡុក',resetSize:'កំណត់ទំហំឡើងវិញ',border:'ស៊ុម',hSpace:'គំលាតទទឹង',vSpace:'គំលាតបណ្តោយ',alertUrl:'សូមសរសេរងាស័យដ្ឋានរបស់រូបភាព',linkTab:'ឈ្នាប់',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'ការកំណត់ Flash',propertiesTab:'Properties',title:'ការកំណត់ Flash',chkPlay:'លេងដោយស្វ័យប្រវត្ត',chkLoop:'ចំនួនដង',chkMenu:'បង្ហាញ មឺនុយរបស់ Flash',chkFull:'Allow Fullscreen',scale:'ទំហំ',scaleAll:'បង្ហាញទាំងអស់',scaleNoBorder:'មិនបង្ហាញស៊ុម',scaleFit:'ត្រូវល្មម',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs Bottom',alignAbsMiddle:'Abs Middle',alignBaseline:'បន្ទាត់ជាមូលដ្ឋាន',alignTextTop:'លើអត្ថបទ',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'ពណ៌ផ្ទៃខាងក្រោយ',hSpace:'គំលាតទទឹង',vSpace:'គំលាតបណ្តោយ',validateSrc:'សូមសរសេរ អាស័យដ្ឋាន URL',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'ពិនិត្យអក្ខរាវិរុទ្ធ',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'គ្មានក្នុងវចនានុក្រម',changeTo:'ផ្លាស់ប្តូរទៅ',btnIgnore:'មិនផ្លាស់ប្តូរ',btnIgnoreAll:'មិនផ្លាស់ប្តូរ ទាំងអស់',btnReplace:'ជំនួស',btnReplaceAll:'ជំនួសទាំងអស់',btnUndo:'សារឡើងវិញ',noSuggestions:'- គ្មានសំណើរ -',progress:'កំពុងពិនិត្យអក្ខរាវិរុទ្ធ...',noMispell:'ការពិនិត្យអក្ខរាវិរុទ្ធបានចប់: គ្មានកំហុស',noChanges:'ការពិនិត្យអក្ខរាវិរុទ្ធបានចប់: ពុំមានផ្លាស់ប្តូរ',oneChange:'ការពិនិត្យអក្ខរាវិរុទ្ធបានចប់: ពាក្យមួយត្រូចបានផ្លាស់ប្តូរ',manyChanges:'ការពិនិត្យអក្ខរាវិរុទ្ធបានចប់: %1 ពាក្យបានផ្លាស់ប្តូរ',ieSpellDownload:'ពុំមានកម្មវិធីពិនិត្យអក្ខរាវិរុទ្ធ ។ តើចង់ទាញយកពីណា?'},smiley:{toolbar:'រូបភាព',title:'បញ្ជូលរូបភាព',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'បញ្ជីជាអក្សរ',bulletedlist:'បញ្ជីជារង្វង់មូល',indent:'បន្ថែមការចូលបន្ទាត់',outdent:'បន្ថយការចូលបន្ទាត់',justify:{left:'តំរឹមឆ្វេង',center:'តំរឹមកណ្តាល',right:'តំរឹមស្តាំ',block:'តំរឹមសងខាង'},blockquote:'Block Quote',clipboard:{title:'ចំលងដាក់',cutError:'ការកំណត់សុវត្ថភាពរបស់កម្មវិធីរុករករបស់លោកអ្នក នេះមិនអាចធ្វើកម្មវិធីតាក់តែងអត្ថបទ កាត់អត្ថបទយកដោយស្វ័យប្រវត្តបានឡើយ ។ សូមប្រើប្រាស់បន្សំ ឃីដូចនេះ (Ctrl/Cmd+X) ។',copyError:'ការកំណត់សុវត្ថភាពរបស់កម្មវិធីរុករករបស់លោកអ្នក នេះមិនអាចធ្វើកម្មវិធីតាក់តែងអត្ថបទ ចំលងអត្ថបទយកដោយស្វ័យប្រវត្តបានឡើយ ។ សូមប្រើប្រាស់បន្សំ ឃីដូចនេះ (Ctrl/Cmd+C)។',pasteMsg:'សូមចំលងអត្ថបទទៅដាក់ក្នុងប្រអប់ដូចខាងក្រោមដោយប្រើប្រាស់ ឃី (<STRONG>Ctrl/Cmd+V</STRONG>) ហើយចុច <STRONG>OK</STRONG> ។',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'ចំលងដាក់ពី Word',title:'ចំលងដាក់ពី Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'ចំលងដាក់អត្ថបទធម្មតា',title:'ចំលងដាក់អត្ថបទធម្មតា'},templates:{button:'ឯកសារគំរូ',title:'ឯកសារគំរូ របស់អត្ថន័យ',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'សូមជ្រើសរើសឯកសារគំរូ ដើម្បីបើកនៅក្នុងកម្មវិធីតាក់តែងអត្ថបទ<br>(អត្ថបទនឹងបាត់បង់):',emptyListMsg:'(ពុំមានឯកសារគំរូត្រូវបានកំណត់)'},showBlocks:'Show Blocks',stylesCombo:{label:'ម៉ូត',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'រចនា',panelTitle:'រចនា',tag_p:'Normal',tag_pre:'Formatted',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'ហ្វុង',voiceLabel:'Font',panelTitle:'ហ្វុង'},fontSize:{label:'ទំហំ',voiceLabel:'Font Size',panelTitle:'ទំហំ'},colorButton:{textColorTitle:'ពណ៌អក្សរ',bgColorTitle:'ពណ៌ផ្ទៃខាងក្រោយ',panelTitle:'Colors',auto:'ស្វ័យប្រវត្ត',more:'ពណ៌ផ្សេងទៀត..'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'ការកំណត់ ឯកសារ',title:'ការកំណត់ ឯកសារ',design:'Design',meta:'ទិន្នន័យមេ',chooseColor:'Choose',other:'<other>',docTitle:'ចំណងជើងទំព័រ',charset:'កំណត់លេខកូតភាសា',charsetOther:'កំណត់លេខកូតភាសាផ្សេងទៀត',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'ប្រភេទក្បាលទំព័រ',docTypeOther:'ប្រភេទក្បាលទំព័រផ្សេងទៀត',xhtmlDec:'បញ្ជូល XHTML',bgColor:'ពណ៌ខាងក្រោម',bgImage:'URL របស់រូបភាពខាងក្រោម',bgFixed:'ទំព័រក្រោមមិនប្តូរ',txtColor:'ពណ៌អក្សរ',margin:'ស៊ុមទំព័រ',marginTop:'លើ',marginLeft:'ឆ្វេង',marginRight:'ស្ដាំ',marginBottom:'ក្រោម',metaKeywords:'ពាក្យនៅក្នុងឯកសារ (ផ្តាច់ពីគ្នាដោយក្បៀស)',metaDescription:'សេចក្តីអត្ថាធិប្បាយអំពីឯកសារ',metaAuthor:'អ្នកនិពន្ធ',metaCopyright:'រក្សាសិទ្ធិ៏',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.km={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'កូត',newPage:'ទំព័រថ្មី',save:'រក្សាទុក',preview:'មើលសាកល្បង',cut:'កាត់យក',copy:'ចំលងយក',paste:'ចំលងដាក់',print:'បោះពុម្ភ',underline:'ដិតបន្ទាត់ពីក្រោមអក្សរ',bold:'អក្សរដិតធំ',italic:'អក្សរផ្តេក',selectAll:'ជ្រើសរើសទាំងអស់',removeFormat:'លប់ចោល ការរចនា',strike:'ដិតបន្ទាត់ពាក់កណ្តាលអក្សរ',subscript:'អក្សរតូចក្រោម',superscript:'អក្សរតូចលើ',horizontalrule:'បន្ថែមបន្ទាត់ផ្តេក',pagebreak:'បន្ថែម ការផ្តាច់ទំព័រ',pagebreakAlt:'Page Break',unlink:'លប់ឈ្នាប់',undo:'សារឡើងវិញ',redo:'ធ្វើឡើងវិញ',common:{browseServer:'មើល',url:'URL',protocol:'ប្រូតូកូល',upload:'ទាញយក',uploadSubmit:'បញ្ជូនទៅកាន់ម៉ាស៊ីនផ្តល់សេវា',image:'រូបភាព',flash:'Flash',form:'បែបបទ',checkbox:'ប្រអប់ជ្រើសរើស',radio:'ប៉ូតុនរង្វង់មូល',textField:'ជួរសរសេរអត្ថបទ',textarea:'តំបន់សរសេរអត្ថបទ',hiddenField:'ជួរលាក់',button:'ប៉ូតុន',select:'ជួរជ្រើសរើស',imageButton:'ប៉ូតុនរូបភាព',notSet:'<មិនមែន>',id:'Id',name:'ឈ្មោះ',langDir:'ទិសដៅភាសា',langDirLtr:'ពីឆ្វេងទៅស្តាំ(LTR)',langDirRtl:'ពីស្តាំទៅឆ្វេង(RTL)',langCode:'លេខកូតភាសា',longDescr:'អធិប្បាយ URL វែង',cssClass:'Stylesheet Classes',advisoryTitle:'ចំណងជើង ប្រឹក្សា',cssStyle:'ម៉ូត',ok:'យល់ព្រម',cancel:'មិនយល់ព្រម',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'កំរិតខ្ពស់',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'ទទឹង',height:'កំពស់',align:'កំណត់ទីតាំង',alignLeft:'ខាងឆ្វង',alignRight:'ខាងស្តាំ',alignCenter:'កណ្តាល',alignTop:'ខាងលើ',alignMiddle:'កណ្តាល',alignBottom:'ខាងក្រោម',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'បន្ថែមអក្សរពិសេស',title:'តូអក្សរពិសេស',options:'Special Character Options'},link:{toolbar:'បន្ថែម/កែប្រែ ឈ្នាប់',other:'<other>',menu:'កែប្រែឈ្នាប់',title:'ឈ្នាប់',info:'ពត៌មានអំពីឈ្នាប់',target:'គោលដៅ',upload:'ទាញយក',advanced:'កំរិតខ្ពស់',type:'ប្រភេទឈ្នាប់',toUrl:'URL',toAnchor:'យុថ្កានៅក្នុងទំព័រនេះ',toEmail:'អ៊ីមែល',targetFrame:'<ហ្វ្រេម>',targetPopup:'<វីនដូវ លោត>',targetFrameName:'ឈ្មោះហ្រ្វេមដែលជាគោលដៅ',targetPopupName:'ឈ្មោះវីនដូវលោត',popupFeatures:'លក្ខណះរបស់វីនដូលលោត',popupResizable:'Resizable',popupStatusBar:'របា ពត៌មាន',popupLocationBar:'របា ទីតាំង',popupToolbar:'របា ឩបករណ៍',popupMenuBar:'របា មឺនុយ',popupFullScreen:'អេក្រុងពេញ(IE)',popupScrollBars:'របា ទាញ',popupDependent:'អាស្រ័យលើ (Netscape)',popupLeft:'ទីតាំងខាងឆ្វេង',popupTop:'ទីតាំងខាងលើ',id:'Id',langDir:'ទិសដៅភាសា',langDirLTR:'ពីឆ្វេងទៅស្តាំ(LTR)',langDirRTL:'ពីស្តាំទៅឆ្វេង(RTL)',acccessKey:'ឃី សំរាប់ចូល',name:'ឈ្មោះ',langCode:'ទិសដៅភាសា',tabIndex:'លេខ Tab',advisoryTitle:'ចំណងជើង ប្រឹក្សា',advisoryContentType:'ប្រភេទអត្ថបទ ប្រឹក្សា',cssClasses:'Stylesheet Classes',charset:'លេខកូតអក្សររបស់ឈ្នាប់',styles:'ម៉ូត',rel:'Relationship',selectAnchor:'ជ្រើសរើសយុថ្កា',anchorName:'តាមឈ្មោះរបស់យុថ្កា',anchorId:'តាម Id',emailAddress:'អ៊ីមែល',emailSubject:'ចំណងជើងអត្ថបទ',emailBody:'អត្ថបទ',noAnchors:'(No anchors available in the document)',noUrl:'សូមសរសេរ អាស័យដ្ឋាន URL',noEmail:'សូមសរសេរ អាស័យដ្ឋាន អ៊ីមែល'},anchor:{toolbar:'បន្ថែម/កែប្រែ យុថ្កា',menu:'ការកំណត់យុថ្កា',title:'ការកំណត់យុថ្កា',name:'ឈ្មោះយុទ្ធថ្កា',errorName:'សូមសរសេរ ឈ្មោះយុទ្ធថ្កា',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'ស្វែងរក',replace:'ជំនួស',findWhat:'ស្វែងរកអ្វី:',replaceWith:'ជំនួសជាមួយ:',notFoundMsg:'ពាក្យនេះ រកមិនឃើញទេ ។',findOptions:'Find Options',matchCase:'ករណ៉ត្រូវរក',matchWord:'ត្រូវពាក្យទាំងអស់',matchCyclic:'Match cyclic',replaceAll:'ជំនួសទាំងអស់',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'តារាង',title:'ការកំណត់ តារាង',menu:'ការកំណត់ តារាង',deleteTable:'លប់តារាង',rows:'ជួរផ្តេក',columns:'ជួរឈរ',border:'ទំហំស៊ុម',widthPx:'ភីកសែល',widthPc:'ភាគរយ',widthUnit:'width unit',cellSpace:'គំលាតសែល',cellPad:'គែមសែល',caption:'ចំណងជើង',summary:'សេចក្តីសង្ខេប',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Cell',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'លប់សែល',merge:'បញ្ជូលសែល',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Row',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'លប់ជួរផ្តេក'},column:{menu:'Column',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'លប់ជួរឈរ'}},button:{title:'ការកំណត់ ប៉ូតុន',text:'អត្ថបទ(តំលៃ)',type:'ប្រភេទ',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'ការកំណត់ប្រអប់ជ្រើសរើស',radioTitle:'ការកំណត់ប៉ូតុនរង្វង់',value:'តំលៃ',selected:'បានជ្រើសរើស'},form:{title:'ការកំណត់បែបបទ',menu:'ការកំណត់បែបបទ',action:'សកម្មភាព',method:'វិធី',encoding:'Encoding'},select:{title:'ការកំណត់ជួរជ្រើសរើស',selectInfo:'ពត៌មាន',opAvail:'ការកំណត់ជ្រើសរើស ដែលអាចកំណត់បាន',value:'តំលៃ',size:'ទំហំ',lines:'បន្ទាត់',chkMulti:'អនុញ្ញាតអោយជ្រើសរើសច្រើន',opText:'ពាក្យ',opValue:'តំលៃ',btnAdd:'បន្ថែម',btnModify:'ផ្លាស់ប្តូរ',btnUp:'លើ',btnDown:'ក្រោម',btnSetValue:'Set as selected value',btnDelete:'លប់'},textarea:{title:'ការកំណត់កន្លែងសរសេរអត្ថបទ',cols:'ជូរឈរ',rows:'ជូរផ្តេក'},textfield:{title:'ការកំណត់ជួរអត្ថបទ',name:'ឈ្មោះ',value:'តំលៃ',charWidth:'ទទឹង អក្សរ',maxChars:'អក្សរអតិបរិមា',type:'ប្រភេទ',typeText:'ពាក្យ',typePass:'ពាក្យសំងាត់'},hidden:{title:'ការកំណត់ជួរលាក់',name:'ឈ្មោះ',value:'តំលៃ'},image:{title:'ការកំណត់រូបភាព',titleButton:'ការកំណត់ប៉ូតុនរូបភាព',menu:'ការកំណត់រូបភាព',infoTab:'ពត៌មានអំពីរូបភាព',btnUpload:'បញ្ជូនទៅកាន់ម៉ាស៊ីនផ្តល់សេវា',upload:'ទាញយក',alt:'អត្ថបទជំនួស',lockRatio:'អត្រាឡុក',resetSize:'កំណត់ទំហំឡើងវិញ',border:'ស៊ុម',hSpace:'គំលាតទទឹង',vSpace:'គំលាតបណ្តោយ',alertUrl:'សូមសរសេរងាស័យដ្ឋានរបស់រូបភាព',linkTab:'ឈ្នាប់',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'ការកំណត់ Flash',propertiesTab:'Properties',title:'ការកំណត់ Flash',chkPlay:'លេងដោយស្វ័យប្រវត្ត',chkLoop:'ចំនួនដង',chkMenu:'បង្ហាញ មឺនុយរបស់ Flash',chkFull:'Allow Fullscreen',scale:'ទំហំ',scaleAll:'បង្ហាញទាំងអស់',scaleNoBorder:'មិនបង្ហាញស៊ុម',scaleFit:'ត្រូវល្មម',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs Bottom',alignAbsMiddle:'Abs Middle',alignBaseline:'បន្ទាត់ជាមូលដ្ឋាន',alignTextTop:'លើអត្ថបទ',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'ពណ៌ផ្ទៃខាងក្រោយ',hSpace:'គំលាតទទឹង',vSpace:'គំលាតបណ្តោយ',validateSrc:'សូមសរសេរ អាស័យដ្ឋាន URL',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'ពិនិត្យអក្ខរាវិរុទ្ធ',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'គ្មានក្នុងវចនានុក្រម',changeTo:'ផ្លាស់ប្តូរទៅ',btnIgnore:'មិនផ្លាស់ប្តូរ',btnIgnoreAll:'មិនផ្លាស់ប្តូរ ទាំងអស់',btnReplace:'ជំនួស',btnReplaceAll:'ជំនួសទាំងអស់',btnUndo:'សារឡើងវិញ',noSuggestions:'- គ្មានសំណើរ -',progress:'កំពុងពិនិត្យអក្ខរាវិរុទ្ធ...',noMispell:'ការពិនិត្យអក្ខរាវិរុទ្ធបានចប់: គ្មានកំហុស',noChanges:'ការពិនិត្យអក្ខរាវិរុទ្ធបានចប់: ពុំមានផ្លាស់ប្តូរ',oneChange:'ការពិនិត្យអក្ខរាវិរុទ្ធបានចប់: ពាក្យមួយត្រូចបានផ្លាស់ប្តូរ',manyChanges:'ការពិនិត្យអក្ខរាវិរុទ្ធបានចប់: %1 ពាក្យបានផ្លាស់ប្តូរ',ieSpellDownload:'ពុំមានកម្មវិធីពិនិត្យអក្ខរាវិរុទ្ធ ។ តើចង់ទាញយកពីណា?'},smiley:{toolbar:'រូបភាព',title:'បញ្ជូលរូបភាព',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'បញ្ជីជាអក្សរ',bulletedlist:'បញ្ជីជារង្វង់មូល',indent:'បន្ថែមការចូលបន្ទាត់',outdent:'បន្ថយការចូលបន្ទាត់',justify:{left:'តំរឹមឆ្វេង',center:'តំរឹមកណ្តាល',right:'តំរឹមស្តាំ',block:'តំរឹមសងខាង'},blockquote:'Block Quote',clipboard:{title:'ចំលងដាក់',cutError:'ការកំណត់សុវត្ថភាពរបស់កម្មវិធីរុករករបស់លោកអ្នក នេះមិនអាចធ្វើកម្មវិធីតាក់តែងអត្ថបទ កាត់អត្ថបទយកដោយស្វ័យប្រវត្តបានឡើយ ។ សូមប្រើប្រាស់បន្សំ ឃីដូចនេះ (Ctrl/Cmd+X) ។',copyError:'ការកំណត់សុវត្ថភាពរបស់កម្មវិធីរុករករបស់លោកអ្នក នេះមិនអាចធ្វើកម្មវិធីតាក់តែងអត្ថបទ ចំលងអត្ថបទយកដោយស្វ័យប្រវត្តបានឡើយ ។ សូមប្រើប្រាស់បន្សំ ឃីដូចនេះ (Ctrl/Cmd+C)។',pasteMsg:'សូមចំលងអត្ថបទទៅដាក់ក្នុងប្រអប់ដូចខាងក្រោមដោយប្រើប្រាស់ ឃី (<STRONG>Ctrl/Cmd+V</STRONG>) ហើយចុច <STRONG>OK</STRONG> ។',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'ចំលងដាក់ពី Word',title:'ចំលងដាក់ពី Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'ចំលងដាក់អត្ថបទធម្មតា',title:'ចំលងដាក់អត្ថបទធម្មតា'},templates:{button:'ឯកសារគំរូ',title:'ឯកសារគំរូ របស់អត្ថន័យ',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'សូមជ្រើសរើសឯកសារគំរូ ដើម្បីបើកនៅក្នុងកម្មវិធីតាក់តែងអត្ថបទ<br>(អត្ថបទនឹងបាត់បង់):',emptyListMsg:'(ពុំមានឯកសារគំរូត្រូវបានកំណត់)'},showBlocks:'Show Blocks',stylesCombo:{label:'ម៉ូត',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'រចនា',panelTitle:'រចនា',tag_p:'Normal',tag_pre:'Formatted',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'ហ្វុង',voiceLabel:'Font',panelTitle:'ហ្វុង'},fontSize:{label:'ទំហំ',voiceLabel:'Font Size',panelTitle:'ទំហំ'},colorButton:{textColorTitle:'ពណ៌អក្សរ',bgColorTitle:'ពណ៌ផ្ទៃខាងក្រោយ',panelTitle:'Colors',auto:'ស្វ័យប្រវត្ត',more:'ពណ៌ផ្សេងទៀត..'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'ការកំណត់ ឯកសារ',title:'ការកំណត់ ឯកសារ',design:'Design',meta:'ទិន្នន័យមេ',chooseColor:'Choose',other:'<other>',docTitle:'ចំណងជើងទំព័រ',charset:'កំណត់លេខកូតភាសា',charsetOther:'កំណត់លេខកូតភាសាផ្សេងទៀត',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'ប្រភេទក្បាលទំព័រ',docTypeOther:'ប្រភេទក្បាលទំព័រផ្សេងទៀត',xhtmlDec:'បញ្ជូល XHTML',bgColor:'ពណ៌ខាងក្រោម',bgImage:'URL របស់រូបភាពខាងក្រោម',bgFixed:'ទំព័រក្រោមមិនប្តូរ',txtColor:'ពណ៌អក្សរ',margin:'ស៊ុមទំព័រ',marginTop:'លើ',marginLeft:'ឆ្វេង',marginRight:'ស្ដាំ',marginBottom:'ក្រោម',metaKeywords:'ពាក្យនៅក្នុងឯកសារ (ផ្តាច់ពីគ្នាដោយក្បៀស)',metaDescription:'សេចក្តីអត្ថាធិប្បាយអំពីឯកសារ',metaAuthor:'អ្នកនិពន្ធ',metaCopyright:'រក្សាសិទ្ធិ៏',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ko.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ko.js
index ab4be57..f7d9eed 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ko.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ko.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.ko={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'소스',newPage:'새 문서',save:'저장하기',preview:'미리보기',cut:'잘라내기',copy:'복사하기',paste:'붙여넣기',print:'인쇄하기',underline:'밑줄',bold:'진하게',italic:'이텔릭',selectAll:'전체선택',removeFormat:'포맷 지우기',strike:'취소선',subscript:'아래 첨자',superscript:'위 첨자',horizontalrule:'수평선 삽입',pagebreak:'Insert Page Break for Printing',pagebreakAlt:'Page Break',unlink:'링크 삭제',undo:'취소',redo:'재실행',common:{browseServer:'서버 보기',url:'URL',protocol:'프로토콜',upload:'업로드',uploadSubmit:'서버로 전송',image:'이미지',flash:'플래쉬',form:'폼',checkbox:'체크박스',radio:'라디오버튼',textField:'입력필드',textarea:'입력영역',hiddenField:'숨김필드',button:'버튼',select:'펼침목록',imageButton:'이미지버튼',notSet:'<설정되지 않음>',id:'ID',name:'Name',langDir:'쓰기 방향',langDirLtr:'왼쪽에서 오른쪽 (LTR)',langDirRtl:'오른쪽에서 왼쪽 (RTL)',langCode:'언어 코드',longDescr:'URL 설명',cssClass:'Stylesheet Classes',advisoryTitle:'Advisory Title',cssStyle:'Style',ok:'예',cancel:'아니오',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'자세히',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'너비',height:'높이',align:'정렬',alignLeft:'왼쪽',alignRight:'오른쪽',alignCenter:'가운데',alignTop:'위',alignMiddle:'중간',alignBottom:'아래',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'특수문자 삽입',title:'특수문자 선택',options:'Special Character Options'},link:{toolbar:'링크 삽입/변경',other:'<기타>',menu:'링크 수정',title:'링크',info:'링크 정보',target:'타겟',upload:'업로드',advanced:'자세히',type:'링크 종류',toUrl:'URL',toAnchor:'책갈피',toEmail:'이메일',targetFrame:'<프레임>',targetPopup:'<팝업창>',targetFrameName:'타겟 프레임 이름',targetPopupName:'팝업창 이름',popupFeatures:'팝업창 설정',popupResizable:'Resizable',popupStatusBar:'상태바',popupLocationBar:'주소표시줄',popupToolbar:'툴바',popupMenuBar:'메뉴바',popupFullScreen:'전체화면 (IE)',popupScrollBars:'스크롤바',popupDependent:'Dependent (Netscape)',popupLeft:'왼쪽 위치',popupTop:'윗쪽 위치',id:'Id',langDir:'쓰기 방향',langDirLTR:'왼쪽에서 오른쪽 (LTR)',langDirRTL:'오른쪽에서 왼쪽 (RTL)',acccessKey:'엑세스 키',name:'Name',langCode:'쓰기 방향',tabIndex:'탭 순서',advisoryTitle:'Advisory Title',advisoryContentType:'Advisory Content Type',cssClasses:'Stylesheet Classes',charset:'Linked Resource Charset',styles:'Style',rel:'Relationship',selectAnchor:'책갈피 선택',anchorName:'책갈피 이름',anchorId:'책갈피 ID',emailAddress:'이메일 주소',emailSubject:'제목',emailBody:'내용',noAnchors:'(문서에 책갈피가 없습니다.)',noUrl:'링크 URL을 입력하십시요.',noEmail:'이메일주소를 입력하십시요.'},anchor:{toolbar:'책갈피 삽입/변경',menu:'책갈피 속성',title:'책갈피 속성',name:'책갈피 이름',errorName:'책갈피 이름을 입력하십시요.',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'찾기 & 바꾸기',find:'찾기',replace:'바꾸기',findWhat:'찾을 문자열:',replaceWith:'바꿀 문자열:',notFoundMsg:'문자열을 찾을 수 없습니다.',findOptions:'Find Options',matchCase:'대소문자 구분',matchWord:'온전한 단어',matchCyclic:'Match cyclic',replaceAll:'모두 바꾸기',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'표',title:'표 설정',menu:'표 설정',deleteTable:'표 삭제',rows:'가로줄',columns:'세로줄',border:'테두리 크기',widthPx:'픽셀',widthPc:'퍼센트',widthUnit:'width unit',cellSpace:'셀 간격',cellPad:'셀 여백',caption:'캡션',summary:'Summary',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'셀/칸(Cell)',insertBefore:'앞에 셀/칸 삽입',insertAfter:'뒤에 셀/칸 삽입',deleteCell:'셀 삭제',merge:'셀 합치기',mergeRight:'오른쪽 뭉치기',mergeDown:'왼쪽 뭉치기',splitHorizontal:'수평 나누기',splitVertical:'수직 나누기',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'행(Row)',insertBefore:'앞에 행 삽입',insertAfter:'뒤에 행 삽입',deleteRow:'가로줄 삭제'},column:{menu:'열(Column)',insertBefore:'앞에 열 삽입',insertAfter:'뒤에 열 삽입',deleteColumn:'세로줄 삭제'}},button:{title:'버튼 속성',text:'버튼글자(값)',type:'버튼종류',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'체크박스 속성',radioTitle:'라디오버튼 속성',value:'값',selected:'선택됨'},form:{title:'폼 속성',menu:'폼 속성',action:'실행경로(Action)',method:'방법(Method)',encoding:'Encoding'},select:{title:'펼침목록 속성',selectInfo:'정보',opAvail:'선택옵션',value:'값',size:'세로크기',lines:'줄',chkMulti:'여러항목 선택 허용',opText:'이름',opValue:'값',btnAdd:'추가',btnModify:'변경',btnUp:'위로',btnDown:'아래로',btnSetValue:'선택된것으로 설정',btnDelete:'삭제'},textarea:{title:'입력영역 속성',cols:'칸수',rows:'줄수'},textfield:{title:'입력필드 속성',name:'이름',value:'값',charWidth:'글자 너비',maxChars:'최대 글자수',type:'종류',typeText:'문자열',typePass:'비밀번호'},hidden:{title:'숨김필드 속성',name:'이름',value:'값'},image:{title:'이미지 설정',titleButton:'이미지버튼 속성',menu:'이미지 설정',infoTab:'이미지 정보',btnUpload:'서버로 전송',upload:'업로드',alt:'이미지 설명',lockRatio:'비율 유지',resetSize:'원래 크기로',border:'테두리',hSpace:'수평여백',vSpace:'수직여백',alertUrl:'이미지 URL을 입력하십시요',linkTab:'링크',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'플래쉬 속성',propertiesTab:'Properties',title:'플래쉬 등록정보',chkPlay:'자동재생',chkLoop:'반복',chkMenu:'플래쉬메뉴 가능',chkFull:'Allow Fullscreen',scale:'영역',scaleAll:'모두보기',scaleNoBorder:'경계선없음',scaleFit:'영역자동조절',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'줄아래(Abs Bottom)',alignAbsMiddle:'줄중간(Abs Middle)',alignBaseline:'기준선',alignTextTop:'글자상단',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'배경 색상',hSpace:'수평여백',vSpace:'수직여백',validateSrc:'링크 URL을 입력하십시요.',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'철자검사',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'사전에 없는 단어',changeTo:'변경할 단어',btnIgnore:'건너뜀',btnIgnoreAll:'모두 건너뜀',btnReplace:'변경',btnReplaceAll:'모두 변경',btnUndo:'취소',noSuggestions:'- 추천단어 없음 -',progress:'철자검사를 진행중입니다...',noMispell:'철자검사 완료: 잘못된 철자가 없습니다.',noChanges:'철자검사 완료: 변경된 단어가 없습니다.',oneChange:'철자검사 완료: 단어가 변경되었습니다.',manyChanges:'철자검사 완료: %1 단어가 변경되었습니다.',ieSpellDownload:'철자 검사기가 철치되지 않았습니다. 지금 다운로드하시겠습니까?'},smiley:{toolbar:'아이콘',title:'아이콘 삽입',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'순서있는 목록',bulletedlist:'순서없는 목록',indent:'들여쓰기',outdent:'내어쓰기',justify:{left:'왼쪽 정렬',center:'가운데 정렬',right:'오른쪽 정렬',block:'양쪽 맞춤'},blockquote:'Block Quote',clipboard:{title:'붙여넣기',cutError:'브라우저의 보안설정때문에 잘라내기 기능을 실행할 수 없습니다. 키보드 명령을 사용하십시요. (Ctrl/Cmd+X).',copyError:'브라우저의 보안설정때문에 복사하기 기능을 실행할 수 없습니다. 키보드 명령을 사용하십시요. (Ctrl/Cmd+C).',pasteMsg:'키보드의 (<STRONG>Ctrl/Cmd+V</STRONG>) 를 이용해서 상자안에 붙여넣고 <STRONG>OK</STRONG> 를 누르세요.',securityMsg:'브러우저 보안 설정으로 인해, 클립보드의 자료를 직접 접근할 수 없습니다. 이 창에 다시 붙여넣기 하십시오.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'MS Word 형식에서 붙여넣기',title:'MS Word 형식에서 붙여넣기',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'텍스트로 붙여넣기',title:'텍스트로 붙여넣기'},templates:{button:'템플릿',title:'내용 템플릿',options:'Template Options',insertOption:'현재 내용 바꾸기',selectPromptMsg:'에디터에서 사용할 템플릿을 선택하십시요.<br>(지금까지 작성된 내용은 사라집니다.):',emptyListMsg:'(템플릿이 없습니다.)'},showBlocks:'Show Blocks',stylesCombo:{label:'스타일',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'포맷',panelTitle:'포맷',tag_p:'Normal',tag_pre:'Formatted',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'폰트',voiceLabel:'Font',panelTitle:'폰트'},fontSize:{label:'글자 크기',voiceLabel:'Font Size',panelTitle:'글자 크기'},colorButton:{textColorTitle:'글자 색상',bgColorTitle:'배경 색상',panelTitle:'Colors',auto:'기본색상',more:'색상선택...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'문서 속성',title:'문서 속성',design:'Design',meta:'메타데이터',chooseColor:'Choose',other:'<기타>',docTitle:'페이지명',charset:'캐릭터셋 인코딩',charsetOther:'다른 캐릭터셋 인코딩',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'문서 헤드',docTypeOther:'다른 문서헤드',xhtmlDec:'XHTML 문서정의 포함',bgColor:'배경색상',bgImage:'배경이미지 URL',bgFixed:'스크롤되지않는 배경',txtColor:'글자 색상',margin:'페이지 여백',marginTop:'위',marginLeft:'왼쪽',marginRight:'오른쪽',marginBottom:'아래',metaKeywords:'문서 키워드 (콤마로 구분)',metaDescription:'문서 설명',metaAuthor:'작성자',metaCopyright:'저작권',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.ko={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'소스',newPage:'새 문서',save:'저장하기',preview:'미리보기',cut:'잘라내기',copy:'복사하기',paste:'붙여넣기',print:'인쇄하기',underline:'밑줄',bold:'진하게',italic:'이텔릭',selectAll:'전체선택',removeFormat:'포맷 지우기',strike:'취소선',subscript:'아래 첨자',superscript:'위 첨자',horizontalrule:'수평선 삽입',pagebreak:'Insert Page Break for Printing',pagebreakAlt:'Page Break',unlink:'링크 삭제',undo:'취소',redo:'재실행',common:{browseServer:'서버 보기',url:'URL',protocol:'프로토콜',upload:'업로드',uploadSubmit:'서버로 전송',image:'이미지',flash:'플래쉬',form:'폼',checkbox:'체크박스',radio:'라디오버튼',textField:'입력필드',textarea:'입력영역',hiddenField:'숨김필드',button:'버튼',select:'펼침목록',imageButton:'이미지버튼',notSet:'<설정되지 않음>',id:'ID',name:'Name',langDir:'쓰기 방향',langDirLtr:'왼쪽에서 오른쪽 (LTR)',langDirRtl:'오른쪽에서 왼쪽 (RTL)',langCode:'언어 코드',longDescr:'URL 설명',cssClass:'Stylesheet Classes',advisoryTitle:'Advisory Title',cssStyle:'Style',ok:'예',cancel:'아니오',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'자세히',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'너비',height:'높이',align:'정렬',alignLeft:'왼쪽',alignRight:'오른쪽',alignCenter:'가운데',alignTop:'위',alignMiddle:'중간',alignBottom:'아래',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'특수문자 삽입',title:'특수문자 선택',options:'Special Character Options'},link:{toolbar:'링크 삽입/변경',other:'<기타>',menu:'링크 수정',title:'링크',info:'링크 정보',target:'타겟',upload:'업로드',advanced:'자세히',type:'링크 종류',toUrl:'URL',toAnchor:'책갈피',toEmail:'이메일',targetFrame:'<프레임>',targetPopup:'<팝업창>',targetFrameName:'타겟 프레임 이름',targetPopupName:'팝업창 이름',popupFeatures:'팝업창 설정',popupResizable:'Resizable',popupStatusBar:'상태바',popupLocationBar:'주소표시줄',popupToolbar:'툴바',popupMenuBar:'메뉴바',popupFullScreen:'전체화면 (IE)',popupScrollBars:'스크롤바',popupDependent:'Dependent (Netscape)',popupLeft:'왼쪽 위치',popupTop:'윗쪽 위치',id:'Id',langDir:'쓰기 방향',langDirLTR:'왼쪽에서 오른쪽 (LTR)',langDirRTL:'오른쪽에서 왼쪽 (RTL)',acccessKey:'엑세스 키',name:'Name',langCode:'쓰기 방향',tabIndex:'탭 순서',advisoryTitle:'Advisory Title',advisoryContentType:'Advisory Content Type',cssClasses:'Stylesheet Classes',charset:'Linked Resource Charset',styles:'Style',rel:'Relationship',selectAnchor:'책갈피 선택',anchorName:'책갈피 이름',anchorId:'책갈피 ID',emailAddress:'이메일 주소',emailSubject:'제목',emailBody:'내용',noAnchors:'(문서에 책갈피가 없습니다.)',noUrl:'링크 URL을 입력하십시요.',noEmail:'이메일주소를 입력하십시요.'},anchor:{toolbar:'책갈피 삽입/변경',menu:'책갈피 속성',title:'책갈피 속성',name:'책갈피 이름',errorName:'책갈피 이름을 입력하십시요.',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'찾기 & 바꾸기',find:'찾기',replace:'바꾸기',findWhat:'찾을 문자열:',replaceWith:'바꿀 문자열:',notFoundMsg:'문자열을 찾을 수 없습니다.',findOptions:'Find Options',matchCase:'대소문자 구분',matchWord:'온전한 단어',matchCyclic:'Match cyclic',replaceAll:'모두 바꾸기',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'표',title:'표 설정',menu:'표 설정',deleteTable:'표 삭제',rows:'가로줄',columns:'세로줄',border:'테두리 크기',widthPx:'픽셀',widthPc:'퍼센트',widthUnit:'width unit',cellSpace:'셀 간격',cellPad:'셀 여백',caption:'캡션',summary:'Summary',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'셀/칸(Cell)',insertBefore:'앞에 셀/칸 삽입',insertAfter:'뒤에 셀/칸 삽입',deleteCell:'셀 삭제',merge:'셀 합치기',mergeRight:'오른쪽 뭉치기',mergeDown:'왼쪽 뭉치기',splitHorizontal:'수평 나누기',splitVertical:'수직 나누기',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'행(Row)',insertBefore:'앞에 행 삽입',insertAfter:'뒤에 행 삽입',deleteRow:'가로줄 삭제'},column:{menu:'열(Column)',insertBefore:'앞에 열 삽입',insertAfter:'뒤에 열 삽입',deleteColumn:'세로줄 삭제'}},button:{title:'버튼 속성',text:'버튼글자(값)',type:'버튼종류',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'체크박스 속성',radioTitle:'라디오버튼 속성',value:'값',selected:'선택됨'},form:{title:'폼 속성',menu:'폼 속성',action:'실행경로(Action)',method:'방법(Method)',encoding:'Encoding'},select:{title:'펼침목록 속성',selectInfo:'정보',opAvail:'선택옵션',value:'값',size:'세로크기',lines:'줄',chkMulti:'여러항목 선택 허용',opText:'이름',opValue:'값',btnAdd:'추가',btnModify:'변경',btnUp:'위로',btnDown:'아래로',btnSetValue:'선택된것으로 설정',btnDelete:'삭제'},textarea:{title:'입력영역 속성',cols:'칸수',rows:'줄수'},textfield:{title:'입력필드 속성',name:'이름',value:'값',charWidth:'글자 너비',maxChars:'최대 글자수',type:'종류',typeText:'문자열',typePass:'비밀번호'},hidden:{title:'숨김필드 속성',name:'이름',value:'값'},image:{title:'이미지 설정',titleButton:'이미지버튼 속성',menu:'이미지 설정',infoTab:'이미지 정보',btnUpload:'서버로 전송',upload:'업로드',alt:'이미지 설명',lockRatio:'비율 유지',resetSize:'원래 크기로',border:'테두리',hSpace:'수평여백',vSpace:'수직여백',alertUrl:'이미지 URL을 입력하십시요',linkTab:'링크',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'플래쉬 속성',propertiesTab:'Properties',title:'플래쉬 등록정보',chkPlay:'자동재생',chkLoop:'반복',chkMenu:'플래쉬메뉴 가능',chkFull:'Allow Fullscreen',scale:'영역',scaleAll:'모두보기',scaleNoBorder:'경계선없음',scaleFit:'영역자동조절',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'줄아래(Abs Bottom)',alignAbsMiddle:'줄중간(Abs Middle)',alignBaseline:'기준선',alignTextTop:'글자상단',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'배경 색상',hSpace:'수평여백',vSpace:'수직여백',validateSrc:'링크 URL을 입력하십시요.',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'철자검사',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'사전에 없는 단어',changeTo:'변경할 단어',btnIgnore:'건너뜀',btnIgnoreAll:'모두 건너뜀',btnReplace:'변경',btnReplaceAll:'모두 변경',btnUndo:'취소',noSuggestions:'- 추천단어 없음 -',progress:'철자검사를 진행중입니다...',noMispell:'철자검사 완료: 잘못된 철자가 없습니다.',noChanges:'철자검사 완료: 변경된 단어가 없습니다.',oneChange:'철자검사 완료: 단어가 변경되었습니다.',manyChanges:'철자검사 완료: %1 단어가 변경되었습니다.',ieSpellDownload:'철자 검사기가 철치되지 않았습니다. 지금 다운로드하시겠습니까?'},smiley:{toolbar:'아이콘',title:'아이콘 삽입',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'순서있는 목록',bulletedlist:'순서없는 목록',indent:'들여쓰기',outdent:'내어쓰기',justify:{left:'왼쪽 정렬',center:'가운데 정렬',right:'오른쪽 정렬',block:'양쪽 맞춤'},blockquote:'Block Quote',clipboard:{title:'붙여넣기',cutError:'브라우저의 보안설정때문에 잘라내기 기능을 실행할 수 없습니다. 키보드 명령을 사용하십시요. (Ctrl/Cmd+X).',copyError:'브라우저의 보안설정때문에 복사하기 기능을 실행할 수 없습니다. 키보드 명령을 사용하십시요. (Ctrl/Cmd+C).',pasteMsg:'키보드의 (<STRONG>Ctrl/Cmd+V</STRONG>) 를 이용해서 상자안에 붙여넣고 <STRONG>OK</STRONG> 를 누르세요.',securityMsg:'브러우저 보안 설정으로 인해, 클립보드의 자료를 직접 접근할 수 없습니다. 이 창에 다시 붙여넣기 하십시오.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'MS Word 형식에서 붙여넣기',title:'MS Word 형식에서 붙여넣기',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'텍스트로 붙여넣기',title:'텍스트로 붙여넣기'},templates:{button:'템플릿',title:'내용 템플릿',options:'Template Options',insertOption:'현재 내용 바꾸기',selectPromptMsg:'에디터에서 사용할 템플릿을 선택하십시요.<br>(지금까지 작성된 내용은 사라집니다.):',emptyListMsg:'(템플릿이 없습니다.)'},showBlocks:'Show Blocks',stylesCombo:{label:'스타일',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'포맷',panelTitle:'포맷',tag_p:'Normal',tag_pre:'Formatted',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'폰트',voiceLabel:'Font',panelTitle:'폰트'},fontSize:{label:'글자 크기',voiceLabel:'Font Size',panelTitle:'글자 크기'},colorButton:{textColorTitle:'글자 색상',bgColorTitle:'배경 색상',panelTitle:'Colors',auto:'기본색상',more:'색상선택...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'문서 속성',title:'문서 속성',design:'Design',meta:'메타데이터',chooseColor:'Choose',other:'<기타>',docTitle:'페이지명',charset:'캐릭터셋 인코딩',charsetOther:'다른 캐릭터셋 인코딩',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'문서 헤드',docTypeOther:'다른 문서헤드',xhtmlDec:'XHTML 문서정의 포함',bgColor:'배경색상',bgImage:'배경이미지 URL',bgFixed:'스크롤되지않는 배경',txtColor:'글자 색상',margin:'페이지 여백',marginTop:'위',marginLeft:'왼쪽',marginRight:'오른쪽',marginBottom:'아래',metaKeywords:'문서 키워드 (콤마로 구분)',metaDescription:'문서 설명',metaAuthor:'작성자',metaCopyright:'저작권',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/lt.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/lt.js
index 1f870c1..710e342 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/lt.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/lt.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.lt={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Redaktoriaus įrankiai',editor:'Pilnas redaktorius',source:'Šaltinis',newPage:'Naujas puslapis',save:'Išsaugoti',preview:'Peržiūra',cut:'Iškirpti',copy:'Kopijuoti',paste:'Įdėti',print:'Spausdinti',underline:'Pabrauktas',bold:'Pusjuodis',italic:'Kursyvas',selectAll:'Pažymėti viską',removeFormat:'Panaikinti formatą',strike:'Perbrauktas',subscript:'Apatinis indeksas',superscript:'Viršutinis indeksas',horizontalrule:'Įterpti horizontalią liniją',pagebreak:'Įterpti puslapių skirtuką',pagebreakAlt:'Puslapio skirtukas',unlink:'Panaikinti nuorodą',undo:'Atšaukti',redo:'Atstatyti',common:{browseServer:'Naršyti po serverį',url:'URL',protocol:'Protokolas',upload:'Siųsti',uploadSubmit:'Siųsti į serverį',image:'Vaizdas',flash:'Flash',form:'Forma',checkbox:'Žymimasis langelis',radio:'Žymimoji akutė',textField:'Teksto laukas',textarea:'Teksto sritis',hiddenField:'Nerodomas laukas',button:'Mygtukas',select:'Atrankos laukas',imageButton:'Vaizdinis mygtukas',notSet:'<nėra nustatyta>',id:'Id',name:'Vardas',langDir:'Teksto kryptis',langDirLtr:'Iš kairės į dešinę (LTR)',langDirRtl:'Iš dešinės į kairę (RTL)',langCode:'Kalbos kodas',longDescr:'Ilgas aprašymas URL',cssClass:'Stilių lentelės klasės',advisoryTitle:'Konsultacinė antraštė',cssStyle:'Stilius',ok:'OK',cancel:'Nutraukti',close:'Uždaryti',preview:'Peržiūrėti',generalTab:'Bendros savybės',advancedTab:'Papildomas',validateNumberFailed:'Ši reikšmė nėra skaičius.',confirmNewPage:'Visas neišsaugotas turinys bus prarastas. Ar tikrai norite įkrauti naują puslapį?',confirmCancel:'Kai kurie parametrai pasikeitė. Ar tikrai norite užverti langą?',options:'Parametrai',target:'Tikslinė nuoroda',targetNew:'Naujas langas (_blank)',targetTop:'Viršutinis langas (_top)',targetSelf:'Esamas langas (_self)',targetParent:'Paskutinis langas (_parent)',langDirLTR:'Iš kairės į dešinę (LTR)',langDirRTL:'Iš dešinės į kairę (RTL)',styles:'Stilius',cssClasses:'Stilių klasės',width:'Plotis',height:'Aukštis',align:'Lygiuoti',alignLeft:'Kairę',alignRight:'Dešinę',alignCenter:'Centrą',alignTop:'Viršūnę',alignMiddle:'Vidurį',alignBottom:'Apačią',invalidHeight:'Aukštis turi būti nurodytas skaičiais.',invalidWidth:'Plotis turi būti nurodytas skaičiais.',invalidCssLength:'Reikšmė nurodyta "%1" laukui, turi būti teigiamas skaičius su arba be tinkamo CSS matavimo vieneto (px, %, in, cm, mm, em, ex, pt arba pc).',invalidHtmlLength:'Reikšmė nurodyta "%1" laukui, turi būti teigiamas skaičius su arba be tinkamo HTML matavimo vieneto (px arba %).',invalidInlineStyle:'Reikšmė nurodyta vidiniame stiliuje turi būti sudaryta iš vieno šių reikšmių "vardas : reikšmė", atskirta kabliataškiais.',cssLengthTooltip:'Įveskite reikšmę pikseliais arba skaičiais su tinkamu CSS vienetu (px, %, in, cm, mm, em, ex, pt arba pc).',unavailable:'%1<span class="cke_accessibility">, netinkamas</span>'},contextmenu:{options:'Kontekstinio meniu parametrai'},specialChar:{toolbar:'Įterpti specialų simbolį',title:'Pasirinkite specialų simbolį',options:'Specialaus simbolio nustatymai'},link:{toolbar:'Įterpti/taisyti nuorodą',other:'<kitas>',menu:'Taisyti nuorodą',title:'Nuoroda',info:'Nuorodos informacija',target:'Paskirties vieta',upload:'Siųsti',advanced:'Papildomas',type:'Nuorodos tipas',toUrl:'Nuoroda',toAnchor:'Žymė šiame puslapyje',toEmail:'El.paštas',targetFrame:'<kadras>',targetPopup:'<išskleidžiamas langas>',targetFrameName:'Paskirties kadro vardas',targetPopupName:'Paskirties lango vardas',popupFeatures:'Išskleidžiamo lango savybės',popupResizable:'Kintamas dydis',popupStatusBar:'Būsenos juosta',popupLocationBar:'Adreso juosta',popupToolbar:'Mygtukų juosta',popupMenuBar:'Meniu juosta',popupFullScreen:'Visas ekranas (IE)',popupScrollBars:'Slinkties juostos',popupDependent:'Priklausomas (Netscape)',popupLeft:'Kairė pozicija',popupTop:'Viršutinė pozicija',id:'Id',langDir:'Teksto kryptis',langDirLTR:'Iš kairės į dešinę (LTR)',langDirRTL:'Iš dešinės į kairę (RTL)',acccessKey:'Prieigos raktas',name:'Vardas',langCode:'Teksto kryptis',tabIndex:'Tabuliavimo indeksas',advisoryTitle:'Konsultacinė antraštė',advisoryContentType:'Konsultacinio turinio tipas',cssClasses:'Stilių lentelės klasės',charset:'Susietų išteklių simbolių lentelė',styles:'Stilius',rel:'Sąsajos',selectAnchor:'Pasirinkite žymę',anchorName:'Pagal žymės vardą',anchorId:'Pagal žymės Id',emailAddress:'El.pašto adresas',emailSubject:'Žinutės tema',emailBody:'Žinutės turinys',noAnchors:'(Šiame dokumente žymių nėra)',noUrl:'Prašome įvesti nuorodos URL',noEmail:'Prašome įvesti el.pašto adresą'},anchor:{toolbar:'Įterpti/modifikuoti žymę',menu:'Žymės savybės',title:'Žymės savybės',name:'Žymės vardas',errorName:'Prašome įvesti žymės vardą',remove:'Pašalinti žymę'},list:{numberedTitle:'Skaitmeninio sąrašo nustatymai',bulletedTitle:'Ženklelinio sąrašo nustatymai',type:'Rūšis',start:'Pradžia',validateStartNumber:'Sąrašo pradžios skaitmuo turi būti sveikas skaičius.',circle:'Apskritimas',disc:'Diskas',square:'Kvadratas',none:'Niekas',notset:'<nenurodytas>',armenian:'Armėniški skaitmenys',georgian:'Gruziniški skaitmenys (an, ban, gan, t.t)',lowerRoman:'Mažosios Romėnų (i, ii, iii, iv, v, t.t)',upperRoman:'Didžiosios Romėnų (I, II, III, IV, V, t.t)',lowerAlpha:'Mažosios Alpha (a, b, c, d, e, t.t)',upperAlpha:'Didžiosios Alpha (A, B, C, D, E, t.t)',lowerGreek:'Mažosios Graikų (alpha, beta, gamma, t.t)',decimal:'Dešimtainis (1, 2, 3, t.t)',decimalLeadingZero:'Dešimtainis su nuliu priekyje (01, 02, 03, t.t)'},findAndReplace:{title:'Surasti ir pakeisti',find:'Rasti',replace:'Pakeisti',findWhat:'Surasti tekstą:',replaceWith:'Pakeisti tekstu:',notFoundMsg:'Nurodytas tekstas nerastas.',findOptions:'Paieškos nustatymai',matchCase:'Skirti didžiąsias ir mažąsias raides',matchWord:'Atitikti pilną žodį',matchCyclic:'Sutampantis cikliškumas',replaceAll:'Pakeisti viską',replaceSuccessMsg:'%1 sutapimas(ų) buvo pakeisti.'},table:{toolbar:'Lentelė',title:'Lentelės savybės',menu:'Lentelės savybės',deleteTable:'Šalinti lentelę',rows:'Eilutės',columns:'Stulpeliai',border:'Rėmelio dydis',widthPx:'taškais',widthPc:'procentais',widthUnit:'pločio vienetas',cellSpace:'Tarpas tarp langelių',cellPad:'Trapas nuo langelio rėmo iki teksto',caption:'Antraštė',summary:'Santrauka',headers:'Antraštės',headersNone:'Nėra',headersColumn:'Pirmas stulpelis',headersRow:'Pirma eilutė',headersBoth:'Abu',invalidRows:'Skaičius turi būti didesnis nei 0.',invalidCols:'Skaičius turi būti didesnis nei 0.',invalidBorder:'Reikšmė turi būti nurodyta skaičiumi.',invalidWidth:'Reikšmė turi būti nurodyta skaičiumi.',invalidHeight:'Reikšmė turi būti nurodyta skaičiumi.',invalidCellSpacing:'Reikšmė turi būti nurodyta skaičiumi.',invalidCellPadding:'Reikšmė turi būti nurodyta skaičiumi.',cell:{menu:'Langelis',insertBefore:'Įterpti langelį prieš',insertAfter:'Įterpti langelį po',deleteCell:'Šalinti langelius',merge:'Sujungti langelius',mergeRight:'Sujungti su dešine',mergeDown:'Sujungti su apačia',splitHorizontal:'Skaidyti langelį horizontaliai',splitVertical:'Skaidyti langelį vertikaliai',title:'Cell nustatymai',cellType:'Cell rūšis',rowSpan:'Eilučių Span',colSpan:'Stulpelių Span',wordWrap:'Sutraukti raides',hAlign:'Horizontalus lygiavimas',vAlign:'Vertikalus lygiavimas',alignBaseline:'Apatinė linija',bgColor:'Fono spalva',borderColor:'Rėmelio spalva',data:'Data',header:'Antraštė',yes:'Taip',no:'Ne',invalidWidth:'Reikšmė turi būti skaičius.',invalidHeight:'Reikšmė turi būti skaičius.',invalidRowSpan:'Reikšmė turi būti skaičius.',invalidColSpan:'Reikšmė turi būti skaičius.',chooseColor:'Pasirinkite'},row:{menu:'Eilutė',insertBefore:'Įterpti eilutę prieš',insertAfter:'Įterpti eilutę po',deleteRow:'Šalinti eilutes'},column:{menu:'Stulpelis',insertBefore:'Įterpti stulpelį prieš',insertAfter:'Įterpti stulpelį po',deleteColumn:'Šalinti stulpelius'}},button:{title:'Mygtuko savybės',text:'Tekstas (Reikšmė)',type:'Tipas',typeBtn:'Mygtukas',typeSbm:'Siųsti',typeRst:'Išvalyti'},checkboxAndRadio:{checkboxTitle:'Žymimojo langelio savybės',radioTitle:'Žymimosios akutės savybės',value:'Reikšmė',selected:'Pažymėtas'},form:{title:'Formos savybės',menu:'Formos savybės',action:'Veiksmas',method:'Metodas',encoding:'Kodavimas'},select:{title:'Atrankos lauko savybės',selectInfo:'Informacija',opAvail:'Galimos parinktys',value:'Reikšmė',size:'Dydis',lines:'eilučių',chkMulti:'Leisti daugeriopą atranką',opText:'Tekstas',opValue:'Reikšmė',btnAdd:'Įtraukti',btnModify:'Modifikuoti',btnUp:'Aukštyn',btnDown:'Žemyn',btnSetValue:'Laikyti pažymėta reikšme',btnDelete:'Trinti'},textarea:{title:'Teksto srities savybės',cols:'Ilgis',rows:'Plotis'},textfield:{title:'Teksto lauko savybės',name:'Vardas',value:'Reikšmė',charWidth:'Ilgis simboliais',maxChars:'Maksimalus simbolių skaičius',type:'Tipas',typeText:'Tekstas',typePass:'Slaptažodis'},hidden:{title:'Nerodomo lauko savybės',name:'Vardas',value:'Reikšmė'},image:{title:'Vaizdo savybės',titleButton:'Vaizdinio mygtuko savybės',menu:'Vaizdo savybės',infoTab:'Vaizdo informacija',btnUpload:'Siųsti į serverį',upload:'Nusiųsti',alt:'Alternatyvus Tekstas',lockRatio:'Išlaikyti proporciją',resetSize:'Atstatyti dydį',border:'Rėmelis',hSpace:'Hor.Erdvė',vSpace:'Vert.Erdvė',alertUrl:'Prašome įvesti vaizdo URL',linkTab:'Nuoroda',button2Img:'Ar norite mygtuką paversti paprastu paveiksliuku?',img2Button:'Ar norite paveiksliuką paversti mygtuku?',urlMissing:'Paveiksliuko nuorodos nėra.',validateBorder:'Reikšmė turi būti sveikas skaičius.',validateHSpace:'Reikšmė turi būti sveikas skaičius.',validateVSpace:'Reikšmė turi būti sveikas skaičius.'},flash:{properties:'Flash savybės',propertiesTab:'Nustatymai',title:'Flash savybės',chkPlay:'Automatinis paleidimas',chkLoop:'Ciklas',chkMenu:'Leisti Flash meniu',chkFull:'Leisti per visą ekraną',scale:'Mastelis',scaleAll:'Rodyti visą',scaleNoBorder:'Be rėmelio',scaleFit:'Tikslus atitikimas',access:'Skripto priėjimas',accessAlways:'Visada',accessSameDomain:'Tas pats domenas',accessNever:'Niekada',alignAbsBottom:'Absoliučią apačią',alignAbsMiddle:'Absoliutų vidurį',alignBaseline:'Apatinę liniją',alignTextTop:'Teksto viršūnę',quality:'Kokybė',qualityBest:'Geriausia',qualityHigh:'Gera',qualityAutoHigh:'Automatiškai Gera',qualityMedium:'Vidutinė',qualityAutoLow:'Automatiškai Žema',qualityLow:'Žema',windowModeWindow:'Langas',windowModeOpaque:'Nepermatomas',windowModeTransparent:'Permatomas',windowMode:'Lango režimas',flashvars:'Flash kintamieji',bgcolor:'Fono spalva',hSpace:'Hor.Erdvė',vSpace:'Vert.Erdvė',validateSrc:'Prašome įvesti nuorodos URL',validateHSpace:'HSpace turi būti skaičius.',validateVSpace:'VSpace turi būti skaičius.'},spellCheck:{toolbar:'Rašybos tikrinimas',title:'Tikrinti klaidas',notAvailable:'Atleiskite, šiuo metu servisas neprieinamas.',errorLoading:'Klaida įkraunant servisą: %s.',notInDic:'Žodyne nerastas',changeTo:'Pakeisti į',btnIgnore:'Ignoruoti',btnIgnoreAll:'Ignoruoti visus',btnReplace:'Pakeisti',btnReplaceAll:'Pakeisti visus',btnUndo:'Atšaukti',noSuggestions:'- Nėra pasiūlymų -',progress:'Vyksta rašybos tikrinimas...',noMispell:'Rašybos tikrinimas baigtas: Nerasta rašybos klaidų',noChanges:'Rašybos tikrinimas baigtas: Nėra pakeistų žodžių',oneChange:'Rašybos tikrinimas baigtas: Vienas žodis pakeistas',manyChanges:'Rašybos tikrinimas baigtas: Pakeista %1 žodžių',ieSpellDownload:'Rašybos tikrinimas neinstaliuotas. Ar Jūs norite jį dabar atsisiųsti?'},smiley:{toolbar:'Veideliai',title:'Įterpti veidelį',options:'Šypsenėlių nustatymai'},elementsPath:{eleLabel:'Elemento kelias',eleTitle:'%1 elementas'},numberedlist:'Numeruotas sąrašas',bulletedlist:'Suženklintas sąrašas',indent:'Padidinti įtrauką',outdent:'Sumažinti įtrauką',justify:{left:'Lygiuoti kairę',center:'Centruoti',right:'Lygiuoti dešinę',block:'Lygiuoti abi puses'},blockquote:'Citata',clipboard:{title:'Įdėti',cutError:'Jūsų naršyklės saugumo nustatymai neleidžia redaktoriui automatiškai įvykdyti iškirpimo operacijų. Tam prašome naudoti klaviatūrą (Ctrl/Cmd+X).',copyError:'Jūsų naršyklės saugumo nustatymai neleidžia redaktoriui automatiškai įvykdyti kopijavimo operacijų. Tam prašome naudoti klaviatūrą (Ctrl/Cmd+C).',pasteMsg:'Žemiau esančiame įvedimo lauke įdėkite tekstą, naudodami klaviatūrą (<STRONG>Ctrl/Cmd+V</STRONG>) ir paspauskite mygtuką <STRONG>OK</STRONG>.',securityMsg:'Dėl jūsų naršyklės saugumo nustatymų, redaktorius negali tiesiogiai pasiekti laikinosios atminties. Jums reikia nukopijuoti dar kartą į šį langą.',pasteArea:'Įkelti dalį'},pastefromword:{confirmCleanup:'Tekstas, kurį įkeliate yra kopijuojamas iš Word. Ar norite jį išvalyti prieš įkeliant?',toolbar:'Įdėti iš Word',title:'Įdėti iš Word',error:'Dėl vidinių sutrikimų, nepavyko išvalyti įkeliamo teksto'},pasteText:{button:'Įdėti kaip gryną tekstą',title:'Įdėti kaip gryną tekstą'},templates:{button:'Šablonai',title:'Turinio šablonai',options:'Template Options',insertOption:'Pakeisti dabartinį turinį pasirinktu šablonu',selectPromptMsg:'Pasirinkite norimą šabloną<br>(<b>Dėmesio!</b> esamas turinys bus prarastas):',emptyListMsg:'(Šablonų sąrašas tuščias)'},showBlocks:'Rodyti blokus',stylesCombo:{label:'Stilius',panelTitle:'Stilių formatavimas',panelTitle1:'Blokų stiliai',panelTitle2:'Vidiniai stiliai',panelTitle3:'Objektų stiliai'},format:{label:'Šrifto formatas',panelTitle:'Šrifto formatas',tag_p:'Normalus',tag_pre:'Formuotas',tag_address:'Kreipinio',tag_h1:'Antraštinis 1',tag_h2:'Antraštinis 2',tag_h3:'Antraštinis 3',tag_h4:'Antraštinis 4',tag_h5:'Antraštinis 5',tag_h6:'Antraštinis 6',tag_div:'Normalus (DIV)'},div:{title:'Sukurti Div elementą',toolbar:'Sukurti Div elementą',cssClassInputLabel:'Stilių klasės',styleSelectLabel:'Stilius',IdInputLabel:'Id',languageCodeInputLabel:' Kalbos kodas',inlineStyleInputLabel:'Vidiniai stiliai',advisoryTitleInputLabel:'Patariamas pavadinimas',langDirLabel:'Kalbos nurodymai',langDirLTRLabel:'Iš kairės į dešinę (LTR)',langDirRTLLabel:'Iš dešinės į kairę (RTL)',edit:'Redaguoti Div',remove:'Pašalinti Div'},iframe:{title:'IFrame nustatymai',toolbar:'IFrame',noUrl:'Nurodykite iframe nuorodą',scrolling:'Įjungti slankiklius',border:'Rodyti rėmelį'},font:{label:'Šriftas',voiceLabel:'Šriftas',panelTitle:'Šriftas'},fontSize:{label:'Šrifto dydis',voiceLabel:'Šrifto dydis',panelTitle:'Šrifto dydis'},colorButton:{textColorTitle:'Teksto spalva',bgColorTitle:'Fono spalva',panelTitle:'Spalva',auto:'Automatinis',more:'Daugiau spalvų...'},colors:{'000':'Juoda',800000:'Kaštoninė','8B4513':'Tamsiai ruda','2F4F4F':'Pilka tamsaus šiferio','008080':'Teal','000080':'Karinis','4B0082':'Indigo',696969:'Tamsiai pilka',B22222:'Ugnies',A52A2A:'Ruda',DAA520:'Aukso','006400':'Tamsiai žalia','40E0D0':'Turquoise','0000CD':'Vidutinė mėlyna',800080:'Violetinė',808080:'Pilka',F00:'Raudona',FF8C00:'Tamsiai oranžinė',FFD700:'Auksinė','008000':'Žalia','0FF':'Žydra','00F':'Mėlyna',EE82EE:'Violetinė',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Oranžinė',FFFF00:'Geltona','00FF00':'Citrinų',AFEEEE:'Pale Turquoise',ADD8E6:'Šviesiai mėlyna',DDA0DD:'Plum',D3D3D3:'Šviesiai pilka',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Šviesiai geltona',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'Balta'},scayt:{title:'Tikrinti klaidas kai rašoma',opera_title:'Nepalaikoma naršyklėje Opera',enable:'Įjungti SCAYT',disable:'Išjungti SCAYT',about:'Apie SCAYT',toggle:'Perjungti SCAYT',options:'Parametrai',langs:'Kalbos',moreSuggestions:'Daugiau patarimų',ignore:'Ignoruoti',ignoreAll:'Ignoruoti viską',addWord:'Pridėti žodį',emptyDic:'Žodyno vardas neturėtų būti tuščias.',optionsTab:'Parametrai',allCaps:'Ignoruoti visas didžiąsias raides',ignoreDomainNames:'Ignoruoti domenų vardus',mixedCase:'Ignoruoti maišyto dydžio raides',mixedWithDigits:'Ignoruoti raides su skaičiais',languagesTab:'Kalbos',dictionariesTab:'Žodynai',dic_field_name:'Žodyno pavadinimas',dic_create:'Sukurti',dic_restore:'Atstatyti',dic_delete:'Ištrinti',dic_rename:'Pervadinti',dic_info:'Paprastai žodynas yra saugojamas sausainėliuose (cookies), kurių dydis, bet kokiu atveju, yra apribotas. Esant sausainėlių apimties pervišiui, viskas bus saugoma serveryje. Jei norite iš kart viską saugoti serveryje, turite sugalvoti žodynui pavadinimą. Jei jau turite žodyną, įrašykite pavadinimą ir nuspauskite Atstatyti mygtuką.',aboutTab:'Apie'},about:{title:'Apie CKEditor',dlgTitle:'Apie CKEditor',help:'Patikrinkite $1 dėl pagalbos.',userGuide:'CKEditor Vartotojo Gidas',moreInfo:'Dėl licencijavimo apsilankykite mūsų svetainėje:',copy:'Copyright © $1. Visos teiss saugomos.'},maximize:'Išdidinti',minimize:'Sumažinti',fakeobjects:{anchor:'Žymė',flash:'Flash animacija',iframe:'IFrame',hiddenfield:'Paslėptas laukas',unknown:'Nežinomas objektas'},resize:'Pavilkite, kad pakeistumėte dydį',colordialog:{title:'Pasirinkite spalvą',options:'Spalvos nustatymai',highlight:'Paryškinti',selected:'Pasirinkta spalva',clear:'Išvalyti'},toolbarCollapse:'Apjungti įrankių juostą',toolbarExpand:'Išplėsti įrankių juostą',toolbarGroups:{document:'Dokumentas',clipboard:'Atmintinė/Atgal',editing:'Redagavimas',forms:'Formos',basicstyles:'Pagrindiniai stiliai',paragraph:'Paragrafas',links:'Nuorodos',insert:'Įterpti',styles:'Stiliai',colors:'Spalvos',tools:'Įrankiai'},bidi:{ltr:'Tekstas iš kairės į dešinę',rtl:'Tekstas iš dešinės į kairę'},docprops:{label:'Dokumento savybės',title:'Dokumento savybės',design:'Išdėstymas',meta:'Meta duomenys',chooseColor:'Pasirinkite',other:'<kitas>',docTitle:'Puslapio antraštė',charset:'Simbolių kodavimo lentelė',charsetOther:'Kita simbolių kodavimo lentelė',charsetASCII:'ASCII',charsetCE:'Centrinės Europos',charsetCT:'Tradicinės kinų (Big5)',charsetCR:'Kirilica',charsetGR:'Graikų',charsetJP:'Japonų',charsetKR:'Korėjiečių',charsetTR:'Turkų',charsetUN:'Unikodas (UTF-8)',charsetWE:'Vakarų Europos',docType:'Dokumento tipo antraštė',docTypeOther:'Kita dokumento tipo antraštė',xhtmlDec:'Įtraukti XHTML deklaracijas',bgColor:'Fono spalva',bgImage:'Fono paveikslėlio nuoroda (URL)',bgFixed:'Neslenkantis fonas',txtColor:'Teksto spalva',margin:'Puslapio kraštinės',marginTop:'Viršuje',marginLeft:'Kairėje',marginRight:'Dešinėje',marginBottom:'Apačioje',metaKeywords:'Dokumento indeksavimo raktiniai žodžiai (atskirti kableliais)',metaDescription:'Dokumento apibūdinimas',metaAuthor:'Autorius',metaCopyright:'Autorinės teisės',previewHtml:'<p>Tai yra <strong>pavyzdinis tekstas</strong>. Jūs naudojate <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.lt={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Redaktoriaus įrankiai',editor:'Pilnas redaktorius',source:'Šaltinis',newPage:'Naujas puslapis',save:'Išsaugoti',preview:'Peržiūra',cut:'Iškirpti',copy:'Kopijuoti',paste:'Įdėti',print:'Spausdinti',underline:'Pabrauktas',bold:'Pusjuodis',italic:'Kursyvas',selectAll:'Pažymėti viską',removeFormat:'Panaikinti formatą',strike:'Perbrauktas',subscript:'Apatinis indeksas',superscript:'Viršutinis indeksas',horizontalrule:'Įterpti horizontalią liniją',pagebreak:'Įterpti puslapių skirtuką',pagebreakAlt:'Puslapio skirtukas',unlink:'Panaikinti nuorodą',undo:'Atšaukti',redo:'Atstatyti',common:{browseServer:'Naršyti po serverį',url:'URL',protocol:'Protokolas',upload:'Siųsti',uploadSubmit:'Siųsti į serverį',image:'Vaizdas',flash:'Flash',form:'Forma',checkbox:'Žymimasis langelis',radio:'Žymimoji akutė',textField:'Teksto laukas',textarea:'Teksto sritis',hiddenField:'Nerodomas laukas',button:'Mygtukas',select:'Atrankos laukas',imageButton:'Vaizdinis mygtukas',notSet:'<nėra nustatyta>',id:'Id',name:'Vardas',langDir:'Teksto kryptis',langDirLtr:'Iš kairės į dešinę (LTR)',langDirRtl:'Iš dešinės į kairę (RTL)',langCode:'Kalbos kodas',longDescr:'Ilgas aprašymas URL',cssClass:'Stilių lentelės klasės',advisoryTitle:'Konsultacinė antraštė',cssStyle:'Stilius',ok:'OK',cancel:'Nutraukti',close:'Uždaryti',preview:'Peržiūrėti',generalTab:'Bendros savybės',advancedTab:'Papildomas',validateNumberFailed:'Ši reikšmė nėra skaičius.',confirmNewPage:'Visas neišsaugotas turinys bus prarastas. Ar tikrai norite įkrauti naują puslapį?',confirmCancel:'Kai kurie parametrai pasikeitė. Ar tikrai norite užverti langą?',options:'Parametrai',target:'Tikslinė nuoroda',targetNew:'Naujas langas (_blank)',targetTop:'Viršutinis langas (_top)',targetSelf:'Esamas langas (_self)',targetParent:'Paskutinis langas (_parent)',langDirLTR:'Iš kairės į dešinę (LTR)',langDirRTL:'Iš dešinės į kairę (RTL)',styles:'Stilius',cssClasses:'Stilių klasės',width:'Plotis',height:'Aukštis',align:'Lygiuoti',alignLeft:'Kairę',alignRight:'Dešinę',alignCenter:'Centrą',alignTop:'Viršūnę',alignMiddle:'Vidurį',alignBottom:'Apačią',invalidHeight:'Aukštis turi būti nurodytas skaičiais.',invalidWidth:'Plotis turi būti nurodytas skaičiais.',invalidCssLength:'Reikšmė nurodyta "%1" laukui, turi būti teigiamas skaičius su arba be tinkamo CSS matavimo vieneto (px, %, in, cm, mm, em, ex, pt arba pc).',invalidHtmlLength:'Reikšmė nurodyta "%1" laukui, turi būti teigiamas skaičius su arba be tinkamo HTML matavimo vieneto (px arba %).',invalidInlineStyle:'Reikšmė nurodyta vidiniame stiliuje turi būti sudaryta iš vieno šių reikšmių "vardas : reikšmė", atskirta kabliataškiais.',cssLengthTooltip:'Įveskite reikšmę pikseliais arba skaičiais su tinkamu CSS vienetu (px, %, in, cm, mm, em, ex, pt arba pc).',unavailable:'%1<span class="cke_accessibility">, netinkamas</span>'},contextmenu:{options:'Kontekstinio meniu parametrai'},specialChar:{toolbar:'Įterpti specialų simbolį',title:'Pasirinkite specialų simbolį',options:'Specialaus simbolio nustatymai'},link:{toolbar:'Įterpti/taisyti nuorodą',other:'<kitas>',menu:'Taisyti nuorodą',title:'Nuoroda',info:'Nuorodos informacija',target:'Paskirties vieta',upload:'Siųsti',advanced:'Papildomas',type:'Nuorodos tipas',toUrl:'Nuoroda',toAnchor:'Žymė šiame puslapyje',toEmail:'El.paštas',targetFrame:'<kadras>',targetPopup:'<išskleidžiamas langas>',targetFrameName:'Paskirties kadro vardas',targetPopupName:'Paskirties lango vardas',popupFeatures:'Išskleidžiamo lango savybės',popupResizable:'Kintamas dydis',popupStatusBar:'Būsenos juosta',popupLocationBar:'Adreso juosta',popupToolbar:'Mygtukų juosta',popupMenuBar:'Meniu juosta',popupFullScreen:'Visas ekranas (IE)',popupScrollBars:'Slinkties juostos',popupDependent:'Priklausomas (Netscape)',popupLeft:'Kairė pozicija',popupTop:'Viršutinė pozicija',id:'Id',langDir:'Teksto kryptis',langDirLTR:'Iš kairės į dešinę (LTR)',langDirRTL:'Iš dešinės į kairę (RTL)',acccessKey:'Prieigos raktas',name:'Vardas',langCode:'Teksto kryptis',tabIndex:'Tabuliavimo indeksas',advisoryTitle:'Konsultacinė antraštė',advisoryContentType:'Konsultacinio turinio tipas',cssClasses:'Stilių lentelės klasės',charset:'Susietų išteklių simbolių lentelė',styles:'Stilius',rel:'Sąsajos',selectAnchor:'Pasirinkite žymę',anchorName:'Pagal žymės vardą',anchorId:'Pagal žymės Id',emailAddress:'El.pašto adresas',emailSubject:'Žinutės tema',emailBody:'Žinutės turinys',noAnchors:'(Šiame dokumente žymių nėra)',noUrl:'Prašome įvesti nuorodos URL',noEmail:'Prašome įvesti el.pašto adresą'},anchor:{toolbar:'Įterpti/modifikuoti žymę',menu:'Žymės savybės',title:'Žymės savybės',name:'Žymės vardas',errorName:'Prašome įvesti žymės vardą',remove:'Pašalinti žymę'},list:{numberedTitle:'Skaitmeninio sąrašo nustatymai',bulletedTitle:'Ženklelinio sąrašo nustatymai',type:'Rūšis',start:'Pradžia',validateStartNumber:'Sąrašo pradžios skaitmuo turi būti sveikas skaičius.',circle:'Apskritimas',disc:'Diskas',square:'Kvadratas',none:'Niekas',notset:'<nenurodytas>',armenian:'Armėniški skaitmenys',georgian:'Gruziniški skaitmenys (an, ban, gan, t.t)',lowerRoman:'Mažosios Romėnų (i, ii, iii, iv, v, t.t)',upperRoman:'Didžiosios Romėnų (I, II, III, IV, V, t.t)',lowerAlpha:'Mažosios Alpha (a, b, c, d, e, t.t)',upperAlpha:'Didžiosios Alpha (A, B, C, D, E, t.t)',lowerGreek:'Mažosios Graikų (alpha, beta, gamma, t.t)',decimal:'Dešimtainis (1, 2, 3, t.t)',decimalLeadingZero:'Dešimtainis su nuliu priekyje (01, 02, 03, t.t)'},findAndReplace:{title:'Surasti ir pakeisti',find:'Rasti',replace:'Pakeisti',findWhat:'Surasti tekstą:',replaceWith:'Pakeisti tekstu:',notFoundMsg:'Nurodytas tekstas nerastas.',findOptions:'Paieškos nustatymai',matchCase:'Skirti didžiąsias ir mažąsias raides',matchWord:'Atitikti pilną žodį',matchCyclic:'Sutampantis cikliškumas',replaceAll:'Pakeisti viską',replaceSuccessMsg:'%1 sutapimas(ų) buvo pakeisti.'},table:{toolbar:'Lentelė',title:'Lentelės savybės',menu:'Lentelės savybės',deleteTable:'Šalinti lentelę',rows:'Eilutės',columns:'Stulpeliai',border:'Rėmelio dydis',widthPx:'taškais',widthPc:'procentais',widthUnit:'pločio vienetas',cellSpace:'Tarpas tarp langelių',cellPad:'Trapas nuo langelio rėmo iki teksto',caption:'Antraštė',summary:'Santrauka',headers:'Antraštės',headersNone:'Nėra',headersColumn:'Pirmas stulpelis',headersRow:'Pirma eilutė',headersBoth:'Abu',invalidRows:'Skaičius turi būti didesnis nei 0.',invalidCols:'Skaičius turi būti didesnis nei 0.',invalidBorder:'Reikšmė turi būti nurodyta skaičiumi.',invalidWidth:'Reikšmė turi būti nurodyta skaičiumi.',invalidHeight:'Reikšmė turi būti nurodyta skaičiumi.',invalidCellSpacing:'Reikšmė turi būti nurodyta skaičiumi.',invalidCellPadding:'Reikšmė turi būti nurodyta skaičiumi.',cell:{menu:'Langelis',insertBefore:'Įterpti langelį prieš',insertAfter:'Įterpti langelį po',deleteCell:'Šalinti langelius',merge:'Sujungti langelius',mergeRight:'Sujungti su dešine',mergeDown:'Sujungti su apačia',splitHorizontal:'Skaidyti langelį horizontaliai',splitVertical:'Skaidyti langelį vertikaliai',title:'Cell nustatymai',cellType:'Cell rūšis',rowSpan:'Eilučių Span',colSpan:'Stulpelių Span',wordWrap:'Sutraukti raides',hAlign:'Horizontalus lygiavimas',vAlign:'Vertikalus lygiavimas',alignBaseline:'Apatinė linija',bgColor:'Fono spalva',borderColor:'Rėmelio spalva',data:'Data',header:'Antraštė',yes:'Taip',no:'Ne',invalidWidth:'Reikšmė turi būti skaičius.',invalidHeight:'Reikšmė turi būti skaičius.',invalidRowSpan:'Reikšmė turi būti skaičius.',invalidColSpan:'Reikšmė turi būti skaičius.',chooseColor:'Pasirinkite'},row:{menu:'Eilutė',insertBefore:'Įterpti eilutę prieš',insertAfter:'Įterpti eilutę po',deleteRow:'Šalinti eilutes'},column:{menu:'Stulpelis',insertBefore:'Įterpti stulpelį prieš',insertAfter:'Įterpti stulpelį po',deleteColumn:'Šalinti stulpelius'}},button:{title:'Mygtuko savybės',text:'Tekstas (Reikšmė)',type:'Tipas',typeBtn:'Mygtukas',typeSbm:'Siųsti',typeRst:'Išvalyti'},checkboxAndRadio:{checkboxTitle:'Žymimojo langelio savybės',radioTitle:'Žymimosios akutės savybės',value:'Reikšmė',selected:'Pažymėtas'},form:{title:'Formos savybės',menu:'Formos savybės',action:'Veiksmas',method:'Metodas',encoding:'Kodavimas'},select:{title:'Atrankos lauko savybės',selectInfo:'Informacija',opAvail:'Galimos parinktys',value:'Reikšmė',size:'Dydis',lines:'eilučių',chkMulti:'Leisti daugeriopą atranką',opText:'Tekstas',opValue:'Reikšmė',btnAdd:'Įtraukti',btnModify:'Modifikuoti',btnUp:'Aukštyn',btnDown:'Žemyn',btnSetValue:'Laikyti pažymėta reikšme',btnDelete:'Trinti'},textarea:{title:'Teksto srities savybės',cols:'Ilgis',rows:'Plotis'},textfield:{title:'Teksto lauko savybės',name:'Vardas',value:'Reikšmė',charWidth:'Ilgis simboliais',maxChars:'Maksimalus simbolių skaičius',type:'Tipas',typeText:'Tekstas',typePass:'Slaptažodis'},hidden:{title:'Nerodomo lauko savybės',name:'Vardas',value:'Reikšmė'},image:{title:'Vaizdo savybės',titleButton:'Vaizdinio mygtuko savybės',menu:'Vaizdo savybės',infoTab:'Vaizdo informacija',btnUpload:'Siųsti į serverį',upload:'Nusiųsti',alt:'Alternatyvus Tekstas',lockRatio:'Išlaikyti proporciją',resetSize:'Atstatyti dydį',border:'Rėmelis',hSpace:'Hor.Erdvė',vSpace:'Vert.Erdvė',alertUrl:'Prašome įvesti vaizdo URL',linkTab:'Nuoroda',button2Img:'Ar norite mygtuką paversti paprastu paveiksliuku?',img2Button:'Ar norite paveiksliuką paversti mygtuku?',urlMissing:'Paveiksliuko nuorodos nėra.',validateBorder:'Reikšmė turi būti sveikas skaičius.',validateHSpace:'Reikšmė turi būti sveikas skaičius.',validateVSpace:'Reikšmė turi būti sveikas skaičius.'},flash:{properties:'Flash savybės',propertiesTab:'Nustatymai',title:'Flash savybės',chkPlay:'Automatinis paleidimas',chkLoop:'Ciklas',chkMenu:'Leisti Flash meniu',chkFull:'Leisti per visą ekraną',scale:'Mastelis',scaleAll:'Rodyti visą',scaleNoBorder:'Be rėmelio',scaleFit:'Tikslus atitikimas',access:'Skripto priėjimas',accessAlways:'Visada',accessSameDomain:'Tas pats domenas',accessNever:'Niekada',alignAbsBottom:'Absoliučią apačią',alignAbsMiddle:'Absoliutų vidurį',alignBaseline:'Apatinę liniją',alignTextTop:'Teksto viršūnę',quality:'Kokybė',qualityBest:'Geriausia',qualityHigh:'Gera',qualityAutoHigh:'Automatiškai Gera',qualityMedium:'Vidutinė',qualityAutoLow:'Automatiškai Žema',qualityLow:'Žema',windowModeWindow:'Langas',windowModeOpaque:'Nepermatomas',windowModeTransparent:'Permatomas',windowMode:'Lango režimas',flashvars:'Flash kintamieji',bgcolor:'Fono spalva',hSpace:'Hor.Erdvė',vSpace:'Vert.Erdvė',validateSrc:'Prašome įvesti nuorodos URL',validateHSpace:'HSpace turi būti skaičius.',validateVSpace:'VSpace turi būti skaičius.'},spellCheck:{toolbar:'Rašybos tikrinimas',title:'Tikrinti klaidas',notAvailable:'Atleiskite, šiuo metu servisas neprieinamas.',errorLoading:'Klaida įkraunant servisą: %s.',notInDic:'Žodyne nerastas',changeTo:'Pakeisti į',btnIgnore:'Ignoruoti',btnIgnoreAll:'Ignoruoti visus',btnReplace:'Pakeisti',btnReplaceAll:'Pakeisti visus',btnUndo:'Atšaukti',noSuggestions:'- Nėra pasiūlymų -',progress:'Vyksta rašybos tikrinimas...',noMispell:'Rašybos tikrinimas baigtas: Nerasta rašybos klaidų',noChanges:'Rašybos tikrinimas baigtas: Nėra pakeistų žodžių',oneChange:'Rašybos tikrinimas baigtas: Vienas žodis pakeistas',manyChanges:'Rašybos tikrinimas baigtas: Pakeista %1 žodžių',ieSpellDownload:'Rašybos tikrinimas neinstaliuotas. Ar Jūs norite jį dabar atsisiųsti?'},smiley:{toolbar:'Veideliai',title:'Įterpti veidelį',options:'Šypsenėlių nustatymai'},elementsPath:{eleLabel:'Elemento kelias',eleTitle:'%1 elementas'},numberedlist:'Numeruotas sąrašas',bulletedlist:'Suženklintas sąrašas',indent:'Padidinti įtrauką',outdent:'Sumažinti įtrauką',justify:{left:'Lygiuoti kairę',center:'Centruoti',right:'Lygiuoti dešinę',block:'Lygiuoti abi puses'},blockquote:'Citata',clipboard:{title:'Įdėti',cutError:'Jūsų naršyklės saugumo nustatymai neleidžia redaktoriui automatiškai įvykdyti iškirpimo operacijų. Tam prašome naudoti klaviatūrą (Ctrl/Cmd+X).',copyError:'Jūsų naršyklės saugumo nustatymai neleidžia redaktoriui automatiškai įvykdyti kopijavimo operacijų. Tam prašome naudoti klaviatūrą (Ctrl/Cmd+C).',pasteMsg:'Žemiau esančiame įvedimo lauke įdėkite tekstą, naudodami klaviatūrą (<STRONG>Ctrl/Cmd+V</STRONG>) ir paspauskite mygtuką <STRONG>OK</STRONG>.',securityMsg:'Dėl jūsų naršyklės saugumo nustatymų, redaktorius negali tiesiogiai pasiekti laikinosios atminties. Jums reikia nukopijuoti dar kartą į šį langą.',pasteArea:'Įkelti dalį'},pastefromword:{confirmCleanup:'Tekstas, kurį įkeliate yra kopijuojamas iš Word. Ar norite jį išvalyti prieš įkeliant?',toolbar:'Įdėti iš Word',title:'Įdėti iš Word',error:'Dėl vidinių sutrikimų, nepavyko išvalyti įkeliamo teksto'},pasteText:{button:'Įdėti kaip gryną tekstą',title:'Įdėti kaip gryną tekstą'},templates:{button:'Šablonai',title:'Turinio šablonai',options:'Template Options',insertOption:'Pakeisti dabartinį turinį pasirinktu šablonu',selectPromptMsg:'Pasirinkite norimą šabloną<br>(<b>Dėmesio!</b> esamas turinys bus prarastas):',emptyListMsg:'(Šablonų sąrašas tuščias)'},showBlocks:'Rodyti blokus',stylesCombo:{label:'Stilius',panelTitle:'Stilių formatavimas',panelTitle1:'Blokų stiliai',panelTitle2:'Vidiniai stiliai',panelTitle3:'Objektų stiliai'},format:{label:'Šrifto formatas',panelTitle:'Šrifto formatas',tag_p:'Normalus',tag_pre:'Formuotas',tag_address:'Kreipinio',tag_h1:'Antraštinis 1',tag_h2:'Antraštinis 2',tag_h3:'Antraštinis 3',tag_h4:'Antraštinis 4',tag_h5:'Antraštinis 5',tag_h6:'Antraštinis 6',tag_div:'Normalus (DIV)'},div:{title:'Sukurti Div elementą',toolbar:'Sukurti Div elementą',cssClassInputLabel:'Stilių klasės',styleSelectLabel:'Stilius',IdInputLabel:'Id',languageCodeInputLabel:' Kalbos kodas',inlineStyleInputLabel:'Vidiniai stiliai',advisoryTitleInputLabel:'Patariamas pavadinimas',langDirLabel:'Kalbos nurodymai',langDirLTRLabel:'Iš kairės į dešinę (LTR)',langDirRTLLabel:'Iš dešinės į kairę (RTL)',edit:'Redaguoti Div',remove:'Pašalinti Div'},iframe:{title:'IFrame nustatymai',toolbar:'IFrame',noUrl:'Nurodykite iframe nuorodą',scrolling:'Įjungti slankiklius',border:'Rodyti rėmelį'},font:{label:'Šriftas',voiceLabel:'Šriftas',panelTitle:'Šriftas'},fontSize:{label:'Šrifto dydis',voiceLabel:'Šrifto dydis',panelTitle:'Šrifto dydis'},colorButton:{textColorTitle:'Teksto spalva',bgColorTitle:'Fono spalva',panelTitle:'Spalva',auto:'Automatinis',more:'Daugiau spalvų...'},colors:{'000':'Juoda',800000:'Kaštoninė','8B4513':'Tamsiai ruda','2F4F4F':'Pilka tamsaus šiferio','008080':'Teal','000080':'Karinis','4B0082':'Indigo',696969:'Tamsiai pilka',B22222:'Ugnies',A52A2A:'Ruda',DAA520:'Aukso','006400':'Tamsiai žalia','40E0D0':'Turquoise','0000CD':'Vidutinė mėlyna',800080:'Violetinė',808080:'Pilka',F00:'Raudona',FF8C00:'Tamsiai oranžinė',FFD700:'Auksinė','008000':'Žalia','0FF':'Žydra','00F':'Mėlyna',EE82EE:'Violetinė',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Oranžinė',FFFF00:'Geltona','00FF00':'Citrinų',AFEEEE:'Pale Turquoise',ADD8E6:'Šviesiai mėlyna',DDA0DD:'Plum',D3D3D3:'Šviesiai pilka',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Šviesiai geltona',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'Balta'},scayt:{title:'Tikrinti klaidas kai rašoma',opera_title:'Nepalaikoma naršyklėje Opera',enable:'Įjungti SCAYT',disable:'Išjungti SCAYT',about:'Apie SCAYT',toggle:'Perjungti SCAYT',options:'Parametrai',langs:'Kalbos',moreSuggestions:'Daugiau patarimų',ignore:'Ignoruoti',ignoreAll:'Ignoruoti viską',addWord:'Pridėti žodį',emptyDic:'Žodyno vardas neturėtų būti tuščias.',optionsTab:'Parametrai',allCaps:'Ignoruoti visas didžiąsias raides',ignoreDomainNames:'Ignoruoti domenų vardus',mixedCase:'Ignoruoti maišyto dydžio raides',mixedWithDigits:'Ignoruoti raides su skaičiais',languagesTab:'Kalbos',dictionariesTab:'Žodynai',dic_field_name:'Žodyno pavadinimas',dic_create:'Sukurti',dic_restore:'Atstatyti',dic_delete:'Ištrinti',dic_rename:'Pervadinti',dic_info:'Paprastai žodynas yra saugojamas sausainėliuose (cookies), kurių dydis, bet kokiu atveju, yra apribotas. Esant sausainėlių apimties pervišiui, viskas bus saugoma serveryje. Jei norite iš kart viską saugoti serveryje, turite sugalvoti žodynui pavadinimą. Jei jau turite žodyną, įrašykite pavadinimą ir nuspauskite Atstatyti mygtuką.',aboutTab:'Apie'},about:{title:'Apie CKEditor',dlgTitle:'Apie CKEditor',help:'Patikrinkite $1 dėl pagalbos.',userGuide:'CKEditor Vartotojo Gidas',moreInfo:'Dėl licencijavimo apsilankykite mūsų svetainėje:',copy:'Copyright © $1. Visos teiss saugomos.'},maximize:'Išdidinti',minimize:'Sumažinti',fakeobjects:{anchor:'Žymė',flash:'Flash animacija',iframe:'IFrame',hiddenfield:'Paslėptas laukas',unknown:'Nežinomas objektas'},resize:'Pavilkite, kad pakeistumėte dydį',colordialog:{title:'Pasirinkite spalvą',options:'Spalvos nustatymai',highlight:'Paryškinti',selected:'Pasirinkta spalva',clear:'Išvalyti'},toolbarCollapse:'Apjungti įrankių juostą',toolbarExpand:'Išplėsti įrankių juostą',toolbarGroups:{document:'Dokumentas',clipboard:'Atmintinė/Atgal',editing:'Redagavimas',forms:'Formos',basicstyles:'Pagrindiniai stiliai',paragraph:'Paragrafas',links:'Nuorodos',insert:'Įterpti',styles:'Stiliai',colors:'Spalvos',tools:'Įrankiai'},bidi:{ltr:'Tekstas iš kairės į dešinę',rtl:'Tekstas iš dešinės į kairę'},docprops:{label:'Dokumento savybės',title:'Dokumento savybės',design:'Išdėstymas',meta:'Meta duomenys',chooseColor:'Pasirinkite',other:'<kitas>',docTitle:'Puslapio antraštė',charset:'Simbolių kodavimo lentelė',charsetOther:'Kita simbolių kodavimo lentelė',charsetASCII:'ASCII',charsetCE:'Centrinės Europos',charsetCT:'Tradicinės kinų (Big5)',charsetCR:'Kirilica',charsetGR:'Graikų',charsetJP:'Japonų',charsetKR:'Korėjiečių',charsetTR:'Turkų',charsetUN:'Unikodas (UTF-8)',charsetWE:'Vakarų Europos',docType:'Dokumento tipo antraštė',docTypeOther:'Kita dokumento tipo antraštė',xhtmlDec:'Įtraukti XHTML deklaracijas',bgColor:'Fono spalva',bgImage:'Fono paveikslėlio nuoroda (URL)',bgFixed:'Neslenkantis fonas',txtColor:'Teksto spalva',margin:'Puslapio kraštinės',marginTop:'Viršuje',marginLeft:'Kairėje',marginRight:'Dešinėje',marginBottom:'Apačioje',metaKeywords:'Dokumento indeksavimo raktiniai žodžiai (atskirti kableliais)',metaDescription:'Dokumento apibūdinimas',metaAuthor:'Autorius',metaCopyright:'Autorinės teisės',previewHtml:'<p>Tai yra <strong>pavyzdinis tekstas</strong>. Jūs naudojate <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/lv.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/lv.js
index f81fd19..7a21618 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/lv.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/lv.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.lv={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'HTML kods',newPage:'Jauna lapa',save:'Saglabāt',preview:'Pārskatīt',cut:'Izgriezt',copy:'Kopēt',paste:'Ievietot',print:'Drukāt',underline:'Apakšsvītra',bold:'Treknu šriftu',italic:'Slīprakstā',selectAll:'Iezīmēt visu',removeFormat:'Noņemt stilus',strike:'Pārsvītrots',subscript:'Zemrakstā',superscript:'Augšrakstā',horizontalrule:'Ievietot horizontālu Atdalītājsvītru',pagebreak:'Ievietot lapas pārtraukumu',pagebreakAlt:'Page Break',unlink:'Noņemt hipersaiti',undo:'Atcelt',redo:'Atkārtot',common:{browseServer:'Skatīt servera saturu',url:'URL',protocol:'Protokols',upload:'Augšupielādēt',uploadSubmit:'Nosūtīt serverim',image:'Attēls',flash:'Flash',form:'Forma',checkbox:'Atzīmēšanas kastīte',radio:'Izvēles poga',textField:'Teksta rinda',textarea:'Teksta laukums',hiddenField:'Paslēpta teksta rinda',button:'Poga',select:'Iezīmēšanas lauks',imageButton:'Attēlpoga',notSet:'<nav iestatīts>',id:'Id',name:'Nosaukums',langDir:'Valodas lasīšanas virziens',langDirLtr:'No kreisās uz labo (LTR)',langDirRtl:'No labās uz kreiso (RTL)',langCode:'Valodas kods',longDescr:'Gara apraksta Hipersaite',cssClass:'Stilu saraksta klases',advisoryTitle:'Konsultatīvs virsraksts',cssStyle:'Stils',ok:'Darīts!',cancel:'Atcelt',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Izvērstais',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Platums',height:'Augstums',align:'Nolīdzināt',alignLeft:'Pa kreisi',alignRight:'Pa labi',alignCenter:'Centrēti',alignTop:'Augšā',alignMiddle:'Vertikāli centrēts',alignBottom:'Apakšā',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Ievietot speciālo simbolu',title:'Ievietot īpašu simbolu',options:'Special Character Options'},link:{toolbar:'Ievietot/Labot hipersaiti',other:'<cits>',menu:'Labot hipersaiti',title:'Hipersaite',info:'Hipersaites informācija',target:'Mērķis',upload:'Augšupielādēt',advanced:'Izvērstais',type:'Hipersaites tips',toUrl:'URL',toAnchor:'Iezīme šajā lapā',toEmail:'E-pasts',targetFrame:'<ietvars>',targetPopup:'<uznirstošā logā>',targetFrameName:'Mērķa ietvara nosaukums',targetPopupName:'Uznirstošā loga nosaukums',popupFeatures:'Uznirstošā loga nosaukums īpašības',popupResizable:'Resizable',popupStatusBar:'Statusa josla',popupLocationBar:'Atrašanās vietas josla',popupToolbar:'Rīku josla',popupMenuBar:'Izvēlnes josla',popupFullScreen:'Pilnā ekrānā (IE)',popupScrollBars:'Ritjoslas',popupDependent:'Atkarīgs (Netscape)',popupLeft:'Kreisā koordināte',popupTop:'Augšējā koordināte',id:'Id',langDir:'Valodas lasīšanas virziens',langDirLTR:'No kreisās uz labo (LTR)',langDirRTL:'No labās uz kreiso (RTL)',acccessKey:'Pieejas kods',name:'Nosaukums',langCode:'Valodas lasīšanas virziens',tabIndex:'Ciļņu indekss',advisoryTitle:'Konsultatīvs virsraksts',advisoryContentType:'Konsultatīvs satura tips',cssClasses:'Stilu saraksta klases',charset:'Pievienotā resursa kodu tabula',styles:'Stils',rel:'Relationship',selectAnchor:'Izvēlēties iezīmi',anchorName:'Pēc iezīmes nosaukuma',anchorId:'Pēc elementa ID',emailAddress:'E-pasta adrese',emailSubject:'Ziņas tēma',emailBody:'Ziņas saturs',noAnchors:'(Šajā dokumentā nav iezīmju)',noUrl:'Lūdzu norādi hipersaiti',noEmail:'Lūdzu norādi e-pasta adresi'},anchor:{toolbar:'Ievietot/Labot iezīmi',menu:'Iezīmes īpašības',title:'Iezīmes īpašības',name:'Iezīmes nosaukums',errorName:'Lūdzu norādiet iezīmes nosaukumu',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Meklēt',replace:'Nomainīt',findWhat:'Meklēt:',replaceWith:'Nomainīt uz:',notFoundMsg:'Norādītā frāze netika atrasta.',findOptions:'Find Options',matchCase:'Reģistrjūtīgs',matchWord:'Jāsakrīt pilnībā',matchCyclic:'Match cyclic',replaceAll:'Aizvietot visu',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Tabula',title:'Tabulas īpašības',menu:'Tabulas īpašības',deleteTable:'Dzēst tabulu',rows:'Rindas',columns:'Kolonnas',border:'Rāmja izmērs',widthPx:'pikseļos',widthPc:'procentuāli',widthUnit:'width unit',cellSpace:'Rūtiņu atstatums',cellPad:'Rūtiņu nobīde',caption:'Leģenda',summary:'Anotācija',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Šūna',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Dzēst rūtiņas',merge:'Apvienot rūtiņas',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Rinda',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Dzēst rindas'},column:{menu:'Kolonna',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Dzēst kolonnas'}},button:{title:'Pogas īpašības',text:'Teksts (vērtība)',type:'Tips',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Atzīmēšanas kastītes īpašības',radioTitle:'Izvēles poga īpašības',value:'Vērtība',selected:'Iezīmēts'},form:{title:'Formas īpašības',menu:'Formas īpašības',action:'Darbība',method:'Metode',encoding:'Encoding'},select:{title:'Iezīmēšanas lauka īpašības',selectInfo:'Informācija',opAvail:'Pieejamās iespējas',value:'Vērtība',size:'Izmērs',lines:'rindas',chkMulti:'Atļaut vairākus iezīmējumus',opText:'Teksts',opValue:'Vērtība',btnAdd:'Pievienot',btnModify:'Veikt izmaiņas',btnUp:'Augšup',btnDown:'Lejup',btnSetValue:'Noteikt kā iezīmēto vērtību',btnDelete:'Dzēst'},textarea:{title:'Teksta laukuma īpašības',cols:'Kolonnas',rows:'Rindas'},textfield:{title:'Teksta rindas īpašības',name:'Nosaukums',value:'Vērtība',charWidth:'Simbolu platums',maxChars:'Simbolu maksimālais daudzums',type:'Tips',typeText:'Teksts',typePass:'Parole'},hidden:{title:'Paslēptās teksta rindas īpašības',name:'Nosaukums',value:'Vērtība'},image:{title:'Attēla īpašības',titleButton:'Attēlpogas īpašības',menu:'Attēla īpašības',infoTab:'Informācija par attēlu',btnUpload:'Nosūtīt serverim',upload:'Augšupielādēt',alt:'Alternatīvais teksts',lockRatio:'Nemainīga Augstuma/Platuma attiecība',resetSize:'Atjaunot sākotnējo izmēru',border:'Rāmis',hSpace:'Horizontālā telpa',vSpace:'Vertikālā telpa',alertUrl:'Lūdzu norādīt attēla hipersaiti',linkTab:'Hipersaite',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Flash īpašības',propertiesTab:'Properties',title:'Flash īpašības',chkPlay:'Automātiska atskaņošana',chkLoop:'Nepārtraukti',chkMenu:'Atļaut Flash izvēlni',chkFull:'Allow Fullscreen',scale:'Mainīt izmēru',scaleAll:'Rādīt visu',scaleNoBorder:'Bez rāmja',scaleFit:'Precīzs izmērs',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Absolūti apakšā',alignAbsMiddle:'Absolūti vertikāli centrēts',alignBaseline:'Pamatrindā',alignTextTop:'Teksta augšā',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Fona krāsa',hSpace:'Horizontālā telpa',vSpace:'Vertikālā telpa',validateSrc:'Lūdzu norādi hipersaiti',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Pareizrakstības pārbaude',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Netika atrasts vārdnīcā',changeTo:'Nomainīt uz',btnIgnore:'Ignorēt',btnIgnoreAll:'Ignorēt visu',btnReplace:'Aizvietot',btnReplaceAll:'Aizvietot visu',btnUndo:'Atcelt',noSuggestions:'- Nav ieteikumu -',progress:'Notiek pareizrakstības pārbaude...',noMispell:'Pareizrakstības pārbaude pabeigta: kļūdas netika atrastas',noChanges:'Pareizrakstības pārbaude pabeigta: nekas netika labots',oneChange:'Pareizrakstības pārbaude pabeigta: 1 vārds izmainīts',manyChanges:'Pareizrakstības pārbaude pabeigta: %1 vārdi tika mainīti',ieSpellDownload:'Pareizrakstības pārbaudītājs nav pievienots. Vai vēlaties to lejupielādēt tagad?'},smiley:{toolbar:'Smaidiņi',title:'Ievietot smaidiņu',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Numurēts saraksts',bulletedlist:'Izcelts saraksts',indent:'Palielināt atkāpi',outdent:'Samazināt atkāpi',justify:{left:'Izlīdzināt pa kreisi',center:'Izlīdzināt pret centru',right:'Izlīdzināt pa labi',block:'Izlīdzināt malas'},blockquote:'Block Quote',clipboard:{title:'Ievietot',cutError:'Jūsu pārlūkprogrammas drošības iestatījumi nepieļauj editoram automātiski veikt izgriešanas darbību. Lūdzu, izmantojiet (Ctrl/Cmd+X, lai veiktu šo darbību.',copyError:'Jūsu pārlūkprogrammas drošības iestatījumi nepieļauj editoram automātiski veikt kopēšanas darbību. Lūdzu, izmantojiet (Ctrl/Cmd+C), lai veiktu šo darbību.',pasteMsg:'Lūdzu, ievietojiet tekstu šajā laukumā, izmantojot klaviatūru (<STRONG>Ctrl/Cmd+V</STRONG>) un apstipriniet ar <STRONG>Darīts!</STRONG>.',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Ievietot no Worda',title:'Ievietot no Worda',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Ievietot kā vienkāršu tekstu',title:'Ievietot kā vienkāršu tekstu'},templates:{button:'Sagataves',title:'Satura sagataves',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Lūdzu, norādiet sagatavi, ko atvērt editorā<br>(patreizējie dati tiks zaudēti):',emptyListMsg:'(Nav norādītas sagataves)'},showBlocks:'Show Blocks',stylesCombo:{label:'Stils',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Formāts',panelTitle:'Formāts',tag_p:'Normāls teksts',tag_pre:'Formatēts teksts',tag_address:'Adrese',tag_h1:'Virsraksts 1',tag_h2:'Virsraksts 2',tag_h3:'Virsraksts 3',tag_h4:'Virsraksts 4',tag_h5:'Virsraksts 5',tag_h6:'Virsraksts 6',tag_div:'Rindkopa (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Šrifts',voiceLabel:'Font',panelTitle:'Šrifts'},fontSize:{label:'Izmērs',voiceLabel:'Font Size',panelTitle:'Izmērs'},colorButton:{textColorTitle:'Teksta krāsa',bgColorTitle:'Fona krāsa',panelTitle:'Colors',auto:'Automātiska',more:'Plašāka palete...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Dokumenta īpašības',title:'Dokumenta īpašības',design:'Design',meta:'META dati',chooseColor:'Choose',other:'<cits>',docTitle:'Dokumenta virsraksts <Title>',charset:'Simbolu kodējums',charsetOther:'Cits simbolu kodējums',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Dokumenta tips',docTypeOther:'Cits dokumenta tips',xhtmlDec:'Ietvert XHTML deklarācijas',bgColor:'Fona krāsa',bgImage:'Fona attēla hipersaite',bgFixed:'Fona attēls ir fiksēts',txtColor:'Teksta krāsa',margin:'Lapas robežas',marginTop:'Augšā',marginLeft:'Pa kreisi',marginRight:'Pa labi',marginBottom:'Apakšā',metaKeywords:'Dokumentu aprakstoši atslēgvārdi (atdalīti ar komatu)',metaDescription:'Dokumenta apraksts',metaAuthor:'Autors',metaCopyright:'Autortiesības',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.lv={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'HTML kods',newPage:'Jauna lapa',save:'Saglabāt',preview:'Pārskatīt',cut:'Izgriezt',copy:'Kopēt',paste:'Ievietot',print:'Drukāt',underline:'Apakšsvītra',bold:'Treknu šriftu',italic:'Slīprakstā',selectAll:'Iezīmēt visu',removeFormat:'Noņemt stilus',strike:'Pārsvītrots',subscript:'Zemrakstā',superscript:'Augšrakstā',horizontalrule:'Ievietot horizontālu Atdalītājsvītru',pagebreak:'Ievietot lapas pārtraukumu',pagebreakAlt:'Page Break',unlink:'Noņemt hipersaiti',undo:'Atcelt',redo:'Atkārtot',common:{browseServer:'Skatīt servera saturu',url:'URL',protocol:'Protokols',upload:'Augšupielādēt',uploadSubmit:'Nosūtīt serverim',image:'Attēls',flash:'Flash',form:'Forma',checkbox:'Atzīmēšanas kastīte',radio:'Izvēles poga',textField:'Teksta rinda',textarea:'Teksta laukums',hiddenField:'Paslēpta teksta rinda',button:'Poga',select:'Iezīmēšanas lauks',imageButton:'Attēlpoga',notSet:'<nav iestatīts>',id:'Id',name:'Nosaukums',langDir:'Valodas lasīšanas virziens',langDirLtr:'No kreisās uz labo (LTR)',langDirRtl:'No labās uz kreiso (RTL)',langCode:'Valodas kods',longDescr:'Gara apraksta Hipersaite',cssClass:'Stilu saraksta klases',advisoryTitle:'Konsultatīvs virsraksts',cssStyle:'Stils',ok:'Darīts!',cancel:'Atcelt',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Izvērstais',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Platums',height:'Augstums',align:'Nolīdzināt',alignLeft:'Pa kreisi',alignRight:'Pa labi',alignCenter:'Centrēti',alignTop:'Augšā',alignMiddle:'Vertikāli centrēts',alignBottom:'Apakšā',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Ievietot speciālo simbolu',title:'Ievietot īpašu simbolu',options:'Special Character Options'},link:{toolbar:'Ievietot/Labot hipersaiti',other:'<cits>',menu:'Labot hipersaiti',title:'Hipersaite',info:'Hipersaites informācija',target:'Mērķis',upload:'Augšupielādēt',advanced:'Izvērstais',type:'Hipersaites tips',toUrl:'URL',toAnchor:'Iezīme šajā lapā',toEmail:'E-pasts',targetFrame:'<ietvars>',targetPopup:'<uznirstošā logā>',targetFrameName:'Mērķa ietvara nosaukums',targetPopupName:'Uznirstošā loga nosaukums',popupFeatures:'Uznirstošā loga nosaukums īpašības',popupResizable:'Resizable',popupStatusBar:'Statusa josla',popupLocationBar:'Atrašanās vietas josla',popupToolbar:'Rīku josla',popupMenuBar:'Izvēlnes josla',popupFullScreen:'Pilnā ekrānā (IE)',popupScrollBars:'Ritjoslas',popupDependent:'Atkarīgs (Netscape)',popupLeft:'Kreisā koordināte',popupTop:'Augšējā koordināte',id:'Id',langDir:'Valodas lasīšanas virziens',langDirLTR:'No kreisās uz labo (LTR)',langDirRTL:'No labās uz kreiso (RTL)',acccessKey:'Pieejas kods',name:'Nosaukums',langCode:'Valodas lasīšanas virziens',tabIndex:'Ciļņu indekss',advisoryTitle:'Konsultatīvs virsraksts',advisoryContentType:'Konsultatīvs satura tips',cssClasses:'Stilu saraksta klases',charset:'Pievienotā resursa kodu tabula',styles:'Stils',rel:'Relationship',selectAnchor:'Izvēlēties iezīmi',anchorName:'Pēc iezīmes nosaukuma',anchorId:'Pēc elementa ID',emailAddress:'E-pasta adrese',emailSubject:'Ziņas tēma',emailBody:'Ziņas saturs',noAnchors:'(Šajā dokumentā nav iezīmju)',noUrl:'Lūdzu norādi hipersaiti',noEmail:'Lūdzu norādi e-pasta adresi'},anchor:{toolbar:'Ievietot/Labot iezīmi',menu:'Iezīmes īpašības',title:'Iezīmes īpašības',name:'Iezīmes nosaukums',errorName:'Lūdzu norādiet iezīmes nosaukumu',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Meklēt',replace:'Nomainīt',findWhat:'Meklēt:',replaceWith:'Nomainīt uz:',notFoundMsg:'Norādītā frāze netika atrasta.',findOptions:'Find Options',matchCase:'Reģistrjūtīgs',matchWord:'Jāsakrīt pilnībā',matchCyclic:'Match cyclic',replaceAll:'Aizvietot visu',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Tabula',title:'Tabulas īpašības',menu:'Tabulas īpašības',deleteTable:'Dzēst tabulu',rows:'Rindas',columns:'Kolonnas',border:'Rāmja izmērs',widthPx:'pikseļos',widthPc:'procentuāli',widthUnit:'width unit',cellSpace:'Rūtiņu atstatums',cellPad:'Rūtiņu nobīde',caption:'Leģenda',summary:'Anotācija',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Šūna',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Dzēst rūtiņas',merge:'Apvienot rūtiņas',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Rinda',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Dzēst rindas'},column:{menu:'Kolonna',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Dzēst kolonnas'}},button:{title:'Pogas īpašības',text:'Teksts (vērtība)',type:'Tips',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Atzīmēšanas kastītes īpašības',radioTitle:'Izvēles poga īpašības',value:'Vērtība',selected:'Iezīmēts'},form:{title:'Formas īpašības',menu:'Formas īpašības',action:'Darbība',method:'Metode',encoding:'Encoding'},select:{title:'Iezīmēšanas lauka īpašības',selectInfo:'Informācija',opAvail:'Pieejamās iespējas',value:'Vērtība',size:'Izmērs',lines:'rindas',chkMulti:'Atļaut vairākus iezīmējumus',opText:'Teksts',opValue:'Vērtība',btnAdd:'Pievienot',btnModify:'Veikt izmaiņas',btnUp:'Augšup',btnDown:'Lejup',btnSetValue:'Noteikt kā iezīmēto vērtību',btnDelete:'Dzēst'},textarea:{title:'Teksta laukuma īpašības',cols:'Kolonnas',rows:'Rindas'},textfield:{title:'Teksta rindas īpašības',name:'Nosaukums',value:'Vērtība',charWidth:'Simbolu platums',maxChars:'Simbolu maksimālais daudzums',type:'Tips',typeText:'Teksts',typePass:'Parole'},hidden:{title:'Paslēptās teksta rindas īpašības',name:'Nosaukums',value:'Vērtība'},image:{title:'Attēla īpašības',titleButton:'Attēlpogas īpašības',menu:'Attēla īpašības',infoTab:'Informācija par attēlu',btnUpload:'Nosūtīt serverim',upload:'Augšupielādēt',alt:'Alternatīvais teksts',lockRatio:'Nemainīga Augstuma/Platuma attiecība',resetSize:'Atjaunot sākotnējo izmēru',border:'Rāmis',hSpace:'Horizontālā telpa',vSpace:'Vertikālā telpa',alertUrl:'Lūdzu norādīt attēla hipersaiti',linkTab:'Hipersaite',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Flash īpašības',propertiesTab:'Properties',title:'Flash īpašības',chkPlay:'Automātiska atskaņošana',chkLoop:'Nepārtraukti',chkMenu:'Atļaut Flash izvēlni',chkFull:'Allow Fullscreen',scale:'Mainīt izmēru',scaleAll:'Rādīt visu',scaleNoBorder:'Bez rāmja',scaleFit:'Precīzs izmērs',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Absolūti apakšā',alignAbsMiddle:'Absolūti vertikāli centrēts',alignBaseline:'Pamatrindā',alignTextTop:'Teksta augšā',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Fona krāsa',hSpace:'Horizontālā telpa',vSpace:'Vertikālā telpa',validateSrc:'Lūdzu norādi hipersaiti',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Pareizrakstības pārbaude',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Netika atrasts vārdnīcā',changeTo:'Nomainīt uz',btnIgnore:'Ignorēt',btnIgnoreAll:'Ignorēt visu',btnReplace:'Aizvietot',btnReplaceAll:'Aizvietot visu',btnUndo:'Atcelt',noSuggestions:'- Nav ieteikumu -',progress:'Notiek pareizrakstības pārbaude...',noMispell:'Pareizrakstības pārbaude pabeigta: kļūdas netika atrastas',noChanges:'Pareizrakstības pārbaude pabeigta: nekas netika labots',oneChange:'Pareizrakstības pārbaude pabeigta: 1 vārds izmainīts',manyChanges:'Pareizrakstības pārbaude pabeigta: %1 vārdi tika mainīti',ieSpellDownload:'Pareizrakstības pārbaudītājs nav pievienots. Vai vēlaties to lejupielādēt tagad?'},smiley:{toolbar:'Smaidiņi',title:'Ievietot smaidiņu',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Numurēts saraksts',bulletedlist:'Izcelts saraksts',indent:'Palielināt atkāpi',outdent:'Samazināt atkāpi',justify:{left:'Izlīdzināt pa kreisi',center:'Izlīdzināt pret centru',right:'Izlīdzināt pa labi',block:'Izlīdzināt malas'},blockquote:'Block Quote',clipboard:{title:'Ievietot',cutError:'Jūsu pārlūkprogrammas drošības iestatījumi nepieļauj editoram automātiski veikt izgriešanas darbību. Lūdzu, izmantojiet (Ctrl/Cmd+X, lai veiktu šo darbību.',copyError:'Jūsu pārlūkprogrammas drošības iestatījumi nepieļauj editoram automātiski veikt kopēšanas darbību. Lūdzu, izmantojiet (Ctrl/Cmd+C), lai veiktu šo darbību.',pasteMsg:'Lūdzu, ievietojiet tekstu šajā laukumā, izmantojot klaviatūru (<STRONG>Ctrl/Cmd+V</STRONG>) un apstipriniet ar <STRONG>Darīts!</STRONG>.',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Ievietot no Worda',title:'Ievietot no Worda',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Ievietot kā vienkāršu tekstu',title:'Ievietot kā vienkāršu tekstu'},templates:{button:'Sagataves',title:'Satura sagataves',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Lūdzu, norādiet sagatavi, ko atvērt editorā<br>(patreizējie dati tiks zaudēti):',emptyListMsg:'(Nav norādītas sagataves)'},showBlocks:'Show Blocks',stylesCombo:{label:'Stils',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Formāts',panelTitle:'Formāts',tag_p:'Normāls teksts',tag_pre:'Formatēts teksts',tag_address:'Adrese',tag_h1:'Virsraksts 1',tag_h2:'Virsraksts 2',tag_h3:'Virsraksts 3',tag_h4:'Virsraksts 4',tag_h5:'Virsraksts 5',tag_h6:'Virsraksts 6',tag_div:'Rindkopa (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Šrifts',voiceLabel:'Font',panelTitle:'Šrifts'},fontSize:{label:'Izmērs',voiceLabel:'Font Size',panelTitle:'Izmērs'},colorButton:{textColorTitle:'Teksta krāsa',bgColorTitle:'Fona krāsa',panelTitle:'Colors',auto:'Automātiska',more:'Plašāka palete...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Dokumenta īpašības',title:'Dokumenta īpašības',design:'Design',meta:'META dati',chooseColor:'Choose',other:'<cits>',docTitle:'Dokumenta virsraksts <Title>',charset:'Simbolu kodējums',charsetOther:'Cits simbolu kodējums',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Dokumenta tips',docTypeOther:'Cits dokumenta tips',xhtmlDec:'Ietvert XHTML deklarācijas',bgColor:'Fona krāsa',bgImage:'Fona attēla hipersaite',bgFixed:'Fona attēls ir fiksēts',txtColor:'Teksta krāsa',margin:'Lapas robežas',marginTop:'Augšā',marginLeft:'Pa kreisi',marginRight:'Pa labi',marginBottom:'Apakšā',metaKeywords:'Dokumentu aprakstoši atslēgvārdi (atdalīti ar komatu)',metaDescription:'Dokumenta apraksts',metaAuthor:'Autors',metaCopyright:'Autortiesības',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/mk.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/mk.js
index e390d48..72078a8 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/mk.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/mk.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.mk={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Source',newPage:'New Page',save:'Save',preview:'Preview',cut:'Cut',copy:'Copy',paste:'Paste',print:'Print',underline:'Underline',bold:'Bold',italic:'Italic',selectAll:'Select All',removeFormat:'Remove Format',strike:'Strike Through',subscript:'Subscript',superscript:'Superscript',horizontalrule:'Insert Horizontal Line',pagebreak:'Insert Page Break for Printing',pagebreakAlt:'Page Break',unlink:'Unlink',undo:'Undo',redo:'Redo',common:{browseServer:'Browse Server',url:'URL',protocol:'Protocol',upload:'Upload',uploadSubmit:'Send it to the Server',image:'Image',flash:'Flash',form:'Form',checkbox:'Checkbox',radio:'Radio Button',textField:'Text Field',textarea:'Textarea',hiddenField:'Hidden Field',button:'Button',select:'Selection Field',imageButton:'Image Button',notSet:'<not set>',id:'Id',name:'Name',langDir:'Language Direction',langDirLtr:'Left to Right (LTR)',langDirRtl:'Right to Left (RTL)',langCode:'Language Code',longDescr:'Long Description URL',cssClass:'Stylesheet Classes',advisoryTitle:'Advisory Title',cssStyle:'Style',ok:'OK',cancel:'Cancel',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Advanced',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Width',height:'Height',align:'Alignment',alignLeft:'Left',alignRight:'Right',alignCenter:'Center',alignTop:'Top',alignMiddle:'Middle',alignBottom:'Bottom',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Insert Special Character',title:'Select Special Character',options:'Special Character Options'},link:{toolbar:'Link',other:'<other>',menu:'Edit Link',title:'Link',info:'Link Info',target:'Target',upload:'Upload',advanced:'Advanced',type:'Link Type',toUrl:'URL',toAnchor:'Link to anchor in the text',toEmail:'E-mail',targetFrame:'<frame>',targetPopup:'<popup window>',targetFrameName:'Target Frame Name',targetPopupName:'Popup Window Name',popupFeatures:'Popup Window Features',popupResizable:'Resizable',popupStatusBar:'Status Bar',popupLocationBar:'Location Bar',popupToolbar:'Toolbar',popupMenuBar:'Menu Bar',popupFullScreen:'Full Screen (IE)',popupScrollBars:'Scroll Bars',popupDependent:'Dependent (Netscape)',popupLeft:'Left Position',popupTop:'Top Position',id:'Id',langDir:'Language Direction',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',acccessKey:'Access Key',name:'Name',langCode:'Language Code',tabIndex:'Tab Index',advisoryTitle:'Advisory Title',advisoryContentType:'Advisory Content Type',cssClasses:'Stylesheet Classes',charset:'Linked Resource Charset',styles:'Style',rel:'Relationship',selectAnchor:'Select an Anchor',anchorName:'By Anchor Name',anchorId:'By Element Id',emailAddress:'E-Mail Address',emailSubject:'Message Subject',emailBody:'Message Body',noAnchors:'(No anchors available in the document)',noUrl:'Please type the link URL',noEmail:'Please type the e-mail address'},anchor:{toolbar:'Anchor',menu:'Edit Anchor',title:'Anchor Properties',name:'Anchor Name',errorName:'Please type the anchor name',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Find',replace:'Replace',findWhat:'Find what:',replaceWith:'Replace with:',notFoundMsg:'The specified text was not found.',findOptions:'Find Options',matchCase:'Match case',matchWord:'Match whole word',matchCyclic:'Match cyclic',replaceAll:'Replace All',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Table',title:'Table Properties',menu:'Table Properties',deleteTable:'Delete Table',rows:'Rows',columns:'Columns',border:'Border size',widthPx:'pixels',widthPc:'percent',widthUnit:'width unit',cellSpace:'Cell spacing',cellPad:'Cell padding',caption:'Caption',summary:'Summary',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Cell',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Delete Cells',merge:'Merge Cells',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Row',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Delete Rows'},column:{menu:'Column',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Delete Columns'}},button:{title:'Button Properties',text:'Text (Value)',type:'Type',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Checkbox Properties',radioTitle:'Radio Button Properties',value:'Value',selected:'Selected'},form:{title:'Form Properties',menu:'Form Properties',action:'Action',method:'Method',encoding:'Encoding'},select:{title:'Selection Field Properties',selectInfo:'Select Info',opAvail:'Available Options',value:'Value',size:'Size',lines:'lines',chkMulti:'Allow multiple selections',opText:'Text',opValue:'Value',btnAdd:'Add',btnModify:'Modify',btnUp:'Up',btnDown:'Down',btnSetValue:'Set as selected value',btnDelete:'Delete'},textarea:{title:'Textarea Properties',cols:'Columns',rows:'Rows'},textfield:{title:'Text Field Properties',name:'Name',value:'Value',charWidth:'Character Width',maxChars:'Maximum Characters',type:'Type',typeText:'Text',typePass:'Password'},hidden:{title:'Hidden Field Properties',name:'Name',value:'Value'},image:{title:'Image Properties',titleButton:'Image Button Properties',menu:'Image Properties',infoTab:'Image Info',btnUpload:'Send it to the Server',upload:'Upload',alt:'Alternative Text',lockRatio:'Lock Ratio',resetSize:'Reset Size',border:'Border',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Please type the image URL',linkTab:'Link',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Flash Properties',propertiesTab:'Properties',title:'Flash Properties',chkPlay:'Auto Play',chkLoop:'Loop',chkMenu:'Enable Flash Menu',chkFull:'Allow Fullscreen',scale:'Scale',scaleAll:'Show all',scaleNoBorder:'No Border',scaleFit:'Exact Fit',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs Bottom',alignAbsMiddle:'Abs Middle',alignBaseline:'Baseline',alignTextTop:'Text Top',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Background color',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'URL must not be empty.',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Check Spelling',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Not in dictionary',changeTo:'Change to',btnIgnore:'Ignore',btnIgnoreAll:'Ignore All',btnReplace:'Replace',btnReplaceAll:'Replace All',btnUndo:'Undo',noSuggestions:'- No suggestions -',progress:'Spell check in progress...',noMispell:'Spell check complete: No misspellings found',noChanges:'Spell check complete: No words changed',oneChange:'Spell check complete: One word changed',manyChanges:'Spell check complete: %1 words changed',ieSpellDownload:'Spell checker not installed. Do you want to download it now?'},smiley:{toolbar:'Smiley',title:'Insert a Smiley',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Insert/Remove Numbered List',bulletedlist:'Insert/Remove Bulleted List',indent:'Increase Indent',outdent:'Decrease Indent',justify:{left:'Align Left',center:'Center',right:'Align Right',block:'Justify'},blockquote:'Block Quote',clipboard:{title:'Paste',cutError:"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).",copyError:"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).",pasteMsg:'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Paste from Word',title:'Paste from Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Paste as plain text',title:'Paste as Plain Text'},templates:{button:'Templates',title:'Content Templates',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Please select the template to open in the editor',emptyListMsg:'(No templates defined)'},showBlocks:'Show Blocks',stylesCombo:{label:'Styles',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Format',panelTitle:'Paragraph Format',tag_p:'Normal',tag_pre:'Formatted',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Font',voiceLabel:'Font',panelTitle:'Font Name'},fontSize:{label:'Size',voiceLabel:'Font Size',panelTitle:'Font Size'},colorButton:{textColorTitle:'Text Color',bgColorTitle:'Background Color',panelTitle:'Colors',auto:'Automatic',more:'More Colors...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Document Properties',title:'Document Properties',design:'Design',meta:'Meta Tags',chooseColor:'Choose',other:'Other...',docTitle:'Page Title',charset:'Character Set Encoding',charsetOther:'Other Character Set Encoding',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Document Type Heading',docTypeOther:'Other Document Type Heading',xhtmlDec:'Include XHTML Declarations',bgColor:'Background Color',bgImage:'Background Image URL',bgFixed:'Non-scrolling (Fixed) Background',txtColor:'Text Color',margin:'Page Margins',marginTop:'Top',marginLeft:'Left',marginRight:'Right',marginBottom:'Bottom',metaKeywords:'Document Indexing Keywords (comma separated)',metaDescription:'Document Description',metaAuthor:'Author',metaCopyright:'Copyright',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.mk={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Source',newPage:'New Page',save:'Save',preview:'Preview',cut:'Cut',copy:'Copy',paste:'Paste',print:'Print',underline:'Underline',bold:'Bold',italic:'Italic',selectAll:'Select All',removeFormat:'Remove Format',strike:'Strike Through',subscript:'Subscript',superscript:'Superscript',horizontalrule:'Insert Horizontal Line',pagebreak:'Insert Page Break for Printing',pagebreakAlt:'Page Break',unlink:'Unlink',undo:'Undo',redo:'Redo',common:{browseServer:'Browse Server',url:'URL',protocol:'Protocol',upload:'Upload',uploadSubmit:'Send it to the Server',image:'Image',flash:'Flash',form:'Form',checkbox:'Checkbox',radio:'Radio Button',textField:'Text Field',textarea:'Textarea',hiddenField:'Hidden Field',button:'Button',select:'Selection Field',imageButton:'Image Button',notSet:'<not set>',id:'Id',name:'Name',langDir:'Language Direction',langDirLtr:'Left to Right (LTR)',langDirRtl:'Right to Left (RTL)',langCode:'Language Code',longDescr:'Long Description URL',cssClass:'Stylesheet Classes',advisoryTitle:'Advisory Title',cssStyle:'Style',ok:'OK',cancel:'Cancel',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Advanced',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Width',height:'Height',align:'Alignment',alignLeft:'Left',alignRight:'Right',alignCenter:'Center',alignTop:'Top',alignMiddle:'Middle',alignBottom:'Bottom',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Insert Special Character',title:'Select Special Character',options:'Special Character Options'},link:{toolbar:'Link',other:'<other>',menu:'Edit Link',title:'Link',info:'Link Info',target:'Target',upload:'Upload',advanced:'Advanced',type:'Link Type',toUrl:'URL',toAnchor:'Link to anchor in the text',toEmail:'E-mail',targetFrame:'<frame>',targetPopup:'<popup window>',targetFrameName:'Target Frame Name',targetPopupName:'Popup Window Name',popupFeatures:'Popup Window Features',popupResizable:'Resizable',popupStatusBar:'Status Bar',popupLocationBar:'Location Bar',popupToolbar:'Toolbar',popupMenuBar:'Menu Bar',popupFullScreen:'Full Screen (IE)',popupScrollBars:'Scroll Bars',popupDependent:'Dependent (Netscape)',popupLeft:'Left Position',popupTop:'Top Position',id:'Id',langDir:'Language Direction',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',acccessKey:'Access Key',name:'Name',langCode:'Language Code',tabIndex:'Tab Index',advisoryTitle:'Advisory Title',advisoryContentType:'Advisory Content Type',cssClasses:'Stylesheet Classes',charset:'Linked Resource Charset',styles:'Style',rel:'Relationship',selectAnchor:'Select an Anchor',anchorName:'By Anchor Name',anchorId:'By Element Id',emailAddress:'E-Mail Address',emailSubject:'Message Subject',emailBody:'Message Body',noAnchors:'(No anchors available in the document)',noUrl:'Please type the link URL',noEmail:'Please type the e-mail address'},anchor:{toolbar:'Anchor',menu:'Edit Anchor',title:'Anchor Properties',name:'Anchor Name',errorName:'Please type the anchor name',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Find',replace:'Replace',findWhat:'Find what:',replaceWith:'Replace with:',notFoundMsg:'The specified text was not found.',findOptions:'Find Options',matchCase:'Match case',matchWord:'Match whole word',matchCyclic:'Match cyclic',replaceAll:'Replace All',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Table',title:'Table Properties',menu:'Table Properties',deleteTable:'Delete Table',rows:'Rows',columns:'Columns',border:'Border size',widthPx:'pixels',widthPc:'percent',widthUnit:'width unit',cellSpace:'Cell spacing',cellPad:'Cell padding',caption:'Caption',summary:'Summary',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Cell',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Delete Cells',merge:'Merge Cells',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Row',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Delete Rows'},column:{menu:'Column',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Delete Columns'}},button:{title:'Button Properties',text:'Text (Value)',type:'Type',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Checkbox Properties',radioTitle:'Radio Button Properties',value:'Value',selected:'Selected'},form:{title:'Form Properties',menu:'Form Properties',action:'Action',method:'Method',encoding:'Encoding'},select:{title:'Selection Field Properties',selectInfo:'Select Info',opAvail:'Available Options',value:'Value',size:'Size',lines:'lines',chkMulti:'Allow multiple selections',opText:'Text',opValue:'Value',btnAdd:'Add',btnModify:'Modify',btnUp:'Up',btnDown:'Down',btnSetValue:'Set as selected value',btnDelete:'Delete'},textarea:{title:'Textarea Properties',cols:'Columns',rows:'Rows'},textfield:{title:'Text Field Properties',name:'Name',value:'Value',charWidth:'Character Width',maxChars:'Maximum Characters',type:'Type',typeText:'Text',typePass:'Password'},hidden:{title:'Hidden Field Properties',name:'Name',value:'Value'},image:{title:'Image Properties',titleButton:'Image Button Properties',menu:'Image Properties',infoTab:'Image Info',btnUpload:'Send it to the Server',upload:'Upload',alt:'Alternative Text',lockRatio:'Lock Ratio',resetSize:'Reset Size',border:'Border',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Please type the image URL',linkTab:'Link',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Flash Properties',propertiesTab:'Properties',title:'Flash Properties',chkPlay:'Auto Play',chkLoop:'Loop',chkMenu:'Enable Flash Menu',chkFull:'Allow Fullscreen',scale:'Scale',scaleAll:'Show all',scaleNoBorder:'No Border',scaleFit:'Exact Fit',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs Bottom',alignAbsMiddle:'Abs Middle',alignBaseline:'Baseline',alignTextTop:'Text Top',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Background color',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'URL must not be empty.',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Check Spelling',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Not in dictionary',changeTo:'Change to',btnIgnore:'Ignore',btnIgnoreAll:'Ignore All',btnReplace:'Replace',btnReplaceAll:'Replace All',btnUndo:'Undo',noSuggestions:'- No suggestions -',progress:'Spell check in progress...',noMispell:'Spell check complete: No misspellings found',noChanges:'Spell check complete: No words changed',oneChange:'Spell check complete: One word changed',manyChanges:'Spell check complete: %1 words changed',ieSpellDownload:'Spell checker not installed. Do you want to download it now?'},smiley:{toolbar:'Smiley',title:'Insert a Smiley',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Insert/Remove Numbered List',bulletedlist:'Insert/Remove Bulleted List',indent:'Increase Indent',outdent:'Decrease Indent',justify:{left:'Align Left',center:'Center',right:'Align Right',block:'Justify'},blockquote:'Block Quote',clipboard:{title:'Paste',cutError:"Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).",copyError:"Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).",pasteMsg:'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Paste from Word',title:'Paste from Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Paste as plain text',title:'Paste as Plain Text'},templates:{button:'Templates',title:'Content Templates',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Please select the template to open in the editor',emptyListMsg:'(No templates defined)'},showBlocks:'Show Blocks',stylesCombo:{label:'Styles',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Format',panelTitle:'Paragraph Format',tag_p:'Normal',tag_pre:'Formatted',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Font',voiceLabel:'Font',panelTitle:'Font Name'},fontSize:{label:'Size',voiceLabel:'Font Size',panelTitle:'Font Size'},colorButton:{textColorTitle:'Text Color',bgColorTitle:'Background Color',panelTitle:'Colors',auto:'Automatic',more:'More Colors...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Document Properties',title:'Document Properties',design:'Design',meta:'Meta Tags',chooseColor:'Choose',other:'Other...',docTitle:'Page Title',charset:'Character Set Encoding',charsetOther:'Other Character Set Encoding',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Document Type Heading',docTypeOther:'Other Document Type Heading',xhtmlDec:'Include XHTML Declarations',bgColor:'Background Color',bgImage:'Background Image URL',bgFixed:'Non-scrolling (Fixed) Background',txtColor:'Text Color',margin:'Page Margins',marginTop:'Top',marginLeft:'Left',marginRight:'Right',marginBottom:'Bottom',metaKeywords:'Document Indexing Keywords (comma separated)',metaDescription:'Document Description',metaAuthor:'Author',metaCopyright:'Copyright',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/mn.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/mn.js
index 197cef3..f3ddf28 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/mn.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/mn.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.mn={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Код',newPage:'Шинэ хуудас',save:'Хадгалах',preview:'Уридчлан харах',cut:'Хайчлах',copy:'Хуулах',paste:'Буулгах',print:'Хэвлэх',underline:'Доогуур нь зураастай болгох',bold:'Тод бүдүүн',italic:'Налуу',selectAll:'Бүгдийг нь сонгох',removeFormat:'Формат авч хаях',strike:'Дундуур нь зураастай болгох',subscript:'Суурь болгох',superscript:'Зэрэг болгох',horizontalrule:'Хөндлөн зураас оруулах',pagebreak:'Хуудас тусгаарлагч оруулах',pagebreakAlt:'Page Break',unlink:'Линк авч хаях',undo:'Хүчингүй болгох',redo:'Өмнөх үйлдлээ сэргээх',common:{browseServer:'Сервер харуулах',url:'URL',protocol:'Протокол',upload:'Хуулах',uploadSubmit:'Үүнийг сервэррүү илгээ',image:'Зураг',flash:'Флаш',form:'Форм',checkbox:'Чекбокс',radio:'Радио товч',textField:'Техт талбар',textarea:'Техт орчин',hiddenField:'Нууц талбар',button:'Товч',select:'Сонгогч талбар',imageButton:'Зурагтай товч',notSet:'<Оноохгүй>',id:'Id',name:'Нэр',langDir:'Хэлний чиглэл',langDirLtr:'Зүүнээс баруун (LTR)',langDirRtl:'Баруунаас зүүн (RTL)',langCode:'Хэлний код',longDescr:'URL-ын тайлбар',cssClass:'Stylesheet классууд',advisoryTitle:'Зөвлөлдөх гарчиг',cssStyle:'Загвар',ok:'OK',cancel:'Болих',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Нэмэлт',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Өргөн',height:'Өндөр',align:'Эгнээ',alignLeft:'Зүүн',alignRight:'Баруун',alignCenter:'Төвд',alignTop:'Дээд талд',alignMiddle:'Дунд талд',alignBottom:'Доод талд',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Онцгой тэмдэгт оруулах',title:'Онцгой тэмдэгт сонгох',options:'Special Character Options'},link:{toolbar:'Линк Оруулах/Засварлах',other:'<other>',menu:'Холбоос засварлах',title:'Линк',info:'Линкийн мэдээлэл',target:'Байрлал',upload:'Хуулах',advanced:'Нэмэлт',type:'Линкийн төрөл',toUrl:'URL',toAnchor:'Энэ хуудасандах холбоос',toEmail:'E-Mail',targetFrame:'<Агуулах хүрээ>',targetPopup:'<popup цонх>',targetFrameName:'Очих фремын нэр',targetPopupName:'Popup цонхны нэр',popupFeatures:'Popup цонхны онцлог',popupResizable:'Resizable',popupStatusBar:'Статус хэсэг',popupLocationBar:'Location хэсэг',popupToolbar:'Багажны хэсэг',popupMenuBar:'Meню хэсэг',popupFullScreen:'Цонх дүүргэх (IE)',popupScrollBars:'Скрол хэсэгүүд',popupDependent:'Хамаатай (Netscape)',popupLeft:'Зүүн байрлал',popupTop:'Дээд байрлал',id:'Id',langDir:'Хэлний чиглэл',langDirLTR:'Зүүнээс баруун (LTR)',langDirRTL:'Баруунаас зүүн (RTL)',acccessKey:'Холбох түлхүүр',name:'Нэр',langCode:'Хэлний чиглэл',tabIndex:'Tab индекс',advisoryTitle:'Зөвлөлдөх гарчиг',advisoryContentType:'Зөвлөлдөх төрлийн агуулга',cssClasses:'Stylesheet классууд',charset:'Тэмдэгт оноох нөөцөд холбогдсон',styles:'Загвар',rel:'Relationship',selectAnchor:'Холбоос сонгох',anchorName:'Холбоосын нэрээр',anchorId:'Элемэнт Id-гаар',emailAddress:'E-Mail Хаяг',emailSubject:'Message гарчиг',emailBody:'Message-ийн агуулга',noAnchors:'(Баримт бичиг холбоосгүй байна)',noUrl:'Линк URL-ээ төрөлжүүлнэ үү',noEmail:'Е-mail хаягаа төрөлжүүлнэ үү'},anchor:{toolbar:'Холбоос Оруулах/Засварлах',menu:'Холбоос шинж чанар',title:'Холбоос шинж чанар',name:'Холбоос нэр',errorName:'Холбоос төрөл оруулна уу',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Хай мөн Дарж бич',find:'Хайх',replace:'Солих',findWhat:'Хайх үг/үсэг:',replaceWith:'Солих үг:',notFoundMsg:'Хайсан текст олсонгүй.',findOptions:'Find Options',matchCase:'Тэнцэх төлөв',matchWord:'Тэнцэх бүтэн үг',matchCyclic:'Match cyclic',replaceAll:'Бүгдийг нь Солих',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Хүснэгт',title:'Хүснэгт',menu:'Хүснэгт',deleteTable:'Хүснэгт устгах',rows:'Мөр',columns:'Багана',border:'Хүрээний хэмжээ',widthPx:'цэг',widthPc:'хувь',widthUnit:'width unit',cellSpace:'Нүх хоорондын зай (spacing)',cellPad:'Нүх доторлох(padding)',caption:'Тайлбар',summary:'Тайлбар',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Нүх/зай',insertBefore:'Нүх/зай өмнө нь оруулах',insertAfter:'Нүх/зай дараа нь оруулах',deleteCell:'Нүх устгах',merge:'Нүх нэгтэх',mergeRight:'Баруун тийш нэгтгэх',mergeDown:'Доош нэгтгэх',splitHorizontal:'Нүх/зайг босоогоор нь тусгаарлах',splitVertical:'Нүх/зайг хөндлөнгөөр нь тусгаарлах',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Мөр',insertBefore:'Мөр өмнө нь оруулах',insertAfter:'Мөр дараа нь оруулах',deleteRow:'Мөр устгах'},column:{menu:'Багана',insertBefore:'Багана өмнө нь оруулах',insertAfter:'Багана дараа нь оруулах',deleteColumn:'Багана устгах'}},button:{title:'Товчны шинж чанар',text:'Тэкст (Утга)',type:'Төрөл',typeBtn:'Товч',typeSbm:'Submit',typeRst:'Болих'},checkboxAndRadio:{checkboxTitle:'Чекбоксны шинж чанар',radioTitle:'Радио товчны шинж чанар',value:'Утга',selected:'Сонгогдсон'},form:{title:'Форм шинж чанар',menu:'Форм шинж чанар',action:'Үйлдэл',method:'Арга',encoding:'Encoding'},select:{title:'Согогч талбарын шинж чанар',selectInfo:'Мэдээлэл',opAvail:'Идвэхтэй сонголт',value:'Утга',size:'Хэмжээ',lines:'Мөр',chkMulti:'Олон сонголт зөвшөөрөх',opText:'Тэкст',opValue:'Утга',btnAdd:'Нэмэх',btnModify:'Өөрчлөх',btnUp:'Дээш',btnDown:'Доош',btnSetValue:'Сонгогдсан утга оноох',btnDelete:'Устгах'},textarea:{title:'Текст орчны шинж чанар',cols:'Багана',rows:'Мөр'},textfield:{title:'Текст талбарын шинж чанар',name:'Нэр',value:'Утга',charWidth:'Тэмдэгтын өргөн',maxChars:'Хамгийн их тэмдэгт',type:'Төрөл',typeText:'Текст',typePass:'Нууц үг'},hidden:{title:'Нууц талбарын шинж чанар',name:'Нэр',value:'Утга'},image:{title:'Зураг',titleButton:'Зурган товчны шинж чанар',menu:'Зураг',infoTab:'Зурагны мэдээлэл',btnUpload:'Үүнийг сервэррүү илгээ',upload:'Хуулах',alt:'Тайлбар текст',lockRatio:'Радио түгжих',resetSize:'хэмжээ дахин оноох',border:'Хүрээ',hSpace:'Хөндлөн зай',vSpace:'Босоо зай',alertUrl:'Зурагны URL-ын төрлийн сонгоно уу',linkTab:'Линк',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Флаш шинж чанар',propertiesTab:'Properties',title:'Флаш шинж чанар',chkPlay:'Автоматаар тоглох',chkLoop:'Давтах',chkMenu:'Флаш цэс идвэхжүүлэх',chkFull:'Allow Fullscreen',scale:'Өргөгтгөх',scaleAll:'Бүгдийг харуулах',scaleNoBorder:'Хүрээгүй',scaleFit:'Яг тааруулах',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs доод талд',alignAbsMiddle:'Abs Дунд талд',alignBaseline:'Baseline',alignTextTop:'Текст дээр',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Фонны өнгө',hSpace:'Хөндлөн зай',vSpace:'Босоо зай',validateSrc:'Линк URL-ээ төрөлжүүлнэ үү',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Үгийн дүрэх шалгах',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Толь бичиггүй',changeTo:'Өөрчлөх',btnIgnore:'Зөвшөөрөх',btnIgnoreAll:'Бүгдийг зөвшөөрөх',btnReplace:'Дарж бичих',btnReplaceAll:'Бүгдийг Дарж бичих',btnUndo:'Буцаах',noSuggestions:'- Тайлбаргүй -',progress:'Дүрэм шалгаж байгаа үйл явц...',noMispell:'Дүрэм шалгаад дууссан: Алдаа олдсонгүй',noChanges:'Дүрэм шалгаад дууссан: үг өөрчлөгдөөгүй',oneChange:'Дүрэм шалгаад дууссан: 1 үг өөрчлөгдсөн',manyChanges:'Дүрэм шалгаад дууссан: %1 үг өөрчлөгдсөн',ieSpellDownload:'Дүрэм шалгагч суугаагүй байна. Татаж авахыг хүсч байна уу?'},smiley:{toolbar:'Тодорхойлолт',title:'Тодорхойлолт оруулах',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Дугаарлагдсан жагсаалт',bulletedlist:'Цэгтэй жагсаалт',indent:'Догол мөр хасах',outdent:'Догол мөр нэмэх',justify:{left:'Зүүн талд байрлуулах',center:'Төвд байрлуулах',right:'Баруун талд байрлуулах',block:'Блок хэлбэрээр байрлуулах'},blockquote:'Хайрцаглах',clipboard:{title:'Буулгах',cutError:'Таны browser-ын хамгаалалтын тохиргоо editor-д автоматаар хайчлах үйлдэлийг зөвшөөрөхгүй байна. (Ctrl/Cmd+X) товчны хослолыг ашиглана уу.',copyError:'Таны browser-ын хамгаалалтын тохиргоо editor-д автоматаар хуулах үйлдэлийг зөвшөөрөхгүй байна. (Ctrl/Cmd+C) товчны хослолыг ашиглана уу.',pasteMsg:'(<strong>Ctrl/Cmd+V</strong>) товчийг ашиглан paste хийнэ үү. Мөн <strong>OK</strong> дар.',securityMsg:'Таны үзүүлэгч/browser/-н хамгаалалтын тохиргооноос болоод editor clipboard өгөгдөлрүү шууд хандах боломжгүй. Энэ цонход дахин paste хийхийг оролд.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Word-оос буулгах',title:'Word-оос буулгах',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Plain Text-ээс буулгах',title:'Plain Text-ээс буулгах'},templates:{button:'Загварууд',title:'Загварын агуулга',options:'Template Options',insertOption:'Одоогийн агууллагыг дарж бичих',selectPromptMsg:'Загварыг нээж editor-рүү сонгож оруулна уу<br />(Одоогийн агууллагыг устаж магадгүй):',emptyListMsg:'(Загвар тодорхойлогдоогүй байна)'},showBlocks:'Block-уудыг үзүүлэх',stylesCombo:{label:'Загвар',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Формат',panelTitle:'Формат',tag_p:'Хэвийн',tag_pre:'Formatted',tag_address:'Хаяг',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Paragraph (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Фонт',voiceLabel:'Font',panelTitle:'Фонт'},fontSize:{label:'Хэмжээ',voiceLabel:'Font Size',panelTitle:'Хэмжээ'},colorButton:{textColorTitle:'Фонтны өнгө',bgColorTitle:'Фонны өнгө',panelTitle:'Colors',auto:'Автоматаар',more:'Нэмэлт өнгөнүүд...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Баримт бичиг шинж чанар',title:'Баримт бичиг шинж чанар',design:'Design',meta:'Meta өгөгдөл',chooseColor:'Choose',other:'<other>',docTitle:'Хуудасны гарчиг',charset:'Encoding тэмдэгт',charsetOther:'Encoding-д өөр тэмдэгт оноох',charsetASCII:'ASCII',charsetCE:'Төв европ',charsetCT:'Хятадын уламжлалт (Big5)',charsetCR:'Крил',charsetGR:'Гред',charsetJP:'Япон',charsetKR:'Солонгос',charsetTR:'Tурк',charsetUN:'Юникод (UTF-8)',charsetWE:'Баруун европ',docType:'Баримт бичгийн төрөл Heading',docTypeOther:'Бусад баримт бичгийн төрөл Heading',xhtmlDec:'XHTML агуулж зарлах',bgColor:'Фоно өнгө',bgImage:'Фоно зурагны URL',bgFixed:'Гүйдэггүй фоно',txtColor:'Фонтны өнгө',margin:'Хуудасны захын зай',marginTop:'Дээд тал',marginLeft:'Зүүн тал',marginRight:'Баруун тал',marginBottom:'Доод тал',metaKeywords:'Баримт бичгийн индекс түлхүүр үг (таслалаар тусгаарлагдана)',metaDescription:'Баримт бичгийн тайлбар',metaAuthor:'Зохиогч',metaCopyright:'Зохиогчийн эрх',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.mn={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Код',newPage:'Шинэ хуудас',save:'Хадгалах',preview:'Уридчлан харах',cut:'Хайчлах',copy:'Хуулах',paste:'Буулгах',print:'Хэвлэх',underline:'Доогуур нь зураастай болгох',bold:'Тод бүдүүн',italic:'Налуу',selectAll:'Бүгдийг нь сонгох',removeFormat:'Формат авч хаях',strike:'Дундуур нь зураастай болгох',subscript:'Суурь болгох',superscript:'Зэрэг болгох',horizontalrule:'Хөндлөн зураас оруулах',pagebreak:'Хуудас тусгаарлагч оруулах',pagebreakAlt:'Page Break',unlink:'Линк авч хаях',undo:'Хүчингүй болгох',redo:'Өмнөх үйлдлээ сэргээх',common:{browseServer:'Сервер харуулах',url:'URL',protocol:'Протокол',upload:'Хуулах',uploadSubmit:'Үүнийг сервэррүү илгээ',image:'Зураг',flash:'Флаш',form:'Форм',checkbox:'Чекбокс',radio:'Радио товч',textField:'Техт талбар',textarea:'Техт орчин',hiddenField:'Нууц талбар',button:'Товч',select:'Сонгогч талбар',imageButton:'Зурагтай товч',notSet:'<Оноохгүй>',id:'Id',name:'Нэр',langDir:'Хэлний чиглэл',langDirLtr:'Зүүнээс баруун (LTR)',langDirRtl:'Баруунаас зүүн (RTL)',langCode:'Хэлний код',longDescr:'URL-ын тайлбар',cssClass:'Stylesheet классууд',advisoryTitle:'Зөвлөлдөх гарчиг',cssStyle:'Загвар',ok:'OK',cancel:'Болих',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Нэмэлт',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Өргөн',height:'Өндөр',align:'Эгнээ',alignLeft:'Зүүн',alignRight:'Баруун',alignCenter:'Төвд',alignTop:'Дээд талд',alignMiddle:'Дунд талд',alignBottom:'Доод талд',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Онцгой тэмдэгт оруулах',title:'Онцгой тэмдэгт сонгох',options:'Special Character Options'},link:{toolbar:'Линк Оруулах/Засварлах',other:'<other>',menu:'Холбоос засварлах',title:'Линк',info:'Линкийн мэдээлэл',target:'Байрлал',upload:'Хуулах',advanced:'Нэмэлт',type:'Линкийн төрөл',toUrl:'URL',toAnchor:'Энэ хуудасандах холбоос',toEmail:'E-Mail',targetFrame:'<Агуулах хүрээ>',targetPopup:'<popup цонх>',targetFrameName:'Очих фремын нэр',targetPopupName:'Popup цонхны нэр',popupFeatures:'Popup цонхны онцлог',popupResizable:'Resizable',popupStatusBar:'Статус хэсэг',popupLocationBar:'Location хэсэг',popupToolbar:'Багажны хэсэг',popupMenuBar:'Meню хэсэг',popupFullScreen:'Цонх дүүргэх (IE)',popupScrollBars:'Скрол хэсэгүүд',popupDependent:'Хамаатай (Netscape)',popupLeft:'Зүүн байрлал',popupTop:'Дээд байрлал',id:'Id',langDir:'Хэлний чиглэл',langDirLTR:'Зүүнээс баруун (LTR)',langDirRTL:'Баруунаас зүүн (RTL)',acccessKey:'Холбох түлхүүр',name:'Нэр',langCode:'Хэлний чиглэл',tabIndex:'Tab индекс',advisoryTitle:'Зөвлөлдөх гарчиг',advisoryContentType:'Зөвлөлдөх төрлийн агуулга',cssClasses:'Stylesheet классууд',charset:'Тэмдэгт оноох нөөцөд холбогдсон',styles:'Загвар',rel:'Relationship',selectAnchor:'Холбоос сонгох',anchorName:'Холбоосын нэрээр',anchorId:'Элемэнт Id-гаар',emailAddress:'E-Mail Хаяг',emailSubject:'Message гарчиг',emailBody:'Message-ийн агуулга',noAnchors:'(Баримт бичиг холбоосгүй байна)',noUrl:'Линк URL-ээ төрөлжүүлнэ үү',noEmail:'Е-mail хаягаа төрөлжүүлнэ үү'},anchor:{toolbar:'Холбоос Оруулах/Засварлах',menu:'Холбоос шинж чанар',title:'Холбоос шинж чанар',name:'Холбоос нэр',errorName:'Холбоос төрөл оруулна уу',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Хай мөн Дарж бич',find:'Хайх',replace:'Солих',findWhat:'Хайх үг/үсэг:',replaceWith:'Солих үг:',notFoundMsg:'Хайсан текст олсонгүй.',findOptions:'Find Options',matchCase:'Тэнцэх төлөв',matchWord:'Тэнцэх бүтэн үг',matchCyclic:'Match cyclic',replaceAll:'Бүгдийг нь Солих',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Хүснэгт',title:'Хүснэгт',menu:'Хүснэгт',deleteTable:'Хүснэгт устгах',rows:'Мөр',columns:'Багана',border:'Хүрээний хэмжээ',widthPx:'цэг',widthPc:'хувь',widthUnit:'width unit',cellSpace:'Нүх хоорондын зай (spacing)',cellPad:'Нүх доторлох(padding)',caption:'Тайлбар',summary:'Тайлбар',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Нүх/зай',insertBefore:'Нүх/зай өмнө нь оруулах',insertAfter:'Нүх/зай дараа нь оруулах',deleteCell:'Нүх устгах',merge:'Нүх нэгтэх',mergeRight:'Баруун тийш нэгтгэх',mergeDown:'Доош нэгтгэх',splitHorizontal:'Нүх/зайг босоогоор нь тусгаарлах',splitVertical:'Нүх/зайг хөндлөнгөөр нь тусгаарлах',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Мөр',insertBefore:'Мөр өмнө нь оруулах',insertAfter:'Мөр дараа нь оруулах',deleteRow:'Мөр устгах'},column:{menu:'Багана',insertBefore:'Багана өмнө нь оруулах',insertAfter:'Багана дараа нь оруулах',deleteColumn:'Багана устгах'}},button:{title:'Товчны шинж чанар',text:'Тэкст (Утга)',type:'Төрөл',typeBtn:'Товч',typeSbm:'Submit',typeRst:'Болих'},checkboxAndRadio:{checkboxTitle:'Чекбоксны шинж чанар',radioTitle:'Радио товчны шинж чанар',value:'Утга',selected:'Сонгогдсон'},form:{title:'Форм шинж чанар',menu:'Форм шинж чанар',action:'Үйлдэл',method:'Арга',encoding:'Encoding'},select:{title:'Согогч талбарын шинж чанар',selectInfo:'Мэдээлэл',opAvail:'Идвэхтэй сонголт',value:'Утга',size:'Хэмжээ',lines:'Мөр',chkMulti:'Олон сонголт зөвшөөрөх',opText:'Тэкст',opValue:'Утга',btnAdd:'Нэмэх',btnModify:'Өөрчлөх',btnUp:'Дээш',btnDown:'Доош',btnSetValue:'Сонгогдсан утга оноох',btnDelete:'Устгах'},textarea:{title:'Текст орчны шинж чанар',cols:'Багана',rows:'Мөр'},textfield:{title:'Текст талбарын шинж чанар',name:'Нэр',value:'Утга',charWidth:'Тэмдэгтын өргөн',maxChars:'Хамгийн их тэмдэгт',type:'Төрөл',typeText:'Текст',typePass:'Нууц үг'},hidden:{title:'Нууц талбарын шинж чанар',name:'Нэр',value:'Утга'},image:{title:'Зураг',titleButton:'Зурган товчны шинж чанар',menu:'Зураг',infoTab:'Зурагны мэдээлэл',btnUpload:'Үүнийг сервэррүү илгээ',upload:'Хуулах',alt:'Тайлбар текст',lockRatio:'Радио түгжих',resetSize:'хэмжээ дахин оноох',border:'Хүрээ',hSpace:'Хөндлөн зай',vSpace:'Босоо зай',alertUrl:'Зурагны URL-ын төрлийн сонгоно уу',linkTab:'Линк',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Флаш шинж чанар',propertiesTab:'Properties',title:'Флаш шинж чанар',chkPlay:'Автоматаар тоглох',chkLoop:'Давтах',chkMenu:'Флаш цэс идвэхжүүлэх',chkFull:'Allow Fullscreen',scale:'Өргөгтгөх',scaleAll:'Бүгдийг харуулах',scaleNoBorder:'Хүрээгүй',scaleFit:'Яг тааруулах',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs доод талд',alignAbsMiddle:'Abs Дунд талд',alignBaseline:'Baseline',alignTextTop:'Текст дээр',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Фонны өнгө',hSpace:'Хөндлөн зай',vSpace:'Босоо зай',validateSrc:'Линк URL-ээ төрөлжүүлнэ үү',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Үгийн дүрэх шалгах',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Толь бичиггүй',changeTo:'Өөрчлөх',btnIgnore:'Зөвшөөрөх',btnIgnoreAll:'Бүгдийг зөвшөөрөх',btnReplace:'Дарж бичих',btnReplaceAll:'Бүгдийг Дарж бичих',btnUndo:'Буцаах',noSuggestions:'- Тайлбаргүй -',progress:'Дүрэм шалгаж байгаа үйл явц...',noMispell:'Дүрэм шалгаад дууссан: Алдаа олдсонгүй',noChanges:'Дүрэм шалгаад дууссан: үг өөрчлөгдөөгүй',oneChange:'Дүрэм шалгаад дууссан: 1 үг өөрчлөгдсөн',manyChanges:'Дүрэм шалгаад дууссан: %1 үг өөрчлөгдсөн',ieSpellDownload:'Дүрэм шалгагч суугаагүй байна. Татаж авахыг хүсч байна уу?'},smiley:{toolbar:'Тодорхойлолт',title:'Тодорхойлолт оруулах',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Дугаарлагдсан жагсаалт',bulletedlist:'Цэгтэй жагсаалт',indent:'Догол мөр хасах',outdent:'Догол мөр нэмэх',justify:{left:'Зүүн талд байрлуулах',center:'Төвд байрлуулах',right:'Баруун талд байрлуулах',block:'Блок хэлбэрээр байрлуулах'},blockquote:'Хайрцаглах',clipboard:{title:'Буулгах',cutError:'Таны browser-ын хамгаалалтын тохиргоо editor-д автоматаар хайчлах үйлдэлийг зөвшөөрөхгүй байна. (Ctrl/Cmd+X) товчны хослолыг ашиглана уу.',copyError:'Таны browser-ын хамгаалалтын тохиргоо editor-д автоматаар хуулах үйлдэлийг зөвшөөрөхгүй байна. (Ctrl/Cmd+C) товчны хослолыг ашиглана уу.',pasteMsg:'(<strong>Ctrl/Cmd+V</strong>) товчийг ашиглан paste хийнэ үү. Мөн <strong>OK</strong> дар.',securityMsg:'Таны үзүүлэгч/browser/-н хамгаалалтын тохиргооноос болоод editor clipboard өгөгдөлрүү шууд хандах боломжгүй. Энэ цонход дахин paste хийхийг оролд.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Word-оос буулгах',title:'Word-оос буулгах',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Plain Text-ээс буулгах',title:'Plain Text-ээс буулгах'},templates:{button:'Загварууд',title:'Загварын агуулга',options:'Template Options',insertOption:'Одоогийн агууллагыг дарж бичих',selectPromptMsg:'Загварыг нээж editor-рүү сонгож оруулна уу<br />(Одоогийн агууллагыг устаж магадгүй):',emptyListMsg:'(Загвар тодорхойлогдоогүй байна)'},showBlocks:'Block-уудыг үзүүлэх',stylesCombo:{label:'Загвар',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Формат',panelTitle:'Формат',tag_p:'Хэвийн',tag_pre:'Formatted',tag_address:'Хаяг',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Paragraph (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Фонт',voiceLabel:'Font',panelTitle:'Фонт'},fontSize:{label:'Хэмжээ',voiceLabel:'Font Size',panelTitle:'Хэмжээ'},colorButton:{textColorTitle:'Фонтны өнгө',bgColorTitle:'Фонны өнгө',panelTitle:'Colors',auto:'Автоматаар',more:'Нэмэлт өнгөнүүд...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Баримт бичиг шинж чанар',title:'Баримт бичиг шинж чанар',design:'Design',meta:'Meta өгөгдөл',chooseColor:'Choose',other:'<other>',docTitle:'Хуудасны гарчиг',charset:'Encoding тэмдэгт',charsetOther:'Encoding-д өөр тэмдэгт оноох',charsetASCII:'ASCII',charsetCE:'Төв европ',charsetCT:'Хятадын уламжлалт (Big5)',charsetCR:'Крил',charsetGR:'Гред',charsetJP:'Япон',charsetKR:'Солонгос',charsetTR:'Tурк',charsetUN:'Юникод (UTF-8)',charsetWE:'Баруун европ',docType:'Баримт бичгийн төрөл Heading',docTypeOther:'Бусад баримт бичгийн төрөл Heading',xhtmlDec:'XHTML агуулж зарлах',bgColor:'Фоно өнгө',bgImage:'Фоно зурагны URL',bgFixed:'Гүйдэггүй фоно',txtColor:'Фонтны өнгө',margin:'Хуудасны захын зай',marginTop:'Дээд тал',marginLeft:'Зүүн тал',marginRight:'Баруун тал',marginBottom:'Доод тал',metaKeywords:'Баримт бичгийн индекс түлхүүр үг (таслалаар тусгаарлагдана)',metaDescription:'Баримт бичгийн тайлбар',metaAuthor:'Зохиогч',metaCopyright:'Зохиогчийн эрх',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ms.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ms.js
index 90ab943..138bb85 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ms.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ms.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.ms={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Sumber',newPage:'Helaian Baru',save:'Simpan',preview:'Prebiu',cut:'Potong',copy:'Salin',paste:'Tampal',print:'Cetak',underline:'Underline',bold:'Bold',italic:'Italic',selectAll:'Pilih Semua',removeFormat:'Buang Format',strike:'Strike Through',subscript:'Subscript',superscript:'Superscript',horizontalrule:'Masukkan Garisan Membujur',pagebreak:'Insert Page Break for Printing',pagebreakAlt:'Page Break',unlink:'Buang Sambungan',undo:'Batalkan',redo:'Ulangkan',common:{browseServer:'Browse Server',url:'URL',protocol:'Protokol',upload:'Muat Naik',uploadSubmit:'Hantar ke Server',image:'Gambar',flash:'Flash',form:'Borang',checkbox:'Checkbox',radio:'Butang Radio',textField:'Text Field',textarea:'Textarea',hiddenField:'Field Tersembunyi',button:'Butang',select:'Field Pilihan',imageButton:'Butang Bergambar',notSet:'<tidak di set>',id:'Id',name:'Nama',langDir:'Arah Tulisan',langDirLtr:'Kiri ke Kanan (LTR)',langDirRtl:'Kanan ke Kiri (RTL)',langCode:'Kod Bahasa',longDescr:'Butiran Panjang URL',cssClass:'Kelas-kelas Stylesheet',advisoryTitle:'Tajuk Makluman',cssStyle:'Stail',ok:'OK',cancel:'Batal',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Advanced',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Lebar',height:'Tinggi',align:'Jajaran',alignLeft:'Kiri',alignRight:'Kanan',alignCenter:'Tengah',alignTop:'Atas',alignMiddle:'Pertengahan',alignBottom:'Bawah',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Masukkan Huruf Istimewa',title:'Sila pilih huruf istimewa',options:'Special Character Options'},link:{toolbar:'Masukkan/Sunting Sambungan',other:'<lain>',menu:'Sunting Sambungan',title:'Sambungan',info:'Butiran Sambungan',target:'Sasaran',upload:'Muat Naik',advanced:'Advanced',type:'Jenis Sambungan',toUrl:'URL',toAnchor:'Pautan dalam muka surat ini',toEmail:'E-Mail',targetFrame:'<bingkai>',targetPopup:'<tetingkap popup>',targetFrameName:'Nama Bingkai Sasaran',targetPopupName:'Nama Tetingkap Popup',popupFeatures:'Ciri Tetingkap Popup',popupResizable:'Resizable',popupStatusBar:'Bar Status',popupLocationBar:'Bar Lokasi',popupToolbar:'Toolbar',popupMenuBar:'Bar Menu',popupFullScreen:'Skrin Penuh (IE)',popupScrollBars:'Bar-bar skrol',popupDependent:'Bergantungan (Netscape)',popupLeft:'Posisi Kiri',popupTop:'Posisi Atas',id:'Id',langDir:'Arah Tulisan',langDirLTR:'Kiri ke Kanan (LTR)',langDirRTL:'Kanan ke Kiri (RTL)',acccessKey:'Kunci Akses',name:'Nama',langCode:'Arah Tulisan',tabIndex:'Indeks Tab ',advisoryTitle:'Tajuk Makluman',advisoryContentType:'Jenis Kandungan Makluman',cssClasses:'Kelas-kelas Stylesheet',charset:'Linked Resource Charset',styles:'Stail',rel:'Relationship',selectAnchor:'Sila pilih pautan',anchorName:'dengan menggunakan nama pautan',anchorId:'dengan menggunakan ID elemen',emailAddress:'Alamat E-Mail',emailSubject:'Subjek Mesej',emailBody:'Isi Kandungan Mesej',noAnchors:'(Tiada pautan terdapat dalam dokumen ini)',noUrl:'Sila taip sambungan URL',noEmail:'Sila taip alamat e-mail'},anchor:{toolbar:'Masukkan/Sunting Pautan',menu:'Ciri-ciri Pautan',title:'Ciri-ciri Pautan',name:'Nama Pautan',errorName:'Sila taip nama pautan',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Cari',replace:'Ganti',findWhat:'Perkataan yang dicari:',replaceWith:'Diganti dengan:',notFoundMsg:'Text yang dicari tidak dijumpai.',findOptions:'Find Options',matchCase:'Padanan case huruf',matchWord:'Padana Keseluruhan perkataan',matchCyclic:'Match cyclic',replaceAll:'Ganti semua',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Jadual',title:'Ciri-ciri Jadual',menu:'Ciri-ciri Jadual',deleteTable:'Delete Table',rows:'Barisan',columns:'Jaluran',border:'Saiz Border',widthPx:'piksel-piksel',widthPc:'peratus',widthUnit:'width unit',cellSpace:'Ruangan Antara Sel',cellPad:'Tambahan Ruang Sel',caption:'Keterangan',summary:'Summary',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Cell',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Buangkan Sel-sel',merge:'Cantumkan Sel-sel',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Row',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Buangkan Baris'},column:{menu:'Column',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Buangkan Lajur'}},button:{title:'Ciri-ciri Butang',text:'Teks (Nilai)',type:'Jenis',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Ciri-ciri Checkbox',radioTitle:'Ciri-ciri Butang Radio',value:'Nilai',selected:'Dipilih'},form:{title:'Ciri-ciri Borang',menu:'Ciri-ciri Borang',action:'Tindakan borang',method:'Cara borang dihantar',encoding:'Encoding'},select:{title:'Ciri-ciri Selection Field',selectInfo:'Select Info',opAvail:'Pilihan sediada',value:'Nilai',size:'Saiz',lines:'garisan',chkMulti:'Benarkan pilihan pelbagai',opText:'Teks',opValue:'Nilai',btnAdd:'Tambah Pilihan',btnModify:'Ubah Pilihan',btnUp:'Naik ke atas',btnDown:'Turun ke bawah',btnSetValue:'Set sebagai nilai terpilih',btnDelete:'Padam'},textarea:{title:'Ciri-ciri Textarea',cols:'Lajur',rows:'Baris'},textfield:{title:'Ciri-ciri Text Field',name:'Nama',value:'Nilai',charWidth:'Lebar isian',maxChars:'Isian Maksimum',type:'Jenis',typeText:'Teks',typePass:'Kata Laluan'},hidden:{title:'Ciri-ciri Field Tersembunyi',name:'Nama',value:'Nilai'},image:{title:'Ciri-ciri Imej',titleButton:'Ciri-ciri Butang Bergambar',menu:'Ciri-ciri Imej',infoTab:'Info Imej',btnUpload:'Hantar ke Server',upload:'Muat Naik',alt:'Text Alternatif',lockRatio:'Tetapkan Nisbah',resetSize:'Saiz Set Semula',border:'Border',hSpace:'Ruang Melintang',vSpace:'Ruang Menegak',alertUrl:'Sila taip URL untuk fail gambar',linkTab:'Sambungan',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Flash Properties',propertiesTab:'Properties',title:'Flash Properties',chkPlay:'Auto Play',chkLoop:'Loop',chkMenu:'Enable Flash Menu',chkFull:'Allow Fullscreen',scale:'Scale',scaleAll:'Show all',scaleNoBorder:'No Border',scaleFit:'Exact Fit',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Bawah Mutlak',alignAbsMiddle:'Pertengahan Mutlak',alignBaseline:'Garis Dasar',alignTextTop:'Atas Text',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Warna Latarbelakang',hSpace:'Ruang Melintang',vSpace:'Ruang Menegak',validateSrc:'Sila taip sambungan URL',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Semak Ejaan',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Tidak terdapat didalam kamus',changeTo:'Tukarkan kepada',btnIgnore:'Biar',btnIgnoreAll:'Biarkan semua',btnReplace:'Ganti',btnReplaceAll:'Gantikan Semua',btnUndo:'Batalkan',noSuggestions:'- Tiada cadangan -',progress:'Pemeriksaan ejaan sedang diproses...',noMispell:'Pemeriksaan ejaan siap: Tiada salah ejaan',noChanges:'Pemeriksaan ejaan siap: Tiada perkataan diubah',oneChange:'Pemeriksaan ejaan siap: Satu perkataan telah diubah',manyChanges:'Pemeriksaan ejaan siap: %1 perkataan diubah',ieSpellDownload:'Pemeriksa ejaan tidak dipasang. Adakah anda mahu muat turun sekarang?'},smiley:{toolbar:'Smiley',title:'Masukkan Smiley',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Senarai bernombor',bulletedlist:'Senarai tidak bernombor',indent:'Tambahkan Inden',outdent:'Kurangkan Inden',justify:{left:'Jajaran Kiri',center:'Jajaran Tengah',right:'Jajaran Kanan',block:'Jajaran Blok'},blockquote:'Block Quote',clipboard:{title:'Tampal',cutError:'Keselamatan perisian browser anda tidak membenarkan operasi suntingan text/imej. Sila gunakan papan kekunci (Ctrl/Cmd+X).',copyError:'Keselamatan perisian browser anda tidak membenarkan operasi salinan text/imej. Sila gunakan papan kekunci (Ctrl/Cmd+C).',pasteMsg:'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Tampal dari Word',title:'Tampal dari Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Tampal sebagai text biasa',title:'Tampal sebagai text biasa'},templates:{button:'Templat',title:'Templat Kandungan',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Sila pilih templat untuk dibuka oleh editor<br>(kandungan sebenar akan hilang):',emptyListMsg:'(Tiada Templat Disimpan)'},showBlocks:'Show Blocks',stylesCombo:{label:'Stail',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Format',panelTitle:'Format',tag_p:'Normal',tag_pre:'Telah Diformat',tag_address:'Alamat',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Perenggan (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Font',voiceLabel:'Font',panelTitle:'Font'},fontSize:{label:'Saiz',voiceLabel:'Font Size',panelTitle:'Saiz'},colorButton:{textColorTitle:'Warna Text',bgColorTitle:'Warna Latarbelakang',panelTitle:'Colors',auto:'Otomatik',more:'Warna lain-lain...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Ciri-ciri dokumen',title:'Ciri-ciri dokumen',design:'Design',meta:'Data Meta',chooseColor:'Choose',other:'<lain>',docTitle:'Tajuk Muka Surat',charset:'Enkod Set Huruf',charsetOther:'Enkod Set Huruf yang Lain',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Jenis Kepala Dokumen',docTypeOther:'Jenis Kepala Dokumen yang Lain',xhtmlDec:'Masukkan pemula kod XHTML',bgColor:'Warna Latarbelakang',bgImage:'URL Gambar Latarbelakang',bgFixed:'Imej Latarbelakang tanpa Skrol',txtColor:'Warna Text',margin:'Margin Muka Surat',marginTop:'Atas',marginLeft:'Kiri',marginRight:'Kanan',marginBottom:'Bawah',metaKeywords:'Kata Kunci Indeks Dokumen (dipisahkan oleh koma)',metaDescription:'Keterangan Dokumen',metaAuthor:'Penulis',metaCopyright:'Hakcipta',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.ms={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Sumber',newPage:'Helaian Baru',save:'Simpan',preview:'Prebiu',cut:'Potong',copy:'Salin',paste:'Tampal',print:'Cetak',underline:'Underline',bold:'Bold',italic:'Italic',selectAll:'Pilih Semua',removeFormat:'Buang Format',strike:'Strike Through',subscript:'Subscript',superscript:'Superscript',horizontalrule:'Masukkan Garisan Membujur',pagebreak:'Insert Page Break for Printing',pagebreakAlt:'Page Break',unlink:'Buang Sambungan',undo:'Batalkan',redo:'Ulangkan',common:{browseServer:'Browse Server',url:'URL',protocol:'Protokol',upload:'Muat Naik',uploadSubmit:'Hantar ke Server',image:'Gambar',flash:'Flash',form:'Borang',checkbox:'Checkbox',radio:'Butang Radio',textField:'Text Field',textarea:'Textarea',hiddenField:'Field Tersembunyi',button:'Butang',select:'Field Pilihan',imageButton:'Butang Bergambar',notSet:'<tidak di set>',id:'Id',name:'Nama',langDir:'Arah Tulisan',langDirLtr:'Kiri ke Kanan (LTR)',langDirRtl:'Kanan ke Kiri (RTL)',langCode:'Kod Bahasa',longDescr:'Butiran Panjang URL',cssClass:'Kelas-kelas Stylesheet',advisoryTitle:'Tajuk Makluman',cssStyle:'Stail',ok:'OK',cancel:'Batal',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Advanced',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Lebar',height:'Tinggi',align:'Jajaran',alignLeft:'Kiri',alignRight:'Kanan',alignCenter:'Tengah',alignTop:'Atas',alignMiddle:'Pertengahan',alignBottom:'Bawah',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Masukkan Huruf Istimewa',title:'Sila pilih huruf istimewa',options:'Special Character Options'},link:{toolbar:'Masukkan/Sunting Sambungan',other:'<lain>',menu:'Sunting Sambungan',title:'Sambungan',info:'Butiran Sambungan',target:'Sasaran',upload:'Muat Naik',advanced:'Advanced',type:'Jenis Sambungan',toUrl:'URL',toAnchor:'Pautan dalam muka surat ini',toEmail:'E-Mail',targetFrame:'<bingkai>',targetPopup:'<tetingkap popup>',targetFrameName:'Nama Bingkai Sasaran',targetPopupName:'Nama Tetingkap Popup',popupFeatures:'Ciri Tetingkap Popup',popupResizable:'Resizable',popupStatusBar:'Bar Status',popupLocationBar:'Bar Lokasi',popupToolbar:'Toolbar',popupMenuBar:'Bar Menu',popupFullScreen:'Skrin Penuh (IE)',popupScrollBars:'Bar-bar skrol',popupDependent:'Bergantungan (Netscape)',popupLeft:'Posisi Kiri',popupTop:'Posisi Atas',id:'Id',langDir:'Arah Tulisan',langDirLTR:'Kiri ke Kanan (LTR)',langDirRTL:'Kanan ke Kiri (RTL)',acccessKey:'Kunci Akses',name:'Nama',langCode:'Arah Tulisan',tabIndex:'Indeks Tab ',advisoryTitle:'Tajuk Makluman',advisoryContentType:'Jenis Kandungan Makluman',cssClasses:'Kelas-kelas Stylesheet',charset:'Linked Resource Charset',styles:'Stail',rel:'Relationship',selectAnchor:'Sila pilih pautan',anchorName:'dengan menggunakan nama pautan',anchorId:'dengan menggunakan ID elemen',emailAddress:'Alamat E-Mail',emailSubject:'Subjek Mesej',emailBody:'Isi Kandungan Mesej',noAnchors:'(Tiada pautan terdapat dalam dokumen ini)',noUrl:'Sila taip sambungan URL',noEmail:'Sila taip alamat e-mail'},anchor:{toolbar:'Masukkan/Sunting Pautan',menu:'Ciri-ciri Pautan',title:'Ciri-ciri Pautan',name:'Nama Pautan',errorName:'Sila taip nama pautan',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Cari',replace:'Ganti',findWhat:'Perkataan yang dicari:',replaceWith:'Diganti dengan:',notFoundMsg:'Text yang dicari tidak dijumpai.',findOptions:'Find Options',matchCase:'Padanan case huruf',matchWord:'Padana Keseluruhan perkataan',matchCyclic:'Match cyclic',replaceAll:'Ganti semua',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Jadual',title:'Ciri-ciri Jadual',menu:'Ciri-ciri Jadual',deleteTable:'Delete Table',rows:'Barisan',columns:'Jaluran',border:'Saiz Border',widthPx:'piksel-piksel',widthPc:'peratus',widthUnit:'width unit',cellSpace:'Ruangan Antara Sel',cellPad:'Tambahan Ruang Sel',caption:'Keterangan',summary:'Summary',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Cell',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Buangkan Sel-sel',merge:'Cantumkan Sel-sel',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Row',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Buangkan Baris'},column:{menu:'Column',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Buangkan Lajur'}},button:{title:'Ciri-ciri Butang',text:'Teks (Nilai)',type:'Jenis',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Ciri-ciri Checkbox',radioTitle:'Ciri-ciri Butang Radio',value:'Nilai',selected:'Dipilih'},form:{title:'Ciri-ciri Borang',menu:'Ciri-ciri Borang',action:'Tindakan borang',method:'Cara borang dihantar',encoding:'Encoding'},select:{title:'Ciri-ciri Selection Field',selectInfo:'Select Info',opAvail:'Pilihan sediada',value:'Nilai',size:'Saiz',lines:'garisan',chkMulti:'Benarkan pilihan pelbagai',opText:'Teks',opValue:'Nilai',btnAdd:'Tambah Pilihan',btnModify:'Ubah Pilihan',btnUp:'Naik ke atas',btnDown:'Turun ke bawah',btnSetValue:'Set sebagai nilai terpilih',btnDelete:'Padam'},textarea:{title:'Ciri-ciri Textarea',cols:'Lajur',rows:'Baris'},textfield:{title:'Ciri-ciri Text Field',name:'Nama',value:'Nilai',charWidth:'Lebar isian',maxChars:'Isian Maksimum',type:'Jenis',typeText:'Teks',typePass:'Kata Laluan'},hidden:{title:'Ciri-ciri Field Tersembunyi',name:'Nama',value:'Nilai'},image:{title:'Ciri-ciri Imej',titleButton:'Ciri-ciri Butang Bergambar',menu:'Ciri-ciri Imej',infoTab:'Info Imej',btnUpload:'Hantar ke Server',upload:'Muat Naik',alt:'Text Alternatif',lockRatio:'Tetapkan Nisbah',resetSize:'Saiz Set Semula',border:'Border',hSpace:'Ruang Melintang',vSpace:'Ruang Menegak',alertUrl:'Sila taip URL untuk fail gambar',linkTab:'Sambungan',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Flash Properties',propertiesTab:'Properties',title:'Flash Properties',chkPlay:'Auto Play',chkLoop:'Loop',chkMenu:'Enable Flash Menu',chkFull:'Allow Fullscreen',scale:'Scale',scaleAll:'Show all',scaleNoBorder:'No Border',scaleFit:'Exact Fit',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Bawah Mutlak',alignAbsMiddle:'Pertengahan Mutlak',alignBaseline:'Garis Dasar',alignTextTop:'Atas Text',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Warna Latarbelakang',hSpace:'Ruang Melintang',vSpace:'Ruang Menegak',validateSrc:'Sila taip sambungan URL',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Semak Ejaan',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Tidak terdapat didalam kamus',changeTo:'Tukarkan kepada',btnIgnore:'Biar',btnIgnoreAll:'Biarkan semua',btnReplace:'Ganti',btnReplaceAll:'Gantikan Semua',btnUndo:'Batalkan',noSuggestions:'- Tiada cadangan -',progress:'Pemeriksaan ejaan sedang diproses...',noMispell:'Pemeriksaan ejaan siap: Tiada salah ejaan',noChanges:'Pemeriksaan ejaan siap: Tiada perkataan diubah',oneChange:'Pemeriksaan ejaan siap: Satu perkataan telah diubah',manyChanges:'Pemeriksaan ejaan siap: %1 perkataan diubah',ieSpellDownload:'Pemeriksa ejaan tidak dipasang. Adakah anda mahu muat turun sekarang?'},smiley:{toolbar:'Smiley',title:'Masukkan Smiley',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Senarai bernombor',bulletedlist:'Senarai tidak bernombor',indent:'Tambahkan Inden',outdent:'Kurangkan Inden',justify:{left:'Jajaran Kiri',center:'Jajaran Tengah',right:'Jajaran Kanan',block:'Jajaran Blok'},blockquote:'Block Quote',clipboard:{title:'Tampal',cutError:'Keselamatan perisian browser anda tidak membenarkan operasi suntingan text/imej. Sila gunakan papan kekunci (Ctrl/Cmd+X).',copyError:'Keselamatan perisian browser anda tidak membenarkan operasi salinan text/imej. Sila gunakan papan kekunci (Ctrl/Cmd+C).',pasteMsg:'Please paste inside the following box using the keyboard (<strong>Ctrl/Cmd+V</strong>) and hit OK',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Tampal dari Word',title:'Tampal dari Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Tampal sebagai text biasa',title:'Tampal sebagai text biasa'},templates:{button:'Templat',title:'Templat Kandungan',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Sila pilih templat untuk dibuka oleh editor<br>(kandungan sebenar akan hilang):',emptyListMsg:'(Tiada Templat Disimpan)'},showBlocks:'Show Blocks',stylesCombo:{label:'Stail',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Format',panelTitle:'Format',tag_p:'Normal',tag_pre:'Telah Diformat',tag_address:'Alamat',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Perenggan (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Font',voiceLabel:'Font',panelTitle:'Font'},fontSize:{label:'Saiz',voiceLabel:'Font Size',panelTitle:'Saiz'},colorButton:{textColorTitle:'Warna Text',bgColorTitle:'Warna Latarbelakang',panelTitle:'Colors',auto:'Otomatik',more:'Warna lain-lain...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Ciri-ciri dokumen',title:'Ciri-ciri dokumen',design:'Design',meta:'Data Meta',chooseColor:'Choose',other:'<lain>',docTitle:'Tajuk Muka Surat',charset:'Enkod Set Huruf',charsetOther:'Enkod Set Huruf yang Lain',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Jenis Kepala Dokumen',docTypeOther:'Jenis Kepala Dokumen yang Lain',xhtmlDec:'Masukkan pemula kod XHTML',bgColor:'Warna Latarbelakang',bgImage:'URL Gambar Latarbelakang',bgFixed:'Imej Latarbelakang tanpa Skrol',txtColor:'Warna Text',margin:'Margin Muka Surat',marginTop:'Atas',marginLeft:'Kiri',marginRight:'Kanan',marginBottom:'Bawah',metaKeywords:'Kata Kunci Indeks Dokumen (dipisahkan oleh koma)',metaDescription:'Keterangan Dokumen',metaAuthor:'Penulis',metaCopyright:'Hakcipta',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/nb.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/nb.js
index 0c335ff..ae1539e 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/nb.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/nb.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.nb={dir:'ltr',editorTitle:'Rikteksteditor, %1',editorHelp:'Trykk ALT 0 for hjelp',toolbars:'Verktøylinjer for editor',editor:'Rikteksteditor',source:'Kilde',newPage:'Ny side',save:'Lagre',preview:'Forhåndsvis',cut:'Klipp ut',copy:'Kopier',paste:'Lim inn',print:'Skriv ut',underline:'Understreking',bold:'Fet',italic:'Kursiv',selectAll:'Merk alt',removeFormat:'Fjern formatering',strike:'Gjennomstreking',subscript:'Senket skrift',superscript:'Hevet skrift',horizontalrule:'Sett inn horisontal linje',pagebreak:'Sett inn sideskift for utskrift',pagebreakAlt:'Sideskift',unlink:'Fjern lenke',undo:'Angre',redo:'Gjør om',common:{browseServer:'Bla igjennom server',url:'URL',protocol:'Protokoll',upload:'Last opp',uploadSubmit:'Send det til serveren',image:'Bilde',flash:'Flash',form:'Skjema',checkbox:'Avmerkingsboks',radio:'Alternativknapp',textField:'Tekstboks',textarea:'Tekstområde',hiddenField:'Skjult felt',button:'Knapp',select:'Rullegardinliste',imageButton:'Bildeknapp',notSet:'<ikke satt>',id:'Id',name:'Navn',langDir:'Språkretning',langDirLtr:'Venstre til høyre (VTH)',langDirRtl:'Høyre til venstre (HTV)',langCode:'Språkkode',longDescr:'Utvidet beskrivelse',cssClass:'Stilarkklasser',advisoryTitle:'Tittel',cssStyle:'Stil',ok:'OK',cancel:'Avbryt',close:'Lukk',preview:'Forhåndsvis',generalTab:'Generelt',advancedTab:'Avansert',validateNumberFailed:'Denne verdien er ikke et tall.',confirmNewPage:'Alle ulagrede endringer som er gjort i dette innholdet vil bli tapt. Er du sikker på at du vil laste en ny side?',confirmCancel:'Noen av valgene har blitt endret. Er du sikker på at du vil lukke dialogen?',options:'Valg',target:'Mål',targetNew:'Nytt vindu (_blank)',targetTop:'Hele vindu (_top)',targetSelf:'Samme vindu (_self)',targetParent:'Foreldrevindu (_parent)',langDirLTR:'Venstre til høyre (VTH)',langDirRTL:'Høyre til venstre (HTV)',styles:'Stil',cssClasses:'Stilarkklasser',width:'Bredde',height:'Høyde',align:'Juster',alignLeft:'Venstre',alignRight:'Høyre',alignCenter:'Midtjuster',alignTop:'Topp',alignMiddle:'Midten',alignBottom:'Bunn',invalidHeight:'Høyde må være et tall.',invalidWidth:'Bredde må være et tall.',invalidCssLength:'Den angitte verdien for feltet "%1" må være et positivt tall med eller uten en gyldig CSS-målingsenhet (px, %, in, cm, mm, em, ex, pt, eller pc).',invalidHtmlLength:'Den angitte verdien for feltet "%1" må være et positivt tall med eller uten en gyldig HTML-målingsenhet (px eller %).',invalidInlineStyle:'Verdi angitt for inline stil må bestå av en eller flere sett med formatet "navn : verdi", separert med semikolon',cssLengthTooltip:'Skriv inn et tall for en piksel-verdi eller et tall med en gyldig CSS-enhet (px, %, in, cm, mm, em, ex, pt, eller pc).',unavailable:'%1<span class="cke_accessibility">, utilgjenglig</span>'},contextmenu:{options:'Alternativer for høyreklikkmeny'},specialChar:{toolbar:'Sett inn spesialtegn',title:'Velg spesialtegn',options:'Alternativer for spesialtegn'},link:{toolbar:'Sett inn/Rediger lenke',other:'<annen>',menu:'Rediger lenke',title:'Lenke',info:'Lenkeinfo',target:'Mål',upload:'Last opp',advanced:'Avansert',type:'Lenketype',toUrl:'URL',toAnchor:'Lenke til anker i teksten',toEmail:'E-post',targetFrame:'<ramme>',targetPopup:'<popup-vindu>',targetFrameName:'Målramme',targetPopupName:'Navn på popup-vindu',popupFeatures:'Egenskaper for popup-vindu',popupResizable:'Skalerbar',popupStatusBar:'Statuslinje',popupLocationBar:'Adresselinje',popupToolbar:'Verktøylinje',popupMenuBar:'Menylinje',popupFullScreen:'Fullskjerm (IE)',popupScrollBars:'Scrollbar',popupDependent:'Avhenging (Netscape)',popupLeft:'Venstre posisjon',popupTop:'Topp-posisjon',id:'Id',langDir:'Språkretning',langDirLTR:'Venstre til høyre (VTH)',langDirRTL:'Høyre til venstre (HTV)',acccessKey:'Aksessknapp',name:'Navn',langCode:'Språkkode',tabIndex:'Tabindeks',advisoryTitle:'Tittel',advisoryContentType:'Type',cssClasses:'Stilarkklasser',charset:'Lenket tegnsett',styles:'Stil',rel:'Relasjon (rel)',selectAnchor:'Velg et anker',anchorName:'Anker etter navn',anchorId:'Element etter ID',emailAddress:'E-postadresse',emailSubject:'Meldingsemne',emailBody:'Melding',noAnchors:'(Ingen anker i dokumentet)',noUrl:'Vennligst skriv inn lenkens URL',noEmail:'Vennligst skriv inn e-postadressen'},anchor:{toolbar:'Sett inn/Rediger anker',menu:'Egenskaper for anker',title:'Egenskaper for anker',name:'Ankernavn',errorName:'Vennligst skriv inn ankernavnet',remove:'Fjern anker'},list:{numberedTitle:'Egenskaper for nummerert liste',bulletedTitle:'Egenskaper for punktmerket liste',type:'Type',start:'Start',validateStartNumber:'Starten på listen må være et heltall.',circle:'Sirkel',disc:'Disk',square:'Firkant',none:'Ingen',notset:'<ikke satt>',armenian:'Armensk nummerering',georgian:'Georgisk nummerering (an, ban, gan, osv.)',lowerRoman:'Romertall, små (i, ii, iii, iv, v, osv.)',upperRoman:'Romertall, store (I, II, III, IV, V, osv.)',lowerAlpha:'Alfabetisk, små (a, b, c, d, e, osv.)',upperAlpha:'Alfabetisk, store (A, B, C, D, E, osv.)',lowerGreek:'Gresk, små (alpha, beta, gamma, osv.)',decimal:'Tall (1, 2, 3, osv.)',decimalLeadingZero:'Tall, med førstesiffer null (01, 02, 03, osv.)'},findAndReplace:{title:'Søk og erstatt',find:'Søk',replace:'Erstatt',findWhat:'Søk etter:',replaceWith:'Erstatt med:',notFoundMsg:'Fant ikke søketeksten.',findOptions:'Søkealternativer',matchCase:'Skill mellom store og små bokstaver',matchWord:'Bare hele ord',matchCyclic:'Søk i hele dokumentet',replaceAll:'Erstatt alle',replaceSuccessMsg:'%1 tilfelle(r) erstattet.'},table:{toolbar:'Tabell',title:'Egenskaper for tabell',menu:'Egenskaper for tabell',deleteTable:'Slett tabell',rows:'Rader',columns:'Kolonner',border:'Rammestørrelse',widthPx:'piksler',widthPc:'prosent',widthUnit:'Bredde-enhet',cellSpace:'Cellemarg',cellPad:'Cellepolstring',caption:'Tittel',summary:'Sammendrag',headers:'Overskrifter',headersNone:'Ingen',headersColumn:'Første kolonne',headersRow:'Første rad',headersBoth:'Begge',invalidRows:'Antall rader må være et tall større enn 0.',invalidCols:'Antall kolonner må være et tall større enn 0.',invalidBorder:'Rammestørrelse må være et tall.',invalidWidth:'Tabellbredde må være et tall.',invalidHeight:'Tabellhøyde må være et tall.',invalidCellSpacing:'Cellemarg må være et positivt tall.',invalidCellPadding:'Cellepolstring må være et positivt tall.',cell:{menu:'Celle',insertBefore:'Sett inn celle før',insertAfter:'Sett inn celle etter',deleteCell:'Slett celler',merge:'Slå sammen celler',mergeRight:'Slå sammen høyre',mergeDown:'Slå sammen ned',splitHorizontal:'Del celle horisontalt',splitVertical:'Del celle vertikalt',title:'Celleegenskaper',cellType:'Celletype',rowSpan:'Radspenn',colSpan:'Kolonnespenn',wordWrap:'Tekstbrytning',hAlign:'Horisontal justering',vAlign:'Vertikal justering',alignBaseline:'Grunnlinje',bgColor:'Bakgrunnsfarge',borderColor:'Rammefarge',data:'Data',header:'Overskrift',yes:'Ja',no:'Nei',invalidWidth:'Cellebredde må være et tall.',invalidHeight:'Cellehøyde må være et tall.',invalidRowSpan:'Radspenn må være et heltall.',invalidColSpan:'Kolonnespenn må være et heltall.',chooseColor:'Velg'},row:{menu:'Rader',insertBefore:'Sett inn rad før',insertAfter:'Sett inn rad etter',deleteRow:'Slett rader'},column:{menu:'Kolonne',insertBefore:'Sett inn kolonne før',insertAfter:'Sett inn kolonne etter',deleteColumn:'Slett kolonner'}},button:{title:'Egenskaper for knapp',text:'Tekst (verdi)',type:'Type',typeBtn:'Knapp',typeSbm:'Send',typeRst:'Nullstill'},checkboxAndRadio:{checkboxTitle:'Egenskaper for avmerkingsboks',radioTitle:'Egenskaper for alternativknapp',value:'Verdi',selected:'Valgt'},form:{title:'Egenskaper for skjema',menu:'Egenskaper for skjema',action:'Handling',method:'Metode',encoding:'Encoding'},select:{title:'Egenskaper for rullegardinliste',selectInfo:'Info',opAvail:'Tilgjenglige alternativer',value:'Verdi',size:'Størrelse',lines:'Linjer',chkMulti:'Tillat flervalg',opText:'Tekst',opValue:'Verdi',btnAdd:'Legg til',btnModify:'Endre',btnUp:'Opp',btnDown:'Ned',btnSetValue:'Sett som valgt',btnDelete:'Slett'},textarea:{title:'Egenskaper for tekstområde',cols:'Kolonner',rows:'Rader'},textfield:{title:'Egenskaper for tekstfelt',name:'Navn',value:'Verdi',charWidth:'Tegnbredde',maxChars:'Maks antall tegn',type:'Type',typeText:'Tekst',typePass:'Passord'},hidden:{title:'Egenskaper for skjult felt',name:'Navn',value:'Verdi'},image:{title:'Bildeegenskaper',titleButton:'Egenskaper for bildeknapp',menu:'Bildeegenskaper',infoTab:'Bildeinformasjon',btnUpload:'Send det til serveren',upload:'Last opp',alt:'Alternativ tekst',lockRatio:'Lås forhold',resetSize:'Tilbakestill størrelse',border:'Ramme',hSpace:'HMarg',vSpace:'VMarg',alertUrl:'Vennligst skriv bilde-urlen',linkTab:'Lenke',button2Img:'Vil du endre den valgte bildeknappen til et vanlig bilde?',img2Button:'Vil du endre det valgte bildet til en bildeknapp?',urlMissing:'Bildets adresse mangler.',validateBorder:'Ramme må være et heltall.',validateHSpace:'HMarg må være et heltall.',validateVSpace:'VMarg må være et heltall.'},flash:{properties:'Egenskaper for Flash-objekt',propertiesTab:'Egenskaper',title:'Flash-egenskaper',chkPlay:'Autospill',chkLoop:'Loop',chkMenu:'Slå på Flash-meny',chkFull:'Tillat fullskjerm',scale:'Skaler',scaleAll:'Vis alt',scaleNoBorder:'Ingen ramme',scaleFit:'Skaler til å passe',access:'Scripttilgang',accessAlways:'Alltid',accessSameDomain:'Samme domene',accessNever:'Aldri',alignAbsBottom:'Abs bunn',alignAbsMiddle:'Abs midten',alignBaseline:'Bunnlinje',alignTextTop:'Tekst topp',quality:'Kvalitet',qualityBest:'Best',qualityHigh:'Høy',qualityAutoHigh:'Auto høy',qualityMedium:'Medium',qualityAutoLow:'Auto lav',qualityLow:'Lav',windowModeWindow:'Vindu',windowModeOpaque:'Opaque',windowModeTransparent:'Gjennomsiktig',windowMode:'Vindumodus',flashvars:'Variabler for flash',bgcolor:'Bakgrunnsfarge',hSpace:'HMarg',vSpace:'VMarg',validateSrc:'Vennligst skriv inn lenkens url.',validateHSpace:'HMarg må være et tall.',validateVSpace:'VMarg må være et tall.'},spellCheck:{toolbar:'Stavekontroll',title:'Stavekontroll',notAvailable:'Beklager, tjenesten er utilgjenglig nå.',errorLoading:'Feil under lasting av applikasjonstjenestetjener: %s.',notInDic:'Ikke i ordboken',changeTo:'Endre til',btnIgnore:'Ignorer',btnIgnoreAll:'Ignorer alle',btnReplace:'Erstatt',btnReplaceAll:'Erstatt alle',btnUndo:'Angre',noSuggestions:'- Ingen forslag -',progress:'Stavekontroll pågår...',noMispell:'Stavekontroll fullført: ingen feilstavinger funnet',noChanges:'Stavekontroll fullført: ingen ord endret',oneChange:'Stavekontroll fullført: Ett ord endret',manyChanges:'Stavekontroll fullført: %1 ord endret',ieSpellDownload:'Stavekontroll er ikke installert. Vil du laste den ned nå?'},smiley:{toolbar:'Smil',title:'Sett inn smil',options:'Alternativer for smil'},elementsPath:{eleLabel:'Element-sti',eleTitle:'%1 element'},numberedlist:'Legg til/Fjern nummerert liste',bulletedlist:'Legg til/Fjern punktmerket liste',indent:'Øk innrykk',outdent:'Reduser innrykk',justify:{left:'Venstrejuster',center:'Midtstill',right:'Høyrejuster',block:'Blokkjuster'},blockquote:'Sitatblokk',clipboard:{title:'Lim inn',cutError:'Din nettlesers sikkerhetsinstillinger tillater ikke automatisk utklipping av tekst. Vennligst bruk snarveien (Ctrl/Cmd+X).',copyError:'Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk snarveien (Ctrl/Cmd+C).',pasteMsg:'Vennligst lim inn i følgende boks med tastaturet (<STRONG>Ctrl/Cmd+V</STRONG>) og trykk <STRONG>OK</STRONG>.',securityMsg:'Din nettlesers sikkerhetsinstillinger gir ikke redigeringsverktøyet direkte tilgang til utklippstavlen. Du må derfor lime det inn på nytt i dette vinduet.',pasteArea:'Innlimingsområde'},pastefromword:{confirmCleanup:'Teksten du limer inn ser ut til å være kopiert fra Word. Vil du renske den før du limer den inn?',toolbar:'Lim inn fra Word',title:'Lim inn fra Word',error:'Det var ikke mulig å renske den innlimte teksten på grunn av en intern feil'},pasteText:{button:'Lim inn som ren tekst',title:'Lim inn som ren tekst'},templates:{button:'Maler',title:'Innholdsmaler',options:'Alternativer for mal',insertOption:'Erstatt gjeldende innhold',selectPromptMsg:'Velg malen du vil åpne i redigeringsverktøyet:',emptyListMsg:'(Ingen maler definert)'},showBlocks:'Vis blokker',stylesCombo:{label:'Stil',panelTitle:'Stilformater',panelTitle1:'Blokkstiler',panelTitle2:'Inlinestiler',panelTitle3:'Objektstiler'},format:{label:'Format',panelTitle:'Avsnittsformat',tag_p:'Normal',tag_pre:'Formatert',tag_address:'Adresse',tag_h1:'Overskrift 1',tag_h2:'Overskrift 2',tag_h3:'Overskrift 3',tag_h4:'Overskrift 4',tag_h5:'Overskrift 5',tag_h6:'Overskrift 6',tag_div:'Normal (DIV)'},div:{title:'Sett inn Div Container',toolbar:'Sett inn Div Container',cssClassInputLabel:'Stilark-klasser',styleSelectLabel:'Stil',IdInputLabel:'Id',languageCodeInputLabel:' Språkkode',inlineStyleInputLabel:'Inlinestiler',advisoryTitleInputLabel:'Tittel',langDirLabel:'Språkretning',langDirLTRLabel:'Venstre til høyre (VTH)',langDirRTLLabel:'Høyre til venstre (HTV)',edit:'Rediger Div',remove:'Fjern Div'},iframe:{title:'Egenskaper for IFrame',toolbar:'IFrame',noUrl:'Vennligst skriv inn URL for iframe',scrolling:'Aktiver scrollefelt',border:'Viss ramme rundt iframe'},font:{label:'Skrift',voiceLabel:'Font',panelTitle:'Skrift'},fontSize:{label:'Størrelse',voiceLabel:'Font Størrelse',panelTitle:'Størrelse'},colorButton:{textColorTitle:'Tekstfarge',bgColorTitle:'Bakgrunnsfarge',panelTitle:'Farger',auto:'Automatisk',more:'Flere farger...'},colors:{'000':'Svart',800000:'Rødbrun','8B4513':'Salbrun','2F4F4F':'Grønnsvart','008080':'Blågrønn','000080':'Marineblått','4B0082':'Indigo',696969:'Mørk grå',B22222:'Mørkerød',A52A2A:'Brun',DAA520:'Lys brun','006400':'Mørk grønn','40E0D0':'Turkis','0000CD':'Medium blå',800080:'Purpur',808080:'Grå',F00:'Rød',FF8C00:'Mørk oransje',FFD700:'Gull','008000':'Grønn','0FF':'Cyan','00F':'Blå',EE82EE:'Fiolett',A9A9A9:'Svak grå',FFA07A:'Rosa-oransje',FFA500:'Oransje',FFFF00:'Gul','00FF00':'Lime',AFEEEE:'Svak turkis',ADD8E6:'Lys Blå',DDA0DD:'Plomme',D3D3D3:'Lys grå',FFF0F5:'Svak lavendelrosa',FAEBD7:'Antikk-hvit',FFFFE0:'Lys gul',F0FFF0:'Honningmelon',F0FFFF:'Svakt asurblått',F0F8FF:'Svak cyan',E6E6FA:'Lavendel',FFF:'Hvit'},scayt:{title:'Stavekontroll mens du skriver',opera_title:'Ikke støttet av Opera',enable:'Slå på SCAYT',disable:'Slå av SCAYT',about:'Om SCAYT',toggle:'Veksle SCAYT',options:'Valg',langs:'Språk',moreSuggestions:'Flere forslag',ignore:'Ignorer',ignoreAll:'Ignorer Alle',addWord:'Legg til ord',emptyDic:'Ordboknavn bør ikke være tom.',optionsTab:'Valg',allCaps:'Ikke kontroller ord med kun store bokstaver',ignoreDomainNames:'Ikke kontroller domenenavn',mixedCase:'Ikke kontroller ord med blandet små og store bokstaver',mixedWithDigits:'Ikke kontroller ord som inneholder tall',languagesTab:'Språk',dictionariesTab:'Ordbøker',dic_field_name:'Ordboknavn',dic_create:'Opprett',dic_restore:'Gjenopprett',dic_delete:'Slett',dic_rename:'Gi nytt navn',dic_info:'Brukerordboken lagres først i en informasjonskapsel på din maskin, men det er en begrensning på hvor mye som kan lagres her. Når ordboken blir for stor til å lagres i en informasjonskapsel, vil vi i stedet lagre ordboken på vår server. For å lagre din personlige ordbok på vår server, burde du velge et navn for ordboken din. Hvis du allerede har lagret en ordbok, vennligst skriv inn ordbokens navn og klikk på Gjenopprett-knappen.',aboutTab:'Om'},about:{title:'Om CKEditor',dlgTitle:'Om CKEditor',help:'Se $1 for hjelp.',userGuide:'CKEditors brukerveiledning',moreInfo:'For lisensieringsinformasjon, vennligst besøk vårt nettsted:',copy:'Copyright © $1. Alle rettigheter reservert.'},maximize:'Maksimer',minimize:'Minimer',fakeobjects:{anchor:'Anker',flash:'Flash-animasjon',iframe:'IFrame',hiddenfield:'Skjult felt',unknown:'Ukjent objekt'},resize:'Dra for å skalere',colordialog:{title:'Velg farge',options:'Alternativer for farge',highlight:'Merk',selected:'Valgt',clear:'Tøm'},toolbarCollapse:'Skjul verktøylinje',toolbarExpand:'Vis verktøylinje',toolbarGroups:{document:'Dokument',clipboard:'Utklippstavle/Angre',editing:'Redigering',forms:'Skjema',basicstyles:'Basisstiler',paragraph:'Avsnitt',links:'Lenker',insert:'Innsetting',styles:'Stiler',colors:'Farger',tools:'Verktøy'},bidi:{ltr:'Tekstretning fra venstre til høyre',rtl:'Tekstretning fra høyre til venstre'},docprops:{label:'Dokumentegenskaper',title:'Dokumentegenskaper',design:'Design',meta:'Meta-data',chooseColor:'Velg',other:'<annen>',docTitle:'Sidetittel',charset:'Tegnsett',charsetOther:'Annet tegnsett',charsetASCII:'ASCII',charsetCE:'Sentraleuropeisk',charsetCT:'Tradisonell kinesisk(Big5)',charsetCR:'Kyrillisk',charsetGR:'Gresk',charsetJP:'Japansk',charsetKR:'Koreansk',charsetTR:'Tyrkisk',charsetUN:'Unicode (UTF-8)',charsetWE:'Vesteuropeisk',docType:'Dokumenttype header',docTypeOther:'Annet dokumenttype header',xhtmlDec:'Inkluder XHTML-deklarasjon',bgColor:'Bakgrunnsfarge',bgImage:'URL for bakgrunnsbilde',bgFixed:'Lås bakgrunnsbilde',txtColor:'Tekstfarge',margin:'Sidemargin',marginTop:'Topp',marginLeft:'Venstre',marginRight:'Høyre',marginBottom:'Bunn',metaKeywords:'Dokument nøkkelord (kommaseparert)',metaDescription:'Dokumentbeskrivelse',metaAuthor:'Forfatter',metaCopyright:'Kopirett',previewHtml:'<p>Dette er en <strong>eksempeltekst</strong>. Du bruker <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.nb={dir:'ltr',editorTitle:'Rikteksteditor, %1',editorHelp:'Trykk ALT 0 for hjelp',toolbars:'Verktøylinjer for editor',editor:'Rikteksteditor',source:'Kilde',newPage:'Ny side',save:'Lagre',preview:'Forhåndsvis',cut:'Klipp ut',copy:'Kopier',paste:'Lim inn',print:'Skriv ut',underline:'Understreking',bold:'Fet',italic:'Kursiv',selectAll:'Merk alt',removeFormat:'Fjern formatering',strike:'Gjennomstreking',subscript:'Senket skrift',superscript:'Hevet skrift',horizontalrule:'Sett inn horisontal linje',pagebreak:'Sett inn sideskift for utskrift',pagebreakAlt:'Sideskift',unlink:'Fjern lenke',undo:'Angre',redo:'Gjør om',common:{browseServer:'Bla igjennom server',url:'URL',protocol:'Protokoll',upload:'Last opp',uploadSubmit:'Send det til serveren',image:'Bilde',flash:'Flash',form:'Skjema',checkbox:'Avmerkingsboks',radio:'Alternativknapp',textField:'Tekstboks',textarea:'Tekstområde',hiddenField:'Skjult felt',button:'Knapp',select:'Rullegardinliste',imageButton:'Bildeknapp',notSet:'<ikke satt>',id:'Id',name:'Navn',langDir:'Språkretning',langDirLtr:'Venstre til høyre (VTH)',langDirRtl:'Høyre til venstre (HTV)',langCode:'Språkkode',longDescr:'Utvidet beskrivelse',cssClass:'Stilarkklasser',advisoryTitle:'Tittel',cssStyle:'Stil',ok:'OK',cancel:'Avbryt',close:'Lukk',preview:'Forhåndsvis',generalTab:'Generelt',advancedTab:'Avansert',validateNumberFailed:'Denne verdien er ikke et tall.',confirmNewPage:'Alle ulagrede endringer som er gjort i dette innholdet vil bli tapt. Er du sikker på at du vil laste en ny side?',confirmCancel:'Noen av valgene har blitt endret. Er du sikker på at du vil lukke dialogen?',options:'Valg',target:'Mål',targetNew:'Nytt vindu (_blank)',targetTop:'Hele vindu (_top)',targetSelf:'Samme vindu (_self)',targetParent:'Foreldrevindu (_parent)',langDirLTR:'Venstre til høyre (VTH)',langDirRTL:'Høyre til venstre (HTV)',styles:'Stil',cssClasses:'Stilarkklasser',width:'Bredde',height:'Høyde',align:'Juster',alignLeft:'Venstre',alignRight:'Høyre',alignCenter:'Midtjuster',alignTop:'Topp',alignMiddle:'Midten',alignBottom:'Bunn',invalidHeight:'Høyde må være et tall.',invalidWidth:'Bredde må være et tall.',invalidCssLength:'Den angitte verdien for feltet "%1" må være et positivt tall med eller uten en gyldig CSS-målingsenhet (px, %, in, cm, mm, em, ex, pt, eller pc).',invalidHtmlLength:'Den angitte verdien for feltet "%1" må være et positivt tall med eller uten en gyldig HTML-målingsenhet (px eller %).',invalidInlineStyle:'Verdi angitt for inline stil må bestå av en eller flere sett med formatet "navn : verdi", separert med semikolon',cssLengthTooltip:'Skriv inn et tall for en piksel-verdi eller et tall med en gyldig CSS-enhet (px, %, in, cm, mm, em, ex, pt, eller pc).',unavailable:'%1<span class="cke_accessibility">, utilgjenglig</span>'},contextmenu:{options:'Alternativer for høyreklikkmeny'},specialChar:{toolbar:'Sett inn spesialtegn',title:'Velg spesialtegn',options:'Alternativer for spesialtegn'},link:{toolbar:'Sett inn/Rediger lenke',other:'<annen>',menu:'Rediger lenke',title:'Lenke',info:'Lenkeinfo',target:'Mål',upload:'Last opp',advanced:'Avansert',type:'Lenketype',toUrl:'URL',toAnchor:'Lenke til anker i teksten',toEmail:'E-post',targetFrame:'<ramme>',targetPopup:'<popup-vindu>',targetFrameName:'Målramme',targetPopupName:'Navn på popup-vindu',popupFeatures:'Egenskaper for popup-vindu',popupResizable:'Skalerbar',popupStatusBar:'Statuslinje',popupLocationBar:'Adresselinje',popupToolbar:'Verktøylinje',popupMenuBar:'Menylinje',popupFullScreen:'Fullskjerm (IE)',popupScrollBars:'Scrollbar',popupDependent:'Avhenging (Netscape)',popupLeft:'Venstre posisjon',popupTop:'Topp-posisjon',id:'Id',langDir:'Språkretning',langDirLTR:'Venstre til høyre (VTH)',langDirRTL:'Høyre til venstre (HTV)',acccessKey:'Aksessknapp',name:'Navn',langCode:'Språkkode',tabIndex:'Tabindeks',advisoryTitle:'Tittel',advisoryContentType:'Type',cssClasses:'Stilarkklasser',charset:'Lenket tegnsett',styles:'Stil',rel:'Relasjon (rel)',selectAnchor:'Velg et anker',anchorName:'Anker etter navn',anchorId:'Element etter ID',emailAddress:'E-postadresse',emailSubject:'Meldingsemne',emailBody:'Melding',noAnchors:'(Ingen anker i dokumentet)',noUrl:'Vennligst skriv inn lenkens URL',noEmail:'Vennligst skriv inn e-postadressen'},anchor:{toolbar:'Sett inn/Rediger anker',menu:'Egenskaper for anker',title:'Egenskaper for anker',name:'Ankernavn',errorName:'Vennligst skriv inn ankernavnet',remove:'Fjern anker'},list:{numberedTitle:'Egenskaper for nummerert liste',bulletedTitle:'Egenskaper for punktmerket liste',type:'Type',start:'Start',validateStartNumber:'Starten på listen må være et heltall.',circle:'Sirkel',disc:'Disk',square:'Firkant',none:'Ingen',notset:'<ikke satt>',armenian:'Armensk nummerering',georgian:'Georgisk nummerering (an, ban, gan, osv.)',lowerRoman:'Romertall, små (i, ii, iii, iv, v, osv.)',upperRoman:'Romertall, store (I, II, III, IV, V, osv.)',lowerAlpha:'Alfabetisk, små (a, b, c, d, e, osv.)',upperAlpha:'Alfabetisk, store (A, B, C, D, E, osv.)',lowerGreek:'Gresk, små (alpha, beta, gamma, osv.)',decimal:'Tall (1, 2, 3, osv.)',decimalLeadingZero:'Tall, med førstesiffer null (01, 02, 03, osv.)'},findAndReplace:{title:'Søk og erstatt',find:'Søk',replace:'Erstatt',findWhat:'Søk etter:',replaceWith:'Erstatt med:',notFoundMsg:'Fant ikke søketeksten.',findOptions:'Søkealternativer',matchCase:'Skill mellom store og små bokstaver',matchWord:'Bare hele ord',matchCyclic:'Søk i hele dokumentet',replaceAll:'Erstatt alle',replaceSuccessMsg:'%1 tilfelle(r) erstattet.'},table:{toolbar:'Tabell',title:'Egenskaper for tabell',menu:'Egenskaper for tabell',deleteTable:'Slett tabell',rows:'Rader',columns:'Kolonner',border:'Rammestørrelse',widthPx:'piksler',widthPc:'prosent',widthUnit:'Bredde-enhet',cellSpace:'Cellemarg',cellPad:'Cellepolstring',caption:'Tittel',summary:'Sammendrag',headers:'Overskrifter',headersNone:'Ingen',headersColumn:'Første kolonne',headersRow:'Første rad',headersBoth:'Begge',invalidRows:'Antall rader må være et tall større enn 0.',invalidCols:'Antall kolonner må være et tall større enn 0.',invalidBorder:'Rammestørrelse må være et tall.',invalidWidth:'Tabellbredde må være et tall.',invalidHeight:'Tabellhøyde må være et tall.',invalidCellSpacing:'Cellemarg må være et positivt tall.',invalidCellPadding:'Cellepolstring må være et positivt tall.',cell:{menu:'Celle',insertBefore:'Sett inn celle før',insertAfter:'Sett inn celle etter',deleteCell:'Slett celler',merge:'Slå sammen celler',mergeRight:'Slå sammen høyre',mergeDown:'Slå sammen ned',splitHorizontal:'Del celle horisontalt',splitVertical:'Del celle vertikalt',title:'Celleegenskaper',cellType:'Celletype',rowSpan:'Radspenn',colSpan:'Kolonnespenn',wordWrap:'Tekstbrytning',hAlign:'Horisontal justering',vAlign:'Vertikal justering',alignBaseline:'Grunnlinje',bgColor:'Bakgrunnsfarge',borderColor:'Rammefarge',data:'Data',header:'Overskrift',yes:'Ja',no:'Nei',invalidWidth:'Cellebredde må være et tall.',invalidHeight:'Cellehøyde må være et tall.',invalidRowSpan:'Radspenn må være et heltall.',invalidColSpan:'Kolonnespenn må være et heltall.',chooseColor:'Velg'},row:{menu:'Rader',insertBefore:'Sett inn rad før',insertAfter:'Sett inn rad etter',deleteRow:'Slett rader'},column:{menu:'Kolonne',insertBefore:'Sett inn kolonne før',insertAfter:'Sett inn kolonne etter',deleteColumn:'Slett kolonner'}},button:{title:'Egenskaper for knapp',text:'Tekst (verdi)',type:'Type',typeBtn:'Knapp',typeSbm:'Send',typeRst:'Nullstill'},checkboxAndRadio:{checkboxTitle:'Egenskaper for avmerkingsboks',radioTitle:'Egenskaper for alternativknapp',value:'Verdi',selected:'Valgt'},form:{title:'Egenskaper for skjema',menu:'Egenskaper for skjema',action:'Handling',method:'Metode',encoding:'Encoding'},select:{title:'Egenskaper for rullegardinliste',selectInfo:'Info',opAvail:'Tilgjenglige alternativer',value:'Verdi',size:'Størrelse',lines:'Linjer',chkMulti:'Tillat flervalg',opText:'Tekst',opValue:'Verdi',btnAdd:'Legg til',btnModify:'Endre',btnUp:'Opp',btnDown:'Ned',btnSetValue:'Sett som valgt',btnDelete:'Slett'},textarea:{title:'Egenskaper for tekstområde',cols:'Kolonner',rows:'Rader'},textfield:{title:'Egenskaper for tekstfelt',name:'Navn',value:'Verdi',charWidth:'Tegnbredde',maxChars:'Maks antall tegn',type:'Type',typeText:'Tekst',typePass:'Passord'},hidden:{title:'Egenskaper for skjult felt',name:'Navn',value:'Verdi'},image:{title:'Bildeegenskaper',titleButton:'Egenskaper for bildeknapp',menu:'Bildeegenskaper',infoTab:'Bildeinformasjon',btnUpload:'Send det til serveren',upload:'Last opp',alt:'Alternativ tekst',lockRatio:'Lås forhold',resetSize:'Tilbakestill størrelse',border:'Ramme',hSpace:'HMarg',vSpace:'VMarg',alertUrl:'Vennligst skriv bilde-urlen',linkTab:'Lenke',button2Img:'Vil du endre den valgte bildeknappen til et vanlig bilde?',img2Button:'Vil du endre det valgte bildet til en bildeknapp?',urlMissing:'Bildets adresse mangler.',validateBorder:'Ramme må være et heltall.',validateHSpace:'HMarg må være et heltall.',validateVSpace:'VMarg må være et heltall.'},flash:{properties:'Egenskaper for Flash-objekt',propertiesTab:'Egenskaper',title:'Flash-egenskaper',chkPlay:'Autospill',chkLoop:'Loop',chkMenu:'Slå på Flash-meny',chkFull:'Tillat fullskjerm',scale:'Skaler',scaleAll:'Vis alt',scaleNoBorder:'Ingen ramme',scaleFit:'Skaler til å passe',access:'Scripttilgang',accessAlways:'Alltid',accessSameDomain:'Samme domene',accessNever:'Aldri',alignAbsBottom:'Abs bunn',alignAbsMiddle:'Abs midten',alignBaseline:'Bunnlinje',alignTextTop:'Tekst topp',quality:'Kvalitet',qualityBest:'Best',qualityHigh:'Høy',qualityAutoHigh:'Auto høy',qualityMedium:'Medium',qualityAutoLow:'Auto lav',qualityLow:'Lav',windowModeWindow:'Vindu',windowModeOpaque:'Opaque',windowModeTransparent:'Gjennomsiktig',windowMode:'Vindumodus',flashvars:'Variabler for flash',bgcolor:'Bakgrunnsfarge',hSpace:'HMarg',vSpace:'VMarg',validateSrc:'Vennligst skriv inn lenkens url.',validateHSpace:'HMarg må være et tall.',validateVSpace:'VMarg må være et tall.'},spellCheck:{toolbar:'Stavekontroll',title:'Stavekontroll',notAvailable:'Beklager, tjenesten er utilgjenglig nå.',errorLoading:'Feil under lasting av applikasjonstjenestetjener: %s.',notInDic:'Ikke i ordboken',changeTo:'Endre til',btnIgnore:'Ignorer',btnIgnoreAll:'Ignorer alle',btnReplace:'Erstatt',btnReplaceAll:'Erstatt alle',btnUndo:'Angre',noSuggestions:'- Ingen forslag -',progress:'Stavekontroll pågår...',noMispell:'Stavekontroll fullført: ingen feilstavinger funnet',noChanges:'Stavekontroll fullført: ingen ord endret',oneChange:'Stavekontroll fullført: Ett ord endret',manyChanges:'Stavekontroll fullført: %1 ord endret',ieSpellDownload:'Stavekontroll er ikke installert. Vil du laste den ned nå?'},smiley:{toolbar:'Smil',title:'Sett inn smil',options:'Alternativer for smil'},elementsPath:{eleLabel:'Element-sti',eleTitle:'%1 element'},numberedlist:'Legg til/Fjern nummerert liste',bulletedlist:'Legg til/Fjern punktmerket liste',indent:'Øk innrykk',outdent:'Reduser innrykk',justify:{left:'Venstrejuster',center:'Midtstill',right:'Høyrejuster',block:'Blokkjuster'},blockquote:'Sitatblokk',clipboard:{title:'Lim inn',cutError:'Din nettlesers sikkerhetsinstillinger tillater ikke automatisk utklipping av tekst. Vennligst bruk snarveien (Ctrl/Cmd+X).',copyError:'Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk snarveien (Ctrl/Cmd+C).',pasteMsg:'Vennligst lim inn i følgende boks med tastaturet (<STRONG>Ctrl/Cmd+V</STRONG>) og trykk <STRONG>OK</STRONG>.',securityMsg:'Din nettlesers sikkerhetsinstillinger gir ikke redigeringsverktøyet direkte tilgang til utklippstavlen. Du må derfor lime det inn på nytt i dette vinduet.',pasteArea:'Innlimingsområde'},pastefromword:{confirmCleanup:'Teksten du limer inn ser ut til å være kopiert fra Word. Vil du renske den før du limer den inn?',toolbar:'Lim inn fra Word',title:'Lim inn fra Word',error:'Det var ikke mulig å renske den innlimte teksten på grunn av en intern feil'},pasteText:{button:'Lim inn som ren tekst',title:'Lim inn som ren tekst'},templates:{button:'Maler',title:'Innholdsmaler',options:'Alternativer for mal',insertOption:'Erstatt gjeldende innhold',selectPromptMsg:'Velg malen du vil åpne i redigeringsverktøyet:',emptyListMsg:'(Ingen maler definert)'},showBlocks:'Vis blokker',stylesCombo:{label:'Stil',panelTitle:'Stilformater',panelTitle1:'Blokkstiler',panelTitle2:'Inlinestiler',panelTitle3:'Objektstiler'},format:{label:'Format',panelTitle:'Avsnittsformat',tag_p:'Normal',tag_pre:'Formatert',tag_address:'Adresse',tag_h1:'Overskrift 1',tag_h2:'Overskrift 2',tag_h3:'Overskrift 3',tag_h4:'Overskrift 4',tag_h5:'Overskrift 5',tag_h6:'Overskrift 6',tag_div:'Normal (DIV)'},div:{title:'Sett inn Div Container',toolbar:'Sett inn Div Container',cssClassInputLabel:'Stilark-klasser',styleSelectLabel:'Stil',IdInputLabel:'Id',languageCodeInputLabel:' Språkkode',inlineStyleInputLabel:'Inlinestiler',advisoryTitleInputLabel:'Tittel',langDirLabel:'Språkretning',langDirLTRLabel:'Venstre til høyre (VTH)',langDirRTLLabel:'Høyre til venstre (HTV)',edit:'Rediger Div',remove:'Fjern Div'},iframe:{title:'Egenskaper for IFrame',toolbar:'IFrame',noUrl:'Vennligst skriv inn URL for iframe',scrolling:'Aktiver scrollefelt',border:'Viss ramme rundt iframe'},font:{label:'Skrift',voiceLabel:'Font',panelTitle:'Skrift'},fontSize:{label:'Størrelse',voiceLabel:'Font Størrelse',panelTitle:'Størrelse'},colorButton:{textColorTitle:'Tekstfarge',bgColorTitle:'Bakgrunnsfarge',panelTitle:'Farger',auto:'Automatisk',more:'Flere farger...'},colors:{'000':'Svart',800000:'Rødbrun','8B4513':'Salbrun','2F4F4F':'Grønnsvart','008080':'Blågrønn','000080':'Marineblått','4B0082':'Indigo',696969:'Mørk grå',B22222:'Mørkerød',A52A2A:'Brun',DAA520:'Lys brun','006400':'Mørk grønn','40E0D0':'Turkis','0000CD':'Medium blå',800080:'Purpur',808080:'Grå',F00:'Rød',FF8C00:'Mørk oransje',FFD700:'Gull','008000':'Grønn','0FF':'Cyan','00F':'Blå',EE82EE:'Fiolett',A9A9A9:'Svak grå',FFA07A:'Rosa-oransje',FFA500:'Oransje',FFFF00:'Gul','00FF00':'Lime',AFEEEE:'Svak turkis',ADD8E6:'Lys Blå',DDA0DD:'Plomme',D3D3D3:'Lys grå',FFF0F5:'Svak lavendelrosa',FAEBD7:'Antikk-hvit',FFFFE0:'Lys gul',F0FFF0:'Honningmelon',F0FFFF:'Svakt asurblått',F0F8FF:'Svak cyan',E6E6FA:'Lavendel',FFF:'Hvit'},scayt:{title:'Stavekontroll mens du skriver',opera_title:'Ikke støttet av Opera',enable:'Slå på SCAYT',disable:'Slå av SCAYT',about:'Om SCAYT',toggle:'Veksle SCAYT',options:'Valg',langs:'Språk',moreSuggestions:'Flere forslag',ignore:'Ignorer',ignoreAll:'Ignorer Alle',addWord:'Legg til ord',emptyDic:'Ordboknavn bør ikke være tom.',optionsTab:'Valg',allCaps:'Ikke kontroller ord med kun store bokstaver',ignoreDomainNames:'Ikke kontroller domenenavn',mixedCase:'Ikke kontroller ord med blandet små og store bokstaver',mixedWithDigits:'Ikke kontroller ord som inneholder tall',languagesTab:'Språk',dictionariesTab:'Ordbøker',dic_field_name:'Ordboknavn',dic_create:'Opprett',dic_restore:'Gjenopprett',dic_delete:'Slett',dic_rename:'Gi nytt navn',dic_info:'Brukerordboken lagres først i en informasjonskapsel på din maskin, men det er en begrensning på hvor mye som kan lagres her. Når ordboken blir for stor til å lagres i en informasjonskapsel, vil vi i stedet lagre ordboken på vår server. For å lagre din personlige ordbok på vår server, burde du velge et navn for ordboken din. Hvis du allerede har lagret en ordbok, vennligst skriv inn ordbokens navn og klikk på Gjenopprett-knappen.',aboutTab:'Om'},about:{title:'Om CKEditor',dlgTitle:'Om CKEditor',help:'Se $1 for hjelp.',userGuide:'CKEditors brukerveiledning',moreInfo:'For lisensieringsinformasjon, vennligst besøk vårt nettsted:',copy:'Copyright © $1. Alle rettigheter reservert.'},maximize:'Maksimer',minimize:'Minimer',fakeobjects:{anchor:'Anker',flash:'Flash-animasjon',iframe:'IFrame',hiddenfield:'Skjult felt',unknown:'Ukjent objekt'},resize:'Dra for å skalere',colordialog:{title:'Velg farge',options:'Alternativer for farge',highlight:'Merk',selected:'Valgt',clear:'Tøm'},toolbarCollapse:'Skjul verktøylinje',toolbarExpand:'Vis verktøylinje',toolbarGroups:{document:'Dokument',clipboard:'Utklippstavle/Angre',editing:'Redigering',forms:'Skjema',basicstyles:'Basisstiler',paragraph:'Avsnitt',links:'Lenker',insert:'Innsetting',styles:'Stiler',colors:'Farger',tools:'Verktøy'},bidi:{ltr:'Tekstretning fra venstre til høyre',rtl:'Tekstretning fra høyre til venstre'},docprops:{label:'Dokumentegenskaper',title:'Dokumentegenskaper',design:'Design',meta:'Meta-data',chooseColor:'Velg',other:'<annen>',docTitle:'Sidetittel',charset:'Tegnsett',charsetOther:'Annet tegnsett',charsetASCII:'ASCII',charsetCE:'Sentraleuropeisk',charsetCT:'Tradisonell kinesisk(Big5)',charsetCR:'Kyrillisk',charsetGR:'Gresk',charsetJP:'Japansk',charsetKR:'Koreansk',charsetTR:'Tyrkisk',charsetUN:'Unicode (UTF-8)',charsetWE:'Vesteuropeisk',docType:'Dokumenttype header',docTypeOther:'Annet dokumenttype header',xhtmlDec:'Inkluder XHTML-deklarasjon',bgColor:'Bakgrunnsfarge',bgImage:'URL for bakgrunnsbilde',bgFixed:'Lås bakgrunnsbilde',txtColor:'Tekstfarge',margin:'Sidemargin',marginTop:'Topp',marginLeft:'Venstre',marginRight:'Høyre',marginBottom:'Bunn',metaKeywords:'Dokument nøkkelord (kommaseparert)',metaDescription:'Dokumentbeskrivelse',metaAuthor:'Forfatter',metaCopyright:'Kopirett',previewHtml:'<p>Dette er en <strong>eksempeltekst</strong>. Du bruker <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/nl.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/nl.js
index 582310a..574de5a 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/nl.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/nl.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.nl={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Werkbalken',editor:'Tekstverwerker',source:'Code',newPage:'Nieuwe pagina',save:'Opslaan',preview:'Voorbeeld',cut:'Knippen',copy:'Kopiëren',paste:'Plakken',print:'Printen',underline:'Onderstreept',bold:'Vet',italic:'Cursief',selectAll:'Alles selecteren',removeFormat:'Opmaak verwijderen',strike:'Doorhalen',subscript:'Subscript',superscript:'Superscript',horizontalrule:'Horizontale lijn invoegen',pagebreak:'Pagina-einde invoegen',pagebreakAlt:'Pagina-einde',unlink:'Link verwijderen',undo:'Ongedaan maken',redo:'Opnieuw uitvoeren',common:{browseServer:'Bladeren op server',url:'URL',protocol:'Protocol',upload:'Upload',uploadSubmit:'Naar server verzenden',image:'Afbeelding',flash:'Flash',form:'Formulier',checkbox:'Aanvinkvakje',radio:'Selectievakje',textField:'Tekstveld',textarea:'Tekstvak',hiddenField:'Verborgen veld',button:'Knop',select:'Selectieveld',imageButton:'Afbeeldingsknop',notSet:'<niet ingevuld>',id:'Id',name:'Naam',langDir:'Schrijfrichting',langDirLtr:'Links naar rechts (LTR)',langDirRtl:'Rechts naar links (RTL)',langCode:'Taalcode',longDescr:'Lange URL-omschrijving',cssClass:'Stylesheet-klassen',advisoryTitle:'Adviserende titel',cssStyle:'Stijl',ok:'OK',cancel:'Annuleren',close:'Sluiten',preview:'Voorbeeld',generalTab:'Algemeen',advancedTab:'Geavanceerd',validateNumberFailed:'Deze waarde is geen geldig getal.',confirmNewPage:'Alle aangebrachte wijzigingen gaan verloren. Weet u zeker dat u een nieuwe pagina wilt openen?',confirmCancel:'Enkele opties zijn gewijzigd. Weet u zeker dat u dit dialoogvenster wilt sluiten?',options:'Opties',target:'Doelvenster',targetNew:'Nieuw venster (_blank)',targetTop:'Hele venster (_top)',targetSelf:'Zelfde venster (_self)',targetParent:'Origineel venster (_parent)',langDirLTR:'Links naar rechts (LTR)',langDirRTL:'Rechts naar links (RTL)',styles:'Stijl',cssClasses:'Stylesheet klassen',width:'Breedte',height:'Hoogte',align:'Uitlijning',alignLeft:'Links',alignRight:'Rechts',alignCenter:'Centreren',alignTop:'Boven',alignMiddle:'Midden',alignBottom:'Onder',invalidHeight:'De hoogte moet een getal zijn.',invalidWidth:'De breedte moet een getal zijn.',invalidCssLength:'Waarde in veld "%1" moet een positief nummer zijn, met of zonder een geldige CSS meeteenheid (px, %, in, cm, mm, em, ex, pt of pc).',invalidHtmlLength:'Waarde in veld "%1" moet een positief nummer zijn, met of zonder een geldige HTML meeteenheid (px of %).',invalidInlineStyle:'Waarde voor de online stijl moet bestaan uit een of meerdere tupels met het formaat "naam : waarde", gescheiden door puntkomma\'s.',cssLengthTooltip:'Geef een nummer in voor een waarde in pixels of geef een nummer in met een geldige CSS eenheid (px, %, in, cm, mm, em, ex, pt, of pc).',unavailable:'%1<span class="cke_accessibility">, niet beschikbaar</span>'},contextmenu:{options:'Contextmenu opties'},specialChar:{toolbar:'Speciaal teken invoegen',title:'Selecteer speciaal teken',options:'Speciale tekens opties'},link:{toolbar:'Link invoegen/wijzigen',other:'<ander>',menu:'Link wijzigen',title:'Link',info:'Linkomschrijving',target:'Doelvenster',upload:'Upload',advanced:'Geavanceerd',type:'Linktype',toUrl:'URL',toAnchor:'Interne link in pagina',toEmail:'E-mail',targetFrame:'<frame>',targetPopup:'<popupvenster>',targetFrameName:'Naam doelframe',targetPopupName:'Naam popupvenster',popupFeatures:'Instellingen popupvenster',popupResizable:'Herschaalbaar',popupStatusBar:'Statusbalk',popupLocationBar:'Locatiemenu',popupToolbar:'Werkbalk',popupMenuBar:'Menubalk',popupFullScreen:'Volledig scherm (IE)',popupScrollBars:'Schuifbalken',popupDependent:'Afhankelijk (Netscape)',popupLeft:'Positie links',popupTop:'Positie boven',id:'Id',langDir:'Schrijfrichting',langDirLTR:'Links naar rechts (LTR)',langDirRTL:'Rechts naar links (RTL)',acccessKey:'Toegangstoets',name:'Naam',langCode:'Taalcode',tabIndex:'Tabvolgorde',advisoryTitle:'Adviserende titel',advisoryContentType:'Aanbevolen content-type',cssClasses:'Stylesheet-klassen',charset:'Karakterset van gelinkte bron',styles:'Stijl',rel:'Relatie',selectAnchor:'Kies een interne link',anchorName:'Op naam interne link',anchorId:'Op kenmerk interne link',emailAddress:'E-mailadres',emailSubject:'Onderwerp bericht',emailBody:'Inhoud bericht',noAnchors:'(Geen interne links in document gevonden)',noUrl:'Geef de link van de URL',noEmail:'Geef een e-mailadres'},anchor:{toolbar:'Interne link',menu:'Eigenschappen interne link',title:'Eigenschappen interne link',name:'Naam interne link',errorName:'Geef de naam van de interne link op',remove:'Interne link verwijderen'},list:{numberedTitle:'Eigenschappen genummerde lijst',bulletedTitle:'Eigenschappen lijst met opsommingstekens',type:'Type',start:'Start',validateStartNumber:'Startnummer van de lijst moet een heel nummer zijn.',circle:'Cirkel',disc:'Schijf',square:'Vierkant',none:'Geen',notset:'<niet gezet>',armenian:'Armeense nummering',georgian:'Georgische nummering (an, ban, gan, etc.)',lowerRoman:'Romeins kleine letters (i, ii, iii, iv, v, etc.)',upperRoman:'Romeinse hoofdletters (I, II, III, IV, V, etc.)',lowerAlpha:'Kleine letters (a, b, c, d, e, etc.)',upperAlpha:'Hoofdletters (A, B, C, D, E, etc.)',lowerGreek:'Grieks kleine letters (alpha, beta, gamma, etc.)',decimal:'Cijfers (1, 2, 3, etc.)',decimalLeadingZero:'Cijfers beginnen met nul (01, 02, 03, etc.)'},findAndReplace:{title:'Zoeken en vervangen',find:'Zoeken',replace:'Vervangen',findWhat:'Zoeken naar:',replaceWith:'Vervangen met:',notFoundMsg:'De opgegeven tekst is niet gevonden.',findOptions:'Zoekopties',matchCase:'Hoofdlettergevoelig',matchWord:'Hele woord moet voorkomen',matchCyclic:'Doorlopend zoeken',replaceAll:'Alles vervangen',replaceSuccessMsg:'%1 resultaten vervangen.'},table:{toolbar:'Tabel',title:'Eigenschappen tabel',menu:'Eigenschappen tabel',deleteTable:'Tabel verwijderen',rows:'Rijen',columns:'Kolommen',border:'Breedte rand',widthPx:'pixels',widthPc:'procent',widthUnit:'eenheid breedte',cellSpace:'Afstand tussen cellen',cellPad:'Ruimte in de cel',caption:'Naam',summary:'Samenvatting',headers:'Koppen',headersNone:'Geen',headersColumn:'Eerste kolom',headersRow:'Eerste rij',headersBoth:'Beide',invalidRows:'Het aantal rijen moet een getal zijn groter dan 0.',invalidCols:'Het aantal kolommen moet een getal zijn groter dan 0.',invalidBorder:'De rand breedte moet een getal zijn.',invalidWidth:'De tabelbreedte moet een getal zijn.',invalidHeight:'De tabelhoogte moet een getal zijn.',invalidCellSpacing:'Afstand tussen cellen moet een getal zijn.',invalidCellPadding:'Ruimte in de cel moet een getal zijn.',cell:{menu:'Cel',insertBefore:'Voeg cel in voor',insertAfter:'Voeg cel in achter',deleteCell:'Cellen verwijderen',merge:'Cellen samenvoegen',mergeRight:'Voeg samen naar rechts',mergeDown:'Voeg samen naar beneden',splitHorizontal:'Splits cellen horizontaal',splitVertical:'Splits cellen verticaal',title:'Cel eigenschappen',cellType:'Cel type',rowSpan:'Rijen samenvoegen',colSpan:'Kolommen samenvoegen',wordWrap:'Automatische terugloop',hAlign:'Horizontale uitlijning',vAlign:'Verticale uitlijning',alignBaseline:'Basislijn',bgColor:'Achtergrondkleur',borderColor:'Kleur rand',data:'Inhoud',header:'Kop',yes:'Ja',no:'Nee',invalidWidth:'De celbreedte moet een getal zijn.',invalidHeight:'De celhoogte moet een getal zijn.',invalidRowSpan:'Rijen samenvoegen moet een heel getal zijn.',invalidColSpan:'Kolommen samenvoegen moet een heel getal zijn.',chooseColor:'Kies'},row:{menu:'Rij',insertBefore:'Voeg rij in voor',insertAfter:'Voeg rij in achter',deleteRow:'Rijen verwijderen'},column:{menu:'Kolom',insertBefore:'Voeg kolom in voor',insertAfter:'Voeg kolom in achter',deleteColumn:'Kolommen verwijderen'}},button:{title:'Eigenschappen knop',text:'Tekst (waarde)',type:'Soort',typeBtn:'Knop',typeSbm:'Versturen',typeRst:'Leegmaken'},checkboxAndRadio:{checkboxTitle:'Eigenschappen aanvinkvakje',radioTitle:'Eigenschappen selectievakje',value:'Waarde',selected:'Geselecteerd'},form:{title:'Eigenschappen formulier',menu:'Eigenschappen formulier',action:'Actie',method:'Methode',encoding:'Codering'},select:{title:'Eigenschappen selectieveld',selectInfo:'Informatie',opAvail:'Beschikbare opties',value:'Waarde',size:'Grootte',lines:'Regels',chkMulti:'Gecombineerde selecties toestaan',opText:'Tekst',opValue:'Waarde',btnAdd:'Toevoegen',btnModify:'Wijzigen',btnUp:'Omhoog',btnDown:'Omlaag',btnSetValue:'Als geselecteerde waarde instellen',btnDelete:'Verwijderen'},textarea:{title:'Eigenschappen tekstvak',cols:'Kolommen',rows:'Rijen'},textfield:{title:'Eigenschappen tekstveld',name:'Naam',value:'Waarde',charWidth:'Breedte (tekens)',maxChars:'Maximum aantal tekens',type:'Soort',typeText:'Tekst',typePass:'Wachtwoord'},hidden:{title:'Eigenschappen verborgen veld',name:'Naam',value:'Waarde'},image:{title:'Eigenschappen afbeelding',titleButton:'Eigenschappen afbeeldingsknop',menu:'Eigenschappen afbeelding',infoTab:'Informatie afbeelding',btnUpload:'Naar server verzenden',upload:'Upload',alt:'Alternatieve tekst',lockRatio:'Afmetingen vergrendelen',resetSize:'Afmetingen resetten',border:'Rand',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Geef de URL van de afbeelding',linkTab:'Link',button2Img:'Wilt u de geselecteerde afbeeldingsknop vervangen door een eenvoudige afbeelding?',img2Button:'Wilt u de geselecteerde afbeelding vervangen door een afbeeldingsknop?',urlMissing:'De URL naar de afbeelding ontbreekt.',validateBorder:'Rand moet een heel nummer zijn.',validateHSpace:'HSpace moet een heel nummer zijn.',validateVSpace:'VSpace moet een heel nummer zijn.'},flash:{properties:'Eigenschappen Flash',propertiesTab:'Eigenschappen',title:'Eigenschappen Flash',chkPlay:'Automatisch afspelen',chkLoop:'Herhalen',chkMenu:"Flashmenu's inschakelen",chkFull:'Schermvullend toestaan',scale:'Schaal',scaleAll:'Alles tonen',scaleNoBorder:'Geen rand',scaleFit:'Precies passend',access:'Script toegang',accessAlways:'Altijd',accessSameDomain:'Zelfde domeinnaam',accessNever:'Nooit',alignAbsBottom:'Absoluut-onder',alignAbsMiddle:'Absoluut-midden',alignBaseline:'Basislijn',alignTextTop:'Boven tekst',quality:'Kwaliteit',qualityBest:'Beste',qualityHigh:'Hoog',qualityAutoHigh:'Automatisch hoog',qualityMedium:'Gemiddeld',qualityAutoLow:'Automatisch laag',qualityLow:'Laag',windowModeWindow:'Venster',windowModeOpaque:'Ondoorzichtig',windowModeTransparent:'Doorzichtig',windowMode:'Venster modus',flashvars:'Variabelen voor Flash',bgcolor:'Achtergrondkleur',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'De URL mag niet leeg zijn.',validateHSpace:'De HSpace moet een getal zijn.',validateVSpace:'De VSpace moet een getal zijn.'},spellCheck:{toolbar:'Spellingscontrole',title:'Spellingscontrole',notAvailable:'Excuses, deze dienst is momenteel niet beschikbaar.',errorLoading:'Er is een fout opgetreden bij het laden van de dienst: %s.',notInDic:'Niet in het woordenboek',changeTo:'Wijzig in',btnIgnore:'Negeren',btnIgnoreAll:'Alles negeren',btnReplace:'Vervangen',btnReplaceAll:'Alles vervangen',btnUndo:'Ongedaan maken',noSuggestions:'- Geen suggesties -',progress:'Bezig met spellingscontrole...',noMispell:'Klaar met spellingscontrole: geen fouten gevonden',noChanges:'Klaar met spellingscontrole: geen woorden aangepast',oneChange:'Klaar met spellingscontrole: één woord aangepast',manyChanges:'Klaar met spellingscontrole: %1 woorden aangepast',ieSpellDownload:'De spellingscontrole is niet geïnstalleerd. Wilt u deze nu downloaden?'},smiley:{toolbar:'Smiley',title:'Smiley invoegen',options:'Smiley opties'},elementsPath:{eleLabel:'Elementenpad',eleTitle:'%1 element'},numberedlist:'Genummerde lijst',bulletedlist:'Opsomming',indent:'Inspringing vergroten',outdent:'Inspringing verkleinen',justify:{left:'Links uitlijnen',center:'Centreren',right:'Rechts uitlijnen',block:'Uitvullen'},blockquote:'Citaatblok',clipboard:{title:'Plakken',cutError:'De beveiligingsinstelling van de browser verhinderen het automatisch knippen. Gebruik de sneltoets Ctrl/Cmd+X van het toetsenbord.',copyError:'De beveiligingsinstelling van de browser verhinderen het automatisch kopiëren. Gebruik de sneltoets Ctrl/Cmd+C van het toetsenbord.',pasteMsg:'Plak de tekst in het volgende vak gebruikmakend van uw toetsenbord (<strong>Ctrl/Cmd+V</strong>) en klik op OK.',securityMsg:'Door de beveiligingsinstellingen van uw browser is het niet mogelijk om direct vanuit het klembord in de editor te plakken. Middels opnieuw plakken in dit venster kunt u de tekst alsnog plakken in de editor.',pasteArea:'Plakgebied'},pastefromword:{confirmCleanup:'De tekst die u plakte lijkt gekopieerd te zijn vanuit Word. Wilt u de tekst opschonen voordat deze geplakt wordt?',toolbar:'Plakken als Word-gegevens',title:'Plakken als Word-gegevens',error:'Het was niet mogelijk om de geplakte tekst op te schonen door een interne fout'},pasteText:{button:'Plakken als platte tekst',title:'Plakken als platte tekst'},templates:{button:'Sjablonen',title:'Inhoud sjablonen',options:'Template opties',insertOption:'Vervang de huidige inhoud',selectPromptMsg:'Selecteer het sjabloon dat in de editor geopend moet worden (de actuele inhoud gaat verloren):',emptyListMsg:'(Geen sjablonen gedefinieerd)'},showBlocks:'Toon blokken',stylesCombo:{label:'Stijl',panelTitle:'Opmaakstijlen',panelTitle1:'Blok stijlen',panelTitle2:'Inline stijlen',panelTitle3:'Object stijlen'},format:{label:'Opmaak',panelTitle:'Opmaak',tag_p:'Normaal',tag_pre:'Met opmaak',tag_address:'Adres',tag_h1:'Kop 1',tag_h2:'Kop 2',tag_h3:'Kop 3',tag_h4:'Kop 4',tag_h5:'Kop 5',tag_h6:'Kop 6',tag_div:'Normaal (DIV)'},div:{title:'Div aanmaken',toolbar:'Div aanmaken',cssClassInputLabel:'Stylesheet klassen',styleSelectLabel:'Stijl',IdInputLabel:'Id',languageCodeInputLabel:' Taalcode',inlineStyleInputLabel:'Inline stijl',advisoryTitleInputLabel:'Adviserende titel',langDirLabel:'Schrijfrichting',langDirLTRLabel:'Links naar rechts (LTR)',langDirRTLLabel:'Rechts naar links (RTL)',edit:'Div wijzigen',remove:'Div verwijderen'},iframe:{title:'IFrame eigenschappen',toolbar:'IFrame',noUrl:'Geef de IFrame URL in',scrolling:'Scrollbalken inschakelen',border:'Framerand tonen'},font:{label:'Lettertype',voiceLabel:'Lettertype',panelTitle:'Lettertype'},fontSize:{label:'Lettergrootte',voiceLabel:'Lettergrootte',panelTitle:'Lettergrootte'},colorButton:{textColorTitle:'Tekstkleur',bgColorTitle:'Achtergrondkleur',panelTitle:'Kleuren',auto:'Automatisch',more:'Meer kleuren...'},colors:{'000':'Zwart',800000:'Kastanjebruin','8B4513':'Chocoladebruin','2F4F4F':'Donkerleigrijs','008080':'Blauwgroen','000080':'Marine','4B0082':'Indigo',696969:'Donkergrijs',B22222:'Baksteen',A52A2A:'Bruin',DAA520:'Donkergeel','006400':'Donkergroen','40E0D0':'Turquoise','0000CD':'Middenblauw',800080:'Paars',808080:'Grijs',F00:'Rood',FF8C00:'Donkeroranje',FFD700:'Goud','008000':'Groen','0FF':'Cyaan','00F':'Blauw',EE82EE:'Violet',A9A9A9:'Donkergrijs',FFA07A:'Lichtzalm',FFA500:'Oranje',FFFF00:'Geel','00FF00':'Felgroen',AFEEEE:'Lichtturquoise',ADD8E6:'Lichtblauw',DDA0DD:'Pruim',D3D3D3:'Lichtgrijs',FFF0F5:'Linnen',FAEBD7:'Ivoor',FFFFE0:'Lichtgeel',F0FFF0:'Honingdauw',F0FFFF:'Azuur',F0F8FF:'Licht hemelsblauw',E6E6FA:'Lavendel',FFF:'Wit'},scayt:{title:'Controleer de spelling tijdens het typen',opera_title:'Niet ondersteund door Opera',enable:'SCAYT inschakelen',disable:'SCAYT uitschakelen',about:'Over SCAYT',toggle:'SCAYT in/uitschakelen',options:'Opties',langs:'Talen',moreSuggestions:'Meer suggesties',ignore:'Negeren',ignoreAll:'Alles negeren',addWord:'Woord toevoegen',emptyDic:'De naam van het woordenboek mag niet leeg zijn.',optionsTab:'Opties',allCaps:'Negeer woorden helemaal in hoofdletters',ignoreDomainNames:'Negeer domeinnamen',mixedCase:'Negeer woorden met hoofd- en kleine letters',mixedWithDigits:'Negeer woorden met cijfers',languagesTab:'Talen',dictionariesTab:'Woordenboeken',dic_field_name:'Naam woordenboek',dic_create:'Aanmaken',dic_restore:'Terugzetten',dic_delete:'Verwijderen',dic_rename:'Hernoemen',dic_info:'Initieel wordt het gebruikerswoordenboek opgeslagen in een cookie. Cookies zijn echter beperkt in grootte. Zodra het gebruikerswoordenboek het punt bereikt waarop het niet meer in een cookie opgeslagen kan worden, dan wordt het woordenboek op de server opgeslagen. Om je persoonlijke woordenboek op je eigen server op te slaan, moet je een mapnaam opgeven. Indien je al een woordenboek hebt opgeslagen, typ dan de naam en klik op de Terugzetten knop.',aboutTab:'Over'},about:{title:'Over CKEditor',dlgTitle:'Over CKEditor',help:'Bekijk de $1 voor hulp.',userGuide:'CKEditor gebruiksaanwijzing',moreInfo:'Voor licentie informatie, bezoek onze website:',copy:'Copyright © $1. Alle rechten voorbehouden.'},maximize:'Maximaliseren',minimize:'Minimaliseren',fakeobjects:{anchor:'Interne link',flash:'Flash animatie',iframe:'IFrame',hiddenfield:'Verborgen veld',unknown:'Onbekend object'},resize:'Sleep om te herschalen',colordialog:{title:'Selecteer kleur',options:'Kleuropties',highlight:'Actief',selected:'Geselecteerde kleur',clear:'Wissen'},toolbarCollapse:'Werkbalk inklappen',toolbarExpand:'Werkbalk uitklappen',toolbarGroups:{document:'Document',clipboard:'Klembord/Ongedaan maken',editing:'Bewerken',forms:'Formulieren',basicstyles:'Basisstijlen',paragraph:'Paragraaf',links:'Links',insert:'Invoegen',styles:'Stijlen',colors:'Kleuren',tools:'Toepassingen'},bidi:{ltr:'Schrijfrichting van links naar rechts',rtl:'Schrijfrichting van rechts naar links'},docprops:{label:'Documenteigenschappen',title:'Documenteigenschappen',design:'Ontwerp',meta:'Meta tags',chooseColor:'Kies',other:'Anders...',docTitle:'Paginatitel',charset:'Tekencodering',charsetOther:'Andere tekencodering',charsetASCII:'ASCII',charsetCE:'Centraal Europees',charsetCT:'Traditioneel Chinees (Big5)',charsetCR:'Cyrillisch',charsetGR:'Grieks',charsetJP:'Japans',charsetKR:'Koreaans',charsetTR:'Turks',charsetUN:'Unicode (UTF-8)',charsetWE:'West Europees',docType:'Documenttype-definitie',docTypeOther:'Andere documenttype-definitie',xhtmlDec:'XHTML declaratie invoegen',bgColor:'Achtergrondkleur',bgImage:'Achtergrondafbeelding URL',bgFixed:'Niet-scrollend (gefixeerde) achtergrond',txtColor:'Tekstkleur',margin:'Pagina marges',marginTop:'Boven',marginLeft:'Links',marginRight:'Rechts',marginBottom:'Onder',metaKeywords:'Trefwoorden voor indexering (komma-gescheiden)',metaDescription:'Documentbeschrijving',metaAuthor:'Auteur',metaCopyright:'Auteursrechten',previewHtml:'<p>Dit is <strong>voorbeeld tekst</strong>. Je gebruikt <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.nl={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Werkbalken',editor:'Tekstverwerker',source:'Code',newPage:'Nieuwe pagina',save:'Opslaan',preview:'Voorbeeld',cut:'Knippen',copy:'Kopiëren',paste:'Plakken',print:'Printen',underline:'Onderstreept',bold:'Vet',italic:'Cursief',selectAll:'Alles selecteren',removeFormat:'Opmaak verwijderen',strike:'Doorhalen',subscript:'Subscript',superscript:'Superscript',horizontalrule:'Horizontale lijn invoegen',pagebreak:'Pagina-einde invoegen',pagebreakAlt:'Pagina-einde',unlink:'Link verwijderen',undo:'Ongedaan maken',redo:'Opnieuw uitvoeren',common:{browseServer:'Bladeren op server',url:'URL',protocol:'Protocol',upload:'Upload',uploadSubmit:'Naar server verzenden',image:'Afbeelding',flash:'Flash',form:'Formulier',checkbox:'Aanvinkvakje',radio:'Selectievakje',textField:'Tekstveld',textarea:'Tekstvak',hiddenField:'Verborgen veld',button:'Knop',select:'Selectieveld',imageButton:'Afbeeldingsknop',notSet:'<niet ingevuld>',id:'Id',name:'Naam',langDir:'Schrijfrichting',langDirLtr:'Links naar rechts (LTR)',langDirRtl:'Rechts naar links (RTL)',langCode:'Taalcode',longDescr:'Lange URL-omschrijving',cssClass:'Stylesheet-klassen',advisoryTitle:'Adviserende titel',cssStyle:'Stijl',ok:'OK',cancel:'Annuleren',close:'Sluiten',preview:'Voorbeeld',generalTab:'Algemeen',advancedTab:'Geavanceerd',validateNumberFailed:'Deze waarde is geen geldig getal.',confirmNewPage:'Alle aangebrachte wijzigingen gaan verloren. Weet u zeker dat u een nieuwe pagina wilt openen?',confirmCancel:'Enkele opties zijn gewijzigd. Weet u zeker dat u dit dialoogvenster wilt sluiten?',options:'Opties',target:'Doelvenster',targetNew:'Nieuw venster (_blank)',targetTop:'Hele venster (_top)',targetSelf:'Zelfde venster (_self)',targetParent:'Origineel venster (_parent)',langDirLTR:'Links naar rechts (LTR)',langDirRTL:'Rechts naar links (RTL)',styles:'Stijl',cssClasses:'Stylesheet klassen',width:'Breedte',height:'Hoogte',align:'Uitlijning',alignLeft:'Links',alignRight:'Rechts',alignCenter:'Centreren',alignTop:'Boven',alignMiddle:'Midden',alignBottom:'Onder',invalidHeight:'De hoogte moet een getal zijn.',invalidWidth:'De breedte moet een getal zijn.',invalidCssLength:'Waarde in veld "%1" moet een positief nummer zijn, met of zonder een geldige CSS meeteenheid (px, %, in, cm, mm, em, ex, pt of pc).',invalidHtmlLength:'Waarde in veld "%1" moet een positief nummer zijn, met of zonder een geldige HTML meeteenheid (px of %).',invalidInlineStyle:'Waarde voor de online stijl moet bestaan uit een of meerdere tupels met het formaat "naam : waarde", gescheiden door puntkomma\'s.',cssLengthTooltip:'Geef een nummer in voor een waarde in pixels of geef een nummer in met een geldige CSS eenheid (px, %, in, cm, mm, em, ex, pt, of pc).',unavailable:'%1<span class="cke_accessibility">, niet beschikbaar</span>'},contextmenu:{options:'Contextmenu opties'},specialChar:{toolbar:'Speciaal teken invoegen',title:'Selecteer speciaal teken',options:'Speciale tekens opties'},link:{toolbar:'Link invoegen/wijzigen',other:'<ander>',menu:'Link wijzigen',title:'Link',info:'Linkomschrijving',target:'Doelvenster',upload:'Upload',advanced:'Geavanceerd',type:'Linktype',toUrl:'URL',toAnchor:'Interne link in pagina',toEmail:'E-mail',targetFrame:'<frame>',targetPopup:'<popupvenster>',targetFrameName:'Naam doelframe',targetPopupName:'Naam popupvenster',popupFeatures:'Instellingen popupvenster',popupResizable:'Herschaalbaar',popupStatusBar:'Statusbalk',popupLocationBar:'Locatiemenu',popupToolbar:'Werkbalk',popupMenuBar:'Menubalk',popupFullScreen:'Volledig scherm (IE)',popupScrollBars:'Schuifbalken',popupDependent:'Afhankelijk (Netscape)',popupLeft:'Positie links',popupTop:'Positie boven',id:'Id',langDir:'Schrijfrichting',langDirLTR:'Links naar rechts (LTR)',langDirRTL:'Rechts naar links (RTL)',acccessKey:'Toegangstoets',name:'Naam',langCode:'Taalcode',tabIndex:'Tabvolgorde',advisoryTitle:'Adviserende titel',advisoryContentType:'Aanbevolen content-type',cssClasses:'Stylesheet-klassen',charset:'Karakterset van gelinkte bron',styles:'Stijl',rel:'Relatie',selectAnchor:'Kies een interne link',anchorName:'Op naam interne link',anchorId:'Op kenmerk interne link',emailAddress:'E-mailadres',emailSubject:'Onderwerp bericht',emailBody:'Inhoud bericht',noAnchors:'(Geen interne links in document gevonden)',noUrl:'Geef de link van de URL',noEmail:'Geef een e-mailadres'},anchor:{toolbar:'Interne link',menu:'Eigenschappen interne link',title:'Eigenschappen interne link',name:'Naam interne link',errorName:'Geef de naam van de interne link op',remove:'Interne link verwijderen'},list:{numberedTitle:'Eigenschappen genummerde lijst',bulletedTitle:'Eigenschappen lijst met opsommingstekens',type:'Type',start:'Start',validateStartNumber:'Startnummer van de lijst moet een heel nummer zijn.',circle:'Cirkel',disc:'Schijf',square:'Vierkant',none:'Geen',notset:'<niet gezet>',armenian:'Armeense nummering',georgian:'Georgische nummering (an, ban, gan, etc.)',lowerRoman:'Romeins kleine letters (i, ii, iii, iv, v, etc.)',upperRoman:'Romeinse hoofdletters (I, II, III, IV, V, etc.)',lowerAlpha:'Kleine letters (a, b, c, d, e, etc.)',upperAlpha:'Hoofdletters (A, B, C, D, E, etc.)',lowerGreek:'Grieks kleine letters (alpha, beta, gamma, etc.)',decimal:'Cijfers (1, 2, 3, etc.)',decimalLeadingZero:'Cijfers beginnen met nul (01, 02, 03, etc.)'},findAndReplace:{title:'Zoeken en vervangen',find:'Zoeken',replace:'Vervangen',findWhat:'Zoeken naar:',replaceWith:'Vervangen met:',notFoundMsg:'De opgegeven tekst is niet gevonden.',findOptions:'Zoekopties',matchCase:'Hoofdlettergevoelig',matchWord:'Hele woord moet voorkomen',matchCyclic:'Doorlopend zoeken',replaceAll:'Alles vervangen',replaceSuccessMsg:'%1 resultaten vervangen.'},table:{toolbar:'Tabel',title:'Eigenschappen tabel',menu:'Eigenschappen tabel',deleteTable:'Tabel verwijderen',rows:'Rijen',columns:'Kolommen',border:'Breedte rand',widthPx:'pixels',widthPc:'procent',widthUnit:'eenheid breedte',cellSpace:'Afstand tussen cellen',cellPad:'Ruimte in de cel',caption:'Naam',summary:'Samenvatting',headers:'Koppen',headersNone:'Geen',headersColumn:'Eerste kolom',headersRow:'Eerste rij',headersBoth:'Beide',invalidRows:'Het aantal rijen moet een getal zijn groter dan 0.',invalidCols:'Het aantal kolommen moet een getal zijn groter dan 0.',invalidBorder:'De rand breedte moet een getal zijn.',invalidWidth:'De tabelbreedte moet een getal zijn.',invalidHeight:'De tabelhoogte moet een getal zijn.',invalidCellSpacing:'Afstand tussen cellen moet een getal zijn.',invalidCellPadding:'Ruimte in de cel moet een getal zijn.',cell:{menu:'Cel',insertBefore:'Voeg cel in voor',insertAfter:'Voeg cel in achter',deleteCell:'Cellen verwijderen',merge:'Cellen samenvoegen',mergeRight:'Voeg samen naar rechts',mergeDown:'Voeg samen naar beneden',splitHorizontal:'Splits cellen horizontaal',splitVertical:'Splits cellen verticaal',title:'Cel eigenschappen',cellType:'Cel type',rowSpan:'Rijen samenvoegen',colSpan:'Kolommen samenvoegen',wordWrap:'Automatische terugloop',hAlign:'Horizontale uitlijning',vAlign:'Verticale uitlijning',alignBaseline:'Basislijn',bgColor:'Achtergrondkleur',borderColor:'Kleur rand',data:'Inhoud',header:'Kop',yes:'Ja',no:'Nee',invalidWidth:'De celbreedte moet een getal zijn.',invalidHeight:'De celhoogte moet een getal zijn.',invalidRowSpan:'Rijen samenvoegen moet een heel getal zijn.',invalidColSpan:'Kolommen samenvoegen moet een heel getal zijn.',chooseColor:'Kies'},row:{menu:'Rij',insertBefore:'Voeg rij in voor',insertAfter:'Voeg rij in achter',deleteRow:'Rijen verwijderen'},column:{menu:'Kolom',insertBefore:'Voeg kolom in voor',insertAfter:'Voeg kolom in achter',deleteColumn:'Kolommen verwijderen'}},button:{title:'Eigenschappen knop',text:'Tekst (waarde)',type:'Soort',typeBtn:'Knop',typeSbm:'Versturen',typeRst:'Leegmaken'},checkboxAndRadio:{checkboxTitle:'Eigenschappen aanvinkvakje',radioTitle:'Eigenschappen selectievakje',value:'Waarde',selected:'Geselecteerd'},form:{title:'Eigenschappen formulier',menu:'Eigenschappen formulier',action:'Actie',method:'Methode',encoding:'Codering'},select:{title:'Eigenschappen selectieveld',selectInfo:'Informatie',opAvail:'Beschikbare opties',value:'Waarde',size:'Grootte',lines:'Regels',chkMulti:'Gecombineerde selecties toestaan',opText:'Tekst',opValue:'Waarde',btnAdd:'Toevoegen',btnModify:'Wijzigen',btnUp:'Omhoog',btnDown:'Omlaag',btnSetValue:'Als geselecteerde waarde instellen',btnDelete:'Verwijderen'},textarea:{title:'Eigenschappen tekstvak',cols:'Kolommen',rows:'Rijen'},textfield:{title:'Eigenschappen tekstveld',name:'Naam',value:'Waarde',charWidth:'Breedte (tekens)',maxChars:'Maximum aantal tekens',type:'Soort',typeText:'Tekst',typePass:'Wachtwoord'},hidden:{title:'Eigenschappen verborgen veld',name:'Naam',value:'Waarde'},image:{title:'Eigenschappen afbeelding',titleButton:'Eigenschappen afbeeldingsknop',menu:'Eigenschappen afbeelding',infoTab:'Informatie afbeelding',btnUpload:'Naar server verzenden',upload:'Upload',alt:'Alternatieve tekst',lockRatio:'Afmetingen vergrendelen',resetSize:'Afmetingen resetten',border:'Rand',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Geef de URL van de afbeelding',linkTab:'Link',button2Img:'Wilt u de geselecteerde afbeeldingsknop vervangen door een eenvoudige afbeelding?',img2Button:'Wilt u de geselecteerde afbeelding vervangen door een afbeeldingsknop?',urlMissing:'De URL naar de afbeelding ontbreekt.',validateBorder:'Rand moet een heel nummer zijn.',validateHSpace:'HSpace moet een heel nummer zijn.',validateVSpace:'VSpace moet een heel nummer zijn.'},flash:{properties:'Eigenschappen Flash',propertiesTab:'Eigenschappen',title:'Eigenschappen Flash',chkPlay:'Automatisch afspelen',chkLoop:'Herhalen',chkMenu:"Flashmenu's inschakelen",chkFull:'Schermvullend toestaan',scale:'Schaal',scaleAll:'Alles tonen',scaleNoBorder:'Geen rand',scaleFit:'Precies passend',access:'Script toegang',accessAlways:'Altijd',accessSameDomain:'Zelfde domeinnaam',accessNever:'Nooit',alignAbsBottom:'Absoluut-onder',alignAbsMiddle:'Absoluut-midden',alignBaseline:'Basislijn',alignTextTop:'Boven tekst',quality:'Kwaliteit',qualityBest:'Beste',qualityHigh:'Hoog',qualityAutoHigh:'Automatisch hoog',qualityMedium:'Gemiddeld',qualityAutoLow:'Automatisch laag',qualityLow:'Laag',windowModeWindow:'Venster',windowModeOpaque:'Ondoorzichtig',windowModeTransparent:'Doorzichtig',windowMode:'Venster modus',flashvars:'Variabelen voor Flash',bgcolor:'Achtergrondkleur',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'De URL mag niet leeg zijn.',validateHSpace:'De HSpace moet een getal zijn.',validateVSpace:'De VSpace moet een getal zijn.'},spellCheck:{toolbar:'Spellingscontrole',title:'Spellingscontrole',notAvailable:'Excuses, deze dienst is momenteel niet beschikbaar.',errorLoading:'Er is een fout opgetreden bij het laden van de dienst: %s.',notInDic:'Niet in het woordenboek',changeTo:'Wijzig in',btnIgnore:'Negeren',btnIgnoreAll:'Alles negeren',btnReplace:'Vervangen',btnReplaceAll:'Alles vervangen',btnUndo:'Ongedaan maken',noSuggestions:'- Geen suggesties -',progress:'Bezig met spellingscontrole...',noMispell:'Klaar met spellingscontrole: geen fouten gevonden',noChanges:'Klaar met spellingscontrole: geen woorden aangepast',oneChange:'Klaar met spellingscontrole: één woord aangepast',manyChanges:'Klaar met spellingscontrole: %1 woorden aangepast',ieSpellDownload:'De spellingscontrole is niet geïnstalleerd. Wilt u deze nu downloaden?'},smiley:{toolbar:'Smiley',title:'Smiley invoegen',options:'Smiley opties'},elementsPath:{eleLabel:'Elementenpad',eleTitle:'%1 element'},numberedlist:'Genummerde lijst',bulletedlist:'Opsomming',indent:'Inspringing vergroten',outdent:'Inspringing verkleinen',justify:{left:'Links uitlijnen',center:'Centreren',right:'Rechts uitlijnen',block:'Uitvullen'},blockquote:'Citaatblok',clipboard:{title:'Plakken',cutError:'De beveiligingsinstelling van de browser verhinderen het automatisch knippen. Gebruik de sneltoets Ctrl/Cmd+X van het toetsenbord.',copyError:'De beveiligingsinstelling van de browser verhinderen het automatisch kopiëren. Gebruik de sneltoets Ctrl/Cmd+C van het toetsenbord.',pasteMsg:'Plak de tekst in het volgende vak gebruikmakend van uw toetsenbord (<strong>Ctrl/Cmd+V</strong>) en klik op OK.',securityMsg:'Door de beveiligingsinstellingen van uw browser is het niet mogelijk om direct vanuit het klembord in de editor te plakken. Middels opnieuw plakken in dit venster kunt u de tekst alsnog plakken in de editor.',pasteArea:'Plakgebied'},pastefromword:{confirmCleanup:'De tekst die u plakte lijkt gekopieerd te zijn vanuit Word. Wilt u de tekst opschonen voordat deze geplakt wordt?',toolbar:'Plakken als Word-gegevens',title:'Plakken als Word-gegevens',error:'Het was niet mogelijk om de geplakte tekst op te schonen door een interne fout'},pasteText:{button:'Plakken als platte tekst',title:'Plakken als platte tekst'},templates:{button:'Sjablonen',title:'Inhoud sjablonen',options:'Template opties',insertOption:'Vervang de huidige inhoud',selectPromptMsg:'Selecteer het sjabloon dat in de editor geopend moet worden (de actuele inhoud gaat verloren):',emptyListMsg:'(Geen sjablonen gedefinieerd)'},showBlocks:'Toon blokken',stylesCombo:{label:'Stijl',panelTitle:'Opmaakstijlen',panelTitle1:'Blok stijlen',panelTitle2:'Inline stijlen',panelTitle3:'Object stijlen'},format:{label:'Opmaak',panelTitle:'Opmaak',tag_p:'Normaal',tag_pre:'Met opmaak',tag_address:'Adres',tag_h1:'Kop 1',tag_h2:'Kop 2',tag_h3:'Kop 3',tag_h4:'Kop 4',tag_h5:'Kop 5',tag_h6:'Kop 6',tag_div:'Normaal (DIV)'},div:{title:'Div aanmaken',toolbar:'Div aanmaken',cssClassInputLabel:'Stylesheet klassen',styleSelectLabel:'Stijl',IdInputLabel:'Id',languageCodeInputLabel:' Taalcode',inlineStyleInputLabel:'Inline stijl',advisoryTitleInputLabel:'Adviserende titel',langDirLabel:'Schrijfrichting',langDirLTRLabel:'Links naar rechts (LTR)',langDirRTLLabel:'Rechts naar links (RTL)',edit:'Div wijzigen',remove:'Div verwijderen'},iframe:{title:'IFrame eigenschappen',toolbar:'IFrame',noUrl:'Geef de IFrame URL in',scrolling:'Scrollbalken inschakelen',border:'Framerand tonen'},font:{label:'Lettertype',voiceLabel:'Lettertype',panelTitle:'Lettertype'},fontSize:{label:'Lettergrootte',voiceLabel:'Lettergrootte',panelTitle:'Lettergrootte'},colorButton:{textColorTitle:'Tekstkleur',bgColorTitle:'Achtergrondkleur',panelTitle:'Kleuren',auto:'Automatisch',more:'Meer kleuren...'},colors:{'000':'Zwart',800000:'Kastanjebruin','8B4513':'Chocoladebruin','2F4F4F':'Donkerleigrijs','008080':'Blauwgroen','000080':'Marine','4B0082':'Indigo',696969:'Donkergrijs',B22222:'Baksteen',A52A2A:'Bruin',DAA520:'Donkergeel','006400':'Donkergroen','40E0D0':'Turquoise','0000CD':'Middenblauw',800080:'Paars',808080:'Grijs',F00:'Rood',FF8C00:'Donkeroranje',FFD700:'Goud','008000':'Groen','0FF':'Cyaan','00F':'Blauw',EE82EE:'Violet',A9A9A9:'Donkergrijs',FFA07A:'Lichtzalm',FFA500:'Oranje',FFFF00:'Geel','00FF00':'Felgroen',AFEEEE:'Lichtturquoise',ADD8E6:'Lichtblauw',DDA0DD:'Pruim',D3D3D3:'Lichtgrijs',FFF0F5:'Linnen',FAEBD7:'Ivoor',FFFFE0:'Lichtgeel',F0FFF0:'Honingdauw',F0FFFF:'Azuur',F0F8FF:'Licht hemelsblauw',E6E6FA:'Lavendel',FFF:'Wit'},scayt:{title:'Controleer de spelling tijdens het typen',opera_title:'Niet ondersteund door Opera',enable:'SCAYT inschakelen',disable:'SCAYT uitschakelen',about:'Over SCAYT',toggle:'SCAYT in/uitschakelen',options:'Opties',langs:'Talen',moreSuggestions:'Meer suggesties',ignore:'Negeren',ignoreAll:'Alles negeren',addWord:'Woord toevoegen',emptyDic:'De naam van het woordenboek mag niet leeg zijn.',optionsTab:'Opties',allCaps:'Negeer woorden helemaal in hoofdletters',ignoreDomainNames:'Negeer domeinnamen',mixedCase:'Negeer woorden met hoofd- en kleine letters',mixedWithDigits:'Negeer woorden met cijfers',languagesTab:'Talen',dictionariesTab:'Woordenboeken',dic_field_name:'Naam woordenboek',dic_create:'Aanmaken',dic_restore:'Terugzetten',dic_delete:'Verwijderen',dic_rename:'Hernoemen',dic_info:'Initieel wordt het gebruikerswoordenboek opgeslagen in een cookie. Cookies zijn echter beperkt in grootte. Zodra het gebruikerswoordenboek het punt bereikt waarop het niet meer in een cookie opgeslagen kan worden, dan wordt het woordenboek op de server opgeslagen. Om je persoonlijke woordenboek op je eigen server op te slaan, moet je een mapnaam opgeven. Indien je al een woordenboek hebt opgeslagen, typ dan de naam en klik op de Terugzetten knop.',aboutTab:'Over'},about:{title:'Over CKEditor',dlgTitle:'Over CKEditor',help:'Bekijk de $1 voor hulp.',userGuide:'CKEditor gebruiksaanwijzing',moreInfo:'Voor licentie informatie, bezoek onze website:',copy:'Copyright © $1. Alle rechten voorbehouden.'},maximize:'Maximaliseren',minimize:'Minimaliseren',fakeobjects:{anchor:'Interne link',flash:'Flash animatie',iframe:'IFrame',hiddenfield:'Verborgen veld',unknown:'Onbekend object'},resize:'Sleep om te herschalen',colordialog:{title:'Selecteer kleur',options:'Kleuropties',highlight:'Actief',selected:'Geselecteerde kleur',clear:'Wissen'},toolbarCollapse:'Werkbalk inklappen',toolbarExpand:'Werkbalk uitklappen',toolbarGroups:{document:'Document',clipboard:'Klembord/Ongedaan maken',editing:'Bewerken',forms:'Formulieren',basicstyles:'Basisstijlen',paragraph:'Paragraaf',links:'Links',insert:'Invoegen',styles:'Stijlen',colors:'Kleuren',tools:'Toepassingen'},bidi:{ltr:'Schrijfrichting van links naar rechts',rtl:'Schrijfrichting van rechts naar links'},docprops:{label:'Documenteigenschappen',title:'Documenteigenschappen',design:'Ontwerp',meta:'Meta tags',chooseColor:'Kies',other:'Anders...',docTitle:'Paginatitel',charset:'Tekencodering',charsetOther:'Andere tekencodering',charsetASCII:'ASCII',charsetCE:'Centraal Europees',charsetCT:'Traditioneel Chinees (Big5)',charsetCR:'Cyrillisch',charsetGR:'Grieks',charsetJP:'Japans',charsetKR:'Koreaans',charsetTR:'Turks',charsetUN:'Unicode (UTF-8)',charsetWE:'West Europees',docType:'Documenttype-definitie',docTypeOther:'Andere documenttype-definitie',xhtmlDec:'XHTML declaratie invoegen',bgColor:'Achtergrondkleur',bgImage:'Achtergrondafbeelding URL',bgFixed:'Niet-scrollend (gefixeerde) achtergrond',txtColor:'Tekstkleur',margin:'Pagina marges',marginTop:'Boven',marginLeft:'Links',marginRight:'Rechts',marginBottom:'Onder',metaKeywords:'Trefwoorden voor indexering (komma-gescheiden)',metaDescription:'Documentbeschrijving',metaAuthor:'Auteur',metaCopyright:'Auteursrechten',previewHtml:'<p>Dit is <strong>voorbeeld tekst</strong>. Je gebruikt <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/no.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/no.js
index 368b1e7..02c5196 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/no.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/no.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.no={dir:'ltr',editorTitle:'Rikteksteditor, %1',editorHelp:'Trykk ALT 0 for hjelp',toolbars:'Verktøylinjer for editor',editor:'Rikteksteditor',source:'Kilde',newPage:'Ny side',save:'Lagre',preview:'Forhåndsvis',cut:'Klipp ut',copy:'Kopier',paste:'Lim inn',print:'Skriv ut',underline:'Understreking',bold:'Fet',italic:'Kursiv',selectAll:'Merk alt',removeFormat:'Fjern formatering',strike:'Gjennomstreking',subscript:'Senket skrift',superscript:'Hevet skrift',horizontalrule:'Sett inn horisontal linje',pagebreak:'Sett inn sideskift for utskrift',pagebreakAlt:'Sideskift',unlink:'Fjern lenke',undo:'Angre',redo:'Gjør om',common:{browseServer:'Bla igjennom server',url:'URL',protocol:'Protokoll',upload:'Last opp',uploadSubmit:'Send det til serveren',image:'Bilde',flash:'Flash',form:'Skjema',checkbox:'Avmerkingsboks',radio:'Alternativknapp',textField:'Tekstboks',textarea:'Tekstområde',hiddenField:'Skjult felt',button:'Knapp',select:'Rullegardinliste',imageButton:'Bildeknapp',notSet:'<ikke satt>',id:'Id',name:'Navn',langDir:'Språkretning',langDirLtr:'Venstre til høyre (VTH)',langDirRtl:'Høyre til venstre (HTV)',langCode:'Språkkode',longDescr:'Utvidet beskrivelse',cssClass:'Stilarkklasser',advisoryTitle:'Tittel',cssStyle:'Stil',ok:'OK',cancel:'Avbryt',close:'Lukk',preview:'Forhåndsvis',generalTab:'Generelt',advancedTab:'Avansert',validateNumberFailed:'Denne verdien er ikke et tall.',confirmNewPage:'Alle ulagrede endringer som er gjort i dette innholdet vil bli tapt. Er du sikker på at du vil laste en ny side?',confirmCancel:'Noen av valgene har blitt endret. Er du sikker på at du vil lukke dialogen?',options:'Valg',target:'Mål',targetNew:'Nytt vindu (_blank)',targetTop:'Hele vindu (_top)',targetSelf:'Samme vindu (_self)',targetParent:'Foreldrevindu (_parent)',langDirLTR:'Venstre til høyre (VTH)',langDirRTL:'Høyre til venstre (HTV)',styles:'Stil',cssClasses:'Stilarkklasser',width:'Bredde',height:'Høyde',align:'Juster',alignLeft:'Venstre',alignRight:'Høyre',alignCenter:'Midtjuster',alignTop:'Topp',alignMiddle:'Midten',alignBottom:'Bunn',invalidHeight:'Høyde må være et tall.',invalidWidth:'Bredde må være et tall.',invalidCssLength:'Den angitte verdien for feltet "%1" må være et positivt tall med eller uten en gyldig CSS-målingsenhet (px, %, in, cm, mm, em, ex, pt, eller pc).',invalidHtmlLength:'Den angitte verdien for feltet "%1" må være et positivt tall med eller uten en gyldig HTML-målingsenhet (px eller %).',invalidInlineStyle:'Verdi angitt for inline stil må bestå av en eller flere sett med formatet "navn : verdi", separert med semikolon',cssLengthTooltip:'Skriv inn et tall for en piksel-verdi eller et tall med en gyldig CSS-enhet (px, %, in, cm, mm, em, ex, pt, eller pc).',unavailable:'%1<span class="cke_accessibility">, utilgjenglig</span>'},contextmenu:{options:'Alternativer for høyreklikkmeny'},specialChar:{toolbar:'Sett inn spesialtegn',title:'Velg spesialtegn',options:'Alternativer for spesialtegn'},link:{toolbar:'Sett inn/Rediger lenke',other:'<annen>',menu:'Rediger lenke',title:'Lenke',info:'Lenkeinfo',target:'Mål',upload:'Last opp',advanced:'Avansert',type:'Lenketype',toUrl:'URL',toAnchor:'Lenke til anker i teksten',toEmail:'E-post',targetFrame:'<ramme>',targetPopup:'<popup-vindu>',targetFrameName:'Målramme',targetPopupName:'Navn på popup-vindu',popupFeatures:'Egenskaper for popup-vindu',popupResizable:'Skalerbar',popupStatusBar:'Statuslinje',popupLocationBar:'Adresselinje',popupToolbar:'Verktøylinje',popupMenuBar:'Menylinje',popupFullScreen:'Fullskjerm (IE)',popupScrollBars:'Scrollbar',popupDependent:'Avhenging (Netscape)',popupLeft:'Venstre posisjon',popupTop:'Topp-posisjon',id:'Id',langDir:'Språkretning',langDirLTR:'Venstre til høyre (VTH)',langDirRTL:'Høyre til venstre (HTV)',acccessKey:'Aksessknapp',name:'Navn',langCode:'Språkkode',tabIndex:'Tabindeks',advisoryTitle:'Tittel',advisoryContentType:'Type',cssClasses:'Stilarkklasser',charset:'Lenket tegnsett',styles:'Stil',rel:'Relasjon (rel)',selectAnchor:'Velg et anker',anchorName:'Anker etter navn',anchorId:'Element etter ID',emailAddress:'E-postadresse',emailSubject:'Meldingsemne',emailBody:'Melding',noAnchors:'(Ingen anker i dokumentet)',noUrl:'Vennligst skriv inn lenkens URL',noEmail:'Vennligst skriv inn e-postadressen'},anchor:{toolbar:'Sett inn/Rediger anker',menu:'Egenskaper for anker',title:'Egenskaper for anker',name:'Ankernavn',errorName:'Vennligst skriv inn ankernavnet',remove:'Fjern anker'},list:{numberedTitle:'Egenskaper for nummerert liste',bulletedTitle:'Egenskaper for punktmerket liste',type:'Type',start:'Start',validateStartNumber:'Starten på listen må være et heltall.',circle:'Sirkel',disc:'Disk',square:'Firkant',none:'Ingen',notset:'<ikke satt>',armenian:'Armensk nummerering',georgian:'Georgisk nummerering (an, ban, gan, osv.)',lowerRoman:'Romertall, små (i, ii, iii, iv, v, osv.)',upperRoman:'Romertall, store (I, II, III, IV, V, osv.)',lowerAlpha:'Alfabetisk, små (a, b, c, d, e, osv.)',upperAlpha:'Alfabetisk, store (A, B, C, D, E, osv.)',lowerGreek:'Gresk, små (alpha, beta, gamma, osv.)',decimal:'Tall (1, 2, 3, osv.)',decimalLeadingZero:'Tall, med førstesiffer null (01, 02, 03, osv.)'},findAndReplace:{title:'Søk og erstatt',find:'Søk',replace:'Erstatt',findWhat:'Søk etter:',replaceWith:'Erstatt med:',notFoundMsg:'Fant ikke søketeksten.',findOptions:'Søkealternativer',matchCase:'Skill mellom store og små bokstaver',matchWord:'Bare hele ord',matchCyclic:'Søk i hele dokumentet',replaceAll:'Erstatt alle',replaceSuccessMsg:'%1 tilfelle(r) erstattet.'},table:{toolbar:'Tabell',title:'Egenskaper for tabell',menu:'Egenskaper for tabell',deleteTable:'Slett tabell',rows:'Rader',columns:'Kolonner',border:'Rammestørrelse',widthPx:'piksler',widthPc:'prosent',widthUnit:'Bredde-enhet',cellSpace:'Cellemarg',cellPad:'Cellepolstring',caption:'Tittel',summary:'Sammendrag',headers:'Overskrifter',headersNone:'Ingen',headersColumn:'Første kolonne',headersRow:'Første rad',headersBoth:'Begge',invalidRows:'Antall rader må være et tall større enn 0.',invalidCols:'Antall kolonner må være et tall større enn 0.',invalidBorder:'Rammestørrelse må være et tall.',invalidWidth:'Tabellbredde må være et tall.',invalidHeight:'Tabellhøyde må være et tall.',invalidCellSpacing:'Cellemarg må være et positivt tall.',invalidCellPadding:'Cellepolstring må være et positivt tall.',cell:{menu:'Celle',insertBefore:'Sett inn celle før',insertAfter:'Sett inn celle etter',deleteCell:'Slett celler',merge:'Slå sammen celler',mergeRight:'Slå sammen høyre',mergeDown:'Slå sammen ned',splitHorizontal:'Del celle horisontalt',splitVertical:'Del celle vertikalt',title:'Celleegenskaper',cellType:'Celletype',rowSpan:'Radspenn',colSpan:'Kolonnespenn',wordWrap:'Tekstbrytning',hAlign:'Horisontal justering',vAlign:'Vertikal justering',alignBaseline:'Grunnlinje',bgColor:'Bakgrunnsfarge',borderColor:'Rammefarge',data:'Data',header:'Overskrift',yes:'Ja',no:'Nei',invalidWidth:'Cellebredde må være et tall.',invalidHeight:'Cellehøyde må være et tall.',invalidRowSpan:'Radspenn må være et heltall.',invalidColSpan:'Kolonnespenn må være et heltall.',chooseColor:'Velg'},row:{menu:'Rader',insertBefore:'Sett inn rad før',insertAfter:'Sett inn rad etter',deleteRow:'Slett rader'},column:{menu:'Kolonne',insertBefore:'Sett inn kolonne før',insertAfter:'Sett inn kolonne etter',deleteColumn:'Slett kolonner'}},button:{title:'Egenskaper for knapp',text:'Tekst (verdi)',type:'Type',typeBtn:'Knapp',typeSbm:'Send',typeRst:'Nullstill'},checkboxAndRadio:{checkboxTitle:'Egenskaper for avmerkingsboks',radioTitle:'Egenskaper for alternativknapp',value:'Verdi',selected:'Valgt'},form:{title:'Egenskaper for skjema',menu:'Egenskaper for skjema',action:'Handling',method:'Metode',encoding:'Encoding'},select:{title:'Egenskaper for rullegardinliste',selectInfo:'Info',opAvail:'Tilgjenglige alternativer',value:'Verdi',size:'Størrelse',lines:'Linjer',chkMulti:'Tillat flervalg',opText:'Tekst',opValue:'Verdi',btnAdd:'Legg til',btnModify:'Endre',btnUp:'Opp',btnDown:'Ned',btnSetValue:'Sett som valgt',btnDelete:'Slett'},textarea:{title:'Egenskaper for tekstområde',cols:'Kolonner',rows:'Rader'},textfield:{title:'Egenskaper for tekstfelt',name:'Navn',value:'Verdi',charWidth:'Tegnbredde',maxChars:'Maks antall tegn',type:'Type',typeText:'Tekst',typePass:'Passord'},hidden:{title:'Egenskaper for skjult felt',name:'Navn',value:'Verdi'},image:{title:'Bildeegenskaper',titleButton:'Egenskaper for bildeknapp',menu:'Bildeegenskaper',infoTab:'Bildeinformasjon',btnUpload:'Send det til serveren',upload:'Last opp',alt:'Alternativ tekst',lockRatio:'Lås forhold',resetSize:'Tilbakestill størrelse',border:'Ramme',hSpace:'HMarg',vSpace:'VMarg',alertUrl:'Vennligst skriv bilde-urlen',linkTab:'Lenke',button2Img:'Vil du endre den valgte bildeknappen til et vanlig bilde?',img2Button:'Vil du endre det valgte bildet til en bildeknapp?',urlMissing:'Bildets adresse mangler.',validateBorder:'Ramme må være et heltall.',validateHSpace:'HMarg må være et heltall.',validateVSpace:'VMarg må være et heltall.'},flash:{properties:'Egenskaper for Flash-objekt',propertiesTab:'Egenskaper',title:'Flash-egenskaper',chkPlay:'Autospill',chkLoop:'Loop',chkMenu:'Slå på Flash-meny',chkFull:'Tillat fullskjerm',scale:'Skaler',scaleAll:'Vis alt',scaleNoBorder:'Ingen ramme',scaleFit:'Skaler til å passe',access:'Scripttilgang',accessAlways:'Alltid',accessSameDomain:'Samme domene',accessNever:'Aldri',alignAbsBottom:'Abs bunn',alignAbsMiddle:'Abs midten',alignBaseline:'Bunnlinje',alignTextTop:'Tekst topp',quality:'Kvalitet',qualityBest:'Best',qualityHigh:'Høy',qualityAutoHigh:'Auto høy',qualityMedium:'Medium',qualityAutoLow:'Auto lav',qualityLow:'Lav',windowModeWindow:'Vindu',windowModeOpaque:'Opaque',windowModeTransparent:'Gjennomsiktig',windowMode:'Vindumodus',flashvars:'Variabler for flash',bgcolor:'Bakgrunnsfarge',hSpace:'HMarg',vSpace:'VMarg',validateSrc:'Vennligst skriv inn lenkens url.',validateHSpace:'HMarg må være et tall.',validateVSpace:'VMarg må være et tall.'},spellCheck:{toolbar:'Stavekontroll',title:'Stavekontroll',notAvailable:'Beklager, tjenesten er utilgjenglig nå.',errorLoading:'Feil under lasting av applikasjonstjenestetjener: %s.',notInDic:'Ikke i ordboken',changeTo:'Endre til',btnIgnore:'Ignorer',btnIgnoreAll:'Ignorer alle',btnReplace:'Erstatt',btnReplaceAll:'Erstatt alle',btnUndo:'Angre',noSuggestions:'- Ingen forslag -',progress:'Stavekontroll pågår...',noMispell:'Stavekontroll fullført: ingen feilstavinger funnet',noChanges:'Stavekontroll fullført: ingen ord endret',oneChange:'Stavekontroll fullført: Ett ord endret',manyChanges:'Stavekontroll fullført: %1 ord endret',ieSpellDownload:'Stavekontroll er ikke installert. Vil du laste den ned nå?'},smiley:{toolbar:'Smil',title:'Sett inn smil',options:'Alternativer for smil'},elementsPath:{eleLabel:'Element-sti',eleTitle:'%1 element'},numberedlist:'Legg til/Fjern nummerert liste',bulletedlist:'Legg til/Fjern punktmerket liste',indent:'Øk innrykk',outdent:'Reduser innrykk',justify:{left:'Venstrejuster',center:'Midtstill',right:'Høyrejuster',block:'Blokkjuster'},blockquote:'Sitatblokk',clipboard:{title:'Lim inn',cutError:'Din nettlesers sikkerhetsinstillinger tillater ikke automatisk utklipping av tekst. Vennligst bruk snarveien (Ctrl/Cmd+X).',copyError:'Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk snarveien (Ctrl/Cmd+C).',pasteMsg:'Vennligst lim inn i følgende boks med tastaturet (<STRONG>Ctrl/Cmd+V</STRONG>) og trykk <STRONG>OK</STRONG>.',securityMsg:'Din nettlesers sikkerhetsinstillinger gir ikke redigeringsverktøyet direkte tilgang til utklippstavlen. Du må derfor lime det inn på nytt i dette vinduet.',pasteArea:'Innlimingsområde'},pastefromword:{confirmCleanup:'Teksten du limer inn ser ut til å være kopiert fra Word. Vil du renske den før du limer den inn?',toolbar:'Lim inn fra Word',title:'Lim inn fra Word',error:'Det var ikke mulig å renske den innlimte teksten på grunn av en intern feil'},pasteText:{button:'Lim inn som ren tekst',title:'Lim inn som ren tekst'},templates:{button:'Maler',title:'Innholdsmaler',options:'Alternativer for mal',insertOption:'Erstatt gjeldende innhold',selectPromptMsg:'Velg malen du vil åpne i redigeringsverktøyet:',emptyListMsg:'(Ingen maler definert)'},showBlocks:'Vis blokker',stylesCombo:{label:'Stil',panelTitle:'Stilformater',panelTitle1:'Blokkstiler',panelTitle2:'Inlinestiler',panelTitle3:'Objektstiler'},format:{label:'Format',panelTitle:'Avsnittsformat',tag_p:'Normal',tag_pre:'Formatert',tag_address:'Adresse',tag_h1:'Overskrift 1',tag_h2:'Overskrift 2',tag_h3:'Overskrift 3',tag_h4:'Overskrift 4',tag_h5:'Overskrift 5',tag_h6:'Overskrift 6',tag_div:'Normal (DIV)'},div:{title:'Sett inn Div Container',toolbar:'Sett inn Div Container',cssClassInputLabel:'Stilark-klasser',styleSelectLabel:'Stil',IdInputLabel:'Id',languageCodeInputLabel:' Språkkode',inlineStyleInputLabel:'Inlinestiler',advisoryTitleInputLabel:'Tittel',langDirLabel:'Språkretning',langDirLTRLabel:'Venstre til høyre (VTH)',langDirRTLLabel:'Høyre til venstre (HTV)',edit:'Rediger Div',remove:'Fjern Div'},iframe:{title:'Egenskaper for IFrame',toolbar:'IFrame',noUrl:'Vennligst skriv inn URL for iframe',scrolling:'Aktiver scrollefelt',border:'Viss ramme rundt iframe'},font:{label:'Skrift',voiceLabel:'Font',panelTitle:'Skrift'},fontSize:{label:'Størrelse',voiceLabel:'Font Størrelse',panelTitle:'Størrelse'},colorButton:{textColorTitle:'Tekstfarge',bgColorTitle:'Bakgrunnsfarge',panelTitle:'Farger',auto:'Automatisk',more:'Flere farger...'},colors:{'000':'Svart',800000:'Rødbrun','8B4513':'Salbrun','2F4F4F':'Grønnsvart','008080':'Blågrønn','000080':'Marineblått','4B0082':'Indigo',696969:'Mørk grå',B22222:'Mørkerød',A52A2A:'Brun',DAA520:'Lys brun','006400':'Mørk grønn','40E0D0':'Turkis','0000CD':'Medium blå',800080:'Purpur',808080:'Grå',F00:'Rød',FF8C00:'Mørk oransje',FFD700:'Gull','008000':'Grønn','0FF':'Cyan','00F':'Blå',EE82EE:'Fiolett',A9A9A9:'Svak grå',FFA07A:'Rosa-oransje',FFA500:'Oransje',FFFF00:'Gul','00FF00':'Lime',AFEEEE:'Svak turkis',ADD8E6:'Lys Blå',DDA0DD:'Plomme',D3D3D3:'Lys grå',FFF0F5:'Svak lavendelrosa',FAEBD7:'Antikk-hvit',FFFFE0:'Lys gul',F0FFF0:'Honningmelon',F0FFFF:'Svakt asurblått',F0F8FF:'Svak cyan',E6E6FA:'Lavendel',FFF:'Hvit'},scayt:{title:'Stavekontroll mens du skriver',opera_title:'Ikke støttet av Opera',enable:'Slå på SCAYT',disable:'Slå av SCAYT',about:'Om SCAYT',toggle:'Veksle SCAYT',options:'Valg',langs:'Språk',moreSuggestions:'Flere forslag',ignore:'Ignorer',ignoreAll:'Ignorer Alle',addWord:'Legg til ord',emptyDic:'Ordboknavn bør ikke være tom.',optionsTab:'Valg',allCaps:'Ikke kontroller ord med kun store bokstaver',ignoreDomainNames:'Ikke kontroller domenenavn',mixedCase:'Ikke kontroller ord med blandet små og store bokstaver',mixedWithDigits:'Ikke kontroller ord som inneholder tall',languagesTab:'Språk',dictionariesTab:'Ordbøker',dic_field_name:'Ordboknavn',dic_create:'Opprett',dic_restore:'Gjenopprett',dic_delete:'Slett',dic_rename:'Gi nytt navn',dic_info:'Brukerordboken lagres først i en informasjonskapsel på din maskin, men det er en begrensning på hvor mye som kan lagres her. Når ordboken blir for stor til å lagres i en informasjonskapsel, vil vi i stedet lagre ordboken på vår server. For å lagre din personlige ordbok på vår server, burde du velge et navn for ordboken din. Hvis du allerede har lagret en ordbok, vennligst skriv inn ordbokens navn og klikk på Gjenopprett-knappen.',aboutTab:'Om'},about:{title:'Om CKEditor',dlgTitle:'Om CKEditor',help:'Se $1 for hjelp.',userGuide:'CKEditors brukerveiledning',moreInfo:'For lisensieringsinformasjon, vennligst besøk vårt nettsted:',copy:'Copyright © $1. Alle rettigheter reservert.'},maximize:'Maksimer',minimize:'Minimer',fakeobjects:{anchor:'Anker',flash:'Flash-animasjon',iframe:'IFrame',hiddenfield:'Skjult felt',unknown:'Ukjent objekt'},resize:'Dra for å skalere',colordialog:{title:'Velg farge',options:'Alternativer for farge',highlight:'Merk',selected:'Valgt',clear:'Tøm'},toolbarCollapse:'Skjul verktøylinje',toolbarExpand:'Vis verktøylinje',toolbarGroups:{document:'Dokument',clipboard:'Utklippstavle/Angre',editing:'Redigering',forms:'Skjema',basicstyles:'Basisstiler',paragraph:'Avsnitt',links:'Lenker',insert:'Innsetting',styles:'Stiler',colors:'Farger',tools:'Verktøy'},bidi:{ltr:'Tekstretning fra venstre til høyre',rtl:'Tekstretning fra høyre til venstre'},docprops:{label:'Dokumentegenskaper',title:'Dokumentegenskaper',design:'Design',meta:'Meta-data',chooseColor:'Velg',other:'<annen>',docTitle:'Sidetittel',charset:'Tegnsett',charsetOther:'Annet tegnsett',charsetASCII:'ASCII',charsetCE:'Sentraleuropeisk',charsetCT:'Tradisonell kinesisk(Big5)',charsetCR:'Kyrillisk',charsetGR:'Gresk',charsetJP:'Japansk',charsetKR:'Koreansk',charsetTR:'Tyrkisk',charsetUN:'Unicode (UTF-8)',charsetWE:'Vesteuropeisk',docType:'Dokumenttype header',docTypeOther:'Annet dokumenttype header',xhtmlDec:'Inkluder XHTML-deklarasjon',bgColor:'Bakgrunnsfarge',bgImage:'URL for bakgrunnsbilde',bgFixed:'Lås bakgrunnsbilde',txtColor:'Tekstfarge',margin:'Sidemargin',marginTop:'Topp',marginLeft:'Venstre',marginRight:'Høyre',marginBottom:'Bunn',metaKeywords:'Dokument nøkkelord (kommaseparert)',metaDescription:'Dokumentbeskrivelse',metaAuthor:'Forfatter',metaCopyright:'Kopirett',previewHtml:'<p>Dette er en <strong>eksempeltekst</strong>. Du bruker <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.no={dir:'ltr',editorTitle:'Rikteksteditor, %1',editorHelp:'Trykk ALT 0 for hjelp',toolbars:'Verktøylinjer for editor',editor:'Rikteksteditor',source:'Kilde',newPage:'Ny side',save:'Lagre',preview:'Forhåndsvis',cut:'Klipp ut',copy:'Kopier',paste:'Lim inn',print:'Skriv ut',underline:'Understreking',bold:'Fet',italic:'Kursiv',selectAll:'Merk alt',removeFormat:'Fjern formatering',strike:'Gjennomstreking',subscript:'Senket skrift',superscript:'Hevet skrift',horizontalrule:'Sett inn horisontal linje',pagebreak:'Sett inn sideskift for utskrift',pagebreakAlt:'Sideskift',unlink:'Fjern lenke',undo:'Angre',redo:'Gjør om',common:{browseServer:'Bla igjennom server',url:'URL',protocol:'Protokoll',upload:'Last opp',uploadSubmit:'Send det til serveren',image:'Bilde',flash:'Flash',form:'Skjema',checkbox:'Avmerkingsboks',radio:'Alternativknapp',textField:'Tekstboks',textarea:'Tekstområde',hiddenField:'Skjult felt',button:'Knapp',select:'Rullegardinliste',imageButton:'Bildeknapp',notSet:'<ikke satt>',id:'Id',name:'Navn',langDir:'Språkretning',langDirLtr:'Venstre til høyre (VTH)',langDirRtl:'Høyre til venstre (HTV)',langCode:'Språkkode',longDescr:'Utvidet beskrivelse',cssClass:'Stilarkklasser',advisoryTitle:'Tittel',cssStyle:'Stil',ok:'OK',cancel:'Avbryt',close:'Lukk',preview:'Forhåndsvis',generalTab:'Generelt',advancedTab:'Avansert',validateNumberFailed:'Denne verdien er ikke et tall.',confirmNewPage:'Alle ulagrede endringer som er gjort i dette innholdet vil bli tapt. Er du sikker på at du vil laste en ny side?',confirmCancel:'Noen av valgene har blitt endret. Er du sikker på at du vil lukke dialogen?',options:'Valg',target:'Mål',targetNew:'Nytt vindu (_blank)',targetTop:'Hele vindu (_top)',targetSelf:'Samme vindu (_self)',targetParent:'Foreldrevindu (_parent)',langDirLTR:'Venstre til høyre (VTH)',langDirRTL:'Høyre til venstre (HTV)',styles:'Stil',cssClasses:'Stilarkklasser',width:'Bredde',height:'Høyde',align:'Juster',alignLeft:'Venstre',alignRight:'Høyre',alignCenter:'Midtjuster',alignTop:'Topp',alignMiddle:'Midten',alignBottom:'Bunn',invalidHeight:'Høyde må være et tall.',invalidWidth:'Bredde må være et tall.',invalidCssLength:'Den angitte verdien for feltet "%1" må være et positivt tall med eller uten en gyldig CSS-målingsenhet (px, %, in, cm, mm, em, ex, pt, eller pc).',invalidHtmlLength:'Den angitte verdien for feltet "%1" må være et positivt tall med eller uten en gyldig HTML-målingsenhet (px eller %).',invalidInlineStyle:'Verdi angitt for inline stil må bestå av en eller flere sett med formatet "navn : verdi", separert med semikolon',cssLengthTooltip:'Skriv inn et tall for en piksel-verdi eller et tall med en gyldig CSS-enhet (px, %, in, cm, mm, em, ex, pt, eller pc).',unavailable:'%1<span class="cke_accessibility">, utilgjenglig</span>'},contextmenu:{options:'Alternativer for høyreklikkmeny'},specialChar:{toolbar:'Sett inn spesialtegn',title:'Velg spesialtegn',options:'Alternativer for spesialtegn'},link:{toolbar:'Sett inn/Rediger lenke',other:'<annen>',menu:'Rediger lenke',title:'Lenke',info:'Lenkeinfo',target:'Mål',upload:'Last opp',advanced:'Avansert',type:'Lenketype',toUrl:'URL',toAnchor:'Lenke til anker i teksten',toEmail:'E-post',targetFrame:'<ramme>',targetPopup:'<popup-vindu>',targetFrameName:'Målramme',targetPopupName:'Navn på popup-vindu',popupFeatures:'Egenskaper for popup-vindu',popupResizable:'Skalerbar',popupStatusBar:'Statuslinje',popupLocationBar:'Adresselinje',popupToolbar:'Verktøylinje',popupMenuBar:'Menylinje',popupFullScreen:'Fullskjerm (IE)',popupScrollBars:'Scrollbar',popupDependent:'Avhenging (Netscape)',popupLeft:'Venstre posisjon',popupTop:'Topp-posisjon',id:'Id',langDir:'Språkretning',langDirLTR:'Venstre til høyre (VTH)',langDirRTL:'Høyre til venstre (HTV)',acccessKey:'Aksessknapp',name:'Navn',langCode:'Språkkode',tabIndex:'Tabindeks',advisoryTitle:'Tittel',advisoryContentType:'Type',cssClasses:'Stilarkklasser',charset:'Lenket tegnsett',styles:'Stil',rel:'Relasjon (rel)',selectAnchor:'Velg et anker',anchorName:'Anker etter navn',anchorId:'Element etter ID',emailAddress:'E-postadresse',emailSubject:'Meldingsemne',emailBody:'Melding',noAnchors:'(Ingen anker i dokumentet)',noUrl:'Vennligst skriv inn lenkens URL',noEmail:'Vennligst skriv inn e-postadressen'},anchor:{toolbar:'Sett inn/Rediger anker',menu:'Egenskaper for anker',title:'Egenskaper for anker',name:'Ankernavn',errorName:'Vennligst skriv inn ankernavnet',remove:'Fjern anker'},list:{numberedTitle:'Egenskaper for nummerert liste',bulletedTitle:'Egenskaper for punktmerket liste',type:'Type',start:'Start',validateStartNumber:'Starten på listen må være et heltall.',circle:'Sirkel',disc:'Disk',square:'Firkant',none:'Ingen',notset:'<ikke satt>',armenian:'Armensk nummerering',georgian:'Georgisk nummerering (an, ban, gan, osv.)',lowerRoman:'Romertall, små (i, ii, iii, iv, v, osv.)',upperRoman:'Romertall, store (I, II, III, IV, V, osv.)',lowerAlpha:'Alfabetisk, små (a, b, c, d, e, osv.)',upperAlpha:'Alfabetisk, store (A, B, C, D, E, osv.)',lowerGreek:'Gresk, små (alpha, beta, gamma, osv.)',decimal:'Tall (1, 2, 3, osv.)',decimalLeadingZero:'Tall, med førstesiffer null (01, 02, 03, osv.)'},findAndReplace:{title:'Søk og erstatt',find:'Søk',replace:'Erstatt',findWhat:'Søk etter:',replaceWith:'Erstatt med:',notFoundMsg:'Fant ikke søketeksten.',findOptions:'Søkealternativer',matchCase:'Skill mellom store og små bokstaver',matchWord:'Bare hele ord',matchCyclic:'Søk i hele dokumentet',replaceAll:'Erstatt alle',replaceSuccessMsg:'%1 tilfelle(r) erstattet.'},table:{toolbar:'Tabell',title:'Egenskaper for tabell',menu:'Egenskaper for tabell',deleteTable:'Slett tabell',rows:'Rader',columns:'Kolonner',border:'Rammestørrelse',widthPx:'piksler',widthPc:'prosent',widthUnit:'Bredde-enhet',cellSpace:'Cellemarg',cellPad:'Cellepolstring',caption:'Tittel',summary:'Sammendrag',headers:'Overskrifter',headersNone:'Ingen',headersColumn:'Første kolonne',headersRow:'Første rad',headersBoth:'Begge',invalidRows:'Antall rader må være et tall større enn 0.',invalidCols:'Antall kolonner må være et tall større enn 0.',invalidBorder:'Rammestørrelse må være et tall.',invalidWidth:'Tabellbredde må være et tall.',invalidHeight:'Tabellhøyde må være et tall.',invalidCellSpacing:'Cellemarg må være et positivt tall.',invalidCellPadding:'Cellepolstring må være et positivt tall.',cell:{menu:'Celle',insertBefore:'Sett inn celle før',insertAfter:'Sett inn celle etter',deleteCell:'Slett celler',merge:'Slå sammen celler',mergeRight:'Slå sammen høyre',mergeDown:'Slå sammen ned',splitHorizontal:'Del celle horisontalt',splitVertical:'Del celle vertikalt',title:'Celleegenskaper',cellType:'Celletype',rowSpan:'Radspenn',colSpan:'Kolonnespenn',wordWrap:'Tekstbrytning',hAlign:'Horisontal justering',vAlign:'Vertikal justering',alignBaseline:'Grunnlinje',bgColor:'Bakgrunnsfarge',borderColor:'Rammefarge',data:'Data',header:'Overskrift',yes:'Ja',no:'Nei',invalidWidth:'Cellebredde må være et tall.',invalidHeight:'Cellehøyde må være et tall.',invalidRowSpan:'Radspenn må være et heltall.',invalidColSpan:'Kolonnespenn må være et heltall.',chooseColor:'Velg'},row:{menu:'Rader',insertBefore:'Sett inn rad før',insertAfter:'Sett inn rad etter',deleteRow:'Slett rader'},column:{menu:'Kolonne',insertBefore:'Sett inn kolonne før',insertAfter:'Sett inn kolonne etter',deleteColumn:'Slett kolonner'}},button:{title:'Egenskaper for knapp',text:'Tekst (verdi)',type:'Type',typeBtn:'Knapp',typeSbm:'Send',typeRst:'Nullstill'},checkboxAndRadio:{checkboxTitle:'Egenskaper for avmerkingsboks',radioTitle:'Egenskaper for alternativknapp',value:'Verdi',selected:'Valgt'},form:{title:'Egenskaper for skjema',menu:'Egenskaper for skjema',action:'Handling',method:'Metode',encoding:'Encoding'},select:{title:'Egenskaper for rullegardinliste',selectInfo:'Info',opAvail:'Tilgjenglige alternativer',value:'Verdi',size:'Størrelse',lines:'Linjer',chkMulti:'Tillat flervalg',opText:'Tekst',opValue:'Verdi',btnAdd:'Legg til',btnModify:'Endre',btnUp:'Opp',btnDown:'Ned',btnSetValue:'Sett som valgt',btnDelete:'Slett'},textarea:{title:'Egenskaper for tekstområde',cols:'Kolonner',rows:'Rader'},textfield:{title:'Egenskaper for tekstfelt',name:'Navn',value:'Verdi',charWidth:'Tegnbredde',maxChars:'Maks antall tegn',type:'Type',typeText:'Tekst',typePass:'Passord'},hidden:{title:'Egenskaper for skjult felt',name:'Navn',value:'Verdi'},image:{title:'Bildeegenskaper',titleButton:'Egenskaper for bildeknapp',menu:'Bildeegenskaper',infoTab:'Bildeinformasjon',btnUpload:'Send det til serveren',upload:'Last opp',alt:'Alternativ tekst',lockRatio:'Lås forhold',resetSize:'Tilbakestill størrelse',border:'Ramme',hSpace:'HMarg',vSpace:'VMarg',alertUrl:'Vennligst skriv bilde-urlen',linkTab:'Lenke',button2Img:'Vil du endre den valgte bildeknappen til et vanlig bilde?',img2Button:'Vil du endre det valgte bildet til en bildeknapp?',urlMissing:'Bildets adresse mangler.',validateBorder:'Ramme må være et heltall.',validateHSpace:'HMarg må være et heltall.',validateVSpace:'VMarg må være et heltall.'},flash:{properties:'Egenskaper for Flash-objekt',propertiesTab:'Egenskaper',title:'Flash-egenskaper',chkPlay:'Autospill',chkLoop:'Loop',chkMenu:'Slå på Flash-meny',chkFull:'Tillat fullskjerm',scale:'Skaler',scaleAll:'Vis alt',scaleNoBorder:'Ingen ramme',scaleFit:'Skaler til å passe',access:'Scripttilgang',accessAlways:'Alltid',accessSameDomain:'Samme domene',accessNever:'Aldri',alignAbsBottom:'Abs bunn',alignAbsMiddle:'Abs midten',alignBaseline:'Bunnlinje',alignTextTop:'Tekst topp',quality:'Kvalitet',qualityBest:'Best',qualityHigh:'Høy',qualityAutoHigh:'Auto høy',qualityMedium:'Medium',qualityAutoLow:'Auto lav',qualityLow:'Lav',windowModeWindow:'Vindu',windowModeOpaque:'Opaque',windowModeTransparent:'Gjennomsiktig',windowMode:'Vindumodus',flashvars:'Variabler for flash',bgcolor:'Bakgrunnsfarge',hSpace:'HMarg',vSpace:'VMarg',validateSrc:'Vennligst skriv inn lenkens url.',validateHSpace:'HMarg må være et tall.',validateVSpace:'VMarg må være et tall.'},spellCheck:{toolbar:'Stavekontroll',title:'Stavekontroll',notAvailable:'Beklager, tjenesten er utilgjenglig nå.',errorLoading:'Feil under lasting av applikasjonstjenestetjener: %s.',notInDic:'Ikke i ordboken',changeTo:'Endre til',btnIgnore:'Ignorer',btnIgnoreAll:'Ignorer alle',btnReplace:'Erstatt',btnReplaceAll:'Erstatt alle',btnUndo:'Angre',noSuggestions:'- Ingen forslag -',progress:'Stavekontroll pågår...',noMispell:'Stavekontroll fullført: ingen feilstavinger funnet',noChanges:'Stavekontroll fullført: ingen ord endret',oneChange:'Stavekontroll fullført: Ett ord endret',manyChanges:'Stavekontroll fullført: %1 ord endret',ieSpellDownload:'Stavekontroll er ikke installert. Vil du laste den ned nå?'},smiley:{toolbar:'Smil',title:'Sett inn smil',options:'Alternativer for smil'},elementsPath:{eleLabel:'Element-sti',eleTitle:'%1 element'},numberedlist:'Legg til/Fjern nummerert liste',bulletedlist:'Legg til/Fjern punktmerket liste',indent:'Øk innrykk',outdent:'Reduser innrykk',justify:{left:'Venstrejuster',center:'Midtstill',right:'Høyrejuster',block:'Blokkjuster'},blockquote:'Sitatblokk',clipboard:{title:'Lim inn',cutError:'Din nettlesers sikkerhetsinstillinger tillater ikke automatisk utklipping av tekst. Vennligst bruk snarveien (Ctrl/Cmd+X).',copyError:'Din nettlesers sikkerhetsinstillinger tillater ikke automatisk kopiering av tekst. Vennligst bruk snarveien (Ctrl/Cmd+C).',pasteMsg:'Vennligst lim inn i følgende boks med tastaturet (<STRONG>Ctrl/Cmd+V</STRONG>) og trykk <STRONG>OK</STRONG>.',securityMsg:'Din nettlesers sikkerhetsinstillinger gir ikke redigeringsverktøyet direkte tilgang til utklippstavlen. Du må derfor lime det inn på nytt i dette vinduet.',pasteArea:'Innlimingsområde'},pastefromword:{confirmCleanup:'Teksten du limer inn ser ut til å være kopiert fra Word. Vil du renske den før du limer den inn?',toolbar:'Lim inn fra Word',title:'Lim inn fra Word',error:'Det var ikke mulig å renske den innlimte teksten på grunn av en intern feil'},pasteText:{button:'Lim inn som ren tekst',title:'Lim inn som ren tekst'},templates:{button:'Maler',title:'Innholdsmaler',options:'Alternativer for mal',insertOption:'Erstatt gjeldende innhold',selectPromptMsg:'Velg malen du vil åpne i redigeringsverktøyet:',emptyListMsg:'(Ingen maler definert)'},showBlocks:'Vis blokker',stylesCombo:{label:'Stil',panelTitle:'Stilformater',panelTitle1:'Blokkstiler',panelTitle2:'Inlinestiler',panelTitle3:'Objektstiler'},format:{label:'Format',panelTitle:'Avsnittsformat',tag_p:'Normal',tag_pre:'Formatert',tag_address:'Adresse',tag_h1:'Overskrift 1',tag_h2:'Overskrift 2',tag_h3:'Overskrift 3',tag_h4:'Overskrift 4',tag_h5:'Overskrift 5',tag_h6:'Overskrift 6',tag_div:'Normal (DIV)'},div:{title:'Sett inn Div Container',toolbar:'Sett inn Div Container',cssClassInputLabel:'Stilark-klasser',styleSelectLabel:'Stil',IdInputLabel:'Id',languageCodeInputLabel:' Språkkode',inlineStyleInputLabel:'Inlinestiler',advisoryTitleInputLabel:'Tittel',langDirLabel:'Språkretning',langDirLTRLabel:'Venstre til høyre (VTH)',langDirRTLLabel:'Høyre til venstre (HTV)',edit:'Rediger Div',remove:'Fjern Div'},iframe:{title:'Egenskaper for IFrame',toolbar:'IFrame',noUrl:'Vennligst skriv inn URL for iframe',scrolling:'Aktiver scrollefelt',border:'Viss ramme rundt iframe'},font:{label:'Skrift',voiceLabel:'Font',panelTitle:'Skrift'},fontSize:{label:'Størrelse',voiceLabel:'Font Størrelse',panelTitle:'Størrelse'},colorButton:{textColorTitle:'Tekstfarge',bgColorTitle:'Bakgrunnsfarge',panelTitle:'Farger',auto:'Automatisk',more:'Flere farger...'},colors:{'000':'Svart',800000:'Rødbrun','8B4513':'Salbrun','2F4F4F':'Grønnsvart','008080':'Blågrønn','000080':'Marineblått','4B0082':'Indigo',696969:'Mørk grå',B22222:'Mørkerød',A52A2A:'Brun',DAA520:'Lys brun','006400':'Mørk grønn','40E0D0':'Turkis','0000CD':'Medium blå',800080:'Purpur',808080:'Grå',F00:'Rød',FF8C00:'Mørk oransje',FFD700:'Gull','008000':'Grønn','0FF':'Cyan','00F':'Blå',EE82EE:'Fiolett',A9A9A9:'Svak grå',FFA07A:'Rosa-oransje',FFA500:'Oransje',FFFF00:'Gul','00FF00':'Lime',AFEEEE:'Svak turkis',ADD8E6:'Lys Blå',DDA0DD:'Plomme',D3D3D3:'Lys grå',FFF0F5:'Svak lavendelrosa',FAEBD7:'Antikk-hvit',FFFFE0:'Lys gul',F0FFF0:'Honningmelon',F0FFFF:'Svakt asurblått',F0F8FF:'Svak cyan',E6E6FA:'Lavendel',FFF:'Hvit'},scayt:{title:'Stavekontroll mens du skriver',opera_title:'Ikke støttet av Opera',enable:'Slå på SCAYT',disable:'Slå av SCAYT',about:'Om SCAYT',toggle:'Veksle SCAYT',options:'Valg',langs:'Språk',moreSuggestions:'Flere forslag',ignore:'Ignorer',ignoreAll:'Ignorer Alle',addWord:'Legg til ord',emptyDic:'Ordboknavn bør ikke være tom.',optionsTab:'Valg',allCaps:'Ikke kontroller ord med kun store bokstaver',ignoreDomainNames:'Ikke kontroller domenenavn',mixedCase:'Ikke kontroller ord med blandet små og store bokstaver',mixedWithDigits:'Ikke kontroller ord som inneholder tall',languagesTab:'Språk',dictionariesTab:'Ordbøker',dic_field_name:'Ordboknavn',dic_create:'Opprett',dic_restore:'Gjenopprett',dic_delete:'Slett',dic_rename:'Gi nytt navn',dic_info:'Brukerordboken lagres først i en informasjonskapsel på din maskin, men det er en begrensning på hvor mye som kan lagres her. Når ordboken blir for stor til å lagres i en informasjonskapsel, vil vi i stedet lagre ordboken på vår server. For å lagre din personlige ordbok på vår server, burde du velge et navn for ordboken din. Hvis du allerede har lagret en ordbok, vennligst skriv inn ordbokens navn og klikk på Gjenopprett-knappen.',aboutTab:'Om'},about:{title:'Om CKEditor',dlgTitle:'Om CKEditor',help:'Se $1 for hjelp.',userGuide:'CKEditors brukerveiledning',moreInfo:'For lisensieringsinformasjon, vennligst besøk vårt nettsted:',copy:'Copyright © $1. Alle rettigheter reservert.'},maximize:'Maksimer',minimize:'Minimer',fakeobjects:{anchor:'Anker',flash:'Flash-animasjon',iframe:'IFrame',hiddenfield:'Skjult felt',unknown:'Ukjent objekt'},resize:'Dra for å skalere',colordialog:{title:'Velg farge',options:'Alternativer for farge',highlight:'Merk',selected:'Valgt',clear:'Tøm'},toolbarCollapse:'Skjul verktøylinje',toolbarExpand:'Vis verktøylinje',toolbarGroups:{document:'Dokument',clipboard:'Utklippstavle/Angre',editing:'Redigering',forms:'Skjema',basicstyles:'Basisstiler',paragraph:'Avsnitt',links:'Lenker',insert:'Innsetting',styles:'Stiler',colors:'Farger',tools:'Verktøy'},bidi:{ltr:'Tekstretning fra venstre til høyre',rtl:'Tekstretning fra høyre til venstre'},docprops:{label:'Dokumentegenskaper',title:'Dokumentegenskaper',design:'Design',meta:'Meta-data',chooseColor:'Velg',other:'<annen>',docTitle:'Sidetittel',charset:'Tegnsett',charsetOther:'Annet tegnsett',charsetASCII:'ASCII',charsetCE:'Sentraleuropeisk',charsetCT:'Tradisonell kinesisk(Big5)',charsetCR:'Kyrillisk',charsetGR:'Gresk',charsetJP:'Japansk',charsetKR:'Koreansk',charsetTR:'Tyrkisk',charsetUN:'Unicode (UTF-8)',charsetWE:'Vesteuropeisk',docType:'Dokumenttype header',docTypeOther:'Annet dokumenttype header',xhtmlDec:'Inkluder XHTML-deklarasjon',bgColor:'Bakgrunnsfarge',bgImage:'URL for bakgrunnsbilde',bgFixed:'Lås bakgrunnsbilde',txtColor:'Tekstfarge',margin:'Sidemargin',marginTop:'Topp',marginLeft:'Venstre',marginRight:'Høyre',marginBottom:'Bunn',metaKeywords:'Dokument nøkkelord (kommaseparert)',metaDescription:'Dokumentbeskrivelse',metaAuthor:'Forfatter',metaCopyright:'Kopirett',previewHtml:'<p>Dette er en <strong>eksempeltekst</strong>. Du bruker <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/pl.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/pl.js
index 5cf7cd9..62613b5 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/pl.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/pl.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.pl={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Paski narzędzi edytora',editor:'Edytor tekstu sformatowanego',source:'Źródło dokumentu',newPage:'Nowa strona',save:'Zapisz',preview:'Podgląd',cut:'Wytnij',copy:'Kopiuj',paste:'Wklej',print:'Drukuj',underline:'Podkreślenie',bold:'Pogrubienie',italic:'Kursywa',selectAll:'Zaznacz wszystko',removeFormat:'Usuń formatowanie',strike:'Przekreślenie',subscript:'Indeks dolny',superscript:'Indeks górny',horizontalrule:'Wstaw poziomą linię',pagebreak:'Wstaw podział strony',pagebreakAlt:'Wstaw podział strony',unlink:'Usuń odnośnik',undo:'Cofnij',redo:'Ponów',common:{browseServer:'Przeglądaj',url:'Adres URL',protocol:'Protokół',upload:'Wyślij',uploadSubmit:'Wyślij',image:'Obrazek',flash:'Flash',form:'Formularz',checkbox:'Pole wyboru (checkbox)',radio:'Przycisk opcji (radio)',textField:'Pole tekstowe',textarea:'Obszar tekstowy',hiddenField:'Pole ukryte',button:'Przycisk',select:'Lista wyboru',imageButton:'Przycisk graficzny',notSet:'<nie ustawiono>',id:'Id',name:'Nazwa',langDir:'Kierunek tekstu',langDirLtr:'Od lewej do prawej (LTR)',langDirRtl:'Od prawej do lewej (RTL)',langCode:'Kod języka',longDescr:'Adres URL długiego opisu',cssClass:'Nazwa klasy CSS',advisoryTitle:'Opis obiektu docelowego',cssStyle:'Styl',ok:'OK',cancel:'Anuluj',close:'Zamknij',preview:'Podgląd',generalTab:'Ogólne',advancedTab:'Zaawansowane',validateNumberFailed:'Ta wartość nie jest liczbą.',confirmNewPage:'Wszystkie niezapisane zmiany zostaną utracone. Czy na pewno wczytać nową stronę?',confirmCancel:'Pewne opcje zostały zmienione. Czy na pewno zamknąć okno dialogowe?',options:'Opcje',target:'Obiekt docelowy',targetNew:'Nowe okno (_blank)',targetTop:'Okno najwyżej w hierarchii (_top)',targetSelf:'To samo okno (_self)',targetParent:'Okno nadrzędne (_parent)',langDirLTR:'Od lewej do prawej (LTR)',langDirRTL:'Od prawej do lewej (RTL)',styles:'Style',cssClasses:'Klasy arkusza stylów',width:'Szerokość',height:'Wysokość',align:'Wyrównaj',alignLeft:'Do lewej',alignRight:'Do prawej',alignCenter:'Do środka',alignTop:'Do góry',alignMiddle:'Do środka',alignBottom:'Do dołu',invalidHeight:'Wysokość musi być liczbą.',invalidWidth:'Szerokość musi być liczbą.',invalidCssLength:'Wartość podana dla pola "%1" musi być liczbą dodatnią bez jednostki lub z poprawną jednostką długości zgodną z CSS (px, %, in, cm, mm, em, ex, pt lub pc).',invalidHtmlLength:'Wartość podana dla pola "%1" musi być liczbą dodatnią bez jednostki lub z poprawną jednostką długości zgodną z HTML (px lub %).',invalidInlineStyle:'Wartość podana dla stylu musi składać się z jednej lub większej liczby krotek w formacie "nazwa : wartość", rozdzielonych średnikami.',cssLengthTooltip:'Wpisz liczbę dla wartości w pikselach lub liczbę wraz z jednostką długości zgodną z CSS (px, %, in, cm, mm, em, ex, pt lub pc).',unavailable:'%1<span class="cke_accessibility">, niedostępne</span>'},contextmenu:{options:'Opcje menu kontekstowego'},specialChar:{toolbar:'Wstaw znak specjalny',title:'Wybierz znak specjalny',options:'Opcje znaków specjalnych'},link:{toolbar:'Wstaw/edytuj odnośnik',other:'<inny>',menu:'Edytuj odnośnik',title:'Odnośnik',info:'Informacje ',target:'Obiekt docelowy',upload:'Wyślij',advanced:'Zaawansowane',type:'Typ odnośnika',toUrl:'Adres URL',toAnchor:'Odnośnik wewnątrz strony (kotwica)',toEmail:'Adres e-mail',targetFrame:'<ramka>',targetPopup:'<wyskakujące okno>',targetFrameName:'Nazwa ramki docelowej',targetPopupName:'Nazwa wyskakującego okna',popupFeatures:'Właściwości wyskakującego okna',popupResizable:'Skalowalny',popupStatusBar:'Pasek statusu',popupLocationBar:'Pasek adresu',popupToolbar:'Pasek narzędzi',popupMenuBar:'Pasek menu',popupFullScreen:'Pełny ekran (IE)',popupScrollBars:'Paski przewijania',popupDependent:'Okno zależne (Netscape)',popupLeft:'Pozycja w poziomie',popupTop:'Pozycja w pionie',id:'Id',langDir:'Kierunek tekstu',langDirLTR:'Od lewej do prawej (LTR)',langDirRTL:'Od prawej do lewej (RTL)',acccessKey:'Klawisz dostępu',name:'Nazwa',langCode:'Kod języka',tabIndex:'Indeks kolejności',advisoryTitle:'Opis obiektu docelowego',advisoryContentType:'Typ MIME obiektu docelowego',cssClasses:'Nazwa klasy CSS',charset:'Kodowanie znaków obiektu docelowego',styles:'Styl',rel:'Relacja',selectAnchor:'Wybierz kotwicę',anchorName:'Wg nazwy',anchorId:'Wg identyfikatora',emailAddress:'Adres e-mail',emailSubject:'Temat',emailBody:'Treść',noAnchors:'(W dokumencie nie zdefiniowano żadnych kotwic)',noUrl:'Podaj adres URL',noEmail:'Podaj adres e-mail'},anchor:{toolbar:'Wstaw/edytuj kotwicę',menu:'Właściwości kotwicy',title:'Właściwości kotwicy',name:'Nazwa kotwicy',errorName:'Wpisz nazwę kotwicy',remove:'Usuń kotwicę'},list:{numberedTitle:'Właściwości list numerowanych',bulletedTitle:'Właściwości list wypunktowanych',type:'Typ punktora',start:'Początek',validateStartNumber:'Listę musi rozpoczynać liczba całkowita.',circle:'Koło',disc:'Okrąg',square:'Kwadrat',none:'Brak',notset:'<nie ustawiono>',armenian:'Numerowanie armeńskie',georgian:'Numerowanie gruzińskie (an, ban, gan itd.)',lowerRoman:'Małe cyfry rzymskie (i, ii, iii, iv, v itd.)',upperRoman:'Duże cyfry rzymskie (I, II, III, IV, V itd.)',lowerAlpha:'Małe litery (a, b, c, d, e itd.)',upperAlpha:'Duże litery (A, B, C, D, E itd.)',lowerGreek:'Małe litery greckie (alpha, beta, gamma itd.)',decimal:'Liczby (1, 2, 3 itd.)',decimalLeadingZero:'Liczby z początkowym zerem (01, 02, 03 itd.)'},findAndReplace:{title:'Znajdź i zamień',find:'Znajdź',replace:'Zamień',findWhat:'Znajdź:',replaceWith:'Zastąp przez:',notFoundMsg:'Nie znaleziono szukanego hasła.',findOptions:'Opcje wyszukiwania',matchCase:'Uwzględnij wielkość liter',matchWord:'Całe słowa',matchCyclic:'Cykliczne dopasowanie',replaceAll:'Zamień wszystko',replaceSuccessMsg:'%1 wystąpień zastąpionych.'},table:{toolbar:'Tabela',title:'Właściwości tabeli',menu:'Właściwości tabeli',deleteTable:'Usuń tabelę',rows:'Liczba wierszy',columns:'Liczba kolumn',border:'Grubość obramowania',widthPx:'piksele',widthPc:'%',widthUnit:'jednostka szerokości',cellSpace:'Odstęp pomiędzy komórkami',cellPad:'Dopełnienie komórek',caption:'Tytuł',summary:'Podsumowanie',headers:'Nagłówki',headersNone:'Brak',headersColumn:'Pierwsza kolumna',headersRow:'Pierwszy wiersz',headersBoth:'Oba',invalidRows:'Liczba wierszy musi być większa niż 0.',invalidCols:'Liczba kolumn musi być większa niż 0.',invalidBorder:'Wartość obramowania musi być liczbą.',invalidWidth:'Szerokość tabeli musi być liczbą.',invalidHeight:'Wysokość tabeli musi być liczbą.',invalidCellSpacing:'Odstęp pomiędzy komórkami musi być liczbą dodatnią.',invalidCellPadding:'Dopełnienie komórek musi być liczbą dodatnią.',cell:{menu:'Komórka',insertBefore:'Wstaw komórkę z lewej',insertAfter:'Wstaw komórkę z prawej',deleteCell:'Usuń komórki',merge:'Połącz komórki',mergeRight:'Połącz z komórką z prawej',mergeDown:'Połącz z komórką poniżej',splitHorizontal:'Podziel komórkę poziomo',splitVertical:'Podziel komórkę pionowo',title:'Właściwości komórki',cellType:'Typ komórki',rowSpan:'Scalenie wierszy',colSpan:'Scalenie komórek',wordWrap:'Zawijanie słów',hAlign:'Wyrównanie poziome',vAlign:'Wyrównanie pionowe',alignBaseline:'Linia bazowa',bgColor:'Kolor tła',borderColor:'Kolor obramowania',data:'Dane',header:'Nagłówek',yes:'Tak',no:'Nie',invalidWidth:'Szerokość komórki musi być liczbą.',invalidHeight:'Wysokość komórki musi być liczbą.',invalidRowSpan:'Scalenie wierszy musi być liczbą całkowitą.',invalidColSpan:'Scalenie komórek musi być liczbą całkowitą.',chooseColor:'Wybierz'},row:{menu:'Wiersz',insertBefore:'Wstaw wiersz powyżej',insertAfter:'Wstaw wiersz poniżej',deleteRow:'Usuń wiersze'},column:{menu:'Kolumna',insertBefore:'Wstaw kolumnę z lewej',insertAfter:'Wstaw kolumnę z prawej',deleteColumn:'Usuń kolumny'}},button:{title:'Właściwości przycisku',text:'Tekst (Wartość)',type:'Typ',typeBtn:'Przycisk',typeSbm:'Wyślij',typeRst:'Wyczyść'},checkboxAndRadio:{checkboxTitle:'Właściwości pola wyboru (checkbox)',radioTitle:'Właściwości przycisku opcji (radio)',value:'Wartość',selected:'Zaznaczone'},form:{title:'Właściwości formularza',menu:'Właściwości formularza',action:'Akcja',method:'Metoda',encoding:'Kodowanie'},select:{title:'Właściwości listy wyboru',selectInfo:'Informacje',opAvail:'Dostępne opcje',value:'Wartość',size:'Rozmiar',lines:'wierszy',chkMulti:'Wielokrotny wybór',opText:'Tekst',opValue:'Wartość',btnAdd:'Dodaj',btnModify:'Zmień',btnUp:'Do góry',btnDown:'Do dołu',btnSetValue:'Ustaw jako zaznaczoną',btnDelete:'Usuń'},textarea:{title:'Właściwości obszaru tekstowego',cols:'Liczba kolumn',rows:'Liczba wierszy'},textfield:{title:'Właściwości pola tekstowego',name:'Nazwa',value:'Wartość',charWidth:'Szerokość w znakach',maxChars:'Szerokość maksymalna',type:'Typ',typeText:'Tekst',typePass:'Hasło'},hidden:{title:'Właściwości pola ukrytego',name:'Nazwa',value:'Wartość'},image:{title:'Właściwości obrazka',titleButton:'Właściwości przycisku graficznego',menu:'Właściwości obrazka',infoTab:'Informacje o obrazku',btnUpload:'Wyślij',upload:'Wyślij',alt:'Tekst zastępczy',lockRatio:'Zablokuj proporcje',resetSize:'Przywróć rozmiar',border:'Obramowanie',hSpace:'Odstęp poziomy',vSpace:'Odstęp pionowy',alertUrl:'Podaj adres obrazka.',linkTab:'Hiperłącze',button2Img:'Czy chcesz przekonwertować zaznaczony przycisk graficzny do zwykłego obrazka?',img2Button:'Czy chcesz przekonwertować zaznaczony obrazek do przycisku graficznego?',urlMissing:'Podaj adres URL obrazka.',validateBorder:'Wartość obramowania musi być liczbą całkowitą.',validateHSpace:'Wartość odstępu poziomego musi być liczbą całkowitą.',validateVSpace:'Wartość odstępu pionowego musi być liczbą całkowitą.'},flash:{properties:'Właściwości obiektu Flash',propertiesTab:'Właściwości',title:'Właściwości obiektu Flash',chkPlay:'Autoodtwarzanie',chkLoop:'Pętla',chkMenu:'Włącz menu',chkFull:'Zezwól na pełny ekran',scale:'Skaluj',scaleAll:'Pokaż wszystko',scaleNoBorder:'Bez obramowania',scaleFit:'Dokładne dopasowanie',access:'Dostęp skryptów',accessAlways:'Zawsze',accessSameDomain:'Ta sama domena',accessNever:'Nigdy',alignAbsBottom:'Do dołu',alignAbsMiddle:'Do środka w pionie',alignBaseline:'Do linii bazowej',alignTextTop:'Do góry tekstu',quality:'Jakość',qualityBest:'Najlepsza',qualityHigh:'Wysoka',qualityAutoHigh:'Auto wysoka',qualityMedium:'Średnia',qualityAutoLow:'Auto niska',qualityLow:'Niska',windowModeWindow:'Okno',windowModeOpaque:'Nieprzezroczyste',windowModeTransparent:'Przezroczyste',windowMode:'Tryb okna',flashvars:'Zmienne obiektu Flash',bgcolor:'Kolor tła',hSpace:'Odstęp poziomy',vSpace:'Odstęp pionowy',validateSrc:'Podaj adres URL',validateHSpace:'Odstęp poziomy musi być liczbą.',validateVSpace:'Odstęp pionowy musi być liczbą.'},spellCheck:{toolbar:'Sprawdź pisownię',title:'Sprawdź pisownię',notAvailable:'Przepraszamy, ale usługa jest obecnie niedostępna.',errorLoading:'Błąd wczytywania hosta aplikacji usługi: %s.',notInDic:'Słowa nie ma w słowniku',changeTo:'Zmień na',btnIgnore:'Ignoruj',btnIgnoreAll:'Ignoruj wszystkie',btnReplace:'Zmień',btnReplaceAll:'Zmień wszystkie',btnUndo:'Cofnij',noSuggestions:'- Brak sugestii -',progress:'Trwa sprawdzanie...',noMispell:'Sprawdzanie zakończone: nie znaleziono błędów',noChanges:'Sprawdzanie zakończone: nie zmieniono żadnego słowa',oneChange:'Sprawdzanie zakończone: zmieniono jedno słowo',manyChanges:'Sprawdzanie zakończone: zmieniono %l słów',ieSpellDownload:'Słownik nie jest zainstalowany. Czy chcesz go pobrać?'},smiley:{toolbar:'Emotikony',title:'Wstaw emotikona',options:'Opcje emotikonów'},elementsPath:{eleLabel:'Ścieżka elementów',eleTitle:'element %1'},numberedlist:'Lista numerowana',bulletedlist:'Lista wypunktowana',indent:'Zwiększ wcięcie',outdent:'Zmniejsz wcięcie',justify:{left:'Wyrównaj do lewej',center:'Wyśrodkuj',right:'Wyrównaj do prawej',block:'Wyjustuj'},blockquote:'Cytat',clipboard:{title:'Wklej',cutError:'Ustawienia bezpieczeństwa Twojej przeglądarki nie pozwalają na automatyczne wycinanie tekstu. Użyj skrótu klawiszowego Ctrl/Cmd+X.',copyError:'Ustawienia bezpieczeństwa Twojej przeglądarki nie pozwalają na automatyczne kopiowanie tekstu. Użyj skrótu klawiszowego Ctrl/Cmd+C.',pasteMsg:'Wklej tekst w poniższym polu, używając skrótu klawiaturowego (<STRONG>Ctrl/Cmd+V</STRONG>), i kliknij <STRONG>OK</STRONG>.',securityMsg:'Zabezpieczenia przeglądarki uniemożliwiają wklejenie danych bezpośrednio do edytora. Proszę ponownie wkleić dane w tym oknie.',pasteArea:'Obszar wklejania'},pastefromword:{confirmCleanup:'Tekst, który chcesz wkleić, prawdopodobnie pochodzi z programu Microsoft Word. Czy chcesz go wyczyścić przed wklejeniem?',toolbar:'Wklej z programu MS Word',title:'Wklej z programu MS Word',error:'Wyczyszczenie wklejonych danych nie było możliwe z powodu wystąpienia błędu.'},pasteText:{button:'Wklej jako czysty tekst',title:'Wklej jako czysty tekst'},templates:{button:'Szablony',title:'Szablony zawartości',options:'Opcje szablonów',insertOption:'Zastąp obecną zawartość',selectPromptMsg:'Wybierz szablon do otwarcia w edytorze<br>(obecna zawartość okna edytora zostanie utracona):',emptyListMsg:'(Brak zdefiniowanych szablonów)'},showBlocks:'Pokaż bloki',stylesCombo:{label:'Styl',panelTitle:'Style formatujące',panelTitle1:'Style blokowe',panelTitle2:'Style liniowe',panelTitle3:'Style obiektowe'},format:{label:'Format',panelTitle:'Format',tag_p:'Normalny',tag_pre:'Tekst sformatowany',tag_address:'Adres',tag_h1:'Nagłówek 1',tag_h2:'Nagłówek 2',tag_h3:'Nagłówek 3',tag_h4:'Nagłówek 4',tag_h5:'Nagłówek 5',tag_h6:'Nagłówek 6',tag_div:'Normalny (DIV)'},div:{title:'Utwórz pojemnik Div',toolbar:'Utwórz pojemnik Div',cssClassInputLabel:'Klasy arkusza stylów',styleSelectLabel:'Styl',IdInputLabel:'Id',languageCodeInputLabel:'Kod języka',inlineStyleInputLabel:'Style liniowe',advisoryTitleInputLabel:'Opis obiektu docelowego',langDirLabel:'Kierunek tekstu',langDirLTRLabel:'Od lewej do prawej (LTR)',langDirRTLLabel:'Od prawej do lewej (RTL)',edit:'Edytuj pojemnik Div',remove:'Usuń pojemnik Div'},iframe:{title:'Właściwości elementu IFrame',toolbar:'IFrame',noUrl:'Podaj adres URL elementu IFrame',scrolling:'Włącz paski przewijania',border:'Pokaż obramowanie obiektu IFrame'},font:{label:'Czcionka',voiceLabel:'Czcionka',panelTitle:'Czcionka'},fontSize:{label:'Rozmiar',voiceLabel:'Rozmiar czcionki',panelTitle:'Rozmiar'},colorButton:{textColorTitle:'Kolor tekstu',bgColorTitle:'Kolor tła',panelTitle:'Kolory',auto:'Automatycznie',more:'Więcej kolorów...'},colors:{'000':'Czarny',800000:'Kasztanowy','8B4513':'Czekoladowy','2F4F4F':'Ciemnografitowy','008080':'Morski','000080':'Granatowy','4B0082':'Indygo',696969:'Ciemnoszary',B22222:'Czerwień żelazowa',A52A2A:'Brązowy',DAA520:'Ciemnozłoty','006400':'Ciemnozielony','40E0D0':'Turkusowy','0000CD':'Ciemnoniebieski',800080:'Purpurowy',808080:'Szary',F00:'Czerwony',FF8C00:'Ciemnopomarańczowy',FFD700:'Złoty','008000':'Zielony','0FF':'Cyjan','00F':'Niebieski',EE82EE:'Fioletowy',A9A9A9:'Przygaszony szary',FFA07A:'Łososiowy',FFA500:'Pomarańczowy',FFFF00:'Żółty','00FF00':'Limonkowy',AFEEEE:'Bladoturkusowy',ADD8E6:'Jasnoniebieski',DDA0DD:'Śliwkowy',D3D3D3:'Jasnoszary',FFF0F5:'Jasnolawendowy',FAEBD7:'Kremowobiały',FFFFE0:'Jasnożółty',F0FFF0:'Bladozielony',F0FFFF:'Jasnolazurowy',F0F8FF:'Jasnobłękitny',E6E6FA:'Lawendowy',FFF:'Biały'},scayt:{title:'Sprawdź pisownię podczas pisania (SCAYT)',opera_title:'Funkcja nie jest obsługiwana przez przeglądarkę Opera',enable:'Włącz SCAYT',disable:'Wyłącz SCAYT',about:'Informacje o SCAYT',toggle:'Przełącz SCAYT',options:'Opcje',langs:'Języki',moreSuggestions:'Więcej sugestii',ignore:'Ignoruj',ignoreAll:'Ignoruj wszystkie',addWord:'Dodaj słowo',emptyDic:'Nazwa słownika nie może być pusta.',optionsTab:'Opcje',allCaps:'Ignoruj wyrazy pisane dużymi literami',ignoreDomainNames:'Ignoruj nazwy domen',mixedCase:'Ignoruj wyrazy pisane dużymi i małymi literami',mixedWithDigits:'Ignoruj wyrazy zawierające cyfry',languagesTab:'Języki',dictionariesTab:'Słowniki',dic_field_name:'Nazwa słownika',dic_create:'Utwórz',dic_restore:'Przywróć',dic_delete:'Usuń',dic_rename:'Zmień nazwę',dic_info:'Początkowo słownik użytkownika przechowywany jest w cookie. Pliki cookie mają jednak ograniczoną pojemność. Jeśli słownik użytkownika przekroczy wielkość dopuszczalną dla pliku cookie, możliwe jest przechowanie go na naszym serwerze. W celu zapisania słownika na serwerze niezbędne jest nadanie mu nazwy. Jeśli słownik został już zapisany na serwerze, wystarczy podać jego nazwę i nacisnąć przycisk Przywróć.',aboutTab:'Informacje o SCAYT'},about:{title:'Informacje o programie CKEditor',dlgTitle:'Informacje o programie CKEditor',help:'Pomoc znajdziesz w $1.',userGuide:'podręczniku użytkownika programu CKEditor',moreInfo:'Informacje na temat licencji można znaleźć na naszej stronie:',copy:'Copyright © $1. Wszelkie prawa zastrzeżone.'},maximize:'Maksymalizuj',minimize:'Minimalizuj',fakeobjects:{anchor:'Kotwica',flash:'Animacja Flash',iframe:'IFrame',hiddenfield:'Pole ukryte',unknown:'Nieznany obiekt'},resize:'Przeciągnij, aby zmienić rozmiar',colordialog:{title:'Wybierz kolor',options:'Opcje koloru',highlight:'Zaznacz',selected:'Wybrany',clear:'Wyczyść'},toolbarCollapse:'Zwiń pasek narzędzi',toolbarExpand:'Rozwiń pasek narzędzi',toolbarGroups:{document:'Dokument',clipboard:'Schowek/Wstecz',editing:'Edycja',forms:'Formularze',basicstyles:'Style podstawowe',paragraph:'Akapit',links:'Hiperłącza',insert:'Wstawianie',styles:'Style',colors:'Kolory',tools:'Narzędzia'},bidi:{ltr:'Kierunek tekstu od lewej strony do prawej',rtl:'Kierunek tekstu od prawej strony do lewej'},docprops:{label:'Właściwości dokumentu',title:'Właściwości dokumentu',design:'Projekt strony',meta:'Znaczniki meta',chooseColor:'Wybierz',other:'Inne',docTitle:'Tytuł strony',charset:'Kodowanie znaków',charsetOther:'Inne kodowanie znaków',charsetASCII:'ASCII',charsetCE:'Środkowoeuropejskie',charsetCT:'Chińskie tradycyjne (Big5)',charsetCR:'Cyrylica',charsetGR:'Greckie',charsetJP:'Japońskie',charsetKR:'Koreańskie',charsetTR:'Tureckie',charsetUN:'Unicode (UTF-8)',charsetWE:'Zachodnioeuropejskie',docType:'Definicja typu dokumentu',docTypeOther:'Inna definicja typu dokumentu',xhtmlDec:'Uwzględnij deklaracje XHTML',bgColor:'Kolor tła',bgImage:'Adres URL obrazka tła',bgFixed:'Tło nieruchome (nieprzewijające się)',txtColor:'Kolor tekstu',margin:'Marginesy strony',marginTop:'Górny',marginLeft:'Lewy',marginRight:'Prawy',marginBottom:'Dolny',metaKeywords:'Słowa kluczowe dokumentu (oddzielone przecinkami)',metaDescription:'Opis dokumentu',metaAuthor:'Autor',metaCopyright:'Prawa autorskie',previewHtml:'<p>To jest <strong>przykładowy tekst</strong>. Korzystasz z programu <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.pl={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Paski narzędzi edytora',editor:'Edytor tekstu sformatowanego',source:'Źródło dokumentu',newPage:'Nowa strona',save:'Zapisz',preview:'Podgląd',cut:'Wytnij',copy:'Kopiuj',paste:'Wklej',print:'Drukuj',underline:'Podkreślenie',bold:'Pogrubienie',italic:'Kursywa',selectAll:'Zaznacz wszystko',removeFormat:'Usuń formatowanie',strike:'Przekreślenie',subscript:'Indeks dolny',superscript:'Indeks górny',horizontalrule:'Wstaw poziomą linię',pagebreak:'Wstaw podział strony',pagebreakAlt:'Wstaw podział strony',unlink:'Usuń odnośnik',undo:'Cofnij',redo:'Ponów',common:{browseServer:'Przeglądaj',url:'Adres URL',protocol:'Protokół',upload:'Wyślij',uploadSubmit:'Wyślij',image:'Obrazek',flash:'Flash',form:'Formularz',checkbox:'Pole wyboru (checkbox)',radio:'Przycisk opcji (radio)',textField:'Pole tekstowe',textarea:'Obszar tekstowy',hiddenField:'Pole ukryte',button:'Przycisk',select:'Lista wyboru',imageButton:'Przycisk graficzny',notSet:'<nie ustawiono>',id:'Id',name:'Nazwa',langDir:'Kierunek tekstu',langDirLtr:'Od lewej do prawej (LTR)',langDirRtl:'Od prawej do lewej (RTL)',langCode:'Kod języka',longDescr:'Adres URL długiego opisu',cssClass:'Nazwa klasy CSS',advisoryTitle:'Opis obiektu docelowego',cssStyle:'Styl',ok:'OK',cancel:'Anuluj',close:'Zamknij',preview:'Podgląd',generalTab:'Ogólne',advancedTab:'Zaawansowane',validateNumberFailed:'Ta wartość nie jest liczbą.',confirmNewPage:'Wszystkie niezapisane zmiany zostaną utracone. Czy na pewno wczytać nową stronę?',confirmCancel:'Pewne opcje zostały zmienione. Czy na pewno zamknąć okno dialogowe?',options:'Opcje',target:'Obiekt docelowy',targetNew:'Nowe okno (_blank)',targetTop:'Okno najwyżej w hierarchii (_top)',targetSelf:'To samo okno (_self)',targetParent:'Okno nadrzędne (_parent)',langDirLTR:'Od lewej do prawej (LTR)',langDirRTL:'Od prawej do lewej (RTL)',styles:'Style',cssClasses:'Klasy arkusza stylów',width:'Szerokość',height:'Wysokość',align:'Wyrównaj',alignLeft:'Do lewej',alignRight:'Do prawej',alignCenter:'Do środka',alignTop:'Do góry',alignMiddle:'Do środka',alignBottom:'Do dołu',invalidHeight:'Wysokość musi być liczbą.',invalidWidth:'Szerokość musi być liczbą.',invalidCssLength:'Wartość podana dla pola "%1" musi być liczbą dodatnią bez jednostki lub z poprawną jednostką długości zgodną z CSS (px, %, in, cm, mm, em, ex, pt lub pc).',invalidHtmlLength:'Wartość podana dla pola "%1" musi być liczbą dodatnią bez jednostki lub z poprawną jednostką długości zgodną z HTML (px lub %).',invalidInlineStyle:'Wartość podana dla stylu musi składać się z jednej lub większej liczby krotek w formacie "nazwa : wartość", rozdzielonych średnikami.',cssLengthTooltip:'Wpisz liczbę dla wartości w pikselach lub liczbę wraz z jednostką długości zgodną z CSS (px, %, in, cm, mm, em, ex, pt lub pc).',unavailable:'%1<span class="cke_accessibility">, niedostępne</span>'},contextmenu:{options:'Opcje menu kontekstowego'},specialChar:{toolbar:'Wstaw znak specjalny',title:'Wybierz znak specjalny',options:'Opcje znaków specjalnych'},link:{toolbar:'Wstaw/edytuj odnośnik',other:'<inny>',menu:'Edytuj odnośnik',title:'Odnośnik',info:'Informacje ',target:'Obiekt docelowy',upload:'Wyślij',advanced:'Zaawansowane',type:'Typ odnośnika',toUrl:'Adres URL',toAnchor:'Odnośnik wewnątrz strony (kotwica)',toEmail:'Adres e-mail',targetFrame:'<ramka>',targetPopup:'<wyskakujące okno>',targetFrameName:'Nazwa ramki docelowej',targetPopupName:'Nazwa wyskakującego okna',popupFeatures:'Właściwości wyskakującego okna',popupResizable:'Skalowalny',popupStatusBar:'Pasek statusu',popupLocationBar:'Pasek adresu',popupToolbar:'Pasek narzędzi',popupMenuBar:'Pasek menu',popupFullScreen:'Pełny ekran (IE)',popupScrollBars:'Paski przewijania',popupDependent:'Okno zależne (Netscape)',popupLeft:'Pozycja w poziomie',popupTop:'Pozycja w pionie',id:'Id',langDir:'Kierunek tekstu',langDirLTR:'Od lewej do prawej (LTR)',langDirRTL:'Od prawej do lewej (RTL)',acccessKey:'Klawisz dostępu',name:'Nazwa',langCode:'Kod języka',tabIndex:'Indeks kolejności',advisoryTitle:'Opis obiektu docelowego',advisoryContentType:'Typ MIME obiektu docelowego',cssClasses:'Nazwa klasy CSS',charset:'Kodowanie znaków obiektu docelowego',styles:'Styl',rel:'Relacja',selectAnchor:'Wybierz kotwicę',anchorName:'Wg nazwy',anchorId:'Wg identyfikatora',emailAddress:'Adres e-mail',emailSubject:'Temat',emailBody:'Treść',noAnchors:'(W dokumencie nie zdefiniowano żadnych kotwic)',noUrl:'Podaj adres URL',noEmail:'Podaj adres e-mail'},anchor:{toolbar:'Wstaw/edytuj kotwicę',menu:'Właściwości kotwicy',title:'Właściwości kotwicy',name:'Nazwa kotwicy',errorName:'Wpisz nazwę kotwicy',remove:'Usuń kotwicę'},list:{numberedTitle:'Właściwości list numerowanych',bulletedTitle:'Właściwości list wypunktowanych',type:'Typ punktora',start:'Początek',validateStartNumber:'Listę musi rozpoczynać liczba całkowita.',circle:'Koło',disc:'Okrąg',square:'Kwadrat',none:'Brak',notset:'<nie ustawiono>',armenian:'Numerowanie armeńskie',georgian:'Numerowanie gruzińskie (an, ban, gan itd.)',lowerRoman:'Małe cyfry rzymskie (i, ii, iii, iv, v itd.)',upperRoman:'Duże cyfry rzymskie (I, II, III, IV, V itd.)',lowerAlpha:'Małe litery (a, b, c, d, e itd.)',upperAlpha:'Duże litery (A, B, C, D, E itd.)',lowerGreek:'Małe litery greckie (alpha, beta, gamma itd.)',decimal:'Liczby (1, 2, 3 itd.)',decimalLeadingZero:'Liczby z początkowym zerem (01, 02, 03 itd.)'},findAndReplace:{title:'Znajdź i zamień',find:'Znajdź',replace:'Zamień',findWhat:'Znajdź:',replaceWith:'Zastąp przez:',notFoundMsg:'Nie znaleziono szukanego hasła.',findOptions:'Opcje wyszukiwania',matchCase:'Uwzględnij wielkość liter',matchWord:'Całe słowa',matchCyclic:'Cykliczne dopasowanie',replaceAll:'Zamień wszystko',replaceSuccessMsg:'%1 wystąpień zastąpionych.'},table:{toolbar:'Tabela',title:'Właściwości tabeli',menu:'Właściwości tabeli',deleteTable:'Usuń tabelę',rows:'Liczba wierszy',columns:'Liczba kolumn',border:'Grubość obramowania',widthPx:'piksele',widthPc:'%',widthUnit:'jednostka szerokości',cellSpace:'Odstęp pomiędzy komórkami',cellPad:'Dopełnienie komórek',caption:'Tytuł',summary:'Podsumowanie',headers:'Nagłówki',headersNone:'Brak',headersColumn:'Pierwsza kolumna',headersRow:'Pierwszy wiersz',headersBoth:'Oba',invalidRows:'Liczba wierszy musi być większa niż 0.',invalidCols:'Liczba kolumn musi być większa niż 0.',invalidBorder:'Wartość obramowania musi być liczbą.',invalidWidth:'Szerokość tabeli musi być liczbą.',invalidHeight:'Wysokość tabeli musi być liczbą.',invalidCellSpacing:'Odstęp pomiędzy komórkami musi być liczbą dodatnią.',invalidCellPadding:'Dopełnienie komórek musi być liczbą dodatnią.',cell:{menu:'Komórka',insertBefore:'Wstaw komórkę z lewej',insertAfter:'Wstaw komórkę z prawej',deleteCell:'Usuń komórki',merge:'Połącz komórki',mergeRight:'Połącz z komórką z prawej',mergeDown:'Połącz z komórką poniżej',splitHorizontal:'Podziel komórkę poziomo',splitVertical:'Podziel komórkę pionowo',title:'Właściwości komórki',cellType:'Typ komórki',rowSpan:'Scalenie wierszy',colSpan:'Scalenie komórek',wordWrap:'Zawijanie słów',hAlign:'Wyrównanie poziome',vAlign:'Wyrównanie pionowe',alignBaseline:'Linia bazowa',bgColor:'Kolor tła',borderColor:'Kolor obramowania',data:'Dane',header:'Nagłówek',yes:'Tak',no:'Nie',invalidWidth:'Szerokość komórki musi być liczbą.',invalidHeight:'Wysokość komórki musi być liczbą.',invalidRowSpan:'Scalenie wierszy musi być liczbą całkowitą.',invalidColSpan:'Scalenie komórek musi być liczbą całkowitą.',chooseColor:'Wybierz'},row:{menu:'Wiersz',insertBefore:'Wstaw wiersz powyżej',insertAfter:'Wstaw wiersz poniżej',deleteRow:'Usuń wiersze'},column:{menu:'Kolumna',insertBefore:'Wstaw kolumnę z lewej',insertAfter:'Wstaw kolumnę z prawej',deleteColumn:'Usuń kolumny'}},button:{title:'Właściwości przycisku',text:'Tekst (Wartość)',type:'Typ',typeBtn:'Przycisk',typeSbm:'Wyślij',typeRst:'Wyczyść'},checkboxAndRadio:{checkboxTitle:'Właściwości pola wyboru (checkbox)',radioTitle:'Właściwości przycisku opcji (radio)',value:'Wartość',selected:'Zaznaczone'},form:{title:'Właściwości formularza',menu:'Właściwości formularza',action:'Akcja',method:'Metoda',encoding:'Kodowanie'},select:{title:'Właściwości listy wyboru',selectInfo:'Informacje',opAvail:'Dostępne opcje',value:'Wartość',size:'Rozmiar',lines:'wierszy',chkMulti:'Wielokrotny wybór',opText:'Tekst',opValue:'Wartość',btnAdd:'Dodaj',btnModify:'Zmień',btnUp:'Do góry',btnDown:'Do dołu',btnSetValue:'Ustaw jako zaznaczoną',btnDelete:'Usuń'},textarea:{title:'Właściwości obszaru tekstowego',cols:'Liczba kolumn',rows:'Liczba wierszy'},textfield:{title:'Właściwości pola tekstowego',name:'Nazwa',value:'Wartość',charWidth:'Szerokość w znakach',maxChars:'Szerokość maksymalna',type:'Typ',typeText:'Tekst',typePass:'Hasło'},hidden:{title:'Właściwości pola ukrytego',name:'Nazwa',value:'Wartość'},image:{title:'Właściwości obrazka',titleButton:'Właściwości przycisku graficznego',menu:'Właściwości obrazka',infoTab:'Informacje o obrazku',btnUpload:'Wyślij',upload:'Wyślij',alt:'Tekst zastępczy',lockRatio:'Zablokuj proporcje',resetSize:'Przywróć rozmiar',border:'Obramowanie',hSpace:'Odstęp poziomy',vSpace:'Odstęp pionowy',alertUrl:'Podaj adres obrazka.',linkTab:'Hiperłącze',button2Img:'Czy chcesz przekonwertować zaznaczony przycisk graficzny do zwykłego obrazka?',img2Button:'Czy chcesz przekonwertować zaznaczony obrazek do przycisku graficznego?',urlMissing:'Podaj adres URL obrazka.',validateBorder:'Wartość obramowania musi być liczbą całkowitą.',validateHSpace:'Wartość odstępu poziomego musi być liczbą całkowitą.',validateVSpace:'Wartość odstępu pionowego musi być liczbą całkowitą.'},flash:{properties:'Właściwości obiektu Flash',propertiesTab:'Właściwości',title:'Właściwości obiektu Flash',chkPlay:'Autoodtwarzanie',chkLoop:'Pętla',chkMenu:'Włącz menu',chkFull:'Zezwól na pełny ekran',scale:'Skaluj',scaleAll:'Pokaż wszystko',scaleNoBorder:'Bez obramowania',scaleFit:'Dokładne dopasowanie',access:'Dostęp skryptów',accessAlways:'Zawsze',accessSameDomain:'Ta sama domena',accessNever:'Nigdy',alignAbsBottom:'Do dołu',alignAbsMiddle:'Do środka w pionie',alignBaseline:'Do linii bazowej',alignTextTop:'Do góry tekstu',quality:'Jakość',qualityBest:'Najlepsza',qualityHigh:'Wysoka',qualityAutoHigh:'Auto wysoka',qualityMedium:'Średnia',qualityAutoLow:'Auto niska',qualityLow:'Niska',windowModeWindow:'Okno',windowModeOpaque:'Nieprzezroczyste',windowModeTransparent:'Przezroczyste',windowMode:'Tryb okna',flashvars:'Zmienne obiektu Flash',bgcolor:'Kolor tła',hSpace:'Odstęp poziomy',vSpace:'Odstęp pionowy',validateSrc:'Podaj adres URL',validateHSpace:'Odstęp poziomy musi być liczbą.',validateVSpace:'Odstęp pionowy musi być liczbą.'},spellCheck:{toolbar:'Sprawdź pisownię',title:'Sprawdź pisownię',notAvailable:'Przepraszamy, ale usługa jest obecnie niedostępna.',errorLoading:'Błąd wczytywania hosta aplikacji usługi: %s.',notInDic:'Słowa nie ma w słowniku',changeTo:'Zmień na',btnIgnore:'Ignoruj',btnIgnoreAll:'Ignoruj wszystkie',btnReplace:'Zmień',btnReplaceAll:'Zmień wszystkie',btnUndo:'Cofnij',noSuggestions:'- Brak sugestii -',progress:'Trwa sprawdzanie...',noMispell:'Sprawdzanie zakończone: nie znaleziono błędów',noChanges:'Sprawdzanie zakończone: nie zmieniono żadnego słowa',oneChange:'Sprawdzanie zakończone: zmieniono jedno słowo',manyChanges:'Sprawdzanie zakończone: zmieniono %l słów',ieSpellDownload:'Słownik nie jest zainstalowany. Czy chcesz go pobrać?'},smiley:{toolbar:'Emotikony',title:'Wstaw emotikona',options:'Opcje emotikonów'},elementsPath:{eleLabel:'Ścieżka elementów',eleTitle:'element %1'},numberedlist:'Lista numerowana',bulletedlist:'Lista wypunktowana',indent:'Zwiększ wcięcie',outdent:'Zmniejsz wcięcie',justify:{left:'Wyrównaj do lewej',center:'Wyśrodkuj',right:'Wyrównaj do prawej',block:'Wyjustuj'},blockquote:'Cytat',clipboard:{title:'Wklej',cutError:'Ustawienia bezpieczeństwa Twojej przeglądarki nie pozwalają na automatyczne wycinanie tekstu. Użyj skrótu klawiszowego Ctrl/Cmd+X.',copyError:'Ustawienia bezpieczeństwa Twojej przeglądarki nie pozwalają na automatyczne kopiowanie tekstu. Użyj skrótu klawiszowego Ctrl/Cmd+C.',pasteMsg:'Wklej tekst w poniższym polu, używając skrótu klawiaturowego (<STRONG>Ctrl/Cmd+V</STRONG>), i kliknij <STRONG>OK</STRONG>.',securityMsg:'Zabezpieczenia przeglądarki uniemożliwiają wklejenie danych bezpośrednio do edytora. Proszę ponownie wkleić dane w tym oknie.',pasteArea:'Obszar wklejania'},pastefromword:{confirmCleanup:'Tekst, który chcesz wkleić, prawdopodobnie pochodzi z programu Microsoft Word. Czy chcesz go wyczyścić przed wklejeniem?',toolbar:'Wklej z programu MS Word',title:'Wklej z programu MS Word',error:'Wyczyszczenie wklejonych danych nie było możliwe z powodu wystąpienia błędu.'},pasteText:{button:'Wklej jako czysty tekst',title:'Wklej jako czysty tekst'},templates:{button:'Szablony',title:'Szablony zawartości',options:'Opcje szablonów',insertOption:'Zastąp obecną zawartość',selectPromptMsg:'Wybierz szablon do otwarcia w edytorze<br>(obecna zawartość okna edytora zostanie utracona):',emptyListMsg:'(Brak zdefiniowanych szablonów)'},showBlocks:'Pokaż bloki',stylesCombo:{label:'Styl',panelTitle:'Style formatujące',panelTitle1:'Style blokowe',panelTitle2:'Style liniowe',panelTitle3:'Style obiektowe'},format:{label:'Format',panelTitle:'Format',tag_p:'Normalny',tag_pre:'Tekst sformatowany',tag_address:'Adres',tag_h1:'Nagłówek 1',tag_h2:'Nagłówek 2',tag_h3:'Nagłówek 3',tag_h4:'Nagłówek 4',tag_h5:'Nagłówek 5',tag_h6:'Nagłówek 6',tag_div:'Normalny (DIV)'},div:{title:'Utwórz pojemnik Div',toolbar:'Utwórz pojemnik Div',cssClassInputLabel:'Klasy arkusza stylów',styleSelectLabel:'Styl',IdInputLabel:'Id',languageCodeInputLabel:'Kod języka',inlineStyleInputLabel:'Style liniowe',advisoryTitleInputLabel:'Opis obiektu docelowego',langDirLabel:'Kierunek tekstu',langDirLTRLabel:'Od lewej do prawej (LTR)',langDirRTLLabel:'Od prawej do lewej (RTL)',edit:'Edytuj pojemnik Div',remove:'Usuń pojemnik Div'},iframe:{title:'Właściwości elementu IFrame',toolbar:'IFrame',noUrl:'Podaj adres URL elementu IFrame',scrolling:'Włącz paski przewijania',border:'Pokaż obramowanie obiektu IFrame'},font:{label:'Czcionka',voiceLabel:'Czcionka',panelTitle:'Czcionka'},fontSize:{label:'Rozmiar',voiceLabel:'Rozmiar czcionki',panelTitle:'Rozmiar'},colorButton:{textColorTitle:'Kolor tekstu',bgColorTitle:'Kolor tła',panelTitle:'Kolory',auto:'Automatycznie',more:'Więcej kolorów...'},colors:{'000':'Czarny',800000:'Kasztanowy','8B4513':'Czekoladowy','2F4F4F':'Ciemnografitowy','008080':'Morski','000080':'Granatowy','4B0082':'Indygo',696969:'Ciemnoszary',B22222:'Czerwień żelazowa',A52A2A:'Brązowy',DAA520:'Ciemnozłoty','006400':'Ciemnozielony','40E0D0':'Turkusowy','0000CD':'Ciemnoniebieski',800080:'Purpurowy',808080:'Szary',F00:'Czerwony',FF8C00:'Ciemnopomarańczowy',FFD700:'Złoty','008000':'Zielony','0FF':'Cyjan','00F':'Niebieski',EE82EE:'Fioletowy',A9A9A9:'Przygaszony szary',FFA07A:'Łososiowy',FFA500:'Pomarańczowy',FFFF00:'Żółty','00FF00':'Limonkowy',AFEEEE:'Bladoturkusowy',ADD8E6:'Jasnoniebieski',DDA0DD:'Śliwkowy',D3D3D3:'Jasnoszary',FFF0F5:'Jasnolawendowy',FAEBD7:'Kremowobiały',FFFFE0:'Jasnożółty',F0FFF0:'Bladozielony',F0FFFF:'Jasnolazurowy',F0F8FF:'Jasnobłękitny',E6E6FA:'Lawendowy',FFF:'Biały'},scayt:{title:'Sprawdź pisownię podczas pisania (SCAYT)',opera_title:'Funkcja nie jest obsługiwana przez przeglądarkę Opera',enable:'Włącz SCAYT',disable:'Wyłącz SCAYT',about:'Informacje o SCAYT',toggle:'Przełącz SCAYT',options:'Opcje',langs:'Języki',moreSuggestions:'Więcej sugestii',ignore:'Ignoruj',ignoreAll:'Ignoruj wszystkie',addWord:'Dodaj słowo',emptyDic:'Nazwa słownika nie może być pusta.',optionsTab:'Opcje',allCaps:'Ignoruj wyrazy pisane dużymi literami',ignoreDomainNames:'Ignoruj nazwy domen',mixedCase:'Ignoruj wyrazy pisane dużymi i małymi literami',mixedWithDigits:'Ignoruj wyrazy zawierające cyfry',languagesTab:'Języki',dictionariesTab:'Słowniki',dic_field_name:'Nazwa słownika',dic_create:'Utwórz',dic_restore:'Przywróć',dic_delete:'Usuń',dic_rename:'Zmień nazwę',dic_info:'Początkowo słownik użytkownika przechowywany jest w cookie. Pliki cookie mają jednak ograniczoną pojemność. Jeśli słownik użytkownika przekroczy wielkość dopuszczalną dla pliku cookie, możliwe jest przechowanie go na naszym serwerze. W celu zapisania słownika na serwerze niezbędne jest nadanie mu nazwy. Jeśli słownik został już zapisany na serwerze, wystarczy podać jego nazwę i nacisnąć przycisk Przywróć.',aboutTab:'Informacje o SCAYT'},about:{title:'Informacje o programie CKEditor',dlgTitle:'Informacje o programie CKEditor',help:'Pomoc znajdziesz w $1.',userGuide:'podręczniku użytkownika programu CKEditor',moreInfo:'Informacje na temat licencji można znaleźć na naszej stronie:',copy:'Copyright © $1. Wszelkie prawa zastrzeżone.'},maximize:'Maksymalizuj',minimize:'Minimalizuj',fakeobjects:{anchor:'Kotwica',flash:'Animacja Flash',iframe:'IFrame',hiddenfield:'Pole ukryte',unknown:'Nieznany obiekt'},resize:'Przeciągnij, aby zmienić rozmiar',colordialog:{title:'Wybierz kolor',options:'Opcje koloru',highlight:'Zaznacz',selected:'Wybrany',clear:'Wyczyść'},toolbarCollapse:'Zwiń pasek narzędzi',toolbarExpand:'Rozwiń pasek narzędzi',toolbarGroups:{document:'Dokument',clipboard:'Schowek/Wstecz',editing:'Edycja',forms:'Formularze',basicstyles:'Style podstawowe',paragraph:'Akapit',links:'Hiperłącza',insert:'Wstawianie',styles:'Style',colors:'Kolory',tools:'Narzędzia'},bidi:{ltr:'Kierunek tekstu od lewej strony do prawej',rtl:'Kierunek tekstu od prawej strony do lewej'},docprops:{label:'Właściwości dokumentu',title:'Właściwości dokumentu',design:'Projekt strony',meta:'Znaczniki meta',chooseColor:'Wybierz',other:'Inne',docTitle:'Tytuł strony',charset:'Kodowanie znaków',charsetOther:'Inne kodowanie znaków',charsetASCII:'ASCII',charsetCE:'Środkowoeuropejskie',charsetCT:'Chińskie tradycyjne (Big5)',charsetCR:'Cyrylica',charsetGR:'Greckie',charsetJP:'Japońskie',charsetKR:'Koreańskie',charsetTR:'Tureckie',charsetUN:'Unicode (UTF-8)',charsetWE:'Zachodnioeuropejskie',docType:'Definicja typu dokumentu',docTypeOther:'Inna definicja typu dokumentu',xhtmlDec:'Uwzględnij deklaracje XHTML',bgColor:'Kolor tła',bgImage:'Adres URL obrazka tła',bgFixed:'Tło nieruchome (nieprzewijające się)',txtColor:'Kolor tekstu',margin:'Marginesy strony',marginTop:'Górny',marginLeft:'Lewy',marginRight:'Prawy',marginBottom:'Dolny',metaKeywords:'Słowa kluczowe dokumentu (oddzielone przecinkami)',metaDescription:'Opis dokumentu',metaAuthor:'Autor',metaCopyright:'Prawa autorskie',previewHtml:'<p>To jest <strong>przykładowy tekst</strong>. Korzystasz z programu <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/pt.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/pt.js
index 1956677..d9478d2 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/pt.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/pt.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.pt={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor de barras de ferramentas',editor:'Editor de texto enriquecido',source:'Fonte',newPage:'Nova Página',save:'Guardar',preview:'Pré-visualizar',cut:'Cortar',copy:'Copiar',paste:'Colar',print:'Imprimir',underline:'Sublinhado',bold:'Negrito',italic:'Itálico',selectAll:'Seleccionar Tudo',removeFormat:'Eliminar Formato',strike:'Rasurado',subscript:'Superior à Linha',superscript:'Inferior à Linha',horizontalrule:'Inserir Linha Horizontal',pagebreak:'Inserir Quebra de Página',pagebreakAlt:'Quebra de página',unlink:'Eliminar Hiperligação',undo:'Anular',redo:'Repetir',common:{browseServer:'Navegar no Servidor',url:'URL',protocol:'Protocolo',upload:'Carregar',uploadSubmit:'Enviar para o Servidor',image:'Imagem',flash:'Flash',form:'Formulário',checkbox:'Caixa de Verificação',radio:'Botão de Opção',textField:'Campo de Texto',textarea:'Área de Texto',hiddenField:'Campo Escondido',button:'Botão',select:'Caixa de Combinação',imageButton:'Botão de Imagem',notSet:'<Não definido>',id:'Id',name:'Nome',langDir:'Orientação de idioma',langDirLtr:'Esquerda à Direita (LTR)',langDirRtl:'Direita a Esquerda (RTL)',langCode:'Código de Idioma',longDescr:'Descrição Completa do URL',cssClass:'Classes de Estilo de Folhas Classes',advisoryTitle:'Título',cssStyle:'Estilo',ok:'OK',cancel:'Cancelar',close:'Fechar',preview:'Pré-visualização',generalTab:'Geral',advancedTab:'Avançado',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Opções',target:'Alvo',targetNew:'Nova Janela (_blank)',targetTop:'Janela superior (_top)',targetSelf:'Mesma janela (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Direita para Esquerda (RTL)',styles:'Estilo',cssClasses:'Stylesheet Classes',width:'Largura',height:'Altura',align:'Alinhamento',alignLeft:'Esquerda',alignRight:'Direita',alignCenter:'Centrado',alignTop:'Topo',alignMiddle:'Centro',alignBottom:'Fundo',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Menu de opções de contexto'},specialChar:{toolbar:'Inserir Caracter Especial',title:'Seleccione um caracter especial',options:'Special Character Options'},link:{toolbar:'Inserir/Editar Hiperligação',other:'<outro>',menu:'Editar Hiperligação',title:'Hiperligação',info:'Informação de Hiperligação',target:'Destino',upload:'Carregar',advanced:'Avançado',type:'Tipo de Hiperligação',toUrl:'URL',toAnchor:'Referência a esta página',toEmail:'E-Mail',targetFrame:'<Frame>',targetPopup:'<Janela de popup>',targetFrameName:'Nome do Frame Destino',targetPopupName:'Nome da Janela de Popup',popupFeatures:'Características de Janela de Popup',popupResizable:'Redimensionável',popupStatusBar:'Barra de Estado',popupLocationBar:'Barra de localização',popupToolbar:'Barra de Ferramentas',popupMenuBar:'Barra de Menu',popupFullScreen:'Janela Completa (IE)',popupScrollBars:'Barras de deslocamento',popupDependent:'Dependente (Netscape)',popupLeft:'Posição Esquerda',popupTop:'Posição Direita',id:'ID',langDir:'Orientação de idioma',langDirLTR:'Esquerda à Direita (LTR)',langDirRTL:'Direita a Esquerda (RTL)',acccessKey:'Chave de Acesso',name:'Nome',langCode:'Orientação de idioma',tabIndex:'Índice de Tubulação',advisoryTitle:'Título',advisoryContentType:'Tipo de Conteúdo',cssClasses:'Classes de Estilo de Folhas Classes',charset:'Fonte de caracteres vinculado',styles:'Estilo',rel:'Relação',selectAnchor:'Seleccionar una referência',anchorName:'Por Nome de Referência',anchorId:'Por ID de elemento',emailAddress:'Endereço de E-Mail',emailSubject:'Título de Mensagem',emailBody:'Corpo da Mensagem',noAnchors:'(Não há referências disponíveis no documento)',noUrl:'Por favor introduza a hiperligação URL',noEmail:'Por favor introduza o endereço de e-mail'},anchor:{toolbar:' Inserir/Editar Âncora',menu:'Propriedades da Âncora',title:'Propriedades da Âncora',name:'Nome da Âncora',errorName:'Por favor, introduza o nome da âncora',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Tipo',start:'Iniciar',validateStartNumber:'List start number must be a whole number.',circle:'Círculo',disc:'Disco',square:'Quadrado',none:'Nenhum',notset:'<not set>',armenian:'Numeração armênia',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Procurar',replace:'Substituir',findWhat:'Texto a Procurar:',replaceWith:'Substituir por:',notFoundMsg:'O texto especificado não foi encontrado.',findOptions:'Find Options',matchCase:'Maiúsculas/Minúsculas',matchWord:'Coincidir com toda a palavra',matchCyclic:'Match cyclic',replaceAll:'Substituir Tudo',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Tabela',title:'Propriedades da Tabela',menu:'Propriedades da Tabela',deleteTable:'Eliminar Tabela',rows:'Linhas',columns:'Colunas',border:'Tamanho do Limite',widthPx:'pixeis',widthPc:'percentagem',widthUnit:'width unit',cellSpace:'Esp. e/células',cellPad:'Esp. interior',caption:'Título',summary:'Sumário',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Célula',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Eliminar Célula',merge:'Unir Células',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Linha',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Eliminar Linhas'},column:{menu:'Coluna',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Eliminar Coluna'}},button:{title:'Propriedades do Botão',text:'Texto (Valor)',type:'Tipo',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Propriedades da Caixa de Verificação',radioTitle:'Propriedades do Botão de Opção',value:'Valor',selected:'Seleccionado'},form:{title:'Propriedades do Formulário',menu:'Propriedades do Formulário',action:'Acção',method:'Método',encoding:'Encoding'},select:{title:'Propriedades da Caixa de Combinação',selectInfo:'Informação',opAvail:'Opções Possíveis',value:'Valor',size:'Tamanho',lines:'linhas',chkMulti:'Permitir selecções múltiplas',opText:'Texto',opValue:'Valor',btnAdd:'Adicionar',btnModify:'Modificar',btnUp:'Para cima',btnDown:'Para baixo',btnSetValue:'Definir um valor por defeito',btnDelete:'Apagar'},textarea:{title:'Propriedades da Área de Texto',cols:'Colunas',rows:'Linhas'},textfield:{title:'Propriedades do Campo de Texto',name:'Nome',value:'Valor',charWidth:'Tamanho do caracter',maxChars:'Nr. Máximo de Caracteres',type:'Tipo',typeText:'Texto',typePass:'Palavra-chave'},hidden:{title:'Propriedades do Campo Escondido',name:'Nome',value:'Valor'},image:{title:'Propriedades da Imagem',titleButton:'Propriedades do Botão de imagens',menu:'Propriedades da Imagem',infoTab:'Informação da Imagem',btnUpload:'Enviar para o Servidor',upload:'Carregar',alt:'Texto Alternativo',lockRatio:'Proporcional',resetSize:'Tamanho Original',border:'Limite',hSpace:'Esp.Horiz',vSpace:'Esp.Vert',alertUrl:'Por favor introduza o URL da imagem',linkTab:'Hiperligação',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Propriedades do Flash',propertiesTab:'Properties',title:'Propriedades do Flash',chkPlay:'Reproduzir automaticamente',chkLoop:'Loop',chkMenu:'Permitir Menu do Flash',chkFull:'Allow Fullscreen',scale:'Escala',scaleAll:'Mostrar tudo',scaleNoBorder:'Sem Limites',scaleFit:'Tamanho Exacto',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs inferior',alignAbsMiddle:'Abs centro',alignBaseline:'Linha de base',alignTextTop:'Topo do texto',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Cor de Fundo',hSpace:'Esp.Horiz',vSpace:'Esp.Vert',validateSrc:'Por favor introduza a hiperligação URL',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Verificação Ortográfica',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Não está num directório',changeTo:'Mudar para',btnIgnore:'Ignorar',btnIgnoreAll:'Ignorar Tudo',btnReplace:'Substituir',btnReplaceAll:'Substituir Tudo',btnUndo:'Anular',noSuggestions:'- Sem sugestões -',progress:'Verificação ortográfica em progresso…',noMispell:'Verificação ortográfica completa: não foram encontrados erros',noChanges:'Verificação ortográfica completa: não houve alteração de palavras',oneChange:'Verificação ortográfica completa: uma palavra alterada',manyChanges:'Verificação ortográfica completa: %1 palavras alteradas',ieSpellDownload:' Verificação ortográfica não instalada. Quer descarregar agora?'},smiley:{toolbar:'Emoticons',title:'Inserir um Emoticon',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Numeração',bulletedlist:'Marcas',indent:'Aumentar Avanço',outdent:'Diminuir Avanço',justify:{left:'Alinhar à Esquerda',center:'Alinhar ao Centro',right:'Alinhar à Direita',block:'Justificado'},blockquote:'Bloco de citação',clipboard:{title:'Colar',cutError:'A configuração de segurança do navegador não permite a execução automática de operações de cortar. Por favor use o teclado (Ctrl/Cmd+X).',copyError:'A configuração de segurança do navegador não permite a execução automática de operações de copiar. Por favor use o teclado (Ctrl/Cmd+C).',pasteMsg:'Por favor, cole dentro da seguinte caixa usando o teclado (<STRONG>Ctrl/Cmd+V</STRONG>) e prima <STRONG>OK</STRONG>.',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Colar do Word',title:'Colar do Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Colar como Texto Simples',title:'Colar como Texto Simples'},templates:{button:'Modelos',title:'Modelo de Conteúdo',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Por favor, seleccione o modelo a abrir no editor<br>(o conteúdo actual será perdido):',emptyListMsg:'(Sem modelos definidos)'},showBlocks:'Exibir blocos',stylesCombo:{label:'Estilo',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Formato',panelTitle:'Formato',tag_p:'Normal',tag_pre:'Formatado',tag_address:'Endereço',tag_h1:'Título 1',tag_h2:'Título 2',tag_h3:'Título 3',tag_h4:'Título 4',tag_h5:'Título 5',tag_h6:'Título 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Tipo de Letra',voiceLabel:'Font',panelTitle:'Tipo de Letra'},fontSize:{label:'Tamanho',voiceLabel:'Font Size',panelTitle:'Tamanho'},colorButton:{textColorTitle:'Cor do Texto',bgColorTitle:'Cor de Fundo',panelTitle:'Colors',auto:'Automático',more:'Mais Cores...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximizar',minimize:'Minimizar',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Arraste para redimensionar',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Colapsar Barra',toolbarExpand:'Expandir Barra',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Propriedades do Documento',title:'Propriedades do Documento',design:'Design',meta:'Meta Data',chooseColor:'Choose',other:'<outro>',docTitle:'Título da Página',charset:'Codificação de Caracteres',charsetOther:'Outra Codificação de Caracteres',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Tipo de Cabeçalho do Documento',docTypeOther:'Outro Tipo de Cabeçalho do Documento',xhtmlDec:'Incluir Declarações XHTML',bgColor:'Cor de Fundo',bgImage:'Caminho para a Imagem de Fundo',bgFixed:'Fundo Fixo',txtColor:'Cor do Texto',margin:'Margem das Páginas',marginTop:'Topo',marginLeft:'Esquerda',marginRight:'Direita',marginBottom:'Fundo',metaKeywords:'Palavras de Indexação do Documento (separadas por virgula)',metaDescription:'Descrição do Documento',metaAuthor:'Autor',metaCopyright:'Direitos de Autor',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.pt={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor de barras de ferramentas',editor:'Editor de texto enriquecido',source:'Fonte',newPage:'Nova Página',save:'Guardar',preview:'Pré-visualizar',cut:'Cortar',copy:'Copiar',paste:'Colar',print:'Imprimir',underline:'Sublinhado',bold:'Negrito',italic:'Itálico',selectAll:'Seleccionar Tudo',removeFormat:'Eliminar Formato',strike:'Rasurado',subscript:'Superior à Linha',superscript:'Inferior à Linha',horizontalrule:'Inserir Linha Horizontal',pagebreak:'Inserir Quebra de Página',pagebreakAlt:'Quebra de página',unlink:'Eliminar Hiperligação',undo:'Anular',redo:'Repetir',common:{browseServer:'Navegar no Servidor',url:'URL',protocol:'Protocolo',upload:'Carregar',uploadSubmit:'Enviar para o Servidor',image:'Imagem',flash:'Flash',form:'Formulário',checkbox:'Caixa de Verificação',radio:'Botão de Opção',textField:'Campo de Texto',textarea:'Área de Texto',hiddenField:'Campo Escondido',button:'Botão',select:'Caixa de Combinação',imageButton:'Botão de Imagem',notSet:'<Não definido>',id:'Id',name:'Nome',langDir:'Orientação de idioma',langDirLtr:'Esquerda à Direita (LTR)',langDirRtl:'Direita a Esquerda (RTL)',langCode:'Código de Idioma',longDescr:'Descrição Completa do URL',cssClass:'Classes de Estilo de Folhas Classes',advisoryTitle:'Título',cssStyle:'Estilo',ok:'OK',cancel:'Cancelar',close:'Fechar',preview:'Pré-visualização',generalTab:'Geral',advancedTab:'Avançado',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Opções',target:'Alvo',targetNew:'Nova Janela (_blank)',targetTop:'Janela superior (_top)',targetSelf:'Mesma janela (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Direita para Esquerda (RTL)',styles:'Estilo',cssClasses:'Stylesheet Classes',width:'Largura',height:'Altura',align:'Alinhamento',alignLeft:'Esquerda',alignRight:'Direita',alignCenter:'Centrado',alignTop:'Topo',alignMiddle:'Centro',alignBottom:'Fundo',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Menu de opções de contexto'},specialChar:{toolbar:'Inserir Caracter Especial',title:'Seleccione um caracter especial',options:'Special Character Options'},link:{toolbar:'Inserir/Editar Hiperligação',other:'<outro>',menu:'Editar Hiperligação',title:'Hiperligação',info:'Informação de Hiperligação',target:'Destino',upload:'Carregar',advanced:'Avançado',type:'Tipo de Hiperligação',toUrl:'URL',toAnchor:'Referência a esta página',toEmail:'E-Mail',targetFrame:'<Frame>',targetPopup:'<Janela de popup>',targetFrameName:'Nome do Frame Destino',targetPopupName:'Nome da Janela de Popup',popupFeatures:'Características de Janela de Popup',popupResizable:'Redimensionável',popupStatusBar:'Barra de Estado',popupLocationBar:'Barra de localização',popupToolbar:'Barra de Ferramentas',popupMenuBar:'Barra de Menu',popupFullScreen:'Janela Completa (IE)',popupScrollBars:'Barras de deslocamento',popupDependent:'Dependente (Netscape)',popupLeft:'Posição Esquerda',popupTop:'Posição Direita',id:'ID',langDir:'Orientação de idioma',langDirLTR:'Esquerda à Direita (LTR)',langDirRTL:'Direita a Esquerda (RTL)',acccessKey:'Chave de Acesso',name:'Nome',langCode:'Orientação de idioma',tabIndex:'Índice de Tubulação',advisoryTitle:'Título',advisoryContentType:'Tipo de Conteúdo',cssClasses:'Classes de Estilo de Folhas Classes',charset:'Fonte de caracteres vinculado',styles:'Estilo',rel:'Relação',selectAnchor:'Seleccionar una referência',anchorName:'Por Nome de Referência',anchorId:'Por ID de elemento',emailAddress:'Endereço de E-Mail',emailSubject:'Título de Mensagem',emailBody:'Corpo da Mensagem',noAnchors:'(Não há referências disponíveis no documento)',noUrl:'Por favor introduza a hiperligação URL',noEmail:'Por favor introduza o endereço de e-mail'},anchor:{toolbar:' Inserir/Editar Âncora',menu:'Propriedades da Âncora',title:'Propriedades da Âncora',name:'Nome da Âncora',errorName:'Por favor, introduza o nome da âncora',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Tipo',start:'Iniciar',validateStartNumber:'List start number must be a whole number.',circle:'Círculo',disc:'Disco',square:'Quadrado',none:'Nenhum',notset:'<not set>',armenian:'Numeração armênia',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Procurar',replace:'Substituir',findWhat:'Texto a Procurar:',replaceWith:'Substituir por:',notFoundMsg:'O texto especificado não foi encontrado.',findOptions:'Find Options',matchCase:'Maiúsculas/Minúsculas',matchWord:'Coincidir com toda a palavra',matchCyclic:'Match cyclic',replaceAll:'Substituir Tudo',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Tabela',title:'Propriedades da Tabela',menu:'Propriedades da Tabela',deleteTable:'Eliminar Tabela',rows:'Linhas',columns:'Colunas',border:'Tamanho do Limite',widthPx:'pixeis',widthPc:'percentagem',widthUnit:'width unit',cellSpace:'Esp. e/células',cellPad:'Esp. interior',caption:'Título',summary:'Sumário',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Célula',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Eliminar Célula',merge:'Unir Células',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Linha',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Eliminar Linhas'},column:{menu:'Coluna',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Eliminar Coluna'}},button:{title:'Propriedades do Botão',text:'Texto (Valor)',type:'Tipo',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Propriedades da Caixa de Verificação',radioTitle:'Propriedades do Botão de Opção',value:'Valor',selected:'Seleccionado'},form:{title:'Propriedades do Formulário',menu:'Propriedades do Formulário',action:'Acção',method:'Método',encoding:'Encoding'},select:{title:'Propriedades da Caixa de Combinação',selectInfo:'Informação',opAvail:'Opções Possíveis',value:'Valor',size:'Tamanho',lines:'linhas',chkMulti:'Permitir selecções múltiplas',opText:'Texto',opValue:'Valor',btnAdd:'Adicionar',btnModify:'Modificar',btnUp:'Para cima',btnDown:'Para baixo',btnSetValue:'Definir um valor por defeito',btnDelete:'Apagar'},textarea:{title:'Propriedades da Área de Texto',cols:'Colunas',rows:'Linhas'},textfield:{title:'Propriedades do Campo de Texto',name:'Nome',value:'Valor',charWidth:'Tamanho do caracter',maxChars:'Nr. Máximo de Caracteres',type:'Tipo',typeText:'Texto',typePass:'Palavra-chave'},hidden:{title:'Propriedades do Campo Escondido',name:'Nome',value:'Valor'},image:{title:'Propriedades da Imagem',titleButton:'Propriedades do Botão de imagens',menu:'Propriedades da Imagem',infoTab:'Informação da Imagem',btnUpload:'Enviar para o Servidor',upload:'Carregar',alt:'Texto Alternativo',lockRatio:'Proporcional',resetSize:'Tamanho Original',border:'Limite',hSpace:'Esp.Horiz',vSpace:'Esp.Vert',alertUrl:'Por favor introduza o URL da imagem',linkTab:'Hiperligação',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Propriedades do Flash',propertiesTab:'Properties',title:'Propriedades do Flash',chkPlay:'Reproduzir automaticamente',chkLoop:'Loop',chkMenu:'Permitir Menu do Flash',chkFull:'Allow Fullscreen',scale:'Escala',scaleAll:'Mostrar tudo',scaleNoBorder:'Sem Limites',scaleFit:'Tamanho Exacto',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs inferior',alignAbsMiddle:'Abs centro',alignBaseline:'Linha de base',alignTextTop:'Topo do texto',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Cor de Fundo',hSpace:'Esp.Horiz',vSpace:'Esp.Vert',validateSrc:'Por favor introduza a hiperligação URL',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Verificação Ortográfica',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Não está num directório',changeTo:'Mudar para',btnIgnore:'Ignorar',btnIgnoreAll:'Ignorar Tudo',btnReplace:'Substituir',btnReplaceAll:'Substituir Tudo',btnUndo:'Anular',noSuggestions:'- Sem sugestões -',progress:'Verificação ortográfica em progresso…',noMispell:'Verificação ortográfica completa: não foram encontrados erros',noChanges:'Verificação ortográfica completa: não houve alteração de palavras',oneChange:'Verificação ortográfica completa: uma palavra alterada',manyChanges:'Verificação ortográfica completa: %1 palavras alteradas',ieSpellDownload:' Verificação ortográfica não instalada. Quer descarregar agora?'},smiley:{toolbar:'Emoticons',title:'Inserir um Emoticon',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Numeração',bulletedlist:'Marcas',indent:'Aumentar Avanço',outdent:'Diminuir Avanço',justify:{left:'Alinhar à Esquerda',center:'Alinhar ao Centro',right:'Alinhar à Direita',block:'Justificado'},blockquote:'Bloco de citação',clipboard:{title:'Colar',cutError:'A configuração de segurança do navegador não permite a execução automática de operações de cortar. Por favor use o teclado (Ctrl/Cmd+X).',copyError:'A configuração de segurança do navegador não permite a execução automática de operações de copiar. Por favor use o teclado (Ctrl/Cmd+C).',pasteMsg:'Por favor, cole dentro da seguinte caixa usando o teclado (<STRONG>Ctrl/Cmd+V</STRONG>) e prima <STRONG>OK</STRONG>.',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Colar do Word',title:'Colar do Word',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Colar como Texto Simples',title:'Colar como Texto Simples'},templates:{button:'Modelos',title:'Modelo de Conteúdo',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Por favor, seleccione o modelo a abrir no editor<br>(o conteúdo actual será perdido):',emptyListMsg:'(Sem modelos definidos)'},showBlocks:'Exibir blocos',stylesCombo:{label:'Estilo',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Formato',panelTitle:'Formato',tag_p:'Normal',tag_pre:'Formatado',tag_address:'Endereço',tag_h1:'Título 1',tag_h2:'Título 2',tag_h3:'Título 3',tag_h4:'Título 4',tag_h5:'Título 5',tag_h6:'Título 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Tipo de Letra',voiceLabel:'Font',panelTitle:'Tipo de Letra'},fontSize:{label:'Tamanho',voiceLabel:'Font Size',panelTitle:'Tamanho'},colorButton:{textColorTitle:'Cor do Texto',bgColorTitle:'Cor de Fundo',panelTitle:'Colors',auto:'Automático',more:'Mais Cores...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximizar',minimize:'Minimizar',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Arraste para redimensionar',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Colapsar Barra',toolbarExpand:'Expandir Barra',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Propriedades do Documento',title:'Propriedades do Documento',design:'Design',meta:'Meta Data',chooseColor:'Choose',other:'<outro>',docTitle:'Título da Página',charset:'Codificação de Caracteres',charsetOther:'Outra Codificação de Caracteres',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Tipo de Cabeçalho do Documento',docTypeOther:'Outro Tipo de Cabeçalho do Documento',xhtmlDec:'Incluir Declarações XHTML',bgColor:'Cor de Fundo',bgImage:'Caminho para a Imagem de Fundo',bgFixed:'Fundo Fixo',txtColor:'Cor do Texto',margin:'Margem das Páginas',marginTop:'Topo',marginLeft:'Esquerda',marginRight:'Direita',marginBottom:'Fundo',metaKeywords:'Palavras de Indexação do Documento (separadas por virgula)',metaDescription:'Descrição do Documento',metaAuthor:'Autor',metaCopyright:'Direitos de Autor',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/pt-br.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/pt-br.js
index 1a09d40..0ab78cb 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/pt-br.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/pt-br.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang['pt-br']={dir:'ltr',editorTitle:'Editor de texto rico, %1',editorHelp:'Pressione ALT+0 para ajuda',toolbars:'Barra de Ferramentas do Editor',editor:'Editor de Texto',source:'Código-Fonte',newPage:'Novo',save:'Salvar',preview:'Visualizar',cut:'Recortar',copy:'Copiar',paste:'Colar',print:'Imprimir',underline:'Sublinhado',bold:'Negrito',italic:'Itálico',selectAll:'Selecionar Tudo',removeFormat:'Remover Formatação',strike:'Tachado',subscript:'Subscrito',superscript:'Sobrescrito',horizontalrule:'Inserir Linha Horizontal',pagebreak:'Inserir Quebra de Página',pagebreakAlt:'Quebra de Página',unlink:'Remover Link',undo:'Desfazer',redo:'Refazer',common:{browseServer:'Localizar no Servidor',url:'URL',protocol:'Protocolo',upload:'Enviar ao Servidor',uploadSubmit:'Enviar para o Servidor',image:'Imagem',flash:'Flash',form:'Formulário',checkbox:'Caixa de Seleção',radio:'Botão de Opção',textField:'Caixa de Texto',textarea:'Área de Texto',hiddenField:'Campo Oculto',button:'Botão',select:'Caixa de Listagem',imageButton:'Botão de Imagem',notSet:'<não ajustado>',id:'Id',name:'Nome',langDir:'Direção do idioma',langDirLtr:'Esquerda para Direita (LTR)',langDirRtl:'Direita para Esquerda (RTL)',langCode:'Idioma',longDescr:'Descrição da URL',cssClass:'Classe de CSS',advisoryTitle:'Título',cssStyle:'Estilos',ok:'OK',cancel:'Cancelar',close:'Fechar',preview:'Visualizar',generalTab:'Geral',advancedTab:'Avançado',validateNumberFailed:'Este valor não é um número.',confirmNewPage:'Todas as mudanças não salvas serão perdidas. Tem certeza de que quer abrir uma nova página?',confirmCancel:'Algumas opções foram alteradas. Tem certeza de que quer fechar a caixa de diálogo?',options:'Opções',target:'Destino',targetNew:'Nova Janela (_blank)',targetTop:'Janela de Cima (_top)',targetSelf:'Mesma Janela (_self)',targetParent:'Janela Pai (_parent)',langDirLTR:'Esquerda para Direita (LTR)',langDirRTL:'Direita para Esquerda (RTL)',styles:'Estilo',cssClasses:'Classes',width:'Largura',height:'Altura',align:'Alinhamento',alignLeft:'Esquerda',alignRight:'Direita',alignCenter:'Centralizado',alignTop:'Superior',alignMiddle:'Centralizado',alignBottom:'Inferior',invalidHeight:'A altura tem que ser um número',invalidWidth:'A largura tem que ser um número.',invalidCssLength:'O valor do campo "%1" deve ser um número positivo opcionalmente seguido por uma válida unidade de medida de CSS (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'O valor do campo "%1" deve ser um número positivo opcionalmente seguido por uma válida unidade de medida de HTML (px or %).',invalidInlineStyle:'O valor válido para estilo deve conter uma ou mais tuplas no formato "nome : valor", separados por ponto e vírgula.',cssLengthTooltip:'Insira um número para valor em pixels ou um número seguido de uma válida unidade de medida de CSS (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, indisponível</span>'},contextmenu:{options:'Opções Menu de Contexto'},specialChar:{toolbar:'Inserir Caractere Especial',title:'Selecione um Caractere Especial',options:'Opções de Caractere Especial'},link:{toolbar:'Inserir/Editar Link',other:'<outro>',menu:'Editar Link',title:'Editar Link',info:'Informações',target:'Destino',upload:'Enviar ao Servidor',advanced:'Avançado',type:'Tipo de hiperlink',toUrl:'URL',toAnchor:'Âncora nesta página',toEmail:'E-Mail',targetFrame:'<frame>',targetPopup:'<janela popup>',targetFrameName:'Nome do Frame de Destino',targetPopupName:'Nome da Janela Pop-up',popupFeatures:'Propriedades da Janela Pop-up',popupResizable:'Redimensionável',popupStatusBar:'Barra de Status',popupLocationBar:'Barra de Endereços',popupToolbar:'Barra de Ferramentas',popupMenuBar:'Barra de Menus',popupFullScreen:'Modo Tela Cheia (IE)',popupScrollBars:'Barras de Rolagem',popupDependent:'Dependente (Netscape)',popupLeft:'Esquerda',popupTop:'Topo',id:'Id',langDir:'Direção do idioma',langDirLTR:'Esquerda para Direita (LTR)',langDirRTL:'Direita para Esquerda (RTL)',acccessKey:'Chave de Acesso',name:'Nome',langCode:'Direção do idioma',tabIndex:'Índice de Tabulação',advisoryTitle:'Título',advisoryContentType:'Tipo de Conteúdo',cssClasses:'Classe de CSS',charset:'Charset do Link',styles:'Estilos',rel:'Tipo de Relação',selectAnchor:'Selecione uma âncora',anchorName:'Nome da âncora',anchorId:'Id da âncora',emailAddress:'Endereço E-Mail',emailSubject:'Assunto da Mensagem',emailBody:'Corpo da Mensagem',noAnchors:'(Não há âncoras no documento)',noUrl:'Por favor, digite o endereço do Link',noEmail:'Por favor, digite o endereço de e-mail'},anchor:{toolbar:'Inserir/Editar Âncora',menu:'Formatar Âncora',title:'Formatar Âncora',name:'Nome da Âncora',errorName:'Por favor, digite o nome da âncora',remove:'Remover Âncora'},list:{numberedTitle:'Propriedades da Lista Numerada',bulletedTitle:'Propriedades da Lista sem Numeros',type:'Tipo',start:'Início',validateStartNumber:'O número inicial da lista deve ser um número inteiro.',circle:'Círculo',disc:'Disco',square:'Quadrado',none:'Nenhum',notset:'<não definido>',armenian:'Numeração Armêna',georgian:'Numeração da Geórgia (an, ban, gan, etc.)',lowerRoman:'Numeração Romana minúscula (i, ii, iii, iv, v, etc.)',upperRoman:'Numeração Romana maiúscula (I, II, III, IV, V, etc.)',lowerAlpha:'Numeração Alfabética minúscula (a, b, c, d, e, etc.)',upperAlpha:'Numeração Alfabética Maiúscula (A, B, C, D, E, etc.)',lowerGreek:'Numeração Grega minúscula (alpha, beta, gamma, etc.)',decimal:'Numeração Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Numeração Decimal com zeros (01, 02, 03, etc.)'},findAndReplace:{title:'Localizar e Substituir',find:'Localizar',replace:'Substituir',findWhat:'Procurar por:',replaceWith:'Substituir por:',notFoundMsg:'O texto especificado não foi encontrado.',findOptions:'Opções',matchCase:'Coincidir Maiúsculas/Minúsculas',matchWord:'Coincidir a palavra inteira',matchCyclic:'Coincidir cíclico',replaceAll:'Substituir Tudo',replaceSuccessMsg:'%1 ocorrência(s) substituída(s).'},table:{toolbar:'Tabela',title:'Formatar Tabela',menu:'Formatar Tabela',deleteTable:'Apagar Tabela',rows:'Linhas',columns:'Colunas',border:'Borda',widthPx:'pixels',widthPc:'%',widthUnit:'unidade largura',cellSpace:'Espaçamento',cellPad:'Margem interna',caption:'Legenda',summary:'Resumo',headers:'Cabeçalho',headersNone:'Nenhum',headersColumn:'Primeira coluna',headersRow:'Primeira linha',headersBoth:'Ambos',invalidRows:'O número de linhas tem que ser um número maior que 0.',invalidCols:'O número de colunas tem que ser um número maior que 0.',invalidBorder:'O tamanho da borda tem que ser um número.',invalidWidth:'A largura da tabela tem que ser um número.',invalidHeight:'A altura da tabela tem que ser um número.',invalidCellSpacing:'O espaçamento das células tem que ser um número.',invalidCellPadding:'A margem interna das células tem que ser um número.',cell:{menu:'Célula',insertBefore:'Inserir célula a esquerda',insertAfter:'Inserir célula a direita',deleteCell:'Remover Células',merge:'Mesclar Células',mergeRight:'Mesclar com célula a direita',mergeDown:'Mesclar com célula abaixo',splitHorizontal:'Dividir célula horizontalmente',splitVertical:'Dividir célula verticalmente',title:'Propriedades da célula',cellType:'Tipo de célula',rowSpan:'Linhas cobertas',colSpan:'Colunas cobertas',wordWrap:'Quebra de palavra',hAlign:'Alinhamento horizontal',vAlign:'Alinhamento vertical',alignBaseline:'Patamar de alinhamento',bgColor:'Cor de fundo',borderColor:'Cor das bordas',data:'Dados',header:'Cabeçalho',yes:'Sim',no:'Não',invalidWidth:'A largura da célula tem que ser um número.',invalidHeight:'A altura da célula tem que ser um número.',invalidRowSpan:'Linhas cobertas tem que ser um número inteiro.',invalidColSpan:'Colunas cobertas tem que ser um número inteiro.',chooseColor:'Escolher'},row:{menu:'Linha',insertBefore:'Inserir linha acima',insertAfter:'Inserir linha abaixo',deleteRow:'Remover Linhas'},column:{menu:'Coluna',insertBefore:'Inserir coluna a esquerda',insertAfter:'Inserir coluna a direita',deleteColumn:'Remover Colunas'}},button:{title:'Formatar Botão',text:'Texto (Valor)',type:'Tipo',typeBtn:'Botão',typeSbm:'Enviar',typeRst:'Limpar'},checkboxAndRadio:{checkboxTitle:'Formatar Caixa de Seleção',radioTitle:'Formatar Botão de Opção',value:'Valor',selected:'Selecionado'},form:{title:'Formatar Formulário',menu:'Formatar Formulário',action:'Ação',method:'Método',encoding:'Codificação'},select:{title:'Formatar Caixa de Listagem',selectInfo:'Informações',opAvail:'Opções disponíveis',value:'Valor',size:'Tamanho',lines:'linhas',chkMulti:'Permitir múltiplas seleções',opText:'Texto',opValue:'Valor',btnAdd:'Adicionar',btnModify:'Modificar',btnUp:'Para cima',btnDown:'Para baixo',btnSetValue:'Definir como selecionado',btnDelete:'Remover'},textarea:{title:'Formatar Área de Texto',cols:'Colunas',rows:'Linhas'},textfield:{title:'Formatar Caixa de Texto',name:'Nome',value:'Valor',charWidth:'Comprimento (em caracteres)',maxChars:'Número Máximo de Caracteres',type:'Tipo',typeText:'Texto',typePass:'Senha'},hidden:{title:'Formatar Campo Oculto',name:'Nome',value:'Valor'},image:{title:'Formatar Imagem',titleButton:'Formatar Botão de Imagem',menu:'Formatar Imagem',infoTab:'Informações da Imagem',btnUpload:'Enviar para o Servidor',upload:'Enviar',alt:'Texto Alternativo',lockRatio:'Travar Proporções',resetSize:'Redefinir para o Tamanho Original',border:'Borda',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Por favor, digite a URL da imagem.',linkTab:'Link',button2Img:'Deseja transformar o botão de imagem em uma imagem comum?',img2Button:'Deseja transformar a imagem em um botão de imagem?',urlMissing:'URL da imagem está faltando.',validateBorder:'A borda deve ser um número inteiro.',validateHSpace:'O HSpace deve ser um número inteiro.',validateVSpace:'O VSpace deve ser um número inteiro.'},flash:{properties:'Propriedades do Flash',propertiesTab:'Propriedades',title:'Propriedades do Flash',chkPlay:'Tocar Automaticamente',chkLoop:'Tocar Infinitamente',chkMenu:'Habilita Menu Flash',chkFull:'Permitir tela cheia',scale:'Escala',scaleAll:'Mostrar tudo',scaleNoBorder:'Sem Borda',scaleFit:'Escala Exata',access:'Acesso ao script',accessAlways:'Sempre',accessSameDomain:'Acessar Mesmo Domínio',accessNever:'Nunca',alignAbsBottom:'Inferior Absoluto',alignAbsMiddle:'Centralizado Absoluto',alignBaseline:'Baseline',alignTextTop:'Superior Absoluto',quality:'Qualidade',qualityBest:'Qualidade Melhor',qualityHigh:'Qualidade Alta',qualityAutoHigh:'Qualidade Alta Automática',qualityMedium:'Qualidade Média',qualityAutoLow:'Qualidade Baixa Automática',qualityLow:'Qualidade Baixa',windowModeWindow:'Janela',windowModeOpaque:'Opaca',windowModeTransparent:'Transparente',windowMode:'Modo da janela',flashvars:'Variáveis do Flash',bgcolor:'Cor do Plano de Fundo',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'Por favor, digite o endereço do link',validateHSpace:'O HSpace tem que ser um número',validateVSpace:'O VSpace tem que ser um número.'},spellCheck:{toolbar:'Verificar Ortografia',title:'Corretor Ortográfico',notAvailable:'Desculpe, o serviço não está disponível no momento.',errorLoading:'Erro carregando servidor de aplicação: %s.',notInDic:'Não encontrada',changeTo:'Alterar para',btnIgnore:'Ignorar uma vez',btnIgnoreAll:'Ignorar Todas',btnReplace:'Alterar',btnReplaceAll:'Alterar Todas',btnUndo:'Desfazer',noSuggestions:'-sem sugestões de ortografia-',progress:'Verificação ortográfica em andamento...',noMispell:'Verificação encerrada: Não foram encontrados erros de ortografia',noChanges:'Verificação ortográfica encerrada: Não houve alterações',oneChange:'Verificação ortográfica encerrada: Uma palavra foi alterada',manyChanges:'Verificação ortográfica encerrada: %1 palavras foram alteradas',ieSpellDownload:'A verificação ortográfica não foi instalada. Você gostaria de realizar o download agora?'},smiley:{toolbar:'Emoticon',title:'Inserir Emoticon',options:'Opções de Emoticons'},elementsPath:{eleLabel:'Caminho dos Elementos',eleTitle:'Elemento %1'},numberedlist:'Lista numerada',bulletedlist:'Lista sem números',indent:'Aumentar Recuo',outdent:'Diminuir Recuo',justify:{left:'Alinhar Esquerda',center:'Centralizar',right:'Alinhar Direita',block:'Justificado'},blockquote:'Citação',clipboard:{title:'Colar',cutError:'As configurações de segurança do seu navegador não permitem que o editor execute operações de recortar automaticamente. Por favor, utilize o teclado para recortar (Ctrl/Cmd+X).',copyError:'As configurações de segurança do seu navegador não permitem que o editor execute operações de copiar automaticamente. Por favor, utilize o teclado para copiar (Ctrl/Cmd+C).',pasteMsg:'Transfira o link usado na caixa usando o teclado com (<STRONG>Ctrl/Cmd+V</STRONG>) e <STRONG>OK</STRONG>.',securityMsg:'As configurações de segurança do seu navegador não permitem que o editor acesse os dados da área de transferência diretamente. Por favor cole o conteúdo manualmente nesta janela.',pasteArea:'Área para Colar'},pastefromword:{confirmCleanup:'O texto que você deseja colar parece ter sido copiado do Word. Você gostaria de remover a formatação antes de colar?',toolbar:'Colar do Word',title:'Colar do Word',error:'Não foi possível limpar os dados colados devido a um erro interno'},pasteText:{button:'Colar como Texto sem Formatação',title:'Colar como Texto sem Formatação'},templates:{button:'Modelos de layout',title:'Modelo de layout de conteúdo',options:'Opções de Template',insertOption:'Substituir o conteúdo atual',selectPromptMsg:'Selecione um modelo de layout para ser aberto no editor<br>(o conteúdo atual será perdido):',emptyListMsg:'(Não foram definidos modelos de layout)'},showBlocks:'Mostrar blocos de código',stylesCombo:{label:'Estilo',panelTitle:'Estilos de Formatação',panelTitle1:'Estilos de bloco',panelTitle2:'Estilos de texto corrido',panelTitle3:'Estilos de objeto'},format:{label:'Formatação',panelTitle:'Formatação',tag_p:'Normal',tag_pre:'Formatado',tag_address:'Endereço',tag_h1:'Título 1',tag_h2:'Título 2',tag_h3:'Título 3',tag_h4:'Título 4',tag_h5:'Título 5',tag_h6:'Título 6',tag_div:'Normal (DIV)'},div:{title:'Criar Container de DIV',toolbar:'Criar Container de DIV',cssClassInputLabel:'Classes de CSS',styleSelectLabel:'Estilo',IdInputLabel:'Id',languageCodeInputLabel:'Código de Idioma',inlineStyleInputLabel:'Estilo Inline',advisoryTitleInputLabel:'Título Consulta',langDirLabel:'Direção da Escrita',langDirLTRLabel:'Esquerda para Direita (LTR)',langDirRTLLabel:'Direita para Esquerda (RTL)',edit:'Editar Div',remove:'Remover Div'},iframe:{title:'Propriedade do IFrame',toolbar:'IFrame',noUrl:'Insira a URL do iframe',scrolling:'Abilita scrollbars',border:'Mostra borda do iframe'},font:{label:'Fonte',voiceLabel:'Fonte',panelTitle:'Fonte'},fontSize:{label:'Tamanho',voiceLabel:'Tamanho da fonte',panelTitle:'Tamanho'},colorButton:{textColorTitle:'Cor do Texto',bgColorTitle:'Cor do Plano de Fundo',panelTitle:'Cores',auto:'Automático',more:'Mais Cores...'},colors:{'000':'Preto',800000:'Foquete','8B4513':'Marrom 1','2F4F4F':'Cinza 1','008080':'Cerceta','000080':'Azul Marinho','4B0082':'Índigo',696969:'Cinza 2',B22222:'Tijolo de Fogo',A52A2A:'Marrom 2',DAA520:'Vara Dourada','006400':'Verde Escuro','40E0D0':'Turquesa','0000CD':'Azul Médio',800080:'Roxo',808080:'Cinza 3',F00:'Vermelho',FF8C00:'Laranja Escuro',FFD700:'Dourado','008000':'Verde','0FF':'Ciano','00F':'Azul',EE82EE:'Violeta',A9A9A9:'Cinza Escuro',FFA07A:'Salmão Claro',FFA500:'Laranja',FFFF00:'Amarelo','00FF00':'Lima',AFEEEE:'Turquesa Pálido',ADD8E6:'Azul Claro',DDA0DD:'Ameixa',D3D3D3:'Cinza Claro',FFF0F5:'Lavanda 1',FAEBD7:'Branco Antiguidade',FFFFE0:'Amarelo Claro',F0FFF0:'Orvalho',F0FFFF:'Azure',F0F8FF:'Azul Alice',E6E6FA:'Lavanda 2',FFF:'Branco'},scayt:{title:'Correção ortográfica durante a digitação',opera_title:'Não suportado no Opera',enable:'Habilitar correção ortográfica durante a digitação',disable:'Desabilitar correção ortográfica durante a digitação',about:'Sobre a correção ortográfica durante a digitação',toggle:'Ativar/desativar correção ortográfica durante a digitação',options:'Opções',langs:'Idiomas',moreSuggestions:'Mais sugestões',ignore:'Ignorar',ignoreAll:'Ignorar todas',addWord:'Adicionar palavra',emptyDic:'O nome do dicionário não deveria estar vazio.',optionsTab:'Opções',allCaps:'Ignorar palavras maiúsculas',ignoreDomainNames:'Ignorar nomes de domínio',mixedCase:'Ignorar palavras com maiúsculas e minúsculas misturadas',mixedWithDigits:'Ignorar palavras com números',languagesTab:'Idiomas',dictionariesTab:'Dicionários',dic_field_name:'Nome do Dicionário',dic_create:'Criar',dic_restore:'Restaurar',dic_delete:'Excluir',dic_rename:'Renomear',dic_info:'Inicialmente, o dicionário do usuário fica armazenado em um Cookie. Porém, Cookies tem tamanho limitado, portanto quand o dicionário do usuário atingir o tamanho limite poderá ser armazenado no nosso servidor. Para armazenar seu dicionário pessoal no nosso servidor deverá especificar um nome para ele. Se já tiver um dicionário armazenado por favor especifique o seu nome e clique em Restaurar.',aboutTab:'Sobre'},about:{title:'Sobre o CKEditor',dlgTitle:'Sobre o CKEditor',help:'Verifique o $1 para obter ajuda.',userGuide:'Guia do Usuário do CKEditor',moreInfo:'Para informações sobre a licença por favor visite o nosso site:',copy:'Copyright © $1. Todos os direitos reservados.'},maximize:'Maximizar',minimize:'Minimize',fakeobjects:{anchor:'Âncora',flash:'Animação em Flash',iframe:'IFrame',hiddenfield:'Campo Oculto',unknown:'Objeto desconhecido'},resize:'Arraste para redimensionar',colordialog:{title:'Selecione uma Cor',options:'Opções de Cor',highlight:'Grifar',selected:'Cor Selecionada',clear:'Limpar'},toolbarCollapse:'Diminuir Barra de Ferramentas',toolbarExpand:'Aumentar Barra de Ferramentas',toolbarGroups:{document:'Documento',clipboard:'Clipboard/Desfazer',editing:'Edição',forms:'Formulários',basicstyles:'Estilos Básicos',paragraph:'Paragrafo',links:'Links',insert:'Inserir',styles:'Estilos',colors:'Cores',tools:'Ferramentas'},bidi:{ltr:'Direção do texto da esquerda para a direita',rtl:'Direção do texto da direita para a esquerda'},docprops:{label:'Propriedades Documento',title:'Propriedades Documento',design:'Design',meta:'Meta Dados',chooseColor:'Escolher',other:'<outro>',docTitle:'Título da Página',charset:'Codificação de Caracteres',charsetOther:'Outra Codificação de Caracteres',charsetASCII:'ASCII',charsetCE:'Europa Central',charsetCT:'Chinês Tradicional (Big5)',charsetCR:'Cirílico',charsetGR:'Grego',charsetJP:'Japonês',charsetKR:'Coreano',charsetTR:'Turco',charsetUN:'Unicode (UTF-8)',charsetWE:'Europa Ocidental',docType:'Cabeçalho Tipo de Documento',docTypeOther:'Outro Tipo de Documento',xhtmlDec:'Incluir Declarações XHTML',bgColor:'Cor do Plano de Fundo',bgImage:'URL da Imagem de Plano de Fundo',bgFixed:'Plano de Fundo Fixo',txtColor:'Cor do Texto',margin:'Margens da Página',marginTop:'Superior',marginLeft:'Inferior',marginRight:'Direita',marginBottom:'Inferior',metaKeywords:'Palavras-chave de Indexação do Documento (separadas por vírgula)',metaDescription:'Descrição do Documento',metaAuthor:'Autor',metaCopyright:'Direitos Autorais',previewHtml:'<p>Este é um <strong>texto de exemplo</strong>. Você está usando <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang['pt-br']={dir:'ltr',editorTitle:'Editor de texto rico, %1',editorHelp:'Pressione ALT+0 para ajuda',toolbars:'Barra de Ferramentas do Editor',editor:'Editor de Texto',source:'Código-Fonte',newPage:'Novo',save:'Salvar',preview:'Visualizar',cut:'Recortar',copy:'Copiar',paste:'Colar',print:'Imprimir',underline:'Sublinhado',bold:'Negrito',italic:'Itálico',selectAll:'Selecionar Tudo',removeFormat:'Remover Formatação',strike:'Tachado',subscript:'Subscrito',superscript:'Sobrescrito',horizontalrule:'Inserir Linha Horizontal',pagebreak:'Inserir Quebra de Página',pagebreakAlt:'Quebra de Página',unlink:'Remover Link',undo:'Desfazer',redo:'Refazer',common:{browseServer:'Localizar no Servidor',url:'URL',protocol:'Protocolo',upload:'Enviar ao Servidor',uploadSubmit:'Enviar para o Servidor',image:'Imagem',flash:'Flash',form:'Formulário',checkbox:'Caixa de Seleção',radio:'Botão de Opção',textField:'Caixa de Texto',textarea:'Área de Texto',hiddenField:'Campo Oculto',button:'Botão',select:'Caixa de Listagem',imageButton:'Botão de Imagem',notSet:'<não ajustado>',id:'Id',name:'Nome',langDir:'Direção do idioma',langDirLtr:'Esquerda para Direita (LTR)',langDirRtl:'Direita para Esquerda (RTL)',langCode:'Idioma',longDescr:'Descrição da URL',cssClass:'Classe de CSS',advisoryTitle:'Título',cssStyle:'Estilos',ok:'OK',cancel:'Cancelar',close:'Fechar',preview:'Visualizar',generalTab:'Geral',advancedTab:'Avançado',validateNumberFailed:'Este valor não é um número.',confirmNewPage:'Todas as mudanças não salvas serão perdidas. Tem certeza de que quer abrir uma nova página?',confirmCancel:'Algumas opções foram alteradas. Tem certeza de que quer fechar a caixa de diálogo?',options:'Opções',target:'Destino',targetNew:'Nova Janela (_blank)',targetTop:'Janela de Cima (_top)',targetSelf:'Mesma Janela (_self)',targetParent:'Janela Pai (_parent)',langDirLTR:'Esquerda para Direita (LTR)',langDirRTL:'Direita para Esquerda (RTL)',styles:'Estilo',cssClasses:'Classes',width:'Largura',height:'Altura',align:'Alinhamento',alignLeft:'Esquerda',alignRight:'Direita',alignCenter:'Centralizado',alignTop:'Superior',alignMiddle:'Centralizado',alignBottom:'Inferior',invalidHeight:'A altura tem que ser um número',invalidWidth:'A largura tem que ser um número.',invalidCssLength:'O valor do campo "%1" deve ser um número positivo opcionalmente seguido por uma válida unidade de medida de CSS (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'O valor do campo "%1" deve ser um número positivo opcionalmente seguido por uma válida unidade de medida de HTML (px or %).',invalidInlineStyle:'O valor válido para estilo deve conter uma ou mais tuplas no formato "nome : valor", separados por ponto e vírgula.',cssLengthTooltip:'Insira um número para valor em pixels ou um número seguido de uma válida unidade de medida de CSS (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, indisponível</span>'},contextmenu:{options:'Opções Menu de Contexto'},specialChar:{toolbar:'Inserir Caractere Especial',title:'Selecione um Caractere Especial',options:'Opções de Caractere Especial'},link:{toolbar:'Inserir/Editar Link',other:'<outro>',menu:'Editar Link',title:'Editar Link',info:'Informações',target:'Destino',upload:'Enviar ao Servidor',advanced:'Avançado',type:'Tipo de hiperlink',toUrl:'URL',toAnchor:'Âncora nesta página',toEmail:'E-Mail',targetFrame:'<frame>',targetPopup:'<janela popup>',targetFrameName:'Nome do Frame de Destino',targetPopupName:'Nome da Janela Pop-up',popupFeatures:'Propriedades da Janela Pop-up',popupResizable:'Redimensionável',popupStatusBar:'Barra de Status',popupLocationBar:'Barra de Endereços',popupToolbar:'Barra de Ferramentas',popupMenuBar:'Barra de Menus',popupFullScreen:'Modo Tela Cheia (IE)',popupScrollBars:'Barras de Rolagem',popupDependent:'Dependente (Netscape)',popupLeft:'Esquerda',popupTop:'Topo',id:'Id',langDir:'Direção do idioma',langDirLTR:'Esquerda para Direita (LTR)',langDirRTL:'Direita para Esquerda (RTL)',acccessKey:'Chave de Acesso',name:'Nome',langCode:'Direção do idioma',tabIndex:'Índice de Tabulação',advisoryTitle:'Título',advisoryContentType:'Tipo de Conteúdo',cssClasses:'Classe de CSS',charset:'Charset do Link',styles:'Estilos',rel:'Tipo de Relação',selectAnchor:'Selecione uma âncora',anchorName:'Nome da âncora',anchorId:'Id da âncora',emailAddress:'Endereço E-Mail',emailSubject:'Assunto da Mensagem',emailBody:'Corpo da Mensagem',noAnchors:'(Não há âncoras no documento)',noUrl:'Por favor, digite o endereço do Link',noEmail:'Por favor, digite o endereço de e-mail'},anchor:{toolbar:'Inserir/Editar Âncora',menu:'Formatar Âncora',title:'Formatar Âncora',name:'Nome da Âncora',errorName:'Por favor, digite o nome da âncora',remove:'Remover Âncora'},list:{numberedTitle:'Propriedades da Lista Numerada',bulletedTitle:'Propriedades da Lista sem Numeros',type:'Tipo',start:'Início',validateStartNumber:'O número inicial da lista deve ser um número inteiro.',circle:'Círculo',disc:'Disco',square:'Quadrado',none:'Nenhum',notset:'<não definido>',armenian:'Numeração Armêna',georgian:'Numeração da Geórgia (an, ban, gan, etc.)',lowerRoman:'Numeração Romana minúscula (i, ii, iii, iv, v, etc.)',upperRoman:'Numeração Romana maiúscula (I, II, III, IV, V, etc.)',lowerAlpha:'Numeração Alfabética minúscula (a, b, c, d, e, etc.)',upperAlpha:'Numeração Alfabética Maiúscula (A, B, C, D, E, etc.)',lowerGreek:'Numeração Grega minúscula (alpha, beta, gamma, etc.)',decimal:'Numeração Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Numeração Decimal com zeros (01, 02, 03, etc.)'},findAndReplace:{title:'Localizar e Substituir',find:'Localizar',replace:'Substituir',findWhat:'Procurar por:',replaceWith:'Substituir por:',notFoundMsg:'O texto especificado não foi encontrado.',findOptions:'Opções',matchCase:'Coincidir Maiúsculas/Minúsculas',matchWord:'Coincidir a palavra inteira',matchCyclic:'Coincidir cíclico',replaceAll:'Substituir Tudo',replaceSuccessMsg:'%1 ocorrência(s) substituída(s).'},table:{toolbar:'Tabela',title:'Formatar Tabela',menu:'Formatar Tabela',deleteTable:'Apagar Tabela',rows:'Linhas',columns:'Colunas',border:'Borda',widthPx:'pixels',widthPc:'%',widthUnit:'unidade largura',cellSpace:'Espaçamento',cellPad:'Margem interna',caption:'Legenda',summary:'Resumo',headers:'Cabeçalho',headersNone:'Nenhum',headersColumn:'Primeira coluna',headersRow:'Primeira linha',headersBoth:'Ambos',invalidRows:'O número de linhas tem que ser um número maior que 0.',invalidCols:'O número de colunas tem que ser um número maior que 0.',invalidBorder:'O tamanho da borda tem que ser um número.',invalidWidth:'A largura da tabela tem que ser um número.',invalidHeight:'A altura da tabela tem que ser um número.',invalidCellSpacing:'O espaçamento das células tem que ser um número.',invalidCellPadding:'A margem interna das células tem que ser um número.',cell:{menu:'Célula',insertBefore:'Inserir célula a esquerda',insertAfter:'Inserir célula a direita',deleteCell:'Remover Células',merge:'Mesclar Células',mergeRight:'Mesclar com célula a direita',mergeDown:'Mesclar com célula abaixo',splitHorizontal:'Dividir célula horizontalmente',splitVertical:'Dividir célula verticalmente',title:'Propriedades da célula',cellType:'Tipo de célula',rowSpan:'Linhas cobertas',colSpan:'Colunas cobertas',wordWrap:'Quebra de palavra',hAlign:'Alinhamento horizontal',vAlign:'Alinhamento vertical',alignBaseline:'Patamar de alinhamento',bgColor:'Cor de fundo',borderColor:'Cor das bordas',data:'Dados',header:'Cabeçalho',yes:'Sim',no:'Não',invalidWidth:'A largura da célula tem que ser um número.',invalidHeight:'A altura da célula tem que ser um número.',invalidRowSpan:'Linhas cobertas tem que ser um número inteiro.',invalidColSpan:'Colunas cobertas tem que ser um número inteiro.',chooseColor:'Escolher'},row:{menu:'Linha',insertBefore:'Inserir linha acima',insertAfter:'Inserir linha abaixo',deleteRow:'Remover Linhas'},column:{menu:'Coluna',insertBefore:'Inserir coluna a esquerda',insertAfter:'Inserir coluna a direita',deleteColumn:'Remover Colunas'}},button:{title:'Formatar Botão',text:'Texto (Valor)',type:'Tipo',typeBtn:'Botão',typeSbm:'Enviar',typeRst:'Limpar'},checkboxAndRadio:{checkboxTitle:'Formatar Caixa de Seleção',radioTitle:'Formatar Botão de Opção',value:'Valor',selected:'Selecionado'},form:{title:'Formatar Formulário',menu:'Formatar Formulário',action:'Ação',method:'Método',encoding:'Codificação'},select:{title:'Formatar Caixa de Listagem',selectInfo:'Informações',opAvail:'Opções disponíveis',value:'Valor',size:'Tamanho',lines:'linhas',chkMulti:'Permitir múltiplas seleções',opText:'Texto',opValue:'Valor',btnAdd:'Adicionar',btnModify:'Modificar',btnUp:'Para cima',btnDown:'Para baixo',btnSetValue:'Definir como selecionado',btnDelete:'Remover'},textarea:{title:'Formatar Área de Texto',cols:'Colunas',rows:'Linhas'},textfield:{title:'Formatar Caixa de Texto',name:'Nome',value:'Valor',charWidth:'Comprimento (em caracteres)',maxChars:'Número Máximo de Caracteres',type:'Tipo',typeText:'Texto',typePass:'Senha'},hidden:{title:'Formatar Campo Oculto',name:'Nome',value:'Valor'},image:{title:'Formatar Imagem',titleButton:'Formatar Botão de Imagem',menu:'Formatar Imagem',infoTab:'Informações da Imagem',btnUpload:'Enviar para o Servidor',upload:'Enviar',alt:'Texto Alternativo',lockRatio:'Travar Proporções',resetSize:'Redefinir para o Tamanho Original',border:'Borda',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Por favor, digite a URL da imagem.',linkTab:'Link',button2Img:'Deseja transformar o botão de imagem em uma imagem comum?',img2Button:'Deseja transformar a imagem em um botão de imagem?',urlMissing:'URL da imagem está faltando.',validateBorder:'A borda deve ser um número inteiro.',validateHSpace:'O HSpace deve ser um número inteiro.',validateVSpace:'O VSpace deve ser um número inteiro.'},flash:{properties:'Propriedades do Flash',propertiesTab:'Propriedades',title:'Propriedades do Flash',chkPlay:'Tocar Automaticamente',chkLoop:'Tocar Infinitamente',chkMenu:'Habilita Menu Flash',chkFull:'Permitir tela cheia',scale:'Escala',scaleAll:'Mostrar tudo',scaleNoBorder:'Sem Borda',scaleFit:'Escala Exata',access:'Acesso ao script',accessAlways:'Sempre',accessSameDomain:'Acessar Mesmo Domínio',accessNever:'Nunca',alignAbsBottom:'Inferior Absoluto',alignAbsMiddle:'Centralizado Absoluto',alignBaseline:'Baseline',alignTextTop:'Superior Absoluto',quality:'Qualidade',qualityBest:'Qualidade Melhor',qualityHigh:'Qualidade Alta',qualityAutoHigh:'Qualidade Alta Automática',qualityMedium:'Qualidade Média',qualityAutoLow:'Qualidade Baixa Automática',qualityLow:'Qualidade Baixa',windowModeWindow:'Janela',windowModeOpaque:'Opaca',windowModeTransparent:'Transparente',windowMode:'Modo da janela',flashvars:'Variáveis do Flash',bgcolor:'Cor do Plano de Fundo',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'Por favor, digite o endereço do link',validateHSpace:'O HSpace tem que ser um número',validateVSpace:'O VSpace tem que ser um número.'},spellCheck:{toolbar:'Verificar Ortografia',title:'Corretor Ortográfico',notAvailable:'Desculpe, o serviço não está disponível no momento.',errorLoading:'Erro carregando servidor de aplicação: %s.',notInDic:'Não encontrada',changeTo:'Alterar para',btnIgnore:'Ignorar uma vez',btnIgnoreAll:'Ignorar Todas',btnReplace:'Alterar',btnReplaceAll:'Alterar Todas',btnUndo:'Desfazer',noSuggestions:'-sem sugestões de ortografia-',progress:'Verificação ortográfica em andamento...',noMispell:'Verificação encerrada: Não foram encontrados erros de ortografia',noChanges:'Verificação ortográfica encerrada: Não houve alterações',oneChange:'Verificação ortográfica encerrada: Uma palavra foi alterada',manyChanges:'Verificação ortográfica encerrada: %1 palavras foram alteradas',ieSpellDownload:'A verificação ortográfica não foi instalada. Você gostaria de realizar o download agora?'},smiley:{toolbar:'Emoticon',title:'Inserir Emoticon',options:'Opções de Emoticons'},elementsPath:{eleLabel:'Caminho dos Elementos',eleTitle:'Elemento %1'},numberedlist:'Lista numerada',bulletedlist:'Lista sem números',indent:'Aumentar Recuo',outdent:'Diminuir Recuo',justify:{left:'Alinhar Esquerda',center:'Centralizar',right:'Alinhar Direita',block:'Justificado'},blockquote:'Citação',clipboard:{title:'Colar',cutError:'As configurações de segurança do seu navegador não permitem que o editor execute operações de recortar automaticamente. Por favor, utilize o teclado para recortar (Ctrl/Cmd+X).',copyError:'As configurações de segurança do seu navegador não permitem que o editor execute operações de copiar automaticamente. Por favor, utilize o teclado para copiar (Ctrl/Cmd+C).',pasteMsg:'Transfira o link usado na caixa usando o teclado com (<STRONG>Ctrl/Cmd+V</STRONG>) e <STRONG>OK</STRONG>.',securityMsg:'As configurações de segurança do seu navegador não permitem que o editor acesse os dados da área de transferência diretamente. Por favor cole o conteúdo manualmente nesta janela.',pasteArea:'Área para Colar'},pastefromword:{confirmCleanup:'O texto que você deseja colar parece ter sido copiado do Word. Você gostaria de remover a formatação antes de colar?',toolbar:'Colar do Word',title:'Colar do Word',error:'Não foi possível limpar os dados colados devido a um erro interno'},pasteText:{button:'Colar como Texto sem Formatação',title:'Colar como Texto sem Formatação'},templates:{button:'Modelos de layout',title:'Modelo de layout de conteúdo',options:'Opções de Template',insertOption:'Substituir o conteúdo atual',selectPromptMsg:'Selecione um modelo de layout para ser aberto no editor<br>(o conteúdo atual será perdido):',emptyListMsg:'(Não foram definidos modelos de layout)'},showBlocks:'Mostrar blocos de código',stylesCombo:{label:'Estilo',panelTitle:'Estilos de Formatação',panelTitle1:'Estilos de bloco',panelTitle2:'Estilos de texto corrido',panelTitle3:'Estilos de objeto'},format:{label:'Formatação',panelTitle:'Formatação',tag_p:'Normal',tag_pre:'Formatado',tag_address:'Endereço',tag_h1:'Título 1',tag_h2:'Título 2',tag_h3:'Título 3',tag_h4:'Título 4',tag_h5:'Título 5',tag_h6:'Título 6',tag_div:'Normal (DIV)'},div:{title:'Criar Container de DIV',toolbar:'Criar Container de DIV',cssClassInputLabel:'Classes de CSS',styleSelectLabel:'Estilo',IdInputLabel:'Id',languageCodeInputLabel:'Código de Idioma',inlineStyleInputLabel:'Estilo Inline',advisoryTitleInputLabel:'Título Consulta',langDirLabel:'Direção da Escrita',langDirLTRLabel:'Esquerda para Direita (LTR)',langDirRTLLabel:'Direita para Esquerda (RTL)',edit:'Editar Div',remove:'Remover Div'},iframe:{title:'Propriedade do IFrame',toolbar:'IFrame',noUrl:'Insira a URL do iframe',scrolling:'Abilita scrollbars',border:'Mostra borda do iframe'},font:{label:'Fonte',voiceLabel:'Fonte',panelTitle:'Fonte'},fontSize:{label:'Tamanho',voiceLabel:'Tamanho da fonte',panelTitle:'Tamanho'},colorButton:{textColorTitle:'Cor do Texto',bgColorTitle:'Cor do Plano de Fundo',panelTitle:'Cores',auto:'Automático',more:'Mais Cores...'},colors:{'000':'Preto',800000:'Foquete','8B4513':'Marrom 1','2F4F4F':'Cinza 1','008080':'Cerceta','000080':'Azul Marinho','4B0082':'Índigo',696969:'Cinza 2',B22222:'Tijolo de Fogo',A52A2A:'Marrom 2',DAA520:'Vara Dourada','006400':'Verde Escuro','40E0D0':'Turquesa','0000CD':'Azul Médio',800080:'Roxo',808080:'Cinza 3',F00:'Vermelho',FF8C00:'Laranja Escuro',FFD700:'Dourado','008000':'Verde','0FF':'Ciano','00F':'Azul',EE82EE:'Violeta',A9A9A9:'Cinza Escuro',FFA07A:'Salmão Claro',FFA500:'Laranja',FFFF00:'Amarelo','00FF00':'Lima',AFEEEE:'Turquesa Pálido',ADD8E6:'Azul Claro',DDA0DD:'Ameixa',D3D3D3:'Cinza Claro',FFF0F5:'Lavanda 1',FAEBD7:'Branco Antiguidade',FFFFE0:'Amarelo Claro',F0FFF0:'Orvalho',F0FFFF:'Azure',F0F8FF:'Azul Alice',E6E6FA:'Lavanda 2',FFF:'Branco'},scayt:{title:'Correção ortográfica durante a digitação',opera_title:'Não suportado no Opera',enable:'Habilitar correção ortográfica durante a digitação',disable:'Desabilitar correção ortográfica durante a digitação',about:'Sobre a correção ortográfica durante a digitação',toggle:'Ativar/desativar correção ortográfica durante a digitação',options:'Opções',langs:'Idiomas',moreSuggestions:'Mais sugestões',ignore:'Ignorar',ignoreAll:'Ignorar todas',addWord:'Adicionar palavra',emptyDic:'O nome do dicionário não deveria estar vazio.',optionsTab:'Opções',allCaps:'Ignorar palavras maiúsculas',ignoreDomainNames:'Ignorar nomes de domínio',mixedCase:'Ignorar palavras com maiúsculas e minúsculas misturadas',mixedWithDigits:'Ignorar palavras com números',languagesTab:'Idiomas',dictionariesTab:'Dicionários',dic_field_name:'Nome do Dicionário',dic_create:'Criar',dic_restore:'Restaurar',dic_delete:'Excluir',dic_rename:'Renomear',dic_info:'Inicialmente, o dicionário do usuário fica armazenado em um Cookie. Porém, Cookies tem tamanho limitado, portanto quand o dicionário do usuário atingir o tamanho limite poderá ser armazenado no nosso servidor. Para armazenar seu dicionário pessoal no nosso servidor deverá especificar um nome para ele. Se já tiver um dicionário armazenado por favor especifique o seu nome e clique em Restaurar.',aboutTab:'Sobre'},about:{title:'Sobre o CKEditor',dlgTitle:'Sobre o CKEditor',help:'Verifique o $1 para obter ajuda.',userGuide:'Guia do Usuário do CKEditor',moreInfo:'Para informações sobre a licença por favor visite o nosso site:',copy:'Copyright © $1. Todos os direitos reservados.'},maximize:'Maximizar',minimize:'Minimize',fakeobjects:{anchor:'Âncora',flash:'Animação em Flash',iframe:'IFrame',hiddenfield:'Campo Oculto',unknown:'Objeto desconhecido'},resize:'Arraste para redimensionar',colordialog:{title:'Selecione uma Cor',options:'Opções de Cor',highlight:'Grifar',selected:'Cor Selecionada',clear:'Limpar'},toolbarCollapse:'Diminuir Barra de Ferramentas',toolbarExpand:'Aumentar Barra de Ferramentas',toolbarGroups:{document:'Documento',clipboard:'Clipboard/Desfazer',editing:'Edição',forms:'Formulários',basicstyles:'Estilos Básicos',paragraph:'Paragrafo',links:'Links',insert:'Inserir',styles:'Estilos',colors:'Cores',tools:'Ferramentas'},bidi:{ltr:'Direção do texto da esquerda para a direita',rtl:'Direção do texto da direita para a esquerda'},docprops:{label:'Propriedades Documento',title:'Propriedades Documento',design:'Design',meta:'Meta Dados',chooseColor:'Escolher',other:'<outro>',docTitle:'Título da Página',charset:'Codificação de Caracteres',charsetOther:'Outra Codificação de Caracteres',charsetASCII:'ASCII',charsetCE:'Europa Central',charsetCT:'Chinês Tradicional (Big5)',charsetCR:'Cirílico',charsetGR:'Grego',charsetJP:'Japonês',charsetKR:'Coreano',charsetTR:'Turco',charsetUN:'Unicode (UTF-8)',charsetWE:'Europa Ocidental',docType:'Cabeçalho Tipo de Documento',docTypeOther:'Outro Tipo de Documento',xhtmlDec:'Incluir Declarações XHTML',bgColor:'Cor do Plano de Fundo',bgImage:'URL da Imagem de Plano de Fundo',bgFixed:'Plano de Fundo Fixo',txtColor:'Cor do Texto',margin:'Margens da Página',marginTop:'Superior',marginLeft:'Inferior',marginRight:'Direita',marginBottom:'Inferior',metaKeywords:'Palavras-chave de Indexação do Documento (separadas por vírgula)',metaDescription:'Descrição do Documento',metaAuthor:'Autor',metaCopyright:'Direitos Autorais',previewHtml:'<p>Este é um <strong>texto de exemplo</strong>. Você está usando <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ro.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ro.js
index 9d29578..0d5de0e 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ro.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ro.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.ro={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editează bara de unelte',editor:'Rich Text Editor',source:'Sursa',newPage:'Pagină nouă',save:'Salvează',preview:'Previzualizare',cut:'Taie',copy:'Copiază',paste:'Adaugă',print:'Printează',underline:'Subliniat (underline)',bold:'Îngroşat (bold)',italic:'Înclinat (italic)',selectAll:'Selectează tot',removeFormat:'Înlătură formatarea',strike:'Tăiat (strike through)',subscript:'Indice (subscript)',superscript:'Putere (superscript)',horizontalrule:'Inserează linie orizontală',pagebreak:'Inserează separator de pagină (Page Break)',pagebreakAlt:'Page Break',unlink:'Înlătură link (legătură web)',undo:'Starea anterioară (undo)',redo:'Starea ulterioară (redo)',common:{browseServer:'Răsfoieşte server',url:'URL',protocol:'Protocol',upload:'Încarcă',uploadSubmit:'Trimite la server',image:'Imagine',flash:'Flash',form:'Formular (Form)',checkbox:'Bifă (Checkbox)',radio:'Buton radio (RadioButton)',textField:'Câmp text (TextField)',textarea:'Suprafaţă text (Textarea)',hiddenField:'Câmp ascuns (HiddenField)',button:'Buton',select:'Câmp selecţie (SelectionField)',imageButton:'Buton imagine (ImageButton)',notSet:'<nesetat>',id:'Id',name:'Nume',langDir:'Direcţia cuvintelor',langDirLtr:'stânga-dreapta (LTR)',langDirRtl:'dreapta-stânga (RTL)',langCode:'Codul limbii',longDescr:'Descrierea lungă URL',cssClass:'Clasele cu stilul paginii (CSS)',advisoryTitle:'Titlul consultativ',cssStyle:'Stil',ok:'OK',cancel:'Anulare',close:'Închide',preview:'Previzualizare',generalTab:'General',advancedTab:'Avansat',validateNumberFailed:'Această valoare nu este un număr.',confirmNewPage:'Orice modificări nesalvate ale acestui conținut, vor fi pierdute. Sigur doriți încărcarea unei noi pagini?',confirmCancel:'Câteva opțiuni au fost schimbate. Sigur doriți să închideți dialogul?',options:'Opțiuni',target:'Țintă',targetNew:'Fereastră nouă (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'În aceeași fereastră (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Stânga spre Dreapta (LTR)',langDirRTL:'Dreapta spre Stânga (RTL)',styles:'Stil',cssClasses:'Stylesheet Classes',width:'Lăţime',height:'Înălţime',align:'Aliniere',alignLeft:'Mărește Bara',alignRight:'Dreapta',alignCenter:'Centru',alignTop:'Sus',alignMiddle:'Mijloc',alignBottom:'Jos',invalidHeight:'Înălțimea trebuie să fie un număr.',invalidWidth:'Lățimea trebuie să fie un număr.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Opțiuni Meniu Contextual'},specialChar:{toolbar:'Inserează caracter special',title:'Selectează caracter special',options:'Opțiuni caractere speciale'},link:{toolbar:'Inserează/Editează link (legătură web)',other:'<alt>',menu:'Editează Link',title:'Link (Legătură web)',info:'Informaţii despre link (Legătură web)',target:'Ţintă (Target)',upload:'Încarcă',advanced:'Avansat',type:'Tipul link-ului (al legăturii web)',toUrl:'URL',toAnchor:'Ancoră în această pagină',toEmail:'E-Mail',targetFrame:'<frame>',targetPopup:'<fereastra popup>',targetFrameName:'Numele frameului ţintă',targetPopupName:'Numele ferestrei popup',popupFeatures:'Proprietăţile ferestrei popup',popupResizable:'Redimensionabil',popupStatusBar:'Bara de status',popupLocationBar:'Bara de locaţie',popupToolbar:'Bara de opţiuni',popupMenuBar:'Bara de meniu',popupFullScreen:'Tot ecranul (Full Screen)(IE)',popupScrollBars:'Bare de derulare',popupDependent:'Dependent (Netscape)',popupLeft:'Poziţia la stânga',popupTop:'Poziţia la dreapta',id:'Id',langDir:'Direcţia cuvintelor',langDirLTR:'stânga-dreapta (LTR)',langDirRTL:'dreapta-stânga (RTL)',acccessKey:'Tasta de acces',name:'Nume',langCode:'Direcţia cuvintelor',tabIndex:'Indexul tabului',advisoryTitle:'Titlul consultativ',advisoryContentType:'Tipul consultativ al titlului',cssClasses:'Clasele cu stilul paginii (CSS)',charset:'Setul de caractere al resursei legate',styles:'Stil',rel:'Relație',selectAnchor:'Selectaţi o ancoră',anchorName:'după numele ancorei',anchorId:'după Id-ul elementului',emailAddress:'Adresă de e-mail',emailSubject:'Subiectul mesajului',emailBody:'Opțiuni Meniu Contextual',noAnchors:'(Nicio ancoră disponibilă în document)',noUrl:'Vă rugăm să scrieţi URL-ul',noEmail:'Vă rugăm să scrieţi adresa de e-mail'},anchor:{toolbar:'Inserează/Editează ancoră',menu:'Proprietăţi ancoră',title:'Proprietăţi ancoră',name:'Numele ancorei',errorName:'Vă rugăm scrieţi numele ancorei',remove:'Elimină ancora'},list:{numberedTitle:'Proprietățile listei numerotate',bulletedTitle:'Proprietățile listei cu simboluri',type:'Tip',start:'Start',validateStartNumber:'Începutul listei trebuie să fie un număr întreg.',circle:'Cerc',disc:'Disc',square:'Pătrat',none:'Nimic',notset:'<nesetat>',armenian:'Numerotare armeniană',georgian:'Numerotare georgiană (an, ban, gan, etc.)',lowerRoman:'Cifre romane mici (i, ii, iii, iv, v, etc.)',upperRoman:'Cifre romane mari (I, II, III, IV, V, etc.)',lowerAlpha:'Litere mici (a, b, c, d, e, etc.)',upperAlpha:'Litere mari (A, B, C, D, E, etc.)',lowerGreek:'Litere grecești mici (alpha, beta, gamma, etc.)',decimal:'Decimale (1, 2, 3, etc.)',decimalLeadingZero:'Decimale cu zero în față (01, 02, 03, etc.)'},findAndReplace:{title:'Găseşte şi înlocuieşte',find:'Găseşte',replace:'Înlocuieşte',findWhat:'Găseşte:',replaceWith:'Înlocuieşte cu:',notFoundMsg:'Textul specificat nu a fost găsit.',findOptions:'Find Options',matchCase:'Deosebeşte majuscule de minuscule (Match case)',matchWord:'Doar cuvintele întregi',matchCyclic:'Potrivește ciclic',replaceAll:'Înlocuieşte tot',replaceSuccessMsg:'%1 căutări înlocuite.'},table:{toolbar:'Tabel',title:'Proprietăţile tabelului',menu:'Proprietăţile tabelului',deleteTable:'Şterge tabel',rows:'Rânduri',columns:'Coloane',border:'Mărimea marginii',widthPx:'pixeli',widthPc:'procente',widthUnit:'unitate lățime',cellSpace:'Spaţiu între celule',cellPad:'Spaţiu în cadrul celulei',caption:'Titlu (Caption)',summary:'Rezumat',headers:'Antente',headersNone:'Nimic',headersColumn:'Prima coloană',headersRow:'Primul rând',headersBoth:'Ambele',invalidRows:'Numărul rândurilor trebuie să fie mai mare decât 0.',invalidCols:'Numărul coloanelor trebuie să fie mai mare decât 0.',invalidBorder:'Dimensiunea bordurii trebuie să aibe un număr.',invalidWidth:'Lățimea tabelului trebuie să fie un număr.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Spațierea celului trebuie să fie un număr pozitiv.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Celulă',insertBefore:'Inserează celulă înainte',insertAfter:'Inserează celulă după',deleteCell:'Şterge celule',merge:'Uneşte celule',mergeRight:'Uneşte la dreapta',mergeDown:'Uneşte jos',splitHorizontal:'Împarte celula pe orizontală',splitVertical:'Împarte celula pe verticală',title:'Proprietăți celulă',cellType:'Tipul celulei',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Aliniament orizontal',vAlign:'Aliniament vertical',alignBaseline:'Baseline',bgColor:'Culoare fundal',borderColor:'Culoare bordură',data:'Data',header:'Antet',yes:'Da',no:'Nu',invalidWidth:'Lățimea celulei trebuie să fie un număr.',invalidHeight:'Înălțimea celulei trebuie să fie un număr.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Alege'},row:{menu:'Rând',insertBefore:'Inserează rând înainte',insertAfter:'Inserează rând după',deleteRow:'Şterge rânduri'},column:{menu:'Coloană',insertBefore:'Inserează coloană înainte',insertAfter:'Inserează coloană după',deleteColumn:'Şterge celule'}},button:{title:'Proprietăţi buton',text:'Text (Valoare)',type:'Tip',typeBtn:'Buton',typeSbm:'Trimite',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Proprietăţi bifă (Checkbox)',radioTitle:'Proprietăţi buton radio (Radio Button)',value:'Valoare',selected:'Selectat'},form:{title:'Proprietăţi formular (Form)',menu:'Proprietăţi formular (Form)',action:'Acţiune',method:'Metodă',encoding:'Encodare'},select:{title:'Proprietăţi câmp selecţie (Selection Field)',selectInfo:'Informaţii',opAvail:'Opţiuni disponibile',value:'Valoare',size:'Mărime',lines:'linii',chkMulti:'Permite selecţii multiple',opText:'Text',opValue:'Valoare',btnAdd:'Adaugă',btnModify:'Modifică',btnUp:'Sus',btnDown:'Jos',btnSetValue:'Setează ca valoare selectată',btnDelete:'Şterge'},textarea:{title:'Proprietăţi suprafaţă text (Textarea)',cols:'Coloane',rows:'Linii'},textfield:{title:'Proprietăţi câmp text (Text Field)',name:'Nume',value:'Valoare',charWidth:'Lărgimea caracterului',maxChars:'Caractere maxime',type:'Tip',typeText:'Text',typePass:'Parolă'},hidden:{title:'Proprietăţi câmp ascuns (Hidden Field)',name:'Nume',value:'Valoare'},image:{title:'Proprietăţile imaginii',titleButton:'Proprietăţi buton imagine (Image Button)',menu:'Proprietăţile imaginii',infoTab:'Informaţii despre imagine',btnUpload:'Trimite la server',upload:'Încarcă',alt:'Text alternativ',lockRatio:'Păstrează proporţiile',resetSize:'Resetează mărimea',border:'Margine',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Vă rugăm să scrieţi URL-ul imaginii',linkTab:'Link (Legătură web)',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Sursa URL a imaginii lipsește.',validateBorder:'Bordura trebuie să fie un număr întreg.',validateHSpace:'Hspace trebuie să fie un număr întreg.',validateVSpace:'Vspace trebuie să fie un număr întreg.'},flash:{properties:'Proprietăţile flashului',propertiesTab:'Proprietăți',title:'Proprietăţile flashului',chkPlay:'Rulează automat',chkLoop:'Repetă (Loop)',chkMenu:'Activează meniul flash',chkFull:'Permite pe tot ecranul',scale:'Scală',scaleAll:'Arată tot',scaleNoBorder:'Fără bordură (No border)',scaleFit:'Potriveşte',access:'Acces script',accessAlways:'Întotdeauna',accessSameDomain:'Același domeniu',accessNever:'Niciodată',alignAbsBottom:'Jos absolut (Abs Bottom)',alignAbsMiddle:'Mijloc absolut (Abs Middle)',alignBaseline:'Linia de jos (Baseline)',alignTextTop:'Text sus',quality:'Calitate',qualityBest:'Cea mai bună',qualityHigh:'Înaltă',qualityAutoHigh:'Auto înaltă',qualityMedium:'Medie',qualityAutoLow:'Auto Joasă',qualityLow:'Joasă',windowModeWindow:'Fereastră',windowModeOpaque:'Opacă',windowModeTransparent:'Transparentă',windowMode:'Mod fereastră',flashvars:'Variabile pentru flash',bgcolor:'Coloarea fundalului',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'Vă rugăm să scrieţi URL-ul',validateHSpace:'Hspace trebuie să fie un număr.',validateVSpace:'VSpace trebuie să fie un număr'},spellCheck:{toolbar:'Verifică scrierea textului',title:'Spell Check',notAvailable:'Scuzați, dar serviciul nu este disponibil momentan.',errorLoading:'Eroare în lansarea aplicației service host %s.',notInDic:'Nu e în dicţionar',changeTo:'Schimbă în',btnIgnore:'Ignoră',btnIgnoreAll:'Ignoră toate',btnReplace:'Înlocuieşte',btnReplaceAll:'Înlocuieşte tot',btnUndo:'Starea anterioară (undo)',noSuggestions:'- Fără sugestii -',progress:'Verificarea textului în desfăşurare...',noMispell:'Verificarea textului terminată: Nicio greşeală găsită',noChanges:'Verificarea textului terminată: Niciun cuvânt modificat',oneChange:'Verificarea textului terminată: Un cuvânt modificat',manyChanges:'Verificarea textului terminată: 1% cuvinte modificate',ieSpellDownload:'Unealta pentru verificat textul (Spell checker) neinstalată. Doriţi să o descărcaţi acum?'},smiley:{toolbar:'Figură expresivă (Emoticon)',title:'Inserează o figură expresivă (Emoticon)',options:'Opțiuni figuri expresive'},elementsPath:{eleLabel:'Calea elementelor',eleTitle:'%1 element'},numberedlist:'Inserează / Elimină Listă numerotată',bulletedlist:'Inserează / Elimină Listă cu puncte',indent:'Creşte indentarea',outdent:'Scade indentarea',justify:{left:'Aliniere la stânga',center:'Aliniere centrală',right:'Aliniere la dreapta',block:'Aliniere în bloc (Block Justify)'},blockquote:'Citat',clipboard:{title:'Adaugă',cutError:'Setările de securitate ale navigatorului (browser) pe care îl folosiţi nu permit editorului să execute automat operaţiunea de tăiere. Vă rugăm folosiţi tastatura (Ctrl/Cmd+X).',copyError:'Setările de securitate ale navigatorului (browser) pe care îl folosiţi nu permit editorului să execute automat operaţiunea de copiere. Vă rugăm folosiţi tastatura (Ctrl/Cmd+C).',pasteMsg:'Vă rugăm adăugaţi în căsuţa următoare folosind tastatura (<strong>Ctrl/Cmd+V</strong>) şi apăsaţi OK',securityMsg:'Din cauza setărilor de securitate ale programului dvs. cu care navigaţi pe internet (browser), editorul nu poate accesa direct datele din clipboard. Va trebui să adăugaţi din nou datele în această fereastră.',pasteArea:'Suprafața de adăugare'},pastefromword:{confirmCleanup:'Textul pe care doriți să-l lipiți este din Word. Doriți curățarea textului înante de a-l adăuga?',toolbar:'Adaugă din Word',title:'Adaugă din Word',error:'Nu a fost posibilă curățarea datelor adăugate datorită unei erori interne'},pasteText:{button:'Adaugă ca text simplu (Plain Text)',title:'Adaugă ca text simplu (Plain Text)'},templates:{button:'Template-uri (şabloane)',title:'Template-uri (şabloane) de conţinut',options:'Opțiuni șabloane',insertOption:'Înlocuieşte cuprinsul actual',selectPromptMsg:'Vă rugăm selectaţi template-ul (şablonul) ce se va deschide în editor<br>(conţinutul actual va fi pierdut):',emptyListMsg:'(Niciun template (şablon) definit)'},showBlocks:'Arată blocurile',stylesCombo:{label:'Stil',panelTitle:'Formatarea stilurilor',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Formatare',panelTitle:'Formatare',tag_p:'Normal',tag_pre:'Formatat',tag_address:'Adresă',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Stil',IdInputLabel:'Id',languageCodeInputLabel:'Codul limbii',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Font',voiceLabel:'Font',panelTitle:'Font'},fontSize:{label:'Mărime',voiceLabel:'Font Size',panelTitle:'Mărime'},colorButton:{textColorTitle:'Culoarea textului',bgColorTitle:'Coloarea fundalului',panelTitle:'Colors',auto:'Automatic',more:'Mai multe culori...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Mărește',minimize:'Micșorează',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Trage pentru a redimensiona',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Micșorează Bara',toolbarExpand:'Mărește Bara',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Proprietăţile documentului',title:'Proprietăţile documentului',design:'Design',meta:'Meta Tags',chooseColor:'Choose',other:'<alt>',docTitle:'Titlul paginii',charset:'Encoding setului de caractere',charsetOther:'Alt encoding al setului de caractere',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinezesc tradiţional (Big5)',charsetCR:'Chirilic',charsetGR:'Grecesc',charsetJP:'Japonez',charsetKR:'Corean',charsetTR:'Turcesc',charsetUN:'Unicode (UTF-8)',charsetWE:'Vest european',docType:'Document Type Heading',docTypeOther:'Alt Document Type Heading',xhtmlDec:'Include declaraţii XHTML',bgColor:'Culoarea fundalului (Background Color)',bgImage:'URL-ul imaginii din fundal (Background Image URL)',bgFixed:'Fundal neflotant, fix (Non-scrolling Background)',txtColor:'Culoarea textului',margin:'Marginile paginii',marginTop:'Sus',marginLeft:'Stânga',marginRight:'Dreapta',marginBottom:'Jos',metaKeywords:'Cuvinte cheie după care se va indexa documentul (separate prin virgulă)',metaDescription:'Descrierea documentului',metaAuthor:'Autor',metaCopyright:'Drepturi de autor',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.ro={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editează bara de unelte',editor:'Rich Text Editor',source:'Sursa',newPage:'Pagină nouă',save:'Salvează',preview:'Previzualizare',cut:'Taie',copy:'Copiază',paste:'Adaugă',print:'Printează',underline:'Subliniat (underline)',bold:'Îngroşat (bold)',italic:'Înclinat (italic)',selectAll:'Selectează tot',removeFormat:'Înlătură formatarea',strike:'Tăiat (strike through)',subscript:'Indice (subscript)',superscript:'Putere (superscript)',horizontalrule:'Inserează linie orizontală',pagebreak:'Inserează separator de pagină (Page Break)',pagebreakAlt:'Page Break',unlink:'Înlătură link (legătură web)',undo:'Starea anterioară (undo)',redo:'Starea ulterioară (redo)',common:{browseServer:'Răsfoieşte server',url:'URL',protocol:'Protocol',upload:'Încarcă',uploadSubmit:'Trimite la server',image:'Imagine',flash:'Flash',form:'Formular (Form)',checkbox:'Bifă (Checkbox)',radio:'Buton radio (RadioButton)',textField:'Câmp text (TextField)',textarea:'Suprafaţă text (Textarea)',hiddenField:'Câmp ascuns (HiddenField)',button:'Buton',select:'Câmp selecţie (SelectionField)',imageButton:'Buton imagine (ImageButton)',notSet:'<nesetat>',id:'Id',name:'Nume',langDir:'Direcţia cuvintelor',langDirLtr:'stânga-dreapta (LTR)',langDirRtl:'dreapta-stânga (RTL)',langCode:'Codul limbii',longDescr:'Descrierea lungă URL',cssClass:'Clasele cu stilul paginii (CSS)',advisoryTitle:'Titlul consultativ',cssStyle:'Stil',ok:'OK',cancel:'Anulare',close:'Închide',preview:'Previzualizare',generalTab:'General',advancedTab:'Avansat',validateNumberFailed:'Această valoare nu este un număr.',confirmNewPage:'Orice modificări nesalvate ale acestui conținut, vor fi pierdute. Sigur doriți încărcarea unei noi pagini?',confirmCancel:'Câteva opțiuni au fost schimbate. Sigur doriți să închideți dialogul?',options:'Opțiuni',target:'Țintă',targetNew:'Fereastră nouă (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'În aceeași fereastră (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Stânga spre Dreapta (LTR)',langDirRTL:'Dreapta spre Stânga (RTL)',styles:'Stil',cssClasses:'Stylesheet Classes',width:'Lăţime',height:'Înălţime',align:'Aliniere',alignLeft:'Mărește Bara',alignRight:'Dreapta',alignCenter:'Centru',alignTop:'Sus',alignMiddle:'Mijloc',alignBottom:'Jos',invalidHeight:'Înălțimea trebuie să fie un număr.',invalidWidth:'Lățimea trebuie să fie un număr.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Opțiuni Meniu Contextual'},specialChar:{toolbar:'Inserează caracter special',title:'Selectează caracter special',options:'Opțiuni caractere speciale'},link:{toolbar:'Inserează/Editează link (legătură web)',other:'<alt>',menu:'Editează Link',title:'Link (Legătură web)',info:'Informaţii despre link (Legătură web)',target:'Ţintă (Target)',upload:'Încarcă',advanced:'Avansat',type:'Tipul link-ului (al legăturii web)',toUrl:'URL',toAnchor:'Ancoră în această pagină',toEmail:'E-Mail',targetFrame:'<frame>',targetPopup:'<fereastra popup>',targetFrameName:'Numele frameului ţintă',targetPopupName:'Numele ferestrei popup',popupFeatures:'Proprietăţile ferestrei popup',popupResizable:'Redimensionabil',popupStatusBar:'Bara de status',popupLocationBar:'Bara de locaţie',popupToolbar:'Bara de opţiuni',popupMenuBar:'Bara de meniu',popupFullScreen:'Tot ecranul (Full Screen)(IE)',popupScrollBars:'Bare de derulare',popupDependent:'Dependent (Netscape)',popupLeft:'Poziţia la stânga',popupTop:'Poziţia la dreapta',id:'Id',langDir:'Direcţia cuvintelor',langDirLTR:'stânga-dreapta (LTR)',langDirRTL:'dreapta-stânga (RTL)',acccessKey:'Tasta de acces',name:'Nume',langCode:'Direcţia cuvintelor',tabIndex:'Indexul tabului',advisoryTitle:'Titlul consultativ',advisoryContentType:'Tipul consultativ al titlului',cssClasses:'Clasele cu stilul paginii (CSS)',charset:'Setul de caractere al resursei legate',styles:'Stil',rel:'Relație',selectAnchor:'Selectaţi o ancoră',anchorName:'după numele ancorei',anchorId:'după Id-ul elementului',emailAddress:'Adresă de e-mail',emailSubject:'Subiectul mesajului',emailBody:'Opțiuni Meniu Contextual',noAnchors:'(Nicio ancoră disponibilă în document)',noUrl:'Vă rugăm să scrieţi URL-ul',noEmail:'Vă rugăm să scrieţi adresa de e-mail'},anchor:{toolbar:'Inserează/Editează ancoră',menu:'Proprietăţi ancoră',title:'Proprietăţi ancoră',name:'Numele ancorei',errorName:'Vă rugăm scrieţi numele ancorei',remove:'Elimină ancora'},list:{numberedTitle:'Proprietățile listei numerotate',bulletedTitle:'Proprietățile listei cu simboluri',type:'Tip',start:'Start',validateStartNumber:'Începutul listei trebuie să fie un număr întreg.',circle:'Cerc',disc:'Disc',square:'Pătrat',none:'Nimic',notset:'<nesetat>',armenian:'Numerotare armeniană',georgian:'Numerotare georgiană (an, ban, gan, etc.)',lowerRoman:'Cifre romane mici (i, ii, iii, iv, v, etc.)',upperRoman:'Cifre romane mari (I, II, III, IV, V, etc.)',lowerAlpha:'Litere mici (a, b, c, d, e, etc.)',upperAlpha:'Litere mari (A, B, C, D, E, etc.)',lowerGreek:'Litere grecești mici (alpha, beta, gamma, etc.)',decimal:'Decimale (1, 2, 3, etc.)',decimalLeadingZero:'Decimale cu zero în față (01, 02, 03, etc.)'},findAndReplace:{title:'Găseşte şi înlocuieşte',find:'Găseşte',replace:'Înlocuieşte',findWhat:'Găseşte:',replaceWith:'Înlocuieşte cu:',notFoundMsg:'Textul specificat nu a fost găsit.',findOptions:'Find Options',matchCase:'Deosebeşte majuscule de minuscule (Match case)',matchWord:'Doar cuvintele întregi',matchCyclic:'Potrivește ciclic',replaceAll:'Înlocuieşte tot',replaceSuccessMsg:'%1 căutări înlocuite.'},table:{toolbar:'Tabel',title:'Proprietăţile tabelului',menu:'Proprietăţile tabelului',deleteTable:'Şterge tabel',rows:'Rânduri',columns:'Coloane',border:'Mărimea marginii',widthPx:'pixeli',widthPc:'procente',widthUnit:'unitate lățime',cellSpace:'Spaţiu între celule',cellPad:'Spaţiu în cadrul celulei',caption:'Titlu (Caption)',summary:'Rezumat',headers:'Antente',headersNone:'Nimic',headersColumn:'Prima coloană',headersRow:'Primul rând',headersBoth:'Ambele',invalidRows:'Numărul rândurilor trebuie să fie mai mare decât 0.',invalidCols:'Numărul coloanelor trebuie să fie mai mare decât 0.',invalidBorder:'Dimensiunea bordurii trebuie să aibe un număr.',invalidWidth:'Lățimea tabelului trebuie să fie un număr.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Spațierea celului trebuie să fie un număr pozitiv.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Celulă',insertBefore:'Inserează celulă înainte',insertAfter:'Inserează celulă după',deleteCell:'Şterge celule',merge:'Uneşte celule',mergeRight:'Uneşte la dreapta',mergeDown:'Uneşte jos',splitHorizontal:'Împarte celula pe orizontală',splitVertical:'Împarte celula pe verticală',title:'Proprietăți celulă',cellType:'Tipul celulei',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Aliniament orizontal',vAlign:'Aliniament vertical',alignBaseline:'Baseline',bgColor:'Culoare fundal',borderColor:'Culoare bordură',data:'Data',header:'Antet',yes:'Da',no:'Nu',invalidWidth:'Lățimea celulei trebuie să fie un număr.',invalidHeight:'Înălțimea celulei trebuie să fie un număr.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Alege'},row:{menu:'Rând',insertBefore:'Inserează rând înainte',insertAfter:'Inserează rând după',deleteRow:'Şterge rânduri'},column:{menu:'Coloană',insertBefore:'Inserează coloană înainte',insertAfter:'Inserează coloană după',deleteColumn:'Şterge celule'}},button:{title:'Proprietăţi buton',text:'Text (Valoare)',type:'Tip',typeBtn:'Buton',typeSbm:'Trimite',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Proprietăţi bifă (Checkbox)',radioTitle:'Proprietăţi buton radio (Radio Button)',value:'Valoare',selected:'Selectat'},form:{title:'Proprietăţi formular (Form)',menu:'Proprietăţi formular (Form)',action:'Acţiune',method:'Metodă',encoding:'Encodare'},select:{title:'Proprietăţi câmp selecţie (Selection Field)',selectInfo:'Informaţii',opAvail:'Opţiuni disponibile',value:'Valoare',size:'Mărime',lines:'linii',chkMulti:'Permite selecţii multiple',opText:'Text',opValue:'Valoare',btnAdd:'Adaugă',btnModify:'Modifică',btnUp:'Sus',btnDown:'Jos',btnSetValue:'Setează ca valoare selectată',btnDelete:'Şterge'},textarea:{title:'Proprietăţi suprafaţă text (Textarea)',cols:'Coloane',rows:'Linii'},textfield:{title:'Proprietăţi câmp text (Text Field)',name:'Nume',value:'Valoare',charWidth:'Lărgimea caracterului',maxChars:'Caractere maxime',type:'Tip',typeText:'Text',typePass:'Parolă'},hidden:{title:'Proprietăţi câmp ascuns (Hidden Field)',name:'Nume',value:'Valoare'},image:{title:'Proprietăţile imaginii',titleButton:'Proprietăţi buton imagine (Image Button)',menu:'Proprietăţile imaginii',infoTab:'Informaţii despre imagine',btnUpload:'Trimite la server',upload:'Încarcă',alt:'Text alternativ',lockRatio:'Păstrează proporţiile',resetSize:'Resetează mărimea',border:'Margine',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Vă rugăm să scrieţi URL-ul imaginii',linkTab:'Link (Legătură web)',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Sursa URL a imaginii lipsește.',validateBorder:'Bordura trebuie să fie un număr întreg.',validateHSpace:'Hspace trebuie să fie un număr întreg.',validateVSpace:'Vspace trebuie să fie un număr întreg.'},flash:{properties:'Proprietăţile flashului',propertiesTab:'Proprietăți',title:'Proprietăţile flashului',chkPlay:'Rulează automat',chkLoop:'Repetă (Loop)',chkMenu:'Activează meniul flash',chkFull:'Permite pe tot ecranul',scale:'Scală',scaleAll:'Arată tot',scaleNoBorder:'Fără bordură (No border)',scaleFit:'Potriveşte',access:'Acces script',accessAlways:'Întotdeauna',accessSameDomain:'Același domeniu',accessNever:'Niciodată',alignAbsBottom:'Jos absolut (Abs Bottom)',alignAbsMiddle:'Mijloc absolut (Abs Middle)',alignBaseline:'Linia de jos (Baseline)',alignTextTop:'Text sus',quality:'Calitate',qualityBest:'Cea mai bună',qualityHigh:'Înaltă',qualityAutoHigh:'Auto înaltă',qualityMedium:'Medie',qualityAutoLow:'Auto Joasă',qualityLow:'Joasă',windowModeWindow:'Fereastră',windowModeOpaque:'Opacă',windowModeTransparent:'Transparentă',windowMode:'Mod fereastră',flashvars:'Variabile pentru flash',bgcolor:'Coloarea fundalului',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'Vă rugăm să scrieţi URL-ul',validateHSpace:'Hspace trebuie să fie un număr.',validateVSpace:'VSpace trebuie să fie un număr'},spellCheck:{toolbar:'Verifică scrierea textului',title:'Spell Check',notAvailable:'Scuzați, dar serviciul nu este disponibil momentan.',errorLoading:'Eroare în lansarea aplicației service host %s.',notInDic:'Nu e în dicţionar',changeTo:'Schimbă în',btnIgnore:'Ignoră',btnIgnoreAll:'Ignoră toate',btnReplace:'Înlocuieşte',btnReplaceAll:'Înlocuieşte tot',btnUndo:'Starea anterioară (undo)',noSuggestions:'- Fără sugestii -',progress:'Verificarea textului în desfăşurare...',noMispell:'Verificarea textului terminată: Nicio greşeală găsită',noChanges:'Verificarea textului terminată: Niciun cuvânt modificat',oneChange:'Verificarea textului terminată: Un cuvânt modificat',manyChanges:'Verificarea textului terminată: 1% cuvinte modificate',ieSpellDownload:'Unealta pentru verificat textul (Spell checker) neinstalată. Doriţi să o descărcaţi acum?'},smiley:{toolbar:'Figură expresivă (Emoticon)',title:'Inserează o figură expresivă (Emoticon)',options:'Opțiuni figuri expresive'},elementsPath:{eleLabel:'Calea elementelor',eleTitle:'%1 element'},numberedlist:'Inserează / Elimină Listă numerotată',bulletedlist:'Inserează / Elimină Listă cu puncte',indent:'Creşte indentarea',outdent:'Scade indentarea',justify:{left:'Aliniere la stânga',center:'Aliniere centrală',right:'Aliniere la dreapta',block:'Aliniere în bloc (Block Justify)'},blockquote:'Citat',clipboard:{title:'Adaugă',cutError:'Setările de securitate ale navigatorului (browser) pe care îl folosiţi nu permit editorului să execute automat operaţiunea de tăiere. Vă rugăm folosiţi tastatura (Ctrl/Cmd+X).',copyError:'Setările de securitate ale navigatorului (browser) pe care îl folosiţi nu permit editorului să execute automat operaţiunea de copiere. Vă rugăm folosiţi tastatura (Ctrl/Cmd+C).',pasteMsg:'Vă rugăm adăugaţi în căsuţa următoare folosind tastatura (<strong>Ctrl/Cmd+V</strong>) şi apăsaţi OK',securityMsg:'Din cauza setărilor de securitate ale programului dvs. cu care navigaţi pe internet (browser), editorul nu poate accesa direct datele din clipboard. Va trebui să adăugaţi din nou datele în această fereastră.',pasteArea:'Suprafața de adăugare'},pastefromword:{confirmCleanup:'Textul pe care doriți să-l lipiți este din Word. Doriți curățarea textului înante de a-l adăuga?',toolbar:'Adaugă din Word',title:'Adaugă din Word',error:'Nu a fost posibilă curățarea datelor adăugate datorită unei erori interne'},pasteText:{button:'Adaugă ca text simplu (Plain Text)',title:'Adaugă ca text simplu (Plain Text)'},templates:{button:'Template-uri (şabloane)',title:'Template-uri (şabloane) de conţinut',options:'Opțiuni șabloane',insertOption:'Înlocuieşte cuprinsul actual',selectPromptMsg:'Vă rugăm selectaţi template-ul (şablonul) ce se va deschide în editor<br>(conţinutul actual va fi pierdut):',emptyListMsg:'(Niciun template (şablon) definit)'},showBlocks:'Arată blocurile',stylesCombo:{label:'Stil',panelTitle:'Formatarea stilurilor',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Formatare',panelTitle:'Formatare',tag_p:'Normal',tag_pre:'Formatat',tag_address:'Adresă',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Stil',IdInputLabel:'Id',languageCodeInputLabel:'Codul limbii',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Font',voiceLabel:'Font',panelTitle:'Font'},fontSize:{label:'Mărime',voiceLabel:'Font Size',panelTitle:'Mărime'},colorButton:{textColorTitle:'Culoarea textului',bgColorTitle:'Coloarea fundalului',panelTitle:'Colors',auto:'Automatic',more:'Mai multe culori...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Mărește',minimize:'Micșorează',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Trage pentru a redimensiona',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Micșorează Bara',toolbarExpand:'Mărește Bara',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Proprietăţile documentului',title:'Proprietăţile documentului',design:'Design',meta:'Meta Tags',chooseColor:'Choose',other:'<alt>',docTitle:'Titlul paginii',charset:'Encoding setului de caractere',charsetOther:'Alt encoding al setului de caractere',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinezesc tradiţional (Big5)',charsetCR:'Chirilic',charsetGR:'Grecesc',charsetJP:'Japonez',charsetKR:'Corean',charsetTR:'Turcesc',charsetUN:'Unicode (UTF-8)',charsetWE:'Vest european',docType:'Document Type Heading',docTypeOther:'Alt Document Type Heading',xhtmlDec:'Include declaraţii XHTML',bgColor:'Culoarea fundalului (Background Color)',bgImage:'URL-ul imaginii din fundal (Background Image URL)',bgFixed:'Fundal neflotant, fix (Non-scrolling Background)',txtColor:'Culoarea textului',margin:'Marginile paginii',marginTop:'Sus',marginLeft:'Stânga',marginRight:'Dreapta',marginBottom:'Jos',metaKeywords:'Cuvinte cheie după care se va indexa documentul (separate prin virgulă)',metaDescription:'Descrierea documentului',metaAuthor:'Autor',metaCopyright:'Drepturi de autor',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ru.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ru.js
index c1299b3..8b9e6a9 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ru.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ru.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.ru={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Панели инструментов редактора',editor:'Визуальный редактор текста',source:'Источник',newPage:'Новая страница',save:'Сохранить',preview:'Предварительный просмотр',cut:'Вырезать',copy:'Копировать',paste:'Вставить',print:'Печать',underline:'Подчеркнутый',bold:'Полужирный',italic:'Курсив',selectAll:'Выделить все',removeFormat:'Убрать форматирование',strike:'Зачеркнутый',subscript:'Подстрочный индекс',superscript:'Надстрочный индекс',horizontalrule:'Вставить горизонтальную линию',pagebreak:'Вставить разрыв страницы для печати',pagebreakAlt:'Разрыв страницы',unlink:'Убрать ссылку',undo:'Отменить',redo:'Повторить',common:{browseServer:'Выбор на сервере',url:'Ссылка',protocol:'Протокол',upload:'Загрузка',uploadSubmit:'Загрузить на сервер',image:'Изображение',flash:'Flash',form:'Форма',checkbox:'Флаговая кнопка',radio:'Кнопка выбора',textField:'Текстовое поле',textarea:'Многострочное текстовое поле',hiddenField:'Скрытое поле',button:'Кнопка',select:'Список выбора',imageButton:'Изображение-кнопка',notSet:'<не указано>',id:'Идентификатор',name:'Имя',langDir:'Направление текста',langDirLtr:'Слева направо (LTR)',langDirRtl:'Справа налево (RTL)',langCode:'Код языка',longDescr:'Длинное описание ссылки',cssClass:'Класс CSS',advisoryTitle:'Заголовок',cssStyle:'Стиль',ok:'ОК',cancel:'Отмена',close:'Закрыть',preview:'Предпросмотр',generalTab:'Основное',advancedTab:'Дополнительно',validateNumberFailed:'Это значение не является числом.',confirmNewPage:'Несохранённые изменения будут потеряны! Вы действительно желаете перейти на другую страницу?',confirmCancel:'Некоторые параметры были изменены. Вы уверены, что желаете закрыть без сохранения?',options:'Параметры',target:'Цель',targetNew:'Новое окно (_blank)',targetTop:'Главное окно (_top)',targetSelf:'Текущее окно (_self)',targetParent:'Родительское окно (_parent)',langDirLTR:'Слева направо (LTR)',langDirRTL:'Справа налево (RTL)',styles:'Стиль',cssClasses:'Классы CSS',width:'Ширина',height:'Высота',align:'Выравнивание',alignLeft:'По левому краю',alignRight:'По правому краю',alignCenter:'По центру',alignTop:'По верху',alignMiddle:'По середине',alignBottom:'По низу',invalidHeight:'Высота задается числом.',invalidWidth:'Ширина задается числом.',invalidCssLength:'Значение, указанное в поле "%1", должно быть положительным целым числом. Допускается указание единиц меры CSS (px, %, in, cm, mm, em, ex, pt или pc).',invalidHtmlLength:'Значение, указанное в поле "%1", должно быть положительным целым числом. Допускается указание единиц меры HTML (px или %).',invalidInlineStyle:'Значение, указанное для стиля элемента, должно состоять из одной или нескольких пар данных в формате "параметр : значение", разделённых точкой с запятой.',cssLengthTooltip:'Введите значение в пикселях, либо число с корректной единицей меры CSS (px, %, in, cm, mm, em, ex, pt или pc).',unavailable:'%1<span class="cke_accessibility">, недоступно</span>'},contextmenu:{options:'Параметры контекстного меню'},specialChar:{toolbar:'Вставить специальный символ',title:'Выберите специальный символ',options:'Выбор специального символа'},link:{toolbar:'Вставить/Редактировать ссылку',other:'<другой>',menu:'Редактировать ссылку',title:'Ссылка',info:'Информация о ссылке',target:'Цель',upload:'Загрузка',advanced:'Дополнительно',type:'Тип ссылки',toUrl:'Ссылка',toAnchor:'Ссылка на якорь в тексте',toEmail:'Email',targetFrame:'<фрейм>',targetPopup:'<всплывающее окно>',targetFrameName:'Имя целевого фрейма',targetPopupName:'Имя всплывающего окна',popupFeatures:'Параметры всплывающего окна',popupResizable:'Изменяемый размер',popupStatusBar:'Строка состояния',popupLocationBar:'Панель адреса',popupToolbar:'Панель инструментов',popupMenuBar:'Панель меню',popupFullScreen:'Полноэкранное (IE)',popupScrollBars:'Полосы прокрутки',popupDependent:'Зависимое (Netscape)',popupLeft:'Отступ слева',popupTop:'Отступ сверху',id:'Идентификатор',langDir:'Направление текста',langDirLTR:'Слева направо (LTR)',langDirRTL:'Справа налево (RTL)',acccessKey:'Клавиша доступа',name:'Имя',langCode:'Код языка',tabIndex:'Последовательность перехода',advisoryTitle:'Заголовок',advisoryContentType:'Тип содержимого',cssClasses:'Классы CSS',charset:'Кодировка ресурса',styles:'Стиль',rel:'Отношение',selectAnchor:'Выберите якорь',anchorName:'По имени',anchorId:'По идентификатору',emailAddress:'Email адрес',emailSubject:'Тема сообщения',emailBody:'Текст сообщения',noAnchors:'(В документе нет ни одного якоря)',noUrl:'Пожалуйста, введите ссылку',noEmail:'Пожалуйста, введите email адрес'},anchor:{toolbar:'Вставить / редактировать якорь',menu:'Изменить якорь',title:'Свойства якоря',name:'Имя якоря',errorName:'Пожалуйста, введите имя якоря',remove:'Удалить якорь'},list:{numberedTitle:'Свойства нумерованного списка',bulletedTitle:'Свойства маркированного списка',type:'Тип',start:'Начиная с',validateStartNumber:'Первый номер списка должен быть задан обычным целым числом.',circle:'Круг',disc:'Окружность',square:'Квадрат',none:'Нет',notset:'<не указано>',armenian:'Армянская нумерация',georgian:'Грузинская нумерация (ани, бани, гани, и т.д.)',lowerRoman:'Строчные римские (i, ii, iii, iv, v, и т.д.)',upperRoman:'Заглавные римские (I, II, III, IV, V, и т.д.)',lowerAlpha:'Строчные латинские (a, b, c, d, e, и т.д.)',upperAlpha:'Заглавные латинские (A, B, C, D, E, и т.д.)',lowerGreek:'Строчные греческие (альфа, бета, гамма, и т.д.)',decimal:'Десятичные (1, 2, 3, и т.д.)',decimalLeadingZero:'Десятичные с ведущим нулём (01, 02, 03, и т.д.)'},findAndReplace:{title:'Поиск и замена',find:'Найти',replace:'Заменить',findWhat:'Найти:',replaceWith:'Заменить на:',notFoundMsg:'Искомый текст не найден.',findOptions:'Опции поиска',matchCase:'Учитывать регистр',matchWord:'Только слово целиком',matchCyclic:'По всему тексту',replaceAll:'Заменить всё',replaceSuccessMsg:'Успешно заменено %1 раз(а).'},table:{toolbar:'Таблица',title:'Свойства таблицы',menu:'Свойства таблицы',deleteTable:'Удалить таблицу',rows:'Строки',columns:'Колонки',border:'Размер границ',widthPx:'пикселей',widthPc:'процентов',widthUnit:'единица измерения',cellSpace:'Внешний отступ ячеек',cellPad:'Внутренний отступ ячеек',caption:'Заголовок',summary:'Итоги',headers:'Заголовки',headersNone:'Без заголовков',headersColumn:'Левая колонка',headersRow:'Верхняя строка',headersBoth:'Сверху и слева',invalidRows:'Количество строк должно быть больше 0.',invalidCols:'Количество столбцов должно быть больше 0.',invalidBorder:'Размер границ должен быть числом.',invalidWidth:'Ширина таблицы должна быть числом.',invalidHeight:'Высота таблицы должна быть числом.',invalidCellSpacing:'Внешний отступ ячеек (cellspacing) должен быть числом.',invalidCellPadding:'Внутренний отступ ячеек (cellpadding) должен быть числом.',cell:{menu:'Ячейка',insertBefore:'Вставить ячейку слева',insertAfter:'Вставить ячейку справа',deleteCell:'Удалить ячейки',merge:'Объединить ячейки',mergeRight:'Объединить с правой',mergeDown:'Объединить с нижней',splitHorizontal:'Разделить ячейку по горизонтали',splitVertical:'Разделить ячейку по вертикали',title:'Свойства ячейки',cellType:'Тип ячейки',rowSpan:'Объединяет строк',colSpan:'Объединяет колонок',wordWrap:'Перенос по словам',hAlign:'Горизонтальное выравнивание',vAlign:'Вертикальное выравнивание',alignBaseline:'По базовой линии',bgColor:'Цвет фона',borderColor:'Цвет границ',data:'Данные',header:'Заголовок',yes:'Да',no:'Нет',invalidWidth:'Ширина ячейки должна быть числом.',invalidHeight:'Высота ячейки должна быть числом.',invalidRowSpan:'Количество объединяемых строк должно быть задано числом.',invalidColSpan:'Количество объединяемых колонок должно быть задано числом.',chooseColor:'Выберите'},row:{menu:'Строка',insertBefore:'Вставить строку сверху',insertAfter:'Вставить строку снизу',deleteRow:'Удалить строки'},column:{menu:'Колонка',insertBefore:'Вставить колонку слева',insertAfter:'Вставить колонку справа',deleteColumn:'Удалить колонки'}},button:{title:'Свойства кнопки',text:'Текст (Значение)',type:'Тип',typeBtn:'Кнопка',typeSbm:'Отправка',typeRst:'Сброс'},checkboxAndRadio:{checkboxTitle:'Свойства флаговой кнопки',radioTitle:'Свойства кнопки выбора',value:'Значение',selected:'Выбрано'},form:{title:'Свойства формы',menu:'Свойства формы',action:'Действие',method:'Метод',encoding:'Кодировка'},select:{title:'Свойства списка выбора',selectInfo:'Информация о списке выбора',opAvail:'Доступные варианты',value:'Значение',size:'Размер',lines:'строк(и)',chkMulti:'Разрешить выбор нескольких вариантов',opText:'Текст',opValue:'Значение',btnAdd:'Добавить',btnModify:'Изменить',btnUp:'Поднять',btnDown:'Опустить',btnSetValue:'Пометить как выбранное',btnDelete:'Удалить'},textarea:{title:'Свойства многострочного текстового поля',cols:'Колонок',rows:'Строк'},textfield:{title:'Свойства текстового поля',name:'Имя',value:'Значение',charWidth:'Ширина поля (в символах)',maxChars:'Макс. количество символов',type:'Тип содержимого',typeText:'Текст',typePass:'Пароль'},hidden:{title:'Свойства скрытого поля',name:'Имя',value:'Значение'},image:{title:'Свойства изображения',titleButton:'Свойства изображения-кнопки',menu:'Свойства изображения',infoTab:'Данные об изображении',btnUpload:'Загрузить на сервер',upload:'Загрузить',alt:'Альтернативный текст',lockRatio:'Сохранять пропорции',resetSize:'Вернуть обычные размеры',border:'Граница',hSpace:'Гориз. отступ',vSpace:'Вертик. отступ',alertUrl:'Пожалуйста, введите ссылку на изображение',linkTab:'Ссылка',button2Img:'Вы желаете преобразовать это изображение-кнопку в обычное изображение?',img2Button:'Вы желаете преобразовать это обычное изображение в изображение-кнопку?',urlMissing:'Не указана ссылка на изображение.',validateBorder:'Размер границ должен быть задан числом.',validateHSpace:'Горизонтальный отступ должен быть задан числом.',validateVSpace:'Вертикальный отступ должен быть задан числом.'},flash:{properties:'Свойства Flash',propertiesTab:'Свойства',title:'Свойства Flash',chkPlay:'Автоматическое воспроизведение',chkLoop:'Повторять',chkMenu:'Включить меню Flash',chkFull:'Разрешить полноэкранный режим',scale:'Масштабировать',scaleAll:'Пропорционально',scaleNoBorder:'Заходить за границы',scaleFit:'Заполнять',access:'Доступ к скриптам',accessAlways:'Всегда',accessSameDomain:'В том же домене',accessNever:'Никогда',alignAbsBottom:'По низу текста',alignAbsMiddle:'По середине текста',alignBaseline:'По базовой линии',alignTextTop:'По верху текста',quality:'Качество',qualityBest:'Лучшее',qualityHigh:'Высокое',qualityAutoHigh:'Запуск на высоком',qualityMedium:'Среднее',qualityAutoLow:'Запуск на низком',qualityLow:'Низкое',windowModeWindow:'Обычный',windowModeOpaque:'Непрозрачный',windowModeTransparent:'Прозрачный',windowMode:'Взаимодействие с окном',flashvars:'Переменные для Flash',bgcolor:'Цвет фона',hSpace:'Гориз. отступ',vSpace:'Вертик. отступ',validateSrc:'Вы должны ввести ссылку',validateHSpace:'Горизонтальный отступ задается числом.',validateVSpace:'Вертикальный отступ задается числом.'},spellCheck:{toolbar:'Проверить орфографию',title:'Проверка орфографии',notAvailable:'Извините, но в данный момент сервис недоступен.',errorLoading:'Произошла ошибка при подключении к серверу проверки орфографии: %s.',notInDic:'Отсутствует в словаре',changeTo:'Изменить на',btnIgnore:'Пропустить',btnIgnoreAll:'Пропустить всё',btnReplace:'Заменить',btnReplaceAll:'Заменить всё',btnUndo:'Отменить',noSuggestions:'- Варианты отсутствуют -',progress:'Орфография проверяется...',noMispell:'Проверка орфографии завершена. Ошибок не найдено',noChanges:'Проверка орфографии завершена. Не изменено ни одного слова',oneChange:'Проверка орфографии завершена. Изменено одно слово',manyChanges:'Проверка орфографии завершена. Изменено слов: %1',ieSpellDownload:'Модуль проверки орфографии не установлен. Хотите скачать его?'},smiley:{toolbar:'Смайлы',title:'Вставить смайл',options:'Выбор смайла'},elementsPath:{eleLabel:'Путь элементов',eleTitle:'Элемент %1'},numberedlist:'Вставить / удалить нумерованный список',bulletedlist:'Вставить / удалить маркированный список',indent:'Увеличить отступ',outdent:'Уменьшить отступ',justify:{left:'По левому краю',center:'По центру',right:'По правому краю',block:'По ширине'},blockquote:'Цитата',clipboard:{title:'Вставить',cutError:'Настройки безопасности вашего браузера не разрешают редактору выполнять операции по вырезке текста. Пожалуйста, используйте для этого клавиатуру (Ctrl/Cmd+X).',copyError:'Настройки безопасности вашего браузера не разрешают редактору выполнять операции по копированию текста. Пожалуйста, используйте для этого клавиатуру (Ctrl/Cmd+C).',pasteMsg:'Пожалуйста, вставьте текст в зону ниже, используя клавиатуру (<strong>Ctrl/Cmd+V</strong>) и нажмите кнопку "OK".',securityMsg:'Настройки безопасности вашего браузера не разрешают редактору напрямую обращаться к буферу обмена. Вы должны вставить текст снова в это окно.',pasteArea:'Зона для вставки'},pastefromword:{confirmCleanup:'Текст, который вы желаете вставить, по всей видимости, был скопирован из Word. Следует ли очистить его перед вставкой?',toolbar:'Вставить из Word',title:'Вставить из Word',error:'Невозможно очистить вставленные данные из-за внутренней ошибки'},pasteText:{button:'Вставить только текст',title:'Вставить только текст'},templates:{button:'Шаблоны',title:'Шаблоны содержимого',options:'Параметры шаблона',insertOption:'Заменить текущее содержимое',selectPromptMsg:'Пожалуйста, выберите, какой шаблон следует открыть в редакторе',emptyListMsg:'(не определено ни одного шаблона)'},showBlocks:'Отображать блоки',stylesCombo:{label:'Стили',panelTitle:'Стили форматирования',panelTitle1:'Стили блока',panelTitle2:'Стили элемента',panelTitle3:'Стили объекта'},format:{label:'Форматирование',panelTitle:'Форматирование',tag_p:'Обычное',tag_pre:'Моноширинное',tag_address:'Адрес',tag_h1:'Заголовок 1',tag_h2:'Заголовок 2',tag_h3:'Заголовок 3',tag_h4:'Заголовок 4',tag_h5:'Заголовок 5',tag_h6:'Заголовок 6',tag_div:'Обычное (div)'},div:{title:'Создать Div-контейнер',toolbar:'Создать Div-контейнер',cssClassInputLabel:'Классы CSS',styleSelectLabel:'Стиль',IdInputLabel:'Идентификатор',languageCodeInputLabel:'Код языка',inlineStyleInputLabel:'Стиль элемента',advisoryTitleInputLabel:'Заголовок',langDirLabel:'Направление текста',langDirLTRLabel:'Слева направо (LTR)',langDirRTLLabel:'Справа налево (RTL)',edit:'Редактировать контейнер',remove:'Удалить контейнер'},iframe:{title:'Свойства iFrame',toolbar:'iFrame',noUrl:'Пожалуйста, введите ссылку фрейма',scrolling:'Отображать полосы прокрутки',border:'Показать границы фрейма'},font:{label:'Шрифт',voiceLabel:'Шрифт',panelTitle:'Шрифт'},fontSize:{label:'Размер',voiceLabel:'Размер шрифта',panelTitle:'Размер шрифта'},colorButton:{textColorTitle:'Цвет текста',bgColorTitle:'Цвет фона',panelTitle:'Цвета',auto:'Автоматически',more:'Ещё цвета...'},colors:{'000':'Чёрный',800000:'Бордовый','8B4513':'Кожано-коричневый','2F4F4F':'Темный синевато-серый','008080':'Сине-зелёный','000080':'Тёмно-синий','4B0082':'Индиго',696969:'Тёмно-серый',B22222:'Кирпичный',A52A2A:'Коричневый',DAA520:'Золотисто-берёзовый','006400':'Темно-зелёный','40E0D0':'Бирюзовый','0000CD':'Умеренно синий',800080:'Пурпурный',808080:'Серый',F00:'Красный',FF8C00:'Темно-оранжевый',FFD700:'Золотистый','008000':'Зелёный','0FF':'Васильковый','00F':'Синий',EE82EE:'Фиолетовый',A9A9A9:'Тускло-серый',FFA07A:'Светло-лососевый',FFA500:'Оранжевый',FFFF00:'Жёлтый','00FF00':'Лайма',AFEEEE:'Бледно-синий',ADD8E6:'Свелто-голубой',DDA0DD:'Сливовый',D3D3D3:'Светло-серый',FFF0F5:'Розово-лавандовый',FAEBD7:'Античный белый',FFFFE0:'Светло-жёлтый',F0FFF0:'Медвяной росы',F0FFFF:'Лазурный',F0F8FF:'Бледно-голубой',E6E6FA:'Лавандовый',FFF:'Белый'},scayt:{title:'Проверка орфографии по мере ввода (SCAYT)',opera_title:'Не поддерживается Opera',enable:'Включить SCAYT',disable:'Отключить SCAYT',about:'О SCAYT',toggle:'Переключить SCAYT',options:'Настройки',langs:'Языки',moreSuggestions:'Ещё варианты',ignore:'Пропустить',ignoreAll:'Пропустить всё',addWord:'Добавить слово',emptyDic:'Вы должны указать название словаря.',optionsTab:'Параметры',allCaps:'Игнорировать слова из заглавных букв',ignoreDomainNames:'Игнорировать доменные имена',mixedCase:'Игнорировать слова из букв в разном регистре',mixedWithDigits:'Игнорировать слова, содержащие цифры',languagesTab:'Языки',dictionariesTab:'Словари',dic_field_name:'Название словаря',dic_create:'Создать',dic_restore:'Восстановить',dic_delete:'Удалить',dic_rename:'Переименовать',dic_info:'Изначально, пользовательский словарь хранится в cookie, которые ограничены в размере. Когда словарь пользователя вырастает до размеров, что его невозможно хранить в cookie, он переносится на хранение на наш сервер. Чтобы сохранить ваш словарь на нашем сервере, вам следует указать название вашего словаря. Если у вас уже был словарь, который вы сохраняли на нашем сервере, то укажите здесь его название и нажмите кнопку Восстановить.',aboutTab:'О SCAYT'},about:{title:'О CKEditor',dlgTitle:'О CKEditor',help:'$1 содержит подробную справку по использованию.',userGuide:'Руководство пользователя CKEditor',moreInfo:'Для получения информации о лицензии, пожалуйста, перейдите на наш сайт:',copy:'Copyright © $1. Все права защищены.'},maximize:'Развернуть',minimize:'Свернуть',fakeobjects:{anchor:'Якорь',flash:'Flash анимация',iframe:'iFrame',hiddenfield:'Скрытое поле',unknown:'Неизвестный объект'},resize:'Перетащите для изменения размера',colordialog:{title:'Выберите цвет',options:'Настройки цвета',highlight:'Под курсором',selected:'Выбранный цвет',clear:'Очистить'},toolbarCollapse:'Свернуть панель инструментов',toolbarExpand:'Развернуть панель инструментов',toolbarGroups:{document:'Документ',clipboard:'Буфер обмена / Отмена действий',editing:'Корректировка',forms:'Формы',basicstyles:'Простые стили',paragraph:'Абзац',links:'Ссылки',insert:'Вставка',styles:'Стили',colors:'Цвета',tools:'Инструменты'},bidi:{ltr:'Направление текста слева направо',rtl:'Направление текста справа налево'},docprops:{label:'Свойства документа',title:'Свойства документа',design:'Дизайн',meta:'Метаданные',chooseColor:'Выберите',other:'Другой ...',docTitle:'Заголовок страницы',charset:'Кодировка набора символов',charsetOther:'Другая кодировка набора символов',charsetASCII:'ASCII',charsetCE:'Центрально-европейская',charsetCT:'Китайская традиционная (Big5)',charsetCR:'Кириллица',charsetGR:'Греческая',charsetJP:'Японская',charsetKR:'Корейская',charsetTR:'Турецкая',charsetUN:'Юникод (UTF-8)',charsetWE:'Западно-европейская',docType:'Заголовок типа документа',docTypeOther:'Другой заголовок типа документа',xhtmlDec:'Включить объявления XHTML',bgColor:'Цвет фона',bgImage:'Ссылка на фоновое изображение',bgFixed:'Фон прикреплён (не проматывается)',txtColor:'Цвет текста',margin:'Отступы страницы',marginTop:'Верхний',marginLeft:'Левый',marginRight:'Правый',marginBottom:'Нижний',metaKeywords:'Ключевые слова документа (через запятую)',metaDescription:'Описание документа',metaAuthor:'Автор',metaCopyright:'Авторские права',previewHtml:'<p>Это <strong>пример</strong> текста, написанного с помощью <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.ru={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Панели инструментов редактора',editor:'Визуальный редактор текста',source:'Источник',newPage:'Новая страница',save:'Сохранить',preview:'Предварительный просмотр',cut:'Вырезать',copy:'Копировать',paste:'Вставить',print:'Печать',underline:'Подчеркнутый',bold:'Полужирный',italic:'Курсив',selectAll:'Выделить все',removeFormat:'Убрать форматирование',strike:'Зачеркнутый',subscript:'Подстрочный индекс',superscript:'Надстрочный индекс',horizontalrule:'Вставить горизонтальную линию',pagebreak:'Вставить разрыв страницы для печати',pagebreakAlt:'Разрыв страницы',unlink:'Убрать ссылку',undo:'Отменить',redo:'Повторить',common:{browseServer:'Выбор на сервере',url:'Ссылка',protocol:'Протокол',upload:'Загрузка',uploadSubmit:'Загрузить на сервер',image:'Изображение',flash:'Flash',form:'Форма',checkbox:'Флаговая кнопка',radio:'Кнопка выбора',textField:'Текстовое поле',textarea:'Многострочное текстовое поле',hiddenField:'Скрытое поле',button:'Кнопка',select:'Список выбора',imageButton:'Изображение-кнопка',notSet:'<не указано>',id:'Идентификатор',name:'Имя',langDir:'Направление текста',langDirLtr:'Слева направо (LTR)',langDirRtl:'Справа налево (RTL)',langCode:'Код языка',longDescr:'Длинное описание ссылки',cssClass:'Класс CSS',advisoryTitle:'Заголовок',cssStyle:'Стиль',ok:'ОК',cancel:'Отмена',close:'Закрыть',preview:'Предпросмотр',generalTab:'Основное',advancedTab:'Дополнительно',validateNumberFailed:'Это значение не является числом.',confirmNewPage:'Несохранённые изменения будут потеряны! Вы действительно желаете перейти на другую страницу?',confirmCancel:'Некоторые параметры были изменены. Вы уверены, что желаете закрыть без сохранения?',options:'Параметры',target:'Цель',targetNew:'Новое окно (_blank)',targetTop:'Главное окно (_top)',targetSelf:'Текущее окно (_self)',targetParent:'Родительское окно (_parent)',langDirLTR:'Слева направо (LTR)',langDirRTL:'Справа налево (RTL)',styles:'Стиль',cssClasses:'Классы CSS',width:'Ширина',height:'Высота',align:'Выравнивание',alignLeft:'По левому краю',alignRight:'По правому краю',alignCenter:'По центру',alignTop:'По верху',alignMiddle:'По середине',alignBottom:'По низу',invalidHeight:'Высота задается числом.',invalidWidth:'Ширина задается числом.',invalidCssLength:'Значение, указанное в поле "%1", должно быть положительным целым числом. Допускается указание единиц меры CSS (px, %, in, cm, mm, em, ex, pt или pc).',invalidHtmlLength:'Значение, указанное в поле "%1", должно быть положительным целым числом. Допускается указание единиц меры HTML (px или %).',invalidInlineStyle:'Значение, указанное для стиля элемента, должно состоять из одной или нескольких пар данных в формате "параметр : значение", разделённых точкой с запятой.',cssLengthTooltip:'Введите значение в пикселях, либо число с корректной единицей меры CSS (px, %, in, cm, mm, em, ex, pt или pc).',unavailable:'%1<span class="cke_accessibility">, недоступно</span>'},contextmenu:{options:'Параметры контекстного меню'},specialChar:{toolbar:'Вставить специальный символ',title:'Выберите специальный символ',options:'Выбор специального символа'},link:{toolbar:'Вставить/Редактировать ссылку',other:'<другой>',menu:'Редактировать ссылку',title:'Ссылка',info:'Информация о ссылке',target:'Цель',upload:'Загрузка',advanced:'Дополнительно',type:'Тип ссылки',toUrl:'Ссылка',toAnchor:'Ссылка на якорь в тексте',toEmail:'Email',targetFrame:'<фрейм>',targetPopup:'<всплывающее окно>',targetFrameName:'Имя целевого фрейма',targetPopupName:'Имя всплывающего окна',popupFeatures:'Параметры всплывающего окна',popupResizable:'Изменяемый размер',popupStatusBar:'Строка состояния',popupLocationBar:'Панель адреса',popupToolbar:'Панель инструментов',popupMenuBar:'Панель меню',popupFullScreen:'Полноэкранное (IE)',popupScrollBars:'Полосы прокрутки',popupDependent:'Зависимое (Netscape)',popupLeft:'Отступ слева',popupTop:'Отступ сверху',id:'Идентификатор',langDir:'Направление текста',langDirLTR:'Слева направо (LTR)',langDirRTL:'Справа налево (RTL)',acccessKey:'Клавиша доступа',name:'Имя',langCode:'Код языка',tabIndex:'Последовательность перехода',advisoryTitle:'Заголовок',advisoryContentType:'Тип содержимого',cssClasses:'Классы CSS',charset:'Кодировка ресурса',styles:'Стиль',rel:'Отношение',selectAnchor:'Выберите якорь',anchorName:'По имени',anchorId:'По идентификатору',emailAddress:'Email адрес',emailSubject:'Тема сообщения',emailBody:'Текст сообщения',noAnchors:'(В документе нет ни одного якоря)',noUrl:'Пожалуйста, введите ссылку',noEmail:'Пожалуйста, введите email адрес'},anchor:{toolbar:'Вставить / редактировать якорь',menu:'Изменить якорь',title:'Свойства якоря',name:'Имя якоря',errorName:'Пожалуйста, введите имя якоря',remove:'Удалить якорь'},list:{numberedTitle:'Свойства нумерованного списка',bulletedTitle:'Свойства маркированного списка',type:'Тип',start:'Начиная с',validateStartNumber:'Первый номер списка должен быть задан обычным целым числом.',circle:'Круг',disc:'Окружность',square:'Квадрат',none:'Нет',notset:'<не указано>',armenian:'Армянская нумерация',georgian:'Грузинская нумерация (ани, бани, гани, и т.д.)',lowerRoman:'Строчные римские (i, ii, iii, iv, v, и т.д.)',upperRoman:'Заглавные римские (I, II, III, IV, V, и т.д.)',lowerAlpha:'Строчные латинские (a, b, c, d, e, и т.д.)',upperAlpha:'Заглавные латинские (A, B, C, D, E, и т.д.)',lowerGreek:'Строчные греческие (альфа, бета, гамма, и т.д.)',decimal:'Десятичные (1, 2, 3, и т.д.)',decimalLeadingZero:'Десятичные с ведущим нулём (01, 02, 03, и т.д.)'},findAndReplace:{title:'Поиск и замена',find:'Найти',replace:'Заменить',findWhat:'Найти:',replaceWith:'Заменить на:',notFoundMsg:'Искомый текст не найден.',findOptions:'Опции поиска',matchCase:'Учитывать регистр',matchWord:'Только слово целиком',matchCyclic:'По всему тексту',replaceAll:'Заменить всё',replaceSuccessMsg:'Успешно заменено %1 раз(а).'},table:{toolbar:'Таблица',title:'Свойства таблицы',menu:'Свойства таблицы',deleteTable:'Удалить таблицу',rows:'Строки',columns:'Колонки',border:'Размер границ',widthPx:'пикселей',widthPc:'процентов',widthUnit:'единица измерения',cellSpace:'Внешний отступ ячеек',cellPad:'Внутренний отступ ячеек',caption:'Заголовок',summary:'Итоги',headers:'Заголовки',headersNone:'Без заголовков',headersColumn:'Левая колонка',headersRow:'Верхняя строка',headersBoth:'Сверху и слева',invalidRows:'Количество строк должно быть больше 0.',invalidCols:'Количество столбцов должно быть больше 0.',invalidBorder:'Размер границ должен быть числом.',invalidWidth:'Ширина таблицы должна быть числом.',invalidHeight:'Высота таблицы должна быть числом.',invalidCellSpacing:'Внешний отступ ячеек (cellspacing) должен быть числом.',invalidCellPadding:'Внутренний отступ ячеек (cellpadding) должен быть числом.',cell:{menu:'Ячейка',insertBefore:'Вставить ячейку слева',insertAfter:'Вставить ячейку справа',deleteCell:'Удалить ячейки',merge:'Объединить ячейки',mergeRight:'Объединить с правой',mergeDown:'Объединить с нижней',splitHorizontal:'Разделить ячейку по горизонтали',splitVertical:'Разделить ячейку по вертикали',title:'Свойства ячейки',cellType:'Тип ячейки',rowSpan:'Объединяет строк',colSpan:'Объединяет колонок',wordWrap:'Перенос по словам',hAlign:'Горизонтальное выравнивание',vAlign:'Вертикальное выравнивание',alignBaseline:'По базовой линии',bgColor:'Цвет фона',borderColor:'Цвет границ',data:'Данные',header:'Заголовок',yes:'Да',no:'Нет',invalidWidth:'Ширина ячейки должна быть числом.',invalidHeight:'Высота ячейки должна быть числом.',invalidRowSpan:'Количество объединяемых строк должно быть задано числом.',invalidColSpan:'Количество объединяемых колонок должно быть задано числом.',chooseColor:'Выберите'},row:{menu:'Строка',insertBefore:'Вставить строку сверху',insertAfter:'Вставить строку снизу',deleteRow:'Удалить строки'},column:{menu:'Колонка',insertBefore:'Вставить колонку слева',insertAfter:'Вставить колонку справа',deleteColumn:'Удалить колонки'}},button:{title:'Свойства кнопки',text:'Текст (Значение)',type:'Тип',typeBtn:'Кнопка',typeSbm:'Отправка',typeRst:'Сброс'},checkboxAndRadio:{checkboxTitle:'Свойства флаговой кнопки',radioTitle:'Свойства кнопки выбора',value:'Значение',selected:'Выбрано'},form:{title:'Свойства формы',menu:'Свойства формы',action:'Действие',method:'Метод',encoding:'Кодировка'},select:{title:'Свойства списка выбора',selectInfo:'Информация о списке выбора',opAvail:'Доступные варианты',value:'Значение',size:'Размер',lines:'строк(и)',chkMulti:'Разрешить выбор нескольких вариантов',opText:'Текст',opValue:'Значение',btnAdd:'Добавить',btnModify:'Изменить',btnUp:'Поднять',btnDown:'Опустить',btnSetValue:'Пометить как выбранное',btnDelete:'Удалить'},textarea:{title:'Свойства многострочного текстового поля',cols:'Колонок',rows:'Строк'},textfield:{title:'Свойства текстового поля',name:'Имя',value:'Значение',charWidth:'Ширина поля (в символах)',maxChars:'Макс. количество символов',type:'Тип содержимого',typeText:'Текст',typePass:'Пароль'},hidden:{title:'Свойства скрытого поля',name:'Имя',value:'Значение'},image:{title:'Свойства изображения',titleButton:'Свойства изображения-кнопки',menu:'Свойства изображения',infoTab:'Данные об изображении',btnUpload:'Загрузить на сервер',upload:'Загрузить',alt:'Альтернативный текст',lockRatio:'Сохранять пропорции',resetSize:'Вернуть обычные размеры',border:'Граница',hSpace:'Гориз. отступ',vSpace:'Вертик. отступ',alertUrl:'Пожалуйста, введите ссылку на изображение',linkTab:'Ссылка',button2Img:'Вы желаете преобразовать это изображение-кнопку в обычное изображение?',img2Button:'Вы желаете преобразовать это обычное изображение в изображение-кнопку?',urlMissing:'Не указана ссылка на изображение.',validateBorder:'Размер границ должен быть задан числом.',validateHSpace:'Горизонтальный отступ должен быть задан числом.',validateVSpace:'Вертикальный отступ должен быть задан числом.'},flash:{properties:'Свойства Flash',propertiesTab:'Свойства',title:'Свойства Flash',chkPlay:'Автоматическое воспроизведение',chkLoop:'Повторять',chkMenu:'Включить меню Flash',chkFull:'Разрешить полноэкранный режим',scale:'Масштабировать',scaleAll:'Пропорционально',scaleNoBorder:'Заходить за границы',scaleFit:'Заполнять',access:'Доступ к скриптам',accessAlways:'Всегда',accessSameDomain:'В том же домене',accessNever:'Никогда',alignAbsBottom:'По низу текста',alignAbsMiddle:'По середине текста',alignBaseline:'По базовой линии',alignTextTop:'По верху текста',quality:'Качество',qualityBest:'Лучшее',qualityHigh:'Высокое',qualityAutoHigh:'Запуск на высоком',qualityMedium:'Среднее',qualityAutoLow:'Запуск на низком',qualityLow:'Низкое',windowModeWindow:'Обычный',windowModeOpaque:'Непрозрачный',windowModeTransparent:'Прозрачный',windowMode:'Взаимодействие с окном',flashvars:'Переменные для Flash',bgcolor:'Цвет фона',hSpace:'Гориз. отступ',vSpace:'Вертик. отступ',validateSrc:'Вы должны ввести ссылку',validateHSpace:'Горизонтальный отступ задается числом.',validateVSpace:'Вертикальный отступ задается числом.'},spellCheck:{toolbar:'Проверить орфографию',title:'Проверка орфографии',notAvailable:'Извините, но в данный момент сервис недоступен.',errorLoading:'Произошла ошибка при подключении к серверу проверки орфографии: %s.',notInDic:'Отсутствует в словаре',changeTo:'Изменить на',btnIgnore:'Пропустить',btnIgnoreAll:'Пропустить всё',btnReplace:'Заменить',btnReplaceAll:'Заменить всё',btnUndo:'Отменить',noSuggestions:'- Варианты отсутствуют -',progress:'Орфография проверяется...',noMispell:'Проверка орфографии завершена. Ошибок не найдено',noChanges:'Проверка орфографии завершена. Не изменено ни одного слова',oneChange:'Проверка орфографии завершена. Изменено одно слово',manyChanges:'Проверка орфографии завершена. Изменено слов: %1',ieSpellDownload:'Модуль проверки орфографии не установлен. Хотите скачать его?'},smiley:{toolbar:'Смайлы',title:'Вставить смайл',options:'Выбор смайла'},elementsPath:{eleLabel:'Путь элементов',eleTitle:'Элемент %1'},numberedlist:'Вставить / удалить нумерованный список',bulletedlist:'Вставить / удалить маркированный список',indent:'Увеличить отступ',outdent:'Уменьшить отступ',justify:{left:'По левому краю',center:'По центру',right:'По правому краю',block:'По ширине'},blockquote:'Цитата',clipboard:{title:'Вставить',cutError:'Настройки безопасности вашего браузера не разрешают редактору выполнять операции по вырезке текста. Пожалуйста, используйте для этого клавиатуру (Ctrl/Cmd+X).',copyError:'Настройки безопасности вашего браузера не разрешают редактору выполнять операции по копированию текста. Пожалуйста, используйте для этого клавиатуру (Ctrl/Cmd+C).',pasteMsg:'Пожалуйста, вставьте текст в зону ниже, используя клавиатуру (<strong>Ctrl/Cmd+V</strong>) и нажмите кнопку "OK".',securityMsg:'Настройки безопасности вашего браузера не разрешают редактору напрямую обращаться к буферу обмена. Вы должны вставить текст снова в это окно.',pasteArea:'Зона для вставки'},pastefromword:{confirmCleanup:'Текст, который вы желаете вставить, по всей видимости, был скопирован из Word. Следует ли очистить его перед вставкой?',toolbar:'Вставить из Word',title:'Вставить из Word',error:'Невозможно очистить вставленные данные из-за внутренней ошибки'},pasteText:{button:'Вставить только текст',title:'Вставить только текст'},templates:{button:'Шаблоны',title:'Шаблоны содержимого',options:'Параметры шаблона',insertOption:'Заменить текущее содержимое',selectPromptMsg:'Пожалуйста, выберите, какой шаблон следует открыть в редакторе',emptyListMsg:'(не определено ни одного шаблона)'},showBlocks:'Отображать блоки',stylesCombo:{label:'Стили',panelTitle:'Стили форматирования',panelTitle1:'Стили блока',panelTitle2:'Стили элемента',panelTitle3:'Стили объекта'},format:{label:'Форматирование',panelTitle:'Форматирование',tag_p:'Обычное',tag_pre:'Моноширинное',tag_address:'Адрес',tag_h1:'Заголовок 1',tag_h2:'Заголовок 2',tag_h3:'Заголовок 3',tag_h4:'Заголовок 4',tag_h5:'Заголовок 5',tag_h6:'Заголовок 6',tag_div:'Обычное (div)'},div:{title:'Создать Div-контейнер',toolbar:'Создать Div-контейнер',cssClassInputLabel:'Классы CSS',styleSelectLabel:'Стиль',IdInputLabel:'Идентификатор',languageCodeInputLabel:'Код языка',inlineStyleInputLabel:'Стиль элемента',advisoryTitleInputLabel:'Заголовок',langDirLabel:'Направление текста',langDirLTRLabel:'Слева направо (LTR)',langDirRTLLabel:'Справа налево (RTL)',edit:'Редактировать контейнер',remove:'Удалить контейнер'},iframe:{title:'Свойства iFrame',toolbar:'iFrame',noUrl:'Пожалуйста, введите ссылку фрейма',scrolling:'Отображать полосы прокрутки',border:'Показать границы фрейма'},font:{label:'Шрифт',voiceLabel:'Шрифт',panelTitle:'Шрифт'},fontSize:{label:'Размер',voiceLabel:'Размер шрифта',panelTitle:'Размер шрифта'},colorButton:{textColorTitle:'Цвет текста',bgColorTitle:'Цвет фона',panelTitle:'Цвета',auto:'Автоматически',more:'Ещё цвета...'},colors:{'000':'Чёрный',800000:'Бордовый','8B4513':'Кожано-коричневый','2F4F4F':'Темный синевато-серый','008080':'Сине-зелёный','000080':'Тёмно-синий','4B0082':'Индиго',696969:'Тёмно-серый',B22222:'Кирпичный',A52A2A:'Коричневый',DAA520:'Золотисто-берёзовый','006400':'Темно-зелёный','40E0D0':'Бирюзовый','0000CD':'Умеренно синий',800080:'Пурпурный',808080:'Серый',F00:'Красный',FF8C00:'Темно-оранжевый',FFD700:'Золотистый','008000':'Зелёный','0FF':'Васильковый','00F':'Синий',EE82EE:'Фиолетовый',A9A9A9:'Тускло-серый',FFA07A:'Светло-лососевый',FFA500:'Оранжевый',FFFF00:'Жёлтый','00FF00':'Лайма',AFEEEE:'Бледно-синий',ADD8E6:'Свелто-голубой',DDA0DD:'Сливовый',D3D3D3:'Светло-серый',FFF0F5:'Розово-лавандовый',FAEBD7:'Античный белый',FFFFE0:'Светло-жёлтый',F0FFF0:'Медвяной росы',F0FFFF:'Лазурный',F0F8FF:'Бледно-голубой',E6E6FA:'Лавандовый',FFF:'Белый'},scayt:{title:'Проверка орфографии по мере ввода (SCAYT)',opera_title:'Не поддерживается Opera',enable:'Включить SCAYT',disable:'Отключить SCAYT',about:'О SCAYT',toggle:'Переключить SCAYT',options:'Настройки',langs:'Языки',moreSuggestions:'Ещё варианты',ignore:'Пропустить',ignoreAll:'Пропустить всё',addWord:'Добавить слово',emptyDic:'Вы должны указать название словаря.',optionsTab:'Параметры',allCaps:'Игнорировать слова из заглавных букв',ignoreDomainNames:'Игнорировать доменные имена',mixedCase:'Игнорировать слова из букв в разном регистре',mixedWithDigits:'Игнорировать слова, содержащие цифры',languagesTab:'Языки',dictionariesTab:'Словари',dic_field_name:'Название словаря',dic_create:'Создать',dic_restore:'Восстановить',dic_delete:'Удалить',dic_rename:'Переименовать',dic_info:'Изначально, пользовательский словарь хранится в cookie, которые ограничены в размере. Когда словарь пользователя вырастает до размеров, что его невозможно хранить в cookie, он переносится на хранение на наш сервер. Чтобы сохранить ваш словарь на нашем сервере, вам следует указать название вашего словаря. Если у вас уже был словарь, который вы сохраняли на нашем сервере, то укажите здесь его название и нажмите кнопку Восстановить.',aboutTab:'О SCAYT'},about:{title:'О CKEditor',dlgTitle:'О CKEditor',help:'$1 содержит подробную справку по использованию.',userGuide:'Руководство пользователя CKEditor',moreInfo:'Для получения информации о лицензии, пожалуйста, перейдите на наш сайт:',copy:'Copyright © $1. Все права защищены.'},maximize:'Развернуть',minimize:'Свернуть',fakeobjects:{anchor:'Якорь',flash:'Flash анимация',iframe:'iFrame',hiddenfield:'Скрытое поле',unknown:'Неизвестный объект'},resize:'Перетащите для изменения размера',colordialog:{title:'Выберите цвет',options:'Настройки цвета',highlight:'Под курсором',selected:'Выбранный цвет',clear:'Очистить'},toolbarCollapse:'Свернуть панель инструментов',toolbarExpand:'Развернуть панель инструментов',toolbarGroups:{document:'Документ',clipboard:'Буфер обмена / Отмена действий',editing:'Корректировка',forms:'Формы',basicstyles:'Простые стили',paragraph:'Абзац',links:'Ссылки',insert:'Вставка',styles:'Стили',colors:'Цвета',tools:'Инструменты'},bidi:{ltr:'Направление текста слева направо',rtl:'Направление текста справа налево'},docprops:{label:'Свойства документа',title:'Свойства документа',design:'Дизайн',meta:'Метаданные',chooseColor:'Выберите',other:'Другой ...',docTitle:'Заголовок страницы',charset:'Кодировка набора символов',charsetOther:'Другая кодировка набора символов',charsetASCII:'ASCII',charsetCE:'Центрально-европейская',charsetCT:'Китайская традиционная (Big5)',charsetCR:'Кириллица',charsetGR:'Греческая',charsetJP:'Японская',charsetKR:'Корейская',charsetTR:'Турецкая',charsetUN:'Юникод (UTF-8)',charsetWE:'Западно-европейская',docType:'Заголовок типа документа',docTypeOther:'Другой заголовок типа документа',xhtmlDec:'Включить объявления XHTML',bgColor:'Цвет фона',bgImage:'Ссылка на фоновое изображение',bgFixed:'Фон прикреплён (не проматывается)',txtColor:'Цвет текста',margin:'Отступы страницы',marginTop:'Верхний',marginLeft:'Левый',marginRight:'Правый',marginBottom:'Нижний',metaKeywords:'Ключевые слова документа (через запятую)',metaDescription:'Описание документа',metaAuthor:'Автор',metaCopyright:'Авторские права',previewHtml:'<p>Это <strong>пример</strong> текста, написанного с помощью <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/sk.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/sk.js
index 3e8a02e..a74777c 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/sk.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/sk.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.sk={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Zdroj',newPage:'Nová stránka',save:'Uložiť',preview:'Náhľad',cut:'Vystrihnúť',copy:'Kopírovať',paste:'Vložiť',print:'Tlač',underline:'Podčiarknuté',bold:'Tučné',italic:'Kurzíva',selectAll:'Vybrať všetko',removeFormat:'Odstrániť formátovanie',strike:'Prečiarknuté',subscript:'Dolný index',superscript:'Horný index',horizontalrule:'Vložiť vodorovnú čiaru',pagebreak:'Vložiť oddeľovač stránky',pagebreakAlt:'Zalomenie strany',unlink:'Odstrániť odkaz',undo:'Späť',redo:'Znovu',common:{browseServer:'Prechádzať server',url:'URL',protocol:'Protokol',upload:'Odoslať',uploadSubmit:'Odoslať na server',image:'Obrázok',flash:'Flash',form:'Formulár',checkbox:'Zaškrtávacie políčko',radio:'Prepínač',textField:'Textové pole',textarea:'Textová oblasť',hiddenField:'Skryté pole',button:'Tlačidlo',select:'Rozbaľovací zoznam',imageButton:'Obrázkové tlačidlo',notSet:'<nenastavené>',id:'Id',name:'Meno',langDir:'Orientácia jazyka',langDirLtr:'Zľava doprava (LTR)',langDirRtl:'Sprava doľava (RTL)',langCode:'Kód jazyka',longDescr:'Dlhý popis URL',cssClass:'Trieda štýlu',advisoryTitle:'Pomocný titulok',cssStyle:'Štýl',ok:'OK',cancel:'Zrušiť',close:'Zatvorit',preview:'Náhľad',generalTab:'Hlavné',advancedTab:'Rozšírené',validateNumberFailed:'Hodnota nieje číslo.',confirmNewPage:'Prajete si načítat novú stránku? Všetky neuložené zmeny budú stratené. ',confirmCancel:'Niektore možnosti boli zmenené. Naozaj chcete zavrieť okno?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Šírka',height:'Výška',align:'Zarovnanie',alignLeft:'Vľavo',alignRight:'Vpravo',alignCenter:'Na stred',alignTop:'Nahor',alignMiddle:'Na stred',alignBottom:'Dole',invalidHeight:'Výška musí byť číslo.',invalidWidth:'Šírka musí byť číslo.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Vložiť špeciálne znaky',title:'Výber špeciálneho znaku',options:'Možnosti špecíalneho znaku'},link:{toolbar:'Vložiť/zmeniť odkaz',other:'<iný>',menu:'Zmeniť odkaz',title:'Odkaz',info:'Informácie o odkaze',target:'Cieľ',upload:'Odoslať',advanced:'Rozšírené',type:'Typ odkazu',toUrl:'URL',toAnchor:'Kotva v tejto stránke',toEmail:'E-Mail',targetFrame:'<rámec>',targetPopup:'<vyskakovacie okno>',targetFrameName:'Meno rámu cieľa',targetPopupName:'Názov vyskakovacieho okna',popupFeatures:'Vlastnosti vyskakovacieho okna',popupResizable:'Meniteľná veľkosť',popupStatusBar:'Stavový riadok',popupLocationBar:'Panel umiestnenia',popupToolbar:'Panel nástrojov',popupMenuBar:'Panel ponuky',popupFullScreen:'Celá obrazovka (IE)',popupScrollBars:'Posuvníky',popupDependent:'Závislosť (Netscape)',popupLeft:'Ľavý okraj',popupTop:'Horný okraj',id:'Id',langDir:'Orientácia jazyka',langDirLTR:'Zľava doprava (LTR)',langDirRTL:'Sprava doľava (RTL)',acccessKey:'Prístupový kľúč',name:'Meno',langCode:'Orientácia jazyka',tabIndex:'Poradie prvku',advisoryTitle:'Pomocný titulok',advisoryContentType:'Pomocný typ obsahu',cssClasses:'Trieda štýlu',charset:'Priradená znaková sada',styles:'Štýl',rel:'Relationship',selectAnchor:'Vybrať kotvu',anchorName:'Podľa mena kotvy',anchorId:'Podľa Id objektu',emailAddress:'E-Mailová adresa',emailSubject:'Predmet správy',emailBody:'Telo správy',noAnchors:'(V stránke nie je definovaná žiadna kotva)',noUrl:'Zadajte prosím URL odkazu',noEmail:'Zadajte prosím e-mailovú adresu'},anchor:{toolbar:'Vložiť/zmeniť kotvu',menu:'Vlastnosti kotvy',title:'Vlastnosti kotvy',name:'Meno kotvy',errorName:'Zadajte prosím meno kotvy',remove:'Remove Anchor'},list:{numberedTitle:'Vlastnosti číselného zoznamu',bulletedTitle:'Bulleted List Properties',type:'Druh',start:'Začiatok',validateStartNumber:'Začiatočné číslo číselného zoznamu musí byť celé číslo.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Nájsť a nahradiť',find:'Hľadať',replace:'Nahradiť',findWhat:'Čo hľadať:',replaceWith:'Čím nahradiť:',notFoundMsg:'Hľadaný text nebol nájdený.',findOptions:'Find Options',matchCase:'Rozlišovať malé/veľké písmená',matchWord:'Len celé slová',matchCyclic:'Match cyclic',replaceAll:'Nahradiť všetko',replaceSuccessMsg:'%1 výskyt(ov) nahradených.'},table:{toolbar:'Tabuľka',title:'Vlastnosti tabuľky',menu:'Vlastnosti tabuľky',deleteTable:'Vymazať tabuľku',rows:'Riadky',columns:'Stĺpce',border:'Ohraničenie',widthPx:'pixelov',widthPc:'percent',widthUnit:'width unit',cellSpace:'Vzdialenosť buniek',cellPad:'Odsadenie obsahu',caption:'Popis',summary:'Prehľad',headers:'Hlavička',headersNone:'Žiadne',headersColumn:'Prvý stĺpec',headersRow:'Prvý riadok',headersBoth:'Obe',invalidRows:'Počet riadkov musí byť číslo väčšie ako 0.',invalidCols:'Počet stĺpcov musí byť číslo väčšie ako 0.',invalidBorder:'Širka rámu musí byť celé číslo.',invalidWidth:'Širka tabuľky musí byť číslo.',invalidHeight:'Výška tabuľky musí byť číslo.',invalidCellSpacing:'Medzera mädzi bunkami (spacing) musí byť číslo.',invalidCellPadding:'Odsadenie v bunkách (padding) musí byť číslo.',cell:{menu:'Bunka',insertBefore:'Vložiť bunku pred',insertAfter:'Vložiť bunku za',deleteCell:'Vymazať bunky',merge:'Zlúčiť bunky',mergeRight:'Zlúčiť doprava',mergeDown:'Zlúčiť dole',splitHorizontal:'Rozdeliť bunky horizontálne',splitVertical:'Rozdeliť bunky vertikálne',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Riadok',insertBefore:'Vložiť riadok za',insertAfter:'Vložiť riadok pred',deleteRow:'Vymazať riadok'},column:{menu:'Stĺpec',insertBefore:'Vložiť stĺpec za',insertAfter:'Vložiť stĺpec pred',deleteColumn:'Zmazať stĺpec'}},button:{title:'Vlastnosti tlačidla',text:'Text',type:'Typ',typeBtn:'Tlačidlo',typeSbm:'Odoslať',typeRst:'Vymazať'},checkboxAndRadio:{checkboxTitle:'Vlastnosti zaškrtávacieho políčka',radioTitle:'Vlastnosti prepínača',value:'Hodnota',selected:'Vybrané'},form:{title:'Vlastnosti formulára',menu:'Vlastnosti formulára',action:'Akcie',method:'Metóda',encoding:'Kódovanie'},select:{title:'Vlastnosti rozbaľovacieho zoznamu',selectInfo:'Info',opAvail:'Dostupné možnosti',value:'Hodnota',size:'Veľkosť',lines:'riadkov',chkMulti:'Povoliť viacnásobný výber',opText:'Text',opValue:'Hodnota',btnAdd:'Pridať',btnModify:'Zmeniť',btnUp:'Hore',btnDown:'Dole',btnSetValue:'Nastaviť ako vybranú hodnotu',btnDelete:'Zmazať'},textarea:{title:'Vlastnosti textovej oblasti',cols:'Stĺpce',rows:'Riadky'},textfield:{title:'Vlastnosti textového poľa',name:'Názov',value:'Hodnota',charWidth:'Šírka pola (znakov)',maxChars:'Maximálny počet znakov',type:'Typ',typeText:'Text',typePass:'Heslo'},hidden:{title:'Vlastnosti skrytého poľa',name:'Názov',value:'Hodnota'},image:{title:'Vlastnosti obrázku',titleButton:'Vlastnosti obrázkového tlačidla',menu:'Vlastnosti obrázku',infoTab:'Informácie o obrázku',btnUpload:'Odoslať na server',upload:'Odoslať',alt:'Alternatívny text',lockRatio:'Zámok',resetSize:'Pôvodná veľkosť',border:'Okraje',hSpace:'H-medzera',vSpace:'V-medzera',alertUrl:'Zadajte prosím URL obrázku',linkTab:'Odkaz',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Vlastnosti Flashu',propertiesTab:'Properties',title:'Vlastnosti Flashu',chkPlay:'Automatické prehrávanie',chkLoop:'Opakovanie',chkMenu:'Povoliť Flash Menu',chkFull:'Allow Fullscreen',scale:'Mierka',scaleAll:'Zobraziť mierku',scaleNoBorder:'Bez okrajov',scaleFit:'Roztiahnuť na celé',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Úplne dole',alignAbsMiddle:'Do stredu',alignBaseline:'Na základňu',alignTextTop:'Na horný okraj textu',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Farba pozadia',hSpace:'H-medzera',vSpace:'V-medzera',validateSrc:'Zadajte prosím URL odkazu',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Kontrola pravopisu',title:'Spell Check',notAvailable:'Služba práve nieje dostupná.',errorLoading:'Chyba pri načítaní slovníka z adresy: %s.',notInDic:'Nie je v slovníku',changeTo:'Zmeniť na',btnIgnore:'Ignorovať',btnIgnoreAll:'Ignorovať všetko',btnReplace:'Prepísat',btnReplaceAll:'Prepísat všetko',btnUndo:'Späť',noSuggestions:'- Žiadny návrh -',progress:'Prebieha kontrola pravopisu...',noMispell:'Kontrola pravopisu dokončená: bez chýb',noChanges:'Kontrola pravopisu dokončená: žiadne slová nezmenené',oneChange:'Kontrola pravopisu dokončená: zmenené jedno slovo',manyChanges:'Kontrola pravopisu dokončená: zmenených %1 slov',ieSpellDownload:'Kontrola pravopisu nie je naištalovaná. Chcete ju hneď stiahnuť?'},smiley:{toolbar:'Smajlíky',title:'Vkladanie smajlíkov',options:'Možnosti smajlíkov'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Číslovanie',bulletedlist:'Odrážky',indent:'Zväčšiť odsadenie',outdent:'Zmenšiť odsadenie',justify:{left:'Zarovnať vľavo',center:'Zarovnať na stred',right:'Zarovnať vpravo',block:'Zarovnať do bloku'},blockquote:'Citácia',clipboard:{title:'Vložiť',cutError:'Bezpečnostné nastavenia Vášho prehliadača nedovoľujú editoru spustiť funkciu pre vystrihnutie zvoleného textu do schránky. Prosím vystrihnite zvolený text do schránky pomocou klávesnice (Ctrl/Cmd+X).',copyError:'Bezpečnostné nastavenia Vášho prehliadača nedovoľujú editoru spustiť funkciu pre kopírovanie zvoleného textu do schránky. Prosím skopírujte zvolený text do schránky pomocou klávesnice (Ctrl/Cmd+C).',pasteMsg:'Prosím vložte nasledovný rámček použitím klávesnice (<STRONG>Ctrl/Cmd+V</STRONG>) a stlačte <STRONG>OK</STRONG>.',securityMsg:'Bezpečnostné nastavenia Vášho prehliadača nedovoľujú editoru pristupovať priamo k datám v schránke. Musíte ich vložiť znovu do tohto okna.',pasteArea:'Vložiť pole'},pastefromword:{confirmCleanup:'Vkladaný text vyzerá byť skopírovaný z Wordu. Chcete ho automaticky vyčistiť pred vkladaním?',toolbar:'Vložiť z Wordu',title:'Vložiť z Wordu',error:'Nastala chyba pri čistení údajov. Nie je možné vyčistiť vložené údaje.'},pasteText:{button:'Vložiť ako čistý text',title:'Vložiť ako čistý text'},templates:{button:'Šablóny',title:'Šablóny obsahu',options:'Vlastnosti šablóny',insertOption:'Nahradiť aktuálny obsah',selectPromptMsg:'Prosím vyberte šablóny na otvorenie v editore<br>(súšasný obsah bude stratený):',emptyListMsg:'(žiadne šablóny nenájdené)'},showBlocks:'Ukázať bloky',stylesCombo:{label:'Štýl',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Formát',panelTitle:'Formát',tag_p:'Normálny',tag_pre:'Formátovaný',tag_address:'Adresa',tag_h1:'Nadpis 1',tag_h2:'Nadpis 2',tag_h3:'Nadpis 3',tag_h4:'Nadpis 4',tag_h5:'Nadpis 5',tag_h6:'Nadpis 6',tag_div:'Odsek (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame - vlastnosti',toolbar:'IFrame',noUrl:'Vložte URL pre iframe',scrolling:'Povoliť skrolovanie',border:'Zobraziť orámovanie'},font:{label:'Písmo',voiceLabel:'Font',panelTitle:'Písmo'},fontSize:{label:'Veľkosť',voiceLabel:'Veľkosť písma',panelTitle:'Veľkosť'},colorButton:{textColorTitle:'Farba textu',bgColorTitle:'Farba pozadia',panelTitle:'Farby',auto:'Automaticky',more:'Viac farieb...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximalizovať',minimize:'Minimalizovať',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Vlastnosti dokumentu',title:'Vlastnosti dokumentu',design:'Design',meta:'Meta Data',chooseColor:'Choose',other:'<iný>',docTitle:'Titulok',charset:'Kódová stránka',charsetOther:'Iná kódová stránka',charsetASCII:'ASCII',charsetCE:'Stredoeurópske',charsetCT:'Čínština tradičná (Big5)',charsetCR:'Cyrillika',charsetGR:'Gréčtina',charsetJP:'Japončina',charsetKR:'Korejčina',charsetTR:'Turečtina',charsetUN:'Unicode (UTF-8)',charsetWE:'Západná európa',docType:'Typ záhlavia dokumentu',docTypeOther:'Iný typ záhlavia dokumentu',xhtmlDec:'Obsahuje deklarácie XHTML',bgColor:'Farba pozadia',bgImage:'URL adresa obrázku na pozadí',bgFixed:'Fixné pozadie',txtColor:'Farba textu',margin:'Okraje stránky',marginTop:'Horný',marginLeft:'Ľavý',marginRight:'Pravý',marginBottom:'Dolný',metaKeywords:'Kľúčové slová pre indexovanie (oddelené čiarkou)',metaDescription:'Popis stránky',metaAuthor:'Autor',metaCopyright:'Autorské práva',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.sk={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Zdroj',newPage:'Nová stránka',save:'Uložiť',preview:'Náhľad',cut:'Vystrihnúť',copy:'Kopírovať',paste:'Vložiť',print:'Tlač',underline:'Podčiarknuté',bold:'Tučné',italic:'Kurzíva',selectAll:'Vybrať všetko',removeFormat:'Odstrániť formátovanie',strike:'Prečiarknuté',subscript:'Dolný index',superscript:'Horný index',horizontalrule:'Vložiť vodorovnú čiaru',pagebreak:'Vložiť oddeľovač stránky',pagebreakAlt:'Zalomenie strany',unlink:'Odstrániť odkaz',undo:'Späť',redo:'Znovu',common:{browseServer:'Prechádzať server',url:'URL',protocol:'Protokol',upload:'Odoslať',uploadSubmit:'Odoslať na server',image:'Obrázok',flash:'Flash',form:'Formulár',checkbox:'Zaškrtávacie políčko',radio:'Prepínač',textField:'Textové pole',textarea:'Textová oblasť',hiddenField:'Skryté pole',button:'Tlačidlo',select:'Rozbaľovací zoznam',imageButton:'Obrázkové tlačidlo',notSet:'<nenastavené>',id:'Id',name:'Meno',langDir:'Orientácia jazyka',langDirLtr:'Zľava doprava (LTR)',langDirRtl:'Sprava doľava (RTL)',langCode:'Kód jazyka',longDescr:'Dlhý popis URL',cssClass:'Trieda štýlu',advisoryTitle:'Pomocný titulok',cssStyle:'Štýl',ok:'OK',cancel:'Zrušiť',close:'Zatvorit',preview:'Náhľad',generalTab:'Hlavné',advancedTab:'Rozšírené',validateNumberFailed:'Hodnota nieje číslo.',confirmNewPage:'Prajete si načítat novú stránku? Všetky neuložené zmeny budú stratené. ',confirmCancel:'Niektore možnosti boli zmenené. Naozaj chcete zavrieť okno?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Šírka',height:'Výška',align:'Zarovnanie',alignLeft:'Vľavo',alignRight:'Vpravo',alignCenter:'Na stred',alignTop:'Nahor',alignMiddle:'Na stred',alignBottom:'Dole',invalidHeight:'Výška musí byť číslo.',invalidWidth:'Šírka musí byť číslo.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Vložiť špeciálne znaky',title:'Výber špeciálneho znaku',options:'Možnosti špecíalneho znaku'},link:{toolbar:'Vložiť/zmeniť odkaz',other:'<iný>',menu:'Zmeniť odkaz',title:'Odkaz',info:'Informácie o odkaze',target:'Cieľ',upload:'Odoslať',advanced:'Rozšírené',type:'Typ odkazu',toUrl:'URL',toAnchor:'Kotva v tejto stránke',toEmail:'E-Mail',targetFrame:'<rámec>',targetPopup:'<vyskakovacie okno>',targetFrameName:'Meno rámu cieľa',targetPopupName:'Názov vyskakovacieho okna',popupFeatures:'Vlastnosti vyskakovacieho okna',popupResizable:'Meniteľná veľkosť',popupStatusBar:'Stavový riadok',popupLocationBar:'Panel umiestnenia',popupToolbar:'Panel nástrojov',popupMenuBar:'Panel ponuky',popupFullScreen:'Celá obrazovka (IE)',popupScrollBars:'Posuvníky',popupDependent:'Závislosť (Netscape)',popupLeft:'Ľavý okraj',popupTop:'Horný okraj',id:'Id',langDir:'Orientácia jazyka',langDirLTR:'Zľava doprava (LTR)',langDirRTL:'Sprava doľava (RTL)',acccessKey:'Prístupový kľúč',name:'Meno',langCode:'Orientácia jazyka',tabIndex:'Poradie prvku',advisoryTitle:'Pomocný titulok',advisoryContentType:'Pomocný typ obsahu',cssClasses:'Trieda štýlu',charset:'Priradená znaková sada',styles:'Štýl',rel:'Relationship',selectAnchor:'Vybrať kotvu',anchorName:'Podľa mena kotvy',anchorId:'Podľa Id objektu',emailAddress:'E-Mailová adresa',emailSubject:'Predmet správy',emailBody:'Telo správy',noAnchors:'(V stránke nie je definovaná žiadna kotva)',noUrl:'Zadajte prosím URL odkazu',noEmail:'Zadajte prosím e-mailovú adresu'},anchor:{toolbar:'Vložiť/zmeniť kotvu',menu:'Vlastnosti kotvy',title:'Vlastnosti kotvy',name:'Meno kotvy',errorName:'Zadajte prosím meno kotvy',remove:'Remove Anchor'},list:{numberedTitle:'Vlastnosti číselného zoznamu',bulletedTitle:'Bulleted List Properties',type:'Druh',start:'Začiatok',validateStartNumber:'Začiatočné číslo číselného zoznamu musí byť celé číslo.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Nájsť a nahradiť',find:'Hľadať',replace:'Nahradiť',findWhat:'Čo hľadať:',replaceWith:'Čím nahradiť:',notFoundMsg:'Hľadaný text nebol nájdený.',findOptions:'Find Options',matchCase:'Rozlišovať malé/veľké písmená',matchWord:'Len celé slová',matchCyclic:'Match cyclic',replaceAll:'Nahradiť všetko',replaceSuccessMsg:'%1 výskyt(ov) nahradených.'},table:{toolbar:'Tabuľka',title:'Vlastnosti tabuľky',menu:'Vlastnosti tabuľky',deleteTable:'Vymazať tabuľku',rows:'Riadky',columns:'Stĺpce',border:'Ohraničenie',widthPx:'pixelov',widthPc:'percent',widthUnit:'width unit',cellSpace:'Vzdialenosť buniek',cellPad:'Odsadenie obsahu',caption:'Popis',summary:'Prehľad',headers:'Hlavička',headersNone:'Žiadne',headersColumn:'Prvý stĺpec',headersRow:'Prvý riadok',headersBoth:'Obe',invalidRows:'Počet riadkov musí byť číslo väčšie ako 0.',invalidCols:'Počet stĺpcov musí byť číslo väčšie ako 0.',invalidBorder:'Širka rámu musí byť celé číslo.',invalidWidth:'Širka tabuľky musí byť číslo.',invalidHeight:'Výška tabuľky musí byť číslo.',invalidCellSpacing:'Medzera mädzi bunkami (spacing) musí byť číslo.',invalidCellPadding:'Odsadenie v bunkách (padding) musí byť číslo.',cell:{menu:'Bunka',insertBefore:'Vložiť bunku pred',insertAfter:'Vložiť bunku za',deleteCell:'Vymazať bunky',merge:'Zlúčiť bunky',mergeRight:'Zlúčiť doprava',mergeDown:'Zlúčiť dole',splitHorizontal:'Rozdeliť bunky horizontálne',splitVertical:'Rozdeliť bunky vertikálne',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Riadok',insertBefore:'Vložiť riadok za',insertAfter:'Vložiť riadok pred',deleteRow:'Vymazať riadok'},column:{menu:'Stĺpec',insertBefore:'Vložiť stĺpec za',insertAfter:'Vložiť stĺpec pred',deleteColumn:'Zmazať stĺpec'}},button:{title:'Vlastnosti tlačidla',text:'Text',type:'Typ',typeBtn:'Tlačidlo',typeSbm:'Odoslať',typeRst:'Vymazať'},checkboxAndRadio:{checkboxTitle:'Vlastnosti zaškrtávacieho políčka',radioTitle:'Vlastnosti prepínača',value:'Hodnota',selected:'Vybrané'},form:{title:'Vlastnosti formulára',menu:'Vlastnosti formulára',action:'Akcie',method:'Metóda',encoding:'Kódovanie'},select:{title:'Vlastnosti rozbaľovacieho zoznamu',selectInfo:'Info',opAvail:'Dostupné možnosti',value:'Hodnota',size:'Veľkosť',lines:'riadkov',chkMulti:'Povoliť viacnásobný výber',opText:'Text',opValue:'Hodnota',btnAdd:'Pridať',btnModify:'Zmeniť',btnUp:'Hore',btnDown:'Dole',btnSetValue:'Nastaviť ako vybranú hodnotu',btnDelete:'Zmazať'},textarea:{title:'Vlastnosti textovej oblasti',cols:'Stĺpce',rows:'Riadky'},textfield:{title:'Vlastnosti textového poľa',name:'Názov',value:'Hodnota',charWidth:'Šírka pola (znakov)',maxChars:'Maximálny počet znakov',type:'Typ',typeText:'Text',typePass:'Heslo'},hidden:{title:'Vlastnosti skrytého poľa',name:'Názov',value:'Hodnota'},image:{title:'Vlastnosti obrázku',titleButton:'Vlastnosti obrázkového tlačidla',menu:'Vlastnosti obrázku',infoTab:'Informácie o obrázku',btnUpload:'Odoslať na server',upload:'Odoslať',alt:'Alternatívny text',lockRatio:'Zámok',resetSize:'Pôvodná veľkosť',border:'Okraje',hSpace:'H-medzera',vSpace:'V-medzera',alertUrl:'Zadajte prosím URL obrázku',linkTab:'Odkaz',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Vlastnosti Flashu',propertiesTab:'Properties',title:'Vlastnosti Flashu',chkPlay:'Automatické prehrávanie',chkLoop:'Opakovanie',chkMenu:'Povoliť Flash Menu',chkFull:'Allow Fullscreen',scale:'Mierka',scaleAll:'Zobraziť mierku',scaleNoBorder:'Bez okrajov',scaleFit:'Roztiahnuť na celé',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Úplne dole',alignAbsMiddle:'Do stredu',alignBaseline:'Na základňu',alignTextTop:'Na horný okraj textu',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Farba pozadia',hSpace:'H-medzera',vSpace:'V-medzera',validateSrc:'Zadajte prosím URL odkazu',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Kontrola pravopisu',title:'Spell Check',notAvailable:'Služba práve nieje dostupná.',errorLoading:'Chyba pri načítaní slovníka z adresy: %s.',notInDic:'Nie je v slovníku',changeTo:'Zmeniť na',btnIgnore:'Ignorovať',btnIgnoreAll:'Ignorovať všetko',btnReplace:'Prepísat',btnReplaceAll:'Prepísat všetko',btnUndo:'Späť',noSuggestions:'- Žiadny návrh -',progress:'Prebieha kontrola pravopisu...',noMispell:'Kontrola pravopisu dokončená: bez chýb',noChanges:'Kontrola pravopisu dokončená: žiadne slová nezmenené',oneChange:'Kontrola pravopisu dokončená: zmenené jedno slovo',manyChanges:'Kontrola pravopisu dokončená: zmenených %1 slov',ieSpellDownload:'Kontrola pravopisu nie je naištalovaná. Chcete ju hneď stiahnuť?'},smiley:{toolbar:'Smajlíky',title:'Vkladanie smajlíkov',options:'Možnosti smajlíkov'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Číslovanie',bulletedlist:'Odrážky',indent:'Zväčšiť odsadenie',outdent:'Zmenšiť odsadenie',justify:{left:'Zarovnať vľavo',center:'Zarovnať na stred',right:'Zarovnať vpravo',block:'Zarovnať do bloku'},blockquote:'Citácia',clipboard:{title:'Vložiť',cutError:'Bezpečnostné nastavenia Vášho prehliadača nedovoľujú editoru spustiť funkciu pre vystrihnutie zvoleného textu do schránky. Prosím vystrihnite zvolený text do schránky pomocou klávesnice (Ctrl/Cmd+X).',copyError:'Bezpečnostné nastavenia Vášho prehliadača nedovoľujú editoru spustiť funkciu pre kopírovanie zvoleného textu do schránky. Prosím skopírujte zvolený text do schránky pomocou klávesnice (Ctrl/Cmd+C).',pasteMsg:'Prosím vložte nasledovný rámček použitím klávesnice (<STRONG>Ctrl/Cmd+V</STRONG>) a stlačte <STRONG>OK</STRONG>.',securityMsg:'Bezpečnostné nastavenia Vášho prehliadača nedovoľujú editoru pristupovať priamo k datám v schránke. Musíte ich vložiť znovu do tohto okna.',pasteArea:'Vložiť pole'},pastefromword:{confirmCleanup:'Vkladaný text vyzerá byť skopírovaný z Wordu. Chcete ho automaticky vyčistiť pred vkladaním?',toolbar:'Vložiť z Wordu',title:'Vložiť z Wordu',error:'Nastala chyba pri čistení údajov. Nie je možné vyčistiť vložené údaje.'},pasteText:{button:'Vložiť ako čistý text',title:'Vložiť ako čistý text'},templates:{button:'Šablóny',title:'Šablóny obsahu',options:'Vlastnosti šablóny',insertOption:'Nahradiť aktuálny obsah',selectPromptMsg:'Prosím vyberte šablóny na otvorenie v editore<br>(súšasný obsah bude stratený):',emptyListMsg:'(žiadne šablóny nenájdené)'},showBlocks:'Ukázať bloky',stylesCombo:{label:'Štýl',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Formát',panelTitle:'Formát',tag_p:'Normálny',tag_pre:'Formátovaný',tag_address:'Adresa',tag_h1:'Nadpis 1',tag_h2:'Nadpis 2',tag_h3:'Nadpis 3',tag_h4:'Nadpis 4',tag_h5:'Nadpis 5',tag_h6:'Nadpis 6',tag_div:'Odsek (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame - vlastnosti',toolbar:'IFrame',noUrl:'Vložte URL pre iframe',scrolling:'Povoliť skrolovanie',border:'Zobraziť orámovanie'},font:{label:'Písmo',voiceLabel:'Font',panelTitle:'Písmo'},fontSize:{label:'Veľkosť',voiceLabel:'Veľkosť písma',panelTitle:'Veľkosť'},colorButton:{textColorTitle:'Farba textu',bgColorTitle:'Farba pozadia',panelTitle:'Farby',auto:'Automaticky',more:'Viac farieb...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximalizovať',minimize:'Minimalizovať',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Vlastnosti dokumentu',title:'Vlastnosti dokumentu',design:'Design',meta:'Meta Data',chooseColor:'Choose',other:'<iný>',docTitle:'Titulok',charset:'Kódová stránka',charsetOther:'Iná kódová stránka',charsetASCII:'ASCII',charsetCE:'Stredoeurópske',charsetCT:'Čínština tradičná (Big5)',charsetCR:'Cyrillika',charsetGR:'Gréčtina',charsetJP:'Japončina',charsetKR:'Korejčina',charsetTR:'Turečtina',charsetUN:'Unicode (UTF-8)',charsetWE:'Západná európa',docType:'Typ záhlavia dokumentu',docTypeOther:'Iný typ záhlavia dokumentu',xhtmlDec:'Obsahuje deklarácie XHTML',bgColor:'Farba pozadia',bgImage:'URL adresa obrázku na pozadí',bgFixed:'Fixné pozadie',txtColor:'Farba textu',margin:'Okraje stránky',marginTop:'Horný',marginLeft:'Ľavý',marginRight:'Pravý',marginBottom:'Dolný',metaKeywords:'Kľúčové slová pre indexovanie (oddelené čiarkou)',metaDescription:'Popis stránky',metaAuthor:'Autor',metaCopyright:'Autorské práva',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/sl.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/sl.js
index 5d7f491..5cedce0 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/sl.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/sl.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.sl={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Izvorna koda',newPage:'Nova stran',save:'Shrani',preview:'Predogled',cut:'Izreži',copy:'Kopiraj',paste:'Prilepi',print:'Natisni',underline:'Podčrtano',bold:'Krepko',italic:'Ležeče',selectAll:'Izberi vse',removeFormat:'Odstrani oblikovanje',strike:'Prečrtano',subscript:'Podpisano',superscript:'Nadpisano',horizontalrule:'Vstavi vodoravno črto',pagebreak:'Vstavi prelom strani',pagebreakAlt:'Page Break',unlink:'Odstrani povezavo',undo:'Razveljavi',redo:'Ponovi',common:{browseServer:'Prebrskaj na strežniku',url:'URL',protocol:'Protokol',upload:'Prenesi',uploadSubmit:'Pošlji na strežnik',image:'Slika',flash:'Flash',form:'Obrazec',checkbox:'Potrditveno polje',radio:'Izbirno polje',textField:'Vnosno polje',textarea:'Vnosno območje',hiddenField:'Skrito polje',button:'Gumb',select:'Spustni seznam',imageButton:'Gumb s sliko',notSet:'<ni postavljen>',id:'Id',name:'Ime',langDir:'Smer jezika',langDirLtr:'Od leve proti desni (LTR)',langDirRtl:'Od desne proti levi (RTL)',langCode:'Oznaka jezika',longDescr:'Dolg opis URL-ja',cssClass:'Razred stilne predloge',advisoryTitle:'Predlagani naslov',cssStyle:'Slog',ok:'V redu',cancel:'Prekliči',close:'Close',preview:'Preview',generalTab:'Splošno',advancedTab:'Napredno',validateNumberFailed:'Ta vrednost ni število.',confirmNewPage:'Vse neshranjene spremembe te vsebine bodo izgubljene. Ali gotovo želiš naložiti novo stran?',confirmCancel:'Nekaj možnosti je bilo spremenjenih. Ali gotovo želiš zapreti okno?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Širina',height:'Višina',align:'Poravnava',alignLeft:'Levo',alignRight:'Desno',alignCenter:'Sredinsko',alignTop:'Na vrh',alignMiddle:'V sredino',alignBottom:'Na dno',invalidHeight:'Višina mora biti število.',invalidWidth:'Širina mora biti število.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, nedosegljiv</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Vstavi posebni znak',title:'Izberi posebni znak',options:'Special Character Options'},link:{toolbar:'Vstavi/uredi povezavo',other:'<drug>',menu:'Uredi povezavo',title:'Povezava',info:'Podatki o povezavi',target:'Cilj',upload:'Prenesi',advanced:'Napredno',type:'Vrsta povezave',toUrl:'URL',toAnchor:'Zaznamek na tej strani',toEmail:'Elektronski naslov',targetFrame:'<okvir>',targetPopup:'<pojavno okno>',targetFrameName:'Ime ciljnega okvirja',targetPopupName:'Ime pojavnega okna',popupFeatures:'Značilnosti pojavnega okna',popupResizable:'Spremenljive velikosti',popupStatusBar:'Vrstica stanja',popupLocationBar:'Naslovna vrstica',popupToolbar:'Orodna vrstica',popupMenuBar:'Menijska vrstica',popupFullScreen:'Celozaslonska slika (IE)',popupScrollBars:'Drsniki',popupDependent:'Podokno (Netscape)',popupLeft:'Lega levo',popupTop:'Lega na vrhu',id:'Id',langDir:'Smer jezika',langDirLTR:'Od leve proti desni (LTR)',langDirRTL:'Od desne proti levi (RTL)',acccessKey:'Vstopno geslo',name:'Ime',langCode:'Smer jezika',tabIndex:'Številka tabulatorja',advisoryTitle:'Predlagani naslov',advisoryContentType:'Predlagani tip vsebine (content-type)',cssClasses:'Razred stilne predloge',charset:'Kodna tabela povezanega vira',styles:'Slog',rel:'Relationship',selectAnchor:'Izberi zaznamek',anchorName:'Po imenu zaznamka',anchorId:'Po ID-ju elementa',emailAddress:'Elektronski naslov',emailSubject:'Predmet sporočila',emailBody:'Vsebina sporočila',noAnchors:'(V tem dokumentu ni zaznamkov)',noUrl:'Vnesite URL povezave',noEmail:'Vnesite elektronski naslov'},anchor:{toolbar:'Vstavi/uredi zaznamek',menu:'Lastnosti zaznamka',title:'Lastnosti zaznamka',name:'Ime zaznamka',errorName:'Prosim vnesite ime zaznamka',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Najdi in zamenjaj',find:'Najdi',replace:'Zamenjaj',findWhat:'Najdi:',replaceWith:'Zamenjaj z:',notFoundMsg:'Navedeno besedilo ni bilo najdeno.',findOptions:'Find Options',matchCase:'Razlikuj velike in male črke',matchWord:'Samo cele besede',matchCyclic:'Primerjaj znake v cirilici',replaceAll:'Zamenjaj vse',replaceSuccessMsg:'%1 pojavitev je bilo zamenjano.'},table:{toolbar:'Tabela',title:'Lastnosti tabele',menu:'Lastnosti tabele',deleteTable:'Izbriši tabelo',rows:'Vrstice',columns:'Stolpci',border:'Velikost obrobe',widthPx:'pik',widthPc:'procentov',widthUnit:'width unit',cellSpace:'Razmik med celicami',cellPad:'Polnilo med celicami',caption:'Naslov',summary:'Povzetek',headers:'Glave',headersNone:'Brez',headersColumn:'Prvi stolpec',headersRow:'Prva vrstica',headersBoth:'Oboje',invalidRows:'Število vrstic mora biti večje od 0.',invalidCols:'Število stolpcev mora biti večje od 0.',invalidBorder:'Širina obrobe mora biti število.',invalidWidth:'Širina tabele mora biti število.',invalidHeight:'Višina tabele mora biti število.',invalidCellSpacing:'Razmik med celicami mora biti število.',invalidCellPadding:'Zamik celic mora biti število',cell:{menu:'Celica',insertBefore:'Vstavi celico pred',insertAfter:'Vstavi celico za',deleteCell:'Izbriši celice',merge:'Združi celice',mergeRight:'Združi desno',mergeDown:'Druži navzdol',splitHorizontal:'Razdeli celico vodoravno',splitVertical:'Razdeli celico navpično',title:'Lastnosti celice',cellType:'Vrsta celice',rowSpan:'Razpon vrstic',colSpan:'Razpon stolpcev',wordWrap:'Prelom besedila',hAlign:'Vodoravna poravnava',vAlign:'Navpična poravnava',alignBaseline:'Osnovnica',bgColor:'Barva ozadja',borderColor:'Barva obrobe',data:'Podatki',header:'Glava',yes:'Da',no:'Ne',invalidWidth:'Širina celice mora biti število.',invalidHeight:'Višina celice mora biti število.',invalidRowSpan:'Razpon vrstic mora biti celo število.',invalidColSpan:'Razpon stolpcev mora biti celo število.',chooseColor:'Izberi'},row:{menu:'Vrstica',insertBefore:'Vstavi vrstico pred',insertAfter:'Vstavi vrstico za',deleteRow:'Izbriši vrstice'},column:{menu:'Stolpec',insertBefore:'Vstavi stolpec pred',insertAfter:'Vstavi stolpec za',deleteColumn:'Izbriši stolpce'}},button:{title:'Lastnosti gumba',text:'Besedilo (Vrednost)',type:'Tip',typeBtn:'Gumb',typeSbm:'Potrdi',typeRst:'Ponastavi'},checkboxAndRadio:{checkboxTitle:'Lastnosti potrditvenega polja',radioTitle:'Lastnosti izbirnega polja',value:'Vrednost',selected:'Izbrano'},form:{title:'Lastnosti obrazca',menu:'Lastnosti obrazca',action:'Akcija',method:'Metoda',encoding:'Kodiranje znakov'},select:{title:'Lastnosti spustnega seznama',selectInfo:'Podatki',opAvail:'Razpoložljive izbire',value:'Vrednost',size:'Velikost',lines:'vrstic',chkMulti:'Dovoli izbor večih vrstic',opText:'Besedilo',opValue:'Vrednost',btnAdd:'Dodaj',btnModify:'Spremeni',btnUp:'Gor',btnDown:'Dol',btnSetValue:'Postavi kot privzeto izbiro',btnDelete:'Izbriši'},textarea:{title:'Lastnosti vnosnega območja',cols:'Stolpcev',rows:'Vrstic'},textfield:{title:'Lastnosti vnosnega polja',name:'Ime',value:'Vrednost',charWidth:'Dolžina',maxChars:'Največje število znakov',type:'Tip',typeText:'Besedilo',typePass:'Geslo'},hidden:{title:'Lastnosti skritega polja',name:'Ime',value:'Vrednost'},image:{title:'Lastnosti slike',titleButton:'Lastnosti gumba s sliko',menu:'Lastnosti slike',infoTab:'Podatki o sliki',btnUpload:'Pošlji na strežnik',upload:'Pošlji',alt:'Nadomestno besedilo',lockRatio:'Zakleni razmerje',resetSize:'Ponastavi velikost',border:'Obroba',hSpace:'Vodoravni razmik',vSpace:'Navpični razmik',alertUrl:'Vnesite URL slike',linkTab:'Povezava',button2Img:'Želiš pretvoriti izbrani gumb s sliko v preprosto sliko?',img2Button:'Želiš pretvoriti izbrano sliko v gumb s sliko?',urlMissing:'Manjka vir (URL) slike.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Lastnosti Flash',propertiesTab:'Lastnosti',title:'Lastnosti Flash',chkPlay:'Samodejno predvajaj',chkLoop:'Ponavljanje',chkMenu:'Omogoči Flash Meni',chkFull:'Dovoli celozaslonski način',scale:'Povečava',scaleAll:'Pokaži vse',scaleNoBorder:'Brez obrobe',scaleFit:'Natančno prileganje',access:'Dostop skript',accessAlways:'Vedno',accessSameDomain:'Samo ista domena',accessNever:'Nikoli',alignAbsBottom:'Popolnoma na dno',alignAbsMiddle:'Popolnoma v sredino',alignBaseline:'Na osnovno črto',alignTextTop:'Besedilo na vrh',quality:'Kakovost',qualityBest:'Najvišja',qualityHigh:'Visoka',qualityAutoHigh:'Samodejno visoka',qualityMedium:'Srednja',qualityAutoLow:'Samodejno nizka',qualityLow:'Nizka',windowModeWindow:'Okno',windowModeOpaque:'Motno',windowModeTransparent:'Prosojno',windowMode:'Vrsta okna',flashvars:'Spremenljivke za Flash',bgcolor:'Barva ozadja',hSpace:'Vodoravni razmik',vSpace:'Navpični razmik',validateSrc:'Vnesite URL povezave',validateHSpace:'Vodoravni razmik mora biti število.',validateVSpace:'Navpični razmik mora biti število.'},spellCheck:{toolbar:'Preveri črkovanje',title:'Črkovalnik',notAvailable:'Oprostite, storitev trenutno ni dosegljiva.',errorLoading:'Napaka pri nalaganju storitve programa na naslovu %s.',notInDic:'Ni v slovarju',changeTo:'Spremeni v',btnIgnore:'Prezri',btnIgnoreAll:'Prezri vse',btnReplace:'Zamenjaj',btnReplaceAll:'Zamenjaj vse',btnUndo:'Razveljavi',noSuggestions:'- Ni predlogov -',progress:'Preverjanje črkovanja se izvaja...',noMispell:'Črkovanje je končano: Brez napak',noChanges:'Črkovanje je končano: Nobena beseda ni bila spremenjena',oneChange:'Črkovanje je končano: Spremenjena je bila ena beseda',manyChanges:'Črkovanje je končano: Spremenjenih je bilo %1 besed',ieSpellDownload:'Črkovalnik ni nameščen. Ali ga želite prenesti sedaj?'},smiley:{toolbar:'Smeško',title:'Vstavi smeška',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Oštevilčen seznam',bulletedlist:'Označen seznam',indent:'Povečaj zamik',outdent:'Zmanjšaj zamik',justify:{left:'Leva poravnava',center:'Sredinska poravnava',right:'Desna poravnava',block:'Obojestranska poravnava'},blockquote:'Citat',clipboard:{title:'Prilepi',cutError:'Varnostne nastavitve brskalnika ne dopuščajo samodejnega izrezovanja. Uporabite kombinacijo tipk na tipkovnici (Ctrl/Cmd+X).',copyError:'Varnostne nastavitve brskalnika ne dopuščajo samodejnega kopiranja. Uporabite kombinacijo tipk na tipkovnici (Ctrl/Cmd+C).',pasteMsg:'Prosim prilepite v sleči okvir s pomočjo tipkovnice (<STRONG>Ctrl/Cmd+V</STRONG>) in pritisnite <STRONG>V redu</STRONG>.',securityMsg:'Zaradi varnostnih nastavitev vašega brskalnika urejevalnik ne more neposredno dostopati do odložišča. Vsebino odložišča ponovno prilepite v to okno.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Prilepi iz Worda',title:'Prilepi iz Worda',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Prilepi kot golo besedilo',title:'Prilepi kot golo besedilo'},templates:{button:'Predloge',title:'Vsebinske predloge',options:'Template Options',insertOption:'Zamenjaj trenutno vsebino',selectPromptMsg:'Izberite predlogo, ki jo želite odpreti v urejevalniku<br>(trenutna vsebina bo izgubljena):',emptyListMsg:'(Ni pripravljenih predlog)'},showBlocks:'Prikaži ograde',stylesCombo:{label:'Slog',panelTitle:'Formatting Styles',panelTitle1:'Slogi odstavkov',panelTitle2:'Slogi besedila',panelTitle3:'Slogi objektov'},format:{label:'Oblika',panelTitle:'Oblika',tag_p:'Navaden',tag_pre:'Oblikovan',tag_address:'Napis',tag_h1:'Naslov 1',tag_h2:'Naslov 2',tag_h3:'Naslov 3',tag_h4:'Naslov 4',tag_h5:'Naslov 5',tag_h6:'Naslov 6',tag_div:'Navaden (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Pisava',voiceLabel:'Pisava',panelTitle:'Pisava'},fontSize:{label:'Velikost',voiceLabel:'Velikost',panelTitle:'Velikost'},colorButton:{textColorTitle:'Barva besedila',bgColorTitle:'Barva ozadja',panelTitle:'Colors',auto:'Samodejno',more:'Več barv...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Črkovanje med tipkanjem',opera_title:'Not supported by Opera',enable:'Omogoči SCAYT',disable:'Onemogoči SCAYT',about:'O storitvi SCAYT',toggle:'Preklopi SCAYT',options:'Možnosti',langs:'Jeziki',moreSuggestions:'Več predlogov',ignore:'Prezri',ignoreAll:'Prezri vse',addWord:'Dodaj besedo',emptyDic:'Ime slovarja ne more biti prazno.',optionsTab:'Možnosti',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Jeziki',dictionariesTab:'Slovarji',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'O storitvi'},about:{title:'O programu CKEditor',dlgTitle:'O programu CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'Za informacijo o licenci prostim obiščite našo spletno stran:',copy:'Copyright © $1. Vse pravice pridržane.'},maximize:'Maksimiraj',minimize:'Minimiraj',fakeobjects:{anchor:'Sidro',flash:'Flash animacija',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Neznan objekt'},resize:'Potegni za spremembo velikosti',colordialog:{title:'Izberi barvo',options:'Color Options',highlight:'Poudarjeno',selected:'Izbrano',clear:'Počisti'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Lastnosti dokumenta',title:'Lastnosti dokumenta',design:'Design',meta:'Meta podatki',chooseColor:'Izberi',other:'<drug>',docTitle:'Naslov strani',charset:'Kodna tabela',charsetOther:'Druga kodna tabela',charsetASCII:'ASCII',charsetCE:'Srednjeevropsko',charsetCT:'Tradicionalno Kitajsko (Big5)',charsetCR:'Cirilica',charsetGR:'Grško',charsetJP:'Japonsko',charsetKR:'Korejsko',charsetTR:'Turško',charsetUN:'Unicode (UTF-8)',charsetWE:'Zahodnoevropsko',docType:'Glava tipa dokumenta',docTypeOther:'Druga glava tipa dokumenta',xhtmlDec:'Vstavi XHTML deklaracije',bgColor:'Barva ozadja',bgImage:'URL slike za ozadje',bgFixed:'Nepremično ozadje',txtColor:'Barva besedila',margin:'Zamiki strani',marginTop:'Na vrhu',marginLeft:'Levo',marginRight:'Desno',marginBottom:'Spodaj',metaKeywords:'Ključne besede (ločene z vejicami)',metaDescription:'Opis strani',metaAuthor:'Avtor',metaCopyright:'Avtorske pravice',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.sl={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Izvorna koda',newPage:'Nova stran',save:'Shrani',preview:'Predogled',cut:'Izreži',copy:'Kopiraj',paste:'Prilepi',print:'Natisni',underline:'Podčrtano',bold:'Krepko',italic:'Ležeče',selectAll:'Izberi vse',removeFormat:'Odstrani oblikovanje',strike:'Prečrtano',subscript:'Podpisano',superscript:'Nadpisano',horizontalrule:'Vstavi vodoravno črto',pagebreak:'Vstavi prelom strani',pagebreakAlt:'Page Break',unlink:'Odstrani povezavo',undo:'Razveljavi',redo:'Ponovi',common:{browseServer:'Prebrskaj na strežniku',url:'URL',protocol:'Protokol',upload:'Prenesi',uploadSubmit:'Pošlji na strežnik',image:'Slika',flash:'Flash',form:'Obrazec',checkbox:'Potrditveno polje',radio:'Izbirno polje',textField:'Vnosno polje',textarea:'Vnosno območje',hiddenField:'Skrito polje',button:'Gumb',select:'Spustni seznam',imageButton:'Gumb s sliko',notSet:'<ni postavljen>',id:'Id',name:'Ime',langDir:'Smer jezika',langDirLtr:'Od leve proti desni (LTR)',langDirRtl:'Od desne proti levi (RTL)',langCode:'Oznaka jezika',longDescr:'Dolg opis URL-ja',cssClass:'Razred stilne predloge',advisoryTitle:'Predlagani naslov',cssStyle:'Slog',ok:'V redu',cancel:'Prekliči',close:'Close',preview:'Preview',generalTab:'Splošno',advancedTab:'Napredno',validateNumberFailed:'Ta vrednost ni število.',confirmNewPage:'Vse neshranjene spremembe te vsebine bodo izgubljene. Ali gotovo želiš naložiti novo stran?',confirmCancel:'Nekaj možnosti je bilo spremenjenih. Ali gotovo želiš zapreti okno?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Širina',height:'Višina',align:'Poravnava',alignLeft:'Levo',alignRight:'Desno',alignCenter:'Sredinsko',alignTop:'Na vrh',alignMiddle:'V sredino',alignBottom:'Na dno',invalidHeight:'Višina mora biti število.',invalidWidth:'Širina mora biti število.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, nedosegljiv</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Vstavi posebni znak',title:'Izberi posebni znak',options:'Special Character Options'},link:{toolbar:'Vstavi/uredi povezavo',other:'<drug>',menu:'Uredi povezavo',title:'Povezava',info:'Podatki o povezavi',target:'Cilj',upload:'Prenesi',advanced:'Napredno',type:'Vrsta povezave',toUrl:'URL',toAnchor:'Zaznamek na tej strani',toEmail:'Elektronski naslov',targetFrame:'<okvir>',targetPopup:'<pojavno okno>',targetFrameName:'Ime ciljnega okvirja',targetPopupName:'Ime pojavnega okna',popupFeatures:'Značilnosti pojavnega okna',popupResizable:'Spremenljive velikosti',popupStatusBar:'Vrstica stanja',popupLocationBar:'Naslovna vrstica',popupToolbar:'Orodna vrstica',popupMenuBar:'Menijska vrstica',popupFullScreen:'Celozaslonska slika (IE)',popupScrollBars:'Drsniki',popupDependent:'Podokno (Netscape)',popupLeft:'Lega levo',popupTop:'Lega na vrhu',id:'Id',langDir:'Smer jezika',langDirLTR:'Od leve proti desni (LTR)',langDirRTL:'Od desne proti levi (RTL)',acccessKey:'Vstopno geslo',name:'Ime',langCode:'Smer jezika',tabIndex:'Številka tabulatorja',advisoryTitle:'Predlagani naslov',advisoryContentType:'Predlagani tip vsebine (content-type)',cssClasses:'Razred stilne predloge',charset:'Kodna tabela povezanega vira',styles:'Slog',rel:'Relationship',selectAnchor:'Izberi zaznamek',anchorName:'Po imenu zaznamka',anchorId:'Po ID-ju elementa',emailAddress:'Elektronski naslov',emailSubject:'Predmet sporočila',emailBody:'Vsebina sporočila',noAnchors:'(V tem dokumentu ni zaznamkov)',noUrl:'Vnesite URL povezave',noEmail:'Vnesite elektronski naslov'},anchor:{toolbar:'Vstavi/uredi zaznamek',menu:'Lastnosti zaznamka',title:'Lastnosti zaznamka',name:'Ime zaznamka',errorName:'Prosim vnesite ime zaznamka',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Najdi in zamenjaj',find:'Najdi',replace:'Zamenjaj',findWhat:'Najdi:',replaceWith:'Zamenjaj z:',notFoundMsg:'Navedeno besedilo ni bilo najdeno.',findOptions:'Find Options',matchCase:'Razlikuj velike in male črke',matchWord:'Samo cele besede',matchCyclic:'Primerjaj znake v cirilici',replaceAll:'Zamenjaj vse',replaceSuccessMsg:'%1 pojavitev je bilo zamenjano.'},table:{toolbar:'Tabela',title:'Lastnosti tabele',menu:'Lastnosti tabele',deleteTable:'Izbriši tabelo',rows:'Vrstice',columns:'Stolpci',border:'Velikost obrobe',widthPx:'pik',widthPc:'procentov',widthUnit:'width unit',cellSpace:'Razmik med celicami',cellPad:'Polnilo med celicami',caption:'Naslov',summary:'Povzetek',headers:'Glave',headersNone:'Brez',headersColumn:'Prvi stolpec',headersRow:'Prva vrstica',headersBoth:'Oboje',invalidRows:'Število vrstic mora biti večje od 0.',invalidCols:'Število stolpcev mora biti večje od 0.',invalidBorder:'Širina obrobe mora biti število.',invalidWidth:'Širina tabele mora biti število.',invalidHeight:'Višina tabele mora biti število.',invalidCellSpacing:'Razmik med celicami mora biti število.',invalidCellPadding:'Zamik celic mora biti število',cell:{menu:'Celica',insertBefore:'Vstavi celico pred',insertAfter:'Vstavi celico za',deleteCell:'Izbriši celice',merge:'Združi celice',mergeRight:'Združi desno',mergeDown:'Druži navzdol',splitHorizontal:'Razdeli celico vodoravno',splitVertical:'Razdeli celico navpično',title:'Lastnosti celice',cellType:'Vrsta celice',rowSpan:'Razpon vrstic',colSpan:'Razpon stolpcev',wordWrap:'Prelom besedila',hAlign:'Vodoravna poravnava',vAlign:'Navpična poravnava',alignBaseline:'Osnovnica',bgColor:'Barva ozadja',borderColor:'Barva obrobe',data:'Podatki',header:'Glava',yes:'Da',no:'Ne',invalidWidth:'Širina celice mora biti število.',invalidHeight:'Višina celice mora biti število.',invalidRowSpan:'Razpon vrstic mora biti celo število.',invalidColSpan:'Razpon stolpcev mora biti celo število.',chooseColor:'Izberi'},row:{menu:'Vrstica',insertBefore:'Vstavi vrstico pred',insertAfter:'Vstavi vrstico za',deleteRow:'Izbriši vrstice'},column:{menu:'Stolpec',insertBefore:'Vstavi stolpec pred',insertAfter:'Vstavi stolpec za',deleteColumn:'Izbriši stolpce'}},button:{title:'Lastnosti gumba',text:'Besedilo (Vrednost)',type:'Tip',typeBtn:'Gumb',typeSbm:'Potrdi',typeRst:'Ponastavi'},checkboxAndRadio:{checkboxTitle:'Lastnosti potrditvenega polja',radioTitle:'Lastnosti izbirnega polja',value:'Vrednost',selected:'Izbrano'},form:{title:'Lastnosti obrazca',menu:'Lastnosti obrazca',action:'Akcija',method:'Metoda',encoding:'Kodiranje znakov'},select:{title:'Lastnosti spustnega seznama',selectInfo:'Podatki',opAvail:'Razpoložljive izbire',value:'Vrednost',size:'Velikost',lines:'vrstic',chkMulti:'Dovoli izbor večih vrstic',opText:'Besedilo',opValue:'Vrednost',btnAdd:'Dodaj',btnModify:'Spremeni',btnUp:'Gor',btnDown:'Dol',btnSetValue:'Postavi kot privzeto izbiro',btnDelete:'Izbriši'},textarea:{title:'Lastnosti vnosnega območja',cols:'Stolpcev',rows:'Vrstic'},textfield:{title:'Lastnosti vnosnega polja',name:'Ime',value:'Vrednost',charWidth:'Dolžina',maxChars:'Največje število znakov',type:'Tip',typeText:'Besedilo',typePass:'Geslo'},hidden:{title:'Lastnosti skritega polja',name:'Ime',value:'Vrednost'},image:{title:'Lastnosti slike',titleButton:'Lastnosti gumba s sliko',menu:'Lastnosti slike',infoTab:'Podatki o sliki',btnUpload:'Pošlji na strežnik',upload:'Pošlji',alt:'Nadomestno besedilo',lockRatio:'Zakleni razmerje',resetSize:'Ponastavi velikost',border:'Obroba',hSpace:'Vodoravni razmik',vSpace:'Navpični razmik',alertUrl:'Vnesite URL slike',linkTab:'Povezava',button2Img:'Želiš pretvoriti izbrani gumb s sliko v preprosto sliko?',img2Button:'Želiš pretvoriti izbrano sliko v gumb s sliko?',urlMissing:'Manjka vir (URL) slike.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Lastnosti Flash',propertiesTab:'Lastnosti',title:'Lastnosti Flash',chkPlay:'Samodejno predvajaj',chkLoop:'Ponavljanje',chkMenu:'Omogoči Flash Meni',chkFull:'Dovoli celozaslonski način',scale:'Povečava',scaleAll:'Pokaži vse',scaleNoBorder:'Brez obrobe',scaleFit:'Natančno prileganje',access:'Dostop skript',accessAlways:'Vedno',accessSameDomain:'Samo ista domena',accessNever:'Nikoli',alignAbsBottom:'Popolnoma na dno',alignAbsMiddle:'Popolnoma v sredino',alignBaseline:'Na osnovno črto',alignTextTop:'Besedilo na vrh',quality:'Kakovost',qualityBest:'Najvišja',qualityHigh:'Visoka',qualityAutoHigh:'Samodejno visoka',qualityMedium:'Srednja',qualityAutoLow:'Samodejno nizka',qualityLow:'Nizka',windowModeWindow:'Okno',windowModeOpaque:'Motno',windowModeTransparent:'Prosojno',windowMode:'Vrsta okna',flashvars:'Spremenljivke za Flash',bgcolor:'Barva ozadja',hSpace:'Vodoravni razmik',vSpace:'Navpični razmik',validateSrc:'Vnesite URL povezave',validateHSpace:'Vodoravni razmik mora biti število.',validateVSpace:'Navpični razmik mora biti število.'},spellCheck:{toolbar:'Preveri črkovanje',title:'Črkovalnik',notAvailable:'Oprostite, storitev trenutno ni dosegljiva.',errorLoading:'Napaka pri nalaganju storitve programa na naslovu %s.',notInDic:'Ni v slovarju',changeTo:'Spremeni v',btnIgnore:'Prezri',btnIgnoreAll:'Prezri vse',btnReplace:'Zamenjaj',btnReplaceAll:'Zamenjaj vse',btnUndo:'Razveljavi',noSuggestions:'- Ni predlogov -',progress:'Preverjanje črkovanja se izvaja...',noMispell:'Črkovanje je končano: Brez napak',noChanges:'Črkovanje je končano: Nobena beseda ni bila spremenjena',oneChange:'Črkovanje je končano: Spremenjena je bila ena beseda',manyChanges:'Črkovanje je končano: Spremenjenih je bilo %1 besed',ieSpellDownload:'Črkovalnik ni nameščen. Ali ga želite prenesti sedaj?'},smiley:{toolbar:'Smeško',title:'Vstavi smeška',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Oštevilčen seznam',bulletedlist:'Označen seznam',indent:'Povečaj zamik',outdent:'Zmanjšaj zamik',justify:{left:'Leva poravnava',center:'Sredinska poravnava',right:'Desna poravnava',block:'Obojestranska poravnava'},blockquote:'Citat',clipboard:{title:'Prilepi',cutError:'Varnostne nastavitve brskalnika ne dopuščajo samodejnega izrezovanja. Uporabite kombinacijo tipk na tipkovnici (Ctrl/Cmd+X).',copyError:'Varnostne nastavitve brskalnika ne dopuščajo samodejnega kopiranja. Uporabite kombinacijo tipk na tipkovnici (Ctrl/Cmd+C).',pasteMsg:'Prosim prilepite v sleči okvir s pomočjo tipkovnice (<STRONG>Ctrl/Cmd+V</STRONG>) in pritisnite <STRONG>V redu</STRONG>.',securityMsg:'Zaradi varnostnih nastavitev vašega brskalnika urejevalnik ne more neposredno dostopati do odložišča. Vsebino odložišča ponovno prilepite v to okno.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Prilepi iz Worda',title:'Prilepi iz Worda',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Prilepi kot golo besedilo',title:'Prilepi kot golo besedilo'},templates:{button:'Predloge',title:'Vsebinske predloge',options:'Template Options',insertOption:'Zamenjaj trenutno vsebino',selectPromptMsg:'Izberite predlogo, ki jo želite odpreti v urejevalniku<br>(trenutna vsebina bo izgubljena):',emptyListMsg:'(Ni pripravljenih predlog)'},showBlocks:'Prikaži ograde',stylesCombo:{label:'Slog',panelTitle:'Formatting Styles',panelTitle1:'Slogi odstavkov',panelTitle2:'Slogi besedila',panelTitle3:'Slogi objektov'},format:{label:'Oblika',panelTitle:'Oblika',tag_p:'Navaden',tag_pre:'Oblikovan',tag_address:'Napis',tag_h1:'Naslov 1',tag_h2:'Naslov 2',tag_h3:'Naslov 3',tag_h4:'Naslov 4',tag_h5:'Naslov 5',tag_h6:'Naslov 6',tag_div:'Navaden (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Pisava',voiceLabel:'Pisava',panelTitle:'Pisava'},fontSize:{label:'Velikost',voiceLabel:'Velikost',panelTitle:'Velikost'},colorButton:{textColorTitle:'Barva besedila',bgColorTitle:'Barva ozadja',panelTitle:'Colors',auto:'Samodejno',more:'Več barv...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Črkovanje med tipkanjem',opera_title:'Not supported by Opera',enable:'Omogoči SCAYT',disable:'Onemogoči SCAYT',about:'O storitvi SCAYT',toggle:'Preklopi SCAYT',options:'Možnosti',langs:'Jeziki',moreSuggestions:'Več predlogov',ignore:'Prezri',ignoreAll:'Prezri vse',addWord:'Dodaj besedo',emptyDic:'Ime slovarja ne more biti prazno.',optionsTab:'Možnosti',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Jeziki',dictionariesTab:'Slovarji',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'O storitvi'},about:{title:'O programu CKEditor',dlgTitle:'O programu CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'Za informacijo o licenci prostim obiščite našo spletno stran:',copy:'Copyright © $1. Vse pravice pridržane.'},maximize:'Maksimiraj',minimize:'Minimiraj',fakeobjects:{anchor:'Sidro',flash:'Flash animacija',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Neznan objekt'},resize:'Potegni za spremembo velikosti',colordialog:{title:'Izberi barvo',options:'Color Options',highlight:'Poudarjeno',selected:'Izbrano',clear:'Počisti'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Lastnosti dokumenta',title:'Lastnosti dokumenta',design:'Design',meta:'Meta podatki',chooseColor:'Izberi',other:'<drug>',docTitle:'Naslov strani',charset:'Kodna tabela',charsetOther:'Druga kodna tabela',charsetASCII:'ASCII',charsetCE:'Srednjeevropsko',charsetCT:'Tradicionalno Kitajsko (Big5)',charsetCR:'Cirilica',charsetGR:'Grško',charsetJP:'Japonsko',charsetKR:'Korejsko',charsetTR:'Turško',charsetUN:'Unicode (UTF-8)',charsetWE:'Zahodnoevropsko',docType:'Glava tipa dokumenta',docTypeOther:'Druga glava tipa dokumenta',xhtmlDec:'Vstavi XHTML deklaracije',bgColor:'Barva ozadja',bgImage:'URL slike za ozadje',bgFixed:'Nepremično ozadje',txtColor:'Barva besedila',margin:'Zamiki strani',marginTop:'Na vrhu',marginLeft:'Levo',marginRight:'Desno',marginBottom:'Spodaj',metaKeywords:'Ključne besede (ločene z vejicami)',metaDescription:'Opis strani',metaAuthor:'Avtor',metaCopyright:'Avtorske pravice',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/sr.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/sr.js
index 963a233..a910572 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/sr.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/sr.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.sr={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Kôд',newPage:'Нова страница',save:'Сачувај',preview:'Изглед странице',cut:'Исеци',copy:'Копирај',paste:'Залепи',print:'Штампа',underline:'Подвучено',bold:'Подебљано',italic:'Курзив',selectAll:'Означи све',removeFormat:'Уклони форматирање',strike:'Прецртано',subscript:'Индекс',superscript:'Степен',horizontalrule:'Унеси хоризонталну линију',pagebreak:'Insert Page Break for Printing',pagebreakAlt:'Page Break',unlink:'Уклони линк',undo:'Поништи акцију',redo:'Понови акцију',common:{browseServer:'Претражи сервер',url:'УРЛ',protocol:'Протокол',upload:'Пошаљи',uploadSubmit:'Пошаљи на сервер',image:'Слика',flash:'Флеш елемент',form:'Форма',checkbox:'Поље за потврду',radio:'Радио-дугме',textField:'Текстуално поље',textarea:'Зона текста',hiddenField:'Скривено поље',button:'Дугме',select:'Изборно поље',imageButton:'Дугме са сликом',notSet:'<није постављено>',id:'Ид',name:'Назив',langDir:'Смер језика',langDirLtr:'С лева на десно (LTR)',langDirRtl:'С десна на лево (RTL)',langCode:'Kôд језика',longDescr:'Пун опис УРЛ',cssClass:'Stylesheet класе',advisoryTitle:'Advisory наслов',cssStyle:'Стил',ok:'OK',cancel:'Oткажи',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Напредни тагови',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Ширина',height:'Висина',align:'Равнање',alignLeft:'Лево',alignRight:'Десно',alignCenter:'Средина',alignTop:'Врх',alignMiddle:'Средина',alignBottom:'Доле',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Унеси специјални карактер',title:'Одаберите специјални карактер',options:'Special Character Options'},link:{toolbar:'Унеси/измени линк',other:'<other>',menu:'Промени линк',title:'Линк',info:'Линк инфо',target:'Meтa',upload:'Пошаљи',advanced:'Напредни тагови',type:'Врста линка',toUrl:'URL',toAnchor:'Сидро на овој страници',toEmail:'Eлектронска пошта',targetFrame:'<оквир>',targetPopup:'<искачући прозор>',targetFrameName:'Назив одредишног фрејма',targetPopupName:'Назив искачућег прозора',popupFeatures:'Могућности искачућег прозора',popupResizable:'Resizable',popupStatusBar:'Статусна линија',popupLocationBar:'Локација',popupToolbar:'Toolbar',popupMenuBar:'Контекстни мени',popupFullScreen:'Приказ преко целог екрана (ИE)',popupScrollBars:'Скрол бар',popupDependent:'Зависно (Netscape)',popupLeft:'Од леве ивице екрана (пиксела)',popupTop:'Од врха екрана (пиксела)',id:'Id',langDir:'Смер језика',langDirLTR:'С лева на десно (LTR)',langDirRTL:'С десна на лево (RTL)',acccessKey:'Приступни тастер',name:'Назив',langCode:'Смер језика',tabIndex:'Таб индекс',advisoryTitle:'Advisory наслов',advisoryContentType:'Advisory врста садржаја',cssClasses:'Stylesheet класе',charset:'Linked Resource Charset',styles:'Стил',rel:'Relationship',selectAnchor:'Одабери сидро',anchorName:'По називу сидра',anchorId:'Пo Ид-jу елемента',emailAddress:'Адреса електронске поште',emailSubject:'Наслов',emailBody:'Садржај поруке',noAnchors:'(Нема доступних сидра)',noUrl:'Унесите УРЛ линка',noEmail:'Откуцајте адресу електронске поште'},anchor:{toolbar:'Унеси/измени сидро',menu:'Особине сидра',title:'Особине сидра',name:'Име сидра',errorName:'Молимо Вас да унесете име сидра',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Претрага',replace:'Замена',findWhat:'Пронађи:',replaceWith:'Замени са:',notFoundMsg:'Тражени текст није пронађен.',findOptions:'Find Options',matchCase:'Разликуј велика и мала слова',matchWord:'Упореди целе речи',matchCyclic:'Match cyclic',replaceAll:'Замени све',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Табела',title:'Особине табеле',menu:'Особине табеле',deleteTable:'Delete Table',rows:'Редова',columns:'Kолона',border:'Величина оквира',widthPx:'пиксела',widthPc:'процената',widthUnit:'width unit',cellSpace:'Ћелијски простор',cellPad:'Размак ћелија',caption:'Наслов табеле',summary:'Summary',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Cell',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Обриши ћелије',merge:'Спој ћелије',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Row',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Обриши редове'},column:{menu:'Column',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Обриши колоне'}},button:{title:'Особине дугмета',text:'Текст (вредност)',type:'Tип',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Особине поља за потврду',radioTitle:'Особине радио-дугмета',value:'Вредност',selected:'Означено'},form:{title:'Особине форме',menu:'Особине форме',action:'Aкција',method:'Mетода',encoding:'Encoding'},select:{title:'Особине изборног поља',selectInfo:'Инфо',opAvail:'Доступне опције',value:'Вредност',size:'Величина',lines:'линија',chkMulti:'Дозволи вишеструку селекцију',opText:'Текст',opValue:'Вредност',btnAdd:'Додај',btnModify:'Измени',btnUp:'Горе',btnDown:'Доле',btnSetValue:'Подеси као означену вредност',btnDelete:'Обриши'},textarea:{title:'Особине зоне текста',cols:'Број колона',rows:'Број редова'},textfield:{title:'Особине текстуалног поља',name:'Назив',value:'Вредност',charWidth:'Ширина (карактера)',maxChars:'Максимално карактера',type:'Тип',typeText:'Текст',typePass:'Лозинка'},hidden:{title:'Особине скривеног поља',name:'Назив',value:'Вредност'},image:{title:'Особине слика',titleButton:'Особине дугмета са сликом',menu:'Особине слика',infoTab:'Инфо слике',btnUpload:'Пошаљи на сервер',upload:'Пошаљи',alt:'Алтернативни текст',lockRatio:'Закључај однос',resetSize:'Ресетуј величину',border:'Оквир',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Унесите УРЛ слике',linkTab:'Линк',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Особине Флеша',propertiesTab:'Properties',title:'Особине флеша',chkPlay:'Аутоматски старт',chkLoop:'Понављај',chkMenu:'Укључи флеш мени',chkFull:'Allow Fullscreen',scale:'Скалирај',scaleAll:'Прикажи све',scaleNoBorder:'Без ивице',scaleFit:'Попуни површину',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs доле',alignAbsMiddle:'Abs средина',alignBaseline:'Базно',alignTextTop:'Врх текста',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Боја позадине',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'Унесите УРЛ линка',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Провери спеловање',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Није у речнику',changeTo:'Измени',btnIgnore:'Игнориши',btnIgnoreAll:'Игнориши све',btnReplace:'Замени',btnReplaceAll:'Замени све',btnUndo:'Врати акцију',noSuggestions:'- Без сугестија -',progress:'Провера спеловања у току...',noMispell:'Провера спеловања завршена: грешке нису пронађене',noChanges:'Провера спеловања завршена: Није измењена ниједна реч',oneChange:'Провера спеловања завршена: Измењена је једна реч',manyChanges:'Провера спеловања завршена: %1 реч(и) је измењено',ieSpellDownload:'Провера спеловања није инсталирана. Да ли желите да је скинете са Интернета?'},smiley:{toolbar:'Смајли',title:'Унеси смајлија',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Набројиву листу',bulletedlist:'Ненабројива листа',indent:'Увећај леву маргину',outdent:'Смањи леву маргину',justify:{left:'Лево равнање',center:'Центриран текст',right:'Десно равнање',block:'Обострано равнање'},blockquote:'Block Quote',clipboard:{title:'Залепи',cutError:'Сигурносна подешавања Вашег претраживача не дозвољавају операције аутоматског исецања текста. Молимо Вас да користите пречицу са тастатуре (Ctrl/Cmd+X).',copyError:'Сигурносна подешавања Вашег претраживача не дозвољавају операције аутоматског копирања текста. Молимо Вас да користите пречицу са тастатуре (Ctrl/Cmd+C).',pasteMsg:'Молимо Вас да залепите унутар доње површине користећи тастатурну пречицу (<STRONG>Ctrl/Cmd+V</STRONG>) и да притиснете <STRONG>OK</STRONG>.',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Залепи из Worda',title:'Залепи из Worda',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Залепи као чист текст',title:'Залепи као чист текст'},templates:{button:'Обрасци',title:'Обрасци за садржај',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Молимо Вас да одаберете образац који ће бити примењен на страницу (тренутни садржај ће бити обрисан):',emptyListMsg:'(Нема дефинисаних образаца)'},showBlocks:'Show Blocks',stylesCombo:{label:'Стил',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Формат',panelTitle:'Формат',tag_p:'Normal',tag_pre:'Formatirano',tag_address:'Adresa',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Фонт',voiceLabel:'Font',panelTitle:'Фонт'},fontSize:{label:'Величина фонта',voiceLabel:'Font Size',panelTitle:'Величина фонта'},colorButton:{textColorTitle:'Боја текста',bgColorTitle:'Боја позадине',panelTitle:'Colors',auto:'Аутоматски',more:'Више боја...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Особине документа',title:'Особине документа',design:'Design',meta:'Метаподаци',chooseColor:'Choose',other:'<other>',docTitle:'Наслов странице',charset:'Кодирање скупа карактера',charsetOther:'Остала кодирања скупа карактера',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Заглавље типа документа',docTypeOther:'Остала заглавља типа документа',xhtmlDec:'Улључи XHTML декларације',bgColor:'Боја позадине',bgImage:'УРЛ позадинске слике',bgFixed:'Фиксирана позадина',txtColor:'Боја текста',margin:'Маргине странице',marginTop:'Горња',marginLeft:'Лева',marginRight:'Десна',marginBottom:'Доња',metaKeywords:'Кључне речи за индексирање документа (раздвојене зарезом)',metaDescription:'Опис документа',metaAuthor:'Аутор',metaCopyright:'Ауторска права',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.sr={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Kôд',newPage:'Нова страница',save:'Сачувај',preview:'Изглед странице',cut:'Исеци',copy:'Копирај',paste:'Залепи',print:'Штампа',underline:'Подвучено',bold:'Подебљано',italic:'Курзив',selectAll:'Означи све',removeFormat:'Уклони форматирање',strike:'Прецртано',subscript:'Индекс',superscript:'Степен',horizontalrule:'Унеси хоризонталну линију',pagebreak:'Insert Page Break for Printing',pagebreakAlt:'Page Break',unlink:'Уклони линк',undo:'Поништи акцију',redo:'Понови акцију',common:{browseServer:'Претражи сервер',url:'УРЛ',protocol:'Протокол',upload:'Пошаљи',uploadSubmit:'Пошаљи на сервер',image:'Слика',flash:'Флеш елемент',form:'Форма',checkbox:'Поље за потврду',radio:'Радио-дугме',textField:'Текстуално поље',textarea:'Зона текста',hiddenField:'Скривено поље',button:'Дугме',select:'Изборно поље',imageButton:'Дугме са сликом',notSet:'<није постављено>',id:'Ид',name:'Назив',langDir:'Смер језика',langDirLtr:'С лева на десно (LTR)',langDirRtl:'С десна на лево (RTL)',langCode:'Kôд језика',longDescr:'Пун опис УРЛ',cssClass:'Stylesheet класе',advisoryTitle:'Advisory наслов',cssStyle:'Стил',ok:'OK',cancel:'Oткажи',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Напредни тагови',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Ширина',height:'Висина',align:'Равнање',alignLeft:'Лево',alignRight:'Десно',alignCenter:'Средина',alignTop:'Врх',alignMiddle:'Средина',alignBottom:'Доле',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Унеси специјални карактер',title:'Одаберите специјални карактер',options:'Special Character Options'},link:{toolbar:'Унеси/измени линк',other:'<other>',menu:'Промени линк',title:'Линк',info:'Линк инфо',target:'Meтa',upload:'Пошаљи',advanced:'Напредни тагови',type:'Врста линка',toUrl:'URL',toAnchor:'Сидро на овој страници',toEmail:'Eлектронска пошта',targetFrame:'<оквир>',targetPopup:'<искачући прозор>',targetFrameName:'Назив одредишног фрејма',targetPopupName:'Назив искачућег прозора',popupFeatures:'Могућности искачућег прозора',popupResizable:'Resizable',popupStatusBar:'Статусна линија',popupLocationBar:'Локација',popupToolbar:'Toolbar',popupMenuBar:'Контекстни мени',popupFullScreen:'Приказ преко целог екрана (ИE)',popupScrollBars:'Скрол бар',popupDependent:'Зависно (Netscape)',popupLeft:'Од леве ивице екрана (пиксела)',popupTop:'Од врха екрана (пиксела)',id:'Id',langDir:'Смер језика',langDirLTR:'С лева на десно (LTR)',langDirRTL:'С десна на лево (RTL)',acccessKey:'Приступни тастер',name:'Назив',langCode:'Смер језика',tabIndex:'Таб индекс',advisoryTitle:'Advisory наслов',advisoryContentType:'Advisory врста садржаја',cssClasses:'Stylesheet класе',charset:'Linked Resource Charset',styles:'Стил',rel:'Relationship',selectAnchor:'Одабери сидро',anchorName:'По називу сидра',anchorId:'Пo Ид-jу елемента',emailAddress:'Адреса електронске поште',emailSubject:'Наслов',emailBody:'Садржај поруке',noAnchors:'(Нема доступних сидра)',noUrl:'Унесите УРЛ линка',noEmail:'Откуцајте адресу електронске поште'},anchor:{toolbar:'Унеси/измени сидро',menu:'Особине сидра',title:'Особине сидра',name:'Име сидра',errorName:'Молимо Вас да унесете име сидра',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Претрага',replace:'Замена',findWhat:'Пронађи:',replaceWith:'Замени са:',notFoundMsg:'Тражени текст није пронађен.',findOptions:'Find Options',matchCase:'Разликуј велика и мала слова',matchWord:'Упореди целе речи',matchCyclic:'Match cyclic',replaceAll:'Замени све',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Табела',title:'Особине табеле',menu:'Особине табеле',deleteTable:'Delete Table',rows:'Редова',columns:'Kолона',border:'Величина оквира',widthPx:'пиксела',widthPc:'процената',widthUnit:'width unit',cellSpace:'Ћелијски простор',cellPad:'Размак ћелија',caption:'Наслов табеле',summary:'Summary',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Cell',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Обриши ћелије',merge:'Спој ћелије',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Row',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Обриши редове'},column:{menu:'Column',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Обриши колоне'}},button:{title:'Особине дугмета',text:'Текст (вредност)',type:'Tип',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Особине поља за потврду',radioTitle:'Особине радио-дугмета',value:'Вредност',selected:'Означено'},form:{title:'Особине форме',menu:'Особине форме',action:'Aкција',method:'Mетода',encoding:'Encoding'},select:{title:'Особине изборног поља',selectInfo:'Инфо',opAvail:'Доступне опције',value:'Вредност',size:'Величина',lines:'линија',chkMulti:'Дозволи вишеструку селекцију',opText:'Текст',opValue:'Вредност',btnAdd:'Додај',btnModify:'Измени',btnUp:'Горе',btnDown:'Доле',btnSetValue:'Подеси као означену вредност',btnDelete:'Обриши'},textarea:{title:'Особине зоне текста',cols:'Број колона',rows:'Број редова'},textfield:{title:'Особине текстуалног поља',name:'Назив',value:'Вредност',charWidth:'Ширина (карактера)',maxChars:'Максимално карактера',type:'Тип',typeText:'Текст',typePass:'Лозинка'},hidden:{title:'Особине скривеног поља',name:'Назив',value:'Вредност'},image:{title:'Особине слика',titleButton:'Особине дугмета са сликом',menu:'Особине слика',infoTab:'Инфо слике',btnUpload:'Пошаљи на сервер',upload:'Пошаљи',alt:'Алтернативни текст',lockRatio:'Закључај однос',resetSize:'Ресетуј величину',border:'Оквир',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Унесите УРЛ слике',linkTab:'Линк',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Особине Флеша',propertiesTab:'Properties',title:'Особине флеша',chkPlay:'Аутоматски старт',chkLoop:'Понављај',chkMenu:'Укључи флеш мени',chkFull:'Allow Fullscreen',scale:'Скалирај',scaleAll:'Прикажи све',scaleNoBorder:'Без ивице',scaleFit:'Попуни површину',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs доле',alignAbsMiddle:'Abs средина',alignBaseline:'Базно',alignTextTop:'Врх текста',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Боја позадине',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'Унесите УРЛ линка',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Провери спеловање',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Није у речнику',changeTo:'Измени',btnIgnore:'Игнориши',btnIgnoreAll:'Игнориши све',btnReplace:'Замени',btnReplaceAll:'Замени све',btnUndo:'Врати акцију',noSuggestions:'- Без сугестија -',progress:'Провера спеловања у току...',noMispell:'Провера спеловања завршена: грешке нису пронађене',noChanges:'Провера спеловања завршена: Није измењена ниједна реч',oneChange:'Провера спеловања завршена: Измењена је једна реч',manyChanges:'Провера спеловања завршена: %1 реч(и) је измењено',ieSpellDownload:'Провера спеловања није инсталирана. Да ли желите да је скинете са Интернета?'},smiley:{toolbar:'Смајли',title:'Унеси смајлија',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Набројиву листу',bulletedlist:'Ненабројива листа',indent:'Увећај леву маргину',outdent:'Смањи леву маргину',justify:{left:'Лево равнање',center:'Центриран текст',right:'Десно равнање',block:'Обострано равнање'},blockquote:'Block Quote',clipboard:{title:'Залепи',cutError:'Сигурносна подешавања Вашег претраживача не дозвољавају операције аутоматског исецања текста. Молимо Вас да користите пречицу са тастатуре (Ctrl/Cmd+X).',copyError:'Сигурносна подешавања Вашег претраживача не дозвољавају операције аутоматског копирања текста. Молимо Вас да користите пречицу са тастатуре (Ctrl/Cmd+C).',pasteMsg:'Молимо Вас да залепите унутар доње површине користећи тастатурну пречицу (<STRONG>Ctrl/Cmd+V</STRONG>) и да притиснете <STRONG>OK</STRONG>.',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Залепи из Worda',title:'Залепи из Worda',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Залепи као чист текст',title:'Залепи као чист текст'},templates:{button:'Обрасци',title:'Обрасци за садржај',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Молимо Вас да одаберете образац који ће бити примењен на страницу (тренутни садржај ће бити обрисан):',emptyListMsg:'(Нема дефинисаних образаца)'},showBlocks:'Show Blocks',stylesCombo:{label:'Стил',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Формат',panelTitle:'Формат',tag_p:'Normal',tag_pre:'Formatirano',tag_address:'Adresa',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Фонт',voiceLabel:'Font',panelTitle:'Фонт'},fontSize:{label:'Величина фонта',voiceLabel:'Font Size',panelTitle:'Величина фонта'},colorButton:{textColorTitle:'Боја текста',bgColorTitle:'Боја позадине',panelTitle:'Colors',auto:'Аутоматски',more:'Више боја...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Особине документа',title:'Особине документа',design:'Design',meta:'Метаподаци',chooseColor:'Choose',other:'<other>',docTitle:'Наслов странице',charset:'Кодирање скупа карактера',charsetOther:'Остала кодирања скупа карактера',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Заглавље типа документа',docTypeOther:'Остала заглавља типа документа',xhtmlDec:'Улључи XHTML декларације',bgColor:'Боја позадине',bgImage:'УРЛ позадинске слике',bgFixed:'Фиксирана позадина',txtColor:'Боја текста',margin:'Маргине странице',marginTop:'Горња',marginLeft:'Лева',marginRight:'Десна',marginBottom:'Доња',metaKeywords:'Кључне речи за индексирање документа (раздвојене зарезом)',metaDescription:'Опис документа',metaAuthor:'Аутор',metaCopyright:'Ауторска права',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/sr-latn.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/sr-latn.js
index a20361c..1e9861a 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/sr-latn.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/sr-latn.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang['sr-latn']={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Kôd',newPage:'Nova stranica',save:'Sačuvaj',preview:'Izgled stranice',cut:'Iseci',copy:'Kopiraj',paste:'Zalepi',print:'Štampa',underline:'Podvučeno',bold:'Podebljano',italic:'Kurziv',selectAll:'Označi sve',removeFormat:'Ukloni formatiranje',strike:'Precrtano',subscript:'Indeks',superscript:'Stepen',horizontalrule:'Unesi horizontalnu liniju',pagebreak:'Insert Page Break for Printing',pagebreakAlt:'Page Break',unlink:'Ukloni link',undo:'Poni�ti akciju',redo:'Ponovi akciju',common:{browseServer:'Pretraži server',url:'URL',protocol:'Protokol',upload:'Pošalji',uploadSubmit:'Pošalji na server',image:'Slika',flash:'Fleš',form:'Forma',checkbox:'Polje za potvrdu',radio:'Radio-dugme',textField:'Tekstualno polje',textarea:'Zona teksta',hiddenField:'Skriveno polje',button:'Dugme',select:'Izborno polje',imageButton:'Dugme sa slikom',notSet:'<nije postavljeno>',id:'Id',name:'Naziv',langDir:'Smer jezika',langDirLtr:'S leva na desno (LTR)',langDirRtl:'S desna na levo (RTL)',langCode:'Kôd jezika',longDescr:'Pun opis URL',cssClass:'Stylesheet klase',advisoryTitle:'Advisory naslov',cssStyle:'Stil',ok:'OK',cancel:'Otkaži',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Napredni tagovi',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Širina',height:'Visina',align:'Ravnanje',alignLeft:'Levo',alignRight:'Desno',alignCenter:'Sredina',alignTop:'Vrh',alignMiddle:'Sredina',alignBottom:'Dole',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Unesi specijalni karakter',title:'Odaberite specijalni karakter',options:'Special Character Options'},link:{toolbar:'Unesi/izmeni link',other:'<остало>',menu:'Izmeni link',title:'Link',info:'Link Info',target:'Meta',upload:'Pošalji',advanced:'Napredni tagovi',type:'Vrsta linka',toUrl:'URL',toAnchor:'Sidro na ovoj stranici',toEmail:'E-Mail',targetFrame:'<okvir>',targetPopup:'<popup prozor>',targetFrameName:'Naziv odredišnog frejma',targetPopupName:'Naziv popup prozora',popupFeatures:'Mogućnosti popup prozora',popupResizable:'Resizable',popupStatusBar:'Statusna linija',popupLocationBar:'Lokacija',popupToolbar:'Toolbar',popupMenuBar:'Kontekstni meni',popupFullScreen:'Prikaz preko celog ekrana (IE)',popupScrollBars:'Scroll bar',popupDependent:'Zavisno (Netscape)',popupLeft:'Od leve ivice ekrana (px)',popupTop:'Od vrha ekrana (px)',id:'Id',langDir:'Smer jezika',langDirLTR:'S leva na desno (LTR)',langDirRTL:'S desna na levo (RTL)',acccessKey:'Pristupni taster',name:'Naziv',langCode:'Smer jezika',tabIndex:'Tab indeks',advisoryTitle:'Advisory naslov',advisoryContentType:'Advisory vrsta sadržaja',cssClasses:'Stylesheet klase',charset:'Linked Resource Charset',styles:'Stil',rel:'Relationship',selectAnchor:'Odaberi sidro',anchorName:'Po nazivu sidra',anchorId:'Po Id-ju elementa',emailAddress:'E-Mail adresa',emailSubject:'Naslov',emailBody:'Sadržaj poruke',noAnchors:'(Nema dostupnih sidra)',noUrl:'Unesite URL linka',noEmail:'Otkucajte adresu elektronske pote'},anchor:{toolbar:'Unesi/izmeni sidro',menu:'Osobine sidra',title:'Osobine sidra',name:'Ime sidra',errorName:'Unesite ime sidra',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Pretraga',replace:'Zamena',findWhat:'Pronadi:',replaceWith:'Zameni sa:',notFoundMsg:'Traženi tekst nije pronađen.',findOptions:'Find Options',matchCase:'Razlikuj mala i velika slova',matchWord:'Uporedi cele reci',matchCyclic:'Match cyclic',replaceAll:'Zameni sve',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Tabela',title:'Osobine tabele',menu:'Osobine tabele',deleteTable:'Delete Table',rows:'Redova',columns:'Kolona',border:'Veličina okvira',widthPx:'piksela',widthPc:'procenata',widthUnit:'width unit',cellSpace:'Ćelijski prostor',cellPad:'Razmak ćelija',caption:'Naslov tabele',summary:'Summary',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Cell',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Obriši ćelije',merge:'Spoj celije',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Row',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Obriši redove'},column:{menu:'Column',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Obriši kolone'}},button:{title:'Osobine dugmeta',text:'Tekst (vrednost)',type:'Tip',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Osobine polja za potvrdu',radioTitle:'Osobine radio-dugmeta',value:'Vrednost',selected:'Označeno'},form:{title:'Osobine forme',menu:'Osobine forme',action:'Akcija',method:'Metoda',encoding:'Encoding'},select:{title:'Osobine izbornog polja',selectInfo:'Info',opAvail:'Dostupne opcije',value:'Vrednost',size:'Veličina',lines:'linija',chkMulti:'Dozvoli višestruku selekciju',opText:'Tekst',opValue:'Vrednost',btnAdd:'Dodaj',btnModify:'Izmeni',btnUp:'Gore',btnDown:'Dole',btnSetValue:'Podesi kao označenu vrednost',btnDelete:'Obriši'},textarea:{title:'Osobine zone teksta',cols:'Broj kolona',rows:'Broj redova'},textfield:{title:'Osobine tekstualnog polja',name:'Naziv',value:'Vrednost',charWidth:'Širina (karaktera)',maxChars:'Maksimalno karaktera',type:'Tip',typeText:'Tekst',typePass:'Lozinka'},hidden:{title:'Osobine skrivenog polja',name:'Naziv',value:'Vrednost'},image:{title:'Osobine slika',titleButton:'Osobine dugmeta sa slikom',menu:'Osobine slika',infoTab:'Info slike',btnUpload:'Pošalji na server',upload:'Pošalji',alt:'Alternativni tekst',lockRatio:'Zaključaj odnos',resetSize:'Resetuj veličinu',border:'Okvir',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Unesite URL slike',linkTab:'Link',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Osobine fleša',propertiesTab:'Properties',title:'Osobine fleša',chkPlay:'Automatski start',chkLoop:'Ponavljaj',chkMenu:'Uključi fleš meni',chkFull:'Allow Fullscreen',scale:'Skaliraj',scaleAll:'Prikaži sve',scaleNoBorder:'Bez ivice',scaleFit:'Popuni površinu',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs dole',alignAbsMiddle:'Abs sredina',alignBaseline:'Bazno',alignTextTop:'Vrh teksta',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Boja pozadine',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'Unesite URL linka',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Proveri spelovanje',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Nije u rečniku',changeTo:'Izmeni',btnIgnore:'Ignoriši',btnIgnoreAll:'Ignoriši sve',btnReplace:'Zameni',btnReplaceAll:'Zameni sve',btnUndo:'Vrati akciju',noSuggestions:'- Bez sugestija -',progress:'Provera spelovanja u toku...',noMispell:'Provera spelovanja završena: greške nisu pronadene',noChanges:'Provera spelovanja završena: Nije izmenjena nijedna rec',oneChange:'Provera spelovanja završena: Izmenjena je jedna reč',manyChanges:'Provera spelovanja završena: %1 reč(i) je izmenjeno',ieSpellDownload:'Provera spelovanja nije instalirana. Da li želite da je skinete sa Interneta?'},smiley:{toolbar:'Smajli',title:'Unesi smajlija',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Nabrojiva lista',bulletedlist:'Nenabrojiva lista',indent:'Uvećaj levu marginu',outdent:'Smanji levu marginu',justify:{left:'Levo ravnanje',center:'Centriran tekst',right:'Desno ravnanje',block:'Obostrano ravnanje'},blockquote:'Block Quote',clipboard:{title:'Zalepi',cutError:'Sigurnosna podešavanja Vašeg pretraživača ne dozvoljavaju operacije automatskog isecanja teksta. Molimo Vas da koristite prečicu sa tastature (Ctrl/Cmd+X).',copyError:'Sigurnosna podešavanja Vašeg pretraživača ne dozvoljavaju operacije automatskog kopiranja teksta. Molimo Vas da koristite prečicu sa tastature (Ctrl/Cmd+C).',pasteMsg:'Molimo Vas da zalepite unutar donje povrine koristeći tastaturnu prečicu (<STRONG>Ctrl/Cmd+V</STRONG>) i da pritisnete <STRONG>OK</STRONG>.',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Zalepi iz Worda',title:'Zalepi iz Worda',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Zalepi kao čist tekst',title:'Zalepi kao čist tekst'},templates:{button:'Obrasci',title:'Obrasci za sadržaj',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Molimo Vas da odaberete obrazac koji ce biti primenjen na stranicu (trenutni sadržaj ce biti obrisan):',emptyListMsg:'(Nema definisanih obrazaca)'},showBlocks:'Show Blocks',stylesCombo:{label:'Stil',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Format',panelTitle:'Format',tag_p:'Normal',tag_pre:'Formatirano',tag_address:'Adresa',tag_h1:'Naslov 1',tag_h2:'Naslov 2',tag_h3:'Naslov 3',tag_h4:'Naslov 4',tag_h5:'Naslov 5',tag_h6:'Naslov 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Font',voiceLabel:'Font',panelTitle:'Font'},fontSize:{label:'Veličina fonta',voiceLabel:'Font Size',panelTitle:'Veličina fonta'},colorButton:{textColorTitle:'Boja teksta',bgColorTitle:'Boja pozadine',panelTitle:'Colors',auto:'Automatski',more:'Više boja...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Osobine dokumenta',title:'Osobine dokumenta',design:'Design',meta:'Metapodaci',chooseColor:'Choose',other:'<остало>',docTitle:'Naslov stranice',charset:'Kodiranje skupa karaktera',charsetOther:'Ostala kodiranja skupa karaktera',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Zaglavlje tipa dokumenta',docTypeOther:'Ostala zaglavlja tipa dokumenta',xhtmlDec:'Ukljuci XHTML deklaracije',bgColor:'Boja pozadine',bgImage:'URL pozadinske slike',bgFixed:'Fiksirana pozadina',txtColor:'Boja teksta',margin:'Margine stranice',marginTop:'Gornja',marginLeft:'Leva',marginRight:'Desna',marginBottom:'Donja',metaKeywords:'Ključne reci za indeksiranje dokumenta (razdvojene zarezima)',metaDescription:'Opis dokumenta',metaAuthor:'Autor',metaCopyright:'Autorska prava',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang['sr-latn']={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Kôd',newPage:'Nova stranica',save:'Sačuvaj',preview:'Izgled stranice',cut:'Iseci',copy:'Kopiraj',paste:'Zalepi',print:'Štampa',underline:'Podvučeno',bold:'Podebljano',italic:'Kurziv',selectAll:'Označi sve',removeFormat:'Ukloni formatiranje',strike:'Precrtano',subscript:'Indeks',superscript:'Stepen',horizontalrule:'Unesi horizontalnu liniju',pagebreak:'Insert Page Break for Printing',pagebreakAlt:'Page Break',unlink:'Ukloni link',undo:'Poni�ti akciju',redo:'Ponovi akciju',common:{browseServer:'Pretraži server',url:'URL',protocol:'Protokol',upload:'Pošalji',uploadSubmit:'Pošalji na server',image:'Slika',flash:'Fleš',form:'Forma',checkbox:'Polje za potvrdu',radio:'Radio-dugme',textField:'Tekstualno polje',textarea:'Zona teksta',hiddenField:'Skriveno polje',button:'Dugme',select:'Izborno polje',imageButton:'Dugme sa slikom',notSet:'<nije postavljeno>',id:'Id',name:'Naziv',langDir:'Smer jezika',langDirLtr:'S leva na desno (LTR)',langDirRtl:'S desna na levo (RTL)',langCode:'Kôd jezika',longDescr:'Pun opis URL',cssClass:'Stylesheet klase',advisoryTitle:'Advisory naslov',cssStyle:'Stil',ok:'OK',cancel:'Otkaži',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'Napredni tagovi',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'Širina',height:'Visina',align:'Ravnanje',alignLeft:'Levo',alignRight:'Desno',alignCenter:'Sredina',alignTop:'Vrh',alignMiddle:'Sredina',alignBottom:'Dole',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Unesi specijalni karakter',title:'Odaberite specijalni karakter',options:'Special Character Options'},link:{toolbar:'Unesi/izmeni link',other:'<остало>',menu:'Izmeni link',title:'Link',info:'Link Info',target:'Meta',upload:'Pošalji',advanced:'Napredni tagovi',type:'Vrsta linka',toUrl:'URL',toAnchor:'Sidro na ovoj stranici',toEmail:'E-Mail',targetFrame:'<okvir>',targetPopup:'<popup prozor>',targetFrameName:'Naziv odredišnog frejma',targetPopupName:'Naziv popup prozora',popupFeatures:'Mogućnosti popup prozora',popupResizable:'Resizable',popupStatusBar:'Statusna linija',popupLocationBar:'Lokacija',popupToolbar:'Toolbar',popupMenuBar:'Kontekstni meni',popupFullScreen:'Prikaz preko celog ekrana (IE)',popupScrollBars:'Scroll bar',popupDependent:'Zavisno (Netscape)',popupLeft:'Od leve ivice ekrana (px)',popupTop:'Od vrha ekrana (px)',id:'Id',langDir:'Smer jezika',langDirLTR:'S leva na desno (LTR)',langDirRTL:'S desna na levo (RTL)',acccessKey:'Pristupni taster',name:'Naziv',langCode:'Smer jezika',tabIndex:'Tab indeks',advisoryTitle:'Advisory naslov',advisoryContentType:'Advisory vrsta sadržaja',cssClasses:'Stylesheet klase',charset:'Linked Resource Charset',styles:'Stil',rel:'Relationship',selectAnchor:'Odaberi sidro',anchorName:'Po nazivu sidra',anchorId:'Po Id-ju elementa',emailAddress:'E-Mail adresa',emailSubject:'Naslov',emailBody:'Sadržaj poruke',noAnchors:'(Nema dostupnih sidra)',noUrl:'Unesite URL linka',noEmail:'Otkucajte adresu elektronske pote'},anchor:{toolbar:'Unesi/izmeni sidro',menu:'Osobine sidra',title:'Osobine sidra',name:'Ime sidra',errorName:'Unesite ime sidra',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'Pretraga',replace:'Zamena',findWhat:'Pronadi:',replaceWith:'Zameni sa:',notFoundMsg:'Traženi tekst nije pronađen.',findOptions:'Find Options',matchCase:'Razlikuj mala i velika slova',matchWord:'Uporedi cele reci',matchCyclic:'Match cyclic',replaceAll:'Zameni sve',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'Tabela',title:'Osobine tabele',menu:'Osobine tabele',deleteTable:'Delete Table',rows:'Redova',columns:'Kolona',border:'Veličina okvira',widthPx:'piksela',widthPc:'procenata',widthUnit:'width unit',cellSpace:'Ćelijski prostor',cellPad:'Razmak ćelija',caption:'Naslov tabele',summary:'Summary',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'Cell',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'Obriši ćelije',merge:'Spoj celije',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'Row',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'Obriši redove'},column:{menu:'Column',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'Obriši kolone'}},button:{title:'Osobine dugmeta',text:'Tekst (vrednost)',type:'Tip',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'Osobine polja za potvrdu',radioTitle:'Osobine radio-dugmeta',value:'Vrednost',selected:'Označeno'},form:{title:'Osobine forme',menu:'Osobine forme',action:'Akcija',method:'Metoda',encoding:'Encoding'},select:{title:'Osobine izbornog polja',selectInfo:'Info',opAvail:'Dostupne opcije',value:'Vrednost',size:'Veličina',lines:'linija',chkMulti:'Dozvoli višestruku selekciju',opText:'Tekst',opValue:'Vrednost',btnAdd:'Dodaj',btnModify:'Izmeni',btnUp:'Gore',btnDown:'Dole',btnSetValue:'Podesi kao označenu vrednost',btnDelete:'Obriši'},textarea:{title:'Osobine zone teksta',cols:'Broj kolona',rows:'Broj redova'},textfield:{title:'Osobine tekstualnog polja',name:'Naziv',value:'Vrednost',charWidth:'Širina (karaktera)',maxChars:'Maksimalno karaktera',type:'Tip',typeText:'Tekst',typePass:'Lozinka'},hidden:{title:'Osobine skrivenog polja',name:'Naziv',value:'Vrednost'},image:{title:'Osobine slika',titleButton:'Osobine dugmeta sa slikom',menu:'Osobine slika',infoTab:'Info slike',btnUpload:'Pošalji na server',upload:'Pošalji',alt:'Alternativni tekst',lockRatio:'Zaključaj odnos',resetSize:'Resetuj veličinu',border:'Okvir',hSpace:'HSpace',vSpace:'VSpace',alertUrl:'Unesite URL slike',linkTab:'Link',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Osobine fleša',propertiesTab:'Properties',title:'Osobine fleša',chkPlay:'Automatski start',chkLoop:'Ponavljaj',chkMenu:'Uključi fleš meni',chkFull:'Allow Fullscreen',scale:'Skaliraj',scaleAll:'Prikaži sve',scaleNoBorder:'Bez ivice',scaleFit:'Popuni površinu',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'Abs dole',alignAbsMiddle:'Abs sredina',alignBaseline:'Bazno',alignTextTop:'Vrh teksta',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'Boja pozadine',hSpace:'HSpace',vSpace:'VSpace',validateSrc:'Unesite URL linka',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'Proveri spelovanje',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'Nije u rečniku',changeTo:'Izmeni',btnIgnore:'Ignoriši',btnIgnoreAll:'Ignoriši sve',btnReplace:'Zameni',btnReplaceAll:'Zameni sve',btnUndo:'Vrati akciju',noSuggestions:'- Bez sugestija -',progress:'Provera spelovanja u toku...',noMispell:'Provera spelovanja završena: greške nisu pronadene',noChanges:'Provera spelovanja završena: Nije izmenjena nijedna rec',oneChange:'Provera spelovanja završena: Izmenjena je jedna reč',manyChanges:'Provera spelovanja završena: %1 reč(i) je izmenjeno',ieSpellDownload:'Provera spelovanja nije instalirana. Da li želite da je skinete sa Interneta?'},smiley:{toolbar:'Smajli',title:'Unesi smajlija',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'Nabrojiva lista',bulletedlist:'Nenabrojiva lista',indent:'Uvećaj levu marginu',outdent:'Smanji levu marginu',justify:{left:'Levo ravnanje',center:'Centriran tekst',right:'Desno ravnanje',block:'Obostrano ravnanje'},blockquote:'Block Quote',clipboard:{title:'Zalepi',cutError:'Sigurnosna podešavanja Vašeg pretraživača ne dozvoljavaju operacije automatskog isecanja teksta. Molimo Vas da koristite prečicu sa tastature (Ctrl/Cmd+X).',copyError:'Sigurnosna podešavanja Vašeg pretraživača ne dozvoljavaju operacije automatskog kopiranja teksta. Molimo Vas da koristite prečicu sa tastature (Ctrl/Cmd+C).',pasteMsg:'Molimo Vas da zalepite unutar donje povrine koristeći tastaturnu prečicu (<STRONG>Ctrl/Cmd+V</STRONG>) i da pritisnete <STRONG>OK</STRONG>.',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'Zalepi iz Worda',title:'Zalepi iz Worda',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'Zalepi kao čist tekst',title:'Zalepi kao čist tekst'},templates:{button:'Obrasci',title:'Obrasci za sadržaj',options:'Template Options',insertOption:'Replace actual contents',selectPromptMsg:'Molimo Vas da odaberete obrazac koji ce biti primenjen na stranicu (trenutni sadržaj ce biti obrisan):',emptyListMsg:'(Nema definisanih obrazaca)'},showBlocks:'Show Blocks',stylesCombo:{label:'Stil',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'Format',panelTitle:'Format',tag_p:'Normal',tag_pre:'Formatirano',tag_address:'Adresa',tag_h1:'Naslov 1',tag_h2:'Naslov 2',tag_h3:'Naslov 3',tag_h4:'Naslov 4',tag_h5:'Naslov 5',tag_h6:'Naslov 6',tag_div:'Normal (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'Font',voiceLabel:'Font',panelTitle:'Font'},fontSize:{label:'Veličina fonta',voiceLabel:'Font Size',panelTitle:'Veličina fonta'},colorButton:{textColorTitle:'Boja teksta',bgColorTitle:'Boja pozadine',panelTitle:'Colors',auto:'Automatski',more:'Više boja...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'Osobine dokumenta',title:'Osobine dokumenta',design:'Design',meta:'Metapodaci',chooseColor:'Choose',other:'<остало>',docTitle:'Naslov stranice',charset:'Kodiranje skupa karaktera',charsetOther:'Ostala kodiranja skupa karaktera',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'Zaglavlje tipa dokumenta',docTypeOther:'Ostala zaglavlja tipa dokumenta',xhtmlDec:'Ukljuci XHTML deklaracije',bgColor:'Boja pozadine',bgImage:'URL pozadinske slike',bgFixed:'Fiksirana pozadina',txtColor:'Boja teksta',margin:'Margine stranice',marginTop:'Gornja',marginLeft:'Leva',marginRight:'Desna',marginBottom:'Donja',metaKeywords:'Ključne reci za indeksiranje dokumenta (razdvojene zarezima)',metaDescription:'Opis dokumenta',metaAuthor:'Autor',metaCopyright:'Autorska prava',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/sv.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/sv.js
index a9caecd..cc1536a 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/sv.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/sv.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.sv={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Källa',newPage:'Ny sida',save:'Spara',preview:'Förhandsgranska',cut:'Klipp ut',copy:'Kopiera',paste:'Klistra in',print:'Skriv ut',underline:'Understruken',bold:'Fet',italic:'Kursiv',selectAll:'Markera allt',removeFormat:'Radera formatering',strike:'Genomstruken',subscript:'Nedsänkta tecken',superscript:'Upphöjda tecken',horizontalrule:'Infoga horisontal linje',pagebreak:'Infoga sidbrytning',pagebreakAlt:'Sidbrytning',unlink:'Radera länk',undo:'Ångra',redo:'Gör om',common:{browseServer:'Bläddra på server',url:'URL',protocol:'Protokoll',upload:'Ladda upp',uploadSubmit:'Skicka till server',image:'Bild',flash:'Flash',form:'Formulär',checkbox:'Kryssruta',radio:'Alternativknapp',textField:'Textfält',textarea:'Textruta',hiddenField:'Dolt fält',button:'Knapp',select:'Flervalslista',imageButton:'Bildknapp',notSet:'<ej angivet>',id:'Id',name:'Namn',langDir:'Språkriktning',langDirLtr:'Vänster till Höger (VTH)',langDirRtl:'Höger till Vänster (HTV)',langCode:'Språkkod',longDescr:'URL-beskrivning',cssClass:'Stilmall',advisoryTitle:'Titel',cssStyle:'Stilmall',ok:'OK',cancel:'Avbryt',close:'Stäng',preview:'Förhandsgranska',generalTab:'Allmänt',advancedTab:'Avancerad',validateNumberFailed:'Värdet är inte ett nummer.',confirmNewPage:'Alla ändringar i innehållet kommer att förloras. Är du säker på att du vill ladda en ny sida?',confirmCancel:'Några av de alternativ har ändrats. Är du säker på att stänga dialogrutan?',options:'Alternativ',target:'Mål',targetNew:'Nytt fönster (_blank)',targetTop:'Översta fönstret (_top)',targetSelf:'Samma fönster (_self)',targetParent:'Föregående fönster (_parent)',langDirLTR:'Vänster till höger (LTR)',langDirRTL:'Höger till vänster (RTL)',styles:'Stil',cssClasses:'Stilmallar',width:'Bredd',height:'Höjd',align:'Justering',alignLeft:'Vänster',alignRight:'Höger',alignCenter:'Centrerad',alignTop:'Överkant',alignMiddle:'Mitten',alignBottom:'Nederkant',invalidHeight:'Höjd måste vara ett nummer.',invalidWidth:'Bredd måste vara ett nummer.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, Ej tillgänglig</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Klistra in utökat tecken',title:'Välj utökat tecken',options:'Special Character Options'},link:{toolbar:'Infoga/Redigera länk',other:'<annan>',menu:'Redigera länk',title:'Länk',info:'Länkinformation',target:'Mål',upload:'Ladda upp',advanced:'Avancerad',type:'Länktyp',toUrl:'URL',toAnchor:'Ankare i sidan',toEmail:'E-post',targetFrame:'<ram>',targetPopup:'<popup-fönster>',targetFrameName:'Målets ramnamn',targetPopupName:'Popup-fönstrets namn',popupFeatures:'Popup-fönstrets egenskaper',popupResizable:'Resizable',popupStatusBar:'Statusfält',popupLocationBar:'Adressfält',popupToolbar:'Verktygsfält',popupMenuBar:'Menyfält',popupFullScreen:'Helskärm (endast IE)',popupScrollBars:'Scrolllista',popupDependent:'Beroende (endast Netscape)',popupLeft:'Position från vänster',popupTop:'Position från sidans topp',id:'Id',langDir:'Språkriktning',langDirLTR:'Vänster till höger (VTH)',langDirRTL:'Höger till vänster (HTV)',acccessKey:'Behörighetsnyckel',name:'Namn',langCode:'Språkriktning',tabIndex:'Tabindex',advisoryTitle:'Titel',advisoryContentType:'Innehållstyp',cssClasses:'Stylesheet class',charset:'Teckenuppställning',styles:'Stilmall',rel:'Relationship',selectAnchor:'Välj ett ankare',anchorName:'efter ankarnamn',anchorId:'efter objektid',emailAddress:'E-postadress',emailSubject:'Ämne',emailBody:'Innehåll',noAnchors:'(Inga ankare kunde hittas)',noUrl:'Var god ange länkens URL',noEmail:'Var god ange E-postadress'},anchor:{toolbar:'Infoga/Redigera ankarlänk',menu:'Egenskaper för ankarlänk',title:'Egenskaper för ankarlänk',name:'Ankarnamn',errorName:'Var god ange ett ankarnamn',remove:'Remove Anchor'},list:{numberedTitle:'Egenskaper för punktlista',bulletedTitle:'Egenskaper för punktlista',type:'Typ',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Cirkel',disc:'Disk',square:'Fyrkant',none:'Ingen',notset:'<ej angiven>',armenian:'Armenisk numrering',georgian:'Georgisk numrering (an, ban, gan, etc.)',lowerRoman:'Romerska gemener (i, ii, iii, iv, v, etc.)',upperRoman:'Romerska versaler (I, II, III, IV, V, etc.)',lowerAlpha:'Alpha gemener (a, b, c, d, e, etc.)',upperAlpha:'Alpha versaler (A, B, C, D, E, etc.)',lowerGreek:'Grekiska gemener (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal nolla (01, 02, 03, etc.)'},findAndReplace:{title:'Sök och ersätt',find:'Sök',replace:'Ersätt',findWhat:'Sök efter:',replaceWith:'Ersätt med:',notFoundMsg:'Angiven text kunde ej hittas.',findOptions:'Find Options',matchCase:'Skiftläge',matchWord:'Inkludera hela ord',matchCyclic:'Matcha cykliska',replaceAll:'Ersätt alla',replaceSuccessMsg:'%1 förekomst(er) ersatta.'},table:{toolbar:'Tabell',title:'Tabellegenskaper',menu:'Tabellegenskaper',deleteTable:'Radera tabell',rows:'Rader',columns:'Kolumner',border:'Kantstorlek',widthPx:'pixlar',widthPc:'procent',widthUnit:'enhet bredd',cellSpace:'Cellavstånd',cellPad:'Cellutfyllnad',caption:'Rubrik',summary:'Sammanfattning',headers:'Ruberiker',headersNone:'Ingen',headersColumn:'Första kolumnen',headersRow:'Första raden',headersBoth:'Båda',invalidRows:'Antal rader måste vara större än 0.',invalidCols:'Antal kolumner måste vara ett nummer större än 0.',invalidBorder:'Ram måste vara ett nummer.',invalidWidth:'Tabell måste vara ett nummer.',invalidHeight:'Tabellens höjd måste vara ett nummer.',invalidCellSpacing:'Luft i cell måste vara ett nummer.',invalidCellPadding:'Luft i cell måste vara ett nummer.',cell:{menu:'Cell',insertBefore:'Lägg till cell före',insertAfter:'Lägg till cell efter',deleteCell:'Radera celler',merge:'Sammanfoga celler',mergeRight:'Sammanfoga höger',mergeDown:'Sammanfoga ner',splitHorizontal:'Dela cell horisontellt',splitVertical:'Dela cell vertikalt',title:'Egenskaper för cell',cellType:'Celltyp',rowSpan:'Rad spann',colSpan:'Kolumnen spann',wordWrap:'Radbrytning',hAlign:'Horisontell justering',vAlign:'Vertikal justering',alignBaseline:'Baslinje',bgColor:'Bakgrundsfärg',borderColor:'Ramfärg',data:'Data',header:'Rubrik',yes:'Ja',no:'Nej',invalidWidth:'Cellens bredd måste vara ett nummer.',invalidHeight:'Cellens höjd måste vara ett nummer.',invalidRowSpan:'Radutvidgning måste vara ett heltal.',invalidColSpan:'Kolumn måste vara ett heltal.',chooseColor:'Välj'},row:{menu:'Rad',insertBefore:'Lägg till Rad Före',insertAfter:'Lägg till rad efter',deleteRow:'Radera rad'},column:{menu:'Kolumn',insertBefore:'Lägg till kolumn före',insertAfter:'Lägg till kolumn efter',deleteColumn:'Radera kolumn'}},button:{title:'Egenskaper för knapp',text:'Text (värde)',type:'Typ',typeBtn:'Knapp',typeSbm:'Skicka',typeRst:'Återställ'},checkboxAndRadio:{checkboxTitle:'Egenskaper för kryssruta',radioTitle:'Egenskaper för alternativknapp',value:'Värde',selected:'Vald'},form:{title:'Egenskaper för formulär',menu:'Egenskaper för formulär',action:'Funktion',method:'Metod',encoding:'Kodning'},select:{title:'Egenskaper för flervalslista',selectInfo:'Information',opAvail:'Befintliga val',value:'Värde',size:'Storlek',lines:'Linjer',chkMulti:'Tillåt flerval',opText:'Text',opValue:'Värde',btnAdd:'Lägg till',btnModify:'Redigera',btnUp:'Upp',btnDown:'Ner',btnSetValue:'Markera som valt värde',btnDelete:'Radera'},textarea:{title:'Egenskaper för textruta',cols:'Kolumner',rows:'Rader'},textfield:{title:'Egenskaper för textfält',name:'Namn',value:'Värde',charWidth:'Teckenbredd',maxChars:'Max antal tecken',type:'Typ',typeText:'Text',typePass:'Lösenord'},hidden:{title:'Egenskaper för dolt fält',name:'Namn',value:'Värde'},image:{title:'Bildegenskaper',titleButton:'Egenskaper för bildknapp',menu:'Bildegenskaper',infoTab:'Bildinformation',btnUpload:'Skicka till server',upload:'Ladda upp',alt:'Alternativ text',lockRatio:'Lås höjd/bredd förhållanden',resetSize:'Återställ storlek',border:'Kant',hSpace:'Horis. marginal',vSpace:'Vert. marginal',alertUrl:'Var god och ange bildens URL',linkTab:'Länk',button2Img:'Vill du omvandla den valda bildknappen på en enkel bild?',img2Button:'Vill du omvandla den valda bildknappen på en enkel bild?',urlMissing:'Bildkällans URL saknas.',validateBorder:'Kantlinje måste vara ett heltal.',validateHSpace:'HSpace måste vara ett heltal.',validateVSpace:'VSpace måste vara ett heltal.'},flash:{properties:'Flashegenskaper',propertiesTab:'Egenskaper',title:'Flashegenskaper',chkPlay:'Automatisk uppspelning',chkLoop:'Upprepa/Loopa',chkMenu:'Aktivera Flashmeny',chkFull:'Tillåt helskärm',scale:'Skala',scaleAll:'Visa allt',scaleNoBorder:'Ingen ram',scaleFit:'Exakt passning',access:'Script-tillgång',accessAlways:'Alltid',accessSameDomain:'Samma domän',accessNever:'Aldrig',alignAbsBottom:'Absolut nederkant',alignAbsMiddle:'Absolut centrering',alignBaseline:'Baslinje',alignTextTop:'Text överkant',quality:'Kvalitet',qualityBest:'Bäst',qualityHigh:'Hög',qualityAutoHigh:'Auto Hög',qualityMedium:'Medium',qualityAutoLow:'Auto Låg',qualityLow:'Låg',windowModeWindow:'Fönster',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Fönsterläge',flashvars:'Variabler för Flash',bgcolor:'Bakgrundsfärg',hSpace:'Horis. marginal',vSpace:'Vert. marginal',validateSrc:'Var god ange länkens URL',validateHSpace:'HSpace måste vara ett nummer.',validateVSpace:'VSpace måste vara ett nummer.'},spellCheck:{toolbar:'Stavningskontroll',title:'Kontrollera stavning',notAvailable:'Tyvärr är tjänsten ej tillgänglig nu',errorLoading:'Tjänsten är ej tillgänglig: %s.',notInDic:'Saknas i ordlistan',changeTo:'Ändra till',btnIgnore:'Ignorera',btnIgnoreAll:'Ignorera alla',btnReplace:'Ersätt',btnReplaceAll:'Ersätt alla',btnUndo:'Ångra',noSuggestions:'- Förslag saknas -',progress:'Stavningskontroll pågår...',noMispell:'Stavningskontroll slutförd: Inga stavfel påträffades.',noChanges:'Stavningskontroll slutförd: Inga ord rättades.',oneChange:'Stavningskontroll slutförd: Ett ord rättades.',manyChanges:'Stavningskontroll slutförd: %1 ord rättades.',ieSpellDownload:'Stavningskontrollen är ej installerad. Vill du göra det nu?'},smiley:{toolbar:'Smiley',title:'Infoga smiley',options:'Smileyinställningar'},elementsPath:{eleLabel:'Elementets sökväg',eleTitle:'%1 element'},numberedlist:'Numrerad lista',bulletedlist:'Punktlista',indent:'Öka indrag',outdent:'Minska indrag',justify:{left:'Vänsterjustera',center:'Centrera',right:'Högerjustera',block:'Justera till marginaler'},blockquote:'Blockcitat',clipboard:{title:'Klistra in',cutError:'Säkerhetsinställningar i Er webläsare tillåter inte åtgården Klipp ut. Använd (Ctrl/Cmd+X) istället.',copyError:'Säkerhetsinställningar i Er webläsare tillåter inte åtgården Kopiera. Använd (Ctrl/Cmd+C) istället',pasteMsg:'Var god och klistra in Er text i rutan nedan genom att använda (<STRONG>Ctrl/Cmd+V</STRONG>) klicka sen på <STRONG>OK</STRONG>.',securityMsg:'På grund av din webbläsares säkerhetsinställningar kan verktyget inte få åtkomst till urklippsdatan. Var god och använd detta fönster istället.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'Texten du vill klistra in verkar vara kopierad från Word. Vill du rensa innan du klistrar?',toolbar:'Klistra in från Word',title:'Klistra in från Word',error:'Det var inte möjligt att städa upp den inklistrade data på grund av ett internt fel'},pasteText:{button:'Klistra in som vanlig text',title:'Klistra in som vanlig text'},templates:{button:'Sidmallar',title:'Sidmallar',options:'Inställningar för mall',insertOption:'Ersätt aktuellt innehåll',selectPromptMsg:'Var god välj en mall att använda med editorn<br>(allt nuvarande innehåll raderas):',emptyListMsg:'(Ingen mall är vald)'},showBlocks:'Visa block',stylesCombo:{label:'Anpassad stil',panelTitle:'Formatmallar',panelTitle1:'Blockstil',panelTitle2:'Inbäddad stil',panelTitle3:'Objektets stil'},format:{label:'Teckenformat',panelTitle:'Teckenformat',tag_p:'Normal',tag_pre:'Formaterad',tag_address:'Adress',tag_h1:'Rubrik 1',tag_h2:'Rubrik 2',tag_h3:'Rubrik 3',tag_h4:'Rubrik 4',tag_h5:'Rubrik 5',tag_h6:'Rubrik 6',tag_div:'Normal (DIV)'},div:{title:'Skapa Div container',toolbar:'Skapa Div container',cssClassInputLabel:'Stilmallar',styleSelectLabel:'Stil',IdInputLabel:'Id',languageCodeInputLabel:' Språkkod',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Rådgivande titel',langDirLabel:'Språkriktning',langDirLTRLabel:'Vänster till Höger (LTR)',langDirRTLLabel:'Höger till vänster (RTL)',edit:'Redigera Div',remove:'Ta bort Div'},iframe:{title:'iFrame Egenskaper',toolbar:'iFrame',noUrl:'Skriv in URL för iFrame',scrolling:'Aktivera rullningslister',border:'Visa ramkant'},font:{label:'Typsnitt',voiceLabel:'Typsnitt',panelTitle:'Typsnitt'},fontSize:{label:'Storlek',voiceLabel:'Teckenstorlek',panelTitle:'Storlek'},colorButton:{textColorTitle:'Textfärg',bgColorTitle:'Bakgrundsfärg',panelTitle:'Färger',auto:'Automatisk',more:'Fler färger...'},colors:{'000':'Svart',800000:'Rödbrun','8B4513':'Mörkbrun','2F4F4F':'Skiffergrå','008080':'Kricka','000080':'Marinblå','4B0082':'Indigo',696969:'Mörkgrå',B22222:'Tegelsten',A52A2A:'Brun',DAA520:'Mörk guld','006400':'Mörkgrön','40E0D0':'Turkos','0000CD':'Medium blå',800080:'Lila',808080:'Grå',F00:'Röd',FF8C00:'Mörkorange',FFD700:'Guld','008000':'Grön','0FF':'Turkos','00F':'Blå',EE82EE:'Violett',A9A9A9:'Matt grå',FFA07A:'Laxrosa',FFA500:'Orange',FFFF00:'Gul','00FF00':'Lime',AFEEEE:'Ljusturkos',ADD8E6:'Ljusblå',DDA0DD:'Plommon',D3D3D3:'Ljusgrå',FFF0F5:'Ljus lavender',FAEBD7:'Antikvit',FFFFE0:'Ljusgul',F0FFF0:'Honung',F0FFFF:'Azurblå',F0F8FF:'Aliceblå',E6E6FA:'Lavender',FFF:'Vit'},scayt:{title:'Stavningskontroll medan du skriver',opera_title:'Stöds ej av Opera',enable:'Aktivera SCAYT',disable:'Inaktivera SCAYT',about:'Om SCAYT',toggle:'Växla SCAYT',options:'Inställningar',langs:'Språk',moreSuggestions:'Fler förslag',ignore:'Ignorera',ignoreAll:'Ignorera alla',addWord:'Lägg till ord',emptyDic:'Ordlistans namn får ej vara tomt.',optionsTab:'Inställningar',allCaps:'Ignorera alla ord med enbart versaler',ignoreDomainNames:'Ignorera domännamn',mixedCase:'Ignorera ord med blandat shiftläge',mixedWithDigits:'Ignorera ord med nummer',languagesTab:'Språk',dictionariesTab:'Ordlistor',dic_field_name:'Ordlistans namn',dic_create:'Skapa',dic_restore:'Återställ',dic_delete:'Ta bort',dic_rename:'Byt namn',dic_info:'Inledningsvis lagras ordlistan i en cookie. När ordlista växer till en punkt där det inte kan lagras i en cookie, lagras den på vår server. För att lagra din personliga ordlista på vår server du ska ange ett namn för din ordbok. Om du redan har en lagrad ordbok, skriv namnet och klicka på knappen Återställ.',aboutTab:'Om'},about:{title:'Om CKEditor',dlgTitle:'Om CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'För information av licenciering besök vår hemsida:',copy:'Copyright © $1. Alla rättigheter reserverade.'},maximize:'Maximera',minimize:'Minimera',fakeobjects:{anchor:'Ankare',flash:'Flashanimation',iframe:'iFrame',hiddenfield:'Gömt fält',unknown:'Okänt objekt'},resize:'Dra för att ändra storlek',colordialog:{title:'Välj färg',options:'Färgalternativ',highlight:'Markera',selected:'Vald färg',clear:'Rensa'},toolbarCollapse:'Dölj verktygsfält',toolbarExpand:'Visa verktygsfält',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text riktning från vänster till höger',rtl:'Text riktning från höger till vänster'},docprops:{label:'Dokumentegenskaper',title:'Dokumentegenskaper',design:'Design',meta:'Metadata',chooseColor:'Välj',other:'<annan>',docTitle:'Sidtitel',charset:'Teckenuppsättningar',charsetOther:'Övriga teckenuppsättningar',charsetASCII:'ASCII',charsetCE:'Central Europa',charsetCT:'Traditionell Kinesisk (Big5)',charsetCR:'Kyrillisk',charsetGR:'Grekiska',charsetJP:'Japanska',charsetKR:'Koreanska',charsetTR:'Turkiska',charsetUN:'Unicode (UTF-8)',charsetWE:'Väst Europa',docType:'Sidhuvud',docTypeOther:'Övriga sidhuvuden',xhtmlDec:'Inkludera XHTML deklaration',bgColor:'Bakgrundsfärg',bgImage:'Bakgrundsbildens URL',bgFixed:'Fast bakgrund',txtColor:'Textfärg',margin:'Sidmarginal',marginTop:'Topp',marginLeft:'Vänster',marginRight:'Höger',marginBottom:'Botten',metaKeywords:'Sidans nyckelord',metaDescription:'Sidans beskrivning',metaAuthor:'Författare',metaCopyright:'Upphovsrätt',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.sv={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'Källa',newPage:'Ny sida',save:'Spara',preview:'Förhandsgranska',cut:'Klipp ut',copy:'Kopiera',paste:'Klistra in',print:'Skriv ut',underline:'Understruken',bold:'Fet',italic:'Kursiv',selectAll:'Markera allt',removeFormat:'Radera formatering',strike:'Genomstruken',subscript:'Nedsänkta tecken',superscript:'Upphöjda tecken',horizontalrule:'Infoga horisontal linje',pagebreak:'Infoga sidbrytning',pagebreakAlt:'Sidbrytning',unlink:'Radera länk',undo:'Ångra',redo:'Gör om',common:{browseServer:'Bläddra på server',url:'URL',protocol:'Protokoll',upload:'Ladda upp',uploadSubmit:'Skicka till server',image:'Bild',flash:'Flash',form:'Formulär',checkbox:'Kryssruta',radio:'Alternativknapp',textField:'Textfält',textarea:'Textruta',hiddenField:'Dolt fält',button:'Knapp',select:'Flervalslista',imageButton:'Bildknapp',notSet:'<ej angivet>',id:'Id',name:'Namn',langDir:'Språkriktning',langDirLtr:'Vänster till Höger (VTH)',langDirRtl:'Höger till Vänster (HTV)',langCode:'Språkkod',longDescr:'URL-beskrivning',cssClass:'Stilmall',advisoryTitle:'Titel',cssStyle:'Stilmall',ok:'OK',cancel:'Avbryt',close:'Stäng',preview:'Förhandsgranska',generalTab:'Allmänt',advancedTab:'Avancerad',validateNumberFailed:'Värdet är inte ett nummer.',confirmNewPage:'Alla ändringar i innehållet kommer att förloras. Är du säker på att du vill ladda en ny sida?',confirmCancel:'Några av de alternativ har ändrats. Är du säker på att stänga dialogrutan?',options:'Alternativ',target:'Mål',targetNew:'Nytt fönster (_blank)',targetTop:'Översta fönstret (_top)',targetSelf:'Samma fönster (_self)',targetParent:'Föregående fönster (_parent)',langDirLTR:'Vänster till höger (LTR)',langDirRTL:'Höger till vänster (RTL)',styles:'Stil',cssClasses:'Stilmallar',width:'Bredd',height:'Höjd',align:'Justering',alignLeft:'Vänster',alignRight:'Höger',alignCenter:'Centrerad',alignTop:'Överkant',alignMiddle:'Mitten',alignBottom:'Nederkant',invalidHeight:'Höjd måste vara ett nummer.',invalidWidth:'Bredd måste vara ett nummer.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, Ej tillgänglig</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'Klistra in utökat tecken',title:'Välj utökat tecken',options:'Special Character Options'},link:{toolbar:'Infoga/Redigera länk',other:'<annan>',menu:'Redigera länk',title:'Länk',info:'Länkinformation',target:'Mål',upload:'Ladda upp',advanced:'Avancerad',type:'Länktyp',toUrl:'URL',toAnchor:'Ankare i sidan',toEmail:'E-post',targetFrame:'<ram>',targetPopup:'<popup-fönster>',targetFrameName:'Målets ramnamn',targetPopupName:'Popup-fönstrets namn',popupFeatures:'Popup-fönstrets egenskaper',popupResizable:'Resizable',popupStatusBar:'Statusfält',popupLocationBar:'Adressfält',popupToolbar:'Verktygsfält',popupMenuBar:'Menyfält',popupFullScreen:'Helskärm (endast IE)',popupScrollBars:'Scrolllista',popupDependent:'Beroende (endast Netscape)',popupLeft:'Position från vänster',popupTop:'Position från sidans topp',id:'Id',langDir:'Språkriktning',langDirLTR:'Vänster till höger (VTH)',langDirRTL:'Höger till vänster (HTV)',acccessKey:'Behörighetsnyckel',name:'Namn',langCode:'Språkriktning',tabIndex:'Tabindex',advisoryTitle:'Titel',advisoryContentType:'Innehållstyp',cssClasses:'Stylesheet class',charset:'Teckenuppställning',styles:'Stilmall',rel:'Relationship',selectAnchor:'Välj ett ankare',anchorName:'efter ankarnamn',anchorId:'efter objektid',emailAddress:'E-postadress',emailSubject:'Ämne',emailBody:'Innehåll',noAnchors:'(Inga ankare kunde hittas)',noUrl:'Var god ange länkens URL',noEmail:'Var god ange E-postadress'},anchor:{toolbar:'Infoga/Redigera ankarlänk',menu:'Egenskaper för ankarlänk',title:'Egenskaper för ankarlänk',name:'Ankarnamn',errorName:'Var god ange ett ankarnamn',remove:'Remove Anchor'},list:{numberedTitle:'Egenskaper för punktlista',bulletedTitle:'Egenskaper för punktlista',type:'Typ',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Cirkel',disc:'Disk',square:'Fyrkant',none:'Ingen',notset:'<ej angiven>',armenian:'Armenisk numrering',georgian:'Georgisk numrering (an, ban, gan, etc.)',lowerRoman:'Romerska gemener (i, ii, iii, iv, v, etc.)',upperRoman:'Romerska versaler (I, II, III, IV, V, etc.)',lowerAlpha:'Alpha gemener (a, b, c, d, e, etc.)',upperAlpha:'Alpha versaler (A, B, C, D, E, etc.)',lowerGreek:'Grekiska gemener (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal nolla (01, 02, 03, etc.)'},findAndReplace:{title:'Sök och ersätt',find:'Sök',replace:'Ersätt',findWhat:'Sök efter:',replaceWith:'Ersätt med:',notFoundMsg:'Angiven text kunde ej hittas.',findOptions:'Find Options',matchCase:'Skiftläge',matchWord:'Inkludera hela ord',matchCyclic:'Matcha cykliska',replaceAll:'Ersätt alla',replaceSuccessMsg:'%1 förekomst(er) ersatta.'},table:{toolbar:'Tabell',title:'Tabellegenskaper',menu:'Tabellegenskaper',deleteTable:'Radera tabell',rows:'Rader',columns:'Kolumner',border:'Kantstorlek',widthPx:'pixlar',widthPc:'procent',widthUnit:'enhet bredd',cellSpace:'Cellavstånd',cellPad:'Cellutfyllnad',caption:'Rubrik',summary:'Sammanfattning',headers:'Ruberiker',headersNone:'Ingen',headersColumn:'Första kolumnen',headersRow:'Första raden',headersBoth:'Båda',invalidRows:'Antal rader måste vara större än 0.',invalidCols:'Antal kolumner måste vara ett nummer större än 0.',invalidBorder:'Ram måste vara ett nummer.',invalidWidth:'Tabell måste vara ett nummer.',invalidHeight:'Tabellens höjd måste vara ett nummer.',invalidCellSpacing:'Luft i cell måste vara ett nummer.',invalidCellPadding:'Luft i cell måste vara ett nummer.',cell:{menu:'Cell',insertBefore:'Lägg till cell före',insertAfter:'Lägg till cell efter',deleteCell:'Radera celler',merge:'Sammanfoga celler',mergeRight:'Sammanfoga höger',mergeDown:'Sammanfoga ner',splitHorizontal:'Dela cell horisontellt',splitVertical:'Dela cell vertikalt',title:'Egenskaper för cell',cellType:'Celltyp',rowSpan:'Rad spann',colSpan:'Kolumnen spann',wordWrap:'Radbrytning',hAlign:'Horisontell justering',vAlign:'Vertikal justering',alignBaseline:'Baslinje',bgColor:'Bakgrundsfärg',borderColor:'Ramfärg',data:'Data',header:'Rubrik',yes:'Ja',no:'Nej',invalidWidth:'Cellens bredd måste vara ett nummer.',invalidHeight:'Cellens höjd måste vara ett nummer.',invalidRowSpan:'Radutvidgning måste vara ett heltal.',invalidColSpan:'Kolumn måste vara ett heltal.',chooseColor:'Välj'},row:{menu:'Rad',insertBefore:'Lägg till Rad Före',insertAfter:'Lägg till rad efter',deleteRow:'Radera rad'},column:{menu:'Kolumn',insertBefore:'Lägg till kolumn före',insertAfter:'Lägg till kolumn efter',deleteColumn:'Radera kolumn'}},button:{title:'Egenskaper för knapp',text:'Text (värde)',type:'Typ',typeBtn:'Knapp',typeSbm:'Skicka',typeRst:'Återställ'},checkboxAndRadio:{checkboxTitle:'Egenskaper för kryssruta',radioTitle:'Egenskaper för alternativknapp',value:'Värde',selected:'Vald'},form:{title:'Egenskaper för formulär',menu:'Egenskaper för formulär',action:'Funktion',method:'Metod',encoding:'Kodning'},select:{title:'Egenskaper för flervalslista',selectInfo:'Information',opAvail:'Befintliga val',value:'Värde',size:'Storlek',lines:'Linjer',chkMulti:'Tillåt flerval',opText:'Text',opValue:'Värde',btnAdd:'Lägg till',btnModify:'Redigera',btnUp:'Upp',btnDown:'Ner',btnSetValue:'Markera som valt värde',btnDelete:'Radera'},textarea:{title:'Egenskaper för textruta',cols:'Kolumner',rows:'Rader'},textfield:{title:'Egenskaper för textfält',name:'Namn',value:'Värde',charWidth:'Teckenbredd',maxChars:'Max antal tecken',type:'Typ',typeText:'Text',typePass:'Lösenord'},hidden:{title:'Egenskaper för dolt fält',name:'Namn',value:'Värde'},image:{title:'Bildegenskaper',titleButton:'Egenskaper för bildknapp',menu:'Bildegenskaper',infoTab:'Bildinformation',btnUpload:'Skicka till server',upload:'Ladda upp',alt:'Alternativ text',lockRatio:'Lås höjd/bredd förhållanden',resetSize:'Återställ storlek',border:'Kant',hSpace:'Horis. marginal',vSpace:'Vert. marginal',alertUrl:'Var god och ange bildens URL',linkTab:'Länk',button2Img:'Vill du omvandla den valda bildknappen på en enkel bild?',img2Button:'Vill du omvandla den valda bildknappen på en enkel bild?',urlMissing:'Bildkällans URL saknas.',validateBorder:'Kantlinje måste vara ett heltal.',validateHSpace:'HSpace måste vara ett heltal.',validateVSpace:'VSpace måste vara ett heltal.'},flash:{properties:'Flashegenskaper',propertiesTab:'Egenskaper',title:'Flashegenskaper',chkPlay:'Automatisk uppspelning',chkLoop:'Upprepa/Loopa',chkMenu:'Aktivera Flashmeny',chkFull:'Tillåt helskärm',scale:'Skala',scaleAll:'Visa allt',scaleNoBorder:'Ingen ram',scaleFit:'Exakt passning',access:'Script-tillgång',accessAlways:'Alltid',accessSameDomain:'Samma domän',accessNever:'Aldrig',alignAbsBottom:'Absolut nederkant',alignAbsMiddle:'Absolut centrering',alignBaseline:'Baslinje',alignTextTop:'Text överkant',quality:'Kvalitet',qualityBest:'Bäst',qualityHigh:'Hög',qualityAutoHigh:'Auto Hög',qualityMedium:'Medium',qualityAutoLow:'Auto Låg',qualityLow:'Låg',windowModeWindow:'Fönster',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Fönsterläge',flashvars:'Variabler för Flash',bgcolor:'Bakgrundsfärg',hSpace:'Horis. marginal',vSpace:'Vert. marginal',validateSrc:'Var god ange länkens URL',validateHSpace:'HSpace måste vara ett nummer.',validateVSpace:'VSpace måste vara ett nummer.'},spellCheck:{toolbar:'Stavningskontroll',title:'Kontrollera stavning',notAvailable:'Tyvärr är tjänsten ej tillgänglig nu',errorLoading:'Tjänsten är ej tillgänglig: %s.',notInDic:'Saknas i ordlistan',changeTo:'Ändra till',btnIgnore:'Ignorera',btnIgnoreAll:'Ignorera alla',btnReplace:'Ersätt',btnReplaceAll:'Ersätt alla',btnUndo:'Ångra',noSuggestions:'- Förslag saknas -',progress:'Stavningskontroll pågår...',noMispell:'Stavningskontroll slutförd: Inga stavfel påträffades.',noChanges:'Stavningskontroll slutförd: Inga ord rättades.',oneChange:'Stavningskontroll slutförd: Ett ord rättades.',manyChanges:'Stavningskontroll slutförd: %1 ord rättades.',ieSpellDownload:'Stavningskontrollen är ej installerad. Vill du göra det nu?'},smiley:{toolbar:'Smiley',title:'Infoga smiley',options:'Smileyinställningar'},elementsPath:{eleLabel:'Elementets sökväg',eleTitle:'%1 element'},numberedlist:'Numrerad lista',bulletedlist:'Punktlista',indent:'Öka indrag',outdent:'Minska indrag',justify:{left:'Vänsterjustera',center:'Centrera',right:'Högerjustera',block:'Justera till marginaler'},blockquote:'Blockcitat',clipboard:{title:'Klistra in',cutError:'Säkerhetsinställningar i Er webläsare tillåter inte åtgården Klipp ut. Använd (Ctrl/Cmd+X) istället.',copyError:'Säkerhetsinställningar i Er webläsare tillåter inte åtgården Kopiera. Använd (Ctrl/Cmd+C) istället',pasteMsg:'Var god och klistra in Er text i rutan nedan genom att använda (<STRONG>Ctrl/Cmd+V</STRONG>) klicka sen på <STRONG>OK</STRONG>.',securityMsg:'På grund av din webbläsares säkerhetsinställningar kan verktyget inte få åtkomst till urklippsdatan. Var god och använd detta fönster istället.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'Texten du vill klistra in verkar vara kopierad från Word. Vill du rensa innan du klistrar?',toolbar:'Klistra in från Word',title:'Klistra in från Word',error:'Det var inte möjligt att städa upp den inklistrade data på grund av ett internt fel'},pasteText:{button:'Klistra in som vanlig text',title:'Klistra in som vanlig text'},templates:{button:'Sidmallar',title:'Sidmallar',options:'Inställningar för mall',insertOption:'Ersätt aktuellt innehåll',selectPromptMsg:'Var god välj en mall att använda med editorn<br>(allt nuvarande innehåll raderas):',emptyListMsg:'(Ingen mall är vald)'},showBlocks:'Visa block',stylesCombo:{label:'Anpassad stil',panelTitle:'Formatmallar',panelTitle1:'Blockstil',panelTitle2:'Inbäddad stil',panelTitle3:'Objektets stil'},format:{label:'Teckenformat',panelTitle:'Teckenformat',tag_p:'Normal',tag_pre:'Formaterad',tag_address:'Adress',tag_h1:'Rubrik 1',tag_h2:'Rubrik 2',tag_h3:'Rubrik 3',tag_h4:'Rubrik 4',tag_h5:'Rubrik 5',tag_h6:'Rubrik 6',tag_div:'Normal (DIV)'},div:{title:'Skapa Div container',toolbar:'Skapa Div container',cssClassInputLabel:'Stilmallar',styleSelectLabel:'Stil',IdInputLabel:'Id',languageCodeInputLabel:' Språkkod',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Rådgivande titel',langDirLabel:'Språkriktning',langDirLTRLabel:'Vänster till Höger (LTR)',langDirRTLLabel:'Höger till vänster (RTL)',edit:'Redigera Div',remove:'Ta bort Div'},iframe:{title:'iFrame Egenskaper',toolbar:'iFrame',noUrl:'Skriv in URL för iFrame',scrolling:'Aktivera rullningslister',border:'Visa ramkant'},font:{label:'Typsnitt',voiceLabel:'Typsnitt',panelTitle:'Typsnitt'},fontSize:{label:'Storlek',voiceLabel:'Teckenstorlek',panelTitle:'Storlek'},colorButton:{textColorTitle:'Textfärg',bgColorTitle:'Bakgrundsfärg',panelTitle:'Färger',auto:'Automatisk',more:'Fler färger...'},colors:{'000':'Svart',800000:'Rödbrun','8B4513':'Mörkbrun','2F4F4F':'Skiffergrå','008080':'Kricka','000080':'Marinblå','4B0082':'Indigo',696969:'Mörkgrå',B22222:'Tegelsten',A52A2A:'Brun',DAA520:'Mörk guld','006400':'Mörkgrön','40E0D0':'Turkos','0000CD':'Medium blå',800080:'Lila',808080:'Grå',F00:'Röd',FF8C00:'Mörkorange',FFD700:'Guld','008000':'Grön','0FF':'Turkos','00F':'Blå',EE82EE:'Violett',A9A9A9:'Matt grå',FFA07A:'Laxrosa',FFA500:'Orange',FFFF00:'Gul','00FF00':'Lime',AFEEEE:'Ljusturkos',ADD8E6:'Ljusblå',DDA0DD:'Plommon',D3D3D3:'Ljusgrå',FFF0F5:'Ljus lavender',FAEBD7:'Antikvit',FFFFE0:'Ljusgul',F0FFF0:'Honung',F0FFFF:'Azurblå',F0F8FF:'Aliceblå',E6E6FA:'Lavender',FFF:'Vit'},scayt:{title:'Stavningskontroll medan du skriver',opera_title:'Stöds ej av Opera',enable:'Aktivera SCAYT',disable:'Inaktivera SCAYT',about:'Om SCAYT',toggle:'Växla SCAYT',options:'Inställningar',langs:'Språk',moreSuggestions:'Fler förslag',ignore:'Ignorera',ignoreAll:'Ignorera alla',addWord:'Lägg till ord',emptyDic:'Ordlistans namn får ej vara tomt.',optionsTab:'Inställningar',allCaps:'Ignorera alla ord med enbart versaler',ignoreDomainNames:'Ignorera domännamn',mixedCase:'Ignorera ord med blandat shiftläge',mixedWithDigits:'Ignorera ord med nummer',languagesTab:'Språk',dictionariesTab:'Ordlistor',dic_field_name:'Ordlistans namn',dic_create:'Skapa',dic_restore:'Återställ',dic_delete:'Ta bort',dic_rename:'Byt namn',dic_info:'Inledningsvis lagras ordlistan i en cookie. När ordlista växer till en punkt där det inte kan lagras i en cookie, lagras den på vår server. För att lagra din personliga ordlista på vår server du ska ange ett namn för din ordbok. Om du redan har en lagrad ordbok, skriv namnet och klicka på knappen Återställ.',aboutTab:'Om'},about:{title:'Om CKEditor',dlgTitle:'Om CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'För information av licenciering besök vår hemsida:',copy:'Copyright © $1. Alla rättigheter reserverade.'},maximize:'Maximera',minimize:'Minimera',fakeobjects:{anchor:'Ankare',flash:'Flashanimation',iframe:'iFrame',hiddenfield:'Gömt fält',unknown:'Okänt objekt'},resize:'Dra för att ändra storlek',colordialog:{title:'Välj färg',options:'Färgalternativ',highlight:'Markera',selected:'Vald färg',clear:'Rensa'},toolbarCollapse:'Dölj verktygsfält',toolbarExpand:'Visa verktygsfält',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text riktning från vänster till höger',rtl:'Text riktning från höger till vänster'},docprops:{label:'Dokumentegenskaper',title:'Dokumentegenskaper',design:'Design',meta:'Metadata',chooseColor:'Välj',other:'<annan>',docTitle:'Sidtitel',charset:'Teckenuppsättningar',charsetOther:'Övriga teckenuppsättningar',charsetASCII:'ASCII',charsetCE:'Central Europa',charsetCT:'Traditionell Kinesisk (Big5)',charsetCR:'Kyrillisk',charsetGR:'Grekiska',charsetJP:'Japanska',charsetKR:'Koreanska',charsetTR:'Turkiska',charsetUN:'Unicode (UTF-8)',charsetWE:'Väst Europa',docType:'Sidhuvud',docTypeOther:'Övriga sidhuvuden',xhtmlDec:'Inkludera XHTML deklaration',bgColor:'Bakgrundsfärg',bgImage:'Bakgrundsbildens URL',bgFixed:'Fast bakgrund',txtColor:'Textfärg',margin:'Sidmarginal',marginTop:'Topp',marginLeft:'Vänster',marginRight:'Höger',marginBottom:'Botten',metaKeywords:'Sidans nyckelord',metaDescription:'Sidans beskrivning',metaAuthor:'Författare',metaCopyright:'Upphovsrätt',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/th.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/th.js
index a6718db..0875570 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/th.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/th.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.th={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'ดูรหัส HTML',newPage:'สร้างหน้าเอกสารใหม่',save:'บันทึก',preview:'ดูหน้าเอกสารตัวอย่าง',cut:'ตัด',copy:'สำเนา',paste:'วาง',print:'สั่งพิมพ์',underline:'ตัวขีดเส้นใต้',bold:'ตัวหนา',italic:'ตัวเอียง',selectAll:'เลือกทั้งหมด',removeFormat:'ล้างรูปแบบ',strike:'ตัวขีดเส้นทับ',subscript:'ตัวห้อย',superscript:'ตัวยก',horizontalrule:'แทรกเส้นคั่นบรรทัด',pagebreak:'แทรกตัวแบ่งหน้า Page Break',pagebreakAlt:'Page Break',unlink:'ลบ ลิงค์',undo:'ยกเลิกคำสั่ง',redo:'ทำซ้ำคำสั่ง',common:{browseServer:'เปิดหน้าต่างจัดการไฟล์อัพโหลด',url:'ที่อยู่อ้างอิง URL',protocol:'โปรโตคอล',upload:'อัพโหลดไฟล์',uploadSubmit:'อัพโหลดไฟล์ไปเก็บไว้ที่เครื่องแม่ข่าย (เซิร์ฟเวอร์)',image:'รูปภาพ',flash:'ไฟล์ Flash',form:'แบบฟอร์ม',checkbox:'เช็คบ๊อก',radio:'เรดิโอบัตตอน',textField:'เท็กซ์ฟิลด์',textarea:'เท็กซ์แอเรีย',hiddenField:'ฮิดเดนฟิลด์',button:'ปุ่ม',select:'แถบตัวเลือก',imageButton:'ปุ่มแบบรูปภาพ',notSet:'<ไม่ระบุ>',id:'ไอดี',name:'ชื่อ',langDir:'การเขียน-อ่านภาษา',langDirLtr:'จากซ้ายไปขวา (LTR)',langDirRtl:'จากขวามาซ้าย (RTL)',langCode:'รหัสภาษา',longDescr:'คำอธิบายประกอบ URL',cssClass:'คลาสของไฟล์กำหนดลักษณะการแสดงผล',advisoryTitle:'คำเกริ่นนำ',cssStyle:'ลักษณะการแสดงผล',ok:'ตกลง',cancel:'ยกเลิก',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'ขั้นสูง',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'ความกว้าง',height:'ความสูง',align:'การจัดวาง',alignLeft:'ชิดซ้าย',alignRight:'ชิดขวา',alignCenter:'กึ่งกลาง',alignTop:'บนสุด',alignMiddle:'กึ่งกลางแนวตั้ง',alignBottom:'ชิดด้านล่าง',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'แทรกตัวอักษรพิเศษ',title:'แทรกตัวอักษรพิเศษ',options:'Special Character Options'},link:{toolbar:'แทรก/แก้ไข ลิงค์',other:'<อื่น ๆ>',menu:'แก้ไข ลิงค์',title:'ลิงค์เชื่อมโยงเว็บ อีเมล์ รูปภาพ หรือไฟล์อื่นๆ',info:'รายละเอียด',target:'การเปิดหน้าลิงค์',upload:'อัพโหลดไฟล์',advanced:'ขั้นสูง',type:'ประเภทของลิงค์',toUrl:'URL',toAnchor:'จุดเชื่อมโยง (Anchor)',toEmail:'ส่งอีเมล์ (E-Mail)',targetFrame:'<เปิดในเฟรม>',targetPopup:'<เปิดหน้าจอเล็ก (Pop-up)>',targetFrameName:'ชื่อทาร์เก็ตเฟรม',targetPopupName:'ระบุชื่อหน้าจอเล็ก (Pop-up)',popupFeatures:'คุณสมบัติของหน้าจอเล็ก (Pop-up)',popupResizable:'Resizable',popupStatusBar:'แสดงแถบสถานะ',popupLocationBar:'แสดงที่อยู่ของไฟล์',popupToolbar:'แสดงแถบเครื่องมือ',popupMenuBar:'แสดงแถบเมนู',popupFullScreen:'แสดงเต็มหน้าจอ (IE5.5++ เท่านั้น)',popupScrollBars:'แสดงแถบเลื่อน',popupDependent:'แสดงเต็มหน้าจอ (Netscape)',popupLeft:'พิกัดซ้าย (Left Position)',popupTop:'พิกัดบน (Top Position)',id:'Id',langDir:'การเขียน-อ่านภาษา',langDirLTR:'จากซ้ายไปขวา (LTR)',langDirRTL:'จากขวามาซ้าย (RTL)',acccessKey:'แอคเซส คีย์',name:'ชื่อ',langCode:'การเขียน-อ่านภาษา',tabIndex:'ลำดับของ แท็บ',advisoryTitle:'คำเกริ่นนำ',advisoryContentType:'ชนิดของคำเกริ่นนำ',cssClasses:'คลาสของไฟล์กำหนดลักษณะการแสดงผล',charset:'ลิงค์เชื่อมโยงไปยังชุดตัวอักษร',styles:'ลักษณะการแสดงผล',rel:'Relationship',selectAnchor:'ระบุข้อมูลของจุดเชื่อมโยง (Anchor)',anchorName:'ชื่อ',anchorId:'ไอดี',emailAddress:'อีเมล์ (E-Mail)',emailSubject:'หัวเรื่อง',emailBody:'ข้อความ',noAnchors:'(ยังไม่มีจุดเชื่อมโยงภายในหน้าเอกสารนี้)',noUrl:'กรุณาระบุที่อยู่อ้างอิงออนไลน์ (URL)',noEmail:'กรุณาระบุอีเมล์ (E-mail)'},anchor:{toolbar:'แทรก/แก้ไข Anchor',menu:'รายละเอียด Anchor',title:'รายละเอียด Anchor',name:'ชื่อ Anchor',errorName:'กรุณาระบุชื่อของ Anchor',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'ค้นหา',replace:'ค้นหาและแทนที่',findWhat:'ค้นหาคำว่า:',replaceWith:'แทนที่ด้วย:',notFoundMsg:'ไม่พบคำที่ค้นหา.',findOptions:'Find Options',matchCase:'ตัวโหญ่-เล็ก ต้องตรงกัน',matchWord:'ต้องตรงกันทุกคำ',matchCyclic:'Match cyclic',replaceAll:'แทนที่ทั้งหมดที่พบ',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'ตาราง',title:'คุณสมบัติของ ตาราง',menu:'คุณสมบัติของ ตาราง',deleteTable:'ลบตาราง',rows:'แถว',columns:'สดมน์',border:'ขนาดเส้นขอบ',widthPx:'จุดสี',widthPc:'เปอร์เซ็น',widthUnit:'width unit',cellSpace:'ระยะแนวนอนน',cellPad:'ระยะแนวตั้ง',caption:'หัวเรื่องของตาราง',summary:'สรุปความ',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'ช่องตาราง',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'ลบช่อง',merge:'ผสานช่อง',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'แถว',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'ลบแถว'},column:{menu:'คอลัมน์',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'ลบสดมน์'}},button:{title:'รายละเอียดของ ปุ่ม',text:'ข้อความ (ค่าตัวแปร)',type:'ข้อความ',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'คุณสมบัติของ เช็คบ๊อก',radioTitle:'คุณสมบัติของ เรดิโอบัตตอน',value:'ค่าตัวแปร',selected:'เลือกเป็นค่าเริ่มต้น'},form:{title:'คุณสมบัติของ แบบฟอร์ม',menu:'คุณสมบัติของ แบบฟอร์ม',action:'แอคชั่น',method:'เมธอด',encoding:'Encoding'},select:{title:'คุณสมบัติของ แถบตัวเลือก',selectInfo:'อินโฟ',opAvail:'รายการตัวเลือก',value:'ค่าตัวแปร',size:'ขนาด',lines:'บรรทัด',chkMulti:'เลือกหลายค่าได้',opText:'ข้อความ',opValue:'ค่าตัวแปร',btnAdd:'เพิ่ม',btnModify:'แก้ไข',btnUp:'บน',btnDown:'ล่าง',btnSetValue:'เลือกเป็นค่าเริ่มต้น',btnDelete:'ลบ'},textarea:{title:'คุณสมบัติของ เท็กแอเรีย',cols:'สดมภ์',rows:'แถว'},textfield:{title:'คุณสมบัติของ เท็กซ์ฟิลด์',name:'ชื่อ',value:'ค่าตัวแปร',charWidth:'ความกว้าง',maxChars:'จำนวนตัวอักษรสูงสุด',type:'ชนิด',typeText:'ข้อความ',typePass:'รหัสผ่าน'},hidden:{title:'คุณสมบัติของ ฮิดเดนฟิลด์',name:'ชื่อ',value:'ค่าตัวแปร'},image:{title:'คุณสมบัติของ รูปภาพ',titleButton:'คุณสมบัติของ ปุ่มแบบรูปภาพ',menu:'คุณสมบัติของ รูปภาพ',infoTab:'ข้อมูลของรูปภาพ',btnUpload:'อัพโหลดไฟล์ไปเก็บไว้ที่เครื่องแม่ข่าย (เซิร์ฟเวอร์)',upload:'อัพโหลดไฟล์',alt:'คำประกอบรูปภาพ',lockRatio:'กำหนดอัตราส่วน กว้าง-สูง แบบคงที่',resetSize:'กำหนดรูปเท่าขนาดจริง',border:'ขนาดขอบรูป',hSpace:'ระยะแนวนอน',vSpace:'ระยะแนวตั้ง',alertUrl:'กรุณาระบุที่อยู่อ้างอิงออนไลน์ของไฟล์รูปภาพ (URL)',linkTab:'ลิ้งค์',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'คุณสมบัติของไฟล์ Flash',propertiesTab:'Properties',title:'คุณสมบัติของไฟล์ Flash',chkPlay:'เล่นอัตโนมัติ Auto Play',chkLoop:'เล่นวนรอบ Loop',chkMenu:'ให้ใช้งานเมนูของ Flash',chkFull:'Allow Fullscreen',scale:'อัตราส่วน Scale',scaleAll:'แสดงให้เห็นทั้งหมด Show all',scaleNoBorder:'ไม่แสดงเส้นขอบ No Border',scaleFit:'แสดงให้พอดีกับพื้นที่ Exact Fit',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'ชิดด้านล่างสุด',alignAbsMiddle:'กึ่งกลาง',alignBaseline:'ชิดบรรทัด',alignTextTop:'ใต้ตัวอักษร',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'สีพื้นหลัง',hSpace:'ระยะแนวนอน',vSpace:'ระยะแนวตั้ง',validateSrc:'กรุณาระบุที่อยู่อ้างอิงออนไลน์ (URL)',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'ตรวจการสะกดคำ',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'ไม่พบในดิกชันนารี',changeTo:'แก้ไขเป็น',btnIgnore:'ยกเว้น',btnIgnoreAll:'ยกเว้นทั้งหมด',btnReplace:'แทนที่',btnReplaceAll:'แทนที่ทั้งหมด',btnUndo:'ยกเลิก',noSuggestions:'- ไม่มีคำแนะนำใดๆ -',progress:'กำลังตรวจสอบคำสะกด...',noMispell:'ตรวจสอบคำสะกดเสร็จสิ้น: ไม่พบคำสะกดผิด',noChanges:'ตรวจสอบคำสะกดเสร็จสิ้น: ไม่มีการแก้คำใดๆ',oneChange:'ตรวจสอบคำสะกดเสร็จสิ้น: แก้ไข1คำ',manyChanges:'ตรวจสอบคำสะกดเสร็จสิ้น:: แก้ไข %1 คำ',ieSpellDownload:'ไม่ได้ติดตั้งระบบตรวจสอบคำสะกด. ต้องการติดตั้งไหมครับ?'},smiley:{toolbar:'รูปสื่ออารมณ์',title:'แทรกสัญลักษณ์สื่ออารมณ์',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'ลำดับรายการแบบตัวเลข',bulletedlist:'ลำดับรายการแบบสัญลักษณ์',indent:'เพิ่มระยะย่อหน้า',outdent:'ลดระยะย่อหน้า',justify:{left:'จัดชิดซ้าย',center:'จัดกึ่งกลาง',right:'จัดชิดขวา',block:'จัดพอดีหน้ากระดาษ'},blockquote:'Block Quote',clipboard:{title:'วาง',cutError:'ไม่สามารถตัดข้อความที่เลือกไว้ได้เนื่องจากการกำหนดค่าระดับความปลอดภัย. กรุณาใช้ปุ่มลัดเพื่อวางข้อความแทน (กดปุ่ม Ctrl/Cmd และตัว X พร้อมกัน).',copyError:'ไม่สามารถสำเนาข้อความที่เลือกไว้ได้เนื่องจากการกำหนดค่าระดับความปลอดภัย. กรุณาใช้ปุ่มลัดเพื่อวางข้อความแทน (กดปุ่ม Ctrl/Cmd และตัว C พร้อมกัน).',pasteMsg:'กรุณาใช้คีย์บอร์ดเท่านั้น โดยกดปุ๋ม (<strong>Ctrl/Cmd และ V</strong>)พร้อมๆกัน และกด <strong>OK</strong>.',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'วางสำเนาจากตัวอักษรเวิร์ด',title:'วางสำเนาจากตัวอักษรเวิร์ด',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'วางแบบตัวอักษรธรรมดา',title:'วางแบบตัวอักษรธรรมดา'},templates:{button:'เทมเพลต',title:'เทมเพลตของส่วนเนื้อหาเว็บไซต์',options:'Template Options',insertOption:'แทนที่เนื้อหาเว็บไซต์ที่เลือก',selectPromptMsg:'กรุณาเลือก เทมเพลต เพื่อนำไปแก้ไขในอีดิตเตอร์<br />(เนื้อหาส่วนนี้จะหายไป):',emptyListMsg:'(ยังไม่มีการกำหนดเทมเพลต)'},showBlocks:'Show Blocks',stylesCombo:{label:'ลักษณะ',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'รูปแบบ',panelTitle:'รูปแบบ',tag_p:'Normal',tag_pre:'Formatted',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Paragraph (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'แบบอักษร',voiceLabel:'Font',panelTitle:'แบบอักษร'},fontSize:{label:'ขนาด',voiceLabel:'Font Size',panelTitle:'ขนาด'},colorButton:{textColorTitle:'สีตัวอักษร',bgColorTitle:'สีพื้นหลัง',panelTitle:'Colors',auto:'สีอัตโนมัติ',more:'เลือกสีอื่นๆ...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'คุณสมบัติของเอกสาร',title:'คุณสมบัติของเอกสาร',design:'Design',meta:'ข้อมูลสำหรับเสิร์ชเอนจิ้น',chooseColor:'Choose',other:'<อื่น ๆ>',docTitle:'ชื่อไตเติ้ล',charset:'ชุดตัวอักษร',charsetOther:'ชุดตัวอักษรอื่นๆ',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'ประเภทของเอกสาร',docTypeOther:'ประเภทเอกสารอื่นๆ',xhtmlDec:'รวมเอา XHTML Declarations ไว้ด้วย',bgColor:'สีพื้นหลัง',bgImage:'ที่อยู่อ้างอิงออนไลน์ของรูปพื้นหลัง (Image URL)',bgFixed:'พื้นหลังแบบไม่มีแถบเลื่อน',txtColor:'สีตัวอักษร',margin:'ระยะขอบของหน้าเอกสาร',marginTop:'ด้านบน',marginLeft:'ด้านซ้าย',marginRight:'ด้านขวา',marginBottom:'ด้านล่าง',metaKeywords:'คำสำคัญอธิบายเอกสาร (คั่นคำด้วย คอมม่า)',metaDescription:'ประโยคอธิบายเกี่ยวกับเอกสาร',metaAuthor:'ผู้สร้างเอกสาร',metaCopyright:'สงวนลิขสิทธิ์',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.th={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Editor toolbars',editor:'Rich Text Editor',source:'ดูรหัส HTML',newPage:'สร้างหน้าเอกสารใหม่',save:'บันทึก',preview:'ดูหน้าเอกสารตัวอย่าง',cut:'ตัด',copy:'สำเนา',paste:'วาง',print:'สั่งพิมพ์',underline:'ตัวขีดเส้นใต้',bold:'ตัวหนา',italic:'ตัวเอียง',selectAll:'เลือกทั้งหมด',removeFormat:'ล้างรูปแบบ',strike:'ตัวขีดเส้นทับ',subscript:'ตัวห้อย',superscript:'ตัวยก',horizontalrule:'แทรกเส้นคั่นบรรทัด',pagebreak:'แทรกตัวแบ่งหน้า Page Break',pagebreakAlt:'Page Break',unlink:'ลบ ลิงค์',undo:'ยกเลิกคำสั่ง',redo:'ทำซ้ำคำสั่ง',common:{browseServer:'เปิดหน้าต่างจัดการไฟล์อัพโหลด',url:'ที่อยู่อ้างอิง URL',protocol:'โปรโตคอล',upload:'อัพโหลดไฟล์',uploadSubmit:'อัพโหลดไฟล์ไปเก็บไว้ที่เครื่องแม่ข่าย (เซิร์ฟเวอร์)',image:'รูปภาพ',flash:'ไฟล์ Flash',form:'แบบฟอร์ม',checkbox:'เช็คบ๊อก',radio:'เรดิโอบัตตอน',textField:'เท็กซ์ฟิลด์',textarea:'เท็กซ์แอเรีย',hiddenField:'ฮิดเดนฟิลด์',button:'ปุ่ม',select:'แถบตัวเลือก',imageButton:'ปุ่มแบบรูปภาพ',notSet:'<ไม่ระบุ>',id:'ไอดี',name:'ชื่อ',langDir:'การเขียน-อ่านภาษา',langDirLtr:'จากซ้ายไปขวา (LTR)',langDirRtl:'จากขวามาซ้าย (RTL)',langCode:'รหัสภาษา',longDescr:'คำอธิบายประกอบ URL',cssClass:'คลาสของไฟล์กำหนดลักษณะการแสดงผล',advisoryTitle:'คำเกริ่นนำ',cssStyle:'ลักษณะการแสดงผล',ok:'ตกลง',cancel:'ยกเลิก',close:'Close',preview:'Preview',generalTab:'General',advancedTab:'ขั้นสูง',validateNumberFailed:'This value is not a number.',confirmNewPage:'Any unsaved changes to this content will be lost. Are you sure you want to load new page?',confirmCancel:'Some of the options have been changed. Are you sure to close the dialog?',options:'Options',target:'Target',targetNew:'New Window (_blank)',targetTop:'Topmost Window (_top)',targetSelf:'Same Window (_self)',targetParent:'Parent Window (_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'ความกว้าง',height:'ความสูง',align:'การจัดวาง',alignLeft:'ชิดซ้าย',alignRight:'ชิดขวา',alignCenter:'กึ่งกลาง',alignTop:'บนสุด',alignMiddle:'กึ่งกลางแนวตั้ง',alignBottom:'ชิดด้านล่าง',invalidHeight:'Height must be a number.',invalidWidth:'Width must be a number.',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, unavailable</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'แทรกตัวอักษรพิเศษ',title:'แทรกตัวอักษรพิเศษ',options:'Special Character Options'},link:{toolbar:'แทรก/แก้ไข ลิงค์',other:'<อื่น ๆ>',menu:'แก้ไข ลิงค์',title:'ลิงค์เชื่อมโยงเว็บ อีเมล์ รูปภาพ หรือไฟล์อื่นๆ',info:'รายละเอียด',target:'การเปิดหน้าลิงค์',upload:'อัพโหลดไฟล์',advanced:'ขั้นสูง',type:'ประเภทของลิงค์',toUrl:'URL',toAnchor:'จุดเชื่อมโยง (Anchor)',toEmail:'ส่งอีเมล์ (E-Mail)',targetFrame:'<เปิดในเฟรม>',targetPopup:'<เปิดหน้าจอเล็ก (Pop-up)>',targetFrameName:'ชื่อทาร์เก็ตเฟรม',targetPopupName:'ระบุชื่อหน้าจอเล็ก (Pop-up)',popupFeatures:'คุณสมบัติของหน้าจอเล็ก (Pop-up)',popupResizable:'Resizable',popupStatusBar:'แสดงแถบสถานะ',popupLocationBar:'แสดงที่อยู่ของไฟล์',popupToolbar:'แสดงแถบเครื่องมือ',popupMenuBar:'แสดงแถบเมนู',popupFullScreen:'แสดงเต็มหน้าจอ (IE5.5++ เท่านั้น)',popupScrollBars:'แสดงแถบเลื่อน',popupDependent:'แสดงเต็มหน้าจอ (Netscape)',popupLeft:'พิกัดซ้าย (Left Position)',popupTop:'พิกัดบน (Top Position)',id:'Id',langDir:'การเขียน-อ่านภาษา',langDirLTR:'จากซ้ายไปขวา (LTR)',langDirRTL:'จากขวามาซ้าย (RTL)',acccessKey:'แอคเซส คีย์',name:'ชื่อ',langCode:'การเขียน-อ่านภาษา',tabIndex:'ลำดับของ แท็บ',advisoryTitle:'คำเกริ่นนำ',advisoryContentType:'ชนิดของคำเกริ่นนำ',cssClasses:'คลาสของไฟล์กำหนดลักษณะการแสดงผล',charset:'ลิงค์เชื่อมโยงไปยังชุดตัวอักษร',styles:'ลักษณะการแสดงผล',rel:'Relationship',selectAnchor:'ระบุข้อมูลของจุดเชื่อมโยง (Anchor)',anchorName:'ชื่อ',anchorId:'ไอดี',emailAddress:'อีเมล์ (E-Mail)',emailSubject:'หัวเรื่อง',emailBody:'ข้อความ',noAnchors:'(ยังไม่มีจุดเชื่อมโยงภายในหน้าเอกสารนี้)',noUrl:'กรุณาระบุที่อยู่อ้างอิงออนไลน์ (URL)',noEmail:'กรุณาระบุอีเมล์ (E-mail)'},anchor:{toolbar:'แทรก/แก้ไข Anchor',menu:'รายละเอียด Anchor',title:'รายละเอียด Anchor',name:'ชื่อ Anchor',errorName:'กรุณาระบุชื่อของ Anchor',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'Find and Replace',find:'ค้นหา',replace:'ค้นหาและแทนที่',findWhat:'ค้นหาคำว่า:',replaceWith:'แทนที่ด้วย:',notFoundMsg:'ไม่พบคำที่ค้นหา.',findOptions:'Find Options',matchCase:'ตัวโหญ่-เล็ก ต้องตรงกัน',matchWord:'ต้องตรงกันทุกคำ',matchCyclic:'Match cyclic',replaceAll:'แทนที่ทั้งหมดที่พบ',replaceSuccessMsg:'%1 occurrence(s) replaced.'},table:{toolbar:'ตาราง',title:'คุณสมบัติของ ตาราง',menu:'คุณสมบัติของ ตาราง',deleteTable:'ลบตาราง',rows:'แถว',columns:'สดมน์',border:'ขนาดเส้นขอบ',widthPx:'จุดสี',widthPc:'เปอร์เซ็น',widthUnit:'width unit',cellSpace:'ระยะแนวนอนน',cellPad:'ระยะแนวตั้ง',caption:'หัวเรื่องของตาราง',summary:'สรุปความ',headers:'Headers',headersNone:'None',headersColumn:'First column',headersRow:'First Row',headersBoth:'Both',invalidRows:'Number of rows must be a number greater than 0.',invalidCols:'Number of columns must be a number greater than 0.',invalidBorder:'Border size must be a number.',invalidWidth:'Table width must be a number.',invalidHeight:'Table height must be a number.',invalidCellSpacing:'Cell spacing must be a positive number.',invalidCellPadding:'Cell padding must be a positive number.',cell:{menu:'ช่องตาราง',insertBefore:'Insert Cell Before',insertAfter:'Insert Cell After',deleteCell:'ลบช่อง',merge:'ผสานช่อง',mergeRight:'Merge Right',mergeDown:'Merge Down',splitHorizontal:'Split Cell Horizontally',splitVertical:'Split Cell Vertically',title:'Cell Properties',cellType:'Cell Type',rowSpan:'Rows Span',colSpan:'Columns Span',wordWrap:'Word Wrap',hAlign:'Horizontal Alignment',vAlign:'Vertical Alignment',alignBaseline:'Baseline',bgColor:'Background Color',borderColor:'Border Color',data:'Data',header:'Header',yes:'Yes',no:'No',invalidWidth:'Cell width must be a number.',invalidHeight:'Cell height must be a number.',invalidRowSpan:'Rows span must be a whole number.',invalidColSpan:'Columns span must be a whole number.',chooseColor:'Choose'},row:{menu:'แถว',insertBefore:'Insert Row Before',insertAfter:'Insert Row After',deleteRow:'ลบแถว'},column:{menu:'คอลัมน์',insertBefore:'Insert Column Before',insertAfter:'Insert Column After',deleteColumn:'ลบสดมน์'}},button:{title:'รายละเอียดของ ปุ่ม',text:'ข้อความ (ค่าตัวแปร)',type:'ข้อความ',typeBtn:'Button',typeSbm:'Submit',typeRst:'Reset'},checkboxAndRadio:{checkboxTitle:'คุณสมบัติของ เช็คบ๊อก',radioTitle:'คุณสมบัติของ เรดิโอบัตตอน',value:'ค่าตัวแปร',selected:'เลือกเป็นค่าเริ่มต้น'},form:{title:'คุณสมบัติของ แบบฟอร์ม',menu:'คุณสมบัติของ แบบฟอร์ม',action:'แอคชั่น',method:'เมธอด',encoding:'Encoding'},select:{title:'คุณสมบัติของ แถบตัวเลือก',selectInfo:'อินโฟ',opAvail:'รายการตัวเลือก',value:'ค่าตัวแปร',size:'ขนาด',lines:'บรรทัด',chkMulti:'เลือกหลายค่าได้',opText:'ข้อความ',opValue:'ค่าตัวแปร',btnAdd:'เพิ่ม',btnModify:'แก้ไข',btnUp:'บน',btnDown:'ล่าง',btnSetValue:'เลือกเป็นค่าเริ่มต้น',btnDelete:'ลบ'},textarea:{title:'คุณสมบัติของ เท็กแอเรีย',cols:'สดมภ์',rows:'แถว'},textfield:{title:'คุณสมบัติของ เท็กซ์ฟิลด์',name:'ชื่อ',value:'ค่าตัวแปร',charWidth:'ความกว้าง',maxChars:'จำนวนตัวอักษรสูงสุด',type:'ชนิด',typeText:'ข้อความ',typePass:'รหัสผ่าน'},hidden:{title:'คุณสมบัติของ ฮิดเดนฟิลด์',name:'ชื่อ',value:'ค่าตัวแปร'},image:{title:'คุณสมบัติของ รูปภาพ',titleButton:'คุณสมบัติของ ปุ่มแบบรูปภาพ',menu:'คุณสมบัติของ รูปภาพ',infoTab:'ข้อมูลของรูปภาพ',btnUpload:'อัพโหลดไฟล์ไปเก็บไว้ที่เครื่องแม่ข่าย (เซิร์ฟเวอร์)',upload:'อัพโหลดไฟล์',alt:'คำประกอบรูปภาพ',lockRatio:'กำหนดอัตราส่วน กว้าง-สูง แบบคงที่',resetSize:'กำหนดรูปเท่าขนาดจริง',border:'ขนาดขอบรูป',hSpace:'ระยะแนวนอน',vSpace:'ระยะแนวตั้ง',alertUrl:'กรุณาระบุที่อยู่อ้างอิงออนไลน์ของไฟล์รูปภาพ (URL)',linkTab:'ลิ้งค์',button2Img:'Do you want to transform the selected image button on a simple image?',img2Button:'Do you want to transform the selected image on a image button?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'คุณสมบัติของไฟล์ Flash',propertiesTab:'Properties',title:'คุณสมบัติของไฟล์ Flash',chkPlay:'เล่นอัตโนมัติ Auto Play',chkLoop:'เล่นวนรอบ Loop',chkMenu:'ให้ใช้งานเมนูของ Flash',chkFull:'Allow Fullscreen',scale:'อัตราส่วน Scale',scaleAll:'แสดงให้เห็นทั้งหมด Show all',scaleNoBorder:'ไม่แสดงเส้นขอบ No Border',scaleFit:'แสดงให้พอดีกับพื้นที่ Exact Fit',access:'Script Access',accessAlways:'Always',accessSameDomain:'Same domain',accessNever:'Never',alignAbsBottom:'ชิดด้านล่างสุด',alignAbsMiddle:'กึ่งกลาง',alignBaseline:'ชิดบรรทัด',alignTextTop:'ใต้ตัวอักษร',quality:'Quality',qualityBest:'Best',qualityHigh:'High',qualityAutoHigh:'Auto High',qualityMedium:'Medium',qualityAutoLow:'Auto Low',qualityLow:'Low',windowModeWindow:'Window',windowModeOpaque:'Opaque',windowModeTransparent:'Transparent',windowMode:'Window mode',flashvars:'Variables for Flash',bgcolor:'สีพื้นหลัง',hSpace:'ระยะแนวนอน',vSpace:'ระยะแนวตั้ง',validateSrc:'กรุณาระบุที่อยู่อ้างอิงออนไลน์ (URL)',validateHSpace:'HSpace must be a number.',validateVSpace:'VSpace must be a number.'},spellCheck:{toolbar:'ตรวจการสะกดคำ',title:'Spell Check',notAvailable:'Sorry, but service is unavailable now.',errorLoading:'Error loading application service host: %s.',notInDic:'ไม่พบในดิกชันนารี',changeTo:'แก้ไขเป็น',btnIgnore:'ยกเว้น',btnIgnoreAll:'ยกเว้นทั้งหมด',btnReplace:'แทนที่',btnReplaceAll:'แทนที่ทั้งหมด',btnUndo:'ยกเลิก',noSuggestions:'- ไม่มีคำแนะนำใดๆ -',progress:'กำลังตรวจสอบคำสะกด...',noMispell:'ตรวจสอบคำสะกดเสร็จสิ้น: ไม่พบคำสะกดผิด',noChanges:'ตรวจสอบคำสะกดเสร็จสิ้น: ไม่มีการแก้คำใดๆ',oneChange:'ตรวจสอบคำสะกดเสร็จสิ้น: แก้ไข1คำ',manyChanges:'ตรวจสอบคำสะกดเสร็จสิ้น:: แก้ไข %1 คำ',ieSpellDownload:'ไม่ได้ติดตั้งระบบตรวจสอบคำสะกด. ต้องการติดตั้งไหมครับ?'},smiley:{toolbar:'รูปสื่ออารมณ์',title:'แทรกสัญลักษณ์สื่ออารมณ์',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 element'},numberedlist:'ลำดับรายการแบบตัวเลข',bulletedlist:'ลำดับรายการแบบสัญลักษณ์',indent:'เพิ่มระยะย่อหน้า',outdent:'ลดระยะย่อหน้า',justify:{left:'จัดชิดซ้าย',center:'จัดกึ่งกลาง',right:'จัดชิดขวา',block:'จัดพอดีหน้ากระดาษ'},blockquote:'Block Quote',clipboard:{title:'วาง',cutError:'ไม่สามารถตัดข้อความที่เลือกไว้ได้เนื่องจากการกำหนดค่าระดับความปลอดภัย. กรุณาใช้ปุ่มลัดเพื่อวางข้อความแทน (กดปุ่ม Ctrl/Cmd และตัว X พร้อมกัน).',copyError:'ไม่สามารถสำเนาข้อความที่เลือกไว้ได้เนื่องจากการกำหนดค่าระดับความปลอดภัย. กรุณาใช้ปุ่มลัดเพื่อวางข้อความแทน (กดปุ่ม Ctrl/Cmd และตัว C พร้อมกัน).',pasteMsg:'กรุณาใช้คีย์บอร์ดเท่านั้น โดยกดปุ๋ม (<strong>Ctrl/Cmd และ V</strong>)พร้อมๆกัน และกด <strong>OK</strong>.',securityMsg:'Because of your browser security settings, the editor is not able to access your clipboard data directly. You are required to paste it again in this window.',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?',toolbar:'วางสำเนาจากตัวอักษรเวิร์ด',title:'วางสำเนาจากตัวอักษรเวิร์ด',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'วางแบบตัวอักษรธรรมดา',title:'วางแบบตัวอักษรธรรมดา'},templates:{button:'เทมเพลต',title:'เทมเพลตของส่วนเนื้อหาเว็บไซต์',options:'Template Options',insertOption:'แทนที่เนื้อหาเว็บไซต์ที่เลือก',selectPromptMsg:'กรุณาเลือก เทมเพลต เพื่อนำไปแก้ไขในอีดิตเตอร์<br />(เนื้อหาส่วนนี้จะหายไป):',emptyListMsg:'(ยังไม่มีการกำหนดเทมเพลต)'},showBlocks:'Show Blocks',stylesCombo:{label:'ลักษณะ',panelTitle:'Formatting Styles',panelTitle1:'Block Styles',panelTitle2:'Inline Styles',panelTitle3:'Object Styles'},format:{label:'รูปแบบ',panelTitle:'รูปแบบ',tag_p:'Normal',tag_pre:'Formatted',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Paragraph (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'แบบอักษร',voiceLabel:'Font',panelTitle:'แบบอักษร'},fontSize:{label:'ขนาด',voiceLabel:'Font Size',panelTitle:'ขนาด'},colorButton:{textColorTitle:'สีตัวอักษร',bgColorTitle:'สีพื้นหลัง',panelTitle:'Colors',auto:'สีอัตโนมัติ',more:'เลือกสีอื่นๆ...'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'Spell Check As You Type',opera_title:'Not supported by Opera',enable:'Enable SCAYT',disable:'Disable SCAYT',about:'About SCAYT',toggle:'Toggle SCAYT',options:'Options',langs:'Languages',moreSuggestions:'More suggestions',ignore:'Ignore',ignoreAll:'Ignore All',addWord:'Add Word',emptyDic:'Dictionary name should not be empty.',optionsTab:'Options',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'Languages',dictionariesTab:'Dictionaries',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'About'},about:{title:'About CKEditor',dlgTitle:'About CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'For licensing information please visit our web site:',copy:'Copyright © $1. All rights reserved.'},maximize:'Maximize',minimize:'Minimize',fakeobjects:{anchor:'Anchor',flash:'Flash Animation',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'Unknown Object'},resize:'Drag to resize',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'Collapse Toolbar',toolbarExpand:'Expand Toolbar',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'คุณสมบัติของเอกสาร',title:'คุณสมบัติของเอกสาร',design:'Design',meta:'ข้อมูลสำหรับเสิร์ชเอนจิ้น',chooseColor:'Choose',other:'<อื่น ๆ>',docTitle:'ชื่อไตเติ้ล',charset:'ชุดตัวอักษร',charsetOther:'ชุดตัวอักษรอื่นๆ',charsetASCII:'ASCII',charsetCE:'Central European',charsetCT:'Chinese Traditional (Big5)',charsetCR:'Cyrillic',charsetGR:'Greek',charsetJP:'Japanese',charsetKR:'Korean',charsetTR:'Turkish',charsetUN:'Unicode (UTF-8)',charsetWE:'Western European',docType:'ประเภทของเอกสาร',docTypeOther:'ประเภทเอกสารอื่นๆ',xhtmlDec:'รวมเอา XHTML Declarations ไว้ด้วย',bgColor:'สีพื้นหลัง',bgImage:'ที่อยู่อ้างอิงออนไลน์ของรูปพื้นหลัง (Image URL)',bgFixed:'พื้นหลังแบบไม่มีแถบเลื่อน',txtColor:'สีตัวอักษร',margin:'ระยะขอบของหน้าเอกสาร',marginTop:'ด้านบน',marginLeft:'ด้านซ้าย',marginRight:'ด้านขวา',marginBottom:'ด้านล่าง',metaKeywords:'คำสำคัญอธิบายเอกสาร (คั่นคำด้วย คอมม่า)',metaDescription:'ประโยคอธิบายเกี่ยวกับเอกสาร',metaAuthor:'ผู้สร้างเอกสาร',metaCopyright:'สงวนลิขสิทธิ์',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/tr.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/tr.js
index 6cc8491..ba1a6c7 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/tr.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/tr.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.tr={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Araç çubukları Editörü',editor:'Zengin Metin Editörü',source:'Kaynak',newPage:'Yeni Sayfa',save:'Kaydet',preview:'Ön İzleme',cut:'Kes',copy:'Kopyala',paste:'Yapıştır',print:'Yazdır',underline:'Altı Çizgili',bold:'Kalın',italic:'İtalik',selectAll:'Tümünü Seç',removeFormat:'Biçimi Kaldır',strike:'Üstü Çizgili',subscript:'Alt Simge',superscript:'Üst Simge',horizontalrule:'Yatay Satır Ekle',pagebreak:'Sayfa Sonu Ekle',pagebreakAlt:'Sayfa Sonu',unlink:'Köprü Kaldır',undo:'Geri Al',redo:'Tekrarla',common:{browseServer:'Sunucuyu Gez',url:'URL',protocol:'Protokol',upload:'Karşıya Yükle',uploadSubmit:'Sunucuya Yolla',image:'Resim',flash:'Flash',form:'Form',checkbox:'Onay Kutusu',radio:'Seçenek Düğmesi',textField:'Metin Girişi',textarea:'Çok Satırlı Metin',hiddenField:'Gizli Veri',button:'Düğme',select:'Seçim Menüsü',imageButton:'Resimli Düğme',notSet:'<tanımlanmamış>',id:'Kimlik',name:'Ad',langDir:'Dil Yönü',langDirLtr:'Soldan Sağa (LTR)',langDirRtl:'Sağdan Sola (RTL)',langCode:'Dil Kodlaması',longDescr:'Uzun Tanımlı URL',cssClass:'Biçem Sayfası Sınıfları',advisoryTitle:'Danışma Başlığı',cssStyle:'Biçem',ok:'Tamam',cancel:'İptal',close:'Kapat',preview:'Ön gösterim',generalTab:'Genel',advancedTab:'Gelişmiş',validateNumberFailed:'Bu değer sayı değildir.',confirmNewPage:'İceriğiniz kayıt edilmediğinden dolayı kaybolacaktır. Yeni bir sayfa yüklemek istediğinize eminsiniz?',confirmCancel:'Bazı seçenekler değişmiştir. Dialog penceresini kapatmak istediğinize eminmisiniz?',options:'Seçenekler',target:'Hedef',targetNew:'Yeni Pencere (_blank)',targetTop:'Enüst Pencere (_top)',targetSelf:'Aynı Pencere (_self)',targetParent:'Ana Pencere (_parent)',langDirLTR:'Soldan Sağa (LTR)',langDirRTL:'Sağdan Sola (RTL)',styles:'Stil',cssClasses:'Stil sayfası Sınıfı',width:'Genişlik',height:'Yükseklik',align:'Hizalama',alignLeft:'Sol',alignRight:'Sağ',alignCenter:'Merkez',alignTop:'Tepe',alignMiddle:'Orta',alignBottom:'Alt',invalidHeight:'Yükseklik sayı olmalıdır.',invalidWidth:'Genişlik bir sayı olmalıdır.',invalidCssLength:'Belirttiğiniz sayı "%1" alanı için pozitif bir sayı CSS birim değeri olmalıdır (px, %, in, cm, mm, em, ex, pt, veya pc).',invalidHtmlLength:'Belirttiğiniz sayı "%1" alanı için pozitif bir sayı HTML birim değeri olmalıdır (px veya %).',invalidInlineStyle:'Noktalı virgülle ayrılmış: "değer adı," inline stil için belirtilen değer biçiminde bir veya daha fazla dizilerden oluşmalıdır.',cssLengthTooltip:'Pikseller için bir numara girin veya geçerli bir CSS numarası (px, %, in, cm, mm, em, ex, pt, veya pc).',unavailable:'%1<span class="cke_accessibility">, hazır değildir</span>'},contextmenu:{options:'İçerik Menüsü Seçenekleri'},specialChar:{toolbar:'Özel Karakter Ekle',title:'Özel Karakter Seç',options:'Özel Karakter Seçenekleri'},link:{toolbar:'Link Ekle/Düzenle',other:'<diğer>',menu:'Link Düzenle',title:'Link',info:'Link Bilgisi',target:'Hedef',upload:'Karşıya Yükle',advanced:'Gelişmiş',type:'Link Türü',toUrl:'URL',toAnchor:'Bu sayfada çapa',toEmail:'E-Posta',targetFrame:'<çerçeve>',targetPopup:'<yeni açılan pencere>',targetFrameName:'Hedef Çerçeve Adı',targetPopupName:'Yeni Açılan Pencere Adı',popupFeatures:'Yeni Açılan Pencere Özellikleri',popupResizable:'Resizable',popupStatusBar:'Durum Çubuğu',popupLocationBar:'Yer Çubuğu',popupToolbar:'Araç Çubuğu',popupMenuBar:'Menü Çubuğu',popupFullScreen:'Tam Ekran (IE)',popupScrollBars:'Kaydırma Çubukları',popupDependent:'Bağımlı (Netscape)',popupLeft:'Sola Göre Konum',popupTop:'Yukarıya Göre Konum',id:'Id',langDir:'Dil Yönü',langDirLTR:'Soldan Sağa (LTR)',langDirRTL:'Sağdan Sola (RTL)',acccessKey:'Erişim Tuşu',name:'Ad',langCode:'Dil Yönü',tabIndex:'Sekme İndeksi',advisoryTitle:'Danışma Başlığı',advisoryContentType:'Danışma İçerik Türü',cssClasses:'Biçem Sayfası Sınıfları',charset:'Bağlı Kaynak Karakter Gurubu',styles:'Biçem',rel:'İlişki',selectAnchor:'Bağlantı Seç',anchorName:'Bağlantı Adı ile',anchorId:'Eleman Kimlik Numarası ile',emailAddress:'E-Posta Adresi',emailSubject:'İleti Konusu',emailBody:'İleti Gövdesi',noAnchors:'(Bu belgede hiç çapa yok)',noUrl:"Lütfen Link URL'sini yazın",noEmail:'Lütfen E-posta adresini yazın'},anchor:{toolbar:'Bağlantı Ekle/Düzenle',menu:'Bağlantı Özellikleri',title:'Bağlantı Özellikleri',name:'Bağlantı Adı',errorName:'Lütfen bağlantı için ad giriniz',remove:'Bağlantıyı Kaldır'},list:{numberedTitle:'Sayılandırılmış Liste Özellikleri',bulletedTitle:'Simgeli Liste Özellikleri',type:'Tipi',start:'Başla',validateStartNumber:'Liste başlangıcı tam sayı olmalıdır.',circle:'Daire',disc:'Disk',square:'Kare',none:'Yok',notset:'<ayarlanmamış>',armenian:'Ermenice sayılandırma',georgian:'Gürcüce numaralandırma (an, ban, gan, vs.)',lowerRoman:'Küçük Roman (i, ii, iii, iv, v, vs.)',upperRoman:'Büyük Roman (I, II, III, IV, V, vs.)',lowerAlpha:'Küçük Alpha (a, b, c, d, e, vs.)',upperAlpha:'Büyük Alpha (A, B, C, D, E, vs.)',lowerGreek:'Küçük Greek (alpha, beta, gamma, vs.)',decimal:'Ondalık (1, 2, 3, vs.)',decimalLeadingZero:'Başı sıfırlı ondalık (01, 02, 03, vs.)'},findAndReplace:{title:'Bul ve Değiştir',find:'Bul',replace:'Değiştir',findWhat:'Aranan:',replaceWith:'Bununla değiştir:',notFoundMsg:'Belirtilen yazı bulunamadı.',findOptions:'Seçenekleri Bul',matchCase:'Büyük/küçük harf duyarlı',matchWord:'Kelimenin tamamı uysun',matchCyclic:'Eşleşen döngü',replaceAll:'Tümünü Değiştir',replaceSuccessMsg:'%1 bulunanlardan değiştirildi.'},table:{toolbar:'Tablo',title:'Tablo Özellikleri',menu:'Tablo Özellikleri',deleteTable:'Tabloyu Sil',rows:'Satırlar',columns:'Sütunlar',border:'Kenar Kalınlığı',widthPx:'piksel',widthPc:'yüzde',widthUnit:'genişlik birimi',cellSpace:'Izgara kalınlığı',cellPad:'Izgara yazı arası',caption:'Başlık',summary:'Özet',headers:'Başlıklar',headersNone:'Yok',headersColumn:'İlk Sütun',headersRow:'İlk Satır',headersBoth:'Her İkisi',invalidRows:'Satır sayısı 0 sayısından büyük olmalıdır.',invalidCols:'Sütün sayısı 0 sayısından büyük olmalıdır.',invalidBorder:'Çerceve büyüklüklüğü sayı olmalıdır.',invalidWidth:'Tablo genişliği sayı olmalıdır.',invalidHeight:'Tablo yüksekliği sayı olmalıdır.',invalidCellSpacing:'Hücre boşluğu (spacing) sayı olmalıdır.',invalidCellPadding:'Hücre aralığı (padding) sayı olmalıdır.',cell:{menu:'Hücre',insertBefore:'Hücre Ekle - Önce',insertAfter:'Hücre Ekle - Sonra',deleteCell:'Hücre Sil',merge:'Hücreleri Birleştir',mergeRight:'Birleştir - Sağdaki İle ',mergeDown:'Birleştir - Aşağıdaki İle ',splitHorizontal:'Hücreyi Yatay Böl',splitVertical:'Hücreyi Dikey Böl',title:'Hücre Özellikleri',cellType:'Hücre Tipi',rowSpan:'Satırlar Mesafesi (Span)',colSpan:'Sütünlar Mesafesi (Span)',wordWrap:'Kelime Kaydırma',hAlign:'Düşey Hizalama',vAlign:'Yataş Hizalama',alignBaseline:'Tabana',bgColor:'Arkaplan Rengi',borderColor:'Çerçeve Rengi',data:'Veri',header:'Başlık',yes:'Evet',no:'Hayır',invalidWidth:'Hücre genişliği sayı olmalıdır.',invalidHeight:'Hücre yüksekliği sayı olmalıdır.',invalidRowSpan:'Satırların mesafesi tam sayı olmalıdır.',invalidColSpan:'Sütünların mesafesi tam sayı olmalıdır.',chooseColor:'Seçiniz'},row:{menu:'Satır',insertBefore:'Satır Ekle - Önce',insertAfter:'Satır Ekle - Sonra',deleteRow:'Satır Sil'},column:{menu:'Sütun',insertBefore:'Kolon Ekle - Önce',insertAfter:'Kolon Ekle - Sonra',deleteColumn:'Sütun Sil'}},button:{title:'Düğme Özellikleri',text:'Metin (Değer)',type:'Tip',typeBtn:'Düğme',typeSbm:'Gönder',typeRst:'Sıfırla'},checkboxAndRadio:{checkboxTitle:'Onay Kutusu Özellikleri',radioTitle:'Seçenek Düğmesi Özellikleri',value:'Değer',selected:'Seçili'},form:{title:'Form Özellikleri',menu:'Form Özellikleri',action:'İşlem',method:'Yöntem',encoding:'Kodlama'},select:{title:'Seçim Menüsü Özellikleri',selectInfo:'Bilgi',opAvail:'Mevcut Seçenekler',value:'Değer',size:'Boyut',lines:'satır',chkMulti:'Çoklu seçime izin ver',opText:'Metin',opValue:'Değer',btnAdd:'Ekle',btnModify:'Düzenle',btnUp:'Yukarı',btnDown:'Aşağı',btnSetValue:'Seçili değer olarak ata',btnDelete:'Sil'},textarea:{title:'Çok Satırlı Metin Özellikleri',cols:'Sütunlar',rows:'Satırlar'},textfield:{title:'Metin Girişi Özellikleri',name:'Ad',value:'Değer',charWidth:'Karakter Genişliği',maxChars:'En Fazla Karakter',type:'Tür',typeText:'Metin',typePass:'Şifre'},hidden:{title:'Gizli Veri Özellikleri',name:'Ad',value:'Değer'},image:{title:'Resim Özellikleri',titleButton:'Resimli Düğme Özellikleri',menu:'Resim Özellikleri',infoTab:'Resim Bilgisi',btnUpload:'Sunucuya Yolla',upload:'Karşıya Yükle',alt:'Alternatif Yazı',lockRatio:'Oranı Kilitle',resetSize:'Boyutu Başa Döndür',border:'Kenar',hSpace:'Yatay Boşluk',vSpace:'Dikey Boşluk',alertUrl:"Lütfen resmin URL'sini yazınız",linkTab:'Köprü',button2Img:'Seçili resim butonunu basit resime çevirmek istermisiniz?',img2Button:'Seçili olan resimi, resimli butona çevirmek istermisiniz?',urlMissing:'Resmin URL kaynağı eksiktir.',validateBorder:'Çerçeve tam sayı olmalıdır.',validateHSpace:'HSpace tam sayı olmalıdır.',validateVSpace:'VSpace tam sayı olmalıdır.'},flash:{properties:'Flash Özellikleri',propertiesTab:'Özellikler',title:'Flash Özellikleri',chkPlay:'Otomatik Oynat',chkLoop:'Döngü',chkMenu:'Flash Menüsünü Kullan',chkFull:'Tam ekrana İzinver',scale:'Boyutlandır',scaleAll:'Hepsini Göster',scaleNoBorder:'Kenar Yok',scaleFit:'Tam Sığdır',access:'Kod İzni',accessAlways:'Herzaman',accessSameDomain:'Aynı domain',accessNever:'Asla',alignAbsBottom:'Tam Altı',alignAbsMiddle:'Tam Ortası',alignBaseline:'Taban Çizgisi',alignTextTop:'Yazı Tepeye',quality:'Kalite',qualityBest:'En iyi',qualityHigh:'Yüksek',qualityAutoHigh:'Otomatik Yükseklik',qualityMedium:'Orta',qualityAutoLow:'Otomatik Düşüklük',qualityLow:'Düşük',windowModeWindow:'Pencere',windowModeOpaque:'Opak',windowModeTransparent:'Şeffaf',windowMode:'Pencere modu',flashvars:'Flash Değerleri',bgcolor:'Arka Renk',hSpace:'Yatay Boşluk',vSpace:'Dikey Boşluk',validateSrc:"Lütfen köprü URL'sini yazın",validateHSpace:'HSpace sayı olmalıdır.',validateVSpace:'VSpace sayı olmalıdır.'},spellCheck:{toolbar:'Yazım Denetimi',title:'Yazımı Denetle',notAvailable:'Üzügünüz, bu servis şuanda hizmet dışıdır.',errorLoading:'Uygulamada yüklerken hata oluştu: %s.',notInDic:'Sözlükte Yok',changeTo:'Şuna değiştir:',btnIgnore:'Yoksay',btnIgnoreAll:'Tümünü Yoksay',btnReplace:'Değiştir',btnReplaceAll:'Tümünü Değiştir',btnUndo:'Geri Al',noSuggestions:'- Öneri Yok -',progress:'Yazım denetimi işlemde...',noMispell:'Yazım denetimi tamamlandı: Yanlış yazıma rastlanmadı',noChanges:'Yazım denetimi tamamlandı: Hiçbir kelime değiştirilmedi',oneChange:'Yazım denetimi tamamlandı: Bir kelime değiştirildi',manyChanges:'Yazım denetimi tamamlandı: %1 kelime değiştirildi',ieSpellDownload:'Yazım denetimi yüklenmemiş. Şimdi yüklemek ister misiniz?'},smiley:{toolbar:'İfade',title:'İfade Ekle',options:'İfade Seçenekleri'},elementsPath:{eleLabel:'Elementlerin yolu',eleTitle:'%1 elementi'},numberedlist:'Numaralı Liste',bulletedlist:'Simgeli Liste',indent:'Sekme Arttır',outdent:'Sekme Azalt',justify:{left:'Sola Dayalı',center:'Ortalanmış',right:'Sağa Dayalı',block:'İki Kenara Yaslanmış'},blockquote:'Blok Oluştur',clipboard:{title:'Yapıştır',cutError:'Gezgin yazılımınızın güvenlik ayarları düzenleyicinin otomatik kesme işlemine izin vermiyor. İşlem için (Ctrl/Cmd+X) tuşlarını kullanın.',copyError:'Gezgin yazılımınızın güvenlik ayarları düzenleyicinin otomatik kopyalama işlemine izin vermiyor. İşlem için (Ctrl/Cmd+C) tuşlarını kullanın.',pasteMsg:'Lütfen aşağıdaki kutunun içine yapıştırın. (<STRONG>Ctrl/Cmd+V</STRONG>) ve <STRONG>Tamam</STRONG> butonunu tıklayın.',securityMsg:'Gezgin yazılımınızın güvenlik ayarları düzenleyicinin direkt olarak panoya erişimine izin vermiyor. Bu pencere içine tekrar yapıştırmalısınız..',pasteArea:'Yapıştırma Alanı'},pastefromword:{confirmCleanup:"Yapıştırmaya çalıştığınız metin Word'den kopyalanmıştır. Yapıştırmadan önce silmek istermisiniz?",toolbar:"Word'den Yapıştır",title:"Word'den Yapıştır",error:'Yapıştırmadaki veri bilgisi hata düzelene kadar silinmeyecektir'},pasteText:{button:'Düz Metin Olarak Yapıştır',title:'Düz Metin Olarak Yapıştır'},templates:{button:'Şablonlar',title:'İçerik Şablonları',options:'Şablon Seçenekleri',insertOption:'Mevcut içerik ile değiştir',selectPromptMsg:'Düzenleyicide açmak için lütfen bir şablon seçin.<br>(hali hazırdaki içerik kaybolacaktır.):',emptyListMsg:'(Belirli bir şablon seçilmedi)'},showBlocks:'Blokları Göster',stylesCombo:{label:'Biçem',panelTitle:'Stilleri Düzenliyor',panelTitle1:'Blok Stilleri',panelTitle2:'Inline Stilleri',panelTitle3:'Nesne Stilleri'},format:{label:'Biçim',panelTitle:'Biçim',tag_p:'Normal',tag_pre:'Biçimli',tag_address:'Adres',tag_h1:'Başlık 1',tag_h2:'Başlık 2',tag_h3:'Başlık 3',tag_h4:'Başlık 4',tag_h5:'Başlık 5',tag_h6:'Başlık 6',tag_div:'Paragraf (DIV)'},div:{title:'Div İçeriği Oluştur',toolbar:'Div İçeriği Oluştur',cssClassInputLabel:'Stilltipi Sınıfı',styleSelectLabel:'Stil',IdInputLabel:'Id',languageCodeInputLabel:' Dil Kodu',inlineStyleInputLabel:'Inline Stili',advisoryTitleInputLabel:'Tavsiye Başlığı',langDirLabel:'Dil Yönü',langDirLTRLabel:'Soldan sağa (LTR)',langDirRTLLabel:'Sağdan sola (RTL)',edit:'Div Düzenle',remove:'Div Kaldır'},iframe:{title:'IFrame Özellikleri',toolbar:'IFrame',noUrl:'Lütfen IFrame köprü (URL) bağlantısını yazın',scrolling:'Kaydırma çubuklarını aktif et',border:'Çerceve sınırlarını göster'},font:{label:'Yazı Türü',voiceLabel:'Font',panelTitle:'Yazı Türü'},fontSize:{label:'Boyut',voiceLabel:'Font Size',panelTitle:'Boyut'},colorButton:{textColorTitle:'Yazı Rengi',bgColorTitle:'Arka Renk',panelTitle:'Renkler',auto:'Otomatik',more:'Diğer renkler...'},colors:{'000':'Siyah',800000:'Kestane','8B4513':'Koyu Kahverengi','2F4F4F':'Koyu Kurşuni Gri','008080':'Teal','000080':'Mavi','4B0082':'Çivit Mavisi',696969:'Silik Gri',B22222:'Ateş Tuğlası',A52A2A:'Kahverengi',DAA520:'Altun Sırık','006400':'Koyu Yeşil','40E0D0':'Turkuaz','0000CD':'Orta Mavi',800080:'Pembe',808080:'Gri',F00:'Kırmızı',FF8C00:'Koyu Portakal',FFD700:'Altın','008000':'Yeşil','0FF':'Ciyan','00F':'Mavi',EE82EE:'Menekşe',A9A9A9:'Koyu Gri',FFA07A:'Açık Sarımsı',FFA500:'Portakal',FFFF00:'Sarı','00FF00':'Açık Yeşil',AFEEEE:'Sönük Turkuaz',ADD8E6:'Açık Mavi',DDA0DD:'Mor',D3D3D3:'Açık Gri',FFF0F5:'Eflatun Pembe',FAEBD7:'Antik Beyaz',FFFFE0:'Açık Sarı',F0FFF0:'Balsarısı',F0FFFF:'Gök Mavisi',F0F8FF:'Reha Mavi',E6E6FA:'Eflatun',FFF:'Beyaz'},scayt:{title:'Girmiş olduğunuz kelime denetimi',opera_title:'Opera tarafından desteklenmemektedir',enable:"SCAYT'ı etkinleştir",disable:"SCAYT'ı pasifleştir",about:"SCAYT'ı hakkında",toggle:"SCAYT'ı değiştir",options:'Seçenekler',langs:'Diller',moreSuggestions:'Daha fazla öneri',ignore:'Yoksay',ignoreAll:'Tümünü Yoksay',addWord:'Kelime Ekle',emptyDic:'Sözlük adı boş olamaz.',optionsTab:'Seçenekler',allCaps:'Tüm büyük küçük kelimeleri yoksay',ignoreDomainNames:'Domain adlarını yoksay',mixedCase:'Karışık büyüklük ile Sözcükler yoksay',mixedWithDigits:'Sayılarla Kelimeler yoksay',languagesTab:'Diller',dictionariesTab:'Sözlükler',dic_field_name:'Sözlük adı',dic_create:'Oluştur',dic_restore:'Geri al',dic_delete:'Sil',dic_rename:'Yeniden adlandır',dic_info:'Başlangıçta Kullanıcı Sözlüğü bir çerezde saklanır. Ancak, Çerezler boyutu sınırlıdır. Kullanıcı Sözlüğü, çerezin içinde saklanamayacağı bir noktada, bizim sunucularımızın içindeki sözlükte saklanabilir. Bizim sunucu üzerinde kişisel Sözlük saklamanız için, Sözlüğe bir ad belirtmelisiniz. Eğer zaten bir saklı Sözlük varsa, lütfen adını yazın ve Geri Yükle düğmesini tıklayın.',aboutTab:'Hakkında'},about:{title:'CKEditor Hakkında',dlgTitle:'CKEditor Hakkında',help:'Yardım için $1 kontrol edin.',userGuide:'CKEditor Kullanıcı Kılavuzu',moreInfo:'Lisanslama hakkında daha fazla bilgi almak için lütfen sitemizi ziyaret edin:',copy:'Copyright © $1. Tüm hakları saklıdır.'},maximize:'Büyült',minimize:'Küçült',fakeobjects:{anchor:'Bağlantı',flash:'Flash Animasyonu',iframe:'IFrame',hiddenfield:'Gizli Alan',unknown:'Bilinmeyen Nesne'},resize:'Boyutlandırmak için sürükle',colordialog:{title:'Renk seç',options:'Renk Seçenekleri',highlight:'İşaretle',selected:'Seçilmiş',clear:'Temizle'},toolbarCollapse:'Araç çubuklarını topla',toolbarExpand:'Araç çubuklarını aç',toolbarGroups:{document:'Belge',clipboard:'Pano/Geri al',editing:'Düzenleme',forms:'Formlar',basicstyles:'Temel Stiller',paragraph:'Paragraf',links:'Bağlantılar',insert:'Ekle',styles:'Stiller',colors:'Renkler',tools:'Araçlar'},bidi:{ltr:'Metin yönü soldan sağa',rtl:'Metin yönü sağdan sola'},docprops:{label:'Belge Özellikleri',title:'Belge Özellikleri',design:'Dizayn',meta:'Tanım Bilgisi (Meta)',chooseColor:'Seçiniz',other:'<diğer>',docTitle:'Sayfa Başlığı',charset:'Karakter Kümesi Kodlaması',charsetOther:'Diğer Karakter Kümesi Kodlaması',charsetASCII:'ASCII',charsetCE:'Orta Avrupa',charsetCT:'Geleneksel Çince (Big5)',charsetCR:'Kiril',charsetGR:'Yunanca',charsetJP:'Japonca',charsetKR:'Korece',charsetTR:'Türkçe',charsetUN:'Evrensel Kod (UTF-8)',charsetWE:'Batı Avrupa',docType:'Belge Türü Başlığı',docTypeOther:'Diğer Belge Türü Başlığı',xhtmlDec:'XHTML Bildirimlerini Dahil Et',bgColor:'Arka Plan Rengi',bgImage:'Arka Plan Resim URLsi',bgFixed:'Sabit Arka Plan',txtColor:'Yazı Rengi',margin:'Kenar Boşlukları',marginTop:'Tepe',marginLeft:'Sol',marginRight:'Sağ',marginBottom:'Alt',metaKeywords:'Belge Dizinleme Anahtar Kelimeleri (virgülle ayrılmış)',metaDescription:'Belge Tanımı',metaAuthor:'Yazar',metaCopyright:'Telif',previewHtml:'<p>Bu bir <strong>örnek metindir</strong>. <a href="javascript:void(0)">CKEditor</a> kullanıyorsunuz.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.tr={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Araç çubukları Editörü',editor:'Zengin Metin Editörü',source:'Kaynak',newPage:'Yeni Sayfa',save:'Kaydet',preview:'Ön İzleme',cut:'Kes',copy:'Kopyala',paste:'Yapıştır',print:'Yazdır',underline:'Altı Çizgili',bold:'Kalın',italic:'İtalik',selectAll:'Tümünü Seç',removeFormat:'Biçimi Kaldır',strike:'Üstü Çizgili',subscript:'Alt Simge',superscript:'Üst Simge',horizontalrule:'Yatay Satır Ekle',pagebreak:'Sayfa Sonu Ekle',pagebreakAlt:'Sayfa Sonu',unlink:'Köprü Kaldır',undo:'Geri Al',redo:'Tekrarla',common:{browseServer:'Sunucuyu Gez',url:'URL',protocol:'Protokol',upload:'Karşıya Yükle',uploadSubmit:'Sunucuya Yolla',image:'Resim',flash:'Flash',form:'Form',checkbox:'Onay Kutusu',radio:'Seçenek Düğmesi',textField:'Metin Girişi',textarea:'Çok Satırlı Metin',hiddenField:'Gizli Veri',button:'Düğme',select:'Seçim Menüsü',imageButton:'Resimli Düğme',notSet:'<tanımlanmamış>',id:'Kimlik',name:'Ad',langDir:'Dil Yönü',langDirLtr:'Soldan Sağa (LTR)',langDirRtl:'Sağdan Sola (RTL)',langCode:'Dil Kodlaması',longDescr:'Uzun Tanımlı URL',cssClass:'Biçem Sayfası Sınıfları',advisoryTitle:'Danışma Başlığı',cssStyle:'Biçem',ok:'Tamam',cancel:'İptal',close:'Kapat',preview:'Ön gösterim',generalTab:'Genel',advancedTab:'Gelişmiş',validateNumberFailed:'Bu değer sayı değildir.',confirmNewPage:'İceriğiniz kayıt edilmediğinden dolayı kaybolacaktır. Yeni bir sayfa yüklemek istediğinize eminsiniz?',confirmCancel:'Bazı seçenekler değişmiştir. Dialog penceresini kapatmak istediğinize eminmisiniz?',options:'Seçenekler',target:'Hedef',targetNew:'Yeni Pencere (_blank)',targetTop:'Enüst Pencere (_top)',targetSelf:'Aynı Pencere (_self)',targetParent:'Ana Pencere (_parent)',langDirLTR:'Soldan Sağa (LTR)',langDirRTL:'Sağdan Sola (RTL)',styles:'Stil',cssClasses:'Stil sayfası Sınıfı',width:'Genişlik',height:'Yükseklik',align:'Hizalama',alignLeft:'Sol',alignRight:'Sağ',alignCenter:'Merkez',alignTop:'Tepe',alignMiddle:'Orta',alignBottom:'Alt',invalidHeight:'Yükseklik sayı olmalıdır.',invalidWidth:'Genişlik bir sayı olmalıdır.',invalidCssLength:'Belirttiğiniz sayı "%1" alanı için pozitif bir sayı CSS birim değeri olmalıdır (px, %, in, cm, mm, em, ex, pt, veya pc).',invalidHtmlLength:'Belirttiğiniz sayı "%1" alanı için pozitif bir sayı HTML birim değeri olmalıdır (px veya %).',invalidInlineStyle:'Noktalı virgülle ayrılmış: "değer adı," inline stil için belirtilen değer biçiminde bir veya daha fazla dizilerden oluşmalıdır.',cssLengthTooltip:'Pikseller için bir numara girin veya geçerli bir CSS numarası (px, %, in, cm, mm, em, ex, pt, veya pc).',unavailable:'%1<span class="cke_accessibility">, hazır değildir</span>'},contextmenu:{options:'İçerik Menüsü Seçenekleri'},specialChar:{toolbar:'Özel Karakter Ekle',title:'Özel Karakter Seç',options:'Özel Karakter Seçenekleri'},link:{toolbar:'Link Ekle/Düzenle',other:'<diğer>',menu:'Link Düzenle',title:'Link',info:'Link Bilgisi',target:'Hedef',upload:'Karşıya Yükle',advanced:'Gelişmiş',type:'Link Türü',toUrl:'URL',toAnchor:'Bu sayfada çapa',toEmail:'E-Posta',targetFrame:'<çerçeve>',targetPopup:'<yeni açılan pencere>',targetFrameName:'Hedef Çerçeve Adı',targetPopupName:'Yeni Açılan Pencere Adı',popupFeatures:'Yeni Açılan Pencere Özellikleri',popupResizable:'Resizable',popupStatusBar:'Durum Çubuğu',popupLocationBar:'Yer Çubuğu',popupToolbar:'Araç Çubuğu',popupMenuBar:'Menü Çubuğu',popupFullScreen:'Tam Ekran (IE)',popupScrollBars:'Kaydırma Çubukları',popupDependent:'Bağımlı (Netscape)',popupLeft:'Sola Göre Konum',popupTop:'Yukarıya Göre Konum',id:'Id',langDir:'Dil Yönü',langDirLTR:'Soldan Sağa (LTR)',langDirRTL:'Sağdan Sola (RTL)',acccessKey:'Erişim Tuşu',name:'Ad',langCode:'Dil Yönü',tabIndex:'Sekme İndeksi',advisoryTitle:'Danışma Başlığı',advisoryContentType:'Danışma İçerik Türü',cssClasses:'Biçem Sayfası Sınıfları',charset:'Bağlı Kaynak Karakter Gurubu',styles:'Biçem',rel:'İlişki',selectAnchor:'Bağlantı Seç',anchorName:'Bağlantı Adı ile',anchorId:'Eleman Kimlik Numarası ile',emailAddress:'E-Posta Adresi',emailSubject:'İleti Konusu',emailBody:'İleti Gövdesi',noAnchors:'(Bu belgede hiç çapa yok)',noUrl:"Lütfen Link URL'sini yazın",noEmail:'Lütfen E-posta adresini yazın'},anchor:{toolbar:'Bağlantı Ekle/Düzenle',menu:'Bağlantı Özellikleri',title:'Bağlantı Özellikleri',name:'Bağlantı Adı',errorName:'Lütfen bağlantı için ad giriniz',remove:'Bağlantıyı Kaldır'},list:{numberedTitle:'Sayılandırılmış Liste Özellikleri',bulletedTitle:'Simgeli Liste Özellikleri',type:'Tipi',start:'Başla',validateStartNumber:'Liste başlangıcı tam sayı olmalıdır.',circle:'Daire',disc:'Disk',square:'Kare',none:'Yok',notset:'<ayarlanmamış>',armenian:'Ermenice sayılandırma',georgian:'Gürcüce numaralandırma (an, ban, gan, vs.)',lowerRoman:'Küçük Roman (i, ii, iii, iv, v, vs.)',upperRoman:'Büyük Roman (I, II, III, IV, V, vs.)',lowerAlpha:'Küçük Alpha (a, b, c, d, e, vs.)',upperAlpha:'Büyük Alpha (A, B, C, D, E, vs.)',lowerGreek:'Küçük Greek (alpha, beta, gamma, vs.)',decimal:'Ondalık (1, 2, 3, vs.)',decimalLeadingZero:'Başı sıfırlı ondalık (01, 02, 03, vs.)'},findAndReplace:{title:'Bul ve Değiştir',find:'Bul',replace:'Değiştir',findWhat:'Aranan:',replaceWith:'Bununla değiştir:',notFoundMsg:'Belirtilen yazı bulunamadı.',findOptions:'Seçenekleri Bul',matchCase:'Büyük/küçük harf duyarlı',matchWord:'Kelimenin tamamı uysun',matchCyclic:'Eşleşen döngü',replaceAll:'Tümünü Değiştir',replaceSuccessMsg:'%1 bulunanlardan değiştirildi.'},table:{toolbar:'Tablo',title:'Tablo Özellikleri',menu:'Tablo Özellikleri',deleteTable:'Tabloyu Sil',rows:'Satırlar',columns:'Sütunlar',border:'Kenar Kalınlığı',widthPx:'piksel',widthPc:'yüzde',widthUnit:'genişlik birimi',cellSpace:'Izgara kalınlığı',cellPad:'Izgara yazı arası',caption:'Başlık',summary:'Özet',headers:'Başlıklar',headersNone:'Yok',headersColumn:'İlk Sütun',headersRow:'İlk Satır',headersBoth:'Her İkisi',invalidRows:'Satır sayısı 0 sayısından büyük olmalıdır.',invalidCols:'Sütün sayısı 0 sayısından büyük olmalıdır.',invalidBorder:'Çerceve büyüklüklüğü sayı olmalıdır.',invalidWidth:'Tablo genişliği sayı olmalıdır.',invalidHeight:'Tablo yüksekliği sayı olmalıdır.',invalidCellSpacing:'Hücre boşluğu (spacing) sayı olmalıdır.',invalidCellPadding:'Hücre aralığı (padding) sayı olmalıdır.',cell:{menu:'Hücre',insertBefore:'Hücre Ekle - Önce',insertAfter:'Hücre Ekle - Sonra',deleteCell:'Hücre Sil',merge:'Hücreleri Birleştir',mergeRight:'Birleştir - Sağdaki İle ',mergeDown:'Birleştir - Aşağıdaki İle ',splitHorizontal:'Hücreyi Yatay Böl',splitVertical:'Hücreyi Dikey Böl',title:'Hücre Özellikleri',cellType:'Hücre Tipi',rowSpan:'Satırlar Mesafesi (Span)',colSpan:'Sütünlar Mesafesi (Span)',wordWrap:'Kelime Kaydırma',hAlign:'Düşey Hizalama',vAlign:'Yataş Hizalama',alignBaseline:'Tabana',bgColor:'Arkaplan Rengi',borderColor:'Çerçeve Rengi',data:'Veri',header:'Başlık',yes:'Evet',no:'Hayır',invalidWidth:'Hücre genişliği sayı olmalıdır.',invalidHeight:'Hücre yüksekliği sayı olmalıdır.',invalidRowSpan:'Satırların mesafesi tam sayı olmalıdır.',invalidColSpan:'Sütünların mesafesi tam sayı olmalıdır.',chooseColor:'Seçiniz'},row:{menu:'Satır',insertBefore:'Satır Ekle - Önce',insertAfter:'Satır Ekle - Sonra',deleteRow:'Satır Sil'},column:{menu:'Sütun',insertBefore:'Kolon Ekle - Önce',insertAfter:'Kolon Ekle - Sonra',deleteColumn:'Sütun Sil'}},button:{title:'Düğme Özellikleri',text:'Metin (Değer)',type:'Tip',typeBtn:'Düğme',typeSbm:'Gönder',typeRst:'Sıfırla'},checkboxAndRadio:{checkboxTitle:'Onay Kutusu Özellikleri',radioTitle:'Seçenek Düğmesi Özellikleri',value:'Değer',selected:'Seçili'},form:{title:'Form Özellikleri',menu:'Form Özellikleri',action:'İşlem',method:'Yöntem',encoding:'Kodlama'},select:{title:'Seçim Menüsü Özellikleri',selectInfo:'Bilgi',opAvail:'Mevcut Seçenekler',value:'Değer',size:'Boyut',lines:'satır',chkMulti:'Çoklu seçime izin ver',opText:'Metin',opValue:'Değer',btnAdd:'Ekle',btnModify:'Düzenle',btnUp:'Yukarı',btnDown:'Aşağı',btnSetValue:'Seçili değer olarak ata',btnDelete:'Sil'},textarea:{title:'Çok Satırlı Metin Özellikleri',cols:'Sütunlar',rows:'Satırlar'},textfield:{title:'Metin Girişi Özellikleri',name:'Ad',value:'Değer',charWidth:'Karakter Genişliği',maxChars:'En Fazla Karakter',type:'Tür',typeText:'Metin',typePass:'Şifre'},hidden:{title:'Gizli Veri Özellikleri',name:'Ad',value:'Değer'},image:{title:'Resim Özellikleri',titleButton:'Resimli Düğme Özellikleri',menu:'Resim Özellikleri',infoTab:'Resim Bilgisi',btnUpload:'Sunucuya Yolla',upload:'Karşıya Yükle',alt:'Alternatif Yazı',lockRatio:'Oranı Kilitle',resetSize:'Boyutu Başa Döndür',border:'Kenar',hSpace:'Yatay Boşluk',vSpace:'Dikey Boşluk',alertUrl:"Lütfen resmin URL'sini yazınız",linkTab:'Köprü',button2Img:'Seçili resim butonunu basit resime çevirmek istermisiniz?',img2Button:'Seçili olan resimi, resimli butona çevirmek istermisiniz?',urlMissing:'Resmin URL kaynağı eksiktir.',validateBorder:'Çerçeve tam sayı olmalıdır.',validateHSpace:'HSpace tam sayı olmalıdır.',validateVSpace:'VSpace tam sayı olmalıdır.'},flash:{properties:'Flash Özellikleri',propertiesTab:'Özellikler',title:'Flash Özellikleri',chkPlay:'Otomatik Oynat',chkLoop:'Döngü',chkMenu:'Flash Menüsünü Kullan',chkFull:'Tam ekrana İzinver',scale:'Boyutlandır',scaleAll:'Hepsini Göster',scaleNoBorder:'Kenar Yok',scaleFit:'Tam Sığdır',access:'Kod İzni',accessAlways:'Herzaman',accessSameDomain:'Aynı domain',accessNever:'Asla',alignAbsBottom:'Tam Altı',alignAbsMiddle:'Tam Ortası',alignBaseline:'Taban Çizgisi',alignTextTop:'Yazı Tepeye',quality:'Kalite',qualityBest:'En iyi',qualityHigh:'Yüksek',qualityAutoHigh:'Otomatik Yükseklik',qualityMedium:'Orta',qualityAutoLow:'Otomatik Düşüklük',qualityLow:'Düşük',windowModeWindow:'Pencere',windowModeOpaque:'Opak',windowModeTransparent:'Şeffaf',windowMode:'Pencere modu',flashvars:'Flash Değerleri',bgcolor:'Arka Renk',hSpace:'Yatay Boşluk',vSpace:'Dikey Boşluk',validateSrc:"Lütfen köprü URL'sini yazın",validateHSpace:'HSpace sayı olmalıdır.',validateVSpace:'VSpace sayı olmalıdır.'},spellCheck:{toolbar:'Yazım Denetimi',title:'Yazımı Denetle',notAvailable:'Üzügünüz, bu servis şuanda hizmet dışıdır.',errorLoading:'Uygulamada yüklerken hata oluştu: %s.',notInDic:'Sözlükte Yok',changeTo:'Şuna değiştir:',btnIgnore:'Yoksay',btnIgnoreAll:'Tümünü Yoksay',btnReplace:'Değiştir',btnReplaceAll:'Tümünü Değiştir',btnUndo:'Geri Al',noSuggestions:'- Öneri Yok -',progress:'Yazım denetimi işlemde...',noMispell:'Yazım denetimi tamamlandı: Yanlış yazıma rastlanmadı',noChanges:'Yazım denetimi tamamlandı: Hiçbir kelime değiştirilmedi',oneChange:'Yazım denetimi tamamlandı: Bir kelime değiştirildi',manyChanges:'Yazım denetimi tamamlandı: %1 kelime değiştirildi',ieSpellDownload:'Yazım denetimi yüklenmemiş. Şimdi yüklemek ister misiniz?'},smiley:{toolbar:'İfade',title:'İfade Ekle',options:'İfade Seçenekleri'},elementsPath:{eleLabel:'Elementlerin yolu',eleTitle:'%1 elementi'},numberedlist:'Numaralı Liste',bulletedlist:'Simgeli Liste',indent:'Sekme Arttır',outdent:'Sekme Azalt',justify:{left:'Sola Dayalı',center:'Ortalanmış',right:'Sağa Dayalı',block:'İki Kenara Yaslanmış'},blockquote:'Blok Oluştur',clipboard:{title:'Yapıştır',cutError:'Gezgin yazılımınızın güvenlik ayarları düzenleyicinin otomatik kesme işlemine izin vermiyor. İşlem için (Ctrl/Cmd+X) tuşlarını kullanın.',copyError:'Gezgin yazılımınızın güvenlik ayarları düzenleyicinin otomatik kopyalama işlemine izin vermiyor. İşlem için (Ctrl/Cmd+C) tuşlarını kullanın.',pasteMsg:'Lütfen aşağıdaki kutunun içine yapıştırın. (<STRONG>Ctrl/Cmd+V</STRONG>) ve <STRONG>Tamam</STRONG> butonunu tıklayın.',securityMsg:'Gezgin yazılımınızın güvenlik ayarları düzenleyicinin direkt olarak panoya erişimine izin vermiyor. Bu pencere içine tekrar yapıştırmalısınız..',pasteArea:'Yapıştırma Alanı'},pastefromword:{confirmCleanup:"Yapıştırmaya çalıştığınız metin Word'den kopyalanmıştır. Yapıştırmadan önce silmek istermisiniz?",toolbar:"Word'den Yapıştır",title:"Word'den Yapıştır",error:'Yapıştırmadaki veri bilgisi hata düzelene kadar silinmeyecektir'},pasteText:{button:'Düz Metin Olarak Yapıştır',title:'Düz Metin Olarak Yapıştır'},templates:{button:'Şablonlar',title:'İçerik Şablonları',options:'Şablon Seçenekleri',insertOption:'Mevcut içerik ile değiştir',selectPromptMsg:'Düzenleyicide açmak için lütfen bir şablon seçin.<br>(hali hazırdaki içerik kaybolacaktır.):',emptyListMsg:'(Belirli bir şablon seçilmedi)'},showBlocks:'Blokları Göster',stylesCombo:{label:'Biçem',panelTitle:'Stilleri Düzenliyor',panelTitle1:'Blok Stilleri',panelTitle2:'Inline Stilleri',panelTitle3:'Nesne Stilleri'},format:{label:'Biçim',panelTitle:'Biçim',tag_p:'Normal',tag_pre:'Biçimli',tag_address:'Adres',tag_h1:'Başlık 1',tag_h2:'Başlık 2',tag_h3:'Başlık 3',tag_h4:'Başlık 4',tag_h5:'Başlık 5',tag_h6:'Başlık 6',tag_div:'Paragraf (DIV)'},div:{title:'Div İçeriği Oluştur',toolbar:'Div İçeriği Oluştur',cssClassInputLabel:'Stilltipi Sınıfı',styleSelectLabel:'Stil',IdInputLabel:'Id',languageCodeInputLabel:' Dil Kodu',inlineStyleInputLabel:'Inline Stili',advisoryTitleInputLabel:'Tavsiye Başlığı',langDirLabel:'Dil Yönü',langDirLTRLabel:'Soldan sağa (LTR)',langDirRTLLabel:'Sağdan sola (RTL)',edit:'Div Düzenle',remove:'Div Kaldır'},iframe:{title:'IFrame Özellikleri',toolbar:'IFrame',noUrl:'Lütfen IFrame köprü (URL) bağlantısını yazın',scrolling:'Kaydırma çubuklarını aktif et',border:'Çerceve sınırlarını göster'},font:{label:'Yazı Türü',voiceLabel:'Font',panelTitle:'Yazı Türü'},fontSize:{label:'Boyut',voiceLabel:'Font Size',panelTitle:'Boyut'},colorButton:{textColorTitle:'Yazı Rengi',bgColorTitle:'Arka Renk',panelTitle:'Renkler',auto:'Otomatik',more:'Diğer renkler...'},colors:{'000':'Siyah',800000:'Kestane','8B4513':'Koyu Kahverengi','2F4F4F':'Koyu Kurşuni Gri','008080':'Teal','000080':'Mavi','4B0082':'Çivit Mavisi',696969:'Silik Gri',B22222:'Ateş Tuğlası',A52A2A:'Kahverengi',DAA520:'Altun Sırık','006400':'Koyu Yeşil','40E0D0':'Turkuaz','0000CD':'Orta Mavi',800080:'Pembe',808080:'Gri',F00:'Kırmızı',FF8C00:'Koyu Portakal',FFD700:'Altın','008000':'Yeşil','0FF':'Ciyan','00F':'Mavi',EE82EE:'Menekşe',A9A9A9:'Koyu Gri',FFA07A:'Açık Sarımsı',FFA500:'Portakal',FFFF00:'Sarı','00FF00':'Açık Yeşil',AFEEEE:'Sönük Turkuaz',ADD8E6:'Açık Mavi',DDA0DD:'Mor',D3D3D3:'Açık Gri',FFF0F5:'Eflatun Pembe',FAEBD7:'Antik Beyaz',FFFFE0:'Açık Sarı',F0FFF0:'Balsarısı',F0FFFF:'Gök Mavisi',F0F8FF:'Reha Mavi',E6E6FA:'Eflatun',FFF:'Beyaz'},scayt:{title:'Girmiş olduğunuz kelime denetimi',opera_title:'Opera tarafından desteklenmemektedir',enable:"SCAYT'ı etkinleştir",disable:"SCAYT'ı pasifleştir",about:"SCAYT'ı hakkında",toggle:"SCAYT'ı değiştir",options:'Seçenekler',langs:'Diller',moreSuggestions:'Daha fazla öneri',ignore:'Yoksay',ignoreAll:'Tümünü Yoksay',addWord:'Kelime Ekle',emptyDic:'Sözlük adı boş olamaz.',optionsTab:'Seçenekler',allCaps:'Tüm büyük küçük kelimeleri yoksay',ignoreDomainNames:'Domain adlarını yoksay',mixedCase:'Karışık büyüklük ile Sözcükler yoksay',mixedWithDigits:'Sayılarla Kelimeler yoksay',languagesTab:'Diller',dictionariesTab:'Sözlükler',dic_field_name:'Sözlük adı',dic_create:'Oluştur',dic_restore:'Geri al',dic_delete:'Sil',dic_rename:'Yeniden adlandır',dic_info:'Başlangıçta Kullanıcı Sözlüğü bir çerezde saklanır. Ancak, Çerezler boyutu sınırlıdır. Kullanıcı Sözlüğü, çerezin içinde saklanamayacağı bir noktada, bizim sunucularımızın içindeki sözlükte saklanabilir. Bizim sunucu üzerinde kişisel Sözlük saklamanız için, Sözlüğe bir ad belirtmelisiniz. Eğer zaten bir saklı Sözlük varsa, lütfen adını yazın ve Geri Yükle düğmesini tıklayın.',aboutTab:'Hakkında'},about:{title:'CKEditor Hakkında',dlgTitle:'CKEditor Hakkında',help:'Yardım için $1 kontrol edin.',userGuide:'CKEditor Kullanıcı Kılavuzu',moreInfo:'Lisanslama hakkında daha fazla bilgi almak için lütfen sitemizi ziyaret edin:',copy:'Copyright © $1. Tüm hakları saklıdır.'},maximize:'Büyült',minimize:'Küçült',fakeobjects:{anchor:'Bağlantı',flash:'Flash Animasyonu',iframe:'IFrame',hiddenfield:'Gizli Alan',unknown:'Bilinmeyen Nesne'},resize:'Boyutlandırmak için sürükle',colordialog:{title:'Renk seç',options:'Renk Seçenekleri',highlight:'İşaretle',selected:'Seçilmiş',clear:'Temizle'},toolbarCollapse:'Araç çubuklarını topla',toolbarExpand:'Araç çubuklarını aç',toolbarGroups:{document:'Belge',clipboard:'Pano/Geri al',editing:'Düzenleme',forms:'Formlar',basicstyles:'Temel Stiller',paragraph:'Paragraf',links:'Bağlantılar',insert:'Ekle',styles:'Stiller',colors:'Renkler',tools:'Araçlar'},bidi:{ltr:'Metin yönü soldan sağa',rtl:'Metin yönü sağdan sola'},docprops:{label:'Belge Özellikleri',title:'Belge Özellikleri',design:'Dizayn',meta:'Tanım Bilgisi (Meta)',chooseColor:'Seçiniz',other:'<diğer>',docTitle:'Sayfa Başlığı',charset:'Karakter Kümesi Kodlaması',charsetOther:'Diğer Karakter Kümesi Kodlaması',charsetASCII:'ASCII',charsetCE:'Orta Avrupa',charsetCT:'Geleneksel Çince (Big5)',charsetCR:'Kiril',charsetGR:'Yunanca',charsetJP:'Japonca',charsetKR:'Korece',charsetTR:'Türkçe',charsetUN:'Evrensel Kod (UTF-8)',charsetWE:'Batı Avrupa',docType:'Belge Türü Başlığı',docTypeOther:'Diğer Belge Türü Başlığı',xhtmlDec:'XHTML Bildirimlerini Dahil Et',bgColor:'Arka Plan Rengi',bgImage:'Arka Plan Resim URLsi',bgFixed:'Sabit Arka Plan',txtColor:'Yazı Rengi',margin:'Kenar Boşlukları',marginTop:'Tepe',marginLeft:'Sol',marginRight:'Sağ',marginBottom:'Alt',metaKeywords:'Belge Dizinleme Anahtar Kelimeleri (virgülle ayrılmış)',metaDescription:'Belge Tanımı',metaAuthor:'Yazar',metaCopyright:'Telif',previewHtml:'<p>Bu bir <strong>örnek metindir</strong>. <a href="javascript:void(0)">CKEditor</a> kullanıyorsunuz.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ug.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ug.js
index 03e87a4..f6c043d 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ug.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/ug.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.ug={dir:'rtl',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'قورال بالداق',editor:'تەھرىرلىگۈچ',source:'مەنبە',newPage:'يېڭى بەت',save:'ساقلا',preview:'ئالدىن كۆزەت',cut:'كەس',copy:'نەشر ھوقۇقىغا ئىگە بەلگىسى',paste:'چاپلا',print:'باس ',underline:'ئاستى سىزىق',bold:'توم',italic:'يانتۇ',selectAll:'ھەممىنى تاللا',removeFormat:'پىچىمنى چىقىرىۋەت',strike:'ئۆچۈرۈش سىزىقى',subscript:'تۆۋەن ئىندېكس',superscript:'يۇقىرى ئىندېكس',horizontalrule:'توغرا سىزىق قىستۇر',pagebreak:'بەت ئايرىغۇچ قىستۇر',pagebreakAlt:'بەت ئايرىغۇچ',unlink:'ئۇلانما بىكار قىل',undo:'يېنىۋال',redo:'قايتىلا ',common:{browseServer:'كۆرسىتىش مۇلازىمېتىر',url:'ئەسلى ھۆججەت',protocol:'كېلىشىم',upload:'يۈكلە',uploadSubmit:'مۇلازىمېتىرغا يۈكلە',image:'سۈرەت',flash:'Flash',form:'جەدۋەل',checkbox:'كۆپ تاللاش رامكىسى',radio:'يەككە تاللاش توپچىسى',textField:'يەككە قۇر تېكىست',textarea:'كۆپ قۇر تېكىست',hiddenField:'يوشۇرۇن دائىرە',button:'توپچا',select:'تىزىم/تىزىملىك',imageButton:'سۈرەت دائىرە',notSet:'‹تەڭشەلمىگەن›',id:'ID',name:'ئات',langDir:'تىل يۆنىلىشى',langDirLtr:'سولدىن ئوڭغا (LTR)',langDirRtl:'ئوڭدىن سولغا (RTL)',langCode:'تىل كودى',longDescr:'تەپسىلىي چۈشەندۈرۈش ئادرېسى',cssClass:'ئۇسلۇب خىلىنىڭ ئاتى',advisoryTitle:'ماۋزۇ',cssStyle:'قۇر ئىچىدىكى ئۇسلۇبى',ok:'جەزملە',cancel:'ۋاز كەچ',close:'تاقا',preview:'ئالدىن كۆزەت',generalTab:'ئادەتتىكى',advancedTab:'ئالىي',validateNumberFailed:'سان پىچىمىدا كىرگۈزۈش زۆرۈر',confirmNewPage:'نۆۋەتتىكى پۈتۈك مەزمۇنى ساقلانمىدى، يېڭى پۈتۈك قۇرامسىز؟',confirmCancel:'قىسمەن ئۆزگەرتىش ساقلانمىدى، بۇ سۆزلەشكۈنى تاقامسىز؟',options:'تاللانما',target:'نىشان كۆزنەك',targetNew:'يېڭى كۆزنەك (_blank)',targetTop:'پۈتۈن بەت (_top)',targetSelf:'مەزكۇر كۆزنەك (_self)',targetParent:'ئاتا كۆزنەك (_parent)',langDirLTR:'سولدىن ئوڭغا (LTR)',langDirRTL:'ئوڭدىن سولغا (RTL)',styles:'ئۇسلۇبلار',cssClasses:'ئۇسلۇب خىللىرى',width:'كەڭلىك',height:'ئېگىزلىك',align:'توغرىلىنىشى',alignLeft:'سول',alignRight:'ئوڭ',alignCenter:'ئوتتۇرا',alignTop:'ئۈستى',alignMiddle:'ئوتتۇرا',alignBottom:'ئاستى',invalidHeight:'ئېگىزلىك چوقۇم رەقەم پىچىمىدا بولۇشى زۆرۈر',invalidWidth:'كەڭلىك چوقۇم رەقەم پىچىمىدا بولۇشى زۆرۈر',invalidCssLength:'بۇ سۆز بۆلىكى چوقۇم مۇۋاپىق بولغان CSS ئۇزۇنلۇق قىممىتى بولۇشى زۆرۈر، بىرلىكى (px, %, in, cm, mm, em, ex, pt ياكى pc)',invalidHtmlLength:'بۇ سۆز بۆلىكى چوقۇم بىرىكمە HTML ئۇزۇنلۇق قىممىتى بولۇشى كېرەك. ئۆز ئىچىگە ئالىدىغان بىرلىك (px ياكى %)',invalidInlineStyle:'ئىچكى باغلانما ئۇسلۇبى چوقۇم چېكىتلىك پەش بىلەن ئايرىلغان بىر ياكى كۆپ «خاسلىق ئاتى:خاسلىق قىممىتى» پىچىمىدا بولۇشى لازىم',cssLengthTooltip:'بۇ سۆز بۆلىكى بىرىكمە CSS ئۇزۇنلۇق قىممىتى بولۇشى كېرەك. ئۆز ئىچىگە ئالىدىغان بىرلىك (px, %, in, cm, mm, em, ex, pt ياكى pc)',unavailable:'%1<span class=\\\\"cke_accessibility\\\\">، ئىشلەتكىلى بولمايدۇ</span>'},contextmenu:{options:'قىسقا يول تىزىملىك تاللانمىسى'},specialChar:{toolbar:'ئالاھىدە ھەرپ قىستۇر',title:'ئالاھىدە ھەرپ تاللاڭ',options:'ئالاھىدە ھەرپ تاللانمىسى'},link:{toolbar:'ئۇلانما قىستۇر/تەھرىرلە',other:'‹باشقا›',menu:'ئۇلانما تەھرىر',title:'ئۇلانما',info:'ئۇلانما ئۇچۇرى',target:'نىشان',upload:'يۈكلە',advanced:'ئالىي',type:'ئۇلانما تىپى',toUrl:'ئادرېس',toAnchor:'بەت ئىچىدىكى لەڭگەرلىك نۇقتا ئۇلانمىسى',toEmail:'ئېلخەت',targetFrame:'‹كاندۇك›',targetPopup:'‹قاڭقىش كۆزنەك›',targetFrameName:'نىشان كاندۇك ئاتى',targetPopupName:'قاڭقىش كۆزنەك ئاتى',popupFeatures:'قاڭقىش كۆزنەك خاسلىقى',popupResizable:'چوڭلۇقى ئۆزگەرتىشچان',popupStatusBar:'ھالەت بالداق',popupLocationBar:'ئادرېس بالداق',popupToolbar:'قورال بالداق',popupMenuBar:'تىزىملىك بالداق',popupFullScreen:'پۈتۈن ئېكران (IE)',popupScrollBars:'دومىلىما سۈرگۈچ',popupDependent:'تەۋە (NS)',popupLeft:'سول',popupTop:'ئوڭ',id:'ID',langDir:'تىل يۆنىلىشى',langDirLTR:'سولدىن ئوڭغا (LTR)',langDirRTL:'ئوڭدىن سولغا (RTL)',acccessKey:'زىيارەت كۇنۇپكا',name:'ئات',langCode:'تىل كودى',tabIndex:'Tab تەرتىپى',advisoryTitle:'ماۋزۇ',advisoryContentType:'مەزمۇن تىپى',cssClasses:'ئۇسلۇب خىلى ئاتى',charset:'ھەرپ كودلىنىشى',styles:'قۇر ئىچىدىكى ئۇسلۇبى',rel:'باغلىنىش',selectAnchor:'بىر لەڭگەرلىك نۇقتا تاللاڭ',anchorName:'لەڭگەرلىك نۇقتا ئاتى بويىچە',anchorId:'لەڭگەرلىك نۇقتا ID سى بويىچە',emailAddress:'ئادرېس',emailSubject:'ماۋزۇ',emailBody:'مەزمۇن',noAnchors:'(بۇ پۈتۈكتە ئىشلەتكىلى بولىدىغان لەڭگەرلىك نۇقتا يوق)',noUrl:'ئۇلانما ئادرېسىنى كىرگۈزۈڭ',noEmail:'ئېلخەت ئادرېسىنى كىرگۈزۈڭ'},anchor:{toolbar:'لەڭگەرلىك نۇقتا ئۇلانمىسى قىستۇر/تەھرىرلە',menu:'لەڭگەرلىك نۇقتا ئۇلانما خاسلىقى',title:'لەڭگەرلىك نۇقتا ئۇلانما خاسلىقى',name:'لەڭگەرلىك نۇقتا ئاتى',errorName:'لەڭگەرلىك نۇقتا ئاتىنى كىرگۈزۈڭ',remove:'لەڭگەرلىك نۇقتا ئۆچۈر'},list:{numberedTitle:'تەرتىپ نومۇر تىزىم خاسلىقى',bulletedTitle:'تۈر بەلگە تىزىم خاسلىقى',type:'بەلگە تىپى',start:'باشلىنىش نومۇرى',validateStartNumber:'تىزىم باشلىنىش تەرتىپ نومۇرى چوقۇم پۈتۈن سان پىچىمىدا بولۇشى لازىم',circle:'بوش چەمبەر',disc:'تولدۇرۇلغان چەمبەر',square:'تولدۇرۇلغان تۆت چاسا',none:'بەلگە يوق',notset:'‹تەڭشەلمىگەن›',armenian:'قەدىمكى ئەرمىنىيە تەرتىپ نومۇرى شەكلى',georgian:'قەدىمكى جورجىيە تەرتىپ نومۇرى شەكلى (an, ban, gan قاتارلىق)',lowerRoman:'كىچىك ھەرپلىك رىم رەقىمى (i, ii, iii, iv, v قاتارلىق)',upperRoman:'چوڭ ھەرپلىك رىم رەقىمى (I, II, III, IV, V قاتارلىق)',lowerAlpha:'ئىنگلىزچە كىچىك ھەرپ (a, b, c, d, e قاتارلىق)',upperAlpha:'ئىنگلىزچە چوڭ ھەرپ (A, B, C, D, E قاتارلىق)',lowerGreek:'گرېكچە كىچىك ھەرپ (alpha, beta, gamma قاتارلىق)',decimal:'سان (1, 2, 3 قاتارلىق)',decimalLeadingZero:'نۆلدىن باشلانغان سان بەلگە (01, 02, 03 قاتارلىق)'},findAndReplace:{title:'ئىزدەپ ئالماشتۇر',find:'ئىزدە',replace:'ئالماشتۇر',findWhat:'ئىزدە:',replaceWith:'ئالماشتۇر:',notFoundMsg:'بەلگىلەنگەن تېكىستنى تاپالمىدى',findOptions:'ئىزدەش تاللانمىسى',matchCase:'چوڭ كىچىك ھەرپنى پەرقلەندۈر',matchWord:'پۈتۈن سۆز ماسلىشىش',matchCyclic:'ئايلانما ماسلىشىش',replaceAll:'ھەممىنى ئالماشتۇر',replaceSuccessMsg:'جەمئى %1 جايدىكى ئالماشتۇرۇش تاماملاندى'},table:{toolbar:'جەدۋەل',title:'جەدۋەل خاسلىقى',menu:'جەدۋەل خاسلىقى',deleteTable:'جەدۋەل ئۆچۈر',rows:'قۇر سانى',columns:'ئىستون سانى',border:'گىرۋەك',widthPx:'پىكسېل',widthPc:'پىرسەنت',widthUnit:'كەڭلىك بىرلىكى',cellSpace:'ئارىلىق',cellPad:'يان ئارىلىق',caption:'ماۋزۇ',summary:'ئۈزۈندە',headers:'ماۋزۇ كاتەكچە',headersNone:'يوق',headersColumn:'بىرىنچى ئىستون',headersRow:'بىرىنچى قۇر',headersBoth:'بىرىنچى ئىستون ۋە بىرىنچى قۇر',invalidRows:'بەلگىلەنگەن ئىستون سانى چوقۇم نۆلدىن چوڭ بولىدۇ',invalidCols:'بەلگىلەنگەن قۇر سانى چوقۇم نۆلدىن چوڭ بولىدۇ',invalidBorder:'گىرۋەك توملۇقى چوقۇم سان بولىدۇ',invalidWidth:'جەدۋەل كەڭلىكى چوقۇم سان بولىدۇ',invalidHeight:'جەدۋەل ئېگىزلىكى چوقۇم سان بولىدۇ',invalidCellSpacing:'كاتەكچە ئارىلىقى چوقۇم سان بولىدۇ',invalidCellPadding:'كاتەكچىگە چوقۇم سان تولدۇرۇلىدۇ',cell:{menu:'كاتەكچە',insertBefore:'سولغا كاتەكچە قىستۇر',insertAfter:'ئوڭغا كاتەكچە قىستۇر',deleteCell:'كەتەكچە ئۆچۈر',merge:'كاتەكچە بىرلەشتۈر',mergeRight:'كاتەكچىنى ئوڭغا بىرلەشتۈر',mergeDown:'كاتەكچىنى ئاستىغا بىرلەشتۈر',splitHorizontal:'كاتەكچىنى توغرىسىغا بىرلەشتۈر',splitVertical:'كاتەكچىنى بويىغا بىرلەشتۈر',title:'كاتەكچە خاسلىقى',cellType:'كاتەكچە تىپى',rowSpan:'بويىغا چات ئارىسى قۇر سانى',colSpan:'توغرىسىغا چات ئارىسى ئىستون سانى',wordWrap:'ئۆزلۈكىدىن قۇر قاتلا',hAlign:'توغرىسىغا توغرىلا',vAlign:'بويىغا توغرىلا',alignBaseline:'ئاساسىي سىزىق',bgColor:'تەگلىك رەڭگى',borderColor:'گىرۋەك رەڭگى',data:'سانلىق مەلۇمات',header:'جەدۋەل باشى',yes:'ھەئە',no:'ياق',invalidWidth:'كاتەكچە كەڭلىكى چوقۇم سان بولىدۇ',invalidHeight:'كاتەكچە ئېگىزلىكى چوقۇم سان بولىدۇ',invalidRowSpan:'قۇر چات ئارىسى چوقۇم پۈتۈن سان بولىدۇ ',invalidColSpan:'ئىستون چات ئارىسى چوقۇم پۈتۈن سان بولىدۇ',chooseColor:'تاللاڭ'},row:{menu:'قۇر',insertBefore:'ئۈستىگە قۇر قىستۇر',insertAfter:'ئاستىغا قۇر قىستۇر',deleteRow:'قۇر ئۆچۈر'},column:{menu:'ئىستون',insertBefore:'سولغا ئىستون قىستۇر',insertAfter:'ئوڭغا ئىستون قىستۇر',deleteColumn:'ئىستون ئۆچۈر'}},button:{title:'توپچا خاسلىقى',text:'بەلگە (قىممەت)',type:'تىپى',typeBtn:'توپچا',typeSbm:'تاپشۇر',typeRst:'ئەسلىگە قايتۇر'},checkboxAndRadio:{checkboxTitle:'كۆپ تاللاش خاسلىقى',radioTitle:'تاق تاللاش توپچا خاسلىقى',value:'تاللىغان قىممەت',selected:'تاللانغان'},form:{title:'جەدۋەل خاسلىقى',menu:'جەدۋەل خاسلىقى',action:'مەشغۇلات',method:'ئۇسۇل',encoding:'جەدۋەل كودلىنىشى'},select:{title:'جەدۋەل/تىزىم خاسلىقى',selectInfo:'ئۇچۇر تاللاڭ',opAvail:'تاللاش تۈرلىرى',value:'قىممەت',size:'ئېگىزلىكى',lines:'قۇر',chkMulti:'كۆپ تاللاشچان',opText:'تاللانما تېكىستى',opValue:'تاللانما قىممىتى',btnAdd:'قوش',btnModify:'ئۆزگەرت',btnUp:'ئۈستىگە',btnDown:'ئاستىغا',btnSetValue:'دەسلەپكى تاللانما قىممىتىگە تەڭشە',btnDelete:'ئۆچۈر'},textarea:{title:' كۆپ قۇرلۇق تېكىست خاسلىقى',cols:'ھەرپ كەڭلىكى',rows:'قۇر سانى'},textfield:{title:'تاق قۇرلۇق تېكىست خاسلىقى',name:'ئات',value:'دەسلەپكى قىممىتى',charWidth:'ھەرپ كەڭلىكى',maxChars:'ئەڭ كۆپ ھەرپ سانى',type:'تىپى',typeText:'تېكىست',typePass:'ئىم'},hidden:{title:'يوشۇرۇن دائىرە خاسلىقى',name:'ئات',value:'دەسلەپكى قىممىتى'},image:{title:'سۈرەت خاسلىقى',titleButton:'سۈرەت دائىرە خاسلىقى',menu:'سۈرەت خاسلىقى',infoTab:'سۈرەت',btnUpload:'مۇلازىمېتىرغا يۈكلە',upload:'يۈكلە',alt:'تېكىست ئالماشتۇر',lockRatio:'نىسبەتنى قۇلۇپلا',resetSize:'ئەسلى چوڭلۇق',border:'گىرۋەك چوڭلۇقى',hSpace:'توغرىسىغا ئارىلىقى',vSpace:'بويىغا ئارىلىقى',alertUrl:'سۈرەت ئادرېسىنى كىرگۈزۈڭ',linkTab:'ئۇلانما',button2Img:'نۆۋەتتىكى توپچىنى سۈرەتكە ئۆزگەرتەمسىز؟',img2Button:'نۆۋەتتىكى سۈرەتنى توپچىغا ئۆزگەرتەمسىز؟',urlMissing:'سۈرەتنىڭ ئەسلى ھۆججەت ئادرېسى كەم',validateBorder:'گىرۋەك چوڭلۇقى چوقۇم سان بولىدۇ',validateHSpace:'توغرىسىغا ئارىلىق چوقۇم پۈتۈن سان بولىدۇ',validateVSpace:'بويىغا ئارىلىق چوقۇم پۈتۈن سان بولىدۇ'},flash:{properties:'Flash خاسلىق',propertiesTab:'خاسلىق',title:'ماۋزۇ',chkPlay:'ئۆزلۈكىدىن چال',chkLoop:'دەۋرىي',chkMenu:'Flash تىزىملىكنى قوزغات',chkFull:'پۈتۈن ئېكراننى قوزغات',scale:'نىسبىتى',scaleAll:'ھەممىنى كۆرسەت',scaleNoBorder:'گىرۋەك يوق',scaleFit:'قەتئىي ماسلىشىش',access:'قوليازما زىيارەتكە يول قوي',accessAlways:'ھەمىشە',accessSameDomain:'ئوخشاش دائىرىدە',accessNever:'ھەرگىز',alignAbsBottom:'مۇتلەق ئاستى',alignAbsMiddle:'مۇتلەق ئوتتۇرا',alignBaseline:'ئاساسىي سىزىق',alignTextTop:'تېكىست ئۈستىدە',quality:'سۈپەت',qualityBest:'ئەڭ ياخشى',qualityHigh:'يۇقىرى',qualityAutoHigh:'يۇقىرى (ئاپتوماتىك)',qualityMedium:'ئوتتۇرا (ئاپتوماتىك)',qualityAutoLow:'تۆۋەن (ئاپتوماتىك)',qualityLow:'تۆۋەن',windowModeWindow:'كۆزنەك گەۋدىسى',windowModeOpaque:'خىرە',windowModeTransparent:'سۈزۈك',windowMode:'كۆزنەك ھالىتى',flashvars:'Flash ئۆزگەرگۈچى',bgcolor:'تەگلىك رەڭگى',hSpace:'توغرىسىغا ئارىلىق',vSpace:'بويىغا ئارىلىق',validateSrc:'ئەسلى ھۆججەت ئادرېسىنى كىرگۈزۈڭ',validateHSpace:'توغرىسىغا ئارىلىق چوقۇم سان بولىدۇ',validateVSpace:'بويىغا ئارىلىق چوقۇم سان بولىدۇ'},spellCheck:{toolbar:'ئىملا تەكشۈر',title:'ئىملا تەكشۈر',notAvailable:'كەچۈرۈڭ، مۇلازىمېتىرنى ۋاقتىنچە ئىشلەتكىلى بولمايدۇ',errorLoading:'لازىملىق مۇلازىمېتىرنى يۈكلىگەندە خاتالىق كۆرۈلدى: %s.',notInDic:'لۇغەتتە يوق',changeTo:'ئۆزگەرت',btnIgnore:'پەرۋا قىلما',btnIgnoreAll:'ھەممىگە پەرۋا قىلما',btnReplace:'ئالماشتۇر',btnReplaceAll:'ھەممىنى ئالماشتۇر',btnUndo:'يېنىۋال',noSuggestions:'-تەكلىپ يوق-',progress:'ئىملا تەكشۈرۈۋاتىدۇ…',noMispell:'ئىملا تەكشۈرۈش تامام: ئىملا خاتالىقى بايقالمىدى',noChanges:'ئىملا تەكشۈرۈش تامام: ھېچقانداق سۆزنى ئۆزگەرتمىدى',oneChange:'ئىملا تەكشۈرۈش تامام: بىر سۆزنى ئۆزگەرتتى',manyChanges:'ئىملا تەكشۈرۈش تامام: %1 سۆزنى ئۆزگەرتتى',ieSpellDownload:'ئىملا تەكشۈرۈش قىستۇرمىسى تېخى ئورنىتىلمىغان، ھازىرلا چۈشۈرەمسىز؟'},smiley:{toolbar:'چىراي ئىپادە',title:'چىراي ئىپادە سىنبەلگە قىستۇر',options:'چىراي ئىپادە سىنبەلگە تاللانمىسى'},elementsPath:{eleLabel:'ئېلېمېنت يولى',eleTitle:'%1 ئېلېمېنت'},numberedlist:'تەرتىپ نومۇر تىزىمى',bulletedlist:'تۈر بەلگە تىزىمى',indent:'تارايت',outdent:'كەڭەيت',justify:{left:'سولغا توغرىلا',center:'ئوتتۇرىغا توغرىلا',right:'ئوڭغا توغرىلا',block:'ئىككى تەرەپتىن توغرىلا'},blockquote:'بۆلەك نەقىل',clipboard:{title:'چاپلا',cutError:'تور كۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى تەھرىرلىگۈچنىڭ كەس مەشغۇلاتىنى ئۆزلۈكىدىن ئىجرا قىلىشىغا يول قويمايدۇ، ھەرپتاختا تېز كۇنۇپكا (Ctrl/Cmd+X) ئارقىلىق تاماملاڭ',copyError:'تور كۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى تەھرىرلىگۈچنىڭ كۆچۈر مەشغۇلاتىنى ئۆزلۈكىدىن ئىجرا قىلىشىغا يول قويمايدۇ، ھەرپتاختا تېز كۇنۇپكا (Ctrl/Cmd+C) ئارقىلىق تاماملاڭ',pasteMsg:'ھەرپتاختا تېز كۇنۇپكا (<STRONG>Ctrl/Cmd+V</STRONG>) نى ئىشلىتىپ مەزمۇننى تۆۋەندىكى رامكىغا كۆچۈرۈڭ، ئاندىن <STRONG>جەزملە</STRONG>نى بېسىڭ',securityMsg:'توركۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى سەۋەبىدىن بۇ تەھرىرلىگۈچ چاپلاش تاختىسىدىكى مەزمۇننى بىۋاستە زىيارەت قىلالمايدۇ، بۇ كۆزنەكتە قايتا بىر قېتىم چاپلىشىڭىز كېرەك.',pasteArea:'چاپلاش دائىرىسى'},pastefromword:{confirmCleanup:'سىز چاپلىماقچى بولغان مەزمۇن MS Word تىن كەلگەندەك قىلىدۇ، MS Word پىچىمىنى تازىلىۋەتكەندىن كېيىن ئاندىن چاپلامدۇ؟',toolbar:'MS Word تىن چاپلا',title:'MS Word تىن چاپلا',error:'ئىچكى خاتالىق سەۋەبىدىن چاپلايدىغان سانلىق مەلۇماتنى تازىلىيالمايدۇ'},pasteText:{button:'پىچىمى يوق تېكىست سۈپىتىدە چاپلا',title:'پىچىمى يوق تېكىست سۈپىتىدە چاپلا'},templates:{button:'قېلىپ',title:'مەزمۇن قېلىپى',options:'قېلىپ تاللانمىسى',insertOption:'نۆۋەتتىكى مەزمۇننى ئالماشتۇر',selectPromptMsg:'تەھرىرلىگۈچنىڭ مەزمۇن قېلىپىنى تاللاڭ:',emptyListMsg:'(قېلىپ يوق)'},showBlocks:'بۆلەكنى كۆرسەت',stylesCombo:{label:'ئۇسلۇب',panelTitle:'ئۇسلۇب',panelTitle1:'بۆلەك دەرىجىسىدىكى ئېلېمېنت ئۇسلۇبى',panelTitle2:'ئىچكى باغلانما ئېلېمېنت ئۇسلۇبى',panelTitle3:'نەڭ (Object) ئېلېمېنت ئۇسلۇبى'},format:{label:'پىچىم',panelTitle:'پىچىم',tag_p:'ئادەتتىكى',tag_pre:'تىزىلغان پىچىم',tag_address:'ئادرېس',tag_h1:'ماۋزۇ 1',tag_h2:'ماۋزۇ 2',tag_h3:'ماۋزۇ 3',tag_h4:'ماۋزۇ 4',tag_h5:'ماۋزۇ 5',tag_h6:'ماۋزۇ 6',tag_div:'ئابزاس (DIV)'},div:{title:'DIV قاچا قۇر',toolbar:'DIV قاچا قۇر',cssClassInputLabel:'ئۇسلۇب تىپىنىڭ ئاتى',styleSelectLabel:'ئۇسلۇب',IdInputLabel:'ID',languageCodeInputLabel:'تىل كودى',inlineStyleInputLabel:'قۇر ئىچىدىكى ئۇسلۇبى',advisoryTitleInputLabel:'ماۋزۇ',langDirLabel:'تىل يۆنىلىشى',langDirLTRLabel:'سولدىن ئوڭغا (LTR)',langDirRTLLabel:'ئوڭدىن سولغا (RTL)',edit:'DIV تەھرىر',remove:'DIV چىقىرىۋەت'},iframe:{title:'IFrame خاسلىق',toolbar:'IFrame ',noUrl:'كاندۇكنىڭ ئادرېسى(Url)نى كىرگۈزۈڭ',scrolling:'دومىلىما سۈرگۈچكە يول قوي',border:'كاندۇك گىرۋەكلىرىنى كۆرسەت'},font:{label:'خەت نۇسخا',voiceLabel:'خەت نۇسخا',panelTitle:'خەت نۇسخا'},fontSize:{label:'چوڭلۇقى',voiceLabel:'خەت چوڭلۇقى',panelTitle:'چوڭلۇقى'},colorButton:{textColorTitle:'تېكىست رەڭگى',bgColorTitle:'تەگلىك رەڭگى',panelTitle:'رەڭ',auto:'ئۆزلۈكىدىن',more:'باشقا رەڭ'},colors:{'000':'قارا',800000:'قىزغۇچ سېرىق','8B4513':'توق قوڭۇر','2F4F4F':'قارامتۇل يېشىل','008080':'كۆكۈش يېشىل','000080':'قارامتۇل كۆك','4B0082':'كۆكۈش كۈلرەڭ',696969:'قارامتۇل كۈلرەڭ',B22222:'خىش قىزىل',A52A2A:'قوڭۇر',DAA520:'ئالتۇن سېرىق','006400':'توق يېشىل','40E0D0':'كۆكۈچ يېشىل','0000CD':'ئوتتۇراھال كۆك',800080:'بىنەپشە',808080:'كۈلرەڭ',F00:'قىزىل',FF8C00:'توق قىزغۇچ سېرىق',FFD700:'ئالتۇن','008000':'يېشىل','0FF':'يېشىل كۆك','00F':'كۆك',EE82EE:'قىزغۇچ بىنەپشە',A9A9A9:'توق كۈلرەڭ',FFA07A:'كاۋا چېچىكى سېرىق',FFA500:'قىزغۇچ سېرىق',FFFF00:'سېرىق','00FF00':'Lime',AFEEEE:'سۇس ھاۋا رەڭ',ADD8E6:'ئوچۇق كۆك',DDA0DD:'قىزغۇچ بىنەپشە',D3D3D3:'سۇس كۆكۈچ كۈلرەڭ',FFF0F5:'سۇس قىزغۇچ بىنەپشە',FAEBD7:'Antique White',FFFFE0:'سۇس سېرىق',F0FFF0:'Honeydew',F0FFFF:'ئاسمان كۆكى',F0F8FF:'سۇس كۆك',E6E6FA:'سۇس بىنەپشە',FFF:'ئاق'},scayt:{title:'شۇئان ئىملا تەكشۈر',opera_title:'Opera توركۆرگۈنى قوللىمايدۇ',enable:'شۇئان ئىملا تەكشۈرۈشنى قوزغات',disable:'شۇئان ئىملا تەكشۈرۈشنى چەكلە',about:'شۇئان ئىملا تەكشۈرۈش ھەققىدە',toggle:'شۇئان ئىملا تەكشۈرۈشنى ۋاقىتلىق توختات/قوزغات',options:'تاللانما',langs:'تىل',moreSuggestions:'تېخىمۇ كۆپ ئىملا تەۋسىيەسى',ignore:'پەرۋا قىلما',ignoreAll:'ھەممىسىگە پەرۋا قىلما',addWord:'سۆز قوش',emptyDic:'لۇغەت ئاتى بوش قالمايدۇ',optionsTab:'تاللانما',allCaps:'چوڭ ھەرپتە يېزىلغان ھەممە سۆزگە پەرۋا قىلما',ignoreDomainNames:'دائىرە ئاتىغا پەرۋا قىلما',mixedCase:'چوڭ كىچىك ھەرپ بىلەن ئارىلاش يېزىلغان سۆزگە پەرۋا قىلما',mixedWithDigits:'سان بار سۆزگە پەرۋا قىلما',languagesTab:'تىل',dictionariesTab:'لۇغەت',dic_field_name:'لۇغەت ئاتى',dic_create:'قۇر',dic_restore:'ئەسلىگە كەلتۈر',dic_delete:'ئۆچۈر',dic_rename:'ئات ئۆزگەرت',dic_info:'باشلىنىشتا ئىشلەتكۈچى لۇغىتى Cookie غا ساقلىنىدۇ ئەمما Cookie نىڭ سىغىمى چەكلىك بولغاچقا، ئىشلەتكۈچى لۇغىتى كۆپىيىپ Cookie چەكلىمىسىدىن ئېشىپ كەتكەندە ساقلىغىلى بولمايدۇ، بۇ چاغدا لۇغىتىڭىزنى مۇلازىمېتىرىمىزغا ساقلىسىڭىز بولىدۇ. شەخسىي لۇغىتىڭىزنى مۇلازىمېتىرىمىزغا ساقلىماقچى بولسىڭىز لۇغىتىڭىزگە ئاتتىن بىرنى قويۇڭ، ئەگەر مۇلازىمتېرىمىزدا سىزنىڭ لۇغىتىڭىزدىن بىرسى بولسا لۇغەت ئاتىنى كىرگۈزۈپ ئەسلىگە قايتۇر توپچىسىنى بېسىڭ.',aboutTab:'ھەققىدە'},about:{title:'CKEditor ھەققىدە',dlgTitle:'CKEditor ھەققىدە',help:'$1 نى زىيارەت قىلىپ ياردەمگە ئېرىشىڭ',userGuide:'CKEditor ئىشلەتكۈچى قوللانمىسى',moreInfo:'تور تۇرايىمىزنى زىيارەت قىلىپ كېلىشىمگە ئائىت تېخىمۇ كۆپ ئۇچۇرغا ئېرىشىڭ',copy:'Copyright © $1. نەشر ھوقۇقىغا ئىگە'},maximize:'چوڭايت',minimize:'كىچىكلەت',fakeobjects:{anchor:'لەڭگەرلىك نۇقتا',flash:'Flash جانلاندۇرۇم',iframe:'IFrame',hiddenfield:'يوشۇرۇن دائىرە',unknown:'يوچۇن نەڭ'},resize:'چوڭلۇقىنى ئۆزگەرت',colordialog:{title:'رەڭ تاللاڭ',options:'رەڭ تاللانمىسى',highlight:'يورۇت',selected:'رەڭ تاللاڭ',clear:'تازىلا'},toolbarCollapse:'قورال بالداقنى قاتلا',toolbarExpand:'قورال بالداقنى ياي',toolbarGroups:{document:'پۈتۈك',clipboard:'چاپلاش تاختىسى/يېنىۋال',editing:'تەھرىر',forms:'جەدۋەل',basicstyles:'ئاساسىي ئۇسلۇب',paragraph:'ئابزاس',links:'ئۇلانما',insert:'قىستۇر',styles:'ئۇسلۇب',colors:'رەڭ',tools:'قورال'},bidi:{ltr:'تېكىست يۆنىلىشى سولدىن ئوڭغا',rtl:'تېكىست يۆنىلىشى ئوڭدىن سولغا'},docprops:{label:'بەت خاسلىقى',title:'بەت خاسلىقى',design:'لايىھە',meta:'مېتا سانلىق مەلۇمات',chooseColor:'تاللاڭ',other:'باشقا',docTitle:'بەت ماۋزۇسى',charset:'ھەرپ كودلىنىشى',charsetOther:'باشقا ھەرپ كودلىنىشى',charsetASCII:'ASCII',charsetCE:'ئوتتۇرا ياۋرۇپا',charsetCT:'مۇرەككەپ خەنزۇچە (Big5)',charsetCR:'سىلاۋيانچە',charsetGR:'گىرېكچە',charsetJP:'ياپونچە',charsetKR:'كۆرىيەچە',charsetTR:'تۈركچە',charsetUN:'يۇنىكود (UTF-8)',charsetWE:'غەربىي ياۋرۇپا',docType:'پۈتۈك تىپى',docTypeOther:'باشقا پۈتۈك تىپى',xhtmlDec:'XHTML ئېنىقلىمىسىنى ئۆز ئىچىگە ئالىدۇ',bgColor:'تەگلىك رەڭگى',bgImage:'تەگلىك سۈرەت',bgFixed:'تەگلىك سۈرەتنى دومىلاتما',txtColor:'تېكىست رەڭگى',margin:'بەت گىرۋەك',marginTop:'ئۈستى',marginLeft:'سول',marginRight:'ئوڭ',marginBottom:'ئاستى',metaKeywords:'بەت يۈزى ئىندېكىس ھالقىلىق سۆزى (ئىنگلىزچە پەش [,] بىلەن ئايرىلىدۇ)',metaDescription:'بەت يۈزى چۈشەندۈرۈشى',metaAuthor:'يازغۇچى',metaCopyright:'نەشر ھوقۇقى',previewHtml:'<p>بۇ بىر قىسىم <strong>كۆرسەتمىگە ئىشلىتىدىغان تېكىست </strong>سىز نۆۋەتتە <a href=\\\\"javascript:void(0)\\\\">CKEditor</a>.نى ئىشلىتىۋاتىسىز.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.ug={dir:'rtl',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'قورال بالداق',editor:'تەھرىرلىگۈچ',source:'مەنبە',newPage:'يېڭى بەت',save:'ساقلا',preview:'ئالدىن كۆزەت',cut:'كەس',copy:'نەشر ھوقۇقىغا ئىگە بەلگىسى',paste:'چاپلا',print:'باس ',underline:'ئاستى سىزىق',bold:'توم',italic:'يانتۇ',selectAll:'ھەممىنى تاللا',removeFormat:'پىچىمنى چىقىرىۋەت',strike:'ئۆچۈرۈش سىزىقى',subscript:'تۆۋەن ئىندېكس',superscript:'يۇقىرى ئىندېكس',horizontalrule:'توغرا سىزىق قىستۇر',pagebreak:'بەت ئايرىغۇچ قىستۇر',pagebreakAlt:'بەت ئايرىغۇچ',unlink:'ئۇلانما بىكار قىل',undo:'يېنىۋال',redo:'قايتىلا ',common:{browseServer:'كۆرسىتىش مۇلازىمېتىر',url:'ئەسلى ھۆججەت',protocol:'كېلىشىم',upload:'يۈكلە',uploadSubmit:'مۇلازىمېتىرغا يۈكلە',image:'سۈرەت',flash:'Flash',form:'جەدۋەل',checkbox:'كۆپ تاللاش رامكىسى',radio:'يەككە تاللاش توپچىسى',textField:'يەككە قۇر تېكىست',textarea:'كۆپ قۇر تېكىست',hiddenField:'يوشۇرۇن دائىرە',button:'توپچا',select:'تىزىم/تىزىملىك',imageButton:'سۈرەت دائىرە',notSet:'‹تەڭشەلمىگەن›',id:'ID',name:'ئات',langDir:'تىل يۆنىلىشى',langDirLtr:'سولدىن ئوڭغا (LTR)',langDirRtl:'ئوڭدىن سولغا (RTL)',langCode:'تىل كودى',longDescr:'تەپسىلىي چۈشەندۈرۈش ئادرېسى',cssClass:'ئۇسلۇب خىلىنىڭ ئاتى',advisoryTitle:'ماۋزۇ',cssStyle:'قۇر ئىچىدىكى ئۇسلۇبى',ok:'جەزملە',cancel:'ۋاز كەچ',close:'تاقا',preview:'ئالدىن كۆزەت',generalTab:'ئادەتتىكى',advancedTab:'ئالىي',validateNumberFailed:'سان پىچىمىدا كىرگۈزۈش زۆرۈر',confirmNewPage:'نۆۋەتتىكى پۈتۈك مەزمۇنى ساقلانمىدى، يېڭى پۈتۈك قۇرامسىز؟',confirmCancel:'قىسمەن ئۆزگەرتىش ساقلانمىدى، بۇ سۆزلەشكۈنى تاقامسىز؟',options:'تاللانما',target:'نىشان كۆزنەك',targetNew:'يېڭى كۆزنەك (_blank)',targetTop:'پۈتۈن بەت (_top)',targetSelf:'مەزكۇر كۆزنەك (_self)',targetParent:'ئاتا كۆزنەك (_parent)',langDirLTR:'سولدىن ئوڭغا (LTR)',langDirRTL:'ئوڭدىن سولغا (RTL)',styles:'ئۇسلۇبلار',cssClasses:'ئۇسلۇب خىللىرى',width:'كەڭلىك',height:'ئېگىزلىك',align:'توغرىلىنىشى',alignLeft:'سول',alignRight:'ئوڭ',alignCenter:'ئوتتۇرا',alignTop:'ئۈستى',alignMiddle:'ئوتتۇرا',alignBottom:'ئاستى',invalidHeight:'ئېگىزلىك چوقۇم رەقەم پىچىمىدا بولۇشى زۆرۈر',invalidWidth:'كەڭلىك چوقۇم رەقەم پىچىمىدا بولۇشى زۆرۈر',invalidCssLength:'بۇ سۆز بۆلىكى چوقۇم مۇۋاپىق بولغان CSS ئۇزۇنلۇق قىممىتى بولۇشى زۆرۈر، بىرلىكى (px, %, in, cm, mm, em, ex, pt ياكى pc)',invalidHtmlLength:'بۇ سۆز بۆلىكى چوقۇم بىرىكمە HTML ئۇزۇنلۇق قىممىتى بولۇشى كېرەك. ئۆز ئىچىگە ئالىدىغان بىرلىك (px ياكى %)',invalidInlineStyle:'ئىچكى باغلانما ئۇسلۇبى چوقۇم چېكىتلىك پەش بىلەن ئايرىلغان بىر ياكى كۆپ «خاسلىق ئاتى:خاسلىق قىممىتى» پىچىمىدا بولۇشى لازىم',cssLengthTooltip:'بۇ سۆز بۆلىكى بىرىكمە CSS ئۇزۇنلۇق قىممىتى بولۇشى كېرەك. ئۆز ئىچىگە ئالىدىغان بىرلىك (px, %, in, cm, mm, em, ex, pt ياكى pc)',unavailable:'%1<span class=\\\\"cke_accessibility\\\\">، ئىشلەتكىلى بولمايدۇ</span>'},contextmenu:{options:'قىسقا يول تىزىملىك تاللانمىسى'},specialChar:{toolbar:'ئالاھىدە ھەرپ قىستۇر',title:'ئالاھىدە ھەرپ تاللاڭ',options:'ئالاھىدە ھەرپ تاللانمىسى'},link:{toolbar:'ئۇلانما قىستۇر/تەھرىرلە',other:'‹باشقا›',menu:'ئۇلانما تەھرىر',title:'ئۇلانما',info:'ئۇلانما ئۇچۇرى',target:'نىشان',upload:'يۈكلە',advanced:'ئالىي',type:'ئۇلانما تىپى',toUrl:'ئادرېس',toAnchor:'بەت ئىچىدىكى لەڭگەرلىك نۇقتا ئۇلانمىسى',toEmail:'ئېلخەت',targetFrame:'‹كاندۇك›',targetPopup:'‹قاڭقىش كۆزنەك›',targetFrameName:'نىشان كاندۇك ئاتى',targetPopupName:'قاڭقىش كۆزنەك ئاتى',popupFeatures:'قاڭقىش كۆزنەك خاسلىقى',popupResizable:'چوڭلۇقى ئۆزگەرتىشچان',popupStatusBar:'ھالەت بالداق',popupLocationBar:'ئادرېس بالداق',popupToolbar:'قورال بالداق',popupMenuBar:'تىزىملىك بالداق',popupFullScreen:'پۈتۈن ئېكران (IE)',popupScrollBars:'دومىلىما سۈرگۈچ',popupDependent:'تەۋە (NS)',popupLeft:'سول',popupTop:'ئوڭ',id:'ID',langDir:'تىل يۆنىلىشى',langDirLTR:'سولدىن ئوڭغا (LTR)',langDirRTL:'ئوڭدىن سولغا (RTL)',acccessKey:'زىيارەت كۇنۇپكا',name:'ئات',langCode:'تىل كودى',tabIndex:'Tab تەرتىپى',advisoryTitle:'ماۋزۇ',advisoryContentType:'مەزمۇن تىپى',cssClasses:'ئۇسلۇب خىلى ئاتى',charset:'ھەرپ كودلىنىشى',styles:'قۇر ئىچىدىكى ئۇسلۇبى',rel:'باغلىنىش',selectAnchor:'بىر لەڭگەرلىك نۇقتا تاللاڭ',anchorName:'لەڭگەرلىك نۇقتا ئاتى بويىچە',anchorId:'لەڭگەرلىك نۇقتا ID سى بويىچە',emailAddress:'ئادرېس',emailSubject:'ماۋزۇ',emailBody:'مەزمۇن',noAnchors:'(بۇ پۈتۈكتە ئىشلەتكىلى بولىدىغان لەڭگەرلىك نۇقتا يوق)',noUrl:'ئۇلانما ئادرېسىنى كىرگۈزۈڭ',noEmail:'ئېلخەت ئادرېسىنى كىرگۈزۈڭ'},anchor:{toolbar:'لەڭگەرلىك نۇقتا ئۇلانمىسى قىستۇر/تەھرىرلە',menu:'لەڭگەرلىك نۇقتا ئۇلانما خاسلىقى',title:'لەڭگەرلىك نۇقتا ئۇلانما خاسلىقى',name:'لەڭگەرلىك نۇقتا ئاتى',errorName:'لەڭگەرلىك نۇقتا ئاتىنى كىرگۈزۈڭ',remove:'لەڭگەرلىك نۇقتا ئۆچۈر'},list:{numberedTitle:'تەرتىپ نومۇر تىزىم خاسلىقى',bulletedTitle:'تۈر بەلگە تىزىم خاسلىقى',type:'بەلگە تىپى',start:'باشلىنىش نومۇرى',validateStartNumber:'تىزىم باشلىنىش تەرتىپ نومۇرى چوقۇم پۈتۈن سان پىچىمىدا بولۇشى لازىم',circle:'بوش چەمبەر',disc:'تولدۇرۇلغان چەمبەر',square:'تولدۇرۇلغان تۆت چاسا',none:'بەلگە يوق',notset:'‹تەڭشەلمىگەن›',armenian:'قەدىمكى ئەرمىنىيە تەرتىپ نومۇرى شەكلى',georgian:'قەدىمكى جورجىيە تەرتىپ نومۇرى شەكلى (an, ban, gan قاتارلىق)',lowerRoman:'كىچىك ھەرپلىك رىم رەقىمى (i, ii, iii, iv, v قاتارلىق)',upperRoman:'چوڭ ھەرپلىك رىم رەقىمى (I, II, III, IV, V قاتارلىق)',lowerAlpha:'ئىنگلىزچە كىچىك ھەرپ (a, b, c, d, e قاتارلىق)',upperAlpha:'ئىنگلىزچە چوڭ ھەرپ (A, B, C, D, E قاتارلىق)',lowerGreek:'گرېكچە كىچىك ھەرپ (alpha, beta, gamma قاتارلىق)',decimal:'سان (1, 2, 3 قاتارلىق)',decimalLeadingZero:'نۆلدىن باشلانغان سان بەلگە (01, 02, 03 قاتارلىق)'},findAndReplace:{title:'ئىزدەپ ئالماشتۇر',find:'ئىزدە',replace:'ئالماشتۇر',findWhat:'ئىزدە:',replaceWith:'ئالماشتۇر:',notFoundMsg:'بەلگىلەنگەن تېكىستنى تاپالمىدى',findOptions:'ئىزدەش تاللانمىسى',matchCase:'چوڭ كىچىك ھەرپنى پەرقلەندۈر',matchWord:'پۈتۈن سۆز ماسلىشىش',matchCyclic:'ئايلانما ماسلىشىش',replaceAll:'ھەممىنى ئالماشتۇر',replaceSuccessMsg:'جەمئى %1 جايدىكى ئالماشتۇرۇش تاماملاندى'},table:{toolbar:'جەدۋەل',title:'جەدۋەل خاسلىقى',menu:'جەدۋەل خاسلىقى',deleteTable:'جەدۋەل ئۆچۈر',rows:'قۇر سانى',columns:'ئىستون سانى',border:'گىرۋەك',widthPx:'پىكسېل',widthPc:'پىرسەنت',widthUnit:'كەڭلىك بىرلىكى',cellSpace:'ئارىلىق',cellPad:'يان ئارىلىق',caption:'ماۋزۇ',summary:'ئۈزۈندە',headers:'ماۋزۇ كاتەكچە',headersNone:'يوق',headersColumn:'بىرىنچى ئىستون',headersRow:'بىرىنچى قۇر',headersBoth:'بىرىنچى ئىستون ۋە بىرىنچى قۇر',invalidRows:'بەلگىلەنگەن ئىستون سانى چوقۇم نۆلدىن چوڭ بولىدۇ',invalidCols:'بەلگىلەنگەن قۇر سانى چوقۇم نۆلدىن چوڭ بولىدۇ',invalidBorder:'گىرۋەك توملۇقى چوقۇم سان بولىدۇ',invalidWidth:'جەدۋەل كەڭلىكى چوقۇم سان بولىدۇ',invalidHeight:'جەدۋەل ئېگىزلىكى چوقۇم سان بولىدۇ',invalidCellSpacing:'كاتەكچە ئارىلىقى چوقۇم سان بولىدۇ',invalidCellPadding:'كاتەكچىگە چوقۇم سان تولدۇرۇلىدۇ',cell:{menu:'كاتەكچە',insertBefore:'سولغا كاتەكچە قىستۇر',insertAfter:'ئوڭغا كاتەكچە قىستۇر',deleteCell:'كەتەكچە ئۆچۈر',merge:'كاتەكچە بىرلەشتۈر',mergeRight:'كاتەكچىنى ئوڭغا بىرلەشتۈر',mergeDown:'كاتەكچىنى ئاستىغا بىرلەشتۈر',splitHorizontal:'كاتەكچىنى توغرىسىغا بىرلەشتۈر',splitVertical:'كاتەكچىنى بويىغا بىرلەشتۈر',title:'كاتەكچە خاسلىقى',cellType:'كاتەكچە تىپى',rowSpan:'بويىغا چات ئارىسى قۇر سانى',colSpan:'توغرىسىغا چات ئارىسى ئىستون سانى',wordWrap:'ئۆزلۈكىدىن قۇر قاتلا',hAlign:'توغرىسىغا توغرىلا',vAlign:'بويىغا توغرىلا',alignBaseline:'ئاساسىي سىزىق',bgColor:'تەگلىك رەڭگى',borderColor:'گىرۋەك رەڭگى',data:'سانلىق مەلۇمات',header:'جەدۋەل باشى',yes:'ھەئە',no:'ياق',invalidWidth:'كاتەكچە كەڭلىكى چوقۇم سان بولىدۇ',invalidHeight:'كاتەكچە ئېگىزلىكى چوقۇم سان بولىدۇ',invalidRowSpan:'قۇر چات ئارىسى چوقۇم پۈتۈن سان بولىدۇ ',invalidColSpan:'ئىستون چات ئارىسى چوقۇم پۈتۈن سان بولىدۇ',chooseColor:'تاللاڭ'},row:{menu:'قۇر',insertBefore:'ئۈستىگە قۇر قىستۇر',insertAfter:'ئاستىغا قۇر قىستۇر',deleteRow:'قۇر ئۆچۈر'},column:{menu:'ئىستون',insertBefore:'سولغا ئىستون قىستۇر',insertAfter:'ئوڭغا ئىستون قىستۇر',deleteColumn:'ئىستون ئۆچۈر'}},button:{title:'توپچا خاسلىقى',text:'بەلگە (قىممەت)',type:'تىپى',typeBtn:'توپچا',typeSbm:'تاپشۇر',typeRst:'ئەسلىگە قايتۇر'},checkboxAndRadio:{checkboxTitle:'كۆپ تاللاش خاسلىقى',radioTitle:'تاق تاللاش توپچا خاسلىقى',value:'تاللىغان قىممەت',selected:'تاللانغان'},form:{title:'جەدۋەل خاسلىقى',menu:'جەدۋەل خاسلىقى',action:'مەشغۇلات',method:'ئۇسۇل',encoding:'جەدۋەل كودلىنىشى'},select:{title:'جەدۋەل/تىزىم خاسلىقى',selectInfo:'ئۇچۇر تاللاڭ',opAvail:'تاللاش تۈرلىرى',value:'قىممەت',size:'ئېگىزلىكى',lines:'قۇر',chkMulti:'كۆپ تاللاشچان',opText:'تاللانما تېكىستى',opValue:'تاللانما قىممىتى',btnAdd:'قوش',btnModify:'ئۆزگەرت',btnUp:'ئۈستىگە',btnDown:'ئاستىغا',btnSetValue:'دەسلەپكى تاللانما قىممىتىگە تەڭشە',btnDelete:'ئۆچۈر'},textarea:{title:' كۆپ قۇرلۇق تېكىست خاسلىقى',cols:'ھەرپ كەڭلىكى',rows:'قۇر سانى'},textfield:{title:'تاق قۇرلۇق تېكىست خاسلىقى',name:'ئات',value:'دەسلەپكى قىممىتى',charWidth:'ھەرپ كەڭلىكى',maxChars:'ئەڭ كۆپ ھەرپ سانى',type:'تىپى',typeText:'تېكىست',typePass:'ئىم'},hidden:{title:'يوشۇرۇن دائىرە خاسلىقى',name:'ئات',value:'دەسلەپكى قىممىتى'},image:{title:'سۈرەت خاسلىقى',titleButton:'سۈرەت دائىرە خاسلىقى',menu:'سۈرەت خاسلىقى',infoTab:'سۈرەت',btnUpload:'مۇلازىمېتىرغا يۈكلە',upload:'يۈكلە',alt:'تېكىست ئالماشتۇر',lockRatio:'نىسبەتنى قۇلۇپلا',resetSize:'ئەسلى چوڭلۇق',border:'گىرۋەك چوڭلۇقى',hSpace:'توغرىسىغا ئارىلىقى',vSpace:'بويىغا ئارىلىقى',alertUrl:'سۈرەت ئادرېسىنى كىرگۈزۈڭ',linkTab:'ئۇلانما',button2Img:'نۆۋەتتىكى توپچىنى سۈرەتكە ئۆزگەرتەمسىز؟',img2Button:'نۆۋەتتىكى سۈرەتنى توپچىغا ئۆزگەرتەمسىز؟',urlMissing:'سۈرەتنىڭ ئەسلى ھۆججەت ئادرېسى كەم',validateBorder:'گىرۋەك چوڭلۇقى چوقۇم سان بولىدۇ',validateHSpace:'توغرىسىغا ئارىلىق چوقۇم پۈتۈن سان بولىدۇ',validateVSpace:'بويىغا ئارىلىق چوقۇم پۈتۈن سان بولىدۇ'},flash:{properties:'Flash خاسلىق',propertiesTab:'خاسلىق',title:'ماۋزۇ',chkPlay:'ئۆزلۈكىدىن چال',chkLoop:'دەۋرىي',chkMenu:'Flash تىزىملىكنى قوزغات',chkFull:'پۈتۈن ئېكراننى قوزغات',scale:'نىسبىتى',scaleAll:'ھەممىنى كۆرسەت',scaleNoBorder:'گىرۋەك يوق',scaleFit:'قەتئىي ماسلىشىش',access:'قوليازما زىيارەتكە يول قوي',accessAlways:'ھەمىشە',accessSameDomain:'ئوخشاش دائىرىدە',accessNever:'ھەرگىز',alignAbsBottom:'مۇتلەق ئاستى',alignAbsMiddle:'مۇتلەق ئوتتۇرا',alignBaseline:'ئاساسىي سىزىق',alignTextTop:'تېكىست ئۈستىدە',quality:'سۈپەت',qualityBest:'ئەڭ ياخشى',qualityHigh:'يۇقىرى',qualityAutoHigh:'يۇقىرى (ئاپتوماتىك)',qualityMedium:'ئوتتۇرا (ئاپتوماتىك)',qualityAutoLow:'تۆۋەن (ئاپتوماتىك)',qualityLow:'تۆۋەن',windowModeWindow:'كۆزنەك گەۋدىسى',windowModeOpaque:'خىرە',windowModeTransparent:'سۈزۈك',windowMode:'كۆزنەك ھالىتى',flashvars:'Flash ئۆزگەرگۈچى',bgcolor:'تەگلىك رەڭگى',hSpace:'توغرىسىغا ئارىلىق',vSpace:'بويىغا ئارىلىق',validateSrc:'ئەسلى ھۆججەت ئادرېسىنى كىرگۈزۈڭ',validateHSpace:'توغرىسىغا ئارىلىق چوقۇم سان بولىدۇ',validateVSpace:'بويىغا ئارىلىق چوقۇم سان بولىدۇ'},spellCheck:{toolbar:'ئىملا تەكشۈر',title:'ئىملا تەكشۈر',notAvailable:'كەچۈرۈڭ، مۇلازىمېتىرنى ۋاقتىنچە ئىشلەتكىلى بولمايدۇ',errorLoading:'لازىملىق مۇلازىمېتىرنى يۈكلىگەندە خاتالىق كۆرۈلدى: %s.',notInDic:'لۇغەتتە يوق',changeTo:'ئۆزگەرت',btnIgnore:'پەرۋا قىلما',btnIgnoreAll:'ھەممىگە پەرۋا قىلما',btnReplace:'ئالماشتۇر',btnReplaceAll:'ھەممىنى ئالماشتۇر',btnUndo:'يېنىۋال',noSuggestions:'-تەكلىپ يوق-',progress:'ئىملا تەكشۈرۈۋاتىدۇ…',noMispell:'ئىملا تەكشۈرۈش تامام: ئىملا خاتالىقى بايقالمىدى',noChanges:'ئىملا تەكشۈرۈش تامام: ھېچقانداق سۆزنى ئۆزگەرتمىدى',oneChange:'ئىملا تەكشۈرۈش تامام: بىر سۆزنى ئۆزگەرتتى',manyChanges:'ئىملا تەكشۈرۈش تامام: %1 سۆزنى ئۆزگەرتتى',ieSpellDownload:'ئىملا تەكشۈرۈش قىستۇرمىسى تېخى ئورنىتىلمىغان، ھازىرلا چۈشۈرەمسىز؟'},smiley:{toolbar:'چىراي ئىپادە',title:'چىراي ئىپادە سىنبەلگە قىستۇر',options:'چىراي ئىپادە سىنبەلگە تاللانمىسى'},elementsPath:{eleLabel:'ئېلېمېنت يولى',eleTitle:'%1 ئېلېمېنت'},numberedlist:'تەرتىپ نومۇر تىزىمى',bulletedlist:'تۈر بەلگە تىزىمى',indent:'تارايت',outdent:'كەڭەيت',justify:{left:'سولغا توغرىلا',center:'ئوتتۇرىغا توغرىلا',right:'ئوڭغا توغرىلا',block:'ئىككى تەرەپتىن توغرىلا'},blockquote:'بۆلەك نەقىل',clipboard:{title:'چاپلا',cutError:'تور كۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى تەھرىرلىگۈچنىڭ كەس مەشغۇلاتىنى ئۆزلۈكىدىن ئىجرا قىلىشىغا يول قويمايدۇ، ھەرپتاختا تېز كۇنۇپكا (Ctrl/Cmd+X) ئارقىلىق تاماملاڭ',copyError:'تور كۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى تەھرىرلىگۈچنىڭ كۆچۈر مەشغۇلاتىنى ئۆزلۈكىدىن ئىجرا قىلىشىغا يول قويمايدۇ، ھەرپتاختا تېز كۇنۇپكا (Ctrl/Cmd+C) ئارقىلىق تاماملاڭ',pasteMsg:'ھەرپتاختا تېز كۇنۇپكا (<STRONG>Ctrl/Cmd+V</STRONG>) نى ئىشلىتىپ مەزمۇننى تۆۋەندىكى رامكىغا كۆچۈرۈڭ، ئاندىن <STRONG>جەزملە</STRONG>نى بېسىڭ',securityMsg:'توركۆرگۈڭىزنىڭ بىخەتەرلىك تەڭشىكى سەۋەبىدىن بۇ تەھرىرلىگۈچ چاپلاش تاختىسىدىكى مەزمۇننى بىۋاستە زىيارەت قىلالمايدۇ، بۇ كۆزنەكتە قايتا بىر قېتىم چاپلىشىڭىز كېرەك.',pasteArea:'چاپلاش دائىرىسى'},pastefromword:{confirmCleanup:'سىز چاپلىماقچى بولغان مەزمۇن MS Word تىن كەلگەندەك قىلىدۇ، MS Word پىچىمىنى تازىلىۋەتكەندىن كېيىن ئاندىن چاپلامدۇ؟',toolbar:'MS Word تىن چاپلا',title:'MS Word تىن چاپلا',error:'ئىچكى خاتالىق سەۋەبىدىن چاپلايدىغان سانلىق مەلۇماتنى تازىلىيالمايدۇ'},pasteText:{button:'پىچىمى يوق تېكىست سۈپىتىدە چاپلا',title:'پىچىمى يوق تېكىست سۈپىتىدە چاپلا'},templates:{button:'قېلىپ',title:'مەزمۇن قېلىپى',options:'قېلىپ تاللانمىسى',insertOption:'نۆۋەتتىكى مەزمۇننى ئالماشتۇر',selectPromptMsg:'تەھرىرلىگۈچنىڭ مەزمۇن قېلىپىنى تاللاڭ:',emptyListMsg:'(قېلىپ يوق)'},showBlocks:'بۆلەكنى كۆرسەت',stylesCombo:{label:'ئۇسلۇب',panelTitle:'ئۇسلۇب',panelTitle1:'بۆلەك دەرىجىسىدىكى ئېلېمېنت ئۇسلۇبى',panelTitle2:'ئىچكى باغلانما ئېلېمېنت ئۇسلۇبى',panelTitle3:'نەڭ (Object) ئېلېمېنت ئۇسلۇبى'},format:{label:'پىچىم',panelTitle:'پىچىم',tag_p:'ئادەتتىكى',tag_pre:'تىزىلغان پىچىم',tag_address:'ئادرېس',tag_h1:'ماۋزۇ 1',tag_h2:'ماۋزۇ 2',tag_h3:'ماۋزۇ 3',tag_h4:'ماۋزۇ 4',tag_h5:'ماۋزۇ 5',tag_h6:'ماۋزۇ 6',tag_div:'ئابزاس (DIV)'},div:{title:'DIV قاچا قۇر',toolbar:'DIV قاچا قۇر',cssClassInputLabel:'ئۇسلۇب تىپىنىڭ ئاتى',styleSelectLabel:'ئۇسلۇب',IdInputLabel:'ID',languageCodeInputLabel:'تىل كودى',inlineStyleInputLabel:'قۇر ئىچىدىكى ئۇسلۇبى',advisoryTitleInputLabel:'ماۋزۇ',langDirLabel:'تىل يۆنىلىشى',langDirLTRLabel:'سولدىن ئوڭغا (LTR)',langDirRTLLabel:'ئوڭدىن سولغا (RTL)',edit:'DIV تەھرىر',remove:'DIV چىقىرىۋەت'},iframe:{title:'IFrame خاسلىق',toolbar:'IFrame ',noUrl:'كاندۇكنىڭ ئادرېسى(Url)نى كىرگۈزۈڭ',scrolling:'دومىلىما سۈرگۈچكە يول قوي',border:'كاندۇك گىرۋەكلىرىنى كۆرسەت'},font:{label:'خەت نۇسخا',voiceLabel:'خەت نۇسخا',panelTitle:'خەت نۇسخا'},fontSize:{label:'چوڭلۇقى',voiceLabel:'خەت چوڭلۇقى',panelTitle:'چوڭلۇقى'},colorButton:{textColorTitle:'تېكىست رەڭگى',bgColorTitle:'تەگلىك رەڭگى',panelTitle:'رەڭ',auto:'ئۆزلۈكىدىن',more:'باشقا رەڭ'},colors:{'000':'قارا',800000:'قىزغۇچ سېرىق','8B4513':'توق قوڭۇر','2F4F4F':'قارامتۇل يېشىل','008080':'كۆكۈش يېشىل','000080':'قارامتۇل كۆك','4B0082':'كۆكۈش كۈلرەڭ',696969:'قارامتۇل كۈلرەڭ',B22222:'خىش قىزىل',A52A2A:'قوڭۇر',DAA520:'ئالتۇن سېرىق','006400':'توق يېشىل','40E0D0':'كۆكۈچ يېشىل','0000CD':'ئوتتۇراھال كۆك',800080:'بىنەپشە',808080:'كۈلرەڭ',F00:'قىزىل',FF8C00:'توق قىزغۇچ سېرىق',FFD700:'ئالتۇن','008000':'يېشىل','0FF':'يېشىل كۆك','00F':'كۆك',EE82EE:'قىزغۇچ بىنەپشە',A9A9A9:'توق كۈلرەڭ',FFA07A:'كاۋا چېچىكى سېرىق',FFA500:'قىزغۇچ سېرىق',FFFF00:'سېرىق','00FF00':'Lime',AFEEEE:'سۇس ھاۋا رەڭ',ADD8E6:'ئوچۇق كۆك',DDA0DD:'قىزغۇچ بىنەپشە',D3D3D3:'سۇس كۆكۈچ كۈلرەڭ',FFF0F5:'سۇس قىزغۇچ بىنەپشە',FAEBD7:'Antique White',FFFFE0:'سۇس سېرىق',F0FFF0:'Honeydew',F0FFFF:'ئاسمان كۆكى',F0F8FF:'سۇس كۆك',E6E6FA:'سۇس بىنەپشە',FFF:'ئاق'},scayt:{title:'شۇئان ئىملا تەكشۈر',opera_title:'Opera توركۆرگۈنى قوللىمايدۇ',enable:'شۇئان ئىملا تەكشۈرۈشنى قوزغات',disable:'شۇئان ئىملا تەكشۈرۈشنى چەكلە',about:'شۇئان ئىملا تەكشۈرۈش ھەققىدە',toggle:'شۇئان ئىملا تەكشۈرۈشنى ۋاقىتلىق توختات/قوزغات',options:'تاللانما',langs:'تىل',moreSuggestions:'تېخىمۇ كۆپ ئىملا تەۋسىيەسى',ignore:'پەرۋا قىلما',ignoreAll:'ھەممىسىگە پەرۋا قىلما',addWord:'سۆز قوش',emptyDic:'لۇغەت ئاتى بوش قالمايدۇ',optionsTab:'تاللانما',allCaps:'چوڭ ھەرپتە يېزىلغان ھەممە سۆزگە پەرۋا قىلما',ignoreDomainNames:'دائىرە ئاتىغا پەرۋا قىلما',mixedCase:'چوڭ كىچىك ھەرپ بىلەن ئارىلاش يېزىلغان سۆزگە پەرۋا قىلما',mixedWithDigits:'سان بار سۆزگە پەرۋا قىلما',languagesTab:'تىل',dictionariesTab:'لۇغەت',dic_field_name:'لۇغەت ئاتى',dic_create:'قۇر',dic_restore:'ئەسلىگە كەلتۈر',dic_delete:'ئۆچۈر',dic_rename:'ئات ئۆزگەرت',dic_info:'باشلىنىشتا ئىشلەتكۈچى لۇغىتى Cookie غا ساقلىنىدۇ ئەمما Cookie نىڭ سىغىمى چەكلىك بولغاچقا، ئىشلەتكۈچى لۇغىتى كۆپىيىپ Cookie چەكلىمىسىدىن ئېشىپ كەتكەندە ساقلىغىلى بولمايدۇ، بۇ چاغدا لۇغىتىڭىزنى مۇلازىمېتىرىمىزغا ساقلىسىڭىز بولىدۇ. شەخسىي لۇغىتىڭىزنى مۇلازىمېتىرىمىزغا ساقلىماقچى بولسىڭىز لۇغىتىڭىزگە ئاتتىن بىرنى قويۇڭ، ئەگەر مۇلازىمتېرىمىزدا سىزنىڭ لۇغىتىڭىزدىن بىرسى بولسا لۇغەت ئاتىنى كىرگۈزۈپ ئەسلىگە قايتۇر توپچىسىنى بېسىڭ.',aboutTab:'ھەققىدە'},about:{title:'CKEditor ھەققىدە',dlgTitle:'CKEditor ھەققىدە',help:'$1 نى زىيارەت قىلىپ ياردەمگە ئېرىشىڭ',userGuide:'CKEditor ئىشلەتكۈچى قوللانمىسى',moreInfo:'تور تۇرايىمىزنى زىيارەت قىلىپ كېلىشىمگە ئائىت تېخىمۇ كۆپ ئۇچۇرغا ئېرىشىڭ',copy:'Copyright © $1. نەشر ھوقۇقىغا ئىگە'},maximize:'چوڭايت',minimize:'كىچىكلەت',fakeobjects:{anchor:'لەڭگەرلىك نۇقتا',flash:'Flash جانلاندۇرۇم',iframe:'IFrame',hiddenfield:'يوشۇرۇن دائىرە',unknown:'يوچۇن نەڭ'},resize:'چوڭلۇقىنى ئۆزگەرت',colordialog:{title:'رەڭ تاللاڭ',options:'رەڭ تاللانمىسى',highlight:'يورۇت',selected:'رەڭ تاللاڭ',clear:'تازىلا'},toolbarCollapse:'قورال بالداقنى قاتلا',toolbarExpand:'قورال بالداقنى ياي',toolbarGroups:{document:'پۈتۈك',clipboard:'چاپلاش تاختىسى/يېنىۋال',editing:'تەھرىر',forms:'جەدۋەل',basicstyles:'ئاساسىي ئۇسلۇب',paragraph:'ئابزاس',links:'ئۇلانما',insert:'قىستۇر',styles:'ئۇسلۇب',colors:'رەڭ',tools:'قورال'},bidi:{ltr:'تېكىست يۆنىلىشى سولدىن ئوڭغا',rtl:'تېكىست يۆنىلىشى ئوڭدىن سولغا'},docprops:{label:'بەت خاسلىقى',title:'بەت خاسلىقى',design:'لايىھە',meta:'مېتا سانلىق مەلۇمات',chooseColor:'تاللاڭ',other:'باشقا',docTitle:'بەت ماۋزۇسى',charset:'ھەرپ كودلىنىشى',charsetOther:'باشقا ھەرپ كودلىنىشى',charsetASCII:'ASCII',charsetCE:'ئوتتۇرا ياۋرۇپا',charsetCT:'مۇرەككەپ خەنزۇچە (Big5)',charsetCR:'سىلاۋيانچە',charsetGR:'گىرېكچە',charsetJP:'ياپونچە',charsetKR:'كۆرىيەچە',charsetTR:'تۈركچە',charsetUN:'يۇنىكود (UTF-8)',charsetWE:'غەربىي ياۋرۇپا',docType:'پۈتۈك تىپى',docTypeOther:'باشقا پۈتۈك تىپى',xhtmlDec:'XHTML ئېنىقلىمىسىنى ئۆز ئىچىگە ئالىدۇ',bgColor:'تەگلىك رەڭگى',bgImage:'تەگلىك سۈرەت',bgFixed:'تەگلىك سۈرەتنى دومىلاتما',txtColor:'تېكىست رەڭگى',margin:'بەت گىرۋەك',marginTop:'ئۈستى',marginLeft:'سول',marginRight:'ئوڭ',marginBottom:'ئاستى',metaKeywords:'بەت يۈزى ئىندېكىس ھالقىلىق سۆزى (ئىنگلىزچە پەش [,] بىلەن ئايرىلىدۇ)',metaDescription:'بەت يۈزى چۈشەندۈرۈشى',metaAuthor:'يازغۇچى',metaCopyright:'نەشر ھوقۇقى',previewHtml:'<p>بۇ بىر قىسىم <strong>كۆرسەتمىگە ئىشلىتىدىغان تېكىست </strong>سىز نۆۋەتتە <a href=\\\\"javascript:void(0)\\\\">CKEditor</a>.نى ئىشلىتىۋاتىسىز.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/uk.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/uk.js
index 0541f85..4e00705 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/uk.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/uk.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.uk={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Панель інструментів редактора',editor:'Текстовий редактор',source:'Джерело',newPage:'Нова сторінка',save:'Зберегти',preview:'Попередній перегляд',cut:'Вирізати',copy:'Копіювати',paste:'Вставити',print:'Друк',underline:'Підкреслений',bold:'Жирний',italic:'Курсив',selectAll:'Виділити все',removeFormat:'Очистити форматування',strike:'Закреслений',subscript:'Нижній індекс',superscript:'Верхній індекс',horizontalrule:'Горизонтальна лінія',pagebreak:'Вставити розрив сторінки',pagebreakAlt:'Розрив Сторінки',unlink:'Видалити посилання',undo:'Повернути',redo:'Повторити',common:{browseServer:'Огляд',url:'URL',protocol:'Протокол',upload:'Надіслати',uploadSubmit:'Надіслати на сервер',image:'Зображення',flash:'Flash',form:'Форма',checkbox:'Галочка',radio:'Кнопка вибору',textField:'Текстове поле',textarea:'Текстова область',hiddenField:'Приховане поле',button:'Кнопка',select:'Список',imageButton:'Кнопка із зображенням',notSet:'<не визначено>',id:'Ідентифікатор',name:"Ім'я",langDir:'Напрямок мови',langDirLtr:'Зліва направо (LTR)',langDirRtl:'Справа наліво (RTL)',langCode:'Код мови',longDescr:'Довгий опис URL',cssClass:'Клас CSS',advisoryTitle:'Заголовок',cssStyle:'Стиль CSS',ok:'ОК',cancel:'Скасувати',close:'Закрити',preview:'Попередній перегляд',generalTab:'Основне',advancedTab:'Додаткове',validateNumberFailed:'Значення не є цілим числом.',confirmNewPage:'Всі незбережені зміни будуть втрачені. Ви впевнені, що хочете завантажити нову сторінку?',confirmCancel:'Деякі опції змінено. Закрити вікно без збереження змін?',options:'Опції',target:'Ціль',targetNew:'Нове вікно (_blank)',targetTop:'Поточне вікно (_top)',targetSelf:'Поточний фрейм/вікно (_self)',targetParent:'Батьківський фрейм/вікно (_parent)',langDirLTR:'Зліва направо (LTR)',langDirRTL:'Справа наліво (RTL)',styles:'Стиль CSS',cssClasses:'Клас CSS',width:'Ширина',height:'Висота',align:'Вирівнювання',alignLeft:'По лівому краю',alignRight:'По правому краю',alignCenter:'По центру',alignTop:'По верхньому краю',alignMiddle:'По середині',alignBottom:'По нижньому краю',invalidHeight:'Висота повинна бути цілим числом.',invalidWidth:'Ширина повинна бути цілим числом.',invalidCssLength:'Значення, вказане для "%1" в полі повинно бути позитивним числом або без дійсного виміру CSS блоку (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Значення, вказане для "%1" в полі повинно бути позитивним числом або без дійсного виміру HTML блоку (px or %).',invalidInlineStyle:'Значення, вказане для вбудованого стилю повинне складатися з одного чи кількох кортежів у форматі "ім\'я : значення", розділених крапкою з комою.',cssLengthTooltip:'Введіть номер значення в пікселях або число з дійсною одиниці CSS (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, не доступне</span>'},contextmenu:{options:'Опції контекстного меню'},specialChar:{toolbar:'Спеціальний символ',title:'Оберіть спеціальний символ',options:'Опції'},link:{toolbar:'Вставити/Редагувати посилання',other:'<інший>',menu:'Вставити посилання',title:'Посилання',info:'Інформація посилання',target:'Ціль',upload:'Надіслати',advanced:'Додаткове',type:'Тип посилання',toUrl:'URL',toAnchor:'Якір на цю сторінку',toEmail:'Ел. пошта',targetFrame:'<фрейм>',targetPopup:'<випливаюче вікно>',targetFrameName:"Ім'я цільового фрейму",targetPopupName:"Ім'я випливаючого вікна",popupFeatures:'Властивості випливаючого вікна',popupResizable:'Масштабоване',popupStatusBar:'Рядок статусу',popupLocationBar:'Панель локації',popupToolbar:'Панель інструментів',popupMenuBar:'Панель меню',popupFullScreen:'Повний екран (IE)',popupScrollBars:'Стрічки прокрутки',popupDependent:'Залежний (Netscape)',popupLeft:'Позиція зліва',popupTop:'Позиція зверху',id:'Ідентифікатор',langDir:'Напрямок мови',langDirLTR:'Зліва направо (LTR)',langDirRTL:'Справа наліво (RTL)',acccessKey:'Гаряча клавіша',name:"Ім'я",langCode:'Код мови',tabIndex:'Послідовність переходу',advisoryTitle:'Заголовок',advisoryContentType:'Тип вмісту',cssClasses:'Клас CSS',charset:'Кодування',styles:'Стиль CSS',rel:"Зв'язок",selectAnchor:'Оберіть якір',anchorName:"За ім'ям елементу",anchorId:'За ідентифікатором елементу',emailAddress:'Адреса ел. пошти',emailSubject:'Тема листа',emailBody:'Тіло повідомлення',noAnchors:'(В цьому документі немає якорів)',noUrl:'Будь ласка, вкажіть URL посилання',noEmail:'Будь ласка, вкажіть адрес ел. пошти'},anchor:{toolbar:'Вставити/Редагувати якір',menu:'Властивості якоря',title:'Властивості якоря',name:"Ім'я якоря",errorName:"Будь ласка, вкажіть ім'я якоря",remove:'Прибрати якір'},list:{numberedTitle:'Опції нумерованого списку',bulletedTitle:'Опції маркованого списку',type:'Тип',start:'Почати з...',validateStartNumber:'Початковий номер списку повинен бути цілим числом.',circle:'Кільце',disc:'Кружечок',square:'Квадратик',none:'Нема',notset:'<не вказано>',armenian:'Вірменська нумерація',georgian:'Грузинська нумерація (an, ban, gan і т.д.)',lowerRoman:'Малі римські (i, ii, iii, iv, v і т.д.)',upperRoman:'Великі римські (I, II, III, IV, V і т.д.)',lowerAlpha:'Малі лат. букви (a, b, c, d, e і т.д.)',upperAlpha:'Великі лат. букви (A, B, C, D, E і т.д.)',lowerGreek:'Малі гр. букви (альфа, бета, гамма і т.д.)',decimal:'Десяткові (1, 2, 3 і т.д.)',decimalLeadingZero:'Десяткові з нулем (01, 02, 03 і т.д.)'},findAndReplace:{title:'Знайти і замінити',find:'Пошук',replace:'Заміна',findWhat:'Шукати:',replaceWith:'Замінити на:',notFoundMsg:'Вказаний текст не знайдено.',findOptions:'Параметри Пошуку',matchCase:'Враховувати регістр',matchWord:'Збіг цілих слів',matchCyclic:'Циклічна заміна',replaceAll:'Замінити все',replaceSuccessMsg:'%1 співпадінь(ня) замінено.'},table:{toolbar:'Таблиця',title:'Властивості таблиці',menu:'Властивості таблиці',deleteTable:'Видалити таблицю',rows:'Рядки',columns:'Стовбці',border:'Розмір рамки',widthPx:'пікселів',widthPc:'відсотків',widthUnit:'Одиниці вимір.',cellSpace:'Проміжок',cellPad:'Внутр. відступ',caption:'Заголовок таблиці',summary:'Детальний опис заголовку таблиці',headers:'Заголовки стовбців/рядків',headersNone:'Без заголовків',headersColumn:'Стовбці',headersRow:'Рядки',headersBoth:'Стовбці і рядки',invalidRows:'Кількість рядків повинна бути більшою 0.',invalidCols:'Кількість стовбців повинна бути більшою 0.',invalidBorder:'Розмір рамки повинен бути цілим числом.',invalidWidth:'Ширина таблиці повинна бути цілим числом.',invalidHeight:'Висота таблиці повинна бути цілим числом.',invalidCellSpacing:'Проміжок між комірками повинен бути цілим числом.',invalidCellPadding:'Внутр. відступ комірки повинен бути цілим числом.',cell:{menu:'Комірки',insertBefore:'Вставити комірку перед',insertAfter:'Вставити комірку після',deleteCell:'Видалити комірки',merge:"Об'єднати комірки",mergeRight:"Об'єднати справа",mergeDown:"Об'єднати донизу",splitHorizontal:'Розділити комірку по горизонталі',splitVertical:'Розділити комірку по вертикалі',title:'Властивості комірки',cellType:'Тип комірки',rowSpan:"Об'єднання рядків",colSpan:"Об'єднання стовпців",wordWrap:'Автоперенесення тексту',hAlign:'Гориз. вирівнювання',vAlign:'Верт. вирівнювання',alignBaseline:'По базовій лінії',bgColor:'Колір фону',borderColor:'Колір рамки',data:'Дані',header:'Заголовок',yes:'Так',no:'Ні',invalidWidth:'Ширина комірки повинна бути цілим числом.',invalidHeight:'Висота комірки повинна бути цілим числом.',invalidRowSpan:"Кількість об'єднуваних рядків повинна бути цілим числом.",invalidColSpan:"Кількість об'єднуваних стовбців повинна бути цілим числом.",chooseColor:'Обрати'},row:{menu:'Рядки',insertBefore:'Вставити рядок перед',insertAfter:'Вставити рядок після',deleteRow:'Видалити рядки'},column:{menu:'Стовбці',insertBefore:'Вставити стовбець перед',insertAfter:'Вставити стовбець після',deleteColumn:'Видалити стовбці'}},button:{title:'Властивості кнопки',text:'Значення',type:'Тип',typeBtn:'Кнопка (button)',typeSbm:'Надіслати (submit)',typeRst:'Очистити (reset)'},checkboxAndRadio:{checkboxTitle:'Властивості галочки',radioTitle:'Властивості кнопки вибору',value:'Значення',selected:'Обрана'},form:{title:'Властивості форми',menu:'Властивості форми',action:'Дія',method:'Метод',encoding:'Кодування'},select:{title:'Властивості списку',selectInfo:'Інфо',opAvail:'Доступні варіанти',value:'Значення',size:'Кількість',lines:'видимих позицій у списку',chkMulti:'Список з мультивибором',opText:'Текст',opValue:'Значення',btnAdd:'Добавити',btnModify:'Змінити',btnUp:'Вгору',btnDown:'Вниз',btnSetValue:'Встановити як обране значення',btnDelete:'Видалити'},textarea:{title:'Властивості текстової області',cols:'Стовбці',rows:'Рядки'},textfield:{title:'Властивості текстового поля',name:"Ім'я",value:'Значення',charWidth:'Ширина',maxChars:'Макс. к-ть символів',type:'Тип',typeText:'Текст',typePass:'Пароль'},hidden:{title:'Властивості прихованого поля',name:"Ім'я",value:'Значення'},image:{title:'Властивості зображення',titleButton:'Властивості кнопки із зображенням',menu:'Властивості зображення',infoTab:'Інформація про зображення',btnUpload:'Надіслати на сервер',upload:'Надіслати',alt:'Альтернативний текст',lockRatio:'Зберегти пропорції',resetSize:'Очистити поля розмірів',border:'Рамка',hSpace:'Гориз. відступ',vSpace:'Верт. відступ',alertUrl:'Будь ласка, вкажіть URL зображення',linkTab:'Посилання',button2Img:'Бажаєте перетворити обрану кнопку-зображення на просте зображення?',img2Button:'Бажаєте перетворити обране зображення на кнопку-зображення?',urlMissing:'Вкажіть URL зображення.',validateBorder:'Ширина рамки повинна бути цілим числом.',validateHSpace:'Гориз. відступ повинен бути цілим числом.',validateVSpace:'Верт. відступ повинен бути цілим числом.'},flash:{properties:'Властивості Flash',propertiesTab:'Властивості',title:'Властивості Flash',chkPlay:'Автопрогравання',chkLoop:'Циклічно',chkMenu:'Дозволити меню Flash',chkFull:'Дозволити повноекранний перегляд',scale:'Масштаб',scaleAll:'Показати все',scaleNoBorder:'Без рамки',scaleFit:'Поч. розмір',access:'Доступ до скрипта',accessAlways:'Завжди',accessSameDomain:'З того ж домена',accessNever:'Ніколи',alignAbsBottom:'По нижньому краю (abs)',alignAbsMiddle:'По середині (abs)',alignBaseline:'По базовій лінії',alignTextTop:'Текст по верхньому краю',quality:'Якість',qualityBest:'Відмінна',qualityHigh:'Висока',qualityAutoHigh:'Автом. відмінна',qualityMedium:'Середня',qualityAutoLow:'Автом. низька',qualityLow:'Низька',windowModeWindow:'Вікно',windowModeOpaque:'Непрозорість',windowModeTransparent:'Прозорість',windowMode:'Віконний режим',flashvars:'Змінні Flash',bgcolor:'Колір фону',hSpace:'Гориз. відступ',vSpace:'Верт. відступ',validateSrc:'Будь ласка, вкажіть URL посилання',validateHSpace:'Гориз. відступ повинен бути цілим числом.',validateVSpace:'Верт. відступ повинен бути цілим числом.'},spellCheck:{toolbar:'Перевірити орфографію',title:'Перевірка орфографії',notAvailable:'Вибачте, але сервіс наразі недоступний.',errorLoading:'Помилка завантаження : %s.',notInDic:'Немає в словнику',changeTo:'Замінити на',btnIgnore:'Пропустити',btnIgnoreAll:'Пропустити все',btnReplace:'Замінити',btnReplaceAll:'Замінити все',btnUndo:'Назад',noSuggestions:'- немає варіантів -',progress:'Виконується перевірка орфографії...',noMispell:'Перевірку орфографії завершено: помилок не знайдено',noChanges:'Перевірку орфографії завершено: жодне слово не змінено',oneChange:'Перевірку орфографії завершено: змінено одне слово',manyChanges:'Перевірку орфографії завершено: 1% слів(ова) змінено',ieSpellDownload:'Модуль перевірки орфографії не встановлено. Бажаєте завантажити його зараз?'},smiley:{toolbar:'Смайлик',title:'Вставити смайлик',options:'Опції смайликів'},elementsPath:{eleLabel:'Шлях',eleTitle:'%1 елемент'},numberedlist:'Нумерований список',bulletedlist:'Маркірований список',indent:'Збільшити відступ',outdent:'Зменшити відступ',justify:{left:'По лівому краю',center:'По центру',right:'По правому краю',block:'По ширині'},blockquote:'Цитата',clipboard:{title:'Вставити',cutError:'Налаштування безпеки Вашого браузера не дозволяють редактору автоматично виконувати операції вирізування. Будь ласка, використовуйте клавіатуру для цього (Ctrl/Cmd+X)',copyError:'Налаштування безпеки Вашого браузера не дозволяють редактору автоматично виконувати операції копіювання. Будь ласка, використовуйте клавіатуру для цього (Ctrl/Cmd+C).',pasteMsg:'Будь ласка, вставте інформацію з буфера обміну в цю область, користуючись комбінацією клавіш (<STRONG>Ctrl/Cmd+V</STRONG>), та натисніть <STRONG>OK</STRONG>.',securityMsg:"Редактор не може отримати прямий доступ до буферу обміну у зв'язку з налаштуваннями Вашого браузера. Вам потрібно вставити інформацію в це вікно.",pasteArea:'Область вставки'},pastefromword:{confirmCleanup:'Текст, що Ви намагаєтесь вставити, схожий на скопійований з Word. Бажаєте очистити його форматування перед вставлянням?',toolbar:'Вставити з Word',title:'Вставити з Word',error:'Неможливо очистити форматування через внутрішню помилку.'},pasteText:{button:'Вставити тільки текст',title:'Вставити тільки текст'},templates:{button:'Шаблони',title:'Шаблони змісту',options:'Опції шаблону',insertOption:'Замінити поточний вміст',selectPromptMsg:'Оберіть, будь ласка, шаблон для відкриття в редакторі<br>(поточний зміст буде втрачено):',emptyListMsg:'(Не знайдено жодного шаблону)'},showBlocks:'Показувати блоки',stylesCombo:{label:'Стиль',panelTitle:'Стилі форматування',panelTitle1:'Блочні стилі',panelTitle2:'Рядкові стилі',panelTitle3:"Об'єктні стилі"},format:{label:'Форматування',panelTitle:'Форматування параграфа',tag_p:'Нормальний',tag_pre:'Форматований',tag_address:'Адреса',tag_h1:'Заголовок 1',tag_h2:'Заголовок 2',tag_h3:'Заголовок 3',tag_h4:'Заголовок 4',tag_h5:'Заголовок 5',tag_h6:'Заголовок 6',tag_div:'Нормальний (div)'},div:{title:'Створити блок-контейнер',toolbar:'Створити блок-контейнер',cssClassInputLabel:'Клас CSS',styleSelectLabel:'Стиль CSS',IdInputLabel:'Ідентифікатор',languageCodeInputLabel:'Код мови',inlineStyleInputLabel:'Вписаний стиль',advisoryTitleInputLabel:'Зміст випливаючої підказки',langDirLabel:'Напрямок мови',langDirLTRLabel:'Зліва направо (LTR)',langDirRTLLabel:'Справа наліво (RTL)',edit:'Редагувати блок',remove:'Видалити блок'},iframe:{title:'Налаштування для IFrame',toolbar:'IFrame',noUrl:'Будь ласка введіть посилання для IFrame',scrolling:'Увімкнути прокрутку',border:'Показати рамки фрейму'},font:{label:'Шрифт',voiceLabel:'Шрифт',panelTitle:'Шрифт'},fontSize:{label:'Розмір',voiceLabel:'Розмір шрифту',panelTitle:'Розмір'},colorButton:{textColorTitle:'Колір тексту',bgColorTitle:'Колір фону',panelTitle:'Кольори',auto:'Авто',more:'Кольори...'},colors:{'000':'Чорний',800000:'Бордовий','8B4513':'Коричневий','2F4F4F':'Темний сіро-зелений','008080':'Морської хвилі','000080':'Сливовий','4B0082':'Індиго',696969:'Темносірий',B22222:'Темночервоний',A52A2A:'Каштановий',DAA520:'Бежевий','006400':'Темнозелений','40E0D0':'Бірюзовий','0000CD':'Темносиній',800080:'Пурпурний',808080:'Сірий',F00:'Червоний',FF8C00:'Темнооранжевий',FFD700:'Жовтий','008000':'Зелений','0FF':'Синьо-зелений','00F':'Синій',EE82EE:'Фіолетовий',A9A9A9:'Світлосірий',FFA07A:'Рожевий',FFA500:'Оранжевий',FFFF00:'Яскравожовтий','00FF00':'Салатовий',AFEEEE:'Світлобірюзовий',ADD8E6:'Блакитний',DDA0DD:'Світлофіолетовий',D3D3D3:'Сріблястий',FFF0F5:'Світлорожевий',FAEBD7:'Світлооранжевий',FFFFE0:'Світложовтий',F0FFF0:'Світлозелений',F0FFFF:'Світлий синьо-зелений',F0F8FF:'Світлоблакитний',E6E6FA:'Лавандовий',FFF:'Білий'},scayt:{title:'Перефірка орфографії по мірі набору',opera_title:'Не підтримується в Opera',enable:'Ввімкнути SCAYT',disable:'Вимкнути SCAYT',about:'Про SCAYT',toggle:'Перемкнути SCAYT',options:'Опції',langs:'Мови',moreSuggestions:'Більше варіантів',ignore:'Пропустити',ignoreAll:'Пропустити всі',addWord:'Додати слово',emptyDic:'Назва словника повинна бути вказана.',optionsTab:'Опції',allCaps:'Пропустити прописні слова',ignoreDomainNames:'Пропустити доменні назви',mixedCase:'Пропустити слова зі змішаним регістром',mixedWithDigits:'Пропустити слова, що містять цифри',languagesTab:'Мови',dictionariesTab:'Словники',dic_field_name:'Назва словника',dic_create:'Створити',dic_restore:'Відновити',dic_delete:'Видалити',dic_rename:'Перейменувати',dic_info:'Як правило, користувацькі словники зберігаються у cookie-файлах. Однак, cookie-файли мають обмеження на розмір. Якщо користувацький словник зростає в обсязі настільки, що вже не може бути збережений у cookie-файлі, тоді його можна зберегти на нашому сервері. Щоб зберегти Ваш персональний словник на нашому сервері необхідно вказати назву словника. Якщо Ви вже зберігали словник на сервері, будь ласка, вкажіть назву збереженого словника і натисніть кнопку Відновити.',aboutTab:'Про SCAYT'},about:{title:'Про CKEditor',dlgTitle:'Про CKEditor',help:'Перевірте $1 для допомоги.',userGuide:'Інструкція Користувача для CKEditor',moreInfo:'Щодо інформації з ліцензування завітайте на наш сайт:',copy:'Copyright © $1. Всі права застережено.'},maximize:'Максимізувати',minimize:'Мінімізувати',fakeobjects:{anchor:'Якір',flash:'Flash-анімація',iframe:'IFrame',hiddenfield:'Приховані Поля',unknown:"Невідомий об'єкт"},resize:'Потягніть для зміни розмірів',colordialog:{title:'Обрати колір',options:'Опції кольорів',highlight:'Колір, на який вказує курсор',selected:'Обраний колір',clear:'Очистити'},toolbarCollapse:'Згорнути панель інструментів',toolbarExpand:'Розгорнути панель інструментів',toolbarGroups:{document:'Документ',clipboard:'Буфер обміну / Скасувати',editing:'Редагування',forms:'Форми',basicstyles:'Основний Стиль',paragraph:'Параграф',links:'Посилання',insert:'Вставити',styles:'Стилі',colors:'Кольори',tools:'Інструменти'},bidi:{ltr:'Напрямок тексту зліва направо',rtl:'Напрямок тексту справа наліво'},docprops:{label:'Властивості документа',title:'Властивості документа',design:'Дизайн',meta:'Мета дані',chooseColor:'Обрати',other:'<інший>',docTitle:'Заголовок сторінки',charset:'Кодування набору символів',charsetOther:'Інше кодування набору символів',charsetASCII:'ASCII',charsetCE:'Центрально-європейська',charsetCT:'Китайська традиційна (Big5)',charsetCR:'Кирилиця',charsetGR:'Грецька',charsetJP:'Японська',charsetKR:'Корейська',charsetTR:'Турецька',charsetUN:'Юнікод (UTF-8)',charsetWE:'Західно-европейская',docType:'Заголовок типу документу',docTypeOther:'Інший заголовок типу документу',xhtmlDec:'Ввімкнути XHTML оголошення',bgColor:'Колір тла',bgImage:'URL зображення тла',bgFixed:'Тло без прокрутки',txtColor:'Колір тексту',margin:'Відступи сторінки',marginTop:'Верхній',marginLeft:'Лівий',marginRight:'Правий',marginBottom:'Нижній',metaKeywords:'Ключові слова документа (розділені комами)',metaDescription:'Опис документа',metaAuthor:'Автор',metaCopyright:'Авторські права',previewHtml:'<p>Це приклад<strong>тексту</strong>. Ви використовуєте<a href="javascript:void(0)"> CKEditor </a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.uk={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'Панель інструментів редактора',editor:'Текстовий редактор',source:'Джерело',newPage:'Нова сторінка',save:'Зберегти',preview:'Попередній перегляд',cut:'Вирізати',copy:'Копіювати',paste:'Вставити',print:'Друк',underline:'Підкреслений',bold:'Жирний',italic:'Курсив',selectAll:'Виділити все',removeFormat:'Очистити форматування',strike:'Закреслений',subscript:'Нижній індекс',superscript:'Верхній індекс',horizontalrule:'Горизонтальна лінія',pagebreak:'Вставити розрив сторінки',pagebreakAlt:'Розрив Сторінки',unlink:'Видалити посилання',undo:'Повернути',redo:'Повторити',common:{browseServer:'Огляд',url:'URL',protocol:'Протокол',upload:'Надіслати',uploadSubmit:'Надіслати на сервер',image:'Зображення',flash:'Flash',form:'Форма',checkbox:'Галочка',radio:'Кнопка вибору',textField:'Текстове поле',textarea:'Текстова область',hiddenField:'Приховане поле',button:'Кнопка',select:'Список',imageButton:'Кнопка із зображенням',notSet:'<не визначено>',id:'Ідентифікатор',name:"Ім'я",langDir:'Напрямок мови',langDirLtr:'Зліва направо (LTR)',langDirRtl:'Справа наліво (RTL)',langCode:'Код мови',longDescr:'Довгий опис URL',cssClass:'Клас CSS',advisoryTitle:'Заголовок',cssStyle:'Стиль CSS',ok:'ОК',cancel:'Скасувати',close:'Закрити',preview:'Попередній перегляд',generalTab:'Основне',advancedTab:'Додаткове',validateNumberFailed:'Значення не є цілим числом.',confirmNewPage:'Всі незбережені зміни будуть втрачені. Ви впевнені, що хочете завантажити нову сторінку?',confirmCancel:'Деякі опції змінено. Закрити вікно без збереження змін?',options:'Опції',target:'Ціль',targetNew:'Нове вікно (_blank)',targetTop:'Поточне вікно (_top)',targetSelf:'Поточний фрейм/вікно (_self)',targetParent:'Батьківський фрейм/вікно (_parent)',langDirLTR:'Зліва направо (LTR)',langDirRTL:'Справа наліво (RTL)',styles:'Стиль CSS',cssClasses:'Клас CSS',width:'Ширина',height:'Висота',align:'Вирівнювання',alignLeft:'По лівому краю',alignRight:'По правому краю',alignCenter:'По центру',alignTop:'По верхньому краю',alignMiddle:'По середині',alignBottom:'По нижньому краю',invalidHeight:'Висота повинна бути цілим числом.',invalidWidth:'Ширина повинна бути цілим числом.',invalidCssLength:'Значення, вказане для "%1" в полі повинно бути позитивним числом або без дійсного виміру CSS блоку (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Значення, вказане для "%1" в полі повинно бути позитивним числом або без дійсного виміру HTML блоку (px or %).',invalidInlineStyle:'Значення, вказане для вбудованого стилю повинне складатися з одного чи кількох кортежів у форматі "ім\'я : значення", розділених крапкою з комою.',cssLengthTooltip:'Введіть номер значення в пікселях або число з дійсною одиниці CSS (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, не доступне</span>'},contextmenu:{options:'Опції контекстного меню'},specialChar:{toolbar:'Спеціальний символ',title:'Оберіть спеціальний символ',options:'Опції'},link:{toolbar:'Вставити/Редагувати посилання',other:'<інший>',menu:'Вставити посилання',title:'Посилання',info:'Інформація посилання',target:'Ціль',upload:'Надіслати',advanced:'Додаткове',type:'Тип посилання',toUrl:'URL',toAnchor:'Якір на цю сторінку',toEmail:'Ел. пошта',targetFrame:'<фрейм>',targetPopup:'<випливаюче вікно>',targetFrameName:"Ім'я цільового фрейму",targetPopupName:"Ім'я випливаючого вікна",popupFeatures:'Властивості випливаючого вікна',popupResizable:'Масштабоване',popupStatusBar:'Рядок статусу',popupLocationBar:'Панель локації',popupToolbar:'Панель інструментів',popupMenuBar:'Панель меню',popupFullScreen:'Повний екран (IE)',popupScrollBars:'Стрічки прокрутки',popupDependent:'Залежний (Netscape)',popupLeft:'Позиція зліва',popupTop:'Позиція зверху',id:'Ідентифікатор',langDir:'Напрямок мови',langDirLTR:'Зліва направо (LTR)',langDirRTL:'Справа наліво (RTL)',acccessKey:'Гаряча клавіша',name:"Ім'я",langCode:'Код мови',tabIndex:'Послідовність переходу',advisoryTitle:'Заголовок',advisoryContentType:'Тип вмісту',cssClasses:'Клас CSS',charset:'Кодування',styles:'Стиль CSS',rel:"Зв'язок",selectAnchor:'Оберіть якір',anchorName:"За ім'ям елементу",anchorId:'За ідентифікатором елементу',emailAddress:'Адреса ел. пошти',emailSubject:'Тема листа',emailBody:'Тіло повідомлення',noAnchors:'(В цьому документі немає якорів)',noUrl:'Будь ласка, вкажіть URL посилання',noEmail:'Будь ласка, вкажіть адрес ел. пошти'},anchor:{toolbar:'Вставити/Редагувати якір',menu:'Властивості якоря',title:'Властивості якоря',name:"Ім'я якоря",errorName:"Будь ласка, вкажіть ім'я якоря",remove:'Прибрати якір'},list:{numberedTitle:'Опції нумерованого списку',bulletedTitle:'Опції маркованого списку',type:'Тип',start:'Почати з...',validateStartNumber:'Початковий номер списку повинен бути цілим числом.',circle:'Кільце',disc:'Кружечок',square:'Квадратик',none:'Нема',notset:'<не вказано>',armenian:'Вірменська нумерація',georgian:'Грузинська нумерація (an, ban, gan і т.д.)',lowerRoman:'Малі римські (i, ii, iii, iv, v і т.д.)',upperRoman:'Великі римські (I, II, III, IV, V і т.д.)',lowerAlpha:'Малі лат. букви (a, b, c, d, e і т.д.)',upperAlpha:'Великі лат. букви (A, B, C, D, E і т.д.)',lowerGreek:'Малі гр. букви (альфа, бета, гамма і т.д.)',decimal:'Десяткові (1, 2, 3 і т.д.)',decimalLeadingZero:'Десяткові з нулем (01, 02, 03 і т.д.)'},findAndReplace:{title:'Знайти і замінити',find:'Пошук',replace:'Заміна',findWhat:'Шукати:',replaceWith:'Замінити на:',notFoundMsg:'Вказаний текст не знайдено.',findOptions:'Параметри Пошуку',matchCase:'Враховувати регістр',matchWord:'Збіг цілих слів',matchCyclic:'Циклічна заміна',replaceAll:'Замінити все',replaceSuccessMsg:'%1 співпадінь(ня) замінено.'},table:{toolbar:'Таблиця',title:'Властивості таблиці',menu:'Властивості таблиці',deleteTable:'Видалити таблицю',rows:'Рядки',columns:'Стовбці',border:'Розмір рамки',widthPx:'пікселів',widthPc:'відсотків',widthUnit:'Одиниці вимір.',cellSpace:'Проміжок',cellPad:'Внутр. відступ',caption:'Заголовок таблиці',summary:'Детальний опис заголовку таблиці',headers:'Заголовки стовбців/рядків',headersNone:'Без заголовків',headersColumn:'Стовбці',headersRow:'Рядки',headersBoth:'Стовбці і рядки',invalidRows:'Кількість рядків повинна бути більшою 0.',invalidCols:'Кількість стовбців повинна бути більшою 0.',invalidBorder:'Розмір рамки повинен бути цілим числом.',invalidWidth:'Ширина таблиці повинна бути цілим числом.',invalidHeight:'Висота таблиці повинна бути цілим числом.',invalidCellSpacing:'Проміжок між комірками повинен бути цілим числом.',invalidCellPadding:'Внутр. відступ комірки повинен бути цілим числом.',cell:{menu:'Комірки',insertBefore:'Вставити комірку перед',insertAfter:'Вставити комірку після',deleteCell:'Видалити комірки',merge:"Об'єднати комірки",mergeRight:"Об'єднати справа",mergeDown:"Об'єднати донизу",splitHorizontal:'Розділити комірку по горизонталі',splitVertical:'Розділити комірку по вертикалі',title:'Властивості комірки',cellType:'Тип комірки',rowSpan:"Об'єднання рядків",colSpan:"Об'єднання стовпців",wordWrap:'Автоперенесення тексту',hAlign:'Гориз. вирівнювання',vAlign:'Верт. вирівнювання',alignBaseline:'По базовій лінії',bgColor:'Колір фону',borderColor:'Колір рамки',data:'Дані',header:'Заголовок',yes:'Так',no:'Ні',invalidWidth:'Ширина комірки повинна бути цілим числом.',invalidHeight:'Висота комірки повинна бути цілим числом.',invalidRowSpan:"Кількість об'єднуваних рядків повинна бути цілим числом.",invalidColSpan:"Кількість об'єднуваних стовбців повинна бути цілим числом.",chooseColor:'Обрати'},row:{menu:'Рядки',insertBefore:'Вставити рядок перед',insertAfter:'Вставити рядок після',deleteRow:'Видалити рядки'},column:{menu:'Стовбці',insertBefore:'Вставити стовбець перед',insertAfter:'Вставити стовбець після',deleteColumn:'Видалити стовбці'}},button:{title:'Властивості кнопки',text:'Значення',type:'Тип',typeBtn:'Кнопка (button)',typeSbm:'Надіслати (submit)',typeRst:'Очистити (reset)'},checkboxAndRadio:{checkboxTitle:'Властивості галочки',radioTitle:'Властивості кнопки вибору',value:'Значення',selected:'Обрана'},form:{title:'Властивості форми',menu:'Властивості форми',action:'Дія',method:'Метод',encoding:'Кодування'},select:{title:'Властивості списку',selectInfo:'Інфо',opAvail:'Доступні варіанти',value:'Значення',size:'Кількість',lines:'видимих позицій у списку',chkMulti:'Список з мультивибором',opText:'Текст',opValue:'Значення',btnAdd:'Добавити',btnModify:'Змінити',btnUp:'Вгору',btnDown:'Вниз',btnSetValue:'Встановити як обране значення',btnDelete:'Видалити'},textarea:{title:'Властивості текстової області',cols:'Стовбці',rows:'Рядки'},textfield:{title:'Властивості текстового поля',name:"Ім'я",value:'Значення',charWidth:'Ширина',maxChars:'Макс. к-ть символів',type:'Тип',typeText:'Текст',typePass:'Пароль'},hidden:{title:'Властивості прихованого поля',name:"Ім'я",value:'Значення'},image:{title:'Властивості зображення',titleButton:'Властивості кнопки із зображенням',menu:'Властивості зображення',infoTab:'Інформація про зображення',btnUpload:'Надіслати на сервер',upload:'Надіслати',alt:'Альтернативний текст',lockRatio:'Зберегти пропорції',resetSize:'Очистити поля розмірів',border:'Рамка',hSpace:'Гориз. відступ',vSpace:'Верт. відступ',alertUrl:'Будь ласка, вкажіть URL зображення',linkTab:'Посилання',button2Img:'Бажаєте перетворити обрану кнопку-зображення на просте зображення?',img2Button:'Бажаєте перетворити обране зображення на кнопку-зображення?',urlMissing:'Вкажіть URL зображення.',validateBorder:'Ширина рамки повинна бути цілим числом.',validateHSpace:'Гориз. відступ повинен бути цілим числом.',validateVSpace:'Верт. відступ повинен бути цілим числом.'},flash:{properties:'Властивості Flash',propertiesTab:'Властивості',title:'Властивості Flash',chkPlay:'Автопрогравання',chkLoop:'Циклічно',chkMenu:'Дозволити меню Flash',chkFull:'Дозволити повноекранний перегляд',scale:'Масштаб',scaleAll:'Показати все',scaleNoBorder:'Без рамки',scaleFit:'Поч. розмір',access:'Доступ до скрипта',accessAlways:'Завжди',accessSameDomain:'З того ж домена',accessNever:'Ніколи',alignAbsBottom:'По нижньому краю (abs)',alignAbsMiddle:'По середині (abs)',alignBaseline:'По базовій лінії',alignTextTop:'Текст по верхньому краю',quality:'Якість',qualityBest:'Відмінна',qualityHigh:'Висока',qualityAutoHigh:'Автом. відмінна',qualityMedium:'Середня',qualityAutoLow:'Автом. низька',qualityLow:'Низька',windowModeWindow:'Вікно',windowModeOpaque:'Непрозорість',windowModeTransparent:'Прозорість',windowMode:'Віконний режим',flashvars:'Змінні Flash',bgcolor:'Колір фону',hSpace:'Гориз. відступ',vSpace:'Верт. відступ',validateSrc:'Будь ласка, вкажіть URL посилання',validateHSpace:'Гориз. відступ повинен бути цілим числом.',validateVSpace:'Верт. відступ повинен бути цілим числом.'},spellCheck:{toolbar:'Перевірити орфографію',title:'Перевірка орфографії',notAvailable:'Вибачте, але сервіс наразі недоступний.',errorLoading:'Помилка завантаження : %s.',notInDic:'Немає в словнику',changeTo:'Замінити на',btnIgnore:'Пропустити',btnIgnoreAll:'Пропустити все',btnReplace:'Замінити',btnReplaceAll:'Замінити все',btnUndo:'Назад',noSuggestions:'- немає варіантів -',progress:'Виконується перевірка орфографії...',noMispell:'Перевірку орфографії завершено: помилок не знайдено',noChanges:'Перевірку орфографії завершено: жодне слово не змінено',oneChange:'Перевірку орфографії завершено: змінено одне слово',manyChanges:'Перевірку орфографії завершено: 1% слів(ова) змінено',ieSpellDownload:'Модуль перевірки орфографії не встановлено. Бажаєте завантажити його зараз?'},smiley:{toolbar:'Смайлик',title:'Вставити смайлик',options:'Опції смайликів'},elementsPath:{eleLabel:'Шлях',eleTitle:'%1 елемент'},numberedlist:'Нумерований список',bulletedlist:'Маркірований список',indent:'Збільшити відступ',outdent:'Зменшити відступ',justify:{left:'По лівому краю',center:'По центру',right:'По правому краю',block:'По ширині'},blockquote:'Цитата',clipboard:{title:'Вставити',cutError:'Налаштування безпеки Вашого браузера не дозволяють редактору автоматично виконувати операції вирізування. Будь ласка, використовуйте клавіатуру для цього (Ctrl/Cmd+X)',copyError:'Налаштування безпеки Вашого браузера не дозволяють редактору автоматично виконувати операції копіювання. Будь ласка, використовуйте клавіатуру для цього (Ctrl/Cmd+C).',pasteMsg:'Будь ласка, вставте інформацію з буфера обміну в цю область, користуючись комбінацією клавіш (<STRONG>Ctrl/Cmd+V</STRONG>), та натисніть <STRONG>OK</STRONG>.',securityMsg:"Редактор не може отримати прямий доступ до буферу обміну у зв'язку з налаштуваннями Вашого браузера. Вам потрібно вставити інформацію в це вікно.",pasteArea:'Область вставки'},pastefromword:{confirmCleanup:'Текст, що Ви намагаєтесь вставити, схожий на скопійований з Word. Бажаєте очистити його форматування перед вставлянням?',toolbar:'Вставити з Word',title:'Вставити з Word',error:'Неможливо очистити форматування через внутрішню помилку.'},pasteText:{button:'Вставити тільки текст',title:'Вставити тільки текст'},templates:{button:'Шаблони',title:'Шаблони змісту',options:'Опції шаблону',insertOption:'Замінити поточний вміст',selectPromptMsg:'Оберіть, будь ласка, шаблон для відкриття в редакторі<br>(поточний зміст буде втрачено):',emptyListMsg:'(Не знайдено жодного шаблону)'},showBlocks:'Показувати блоки',stylesCombo:{label:'Стиль',panelTitle:'Стилі форматування',panelTitle1:'Блочні стилі',panelTitle2:'Рядкові стилі',panelTitle3:"Об'єктні стилі"},format:{label:'Форматування',panelTitle:'Форматування параграфа',tag_p:'Нормальний',tag_pre:'Форматований',tag_address:'Адреса',tag_h1:'Заголовок 1',tag_h2:'Заголовок 2',tag_h3:'Заголовок 3',tag_h4:'Заголовок 4',tag_h5:'Заголовок 5',tag_h6:'Заголовок 6',tag_div:'Нормальний (div)'},div:{title:'Створити блок-контейнер',toolbar:'Створити блок-контейнер',cssClassInputLabel:'Клас CSS',styleSelectLabel:'Стиль CSS',IdInputLabel:'Ідентифікатор',languageCodeInputLabel:'Код мови',inlineStyleInputLabel:'Вписаний стиль',advisoryTitleInputLabel:'Зміст випливаючої підказки',langDirLabel:'Напрямок мови',langDirLTRLabel:'Зліва направо (LTR)',langDirRTLLabel:'Справа наліво (RTL)',edit:'Редагувати блок',remove:'Видалити блок'},iframe:{title:'Налаштування для IFrame',toolbar:'IFrame',noUrl:'Будь ласка введіть посилання для IFrame',scrolling:'Увімкнути прокрутку',border:'Показати рамки фрейму'},font:{label:'Шрифт',voiceLabel:'Шрифт',panelTitle:'Шрифт'},fontSize:{label:'Розмір',voiceLabel:'Розмір шрифту',panelTitle:'Розмір'},colorButton:{textColorTitle:'Колір тексту',bgColorTitle:'Колір фону',panelTitle:'Кольори',auto:'Авто',more:'Кольори...'},colors:{'000':'Чорний',800000:'Бордовий','8B4513':'Коричневий','2F4F4F':'Темний сіро-зелений','008080':'Морської хвилі','000080':'Сливовий','4B0082':'Індиго',696969:'Темносірий',B22222:'Темночервоний',A52A2A:'Каштановий',DAA520:'Бежевий','006400':'Темнозелений','40E0D0':'Бірюзовий','0000CD':'Темносиній',800080:'Пурпурний',808080:'Сірий',F00:'Червоний',FF8C00:'Темнооранжевий',FFD700:'Жовтий','008000':'Зелений','0FF':'Синьо-зелений','00F':'Синій',EE82EE:'Фіолетовий',A9A9A9:'Світлосірий',FFA07A:'Рожевий',FFA500:'Оранжевий',FFFF00:'Яскравожовтий','00FF00':'Салатовий',AFEEEE:'Світлобірюзовий',ADD8E6:'Блакитний',DDA0DD:'Світлофіолетовий',D3D3D3:'Сріблястий',FFF0F5:'Світлорожевий',FAEBD7:'Світлооранжевий',FFFFE0:'Світложовтий',F0FFF0:'Світлозелений',F0FFFF:'Світлий синьо-зелений',F0F8FF:'Світлоблакитний',E6E6FA:'Лавандовий',FFF:'Білий'},scayt:{title:'Перефірка орфографії по мірі набору',opera_title:'Не підтримується в Opera',enable:'Ввімкнути SCAYT',disable:'Вимкнути SCAYT',about:'Про SCAYT',toggle:'Перемкнути SCAYT',options:'Опції',langs:'Мови',moreSuggestions:'Більше варіантів',ignore:'Пропустити',ignoreAll:'Пропустити всі',addWord:'Додати слово',emptyDic:'Назва словника повинна бути вказана.',optionsTab:'Опції',allCaps:'Пропустити прописні слова',ignoreDomainNames:'Пропустити доменні назви',mixedCase:'Пропустити слова зі змішаним регістром',mixedWithDigits:'Пропустити слова, що містять цифри',languagesTab:'Мови',dictionariesTab:'Словники',dic_field_name:'Назва словника',dic_create:'Створити',dic_restore:'Відновити',dic_delete:'Видалити',dic_rename:'Перейменувати',dic_info:'Як правило, користувацькі словники зберігаються у cookie-файлах. Однак, cookie-файли мають обмеження на розмір. Якщо користувацький словник зростає в обсязі настільки, що вже не може бути збережений у cookie-файлі, тоді його можна зберегти на нашому сервері. Щоб зберегти Ваш персональний словник на нашому сервері необхідно вказати назву словника. Якщо Ви вже зберігали словник на сервері, будь ласка, вкажіть назву збереженого словника і натисніть кнопку Відновити.',aboutTab:'Про SCAYT'},about:{title:'Про CKEditor',dlgTitle:'Про CKEditor',help:'Перевірте $1 для допомоги.',userGuide:'Інструкція Користувача для CKEditor',moreInfo:'Щодо інформації з ліцензування завітайте на наш сайт:',copy:'Copyright © $1. Всі права застережено.'},maximize:'Максимізувати',minimize:'Мінімізувати',fakeobjects:{anchor:'Якір',flash:'Flash-анімація',iframe:'IFrame',hiddenfield:'Приховані Поля',unknown:"Невідомий об'єкт"},resize:'Потягніть для зміни розмірів',colordialog:{title:'Обрати колір',options:'Опції кольорів',highlight:'Колір, на який вказує курсор',selected:'Обраний колір',clear:'Очистити'},toolbarCollapse:'Згорнути панель інструментів',toolbarExpand:'Розгорнути панель інструментів',toolbarGroups:{document:'Документ',clipboard:'Буфер обміну / Скасувати',editing:'Редагування',forms:'Форми',basicstyles:'Основний Стиль',paragraph:'Параграф',links:'Посилання',insert:'Вставити',styles:'Стилі',colors:'Кольори',tools:'Інструменти'},bidi:{ltr:'Напрямок тексту зліва направо',rtl:'Напрямок тексту справа наліво'},docprops:{label:'Властивості документа',title:'Властивості документа',design:'Дизайн',meta:'Мета дані',chooseColor:'Обрати',other:'<інший>',docTitle:'Заголовок сторінки',charset:'Кодування набору символів',charsetOther:'Інше кодування набору символів',charsetASCII:'ASCII',charsetCE:'Центрально-європейська',charsetCT:'Китайська традиційна (Big5)',charsetCR:'Кирилиця',charsetGR:'Грецька',charsetJP:'Японська',charsetKR:'Корейська',charsetTR:'Турецька',charsetUN:'Юнікод (UTF-8)',charsetWE:'Західно-европейская',docType:'Заголовок типу документу',docTypeOther:'Інший заголовок типу документу',xhtmlDec:'Ввімкнути XHTML оголошення',bgColor:'Колір тла',bgImage:'URL зображення тла',bgFixed:'Тло без прокрутки',txtColor:'Колір тексту',margin:'Відступи сторінки',marginTop:'Верхній',marginLeft:'Лівий',marginRight:'Правий',marginBottom:'Нижній',metaKeywords:'Ключові слова документа (розділені комами)',metaDescription:'Опис документа',metaAuthor:'Автор',metaCopyright:'Авторські права',previewHtml:'<p>Це приклад<strong>тексту</strong>. Ви використовуєте<a href="javascript:void(0)"> CKEditor </a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/vi.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/vi.js
index 6c597af..ab89c9c 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/vi.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/vi.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.vi={dir:'trái-qua-phải',editorTitle:'Trình soạn thảo phong phú, %1',editorHelp:'Nhấn ALT + 0 để được giúp đỡ',toolbars:'Thanh công cụ',editor:'Bộ soạn thảo',source:'Mã HTML',newPage:'Trang mới',save:'Lưu',preview:'Xem trước',cut:'Cắt',copy:'Sao chép',paste:'Dán',print:'In',underline:'Gạch chân',bold:'Đậm',italic:'Nghiêng',selectAll:'Chọn tất cả',removeFormat:'Xoá định dạng',strike:'Gạch xuyên ngang',subscript:'Chỉ số dưới',superscript:'Chỉ số trên',horizontalrule:'Chèn đường phân cách ngang',pagebreak:'Chèn ngắt trang',pagebreakAlt:'Ngắt trang',unlink:'Xoá liên kết',undo:'Khôi phục thao tác',redo:'Làm lại thao tác',common:{browseServer:'Duyệt trên máy chủ',url:'URL',protocol:'Giao thức',upload:'Tải lên',uploadSubmit:'Tải lên máy chủ',image:'Hình ảnh',flash:'Flash',form:'Biểu mẫu',checkbox:'Nút kiểm',radio:'Nút chọn',textField:'Trường văn bản',textarea:'Vùng văn bản',hiddenField:'Trường ẩn',button:'Nút',select:'Ô chọn',imageButton:'Nút hình ảnh',notSet:'<không thiết lập>',id:'Định danh',name:'Tên',langDir:'Hướng ngôn ngữ',langDirLtr:'Trái sang phải (LTR)',langDirRtl:'Phải sang trái (RTL)',langCode:'Mã ngôn ngữ',longDescr:'Mô tả URL',cssClass:'Lớp Stylesheet',advisoryTitle:'Nhan đề hướng dẫn',cssStyle:'Kiểu (style)',ok:'Đồng ý',cancel:'Bỏ qua',close:'Đóng',preview:'Xem trước',generalTab:'Tab chung',advancedTab:'Tab mở rộng',validateNumberFailed:'Giá trị này không phải là số.',confirmNewPage:'Mọi thay đổi không được lưu lại, nội dung này sẽ bị mất. Bạn có chắc chắn muốn tải một trang mới?',confirmCancel:'Một vài tùy chọn đã bị thay đổi. Bạn có chắc chắn muốn đóng hộp thoại?',options:'Tùy chọn',target:'Đích đến',targetNew:'Cửa sổ mới (_blank)',targetTop:'Cửa sổ trên cùng (_top)',targetSelf:'Tại trang (_self)',targetParent:'Cửa sổ cha (_parent)',langDirLTR:'Trái sang phải (LTR)',langDirRTL:'Phải sang trái (RTL)',styles:'Kiểu',cssClasses:'Lớp CSS',width:'Chiều rộng',height:'chiều cao',align:'Vị trí',alignLeft:'Trái',alignRight:'Phải',alignCenter:'Giữa',alignTop:'Trên',alignMiddle:'Giữa',alignBottom:'Dưới',invalidHeight:'Chiều cao phải là số nguyên.',invalidWidth:'Chiều rộng phải là số nguyên.',invalidCssLength:'Giá trị quy định cho trường "%1" phải là một số dương có hoặc không có một đơn vị đo CSS hợp lệ (px, %, in, cm, mm, em, ex, pt, hoặc pc).',invalidHtmlLength:'Giá trị quy định cho trường "%1" phải là một số dương có hoặc không có một đơn vị đo HTML hợp lệ (px hoặc %).',invalidInlineStyle:'Giá trị quy định cho kiểu nội tuyến phải bao gồm một hoặc nhiều dữ liệu với định dạng "tên:giá trị", cách nhau bằng dấu chấm phẩy.',cssLengthTooltip:'Nhập một giá trị theo pixel hoặc một số với một đơn vị CSS hợp lệ (px, %, in, cm, mm, em, ex, pt, hoặc pc).',unavailable:'%1<span class="cke_accessibility">, không có</span>'},contextmenu:{options:'Tùy chọn menu bổ xung'},specialChar:{toolbar:'Chèn ký tự đặc biệt',title:'Hãy chọn ký tự đặc biệt',options:'Tùy chọn các ký tự đặc biệt'},link:{toolbar:'Chèn/Sửa liên kết',other:'<khác>',menu:'Sửa liên kết',title:'Liên kết',info:'Thông tin liên kết',target:'Đích',upload:'Tải lên',advanced:'Mở rộng',type:'Kiểu liên kết',toUrl:'URL',toAnchor:'Neo trong trang này',toEmail:'Thư điện tử',targetFrame:'<khung>',targetPopup:'<cửa sổ popup>',targetFrameName:'Tên khung đích',targetPopupName:'Tên cửa sổ Popup',popupFeatures:'Đặc điểm của cửa sổ Popup',popupResizable:'Có thể thay đổi kích cỡ',popupStatusBar:'Thanh trạng thái',popupLocationBar:'Thanh vị trí',popupToolbar:'Thanh công cụ',popupMenuBar:'Thanh Menu',popupFullScreen:'Toàn màn hình (IE)',popupScrollBars:'Thanh cuộn',popupDependent:'Phụ thuộc (Netscape)',popupLeft:'Vị trí bên trái',popupTop:'Vị trí phía trên',id:'Định danh',langDir:'Hướng ngôn ngữ',langDirLTR:'Trái sang phải (LTR)',langDirRTL:'Phải sang trái (RTL)',acccessKey:'Phím hỗ trợ truy cập',name:'Tên',langCode:'Mã ngôn ngữ',tabIndex:'Chỉ số của Tab',advisoryTitle:'Nhan đề hướng dẫn',advisoryContentType:'Nội dung hướng dẫn',cssClasses:'Lớp Stylesheet',charset:'Bảng mã của tài nguyên được liên kết đến',styles:'Kiểu (style)',rel:'Quan hệ',selectAnchor:'Chọn một điểm neo',anchorName:'Theo tên điểm neo',anchorId:'Theo định danh thành phần',emailAddress:'Thư điện tử',emailSubject:'Tiêu đề thông điệp',emailBody:'Nội dung thông điệp',noAnchors:'(Không có điểm neo nào trong tài liệu)',noUrl:'Hãy đưa vào đường dẫn liên kết (URL)',noEmail:'Hãy đưa vào địa chỉ thư điện tử'},anchor:{toolbar:'Chèn/Sửa điểm neo',menu:'Thuộc tính điểm neo',title:'Thuộc tính điểm neo',name:'Tên của điểm neo',errorName:'Hãy nhập vào tên của điểm neo',remove:'Xóa neo'},list:{numberedTitle:'Thuộc tính danh sách có thứ tự',bulletedTitle:'Thuộc tính danh sách không thứ tự',type:'Kiểu loại',start:'Bắt đầu',validateStartNumber:'Số bắt đầu danh sách phải là một số nguyên.',circle:'Khuyên tròn',disc:'Hình đĩa',square:'Hình vuông',none:'Không gì cả',notset:'<không thiết lập>',armenian:'Số theo kiểu Armenian',georgian:'Số theo kiểu Georgian (an, ban, gan...)',lowerRoman:'Số La Mã kiểu thường (i, ii, iii, iv, v...)',upperRoman:'Số La Mã kiểu HOA (I, II, III, IV, V...)',lowerAlpha:'Kiểu abc thường (a, b, c, d, e...)',upperAlpha:'Kiểu ABC HOA (A, B, C, D, E...)',lowerGreek:'Kiểu Hy Lạp (alpha, beta, gamma...)',decimal:'Kiểu số (1, 2, 3 ...)',decimalLeadingZero:'Kiểu số (01, 02, 03...)'},findAndReplace:{title:'Tìm kiếm và thay thế',find:'Tìm kiếm',replace:'Thay thế',findWhat:'Tìm chuỗi:',replaceWith:'Thay bằng:',notFoundMsg:'Không tìm thấy chuỗi cần tìm.',findOptions:'Tìm tùy chọn',matchCase:'Phân biệt chữ hoa/thường',matchWord:'Giống toàn bộ từ',matchCyclic:'Giống một phần',replaceAll:'Thay thế tất cả',replaceSuccessMsg:'%1 vị trí đã được thay thế.'},table:{toolbar:'Bảng',title:'Thuộc tính bảng',menu:'Thuộc tính bảng',deleteTable:'Xóa bảng',rows:'Số hàng',columns:'Số cột',border:'Kích thước đường viền',widthPx:'Điểm ảnh (px)',widthPc:'Phần trăm (%)',widthUnit:'Đơn vị',cellSpace:'Khoảng cách giữa các ô',cellPad:'Khoảng đệm giữ ô và nội dung',caption:'Đầu đề',summary:'Tóm lược',headers:'Đầu đề',headersNone:'Không có',headersColumn:'Cột đầu tiên',headersRow:'Hàng đầu tiên',headersBoth:'Cả hai',invalidRows:'Số lượng hàng phải là một số lớn hơn 0.',invalidCols:'Số lượng cột phải là một số lớn hơn 0.',invalidBorder:'Kích cỡ của đường biên phải là một số nguyên.',invalidWidth:'Chiều rộng của bảng phải là một số nguyên.',invalidHeight:'Chiều cao của bảng phải là một số nguyên.',invalidCellSpacing:'Khoảng cách giữa các ô phải là một số nguyên.',invalidCellPadding:'Khoảng đệm giữa ô và nội dung phải là một số nguyên.',cell:{menu:'Ô',insertBefore:'Chèn ô Phía trước',insertAfter:'Chèn ô Phía sau',deleteCell:'Xoá ô',merge:'Kết hợp ô',mergeRight:'Kết hợp sang phải',mergeDown:'Kết hợp xuống dưới',splitHorizontal:'Phân tách ô theo chiều ngang',splitVertical:'Phân tách ô theo chiều dọc',title:'Thuộc tính của ô',cellType:'Kiểu của ô',rowSpan:'Kết hợp hàng',colSpan:'Kết hợp cột',wordWrap:'Chữ liền hàng',hAlign:'Canh lề ngang',vAlign:'Canh lề dọc',alignBaseline:'Đường cơ sở',bgColor:'Màu nền',borderColor:'Màu viền',data:'Dữ liệu',header:'Đầu đề',yes:'Có',no:'Không',invalidWidth:'Chiều rộng của ô phải là một số nguyên.',invalidHeight:'Chiều cao của ô phải là một số nguyên.',invalidRowSpan:'Số hàng kết hợp phải là một số nguyên.',invalidColSpan:'Số cột kết hợp phải là một số nguyên.',chooseColor:'Chọn màu'},row:{menu:'Hàng',insertBefore:'Chèn hàng phía trước',insertAfter:'Chèn hàng phía sau',deleteRow:'Xoá hàng'},column:{menu:'Cột',insertBefore:'Chèn cột phía trước',insertAfter:'Chèn cột phía sau',deleteColumn:'Xoá cột'}},button:{title:'Thuộc tính của nút',text:'Chuỗi hiển thị (giá trị)',type:'Kiểu',typeBtn:'Nút bấm',typeSbm:'Nút gửi',typeRst:'Nút nhập lại'},checkboxAndRadio:{checkboxTitle:'Thuộc tính nút kiểm',radioTitle:'Thuộc tính nút chọn',value:'Giá trị',selected:'Được chọn'},form:{title:'Thuộc tính biểu mẫu',menu:'Thuộc tính biểu mẫu',action:'Hành động',method:'Phương thức',encoding:'Bảng mã'},select:{title:'Thuộc tính ô chọn',selectInfo:'Thông tin',opAvail:'Các tùy chọn có thể sử dụng',value:'Giá trị',size:'Kích cỡ',lines:'dòng',chkMulti:'Cho phép chọn nhiều',opText:'Văn bản',opValue:'Giá trị',btnAdd:'Thêm',btnModify:'Thay đổi',btnUp:'Lên',btnDown:'Xuống',btnSetValue:'Giá trị được chọn',btnDelete:'Nút xoá'},textarea:{title:'Thuộc tính vùng văn bản',cols:'Số cột',rows:'Số hàng'},textfield:{title:'Thuộc tính trường văn bản',name:'Tên',value:'Giá trị',charWidth:'Độ rộng của ký tự',maxChars:'Số ký tự tối đa',type:'Kiểu',typeText:'Ký tự',typePass:'Mật khẩu'},hidden:{title:'Thuộc tính trường ẩn',name:'Tên',value:'Giá trị'},image:{title:'Thuộc tính của ảnh',titleButton:'Thuộc tính nút của ảnh',menu:'Thuộc tính của ảnh',infoTab:'Thông tin của ảnh',btnUpload:'Tải lên máy chủ',upload:'Tải lên',alt:'Chú thích ảnh',lockRatio:'Giữ nguyên tỷ lệ',resetSize:'Kích thước gốc',border:'Đường viền',hSpace:'Khoảng đệm ngang',vSpace:'Khoảng đệm dọc',alertUrl:'Hãy đưa vào đường dẫn của ảnh',linkTab:'Tab liên kết',button2Img:'Bạn có muốn chuyển nút bấm bằng ảnh được chọn thành ảnh?',img2Button:'Bạn có muốn chuyển đổi ảnh được chọn thành nút bấm bằng ảnh?',urlMissing:'Thiếu đường dẫn hình ảnh',validateBorder:'Chiều rộng của đường viền phải là một số nguyên dương',validateHSpace:'Khoảng đệm ngang phải là một số nguyên dương',validateVSpace:'Khoảng đệm dọc phải là một số nguyên dương'},flash:{properties:'Thuộc tính Flash',propertiesTab:'Thuộc tính',title:'Thuộc tính Flash',chkPlay:'Tự động chạy',chkLoop:'Lặp',chkMenu:'Cho phép bật menu của Flash',chkFull:'Cho phép toàn màn hình',scale:'Tỷ lệ',scaleAll:'Hiển thị tất cả',scaleNoBorder:'Không đường viền',scaleFit:'Vừa vặn',access:'Truy cập mã',accessAlways:'Luôn luôn',accessSameDomain:'Cùng tên miền',accessNever:'Không bao giờ',alignAbsBottom:'Dưới tuyệt đối',alignAbsMiddle:'Giữa tuyệt đối',alignBaseline:'Đường cơ sở',alignTextTop:'Phía trên chữ',quality:'Chất lượng',qualityBest:'Tốt nhất',qualityHigh:'Cao',qualityAutoHigh:'Cao tự động',qualityMedium:'Trung bình',qualityAutoLow:'Thấp tự động',qualityLow:'Thấp',windowModeWindow:'Cửa sổ',windowModeOpaque:'Mờ đục',windowModeTransparent:'Trong suốt',windowMode:'Chế độ cửa sổ',flashvars:'Các biến số dành cho Flash',bgcolor:'Màu nền',hSpace:'Khoảng đệm ngang',vSpace:'Khoảng đệm dọc',validateSrc:'Hãy đưa vào đường dẫn liên kết',validateHSpace:'Khoảng đệm ngang phải là số nguyên.',validateVSpace:'Khoảng đệm dọc phải là số nguyên.'},spellCheck:{toolbar:'Kiểm tra chính tả',title:'Kiểm tra chính tả',notAvailable:'Xin lỗi, dịch vụ này hiện tại không có.',errorLoading:'Lỗi khi đang nạp dịch vụ ứng dụng: %s.',notInDic:'Không có trong từ điển',changeTo:'Chuyển thành',btnIgnore:'Bỏ qua',btnIgnoreAll:'Bỏ qua tất cả',btnReplace:'Thay thế',btnReplaceAll:'Thay thế tất cả',btnUndo:'Phục hồi lại',noSuggestions:'- Không đưa ra gợi ý về từ -',progress:'Đang tiến hành kiểm tra chính tả...',noMispell:'Hoàn tất kiểm tra chính tả: Không có lỗi chính tả',noChanges:'Hoàn tất kiểm tra chính tả: Không có từ nào được thay đổi',oneChange:'Hoàn tất kiểm tra chính tả: Một từ đã được thay đổi',manyChanges:'Hoàn tất kiểm tra chính tả: %1 từ đã được thay đổi',ieSpellDownload:'Chức năng kiểm tra chính tả chưa được cài đặt. Bạn có muốn tải về ngay bây giờ?'},smiley:{toolbar:'Hình biểu lộ cảm xúc (mặt cười)',title:'Chèn hình biểu lộ cảm xúc (mặt cười)',options:'Tùy chọn hình biểu lộ cảm xúc'},elementsPath:{eleLabel:'Nhãn thành phần',eleTitle:'%1 thành phần'},numberedlist:'Chèn/Xoá Danh sách có thứ tự',bulletedlist:'Chèn/Xoá Danh sách không thứ tự',indent:'Dịch vào trong',outdent:'Dịch ra ngoài',justify:{left:'Canh trái',center:'Canh giữa',right:'Canh phải',block:'Canh đều'},blockquote:'Khối trích dẫn',clipboard:{title:'Dán',cutError:'Các thiết lập bảo mật của trình duyệt không cho phép trình biên tập tự động thực thi lệnh cắt. Hãy sử dụng bàn phím cho lệnh này (Ctrl/Cmd+X).',copyError:'Các thiết lập bảo mật của trình duyệt không cho phép trình biên tập tự động thực thi lệnh sao chép. Hãy sử dụng bàn phím cho lệnh này (Ctrl/Cmd+C).',pasteMsg:'Hãy dán nội dung vào trong khung bên dưới, sử dụng tổ hợp phím (<STRONG>Ctrl/Cmd+V</STRONG>) và nhấn vào nút <STRONG>Đồng ý</STRONG>.',securityMsg:'Do thiết lập bảo mật của trình duyệt nên trình biên tập không thể truy cập trực tiếp vào nội dung đã sao chép. Bạn cần phải dán lại nội dung vào cửa sổ này.',pasteArea:'Khu vực dán'},pastefromword:{confirmCleanup:'Văn bản bạn muốn dán có kèm định dạng của Word. Bạn có muốn loại bỏ định dạng Word trước khi dán?',toolbar:'Dán với định dạng Word',title:'Dán với định dạng Word',error:'Không thể để làm sạch các dữ liệu dán do một lỗi nội bộ'},pasteText:{button:'Dán theo định dạng văn bản thuần',title:'Dán theo định dạng văn bản thuần'},templates:{button:'Mẫu dựng sẵn',title:'Nội dung Mẫu dựng sẵn',options:'Tùy chọn mẫu dựng sẵn',insertOption:'Thay thế nội dung hiện tại',selectPromptMsg:'Hãy chọn mẫu dựng sẵn để mở trong trình biên tập<br>(nội dung hiện tại sẽ bị mất):',emptyListMsg:'(Không có mẫu dựng sẵn nào được định nghĩa)'},showBlocks:'Hiển thị các khối',stylesCombo:{label:'Kiểu',panelTitle:'Phong cách định dạng',panelTitle1:'Kiểu khối',panelTitle2:'Kiểu trực tiếp',panelTitle3:'Kiểu đối tượng'},format:{label:'Định dạng',panelTitle:'Định dạng',tag_p:'Bình thường (P)',tag_pre:'Đã thiết lập',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Bình thường (DIV)'},div:{title:'Tạo khối các thành phần',toolbar:'Tạo khối các thành phần',cssClassInputLabel:'Các lớp CSS',styleSelectLabel:'Kiểu (style)',IdInputLabel:'Định danh (id)',languageCodeInputLabel:'Mã ngôn ngữ',inlineStyleInputLabel:'Kiểu nội dòng',advisoryTitleInputLabel:'Nhan đề hướng dẫn',langDirLabel:'Hướng ngôn ngữ',langDirLTRLabel:'Trái sang phải (LTR)',langDirRTLLabel:'Phải qua trái (RTL)',edit:'Chỉnh sửa',remove:'Xóa bỏ'},iframe:{title:'Thuộc tính iframe',toolbar:'Iframe',noUrl:'Vui lòng nhập địa chỉ iframe',scrolling:'Kích hoạt thanh cuộn',border:'Hiển thị viền khung'},font:{label:'Phông',voiceLabel:'Phông',panelTitle:'Phông'},fontSize:{label:'Cỡ chữ',voiceLabel:'Kích cỡ phông',panelTitle:'Cỡ chữ'},colorButton:{textColorTitle:'Màu chữ',bgColorTitle:'Màu nền',panelTitle:'Màu sắc',auto:'Tự động',more:'Màu khác...'},colors:{'000':'Đen',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Nâu',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Xám',F00:'Đỏ',FF8C00:'Dark Orange',FFD700:'Vàng','008000':'Xanh lá cây','0FF':'Cyan','00F':'Xanh da trời',EE82EE:'Tím',A9A9A9:'Xám tối',FFA07A:'Light Salmon',FFA500:'Màu cam',FFFF00:'Vàng','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'Trắng'},scayt:{title:'Kiểm tra chính tả ngay khi gõ chữ (SCAYT)',opera_title:'Không hỗ trợ trên trình duyệt Opera',enable:'Bật SCAYT',disable:'Tắt SCAYT',about:'Thông tin về SCAYT',toggle:'Bật tắt SCAYT',options:'Tùy chọn',langs:'Ngôn ngữ',moreSuggestions:'Đề xuất thêm',ignore:'Bỏ qua',ignoreAll:'Bỏ qua tất cả',addWord:'Thêm từ',emptyDic:'Tên của từ điển không được để trống.',optionsTab:'Tùy chọn',allCaps:'Không phân biệt chữ HOA chữ thường',ignoreDomainNames:'Bỏ qua tên miền',mixedCase:'Không phân biệt loại chữ',mixedWithDigits:'Không phân biệt chữ và số',languagesTab:'Tab ngôn ngữ',dictionariesTab:'Từ điển',dic_field_name:'Tên từ điển',dic_create:'Tạo',dic_restore:'Phục hồi',dic_delete:'Xóa',dic_rename:'Thay tên',dic_info:'Ban đầu, từ điển người dùng được lưu trữ trong một cookie. Tuy nhiên, kích thước cookie bị giới hạn. Khi người sử dụng từ điển phát triển đến điểm không thể được lưu trữ trong cookie, từ điển sẽ được lưu trữ trên máy chủ của chúng tôi. Để lưu trữ từ điển cá nhân của bạn trên máy chủ của chúng tôi, bạn nên xác định một tên cho từ điển của bạn. Nếu bạn đã có một cuốn từ điển được lưu trữ, xin vui lòng gõ tên của nó và nhấn vào nút Khôi phục.',aboutTab:'Thông tin'},about:{title:'Thông tin về CKEditor',dlgTitle:'Thông tin về CKEditor',help:'Kiểm tra $1 để được giúp đỡ.',userGuide:'Hướng dẫn sử dụng CKEditor',moreInfo:'Vui lòng ghé thăm trang web của chúng tôi để có thông tin về giấy phép:',copy:'Bản quyền © $1. Giữ toàn quyền.'},maximize:'Phóng to tối đa',minimize:'Thu nhỏ',fakeobjects:{anchor:'Điểm neo',flash:'Flash',iframe:'IFrame',hiddenfield:'Trường ẩn',unknown:'Đối tượng không rõ ràng'},resize:'Kéo rê để thay đổi kích cỡ',colordialog:{title:'Chọn màu',options:'Tùy chọn màu',highlight:'Màu chọn',selected:'Màu đã chọn',clear:'Xóa bỏ'},toolbarCollapse:'Thu gọn thanh công cụ',toolbarExpand:'Mở rộng thnah công cụ',toolbarGroups:{document:'Tài liệu',clipboard:'Clipboard/Undo',editing:'Chỉnh sửa',forms:'Bảng biểu',basicstyles:'Kiểu cơ bản',paragraph:'Đoạn',links:'Liên kết',insert:'Chèn',styles:'Kiểu',colors:'Màu sắc',tools:'Công cụ'},bidi:{ltr:'Văn bản hướng từ trái sang phải',rtl:'Văn bản hướng từ phải sang trái'},docprops:{label:'Thuộc tính Tài liệu',title:'Thuộc tính Tài liệu',design:'Thiết kế',meta:'Siêu dữ liệu',chooseColor:'Chọn màu',other:'<khác>',docTitle:'Tiêu đề Trang',charset:'Bảng mã ký tự',charsetOther:'Bảng mã ký tự khác',charsetASCII:'ASCII',charsetCE:'Trung Âu',charsetCT:'Tiếng Trung Quốc (Big5)',charsetCR:'Tiếng Kirin',charsetGR:'Tiếng Hy Lạp',charsetJP:'Tiếng Nhật',charsetKR:'Tiếng Hàn',charsetTR:'Tiếng Thổ Nhĩ Kỳ',charsetUN:'Unicode (UTF-8)',charsetWE:'Tây Âu',docType:'Kiểu Đề mục Tài liệu',docTypeOther:'Kiểu Đề mục Tài liệu khác',xhtmlDec:'Bao gồm cả định nghĩa XHTML',bgColor:'Màu nền',bgImage:'URL của Hình ảnh nền',bgFixed:'Không cuộn nền',txtColor:'Màu chữ',margin:'Đường biên của Trang',marginTop:'Trên',marginLeft:'Trái',marginRight:'Phải',marginBottom:'Dưới',metaKeywords:'Các từ khóa chỉ mục tài liệu (phân cách bởi dấu phẩy)',metaDescription:'Mô tả tài liệu',metaAuthor:'Tác giả',metaCopyright:'Bản quyền',previewHtml:'<p>Đây là một số <strong>văn bản mẫu</strong>. Bạn đang sử dụng <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.vi={dir:'trái-qua-phải',editorTitle:'Trình soạn thảo phong phú, %1',editorHelp:'Nhấn ALT + 0 để được giúp đỡ',toolbars:'Thanh công cụ',editor:'Bộ soạn thảo',source:'Mã HTML',newPage:'Trang mới',save:'Lưu',preview:'Xem trước',cut:'Cắt',copy:'Sao chép',paste:'Dán',print:'In',underline:'Gạch chân',bold:'Đậm',italic:'Nghiêng',selectAll:'Chọn tất cả',removeFormat:'Xoá định dạng',strike:'Gạch xuyên ngang',subscript:'Chỉ số dưới',superscript:'Chỉ số trên',horizontalrule:'Chèn đường phân cách ngang',pagebreak:'Chèn ngắt trang',pagebreakAlt:'Ngắt trang',unlink:'Xoá liên kết',undo:'Khôi phục thao tác',redo:'Làm lại thao tác',common:{browseServer:'Duyệt trên máy chủ',url:'URL',protocol:'Giao thức',upload:'Tải lên',uploadSubmit:'Tải lên máy chủ',image:'Hình ảnh',flash:'Flash',form:'Biểu mẫu',checkbox:'Nút kiểm',radio:'Nút chọn',textField:'Trường văn bản',textarea:'Vùng văn bản',hiddenField:'Trường ẩn',button:'Nút',select:'Ô chọn',imageButton:'Nút hình ảnh',notSet:'<không thiết lập>',id:'Định danh',name:'Tên',langDir:'Hướng ngôn ngữ',langDirLtr:'Trái sang phải (LTR)',langDirRtl:'Phải sang trái (RTL)',langCode:'Mã ngôn ngữ',longDescr:'Mô tả URL',cssClass:'Lớp Stylesheet',advisoryTitle:'Nhan đề hướng dẫn',cssStyle:'Kiểu (style)',ok:'Đồng ý',cancel:'Bỏ qua',close:'Đóng',preview:'Xem trước',generalTab:'Tab chung',advancedTab:'Tab mở rộng',validateNumberFailed:'Giá trị này không phải là số.',confirmNewPage:'Mọi thay đổi không được lưu lại, nội dung này sẽ bị mất. Bạn có chắc chắn muốn tải một trang mới?',confirmCancel:'Một vài tùy chọn đã bị thay đổi. Bạn có chắc chắn muốn đóng hộp thoại?',options:'Tùy chọn',target:'Đích đến',targetNew:'Cửa sổ mới (_blank)',targetTop:'Cửa sổ trên cùng (_top)',targetSelf:'Tại trang (_self)',targetParent:'Cửa sổ cha (_parent)',langDirLTR:'Trái sang phải (LTR)',langDirRTL:'Phải sang trái (RTL)',styles:'Kiểu',cssClasses:'Lớp CSS',width:'Chiều rộng',height:'chiều cao',align:'Vị trí',alignLeft:'Trái',alignRight:'Phải',alignCenter:'Giữa',alignTop:'Trên',alignMiddle:'Giữa',alignBottom:'Dưới',invalidHeight:'Chiều cao phải là số nguyên.',invalidWidth:'Chiều rộng phải là số nguyên.',invalidCssLength:'Giá trị quy định cho trường "%1" phải là một số dương có hoặc không có một đơn vị đo CSS hợp lệ (px, %, in, cm, mm, em, ex, pt, hoặc pc).',invalidHtmlLength:'Giá trị quy định cho trường "%1" phải là một số dương có hoặc không có một đơn vị đo HTML hợp lệ (px hoặc %).',invalidInlineStyle:'Giá trị quy định cho kiểu nội tuyến phải bao gồm một hoặc nhiều dữ liệu với định dạng "tên:giá trị", cách nhau bằng dấu chấm phẩy.',cssLengthTooltip:'Nhập một giá trị theo pixel hoặc một số với một đơn vị CSS hợp lệ (px, %, in, cm, mm, em, ex, pt, hoặc pc).',unavailable:'%1<span class="cke_accessibility">, không có</span>'},contextmenu:{options:'Tùy chọn menu bổ xung'},specialChar:{toolbar:'Chèn ký tự đặc biệt',title:'Hãy chọn ký tự đặc biệt',options:'Tùy chọn các ký tự đặc biệt'},link:{toolbar:'Chèn/Sửa liên kết',other:'<khác>',menu:'Sửa liên kết',title:'Liên kết',info:'Thông tin liên kết',target:'Đích',upload:'Tải lên',advanced:'Mở rộng',type:'Kiểu liên kết',toUrl:'URL',toAnchor:'Neo trong trang này',toEmail:'Thư điện tử',targetFrame:'<khung>',targetPopup:'<cửa sổ popup>',targetFrameName:'Tên khung đích',targetPopupName:'Tên cửa sổ Popup',popupFeatures:'Đặc điểm của cửa sổ Popup',popupResizable:'Có thể thay đổi kích cỡ',popupStatusBar:'Thanh trạng thái',popupLocationBar:'Thanh vị trí',popupToolbar:'Thanh công cụ',popupMenuBar:'Thanh Menu',popupFullScreen:'Toàn màn hình (IE)',popupScrollBars:'Thanh cuộn',popupDependent:'Phụ thuộc (Netscape)',popupLeft:'Vị trí bên trái',popupTop:'Vị trí phía trên',id:'Định danh',langDir:'Hướng ngôn ngữ',langDirLTR:'Trái sang phải (LTR)',langDirRTL:'Phải sang trái (RTL)',acccessKey:'Phím hỗ trợ truy cập',name:'Tên',langCode:'Mã ngôn ngữ',tabIndex:'Chỉ số của Tab',advisoryTitle:'Nhan đề hướng dẫn',advisoryContentType:'Nội dung hướng dẫn',cssClasses:'Lớp Stylesheet',charset:'Bảng mã của tài nguyên được liên kết đến',styles:'Kiểu (style)',rel:'Quan hệ',selectAnchor:'Chọn một điểm neo',anchorName:'Theo tên điểm neo',anchorId:'Theo định danh thành phần',emailAddress:'Thư điện tử',emailSubject:'Tiêu đề thông điệp',emailBody:'Nội dung thông điệp',noAnchors:'(Không có điểm neo nào trong tài liệu)',noUrl:'Hãy đưa vào đường dẫn liên kết (URL)',noEmail:'Hãy đưa vào địa chỉ thư điện tử'},anchor:{toolbar:'Chèn/Sửa điểm neo',menu:'Thuộc tính điểm neo',title:'Thuộc tính điểm neo',name:'Tên của điểm neo',errorName:'Hãy nhập vào tên của điểm neo',remove:'Xóa neo'},list:{numberedTitle:'Thuộc tính danh sách có thứ tự',bulletedTitle:'Thuộc tính danh sách không thứ tự',type:'Kiểu loại',start:'Bắt đầu',validateStartNumber:'Số bắt đầu danh sách phải là một số nguyên.',circle:'Khuyên tròn',disc:'Hình đĩa',square:'Hình vuông',none:'Không gì cả',notset:'<không thiết lập>',armenian:'Số theo kiểu Armenian',georgian:'Số theo kiểu Georgian (an, ban, gan...)',lowerRoman:'Số La Mã kiểu thường (i, ii, iii, iv, v...)',upperRoman:'Số La Mã kiểu HOA (I, II, III, IV, V...)',lowerAlpha:'Kiểu abc thường (a, b, c, d, e...)',upperAlpha:'Kiểu ABC HOA (A, B, C, D, E...)',lowerGreek:'Kiểu Hy Lạp (alpha, beta, gamma...)',decimal:'Kiểu số (1, 2, 3 ...)',decimalLeadingZero:'Kiểu số (01, 02, 03...)'},findAndReplace:{title:'Tìm kiếm và thay thế',find:'Tìm kiếm',replace:'Thay thế',findWhat:'Tìm chuỗi:',replaceWith:'Thay bằng:',notFoundMsg:'Không tìm thấy chuỗi cần tìm.',findOptions:'Tìm tùy chọn',matchCase:'Phân biệt chữ hoa/thường',matchWord:'Giống toàn bộ từ',matchCyclic:'Giống một phần',replaceAll:'Thay thế tất cả',replaceSuccessMsg:'%1 vị trí đã được thay thế.'},table:{toolbar:'Bảng',title:'Thuộc tính bảng',menu:'Thuộc tính bảng',deleteTable:'Xóa bảng',rows:'Số hàng',columns:'Số cột',border:'Kích thước đường viền',widthPx:'Điểm ảnh (px)',widthPc:'Phần trăm (%)',widthUnit:'Đơn vị',cellSpace:'Khoảng cách giữa các ô',cellPad:'Khoảng đệm giữ ô và nội dung',caption:'Đầu đề',summary:'Tóm lược',headers:'Đầu đề',headersNone:'Không có',headersColumn:'Cột đầu tiên',headersRow:'Hàng đầu tiên',headersBoth:'Cả hai',invalidRows:'Số lượng hàng phải là một số lớn hơn 0.',invalidCols:'Số lượng cột phải là một số lớn hơn 0.',invalidBorder:'Kích cỡ của đường biên phải là một số nguyên.',invalidWidth:'Chiều rộng của bảng phải là một số nguyên.',invalidHeight:'Chiều cao của bảng phải là một số nguyên.',invalidCellSpacing:'Khoảng cách giữa các ô phải là một số nguyên.',invalidCellPadding:'Khoảng đệm giữa ô và nội dung phải là một số nguyên.',cell:{menu:'Ô',insertBefore:'Chèn ô Phía trước',insertAfter:'Chèn ô Phía sau',deleteCell:'Xoá ô',merge:'Kết hợp ô',mergeRight:'Kết hợp sang phải',mergeDown:'Kết hợp xuống dưới',splitHorizontal:'Phân tách ô theo chiều ngang',splitVertical:'Phân tách ô theo chiều dọc',title:'Thuộc tính của ô',cellType:'Kiểu của ô',rowSpan:'Kết hợp hàng',colSpan:'Kết hợp cột',wordWrap:'Chữ liền hàng',hAlign:'Canh lề ngang',vAlign:'Canh lề dọc',alignBaseline:'Đường cơ sở',bgColor:'Màu nền',borderColor:'Màu viền',data:'Dữ liệu',header:'Đầu đề',yes:'Có',no:'Không',invalidWidth:'Chiều rộng của ô phải là một số nguyên.',invalidHeight:'Chiều cao của ô phải là một số nguyên.',invalidRowSpan:'Số hàng kết hợp phải là một số nguyên.',invalidColSpan:'Số cột kết hợp phải là một số nguyên.',chooseColor:'Chọn màu'},row:{menu:'Hàng',insertBefore:'Chèn hàng phía trước',insertAfter:'Chèn hàng phía sau',deleteRow:'Xoá hàng'},column:{menu:'Cột',insertBefore:'Chèn cột phía trước',insertAfter:'Chèn cột phía sau',deleteColumn:'Xoá cột'}},button:{title:'Thuộc tính của nút',text:'Chuỗi hiển thị (giá trị)',type:'Kiểu',typeBtn:'Nút bấm',typeSbm:'Nút gửi',typeRst:'Nút nhập lại'},checkboxAndRadio:{checkboxTitle:'Thuộc tính nút kiểm',radioTitle:'Thuộc tính nút chọn',value:'Giá trị',selected:'Được chọn'},form:{title:'Thuộc tính biểu mẫu',menu:'Thuộc tính biểu mẫu',action:'Hành động',method:'Phương thức',encoding:'Bảng mã'},select:{title:'Thuộc tính ô chọn',selectInfo:'Thông tin',opAvail:'Các tùy chọn có thể sử dụng',value:'Giá trị',size:'Kích cỡ',lines:'dòng',chkMulti:'Cho phép chọn nhiều',opText:'Văn bản',opValue:'Giá trị',btnAdd:'Thêm',btnModify:'Thay đổi',btnUp:'Lên',btnDown:'Xuống',btnSetValue:'Giá trị được chọn',btnDelete:'Nút xoá'},textarea:{title:'Thuộc tính vùng văn bản',cols:'Số cột',rows:'Số hàng'},textfield:{title:'Thuộc tính trường văn bản',name:'Tên',value:'Giá trị',charWidth:'Độ rộng của ký tự',maxChars:'Số ký tự tối đa',type:'Kiểu',typeText:'Ký tự',typePass:'Mật khẩu'},hidden:{title:'Thuộc tính trường ẩn',name:'Tên',value:'Giá trị'},image:{title:'Thuộc tính của ảnh',titleButton:'Thuộc tính nút của ảnh',menu:'Thuộc tính của ảnh',infoTab:'Thông tin của ảnh',btnUpload:'Tải lên máy chủ',upload:'Tải lên',alt:'Chú thích ảnh',lockRatio:'Giữ nguyên tỷ lệ',resetSize:'Kích thước gốc',border:'Đường viền',hSpace:'Khoảng đệm ngang',vSpace:'Khoảng đệm dọc',alertUrl:'Hãy đưa vào đường dẫn của ảnh',linkTab:'Tab liên kết',button2Img:'Bạn có muốn chuyển nút bấm bằng ảnh được chọn thành ảnh?',img2Button:'Bạn có muốn chuyển đổi ảnh được chọn thành nút bấm bằng ảnh?',urlMissing:'Thiếu đường dẫn hình ảnh',validateBorder:'Chiều rộng của đường viền phải là một số nguyên dương',validateHSpace:'Khoảng đệm ngang phải là một số nguyên dương',validateVSpace:'Khoảng đệm dọc phải là một số nguyên dương'},flash:{properties:'Thuộc tính Flash',propertiesTab:'Thuộc tính',title:'Thuộc tính Flash',chkPlay:'Tự động chạy',chkLoop:'Lặp',chkMenu:'Cho phép bật menu của Flash',chkFull:'Cho phép toàn màn hình',scale:'Tỷ lệ',scaleAll:'Hiển thị tất cả',scaleNoBorder:'Không đường viền',scaleFit:'Vừa vặn',access:'Truy cập mã',accessAlways:'Luôn luôn',accessSameDomain:'Cùng tên miền',accessNever:'Không bao giờ',alignAbsBottom:'Dưới tuyệt đối',alignAbsMiddle:'Giữa tuyệt đối',alignBaseline:'Đường cơ sở',alignTextTop:'Phía trên chữ',quality:'Chất lượng',qualityBest:'Tốt nhất',qualityHigh:'Cao',qualityAutoHigh:'Cao tự động',qualityMedium:'Trung bình',qualityAutoLow:'Thấp tự động',qualityLow:'Thấp',windowModeWindow:'Cửa sổ',windowModeOpaque:'Mờ đục',windowModeTransparent:'Trong suốt',windowMode:'Chế độ cửa sổ',flashvars:'Các biến số dành cho Flash',bgcolor:'Màu nền',hSpace:'Khoảng đệm ngang',vSpace:'Khoảng đệm dọc',validateSrc:'Hãy đưa vào đường dẫn liên kết',validateHSpace:'Khoảng đệm ngang phải là số nguyên.',validateVSpace:'Khoảng đệm dọc phải là số nguyên.'},spellCheck:{toolbar:'Kiểm tra chính tả',title:'Kiểm tra chính tả',notAvailable:'Xin lỗi, dịch vụ này hiện tại không có.',errorLoading:'Lỗi khi đang nạp dịch vụ ứng dụng: %s.',notInDic:'Không có trong từ điển',changeTo:'Chuyển thành',btnIgnore:'Bỏ qua',btnIgnoreAll:'Bỏ qua tất cả',btnReplace:'Thay thế',btnReplaceAll:'Thay thế tất cả',btnUndo:'Phục hồi lại',noSuggestions:'- Không đưa ra gợi ý về từ -',progress:'Đang tiến hành kiểm tra chính tả...',noMispell:'Hoàn tất kiểm tra chính tả: Không có lỗi chính tả',noChanges:'Hoàn tất kiểm tra chính tả: Không có từ nào được thay đổi',oneChange:'Hoàn tất kiểm tra chính tả: Một từ đã được thay đổi',manyChanges:'Hoàn tất kiểm tra chính tả: %1 từ đã được thay đổi',ieSpellDownload:'Chức năng kiểm tra chính tả chưa được cài đặt. Bạn có muốn tải về ngay bây giờ?'},smiley:{toolbar:'Hình biểu lộ cảm xúc (mặt cười)',title:'Chèn hình biểu lộ cảm xúc (mặt cười)',options:'Tùy chọn hình biểu lộ cảm xúc'},elementsPath:{eleLabel:'Nhãn thành phần',eleTitle:'%1 thành phần'},numberedlist:'Chèn/Xoá Danh sách có thứ tự',bulletedlist:'Chèn/Xoá Danh sách không thứ tự',indent:'Dịch vào trong',outdent:'Dịch ra ngoài',justify:{left:'Canh trái',center:'Canh giữa',right:'Canh phải',block:'Canh đều'},blockquote:'Khối trích dẫn',clipboard:{title:'Dán',cutError:'Các thiết lập bảo mật của trình duyệt không cho phép trình biên tập tự động thực thi lệnh cắt. Hãy sử dụng bàn phím cho lệnh này (Ctrl/Cmd+X).',copyError:'Các thiết lập bảo mật của trình duyệt không cho phép trình biên tập tự động thực thi lệnh sao chép. Hãy sử dụng bàn phím cho lệnh này (Ctrl/Cmd+C).',pasteMsg:'Hãy dán nội dung vào trong khung bên dưới, sử dụng tổ hợp phím (<STRONG>Ctrl/Cmd+V</STRONG>) và nhấn vào nút <STRONG>Đồng ý</STRONG>.',securityMsg:'Do thiết lập bảo mật của trình duyệt nên trình biên tập không thể truy cập trực tiếp vào nội dung đã sao chép. Bạn cần phải dán lại nội dung vào cửa sổ này.',pasteArea:'Khu vực dán'},pastefromword:{confirmCleanup:'Văn bản bạn muốn dán có kèm định dạng của Word. Bạn có muốn loại bỏ định dạng Word trước khi dán?',toolbar:'Dán với định dạng Word',title:'Dán với định dạng Word',error:'Không thể để làm sạch các dữ liệu dán do một lỗi nội bộ'},pasteText:{button:'Dán theo định dạng văn bản thuần',title:'Dán theo định dạng văn bản thuần'},templates:{button:'Mẫu dựng sẵn',title:'Nội dung Mẫu dựng sẵn',options:'Tùy chọn mẫu dựng sẵn',insertOption:'Thay thế nội dung hiện tại',selectPromptMsg:'Hãy chọn mẫu dựng sẵn để mở trong trình biên tập<br>(nội dung hiện tại sẽ bị mất):',emptyListMsg:'(Không có mẫu dựng sẵn nào được định nghĩa)'},showBlocks:'Hiển thị các khối',stylesCombo:{label:'Kiểu',panelTitle:'Phong cách định dạng',panelTitle1:'Kiểu khối',panelTitle2:'Kiểu trực tiếp',panelTitle3:'Kiểu đối tượng'},format:{label:'Định dạng',panelTitle:'Định dạng',tag_p:'Bình thường (P)',tag_pre:'Đã thiết lập',tag_address:'Address',tag_h1:'Heading 1',tag_h2:'Heading 2',tag_h3:'Heading 3',tag_h4:'Heading 4',tag_h5:'Heading 5',tag_h6:'Heading 6',tag_div:'Bình thường (DIV)'},div:{title:'Tạo khối các thành phần',toolbar:'Tạo khối các thành phần',cssClassInputLabel:'Các lớp CSS',styleSelectLabel:'Kiểu (style)',IdInputLabel:'Định danh (id)',languageCodeInputLabel:'Mã ngôn ngữ',inlineStyleInputLabel:'Kiểu nội dòng',advisoryTitleInputLabel:'Nhan đề hướng dẫn',langDirLabel:'Hướng ngôn ngữ',langDirLTRLabel:'Trái sang phải (LTR)',langDirRTLLabel:'Phải qua trái (RTL)',edit:'Chỉnh sửa',remove:'Xóa bỏ'},iframe:{title:'Thuộc tính iframe',toolbar:'Iframe',noUrl:'Vui lòng nhập địa chỉ iframe',scrolling:'Kích hoạt thanh cuộn',border:'Hiển thị viền khung'},font:{label:'Phông',voiceLabel:'Phông',panelTitle:'Phông'},fontSize:{label:'Cỡ chữ',voiceLabel:'Kích cỡ phông',panelTitle:'Cỡ chữ'},colorButton:{textColorTitle:'Màu chữ',bgColorTitle:'Màu nền',panelTitle:'Màu sắc',auto:'Tự động',more:'Màu khác...'},colors:{'000':'Đen',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Nâu',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Xám',F00:'Đỏ',FF8C00:'Dark Orange',FFD700:'Vàng','008000':'Xanh lá cây','0FF':'Cyan','00F':'Xanh da trời',EE82EE:'Tím',A9A9A9:'Xám tối',FFA07A:'Light Salmon',FFA500:'Màu cam',FFFF00:'Vàng','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'Trắng'},scayt:{title:'Kiểm tra chính tả ngay khi gõ chữ (SCAYT)',opera_title:'Không hỗ trợ trên trình duyệt Opera',enable:'Bật SCAYT',disable:'Tắt SCAYT',about:'Thông tin về SCAYT',toggle:'Bật tắt SCAYT',options:'Tùy chọn',langs:'Ngôn ngữ',moreSuggestions:'Đề xuất thêm',ignore:'Bỏ qua',ignoreAll:'Bỏ qua tất cả',addWord:'Thêm từ',emptyDic:'Tên của từ điển không được để trống.',optionsTab:'Tùy chọn',allCaps:'Không phân biệt chữ HOA chữ thường',ignoreDomainNames:'Bỏ qua tên miền',mixedCase:'Không phân biệt loại chữ',mixedWithDigits:'Không phân biệt chữ và số',languagesTab:'Tab ngôn ngữ',dictionariesTab:'Từ điển',dic_field_name:'Tên từ điển',dic_create:'Tạo',dic_restore:'Phục hồi',dic_delete:'Xóa',dic_rename:'Thay tên',dic_info:'Ban đầu, từ điển người dùng được lưu trữ trong một cookie. Tuy nhiên, kích thước cookie bị giới hạn. Khi người sử dụng từ điển phát triển đến điểm không thể được lưu trữ trong cookie, từ điển sẽ được lưu trữ trên máy chủ của chúng tôi. Để lưu trữ từ điển cá nhân của bạn trên máy chủ của chúng tôi, bạn nên xác định một tên cho từ điển của bạn. Nếu bạn đã có một cuốn từ điển được lưu trữ, xin vui lòng gõ tên của nó và nhấn vào nút Khôi phục.',aboutTab:'Thông tin'},about:{title:'Thông tin về CKEditor',dlgTitle:'Thông tin về CKEditor',help:'Kiểm tra $1 để được giúp đỡ.',userGuide:'Hướng dẫn sử dụng CKEditor',moreInfo:'Vui lòng ghé thăm trang web của chúng tôi để có thông tin về giấy phép:',copy:'Bản quyền © $1. Giữ toàn quyền.'},maximize:'Phóng to tối đa',minimize:'Thu nhỏ',fakeobjects:{anchor:'Điểm neo',flash:'Flash',iframe:'IFrame',hiddenfield:'Trường ẩn',unknown:'Đối tượng không rõ ràng'},resize:'Kéo rê để thay đổi kích cỡ',colordialog:{title:'Chọn màu',options:'Tùy chọn màu',highlight:'Màu chọn',selected:'Màu đã chọn',clear:'Xóa bỏ'},toolbarCollapse:'Thu gọn thanh công cụ',toolbarExpand:'Mở rộng thnah công cụ',toolbarGroups:{document:'Tài liệu',clipboard:'Clipboard/Undo',editing:'Chỉnh sửa',forms:'Bảng biểu',basicstyles:'Kiểu cơ bản',paragraph:'Đoạn',links:'Liên kết',insert:'Chèn',styles:'Kiểu',colors:'Màu sắc',tools:'Công cụ'},bidi:{ltr:'Văn bản hướng từ trái sang phải',rtl:'Văn bản hướng từ phải sang trái'},docprops:{label:'Thuộc tính Tài liệu',title:'Thuộc tính Tài liệu',design:'Thiết kế',meta:'Siêu dữ liệu',chooseColor:'Chọn màu',other:'<khác>',docTitle:'Tiêu đề Trang',charset:'Bảng mã ký tự',charsetOther:'Bảng mã ký tự khác',charsetASCII:'ASCII',charsetCE:'Trung Âu',charsetCT:'Tiếng Trung Quốc (Big5)',charsetCR:'Tiếng Kirin',charsetGR:'Tiếng Hy Lạp',charsetJP:'Tiếng Nhật',charsetKR:'Tiếng Hàn',charsetTR:'Tiếng Thổ Nhĩ Kỳ',charsetUN:'Unicode (UTF-8)',charsetWE:'Tây Âu',docType:'Kiểu Đề mục Tài liệu',docTypeOther:'Kiểu Đề mục Tài liệu khác',xhtmlDec:'Bao gồm cả định nghĩa XHTML',bgColor:'Màu nền',bgImage:'URL của Hình ảnh nền',bgFixed:'Không cuộn nền',txtColor:'Màu chữ',margin:'Đường biên của Trang',marginTop:'Trên',marginLeft:'Trái',marginRight:'Phải',marginBottom:'Dưới',metaKeywords:'Các từ khóa chỉ mục tài liệu (phân cách bởi dấu phẩy)',metaDescription:'Mô tả tài liệu',metaAuthor:'Tác giả',metaCopyright:'Bản quyền',previewHtml:'<p>Đây là một số <strong>văn bản mẫu</strong>. Bạn đang sử dụng <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/zh.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/zh.js
index 4779130..c1c2b39 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/zh.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/zh.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang.zh={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'編輯器工具欄',editor:'富文本編輯器',source:'原始碼',newPage:'開新檔案',save:'儲存',preview:'預覽',cut:'剪下',copy:'複製',paste:'貼上',print:'列印',underline:'底線',bold:'粗體',italic:'斜體',selectAll:'全選',removeFormat:'清除格式',strike:'刪除線',subscript:'下標',superscript:'上標',horizontalrule:'插入水平線',pagebreak:'插入分頁符號',pagebreakAlt:'分頁符號',unlink:'移除超連結',undo:'復原',redo:'重複',common:{browseServer:'瀏覽伺服器端',url:'URL',protocol:'通訊協定',upload:'上傳',uploadSubmit:'上傳至伺服器',image:'影像',flash:'Flash',form:'表單',checkbox:'核取方塊',radio:'選項按鈕',textField:'文字方塊',textarea:'文字區域',hiddenField:'隱藏欄位',button:'按鈕',select:'清單/選單',imageButton:'影像按鈕',notSet:'<尚未設定>',id:'ID',name:'名稱',langDir:'語言方向',langDirLtr:'由左而右 (LTR)',langDirRtl:'由右而左 (RTL)',langCode:'語言代碼',longDescr:'詳細 URL',cssClass:'樣式表類別',advisoryTitle:'標題',cssStyle:'樣式',ok:'確定',cancel:'取消',close:'关闭',preview:'预览',generalTab:'一般',advancedTab:'進階',validateNumberFailed:'需要輸入數字格式',confirmNewPage:'現存的修改尚未儲存,要開新檔案?',confirmCancel:'部份選項尚未儲存,要關閉對話盒?',options:'选项',target:'目标',targetNew:'新窗口(_blank)',targetTop:'整页(_top)',targetSelf:'本窗口(_self)',targetParent:'父窗口(_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'寬度',height:'高度',align:'對齊',alignLeft:'靠左對齊',alignRight:'靠右對齊',alignCenter:'置中',alignTop:'靠上對齊',alignMiddle:'置中對齊',alignBottom:'靠下對齊',invalidHeight:'高度必須為數字格式',invalidWidth:'寬度必須為數字格式',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, 已關閉</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'插入特殊符號',title:'請選擇特殊符號',options:'Special Character Options'},link:{toolbar:'插入/編輯超連結',other:'<其他>',menu:'編輯超連結',title:'超連結',info:'超連結資訊',target:'目標',upload:'上傳',advanced:'進階',type:'超連接類型',toUrl:'URL',toAnchor:'本頁錨點',toEmail:'電子郵件',targetFrame:'<框架>',targetPopup:'<快顯視窗>',targetFrameName:'目標框架名稱',targetPopupName:'快顯視窗名稱',popupFeatures:'快顯視窗屬性',popupResizable:'可縮放',popupStatusBar:'狀態列',popupLocationBar:'網址列',popupToolbar:'工具列',popupMenuBar:'選單列',popupFullScreen:'全螢幕 (IE)',popupScrollBars:'捲軸',popupDependent:'從屬 (NS)',popupLeft:'左',popupTop:'右',id:'ID',langDir:'語言方向',langDirLTR:'由左而右 (LTR)',langDirRTL:'由右而左 (RTL)',acccessKey:'存取鍵',name:'名稱',langCode:'語言方向',tabIndex:'定位順序',advisoryTitle:'標題',advisoryContentType:'內容類型',cssClasses:'樣式表類別',charset:'連結資源之編碼',styles:'樣式',rel:'Relationship',selectAnchor:'請選擇錨點',anchorName:'依錨點名稱',anchorId:'依元件 ID',emailAddress:'電子郵件',emailSubject:'郵件主旨',emailBody:'郵件內容',noAnchors:'(本文件尚無可用之錨點)',noUrl:'請輸入欲連結的 URL',noEmail:'請輸入電子郵件位址'},anchor:{toolbar:'插入/編輯錨點',menu:'錨點屬性',title:'錨點屬性',name:'錨點名稱',errorName:'請輸入錨點名稱',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'尋找與取代',find:'尋找',replace:'取代',findWhat:'尋找:',replaceWith:'取代:',notFoundMsg:'未找到指定的文字。',findOptions:'Find Options',matchCase:'大小寫須相符',matchWord:'全字相符',matchCyclic:'循環搜索',replaceAll:'全部取代',replaceSuccessMsg:'共完成 %1 次取代'},table:{toolbar:'表格',title:'表格屬性',menu:'表格屬性',deleteTable:'刪除表格',rows:'列數',columns:'欄數',border:'邊框',widthPx:'像素',widthPc:'百分比',widthUnit:'width unit',cellSpace:'間距',cellPad:'內距',caption:'標題',summary:'摘要',headers:'標題',headersNone:'無標題',headersColumn:'第一欄',headersRow:'第一列',headersBoth:'第一欄和第一列',invalidRows:'必須有一或更多的列',invalidCols:'必須有一或更多的欄',invalidBorder:'邊框大小必須為數字格式',invalidWidth:'表格寬度必須為數字格式',invalidHeight:'表格高度必須為數字格式',invalidCellSpacing:'儲存格間距必須為數字格式',invalidCellPadding:'儲存格內距必須為數字格式',cell:{menu:'儲存格',insertBefore:'向左插入儲存格',insertAfter:'向右插入儲存格',deleteCell:'刪除儲存格',merge:'合併儲存格',mergeRight:'向右合併儲存格',mergeDown:'向下合併儲存格',splitHorizontal:'橫向分割儲存格',splitVertical:'縱向分割儲存格',title:'儲存格屬性',cellType:'儲存格類別',rowSpan:'儲存格列數',colSpan:'儲存格欄數',wordWrap:'自動換行',hAlign:'水平對齊',vAlign:'垂直對齊',alignBaseline:'基線對齊',bgColor:'背景顏色',borderColor:'邊框顏色',data:'數據',header:'標題',yes:'是',no:'否',invalidWidth:'儲存格寬度必須為數字格式',invalidHeight:'儲存格高度必須為數字格式',invalidRowSpan:'儲存格列數必須為整數格式',invalidColSpan:'儲存格欄數度必須為整數格式',chooseColor:'Choose'},row:{menu:'列',insertBefore:'向上插入列',insertAfter:'向下插入列',deleteRow:'刪除列'},column:{menu:'欄',insertBefore:'向左插入欄',insertAfter:'向右插入欄',deleteColumn:'刪除欄'}},button:{title:'按鈕屬性',text:'顯示文字 (值)',type:'類型',typeBtn:'按鈕 (Button)',typeSbm:'送出 (Submit)',typeRst:'重設 (Reset)'},checkboxAndRadio:{checkboxTitle:'核取方塊屬性',radioTitle:'選項按鈕屬性',value:'選取值',selected:'已選取'},form:{title:'表單屬性',menu:'表單屬性',action:'動作',method:'方法',encoding:'表單編碼'},select:{title:'清單/選單屬性',selectInfo:'資訊',opAvail:'可用選項',value:'值',size:'大小',lines:'行',chkMulti:'可多選',opText:'顯示文字',opValue:'選取值',btnAdd:'新增',btnModify:'修改',btnUp:'上移',btnDown:'下移',btnSetValue:'設為預設值',btnDelete:'刪除'},textarea:{title:'文字區域屬性',cols:'字元寬度',rows:'列數'},textfield:{title:'文字方塊屬性',name:'名稱',value:'值',charWidth:'字元寬度',maxChars:'最多字元數',type:'類型',typeText:'文字',typePass:'密碼'},hidden:{title:'隱藏欄位屬性',name:'名稱',value:'值'},image:{title:'影像屬性',titleButton:'影像按鈕屬性',menu:'影像屬性',infoTab:'影像資訊',btnUpload:'上傳至伺服器',upload:'上傳',alt:'替代文字',lockRatio:'等比例',resetSize:'重設為原大小',border:'邊框',hSpace:'水平距離',vSpace:'垂直距離',alertUrl:'請輸入影像 URL',linkTab:'超連結',button2Img:'要把影像按鈕改成影像嗎?',img2Button:'要把影像改成影像按鈕嗎?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Flash 屬性',propertiesTab:'屬性',title:'Flash 屬性',chkPlay:'自動播放',chkLoop:'重複',chkMenu:'開啟選單',chkFull:'啟動全螢幕顯示',scale:'縮放',scaleAll:'全部顯示',scaleNoBorder:'無邊框',scaleFit:'精確符合',access:'允許腳本訪問',accessAlways:'永遠',accessSameDomain:'相同域名',accessNever:'永不',alignAbsBottom:'絕對下方',alignAbsMiddle:'絕對中間',alignBaseline:'基準線',alignTextTop:'文字上方',quality:'質素',qualityBest:'最好',qualityHigh:'高',qualityAutoHigh:'高(自動)',qualityMedium:'中(自動)',qualityAutoLow:'低(自動)',qualityLow:'低',windowModeWindow:'視窗',windowModeOpaque:'不透明',windowModeTransparent:'透明',windowMode:'視窗模式',flashvars:'Flash 變數',bgcolor:'背景顏色',hSpace:'水平距離',vSpace:'垂直距離',validateSrc:'請輸入欲連結的 URL',validateHSpace:'水平間距必須為數字格式',validateVSpace:'垂直間距必須為數字格式'},spellCheck:{toolbar:'拼字檢查',title:'拼字檢查',notAvailable:'抱歉,服務目前暫不可用',errorLoading:'無法聯系侍服器: %s.',notInDic:'不在字典中',changeTo:'更改為',btnIgnore:'忽略',btnIgnoreAll:'全部忽略',btnReplace:'取代',btnReplaceAll:'全部取代',btnUndo:'復原',noSuggestions:'- 無建議值 -',progress:'進行拼字檢查中…',noMispell:'拼字檢查完成:未發現拼字錯誤',noChanges:'拼字檢查完成:未更改任何單字',oneChange:'拼字檢查完成:更改了 1 個單字',manyChanges:'拼字檢查完成:更改了 %1 個單字',ieSpellDownload:'尚未安裝拼字檢查元件。您是否想要現在下載?'},smiley:{toolbar:'表情符號',title:'插入表情符號',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 元素'},numberedlist:'編號清單',bulletedlist:'項目清單',indent:'增加縮排',outdent:'減少縮排',justify:{left:'靠左對齊',center:'置中',right:'靠右對齊',block:'左右對齊'},blockquote:'引用文字',clipboard:{title:'貼上',cutError:'瀏覽器的安全性設定不允許編輯器自動執行剪下動作。請使用快捷鍵 (Ctrl/Cmd+X) 剪下。',copyError:'瀏覽器的安全性設定不允許編輯器自動執行複製動作。請使用快捷鍵 (Ctrl/Cmd+C) 複製。',pasteMsg:'請使用快捷鍵 (<strong>Ctrl/Cmd+V</strong>) 貼到下方區域中並按下 <strong>確定</strong>',securityMsg:'因為瀏覽器的安全性設定,本編輯器無法直接存取您的剪貼簿資料,請您自行在本視窗進行貼上動作。',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'您想貼上的文字似乎是自 Word 複製而來,請問您是否要先清除 Word 的格式後再行貼上?',toolbar:'自 Word 貼上',title:'自 Word 貼上',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'貼為純文字格式',title:'貼為純文字格式'},templates:{button:'樣版',title:'內容樣版',options:'Template Options',insertOption:'取代原有內容',selectPromptMsg:'請選擇欲開啟的樣版<br> (原有的內容將會被清除):',emptyListMsg:'(無樣版)'},showBlocks:'顯示區塊',stylesCombo:{label:'樣式',panelTitle:'Formatting Styles',panelTitle1:'塊級元素樣式',panelTitle2:'內聯元素樣式',panelTitle3:'物件元素樣式'},format:{label:'格式',panelTitle:'格式',tag_p:'一般',tag_pre:'已格式化',tag_address:'位址',tag_h1:'標題 1',tag_h2:'標題 2',tag_h3:'標題 3',tag_h4:'標題 4',tag_h5:'標題 5',tag_h6:'標題 6',tag_div:'一般 (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'字體',voiceLabel:'字體',panelTitle:'字體'},fontSize:{label:'大小',voiceLabel:'文字大小',panelTitle:'大小'},colorButton:{textColorTitle:'文字顏色',bgColorTitle:'背景顏色',panelTitle:'Colors',auto:'自動',more:'更多顏色…'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'即時拼寫檢查',opera_title:'Not supported by Opera',enable:'啟用即時拼寫檢查',disable:'關閉即時拼寫檢查',about:'關於即時拼寫檢查',toggle:'啟用/關閉即時拼寫檢查',options:'選項',langs:'語言',moreSuggestions:'更多拼寫建議',ignore:'忽略',ignoreAll:'全部忽略',addWord:'添加單詞',emptyDic:'字典名不應為空.',optionsTab:'選項',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'語言',dictionariesTab:'字典',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'關於'},about:{title:'關於 CKEditor',dlgTitle:'關於 CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'訪問我們的網站以獲取更多關於協議的信息',copy:'Copyright © $1. All rights reserved.'},maximize:'最大化',minimize:'最小化',fakeobjects:{anchor:'錨點',flash:'Flash 動畫',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'不明物件'},resize:'拖拽改變大小',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'折叠工具栏',toolbarExpand:'展开工具栏',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'文件屬性',title:'文件屬性',design:'Design',meta:'Meta 資料',chooseColor:'Choose',other:'<其他>',docTitle:'頁面標題',charset:'字元編碼',charsetOther:'其他字元編碼',charsetASCII:'ASCII',charsetCE:'中歐語系',charsetCT:'正體中文 (Big5)',charsetCR:'斯拉夫文',charsetGR:'希臘文',charsetJP:'日文',charsetKR:'韓文',charsetTR:'土耳其文',charsetUN:'Unicode (UTF-8)',charsetWE:'西歐語系',docType:'文件類型',docTypeOther:'其他文件類型',xhtmlDec:'包含 XHTML 定義',bgColor:'背景顏色',bgImage:'背景影像',bgFixed:'浮水印',txtColor:'文字顏色',margin:'頁面邊界',marginTop:'上',marginLeft:'左',marginRight:'右',marginBottom:'下',metaKeywords:'文件索引關鍵字 (用半形逗號[,]分隔)',metaDescription:'文件說明',metaAuthor:'作者',metaCopyright:'版權所有',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang.zh={dir:'ltr',editorTitle:'Rich text editor, %1',editorHelp:'Press ALT 0 for help',toolbars:'編輯器工具欄',editor:'富文本編輯器',source:'原始碼',newPage:'開新檔案',save:'儲存',preview:'預覽',cut:'剪下',copy:'複製',paste:'貼上',print:'列印',underline:'底線',bold:'粗體',italic:'斜體',selectAll:'全選',removeFormat:'清除格式',strike:'刪除線',subscript:'下標',superscript:'上標',horizontalrule:'插入水平線',pagebreak:'插入分頁符號',pagebreakAlt:'分頁符號',unlink:'移除超連結',undo:'復原',redo:'重複',common:{browseServer:'瀏覽伺服器端',url:'URL',protocol:'通訊協定',upload:'上傳',uploadSubmit:'上傳至伺服器',image:'影像',flash:'Flash',form:'表單',checkbox:'核取方塊',radio:'選項按鈕',textField:'文字方塊',textarea:'文字區域',hiddenField:'隱藏欄位',button:'按鈕',select:'清單/選單',imageButton:'影像按鈕',notSet:'<尚未設定>',id:'ID',name:'名稱',langDir:'語言方向',langDirLtr:'由左而右 (LTR)',langDirRtl:'由右而左 (RTL)',langCode:'語言代碼',longDescr:'詳細 URL',cssClass:'樣式表類別',advisoryTitle:'標題',cssStyle:'樣式',ok:'確定',cancel:'取消',close:'关闭',preview:'预览',generalTab:'一般',advancedTab:'進階',validateNumberFailed:'需要輸入數字格式',confirmNewPage:'現存的修改尚未儲存,要開新檔案?',confirmCancel:'部份選項尚未儲存,要關閉對話盒?',options:'选项',target:'目标',targetNew:'新窗口(_blank)',targetTop:'整页(_top)',targetSelf:'本窗口(_self)',targetParent:'父窗口(_parent)',langDirLTR:'Left to Right (LTR)',langDirRTL:'Right to Left (RTL)',styles:'Style',cssClasses:'Stylesheet Classes',width:'寬度',height:'高度',align:'對齊',alignLeft:'靠左對齊',alignRight:'靠右對齊',alignCenter:'置中',alignTop:'靠上對齊',alignMiddle:'置中對齊',alignBottom:'靠下對齊',invalidHeight:'高度必須為數字格式',invalidWidth:'寬度必須為數字格式',invalidCssLength:'Value specified for the "%1" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).',invalidHtmlLength:'Value specified for the "%1" field must be a positive number with or without a valid HTML measurement unit (px or %).',invalidInlineStyle:'Value specified for the inline style must consist of one or more tuples with the format of "name : value", separated by semi-colons.',cssLengthTooltip:'Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).',unavailable:'%1<span class="cke_accessibility">, 已關閉</span>'},contextmenu:{options:'Context Menu Options'},specialChar:{toolbar:'插入特殊符號',title:'請選擇特殊符號',options:'Special Character Options'},link:{toolbar:'插入/編輯超連結',other:'<其他>',menu:'編輯超連結',title:'超連結',info:'超連結資訊',target:'目標',upload:'上傳',advanced:'進階',type:'超連接類型',toUrl:'URL',toAnchor:'本頁錨點',toEmail:'電子郵件',targetFrame:'<框架>',targetPopup:'<快顯視窗>',targetFrameName:'目標框架名稱',targetPopupName:'快顯視窗名稱',popupFeatures:'快顯視窗屬性',popupResizable:'可縮放',popupStatusBar:'狀態列',popupLocationBar:'網址列',popupToolbar:'工具列',popupMenuBar:'選單列',popupFullScreen:'全螢幕 (IE)',popupScrollBars:'捲軸',popupDependent:'從屬 (NS)',popupLeft:'左',popupTop:'右',id:'ID',langDir:'語言方向',langDirLTR:'由左而右 (LTR)',langDirRTL:'由右而左 (RTL)',acccessKey:'存取鍵',name:'名稱',langCode:'語言方向',tabIndex:'定位順序',advisoryTitle:'標題',advisoryContentType:'內容類型',cssClasses:'樣式表類別',charset:'連結資源之編碼',styles:'樣式',rel:'Relationship',selectAnchor:'請選擇錨點',anchorName:'依錨點名稱',anchorId:'依元件 ID',emailAddress:'電子郵件',emailSubject:'郵件主旨',emailBody:'郵件內容',noAnchors:'(本文件尚無可用之錨點)',noUrl:'請輸入欲連結的 URL',noEmail:'請輸入電子郵件位址'},anchor:{toolbar:'插入/編輯錨點',menu:'錨點屬性',title:'錨點屬性',name:'錨點名稱',errorName:'請輸入錨點名稱',remove:'Remove Anchor'},list:{numberedTitle:'Numbered List Properties',bulletedTitle:'Bulleted List Properties',type:'Type',start:'Start',validateStartNumber:'List start number must be a whole number.',circle:'Circle',disc:'Disc',square:'Square',none:'None',notset:'<not set>',armenian:'Armenian numbering',georgian:'Georgian numbering (an, ban, gan, etc.)',lowerRoman:'Lower Roman (i, ii, iii, iv, v, etc.)',upperRoman:'Upper Roman (I, II, III, IV, V, etc.)',lowerAlpha:'Lower Alpha (a, b, c, d, e, etc.)',upperAlpha:'Upper Alpha (A, B, C, D, E, etc.)',lowerGreek:'Lower Greek (alpha, beta, gamma, etc.)',decimal:'Decimal (1, 2, 3, etc.)',decimalLeadingZero:'Decimal leading zero (01, 02, 03, etc.)'},findAndReplace:{title:'尋找與取代',find:'尋找',replace:'取代',findWhat:'尋找:',replaceWith:'取代:',notFoundMsg:'未找到指定的文字。',findOptions:'Find Options',matchCase:'大小寫須相符',matchWord:'全字相符',matchCyclic:'循環搜索',replaceAll:'全部取代',replaceSuccessMsg:'共完成 %1 次取代'},table:{toolbar:'表格',title:'表格屬性',menu:'表格屬性',deleteTable:'刪除表格',rows:'列數',columns:'欄數',border:'邊框',widthPx:'像素',widthPc:'百分比',widthUnit:'width unit',cellSpace:'間距',cellPad:'內距',caption:'標題',summary:'摘要',headers:'標題',headersNone:'無標題',headersColumn:'第一欄',headersRow:'第一列',headersBoth:'第一欄和第一列',invalidRows:'必須有一或更多的列',invalidCols:'必須有一或更多的欄',invalidBorder:'邊框大小必須為數字格式',invalidWidth:'表格寬度必須為數字格式',invalidHeight:'表格高度必須為數字格式',invalidCellSpacing:'儲存格間距必須為數字格式',invalidCellPadding:'儲存格內距必須為數字格式',cell:{menu:'儲存格',insertBefore:'向左插入儲存格',insertAfter:'向右插入儲存格',deleteCell:'刪除儲存格',merge:'合併儲存格',mergeRight:'向右合併儲存格',mergeDown:'向下合併儲存格',splitHorizontal:'橫向分割儲存格',splitVertical:'縱向分割儲存格',title:'儲存格屬性',cellType:'儲存格類別',rowSpan:'儲存格列數',colSpan:'儲存格欄數',wordWrap:'自動換行',hAlign:'水平對齊',vAlign:'垂直對齊',alignBaseline:'基線對齊',bgColor:'背景顏色',borderColor:'邊框顏色',data:'數據',header:'標題',yes:'是',no:'否',invalidWidth:'儲存格寬度必須為數字格式',invalidHeight:'儲存格高度必須為數字格式',invalidRowSpan:'儲存格列數必須為整數格式',invalidColSpan:'儲存格欄數度必須為整數格式',chooseColor:'Choose'},row:{menu:'列',insertBefore:'向上插入列',insertAfter:'向下插入列',deleteRow:'刪除列'},column:{menu:'欄',insertBefore:'向左插入欄',insertAfter:'向右插入欄',deleteColumn:'刪除欄'}},button:{title:'按鈕屬性',text:'顯示文字 (值)',type:'類型',typeBtn:'按鈕 (Button)',typeSbm:'送出 (Submit)',typeRst:'重設 (Reset)'},checkboxAndRadio:{checkboxTitle:'核取方塊屬性',radioTitle:'選項按鈕屬性',value:'選取值',selected:'已選取'},form:{title:'表單屬性',menu:'表單屬性',action:'動作',method:'方法',encoding:'表單編碼'},select:{title:'清單/選單屬性',selectInfo:'資訊',opAvail:'可用選項',value:'值',size:'大小',lines:'行',chkMulti:'可多選',opText:'顯示文字',opValue:'選取值',btnAdd:'新增',btnModify:'修改',btnUp:'上移',btnDown:'下移',btnSetValue:'設為預設值',btnDelete:'刪除'},textarea:{title:'文字區域屬性',cols:'字元寬度',rows:'列數'},textfield:{title:'文字方塊屬性',name:'名稱',value:'值',charWidth:'字元寬度',maxChars:'最多字元數',type:'類型',typeText:'文字',typePass:'密碼'},hidden:{title:'隱藏欄位屬性',name:'名稱',value:'值'},image:{title:'影像屬性',titleButton:'影像按鈕屬性',menu:'影像屬性',infoTab:'影像資訊',btnUpload:'上傳至伺服器',upload:'上傳',alt:'替代文字',lockRatio:'等比例',resetSize:'重設為原大小',border:'邊框',hSpace:'水平距離',vSpace:'垂直距離',alertUrl:'請輸入影像 URL',linkTab:'超連結',button2Img:'要把影像按鈕改成影像嗎?',img2Button:'要把影像改成影像按鈕嗎?',urlMissing:'Image source URL is missing.',validateBorder:'Border must be a whole number.',validateHSpace:'HSpace must be a whole number.',validateVSpace:'VSpace must be a whole number.'},flash:{properties:'Flash 屬性',propertiesTab:'屬性',title:'Flash 屬性',chkPlay:'自動播放',chkLoop:'重複',chkMenu:'開啟選單',chkFull:'啟動全螢幕顯示',scale:'縮放',scaleAll:'全部顯示',scaleNoBorder:'無邊框',scaleFit:'精確符合',access:'允許腳本訪問',accessAlways:'永遠',accessSameDomain:'相同域名',accessNever:'永不',alignAbsBottom:'絕對下方',alignAbsMiddle:'絕對中間',alignBaseline:'基準線',alignTextTop:'文字上方',quality:'質素',qualityBest:'最好',qualityHigh:'高',qualityAutoHigh:'高(自動)',qualityMedium:'中(自動)',qualityAutoLow:'低(自動)',qualityLow:'低',windowModeWindow:'視窗',windowModeOpaque:'不透明',windowModeTransparent:'透明',windowMode:'視窗模式',flashvars:'Flash 變數',bgcolor:'背景顏色',hSpace:'水平距離',vSpace:'垂直距離',validateSrc:'請輸入欲連結的 URL',validateHSpace:'水平間距必須為數字格式',validateVSpace:'垂直間距必須為數字格式'},spellCheck:{toolbar:'拼字檢查',title:'拼字檢查',notAvailable:'抱歉,服務目前暫不可用',errorLoading:'無法聯系侍服器: %s.',notInDic:'不在字典中',changeTo:'更改為',btnIgnore:'忽略',btnIgnoreAll:'全部忽略',btnReplace:'取代',btnReplaceAll:'全部取代',btnUndo:'復原',noSuggestions:'- 無建議值 -',progress:'進行拼字檢查中…',noMispell:'拼字檢查完成:未發現拼字錯誤',noChanges:'拼字檢查完成:未更改任何單字',oneChange:'拼字檢查完成:更改了 1 個單字',manyChanges:'拼字檢查完成:更改了 %1 個單字',ieSpellDownload:'尚未安裝拼字檢查元件。您是否想要現在下載?'},smiley:{toolbar:'表情符號',title:'插入表情符號',options:'Smiley Options'},elementsPath:{eleLabel:'Elements path',eleTitle:'%1 元素'},numberedlist:'編號清單',bulletedlist:'項目清單',indent:'增加縮排',outdent:'減少縮排',justify:{left:'靠左對齊',center:'置中',right:'靠右對齊',block:'左右對齊'},blockquote:'引用文字',clipboard:{title:'貼上',cutError:'瀏覽器的安全性設定不允許編輯器自動執行剪下動作。請使用快捷鍵 (Ctrl/Cmd+X) 剪下。',copyError:'瀏覽器的安全性設定不允許編輯器自動執行複製動作。請使用快捷鍵 (Ctrl/Cmd+C) 複製。',pasteMsg:'請使用快捷鍵 (<strong>Ctrl/Cmd+V</strong>) 貼到下方區域中並按下 <strong>確定</strong>',securityMsg:'因為瀏覽器的安全性設定,本編輯器無法直接存取您的剪貼簿資料,請您自行在本視窗進行貼上動作。',pasteArea:'Paste Area'},pastefromword:{confirmCleanup:'您想貼上的文字似乎是自 Word 複製而來,請問您是否要先清除 Word 的格式後再行貼上?',toolbar:'自 Word 貼上',title:'自 Word 貼上',error:'It was not possible to clean up the pasted data due to an internal error'},pasteText:{button:'貼為純文字格式',title:'貼為純文字格式'},templates:{button:'樣版',title:'內容樣版',options:'Template Options',insertOption:'取代原有內容',selectPromptMsg:'請選擇欲開啟的樣版<br> (原有的內容將會被清除):',emptyListMsg:'(無樣版)'},showBlocks:'顯示區塊',stylesCombo:{label:'樣式',panelTitle:'Formatting Styles',panelTitle1:'塊級元素樣式',panelTitle2:'內聯元素樣式',panelTitle3:'物件元素樣式'},format:{label:'格式',panelTitle:'格式',tag_p:'一般',tag_pre:'已格式化',tag_address:'位址',tag_h1:'標題 1',tag_h2:'標題 2',tag_h3:'標題 3',tag_h4:'標題 4',tag_h5:'標題 5',tag_h6:'標題 6',tag_div:'一般 (DIV)'},div:{title:'Create Div Container',toolbar:'Create Div Container',cssClassInputLabel:'Stylesheet Classes',styleSelectLabel:'Style',IdInputLabel:'Id',languageCodeInputLabel:' Language Code',inlineStyleInputLabel:'Inline Style',advisoryTitleInputLabel:'Advisory Title',langDirLabel:'Language Direction',langDirLTRLabel:'Left to Right (LTR)',langDirRTLLabel:'Right to Left (RTL)',edit:'Edit Div',remove:'Remove Div'},iframe:{title:'IFrame Properties',toolbar:'IFrame',noUrl:'Please type the iframe URL',scrolling:'Enable scrollbars',border:'Show frame border'},font:{label:'字體',voiceLabel:'字體',panelTitle:'字體'},fontSize:{label:'大小',voiceLabel:'文字大小',panelTitle:'大小'},colorButton:{textColorTitle:'文字顏色',bgColorTitle:'背景顏色',panelTitle:'Colors',auto:'自動',more:'更多顏色…'},colors:{'000':'Black',800000:'Maroon','8B4513':'Saddle Brown','2F4F4F':'Dark Slate Gray','008080':'Teal','000080':'Navy','4B0082':'Indigo',696969:'Dark Gray',B22222:'Fire Brick',A52A2A:'Brown',DAA520:'Golden Rod','006400':'Dark Green','40E0D0':'Turquoise','0000CD':'Medium Blue',800080:'Purple',808080:'Gray',F00:'Red',FF8C00:'Dark Orange',FFD700:'Gold','008000':'Green','0FF':'Cyan','00F':'Blue',EE82EE:'Violet',A9A9A9:'Dim Gray',FFA07A:'Light Salmon',FFA500:'Orange',FFFF00:'Yellow','00FF00':'Lime',AFEEEE:'Pale Turquoise',ADD8E6:'Light Blue',DDA0DD:'Plum',D3D3D3:'Light Grey',FFF0F5:'Lavender Blush',FAEBD7:'Antique White',FFFFE0:'Light Yellow',F0FFF0:'Honeydew',F0FFFF:'Azure',F0F8FF:'Alice Blue',E6E6FA:'Lavender',FFF:'White'},scayt:{title:'即時拼寫檢查',opera_title:'Not supported by Opera',enable:'啟用即時拼寫檢查',disable:'關閉即時拼寫檢查',about:'關於即時拼寫檢查',toggle:'啟用/關閉即時拼寫檢查',options:'選項',langs:'語言',moreSuggestions:'更多拼寫建議',ignore:'忽略',ignoreAll:'全部忽略',addWord:'添加單詞',emptyDic:'字典名不應為空.',optionsTab:'選項',allCaps:'Ignore All-Caps Words',ignoreDomainNames:'Ignore Domain Names',mixedCase:'Ignore Words with Mixed Case',mixedWithDigits:'Ignore Words with Numbers',languagesTab:'語言',dictionariesTab:'字典',dic_field_name:'Dictionary name',dic_create:'Create',dic_restore:'Restore',dic_delete:'Delete',dic_rename:'Rename',dic_info:'Initially the User Dictionary is stored in a Cookie. However, Cookies are limited in size. When the User Dictionary grows to a point where it cannot be stored in a Cookie, then the dictionary may be stored on our server. To store your personal dictionary on our server you should specify a name for your dictionary. If you already have a stored dictionary, please type its name and click the Restore button.',aboutTab:'關於'},about:{title:'關於 CKEditor',dlgTitle:'關於 CKEditor',help:'Check $1 for help.',userGuide:"CKEditor User's Guide",moreInfo:'訪問我們的網站以獲取更多關於協議的信息',copy:'Copyright © $1. All rights reserved.'},maximize:'最大化',minimize:'最小化',fakeobjects:{anchor:'錨點',flash:'Flash 動畫',iframe:'IFrame',hiddenfield:'Hidden Field',unknown:'不明物件'},resize:'拖拽改變大小',colordialog:{title:'Select color',options:'Color Options',highlight:'Highlight',selected:'Selected Color',clear:'Clear'},toolbarCollapse:'折叠工具栏',toolbarExpand:'展开工具栏',toolbarGroups:{document:'Document',clipboard:'Clipboard/Undo',editing:'Editing',forms:'Forms',basicstyles:'Basic Styles',paragraph:'Paragraph',links:'Links',insert:'Insert',styles:'Styles',colors:'Colors',tools:'Tools'},bidi:{ltr:'Text direction from left to right',rtl:'Text direction from right to left'},docprops:{label:'文件屬性',title:'文件屬性',design:'Design',meta:'Meta 資料',chooseColor:'Choose',other:'<其他>',docTitle:'頁面標題',charset:'字元編碼',charsetOther:'其他字元編碼',charsetASCII:'ASCII',charsetCE:'中歐語系',charsetCT:'正體中文 (Big5)',charsetCR:'斯拉夫文',charsetGR:'希臘文',charsetJP:'日文',charsetKR:'韓文',charsetTR:'土耳其文',charsetUN:'Unicode (UTF-8)',charsetWE:'西歐語系',docType:'文件類型',docTypeOther:'其他文件類型',xhtmlDec:'包含 XHTML 定義',bgColor:'背景顏色',bgImage:'背景影像',bgFixed:'浮水印',txtColor:'文字顏色',margin:'頁面邊界',marginTop:'上',marginLeft:'左',marginRight:'右',marginBottom:'下',metaKeywords:'文件索引關鍵字 (用半形逗號[,]分隔)',metaDescription:'文件說明',metaAuthor:'作者',metaCopyright:'版權所有',previewHtml:'<p>This is some <strong>sample text</strong>. You are using <a href="javascript:void(0)">CKEditor</a>.</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/zh-cn.js b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/zh-cn.js
index e0f7bad..818d15c 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/lang/zh-cn.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/lang/zh-cn.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.lang['zh-cn']={dir:'ltr',editorTitle:'富文本编辑器,%1',editorHelp:'按 ALT+0 获得帮助',toolbars:'工具栏',editor:'所见即所得编辑器',source:'源码',newPage:'新建',save:'保存',preview:'预览',cut:'剪切',copy:'复制',paste:'粘贴',print:'打印',underline:'下划线',bold:'加粗',italic:'倾斜',selectAll:'全选',removeFormat:'清除格式',strike:'删除线',subscript:'下标',superscript:'上标',horizontalrule:'插入水平线',pagebreak:'插入分页符',pagebreakAlt:'分页符',unlink:'取消超链接',undo:'撤消',redo:'重做',common:{browseServer:'浏览服务器',url:'源文件',protocol:'协议',upload:'上传',uploadSubmit:'上传到服务器上',image:'图象',flash:'Flash',form:'表单',checkbox:'复选框',radio:'单选按钮',textField:'单行文本',textarea:'多行文本',hiddenField:'隐藏域',button:'按钮',select:'列表/菜单',imageButton:'图像域',notSet:'<没有设置>',id:'ID',name:'名称',langDir:'语言方向',langDirLtr:'从左到右 (LTR)',langDirRtl:'从右到左 (RTL)',langCode:'语言代码',longDescr:'详细说明地址',cssClass:'样式类名称',advisoryTitle:'标题',cssStyle:'行内样式',ok:'确定',cancel:'取消',close:'关闭',preview:'预览',generalTab:'常规',advancedTab:'高级',validateNumberFailed:'需要输入数字格式',confirmNewPage:'当前文档内容未保存,是否确认新建文档?',confirmCancel:'部分修改尚未保存,是否确认关闭对话框?',options:'选项',target:'目标窗口',targetNew:'新窗口 (_blank)',targetTop:'整页 (_top)',targetSelf:'本窗口 (_self)',targetParent:'父窗口 (_parent)',langDirLTR:'从左到右 (LTR)',langDirRTL:'从右到左 (RTL)',styles:'样式',cssClasses:'样式类',width:'宽度',height:'高度',align:'对齐方式',alignLeft:'左对齐',alignRight:'右对齐',alignCenter:'居中',alignTop:'顶端',alignMiddle:'居中',alignBottom:'底部',invalidHeight:'高度必须为数字格式',invalidWidth:'宽度必须为数字格式',invalidCssLength:'该字段必须为合式的CSS长度值,包括单位(px, %, in, cm, mm, em, ex, pt 或 pc)',invalidHtmlLength:'该字段必须为合式的HTML长度值,包括单位(px 或 %)',invalidInlineStyle:'内联样式必须为格式是以分号分隔的一个或多个“属性名 : 属性值”',cssLengthTooltip:'该字段必须为合式的CSS长度值,包括单位(px, %, in, cm, mm, em, ex, pt 或 pc)',unavailable:'%1<span class="cke_accessibility">, 不可用</span>'},contextmenu:{options:'快捷菜单选项'},specialChar:{toolbar:'插入特殊符号',title:'选择特殊符号',options:'特殊符号选项'},link:{toolbar:'插入/编辑超链接',other:'<其他>',menu:'编辑超链接',title:'超链接',info:'超链接信息',target:'目标',upload:'上传',advanced:'高级',type:'超链接类型',toUrl:'地址',toAnchor:'页内锚点链接',toEmail:'电子邮件',targetFrame:'<框架>',targetPopup:'<弹出窗口>',targetFrameName:'目标框架名称',targetPopupName:'弹出窗口名称',popupFeatures:'弹出窗口属性',popupResizable:'可缩放',popupStatusBar:'状态栏',popupLocationBar:'地址栏',popupToolbar:'工具栏',popupMenuBar:'菜单栏',popupFullScreen:'全屏 (IE)',popupScrollBars:'滚动条',popupDependent:'依附 (NS)',popupLeft:'左',popupTop:'右',id:'ID',langDir:'语言方向',langDirLTR:'从左到右 (LTR)',langDirRTL:'从右到左 (RTL)',acccessKey:'访问键',name:'名称',langCode:'语言代码',tabIndex:'Tab 键次序',advisoryTitle:'标题',advisoryContentType:'内容类型',cssClasses:'样式类名称',charset:'字符编码',styles:'行内样式',rel:'关联',selectAnchor:'选择一个锚点',anchorName:'按锚点名称',anchorId:'按锚点 ID',emailAddress:'地址',emailSubject:'主题',emailBody:'内容',noAnchors:'(此文档没有可用的锚点)',noUrl:'请输入超链接地址',noEmail:'请输入电子邮件地址'},anchor:{toolbar:'插入/编辑锚点链接',menu:'锚点链接属性',title:'锚点链接属性',name:'锚点名称',errorName:'请输入锚点名称',remove:'删除锚点'},list:{numberedTitle:'编号列表属性',bulletedTitle:'项目列表属性',type:'标记类型',start:'开始序号',validateStartNumber:'列表开始序号必须为整数格式',circle:'空心圆',disc:'实心圆',square:'实心方块',none:'无标记',notset:'<没有设置>',armenian:'传统的亚美尼亚编号方式',georgian:'传统的乔治亚编号方式(an, ban, gan, 等)',lowerRoman:'小写罗马数字(i, ii, iii, iv, v, 等)',upperRoman:'大写罗马数字(I, II, III, IV, V, 等)',lowerAlpha:'小写英文字母(a, b, c, d, e, 等)',upperAlpha:'大写英文字母(A, B, C, D, E, 等)',lowerGreek:'小写希腊字母(alpha, beta, gamma, 等)',decimal:'数字 (1, 2, 3, 等)',decimalLeadingZero:'0开头的数字标记(01, 02, 03, 等)'},findAndReplace:{title:'查找和替换',find:'查找',replace:'替换',findWhat:'查找:',replaceWith:'替换:',notFoundMsg:'指定文本没有找到',findOptions:'查找选项',matchCase:'区分大小写',matchWord:'全字匹配',matchCyclic:'循环匹配',replaceAll:'全部替换',replaceSuccessMsg:'共完成 %1 处替换.'},table:{toolbar:'表格',title:'表格属性',menu:'表格属性',deleteTable:'删除表格',rows:'行数',columns:'列数',border:'边框',widthPx:'像素',widthPc:'百分比',widthUnit:'宽度单位',cellSpace:'间距',cellPad:'边距',caption:'标题',summary:'摘要',headers:'标题单元格',headersNone:'无',headersColumn:'第一列',headersRow:'第一行',headersBoth:'第一列和第一行',invalidRows:'指定的列数必须大于零',invalidCols:'指定的行数必须大于零',invalidBorder:'边框粗细必须为数字格式',invalidWidth:'表格宽度必须为数字格式',invalidHeight:'表格高度必须为数字格式',invalidCellSpacing:'单元格间距必须为数字格式',invalidCellPadding:'单元格填充必须为数字格式',cell:{menu:'单元格',insertBefore:'在左侧插入单元格',insertAfter:'在右侧插入单元格',deleteCell:'删除单元格',merge:'合并单元格',mergeRight:'向右合并单元格',mergeDown:'向下合并单元格',splitHorizontal:'水平拆分单元格',splitVertical:'垂直拆分单元格',title:'单元格属性',cellType:'单元格类型',rowSpan:'纵跨行数',colSpan:'横跨列数',wordWrap:'自动换行',hAlign:'水平对齐',vAlign:'垂直对齐',alignBaseline:'基线',bgColor:'背景颜色',borderColor:'边框颜色',data:'数据',header:'表头',yes:'是',no:'否',invalidWidth:'单元格宽度必须为数字格式',invalidHeight:'单元格高度必须为数字格式',invalidRowSpan:'行跨度必须为整数格式',invalidColSpan:'列跨度必须为整数格式',chooseColor:'选择'},row:{menu:'行',insertBefore:'在上方插入行',insertAfter:'在下方插入行',deleteRow:'删除行'},column:{menu:'列',insertBefore:'在左侧插入列',insertAfter:'在右侧插入列',deleteColumn:'删除列'}},button:{title:'按钮属性',text:'标签(值)',type:'类型',typeBtn:'按钮',typeSbm:'提交',typeRst:'重设'},checkboxAndRadio:{checkboxTitle:'复选框属性',radioTitle:'单选按钮属性',value:'选定值',selected:'已勾选'},form:{title:'表单属性',menu:'表单属性',action:'动作',method:'方法',encoding:'表单编码'},select:{title:'菜单/列表属性',selectInfo:'选择信息',opAvail:'可选项',value:'值',size:'高度',lines:'行',chkMulti:'允许多选',opText:'选项文本',opValue:'选项值',btnAdd:'添加',btnModify:'修改',btnUp:'上移',btnDown:'下移',btnSetValue:'设为初始选定',btnDelete:'删除'},textarea:{title:'多行文本属性',cols:'字符宽度',rows:'行数'},textfield:{title:'单行文本属性',name:'名称',value:'初始值',charWidth:'字符宽度',maxChars:'最多字符数',type:'类型',typeText:'文本',typePass:'密码'},hidden:{title:'隐藏域属性',name:'名称',value:'初始值'},image:{title:'图象属性',titleButton:'图像域属性',menu:'图象属性',infoTab:'图象',btnUpload:'上传到服务器上',upload:'上传',alt:'替换文本',lockRatio:'锁定比例',resetSize:'原始尺寸',border:'边框大小',hSpace:'水平间距',vSpace:'垂直间距',alertUrl:'请输入图象地址',linkTab:'链接',button2Img:'确定要把当前按钮改变为图像吗?',img2Button:'确定要把当前图像改变为按钮吗?',urlMissing:'缺少图像源文件地址',validateBorder:'边框大小必须为整数格式',validateHSpace:'水平间距必须为整数格式',validateVSpace:'垂直间距必须为整数格式'},flash:{properties:'Flash 属性',propertiesTab:'属性',title:'标题',chkPlay:'自动播放',chkLoop:'循环',chkMenu:'启用 Flash 菜单',chkFull:'启用全屏',scale:'缩放',scaleAll:'全部显示',scaleNoBorder:'无边框',scaleFit:'严格匹配',access:'允许脚本访问',accessAlways:'总是',accessSameDomain:'同域',accessNever:'从不',alignAbsBottom:'绝对底部',alignAbsMiddle:'绝对居中',alignBaseline:'基线',alignTextTop:'文本上方',quality:'质量',qualityBest:'最好',qualityHigh:'高',qualityAutoHigh:'高(自动)',qualityMedium:'中(自动)',qualityAutoLow:'低(自动)',qualityLow:'低',windowModeWindow:'窗体',windowModeOpaque:'不透明',windowModeTransparent:'透明',windowMode:'窗体模式',flashvars:'Flash 变量',bgcolor:'背景颜色',hSpace:'水平间距',vSpace:'垂直间距',validateSrc:'请输入源文件地址',validateHSpace:'水平间距必须为数字格式',validateVSpace:'垂直间距必须为数字格式'},spellCheck:{toolbar:'拼写检查',title:'拼写检查',notAvailable:'抱歉, 服务目前暂不可用',errorLoading:'加载应该服务主机时出错: %s.',notInDic:'没有在字典里',changeTo:'更改为',btnIgnore:'忽略',btnIgnoreAll:'全部忽略',btnReplace:'替换',btnReplaceAll:'全部替换',btnUndo:'撤消',noSuggestions:'- 没有建议 -',progress:'正在进行拼写检查...',noMispell:'拼写检查完成: 没有发现拼写错误',noChanges:'拼写检查完成: 没有更改任何单词',oneChange:'拼写检查完成: 更改了一个单词',manyChanges:'拼写检查完成: 更改了 %1 个单词',ieSpellDownload:'拼写检查插件还没安装, 你是否想现在就下载?'},smiley:{toolbar:'表情符',title:'插入表情图标',options:'表情图标选项'},elementsPath:{eleLabel:'元素路径',eleTitle:'%1 元素'},numberedlist:'编号列表',bulletedlist:'项目列表',indent:'增加缩进量',outdent:'减少缩进量',justify:{left:'左对齐',center:'居中',right:'右对齐',block:'两端对齐'},blockquote:'块引用',clipboard:{title:'粘贴',cutError:'您的浏览器安全设置不允许编辑器自动执行剪切操作, 请使用键盘快捷键(Ctrl/Cmd+X)来完成',copyError:'您的浏览器安全设置不允许编辑器自动执行复制操作, 请使用键盘快捷键(Ctrl/Cmd+C)来完成',pasteMsg:'请使用键盘快捷键(<STRONG>Ctrl/Cmd+V</STRONG>)把内容粘贴到下面的方框里,再按 <STRONG>确定</STRONG>',securityMsg:'因为你的浏览器的安全设置原因, 本编辑器不能直接访问你的剪贴板内容, 你需要在本窗口重新粘贴一次',pasteArea:'粘贴区域'},pastefromword:{confirmCleanup:'您要粘贴的内容好像是来自 MS Word, 是否要清除 MS Word 格式后再粘贴?',toolbar:'从 MS Word 粘贴',title:'从 MS Word 粘贴',error:'由于内部错误无法清理要粘贴的数据'},pasteText:{button:'粘贴为无格式文本',title:'粘贴为无格式文本'},templates:{button:'模板',title:'内容模板',options:'模板选项',insertOption:'替换当前内容',selectPromptMsg:'请选择编辑器内容模板:',emptyListMsg:'(没有模板)'},showBlocks:'显示区块',stylesCombo:{label:'样式',panelTitle:'样式',panelTitle1:'块级元素样式',panelTitle2:'内联元素样式',panelTitle3:'对象元素样式'},format:{label:'格式',panelTitle:'格式',tag_p:'普通',tag_pre:'已编排格式',tag_address:'地址',tag_h1:'标题 1',tag_h2:'标题 2',tag_h3:'标题 3',tag_h4:'标题 4',tag_h5:'标题 5',tag_h6:'标题 6',tag_div:'段落(DIV)'},div:{title:'创建 DIV 容器',toolbar:'创建 DIV 容器',cssClassInputLabel:'样式类名称',styleSelectLabel:'样式',IdInputLabel:'ID',languageCodeInputLabel:'语言代码',inlineStyleInputLabel:'行内样式',advisoryTitleInputLabel:'标题',langDirLabel:'语言方向',langDirLTRLabel:'从左到右 (LTR)',langDirRTLLabel:'从右到左 (RTL)',edit:'编辑 DIV',remove:'移除 DIV'},iframe:{title:'IFrame 属性',toolbar:'IFrame',noUrl:'请输入框架的 URL',scrolling:'允许滚动条',border:'显示框架边框'},font:{label:'字体',voiceLabel:'字体',panelTitle:'字体'},fontSize:{label:'大小',voiceLabel:'文字大小',panelTitle:'大小'},colorButton:{textColorTitle:'文本颜色',bgColorTitle:'背景颜色',panelTitle:'颜色',auto:'自动',more:'其它颜色...'},colors:{'000':'黑',800000:'褐红','8B4513':'深褐','2F4F4F':'墨绿','008080':'绿松石','000080':'海军蓝','4B0082':'靛蓝',696969:'暗灰',B22222:'砖红',A52A2A:'褐',DAA520:'金黄','006400':'深绿','40E0D0':'蓝绿','0000CD':'中蓝',800080:'紫',808080:'灰',F00:'红',FF8C00:'深橙',FFD700:'金','008000':'绿','0FF':'青','00F':'蓝',EE82EE:'紫罗兰',A9A9A9:'深灰',FFA07A:'亮橙',FFA500:'橙',FFFF00:'黄','00FF00':'水绿',AFEEEE:'粉蓝',ADD8E6:'亮蓝',DDA0DD:'梅红',D3D3D3:'淡灰',FFF0F5:'淡紫红',FAEBD7:'古董白',FFFFE0:'淡黄',F0FFF0:'蜜白',F0FFFF:'天蓝',F0F8FF:'淡蓝',E6E6FA:'淡紫',FFF:'白'},scayt:{title:'即时拼写检查',opera_title:'不支持 Opera 浏览器',enable:'启用即时拼写检查',disable:'禁用即时拼写检查',about:'关于即时拼写检查',toggle:'暂停/启用即时拼写检查',options:'选项',langs:'语言',moreSuggestions:'更多拼写建议',ignore:'忽略',ignoreAll:'全部忽略',addWord:'添加单词',emptyDic:'字典名不应为空.',optionsTab:'选项',allCaps:'忽略所有大写单词',ignoreDomainNames:'忽略域名',mixedCase:'忽略大小写混合的单词',mixedWithDigits:'忽略带数字的单词',languagesTab:'语言',dictionariesTab:'字典',dic_field_name:'字典名称',dic_create:'创建',dic_restore:'还原',dic_delete:'删除',dic_rename:'重命名',dic_info:'一开始用户词典储存在 Cookie 中, 但是 Cookies 的容量是有限的, 当用户词典增长到超出 Cookie 限制时就无法再储存了, 这时您可以将词典储存到我们的服务器上. 要把您的个人词典到储存到我们的服务器上的话, 需要为您的词典指定一个名称, 如果您在我们的服务器上已经有储存有一个词典, 请输入词典名称并按还原按钮.',aboutTab:'关于'},about:{title:'关于CKEditor',dlgTitle:'关于CKEditor',help:'请访问 $1 以获取帮助.',userGuide:'CKEditor 用户向导',moreInfo:'访问我们的网站以获取更多关于协议的信息',copy:'Copyright © $1. 版权所有。'},maximize:'全屏',minimize:'最小化',fakeobjects:{anchor:'锚点',flash:'Flash 动画',iframe:'IFrame',hiddenfield:'隐藏域',unknown:'未知对象'},resize:'拖拽以改变尺寸',colordialog:{title:'选择颜色',options:'颜色选项',highlight:'高亮',selected:'选择颜色',clear:'清除'},toolbarCollapse:'折叠工具栏',toolbarExpand:'展开工具栏',toolbarGroups:{document:'文档',clipboard:'剪贴板/撤销',editing:'编辑',forms:'表单',basicstyles:'基本格式',paragraph:'段落',links:'链接',insert:'插入',styles:'样式',colors:'颜色',tools:'工具'},bidi:{ltr:'文字方向为从左至右',rtl:'文字方向为从右至左'},docprops:{label:'页面属性',title:'页面属性',design:'设计',meta:'Meta 数据',chooseColor:'选择',other:'<其他>',docTitle:'页面标题',charset:'字符编码',charsetOther:'其它字符编码',charsetASCII:'ASCII',charsetCE:'中欧',charsetCT:'繁体中文 (Big5)',charsetCR:'西里尔文',charsetGR:'希腊文',charsetJP:'日文',charsetKR:'韩文',charsetTR:'土耳其文',charsetUN:'Unicode (UTF-8)',charsetWE:'西欧',docType:'文档类型',docTypeOther:'其它文档类型',xhtmlDec:'包含 XHTML 声明',bgColor:'背景颜色',bgImage:'背景图像',bgFixed:'不滚动背景图像',txtColor:'文本颜色',margin:'页面边距',marginTop:'上',marginLeft:'左',marginRight:'右',marginBottom:'下',metaKeywords:'页面索引关键字 (用半角逗号[,]分隔)',metaDescription:'页面说明',metaAuthor:'作者',metaCopyright:'版权',previewHtml:'<p>这是一些<strong>演示用文字</strong>。你当前正在使用<a href="javascript:void(0)">CKEditor</a>。</p>'}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.lang['zh-cn']={dir:'ltr',editorTitle:'富文本编辑器,%1',editorHelp:'按 ALT+0 获得帮助',toolbars:'工具栏',editor:'所见即所得编辑器',source:'源码',newPage:'新建',save:'保存',preview:'预览',cut:'剪切',copy:'复制',paste:'粘贴',print:'打印',underline:'下划线',bold:'加粗',italic:'倾斜',selectAll:'全选',removeFormat:'清除格式',strike:'删除线',subscript:'下标',superscript:'上标',horizontalrule:'插入水平线',pagebreak:'插入分页符',pagebreakAlt:'分页符',unlink:'取消超链接',undo:'撤消',redo:'重做',common:{browseServer:'浏览服务器',url:'源文件',protocol:'协议',upload:'上传',uploadSubmit:'上传到服务器上',image:'图象',flash:'Flash',form:'表单',checkbox:'复选框',radio:'单选按钮',textField:'单行文本',textarea:'多行文本',hiddenField:'隐藏域',button:'按钮',select:'列表/菜单',imageButton:'图像域',notSet:'<没有设置>',id:'ID',name:'名称',langDir:'语言方向',langDirLtr:'从左到右 (LTR)',langDirRtl:'从右到左 (RTL)',langCode:'语言代码',longDescr:'详细说明地址',cssClass:'样式类名称',advisoryTitle:'标题',cssStyle:'行内样式',ok:'确定',cancel:'取消',close:'关闭',preview:'预览',generalTab:'常规',advancedTab:'高级',validateNumberFailed:'需要输入数字格式',confirmNewPage:'当前文档内容未保存,是否确认新建文档?',confirmCancel:'部分修改尚未保存,是否确认关闭对话框?',options:'选项',target:'目标窗口',targetNew:'新窗口 (_blank)',targetTop:'整页 (_top)',targetSelf:'本窗口 (_self)',targetParent:'父窗口 (_parent)',langDirLTR:'从左到右 (LTR)',langDirRTL:'从右到左 (RTL)',styles:'样式',cssClasses:'样式类',width:'宽度',height:'高度',align:'对齐方式',alignLeft:'左对齐',alignRight:'右对齐',alignCenter:'居中',alignTop:'顶端',alignMiddle:'居中',alignBottom:'底部',invalidHeight:'高度必须为数字格式',invalidWidth:'宽度必须为数字格式',invalidCssLength:'该字段必须为合式的CSS长度值,包括单位(px, %, in, cm, mm, em, ex, pt 或 pc)',invalidHtmlLength:'该字段必须为合式的HTML长度值,包括单位(px 或 %)',invalidInlineStyle:'内联样式必须为格式是以分号分隔的一个或多个“属性名 : 属性值”',cssLengthTooltip:'该字段必须为合式的CSS长度值,包括单位(px, %, in, cm, mm, em, ex, pt 或 pc)',unavailable:'%1<span class="cke_accessibility">, 不可用</span>'},contextmenu:{options:'快捷菜单选项'},specialChar:{toolbar:'插入特殊符号',title:'选择特殊符号',options:'特殊符号选项'},link:{toolbar:'插入/编辑超链接',other:'<其他>',menu:'编辑超链接',title:'超链接',info:'超链接信息',target:'目标',upload:'上传',advanced:'高级',type:'超链接类型',toUrl:'地址',toAnchor:'页内锚点链接',toEmail:'电子邮件',targetFrame:'<框架>',targetPopup:'<弹出窗口>',targetFrameName:'目标框架名称',targetPopupName:'弹出窗口名称',popupFeatures:'弹出窗口属性',popupResizable:'可缩放',popupStatusBar:'状态栏',popupLocationBar:'地址栏',popupToolbar:'工具栏',popupMenuBar:'菜单栏',popupFullScreen:'全屏 (IE)',popupScrollBars:'滚动条',popupDependent:'依附 (NS)',popupLeft:'左',popupTop:'右',id:'ID',langDir:'语言方向',langDirLTR:'从左到右 (LTR)',langDirRTL:'从右到左 (RTL)',acccessKey:'访问键',name:'名称',langCode:'语言代码',tabIndex:'Tab 键次序',advisoryTitle:'标题',advisoryContentType:'内容类型',cssClasses:'样式类名称',charset:'字符编码',styles:'行内样式',rel:'关联',selectAnchor:'选择一个锚点',anchorName:'按锚点名称',anchorId:'按锚点 ID',emailAddress:'地址',emailSubject:'主题',emailBody:'内容',noAnchors:'(此文档没有可用的锚点)',noUrl:'请输入超链接地址',noEmail:'请输入电子邮件地址'},anchor:{toolbar:'插入/编辑锚点链接',menu:'锚点链接属性',title:'锚点链接属性',name:'锚点名称',errorName:'请输入锚点名称',remove:'删除锚点'},list:{numberedTitle:'编号列表属性',bulletedTitle:'项目列表属性',type:'标记类型',start:'开始序号',validateStartNumber:'列表开始序号必须为整数格式',circle:'空心圆',disc:'实心圆',square:'实心方块',none:'无标记',notset:'<没有设置>',armenian:'传统的亚美尼亚编号方式',georgian:'传统的乔治亚编号方式(an, ban, gan, 等)',lowerRoman:'小写罗马数字(i, ii, iii, iv, v, 等)',upperRoman:'大写罗马数字(I, II, III, IV, V, 等)',lowerAlpha:'小写英文字母(a, b, c, d, e, 等)',upperAlpha:'大写英文字母(A, B, C, D, E, 等)',lowerGreek:'小写希腊字母(alpha, beta, gamma, 等)',decimal:'数字 (1, 2, 3, 等)',decimalLeadingZero:'0开头的数字标记(01, 02, 03, 等)'},findAndReplace:{title:'查找和替换',find:'查找',replace:'替换',findWhat:'查找:',replaceWith:'替换:',notFoundMsg:'指定文本没有找到',findOptions:'查找选项',matchCase:'区分大小写',matchWord:'全字匹配',matchCyclic:'循环匹配',replaceAll:'全部替换',replaceSuccessMsg:'共完成 %1 处替换.'},table:{toolbar:'表格',title:'表格属性',menu:'表格属性',deleteTable:'删除表格',rows:'行数',columns:'列数',border:'边框',widthPx:'像素',widthPc:'百分比',widthUnit:'宽度单位',cellSpace:'间距',cellPad:'边距',caption:'标题',summary:'摘要',headers:'标题单元格',headersNone:'无',headersColumn:'第一列',headersRow:'第一行',headersBoth:'第一列和第一行',invalidRows:'指定的列数必须大于零',invalidCols:'指定的行数必须大于零',invalidBorder:'边框粗细必须为数字格式',invalidWidth:'表格宽度必须为数字格式',invalidHeight:'表格高度必须为数字格式',invalidCellSpacing:'单元格间距必须为数字格式',invalidCellPadding:'单元格填充必须为数字格式',cell:{menu:'单元格',insertBefore:'在左侧插入单元格',insertAfter:'在右侧插入单元格',deleteCell:'删除单元格',merge:'合并单元格',mergeRight:'向右合并单元格',mergeDown:'向下合并单元格',splitHorizontal:'水平拆分单元格',splitVertical:'垂直拆分单元格',title:'单元格属性',cellType:'单元格类型',rowSpan:'纵跨行数',colSpan:'横跨列数',wordWrap:'自动换行',hAlign:'水平对齐',vAlign:'垂直对齐',alignBaseline:'基线',bgColor:'背景颜色',borderColor:'边框颜色',data:'数据',header:'表头',yes:'是',no:'否',invalidWidth:'单元格宽度必须为数字格式',invalidHeight:'单元格高度必须为数字格式',invalidRowSpan:'行跨度必须为整数格式',invalidColSpan:'列跨度必须为整数格式',chooseColor:'选择'},row:{menu:'行',insertBefore:'在上方插入行',insertAfter:'在下方插入行',deleteRow:'删除行'},column:{menu:'列',insertBefore:'在左侧插入列',insertAfter:'在右侧插入列',deleteColumn:'删除列'}},button:{title:'按钮属性',text:'标签(值)',type:'类型',typeBtn:'按钮',typeSbm:'提交',typeRst:'重设'},checkboxAndRadio:{checkboxTitle:'复选框属性',radioTitle:'单选按钮属性',value:'选定值',selected:'已勾选'},form:{title:'表单属性',menu:'表单属性',action:'动作',method:'方法',encoding:'表单编码'},select:{title:'菜单/列表属性',selectInfo:'选择信息',opAvail:'可选项',value:'值',size:'高度',lines:'行',chkMulti:'允许多选',opText:'选项文本',opValue:'选项值',btnAdd:'添加',btnModify:'修改',btnUp:'上移',btnDown:'下移',btnSetValue:'设为初始选定',btnDelete:'删除'},textarea:{title:'多行文本属性',cols:'字符宽度',rows:'行数'},textfield:{title:'单行文本属性',name:'名称',value:'初始值',charWidth:'字符宽度',maxChars:'最多字符数',type:'类型',typeText:'文本',typePass:'密码'},hidden:{title:'隐藏域属性',name:'名称',value:'初始值'},image:{title:'图象属性',titleButton:'图像域属性',menu:'图象属性',infoTab:'图象',btnUpload:'上传到服务器上',upload:'上传',alt:'替换文本',lockRatio:'锁定比例',resetSize:'原始尺寸',border:'边框大小',hSpace:'水平间距',vSpace:'垂直间距',alertUrl:'请输入图象地址',linkTab:'链接',button2Img:'确定要把当前按钮改变为图像吗?',img2Button:'确定要把当前图像改变为按钮吗?',urlMissing:'缺少图像源文件地址',validateBorder:'边框大小必须为整数格式',validateHSpace:'水平间距必须为整数格式',validateVSpace:'垂直间距必须为整数格式'},flash:{properties:'Flash 属性',propertiesTab:'属性',title:'标题',chkPlay:'自动播放',chkLoop:'循环',chkMenu:'启用 Flash 菜单',chkFull:'启用全屏',scale:'缩放',scaleAll:'全部显示',scaleNoBorder:'无边框',scaleFit:'严格匹配',access:'允许脚本访问',accessAlways:'总是',accessSameDomain:'同域',accessNever:'从不',alignAbsBottom:'绝对底部',alignAbsMiddle:'绝对居中',alignBaseline:'基线',alignTextTop:'文本上方',quality:'质量',qualityBest:'最好',qualityHigh:'高',qualityAutoHigh:'高(自动)',qualityMedium:'中(自动)',qualityAutoLow:'低(自动)',qualityLow:'低',windowModeWindow:'窗体',windowModeOpaque:'不透明',windowModeTransparent:'透明',windowMode:'窗体模式',flashvars:'Flash 变量',bgcolor:'背景颜色',hSpace:'水平间距',vSpace:'垂直间距',validateSrc:'请输入源文件地址',validateHSpace:'水平间距必须为数字格式',validateVSpace:'垂直间距必须为数字格式'},spellCheck:{toolbar:'拼写检查',title:'拼写检查',notAvailable:'抱歉, 服务目前暂不可用',errorLoading:'加载应该服务主机时出错: %s.',notInDic:'没有在字典里',changeTo:'更改为',btnIgnore:'忽略',btnIgnoreAll:'全部忽略',btnReplace:'替换',btnReplaceAll:'全部替换',btnUndo:'撤消',noSuggestions:'- 没有建议 -',progress:'正在进行拼写检查...',noMispell:'拼写检查完成: 没有发现拼写错误',noChanges:'拼写检查完成: 没有更改任何单词',oneChange:'拼写检查完成: 更改了一个单词',manyChanges:'拼写检查完成: 更改了 %1 个单词',ieSpellDownload:'拼写检查插件还没安装, 你是否想现在就下载?'},smiley:{toolbar:'表情符',title:'插入表情图标',options:'表情图标选项'},elementsPath:{eleLabel:'元素路径',eleTitle:'%1 元素'},numberedlist:'编号列表',bulletedlist:'项目列表',indent:'增加缩进量',outdent:'减少缩进量',justify:{left:'左对齐',center:'居中',right:'右对齐',block:'两端对齐'},blockquote:'块引用',clipboard:{title:'粘贴',cutError:'您的浏览器安全设置不允许编辑器自动执行剪切操作, 请使用键盘快捷键(Ctrl/Cmd+X)来完成',copyError:'您的浏览器安全设置不允许编辑器自动执行复制操作, 请使用键盘快捷键(Ctrl/Cmd+C)来完成',pasteMsg:'请使用键盘快捷键(<STRONG>Ctrl/Cmd+V</STRONG>)把内容粘贴到下面的方框里,再按 <STRONG>确定</STRONG>',securityMsg:'因为你的浏览器的安全设置原因, 本编辑器不能直接访问你的剪贴板内容, 你需要在本窗口重新粘贴一次',pasteArea:'粘贴区域'},pastefromword:{confirmCleanup:'您要粘贴的内容好像是来自 MS Word, 是否要清除 MS Word 格式后再粘贴?',toolbar:'从 MS Word 粘贴',title:'从 MS Word 粘贴',error:'由于内部错误无法清理要粘贴的数据'},pasteText:{button:'粘贴为无格式文本',title:'粘贴为无格式文本'},templates:{button:'模板',title:'内容模板',options:'模板选项',insertOption:'替换当前内容',selectPromptMsg:'请选择编辑器内容模板:',emptyListMsg:'(没有模板)'},showBlocks:'显示区块',stylesCombo:{label:'样式',panelTitle:'样式',panelTitle1:'块级元素样式',panelTitle2:'内联元素样式',panelTitle3:'对象元素样式'},format:{label:'格式',panelTitle:'格式',tag_p:'普通',tag_pre:'已编排格式',tag_address:'地址',tag_h1:'标题 1',tag_h2:'标题 2',tag_h3:'标题 3',tag_h4:'标题 4',tag_h5:'标题 5',tag_h6:'标题 6',tag_div:'段落(DIV)'},div:{title:'创建 DIV 容器',toolbar:'创建 DIV 容器',cssClassInputLabel:'样式类名称',styleSelectLabel:'样式',IdInputLabel:'ID',languageCodeInputLabel:'语言代码',inlineStyleInputLabel:'行内样式',advisoryTitleInputLabel:'标题',langDirLabel:'语言方向',langDirLTRLabel:'从左到右 (LTR)',langDirRTLLabel:'从右到左 (RTL)',edit:'编辑 DIV',remove:'移除 DIV'},iframe:{title:'IFrame 属性',toolbar:'IFrame',noUrl:'请输入框架的 URL',scrolling:'允许滚动条',border:'显示框架边框'},font:{label:'字体',voiceLabel:'字体',panelTitle:'字体'},fontSize:{label:'大小',voiceLabel:'文字大小',panelTitle:'大小'},colorButton:{textColorTitle:'文本颜色',bgColorTitle:'背景颜色',panelTitle:'颜色',auto:'自动',more:'其它颜色...'},colors:{'000':'黑',800000:'褐红','8B4513':'深褐','2F4F4F':'墨绿','008080':'绿松石','000080':'海军蓝','4B0082':'靛蓝',696969:'暗灰',B22222:'砖红',A52A2A:'褐',DAA520:'金黄','006400':'深绿','40E0D0':'蓝绿','0000CD':'中蓝',800080:'紫',808080:'灰',F00:'红',FF8C00:'深橙',FFD700:'金','008000':'绿','0FF':'青','00F':'蓝',EE82EE:'紫罗兰',A9A9A9:'深灰',FFA07A:'亮橙',FFA500:'橙',FFFF00:'黄','00FF00':'水绿',AFEEEE:'粉蓝',ADD8E6:'亮蓝',DDA0DD:'梅红',D3D3D3:'淡灰',FFF0F5:'淡紫红',FAEBD7:'古董白',FFFFE0:'淡黄',F0FFF0:'蜜白',F0FFFF:'天蓝',F0F8FF:'淡蓝',E6E6FA:'淡紫',FFF:'白'},scayt:{title:'即时拼写检查',opera_title:'不支持 Opera 浏览器',enable:'启用即时拼写检查',disable:'禁用即时拼写检查',about:'关于即时拼写检查',toggle:'暂停/启用即时拼写检查',options:'选项',langs:'语言',moreSuggestions:'更多拼写建议',ignore:'忽略',ignoreAll:'全部忽略',addWord:'添加单词',emptyDic:'字典名不应为空.',optionsTab:'选项',allCaps:'忽略所有大写单词',ignoreDomainNames:'忽略域名',mixedCase:'忽略大小写混合的单词',mixedWithDigits:'忽略带数字的单词',languagesTab:'语言',dictionariesTab:'字典',dic_field_name:'字典名称',dic_create:'创建',dic_restore:'还原',dic_delete:'删除',dic_rename:'重命名',dic_info:'一开始用户词典储存在 Cookie 中, 但是 Cookies 的容量是有限的, 当用户词典增长到超出 Cookie 限制时就无法再储存了, 这时您可以将词典储存到我们的服务器上. 要把您的个人词典到储存到我们的服务器上的话, 需要为您的词典指定一个名称, 如果您在我们的服务器上已经有储存有一个词典, 请输入词典名称并按还原按钮.',aboutTab:'关于'},about:{title:'关于CKEditor',dlgTitle:'关于CKEditor',help:'请访问 $1 以获取帮助.',userGuide:'CKEditor 用户向导',moreInfo:'访问我们的网站以获取更多关于协议的信息',copy:'Copyright © $1. 版权所有。'},maximize:'全屏',minimize:'最小化',fakeobjects:{anchor:'锚点',flash:'Flash 动画',iframe:'IFrame',hiddenfield:'隐藏域',unknown:'未知对象'},resize:'拖拽以改变尺寸',colordialog:{title:'选择颜色',options:'颜色选项',highlight:'高亮',selected:'选择颜色',clear:'清除'},toolbarCollapse:'折叠工具栏',toolbarExpand:'展开工具栏',toolbarGroups:{document:'文档',clipboard:'剪贴板/撤销',editing:'编辑',forms:'表单',basicstyles:'基本格式',paragraph:'段落',links:'链接',insert:'插入',styles:'样式',colors:'颜色',tools:'工具'},bidi:{ltr:'文字方向为从左至右',rtl:'文字方向为从右至左'},docprops:{label:'页面属性',title:'页面属性',design:'设计',meta:'Meta 数据',chooseColor:'选择',other:'<其他>',docTitle:'页面标题',charset:'字符编码',charsetOther:'其它字符编码',charsetASCII:'ASCII',charsetCE:'中欧',charsetCT:'繁体中文 (Big5)',charsetCR:'西里尔文',charsetGR:'希腊文',charsetJP:'日文',charsetKR:'韩文',charsetTR:'土耳其文',charsetUN:'Unicode (UTF-8)',charsetWE:'西欧',docType:'文档类型',docTypeOther:'其它文档类型',xhtmlDec:'包含 XHTML 声明',bgColor:'背景颜色',bgImage:'背景图像',bgFixed:'不滚动背景图像',txtColor:'文本颜色',margin:'页面边距',marginTop:'上',marginLeft:'左',marginRight:'右',marginBottom:'下',metaKeywords:'页面索引关键字 (用半角逗号[,]分隔)',metaDescription:'页面说明',metaAuthor:'作者',metaCopyright:'版权',previewHtml:'<p>这是一些<strong>演示用文字</strong>。你当前正在使用<a href="javascript:void(0)">CKEditor</a>。</p>'}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js
index e4bd208..f61cde0 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js
@@ -1,7 +1,7 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.dialog.add('a11yHelp',function(a){var b=a.lang.accessibilityHelp,c=CKEDITOR.tools.getNextId(),d={8:'BACKSPACE',9:'TAB',13:'ENTER',16:'SHIFT',17:'CTRL',18:'ALT',19:'PAUSE',20:'CAPSLOCK',27:'ESCAPE',33:'PAGE UP',34:'PAGE DOWN',35:'END',36:'HOME',37:'LEFT ARROW',38:'UP ARROW',39:'RIGHT ARROW',40:'DOWN ARROW',45:'INSERT',46:'DELETE',91:'LEFT WINDOW KEY',92:'RIGHT WINDOW KEY',93:'SELECT KEY',96:'NUMPAD 0',97:'NUMPAD 1',98:'NUMPAD 2',99:'NUMPAD 3',100:'NUMPAD 4',101:'NUMPAD 5',102:'NUMPAD 6',103:'NUMPAD 7',104:'NUMPAD 8',105:'NUMPAD 9',106:'MULTIPLY',107:'ADD',109:'SUBTRACT',110:'DECIMAL POINT',111:'DIVIDE',112:'F1',113:'F2',114:'F3',115:'F4',116:'F5',117:'F6',118:'F7',119:'F8',120:'F9',121:'F10',122:'F11',123:'F12',144:'NUM LOCK',145:'SCROLL LOCK',186:'SEMI-COLON',187:'EQUAL SIGN',188:'COMMA',189:'DASH',190:'PERIOD',191:'FORWARD SLASH',192:'GRAVE ACCENT',219:'OPEN BRACKET',220:'BACK SLASH',221:'CLOSE BRAKET',222:'SINGLE QUOTE'};d[CKEDITOR.ALT]='ALT';d[CKEDITOR.SHIFT]='SHIFT';d[CKEDITOR.CTRL]='CTRL';var e=[CKEDITOR.ALT,CKEDITOR.SHIFT,CKEDITOR.CTRL];function f(j){var k,l,m=[];for(var n=0;n<e.length;n++){l=e[n];k=j/e[n];if(k>1&&k<=2){j-=l;m.push(d[l]);}}m.push(d[j]||String.fromCharCode(j));return m.join('+');};var g=/\$\{(.*?)\}/g;function h(j,k){var l=a.config.keystrokes,m,n=l.length;for(var o=0;o<n;o++){m=l[o];if(m[1]==k)break;}return f(m[0]);};function i(){var j='<div class="cke_accessibility_legend" role="document" aria-labelledby="'+c+'_arialbl" tabIndex="-1">%1</div>'+'<span id="'+c+'_arialbl" class="cke_voice_label">'+b.contents+' </span>',k='<h1>%1</h1><dl>%2</dl>',l='<dt>%1</dt><dd>%2</dd>',m=[],n=b.legend,o=n.length;for(var p=0;p<o;p++){var q=n[p],r=[],s=q.items,t=s.length;for(var u=0;u<t;u++){var v=s[u],w;w=l.replace('%1',v.name).replace('%2',v.legend.replace(g,h));r.push(w);}m.push(k.replace('%1',q.name).replace('%2',r.join('')));}return j.replace('%1',m.join(''));};return{title:b.title,minWidth:600,minHeight:400,contents:[{id:'info',label:a.lang.common.generalTab,expand:true,elements:[{type:'html',id:'legends',style:'white-space:normal;',focus:function(){},html:i()+'<style type="text/css">'+'.cke_accessibility_legend'+'{'+'width:600px;'+'height:400px;'+'padding-right:5px;'+'overflow-y:auto;'+'overflow-x:hidden;'+'}'+'.cke_browser_quirks .cke_accessibility_legend,'+'.cke_browser_ie6 .cke_accessibility_legend'+'{'+'height:390px'+'}'+'.cke_accessibility_legend *'+'{'+'white-space:normal;'+'}'+'.cke_accessibility_legend h1'+'{'+'font-size: 20px;'+'border-bottom: 1px solid #AAA;'+'margin: 5px 0px 15px;'+'}'+'.cke_accessibility_legend dl'+'{'+'margin-left: 5px;'+'}'+'.cke_accessibility_legend dt'+'{'+'font-size: 13px;'+'font-weight: bold;'+'}'+'.cke_accessibility_legend dd'+'{'+'margin:10px'+'}'+'</style>'}]}],buttons:[CKEDITOR.dialog.cancelButton]};
-});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.dialog.add('a11yHelp',function(a){var b=a.lang.accessibilityHelp,c=CKEDITOR.tools.getNextId(),d={8:'BACKSPACE',9:'TAB',13:'ENTER',16:'SHIFT',17:'CTRL',18:'ALT',19:'PAUSE',20:'CAPSLOCK',27:'ESCAPE',33:'PAGE UP',34:'PAGE DOWN',35:'END',36:'HOME',37:'LEFT ARROW',38:'UP ARROW',39:'RIGHT ARROW',40:'DOWN ARROW',45:'INSERT',46:'DELETE',91:'LEFT WINDOW KEY',92:'RIGHT WINDOW KEY',93:'SELECT KEY',96:'NUMPAD 0',97:'NUMPAD 1',98:'NUMPAD 2',99:'NUMPAD 3',100:'NUMPAD 4',101:'NUMPAD 5',102:'NUMPAD 6',103:'NUMPAD 7',104:'NUMPAD 8',105:'NUMPAD 9',106:'MULTIPLY',107:'ADD',109:'SUBTRACT',110:'DECIMAL POINT',111:'DIVIDE',112:'F1',113:'F2',114:'F3',115:'F4',116:'F5',117:'F6',118:'F7',119:'F8',120:'F9',121:'F10',122:'F11',123:'F12',144:'NUM LOCK',145:'SCROLL LOCK',186:'SEMI-COLON',187:'EQUAL SIGN',188:'COMMA',189:'DASH',190:'PERIOD',191:'FORWARD SLASH',192:'GRAVE ACCENT',219:'OPEN BRACKET',220:'BACK SLASH',221:'CLOSE BRAKET',222:'SINGLE QUOTE'};d[CKEDITOR.ALT]='ALT';d[CKEDITOR.SHIFT]='SHIFT';d[CKEDITOR.CTRL]='CTRL';var e=[CKEDITOR.ALT,CKEDITOR.SHIFT,CKEDITOR.CTRL];function f(j){var k,l,m=[];for(var n=0;n<e.length;n++){l=e[n];k=j/e[n];if(k>1&&k<=2){j-=l;m.push(d[l]);}}m.push(d[j]||String.fromCharCode(j));return m.join('+');};var g=/\$\{(.*?)\}/g;function h(j,k){var l=a.config.keystrokes,m,n=l.length;for(var o=0;o<n;o++){m=l[o];if(m[1]==k)break;}return f(m[0]);};function i(){var j='<div class="cke_accessibility_legend" role="document" aria-labelledby="'+c+'_arialbl" tabIndex="-1">%1</div>'+'<span id="'+c+'_arialbl" class="cke_voice_label">'+b.contents+' </span>',k='<h1>%1</h1><dl>%2</dl>',l='<dt>%1</dt><dd>%2</dd>',m=[],n=b.legend,o=n.length;for(var p=0;p<o;p++){var q=n[p],r=[],s=q.items,t=s.length;for(var u=0;u<t;u++){var v=s[u],w;w=l.replace('%1',v.name).replace('%2',v.legend.replace(g,h));r.push(w);}m.push(k.replace('%1',q.name).replace('%2',r.join('')));}return j.replace('%1',m.join(''));};return{title:b.title,minWidth:600,minHeight:400,contents:[{id:'info',label:a.lang.common.generalTab,expand:true,elements:[{type:'html',id:'legends',style:'white-space:normal;',focus:function(){},html:i()+'<style type="text/css">'+'.cke_accessibility_legend'+'{'+'width:600px;'+'height:400px;'+'padding-right:5px;'+'overflow-y:auto;'+'overflow-x:hidden;'+'}'+'.cke_browser_quirks .cke_accessibility_legend,'+'.cke_browser_ie6 .cke_accessibility_legend'+'{'+'height:390px'+'}'+'.cke_accessibility_legend *'+'{'+'white-space:normal;'+'}'+'.cke_accessibility_legend h1'+'{'+'font-size: 20px;'+'border-bottom: 1px solid #AAA;'+'margin: 5px 0px 15px;'+'}'+'.cke_accessibility_legend dl'+'{'+'margin-left: 5px;'+'}'+'.cke_accessibility_legend dt'+'{'+'font-size: 13px;'+'font-weight: bold;'+'}'+'.cke_accessibility_legend dd'+'{'+'margin:10px'+'}'+'</style>'}]}],buttons:[CKEDITOR.dialog.cancelButton]};
+});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/_translationstatus.txt b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/_translationstatus.txt
index 7a490f9..e9545d2 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/_translationstatus.txt
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/_translationstatus.txt
@@ -1,25 +1,25 @@
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-
-cs.js Found: 30 Missing: 0
-cy.js Found: 30 Missing: 0
-da.js Found: 12 Missing: 18
-de.js Found: 30 Missing: 0
-el.js Found: 25 Missing: 5
-eo.js Found: 30 Missing: 0
-fa.js Found: 30 Missing: 0
-fi.js Found: 30 Missing: 0
-fr.js Found: 30 Missing: 0
-gu.js Found: 12 Missing: 18
-he.js Found: 30 Missing: 0
-it.js Found: 30 Missing: 0
-mk.js Found: 5 Missing: 25
-nb.js Found: 30 Missing: 0
-nl.js Found: 30 Missing: 0
-no.js Found: 30 Missing: 0
-pt-br.js Found: 30 Missing: 0
-ro.js Found: 6 Missing: 24
-tr.js Found: 30 Missing: 0
-ug.js Found: 27 Missing: 3
-vi.js Found: 6 Missing: 24
-zh-cn.js Found: 30 Missing: 0
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+
+cs.js Found: 30 Missing: 0
+cy.js Found: 30 Missing: 0
+da.js Found: 12 Missing: 18
+de.js Found: 30 Missing: 0
+el.js Found: 25 Missing: 5
+eo.js Found: 30 Missing: 0
+fa.js Found: 30 Missing: 0
+fi.js Found: 30 Missing: 0
+fr.js Found: 30 Missing: 0
+gu.js Found: 12 Missing: 18
+he.js Found: 30 Missing: 0
+it.js Found: 30 Missing: 0
+mk.js Found: 5 Missing: 25
+nb.js Found: 30 Missing: 0
+nl.js Found: 30 Missing: 0
+no.js Found: 30 Missing: 0
+pt-br.js Found: 30 Missing: 0
+ro.js Found: 6 Missing: 24
+tr.js Found: 30 Missing: 0
+ug.js Found: 27 Missing: 3
+vi.js Found: 6 Missing: 24
+zh-cn.js Found: 30 Missing: 0
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/cs.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/cs.js
index a8de6d6..308b4be 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/cs.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/cs.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('a11yhelp','cs',{accessibilityHelp:{title:'Instrukce pro přístupnost',contents:'Obsah nápovědy. Pro uzavření tohoto dialogu stiskněte klávesu ESC.',legend:[{name:'Obecné',items:[{name:'Panel nástrojů editoru',legend:'Stiskněte${toolbarFocus} k procházení panelu nástrojů. Přejděte na další a předchozí skupiny pomocí TAB a SHIFT-TAB. Přechod na další a předchozí tlačítko panelu nástrojů je pomocí ŠIPKA VPRAVO nebo ŠIPKA VLEVO. Stisknutím mezerníku nebo klávesy ENTER tlačítko aktivujete.'},{name:'Dialogové okno editoru',legend:'Uvnitř dialogového okna stiskněte TAB pro přesunutí na další pole, stiskněte SHIFT + TAB pro přesun na předchozí pole, stiskněte ENTER pro odeslání dialogu, stiskněte ESC pro jeho zrušení. Pro dialogová okna, která mají mnoho karet stiskněte ALT + F10 pr oprocházení seznamu karet. Pak se přesuňte na další kartu pomocí TAB nebo ŠIPKA VPRAVO. Pro přesun na předchozí stiskněte SHIFT + TAB nebo ŠIPKA VLEVO. Stiskněte MEZERNÍK nebo ENTER pro vybrání stránky karet.'},{name:'Kontextové menu editoru',legend:'Stiskněte ${contextMenu} nebo klávesu APPLICATION k otevření kontextového menu. Pak se přesuňte na další možnost menu pomocí TAB nebo ŠIPKY DOLŮ. Přesuňte se na předchozí možnost pomocí SHIFT+TAB nebo ŠIPKY NAHORU. Stiskněte MEZERNÍK nebo ENTER pro zvolení možnosti menu. Podmenu současné možnosti otevřete pomocí MEZERNÍKU nebo ENTER či ŠIPKY DOLEVA. Kontextové menu uzavřete stiskem ESC.'},{name:'Rámeček seznamu editoru',legend:'Uvnitř rámečku seznamu se přesunete na další položku menu pomocí TAB nebo ŠIPKA DOLŮ. Na předchozí položku se přesunete SHIFT + TAB nebo ŠIPKA NAHORU. Stiskněte MEZERNÍK nebo ENTER pro zvolení možnosti seznamu. Stiskněte ESC pro uzavření seznamu.'},{name:'Lišta cesty prvku v editoru',legend:'Stiskněte ${elementsPathFocus} pro procházení lišty cesty prvku. Na další tlačítko prvku se přesunete pomocí TAB nebo ŠIPKA VPRAVO. Na předchozí položku se přesunete pomocí SHIFT + TAB nebo ŠIPKA VLEVO. Stiskněte MEZERNÍK nebo ENTER pro vybrání prvku v editoru.'}]},{name:'Příkazy',items:[{name:' Příkaz Zpět',legend:'Stiskněte ${undo}'},{name:' Příkaz Znovu',legend:'Stiskněte ${redo}'},{name:' Příkaz Tučné',legend:'Stiskněte ${bold}'},{name:' Příkaz Kurzíva',legend:'Stiskněte ${italic}'},{name:' Příkaz Podtržení',legend:'Stiskněte ${underline}'},{name:' Příkaz Odkaz',legend:'Stiskněte ${link}'},{name:' Příkaz Skrýt panel nástrojů',legend:'Stiskněte ${toolbarCollapse}'},{name:' Nápověda přístupnosti',legend:'Stiskněte ${a11yHelp}'}]}]}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('a11yhelp','cs',{accessibilityHelp:{title:'Instrukce pro přístupnost',contents:'Obsah nápovědy. Pro uzavření tohoto dialogu stiskněte klávesu ESC.',legend:[{name:'Obecné',items:[{name:'Panel nástrojů editoru',legend:'Stiskněte${toolbarFocus} k procházení panelu nástrojů. Přejděte na další a předchozí skupiny pomocí TAB a SHIFT-TAB. Přechod na další a předchozí tlačítko panelu nástrojů je pomocí ŠIPKA VPRAVO nebo ŠIPKA VLEVO. Stisknutím mezerníku nebo klávesy ENTER tlačítko aktivujete.'},{name:'Dialogové okno editoru',legend:'Uvnitř dialogového okna stiskněte TAB pro přesunutí na další pole, stiskněte SHIFT + TAB pro přesun na předchozí pole, stiskněte ENTER pro odeslání dialogu, stiskněte ESC pro jeho zrušení. Pro dialogová okna, která mají mnoho karet stiskněte ALT + F10 pr oprocházení seznamu karet. Pak se přesuňte na další kartu pomocí TAB nebo ŠIPKA VPRAVO. Pro přesun na předchozí stiskněte SHIFT + TAB nebo ŠIPKA VLEVO. Stiskněte MEZERNÍK nebo ENTER pro vybrání stránky karet.'},{name:'Kontextové menu editoru',legend:'Stiskněte ${contextMenu} nebo klávesu APPLICATION k otevření kontextového menu. Pak se přesuňte na další možnost menu pomocí TAB nebo ŠIPKY DOLŮ. Přesuňte se na předchozí možnost pomocí SHIFT+TAB nebo ŠIPKY NAHORU. Stiskněte MEZERNÍK nebo ENTER pro zvolení možnosti menu. Podmenu současné možnosti otevřete pomocí MEZERNÍKU nebo ENTER či ŠIPKY DOLEVA. Kontextové menu uzavřete stiskem ESC.'},{name:'Rámeček seznamu editoru',legend:'Uvnitř rámečku seznamu se přesunete na další položku menu pomocí TAB nebo ŠIPKA DOLŮ. Na předchozí položku se přesunete SHIFT + TAB nebo ŠIPKA NAHORU. Stiskněte MEZERNÍK nebo ENTER pro zvolení možnosti seznamu. Stiskněte ESC pro uzavření seznamu.'},{name:'Lišta cesty prvku v editoru',legend:'Stiskněte ${elementsPathFocus} pro procházení lišty cesty prvku. Na další tlačítko prvku se přesunete pomocí TAB nebo ŠIPKA VPRAVO. Na předchozí položku se přesunete pomocí SHIFT + TAB nebo ŠIPKA VLEVO. Stiskněte MEZERNÍK nebo ENTER pro vybrání prvku v editoru.'}]},{name:'Příkazy',items:[{name:' Příkaz Zpět',legend:'Stiskněte ${undo}'},{name:' Příkaz Znovu',legend:'Stiskněte ${redo}'},{name:' Příkaz Tučné',legend:'Stiskněte ${bold}'},{name:' Příkaz Kurzíva',legend:'Stiskněte ${italic}'},{name:' Příkaz Podtržení',legend:'Stiskněte ${underline}'},{name:' Příkaz Odkaz',legend:'Stiskněte ${link}'},{name:' Příkaz Skrýt panel nástrojů',legend:'Stiskněte ${toolbarCollapse}'},{name:' Nápověda přístupnosti',legend:'Stiskněte ${a11yHelp}'}]}]}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/cy.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/cy.js
index ffc4bc5..8dfd935 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/cy.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/cy.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('a11yhelp','cy',{accessibilityHelp:{title:'Canllawiau Hygyrchedd',contents:'Cynnwys Cymorth. I gau y deialog hwn, pwyswch ESC.',legend:[{name:'Cyffredinol',items:[{name:'Bar Offer y Golygydd',legend:"Pwyswch $ {toolbarFocus} i fynd at y bar offer. Symudwch i'r grŵp bar offer nesaf a blaenorol gyda TAB a SHIFT-TAB. Symudwch i'r botwm bar offer nesaf a blaenorol gyda SAETH DDE neu SAETH CHWITH. Pwyswch SPACE neu ENTER i wneud botwm y bar offer yn weithredol."},{name:'Deialog y Golygydd',legend:"Tu mewn i'r deialog, pwyswch TAB i fynd i'r maes nesaf ar y deialog, pwyswch SHIFT + TAB i symud i faes blaenorol, pwyswch ENTER i gyflwyno'r deialog, pwyswch ESC i ddiddymu'r deialog. Ar gyfer deialogau sydd â thudalennau aml-tab, pwyswch ALT + F10 i lywio'r tab-restr. Yna symudwch i'r tab nesaf gyda TAB neu SAETH DDE. Symudwch i dab blaenorol gyda SHIFT + TAB neu'r SAETH CHWITH. Pwyswch SPACE neu ENTER i ddewis y dudalen tab."},{name:'Dewislen Cyd-destun y Golygydd',legend:"Pwyswch $ {contextMenu} neu'r ALLWEDD 'APPLICATION' i agor y ddewislen cyd-destun. Yna symudwch i'r opsiwn ddewislen nesaf gyda'r TAB neu'r SAETH I LAWR. Symudwch i'r opsiwn blaenorol gyda SHIFT + TAB neu'r SAETH I FYNY. Pwyswch SPACE neu ENTER i ddewis yr opsiwn ddewislen. Agorwch is-dewislen yr opsiwn cyfredol gyda SPACE neu ENTER neu SAETH DDE. Ewch yn ôl i'r eitem ar y ddewislen uwch gydag ESC neu SAETH CHWITH. Ceuwch y ddewislen cyd-destun gydag ESC."},{name:'Blwch Rhestr y Golygydd',legend:"Tu mewn rhestr-bocs, ewch i'r eitem rhestr nesaf gyda TAB neu'r SAETH I LAWR. Symudwch i restr eitem flaenorol gyda SHIFT + TAB neu SAETH I FYNY. Pwyswch SPACE neu ENTER i ddewis yr opsiwn o'r rhestr. Pwyswch ESC i gau'r rhestr."},{name:'Bar Llwybr Elfen y Golygydd',legend:"Pwyswch $ {elementsPathFocus} i fynd i'r elfennau llwybr bar. Symudwch i fotwm yr elfen nesaf gyda TAB neu SAETH DDE. Symudwch i fotwm blaenorol gyda SHIFT + TAB neu SAETH CHWITH. Pwyswch SPACE neu ENTER i ddewis yr elfen yn y golygydd."}]},{name:'Gorchmynion',items:[{name:'Gorchymyn dadwneud',legend:'Pwyswch ${undo}'},{name:'Gorchymyn ailadrodd',legend:'Pwyswch ${redo}'},{name:'Gorchymyn Bras',legend:'Pwyswch ${bold}'},{name:'Gorchymyn italig',legend:'Pwyswch ${italig}'},{name:'Gorchymyn tanlinellu',legend:'Pwyso ${underline}'},{name:'Gorchymyn dolen',legend:'Pwyswch ${link}'},{name:"Gorchymyn Cwympo'r Dewislen",legend:'Pwyswch ${toolbarCollapse}'},{name:'Cymorth Hygyrchedd',legend:'Pwyswch ${a11yHelp}'}]}]}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('a11yhelp','cy',{accessibilityHelp:{title:'Canllawiau Hygyrchedd',contents:'Cynnwys Cymorth. I gau y deialog hwn, pwyswch ESC.',legend:[{name:'Cyffredinol',items:[{name:'Bar Offer y Golygydd',legend:"Pwyswch $ {toolbarFocus} i fynd at y bar offer. Symudwch i'r grŵp bar offer nesaf a blaenorol gyda TAB a SHIFT-TAB. Symudwch i'r botwm bar offer nesaf a blaenorol gyda SAETH DDE neu SAETH CHWITH. Pwyswch SPACE neu ENTER i wneud botwm y bar offer yn weithredol."},{name:'Deialog y Golygydd',legend:"Tu mewn i'r deialog, pwyswch TAB i fynd i'r maes nesaf ar y deialog, pwyswch SHIFT + TAB i symud i faes blaenorol, pwyswch ENTER i gyflwyno'r deialog, pwyswch ESC i ddiddymu'r deialog. Ar gyfer deialogau sydd â thudalennau aml-tab, pwyswch ALT + F10 i lywio'r tab-restr. Yna symudwch i'r tab nesaf gyda TAB neu SAETH DDE. Symudwch i dab blaenorol gyda SHIFT + TAB neu'r SAETH CHWITH. Pwyswch SPACE neu ENTER i ddewis y dudalen tab."},{name:'Dewislen Cyd-destun y Golygydd',legend:"Pwyswch $ {contextMenu} neu'r ALLWEDD 'APPLICATION' i agor y ddewislen cyd-destun. Yna symudwch i'r opsiwn ddewislen nesaf gyda'r TAB neu'r SAETH I LAWR. Symudwch i'r opsiwn blaenorol gyda SHIFT + TAB neu'r SAETH I FYNY. Pwyswch SPACE neu ENTER i ddewis yr opsiwn ddewislen. Agorwch is-dewislen yr opsiwn cyfredol gyda SPACE neu ENTER neu SAETH DDE. Ewch yn ôl i'r eitem ar y ddewislen uwch gydag ESC neu SAETH CHWITH. Ceuwch y ddewislen cyd-destun gydag ESC."},{name:'Blwch Rhestr y Golygydd',legend:"Tu mewn rhestr-bocs, ewch i'r eitem rhestr nesaf gyda TAB neu'r SAETH I LAWR. Symudwch i restr eitem flaenorol gyda SHIFT + TAB neu SAETH I FYNY. Pwyswch SPACE neu ENTER i ddewis yr opsiwn o'r rhestr. Pwyswch ESC i gau'r rhestr."},{name:'Bar Llwybr Elfen y Golygydd',legend:"Pwyswch $ {elementsPathFocus} i fynd i'r elfennau llwybr bar. Symudwch i fotwm yr elfen nesaf gyda TAB neu SAETH DDE. Symudwch i fotwm blaenorol gyda SHIFT + TAB neu SAETH CHWITH. Pwyswch SPACE neu ENTER i ddewis yr elfen yn y golygydd."}]},{name:'Gorchmynion',items:[{name:'Gorchymyn dadwneud',legend:'Pwyswch ${undo}'},{name:'Gorchymyn ailadrodd',legend:'Pwyswch ${redo}'},{name:'Gorchymyn Bras',legend:'Pwyswch ${bold}'},{name:'Gorchymyn italig',legend:'Pwyswch ${italig}'},{name:'Gorchymyn tanlinellu',legend:'Pwyso ${underline}'},{name:'Gorchymyn dolen',legend:'Pwyswch ${link}'},{name:"Gorchymyn Cwympo'r Dewislen",legend:'Pwyswch ${toolbarCollapse}'},{name:'Cymorth Hygyrchedd',legend:'Pwyswch ${a11yHelp}'}]}]}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/da.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/da.js
index 0fca0cf..e45aa41 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/da.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/da.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('a11yhelp','da',{accessibilityHelp:{title:'Tilgængelighedsinstrukser',contents:'Help Contents. To close this dialog press ESC.',legend:[{name:'Generelt',items:[{name:'Editor værktøjslinje',legend:'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.'},{name:'Editor Dialog',legend:'Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page.'},{name:'Editor Context Menu',legend:'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.'},{name:'Editor List Box',legend:'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.'},{name:'Editor Element Path Bar',legend:'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.'}]},{name:'Kommandoer',items:[{name:'Fortryd kommando',legend:'Klik på ${undo}'},{name:'Gentag kommando',legend:'Klik ${redo}'},{name:' Bold command',legend:'Klik ${bold}'},{name:' Italic command',legend:'Press ${italic}'},{name:' Underline command',legend:'Klik ${underline}'},{name:' Link command',legend:'Klik ${link}'},{name:' Toolbar Collapse command',legend:'Press ${toolbarCollapse}'},{name:' Accessibility Help',legend:'Kilk ${a11yHelp}'}]}]}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('a11yhelp','da',{accessibilityHelp:{title:'Tilgængelighedsinstrukser',contents:'Help Contents. To close this dialog press ESC.',legend:[{name:'Generelt',items:[{name:'Editor værktøjslinje',legend:'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.'},{name:'Editor Dialog',legend:'Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page.'},{name:'Editor Context Menu',legend:'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.'},{name:'Editor List Box',legend:'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.'},{name:'Editor Element Path Bar',legend:'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.'}]},{name:'Kommandoer',items:[{name:'Fortryd kommando',legend:'Klik på ${undo}'},{name:'Gentag kommando',legend:'Klik ${redo}'},{name:' Bold command',legend:'Klik ${bold}'},{name:' Italic command',legend:'Press ${italic}'},{name:' Underline command',legend:'Klik ${underline}'},{name:' Link command',legend:'Klik ${link}'},{name:' Toolbar Collapse command',legend:'Press ${toolbarCollapse}'},{name:' Accessibility Help',legend:'Kilk ${a11yHelp}'}]}]}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/de.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/de.js
index 9a648bd..19c68e2 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/de.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/de.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('a11yhelp','de',{accessibilityHelp:{title:'Barrierefreiheitinformationen',contents:"Hilfeinhalt. Um den Dialog zu schliessen die Taste 'ESC' drücken.",legend:[{name:'Allgemein',items:[{name:'Editor Symbolleiste',legend:'Drücken Sie ${toolbarFocus} auf der Symbolleiste. Gehen Sie zur nächsten oder vorherigen Symbolleistengruppe mit TAB und SHIFT-TAB. Gehen Sie zur nächsten oder vorherigen Symbolleiste auf die Schaltfläche mit dem RECHTS- oder LINKS-Pfeil. Drücken Sie die Leertaste oder Eingabetaste, um die Schaltfläche in der Symbolleiste aktivieren.'},{name:'Editor Dialog',legend:'Innerhalb des Dialogs drücken Sie TAB um zum nächsten Dialogfeld zu gelangen, drücken Sie SHIFT-TAG um zum vorherigen Feld zu wechseln, drücken Sie ENTER um den Dialog abzusenden und ESC um den Dialog zu abzubrechen. Um zwischen den Reitern innerhalb eines Dialogs zu wechseln drücken sie ALT-F10. Um zum nächsten Reiter zu gelangen können Sie TAB oder die rechte Pfeiltaste. Zurück gelangt man mit SHIFT-TAB oder der linken Pfeiltaste. Mit der Leertaste oder Enter kann man den Reiter auswählen.'},{name:'Editor Kontextmenü',legend:'Dürcken Sie ${contextMenu} oder die Anwendungstaste um das Kontextmenü zu öffnen. Man kann die Pfeiltasten zum Wechsel benutzen. Mit der Leertaste oder der Enter-Taste kann man den Menüpunkt aufrufen. Schliessen Sie das Kontextmenü mit der ESC-Taste.'},{name:'Editor Listen',legend:'Innerhalb einer Listenbox kann man mit der TAB-Taste oder den Pfeilrunter-Taste den nächsten Menüeintrag wählen. Mit der Shift-TAB Tastenkombination oder der Pfeilhoch-Taste gelangt man zum vorherigen Menüpunkt. Mit der Leertaste oder Enter kann man den Menüpunkt auswählen. Drücken Sie ESC zum Verlassen des Menüs.'},{name:'Editor Elementpfadleiste',legend:'Drücken Sie ${elementsPathFocus} um sich durch die Pfadleiste zu bewegen. Um zum nächsten Element zu gelangen drücken Sie TAB oder die Pfeilrechts-Taste. Zum vorherigen Element gelangen Sie mit der SHIFT-TAB oder der Pfeillinks-Taste. Drücken Sie die Leertaste oder Enter um das Element auszuwählen.'}]},{name:'Befehle',items:[{name:'Wiederholen Befehl',legend:'Drücken Sie ${undo}'},{name:'Rückgängig Befehl',legend:'Drücken Sie ${redo}'},{name:'Fettschrift Befehl',legend:'Drücken Sie ${bold}'},{name:'Italic Befehl',legend:'Drücken Sie ${italic}'},{name:'Unterstreichung Befehl',legend:'Drücken Sie ${underline}'},{name:'Link Befehl',legend:'Drücken Sie ${link}'},{name:'Symbolleiste zuammenklappen Befehl',legend:'Drücken Sie ${toolbarCollapse}'},{name:'Eingabehilfen',legend:'Drücken Sie ${a11yHelp}'}]}]}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('a11yhelp','de',{accessibilityHelp:{title:'Barrierefreiheitinformationen',contents:"Hilfeinhalt. Um den Dialog zu schliessen die Taste 'ESC' drücken.",legend:[{name:'Allgemein',items:[{name:'Editor Symbolleiste',legend:'Drücken Sie ${toolbarFocus} auf der Symbolleiste. Gehen Sie zur nächsten oder vorherigen Symbolleistengruppe mit TAB und SHIFT-TAB. Gehen Sie zur nächsten oder vorherigen Symbolleiste auf die Schaltfläche mit dem RECHTS- oder LINKS-Pfeil. Drücken Sie die Leertaste oder Eingabetaste, um die Schaltfläche in der Symbolleiste aktivieren.'},{name:'Editor Dialog',legend:'Innerhalb des Dialogs drücken Sie TAB um zum nächsten Dialogfeld zu gelangen, drücken Sie SHIFT-TAG um zum vorherigen Feld zu wechseln, drücken Sie ENTER um den Dialog abzusenden und ESC um den Dialog zu abzubrechen. Um zwischen den Reitern innerhalb eines Dialogs zu wechseln drücken sie ALT-F10. Um zum nächsten Reiter zu gelangen können Sie TAB oder die rechte Pfeiltaste. Zurück gelangt man mit SHIFT-TAB oder der linken Pfeiltaste. Mit der Leertaste oder Enter kann man den Reiter auswählen.'},{name:'Editor Kontextmenü',legend:'Dürcken Sie ${contextMenu} oder die Anwendungstaste um das Kontextmenü zu öffnen. Man kann die Pfeiltasten zum Wechsel benutzen. Mit der Leertaste oder der Enter-Taste kann man den Menüpunkt aufrufen. Schliessen Sie das Kontextmenü mit der ESC-Taste.'},{name:'Editor Listen',legend:'Innerhalb einer Listenbox kann man mit der TAB-Taste oder den Pfeilrunter-Taste den nächsten Menüeintrag wählen. Mit der Shift-TAB Tastenkombination oder der Pfeilhoch-Taste gelangt man zum vorherigen Menüpunkt. Mit der Leertaste oder Enter kann man den Menüpunkt auswählen. Drücken Sie ESC zum Verlassen des Menüs.'},{name:'Editor Elementpfadleiste',legend:'Drücken Sie ${elementsPathFocus} um sich durch die Pfadleiste zu bewegen. Um zum nächsten Element zu gelangen drücken Sie TAB oder die Pfeilrechts-Taste. Zum vorherigen Element gelangen Sie mit der SHIFT-TAB oder der Pfeillinks-Taste. Drücken Sie die Leertaste oder Enter um das Element auszuwählen.'}]},{name:'Befehle',items:[{name:'Wiederholen Befehl',legend:'Drücken Sie ${undo}'},{name:'Rückgängig Befehl',legend:'Drücken Sie ${redo}'},{name:'Fettschrift Befehl',legend:'Drücken Sie ${bold}'},{name:'Italic Befehl',legend:'Drücken Sie ${italic}'},{name:'Unterstreichung Befehl',legend:'Drücken Sie ${underline}'},{name:'Link Befehl',legend:'Drücken Sie ${link}'},{name:'Symbolleiste zuammenklappen Befehl',legend:'Drücken Sie ${toolbarCollapse}'},{name:'Eingabehilfen',legend:'Drücken Sie ${a11yHelp}'}]}]}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/el.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/el.js
index acbde00..235d82f 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/el.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/el.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('a11yhelp','el',{accessibilityHelp:{title:'Οδηγίες Προσβασιμότητας',contents:'Περιεχόμενα Βοήθειας. Πατήστε ESC για κλείσιμο.',legend:[{name:'Γενικά',items:[{name:'Εργαλειοθήκη Επεξεργαστή',legend:'Πατήστε ${toolbarFocus} για να περιηγηθείτε στην γραμμή εργαλείων. Μετακινηθείτε ανάμεσα στις ομάδες της γραμμής εργαλείων με TAB και Shift-TAB. Μετακινηθείτε ανάμεσα στα κουμπία εργαλείων με ΔΕΞΙ και ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Πατήστε ΚΕΝΟ ή ENTER για να ενεργοποιήσετε το ενεργό κουμπί εργαλείου.'},{name:'Παράθυρο Διαλόγου Επεξεργαστή',legend:'Μέσα σε ένα παράθυρο διαλόγου, πατήστε TAB για να μεταβείτε στο επόμενο πεδίο ή SHIFT + TAB για να μεταβείτε στο προηγούμενο. Πατήστε ENTER για να υποβάλετε την φόρμα. Πατήστε ESC για να ακυρώσετε την διαδικασία της φόρμας. Για παράθυρα διαλόγων που έχουν πολλές σελίδες σε καρτέλες πατήστε ALT + F10 για να μεταβείτε στην λίστα των καρτέλων. Στην συνέχεια μπορείτε να μεταβείτε στην επόμενη καρτέλα πατώντας TAB ή RIGHT ARROW. Μπορείτε να μεταβείτε στην προηγούμενη καρτέλα πατώντας SHIFT + TAB ή LEFT ARROW. Πατήστε SPACE ή ENTER για να επιλέξετε την καρτέλα για προβολή.'},{name:'Αναδυόμενο Μενού Επεξεργαστή',legend:'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.'},{name:'Editor List Box',legend:'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.'},{name:'Editor Element Path Bar',legend:'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.'}]},{name:'Εντολές',items:[{name:' Εντολή αναίρεσης',legend:'Πατήστε ${undo}'},{name:' Εντολή επανάληψης',legend:'Πατήστε ${redo}'},{name:' Εντολή έντονης γραφής',legend:'Πατήστε ${bold}'},{name:' Εντολή πλάγιας γραφής',legend:'Πατήστε ${italic}'},{name:' Εντολή υπογράμμισης',legend:'Πατήστε ${underline}'},{name:' Εντολή συνδέσμου',legend:'Πατήστε ${link}'},{name:' Εντολή Σύμπτηξης Εργαλειοθήκης',legend:'Πατήστε ${toolbarCollapse}'},{name:' Βοήθεια Προσβασιμότητας',legend:'Πατήστε ${a11yHelp}'}]}]}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('a11yhelp','el',{accessibilityHelp:{title:'Οδηγίες Προσβασιμότητας',contents:'Περιεχόμενα Βοήθειας. Πατήστε ESC για κλείσιμο.',legend:[{name:'Γενικά',items:[{name:'Εργαλειοθήκη Επεξεργαστή',legend:'Πατήστε ${toolbarFocus} για να περιηγηθείτε στην γραμμή εργαλείων. Μετακινηθείτε ανάμεσα στις ομάδες της γραμμής εργαλείων με TAB και Shift-TAB. Μετακινηθείτε ανάμεσα στα κουμπία εργαλείων με ΔΕΞΙ και ΑΡΙΣΤΕΡΟ ΒΕΛΑΚΙ. Πατήστε ΚΕΝΟ ή ENTER για να ενεργοποιήσετε το ενεργό κουμπί εργαλείου.'},{name:'Παράθυρο Διαλόγου Επεξεργαστή',legend:'Μέσα σε ένα παράθυρο διαλόγου, πατήστε TAB για να μεταβείτε στο επόμενο πεδίο ή SHIFT + TAB για να μεταβείτε στο προηγούμενο. Πατήστε ENTER για να υποβάλετε την φόρμα. Πατήστε ESC για να ακυρώσετε την διαδικασία της φόρμας. Για παράθυρα διαλόγων που έχουν πολλές σελίδες σε καρτέλες πατήστε ALT + F10 για να μεταβείτε στην λίστα των καρτέλων. Στην συνέχεια μπορείτε να μεταβείτε στην επόμενη καρτέλα πατώντας TAB ή RIGHT ARROW. Μπορείτε να μεταβείτε στην προηγούμενη καρτέλα πατώντας SHIFT + TAB ή LEFT ARROW. Πατήστε SPACE ή ENTER για να επιλέξετε την καρτέλα για προβολή.'},{name:'Αναδυόμενο Μενού Επεξεργαστή',legend:'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.'},{name:'Editor List Box',legend:'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.'},{name:'Editor Element Path Bar',legend:'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.'}]},{name:'Εντολές',items:[{name:' Εντολή αναίρεσης',legend:'Πατήστε ${undo}'},{name:' Εντολή επανάληψης',legend:'Πατήστε ${redo}'},{name:' Εντολή έντονης γραφής',legend:'Πατήστε ${bold}'},{name:' Εντολή πλάγιας γραφής',legend:'Πατήστε ${italic}'},{name:' Εντολή υπογράμμισης',legend:'Πατήστε ${underline}'},{name:' Εντολή συνδέσμου',legend:'Πατήστε ${link}'},{name:' Εντολή Σύμπτηξης Εργαλειοθήκης',legend:'Πατήστε ${toolbarCollapse}'},{name:' Βοήθεια Προσβασιμότητας',legend:'Πατήστε ${a11yHelp}'}]}]}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/en.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/en.js
index 073f43a..3f6d14e 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/en.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/en.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('a11yhelp','en',{accessibilityHelp:{title:'Accessibility Instructions',contents:'Help Contents. To close this dialog press ESC.',legend:[{name:'General',items:[{name:'Editor Toolbar',legend:'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.'},{name:'Editor Dialog',legend:'Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page.'},{name:'Editor Context Menu',legend:'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.'},{name:'Editor List Box',legend:'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.'},{name:'Editor Element Path Bar',legend:'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.'}]},{name:'Commands',items:[{name:' Undo command',legend:'Press ${undo}'},{name:' Redo command',legend:'Press ${redo}'},{name:' Bold command',legend:'Press ${bold}'},{name:' Italic command',legend:'Press ${italic}'},{name:' Underline command',legend:'Press ${underline}'},{name:' Link command',legend:'Press ${link}'},{name:' Toolbar Collapse command',legend:'Press ${toolbarCollapse}'},{name:' Accessibility Help',legend:'Press ${a11yHelp}'}]}]}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('a11yhelp','en',{accessibilityHelp:{title:'Accessibility Instructions',contents:'Help Contents. To close this dialog press ESC.',legend:[{name:'General',items:[{name:'Editor Toolbar',legend:'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.'},{name:'Editor Dialog',legend:'Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page.'},{name:'Editor Context Menu',legend:'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.'},{name:'Editor List Box',legend:'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.'},{name:'Editor Element Path Bar',legend:'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.'}]},{name:'Commands',items:[{name:' Undo command',legend:'Press ${undo}'},{name:' Redo command',legend:'Press ${redo}'},{name:' Bold command',legend:'Press ${bold}'},{name:' Italic command',legend:'Press ${italic}'},{name:' Underline command',legend:'Press ${underline}'},{name:' Link command',legend:'Press ${link}'},{name:' Toolbar Collapse command',legend:'Press ${toolbarCollapse}'},{name:' Accessibility Help',legend:'Press ${a11yHelp}'}]}]}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/eo.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/eo.js
index af45796..36568b2 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/eo.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/eo.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('a11yhelp','eo',{accessibilityHelp:{title:'Uzindikoj pri atingeblo',contents:'Helpilenhavo. Por fermi tiun dialogon, premu la ESKAPAN klavon.',legend:[{name:'Ĝeneralaĵoj',items:[{name:'Ilbreto de la redaktilo',legend:'Premu ${toolbarFocus} por atingi la ilbreton. Moviĝu al la sekva aŭ antaŭa grupoj de la ilbreto per la klavoj TABA kaj MAJUSKLIGA-TABA. Moviĝu al la sekva aŭ antaŭa butonoj de la ilbreto per la klavoj SAGO DEKSTREN kaj SAGO MALDEKSTREN. Premu la SPACETklavon aŭ la ENENklavon por aktivigi la ilbretbutonon.'},{name:'Redaktildialogo',legend:'En dialogo, premu la TABAN klavon por navigi al la sekva dialogkampo, premu la MAJUSKLIGAN + TABAN klavojn por reveni al la antaŭa kampo, premu la ENENklavon por sendi la dialogon, premu la ESKAPAN klavon por nuligi la dialogon. Por dialogoj kun pluraj retpaĝoj sub langetoj, premu ALT + F10 por navigi al la langetlisto. Poste moviĝu al la sekva langeto per la klavo TABA aŭ SAGO DEKSTREN. Moviĝu al la antaŭa langeto per la klavoj MAJUSKLIGA + TABA aŭ SAGO MALDEKSTREN. Premu la SPACETklavon aŭ la ENENklavon por selekti la langetretpaĝon.'},{name:'Kunteksta menuo de la redaktilo',legend:'Premu ${contextMenu} aŭ entajpu la KLAVKOMBINAĴON por malfermi la kuntekstan menuon. Poste moviĝu al la sekva opcio de la menuo per la klavoj TABA aŭ SAGO SUBEN. Moviĝu al la antaŭa opcio per la klavoj MAJUSKLGA + TABA aŭ SAGO SUPREN. Premu la SPACETklavon aŭ ENENklavon por selekti la menuopcion. Malfermu la submenuon de la kuranta opcio per la SPACETklavo aŭ la ENENklavo aŭ la SAGO DEKSTREN. Revenu al la elemento de la patra menuo per la klavoj ESKAPA aŭ SAGO MALDEKSTREN. Fermu la kuntekstan menuon per la ESKAPA klavo.'},{name:'Fallisto de la redaktilo',legend:'En fallisto, moviĝu al la sekva listelemento per la klavoj TABA aŭ SAGO SUBEN. Moviĝu al la antaŭa listelemento per la klavoj MAJUSKLIGA + TABA aŭ SAGO SUPREN. Premu la SPACETklavon aŭ ENENklavon por selekti la opcion en la listo. Premu la ESKAPAN klavon por fermi la falmenuon.'},{name:'Breto indikanta la vojon al la redaktilelementoj',legend:'Premu ${elementsPathFocus} por navigi al la breto indikanta la vojon al la redaktilelementoj. Moviĝu al la butono de la sekva elemento per la klavoj TABA aŭ SAGO DEKSTREN. Moviĝu al la butono de la antaŭa elemento per la klavoj MAJUSKLIGA + TABA aŭ SAGO MALDEKSTREN. Premu la SPACETklavon aŭ ENENklavon por selekti la elementon en la redaktilo.'}]},{name:'Komandoj',items:[{name:'Komando malfari',legend:'Premu ${undo}'},{name:'Komando refari',legend:'Premu ${redo}'},{name:'Komando grasa',legend:'Premu ${bold}'},{name:'Komando kursiva',legend:'Premu ${italic}'},{name:'Komando substreki',legend:'Premu ${underline}'},{name:'Komando ligilo',legend:'Premu ${link}'},{name:'Komando faldi la ilbreton',legend:'Premu ${toolbarCollapse}'},{name:'Helpilo pri atingeblo',legend:'Premu ${a11yHelp}'}]}]}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('a11yhelp','eo',{accessibilityHelp:{title:'Uzindikoj pri atingeblo',contents:'Helpilenhavo. Por fermi tiun dialogon, premu la ESKAPAN klavon.',legend:[{name:'Ĝeneralaĵoj',items:[{name:'Ilbreto de la redaktilo',legend:'Premu ${toolbarFocus} por atingi la ilbreton. Moviĝu al la sekva aŭ antaŭa grupoj de la ilbreto per la klavoj TABA kaj MAJUSKLIGA-TABA. Moviĝu al la sekva aŭ antaŭa butonoj de la ilbreto per la klavoj SAGO DEKSTREN kaj SAGO MALDEKSTREN. Premu la SPACETklavon aŭ la ENENklavon por aktivigi la ilbretbutonon.'},{name:'Redaktildialogo',legend:'En dialogo, premu la TABAN klavon por navigi al la sekva dialogkampo, premu la MAJUSKLIGAN + TABAN klavojn por reveni al la antaŭa kampo, premu la ENENklavon por sendi la dialogon, premu la ESKAPAN klavon por nuligi la dialogon. Por dialogoj kun pluraj retpaĝoj sub langetoj, premu ALT + F10 por navigi al la langetlisto. Poste moviĝu al la sekva langeto per la klavo TABA aŭ SAGO DEKSTREN. Moviĝu al la antaŭa langeto per la klavoj MAJUSKLIGA + TABA aŭ SAGO MALDEKSTREN. Premu la SPACETklavon aŭ la ENENklavon por selekti la langetretpaĝon.'},{name:'Kunteksta menuo de la redaktilo',legend:'Premu ${contextMenu} aŭ entajpu la KLAVKOMBINAĴON por malfermi la kuntekstan menuon. Poste moviĝu al la sekva opcio de la menuo per la klavoj TABA aŭ SAGO SUBEN. Moviĝu al la antaŭa opcio per la klavoj MAJUSKLGA + TABA aŭ SAGO SUPREN. Premu la SPACETklavon aŭ ENENklavon por selekti la menuopcion. Malfermu la submenuon de la kuranta opcio per la SPACETklavo aŭ la ENENklavo aŭ la SAGO DEKSTREN. Revenu al la elemento de la patra menuo per la klavoj ESKAPA aŭ SAGO MALDEKSTREN. Fermu la kuntekstan menuon per la ESKAPA klavo.'},{name:'Fallisto de la redaktilo',legend:'En fallisto, moviĝu al la sekva listelemento per la klavoj TABA aŭ SAGO SUBEN. Moviĝu al la antaŭa listelemento per la klavoj MAJUSKLIGA + TABA aŭ SAGO SUPREN. Premu la SPACETklavon aŭ ENENklavon por selekti la opcion en la listo. Premu la ESKAPAN klavon por fermi la falmenuon.'},{name:'Breto indikanta la vojon al la redaktilelementoj',legend:'Premu ${elementsPathFocus} por navigi al la breto indikanta la vojon al la redaktilelementoj. Moviĝu al la butono de la sekva elemento per la klavoj TABA aŭ SAGO DEKSTREN. Moviĝu al la butono de la antaŭa elemento per la klavoj MAJUSKLIGA + TABA aŭ SAGO MALDEKSTREN. Premu la SPACETklavon aŭ ENENklavon por selekti la elementon en la redaktilo.'}]},{name:'Komandoj',items:[{name:'Komando malfari',legend:'Premu ${undo}'},{name:'Komando refari',legend:'Premu ${redo}'},{name:'Komando grasa',legend:'Premu ${bold}'},{name:'Komando kursiva',legend:'Premu ${italic}'},{name:'Komando substreki',legend:'Premu ${underline}'},{name:'Komando ligilo',legend:'Premu ${link}'},{name:'Komando faldi la ilbreton',legend:'Premu ${toolbarCollapse}'},{name:'Helpilo pri atingeblo',legend:'Premu ${a11yHelp}'}]}]}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/fa.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/fa.js
index 61bb10c..1a547ad 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/fa.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/fa.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('a11yhelp','fa',{accessibilityHelp:{title:'دستورالعملهای دسترسی',contents:'راهنمای فهرست مطالب. برای بستن این کادر محاورهای ESC را فشار دهید.',legend:[{name:'عمومی',items:[{name:'نوار ابزار ویرایشگر',legend:'${toolbarFocus} را برای باز کردن نوار ابزار بفشارید. با کلید Tab و Shif-Tab در مجموعه نوار ابزار بعدی و قبلی حرکت کنید. برای حرکت در کلید نوار ابزار قبلی و بعدی با کلید جهتنمای راست و چپ جابجا شوید. کلید Space یا Enter را برای فعال کردن کلید نوار ابزار بفشارید.'},{name:'پنجره محاورهای ویرایشگر',legend:'در داخل یک پنجره محاورهای، کلید Tab را بفشارید تا به پنجرهی بعدی بروید، Shift+Tab برای حرکت به فیلد قبلی، فشردن Enter برای ثبت اطلاعات پنجره، فشردن Esc برای لغو پنجره محاورهای و برای پنجرههایی که چندین برگه دارند، فشردن Alt+F10 جهت رفتن به Tab-List. در نهایت حرکت به برگه بعدی با Tab یا کلید جهتنمای راست. حرکت به برگه قبلی با Shift+Tab یا کلید جهتنمای چپ. فشردن Space یا Enter برای انتخاب یک برگه.'},{name:'منوی متنی ویرایشگر',legend:'${contextMenu} یا کلید برنامههای کاربردی را برای باز کردن منوی متن را بفشارید. سپس میتوانید برای حرکت به گزینه بعدی منو با کلید Tab و یا کلید جهتنمای پایین جابجا شوید. حرکت به گزینه قبلی با Shift+Tab یا کلید جهتنمای بالا. فشردن Space یا Enter برای انتخاب یک گزینه از منو. باز کردن زیر شاخه گزینه منو جاری با کلید Space یا Enter و یا کلید جهتنمای راست و چپ. بازگشت به منوی والد با کلید Esc یا کلید جهتنمای چپ. بستن منوی متن با Esc.'},{name:'جعبه فهرست ویرایشگر',legend:'در داخل جعبه لیست، قلم دوم از اقلام لیست بعدی را با TAB و یا Arrow Down حرکت دهید. انتقال به قلم دوم از اقلام لیست قبلی را با SHIFT + TAB یا UP ARROW. کلید Space یا ENTER را برای انتخاب گزینه لیست بفشارید. کلید ESC را برای بستن جعبه لیست بفشارید.'},{name:'ویرایشگر عنصر نوار راه',legend:'برای رفتن به مسیر عناصر ${elementsPathFocus} را بفشارید. حرکت به کلید عنصر بعدی با کلید Tab یا کلید جهتنمای راست. برگشت به کلید قبلی با Shift+Tab یا کلید جهتنمای چپ. فشردن Space یا Enter برای انتخاب یک عنصر در ویرایشگر.'}]},{name:'فرمانها',items:[{name:'بازگشت فرمان',legend:'فشردن ${undo}'},{name:'انجام مجدد فرمان',legend:'فشردن ${redo}'},{name:'فرمان متن درشت',legend:'فشردن ${bold}'},{name:'فرمان متن کج',legend:'فشردن ${italic}'},{name:'فرمان متن زیرخطدار',legend:'فشردن ${underline}'},{name:'فرمان پیوند',legend:'فشردن ${link}'},{name:'بستن نوار ابزار فرمان',legend:'فشردن ${toolbarCollapse}'},{name:'راهنمای دسترسی',legend:'فشردن ${a11yHelp}'}]}]}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('a11yhelp','fa',{accessibilityHelp:{title:'دستورالعملهای دسترسی',contents:'راهنمای فهرست مطالب. برای بستن این کادر محاورهای ESC را فشار دهید.',legend:[{name:'عمومی',items:[{name:'نوار ابزار ویرایشگر',legend:'${toolbarFocus} را برای باز کردن نوار ابزار بفشارید. با کلید Tab و Shif-Tab در مجموعه نوار ابزار بعدی و قبلی حرکت کنید. برای حرکت در کلید نوار ابزار قبلی و بعدی با کلید جهتنمای راست و چپ جابجا شوید. کلید Space یا Enter را برای فعال کردن کلید نوار ابزار بفشارید.'},{name:'پنجره محاورهای ویرایشگر',legend:'در داخل یک پنجره محاورهای، کلید Tab را بفشارید تا به پنجرهی بعدی بروید، Shift+Tab برای حرکت به فیلد قبلی، فشردن Enter برای ثبت اطلاعات پنجره، فشردن Esc برای لغو پنجره محاورهای و برای پنجرههایی که چندین برگه دارند، فشردن Alt+F10 جهت رفتن به Tab-List. در نهایت حرکت به برگه بعدی با Tab یا کلید جهتنمای راست. حرکت به برگه قبلی با Shift+Tab یا کلید جهتنمای چپ. فشردن Space یا Enter برای انتخاب یک برگه.'},{name:'منوی متنی ویرایشگر',legend:'${contextMenu} یا کلید برنامههای کاربردی را برای باز کردن منوی متن را بفشارید. سپس میتوانید برای حرکت به گزینه بعدی منو با کلید Tab و یا کلید جهتنمای پایین جابجا شوید. حرکت به گزینه قبلی با Shift+Tab یا کلید جهتنمای بالا. فشردن Space یا Enter برای انتخاب یک گزینه از منو. باز کردن زیر شاخه گزینه منو جاری با کلید Space یا Enter و یا کلید جهتنمای راست و چپ. بازگشت به منوی والد با کلید Esc یا کلید جهتنمای چپ. بستن منوی متن با Esc.'},{name:'جعبه فهرست ویرایشگر',legend:'در داخل جعبه لیست، قلم دوم از اقلام لیست بعدی را با TAB و یا Arrow Down حرکت دهید. انتقال به قلم دوم از اقلام لیست قبلی را با SHIFT + TAB یا UP ARROW. کلید Space یا ENTER را برای انتخاب گزینه لیست بفشارید. کلید ESC را برای بستن جعبه لیست بفشارید.'},{name:'ویرایشگر عنصر نوار راه',legend:'برای رفتن به مسیر عناصر ${elementsPathFocus} را بفشارید. حرکت به کلید عنصر بعدی با کلید Tab یا کلید جهتنمای راست. برگشت به کلید قبلی با Shift+Tab یا کلید جهتنمای چپ. فشردن Space یا Enter برای انتخاب یک عنصر در ویرایشگر.'}]},{name:'فرمانها',items:[{name:'بازگشت فرمان',legend:'فشردن ${undo}'},{name:'انجام مجدد فرمان',legend:'فشردن ${redo}'},{name:'فرمان متن درشت',legend:'فشردن ${bold}'},{name:'فرمان متن کج',legend:'فشردن ${italic}'},{name:'فرمان متن زیرخطدار',legend:'فشردن ${underline}'},{name:'فرمان پیوند',legend:'فشردن ${link}'},{name:'بستن نوار ابزار فرمان',legend:'فشردن ${toolbarCollapse}'},{name:'راهنمای دسترسی',legend:'فشردن ${a11yHelp}'}]}]}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/fi.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/fi.js
index af5f894..d79147a 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/fi.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/fi.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('a11yhelp','fi',{accessibilityHelp:{title:'Saavutettavuus ohjeet',contents:'Ohjeen sisällöt. Sulkeaksesi tämän dialogin paina ESC.',legend:[{name:'Yleinen',items:[{name:'Editorin työkalupalkki',legend:'Paina ${toolbarFocus} siirtyäksesi työkalupalkkiin. Siirry seuraavaan ja edelliseen työkalupalkin ryhmään TAB ja SHIFT-TAB näppäimillä. Siirry seuraavaan ja edelliseen työkalupainikkeeseen käyttämällä NUOLI OIKEALLE tai NUOLI VASEMMALLE näppäimillä. Paina VÄLILYÖNTI tai ENTER näppäintä aktivoidaksesi työkalupainikkeen.'},{name:'Editorin dialogi',legend:'Dialogin sisällä, painamalla TAB siirryt seuraavaan dialogin kenttään, painamalla SHIFT+TAB siirryt aiempaan kenttään, painamalla ENTER lähetät dialogin, painamalla ESC peruutat dialogin. Dialogeille joissa on useita välilehtiä, paina ALT+F10 siirtyäksesi välillehtilistaan. Siirtyäksesi seuraavaan välilehteen paina TAB tai NUOLI OIKEALLE. Siirry edelliseen välilehteen painamalla SHIFT+TAB tai nuoli vasemmalle. Paina VÄLILYÖNTI tai ENTER valitaksesi välilehden.'},{name:'Editorin oheisvalikko',legend:'Paina ${contextMenu} tai SOVELLUSPAINIKETTA avataksesi oheisvalikon. Liiku seuraavaan valikon vaihtoehtoon TAB tai NUOLI ALAS näppäimillä. Siirry edelliseen vaihtoehtoon SHIFT+TAB tai NUOLI YLÖS näppäimillä. Paina VÄLILYÖNTI tai ENTER valitaksesi valikon kohdan. Avataksesi nykyisen kohdan alivalikon paina VÄLILYÖNTI tai ENTER tai NUOLI OIKEALLE painiketta. Siirtyäksesi takaisin valikon ylemmälle tasolle paina ESC tai NUOLI vasemmalle. Oheisvalikko suljetaan ESC painikkeella.'},{name:'Editorin listalaatikko',legend:'Listalaatikon sisällä siirry seuraavaan listan kohtaan TAB tai NUOLI ALAS painikkeilla. Siirry edelliseen listan kohtaan SHIFT+TAB tai NUOLI YLÖS painikkeilla. Paina VÄLILYÖNTI tai ENTER valitaksesi listan vaihtoehdon. Paina ESC sulkeaksesi listalaatikon.'},{name:'Editorin elementtipolun palkki',legend:'Paina ${elementsPathFocus} siirtyäksesi elementtipolun palkkiin. Siirry seuraavaan elementtipainikkeeseen TAB tai NUOLI OIKEALLE painikkeilla. Siirry aiempaan painikkeeseen SHIFT+TAB tai NUOLI VASEMMALLE painikkeilla. Paina VÄLILYÖNTI tai ENTER valitaksesi elementin editorissa.'}]},{name:'Komennot',items:[{name:'Peruuta komento',legend:'Paina ${undo}'},{name:'Tee uudelleen komento',legend:'Paina ${redo}'},{name:'Lihavoi komento',legend:'Paina ${bold}'},{name:'Kursivoi komento',legend:'Paina ${italic}'},{name:'Alleviivaa komento',legend:'Paina ${underline}'},{name:'Linkki komento',legend:'Paina ${link}'},{name:'Pienennä työkalupalkki komento',legend:'Paina ${toolbarCollapse}'},{name:'Saavutettavuus ohjeet',legend:'Paina ${a11yHelp}'}]}]}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('a11yhelp','fi',{accessibilityHelp:{title:'Saavutettavuus ohjeet',contents:'Ohjeen sisällöt. Sulkeaksesi tämän dialogin paina ESC.',legend:[{name:'Yleinen',items:[{name:'Editorin työkalupalkki',legend:'Paina ${toolbarFocus} siirtyäksesi työkalupalkkiin. Siirry seuraavaan ja edelliseen työkalupalkin ryhmään TAB ja SHIFT-TAB näppäimillä. Siirry seuraavaan ja edelliseen työkalupainikkeeseen käyttämällä NUOLI OIKEALLE tai NUOLI VASEMMALLE näppäimillä. Paina VÄLILYÖNTI tai ENTER näppäintä aktivoidaksesi työkalupainikkeen.'},{name:'Editorin dialogi',legend:'Dialogin sisällä, painamalla TAB siirryt seuraavaan dialogin kenttään, painamalla SHIFT+TAB siirryt aiempaan kenttään, painamalla ENTER lähetät dialogin, painamalla ESC peruutat dialogin. Dialogeille joissa on useita välilehtiä, paina ALT+F10 siirtyäksesi välillehtilistaan. Siirtyäksesi seuraavaan välilehteen paina TAB tai NUOLI OIKEALLE. Siirry edelliseen välilehteen painamalla SHIFT+TAB tai nuoli vasemmalle. Paina VÄLILYÖNTI tai ENTER valitaksesi välilehden.'},{name:'Editorin oheisvalikko',legend:'Paina ${contextMenu} tai SOVELLUSPAINIKETTA avataksesi oheisvalikon. Liiku seuraavaan valikon vaihtoehtoon TAB tai NUOLI ALAS näppäimillä. Siirry edelliseen vaihtoehtoon SHIFT+TAB tai NUOLI YLÖS näppäimillä. Paina VÄLILYÖNTI tai ENTER valitaksesi valikon kohdan. Avataksesi nykyisen kohdan alivalikon paina VÄLILYÖNTI tai ENTER tai NUOLI OIKEALLE painiketta. Siirtyäksesi takaisin valikon ylemmälle tasolle paina ESC tai NUOLI vasemmalle. Oheisvalikko suljetaan ESC painikkeella.'},{name:'Editorin listalaatikko',legend:'Listalaatikon sisällä siirry seuraavaan listan kohtaan TAB tai NUOLI ALAS painikkeilla. Siirry edelliseen listan kohtaan SHIFT+TAB tai NUOLI YLÖS painikkeilla. Paina VÄLILYÖNTI tai ENTER valitaksesi listan vaihtoehdon. Paina ESC sulkeaksesi listalaatikon.'},{name:'Editorin elementtipolun palkki',legend:'Paina ${elementsPathFocus} siirtyäksesi elementtipolun palkkiin. Siirry seuraavaan elementtipainikkeeseen TAB tai NUOLI OIKEALLE painikkeilla. Siirry aiempaan painikkeeseen SHIFT+TAB tai NUOLI VASEMMALLE painikkeilla. Paina VÄLILYÖNTI tai ENTER valitaksesi elementin editorissa.'}]},{name:'Komennot',items:[{name:'Peruuta komento',legend:'Paina ${undo}'},{name:'Tee uudelleen komento',legend:'Paina ${redo}'},{name:'Lihavoi komento',legend:'Paina ${bold}'},{name:'Kursivoi komento',legend:'Paina ${italic}'},{name:'Alleviivaa komento',legend:'Paina ${underline}'},{name:'Linkki komento',legend:'Paina ${link}'},{name:'Pienennä työkalupalkki komento',legend:'Paina ${toolbarCollapse}'},{name:'Saavutettavuus ohjeet',legend:'Paina ${a11yHelp}'}]}]}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/fr.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/fr.js
index e2f20a0..b4e7bef 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/fr.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/fr.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('a11yhelp','fr',{accessibilityHelp:{title:"Instructions pour l'accessibilité",contents:"Contenu de l'aide. Pour fermer ce dialogue, appuyez sur la touche ESC (Echappement).",legend:[{name:'Général',items:[{name:"Barre d'outils de l'éditeur",legend:"Appuyer sur ${toolbarFocus} pour accéder à la barre d'outils. Se déplacer vers les groupes suivant ou précédent de la barre d'outil avec les touches TAB et SHIFT-TAB. Se déplacer vers les boutons suivant ou précédent de la barre d'outils avec les touches FLECHE DROITE et FLECHE GAUCHE. Appuyer sur la barre d'espace ou la touche ENTRER pour activer le bouton de barre d'outils."},{name:'Dialogue de léditeur',legend:"A l'intérieur d'un dialogue, appuyer sur la touche TAB pour naviguer jusqu'au champ de dalogue suivant, appuyez sur les touches SHIFT + TAB pour revenir au champ précédent, appuyez sur la touche ENTRER pour soumettre le dialogue, appuyer sur la touche ESC pour annuler le dialogue. Pour les dialogues avec plusieurs pages d'onglets, appuyer sur ALT + F10 pour naviguer jusqu'à la liste des onglets. Puis se déplacer vers l'onglet suivant avec la touche TAB ou FLECHE DROITE. Se déplacer vers l'onglet précédent avec les touches SHIFT + TAB ou FLECHE GAUCHE. Appuyer sur la barre d'espace ou la touche ENTRER pour sélectionner la page de l'onglet."},{name:"Menu contextuel de l'éditeur",legend:"Appuyer sur ${contextMenu} ou entrer le RACCOURCI CLAVIER pour ouvrir le menu contextuel. Puis se déplacer vers l'option suivante du menu avec les touches TAB ou FLECHE BAS. Se déplacer vers l'option précédente avec les touches SHIFT+TAB ou FLECHE HAUT. appuyer sur la BARRE D'ESPACE ou la touche ENTREE pour sélectionner l'option du menu. Oovrir le sous-menu de l'option courante avec la BARRE D'ESPACE ou les touches ENTREE ou FLECHE DROITE. Revenir à l'élément de menu parent avec les touches ESC ou FLECHE GAUCHE. Fermer le menu contextuel avec ESC."},{name:"Zone de liste en menu déroulant de l'éditeur",legend:"A l'intérieur d'une liste en menu déroulant, se déplacer vers l'élément suivant de la liste avec les touches TAB ou FLECHE BAS. Se déplacer vers l'élément précédent de la liste avec les touches SHIFT + TAB ou FLECHE HAUT. Appuyer sur la BARRE D'ESPACE ou sur ENTREE pour sélectionner l'option dans la liste. Appuyer sur ESC pour fermer le menu déroulant."},{name:"Barre d'emplacement des éléments de léditeur",legend:"Appuyer sur ${elementsPathFocus} pour naviguer vers la barre d'emplacement des éléments de léditeur. Se déplacer vers le bouton d'élément suivant avec les touches TAB ou FLECHE DROITE. Se déplacer vers le bouton d'élément précédent avec les touches SHIFT+TAB ou FLECHE GAUCHE. Appuyer sur la BARRE D'ESPACE ou sur ENTREE pour sélectionner l'élément dans l'éditeur."}]},{name:'Commandes',items:[{name:' Commande défaire',legend:'Appuyer sur ${undo}'},{name:' Commande refaire',legend:'Appuyer sur ${redo}'},{name:' Commande gras',legend:'Appuyer sur ${bold}'},{name:' Commande italique',legend:'Appuyer sur ${italic}'},{name:' Commande souligné',legend:'Appuyer sur ${underline}'},{name:' Commande lien',legend:'Appuyer sur ${link}'},{name:" Commande enrouler la barre d'outils",legend:'Appuyer sur ${toolbarCollapse}'},{name:' Aide Accessibilité',legend:'Appuyer sur ${a11yHelp}'}]}]}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('a11yhelp','fr',{accessibilityHelp:{title:"Instructions pour l'accessibilité",contents:"Contenu de l'aide. Pour fermer ce dialogue, appuyez sur la touche ESC (Echappement).",legend:[{name:'Général',items:[{name:"Barre d'outils de l'éditeur",legend:"Appuyer sur ${toolbarFocus} pour accéder à la barre d'outils. Se déplacer vers les groupes suivant ou précédent de la barre d'outil avec les touches TAB et SHIFT-TAB. Se déplacer vers les boutons suivant ou précédent de la barre d'outils avec les touches FLECHE DROITE et FLECHE GAUCHE. Appuyer sur la barre d'espace ou la touche ENTRER pour activer le bouton de barre d'outils."},{name:'Dialogue de léditeur',legend:"A l'intérieur d'un dialogue, appuyer sur la touche TAB pour naviguer jusqu'au champ de dalogue suivant, appuyez sur les touches SHIFT + TAB pour revenir au champ précédent, appuyez sur la touche ENTRER pour soumettre le dialogue, appuyer sur la touche ESC pour annuler le dialogue. Pour les dialogues avec plusieurs pages d'onglets, appuyer sur ALT + F10 pour naviguer jusqu'à la liste des onglets. Puis se déplacer vers l'onglet suivant avec la touche TAB ou FLECHE DROITE. Se déplacer vers l'onglet précédent avec les touches SHIFT + TAB ou FLECHE GAUCHE. Appuyer sur la barre d'espace ou la touche ENTRER pour sélectionner la page de l'onglet."},{name:"Menu contextuel de l'éditeur",legend:"Appuyer sur ${contextMenu} ou entrer le RACCOURCI CLAVIER pour ouvrir le menu contextuel. Puis se déplacer vers l'option suivante du menu avec les touches TAB ou FLECHE BAS. Se déplacer vers l'option précédente avec les touches SHIFT+TAB ou FLECHE HAUT. appuyer sur la BARRE D'ESPACE ou la touche ENTREE pour sélectionner l'option du menu. Oovrir le sous-menu de l'option courante avec la BARRE D'ESPACE ou les touches ENTREE ou FLECHE DROITE. Revenir à l'élément de menu parent avec les touches ESC ou FLECHE GAUCHE. Fermer le menu contextuel avec ESC."},{name:"Zone de liste en menu déroulant de l'éditeur",legend:"A l'intérieur d'une liste en menu déroulant, se déplacer vers l'élément suivant de la liste avec les touches TAB ou FLECHE BAS. Se déplacer vers l'élément précédent de la liste avec les touches SHIFT + TAB ou FLECHE HAUT. Appuyer sur la BARRE D'ESPACE ou sur ENTREE pour sélectionner l'option dans la liste. Appuyer sur ESC pour fermer le menu déroulant."},{name:"Barre d'emplacement des éléments de léditeur",legend:"Appuyer sur ${elementsPathFocus} pour naviguer vers la barre d'emplacement des éléments de léditeur. Se déplacer vers le bouton d'élément suivant avec les touches TAB ou FLECHE DROITE. Se déplacer vers le bouton d'élément précédent avec les touches SHIFT+TAB ou FLECHE GAUCHE. Appuyer sur la BARRE D'ESPACE ou sur ENTREE pour sélectionner l'élément dans l'éditeur."}]},{name:'Commandes',items:[{name:' Commande défaire',legend:'Appuyer sur ${undo}'},{name:' Commande refaire',legend:'Appuyer sur ${redo}'},{name:' Commande gras',legend:'Appuyer sur ${bold}'},{name:' Commande italique',legend:'Appuyer sur ${italic}'},{name:' Commande souligné',legend:'Appuyer sur ${underline}'},{name:' Commande lien',legend:'Appuyer sur ${link}'},{name:" Commande enrouler la barre d'outils",legend:'Appuyer sur ${toolbarCollapse}'},{name:' Aide Accessibilité',legend:'Appuyer sur ${a11yHelp}'}]}]}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/gu.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/gu.js
index ae09189..6dc3e1d 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/gu.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/gu.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('a11yhelp','gu',{accessibilityHelp:{title:'એક્ક્ષેબિલિટી ની વિગતો',contents:'હેલ્પ. આ બંધ કરવા ESC દબાવો.',legend:[{name:'જનરલ',items:[{name:'એડિટર ટૂલબાર',legend:'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.'},{name:'એડિટર ડાયલોગ',legend:'Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page.'},{name:'Editor Context Menu',legend:'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.'},{name:'Editor List Box',legend:'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.'},{name:'Editor Element Path Bar',legend:'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.'}]},{name:'કમાંડસ',items:[{name:'અન્ડું કમાંડ',legend:'$ દબાવો {undo}'},{name:'ફરી કરો કમાંડ',legend:'$ દબાવો {redo}'},{name:'બોલ્દનો કમાંડ',legend:'$ દબાવો {bold}'},{name:' Italic command',legend:'Press ${italic}'},{name:' Underline command',legend:'Press ${underline}'},{name:' Link command',legend:'Press ${link}'},{name:' Toolbar Collapse command',legend:'Press ${toolbarCollapse}'},{name:' Accessibility Help',legend:'Press ${a11yHelp}'}]}]}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('a11yhelp','gu',{accessibilityHelp:{title:'એક્ક્ષેબિલિટી ની વિગતો',contents:'હેલ્પ. આ બંધ કરવા ESC દબાવો.',legend:[{name:'જનરલ',items:[{name:'એડિટર ટૂલબાર',legend:'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.'},{name:'એડિટર ડાયલોગ',legend:'Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page.'},{name:'Editor Context Menu',legend:'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.'},{name:'Editor List Box',legend:'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.'},{name:'Editor Element Path Bar',legend:'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.'}]},{name:'કમાંડસ',items:[{name:'અન્ડું કમાંડ',legend:'$ દબાવો {undo}'},{name:'ફરી કરો કમાંડ',legend:'$ દબાવો {redo}'},{name:'બોલ્દનો કમાંડ',legend:'$ દબાવો {bold}'},{name:' Italic command',legend:'Press ${italic}'},{name:' Underline command',legend:'Press ${underline}'},{name:' Link command',legend:'Press ${link}'},{name:' Toolbar Collapse command',legend:'Press ${toolbarCollapse}'},{name:' Accessibility Help',legend:'Press ${a11yHelp}'}]}]}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/he.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/he.js
index 5d93805..fe2341f 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/he.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/he.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('a11yhelp','he',{accessibilityHelp:{title:'הוראות נגישות',contents:'הוראות נגישות. לסגירה לחץ אסקייפ (ESC).',legend:[{name:'כללי',items:[{name:'סרגל הכלים',legend:'לחץ על ${toolbarFocus} כדי לנווט לסרגל הכלים. עבור לכפתור הבא עם מקש הטאב (TAB) או חץ שמאלי. עבור לכפתור הקודם עם מקש השיפט (SHIFT) + טאב (TAB) או חץ ימני. לחץ רווח או אנטר (ENTER) כדי להפעיל את הכפתור הנבחר.'},{name:'דיאלוגים (חלונות תשאול)',legend:'בתוך דיאלוג, לחץ טאב (TAB) כדי לנווט לשדה הבא, לחץ שיפט (SHIFT) + טאב (TAB) כדי לנווט לשדה הקודם, לחץ אנטר (ENTER) כדי לשלוח את הדיאלוג, לחץ אסקייפ (ESC) כדי לבטל. בתוך דיאלוגים בעלי מספר טאבים (לשוניות), לחץ אלט (ALT) + F10 כדי לנווט לשורת הטאבים. נווט לטאב הבא עם טאב (TAB) או חץ שמאלי. עבור לטאב הקודם עם שיפט (SHIFT) + טאב (TAB) או חץ שמאלי. לחץ רווח או אנטר (ENTER) כדי להיכנס לטאב.'},{name:'תפריט ההקשר (Context Menu)',legend:'לחץ ${contextMenu} או APPLICATION KEYכדי לפתוח את תפריט ההקשר. עבור לאפשרות הבאה עם טאב (TAB) או חץ למטה. עבור לאפשרות הקודמת עם שיפט (SHIFT) + טאב (TAB) או חץ למעלה. לחץ רווח או אנטר (ENTER) כדי לבחור את האפשרות. פתח את תת התפריט (Sub-menu) של האפשרות הנוכחית עם רווח או אנטר (ENTER) או חץ שמאלי. חזור לתפריט האב עם אסקייפ (ESC) או חץ שמאלי. סגור את תפריט ההקשר עם אסקייפ (ESC).'},{name:'תפריטים צפים (List boxes)',legend:'בתוך תפריט צף, עבור לפריט הבא עם טאב (TAB) או חץ למטה. עבור לתפריט הקודם עם שיפט (SHIFT) + טאב (TAB) or חץ עליון. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.'},{name:'עץ אלמנטים (Elements Path)',legend:'לחץ ${elementsPathFocus} כדי לנווט לעץ האלמנטים. עבור לפריט הבא עם טאב (TAB) או חץ ימני. עבור לפריט הקודם עם שיפט (SHIFT) + טאב (TAB) או חץ שמאלי. לחץ רווח או אנטר (ENTER) כדי לבחור את האלמנט בעורך.'}]},{name:'פקודות',items:[{name:' ביטול צעד אחרון',legend:'לחץ ${undo}'},{name:' חזרה על צעד אחרון',legend:'לחץ ${redo}'},{name:' הדגשה',legend:'לחץ ${bold}'},{name:' הטייה',legend:'לחץ ${italic}'},{name:' הוספת קו תחתון',legend:'לחץ ${underline}'},{name:' הוספת לינק',legend:'לחץ ${link}'},{name:' כיווץ סרגל הכלים',legend:'לחץ ${toolbarCollapse}'},{name:' הוראות נגישות',legend:'לחץ ${a11yHelp}'}]}]}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('a11yhelp','he',{accessibilityHelp:{title:'הוראות נגישות',contents:'הוראות נגישות. לסגירה לחץ אסקייפ (ESC).',legend:[{name:'כללי',items:[{name:'סרגל הכלים',legend:'לחץ על ${toolbarFocus} כדי לנווט לסרגל הכלים. עבור לכפתור הבא עם מקש הטאב (TAB) או חץ שמאלי. עבור לכפתור הקודם עם מקש השיפט (SHIFT) + טאב (TAB) או חץ ימני. לחץ רווח או אנטר (ENTER) כדי להפעיל את הכפתור הנבחר.'},{name:'דיאלוגים (חלונות תשאול)',legend:'בתוך דיאלוג, לחץ טאב (TAB) כדי לנווט לשדה הבא, לחץ שיפט (SHIFT) + טאב (TAB) כדי לנווט לשדה הקודם, לחץ אנטר (ENTER) כדי לשלוח את הדיאלוג, לחץ אסקייפ (ESC) כדי לבטל. בתוך דיאלוגים בעלי מספר טאבים (לשוניות), לחץ אלט (ALT) + F10 כדי לנווט לשורת הטאבים. נווט לטאב הבא עם טאב (TAB) או חץ שמאלי. עבור לטאב הקודם עם שיפט (SHIFT) + טאב (TAB) או חץ שמאלי. לחץ רווח או אנטר (ENTER) כדי להיכנס לטאב.'},{name:'תפריט ההקשר (Context Menu)',legend:'לחץ ${contextMenu} או APPLICATION KEYכדי לפתוח את תפריט ההקשר. עבור לאפשרות הבאה עם טאב (TAB) או חץ למטה. עבור לאפשרות הקודמת עם שיפט (SHIFT) + טאב (TAB) או חץ למעלה. לחץ רווח או אנטר (ENTER) כדי לבחור את האפשרות. פתח את תת התפריט (Sub-menu) של האפשרות הנוכחית עם רווח או אנטר (ENTER) או חץ שמאלי. חזור לתפריט האב עם אסקייפ (ESC) או חץ שמאלי. סגור את תפריט ההקשר עם אסקייפ (ESC).'},{name:'תפריטים צפים (List boxes)',legend:'בתוך תפריט צף, עבור לפריט הבא עם טאב (TAB) או חץ למטה. עבור לתפריט הקודם עם שיפט (SHIFT) + טאב (TAB) or חץ עליון. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.'},{name:'עץ אלמנטים (Elements Path)',legend:'לחץ ${elementsPathFocus} כדי לנווט לעץ האלמנטים. עבור לפריט הבא עם טאב (TAB) או חץ ימני. עבור לפריט הקודם עם שיפט (SHIFT) + טאב (TAB) או חץ שמאלי. לחץ רווח או אנטר (ENTER) כדי לבחור את האלמנט בעורך.'}]},{name:'פקודות',items:[{name:' ביטול צעד אחרון',legend:'לחץ ${undo}'},{name:' חזרה על צעד אחרון',legend:'לחץ ${redo}'},{name:' הדגשה',legend:'לחץ ${bold}'},{name:' הטייה',legend:'לחץ ${italic}'},{name:' הוספת קו תחתון',legend:'לחץ ${underline}'},{name:' הוספת לינק',legend:'לחץ ${link}'},{name:' כיווץ סרגל הכלים',legend:'לחץ ${toolbarCollapse}'},{name:' הוראות נגישות',legend:'לחץ ${a11yHelp}'}]}]}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/it.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/it.js
index 07e6f47..78d75bb 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/it.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/it.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('a11yhelp','it',{accessibilityHelp:{title:'Istruzioni di Accessibilità',contents:'Contenuti di Aiuto. Per chiudere questa finestra premi ESC.',legend:[{name:'Generale',items:[{name:'Barra degli strumenti Editor',legend:'Premi ${toolbarFocus} per navigare fino alla barra degli strumenti. Muoviti tra i gruppi della barra degli strumenti con i tasti Tab e Maiusc-Tab. Spostati tra il successivo ed il precedente pulsante della barra degli strumenti usando le frecce direzionali Destra e Sinistra. Premi Spazio o Invio per attivare il pulsante della barra degli strumenti.'},{name:'Finestra Editor',legend:"All'interno di una finestra di dialogo, premi Tab per navigare fino al campo successivo della finestra di dialogo, premi Maiusc-Tab per tornare al campo precedente, premi Invio per inviare la finestra di dialogo, premi Esc per uscire. Per le finestre che hanno schede multiple, premi Alt+F10 per navigare nella lista delle schede. Quindi spostati alla scheda successiva con il tasto Tab oppure con la Freccia Destra. Torna alla scheda precedente con Maiusc+Tab oppure con la Freccia Sinistra. Premi Spazio o Invio per scegliere la scheda."},{name:'Menù contestuale Editor',legend:"Premi ${contextMenu} o TASTO APPLICAZIONE per aprire il menu contestuale. Dunque muoviti all'opzione successiva del menu con il tasto TAB o con la Freccia Sotto. Muoviti all'opzione precedente con MAIUSC+TAB o con Freccia Sopra. Premi SPAZIO o INVIO per scegliere l'opzione di menu. Apri il sottomenu dell'opzione corrente con SPAZIO o INVIO oppure con la Freccia Destra. Torna indietro al menu superiore con ESC oppure Freccia Sinistra. Chiudi il menu contestuale con ESC."},{name:'Box Lista Editor',legend:"Dentro un box-lista, muoviti al prossimo elemento della lista con TAB o con la Freccia direzionale giù. Spostati all'elemento precedente con MAIUSC+TAB oppure con Freccia direzionale sopra. Premi SPAZIO o INVIO per scegliere l'opzione della lista. Premi ESC per chiudere il box-lista."},{name:'Barra percorso elementi editor',legend:"Premi ${elementsPathFocus} per navigare tra gli elementi della barra percorso. Muoviti al prossimo pulsante di elemento con TAB o la Freccia direzionale destra. Muoviti al pulsante precedente con MAIUSC+TAB o la Freccia Direzionale Sinistra. Premi SPAZIO o INVIO per scegliere l'elemento nell'editor."}]},{name:'Comandi',items:[{name:' Annulla comando',legend:'Premi ${undo}'},{name:' Ripeti comando',legend:'Premi ${redo}'},{name:' Comando Grassetto',legend:'Premi ${bold}'},{name:' Comando Corsivo',legend:'Premi ${italic}'},{name:' Comando Sottolineato',legend:'Premi ${underline}'},{name:' Comando Link',legend:'Premi ${link}'},{name:' Comando riduci barra degli strumenti',legend:'Premi ${toolbarCollapse}'},{name:' Aiuto Accessibilità',legend:'Premi ${a11yHelp}'}]}]}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('a11yhelp','it',{accessibilityHelp:{title:'Istruzioni di Accessibilità',contents:'Contenuti di Aiuto. Per chiudere questa finestra premi ESC.',legend:[{name:'Generale',items:[{name:'Barra degli strumenti Editor',legend:'Premi ${toolbarFocus} per navigare fino alla barra degli strumenti. Muoviti tra i gruppi della barra degli strumenti con i tasti Tab e Maiusc-Tab. Spostati tra il successivo ed il precedente pulsante della barra degli strumenti usando le frecce direzionali Destra e Sinistra. Premi Spazio o Invio per attivare il pulsante della barra degli strumenti.'},{name:'Finestra Editor',legend:"All'interno di una finestra di dialogo, premi Tab per navigare fino al campo successivo della finestra di dialogo, premi Maiusc-Tab per tornare al campo precedente, premi Invio per inviare la finestra di dialogo, premi Esc per uscire. Per le finestre che hanno schede multiple, premi Alt+F10 per navigare nella lista delle schede. Quindi spostati alla scheda successiva con il tasto Tab oppure con la Freccia Destra. Torna alla scheda precedente con Maiusc+Tab oppure con la Freccia Sinistra. Premi Spazio o Invio per scegliere la scheda."},{name:'Menù contestuale Editor',legend:"Premi ${contextMenu} o TASTO APPLICAZIONE per aprire il menu contestuale. Dunque muoviti all'opzione successiva del menu con il tasto TAB o con la Freccia Sotto. Muoviti all'opzione precedente con MAIUSC+TAB o con Freccia Sopra. Premi SPAZIO o INVIO per scegliere l'opzione di menu. Apri il sottomenu dell'opzione corrente con SPAZIO o INVIO oppure con la Freccia Destra. Torna indietro al menu superiore con ESC oppure Freccia Sinistra. Chiudi il menu contestuale con ESC."},{name:'Box Lista Editor',legend:"Dentro un box-lista, muoviti al prossimo elemento della lista con TAB o con la Freccia direzionale giù. Spostati all'elemento precedente con MAIUSC+TAB oppure con Freccia direzionale sopra. Premi SPAZIO o INVIO per scegliere l'opzione della lista. Premi ESC per chiudere il box-lista."},{name:'Barra percorso elementi editor',legend:"Premi ${elementsPathFocus} per navigare tra gli elementi della barra percorso. Muoviti al prossimo pulsante di elemento con TAB o la Freccia direzionale destra. Muoviti al pulsante precedente con MAIUSC+TAB o la Freccia Direzionale Sinistra. Premi SPAZIO o INVIO per scegliere l'elemento nell'editor."}]},{name:'Comandi',items:[{name:' Annulla comando',legend:'Premi ${undo}'},{name:' Ripeti comando',legend:'Premi ${redo}'},{name:' Comando Grassetto',legend:'Premi ${bold}'},{name:' Comando Corsivo',legend:'Premi ${italic}'},{name:' Comando Sottolineato',legend:'Premi ${underline}'},{name:' Comando Link',legend:'Premi ${link}'},{name:' Comando riduci barra degli strumenti',legend:'Premi ${toolbarCollapse}'},{name:' Aiuto Accessibilità',legend:'Premi ${a11yHelp}'}]}]}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/mk.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/mk.js
index 1629670..00dc6e9 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/mk.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/mk.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('a11yhelp','mk',{accessibilityHelp:{title:'Инструкции за пристапност',contents:'Содржина на делот за помош. За да го затворите овој дијалот притиснете ESC.',legend:[{name:'Општо',items:[{name:'Мени за едиторот',legend:'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.'},{name:'Дијалот за едиторот',legend:'Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page.'},{name:'Editor Context Menu',legend:'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.'},{name:'Editor List Box',legend:'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.'},{name:'Editor Element Path Bar',legend:'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.'}]},{name:'Commands',items:[{name:' Undo command',legend:'Press ${undo}'},{name:' Redo command',legend:'Press ${redo}'},{name:' Bold command',legend:'Press ${bold}'},{name:' Italic command',legend:'Press ${italic}'},{name:' Underline command',legend:'Press ${underline}'},{name:' Link command',legend:'Press ${link}'},{name:' Toolbar Collapse command',legend:'Press ${toolbarCollapse}'},{name:' Accessibility Help',legend:'Press ${a11yHelp}'}]}]}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('a11yhelp','mk',{accessibilityHelp:{title:'Инструкции за пристапност',contents:'Содржина на делот за помош. За да го затворите овој дијалот притиснете ESC.',legend:[{name:'Општо',items:[{name:'Мени за едиторот',legend:'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.'},{name:'Дијалот за едиторот',legend:'Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page.'},{name:'Editor Context Menu',legend:'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.'},{name:'Editor List Box',legend:'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.'},{name:'Editor Element Path Bar',legend:'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.'}]},{name:'Commands',items:[{name:' Undo command',legend:'Press ${undo}'},{name:' Redo command',legend:'Press ${redo}'},{name:' Bold command',legend:'Press ${bold}'},{name:' Italic command',legend:'Press ${italic}'},{name:' Underline command',legend:'Press ${underline}'},{name:' Link command',legend:'Press ${link}'},{name:' Toolbar Collapse command',legend:'Press ${toolbarCollapse}'},{name:' Accessibility Help',legend:'Press ${a11yHelp}'}]}]}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/nb.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/nb.js
index 030962a..e2a1317 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/nb.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/nb.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('a11yhelp','nb',{accessibilityHelp:{title:'Instruksjoner for tilgjengelighet',contents:'Innhold for hjelp. Trykk ESC for å lukke denne dialogen.',legend:[{name:'Generelt',items:[{name:'Verktøylinje for editor',legend:'Trykk ${toolbarFocus} for å navigere til verktøylinjen. Flytt til neste og forrige verktøylinjegruppe med TAB og SHIFT-TAB. Flytt til neste og forrige verktøylinjeknapp med HØYRE PILTAST og VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å aktivere verktøylinjeknappen.'},{name:'Dialog for editor',legend:'Mens du er i en dialog, trykk TAB for å navigere til neste dialogfelt, press SHIFT + TAB for å flytte til forrige felt, trykk ENTER for å akseptere dialogen, trykk ESC for å avbryte dialogen. For dialoger med flere faner, trykk ALT + F10 for å navigere til listen over faner. Gå til neste fane med TAB eller HØYRE PILTAST. Gå til forrige fane med SHIFT + TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge fanen.'},{name:'Kontekstmeny for editor',legend:'Trykk ${contextMenu} eller MENYKNAPP for å åpne kontekstmeny. Gå til neste alternativ i menyen med TAB eller PILTAST NED. Gå til forrige alternativ med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge menyalternativet. Åpne undermenyen på valgt alternativ med MELLOMROM eller ENTER eller HØYRE PILTAST. Gå tilbake til overordnet menyelement med ESC eller VENSTRE PILTAST. Lukk kontekstmenyen med ESC.'},{name:'Listeboks for editor',legend:'I en listeboks, gå til neste alternativ i listen med TAB eller PILTAST NED. Gå til forrige alternativ i listen med SHIFT + TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge alternativet i listen. Trykk ESC for å lukke listeboksen.'},{name:'Verktøylinje for elementsti',legend:'Trykk ${elementsPathFocus} for å navigere til verktøylinjen som viser elementsti. Gå til neste elementknapp med TAB eller HØYRE PILTAST. Gå til forrige elementknapp med SHIFT+TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge elementet i editoren.'}]},{name:'Kommandoer',items:[{name:'Angre',legend:'Trykk ${undo}'},{name:'Gjør om',legend:'Trykk ${redo}'},{name:'Fet tekst',legend:'Trykk ${bold}'},{name:'Kursiv tekst',legend:'Trykk ${italic}'},{name:'Understreking',legend:'Trykk ${underline}'},{name:'Link',legend:'Trykk ${link}'},{name:'Skjul verktøylinje',legend:'Trykk ${toolbarCollapse}'},{name:'Hjelp for tilgjengelighet',legend:'Trykk ${a11yHelp}'}]}]}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('a11yhelp','nb',{accessibilityHelp:{title:'Instruksjoner for tilgjengelighet',contents:'Innhold for hjelp. Trykk ESC for å lukke denne dialogen.',legend:[{name:'Generelt',items:[{name:'Verktøylinje for editor',legend:'Trykk ${toolbarFocus} for å navigere til verktøylinjen. Flytt til neste og forrige verktøylinjegruppe med TAB og SHIFT-TAB. Flytt til neste og forrige verktøylinjeknapp med HØYRE PILTAST og VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å aktivere verktøylinjeknappen.'},{name:'Dialog for editor',legend:'Mens du er i en dialog, trykk TAB for å navigere til neste dialogfelt, press SHIFT + TAB for å flytte til forrige felt, trykk ENTER for å akseptere dialogen, trykk ESC for å avbryte dialogen. For dialoger med flere faner, trykk ALT + F10 for å navigere til listen over faner. Gå til neste fane med TAB eller HØYRE PILTAST. Gå til forrige fane med SHIFT + TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge fanen.'},{name:'Kontekstmeny for editor',legend:'Trykk ${contextMenu} eller MENYKNAPP for å åpne kontekstmeny. Gå til neste alternativ i menyen med TAB eller PILTAST NED. Gå til forrige alternativ med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge menyalternativet. Åpne undermenyen på valgt alternativ med MELLOMROM eller ENTER eller HØYRE PILTAST. Gå tilbake til overordnet menyelement med ESC eller VENSTRE PILTAST. Lukk kontekstmenyen med ESC.'},{name:'Listeboks for editor',legend:'I en listeboks, gå til neste alternativ i listen med TAB eller PILTAST NED. Gå til forrige alternativ i listen med SHIFT + TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge alternativet i listen. Trykk ESC for å lukke listeboksen.'},{name:'Verktøylinje for elementsti',legend:'Trykk ${elementsPathFocus} for å navigere til verktøylinjen som viser elementsti. Gå til neste elementknapp med TAB eller HØYRE PILTAST. Gå til forrige elementknapp med SHIFT+TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge elementet i editoren.'}]},{name:'Kommandoer',items:[{name:'Angre',legend:'Trykk ${undo}'},{name:'Gjør om',legend:'Trykk ${redo}'},{name:'Fet tekst',legend:'Trykk ${bold}'},{name:'Kursiv tekst',legend:'Trykk ${italic}'},{name:'Understreking',legend:'Trykk ${underline}'},{name:'Link',legend:'Trykk ${link}'},{name:'Skjul verktøylinje',legend:'Trykk ${toolbarCollapse}'},{name:'Hjelp for tilgjengelighet',legend:'Trykk ${a11yHelp}'}]}]}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/nl.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/nl.js
index 9dd8401..3e0bb4c 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/nl.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/nl.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('a11yhelp','nl',{accessibilityHelp:{title:'Toegankelijkheidsinstructies',contents:'Help inhoud. Druk op ESC om dit dialoog te sluiten.',legend:[{name:'Algemeen',items:[{name:'Werkbalk tekstverwerker',legend:'Druk op ${toolbarFocus} om naar de werkbalk te navigeren. Om te schakelen naar de volgende en vorige werkbalkgroep, gebruik TAB en SHIFT+TAB. Om te schakelen naar de volgende en vorige werkbalkknop, gebruik de PIJL RECHTS en PIJL LINKS. Druk op SPATIE of ENTER om een werkbalkknop te activeren.'},{name:'Dialoog tekstverwerker',legend:'In een dialoogvenster, druk op TAB om te navigeren naar het volgende veld. Druk op SHIFT+TAB om naar het vorige veld te navigeren. Druk op ENTER om het dialoogvenster te verzenden. Druk op ESC om het dialoogvenster te sluiten. Voor dialoogvensters met meerdere tabbladen, druk op ALT+F10 om naar de tabset te navigeren. Schakel naar het volgende tabblad met TAB of PIJL RECHTS. Schakel naar het vorige tabblad met SHIFT+TAB of PIJL LINKS. Druk op SPATIE of ENTER om het tabblad te selecteren.'},{name:'Contextmenu tekstverwerker',legend:'Druk op ${contextMenu} of APPLICATION KEY om het contextmenu te openen. Schakel naar de volgende menuoptie met TAB of PIJL OMLAAG. Schakel naar de vorige menuoptie met SHIFT+TAB of PIJL OMHOOG. Druk op SPATIE of ENTER om een menuoptie te selecteren. Op een submenu van de huidige optie met SPATIE, ENTER of PIJL RECHTS. Ga terug naar de bovenliggende menuoptie met ESC of PIJL LINKS. Sluit het contextmenu met ESC.'},{name:'Keuzelijst tekstverwerker',legend:'In een keuzelijst, schakel naar het volgende item met TAB of PIJL OMLAAG. Schakel naar het vorige item met SHIFT+TAB of PIJL OMHOOG. Druk op SPATIE of ENTER om het item te selecteren. Druk op ESC om de keuzelijst te sluiten.'},{name:'Elementenpad werkbalk tekstverwerker',legend:'Druk op ${elementsPathFocus} om naar het elementenpad te navigeren. Om te schakelen naar het volgende element, gebruik TAB of PIJL RECHTS. Om te schakelen naar het vorige element, gebruik SHIFT+TAB or PIJL LINKS. Druk op SPATIE of ENTER om een element te selecteren in de tekstverwerker.'}]},{name:'Opdrachten',items:[{name:'Ongedaan maken opdracht',legend:'Druk op ${undo}'},{name:'Opnieuw uitvoeren opdracht',legend:'Druk op ${redo}'},{name:'Vetgedrukt opdracht',legend:'Druk up ${bold}'},{name:'Cursief opdracht',legend:'Druk op ${italic}'},{name:'Onderstrepen opdracht',legend:'Druk op ${underline}'},{name:'Link opdracht',legend:'Druk op ${link}'},{name:'Werkbalk inklappen opdracht',legend:'Druk op ${toolbarCollapse}'},{name:'Toegankelijkheidshulp',legend:'Druk op ${a11yHelp}'}]}]}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('a11yhelp','nl',{accessibilityHelp:{title:'Toegankelijkheidsinstructies',contents:'Help inhoud. Druk op ESC om dit dialoog te sluiten.',legend:[{name:'Algemeen',items:[{name:'Werkbalk tekstverwerker',legend:'Druk op ${toolbarFocus} om naar de werkbalk te navigeren. Om te schakelen naar de volgende en vorige werkbalkgroep, gebruik TAB en SHIFT+TAB. Om te schakelen naar de volgende en vorige werkbalkknop, gebruik de PIJL RECHTS en PIJL LINKS. Druk op SPATIE of ENTER om een werkbalkknop te activeren.'},{name:'Dialoog tekstverwerker',legend:'In een dialoogvenster, druk op TAB om te navigeren naar het volgende veld. Druk op SHIFT+TAB om naar het vorige veld te navigeren. Druk op ENTER om het dialoogvenster te verzenden. Druk op ESC om het dialoogvenster te sluiten. Voor dialoogvensters met meerdere tabbladen, druk op ALT+F10 om naar de tabset te navigeren. Schakel naar het volgende tabblad met TAB of PIJL RECHTS. Schakel naar het vorige tabblad met SHIFT+TAB of PIJL LINKS. Druk op SPATIE of ENTER om het tabblad te selecteren.'},{name:'Contextmenu tekstverwerker',legend:'Druk op ${contextMenu} of APPLICATION KEY om het contextmenu te openen. Schakel naar de volgende menuoptie met TAB of PIJL OMLAAG. Schakel naar de vorige menuoptie met SHIFT+TAB of PIJL OMHOOG. Druk op SPATIE of ENTER om een menuoptie te selecteren. Op een submenu van de huidige optie met SPATIE, ENTER of PIJL RECHTS. Ga terug naar de bovenliggende menuoptie met ESC of PIJL LINKS. Sluit het contextmenu met ESC.'},{name:'Keuzelijst tekstverwerker',legend:'In een keuzelijst, schakel naar het volgende item met TAB of PIJL OMLAAG. Schakel naar het vorige item met SHIFT+TAB of PIJL OMHOOG. Druk op SPATIE of ENTER om het item te selecteren. Druk op ESC om de keuzelijst te sluiten.'},{name:'Elementenpad werkbalk tekstverwerker',legend:'Druk op ${elementsPathFocus} om naar het elementenpad te navigeren. Om te schakelen naar het volgende element, gebruik TAB of PIJL RECHTS. Om te schakelen naar het vorige element, gebruik SHIFT+TAB or PIJL LINKS. Druk op SPATIE of ENTER om een element te selecteren in de tekstverwerker.'}]},{name:'Opdrachten',items:[{name:'Ongedaan maken opdracht',legend:'Druk op ${undo}'},{name:'Opnieuw uitvoeren opdracht',legend:'Druk op ${redo}'},{name:'Vetgedrukt opdracht',legend:'Druk up ${bold}'},{name:'Cursief opdracht',legend:'Druk op ${italic}'},{name:'Onderstrepen opdracht',legend:'Druk op ${underline}'},{name:'Link opdracht',legend:'Druk op ${link}'},{name:'Werkbalk inklappen opdracht',legend:'Druk op ${toolbarCollapse}'},{name:'Toegankelijkheidshulp',legend:'Druk op ${a11yHelp}'}]}]}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/no.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/no.js
index 6208999..0ff46ce 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/no.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/no.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('a11yhelp','no',{accessibilityHelp:{title:'Instruksjoner for tilgjengelighet',contents:'Innhold for hjelp. Trykk ESC for å lukke denne dialogen.',legend:[{name:'Generelt',items:[{name:'Verktøylinje for editor',legend:'Trykk ${toolbarFocus} for å navigere til verktøylinjen. Flytt til neste og forrige verktøylinjegruppe med TAB og SHIFT-TAB. Flytt til neste og forrige verktøylinjeknapp med HØYRE PILTAST og VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å aktivere verktøylinjeknappen.'},{name:'Dialog for editor',legend:'Mens du er i en dialog, trykk TAB for å navigere til neste dialogfelt, press SHIFT + TAB for å flytte til forrige felt, trykk ENTER for å akseptere dialogen, trykk ESC for å avbryte dialogen. For dialoger med flere faner, trykk ALT + F10 for å navigere til listen over faner. Gå til neste fane med TAB eller HØYRE PILTAST. Gå til forrige fane med SHIFT + TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge fanen.'},{name:'Kontekstmeny for editor',legend:'Trykk ${contextMenu} eller MENYKNAPP for å åpne kontekstmeny. Gå til neste alternativ i menyen med TAB eller PILTAST NED. Gå til forrige alternativ med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge menyalternativet. Åpne undermenyen på valgt alternativ med MELLOMROM eller ENTER eller HØYRE PILTAST. Gå tilbake til overordnet menyelement med ESC eller VENSTRE PILTAST. Lukk kontekstmenyen med ESC.'},{name:'Listeboks for editor',legend:'I en listeboks, gå til neste alternativ i listen med TAB eller PILTAST NED. Gå til forrige alternativ i listen med SHIFT + TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge alternativet i listen. Trykk ESC for å lukke listeboksen.'},{name:'Verktøylinje for elementsti',legend:'Trykk ${elementsPathFocus} for å navigere til verktøylinjen som viser elementsti. Gå til neste elementknapp med TAB eller HØYRE PILTAST. Gå til forrige elementknapp med SHIFT+TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge elementet i editoren.'}]},{name:'Kommandoer',items:[{name:'Angre',legend:'Trykk ${undo}'},{name:'Gjør om',legend:'Trykk ${redo}'},{name:'Fet tekst',legend:'Trykk ${bold}'},{name:'Kursiv tekst',legend:'Trykk ${italic}'},{name:'Understreking',legend:'Trykk ${underline}'},{name:'Link',legend:'Trykk ${link}'},{name:'Skjul verktøylinje',legend:'Trykk ${toolbarCollapse}'},{name:'Hjelp for tilgjengelighet',legend:'Trykk ${a11yHelp}'}]}]}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('a11yhelp','no',{accessibilityHelp:{title:'Instruksjoner for tilgjengelighet',contents:'Innhold for hjelp. Trykk ESC for å lukke denne dialogen.',legend:[{name:'Generelt',items:[{name:'Verktøylinje for editor',legend:'Trykk ${toolbarFocus} for å navigere til verktøylinjen. Flytt til neste og forrige verktøylinjegruppe med TAB og SHIFT-TAB. Flytt til neste og forrige verktøylinjeknapp med HØYRE PILTAST og VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å aktivere verktøylinjeknappen.'},{name:'Dialog for editor',legend:'Mens du er i en dialog, trykk TAB for å navigere til neste dialogfelt, press SHIFT + TAB for å flytte til forrige felt, trykk ENTER for å akseptere dialogen, trykk ESC for å avbryte dialogen. For dialoger med flere faner, trykk ALT + F10 for å navigere til listen over faner. Gå til neste fane med TAB eller HØYRE PILTAST. Gå til forrige fane med SHIFT + TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge fanen.'},{name:'Kontekstmeny for editor',legend:'Trykk ${contextMenu} eller MENYKNAPP for å åpne kontekstmeny. Gå til neste alternativ i menyen med TAB eller PILTAST NED. Gå til forrige alternativ med SHIFT+TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge menyalternativet. Åpne undermenyen på valgt alternativ med MELLOMROM eller ENTER eller HØYRE PILTAST. Gå tilbake til overordnet menyelement med ESC eller VENSTRE PILTAST. Lukk kontekstmenyen med ESC.'},{name:'Listeboks for editor',legend:'I en listeboks, gå til neste alternativ i listen med TAB eller PILTAST NED. Gå til forrige alternativ i listen med SHIFT + TAB eller PILTAST OPP. Trykk MELLOMROM eller ENTER for å velge alternativet i listen. Trykk ESC for å lukke listeboksen.'},{name:'Verktøylinje for elementsti',legend:'Trykk ${elementsPathFocus} for å navigere til verktøylinjen som viser elementsti. Gå til neste elementknapp med TAB eller HØYRE PILTAST. Gå til forrige elementknapp med SHIFT+TAB eller VENSTRE PILTAST. Trykk MELLOMROM eller ENTER for å velge elementet i editoren.'}]},{name:'Kommandoer',items:[{name:'Angre',legend:'Trykk ${undo}'},{name:'Gjør om',legend:'Trykk ${redo}'},{name:'Fet tekst',legend:'Trykk ${bold}'},{name:'Kursiv tekst',legend:'Trykk ${italic}'},{name:'Understreking',legend:'Trykk ${underline}'},{name:'Link',legend:'Trykk ${link}'},{name:'Skjul verktøylinje',legend:'Trykk ${toolbarCollapse}'},{name:'Hjelp for tilgjengelighet',legend:'Trykk ${a11yHelp}'}]}]}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/pt-br.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/pt-br.js
index 8e6e28f..e460bd3 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/pt-br.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/pt-br.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('a11yhelp','pt-br',{accessibilityHelp:{title:'Instruções de Acessibilidade',contents:'Conteúdo da Ajuda. Para fechar este diálogo pressione ESC.',legend:[{name:'Geral',items:[{name:'Barra de Ferramentas do Editor',legend:'Pressione ${toolbarFocus} para navegar para a barra de ferramentas. Mova para o anterior ou próximo grupo de ferramentas com TAB e SHIFT-TAB. Mova para o anterior ou próximo botão com SETA PARA DIREITA or SETA PARA ESQUERDA. Pressione ESPAÇO ou ENTER para ativar o botão da barra de ferramentas.'},{name:'Diálogo do Editor',legend:'Dentro de um diálogo, pressione TAB para navegar para o próximo campo, pressione SHIFT + TAB para mover para o campo anterior, pressione ENTER para enviar o diálogo, pressione ESC para cancelar o diálogo. Para diálogos que tem múltiplas abas, pressione ALT + F10 para navegar para a lista de abas, então mova para a próxima aba com SHIFT + TAB ou SETA PARA ESQUERDA. Pressione ESPAÇO ou ENTER para selecionar a aba.'},{name:'Menu de Contexto do Editor',legend:'Pressione ${contextMenu} ou TECLA DE MENU para abrir o menu de contexto, então mova para a próxima opção com TAB ou SETA PARA BAIXO. Mova para a anterior com SHIFT+TAB ou SETA PARA CIMA. Pressione ESPAÇO ou ENTER para selecionar a opção do menu. Abra o submenu da opção atual com ESPAÇO ou ENTER ou SETA PARA DIREITA. Volte para o menu pai com ESC ou SETA PARA ESQUERDA. Feche o menu de contexto com ESC.'},{name:'Caixa de Lista do Editor',legend:'Dentro de uma caixa de lista, mova para o próximo item com TAB ou SETA PARA BAIXO. Mova para o item anterior com SHIFT + TAB ou SETA PARA CIMA. Pressione ESPAÇO ou ENTER para selecionar uma opção na lista. Pressione ESC para fechar a caixa de lista.'},{name:'Barra de Caminho do Elementos do Editor',legend:'Pressione ${elementsPathFocus} para a barra de caminho dos elementos. Mova para o próximo botão de elemento com TAB ou SETA PARA DIREITA. Mova para o botão anterior com SHIFT+TAB ou SETA PARA ESQUERDA. Pressione ESPAÇO ou ENTER para selecionar o elemento no editor.'}]},{name:'Comandos',items:[{name:' Comando Desfazer',legend:'Pressione ${undo}'},{name:' Comando Refazer',legend:'Pressione ${redo}'},{name:' Comando Negrito',legend:'Pressione ${bold}'},{name:' Comando Itálico',legend:'Pressione ${italic}'},{name:' Comando Sublinhado',legend:'Pressione ${underline}'},{name:' Comando Link',legend:'Pressione ${link}'},{name:' Comando Fechar Barra de Ferramentas',legend:'Pressione ${toolbarCollapse}'},{name:' Ajuda de Acessibilidade',legend:'Pressione ${a11yHelp}'}]}]}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('a11yhelp','pt-br',{accessibilityHelp:{title:'Instruções de Acessibilidade',contents:'Conteúdo da Ajuda. Para fechar este diálogo pressione ESC.',legend:[{name:'Geral',items:[{name:'Barra de Ferramentas do Editor',legend:'Pressione ${toolbarFocus} para navegar para a barra de ferramentas. Mova para o anterior ou próximo grupo de ferramentas com TAB e SHIFT-TAB. Mova para o anterior ou próximo botão com SETA PARA DIREITA or SETA PARA ESQUERDA. Pressione ESPAÇO ou ENTER para ativar o botão da barra de ferramentas.'},{name:'Diálogo do Editor',legend:'Dentro de um diálogo, pressione TAB para navegar para o próximo campo, pressione SHIFT + TAB para mover para o campo anterior, pressione ENTER para enviar o diálogo, pressione ESC para cancelar o diálogo. Para diálogos que tem múltiplas abas, pressione ALT + F10 para navegar para a lista de abas, então mova para a próxima aba com SHIFT + TAB ou SETA PARA ESQUERDA. Pressione ESPAÇO ou ENTER para selecionar a aba.'},{name:'Menu de Contexto do Editor',legend:'Pressione ${contextMenu} ou TECLA DE MENU para abrir o menu de contexto, então mova para a próxima opção com TAB ou SETA PARA BAIXO. Mova para a anterior com SHIFT+TAB ou SETA PARA CIMA. Pressione ESPAÇO ou ENTER para selecionar a opção do menu. Abra o submenu da opção atual com ESPAÇO ou ENTER ou SETA PARA DIREITA. Volte para o menu pai com ESC ou SETA PARA ESQUERDA. Feche o menu de contexto com ESC.'},{name:'Caixa de Lista do Editor',legend:'Dentro de uma caixa de lista, mova para o próximo item com TAB ou SETA PARA BAIXO. Mova para o item anterior com SHIFT + TAB ou SETA PARA CIMA. Pressione ESPAÇO ou ENTER para selecionar uma opção na lista. Pressione ESC para fechar a caixa de lista.'},{name:'Barra de Caminho do Elementos do Editor',legend:'Pressione ${elementsPathFocus} para a barra de caminho dos elementos. Mova para o próximo botão de elemento com TAB ou SETA PARA DIREITA. Mova para o botão anterior com SHIFT+TAB ou SETA PARA ESQUERDA. Pressione ESPAÇO ou ENTER para selecionar o elemento no editor.'}]},{name:'Comandos',items:[{name:' Comando Desfazer',legend:'Pressione ${undo}'},{name:' Comando Refazer',legend:'Pressione ${redo}'},{name:' Comando Negrito',legend:'Pressione ${bold}'},{name:' Comando Itálico',legend:'Pressione ${italic}'},{name:' Comando Sublinhado',legend:'Pressione ${underline}'},{name:' Comando Link',legend:'Pressione ${link}'},{name:' Comando Fechar Barra de Ferramentas',legend:'Pressione ${toolbarCollapse}'},{name:' Ajuda de Acessibilidade',legend:'Pressione ${a11yHelp}'}]}]}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/ro.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/ro.js
index c68e128..d43e0ee 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/ro.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/ro.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('a11yhelp','ro',{accessibilityHelp:{title:'Instrucțiuni de accesibilitate',contents:'Cuprins. Pentru a închide acest dialog, apăsați tasta ESC.',legend:[{name:'General',items:[{name:'Editează bara.',legend:'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.'},{name:'Dialog editor',legend:'Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page.'},{name:'Editor meniu contextual',legend:'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.'},{name:'Editor List Box',legend:'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.'},{name:'Editor Element Path Bar',legend:'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.'}]},{name:'Commands',items:[{name:' Undo command',legend:'Press ${undo}'},{name:' Redo command',legend:'Press ${redo}'},{name:' Bold command',legend:'Press ${bold}'},{name:' Italic command',legend:'Press ${italic}'},{name:' Underline command',legend:'Press ${underline}'},{name:' Link command',legend:'Press ${link}'},{name:' Toolbar Collapse command',legend:'Press ${toolbarCollapse}'},{name:' Accessibility Help',legend:'Press ${a11yHelp}'}]}]}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('a11yhelp','ro',{accessibilityHelp:{title:'Instrucțiuni de accesibilitate',contents:'Cuprins. Pentru a închide acest dialog, apăsați tasta ESC.',legend:[{name:'General',items:[{name:'Editează bara.',legend:'Press ${toolbarFocus} to navigate to the toolbar. Move to the next and previous toolbar group with TAB and SHIFT-TAB. Move to the next and previous toolbar button with RIGHT ARROW or LEFT ARROW. Press SPACE or ENTER to activate the toolbar button.'},{name:'Dialog editor',legend:'Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page.'},{name:'Editor meniu contextual',legend:'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.'},{name:'Editor List Box',legend:'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.'},{name:'Editor Element Path Bar',legend:'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.'}]},{name:'Commands',items:[{name:' Undo command',legend:'Press ${undo}'},{name:' Redo command',legend:'Press ${redo}'},{name:' Bold command',legend:'Press ${bold}'},{name:' Italic command',legend:'Press ${italic}'},{name:' Underline command',legend:'Press ${underline}'},{name:' Link command',legend:'Press ${link}'},{name:' Toolbar Collapse command',legend:'Press ${toolbarCollapse}'},{name:' Accessibility Help',legend:'Press ${a11yHelp}'}]}]}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/tr.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/tr.js
index a733888..3636384 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/tr.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/tr.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('a11yhelp','tr',{accessibilityHelp:{title:'Erişilebilirlik Talimatları',contents:'Yardım içeriği. Bu pencereyi kapatmak için ESC tuşuna basın.',legend:[{name:'Genel',items:[{name:'Araç Çubuğu Editörü',legend:'Araç çubuğunda gezinmek için ${toolbarFocus} basın. TAB ve SHIFT-TAB ile önceki ve sonraki araç çubuğu grubuna taşıyın. SAĞ OK veya SOL OK ile önceki ve sonraki bir araç çubuğu düğmesini hareket ettirin. SPACE tuşuna basın veya araç çubuğu düğmesini etkinleştirmek için ENTER tuşna basın.'},{name:'Dialog Editörü',legend:'Dialog penceresi içinde, sonraki iletişim alanına gitmek için SEKME tuşuna basın, önceki alana geçmek için SHIFT + TAB tuşuna basın, pencereyi göndermek için ENTER tuşuna basın, dialog penceresini iptal etmek için ESC tuşuna basın. Birden çok sekme sayfaları olan diyalogların, sekme listesine gitmek için ALT + F10 tuşlarına basın. Sonra TAB veya SAĞ OK sonraki sekmeye taşıyın. SHIFT + TAB veya SOL OK ile önceki sekmeye geçin. Sekme sayfayı seçmek için SPACE veya ENTER tuşuna basın.'},{name:'İçerik Menü Editörü',legend:"İçerik menüsünü açmak için ${contextMenu} veya UYGULAMA TUŞU'na basın. Daha sonra SEKME veya AŞAĞI OK ile bir sonraki menü seçeneği taşıyın. SHIFT + TAB veya YUKARI OK ile önceki seçeneğe gider. Menü seçeneğini seçmek için SPACE veya ENTER tuşuna basın. Seçili seçeneğin alt menüsünü SPACE ya da ENTER veya SAĞ OK açın. Üst menü öğesini geçmek için ESC veya SOL OK ile geri dönün. ESC ile bağlam menüsünü kapatın."},{name:'Liste Kutusu Editörü',legend:'Liste kutusu içinde, bir sonraki liste öğesine SEKME VEYA AŞAĞI OK ile taşıyın. SHIFT + TAB veya YUKARI önceki liste öğesi taşıyın. Liste seçeneği seçmek için SPACE veya ENTER tuşuna basın. Liste kutusunu kapatmak için ESC tuşuna basın.'},{name:'Element Yol Çubuğu Editörü',legend:'Elementlerin yol çubuğunda gezinmek için ${ElementsPathFocus} basın. SEKME veya SAĞ OK ile sonraki element düğmesine taşıyın. SHIFT + TAB veya SOL OK önceki düğmeye hareket ettirin. Editör içindeki elementi seçmek için ENTER veya SPACE tuşuna basın.'}]},{name:'Komutlar',items:[{name:'Komutu geri al',legend:'${undo} basın'},{name:' Tekrar komutu uygula',legend:'${redo} basın'},{name:' Kalın komut',legend:'${bold} basın'},{name:' İtalik komutu',legend:'${italic} basın'},{name:' Alttan çizgi komutu',legend:'${underline} basın'},{name:' Bağlantı komutu',legend:'${link} basın'},{name:' Araç çubuğu Toplama komutu',legend:'${toolbarCollapse} basın'},{name:'Erişilebilirlik Yardımı',legend:'${a11yHelp} basın'}]}]}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('a11yhelp','tr',{accessibilityHelp:{title:'Erişilebilirlik Talimatları',contents:'Yardım içeriği. Bu pencereyi kapatmak için ESC tuşuna basın.',legend:[{name:'Genel',items:[{name:'Araç Çubuğu Editörü',legend:'Araç çubuğunda gezinmek için ${toolbarFocus} basın. TAB ve SHIFT-TAB ile önceki ve sonraki araç çubuğu grubuna taşıyın. SAĞ OK veya SOL OK ile önceki ve sonraki bir araç çubuğu düğmesini hareket ettirin. SPACE tuşuna basın veya araç çubuğu düğmesini etkinleştirmek için ENTER tuşna basın.'},{name:'Dialog Editörü',legend:'Dialog penceresi içinde, sonraki iletişim alanına gitmek için SEKME tuşuna basın, önceki alana geçmek için SHIFT + TAB tuşuna basın, pencereyi göndermek için ENTER tuşuna basın, dialog penceresini iptal etmek için ESC tuşuna basın. Birden çok sekme sayfaları olan diyalogların, sekme listesine gitmek için ALT + F10 tuşlarına basın. Sonra TAB veya SAĞ OK sonraki sekmeye taşıyın. SHIFT + TAB veya SOL OK ile önceki sekmeye geçin. Sekme sayfayı seçmek için SPACE veya ENTER tuşuna basın.'},{name:'İçerik Menü Editörü',legend:"İçerik menüsünü açmak için ${contextMenu} veya UYGULAMA TUŞU'na basın. Daha sonra SEKME veya AŞAĞI OK ile bir sonraki menü seçeneği taşıyın. SHIFT + TAB veya YUKARI OK ile önceki seçeneğe gider. Menü seçeneğini seçmek için SPACE veya ENTER tuşuna basın. Seçili seçeneğin alt menüsünü SPACE ya da ENTER veya SAĞ OK açın. Üst menü öğesini geçmek için ESC veya SOL OK ile geri dönün. ESC ile bağlam menüsünü kapatın."},{name:'Liste Kutusu Editörü',legend:'Liste kutusu içinde, bir sonraki liste öğesine SEKME VEYA AŞAĞI OK ile taşıyın. SHIFT + TAB veya YUKARI önceki liste öğesi taşıyın. Liste seçeneği seçmek için SPACE veya ENTER tuşuna basın. Liste kutusunu kapatmak için ESC tuşuna basın.'},{name:'Element Yol Çubuğu Editörü',legend:'Elementlerin yol çubuğunda gezinmek için ${ElementsPathFocus} basın. SEKME veya SAĞ OK ile sonraki element düğmesine taşıyın. SHIFT + TAB veya SOL OK önceki düğmeye hareket ettirin. Editör içindeki elementi seçmek için ENTER veya SPACE tuşuna basın.'}]},{name:'Komutlar',items:[{name:'Komutu geri al',legend:'${undo} basın'},{name:' Tekrar komutu uygula',legend:'${redo} basın'},{name:' Kalın komut',legend:'${bold} basın'},{name:' İtalik komutu',legend:'${italic} basın'},{name:' Alttan çizgi komutu',legend:'${underline} basın'},{name:' Bağlantı komutu',legend:'${link} basın'},{name:' Araç çubuğu Toplama komutu',legend:'${toolbarCollapse} basın'},{name:'Erişilebilirlik Yardımı',legend:'${a11yHelp} basın'}]}]}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/ug.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/ug.js
index e37e8d2..0a7f37f 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/ug.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/ug.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('a11yhelp','ug',{accessibilityHelp:{title:'قوشۇمچە چۈشەندۈرۈش',contents:'ياردەم مەزمۇنى. بۇ سۆزلەشكۈنى ياپماقچى بولسىڭىز ESC نى بېسىڭ.',legend:[{name:'ئادەتتىكى',items:[{name:'قورال بالداق تەھرىر',legend:'${toolbarFocus} بېسىلسا قورال بالداققا يېتەكلەيدۇ، TAB ياكى SHIFT+TAB ئارقىلىق قورال بالداق گۇرۇپپىسى تاللىنىدۇ، ئوڭ سول يا ئوقتا توپچا تاللىنىدۇ، بوشلۇق ياكى Enter كۇنۇپكىسىدا تاللانغان توپچىنى قوللىنىدۇ.'},{name:'تەھرىرلىگۈچ سۆزلەشكۈسى',legend:'Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page.'},{name:'تەھرىرلىگۈچ تىل مۇھىت تىزىملىكى',legend:'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.'},{name:'تەھرىرلىگۈچ تىزىمى',legend:'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.'},{name:'تەھرىرلىگۈچ ئېلېمېنت يول بالداق',legend:'${elementsPathFocus} بېسىلسا ئېلېمېنت يول بالداققا يېتەكلەيدۇ، TAB ياكى ئوڭ يا ئوقتا كېيىنكى ئېلېمېنت تاللىنىدۇ، SHIFT+TAB ياكى سول يا ئوقتا ئالدىنقى ئېلېمېنت تاللىنىدۇ، بوشلۇق ياكى Enter كۇنۇپكىسىدا تەھرىرلىگۈچتىكى ئېلېمېنت تاللىنىدۇ.'}]},{name:'بۇيرۇق',items:[{name:'بۇيرۇقتىن يېنىۋال',legend:'${undo} نى بېسىڭ'},{name:'قايتىلاش بۇيرۇقى',legend:'${redo} نى بېسىڭ'},{name:'توملىتىش بۇيرۇقى',legend:'${bold} نى بېسىڭ'},{name:'يانتۇ بۇيرۇقى',legend:'${italic} نى بېسىڭ'},{name:'ئاستى سىزىق بۇيرۇقى',legend:'${underline} نى بېسىڭ'},{name:'ئۇلانما بۇيرۇقى',legend:'${link} نى بېسىڭ'},{name:'قورال بالداق قاتلاش بۇيرۇقى',legend:'${toolbarCollapse} نى بېسىڭ'},{name:'توسالغۇسىز لايىھە چۈشەندۈرۈشى',legend:'${a11yHelp} نى بېسىڭ'}]}]}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('a11yhelp','ug',{accessibilityHelp:{title:'قوشۇمچە چۈشەندۈرۈش',contents:'ياردەم مەزمۇنى. بۇ سۆزلەشكۈنى ياپماقچى بولسىڭىز ESC نى بېسىڭ.',legend:[{name:'ئادەتتىكى',items:[{name:'قورال بالداق تەھرىر',legend:'${toolbarFocus} بېسىلسا قورال بالداققا يېتەكلەيدۇ، TAB ياكى SHIFT+TAB ئارقىلىق قورال بالداق گۇرۇپپىسى تاللىنىدۇ، ئوڭ سول يا ئوقتا توپچا تاللىنىدۇ، بوشلۇق ياكى Enter كۇنۇپكىسىدا تاللانغان توپچىنى قوللىنىدۇ.'},{name:'تەھرىرلىگۈچ سۆزلەشكۈسى',legend:'Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page.'},{name:'تەھرىرلىگۈچ تىل مۇھىت تىزىملىكى',legend:'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.'},{name:'تەھرىرلىگۈچ تىزىمى',legend:'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.'},{name:'تەھرىرلىگۈچ ئېلېمېنت يول بالداق',legend:'${elementsPathFocus} بېسىلسا ئېلېمېنت يول بالداققا يېتەكلەيدۇ، TAB ياكى ئوڭ يا ئوقتا كېيىنكى ئېلېمېنت تاللىنىدۇ، SHIFT+TAB ياكى سول يا ئوقتا ئالدىنقى ئېلېمېنت تاللىنىدۇ، بوشلۇق ياكى Enter كۇنۇپكىسىدا تەھرىرلىگۈچتىكى ئېلېمېنت تاللىنىدۇ.'}]},{name:'بۇيرۇق',items:[{name:'بۇيرۇقتىن يېنىۋال',legend:'${undo} نى بېسىڭ'},{name:'قايتىلاش بۇيرۇقى',legend:'${redo} نى بېسىڭ'},{name:'توملىتىش بۇيرۇقى',legend:'${bold} نى بېسىڭ'},{name:'يانتۇ بۇيرۇقى',legend:'${italic} نى بېسىڭ'},{name:'ئاستى سىزىق بۇيرۇقى',legend:'${underline} نى بېسىڭ'},{name:'ئۇلانما بۇيرۇقى',legend:'${link} نى بېسىڭ'},{name:'قورال بالداق قاتلاش بۇيرۇقى',legend:'${toolbarCollapse} نى بېسىڭ'},{name:'توسالغۇسىز لايىھە چۈشەندۈرۈشى',legend:'${a11yHelp} نى بېسىڭ'}]}]}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/vi.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/vi.js
index 94b3381..d3c9f52 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/vi.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/vi.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('a11yhelp','vi',{accessibilityHelp:{title:'Accessibility Instructions',contents:'Nội dung Hỗ trợ. Nhấn ESC để đóng hộp thoại.',legend:[{name:'Chung',items:[{name:'Thanh công cụ soạn th',legend:'Nhấn ${toolbarFocus} để điều hướng đến thanh công cụ. Nhấn TAB và SHIFT-TAB để chuyển đến nhóm thanh công cụ khác. Nhấn MŨI TÊN PHẢI hoặc MŨI TÊN TRÁI để chuyển sang nút khác trên thanh công cụ. Nhấn PHÍM CÁCH hoặc ENTER để kích hoạt nút trên thanh công c.'},{name:'Hộp thoại Biên t',legend:'Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page.'},{name:'Trình đơn Ngữ cảnh cBộ soạn thảo',legend:'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.'},{name:'Editor List Box',legend:'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.'},{name:'Editor Element Path Bar',legend:'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.'}]},{name:'Commands',items:[{name:' Undo command',legend:'Press ${undo}'},{name:' Redo command',legend:'Press ${redo}'},{name:' Bold command',legend:'Press ${bold}'},{name:' Italic command',legend:'Press ${italic}'},{name:' Underline command',legend:'Press ${underline}'},{name:' Link command',legend:'Press ${link}'},{name:' Toolbar Collapse command',legend:'Press ${toolbarCollapse}'},{name:' Accessibility Help',legend:'Press ${a11yHelp}'}]}]}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('a11yhelp','vi',{accessibilityHelp:{title:'Accessibility Instructions',contents:'Nội dung Hỗ trợ. Nhấn ESC để đóng hộp thoại.',legend:[{name:'Chung',items:[{name:'Thanh công cụ soạn th',legend:'Nhấn ${toolbarFocus} để điều hướng đến thanh công cụ. Nhấn TAB và SHIFT-TAB để chuyển đến nhóm thanh công cụ khác. Nhấn MŨI TÊN PHẢI hoặc MŨI TÊN TRÁI để chuyển sang nút khác trên thanh công cụ. Nhấn PHÍM CÁCH hoặc ENTER để kích hoạt nút trên thanh công c.'},{name:'Hộp thoại Biên t',legend:'Inside a dialog, press TAB to navigate to next dialog field, press SHIFT + TAB to move to previous field, press ENTER to submit dialog, press ESC to cancel dialog. For dialogs that have multiple tab pages, press ALT + F10 to navigate to tab-list. Then move to next tab with TAB OR RIGTH ARROW. Move to previous tab with SHIFT + TAB or LEFT ARROW. Press SPACE or ENTER to select the tab page.'},{name:'Trình đơn Ngữ cảnh cBộ soạn thảo',legend:'Press ${contextMenu} or APPLICATION KEY to open context-menu. Then move to next menu option with TAB or DOWN ARROW. Move to previous option with SHIFT+TAB or UP ARROW. Press SPACE or ENTER to select the menu option. Open sub-menu of current option with SPACE or ENTER or RIGHT ARROW. Go back to parent menu item with ESC or LEFT ARROW. Close context menu with ESC.'},{name:'Editor List Box',legend:'Inside a list-box, move to next list item with TAB OR DOWN ARROW. Move to previous list item with SHIFT + TAB or UP ARROW. Press SPACE or ENTER to select the list option. Press ESC to close the list-box.'},{name:'Editor Element Path Bar',legend:'Press ${elementsPathFocus} to navigate to the elements path bar. Move to next element button with TAB or RIGHT ARROW. Move to previous button with SHIFT+TAB or LEFT ARROW. Press SPACE or ENTER to select the element in editor.'}]},{name:'Commands',items:[{name:' Undo command',legend:'Press ${undo}'},{name:' Redo command',legend:'Press ${redo}'},{name:' Bold command',legend:'Press ${bold}'},{name:' Italic command',legend:'Press ${italic}'},{name:' Underline command',legend:'Press ${underline}'},{name:' Link command',legend:'Press ${link}'},{name:' Toolbar Collapse command',legend:'Press ${toolbarCollapse}'},{name:' Accessibility Help',legend:'Press ${a11yHelp}'}]}]}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/zh-cn.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/zh-cn.js
index 29cec26..5cc8222 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/zh-cn.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/a11yhelp/lang/zh-cn.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('a11yhelp','zh-cn',{accessibilityHelp:{title:'辅助说明',contents:'帮助内容。要关闭此对话框请按 ESC 键。',legend:[{name:'常规',items:[{name:'编辑器工具栏',legend:'按 ${toolbarFocus} 以导航到工具栏,使用 TAB 键或 SHIFT+TAB 组合键以选择工具栏组,使用左右箭头键以选择按钮,按空格键或回车键以应用选中的按钮。'},{name:'编辑器对话框',legend:'在对话框内,TAB键移动到下一个字段,SHIFT + TAB 移动到上一个字段,ENTER键提交对话框,ESC键取消对话框。对于有多标签的对话框,用ALT + F10来移到标签列表。然后用TAB键或者向右箭头来移动到下一个标签;SHIFT + TAB或者向左箭头移动到上一个标签。用SPACE或者ENTER选择标签。'},{name:'编辑器上下文菜单',legend:'用 ${contextMenu}或者 应用程序键 打开上下文菜单。然后用TAB键或者向下箭头来移动到下一个菜单项;SHIFT + TAB或者向上箭头移动到上一个菜单项。用SPACE或者ENTER选择菜单项。用SPACE,ENTER或者向右箭头打开子菜单。返回菜单用ESC键或者向左箭头。用ESC关闭上下文菜单。'},{name:'编辑器列表框',legend:'在列表框中,移到下一列表项用TAB键或者向下箭头。移到上一列表项用SHIFT + TAB或者向上箭头,用SPACE或者ENTER选择列表项。用ESC收起列表框。'},{name:'编辑器元素路径栏',legend:'按 ${elementsPathFocus} 以导航到元素路径栏,使用 TAB 键或右箭头键选择下一个元素,使用 SHIFT+TAB 组合键或左箭头键选择上一个元素,按空格键或回车键以选定编辑器里的元素。'}]},{name:'命令',items:[{name:' 撤消命令',legend:'按 ${undo}'},{name:' 重做命令',legend:'按 ${redo}'},{name:' 加粗命令',legend:'按 ${bold}'},{name:' 倾斜命令',legend:'按 ${italic}'},{name:' 下划线命令',legend:'按 ${underline}'},{name:' 链接命令',legend:'按 ${link}'},{name:' 工具栏折叠命令',legend:'按 ${toolbarCollapse}'},{name:' 无障碍设计说明',legend:'按 ${a11yHelp}'}]}]}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('a11yhelp','zh-cn',{accessibilityHelp:{title:'辅助说明',contents:'帮助内容。要关闭此对话框请按 ESC 键。',legend:[{name:'常规',items:[{name:'编辑器工具栏',legend:'按 ${toolbarFocus} 以导航到工具栏,使用 TAB 键或 SHIFT+TAB 组合键以选择工具栏组,使用左右箭头键以选择按钮,按空格键或回车键以应用选中的按钮。'},{name:'编辑器对话框',legend:'在对话框内,TAB键移动到下一个字段,SHIFT + TAB 移动到上一个字段,ENTER键提交对话框,ESC键取消对话框。对于有多标签的对话框,用ALT + F10来移到标签列表。然后用TAB键或者向右箭头来移动到下一个标签;SHIFT + TAB或者向左箭头移动到上一个标签。用SPACE或者ENTER选择标签。'},{name:'编辑器上下文菜单',legend:'用 ${contextMenu}或者 应用程序键 打开上下文菜单。然后用TAB键或者向下箭头来移动到下一个菜单项;SHIFT + TAB或者向上箭头移动到上一个菜单项。用SPACE或者ENTER选择菜单项。用SPACE,ENTER或者向右箭头打开子菜单。返回菜单用ESC键或者向左箭头。用ESC关闭上下文菜单。'},{name:'编辑器列表框',legend:'在列表框中,移到下一列表项用TAB键或者向下箭头。移到上一列表项用SHIFT + TAB或者向上箭头,用SPACE或者ENTER选择列表项。用ESC收起列表框。'},{name:'编辑器元素路径栏',legend:'按 ${elementsPathFocus} 以导航到元素路径栏,使用 TAB 键或右箭头键选择下一个元素,使用 SHIFT+TAB 组合键或左箭头键选择上一个元素,按空格键或回车键以选定编辑器里的元素。'}]},{name:'命令',items:[{name:' 撤消命令',legend:'按 ${undo}'},{name:' 重做命令',legend:'按 ${redo}'},{name:' 加粗命令',legend:'按 ${bold}'},{name:' 倾斜命令',legend:'按 ${italic}'},{name:' 下划线命令',legend:'按 ${underline}'},{name:' 链接命令',legend:'按 ${link}'},{name:' 工具栏折叠命令',legend:'按 ${toolbarCollapse}'},{name:' 无障碍设计说明',legend:'按 ${a11yHelp}'}]}]}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/about/dialogs/about.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/about/dialogs/about.js
index 77c1334..53c0103 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/about/dialogs/about.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/about/dialogs/about.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.dialog.add('about',function(a){var b=a.lang.about;return{title:CKEDITOR.env.ie?b.dlgTitle:b.title,minWidth:390,minHeight:230,contents:[{id:'tab1',label:'',title:'',expand:true,padding:0,elements:[{type:'html',html:'<style type="text/css">.cke_about_container{color:#000 !important;padding:10px 10px 0;margin-top:5px}.cke_about_container p{margin: 0 0 10px;}.cke_about_container .cke_about_logo{height:81px;background-color:#fff;background-image:url('+CKEDITOR.plugins.get('about').path+'dialogs/logo_ckeditor.png);'+'background-position:center; '+'background-repeat:no-repeat;'+'margin-bottom:10px;'+'}'+'.cke_about_container a'+'{'+'cursor:pointer !important;'+'color:blue !important;'+'text-decoration:underline !important;'+'}'+'</style>'+'<div class="cke_about_container">'+'<div class="cke_about_logo"></div>'+'<p>'+'CKEditor '+CKEDITOR.version+' (revision '+CKEDITOR.revision+')<br>'+'<a href="http://ckeditor.com/">http://ckeditor.com</a>'+'</p>'+'<p>'+b.help.replace('$1','<a href="http://docs.cksource.com/CKEditor_3.x/Users_Guide/Quick_Reference">'+b.userGuide+'</a>')+'</p>'+'<p>'+b.moreInfo+'<br>'+'<a href="http://ckeditor.com/license">http://ckeditor.com/license</a>'+'</p>'+'<p>'+b.copy.replace('$1','<a href="http://cksource.com/">CKSource</a> - Frederico Knabben')+'</p>'+'</div>'}]}],buttons:[CKEDITOR.dialog.cancelButton]};});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.dialog.add('about',function(a){var b=a.lang.about;return{title:CKEDITOR.env.ie?b.dlgTitle:b.title,minWidth:390,minHeight:230,contents:[{id:'tab1',label:'',title:'',expand:true,padding:0,elements:[{type:'html',html:'<style type="text/css">.cke_about_container{color:#000 !important;padding:10px 10px 0;margin-top:5px}.cke_about_container p{margin: 0 0 10px;}.cke_about_container .cke_about_logo{height:81px;background-color:#fff;background-image:url('+CKEDITOR.plugins.get('about').path+'dialogs/logo_ckeditor.png);'+'background-position:center; '+'background-repeat:no-repeat;'+'margin-bottom:10px;'+'}'+'.cke_about_container a'+'{'+'cursor:pointer !important;'+'color:blue !important;'+'text-decoration:underline !important;'+'}'+'</style>'+'<div class="cke_about_container">'+'<div class="cke_about_logo"></div>'+'<p>'+'CKEditor '+CKEDITOR.version+' (revision '+CKEDITOR.revision+')<br>'+'<a href="http://ckeditor.com/">http://ckeditor.com</a>'+'</p>'+'<p>'+b.help.replace('$1','<a href="http://docs.cksource.com/CKEditor_3.x/Users_Guide/Quick_Reference">'+b.userGuide+'</a>')+'</p>'+'<p>'+b.moreInfo+'<br>'+'<a href="http://ckeditor.com/license">http://ckeditor.com/license</a>'+'</p>'+'<p>'+b.copy.replace('$1','<a href="http://cksource.com/">CKSource</a> - Frederico Knabben')+'</p>'+'</div>'}]}],buttons:[CKEDITOR.dialog.cancelButton]};});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/adobeair/plugin.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/adobeair/plugin.js
index b312e93..47ef6f4 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/adobeair/plugin.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/adobeair/plugin.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-(function(){var a=['click','keydown','mousedown','keypress','mouseover','mouseout'];function b(c){var d=c.getElementsByTag('*'),e=d.count(),f;for(var g=0;g<e;g++){f=d.getItem(g);(function(h){for(var i=0;i<a.length;i++)(function(j){var k=h.getAttribute('on'+j);if(h.hasAttribute('on'+j)){h.removeAttribute('on'+j);h.on(j,function(l){var m=/(return\s*)?CKEDITOR\.tools\.callFunction\(([^)]+)\)/.exec(k),n=m&&m[1],o=m&&m[2].split(','),p=/return false;/.test(k);if(o){var q=o.length,r;for(var s=0;s<q;s++){o[s]=r=CKEDITOR.tools.trim(o[s]);var t=r.match(/^(["'])([^"']*?)\1$/);if(t){o[s]=t[2];continue;}if(r.match(/\d+/)){o[s]=parseInt(r,10);continue;}switch(r){case 'this':o[s]=h.$;break;case 'event':o[s]=l.data.$;break;case 'null':o[s]=null;break;}}var u=CKEDITOR.tools.callFunction.apply(window,o);if(n&&u===false)p=1;}if(p)l.data.preventDefault();});}})(a[i]);})(f);}};CKEDITOR.plugins.add('adobeair',{init:function(c){if(!CKEDITOR.env.air)return;c.addCss('body { padding: 8px }');c.on('uiReady',function(){b(c.container);if(c.sharedSpaces)for(var d in c.sharedSpaces)b(c.sharedSpaces[d]);c.on('elementsPathUpdate',function(e){b(e.data.space);});});c.on('contentDom',function(){c.document.on('click',function(d){d.data.preventDefault(true);});});}});CKEDITOR.ui.on('ready',function(c){var d=c.data;if(d._.panel){var e=d._.panel._.panel,f;(function(){if(!e.isLoaded){setTimeout(arguments.callee,30);return;}f=e._.holder;b(f);})();}else if(d instanceof CKEDITOR.dialog)b(d._.element);});})();CKEDITOR.dom.document.prototype.write=CKEDITOR.tools.override(CKEDITOR.dom.document.prototype.write,function(a){function b(c,d,e,f){var g=c.append(d),h=CKEDITOR.htmlParser.fragment.fromHtml(e).children[0].attributes;h&&g.setAttributes(h);f&&g.append(c.getDocument().createText(f));};return function(c,d){if(this.getBody()){var e=this,f=this.getHead();c=c.replace(/(<style[^>]*>)([\s\S]*?)<\/style>/gi,function(g,h,i){b(f,'style',h,i);return '';});c=c.replace(/<base\b[^>]*\/>/i,function(g){b(f,'base',g);return '';});c=c.replace(/<title>([\s\S]*)<\/title>/i,function(g,h){e.$.title=h;return '';});c=c.replace(/<head>([\s\S]*)<\/head>/i,function(g){var h=new CKEDITOR.dom.element('div',e);h.setHtml(g);h.moveChildren(f);return '';});c.replace(/(<body[^>]*>)([\s\S]*)(?=$|<\/body>)/i,function(g,h,i){e.getBody().setHtml(i);var j=CKEDITOR.htmlParser.fragment.fromHtml(h).children[0].attributes;j&&e.getBody().setAttributes(j);});}else a.apply(this,arguments);};});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function(){var a=['click','keydown','mousedown','keypress','mouseover','mouseout'];function b(c){var d=c.getElementsByTag('*'),e=d.count(),f;for(var g=0;g<e;g++){f=d.getItem(g);(function(h){for(var i=0;i<a.length;i++)(function(j){var k=h.getAttribute('on'+j);if(h.hasAttribute('on'+j)){h.removeAttribute('on'+j);h.on(j,function(l){var m=/(return\s*)?CKEDITOR\.tools\.callFunction\(([^)]+)\)/.exec(k),n=m&&m[1],o=m&&m[2].split(','),p=/return false;/.test(k);if(o){var q=o.length,r;for(var s=0;s<q;s++){o[s]=r=CKEDITOR.tools.trim(o[s]);var t=r.match(/^(["'])([^"']*?)\1$/);if(t){o[s]=t[2];continue;}if(r.match(/\d+/)){o[s]=parseInt(r,10);continue;}switch(r){case 'this':o[s]=h.$;break;case 'event':o[s]=l.data.$;break;case 'null':o[s]=null;break;}}var u=CKEDITOR.tools.callFunction.apply(window,o);if(n&&u===false)p=1;}if(p)l.data.preventDefault();});}})(a[i]);})(f);}};CKEDITOR.plugins.add('adobeair',{init:function(c){if(!CKEDITOR.env.air)return;c.addCss('body { padding: 8px }');c.on('uiReady',function(){b(c.container);if(c.sharedSpaces)for(var d in c.sharedSpaces)b(c.sharedSpaces[d]);c.on('elementsPathUpdate',function(e){b(e.data.space);});});c.on('contentDom',function(){c.document.on('click',function(d){d.data.preventDefault(true);});});}});CKEDITOR.ui.on('ready',function(c){var d=c.data;if(d._.panel){var e=d._.panel._.panel,f;(function(){if(!e.isLoaded){setTimeout(arguments.callee,30);return;}f=e._.holder;b(f);})();}else if(d instanceof CKEDITOR.dialog)b(d._.element);});})();CKEDITOR.dom.document.prototype.write=CKEDITOR.tools.override(CKEDITOR.dom.document.prototype.write,function(a){function b(c,d,e,f){var g=c.append(d),h=CKEDITOR.htmlParser.fragment.fromHtml(e).children[0].attributes;h&&g.setAttributes(h);f&&g.append(c.getDocument().createText(f));};return function(c,d){if(this.getBody()){var e=this,f=this.getHead();c=c.replace(/(<style[^>]*>)([\s\S]*?)<\/style>/gi,function(g,h,i){b(f,'style',h,i);return '';});c=c.replace(/<base\b[^>]*\/>/i,function(g){b(f,'base',g);return '';});c=c.replace(/<title>([\s\S]*)<\/title>/i,function(g,h){e.$.title=h;return '';});c=c.replace(/<head>([\s\S]*)<\/head>/i,function(g){var h=new CKEDITOR.dom.element('div',e);h.setHtml(g);h.moveChildren(f);return '';});c.replace(/(<body[^>]*>)([\s\S]*)(?=$|<\/body>)/i,function(g,h,i){e.getBody().setHtml(i);var j=CKEDITOR.htmlParser.fragment.fromHtml(h).children[0].attributes;j&&e.getBody().setAttributes(j);});}else a.apply(this,arguments);};});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/ajax/plugin.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/ajax/plugin.js
index 1c205f0..91e66bf 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/ajax/plugin.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/ajax/plugin.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-(function(){CKEDITOR.plugins.add('ajax',{requires:['xml']});CKEDITOR.ajax=(function(){var a=function(){if(!CKEDITOR.env.ie||location.protocol!='file:')try{return new XMLHttpRequest();}catch(f){}try{return new ActiveXObject('Msxml2.XMLHTTP');}catch(g){}try{return new ActiveXObject('Microsoft.XMLHTTP');}catch(h){}return null;},b=function(f){return f.readyState==4&&(f.status>=200&&f.status<300||f.status==304||f.status===0||f.status==1223);},c=function(f){if(b(f))return f.responseText;return null;},d=function(f){if(b(f)){var g=f.responseXML;return new CKEDITOR.xml(g&&g.firstChild?g:f.responseText);}return null;},e=function(f,g,h){var i=!!g,j=a();if(!j)return null;j.open('GET',f,i);if(i)j.onreadystatechange=function(){if(j.readyState==4){g(h(j));j=null;}};j.send(null);return i?'':h(j);};return{load:function(f,g){return e(f,g,c);},loadXml:function(f,g){return e(f,g,d);}};})();})();
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function(){CKEDITOR.plugins.add('ajax',{requires:['xml']});CKEDITOR.ajax=(function(){var a=function(){if(!CKEDITOR.env.ie||location.protocol!='file:')try{return new XMLHttpRequest();}catch(f){}try{return new ActiveXObject('Msxml2.XMLHTTP');}catch(g){}try{return new ActiveXObject('Microsoft.XMLHTTP');}catch(h){}return null;},b=function(f){return f.readyState==4&&(f.status>=200&&f.status<300||f.status==304||f.status===0||f.status==1223);},c=function(f){if(b(f))return f.responseText;return null;},d=function(f){if(b(f)){var g=f.responseXML;return new CKEDITOR.xml(g&&g.firstChild?g:f.responseText);}return null;},e=function(f,g,h){var i=!!g,j=a();if(!j)return null;j.open('GET',f,i);if(i)j.onreadystatechange=function(){if(j.readyState==4){g(h(j));j=null;}};j.send(null);return i?'':h(j);};return{load:function(f,g){return e(f,g,c);},loadXml:function(f,g){return e(f,g,d);}};})();})();
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/autogrow/plugin.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/autogrow/plugin.js
index e40289b..5afcbcb 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/autogrow/plugin.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/autogrow/plugin.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-(function(){function a(c){var d=c.getStyle('overflow-y'),e=c.getDocument(),f=CKEDITOR.dom.element.createFromHtml('<span style="margin:0;padding:0;border:0;clear:both;width:1px;height:1px;display:block;">'+(CKEDITOR.env.webkit?' ':'')+'</span>',e);e[CKEDITOR.env.ie?'getBody':'getDocumentElement']().append(f);var g=f.getDocumentPosition(e).y+f.$.offsetHeight;f.remove();c.setStyle('overflow-y',d);return g;};var b=function(c){if(!c.window)return;var d=c.document,e=new CKEDITOR.dom.element(d.getWindow().$.frameElement),f=d.getBody(),g=d.getDocumentElement(),h=c.window.getViewPaneSize().height,i=d.$.compatMode=='BackCompat'?f:g,j=a(i);j+=c.config.autoGrow_bottomSpace||0;var k=c.config.autoGrow_minHeight!=undefined?c.config.autoGrow_minHeight:200,l=c.config.autoGrow_maxHeight||Infinity;j=Math.max(j,k);j=Math.min(j,l);if(j!=h){j=c.fire('autoGrow',{currentHeight:h,newHeight:j}).newHeight;c.resize(c.container.getStyle('width'),j,true);}if(i.$.scrollHeight>i.$.clientHeight&&j<l)i.setStyle('overflow-y','hidden');else i.removeStyle('overflow-y');};CKEDITOR.plugins.add('autogrow',{init:function(c){c.addCommand('autogrow',{exec:b,modes:{wysiwyg:1},readOnly:1,canUndo:false,editorFocus:false});var d={contentDom:1,key:1,selectionChange:1,insertElement:1,mode:1};c.config.autoGrow_onStartup&&(d.instanceReady=1);for(var e in d)c.on(e,function(f){var g=c.getCommand('maximize');if(f.editor.mode=='wysiwyg'&&(!g||g.state!=CKEDITOR.TRISTATE_ON))setTimeout(function(){b(f.editor);b(f.editor);},100);});}});})();
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function(){function a(c){var d=c.getStyle('overflow-y'),e=c.getDocument(),f=CKEDITOR.dom.element.createFromHtml('<span style="margin:0;padding:0;border:0;clear:both;width:1px;height:1px;display:block;">'+(CKEDITOR.env.webkit?' ':'')+'</span>',e);e[CKEDITOR.env.ie?'getBody':'getDocumentElement']().append(f);var g=f.getDocumentPosition(e).y+f.$.offsetHeight;f.remove();c.setStyle('overflow-y',d);return g;};var b=function(c){if(!c.window)return;var d=c.document,e=new CKEDITOR.dom.element(d.getWindow().$.frameElement),f=d.getBody(),g=d.getDocumentElement(),h=c.window.getViewPaneSize().height,i=d.$.compatMode=='BackCompat'?f:g,j=a(i);j+=c.config.autoGrow_bottomSpace||0;var k=c.config.autoGrow_minHeight!=undefined?c.config.autoGrow_minHeight:200,l=c.config.autoGrow_maxHeight||Infinity;j=Math.max(j,k);j=Math.min(j,l);if(j!=h){j=c.fire('autoGrow',{currentHeight:h,newHeight:j}).newHeight;c.resize(c.container.getStyle('width'),j,true);}if(i.$.scrollHeight>i.$.clientHeight&&j<l)i.setStyle('overflow-y','hidden');else i.removeStyle('overflow-y');};CKEDITOR.plugins.add('autogrow',{init:function(c){c.addCommand('autogrow',{exec:b,modes:{wysiwyg:1},readOnly:1,canUndo:false,editorFocus:false});var d={contentDom:1,key:1,selectionChange:1,insertElement:1,mode:1};c.config.autoGrow_onStartup&&(d.instanceReady=1);for(var e in d)c.on(e,function(f){var g=c.getCommand('maximize');if(f.editor.mode=='wysiwyg'&&(!g||g.state!=CKEDITOR.TRISTATE_ON))setTimeout(function(){b(f.editor);b(f.editor);},100);});}});})();
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/bbcode/plugin.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/bbcode/plugin.js
index 598a4bb..4186946 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/bbcode/plugin.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/bbcode/plugin.js
@@ -1,9 +1,9 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-(function(){CKEDITOR.on('dialogDefinition',function(r){var s,t=r.data.name,u=r.data.definition;if(t=='link'){u.removeContents('target');u.removeContents('upload');u.removeContents('advanced');s=u.getContents('info');s.remove('emailSubject');s.remove('emailBody');}else if(t=='image'){u.removeContents('advanced');s=u.getContents('Link');s.remove('cmbTarget');s=u.getContents('info');s.remove('txtAlt');s.remove('basic');}});var a={b:'strong',u:'u',i:'em',color:'span',size:'span',quote:'blockquote',code:'code',url:'a',email:'span',img:'span','*':'li',list:'ol'},b={strong:'b',b:'b',u:'u',em:'i',i:'i',code:'code',li:'*'},c={strong:'b',em:'i',u:'u',li:'*',ul:'list',ol:'list',code:'code',a:'link',img:'img',blockquote:'quote'},d={color:'color',size:'font-size'},e={url:'href',email:'mailhref',quote:'cite',list:'listType'},f=CKEDITOR.dtd,g=CKEDITOR.tools.extend({table:1},f.$block,f.$listItem,f.$tableContent,f.$list),h=/\s*(?:;\s*|$)/;function i(r){var s='';for(var t in r){var u=r[t],v=(t+':'+u).replace(h,';');s+=v;}return s;};function j(r){var s={};(r||'').replace(/"/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(t,u,v){s[u.toLowerCase()]=v;});return s;};function k(r){return r.replace(/(?:rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\))/gi,function(s,t,u,v){t=parseInt(t,10).toString(16);u=parseInt(u,10).toString(16);v=parseInt(v,10).toString(16);var w=[t,u,v];for(var x=0;x<w.length;x++)w[x]=String('0'+w[x]).slice(-2);return '#'+w.join('');});};var l={smiley:':)',sad:':(',wink:';)',laugh:':D',cheeky:':P',blush:':*)',surprise:':-o',indecision:':|',angry:'>:(',angel:'o:)',cool:'8-)',devil:'>:-)',crying:';(',kiss:':-*'},m={},n=[];for(var o in l){m[l[o]]=o;n.push(l[o].replace(/\(|\)|\:|\/|\*|\-|\|/g,function(r){return '\\'+r;}));}n=new RegExp(n.join('|'),'g');var p=(function(){var r=[],s={nbsp:'\xa0',shy:'',gt:'>',lt:'<'};for(var t in s)r.push(t);r=new RegExp('&('+r.join('|')+');','g');return function(u){return u.replace(r,function(v,w){return s[w];});};})();CKEDITOR.BBCodeParser=function(){this._={bbcPartsRegex:/(?:\[([^\/\]=]*?)(?:=([^\]]*?))?\])|(?:\[\/([a-z]{1,16})\])/ig};};CKEDITOR.BBCodeParser.prototype={parse:function(r){var B=this;var s,t,u=0;while(s=B._.bbcPartsRegex.exec(r)){var v=s.index;if(v>u){var w=r.substring(u,v);B.onText(w,1);}u=B._.bbcPartsRegex.lastIndex;t=(s[1]||s[3]||'').toLowerCase();if(t&&!a[t]){B.onText(s[0]);continue;}if(s[1]){var x=a[t],y={},z={},A=s[2];if(A){if(t=='list')if(!isNaN(A))A='decimal';else if(/^[a-z]+$/.test(A))A='lower-alpha';
-else if(/^[A-Z]+$/.test(A))A='upper-alpha';if(d[t]){if(t=='size')A+='%';z[d[t]]=A;y.style=i(z);}else if(e[t])y[e[t]]=A;}if(t=='email'||t=='img')y.bbcode=t;B.onTagOpen(x,y,CKEDITOR.dtd.$empty[x]);}else if(s[3])B.onTagClose(a[t]);}if(r.length>u)B.onText(r.substring(u,r.length),1);}};CKEDITOR.htmlParser.fragment.fromBBCode=function(r){var s=new CKEDITOR.BBCodeParser(),t=new CKEDITOR.htmlParser.fragment(),u=[],v=0,w=t,x;function y(D){if(u.length>0)for(var E=0;E<u.length;E++){var F=u[E],G=F.name,H=CKEDITOR.dtd[G],I=w.name&&CKEDITOR.dtd[w.name];if((!I||I[G])&&(!D||!H||H[D]||!CKEDITOR.dtd[D])){F=F.clone();F.parent=w;w=F;u.splice(E,1);E--;}}};function z(D,E){var F=w.children.length,G=F>0&&w.children[F-1],H=!G&&q.getRule(c[w.name],'breakAfterOpen'),I=G&&G.type==CKEDITOR.NODE_ELEMENT&&q.getRule(c[G.name],'breakAfterClose'),J=D&&q.getRule(c[D],E?'breakBeforeClose':'breakBeforeOpen');if(v&&(H||I||J))v--;if(v&&D in g)v++;while(v&&v--)w.children.push(G=new CKEDITOR.htmlParser.element('br'));};function A(D,E){z(D.name,1);E=E||w||t;var F=E.children.length,G=F>0&&E.children[F-1]||null;D.previous=G;D.parent=E;E.children.push(D);if(D.returnPoint){w=D.returnPoint;delete D.returnPoint;}};s.onTagOpen=function(D,E,F){var G=new CKEDITOR.htmlParser.element(D,E);if(CKEDITOR.dtd.$removeEmpty[D]){u.push(G);return;}var H=w.name,I=H&&(CKEDITOR.dtd[H]||(w._.isBlockLike?CKEDITOR.dtd.div:CKEDITOR.dtd.span));if(I&&!I[D]){var J=false,K;if(D==H)A(w,w.parent);else if(D in CKEDITOR.dtd.$listItem){s.onTagOpen('ul',{});K=w;J=true;}else{A(w,w.parent);u.unshift(w);J=true;}if(K)w=K;else w=w.returnPoint||w.parent;if(J){s.onTagOpen.apply(this,arguments);return;}}y(D);z(D);G.parent=w;G.returnPoint=x;x=0;if(G.isEmpty)A(G);else w=G;};s.onTagClose=function(D){for(var E=u.length-1;E>=0;E--){if(D==u[E].name){u.splice(E,1);return;}}var F=[],G=[],H=w;while(H.type&&H.name!=D){if(!H._.isBlockLike)G.unshift(H);F.push(H);H=H.parent;}if(H.type){for(E=0;E<F.length;E++){var I=F[E];A(I,I.parent);}w=H;A(H,H.parent);if(H==w)w=w.parent;u=u.concat(G);}};s.onText=function(D){var E=CKEDITOR.dtd[w.name];if(!E||E['#']){z();y();D.replace(/([\r\n])|[^\r\n]*/g,function(F,G){if(G!==undefined&&G.length)v++;else if(F.length){var H=0;F.replace(n,function(I,J){A(new CKEDITOR.htmlParser.text(F.substring(H,J)),w);A(new CKEDITOR.htmlParser.element('smiley',{desc:m[I]}),w);H=J+I.length;});if(H!=F.length)A(new CKEDITOR.htmlParser.text(F.substring(H,F.length)),w);}});}};s.parse(CKEDITOR.tools.htmlEncode(r));while(w.type){var B=w.parent,C=w;
-A(C,B);w=B;}return t;};CKEDITOR.htmlParser.BBCodeWriter=CKEDITOR.tools.createClass({$:function(){var r=this;r._={output:[],rules:[]};r.setRules('list',{breakBeforeOpen:1,breakAfterOpen:1,breakBeforeClose:1,breakAfterClose:1});r.setRules('*',{breakBeforeOpen:1,breakAfterOpen:0,breakBeforeClose:1,breakAfterClose:0});r.setRules('quote',{breakBeforeOpen:1,breakAfterOpen:0,breakBeforeClose:0,breakAfterClose:1});},proto:{setRules:function(r,s){var t=this._.rules[r];if(t)CKEDITOR.tools.extend(t,s,true);else this._.rules[r]=s;},getRule:function(r,s){return this._.rules[r]&&this._.rules[r][s];},openTag:function(r,s){var u=this;if(r in a){if(u.getRule(r,'breakBeforeOpen'))u.lineBreak(1);u.write('[',r);var t=s.option;t&&u.write('=',t);u.write(']');if(u.getRule(r,'breakAfterOpen'))u.lineBreak(1);}else if(r=='br')u._.output.push('\n');},openTagClose:function(){},attribute:function(){},closeTag:function(r){var s=this;if(r in a){if(s.getRule(r,'breakBeforeClose'))s.lineBreak(1);r!='*'&&s.write('[/',r,']');if(s.getRule(r,'breakAfterClose'))s.lineBreak(1);}},text:function(r){this.write(r);},comment:function(){},lineBreak:function(){var r=this;if(!r._.hasLineBreak&&r._.output.length){r.write('\n');r._.hasLineBreak=1;}},write:function(){this._.hasLineBreak=0;var r=Array.prototype.join.call(arguments,'');this._.output.push(r);},reset:function(){this._.output=[];this._.hasLineBreak=0;},getHtml:function(r){var s=this._.output.join('');if(r)this.reset();return p(s);}}});var q=new CKEDITOR.htmlParser.BBCodeWriter();CKEDITOR.plugins.add('bbcode',{requires:['htmldataprocessor','entities'],beforeInit:function(r){var s=r.config;CKEDITOR.tools.extend(s,{enterMode:CKEDITOR.ENTER_BR,basicEntities:false,entities:false,fillEmptyBlocks:false},true);},init:function(r){var s=r.config;function t(v){var w=CKEDITOR.htmlParser.fragment.fromBBCode(v),x=new CKEDITOR.htmlParser.basicWriter();w.writeHtml(x,u);return x.getHtml(true);};var u=new CKEDITOR.htmlParser.filter();u.addRules({elements:{blockquote:function(v){var w=new CKEDITOR.htmlParser.element('div');w.children=v.children;v.children=[w];var x=v.attributes.cite;if(x){var y=new CKEDITOR.htmlParser.element('cite');y.add(new CKEDITOR.htmlParser.text(x.replace(/^"|"$/g,'')));delete v.attributes.cite;v.children.unshift(y);}},span:function(v){var w;if(w=v.attributes.bbcode){if(w=='img'){v.name='img';v.attributes.src=v.children[0].value;v.children=[];}else if(w=='email'){v.name='a';v.attributes.href='mailto:'+v.children[0].value;}delete v.attributes.bbcode;
-}},ol:function(v){if(v.attributes.listType){if(v.attributes.listType!='decimal')v.attributes.style='list-style-type:'+v.attributes.listType;}else v.name='ul';delete v.attributes.listType;},a:function(v){if(!v.attributes.href)v.attributes.href=v.children[0].value;},smiley:function(v){v.name='img';var w=v.attributes.desc,x=s.smiley_images[CKEDITOR.tools.indexOf(s.smiley_descriptions,w)],y=CKEDITOR.tools.htmlEncode(s.smiley_path+x);v.attributes={src:y,'data-cke-saved-src':y,title:w,alt:w};}}});r.dataProcessor.htmlFilter.addRules({elements:{$:function(v){var w=v.attributes,x=j(w.style),y,z=v.name;if(z in b)z=b[z];else if(z=='span'){if(y=x.color){z='color';y=k(y);}else if(y=x['font-size']){var A=y.match(/(\d+)%$/);if(A){y=A[1];z='size';}}}else if(z=='ol'||z=='ul'){if(y=x['list-style-type']){switch(y){case 'lower-alpha':y='a';break;case 'upper-alpha':y='A';break;}}else if(z=='ol')y=1;z='list';}else if(z=='blockquote'){try{var B=v.children[0],C=v.children[1],D=B.name=='cite'&&B.children[0].value;if(D){y='"'+D+'"';v.children=C.children;}}catch(G){}z='quote';}else if(z=='a'){if(y=w.href)if(y.indexOf('mailto:')!==-1){z='email';v.children=[new CKEDITOR.htmlParser.text(y.replace('mailto:',''))];y='';}else{var E=v.children.length==1&&v.children[0];if(E&&E.type==CKEDITOR.NODE_TEXT&&E.value==y)y='';z='url';}}else if(z=='img'){v.isEmpty=0;var F=w['data-cke-saved-src'];if(F&&F.indexOf(r.config.smiley_path)!=-1)return new CKEDITOR.htmlParser.text(l[w.alt]);else v.children=[new CKEDITOR.htmlParser.text(F)];}v.name=z;y&&(v.attributes.option=y);return null;},br:function(v){var w=v.next;if(w&&w.name in g)return false;}}},1);r.dataProcessor.writer=q;r.on('beforeSetMode',function(v){v.removeListener();var w=r._.modes.wysiwyg;w.loadData=CKEDITOR.tools.override(w.loadData,function(x){return function(y){return x.call(this,t(y));};});});},afterInit:function(r){var s;if(r._.elementsPath)if(s=r._.elementsPath.filters)s.push(function(t){var u=t.getName(),v=c[u]||false;if(v=='link'&&t.getAttribute('href').indexOf('mailto:')===0)v='email';else if(u=='span'){if(t.getStyle('font-size'))v='size';else if(t.getStyle('color'))v='color';}else if(v=='img'){var w=t.data('cke-saved-src');if(w&&w.indexOf(r.config.smiley_path)===0)v='smiley';}return v;});}});})();
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function(){CKEDITOR.on('dialogDefinition',function(r){var s,t=r.data.name,u=r.data.definition;if(t=='link'){u.removeContents('target');u.removeContents('upload');u.removeContents('advanced');s=u.getContents('info');s.remove('emailSubject');s.remove('emailBody');}else if(t=='image'){u.removeContents('advanced');s=u.getContents('Link');s.remove('cmbTarget');s=u.getContents('info');s.remove('txtAlt');s.remove('basic');}});var a={b:'strong',u:'u',i:'em',color:'span',size:'span',quote:'blockquote',code:'code',url:'a',email:'span',img:'span','*':'li',list:'ol'},b={strong:'b',b:'b',u:'u',em:'i',i:'i',code:'code',li:'*'},c={strong:'b',em:'i',u:'u',li:'*',ul:'list',ol:'list',code:'code',a:'link',img:'img',blockquote:'quote'},d={color:'color',size:'font-size'},e={url:'href',email:'mailhref',quote:'cite',list:'listType'},f=CKEDITOR.dtd,g=CKEDITOR.tools.extend({table:1},f.$block,f.$listItem,f.$tableContent,f.$list),h=/\s*(?:;\s*|$)/;function i(r){var s='';for(var t in r){var u=r[t],v=(t+':'+u).replace(h,';');s+=v;}return s;};function j(r){var s={};(r||'').replace(/"/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(t,u,v){s[u.toLowerCase()]=v;});return s;};function k(r){return r.replace(/(?:rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\))/gi,function(s,t,u,v){t=parseInt(t,10).toString(16);u=parseInt(u,10).toString(16);v=parseInt(v,10).toString(16);var w=[t,u,v];for(var x=0;x<w.length;x++)w[x]=String('0'+w[x]).slice(-2);return '#'+w.join('');});};var l={smiley:':)',sad:':(',wink:';)',laugh:':D',cheeky:':P',blush:':*)',surprise:':-o',indecision:':|',angry:'>:(',angel:'o:)',cool:'8-)',devil:'>:-)',crying:';(',kiss:':-*'},m={},n=[];for(var o in l){m[l[o]]=o;n.push(l[o].replace(/\(|\)|\:|\/|\*|\-|\|/g,function(r){return '\\'+r;}));}n=new RegExp(n.join('|'),'g');var p=(function(){var r=[],s={nbsp:'\xa0',shy:'',gt:'>',lt:'<'};for(var t in s)r.push(t);r=new RegExp('&('+r.join('|')+');','g');return function(u){return u.replace(r,function(v,w){return s[w];});};})();CKEDITOR.BBCodeParser=function(){this._={bbcPartsRegex:/(?:\[([^\/\]=]*?)(?:=([^\]]*?))?\])|(?:\[\/([a-z]{1,16})\])/ig};};CKEDITOR.BBCodeParser.prototype={parse:function(r){var B=this;var s,t,u=0;while(s=B._.bbcPartsRegex.exec(r)){var v=s.index;if(v>u){var w=r.substring(u,v);B.onText(w,1);}u=B._.bbcPartsRegex.lastIndex;t=(s[1]||s[3]||'').toLowerCase();if(t&&!a[t]){B.onText(s[0]);continue;}if(s[1]){var x=a[t],y={},z={},A=s[2];if(A){if(t=='list')if(!isNaN(A))A='decimal';else if(/^[a-z]+$/.test(A))A='lower-alpha';
+else if(/^[A-Z]+$/.test(A))A='upper-alpha';if(d[t]){if(t=='size')A+='%';z[d[t]]=A;y.style=i(z);}else if(e[t])y[e[t]]=A;}if(t=='email'||t=='img')y.bbcode=t;B.onTagOpen(x,y,CKEDITOR.dtd.$empty[x]);}else if(s[3])B.onTagClose(a[t]);}if(r.length>u)B.onText(r.substring(u,r.length),1);}};CKEDITOR.htmlParser.fragment.fromBBCode=function(r){var s=new CKEDITOR.BBCodeParser(),t=new CKEDITOR.htmlParser.fragment(),u=[],v=0,w=t,x;function y(D){if(u.length>0)for(var E=0;E<u.length;E++){var F=u[E],G=F.name,H=CKEDITOR.dtd[G],I=w.name&&CKEDITOR.dtd[w.name];if((!I||I[G])&&(!D||!H||H[D]||!CKEDITOR.dtd[D])){F=F.clone();F.parent=w;w=F;u.splice(E,1);E--;}}};function z(D,E){var F=w.children.length,G=F>0&&w.children[F-1],H=!G&&q.getRule(c[w.name],'breakAfterOpen'),I=G&&G.type==CKEDITOR.NODE_ELEMENT&&q.getRule(c[G.name],'breakAfterClose'),J=D&&q.getRule(c[D],E?'breakBeforeClose':'breakBeforeOpen');if(v&&(H||I||J))v--;if(v&&D in g)v++;while(v&&v--)w.children.push(G=new CKEDITOR.htmlParser.element('br'));};function A(D,E){z(D.name,1);E=E||w||t;var F=E.children.length,G=F>0&&E.children[F-1]||null;D.previous=G;D.parent=E;E.children.push(D);if(D.returnPoint){w=D.returnPoint;delete D.returnPoint;}};s.onTagOpen=function(D,E,F){var G=new CKEDITOR.htmlParser.element(D,E);if(CKEDITOR.dtd.$removeEmpty[D]){u.push(G);return;}var H=w.name,I=H&&(CKEDITOR.dtd[H]||(w._.isBlockLike?CKEDITOR.dtd.div:CKEDITOR.dtd.span));if(I&&!I[D]){var J=false,K;if(D==H)A(w,w.parent);else if(D in CKEDITOR.dtd.$listItem){s.onTagOpen('ul',{});K=w;J=true;}else{A(w,w.parent);u.unshift(w);J=true;}if(K)w=K;else w=w.returnPoint||w.parent;if(J){s.onTagOpen.apply(this,arguments);return;}}y(D);z(D);G.parent=w;G.returnPoint=x;x=0;if(G.isEmpty)A(G);else w=G;};s.onTagClose=function(D){for(var E=u.length-1;E>=0;E--){if(D==u[E].name){u.splice(E,1);return;}}var F=[],G=[],H=w;while(H.type&&H.name!=D){if(!H._.isBlockLike)G.unshift(H);F.push(H);H=H.parent;}if(H.type){for(E=0;E<F.length;E++){var I=F[E];A(I,I.parent);}w=H;A(H,H.parent);if(H==w)w=w.parent;u=u.concat(G);}};s.onText=function(D){var E=CKEDITOR.dtd[w.name];if(!E||E['#']){z();y();D.replace(/([\r\n])|[^\r\n]*/g,function(F,G){if(G!==undefined&&G.length)v++;else if(F.length){var H=0;F.replace(n,function(I,J){A(new CKEDITOR.htmlParser.text(F.substring(H,J)),w);A(new CKEDITOR.htmlParser.element('smiley',{desc:m[I]}),w);H=J+I.length;});if(H!=F.length)A(new CKEDITOR.htmlParser.text(F.substring(H,F.length)),w);}});}};s.parse(CKEDITOR.tools.htmlEncode(r));while(w.type){var B=w.parent,C=w;
+A(C,B);w=B;}return t;};CKEDITOR.htmlParser.BBCodeWriter=CKEDITOR.tools.createClass({$:function(){var r=this;r._={output:[],rules:[]};r.setRules('list',{breakBeforeOpen:1,breakAfterOpen:1,breakBeforeClose:1,breakAfterClose:1});r.setRules('*',{breakBeforeOpen:1,breakAfterOpen:0,breakBeforeClose:1,breakAfterClose:0});r.setRules('quote',{breakBeforeOpen:1,breakAfterOpen:0,breakBeforeClose:0,breakAfterClose:1});},proto:{setRules:function(r,s){var t=this._.rules[r];if(t)CKEDITOR.tools.extend(t,s,true);else this._.rules[r]=s;},getRule:function(r,s){return this._.rules[r]&&this._.rules[r][s];},openTag:function(r,s){var u=this;if(r in a){if(u.getRule(r,'breakBeforeOpen'))u.lineBreak(1);u.write('[',r);var t=s.option;t&&u.write('=',t);u.write(']');if(u.getRule(r,'breakAfterOpen'))u.lineBreak(1);}else if(r=='br')u._.output.push('\n');},openTagClose:function(){},attribute:function(){},closeTag:function(r){var s=this;if(r in a){if(s.getRule(r,'breakBeforeClose'))s.lineBreak(1);r!='*'&&s.write('[/',r,']');if(s.getRule(r,'breakAfterClose'))s.lineBreak(1);}},text:function(r){this.write(r);},comment:function(){},lineBreak:function(){var r=this;if(!r._.hasLineBreak&&r._.output.length){r.write('\n');r._.hasLineBreak=1;}},write:function(){this._.hasLineBreak=0;var r=Array.prototype.join.call(arguments,'');this._.output.push(r);},reset:function(){this._.output=[];this._.hasLineBreak=0;},getHtml:function(r){var s=this._.output.join('');if(r)this.reset();return p(s);}}});var q=new CKEDITOR.htmlParser.BBCodeWriter();CKEDITOR.plugins.add('bbcode',{requires:['htmldataprocessor','entities'],beforeInit:function(r){var s=r.config;CKEDITOR.tools.extend(s,{enterMode:CKEDITOR.ENTER_BR,basicEntities:false,entities:false,fillEmptyBlocks:false},true);},init:function(r){var s=r.config;function t(v){var w=CKEDITOR.htmlParser.fragment.fromBBCode(v),x=new CKEDITOR.htmlParser.basicWriter();w.writeHtml(x,u);return x.getHtml(true);};var u=new CKEDITOR.htmlParser.filter();u.addRules({elements:{blockquote:function(v){var w=new CKEDITOR.htmlParser.element('div');w.children=v.children;v.children=[w];var x=v.attributes.cite;if(x){var y=new CKEDITOR.htmlParser.element('cite');y.add(new CKEDITOR.htmlParser.text(x.replace(/^"|"$/g,'')));delete v.attributes.cite;v.children.unshift(y);}},span:function(v){var w;if(w=v.attributes.bbcode){if(w=='img'){v.name='img';v.attributes.src=v.children[0].value;v.children=[];}else if(w=='email'){v.name='a';v.attributes.href='mailto:'+v.children[0].value;}delete v.attributes.bbcode;
+}},ol:function(v){if(v.attributes.listType){if(v.attributes.listType!='decimal')v.attributes.style='list-style-type:'+v.attributes.listType;}else v.name='ul';delete v.attributes.listType;},a:function(v){if(!v.attributes.href)v.attributes.href=v.children[0].value;},smiley:function(v){v.name='img';var w=v.attributes.desc,x=s.smiley_images[CKEDITOR.tools.indexOf(s.smiley_descriptions,w)],y=CKEDITOR.tools.htmlEncode(s.smiley_path+x);v.attributes={src:y,'data-cke-saved-src':y,title:w,alt:w};}}});r.dataProcessor.htmlFilter.addRules({elements:{$:function(v){var w=v.attributes,x=j(w.style),y,z=v.name;if(z in b)z=b[z];else if(z=='span'){if(y=x.color){z='color';y=k(y);}else if(y=x['font-size']){var A=y.match(/(\d+)%$/);if(A){y=A[1];z='size';}}}else if(z=='ol'||z=='ul'){if(y=x['list-style-type']){switch(y){case 'lower-alpha':y='a';break;case 'upper-alpha':y='A';break;}}else if(z=='ol')y=1;z='list';}else if(z=='blockquote'){try{var B=v.children[0],C=v.children[1],D=B.name=='cite'&&B.children[0].value;if(D){y='"'+D+'"';v.children=C.children;}}catch(G){}z='quote';}else if(z=='a'){if(y=w.href)if(y.indexOf('mailto:')!==-1){z='email';v.children=[new CKEDITOR.htmlParser.text(y.replace('mailto:',''))];y='';}else{var E=v.children.length==1&&v.children[0];if(E&&E.type==CKEDITOR.NODE_TEXT&&E.value==y)y='';z='url';}}else if(z=='img'){v.isEmpty=0;var F=w['data-cke-saved-src'];if(F&&F.indexOf(r.config.smiley_path)!=-1)return new CKEDITOR.htmlParser.text(l[w.alt]);else v.children=[new CKEDITOR.htmlParser.text(F)];}v.name=z;y&&(v.attributes.option=y);return null;},br:function(v){var w=v.next;if(w&&w.name in g)return false;}}},1);r.dataProcessor.writer=q;r.on('beforeSetMode',function(v){v.removeListener();var w=r._.modes.wysiwyg;w.loadData=CKEDITOR.tools.override(w.loadData,function(x){return function(y){return x.call(this,t(y));};});});},afterInit:function(r){var s;if(r._.elementsPath)if(s=r._.elementsPath.filters)s.push(function(t){var u=t.getName(),v=c[u]||false;if(v=='link'&&t.getAttribute('href').indexOf('mailto:')===0)v='email';else if(u=='span'){if(t.getStyle('font-size'))v='size';else if(t.getStyle('color'))v='color';}else if(v=='img'){var w=t.data('cke-saved-src');if(w&&w.indexOf(r.config.smiley_path)===0)v='smiley';}return v;});}});})();
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/clipboard/dialogs/paste.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/clipboard/dialogs/paste.js
index ed1a423..4a850e0 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/clipboard/dialogs/paste.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/clipboard/dialogs/paste.js
@@ -1,7 +1,7 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.dialog.add('paste',function(a){var b=a.lang.clipboard,c=CKEDITOR.env.isCustomDomain();function d(e){var f=new CKEDITOR.dom.document(e.document),g=f.$,h=f.getById('cke_actscrpt');h&&h.remove();CKEDITOR.env.ie?g.body.contentEditable='true':g.designMode='on';if(CKEDITOR.env.ie&&CKEDITOR.env.version<8)f.getWindow().on('blur',function(){g.selection.empty();});f.on('keydown',function(i){var j=i.data,k=j.getKeystroke(),l;switch(k){case 27:this.hide();l=1;break;case 9:case CKEDITOR.SHIFT+9:this.changeFocus(1);l=1;}l&&j.preventDefault();},this);a.fire('ariaWidget',new CKEDITOR.dom.element(e.frameElement));};return{title:b.title,minWidth:CKEDITOR.env.ie&&CKEDITOR.env.quirks?370:350,minHeight:CKEDITOR.env.quirks?250:245,onShow:function(){this.parts.dialog.$.offsetHeight;this.setupContent();},onHide:function(){if(CKEDITOR.env.ie)this.getParentEditor().document.getBody().$.contentEditable='true';},onLoad:function(){if((CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)&&a.lang.dir=='rtl')this.parts.contents.setStyle('overflow','hidden');},onOk:function(){this.commitContent();},contents:[{id:'general',label:a.lang.common.generalTab,elements:[{type:'html',id:'securityMsg',html:'<div style="white-space:normal;width:340px;">'+b.securityMsg+'</div>'},{type:'html',id:'pasteMsg',html:'<div style="white-space:normal;width:340px;">'+b.pasteMsg+'</div>'},{type:'html',id:'editing_area',style:'width: 100%; height: 100%;',html:'',focus:function(){var e=this.getInputElement().$.contentWindow;setTimeout(function(){e.focus();},500);},setup:function(){var e=this.getDialog(),f='<html dir="'+a.config.contentsLangDirection+'"'+' lang="'+(a.config.contentsLanguage||a.langCode)+'">'+'<head><style>body { margin: 3px; height: 95%; } </style></head><body>'+'<script id="cke_actscrpt" type="text/javascript">'+'window.parent.CKEDITOR.tools.callFunction( '+CKEDITOR.tools.addFunction(d,e)+', this );'+'</script></body>'+'</html>',g=CKEDITOR.env.air?'javascript:void(0)':c?"javascript:void((function(){document.open();document.domain='"+document.domain+"';"+'document.close();'+'})())"':'',h=CKEDITOR.dom.element.createFromHtml('<iframe class="cke_pasteframe" frameborder="0" allowTransparency="true" src="'+g+'"'+' role="region"'+' aria-label="'+b.pasteArea+'"'+' aria-describedby="'+e.getContentElement('general','pasteMsg').domId+'"'+' aria-multiple="true"'+'></iframe>');h.on('load',function(k){k.removeListener();var l=h.getFrameDocument();l.write(f);if(CKEDITOR.env.air)d.call(this,l.getWindow().$);
-},e);h.setCustomData('dialog',e);var i=this.getElement();i.setHtml('');i.append(h);if(CKEDITOR.env.ie){var j=CKEDITOR.dom.element.createFromHtml('<span tabindex="-1" style="position:absolute;" role="presentation"></span>');j.on('focus',function(){h.$.contentWindow.focus();});i.append(j);this.focus=function(){j.focus();this.fire('focus');};}this.getInputElement=function(){return h;};if(CKEDITOR.env.ie){i.setStyle('display','block');i.setStyle('height',h.$.offsetHeight+2+'px');}},commit:function(e){var f=this.getElement(),g=this.getDialog().getParentEditor(),h=this.getInputElement().getFrameDocument().getBody(),i=h.getBogus(),j;i&&i.remove();j=h.getHtml();setTimeout(function(){g.fire('paste',{html:j});},0);}}]}]};});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.dialog.add('paste',function(a){var b=a.lang.clipboard,c=CKEDITOR.env.isCustomDomain();function d(e){var f=new CKEDITOR.dom.document(e.document),g=f.$,h=f.getById('cke_actscrpt');h&&h.remove();CKEDITOR.env.ie?g.body.contentEditable='true':g.designMode='on';if(CKEDITOR.env.ie&&CKEDITOR.env.version<8)f.getWindow().on('blur',function(){g.selection.empty();});f.on('keydown',function(i){var j=i.data,k=j.getKeystroke(),l;switch(k){case 27:this.hide();l=1;break;case 9:case CKEDITOR.SHIFT+9:this.changeFocus(1);l=1;}l&&j.preventDefault();},this);a.fire('ariaWidget',new CKEDITOR.dom.element(e.frameElement));};return{title:b.title,minWidth:CKEDITOR.env.ie&&CKEDITOR.env.quirks?370:350,minHeight:CKEDITOR.env.quirks?250:245,onShow:function(){this.parts.dialog.$.offsetHeight;this.setupContent();},onHide:function(){if(CKEDITOR.env.ie)this.getParentEditor().document.getBody().$.contentEditable='true';},onLoad:function(){if((CKEDITOR.env.ie7Compat||CKEDITOR.env.ie6Compat)&&a.lang.dir=='rtl')this.parts.contents.setStyle('overflow','hidden');},onOk:function(){this.commitContent();},contents:[{id:'general',label:a.lang.common.generalTab,elements:[{type:'html',id:'securityMsg',html:'<div style="white-space:normal;width:340px;">'+b.securityMsg+'</div>'},{type:'html',id:'pasteMsg',html:'<div style="white-space:normal;width:340px;">'+b.pasteMsg+'</div>'},{type:'html',id:'editing_area',style:'width: 100%; height: 100%;',html:'',focus:function(){var e=this.getInputElement().$.contentWindow;setTimeout(function(){e.focus();},500);},setup:function(){var e=this.getDialog(),f='<html dir="'+a.config.contentsLangDirection+'"'+' lang="'+(a.config.contentsLanguage||a.langCode)+'">'+'<head><style>body { margin: 3px; height: 95%; } </style></head><body>'+'<script id="cke_actscrpt" type="text/javascript">'+'window.parent.CKEDITOR.tools.callFunction( '+CKEDITOR.tools.addFunction(d,e)+', this );'+'</script></body>'+'</html>',g=CKEDITOR.env.air?'javascript:void(0)':c?"javascript:void((function(){document.open();document.domain='"+document.domain+"';"+'document.close();'+'})())"':'',h=CKEDITOR.dom.element.createFromHtml('<iframe class="cke_pasteframe" frameborder="0" allowTransparency="true" src="'+g+'"'+' role="region"'+' aria-label="'+b.pasteArea+'"'+' aria-describedby="'+e.getContentElement('general','pasteMsg').domId+'"'+' aria-multiple="true"'+'></iframe>');h.on('load',function(k){k.removeListener();var l=h.getFrameDocument();l.write(f);if(CKEDITOR.env.air)d.call(this,l.getWindow().$);
+},e);h.setCustomData('dialog',e);var i=this.getElement();i.setHtml('');i.append(h);if(CKEDITOR.env.ie){var j=CKEDITOR.dom.element.createFromHtml('<span tabindex="-1" style="position:absolute;" role="presentation"></span>');j.on('focus',function(){h.$.contentWindow.focus();});i.append(j);this.focus=function(){j.focus();this.fire('focus');};}this.getInputElement=function(){return h;};if(CKEDITOR.env.ie){i.setStyle('display','block');i.setStyle('height',h.$.offsetHeight+2+'px');}},commit:function(e){var f=this.getElement(),g=this.getDialog().getParentEditor(),h=this.getInputElement().getFrameDocument().getBody(),i=h.getBogus(),j;i&&i.remove();j=h.getHtml();setTimeout(function(){g.fire('paste',{html:j});},0);}}]}]};});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/colordialog/dialogs/colordialog.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/colordialog/dialogs/colordialog.js
index e908269..5663387 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/colordialog/dialogs/colordialog.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/colordialog/dialogs/colordialog.js
@@ -1,7 +1,7 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.dialog.add('colordialog',function(a){var b=CKEDITOR.dom.element,c=CKEDITOR.document,d=a.lang.colordialog,e,f={type:'html',html:' '},g;function h(){c.getById(u).removeStyle('background-color');e.getContentElement('picker','selectedColor').setValue('');g&&g.removeAttribute('aria-selected');g=null;};function i(w){var x=w.data.getTarget(),y;if(x.getName()=='td'&&(y=x.getChild(0).getHtml())){g=x;g.setAttribute('aria-selected',true);e.getContentElement('picker','selectedColor').setValue(y);}};function j(w){w=w.replace(/^#/,'');for(var x=0,y=[];x<=2;x++)y[x]=parseInt(w.substr(x*2,2),16);var z=0.2126*y[0]+0.7152*y[1]+0.0722*y[2];return '#'+(z>=165?'000':'fff');};var k,l;function m(w){!w.name&&(w=new CKEDITOR.event(w));var x=!/mouse/.test(w.name),y=w.data.getTarget(),z;if(y.getName()=='td'&&(z=y.getChild(0).getHtml())){o(w);x?k=y:l=y;if(x){y.setStyle('border-color',j(z));y.setStyle('border-style','dotted');}c.getById(s).setStyle('background-color',z);c.getById(t).setHtml(z);}};function n(){var w=k.getChild(0).getHtml();k.setStyle('border-color',w);k.setStyle('border-style','solid');c.getById(s).removeStyle('background-color');c.getById(t).setHtml(' ');k=null;};function o(w){var x=!/mouse/.test(w.name),y=x&&k;if(y){var z=y.getChild(0).getHtml();y.setStyle('border-color',z);y.setStyle('border-style','solid');}if(!(k||l)){c.getById(s).removeStyle('background-color');c.getById(t).setHtml(' ');}};function p(w){var x=w.data,y=x.getTarget(),z,A,B=x.getKeystroke(),C=a.lang.dir=='rtl';switch(B){case 38:if(z=y.getParent().getPrevious()){A=z.getChild([y.getIndex()]);A.focus();}x.preventDefault();break;case 40:if(z=y.getParent().getNext()){A=z.getChild([y.getIndex()]);if(A&&A.type==1)A.focus();}x.preventDefault();break;case 32:case 13:i(w);x.preventDefault();break;case C?37:39:if(A=y.getNext()){if(A.type==1){A.focus();x.preventDefault(true);}}else if(z=y.getParent().getNext()){A=z.getChild([0]);if(A&&A.type==1){A.focus();x.preventDefault(true);}}break;case C?39:37:if(A=y.getPrevious()){A.focus();x.preventDefault(true);}else if(z=y.getParent().getPrevious()){A=z.getLast();A.focus();x.preventDefault(true);}break;default:return;}};function q(){v=CKEDITOR.dom.element.createFromHtml('<table tabIndex="-1" aria-label="'+d.options+'"'+' role="grid" style="border-collapse:separate;" cellspacing="0">'+'<caption class="cke_voice_label">'+d.options+'</caption>'+'<tbody role="presentation"></tbody></table>');v.on('mouseover',m);v.on('mouseout',o);var w=['00','33','66','99','cc','ff'];
-function x(C,D){for(var E=C;E<C+3;E++){var F=new b(v.$.insertRow(-1));F.setAttribute('role','row');for(var G=D;G<D+3;G++)for(var H=0;H<6;H++)y(F.$,'#'+w[G]+w[H]+w[E]);}};function y(C,D){var E=new b(C.insertCell(-1));E.setAttribute('class','ColorCell');E.setAttribute('tabIndex',-1);E.setAttribute('role','gridcell');E.on('keydown',p);E.on('click',i);E.on('focus',m);E.on('blur',o);E.setStyle('background-color',D);E.setStyle('border','1px solid '+D);E.setStyle('width','14px');E.setStyle('height','14px');var F=r('color_table_cell');E.setAttribute('aria-labelledby',F);E.append(CKEDITOR.dom.element.createFromHtml('<span id="'+F+'" class="cke_voice_label">'+D+'</span>',CKEDITOR.document));};x(0,0);x(3,0);x(0,3);x(3,3);var z=new b(v.$.insertRow(-1));z.setAttribute('role','row');for(var A=0;A<6;A++)y(z.$,'#'+w[A]+w[A]+w[A]);for(var B=0;B<12;B++)y(z.$,'#000000');};var r=function(w){return CKEDITOR.tools.getNextId()+'_'+w;},s=r('hicolor'),t=r('hicolortext'),u=r('selhicolor'),v;q();return{title:d.title,minWidth:360,minHeight:220,onLoad:function(){e=this;},onHide:function(){h();n();},contents:[{id:'picker',label:d.title,accessKey:'I',elements:[{type:'hbox',padding:0,widths:['70%','10%','30%'],children:[{type:'html',html:'<div></div>',onLoad:function(){CKEDITOR.document.getById(this.domId).append(v);},focus:function(){(k||this.getElement().getElementsByTag('td').getItem(0)).focus();}},f,{type:'vbox',padding:0,widths:['70%','5%','25%'],children:[{type:'html',html:'<span>'+d.highlight+'</span>\t\t\t\t\t\t\t\t\t\t\t\t<div id="'+s+'" style="border: 1px solid; height: 74px; width: 74px;"></div>\t\t\t\t\t\t\t\t\t\t\t\t<div id="'+t+'"> </div><span>'+d.selected+'</span>\t\t\t\t\t\t\t\t\t\t\t\t<div id="'+u+'" style="border: 1px solid; height: 20px; width: 74px;"></div>'},{type:'text',label:d.selected,labelStyle:'display:none',id:'selectedColor',style:'width: 74px',onChange:function(){try{c.getById(u).setStyle('background-color',this.getValue());}catch(w){h();}}},f,{type:'button',id:'clear',style:'margin-top: 5px',label:d.clear,onClick:h}]}]}]}]};});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.dialog.add('colordialog',function(a){var b=CKEDITOR.dom.element,c=CKEDITOR.document,d=a.lang.colordialog,e,f={type:'html',html:' '},g;function h(){c.getById(u).removeStyle('background-color');e.getContentElement('picker','selectedColor').setValue('');g&&g.removeAttribute('aria-selected');g=null;};function i(w){var x=w.data.getTarget(),y;if(x.getName()=='td'&&(y=x.getChild(0).getHtml())){g=x;g.setAttribute('aria-selected',true);e.getContentElement('picker','selectedColor').setValue(y);}};function j(w){w=w.replace(/^#/,'');for(var x=0,y=[];x<=2;x++)y[x]=parseInt(w.substr(x*2,2),16);var z=0.2126*y[0]+0.7152*y[1]+0.0722*y[2];return '#'+(z>=165?'000':'fff');};var k,l;function m(w){!w.name&&(w=new CKEDITOR.event(w));var x=!/mouse/.test(w.name),y=w.data.getTarget(),z;if(y.getName()=='td'&&(z=y.getChild(0).getHtml())){o(w);x?k=y:l=y;if(x){y.setStyle('border-color',j(z));y.setStyle('border-style','dotted');}c.getById(s).setStyle('background-color',z);c.getById(t).setHtml(z);}};function n(){var w=k.getChild(0).getHtml();k.setStyle('border-color',w);k.setStyle('border-style','solid');c.getById(s).removeStyle('background-color');c.getById(t).setHtml(' ');k=null;};function o(w){var x=!/mouse/.test(w.name),y=x&&k;if(y){var z=y.getChild(0).getHtml();y.setStyle('border-color',z);y.setStyle('border-style','solid');}if(!(k||l)){c.getById(s).removeStyle('background-color');c.getById(t).setHtml(' ');}};function p(w){var x=w.data,y=x.getTarget(),z,A,B=x.getKeystroke(),C=a.lang.dir=='rtl';switch(B){case 38:if(z=y.getParent().getPrevious()){A=z.getChild([y.getIndex()]);A.focus();}x.preventDefault();break;case 40:if(z=y.getParent().getNext()){A=z.getChild([y.getIndex()]);if(A&&A.type==1)A.focus();}x.preventDefault();break;case 32:case 13:i(w);x.preventDefault();break;case C?37:39:if(A=y.getNext()){if(A.type==1){A.focus();x.preventDefault(true);}}else if(z=y.getParent().getNext()){A=z.getChild([0]);if(A&&A.type==1){A.focus();x.preventDefault(true);}}break;case C?39:37:if(A=y.getPrevious()){A.focus();x.preventDefault(true);}else if(z=y.getParent().getPrevious()){A=z.getLast();A.focus();x.preventDefault(true);}break;default:return;}};function q(){v=CKEDITOR.dom.element.createFromHtml('<table tabIndex="-1" aria-label="'+d.options+'"'+' role="grid" style="border-collapse:separate;" cellspacing="0">'+'<caption class="cke_voice_label">'+d.options+'</caption>'+'<tbody role="presentation"></tbody></table>');v.on('mouseover',m);v.on('mouseout',o);var w=['00','33','66','99','cc','ff'];
+function x(C,D){for(var E=C;E<C+3;E++){var F=new b(v.$.insertRow(-1));F.setAttribute('role','row');for(var G=D;G<D+3;G++)for(var H=0;H<6;H++)y(F.$,'#'+w[G]+w[H]+w[E]);}};function y(C,D){var E=new b(C.insertCell(-1));E.setAttribute('class','ColorCell');E.setAttribute('tabIndex',-1);E.setAttribute('role','gridcell');E.on('keydown',p);E.on('click',i);E.on('focus',m);E.on('blur',o);E.setStyle('background-color',D);E.setStyle('border','1px solid '+D);E.setStyle('width','14px');E.setStyle('height','14px');var F=r('color_table_cell');E.setAttribute('aria-labelledby',F);E.append(CKEDITOR.dom.element.createFromHtml('<span id="'+F+'" class="cke_voice_label">'+D+'</span>',CKEDITOR.document));};x(0,0);x(3,0);x(0,3);x(3,3);var z=new b(v.$.insertRow(-1));z.setAttribute('role','row');for(var A=0;A<6;A++)y(z.$,'#'+w[A]+w[A]+w[A]);for(var B=0;B<12;B++)y(z.$,'#000000');};var r=function(w){return CKEDITOR.tools.getNextId()+'_'+w;},s=r('hicolor'),t=r('hicolortext'),u=r('selhicolor'),v;q();return{title:d.title,minWidth:360,minHeight:220,onLoad:function(){e=this;},onHide:function(){h();n();},contents:[{id:'picker',label:d.title,accessKey:'I',elements:[{type:'hbox',padding:0,widths:['70%','10%','30%'],children:[{type:'html',html:'<div></div>',onLoad:function(){CKEDITOR.document.getById(this.domId).append(v);},focus:function(){(k||this.getElement().getElementsByTag('td').getItem(0)).focus();}},f,{type:'vbox',padding:0,widths:['70%','5%','25%'],children:[{type:'html',html:'<span>'+d.highlight+'</span>\t\t\t\t\t\t\t\t\t\t\t\t<div id="'+s+'" style="border: 1px solid; height: 74px; width: 74px;"></div>\t\t\t\t\t\t\t\t\t\t\t\t<div id="'+t+'"> </div><span>'+d.selected+'</span>\t\t\t\t\t\t\t\t\t\t\t\t<div id="'+u+'" style="border: 1px solid; height: 20px; width: 74px;"></div>'},{type:'text',label:d.selected,labelStyle:'display:none',id:'selectedColor',style:'width: 74px',onChange:function(){try{c.getById(u).setStyle('background-color',this.getValue());}catch(w){h();}}},f,{type:'button',id:'clear',style:'margin-top: 5px',label:d.clear,onClick:h}]}]}]}]};});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/_translationstatus.txt b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/_translationstatus.txt
index abb9832..682d1d2 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/_translationstatus.txt
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/_translationstatus.txt
@@ -1,28 +1,28 @@
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-
-bg.js Found: 5 Missing: 0
-cs.js Found: 5 Missing: 0
-cy.js Found: 5 Missing: 0
-da.js Found: 5 Missing: 0
-de.js Found: 5 Missing: 0
-el.js Found: 5 Missing: 0
-eo.js Found: 5 Missing: 0
-et.js Found: 5 Missing: 0
-fa.js Found: 5 Missing: 0
-fi.js Found: 5 Missing: 0
-fr.js Found: 5 Missing: 0
-gu.js Found: 5 Missing: 0
-he.js Found: 5 Missing: 0
-hr.js Found: 5 Missing: 0
-it.js Found: 5 Missing: 0
-nb.js Found: 5 Missing: 0
-nl.js Found: 5 Missing: 0
-no.js Found: 5 Missing: 0
-pl.js Found: 5 Missing: 0
-pt-br.js Found: 5 Missing: 0
-tr.js Found: 5 Missing: 0
-ug.js Found: 5 Missing: 0
-uk.js Found: 5 Missing: 0
-vi.js Found: 5 Missing: 0
-zh-cn.js Found: 5 Missing: 0
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+
+bg.js Found: 5 Missing: 0
+cs.js Found: 5 Missing: 0
+cy.js Found: 5 Missing: 0
+da.js Found: 5 Missing: 0
+de.js Found: 5 Missing: 0
+el.js Found: 5 Missing: 0
+eo.js Found: 5 Missing: 0
+et.js Found: 5 Missing: 0
+fa.js Found: 5 Missing: 0
+fi.js Found: 5 Missing: 0
+fr.js Found: 5 Missing: 0
+gu.js Found: 5 Missing: 0
+he.js Found: 5 Missing: 0
+hr.js Found: 5 Missing: 0
+it.js Found: 5 Missing: 0
+nb.js Found: 5 Missing: 0
+nl.js Found: 5 Missing: 0
+no.js Found: 5 Missing: 0
+pl.js Found: 5 Missing: 0
+pt-br.js Found: 5 Missing: 0
+tr.js Found: 5 Missing: 0
+ug.js Found: 5 Missing: 0
+uk.js Found: 5 Missing: 0
+vi.js Found: 5 Missing: 0
+zh-cn.js Found: 5 Missing: 0
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/bg.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/bg.js
index c8713d0..a47cc8e 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/bg.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/bg.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','bg',{devTools:{title:'Информация за елемента',dialogName:'Име на диалоговия прозорец',tabName:'Име на таб',elementId:'ID на елемента',elementType:'Тип на елемента'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','bg',{devTools:{title:'Информация за елемента',dialogName:'Име на диалоговия прозорец',tabName:'Име на таб',elementId:'ID на елемента',elementType:'Тип на елемента'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/cs.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/cs.js
index 10c9699..1fa4fc5 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/cs.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/cs.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','cs',{devTools:{title:'Informace o prvku',dialogName:'Název dialogového okna',tabName:'Název karty',elementId:'ID prvku',elementType:'Typ prvku'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','cs',{devTools:{title:'Informace o prvku',dialogName:'Název dialogového okna',tabName:'Název karty',elementId:'ID prvku',elementType:'Typ prvku'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/cy.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/cy.js
index 3514ec6..6ec3b7b 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/cy.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/cy.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','cy',{devTools:{title:'Gwybodaeth am yr Elfen',dialogName:'Enw ffenestr y deialog',tabName:"Enw'r tab",elementId:'ID yr Elfen',elementType:'Math yr elfen'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','cy',{devTools:{title:'Gwybodaeth am yr Elfen',dialogName:'Enw ffenestr y deialog',tabName:"Enw'r tab",elementId:'ID yr Elfen',elementType:'Math yr elfen'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/da.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/da.js
index d882612..d02eddc 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/da.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/da.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','da',{devTools:{title:'Information på elementet',dialogName:'Dialogboks',tabName:'Tab beskrivelse',elementId:'ID på element',elementType:'Type af element'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','da',{devTools:{title:'Information på elementet',dialogName:'Dialogboks',tabName:'Tab beskrivelse',elementId:'ID på element',elementType:'Type af element'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/de.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/de.js
index 953bf97..8f9a2bc 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/de.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/de.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','de',{devTools:{title:'Elementinformation',dialogName:'Dialogfenstername',tabName:'Reitername',elementId:'Element ID',elementType:'Elementtyp'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','de',{devTools:{title:'Elementinformation',dialogName:'Dialogfenstername',tabName:'Reitername',elementId:'Element ID',elementType:'Elementtyp'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/el.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/el.js
index 32168b7..9caaffe 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/el.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/el.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','el',{devTools:{title:'Πληροφορίες Στοιχείου',dialogName:'Όνομα παραθύρου διαλόγου',tabName:'Όνομα καρτέλας',elementId:'ID Στοιχείου',elementType:'Τύπος στοιχείου'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','el',{devTools:{title:'Πληροφορίες Στοιχείου',dialogName:'Όνομα παραθύρου διαλόγου',tabName:'Όνομα καρτέλας',elementId:'ID Στοιχείου',elementType:'Τύπος στοιχείου'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/en.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/en.js
index 467126d..f8ac7c9 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/en.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/en.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','en',{devTools:{title:'Element Information',dialogName:'Dialog window name',tabName:'Tab name',elementId:'Element ID',elementType:'Element type'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','en',{devTools:{title:'Element Information',dialogName:'Dialog window name',tabName:'Tab name',elementId:'Element ID',elementType:'Element type'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/eo.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/eo.js
index 70ae814..af527e4 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/eo.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/eo.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','eo',{devTools:{title:'Informo pri la elemento',dialogName:'Nomo de la dialogfenestro',tabName:'Langetnomo',elementId:'ID de la elemento',elementType:'Tipo de la elemento'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','eo',{devTools:{title:'Informo pri la elemento',dialogName:'Nomo de la dialogfenestro',tabName:'Langetnomo',elementId:'ID de la elemento',elementType:'Tipo de la elemento'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/et.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/et.js
index 3d73164..88e3264 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/et.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/et.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','et',{devTools:{title:'Elemendi andmed',dialogName:'Dialoogiakna nimi',tabName:'Saki nimi',elementId:'Elemendi ID',elementType:'Elemendi liik'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','et',{devTools:{title:'Elemendi andmed',dialogName:'Dialoogiakna nimi',tabName:'Saki nimi',elementId:'Elemendi ID',elementType:'Elemendi liik'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/fa.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/fa.js
index e6133b2..b3d826c 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/fa.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/fa.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','fa',{devTools:{title:'اطلاعات عنصر',dialogName:'نام پنجره محاورهای',tabName:'نام برگه',elementId:'ID عنصر',elementType:'نوع عنصر'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','fa',{devTools:{title:'اطلاعات عنصر',dialogName:'نام پنجره محاورهای',tabName:'نام برگه',elementId:'ID عنصر',elementType:'نوع عنصر'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/fi.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/fi.js
index 37884d3..cfd23af 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/fi.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/fi.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','fi',{devTools:{title:'Elementin tiedot',dialogName:'Dialogi-ikkunan nimi',tabName:'Välilehden nimi',elementId:'Elementin ID',elementType:'Elementin tyyppi'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','fi',{devTools:{title:'Elementin tiedot',dialogName:'Dialogi-ikkunan nimi',tabName:'Välilehden nimi',elementId:'Elementin ID',elementType:'Elementin tyyppi'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/fr.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/fr.js
index c44813f..5c2c3e0 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/fr.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/fr.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','fr',{devTools:{title:"Information sur l'élément",dialogName:'Nom de la fenêtre de dialogue',tabName:"Nom de l'onglet",elementId:"ID de l'élément",elementType:"Type de l'élément"}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','fr',{devTools:{title:"Information sur l'élément",dialogName:'Nom de la fenêtre de dialogue',tabName:"Nom de l'onglet",elementId:"ID de l'élément",elementType:"Type de l'élément"}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/gu.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/gu.js
index 553e7a0..2f64201 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/gu.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/gu.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','gu',{devTools:{title:'પ્રાથમિક માહિતી',dialogName:'વિન્ડોનું નામ',tabName:'ટેબનું નામ',elementId:'પ્રાથમિક આઈડી',elementType:'પ્રાથમિક પ્રકાર'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','gu',{devTools:{title:'પ્રાથમિક માહિતી',dialogName:'વિન્ડોનું નામ',tabName:'ટેબનું નામ',elementId:'પ્રાથમિક આઈડી',elementType:'પ્રાથમિક પ્રકાર'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/he.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/he.js
index 52a36b9..c851395 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/he.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/he.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','he',{devTools:{title:'מידע על האלמנט',dialogName:'שם הדיאלוג',tabName:'שם הטאב',elementId:'ID של האלמנט',elementType:'סוג האלמנט'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','he',{devTools:{title:'מידע על האלמנט',dialogName:'שם הדיאלוג',tabName:'שם הטאב',elementId:'ID של האלמנט',elementType:'סוג האלמנט'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/hr.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/hr.js
index 3112625..8cab195 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/hr.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/hr.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','hr',{devTools:{title:'Informacije elementa',dialogName:'Naziv prozora za dijalog',tabName:'Naziva jahača',elementId:'ID elementa',elementType:'Vrsta elementa'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','hr',{devTools:{title:'Informacije elementa',dialogName:'Naziv prozora za dijalog',tabName:'Naziva jahača',elementId:'ID elementa',elementType:'Vrsta elementa'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/it.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/it.js
index 8410af0..1a45bfa 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/it.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/it.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','it',{devTools:{title:'Informazioni elemento',dialogName:'Nome finestra di dialogo',tabName:'Nome Tab',elementId:'ID Elemento',elementType:'Tipo elemento'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','it',{devTools:{title:'Informazioni elemento',dialogName:'Nome finestra di dialogo',tabName:'Nome Tab',elementId:'ID Elemento',elementType:'Tipo elemento'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/nb.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/nb.js
index fd561a7..11af888 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/nb.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/nb.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','nb',{devTools:{title:'Elementinformasjon',dialogName:'Navn på dialogvindu',tabName:'Navn på fane',elementId:'Element-ID',elementType:'Elementtype'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','nb',{devTools:{title:'Elementinformasjon',dialogName:'Navn på dialogvindu',tabName:'Navn på fane',elementId:'Element-ID',elementType:'Elementtype'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/nl.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/nl.js
index affe32a..defdc2a 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/nl.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/nl.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','nl',{devTools:{title:'Elementinformatie',dialogName:'Naam dialoogvenster',tabName:'Tabnaam',elementId:'Element ID',elementType:'Elementtype'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','nl',{devTools:{title:'Elementinformatie',dialogName:'Naam dialoogvenster',tabName:'Tabnaam',elementId:'Element ID',elementType:'Elementtype'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/no.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/no.js
index e93f861..172489b 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/no.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/no.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','no',{devTools:{title:'Elementinformasjon',dialogName:'Navn på dialogvindu',tabName:'Navn på fane',elementId:'Element-ID',elementType:'Elementtype'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','no',{devTools:{title:'Elementinformasjon',dialogName:'Navn på dialogvindu',tabName:'Navn på fane',elementId:'Element-ID',elementType:'Elementtype'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/pl.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/pl.js
index 886a941..821d9af 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/pl.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/pl.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','pl',{devTools:{title:'Informacja o elemencie',dialogName:'Nazwa okna dialogowego',tabName:'Nazwa zakładki',elementId:'ID elementu',elementType:'Typ elementu'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','pl',{devTools:{title:'Informacja o elemencie',dialogName:'Nazwa okna dialogowego',tabName:'Nazwa zakładki',elementId:'ID elementu',elementType:'Typ elementu'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/pt-br.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/pt-br.js
index 32e1e2e..79efbdf 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/pt-br.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/pt-br.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','pt-br',{devTools:{title:'Informação do Elemento',dialogName:'Nome da janela de diálogo',tabName:'Nome da aba',elementId:'ID do elemento',elementType:'Tipo do elemento'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','pt-br',{devTools:{title:'Informação do Elemento',dialogName:'Nome da janela de diálogo',tabName:'Nome da aba',elementId:'ID do elemento',elementType:'Tipo do elemento'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/tr.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/tr.js
index 7982d17..aca0cb6 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/tr.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/tr.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','tr',{devTools:{title:'Eleman Bilgisi',dialogName:'İletişim pencere ismi',tabName:'Sekme adı',elementId:'Eleman ID',elementType:'Eleman türü'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','tr',{devTools:{title:'Eleman Bilgisi',dialogName:'İletişim pencere ismi',tabName:'Sekme adı',elementId:'Eleman ID',elementType:'Eleman türü'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/ug.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/ug.js
index 6cfb991..4909733 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/ug.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/ug.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','ug',{devTools:{title:'ئېلېمېنت ئۇچۇرى',dialogName:'سۆزلەشكۈ كۆزنەك ئاتى',tabName:'Tab ئاتى',elementId:'ئېلېمېنت كىملىكى',elementType:'ئېلېمېنت تىپى'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','ug',{devTools:{title:'ئېلېمېنت ئۇچۇرى',dialogName:'سۆزلەشكۈ كۆزنەك ئاتى',tabName:'Tab ئاتى',elementId:'ئېلېمېنت كىملىكى',elementType:'ئېلېمېنت تىپى'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/uk.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/uk.js
index 4d80d6d..1fead84 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/uk.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/uk.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','uk',{devTools:{title:'Відомості про Елемент',dialogName:'Заголовок діалогового вікна',tabName:'Назва вкладки',elementId:'Ідентифікатор Елемента',elementType:'Тип Елемента'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','uk',{devTools:{title:'Відомості про Елемент',dialogName:'Заголовок діалогового вікна',tabName:'Назва вкладки',elementId:'Ідентифікатор Елемента',elementType:'Тип Елемента'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/vi.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/vi.js
index 4be8437..d877320 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/vi.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/vi.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','vi',{devTools:{title:'Thông tin thành ph',dialogName:'Tên hộp tho',tabName:'Tên th',elementId:'Mã thành ph',elementType:'Loại thành ph'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','vi',{devTools:{title:'Thông tin thành ph',dialogName:'Tên hộp tho',tabName:'Tên th',elementId:'Mã thành ph',elementType:'Loại thành ph'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/zh-cn.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/zh-cn.js
index 3f599be..2eb6d3b 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/zh-cn.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/lang/zh-cn.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('devtools','zh-cn',{devTools:{title:'元素信息',dialogName:'对话框窗口名称',tabName:'Tab 名称',elementId:'元素 ID',elementType:'元素类型'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('devtools','zh-cn',{devTools:{title:'元素信息',dialogName:'对话框窗口名称',tabName:'Tab 名称',elementId:'元素 ID',elementType:'元素类型'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/plugin.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/plugin.js
index efc4e22..f4f123d 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/plugin.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/devtools/plugin.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.add('devtools',{lang:['en','bg','cs','cy','da','de','el','eo','et','fa','fi','fr','gu','he','hr','it','nb','nl','no','pl','pt-br','tr','ug','uk','vi','zh-cn'],init:function(a){a._.showDialogDefinitionTooltips=1;},onLoad:function(){CKEDITOR.document.appendStyleText(CKEDITOR.config.devtools_styles||'#cke_tooltip { padding: 5px; border: 2px solid #333; background: #ffffff }#cke_tooltip h2 { font-size: 1.1em; border-bottom: 1px solid; margin: 0; padding: 1px; }#cke_tooltip ul { padding: 0pt; list-style-type: none; }');}});(function(){function a(d,e,f,g){var h=d.lang.devTools,i='<a href="http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.dialog.definition.'+(f?f.type=='text'?'textInput':f.type:'content')+'.html" target="_blank">'+(f?f.type:'content')+'</a>',j='<h2>'+h.title+'</h2>'+'<ul>'+'<li><strong>'+h.dialogName+'</strong> : '+e.getName()+'</li>'+'<li><strong>'+h.tabName+'</strong> : '+g+'</li>';if(f)j+='<li><strong>'+h.elementId+'</strong> : '+f.id+'</li>';j+='<li><strong>'+h.elementType+'</strong> : '+i+'</li>';return j+'</ul>';};function b(d,e,f,g,h,i){var j=e.getDocumentPosition(),k={'z-index':CKEDITOR.dialog._.currentZIndex+10,top:j.y+e.getSize('height')+'px'};c.setHtml(d(f,g,h,i));c.show();if(f.lang.dir=='rtl'){var l=CKEDITOR.document.getWindow().getViewPaneSize();k.right=l.width-j.x-e.getSize('width')+'px';}else k.left=j.x+'px';c.setStyles(k);};var c;CKEDITOR.on('reset',function(){c&&c.remove();c=null;});CKEDITOR.on('dialogDefinition',function(d){var e=d.editor;if(e._.showDialogDefinitionTooltips){if(!c){c=CKEDITOR.dom.element.createFromHtml('<div id="cke_tooltip" tabindex="-1" style="position: absolute"></div>',CKEDITOR.document);c.hide();c.on('mouseover',function(){this.show();});c.on('mouseout',function(){this.hide();});c.appendTo(CKEDITOR.document.getBody());}var f=d.data.definition.dialog,g=e.config.devtools_textCallback||a;f.on('load',function(){var h=f.parts.tabs.getChildren(),i;for(var j=0,k=h.count();j<k;j++){i=h.getItem(j);i.on('mouseover',function(){var l=this.$.id;b(g,this,e,f,null,l.substring(4,l.lastIndexOf('_')));});i.on('mouseout',function(){c.hide();});}f.foreach(function(l){if(l.type in {hbox:1,vbox:1})return;var m=l.getElement();if(m){m.on('mouseover',function(){b(g,this,e,f,l,f._.currentTabId);});m.on('mouseout',function(){c.hide();});}});});}});})();
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.add('devtools',{lang:['en','bg','cs','cy','da','de','el','eo','et','fa','fi','fr','gu','he','hr','it','nb','nl','no','pl','pt-br','tr','ug','uk','vi','zh-cn'],init:function(a){a._.showDialogDefinitionTooltips=1;},onLoad:function(){CKEDITOR.document.appendStyleText(CKEDITOR.config.devtools_styles||'#cke_tooltip { padding: 5px; border: 2px solid #333; background: #ffffff }#cke_tooltip h2 { font-size: 1.1em; border-bottom: 1px solid; margin: 0; padding: 1px; }#cke_tooltip ul { padding: 0pt; list-style-type: none; }');}});(function(){function a(d,e,f,g){var h=d.lang.devTools,i='<a href="http://docs.cksource.com/ckeditor_api/symbols/CKEDITOR.dialog.definition.'+(f?f.type=='text'?'textInput':f.type:'content')+'.html" target="_blank">'+(f?f.type:'content')+'</a>',j='<h2>'+h.title+'</h2>'+'<ul>'+'<li><strong>'+h.dialogName+'</strong> : '+e.getName()+'</li>'+'<li><strong>'+h.tabName+'</strong> : '+g+'</li>';if(f)j+='<li><strong>'+h.elementId+'</strong> : '+f.id+'</li>';j+='<li><strong>'+h.elementType+'</strong> : '+i+'</li>';return j+'</ul>';};function b(d,e,f,g,h,i){var j=e.getDocumentPosition(),k={'z-index':CKEDITOR.dialog._.currentZIndex+10,top:j.y+e.getSize('height')+'px'};c.setHtml(d(f,g,h,i));c.show();if(f.lang.dir=='rtl'){var l=CKEDITOR.document.getWindow().getViewPaneSize();k.right=l.width-j.x-e.getSize('width')+'px';}else k.left=j.x+'px';c.setStyles(k);};var c;CKEDITOR.on('reset',function(){c&&c.remove();c=null;});CKEDITOR.on('dialogDefinition',function(d){var e=d.editor;if(e._.showDialogDefinitionTooltips){if(!c){c=CKEDITOR.dom.element.createFromHtml('<div id="cke_tooltip" tabindex="-1" style="position: absolute"></div>',CKEDITOR.document);c.hide();c.on('mouseover',function(){this.show();});c.on('mouseout',function(){this.hide();});c.appendTo(CKEDITOR.document.getBody());}var f=d.data.definition.dialog,g=e.config.devtools_textCallback||a;f.on('load',function(){var h=f.parts.tabs.getChildren(),i;for(var j=0,k=h.count();j<k;j++){i=h.getItem(j);i.on('mouseover',function(){var l=this.$.id;b(g,this,e,f,null,l.substring(4,l.lastIndexOf('_')));});i.on('mouseout',function(){c.hide();});}f.foreach(function(l){if(l.type in {hbox:1,vbox:1})return;var m=l.getElement();if(m){m.on('mouseover',function(){b(g,this,e,f,l,f._.currentTabId);});m.on('mouseout',function(){c.hide();});}});});}});})();
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/dialog/dialogDefinition.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/dialog/dialogDefinition.js
index a2c9d6d..8fcfa4b 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/dialog/dialogDefinition.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/dialog/dialogDefinition.js
@@ -1,4 +1,4 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/div/dialogs/div.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/div/dialogs/div.js
index e9cae67..a168f70 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/div/dialogs/div.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/div/dialogs/div.js
@@ -1,8 +1,8 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-(function(){function a(d,e,f){if(!e.is||!e.getCustomData('block_processed')){e.is&&CKEDITOR.dom.element.setMarker(f,e,'block_processed',true);d.push(e);}};function b(d){var e=[],f=d.getChildren();for(var g=0;g<f.count();g++){var h=f.getItem(g);if(!(h.type===CKEDITOR.NODE_TEXT&&/^[ \t\n\r]+$/.test(h.getText())))e.push(h);}return e;};function c(d,e){var f=(function(){var p=CKEDITOR.tools.extend({},CKEDITOR.dtd.$blockLimit);delete p.div;if(d.config.div_wrapTable){delete p.td;delete p.th;}return p;})(),g=CKEDITOR.dtd.div;function h(p){var q=new CKEDITOR.dom.elementPath(p).elements,r;for(var s=0;s<q.length;s++){if(q[s].getName() in f){r=q[s];break;}}return r;};function i(){this.foreach(function(p){if(/^(?!vbox|hbox)/.test(p.type)){if(!p.setup)p.setup=function(q){p.setValue(q.getAttribute(p.id)||'');};if(!p.commit)p.commit=function(q){var r=this.getValue();if('dir'==p.id&&q.getComputedStyle('direction')==r)return;if(r)q.setAttribute(p.id,r);else q.removeAttribute(p.id);};}});};function j(p){var q=[],r={},s=[],t,u=p.document.getSelection(),v=u.getRanges(),w=u.createBookmarks(),x,y,z=p.config.enterMode==CKEDITOR.ENTER_DIV?'div':'p';for(x=0;x<v.length;x++){y=v[x].createIterator();while(t=y.getNextParagraph()){if(t.getName() in f){var A,B=t.getChildren();for(A=0;A<B.count();A++)a(s,B.getItem(A),r);}else{while(!g[t.getName()]&&t.getName()!='body')t=t.getParent();a(s,t,r);}}}CKEDITOR.dom.element.clearAllMarkers(r);var C=l(s),D,E,F;for(x=0;x<C.length;x++){var G=C[x][0];D=G.getParent();for(A=1;A<C[x].length;A++)D=D.getCommonAncestor(C[x][A]);F=new CKEDITOR.dom.element('div',p.document);for(A=0;A<C[x].length;A++){G=C[x][A];while(!G.getParent().equals(D))G=G.getParent();C[x][A]=G;}var H=null;for(A=0;A<C[x].length;A++){G=C[x][A];if(!(G.getCustomData&&G.getCustomData('block_processed'))){G.is&&CKEDITOR.dom.element.setMarker(r,G,'block_processed',true);if(!A)F.insertBefore(G);F.append(G);}}CKEDITOR.dom.element.clearAllMarkers(r);q.push(F);}u.selectBookmarks(w);return q;};function k(p){var q=new CKEDITOR.dom.elementPath(p.getSelection().getStartElement()),r=q.blockLimit,s=r&&r.getAscendant('div',true);return s;};function l(p){var q=[],r=null,s,t;for(var u=0;u<p.length;u++){t=p[u];var v=h(t);if(!v.equals(r)){r=v;q.push([]);}q[q.length-1].push(t);}return q;};function m(p){var q=this.getDialog(),r=q._element&&q._element.clone()||new CKEDITOR.dom.element('div',d.document);this.commit(r,true);p=[].concat(p);var s=p.length,t;for(var u=0;u<s;u++){t=q.getContentElement.apply(q,p[u].split(':'));
-t&&t.setup&&t.setup(r,true);}};var n={},o=[];return{title:d.lang.div.title,minWidth:400,minHeight:165,contents:[{id:'info',label:d.lang.common.generalTab,title:d.lang.common.generalTab,elements:[{type:'hbox',widths:['50%','50%'],children:[{id:'elementStyle',type:'select',style:'width: 100%;',label:d.lang.div.styleSelectLabel,'default':'',items:[[d.lang.common.notSet,'']],onChange:function(){m.call(this,['info:class','advanced:dir','advanced:style']);},setup:function(p){for(var q in n)n[q].checkElementRemovable(p,true)&&this.setValue(q);},commit:function(p){var q;if(q=this.getValue()){var r=n[q],s=p.getCustomData('elementStyle')||'';r.applyToObject(p);p.setCustomData('elementStyle',s+r._.definition.attributes.style);}}},{id:'class',type:'text',label:d.lang.common.cssClass,'default':''}]}]},{id:'advanced',label:d.lang.common.advancedTab,title:d.lang.common.advancedTab,elements:[{type:'vbox',padding:1,children:[{type:'hbox',widths:['50%','50%'],children:[{type:'text',id:'id',label:d.lang.common.id,'default':''},{type:'text',id:'lang',label:d.lang.link.langCode,'default':''}]},{type:'hbox',children:[{type:'text',id:'style',style:'width: 100%;',label:d.lang.common.cssStyle,'default':'',commit:function(p){var q=this.getValue()+(p.getCustomData('elementStyle')||'');p.setAttribute('style',q);}}]},{type:'hbox',children:[{type:'text',id:'title',style:'width: 100%;',label:d.lang.common.advisoryTitle,'default':''}]},{type:'select',id:'dir',style:'width: 100%;',label:d.lang.common.langDir,'default':'',items:[[d.lang.common.notSet,''],[d.lang.common.langDirLtr,'ltr'],[d.lang.common.langDirRtl,'rtl']]}]}]}],onLoad:function(){i.call(this);var p=this,q=this.getContentElement('info','elementStyle');d.getStylesSet(function(r){var s;if(r)for(var t=0;t<r.length;t++){var u=r[t];if(u.element&&u.element=='div'){s=u.name;n[s]=new CKEDITOR.style(u);q.items.push([s,s]);q.add(s,s);}}q[q.items.length>1?'enable':'disable']();setTimeout(function(){q.setup(p._element);},0);});},onShow:function(){if(e=='editdiv'){var p=k(d);p&&this.setupContent(this._element=p);}},onOk:function(){if(e=='editdiv')o=[this._element];else o=j(d,true);var p=o.length;for(var q=0;q<p;q++){this.commitContent(o[q]);!o[q].getAttribute('style')&&o[q].removeAttribute('style');}this.hide();},onHide:function(){if(e=='editdiv')this._element.removeCustomData('elementStyle');delete this._element;}};};CKEDITOR.dialog.add('creatediv',function(d){return c(d,'creatediv');});CKEDITOR.dialog.add('editdiv',function(d){return c(d,'editdiv');
-});})();
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function(){function a(d,e,f){if(!e.is||!e.getCustomData('block_processed')){e.is&&CKEDITOR.dom.element.setMarker(f,e,'block_processed',true);d.push(e);}};function b(d){var e=[],f=d.getChildren();for(var g=0;g<f.count();g++){var h=f.getItem(g);if(!(h.type===CKEDITOR.NODE_TEXT&&/^[ \t\n\r]+$/.test(h.getText())))e.push(h);}return e;};function c(d,e){var f=(function(){var p=CKEDITOR.tools.extend({},CKEDITOR.dtd.$blockLimit);delete p.div;if(d.config.div_wrapTable){delete p.td;delete p.th;}return p;})(),g=CKEDITOR.dtd.div;function h(p){var q=new CKEDITOR.dom.elementPath(p).elements,r;for(var s=0;s<q.length;s++){if(q[s].getName() in f){r=q[s];break;}}return r;};function i(){this.foreach(function(p){if(/^(?!vbox|hbox)/.test(p.type)){if(!p.setup)p.setup=function(q){p.setValue(q.getAttribute(p.id)||'');};if(!p.commit)p.commit=function(q){var r=this.getValue();if('dir'==p.id&&q.getComputedStyle('direction')==r)return;if(r)q.setAttribute(p.id,r);else q.removeAttribute(p.id);};}});};function j(p){var q=[],r={},s=[],t,u=p.document.getSelection(),v=u.getRanges(),w=u.createBookmarks(),x,y,z=p.config.enterMode==CKEDITOR.ENTER_DIV?'div':'p';for(x=0;x<v.length;x++){y=v[x].createIterator();while(t=y.getNextParagraph()){if(t.getName() in f){var A,B=t.getChildren();for(A=0;A<B.count();A++)a(s,B.getItem(A),r);}else{while(!g[t.getName()]&&t.getName()!='body')t=t.getParent();a(s,t,r);}}}CKEDITOR.dom.element.clearAllMarkers(r);var C=l(s),D,E,F;for(x=0;x<C.length;x++){var G=C[x][0];D=G.getParent();for(A=1;A<C[x].length;A++)D=D.getCommonAncestor(C[x][A]);F=new CKEDITOR.dom.element('div',p.document);for(A=0;A<C[x].length;A++){G=C[x][A];while(!G.getParent().equals(D))G=G.getParent();C[x][A]=G;}var H=null;for(A=0;A<C[x].length;A++){G=C[x][A];if(!(G.getCustomData&&G.getCustomData('block_processed'))){G.is&&CKEDITOR.dom.element.setMarker(r,G,'block_processed',true);if(!A)F.insertBefore(G);F.append(G);}}CKEDITOR.dom.element.clearAllMarkers(r);q.push(F);}u.selectBookmarks(w);return q;};function k(p){var q=new CKEDITOR.dom.elementPath(p.getSelection().getStartElement()),r=q.blockLimit,s=r&&r.getAscendant('div',true);return s;};function l(p){var q=[],r=null,s,t;for(var u=0;u<p.length;u++){t=p[u];var v=h(t);if(!v.equals(r)){r=v;q.push([]);}q[q.length-1].push(t);}return q;};function m(p){var q=this.getDialog(),r=q._element&&q._element.clone()||new CKEDITOR.dom.element('div',d.document);this.commit(r,true);p=[].concat(p);var s=p.length,t;for(var u=0;u<s;u++){t=q.getContentElement.apply(q,p[u].split(':'));
+t&&t.setup&&t.setup(r,true);}};var n={},o=[];return{title:d.lang.div.title,minWidth:400,minHeight:165,contents:[{id:'info',label:d.lang.common.generalTab,title:d.lang.common.generalTab,elements:[{type:'hbox',widths:['50%','50%'],children:[{id:'elementStyle',type:'select',style:'width: 100%;',label:d.lang.div.styleSelectLabel,'default':'',items:[[d.lang.common.notSet,'']],onChange:function(){m.call(this,['info:class','advanced:dir','advanced:style']);},setup:function(p){for(var q in n)n[q].checkElementRemovable(p,true)&&this.setValue(q);},commit:function(p){var q;if(q=this.getValue()){var r=n[q],s=p.getCustomData('elementStyle')||'';r.applyToObject(p);p.setCustomData('elementStyle',s+r._.definition.attributes.style);}}},{id:'class',type:'text',label:d.lang.common.cssClass,'default':''}]}]},{id:'advanced',label:d.lang.common.advancedTab,title:d.lang.common.advancedTab,elements:[{type:'vbox',padding:1,children:[{type:'hbox',widths:['50%','50%'],children:[{type:'text',id:'id',label:d.lang.common.id,'default':''},{type:'text',id:'lang',label:d.lang.link.langCode,'default':''}]},{type:'hbox',children:[{type:'text',id:'style',style:'width: 100%;',label:d.lang.common.cssStyle,'default':'',commit:function(p){var q=this.getValue()+(p.getCustomData('elementStyle')||'');p.setAttribute('style',q);}}]},{type:'hbox',children:[{type:'text',id:'title',style:'width: 100%;',label:d.lang.common.advisoryTitle,'default':''}]},{type:'select',id:'dir',style:'width: 100%;',label:d.lang.common.langDir,'default':'',items:[[d.lang.common.notSet,''],[d.lang.common.langDirLtr,'ltr'],[d.lang.common.langDirRtl,'rtl']]}]}]}],onLoad:function(){i.call(this);var p=this,q=this.getContentElement('info','elementStyle');d.getStylesSet(function(r){var s;if(r)for(var t=0;t<r.length;t++){var u=r[t];if(u.element&&u.element=='div'){s=u.name;n[s]=new CKEDITOR.style(u);q.items.push([s,s]);q.add(s,s);}}q[q.items.length>1?'enable':'disable']();setTimeout(function(){q.setup(p._element);},0);});},onShow:function(){if(e=='editdiv'){var p=k(d);p&&this.setupContent(this._element=p);}},onOk:function(){if(e=='editdiv')o=[this._element];else o=j(d,true);var p=o.length;for(var q=0;q<p;q++){this.commitContent(o[q]);!o[q].getAttribute('style')&&o[q].removeAttribute('style');}this.hide();},onHide:function(){if(e=='editdiv')this._element.removeCustomData('elementStyle');delete this._element;}};};CKEDITOR.dialog.add('creatediv',function(d){return c(d,'creatediv');});CKEDITOR.dialog.add('editdiv',function(d){return c(d,'editdiv');
+});})();
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/docprops/dialogs/docprops.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/docprops/dialogs/docprops.js
index 80029ec..63a6c1a 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/docprops/dialogs/docprops.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/docprops/dialogs/docprops.js
@@ -1,10 +1,10 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.dialog.add('docProps',function(a){var b=a.lang.docprops,c=a.lang.common,d={};function e(n,o){var p=function(){q(this);o(this,this._.parentDialog);},q=function(s){s.removeListener('ok',p);s.removeListener('cancel',q);},r=function(s){s.on('ok',p);s.on('cancel',q);};a.execCommand(n);if(a._.storedDialogs.colordialog)r(a._.storedDialogs.colordialog);else CKEDITOR.on('dialogDefinition',function(s){if(s.data.name!=n)return;var t=s.data.definition;s.removeListener();t.onLoad=CKEDITOR.tools.override(t.onLoad,function(u){return function(){r(this);t.onLoad=u;if(typeof u=='function')u.call(this);};});});};function f(){var n=this.getDialog(),o=n.getContentElement('general',this.id+'Other');if(!o)return;if(this.getValue()=='other'){o.getInputElement().removeAttribute('readOnly');o.focus();o.getElement().removeClass('cke_disabled');}else{o.getInputElement().setAttribute('readOnly',true);o.getElement().addClass('cke_disabled');}};function g(n,o,p){return function(q,r,s){var t=d,u=typeof p!='undefined'?p:this.getValue();if(!u&&n in t)t[n].remove();else if(u&&n in t)t[n].setAttribute('content',u);else if(u){var v=new CKEDITOR.dom.element('meta',a.document);v.setAttribute(o?'http-equiv':'name',n);v.setAttribute('content',u);s.append(v);}};};function h(n,o){return function(){var p=d,q=n in p?p[n].getAttribute('content')||'':'';if(o)return q;this.setValue(q);return null;};};function i(n){return function(o,p,q,r){r.removeAttribute('margin'+n);var s=this.getValue();if(s!=='')r.setStyle('margin-'+n,CKEDITOR.tools.cssLength(s));else r.removeStyle('margin-'+n);};};function j(n){var o={},p=n.getElementsByTag('meta'),q=p.count();for(var r=0;r<q;r++){var s=p.getItem(r);o[s.getAttribute(s.hasAttribute('http-equiv')?'http-equiv':'name').toLowerCase()]=s;}return o;};function k(n,o,p){n.removeStyle(o);if(n.getComputedStyle(o)!=p)n.setStyle(o,p);};var l=function(n,o,p){return{type:'hbox',padding:0,widths:['60%','40%'],children:[CKEDITOR.tools.extend({type:'text',id:n,label:b[o]},p||{},1),{type:'button',id:n+'Choose',label:b.chooseColor,className:'colorChooser',onClick:function(){var q=this;e('colordialog',function(r){var s=q.getDialog();s.getContentElement(s._.currentTabId,n).setValue(r.getContentElement('picker','selectedColor').getValue());});}}]};},m='javascript:void((function(){'+encodeURIComponent('document.open();'+(CKEDITOR.env.isCustomDomain()?"document.domain='"+document.domain+"';":'')+'document.write( \'<html style="background-color: #ffffff; height: 100%"><head></head><body style="width: 100%; height: 100%; margin: 0px">'+b.previewHtml+"</body></html>' );"+'document.close();')+'})())';
-return{title:b.title,minHeight:330,minWidth:500,onShow:function(){var n=a.document,o=n.getElementsByTag('html').getItem(0),p=n.getHead(),q=n.getBody();d=j(n);this.setupContent(n,o,p,q);},onHide:function(){d={};},onOk:function(){var n=a.document,o=n.getElementsByTag('html').getItem(0),p=n.getHead(),q=n.getBody();this.commitContent(n,o,p,q);},contents:[{id:'general',label:c.generalTab,elements:[{type:'text',id:'title',label:b.docTitle,setup:function(n){this.setValue(n.getElementsByTag('title').getItem(0).data('cke-title'));},commit:function(n,o,p,q,r){if(r)return;n.getElementsByTag('title').getItem(0).data('cke-title',this.getValue());}},{type:'hbox',children:[{type:'select',id:'dir',label:c.langDir,style:'width: 100%',items:[[c.notSet,''],[c.langDirLtr,'ltr'],[c.langDirRtl,'rtl']],setup:function(n,o,p,q){this.setValue(q.getDirection()||'');},commit:function(n,o,p,q){var r=this.getValue();if(r)q.setAttribute('dir',r);else q.removeAttribute('dir');q.removeStyle('direction');}},{type:'text',id:'langCode',label:c.langCode,setup:function(n,o){this.setValue(o.getAttribute('xml:lang')||o.getAttribute('lang')||'');},commit:function(n,o,p,q,r){if(r)return;var s=this.getValue();if(s)o.setAttributes({'xml:lang':s,lang:s});else o.removeAttributes({'xml:lang':1,lang:1});}}]},{type:'hbox',children:[{type:'select',id:'charset',label:b.charset,style:'width: 100%',items:[[c.notSet,''],[b.charsetASCII,'us-ascii'],[b.charsetCE,'iso-8859-2'],[b.charsetCT,'big5'],[b.charsetCR,'iso-8859-5'],[b.charsetGR,'iso-8859-7'],[b.charsetJP,'iso-2022-jp'],[b.charsetKR,'iso-2022-kr'],[b.charsetTR,'iso-8859-9'],[b.charsetUN,'utf-8'],[b.charsetWE,'iso-8859-1'],[b.other,'other']],'default':'',onChange:function(){var n=this;n.getDialog().selectedCharset=n.getValue()!='other'?n.getValue():'';f.call(n);},setup:function(){var q=this;q.metaCharset='charset' in d;var n=h(q.metaCharset?'charset':'content-type',1,1),o=n.call(q);!q.metaCharset&&o.match(/charset=[^=]+$/)&&(o=o.substring(o.indexOf('=')+1));if(o){q.setValue(o.toLowerCase());if(!q.getValue()){q.setValue('other');var p=q.getDialog().getContentElement('general','charsetOther');p&&p.setValue(o);}q.getDialog().selectedCharset=o;}f.call(q);},commit:function(n,o,p,q,r){var v=this;if(r)return;var s=v.getValue(),t=v.getDialog().getContentElement('general','charsetOther');s=='other'&&(s=t?t.getValue():'');s&&!v.metaCharset&&(s=(d['content-type']?d['content-type'].getAttribute('content').split(';')[0]:'text/html')+'; charset='+s);var u=g(v.metaCharset?'charset':'content-type',1,s);
-u.call(v,n,o,p);}},{type:'text',id:'charsetOther',label:b.charsetOther,onChange:function(){this.getDialog().selectedCharset=this.getValue();}}]},{type:'hbox',children:[{type:'select',id:'docType',label:b.docType,style:'width: 100%',items:[[c.notSet,''],['XHTML 1.1','<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">'],['XHTML 1.0 Transitional','<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'],['XHTML 1.0 Strict','<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'],['XHTML 1.0 Frameset','<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">'],['HTML 5','<!DOCTYPE html>'],['HTML 4.01 Transitional','<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">'],['HTML 4.01 Strict','<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">'],['HTML 4.01 Frameset','<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">'],['HTML 3.2','<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">'],['HTML 2.0','<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">'],[b.other,'other']],onChange:f,setup:function(){var o=this;if(a.docType){o.setValue(a.docType);if(!o.getValue()){o.setValue('other');var n=o.getDialog().getContentElement('general','docTypeOther');n&&n.setValue(a.docType);}}f.call(o);},commit:function(n,o,p,q,r){if(r)return;var s=this.getValue(),t=this.getDialog().getContentElement('general','docTypeOther');a.docType=s=='other'?t?t.getValue():'':s;}},{type:'text',id:'docTypeOther',label:b.docTypeOther}]},{type:'checkbox',id:'xhtmlDec',label:b.xhtmlDec,setup:function(){this.setValue(!!a.xmlDeclaration);},commit:function(n,o,p,q,r){if(r)return;if(this.getValue()){a.xmlDeclaration='<?xml version="1.0" encoding="'+(this.getDialog().selectedCharset||'utf-8')+'"?>';o.setAttribute('xmlns','http://www.w3.org/1999/xhtml');}else{a.xmlDeclaration='';o.removeAttribute('xmlns');}}}]},{id:'design',label:b.design,elements:[{type:'hbox',widths:['60%','40%'],children:[{type:'vbox',children:[l('txtColor','txtColor',{setup:function(n,o,p,q){this.setValue(q.getComputedStyle('color'));},commit:function(n,o,p,q,r){if(this.isChanged()||r){q.removeAttribute('text');var s=this.getValue();if(s)q.setStyle('color',s);else q.removeStyle('color');}}}),l('bgColor','bgColor',{setup:function(n,o,p,q){var r=q.getComputedStyle('background-color')||'';
-this.setValue(r=='transparent'?'':r);},commit:function(n,o,p,q,r){if(this.isChanged()||r){q.removeAttribute('bgcolor');var s=this.getValue();if(s)q.setStyle('background-color',s);else k(q,'background-color','transparent');}}}),{type:'hbox',widths:['60%','40%'],padding:1,children:[{type:'text',id:'bgImage',label:b.bgImage,setup:function(n,o,p,q){var r=q.getComputedStyle('background-image')||'';if(r=='none')r='';else r=r.replace(/url\(\s*(["']?)\s*([^\)]*)\s*\1\s*\)/i,function(s,t,u){return u;});this.setValue(r);},commit:function(n,o,p,q){q.removeAttribute('background');var r=this.getValue();if(r)q.setStyle('background-image','url('+r+')');else k(q,'background-image','none');}},{type:'button',id:'bgImageChoose',label:c.browseServer,style:'display:inline-block;margin-top:10px;',hidden:true,filebrowser:'design:bgImage'}]},{type:'checkbox',id:'bgFixed',label:b.bgFixed,setup:function(n,o,p,q){this.setValue(q.getComputedStyle('background-attachment')=='fixed');},commit:function(n,o,p,q){if(this.getValue())q.setStyle('background-attachment','fixed');else k(q,'background-attachment','scroll');}}]},{type:'vbox',children:[{type:'html',id:'marginTitle',html:'<div style="text-align: center; margin: 0px auto; font-weight: bold">'+b.margin+'</div>'},{type:'text',id:'marginTop',label:b.marginTop,style:'width: 80px; text-align: center',align:'center',inputStyle:'text-align: center',setup:function(n,o,p,q){this.setValue(q.getStyle('margin-top')||q.getAttribute('margintop')||'');},commit:i('top')},{type:'hbox',children:[{type:'text',id:'marginLeft',label:b.marginLeft,style:'width: 80px; text-align: center',align:'center',inputStyle:'text-align: center',setup:function(n,o,p,q){this.setValue(q.getStyle('margin-left')||q.getAttribute('marginleft')||'');},commit:i('left')},{type:'text',id:'marginRight',label:b.marginRight,style:'width: 80px; text-align: center',align:'center',inputStyle:'text-align: center',setup:function(n,o,p,q){this.setValue(q.getStyle('margin-right')||q.getAttribute('marginright')||'');},commit:i('right')}]},{type:'text',id:'marginBottom',label:b.marginBottom,style:'width: 80px; text-align: center',align:'center',inputStyle:'text-align: center',setup:function(n,o,p,q){this.setValue(q.getStyle('margin-bottom')||q.getAttribute('marginbottom')||'');},commit:i('bottom')}]}]}]},{id:'meta',label:b.meta,elements:[{type:'textarea',id:'metaKeywords',label:b.metaKeywords,setup:h('keywords'),commit:g('keywords')},{type:'textarea',id:'metaDescription',label:b.metaDescription,setup:h('description'),commit:g('description')},{type:'text',id:'metaAuthor',label:b.metaAuthor,setup:h('author'),commit:g('author')},{type:'text',id:'metaCopyright',label:b.metaCopyright,setup:h('copyright'),commit:g('copyright')}]},{id:'preview',label:c.preview,elements:[{type:'html',id:'previewHtml',html:'<iframe src="'+m+'" style="width: 100%; height: 310px" hidefocus="true" frameborder="0" '+'id="cke_docProps_preview_iframe"></iframe>',onLoad:function(){this.getDialog().on('selectPage',function(n){if(n.data.page=='preview'){var o=this;
-setTimeout(function(){var p=CKEDITOR.document.getById('cke_docProps_preview_iframe').getFrameDocument(),q=p.getElementsByTag('html').getItem(0),r=p.getHead(),s=p.getBody();o.commitContent(p,q,r,s,1);},50);}});CKEDITOR.document.getById('cke_docProps_preview_iframe').getAscendant('table').setStyle('height','100%');}}]}]};});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.dialog.add('docProps',function(a){var b=a.lang.docprops,c=a.lang.common,d={};function e(n,o){var p=function(){q(this);o(this,this._.parentDialog);},q=function(s){s.removeListener('ok',p);s.removeListener('cancel',q);},r=function(s){s.on('ok',p);s.on('cancel',q);};a.execCommand(n);if(a._.storedDialogs.colordialog)r(a._.storedDialogs.colordialog);else CKEDITOR.on('dialogDefinition',function(s){if(s.data.name!=n)return;var t=s.data.definition;s.removeListener();t.onLoad=CKEDITOR.tools.override(t.onLoad,function(u){return function(){r(this);t.onLoad=u;if(typeof u=='function')u.call(this);};});});};function f(){var n=this.getDialog(),o=n.getContentElement('general',this.id+'Other');if(!o)return;if(this.getValue()=='other'){o.getInputElement().removeAttribute('readOnly');o.focus();o.getElement().removeClass('cke_disabled');}else{o.getInputElement().setAttribute('readOnly',true);o.getElement().addClass('cke_disabled');}};function g(n,o,p){return function(q,r,s){var t=d,u=typeof p!='undefined'?p:this.getValue();if(!u&&n in t)t[n].remove();else if(u&&n in t)t[n].setAttribute('content',u);else if(u){var v=new CKEDITOR.dom.element('meta',a.document);v.setAttribute(o?'http-equiv':'name',n);v.setAttribute('content',u);s.append(v);}};};function h(n,o){return function(){var p=d,q=n in p?p[n].getAttribute('content')||'':'';if(o)return q;this.setValue(q);return null;};};function i(n){return function(o,p,q,r){r.removeAttribute('margin'+n);var s=this.getValue();if(s!=='')r.setStyle('margin-'+n,CKEDITOR.tools.cssLength(s));else r.removeStyle('margin-'+n);};};function j(n){var o={},p=n.getElementsByTag('meta'),q=p.count();for(var r=0;r<q;r++){var s=p.getItem(r);o[s.getAttribute(s.hasAttribute('http-equiv')?'http-equiv':'name').toLowerCase()]=s;}return o;};function k(n,o,p){n.removeStyle(o);if(n.getComputedStyle(o)!=p)n.setStyle(o,p);};var l=function(n,o,p){return{type:'hbox',padding:0,widths:['60%','40%'],children:[CKEDITOR.tools.extend({type:'text',id:n,label:b[o]},p||{},1),{type:'button',id:n+'Choose',label:b.chooseColor,className:'colorChooser',onClick:function(){var q=this;e('colordialog',function(r){var s=q.getDialog();s.getContentElement(s._.currentTabId,n).setValue(r.getContentElement('picker','selectedColor').getValue());});}}]};},m='javascript:void((function(){'+encodeURIComponent('document.open();'+(CKEDITOR.env.isCustomDomain()?"document.domain='"+document.domain+"';":'')+'document.write( \'<html style="background-color: #ffffff; height: 100%"><head></head><body style="width: 100%; height: 100%; margin: 0px">'+b.previewHtml+"</body></html>' );"+'document.close();')+'})())';
+return{title:b.title,minHeight:330,minWidth:500,onShow:function(){var n=a.document,o=n.getElementsByTag('html').getItem(0),p=n.getHead(),q=n.getBody();d=j(n);this.setupContent(n,o,p,q);},onHide:function(){d={};},onOk:function(){var n=a.document,o=n.getElementsByTag('html').getItem(0),p=n.getHead(),q=n.getBody();this.commitContent(n,o,p,q);},contents:[{id:'general',label:c.generalTab,elements:[{type:'text',id:'title',label:b.docTitle,setup:function(n){this.setValue(n.getElementsByTag('title').getItem(0).data('cke-title'));},commit:function(n,o,p,q,r){if(r)return;n.getElementsByTag('title').getItem(0).data('cke-title',this.getValue());}},{type:'hbox',children:[{type:'select',id:'dir',label:c.langDir,style:'width: 100%',items:[[c.notSet,''],[c.langDirLtr,'ltr'],[c.langDirRtl,'rtl']],setup:function(n,o,p,q){this.setValue(q.getDirection()||'');},commit:function(n,o,p,q){var r=this.getValue();if(r)q.setAttribute('dir',r);else q.removeAttribute('dir');q.removeStyle('direction');}},{type:'text',id:'langCode',label:c.langCode,setup:function(n,o){this.setValue(o.getAttribute('xml:lang')||o.getAttribute('lang')||'');},commit:function(n,o,p,q,r){if(r)return;var s=this.getValue();if(s)o.setAttributes({'xml:lang':s,lang:s});else o.removeAttributes({'xml:lang':1,lang:1});}}]},{type:'hbox',children:[{type:'select',id:'charset',label:b.charset,style:'width: 100%',items:[[c.notSet,''],[b.charsetASCII,'us-ascii'],[b.charsetCE,'iso-8859-2'],[b.charsetCT,'big5'],[b.charsetCR,'iso-8859-5'],[b.charsetGR,'iso-8859-7'],[b.charsetJP,'iso-2022-jp'],[b.charsetKR,'iso-2022-kr'],[b.charsetTR,'iso-8859-9'],[b.charsetUN,'utf-8'],[b.charsetWE,'iso-8859-1'],[b.other,'other']],'default':'',onChange:function(){var n=this;n.getDialog().selectedCharset=n.getValue()!='other'?n.getValue():'';f.call(n);},setup:function(){var q=this;q.metaCharset='charset' in d;var n=h(q.metaCharset?'charset':'content-type',1,1),o=n.call(q);!q.metaCharset&&o.match(/charset=[^=]+$/)&&(o=o.substring(o.indexOf('=')+1));if(o){q.setValue(o.toLowerCase());if(!q.getValue()){q.setValue('other');var p=q.getDialog().getContentElement('general','charsetOther');p&&p.setValue(o);}q.getDialog().selectedCharset=o;}f.call(q);},commit:function(n,o,p,q,r){var v=this;if(r)return;var s=v.getValue(),t=v.getDialog().getContentElement('general','charsetOther');s=='other'&&(s=t?t.getValue():'');s&&!v.metaCharset&&(s=(d['content-type']?d['content-type'].getAttribute('content').split(';')[0]:'text/html')+'; charset='+s);var u=g(v.metaCharset?'charset':'content-type',1,s);
+u.call(v,n,o,p);}},{type:'text',id:'charsetOther',label:b.charsetOther,onChange:function(){this.getDialog().selectedCharset=this.getValue();}}]},{type:'hbox',children:[{type:'select',id:'docType',label:b.docType,style:'width: 100%',items:[[c.notSet,''],['XHTML 1.1','<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">'],['XHTML 1.0 Transitional','<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">'],['XHTML 1.0 Strict','<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'],['XHTML 1.0 Frameset','<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">'],['HTML 5','<!DOCTYPE html>'],['HTML 4.01 Transitional','<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">'],['HTML 4.01 Strict','<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">'],['HTML 4.01 Frameset','<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">'],['HTML 3.2','<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">'],['HTML 2.0','<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">'],[b.other,'other']],onChange:f,setup:function(){var o=this;if(a.docType){o.setValue(a.docType);if(!o.getValue()){o.setValue('other');var n=o.getDialog().getContentElement('general','docTypeOther');n&&n.setValue(a.docType);}}f.call(o);},commit:function(n,o,p,q,r){if(r)return;var s=this.getValue(),t=this.getDialog().getContentElement('general','docTypeOther');a.docType=s=='other'?t?t.getValue():'':s;}},{type:'text',id:'docTypeOther',label:b.docTypeOther}]},{type:'checkbox',id:'xhtmlDec',label:b.xhtmlDec,setup:function(){this.setValue(!!a.xmlDeclaration);},commit:function(n,o,p,q,r){if(r)return;if(this.getValue()){a.xmlDeclaration='<?xml version="1.0" encoding="'+(this.getDialog().selectedCharset||'utf-8')+'"?>';o.setAttribute('xmlns','http://www.w3.org/1999/xhtml');}else{a.xmlDeclaration='';o.removeAttribute('xmlns');}}}]},{id:'design',label:b.design,elements:[{type:'hbox',widths:['60%','40%'],children:[{type:'vbox',children:[l('txtColor','txtColor',{setup:function(n,o,p,q){this.setValue(q.getComputedStyle('color'));},commit:function(n,o,p,q,r){if(this.isChanged()||r){q.removeAttribute('text');var s=this.getValue();if(s)q.setStyle('color',s);else q.removeStyle('color');}}}),l('bgColor','bgColor',{setup:function(n,o,p,q){var r=q.getComputedStyle('background-color')||'';
+this.setValue(r=='transparent'?'':r);},commit:function(n,o,p,q,r){if(this.isChanged()||r){q.removeAttribute('bgcolor');var s=this.getValue();if(s)q.setStyle('background-color',s);else k(q,'background-color','transparent');}}}),{type:'hbox',widths:['60%','40%'],padding:1,children:[{type:'text',id:'bgImage',label:b.bgImage,setup:function(n,o,p,q){var r=q.getComputedStyle('background-image')||'';if(r=='none')r='';else r=r.replace(/url\(\s*(["']?)\s*([^\)]*)\s*\1\s*\)/i,function(s,t,u){return u;});this.setValue(r);},commit:function(n,o,p,q){q.removeAttribute('background');var r=this.getValue();if(r)q.setStyle('background-image','url('+r+')');else k(q,'background-image','none');}},{type:'button',id:'bgImageChoose',label:c.browseServer,style:'display:inline-block;margin-top:10px;',hidden:true,filebrowser:'design:bgImage'}]},{type:'checkbox',id:'bgFixed',label:b.bgFixed,setup:function(n,o,p,q){this.setValue(q.getComputedStyle('background-attachment')=='fixed');},commit:function(n,o,p,q){if(this.getValue())q.setStyle('background-attachment','fixed');else k(q,'background-attachment','scroll');}}]},{type:'vbox',children:[{type:'html',id:'marginTitle',html:'<div style="text-align: center; margin: 0px auto; font-weight: bold">'+b.margin+'</div>'},{type:'text',id:'marginTop',label:b.marginTop,style:'width: 80px; text-align: center',align:'center',inputStyle:'text-align: center',setup:function(n,o,p,q){this.setValue(q.getStyle('margin-top')||q.getAttribute('margintop')||'');},commit:i('top')},{type:'hbox',children:[{type:'text',id:'marginLeft',label:b.marginLeft,style:'width: 80px; text-align: center',align:'center',inputStyle:'text-align: center',setup:function(n,o,p,q){this.setValue(q.getStyle('margin-left')||q.getAttribute('marginleft')||'');},commit:i('left')},{type:'text',id:'marginRight',label:b.marginRight,style:'width: 80px; text-align: center',align:'center',inputStyle:'text-align: center',setup:function(n,o,p,q){this.setValue(q.getStyle('margin-right')||q.getAttribute('marginright')||'');},commit:i('right')}]},{type:'text',id:'marginBottom',label:b.marginBottom,style:'width: 80px; text-align: center',align:'center',inputStyle:'text-align: center',setup:function(n,o,p,q){this.setValue(q.getStyle('margin-bottom')||q.getAttribute('marginbottom')||'');},commit:i('bottom')}]}]}]},{id:'meta',label:b.meta,elements:[{type:'textarea',id:'metaKeywords',label:b.metaKeywords,setup:h('keywords'),commit:g('keywords')},{type:'textarea',id:'metaDescription',label:b.metaDescription,setup:h('description'),commit:g('description')},{type:'text',id:'metaAuthor',label:b.metaAuthor,setup:h('author'),commit:g('author')},{type:'text',id:'metaCopyright',label:b.metaCopyright,setup:h('copyright'),commit:g('copyright')}]},{id:'preview',label:c.preview,elements:[{type:'html',id:'previewHtml',html:'<iframe src="'+m+'" style="width: 100%; height: 310px" hidefocus="true" frameborder="0" '+'id="cke_docProps_preview_iframe"></iframe>',onLoad:function(){this.getDialog().on('selectPage',function(n){if(n.data.page=='preview'){var o=this;
+setTimeout(function(){var p=CKEDITOR.document.getById('cke_docProps_preview_iframe').getFrameDocument(),q=p.getElementsByTag('html').getItem(0),r=p.getHead(),s=p.getBody();o.commitContent(p,q,r,s,1);},50);}});CKEDITOR.document.getById('cke_docProps_preview_iframe').getAscendant('table').setStyle('height','100%');}}]}]};});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/docprops/plugin.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/docprops/plugin.js
index 807d2e9..d5fba3a 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/docprops/plugin.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/docprops/plugin.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.add('docprops',{init:function(a){var b=new CKEDITOR.dialogCommand('docProps');b.modes={wysiwyg:a.config.fullPage};a.addCommand('docProps',b);CKEDITOR.dialog.add('docProps',this.path+'dialogs/docprops.js');a.ui.addButton('DocProps',{label:a.lang.docprops.label,command:'docProps'});}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.add('docprops',{init:function(a){var b=new CKEDITOR.dialogCommand('docProps');b.modes={wysiwyg:a.config.fullPage};a.addCommand('docProps',b);CKEDITOR.dialog.add('docProps',this.path+'dialogs/docprops.js');a.ui.addButton('DocProps',{label:a.lang.docprops.label,command:'docProps'});}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/find/dialogs/find.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/find/dialogs/find.js
index f95a13a..5d0d0c9 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/find/dialogs/find.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/find/dialogs/find.js
@@ -1,10 +1,10 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-(function(){var a;function b(i){return i.type==CKEDITOR.NODE_TEXT&&i.getLength()>0&&(!a||!i.isReadOnly());};function c(i){return!(i.type==CKEDITOR.NODE_ELEMENT&&i.isBlockBoundary(CKEDITOR.tools.extend({},CKEDITOR.dtd.$empty,CKEDITOR.dtd.$nonEditable)));};var d=function(){var i=this;return{textNode:i.textNode,offset:i.offset,character:i.textNode?i.textNode.getText().charAt(i.offset):null,hitMatchBoundary:i._.matchBoundary};},e=['find','replace'],f=[['txtFindFind','txtFindReplace'],['txtFindCaseChk','txtReplaceCaseChk'],['txtFindWordChk','txtReplaceWordChk'],['txtFindCyclic','txtReplaceCyclic']];function g(i){var j,k,l,m;j=i==='find'?1:0;k=1-j;var n,o=f.length;for(n=0;n<o;n++){l=this.getContentElement(e[j],f[n][j]);m=this.getContentElement(e[k],f[n][k]);m.setValue(l.getValue());}};var h=function(i,j){var k=new CKEDITOR.style(CKEDITOR.tools.extend({attributes:{'data-cke-highlight':1},fullMatch:1,ignoreReadonly:1,childRule:function(){return 0;}},i.config.find_highlight,true)),l=function(y,z){var A=this,B=new CKEDITOR.dom.walker(y);B.guard=z?c:function(C){!c(C)&&(A._.matchBoundary=true);};B.evaluator=b;B.breakOnFalse=1;if(y.startContainer.type==CKEDITOR.NODE_TEXT){this.textNode=y.startContainer;this.offset=y.startOffset-1;}this._={matchWord:z,walker:B,matchBoundary:false};};l.prototype={next:function(){return this.move();},back:function(){return this.move(true);},move:function(y){var A=this;var z=A.textNode;if(z===null)return d.call(A);A._.matchBoundary=false;if(z&&y&&A.offset>0){A.offset--;return d.call(A);}else if(z&&A.offset<z.getLength()-1){A.offset++;return d.call(A);}else{z=null;while(!z){z=A._.walker[y?'previous':'next'].call(A._.walker);if(A._.matchWord&&!z||A._.walker._.end)break;}A.textNode=z;if(z)A.offset=y?z.getLength()-1:0;else A.offset=0;}return d.call(A);}};var m=function(y,z){this._={walker:y,cursors:[],rangeLength:z,highlightRange:null,isMatched:0};};m.prototype={toDomRange:function(){var y=new CKEDITOR.dom.range(i.document),z=this._.cursors;if(z.length<1){var A=this._.walker.textNode;if(A)y.setStartAfter(A);else return null;}else{var B=z[0],C=z[z.length-1];y.setStart(B.textNode,B.offset);y.setEnd(C.textNode,C.offset+1);}return y;},updateFromDomRange:function(y){var B=this;var z,A=new l(y);B._.cursors=[];do{z=A.next();if(z.character)B._.cursors.push(z);}while(z.character);B._.rangeLength=B._.cursors.length;},setMatched:function(){this._.isMatched=true;},clearMatched:function(){this._.isMatched=false;},isMatched:function(){return this._.isMatched;
-},highlight:function(){var B=this;if(B._.cursors.length<1)return;if(B._.highlightRange)B.removeHighlight();var y=B.toDomRange(),z=y.createBookmark();k.applyToRange(y);y.moveToBookmark(z);B._.highlightRange=y;var A=y.startContainer;if(A.type!=CKEDITOR.NODE_ELEMENT)A=A.getParent();A.scrollIntoView();B.updateFromDomRange(y);},removeHighlight:function(){var z=this;if(!z._.highlightRange)return;var y=z._.highlightRange.createBookmark();k.removeFromRange(z._.highlightRange);z._.highlightRange.moveToBookmark(y);z.updateFromDomRange(z._.highlightRange);z._.highlightRange=null;},isReadOnly:function(){if(!this._.highlightRange)return 0;return this._.highlightRange.startContainer.isReadOnly();},moveBack:function(){var A=this;var y=A._.walker.back(),z=A._.cursors;if(y.hitMatchBoundary)A._.cursors=z=[];z.unshift(y);if(z.length>A._.rangeLength)z.pop();return y;},moveNext:function(){var A=this;var y=A._.walker.next(),z=A._.cursors;if(y.hitMatchBoundary)A._.cursors=z=[];z.push(y);if(z.length>A._.rangeLength)z.shift();return y;},getEndCharacter:function(){var y=this._.cursors;if(y.length<1)return null;return y[y.length-1].character;},getNextCharacterRange:function(y){var z,A,B=this._.cursors;if((z=B[B.length-1])&&z.textNode)A=new l(n(z));else A=this._.walker;return new m(A,y);},getCursors:function(){return this._.cursors;}};function n(y,z){var A=new CKEDITOR.dom.range();A.setStart(y.textNode,z?y.offset:y.offset+1);A.setEndAt(i.document.getBody(),CKEDITOR.POSITION_BEFORE_END);return A;};function o(y){var z=new CKEDITOR.dom.range();z.setStartAt(i.document.getBody(),CKEDITOR.POSITION_AFTER_START);z.setEnd(y.textNode,y.offset);return z;};var p=0,q=1,r=2,s=function(y,z){var A=[-1];if(z)y=y.toLowerCase();for(var B=0;B<y.length;B++){A.push(A[B]+1);while(A[B+1]>0&&y.charAt(B)!=y.charAt(A[B+1]-1))A[B+1]=A[A[B+1]-1]+1;}this._={overlap:A,state:0,ignoreCase:!!z,pattern:y};};s.prototype={feedCharacter:function(y){var z=this;if(z._.ignoreCase)y=y.toLowerCase();for(;;){if(y==z._.pattern.charAt(z._.state)){z._.state++;if(z._.state==z._.pattern.length){z._.state=0;return r;}return q;}else if(!z._.state)return p;else z._.state=z._.overlap[z._.state];}return null;},reset:function(){this._.state=0;}};var t=/[.,"'?!;: \u0085\u00a0\u1680\u280e\u2028\u2029\u202f\u205f\u3000]/,u=function(y){if(!y)return true;var z=y.charCodeAt(0);return z>=9&&z<=13||z>=8192&&z<=8202||t.test(y);},v={searchRange:null,matchRange:null,find:function(y,z,A,B,C,D){var O=this;if(!O.matchRange)O.matchRange=new m(new l(O.searchRange),y.length);
-else{O.matchRange.removeHighlight();O.matchRange=O.matchRange.getNextCharacterRange(y.length);}var E=new s(y,!z),F=p,G='%';while(G!==null){O.matchRange.moveNext();while(G=O.matchRange.getEndCharacter()){F=E.feedCharacter(G);if(F==r)break;if(O.matchRange.moveNext().hitMatchBoundary)E.reset();}if(F==r){if(A){var H=O.matchRange.getCursors(),I=H[H.length-1],J=H[0],K=o(J),L=n(I);K.trim();L.trim();var M=new l(K,true),N=new l(L,true);if(!(u(M.back().character)&&u(N.next().character)))continue;}O.matchRange.setMatched();if(C!==false)O.matchRange.highlight();return true;}}O.matchRange.clearMatched();O.matchRange.removeHighlight();if(B&&!D){O.searchRange=w(1);O.matchRange=null;return arguments.callee.apply(O,Array.prototype.slice.call(arguments).concat([true]));}return false;},replaceCounter:0,replace:function(y,z,A,B,C,D,E){var J=this;a=1;var F=0;if(J.matchRange&&J.matchRange.isMatched()&&!J.matchRange._.isReplaced&&!J.matchRange.isReadOnly()){J.matchRange.removeHighlight();var G=J.matchRange.toDomRange(),H=i.document.createText(A);if(!E){var I=i.getSelection();I.selectRanges([G]);i.fire('saveSnapshot');}G.deleteContents();G.insertNode(H);if(!E){I.selectRanges([G]);i.fire('saveSnapshot');}J.matchRange.updateFromDomRange(G);if(!E)J.matchRange.highlight();J.matchRange._.isReplaced=true;J.replaceCounter++;F=1;}else F=J.find(z,B,C,D,!E);a=0;return F;}};function w(y){var z,A=i.getSelection(),B=i.document.getBody();if(A&&!y){z=A.getRanges()[0].clone();z.collapse(true);}else{z=new CKEDITOR.dom.range();z.setStartAt(B,CKEDITOR.POSITION_AFTER_START);}z.setEndAt(B,CKEDITOR.POSITION_BEFORE_END);return z;};var x=i.lang.findAndReplace;return{title:x.title,resizable:CKEDITOR.DIALOG_RESIZE_NONE,minWidth:350,minHeight:170,buttons:[CKEDITOR.dialog.cancelButton],contents:[{id:'find',label:x.find,title:x.find,accessKey:'',elements:[{type:'hbox',widths:['230px','90px'],children:[{type:'text',id:'txtFindFind',label:x.findWhat,isChanged:false,labelLayout:'horizontal',accessKey:'F'},{type:'button',id:'btnFind',align:'left',style:'width:100%',label:x.find,onClick:function(){var y=this.getDialog();if(!v.find(y.getValueOf('find','txtFindFind'),y.getValueOf('find','txtFindCaseChk'),y.getValueOf('find','txtFindWordChk'),y.getValueOf('find','txtFindCyclic')))alert(x.notFoundMsg);}}]},{type:'fieldset',label:CKEDITOR.tools.htmlEncode(x.findOptions),style:'margin-top:29px',children:[{type:'vbox',padding:0,children:[{type:'checkbox',id:'txtFindCaseChk',isChanged:false,label:x.matchCase},{type:'checkbox',id:'txtFindWordChk',isChanged:false,label:x.matchWord},{type:'checkbox',id:'txtFindCyclic',isChanged:false,'default':true,label:x.matchCyclic}]}]}]},{id:'replace',label:x.replace,accessKey:'M',elements:[{type:'hbox',widths:['230px','90px'],children:[{type:'text',id:'txtFindReplace',label:x.findWhat,isChanged:false,labelLayout:'horizontal',accessKey:'F'},{type:'button',id:'btnFindReplace',align:'left',style:'width:100%',label:x.replace,onClick:function(){var y=this.getDialog();
-if(!v.replace(y,y.getValueOf('replace','txtFindReplace'),y.getValueOf('replace','txtReplace'),y.getValueOf('replace','txtReplaceCaseChk'),y.getValueOf('replace','txtReplaceWordChk'),y.getValueOf('replace','txtReplaceCyclic')))alert(x.notFoundMsg);}}]},{type:'hbox',widths:['230px','90px'],children:[{type:'text',id:'txtReplace',label:x.replaceWith,isChanged:false,labelLayout:'horizontal',accessKey:'R'},{type:'button',id:'btnReplaceAll',align:'left',style:'width:100%',label:x.replaceAll,isChanged:false,onClick:function(){var y=this.getDialog(),z;v.replaceCounter=0;v.searchRange=w(1);if(v.matchRange){v.matchRange.removeHighlight();v.matchRange=null;}i.fire('saveSnapshot');while(v.replace(y,y.getValueOf('replace','txtFindReplace'),y.getValueOf('replace','txtReplace'),y.getValueOf('replace','txtReplaceCaseChk'),y.getValueOf('replace','txtReplaceWordChk'),false,true)){}if(v.replaceCounter){alert(x.replaceSuccessMsg.replace(/%1/,v.replaceCounter));i.fire('saveSnapshot');}else alert(x.notFoundMsg);}}]},{type:'fieldset',label:CKEDITOR.tools.htmlEncode(x.findOptions),children:[{type:'vbox',padding:0,children:[{type:'checkbox',id:'txtReplaceCaseChk',isChanged:false,label:x.matchCase},{type:'checkbox',id:'txtReplaceWordChk',isChanged:false,label:x.matchWord},{type:'checkbox',id:'txtReplaceCyclic',isChanged:false,'default':true,label:x.matchCyclic}]}]}]}],onLoad:function(){var y=this,z,A,B=0;this.on('hide',function(){B=0;});this.on('show',function(){B=1;});this.selectPage=CKEDITOR.tools.override(this.selectPage,function(C){return function(D){C.call(y,D);var E=y._.tabs[D],F,G,H;G=D==='find'?'txtFindFind':'txtFindReplace';H=D==='find'?'txtFindWordChk':'txtReplaceWordChk';z=y.getContentElement(D,G);A=y.getContentElement(D,H);if(!E.initialized){F=CKEDITOR.document.getById(z._.inputId);E.initialized=true;}if(B)g.call(this,D);};});},onShow:function(){var B=this;v.searchRange=w();var y=B.getParentEditor().getSelection().getSelectedText(),z=j=='find'?'txtFindFind':'txtFindReplace',A=B.getContentElement(j,z);A.setValue(y);A.select();B.selectPage(j);B[(j=='find'&&B._.editor.readOnly?'hide':'show')+'Page']('replace');},onHide:function(){var y;if(v.matchRange&&v.matchRange.isMatched()){v.matchRange.removeHighlight();i.focus();y=v.matchRange.toDomRange();if(y)i.getSelection().selectRanges([y]);}delete v.matchRange;},onFocus:function(){if(j=='replace')return this.getContentElement('replace','txtFindReplace');else return this.getContentElement('find','txtFindFind');}};};CKEDITOR.dialog.add('find',function(i){return h(i,'find');
-});CKEDITOR.dialog.add('replace',function(i){return h(i,'replace');});})();
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function(){var a;function b(i){return i.type==CKEDITOR.NODE_TEXT&&i.getLength()>0&&(!a||!i.isReadOnly());};function c(i){return!(i.type==CKEDITOR.NODE_ELEMENT&&i.isBlockBoundary(CKEDITOR.tools.extend({},CKEDITOR.dtd.$empty,CKEDITOR.dtd.$nonEditable)));};var d=function(){var i=this;return{textNode:i.textNode,offset:i.offset,character:i.textNode?i.textNode.getText().charAt(i.offset):null,hitMatchBoundary:i._.matchBoundary};},e=['find','replace'],f=[['txtFindFind','txtFindReplace'],['txtFindCaseChk','txtReplaceCaseChk'],['txtFindWordChk','txtReplaceWordChk'],['txtFindCyclic','txtReplaceCyclic']];function g(i){var j,k,l,m;j=i==='find'?1:0;k=1-j;var n,o=f.length;for(n=0;n<o;n++){l=this.getContentElement(e[j],f[n][j]);m=this.getContentElement(e[k],f[n][k]);m.setValue(l.getValue());}};var h=function(i,j){var k=new CKEDITOR.style(CKEDITOR.tools.extend({attributes:{'data-cke-highlight':1},fullMatch:1,ignoreReadonly:1,childRule:function(){return 0;}},i.config.find_highlight,true)),l=function(y,z){var A=this,B=new CKEDITOR.dom.walker(y);B.guard=z?c:function(C){!c(C)&&(A._.matchBoundary=true);};B.evaluator=b;B.breakOnFalse=1;if(y.startContainer.type==CKEDITOR.NODE_TEXT){this.textNode=y.startContainer;this.offset=y.startOffset-1;}this._={matchWord:z,walker:B,matchBoundary:false};};l.prototype={next:function(){return this.move();},back:function(){return this.move(true);},move:function(y){var A=this;var z=A.textNode;if(z===null)return d.call(A);A._.matchBoundary=false;if(z&&y&&A.offset>0){A.offset--;return d.call(A);}else if(z&&A.offset<z.getLength()-1){A.offset++;return d.call(A);}else{z=null;while(!z){z=A._.walker[y?'previous':'next'].call(A._.walker);if(A._.matchWord&&!z||A._.walker._.end)break;}A.textNode=z;if(z)A.offset=y?z.getLength()-1:0;else A.offset=0;}return d.call(A);}};var m=function(y,z){this._={walker:y,cursors:[],rangeLength:z,highlightRange:null,isMatched:0};};m.prototype={toDomRange:function(){var y=new CKEDITOR.dom.range(i.document),z=this._.cursors;if(z.length<1){var A=this._.walker.textNode;if(A)y.setStartAfter(A);else return null;}else{var B=z[0],C=z[z.length-1];y.setStart(B.textNode,B.offset);y.setEnd(C.textNode,C.offset+1);}return y;},updateFromDomRange:function(y){var B=this;var z,A=new l(y);B._.cursors=[];do{z=A.next();if(z.character)B._.cursors.push(z);}while(z.character);B._.rangeLength=B._.cursors.length;},setMatched:function(){this._.isMatched=true;},clearMatched:function(){this._.isMatched=false;},isMatched:function(){return this._.isMatched;
+},highlight:function(){var B=this;if(B._.cursors.length<1)return;if(B._.highlightRange)B.removeHighlight();var y=B.toDomRange(),z=y.createBookmark();k.applyToRange(y);y.moveToBookmark(z);B._.highlightRange=y;var A=y.startContainer;if(A.type!=CKEDITOR.NODE_ELEMENT)A=A.getParent();A.scrollIntoView();B.updateFromDomRange(y);},removeHighlight:function(){var z=this;if(!z._.highlightRange)return;var y=z._.highlightRange.createBookmark();k.removeFromRange(z._.highlightRange);z._.highlightRange.moveToBookmark(y);z.updateFromDomRange(z._.highlightRange);z._.highlightRange=null;},isReadOnly:function(){if(!this._.highlightRange)return 0;return this._.highlightRange.startContainer.isReadOnly();},moveBack:function(){var A=this;var y=A._.walker.back(),z=A._.cursors;if(y.hitMatchBoundary)A._.cursors=z=[];z.unshift(y);if(z.length>A._.rangeLength)z.pop();return y;},moveNext:function(){var A=this;var y=A._.walker.next(),z=A._.cursors;if(y.hitMatchBoundary)A._.cursors=z=[];z.push(y);if(z.length>A._.rangeLength)z.shift();return y;},getEndCharacter:function(){var y=this._.cursors;if(y.length<1)return null;return y[y.length-1].character;},getNextCharacterRange:function(y){var z,A,B=this._.cursors;if((z=B[B.length-1])&&z.textNode)A=new l(n(z));else A=this._.walker;return new m(A,y);},getCursors:function(){return this._.cursors;}};function n(y,z){var A=new CKEDITOR.dom.range();A.setStart(y.textNode,z?y.offset:y.offset+1);A.setEndAt(i.document.getBody(),CKEDITOR.POSITION_BEFORE_END);return A;};function o(y){var z=new CKEDITOR.dom.range();z.setStartAt(i.document.getBody(),CKEDITOR.POSITION_AFTER_START);z.setEnd(y.textNode,y.offset);return z;};var p=0,q=1,r=2,s=function(y,z){var A=[-1];if(z)y=y.toLowerCase();for(var B=0;B<y.length;B++){A.push(A[B]+1);while(A[B+1]>0&&y.charAt(B)!=y.charAt(A[B+1]-1))A[B+1]=A[A[B+1]-1]+1;}this._={overlap:A,state:0,ignoreCase:!!z,pattern:y};};s.prototype={feedCharacter:function(y){var z=this;if(z._.ignoreCase)y=y.toLowerCase();for(;;){if(y==z._.pattern.charAt(z._.state)){z._.state++;if(z._.state==z._.pattern.length){z._.state=0;return r;}return q;}else if(!z._.state)return p;else z._.state=z._.overlap[z._.state];}return null;},reset:function(){this._.state=0;}};var t=/[.,"'?!;: \u0085\u00a0\u1680\u280e\u2028\u2029\u202f\u205f\u3000]/,u=function(y){if(!y)return true;var z=y.charCodeAt(0);return z>=9&&z<=13||z>=8192&&z<=8202||t.test(y);},v={searchRange:null,matchRange:null,find:function(y,z,A,B,C,D){var O=this;if(!O.matchRange)O.matchRange=new m(new l(O.searchRange),y.length);
+else{O.matchRange.removeHighlight();O.matchRange=O.matchRange.getNextCharacterRange(y.length);}var E=new s(y,!z),F=p,G='%';while(G!==null){O.matchRange.moveNext();while(G=O.matchRange.getEndCharacter()){F=E.feedCharacter(G);if(F==r)break;if(O.matchRange.moveNext().hitMatchBoundary)E.reset();}if(F==r){if(A){var H=O.matchRange.getCursors(),I=H[H.length-1],J=H[0],K=o(J),L=n(I);K.trim();L.trim();var M=new l(K,true),N=new l(L,true);if(!(u(M.back().character)&&u(N.next().character)))continue;}O.matchRange.setMatched();if(C!==false)O.matchRange.highlight();return true;}}O.matchRange.clearMatched();O.matchRange.removeHighlight();if(B&&!D){O.searchRange=w(1);O.matchRange=null;return arguments.callee.apply(O,Array.prototype.slice.call(arguments).concat([true]));}return false;},replaceCounter:0,replace:function(y,z,A,B,C,D,E){var J=this;a=1;var F=0;if(J.matchRange&&J.matchRange.isMatched()&&!J.matchRange._.isReplaced&&!J.matchRange.isReadOnly()){J.matchRange.removeHighlight();var G=J.matchRange.toDomRange(),H=i.document.createText(A);if(!E){var I=i.getSelection();I.selectRanges([G]);i.fire('saveSnapshot');}G.deleteContents();G.insertNode(H);if(!E){I.selectRanges([G]);i.fire('saveSnapshot');}J.matchRange.updateFromDomRange(G);if(!E)J.matchRange.highlight();J.matchRange._.isReplaced=true;J.replaceCounter++;F=1;}else F=J.find(z,B,C,D,!E);a=0;return F;}};function w(y){var z,A=i.getSelection(),B=i.document.getBody();if(A&&!y){z=A.getRanges()[0].clone();z.collapse(true);}else{z=new CKEDITOR.dom.range();z.setStartAt(B,CKEDITOR.POSITION_AFTER_START);}z.setEndAt(B,CKEDITOR.POSITION_BEFORE_END);return z;};var x=i.lang.findAndReplace;return{title:x.title,resizable:CKEDITOR.DIALOG_RESIZE_NONE,minWidth:350,minHeight:170,buttons:[CKEDITOR.dialog.cancelButton],contents:[{id:'find',label:x.find,title:x.find,accessKey:'',elements:[{type:'hbox',widths:['230px','90px'],children:[{type:'text',id:'txtFindFind',label:x.findWhat,isChanged:false,labelLayout:'horizontal',accessKey:'F'},{type:'button',id:'btnFind',align:'left',style:'width:100%',label:x.find,onClick:function(){var y=this.getDialog();if(!v.find(y.getValueOf('find','txtFindFind'),y.getValueOf('find','txtFindCaseChk'),y.getValueOf('find','txtFindWordChk'),y.getValueOf('find','txtFindCyclic')))alert(x.notFoundMsg);}}]},{type:'fieldset',label:CKEDITOR.tools.htmlEncode(x.findOptions),style:'margin-top:29px',children:[{type:'vbox',padding:0,children:[{type:'checkbox',id:'txtFindCaseChk',isChanged:false,label:x.matchCase},{type:'checkbox',id:'txtFindWordChk',isChanged:false,label:x.matchWord},{type:'checkbox',id:'txtFindCyclic',isChanged:false,'default':true,label:x.matchCyclic}]}]}]},{id:'replace',label:x.replace,accessKey:'M',elements:[{type:'hbox',widths:['230px','90px'],children:[{type:'text',id:'txtFindReplace',label:x.findWhat,isChanged:false,labelLayout:'horizontal',accessKey:'F'},{type:'button',id:'btnFindReplace',align:'left',style:'width:100%',label:x.replace,onClick:function(){var y=this.getDialog();
+if(!v.replace(y,y.getValueOf('replace','txtFindReplace'),y.getValueOf('replace','txtReplace'),y.getValueOf('replace','txtReplaceCaseChk'),y.getValueOf('replace','txtReplaceWordChk'),y.getValueOf('replace','txtReplaceCyclic')))alert(x.notFoundMsg);}}]},{type:'hbox',widths:['230px','90px'],children:[{type:'text',id:'txtReplace',label:x.replaceWith,isChanged:false,labelLayout:'horizontal',accessKey:'R'},{type:'button',id:'btnReplaceAll',align:'left',style:'width:100%',label:x.replaceAll,isChanged:false,onClick:function(){var y=this.getDialog(),z;v.replaceCounter=0;v.searchRange=w(1);if(v.matchRange){v.matchRange.removeHighlight();v.matchRange=null;}i.fire('saveSnapshot');while(v.replace(y,y.getValueOf('replace','txtFindReplace'),y.getValueOf('replace','txtReplace'),y.getValueOf('replace','txtReplaceCaseChk'),y.getValueOf('replace','txtReplaceWordChk'),false,true)){}if(v.replaceCounter){alert(x.replaceSuccessMsg.replace(/%1/,v.replaceCounter));i.fire('saveSnapshot');}else alert(x.notFoundMsg);}}]},{type:'fieldset',label:CKEDITOR.tools.htmlEncode(x.findOptions),children:[{type:'vbox',padding:0,children:[{type:'checkbox',id:'txtReplaceCaseChk',isChanged:false,label:x.matchCase},{type:'checkbox',id:'txtReplaceWordChk',isChanged:false,label:x.matchWord},{type:'checkbox',id:'txtReplaceCyclic',isChanged:false,'default':true,label:x.matchCyclic}]}]}]}],onLoad:function(){var y=this,z,A,B=0;this.on('hide',function(){B=0;});this.on('show',function(){B=1;});this.selectPage=CKEDITOR.tools.override(this.selectPage,function(C){return function(D){C.call(y,D);var E=y._.tabs[D],F,G,H;G=D==='find'?'txtFindFind':'txtFindReplace';H=D==='find'?'txtFindWordChk':'txtReplaceWordChk';z=y.getContentElement(D,G);A=y.getContentElement(D,H);if(!E.initialized){F=CKEDITOR.document.getById(z._.inputId);E.initialized=true;}if(B)g.call(this,D);};});},onShow:function(){var B=this;v.searchRange=w();var y=B.getParentEditor().getSelection().getSelectedText(),z=j=='find'?'txtFindFind':'txtFindReplace',A=B.getContentElement(j,z);A.setValue(y);A.select();B.selectPage(j);B[(j=='find'&&B._.editor.readOnly?'hide':'show')+'Page']('replace');},onHide:function(){var y;if(v.matchRange&&v.matchRange.isMatched()){v.matchRange.removeHighlight();i.focus();y=v.matchRange.toDomRange();if(y)i.getSelection().selectRanges([y]);}delete v.matchRange;},onFocus:function(){if(j=='replace')return this.getContentElement('replace','txtFindReplace');else return this.getContentElement('find','txtFindFind');}};};CKEDITOR.dialog.add('find',function(i){return h(i,'find');
+});CKEDITOR.dialog.add('replace',function(i){return h(i,'replace');});})();
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/flash/dialogs/flash.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/flash/dialogs/flash.js
index 604c346..5fcd57c 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/flash/dialogs/flash.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/flash/dialogs/flash.js
@@ -1,9 +1,9 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-(function(){var a=1,b=2,c=4,d={id:[{type:a,name:'id'}],classid:[{type:a,name:'classid'}],codebase:[{type:a,name:'codebase'}],pluginspage:[{type:c,name:'pluginspage'}],src:[{type:b,name:'movie'},{type:c,name:'src'},{type:a,name:'data'}],name:[{type:c,name:'name'}],align:[{type:a,name:'align'}],'class':[{type:a,name:'class'},{type:c,name:'class'}],width:[{type:a,name:'width'},{type:c,name:'width'}],height:[{type:a,name:'height'},{type:c,name:'height'}],hSpace:[{type:a,name:'hSpace'},{type:c,name:'hSpace'}],vSpace:[{type:a,name:'vSpace'},{type:c,name:'vSpace'}],style:[{type:a,name:'style'},{type:c,name:'style'}],type:[{type:c,name:'type'}]},e=['play','loop','menu','quality','scale','salign','wmode','bgcolor','base','flashvars','allowScriptAccess','allowFullScreen'];for(var f=0;f<e.length;f++)d[e[f]]=[{type:c,name:e[f]},{type:b,name:e[f]}];e=['allowFullScreen','play','loop','menu'];for(f=0;f<e.length;f++)d[e[f]][0]['default']=d[e[f]][1]['default']=true;var g=CKEDITOR.tools.cssLength;function h(j,k,l){var r=this;var m=d[r.id];if(!m)return;var n=r instanceof CKEDITOR.ui.dialog.checkbox;for(var o=0;o<m.length;o++){var p=m[o];switch(p.type){case a:if(!j)continue;if(j.getAttribute(p.name)!==null){var q=j.getAttribute(p.name);if(n)r.setValue(q.toLowerCase()=='true');else r.setValue(q);return;}else if(n)r.setValue(!!p['default']);break;case b:if(!j)continue;if(p.name in l){q=l[p.name];if(n)r.setValue(q.toLowerCase()=='true');else r.setValue(q);return;}else if(n)r.setValue(!!p['default']);break;case c:if(!k)continue;if(k.getAttribute(p.name)){q=k.getAttribute(p.name);if(n)r.setValue(q.toLowerCase()=='true');else r.setValue(q);return;}else if(n)r.setValue(!!p['default']);}}};function i(j,k,l){var t=this;var m=d[t.id];if(!m)return;var n=t.getValue()==='',o=t instanceof CKEDITOR.ui.dialog.checkbox;for(var p=0;p<m.length;p++){var q=m[p];switch(q.type){case a:if(!j||q.name=='data'&&k&&!j.hasAttribute('data'))continue;var r=t.getValue();if(n||o&&r===q['default'])j.removeAttribute(q.name);else j.setAttribute(q.name,r);break;case b:if(!j)continue;r=t.getValue();if(n||o&&r===q['default']){if(q.name in l)l[q.name].remove();}else if(q.name in l)l[q.name].setAttribute('value',r);else{var s=CKEDITOR.dom.element.createFromHtml('<cke:param></cke:param>',j.getDocument());s.setAttributes({name:q.name,value:r});if(j.getChildCount()<1)s.appendTo(j);else s.insertBefore(j.getFirst());}break;case c:if(!k)continue;r=t.getValue();if(n||o&&r===q['default'])k.removeAttribute(q.name);else k.setAttribute(q.name,r);
-}}};CKEDITOR.dialog.add('flash',function(j){var k=!j.config.flashEmbedTagOnly,l=j.config.flashAddEmbedTag||j.config.flashEmbedTagOnly,m,n='<div>'+CKEDITOR.tools.htmlEncode(j.lang.common.preview)+'<br>'+'<div id="cke_FlashPreviewLoader'+CKEDITOR.tools.getNextNumber()+'" style="display:none"><div class="loading"> </div></div>'+'<div id="cke_FlashPreviewBox'+CKEDITOR.tools.getNextNumber()+'" class="FlashPreviewBox"></div></div>';return{title:j.lang.flash.title,minWidth:420,minHeight:310,onShow:function(){var A=this;A.fakeImage=A.objectNode=A.embedNode=null;m=new CKEDITOR.dom.element('embed',j.document);var o=A.getSelectedElement();if(o&&o.data('cke-real-element-type')&&o.data('cke-real-element-type')=='flash'){A.fakeImage=o;var p=j.restoreRealElement(o),q=null,r=null,s={};if(p.getName()=='cke:object'){q=p;var t=q.getElementsByTag('embed','cke');if(t.count()>0)r=t.getItem(0);var u=q.getElementsByTag('param','cke');for(var v=0,w=u.count();v<w;v++){var x=u.getItem(v),y=x.getAttribute('name'),z=x.getAttribute('value');s[y]=z;}}else if(p.getName()=='cke:embed')r=p;A.objectNode=q;A.embedNode=r;A.setupContent(q,r,s,o);}},onOk:function(){var y=this;var o=null,p=null,q=null;if(!y.fakeImage){if(k){o=CKEDITOR.dom.element.createFromHtml('<cke:object></cke:object>',j.document);var r={classid:'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000',codebase:'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0'};o.setAttributes(r);}if(l){p=CKEDITOR.dom.element.createFromHtml('<cke:embed></cke:embed>',j.document);p.setAttributes({type:'application/x-shockwave-flash',pluginspage:'http://www.macromedia.com/go/getflashplayer'});if(o)p.appendTo(o);}}else{o=y.objectNode;p=y.embedNode;}if(o){q={};var s=o.getElementsByTag('param','cke');for(var t=0,u=s.count();t<u;t++)q[s.getItem(t).getAttribute('name')]=s.getItem(t);}var v={},w={};y.commitContent(o,p,q,v,w);var x=j.createFakeElement(o||p,'cke_flash','flash',true);x.setAttributes(w);x.setStyles(v);if(y.fakeImage){x.replace(y.fakeImage);j.getSelection().selectElement(x);}else j.insertElement(x);},onHide:function(){if(this.preview)this.preview.setHtml('');},contents:[{id:'info',label:j.lang.common.generalTab,accessKey:'I',elements:[{type:'vbox',padding:0,children:[{type:'hbox',widths:['280px','110px'],align:'right',children:[{id:'src',type:'text',label:j.lang.common.url,required:true,validate:CKEDITOR.dialog.validate.notEmpty(j.lang.flash.validateSrc),setup:h,commit:i,onLoad:function(){var o=this.getDialog(),p=function(q){m.setAttribute('src',q);
-o.preview.setHtml('<embed height="100%" width="100%" src="'+CKEDITOR.tools.htmlEncode(m.getAttribute('src'))+'" type="application/x-shockwave-flash"></embed>');};o.preview=o.getContentElement('info','preview').getElement().getChild(3);this.on('change',function(q){if(q.data&&q.data.value)p(q.data.value);});this.getInputElement().on('change',function(q){p(this.getValue());},this);}},{type:'button',id:'browse',filebrowser:'info:src',hidden:true,style:'display:inline-block;margin-top:10px;',label:j.lang.common.browseServer}]}]},{type:'hbox',widths:['25%','25%','25%','25%','25%'],children:[{type:'text',id:'width',style:'width:95px',label:j.lang.common.width,validate:CKEDITOR.dialog.validate.htmlLength(j.lang.common.invalidHtmlLength.replace('%1',j.lang.common.width)),setup:h,commit:i},{type:'text',id:'height',style:'width:95px',label:j.lang.common.height,validate:CKEDITOR.dialog.validate.htmlLength(j.lang.common.invalidHtmlLength.replace('%1',j.lang.common.height)),setup:h,commit:i},{type:'text',id:'hSpace',style:'width:95px',label:j.lang.flash.hSpace,validate:CKEDITOR.dialog.validate.integer(j.lang.flash.validateHSpace),setup:h,commit:i},{type:'text',id:'vSpace',style:'width:95px',label:j.lang.flash.vSpace,validate:CKEDITOR.dialog.validate.integer(j.lang.flash.validateVSpace),setup:h,commit:i}]},{type:'vbox',children:[{type:'html',id:'preview',style:'width:95%;',html:n}]}]},{id:'Upload',hidden:true,filebrowser:'uploadButton',label:j.lang.common.upload,elements:[{type:'file',id:'upload',label:j.lang.common.upload,size:38},{type:'fileButton',id:'uploadButton',label:j.lang.common.uploadSubmit,filebrowser:'info:src','for':['Upload','upload']}]},{id:'properties',label:j.lang.flash.propertiesTab,elements:[{type:'hbox',widths:['50%','50%'],children:[{id:'scale',type:'select',label:j.lang.flash.scale,'default':'',style:'width : 100%;',items:[[j.lang.common.notSet,''],[j.lang.flash.scaleAll,'showall'],[j.lang.flash.scaleNoBorder,'noborder'],[j.lang.flash.scaleFit,'exactfit']],setup:h,commit:i},{id:'allowScriptAccess',type:'select',label:j.lang.flash.access,'default':'',style:'width : 100%;',items:[[j.lang.common.notSet,''],[j.lang.flash.accessAlways,'always'],[j.lang.flash.accessSameDomain,'samedomain'],[j.lang.flash.accessNever,'never']],setup:h,commit:i}]},{type:'hbox',widths:['50%','50%'],children:[{id:'wmode',type:'select',label:j.lang.flash.windowMode,'default':'',style:'width : 100%;',items:[[j.lang.common.notSet,''],[j.lang.flash.windowModeWindow,'window'],[j.lang.flash.windowModeOpaque,'opaque'],[j.lang.flash.windowModeTransparent,'transparent']],setup:h,commit:i},{id:'quality',type:'select',label:j.lang.flash.quality,'default':'high',style:'width : 100%;',items:[[j.lang.common.notSet,''],[j.lang.flash.qualityBest,'best'],[j.lang.flash.qualityHigh,'high'],[j.lang.flash.qualityAutoHigh,'autohigh'],[j.lang.flash.qualityMedium,'medium'],[j.lang.flash.qualityAutoLow,'autolow'],[j.lang.flash.qualityLow,'low']],setup:h,commit:i}]},{type:'hbox',widths:['50%','50%'],children:[{id:'align',type:'select',label:j.lang.common.align,'default':'',style:'width : 100%;',items:[[j.lang.common.notSet,''],[j.lang.common.alignLeft,'left'],[j.lang.flash.alignAbsBottom,'absBottom'],[j.lang.flash.alignAbsMiddle,'absMiddle'],[j.lang.flash.alignBaseline,'baseline'],[j.lang.common.alignBottom,'bottom'],[j.lang.common.alignMiddle,'middle'],[j.lang.common.alignRight,'right'],[j.lang.flash.alignTextTop,'textTop'],[j.lang.common.alignTop,'top']],setup:h,commit:function(o,p,q,r,s){var t=this.getValue();
-i.apply(this,arguments);t&&(s.align=t);}},{type:'html',html:'<div></div>'}]},{type:'fieldset',label:CKEDITOR.tools.htmlEncode(j.lang.flash.flashvars),children:[{type:'vbox',padding:0,children:[{type:'checkbox',id:'menu',label:j.lang.flash.chkMenu,'default':true,setup:h,commit:i},{type:'checkbox',id:'play',label:j.lang.flash.chkPlay,'default':true,setup:h,commit:i},{type:'checkbox',id:'loop',label:j.lang.flash.chkLoop,'default':true,setup:h,commit:i},{type:'checkbox',id:'allowFullScreen',label:j.lang.flash.chkFull,'default':true,setup:h,commit:i}]}]}]},{id:'advanced',label:j.lang.common.advancedTab,elements:[{type:'hbox',children:[{type:'text',id:'id',label:j.lang.common.id,setup:h,commit:i}]},{type:'hbox',widths:['45%','55%'],children:[{type:'text',id:'bgcolor',label:j.lang.flash.bgcolor,setup:h,commit:i},{type:'text',id:'class',label:j.lang.common.cssClass,setup:h,commit:i}]},{type:'text',id:'style',validate:CKEDITOR.dialog.validate.inlineStyle(j.lang.common.invalidInlineStyle),label:j.lang.common.cssStyle,setup:h,commit:i}]}]};});})();
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function(){var a=1,b=2,c=4,d={id:[{type:a,name:'id'}],classid:[{type:a,name:'classid'}],codebase:[{type:a,name:'codebase'}],pluginspage:[{type:c,name:'pluginspage'}],src:[{type:b,name:'movie'},{type:c,name:'src'},{type:a,name:'data'}],name:[{type:c,name:'name'}],align:[{type:a,name:'align'}],'class':[{type:a,name:'class'},{type:c,name:'class'}],width:[{type:a,name:'width'},{type:c,name:'width'}],height:[{type:a,name:'height'},{type:c,name:'height'}],hSpace:[{type:a,name:'hSpace'},{type:c,name:'hSpace'}],vSpace:[{type:a,name:'vSpace'},{type:c,name:'vSpace'}],style:[{type:a,name:'style'},{type:c,name:'style'}],type:[{type:c,name:'type'}]},e=['play','loop','menu','quality','scale','salign','wmode','bgcolor','base','flashvars','allowScriptAccess','allowFullScreen'];for(var f=0;f<e.length;f++)d[e[f]]=[{type:c,name:e[f]},{type:b,name:e[f]}];e=['allowFullScreen','play','loop','menu'];for(f=0;f<e.length;f++)d[e[f]][0]['default']=d[e[f]][1]['default']=true;var g=CKEDITOR.tools.cssLength;function h(j,k,l){var r=this;var m=d[r.id];if(!m)return;var n=r instanceof CKEDITOR.ui.dialog.checkbox;for(var o=0;o<m.length;o++){var p=m[o];switch(p.type){case a:if(!j)continue;if(j.getAttribute(p.name)!==null){var q=j.getAttribute(p.name);if(n)r.setValue(q.toLowerCase()=='true');else r.setValue(q);return;}else if(n)r.setValue(!!p['default']);break;case b:if(!j)continue;if(p.name in l){q=l[p.name];if(n)r.setValue(q.toLowerCase()=='true');else r.setValue(q);return;}else if(n)r.setValue(!!p['default']);break;case c:if(!k)continue;if(k.getAttribute(p.name)){q=k.getAttribute(p.name);if(n)r.setValue(q.toLowerCase()=='true');else r.setValue(q);return;}else if(n)r.setValue(!!p['default']);}}};function i(j,k,l){var t=this;var m=d[t.id];if(!m)return;var n=t.getValue()==='',o=t instanceof CKEDITOR.ui.dialog.checkbox;for(var p=0;p<m.length;p++){var q=m[p];switch(q.type){case a:if(!j||q.name=='data'&&k&&!j.hasAttribute('data'))continue;var r=t.getValue();if(n||o&&r===q['default'])j.removeAttribute(q.name);else j.setAttribute(q.name,r);break;case b:if(!j)continue;r=t.getValue();if(n||o&&r===q['default']){if(q.name in l)l[q.name].remove();}else if(q.name in l)l[q.name].setAttribute('value',r);else{var s=CKEDITOR.dom.element.createFromHtml('<cke:param></cke:param>',j.getDocument());s.setAttributes({name:q.name,value:r});if(j.getChildCount()<1)s.appendTo(j);else s.insertBefore(j.getFirst());}break;case c:if(!k)continue;r=t.getValue();if(n||o&&r===q['default'])k.removeAttribute(q.name);else k.setAttribute(q.name,r);
+}}};CKEDITOR.dialog.add('flash',function(j){var k=!j.config.flashEmbedTagOnly,l=j.config.flashAddEmbedTag||j.config.flashEmbedTagOnly,m,n='<div>'+CKEDITOR.tools.htmlEncode(j.lang.common.preview)+'<br>'+'<div id="cke_FlashPreviewLoader'+CKEDITOR.tools.getNextNumber()+'" style="display:none"><div class="loading"> </div></div>'+'<div id="cke_FlashPreviewBox'+CKEDITOR.tools.getNextNumber()+'" class="FlashPreviewBox"></div></div>';return{title:j.lang.flash.title,minWidth:420,minHeight:310,onShow:function(){var A=this;A.fakeImage=A.objectNode=A.embedNode=null;m=new CKEDITOR.dom.element('embed',j.document);var o=A.getSelectedElement();if(o&&o.data('cke-real-element-type')&&o.data('cke-real-element-type')=='flash'){A.fakeImage=o;var p=j.restoreRealElement(o),q=null,r=null,s={};if(p.getName()=='cke:object'){q=p;var t=q.getElementsByTag('embed','cke');if(t.count()>0)r=t.getItem(0);var u=q.getElementsByTag('param','cke');for(var v=0,w=u.count();v<w;v++){var x=u.getItem(v),y=x.getAttribute('name'),z=x.getAttribute('value');s[y]=z;}}else if(p.getName()=='cke:embed')r=p;A.objectNode=q;A.embedNode=r;A.setupContent(q,r,s,o);}},onOk:function(){var y=this;var o=null,p=null,q=null;if(!y.fakeImage){if(k){o=CKEDITOR.dom.element.createFromHtml('<cke:object></cke:object>',j.document);var r={classid:'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000',codebase:'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0'};o.setAttributes(r);}if(l){p=CKEDITOR.dom.element.createFromHtml('<cke:embed></cke:embed>',j.document);p.setAttributes({type:'application/x-shockwave-flash',pluginspage:'http://www.macromedia.com/go/getflashplayer'});if(o)p.appendTo(o);}}else{o=y.objectNode;p=y.embedNode;}if(o){q={};var s=o.getElementsByTag('param','cke');for(var t=0,u=s.count();t<u;t++)q[s.getItem(t).getAttribute('name')]=s.getItem(t);}var v={},w={};y.commitContent(o,p,q,v,w);var x=j.createFakeElement(o||p,'cke_flash','flash',true);x.setAttributes(w);x.setStyles(v);if(y.fakeImage){x.replace(y.fakeImage);j.getSelection().selectElement(x);}else j.insertElement(x);},onHide:function(){if(this.preview)this.preview.setHtml('');},contents:[{id:'info',label:j.lang.common.generalTab,accessKey:'I',elements:[{type:'vbox',padding:0,children:[{type:'hbox',widths:['280px','110px'],align:'right',children:[{id:'src',type:'text',label:j.lang.common.url,required:true,validate:CKEDITOR.dialog.validate.notEmpty(j.lang.flash.validateSrc),setup:h,commit:i,onLoad:function(){var o=this.getDialog(),p=function(q){m.setAttribute('src',q);
+o.preview.setHtml('<embed height="100%" width="100%" src="'+CKEDITOR.tools.htmlEncode(m.getAttribute('src'))+'" type="application/x-shockwave-flash"></embed>');};o.preview=o.getContentElement('info','preview').getElement().getChild(3);this.on('change',function(q){if(q.data&&q.data.value)p(q.data.value);});this.getInputElement().on('change',function(q){p(this.getValue());},this);}},{type:'button',id:'browse',filebrowser:'info:src',hidden:true,style:'display:inline-block;margin-top:10px;',label:j.lang.common.browseServer}]}]},{type:'hbox',widths:['25%','25%','25%','25%','25%'],children:[{type:'text',id:'width',style:'width:95px',label:j.lang.common.width,validate:CKEDITOR.dialog.validate.htmlLength(j.lang.common.invalidHtmlLength.replace('%1',j.lang.common.width)),setup:h,commit:i},{type:'text',id:'height',style:'width:95px',label:j.lang.common.height,validate:CKEDITOR.dialog.validate.htmlLength(j.lang.common.invalidHtmlLength.replace('%1',j.lang.common.height)),setup:h,commit:i},{type:'text',id:'hSpace',style:'width:95px',label:j.lang.flash.hSpace,validate:CKEDITOR.dialog.validate.integer(j.lang.flash.validateHSpace),setup:h,commit:i},{type:'text',id:'vSpace',style:'width:95px',label:j.lang.flash.vSpace,validate:CKEDITOR.dialog.validate.integer(j.lang.flash.validateVSpace),setup:h,commit:i}]},{type:'vbox',children:[{type:'html',id:'preview',style:'width:95%;',html:n}]}]},{id:'Upload',hidden:true,filebrowser:'uploadButton',label:j.lang.common.upload,elements:[{type:'file',id:'upload',label:j.lang.common.upload,size:38},{type:'fileButton',id:'uploadButton',label:j.lang.common.uploadSubmit,filebrowser:'info:src','for':['Upload','upload']}]},{id:'properties',label:j.lang.flash.propertiesTab,elements:[{type:'hbox',widths:['50%','50%'],children:[{id:'scale',type:'select',label:j.lang.flash.scale,'default':'',style:'width : 100%;',items:[[j.lang.common.notSet,''],[j.lang.flash.scaleAll,'showall'],[j.lang.flash.scaleNoBorder,'noborder'],[j.lang.flash.scaleFit,'exactfit']],setup:h,commit:i},{id:'allowScriptAccess',type:'select',label:j.lang.flash.access,'default':'',style:'width : 100%;',items:[[j.lang.common.notSet,''],[j.lang.flash.accessAlways,'always'],[j.lang.flash.accessSameDomain,'samedomain'],[j.lang.flash.accessNever,'never']],setup:h,commit:i}]},{type:'hbox',widths:['50%','50%'],children:[{id:'wmode',type:'select',label:j.lang.flash.windowMode,'default':'',style:'width : 100%;',items:[[j.lang.common.notSet,''],[j.lang.flash.windowModeWindow,'window'],[j.lang.flash.windowModeOpaque,'opaque'],[j.lang.flash.windowModeTransparent,'transparent']],setup:h,commit:i},{id:'quality',type:'select',label:j.lang.flash.quality,'default':'high',style:'width : 100%;',items:[[j.lang.common.notSet,''],[j.lang.flash.qualityBest,'best'],[j.lang.flash.qualityHigh,'high'],[j.lang.flash.qualityAutoHigh,'autohigh'],[j.lang.flash.qualityMedium,'medium'],[j.lang.flash.qualityAutoLow,'autolow'],[j.lang.flash.qualityLow,'low']],setup:h,commit:i}]},{type:'hbox',widths:['50%','50%'],children:[{id:'align',type:'select',label:j.lang.common.align,'default':'',style:'width : 100%;',items:[[j.lang.common.notSet,''],[j.lang.common.alignLeft,'left'],[j.lang.flash.alignAbsBottom,'absBottom'],[j.lang.flash.alignAbsMiddle,'absMiddle'],[j.lang.flash.alignBaseline,'baseline'],[j.lang.common.alignBottom,'bottom'],[j.lang.common.alignMiddle,'middle'],[j.lang.common.alignRight,'right'],[j.lang.flash.alignTextTop,'textTop'],[j.lang.common.alignTop,'top']],setup:h,commit:function(o,p,q,r,s){var t=this.getValue();
+i.apply(this,arguments);t&&(s.align=t);}},{type:'html',html:'<div></div>'}]},{type:'fieldset',label:CKEDITOR.tools.htmlEncode(j.lang.flash.flashvars),children:[{type:'vbox',padding:0,children:[{type:'checkbox',id:'menu',label:j.lang.flash.chkMenu,'default':true,setup:h,commit:i},{type:'checkbox',id:'play',label:j.lang.flash.chkPlay,'default':true,setup:h,commit:i},{type:'checkbox',id:'loop',label:j.lang.flash.chkLoop,'default':true,setup:h,commit:i},{type:'checkbox',id:'allowFullScreen',label:j.lang.flash.chkFull,'default':true,setup:h,commit:i}]}]}]},{id:'advanced',label:j.lang.common.advancedTab,elements:[{type:'hbox',children:[{type:'text',id:'id',label:j.lang.common.id,setup:h,commit:i}]},{type:'hbox',widths:['45%','55%'],children:[{type:'text',id:'bgcolor',label:j.lang.flash.bgcolor,setup:h,commit:i},{type:'text',id:'class',label:j.lang.common.cssClass,setup:h,commit:i}]},{type:'text',id:'style',validate:CKEDITOR.dialog.validate.inlineStyle(j.lang.common.invalidInlineStyle),label:j.lang.common.cssStyle,setup:h,commit:i}]}]};});})();
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/button.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/button.js
index 6030fd4..c9d61e4 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/button.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/button.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.dialog.add('button',function(a){function b(c){var e=this;var d=e.getValue();if(d){c.attributes[e.id]=d;if(e.id=='name')c.attributes['data-cke-saved-name']=d;}else{delete c.attributes[e.id];if(e.id=='name')delete c.attributes['data-cke-saved-name'];}};return{title:a.lang.button.title,minWidth:350,minHeight:150,onShow:function(){var e=this;delete e.button;var c=e.getParentEditor().getSelection().getSelectedElement();if(c&&c.is('input')){var d=c.getAttribute('type');if(d in {button:1,reset:1,submit:1}){e.button=c;e.setupContent(c);}}},onOk:function(){var c=this.getParentEditor(),d=this.button,e=!d,f=d?CKEDITOR.htmlParser.fragment.fromHtml(d.getOuterHtml()).children[0]:new CKEDITOR.htmlParser.element('input');this.commitContent(f);var g=new CKEDITOR.htmlParser.basicWriter();f.writeHtml(g);var h=CKEDITOR.dom.element.createFromHtml(g.getHtml(),c.document);if(e)c.insertElement(h);else{h.replace(d);c.getSelection().selectElement(h);}},contents:[{id:'info',label:a.lang.button.title,title:a.lang.button.title,elements:[{id:'name',type:'text',label:a.lang.common.name,'default':'',setup:function(c){this.setValue(c.data('cke-saved-name')||c.getAttribute('name')||'');},commit:b},{id:'value',type:'text',label:a.lang.button.text,accessKey:'V','default':'',setup:function(c){this.setValue(c.getAttribute('value')||'');},commit:b},{id:'type',type:'select',label:a.lang.button.type,'default':'button',accessKey:'T',items:[[a.lang.button.typeBtn,'button'],[a.lang.button.typeSbm,'submit'],[a.lang.button.typeRst,'reset']],setup:function(c){this.setValue(c.getAttribute('type')||'');},commit:b}]}]};});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.dialog.add('button',function(a){function b(c){var e=this;var d=e.getValue();if(d){c.attributes[e.id]=d;if(e.id=='name')c.attributes['data-cke-saved-name']=d;}else{delete c.attributes[e.id];if(e.id=='name')delete c.attributes['data-cke-saved-name'];}};return{title:a.lang.button.title,minWidth:350,minHeight:150,onShow:function(){var e=this;delete e.button;var c=e.getParentEditor().getSelection().getSelectedElement();if(c&&c.is('input')){var d=c.getAttribute('type');if(d in {button:1,reset:1,submit:1}){e.button=c;e.setupContent(c);}}},onOk:function(){var c=this.getParentEditor(),d=this.button,e=!d,f=d?CKEDITOR.htmlParser.fragment.fromHtml(d.getOuterHtml()).children[0]:new CKEDITOR.htmlParser.element('input');this.commitContent(f);var g=new CKEDITOR.htmlParser.basicWriter();f.writeHtml(g);var h=CKEDITOR.dom.element.createFromHtml(g.getHtml(),c.document);if(e)c.insertElement(h);else{h.replace(d);c.getSelection().selectElement(h);}},contents:[{id:'info',label:a.lang.button.title,title:a.lang.button.title,elements:[{id:'name',type:'text',label:a.lang.common.name,'default':'',setup:function(c){this.setValue(c.data('cke-saved-name')||c.getAttribute('name')||'');},commit:b},{id:'value',type:'text',label:a.lang.button.text,accessKey:'V','default':'',setup:function(c){this.setValue(c.getAttribute('value')||'');},commit:b},{id:'type',type:'select',label:a.lang.button.type,'default':'button',accessKey:'T',items:[[a.lang.button.typeBtn,'button'],[a.lang.button.typeSbm,'submit'],[a.lang.button.typeRst,'reset']],setup:function(c){this.setValue(c.getAttribute('type')||'');},commit:b}]}]};});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/checkbox.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/checkbox.js
index 45c8760..bb1b885 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/checkbox.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/checkbox.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.dialog.add('checkbox',function(a){return{title:a.lang.checkboxAndRadio.checkboxTitle,minWidth:350,minHeight:140,onShow:function(){var c=this;delete c.checkbox;var b=c.getParentEditor().getSelection().getSelectedElement();if(b&&b.getAttribute('type')=='checkbox'){c.checkbox=b;c.setupContent(b);}},onOk:function(){var b,c=this.checkbox,d=!c;if(d){b=this.getParentEditor();c=b.document.createElement('input');c.setAttribute('type','checkbox');b.insertElement(c);}this.commitContent({element:c});},contents:[{id:'info',label:a.lang.checkboxAndRadio.checkboxTitle,title:a.lang.checkboxAndRadio.checkboxTitle,startupFocus:'txtName',elements:[{id:'txtName',type:'text',label:a.lang.common.name,'default':'',accessKey:'N',setup:function(b){this.setValue(b.data('cke-saved-name')||b.getAttribute('name')||'');},commit:function(b){var c=b.element;if(this.getValue())c.data('cke-saved-name',this.getValue());else{c.data('cke-saved-name',false);c.removeAttribute('name');}}},{id:'txtValue',type:'text',label:a.lang.checkboxAndRadio.value,'default':'',accessKey:'V',setup:function(b){var c=b.getAttribute('value');this.setValue(CKEDITOR.env.ie&&c=='on'?'':c);},commit:function(b){var c=b.element,d=this.getValue();if(d&&!(CKEDITOR.env.ie&&d=='on'))c.setAttribute('value',d);else if(CKEDITOR.env.ie){var e=new CKEDITOR.dom.element('input',c.getDocument());c.copyAttributes(e,{value:1});e.replace(c);a.getSelection().selectElement(e);b.element=e;}else c.removeAttribute('value');}},{id:'cmbSelected',type:'checkbox',label:a.lang.checkboxAndRadio.selected,'default':'',accessKey:'S',value:'checked',setup:function(b){this.setValue(b.getAttribute('checked'));},commit:function(b){var c=b.element;if(CKEDITOR.env.ie){var d=!!c.getAttribute('checked'),e=!!this.getValue();if(d!=e){var f=CKEDITOR.dom.element.createFromHtml('<input type="checkbox"'+(e?' checked="checked"':'')+'/>',a.document);c.copyAttributes(f,{type:1,checked:1});f.replace(c);a.getSelection().selectElement(f);b.element=f;}}else{var g=this.getValue();if(g)c.setAttribute('checked','checked');else c.removeAttribute('checked');}}}]}]};});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.dialog.add('checkbox',function(a){return{title:a.lang.checkboxAndRadio.checkboxTitle,minWidth:350,minHeight:140,onShow:function(){var c=this;delete c.checkbox;var b=c.getParentEditor().getSelection().getSelectedElement();if(b&&b.getAttribute('type')=='checkbox'){c.checkbox=b;c.setupContent(b);}},onOk:function(){var b,c=this.checkbox,d=!c;if(d){b=this.getParentEditor();c=b.document.createElement('input');c.setAttribute('type','checkbox');b.insertElement(c);}this.commitContent({element:c});},contents:[{id:'info',label:a.lang.checkboxAndRadio.checkboxTitle,title:a.lang.checkboxAndRadio.checkboxTitle,startupFocus:'txtName',elements:[{id:'txtName',type:'text',label:a.lang.common.name,'default':'',accessKey:'N',setup:function(b){this.setValue(b.data('cke-saved-name')||b.getAttribute('name')||'');},commit:function(b){var c=b.element;if(this.getValue())c.data('cke-saved-name',this.getValue());else{c.data('cke-saved-name',false);c.removeAttribute('name');}}},{id:'txtValue',type:'text',label:a.lang.checkboxAndRadio.value,'default':'',accessKey:'V',setup:function(b){var c=b.getAttribute('value');this.setValue(CKEDITOR.env.ie&&c=='on'?'':c);},commit:function(b){var c=b.element,d=this.getValue();if(d&&!(CKEDITOR.env.ie&&d=='on'))c.setAttribute('value',d);else if(CKEDITOR.env.ie){var e=new CKEDITOR.dom.element('input',c.getDocument());c.copyAttributes(e,{value:1});e.replace(c);a.getSelection().selectElement(e);b.element=e;}else c.removeAttribute('value');}},{id:'cmbSelected',type:'checkbox',label:a.lang.checkboxAndRadio.selected,'default':'',accessKey:'S',value:'checked',setup:function(b){this.setValue(b.getAttribute('checked'));},commit:function(b){var c=b.element;if(CKEDITOR.env.ie){var d=!!c.getAttribute('checked'),e=!!this.getValue();if(d!=e){var f=CKEDITOR.dom.element.createFromHtml('<input type="checkbox"'+(e?' checked="checked"':'')+'/>',a.document);c.copyAttributes(f,{type:1,checked:1});f.replace(c);a.getSelection().selectElement(f);b.element=f;}}else{var g=this.getValue();if(g)c.setAttribute('checked','checked');else c.removeAttribute('checked');}}}]}]};});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/form.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/form.js
index 8b4e90f..7537bfa 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/form.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/form.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.dialog.add('form',function(a){var b={action:1,id:1,method:1,enctype:1,target:1};return{title:a.lang.form.title,minWidth:350,minHeight:200,onShow:function(){var e=this;delete e.form;var c=e.getParentEditor().getSelection().getStartElement(),d=c&&c.getAscendant('form',true);if(d){e.form=d;e.setupContent(d);}},onOk:function(){var c,d=this.form,e=!d;if(e){c=this.getParentEditor();d=c.document.createElement('form');!CKEDITOR.env.ie&&d.append(c.document.createElement('br'));}if(e)c.insertElement(d);this.commitContent(d);},onLoad:function(){function c(e){this.setValue(e.getAttribute(this.id)||'');};function d(e){var f=this;if(f.getValue())e.setAttribute(f.id,f.getValue());else e.removeAttribute(f.id);};this.foreach(function(e){if(b[e.id]){e.setup=c;e.commit=d;}});},contents:[{id:'info',label:a.lang.form.title,title:a.lang.form.title,elements:[{id:'txtName',type:'text',label:a.lang.common.name,'default':'',accessKey:'N',setup:function(c){this.setValue(c.data('cke-saved-name')||c.getAttribute('name')||'');},commit:function(c){if(this.getValue())c.data('cke-saved-name',this.getValue());else{c.data('cke-saved-name',false);c.removeAttribute('name');}}},{id:'action',type:'text',label:a.lang.form.action,'default':'',accessKey:'T'},{type:'hbox',widths:['45%','55%'],children:[{id:'id',type:'text',label:a.lang.common.id,'default':'',accessKey:'I'},{id:'enctype',type:'select',label:a.lang.form.encoding,style:'width:100%',accessKey:'E','default':'',items:[[''],['text/plain'],['multipart/form-data'],['application/x-www-form-urlencoded']]}]},{type:'hbox',widths:['45%','55%'],children:[{id:'target',type:'select',label:a.lang.common.target,style:'width:100%',accessKey:'M','default':'',items:[[a.lang.common.notSet,''],[a.lang.common.targetNew,'_blank'],[a.lang.common.targetTop,'_top'],[a.lang.common.targetSelf,'_self'],[a.lang.common.targetParent,'_parent']]},{id:'method',type:'select',label:a.lang.form.method,accessKey:'M','default':'GET',items:[['GET','get'],['POST','post']]}]}]}]};});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.dialog.add('form',function(a){var b={action:1,id:1,method:1,enctype:1,target:1};return{title:a.lang.form.title,minWidth:350,minHeight:200,onShow:function(){var e=this;delete e.form;var c=e.getParentEditor().getSelection().getStartElement(),d=c&&c.getAscendant('form',true);if(d){e.form=d;e.setupContent(d);}},onOk:function(){var c,d=this.form,e=!d;if(e){c=this.getParentEditor();d=c.document.createElement('form');!CKEDITOR.env.ie&&d.append(c.document.createElement('br'));}if(e)c.insertElement(d);this.commitContent(d);},onLoad:function(){function c(e){this.setValue(e.getAttribute(this.id)||'');};function d(e){var f=this;if(f.getValue())e.setAttribute(f.id,f.getValue());else e.removeAttribute(f.id);};this.foreach(function(e){if(b[e.id]){e.setup=c;e.commit=d;}});},contents:[{id:'info',label:a.lang.form.title,title:a.lang.form.title,elements:[{id:'txtName',type:'text',label:a.lang.common.name,'default':'',accessKey:'N',setup:function(c){this.setValue(c.data('cke-saved-name')||c.getAttribute('name')||'');},commit:function(c){if(this.getValue())c.data('cke-saved-name',this.getValue());else{c.data('cke-saved-name',false);c.removeAttribute('name');}}},{id:'action',type:'text',label:a.lang.form.action,'default':'',accessKey:'T'},{type:'hbox',widths:['45%','55%'],children:[{id:'id',type:'text',label:a.lang.common.id,'default':'',accessKey:'I'},{id:'enctype',type:'select',label:a.lang.form.encoding,style:'width:100%',accessKey:'E','default':'',items:[[''],['text/plain'],['multipart/form-data'],['application/x-www-form-urlencoded']]}]},{type:'hbox',widths:['45%','55%'],children:[{id:'target',type:'select',label:a.lang.common.target,style:'width:100%',accessKey:'M','default':'',items:[[a.lang.common.notSet,''],[a.lang.common.targetNew,'_blank'],[a.lang.common.targetTop,'_top'],[a.lang.common.targetSelf,'_self'],[a.lang.common.targetParent,'_parent']]},{id:'method',type:'select',label:a.lang.form.method,accessKey:'M','default':'GET',items:[['GET','get'],['POST','post']]}]}]}]};});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/hiddenfield.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/hiddenfield.js
index 0bce0cf..7308c4f 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/hiddenfield.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/hiddenfield.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.dialog.add('hiddenfield',function(a){return{title:a.lang.hidden.title,hiddenField:null,minWidth:350,minHeight:110,onShow:function(){var e=this;delete e.hiddenField;var b=e.getParentEditor(),c=b.getSelection(),d=c.getSelectedElement();if(d&&d.data('cke-real-element-type')&&d.data('cke-real-element-type')=='hiddenfield'){e.hiddenField=d;d=b.restoreRealElement(e.hiddenField);e.setupContent(d);c.selectElement(e.hiddenField);}},onOk:function(){var g=this;var b=g.getValueOf('info','_cke_saved_name'),c=g.getValueOf('info','value'),d=g.getParentEditor(),e=CKEDITOR.env.ie&&!(CKEDITOR.document.$.documentMode>=8)?d.document.createElement('<input name="'+CKEDITOR.tools.htmlEncode(b)+'">'):d.document.createElement('input');e.setAttribute('type','hidden');g.commitContent(e);var f=d.createFakeElement(e,'cke_hidden','hiddenfield');if(!g.hiddenField)d.insertElement(f);else{f.replace(g.hiddenField);d.getSelection().selectElement(f);}return true;},contents:[{id:'info',label:a.lang.hidden.title,title:a.lang.hidden.title,elements:[{id:'_cke_saved_name',type:'text',label:a.lang.hidden.name,'default':'',accessKey:'N',setup:function(b){this.setValue(b.data('cke-saved-name')||b.getAttribute('name')||'');},commit:function(b){if(this.getValue())b.setAttribute('name',this.getValue());else b.removeAttribute('name');}},{id:'value',type:'text',label:a.lang.hidden.value,'default':'',accessKey:'V',setup:function(b){this.setValue(b.getAttribute('value')||'');},commit:function(b){if(this.getValue())b.setAttribute('value',this.getValue());else b.removeAttribute('value');}}]}]};});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.dialog.add('hiddenfield',function(a){return{title:a.lang.hidden.title,hiddenField:null,minWidth:350,minHeight:110,onShow:function(){var e=this;delete e.hiddenField;var b=e.getParentEditor(),c=b.getSelection(),d=c.getSelectedElement();if(d&&d.data('cke-real-element-type')&&d.data('cke-real-element-type')=='hiddenfield'){e.hiddenField=d;d=b.restoreRealElement(e.hiddenField);e.setupContent(d);c.selectElement(e.hiddenField);}},onOk:function(){var g=this;var b=g.getValueOf('info','_cke_saved_name'),c=g.getValueOf('info','value'),d=g.getParentEditor(),e=CKEDITOR.env.ie&&!(CKEDITOR.document.$.documentMode>=8)?d.document.createElement('<input name="'+CKEDITOR.tools.htmlEncode(b)+'">'):d.document.createElement('input');e.setAttribute('type','hidden');g.commitContent(e);var f=d.createFakeElement(e,'cke_hidden','hiddenfield');if(!g.hiddenField)d.insertElement(f);else{f.replace(g.hiddenField);d.getSelection().selectElement(f);}return true;},contents:[{id:'info',label:a.lang.hidden.title,title:a.lang.hidden.title,elements:[{id:'_cke_saved_name',type:'text',label:a.lang.hidden.name,'default':'',accessKey:'N',setup:function(b){this.setValue(b.data('cke-saved-name')||b.getAttribute('name')||'');},commit:function(b){if(this.getValue())b.setAttribute('name',this.getValue());else b.removeAttribute('name');}},{id:'value',type:'text',label:a.lang.hidden.value,'default':'',accessKey:'V',setup:function(b){this.setValue(b.getAttribute('value')||'');},commit:function(b){if(this.getValue())b.setAttribute('value',this.getValue());else b.removeAttribute('value');}}]}]};});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/radio.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/radio.js
index 4a05d9b..a4d0702 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/radio.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/radio.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.dialog.add('radio',function(a){return{title:a.lang.checkboxAndRadio.radioTitle,minWidth:350,minHeight:140,onShow:function(){var c=this;delete c.radioButton;var b=c.getParentEditor().getSelection().getSelectedElement();if(b&&b.getName()=='input'&&b.getAttribute('type')=='radio'){c.radioButton=b;c.setupContent(b);}},onOk:function(){var b,c=this.radioButton,d=!c;if(d){b=this.getParentEditor();c=b.document.createElement('input');c.setAttribute('type','radio');}if(d)b.insertElement(c);this.commitContent({element:c});},contents:[{id:'info',label:a.lang.checkboxAndRadio.radioTitle,title:a.lang.checkboxAndRadio.radioTitle,elements:[{id:'name',type:'text',label:a.lang.common.name,'default':'',accessKey:'N',setup:function(b){this.setValue(b.data('cke-saved-name')||b.getAttribute('name')||'');},commit:function(b){var c=b.element;if(this.getValue())c.data('cke-saved-name',this.getValue());else{c.data('cke-saved-name',false);c.removeAttribute('name');}}},{id:'value',type:'text',label:a.lang.checkboxAndRadio.value,'default':'',accessKey:'V',setup:function(b){this.setValue(b.getAttribute('value')||'');},commit:function(b){var c=b.element;if(this.getValue())c.setAttribute('value',this.getValue());else c.removeAttribute('value');}},{id:'checked',type:'checkbox',label:a.lang.checkboxAndRadio.selected,'default':'',accessKey:'S',value:'checked',setup:function(b){this.setValue(b.getAttribute('checked'));},commit:function(b){var c=b.element;if(!(CKEDITOR.env.ie||CKEDITOR.env.opera)){if(this.getValue())c.setAttribute('checked','checked');else c.removeAttribute('checked');}else{var d=c.getAttribute('checked'),e=!!this.getValue();if(d!=e){var f=CKEDITOR.dom.element.createFromHtml('<input type="radio"'+(e?' checked="checked"':'')+'></input>',a.document);c.copyAttributes(f,{type:1,checked:1});f.replace(c);a.getSelection().selectElement(f);b.element=f;}}}}]}]};});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.dialog.add('radio',function(a){return{title:a.lang.checkboxAndRadio.radioTitle,minWidth:350,minHeight:140,onShow:function(){var c=this;delete c.radioButton;var b=c.getParentEditor().getSelection().getSelectedElement();if(b&&b.getName()=='input'&&b.getAttribute('type')=='radio'){c.radioButton=b;c.setupContent(b);}},onOk:function(){var b,c=this.radioButton,d=!c;if(d){b=this.getParentEditor();c=b.document.createElement('input');c.setAttribute('type','radio');}if(d)b.insertElement(c);this.commitContent({element:c});},contents:[{id:'info',label:a.lang.checkboxAndRadio.radioTitle,title:a.lang.checkboxAndRadio.radioTitle,elements:[{id:'name',type:'text',label:a.lang.common.name,'default':'',accessKey:'N',setup:function(b){this.setValue(b.data('cke-saved-name')||b.getAttribute('name')||'');},commit:function(b){var c=b.element;if(this.getValue())c.data('cke-saved-name',this.getValue());else{c.data('cke-saved-name',false);c.removeAttribute('name');}}},{id:'value',type:'text',label:a.lang.checkboxAndRadio.value,'default':'',accessKey:'V',setup:function(b){this.setValue(b.getAttribute('value')||'');},commit:function(b){var c=b.element;if(this.getValue())c.setAttribute('value',this.getValue());else c.removeAttribute('value');}},{id:'checked',type:'checkbox',label:a.lang.checkboxAndRadio.selected,'default':'',accessKey:'S',value:'checked',setup:function(b){this.setValue(b.getAttribute('checked'));},commit:function(b){var c=b.element;if(!(CKEDITOR.env.ie||CKEDITOR.env.opera)){if(this.getValue())c.setAttribute('checked','checked');else c.removeAttribute('checked');}else{var d=c.getAttribute('checked'),e=!!this.getValue();if(d!=e){var f=CKEDITOR.dom.element.createFromHtml('<input type="radio"'+(e?' checked="checked"':'')+'></input>',a.document);c.copyAttributes(f,{type:1,checked:1});f.replace(c);a.getSelection().selectElement(f);b.element=f;}}}}]}]};});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/select.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/select.js
index 37ec6d4..ebf7eef 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/select.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/select.js
@@ -1,9 +1,9 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.dialog.add('select',function(a){function b(k,l,m,n,o){k=j(k);var p;if(n)p=n.createElement('OPTION');else p=document.createElement('OPTION');if(k&&p&&p.getName()=='option'){if(CKEDITOR.env.ie){if(!isNaN(parseInt(o,10)))k.$.options.add(p.$,o);else k.$.options.add(p.$);p.$.innerHTML=l.length>0?l:'';p.$.value=m;}else{if(o!==null&&o<k.getChildCount())k.getChild(o<0?0:o).insertBeforeMe(p);else k.append(p);p.setText(l.length>0?l:'');p.setValue(m);}}else return false;return p;};function c(k){k=j(k);var l=g(k);for(var m=k.getChildren().count()-1;m>=0;m--){if(k.getChild(m).$.selected)k.getChild(m).remove();}h(k,l);};function d(k,l,m,n){k=j(k);if(l<0)return false;var o=k.getChild(l);o.setText(m);o.setValue(n);return o;};function e(k){k=j(k);while(k.getChild(0)&&k.getChild(0).remove()){}};function f(k,l,m){k=j(k);var n=g(k);if(n<0)return false;var o=n+l;o=o<0?0:o;o=o>=k.getChildCount()?k.getChildCount()-1:o;if(n==o)return false;var p=k.getChild(n),q=p.getText(),r=p.getValue();p.remove();p=b(k,q,r,!m?null:m,o);h(k,o);return p;};function g(k){k=j(k);return k?k.$.selectedIndex:-1;};function h(k,l){k=j(k);if(l<0)return null;var m=k.getChildren().count();k.$.selectedIndex=l>=m?m-1:l;return k;};function i(k){k=j(k);return k?k.getChildren():false;};function j(k){if(k&&k.domId&&k.getInputElement().$)return k.getInputElement();else if(k&&k.$)return k;return false;};return{title:a.lang.select.title,minWidth:CKEDITOR.env.ie?460:395,minHeight:CKEDITOR.env.ie?320:300,onShow:function(){var n=this;delete n.selectBox;n.setupContent('clear');var k=n.getParentEditor().getSelection().getSelectedElement();if(k&&k.getName()=='select'){n.selectBox=k;n.setupContent(k.getName(),k);var l=i(k);for(var m=0;m<l.count();m++)n.setupContent('option',l.getItem(m));}},onOk:function(){var k=this.getParentEditor(),l=this.selectBox,m=!l;if(m)l=k.document.createElement('select');this.commitContent(l);if(m){k.insertElement(l);if(CKEDITOR.env.ie){var n=k.getSelection(),o=n.createBookmarks();setTimeout(function(){n.selectBookmarks(o);},0);}}},contents:[{id:'info',label:a.lang.select.selectInfo,title:a.lang.select.selectInfo,accessKey:'',elements:[{id:'txtName',type:'text',widths:['25%','75%'],labelLayout:'horizontal',label:a.lang.common.name,'default':'',accessKey:'N',style:'width:350px',setup:function(k,l){if(k=='clear')this.setValue(this['default']||'');else if(k=='select')this.setValue(l.data('cke-saved-name')||l.getAttribute('name')||'');},commit:function(k){if(this.getValue())k.data('cke-saved-name',this.getValue());
-else{k.data('cke-saved-name',false);k.removeAttribute('name');}}},{id:'txtValue',type:'text',widths:['25%','75%'],labelLayout:'horizontal',label:a.lang.select.value,style:'width:350px','default':'',className:'cke_disabled',onLoad:function(){this.getInputElement().setAttribute('readOnly',true);},setup:function(k,l){if(k=='clear')this.setValue('');else if(k=='option'&&l.getAttribute('selected'))this.setValue(l.$.value);}},{type:'hbox',widths:['175px','170px'],children:[{id:'txtSize',type:'text',labelLayout:'horizontal',label:a.lang.select.size,'default':'',accessKey:'S',style:'width:175px',validate:function(){var k=CKEDITOR.dialog.validate.integer(a.lang.common.validateNumberFailed);return this.getValue()===''||k.apply(this);},setup:function(k,l){if(k=='select')this.setValue(l.getAttribute('size')||'');if(CKEDITOR.env.webkit)this.getInputElement().setStyle('width','86px');},commit:function(k){if(this.getValue())k.setAttribute('size',this.getValue());else k.removeAttribute('size');}},{type:'html',html:'<span>'+CKEDITOR.tools.htmlEncode(a.lang.select.lines)+'</span>'}]},{type:'html',html:'<span>'+CKEDITOR.tools.htmlEncode(a.lang.select.opAvail)+'</span>'},{type:'hbox',widths:['115px','115px','100px'],children:[{type:'vbox',children:[{id:'txtOptName',type:'text',label:a.lang.select.opText,style:'width:115px',setup:function(k,l){if(k=='clear')this.setValue('');}},{type:'select',id:'cmbName',label:'',title:'',size:5,style:'width:115px;height:75px',items:[],onChange:function(){var k=this.getDialog(),l=k.getContentElement('info','cmbValue'),m=k.getContentElement('info','txtOptName'),n=k.getContentElement('info','txtOptValue'),o=g(this);h(l,o);m.setValue(this.getValue());n.setValue(l.getValue());},setup:function(k,l){if(k=='clear')e(this);else if(k=='option')b(this,l.getText(),l.getText(),this.getDialog().getParentEditor().document);},commit:function(k){var l=this.getDialog(),m=i(this),n=i(l.getContentElement('info','cmbValue')),o=l.getContentElement('info','txtValue').getValue();e(k);for(var p=0;p<m.count();p++){var q=b(k,m.getItem(p).getValue(),n.getItem(p).getValue(),l.getParentEditor().document);if(n.getItem(p).getValue()==o){q.setAttribute('selected','selected');q.selected=true;}}}}]},{type:'vbox',children:[{id:'txtOptValue',type:'text',label:a.lang.select.opValue,style:'width:115px',setup:function(k,l){if(k=='clear')this.setValue('');}},{type:'select',id:'cmbValue',label:'',size:5,style:'width:115px;height:75px',items:[],onChange:function(){var k=this.getDialog(),l=k.getContentElement('info','cmbName'),m=k.getContentElement('info','txtOptName'),n=k.getContentElement('info','txtOptValue'),o=g(this);
-h(l,o);m.setValue(l.getValue());n.setValue(this.getValue());},setup:function(k,l){var n=this;if(k=='clear')e(n);else if(k=='option'){var m=l.getValue();b(n,m,m,n.getDialog().getParentEditor().document);if(l.getAttribute('selected')=='selected')n.getDialog().getContentElement('info','txtValue').setValue(m);}}}]},{type:'vbox',padding:5,children:[{type:'button',id:'btnAdd',style:'',label:a.lang.select.btnAdd,title:a.lang.select.btnAdd,style:'width:100%;',onClick:function(){var k=this.getDialog(),l=k.getParentEditor(),m=k.getContentElement('info','txtOptName'),n=k.getContentElement('info','txtOptValue'),o=k.getContentElement('info','cmbName'),p=k.getContentElement('info','cmbValue');b(o,m.getValue(),m.getValue(),k.getParentEditor().document);b(p,n.getValue(),n.getValue(),k.getParentEditor().document);m.setValue('');n.setValue('');}},{type:'button',id:'btnModify',label:a.lang.select.btnModify,title:a.lang.select.btnModify,style:'width:100%;',onClick:function(){var k=this.getDialog(),l=k.getContentElement('info','txtOptName'),m=k.getContentElement('info','txtOptValue'),n=k.getContentElement('info','cmbName'),o=k.getContentElement('info','cmbValue'),p=g(n);if(p>=0){d(n,p,l.getValue(),l.getValue());d(o,p,m.getValue(),m.getValue());}}},{type:'button',id:'btnUp',style:'width:100%;',label:a.lang.select.btnUp,title:a.lang.select.btnUp,onClick:function(){var k=this.getDialog(),l=k.getContentElement('info','cmbName'),m=k.getContentElement('info','cmbValue');f(l,-1,k.getParentEditor().document);f(m,-1,k.getParentEditor().document);}},{type:'button',id:'btnDown',style:'width:100%;',label:a.lang.select.btnDown,title:a.lang.select.btnDown,onClick:function(){var k=this.getDialog(),l=k.getContentElement('info','cmbName'),m=k.getContentElement('info','cmbValue');f(l,1,k.getParentEditor().document);f(m,1,k.getParentEditor().document);}}]}]},{type:'hbox',widths:['40%','20%','40%'],children:[{type:'button',id:'btnSetValue',label:a.lang.select.btnSetValue,title:a.lang.select.btnSetValue,onClick:function(){var k=this.getDialog(),l=k.getContentElement('info','cmbValue'),m=k.getContentElement('info','txtValue');m.setValue(l.getValue());}},{type:'button',id:'btnDelete',label:a.lang.select.btnDelete,title:a.lang.select.btnDelete,onClick:function(){var k=this.getDialog(),l=k.getContentElement('info','cmbName'),m=k.getContentElement('info','cmbValue'),n=k.getContentElement('info','txtOptName'),o=k.getContentElement('info','txtOptValue');c(l);c(m);n.setValue('');o.setValue('');}},{id:'chkMulti',type:'checkbox',label:a.lang.select.chkMulti,'default':'',accessKey:'M',value:'checked',setup:function(k,l){if(k=='select')this.setValue(l.getAttribute('multiple'));
-if(CKEDITOR.env.webkit)this.getElement().getParent().setStyle('vertical-align','middle');},commit:function(k){if(this.getValue())k.setAttribute('multiple',this.getValue());else k.removeAttribute('multiple');}}]}]}]};});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.dialog.add('select',function(a){function b(k,l,m,n,o){k=j(k);var p;if(n)p=n.createElement('OPTION');else p=document.createElement('OPTION');if(k&&p&&p.getName()=='option'){if(CKEDITOR.env.ie){if(!isNaN(parseInt(o,10)))k.$.options.add(p.$,o);else k.$.options.add(p.$);p.$.innerHTML=l.length>0?l:'';p.$.value=m;}else{if(o!==null&&o<k.getChildCount())k.getChild(o<0?0:o).insertBeforeMe(p);else k.append(p);p.setText(l.length>0?l:'');p.setValue(m);}}else return false;return p;};function c(k){k=j(k);var l=g(k);for(var m=k.getChildren().count()-1;m>=0;m--){if(k.getChild(m).$.selected)k.getChild(m).remove();}h(k,l);};function d(k,l,m,n){k=j(k);if(l<0)return false;var o=k.getChild(l);o.setText(m);o.setValue(n);return o;};function e(k){k=j(k);while(k.getChild(0)&&k.getChild(0).remove()){}};function f(k,l,m){k=j(k);var n=g(k);if(n<0)return false;var o=n+l;o=o<0?0:o;o=o>=k.getChildCount()?k.getChildCount()-1:o;if(n==o)return false;var p=k.getChild(n),q=p.getText(),r=p.getValue();p.remove();p=b(k,q,r,!m?null:m,o);h(k,o);return p;};function g(k){k=j(k);return k?k.$.selectedIndex:-1;};function h(k,l){k=j(k);if(l<0)return null;var m=k.getChildren().count();k.$.selectedIndex=l>=m?m-1:l;return k;};function i(k){k=j(k);return k?k.getChildren():false;};function j(k){if(k&&k.domId&&k.getInputElement().$)return k.getInputElement();else if(k&&k.$)return k;return false;};return{title:a.lang.select.title,minWidth:CKEDITOR.env.ie?460:395,minHeight:CKEDITOR.env.ie?320:300,onShow:function(){var n=this;delete n.selectBox;n.setupContent('clear');var k=n.getParentEditor().getSelection().getSelectedElement();if(k&&k.getName()=='select'){n.selectBox=k;n.setupContent(k.getName(),k);var l=i(k);for(var m=0;m<l.count();m++)n.setupContent('option',l.getItem(m));}},onOk:function(){var k=this.getParentEditor(),l=this.selectBox,m=!l;if(m)l=k.document.createElement('select');this.commitContent(l);if(m){k.insertElement(l);if(CKEDITOR.env.ie){var n=k.getSelection(),o=n.createBookmarks();setTimeout(function(){n.selectBookmarks(o);},0);}}},contents:[{id:'info',label:a.lang.select.selectInfo,title:a.lang.select.selectInfo,accessKey:'',elements:[{id:'txtName',type:'text',widths:['25%','75%'],labelLayout:'horizontal',label:a.lang.common.name,'default':'',accessKey:'N',style:'width:350px',setup:function(k,l){if(k=='clear')this.setValue(this['default']||'');else if(k=='select')this.setValue(l.data('cke-saved-name')||l.getAttribute('name')||'');},commit:function(k){if(this.getValue())k.data('cke-saved-name',this.getValue());
+else{k.data('cke-saved-name',false);k.removeAttribute('name');}}},{id:'txtValue',type:'text',widths:['25%','75%'],labelLayout:'horizontal',label:a.lang.select.value,style:'width:350px','default':'',className:'cke_disabled',onLoad:function(){this.getInputElement().setAttribute('readOnly',true);},setup:function(k,l){if(k=='clear')this.setValue('');else if(k=='option'&&l.getAttribute('selected'))this.setValue(l.$.value);}},{type:'hbox',widths:['175px','170px'],children:[{id:'txtSize',type:'text',labelLayout:'horizontal',label:a.lang.select.size,'default':'',accessKey:'S',style:'width:175px',validate:function(){var k=CKEDITOR.dialog.validate.integer(a.lang.common.validateNumberFailed);return this.getValue()===''||k.apply(this);},setup:function(k,l){if(k=='select')this.setValue(l.getAttribute('size')||'');if(CKEDITOR.env.webkit)this.getInputElement().setStyle('width','86px');},commit:function(k){if(this.getValue())k.setAttribute('size',this.getValue());else k.removeAttribute('size');}},{type:'html',html:'<span>'+CKEDITOR.tools.htmlEncode(a.lang.select.lines)+'</span>'}]},{type:'html',html:'<span>'+CKEDITOR.tools.htmlEncode(a.lang.select.opAvail)+'</span>'},{type:'hbox',widths:['115px','115px','100px'],children:[{type:'vbox',children:[{id:'txtOptName',type:'text',label:a.lang.select.opText,style:'width:115px',setup:function(k,l){if(k=='clear')this.setValue('');}},{type:'select',id:'cmbName',label:'',title:'',size:5,style:'width:115px;height:75px',items:[],onChange:function(){var k=this.getDialog(),l=k.getContentElement('info','cmbValue'),m=k.getContentElement('info','txtOptName'),n=k.getContentElement('info','txtOptValue'),o=g(this);h(l,o);m.setValue(this.getValue());n.setValue(l.getValue());},setup:function(k,l){if(k=='clear')e(this);else if(k=='option')b(this,l.getText(),l.getText(),this.getDialog().getParentEditor().document);},commit:function(k){var l=this.getDialog(),m=i(this),n=i(l.getContentElement('info','cmbValue')),o=l.getContentElement('info','txtValue').getValue();e(k);for(var p=0;p<m.count();p++){var q=b(k,m.getItem(p).getValue(),n.getItem(p).getValue(),l.getParentEditor().document);if(n.getItem(p).getValue()==o){q.setAttribute('selected','selected');q.selected=true;}}}}]},{type:'vbox',children:[{id:'txtOptValue',type:'text',label:a.lang.select.opValue,style:'width:115px',setup:function(k,l){if(k=='clear')this.setValue('');}},{type:'select',id:'cmbValue',label:'',size:5,style:'width:115px;height:75px',items:[],onChange:function(){var k=this.getDialog(),l=k.getContentElement('info','cmbName'),m=k.getContentElement('info','txtOptName'),n=k.getContentElement('info','txtOptValue'),o=g(this);
+h(l,o);m.setValue(l.getValue());n.setValue(this.getValue());},setup:function(k,l){var n=this;if(k=='clear')e(n);else if(k=='option'){var m=l.getValue();b(n,m,m,n.getDialog().getParentEditor().document);if(l.getAttribute('selected')=='selected')n.getDialog().getContentElement('info','txtValue').setValue(m);}}}]},{type:'vbox',padding:5,children:[{type:'button',id:'btnAdd',style:'',label:a.lang.select.btnAdd,title:a.lang.select.btnAdd,style:'width:100%;',onClick:function(){var k=this.getDialog(),l=k.getParentEditor(),m=k.getContentElement('info','txtOptName'),n=k.getContentElement('info','txtOptValue'),o=k.getContentElement('info','cmbName'),p=k.getContentElement('info','cmbValue');b(o,m.getValue(),m.getValue(),k.getParentEditor().document);b(p,n.getValue(),n.getValue(),k.getParentEditor().document);m.setValue('');n.setValue('');}},{type:'button',id:'btnModify',label:a.lang.select.btnModify,title:a.lang.select.btnModify,style:'width:100%;',onClick:function(){var k=this.getDialog(),l=k.getContentElement('info','txtOptName'),m=k.getContentElement('info','txtOptValue'),n=k.getContentElement('info','cmbName'),o=k.getContentElement('info','cmbValue'),p=g(n);if(p>=0){d(n,p,l.getValue(),l.getValue());d(o,p,m.getValue(),m.getValue());}}},{type:'button',id:'btnUp',style:'width:100%;',label:a.lang.select.btnUp,title:a.lang.select.btnUp,onClick:function(){var k=this.getDialog(),l=k.getContentElement('info','cmbName'),m=k.getContentElement('info','cmbValue');f(l,-1,k.getParentEditor().document);f(m,-1,k.getParentEditor().document);}},{type:'button',id:'btnDown',style:'width:100%;',label:a.lang.select.btnDown,title:a.lang.select.btnDown,onClick:function(){var k=this.getDialog(),l=k.getContentElement('info','cmbName'),m=k.getContentElement('info','cmbValue');f(l,1,k.getParentEditor().document);f(m,1,k.getParentEditor().document);}}]}]},{type:'hbox',widths:['40%','20%','40%'],children:[{type:'button',id:'btnSetValue',label:a.lang.select.btnSetValue,title:a.lang.select.btnSetValue,onClick:function(){var k=this.getDialog(),l=k.getContentElement('info','cmbValue'),m=k.getContentElement('info','txtValue');m.setValue(l.getValue());}},{type:'button',id:'btnDelete',label:a.lang.select.btnDelete,title:a.lang.select.btnDelete,onClick:function(){var k=this.getDialog(),l=k.getContentElement('info','cmbName'),m=k.getContentElement('info','cmbValue'),n=k.getContentElement('info','txtOptName'),o=k.getContentElement('info','txtOptValue');c(l);c(m);n.setValue('');o.setValue('');}},{id:'chkMulti',type:'checkbox',label:a.lang.select.chkMulti,'default':'',accessKey:'M',value:'checked',setup:function(k,l){if(k=='select')this.setValue(l.getAttribute('multiple'));
+if(CKEDITOR.env.webkit)this.getElement().getParent().setStyle('vertical-align','middle');},commit:function(k){if(this.getValue())k.setAttribute('multiple',this.getValue());else k.removeAttribute('multiple');}}]}]}]};});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/textarea.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/textarea.js
index 0ea4e72..e0b09b1 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/textarea.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/textarea.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.dialog.add('textarea',function(a){return{title:a.lang.textarea.title,minWidth:350,minHeight:220,onShow:function(){var c=this;delete c.textarea;var b=c.getParentEditor().getSelection().getSelectedElement();if(b&&b.getName()=='textarea'){c.textarea=b;c.setupContent(b);}},onOk:function(){var b,c=this.textarea,d=!c;if(d){b=this.getParentEditor();c=b.document.createElement('textarea');}this.commitContent(c);if(d)b.insertElement(c);},contents:[{id:'info',label:a.lang.textarea.title,title:a.lang.textarea.title,elements:[{id:'_cke_saved_name',type:'text',label:a.lang.common.name,'default':'',accessKey:'N',setup:function(b){this.setValue(b.data('cke-saved-name')||b.getAttribute('name')||'');},commit:function(b){if(this.getValue())b.data('cke-saved-name',this.getValue());else{b.data('cke-saved-name',false);b.removeAttribute('name');}}},{type:'hbox',widths:['50%','50%'],children:[{id:'cols',type:'text',label:a.lang.textarea.cols,'default':'',accessKey:'C',style:'width:50px',validate:CKEDITOR.dialog.validate.integer(a.lang.common.validateNumberFailed),setup:function(b){var c=b.hasAttribute('cols')&&b.getAttribute('cols');this.setValue(c||'');},commit:function(b){if(this.getValue())b.setAttribute('cols',this.getValue());else b.removeAttribute('cols');}},{id:'rows',type:'text',label:a.lang.textarea.rows,'default':'',accessKey:'R',style:'width:50px',validate:CKEDITOR.dialog.validate.integer(a.lang.common.validateNumberFailed),setup:function(b){var c=b.hasAttribute('rows')&&b.getAttribute('rows');this.setValue(c||'');},commit:function(b){if(this.getValue())b.setAttribute('rows',this.getValue());else b.removeAttribute('rows');}}]},{id:'value',type:'textarea',label:a.lang.textfield.value,'default':'',setup:function(b){this.setValue(b.$.defaultValue);},commit:function(b){b.$.value=b.$.defaultValue=this.getValue();}}]}]};});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.dialog.add('textarea',function(a){return{title:a.lang.textarea.title,minWidth:350,minHeight:220,onShow:function(){var c=this;delete c.textarea;var b=c.getParentEditor().getSelection().getSelectedElement();if(b&&b.getName()=='textarea'){c.textarea=b;c.setupContent(b);}},onOk:function(){var b,c=this.textarea,d=!c;if(d){b=this.getParentEditor();c=b.document.createElement('textarea');}this.commitContent(c);if(d)b.insertElement(c);},contents:[{id:'info',label:a.lang.textarea.title,title:a.lang.textarea.title,elements:[{id:'_cke_saved_name',type:'text',label:a.lang.common.name,'default':'',accessKey:'N',setup:function(b){this.setValue(b.data('cke-saved-name')||b.getAttribute('name')||'');},commit:function(b){if(this.getValue())b.data('cke-saved-name',this.getValue());else{b.data('cke-saved-name',false);b.removeAttribute('name');}}},{type:'hbox',widths:['50%','50%'],children:[{id:'cols',type:'text',label:a.lang.textarea.cols,'default':'',accessKey:'C',style:'width:50px',validate:CKEDITOR.dialog.validate.integer(a.lang.common.validateNumberFailed),setup:function(b){var c=b.hasAttribute('cols')&&b.getAttribute('cols');this.setValue(c||'');},commit:function(b){if(this.getValue())b.setAttribute('cols',this.getValue());else b.removeAttribute('cols');}},{id:'rows',type:'text',label:a.lang.textarea.rows,'default':'',accessKey:'R',style:'width:50px',validate:CKEDITOR.dialog.validate.integer(a.lang.common.validateNumberFailed),setup:function(b){var c=b.hasAttribute('rows')&&b.getAttribute('rows');this.setValue(c||'');},commit:function(b){if(this.getValue())b.setAttribute('rows',this.getValue());else b.removeAttribute('rows');}}]},{id:'value',type:'textarea',label:a.lang.textfield.value,'default':'',setup:function(b){this.setValue(b.$.defaultValue);},commit:function(b){b.$.value=b.$.defaultValue=this.getValue();}}]}]};});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/textfield.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/textfield.js
index 23ee866..4d1e7e3 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/textfield.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/forms/dialogs/textfield.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.dialog.add('textfield',function(a){var b={value:1,size:1,maxLength:1},c={text:1,password:1};return{title:a.lang.textfield.title,minWidth:350,minHeight:150,onShow:function(){var e=this;delete e.textField;var d=e.getParentEditor().getSelection().getSelectedElement();if(d&&d.getName()=='input'&&(c[d.getAttribute('type')]||!d.getAttribute('type'))){e.textField=d;e.setupContent(d);}},onOk:function(){var d,e=this.textField,f=!e;if(f){d=this.getParentEditor();e=d.document.createElement('input');e.setAttribute('type','text');}if(f)d.insertElement(e);this.commitContent({element:e});},onLoad:function(){var d=function(f){var g=f.hasAttribute(this.id)&&f.getAttribute(this.id);this.setValue(g||'');},e=function(f){var g=f.element,h=this.getValue();if(h)g.setAttribute(this.id,h);else g.removeAttribute(this.id);};this.foreach(function(f){if(b[f.id]){f.setup=d;f.commit=e;}});},contents:[{id:'info',label:a.lang.textfield.title,title:a.lang.textfield.title,elements:[{type:'hbox',widths:['50%','50%'],children:[{id:'_cke_saved_name',type:'text',label:a.lang.textfield.name,'default':'',accessKey:'N',setup:function(d){this.setValue(d.data('cke-saved-name')||d.getAttribute('name')||'');},commit:function(d){var e=d.element;if(this.getValue())e.data('cke-saved-name',this.getValue());else{e.data('cke-saved-name',false);e.removeAttribute('name');}}},{id:'value',type:'text',label:a.lang.textfield.value,'default':'',accessKey:'V'}]},{type:'hbox',widths:['50%','50%'],children:[{id:'size',type:'text',label:a.lang.textfield.charWidth,'default':'',accessKey:'C',style:'width:50px',validate:CKEDITOR.dialog.validate.integer(a.lang.common.validateNumberFailed)},{id:'maxLength',type:'text',label:a.lang.textfield.maxChars,'default':'',accessKey:'M',style:'width:50px',validate:CKEDITOR.dialog.validate.integer(a.lang.common.validateNumberFailed)}],onLoad:function(){if(CKEDITOR.env.ie7Compat)this.getElement().setStyle('zoom','100%');}},{id:'type',type:'select',label:a.lang.textfield.type,'default':'text',accessKey:'M',items:[[a.lang.textfield.typeText,'text'],[a.lang.textfield.typePass,'password']],setup:function(d){this.setValue(d.getAttribute('type'));},commit:function(d){var e=d.element;if(CKEDITOR.env.ie){var f=e.getAttribute('type'),g=this.getValue();if(f!=g){var h=CKEDITOR.dom.element.createFromHtml('<input type="'+g+'"></input>',a.document);e.copyAttributes(h,{type:1});h.replace(e);a.getSelection().selectElement(h);d.element=h;}}else e.setAttribute('type',this.getValue());}}]}]};});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.dialog.add('textfield',function(a){var b={value:1,size:1,maxLength:1},c={text:1,password:1};return{title:a.lang.textfield.title,minWidth:350,minHeight:150,onShow:function(){var e=this;delete e.textField;var d=e.getParentEditor().getSelection().getSelectedElement();if(d&&d.getName()=='input'&&(c[d.getAttribute('type')]||!d.getAttribute('type'))){e.textField=d;e.setupContent(d);}},onOk:function(){var d,e=this.textField,f=!e;if(f){d=this.getParentEditor();e=d.document.createElement('input');e.setAttribute('type','text');}if(f)d.insertElement(e);this.commitContent({element:e});},onLoad:function(){var d=function(f){var g=f.hasAttribute(this.id)&&f.getAttribute(this.id);this.setValue(g||'');},e=function(f){var g=f.element,h=this.getValue();if(h)g.setAttribute(this.id,h);else g.removeAttribute(this.id);};this.foreach(function(f){if(b[f.id]){f.setup=d;f.commit=e;}});},contents:[{id:'info',label:a.lang.textfield.title,title:a.lang.textfield.title,elements:[{type:'hbox',widths:['50%','50%'],children:[{id:'_cke_saved_name',type:'text',label:a.lang.textfield.name,'default':'',accessKey:'N',setup:function(d){this.setValue(d.data('cke-saved-name')||d.getAttribute('name')||'');},commit:function(d){var e=d.element;if(this.getValue())e.data('cke-saved-name',this.getValue());else{e.data('cke-saved-name',false);e.removeAttribute('name');}}},{id:'value',type:'text',label:a.lang.textfield.value,'default':'',accessKey:'V'}]},{type:'hbox',widths:['50%','50%'],children:[{id:'size',type:'text',label:a.lang.textfield.charWidth,'default':'',accessKey:'C',style:'width:50px',validate:CKEDITOR.dialog.validate.integer(a.lang.common.validateNumberFailed)},{id:'maxLength',type:'text',label:a.lang.textfield.maxChars,'default':'',accessKey:'M',style:'width:50px',validate:CKEDITOR.dialog.validate.integer(a.lang.common.validateNumberFailed)}],onLoad:function(){if(CKEDITOR.env.ie7Compat)this.getElement().setStyle('zoom','100%');}},{id:'type',type:'select',label:a.lang.textfield.type,'default':'text',accessKey:'M',items:[[a.lang.textfield.typeText,'text'],[a.lang.textfield.typePass,'password']],setup:function(d){this.setValue(d.getAttribute('type'));},commit:function(d){var e=d.element;if(CKEDITOR.env.ie){var f=e.getAttribute('type'),g=this.getValue();if(f!=g){var h=CKEDITOR.dom.element.createFromHtml('<input type="'+g+'"></input>',a.document);e.copyAttributes(h,{type:1});h.replace(e);a.getSelection().selectElement(h);d.element=h;}}else e.setAttribute('type',this.getValue());}}]}]};});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/iframe/dialogs/iframe.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/iframe/dialogs/iframe.js
index 06ac17a..4c612b8 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/iframe/dialogs/iframe.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/iframe/dialogs/iframe.js
@@ -1,7 +1,7 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-(function(){var a={scrolling:{'true':'yes','false':'no'},frameborder:{'true':'1','false':'0'}};function b(d){var g=this;var e=g instanceof CKEDITOR.ui.dialog.checkbox;if(d.hasAttribute(g.id)){var f=d.getAttribute(g.id);if(e)g.setValue(a[g.id]['true']==f.toLowerCase());else g.setValue(f);}};function c(d){var h=this;var e=h.getValue()==='',f=h instanceof CKEDITOR.ui.dialog.checkbox,g=h.getValue();if(e)d.removeAttribute(h.att||h.id);else if(f)d.setAttribute(h.id,a[h.id][g]);else d.setAttribute(h.att||h.id,g);};CKEDITOR.dialog.add('iframe',function(d){var e=d.lang.iframe,f=d.lang.common,g=d.plugins.dialogadvtab;return{title:e.title,minWidth:350,minHeight:260,onShow:function(){var j=this;j.fakeImage=j.iframeNode=null;var h=j.getSelectedElement();if(h&&h.data('cke-real-element-type')&&h.data('cke-real-element-type')=='iframe'){j.fakeImage=h;var i=d.restoreRealElement(h);j.iframeNode=i;j.setupContent(i);}},onOk:function(){var l=this;var h;if(!l.fakeImage)h=new CKEDITOR.dom.element('iframe');else h=l.iframeNode;var i={},j={};l.commitContent(h,i,j);var k=d.createFakeElement(h,'cke_iframe','iframe',true);k.setAttributes(j);k.setStyles(i);if(l.fakeImage){k.replace(l.fakeImage);d.getSelection().selectElement(k);}else d.insertElement(k);},contents:[{id:'info',label:f.generalTab,accessKey:'I',elements:[{type:'vbox',padding:0,children:[{id:'src',type:'text',label:f.url,required:true,validate:CKEDITOR.dialog.validate.notEmpty(e.noUrl),setup:b,commit:c}]},{type:'hbox',children:[{id:'width',type:'text',style:'width:100%',labelLayout:'vertical',label:f.width,validate:CKEDITOR.dialog.validate.htmlLength(f.invalidHtmlLength.replace('%1',f.width)),setup:b,commit:c},{id:'height',type:'text',style:'width:100%',labelLayout:'vertical',label:f.height,validate:CKEDITOR.dialog.validate.htmlLength(f.invalidHtmlLength.replace('%1',f.height)),setup:b,commit:c},{id:'align',type:'select','default':'',items:[[f.notSet,''],[f.alignLeft,'left'],[f.alignRight,'right'],[f.alignTop,'top'],[f.alignMiddle,'middle'],[f.alignBottom,'bottom']],style:'width:100%',labelLayout:'vertical',label:f.align,setup:function(h,i){b.apply(this,arguments);if(i){var j=i.getAttribute('align');this.setValue(j&&j.toLowerCase()||'');}},commit:function(h,i,j){c.apply(this,arguments);if(this.getValue())j.align=this.getValue();}}]},{type:'hbox',widths:['50%','50%'],children:[{id:'scrolling',type:'checkbox',label:e.scrolling,setup:b,commit:c},{id:'frameborder',type:'checkbox',label:e.border,setup:b,commit:c}]},{type:'hbox',widths:['50%','50%'],children:[{id:'name',type:'text',label:f.name,setup:b,commit:c},{id:'title',type:'text',label:f.advisoryTitle,setup:b,commit:c}]},{id:'longdesc',type:'text',label:f.longDescr,setup:b,commit:c}]},g&&g.createAdvancedTab(d,{id:1,classes:1,styles:1})]};
-});})();
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function(){var a={scrolling:{'true':'yes','false':'no'},frameborder:{'true':'1','false':'0'}};function b(d){var g=this;var e=g instanceof CKEDITOR.ui.dialog.checkbox;if(d.hasAttribute(g.id)){var f=d.getAttribute(g.id);if(e)g.setValue(a[g.id]['true']==f.toLowerCase());else g.setValue(f);}};function c(d){var h=this;var e=h.getValue()==='',f=h instanceof CKEDITOR.ui.dialog.checkbox,g=h.getValue();if(e)d.removeAttribute(h.att||h.id);else if(f)d.setAttribute(h.id,a[h.id][g]);else d.setAttribute(h.att||h.id,g);};CKEDITOR.dialog.add('iframe',function(d){var e=d.lang.iframe,f=d.lang.common,g=d.plugins.dialogadvtab;return{title:e.title,minWidth:350,minHeight:260,onShow:function(){var j=this;j.fakeImage=j.iframeNode=null;var h=j.getSelectedElement();if(h&&h.data('cke-real-element-type')&&h.data('cke-real-element-type')=='iframe'){j.fakeImage=h;var i=d.restoreRealElement(h);j.iframeNode=i;j.setupContent(i);}},onOk:function(){var l=this;var h;if(!l.fakeImage)h=new CKEDITOR.dom.element('iframe');else h=l.iframeNode;var i={},j={};l.commitContent(h,i,j);var k=d.createFakeElement(h,'cke_iframe','iframe',true);k.setAttributes(j);k.setStyles(i);if(l.fakeImage){k.replace(l.fakeImage);d.getSelection().selectElement(k);}else d.insertElement(k);},contents:[{id:'info',label:f.generalTab,accessKey:'I',elements:[{type:'vbox',padding:0,children:[{id:'src',type:'text',label:f.url,required:true,validate:CKEDITOR.dialog.validate.notEmpty(e.noUrl),setup:b,commit:c}]},{type:'hbox',children:[{id:'width',type:'text',style:'width:100%',labelLayout:'vertical',label:f.width,validate:CKEDITOR.dialog.validate.htmlLength(f.invalidHtmlLength.replace('%1',f.width)),setup:b,commit:c},{id:'height',type:'text',style:'width:100%',labelLayout:'vertical',label:f.height,validate:CKEDITOR.dialog.validate.htmlLength(f.invalidHtmlLength.replace('%1',f.height)),setup:b,commit:c},{id:'align',type:'select','default':'',items:[[f.notSet,''],[f.alignLeft,'left'],[f.alignRight,'right'],[f.alignTop,'top'],[f.alignMiddle,'middle'],[f.alignBottom,'bottom']],style:'width:100%',labelLayout:'vertical',label:f.align,setup:function(h,i){b.apply(this,arguments);if(i){var j=i.getAttribute('align');this.setValue(j&&j.toLowerCase()||'');}},commit:function(h,i,j){c.apply(this,arguments);if(this.getValue())j.align=this.getValue();}}]},{type:'hbox',widths:['50%','50%'],children:[{id:'scrolling',type:'checkbox',label:e.scrolling,setup:b,commit:c},{id:'frameborder',type:'checkbox',label:e.border,setup:b,commit:c}]},{type:'hbox',widths:['50%','50%'],children:[{id:'name',type:'text',label:f.name,setup:b,commit:c},{id:'title',type:'text',label:f.advisoryTitle,setup:b,commit:c}]},{id:'longdesc',type:'text',label:f.longDescr,setup:b,commit:c}]},g&&g.createAdvancedTab(d,{id:1,classes:1,styles:1})]};
+});})();
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/iframedialog/plugin.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/iframedialog/plugin.js
index 52edc08..e38d4e0 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/iframedialog/plugin.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/iframedialog/plugin.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.add('iframedialog',{requires:['dialog'],onLoad:function(){CKEDITOR.dialog.addIframe=function(a,b,c,d,e,f,g){var h={type:'iframe',src:c,width:'100%',height:'100%'};if(typeof f=='function')h.onContentLoad=f;else h.onContentLoad=function(){var k=this.getElement(),l=k.$.contentWindow;if(l.onDialogEvent){var m=this.getDialog(),n=function(o){return l.onDialogEvent(o);};m.on('ok',n);m.on('cancel',n);m.on('resize',n);m.on('hide',function(o){m.removeListener('ok',n);m.removeListener('cancel',n);m.removeListener('resize',n);o.removeListener();});l.onDialogEvent({name:'load',sender:this,editor:m._.editor});}};var i={title:b,minWidth:d,minHeight:e,contents:[{id:'iframe',label:b,expand:true,elements:[h]}]};for(var j in g)i[j]=g[j];this.add(a,function(){return i;});};(function(){var a=function(b,c,d){if(arguments.length<3)return;var e=this._||(this._={}),f=c.onContentLoad&&CKEDITOR.tools.bind(c.onContentLoad,this),g=CKEDITOR.tools.cssLength(c.width),h=CKEDITOR.tools.cssLength(c.height);e.frameId=CKEDITOR.tools.getNextId()+'_iframe';b.on('load',function(){var k=CKEDITOR.document.getById(e.frameId),l=k.getParent();l.setStyles({width:g,height:h});});var i={src:'%2',id:e.frameId,frameborder:0,allowtransparency:true},j=[];if(typeof c.onContentLoad=='function')i.onload='CKEDITOR.tools.callFunction(%1);';CKEDITOR.ui.dialog.uiElement.call(this,b,c,j,'iframe',{width:g,height:h},i,'');d.push('<div style="width:'+g+';height:'+h+';" id="'+this.domId+'"></div>');j=j.join('');b.on('show',function(){var k=CKEDITOR.document.getById(e.frameId),l=k.getParent(),m=CKEDITOR.tools.addFunction(f),n=j.replace('%1',m).replace('%2',CKEDITOR.tools.htmlEncode(c.src));l.setHtml(n);});};a.prototype=new CKEDITOR.ui.dialog.uiElement();CKEDITOR.dialog.addUIElement('iframe',{build:function(b,c,d){return new a(b,c,d);}});})();}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.add('iframedialog',{requires:['dialog'],onLoad:function(){CKEDITOR.dialog.addIframe=function(a,b,c,d,e,f,g){var h={type:'iframe',src:c,width:'100%',height:'100%'};if(typeof f=='function')h.onContentLoad=f;else h.onContentLoad=function(){var k=this.getElement(),l=k.$.contentWindow;if(l.onDialogEvent){var m=this.getDialog(),n=function(o){return l.onDialogEvent(o);};m.on('ok',n);m.on('cancel',n);m.on('resize',n);m.on('hide',function(o){m.removeListener('ok',n);m.removeListener('cancel',n);m.removeListener('resize',n);o.removeListener();});l.onDialogEvent({name:'load',sender:this,editor:m._.editor});}};var i={title:b,minWidth:d,minHeight:e,contents:[{id:'iframe',label:b,expand:true,elements:[h]}]};for(var j in g)i[j]=g[j];this.add(a,function(){return i;});};(function(){var a=function(b,c,d){if(arguments.length<3)return;var e=this._||(this._={}),f=c.onContentLoad&&CKEDITOR.tools.bind(c.onContentLoad,this),g=CKEDITOR.tools.cssLength(c.width),h=CKEDITOR.tools.cssLength(c.height);e.frameId=CKEDITOR.tools.getNextId()+'_iframe';b.on('load',function(){var k=CKEDITOR.document.getById(e.frameId),l=k.getParent();l.setStyles({width:g,height:h});});var i={src:'%2',id:e.frameId,frameborder:0,allowtransparency:true},j=[];if(typeof c.onContentLoad=='function')i.onload='CKEDITOR.tools.callFunction(%1);';CKEDITOR.ui.dialog.uiElement.call(this,b,c,j,'iframe',{width:g,height:h},i,'');d.push('<div style="width:'+g+';height:'+h+';" id="'+this.domId+'"></div>');j=j.join('');b.on('show',function(){var k=CKEDITOR.document.getById(e.frameId),l=k.getParent(),m=CKEDITOR.tools.addFunction(f),n=j.replace('%1',m).replace('%2',CKEDITOR.tools.htmlEncode(c.src));l.setHtml(n);});};a.prototype=new CKEDITOR.ui.dialog.uiElement();CKEDITOR.dialog.addUIElement('iframe',{build:function(b,c,d){return new a(b,c,d);}});})();}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/image/dialogs/image.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/image/dialogs/image.js
index 0410b95..54393c0 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/image/dialogs/image.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/image/dialogs/image.js
@@ -1,13 +1,13 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-(function(){var a=function(b,c){var d=1,e=2,f=4,g=8,h=/^\s*(\d+)((px)|\%)?\s*$/i,i=/(^\s*(\d+)((px)|\%)?\s*$)|^$/i,j=/^\d+px$/,k=function(){var B=this.getValue(),C=this.getDialog(),D=B.match(h);if(D){if(D[2]=='%')p(C,false);B=D[1];}if(C.lockRatio){var E=C.originalElement;if(E.getCustomData('isReady')=='true')if(this.id=='txtHeight'){if(B&&B!='0')B=Math.round(E.$.width*(B/E.$.height));if(!isNaN(B))C.setValueOf('info','txtWidth',B);}else{if(B&&B!='0')B=Math.round(E.$.height*(B/E.$.width));if(!isNaN(B))C.setValueOf('info','txtHeight',B);}}l(C);},l=function(B){if(!B.originalElement||!B.preview)return 1;B.commitContent(f,B.preview);return 0;};function m(){var B=arguments,C=this.getContentElement('advanced','txtdlgGenStyle');C&&C.commit.apply(C,B);this.foreach(function(D){if(D.commit&&D.id!='txtdlgGenStyle')D.commit.apply(D,B);});};var n;function o(B){if(n)return;n=1;var C=this.getDialog(),D=C.imageElement;if(D){this.commit(d,D);B=[].concat(B);var E=B.length,F;for(var G=0;G<E;G++){F=C.getContentElement.apply(C,B[G].split(':'));F&&F.setup(d,D);}}n=0;};var p=function(B,C){if(!B.getContentElement('info','ratioLock'))return null;var D=B.originalElement;if(!D)return null;if(C=='check'){if(!B.userlockRatio&&D.getCustomData('isReady')=='true'){var E=B.getValueOf('info','txtWidth'),F=B.getValueOf('info','txtHeight'),G=D.$.width*1000/D.$.height,H=E*1000/F;B.lockRatio=false;if(!E&&!F)B.lockRatio=true;else if(!isNaN(G)&&!isNaN(H))if(Math.round(G)==Math.round(H))B.lockRatio=true;}}else if(C!=undefined)B.lockRatio=C;else{B.userlockRatio=1;B.lockRatio=!B.lockRatio;}var I=CKEDITOR.document.getById(w);if(B.lockRatio)I.removeClass('cke_btn_unlocked');else I.addClass('cke_btn_unlocked');I.setAttribute('aria-checked',B.lockRatio);if(CKEDITOR.env.hc){var J=I.getChild(0);J.setHtml(B.lockRatio?CKEDITOR.env.ie?'■':'▣':CKEDITOR.env.ie?'□':'▢');}return B.lockRatio;},q=function(B){var C=B.originalElement;if(C.getCustomData('isReady')=='true'){var D=B.getContentElement('info','txtWidth'),E=B.getContentElement('info','txtHeight');D&&D.setValue(C.$.width);E&&E.setValue(C.$.height);}l(B);},r=function(B,C){if(B!=d)return;function D(I,J){var K=I.match(h);if(K){if(K[2]=='%'){K[1]+='%';p(E,false);}return K[1];}return J;};var E=this.getDialog(),F='',G=this.id=='txtWidth'?'width':'height',H=C.getAttribute(G);if(H)F=D(H,F);F=D(C.getStyle(G),F);this.setValue(F);},s,t=function(){var B=this.originalElement;B.setCustomData('isReady','true');B.removeListener('load',t);B.removeListener('error',u);B.removeListener('abort',u);
-CKEDITOR.document.getById(y).setStyle('display','none');if(!this.dontResetSize)q(this);if(this.firstLoad)CKEDITOR.tools.setTimeout(function(){p(this,'check');},0,this);this.firstLoad=false;this.dontResetSize=false;},u=function(){var D=this;var B=D.originalElement;B.removeListener('load',t);B.removeListener('error',u);B.removeListener('abort',u);var C=CKEDITOR.getUrl(b.skinPath+'images/noimage.png');if(D.preview)D.preview.setAttribute('src',C);CKEDITOR.document.getById(y).setStyle('display','none');p(D,false);},v=function(B){return CKEDITOR.tools.getNextId()+'_'+B;},w=v('btnLockSizes'),x=v('btnResetSize'),y=v('ImagePreviewLoader'),z=v('previewLink'),A=v('previewImage');return{title:b.lang.image[c=='image'?'title':'titleButton'],minWidth:420,minHeight:360,onShow:function(){var H=this;H.imageElement=false;H.linkElement=false;H.imageEditMode=false;H.linkEditMode=false;H.lockRatio=true;H.userlockRatio=0;H.dontResetSize=false;H.firstLoad=true;H.addLink=false;var B=H.getParentEditor(),C=B.getSelection(),D=C&&C.getSelectedElement(),E=D&&D.getAscendant('a');CKEDITOR.document.getById(y).setStyle('display','none');s=new CKEDITOR.dom.element('img',B.document);H.preview=CKEDITOR.document.getById(A);H.originalElement=B.document.createElement('img');H.originalElement.setAttribute('alt','');H.originalElement.setCustomData('isReady','false');if(E){H.linkElement=E;H.linkEditMode=true;var F=E.getChildren();if(F.count()==1){var G=F.getItem(0).getName();if(G=='img'||G=='input'){H.imageElement=F.getItem(0);if(H.imageElement.getName()=='img')H.imageEditMode='img';else if(H.imageElement.getName()=='input')H.imageEditMode='input';}}if(c=='image')H.setupContent(e,E);}if(D&&D.getName()=='img'&&!D.data('cke-realelement')||D&&D.getName()=='input'&&D.getAttribute('type')=='image'){H.imageEditMode=D.getName();H.imageElement=D;}if(H.imageEditMode){H.cleanImageElement=H.imageElement;H.imageElement=H.cleanImageElement.clone(true,true);H.setupContent(d,H.imageElement);}else H.imageElement=B.document.createElement('img');p(H,true);if(!CKEDITOR.tools.trim(H.getValueOf('info','txtUrl'))){H.preview.removeAttribute('src');H.preview.setStyle('display','none');}},onOk:function(){var C=this;if(C.imageEditMode){var B=C.imageEditMode;if(c=='image'&&B=='input'&&confirm(b.lang.image.button2Img)){B='img';C.imageElement=b.document.createElement('img');C.imageElement.setAttribute('alt','');b.insertElement(C.imageElement);}else if(c!='image'&&B=='img'&&confirm(b.lang.image.img2Button)){B='input';C.imageElement=b.document.createElement('input');
-C.imageElement.setAttributes({type:'image',alt:''});b.insertElement(C.imageElement);}else{C.imageElement=C.cleanImageElement;delete C.cleanImageElement;}}else{if(c=='image')C.imageElement=b.document.createElement('img');else{C.imageElement=b.document.createElement('input');C.imageElement.setAttribute('type','image');}C.imageElement.setAttribute('alt','');}if(!C.linkEditMode)C.linkElement=b.document.createElement('a');C.commitContent(d,C.imageElement);C.commitContent(e,C.linkElement);if(!C.imageElement.getAttribute('style'))C.imageElement.removeAttribute('style');if(!C.imageEditMode){if(C.addLink){if(!C.linkEditMode){b.insertElement(C.linkElement);C.linkElement.append(C.imageElement,false);}else b.insertElement(C.imageElement);}else b.insertElement(C.imageElement);}else if(!C.linkEditMode&&C.addLink){b.insertElement(C.linkElement);C.imageElement.appendTo(C.linkElement);}else if(C.linkEditMode&&!C.addLink){b.getSelection().selectElement(C.linkElement);b.insertElement(C.imageElement);}},onLoad:function(){var C=this;if(c!='image')C.hidePage('Link');var B=C._.element.getDocument();if(C.getContentElement('info','ratioLock')){C.addFocusable(B.getById(x),5);C.addFocusable(B.getById(w),5);}C.commitContent=m;},onHide:function(){var B=this;if(B.preview)B.commitContent(g,B.preview);if(B.originalElement){B.originalElement.removeListener('load',t);B.originalElement.removeListener('error',u);B.originalElement.removeListener('abort',u);B.originalElement.remove();B.originalElement=false;}delete B.imageElement;},contents:[{id:'info',label:b.lang.image.infoTab,accessKey:'I',elements:[{type:'vbox',padding:0,children:[{type:'hbox',widths:['280px','110px'],align:'right',children:[{id:'txtUrl',type:'text',label:b.lang.common.url,required:true,onChange:function(){var B=this.getDialog(),C=this.getValue();if(C.length>0){B=this.getDialog();var D=B.originalElement;B.preview.removeStyle('display');D.setCustomData('isReady','false');var E=CKEDITOR.document.getById(y);if(E)E.setStyle('display','');D.on('load',t,B);D.on('error',u,B);D.on('abort',u,B);D.setAttribute('src',C);s.setAttribute('src',C);B.preview.setAttribute('src',s.$.src);l(B);}else if(B.preview){B.preview.removeAttribute('src');B.preview.setStyle('display','none');}},setup:function(B,C){if(B==d){var D=C.data('cke-saved-src')||C.getAttribute('src'),E=this;this.getDialog().dontResetSize=true;E.setValue(D);E.setInitValue();}},commit:function(B,C){var D=this;if(B==d&&(D.getValue()||D.isChanged())){C.data('cke-saved-src',D.getValue());
-C.setAttribute('src',D.getValue());}else if(B==g){C.setAttribute('src','');C.removeAttribute('src');}},validate:CKEDITOR.dialog.validate.notEmpty(b.lang.image.urlMissing)},{type:'button',id:'browse',style:'display:inline-block;margin-top:10px;',align:'center',label:b.lang.common.browseServer,hidden:true,filebrowser:'info:txtUrl'}]}]},{id:'txtAlt',type:'text',label:b.lang.image.alt,accessKey:'T','default':'',onChange:function(){l(this.getDialog());},setup:function(B,C){if(B==d)this.setValue(C.getAttribute('alt'));},commit:function(B,C){var D=this;if(B==d){if(D.getValue()||D.isChanged())C.setAttribute('alt',D.getValue());}else if(B==f)C.setAttribute('alt',D.getValue());else if(B==g)C.removeAttribute('alt');}},{type:'hbox',children:[{id:'basic',type:'vbox',children:[{type:'hbox',widths:['50%','50%'],children:[{type:'vbox',padding:1,children:[{type:'text',width:'40px',id:'txtWidth',label:b.lang.common.width,onKeyUp:k,onChange:function(){o.call(this,'advanced:txtdlgGenStyle');},validate:function(){var B=this.getValue().match(i),C=!!(B&&parseInt(B[1],10)!==0);if(!C)alert(b.lang.common.invalidWidth);return C;},setup:r,commit:function(B,C,D){var E=this.getValue();if(B==d){if(E)C.setStyle('width',CKEDITOR.tools.cssLength(E));else C.removeStyle('width');!D&&C.removeAttribute('width');}else if(B==f){var F=E.match(h);if(!F){var G=this.getDialog().originalElement;if(G.getCustomData('isReady')=='true')C.setStyle('width',G.$.width+'px');}else C.setStyle('width',CKEDITOR.tools.cssLength(E));}else if(B==g){C.removeAttribute('width');C.removeStyle('width');}}},{type:'text',id:'txtHeight',width:'40px',label:b.lang.common.height,onKeyUp:k,onChange:function(){o.call(this,'advanced:txtdlgGenStyle');},validate:function(){var B=this.getValue().match(i),C=!!(B&&parseInt(B[1],10)!==0);if(!C)alert(b.lang.common.invalidHeight);return C;},setup:r,commit:function(B,C,D){var E=this.getValue();if(B==d){if(E)C.setStyle('height',CKEDITOR.tools.cssLength(E));else C.removeStyle('height');!D&&C.removeAttribute('height');}else if(B==f){var F=E.match(h);if(!F){var G=this.getDialog().originalElement;if(G.getCustomData('isReady')=='true')C.setStyle('height',G.$.height+'px');}else C.setStyle('height',CKEDITOR.tools.cssLength(E));}else if(B==g){C.removeAttribute('height');C.removeStyle('height');}}}]},{id:'ratioLock',type:'html',style:'margin-top:30px;width:40px;height:40px;',onLoad:function(){var B=CKEDITOR.document.getById(x),C=CKEDITOR.document.getById(w);if(B){B.on('click',function(D){q(this);D.data&&D.data.preventDefault();
-},this.getDialog());B.on('mouseover',function(){this.addClass('cke_btn_over');},B);B.on('mouseout',function(){this.removeClass('cke_btn_over');},B);}if(C){C.on('click',function(D){var I=this;var E=p(I),F=I.originalElement,G=I.getValueOf('info','txtWidth');if(F.getCustomData('isReady')=='true'&&G){var H=F.$.height/F.$.width*G;if(!isNaN(H)){I.setValueOf('info','txtHeight',Math.round(H));l(I);}}D.data&&D.data.preventDefault();},this.getDialog());C.on('mouseover',function(){this.addClass('cke_btn_over');},C);C.on('mouseout',function(){this.removeClass('cke_btn_over');},C);}},html:'<div><a href="javascript:void(0)" tabindex="-1" title="'+b.lang.image.lockRatio+'" class="cke_btn_locked" id="'+w+'" role="checkbox"><span class="cke_icon"></span><span class="cke_label">'+b.lang.image.lockRatio+'</span></a>'+'<a href="javascript:void(0)" tabindex="-1" title="'+b.lang.image.resetSize+'" class="cke_btn_reset" id="'+x+'" role="button"><span class="cke_label">'+b.lang.image.resetSize+'</span></a>'+'</div>'}]},{type:'vbox',padding:1,children:[{type:'text',id:'txtBorder',width:'60px',label:b.lang.image.border,'default':'',onKeyUp:function(){l(this.getDialog());},onChange:function(){o.call(this,'advanced:txtdlgGenStyle');},validate:CKEDITOR.dialog.validate.integer(b.lang.image.validateBorder),setup:function(B,C){if(B==d){var D,E=C.getStyle('border-width');E=E&&E.match(/^(\d+px)(?: \1 \1 \1)?$/);D=E&&parseInt(E[1],10);isNaN(parseInt(D,10))&&(D=C.getAttribute('border'));this.setValue(D);}},commit:function(B,C,D){var E=parseInt(this.getValue(),10);if(B==d||B==f){if(!isNaN(E)){C.setStyle('border-width',CKEDITOR.tools.cssLength(E));C.setStyle('border-style','solid');}else if(!E&&this.isChanged()){C.removeStyle('border-width');C.removeStyle('border-style');C.removeStyle('border-color');}if(!D&&B==d)C.removeAttribute('border');}else if(B==g){C.removeAttribute('border');C.removeStyle('border-width');C.removeStyle('border-style');C.removeStyle('border-color');}}},{type:'text',id:'txtHSpace',width:'60px',label:b.lang.image.hSpace,'default':'',onKeyUp:function(){l(this.getDialog());},onChange:function(){o.call(this,'advanced:txtdlgGenStyle');},validate:CKEDITOR.dialog.validate.integer(b.lang.image.validateHSpace),setup:function(B,C){if(B==d){var D,E,F,G=C.getStyle('margin-left'),H=C.getStyle('margin-right');G=G&&G.match(j);H=H&&H.match(j);E=parseInt(G,10);F=parseInt(H,10);D=E==F&&E;isNaN(parseInt(D,10))&&(D=C.getAttribute('hspace'));this.setValue(D);}},commit:function(B,C,D){var E=parseInt(this.getValue(),10);
-if(B==d||B==f){if(!isNaN(E)){C.setStyle('margin-left',CKEDITOR.tools.cssLength(E));C.setStyle('margin-right',CKEDITOR.tools.cssLength(E));}else if(!E&&this.isChanged()){C.removeStyle('margin-left');C.removeStyle('margin-right');}if(!D&&B==d)C.removeAttribute('hspace');}else if(B==g){C.removeAttribute('hspace');C.removeStyle('margin-left');C.removeStyle('margin-right');}}},{type:'text',id:'txtVSpace',width:'60px',label:b.lang.image.vSpace,'default':'',onKeyUp:function(){l(this.getDialog());},onChange:function(){o.call(this,'advanced:txtdlgGenStyle');},validate:CKEDITOR.dialog.validate.integer(b.lang.image.validateVSpace),setup:function(B,C){if(B==d){var D,E,F,G=C.getStyle('margin-top'),H=C.getStyle('margin-bottom');G=G&&G.match(j);H=H&&H.match(j);E=parseInt(G,10);F=parseInt(H,10);D=E==F&&E;isNaN(parseInt(D,10))&&(D=C.getAttribute('vspace'));this.setValue(D);}},commit:function(B,C,D){var E=parseInt(this.getValue(),10);if(B==d||B==f){if(!isNaN(E)){C.setStyle('margin-top',CKEDITOR.tools.cssLength(E));C.setStyle('margin-bottom',CKEDITOR.tools.cssLength(E));}else if(!E&&this.isChanged()){C.removeStyle('margin-top');C.removeStyle('margin-bottom');}if(!D&&B==d)C.removeAttribute('vspace');}else if(B==g){C.removeAttribute('vspace');C.removeStyle('margin-top');C.removeStyle('margin-bottom');}}},{id:'cmbAlign',type:'select',widths:['35%','65%'],style:'width:90px',label:b.lang.common.align,'default':'',items:[[b.lang.common.notSet,''],[b.lang.common.alignLeft,'left'],[b.lang.common.alignRight,'right']],onChange:function(){l(this.getDialog());o.call(this,'advanced:txtdlgGenStyle');},setup:function(B,C){if(B==d){var D=C.getStyle('float');switch(D){case 'inherit':case 'none':D='';}!D&&(D=(C.getAttribute('align')||'').toLowerCase());this.setValue(D);}},commit:function(B,C,D){var E=this.getValue();if(B==d||B==f){if(E)C.setStyle('float',E);else C.removeStyle('float');if(!D&&B==d){E=(C.getAttribute('align')||'').toLowerCase();switch(E){case 'left':case 'right':C.removeAttribute('align');}}}else if(B==g)C.removeStyle('float');}}]}]},{type:'vbox',height:'250px',children:[{type:'html',id:'htmlPreview',style:'width:95%;',html:'<div>'+CKEDITOR.tools.htmlEncode(b.lang.common.preview)+'<br>'+'<div id="'+y+'" class="ImagePreviewLoader" style="display:none"><div class="loading"> </div></div>'+'<div class="ImagePreviewBox"><table><tr><td>'+'<a href="javascript:void(0)" target="_blank" onclick="return false;" id="'+z+'">'+'<img id="'+A+'" alt="" /></a>'+(b.config.image_previewText||'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas feugiat consequat diam. Maecenas metus. Vivamus diam purus, cursus a, commodo non, facilisis vitae, nulla. Aenean dictum lacinia tortor. Nunc iaculis, nibh non iaculis aliquam, orci felis euismod neque, sed ornare massa mauris sed velit. Nulla pretium mi et risus. Fusce mi pede, tempor id, cursus ac, ullamcorper nec, enim. Sed tortor. Curabitur molestie. Duis velit augue, condimentum at, ultrices a, luctus ut, orci. Donec pellentesque egestas eros. Integer cursus, augue in cursus faucibus, eros pede bibendum sem, in tempus tellus justo quis ligula. Etiam eget tortor. Vestibulum rutrum, est ut placerat elementum, lectus nisl aliquam velit, tempor aliquam eros nunc nonummy metus. In eros metus, gravida a, gravida sed, lobortis id, turpis. Ut ultrices, ipsum at venenatis fringilla, sem nulla lacinia tellus, eget aliquet turpis mauris non enim. Nam turpis. Suspendisse lacinia. Curabitur ac tortor ut ipsum egestas elementum. Nunc imperdiet gravida mauris.')+'</td></tr></table></div></div>'}]}]}]},{id:'Link',label:b.lang.link.title,padding:0,elements:[{id:'txtUrl',type:'text',label:b.lang.common.url,style:'width: 100%','default':'',setup:function(B,C){if(B==e){var D=C.data('cke-saved-href');
-if(!D)D=C.getAttribute('href');this.setValue(D);}},commit:function(B,C){var E=this;if(B==e)if(E.getValue()||E.isChanged()){var D=decodeURI(E.getValue());C.data('cke-saved-href',D);C.setAttribute('href',D);if(E.getValue()||!b.config.image_removeLinkByEmptyURL)E.getDialog().addLink=true;}}},{type:'button',id:'browse',filebrowser:{action:'Browse',target:'Link:txtUrl',url:b.config.filebrowserImageBrowseLinkUrl},style:'float:right',hidden:true,label:b.lang.common.browseServer},{id:'cmbTarget',type:'select',label:b.lang.common.target,'default':'',items:[[b.lang.common.notSet,''],[b.lang.common.targetNew,'_blank'],[b.lang.common.targetTop,'_top'],[b.lang.common.targetSelf,'_self'],[b.lang.common.targetParent,'_parent']],setup:function(B,C){if(B==e)this.setValue(C.getAttribute('target')||'');},commit:function(B,C){if(B==e)if(this.getValue()||this.isChanged())C.setAttribute('target',this.getValue());}}]},{id:'Upload',hidden:true,filebrowser:'uploadButton',label:b.lang.image.upload,elements:[{type:'file',id:'upload',label:b.lang.image.btnUpload,style:'height:40px',size:38},{type:'fileButton',id:'uploadButton',filebrowser:'info:txtUrl',label:b.lang.image.btnUpload,'for':['Upload','upload']}]},{id:'advanced',label:b.lang.common.advancedTab,elements:[{type:'hbox',widths:['50%','25%','25%'],children:[{type:'text',id:'linkId',label:b.lang.common.id,setup:function(B,C){if(B==d)this.setValue(C.getAttribute('id'));},commit:function(B,C){if(B==d)if(this.getValue()||this.isChanged())C.setAttribute('id',this.getValue());}},{id:'cmbLangDir',type:'select',style:'width : 100px;',label:b.lang.common.langDir,'default':'',items:[[b.lang.common.notSet,''],[b.lang.common.langDirLtr,'ltr'],[b.lang.common.langDirRtl,'rtl']],setup:function(B,C){if(B==d)this.setValue(C.getAttribute('dir'));},commit:function(B,C){if(B==d)if(this.getValue()||this.isChanged())C.setAttribute('dir',this.getValue());}},{type:'text',id:'txtLangCode',label:b.lang.common.langCode,'default':'',setup:function(B,C){if(B==d)this.setValue(C.getAttribute('lang'));},commit:function(B,C){if(B==d)if(this.getValue()||this.isChanged())C.setAttribute('lang',this.getValue());}}]},{type:'text',id:'txtGenLongDescr',label:b.lang.common.longDescr,setup:function(B,C){if(B==d)this.setValue(C.getAttribute('longDesc'));},commit:function(B,C){if(B==d)if(this.getValue()||this.isChanged())C.setAttribute('longDesc',this.getValue());}},{type:'hbox',widths:['50%','50%'],children:[{type:'text',id:'txtGenClass',label:b.lang.common.cssClass,'default':'',setup:function(B,C){if(B==d)this.setValue(C.getAttribute('class'));
-},commit:function(B,C){if(B==d)if(this.getValue()||this.isChanged())C.setAttribute('class',this.getValue());}},{type:'text',id:'txtGenTitle',label:b.lang.common.advisoryTitle,'default':'',onChange:function(){l(this.getDialog());},setup:function(B,C){if(B==d)this.setValue(C.getAttribute('title'));},commit:function(B,C){var D=this;if(B==d){if(D.getValue()||D.isChanged())C.setAttribute('title',D.getValue());}else if(B==f)C.setAttribute('title',D.getValue());else if(B==g)C.removeAttribute('title');}}]},{type:'text',id:'txtdlgGenStyle',label:b.lang.common.cssStyle,validate:CKEDITOR.dialog.validate.inlineStyle(b.lang.common.invalidInlineStyle),'default':'',setup:function(B,C){if(B==d){var D=C.getAttribute('style');if(!D&&C.$.style.cssText)D=C.$.style.cssText;this.setValue(D);var E=C.$.style.height,F=C.$.style.width,G=(E?E:'').match(h),H=(F?F:'').match(h);this.attributesInStyle={height:!!G,width:!!H};}},onChange:function(){o.call(this,['info:cmbFloat','info:cmbAlign','info:txtVSpace','info:txtHSpace','info:txtBorder','info:txtWidth','info:txtHeight']);l(this);},commit:function(B,C){if(B==d&&(this.getValue()||this.isChanged()))C.setAttribute('style',this.getValue());}}]}]};};CKEDITOR.dialog.add('image',function(b){return a(b,'image');});CKEDITOR.dialog.add('imagebutton',function(b){return a(b,'imagebutton');});})();
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function(){var a=function(b,c){var d=1,e=2,f=4,g=8,h=/^\s*(\d+)((px)|\%)?\s*$/i,i=/(^\s*(\d+)((px)|\%)?\s*$)|^$/i,j=/^\d+px$/,k=function(){var B=this.getValue(),C=this.getDialog(),D=B.match(h);if(D){if(D[2]=='%')p(C,false);B=D[1];}if(C.lockRatio){var E=C.originalElement;if(E.getCustomData('isReady')=='true')if(this.id=='txtHeight'){if(B&&B!='0')B=Math.round(E.$.width*(B/E.$.height));if(!isNaN(B))C.setValueOf('info','txtWidth',B);}else{if(B&&B!='0')B=Math.round(E.$.height*(B/E.$.width));if(!isNaN(B))C.setValueOf('info','txtHeight',B);}}l(C);},l=function(B){if(!B.originalElement||!B.preview)return 1;B.commitContent(f,B.preview);return 0;};function m(){var B=arguments,C=this.getContentElement('advanced','txtdlgGenStyle');C&&C.commit.apply(C,B);this.foreach(function(D){if(D.commit&&D.id!='txtdlgGenStyle')D.commit.apply(D,B);});};var n;function o(B){if(n)return;n=1;var C=this.getDialog(),D=C.imageElement;if(D){this.commit(d,D);B=[].concat(B);var E=B.length,F;for(var G=0;G<E;G++){F=C.getContentElement.apply(C,B[G].split(':'));F&&F.setup(d,D);}}n=0;};var p=function(B,C){if(!B.getContentElement('info','ratioLock'))return null;var D=B.originalElement;if(!D)return null;if(C=='check'){if(!B.userlockRatio&&D.getCustomData('isReady')=='true'){var E=B.getValueOf('info','txtWidth'),F=B.getValueOf('info','txtHeight'),G=D.$.width*1000/D.$.height,H=E*1000/F;B.lockRatio=false;if(!E&&!F)B.lockRatio=true;else if(!isNaN(G)&&!isNaN(H))if(Math.round(G)==Math.round(H))B.lockRatio=true;}}else if(C!=undefined)B.lockRatio=C;else{B.userlockRatio=1;B.lockRatio=!B.lockRatio;}var I=CKEDITOR.document.getById(w);if(B.lockRatio)I.removeClass('cke_btn_unlocked');else I.addClass('cke_btn_unlocked');I.setAttribute('aria-checked',B.lockRatio);if(CKEDITOR.env.hc){var J=I.getChild(0);J.setHtml(B.lockRatio?CKEDITOR.env.ie?'■':'▣':CKEDITOR.env.ie?'□':'▢');}return B.lockRatio;},q=function(B){var C=B.originalElement;if(C.getCustomData('isReady')=='true'){var D=B.getContentElement('info','txtWidth'),E=B.getContentElement('info','txtHeight');D&&D.setValue(C.$.width);E&&E.setValue(C.$.height);}l(B);},r=function(B,C){if(B!=d)return;function D(I,J){var K=I.match(h);if(K){if(K[2]=='%'){K[1]+='%';p(E,false);}return K[1];}return J;};var E=this.getDialog(),F='',G=this.id=='txtWidth'?'width':'height',H=C.getAttribute(G);if(H)F=D(H,F);F=D(C.getStyle(G),F);this.setValue(F);},s,t=function(){var B=this.originalElement;B.setCustomData('isReady','true');B.removeListener('load',t);B.removeListener('error',u);B.removeListener('abort',u);
+CKEDITOR.document.getById(y).setStyle('display','none');if(!this.dontResetSize)q(this);if(this.firstLoad)CKEDITOR.tools.setTimeout(function(){p(this,'check');},0,this);this.firstLoad=false;this.dontResetSize=false;},u=function(){var D=this;var B=D.originalElement;B.removeListener('load',t);B.removeListener('error',u);B.removeListener('abort',u);var C=CKEDITOR.getUrl(b.skinPath+'images/noimage.png');if(D.preview)D.preview.setAttribute('src',C);CKEDITOR.document.getById(y).setStyle('display','none');p(D,false);},v=function(B){return CKEDITOR.tools.getNextId()+'_'+B;},w=v('btnLockSizes'),x=v('btnResetSize'),y=v('ImagePreviewLoader'),z=v('previewLink'),A=v('previewImage');return{title:b.lang.image[c=='image'?'title':'titleButton'],minWidth:420,minHeight:360,onShow:function(){var H=this;H.imageElement=false;H.linkElement=false;H.imageEditMode=false;H.linkEditMode=false;H.lockRatio=true;H.userlockRatio=0;H.dontResetSize=false;H.firstLoad=true;H.addLink=false;var B=H.getParentEditor(),C=B.getSelection(),D=C&&C.getSelectedElement(),E=D&&D.getAscendant('a');CKEDITOR.document.getById(y).setStyle('display','none');s=new CKEDITOR.dom.element('img',B.document);H.preview=CKEDITOR.document.getById(A);H.originalElement=B.document.createElement('img');H.originalElement.setAttribute('alt','');H.originalElement.setCustomData('isReady','false');if(E){H.linkElement=E;H.linkEditMode=true;var F=E.getChildren();if(F.count()==1){var G=F.getItem(0).getName();if(G=='img'||G=='input'){H.imageElement=F.getItem(0);if(H.imageElement.getName()=='img')H.imageEditMode='img';else if(H.imageElement.getName()=='input')H.imageEditMode='input';}}if(c=='image')H.setupContent(e,E);}if(D&&D.getName()=='img'&&!D.data('cke-realelement')||D&&D.getName()=='input'&&D.getAttribute('type')=='image'){H.imageEditMode=D.getName();H.imageElement=D;}if(H.imageEditMode){H.cleanImageElement=H.imageElement;H.imageElement=H.cleanImageElement.clone(true,true);H.setupContent(d,H.imageElement);}else H.imageElement=B.document.createElement('img');p(H,true);if(!CKEDITOR.tools.trim(H.getValueOf('info','txtUrl'))){H.preview.removeAttribute('src');H.preview.setStyle('display','none');}},onOk:function(){var C=this;if(C.imageEditMode){var B=C.imageEditMode;if(c=='image'&&B=='input'&&confirm(b.lang.image.button2Img)){B='img';C.imageElement=b.document.createElement('img');C.imageElement.setAttribute('alt','');b.insertElement(C.imageElement);}else if(c!='image'&&B=='img'&&confirm(b.lang.image.img2Button)){B='input';C.imageElement=b.document.createElement('input');
+C.imageElement.setAttributes({type:'image',alt:''});b.insertElement(C.imageElement);}else{C.imageElement=C.cleanImageElement;delete C.cleanImageElement;}}else{if(c=='image')C.imageElement=b.document.createElement('img');else{C.imageElement=b.document.createElement('input');C.imageElement.setAttribute('type','image');}C.imageElement.setAttribute('alt','');}if(!C.linkEditMode)C.linkElement=b.document.createElement('a');C.commitContent(d,C.imageElement);C.commitContent(e,C.linkElement);if(!C.imageElement.getAttribute('style'))C.imageElement.removeAttribute('style');if(!C.imageEditMode){if(C.addLink){if(!C.linkEditMode){b.insertElement(C.linkElement);C.linkElement.append(C.imageElement,false);}else b.insertElement(C.imageElement);}else b.insertElement(C.imageElement);}else if(!C.linkEditMode&&C.addLink){b.insertElement(C.linkElement);C.imageElement.appendTo(C.linkElement);}else if(C.linkEditMode&&!C.addLink){b.getSelection().selectElement(C.linkElement);b.insertElement(C.imageElement);}},onLoad:function(){var C=this;if(c!='image')C.hidePage('Link');var B=C._.element.getDocument();if(C.getContentElement('info','ratioLock')){C.addFocusable(B.getById(x),5);C.addFocusable(B.getById(w),5);}C.commitContent=m;},onHide:function(){var B=this;if(B.preview)B.commitContent(g,B.preview);if(B.originalElement){B.originalElement.removeListener('load',t);B.originalElement.removeListener('error',u);B.originalElement.removeListener('abort',u);B.originalElement.remove();B.originalElement=false;}delete B.imageElement;},contents:[{id:'info',label:b.lang.image.infoTab,accessKey:'I',elements:[{type:'vbox',padding:0,children:[{type:'hbox',widths:['280px','110px'],align:'right',children:[{id:'txtUrl',type:'text',label:b.lang.common.url,required:true,onChange:function(){var B=this.getDialog(),C=this.getValue();if(C.length>0){B=this.getDialog();var D=B.originalElement;B.preview.removeStyle('display');D.setCustomData('isReady','false');var E=CKEDITOR.document.getById(y);if(E)E.setStyle('display','');D.on('load',t,B);D.on('error',u,B);D.on('abort',u,B);D.setAttribute('src',C);s.setAttribute('src',C);B.preview.setAttribute('src',s.$.src);l(B);}else if(B.preview){B.preview.removeAttribute('src');B.preview.setStyle('display','none');}},setup:function(B,C){if(B==d){var D=C.data('cke-saved-src')||C.getAttribute('src'),E=this;this.getDialog().dontResetSize=true;E.setValue(D);E.setInitValue();}},commit:function(B,C){var D=this;if(B==d&&(D.getValue()||D.isChanged())){C.data('cke-saved-src',D.getValue());
+C.setAttribute('src',D.getValue());}else if(B==g){C.setAttribute('src','');C.removeAttribute('src');}},validate:CKEDITOR.dialog.validate.notEmpty(b.lang.image.urlMissing)},{type:'button',id:'browse',style:'display:inline-block;margin-top:10px;',align:'center',label:b.lang.common.browseServer,hidden:true,filebrowser:'info:txtUrl'}]}]},{id:'txtAlt',type:'text',label:b.lang.image.alt,accessKey:'T','default':'',onChange:function(){l(this.getDialog());},setup:function(B,C){if(B==d)this.setValue(C.getAttribute('alt'));},commit:function(B,C){var D=this;if(B==d){if(D.getValue()||D.isChanged())C.setAttribute('alt',D.getValue());}else if(B==f)C.setAttribute('alt',D.getValue());else if(B==g)C.removeAttribute('alt');}},{type:'hbox',children:[{id:'basic',type:'vbox',children:[{type:'hbox',widths:['50%','50%'],children:[{type:'vbox',padding:1,children:[{type:'text',width:'40px',id:'txtWidth',label:b.lang.common.width,onKeyUp:k,onChange:function(){o.call(this,'advanced:txtdlgGenStyle');},validate:function(){var B=this.getValue().match(i),C=!!(B&&parseInt(B[1],10)!==0);if(!C)alert(b.lang.common.invalidWidth);return C;},setup:r,commit:function(B,C,D){var E=this.getValue();if(B==d){if(E)C.setStyle('width',CKEDITOR.tools.cssLength(E));else C.removeStyle('width');!D&&C.removeAttribute('width');}else if(B==f){var F=E.match(h);if(!F){var G=this.getDialog().originalElement;if(G.getCustomData('isReady')=='true')C.setStyle('width',G.$.width+'px');}else C.setStyle('width',CKEDITOR.tools.cssLength(E));}else if(B==g){C.removeAttribute('width');C.removeStyle('width');}}},{type:'text',id:'txtHeight',width:'40px',label:b.lang.common.height,onKeyUp:k,onChange:function(){o.call(this,'advanced:txtdlgGenStyle');},validate:function(){var B=this.getValue().match(i),C=!!(B&&parseInt(B[1],10)!==0);if(!C)alert(b.lang.common.invalidHeight);return C;},setup:r,commit:function(B,C,D){var E=this.getValue();if(B==d){if(E)C.setStyle('height',CKEDITOR.tools.cssLength(E));else C.removeStyle('height');!D&&C.removeAttribute('height');}else if(B==f){var F=E.match(h);if(!F){var G=this.getDialog().originalElement;if(G.getCustomData('isReady')=='true')C.setStyle('height',G.$.height+'px');}else C.setStyle('height',CKEDITOR.tools.cssLength(E));}else if(B==g){C.removeAttribute('height');C.removeStyle('height');}}}]},{id:'ratioLock',type:'html',style:'margin-top:30px;width:40px;height:40px;',onLoad:function(){var B=CKEDITOR.document.getById(x),C=CKEDITOR.document.getById(w);if(B){B.on('click',function(D){q(this);D.data&&D.data.preventDefault();
+},this.getDialog());B.on('mouseover',function(){this.addClass('cke_btn_over');},B);B.on('mouseout',function(){this.removeClass('cke_btn_over');},B);}if(C){C.on('click',function(D){var I=this;var E=p(I),F=I.originalElement,G=I.getValueOf('info','txtWidth');if(F.getCustomData('isReady')=='true'&&G){var H=F.$.height/F.$.width*G;if(!isNaN(H)){I.setValueOf('info','txtHeight',Math.round(H));l(I);}}D.data&&D.data.preventDefault();},this.getDialog());C.on('mouseover',function(){this.addClass('cke_btn_over');},C);C.on('mouseout',function(){this.removeClass('cke_btn_over');},C);}},html:'<div><a href="javascript:void(0)" tabindex="-1" title="'+b.lang.image.lockRatio+'" class="cke_btn_locked" id="'+w+'" role="checkbox"><span class="cke_icon"></span><span class="cke_label">'+b.lang.image.lockRatio+'</span></a>'+'<a href="javascript:void(0)" tabindex="-1" title="'+b.lang.image.resetSize+'" class="cke_btn_reset" id="'+x+'" role="button"><span class="cke_label">'+b.lang.image.resetSize+'</span></a>'+'</div>'}]},{type:'vbox',padding:1,children:[{type:'text',id:'txtBorder',width:'60px',label:b.lang.image.border,'default':'',onKeyUp:function(){l(this.getDialog());},onChange:function(){o.call(this,'advanced:txtdlgGenStyle');},validate:CKEDITOR.dialog.validate.integer(b.lang.image.validateBorder),setup:function(B,C){if(B==d){var D,E=C.getStyle('border-width');E=E&&E.match(/^(\d+px)(?: \1 \1 \1)?$/);D=E&&parseInt(E[1],10);isNaN(parseInt(D,10))&&(D=C.getAttribute('border'));this.setValue(D);}},commit:function(B,C,D){var E=parseInt(this.getValue(),10);if(B==d||B==f){if(!isNaN(E)){C.setStyle('border-width',CKEDITOR.tools.cssLength(E));C.setStyle('border-style','solid');}else if(!E&&this.isChanged()){C.removeStyle('border-width');C.removeStyle('border-style');C.removeStyle('border-color');}if(!D&&B==d)C.removeAttribute('border');}else if(B==g){C.removeAttribute('border');C.removeStyle('border-width');C.removeStyle('border-style');C.removeStyle('border-color');}}},{type:'text',id:'txtHSpace',width:'60px',label:b.lang.image.hSpace,'default':'',onKeyUp:function(){l(this.getDialog());},onChange:function(){o.call(this,'advanced:txtdlgGenStyle');},validate:CKEDITOR.dialog.validate.integer(b.lang.image.validateHSpace),setup:function(B,C){if(B==d){var D,E,F,G=C.getStyle('margin-left'),H=C.getStyle('margin-right');G=G&&G.match(j);H=H&&H.match(j);E=parseInt(G,10);F=parseInt(H,10);D=E==F&&E;isNaN(parseInt(D,10))&&(D=C.getAttribute('hspace'));this.setValue(D);}},commit:function(B,C,D){var E=parseInt(this.getValue(),10);
+if(B==d||B==f){if(!isNaN(E)){C.setStyle('margin-left',CKEDITOR.tools.cssLength(E));C.setStyle('margin-right',CKEDITOR.tools.cssLength(E));}else if(!E&&this.isChanged()){C.removeStyle('margin-left');C.removeStyle('margin-right');}if(!D&&B==d)C.removeAttribute('hspace');}else if(B==g){C.removeAttribute('hspace');C.removeStyle('margin-left');C.removeStyle('margin-right');}}},{type:'text',id:'txtVSpace',width:'60px',label:b.lang.image.vSpace,'default':'',onKeyUp:function(){l(this.getDialog());},onChange:function(){o.call(this,'advanced:txtdlgGenStyle');},validate:CKEDITOR.dialog.validate.integer(b.lang.image.validateVSpace),setup:function(B,C){if(B==d){var D,E,F,G=C.getStyle('margin-top'),H=C.getStyle('margin-bottom');G=G&&G.match(j);H=H&&H.match(j);E=parseInt(G,10);F=parseInt(H,10);D=E==F&&E;isNaN(parseInt(D,10))&&(D=C.getAttribute('vspace'));this.setValue(D);}},commit:function(B,C,D){var E=parseInt(this.getValue(),10);if(B==d||B==f){if(!isNaN(E)){C.setStyle('margin-top',CKEDITOR.tools.cssLength(E));C.setStyle('margin-bottom',CKEDITOR.tools.cssLength(E));}else if(!E&&this.isChanged()){C.removeStyle('margin-top');C.removeStyle('margin-bottom');}if(!D&&B==d)C.removeAttribute('vspace');}else if(B==g){C.removeAttribute('vspace');C.removeStyle('margin-top');C.removeStyle('margin-bottom');}}},{id:'cmbAlign',type:'select',widths:['35%','65%'],style:'width:90px',label:b.lang.common.align,'default':'',items:[[b.lang.common.notSet,''],[b.lang.common.alignLeft,'left'],[b.lang.common.alignRight,'right']],onChange:function(){l(this.getDialog());o.call(this,'advanced:txtdlgGenStyle');},setup:function(B,C){if(B==d){var D=C.getStyle('float');switch(D){case 'inherit':case 'none':D='';}!D&&(D=(C.getAttribute('align')||'').toLowerCase());this.setValue(D);}},commit:function(B,C,D){var E=this.getValue();if(B==d||B==f){if(E)C.setStyle('float',E);else C.removeStyle('float');if(!D&&B==d){E=(C.getAttribute('align')||'').toLowerCase();switch(E){case 'left':case 'right':C.removeAttribute('align');}}}else if(B==g)C.removeStyle('float');}}]}]},{type:'vbox',height:'250px',children:[{type:'html',id:'htmlPreview',style:'width:95%;',html:'<div>'+CKEDITOR.tools.htmlEncode(b.lang.common.preview)+'<br>'+'<div id="'+y+'" class="ImagePreviewLoader" style="display:none"><div class="loading"> </div></div>'+'<div class="ImagePreviewBox"><table><tr><td>'+'<a href="javascript:void(0)" target="_blank" onclick="return false;" id="'+z+'">'+'<img id="'+A+'" alt="" /></a>'+(b.config.image_previewText||'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas feugiat consequat diam. Maecenas metus. Vivamus diam purus, cursus a, commodo non, facilisis vitae, nulla. Aenean dictum lacinia tortor. Nunc iaculis, nibh non iaculis aliquam, orci felis euismod neque, sed ornare massa mauris sed velit. Nulla pretium mi et risus. Fusce mi pede, tempor id, cursus ac, ullamcorper nec, enim. Sed tortor. Curabitur molestie. Duis velit augue, condimentum at, ultrices a, luctus ut, orci. Donec pellentesque egestas eros. Integer cursus, augue in cursus faucibus, eros pede bibendum sem, in tempus tellus justo quis ligula. Etiam eget tortor. Vestibulum rutrum, est ut placerat elementum, lectus nisl aliquam velit, tempor aliquam eros nunc nonummy metus. In eros metus, gravida a, gravida sed, lobortis id, turpis. Ut ultrices, ipsum at venenatis fringilla, sem nulla lacinia tellus, eget aliquet turpis mauris non enim. Nam turpis. Suspendisse lacinia. Curabitur ac tortor ut ipsum egestas elementum. Nunc imperdiet gravida mauris.')+'</td></tr></table></div></div>'}]}]}]},{id:'Link',label:b.lang.link.title,padding:0,elements:[{id:'txtUrl',type:'text',label:b.lang.common.url,style:'width: 100%','default':'',setup:function(B,C){if(B==e){var D=C.data('cke-saved-href');
+if(!D)D=C.getAttribute('href');this.setValue(D);}},commit:function(B,C){var E=this;if(B==e)if(E.getValue()||E.isChanged()){var D=decodeURI(E.getValue());C.data('cke-saved-href',D);C.setAttribute('href',D);if(E.getValue()||!b.config.image_removeLinkByEmptyURL)E.getDialog().addLink=true;}}},{type:'button',id:'browse',filebrowser:{action:'Browse',target:'Link:txtUrl',url:b.config.filebrowserImageBrowseLinkUrl},style:'float:right',hidden:true,label:b.lang.common.browseServer},{id:'cmbTarget',type:'select',label:b.lang.common.target,'default':'',items:[[b.lang.common.notSet,''],[b.lang.common.targetNew,'_blank'],[b.lang.common.targetTop,'_top'],[b.lang.common.targetSelf,'_self'],[b.lang.common.targetParent,'_parent']],setup:function(B,C){if(B==e)this.setValue(C.getAttribute('target')||'');},commit:function(B,C){if(B==e)if(this.getValue()||this.isChanged())C.setAttribute('target',this.getValue());}}]},{id:'Upload',hidden:true,filebrowser:'uploadButton',label:b.lang.image.upload,elements:[{type:'file',id:'upload',label:b.lang.image.btnUpload,style:'height:40px',size:38},{type:'fileButton',id:'uploadButton',filebrowser:'info:txtUrl',label:b.lang.image.btnUpload,'for':['Upload','upload']}]},{id:'advanced',label:b.lang.common.advancedTab,elements:[{type:'hbox',widths:['50%','25%','25%'],children:[{type:'text',id:'linkId',label:b.lang.common.id,setup:function(B,C){if(B==d)this.setValue(C.getAttribute('id'));},commit:function(B,C){if(B==d)if(this.getValue()||this.isChanged())C.setAttribute('id',this.getValue());}},{id:'cmbLangDir',type:'select',style:'width : 100px;',label:b.lang.common.langDir,'default':'',items:[[b.lang.common.notSet,''],[b.lang.common.langDirLtr,'ltr'],[b.lang.common.langDirRtl,'rtl']],setup:function(B,C){if(B==d)this.setValue(C.getAttribute('dir'));},commit:function(B,C){if(B==d)if(this.getValue()||this.isChanged())C.setAttribute('dir',this.getValue());}},{type:'text',id:'txtLangCode',label:b.lang.common.langCode,'default':'',setup:function(B,C){if(B==d)this.setValue(C.getAttribute('lang'));},commit:function(B,C){if(B==d)if(this.getValue()||this.isChanged())C.setAttribute('lang',this.getValue());}}]},{type:'text',id:'txtGenLongDescr',label:b.lang.common.longDescr,setup:function(B,C){if(B==d)this.setValue(C.getAttribute('longDesc'));},commit:function(B,C){if(B==d)if(this.getValue()||this.isChanged())C.setAttribute('longDesc',this.getValue());}},{type:'hbox',widths:['50%','50%'],children:[{type:'text',id:'txtGenClass',label:b.lang.common.cssClass,'default':'',setup:function(B,C){if(B==d)this.setValue(C.getAttribute('class'));
+},commit:function(B,C){if(B==d)if(this.getValue()||this.isChanged())C.setAttribute('class',this.getValue());}},{type:'text',id:'txtGenTitle',label:b.lang.common.advisoryTitle,'default':'',onChange:function(){l(this.getDialog());},setup:function(B,C){if(B==d)this.setValue(C.getAttribute('title'));},commit:function(B,C){var D=this;if(B==d){if(D.getValue()||D.isChanged())C.setAttribute('title',D.getValue());}else if(B==f)C.setAttribute('title',D.getValue());else if(B==g)C.removeAttribute('title');}}]},{type:'text',id:'txtdlgGenStyle',label:b.lang.common.cssStyle,validate:CKEDITOR.dialog.validate.inlineStyle(b.lang.common.invalidInlineStyle),'default':'',setup:function(B,C){if(B==d){var D=C.getAttribute('style');if(!D&&C.$.style.cssText)D=C.$.style.cssText;this.setValue(D);var E=C.$.style.height,F=C.$.style.width,G=(E?E:'').match(h),H=(F?F:'').match(h);this.attributesInStyle={height:!!G,width:!!H};}},onChange:function(){o.call(this,['info:cmbFloat','info:cmbAlign','info:txtVSpace','info:txtHSpace','info:txtBorder','info:txtWidth','info:txtHeight']);l(this);},commit:function(B,C){if(B==d&&(this.getValue()||this.isChanged()))C.setAttribute('style',this.getValue());}}]}]};};CKEDITOR.dialog.add('image',function(b){return a(b,'image');});CKEDITOR.dialog.add('imagebutton',function(b){return a(b,'imagebutton');});})();
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/link/dialogs/anchor.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/link/dialogs/anchor.js
index 716dc7f..fad0db4 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/link/dialogs/anchor.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/link/dialogs/anchor.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.dialog.add('anchor',function(a){var b=function(d){this._.selectedElement=d;var e=d.data('cke-saved-name');this.setValueOf('info','txtName',e||'');};function c(d,e){return d.createFakeElement(e,'cke_anchor','anchor');};return{title:a.lang.anchor.title,minWidth:300,minHeight:60,onOk:function(){var k=this;var d=CKEDITOR.tools.trim(k.getValueOf('info','txtName')),e={name:d,'data-cke-saved-name':d};if(k._.selectedElement){if(k._.selectedElement.data('cke-realelement')){var f=c(a,a.document.createElement('a',{attributes:e}));f.replace(k._.selectedElement);}else k._.selectedElement.setAttributes(e);}else{var g=a.getSelection(),h=g&&g.getRanges()[0];if(h.collapsed){if(CKEDITOR.plugins.link.synAnchorSelector)e['class']='cke_anchor_empty';if(CKEDITOR.plugins.link.emptyAnchorFix){e.contenteditable='false';e['data-cke-editable']=1;}var i=a.document.createElement('a',{attributes:e});if(CKEDITOR.plugins.link.fakeAnchor)i=c(a,i);h.insertNode(i);}else{if(CKEDITOR.env.ie&&CKEDITOR.env.version<9)e['class']='cke_anchor';var j=new CKEDITOR.style({element:'a',attributes:e});j.type=CKEDITOR.STYLE_INLINE;j.apply(a.document);}}},onHide:function(){delete this._.selectedElement;},onShow:function(){var h=this;var d=a.getSelection(),e=d.getSelectedElement(),f;if(e){if(CKEDITOR.plugins.link.fakeAnchor){var g=CKEDITOR.plugins.link.tryRestoreFakeAnchor(a,e);g&&b.call(h,g);h._.selectedElement=e;}else if(e.is('a')&&e.hasAttribute('name'))b.call(h,e);}else{f=CKEDITOR.plugins.link.getSelectedLink(a);if(f){b.call(h,f);d.selectElement(f);}}h.getContentElement('info','txtName').focus();},contents:[{id:'info',label:a.lang.anchor.title,accessKey:'I',elements:[{type:'text',id:'txtName',label:a.lang.anchor.name,required:true,validate:function(){if(!this.getValue()){alert(a.lang.anchor.errorName);return false;}return true;}}]}]};});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.dialog.add('anchor',function(a){var b=function(d){this._.selectedElement=d;var e=d.data('cke-saved-name');this.setValueOf('info','txtName',e||'');};function c(d,e){return d.createFakeElement(e,'cke_anchor','anchor');};return{title:a.lang.anchor.title,minWidth:300,minHeight:60,onOk:function(){var k=this;var d=CKEDITOR.tools.trim(k.getValueOf('info','txtName')),e={name:d,'data-cke-saved-name':d};if(k._.selectedElement){if(k._.selectedElement.data('cke-realelement')){var f=c(a,a.document.createElement('a',{attributes:e}));f.replace(k._.selectedElement);}else k._.selectedElement.setAttributes(e);}else{var g=a.getSelection(),h=g&&g.getRanges()[0];if(h.collapsed){if(CKEDITOR.plugins.link.synAnchorSelector)e['class']='cke_anchor_empty';if(CKEDITOR.plugins.link.emptyAnchorFix){e.contenteditable='false';e['data-cke-editable']=1;}var i=a.document.createElement('a',{attributes:e});if(CKEDITOR.plugins.link.fakeAnchor)i=c(a,i);h.insertNode(i);}else{if(CKEDITOR.env.ie&&CKEDITOR.env.version<9)e['class']='cke_anchor';var j=new CKEDITOR.style({element:'a',attributes:e});j.type=CKEDITOR.STYLE_INLINE;j.apply(a.document);}}},onHide:function(){delete this._.selectedElement;},onShow:function(){var h=this;var d=a.getSelection(),e=d.getSelectedElement(),f;if(e){if(CKEDITOR.plugins.link.fakeAnchor){var g=CKEDITOR.plugins.link.tryRestoreFakeAnchor(a,e);g&&b.call(h,g);h._.selectedElement=e;}else if(e.is('a')&&e.hasAttribute('name'))b.call(h,e);}else{f=CKEDITOR.plugins.link.getSelectedLink(a);if(f){b.call(h,f);d.selectElement(f);}}h.getContentElement('info','txtName').focus();},contents:[{id:'info',label:a.lang.anchor.title,accessKey:'I',elements:[{type:'text',id:'txtName',label:a.lang.anchor.name,required:true,validate:function(){if(!this.getValue()){alert(a.lang.anchor.errorName);return false;}return true;}}]}]};});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/link/dialogs/link.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/link/dialogs/link.js
index c0d32c8..e8c8953 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/link/dialogs/link.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/link/dialogs/link.js
@@ -1,12 +1,12 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.dialog.add('link',function(a){var b=CKEDITOR.plugins.link,c=function(){var F=this.getDialog(),G=F.getContentElement('target','popupFeatures'),H=F.getContentElement('target','linkTargetName'),I=this.getValue();if(!G||!H)return;G=G.getElement();G.hide();H.setValue('');switch(I){case 'frame':H.setLabel(a.lang.link.targetFrameName);H.getElement().show();break;case 'popup':G.show();H.setLabel(a.lang.link.targetPopupName);H.getElement().show();break;default:H.setValue(I);H.getElement().hide();break;}},d=function(){var F=this.getDialog(),G=['urlOptions','anchorOptions','emailOptions'],H=this.getValue(),I=F.definition.getContents('upload'),J=I&&I.hidden;if(H=='url'){if(a.config.linkShowTargetTab)F.showPage('target');if(!J)F.showPage('upload');}else{F.hidePage('target');if(!J)F.hidePage('upload');}for(var K=0;K<G.length;K++){var L=F.getContentElement('info',G[K]);if(!L)continue;L=L.getElement().getParent().getParent();if(G[K]==H+'Options')L.show();else L.hide();}F.layout();},e=/^javascript:/,f=/^mailto:([^?]+)(?:\?(.+))?$/,g=/subject=([^;?:@&=$,\/]*)/,h=/body=([^;?:@&=$,\/]*)/,i=/^#(.*)$/,j=/^((?:http|https|ftp|news):\/\/)?(.*)$/,k=/^(_(?:self|top|parent|blank))$/,l=/^javascript:void\(location\.href='mailto:'\+String\.fromCharCode\(([^)]+)\)(?:\+'(.*)')?\)$/,m=/^javascript:([^(]+)\(([^)]+)\)$/,n=/\s*window.open\(\s*this\.href\s*,\s*(?:'([^']*)'|null)\s*,\s*'([^']*)'\s*\)\s*;\s*return\s*false;*\s*/,o=/(?:^|,)([^=]+)=(\d+|yes|no)/gi,p=function(F,G){var H=G&&(G.data('cke-saved-href')||G.getAttribute('href'))||'',I,J,K,L,M={};if(I=H.match(e))if(y=='encode')H=H.replace(l,function(ae,af,ag){return 'mailto:'+String.fromCharCode.apply(String,af.split(','))+(ag&&w(ag));});else if(y)H.replace(m,function(ae,af,ag){if(af==z.name){M.type='email';var ah=M.email={},ai=/[^,\s]+/g,aj=/(^')|('$)/g,ak=ag.match(ai),al=ak.length,am,an;for(var ao=0;ao<al;ao++){an=decodeURIComponent(w(ak[ao].replace(aj,'')));am=z.params[ao].toLowerCase();ah[am]=an;}ah.address=[ah.name,ah.domain].join('@');}});if(!M.type)if(K=H.match(i)){M.type='anchor';M.anchor={};M.anchor.name=M.anchor.id=K[1];}else if(J=H.match(f)){var N=H.match(g),O=H.match(h);M.type='email';var P=M.email={};P.address=J[1];N&&(P.subject=decodeURIComponent(N[1]));O&&(P.body=decodeURIComponent(O[1]));}else if(H&&(L=H.match(j))){M.type='url';M.url={};M.url.protocol=L[1];M.url.url=L[2];}else M.type='url';if(G){var Q=G.getAttribute('target');M.target={};M.adv={};if(!Q){var R=G.data('cke-pa-onclick')||G.getAttribute('onclick'),S=R&&R.match(n);
-if(S){M.target.type='popup';M.target.name=S[1];var T;while(T=o.exec(S[2])){if((T[2]=='yes'||T[2]=='1')&&!(T[1] in {height:1,width:1,top:1,left:1}))M.target[T[1]]=true;else if(isFinite(T[2]))M.target[T[1]]=T[2];}}}else{var U=Q.match(k);if(U)M.target.type=M.target.name=Q;else{M.target.type='frame';M.target.name=Q;}}var V=this,W=function(ae,af){var ag=G.getAttribute(af);if(ag!==null)M.adv[ae]=ag||'';};W('advId','id');W('advLangDir','dir');W('advAccessKey','accessKey');M.adv.advName=G.data('cke-saved-name')||G.getAttribute('name')||'';W('advLangCode','lang');W('advTabIndex','tabindex');W('advTitle','title');W('advContentType','type');CKEDITOR.plugins.link.synAnchorSelector?M.adv.advCSSClasses=C(G):W('advCSSClasses','class');W('advCharset','charset');W('advStyles','style');W('advRel','rel');}var X=M.anchors=[],Y,Z,aa;if(CKEDITOR.plugins.link.emptyAnchorFix){var ab=F.document.getElementsByTag('a');for(Y=0,Z=ab.count();Y<Z;Y++){aa=ab.getItem(Y);if(aa.data('cke-saved-name')||aa.hasAttribute('name'))X.push({name:aa.data('cke-saved-name')||aa.getAttribute('name'),id:aa.getAttribute('id')});}}else{var ac=new CKEDITOR.dom.nodeList(F.document.$.anchors);for(Y=0,Z=ac.count();Y<Z;Y++){aa=ac.getItem(Y);X[Y]={name:aa.getAttribute('name'),id:aa.getAttribute('id')};}}if(CKEDITOR.plugins.link.fakeAnchor){var ad=F.document.getElementsByTag('img');for(Y=0,Z=ad.count();Y<Z;Y++){if(aa=CKEDITOR.plugins.link.tryRestoreFakeAnchor(F,ad.getItem(Y)))X.push({name:aa.getAttribute('name'),id:aa.getAttribute('id')});}}this._.selectedElement=G;return M;},q=function(F,G){if(G[F])this.setValue(G[F][this.id]||'');},r=function(F){return q.call(this,'target',F);},s=function(F){return q.call(this,'adv',F);},t=function(F,G){if(!G[F])G[F]={};G[F][this.id]=this.getValue()||'';},u=function(F){return t.call(this,'target',F);},v=function(F){return t.call(this,'adv',F);};function w(F){return F.replace(/\\'/g,"'");};function x(F){return F.replace(/'/g,'\\$&');};var y=a.config.emailProtection||'';if(y&&y!='encode'){var z={};y.replace(/^([^(]+)\(([^)]+)\)$/,function(F,G,H){z.name=G;z.params=[];H.replace(/[^,\s]+/g,function(I){z.params.push(I);});});}function A(F){var G,H=z.name,I=z.params,J,K;G=[H,'('];for(var L=0;L<I.length;L++){J=I[L].toLowerCase();K=F[J];L>0&&G.push(',');G.push("'",K?x(encodeURIComponent(F[J])):'',"'");}G.push(')');return G.join('');};function B(F){var G,H=F.length,I=[];for(var J=0;J<H;J++){G=F.charCodeAt(J);I.push(G);}return 'String.fromCharCode('+I.join(',')+')';};function C(F){var G=F.getAttribute('class');
-return G?G.replace(/\s*(?:cke_anchor_empty|cke_anchor)(?:\s*$)?/g,''):'';};var D=a.lang.common,E=a.lang.link;return{title:E.title,minWidth:350,minHeight:230,contents:[{id:'info',label:E.info,title:E.info,elements:[{id:'linkType',type:'select',label:E.type,'default':'url',items:[[E.toUrl,'url'],[E.toAnchor,'anchor'],[E.toEmail,'email']],onChange:d,setup:function(F){if(F.type)this.setValue(F.type);},commit:function(F){F.type=this.getValue();}},{type:'vbox',id:'urlOptions',children:[{type:'hbox',widths:['25%','75%'],children:[{id:'protocol',type:'select',label:D.protocol,'default':'http://',items:[['http://','http://'],['https://','https://'],['ftp://','ftp://'],['news://','news://'],[E.other,'']],setup:function(F){if(F.url)this.setValue(F.url.protocol||'');},commit:function(F){if(!F.url)F.url={};F.url.protocol=this.getValue();}},{type:'text',id:'url',label:D.url,required:true,onLoad:function(){this.allowOnChange=true;},onKeyUp:function(){var K=this;K.allowOnChange=false;var F=K.getDialog().getContentElement('info','protocol'),G=K.getValue(),H=/^(http|https|ftp|news):\/\/(?=.)/i,I=/^((javascript:)|[#\/\.\?])/i,J=H.exec(G);if(J){K.setValue(G.substr(J[0].length));F.setValue(J[0].toLowerCase());}else if(I.test(G))F.setValue('');K.allowOnChange=true;},onChange:function(){if(this.allowOnChange)this.onKeyUp();},validate:function(){var F=this.getDialog();if(F.getContentElement('info','linkType')&&F.getValueOf('info','linkType')!='url')return true;if(this.getDialog().fakeObj)return true;var G=CKEDITOR.dialog.validate.notEmpty(E.noUrl);return G.apply(this);},setup:function(F){this.allowOnChange=false;if(F.url)this.setValue(F.url.url);this.allowOnChange=true;},commit:function(F){this.onChange();if(!F.url)F.url={};F.url.url=this.getValue();this.allowOnChange=false;}}],setup:function(F){if(!this.getDialog().getContentElement('info','linkType'))this.getElement().show();}},{type:'button',id:'browse',hidden:'true',filebrowser:'info:url',label:D.browseServer}]},{type:'vbox',id:'anchorOptions',width:260,align:'center',padding:0,children:[{type:'fieldset',id:'selectAnchorText',label:E.selectAnchor,setup:function(F){if(F.anchors.length>0)this.getElement().show();else this.getElement().hide();},children:[{type:'hbox',id:'selectAnchor',children:[{type:'select',id:'anchorName','default':'',label:E.anchorName,style:'width: 100%;',items:[['']],setup:function(F){var I=this;I.clear();I.add('');for(var G=0;G<F.anchors.length;G++){if(F.anchors[G].name)I.add(F.anchors[G].name);}if(F.anchor)I.setValue(F.anchor.name);
-var H=I.getDialog().getContentElement('info','linkType');if(H&&H.getValue()=='email')I.focus();},commit:function(F){if(!F.anchor)F.anchor={};F.anchor.name=this.getValue();}},{type:'select',id:'anchorId','default':'',label:E.anchorId,style:'width: 100%;',items:[['']],setup:function(F){var H=this;H.clear();H.add('');for(var G=0;G<F.anchors.length;G++){if(F.anchors[G].id)H.add(F.anchors[G].id);}if(F.anchor)H.setValue(F.anchor.id);},commit:function(F){if(!F.anchor)F.anchor={};F.anchor.id=this.getValue();}}],setup:function(F){if(F.anchors.length>0)this.getElement().show();else this.getElement().hide();}}]},{type:'html',id:'noAnchors',style:'text-align: center;',html:'<div role="note" tabIndex="-1">'+CKEDITOR.tools.htmlEncode(E.noAnchors)+'</div>',focus:true,setup:function(F){if(F.anchors.length<1)this.getElement().show();else this.getElement().hide();}}],setup:function(F){if(!this.getDialog().getContentElement('info','linkType'))this.getElement().hide();}},{type:'vbox',id:'emailOptions',padding:1,children:[{type:'text',id:'emailAddress',label:E.emailAddress,required:true,validate:function(){var F=this.getDialog();if(!F.getContentElement('info','linkType')||F.getValueOf('info','linkType')!='email')return true;var G=CKEDITOR.dialog.validate.notEmpty(E.noEmail);return G.apply(this);},setup:function(F){if(F.email)this.setValue(F.email.address);var G=this.getDialog().getContentElement('info','linkType');if(G&&G.getValue()=='email')this.select();},commit:function(F){if(!F.email)F.email={};F.email.address=this.getValue();}},{type:'text',id:'emailSubject',label:E.emailSubject,setup:function(F){if(F.email)this.setValue(F.email.subject);},commit:function(F){if(!F.email)F.email={};F.email.subject=this.getValue();}},{type:'textarea',id:'emailBody',label:E.emailBody,rows:3,'default':'',setup:function(F){if(F.email)this.setValue(F.email.body);},commit:function(F){if(!F.email)F.email={};F.email.body=this.getValue();}}],setup:function(F){if(!this.getDialog().getContentElement('info','linkType'))this.getElement().hide();}}]},{id:'target',label:E.target,title:E.target,elements:[{type:'hbox',widths:['50%','50%'],children:[{type:'select',id:'linkTargetType',label:D.target,'default':'notSet',style:'width : 100%;',items:[[D.notSet,'notSet'],[E.targetFrame,'frame'],[E.targetPopup,'popup'],[D.targetNew,'_blank'],[D.targetTop,'_top'],[D.targetSelf,'_self'],[D.targetParent,'_parent']],onChange:c,setup:function(F){if(F.target)this.setValue(F.target.type||'notSet');c.call(this);},commit:function(F){if(!F.target)F.target={};
-F.target.type=this.getValue();}},{type:'text',id:'linkTargetName',label:E.targetFrameName,'default':'',setup:function(F){if(F.target)this.setValue(F.target.name);},commit:function(F){if(!F.target)F.target={};F.target.name=this.getValue().replace(/\W/gi,'');}}]},{type:'vbox',width:'100%',align:'center',padding:2,id:'popupFeatures',children:[{type:'fieldset',label:E.popupFeatures,children:[{type:'hbox',children:[{type:'checkbox',id:'resizable',label:E.popupResizable,setup:r,commit:u},{type:'checkbox',id:'status',label:E.popupStatusBar,setup:r,commit:u}]},{type:'hbox',children:[{type:'checkbox',id:'location',label:E.popupLocationBar,setup:r,commit:u},{type:'checkbox',id:'toolbar',label:E.popupToolbar,setup:r,commit:u}]},{type:'hbox',children:[{type:'checkbox',id:'menubar',label:E.popupMenuBar,setup:r,commit:u},{type:'checkbox',id:'fullscreen',label:E.popupFullScreen,setup:r,commit:u}]},{type:'hbox',children:[{type:'checkbox',id:'scrollbars',label:E.popupScrollBars,setup:r,commit:u},{type:'checkbox',id:'dependent',label:E.popupDependent,setup:r,commit:u}]},{type:'hbox',children:[{type:'text',widths:['50%','50%'],labelLayout:'horizontal',label:D.width,id:'width',setup:r,commit:u},{type:'text',labelLayout:'horizontal',widths:['50%','50%'],label:E.popupLeft,id:'left',setup:r,commit:u}]},{type:'hbox',children:[{type:'text',labelLayout:'horizontal',widths:['50%','50%'],label:D.height,id:'height',setup:r,commit:u},{type:'text',labelLayout:'horizontal',label:E.popupTop,widths:['50%','50%'],id:'top',setup:r,commit:u}]}]}]}]},{id:'upload',label:E.upload,title:E.upload,hidden:true,filebrowser:'uploadButton',elements:[{type:'file',id:'upload',label:D.upload,style:'height:40px',size:29},{type:'fileButton',id:'uploadButton',label:D.uploadSubmit,filebrowser:'info:url','for':['upload','upload']}]},{id:'advanced',label:E.advanced,title:E.advanced,elements:[{type:'vbox',padding:1,children:[{type:'hbox',widths:['45%','35%','20%'],children:[{type:'text',id:'advId',label:E.id,setup:s,commit:v},{type:'select',id:'advLangDir',label:E.langDir,'default':'',style:'width:110px',items:[[D.notSet,''],[E.langDirLTR,'ltr'],[E.langDirRTL,'rtl']],setup:s,commit:v},{type:'text',id:'advAccessKey',width:'80px',label:E.acccessKey,maxLength:1,setup:s,commit:v}]},{type:'hbox',widths:['45%','35%','20%'],children:[{type:'text',label:E.name,id:'advName',setup:s,commit:v},{type:'text',label:E.langCode,id:'advLangCode',width:'110px','default':'',setup:s,commit:v},{type:'text',label:E.tabIndex,id:'advTabIndex',width:'80px',maxLength:5,setup:s,commit:v}]}]},{type:'vbox',padding:1,children:[{type:'hbox',widths:['45%','55%'],children:[{type:'text',label:E.advisoryTitle,'default':'',id:'advTitle',setup:s,commit:v},{type:'text',label:E.advisoryContentType,'default':'',id:'advContentType',setup:s,commit:v}]},{type:'hbox',widths:['45%','55%'],children:[{type:'text',label:E.cssClasses,'default':'',id:'advCSSClasses',setup:s,commit:v},{type:'text',label:E.charset,'default':'',id:'advCharset',setup:s,commit:v}]},{type:'hbox',widths:['45%','55%'],children:[{type:'text',label:E.rel,'default':'',id:'advRel',setup:s,commit:v},{type:'text',label:E.styles,'default':'',id:'advStyles',validate:CKEDITOR.dialog.validate.inlineStyle(a.lang.common.invalidInlineStyle),setup:s,commit:v}]}]}]}],onShow:function(){var F=this.getParentEditor(),G=F.getSelection(),H=null;
-if((H=b.getSelectedLink(F))&&H.hasAttribute('href'))G.selectElement(H);else H=null;this.setupContent(p.apply(this,[F,H]));},onOk:function(){var F={},G=[],H={},I=this,J=this.getParentEditor();this.commitContent(H);switch(H.type||'url'){case 'url':var K=H.url&&H.url.protocol!=undefined?H.url.protocol:'http://',L=H.url&&CKEDITOR.tools.trim(H.url.url)||'';F['data-cke-saved-href']=L.indexOf('/')===0?L:K+L;break;case 'anchor':var M=H.anchor&&H.anchor.name,N=H.anchor&&H.anchor.id;F['data-cke-saved-href']='#'+(M||N||'');break;case 'email':var O,P=H.email,Q=P.address;switch(y){case '':case 'encode':var R=encodeURIComponent(P.subject||''),S=encodeURIComponent(P.body||''),T=[];R&&T.push('subject='+R);S&&T.push('body='+S);T=T.length?'?'+T.join('&'):'';if(y=='encode'){O=["javascript:void(location.href='mailto:'+",B(Q)];T&&O.push("+'",x(T),"'");O.push(')');}else O=['mailto:',Q,T];break;default:var U=Q.split('@',2);P.name=U[0];P.domain=U[1];O=['javascript:',A(P)];}F['data-cke-saved-href']=O.join('');break;}if(H.target)if(H.target.type=='popup'){var V=["window.open(this.href, '",H.target.name||'',"', '"],W=['resizable','status','location','toolbar','menubar','fullscreen','scrollbars','dependent'],X=W.length,Y=function(ai){if(H.target[ai])W.push(ai+'='+H.target[ai]);};for(var Z=0;Z<X;Z++)W[Z]=W[Z]+(H.target[W[Z]]?'=yes':'=no');Y('width');Y('left');Y('height');Y('top');V.push(W.join(','),"'); return false;");F['data-cke-pa-onclick']=V.join('');G.push('target');}else{if(H.target.type!='notSet'&&H.target.name)F.target=H.target.name;else G.push('target');G.push('data-cke-pa-onclick','onclick');}if(H.adv){var aa=function(ai,aj){var ak=H.adv[ai];if(ak)F[aj]=ak;else G.push(aj);};aa('advId','id');aa('advLangDir','dir');aa('advAccessKey','accessKey');if(H.adv.advName)F.name=F['data-cke-saved-name']=H.adv.advName;else G=G.concat(['data-cke-saved-name','name']);aa('advLangCode','lang');aa('advTabIndex','tabindex');aa('advTitle','title');aa('advContentType','type');aa('advCSSClasses','class');aa('advCharset','charset');aa('advStyles','style');aa('advRel','rel');}var ab=J.getSelection();F.href=F['data-cke-saved-href'];if(!this._.selectedElement){var ac=ab.getRanges(true);if(ac.length==1&&ac[0].collapsed){var ad=new CKEDITOR.dom.text(H.type=='email'?H.email.address:F['data-cke-saved-href'],J.document);ac[0].insertNode(ad);ac[0].selectNodeContents(ad);ab.selectRanges(ac);}var ae=new CKEDITOR.style({element:'a',attributes:F});ae.type=CKEDITOR.STYLE_INLINE;ae.apply(J.document);}else{var af=this._.selectedElement,ag=af.data('cke-saved-href'),ah=af.getHtml();
-af.setAttributes(F);af.removeAttributes(G);if(H.adv&&H.adv.advName&&CKEDITOR.plugins.link.synAnchorSelector)af.addClass(af.getChildCount()?'cke_anchor':'cke_anchor_empty');if(ag==ah||H.type=='email'&&ah.indexOf('@')!=-1)af.setHtml(H.type=='email'?H.email.address:F['data-cke-saved-href']);ab.selectElement(af);delete this._.selectedElement;}},onLoad:function(){if(!a.config.linkShowAdvancedTab)this.hidePage('advanced');if(!a.config.linkShowTargetTab)this.hidePage('target');},onFocus:function(){var F=this.getContentElement('info','linkType'),G;if(F&&F.getValue()=='url'){G=this.getContentElement('info','url');G.select();}}};});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.dialog.add('link',function(a){var b=CKEDITOR.plugins.link,c=function(){var F=this.getDialog(),G=F.getContentElement('target','popupFeatures'),H=F.getContentElement('target','linkTargetName'),I=this.getValue();if(!G||!H)return;G=G.getElement();G.hide();H.setValue('');switch(I){case 'frame':H.setLabel(a.lang.link.targetFrameName);H.getElement().show();break;case 'popup':G.show();H.setLabel(a.lang.link.targetPopupName);H.getElement().show();break;default:H.setValue(I);H.getElement().hide();break;}},d=function(){var F=this.getDialog(),G=['urlOptions','anchorOptions','emailOptions'],H=this.getValue(),I=F.definition.getContents('upload'),J=I&&I.hidden;if(H=='url'){if(a.config.linkShowTargetTab)F.showPage('target');if(!J)F.showPage('upload');}else{F.hidePage('target');if(!J)F.hidePage('upload');}for(var K=0;K<G.length;K++){var L=F.getContentElement('info',G[K]);if(!L)continue;L=L.getElement().getParent().getParent();if(G[K]==H+'Options')L.show();else L.hide();}F.layout();},e=/^javascript:/,f=/^mailto:([^?]+)(?:\?(.+))?$/,g=/subject=([^;?:@&=$,\/]*)/,h=/body=([^;?:@&=$,\/]*)/,i=/^#(.*)$/,j=/^((?:http|https|ftp|news):\/\/)?(.*)$/,k=/^(_(?:self|top|parent|blank))$/,l=/^javascript:void\(location\.href='mailto:'\+String\.fromCharCode\(([^)]+)\)(?:\+'(.*)')?\)$/,m=/^javascript:([^(]+)\(([^)]+)\)$/,n=/\s*window.open\(\s*this\.href\s*,\s*(?:'([^']*)'|null)\s*,\s*'([^']*)'\s*\)\s*;\s*return\s*false;*\s*/,o=/(?:^|,)([^=]+)=(\d+|yes|no)/gi,p=function(F,G){var H=G&&(G.data('cke-saved-href')||G.getAttribute('href'))||'',I,J,K,L,M={};if(I=H.match(e))if(y=='encode')H=H.replace(l,function(ae,af,ag){return 'mailto:'+String.fromCharCode.apply(String,af.split(','))+(ag&&w(ag));});else if(y)H.replace(m,function(ae,af,ag){if(af==z.name){M.type='email';var ah=M.email={},ai=/[^,\s]+/g,aj=/(^')|('$)/g,ak=ag.match(ai),al=ak.length,am,an;for(var ao=0;ao<al;ao++){an=decodeURIComponent(w(ak[ao].replace(aj,'')));am=z.params[ao].toLowerCase();ah[am]=an;}ah.address=[ah.name,ah.domain].join('@');}});if(!M.type)if(K=H.match(i)){M.type='anchor';M.anchor={};M.anchor.name=M.anchor.id=K[1];}else if(J=H.match(f)){var N=H.match(g),O=H.match(h);M.type='email';var P=M.email={};P.address=J[1];N&&(P.subject=decodeURIComponent(N[1]));O&&(P.body=decodeURIComponent(O[1]));}else if(H&&(L=H.match(j))){M.type='url';M.url={};M.url.protocol=L[1];M.url.url=L[2];}else M.type='url';if(G){var Q=G.getAttribute('target');M.target={};M.adv={};if(!Q){var R=G.data('cke-pa-onclick')||G.getAttribute('onclick'),S=R&&R.match(n);
+if(S){M.target.type='popup';M.target.name=S[1];var T;while(T=o.exec(S[2])){if((T[2]=='yes'||T[2]=='1')&&!(T[1] in {height:1,width:1,top:1,left:1}))M.target[T[1]]=true;else if(isFinite(T[2]))M.target[T[1]]=T[2];}}}else{var U=Q.match(k);if(U)M.target.type=M.target.name=Q;else{M.target.type='frame';M.target.name=Q;}}var V=this,W=function(ae,af){var ag=G.getAttribute(af);if(ag!==null)M.adv[ae]=ag||'';};W('advId','id');W('advLangDir','dir');W('advAccessKey','accessKey');M.adv.advName=G.data('cke-saved-name')||G.getAttribute('name')||'';W('advLangCode','lang');W('advTabIndex','tabindex');W('advTitle','title');W('advContentType','type');CKEDITOR.plugins.link.synAnchorSelector?M.adv.advCSSClasses=C(G):W('advCSSClasses','class');W('advCharset','charset');W('advStyles','style');W('advRel','rel');}var X=M.anchors=[],Y,Z,aa;if(CKEDITOR.plugins.link.emptyAnchorFix){var ab=F.document.getElementsByTag('a');for(Y=0,Z=ab.count();Y<Z;Y++){aa=ab.getItem(Y);if(aa.data('cke-saved-name')||aa.hasAttribute('name'))X.push({name:aa.data('cke-saved-name')||aa.getAttribute('name'),id:aa.getAttribute('id')});}}else{var ac=new CKEDITOR.dom.nodeList(F.document.$.anchors);for(Y=0,Z=ac.count();Y<Z;Y++){aa=ac.getItem(Y);X[Y]={name:aa.getAttribute('name'),id:aa.getAttribute('id')};}}if(CKEDITOR.plugins.link.fakeAnchor){var ad=F.document.getElementsByTag('img');for(Y=0,Z=ad.count();Y<Z;Y++){if(aa=CKEDITOR.plugins.link.tryRestoreFakeAnchor(F,ad.getItem(Y)))X.push({name:aa.getAttribute('name'),id:aa.getAttribute('id')});}}this._.selectedElement=G;return M;},q=function(F,G){if(G[F])this.setValue(G[F][this.id]||'');},r=function(F){return q.call(this,'target',F);},s=function(F){return q.call(this,'adv',F);},t=function(F,G){if(!G[F])G[F]={};G[F][this.id]=this.getValue()||'';},u=function(F){return t.call(this,'target',F);},v=function(F){return t.call(this,'adv',F);};function w(F){return F.replace(/\\'/g,"'");};function x(F){return F.replace(/'/g,'\\$&');};var y=a.config.emailProtection||'';if(y&&y!='encode'){var z={};y.replace(/^([^(]+)\(([^)]+)\)$/,function(F,G,H){z.name=G;z.params=[];H.replace(/[^,\s]+/g,function(I){z.params.push(I);});});}function A(F){var G,H=z.name,I=z.params,J,K;G=[H,'('];for(var L=0;L<I.length;L++){J=I[L].toLowerCase();K=F[J];L>0&&G.push(',');G.push("'",K?x(encodeURIComponent(F[J])):'',"'");}G.push(')');return G.join('');};function B(F){var G,H=F.length,I=[];for(var J=0;J<H;J++){G=F.charCodeAt(J);I.push(G);}return 'String.fromCharCode('+I.join(',')+')';};function C(F){var G=F.getAttribute('class');
+return G?G.replace(/\s*(?:cke_anchor_empty|cke_anchor)(?:\s*$)?/g,''):'';};var D=a.lang.common,E=a.lang.link;return{title:E.title,minWidth:350,minHeight:230,contents:[{id:'info',label:E.info,title:E.info,elements:[{id:'linkType',type:'select',label:E.type,'default':'url',items:[[E.toUrl,'url'],[E.toAnchor,'anchor'],[E.toEmail,'email']],onChange:d,setup:function(F){if(F.type)this.setValue(F.type);},commit:function(F){F.type=this.getValue();}},{type:'vbox',id:'urlOptions',children:[{type:'hbox',widths:['25%','75%'],children:[{id:'protocol',type:'select',label:D.protocol,'default':'http://',items:[['http://','http://'],['https://','https://'],['ftp://','ftp://'],['news://','news://'],[E.other,'']],setup:function(F){if(F.url)this.setValue(F.url.protocol||'');},commit:function(F){if(!F.url)F.url={};F.url.protocol=this.getValue();}},{type:'text',id:'url',label:D.url,required:true,onLoad:function(){this.allowOnChange=true;},onKeyUp:function(){var K=this;K.allowOnChange=false;var F=K.getDialog().getContentElement('info','protocol'),G=K.getValue(),H=/^(http|https|ftp|news):\/\/(?=.)/i,I=/^((javascript:)|[#\/\.\?])/i,J=H.exec(G);if(J){K.setValue(G.substr(J[0].length));F.setValue(J[0].toLowerCase());}else if(I.test(G))F.setValue('');K.allowOnChange=true;},onChange:function(){if(this.allowOnChange)this.onKeyUp();},validate:function(){var F=this.getDialog();if(F.getContentElement('info','linkType')&&F.getValueOf('info','linkType')!='url')return true;if(this.getDialog().fakeObj)return true;var G=CKEDITOR.dialog.validate.notEmpty(E.noUrl);return G.apply(this);},setup:function(F){this.allowOnChange=false;if(F.url)this.setValue(F.url.url);this.allowOnChange=true;},commit:function(F){this.onChange();if(!F.url)F.url={};F.url.url=this.getValue();this.allowOnChange=false;}}],setup:function(F){if(!this.getDialog().getContentElement('info','linkType'))this.getElement().show();}},{type:'button',id:'browse',hidden:'true',filebrowser:'info:url',label:D.browseServer}]},{type:'vbox',id:'anchorOptions',width:260,align:'center',padding:0,children:[{type:'fieldset',id:'selectAnchorText',label:E.selectAnchor,setup:function(F){if(F.anchors.length>0)this.getElement().show();else this.getElement().hide();},children:[{type:'hbox',id:'selectAnchor',children:[{type:'select',id:'anchorName','default':'',label:E.anchorName,style:'width: 100%;',items:[['']],setup:function(F){var I=this;I.clear();I.add('');for(var G=0;G<F.anchors.length;G++){if(F.anchors[G].name)I.add(F.anchors[G].name);}if(F.anchor)I.setValue(F.anchor.name);
+var H=I.getDialog().getContentElement('info','linkType');if(H&&H.getValue()=='email')I.focus();},commit:function(F){if(!F.anchor)F.anchor={};F.anchor.name=this.getValue();}},{type:'select',id:'anchorId','default':'',label:E.anchorId,style:'width: 100%;',items:[['']],setup:function(F){var H=this;H.clear();H.add('');for(var G=0;G<F.anchors.length;G++){if(F.anchors[G].id)H.add(F.anchors[G].id);}if(F.anchor)H.setValue(F.anchor.id);},commit:function(F){if(!F.anchor)F.anchor={};F.anchor.id=this.getValue();}}],setup:function(F){if(F.anchors.length>0)this.getElement().show();else this.getElement().hide();}}]},{type:'html',id:'noAnchors',style:'text-align: center;',html:'<div role="note" tabIndex="-1">'+CKEDITOR.tools.htmlEncode(E.noAnchors)+'</div>',focus:true,setup:function(F){if(F.anchors.length<1)this.getElement().show();else this.getElement().hide();}}],setup:function(F){if(!this.getDialog().getContentElement('info','linkType'))this.getElement().hide();}},{type:'vbox',id:'emailOptions',padding:1,children:[{type:'text',id:'emailAddress',label:E.emailAddress,required:true,validate:function(){var F=this.getDialog();if(!F.getContentElement('info','linkType')||F.getValueOf('info','linkType')!='email')return true;var G=CKEDITOR.dialog.validate.notEmpty(E.noEmail);return G.apply(this);},setup:function(F){if(F.email)this.setValue(F.email.address);var G=this.getDialog().getContentElement('info','linkType');if(G&&G.getValue()=='email')this.select();},commit:function(F){if(!F.email)F.email={};F.email.address=this.getValue();}},{type:'text',id:'emailSubject',label:E.emailSubject,setup:function(F){if(F.email)this.setValue(F.email.subject);},commit:function(F){if(!F.email)F.email={};F.email.subject=this.getValue();}},{type:'textarea',id:'emailBody',label:E.emailBody,rows:3,'default':'',setup:function(F){if(F.email)this.setValue(F.email.body);},commit:function(F){if(!F.email)F.email={};F.email.body=this.getValue();}}],setup:function(F){if(!this.getDialog().getContentElement('info','linkType'))this.getElement().hide();}}]},{id:'target',label:E.target,title:E.target,elements:[{type:'hbox',widths:['50%','50%'],children:[{type:'select',id:'linkTargetType',label:D.target,'default':'notSet',style:'width : 100%;',items:[[D.notSet,'notSet'],[E.targetFrame,'frame'],[E.targetPopup,'popup'],[D.targetNew,'_blank'],[D.targetTop,'_top'],[D.targetSelf,'_self'],[D.targetParent,'_parent']],onChange:c,setup:function(F){if(F.target)this.setValue(F.target.type||'notSet');c.call(this);},commit:function(F){if(!F.target)F.target={};
+F.target.type=this.getValue();}},{type:'text',id:'linkTargetName',label:E.targetFrameName,'default':'',setup:function(F){if(F.target)this.setValue(F.target.name);},commit:function(F){if(!F.target)F.target={};F.target.name=this.getValue().replace(/\W/gi,'');}}]},{type:'vbox',width:'100%',align:'center',padding:2,id:'popupFeatures',children:[{type:'fieldset',label:E.popupFeatures,children:[{type:'hbox',children:[{type:'checkbox',id:'resizable',label:E.popupResizable,setup:r,commit:u},{type:'checkbox',id:'status',label:E.popupStatusBar,setup:r,commit:u}]},{type:'hbox',children:[{type:'checkbox',id:'location',label:E.popupLocationBar,setup:r,commit:u},{type:'checkbox',id:'toolbar',label:E.popupToolbar,setup:r,commit:u}]},{type:'hbox',children:[{type:'checkbox',id:'menubar',label:E.popupMenuBar,setup:r,commit:u},{type:'checkbox',id:'fullscreen',label:E.popupFullScreen,setup:r,commit:u}]},{type:'hbox',children:[{type:'checkbox',id:'scrollbars',label:E.popupScrollBars,setup:r,commit:u},{type:'checkbox',id:'dependent',label:E.popupDependent,setup:r,commit:u}]},{type:'hbox',children:[{type:'text',widths:['50%','50%'],labelLayout:'horizontal',label:D.width,id:'width',setup:r,commit:u},{type:'text',labelLayout:'horizontal',widths:['50%','50%'],label:E.popupLeft,id:'left',setup:r,commit:u}]},{type:'hbox',children:[{type:'text',labelLayout:'horizontal',widths:['50%','50%'],label:D.height,id:'height',setup:r,commit:u},{type:'text',labelLayout:'horizontal',label:E.popupTop,widths:['50%','50%'],id:'top',setup:r,commit:u}]}]}]}]},{id:'upload',label:E.upload,title:E.upload,hidden:true,filebrowser:'uploadButton',elements:[{type:'file',id:'upload',label:D.upload,style:'height:40px',size:29},{type:'fileButton',id:'uploadButton',label:D.uploadSubmit,filebrowser:'info:url','for':['upload','upload']}]},{id:'advanced',label:E.advanced,title:E.advanced,elements:[{type:'vbox',padding:1,children:[{type:'hbox',widths:['45%','35%','20%'],children:[{type:'text',id:'advId',label:E.id,setup:s,commit:v},{type:'select',id:'advLangDir',label:E.langDir,'default':'',style:'width:110px',items:[[D.notSet,''],[E.langDirLTR,'ltr'],[E.langDirRTL,'rtl']],setup:s,commit:v},{type:'text',id:'advAccessKey',width:'80px',label:E.acccessKey,maxLength:1,setup:s,commit:v}]},{type:'hbox',widths:['45%','35%','20%'],children:[{type:'text',label:E.name,id:'advName',setup:s,commit:v},{type:'text',label:E.langCode,id:'advLangCode',width:'110px','default':'',setup:s,commit:v},{type:'text',label:E.tabIndex,id:'advTabIndex',width:'80px',maxLength:5,setup:s,commit:v}]}]},{type:'vbox',padding:1,children:[{type:'hbox',widths:['45%','55%'],children:[{type:'text',label:E.advisoryTitle,'default':'',id:'advTitle',setup:s,commit:v},{type:'text',label:E.advisoryContentType,'default':'',id:'advContentType',setup:s,commit:v}]},{type:'hbox',widths:['45%','55%'],children:[{type:'text',label:E.cssClasses,'default':'',id:'advCSSClasses',setup:s,commit:v},{type:'text',label:E.charset,'default':'',id:'advCharset',setup:s,commit:v}]},{type:'hbox',widths:['45%','55%'],children:[{type:'text',label:E.rel,'default':'',id:'advRel',setup:s,commit:v},{type:'text',label:E.styles,'default':'',id:'advStyles',validate:CKEDITOR.dialog.validate.inlineStyle(a.lang.common.invalidInlineStyle),setup:s,commit:v}]}]}]}],onShow:function(){var F=this.getParentEditor(),G=F.getSelection(),H=null;
+if((H=b.getSelectedLink(F))&&H.hasAttribute('href'))G.selectElement(H);else H=null;this.setupContent(p.apply(this,[F,H]));},onOk:function(){var F={},G=[],H={},I=this,J=this.getParentEditor();this.commitContent(H);switch(H.type||'url'){case 'url':var K=H.url&&H.url.protocol!=undefined?H.url.protocol:'http://',L=H.url&&CKEDITOR.tools.trim(H.url.url)||'';F['data-cke-saved-href']=L.indexOf('/')===0?L:K+L;break;case 'anchor':var M=H.anchor&&H.anchor.name,N=H.anchor&&H.anchor.id;F['data-cke-saved-href']='#'+(M||N||'');break;case 'email':var O,P=H.email,Q=P.address;switch(y){case '':case 'encode':var R=encodeURIComponent(P.subject||''),S=encodeURIComponent(P.body||''),T=[];R&&T.push('subject='+R);S&&T.push('body='+S);T=T.length?'?'+T.join('&'):'';if(y=='encode'){O=["javascript:void(location.href='mailto:'+",B(Q)];T&&O.push("+'",x(T),"'");O.push(')');}else O=['mailto:',Q,T];break;default:var U=Q.split('@',2);P.name=U[0];P.domain=U[1];O=['javascript:',A(P)];}F['data-cke-saved-href']=O.join('');break;}if(H.target)if(H.target.type=='popup'){var V=["window.open(this.href, '",H.target.name||'',"', '"],W=['resizable','status','location','toolbar','menubar','fullscreen','scrollbars','dependent'],X=W.length,Y=function(ai){if(H.target[ai])W.push(ai+'='+H.target[ai]);};for(var Z=0;Z<X;Z++)W[Z]=W[Z]+(H.target[W[Z]]?'=yes':'=no');Y('width');Y('left');Y('height');Y('top');V.push(W.join(','),"'); return false;");F['data-cke-pa-onclick']=V.join('');G.push('target');}else{if(H.target.type!='notSet'&&H.target.name)F.target=H.target.name;else G.push('target');G.push('data-cke-pa-onclick','onclick');}if(H.adv){var aa=function(ai,aj){var ak=H.adv[ai];if(ak)F[aj]=ak;else G.push(aj);};aa('advId','id');aa('advLangDir','dir');aa('advAccessKey','accessKey');if(H.adv.advName)F.name=F['data-cke-saved-name']=H.adv.advName;else G=G.concat(['data-cke-saved-name','name']);aa('advLangCode','lang');aa('advTabIndex','tabindex');aa('advTitle','title');aa('advContentType','type');aa('advCSSClasses','class');aa('advCharset','charset');aa('advStyles','style');aa('advRel','rel');}var ab=J.getSelection();F.href=F['data-cke-saved-href'];if(!this._.selectedElement){var ac=ab.getRanges(true);if(ac.length==1&&ac[0].collapsed){var ad=new CKEDITOR.dom.text(H.type=='email'?H.email.address:F['data-cke-saved-href'],J.document);ac[0].insertNode(ad);ac[0].selectNodeContents(ad);ab.selectRanges(ac);}var ae=new CKEDITOR.style({element:'a',attributes:F});ae.type=CKEDITOR.STYLE_INLINE;ae.apply(J.document);}else{var af=this._.selectedElement,ag=af.data('cke-saved-href'),ah=af.getHtml();
+af.setAttributes(F);af.removeAttributes(G);if(H.adv&&H.adv.advName&&CKEDITOR.plugins.link.synAnchorSelector)af.addClass(af.getChildCount()?'cke_anchor':'cke_anchor_empty');if(ag==ah||H.type=='email'&&ah.indexOf('@')!=-1)af.setHtml(H.type=='email'?H.email.address:F['data-cke-saved-href']);ab.selectElement(af);delete this._.selectedElement;}},onLoad:function(){if(!a.config.linkShowAdvancedTab)this.hidePage('advanced');if(!a.config.linkShowTargetTab)this.hidePage('target');},onFocus:function(){var F=this.getContentElement('info','linkType'),G;if(F&&F.getValue()=='url'){G=this.getContentElement('info','url');G.select();}}};});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/liststyle/dialogs/liststyle.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/liststyle/dialogs/liststyle.js
index 5bf1c7f..b98faa2 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/liststyle/dialogs/liststyle.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/liststyle/dialogs/liststyle.js
@@ -1,7 +1,7 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-(function(){function a(e,f){var g;try{g=e.getSelection().getRanges()[0];}catch(h){return null;}g.shrink(CKEDITOR.SHRINK_TEXT);return g.getCommonAncestor().getAscendant(f,1);};var b=function(e){return e.type==CKEDITOR.NODE_ELEMENT&&e.is('li');},c={a:'lower-alpha',A:'upper-alpha',i:'lower-roman',I:'upper-roman',1:'decimal',disc:'disc',circle:'circle',square:'square'};function d(e,f){var g=e.lang.list;if(f=='bulletedListStyle')return{title:g.bulletedTitle,minWidth:300,minHeight:50,contents:[{id:'info',accessKey:'I',elements:[{type:'select',label:g.type,id:'type',align:'center',style:'width:150px',items:[[g.notset,''],[g.circle,'circle'],[g.disc,'disc'],[g.square,'square']],setup:function(i){var j=i.getStyle('list-style-type')||c[i.getAttribute('type')]||i.getAttribute('type')||'';this.setValue(j);},commit:function(i){var j=this.getValue();if(j)i.setStyle('list-style-type',j);else i.removeStyle('list-style-type');}}]}],onShow:function(){var i=this.getParentEditor(),j=a(i,'ul');j&&this.setupContent(j);},onOk:function(){var i=this.getParentEditor(),j=a(i,'ul');j&&this.commitContent(j);}};else if(f=='numberedListStyle'){var h=[[g.notset,''],[g.lowerRoman,'lower-roman'],[g.upperRoman,'upper-roman'],[g.lowerAlpha,'lower-alpha'],[g.upperAlpha,'upper-alpha'],[g.decimal,'decimal']];if(!CKEDITOR.env.ie||CKEDITOR.env.version>7)h.concat([[g.armenian,'armenian'],[g.decimalLeadingZero,'decimal-leading-zero'],[g.georgian,'georgian'],[g.lowerGreek,'lower-greek']]);return{title:g.numberedTitle,minWidth:300,minHeight:50,contents:[{id:'info',accessKey:'I',elements:[{type:'hbox',widths:['25%','75%'],children:[{label:g.start,type:'text',id:'start',validate:CKEDITOR.dialog.validate.integer(g.validateStartNumber),setup:function(i){var j=i.getFirst(b).getAttribute('value')||i.getAttribute('start')||1;j&&this.setValue(j);},commit:function(i){var j=i.getFirst(b),k=j.getAttribute('value')||i.getAttribute('start')||1;i.getFirst(b).removeAttribute('value');var l=parseInt(this.getValue(),10);if(isNaN(l))i.removeAttribute('start');else i.setAttribute('start',l);var m=j,n=k,o=isNaN(l)?1:l;while((m=m.getNext(b))&&n++){if(m.getAttribute('value')==n)m.setAttribute('value',o+n-k);}}},{type:'select',label:g.type,id:'type',style:'width: 100%;',items:h,setup:function(i){var j=i.getStyle('list-style-type')||c[i.getAttribute('type')]||i.getAttribute('type')||'';this.setValue(j);},commit:function(i){var j=this.getValue();if(j)i.setStyle('list-style-type',j);else i.removeStyle('list-style-type');}}]}]}],onShow:function(){var i=this.getParentEditor(),j=a(i,'ol');
-j&&this.setupContent(j);},onOk:function(){var i=this.getParentEditor(),j=a(i,'ol');j&&this.commitContent(j);}};}};CKEDITOR.dialog.add('numberedListStyle',function(e){return d(e,'numberedListStyle');});CKEDITOR.dialog.add('bulletedListStyle',function(e){return d(e,'bulletedListStyle');});})();
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function(){function a(e,f){var g;try{g=e.getSelection().getRanges()[0];}catch(h){return null;}g.shrink(CKEDITOR.SHRINK_TEXT);return g.getCommonAncestor().getAscendant(f,1);};var b=function(e){return e.type==CKEDITOR.NODE_ELEMENT&&e.is('li');},c={a:'lower-alpha',A:'upper-alpha',i:'lower-roman',I:'upper-roman',1:'decimal',disc:'disc',circle:'circle',square:'square'};function d(e,f){var g=e.lang.list;if(f=='bulletedListStyle')return{title:g.bulletedTitle,minWidth:300,minHeight:50,contents:[{id:'info',accessKey:'I',elements:[{type:'select',label:g.type,id:'type',align:'center',style:'width:150px',items:[[g.notset,''],[g.circle,'circle'],[g.disc,'disc'],[g.square,'square']],setup:function(i){var j=i.getStyle('list-style-type')||c[i.getAttribute('type')]||i.getAttribute('type')||'';this.setValue(j);},commit:function(i){var j=this.getValue();if(j)i.setStyle('list-style-type',j);else i.removeStyle('list-style-type');}}]}],onShow:function(){var i=this.getParentEditor(),j=a(i,'ul');j&&this.setupContent(j);},onOk:function(){var i=this.getParentEditor(),j=a(i,'ul');j&&this.commitContent(j);}};else if(f=='numberedListStyle'){var h=[[g.notset,''],[g.lowerRoman,'lower-roman'],[g.upperRoman,'upper-roman'],[g.lowerAlpha,'lower-alpha'],[g.upperAlpha,'upper-alpha'],[g.decimal,'decimal']];if(!CKEDITOR.env.ie||CKEDITOR.env.version>7)h.concat([[g.armenian,'armenian'],[g.decimalLeadingZero,'decimal-leading-zero'],[g.georgian,'georgian'],[g.lowerGreek,'lower-greek']]);return{title:g.numberedTitle,minWidth:300,minHeight:50,contents:[{id:'info',accessKey:'I',elements:[{type:'hbox',widths:['25%','75%'],children:[{label:g.start,type:'text',id:'start',validate:CKEDITOR.dialog.validate.integer(g.validateStartNumber),setup:function(i){var j=i.getFirst(b).getAttribute('value')||i.getAttribute('start')||1;j&&this.setValue(j);},commit:function(i){var j=i.getFirst(b),k=j.getAttribute('value')||i.getAttribute('start')||1;i.getFirst(b).removeAttribute('value');var l=parseInt(this.getValue(),10);if(isNaN(l))i.removeAttribute('start');else i.setAttribute('start',l);var m=j,n=k,o=isNaN(l)?1:l;while((m=m.getNext(b))&&n++){if(m.getAttribute('value')==n)m.setAttribute('value',o+n-k);}}},{type:'select',label:g.type,id:'type',style:'width: 100%;',items:h,setup:function(i){var j=i.getStyle('list-style-type')||c[i.getAttribute('type')]||i.getAttribute('type')||'';this.setValue(j);},commit:function(i){var j=this.getValue();if(j)i.setStyle('list-style-type',j);else i.removeStyle('list-style-type');}}]}]}],onShow:function(){var i=this.getParentEditor(),j=a(i,'ol');
+j&&this.setupContent(j);},onOk:function(){var i=this.getParentEditor(),j=a(i,'ol');j&&this.commitContent(j);}};}};CKEDITOR.dialog.add('numberedListStyle',function(e){return d(e,'numberedListStyle');});CKEDITOR.dialog.add('bulletedListStyle',function(e){return d(e,'bulletedListStyle');});})();
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/pastefromword/filter/default.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/pastefromword/filter/default.js
index e424034..4a61457 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/pastefromword/filter/default.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/pastefromword/filter/default.js
@@ -1,11 +1,11 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-(function(){var a=CKEDITOR.htmlParser.fragment.prototype,b=CKEDITOR.htmlParser.element.prototype;a.onlyChild=b.onlyChild=function(){var u=this.children,v=u.length,w=v==1&&u[0];return w||null;};b.removeAnyChildWithName=function(u){var v=this.children,w=[],x;for(var y=0;y<v.length;y++){x=v[y];if(!x.name)continue;if(x.name==u){w.push(x);v.splice(y--,1);}w=w.concat(x.removeAnyChildWithName(u));}return w;};b.getAncestor=function(u){var v=this.parent;while(v&&!(v.name&&v.name.match(u)))v=v.parent;return v;};a.firstChild=b.firstChild=function(u){var v;for(var w=0;w<this.children.length;w++){v=this.children[w];if(u(v))return v;else if(v.name){v=v.firstChild(u);if(v)return v;}}return null;};b.addStyle=function(u,v,w){var A=this;var x,y='';if(typeof v=='string')y+=u+':'+v+';';else{if(typeof u=='object')for(var z in u){if(u.hasOwnProperty(z))y+=z+':'+u[z]+';';}else y+=u;w=v;}if(!A.attributes)A.attributes={};x=A.attributes.style||'';x=(w?[y,x]:[x,y]).join(';');A.attributes.style=x.replace(/^;|;(?=;)/,'');};CKEDITOR.dtd.parentOf=function(u){var v={};for(var w in this){if(w.indexOf('$')==-1&&this[w][u])v[w]=1;}return v;};function c(u){var v=u.children,w,x,y=u.children.length,z,A,B=/list-style-type:(.*?)(?:;|$)/,C=CKEDITOR.plugins.pastefromword.filters.stylesFilter;x=u.attributes;if(B.exec(x.style))return;for(var D=0;D<y;D++){w=v[D];if(w.attributes.value&&Number(w.attributes.value)==D+1)delete w.attributes.value;z=B.exec(w.attributes.style);if(z)if(z[1]==A||!A)A=z[1];else{A=null;break;}}if(A){for(D=0;D<y;D++){x=v[D].attributes;x.style&&(x.style=C([['list-style-type']])(x.style)||'');}u.addStyle('list-style-type',A);}};var d=/^([.\d]*)+(em|ex|px|gd|rem|vw|vh|vm|ch|mm|cm|in|pt|pc|deg|rad|ms|s|hz|khz){1}?/i,e=/^(?:\b0[^\s]*\s*){1,4}$/,f='^m{0,4}(cm|cd|d?c{0,3})(xc|xl|l?x{0,3})(ix|iv|v?i{0,3})$',g=new RegExp(f),h=new RegExp(f.toUpperCase()),i={decimal:/\d+/,'lower-roman':g,'upper-roman':h,'lower-alpha':/^[a-z]+$/,'upper-alpha':/^[A-Z]+$/},j={disc:/[l\u00B7\u2002]/,circle:/[\u006F\u00D8]/,square:/[\u006E\u25C6]/},k={ol:i,ul:j},l=[[1000,'M'],[900,'CM'],[500,'D'],[400,'CD'],[100,'C'],[90,'XC'],[50,'L'],[40,'XL'],[10,'X'],[9,'IX'],[5,'V'],[4,'IV'],[1,'I']],m='ABCDEFGHIJKLMNOPQRSTUVWXYZ';function n(u){u=u.toUpperCase();var v=l.length,w=0;for(var x=0;x<v;++x)for(var y=l[x],z=y[1].length;u.substr(0,z)==y[1];u=u.substr(z))w+=y[0];return w;};function o(u){u=u.toUpperCase();var v=m.length,w=1;for(var x=1;u.length>0;x*=v){w+=m.indexOf(u.charAt(u.length-1))*x;u=u.substr(0,u.length-1);}return w;
-};var p=0,q=null,r,s=CKEDITOR.plugins.pastefromword={utils:{createListBulletMarker:function(u,v){var w=new CKEDITOR.htmlParser.element('cke:listbullet');w.attributes={'cke:listsymbol':u[0]};w.add(new CKEDITOR.htmlParser.text(v));return w;},isListBulletIndicator:function(u){var v=u.attributes&&u.attributes.style;if(/mso-list\s*:\s*Ignore/i.test(v))return true;},isContainingOnlySpaces:function(u){var v;return(v=u.onlyChild())&&/^(:?\s| )+$/.test(v.value);},resolveList:function(u){var v=u.attributes,w;if((w=u.removeAnyChildWithName('cke:listbullet'))&&w.length&&(w=w[0])){u.name='cke:li';if(v.style)v.style=s.filters.stylesFilter([['text-indent'],['line-height'],[/^margin(:?-left)?$/,null,function(x){var y=x.split(' ');x=CKEDITOR.tools.convertToPx(y[3]||y[1]||y[0]);if(!p&&q!==null&&x>q)p=x-q;q=x;v['cke:indent']=p&&Math.ceil(x/p)+1||1;}],[/^mso-list$/,null,function(x){x=x.split(' ');var y=Number(x[0].match(/\d+/)),z=Number(x[1].match(/\d+/));if(z==1){y!==r&&(v['cke:reset']=1);r=y;}v['cke:indent']=z;}]])(v.style,u)||'';if(!v['cke:indent']){q=0;v['cke:indent']=1;}CKEDITOR.tools.extend(v,w.attributes);return true;}else r=q=p=null;return false;},getStyleComponents:(function(){var u=CKEDITOR.dom.element.createFromHtml('<div style="position:absolute;left:-9999px;top:-9999px;"></div>',CKEDITOR.document);CKEDITOR.document.getBody().append(u);return function(v,w,x){u.setStyle(v,w);var y={},z=x.length;for(var A=0;A<z;A++)y[x[A]]=u.getStyle(x[A]);return y;};})(),listDtdParents:CKEDITOR.dtd.parentOf('ol')},filters:{flattenList:function(u,v){v=typeof v=='number'?v:1;var w=u.attributes,x;switch(w.type){case 'a':x='lower-alpha';break;case '1':x='decimal';break;}var y=u.children,z;for(var A=0;A<y.length;A++){z=y[A];if(z.name in CKEDITOR.dtd.$listItem){var B=z.attributes,C=z.children,D=C.length,E=C[D-1];if(E.name in CKEDITOR.dtd.$list){u.add(E,A+1);if(!--C.length)y.splice(A--,1);}z.name='cke:li';w.start&&!A&&(B.value=w.start);s.filters.stylesFilter([['tab-stops',null,function(H){var I=H.split(' ')[1].match(d);I&&(q=CKEDITOR.tools.convertToPx(I[0]));}],v==1?['mso-list',null,function(H){H=H.split(' ');var I=Number(H[0].match(/\d+/));I!==r&&(B['cke:reset']=1);r=I;}]:null])(B.style);B['cke:indent']=v;B['cke:listtype']=u.name;B['cke:list-style-type']=x;}else if(z.name in CKEDITOR.dtd.$list){arguments.callee.apply(this,[z,v+1]);y=y.slice(0,A).concat(z.children).concat(y.slice(A+1));u.children=[];for(var F=0,G=y.length;F<G;F++)u.add(y[F]);}}delete u.name;w['cke:list']=1;},assembleList:function(u){var v=u.children,w,x,y,z,A,B,C,D=[],E,F,G,H,I,J;
-for(var K=0;K<v.length;K++){w=v[K];if('cke:li'==w.name){w.name='li';x=w;y=x.attributes;G=y['cke:listsymbol'];G=G&&G.match(/^(?:[(]?)([^\s]+?)([.)]?)$/);H=I=J=null;if(y['cke:ignored']){v.splice(K--,1);continue;}y['cke:reset']&&(C=A=B=null);z=Number(y['cke:indent']);if(z!=A)F=E=null;if(!G){H=y['cke:listtype']||'ol';I=y['cke:list-style-type'];}else{if(F&&k[F][E].test(G[1])){H=F;I=E;}else for(var L in k)for(var M in k[L]){if(k[L][M].test(G[1]))if(L=='ol'&&/alpha|roman/.test(M)){var N=/roman/.test(M)?n(G[1]):o(G[1]);if(!J||N<J){J=N;H=L;I=M;}}else{H=L;I=M;break;}}!H&&(H=G[2]?'ol':'ul');}F=H;E=I||(H=='ol'?'decimal':'disc');if(I&&I!=(H=='ol'?'decimal':'disc'))x.addStyle('list-style-type',I);if(H=='ol'&&G){switch(I){case 'decimal':J=Number(G[1]);break;case 'lower-roman':case 'upper-roman':J=n(G[1]);break;case 'lower-alpha':case 'upper-alpha':J=o(G[1]);break;}x.attributes.value=J;}if(!C){D.push(C=new CKEDITOR.htmlParser.element(H));C.add(x);v[K]=C;}else{if(z>A){D.push(C=new CKEDITOR.htmlParser.element(H));C.add(x);B.add(C);}else if(z<A){var O=A-z,P;while(O--&&(P=C.parent))C=P.parent;C.add(x);}else C.add(x);v.splice(K--,1);}B=x;A=z;}else if(C)C=A=B=null;}for(K=0;K<D.length;K++)c(D[K]);C=A=B=r=q=p=null;},falsyFilter:function(u){return false;},stylesFilter:function(u,v){return function(w,x){var y=[];(w||'').replace(/"/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(A,B,C){B=B.toLowerCase();B=='font-family'&&(C=C.replace(/["']/g,''));var D,E,F,G;for(var H=0;H<u.length;H++){if(u[H]){D=u[H][0];E=u[H][1];F=u[H][2];G=u[H][3];if(B.match(D)&&(!E||C.match(E))){B=G||B;v&&(F=F||C);if(typeof F=='function')F=F(C,x,B);if(F&&F.push)B=F[0],F=F[1];if(typeof F=='string')y.push([B,F]);return;}}}!v&&y.push([B,C]);});for(var z=0;z<y.length;z++)y[z]=y[z].join(':');return y.length?y.join(';')+';':false;};},elementMigrateFilter:function(u,v){return function(w){var x=v?new CKEDITOR.style(u,v)._.definition:u;w.name=x.element;CKEDITOR.tools.extend(w.attributes,CKEDITOR.tools.clone(x.attributes));w.addStyle(CKEDITOR.style.getStyleText(x));};},styleMigrateFilter:function(u,v){var w=this.elementMigrateFilter;return function(x,y){var z=new CKEDITOR.htmlParser.element(null),A={};A[v]=x;w(u,A)(z);z.children=y.children;y.children=[z];};},bogusAttrFilter:function(u,v){if(v.name.indexOf('cke:')==-1)return false;},applyStyleFilter:null},getRules:function(u){var v=CKEDITOR.dtd,w=CKEDITOR.tools.extend({},v.$block,v.$listItem,v.$tableContent),x=u.config,y=this.filters,z=y.falsyFilter,A=y.stylesFilter,B=y.elementMigrateFilter,C=CKEDITOR.tools.bind(this.filters.styleMigrateFilter,this.filters),D=this.utils.createListBulletMarker,E=y.flattenList,F=y.assembleList,G=this.utils.isListBulletIndicator,H=this.utils.isContainingOnlySpaces,I=this.utils.resolveList,J=function(O){O=CKEDITOR.tools.convertToPx(O);
-return isNaN(O)?O:O+'px';},K=this.utils.getStyleComponents,L=this.utils.listDtdParents,M=x.pasteFromWordRemoveFontStyles!==false,N=x.pasteFromWordRemoveStyles!==false;return{elementNames:[[/meta|link|script/,'']],root:function(O){O.filterChildren();F(O);},elements:{'^':function(O){var P;if(CKEDITOR.env.gecko&&(P=y.applyStyleFilter))P(O);},$:function(O){var P=O.name||'',Q=O.attributes;if(P in w&&Q.style)Q.style=A([[/^(:?width|height)$/,null,J]])(Q.style)||'';if(P.match(/h\d/)){O.filterChildren();if(I(O))return;B(x['format_'+P])(O);}else if(P in v.$inline){O.filterChildren();if(H(O))delete O.name;}else if(P.indexOf(':')!=-1&&P.indexOf('cke')==-1){O.filterChildren();if(P=='v:imagedata'){var R=O.attributes['o:href'];if(R)O.attributes.src=R;O.name='img';return;}delete O.name;}if(P in L){O.filterChildren();F(O);}},style:function(O){if(CKEDITOR.env.gecko){var P=O.onlyChild().value.match(/\/\* Style Definitions \*\/([\s\S]*?)\/\*/),Q=P&&P[1],R={};if(Q){Q.replace(/[\n\r]/g,'').replace(/(.+?)\{(.+?)\}/g,function(S,T,U){T=T.split(',');var V=T.length,W;for(var X=0;X<V;X++)CKEDITOR.tools.trim(T[X]).replace(/^(\w+)(\.[\w-]+)?$/g,function(Y,Z,aa){Z=Z||'*';aa=aa.substring(1,aa.length);if(aa.match(/MsoNormal/))return;if(!R[Z])R[Z]={};if(aa)R[Z][aa]=U;else R[Z]=U;});});y.applyStyleFilter=function(S){var T=R['*']?'*':S.name,U=S.attributes&&S.attributes['class'],V;if(T in R){V=R[T];if(typeof V=='object')V=V[U];V&&S.addStyle(V,true);}};}}return false;},p:function(O){if(/MsoListParagraph/.exec(O.attributes['class'])){var P=O.firstChild(function(S){return S.type==CKEDITOR.NODE_TEXT&&!H(S.parent);}),Q=P&&P.parent,R=Q&&Q.attributes;R&&!R.style&&(R.style='mso-list: Ignore;');}O.filterChildren();if(I(O))return;if(x.enterMode==CKEDITOR.ENTER_BR){delete O.name;O.add(new CKEDITOR.htmlParser.element('br'));}else B(x['format_'+(x.enterMode==CKEDITOR.ENTER_P?'p':'div')])(O);},div:function(O){var P=O.onlyChild();if(P&&P.name=='table'){var Q=O.attributes;P.attributes=CKEDITOR.tools.extend(P.attributes,Q);Q.style&&P.addStyle(Q.style);var R=new CKEDITOR.htmlParser.element('div');R.addStyle('clear','both');O.add(R);delete O.name;}},td:function(O){if(O.getAncestor('thead'))O.name='th';},ol:E,ul:E,dl:E,font:function(O){if(G(O.parent)){delete O.name;return;}O.filterChildren();var P=O.attributes,Q=P.style,R=O.parent;if('font'==R.name){CKEDITOR.tools.extend(R.attributes,O.attributes);Q&&R.addStyle(Q);delete O.name;}else{Q=Q||'';if(P.color){P.color!='#000000'&&(Q+='color:'+P.color+';');delete P.color;
-}if(P.face){Q+='font-family:'+P.face+';';delete P.face;}if(P.size){Q+='font-size:'+(P.size>3?'large':P.size<3?'small':'medium')+';';delete P.size;}O.name='span';O.addStyle(Q);}},span:function(O){if(G(O.parent))return false;O.filterChildren();if(H(O)){delete O.name;return null;}if(G(O)){var P=O.firstChild(function(Y){return Y.value||Y.name=='img';}),Q=P&&(P.value||'l.'),R=Q&&Q.match(/^(?:[(]?)([^\s]+?)([.)]?)$/);if(R){var S=D(R,Q),T=O.getAncestor('span');if(T&&/ mso-hide:\s*all|display:\s*none /.test(T.attributes.style))S.attributes['cke:ignored']=1;return S;}}var U=O.children,V=O.attributes,W=V&&V.style,X=U&&U[0];if(W)V.style=A([['line-height'],[/^font-family$/,null,!M?C(x.font_style,'family'):null],[/^font-size$/,null,!M?C(x.fontSize_style,'size'):null],[/^color$/,null,!M?C(x.colorButton_foreStyle,'color'):null],[/^background-color$/,null,!M?C(x.colorButton_backStyle,'color'):null]])(W,O)||'';return null;},b:B(x.coreStyles_bold),i:B(x.coreStyles_italic),u:B(x.coreStyles_underline),s:B(x.coreStyles_strike),sup:B(x.coreStyles_superscript),sub:B(x.coreStyles_subscript),a:function(O){var P=O.attributes;if(P&&!P.href&&P.name)delete O.name;else if(CKEDITOR.env.webkit&&P.href&&P.href.match(/file:\/\/\/[\S]+#/i))P.href=P.href.replace(/file:\/\/\/[^#]+/i,'');},'cke:listbullet':function(O){if(O.getAncestor(/h\d/)&&!x.pasteFromWordNumberedHeadingToList)delete O.name;}},attributeNames:[[/^onmouse(:?out|over)/,''],[/^onload$/,''],[/(?:v|o):\w+/,''],[/^lang/,'']],attributes:{style:A(N?[[/^list-style-type$/,null],[/^margin$|^margin-(?!bottom|top)/,null,function(O,P,Q){if(P.name in {p:1,div:1}){var R=x.contentsLangDirection=='ltr'?'margin-left':'margin-right';if(Q=='margin')O=K(Q,O,[R])[R];else if(Q!=R)return null;if(O&&!e.test(O))return[R,O];}return null;}],[/^clear$/],[/^border.*|margin.*|vertical-align|float$/,null,function(O,P){if(P.name=='img')return O;}],[/^width|height$/,null,function(O,P){if(P.name in {table:1,td:1,th:1,img:1})return O;}]]:[[/^mso-/],[/-color$/,null,function(O){if(O=='transparent')return false;if(CKEDITOR.env.gecko)return O.replace(/-moz-use-text-color/g,'transparent');}],[/^margin$/,e],['text-indent','0cm'],['page-break-before'],['tab-stops'],['display','none'],M?[/font-?/]:null],N),width:function(O,P){if(P.name in v.$tableContent)return false;},border:function(O,P){if(P.name in v.$tableContent)return false;},'class':z,bgcolor:z,valign:N?z:function(O,P){P.addStyle('vertical-align',O);return false;}},comment:!CKEDITOR.env.ie?function(O,P){var Q=O.match(/<img.*?>/),R=O.match(/^\[if !supportLists\]([\s\S]*?)\[endif\]$/);
-if(R){var S=R[1]||Q&&'l.',T=S&&S.match(/>(?:[(]?)([^\s]+?)([.)]?)</);return D(T,S);}if(CKEDITOR.env.gecko&&Q){var U=CKEDITOR.htmlParser.fragment.fromHtml(Q[0]).children[0],V=P.previous,W=V&&V.value.match(/<v:imagedata[^>]*o:href=['"](.*?)['"]/),X=W&&W[1];X&&(U.attributes.src=X);return U;}return false;}:z};}},t=function(){this.dataFilter=new CKEDITOR.htmlParser.filter();};t.prototype={toHtml:function(u){var v=CKEDITOR.htmlParser.fragment.fromHtml(u,false),w=new CKEDITOR.htmlParser.basicWriter();v.writeHtml(w,this.dataFilter);return w.getHtml(true);}};CKEDITOR.cleanWord=function(u,v){if(CKEDITOR.env.gecko)u=u.replace(/(<!--\[if[^<]*?\])-->([\S\s]*?)<!--(\[endif\]-->)/gi,'$1$2$3');var w=new t(),x=w.dataFilter;x.addRules(CKEDITOR.plugins.pastefromword.getRules(v));v.fire('beforeCleanWord',{filter:x});try{u=w.toHtml(u,false);}catch(y){alert(v.lang.pastefromword.error);}u=u.replace(/cke:.*?".*?"/g,'');u=u.replace(/style=""/g,'');u=u.replace(/<span>/g,'');return u;};})();
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function(){var a=CKEDITOR.htmlParser.fragment.prototype,b=CKEDITOR.htmlParser.element.prototype;a.onlyChild=b.onlyChild=function(){var u=this.children,v=u.length,w=v==1&&u[0];return w||null;};b.removeAnyChildWithName=function(u){var v=this.children,w=[],x;for(var y=0;y<v.length;y++){x=v[y];if(!x.name)continue;if(x.name==u){w.push(x);v.splice(y--,1);}w=w.concat(x.removeAnyChildWithName(u));}return w;};b.getAncestor=function(u){var v=this.parent;while(v&&!(v.name&&v.name.match(u)))v=v.parent;return v;};a.firstChild=b.firstChild=function(u){var v;for(var w=0;w<this.children.length;w++){v=this.children[w];if(u(v))return v;else if(v.name){v=v.firstChild(u);if(v)return v;}}return null;};b.addStyle=function(u,v,w){var A=this;var x,y='';if(typeof v=='string')y+=u+':'+v+';';else{if(typeof u=='object')for(var z in u){if(u.hasOwnProperty(z))y+=z+':'+u[z]+';';}else y+=u;w=v;}if(!A.attributes)A.attributes={};x=A.attributes.style||'';x=(w?[y,x]:[x,y]).join(';');A.attributes.style=x.replace(/^;|;(?=;)/,'');};CKEDITOR.dtd.parentOf=function(u){var v={};for(var w in this){if(w.indexOf('$')==-1&&this[w][u])v[w]=1;}return v;};function c(u){var v=u.children,w,x,y=u.children.length,z,A,B=/list-style-type:(.*?)(?:;|$)/,C=CKEDITOR.plugins.pastefromword.filters.stylesFilter;x=u.attributes;if(B.exec(x.style))return;for(var D=0;D<y;D++){w=v[D];if(w.attributes.value&&Number(w.attributes.value)==D+1)delete w.attributes.value;z=B.exec(w.attributes.style);if(z)if(z[1]==A||!A)A=z[1];else{A=null;break;}}if(A){for(D=0;D<y;D++){x=v[D].attributes;x.style&&(x.style=C([['list-style-type']])(x.style)||'');}u.addStyle('list-style-type',A);}};var d=/^([.\d]*)+(em|ex|px|gd|rem|vw|vh|vm|ch|mm|cm|in|pt|pc|deg|rad|ms|s|hz|khz){1}?/i,e=/^(?:\b0[^\s]*\s*){1,4}$/,f='^m{0,4}(cm|cd|d?c{0,3})(xc|xl|l?x{0,3})(ix|iv|v?i{0,3})$',g=new RegExp(f),h=new RegExp(f.toUpperCase()),i={decimal:/\d+/,'lower-roman':g,'upper-roman':h,'lower-alpha':/^[a-z]+$/,'upper-alpha':/^[A-Z]+$/},j={disc:/[l\u00B7\u2002]/,circle:/[\u006F\u00D8]/,square:/[\u006E\u25C6]/},k={ol:i,ul:j},l=[[1000,'M'],[900,'CM'],[500,'D'],[400,'CD'],[100,'C'],[90,'XC'],[50,'L'],[40,'XL'],[10,'X'],[9,'IX'],[5,'V'],[4,'IV'],[1,'I']],m='ABCDEFGHIJKLMNOPQRSTUVWXYZ';function n(u){u=u.toUpperCase();var v=l.length,w=0;for(var x=0;x<v;++x)for(var y=l[x],z=y[1].length;u.substr(0,z)==y[1];u=u.substr(z))w+=y[0];return w;};function o(u){u=u.toUpperCase();var v=m.length,w=1;for(var x=1;u.length>0;x*=v){w+=m.indexOf(u.charAt(u.length-1))*x;u=u.substr(0,u.length-1);}return w;
+};var p=0,q=null,r,s=CKEDITOR.plugins.pastefromword={utils:{createListBulletMarker:function(u,v){var w=new CKEDITOR.htmlParser.element('cke:listbullet');w.attributes={'cke:listsymbol':u[0]};w.add(new CKEDITOR.htmlParser.text(v));return w;},isListBulletIndicator:function(u){var v=u.attributes&&u.attributes.style;if(/mso-list\s*:\s*Ignore/i.test(v))return true;},isContainingOnlySpaces:function(u){var v;return(v=u.onlyChild())&&/^(:?\s| )+$/.test(v.value);},resolveList:function(u){var v=u.attributes,w;if((w=u.removeAnyChildWithName('cke:listbullet'))&&w.length&&(w=w[0])){u.name='cke:li';if(v.style)v.style=s.filters.stylesFilter([['text-indent'],['line-height'],[/^margin(:?-left)?$/,null,function(x){var y=x.split(' ');x=CKEDITOR.tools.convertToPx(y[3]||y[1]||y[0]);if(!p&&q!==null&&x>q)p=x-q;q=x;v['cke:indent']=p&&Math.ceil(x/p)+1||1;}],[/^mso-list$/,null,function(x){x=x.split(' ');var y=Number(x[0].match(/\d+/)),z=Number(x[1].match(/\d+/));if(z==1){y!==r&&(v['cke:reset']=1);r=y;}v['cke:indent']=z;}]])(v.style,u)||'';if(!v['cke:indent']){q=0;v['cke:indent']=1;}CKEDITOR.tools.extend(v,w.attributes);return true;}else r=q=p=null;return false;},getStyleComponents:(function(){var u=CKEDITOR.dom.element.createFromHtml('<div style="position:absolute;left:-9999px;top:-9999px;"></div>',CKEDITOR.document);CKEDITOR.document.getBody().append(u);return function(v,w,x){u.setStyle(v,w);var y={},z=x.length;for(var A=0;A<z;A++)y[x[A]]=u.getStyle(x[A]);return y;};})(),listDtdParents:CKEDITOR.dtd.parentOf('ol')},filters:{flattenList:function(u,v){v=typeof v=='number'?v:1;var w=u.attributes,x;switch(w.type){case 'a':x='lower-alpha';break;case '1':x='decimal';break;}var y=u.children,z;for(var A=0;A<y.length;A++){z=y[A];if(z.name in CKEDITOR.dtd.$listItem){var B=z.attributes,C=z.children,D=C.length,E=C[D-1];if(E.name in CKEDITOR.dtd.$list){u.add(E,A+1);if(!--C.length)y.splice(A--,1);}z.name='cke:li';w.start&&!A&&(B.value=w.start);s.filters.stylesFilter([['tab-stops',null,function(H){var I=H.split(' ')[1].match(d);I&&(q=CKEDITOR.tools.convertToPx(I[0]));}],v==1?['mso-list',null,function(H){H=H.split(' ');var I=Number(H[0].match(/\d+/));I!==r&&(B['cke:reset']=1);r=I;}]:null])(B.style);B['cke:indent']=v;B['cke:listtype']=u.name;B['cke:list-style-type']=x;}else if(z.name in CKEDITOR.dtd.$list){arguments.callee.apply(this,[z,v+1]);y=y.slice(0,A).concat(z.children).concat(y.slice(A+1));u.children=[];for(var F=0,G=y.length;F<G;F++)u.add(y[F]);}}delete u.name;w['cke:list']=1;},assembleList:function(u){var v=u.children,w,x,y,z,A,B,C,D=[],E,F,G,H,I,J;
+for(var K=0;K<v.length;K++){w=v[K];if('cke:li'==w.name){w.name='li';x=w;y=x.attributes;G=y['cke:listsymbol'];G=G&&G.match(/^(?:[(]?)([^\s]+?)([.)]?)$/);H=I=J=null;if(y['cke:ignored']){v.splice(K--,1);continue;}y['cke:reset']&&(C=A=B=null);z=Number(y['cke:indent']);if(z!=A)F=E=null;if(!G){H=y['cke:listtype']||'ol';I=y['cke:list-style-type'];}else{if(F&&k[F][E].test(G[1])){H=F;I=E;}else for(var L in k)for(var M in k[L]){if(k[L][M].test(G[1]))if(L=='ol'&&/alpha|roman/.test(M)){var N=/roman/.test(M)?n(G[1]):o(G[1]);if(!J||N<J){J=N;H=L;I=M;}}else{H=L;I=M;break;}}!H&&(H=G[2]?'ol':'ul');}F=H;E=I||(H=='ol'?'decimal':'disc');if(I&&I!=(H=='ol'?'decimal':'disc'))x.addStyle('list-style-type',I);if(H=='ol'&&G){switch(I){case 'decimal':J=Number(G[1]);break;case 'lower-roman':case 'upper-roman':J=n(G[1]);break;case 'lower-alpha':case 'upper-alpha':J=o(G[1]);break;}x.attributes.value=J;}if(!C){D.push(C=new CKEDITOR.htmlParser.element(H));C.add(x);v[K]=C;}else{if(z>A){D.push(C=new CKEDITOR.htmlParser.element(H));C.add(x);B.add(C);}else if(z<A){var O=A-z,P;while(O--&&(P=C.parent))C=P.parent;C.add(x);}else C.add(x);v.splice(K--,1);}B=x;A=z;}else if(C)C=A=B=null;}for(K=0;K<D.length;K++)c(D[K]);C=A=B=r=q=p=null;},falsyFilter:function(u){return false;},stylesFilter:function(u,v){return function(w,x){var y=[];(w||'').replace(/"/g,'"').replace(/\s*([^ :;]+)\s*:\s*([^;]+)\s*(?=;|$)/g,function(A,B,C){B=B.toLowerCase();B=='font-family'&&(C=C.replace(/["']/g,''));var D,E,F,G;for(var H=0;H<u.length;H++){if(u[H]){D=u[H][0];E=u[H][1];F=u[H][2];G=u[H][3];if(B.match(D)&&(!E||C.match(E))){B=G||B;v&&(F=F||C);if(typeof F=='function')F=F(C,x,B);if(F&&F.push)B=F[0],F=F[1];if(typeof F=='string')y.push([B,F]);return;}}}!v&&y.push([B,C]);});for(var z=0;z<y.length;z++)y[z]=y[z].join(':');return y.length?y.join(';')+';':false;};},elementMigrateFilter:function(u,v){return function(w){var x=v?new CKEDITOR.style(u,v)._.definition:u;w.name=x.element;CKEDITOR.tools.extend(w.attributes,CKEDITOR.tools.clone(x.attributes));w.addStyle(CKEDITOR.style.getStyleText(x));};},styleMigrateFilter:function(u,v){var w=this.elementMigrateFilter;return function(x,y){var z=new CKEDITOR.htmlParser.element(null),A={};A[v]=x;w(u,A)(z);z.children=y.children;y.children=[z];};},bogusAttrFilter:function(u,v){if(v.name.indexOf('cke:')==-1)return false;},applyStyleFilter:null},getRules:function(u){var v=CKEDITOR.dtd,w=CKEDITOR.tools.extend({},v.$block,v.$listItem,v.$tableContent),x=u.config,y=this.filters,z=y.falsyFilter,A=y.stylesFilter,B=y.elementMigrateFilter,C=CKEDITOR.tools.bind(this.filters.styleMigrateFilter,this.filters),D=this.utils.createListBulletMarker,E=y.flattenList,F=y.assembleList,G=this.utils.isListBulletIndicator,H=this.utils.isContainingOnlySpaces,I=this.utils.resolveList,J=function(O){O=CKEDITOR.tools.convertToPx(O);
+return isNaN(O)?O:O+'px';},K=this.utils.getStyleComponents,L=this.utils.listDtdParents,M=x.pasteFromWordRemoveFontStyles!==false,N=x.pasteFromWordRemoveStyles!==false;return{elementNames:[[/meta|link|script/,'']],root:function(O){O.filterChildren();F(O);},elements:{'^':function(O){var P;if(CKEDITOR.env.gecko&&(P=y.applyStyleFilter))P(O);},$:function(O){var P=O.name||'',Q=O.attributes;if(P in w&&Q.style)Q.style=A([[/^(:?width|height)$/,null,J]])(Q.style)||'';if(P.match(/h\d/)){O.filterChildren();if(I(O))return;B(x['format_'+P])(O);}else if(P in v.$inline){O.filterChildren();if(H(O))delete O.name;}else if(P.indexOf(':')!=-1&&P.indexOf('cke')==-1){O.filterChildren();if(P=='v:imagedata'){var R=O.attributes['o:href'];if(R)O.attributes.src=R;O.name='img';return;}delete O.name;}if(P in L){O.filterChildren();F(O);}},style:function(O){if(CKEDITOR.env.gecko){var P=O.onlyChild().value.match(/\/\* Style Definitions \*\/([\s\S]*?)\/\*/),Q=P&&P[1],R={};if(Q){Q.replace(/[\n\r]/g,'').replace(/(.+?)\{(.+?)\}/g,function(S,T,U){T=T.split(',');var V=T.length,W;for(var X=0;X<V;X++)CKEDITOR.tools.trim(T[X]).replace(/^(\w+)(\.[\w-]+)?$/g,function(Y,Z,aa){Z=Z||'*';aa=aa.substring(1,aa.length);if(aa.match(/MsoNormal/))return;if(!R[Z])R[Z]={};if(aa)R[Z][aa]=U;else R[Z]=U;});});y.applyStyleFilter=function(S){var T=R['*']?'*':S.name,U=S.attributes&&S.attributes['class'],V;if(T in R){V=R[T];if(typeof V=='object')V=V[U];V&&S.addStyle(V,true);}};}}return false;},p:function(O){if(/MsoListParagraph/.exec(O.attributes['class'])){var P=O.firstChild(function(S){return S.type==CKEDITOR.NODE_TEXT&&!H(S.parent);}),Q=P&&P.parent,R=Q&&Q.attributes;R&&!R.style&&(R.style='mso-list: Ignore;');}O.filterChildren();if(I(O))return;if(x.enterMode==CKEDITOR.ENTER_BR){delete O.name;O.add(new CKEDITOR.htmlParser.element('br'));}else B(x['format_'+(x.enterMode==CKEDITOR.ENTER_P?'p':'div')])(O);},div:function(O){var P=O.onlyChild();if(P&&P.name=='table'){var Q=O.attributes;P.attributes=CKEDITOR.tools.extend(P.attributes,Q);Q.style&&P.addStyle(Q.style);var R=new CKEDITOR.htmlParser.element('div');R.addStyle('clear','both');O.add(R);delete O.name;}},td:function(O){if(O.getAncestor('thead'))O.name='th';},ol:E,ul:E,dl:E,font:function(O){if(G(O.parent)){delete O.name;return;}O.filterChildren();var P=O.attributes,Q=P.style,R=O.parent;if('font'==R.name){CKEDITOR.tools.extend(R.attributes,O.attributes);Q&&R.addStyle(Q);delete O.name;}else{Q=Q||'';if(P.color){P.color!='#000000'&&(Q+='color:'+P.color+';');delete P.color;
+}if(P.face){Q+='font-family:'+P.face+';';delete P.face;}if(P.size){Q+='font-size:'+(P.size>3?'large':P.size<3?'small':'medium')+';';delete P.size;}O.name='span';O.addStyle(Q);}},span:function(O){if(G(O.parent))return false;O.filterChildren();if(H(O)){delete O.name;return null;}if(G(O)){var P=O.firstChild(function(Y){return Y.value||Y.name=='img';}),Q=P&&(P.value||'l.'),R=Q&&Q.match(/^(?:[(]?)([^\s]+?)([.)]?)$/);if(R){var S=D(R,Q),T=O.getAncestor('span');if(T&&/ mso-hide:\s*all|display:\s*none /.test(T.attributes.style))S.attributes['cke:ignored']=1;return S;}}var U=O.children,V=O.attributes,W=V&&V.style,X=U&&U[0];if(W)V.style=A([['line-height'],[/^font-family$/,null,!M?C(x.font_style,'family'):null],[/^font-size$/,null,!M?C(x.fontSize_style,'size'):null],[/^color$/,null,!M?C(x.colorButton_foreStyle,'color'):null],[/^background-color$/,null,!M?C(x.colorButton_backStyle,'color'):null]])(W,O)||'';return null;},b:B(x.coreStyles_bold),i:B(x.coreStyles_italic),u:B(x.coreStyles_underline),s:B(x.coreStyles_strike),sup:B(x.coreStyles_superscript),sub:B(x.coreStyles_subscript),a:function(O){var P=O.attributes;if(P&&!P.href&&P.name)delete O.name;else if(CKEDITOR.env.webkit&&P.href&&P.href.match(/file:\/\/\/[\S]+#/i))P.href=P.href.replace(/file:\/\/\/[^#]+/i,'');},'cke:listbullet':function(O){if(O.getAncestor(/h\d/)&&!x.pasteFromWordNumberedHeadingToList)delete O.name;}},attributeNames:[[/^onmouse(:?out|over)/,''],[/^onload$/,''],[/(?:v|o):\w+/,''],[/^lang/,'']],attributes:{style:A(N?[[/^list-style-type$/,null],[/^margin$|^margin-(?!bottom|top)/,null,function(O,P,Q){if(P.name in {p:1,div:1}){var R=x.contentsLangDirection=='ltr'?'margin-left':'margin-right';if(Q=='margin')O=K(Q,O,[R])[R];else if(Q!=R)return null;if(O&&!e.test(O))return[R,O];}return null;}],[/^clear$/],[/^border.*|margin.*|vertical-align|float$/,null,function(O,P){if(P.name=='img')return O;}],[/^width|height$/,null,function(O,P){if(P.name in {table:1,td:1,th:1,img:1})return O;}]]:[[/^mso-/],[/-color$/,null,function(O){if(O=='transparent')return false;if(CKEDITOR.env.gecko)return O.replace(/-moz-use-text-color/g,'transparent');}],[/^margin$/,e],['text-indent','0cm'],['page-break-before'],['tab-stops'],['display','none'],M?[/font-?/]:null],N),width:function(O,P){if(P.name in v.$tableContent)return false;},border:function(O,P){if(P.name in v.$tableContent)return false;},'class':z,bgcolor:z,valign:N?z:function(O,P){P.addStyle('vertical-align',O);return false;}},comment:!CKEDITOR.env.ie?function(O,P){var Q=O.match(/<img.*?>/),R=O.match(/^\[if !supportLists\]([\s\S]*?)\[endif\]$/);
+if(R){var S=R[1]||Q&&'l.',T=S&&S.match(/>(?:[(]?)([^\s]+?)([.)]?)</);return D(T,S);}if(CKEDITOR.env.gecko&&Q){var U=CKEDITOR.htmlParser.fragment.fromHtml(Q[0]).children[0],V=P.previous,W=V&&V.value.match(/<v:imagedata[^>]*o:href=['"](.*?)['"]/),X=W&&W[1];X&&(U.attributes.src=X);return U;}return false;}:z};}},t=function(){this.dataFilter=new CKEDITOR.htmlParser.filter();};t.prototype={toHtml:function(u){var v=CKEDITOR.htmlParser.fragment.fromHtml(u,false),w=new CKEDITOR.htmlParser.basicWriter();v.writeHtml(w,this.dataFilter);return w.getHtml(true);}};CKEDITOR.cleanWord=function(u,v){if(CKEDITOR.env.gecko)u=u.replace(/(<!--\[if[^<]*?\])-->([\S\s]*?)<!--(\[endif\]-->)/gi,'$1$2$3');var w=new t(),x=w.dataFilter;x.addRules(CKEDITOR.plugins.pastefromword.getRules(v));v.fire('beforeCleanWord',{filter:x});try{u=w.toHtml(u,false);}catch(y){alert(v.lang.pastefromword.error);}u=u.replace(/cke:.*?".*?"/g,'');u=u.replace(/style=""/g,'');u=u.replace(/<span>/g,'');return u;};})();
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/pastetext/dialogs/pastetext.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/pastetext/dialogs/pastetext.js
index 6d87d47..419d24a 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/pastetext/dialogs/pastetext.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/pastetext/dialogs/pastetext.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-(function(){CKEDITOR.dialog.add('pastetext',function(a){return{title:a.lang.pasteText.title,minWidth:CKEDITOR.env.ie&&CKEDITOR.env.quirks?368:350,minHeight:240,onShow:function(){this.setupContent();},onOk:function(){this.commitContent();},contents:[{label:a.lang.common.generalTab,id:'general',elements:[{type:'html',id:'pasteMsg',html:'<div style="white-space:normal;width:340px;">'+a.lang.clipboard.pasteMsg+'</div>'},{type:'textarea',id:'content',className:'cke_pastetext',onLoad:function(){var b=this.getDialog().getContentElement('general','pasteMsg').getElement(),c=this.getElement().getElementsByTag('textarea').getItem(0);c.setAttribute('aria-labelledby',b.$.id);c.setStyle('direction',a.config.contentsLangDirection);},focus:function(){this.getElement().focus();},setup:function(){this.setValue('');},commit:function(){var b=this.getValue();setTimeout(function(){a.fire('paste',{text:b});},0);}}]}]};});})();
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function(){CKEDITOR.dialog.add('pastetext',function(a){return{title:a.lang.pasteText.title,minWidth:CKEDITOR.env.ie&&CKEDITOR.env.quirks?368:350,minHeight:240,onShow:function(){this.setupContent();},onOk:function(){this.commitContent();},contents:[{label:a.lang.common.generalTab,id:'general',elements:[{type:'html',id:'pasteMsg',html:'<div style="white-space:normal;width:340px;">'+a.lang.clipboard.pasteMsg+'</div>'},{type:'textarea',id:'content',className:'cke_pastetext',onLoad:function(){var b=this.getDialog().getContentElement('general','pasteMsg').getElement(),c=this.getElement().getElementsByTag('textarea').getItem(0);c.setAttribute('aria-labelledby',b.$.id);c.setStyle('direction',a.config.contentsLangDirection);},focus:function(){this.getElement().focus();},setup:function(){this.setValue('');},commit:function(){var b=this.getValue();setTimeout(function(){a.fire('paste',{text:b});},0);}}]}]};});})();
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/dialogs/placeholder.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/dialogs/placeholder.js
index 650aaa4..8e34d74 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/dialogs/placeholder.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/dialogs/placeholder.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-(function(){function a(b,c){var d=b.lang.placeholder,e=b.lang.common.generalTab;return{title:d.title,minWidth:300,minHeight:80,contents:[{id:'info',label:e,title:e,elements:[{id:'text',type:'text',style:'width: 100%;',label:d.text,'default':'',required:true,validate:CKEDITOR.dialog.validate.notEmpty(d.textMissing),setup:function(f){if(c)this.setValue(f.getText().slice(2,-2));},commit:function(f){var g='[['+this.getValue()+']]';CKEDITOR.plugins.placeholder.createPlaceholder(b,f,g);}}]}],onShow:function(){if(c)this._element=CKEDITOR.plugins.placeholder.getSelectedPlaceHoder(b);this.setupContent(this._element);},onOk:function(){this.commitContent(this._element);delete this._element;}};};CKEDITOR.dialog.add('createplaceholder',function(b){return a(b);});CKEDITOR.dialog.add('editplaceholder',function(b){return a(b,1);});})();
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function(){function a(b,c){var d=b.lang.placeholder,e=b.lang.common.generalTab;return{title:d.title,minWidth:300,minHeight:80,contents:[{id:'info',label:e,title:e,elements:[{id:'text',type:'text',style:'width: 100%;',label:d.text,'default':'',required:true,validate:CKEDITOR.dialog.validate.notEmpty(d.textMissing),setup:function(f){if(c)this.setValue(f.getText().slice(2,-2));},commit:function(f){var g='[['+this.getValue()+']]';CKEDITOR.plugins.placeholder.createPlaceholder(b,f,g);}}]}],onShow:function(){if(c)this._element=CKEDITOR.plugins.placeholder.getSelectedPlaceHoder(b);this.setupContent(this._element);},onOk:function(){this.commitContent(this._element);delete this._element;}};};CKEDITOR.dialog.add('createplaceholder',function(b){return a(b);});CKEDITOR.dialog.add('editplaceholder',function(b){return a(b,1);});})();
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/_translationstatus.txt b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/_translationstatus.txt
index 0485f8e..c497d1f 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/_translationstatus.txt
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/_translationstatus.txt
@@ -1,27 +1,27 @@
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-
-bg.js Found: 5 Missing: 0
-cs.js Found: 5 Missing: 0
-cy.js Found: 5 Missing: 0
-da.js Found: 5 Missing: 0
-de.js Found: 5 Missing: 0
-el.js Found: 5 Missing: 0
-eo.js Found: 5 Missing: 0
-et.js Found: 5 Missing: 0
-fa.js Found: 5 Missing: 0
-fi.js Found: 5 Missing: 0
-fr.js Found: 5 Missing: 0
-he.js Found: 5 Missing: 0
-hr.js Found: 5 Missing: 0
-it.js Found: 5 Missing: 0
-nb.js Found: 5 Missing: 0
-nl.js Found: 5 Missing: 0
-no.js Found: 5 Missing: 0
-pl.js Found: 5 Missing: 0
-pt-br.js Found: 5 Missing: 0
-tr.js Found: 5 Missing: 0
-ug.js Found: 5 Missing: 0
-uk.js Found: 5 Missing: 0
-vi.js Found: 4 Missing: 1
-zh-cn.js Found: 5 Missing: 0
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+
+bg.js Found: 5 Missing: 0
+cs.js Found: 5 Missing: 0
+cy.js Found: 5 Missing: 0
+da.js Found: 5 Missing: 0
+de.js Found: 5 Missing: 0
+el.js Found: 5 Missing: 0
+eo.js Found: 5 Missing: 0
+et.js Found: 5 Missing: 0
+fa.js Found: 5 Missing: 0
+fi.js Found: 5 Missing: 0
+fr.js Found: 5 Missing: 0
+he.js Found: 5 Missing: 0
+hr.js Found: 5 Missing: 0
+it.js Found: 5 Missing: 0
+nb.js Found: 5 Missing: 0
+nl.js Found: 5 Missing: 0
+no.js Found: 5 Missing: 0
+pl.js Found: 5 Missing: 0
+pt-br.js Found: 5 Missing: 0
+tr.js Found: 5 Missing: 0
+ug.js Found: 5 Missing: 0
+uk.js Found: 5 Missing: 0
+vi.js Found: 4 Missing: 1
+zh-cn.js Found: 5 Missing: 0
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/bg.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/bg.js
index 2101055..6fdcc2b 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/bg.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/bg.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','bg',{placeholder:{title:'Настройки на контейнера',toolbar:'Нов контейнер',text:'Текст за контейнера',edit:'Промяна на контейнер',textMissing:'Контейнера трябва да съдържа текст.'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','bg',{placeholder:{title:'Настройки на контейнера',toolbar:'Нов контейнер',text:'Текст за контейнера',edit:'Промяна на контейнер',textMissing:'Контейнера трябва да съдържа текст.'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/cs.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/cs.js
index ec9d50a..f0c5ee9 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/cs.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/cs.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','cs',{placeholder:{title:'Vlastnosti vyhrazeného prostoru',toolbar:'Vytvořit vyhrazený prostor',text:'Vyhrazený text',edit:'Upravit vyhrazený prostor',textMissing:'Vyhrazený prostor musí obsahovat text.'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','cs',{placeholder:{title:'Vlastnosti vyhrazeného prostoru',toolbar:'Vytvořit vyhrazený prostor',text:'Vyhrazený text',edit:'Upravit vyhrazený prostor',textMissing:'Vyhrazený prostor musí obsahovat text.'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/cy.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/cy.js
index 67ea981..a1088f7 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/cy.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/cy.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','cy',{placeholder:{title:"Priodweddau'r Daliwr Geiriau",toolbar:'Creu Daliwr Geiriau',text:'Testun y Daliwr Geiriau',edit:"Golygu'r Dailwr Geiriau",textMissing:"Mae'n rhaid i'r daliwr geiriau gynnwys testun."}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','cy',{placeholder:{title:"Priodweddau'r Daliwr Geiriau",toolbar:'Creu Daliwr Geiriau',text:'Testun y Daliwr Geiriau',edit:"Golygu'r Dailwr Geiriau",textMissing:"Mae'n rhaid i'r daliwr geiriau gynnwys testun."}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/da.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/da.js
index 41b9729..e40b415 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/da.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/da.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','da',{placeholder:{title:'Egenskaber for pladsholder',toolbar:'Opret pladsholder',text:'Tekst til pladsholder',edit:'Redigér pladsholder',textMissing:'Pladsholder skal indeholde tekst'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','da',{placeholder:{title:'Egenskaber for pladsholder',toolbar:'Opret pladsholder',text:'Tekst til pladsholder',edit:'Redigér pladsholder',textMissing:'Pladsholder skal indeholde tekst'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/de.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/de.js
index c95c303..dc06c43 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/de.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/de.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','de',{placeholder:{title:'Platzhalter Einstellungen',toolbar:'Platzhalter erstellen',text:'Platzhalter Text',edit:'Platzhalter bearbeiten',textMissing:'Der Platzhalter muss einen Text beinhalten.'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','de',{placeholder:{title:'Platzhalter Einstellungen',toolbar:'Platzhalter erstellen',text:'Platzhalter Text',edit:'Platzhalter bearbeiten',textMissing:'Der Platzhalter muss einen Text beinhalten.'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/el.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/el.js
index 74a40ba..c21e43c 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/el.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/el.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','el',{placeholder:{title:'Ιδιότητες Υποκατάστατου Κειμένου',toolbar:'Δημιουργία Υποκατάσταστου Κειμένου',text:'Υποκαθιστόμενο Κείμενο',edit:'Επεξεργασία Υποκατάσταστου Κειμένου',textMissing:'Πρέπει να υπάρχει υποκαθιστόμενο κείμενο.'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','el',{placeholder:{title:'Ιδιότητες Υποκατάστατου Κειμένου',toolbar:'Δημιουργία Υποκατάσταστου Κειμένου',text:'Υποκαθιστόμενο Κείμενο',edit:'Επεξεργασία Υποκατάσταστου Κειμένου',textMissing:'Πρέπει να υπάρχει υποκαθιστόμενο κείμενο.'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/en.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/en.js
index 83e64f9..65ad72f 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/en.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/en.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','en',{placeholder:{title:'Placeholder Properties',toolbar:'Create Placeholder',text:'Placeholder Text',edit:'Edit Placeholder',textMissing:'The placeholder must contain text.'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','en',{placeholder:{title:'Placeholder Properties',toolbar:'Create Placeholder',text:'Placeholder Text',edit:'Edit Placeholder',textMissing:'The placeholder must contain text.'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/eo.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/eo.js
index 228fbe8..9e6b5af 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/eo.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/eo.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','eo',{placeholder:{title:'Atributoj de la rezervita spaco',toolbar:'Krei la rezervitan spacon',text:'Texto de la rezervita spaco',edit:'Modifi la rezervitan spacon',textMissing:'La rezervita spaco devas enteni tekston.'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','eo',{placeholder:{title:'Atributoj de la rezervita spaco',toolbar:'Krei la rezervitan spacon',text:'Texto de la rezervita spaco',edit:'Modifi la rezervitan spacon',textMissing:'La rezervita spaco devas enteni tekston.'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/et.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/et.js
index b527e1d..37b267e 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/et.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/et.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','et',{placeholder:{title:'Kohahoidja omadused',toolbar:'Kohahoidja loomine',text:'Kohahoidja tekst',edit:'Kohahoidja muutmine',textMissing:'Kohahoidja peab sisaldama teksti.'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','et',{placeholder:{title:'Kohahoidja omadused',toolbar:'Kohahoidja loomine',text:'Kohahoidja tekst',edit:'Kohahoidja muutmine',textMissing:'Kohahoidja peab sisaldama teksti.'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/fa.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/fa.js
index e4ca062..cb5be88 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/fa.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/fa.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','fa',{placeholder:{title:'ویژگیهای محل نگهداری',toolbar:'ایجاد یک محل نگهداری',text:'متن محل نگهداری',edit:'ویرایش محل نگهداری',textMissing:'محل نگهداری باید محتوی متن باشد.'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','fa',{placeholder:{title:'ویژگیهای محل نگهداری',toolbar:'ایجاد یک محل نگهداری',text:'متن محل نگهداری',edit:'ویرایش محل نگهداری',textMissing:'محل نگهداری باید محتوی متن باشد.'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/fi.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/fi.js
index 90eafea..d8944a6 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/fi.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/fi.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','fi',{placeholder:{title:'Paikkamerkin ominaisuudet',toolbar:'Luo paikkamerkki',text:'Paikkamerkin teksti',edit:'Muokkaa paikkamerkkiä',textMissing:'Paikkamerkin täytyy sisältää tekstiä'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','fi',{placeholder:{title:'Paikkamerkin ominaisuudet',toolbar:'Luo paikkamerkki',text:'Paikkamerkin teksti',edit:'Muokkaa paikkamerkkiä',textMissing:'Paikkamerkin täytyy sisältää tekstiä'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/fr.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/fr.js
index a177460..bec39b3 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/fr.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/fr.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','fr',{placeholder:{title:"Propriétés de l'Espace réservé",toolbar:"Créer l'Espace réservé",text:"Texte de l'Espace réservé",edit:"Modifier l'Espace réservé",textMissing:"L'Espace réservé doit contenir du texte."}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','fr',{placeholder:{title:"Propriétés de l'Espace réservé",toolbar:"Créer l'Espace réservé",text:"Texte de l'Espace réservé",edit:"Modifier l'Espace réservé",textMissing:"L'Espace réservé doit contenir du texte."}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/he.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/he.js
index fadfcbd..e01eac7 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/he.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/he.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','he',{placeholder:{title:'מאפייני שומר מקום',toolbar:'צור שומר מקום',text:'תוכן שומר המקום',edit:'ערוך שומר מקום',textMissing:'שומר המקום חייב להכיל טקסט.'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','he',{placeholder:{title:'מאפייני שומר מקום',toolbar:'צור שומר מקום',text:'תוכן שומר המקום',edit:'ערוך שומר מקום',textMissing:'שומר המקום חייב להכיל טקסט.'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/hr.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/hr.js
index 8c195ce..0dd3052 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/hr.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/hr.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','hr',{placeholder:{title:'Svojstva rezerviranog mjesta',toolbar:'Napravi rezervirano mjesto',text:'Tekst rezerviranog mjesta',edit:'Uredi rezervirano mjesto',textMissing:'Rezervirano mjesto mora sadržavati tekst.'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','hr',{placeholder:{title:'Svojstva rezerviranog mjesta',toolbar:'Napravi rezervirano mjesto',text:'Tekst rezerviranog mjesta',edit:'Uredi rezervirano mjesto',textMissing:'Rezervirano mjesto mora sadržavati tekst.'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/it.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/it.js
index 86346eb..4c2f0e7 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/it.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/it.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','it',{placeholder:{title:'Proprietà segnaposto',toolbar:'Crea segnaposto',text:'Testo segnaposto',edit:'Modifica segnaposto',textMissing:'Il segnaposto deve contenere del testo.'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','it',{placeholder:{title:'Proprietà segnaposto',toolbar:'Crea segnaposto',text:'Testo segnaposto',edit:'Modifica segnaposto',textMissing:'Il segnaposto deve contenere del testo.'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/nb.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/nb.js
index 27f8410..4aaf4e3 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/nb.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/nb.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','nb',{placeholder:{title:'Egenskaper for plassholder',toolbar:'Opprett plassholder',text:'Tekst for plassholder',edit:'Rediger plassholder',textMissing:'Plassholderen må inneholde tekst.'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','nb',{placeholder:{title:'Egenskaper for plassholder',toolbar:'Opprett plassholder',text:'Tekst for plassholder',edit:'Rediger plassholder',textMissing:'Plassholderen må inneholde tekst.'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/nl.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/nl.js
index 89b9a3e..6fbb425 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/nl.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/nl.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','nl',{placeholder:{title:'Eigenschappen placeholder',toolbar:'Placeholder aanmaken',text:'Placeholder tekst',edit:'Placeholder wijzigen',textMissing:'De placeholder moet tekst bevatten.'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','nl',{placeholder:{title:'Eigenschappen placeholder',toolbar:'Placeholder aanmaken',text:'Placeholder tekst',edit:'Placeholder wijzigen',textMissing:'De placeholder moet tekst bevatten.'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/no.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/no.js
index 5aa1c5c..1d2f084 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/no.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/no.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','no',{placeholder:{title:'Egenskaper for plassholder',toolbar:'Opprett plassholder',text:'Tekst for plassholder',edit:'Rediger plassholder',textMissing:'Plassholderen må inneholde tekst.'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','no',{placeholder:{title:'Egenskaper for plassholder',toolbar:'Opprett plassholder',text:'Tekst for plassholder',edit:'Rediger plassholder',textMissing:'Plassholderen må inneholde tekst.'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/pl.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/pl.js
index f859f09..9f4d5d5 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/pl.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/pl.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','pl',{placeholder:{title:'Właściwości wypełniacza',toolbar:'Utwórz wypełniacz',text:'Tekst wypełnienia',edit:'Edytuj wypełnienie',textMissing:'Wypełnienie musi posiadać jakiś tekst.'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','pl',{placeholder:{title:'Właściwości wypełniacza',toolbar:'Utwórz wypełniacz',text:'Tekst wypełnienia',edit:'Edytuj wypełnienie',textMissing:'Wypełnienie musi posiadać jakiś tekst.'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/pt-br.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/pt-br.js
index c395d95..c595aa7 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/pt-br.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/pt-br.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','pt-br',{placeholder:{title:'Propriedades do Espaço Reservado',toolbar:'Criar Espaço Reservado',text:'Texto do Espaço Reservado',edit:'Editar Espaço Reservado',textMissing:'O espaço reservado deve conter texto.'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','pt-br',{placeholder:{title:'Propriedades do Espaço Reservado',toolbar:'Criar Espaço Reservado',text:'Texto do Espaço Reservado',edit:'Editar Espaço Reservado',textMissing:'O espaço reservado deve conter texto.'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/tr.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/tr.js
index 328092c..17bbe72 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/tr.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/tr.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','tr',{placeholder:{title:'Yer tutucu özellikleri',toolbar:'Yer tutucu oluşturun',text:'Yer tutucu metini',edit:'Yer tutucuyu düzenle',textMissing:'Yer tutucu metin içermelidir.'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','tr',{placeholder:{title:'Yer tutucu özellikleri',toolbar:'Yer tutucu oluşturun',text:'Yer tutucu metini',edit:'Yer tutucuyu düzenle',textMissing:'Yer tutucu metin içermelidir.'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/ug.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/ug.js
index 25a3049..fdc1dc1 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/ug.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/ug.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','ug',{placeholder:{title:'ئورۇن بەلگە خاسلىقى',toolbar:'ئورۇن بەلگە قۇر',text:'ئورۇن بەلگە تېكىستى',edit:'ئورۇن بەلگە تەھرىر',textMissing:'ئورۇن بەلگىسىدە چوقۇم تېكىست بولۇشى لازىم'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','ug',{placeholder:{title:'ئورۇن بەلگە خاسلىقى',toolbar:'ئورۇن بەلگە قۇر',text:'ئورۇن بەلگە تېكىستى',edit:'ئورۇن بەلگە تەھرىر',textMissing:'ئورۇن بەلگىسىدە چوقۇم تېكىست بولۇشى لازىم'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/uk.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/uk.js
index aefe4ab..9c6211d 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/uk.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/uk.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','uk',{placeholder:{title:'Налаштування Заповнювача',toolbar:'Створити Заповнювач',text:'Текст Заповнювача',edit:'Редагувати Заповнювач',textMissing:'Заповнювач повинен містити текст.'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','uk',{placeholder:{title:'Налаштування Заповнювача',toolbar:'Створити Заповнювач',text:'Текст Заповнювача',edit:'Редагувати Заповнювач',textMissing:'Заповнювач повинен містити текст.'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/vi.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/vi.js
index efcd578..77cab6e 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/vi.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/vi.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','vi',{placeholder:{title:'Thuộc tính đặt chỗ',toolbar:'Tạo đặt chỗ',text:'Văn bản đặt chỗ',edit:'Chỉnh sửa ',textMissing:'The placeholder must contain text.'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','vi',{placeholder:{title:'Thuộc tính đặt chỗ',toolbar:'Tạo đặt chỗ',text:'Văn bản đặt chỗ',edit:'Chỉnh sửa ',textMissing:'The placeholder must contain text.'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/zh-cn.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/zh-cn.js
index a6dcfca..1ea56e8 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/zh-cn.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/lang/zh-cn.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('placeholder','zh-cn',{placeholder:{title:'占位符属性',toolbar:'创建占位符',text:'占位符文字',edit:'编辑占位符',textMissing:'占位符必需包含有文字'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('placeholder','zh-cn',{placeholder:{title:'占位符属性',toolbar:'创建占位符',text:'占位符文字',edit:'编辑占位符',textMissing:'占位符必需包含有文字'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/plugin.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/plugin.js
index 3087993..7c1fb5f 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/plugin.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/placeholder/plugin.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-(function(){var a=/\[\[[^\]]+\]\]/g;CKEDITOR.plugins.add('placeholder',{requires:['dialog'],lang:['bg','cs','cy','da','de','el','en','eo','et','fa','fi','fr','he','hr','it','nb','nl','no','pl','pt-br','tr','ug','uk','vi','zh-cn'],init:function(b){var c=b.lang.placeholder;b.addCommand('createplaceholder',new CKEDITOR.dialogCommand('createplaceholder'));b.addCommand('editplaceholder',new CKEDITOR.dialogCommand('editplaceholder'));b.ui.addButton('CreatePlaceholder',{label:c.toolbar,command:'createplaceholder',icon:this.path+'placeholder.gif'});if(b.addMenuItems){b.addMenuGroup('placeholder',20);b.addMenuItems({editplaceholder:{label:c.edit,command:'editplaceholder',group:'placeholder',order:1,icon:this.path+'placeholder.gif'}});if(b.contextMenu)b.contextMenu.addListener(function(d,e){if(!d||!d.data('cke-placeholder'))return null;return{editplaceholder:CKEDITOR.TRISTATE_OFF};});}b.on('doubleclick',function(d){if(CKEDITOR.plugins.placeholder.getSelectedPlaceHoder(b))d.data.dialog='editplaceholder';});b.addCss('.cke_placeholder{background-color: #ffff00;'+(CKEDITOR.env.gecko?'cursor: default;':'')+'}');b.on('contentDom',function(){b.document.getBody().on('resizestart',function(d){if(b.getSelection().getSelectedElement().data('cke-placeholder'))d.data.preventDefault();});});CKEDITOR.dialog.add('createplaceholder',this.path+'dialogs/placeholder.js');CKEDITOR.dialog.add('editplaceholder',this.path+'dialogs/placeholder.js');},afterInit:function(b){var c=b.dataProcessor,d=c&&c.dataFilter,e=c&&c.htmlFilter;if(d)d.addRules({text:function(f){return f.replace(a,function(g){return CKEDITOR.plugins.placeholder.createPlaceholder(b,null,g,1);});}});if(e)e.addRules({elements:{span:function(f){if(f.attributes&&f.attributes['data-cke-placeholder'])delete f.name;}}});}});})();CKEDITOR.plugins.placeholder={createPlaceholder:function(a,b,c,d){var e=new CKEDITOR.dom.element('span',a.document);e.setAttributes({contentEditable:'false','data-cke-placeholder':1,'class':'cke_placeholder'});c&&e.setText(c);if(d)return e.getOuterHtml();if(b){if(CKEDITOR.env.ie){e.insertAfter(b);setTimeout(function(){b.remove();e.focus();},10);}else e.replace(b);}else a.insertElement(e);return null;},getSelectedPlaceHoder:function(a){var b=a.getSelection().getRanges()[0];b.shrink(CKEDITOR.SHRINK_TEXT);var c=b.startContainer;while(c&&!(c.type==CKEDITOR.NODE_ELEMENT&&c.data('cke-placeholder')))c=c.getParent();return c;}};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function(){var a=/\[\[[^\]]+\]\]/g;CKEDITOR.plugins.add('placeholder',{requires:['dialog'],lang:['bg','cs','cy','da','de','el','en','eo','et','fa','fi','fr','he','hr','it','nb','nl','no','pl','pt-br','tr','ug','uk','vi','zh-cn'],init:function(b){var c=b.lang.placeholder;b.addCommand('createplaceholder',new CKEDITOR.dialogCommand('createplaceholder'));b.addCommand('editplaceholder',new CKEDITOR.dialogCommand('editplaceholder'));b.ui.addButton('CreatePlaceholder',{label:c.toolbar,command:'createplaceholder',icon:this.path+'placeholder.gif'});if(b.addMenuItems){b.addMenuGroup('placeholder',20);b.addMenuItems({editplaceholder:{label:c.edit,command:'editplaceholder',group:'placeholder',order:1,icon:this.path+'placeholder.gif'}});if(b.contextMenu)b.contextMenu.addListener(function(d,e){if(!d||!d.data('cke-placeholder'))return null;return{editplaceholder:CKEDITOR.TRISTATE_OFF};});}b.on('doubleclick',function(d){if(CKEDITOR.plugins.placeholder.getSelectedPlaceHoder(b))d.data.dialog='editplaceholder';});b.addCss('.cke_placeholder{background-color: #ffff00;'+(CKEDITOR.env.gecko?'cursor: default;':'')+'}');b.on('contentDom',function(){b.document.getBody().on('resizestart',function(d){if(b.getSelection().getSelectedElement().data('cke-placeholder'))d.data.preventDefault();});});CKEDITOR.dialog.add('createplaceholder',this.path+'dialogs/placeholder.js');CKEDITOR.dialog.add('editplaceholder',this.path+'dialogs/placeholder.js');},afterInit:function(b){var c=b.dataProcessor,d=c&&c.dataFilter,e=c&&c.htmlFilter;if(d)d.addRules({text:function(f){return f.replace(a,function(g){return CKEDITOR.plugins.placeholder.createPlaceholder(b,null,g,1);});}});if(e)e.addRules({elements:{span:function(f){if(f.attributes&&f.attributes['data-cke-placeholder'])delete f.name;}}});}});})();CKEDITOR.plugins.placeholder={createPlaceholder:function(a,b,c,d){var e=new CKEDITOR.dom.element('span',a.document);e.setAttributes({contentEditable:'false','data-cke-placeholder':1,'class':'cke_placeholder'});c&&e.setText(c);if(d)return e.getOuterHtml();if(b){if(CKEDITOR.env.ie){e.insertAfter(b);setTimeout(function(){b.remove();e.focus();},10);}else e.replace(b);}else a.insertElement(e);return null;},getSelectedPlaceHoder:function(a){var b=a.getSelection().getRanges()[0];b.shrink(CKEDITOR.SHRINK_TEXT);var c=b.startContainer;while(c&&!(c.type==CKEDITOR.NODE_ELEMENT&&c.data('cke-placeholder')))c=c.getParent();return c;}};
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/preview/preview.html b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/preview/preview.html
index d6c4937..5745b7a 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/preview/preview.html
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/preview/preview.html
@@ -1,10 +1,10 @@
-<script>
-
-var doc = document;
-doc.open();
-doc.write( window.opener._cke_htmlToLoad );
-doc.close();
-
-delete window.opener._cke_htmlToLoad;
-
-</script>
+<script>
+
+var doc = document;
+doc.open();
+doc.write( window.opener._cke_htmlToLoad );
+doc.close();
+
+delete window.opener._cke_htmlToLoad;
+
+</script>
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/scayt/dialogs/options.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/scayt/dialogs/options.js
index d428963..9eb1475 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/scayt/dialogs/options.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/scayt/dialogs/options.js
@@ -1,8 +1,8 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.dialog.add('scaytcheck',function(a){var b=true,c,d=CKEDITOR.document,e=a.name,f=CKEDITOR.plugins.scayt.getUiTabs(a),g,h=[],i=0,j=['dic_create_'+e+',dic_restore_'+e,'dic_rename_'+e+',dic_delete_'+e],k=['mixedCase','mixedWithDigits','allCaps','ignoreDomainNames'];function l(){if(typeof document.forms['optionsbar_'+e]!='undefined')return document.forms['optionsbar_'+e].options;return[];};function m(){if(typeof document.forms['languagesbar_'+e]!='undefined')return document.forms['languagesbar_'+e].scayt_lang;return[];};function n(z,A){if(!z)return;var B=z.length;if(B==undefined){z.checked=z.value==A.toString();return;}for(var C=0;C<B;C++){z[C].checked=false;if(z[C].value==A.toString())z[C].checked=true;}};var o=a.lang.scayt,p=[{id:'options',label:o.optionsTab,elements:[{type:'html',id:'options',html:'<form name="optionsbar_'+e+'"><div class="inner_options">'+'\t<div class="messagebox"></div>'+'\t<div style="display:none;">'+'\t\t<input type="checkbox" name="options" id="allCaps_'+e+'" />'+'\t\t<label for="allCaps" id="label_allCaps_'+e+'"></label>'+'\t</div>'+'\t<div style="display:none;">'+'\t\t<input name="options" type="checkbox" id="ignoreDomainNames_'+e+'" />'+'\t\t<label for="ignoreDomainNames" id="label_ignoreDomainNames_'+e+'"></label>'+'\t</div>'+'\t<div style="display:none;">'+'\t<input name="options" type="checkbox" id="mixedCase_'+e+'" />'+'\t\t<label for="mixedCase" id="label_mixedCase_'+e+'"></label>'+'\t</div>'+'\t<div style="display:none;">'+'\t\t<input name="options" type="checkbox" id="mixedWithDigits_'+e+'" />'+'\t\t<label for="mixedWithDigits" id="label_mixedWithDigits_'+e+'"></label>'+'\t</div>'+'</div></form>'}]},{id:'langs',label:o.languagesTab,elements:[{type:'html',id:'langs',html:'<form name="languagesbar_'+e+'"><div class="inner_langs">'+'\t<div class="messagebox"></div>\t'+' <div style="float:left;width:45%;margin-left:5px;" id="scayt_lcol_'+e+'" ></div>'+' <div style="float:left;width:45%;margin-left:15px;" id="scayt_rcol_'+e+'"></div>'+'</div></form>'}]},{id:'dictionaries',label:o.dictionariesTab,elements:[{type:'html',style:'',id:'dictionaries',html:'<form name="dictionarybar_'+e+'"><div class="inner_dictionary" style="text-align:left; white-space:normal; width:320px; overflow: hidden;">'+'\t<div style="margin:5px auto; width:80%;white-space:normal; overflow:hidden;" id="dic_message_'+e+'"> </div>'+'\t<div style="margin:5px auto; width:80%;white-space:normal;"> '+' <span class="cke_dialog_ui_labeled_label" >Dictionary name</span><br>'+'\t\t<span class="cke_dialog_ui_labeled_content" >'+'\t\t\t<div class="cke_dialog_ui_input_text">'+'\t\t\t\t<input id="dic_name_'+e+'" type="text" class="cke_dialog_ui_input_text"/>'+'\t\t</div></span></div>'+'\t\t<div style="margin:5px auto; width:80%;white-space:normal;">'+'\t\t\t<a style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_create_'+e+'">'+'\t\t\t\t</a>'+'\t\t\t<a style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_delete_'+e+'">'+'\t\t\t\t</a>'+'\t\t\t<a style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_rename_'+e+'">'+'\t\t\t\t</a>'+'\t\t\t<a style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_restore_'+e+'">'+'\t\t\t\t</a>'+'\t\t</div>'+'\t<div style="margin:5px auto; width:95%;white-space:normal;" id="dic_info_'+e+'"></div>'+'</div></form>'}]},{id:'about',label:o.aboutTab,elements:[{type:'html',id:'about',style:'margin: 5px 5px;',html:'<div id="scayt_about_'+e+'"></div>'}]}],q={title:o.title,minWidth:360,minHeight:220,onShow:function(){var z=this;
-z.data=a.fire('scaytDialog',{});z.options=z.data.scayt_control.option();z.chosed_lang=z.sLang=z.data.scayt_control.sLang;if(!z.data||!z.data.scayt||!z.data.scayt_control){alert('Error loading application service');z.hide();return;}var A=0;if(b)z.data.scayt.getCaption(a.langCode||'en',function(B){if(A++>0)return;c=B;s.apply(z);t.apply(z);b=false;});else t.apply(z);z.selectPage(z.data.tab);},onOk:function(){var z=this.data.scayt_control;z.option(this.options);var A=this.chosed_lang;z.setLang(A);z.refresh();},onCancel:function(){var z=l();for(var A in z)z[A].checked=false;n(m(),'');},contents:h},r=CKEDITOR.plugins.scayt.getScayt(a);for(g=0;g<f.length;g++){if(f[g]==1)h[h.length]=p[g];}if(f[2]==1)i=1;var s=function(){var z=this,A=z.data.scayt.getLangList(),B=['dic_create','dic_delete','dic_rename','dic_restore'],C=[],D=[],E=k,F;if(i){for(F=0;F<B.length;F++){C[F]=B[F]+'_'+e;d.getById(C[F]).setHtml('<span class="cke_dialog_ui_button">'+c['button_'+B[F]]+'</span>');}d.getById('dic_info_'+e).setHtml(c.dic_info);}if(f[0]==1)for(F in E){var G='label_'+E[F],H=G+'_'+e,I=d.getById(H);if('undefined'!=typeof I&&'undefined'!=typeof c[G]&&'undefined'!=typeof z.options[E[F]]){I.setHtml(c[G]);var J=I.getParent();J.$.style.display='block';}}var K='<p><img src="'+window.scayt.getAboutInfo().logoURL+'" /></p>'+'<p>'+c.version+window.scayt.getAboutInfo().version.toString()+'</p>'+'<p>'+c.about_throwt_copy+'</p>';d.getById('scayt_about_'+e).setHtml(K);var L=function(U,V){var W=d.createElement('label');W.setAttribute('for','cke_option'+U);W.setHtml(V[U]);if(z.sLang==U)z.chosed_lang=U;var X=d.createElement('div'),Y=CKEDITOR.dom.element.createFromHtml('<input id="cke_option'+U+'" type="radio" '+(z.sLang==U?'checked="checked"':'')+' value="'+U+'" name="scayt_lang" />');Y.on('click',function(){this.$.checked=true;z.chosed_lang=U;});X.append(Y);X.append(W);return{lang:V[U],code:U,radio:X};};if(f[1]==1){for(F in A.rtl)D[D.length]=L(F,A.ltr);for(F in A.ltr)D[D.length]=L(F,A.ltr);D.sort(function(U,V){return V.lang>U.lang?-1:1;});var M=d.getById('scayt_lcol_'+e),N=d.getById('scayt_rcol_'+e);for(F=0;F<D.length;F++){var O=F<D.length/2?M:N;O.append(D[F].radio);}}var P={};P.dic_create=function(U,V,W){var X=W[0]+','+W[1],Y=c.err_dic_create,Z=c.succ_dic_create;window.scayt.createUserDictionary(V,function(aa){x(X);w(W[1]);Z=Z.replace('%s',aa.dname);v(Z);},function(aa){Y=Y.replace('%s',aa.dname);u(Y+'( '+(aa.message||'')+')');});};P.dic_rename=function(U,V){var W=c.err_dic_rename||'',X=c.succ_dic_rename||'';
-window.scayt.renameUserDictionary(V,function(Y){X=X.replace('%s',Y.dname);y(V);v(X);},function(Y){W=W.replace('%s',Y.dname);y(V);u(W+'( '+(Y.message||'')+' )');});};P.dic_delete=function(U,V,W){var X=W[0]+','+W[1],Y=c.err_dic_delete,Z=c.succ_dic_delete;window.scayt.deleteUserDictionary(function(aa){Z=Z.replace('%s',aa.dname);x(X);w(W[0]);y('');v(Z);},function(aa){Y=Y.replace('%s',aa.dname);u(Y);});};P.dic_restore=z.dic_restore||(function(U,V,W){var X=W[0]+','+W[1],Y=c.err_dic_restore,Z=c.succ_dic_restore;window.scayt.restoreUserDictionary(V,function(aa){Z=Z.replace('%s',aa.dname);x(X);w(W[1]);v(Z);},function(aa){Y=Y.replace('%s',aa.dname);u(Y);});});function Q(U){var V=d.getById('dic_name_'+e).getValue();if(!V){u(' Dictionary name should not be empty. ');return false;}try{var W=U.data.getTarget().getParent(),X=/(dic_\w+)_[\w\d]+/.exec(W.getId())[1];P[X].apply(null,[W,V,j]);}catch(Y){u(' Dictionary error. ');}return true;};var R=(j[0]+','+j[1]).split(','),S;for(F=0,S=R.length;F<S;F+=1){var T=d.getById(R[F]);if(T)T.on('click',Q,this);}},t=function(){var z=this;if(f[0]==1){var A=l();for(var B=0,C=A.length;B<C;B++){var D=A[B].id,E=d.getById(D);if(E){A[B].checked=false;if(z.options[D.split('_')[0]]==1)A[B].checked=true;if(b)E.on('click',function(){z.options[this.getId().split('_')[0]]=this.$.checked?1:0;});}}}if(f[1]==1){var F=d.getById('cke_option'+z.sLang);n(F.$,z.sLang);}if(i){window.scayt.getNameUserDictionary(function(G){var H=G.dname;x(j[0]+','+j[1]);if(H){d.getById('dic_name_'+e).setValue(H);w(j[1]);}else w(j[0]);},function(){d.getById('dic_name_'+e).setValue('');});v('');}};function u(z){d.getById('dic_message_'+e).setHtml('<span style="color:red;">'+z+'</span>');};function v(z){d.getById('dic_message_'+e).setHtml('<span style="color:blue;">'+z+'</span>');};function w(z){z=String(z);var A=z.split(',');for(var B=0,C=A.length;B<C;B+=1)d.getById(A[B]).$.style.display='inline';};function x(z){z=String(z);var A=z.split(',');for(var B=0,C=A.length;B<C;B+=1)d.getById(A[B]).$.style.display='none';};function y(z){d.getById('dic_name_'+e).$.value=z;};return q;});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.dialog.add('scaytcheck',function(a){var b=true,c,d=CKEDITOR.document,e=a.name,f=CKEDITOR.plugins.scayt.getUiTabs(a),g,h=[],i=0,j=['dic_create_'+e+',dic_restore_'+e,'dic_rename_'+e+',dic_delete_'+e],k=['mixedCase','mixedWithDigits','allCaps','ignoreDomainNames'];function l(){if(typeof document.forms['optionsbar_'+e]!='undefined')return document.forms['optionsbar_'+e].options;return[];};function m(){if(typeof document.forms['languagesbar_'+e]!='undefined')return document.forms['languagesbar_'+e].scayt_lang;return[];};function n(z,A){if(!z)return;var B=z.length;if(B==undefined){z.checked=z.value==A.toString();return;}for(var C=0;C<B;C++){z[C].checked=false;if(z[C].value==A.toString())z[C].checked=true;}};var o=a.lang.scayt,p=[{id:'options',label:o.optionsTab,elements:[{type:'html',id:'options',html:'<form name="optionsbar_'+e+'"><div class="inner_options">'+'\t<div class="messagebox"></div>'+'\t<div style="display:none;">'+'\t\t<input type="checkbox" name="options" id="allCaps_'+e+'" />'+'\t\t<label for="allCaps" id="label_allCaps_'+e+'"></label>'+'\t</div>'+'\t<div style="display:none;">'+'\t\t<input name="options" type="checkbox" id="ignoreDomainNames_'+e+'" />'+'\t\t<label for="ignoreDomainNames" id="label_ignoreDomainNames_'+e+'"></label>'+'\t</div>'+'\t<div style="display:none;">'+'\t<input name="options" type="checkbox" id="mixedCase_'+e+'" />'+'\t\t<label for="mixedCase" id="label_mixedCase_'+e+'"></label>'+'\t</div>'+'\t<div style="display:none;">'+'\t\t<input name="options" type="checkbox" id="mixedWithDigits_'+e+'" />'+'\t\t<label for="mixedWithDigits" id="label_mixedWithDigits_'+e+'"></label>'+'\t</div>'+'</div></form>'}]},{id:'langs',label:o.languagesTab,elements:[{type:'html',id:'langs',html:'<form name="languagesbar_'+e+'"><div class="inner_langs">'+'\t<div class="messagebox"></div>\t'+' <div style="float:left;width:45%;margin-left:5px;" id="scayt_lcol_'+e+'" ></div>'+' <div style="float:left;width:45%;margin-left:15px;" id="scayt_rcol_'+e+'"></div>'+'</div></form>'}]},{id:'dictionaries',label:o.dictionariesTab,elements:[{type:'html',style:'',id:'dictionaries',html:'<form name="dictionarybar_'+e+'"><div class="inner_dictionary" style="text-align:left; white-space:normal; width:320px; overflow: hidden;">'+'\t<div style="margin:5px auto; width:80%;white-space:normal; overflow:hidden;" id="dic_message_'+e+'"> </div>'+'\t<div style="margin:5px auto; width:80%;white-space:normal;"> '+' <span class="cke_dialog_ui_labeled_label" >Dictionary name</span><br>'+'\t\t<span class="cke_dialog_ui_labeled_content" >'+'\t\t\t<div class="cke_dialog_ui_input_text">'+'\t\t\t\t<input id="dic_name_'+e+'" type="text" class="cke_dialog_ui_input_text"/>'+'\t\t</div></span></div>'+'\t\t<div style="margin:5px auto; width:80%;white-space:normal;">'+'\t\t\t<a style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_create_'+e+'">'+'\t\t\t\t</a>'+'\t\t\t<a style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_delete_'+e+'">'+'\t\t\t\t</a>'+'\t\t\t<a style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_rename_'+e+'">'+'\t\t\t\t</a>'+'\t\t\t<a style="display:none;" class="cke_dialog_ui_button" href="javascript:void(0)" id="dic_restore_'+e+'">'+'\t\t\t\t</a>'+'\t\t</div>'+'\t<div style="margin:5px auto; width:95%;white-space:normal;" id="dic_info_'+e+'"></div>'+'</div></form>'}]},{id:'about',label:o.aboutTab,elements:[{type:'html',id:'about',style:'margin: 5px 5px;',html:'<div id="scayt_about_'+e+'"></div>'}]}],q={title:o.title,minWidth:360,minHeight:220,onShow:function(){var z=this;
+z.data=a.fire('scaytDialog',{});z.options=z.data.scayt_control.option();z.chosed_lang=z.sLang=z.data.scayt_control.sLang;if(!z.data||!z.data.scayt||!z.data.scayt_control){alert('Error loading application service');z.hide();return;}var A=0;if(b)z.data.scayt.getCaption(a.langCode||'en',function(B){if(A++>0)return;c=B;s.apply(z);t.apply(z);b=false;});else t.apply(z);z.selectPage(z.data.tab);},onOk:function(){var z=this.data.scayt_control;z.option(this.options);var A=this.chosed_lang;z.setLang(A);z.refresh();},onCancel:function(){var z=l();for(var A in z)z[A].checked=false;n(m(),'');},contents:h},r=CKEDITOR.plugins.scayt.getScayt(a);for(g=0;g<f.length;g++){if(f[g]==1)h[h.length]=p[g];}if(f[2]==1)i=1;var s=function(){var z=this,A=z.data.scayt.getLangList(),B=['dic_create','dic_delete','dic_rename','dic_restore'],C=[],D=[],E=k,F;if(i){for(F=0;F<B.length;F++){C[F]=B[F]+'_'+e;d.getById(C[F]).setHtml('<span class="cke_dialog_ui_button">'+c['button_'+B[F]]+'</span>');}d.getById('dic_info_'+e).setHtml(c.dic_info);}if(f[0]==1)for(F in E){var G='label_'+E[F],H=G+'_'+e,I=d.getById(H);if('undefined'!=typeof I&&'undefined'!=typeof c[G]&&'undefined'!=typeof z.options[E[F]]){I.setHtml(c[G]);var J=I.getParent();J.$.style.display='block';}}var K='<p><img src="'+window.scayt.getAboutInfo().logoURL+'" /></p>'+'<p>'+c.version+window.scayt.getAboutInfo().version.toString()+'</p>'+'<p>'+c.about_throwt_copy+'</p>';d.getById('scayt_about_'+e).setHtml(K);var L=function(U,V){var W=d.createElement('label');W.setAttribute('for','cke_option'+U);W.setHtml(V[U]);if(z.sLang==U)z.chosed_lang=U;var X=d.createElement('div'),Y=CKEDITOR.dom.element.createFromHtml('<input id="cke_option'+U+'" type="radio" '+(z.sLang==U?'checked="checked"':'')+' value="'+U+'" name="scayt_lang" />');Y.on('click',function(){this.$.checked=true;z.chosed_lang=U;});X.append(Y);X.append(W);return{lang:V[U],code:U,radio:X};};if(f[1]==1){for(F in A.rtl)D[D.length]=L(F,A.ltr);for(F in A.ltr)D[D.length]=L(F,A.ltr);D.sort(function(U,V){return V.lang>U.lang?-1:1;});var M=d.getById('scayt_lcol_'+e),N=d.getById('scayt_rcol_'+e);for(F=0;F<D.length;F++){var O=F<D.length/2?M:N;O.append(D[F].radio);}}var P={};P.dic_create=function(U,V,W){var X=W[0]+','+W[1],Y=c.err_dic_create,Z=c.succ_dic_create;window.scayt.createUserDictionary(V,function(aa){x(X);w(W[1]);Z=Z.replace('%s',aa.dname);v(Z);},function(aa){Y=Y.replace('%s',aa.dname);u(Y+'( '+(aa.message||'')+')');});};P.dic_rename=function(U,V){var W=c.err_dic_rename||'',X=c.succ_dic_rename||'';
+window.scayt.renameUserDictionary(V,function(Y){X=X.replace('%s',Y.dname);y(V);v(X);},function(Y){W=W.replace('%s',Y.dname);y(V);u(W+'( '+(Y.message||'')+' )');});};P.dic_delete=function(U,V,W){var X=W[0]+','+W[1],Y=c.err_dic_delete,Z=c.succ_dic_delete;window.scayt.deleteUserDictionary(function(aa){Z=Z.replace('%s',aa.dname);x(X);w(W[0]);y('');v(Z);},function(aa){Y=Y.replace('%s',aa.dname);u(Y);});};P.dic_restore=z.dic_restore||(function(U,V,W){var X=W[0]+','+W[1],Y=c.err_dic_restore,Z=c.succ_dic_restore;window.scayt.restoreUserDictionary(V,function(aa){Z=Z.replace('%s',aa.dname);x(X);w(W[1]);v(Z);},function(aa){Y=Y.replace('%s',aa.dname);u(Y);});});function Q(U){var V=d.getById('dic_name_'+e).getValue();if(!V){u(' Dictionary name should not be empty. ');return false;}try{var W=U.data.getTarget().getParent(),X=/(dic_\w+)_[\w\d]+/.exec(W.getId())[1];P[X].apply(null,[W,V,j]);}catch(Y){u(' Dictionary error. ');}return true;};var R=(j[0]+','+j[1]).split(','),S;for(F=0,S=R.length;F<S;F+=1){var T=d.getById(R[F]);if(T)T.on('click',Q,this);}},t=function(){var z=this;if(f[0]==1){var A=l();for(var B=0,C=A.length;B<C;B++){var D=A[B].id,E=d.getById(D);if(E){A[B].checked=false;if(z.options[D.split('_')[0]]==1)A[B].checked=true;if(b)E.on('click',function(){z.options[this.getId().split('_')[0]]=this.$.checked?1:0;});}}}if(f[1]==1){var F=d.getById('cke_option'+z.sLang);n(F.$,z.sLang);}if(i){window.scayt.getNameUserDictionary(function(G){var H=G.dname;x(j[0]+','+j[1]);if(H){d.getById('dic_name_'+e).setValue(H);w(j[1]);}else w(j[0]);},function(){d.getById('dic_name_'+e).setValue('');});v('');}};function u(z){d.getById('dic_message_'+e).setHtml('<span style="color:red;">'+z+'</span>');};function v(z){d.getById('dic_message_'+e).setHtml('<span style="color:blue;">'+z+'</span>');};function w(z){z=String(z);var A=z.split(',');for(var B=0,C=A.length;B<C;B+=1)d.getById(A[B]).$.style.display='inline';};function x(z){z=String(z);var A=z.split(',');for(var B=0,C=A.length;B<C;B+=1)d.getById(A[B]).$.style.display='none';};function y(z){d.getById('dic_name_'+e).$.value=z;};return q;});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/scayt/dialogs/toolbar.css b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/scayt/dialogs/toolbar.css
index dcbed3c..e2c305b 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/scayt/dialogs/toolbar.css
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/scayt/dialogs/toolbar.css
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-a{text-decoration:none;padding:2px 4px 4px 6px;display:block;border-width:1px;border-style:solid;margin:0;}a.cke_scayt_toogle:hover,a.cke_scayt_toogle:focus,a.cke_scayt_toogle:active{border-color:#316ac5;background-color:#dff1ff;color:#000;cursor:pointer;margin:0;}a.cke_scayt_toogle{color:#316ac5;border-color:#fff;}.scayt_enabled a.cke_scayt_item{color:#316ac5;border-color:#fff;margin:0;}.scayt_disabled a.cke_scayt_item{color:gray;border-color:#fff;}.scayt_enabled a.cke_scayt_item:hover,.scayt_enabled a.cke_scayt_item:focus,.scayt_enabled a.cke_scayt_item:active{border-color:#316ac5;background-color:#dff1ff;color:#000;cursor:pointer;}.scayt_disabled a.cke_scayt_item:hover,.scayt_disabled a.cke_scayt_item:focus,.scayt_disabled a.cke_scayt_item:active{border-color:gray;background-color:#dff1ff;color:gray;cursor:no-drop;}.cke_scayt_set_on,.cke_scayt_set_off{display:none;}.scayt_enabled .cke_scayt_set_on{display:none;}.scayt_disabled .cke_scayt_set_on{display:inline;}.scayt_disabled .cke_scayt_set_off{display:none;}.scayt_enabled .cke_scayt_set_off{display:inline;}
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+a{text-decoration:none;padding:2px 4px 4px 6px;display:block;border-width:1px;border-style:solid;margin:0;}a.cke_scayt_toogle:hover,a.cke_scayt_toogle:focus,a.cke_scayt_toogle:active{border-color:#316ac5;background-color:#dff1ff;color:#000;cursor:pointer;margin:0;}a.cke_scayt_toogle{color:#316ac5;border-color:#fff;}.scayt_enabled a.cke_scayt_item{color:#316ac5;border-color:#fff;margin:0;}.scayt_disabled a.cke_scayt_item{color:gray;border-color:#fff;}.scayt_enabled a.cke_scayt_item:hover,.scayt_enabled a.cke_scayt_item:focus,.scayt_enabled a.cke_scayt_item:active{border-color:#316ac5;background-color:#dff1ff;color:#000;cursor:pointer;}.scayt_disabled a.cke_scayt_item:hover,.scayt_disabled a.cke_scayt_item:focus,.scayt_disabled a.cke_scayt_item:active{border-color:gray;background-color:#dff1ff;color:gray;cursor:no-drop;}.cke_scayt_set_on,.cke_scayt_set_off{display:none;}.scayt_enabled .cke_scayt_set_on{display:none;}.scayt_disabled .cke_scayt_set_on{display:inline;}.scayt_disabled .cke_scayt_set_off{display:none;}.scayt_enabled .cke_scayt_set_off{display:inline;}
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/smiley/dialogs/smiley.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/smiley/dialogs/smiley.js
index a1a1968..aa7d28b 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/smiley/dialogs/smiley.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/smiley/dialogs/smiley.js
@@ -1,7 +1,7 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.dialog.add('smiley',function(a){var b=a.config,c=a.lang.smiley,d=b.smiley_images,e=b.smiley_columns||8,f,g,h=function(o){var p=o.data.getTarget(),q=p.getName();if(q=='a')p=p.getChild(0);else if(q!='img')return;var r=p.getAttribute('cke_src'),s=p.getAttribute('title'),t=a.document.createElement('img',{attributes:{src:r,'data-cke-saved-src':r,title:s,alt:s,width:p.$.width,height:p.$.height}});a.insertElement(t);g.hide();o.data.preventDefault();},i=CKEDITOR.tools.addFunction(function(o,p){o=new CKEDITOR.dom.event(o);p=new CKEDITOR.dom.element(p);var q,r,s=o.getKeystroke(),t=a.lang.dir=='rtl';switch(s){case 38:if(q=p.getParent().getParent().getPrevious()){r=q.getChild([p.getParent().getIndex(),0]);r.focus();}o.preventDefault();break;case 40:if(q=p.getParent().getParent().getNext()){r=q.getChild([p.getParent().getIndex(),0]);if(r)r.focus();}o.preventDefault();break;case 32:h({data:o});o.preventDefault();break;case t?37:39:case 9:if(q=p.getParent().getNext()){r=q.getChild(0);r.focus();o.preventDefault(true);}else if(q=p.getParent().getParent().getNext()){r=q.getChild([0,0]);if(r)r.focus();o.preventDefault(true);}break;case t?39:37:case CKEDITOR.SHIFT+9:if(q=p.getParent().getPrevious()){r=q.getChild(0);r.focus();o.preventDefault(true);}else if(q=p.getParent().getParent().getPrevious()){r=q.getLast().getChild(0);r.focus();o.preventDefault(true);}break;default:return;}}),j=CKEDITOR.tools.getNextId()+'_smiley_emtions_label',k=['<div><span id="'+j+'" class="cke_voice_label">'+c.options+'</span>','<table role="listbox" aria-labelledby="'+j+'" style="width:100%;height:100%" cellspacing="2" cellpadding="2"',CKEDITOR.env.ie&&CKEDITOR.env.quirks?' style="position:absolute;"':'','><tbody>'],l=d.length;for(f=0;f<l;f++){if(f%e===0)k.push('<tr>');var m='cke_smile_label_'+f+'_'+CKEDITOR.tools.getNextNumber();k.push('<td class="cke_dark_background cke_centered" style="vertical-align: middle;"><a href="javascript:void(0)" role="option"',' aria-posinset="'+(f+1)+'"',' aria-setsize="'+l+'"',' aria-labelledby="'+m+'"',' class="cke_smile cke_hand" tabindex="-1" onkeydown="CKEDITOR.tools.callFunction( ',i,', event, this );">','<img class="cke_hand" title="',b.smiley_descriptions[f],'" cke_src="',CKEDITOR.tools.htmlEncode(b.smiley_path+d[f]),'" alt="',b.smiley_descriptions[f],'"',' src="',CKEDITOR.tools.htmlEncode(b.smiley_path+d[f]),'"',CKEDITOR.env.ie?" onload=\"this.setAttribute('width', 2); this.removeAttribute('width');\" ":'','><span id="'+m+'" class="cke_voice_label">'+b.smiley_descriptions[f]+'</span>'+'</a>','</td>');
-if(f%e==e-1)k.push('</tr>');}if(f<e-1){for(;f<e-1;f++)k.push('<td></td>');k.push('</tr>');}k.push('</tbody></table></div>');var n={type:'html',id:'smileySelector',html:k.join(''),onLoad:function(o){g=o.sender;},focus:function(){var o=this;setTimeout(function(){var p=o.getElement().getElementsByTag('a').getItem(0);p.focus();},0);},onClick:h,style:'width: 100%; border-collapse: separate;'};return{title:a.lang.smiley.title,minWidth:270,minHeight:120,contents:[{id:'tab1',label:'',title:'',expand:true,padding:0,elements:[n]}],buttons:[CKEDITOR.dialog.cancelButton]};});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.dialog.add('smiley',function(a){var b=a.config,c=a.lang.smiley,d=b.smiley_images,e=b.smiley_columns||8,f,g,h=function(o){var p=o.data.getTarget(),q=p.getName();if(q=='a')p=p.getChild(0);else if(q!='img')return;var r=p.getAttribute('cke_src'),s=p.getAttribute('title'),t=a.document.createElement('img',{attributes:{src:r,'data-cke-saved-src':r,title:s,alt:s,width:p.$.width,height:p.$.height}});a.insertElement(t);g.hide();o.data.preventDefault();},i=CKEDITOR.tools.addFunction(function(o,p){o=new CKEDITOR.dom.event(o);p=new CKEDITOR.dom.element(p);var q,r,s=o.getKeystroke(),t=a.lang.dir=='rtl';switch(s){case 38:if(q=p.getParent().getParent().getPrevious()){r=q.getChild([p.getParent().getIndex(),0]);r.focus();}o.preventDefault();break;case 40:if(q=p.getParent().getParent().getNext()){r=q.getChild([p.getParent().getIndex(),0]);if(r)r.focus();}o.preventDefault();break;case 32:h({data:o});o.preventDefault();break;case t?37:39:case 9:if(q=p.getParent().getNext()){r=q.getChild(0);r.focus();o.preventDefault(true);}else if(q=p.getParent().getParent().getNext()){r=q.getChild([0,0]);if(r)r.focus();o.preventDefault(true);}break;case t?39:37:case CKEDITOR.SHIFT+9:if(q=p.getParent().getPrevious()){r=q.getChild(0);r.focus();o.preventDefault(true);}else if(q=p.getParent().getParent().getPrevious()){r=q.getLast().getChild(0);r.focus();o.preventDefault(true);}break;default:return;}}),j=CKEDITOR.tools.getNextId()+'_smiley_emtions_label',k=['<div><span id="'+j+'" class="cke_voice_label">'+c.options+'</span>','<table role="listbox" aria-labelledby="'+j+'" style="width:100%;height:100%" cellspacing="2" cellpadding="2"',CKEDITOR.env.ie&&CKEDITOR.env.quirks?' style="position:absolute;"':'','><tbody>'],l=d.length;for(f=0;f<l;f++){if(f%e===0)k.push('<tr>');var m='cke_smile_label_'+f+'_'+CKEDITOR.tools.getNextNumber();k.push('<td class="cke_dark_background cke_centered" style="vertical-align: middle;"><a href="javascript:void(0)" role="option"',' aria-posinset="'+(f+1)+'"',' aria-setsize="'+l+'"',' aria-labelledby="'+m+'"',' class="cke_smile cke_hand" tabindex="-1" onkeydown="CKEDITOR.tools.callFunction( ',i,', event, this );">','<img class="cke_hand" title="',b.smiley_descriptions[f],'" cke_src="',CKEDITOR.tools.htmlEncode(b.smiley_path+d[f]),'" alt="',b.smiley_descriptions[f],'"',' src="',CKEDITOR.tools.htmlEncode(b.smiley_path+d[f]),'"',CKEDITOR.env.ie?" onload=\"this.setAttribute('width', 2); this.removeAttribute('width');\" ":'','><span id="'+m+'" class="cke_voice_label">'+b.smiley_descriptions[f]+'</span>'+'</a>','</td>');
+if(f%e==e-1)k.push('</tr>');}if(f<e-1){for(;f<e-1;f++)k.push('<td></td>');k.push('</tr>');}k.push('</tbody></table></div>');var n={type:'html',id:'smileySelector',html:k.join(''),onLoad:function(o){g=o.sender;},focus:function(){var o=this;setTimeout(function(){var p=o.getElement().getElementsByTag('a').getItem(0);p.focus();},0);},onClick:h,style:'width: 100%; border-collapse: separate;'};return{title:a.lang.smiley.title,minWidth:270,minHeight:120,contents:[{id:'tab1',label:'',title:'',expand:true,padding:0,elements:[n]}],buttons:[CKEDITOR.dialog.cancelButton]};});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/dialogs/specialchar.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/dialogs/specialchar.js
index ac19d18..94c4505 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/dialogs/specialchar.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/dialogs/specialchar.js
@@ -1,7 +1,7 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.dialog.add('specialchar',function(a){var b,c=a.lang.specialChar,d=function(j){var k,l;if(j.data)k=j.data.getTarget();else k=new CKEDITOR.dom.element(j);if(k.getName()=='a'&&(l=k.getChild(0).getHtml())){k.removeClass('cke_light_background');b.hide();var m=a.document.createElement('span');m.setHtml(l);a.insertText(m.getText());}},e=CKEDITOR.tools.addFunction(d),f,g=function(j,k){var l;k=k||j.data.getTarget();if(k.getName()=='span')k=k.getParent();if(k.getName()=='a'&&(l=k.getChild(0).getHtml())){if(f)h(null,f);var m=b.getContentElement('info','htmlPreview').getElement();b.getContentElement('info','charPreview').getElement().setHtml(l);m.setHtml(CKEDITOR.tools.htmlEncode(l));k.getParent().addClass('cke_light_background');f=k;}},h=function(j,k){k=k||j.data.getTarget();if(k.getName()=='span')k=k.getParent();if(k.getName()=='a'){b.getContentElement('info','charPreview').getElement().setHtml(' ');b.getContentElement('info','htmlPreview').getElement().setHtml(' ');k.getParent().removeClass('cke_light_background');f=undefined;}},i=CKEDITOR.tools.addFunction(function(j){j=new CKEDITOR.dom.event(j);var k=j.getTarget(),l,m,n=j.getKeystroke(),o=a.lang.dir=='rtl';switch(n){case 38:if(l=k.getParent().getParent().getPrevious()){m=l.getChild([k.getParent().getIndex(),0]);m.focus();h(null,k);g(null,m);}j.preventDefault();break;case 40:if(l=k.getParent().getParent().getNext()){m=l.getChild([k.getParent().getIndex(),0]);if(m&&m.type==1){m.focus();h(null,k);g(null,m);}}j.preventDefault();break;case 32:d({data:j});j.preventDefault();break;case o?37:39:case 9:if(l=k.getParent().getNext()){m=l.getChild(0);if(m.type==1){m.focus();h(null,k);g(null,m);j.preventDefault(true);}else h(null,k);}else if(l=k.getParent().getParent().getNext()){m=l.getChild([0,0]);if(m&&m.type==1){m.focus();h(null,k);g(null,m);j.preventDefault(true);}else h(null,k);}break;case o?39:37:case CKEDITOR.SHIFT+9:if(l=k.getParent().getPrevious()){m=l.getChild(0);m.focus();h(null,k);g(null,m);j.preventDefault(true);}else if(l=k.getParent().getParent().getPrevious()){m=l.getLast().getChild(0);m.focus();h(null,k);g(null,m);j.preventDefault(true);}else h(null,k);break;default:return;}});return{title:c.title,minWidth:430,minHeight:280,buttons:[CKEDITOR.dialog.cancelButton],charColumns:17,onLoad:function(){var j=this.definition.charColumns,k=a.config.extraSpecialChars,l=a.config.specialChars,m=CKEDITOR.tools.getNextId()+'_specialchar_table_label',n=['<table role="listbox" aria-labelledby="'+m+'"'+' style="width: 320px; height: 100%; border-collapse: separate;"'+' align="center" cellspacing="2" cellpadding="2" border="0">'],o=0,p=l.length,q,r;
-while(o<p){n.push('<tr>');for(var s=0;s<j;s++,o++){if(q=l[o]){r='';if(q instanceof Array){r=q[1];q=q[0];}else{var t=q.replace('&','').replace(';','').replace('#','');r=c[t]||q;}var u='cke_specialchar_label_'+o+'_'+CKEDITOR.tools.getNextNumber();n.push('<td class="cke_dark_background" style="cursor: default" role="presentation"><a href="javascript: void(0);" role="option" aria-posinset="'+(o+1)+'"',' aria-setsize="'+p+'"',' aria-labelledby="'+u+'"',' style="cursor: inherit; display: block; height: 1.25em; margin-top: 0.25em; text-align: center;" title="',CKEDITOR.tools.htmlEncode(r),'" onkeydown="CKEDITOR.tools.callFunction( '+i+', event, this )"'+' onclick="CKEDITOR.tools.callFunction('+e+', this); return false;"'+' tabindex="-1">'+'<span style="margin: 0 auto;cursor: inherit">'+q+'</span>'+'<span class="cke_voice_label" id="'+u+'">'+r+'</span></a>');}else n.push('<td class="cke_dark_background"> ');n.push('</td>');}n.push('</tr>');}n.push('</tbody></table>','<span id="'+m+'" class="cke_voice_label">'+c.options+'</span>');this.getContentElement('info','charContainer').getElement().setHtml(n.join(''));},contents:[{id:'info',label:a.lang.common.generalTab,title:a.lang.common.generalTab,padding:0,align:'top',elements:[{type:'hbox',align:'top',widths:['320px','90px'],children:[{type:'html',id:'charContainer',html:'',onMouseover:g,onMouseout:h,focus:function(){var j=this.getElement().getElementsByTag('a').getItem(0);setTimeout(function(){j.focus();g(null,j);},0);},onShow:function(){var j=this.getElement().getChild([0,0,0,0,0]);setTimeout(function(){j.focus();g(null,j);},0);},onLoad:function(j){b=j.sender;}},{type:'hbox',align:'top',widths:['100%'],children:[{type:'vbox',align:'top',children:[{type:'html',html:'<div></div>'},{type:'html',id:'charPreview',className:'cke_dark_background',style:"border:1px solid #eeeeee;font-size:28px;height:40px;width:70px;padding-top:9px;font-family:'Microsoft Sans Serif',Arial,Helvetica,Verdana;text-align:center;",html:'<div> </div>'},{type:'html',id:'htmlPreview',className:'cke_dark_background',style:"border:1px solid #eeeeee;font-size:14px;height:20px;width:70px;padding-top:2px;font-family:'Microsoft Sans Serif',Arial,Helvetica,Verdana;text-align:center;",html:'<div> </div>'}]}]}]}]}]};});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.dialog.add('specialchar',function(a){var b,c=a.lang.specialChar,d=function(j){var k,l;if(j.data)k=j.data.getTarget();else k=new CKEDITOR.dom.element(j);if(k.getName()=='a'&&(l=k.getChild(0).getHtml())){k.removeClass('cke_light_background');b.hide();var m=a.document.createElement('span');m.setHtml(l);a.insertText(m.getText());}},e=CKEDITOR.tools.addFunction(d),f,g=function(j,k){var l;k=k||j.data.getTarget();if(k.getName()=='span')k=k.getParent();if(k.getName()=='a'&&(l=k.getChild(0).getHtml())){if(f)h(null,f);var m=b.getContentElement('info','htmlPreview').getElement();b.getContentElement('info','charPreview').getElement().setHtml(l);m.setHtml(CKEDITOR.tools.htmlEncode(l));k.getParent().addClass('cke_light_background');f=k;}},h=function(j,k){k=k||j.data.getTarget();if(k.getName()=='span')k=k.getParent();if(k.getName()=='a'){b.getContentElement('info','charPreview').getElement().setHtml(' ');b.getContentElement('info','htmlPreview').getElement().setHtml(' ');k.getParent().removeClass('cke_light_background');f=undefined;}},i=CKEDITOR.tools.addFunction(function(j){j=new CKEDITOR.dom.event(j);var k=j.getTarget(),l,m,n=j.getKeystroke(),o=a.lang.dir=='rtl';switch(n){case 38:if(l=k.getParent().getParent().getPrevious()){m=l.getChild([k.getParent().getIndex(),0]);m.focus();h(null,k);g(null,m);}j.preventDefault();break;case 40:if(l=k.getParent().getParent().getNext()){m=l.getChild([k.getParent().getIndex(),0]);if(m&&m.type==1){m.focus();h(null,k);g(null,m);}}j.preventDefault();break;case 32:d({data:j});j.preventDefault();break;case o?37:39:case 9:if(l=k.getParent().getNext()){m=l.getChild(0);if(m.type==1){m.focus();h(null,k);g(null,m);j.preventDefault(true);}else h(null,k);}else if(l=k.getParent().getParent().getNext()){m=l.getChild([0,0]);if(m&&m.type==1){m.focus();h(null,k);g(null,m);j.preventDefault(true);}else h(null,k);}break;case o?39:37:case CKEDITOR.SHIFT+9:if(l=k.getParent().getPrevious()){m=l.getChild(0);m.focus();h(null,k);g(null,m);j.preventDefault(true);}else if(l=k.getParent().getParent().getPrevious()){m=l.getLast().getChild(0);m.focus();h(null,k);g(null,m);j.preventDefault(true);}else h(null,k);break;default:return;}});return{title:c.title,minWidth:430,minHeight:280,buttons:[CKEDITOR.dialog.cancelButton],charColumns:17,onLoad:function(){var j=this.definition.charColumns,k=a.config.extraSpecialChars,l=a.config.specialChars,m=CKEDITOR.tools.getNextId()+'_specialchar_table_label',n=['<table role="listbox" aria-labelledby="'+m+'"'+' style="width: 320px; height: 100%; border-collapse: separate;"'+' align="center" cellspacing="2" cellpadding="2" border="0">'],o=0,p=l.length,q,r;
+while(o<p){n.push('<tr>');for(var s=0;s<j;s++,o++){if(q=l[o]){r='';if(q instanceof Array){r=q[1];q=q[0];}else{var t=q.replace('&','').replace(';','').replace('#','');r=c[t]||q;}var u='cke_specialchar_label_'+o+'_'+CKEDITOR.tools.getNextNumber();n.push('<td class="cke_dark_background" style="cursor: default" role="presentation"><a href="javascript: void(0);" role="option" aria-posinset="'+(o+1)+'"',' aria-setsize="'+p+'"',' aria-labelledby="'+u+'"',' style="cursor: inherit; display: block; height: 1.25em; margin-top: 0.25em; text-align: center;" title="',CKEDITOR.tools.htmlEncode(r),'" onkeydown="CKEDITOR.tools.callFunction( '+i+', event, this )"'+' onclick="CKEDITOR.tools.callFunction('+e+', this); return false;"'+' tabindex="-1">'+'<span style="margin: 0 auto;cursor: inherit">'+q+'</span>'+'<span class="cke_voice_label" id="'+u+'">'+r+'</span></a>');}else n.push('<td class="cke_dark_background"> ');n.push('</td>');}n.push('</tr>');}n.push('</tbody></table>','<span id="'+m+'" class="cke_voice_label">'+c.options+'</span>');this.getContentElement('info','charContainer').getElement().setHtml(n.join(''));},contents:[{id:'info',label:a.lang.common.generalTab,title:a.lang.common.generalTab,padding:0,align:'top',elements:[{type:'hbox',align:'top',widths:['320px','90px'],children:[{type:'html',id:'charContainer',html:'',onMouseover:g,onMouseout:h,focus:function(){var j=this.getElement().getElementsByTag('a').getItem(0);setTimeout(function(){j.focus();g(null,j);},0);},onShow:function(){var j=this.getElement().getChild([0,0,0,0,0]);setTimeout(function(){j.focus();g(null,j);},0);},onLoad:function(j){b=j.sender;}},{type:'hbox',align:'top',widths:['100%'],children:[{type:'vbox',align:'top',children:[{type:'html',html:'<div></div>'},{type:'html',id:'charPreview',className:'cke_dark_background',style:"border:1px solid #eeeeee;font-size:28px;height:40px;width:70px;padding-top:9px;font-family:'Microsoft Sans Serif',Arial,Helvetica,Verdana;text-align:center;",html:'<div> </div>'},{type:'html',id:'htmlPreview',className:'cke_dark_background',style:"border:1px solid #eeeeee;font-size:14px;height:20px;width:70px;padding-top:2px;font-family:'Microsoft Sans Serif',Arial,Helvetica,Verdana;text-align:center;",html:'<div> </div>'}]}]}]}]}]};});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/_translationstatus.txt b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/_translationstatus.txt
index 82369b2..23df604 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/_translationstatus.txt
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/_translationstatus.txt
@@ -1,22 +1,22 @@
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-
-cs.js Found: 118 Missing: 0
-cy.js Found: 118 Missing: 0
-de.js Found: 118 Missing: 0
-el.js Found: 16 Missing: 102
-eo.js Found: 118 Missing: 0
-et.js Found: 31 Missing: 87
-fa.js Found: 24 Missing: 94
-fi.js Found: 23 Missing: 95
-fr.js Found: 118 Missing: 0
-he.js Found: 1 Missing: 117
-hr.js Found: 23 Missing: 95
-it.js Found: 118 Missing: 0
-nb.js Found: 118 Missing: 0
-nl.js Found: 118 Missing: 0
-no.js Found: 118 Missing: 0
-pt-br.js Found: 118 Missing: 0
-tr.js Found: 118 Missing: 0
-ug.js Found: 39 Missing: 79
-zh-cn.js Found: 118 Missing: 0
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+
+cs.js Found: 118 Missing: 0
+cy.js Found: 118 Missing: 0
+de.js Found: 118 Missing: 0
+el.js Found: 16 Missing: 102
+eo.js Found: 118 Missing: 0
+et.js Found: 31 Missing: 87
+fa.js Found: 24 Missing: 94
+fi.js Found: 23 Missing: 95
+fr.js Found: 118 Missing: 0
+he.js Found: 1 Missing: 117
+hr.js Found: 23 Missing: 95
+it.js Found: 118 Missing: 0
+nb.js Found: 118 Missing: 0
+nl.js Found: 118 Missing: 0
+no.js Found: 118 Missing: 0
+pt-br.js Found: 118 Missing: 0
+tr.js Found: 118 Missing: 0
+ug.js Found: 39 Missing: 79
+zh-cn.js Found: 118 Missing: 0
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/cs.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/cs.js
index 9617ea4..6ec32e1 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/cs.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/cs.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('specialchar','cs',{euro:'Znak eura',lsquo:'Počáteční uvozovka jednoduchá',rsquo:'Koncová uvozovka jednoduchá',ldquo:'Počáteční uvozovka dvojitá',rdquo:'Koncová uvozovka dvojitá',ndash:'En pomlčka',mdash:'Em pomlčka',iexcl:'Obrácený vykřičník',cent:'Znak centu',pound:'Znak libry',curren:'Znak měny',yen:'Znak jenu',brvbar:'Přerušená svislá čára',sect:'Znak oddílu',uml:'Přehláska',copy:'Znak copyrightu',ordf:'Ženský indikátor rodu',laquo:'Znak dvojitých lomených uvozovek vlevo',not:'Logistický zápor',reg:'Znak registrace',macr:'Pomlčka nad',deg:'Znak stupně',sup2:'Dvojka jako horní index',sup3:'Trojka jako horní index',acute:'Čárka nad vpravo',micro:'Znak mikro',para:'Znak odstavce',middot:'Tečka uprostřed',cedil:'Ocásek vlevo',sup1:'Jednička jako horní index',ordm:'Mužský indikátor rodu',raquo:'Znak dvojitých lomených uvozovek vpravo',frac14:'Obyčejný zlomek jedna čtvrtina',frac12:'Obyčejný zlomek jedna polovina',frac34:'Obyčejný zlomek tři čtvrtiny',iquest:'Znak obráceného otazníku',Agrave:'Velké písmeno latinky A s čárkou nad vlevo',Aacute:'Velké písmeno latinky A s čárkou nad vpravo',Acirc:'Velké písmeno latinky A s vokáněm',Atilde:'Velké písmeno latinky A s tildou',Auml:'Velké písmeno latinky A s dvěma tečkami',Aring:'Velké písmeno latinky A s kroužkem nad',AElig:'Velké písmeno latinky Ae',Ccedil:'Velké písmeno latinky C s ocáskem vlevo',Egrave:'Velké písmeno latinky E s čárkou nad vlevo',Eacute:'Velké písmeno latinky E s čárkou nad vpravo',Ecirc:'Velké písmeno latinky E s vokáněm',Euml:'Velké písmeno latinky E s dvěma tečkami',Igrave:'Velké písmeno latinky I s čárkou nad vlevo',Iacute:'Velké písmeno latinky I s čárkou nad vpravo',Icirc:'Velké písmeno latinky I s vokáněm',Iuml:'Velké písmeno latinky I s dvěma tečkami',ETH:'Velké písmeno latinky Eth',Ntilde:'Velké písmeno latinky N s tildou',Ograve:'Velké písmeno latinky O s čárkou nad vlevo',Oacute:'Velké písmeno latinky O s čárkou nad vpravo',Ocirc:'Velké písmeno latinky O s vokáněm',Otilde:'Velké písmeno latinky O s tildou',Ouml:'Velké písmeno latinky O s dvěma tečkami',times:'Znak násobení',Oslash:'Velké písmeno latinky O přeškrtnuté',Ugrave:'Velké písmeno latinky U s čárkou nad vlevo',Uacute:'Velké písmeno latinky U s čárkou nad vpravo',Ucirc:'Velké písmeno latinky U s vokáněm',Uuml:'Velké písmeno latinky U s dvěma tečkami',Yacute:'Velké písmeno latinky Y s čárkou nad vpravo',THORN:'Velké písmeno latinky Thorn',szlig:'Malé písmeno latinky ostré s',agrave:'Malé písmeno latinky a s čárkou nad vlevo',aacute:'Malé písmeno latinky a s čárkou nad vpravo',acirc:'Malé písmeno latinky a s vokáněm',atilde:'Malé písmeno latinky a s tildou',auml:'Malé písmeno latinky a s dvěma tečkami',aring:'Malé písmeno latinky a s kroužkem nad',aelig:'Malé písmeno latinky ae',ccedil:'Malé písmeno latinky c s ocáskem vlevo',egrave:'Malé písmeno latinky e s čárkou nad vlevo',eacute:'Malé písmeno latinky e s čárkou nad vpravo',ecirc:'Malé písmeno latinky e s vokáněm',euml:'Malé písmeno latinky e s dvěma tečkami',igrave:'Malé písmeno latinky i s čárkou nad vlevo',iacute:'Malé písmeno latinky i s čárkou nad vpravo',icirc:'Malé písmeno latinky i s vokáněm',iuml:'Malé písmeno latinky i s dvěma tečkami',eth:'Malé písmeno latinky eth',ntilde:'Malé písmeno latinky n s tildou',ograve:'Malé písmeno latinky o s čárkou nad vlevo',oacute:'Malé písmeno latinky o s čárkou nad vpravo',ocirc:'Malé písmeno latinky o s vokáněm',otilde:'Malé písmeno latinky o s tildou',ouml:'Malé písmeno latinky o s dvěma tečkami',divide:'Znak dělení',oslash:'Malé písmeno latinky o přeškrtnuté',ugrave:'Malé písmeno latinky u s čárkou nad vlevo',uacute:'Malé písmeno latinky u s čárkou nad vpravo',ucirc:'Malé písmeno latinky u s vokáněm',uuml:'Malé písmeno latinky u s dvěma tečkami',yacute:'Malé písmeno latinky y s čárkou nad vpravo',thorn:'Malé písmeno latinky thorn',yuml:'Malé písmeno latinky y s dvěma tečkami',OElig:'Velká ligatura latinky OE',oelig:'Malá ligatura latinky OE',372:'Velké písmeno latinky W s vokáněm',374:'Velké písmeno latinky Y s vokáněm',373:'Malé písmeno latinky w s vokáněm',375:'Malé písmeno latinky y s vokáněm',sbquo:'Dolní 9 uvozovka jednoduchá',8219:'Horní obrácená 9 uvozovka jednoduchá',bdquo:'Dolní 9 uvozovka dvojitá',hellip:'Trojtečkový úvod',trade:'Obchodní značka',9658:'Černý ukazatel směřující vpravo',bull:'Kolečko',rarr:'Šipka vpravo',rArr:'Dvojitá šipka vpravo',hArr:'Dvojitá šipka vlevo a vpravo',diams:'Černé piky',asymp:'Téměř se rovná'});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('specialchar','cs',{euro:'Znak eura',lsquo:'Počáteční uvozovka jednoduchá',rsquo:'Koncová uvozovka jednoduchá',ldquo:'Počáteční uvozovka dvojitá',rdquo:'Koncová uvozovka dvojitá',ndash:'En pomlčka',mdash:'Em pomlčka',iexcl:'Obrácený vykřičník',cent:'Znak centu',pound:'Znak libry',curren:'Znak měny',yen:'Znak jenu',brvbar:'Přerušená svislá čára',sect:'Znak oddílu',uml:'Přehláska',copy:'Znak copyrightu',ordf:'Ženský indikátor rodu',laquo:'Znak dvojitých lomených uvozovek vlevo',not:'Logistický zápor',reg:'Znak registrace',macr:'Pomlčka nad',deg:'Znak stupně',sup2:'Dvojka jako horní index',sup3:'Trojka jako horní index',acute:'Čárka nad vpravo',micro:'Znak mikro',para:'Znak odstavce',middot:'Tečka uprostřed',cedil:'Ocásek vlevo',sup1:'Jednička jako horní index',ordm:'Mužský indikátor rodu',raquo:'Znak dvojitých lomených uvozovek vpravo',frac14:'Obyčejný zlomek jedna čtvrtina',frac12:'Obyčejný zlomek jedna polovina',frac34:'Obyčejný zlomek tři čtvrtiny',iquest:'Znak obráceného otazníku',Agrave:'Velké písmeno latinky A s čárkou nad vlevo',Aacute:'Velké písmeno latinky A s čárkou nad vpravo',Acirc:'Velké písmeno latinky A s vokáněm',Atilde:'Velké písmeno latinky A s tildou',Auml:'Velké písmeno latinky A s dvěma tečkami',Aring:'Velké písmeno latinky A s kroužkem nad',AElig:'Velké písmeno latinky Ae',Ccedil:'Velké písmeno latinky C s ocáskem vlevo',Egrave:'Velké písmeno latinky E s čárkou nad vlevo',Eacute:'Velké písmeno latinky E s čárkou nad vpravo',Ecirc:'Velké písmeno latinky E s vokáněm',Euml:'Velké písmeno latinky E s dvěma tečkami',Igrave:'Velké písmeno latinky I s čárkou nad vlevo',Iacute:'Velké písmeno latinky I s čárkou nad vpravo',Icirc:'Velké písmeno latinky I s vokáněm',Iuml:'Velké písmeno latinky I s dvěma tečkami',ETH:'Velké písmeno latinky Eth',Ntilde:'Velké písmeno latinky N s tildou',Ograve:'Velké písmeno latinky O s čárkou nad vlevo',Oacute:'Velké písmeno latinky O s čárkou nad vpravo',Ocirc:'Velké písmeno latinky O s vokáněm',Otilde:'Velké písmeno latinky O s tildou',Ouml:'Velké písmeno latinky O s dvěma tečkami',times:'Znak násobení',Oslash:'Velké písmeno latinky O přeškrtnuté',Ugrave:'Velké písmeno latinky U s čárkou nad vlevo',Uacute:'Velké písmeno latinky U s čárkou nad vpravo',Ucirc:'Velké písmeno latinky U s vokáněm',Uuml:'Velké písmeno latinky U s dvěma tečkami',Yacute:'Velké písmeno latinky Y s čárkou nad vpravo',THORN:'Velké písmeno latinky Thorn',szlig:'Malé písmeno latinky ostré s',agrave:'Malé písmeno latinky a s čárkou nad vlevo',aacute:'Malé písmeno latinky a s čárkou nad vpravo',acirc:'Malé písmeno latinky a s vokáněm',atilde:'Malé písmeno latinky a s tildou',auml:'Malé písmeno latinky a s dvěma tečkami',aring:'Malé písmeno latinky a s kroužkem nad',aelig:'Malé písmeno latinky ae',ccedil:'Malé písmeno latinky c s ocáskem vlevo',egrave:'Malé písmeno latinky e s čárkou nad vlevo',eacute:'Malé písmeno latinky e s čárkou nad vpravo',ecirc:'Malé písmeno latinky e s vokáněm',euml:'Malé písmeno latinky e s dvěma tečkami',igrave:'Malé písmeno latinky i s čárkou nad vlevo',iacute:'Malé písmeno latinky i s čárkou nad vpravo',icirc:'Malé písmeno latinky i s vokáněm',iuml:'Malé písmeno latinky i s dvěma tečkami',eth:'Malé písmeno latinky eth',ntilde:'Malé písmeno latinky n s tildou',ograve:'Malé písmeno latinky o s čárkou nad vlevo',oacute:'Malé písmeno latinky o s čárkou nad vpravo',ocirc:'Malé písmeno latinky o s vokáněm',otilde:'Malé písmeno latinky o s tildou',ouml:'Malé písmeno latinky o s dvěma tečkami',divide:'Znak dělení',oslash:'Malé písmeno latinky o přeškrtnuté',ugrave:'Malé písmeno latinky u s čárkou nad vlevo',uacute:'Malé písmeno latinky u s čárkou nad vpravo',ucirc:'Malé písmeno latinky u s vokáněm',uuml:'Malé písmeno latinky u s dvěma tečkami',yacute:'Malé písmeno latinky y s čárkou nad vpravo',thorn:'Malé písmeno latinky thorn',yuml:'Malé písmeno latinky y s dvěma tečkami',OElig:'Velká ligatura latinky OE',oelig:'Malá ligatura latinky OE',372:'Velké písmeno latinky W s vokáněm',374:'Velké písmeno latinky Y s vokáněm',373:'Malé písmeno latinky w s vokáněm',375:'Malé písmeno latinky y s vokáněm',sbquo:'Dolní 9 uvozovka jednoduchá',8219:'Horní obrácená 9 uvozovka jednoduchá',bdquo:'Dolní 9 uvozovka dvojitá',hellip:'Trojtečkový úvod',trade:'Obchodní značka',9658:'Černý ukazatel směřující vpravo',bull:'Kolečko',rarr:'Šipka vpravo',rArr:'Dvojitá šipka vpravo',hArr:'Dvojitá šipka vlevo a vpravo',diams:'Černé piky',asymp:'Téměř se rovná'});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/cy.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/cy.js
index 8dbafae..9c6d61c 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/cy.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/cy.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('specialchar','cy',{euro:'Arwydd yr Ewro',lsquo:'Dyfynnod chwith unigol',rsquo:'Dyfynnod dde unigol',ldquo:'Dyfynnod chwith dwbl',rdquo:'Dyfynnod dde dwbl',ndash:'Cysylltnod en',mdash:'Cysylltnod em',iexcl:'Ebychnod gwrthdro',cent:'Arwydd sent',pound:'Arwydd punt',curren:'Arwydd arian cyfred',yen:'Arwydd yen',brvbar:'Bar toriedig',sect:'Arwydd adran',uml:'Didolnod',copy:'Arwydd hawlfraint',ordf:'Dangosydd benywaidd',laquo:"Dyfynnod dwbl ar ongl i'r chwith",not:'Arwydd Nid',reg:'Arwydd cofrestredig',macr:'Macron',deg:'Arwydd gradd',sup2:'Dau uwchsgript',sup3:'Tri uwchsgript',acute:'Acen ddyrchafedig',micro:'Arwydd micro',para:'Arwydd pilcrow',middot:'Dot canol',cedil:'Sedila',sup1:'Un uwchsgript',ordm:'Dangosydd gwrywaidd',raquo:"Dyfynnod dwbl ar ongl i'r dde",frac14:'Ffracsiwn cyffredin un cwarter',frac12:'Ffracsiwn cyffredin un hanner',frac34:'Ffracsiwn cyffredin tri chwarter',iquest:'Marc cwestiwn gwrthdroëdig',Agrave:'Priflythyren A Lladinaidd gydag acen ddisgynedig',Aacute:'Priflythyren A Lladinaidd gydag acen ddyrchafedig',Acirc:'Priflythyren A Lladinaidd gydag acen grom',Atilde:'Priflythyren A Lladinaidd gyda thild',Auml:'Priflythyren A Lladinaidd gyda didolnod',Aring:'Priflythyren A Lladinaidd gyda chylch uwchben',AElig:'Priflythyren Æ Lladinaidd',Ccedil:'Priflythyren C Lladinaidd gyda sedila',Egrave:'Priflythyren E Lladinaidd gydag acen ddisgynedig',Eacute:'Priflythyren E Lladinaidd gydag acen ddyrchafedig',Ecirc:'Priflythyren E Lladinaidd gydag acen grom',Euml:'Priflythyren E Lladinaidd gyda didolnod',Igrave:'Priflythyren I Lladinaidd gydag acen ddisgynedig',Iacute:'Priflythyren I Lladinaidd gydag acen ddyrchafedig',Icirc:'Priflythyren I Lladinaidd gydag acen grom',Iuml:'Priflythyren I Lladinaidd gyda didolnod',ETH:'Priflythyren Eth',Ntilde:'Priflythyren N Lladinaidd gyda thild',Ograve:'Priflythyren O Lladinaidd gydag acen ddisgynedig',Oacute:'Priflythyren O Lladinaidd gydag acen ddyrchafedig',Ocirc:'Priflythyren O Lladinaidd gydag acen grom',Otilde:'Priflythyren O Lladinaidd gyda thild',Ouml:'Priflythyren O Lladinaidd gyda didolnod',times:'Arwydd lluosi',Oslash:'Priflythyren O Lladinaidd gyda strôc',Ugrave:'Priflythyren U Lladinaidd gydag acen ddisgynedig',Uacute:'Priflythyren U Lladinaidd gydag acen ddyrchafedig',Ucirc:'Priflythyren U Lladinaidd gydag acen grom',Uuml:'Priflythyren U Lladinaidd gyda didolnod',Yacute:'Priflythyren Y Lladinaidd gydag acen ddyrchafedig',THORN:'Priflythyren Thorn',szlig:'Llythyren s fach Lladinaidd siarp ',agrave:'Llythyren a fach Lladinaidd gydag acen ddisgynedig',aacute:'Llythyren a fach Lladinaidd gydag acen ddyrchafedig',acirc:'Llythyren a fach Lladinaidd gydag acen grom',atilde:'Llythyren a fach Lladinaidd gyda thild',auml:'Llythyren a fach Lladinaidd gyda didolnod',aring:'Llythyren a fach Lladinaidd gyda chylch uwchben',aelig:'Llythyren æ fach Lladinaidd',ccedil:'Llythyren c fach Lladinaidd gyda sedila',egrave:'Llythyren e fach Lladinaidd gydag acen ddisgynedig',eacute:'Llythyren e fach Lladinaidd gydag acen ddyrchafedig',ecirc:'Llythyren e fach Lladinaidd gydag acen grom',euml:'Llythyren e fach Lladinaidd gyda didolnod',igrave:'Llythyren i fach Lladinaidd gydag acen ddisgynedig',iacute:'Llythyren i fach Lladinaidd gydag acen ddyrchafedig',icirc:'Llythyren i fach Lladinaidd gydag acen grom',iuml:'Llythyren i fach Lladinaidd gyda didolnod',eth:'Llythyren eth fach',ntilde:'Llythyren n fach Lladinaidd gyda thild',ograve:'Llythyren o fach Lladinaidd gydag acen ddisgynedig',oacute:'Llythyren o fach Lladinaidd gydag acen ddyrchafedig',ocirc:'Llythyren o fach Lladinaidd gydag acen grom',otilde:'Llythyren o fach Lladinaidd gyda thild',ouml:'Llythyren o fach Lladinaidd gyda didolnod',divide:'Arwydd rhannu',oslash:'Llyth',ugrave:'Llythyren u fach Lladinaidd gydag acen ddisgynedig',uacute:'Llythyren u fach Lladinaidd gydag acen ddyrchafedig',ucirc:'Llythyren u fach Lladinaidd gydag acen grom',uuml:'Llythyren u fach Lladinaidd gyda didolnod',yacute:'Llythyren y fach Lladinaidd gydag acen ddisgynedig',thorn:'Llythyren o fach Lladinaidd gyda strôc',yuml:'Llythyren y fach Lladinaidd gyda didolnod',OElig:'Priflythyren cwlwm OE Lladinaidd ',oelig:'Priflythyren cwlwm oe Lladinaidd ',372:'Priflythyren W gydag acen grom',374:'Priflythyren Y gydag acen grom',373:'Llythyren w fach gydag acen grom',375:'Llythyren y fach gydag acen grom',sbquo:'Dyfynnod sengl 9-isel',8219:'Dyfynnod sengl 9-uchel cildro',bdquo:'Dyfynnod dwbl 9-isel',hellip:'Coll geiriau llorweddol',trade:'Arwydd marc masnachol',9658:"Pwyntydd du i'r dde",bull:'Bwled',rarr:"Saeth i'r dde",rArr:"Saeth ddwbl i'r dde",hArr:"Saeth ddwbl i'r chwith",diams:'Siwt diemwnt du',asymp:'Bron yn hafal iddo'});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('specialchar','cy',{euro:'Arwydd yr Ewro',lsquo:'Dyfynnod chwith unigol',rsquo:'Dyfynnod dde unigol',ldquo:'Dyfynnod chwith dwbl',rdquo:'Dyfynnod dde dwbl',ndash:'Cysylltnod en',mdash:'Cysylltnod em',iexcl:'Ebychnod gwrthdro',cent:'Arwydd sent',pound:'Arwydd punt',curren:'Arwydd arian cyfred',yen:'Arwydd yen',brvbar:'Bar toriedig',sect:'Arwydd adran',uml:'Didolnod',copy:'Arwydd hawlfraint',ordf:'Dangosydd benywaidd',laquo:"Dyfynnod dwbl ar ongl i'r chwith",not:'Arwydd Nid',reg:'Arwydd cofrestredig',macr:'Macron',deg:'Arwydd gradd',sup2:'Dau uwchsgript',sup3:'Tri uwchsgript',acute:'Acen ddyrchafedig',micro:'Arwydd micro',para:'Arwydd pilcrow',middot:'Dot canol',cedil:'Sedila',sup1:'Un uwchsgript',ordm:'Dangosydd gwrywaidd',raquo:"Dyfynnod dwbl ar ongl i'r dde",frac14:'Ffracsiwn cyffredin un cwarter',frac12:'Ffracsiwn cyffredin un hanner',frac34:'Ffracsiwn cyffredin tri chwarter',iquest:'Marc cwestiwn gwrthdroëdig',Agrave:'Priflythyren A Lladinaidd gydag acen ddisgynedig',Aacute:'Priflythyren A Lladinaidd gydag acen ddyrchafedig',Acirc:'Priflythyren A Lladinaidd gydag acen grom',Atilde:'Priflythyren A Lladinaidd gyda thild',Auml:'Priflythyren A Lladinaidd gyda didolnod',Aring:'Priflythyren A Lladinaidd gyda chylch uwchben',AElig:'Priflythyren Æ Lladinaidd',Ccedil:'Priflythyren C Lladinaidd gyda sedila',Egrave:'Priflythyren E Lladinaidd gydag acen ddisgynedig',Eacute:'Priflythyren E Lladinaidd gydag acen ddyrchafedig',Ecirc:'Priflythyren E Lladinaidd gydag acen grom',Euml:'Priflythyren E Lladinaidd gyda didolnod',Igrave:'Priflythyren I Lladinaidd gydag acen ddisgynedig',Iacute:'Priflythyren I Lladinaidd gydag acen ddyrchafedig',Icirc:'Priflythyren I Lladinaidd gydag acen grom',Iuml:'Priflythyren I Lladinaidd gyda didolnod',ETH:'Priflythyren Eth',Ntilde:'Priflythyren N Lladinaidd gyda thild',Ograve:'Priflythyren O Lladinaidd gydag acen ddisgynedig',Oacute:'Priflythyren O Lladinaidd gydag acen ddyrchafedig',Ocirc:'Priflythyren O Lladinaidd gydag acen grom',Otilde:'Priflythyren O Lladinaidd gyda thild',Ouml:'Priflythyren O Lladinaidd gyda didolnod',times:'Arwydd lluosi',Oslash:'Priflythyren O Lladinaidd gyda strôc',Ugrave:'Priflythyren U Lladinaidd gydag acen ddisgynedig',Uacute:'Priflythyren U Lladinaidd gydag acen ddyrchafedig',Ucirc:'Priflythyren U Lladinaidd gydag acen grom',Uuml:'Priflythyren U Lladinaidd gyda didolnod',Yacute:'Priflythyren Y Lladinaidd gydag acen ddyrchafedig',THORN:'Priflythyren Thorn',szlig:'Llythyren s fach Lladinaidd siarp ',agrave:'Llythyren a fach Lladinaidd gydag acen ddisgynedig',aacute:'Llythyren a fach Lladinaidd gydag acen ddyrchafedig',acirc:'Llythyren a fach Lladinaidd gydag acen grom',atilde:'Llythyren a fach Lladinaidd gyda thild',auml:'Llythyren a fach Lladinaidd gyda didolnod',aring:'Llythyren a fach Lladinaidd gyda chylch uwchben',aelig:'Llythyren æ fach Lladinaidd',ccedil:'Llythyren c fach Lladinaidd gyda sedila',egrave:'Llythyren e fach Lladinaidd gydag acen ddisgynedig',eacute:'Llythyren e fach Lladinaidd gydag acen ddyrchafedig',ecirc:'Llythyren e fach Lladinaidd gydag acen grom',euml:'Llythyren e fach Lladinaidd gyda didolnod',igrave:'Llythyren i fach Lladinaidd gydag acen ddisgynedig',iacute:'Llythyren i fach Lladinaidd gydag acen ddyrchafedig',icirc:'Llythyren i fach Lladinaidd gydag acen grom',iuml:'Llythyren i fach Lladinaidd gyda didolnod',eth:'Llythyren eth fach',ntilde:'Llythyren n fach Lladinaidd gyda thild',ograve:'Llythyren o fach Lladinaidd gydag acen ddisgynedig',oacute:'Llythyren o fach Lladinaidd gydag acen ddyrchafedig',ocirc:'Llythyren o fach Lladinaidd gydag acen grom',otilde:'Llythyren o fach Lladinaidd gyda thild',ouml:'Llythyren o fach Lladinaidd gyda didolnod',divide:'Arwydd rhannu',oslash:'Llyth',ugrave:'Llythyren u fach Lladinaidd gydag acen ddisgynedig',uacute:'Llythyren u fach Lladinaidd gydag acen ddyrchafedig',ucirc:'Llythyren u fach Lladinaidd gydag acen grom',uuml:'Llythyren u fach Lladinaidd gyda didolnod',yacute:'Llythyren y fach Lladinaidd gydag acen ddisgynedig',thorn:'Llythyren o fach Lladinaidd gyda strôc',yuml:'Llythyren y fach Lladinaidd gyda didolnod',OElig:'Priflythyren cwlwm OE Lladinaidd ',oelig:'Priflythyren cwlwm oe Lladinaidd ',372:'Priflythyren W gydag acen grom',374:'Priflythyren Y gydag acen grom',373:'Llythyren w fach gydag acen grom',375:'Llythyren y fach gydag acen grom',sbquo:'Dyfynnod sengl 9-isel',8219:'Dyfynnod sengl 9-uchel cildro',bdquo:'Dyfynnod dwbl 9-isel',hellip:'Coll geiriau llorweddol',trade:'Arwydd marc masnachol',9658:"Pwyntydd du i'r dde",bull:'Bwled',rarr:"Saeth i'r dde",rArr:"Saeth ddwbl i'r dde",hArr:"Saeth ddwbl i'r chwith",diams:'Siwt diemwnt du',asymp:'Bron yn hafal iddo'});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/de.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/de.js
index ee03cb8..f270c30 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/de.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/de.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('specialchar','de',{euro:'Euro Zeichen',lsquo:'Hochkomma links',rsquo:'Hochkomma rechts',ldquo:'Anführungszeichen links',rdquo:'Anführungszeichen rechts',ndash:'kleiner Strich',mdash:'mittlerer Strich',iexcl:'invertiertes Ausrufezeichen',cent:'Cent',pound:'Pfund',curren:'Währung',yen:'Yen',brvbar:'gestrichelte Linie',sect:'§ Zeichen',uml:'Diäresis',copy:'Copyright',ordf:'Feminine ordinal Anzeige',laquo:'Nach links zeigenden Doppel-Winkel Anführungszeichen',not:'Not-Zeichen',reg:'Registriert',macr:'Längezeichen',deg:'Grad',sup2:'Hoch 2',sup3:'Hoch 3',acute:'Akzentzeichen ',micro:'Micro',para:'Pilcrow-Zeichen',middot:'Mittelpunkt',cedil:'Cedilla',sup1:'Hoch 1',ordm:'Männliche Ordnungszahl Anzeige',raquo:'Nach rechts zeigenden Doppel-Winkel Anführungszeichen',frac14:'ein Viertel',frac12:'Hälfte',frac34:'Dreiviertel',iquest:'Umgekehrtes Fragezeichen',Agrave:'Lateinischer Buchstabe A mit AkzentGrave',Aacute:'Lateinischer Buchstabe A mit Akutakzent',Acirc:'Lateinischer Buchstabe A mit Zirkumflex',Atilde:'Lateinischer Buchstabe A mit Tilde',Auml:'Lateinischer Buchstabe A mit Trema',Aring:'Lateinischer Buchstabe A mit Ring oben',AElig:'Lateinischer Buchstabe Æ',Ccedil:'Lateinischer Buchstabe C mit Cedille',Egrave:'Lateinischer Buchstabe E mit AkzentGrave',Eacute:'Lateinischer Buchstabe E mit Akutakzent',Ecirc:'Lateinischer Buchstabe E mit Zirkumflex',Euml:'Lateinischer Buchstabe E Trema',Igrave:'Lateinischer Buchstabe I mit AkzentGrave',Iacute:'Lateinischer Buchstabe I mit Akutakzent',Icirc:'Lateinischer Buchstabe I mit Zirkumflex',Iuml:'Lateinischer Buchstabe I mit Trema',ETH:'Lateinischer Buchstabe Eth',Ntilde:'Lateinischer Buchstabe N mit Tilde',Ograve:'Lateinischer Buchstabe O mit AkzentGrave',Oacute:'Lateinischer Buchstabe O mit Akutakzent',Ocirc:'Lateinischer Buchstabe O mit Zirkumflex',Otilde:'Lateinischer Buchstabe O mit Tilde',Ouml:'Lateinischer Buchstabe O mit Trema',times:'Multiplikation',Oslash:'Lateinischer Buchstabe O durchgestrichen',Ugrave:'Lateinischer Buchstabe U mit Akzentgrave',Uacute:'Lateinischer Buchstabe U mit Akutakzent',Ucirc:'Lateinischer Buchstabe U mit Zirkumflex',Uuml:'Lateinischer Buchstabe a mit Trema',Yacute:'Lateinischer Buchstabe a mit Akzent',THORN:'Lateinischer Buchstabe mit Dorn',szlig:'Kleiner lateinischer Buchstabe scharfe s',agrave:'Kleiner lateinischer Buchstabe a mit Accent grave',aacute:'Kleiner lateinischer Buchstabe a mit Akut',acirc:'Lateinischer Buchstabe a mit Zirkumflex',atilde:'Lateinischer Buchstabe a mit Tilde',auml:'Kleiner lateinischer Buchstabe a mit Trema',aring:'Kleiner lateinischer Buchstabe a mit Ring oben',aelig:'Lateinischer Buchstabe æ',ccedil:'Kleiner lateinischer Buchstabe c mit Cedille',egrave:'Kleiner lateinischer Buchstabe e mit Accent grave',eacute:'Kleiner lateinischer Buchstabe e mit Akut',ecirc:'Kleiner lateinischer Buchstabe e mit Zirkumflex',euml:'Kleiner lateinischer Buchstabe e mit Trema',igrave:'Kleiner lateinischer Buchstabe i mit AkzentGrave',iacute:'Kleiner lateinischer Buchstabe i mit Akzent',icirc:'Kleiner lateinischer Buchstabe i mit Zirkumflex',iuml:'Kleiner lateinischer Buchstabe i mit Trema',eth:'Kleiner lateinischer Buchstabe eth',ntilde:'Kleiner lateinischer Buchstabe n mit Tilde',ograve:'Kleiner lateinischer Buchstabe o mit Accent grave',oacute:'Kleiner lateinischer Buchstabe o mit Akzent',ocirc:'Kleiner lateinischer Buchstabe o mit Zirkumflex',otilde:'Lateinischer Buchstabe i mit Tilde',ouml:'Kleiner lateinischer Buchstabe o mit Trema',divide:'Divisionszeichen',oslash:'Kleiner lateinischer Buchstabe o durchgestrichen',ugrave:'Kleiner lateinischer Buchstabe u mit Accent grave',uacute:'Kleiner lateinischer Buchstabe u mit Akut',ucirc:'Kleiner lateinischer Buchstabe u mit Zirkumflex',uuml:'Kleiner lateinischer Buchstabe u mit Trema',yacute:'Kleiner lateinischer Buchstabe y mit Akut',thorn:'Kleiner lateinischer Buchstabe Dorn',yuml:'Kleiner lateinischer Buchstabe y mit Trema',OElig:'Lateinischer Buchstabe Ligatur OE',oelig:'Kleiner lateinischer Buchstabe Ligatur OE',372:'Lateinischer Buchstabe W mit Zirkumflex',374:'Lateinischer Buchstabe Y mit Zirkumflex',373:'Kleiner lateinischer Buchstabe w mit Zirkumflex',375:'Kleiner lateinischer Buchstabe y mit Zirkumflex',sbquo:'Tiefergestelltes Komma',8219:'Rumgedrehtes Komma',bdquo:'Doppeltes Anführungszeichen unten',hellip:'horizontale Auslassungspunkte',trade:'Handelszeichen',9658:'Dreickspfeil rechts',bull:'Bullet',rarr:'Pfeil rechts',rArr:'Doppelpfeil rechts',hArr:'Doppelpfeil links',diams:'Karo',asymp:'Ungefähr'});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('specialchar','de',{euro:'Euro Zeichen',lsquo:'Hochkomma links',rsquo:'Hochkomma rechts',ldquo:'Anführungszeichen links',rdquo:'Anführungszeichen rechts',ndash:'kleiner Strich',mdash:'mittlerer Strich',iexcl:'invertiertes Ausrufezeichen',cent:'Cent',pound:'Pfund',curren:'Währung',yen:'Yen',brvbar:'gestrichelte Linie',sect:'§ Zeichen',uml:'Diäresis',copy:'Copyright',ordf:'Feminine ordinal Anzeige',laquo:'Nach links zeigenden Doppel-Winkel Anführungszeichen',not:'Not-Zeichen',reg:'Registriert',macr:'Längezeichen',deg:'Grad',sup2:'Hoch 2',sup3:'Hoch 3',acute:'Akzentzeichen ',micro:'Micro',para:'Pilcrow-Zeichen',middot:'Mittelpunkt',cedil:'Cedilla',sup1:'Hoch 1',ordm:'Männliche Ordnungszahl Anzeige',raquo:'Nach rechts zeigenden Doppel-Winkel Anführungszeichen',frac14:'ein Viertel',frac12:'Hälfte',frac34:'Dreiviertel',iquest:'Umgekehrtes Fragezeichen',Agrave:'Lateinischer Buchstabe A mit AkzentGrave',Aacute:'Lateinischer Buchstabe A mit Akutakzent',Acirc:'Lateinischer Buchstabe A mit Zirkumflex',Atilde:'Lateinischer Buchstabe A mit Tilde',Auml:'Lateinischer Buchstabe A mit Trema',Aring:'Lateinischer Buchstabe A mit Ring oben',AElig:'Lateinischer Buchstabe Æ',Ccedil:'Lateinischer Buchstabe C mit Cedille',Egrave:'Lateinischer Buchstabe E mit AkzentGrave',Eacute:'Lateinischer Buchstabe E mit Akutakzent',Ecirc:'Lateinischer Buchstabe E mit Zirkumflex',Euml:'Lateinischer Buchstabe E Trema',Igrave:'Lateinischer Buchstabe I mit AkzentGrave',Iacute:'Lateinischer Buchstabe I mit Akutakzent',Icirc:'Lateinischer Buchstabe I mit Zirkumflex',Iuml:'Lateinischer Buchstabe I mit Trema',ETH:'Lateinischer Buchstabe Eth',Ntilde:'Lateinischer Buchstabe N mit Tilde',Ograve:'Lateinischer Buchstabe O mit AkzentGrave',Oacute:'Lateinischer Buchstabe O mit Akutakzent',Ocirc:'Lateinischer Buchstabe O mit Zirkumflex',Otilde:'Lateinischer Buchstabe O mit Tilde',Ouml:'Lateinischer Buchstabe O mit Trema',times:'Multiplikation',Oslash:'Lateinischer Buchstabe O durchgestrichen',Ugrave:'Lateinischer Buchstabe U mit Akzentgrave',Uacute:'Lateinischer Buchstabe U mit Akutakzent',Ucirc:'Lateinischer Buchstabe U mit Zirkumflex',Uuml:'Lateinischer Buchstabe a mit Trema',Yacute:'Lateinischer Buchstabe a mit Akzent',THORN:'Lateinischer Buchstabe mit Dorn',szlig:'Kleiner lateinischer Buchstabe scharfe s',agrave:'Kleiner lateinischer Buchstabe a mit Accent grave',aacute:'Kleiner lateinischer Buchstabe a mit Akut',acirc:'Lateinischer Buchstabe a mit Zirkumflex',atilde:'Lateinischer Buchstabe a mit Tilde',auml:'Kleiner lateinischer Buchstabe a mit Trema',aring:'Kleiner lateinischer Buchstabe a mit Ring oben',aelig:'Lateinischer Buchstabe æ',ccedil:'Kleiner lateinischer Buchstabe c mit Cedille',egrave:'Kleiner lateinischer Buchstabe e mit Accent grave',eacute:'Kleiner lateinischer Buchstabe e mit Akut',ecirc:'Kleiner lateinischer Buchstabe e mit Zirkumflex',euml:'Kleiner lateinischer Buchstabe e mit Trema',igrave:'Kleiner lateinischer Buchstabe i mit AkzentGrave',iacute:'Kleiner lateinischer Buchstabe i mit Akzent',icirc:'Kleiner lateinischer Buchstabe i mit Zirkumflex',iuml:'Kleiner lateinischer Buchstabe i mit Trema',eth:'Kleiner lateinischer Buchstabe eth',ntilde:'Kleiner lateinischer Buchstabe n mit Tilde',ograve:'Kleiner lateinischer Buchstabe o mit Accent grave',oacute:'Kleiner lateinischer Buchstabe o mit Akzent',ocirc:'Kleiner lateinischer Buchstabe o mit Zirkumflex',otilde:'Lateinischer Buchstabe i mit Tilde',ouml:'Kleiner lateinischer Buchstabe o mit Trema',divide:'Divisionszeichen',oslash:'Kleiner lateinischer Buchstabe o durchgestrichen',ugrave:'Kleiner lateinischer Buchstabe u mit Accent grave',uacute:'Kleiner lateinischer Buchstabe u mit Akut',ucirc:'Kleiner lateinischer Buchstabe u mit Zirkumflex',uuml:'Kleiner lateinischer Buchstabe u mit Trema',yacute:'Kleiner lateinischer Buchstabe y mit Akut',thorn:'Kleiner lateinischer Buchstabe Dorn',yuml:'Kleiner lateinischer Buchstabe y mit Trema',OElig:'Lateinischer Buchstabe Ligatur OE',oelig:'Kleiner lateinischer Buchstabe Ligatur OE',372:'Lateinischer Buchstabe W mit Zirkumflex',374:'Lateinischer Buchstabe Y mit Zirkumflex',373:'Kleiner lateinischer Buchstabe w mit Zirkumflex',375:'Kleiner lateinischer Buchstabe y mit Zirkumflex',sbquo:'Tiefergestelltes Komma',8219:'Rumgedrehtes Komma',bdquo:'Doppeltes Anführungszeichen unten',hellip:'horizontale Auslassungspunkte',trade:'Handelszeichen',9658:'Dreickspfeil rechts',bull:'Bullet',rarr:'Pfeil rechts',rArr:'Doppelpfeil rechts',hArr:'Doppelpfeil links',diams:'Karo',asymp:'Ungefähr'});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/el.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/el.js
index 4e9df1e..e502623 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/el.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/el.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('specialchar','el',{euro:'Σύμβολο Ευρώ',lsquo:'Αριστερός χαρακτήρας μονού εισαγωγικού',rsquo:'Δεξιός χαρακτήρας μονού εισαγωγικού',ldquo:'Αριστερός χαρακτήρας διπλού εισαγωγικού',rdquo:'Δεξιός χαρακτήρας διπλού εισαγωγικού',ndash:'Παύλα en',mdash:'Παύλα em',iexcl:'Ανάποδο θαυμαστικό',cent:'Σύμβολο Σεντ',pound:'Σύμβολο λίρας',curren:'Σύμβολο συναλλαγματικής μονάδας',yen:'Σύμβολο Γιέν',brvbar:'Σπασμένη μπάρα',sect:'Σύμβολο τμήματος',uml:'Διαίρεση',copy:'Σύμβολο πνευματικών δικαιωμάτων',ordf:'Feminine ordinal indicator',laquo:'Left-pointing double angle quotation mark',not:'Not sign',reg:'Registered sign',macr:'Macron',deg:'Degree sign',sup2:'Superscript two',sup3:'Superscript three',acute:'Acute accent',micro:'Micro sign',para:'Pilcrow sign',middot:'Middle dot',cedil:'Cedilla',sup1:'Superscript one',ordm:'Masculine ordinal indicator',raquo:'Right-pointing double angle quotation mark',frac14:'Vulgar fraction one quarter',frac12:'Vulgar fraction one half',frac34:'Vulgar fraction three quarters',iquest:'Inverted question mark',Agrave:'Latin capital letter A with grave accent',Aacute:'Latin capital letter A with acute accent',Acirc:'Latin capital letter A with circumflex',Atilde:'Latin capital letter A with tilde',Auml:'Latin capital letter A with diaeresis',Aring:'Latin capital letter A with ring above',AElig:'Latin Capital letter Æ',Ccedil:'Latin capital letter C with cedilla',Egrave:'Latin capital letter E with grave accent',Eacute:'Latin capital letter E with acute accent',Ecirc:'Latin capital letter E with circumflex',Euml:'Latin capital letter E with diaeresis',Igrave:'Latin capital letter I with grave accent',Iacute:'Latin capital letter I with acute accent',Icirc:'Latin capital letter I with circumflex',Iuml:'Latin capital letter I with diaeresis',ETH:'Latin capital letter Eth',Ntilde:'Latin capital letter N with tilde',Ograve:'Latin capital letter O with grave accent',Oacute:'Latin capital letter O with acute accent',Ocirc:'Latin capital letter O with circumflex',Otilde:'Latin capital letter O with tilde',Ouml:'Latin capital letter O with diaeresis',times:'Multiplication sign',Oslash:'Latin capital letter O with stroke',Ugrave:'Latin capital letter U with grave accent',Uacute:'Latin capital letter U with acute accent',Ucirc:'Latin capital letter U with circumflex',Uuml:'Latin capital letter U with diaeresis',Yacute:'Latin capital letter Y with acute accent',THORN:'Latin capital letter Thorn',szlig:'Latin small letter sharp s',agrave:'Latin small letter a with grave accent',aacute:'Latin small letter a with acute accent',acirc:'Latin small letter a with circumflex',atilde:'Latin small letter a with tilde',auml:'Latin small letter a with diaeresis',aring:'Latin small letter a with ring above',aelig:'Latin small letter æ',ccedil:'Latin small letter c with cedilla',egrave:'Latin small letter e with grave accent',eacute:'Latin small letter e with acute accent',ecirc:'Latin small letter e with circumflex',euml:'Latin small letter e with diaeresis',igrave:'Latin small letter i with grave accent',iacute:'Latin small letter i with acute accent',icirc:'Latin small letter i with circumflex',iuml:'Latin small letter i with diaeresis',eth:'Latin small letter eth',ntilde:'Latin small letter n with tilde',ograve:'Latin small letter o with grave accent',oacute:'Latin small letter o with acute accent',ocirc:'Latin small letter o with circumflex',otilde:'Latin small letter o with tilde',ouml:'Latin small letter o with diaeresis',divide:'Division sign',oslash:'Latin small letter o with stroke',ugrave:'Latin small letter u with grave accent',uacute:'Latin small letter u with acute accent',ucirc:'Latin small letter u with circumflex',uuml:'Latin small letter u with diaeresis',yacute:'Latin small letter y with acute accent',thorn:'Latin small letter thorn',yuml:'Latin small letter y with diaeresis',OElig:'Latin capital ligature OE',oelig:'Latin small ligature oe',372:'Latin capital letter W with circumflex',374:'Latin capital letter Y with circumflex',373:'Latin small letter w with circumflex',375:'Latin small letter y with circumflex',sbquo:'Single low-9 quotation mark',8219:'Single high-reversed-9 quotation mark',bdquo:'Double low-9 quotation mark',hellip:'Horizontal ellipsis',trade:'Trade mark sign',9658:'Black right-pointing pointer',bull:'Bullet',rarr:'Rightwards arrow',rArr:'Rightwards double arrow',hArr:'Left right double arrow',diams:'Black diamond suit',asymp:'Almost equal to'});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('specialchar','el',{euro:'Σύμβολο Ευρώ',lsquo:'Αριστερός χαρακτήρας μονού εισαγωγικού',rsquo:'Δεξιός χαρακτήρας μονού εισαγωγικού',ldquo:'Αριστερός χαρακτήρας διπλού εισαγωγικού',rdquo:'Δεξιός χαρακτήρας διπλού εισαγωγικού',ndash:'Παύλα en',mdash:'Παύλα em',iexcl:'Ανάποδο θαυμαστικό',cent:'Σύμβολο Σεντ',pound:'Σύμβολο λίρας',curren:'Σύμβολο συναλλαγματικής μονάδας',yen:'Σύμβολο Γιέν',brvbar:'Σπασμένη μπάρα',sect:'Σύμβολο τμήματος',uml:'Διαίρεση',copy:'Σύμβολο πνευματικών δικαιωμάτων',ordf:'Feminine ordinal indicator',laquo:'Left-pointing double angle quotation mark',not:'Not sign',reg:'Registered sign',macr:'Macron',deg:'Degree sign',sup2:'Superscript two',sup3:'Superscript three',acute:'Acute accent',micro:'Micro sign',para:'Pilcrow sign',middot:'Middle dot',cedil:'Cedilla',sup1:'Superscript one',ordm:'Masculine ordinal indicator',raquo:'Right-pointing double angle quotation mark',frac14:'Vulgar fraction one quarter',frac12:'Vulgar fraction one half',frac34:'Vulgar fraction three quarters',iquest:'Inverted question mark',Agrave:'Latin capital letter A with grave accent',Aacute:'Latin capital letter A with acute accent',Acirc:'Latin capital letter A with circumflex',Atilde:'Latin capital letter A with tilde',Auml:'Latin capital letter A with diaeresis',Aring:'Latin capital letter A with ring above',AElig:'Latin Capital letter Æ',Ccedil:'Latin capital letter C with cedilla',Egrave:'Latin capital letter E with grave accent',Eacute:'Latin capital letter E with acute accent',Ecirc:'Latin capital letter E with circumflex',Euml:'Latin capital letter E with diaeresis',Igrave:'Latin capital letter I with grave accent',Iacute:'Latin capital letter I with acute accent',Icirc:'Latin capital letter I with circumflex',Iuml:'Latin capital letter I with diaeresis',ETH:'Latin capital letter Eth',Ntilde:'Latin capital letter N with tilde',Ograve:'Latin capital letter O with grave accent',Oacute:'Latin capital letter O with acute accent',Ocirc:'Latin capital letter O with circumflex',Otilde:'Latin capital letter O with tilde',Ouml:'Latin capital letter O with diaeresis',times:'Multiplication sign',Oslash:'Latin capital letter O with stroke',Ugrave:'Latin capital letter U with grave accent',Uacute:'Latin capital letter U with acute accent',Ucirc:'Latin capital letter U with circumflex',Uuml:'Latin capital letter U with diaeresis',Yacute:'Latin capital letter Y with acute accent',THORN:'Latin capital letter Thorn',szlig:'Latin small letter sharp s',agrave:'Latin small letter a with grave accent',aacute:'Latin small letter a with acute accent',acirc:'Latin small letter a with circumflex',atilde:'Latin small letter a with tilde',auml:'Latin small letter a with diaeresis',aring:'Latin small letter a with ring above',aelig:'Latin small letter æ',ccedil:'Latin small letter c with cedilla',egrave:'Latin small letter e with grave accent',eacute:'Latin small letter e with acute accent',ecirc:'Latin small letter e with circumflex',euml:'Latin small letter e with diaeresis',igrave:'Latin small letter i with grave accent',iacute:'Latin small letter i with acute accent',icirc:'Latin small letter i with circumflex',iuml:'Latin small letter i with diaeresis',eth:'Latin small letter eth',ntilde:'Latin small letter n with tilde',ograve:'Latin small letter o with grave accent',oacute:'Latin small letter o with acute accent',ocirc:'Latin small letter o with circumflex',otilde:'Latin small letter o with tilde',ouml:'Latin small letter o with diaeresis',divide:'Division sign',oslash:'Latin small letter o with stroke',ugrave:'Latin small letter u with grave accent',uacute:'Latin small letter u with acute accent',ucirc:'Latin small letter u with circumflex',uuml:'Latin small letter u with diaeresis',yacute:'Latin small letter y with acute accent',thorn:'Latin small letter thorn',yuml:'Latin small letter y with diaeresis',OElig:'Latin capital ligature OE',oelig:'Latin small ligature oe',372:'Latin capital letter W with circumflex',374:'Latin capital letter Y with circumflex',373:'Latin small letter w with circumflex',375:'Latin small letter y with circumflex',sbquo:'Single low-9 quotation mark',8219:'Single high-reversed-9 quotation mark',bdquo:'Double low-9 quotation mark',hellip:'Horizontal ellipsis',trade:'Trade mark sign',9658:'Black right-pointing pointer',bull:'Bullet',rarr:'Rightwards arrow',rArr:'Rightwards double arrow',hArr:'Left right double arrow',diams:'Black diamond suit',asymp:'Almost equal to'});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/en.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/en.js
index 575001f..1161d26 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/en.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/en.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('specialchar','en',{euro:'Euro sign',lsquo:'Left single quotation mark',rsquo:'Right single quotation mark',ldquo:'Left double quotation mark',rdquo:'Right double quotation mark',ndash:'En dash',mdash:'Em dash',iexcl:'Inverted exclamation mark',cent:'Cent sign',pound:'Pound sign',curren:'Currency sign',yen:'Yen sign',brvbar:'Broken bar',sect:'Section sign',uml:'Diaeresis',copy:'Copyright sign',ordf:'Feminine ordinal indicator',laquo:'Left-pointing double angle quotation mark',not:'Not sign',reg:'Registered sign',macr:'Macron',deg:'Degree sign',sup2:'Superscript two',sup3:'Superscript three',acute:'Acute accent',micro:'Micro sign',para:'Pilcrow sign',middot:'Middle dot',cedil:'Cedilla',sup1:'Superscript one',ordm:'Masculine ordinal indicator',raquo:'Right-pointing double angle quotation mark',frac14:'Vulgar fraction one quarter',frac12:'Vulgar fraction one half',frac34:'Vulgar fraction three quarters',iquest:'Inverted question mark',Agrave:'Latin capital letter A with grave accent',Aacute:'Latin capital letter A with acute accent',Acirc:'Latin capital letter A with circumflex',Atilde:'Latin capital letter A with tilde',Auml:'Latin capital letter A with diaeresis',Aring:'Latin capital letter A with ring above',AElig:'Latin Capital letter Æ',Ccedil:'Latin capital letter C with cedilla',Egrave:'Latin capital letter E with grave accent',Eacute:'Latin capital letter E with acute accent',Ecirc:'Latin capital letter E with circumflex',Euml:'Latin capital letter E with diaeresis',Igrave:'Latin capital letter I with grave accent',Iacute:'Latin capital letter I with acute accent',Icirc:'Latin capital letter I with circumflex',Iuml:'Latin capital letter I with diaeresis',ETH:'Latin capital letter Eth',Ntilde:'Latin capital letter N with tilde',Ograve:'Latin capital letter O with grave accent',Oacute:'Latin capital letter O with acute accent',Ocirc:'Latin capital letter O with circumflex',Otilde:'Latin capital letter O with tilde',Ouml:'Latin capital letter O with diaeresis',times:'Multiplication sign',Oslash:'Latin capital letter O with stroke',Ugrave:'Latin capital letter U with grave accent',Uacute:'Latin capital letter U with acute accent',Ucirc:'Latin capital letter U with circumflex',Uuml:'Latin capital letter U with diaeresis',Yacute:'Latin capital letter Y with acute accent',THORN:'Latin capital letter Thorn',szlig:'Latin small letter sharp s',agrave:'Latin small letter a with grave accent',aacute:'Latin small letter a with acute accent',acirc:'Latin small letter a with circumflex',atilde:'Latin small letter a with tilde',auml:'Latin small letter a with diaeresis',aring:'Latin small letter a with ring above',aelig:'Latin small letter æ',ccedil:'Latin small letter c with cedilla',egrave:'Latin small letter e with grave accent',eacute:'Latin small letter e with acute accent',ecirc:'Latin small letter e with circumflex',euml:'Latin small letter e with diaeresis',igrave:'Latin small letter i with grave accent',iacute:'Latin small letter i with acute accent',icirc:'Latin small letter i with circumflex',iuml:'Latin small letter i with diaeresis',eth:'Latin small letter eth',ntilde:'Latin small letter n with tilde',ograve:'Latin small letter o with grave accent',oacute:'Latin small letter o with acute accent',ocirc:'Latin small letter o with circumflex',otilde:'Latin small letter o with tilde',ouml:'Latin small letter o with diaeresis',divide:'Division sign',oslash:'Latin small letter o with stroke',ugrave:'Latin small letter u with grave accent',uacute:'Latin small letter u with acute accent',ucirc:'Latin small letter u with circumflex',uuml:'Latin small letter u with diaeresis',yacute:'Latin small letter y with acute accent',thorn:'Latin small letter thorn',yuml:'Latin small letter y with diaeresis',OElig:'Latin capital ligature OE',oelig:'Latin small ligature oe',372:'Latin capital letter W with circumflex',374:'Latin capital letter Y with circumflex',373:'Latin small letter w with circumflex',375:'Latin small letter y with circumflex',sbquo:'Single low-9 quotation mark',8219:'Single high-reversed-9 quotation mark',bdquo:'Double low-9 quotation mark',hellip:'Horizontal ellipsis',trade:'Trade mark sign',9658:'Black right-pointing pointer',bull:'Bullet',rarr:'Rightwards arrow',rArr:'Rightwards double arrow',hArr:'Left right double arrow',diams:'Black diamond suit',asymp:'Almost equal to'});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('specialchar','en',{euro:'Euro sign',lsquo:'Left single quotation mark',rsquo:'Right single quotation mark',ldquo:'Left double quotation mark',rdquo:'Right double quotation mark',ndash:'En dash',mdash:'Em dash',iexcl:'Inverted exclamation mark',cent:'Cent sign',pound:'Pound sign',curren:'Currency sign',yen:'Yen sign',brvbar:'Broken bar',sect:'Section sign',uml:'Diaeresis',copy:'Copyright sign',ordf:'Feminine ordinal indicator',laquo:'Left-pointing double angle quotation mark',not:'Not sign',reg:'Registered sign',macr:'Macron',deg:'Degree sign',sup2:'Superscript two',sup3:'Superscript three',acute:'Acute accent',micro:'Micro sign',para:'Pilcrow sign',middot:'Middle dot',cedil:'Cedilla',sup1:'Superscript one',ordm:'Masculine ordinal indicator',raquo:'Right-pointing double angle quotation mark',frac14:'Vulgar fraction one quarter',frac12:'Vulgar fraction one half',frac34:'Vulgar fraction three quarters',iquest:'Inverted question mark',Agrave:'Latin capital letter A with grave accent',Aacute:'Latin capital letter A with acute accent',Acirc:'Latin capital letter A with circumflex',Atilde:'Latin capital letter A with tilde',Auml:'Latin capital letter A with diaeresis',Aring:'Latin capital letter A with ring above',AElig:'Latin Capital letter Æ',Ccedil:'Latin capital letter C with cedilla',Egrave:'Latin capital letter E with grave accent',Eacute:'Latin capital letter E with acute accent',Ecirc:'Latin capital letter E with circumflex',Euml:'Latin capital letter E with diaeresis',Igrave:'Latin capital letter I with grave accent',Iacute:'Latin capital letter I with acute accent',Icirc:'Latin capital letter I with circumflex',Iuml:'Latin capital letter I with diaeresis',ETH:'Latin capital letter Eth',Ntilde:'Latin capital letter N with tilde',Ograve:'Latin capital letter O with grave accent',Oacute:'Latin capital letter O with acute accent',Ocirc:'Latin capital letter O with circumflex',Otilde:'Latin capital letter O with tilde',Ouml:'Latin capital letter O with diaeresis',times:'Multiplication sign',Oslash:'Latin capital letter O with stroke',Ugrave:'Latin capital letter U with grave accent',Uacute:'Latin capital letter U with acute accent',Ucirc:'Latin capital letter U with circumflex',Uuml:'Latin capital letter U with diaeresis',Yacute:'Latin capital letter Y with acute accent',THORN:'Latin capital letter Thorn',szlig:'Latin small letter sharp s',agrave:'Latin small letter a with grave accent',aacute:'Latin small letter a with acute accent',acirc:'Latin small letter a with circumflex',atilde:'Latin small letter a with tilde',auml:'Latin small letter a with diaeresis',aring:'Latin small letter a with ring above',aelig:'Latin small letter æ',ccedil:'Latin small letter c with cedilla',egrave:'Latin small letter e with grave accent',eacute:'Latin small letter e with acute accent',ecirc:'Latin small letter e with circumflex',euml:'Latin small letter e with diaeresis',igrave:'Latin small letter i with grave accent',iacute:'Latin small letter i with acute accent',icirc:'Latin small letter i with circumflex',iuml:'Latin small letter i with diaeresis',eth:'Latin small letter eth',ntilde:'Latin small letter n with tilde',ograve:'Latin small letter o with grave accent',oacute:'Latin small letter o with acute accent',ocirc:'Latin small letter o with circumflex',otilde:'Latin small letter o with tilde',ouml:'Latin small letter o with diaeresis',divide:'Division sign',oslash:'Latin small letter o with stroke',ugrave:'Latin small letter u with grave accent',uacute:'Latin small letter u with acute accent',ucirc:'Latin small letter u with circumflex',uuml:'Latin small letter u with diaeresis',yacute:'Latin small letter y with acute accent',thorn:'Latin small letter thorn',yuml:'Latin small letter y with diaeresis',OElig:'Latin capital ligature OE',oelig:'Latin small ligature oe',372:'Latin capital letter W with circumflex',374:'Latin capital letter Y with circumflex',373:'Latin small letter w with circumflex',375:'Latin small letter y with circumflex',sbquo:'Single low-9 quotation mark',8219:'Single high-reversed-9 quotation mark',bdquo:'Double low-9 quotation mark',hellip:'Horizontal ellipsis',trade:'Trade mark sign',9658:'Black right-pointing pointer',bull:'Bullet',rarr:'Rightwards arrow',rArr:'Rightwards double arrow',hArr:'Left right double arrow',diams:'Black diamond suit',asymp:'Almost equal to'});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/eo.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/eo.js
index e9cdb39..eb346da 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/eo.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/eo.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('specialchar','eo',{euro:'Eŭrosigno',lsquo:'Supra 6-citilo',rsquo:'Supra 9-citilo',ldquo:'Supra 66-citilo',rdquo:'Supra 99-citilo',ndash:'Streketo',mdash:'Substreko',iexcl:'Renversita krisigno',cent:'Cendosigno',pound:'Pundosigno',curren:'Monersigno',yen:'Enosigno',brvbar:'Rompita vertikala streko',sect:'Kurba paragrafo',uml:'Tremao',copy:'Kopirajtosigno',ordf:'Adjektiva numerfinaĵo',laquo:'Duobla malplio-citilo',not:'Negohoko',reg:'Registrita marko',macr:'Superstreko',deg:'Gradosigno',sup2:'Supra indico 2',sup3:'Supra indico 3',acute:'Dekstra korno',micro:'Mikrosigno',para:'Rekta paragrafo',middot:'Meza punkto',cedil:'Zoeto',sup1:'Supra indico 1',ordm:'Substantiva numerfinaĵo',raquo:'Duobla plio-citilo',frac14:'Kvaronosigno',frac12:'Duonosigno',frac34:'Trikvaronosigno',iquest:'renversita demandosigno',Agrave:'Latina ĉeflitero A kun liva korno',Aacute:'Latina ĉeflitero A kun dekstra korno',Acirc:'Latina ĉeflitero A kun ĉapelo',Atilde:'Latina ĉeflitero A kun tildo',Auml:'Latina ĉeflitero A kun tremao',Aring:'Latina ĉeflitero A kun superringo',AElig:'Latina ĉeflitera ligaturo Æ',Ccedil:'Latina ĉeflitero C kun zoeto',Egrave:'Latina ĉeflitero E kun liva korno',Eacute:'Latina ĉeflitero E kun dekstra korno',Ecirc:'Latina ĉeflitero E kun ĉapelo',Euml:'Latina ĉeflitero E kun tremao',Igrave:'Latina ĉeflitero I kun liva korno',Iacute:'Latina ĉeflitero I kun dekstra korno',Icirc:'Latina ĉeflitero I kun ĉapelo',Iuml:'Latina ĉeflitero I kun tremao',ETH:'Latina ĉeflitero islanda edo',Ntilde:'Latina ĉeflitero N kun tildo',Ograve:'Latina ĉeflitero O kun liva korno',Oacute:'Latina ĉeflitero O kun dekstra korno',Ocirc:'Latina ĉeflitero O kun ĉapelo',Otilde:'Latina ĉeflitero O kun tildo',Ouml:'Latina ĉeflitero O kun tremao',times:'Multipliko',Oslash:'Latina ĉeflitero O trastrekita',Ugrave:'Latina ĉeflitero U kun liva korno',Uacute:'Latina ĉeflitero U kun dekstra korno',Ucirc:'Latina ĉeflitero U kun ĉapelo',Uuml:'Latina ĉeflitero U kun tremao',Yacute:'Latina ĉeflitero Y kun dekstra korno',THORN:'Latina ĉeflitero islanda dorno',szlig:'Latina etlitero germana sozo (akra s)',agrave:'Latina etlitero a kun liva korno',aacute:'Latina etlitero a kun dekstra korno',acirc:'Latina etlitero a kun ĉapelo',atilde:'Latina etlitero a kun tildo',auml:'Latina etlitero a kun tremao',aring:'Latina etlitero a kun superringo',aelig:'Latina etlitera ligaturo æ',ccedil:'Latina etlitero c kun zoeto',egrave:'Latina etlitero e kun liva korno',eacute:'Latina etlitero e kun dekstra korno',ecirc:'Latina etlitero e kun ĉapelo',euml:'Latina etlitero e kun tremao',igrave:'Latina etlitero i kun liva korno',iacute:'Latina etlitero i kun dekstra korno',icirc:'Latina etlitero i kun ĉapelo',iuml:'Latina etlitero i kun tremao',eth:'Latina etlitero islanda edo',ntilde:'Latina etlitero n kun tildo',ograve:'Latina etlitero o kun liva korno',oacute:'Latina etlitero o kun dekstra korno',ocirc:'Latina etlitero o kun ĉapelo',otilde:'Latina etlitero o kun tildo',ouml:'Latina etlitero o kun tremao',divide:'Dividosigno',oslash:'Latina etlitero o trastrekita',ugrave:'Latina etlitero u kun liva korno',uacute:'Latina etlitero u kun dekstra korno',ucirc:'Latina etlitero u kun ĉapelo',uuml:'Latina etlitero u kun tremao',yacute:'Latina etlitero y kun dekstra korno',thorn:'Latina etlitero islanda dorno',yuml:'Latina etlitero y kun tremao',OElig:'Latina ĉeflitera ligaturo Œ',oelig:'Latina etlitera ligaturo œ',372:'Latina ĉeflitero W kun ĉapelo',374:'Latina ĉeflitero Y kun ĉapelo',373:'Latina etlitero w kun ĉapelo',375:'Latina etlitero y kun ĉapelo',sbquo:'Suba 9-citilo',8219:'Supra renversita 9-citilo',bdquo:'Suba 99-citilo',hellip:'Tripunkto',trade:'Varmarka signo',9658:'Nigra sago dekstren',bull:'Bulmarko',rarr:'Sago dekstren',rArr:'Duobla sago dekstren',hArr:'Duobla sago maldekstren',diams:'Nigra kvadrato',asymp:'Preskaŭ egala'});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('specialchar','eo',{euro:'Eŭrosigno',lsquo:'Supra 6-citilo',rsquo:'Supra 9-citilo',ldquo:'Supra 66-citilo',rdquo:'Supra 99-citilo',ndash:'Streketo',mdash:'Substreko',iexcl:'Renversita krisigno',cent:'Cendosigno',pound:'Pundosigno',curren:'Monersigno',yen:'Enosigno',brvbar:'Rompita vertikala streko',sect:'Kurba paragrafo',uml:'Tremao',copy:'Kopirajtosigno',ordf:'Adjektiva numerfinaĵo',laquo:'Duobla malplio-citilo',not:'Negohoko',reg:'Registrita marko',macr:'Superstreko',deg:'Gradosigno',sup2:'Supra indico 2',sup3:'Supra indico 3',acute:'Dekstra korno',micro:'Mikrosigno',para:'Rekta paragrafo',middot:'Meza punkto',cedil:'Zoeto',sup1:'Supra indico 1',ordm:'Substantiva numerfinaĵo',raquo:'Duobla plio-citilo',frac14:'Kvaronosigno',frac12:'Duonosigno',frac34:'Trikvaronosigno',iquest:'renversita demandosigno',Agrave:'Latina ĉeflitero A kun liva korno',Aacute:'Latina ĉeflitero A kun dekstra korno',Acirc:'Latina ĉeflitero A kun ĉapelo',Atilde:'Latina ĉeflitero A kun tildo',Auml:'Latina ĉeflitero A kun tremao',Aring:'Latina ĉeflitero A kun superringo',AElig:'Latina ĉeflitera ligaturo Æ',Ccedil:'Latina ĉeflitero C kun zoeto',Egrave:'Latina ĉeflitero E kun liva korno',Eacute:'Latina ĉeflitero E kun dekstra korno',Ecirc:'Latina ĉeflitero E kun ĉapelo',Euml:'Latina ĉeflitero E kun tremao',Igrave:'Latina ĉeflitero I kun liva korno',Iacute:'Latina ĉeflitero I kun dekstra korno',Icirc:'Latina ĉeflitero I kun ĉapelo',Iuml:'Latina ĉeflitero I kun tremao',ETH:'Latina ĉeflitero islanda edo',Ntilde:'Latina ĉeflitero N kun tildo',Ograve:'Latina ĉeflitero O kun liva korno',Oacute:'Latina ĉeflitero O kun dekstra korno',Ocirc:'Latina ĉeflitero O kun ĉapelo',Otilde:'Latina ĉeflitero O kun tildo',Ouml:'Latina ĉeflitero O kun tremao',times:'Multipliko',Oslash:'Latina ĉeflitero O trastrekita',Ugrave:'Latina ĉeflitero U kun liva korno',Uacute:'Latina ĉeflitero U kun dekstra korno',Ucirc:'Latina ĉeflitero U kun ĉapelo',Uuml:'Latina ĉeflitero U kun tremao',Yacute:'Latina ĉeflitero Y kun dekstra korno',THORN:'Latina ĉeflitero islanda dorno',szlig:'Latina etlitero germana sozo (akra s)',agrave:'Latina etlitero a kun liva korno',aacute:'Latina etlitero a kun dekstra korno',acirc:'Latina etlitero a kun ĉapelo',atilde:'Latina etlitero a kun tildo',auml:'Latina etlitero a kun tremao',aring:'Latina etlitero a kun superringo',aelig:'Latina etlitera ligaturo æ',ccedil:'Latina etlitero c kun zoeto',egrave:'Latina etlitero e kun liva korno',eacute:'Latina etlitero e kun dekstra korno',ecirc:'Latina etlitero e kun ĉapelo',euml:'Latina etlitero e kun tremao',igrave:'Latina etlitero i kun liva korno',iacute:'Latina etlitero i kun dekstra korno',icirc:'Latina etlitero i kun ĉapelo',iuml:'Latina etlitero i kun tremao',eth:'Latina etlitero islanda edo',ntilde:'Latina etlitero n kun tildo',ograve:'Latina etlitero o kun liva korno',oacute:'Latina etlitero o kun dekstra korno',ocirc:'Latina etlitero o kun ĉapelo',otilde:'Latina etlitero o kun tildo',ouml:'Latina etlitero o kun tremao',divide:'Dividosigno',oslash:'Latina etlitero o trastrekita',ugrave:'Latina etlitero u kun liva korno',uacute:'Latina etlitero u kun dekstra korno',ucirc:'Latina etlitero u kun ĉapelo',uuml:'Latina etlitero u kun tremao',yacute:'Latina etlitero y kun dekstra korno',thorn:'Latina etlitero islanda dorno',yuml:'Latina etlitero y kun tremao',OElig:'Latina ĉeflitera ligaturo Œ',oelig:'Latina etlitera ligaturo œ',372:'Latina ĉeflitero W kun ĉapelo',374:'Latina ĉeflitero Y kun ĉapelo',373:'Latina etlitero w kun ĉapelo',375:'Latina etlitero y kun ĉapelo',sbquo:'Suba 9-citilo',8219:'Supra renversita 9-citilo',bdquo:'Suba 99-citilo',hellip:'Tripunkto',trade:'Varmarka signo',9658:'Nigra sago dekstren',bull:'Bulmarko',rarr:'Sago dekstren',rArr:'Duobla sago dekstren',hArr:'Duobla sago maldekstren',diams:'Nigra kvadrato',asymp:'Preskaŭ egala'});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/et.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/et.js
index b0f71c4..a33c9de 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/et.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/et.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('specialchar','et',{euro:'Euromärk',lsquo:'Alustav ühekordne jutumärk',rsquo:'Lõpetav ühekordne jutumärk',ldquo:'Alustav kahekordne jutumärk',rdquo:'Lõpetav kahekordne jutumärk',ndash:'Enn-kriips',mdash:'Emm-kriips',iexcl:'Pööratud hüüumärk',cent:'Sendimärk',pound:'Naela märk',curren:'Valuutamärk',yen:'Jeeni märk',brvbar:'Katkestatud kriips',sect:'Lõigu märk',uml:'Täpid',copy:'Autoriõiguse märk',ordf:'Feminine ordinal indicator',laquo:'Left-pointing double angle quotation mark',not:'Ei-märk',reg:'Registered sign',macr:'Macron',deg:'Kraadimärk',sup2:'Ülaindeks kaks',sup3:'Ülaindeks kolm',acute:'Acute accent',micro:'Mikro-märk',para:'Pilcrow sign',middot:'Keskpunkt',cedil:'Cedilla',sup1:'Ülaindeks üks',ordm:'Masculine ordinal indicator',raquo:'Right-pointing double angle quotation mark',frac14:'Vulgar fraction one quarter',frac12:'Vulgar fraction one half',frac34:'Vulgar fraction three quarters',iquest:'Inverted question mark',Agrave:'Latin capital letter A with grave accent',Aacute:'Latin capital letter A with acute accent',Acirc:'Latin capital letter A with circumflex',Atilde:'Ladina suur A tildega',Auml:'Latin capital letter A with diaeresis',Aring:'Latin capital letter A with ring above',AElig:'Latin Capital letter Æ',Ccedil:'Latin capital letter C with cedilla',Egrave:'Latin capital letter E with grave accent',Eacute:'Latin capital letter E with acute accent',Ecirc:'Latin capital letter E with circumflex',Euml:'Latin capital letter E with diaeresis',Igrave:'Latin capital letter I with grave accent',Iacute:'Latin capital letter I with acute accent',Icirc:'Latin capital letter I with circumflex',Iuml:'Latin capital letter I with diaeresis',ETH:'Latin capital letter Eth',Ntilde:'Latin capital letter N with tilde',Ograve:'Latin capital letter O with grave accent',Oacute:'Latin capital letter O with acute accent',Ocirc:'Latin capital letter O with circumflex',Otilde:'Latin capital letter O with tilde',Ouml:'Täppidega ladina suur O',times:'Multiplication sign',Oslash:'Latin capital letter O with stroke',Ugrave:'Latin capital letter U with grave accent',Uacute:'Latin capital letter U with acute accent',Ucirc:'Kandilise katusega suur ladina U',Uuml:'Täppidega ladina suur U',Yacute:'Latin capital letter Y with acute accent',THORN:'Latin capital letter Thorn',szlig:'Ladina väike terav s',agrave:'Latin small letter a with grave accent',aacute:'Latin small letter a with acute accent',acirc:'Kandilise katusega ladina väike a',atilde:'Tildega ladina väike a',auml:'Täppidega ladina väike a',aring:'Latin small letter a with ring above',aelig:'Latin small letter æ',ccedil:'Latin small letter c with cedilla',egrave:'Latin small letter e with grave accent',eacute:'Latin small letter e with acute accent',ecirc:'Latin small letter e with circumflex',euml:'Latin small letter e with diaeresis',igrave:'Latin small letter i with grave accent',iacute:'Latin small letter i with acute accent',icirc:'Latin small letter i with circumflex',iuml:'Latin small letter i with diaeresis',eth:'Latin small letter eth',ntilde:'Latin small letter n with tilde',ograve:'Latin small letter o with grave accent',oacute:'Latin small letter o with acute accent',ocirc:'Latin small letter o with circumflex',otilde:'Latin small letter o with tilde',ouml:'Latin small letter o with diaeresis',divide:'Division sign',oslash:'Latin small letter o with stroke',ugrave:'Latin small letter u with grave accent',uacute:'Latin small letter u with acute accent',ucirc:'Latin small letter u with circumflex',uuml:'Latin small letter u with diaeresis',yacute:'Latin small letter y with acute accent',thorn:'Latin small letter thorn',yuml:'Latin small letter y with diaeresis',OElig:'Latin capital ligature OE',oelig:'Latin small ligature oe',372:'Latin capital letter W with circumflex',374:'Latin capital letter Y with circumflex',373:'Latin small letter w with circumflex',375:'Latin small letter y with circumflex',sbquo:'Single low-9 quotation mark',8219:'Single high-reversed-9 quotation mark',bdquo:'Double low-9 quotation mark',hellip:'Horizontal ellipsis',trade:'Trade mark sign',9658:'Black right-pointing pointer',bull:'Bullet',rarr:'Rightwards arrow',rArr:'Rightwards double arrow',hArr:'Left right double arrow',diams:'Black diamond suit',asymp:'Almost equal to'});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('specialchar','et',{euro:'Euromärk',lsquo:'Alustav ühekordne jutumärk',rsquo:'Lõpetav ühekordne jutumärk',ldquo:'Alustav kahekordne jutumärk',rdquo:'Lõpetav kahekordne jutumärk',ndash:'Enn-kriips',mdash:'Emm-kriips',iexcl:'Pööratud hüüumärk',cent:'Sendimärk',pound:'Naela märk',curren:'Valuutamärk',yen:'Jeeni märk',brvbar:'Katkestatud kriips',sect:'Lõigu märk',uml:'Täpid',copy:'Autoriõiguse märk',ordf:'Feminine ordinal indicator',laquo:'Left-pointing double angle quotation mark',not:'Ei-märk',reg:'Registered sign',macr:'Macron',deg:'Kraadimärk',sup2:'Ülaindeks kaks',sup3:'Ülaindeks kolm',acute:'Acute accent',micro:'Mikro-märk',para:'Pilcrow sign',middot:'Keskpunkt',cedil:'Cedilla',sup1:'Ülaindeks üks',ordm:'Masculine ordinal indicator',raquo:'Right-pointing double angle quotation mark',frac14:'Vulgar fraction one quarter',frac12:'Vulgar fraction one half',frac34:'Vulgar fraction three quarters',iquest:'Inverted question mark',Agrave:'Latin capital letter A with grave accent',Aacute:'Latin capital letter A with acute accent',Acirc:'Latin capital letter A with circumflex',Atilde:'Ladina suur A tildega',Auml:'Latin capital letter A with diaeresis',Aring:'Latin capital letter A with ring above',AElig:'Latin Capital letter Æ',Ccedil:'Latin capital letter C with cedilla',Egrave:'Latin capital letter E with grave accent',Eacute:'Latin capital letter E with acute accent',Ecirc:'Latin capital letter E with circumflex',Euml:'Latin capital letter E with diaeresis',Igrave:'Latin capital letter I with grave accent',Iacute:'Latin capital letter I with acute accent',Icirc:'Latin capital letter I with circumflex',Iuml:'Latin capital letter I with diaeresis',ETH:'Latin capital letter Eth',Ntilde:'Latin capital letter N with tilde',Ograve:'Latin capital letter O with grave accent',Oacute:'Latin capital letter O with acute accent',Ocirc:'Latin capital letter O with circumflex',Otilde:'Latin capital letter O with tilde',Ouml:'Täppidega ladina suur O',times:'Multiplication sign',Oslash:'Latin capital letter O with stroke',Ugrave:'Latin capital letter U with grave accent',Uacute:'Latin capital letter U with acute accent',Ucirc:'Kandilise katusega suur ladina U',Uuml:'Täppidega ladina suur U',Yacute:'Latin capital letter Y with acute accent',THORN:'Latin capital letter Thorn',szlig:'Ladina väike terav s',agrave:'Latin small letter a with grave accent',aacute:'Latin small letter a with acute accent',acirc:'Kandilise katusega ladina väike a',atilde:'Tildega ladina väike a',auml:'Täppidega ladina väike a',aring:'Latin small letter a with ring above',aelig:'Latin small letter æ',ccedil:'Latin small letter c with cedilla',egrave:'Latin small letter e with grave accent',eacute:'Latin small letter e with acute accent',ecirc:'Latin small letter e with circumflex',euml:'Latin small letter e with diaeresis',igrave:'Latin small letter i with grave accent',iacute:'Latin small letter i with acute accent',icirc:'Latin small letter i with circumflex',iuml:'Latin small letter i with diaeresis',eth:'Latin small letter eth',ntilde:'Latin small letter n with tilde',ograve:'Latin small letter o with grave accent',oacute:'Latin small letter o with acute accent',ocirc:'Latin small letter o with circumflex',otilde:'Latin small letter o with tilde',ouml:'Latin small letter o with diaeresis',divide:'Division sign',oslash:'Latin small letter o with stroke',ugrave:'Latin small letter u with grave accent',uacute:'Latin small letter u with acute accent',ucirc:'Latin small letter u with circumflex',uuml:'Latin small letter u with diaeresis',yacute:'Latin small letter y with acute accent',thorn:'Latin small letter thorn',yuml:'Latin small letter y with diaeresis',OElig:'Latin capital ligature OE',oelig:'Latin small ligature oe',372:'Latin capital letter W with circumflex',374:'Latin capital letter Y with circumflex',373:'Latin small letter w with circumflex',375:'Latin small letter y with circumflex',sbquo:'Single low-9 quotation mark',8219:'Single high-reversed-9 quotation mark',bdquo:'Double low-9 quotation mark',hellip:'Horizontal ellipsis',trade:'Trade mark sign',9658:'Black right-pointing pointer',bull:'Bullet',rarr:'Rightwards arrow',rArr:'Rightwards double arrow',hArr:'Left right double arrow',diams:'Black diamond suit',asymp:'Almost equal to'});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/fa.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/fa.js
index 25c8792..e8b8981 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/fa.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/fa.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('specialchar','fa',{euro:'نشان یورو',lsquo:'علامت نقل قول تکی چپ',rsquo:'علامت نقل قول تکی راست',ldquo:'علامت دوتایی نقل قول چپ',rdquo:'علامت دوتایی نقل قول راست',ndash:'En dash',mdash:'Em dash',iexcl:'علامت گذاری به عنوان علامت تعجب وارونه',cent:'نشان سنت',pound:'نشان پوند',curren:'نشان ارز',yen:'نشان ین',brvbar:'نوار شکسته',sect:'نشان بخش',uml:'Diaeresis',copy:'نشان کپی رایت',ordf:'Feminine ordinal indicator',laquo:'Left-pointing double angle quotation mark',not:'علامت ثبت نشده',reg:'علامت ثبت شده',macr:'Macron',deg:'نشان درجه',sup2:'بالانویس دو',sup3:'بالانویس سه',acute:'لهجه غلیظ',micro:'نشان مایکرو',para:'Pilcrow sign',middot:'نقطه میانی',cedil:'Cedilla',sup1:'Superscript one',ordm:'Masculine ordinal indicator',raquo:'نشان زاویهدار دوتایی نقل قول راست چین',frac14:'Vulgar fraction one quarter',frac12:'Vulgar fraction one half',frac34:'Vulgar fraction three quarters',iquest:'Inverted question mark',Agrave:'Latin capital letter A with grave accent',Aacute:'Latin capital letter A with acute accent',Acirc:'Latin capital letter A with circumflex',Atilde:'Latin capital letter A with tilde',Auml:'Latin capital letter A with diaeresis',Aring:'Latin capital letter A with ring above',AElig:'Latin Capital letter Æ',Ccedil:'Latin capital letter C with cedilla',Egrave:'Latin capital letter E with grave accent',Eacute:'Latin capital letter E with acute accent',Ecirc:'Latin capital letter E with circumflex',Euml:'Latin capital letter E with diaeresis',Igrave:'Latin capital letter I with grave accent',Iacute:'Latin capital letter I with acute accent',Icirc:'Latin capital letter I with circumflex',Iuml:'Latin capital letter I with diaeresis',ETH:'Latin capital letter Eth',Ntilde:'Latin capital letter N with tilde',Ograve:'Latin capital letter O with grave accent',Oacute:'Latin capital letter O with acute accent',Ocirc:'Latin capital letter O with circumflex',Otilde:'Latin capital letter O with tilde',Ouml:'Latin capital letter O with diaeresis',times:'Multiplication sign',Oslash:'Latin capital letter O with stroke',Ugrave:'Latin capital letter U with grave accent',Uacute:'Latin capital letter U with acute accent',Ucirc:'Latin capital letter U with circumflex',Uuml:'Latin capital letter U with diaeresis',Yacute:'Latin capital letter Y with acute accent',THORN:'Latin capital letter Thorn',szlig:'Latin small letter sharp s',agrave:'Latin small letter a with grave accent',aacute:'Latin small letter a with acute accent',acirc:'Latin small letter a with circumflex',atilde:'Latin small letter a with tilde',auml:'Latin small letter a with diaeresis',aring:'Latin small letter a with ring above',aelig:'Latin small letter æ',ccedil:'Latin small letter c with cedilla',egrave:'Latin small letter e with grave accent',eacute:'Latin small letter e with acute accent',ecirc:'Latin small letter e with circumflex',euml:'Latin small letter e with diaeresis',igrave:'Latin small letter i with grave accent',iacute:'Latin small letter i with acute accent',icirc:'Latin small letter i with circumflex',iuml:'Latin small letter i with diaeresis',eth:'Latin small letter eth',ntilde:'Latin small letter n with tilde',ograve:'Latin small letter o with grave accent',oacute:'Latin small letter o with acute accent',ocirc:'Latin small letter o with circumflex',otilde:'Latin small letter o with tilde',ouml:'Latin small letter o with diaeresis',divide:'Division sign',oslash:'Latin small letter o with stroke',ugrave:'Latin small letter u with grave accent',uacute:'Latin small letter u with acute accent',ucirc:'Latin small letter u with circumflex',uuml:'Latin small letter u with diaeresis',yacute:'Latin small letter y with acute accent',thorn:'Latin small letter thorn',yuml:'Latin small letter y with diaeresis',OElig:'Latin capital ligature OE',oelig:'Latin small ligature oe',372:'Latin capital letter W with circumflex',374:'Latin capital letter Y with circumflex',373:'Latin small letter w with circumflex',375:'Latin small letter y with circumflex',sbquo:'Single low-9 quotation mark',8219:'Single high-reversed-9 quotation mark',bdquo:'Double low-9 quotation mark',hellip:'Horizontal ellipsis',trade:'Trade mark sign',9658:'Black right-pointing pointer',bull:'Bullet',rarr:'Rightwards arrow',rArr:'Rightwards double arrow',hArr:'جهتنمای دوتایی چپ به راست',diams:'Black diamond suit',asymp:'تقریبا برابر با'});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('specialchar','fa',{euro:'نشان یورو',lsquo:'علامت نقل قول تکی چپ',rsquo:'علامت نقل قول تکی راست',ldquo:'علامت دوتایی نقل قول چپ',rdquo:'علامت دوتایی نقل قول راست',ndash:'En dash',mdash:'Em dash',iexcl:'علامت گذاری به عنوان علامت تعجب وارونه',cent:'نشان سنت',pound:'نشان پوند',curren:'نشان ارز',yen:'نشان ین',brvbar:'نوار شکسته',sect:'نشان بخش',uml:'Diaeresis',copy:'نشان کپی رایت',ordf:'Feminine ordinal indicator',laquo:'Left-pointing double angle quotation mark',not:'علامت ثبت نشده',reg:'علامت ثبت شده',macr:'Macron',deg:'نشان درجه',sup2:'بالانویس دو',sup3:'بالانویس سه',acute:'لهجه غلیظ',micro:'نشان مایکرو',para:'Pilcrow sign',middot:'نقطه میانی',cedil:'Cedilla',sup1:'Superscript one',ordm:'Masculine ordinal indicator',raquo:'نشان زاویهدار دوتایی نقل قول راست چین',frac14:'Vulgar fraction one quarter',frac12:'Vulgar fraction one half',frac34:'Vulgar fraction three quarters',iquest:'Inverted question mark',Agrave:'Latin capital letter A with grave accent',Aacute:'Latin capital letter A with acute accent',Acirc:'Latin capital letter A with circumflex',Atilde:'Latin capital letter A with tilde',Auml:'Latin capital letter A with diaeresis',Aring:'Latin capital letter A with ring above',AElig:'Latin Capital letter Æ',Ccedil:'Latin capital letter C with cedilla',Egrave:'Latin capital letter E with grave accent',Eacute:'Latin capital letter E with acute accent',Ecirc:'Latin capital letter E with circumflex',Euml:'Latin capital letter E with diaeresis',Igrave:'Latin capital letter I with grave accent',Iacute:'Latin capital letter I with acute accent',Icirc:'Latin capital letter I with circumflex',Iuml:'Latin capital letter I with diaeresis',ETH:'Latin capital letter Eth',Ntilde:'Latin capital letter N with tilde',Ograve:'Latin capital letter O with grave accent',Oacute:'Latin capital letter O with acute accent',Ocirc:'Latin capital letter O with circumflex',Otilde:'Latin capital letter O with tilde',Ouml:'Latin capital letter O with diaeresis',times:'Multiplication sign',Oslash:'Latin capital letter O with stroke',Ugrave:'Latin capital letter U with grave accent',Uacute:'Latin capital letter U with acute accent',Ucirc:'Latin capital letter U with circumflex',Uuml:'Latin capital letter U with diaeresis',Yacute:'Latin capital letter Y with acute accent',THORN:'Latin capital letter Thorn',szlig:'Latin small letter sharp s',agrave:'Latin small letter a with grave accent',aacute:'Latin small letter a with acute accent',acirc:'Latin small letter a with circumflex',atilde:'Latin small letter a with tilde',auml:'Latin small letter a with diaeresis',aring:'Latin small letter a with ring above',aelig:'Latin small letter æ',ccedil:'Latin small letter c with cedilla',egrave:'Latin small letter e with grave accent',eacute:'Latin small letter e with acute accent',ecirc:'Latin small letter e with circumflex',euml:'Latin small letter e with diaeresis',igrave:'Latin small letter i with grave accent',iacute:'Latin small letter i with acute accent',icirc:'Latin small letter i with circumflex',iuml:'Latin small letter i with diaeresis',eth:'Latin small letter eth',ntilde:'Latin small letter n with tilde',ograve:'Latin small letter o with grave accent',oacute:'Latin small letter o with acute accent',ocirc:'Latin small letter o with circumflex',otilde:'Latin small letter o with tilde',ouml:'Latin small letter o with diaeresis',divide:'Division sign',oslash:'Latin small letter o with stroke',ugrave:'Latin small letter u with grave accent',uacute:'Latin small letter u with acute accent',ucirc:'Latin small letter u with circumflex',uuml:'Latin small letter u with diaeresis',yacute:'Latin small letter y with acute accent',thorn:'Latin small letter thorn',yuml:'Latin small letter y with diaeresis',OElig:'Latin capital ligature OE',oelig:'Latin small ligature oe',372:'Latin capital letter W with circumflex',374:'Latin capital letter Y with circumflex',373:'Latin small letter w with circumflex',375:'Latin small letter y with circumflex',sbquo:'Single low-9 quotation mark',8219:'Single high-reversed-9 quotation mark',bdquo:'Double low-9 quotation mark',hellip:'Horizontal ellipsis',trade:'Trade mark sign',9658:'Black right-pointing pointer',bull:'Bullet',rarr:'Rightwards arrow',rArr:'Rightwards double arrow',hArr:'جهتنمای دوتایی چپ به راست',diams:'Black diamond suit',asymp:'تقریبا برابر با'});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/fi.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/fi.js
index f710025..a0abd7c 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/fi.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/fi.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('specialchar','fi',{euro:'Euron merkki',lsquo:'Vasen yksittäinen lainausmerkki',rsquo:'Oikea yksittäinen lainausmerkki',ldquo:'Vasen kaksoislainausmerkki',rdquo:'Oikea kaksoislainausmerkki',ndash:'En dash',mdash:'Em dash',iexcl:'Inverted exclamation mark',cent:'Sentin merkki',pound:'Punnan merkki',curren:'Valuuttamerkki',yen:'Yenin merkki',brvbar:'Broken bar',sect:'Section sign',uml:'Diaeresis',copy:'Copyright sign',ordf:'Feminine ordinal indicator',laquo:'Left-pointing double angle quotation mark',not:'Not sign',reg:'Rekisteröity merkki',macr:'Macron',deg:'Asteen merkki',sup2:'Yläindeksi kaksi',sup3:'Yläindeksi kolme',acute:'Acute accent',micro:'Mikron merkki',para:'Pilcrow sign',middot:'Middle dot',cedil:'Cedilla',sup1:'Yläindeksi yksi',ordm:'Masculine ordinal indicator',raquo:'Right-pointing double angle quotation mark',frac14:'Vulgar fraction one quarter',frac12:'Vulgar fraction one half',frac34:'Vulgar fraction three quarters',iquest:'Ylösalaisin oleva kysymysmerkki',Agrave:'Latin capital letter A with grave accent',Aacute:'Latin capital letter A with acute accent',Acirc:'Latin capital letter A with circumflex',Atilde:'Latin capital letter A with tilde',Auml:'Latin capital letter A with diaeresis',Aring:'Latin capital letter A with ring above',AElig:'Latin Capital letter Æ',Ccedil:'Latin capital letter C with cedilla',Egrave:'Latin capital letter E with grave accent',Eacute:'Latin capital letter E with acute accent',Ecirc:'Latin capital letter E with circumflex',Euml:'Latin capital letter E with diaeresis',Igrave:'Latin capital letter I with grave accent',Iacute:'Latin capital letter I with acute accent',Icirc:'Latin capital letter I with circumflex',Iuml:'Latin capital letter I with diaeresis',ETH:'Latin capital letter Eth',Ntilde:'Latin capital letter N with tilde',Ograve:'Latin capital letter O with grave accent',Oacute:'Latin capital letter O with acute accent',Ocirc:'Latin capital letter O with circumflex',Otilde:'Latin capital letter O with tilde',Ouml:'Latin capital letter O with diaeresis',times:'Kertomerkki',Oslash:'Latin capital letter O with stroke',Ugrave:'Latin capital letter U with grave accent',Uacute:'Latin capital letter U with acute accent',Ucirc:'Latin capital letter U with circumflex',Uuml:'Latin capital letter U with diaeresis',Yacute:'Latin capital letter Y with acute accent',THORN:'Latin capital letter Thorn',szlig:'Latin small letter sharp s',agrave:'Latin small letter a with grave accent',aacute:'Latin small letter a with acute accent',acirc:'Latin small letter a with circumflex',atilde:'Latin small letter a with tilde',auml:'Latin small letter a with diaeresis',aring:'Latin small letter a with ring above',aelig:'Latin small letter æ',ccedil:'Latin small letter c with cedilla',egrave:'Latin small letter e with grave accent',eacute:'Latin small letter e with acute accent',ecirc:'Latin small letter e with circumflex',euml:'Latin small letter e with diaeresis',igrave:'Latin small letter i with grave accent',iacute:'Latin small letter i with acute accent',icirc:'Latin small letter i with circumflex',iuml:'Latin small letter i with diaeresis',eth:'Latin small letter eth',ntilde:'Latin small letter n with tilde',ograve:'Latin small letter o with grave accent',oacute:'Latin small letter o with acute accent',ocirc:'Latin small letter o with circumflex',otilde:'Latin small letter o with tilde',ouml:'Latin small letter o with diaeresis',divide:'Jakomerkki',oslash:'Latin small letter o with stroke',ugrave:'Latin small letter u with grave accent',uacute:'Latin small letter u with acute accent',ucirc:'Latin small letter u with circumflex',uuml:'Latin small letter u with diaeresis',yacute:'Latin small letter y with acute accent',thorn:'Latin small letter thorn',yuml:'Latin small letter y with diaeresis',OElig:'Latin capital ligature OE',oelig:'Latin small ligature oe',372:'Latin capital letter W with circumflex',374:'Latin capital letter Y with circumflex',373:'Latin small letter w with circumflex',375:'Latin small letter y with circumflex',sbquo:'Single low-9 quotation mark',8219:'Single high-reversed-9 quotation mark',bdquo:'Double low-9 quotation mark',hellip:'Horizontal ellipsis',trade:'Tavaramerkki merkki',9658:'Black right-pointing pointer',bull:'Bullet',rarr:'Nuoli oikealle',rArr:'Kaksoisnuoli oikealle',hArr:'Kaksoisnuoli oikealle ja vasemmalle',diams:'Black diamond suit',asymp:'Noin'});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('specialchar','fi',{euro:'Euron merkki',lsquo:'Vasen yksittäinen lainausmerkki',rsquo:'Oikea yksittäinen lainausmerkki',ldquo:'Vasen kaksoislainausmerkki',rdquo:'Oikea kaksoislainausmerkki',ndash:'En dash',mdash:'Em dash',iexcl:'Inverted exclamation mark',cent:'Sentin merkki',pound:'Punnan merkki',curren:'Valuuttamerkki',yen:'Yenin merkki',brvbar:'Broken bar',sect:'Section sign',uml:'Diaeresis',copy:'Copyright sign',ordf:'Feminine ordinal indicator',laquo:'Left-pointing double angle quotation mark',not:'Not sign',reg:'Rekisteröity merkki',macr:'Macron',deg:'Asteen merkki',sup2:'Yläindeksi kaksi',sup3:'Yläindeksi kolme',acute:'Acute accent',micro:'Mikron merkki',para:'Pilcrow sign',middot:'Middle dot',cedil:'Cedilla',sup1:'Yläindeksi yksi',ordm:'Masculine ordinal indicator',raquo:'Right-pointing double angle quotation mark',frac14:'Vulgar fraction one quarter',frac12:'Vulgar fraction one half',frac34:'Vulgar fraction three quarters',iquest:'Ylösalaisin oleva kysymysmerkki',Agrave:'Latin capital letter A with grave accent',Aacute:'Latin capital letter A with acute accent',Acirc:'Latin capital letter A with circumflex',Atilde:'Latin capital letter A with tilde',Auml:'Latin capital letter A with diaeresis',Aring:'Latin capital letter A with ring above',AElig:'Latin Capital letter Æ',Ccedil:'Latin capital letter C with cedilla',Egrave:'Latin capital letter E with grave accent',Eacute:'Latin capital letter E with acute accent',Ecirc:'Latin capital letter E with circumflex',Euml:'Latin capital letter E with diaeresis',Igrave:'Latin capital letter I with grave accent',Iacute:'Latin capital letter I with acute accent',Icirc:'Latin capital letter I with circumflex',Iuml:'Latin capital letter I with diaeresis',ETH:'Latin capital letter Eth',Ntilde:'Latin capital letter N with tilde',Ograve:'Latin capital letter O with grave accent',Oacute:'Latin capital letter O with acute accent',Ocirc:'Latin capital letter O with circumflex',Otilde:'Latin capital letter O with tilde',Ouml:'Latin capital letter O with diaeresis',times:'Kertomerkki',Oslash:'Latin capital letter O with stroke',Ugrave:'Latin capital letter U with grave accent',Uacute:'Latin capital letter U with acute accent',Ucirc:'Latin capital letter U with circumflex',Uuml:'Latin capital letter U with diaeresis',Yacute:'Latin capital letter Y with acute accent',THORN:'Latin capital letter Thorn',szlig:'Latin small letter sharp s',agrave:'Latin small letter a with grave accent',aacute:'Latin small letter a with acute accent',acirc:'Latin small letter a with circumflex',atilde:'Latin small letter a with tilde',auml:'Latin small letter a with diaeresis',aring:'Latin small letter a with ring above',aelig:'Latin small letter æ',ccedil:'Latin small letter c with cedilla',egrave:'Latin small letter e with grave accent',eacute:'Latin small letter e with acute accent',ecirc:'Latin small letter e with circumflex',euml:'Latin small letter e with diaeresis',igrave:'Latin small letter i with grave accent',iacute:'Latin small letter i with acute accent',icirc:'Latin small letter i with circumflex',iuml:'Latin small letter i with diaeresis',eth:'Latin small letter eth',ntilde:'Latin small letter n with tilde',ograve:'Latin small letter o with grave accent',oacute:'Latin small letter o with acute accent',ocirc:'Latin small letter o with circumflex',otilde:'Latin small letter o with tilde',ouml:'Latin small letter o with diaeresis',divide:'Jakomerkki',oslash:'Latin small letter o with stroke',ugrave:'Latin small letter u with grave accent',uacute:'Latin small letter u with acute accent',ucirc:'Latin small letter u with circumflex',uuml:'Latin small letter u with diaeresis',yacute:'Latin small letter y with acute accent',thorn:'Latin small letter thorn',yuml:'Latin small letter y with diaeresis',OElig:'Latin capital ligature OE',oelig:'Latin small ligature oe',372:'Latin capital letter W with circumflex',374:'Latin capital letter Y with circumflex',373:'Latin small letter w with circumflex',375:'Latin small letter y with circumflex',sbquo:'Single low-9 quotation mark',8219:'Single high-reversed-9 quotation mark',bdquo:'Double low-9 quotation mark',hellip:'Horizontal ellipsis',trade:'Tavaramerkki merkki',9658:'Black right-pointing pointer',bull:'Bullet',rarr:'Nuoli oikealle',rArr:'Kaksoisnuoli oikealle',hArr:'Kaksoisnuoli oikealle ja vasemmalle',diams:'Black diamond suit',asymp:'Noin'});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/fr.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/fr.js
index b128113..21df368 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/fr.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/fr.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('specialchar','fr',{euro:'Symbole Euro',lsquo:'Guillemet simple ouvrant',rsquo:'Guillemet simple fermant',ldquo:'Guillemet double ouvrant',rdquo:'Guillemet double fermant',ndash:'Tiret haut',mdash:'Tiret bas underscore',iexcl:"Point d'exclamation inversé",cent:'Symbole Cent',pound:'Symbole Livre Sterling',curren:'Symbole monétaire',yen:'Symbole Yen',brvbar:'Barre verticale scindée',sect:'Section',uml:'Tréma',copy:'Symbole Copyright',ordf:'Indicateur ordinal féminin',laquo:'Guillemet français ouvrant',not:'Crochet de négation',reg:'Marque déposée',macr:'Macron',deg:'Degré',sup2:'Exposant 2',sup3:'\\tExposant 3',acute:'Accent aigu',micro:'Omicron',para:'Paragraphe',middot:'Point médian',cedil:'Cédille',sup1:'\\tExposant 1',ordm:'Indicateur ordinal masculin',raquo:'Guillemet français fermant',frac14:'Un quart',frac12:'Un demi',frac34:'Trois quarts',iquest:"Point d'interrogation inversé",Agrave:'A majuscule accent grave',Aacute:'A majuscule accent aigu',Acirc:'A majuscule accent circonflexe',Atilde:'A majuscule avec caron',Auml:'A majuscule tréma',Aring:'A majuscule avec un rond au-dessus',AElig:'Æ majuscule ligaturés',Ccedil:'C majuscule cédille',Egrave:'E majuscule accent grave',Eacute:'E majuscule accent aigu',Ecirc:'E majuscule accent circonflexe',Euml:'E majuscule tréma',Igrave:'I majuscule accent grave',Iacute:'I majuscule accent aigu',Icirc:'I majuscule accent circonflexe',Iuml:'I majuscule tréma',ETH:'Lettre majuscule islandaise ED',Ntilde:'N majuscule avec caron',Ograve:'O majuscule accent grave',Oacute:'O majuscule accent aigu',Ocirc:'O majuscule accent circonflexe',Otilde:'O majuscule avec caron',Ouml:'O majuscule tréma',times:'Multiplication',Oslash:'O majuscule barré',Ugrave:'U majuscule accent grave',Uacute:'U majuscule accent aigu',Ucirc:'U majuscule accent circonflexe',Uuml:'U majuscule tréma',Yacute:'Y majuscule accent aigu',THORN:'Lettre islandaise Thorn majuscule',szlig:'Lettre minuscule allemande s dur',agrave:'a minuscule accent grave',aacute:'a minuscule accent aigu',acirc:'a minuscule accent circonflexe',atilde:'a minuscule avec caron',auml:'a minuscule tréma',aring:'a minuscule avec un rond au-dessus',aelig:'æ minuscule ligaturés',ccedil:'c minuscule cédille',egrave:'e minuscule accent grave',eacute:'e minuscule accent aigu',ecirc:'e minuscule accent circonflexe',euml:'e minuscule tréma',igrave:'i minuscule accent grave',iacute:'i minuscule accent aigu',icirc:'i minuscule accent circonflexe',iuml:'i minuscule tréma',eth:'Lettre minuscule islandaise ED',ntilde:'n minuscule avec caron',ograve:'o minuscule accent grave',oacute:'o minuscule accent aigu',ocirc:'o minuscule accent circonflexe',otilde:'o minuscule avec caron',ouml:'o minuscule tréma',divide:'Division',oslash:'o minuscule barré',ugrave:'u minuscule accent grave',uacute:'u minuscule accent aigu',ucirc:'u minuscule accent circonflexe',uuml:'u minuscule tréma',yacute:'y minuscule accent aigu',thorn:'Lettre islandaise thorn minuscule',yuml:'y minuscule tréma',OElig:'ligature majuscule latine Œ',oelig:'ligature minuscule latine œ',372:'W majuscule accent circonflexe',374:'Y majuscule accent circonflexe',373:'w minuscule accent circonflexe',375:'y minuscule accent circonflexe',sbquo:'Guillemet simple fermant (anglais)',8219:'Guillemet-virgule supérieur culbuté',bdquo:'Guillemet-virgule double inférieur',hellip:'Points de suspension',trade:'Marque commerciale (trade mark)',9658:'Flèche noire pointant vers la droite',bull:'Gros point médian',rarr:'Flèche vers la droite',rArr:'Double flèche vers la droite',hArr:'Double flèche vers la gauche',diams:'Carreau noir',asymp:'Presque égal'});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('specialchar','fr',{euro:'Symbole Euro',lsquo:'Guillemet simple ouvrant',rsquo:'Guillemet simple fermant',ldquo:'Guillemet double ouvrant',rdquo:'Guillemet double fermant',ndash:'Tiret haut',mdash:'Tiret bas underscore',iexcl:"Point d'exclamation inversé",cent:'Symbole Cent',pound:'Symbole Livre Sterling',curren:'Symbole monétaire',yen:'Symbole Yen',brvbar:'Barre verticale scindée',sect:'Section',uml:'Tréma',copy:'Symbole Copyright',ordf:'Indicateur ordinal féminin',laquo:'Guillemet français ouvrant',not:'Crochet de négation',reg:'Marque déposée',macr:'Macron',deg:'Degré',sup2:'Exposant 2',sup3:'\\tExposant 3',acute:'Accent aigu',micro:'Omicron',para:'Paragraphe',middot:'Point médian',cedil:'Cédille',sup1:'\\tExposant 1',ordm:'Indicateur ordinal masculin',raquo:'Guillemet français fermant',frac14:'Un quart',frac12:'Un demi',frac34:'Trois quarts',iquest:"Point d'interrogation inversé",Agrave:'A majuscule accent grave',Aacute:'A majuscule accent aigu',Acirc:'A majuscule accent circonflexe',Atilde:'A majuscule avec caron',Auml:'A majuscule tréma',Aring:'A majuscule avec un rond au-dessus',AElig:'Æ majuscule ligaturés',Ccedil:'C majuscule cédille',Egrave:'E majuscule accent grave',Eacute:'E majuscule accent aigu',Ecirc:'E majuscule accent circonflexe',Euml:'E majuscule tréma',Igrave:'I majuscule accent grave',Iacute:'I majuscule accent aigu',Icirc:'I majuscule accent circonflexe',Iuml:'I majuscule tréma',ETH:'Lettre majuscule islandaise ED',Ntilde:'N majuscule avec caron',Ograve:'O majuscule accent grave',Oacute:'O majuscule accent aigu',Ocirc:'O majuscule accent circonflexe',Otilde:'O majuscule avec caron',Ouml:'O majuscule tréma',times:'Multiplication',Oslash:'O majuscule barré',Ugrave:'U majuscule accent grave',Uacute:'U majuscule accent aigu',Ucirc:'U majuscule accent circonflexe',Uuml:'U majuscule tréma',Yacute:'Y majuscule accent aigu',THORN:'Lettre islandaise Thorn majuscule',szlig:'Lettre minuscule allemande s dur',agrave:'a minuscule accent grave',aacute:'a minuscule accent aigu',acirc:'a minuscule accent circonflexe',atilde:'a minuscule avec caron',auml:'a minuscule tréma',aring:'a minuscule avec un rond au-dessus',aelig:'æ minuscule ligaturés',ccedil:'c minuscule cédille',egrave:'e minuscule accent grave',eacute:'e minuscule accent aigu',ecirc:'e minuscule accent circonflexe',euml:'e minuscule tréma',igrave:'i minuscule accent grave',iacute:'i minuscule accent aigu',icirc:'i minuscule accent circonflexe',iuml:'i minuscule tréma',eth:'Lettre minuscule islandaise ED',ntilde:'n minuscule avec caron',ograve:'o minuscule accent grave',oacute:'o minuscule accent aigu',ocirc:'o minuscule accent circonflexe',otilde:'o minuscule avec caron',ouml:'o minuscule tréma',divide:'Division',oslash:'o minuscule barré',ugrave:'u minuscule accent grave',uacute:'u minuscule accent aigu',ucirc:'u minuscule accent circonflexe',uuml:'u minuscule tréma',yacute:'y minuscule accent aigu',thorn:'Lettre islandaise thorn minuscule',yuml:'y minuscule tréma',OElig:'ligature majuscule latine Œ',oelig:'ligature minuscule latine œ',372:'W majuscule accent circonflexe',374:'Y majuscule accent circonflexe',373:'w minuscule accent circonflexe',375:'y minuscule accent circonflexe',sbquo:'Guillemet simple fermant (anglais)',8219:'Guillemet-virgule supérieur culbuté',bdquo:'Guillemet-virgule double inférieur',hellip:'Points de suspension',trade:'Marque commerciale (trade mark)',9658:'Flèche noire pointant vers la droite',bull:'Gros point médian',rarr:'Flèche vers la droite',rArr:'Double flèche vers la droite',hArr:'Double flèche vers la gauche',diams:'Carreau noir',asymp:'Presque égal'});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/he.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/he.js
index a2899fe..86ca4f4 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/he.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/he.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('specialchar','he',{euro:'יורו',lsquo:'Left single quotation mark',rsquo:'Right single quotation mark',ldquo:'Left double quotation mark',rdquo:'Right double quotation mark',ndash:'En dash',mdash:'Em dash',iexcl:'Inverted exclamation mark',cent:'Cent sign',pound:'Pound sign',curren:'Currency sign',yen:'Yen sign',brvbar:'Broken bar',sect:'Section sign',uml:'Diaeresis',copy:'Copyright sign',ordf:'Feminine ordinal indicator',laquo:'Left-pointing double angle quotation mark',not:'Not sign',reg:'Registered sign',macr:'Macron',deg:'Degree sign',sup2:'Superscript two',sup3:'Superscript three',acute:'Acute accent',micro:'Micro sign',para:'Pilcrow sign',middot:'Middle dot',cedil:'Cedilla',sup1:'Superscript one',ordm:'Masculine ordinal indicator',raquo:'Right-pointing double angle quotation mark',frac14:'Vulgar fraction one quarter',frac12:'Vulgar fraction one half',frac34:'Vulgar fraction three quarters',iquest:'Inverted question mark',Agrave:'Latin capital letter A with grave accent',Aacute:'Latin capital letter A with acute accent',Acirc:'Latin capital letter A with circumflex',Atilde:'Latin capital letter A with tilde',Auml:'Latin capital letter A with diaeresis',Aring:'Latin capital letter A with ring above',AElig:'Latin Capital letter Æ',Ccedil:'Latin capital letter C with cedilla',Egrave:'Latin capital letter E with grave accent',Eacute:'Latin capital letter E with acute accent',Ecirc:'Latin capital letter E with circumflex',Euml:'Latin capital letter E with diaeresis',Igrave:'Latin capital letter I with grave accent',Iacute:'Latin capital letter I with acute accent',Icirc:'Latin capital letter I with circumflex',Iuml:'Latin capital letter I with diaeresis',ETH:'Latin capital letter Eth',Ntilde:'Latin capital letter N with tilde',Ograve:'Latin capital letter O with grave accent',Oacute:'Latin capital letter O with acute accent',Ocirc:'Latin capital letter O with circumflex',Otilde:'Latin capital letter O with tilde',Ouml:'Latin capital letter O with diaeresis',times:'Multiplication sign',Oslash:'Latin capital letter O with stroke',Ugrave:'Latin capital letter U with grave accent',Uacute:'Latin capital letter U with acute accent',Ucirc:'Latin capital letter U with circumflex',Uuml:'Latin capital letter U with diaeresis',Yacute:'Latin capital letter Y with acute accent',THORN:'Latin capital letter Thorn',szlig:'Latin small letter sharp s',agrave:'Latin small letter a with grave accent',aacute:'Latin small letter a with acute accent',acirc:'Latin small letter a with circumflex',atilde:'Latin small letter a with tilde',auml:'Latin small letter a with diaeresis',aring:'Latin small letter a with ring above',aelig:'Latin small letter æ',ccedil:'Latin small letter c with cedilla',egrave:'Latin small letter e with grave accent',eacute:'Latin small letter e with acute accent',ecirc:'Latin small letter e with circumflex',euml:'Latin small letter e with diaeresis',igrave:'Latin small letter i with grave accent',iacute:'Latin small letter i with acute accent',icirc:'Latin small letter i with circumflex',iuml:'Latin small letter i with diaeresis',eth:'Latin small letter eth',ntilde:'Latin small letter n with tilde',ograve:'Latin small letter o with grave accent',oacute:'Latin small letter o with acute accent',ocirc:'Latin small letter o with circumflex',otilde:'Latin small letter o with tilde',ouml:'Latin small letter o with diaeresis',divide:'Division sign',oslash:'Latin small letter o with stroke',ugrave:'Latin small letter u with grave accent',uacute:'Latin small letter u with acute accent',ucirc:'Latin small letter u with circumflex',uuml:'Latin small letter u with diaeresis',yacute:'Latin small letter y with acute accent',thorn:'Latin small letter thorn',yuml:'Latin small letter y with diaeresis',OElig:'Latin capital ligature OE',oelig:'Latin small ligature oe',372:'Latin capital letter W with circumflex',374:'Latin capital letter Y with circumflex',373:'Latin small letter w with circumflex',375:'Latin small letter y with circumflex',sbquo:'Single low-9 quotation mark',8219:'Single high-reversed-9 quotation mark',bdquo:'Double low-9 quotation mark',hellip:'Horizontal ellipsis',trade:'Trade mark sign',9658:'Black right-pointing pointer',bull:'Bullet',rarr:'Rightwards arrow',rArr:'Rightwards double arrow',hArr:'Left right double arrow',diams:'Black diamond suit',asymp:'Almost equal to'});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('specialchar','he',{euro:'יורו',lsquo:'Left single quotation mark',rsquo:'Right single quotation mark',ldquo:'Left double quotation mark',rdquo:'Right double quotation mark',ndash:'En dash',mdash:'Em dash',iexcl:'Inverted exclamation mark',cent:'Cent sign',pound:'Pound sign',curren:'Currency sign',yen:'Yen sign',brvbar:'Broken bar',sect:'Section sign',uml:'Diaeresis',copy:'Copyright sign',ordf:'Feminine ordinal indicator',laquo:'Left-pointing double angle quotation mark',not:'Not sign',reg:'Registered sign',macr:'Macron',deg:'Degree sign',sup2:'Superscript two',sup3:'Superscript three',acute:'Acute accent',micro:'Micro sign',para:'Pilcrow sign',middot:'Middle dot',cedil:'Cedilla',sup1:'Superscript one',ordm:'Masculine ordinal indicator',raquo:'Right-pointing double angle quotation mark',frac14:'Vulgar fraction one quarter',frac12:'Vulgar fraction one half',frac34:'Vulgar fraction three quarters',iquest:'Inverted question mark',Agrave:'Latin capital letter A with grave accent',Aacute:'Latin capital letter A with acute accent',Acirc:'Latin capital letter A with circumflex',Atilde:'Latin capital letter A with tilde',Auml:'Latin capital letter A with diaeresis',Aring:'Latin capital letter A with ring above',AElig:'Latin Capital letter Æ',Ccedil:'Latin capital letter C with cedilla',Egrave:'Latin capital letter E with grave accent',Eacute:'Latin capital letter E with acute accent',Ecirc:'Latin capital letter E with circumflex',Euml:'Latin capital letter E with diaeresis',Igrave:'Latin capital letter I with grave accent',Iacute:'Latin capital letter I with acute accent',Icirc:'Latin capital letter I with circumflex',Iuml:'Latin capital letter I with diaeresis',ETH:'Latin capital letter Eth',Ntilde:'Latin capital letter N with tilde',Ograve:'Latin capital letter O with grave accent',Oacute:'Latin capital letter O with acute accent',Ocirc:'Latin capital letter O with circumflex',Otilde:'Latin capital letter O with tilde',Ouml:'Latin capital letter O with diaeresis',times:'Multiplication sign',Oslash:'Latin capital letter O with stroke',Ugrave:'Latin capital letter U with grave accent',Uacute:'Latin capital letter U with acute accent',Ucirc:'Latin capital letter U with circumflex',Uuml:'Latin capital letter U with diaeresis',Yacute:'Latin capital letter Y with acute accent',THORN:'Latin capital letter Thorn',szlig:'Latin small letter sharp s',agrave:'Latin small letter a with grave accent',aacute:'Latin small letter a with acute accent',acirc:'Latin small letter a with circumflex',atilde:'Latin small letter a with tilde',auml:'Latin small letter a with diaeresis',aring:'Latin small letter a with ring above',aelig:'Latin small letter æ',ccedil:'Latin small letter c with cedilla',egrave:'Latin small letter e with grave accent',eacute:'Latin small letter e with acute accent',ecirc:'Latin small letter e with circumflex',euml:'Latin small letter e with diaeresis',igrave:'Latin small letter i with grave accent',iacute:'Latin small letter i with acute accent',icirc:'Latin small letter i with circumflex',iuml:'Latin small letter i with diaeresis',eth:'Latin small letter eth',ntilde:'Latin small letter n with tilde',ograve:'Latin small letter o with grave accent',oacute:'Latin small letter o with acute accent',ocirc:'Latin small letter o with circumflex',otilde:'Latin small letter o with tilde',ouml:'Latin small letter o with diaeresis',divide:'Division sign',oslash:'Latin small letter o with stroke',ugrave:'Latin small letter u with grave accent',uacute:'Latin small letter u with acute accent',ucirc:'Latin small letter u with circumflex',uuml:'Latin small letter u with diaeresis',yacute:'Latin small letter y with acute accent',thorn:'Latin small letter thorn',yuml:'Latin small letter y with diaeresis',OElig:'Latin capital ligature OE',oelig:'Latin small ligature oe',372:'Latin capital letter W with circumflex',374:'Latin capital letter Y with circumflex',373:'Latin small letter w with circumflex',375:'Latin small letter y with circumflex',sbquo:'Single low-9 quotation mark',8219:'Single high-reversed-9 quotation mark',bdquo:'Double low-9 quotation mark',hellip:'Horizontal ellipsis',trade:'Trade mark sign',9658:'Black right-pointing pointer',bull:'Bullet',rarr:'Rightwards arrow',rArr:'Rightwards double arrow',hArr:'Left right double arrow',diams:'Black diamond suit',asymp:'Almost equal to'});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/hr.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/hr.js
index bd5629f..14e82a3 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/hr.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/hr.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('specialchar','hr',{euro:'Euro znak',lsquo:'Lijevi jednostruki navodnik',rsquo:'Desni jednostruki navodnik',ldquo:'Lijevi dvostruki navodnik',rdquo:'Desni dvostruki navodnik',ndash:'En crtica',mdash:'Em crtica',iexcl:'Naopaki uskličnik',cent:'Cent znak',pound:'Funta znak',curren:'Znak valute',yen:'Yen znak',brvbar:'Potrgana prečka',sect:'Znak odjeljka',uml:'Diaeresis',copy:'Copyright znak',ordf:'Feminine ordinal indicator',laquo:'Lijevi dvostruki uglati navodnik',not:'Not znak',reg:'Registered znak',macr:'Macron',deg:'Stupanj znak',sup2:'Superscript two',sup3:'Superscript three',acute:'Acute accent',micro:'Micro sign',para:'Pilcrow sign',middot:'Srednja točka',cedil:'Cedilla',sup1:'Superscript one',ordm:'Masculine ordinal indicator',raquo:'Desni dvostruku uglati navodnik',frac14:'Vulgar fraction one quarter',frac12:'Vulgar fraction one half',frac34:'Vulgar fraction three quarters',iquest:'Naopaki upitnik',Agrave:'Veliko latinsko slovo A s akcentom',Aacute:'Latin capital letter A with acute accent',Acirc:'Latin capital letter A with circumflex',Atilde:'Latin capital letter A with tilde',Auml:'Latin capital letter A with diaeresis',Aring:'Latin capital letter A with ring above',AElig:'Latin Capital letter Æ',Ccedil:'Latin capital letter C with cedilla',Egrave:'Latin capital letter E with grave accent',Eacute:'Latin capital letter E with acute accent',Ecirc:'Latin capital letter E with circumflex',Euml:'Latin capital letter E with diaeresis',Igrave:'Latin capital letter I with grave accent',Iacute:'Latin capital letter I with acute accent',Icirc:'Latin capital letter I with circumflex',Iuml:'Latin capital letter I with diaeresis',ETH:'Latin capital letter Eth',Ntilde:'Latin capital letter N with tilde',Ograve:'Latin capital letter O with grave accent',Oacute:'Latin capital letter O with acute accent',Ocirc:'Latin capital letter O with circumflex',Otilde:'Latin capital letter O with tilde',Ouml:'Latin capital letter O with diaeresis',times:'Multiplication sign',Oslash:'Latin capital letter O with stroke',Ugrave:'Latin capital letter U with grave accent',Uacute:'Latin capital letter U with acute accent',Ucirc:'Latin capital letter U with circumflex',Uuml:'Latin capital letter U with diaeresis',Yacute:'Latin capital letter Y with acute accent',THORN:'Latin capital letter Thorn',szlig:'Latin small letter sharp s',agrave:'Latin small letter a with grave accent',aacute:'Latin small letter a with acute accent',acirc:'Latin small letter a with circumflex',atilde:'Latin small letter a with tilde',auml:'Latin small letter a with diaeresis',aring:'Latin small letter a with ring above',aelig:'Latin small letter æ',ccedil:'Latin small letter c with cedilla',egrave:'Latin small letter e with grave accent',eacute:'Latin small letter e with acute accent',ecirc:'Latin small letter e with circumflex',euml:'Latin small letter e with diaeresis',igrave:'Latin small letter i with grave accent',iacute:'Latin small letter i with acute accent',icirc:'Latin small letter i with circumflex',iuml:'Latin small letter i with diaeresis',eth:'Latin small letter eth',ntilde:'Latin small letter n with tilde',ograve:'Latin small letter o with grave accent',oacute:'Latin small letter o with acute accent',ocirc:'Latin small letter o with circumflex',otilde:'Latin small letter o with tilde',ouml:'Latin small letter o with diaeresis',divide:'Division sign',oslash:'Latin small letter o with stroke',ugrave:'Latin small letter u with grave accent',uacute:'Latin small letter u with acute accent',ucirc:'Latin small letter u with circumflex',uuml:'Latin small letter u with diaeresis',yacute:'Latin small letter y with acute accent',thorn:'Latin small letter thorn',yuml:'Latin small letter y with diaeresis',OElig:'Latin capital ligature OE',oelig:'Latin small ligature oe',372:'Latin capital letter W with circumflex',374:'Latin capital letter Y with circumflex',373:'Latin small letter w with circumflex',375:'Latin small letter y with circumflex',sbquo:'Single low-9 quotation mark',8219:'Single high-reversed-9 quotation mark',bdquo:'Double low-9 quotation mark',hellip:'Horizontal ellipsis',trade:'Trade mark sign',9658:'Black right-pointing pointer',bull:'Bullet',rarr:'Rightwards arrow',rArr:'Rightwards double arrow',hArr:'Left right double arrow',diams:'Black diamond suit',asymp:'Almost equal to'});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('specialchar','hr',{euro:'Euro znak',lsquo:'Lijevi jednostruki navodnik',rsquo:'Desni jednostruki navodnik',ldquo:'Lijevi dvostruki navodnik',rdquo:'Desni dvostruki navodnik',ndash:'En crtica',mdash:'Em crtica',iexcl:'Naopaki uskličnik',cent:'Cent znak',pound:'Funta znak',curren:'Znak valute',yen:'Yen znak',brvbar:'Potrgana prečka',sect:'Znak odjeljka',uml:'Diaeresis',copy:'Copyright znak',ordf:'Feminine ordinal indicator',laquo:'Lijevi dvostruki uglati navodnik',not:'Not znak',reg:'Registered znak',macr:'Macron',deg:'Stupanj znak',sup2:'Superscript two',sup3:'Superscript three',acute:'Acute accent',micro:'Micro sign',para:'Pilcrow sign',middot:'Srednja točka',cedil:'Cedilla',sup1:'Superscript one',ordm:'Masculine ordinal indicator',raquo:'Desni dvostruku uglati navodnik',frac14:'Vulgar fraction one quarter',frac12:'Vulgar fraction one half',frac34:'Vulgar fraction three quarters',iquest:'Naopaki upitnik',Agrave:'Veliko latinsko slovo A s akcentom',Aacute:'Latin capital letter A with acute accent',Acirc:'Latin capital letter A with circumflex',Atilde:'Latin capital letter A with tilde',Auml:'Latin capital letter A with diaeresis',Aring:'Latin capital letter A with ring above',AElig:'Latin Capital letter Æ',Ccedil:'Latin capital letter C with cedilla',Egrave:'Latin capital letter E with grave accent',Eacute:'Latin capital letter E with acute accent',Ecirc:'Latin capital letter E with circumflex',Euml:'Latin capital letter E with diaeresis',Igrave:'Latin capital letter I with grave accent',Iacute:'Latin capital letter I with acute accent',Icirc:'Latin capital letter I with circumflex',Iuml:'Latin capital letter I with diaeresis',ETH:'Latin capital letter Eth',Ntilde:'Latin capital letter N with tilde',Ograve:'Latin capital letter O with grave accent',Oacute:'Latin capital letter O with acute accent',Ocirc:'Latin capital letter O with circumflex',Otilde:'Latin capital letter O with tilde',Ouml:'Latin capital letter O with diaeresis',times:'Multiplication sign',Oslash:'Latin capital letter O with stroke',Ugrave:'Latin capital letter U with grave accent',Uacute:'Latin capital letter U with acute accent',Ucirc:'Latin capital letter U with circumflex',Uuml:'Latin capital letter U with diaeresis',Yacute:'Latin capital letter Y with acute accent',THORN:'Latin capital letter Thorn',szlig:'Latin small letter sharp s',agrave:'Latin small letter a with grave accent',aacute:'Latin small letter a with acute accent',acirc:'Latin small letter a with circumflex',atilde:'Latin small letter a with tilde',auml:'Latin small letter a with diaeresis',aring:'Latin small letter a with ring above',aelig:'Latin small letter æ',ccedil:'Latin small letter c with cedilla',egrave:'Latin small letter e with grave accent',eacute:'Latin small letter e with acute accent',ecirc:'Latin small letter e with circumflex',euml:'Latin small letter e with diaeresis',igrave:'Latin small letter i with grave accent',iacute:'Latin small letter i with acute accent',icirc:'Latin small letter i with circumflex',iuml:'Latin small letter i with diaeresis',eth:'Latin small letter eth',ntilde:'Latin small letter n with tilde',ograve:'Latin small letter o with grave accent',oacute:'Latin small letter o with acute accent',ocirc:'Latin small letter o with circumflex',otilde:'Latin small letter o with tilde',ouml:'Latin small letter o with diaeresis',divide:'Division sign',oslash:'Latin small letter o with stroke',ugrave:'Latin small letter u with grave accent',uacute:'Latin small letter u with acute accent',ucirc:'Latin small letter u with circumflex',uuml:'Latin small letter u with diaeresis',yacute:'Latin small letter y with acute accent',thorn:'Latin small letter thorn',yuml:'Latin small letter y with diaeresis',OElig:'Latin capital ligature OE',oelig:'Latin small ligature oe',372:'Latin capital letter W with circumflex',374:'Latin capital letter Y with circumflex',373:'Latin small letter w with circumflex',375:'Latin small letter y with circumflex',sbquo:'Single low-9 quotation mark',8219:'Single high-reversed-9 quotation mark',bdquo:'Double low-9 quotation mark',hellip:'Horizontal ellipsis',trade:'Trade mark sign',9658:'Black right-pointing pointer',bull:'Bullet',rarr:'Rightwards arrow',rArr:'Rightwards double arrow',hArr:'Left right double arrow',diams:'Black diamond suit',asymp:'Almost equal to'});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/it.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/it.js
index 735a91f..6f3b09e 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/it.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/it.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('specialchar','it',{euro:'Simbolo Euro',lsquo:'Virgoletta singola sinistra',rsquo:'Virgoletta singola destra',ldquo:'Virgolette aperte',rdquo:'Virgolette chiuse',ndash:'Trattino',mdash:'Trattino lungo',iexcl:'Punto esclavamativo invertito',cent:'Simbolo Cent',pound:'Simbolo Sterlina',curren:'Simbolo Moneta',yen:'Simbolo Yen',brvbar:'Barra interrotta',sect:'Simbolo di sezione',uml:'Dieresi',copy:'Simbolo Copyright',ordf:'Indicatore ordinale femminile',laquo:'Virgolette basse aperte',not:'Nessun segno',reg:'Simbolo Registrato',macr:'Macron',deg:'Simbolo Grado',sup2:'Apice Due',sup3:'Apice Tre',acute:'Accento acuto',micro:'Simbolo Micro',para:'Simbolo Paragrafo',middot:'Punto centrale',cedil:'Cediglia',sup1:'Apice Uno',ordm:'Indicatore ordinale maschile',raquo:'Virgolette basse chiuse',frac14:'Frazione volgare un quarto',frac12:'Frazione volgare un mezzo',frac34:'Frazione volgare tre quarti',iquest:'Punto interrogativo invertito',Agrave:'Lettera maiuscola latina A con accento grave',Aacute:'Lettera maiuscola latina A con accento acuto',Acirc:'Lettera maiuscola latina A con accento circonflesso',Atilde:'Lettera maiuscola latina A con tilde',Auml:'Lettera maiuscola latina A con dieresi',Aring:'Lettera maiuscola latina A con anello sopra',AElig:'Lettera maiuscola latina AE',Ccedil:'Lettera maiuscola latina C con cediglia',Egrave:'Lettera maiuscola latina E con accento grave',Eacute:'Lettera maiuscola latina E con accento acuto',Ecirc:'Lettera maiuscola latina E con accento circonflesso',Euml:'Lettera maiuscola latina E con dieresi',Igrave:'Lettera maiuscola latina I con accento grave',Iacute:'Lettera maiuscola latina I con accento acuto',Icirc:'Lettera maiuscola latina I con accento circonflesso',Iuml:'Lettera maiuscola latina I con dieresi',ETH:'Lettera maiuscola latina Eth',Ntilde:'Lettera maiuscola latina N con tilde',Ograve:'Lettera maiuscola latina O con accento grave',Oacute:'Lettera maiuscola latina O con accento acuto',Ocirc:'Lettera maiuscola latina O con accento circonflesso',Otilde:'Lettera maiuscola latina O con tilde',Ouml:'Lettera maiuscola latina O con dieresi',times:'Simbolo di moltiplicazione',Oslash:'Lettera maiuscola latina O barrata',Ugrave:'Lettera maiuscola latina U con accento grave',Uacute:'Lettera maiuscola latina U con accento acuto',Ucirc:'Lettera maiuscola latina U con accento circonflesso',Uuml:'Lettera maiuscola latina U con accento circonflesso',Yacute:'Lettera maiuscola latina Y con accento acuto',THORN:'Lettera maiuscola latina Thorn',szlig:'Lettera latina minuscola doppia S',agrave:'Lettera minuscola latina a con accento grave',aacute:'Lettera minuscola latina a con accento acuto',acirc:'Lettera minuscola latina a con accento circonflesso',atilde:'Lettera minuscola latina a con tilde',auml:'Lettera minuscola latina a con dieresi',aring:'Lettera minuscola latina a con anello superiore',aelig:'Lettera minuscola latina ae',ccedil:'Lettera minuscola latina c con cediglia',egrave:'Lettera minuscola latina e con accento grave',eacute:'Lettera minuscola latina e con accento acuto',ecirc:'Lettera minuscola latina e con accento circonflesso',euml:'Lettera minuscola latina e con dieresi',igrave:'Lettera minuscola latina i con accento grave',iacute:'Lettera minuscola latina i con accento acuto',icirc:'Lettera minuscola latina i con accento circonflesso',iuml:'Lettera minuscola latina i con dieresi',eth:'Lettera minuscola latina eth',ntilde:'Lettera minuscola latina n con tilde',ograve:'Lettera minuscola latina o con accento grave',oacute:'Lettera minuscola latina o con accento acuto',ocirc:'Lettera minuscola latina o con accento circonflesso',otilde:'Lettera minuscola latina o con tilde',ouml:'Lettera minuscola latina o con dieresi',divide:'Simbolo di divisione',oslash:'Lettera minuscola latina o barrata',ugrave:'Lettera minuscola latina u con accento grave',uacute:'Lettera minuscola latina u con accento acuto',ucirc:'Lettera minuscola latina u con accento circonflesso',uuml:'Lettera minuscola latina u con dieresi',yacute:'Lettera minuscola latina y con accento acuto',thorn:'Lettera minuscola latina thorn',yuml:'Lettera minuscola latina y con dieresi',OElig:'Legatura maiuscola latina OE',oelig:'Legatura minuscola latina oe',372:'Lettera maiuscola latina W con accento circonflesso',374:'Lettera maiuscola latina Y con accento circonflesso',373:'Lettera minuscola latina w con accento circonflesso',375:'Lettera minuscola latina y con accento circonflesso',sbquo:'Singola virgoletta bassa low-9',8219:'Singola virgoletta bassa low-9 inversa',bdquo:'Doppia virgoletta bassa low-9',hellip:'Ellissi orizzontale',trade:'Simbolo TM',9658:'Puntatore nero rivolto verso destra',bull:'Punto',rarr:'Freccia verso destra',rArr:'Doppia freccia verso destra',hArr:'Doppia freccia sinistra destra',diams:'Simbolo nero diamante',asymp:'Quasi uguale a'});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('specialchar','it',{euro:'Simbolo Euro',lsquo:'Virgoletta singola sinistra',rsquo:'Virgoletta singola destra',ldquo:'Virgolette aperte',rdquo:'Virgolette chiuse',ndash:'Trattino',mdash:'Trattino lungo',iexcl:'Punto esclavamativo invertito',cent:'Simbolo Cent',pound:'Simbolo Sterlina',curren:'Simbolo Moneta',yen:'Simbolo Yen',brvbar:'Barra interrotta',sect:'Simbolo di sezione',uml:'Dieresi',copy:'Simbolo Copyright',ordf:'Indicatore ordinale femminile',laquo:'Virgolette basse aperte',not:'Nessun segno',reg:'Simbolo Registrato',macr:'Macron',deg:'Simbolo Grado',sup2:'Apice Due',sup3:'Apice Tre',acute:'Accento acuto',micro:'Simbolo Micro',para:'Simbolo Paragrafo',middot:'Punto centrale',cedil:'Cediglia',sup1:'Apice Uno',ordm:'Indicatore ordinale maschile',raquo:'Virgolette basse chiuse',frac14:'Frazione volgare un quarto',frac12:'Frazione volgare un mezzo',frac34:'Frazione volgare tre quarti',iquest:'Punto interrogativo invertito',Agrave:'Lettera maiuscola latina A con accento grave',Aacute:'Lettera maiuscola latina A con accento acuto',Acirc:'Lettera maiuscola latina A con accento circonflesso',Atilde:'Lettera maiuscola latina A con tilde',Auml:'Lettera maiuscola latina A con dieresi',Aring:'Lettera maiuscola latina A con anello sopra',AElig:'Lettera maiuscola latina AE',Ccedil:'Lettera maiuscola latina C con cediglia',Egrave:'Lettera maiuscola latina E con accento grave',Eacute:'Lettera maiuscola latina E con accento acuto',Ecirc:'Lettera maiuscola latina E con accento circonflesso',Euml:'Lettera maiuscola latina E con dieresi',Igrave:'Lettera maiuscola latina I con accento grave',Iacute:'Lettera maiuscola latina I con accento acuto',Icirc:'Lettera maiuscola latina I con accento circonflesso',Iuml:'Lettera maiuscola latina I con dieresi',ETH:'Lettera maiuscola latina Eth',Ntilde:'Lettera maiuscola latina N con tilde',Ograve:'Lettera maiuscola latina O con accento grave',Oacute:'Lettera maiuscola latina O con accento acuto',Ocirc:'Lettera maiuscola latina O con accento circonflesso',Otilde:'Lettera maiuscola latina O con tilde',Ouml:'Lettera maiuscola latina O con dieresi',times:'Simbolo di moltiplicazione',Oslash:'Lettera maiuscola latina O barrata',Ugrave:'Lettera maiuscola latina U con accento grave',Uacute:'Lettera maiuscola latina U con accento acuto',Ucirc:'Lettera maiuscola latina U con accento circonflesso',Uuml:'Lettera maiuscola latina U con accento circonflesso',Yacute:'Lettera maiuscola latina Y con accento acuto',THORN:'Lettera maiuscola latina Thorn',szlig:'Lettera latina minuscola doppia S',agrave:'Lettera minuscola latina a con accento grave',aacute:'Lettera minuscola latina a con accento acuto',acirc:'Lettera minuscola latina a con accento circonflesso',atilde:'Lettera minuscola latina a con tilde',auml:'Lettera minuscola latina a con dieresi',aring:'Lettera minuscola latina a con anello superiore',aelig:'Lettera minuscola latina ae',ccedil:'Lettera minuscola latina c con cediglia',egrave:'Lettera minuscola latina e con accento grave',eacute:'Lettera minuscola latina e con accento acuto',ecirc:'Lettera minuscola latina e con accento circonflesso',euml:'Lettera minuscola latina e con dieresi',igrave:'Lettera minuscola latina i con accento grave',iacute:'Lettera minuscola latina i con accento acuto',icirc:'Lettera minuscola latina i con accento circonflesso',iuml:'Lettera minuscola latina i con dieresi',eth:'Lettera minuscola latina eth',ntilde:'Lettera minuscola latina n con tilde',ograve:'Lettera minuscola latina o con accento grave',oacute:'Lettera minuscola latina o con accento acuto',ocirc:'Lettera minuscola latina o con accento circonflesso',otilde:'Lettera minuscola latina o con tilde',ouml:'Lettera minuscola latina o con dieresi',divide:'Simbolo di divisione',oslash:'Lettera minuscola latina o barrata',ugrave:'Lettera minuscola latina u con accento grave',uacute:'Lettera minuscola latina u con accento acuto',ucirc:'Lettera minuscola latina u con accento circonflesso',uuml:'Lettera minuscola latina u con dieresi',yacute:'Lettera minuscola latina y con accento acuto',thorn:'Lettera minuscola latina thorn',yuml:'Lettera minuscola latina y con dieresi',OElig:'Legatura maiuscola latina OE',oelig:'Legatura minuscola latina oe',372:'Lettera maiuscola latina W con accento circonflesso',374:'Lettera maiuscola latina Y con accento circonflesso',373:'Lettera minuscola latina w con accento circonflesso',375:'Lettera minuscola latina y con accento circonflesso',sbquo:'Singola virgoletta bassa low-9',8219:'Singola virgoletta bassa low-9 inversa',bdquo:'Doppia virgoletta bassa low-9',hellip:'Ellissi orizzontale',trade:'Simbolo TM',9658:'Puntatore nero rivolto verso destra',bull:'Punto',rarr:'Freccia verso destra',rArr:'Doppia freccia verso destra',hArr:'Doppia freccia sinistra destra',diams:'Simbolo nero diamante',asymp:'Quasi uguale a'});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/nb.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/nb.js
index 86910bf..5f7aba1 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/nb.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/nb.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('specialchar','nb',{euro:'Eurosymbol',lsquo:'Venstre enkelt anførselstegn',rsquo:'Høyre enkelt anførselstegn',ldquo:'Venstre dobbelt anførselstegn',rdquo:'Høyre anførsesltegn',ndash:'Kort tankestrek',mdash:'Lang tankestrek',iexcl:'Omvendt utropstegn',cent:'Centsymbol',pound:'Pundsymbol',curren:'Valutategn',yen:'Yensymbol',brvbar:'Brutt loddrett strek',sect:'Paragraftegn',uml:'Tøddel',copy:'Copyrighttegn',ordf:'Feminin ordensindikator',laquo:'Venstre anførselstegn',not:'Negasjonstegn',reg:'Registrert varemerke-tegn',macr:'Makron',deg:'Gradsymbol',sup2:'Hevet totall',sup3:'Hevet tretall',acute:'Akutt aksent',micro:'Mikrosymbol',para:'Avsnittstegn',middot:'Midtstilt prikk',cedil:'Cedille',sup1:'Hevet ettall',ordm:'Maskulin ordensindikator',raquo:'Høyre anførselstegn',frac14:'Fjerdedelsbrøk',frac12:'Halvbrøk',frac34:'Tre fjerdedelers brøk',iquest:'Omvendt spørsmålstegn',Agrave:'Stor A med grav aksent',Aacute:'Stor A med akutt aksent',Acirc:'Stor A med cirkumfleks',Atilde:'Stor A med tilde',Auml:'Stor A med tøddel',Aring:'Stor Å',AElig:'Stor Æ',Ccedil:'Stor C med cedille',Egrave:'Stor E med grav aksent',Eacute:'Stor E med akutt aksent',Ecirc:'Stor E med cirkumfleks',Euml:'Stor E med tøddel',Igrave:'Stor I med grav aksent',Iacute:'Stor I med akutt aksent',Icirc:'Stor I med cirkumfleks',Iuml:'Stor I med tøddel',ETH:'Stor Edd/stungen D',Ntilde:'Stor N med tilde',Ograve:'Stor O med grav aksent',Oacute:'Stor O med akutt aksent',Ocirc:'Stor O med cirkumfleks',Otilde:'Stor O med tilde',Ouml:'Stor O med tøddel',times:'Multiplikasjonstegn',Oslash:'Stor Ø',Ugrave:'Stor U med grav aksent',Uacute:'Stor U med akutt aksent',Ucirc:'Stor U med cirkumfleks',Uuml:'Stor U med tøddel',Yacute:'Stor Y med akutt aksent',THORN:'Stor Thorn',szlig:'Liten dobbelt-s/Eszett',agrave:'Liten a med grav aksent',aacute:'Liten a med akutt aksent',acirc:'Liten a med cirkumfleks',atilde:'Liten a med tilde',auml:'Liten a med tøddel',aring:'Liten å',aelig:'Liten æ',ccedil:'Liten c med cedille',egrave:'Liten e med grav aksent',eacute:'Liten e med akutt aksent',ecirc:'Liten e med cirkumfleks',euml:'Liten e med tøddel',igrave:'Liten i med grav aksent',iacute:'Liten i med akutt aksent',icirc:'Liten i med cirkumfleks',iuml:'Liten i med tøddel',eth:'Liten edd/stungen d',ntilde:'Liten n med tilde',ograve:'Liten o med grav aksent',oacute:'Liten o med akutt aksent',ocirc:'Liten o med cirkumfleks',otilde:'Liten o med tilde',ouml:'Liten o med tøddel',divide:'Divisjonstegn',oslash:'Liten ø',ugrave:'Liten u med grav aksent',uacute:'Liten u med akutt aksent',ucirc:'Liten u med cirkumfleks',uuml:'Liten u med tøddel',yacute:'Liten y med akutt aksent',thorn:'Liten thorn',yuml:'Liten y med tøddel',OElig:'Stor ligatur av O og E',oelig:'Liten ligatur av o og e',372:'Stor W med cirkumfleks',374:'Stor Y med cirkumfleks',373:'Liten w med cirkumfleks',375:'Liten y med cirkumfleks',sbquo:'Enkelt lavt 9-anførselstegn',8219:'Enkelt høyt reversert 9-anførselstegn',bdquo:'Dobbelt lavt 9-anførselstegn',hellip:'Ellipse',trade:'Varemerkesymbol',9658:'Svart høyrevendt peker',bull:'Tykk interpunkt',rarr:'Høyrevendt pil',rArr:'Dobbel høyrevendt pil',hArr:'Dobbel venstrevendt pil',diams:'Svart ruter',asymp:'Omtrent likhetstegn'});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('specialchar','nb',{euro:'Eurosymbol',lsquo:'Venstre enkelt anførselstegn',rsquo:'Høyre enkelt anførselstegn',ldquo:'Venstre dobbelt anførselstegn',rdquo:'Høyre anførsesltegn',ndash:'Kort tankestrek',mdash:'Lang tankestrek',iexcl:'Omvendt utropstegn',cent:'Centsymbol',pound:'Pundsymbol',curren:'Valutategn',yen:'Yensymbol',brvbar:'Brutt loddrett strek',sect:'Paragraftegn',uml:'Tøddel',copy:'Copyrighttegn',ordf:'Feminin ordensindikator',laquo:'Venstre anførselstegn',not:'Negasjonstegn',reg:'Registrert varemerke-tegn',macr:'Makron',deg:'Gradsymbol',sup2:'Hevet totall',sup3:'Hevet tretall',acute:'Akutt aksent',micro:'Mikrosymbol',para:'Avsnittstegn',middot:'Midtstilt prikk',cedil:'Cedille',sup1:'Hevet ettall',ordm:'Maskulin ordensindikator',raquo:'Høyre anførselstegn',frac14:'Fjerdedelsbrøk',frac12:'Halvbrøk',frac34:'Tre fjerdedelers brøk',iquest:'Omvendt spørsmålstegn',Agrave:'Stor A med grav aksent',Aacute:'Stor A med akutt aksent',Acirc:'Stor A med cirkumfleks',Atilde:'Stor A med tilde',Auml:'Stor A med tøddel',Aring:'Stor Å',AElig:'Stor Æ',Ccedil:'Stor C med cedille',Egrave:'Stor E med grav aksent',Eacute:'Stor E med akutt aksent',Ecirc:'Stor E med cirkumfleks',Euml:'Stor E med tøddel',Igrave:'Stor I med grav aksent',Iacute:'Stor I med akutt aksent',Icirc:'Stor I med cirkumfleks',Iuml:'Stor I med tøddel',ETH:'Stor Edd/stungen D',Ntilde:'Stor N med tilde',Ograve:'Stor O med grav aksent',Oacute:'Stor O med akutt aksent',Ocirc:'Stor O med cirkumfleks',Otilde:'Stor O med tilde',Ouml:'Stor O med tøddel',times:'Multiplikasjonstegn',Oslash:'Stor Ø',Ugrave:'Stor U med grav aksent',Uacute:'Stor U med akutt aksent',Ucirc:'Stor U med cirkumfleks',Uuml:'Stor U med tøddel',Yacute:'Stor Y med akutt aksent',THORN:'Stor Thorn',szlig:'Liten dobbelt-s/Eszett',agrave:'Liten a med grav aksent',aacute:'Liten a med akutt aksent',acirc:'Liten a med cirkumfleks',atilde:'Liten a med tilde',auml:'Liten a med tøddel',aring:'Liten å',aelig:'Liten æ',ccedil:'Liten c med cedille',egrave:'Liten e med grav aksent',eacute:'Liten e med akutt aksent',ecirc:'Liten e med cirkumfleks',euml:'Liten e med tøddel',igrave:'Liten i med grav aksent',iacute:'Liten i med akutt aksent',icirc:'Liten i med cirkumfleks',iuml:'Liten i med tøddel',eth:'Liten edd/stungen d',ntilde:'Liten n med tilde',ograve:'Liten o med grav aksent',oacute:'Liten o med akutt aksent',ocirc:'Liten o med cirkumfleks',otilde:'Liten o med tilde',ouml:'Liten o med tøddel',divide:'Divisjonstegn',oslash:'Liten ø',ugrave:'Liten u med grav aksent',uacute:'Liten u med akutt aksent',ucirc:'Liten u med cirkumfleks',uuml:'Liten u med tøddel',yacute:'Liten y med akutt aksent',thorn:'Liten thorn',yuml:'Liten y med tøddel',OElig:'Stor ligatur av O og E',oelig:'Liten ligatur av o og e',372:'Stor W med cirkumfleks',374:'Stor Y med cirkumfleks',373:'Liten w med cirkumfleks',375:'Liten y med cirkumfleks',sbquo:'Enkelt lavt 9-anførselstegn',8219:'Enkelt høyt reversert 9-anførselstegn',bdquo:'Dobbelt lavt 9-anførselstegn',hellip:'Ellipse',trade:'Varemerkesymbol',9658:'Svart høyrevendt peker',bull:'Tykk interpunkt',rarr:'Høyrevendt pil',rArr:'Dobbel høyrevendt pil',hArr:'Dobbel venstrevendt pil',diams:'Svart ruter',asymp:'Omtrent likhetstegn'});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/nl.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/nl.js
index 56876fb..a9ab3e0 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/nl.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/nl.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('specialchar','nl',{euro:'Euro-teken',lsquo:'Linker enkel aanhalingsteken',rsquo:'Rechter enkel aanhalingsteken',ldquo:'Linker dubbel aanhalingsteken',rdquo:'Rechter dubbel aanhalingsteken',ndash:'En dash',mdash:'Em dash',iexcl:'Omgekeerd uitroepteken',cent:'Cent-teken',pound:'Pond-teken',curren:'Valuta-teken',yen:'Yen-teken',brvbar:'Gebroken streep',sect:'Paragraaf-teken',uml:'Trema',copy:'Copyright-teken',ordf:'Vrouwelijk ordinaal',laquo:'Linker guillemet',not:'Ongelijk-teken',reg:'Geregistreerd handelsmerk-teken',macr:'Macron',deg:'Graden-teken',sup2:'Superscript twee',sup3:'Superscript drie',acute:'Accent aigu',micro:'Mico-teken',para:'Alinea-teken',middot:'Halfhoge punt',cedil:'Cedille',sup1:'Superscript een',ordm:'Mannelijk ordinaal',raquo:'Rechter guillemet',frac14:'Breuk kwart',frac12:'Breuk half',frac34:'Breuk driekwart',iquest:'Omgekeerd vraagteken',Agrave:'Latijnse hoofdletter A met een accent grave',Aacute:'Latijnse hoofdletter A met een accent aigu',Acirc:'Latijnse hoofdletter A met een circonflexe',Atilde:'Latijnse hoofdletter A met een tilde',Auml:'Latijnse hoofdletter A met een trema',Aring:'Latijnse hoofdletter A met een corona',AElig:'Latijnse hoofdletter Æ',Ccedil:'Latijnse hoofdletter C met een cedille',Egrave:'Latijnse hoofdletter E met een accent grave',Eacute:'Latijnse hoofdletter E met een accent aigu',Ecirc:'Latijnse hoofdletter E met een circonflexe',Euml:'Latijnse hoofdletter E met een trema',Igrave:'Latijnse hoofdletter I met een accent grave',Iacute:'Latijnse hoofdletter I met een accent aigu',Icirc:'Latijnse hoofdletter I met een circonflexe',Iuml:'Latijnse hoofdletter I met een trema',ETH:'Latijnse hoofdletter Eth',Ntilde:'Latijnse hoofdletter N met een tilde',Ograve:'Latijnse hoofdletter O met een accent grave',Oacute:'Latijnse hoofdletter O met een accent aigu',Ocirc:'Latijnse hoofdletter O met een circonflexe',Otilde:'Latijnse hoofdletter O met een tilde',Ouml:'Latijnse hoofdletter O met een trema',times:'Maal-teken',Oslash:'Latijnse hoofdletter O met een schuine streep',Ugrave:'Latijnse hoofdletter U met een accent grave',Uacute:'Latijnse hoofdletter U met een accent aigu',Ucirc:'Latijnse hoofdletter U met een circonflexe',Uuml:'Latijnse hoofdletter U met een trema',Yacute:'Latijnse hoofdletter Y met een accent aigu',THORN:'Latijnse hoofdletter Thorn',szlig:'Latijnse kleine ringel-s',agrave:'Latijnse kleine letter a met een accent grave',aacute:'Latijnse kleine letter a met een accent aigu',acirc:'Latijnse kleine letter a met een circonflexe',atilde:'Latijnse kleine letter a met een tilde',auml:'Latijnse kleine letter a met een trema',aring:'Latijnse kleine letter a met een corona',aelig:'Latijnse kleine letter æ',ccedil:'Latijnse kleine letter c met een cedille',egrave:'Latijnse kleine letter e met een accent grave',eacute:'Latijnse kleine letter e met een accent aigu',ecirc:'Latijnse kleine letter e met een circonflexe',euml:'Latijnse kleine letter e met een trema',igrave:'Latijnse kleine letter i met een accent grave',iacute:'Latijnse kleine letter i met een accent aigu',icirc:'Latijnse kleine letter i met een circonflexe',iuml:'Latijnse kleine letter i met een trema',eth:'Latijnse kleine letter eth',ntilde:'Latijnse kleine letter n met een tilde',ograve:'Latijnse kleine letter o met een accent grave',oacute:'Latijnse kleine letter o met een accent aigu',ocirc:'Latijnse kleine letter o met een circonflexe',otilde:'Latijnse kleine letter o met een tilde',ouml:'Latijnse kleine letter o met een trema',divide:'Deel-teken',oslash:'Latijnse kleine letter o met een schuine streep',ugrave:'Latijnse kleine letter u met een accent grave',uacute:'Latijnse kleine letter u met een accent aigu',ucirc:'Latijnse kleine letter u met een circonflexe',uuml:'Latijnse kleine letter u met een trema',yacute:'Latijnse kleine letter y met een accent aigu',thorn:'Latijnse kleine letter thorn',yuml:'Latijnse kleine letter y met een trema',OElig:'Latijnse hoofdletter Œ',oelig:'Latijnse kleine letter œ',372:'Latijnse hoofdletter W met een circonflexe',374:'Latijnse hoofdletter Y met een circonflexe',373:'Latijnse kleine letter w met een circonflexe',375:'Latijnse kleine letter y met een circonflexe',sbquo:'Lage enkele aanhalingsteken',8219:'Hoge omgekeerde enkele aanhalingsteken',bdquo:'Lage dubbele aanhalingsteken',hellip:'Beletselteken',trade:'Trademark-teken',9658:'Zwarte driehoek naar rechts',bull:'Bullet',rarr:'Pijl naar rechts',rArr:'Dubbele pijl naar rechts',hArr:'Dubbele pijl naar links',diams:'Zwart ruitje',asymp:'Benaderingsteken'});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('specialchar','nl',{euro:'Euro-teken',lsquo:'Linker enkel aanhalingsteken',rsquo:'Rechter enkel aanhalingsteken',ldquo:'Linker dubbel aanhalingsteken',rdquo:'Rechter dubbel aanhalingsteken',ndash:'En dash',mdash:'Em dash',iexcl:'Omgekeerd uitroepteken',cent:'Cent-teken',pound:'Pond-teken',curren:'Valuta-teken',yen:'Yen-teken',brvbar:'Gebroken streep',sect:'Paragraaf-teken',uml:'Trema',copy:'Copyright-teken',ordf:'Vrouwelijk ordinaal',laquo:'Linker guillemet',not:'Ongelijk-teken',reg:'Geregistreerd handelsmerk-teken',macr:'Macron',deg:'Graden-teken',sup2:'Superscript twee',sup3:'Superscript drie',acute:'Accent aigu',micro:'Mico-teken',para:'Alinea-teken',middot:'Halfhoge punt',cedil:'Cedille',sup1:'Superscript een',ordm:'Mannelijk ordinaal',raquo:'Rechter guillemet',frac14:'Breuk kwart',frac12:'Breuk half',frac34:'Breuk driekwart',iquest:'Omgekeerd vraagteken',Agrave:'Latijnse hoofdletter A met een accent grave',Aacute:'Latijnse hoofdletter A met een accent aigu',Acirc:'Latijnse hoofdletter A met een circonflexe',Atilde:'Latijnse hoofdletter A met een tilde',Auml:'Latijnse hoofdletter A met een trema',Aring:'Latijnse hoofdletter A met een corona',AElig:'Latijnse hoofdletter Æ',Ccedil:'Latijnse hoofdletter C met een cedille',Egrave:'Latijnse hoofdletter E met een accent grave',Eacute:'Latijnse hoofdletter E met een accent aigu',Ecirc:'Latijnse hoofdletter E met een circonflexe',Euml:'Latijnse hoofdletter E met een trema',Igrave:'Latijnse hoofdletter I met een accent grave',Iacute:'Latijnse hoofdletter I met een accent aigu',Icirc:'Latijnse hoofdletter I met een circonflexe',Iuml:'Latijnse hoofdletter I met een trema',ETH:'Latijnse hoofdletter Eth',Ntilde:'Latijnse hoofdletter N met een tilde',Ograve:'Latijnse hoofdletter O met een accent grave',Oacute:'Latijnse hoofdletter O met een accent aigu',Ocirc:'Latijnse hoofdletter O met een circonflexe',Otilde:'Latijnse hoofdletter O met een tilde',Ouml:'Latijnse hoofdletter O met een trema',times:'Maal-teken',Oslash:'Latijnse hoofdletter O met een schuine streep',Ugrave:'Latijnse hoofdletter U met een accent grave',Uacute:'Latijnse hoofdletter U met een accent aigu',Ucirc:'Latijnse hoofdletter U met een circonflexe',Uuml:'Latijnse hoofdletter U met een trema',Yacute:'Latijnse hoofdletter Y met een accent aigu',THORN:'Latijnse hoofdletter Thorn',szlig:'Latijnse kleine ringel-s',agrave:'Latijnse kleine letter a met een accent grave',aacute:'Latijnse kleine letter a met een accent aigu',acirc:'Latijnse kleine letter a met een circonflexe',atilde:'Latijnse kleine letter a met een tilde',auml:'Latijnse kleine letter a met een trema',aring:'Latijnse kleine letter a met een corona',aelig:'Latijnse kleine letter æ',ccedil:'Latijnse kleine letter c met een cedille',egrave:'Latijnse kleine letter e met een accent grave',eacute:'Latijnse kleine letter e met een accent aigu',ecirc:'Latijnse kleine letter e met een circonflexe',euml:'Latijnse kleine letter e met een trema',igrave:'Latijnse kleine letter i met een accent grave',iacute:'Latijnse kleine letter i met een accent aigu',icirc:'Latijnse kleine letter i met een circonflexe',iuml:'Latijnse kleine letter i met een trema',eth:'Latijnse kleine letter eth',ntilde:'Latijnse kleine letter n met een tilde',ograve:'Latijnse kleine letter o met een accent grave',oacute:'Latijnse kleine letter o met een accent aigu',ocirc:'Latijnse kleine letter o met een circonflexe',otilde:'Latijnse kleine letter o met een tilde',ouml:'Latijnse kleine letter o met een trema',divide:'Deel-teken',oslash:'Latijnse kleine letter o met een schuine streep',ugrave:'Latijnse kleine letter u met een accent grave',uacute:'Latijnse kleine letter u met een accent aigu',ucirc:'Latijnse kleine letter u met een circonflexe',uuml:'Latijnse kleine letter u met een trema',yacute:'Latijnse kleine letter y met een accent aigu',thorn:'Latijnse kleine letter thorn',yuml:'Latijnse kleine letter y met een trema',OElig:'Latijnse hoofdletter Œ',oelig:'Latijnse kleine letter œ',372:'Latijnse hoofdletter W met een circonflexe',374:'Latijnse hoofdletter Y met een circonflexe',373:'Latijnse kleine letter w met een circonflexe',375:'Latijnse kleine letter y met een circonflexe',sbquo:'Lage enkele aanhalingsteken',8219:'Hoge omgekeerde enkele aanhalingsteken',bdquo:'Lage dubbele aanhalingsteken',hellip:'Beletselteken',trade:'Trademark-teken',9658:'Zwarte driehoek naar rechts',bull:'Bullet',rarr:'Pijl naar rechts',rArr:'Dubbele pijl naar rechts',hArr:'Dubbele pijl naar links',diams:'Zwart ruitje',asymp:'Benaderingsteken'});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/no.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/no.js
index 2ced887..3545aaa 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/no.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/no.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('specialchar','no',{euro:'Eurosymbol',lsquo:'Venstre enkelt anførselstegn',rsquo:'Høyre enkelt anførselstegn',ldquo:'Venstre dobbelt anførselstegn',rdquo:'Høyre anførsesltegn',ndash:'Kort tankestrek',mdash:'Lang tankestrek',iexcl:'Omvendt utropstegn',cent:'Centsymbol',pound:'Pundsymbol',curren:'Valutategn',yen:'Yensymbol',brvbar:'Brutt loddrett strek',sect:'Paragraftegn',uml:'Tøddel',copy:'Copyrighttegn',ordf:'Feminin ordensindikator',laquo:'Venstre anførselstegn',not:'Negasjonstegn',reg:'Registrert varemerke-tegn',macr:'Makron',deg:'Gradsymbol',sup2:'Hevet totall',sup3:'Hevet tretall',acute:'Akutt aksent',micro:'Mikrosymbol',para:'Avsnittstegn',middot:'Midtstilt prikk',cedil:'Cedille',sup1:'Hevet ettall',ordm:'Maskulin ordensindikator',raquo:'Høyre anførselstegn',frac14:'Fjerdedelsbrøk',frac12:'Halvbrøk',frac34:'Tre fjerdedelers brøk',iquest:'Omvendt spørsmålstegn',Agrave:'Stor A med grav aksent',Aacute:'Stor A med akutt aksent',Acirc:'Stor A med cirkumfleks',Atilde:'Stor A med tilde',Auml:'Stor A med tøddel',Aring:'Stor Å',AElig:'Stor Æ',Ccedil:'Stor C med cedille',Egrave:'Stor E med grav aksent',Eacute:'Stor E med akutt aksent',Ecirc:'Stor E med cirkumfleks',Euml:'Stor E med tøddel',Igrave:'Stor I med grav aksent',Iacute:'Stor I med akutt aksent',Icirc:'Stor I med cirkumfleks',Iuml:'Stor I med tøddel',ETH:'Stor Edd/stungen D',Ntilde:'Stor N med tilde',Ograve:'Stor O med grav aksent',Oacute:'Stor O med akutt aksent',Ocirc:'Stor O med cirkumfleks',Otilde:'Stor O med tilde',Ouml:'Stor O med tøddel',times:'Multiplikasjonstegn',Oslash:'Stor Ø',Ugrave:'Stor U med grav aksent',Uacute:'Stor U med akutt aksent',Ucirc:'Stor U med cirkumfleks',Uuml:'Stor U med tøddel',Yacute:'Stor Y med akutt aksent',THORN:'Stor Thorn',szlig:'Liten dobbelt-s/Eszett',agrave:'Liten a med grav aksent',aacute:'Liten a med akutt aksent',acirc:'Liten a med cirkumfleks',atilde:'Liten a med tilde',auml:'Liten a med tøddel',aring:'Liten å',aelig:'Liten æ',ccedil:'Liten c med cedille',egrave:'Liten e med grav aksent',eacute:'Liten e med akutt aksent',ecirc:'Liten e med cirkumfleks',euml:'Liten e med tøddel',igrave:'Liten i med grav aksent',iacute:'Liten i med akutt aksent',icirc:'Liten i med cirkumfleks',iuml:'Liten i med tøddel',eth:'Liten edd/stungen d',ntilde:'Liten n med tilde',ograve:'Liten o med grav aksent',oacute:'Liten o med akutt aksent',ocirc:'Liten o med cirkumfleks',otilde:'Liten o med tilde',ouml:'Liten o med tøddel',divide:'Divisjonstegn',oslash:'Liten ø',ugrave:'Liten u med grav aksent',uacute:'Liten u med akutt aksent',ucirc:'Liten u med cirkumfleks',uuml:'Liten u med tøddel',yacute:'Liten y med akutt aksent',thorn:'Liten thorn',yuml:'Liten y med tøddel',OElig:'Stor ligatur av O og E',oelig:'Liten ligatur av o og e',372:'Stor W med cirkumfleks',374:'Stor Y med cirkumfleks',373:'Liten w med cirkumfleks',375:'Liten y med cirkumfleks',sbquo:'Enkelt lavt 9-anførselstegn',8219:'Enkelt høyt reversert 9-anførselstegn',bdquo:'Dobbelt lavt 9-anførselstegn',hellip:'Ellipse',trade:'Varemerkesymbol',9658:'Svart høyrevendt peker',bull:'Tykk interpunkt',rarr:'Høyrevendt pil',rArr:'Dobbel høyrevendt pil',hArr:'Dobbel venstrevendt pil',diams:'Svart ruter',asymp:'Omtrent likhetstegn'});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('specialchar','no',{euro:'Eurosymbol',lsquo:'Venstre enkelt anførselstegn',rsquo:'Høyre enkelt anførselstegn',ldquo:'Venstre dobbelt anførselstegn',rdquo:'Høyre anførsesltegn',ndash:'Kort tankestrek',mdash:'Lang tankestrek',iexcl:'Omvendt utropstegn',cent:'Centsymbol',pound:'Pundsymbol',curren:'Valutategn',yen:'Yensymbol',brvbar:'Brutt loddrett strek',sect:'Paragraftegn',uml:'Tøddel',copy:'Copyrighttegn',ordf:'Feminin ordensindikator',laquo:'Venstre anførselstegn',not:'Negasjonstegn',reg:'Registrert varemerke-tegn',macr:'Makron',deg:'Gradsymbol',sup2:'Hevet totall',sup3:'Hevet tretall',acute:'Akutt aksent',micro:'Mikrosymbol',para:'Avsnittstegn',middot:'Midtstilt prikk',cedil:'Cedille',sup1:'Hevet ettall',ordm:'Maskulin ordensindikator',raquo:'Høyre anførselstegn',frac14:'Fjerdedelsbrøk',frac12:'Halvbrøk',frac34:'Tre fjerdedelers brøk',iquest:'Omvendt spørsmålstegn',Agrave:'Stor A med grav aksent',Aacute:'Stor A med akutt aksent',Acirc:'Stor A med cirkumfleks',Atilde:'Stor A med tilde',Auml:'Stor A med tøddel',Aring:'Stor Å',AElig:'Stor Æ',Ccedil:'Stor C med cedille',Egrave:'Stor E med grav aksent',Eacute:'Stor E med akutt aksent',Ecirc:'Stor E med cirkumfleks',Euml:'Stor E med tøddel',Igrave:'Stor I med grav aksent',Iacute:'Stor I med akutt aksent',Icirc:'Stor I med cirkumfleks',Iuml:'Stor I med tøddel',ETH:'Stor Edd/stungen D',Ntilde:'Stor N med tilde',Ograve:'Stor O med grav aksent',Oacute:'Stor O med akutt aksent',Ocirc:'Stor O med cirkumfleks',Otilde:'Stor O med tilde',Ouml:'Stor O med tøddel',times:'Multiplikasjonstegn',Oslash:'Stor Ø',Ugrave:'Stor U med grav aksent',Uacute:'Stor U med akutt aksent',Ucirc:'Stor U med cirkumfleks',Uuml:'Stor U med tøddel',Yacute:'Stor Y med akutt aksent',THORN:'Stor Thorn',szlig:'Liten dobbelt-s/Eszett',agrave:'Liten a med grav aksent',aacute:'Liten a med akutt aksent',acirc:'Liten a med cirkumfleks',atilde:'Liten a med tilde',auml:'Liten a med tøddel',aring:'Liten å',aelig:'Liten æ',ccedil:'Liten c med cedille',egrave:'Liten e med grav aksent',eacute:'Liten e med akutt aksent',ecirc:'Liten e med cirkumfleks',euml:'Liten e med tøddel',igrave:'Liten i med grav aksent',iacute:'Liten i med akutt aksent',icirc:'Liten i med cirkumfleks',iuml:'Liten i med tøddel',eth:'Liten edd/stungen d',ntilde:'Liten n med tilde',ograve:'Liten o med grav aksent',oacute:'Liten o med akutt aksent',ocirc:'Liten o med cirkumfleks',otilde:'Liten o med tilde',ouml:'Liten o med tøddel',divide:'Divisjonstegn',oslash:'Liten ø',ugrave:'Liten u med grav aksent',uacute:'Liten u med akutt aksent',ucirc:'Liten u med cirkumfleks',uuml:'Liten u med tøddel',yacute:'Liten y med akutt aksent',thorn:'Liten thorn',yuml:'Liten y med tøddel',OElig:'Stor ligatur av O og E',oelig:'Liten ligatur av o og e',372:'Stor W med cirkumfleks',374:'Stor Y med cirkumfleks',373:'Liten w med cirkumfleks',375:'Liten y med cirkumfleks',sbquo:'Enkelt lavt 9-anførselstegn',8219:'Enkelt høyt reversert 9-anførselstegn',bdquo:'Dobbelt lavt 9-anførselstegn',hellip:'Ellipse',trade:'Varemerkesymbol',9658:'Svart høyrevendt peker',bull:'Tykk interpunkt',rarr:'Høyrevendt pil',rArr:'Dobbel høyrevendt pil',hArr:'Dobbel venstrevendt pil',diams:'Svart ruter',asymp:'Omtrent likhetstegn'});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/pt-br.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/pt-br.js
index 119f397..59afeae 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/pt-br.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/pt-br.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('specialchar','pt-br',{euro:'Euro',lsquo:'Aspas simples esquerda',rsquo:'Aspas simples direita',ldquo:'Aspas duplas esquerda',rdquo:'Aspas duplas direita',ndash:'Traço',mdash:'Travessão',iexcl:'Ponto de exclamação invertido',cent:'Cent',pound:'Cerquilha',curren:'Dinheiro',yen:'Yen',brvbar:'Bara interrompida',sect:'Símbolo de Parágrafo',uml:'Trema',copy:'Direito de Cópia',ordf:'Indicador ordinal feminino',laquo:'Aspas duplas angulares esquerda',not:'Negação',reg:'Marca Registrada',macr:'Mácron',deg:'Grau',sup2:'2 Superscrito',sup3:'3 Superscrito',acute:'Acento agudo',micro:'Micro',para:'Pé de mosca',middot:'Ponto mediano',cedil:'Cedilha',sup1:'1 Superscrito',ordm:'Indicador ordinal masculino',raquo:'Aspas duplas angulares direita',frac14:'Um quarto',frac12:'Um meio',frac34:'Três quartos',iquest:'Interrogação invertida',Agrave:'A maiúsculo com acento grave',Aacute:'A maiúsculo com acento agudo',Acirc:'A maiúsculo com acento circunflexo',Atilde:'A maiúsculo com til',Auml:'A maiúsculo com trema',Aring:'A maiúsculo com anel acima',AElig:'Æ maiúsculo',Ccedil:'Ç maiúlculo',Egrave:'E maiúsculo com acento grave',Eacute:'E maiúsculo com acento agudo',Ecirc:'E maiúsculo com acento circumflexo',Euml:'E maiúsculo com trema',Igrave:'I maiúsculo com acento grave',Iacute:'I maiúsculo com acento agudo',Icirc:'I maiúsculo com acento circunflexo',Iuml:'I maiúsculo com crase',ETH:'Eth maiúsculo',Ntilde:'N maiúsculo com til',Ograve:'O maiúsculo com acento grave',Oacute:'O maiúsculo com acento agudo',Ocirc:'O maiúsculo com acento circunflexo',Otilde:'O maiúsculo com til',Ouml:'O maiúsculo com trema',times:'Multiplicação',Oslash:'Diâmetro',Ugrave:'U maiúsculo com acento grave',Uacute:'U maiúsculo com acento agudo',Ucirc:'U maiúsculo com acento circunflexo',Uuml:'U maiúsculo com trema',Yacute:'Y maiúsculo com acento agudo',THORN:'Thorn maiúsculo',szlig:'Eszett minúsculo',agrave:'a minúsculo com acento grave',aacute:'a minúsculo com acento agudo',acirc:'a minúsculo com acento circunflexo',atilde:'a minúsculo com til',auml:'a minúsculo com trema',aring:'a minúsculo com anel acima',aelig:'æ minúsculo',ccedil:'ç minúsculo',egrave:'e minúsculo com acento grave',eacute:'e minúsculo com acento agudo',ecirc:'e minúsculo com acento circunflexo',euml:'e minúsculo com trema',igrave:'i minúsculo com acento grave',iacute:'i minúsculo com acento agudo',icirc:'i minúsculo com acento circunflexo',iuml:'i minúsculo com trema',eth:'eth minúsculo',ntilde:'n minúsculo com til',ograve:'o minúsculo com acento grave',oacute:'o minúsculo com acento agudo',ocirc:'o minúsculo com acento circunflexo',otilde:'o minúsculo com til',ouml:'o minúsculo com trema',divide:'Divisão',oslash:'o minúsculo com cortado ou diâmetro',ugrave:'u minúsculo com acento grave',uacute:'u minúsculo com acento agudo',ucirc:'u minúsculo com acento circunflexo',uuml:'u minúsculo com trema',yacute:'y minúsculo com acento agudo',thorn:'thorn minúsculo',yuml:'y minúsculo com trema',OElig:'Ligação tipográfica OE maiúscula',oelig:'Ligação tipográfica oe minúscula',372:'W maiúsculo com acento circunflexo',374:'Y maiúsculo com acento circunflexo',373:'w minúsculo com acento circunflexo',375:'y minúsculo com acento circunflexo',sbquo:'Aspas simples inferior direita',8219:'Aspas simples superior esquerda',bdquo:'Aspas duplas inferior direita',hellip:'Reticências',trade:'Trade mark',9658:'Ponta de seta preta para direita',bull:'Ponto lista',rarr:'Seta para direita',rArr:'Seta dupla para direita',hArr:'Seta dupla direita e esquerda',diams:'Ouros',asymp:'Aproximadamente'});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('specialchar','pt-br',{euro:'Euro',lsquo:'Aspas simples esquerda',rsquo:'Aspas simples direita',ldquo:'Aspas duplas esquerda',rdquo:'Aspas duplas direita',ndash:'Traço',mdash:'Travessão',iexcl:'Ponto de exclamação invertido',cent:'Cent',pound:'Cerquilha',curren:'Dinheiro',yen:'Yen',brvbar:'Bara interrompida',sect:'Símbolo de Parágrafo',uml:'Trema',copy:'Direito de Cópia',ordf:'Indicador ordinal feminino',laquo:'Aspas duplas angulares esquerda',not:'Negação',reg:'Marca Registrada',macr:'Mácron',deg:'Grau',sup2:'2 Superscrito',sup3:'3 Superscrito',acute:'Acento agudo',micro:'Micro',para:'Pé de mosca',middot:'Ponto mediano',cedil:'Cedilha',sup1:'1 Superscrito',ordm:'Indicador ordinal masculino',raquo:'Aspas duplas angulares direita',frac14:'Um quarto',frac12:'Um meio',frac34:'Três quartos',iquest:'Interrogação invertida',Agrave:'A maiúsculo com acento grave',Aacute:'A maiúsculo com acento agudo',Acirc:'A maiúsculo com acento circunflexo',Atilde:'A maiúsculo com til',Auml:'A maiúsculo com trema',Aring:'A maiúsculo com anel acima',AElig:'Æ maiúsculo',Ccedil:'Ç maiúlculo',Egrave:'E maiúsculo com acento grave',Eacute:'E maiúsculo com acento agudo',Ecirc:'E maiúsculo com acento circumflexo',Euml:'E maiúsculo com trema',Igrave:'I maiúsculo com acento grave',Iacute:'I maiúsculo com acento agudo',Icirc:'I maiúsculo com acento circunflexo',Iuml:'I maiúsculo com crase',ETH:'Eth maiúsculo',Ntilde:'N maiúsculo com til',Ograve:'O maiúsculo com acento grave',Oacute:'O maiúsculo com acento agudo',Ocirc:'O maiúsculo com acento circunflexo',Otilde:'O maiúsculo com til',Ouml:'O maiúsculo com trema',times:'Multiplicação',Oslash:'Diâmetro',Ugrave:'U maiúsculo com acento grave',Uacute:'U maiúsculo com acento agudo',Ucirc:'U maiúsculo com acento circunflexo',Uuml:'U maiúsculo com trema',Yacute:'Y maiúsculo com acento agudo',THORN:'Thorn maiúsculo',szlig:'Eszett minúsculo',agrave:'a minúsculo com acento grave',aacute:'a minúsculo com acento agudo',acirc:'a minúsculo com acento circunflexo',atilde:'a minúsculo com til',auml:'a minúsculo com trema',aring:'a minúsculo com anel acima',aelig:'æ minúsculo',ccedil:'ç minúsculo',egrave:'e minúsculo com acento grave',eacute:'e minúsculo com acento agudo',ecirc:'e minúsculo com acento circunflexo',euml:'e minúsculo com trema',igrave:'i minúsculo com acento grave',iacute:'i minúsculo com acento agudo',icirc:'i minúsculo com acento circunflexo',iuml:'i minúsculo com trema',eth:'eth minúsculo',ntilde:'n minúsculo com til',ograve:'o minúsculo com acento grave',oacute:'o minúsculo com acento agudo',ocirc:'o minúsculo com acento circunflexo',otilde:'o minúsculo com til',ouml:'o minúsculo com trema',divide:'Divisão',oslash:'o minúsculo com cortado ou diâmetro',ugrave:'u minúsculo com acento grave',uacute:'u minúsculo com acento agudo',ucirc:'u minúsculo com acento circunflexo',uuml:'u minúsculo com trema',yacute:'y minúsculo com acento agudo',thorn:'thorn minúsculo',yuml:'y minúsculo com trema',OElig:'Ligação tipográfica OE maiúscula',oelig:'Ligação tipográfica oe minúscula',372:'W maiúsculo com acento circunflexo',374:'Y maiúsculo com acento circunflexo',373:'w minúsculo com acento circunflexo',375:'y minúsculo com acento circunflexo',sbquo:'Aspas simples inferior direita',8219:'Aspas simples superior esquerda',bdquo:'Aspas duplas inferior direita',hellip:'Reticências',trade:'Trade mark',9658:'Ponta de seta preta para direita',bull:'Ponto lista',rarr:'Seta para direita',rArr:'Seta dupla para direita',hArr:'Seta dupla direita e esquerda',diams:'Ouros',asymp:'Aproximadamente'});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/tr.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/tr.js
index 8384241..5e6c984 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/tr.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/tr.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('specialchar','tr',{euro:'Euro işareti',lsquo:'Sol tek tırnak işareti',rsquo:'Sağ tek tırnak işareti',ldquo:'Sol çift tırnak işareti',rdquo:'Sağ çift tırnak işareti',ndash:'En tire',mdash:'Em tire',iexcl:'Ters ünlem işareti',cent:'Cent işareti',pound:'Pound işareti',curren:'Para birimi işareti',yen:'Yen işareti',brvbar:'Kırık bar',sect:'Bölüm işareti',uml:'İki sesli harfin ayrılması',copy:'Telif hakkı işareti',ordf:'Dişil sıralı gösterge',laquo:'Sol-işaret çift açı tırnak işareti',not:'Not işareti',reg:'Kayıtlı işareti',macr:'Makron',deg:'Derece işareti',sup2:'İkili üstsimge',sup3:'Üçlü üstsimge',acute:'Aksan işareti',micro:'Mikro işareti',para:'Pilcrow işareti',middot:'Orta nokta',cedil:'Kedilla',sup1:'Üstsimge',ordm:'Eril sıralı gösterge',raquo:'Sağ işaret çift açı tırnak işareti',frac14:'Bayağı kesrin dörtte biri',frac12:'Bayağı kesrin bir yarım',frac34:'Bayağı kesrin dörtte üç',iquest:'Ters soru işareti',Agrave:'Aksanlı latin harfi',Aacute:'Aşırı aksanıyla Latin harfi',Acirc:'Çarpık Latin harfi',Atilde:'Tilde latin harfi',Auml:'Sesli harf ayrılımlıı latin harfi',Aring:'Halkalı latin büyük A harfi',AElig:'Latin büyük Æ harfi',Ccedil:'Latin büyük C harfi ile kedilla',Egrave:'Aksanlı latin büyük E harfi',Eacute:'Aşırı vurgulu latin büyük E harfi',Ecirc:'Çarpık latin büyük E harfi',Euml:'Sesli harf ayrılımlıı latin büyük E harfi',Igrave:'Aksanlı latin büyük I harfi',Iacute:'Aşırı aksanlı latin büyük I harfi',Icirc:'Çarpık latin büyük I harfi',Iuml:'Sesli harf ayrılımlıı latin büyük I harfi',ETH:'Latin büyük Eth harfi',Ntilde:'Tildeli latin büyük N harfi',Ograve:'Aksanlı latin büyük O harfi',Oacute:'Aşırı aksanlı latin büyük O harfi',Ocirc:'Çarpık latin büyük O harfi',Otilde:'Tildeli latin büyük O harfi',Ouml:'Sesli harf ayrılımlı latin büyük O harfi',times:'Çarpma işareti',Oslash:'Vurgulu latin büyük O harfi',Ugrave:'Aksanlı latin büyük U harfi',Uacute:'Aşırı aksanlı latin büyük U harfi',Ucirc:'Çarpık latin büyük U harfi',Uuml:'Sesli harf ayrılımlı latin büyük U harfi',Yacute:'Aşırı aksanlı latin büyük Y harfi',THORN:'Latin büyük Thorn harfi',szlig:'Latin küçük keskin s harfi',agrave:'Aksanlı latin küçük a harfi',aacute:'Aşırı aksanlı latin küçük a harfi',acirc:'Çarpık latin küçük a harfi',atilde:'Tildeli latin küçük a harfi',auml:'Sesli harf ayrılımlı latin küçük a harfi',aring:'Halkalı latin küçük a harfi',aelig:'Latin büyük æ harfi',ccedil:'Kedillalı latin küçük c harfi',egrave:'Aksanlı latin küçük e harfi',eacute:'Aşırı aksanlı latin küçük e harfi',ecirc:'Çarpık latin küçük e harfi',euml:'Sesli harf ayrılımlı latin küçük e harfi',igrave:'Aksanlı latin küçük i harfi',iacute:'Aşırı aksanlı latin küçük i harfi',icirc:'Çarpık latin küçük i harfi',iuml:'Sesli harf ayrılımlı latin küçük i harfi',eth:'Latin küçük eth harfi',ntilde:'Tildeli latin küçük n harfi',ograve:'Aksanlı latin küçük o harfi',oacute:'Aşırı aksanlı latin küçük o harfi',ocirc:'Çarpık latin küçük o harfi',otilde:'Tildeli latin küçük o harfi',ouml:'Sesli harf ayrılımlı latin küçük o harfi',divide:'Bölme işareti',oslash:'Vurgulu latin küçük o harfi',ugrave:'Aksanlı latin küçük u harfi',uacute:'Aşırı aksanlı latin küçük u harfi',ucirc:'Çarpık latin küçük u harfi',uuml:'Sesli harf ayrılımlı latin küçük u harfi',yacute:'Aşırı aksanlı latin küçük y harfi',thorn:'Latin küçük thorn harfi',yuml:'Sesli harf ayrılımlı latin küçük y harfi',OElig:'Latin büyük bağlı OE harfi',oelig:'Latin küçük bağlı oe harfi',372:'Çarpık latin büyük W harfi',374:'Çarpık latin büyük Y harfi',373:'Çarpık latin küçük w harfi',375:'Çarpık latin küçük y harfi',sbquo:'Tek düşük-9 tırnak işareti',8219:'Tek yüksek-ters-9 tırnak işareti',bdquo:'Çift düşük-9 tırnak işareti',hellip:'Yatay elips',trade:'Marka tescili işareti',9658:'Siyah sağ işaret işaretçisi',bull:'Koyu nokta',rarr:'Sağa doğru ok',rArr:'Sağa doğru çift ok',hArr:'Sol, sağ çift ok',diams:'Siyah elmas takımı',asymp:'Hemen hemen eşit'});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('specialchar','tr',{euro:'Euro işareti',lsquo:'Sol tek tırnak işareti',rsquo:'Sağ tek tırnak işareti',ldquo:'Sol çift tırnak işareti',rdquo:'Sağ çift tırnak işareti',ndash:'En tire',mdash:'Em tire',iexcl:'Ters ünlem işareti',cent:'Cent işareti',pound:'Pound işareti',curren:'Para birimi işareti',yen:'Yen işareti',brvbar:'Kırık bar',sect:'Bölüm işareti',uml:'İki sesli harfin ayrılması',copy:'Telif hakkı işareti',ordf:'Dişil sıralı gösterge',laquo:'Sol-işaret çift açı tırnak işareti',not:'Not işareti',reg:'Kayıtlı işareti',macr:'Makron',deg:'Derece işareti',sup2:'İkili üstsimge',sup3:'Üçlü üstsimge',acute:'Aksan işareti',micro:'Mikro işareti',para:'Pilcrow işareti',middot:'Orta nokta',cedil:'Kedilla',sup1:'Üstsimge',ordm:'Eril sıralı gösterge',raquo:'Sağ işaret çift açı tırnak işareti',frac14:'Bayağı kesrin dörtte biri',frac12:'Bayağı kesrin bir yarım',frac34:'Bayağı kesrin dörtte üç',iquest:'Ters soru işareti',Agrave:'Aksanlı latin harfi',Aacute:'Aşırı aksanıyla Latin harfi',Acirc:'Çarpık Latin harfi',Atilde:'Tilde latin harfi',Auml:'Sesli harf ayrılımlıı latin harfi',Aring:'Halkalı latin büyük A harfi',AElig:'Latin büyük Æ harfi',Ccedil:'Latin büyük C harfi ile kedilla',Egrave:'Aksanlı latin büyük E harfi',Eacute:'Aşırı vurgulu latin büyük E harfi',Ecirc:'Çarpık latin büyük E harfi',Euml:'Sesli harf ayrılımlıı latin büyük E harfi',Igrave:'Aksanlı latin büyük I harfi',Iacute:'Aşırı aksanlı latin büyük I harfi',Icirc:'Çarpık latin büyük I harfi',Iuml:'Sesli harf ayrılımlıı latin büyük I harfi',ETH:'Latin büyük Eth harfi',Ntilde:'Tildeli latin büyük N harfi',Ograve:'Aksanlı latin büyük O harfi',Oacute:'Aşırı aksanlı latin büyük O harfi',Ocirc:'Çarpık latin büyük O harfi',Otilde:'Tildeli latin büyük O harfi',Ouml:'Sesli harf ayrılımlı latin büyük O harfi',times:'Çarpma işareti',Oslash:'Vurgulu latin büyük O harfi',Ugrave:'Aksanlı latin büyük U harfi',Uacute:'Aşırı aksanlı latin büyük U harfi',Ucirc:'Çarpık latin büyük U harfi',Uuml:'Sesli harf ayrılımlı latin büyük U harfi',Yacute:'Aşırı aksanlı latin büyük Y harfi',THORN:'Latin büyük Thorn harfi',szlig:'Latin küçük keskin s harfi',agrave:'Aksanlı latin küçük a harfi',aacute:'Aşırı aksanlı latin küçük a harfi',acirc:'Çarpık latin küçük a harfi',atilde:'Tildeli latin küçük a harfi',auml:'Sesli harf ayrılımlı latin küçük a harfi',aring:'Halkalı latin küçük a harfi',aelig:'Latin büyük æ harfi',ccedil:'Kedillalı latin küçük c harfi',egrave:'Aksanlı latin küçük e harfi',eacute:'Aşırı aksanlı latin küçük e harfi',ecirc:'Çarpık latin küçük e harfi',euml:'Sesli harf ayrılımlı latin küçük e harfi',igrave:'Aksanlı latin küçük i harfi',iacute:'Aşırı aksanlı latin küçük i harfi',icirc:'Çarpık latin küçük i harfi',iuml:'Sesli harf ayrılımlı latin küçük i harfi',eth:'Latin küçük eth harfi',ntilde:'Tildeli latin küçük n harfi',ograve:'Aksanlı latin küçük o harfi',oacute:'Aşırı aksanlı latin küçük o harfi',ocirc:'Çarpık latin küçük o harfi',otilde:'Tildeli latin küçük o harfi',ouml:'Sesli harf ayrılımlı latin küçük o harfi',divide:'Bölme işareti',oslash:'Vurgulu latin küçük o harfi',ugrave:'Aksanlı latin küçük u harfi',uacute:'Aşırı aksanlı latin küçük u harfi',ucirc:'Çarpık latin küçük u harfi',uuml:'Sesli harf ayrılımlı latin küçük u harfi',yacute:'Aşırı aksanlı latin küçük y harfi',thorn:'Latin küçük thorn harfi',yuml:'Sesli harf ayrılımlı latin küçük y harfi',OElig:'Latin büyük bağlı OE harfi',oelig:'Latin küçük bağlı oe harfi',372:'Çarpık latin büyük W harfi',374:'Çarpık latin büyük Y harfi',373:'Çarpık latin küçük w harfi',375:'Çarpık latin küçük y harfi',sbquo:'Tek düşük-9 tırnak işareti',8219:'Tek yüksek-ters-9 tırnak işareti',bdquo:'Çift düşük-9 tırnak işareti',hellip:'Yatay elips',trade:'Marka tescili işareti',9658:'Siyah sağ işaret işaretçisi',bull:'Koyu nokta',rarr:'Sağa doğru ok',rArr:'Sağa doğru çift ok',hArr:'Sol, sağ çift ok',diams:'Siyah elmas takımı',asymp:'Hemen hemen eşit'});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/ug.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/ug.js
index f42a167..baf2355 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/ug.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/ug.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('specialchar','ug',{euro:'ياۋرو بەلگىسى',lsquo:'يالاڭ پەش سول',rsquo:'يالاڭ پەش ئوڭ',ldquo:'قوش پەش سول',rdquo:'قوش پەش ئوڭ',ndash:'سىزىقچە',mdash:'سىزىق',iexcl:'ئۈندەش',cent:'تىيىن بەلگىسى',pound:'فوند ستېرلىڭ',curren:'پۇل بەلگىسى',yen:'ياپونىيە يىنى',brvbar:'ئۈزۈك بالداق',sect:'پاراگراف بەلگىسى',uml:'تاۋۇش ئايرىش بەلگىسى',copy:'نەشر ھوقۇقى بەلگىسى',ordf:'Feminine ordinal indicator',laquo:'قوش تىرناق سول',not:'غەيرى بەلگە',reg:'خەتلەتكەن تاۋار ماركىسى',macr:'سوزۇش بەلگىسى',deg:'گىرادۇس بەلگىسى',sup2:'يۇقىرى ئىندېكىس 2',sup3:'يۇقىرى ئىندېكىس 3',acute:'ئۇرغۇ بەلگىسى',micro:'Micro sign',para:'ئابزاس بەلگىسى',middot:'ئوتتۇرا چېكىت',cedil:'ئاستىغا قوشۇلىدىغان بەلگە',sup1:'يۇقىرى ئىندېكىس 1',ordm:'Masculine ordinal indicator',raquo:'قوش تىرناق ئوڭ',frac14:'ئاددىي كەسىر تۆتتىن بىر',frac12:'ئاددىي كەسىر ئىككىدىن بىر',frac34:'ئاددىي كەسىر ئۈچتىن تۆرت',iquest:'Inverted question mark',Agrave:'Latin capital letter A with grave accent',Aacute:'Latin capital letter A with acute accent',Acirc:'Latin capital letter A with circumflex',Atilde:'Latin capital letter A with tilde',Auml:'Latin capital letter A with diaeresis',Aring:'Latin capital letter A with ring above',AElig:'Latin Capital letter Æ',Ccedil:'Latin capital letter C with cedilla',Egrave:'Latin capital letter E with grave accent',Eacute:'Latin capital letter E with acute accent',Ecirc:'Latin capital letter E with circumflex',Euml:'Latin capital letter E with diaeresis',Igrave:'Latin capital letter I with grave accent',Iacute:'Latin capital letter I with acute accent',Icirc:'Latin capital letter I with circumflex',Iuml:'Latin capital letter I with diaeresis',ETH:'Latin capital letter Eth',Ntilde:'Latin capital letter N with tilde',Ograve:'قوش پەش ئوڭ',Oacute:'Latin capital letter O with acute accent',Ocirc:'Latin capital letter O with circumflex',Otilde:'Latin capital letter O with tilde',Ouml:'Latin capital letter O with diaeresis',times:'Multiplication sign',Oslash:'Latin capital letter O with stroke',Ugrave:'Latin capital letter U with grave accent',Uacute:'Latin capital letter U with acute accent',Ucirc:'Latin capital letter U with circumflex',Uuml:'Latin capital letter U with diaeresis',Yacute:'Latin capital letter Y with acute accent',THORN:'Latin capital letter Thorn',szlig:'Latin small letter sharp s',agrave:'Latin small letter a with grave accent',aacute:'Latin small letter a with acute accent',acirc:'Latin small letter a with circumflex',atilde:'Latin small letter a with tilde',auml:'Latin small letter a with diaeresis',aring:'Latin small letter a with ring above',aelig:'Latin small letter æ',ccedil:'Latin small letter c with cedilla',egrave:'Latin small letter e with grave accent',eacute:'Latin small letter e with acute accent',ecirc:'Latin small letter e with circumflex',euml:'Latin small letter e with diaeresis',igrave:'Latin small letter i with grave accent',iacute:'Latin small letter i with acute accent',icirc:'Latin small letter i with circumflex',iuml:'Latin small letter i with diaeresis',eth:'Latin small letter eth',ntilde:'تىك موللاق سوئال بەلگىسى',ograve:'Latin small letter o with grave accent',oacute:'Latin small letter o with acute accent',ocirc:'Latin small letter o with circumflex',otilde:'Latin small letter o with tilde',ouml:'Latin small letter o with diaeresis',divide:'Division sign',oslash:'Latin small letter o with stroke',ugrave:'Latin small letter u with grave accent',uacute:'Latin small letter u with acute accent',ucirc:'Latin small letter u with circumflex',uuml:'Latin small letter u with diaeresis',yacute:'Latin small letter y with acute accent',thorn:'Latin small letter thorn',yuml:'Latin small letter y with diaeresis',OElig:'Latin capital ligature OE',oelig:'Latin small ligature oe',372:'Latin capital letter W with circumflex',374:'Latin capital letter Y with circumflex',373:'Latin small letter w with circumflex',375:'Latin small letter y with circumflex',sbquo:'Single low-9 quotation mark',8219:'Single high-reversed-9 quotation mark',bdquo:'Double low-9 quotation mark',hellip:'Horizontal ellipsis',trade:'Trade mark sign',9658:'Black right-pointing pointer',bull:'Bullet',rarr:'ئوڭ يا ئوق',rArr:'ئوڭ قوش سىزىق يا ئوق',hArr:'ئوڭ سول قوش سىزىق يا ئوق',diams:'ئۇيۇل غىچ',asymp:'تەخمىنەن تەڭ'});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('specialchar','ug',{euro:'ياۋرو بەلگىسى',lsquo:'يالاڭ پەش سول',rsquo:'يالاڭ پەش ئوڭ',ldquo:'قوش پەش سول',rdquo:'قوش پەش ئوڭ',ndash:'سىزىقچە',mdash:'سىزىق',iexcl:'ئۈندەش',cent:'تىيىن بەلگىسى',pound:'فوند ستېرلىڭ',curren:'پۇل بەلگىسى',yen:'ياپونىيە يىنى',brvbar:'ئۈزۈك بالداق',sect:'پاراگراف بەلگىسى',uml:'تاۋۇش ئايرىش بەلگىسى',copy:'نەشر ھوقۇقى بەلگىسى',ordf:'Feminine ordinal indicator',laquo:'قوش تىرناق سول',not:'غەيرى بەلگە',reg:'خەتلەتكەن تاۋار ماركىسى',macr:'سوزۇش بەلگىسى',deg:'گىرادۇس بەلگىسى',sup2:'يۇقىرى ئىندېكىس 2',sup3:'يۇقىرى ئىندېكىس 3',acute:'ئۇرغۇ بەلگىسى',micro:'Micro sign',para:'ئابزاس بەلگىسى',middot:'ئوتتۇرا چېكىت',cedil:'ئاستىغا قوشۇلىدىغان بەلگە',sup1:'يۇقىرى ئىندېكىس 1',ordm:'Masculine ordinal indicator',raquo:'قوش تىرناق ئوڭ',frac14:'ئاددىي كەسىر تۆتتىن بىر',frac12:'ئاددىي كەسىر ئىككىدىن بىر',frac34:'ئاددىي كەسىر ئۈچتىن تۆرت',iquest:'Inverted question mark',Agrave:'Latin capital letter A with grave accent',Aacute:'Latin capital letter A with acute accent',Acirc:'Latin capital letter A with circumflex',Atilde:'Latin capital letter A with tilde',Auml:'Latin capital letter A with diaeresis',Aring:'Latin capital letter A with ring above',AElig:'Latin Capital letter Æ',Ccedil:'Latin capital letter C with cedilla',Egrave:'Latin capital letter E with grave accent',Eacute:'Latin capital letter E with acute accent',Ecirc:'Latin capital letter E with circumflex',Euml:'Latin capital letter E with diaeresis',Igrave:'Latin capital letter I with grave accent',Iacute:'Latin capital letter I with acute accent',Icirc:'Latin capital letter I with circumflex',Iuml:'Latin capital letter I with diaeresis',ETH:'Latin capital letter Eth',Ntilde:'Latin capital letter N with tilde',Ograve:'قوش پەش ئوڭ',Oacute:'Latin capital letter O with acute accent',Ocirc:'Latin capital letter O with circumflex',Otilde:'Latin capital letter O with tilde',Ouml:'Latin capital letter O with diaeresis',times:'Multiplication sign',Oslash:'Latin capital letter O with stroke',Ugrave:'Latin capital letter U with grave accent',Uacute:'Latin capital letter U with acute accent',Ucirc:'Latin capital letter U with circumflex',Uuml:'Latin capital letter U with diaeresis',Yacute:'Latin capital letter Y with acute accent',THORN:'Latin capital letter Thorn',szlig:'Latin small letter sharp s',agrave:'Latin small letter a with grave accent',aacute:'Latin small letter a with acute accent',acirc:'Latin small letter a with circumflex',atilde:'Latin small letter a with tilde',auml:'Latin small letter a with diaeresis',aring:'Latin small letter a with ring above',aelig:'Latin small letter æ',ccedil:'Latin small letter c with cedilla',egrave:'Latin small letter e with grave accent',eacute:'Latin small letter e with acute accent',ecirc:'Latin small letter e with circumflex',euml:'Latin small letter e with diaeresis',igrave:'Latin small letter i with grave accent',iacute:'Latin small letter i with acute accent',icirc:'Latin small letter i with circumflex',iuml:'Latin small letter i with diaeresis',eth:'Latin small letter eth',ntilde:'تىك موللاق سوئال بەلگىسى',ograve:'Latin small letter o with grave accent',oacute:'Latin small letter o with acute accent',ocirc:'Latin small letter o with circumflex',otilde:'Latin small letter o with tilde',ouml:'Latin small letter o with diaeresis',divide:'Division sign',oslash:'Latin small letter o with stroke',ugrave:'Latin small letter u with grave accent',uacute:'Latin small letter u with acute accent',ucirc:'Latin small letter u with circumflex',uuml:'Latin small letter u with diaeresis',yacute:'Latin small letter y with acute accent',thorn:'Latin small letter thorn',yuml:'Latin small letter y with diaeresis',OElig:'Latin capital ligature OE',oelig:'Latin small ligature oe',372:'Latin capital letter W with circumflex',374:'Latin capital letter Y with circumflex',373:'Latin small letter w with circumflex',375:'Latin small letter y with circumflex',sbquo:'Single low-9 quotation mark',8219:'Single high-reversed-9 quotation mark',bdquo:'Double low-9 quotation mark',hellip:'Horizontal ellipsis',trade:'Trade mark sign',9658:'Black right-pointing pointer',bull:'Bullet',rarr:'ئوڭ يا ئوق',rArr:'ئوڭ قوش سىزىق يا ئوق',hArr:'ئوڭ سول قوش سىزىق يا ئوق',diams:'ئۇيۇل غىچ',asymp:'تەخمىنەن تەڭ'});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/zh-cn.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/zh-cn.js
index 3848cbf..1dddf16 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/zh-cn.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/specialchar/lang/zh-cn.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('specialchar','zh-cn',{euro:'欧元符号',lsquo:'左单引号',rsquo:'右单引号',ldquo:'左双引号',rdquo:'右双引号',ndash:'短划线',mdash:'破折号',iexcl:'竖翻叹号',cent:'分币标记',pound:'英镑标记',curren:'货币标记',yen:'日元标记',brvbar:'间断条',sect:'节标记',uml:'分音符',copy:'版权所有标记',ordf:'阴性顺序指示符',laquo:'左指双尖引号',not:'非标记',reg:'注册标记',macr:'长音符',deg:'度标记',sup2:'上标二',sup3:'上标三',acute:'锐音符',micro:'微符',para:'段落标记',middot:'中间点',cedil:'下加符',sup1:'上标一',ordm:'阳性顺序指示符',raquo:'右指双尖引号',frac14:'普通分数四分之一',frac12:'普通分数二分之一',frac34:'普通分数四分之三',iquest:'竖翻问号',Agrave:'带抑音符的拉丁文大写字母 A',Aacute:'带锐音符的拉丁文大写字母 A',Acirc:'带扬抑符的拉丁文大写字母 A',Atilde:'带颚化符的拉丁文大写字母 A',Auml:'带分音符的拉丁文大写字母 A',Aring:'带上圆圈的拉丁文大写字母 A',AElig:'拉丁文大写字母 Ae',Ccedil:'带下加符的拉丁文大写字母 C',Egrave:'带抑音符的拉丁文大写字母 E',Eacute:'带锐音符的拉丁文大写字母 E',Ecirc:'带扬抑符的拉丁文大写字母 E',Euml:'带分音符的拉丁文大写字母 E',Igrave:'带抑音符的拉丁文大写字母 I',Iacute:'带锐音符的拉丁文大写字母 I',Icirc:'带扬抑符的拉丁文大写字母 I',Iuml:'带分音符的拉丁文大写字母 I',ETH:'拉丁文大写字母 Eth',Ntilde:'带颚化符的拉丁文大写字母 N',Ograve:'带抑音符的拉丁文大写字母 O',Oacute:'带锐音符的拉丁文大写字母 O',Ocirc:'带扬抑符的拉丁文大写字母 O',Otilde:'带颚化符的拉丁文大写字母 O',Ouml:'带分音符的拉丁文大写字母 O',times:'乘号',Oslash:'带粗线的拉丁文大写字母 O',Ugrave:'带抑音符的拉丁文大写字母 U',Uacute:'带锐音符的拉丁文大写字母 U',Ucirc:'带扬抑符的拉丁文大写字母 U',Uuml:'带分音符的拉丁文大写字母 U',Yacute:'带抑音符的拉丁文大写字母 Y',THORN:'拉丁文大写字母 Thorn',szlig:'拉丁文小写字母清音 S',agrave:'带抑音符的拉丁文小写字母 A',aacute:'带锐音符的拉丁文小写字母 A',acirc:'带扬抑符的拉丁文小写字母 A',atilde:'带颚化符的拉丁文小写字母 A',auml:'带分音符的拉丁文小写字母 A',aring:'带上圆圈的拉丁文小写字母 A',aelig:'拉丁文小写字母 Ae',ccedil:'带下加符的拉丁文小写字母 C',egrave:'带抑音符的拉丁文小写字母 E',eacute:'带锐音符的拉丁文小写字母 E',ecirc:'带扬抑符的拉丁文小写字母 E',euml:'带分音符的拉丁文小写字母 E',igrave:'带抑音符的拉丁文小写字母 I',iacute:'带锐音符的拉丁文小写字母 I',icirc:'带扬抑符的拉丁文小写字母 I',iuml:'带分音符的拉丁文小写字母 I',eth:'拉丁文小写字母 Eth',ntilde:'带颚化符的拉丁文小写字母 N',ograve:'带抑音符的拉丁文小写字母 O',oacute:'带锐音符的拉丁文小写字母 O',ocirc:'带扬抑符的拉丁文小写字母 O',otilde:'带颚化符的拉丁文小写字母 O',ouml:'带分音符的拉丁文小写字母 O',divide:'除号',oslash:'带粗线的拉丁文小写字母 O',ugrave:'带抑音符的拉丁文小写字母 U',uacute:'带锐音符的拉丁文小写字母 U',ucirc:'带扬抑符的拉丁文小写字母 U',uuml:'带分音符的拉丁文小写字母 U',yacute:'带抑音符的拉丁文小写字母 Y',thorn:'拉丁文小写字母 Thorn',yuml:'带分音符的拉丁文小写字母 Y',OElig:'拉丁文大写连字 Oe',oelig:'拉丁文小写连字 Oe',372:'带扬抑符的拉丁文大写字母 W',374:'带扬抑符的拉丁文大写字母 Y',373:'带扬抑符的拉丁文小写字母 W',375:'带扬抑符的拉丁文小写字母 Y',sbquo:'单下 9 形引号',8219:'单高横翻 9 形引号',bdquo:'双下 9 形引号',hellip:'水平省略号',trade:'商标标志',9658:'实心右指指针',bull:'加重号',rarr:'向右箭头',rArr:'向右双线箭头',hArr:'左右双线箭头',diams:'实心方块纸牌',asymp:'约等于'});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('specialchar','zh-cn',{euro:'欧元符号',lsquo:'左单引号',rsquo:'右单引号',ldquo:'左双引号',rdquo:'右双引号',ndash:'短划线',mdash:'破折号',iexcl:'竖翻叹号',cent:'分币标记',pound:'英镑标记',curren:'货币标记',yen:'日元标记',brvbar:'间断条',sect:'节标记',uml:'分音符',copy:'版权所有标记',ordf:'阴性顺序指示符',laquo:'左指双尖引号',not:'非标记',reg:'注册标记',macr:'长音符',deg:'度标记',sup2:'上标二',sup3:'上标三',acute:'锐音符',micro:'微符',para:'段落标记',middot:'中间点',cedil:'下加符',sup1:'上标一',ordm:'阳性顺序指示符',raquo:'右指双尖引号',frac14:'普通分数四分之一',frac12:'普通分数二分之一',frac34:'普通分数四分之三',iquest:'竖翻问号',Agrave:'带抑音符的拉丁文大写字母 A',Aacute:'带锐音符的拉丁文大写字母 A',Acirc:'带扬抑符的拉丁文大写字母 A',Atilde:'带颚化符的拉丁文大写字母 A',Auml:'带分音符的拉丁文大写字母 A',Aring:'带上圆圈的拉丁文大写字母 A',AElig:'拉丁文大写字母 Ae',Ccedil:'带下加符的拉丁文大写字母 C',Egrave:'带抑音符的拉丁文大写字母 E',Eacute:'带锐音符的拉丁文大写字母 E',Ecirc:'带扬抑符的拉丁文大写字母 E',Euml:'带分音符的拉丁文大写字母 E',Igrave:'带抑音符的拉丁文大写字母 I',Iacute:'带锐音符的拉丁文大写字母 I',Icirc:'带扬抑符的拉丁文大写字母 I',Iuml:'带分音符的拉丁文大写字母 I',ETH:'拉丁文大写字母 Eth',Ntilde:'带颚化符的拉丁文大写字母 N',Ograve:'带抑音符的拉丁文大写字母 O',Oacute:'带锐音符的拉丁文大写字母 O',Ocirc:'带扬抑符的拉丁文大写字母 O',Otilde:'带颚化符的拉丁文大写字母 O',Ouml:'带分音符的拉丁文大写字母 O',times:'乘号',Oslash:'带粗线的拉丁文大写字母 O',Ugrave:'带抑音符的拉丁文大写字母 U',Uacute:'带锐音符的拉丁文大写字母 U',Ucirc:'带扬抑符的拉丁文大写字母 U',Uuml:'带分音符的拉丁文大写字母 U',Yacute:'带抑音符的拉丁文大写字母 Y',THORN:'拉丁文大写字母 Thorn',szlig:'拉丁文小写字母清音 S',agrave:'带抑音符的拉丁文小写字母 A',aacute:'带锐音符的拉丁文小写字母 A',acirc:'带扬抑符的拉丁文小写字母 A',atilde:'带颚化符的拉丁文小写字母 A',auml:'带分音符的拉丁文小写字母 A',aring:'带上圆圈的拉丁文小写字母 A',aelig:'拉丁文小写字母 Ae',ccedil:'带下加符的拉丁文小写字母 C',egrave:'带抑音符的拉丁文小写字母 E',eacute:'带锐音符的拉丁文小写字母 E',ecirc:'带扬抑符的拉丁文小写字母 E',euml:'带分音符的拉丁文小写字母 E',igrave:'带抑音符的拉丁文小写字母 I',iacute:'带锐音符的拉丁文小写字母 I',icirc:'带扬抑符的拉丁文小写字母 I',iuml:'带分音符的拉丁文小写字母 I',eth:'拉丁文小写字母 Eth',ntilde:'带颚化符的拉丁文小写字母 N',ograve:'带抑音符的拉丁文小写字母 O',oacute:'带锐音符的拉丁文小写字母 O',ocirc:'带扬抑符的拉丁文小写字母 O',otilde:'带颚化符的拉丁文小写字母 O',ouml:'带分音符的拉丁文小写字母 O',divide:'除号',oslash:'带粗线的拉丁文小写字母 O',ugrave:'带抑音符的拉丁文小写字母 U',uacute:'带锐音符的拉丁文小写字母 U',ucirc:'带扬抑符的拉丁文小写字母 U',uuml:'带分音符的拉丁文小写字母 U',yacute:'带抑音符的拉丁文小写字母 Y',thorn:'拉丁文小写字母 Thorn',yuml:'带分音符的拉丁文小写字母 Y',OElig:'拉丁文大写连字 Oe',oelig:'拉丁文小写连字 Oe',372:'带扬抑符的拉丁文大写字母 W',374:'带扬抑符的拉丁文大写字母 Y',373:'带扬抑符的拉丁文小写字母 W',375:'带扬抑符的拉丁文小写字母 Y',sbquo:'单下 9 形引号',8219:'单高横翻 9 形引号',bdquo:'双下 9 形引号',hellip:'水平省略号',trade:'商标标志',9658:'实心右指指针',bull:'加重号',rarr:'向右箭头',rArr:'向右双线箭头',hArr:'左右双线箭头',diams:'实心方块纸牌',asymp:'约等于'});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/styles/styles/default.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/styles/styles/default.js
index 6aa58f3..bcbb3a6 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/styles/styles/default.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/styles/styles/default.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.stylesSet.add('default',[{name:'Blue Title',element:'h3',styles:{color:'Blue'}},{name:'Red Title',element:'h3',styles:{color:'Red'}},{name:'Marker: Yellow',element:'span',styles:{'background-color':'Yellow'}},{name:'Marker: Green',element:'span',styles:{'background-color':'Lime'}},{name:'Big',element:'big'},{name:'Small',element:'small'},{name:'Typewriter',element:'tt'},{name:'Computer Code',element:'code'},{name:'Keyboard Phrase',element:'kbd'},{name:'Sample Text',element:'samp'},{name:'Variable',element:'var'},{name:'Deleted Text',element:'del'},{name:'Inserted Text',element:'ins'},{name:'Cited Work',element:'cite'},{name:'Inline Quotation',element:'q'},{name:'Language: RTL',element:'span',attributes:{dir:'rtl'}},{name:'Language: LTR',element:'span',attributes:{dir:'ltr'}},{name:'Image on Left',element:'img',attributes:{style:'padding: 5px; margin-right: 5px',border:'2',align:'left'}},{name:'Image on Right',element:'img',attributes:{style:'padding: 5px; margin-left: 5px',border:'2',align:'right'}},{name:'Borderless Table',element:'table',styles:{'border-style':'hidden','background-color':'#E6E6FA'}},{name:'Square Bulleted List',element:'ul',styles:{'list-style-type':'square'}}]);
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.stylesSet.add('default',[{name:'Blue Title',element:'h3',styles:{color:'Blue'}},{name:'Red Title',element:'h3',styles:{color:'Red'}},{name:'Marker: Yellow',element:'span',styles:{'background-color':'Yellow'}},{name:'Marker: Green',element:'span',styles:{'background-color':'Lime'}},{name:'Big',element:'big'},{name:'Small',element:'small'},{name:'Typewriter',element:'tt'},{name:'Computer Code',element:'code'},{name:'Keyboard Phrase',element:'kbd'},{name:'Sample Text',element:'samp'},{name:'Variable',element:'var'},{name:'Deleted Text',element:'del'},{name:'Inserted Text',element:'ins'},{name:'Cited Work',element:'cite'},{name:'Inline Quotation',element:'q'},{name:'Language: RTL',element:'span',attributes:{dir:'rtl'}},{name:'Language: LTR',element:'span',attributes:{dir:'ltr'}},{name:'Image on Left',element:'img',attributes:{style:'padding: 5px; margin-right: 5px',border:'2',align:'left'}},{name:'Image on Right',element:'img',attributes:{style:'padding: 5px; margin-left: 5px',border:'2',align:'right'}},{name:'Borderless Table',element:'table',styles:{'border-style':'hidden','background-color':'#E6E6FA'}},{name:'Square Bulleted List',element:'ul',styles:{'list-style-type':'square'}}]);
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/stylesheetparser/plugin.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/stylesheetparser/plugin.js
index e773bf6..ac8ac12 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/stylesheetparser/plugin.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/stylesheetparser/plugin.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-(function(){function a(c,d,e){var f=c.join(' ');f=f.replace(/(,|>|\+|~)/g,' ');f=f.replace(/\[[^\]]*/g,'');f=f.replace(/#[^\s]*/g,'');f=f.replace(/\:{1,2}[^\s]*/g,'');f=f.replace(/\s+/g,' ');var g=f.split(' '),h=[];for(var i=0;i<g.length;i++){var j=g[i];if(e.test(j)&&!d.test(j))if(CKEDITOR.tools.indexOf(h,j)==-1)h.push(j);}return h;};function b(c,d,e){var f=[],g=[],h;for(h=0;h<c.styleSheets.length;h++){var i=c.styleSheets[h],j=i.ownerNode||i.owningElement;if(j.getAttribute('data-cke-temp'))continue;if(i.href&&i.href.substr(0,9)=='chrome://')continue;var k=i.cssRules||i.rules;for(var l=0;l<k.length;l++)g.push(k[l].selectorText);}var m=a(g,d,e);for(h=0;h<m.length;h++){var n=m[h].split('.'),o=n[0].toLowerCase(),p=n[1];f.push({name:o+'.'+p,element:o,attributes:{'class':p}});}return f;};CKEDITOR.plugins.add('stylesheetparser',{requires:['styles'],onLoad:function(){var c=CKEDITOR.editor.prototype;c.getStylesSet=CKEDITOR.tools.override(c.getStylesSet,function(d){return function(e){var f=this;d.call(this,function(g){var h=f.config.stylesheetParser_skipSelectors||/(^body\.|^\.)/i,i=f.config.stylesheetParser_validSelectors||/\w+\.\w+/;e(f._.stylesDefinitions=g.concat(b(f.document.$,h,i)));});};});}});})();
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function(){function a(c,d,e){var f=c.join(' ');f=f.replace(/(,|>|\+|~)/g,' ');f=f.replace(/\[[^\]]*/g,'');f=f.replace(/#[^\s]*/g,'');f=f.replace(/\:{1,2}[^\s]*/g,'');f=f.replace(/\s+/g,' ');var g=f.split(' '),h=[];for(var i=0;i<g.length;i++){var j=g[i];if(e.test(j)&&!d.test(j))if(CKEDITOR.tools.indexOf(h,j)==-1)h.push(j);}return h;};function b(c,d,e){var f=[],g=[],h;for(h=0;h<c.styleSheets.length;h++){var i=c.styleSheets[h],j=i.ownerNode||i.owningElement;if(j.getAttribute('data-cke-temp'))continue;if(i.href&&i.href.substr(0,9)=='chrome://')continue;var k=i.cssRules||i.rules;for(var l=0;l<k.length;l++)g.push(k[l].selectorText);}var m=a(g,d,e);for(h=0;h<m.length;h++){var n=m[h].split('.'),o=n[0].toLowerCase(),p=n[1];f.push({name:o+'.'+p,element:o,attributes:{'class':p}});}return f;};CKEDITOR.plugins.add('stylesheetparser',{requires:['styles'],onLoad:function(){var c=CKEDITOR.editor.prototype;c.getStylesSet=CKEDITOR.tools.override(c.getStylesSet,function(d){return function(e){var f=this;d.call(this,function(g){var h=f.config.stylesheetParser_skipSelectors||/(^body\.|^\.)/i,i=f.config.stylesheetParser_validSelectors||/\w+\.\w+/;e(f._.stylesDefinitions=g.concat(b(f.document.$,h,i)));});};});}});})();
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/table/dialogs/table.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/table/dialogs/table.js
index 6c48c20..cf72afa 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/table/dialogs/table.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/table/dialogs/table.js
@@ -1,9 +1,9 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-(function(){var a=CKEDITOR.tools.cssLength,b=function(f){var g=this.id;if(!f.info)f.info={};f.info[g]=this.getValue();};function c(f){var g=0,h=0;for(var i=0,j,k=f.$.rows.length;i<k;i++){j=f.$.rows[i],g=0;for(var l=0,m,n=j.cells.length;l<n;l++){m=j.cells[l];g+=m.colSpan;}g>h&&(h=g);}return h;};function d(f){return function(){var g=this.getValue(),h=!!(CKEDITOR.dialog.validate.integer()(g)&&g>0);if(!h){alert(f);this.select();}return h;};};function e(f,g){var h=function(j){return new CKEDITOR.dom.element(j,f.document);},i=f.plugins.dialogadvtab;return{title:f.lang.table.title,minWidth:310,minHeight:CKEDITOR.env.ie?310:280,onLoad:function(){var j=this,k=j.getContentElement('advanced','advStyles');if(k)k.on('change',function(l){var m=this.getStyle('width',''),n=j.getContentElement('info','txtWidth');n&&n.setValue(m,true);var o=this.getStyle('height',''),p=j.getContentElement('info','txtHeight');p&&p.setValue(o,true);});},onShow:function(){var r=this;var j=f.getSelection(),k=j.getRanges(),l=null,m=r.getContentElement('info','txtRows'),n=r.getContentElement('info','txtCols'),o=r.getContentElement('info','txtWidth'),p=r.getContentElement('info','txtHeight');if(g=='tableProperties'){if(l=j.getSelectedElement())l=l.getAscendant('table',true);else if(k.length>0){if(CKEDITOR.env.webkit)k[0].shrink(CKEDITOR.NODE_ELEMENT);var q=k[0].getCommonAncestor(true);l=q.getAscendant('table',true);}r._.selectedElement=l;}if(l){r.setupContent(l);m&&m.disable();n&&n.disable();}else{m&&m.enable();n&&n.enable();}o&&o.onChange();p&&p.onChange();},onOk:function(){var j=f.getSelection(),k=this._.selectedElement&&j.createBookmarks(),l=this._.selectedElement||h('table'),m=this,n={};this.commitContent(n,l);if(n.info){var o=n.info;if(!this._.selectedElement){var p=l.append(h('tbody')),q=parseInt(o.txtRows,10)||0,r=parseInt(o.txtCols,10)||0;for(var s=0;s<q;s++){var t=p.append(h('tr'));for(var u=0;u<r;u++){var v=t.append(h('td'));if(!CKEDITOR.env.ie)v.append(h('br'));}}}var w=o.selHeaders;if(!l.$.tHead&&(w=='row'||w=='both')){var x=new CKEDITOR.dom.element(l.$.createTHead());p=l.getElementsByTag('tbody').getItem(0);var y=p.getElementsByTag('tr').getItem(0);for(s=0;s<y.getChildCount();s++){var z=y.getChild(s);if(z.type==CKEDITOR.NODE_ELEMENT&&!z.data('cke-bookmark')){z.renameNode('th');z.setAttribute('scope','col');}}x.append(y.remove());}if(l.$.tHead!==null&&!(w=='row'||w=='both')){x=new CKEDITOR.dom.element(l.$.tHead);p=l.getElementsByTag('tbody').getItem(0);var A=p.getFirst();while(x.getChildCount()>0){y=x.getFirst();
-for(s=0;s<y.getChildCount();s++){var B=y.getChild(s);if(B.type==CKEDITOR.NODE_ELEMENT){B.renameNode('td');B.removeAttribute('scope');}}y.insertBefore(A);}x.remove();}if(!this.hasColumnHeaders&&(w=='col'||w=='both'))for(t=0;t<l.$.rows.length;t++){B=new CKEDITOR.dom.element(l.$.rows[t].cells[0]);B.renameNode('th');B.setAttribute('scope','row');}if(this.hasColumnHeaders&&!(w=='col'||w=='both'))for(s=0;s<l.$.rows.length;s++){t=new CKEDITOR.dom.element(l.$.rows[s]);if(t.getParent().getName()=='tbody'){B=new CKEDITOR.dom.element(t.$.cells[0]);B.renameNode('td');B.removeAttribute('scope');}}o.txtHeight?l.setStyle('height',o.txtHeight):l.removeStyle('height');o.txtWidth?l.setStyle('width',o.txtWidth):l.removeStyle('width');if(!l.getAttribute('style'))l.removeAttribute('style');}if(!this._.selectedElement){f.insertElement(l);setTimeout(function(){var C=new CKEDITOR.dom.element(l.$.rows[0].cells[0]),D=new CKEDITOR.dom.range(f.document);D.moveToPosition(C,CKEDITOR.POSITION_AFTER_START);D.select(1);},0);}else try{j.selectBookmarks(k);}catch(C){}},contents:[{id:'info',label:f.lang.table.title,elements:[{type:'hbox',widths:[null,null],styles:['vertical-align:top'],children:[{type:'vbox',padding:0,children:[{type:'text',id:'txtRows','default':3,label:f.lang.table.rows,required:true,controlStyle:'width:5em',validate:d(f.lang.table.invalidRows),setup:function(j){this.setValue(j.$.rows.length);},commit:b},{type:'text',id:'txtCols','default':2,label:f.lang.table.columns,required:true,controlStyle:'width:5em',validate:d(f.lang.table.invalidCols),setup:function(j){this.setValue(c(j));},commit:b},{type:'html',html:' '},{type:'select',id:'selHeaders','default':'',label:f.lang.table.headers,items:[[f.lang.table.headersNone,''],[f.lang.table.headersRow,'row'],[f.lang.table.headersColumn,'col'],[f.lang.table.headersBoth,'both']],setup:function(j){var k=this.getDialog();k.hasColumnHeaders=true;for(var l=0;l<j.$.rows.length;l++){var m=j.$.rows[l].cells[0];if(m&&m.nodeName.toLowerCase()!='th'){k.hasColumnHeaders=false;break;}}if(j.$.tHead!==null)this.setValue(k.hasColumnHeaders?'both':'row');else this.setValue(k.hasColumnHeaders?'col':'');},commit:b},{type:'text',id:'txtBorder','default':1,label:f.lang.table.border,controlStyle:'width:3em',validate:CKEDITOR.dialog.validate.number(f.lang.table.invalidBorder),setup:function(j){this.setValue(j.getAttribute('border')||'');},commit:function(j,k){if(this.getValue())k.setAttribute('border',this.getValue());else k.removeAttribute('border');
-}},{id:'cmbAlign',type:'select','default':'',label:f.lang.common.align,items:[[f.lang.common.notSet,''],[f.lang.common.alignLeft,'left'],[f.lang.common.alignCenter,'center'],[f.lang.common.alignRight,'right']],setup:function(j){this.setValue(j.getAttribute('align')||'');},commit:function(j,k){if(this.getValue())k.setAttribute('align',this.getValue());else k.removeAttribute('align');}}]},{type:'vbox',padding:0,children:[{type:'hbox',widths:['5em'],children:[{type:'text',id:'txtWidth',controlStyle:'width:5em',label:f.lang.common.width,title:f.lang.common.cssLengthTooltip,'default':500,getValue:a,validate:CKEDITOR.dialog.validate.cssLength(f.lang.common.invalidCssLength.replace('%1',f.lang.common.width)),onChange:function(){var j=this.getDialog().getContentElement('advanced','advStyles');j&&j.updateStyle('width',this.getValue());},setup:function(j){var k=j.getStyle('width');k&&this.setValue(k);},commit:b}]},{type:'hbox',widths:['5em'],children:[{type:'text',id:'txtHeight',controlStyle:'width:5em',label:f.lang.common.height,title:f.lang.common.cssLengthTooltip,'default':'',getValue:a,validate:CKEDITOR.dialog.validate.cssLength(f.lang.common.invalidCssLength.replace('%1',f.lang.common.height)),onChange:function(){var j=this.getDialog().getContentElement('advanced','advStyles');j&&j.updateStyle('height',this.getValue());},setup:function(j){var k=j.getStyle('height');k&&this.setValue(k);},commit:b}]},{type:'html',html:' '},{type:'text',id:'txtCellSpace',controlStyle:'width:3em',label:f.lang.table.cellSpace,'default':1,validate:CKEDITOR.dialog.validate.number(f.lang.table.invalidCellSpacing),setup:function(j){this.setValue(j.getAttribute('cellSpacing')||'');},commit:function(j,k){if(this.getValue())k.setAttribute('cellSpacing',this.getValue());else k.removeAttribute('cellSpacing');}},{type:'text',id:'txtCellPad',controlStyle:'width:3em',label:f.lang.table.cellPad,'default':1,validate:CKEDITOR.dialog.validate.number(f.lang.table.invalidCellPadding),setup:function(j){this.setValue(j.getAttribute('cellPadding')||'');},commit:function(j,k){if(this.getValue())k.setAttribute('cellPadding',this.getValue());else k.removeAttribute('cellPadding');}}]}]},{type:'html',align:'right',html:''},{type:'vbox',padding:0,children:[{type:'text',id:'txtCaption',label:f.lang.table.caption,setup:function(j){var n=this;n.enable();var k=j.getElementsByTag('caption');if(k.count()>0){var l=k.getItem(0),m=l.getFirst(CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_ELEMENT));if(m&&!m.equals(l.getBogus())){n.disable();
-n.setValue(l.getText());return;}l=CKEDITOR.tools.trim(l.getText());n.setValue(l);}},commit:function(j,k){if(!this.isEnabled())return;var l=this.getValue(),m=k.getElementsByTag('caption');if(l){if(m.count()>0){m=m.getItem(0);m.setHtml('');}else{m=new CKEDITOR.dom.element('caption',f.document);if(k.getChildCount())m.insertBefore(k.getFirst());else m.appendTo(k);}m.append(new CKEDITOR.dom.text(l,f.document));}else if(m.count()>0)for(var n=m.count()-1;n>=0;n--)m.getItem(n).remove();}},{type:'text',id:'txtSummary',label:f.lang.table.summary,setup:function(j){this.setValue(j.getAttribute('summary')||'');},commit:function(j,k){if(this.getValue())k.setAttribute('summary',this.getValue());else k.removeAttribute('summary');}}]}]},i&&i.createAdvancedTab(f)]};};CKEDITOR.dialog.add('table',function(f){return e(f,'table');});CKEDITOR.dialog.add('tableProperties',function(f){return e(f,'tableProperties');});})();
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function(){var a=CKEDITOR.tools.cssLength,b=function(f){var g=this.id;if(!f.info)f.info={};f.info[g]=this.getValue();};function c(f){var g=0,h=0;for(var i=0,j,k=f.$.rows.length;i<k;i++){j=f.$.rows[i],g=0;for(var l=0,m,n=j.cells.length;l<n;l++){m=j.cells[l];g+=m.colSpan;}g>h&&(h=g);}return h;};function d(f){return function(){var g=this.getValue(),h=!!(CKEDITOR.dialog.validate.integer()(g)&&g>0);if(!h){alert(f);this.select();}return h;};};function e(f,g){var h=function(j){return new CKEDITOR.dom.element(j,f.document);},i=f.plugins.dialogadvtab;return{title:f.lang.table.title,minWidth:310,minHeight:CKEDITOR.env.ie?310:280,onLoad:function(){var j=this,k=j.getContentElement('advanced','advStyles');if(k)k.on('change',function(l){var m=this.getStyle('width',''),n=j.getContentElement('info','txtWidth');n&&n.setValue(m,true);var o=this.getStyle('height',''),p=j.getContentElement('info','txtHeight');p&&p.setValue(o,true);});},onShow:function(){var r=this;var j=f.getSelection(),k=j.getRanges(),l=null,m=r.getContentElement('info','txtRows'),n=r.getContentElement('info','txtCols'),o=r.getContentElement('info','txtWidth'),p=r.getContentElement('info','txtHeight');if(g=='tableProperties'){if(l=j.getSelectedElement())l=l.getAscendant('table',true);else if(k.length>0){if(CKEDITOR.env.webkit)k[0].shrink(CKEDITOR.NODE_ELEMENT);var q=k[0].getCommonAncestor(true);l=q.getAscendant('table',true);}r._.selectedElement=l;}if(l){r.setupContent(l);m&&m.disable();n&&n.disable();}else{m&&m.enable();n&&n.enable();}o&&o.onChange();p&&p.onChange();},onOk:function(){var j=f.getSelection(),k=this._.selectedElement&&j.createBookmarks(),l=this._.selectedElement||h('table'),m=this,n={};this.commitContent(n,l);if(n.info){var o=n.info;if(!this._.selectedElement){var p=l.append(h('tbody')),q=parseInt(o.txtRows,10)||0,r=parseInt(o.txtCols,10)||0;for(var s=0;s<q;s++){var t=p.append(h('tr'));for(var u=0;u<r;u++){var v=t.append(h('td'));if(!CKEDITOR.env.ie)v.append(h('br'));}}}var w=o.selHeaders;if(!l.$.tHead&&(w=='row'||w=='both')){var x=new CKEDITOR.dom.element(l.$.createTHead());p=l.getElementsByTag('tbody').getItem(0);var y=p.getElementsByTag('tr').getItem(0);for(s=0;s<y.getChildCount();s++){var z=y.getChild(s);if(z.type==CKEDITOR.NODE_ELEMENT&&!z.data('cke-bookmark')){z.renameNode('th');z.setAttribute('scope','col');}}x.append(y.remove());}if(l.$.tHead!==null&&!(w=='row'||w=='both')){x=new CKEDITOR.dom.element(l.$.tHead);p=l.getElementsByTag('tbody').getItem(0);var A=p.getFirst();while(x.getChildCount()>0){y=x.getFirst();
+for(s=0;s<y.getChildCount();s++){var B=y.getChild(s);if(B.type==CKEDITOR.NODE_ELEMENT){B.renameNode('td');B.removeAttribute('scope');}}y.insertBefore(A);}x.remove();}if(!this.hasColumnHeaders&&(w=='col'||w=='both'))for(t=0;t<l.$.rows.length;t++){B=new CKEDITOR.dom.element(l.$.rows[t].cells[0]);B.renameNode('th');B.setAttribute('scope','row');}if(this.hasColumnHeaders&&!(w=='col'||w=='both'))for(s=0;s<l.$.rows.length;s++){t=new CKEDITOR.dom.element(l.$.rows[s]);if(t.getParent().getName()=='tbody'){B=new CKEDITOR.dom.element(t.$.cells[0]);B.renameNode('td');B.removeAttribute('scope');}}o.txtHeight?l.setStyle('height',o.txtHeight):l.removeStyle('height');o.txtWidth?l.setStyle('width',o.txtWidth):l.removeStyle('width');if(!l.getAttribute('style'))l.removeAttribute('style');}if(!this._.selectedElement){f.insertElement(l);setTimeout(function(){var C=new CKEDITOR.dom.element(l.$.rows[0].cells[0]),D=new CKEDITOR.dom.range(f.document);D.moveToPosition(C,CKEDITOR.POSITION_AFTER_START);D.select(1);},0);}else try{j.selectBookmarks(k);}catch(C){}},contents:[{id:'info',label:f.lang.table.title,elements:[{type:'hbox',widths:[null,null],styles:['vertical-align:top'],children:[{type:'vbox',padding:0,children:[{type:'text',id:'txtRows','default':3,label:f.lang.table.rows,required:true,controlStyle:'width:5em',validate:d(f.lang.table.invalidRows),setup:function(j){this.setValue(j.$.rows.length);},commit:b},{type:'text',id:'txtCols','default':2,label:f.lang.table.columns,required:true,controlStyle:'width:5em',validate:d(f.lang.table.invalidCols),setup:function(j){this.setValue(c(j));},commit:b},{type:'html',html:' '},{type:'select',id:'selHeaders','default':'',label:f.lang.table.headers,items:[[f.lang.table.headersNone,''],[f.lang.table.headersRow,'row'],[f.lang.table.headersColumn,'col'],[f.lang.table.headersBoth,'both']],setup:function(j){var k=this.getDialog();k.hasColumnHeaders=true;for(var l=0;l<j.$.rows.length;l++){var m=j.$.rows[l].cells[0];if(m&&m.nodeName.toLowerCase()!='th'){k.hasColumnHeaders=false;break;}}if(j.$.tHead!==null)this.setValue(k.hasColumnHeaders?'both':'row');else this.setValue(k.hasColumnHeaders?'col':'');},commit:b},{type:'text',id:'txtBorder','default':1,label:f.lang.table.border,controlStyle:'width:3em',validate:CKEDITOR.dialog.validate.number(f.lang.table.invalidBorder),setup:function(j){this.setValue(j.getAttribute('border')||'');},commit:function(j,k){if(this.getValue())k.setAttribute('border',this.getValue());else k.removeAttribute('border');
+}},{id:'cmbAlign',type:'select','default':'',label:f.lang.common.align,items:[[f.lang.common.notSet,''],[f.lang.common.alignLeft,'left'],[f.lang.common.alignCenter,'center'],[f.lang.common.alignRight,'right']],setup:function(j){this.setValue(j.getAttribute('align')||'');},commit:function(j,k){if(this.getValue())k.setAttribute('align',this.getValue());else k.removeAttribute('align');}}]},{type:'vbox',padding:0,children:[{type:'hbox',widths:['5em'],children:[{type:'text',id:'txtWidth',controlStyle:'width:5em',label:f.lang.common.width,title:f.lang.common.cssLengthTooltip,'default':500,getValue:a,validate:CKEDITOR.dialog.validate.cssLength(f.lang.common.invalidCssLength.replace('%1',f.lang.common.width)),onChange:function(){var j=this.getDialog().getContentElement('advanced','advStyles');j&&j.updateStyle('width',this.getValue());},setup:function(j){var k=j.getStyle('width');k&&this.setValue(k);},commit:b}]},{type:'hbox',widths:['5em'],children:[{type:'text',id:'txtHeight',controlStyle:'width:5em',label:f.lang.common.height,title:f.lang.common.cssLengthTooltip,'default':'',getValue:a,validate:CKEDITOR.dialog.validate.cssLength(f.lang.common.invalidCssLength.replace('%1',f.lang.common.height)),onChange:function(){var j=this.getDialog().getContentElement('advanced','advStyles');j&&j.updateStyle('height',this.getValue());},setup:function(j){var k=j.getStyle('height');k&&this.setValue(k);},commit:b}]},{type:'html',html:' '},{type:'text',id:'txtCellSpace',controlStyle:'width:3em',label:f.lang.table.cellSpace,'default':1,validate:CKEDITOR.dialog.validate.number(f.lang.table.invalidCellSpacing),setup:function(j){this.setValue(j.getAttribute('cellSpacing')||'');},commit:function(j,k){if(this.getValue())k.setAttribute('cellSpacing',this.getValue());else k.removeAttribute('cellSpacing');}},{type:'text',id:'txtCellPad',controlStyle:'width:3em',label:f.lang.table.cellPad,'default':1,validate:CKEDITOR.dialog.validate.number(f.lang.table.invalidCellPadding),setup:function(j){this.setValue(j.getAttribute('cellPadding')||'');},commit:function(j,k){if(this.getValue())k.setAttribute('cellPadding',this.getValue());else k.removeAttribute('cellPadding');}}]}]},{type:'html',align:'right',html:''},{type:'vbox',padding:0,children:[{type:'text',id:'txtCaption',label:f.lang.table.caption,setup:function(j){var n=this;n.enable();var k=j.getElementsByTag('caption');if(k.count()>0){var l=k.getItem(0),m=l.getFirst(CKEDITOR.dom.walker.nodeType(CKEDITOR.NODE_ELEMENT));if(m&&!m.equals(l.getBogus())){n.disable();
+n.setValue(l.getText());return;}l=CKEDITOR.tools.trim(l.getText());n.setValue(l);}},commit:function(j,k){if(!this.isEnabled())return;var l=this.getValue(),m=k.getElementsByTag('caption');if(l){if(m.count()>0){m=m.getItem(0);m.setHtml('');}else{m=new CKEDITOR.dom.element('caption',f.document);if(k.getChildCount())m.insertBefore(k.getFirst());else m.appendTo(k);}m.append(new CKEDITOR.dom.text(l,f.document));}else if(m.count()>0)for(var n=m.count()-1;n>=0;n--)m.getItem(n).remove();}},{type:'text',id:'txtSummary',label:f.lang.table.summary,setup:function(j){this.setValue(j.getAttribute('summary')||'');},commit:function(j,k){if(this.getValue())k.setAttribute('summary',this.getValue());else k.removeAttribute('summary');}}]}]},i&&i.createAdvancedTab(f)]};};CKEDITOR.dialog.add('table',function(f){return e(f,'table');});CKEDITOR.dialog.add('tableProperties',function(f){return e(f,'tableProperties');});})();
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/tableresize/plugin.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/tableresize/plugin.js
index a787b46..9f05719 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/tableresize/plugin.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/tableresize/plugin.js
@@ -1,7 +1,7 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-(function(){var a=CKEDITOR.tools.cssLength,b=CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks||CKEDITOR.env.version<7);function c(k){return CKEDITOR.env.ie?k.$.clientWidth:parseInt(k.getComputedStyle('width'),10);};function d(k,l){var m=k.getComputedStyle('border-'+l+'-width'),n={thin:'0px',medium:'1px',thick:'2px'};if(m.indexOf('px')<0)if(m in n&&k.getComputedStyle('border-style')!='none')m=n[m];else m=0;return parseInt(m,10);};function e(k){var l=k.$.rows,m=0,n,o,p;for(var q=0,r=l.length;q<r;q++){p=l[q];n=p.cells.length;if(n>m){m=n;o=p;}}return o;};function f(k){var l=[],m=-1,n=k.getComputedStyle('direction')=='rtl',o=e(k),p=new CKEDITOR.dom.element(k.$.tBodies[0]),q=p.getDocumentPosition();for(var r=0,s=o.cells.length;r<s;r++){var t=new CKEDITOR.dom.element(o.cells[r]),u=o.cells[r+1]&&new CKEDITOR.dom.element(o.cells[r+1]);m+=t.$.colSpan||1;var v,w,x,y=t.getDocumentPosition().x;n?w=y+d(t,'left'):v=y+t.$.offsetWidth-d(t,'right');if(u){y=u.getDocumentPosition().x;n?v=y+u.$.offsetWidth-d(u,'right'):w=y+d(u,'left');}else{y=k.getDocumentPosition().x;n?v=y:w=y+k.$.offsetWidth;}x=Math.max(w-v,3);l.push({table:k,index:m,x:v,y:q.y,width:x,height:p.$.offsetHeight,rtl:n});}return l;};function g(k,l){for(var m=0,n=k.length;m<n;m++){var o=k[m];if(l>=o.x&&l<=o.x+o.width)return o;}return null;};function h(k){(k.data||k).preventDefault();};function i(k){var l,m,n,o,p,q,r,s,t,u;function v(){l=null;q=0;o=0;m.removeListener('mouseup',A);n.removeListener('mousedown',z);n.removeListener('mousemove',B);m.getBody().setStyle('cursor','auto');b?n.remove():n.hide();};function w(){var D=l.index,E=CKEDITOR.tools.buildTableMap(l.table),F=[],G=[],H=Number.MAX_VALUE,I=H,J=l.rtl;for(var K=0,L=E.length;K<L;K++){var M=E[K],N=M[D+(J?1:0)],O=M[D+(J?0:1)];N=N&&new CKEDITOR.dom.element(N);O=O&&new CKEDITOR.dom.element(O);if(!N||!O||!N.equals(O)){N&&(H=Math.min(H,c(N)));O&&(I=Math.min(I,c(O)));F.push(N);G.push(O);}}r=F;s=G;t=l.x-H;u=l.x+I;n.setOpacity(0.5);p=parseInt(n.getStyle('left'),10);q=0;o=1;n.on('mousemove',B);m.on('dragstart',h);};function x(){o=0;n.setOpacity(0);q&&y();var D=l.table;setTimeout(function(){D.removeCustomData('_cke_table_pillars');},0);m.removeListener('dragstart',h);};function y(){var D=l.rtl,E=D?s.length:r.length;for(var F=0;F<E;F++){var G=r[F],H=s[F],I=l.table;CKEDITOR.tools.setTimeout(function(J,K,L,M,N,O){J&&J.setStyle('width',a(Math.max(K+O,0)));L&&L.setStyle('width',a(Math.max(M-O,0)));if(N)I.setStyle('width',a(N+O*(D?-1:1)));},0,this,[G,G&&c(G),H,H&&c(H),(!G||!H)&&c(I)+d(I,'left')+d(I,'right'),q]);
-}};function z(D){h(D);w();m.on('mouseup',A,this);};function A(D){D.removeListener();x();};function B(D){C(D.data.$.clientX);};m=k.document;n=CKEDITOR.dom.element.createFromHtml('<div data-cke-temp=1 contenteditable=false unselectable=on style="position:absolute;cursor:col-resize;filter:alpha(opacity=0);opacity:0;padding:0;background-color:#004;background-image:none;border:0px none;z-index:10"></div>',m);if(!b)m.getDocumentElement().append(n);this.attachTo=function(D){if(o)return;if(b){m.getBody().append(n);q=0;}l=D;n.setStyles({width:a(D.width),height:a(D.height),left:a(D.x),top:a(D.y)});b&&n.setOpacity(0.25);n.on('mousedown',z,this);m.getBody().setStyle('cursor','col-resize');n.show();};var C=this.move=function(D){if(!l)return 0;if(!o&&(D<l.x||D>l.x+l.width)){v();return 0;}var E=D-Math.round(n.$.offsetWidth/2);if(o){if(E==t||E==u)return 1;E=Math.max(E,t);E=Math.min(E,u);q=E-p;}n.setStyle('left',a(E));return 1;};};function j(k){var l=k.data.getTarget();if(k.name=='mouseout'){if(!l.is('table'))return;var m=new CKEDITOR.dom.element(k.data.$.relatedTarget||k.data.$.toElement);while(m&&m.$&&!m.equals(l)&&!m.is('body'))m=m.getParent();if(!m||m.equals(l))return;}l.getAscendant('table',1).removeCustomData('_cke_table_pillars');k.removeListener();};CKEDITOR.plugins.add('tableresize',{requires:['tabletools'],init:function(k){k.on('contentDom',function(){var l;k.document.getBody().on('mousemove',function(m){m=m.data;if(l&&l.move(m.$.clientX)){h(m);return;}var n=m.getTarget(),o,p;if(!n.is('table')&&!n.getAscendant('tbody',1))return;o=n.getAscendant('table',1);if(!(p=o.getCustomData('_cke_table_pillars'))){o.setCustomData('_cke_table_pillars',p=f(o));o.on('mouseout',j);o.on('mousedown',j);}var q=g(p,m.$.clientX);if(q){!l&&(l=new i(k));l.attachTo(q);}});});}});})();
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function(){var a=CKEDITOR.tools.cssLength,b=CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks||CKEDITOR.env.version<7);function c(k){return CKEDITOR.env.ie?k.$.clientWidth:parseInt(k.getComputedStyle('width'),10);};function d(k,l){var m=k.getComputedStyle('border-'+l+'-width'),n={thin:'0px',medium:'1px',thick:'2px'};if(m.indexOf('px')<0)if(m in n&&k.getComputedStyle('border-style')!='none')m=n[m];else m=0;return parseInt(m,10);};function e(k){var l=k.$.rows,m=0,n,o,p;for(var q=0,r=l.length;q<r;q++){p=l[q];n=p.cells.length;if(n>m){m=n;o=p;}}return o;};function f(k){var l=[],m=-1,n=k.getComputedStyle('direction')=='rtl',o=e(k),p=new CKEDITOR.dom.element(k.$.tBodies[0]),q=p.getDocumentPosition();for(var r=0,s=o.cells.length;r<s;r++){var t=new CKEDITOR.dom.element(o.cells[r]),u=o.cells[r+1]&&new CKEDITOR.dom.element(o.cells[r+1]);m+=t.$.colSpan||1;var v,w,x,y=t.getDocumentPosition().x;n?w=y+d(t,'left'):v=y+t.$.offsetWidth-d(t,'right');if(u){y=u.getDocumentPosition().x;n?v=y+u.$.offsetWidth-d(u,'right'):w=y+d(u,'left');}else{y=k.getDocumentPosition().x;n?v=y:w=y+k.$.offsetWidth;}x=Math.max(w-v,3);l.push({table:k,index:m,x:v,y:q.y,width:x,height:p.$.offsetHeight,rtl:n});}return l;};function g(k,l){for(var m=0,n=k.length;m<n;m++){var o=k[m];if(l>=o.x&&l<=o.x+o.width)return o;}return null;};function h(k){(k.data||k).preventDefault();};function i(k){var l,m,n,o,p,q,r,s,t,u;function v(){l=null;q=0;o=0;m.removeListener('mouseup',A);n.removeListener('mousedown',z);n.removeListener('mousemove',B);m.getBody().setStyle('cursor','auto');b?n.remove():n.hide();};function w(){var D=l.index,E=CKEDITOR.tools.buildTableMap(l.table),F=[],G=[],H=Number.MAX_VALUE,I=H,J=l.rtl;for(var K=0,L=E.length;K<L;K++){var M=E[K],N=M[D+(J?1:0)],O=M[D+(J?0:1)];N=N&&new CKEDITOR.dom.element(N);O=O&&new CKEDITOR.dom.element(O);if(!N||!O||!N.equals(O)){N&&(H=Math.min(H,c(N)));O&&(I=Math.min(I,c(O)));F.push(N);G.push(O);}}r=F;s=G;t=l.x-H;u=l.x+I;n.setOpacity(0.5);p=parseInt(n.getStyle('left'),10);q=0;o=1;n.on('mousemove',B);m.on('dragstart',h);};function x(){o=0;n.setOpacity(0);q&&y();var D=l.table;setTimeout(function(){D.removeCustomData('_cke_table_pillars');},0);m.removeListener('dragstart',h);};function y(){var D=l.rtl,E=D?s.length:r.length;for(var F=0;F<E;F++){var G=r[F],H=s[F],I=l.table;CKEDITOR.tools.setTimeout(function(J,K,L,M,N,O){J&&J.setStyle('width',a(Math.max(K+O,0)));L&&L.setStyle('width',a(Math.max(M-O,0)));if(N)I.setStyle('width',a(N+O*(D?-1:1)));},0,this,[G,G&&c(G),H,H&&c(H),(!G||!H)&&c(I)+d(I,'left')+d(I,'right'),q]);
+}};function z(D){h(D);w();m.on('mouseup',A,this);};function A(D){D.removeListener();x();};function B(D){C(D.data.$.clientX);};m=k.document;n=CKEDITOR.dom.element.createFromHtml('<div data-cke-temp=1 contenteditable=false unselectable=on style="position:absolute;cursor:col-resize;filter:alpha(opacity=0);opacity:0;padding:0;background-color:#004;background-image:none;border:0px none;z-index:10"></div>',m);if(!b)m.getDocumentElement().append(n);this.attachTo=function(D){if(o)return;if(b){m.getBody().append(n);q=0;}l=D;n.setStyles({width:a(D.width),height:a(D.height),left:a(D.x),top:a(D.y)});b&&n.setOpacity(0.25);n.on('mousedown',z,this);m.getBody().setStyle('cursor','col-resize');n.show();};var C=this.move=function(D){if(!l)return 0;if(!o&&(D<l.x||D>l.x+l.width)){v();return 0;}var E=D-Math.round(n.$.offsetWidth/2);if(o){if(E==t||E==u)return 1;E=Math.max(E,t);E=Math.min(E,u);q=E-p;}n.setStyle('left',a(E));return 1;};};function j(k){var l=k.data.getTarget();if(k.name=='mouseout'){if(!l.is('table'))return;var m=new CKEDITOR.dom.element(k.data.$.relatedTarget||k.data.$.toElement);while(m&&m.$&&!m.equals(l)&&!m.is('body'))m=m.getParent();if(!m||m.equals(l))return;}l.getAscendant('table',1).removeCustomData('_cke_table_pillars');k.removeListener();};CKEDITOR.plugins.add('tableresize',{requires:['tabletools'],init:function(k){k.on('contentDom',function(){var l;k.document.getBody().on('mousemove',function(m){m=m.data;if(l&&l.move(m.$.clientX)){h(m);return;}var n=m.getTarget(),o,p;if(!n.is('table')&&!n.getAscendant('tbody',1))return;o=n.getAscendant('table',1);if(!(p=o.getCustomData('_cke_table_pillars'))){o.setCustomData('_cke_table_pillars',p=f(o));o.on('mouseout',j);o.on('mousedown',j);}var q=g(p,m.$.clientX);if(q){!l&&(l=new i(k));l.attachTo(q);}});});}});})();
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/tabletools/dialogs/tableCell.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/tabletools/dialogs/tableCell.js
index 7ea2004..4d8e34d 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/tabletools/dialogs/tableCell.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/tabletools/dialogs/tableCell.js
@@ -1,8 +1,8 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.dialog.add('cellProperties',function(a){var b=a.lang.table,c=b.cell,d=a.lang.common,e=CKEDITOR.dialog.validate,f=/^(\d+(?:\.\d+)?)(px|%)$/,g=/^(\d+(?:\.\d+)?)px$/,h=CKEDITOR.tools.bind,i={type:'html',html:' '},j=a.lang.dir=='rtl';function k(l,m){var n=function(){var r=this;p(r);m(r,r._.parentDialog);r._.parentDialog.changeFocus();},o=function(){p(this);this._.parentDialog.changeFocus();},p=function(r){r.removeListener('ok',n);r.removeListener('cancel',o);},q=function(r){r.on('ok',n);r.on('cancel',o);};a.execCommand(l);if(a._.storedDialogs.colordialog)q(a._.storedDialogs.colordialog);else CKEDITOR.on('dialogDefinition',function(r){if(r.data.name!=l)return;var s=r.data.definition;r.removeListener();s.onLoad=CKEDITOR.tools.override(s.onLoad,function(t){return function(){q(this);s.onLoad=t;if(typeof t=='function')t.call(this);};});});};return{title:c.title,minWidth:CKEDITOR.env.ie&&CKEDITOR.env.quirks?450:410,minHeight:CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?230:220,contents:[{id:'info',label:c.title,accessKey:'I',elements:[{type:'hbox',widths:['40%','5%','40%'],children:[{type:'vbox',padding:0,children:[{type:'hbox',widths:['70%','30%'],children:[{type:'text',id:'width',width:'100px',label:d.width,validate:e.number(c.invalidWidth),onLoad:function(){var l=this.getDialog().getContentElement('info','widthType'),m=l.getElement(),n=this.getInputElement(),o=n.getAttribute('aria-labelledby');n.setAttribute('aria-labelledby',[o,m.$.id].join(' '));},setup:function(l){var m=parseInt(l.getAttribute('width'),10),n=parseInt(l.getStyle('width'),10);!isNaN(m)&&this.setValue(m);!isNaN(n)&&this.setValue(n);},commit:function(l){var m=parseInt(this.getValue(),10),n=this.getDialog().getValueOf('info','widthType');if(!isNaN(m))l.setStyle('width',m+n);else l.removeStyle('width');l.removeAttribute('width');},'default':''},{type:'select',id:'widthType',label:a.lang.table.widthUnit,labelStyle:'visibility:hidden','default':'px',items:[[b.widthPx,'px'],[b.widthPc,'%']],setup:function(l){var m=f.exec(l.getStyle('width')||l.getAttribute('width'));if(m)this.setValue(m[2]);}}]},{type:'hbox',widths:['70%','30%'],children:[{type:'text',id:'height',label:d.height,width:'100px','default':'',validate:e.number(c.invalidHeight),onLoad:function(){var l=this.getDialog().getContentElement('info','htmlHeightType'),m=l.getElement(),n=this.getInputElement(),o=n.getAttribute('aria-labelledby');n.setAttribute('aria-labelledby',[o,m.$.id].join(' '));},setup:function(l){var m=parseInt(l.getAttribute('height'),10),n=parseInt(l.getStyle('height'),10);
-!isNaN(m)&&this.setValue(m);!isNaN(n)&&this.setValue(n);},commit:function(l){var m=parseInt(this.getValue(),10);if(!isNaN(m))l.setStyle('height',CKEDITOR.tools.cssLength(m));else l.removeStyle('height');l.removeAttribute('height');}},{id:'htmlHeightType',type:'html',html:'<br />'+b.widthPx}]},i,{type:'select',id:'wordWrap',label:c.wordWrap,'default':'yes',items:[[c.yes,'yes'],[c.no,'no']],setup:function(l){var m=l.getAttribute('noWrap'),n=l.getStyle('white-space');if(n=='nowrap'||m)this.setValue('no');},commit:function(l){if(this.getValue()=='no')l.setStyle('white-space','nowrap');else l.removeStyle('white-space');l.removeAttribute('noWrap');}},i,{type:'select',id:'hAlign',label:c.hAlign,'default':'',items:[[d.notSet,''],[d.alignLeft,'left'],[d.alignCenter,'center'],[d.alignRight,'right']],setup:function(l){var m=l.getAttribute('align'),n=l.getStyle('text-align');this.setValue(n||m||'');},commit:function(l){var m=this.getValue();if(m)l.setStyle('text-align',m);else l.removeStyle('text-align');l.removeAttribute('align');}},{type:'select',id:'vAlign',label:c.vAlign,'default':'',items:[[d.notSet,''],[d.alignTop,'top'],[d.alignMiddle,'middle'],[d.alignBottom,'bottom'],[c.alignBaseline,'baseline']],setup:function(l){var m=l.getAttribute('vAlign'),n=l.getStyle('vertical-align');switch(n){case 'top':case 'middle':case 'bottom':case 'baseline':break;default:n='';}this.setValue(n||m||'');},commit:function(l){var m=this.getValue();if(m)l.setStyle('vertical-align',m);else l.removeStyle('vertical-align');l.removeAttribute('vAlign');}}]},i,{type:'vbox',padding:0,children:[{type:'select',id:'cellType',label:c.cellType,'default':'td',items:[[c.data,'td'],[c.header,'th']],setup:function(l){this.setValue(l.getName());},commit:function(l){l.renameNode(this.getValue());}},i,{type:'text',id:'rowSpan',label:c.rowSpan,'default':'',validate:e.integer(c.invalidRowSpan),setup:function(l){var m=parseInt(l.getAttribute('rowSpan'),10);if(m&&m!=1)this.setValue(m);},commit:function(l){var m=parseInt(this.getValue(),10);if(m&&m!=1)l.setAttribute('rowSpan',this.getValue());else l.removeAttribute('rowSpan');}},{type:'text',id:'colSpan',label:c.colSpan,'default':'',validate:e.integer(c.invalidColSpan),setup:function(l){var m=parseInt(l.getAttribute('colSpan'),10);if(m&&m!=1)this.setValue(m);},commit:function(l){var m=parseInt(this.getValue(),10);if(m&&m!=1)l.setAttribute('colSpan',this.getValue());else l.removeAttribute('colSpan');}},i,{type:'hbox',padding:0,widths:['60%','40%'],children:[{type:'text',id:'bgColor',label:c.bgColor,'default':'',setup:function(l){var m=l.getAttribute('bgColor'),n=l.getStyle('background-color');
-this.setValue(n||m);},commit:function(l){var m=this.getValue();if(m)l.setStyle('background-color',this.getValue());else l.removeStyle('background-color');l.removeAttribute('bgColor');}},{type:'button',id:'bgColorChoose','class':'colorChooser',label:c.chooseColor,onLoad:function(){this.getElement().getParent().setStyle('vertical-align','bottom');},onClick:function(){var l=this;k('colordialog',function(m){l.getDialog().getContentElement('info','bgColor').setValue(m.getContentElement('picker','selectedColor').getValue());});}}]},i,{type:'hbox',padding:0,widths:['60%','40%'],children:[{type:'text',id:'borderColor',label:c.borderColor,'default':'',setup:function(l){var m=l.getAttribute('borderColor'),n=l.getStyle('border-color');this.setValue(n||m);},commit:function(l){var m=this.getValue();if(m)l.setStyle('border-color',this.getValue());else l.removeStyle('border-color');l.removeAttribute('borderColor');}},{type:'button',id:'borderColorChoose','class':'colorChooser',label:c.chooseColor,style:(j?'margin-right':'margin-left')+': 10px',onLoad:function(){this.getElement().getParent().setStyle('vertical-align','bottom');},onClick:function(){var l=this;k('colordialog',function(m){l.getDialog().getContentElement('info','borderColor').setValue(m.getContentElement('picker','selectedColor').getValue());});}}]}]}]}]}],onShow:function(){var l=this;l.cells=CKEDITOR.plugins.tabletools.getSelectedCells(l._.editor.getSelection());l.setupContent(l.cells[0]);},onOk:function(){var p=this;var l=p._.editor.getSelection(),m=l.createBookmarks(),n=p.cells;for(var o=0;o<n.length;o++)p.commitContent(n[o]);p._.editor.forceNextSelectionCheck();l.selectBookmarks(m);p._.editor.selectionChange();}};});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.dialog.add('cellProperties',function(a){var b=a.lang.table,c=b.cell,d=a.lang.common,e=CKEDITOR.dialog.validate,f=/^(\d+(?:\.\d+)?)(px|%)$/,g=/^(\d+(?:\.\d+)?)px$/,h=CKEDITOR.tools.bind,i={type:'html',html:' '},j=a.lang.dir=='rtl';function k(l,m){var n=function(){var r=this;p(r);m(r,r._.parentDialog);r._.parentDialog.changeFocus();},o=function(){p(this);this._.parentDialog.changeFocus();},p=function(r){r.removeListener('ok',n);r.removeListener('cancel',o);},q=function(r){r.on('ok',n);r.on('cancel',o);};a.execCommand(l);if(a._.storedDialogs.colordialog)q(a._.storedDialogs.colordialog);else CKEDITOR.on('dialogDefinition',function(r){if(r.data.name!=l)return;var s=r.data.definition;r.removeListener();s.onLoad=CKEDITOR.tools.override(s.onLoad,function(t){return function(){q(this);s.onLoad=t;if(typeof t=='function')t.call(this);};});});};return{title:c.title,minWidth:CKEDITOR.env.ie&&CKEDITOR.env.quirks?450:410,minHeight:CKEDITOR.env.ie&&(CKEDITOR.env.ie7Compat||CKEDITOR.env.quirks)?230:220,contents:[{id:'info',label:c.title,accessKey:'I',elements:[{type:'hbox',widths:['40%','5%','40%'],children:[{type:'vbox',padding:0,children:[{type:'hbox',widths:['70%','30%'],children:[{type:'text',id:'width',width:'100px',label:d.width,validate:e.number(c.invalidWidth),onLoad:function(){var l=this.getDialog().getContentElement('info','widthType'),m=l.getElement(),n=this.getInputElement(),o=n.getAttribute('aria-labelledby');n.setAttribute('aria-labelledby',[o,m.$.id].join(' '));},setup:function(l){var m=parseInt(l.getAttribute('width'),10),n=parseInt(l.getStyle('width'),10);!isNaN(m)&&this.setValue(m);!isNaN(n)&&this.setValue(n);},commit:function(l){var m=parseInt(this.getValue(),10),n=this.getDialog().getValueOf('info','widthType');if(!isNaN(m))l.setStyle('width',m+n);else l.removeStyle('width');l.removeAttribute('width');},'default':''},{type:'select',id:'widthType',label:a.lang.table.widthUnit,labelStyle:'visibility:hidden','default':'px',items:[[b.widthPx,'px'],[b.widthPc,'%']],setup:function(l){var m=f.exec(l.getStyle('width')||l.getAttribute('width'));if(m)this.setValue(m[2]);}}]},{type:'hbox',widths:['70%','30%'],children:[{type:'text',id:'height',label:d.height,width:'100px','default':'',validate:e.number(c.invalidHeight),onLoad:function(){var l=this.getDialog().getContentElement('info','htmlHeightType'),m=l.getElement(),n=this.getInputElement(),o=n.getAttribute('aria-labelledby');n.setAttribute('aria-labelledby',[o,m.$.id].join(' '));},setup:function(l){var m=parseInt(l.getAttribute('height'),10),n=parseInt(l.getStyle('height'),10);
+!isNaN(m)&&this.setValue(m);!isNaN(n)&&this.setValue(n);},commit:function(l){var m=parseInt(this.getValue(),10);if(!isNaN(m))l.setStyle('height',CKEDITOR.tools.cssLength(m));else l.removeStyle('height');l.removeAttribute('height');}},{id:'htmlHeightType',type:'html',html:'<br />'+b.widthPx}]},i,{type:'select',id:'wordWrap',label:c.wordWrap,'default':'yes',items:[[c.yes,'yes'],[c.no,'no']],setup:function(l){var m=l.getAttribute('noWrap'),n=l.getStyle('white-space');if(n=='nowrap'||m)this.setValue('no');},commit:function(l){if(this.getValue()=='no')l.setStyle('white-space','nowrap');else l.removeStyle('white-space');l.removeAttribute('noWrap');}},i,{type:'select',id:'hAlign',label:c.hAlign,'default':'',items:[[d.notSet,''],[d.alignLeft,'left'],[d.alignCenter,'center'],[d.alignRight,'right']],setup:function(l){var m=l.getAttribute('align'),n=l.getStyle('text-align');this.setValue(n||m||'');},commit:function(l){var m=this.getValue();if(m)l.setStyle('text-align',m);else l.removeStyle('text-align');l.removeAttribute('align');}},{type:'select',id:'vAlign',label:c.vAlign,'default':'',items:[[d.notSet,''],[d.alignTop,'top'],[d.alignMiddle,'middle'],[d.alignBottom,'bottom'],[c.alignBaseline,'baseline']],setup:function(l){var m=l.getAttribute('vAlign'),n=l.getStyle('vertical-align');switch(n){case 'top':case 'middle':case 'bottom':case 'baseline':break;default:n='';}this.setValue(n||m||'');},commit:function(l){var m=this.getValue();if(m)l.setStyle('vertical-align',m);else l.removeStyle('vertical-align');l.removeAttribute('vAlign');}}]},i,{type:'vbox',padding:0,children:[{type:'select',id:'cellType',label:c.cellType,'default':'td',items:[[c.data,'td'],[c.header,'th']],setup:function(l){this.setValue(l.getName());},commit:function(l){l.renameNode(this.getValue());}},i,{type:'text',id:'rowSpan',label:c.rowSpan,'default':'',validate:e.integer(c.invalidRowSpan),setup:function(l){var m=parseInt(l.getAttribute('rowSpan'),10);if(m&&m!=1)this.setValue(m);},commit:function(l){var m=parseInt(this.getValue(),10);if(m&&m!=1)l.setAttribute('rowSpan',this.getValue());else l.removeAttribute('rowSpan');}},{type:'text',id:'colSpan',label:c.colSpan,'default':'',validate:e.integer(c.invalidColSpan),setup:function(l){var m=parseInt(l.getAttribute('colSpan'),10);if(m&&m!=1)this.setValue(m);},commit:function(l){var m=parseInt(this.getValue(),10);if(m&&m!=1)l.setAttribute('colSpan',this.getValue());else l.removeAttribute('colSpan');}},i,{type:'hbox',padding:0,widths:['60%','40%'],children:[{type:'text',id:'bgColor',label:c.bgColor,'default':'',setup:function(l){var m=l.getAttribute('bgColor'),n=l.getStyle('background-color');
+this.setValue(n||m);},commit:function(l){var m=this.getValue();if(m)l.setStyle('background-color',this.getValue());else l.removeStyle('background-color');l.removeAttribute('bgColor');}},{type:'button',id:'bgColorChoose','class':'colorChooser',label:c.chooseColor,onLoad:function(){this.getElement().getParent().setStyle('vertical-align','bottom');},onClick:function(){var l=this;k('colordialog',function(m){l.getDialog().getContentElement('info','bgColor').setValue(m.getContentElement('picker','selectedColor').getValue());});}}]},i,{type:'hbox',padding:0,widths:['60%','40%'],children:[{type:'text',id:'borderColor',label:c.borderColor,'default':'',setup:function(l){var m=l.getAttribute('borderColor'),n=l.getStyle('border-color');this.setValue(n||m);},commit:function(l){var m=this.getValue();if(m)l.setStyle('border-color',this.getValue());else l.removeStyle('border-color');l.removeAttribute('borderColor');}},{type:'button',id:'borderColorChoose','class':'colorChooser',label:c.chooseColor,style:(j?'margin-right':'margin-left')+': 10px',onLoad:function(){this.getElement().getParent().setStyle('vertical-align','bottom');},onClick:function(){var l=this;k('colordialog',function(m){l.getDialog().getContentElement('info','borderColor').setValue(m.getContentElement('picker','selectedColor').getValue());});}}]}]}]}]}],onShow:function(){var l=this;l.cells=CKEDITOR.plugins.tabletools.getSelectedCells(l._.editor.getSelection());l.setupContent(l.cells[0]);},onOk:function(){var p=this;var l=p._.editor.getSelection(),m=l.createBookmarks(),n=p.cells;for(var o=0;o<n.length;o++)p.commitContent(n[o]);p._.editor.forceNextSelectionCheck();l.selectBookmarks(m);p._.editor.selectionChange();}};});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/templates/dialogs/templates.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/templates/dialogs/templates.js
index 6e761e0..c0d6f38 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/templates/dialogs/templates.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/templates/dialogs/templates.js
@@ -1,7 +1,7 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-(function(){var a=CKEDITOR.document;CKEDITOR.dialog.add('templates',function(b){function c(k,l){k.setHtml('');for(var m=0,n=l.length;m<n;m++){var o=CKEDITOR.getTemplates(l[m]),p=o.imagesPath,q=o.templates,r=q.length;for(var s=0;s<r;s++){var t=q[s],u=d(t,p);u.setAttribute('aria-posinset',s+1);u.setAttribute('aria-setsize',r);k.append(u);}}};function d(k,l){var m=CKEDITOR.dom.element.createFromHtml('<a href="javascript:void(0)" tabIndex="-1" role="option" ><div class="cke_tpl_item"></div></a>'),n='<table style="width:350px;" class="cke_tpl_preview" role="presentation"><tr>';if(k.image&&l)n+='<td class="cke_tpl_preview_img"><img src="'+CKEDITOR.getUrl(l+k.image)+'"'+(CKEDITOR.env.ie6Compat?' onload="this.width=this.width"':'')+' alt="" title=""></td>';n+='<td style="white-space:normal;"><span class="cke_tpl_title">'+k.title+'</span><br/>';if(k.description)n+='<span>'+k.description+'</span>';n+='</td></tr></table>';m.getFirst().setHtml(n);m.on('click',function(){e(k.html);});return m;};function e(k){var l=CKEDITOR.dialog.getCurrent(),m=l.getValueOf('selectTpl','chkInsertOpt');if(m){b.on('contentDom',function(n){n.removeListener();l.hide();var o=new CKEDITOR.dom.range(b.document);o.moveToElementEditStart(b.document.getBody());o.select(1);setTimeout(function(){b.fire('saveSnapshot');},0);});b.fire('saveSnapshot');b.setData(k);}else{b.insertHtml(k);l.hide();}};function f(k){var l=k.data.getTarget(),m=g.equals(l);if(m||g.contains(l)){var n=k.data.getKeystroke(),o=g.getElementsByTag('a'),p;if(o){if(m)p=o.getItem(0);else switch(n){case 40:p=l.getNext();break;case 38:p=l.getPrevious();break;case 13:case 32:l.fire('click');}if(p){p.focus();k.data.preventDefault();}}}};CKEDITOR.skins.load(b,'templates');var g,h='cke_tpl_list_label_'+CKEDITOR.tools.getNextNumber(),i=b.lang.templates,j=b.config;return{title:b.lang.templates.title,minWidth:CKEDITOR.env.ie?440:400,minHeight:340,contents:[{id:'selectTpl',label:i.title,elements:[{type:'vbox',padding:5,children:[{id:'selectTplText',type:'html',html:'<span>'+i.selectPromptMsg+'</span>'},{id:'templatesList',type:'html',focus:true,html:'<div class="cke_tpl_list" tabIndex="-1" role="listbox" aria-labelledby="'+h+'">'+'<div class="cke_tpl_loading"><span></span></div>'+'</div>'+'<span class="cke_voice_label" id="'+h+'">'+i.options+'</span>'},{id:'chkInsertOpt',type:'checkbox',label:i.insertOption,'default':j.templates_replaceContent}]}]}],buttons:[CKEDITOR.dialog.cancelButton],onShow:function(){var k=this.getContentElement('selectTpl','templatesList');
-g=k.getElement();CKEDITOR.loadTemplates(j.templates_files,function(){var l=(j.templates||'default').split(',');if(l.length){c(g,l);k.focus();}else g.setHtml('<div class="cke_tpl_empty"><span>'+i.emptyListMsg+'</span>'+'</div>');});this._.element.on('keydown',f);},onHide:function(){this._.element.removeListener('keydown',f);}};});})();
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function(){var a=CKEDITOR.document;CKEDITOR.dialog.add('templates',function(b){function c(k,l){k.setHtml('');for(var m=0,n=l.length;m<n;m++){var o=CKEDITOR.getTemplates(l[m]),p=o.imagesPath,q=o.templates,r=q.length;for(var s=0;s<r;s++){var t=q[s],u=d(t,p);u.setAttribute('aria-posinset',s+1);u.setAttribute('aria-setsize',r);k.append(u);}}};function d(k,l){var m=CKEDITOR.dom.element.createFromHtml('<a href="javascript:void(0)" tabIndex="-1" role="option" ><div class="cke_tpl_item"></div></a>'),n='<table style="width:350px;" class="cke_tpl_preview" role="presentation"><tr>';if(k.image&&l)n+='<td class="cke_tpl_preview_img"><img src="'+CKEDITOR.getUrl(l+k.image)+'"'+(CKEDITOR.env.ie6Compat?' onload="this.width=this.width"':'')+' alt="" title=""></td>';n+='<td style="white-space:normal;"><span class="cke_tpl_title">'+k.title+'</span><br/>';if(k.description)n+='<span>'+k.description+'</span>';n+='</td></tr></table>';m.getFirst().setHtml(n);m.on('click',function(){e(k.html);});return m;};function e(k){var l=CKEDITOR.dialog.getCurrent(),m=l.getValueOf('selectTpl','chkInsertOpt');if(m){b.on('contentDom',function(n){n.removeListener();l.hide();var o=new CKEDITOR.dom.range(b.document);o.moveToElementEditStart(b.document.getBody());o.select(1);setTimeout(function(){b.fire('saveSnapshot');},0);});b.fire('saveSnapshot');b.setData(k);}else{b.insertHtml(k);l.hide();}};function f(k){var l=k.data.getTarget(),m=g.equals(l);if(m||g.contains(l)){var n=k.data.getKeystroke(),o=g.getElementsByTag('a'),p;if(o){if(m)p=o.getItem(0);else switch(n){case 40:p=l.getNext();break;case 38:p=l.getPrevious();break;case 13:case 32:l.fire('click');}if(p){p.focus();k.data.preventDefault();}}}};CKEDITOR.skins.load(b,'templates');var g,h='cke_tpl_list_label_'+CKEDITOR.tools.getNextNumber(),i=b.lang.templates,j=b.config;return{title:b.lang.templates.title,minWidth:CKEDITOR.env.ie?440:400,minHeight:340,contents:[{id:'selectTpl',label:i.title,elements:[{type:'vbox',padding:5,children:[{id:'selectTplText',type:'html',html:'<span>'+i.selectPromptMsg+'</span>'},{id:'templatesList',type:'html',focus:true,html:'<div class="cke_tpl_list" tabIndex="-1" role="listbox" aria-labelledby="'+h+'">'+'<div class="cke_tpl_loading"><span></span></div>'+'</div>'+'<span class="cke_voice_label" id="'+h+'">'+i.options+'</span>'},{id:'chkInsertOpt',type:'checkbox',label:i.insertOption,'default':j.templates_replaceContent}]}]}],buttons:[CKEDITOR.dialog.cancelButton],onShow:function(){var k=this.getContentElement('selectTpl','templatesList');
+g=k.getElement();CKEDITOR.loadTemplates(j.templates_files,function(){var l=(j.templates||'default').split(',');if(l.length){c(g,l);k.focus();}else g.setHtml('<div class="cke_tpl_empty"><span>'+i.emptyListMsg+'</span>'+'</div>');});this._.element.on('keydown',f);},onHide:function(){this._.element.removeListener('keydown',f);}};});})();
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/templates/templates/default.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/templates/templates/default.js
index f1bb531..f9c939b 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/templates/templates/default.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/templates/templates/default.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.addTemplates('default',{imagesPath:CKEDITOR.getUrl(CKEDITOR.plugins.getPath('templates')+'templates/images/'),templates:[{title:'Image and Title',image:'template1.gif',description:'One main image with a title and text that surround the image.',html:'<h3><img style="margin-right: 10px" height="100" width="100" align="left"/>Type the title here</h3><p>Type the text here</p>'},{title:'Strange Template',image:'template2.gif',description:'A template that defines two colums, each one with a title, and some text.',html:'<table cellspacing="0" cellpadding="0" style="width:100%" border="0"><tr><td style="width:50%"><h3>Title 1</h3></td><td></td><td style="width:50%"><h3>Title 2</h3></td></tr><tr><td>Text 1</td><td></td><td>Text 2</td></tr></table><p>More text goes here.</p>'},{title:'Text and Table',image:'template3.gif',description:'A title with some text and a table.',html:'<div style="width: 80%"><h3>Title goes here</h3><table style="width:150px;float: right" cellspacing="0" cellpadding="0" border="1"><caption style="border:solid 1px black"><strong>Table title</strong></caption></tr><tr><td> </td><td> </td><td> </td></tr><tr><td> </td><td> </td><td> </td></tr><tr><td> </td><td> </td><td> </td></tr></table><p>Type the text here</p></div>'}]});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.addTemplates('default',{imagesPath:CKEDITOR.getUrl(CKEDITOR.plugins.getPath('templates')+'templates/images/'),templates:[{title:'Image and Title',image:'template1.gif',description:'One main image with a title and text that surround the image.',html:'<h3><img style="margin-right: 10px" height="100" width="100" align="left"/>Type the title here</h3><p>Type the text here</p>'},{title:'Strange Template',image:'template2.gif',description:'A template that defines two colums, each one with a title, and some text.',html:'<table cellspacing="0" cellpadding="0" style="width:100%" border="0"><tr><td style="width:50%"><h3>Title 1</h3></td><td></td><td style="width:50%"><h3>Title 2</h3></td></tr><tr><td>Text 1</td><td></td><td>Text 2</td></tr></table><p>More text goes here.</p>'},{title:'Text and Table',image:'template3.gif',description:'A title with some text and a table.',html:'<div style="width: 80%"><h3>Title goes here</h3><table style="width:150px;float: right" cellspacing="0" cellpadding="0" border="1"><caption style="border:solid 1px black"><strong>Table title</strong></caption></tr><tr><td> </td><td> </td><td> </td></tr><tr><td> </td><td> </td><td> </td></tr><tr><td> </td><td> </td><td> </td></tr></table><p>Type the text here</p></div>'}]});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/dialogs/uicolor.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/dialogs/uicolor.js
index aad14fb..84a167d 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/dialogs/uicolor.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/dialogs/uicolor.js
@@ -1,7 +1,7 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.dialog.add('uicolor',function(a){var b,c,d,e=a.getUiColor(),f='cke_uicolor_picker'+CKEDITOR.tools.getNextNumber();function g(j){if(/^#/.test(j))j=window.YAHOO.util.Color.hex2rgb(j.substr(1));c.setValue(j,true);c.refresh(f);};function h(j,k){if(k||b._.contents.tab1.livePeview.getValue())a.setUiColor(j);b._.contents.tab1.configBox.setValue('config.uiColor = "#'+c.get('hex')+'"');};d={id:'yuiColorPicker',type:'html',html:"<div id='"+f+"' class='cke_uicolor_picker' style='width: 360px; height: 200px; position: relative;'></div>",onLoad:function(j){var k=CKEDITOR.getUrl('plugins/uicolor/yui/');c=new window.YAHOO.widget.ColorPicker(f,{showhsvcontrols:true,showhexcontrols:true,images:{PICKER_THUMB:k+'assets/picker_thumb.png',HUE_THUMB:k+'assets/hue_thumb.png'}});if(e)g(e);c.on('rgbChange',function(){b._.contents.tab1.predefined.setValue('');h('#'+c.get('hex'));});var l=new CKEDITOR.dom.nodeList(c.getElementsByTagName('input'));for(var m=0;m<l.count();m++)l.getItem(m).addClass('cke_dialog_ui_input_text');}};var i=true;return{title:a.lang.uicolor.title,minWidth:360,minHeight:320,onLoad:function(){b=this;this.setupContent();if(CKEDITOR.env.ie7Compat)b.parts.contents.setStyle('overflow','hidden');},contents:[{id:'tab1',label:'',title:'',expand:true,padding:0,elements:[d,{id:'tab1',type:'vbox',children:[{id:'livePeview',type:'checkbox',label:a.lang.uicolor.preview,'default':1,onLoad:function(){i=true;},onChange:function(){if(i)return;var j=this.getValue(),k=j?'#'+c.get('hex'):e;h(k,true);}},{type:'hbox',children:[{id:'predefined',type:'select','default':'',label:a.lang.uicolor.predefined,items:[[''],['Light blue','#9AB8F3'],['Sand','#D2B48C'],['Metallic','#949AAA'],['Purple','#C2A3C7'],['Olive','#A2C980'],['Happy green','#9BD446'],['Jezebel Blue','#14B8C4'],['Burn','#FF893A'],['Easy red','#FF6969'],['Pisces 3','#48B4F2'],['Aquarius 5','#487ED4'],['Absinthe','#A8CF76'],['Scrambled Egg','#C7A622'],['Hello monday','#8E8D80'],['Lovely sunshine','#F1E8B1'],['Recycled air','#B3C593'],['Down','#BCBCA4'],['Mark Twain','#CFE91D'],['Specks of dust','#D1B596'],['Lollipop','#F6CE23']],onChange:function(){var j=this.getValue();if(j){g(j);h(j);CKEDITOR.document.getById('predefinedPreview').setStyle('background',j);}else CKEDITOR.document.getById('predefinedPreview').setStyle('background','');},onShow:function(){var j=a.getUiColor();if(j)this.setValue(j);}},{id:'predefinedPreview',type:'html',html:'<div id="cke_uicolor_preview" style="border: 1px solid black; padding: 3px; width: 30px;"><div id="predefinedPreview" style="width: 30px; height: 30px;"> </div></div>'}]},{id:'configBox',type:'text',label:a.lang.uicolor.config,onShow:function(){var j=a.getUiColor();
-if(j)this.setValue('config.uiColor = "'+j+'"');}}]}]}],buttons:[CKEDITOR.dialog.okButton]};});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.dialog.add('uicolor',function(a){var b,c,d,e=a.getUiColor(),f='cke_uicolor_picker'+CKEDITOR.tools.getNextNumber();function g(j){if(/^#/.test(j))j=window.YAHOO.util.Color.hex2rgb(j.substr(1));c.setValue(j,true);c.refresh(f);};function h(j,k){if(k||b._.contents.tab1.livePeview.getValue())a.setUiColor(j);b._.contents.tab1.configBox.setValue('config.uiColor = "#'+c.get('hex')+'"');};d={id:'yuiColorPicker',type:'html',html:"<div id='"+f+"' class='cke_uicolor_picker' style='width: 360px; height: 200px; position: relative;'></div>",onLoad:function(j){var k=CKEDITOR.getUrl('plugins/uicolor/yui/');c=new window.YAHOO.widget.ColorPicker(f,{showhsvcontrols:true,showhexcontrols:true,images:{PICKER_THUMB:k+'assets/picker_thumb.png',HUE_THUMB:k+'assets/hue_thumb.png'}});if(e)g(e);c.on('rgbChange',function(){b._.contents.tab1.predefined.setValue('');h('#'+c.get('hex'));});var l=new CKEDITOR.dom.nodeList(c.getElementsByTagName('input'));for(var m=0;m<l.count();m++)l.getItem(m).addClass('cke_dialog_ui_input_text');}};var i=true;return{title:a.lang.uicolor.title,minWidth:360,minHeight:320,onLoad:function(){b=this;this.setupContent();if(CKEDITOR.env.ie7Compat)b.parts.contents.setStyle('overflow','hidden');},contents:[{id:'tab1',label:'',title:'',expand:true,padding:0,elements:[d,{id:'tab1',type:'vbox',children:[{id:'livePeview',type:'checkbox',label:a.lang.uicolor.preview,'default':1,onLoad:function(){i=true;},onChange:function(){if(i)return;var j=this.getValue(),k=j?'#'+c.get('hex'):e;h(k,true);}},{type:'hbox',children:[{id:'predefined',type:'select','default':'',label:a.lang.uicolor.predefined,items:[[''],['Light blue','#9AB8F3'],['Sand','#D2B48C'],['Metallic','#949AAA'],['Purple','#C2A3C7'],['Olive','#A2C980'],['Happy green','#9BD446'],['Jezebel Blue','#14B8C4'],['Burn','#FF893A'],['Easy red','#FF6969'],['Pisces 3','#48B4F2'],['Aquarius 5','#487ED4'],['Absinthe','#A8CF76'],['Scrambled Egg','#C7A622'],['Hello monday','#8E8D80'],['Lovely sunshine','#F1E8B1'],['Recycled air','#B3C593'],['Down','#BCBCA4'],['Mark Twain','#CFE91D'],['Specks of dust','#D1B596'],['Lollipop','#F6CE23']],onChange:function(){var j=this.getValue();if(j){g(j);h(j);CKEDITOR.document.getById('predefinedPreview').setStyle('background',j);}else CKEDITOR.document.getById('predefinedPreview').setStyle('background','');},onShow:function(){var j=a.getUiColor();if(j)this.setValue(j);}},{id:'predefinedPreview',type:'html',html:'<div id="cke_uicolor_preview" style="border: 1px solid black; padding: 3px; width: 30px;"><div id="predefinedPreview" style="width: 30px; height: 30px;"> </div></div>'}]},{id:'configBox',type:'text',label:a.lang.uicolor.config,onShow:function(){var j=a.getUiColor();
+if(j)this.setValue('config.uiColor = "'+j+'"');}}]}]}],buttons:[CKEDITOR.dialog.okButton]};});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/_translationstatus.txt b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/_translationstatus.txt
index f268477..74b55c7 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/_translationstatus.txt
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/_translationstatus.txt
@@ -1,28 +1,28 @@
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-
-bg.js Found: 4 Missing: 0
-cs.js Found: 4 Missing: 0
-cy.js Found: 4 Missing: 0
-da.js Found: 4 Missing: 0
-de.js Found: 4 Missing: 0
-el.js Found: 4 Missing: 0
-eo.js Found: 4 Missing: 0
-et.js Found: 4 Missing: 0
-fa.js Found: 4 Missing: 0
-fi.js Found: 4 Missing: 0
-fr.js Found: 4 Missing: 0
-he.js Found: 4 Missing: 0
-hr.js Found: 4 Missing: 0
-it.js Found: 4 Missing: 0
-mk.js Found: 4 Missing: 0
-nb.js Found: 4 Missing: 0
-nl.js Found: 4 Missing: 0
-no.js Found: 4 Missing: 0
-pl.js Found: 4 Missing: 0
-pt-br.js Found: 4 Missing: 0
-tr.js Found: 4 Missing: 0
-ug.js Found: 4 Missing: 0
-uk.js Found: 4 Missing: 0
-vi.js Found: 4 Missing: 0
-zh-cn.js Found: 4 Missing: 0
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+
+bg.js Found: 4 Missing: 0
+cs.js Found: 4 Missing: 0
+cy.js Found: 4 Missing: 0
+da.js Found: 4 Missing: 0
+de.js Found: 4 Missing: 0
+el.js Found: 4 Missing: 0
+eo.js Found: 4 Missing: 0
+et.js Found: 4 Missing: 0
+fa.js Found: 4 Missing: 0
+fi.js Found: 4 Missing: 0
+fr.js Found: 4 Missing: 0
+he.js Found: 4 Missing: 0
+hr.js Found: 4 Missing: 0
+it.js Found: 4 Missing: 0
+mk.js Found: 4 Missing: 0
+nb.js Found: 4 Missing: 0
+nl.js Found: 4 Missing: 0
+no.js Found: 4 Missing: 0
+pl.js Found: 4 Missing: 0
+pt-br.js Found: 4 Missing: 0
+tr.js Found: 4 Missing: 0
+ug.js Found: 4 Missing: 0
+uk.js Found: 4 Missing: 0
+vi.js Found: 4 Missing: 0
+zh-cn.js Found: 4 Missing: 0
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/bg.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/bg.js
index 104d664..442a07b 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/bg.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/bg.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','bg',{uicolor:{title:'ПИ избор на цвят',preview:'Преглед',config:'Вмъкнете този низ във Вашия config.js fajl',predefined:'Предефинирани цветови палитри'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','bg',{uicolor:{title:'ПИ избор на цвят',preview:'Преглед',config:'Вмъкнете този низ във Вашия config.js fajl',predefined:'Предефинирани цветови палитри'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/cs.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/cs.js
index 6e68075..c2e49ae 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/cs.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/cs.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','cs',{uicolor:{title:'Výběr barvy rozhraní',preview:'Živý náhled',config:'Vložte tento řetězec do Vašeho souboru config.js',predefined:'Přednastavené sady barev'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','cs',{uicolor:{title:'Výběr barvy rozhraní',preview:'Živý náhled',config:'Vložte tento řetězec do Vašeho souboru config.js',predefined:'Přednastavené sady barev'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/cy.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/cy.js
index c7ede5a..a664bb4 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/cy.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/cy.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','cy',{uicolor:{title:"Dewisydd Lliwiau'r UI",preview:'Rhagolwg Byw',config:"Gludwch y llinyn hwn i'ch ffeil config.js",predefined:"Setiau lliw wedi'u cyn-ddiffinio"}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','cy',{uicolor:{title:"Dewisydd Lliwiau'r UI",preview:'Rhagolwg Byw',config:"Gludwch y llinyn hwn i'ch ffeil config.js",predefined:"Setiau lliw wedi'u cyn-ddiffinio"}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/da.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/da.js
index eb3832c..2c567a4 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/da.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/da.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','da',{uicolor:{title:'Brugerflade på farvevælger',preview:'Vis liveeksempel',config:'Indsæt denne streng i din config.js fil',predefined:'Prædefinerede farveskemaer'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','da',{uicolor:{title:'Brugerflade på farvevælger',preview:'Vis liveeksempel',config:'Indsæt denne streng i din config.js fil',predefined:'Prædefinerede farveskemaer'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/de.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/de.js
index 0cd7697..8b5e024 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/de.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/de.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','de',{uicolor:{title:'UI Pipette',preview:'Live-Vorschau',config:"Fügen Sie diese Zeichenfolge in die 'config.js' Datei.",predefined:'Vordefinierte Farbsätze'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','de',{uicolor:{title:'UI Pipette',preview:'Live-Vorschau',config:"Fügen Sie diese Zeichenfolge in die 'config.js' Datei.",predefined:'Vordefinierte Farbsätze'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/el.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/el.js
index b3ed514..3967c9c 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/el.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/el.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','el',{uicolor:{title:'Διεπαφή Επιλογέα Χρωμάτων',preview:'Ζωντανή Προεπισκόπηση',config:'Επικολλήστε αυτό το κείμενο στο αρχείο config.js',predefined:'Προκαθορισμένα σύνολα χρωμάτων'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','el',{uicolor:{title:'Διεπαφή Επιλογέα Χρωμάτων',preview:'Ζωντανή Προεπισκόπηση',config:'Επικολλήστε αυτό το κείμενο στο αρχείο config.js',predefined:'Προκαθορισμένα σύνολα χρωμάτων'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/en.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/en.js
index 604123a..2058061 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/en.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/en.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','en',{uicolor:{title:'UI Color Picker',preview:'Live preview',config:'Paste this string into your config.js file',predefined:'Predefined color sets'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','en',{uicolor:{title:'UI Color Picker',preview:'Live preview',config:'Paste this string into your config.js file',predefined:'Predefined color sets'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/eo.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/eo.js
index 4651525..52c64af 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/eo.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/eo.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','eo',{uicolor:{title:'UI Kolorselektilo',preview:'Vidigi la aspekton',config:'Gluu tiun signoĉenon en vian dosieron config.js',predefined:'Antaŭdifinita koloraro'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','eo',{uicolor:{title:'UI Kolorselektilo',preview:'Vidigi la aspekton',config:'Gluu tiun signoĉenon en vian dosieron config.js',predefined:'Antaŭdifinita koloraro'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/et.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/et.js
index dcbf18f..13cefc5 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/et.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/et.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','et',{uicolor:{title:'Värvivalija kasutajaliides',preview:'Automaatne eelvaade',config:'Aseta see sõne oma config.js faili.',predefined:'Eelmääratud värvikomplektid'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','et',{uicolor:{title:'Värvivalija kasutajaliides',preview:'Automaatne eelvaade',config:'Aseta see sõne oma config.js faili.',predefined:'Eelmääratud värvikomplektid'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/fa.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/fa.js
index 764ef4a..09afe9d 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/fa.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/fa.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','fa',{uicolor:{title:'انتخاب رنگ UI',preview:'پیشنمایش زنده',config:'این رشته را در فایل config.js خود بچسبانید.',predefined:'مجموعه رنگ از پیش تعریف شده'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','fa',{uicolor:{title:'انتخاب رنگ UI',preview:'پیشنمایش زنده',config:'این رشته را در فایل config.js خود بچسبانید.',predefined:'مجموعه رنگ از پیش تعریف شده'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/fi.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/fi.js
index db2caee..7866b58 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/fi.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/fi.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','fi',{uicolor:{title:'Käyttöliittymän värivalitsin',preview:'Esikatsele',config:'Liitä tämä merkkijono config.js tiedostoosi',predefined:'Esimääritellyt värijoukot'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','fi',{uicolor:{title:'Käyttöliittymän värivalitsin',preview:'Esikatsele',config:'Liitä tämä merkkijono config.js tiedostoosi',predefined:'Esimääritellyt värijoukot'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/fr.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/fr.js
index bccd2a2..9feb222 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/fr.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/fr.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','fr',{uicolor:{title:'UI Sélecteur de couleur',preview:'Aperçu',config:'Collez cette chaîne de caractères dans votre fichier config.js',predefined:'Palettes de couleurs prédéfinies'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','fr',{uicolor:{title:'UI Sélecteur de couleur',preview:'Aperçu',config:'Collez cette chaîne de caractères dans votre fichier config.js',predefined:'Palettes de couleurs prédéfinies'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/he.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/he.js
index acfc344..e9f3c89 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/he.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/he.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','he',{uicolor:{title:'בחירת צבע ממשק משתמש',preview:'תצוגה מקדימה',config:'הדבק את הטקסט הבא לתוך הקובץ config.js',predefined:'קבוצות צבעים מוגדרות מראש'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','he',{uicolor:{title:'בחירת צבע ממשק משתמש',preview:'תצוגה מקדימה',config:'הדבק את הטקסט הבא לתוך הקובץ config.js',predefined:'קבוצות צבעים מוגדרות מראש'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/hr.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/hr.js
index 84c87a3..cfe1242 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/hr.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/hr.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','hr',{uicolor:{title:'UI odabir boja',preview:'Pregled uživo',config:'Zalijepite ovaj tekst u Vašu config.js datoteku.',predefined:'Već postavljeni setovi boja'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','hr',{uicolor:{title:'UI odabir boja',preview:'Pregled uživo',config:'Zalijepite ovaj tekst u Vašu config.js datoteku.',predefined:'Već postavljeni setovi boja'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/it.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/it.js
index 567a301..5bca7fe 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/it.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/it.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','it',{uicolor:{title:'Selettore Colore UI',preview:'Anteprima Live',config:'Incolla questa stringa nel tuo file config.js',predefined:'Set di colori predefiniti'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','it',{uicolor:{title:'Selettore Colore UI',preview:'Anteprima Live',config:'Incolla questa stringa nel tuo file config.js',predefined:'Set di colori predefiniti'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/mk.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/mk.js
index d8eec07..bd353bc 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/mk.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/mk.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','mk',{uicolor:{title:'Палета со бои',preview:'Преглед',config:'Залепи го овој текст во config.js датотеката',predefined:'Предефинирани множества на бои'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','mk',{uicolor:{title:'Палета со бои',preview:'Преглед',config:'Залепи го овој текст во config.js датотеката',predefined:'Предефинирани множества на бои'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/nb.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/nb.js
index 2fd7002..3379e2d 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/nb.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/nb.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','nb',{uicolor:{title:'Fargevelger for brukergrensesnitt',preview:'Forhåndsvisning i sanntid',config:'Lim inn følgende tekst i din config.js-fil',predefined:'Forhåndsdefinerte fargesett'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','nb',{uicolor:{title:'Fargevelger for brukergrensesnitt',preview:'Forhåndsvisning i sanntid',config:'Lim inn følgende tekst i din config.js-fil',predefined:'Forhåndsdefinerte fargesett'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/nl.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/nl.js
index bd9b7e9..10e28d7 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/nl.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/nl.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','nl',{uicolor:{title:'UI Kleurenkiezer',preview:'Live voorbeeld',config:'Plak deze tekst in jouw config.js bestand',predefined:'Voorgedefinieerde kleurensets'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','nl',{uicolor:{title:'UI Kleurenkiezer',preview:'Live voorbeeld',config:'Plak deze tekst in jouw config.js bestand',predefined:'Voorgedefinieerde kleurensets'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/no.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/no.js
index 09b2140..cb55a36 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/no.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/no.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','no',{uicolor:{title:'Fargevelger for brukergrensesnitt',preview:'Forhåndsvisning i sanntid',config:'Lim inn følgende tekst i din config.js-fil',predefined:'Forhåndsdefinerte fargesett'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','no',{uicolor:{title:'Fargevelger for brukergrensesnitt',preview:'Forhåndsvisning i sanntid',config:'Lim inn følgende tekst i din config.js-fil',predefined:'Forhåndsdefinerte fargesett'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/pl.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/pl.js
index 4620b9c..97f0285 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/pl.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/pl.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','pl',{uicolor:{title:'Wybór koloru interfejsu',preview:'Podgląd na żywo',config:'Wklej poniższy łańcuch znaków do pliku config.js:',predefined:'Predefiniowane zestawy kolorów'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','pl',{uicolor:{title:'Wybór koloru interfejsu',preview:'Podgląd na żywo',config:'Wklej poniższy łańcuch znaków do pliku config.js:',predefined:'Predefiniowane zestawy kolorów'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/pt-br.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/pt-br.js
index e1a5689..51793f8 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/pt-br.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/pt-br.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','pt-br',{uicolor:{title:'Paleta de Cores',preview:'Visualização ao vivo',config:'Cole o texto no seu arquivo config.js',predefined:'Conjuntos de cores predefinidos'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','pt-br',{uicolor:{title:'Paleta de Cores',preview:'Visualização ao vivo',config:'Cole o texto no seu arquivo config.js',predefined:'Conjuntos de cores predefinidos'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/tr.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/tr.js
index 2ee697c..2c74968 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/tr.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/tr.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','tr',{uicolor:{title:'UI Renk Seçicisi',preview:'Canlı önizleme',config:'Bu dizeyi config.js dosyasının içine yapıştırın',predefined:'Önceden tanımlanmış renk kümeleri'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','tr',{uicolor:{title:'UI Renk Seçicisi',preview:'Canlı önizleme',config:'Bu dizeyi config.js dosyasının içine yapıştırın',predefined:'Önceden tanımlanmış renk kümeleri'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/ug.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/ug.js
index e1652ff..d831dbc 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/ug.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/ug.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','ug',{uicolor:{title:'ئىشلەتكۈچى ئارايۈزى رەڭ تاللىغۇچ',preview:'شۇئان ئالدىن كۆزىتىش',config:'بۇ ھەرپ تىزىقىنى config.js ھۆججەتكە چاپلايدۇ',predefined:'ئالدىن بەلگىلەنگەن رەڭلەر'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','ug',{uicolor:{title:'ئىشلەتكۈچى ئارايۈزى رەڭ تاللىغۇچ',preview:'شۇئان ئالدىن كۆزىتىش',config:'بۇ ھەرپ تىزىقىنى config.js ھۆججەتكە چاپلايدۇ',predefined:'ئالدىن بەلگىلەنگەن رەڭلەر'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/uk.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/uk.js
index a6ba80f..89758ad 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/uk.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/uk.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','uk',{uicolor:{title:'Color Picker Інтерфейс',preview:'Перегляд наживо',config:'Вставте цей рядок у файл config.js',predefined:'Стандартний набір кольорів'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','uk',{uicolor:{title:'Color Picker Інтерфейс',preview:'Перегляд наживо',config:'Вставте цей рядок у файл config.js',predefined:'Стандартний набір кольорів'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/vi.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/vi.js
index eff2da5..a96fecf 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/vi.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/vi.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','vi',{uicolor:{title:'Giao diện người dùng Color Picker',preview:'Xem trước trực tiếp',config:'Dán chuỗi này vào tập tin config.js của bạn',predefined:'Tập màu định nghĩa sẵn'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','vi',{uicolor:{title:'Giao diện người dùng Color Picker',preview:'Xem trước trực tiếp',config:'Dán chuỗi này vào tập tin config.js của bạn',predefined:'Tập màu định nghĩa sẵn'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/zh-cn.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/zh-cn.js
index 1ab773a..cb89a50 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/zh-cn.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/lang/zh-cn.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.setLang('uicolor','zh-cn',{uicolor:{title:'用户界面颜色选择器',preview:'即时预览',config:'粘贴此字符串到你的 config.js 文件',predefined:'预定义颜色集'}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.setLang('uicolor','zh-cn',{uicolor:{title:'用户界面颜色选择器',preview:'即时预览',config:'粘贴此字符串到你的 config.js 文件',predefined:'预定义颜色集'}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/plugin.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/plugin.js
index 9dc67dc..2a3e029 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/plugin.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/plugin.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.plugins.add('uicolor',{requires:['dialog'],lang:['bg','cs','cy','da','de','el','en','eo','et','fa','fi','fr','he','hr','it','mk','nb','nl','no','pl','pt-br','tr','ug','uk','vi','zh-cn'],init:function(a){if(CKEDITOR.env.ie6Compat)return;a.addCommand('uicolor',new CKEDITOR.dialogCommand('uicolor'));a.ui.addButton('UIColor',{label:a.lang.uicolor.title,command:'uicolor',icon:this.path+'uicolor.gif'});CKEDITOR.dialog.add('uicolor',this.path+'dialogs/uicolor.js');CKEDITOR.scriptLoader.load(CKEDITOR.getUrl('plugins/uicolor/yui/yui.js'));a.element.getDocument().appendStyleSheet(CKEDITOR.getUrl('plugins/uicolor/yui/assets/yui.css'));}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.plugins.add('uicolor',{requires:['dialog'],lang:['bg','cs','cy','da','de','el','en','eo','et','fa','fi','fr','he','hr','it','mk','nb','nl','no','pl','pt-br','tr','ug','uk','vi','zh-cn'],init:function(a){if(CKEDITOR.env.ie6Compat)return;a.addCommand('uicolor',new CKEDITOR.dialogCommand('uicolor'));a.ui.addButton('UIColor',{label:a.lang.uicolor.title,command:'uicolor',icon:this.path+'uicolor.gif'});CKEDITOR.dialog.add('uicolor',this.path+'dialogs/uicolor.js');CKEDITOR.scriptLoader.load(CKEDITOR.getUrl('plugins/uicolor/yui/yui.js'));a.element.getDocument().appendStyleSheet(CKEDITOR.getUrl('plugins/uicolor/yui/assets/yui.css'));}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/yui/assets/yui.css b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/yui/assets/yui.css
index 7621d14..c7919d3 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/yui/assets/yui.css
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/yui/assets/yui.css
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-.yui-h-slider,.yui-v-slider{position:relative;}.yui-h-slider .yui-slider-thumb,.yui-v-slider .yui-slider-thumb{position:absolute;cursor:default;}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px;}.yui-skin-sam .yui-h-slider .yui-slider-thumb{top:4px;}.yui-skin-sam .yui-v-slider{background:url(bg-v.gif) no-repeat 12px 0;height:228px;width:48px;}.cke_uicolor_picker .yui-picker-panel{background:#e3e3e3;border-color:#888;}.cke_uicolor_picker .yui-picker-panel .hd{background-color:#ccc;font-size:100%;line-height:100%;border:1px solid #e3e3e3;font-weight:bold;overflow:hidden;padding:6px;color:#000;}.cke_uicolor_picker .yui-picker-panel .bd{background:#e8e8e8;margin:1px;height:200px;}.cke_uicolor_picker .yui-picker-panel .ft{background:#e8e8e8;margin:1px;padding:1px;}.cke_uicolor_picker .yui-picker{position:relative;}.cke_uicolor_picker .yui-picker-hue-thumb{cursor:default;width:18px;height:18px;top:-8px;left:-2px;z-index:9;position:absolute;}.cke_uicolor_picker .yui-picker-hue-bg{-moz-outline:none;outline:0 none;position:absolute;left:200px;height:183px;width:14px;background:url(hue_bg.png) no-repeat;top:4px;}.cke_uicolor_picker .yui-picker-bg{-moz-outline:none;outline:0 none;position:absolute;top:4px;left:4px;height:182px;width:182px;background-color:#F00;background-image:url(picker_mask.png);}*html .cke_uicolor_picker .yui-picker-bg{background-image:none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='picker_mask.png',sizingMethod='scale');}.cke_uicolor_picker .yui-picker-mask{position:absolute;z-index:1;top:0;left:0;}.cke_uicolor_picker .yui-picker-thumb{cursor:default;width:11px;height:11px;z-index:9;position:absolute;top:-4px;left:-4px;}.cke_uicolor_picker .yui-picker-swatch{position:absolute;left:240px;top:4px;height:60px;width:55px;border:1px solid #888;}.cke_uicolor_picker .yui-picker-websafe-swatch{position:absolute;left:304px;top:4px;height:24px;width:24px;border:1px solid #888;}.cke_uicolor_picker .yui-picker-controls{position:absolute;top:72px;left:226px;font:1em monospace;}.cke_uicolor_picker .yui-picker-controls .hd{background:transparent;border-width:0!important;}.cke_uicolor_picker .yui-picker-controls .bd{height:100px;border-width:0!important;}.cke_uicolor_picker .yui-picker-controls ul{float:left;padding:0 2px 0 0;margin:0;}.cke_uicolor_picker .yui-picker-controls li{padding:2px;list-style:none;margin:0;}.cke_uicolor_picker .yui-picker-controls input{font-size:.85em;width:2.4em;}.cke_uicolor_picker .yui-picker-hex-controls{clear:both;padding:2px;}.cke_uicolor_picker .yui-picker-hex-controls input{width:4.6em;}.cke_uicolor_picker .yui-picker-controls a{font:1em arial,helvetica,clean,sans-serif;display:block;*display:inline-block;padding:0;color:#000;}
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+.yui-h-slider,.yui-v-slider{position:relative;}.yui-h-slider .yui-slider-thumb,.yui-v-slider .yui-slider-thumb{position:absolute;cursor:default;}.yui-skin-sam .yui-h-slider{background:url(bg-h.gif) no-repeat 5px 0;height:28px;width:228px;}.yui-skin-sam .yui-h-slider .yui-slider-thumb{top:4px;}.yui-skin-sam .yui-v-slider{background:url(bg-v.gif) no-repeat 12px 0;height:228px;width:48px;}.cke_uicolor_picker .yui-picker-panel{background:#e3e3e3;border-color:#888;}.cke_uicolor_picker .yui-picker-panel .hd{background-color:#ccc;font-size:100%;line-height:100%;border:1px solid #e3e3e3;font-weight:bold;overflow:hidden;padding:6px;color:#000;}.cke_uicolor_picker .yui-picker-panel .bd{background:#e8e8e8;margin:1px;height:200px;}.cke_uicolor_picker .yui-picker-panel .ft{background:#e8e8e8;margin:1px;padding:1px;}.cke_uicolor_picker .yui-picker{position:relative;}.cke_uicolor_picker .yui-picker-hue-thumb{cursor:default;width:18px;height:18px;top:-8px;left:-2px;z-index:9;position:absolute;}.cke_uicolor_picker .yui-picker-hue-bg{-moz-outline:none;outline:0 none;position:absolute;left:200px;height:183px;width:14px;background:url(hue_bg.png) no-repeat;top:4px;}.cke_uicolor_picker .yui-picker-bg{-moz-outline:none;outline:0 none;position:absolute;top:4px;left:4px;height:182px;width:182px;background-color:#F00;background-image:url(picker_mask.png);}*html .cke_uicolor_picker .yui-picker-bg{background-image:none;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='picker_mask.png',sizingMethod='scale');}.cke_uicolor_picker .yui-picker-mask{position:absolute;z-index:1;top:0;left:0;}.cke_uicolor_picker .yui-picker-thumb{cursor:default;width:11px;height:11px;z-index:9;position:absolute;top:-4px;left:-4px;}.cke_uicolor_picker .yui-picker-swatch{position:absolute;left:240px;top:4px;height:60px;width:55px;border:1px solid #888;}.cke_uicolor_picker .yui-picker-websafe-swatch{position:absolute;left:304px;top:4px;height:24px;width:24px;border:1px solid #888;}.cke_uicolor_picker .yui-picker-controls{position:absolute;top:72px;left:226px;font:1em monospace;}.cke_uicolor_picker .yui-picker-controls .hd{background:transparent;border-width:0!important;}.cke_uicolor_picker .yui-picker-controls .bd{height:100px;border-width:0!important;}.cke_uicolor_picker .yui-picker-controls ul{float:left;padding:0 2px 0 0;margin:0;}.cke_uicolor_picker .yui-picker-controls li{padding:2px;list-style:none;margin:0;}.cke_uicolor_picker .yui-picker-controls input{font-size:.85em;width:2.4em;}.cke_uicolor_picker .yui-picker-hex-controls{clear:both;padding:2px;}.cke_uicolor_picker .yui-picker-hex-controls input{width:4.6em;}.cke_uicolor_picker .yui-picker-controls a{font:1em arial,helvetica,clean,sans-serif;display:block;*display:inline-block;padding:0;color:#000;}
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/yui/yui.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/yui/yui.js
index 86f5484..98d2b4c 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/yui/yui.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/uicolor/yui/yui.js
@@ -1,76 +1,76 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-/*jsl:ignoreall*/
-/*
-Copyright (c) 2009, Yahoo! Inc. All rights reserved.
-Code licensed under the BSD License:
-http://developer.yahoo.net/yui/license.txt
-version: 2.7.0
-*/
-if(typeof YAHOO=="undefined"||!YAHOO){var YAHOO={};}YAHOO.namespace=function(){var A=arguments,E=null,C,B,D;for(C=0;C<A.length;C=C+1){D=(""+A[C]).split(".");E=YAHOO;for(B=(D[0]=="YAHOO")?1:0;B<D.length;B=B+1){E[D[B]]=E[D[B]]||{};E=E[D[B]];}}return E;};YAHOO.log=function(D,A,C){var B=YAHOO.widget.Logger;if(B&&B.log){return B.log(D,A,C);}else{return false;}};YAHOO.register=function(A,E,D){var I=YAHOO.env.modules,B,H,G,F,C;if(!I[A]){I[A]={versions:[],builds:[]};}B=I[A];H=D.version;G=D.build;F=YAHOO.env.listeners;B.name=A;B.version=H;B.build=G;B.versions.push(H);B.builds.push(G);B.mainClass=E;for(C=0;C<F.length;C=C+1){F[C](B);}if(E){E.VERSION=H;E.BUILD=G;}else{YAHOO.log("mainClass is undefined for module "+A,"warn");}};YAHOO.env=YAHOO.env||{modules:[],listeners:[]};YAHOO.env.getVersion=function(A){return YAHOO.env.modules[A]||null;};YAHOO.env.ua=function(){var C={ie:0,opera:0,gecko:0,webkit:0,mobile:null,air:0,caja:0},B=navigator.userAgent,A;if((/KHTML/).test(B)){C.webkit=1;}A=B.match(/AppleWebKit\/([^\s]*)/);if(A&&A[1]){C.webkit=parseFloat(A[1]);if(/ Mobile\//.test(B)){C.mobile="Apple";}else{A=B.match(/NokiaN[^\/]*/);if(A){C.mobile=A[0];}}A=B.match(/AdobeAIR\/([^\s]*)/);if(A){C.air=A[0];}}if(!C.webkit){A=B.match(/Opera[\s\/]([^\s]*)/);if(A&&A[1]){C.opera=parseFloat(A[1]);A=B.match(/Opera Mini[^;]*/);if(A){C.mobile=A[0];}}else{A=B.match(/MSIE\s([^;]*)/);if(A&&A[1]){C.ie=parseFloat(A[1]);}else{A=B.match(/Gecko\/([^\s]*)/);if(A){C.gecko=1;A=B.match(/rv:([^\s\)]*)/);if(A&&A[1]){C.gecko=parseFloat(A[1]);}}}}}A=B.match(/Caja\/([^\s]*)/);if(A&&A[1]){C.caja=parseFloat(A[1]);}return C;}();(function(){YAHOO.namespace("util","widget","example");if("undefined"!==typeof YAHOO_config){var B=YAHOO_config.listener,A=YAHOO.env.listeners,D=true,C;if(B){for(C=0;C<A.length;C=C+1){if(A[C]==B){D=false;break;}}if(D){A.push(B);}}}})();YAHOO.lang=YAHOO.lang||{};(function(){var B=YAHOO.lang,F="[object Array]",C="[object Function]",A=Object.prototype,E=["toString","valueOf"],D={isArray:function(G){return A.toString.apply(G)===F;},isBoolean:function(G){return typeof G==="boolean";},isFunction:function(G){return A.toString.apply(G)===C;},isNull:function(G){return G===null;},isNumber:function(G){return typeof G==="number"&&isFinite(G);},isObject:function(G){return(G&&(typeof G==="object"||B.isFunction(G)))||false;},isString:function(G){return typeof G==="string";},isUndefined:function(G){return typeof G==="undefined";},_IEEnumFix:(YAHOO.env.ua.ie)?function(I,H){var G,K,J;for(G=0;G<E.length;G=G+1){K=E[G];J=H[K];if(B.isFunction(J)&&J!=A[K]){I[K]=J;}}}:function(){},extend:function(J,K,I){if(!K||!J){throw new Error("extend failed, please check that "+"all dependencies are included.");}var H=function(){},G;H.prototype=K.prototype;J.prototype=new H();J.prototype.constructor=J;J.superclass=K.prototype;if(K.prototype.constructor==A.constructor){K.prototype.constructor=K;}if(I){for(G in I){if(B.hasOwnProperty(I,G)){J.prototype[G]=I[G];}}B._IEEnumFix(J.prototype,I);}},augmentObject:function(K,J){if(!J||!K){throw new Error("Absorb failed, verify dependencies.");}var G=arguments,I,L,H=G[2];if(H&&H!==true){for(I=2;I<G.length;I=I+1){K[G[I]]=J[G[I]];}}else{for(L in J){if(H||!(L in K)){K[L]=J[L];}}B._IEEnumFix(K,J);}},augmentProto:function(J,I){if(!I||!J){throw new Error("Augment failed, verify dependencies.");}var G=[J.prototype,I.prototype],H;for(H=2;H<arguments.length;H=H+1){G.push(arguments[H]);}B.augmentObject.apply(this,G);},dump:function(G,L){var I,K,N=[],O="{...}",H="f(){...}",M=", ",J=" => ";if(!B.isObject(G)){return G+"";}else{if(G instanceof Date||("nodeType" in G&&"tagName" in G)){return G;}else{if(B.isFunction(G)){return H;}}}L=(B.isNumber(L))?L:3;if(B.isArray(G)){N.push("[");for(I=0,K=G.length;I<K;I=I+1){if(B.isObject(G[I])){N.push((L>0)?B.dump(G[I],L-1):O);}else{N.push(G[I]);}N.push(M);}if(N.length>1){N.pop();}N.push("]");}else{N.push("{");for(I in G){if(B.hasOwnProperty(G,I)){N.push(I+J);if(B.isObject(G[I])){N.push((L>0)?B.dump(G[I],L-1):O);}else{N.push(G[I]);}N.push(M);}}if(N.length>1){N.pop();}N.push("}");}return N.join("");},substitute:function(V,H,O){var L,K,J,R,S,U,Q=[],I,M="dump",P=" ",G="{",T="}",N;for(;;){L=V.lastIndexOf(G);if(L<0){break;}K=V.indexOf(T,L);if(L+1>=K){break;}I=V.substring(L+1,K);R=I;U=null;J=R.indexOf(P);if(J>-1){U=R.substring(J+1);R=R.substring(0,J);}S=H[R];if(O){S=O(R,S,U);}if(B.isObject(S)){if(B.isArray(S)){S=B.dump(S,parseInt(U,10));}else{U=U||"";N=U.indexOf(M);if(N>-1){U=U.substring(4);}if(S.toString===A.toString||N>-1){S=B.dump(S,parseInt(U,10));}else{S=S.toString();}}}else{if(!B.isString(S)&&!B.isNumber(S)){S="~-"+Q.length+"-~";Q[Q.length]=I;}}V=V.substring(0,L)+S+V.substring(K+1);}for(L=Q.length-1;L>=0;L=L-1){V=V.replace(new RegExp("~-"+L+"-~"),"{"+Q[L]+"}","g");}return V;},trim:function(G){try{return G.replace(/^\s+|\s+$/g,"");}catch(H){return G;}},merge:function(){var J={},H=arguments,G=H.length,I;for(I=0;I<G;I=I+1){B.augmentObject(J,H[I],true);}return J;},later:function(N,H,O,J,K){N=N||0;H=H||{};var I=O,M=J,L,G;if(B.isString(O)){I=H[O];}if(!I){throw new TypeError("method undefined");}if(!B.isArray(M)){M=[J];}L=function(){I.apply(H,M);};G=(K)?setInterval(L,N):setTimeout(L,N);return{interval:K,cancel:function(){if(this.interval){clearInterval(G);}else{clearTimeout(G);}}};},isValue:function(G){return(B.isObject(G)||B.isString(G)||B.isNumber(G)||B.isBoolean(G));}};B.hasOwnProperty=(A.hasOwnProperty)?function(G,H){return G&&G.hasOwnProperty(H);}:function(G,H){return !B.isUndefined(G[H])&&G.constructor.prototype[H]!==G[H];};D.augmentObject(B,D,true);YAHOO.util.Lang=B;B.augment=B.augmentProto;YAHOO.augment=B.augmentProto;YAHOO.extend=B.extend;})();YAHOO.register("yahoo",YAHOO,{version:"2.7.0",build:"1796"});(function(){YAHOO.env._id_counter=YAHOO.env._id_counter||0;var E=YAHOO.util,L=YAHOO.lang,m=YAHOO.env.ua,A=YAHOO.lang.trim,d={},h={},N=/^t(?:able|d|h)$/i,X=/color$/i,K=window.document,W=K.documentElement,e="ownerDocument",n="defaultView",v="documentElement",t="compatMode",b="offsetLeft",P="offsetTop",u="offsetParent",Z="parentNode",l="nodeType",C="tagName",O="scrollLeft",i="scrollTop",Q="getBoundingClientRect",w="getComputedStyle",a="currentStyle",M="CSS1Compat",c="BackCompat",g="class",F="className",J="",B=" ",s="(?:^|\\s)",k="(?= |$)",U="g",p="position",f="fixed",V="relative",j="left",o="top",r="medium",q="borderLeftWidth",R="borderTopWidth",D=m.opera,I=m.webkit,H=m.gecko,T=m.ie;E.Dom={CUSTOM_ATTRIBUTES:(!W.hasAttribute)?{"for":"htmlFor","class":F}:{"htmlFor":"for","className":g},get:function(y){var AA,Y,z,x,G;if(y){if(y[l]||y.item){return y;}if(typeof y==="string"){AA=y;y=K.getElementById(y);if(y&&y.id===AA){return y;}else{if(y&&K.all){y=null;Y=K.all[AA];for(x=0,G=Y.length;x<G;++x){if(Y[x].id===AA){return Y[x];}}}}return y;}if(y.DOM_EVENTS){y=y.get("element");}if("length" in y){z=[];for(x=0,G=y.length;x<G;++x){z[z.length]=E.Dom.get(y[x]);}return z;}return y;}return null;},getComputedStyle:function(G,Y){if(window[w]){return G[e][n][w](G,null)[Y];}else{if(G[a]){return E.Dom.IE_ComputedStyle.get(G,Y);}}},getStyle:function(G,Y){return E.Dom.batch(G,E.Dom._getStyle,Y);},_getStyle:function(){if(window[w]){return function(G,y){y=(y==="float")?y="cssFloat":E.Dom._toCamel(y);var x=G.style[y],Y;if(!x){Y=G[e][n][w](G,null);if(Y){x=Y[y];}}return x;};}else{if(W[a]){return function(G,y){var x;switch(y){case"opacity":x=100;try{x=G.filters["DXImageTransform.Microsoft.Alpha"].opacity;}catch(z){try{x=G.filters("alpha").opacity;}catch(Y){}}return x/100;case"float":y="styleFloat";default:y=E.Dom._toCamel(y);x=G[a]?G[a][y]:null;return(G.style[y]||x);}};}}}(),setStyle:function(G,Y,x){E.Dom.batch(G,E.Dom._setStyle,{prop:Y,val:x});},_setStyle:function(){if(T){return function(Y,G){var x=E.Dom._toCamel(G.prop),y=G.val;if(Y){switch(x){case"opacity":if(L.isString(Y.style.filter)){Y.style.filter="alpha(opacity="+y*100+")";if(!Y[a]||!Y[a].hasLayout){Y.style.zoom=1;}}break;case"float":x="styleFloat";default:Y.style[x]=y;}}else{}};}else{return function(Y,G){var x=E.Dom._toCamel(G.prop),y=G.val;if(Y){if(x=="float"){x="cssFloat";}Y.style[x]=y;}else{}};}}(),getXY:function(G){return E.Dom.batch(G,E.Dom._getXY);},_canPosition:function(G){return(E.Dom._getStyle(G,"display")!=="none"&&E.Dom._inDoc(G));},_getXY:function(){if(K[v][Q]){return function(y){var z,Y,AA,AF,AE,AD,AC,G,x,AB=Math.floor,AG=false;if(E.Dom._canPosition(y)){AA=y[Q]();AF=y[e];z=E.Dom.getDocumentScrollLeft(AF);Y=E.Dom.getDocumentScrollTop(AF);AG=[AB(AA[j]),AB(AA[o])];if(T&&m.ie<8){AE=2;AD=2;AC=AF[t];G=S(AF[v],q);x=S(AF[v],R);if(m.ie===6){if(AC!==c){AE=0;AD=0;}}if((AC==c)){if(G!==r){AE=parseInt(G,10);}if(x!==r){AD=parseInt(x,10);}}AG[0]-=AE;AG[1]-=AD;}if((Y||z)){AG[0]+=z;AG[1]+=Y;}AG[0]=AB(AG[0]);AG[1]=AB(AG[1]);}else{}return AG;};}else{return function(y){var x,Y,AA,AB,AC,z=false,G=y;if(E.Dom._canPosition(y)){z=[y[b],y[P]];x=E.Dom.getDocumentScrollLeft(y[e]);Y=E.Dom.getDocumentScrollTop(y[e]);AC=((H||m.webkit>519)?true:false);while((G=G[u])){z[0]+=G[b];z[1]+=G[P];if(AC){z=E.Dom._calcBorders(G,z);}}if(E.Dom._getStyle(y,p)!==f){G=y;while((G=G[Z])&&G[C]){AA=G[i];AB=G[O];if(H&&(E.Dom._getStyle(G,"overflow")!=="visible")){z=E.Dom._calcBorders(G,z);}if(AA||AB){z[0]-=AB;z[1]-=AA;}}z[0]+=x;z[1]+=Y;}else{if(D){z[0]-=x;z[1]-=Y;}else{if(I||H){z[0]+=x;z[1]+=Y;}}}z[0]=Math.floor(z[0]);z[1]=Math.floor(z[1]);}else{}return z;};}}(),getX:function(G){var Y=function(x){return E.Dom.getXY(x)[0];};return E.Dom.batch(G,Y,E.Dom,true);},getY:function(G){var Y=function(x){return E.Dom.getXY(x)[1];};return E.Dom.batch(G,Y,E.Dom,true);},setXY:function(G,x,Y){E.Dom.batch(G,E.Dom._setXY,{pos:x,noRetry:Y});},_setXY:function(G,z){var AA=E.Dom._getStyle(G,p),y=E.Dom.setStyle,AD=z.pos,Y=z.noRetry,AB=[parseInt(E.Dom.getComputedStyle(G,j),10),parseInt(E.Dom.getComputedStyle(G,o),10)],AC,x;if(AA=="static"){AA=V;y(G,p,AA);}AC=E.Dom._getXY(G);if(!AD||AC===false){return false;}if(isNaN(AB[0])){AB[0]=(AA==V)?0:G[b];}if(isNaN(AB[1])){AB[1]=(AA==V)?0:G[P];}if(AD[0]!==null){y(G,j,AD[0]-AC[0]+AB[0]+"px");}if(AD[1]!==null){y(G,o,AD[1]-AC[1]+AB[1]+"px");}if(!Y){x=E.Dom._getXY(G);if((AD[0]!==null&&x[0]!=AD[0])||(AD[1]!==null&&x[1]!=AD[1])){E.Dom._setXY(G,{pos:AD,noRetry:true});}}},setX:function(Y,G){E.Dom.setXY(Y,[G,null]);},setY:function(G,Y){E.Dom.setXY(G,[null,Y]);},getRegion:function(G){var Y=function(x){var y=false;if(E.Dom._canPosition(x)){y=E.Region.getRegion(x);}else{}return y;};return E.Dom.batch(G,Y,E.Dom,true);},getClientWidth:function(){return E.Dom.getViewportWidth();},getClientHeight:function(){return E.Dom.getViewportHeight();},getElementsByClassName:function(AB,AF,AC,AE,x,AD){AB=L.trim(AB);AF=AF||"*";AC=(AC)?E.Dom.get(AC):null||K;if(!AC){return[];}var Y=[],G=AC.getElementsByTagName(AF),z=E.Dom.hasClass;for(var y=0,AA=G.length;y<AA;++y){if(z(G[y],AB)){Y[Y.length]=G[y];}}if(AE){E.Dom.batch(Y,AE,x,AD);}return Y;},hasClass:function(Y,G){return E.Dom.batch(Y,E.Dom._hasClass,G);},_hasClass:function(x,Y){var G=false,y;if(x&&Y){y=E.Dom.getAttribute(x,F)||J;if(Y.exec){G=Y.test(y);}else{G=Y&&(B+y+B).indexOf(B+Y+B)>-1;}}else{}return G;},addClass:function(Y,G){return E.Dom.batch(Y,E.Dom._addClass,G);},_addClass:function(x,Y){var G=false,y;if(x&&Y){y=E.Dom.getAttribute(x,F)||J;if(!E.Dom._hasClass(x,Y)){E.Dom.setAttribute(x,F,A(y+B+Y));G=true;}}else{}return G;},removeClass:function(Y,G){return E.Dom.batch(Y,E.Dom._removeClass,G);},_removeClass:function(y,x){var Y=false,AA,z,G;if(y&&x){AA=E.Dom.getAttribute(y,F)||J;E.Dom.setAttribute(y,F,AA.replace(E.Dom._getClassRegex(x),J));z=E.Dom.getAttribute(y,F);if(AA!==z){E.Dom.setAttribute(y,F,A(z));Y=true;if(E.Dom.getAttribute(y,F)===""){G=(y.hasAttribute&&y.hasAttribute(g))?g:F;y.removeAttribute(G);}}}else{}return Y;},replaceClass:function(x,Y,G){return E.Dom.batch(x,E.Dom._replaceClass,{from:Y,to:G});
-},_replaceClass:function(y,x){var Y,AB,AA,G=false,z;if(y&&x){AB=x.from;AA=x.to;if(!AA){G=false;}else{if(!AB){G=E.Dom._addClass(y,x.to);}else{if(AB!==AA){z=E.Dom.getAttribute(y,F)||J;Y=(B+z.replace(E.Dom._getClassRegex(AB),B+AA)).split(E.Dom._getClassRegex(AA));Y.splice(1,0,B+AA);E.Dom.setAttribute(y,F,A(Y.join(J)));G=true;}}}}else{}return G;},generateId:function(G,x){x=x||"yui-gen";var Y=function(y){if(y&&y.id){return y.id;}var z=x+YAHOO.env._id_counter++;if(y){if(y[e].getElementById(z)){return E.Dom.generateId(y,z+x);}y.id=z;}return z;};return E.Dom.batch(G,Y,E.Dom,true)||Y.apply(E.Dom,arguments);},isAncestor:function(Y,x){Y=E.Dom.get(Y);x=E.Dom.get(x);var G=false;if((Y&&x)&&(Y[l]&&x[l])){if(Y.contains&&Y!==x){G=Y.contains(x);}else{if(Y.compareDocumentPosition){G=!!(Y.compareDocumentPosition(x)&16);}}}else{}return G;},inDocument:function(G,Y){return E.Dom._inDoc(E.Dom.get(G),Y);},_inDoc:function(Y,x){var G=false;if(Y&&Y[C]){x=x||Y[e];G=E.Dom.isAncestor(x[v],Y);}else{}return G;},getElementsBy:function(Y,AF,AB,AD,y,AC,AE){AF=AF||"*";AB=(AB)?E.Dom.get(AB):null||K;if(!AB){return[];}var x=[],G=AB.getElementsByTagName(AF);for(var z=0,AA=G.length;z<AA;++z){if(Y(G[z])){if(AE){x=G[z];break;}else{x[x.length]=G[z];}}}if(AD){E.Dom.batch(x,AD,y,AC);}return x;},getElementBy:function(x,G,Y){return E.Dom.getElementsBy(x,G,Y,null,null,null,true);},batch:function(x,AB,AA,z){var y=[],Y=(z)?AA:window;x=(x&&(x[C]||x.item))?x:E.Dom.get(x);if(x&&AB){if(x[C]||x.length===undefined){return AB.call(Y,x,AA);}for(var G=0;G<x.length;++G){y[y.length]=AB.call(Y,x[G],AA);}}else{return false;}return y;},getDocumentHeight:function(){var Y=(K[t]!=M||I)?K.body.scrollHeight:W.scrollHeight,G=Math.max(Y,E.Dom.getViewportHeight());return G;},getDocumentWidth:function(){var Y=(K[t]!=M||I)?K.body.scrollWidth:W.scrollWidth,G=Math.max(Y,E.Dom.getViewportWidth());return G;},getViewportHeight:function(){var G=self.innerHeight,Y=K[t];if((Y||T)&&!D){G=(Y==M)?W.clientHeight:K.body.clientHeight;}return G;},getViewportWidth:function(){var G=self.innerWidth,Y=K[t];if(Y||T){G=(Y==M)?W.clientWidth:K.body.clientWidth;}return G;},getAncestorBy:function(G,Y){while((G=G[Z])){if(E.Dom._testElement(G,Y)){return G;}}return null;},getAncestorByClassName:function(Y,G){Y=E.Dom.get(Y);if(!Y){return null;}var x=function(y){return E.Dom.hasClass(y,G);};return E.Dom.getAncestorBy(Y,x);},getAncestorByTagName:function(Y,G){Y=E.Dom.get(Y);if(!Y){return null;}var x=function(y){return y[C]&&y[C].toUpperCase()==G.toUpperCase();};return E.Dom.getAncestorBy(Y,x);},getPreviousSiblingBy:function(G,Y){while(G){G=G.previousSibling;if(E.Dom._testElement(G,Y)){return G;}}return null;},getPreviousSibling:function(G){G=E.Dom.get(G);if(!G){return null;}return E.Dom.getPreviousSiblingBy(G);},getNextSiblingBy:function(G,Y){while(G){G=G.nextSibling;if(E.Dom._testElement(G,Y)){return G;}}return null;},getNextSibling:function(G){G=E.Dom.get(G);if(!G){return null;}return E.Dom.getNextSiblingBy(G);},getFirstChildBy:function(G,x){var Y=(E.Dom._testElement(G.firstChild,x))?G.firstChild:null;return Y||E.Dom.getNextSiblingBy(G.firstChild,x);},getFirstChild:function(G,Y){G=E.Dom.get(G);if(!G){return null;}return E.Dom.getFirstChildBy(G);},getLastChildBy:function(G,x){if(!G){return null;}var Y=(E.Dom._testElement(G.lastChild,x))?G.lastChild:null;return Y||E.Dom.getPreviousSiblingBy(G.lastChild,x);},getLastChild:function(G){G=E.Dom.get(G);return E.Dom.getLastChildBy(G);},getChildrenBy:function(Y,y){var x=E.Dom.getFirstChildBy(Y,y),G=x?[x]:[];E.Dom.getNextSiblingBy(x,function(z){if(!y||y(z)){G[G.length]=z;}return false;});return G;},getChildren:function(G){G=E.Dom.get(G);if(!G){}return E.Dom.getChildrenBy(G);},getDocumentScrollLeft:function(G){G=G||K;return Math.max(G[v].scrollLeft,G.body.scrollLeft);},getDocumentScrollTop:function(G){G=G||K;return Math.max(G[v].scrollTop,G.body.scrollTop);},insertBefore:function(Y,G){Y=E.Dom.get(Y);G=E.Dom.get(G);if(!Y||!G||!G[Z]){return null;}return G[Z].insertBefore(Y,G);},insertAfter:function(Y,G){Y=E.Dom.get(Y);G=E.Dom.get(G);if(!Y||!G||!G[Z]){return null;}if(G.nextSibling){return G[Z].insertBefore(Y,G.nextSibling);}else{return G[Z].appendChild(Y);}},getClientRegion:function(){var x=E.Dom.getDocumentScrollTop(),Y=E.Dom.getDocumentScrollLeft(),y=E.Dom.getViewportWidth()+Y,G=E.Dom.getViewportHeight()+x;return new E.Region(x,y,G,Y);},setAttribute:function(Y,G,x){G=E.Dom.CUSTOM_ATTRIBUTES[G]||G;Y.setAttribute(G,x);},getAttribute:function(Y,G){G=E.Dom.CUSTOM_ATTRIBUTES[G]||G;return Y.getAttribute(G);},_toCamel:function(Y){var x=d;function G(y,z){return z.toUpperCase();}return x[Y]||(x[Y]=Y.indexOf("-")===-1?Y:Y.replace(/-([a-z])/gi,G));},_getClassRegex:function(Y){var G;if(Y!==undefined){if(Y.exec){G=Y;}else{G=h[Y];if(!G){Y=Y.replace(E.Dom._patterns.CLASS_RE_TOKENS,"\\$1");G=h[Y]=new RegExp(s+Y+k,U);}}}return G;},_patterns:{ROOT_TAG:/^body|html$/i,CLASS_RE_TOKENS:/([\.\(\)\^\$\*\+\?\|\[\]\{\}])/g},_testElement:function(G,Y){return G&&G[l]==1&&(!Y||Y(G));},_calcBorders:function(x,y){var Y=parseInt(E.Dom[w](x,R),10)||0,G=parseInt(E.Dom[w](x,q),10)||0;if(H){if(N.test(x[C])){Y=0;G=0;}}y[0]+=G;y[1]+=Y;return y;}};var S=E.Dom[w];if(m.opera){E.Dom[w]=function(Y,G){var x=S(Y,G);if(X.test(G)){x=E.Dom.Color.toRGB(x);}return x;};}if(m.webkit){E.Dom[w]=function(Y,G){var x=S(Y,G);if(x==="rgba(0, 0, 0, 0)"){x="transparent";}return x;};}})();YAHOO.util.Region=function(C,D,A,B){this.top=C;this.y=C;this[1]=C;this.right=D;this.bottom=A;this.left=B;this.x=B;this[0]=B;this.width=this.right-this.left;this.height=this.bottom-this.top;};YAHOO.util.Region.prototype.contains=function(A){return(A.left>=this.left&&A.right<=this.right&&A.top>=this.top&&A.bottom<=this.bottom);};YAHOO.util.Region.prototype.getArea=function(){return((this.bottom-this.top)*(this.right-this.left));};YAHOO.util.Region.prototype.intersect=function(E){var C=Math.max(this.top,E.top),D=Math.min(this.right,E.right),A=Math.min(this.bottom,E.bottom),B=Math.max(this.left,E.left);if(A>=C&&D>=B){return new YAHOO.util.Region(C,D,A,B);
-}else{return null;}};YAHOO.util.Region.prototype.union=function(E){var C=Math.min(this.top,E.top),D=Math.max(this.right,E.right),A=Math.max(this.bottom,E.bottom),B=Math.min(this.left,E.left);return new YAHOO.util.Region(C,D,A,B);};YAHOO.util.Region.prototype.toString=function(){return("Region {"+"top: "+this.top+", right: "+this.right+", bottom: "+this.bottom+", left: "+this.left+", height: "+this.height+", width: "+this.width+"}");};YAHOO.util.Region.getRegion=function(D){var F=YAHOO.util.Dom.getXY(D),C=F[1],E=F[0]+D.offsetWidth,A=F[1]+D.offsetHeight,B=F[0];return new YAHOO.util.Region(C,E,A,B);};YAHOO.util.Point=function(A,B){if(YAHOO.lang.isArray(A)){B=A[1];A=A[0];}YAHOO.util.Point.superclass.constructor.call(this,B,A,B,A);};YAHOO.extend(YAHOO.util.Point,YAHOO.util.Region);(function(){var B=YAHOO.util,A="clientTop",F="clientLeft",J="parentNode",K="right",W="hasLayout",I="px",U="opacity",L="auto",D="borderLeftWidth",G="borderTopWidth",P="borderRightWidth",V="borderBottomWidth",S="visible",Q="transparent",N="height",E="width",H="style",T="currentStyle",R=/^width|height$/,O=/^(\d[.\d]*)+(em|ex|px|gd|rem|vw|vh|vm|ch|mm|cm|in|pt|pc|deg|rad|ms|s|hz|khz|%){1}?/i,M={get:function(X,Z){var Y="",a=X[T][Z];if(Z===U){Y=B.Dom.getStyle(X,U);}else{if(!a||(a.indexOf&&a.indexOf(I)>-1)){Y=a;}else{if(B.Dom.IE_COMPUTED[Z]){Y=B.Dom.IE_COMPUTED[Z](X,Z);}else{if(O.test(a)){Y=B.Dom.IE.ComputedStyle.getPixel(X,Z);}else{Y=a;}}}}return Y;},getOffset:function(Z,e){var b=Z[T][e],X=e.charAt(0).toUpperCase()+e.substr(1),c="offset"+X,Y="pixel"+X,a="",d;if(b==L){d=Z[c];if(d===undefined){a=0;}a=d;if(R.test(e)){Z[H][e]=d;if(Z[c]>d){a=d-(Z[c]-d);}Z[H][e]=L;}}else{if(!Z[H][Y]&&!Z[H][e]){Z[H][e]=b;}a=Z[H][Y];}return a+I;},getBorderWidth:function(X,Z){var Y=null;if(!X[T][W]){X[H].zoom=1;}switch(Z){case G:Y=X[A];break;case V:Y=X.offsetHeight-X.clientHeight-X[A];break;case D:Y=X[F];break;case P:Y=X.offsetWidth-X.clientWidth-X[F];break;}return Y+I;},getPixel:function(Y,X){var a=null,b=Y[T][K],Z=Y[T][X];Y[H][K]=Z;a=Y[H].pixelRight;Y[H][K]=b;return a+I;},getMargin:function(Y,X){var Z;if(Y[T][X]==L){Z=0+I;}else{Z=B.Dom.IE.ComputedStyle.getPixel(Y,X);}return Z;},getVisibility:function(Y,X){var Z;while((Z=Y[T])&&Z[X]=="inherit"){Y=Y[J];}return(Z)?Z[X]:S;},getColor:function(Y,X){return B.Dom.Color.toRGB(Y[T][X])||Q;},getBorderColor:function(Y,X){var Z=Y[T],a=Z[X]||Z.color;return B.Dom.Color.toRGB(B.Dom.Color.toHex(a));}},C={};C.top=C.right=C.bottom=C.left=C[E]=C[N]=M.getOffset;C.color=M.getColor;C[G]=C[P]=C[V]=C[D]=M.getBorderWidth;C.marginTop=C.marginRight=C.marginBottom=C.marginLeft=M.getMargin;C.visibility=M.getVisibility;C.borderColor=C.borderTopColor=C.borderRightColor=C.borderBottomColor=C.borderLeftColor=M.getBorderColor;B.Dom.IE_COMPUTED=C;B.Dom.IE_ComputedStyle=M;})();(function(){var C="toString",A=parseInt,B=RegExp,D=YAHOO.util;D.Dom.Color={KEYWORDS:{black:"000",silver:"c0c0c0",gray:"808080",white:"fff",maroon:"800000",red:"f00",purple:"800080",fuchsia:"f0f",green:"008000",lime:"0f0",olive:"808000",yellow:"ff0",navy:"000080",blue:"00f",teal:"008080",aqua:"0ff"},re_RGB:/^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i,re_hex:/^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i,re_hex3:/([0-9A-F])/gi,toRGB:function(E){if(!D.Dom.Color.re_RGB.test(E)){E=D.Dom.Color.toHex(E);}if(D.Dom.Color.re_hex.exec(E)){E="rgb("+[A(B.$1,16),A(B.$2,16),A(B.$3,16)].join(", ")+")";}return E;},toHex:function(H){H=D.Dom.Color.KEYWORDS[H]||H;if(D.Dom.Color.re_RGB.exec(H)){var G=(B.$1.length===1)?"0"+B.$1:Number(B.$1),F=(B.$2.length===1)?"0"+B.$2:Number(B.$2),E=(B.$3.length===1)?"0"+B.$3:Number(B.$3);H=[G[C](16),F[C](16),E[C](16)].join("");}if(H.length<6){H=H.replace(D.Dom.Color.re_hex3,"$1$1");}if(H!=="transparent"&&H.indexOf("#")<0){H="#"+H;}return H.toLowerCase();}};}());YAHOO.register("dom",YAHOO.util.Dom,{version:"2.7.0",build:"1796"});YAHOO.util.CustomEvent=function(D,C,B,A){this.type=D;this.scope=C||window;this.silent=B;this.signature=A||YAHOO.util.CustomEvent.LIST;this.subscribers=[];if(!this.silent){}var E="_YUICEOnSubscribe";if(D!==E){this.subscribeEvent=new YAHOO.util.CustomEvent(E,this,true);}this.lastError=null;};YAHOO.util.CustomEvent.LIST=0;YAHOO.util.CustomEvent.FLAT=1;YAHOO.util.CustomEvent.prototype={subscribe:function(A,B,C){if(!A){throw new Error("Invalid callback for subscriber to '"+this.type+"'");}if(this.subscribeEvent){this.subscribeEvent.fire(A,B,C);}this.subscribers.push(new YAHOO.util.Subscriber(A,B,C));},unsubscribe:function(D,F){if(!D){return this.unsubscribeAll();}var E=false;for(var B=0,A=this.subscribers.length;B<A;++B){var C=this.subscribers[B];if(C&&C.contains(D,F)){this._delete(B);E=true;}}return E;},fire:function(){this.lastError=null;var K=[],E=this.subscribers.length;if(!E&&this.silent){return true;}var I=[].slice.call(arguments,0),G=true,D,J=false;if(!this.silent){}var C=this.subscribers.slice(),A=YAHOO.util.Event.throwErrors;for(D=0;D<E;++D){var M=C[D];if(!M){J=true;}else{if(!this.silent){}var L=M.getScope(this.scope);if(this.signature==YAHOO.util.CustomEvent.FLAT){var B=null;if(I.length>0){B=I[0];}try{G=M.fn.call(L,B,M.obj);}catch(F){this.lastError=F;if(A){throw F;}}}else{try{G=M.fn.call(L,this.type,I,M.obj);}catch(H){this.lastError=H;if(A){throw H;}}}if(false===G){if(!this.silent){}break;}}}return(G!==false);},unsubscribeAll:function(){var A=this.subscribers.length,B;for(B=A-1;B>-1;B--){this._delete(B);}this.subscribers=[];return A;},_delete:function(A){var B=this.subscribers[A];if(B){delete B.fn;delete B.obj;}this.subscribers.splice(A,1);},toString:function(){return"CustomEvent: "+"'"+this.type+"', "+"context: "+this.scope;}};YAHOO.util.Subscriber=function(A,B,C){this.fn=A;this.obj=YAHOO.lang.isUndefined(B)?null:B;this.overrideContext=C;};YAHOO.util.Subscriber.prototype.getScope=function(A){if(this.overrideContext){if(this.overrideContext===true){return this.obj;}else{return this.overrideContext;}}return A;};YAHOO.util.Subscriber.prototype.contains=function(A,B){if(B){return(this.fn==A&&this.obj==B);}else{return(this.fn==A);}};YAHOO.util.Subscriber.prototype.toString=function(){return"Subscriber { obj: "+this.obj+", overrideContext: "+(this.overrideContext||"no")+" }";};if(!YAHOO.util.Event){YAHOO.util.Event=function(){var H=false;var I=[];var J=[];var G=[];var E=[];var C=0;var F=[];var B=[];var A=0;var D={63232:38,63233:40,63234:37,63235:39,63276:33,63277:34,25:9};var K=YAHOO.env.ua.ie?"focusin":"focus";var L=YAHOO.env.ua.ie?"focusout":"blur";return{POLL_RETRYS:2000,POLL_INTERVAL:20,EL:0,TYPE:1,FN:2,WFN:3,UNLOAD_OBJ:3,ADJ_SCOPE:4,OBJ:5,OVERRIDE:6,lastError:null,isSafari:YAHOO.env.ua.webkit,webkit:YAHOO.env.ua.webkit,isIE:YAHOO.env.ua.ie,_interval:null,_dri:null,DOMReady:false,throwErrors:false,startInterval:function(){if(!this._interval){var M=this;var N=function(){M._tryPreloadAttach();};this._interval=setInterval(N,this.POLL_INTERVAL);}},onAvailable:function(S,O,Q,R,P){var M=(YAHOO.lang.isString(S))?[S]:S;for(var N=0;N<M.length;N=N+1){F.push({id:M[N],fn:O,obj:Q,overrideContext:R,checkReady:P});}C=this.POLL_RETRYS;this.startInterval();},onContentReady:function(P,M,N,O){this.onAvailable(P,M,N,O,true);},onDOMReady:function(M,N,O){if(this.DOMReady){setTimeout(function(){var P=window;if(O){if(O===true){P=N;}else{P=O;}}M.call(P,"DOMReady",[],N);},0);}else{this.DOMReadyEvent.subscribe(M,N,O);}},_addListener:function(O,M,Y,S,W,b){if(!Y||!Y.call){return false;}if(this._isValidCollection(O)){var Z=true;for(var T=0,V=O.length;T<V;++T){Z=this.on(O[T],M,Y,S,W)&&Z;}return Z;}else{if(YAHOO.lang.isString(O)){var R=this.getEl(O);if(R){O=R;}else{this.onAvailable(O,function(){YAHOO.util.Event.on(O,M,Y,S,W);});return true;}}}if(!O){return false;}if("unload"==M&&S!==this){J[J.length]=[O,M,Y,S,W];return true;}var N=O;if(W){if(W===true){N=S;}else{N=W;}}var P=function(c){return Y.call(N,YAHOO.util.Event.getEvent(c,O),S);};var a=[O,M,Y,P,N,S,W];var U=I.length;I[U]=a;if(this.useLegacyEvent(O,M)){var Q=this.getLegacyIndex(O,M);if(Q==-1||O!=G[Q][0]){Q=G.length;B[O.id+M]=Q;G[Q]=[O,M,O["on"+M]];E[Q]=[];O["on"+M]=function(c){YAHOO.util.Event.fireLegacyEvent(YAHOO.util.Event.getEvent(c),Q);};}E[Q].push(a);}else{try{this._simpleAdd(O,M,P,b);}catch(X){this.lastError=X;this.removeListener(O,M,Y);return false;}}return true;},addListener:function(N,Q,M,O,P){return this._addListener(N,Q,M,O,P,false);},addFocusListener:function(N,M,O,P){return this._addListener(N,K,M,O,P,true);},removeFocusListener:function(N,M){return this.removeListener(N,K,M);},addBlurListener:function(N,M,O,P){return this._addListener(N,L,M,O,P,true);},removeBlurListener:function(N,M){return this.removeListener(N,L,M);},fireLegacyEvent:function(R,P){var T=true,M,V,U,N,S;V=E[P].slice();for(var O=0,Q=V.length;O<Q;++O){U=V[O];if(U&&U[this.WFN]){N=U[this.ADJ_SCOPE];S=U[this.WFN].call(N,R);T=(T&&S);}}M=G[P];if(M&&M[2]){M[2](R);}return T;},getLegacyIndex:function(N,O){var M=this.generateId(N)+O;if(typeof B[M]=="undefined"){return -1;}else{return B[M];}},useLegacyEvent:function(M,N){return(this.webkit&&this.webkit<419&&("click"==N||"dblclick"==N));},removeListener:function(N,M,V){var Q,T,X;if(typeof N=="string"){N=this.getEl(N);}else{if(this._isValidCollection(N)){var W=true;for(Q=N.length-1;Q>-1;Q--){W=(this.removeListener(N[Q],M,V)&&W);}return W;}}if(!V||!V.call){return this.purgeElement(N,false,M);}if("unload"==M){for(Q=J.length-1;Q>-1;Q--){X=J[Q];if(X&&X[0]==N&&X[1]==M&&X[2]==V){J.splice(Q,1);return true;}}return false;}var R=null;var S=arguments[3];if("undefined"===typeof S){S=this._getCacheIndex(N,M,V);}if(S>=0){R=I[S];}if(!N||!R){return false;}if(this.useLegacyEvent(N,M)){var P=this.getLegacyIndex(N,M);var O=E[P];if(O){for(Q=0,T=O.length;Q<T;++Q){X=O[Q];if(X&&X[this.EL]==N&&X[this.TYPE]==M&&X[this.FN]==V){O.splice(Q,1);break;}}}}else{try{this._simpleRemove(N,M,R[this.WFN],false);}catch(U){this.lastError=U;return false;}}delete I[S][this.WFN];delete I[S][this.FN];
-I.splice(S,1);return true;},getTarget:function(O,N){var M=O.target||O.srcElement;return this.resolveTextNode(M);},resolveTextNode:function(N){try{if(N&&3==N.nodeType){return N.parentNode;}}catch(M){}return N;},getPageX:function(N){var M=N.pageX;if(!M&&0!==M){M=N.clientX||0;if(this.isIE){M+=this._getScrollLeft();}}return M;},getPageY:function(M){var N=M.pageY;if(!N&&0!==N){N=M.clientY||0;if(this.isIE){N+=this._getScrollTop();}}return N;},getXY:function(M){return[this.getPageX(M),this.getPageY(M)];},getRelatedTarget:function(N){var M=N.relatedTarget;if(!M){if(N.type=="mouseout"){M=N.toElement;}else{if(N.type=="mouseover"){M=N.fromElement;}}}return this.resolveTextNode(M);},getTime:function(O){if(!O.time){var N=new Date().getTime();try{O.time=N;}catch(M){this.lastError=M;return N;}}return O.time;},stopEvent:function(M){this.stopPropagation(M);this.preventDefault(M);},stopPropagation:function(M){if(M.stopPropagation){M.stopPropagation();}else{M.cancelBubble=true;}},preventDefault:function(M){if(M.preventDefault){M.preventDefault();}else{M.returnValue=false;}},getEvent:function(O,M){var N=O||window.event;if(!N){var P=this.getEvent.caller;while(P){N=P.arguments[0];if(N&&Event==N.constructor){break;}P=P.caller;}}return N;},getCharCode:function(N){var M=N.keyCode||N.charCode||0;if(YAHOO.env.ua.webkit&&(M in D)){M=D[M];}return M;},_getCacheIndex:function(Q,R,P){for(var O=0,N=I.length;O<N;O=O+1){var M=I[O];if(M&&M[this.FN]==P&&M[this.EL]==Q&&M[this.TYPE]==R){return O;}}return -1;},generateId:function(M){var N=M.id;if(!N){N="yuievtautoid-"+A;++A;M.id=N;}return N;},_isValidCollection:function(N){try{return(N&&typeof N!=="string"&&N.length&&!N.tagName&&!N.alert&&typeof N[0]!=="undefined");}catch(M){return false;}},elCache:{},getEl:function(M){return(typeof M==="string")?document.getElementById(M):M;},clearCache:function(){},DOMReadyEvent:new YAHOO.util.CustomEvent("DOMReady",this),_load:function(N){if(!H){H=true;var M=YAHOO.util.Event;M._ready();M._tryPreloadAttach();}},_ready:function(N){var M=YAHOO.util.Event;if(!M.DOMReady){M.DOMReady=true;M.DOMReadyEvent.fire();M._simpleRemove(document,"DOMContentLoaded",M._ready);}},_tryPreloadAttach:function(){if(F.length===0){C=0;if(this._interval){clearInterval(this._interval);this._interval=null;}return;}if(this.locked){return;}if(this.isIE){if(!this.DOMReady){this.startInterval();return;}}this.locked=true;var S=!H;if(!S){S=(C>0&&F.length>0);}var R=[];var T=function(V,W){var U=V;if(W.overrideContext){if(W.overrideContext===true){U=W.obj;}else{U=W.overrideContext;}}W.fn.call(U,W.obj);};var N,M,Q,P,O=[];for(N=0,M=F.length;N<M;N=N+1){Q=F[N];if(Q){P=this.getEl(Q.id);if(P){if(Q.checkReady){if(H||P.nextSibling||!S){O.push(Q);F[N]=null;}}else{T(P,Q);F[N]=null;}}else{R.push(Q);}}}for(N=0,M=O.length;N<M;N=N+1){Q=O[N];T(this.getEl(Q.id),Q);}C--;if(S){for(N=F.length-1;N>-1;N--){Q=F[N];if(!Q||!Q.id){F.splice(N,1);}}this.startInterval();}else{if(this._interval){clearInterval(this._interval);this._interval=null;}}this.locked=false;},purgeElement:function(Q,R,T){var O=(YAHOO.lang.isString(Q))?this.getEl(Q):Q;var S=this.getListeners(O,T),P,M;if(S){for(P=S.length-1;P>-1;P--){var N=S[P];this.removeListener(O,N.type,N.fn);}}if(R&&O&&O.childNodes){for(P=0,M=O.childNodes.length;P<M;++P){this.purgeElement(O.childNodes[P],R,T);}}},getListeners:function(O,M){var R=[],N;if(!M){N=[I,J];}else{if(M==="unload"){N=[J];}else{N=[I];}}var T=(YAHOO.lang.isString(O))?this.getEl(O):O;for(var Q=0;Q<N.length;Q=Q+1){var V=N[Q];if(V){for(var S=0,U=V.length;S<U;++S){var P=V[S];if(P&&P[this.EL]===T&&(!M||M===P[this.TYPE])){R.push({type:P[this.TYPE],fn:P[this.FN],obj:P[this.OBJ],adjust:P[this.OVERRIDE],scope:P[this.ADJ_SCOPE],index:S});}}}}return(R.length)?R:null;},_unload:function(T){var N=YAHOO.util.Event,Q,P,O,S,R,U=J.slice(),M;for(Q=0,S=J.length;Q<S;++Q){O=U[Q];if(O){M=window;if(O[N.ADJ_SCOPE]){if(O[N.ADJ_SCOPE]===true){M=O[N.UNLOAD_OBJ];}else{M=O[N.ADJ_SCOPE];}}O[N.FN].call(M,N.getEvent(T,O[N.EL]),O[N.UNLOAD_OBJ]);U[Q]=null;}}O=null;M=null;J=null;if(I){for(P=I.length-1;P>-1;P--){O=I[P];if(O){N.removeListener(O[N.EL],O[N.TYPE],O[N.FN],P);}}O=null;}G=null;N._simpleRemove(window,"unload",N._unload);},_getScrollLeft:function(){return this._getScroll()[1];},_getScrollTop:function(){return this._getScroll()[0];},_getScroll:function(){var M=document.documentElement,N=document.body;if(M&&(M.scrollTop||M.scrollLeft)){return[M.scrollTop,M.scrollLeft];}else{if(N){return[N.scrollTop,N.scrollLeft];}else{return[0,0];}}},regCE:function(){},_simpleAdd:function(){if(window.addEventListener){return function(O,P,N,M){O.addEventListener(P,N,(M));};}else{if(window.attachEvent){return function(O,P,N,M){O.attachEvent("on"+P,N);};}else{return function(){};}}}(),_simpleRemove:function(){if(window.removeEventListener){return function(O,P,N,M){O.removeEventListener(P,N,(M));};}else{if(window.detachEvent){return function(N,O,M){N.detachEvent("on"+O,M);};}else{return function(){};}}}()};}();(function(){var EU=YAHOO.util.Event;EU.on=EU.addListener;EU.onFocus=EU.addFocusListener;EU.onBlur=EU.addBlurListener;
-/* DOMReady: based on work by: Dean Edwards/John Resig/Matthias Miller */
-if(EU.isIE){YAHOO.util.Event.onDOMReady(YAHOO.util.Event._tryPreloadAttach,YAHOO.util.Event,true);var n=document.createElement("p");EU._dri=setInterval(function(){try{n.doScroll("left");clearInterval(EU._dri);EU._dri=null;EU._ready();n=null;}catch(ex){}},EU.POLL_INTERVAL);}else{if(EU.webkit&&EU.webkit<525){EU._dri=setInterval(function(){var rs=document.readyState;if("loaded"==rs||"complete"==rs){clearInterval(EU._dri);EU._dri=null;EU._ready();}},EU.POLL_INTERVAL);}else{EU._simpleAdd(document,"DOMContentLoaded",EU._ready);}}EU._simpleAdd(window,"load",EU._load);EU._simpleAdd(window,"unload",EU._unload);EU._tryPreloadAttach();})();}YAHOO.util.EventProvider=function(){};YAHOO.util.EventProvider.prototype={__yui_events:null,__yui_subscribers:null,subscribe:function(A,C,F,E){this.__yui_events=this.__yui_events||{};var D=this.__yui_events[A];if(D){D.subscribe(C,F,E);
-}else{this.__yui_subscribers=this.__yui_subscribers||{};var B=this.__yui_subscribers;if(!B[A]){B[A]=[];}B[A].push({fn:C,obj:F,overrideContext:E});}},unsubscribe:function(C,E,G){this.__yui_events=this.__yui_events||{};var A=this.__yui_events;if(C){var F=A[C];if(F){return F.unsubscribe(E,G);}}else{var B=true;for(var D in A){if(YAHOO.lang.hasOwnProperty(A,D)){B=B&&A[D].unsubscribe(E,G);}}return B;}return false;},unsubscribeAll:function(A){return this.unsubscribe(A);},createEvent:function(G,D){this.__yui_events=this.__yui_events||{};var A=D||{};var I=this.__yui_events;if(I[G]){}else{var H=A.scope||this;var E=(A.silent);var B=new YAHOO.util.CustomEvent(G,H,E,YAHOO.util.CustomEvent.FLAT);I[G]=B;if(A.onSubscribeCallback){B.subscribeEvent.subscribe(A.onSubscribeCallback);}this.__yui_subscribers=this.__yui_subscribers||{};var F=this.__yui_subscribers[G];if(F){for(var C=0;C<F.length;++C){B.subscribe(F[C].fn,F[C].obj,F[C].overrideContext);}}}return I[G];},fireEvent:function(E,D,A,C){this.__yui_events=this.__yui_events||{};var G=this.__yui_events[E];if(!G){return null;}var B=[];for(var F=1;F<arguments.length;++F){B.push(arguments[F]);}return G.fire.apply(G,B);},hasEvent:function(A){if(this.__yui_events){if(this.__yui_events[A]){return true;}}return false;}};(function(){var A=YAHOO.util.Event,C=YAHOO.lang;YAHOO.util.KeyListener=function(D,I,E,F){if(!D){}else{if(!I){}else{if(!E){}}}if(!F){F=YAHOO.util.KeyListener.KEYDOWN;}var G=new YAHOO.util.CustomEvent("keyPressed");this.enabledEvent=new YAHOO.util.CustomEvent("enabled");this.disabledEvent=new YAHOO.util.CustomEvent("disabled");if(C.isString(D)){D=document.getElementById(D);}if(C.isFunction(E)){G.subscribe(E);}else{G.subscribe(E.fn,E.scope,E.correctScope);}function H(O,N){if(!I.shift){I.shift=false;}if(!I.alt){I.alt=false;}if(!I.ctrl){I.ctrl=false;}if(O.shiftKey==I.shift&&O.altKey==I.alt&&O.ctrlKey==I.ctrl){var J,M=I.keys,L;if(YAHOO.lang.isArray(M)){for(var K=0;K<M.length;K++){J=M[K];L=A.getCharCode(O);if(J==L){G.fire(L,O);break;}}}else{L=A.getCharCode(O);if(M==L){G.fire(L,O);}}}}this.enable=function(){if(!this.enabled){A.on(D,F,H);this.enabledEvent.fire(I);}this.enabled=true;};this.disable=function(){if(this.enabled){A.removeListener(D,F,H);this.disabledEvent.fire(I);}this.enabled=false;};this.toString=function(){return"KeyListener ["+I.keys+"] "+D.tagName+(D.id?"["+D.id+"]":"");};};var B=YAHOO.util.KeyListener;B.KEYDOWN="keydown";B.KEYUP="keyup";B.KEY={ALT:18,BACK_SPACE:8,CAPS_LOCK:20,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,META:224,NUM_LOCK:144,PAGE_DOWN:34,PAGE_UP:33,PAUSE:19,PRINTSCREEN:44,RIGHT:39,SCROLL_LOCK:145,SHIFT:16,SPACE:32,TAB:9,UP:38};})();YAHOO.register("event",YAHOO.util.Event,{version:"2.7.0",build:"1796"});YAHOO.register("yahoo-dom-event", YAHOO, {version: "2.7.0", build: "1796"});
-/*
-Copyright (c) 2009, Yahoo! Inc. All rights reserved.
-Code licensed under the BSD License:
-http://developer.yahoo.net/yui/license.txt
-version: 2.7.0
-*/
-if(!YAHOO.util.DragDropMgr){YAHOO.util.DragDropMgr=function(){var A=YAHOO.util.Event,B=YAHOO.util.Dom;return{useShim:false,_shimActive:false,_shimState:false,_debugShim:false,_createShim:function(){var C=document.createElement("div");C.id="yui-ddm-shim";if(document.body.firstChild){document.body.insertBefore(C,document.body.firstChild);}else{document.body.appendChild(C);}C.style.display="none";C.style.backgroundColor="red";C.style.position="absolute";C.style.zIndex="99999";B.setStyle(C,"opacity","0");this._shim=C;A.on(C,"mouseup",this.handleMouseUp,this,true);A.on(C,"mousemove",this.handleMouseMove,this,true);A.on(window,"scroll",this._sizeShim,this,true);},_sizeShim:function(){if(this._shimActive){var C=this._shim;C.style.height=B.getDocumentHeight()+"px";C.style.width=B.getDocumentWidth()+"px";C.style.top="0";C.style.left="0";}},_activateShim:function(){if(this.useShim){if(!this._shim){this._createShim();}this._shimActive=true;var C=this._shim,D="0";if(this._debugShim){D=".5";}B.setStyle(C,"opacity",D);this._sizeShim();C.style.display="block";}},_deactivateShim:function(){this._shim.style.display="none";this._shimActive=false;},_shim:null,ids:{},handleIds:{},dragCurrent:null,dragOvers:{},deltaX:0,deltaY:0,preventDefault:true,stopPropagation:true,initialized:false,locked:false,interactionInfo:null,init:function(){this.initialized=true;},POINT:0,INTERSECT:1,STRICT_INTERSECT:2,mode:0,_execOnAll:function(E,D){for(var F in this.ids){for(var C in this.ids[F]){var G=this.ids[F][C];if(!this.isTypeOfDD(G)){continue;}G[E].apply(G,D);}}},_onLoad:function(){this.init();A.on(document,"mouseup",this.handleMouseUp,this,true);A.on(document,"mousemove",this.handleMouseMove,this,true);A.on(window,"unload",this._onUnload,this,true);A.on(window,"resize",this._onResize,this,true);},_onResize:function(C){this._execOnAll("resetConstraints",[]);},lock:function(){this.locked=true;},unlock:function(){this.locked=false;},isLocked:function(){return this.locked;},locationCache:{},useCache:true,clickPixelThresh:3,clickTimeThresh:1000,dragThreshMet:false,clickTimeout:null,startX:0,startY:0,fromTimeout:false,regDragDrop:function(D,C){if(!this.initialized){this.init();}if(!this.ids[C]){this.ids[C]={};}this.ids[C][D.id]=D;},removeDDFromGroup:function(E,C){if(!this.ids[C]){this.ids[C]={};}var D=this.ids[C];if(D&&D[E.id]){delete D[E.id];}},_remove:function(E){for(var D in E.groups){if(D){var C=this.ids[D];if(C&&C[E.id]){delete C[E.id];}}}delete this.handleIds[E.id];},regHandle:function(D,C){if(!this.handleIds[D]){this.handleIds[D]={};}this.handleIds[D][C]=C;},isDragDrop:function(C){return(this.getDDById(C))?true:false;},getRelated:function(H,D){var G=[];for(var F in H.groups){for(var E in this.ids[F]){var C=this.ids[F][E];if(!this.isTypeOfDD(C)){continue;}if(!D||C.isTarget){G[G.length]=C;}}}return G;},isLegalTarget:function(G,F){var D=this.getRelated(G,true);for(var E=0,C=D.length;E<C;++E){if(D[E].id==F.id){return true;}}return false;},isTypeOfDD:function(C){return(C&&C.__ygDragDrop);},isHandle:function(D,C){return(this.handleIds[D]&&this.handleIds[D][C]);},getDDById:function(D){for(var C in this.ids){if(this.ids[C][D]){return this.ids[C][D];}}return null;},handleMouseDown:function(E,D){this.currentTarget=YAHOO.util.Event.getTarget(E);this.dragCurrent=D;var C=D.getEl();this.startX=YAHOO.util.Event.getPageX(E);this.startY=YAHOO.util.Event.getPageY(E);this.deltaX=this.startX-C.offsetLeft;this.deltaY=this.startY-C.offsetTop;this.dragThreshMet=false;this.clickTimeout=setTimeout(function(){var F=YAHOO.util.DDM;F.startDrag(F.startX,F.startY);F.fromTimeout=true;},this.clickTimeThresh);},startDrag:function(C,E){if(this.dragCurrent&&this.dragCurrent.useShim){this._shimState=this.useShim;this.useShim=true;}this._activateShim();clearTimeout(this.clickTimeout);var D=this.dragCurrent;if(D&&D.events.b4StartDrag){D.b4StartDrag(C,E);D.fireEvent("b4StartDragEvent",{x:C,y:E});}if(D&&D.events.startDrag){D.startDrag(C,E);D.fireEvent("startDragEvent",{x:C,y:E});}this.dragThreshMet=true;},handleMouseUp:function(C){if(this.dragCurrent){clearTimeout(this.clickTimeout);if(this.dragThreshMet){if(this.fromTimeout){this.fromTimeout=false;this.handleMouseMove(C);}this.fromTimeout=false;this.fireEvents(C,true);}else{}this.stopDrag(C);this.stopEvent(C);}},stopEvent:function(C){if(this.stopPropagation){YAHOO.util.Event.stopPropagation(C);}if(this.preventDefault){YAHOO.util.Event.preventDefault(C);}},stopDrag:function(E,D){var C=this.dragCurrent;if(C&&!D){if(this.dragThreshMet){if(C.events.b4EndDrag){C.b4EndDrag(E);C.fireEvent("b4EndDragEvent",{e:E});}if(C.events.endDrag){C.endDrag(E);C.fireEvent("endDragEvent",{e:E});}}if(C.events.mouseUp){C.onMouseUp(E);C.fireEvent("mouseUpEvent",{e:E});}}if(this._shimActive){this._deactivateShim();if(this.dragCurrent&&this.dragCurrent.useShim){this.useShim=this._shimState;this._shimState=false;}}this.dragCurrent=null;this.dragOvers={};},handleMouseMove:function(F){var C=this.dragCurrent;if(C){if(YAHOO.util.Event.isIE&&!F.button){this.stopEvent(F);return this.handleMouseUp(F);}else{if(F.clientX<0||F.clientY<0){}}if(!this.dragThreshMet){var E=Math.abs(this.startX-YAHOO.util.Event.getPageX(F));var D=Math.abs(this.startY-YAHOO.util.Event.getPageY(F));if(E>this.clickPixelThresh||D>this.clickPixelThresh){this.startDrag(this.startX,this.startY);}}if(this.dragThreshMet){if(C&&C.events.b4Drag){C.b4Drag(F);C.fireEvent("b4DragEvent",{e:F});}if(C&&C.events.drag){C.onDrag(F);C.fireEvent("dragEvent",{e:F});}if(C){this.fireEvents(F,false);}}this.stopEvent(F);}},fireEvents:function(V,L){var a=this.dragCurrent;if(!a||a.isLocked()||a.dragOnly){return;}var N=YAHOO.util.Event.getPageX(V),M=YAHOO.util.Event.getPageY(V),P=new YAHOO.util.Point(N,M),K=a.getTargetCoord(P.x,P.y),F=a.getDragEl(),E=["out","over","drop","enter"],U=new YAHOO.util.Region(K.y,K.x+F.offsetWidth,K.y+F.offsetHeight,K.x),I=[],D={},Q=[],c={outEvts:[],overEvts:[],dropEvts:[],enterEvts:[]};for(var S in this.dragOvers){var d=this.dragOvers[S];if(!this.isTypeOfDD(d)){continue;
-}if(!this.isOverTarget(P,d,this.mode,U)){c.outEvts.push(d);}I[S]=true;delete this.dragOvers[S];}for(var R in a.groups){if("string"!=typeof R){continue;}for(S in this.ids[R]){var G=this.ids[R][S];if(!this.isTypeOfDD(G)){continue;}if(G.isTarget&&!G.isLocked()&&G!=a){if(this.isOverTarget(P,G,this.mode,U)){D[R]=true;if(L){c.dropEvts.push(G);}else{if(!I[G.id]){c.enterEvts.push(G);}else{c.overEvts.push(G);}this.dragOvers[G.id]=G;}}}}}this.interactionInfo={out:c.outEvts,enter:c.enterEvts,over:c.overEvts,drop:c.dropEvts,point:P,draggedRegion:U,sourceRegion:this.locationCache[a.id],validDrop:L};for(var C in D){Q.push(C);}if(L&&!c.dropEvts.length){this.interactionInfo.validDrop=false;if(a.events.invalidDrop){a.onInvalidDrop(V);a.fireEvent("invalidDropEvent",{e:V});}}for(S=0;S<E.length;S++){var Y=null;if(c[E[S]+"Evts"]){Y=c[E[S]+"Evts"];}if(Y&&Y.length){var H=E[S].charAt(0).toUpperCase()+E[S].substr(1),X="onDrag"+H,J="b4Drag"+H,O="drag"+H+"Event",W="drag"+H;if(this.mode){if(a.events[J]){a[J](V,Y,Q);a.fireEvent(J+"Event",{event:V,info:Y,group:Q});}if(a.events[W]){a[X](V,Y,Q);a.fireEvent(O,{event:V,info:Y,group:Q});}}else{for(var Z=0,T=Y.length;Z<T;++Z){if(a.events[J]){a[J](V,Y[Z].id,Q[0]);a.fireEvent(J+"Event",{event:V,info:Y[Z].id,group:Q[0]});}if(a.events[W]){a[X](V,Y[Z].id,Q[0]);a.fireEvent(O,{event:V,info:Y[Z].id,group:Q[0]});}}}}}},getBestMatch:function(E){var G=null;var D=E.length;if(D==1){G=E[0];}else{for(var F=0;F<D;++F){var C=E[F];if(this.mode==this.INTERSECT&&C.cursorIsOver){G=C;break;}else{if(!G||!G.overlap||(C.overlap&&G.overlap.getArea()<C.overlap.getArea())){G=C;}}}}return G;},refreshCache:function(D){var F=D||this.ids;for(var C in F){if("string"!=typeof C){continue;}for(var E in this.ids[C]){var G=this.ids[C][E];if(this.isTypeOfDD(G)){var H=this.getLocation(G);if(H){this.locationCache[G.id]=H;}else{delete this.locationCache[G.id];}}}}},verifyEl:function(D){try{if(D){var C=D.offsetParent;if(C){return true;}}}catch(E){}return false;},getLocation:function(H){if(!this.isTypeOfDD(H)){return null;}var F=H.getEl(),K,E,D,M,L,N,C,J,G;try{K=YAHOO.util.Dom.getXY(F);}catch(I){}if(!K){return null;}E=K[0];D=E+F.offsetWidth;M=K[1];L=M+F.offsetHeight;N=M-H.padding[0];C=D+H.padding[1];J=L+H.padding[2];G=E-H.padding[3];return new YAHOO.util.Region(N,C,J,G);},isOverTarget:function(K,C,E,F){var G=this.locationCache[C.id];if(!G||!this.useCache){G=this.getLocation(C);this.locationCache[C.id]=G;}if(!G){return false;}C.cursorIsOver=G.contains(K);var J=this.dragCurrent;if(!J||(!E&&!J.constrainX&&!J.constrainY)){return C.cursorIsOver;}C.overlap=null;if(!F){var H=J.getTargetCoord(K.x,K.y);var D=J.getDragEl();F=new YAHOO.util.Region(H.y,H.x+D.offsetWidth,H.y+D.offsetHeight,H.x);}var I=F.intersect(G);if(I){C.overlap=I;return(E)?true:C.cursorIsOver;}else{return false;}},_onUnload:function(D,C){this.unregAll();},unregAll:function(){if(this.dragCurrent){this.stopDrag();this.dragCurrent=null;}this._execOnAll("unreg",[]);this.ids={};},elementCache:{},getElWrapper:function(D){var C=this.elementCache[D];if(!C||!C.el){C=this.elementCache[D]=new this.ElementWrapper(YAHOO.util.Dom.get(D));}return C;},getElement:function(C){return YAHOO.util.Dom.get(C);},getCss:function(D){var C=YAHOO.util.Dom.get(D);return(C)?C.style:null;},ElementWrapper:function(C){this.el=C||null;this.id=this.el&&C.id;this.css=this.el&&C.style;},getPosX:function(C){return YAHOO.util.Dom.getX(C);},getPosY:function(C){return YAHOO.util.Dom.getY(C);},swapNode:function(E,C){if(E.swapNode){E.swapNode(C);}else{var F=C.parentNode;var D=C.nextSibling;if(D==E){F.insertBefore(E,C);}else{if(C==E.nextSibling){F.insertBefore(C,E);}else{E.parentNode.replaceChild(C,E);F.insertBefore(E,D);}}}},getScroll:function(){var E,C,F=document.documentElement,D=document.body;if(F&&(F.scrollTop||F.scrollLeft)){E=F.scrollTop;C=F.scrollLeft;}else{if(D){E=D.scrollTop;C=D.scrollLeft;}else{}}return{top:E,left:C};},getStyle:function(D,C){return YAHOO.util.Dom.getStyle(D,C);},getScrollTop:function(){return this.getScroll().top;},getScrollLeft:function(){return this.getScroll().left;},moveToEl:function(C,E){var D=YAHOO.util.Dom.getXY(E);YAHOO.util.Dom.setXY(C,D);},getClientHeight:function(){return YAHOO.util.Dom.getViewportHeight();},getClientWidth:function(){return YAHOO.util.Dom.getViewportWidth();},numericSort:function(D,C){return(D-C);},_timeoutCount:0,_addListeners:function(){var C=YAHOO.util.DDM;if(YAHOO.util.Event&&document){C._onLoad();}else{if(C._timeoutCount>2000){}else{setTimeout(C._addListeners,10);if(document&&document.body){C._timeoutCount+=1;}}}},handleWasClicked:function(C,E){if(this.isHandle(E,C.id)){return true;}else{var D=C.parentNode;while(D){if(this.isHandle(E,D.id)){return true;}else{D=D.parentNode;}}}return false;}};}();YAHOO.util.DDM=YAHOO.util.DragDropMgr;YAHOO.util.DDM._addListeners();}(function(){var A=YAHOO.util.Event;var B=YAHOO.util.Dom;YAHOO.util.DragDrop=function(E,C,D){if(E){this.init(E,C,D);}};YAHOO.util.DragDrop.prototype={events:null,on:function(){this.subscribe.apply(this,arguments);},id:null,config:null,dragElId:null,handleElId:null,invalidHandleTypes:null,invalidHandleIds:null,invalidHandleClasses:null,startPageX:0,startPageY:0,groups:null,locked:false,lock:function(){this.locked=true;},unlock:function(){this.locked=false;},isTarget:true,padding:null,dragOnly:false,useShim:false,_domRef:null,__ygDragDrop:true,constrainX:false,constrainY:false,minX:0,maxX:0,minY:0,maxY:0,deltaX:0,deltaY:0,maintainOffset:false,xTicks:null,yTicks:null,primaryButtonOnly:true,available:false,hasOuterHandles:false,cursorIsOver:false,overlap:null,b4StartDrag:function(C,D){},startDrag:function(C,D){},b4Drag:function(C){},onDrag:function(C){},onDragEnter:function(C,D){},b4DragOver:function(C){},onDragOver:function(C,D){},b4DragOut:function(C){},onDragOut:function(C,D){},b4DragDrop:function(C){},onDragDrop:function(C,D){},onInvalidDrop:function(C){},b4EndDrag:function(C){},endDrag:function(C){},b4MouseDown:function(C){},onMouseDown:function(C){},onMouseUp:function(C){},onAvailable:function(){},getEl:function(){if(!this._domRef){this._domRef=B.get(this.id);
-}return this._domRef;},getDragEl:function(){return B.get(this.dragElId);},init:function(F,C,D){this.initTarget(F,C,D);A.on(this._domRef||this.id,"mousedown",this.handleMouseDown,this,true);for(var E in this.events){this.createEvent(E+"Event");}},initTarget:function(E,C,D){this.config=D||{};this.events={};this.DDM=YAHOO.util.DDM;this.groups={};if(typeof E!=="string"){this._domRef=E;E=B.generateId(E);}this.id=E;this.addToGroup((C)?C:"default");this.handleElId=E;A.onAvailable(E,this.handleOnAvailable,this,true);this.setDragElId(E);this.invalidHandleTypes={A:"A"};this.invalidHandleIds={};this.invalidHandleClasses=[];this.applyConfig();},applyConfig:function(){this.events={mouseDown:true,b4MouseDown:true,mouseUp:true,b4StartDrag:true,startDrag:true,b4EndDrag:true,endDrag:true,drag:true,b4Drag:true,invalidDrop:true,b4DragOut:true,dragOut:true,dragEnter:true,b4DragOver:true,dragOver:true,b4DragDrop:true,dragDrop:true};if(this.config.events){for(var C in this.config.events){if(this.config.events[C]===false){this.events[C]=false;}}}this.padding=this.config.padding||[0,0,0,0];this.isTarget=(this.config.isTarget!==false);this.maintainOffset=(this.config.maintainOffset);this.primaryButtonOnly=(this.config.primaryButtonOnly!==false);this.dragOnly=((this.config.dragOnly===true)?true:false);this.useShim=((this.config.useShim===true)?true:false);},handleOnAvailable:function(){this.available=true;this.resetConstraints();this.onAvailable();},setPadding:function(E,C,F,D){if(!C&&0!==C){this.padding=[E,E,E,E];}else{if(!F&&0!==F){this.padding=[E,C,E,C];}else{this.padding=[E,C,F,D];}}},setInitPosition:function(F,E){var G=this.getEl();if(!this.DDM.verifyEl(G)){if(G&&G.style&&(G.style.display=="none")){}else{}return;}var D=F||0;var C=E||0;var H=B.getXY(G);this.initPageX=H[0]-D;this.initPageY=H[1]-C;this.lastPageX=H[0];this.lastPageY=H[1];this.setStartPosition(H);},setStartPosition:function(D){var C=D||B.getXY(this.getEl());this.deltaSetXY=null;this.startPageX=C[0];this.startPageY=C[1];},addToGroup:function(C){this.groups[C]=true;this.DDM.regDragDrop(this,C);},removeFromGroup:function(C){if(this.groups[C]){delete this.groups[C];}this.DDM.removeDDFromGroup(this,C);},setDragElId:function(C){this.dragElId=C;},setHandleElId:function(C){if(typeof C!=="string"){C=B.generateId(C);}this.handleElId=C;this.DDM.regHandle(this.id,C);},setOuterHandleElId:function(C){if(typeof C!=="string"){C=B.generateId(C);}A.on(C,"mousedown",this.handleMouseDown,this,true);this.setHandleElId(C);this.hasOuterHandles=true;},unreg:function(){A.removeListener(this.id,"mousedown",this.handleMouseDown);this._domRef=null;this.DDM._remove(this);},isLocked:function(){return(this.DDM.isLocked()||this.locked);},handleMouseDown:function(J,I){var D=J.which||J.button;if(this.primaryButtonOnly&&D>1){return;}if(this.isLocked()){return;}var C=this.b4MouseDown(J),F=true;if(this.events.b4MouseDown){F=this.fireEvent("b4MouseDownEvent",J);}var E=this.onMouseDown(J),H=true;if(this.events.mouseDown){H=this.fireEvent("mouseDownEvent",J);}if((C===false)||(E===false)||(F===false)||(H===false)){return;}this.DDM.refreshCache(this.groups);var G=new YAHOO.util.Point(A.getPageX(J),A.getPageY(J));if(!this.hasOuterHandles&&!this.DDM.isOverTarget(G,this)){}else{if(this.clickValidator(J)){this.setStartPosition();this.DDM.handleMouseDown(J,this);this.DDM.stopEvent(J);}else{}}},clickValidator:function(D){var C=YAHOO.util.Event.getTarget(D);return(this.isValidHandleChild(C)&&(this.id==this.handleElId||this.DDM.handleWasClicked(C,this.id)));},getTargetCoord:function(E,D){var C=E-this.deltaX;var F=D-this.deltaY;if(this.constrainX){if(C<this.minX){C=this.minX;}if(C>this.maxX){C=this.maxX;}}if(this.constrainY){if(F<this.minY){F=this.minY;}if(F>this.maxY){F=this.maxY;}}C=this.getTick(C,this.xTicks);F=this.getTick(F,this.yTicks);return{x:C,y:F};},addInvalidHandleType:function(C){var D=C.toUpperCase();this.invalidHandleTypes[D]=D;},addInvalidHandleId:function(C){if(typeof C!=="string"){C=B.generateId(C);}this.invalidHandleIds[C]=C;},addInvalidHandleClass:function(C){this.invalidHandleClasses.push(C);},removeInvalidHandleType:function(C){var D=C.toUpperCase();delete this.invalidHandleTypes[D];},removeInvalidHandleId:function(C){if(typeof C!=="string"){C=B.generateId(C);}delete this.invalidHandleIds[C];},removeInvalidHandleClass:function(D){for(var E=0,C=this.invalidHandleClasses.length;E<C;++E){if(this.invalidHandleClasses[E]==D){delete this.invalidHandleClasses[E];}}},isValidHandleChild:function(F){var E=true;var H;try{H=F.nodeName.toUpperCase();}catch(G){H=F.nodeName;}E=E&&!this.invalidHandleTypes[H];E=E&&!this.invalidHandleIds[F.id];for(var D=0,C=this.invalidHandleClasses.length;E&&D<C;++D){E=!B.hasClass(F,this.invalidHandleClasses[D]);}return E;},setXTicks:function(F,C){this.xTicks=[];this.xTickSize=C;var E={};for(var D=this.initPageX;D>=this.minX;D=D-C){if(!E[D]){this.xTicks[this.xTicks.length]=D;E[D]=true;}}for(D=this.initPageX;D<=this.maxX;D=D+C){if(!E[D]){this.xTicks[this.xTicks.length]=D;E[D]=true;}}this.xTicks.sort(this.DDM.numericSort);},setYTicks:function(F,C){this.yTicks=[];this.yTickSize=C;var E={};for(var D=this.initPageY;D>=this.minY;D=D-C){if(!E[D]){this.yTicks[this.yTicks.length]=D;E[D]=true;}}for(D=this.initPageY;D<=this.maxY;D=D+C){if(!E[D]){this.yTicks[this.yTicks.length]=D;E[D]=true;}}this.yTicks.sort(this.DDM.numericSort);},setXConstraint:function(E,D,C){this.leftConstraint=parseInt(E,10);this.rightConstraint=parseInt(D,10);this.minX=this.initPageX-this.leftConstraint;this.maxX=this.initPageX+this.rightConstraint;if(C){this.setXTicks(this.initPageX,C);}this.constrainX=true;},clearConstraints:function(){this.constrainX=false;this.constrainY=false;this.clearTicks();},clearTicks:function(){this.xTicks=null;this.yTicks=null;this.xTickSize=0;this.yTickSize=0;},setYConstraint:function(C,E,D){this.topConstraint=parseInt(C,10);this.bottomConstraint=parseInt(E,10);this.minY=this.initPageY-this.topConstraint;this.maxY=this.initPageY+this.bottomConstraint;if(D){this.setYTicks(this.initPageY,D);
-}this.constrainY=true;},resetConstraints:function(){if(this.initPageX||this.initPageX===0){var D=(this.maintainOffset)?this.lastPageX-this.initPageX:0;var C=(this.maintainOffset)?this.lastPageY-this.initPageY:0;this.setInitPosition(D,C);}else{this.setInitPosition();}if(this.constrainX){this.setXConstraint(this.leftConstraint,this.rightConstraint,this.xTickSize);}if(this.constrainY){this.setYConstraint(this.topConstraint,this.bottomConstraint,this.yTickSize);}},getTick:function(I,F){if(!F){return I;}else{if(F[0]>=I){return F[0];}else{for(var D=0,C=F.length;D<C;++D){var E=D+1;if(F[E]&&F[E]>=I){var H=I-F[D];var G=F[E]-I;return(G>H)?F[D]:F[E];}}return F[F.length-1];}}},toString:function(){return("DragDrop "+this.id);}};YAHOO.augment(YAHOO.util.DragDrop,YAHOO.util.EventProvider);})();YAHOO.util.DD=function(C,A,B){if(C){this.init(C,A,B);}};YAHOO.extend(YAHOO.util.DD,YAHOO.util.DragDrop,{scroll:true,autoOffset:function(C,B){var A=C-this.startPageX;var D=B-this.startPageY;this.setDelta(A,D);},setDelta:function(B,A){this.deltaX=B;this.deltaY=A;},setDragElPos:function(C,B){var A=this.getDragEl();this.alignElWithMouse(A,C,B);},alignElWithMouse:function(C,G,F){var E=this.getTargetCoord(G,F);if(!this.deltaSetXY){var H=[E.x,E.y];YAHOO.util.Dom.setXY(C,H);var D=parseInt(YAHOO.util.Dom.getStyle(C,"left"),10);var B=parseInt(YAHOO.util.Dom.getStyle(C,"top"),10);this.deltaSetXY=[D-E.x,B-E.y];}else{YAHOO.util.Dom.setStyle(C,"left",(E.x+this.deltaSetXY[0])+"px");YAHOO.util.Dom.setStyle(C,"top",(E.y+this.deltaSetXY[1])+"px");}this.cachePosition(E.x,E.y);var A=this;setTimeout(function(){A.autoScroll.call(A,E.x,E.y,C.offsetHeight,C.offsetWidth);},0);},cachePosition:function(B,A){if(B){this.lastPageX=B;this.lastPageY=A;}else{var C=YAHOO.util.Dom.getXY(this.getEl());this.lastPageX=C[0];this.lastPageY=C[1];}},autoScroll:function(J,I,E,K){if(this.scroll){var L=this.DDM.getClientHeight();var B=this.DDM.getClientWidth();var N=this.DDM.getScrollTop();var D=this.DDM.getScrollLeft();var H=E+I;var M=K+J;var G=(L+N-I-this.deltaY);var F=(B+D-J-this.deltaX);var C=40;var A=(document.all)?80:30;if(H>L&&G<C){window.scrollTo(D,N+A);}if(I<N&&N>0&&I-N<C){window.scrollTo(D,N-A);}if(M>B&&F<C){window.scrollTo(D+A,N);}if(J<D&&D>0&&J-D<C){window.scrollTo(D-A,N);}}},applyConfig:function(){YAHOO.util.DD.superclass.applyConfig.call(this);this.scroll=(this.config.scroll!==false);},b4MouseDown:function(A){this.setStartPosition();this.autoOffset(YAHOO.util.Event.getPageX(A),YAHOO.util.Event.getPageY(A));},b4Drag:function(A){this.setDragElPos(YAHOO.util.Event.getPageX(A),YAHOO.util.Event.getPageY(A));},toString:function(){return("DD "+this.id);}});YAHOO.util.DDProxy=function(C,A,B){if(C){this.init(C,A,B);this.initFrame();}};YAHOO.util.DDProxy.dragElId="ygddfdiv";YAHOO.extend(YAHOO.util.DDProxy,YAHOO.util.DD,{resizeFrame:true,centerFrame:false,createFrame:function(){var B=this,A=document.body;if(!A||!A.firstChild){setTimeout(function(){B.createFrame();},50);return;}var F=this.getDragEl(),E=YAHOO.util.Dom;if(!F){F=document.createElement("div");F.id=this.dragElId;var D=F.style;D.position="absolute";D.visibility="hidden";D.cursor="move";D.border="2px solid #aaa";D.zIndex=999;D.height="25px";D.width="25px";var C=document.createElement("div");E.setStyle(C,"height","100%");E.setStyle(C,"width","100%");E.setStyle(C,"background-color","#ccc");E.setStyle(C,"opacity","0");F.appendChild(C);A.insertBefore(F,A.firstChild);}},initFrame:function(){this.createFrame();},applyConfig:function(){YAHOO.util.DDProxy.superclass.applyConfig.call(this);this.resizeFrame=(this.config.resizeFrame!==false);this.centerFrame=(this.config.centerFrame);this.setDragElId(this.config.dragElId||YAHOO.util.DDProxy.dragElId);},showFrame:function(E,D){var C=this.getEl();var A=this.getDragEl();var B=A.style;this._resizeProxy();if(this.centerFrame){this.setDelta(Math.round(parseInt(B.width,10)/2),Math.round(parseInt(B.height,10)/2));}this.setDragElPos(E,D);YAHOO.util.Dom.setStyle(A,"visibility","visible");},_resizeProxy:function(){if(this.resizeFrame){var H=YAHOO.util.Dom;var B=this.getEl();var C=this.getDragEl();var G=parseInt(H.getStyle(C,"borderTopWidth"),10);var I=parseInt(H.getStyle(C,"borderRightWidth"),10);var F=parseInt(H.getStyle(C,"borderBottomWidth"),10);var D=parseInt(H.getStyle(C,"borderLeftWidth"),10);if(isNaN(G)){G=0;}if(isNaN(I)){I=0;}if(isNaN(F)){F=0;}if(isNaN(D)){D=0;}var E=Math.max(0,B.offsetWidth-I-D);var A=Math.max(0,B.offsetHeight-G-F);H.setStyle(C,"width",E+"px");H.setStyle(C,"height",A+"px");}},b4MouseDown:function(B){this.setStartPosition();var A=YAHOO.util.Event.getPageX(B);var C=YAHOO.util.Event.getPageY(B);this.autoOffset(A,C);},b4StartDrag:function(A,B){this.showFrame(A,B);},b4EndDrag:function(A){YAHOO.util.Dom.setStyle(this.getDragEl(),"visibility","hidden");},endDrag:function(D){var C=YAHOO.util.Dom;var B=this.getEl();var A=this.getDragEl();C.setStyle(A,"visibility","");C.setStyle(B,"visibility","hidden");YAHOO.util.DDM.moveToEl(B,A);C.setStyle(A,"visibility","hidden");C.setStyle(B,"visibility","");},toString:function(){return("DDProxy "+this.id);}});YAHOO.util.DDTarget=function(C,A,B){if(C){this.initTarget(C,A,B);}};YAHOO.extend(YAHOO.util.DDTarget,YAHOO.util.DragDrop,{toString:function(){return("DDTarget "+this.id);}});YAHOO.register("dragdrop",YAHOO.util.DragDropMgr,{version:"2.7.0",build:"1796"});/*
-Copyright (c) 2009, Yahoo! Inc. All rights reserved.
-Code licensed under the BSD License:
-http://developer.yahoo.net/yui/license.txt
-version: 2.7.0
-*/
-(function(){var B=YAHOO.util.Dom.getXY,A=YAHOO.util.Event,D=Array.prototype.slice;function C(G,E,F,H){C.ANIM_AVAIL=(!YAHOO.lang.isUndefined(YAHOO.util.Anim));if(G){this.init(G,E,true);this.initSlider(H);this.initThumb(F);}}YAHOO.lang.augmentObject(C,{getHorizSlider:function(F,G,I,H,E){return new C(F,F,new YAHOO.widget.SliderThumb(G,F,I,H,0,0,E),"horiz");},getVertSlider:function(G,H,E,I,F){return new C(G,G,new YAHOO.widget.SliderThumb(H,G,0,0,E,I,F),"vert");},getSliderRegion:function(G,H,J,I,E,K,F){return new C(G,G,new YAHOO.widget.SliderThumb(H,G,J,I,E,K,F),"region");},SOURCE_UI_EVENT:1,SOURCE_SET_VALUE:2,SOURCE_KEY_EVENT:3,ANIM_AVAIL:false},true);YAHOO.extend(C,YAHOO.util.DragDrop,{_mouseDown:false,dragOnly:true,initSlider:function(E){this.type=E;this.createEvent("change",this);this.createEvent("slideStart",this);this.createEvent("slideEnd",this);this.isTarget=false;this.animate=C.ANIM_AVAIL;this.backgroundEnabled=true;this.tickPause=40;this.enableKeys=true;this.keyIncrement=20;this.moveComplete=true;this.animationDuration=0.2;this.SOURCE_UI_EVENT=1;this.SOURCE_SET_VALUE=2;this.valueChangeSource=0;this._silent=false;this.lastOffset=[0,0];},initThumb:function(F){var E=this;this.thumb=F;F.cacheBetweenDrags=true;if(F._isHoriz&&F.xTicks&&F.xTicks.length){this.tickPause=Math.round(360/F.xTicks.length);}else{if(F.yTicks&&F.yTicks.length){this.tickPause=Math.round(360/F.yTicks.length);}}F.onAvailable=function(){return E.setStartSliderState();};F.onMouseDown=function(){E._mouseDown=true;return E.focus();};F.startDrag=function(){E._slideStart();};F.onDrag=function(){E.fireEvents(true);};F.onMouseUp=function(){E.thumbMouseUp();};},onAvailable:function(){this._bindKeyEvents();},_bindKeyEvents:function(){A.on(this.id,"keydown",this.handleKeyDown,this,true);A.on(this.id,"keypress",this.handleKeyPress,this,true);},handleKeyPress:function(F){if(this.enableKeys){var E=A.getCharCode(F);switch(E){case 37:case 38:case 39:case 40:case 36:case 35:A.preventDefault(F);break;default:}}},handleKeyDown:function(J){if(this.enableKeys){var G=A.getCharCode(J),F=this.thumb,H=this.getXValue(),E=this.getYValue(),I=true;switch(G){case 37:H-=this.keyIncrement;break;case 38:E-=this.keyIncrement;break;case 39:H+=this.keyIncrement;break;case 40:E+=this.keyIncrement;break;case 36:H=F.leftConstraint;E=F.topConstraint;break;case 35:H=F.rightConstraint;E=F.bottomConstraint;break;default:I=false;}if(I){if(F._isRegion){this._setRegionValue(C.SOURCE_KEY_EVENT,H,E,true);}else{this._setValue(C.SOURCE_KEY_EVENT,(F._isHoriz?H:E),true);}A.stopEvent(J);}}},setStartSliderState:function(){this.setThumbCenterPoint();this.baselinePos=B(this.getEl());this.thumb.startOffset=this.thumb.getOffsetFromParent(this.baselinePos);if(this.thumb._isRegion){if(this.deferredSetRegionValue){this._setRegionValue.apply(this,this.deferredSetRegionValue);this.deferredSetRegionValue=null;}else{this.setRegionValue(0,0,true,true,true);}}else{if(this.deferredSetValue){this._setValue.apply(this,this.deferredSetValue);this.deferredSetValue=null;}else{this.setValue(0,true,true,true);}}},setThumbCenterPoint:function(){var E=this.thumb.getEl();if(E){this.thumbCenterPoint={x:parseInt(E.offsetWidth/2,10),y:parseInt(E.offsetHeight/2,10)};}},lock:function(){this.thumb.lock();this.locked=true;},unlock:function(){this.thumb.unlock();this.locked=false;},thumbMouseUp:function(){this._mouseDown=false;if(!this.isLocked()&&!this.moveComplete){this.endMove();}},onMouseUp:function(){this._mouseDown=false;if(this.backgroundEnabled&&!this.isLocked()&&!this.moveComplete){this.endMove();}},getThumb:function(){return this.thumb;},focus:function(){this.valueChangeSource=C.SOURCE_UI_EVENT;var E=this.getEl();if(E.focus){try{E.focus();}catch(F){}}this.verifyOffset();return !this.isLocked();},onChange:function(E,F){},onSlideStart:function(){},onSlideEnd:function(){},getValue:function(){return this.thumb.getValue();},getXValue:function(){return this.thumb.getXValue();},getYValue:function(){return this.thumb.getYValue();},setValue:function(){var E=D.call(arguments);E.unshift(C.SOURCE_SET_VALUE);return this._setValue.apply(this,E);},_setValue:function(I,L,G,H,E){var F=this.thumb,K,J;if(!F.available){this.deferredSetValue=arguments;return false;}if(this.isLocked()&&!H){return false;}if(isNaN(L)){return false;}if(F._isRegion){return false;}this._silent=E;this.valueChangeSource=I||C.SOURCE_SET_VALUE;F.lastOffset=[L,L];this.verifyOffset(true);this._slideStart();if(F._isHoriz){K=F.initPageX+L+this.thumbCenterPoint.x;this.moveThumb(K,F.initPageY,G);}else{J=F.initPageY+L+this.thumbCenterPoint.y;this.moveThumb(F.initPageX,J,G);}return true;},setRegionValue:function(){var E=D.call(arguments);E.unshift(C.SOURCE_SET_VALUE);return this._setRegionValue.apply(this,E);},_setRegionValue:function(F,J,H,I,G,K){var L=this.thumb,E,M;if(!L.available){this.deferredSetRegionValue=arguments;return false;}if(this.isLocked()&&!G){return false;}if(isNaN(J)){return false;}if(!L._isRegion){return false;}this._silent=K;this.valueChangeSource=F||C.SOURCE_SET_VALUE;L.lastOffset=[J,H];this.verifyOffset(true);this._slideStart();E=L.initPageX+J+this.thumbCenterPoint.x;M=L.initPageY+H+this.thumbCenterPoint.y;this.moveThumb(E,M,I);return true;},verifyOffset:function(F){var G=B(this.getEl()),E=this.thumb;if(!this.thumbCenterPoint||!this.thumbCenterPoint.x){this.setThumbCenterPoint();}if(G){if(G[0]!=this.baselinePos[0]||G[1]!=this.baselinePos[1]){this.setInitPosition();this.baselinePos=G;E.initPageX=this.initPageX+E.startOffset[0];E.initPageY=this.initPageY+E.startOffset[1];E.deltaSetXY=null;this.resetThumbConstraints();return false;}}return true;},moveThumb:function(K,J,I,G){var L=this.thumb,M=this,F,E,H;if(!L.available){return;}L.setDelta(this.thumbCenterPoint.x,this.thumbCenterPoint.y);E=L.getTargetCoord(K,J);F=[Math.round(E.x),Math.round(E.y)];if(this.animate&&L._graduated&&!I){this.lock();this.curCoord=B(this.thumb.getEl());this.curCoord=[Math.round(this.curCoord[0]),Math.round(this.curCoord[1])];setTimeout(function(){M.moveOneTick(F);
-},this.tickPause);}else{if(this.animate&&C.ANIM_AVAIL&&!I){this.lock();H=new YAHOO.util.Motion(L.id,{points:{to:F}},this.animationDuration,YAHOO.util.Easing.easeOut);H.onComplete.subscribe(function(){M.unlock();if(!M._mouseDown){M.endMove();}});H.animate();}else{L.setDragElPos(K,J);if(!G&&!this._mouseDown){this.endMove();}}}},_slideStart:function(){if(!this._sliding){if(!this._silent){this.onSlideStart();this.fireEvent("slideStart");}this._sliding=true;}},_slideEnd:function(){if(this._sliding&&this.moveComplete){var E=this._silent;this._sliding=false;this._silent=false;this.moveComplete=false;if(!E){this.onSlideEnd();this.fireEvent("slideEnd");}}},moveOneTick:function(F){var H=this.thumb,G=this,I=null,E,J;if(H._isRegion){I=this._getNextX(this.curCoord,F);E=(I!==null)?I[0]:this.curCoord[0];I=this._getNextY(this.curCoord,F);J=(I!==null)?I[1]:this.curCoord[1];I=E!==this.curCoord[0]||J!==this.curCoord[1]?[E,J]:null;}else{if(H._isHoriz){I=this._getNextX(this.curCoord,F);}else{I=this._getNextY(this.curCoord,F);}}if(I){this.curCoord=I;this.thumb.alignElWithMouse(H.getEl(),I[0]+this.thumbCenterPoint.x,I[1]+this.thumbCenterPoint.y);if(!(I[0]==F[0]&&I[1]==F[1])){setTimeout(function(){G.moveOneTick(F);},this.tickPause);}else{this.unlock();if(!this._mouseDown){this.endMove();}}}else{this.unlock();if(!this._mouseDown){this.endMove();}}},_getNextX:function(E,F){var H=this.thumb,J,G=[],I=null;if(E[0]>F[0]){J=H.tickSize-this.thumbCenterPoint.x;G=H.getTargetCoord(E[0]-J,E[1]);I=[G.x,G.y];}else{if(E[0]<F[0]){J=H.tickSize+this.thumbCenterPoint.x;G=H.getTargetCoord(E[0]+J,E[1]);I=[G.x,G.y];}else{}}return I;},_getNextY:function(E,F){var H=this.thumb,J,G=[],I=null;if(E[1]>F[1]){J=H.tickSize-this.thumbCenterPoint.y;G=H.getTargetCoord(E[0],E[1]-J);I=[G.x,G.y];}else{if(E[1]<F[1]){J=H.tickSize+this.thumbCenterPoint.y;G=H.getTargetCoord(E[0],E[1]+J);I=[G.x,G.y];}else{}}return I;},b4MouseDown:function(E){if(!this.backgroundEnabled){return false;}this.thumb.autoOffset();this.resetThumbConstraints();},onMouseDown:function(F){if(!this.backgroundEnabled||this.isLocked()){return false;}this._mouseDown=true;var E=A.getPageX(F),G=A.getPageY(F);this.focus();this._slideStart();this.moveThumb(E,G);},onDrag:function(F){if(this.backgroundEnabled&&!this.isLocked()){var E=A.getPageX(F),G=A.getPageY(F);this.moveThumb(E,G,true,true);this.fireEvents();}},endMove:function(){this.unlock();this.fireEvents();this.moveComplete=true;this._slideEnd();},resetThumbConstraints:function(){var E=this.thumb;E.setXConstraint(E.leftConstraint,E.rightConstraint,E.xTickSize);E.setYConstraint(E.topConstraint,E.bottomConstraint,E.xTickSize);},fireEvents:function(G){var F=this.thumb,I,H,E;if(!G){F.cachePosition();}if(!this.isLocked()){if(F._isRegion){I=F.getXValue();H=F.getYValue();if(I!=this.previousX||H!=this.previousY){if(!this._silent){this.onChange(I,H);this.fireEvent("change",{x:I,y:H});}}this.previousX=I;this.previousY=H;}else{E=F.getValue();if(E!=this.previousVal){if(!this._silent){this.onChange(E);this.fireEvent("change",E);}}this.previousVal=E;}}},toString:function(){return("Slider ("+this.type+") "+this.id);}});YAHOO.lang.augmentProto(C,YAHOO.util.EventProvider);YAHOO.widget.Slider=C;})();YAHOO.widget.SliderThumb=function(G,B,E,D,A,F,C){if(G){YAHOO.widget.SliderThumb.superclass.constructor.call(this,G,B);this.parentElId=B;}this.isTarget=false;this.tickSize=C;this.maintainOffset=true;this.initSlider(E,D,A,F,C);this.scroll=false;};YAHOO.extend(YAHOO.widget.SliderThumb,YAHOO.util.DD,{startOffset:null,dragOnly:true,_isHoriz:false,_prevVal:0,_graduated:false,getOffsetFromParent0:function(C){var A=YAHOO.util.Dom.getXY(this.getEl()),B=C||YAHOO.util.Dom.getXY(this.parentElId);return[(A[0]-B[0]),(A[1]-B[1])];},getOffsetFromParent:function(H){var A=this.getEl(),E,I,F,B,K,D,C,J,G;if(!this.deltaOffset){I=YAHOO.util.Dom.getXY(A);F=H||YAHOO.util.Dom.getXY(this.parentElId);E=[(I[0]-F[0]),(I[1]-F[1])];B=parseInt(YAHOO.util.Dom.getStyle(A,"left"),10);K=parseInt(YAHOO.util.Dom.getStyle(A,"top"),10);D=B-E[0];C=K-E[1];if(isNaN(D)||isNaN(C)){}else{this.deltaOffset=[D,C];}}else{J=parseInt(YAHOO.util.Dom.getStyle(A,"left"),10);G=parseInt(YAHOO.util.Dom.getStyle(A,"top"),10);E=[J+this.deltaOffset[0],G+this.deltaOffset[1]];}return E;},initSlider:function(D,C,A,E,B){this.initLeft=D;this.initRight=C;this.initUp=A;this.initDown=E;this.setXConstraint(D,C,B);this.setYConstraint(A,E,B);if(B&&B>1){this._graduated=true;}this._isHoriz=(D||C);this._isVert=(A||E);this._isRegion=(this._isHoriz&&this._isVert);},clearTicks:function(){YAHOO.widget.SliderThumb.superclass.clearTicks.call(this);this.tickSize=0;this._graduated=false;},getValue:function(){return(this._isHoriz)?this.getXValue():this.getYValue();},getXValue:function(){if(!this.available){return 0;}var A=this.getOffsetFromParent();if(YAHOO.lang.isNumber(A[0])){this.lastOffset=A;return(A[0]-this.startOffset[0]);}else{return(this.lastOffset[0]-this.startOffset[0]);}},getYValue:function(){if(!this.available){return 0;}var A=this.getOffsetFromParent();if(YAHOO.lang.isNumber(A[1])){this.lastOffset=A;return(A[1]-this.startOffset[1]);}else{return(this.lastOffset[1]-this.startOffset[1]);}},toString:function(){return"SliderThumb "+this.id;},onChange:function(A,B){}});(function(){var A=YAHOO.util.Event,B=YAHOO.widget;function C(I,F,H,D){var G=this,J={min:false,max:false},E,K;this.minSlider=I;this.maxSlider=F;this.activeSlider=I;this.isHoriz=I.thumb._isHoriz;E=this.minSlider.thumb.onMouseDown;K=this.maxSlider.thumb.onMouseDown;this.minSlider.thumb.onMouseDown=function(){G.activeSlider=G.minSlider;E.apply(this,arguments);};this.maxSlider.thumb.onMouseDown=function(){G.activeSlider=G.maxSlider;K.apply(this,arguments);};this.minSlider.thumb.onAvailable=function(){I.setStartSliderState();J.min=true;if(J.max){G.fireEvent("ready",G);}};this.maxSlider.thumb.onAvailable=function(){F.setStartSliderState();J.max=true;if(J.min){G.fireEvent("ready",G);}};I.onMouseDown=F.onMouseDown=function(L){return this.backgroundEnabled&&G._handleMouseDown(L);
-};I.onDrag=F.onDrag=function(L){G._handleDrag(L);};I.onMouseUp=F.onMouseUp=function(L){G._handleMouseUp(L);};I._bindKeyEvents=function(){G._bindKeyEvents(this);};F._bindKeyEvents=function(){};I.subscribe("change",this._handleMinChange,I,this);I.subscribe("slideStart",this._handleSlideStart,I,this);I.subscribe("slideEnd",this._handleSlideEnd,I,this);F.subscribe("change",this._handleMaxChange,F,this);F.subscribe("slideStart",this._handleSlideStart,F,this);F.subscribe("slideEnd",this._handleSlideEnd,F,this);this.createEvent("ready",this);this.createEvent("change",this);this.createEvent("slideStart",this);this.createEvent("slideEnd",this);D=YAHOO.lang.isArray(D)?D:[0,H];D[0]=Math.min(Math.max(parseInt(D[0],10)|0,0),H);D[1]=Math.max(Math.min(parseInt(D[1],10)|0,H),0);if(D[0]>D[1]){D.splice(0,2,D[1],D[0]);}this.minVal=D[0];this.maxVal=D[1];this.minSlider.setValue(this.minVal,true,true,true);this.maxSlider.setValue(this.maxVal,true,true,true);}C.prototype={minVal:-1,maxVal:-1,minRange:0,_handleSlideStart:function(E,D){this.fireEvent("slideStart",D);},_handleSlideEnd:function(E,D){this.fireEvent("slideEnd",D);},_handleDrag:function(D){B.Slider.prototype.onDrag.call(this.activeSlider,D);},_handleMinChange:function(){this.activeSlider=this.minSlider;this.updateValue();},_handleMaxChange:function(){this.activeSlider=this.maxSlider;this.updateValue();},_bindKeyEvents:function(D){A.on(D.id,"keydown",this._handleKeyDown,this,true);A.on(D.id,"keypress",this._handleKeyPress,this,true);},_handleKeyDown:function(D){this.activeSlider.handleKeyDown.apply(this.activeSlider,arguments);},_handleKeyPress:function(D){this.activeSlider.handleKeyPress.apply(this.activeSlider,arguments);},setValues:function(H,K,I,E,J){var F=this.minSlider,M=this.maxSlider,D=F.thumb,L=M.thumb,N=this,G={min:false,max:false};if(D._isHoriz){D.setXConstraint(D.leftConstraint,L.rightConstraint,D.tickSize);L.setXConstraint(D.leftConstraint,L.rightConstraint,L.tickSize);}else{D.setYConstraint(D.topConstraint,L.bottomConstraint,D.tickSize);L.setYConstraint(D.topConstraint,L.bottomConstraint,L.tickSize);}this._oneTimeCallback(F,"slideEnd",function(){G.min=true;if(G.max){N.updateValue(J);setTimeout(function(){N._cleanEvent(F,"slideEnd");N._cleanEvent(M,"slideEnd");},0);}});this._oneTimeCallback(M,"slideEnd",function(){G.max=true;if(G.min){N.updateValue(J);setTimeout(function(){N._cleanEvent(F,"slideEnd");N._cleanEvent(M,"slideEnd");},0);}});F.setValue(H,I,E,false);M.setValue(K,I,E,false);},setMinValue:function(F,H,I,E){var G=this.minSlider,D=this;this.activeSlider=G;D=this;this._oneTimeCallback(G,"slideEnd",function(){D.updateValue(E);setTimeout(function(){D._cleanEvent(G,"slideEnd");},0);});G.setValue(F,H,I);},setMaxValue:function(D,H,I,F){var G=this.maxSlider,E=this;this.activeSlider=G;this._oneTimeCallback(G,"slideEnd",function(){E.updateValue(F);setTimeout(function(){E._cleanEvent(G,"slideEnd");},0);});G.setValue(D,H,I);},updateValue:function(J){var E=this.minSlider.getValue(),K=this.maxSlider.getValue(),F=false,D,M,H,I,L,G;if(E!=this.minVal||K!=this.maxVal){F=true;D=this.minSlider.thumb;M=this.maxSlider.thumb;H=this.isHoriz?"x":"y";G=this.minSlider.thumbCenterPoint[H]+this.maxSlider.thumbCenterPoint[H];I=Math.max(K-G-this.minRange,0);L=Math.min(-E-G-this.minRange,0);if(this.isHoriz){I=Math.min(I,M.rightConstraint);D.setXConstraint(D.leftConstraint,I,D.tickSize);M.setXConstraint(L,M.rightConstraint,M.tickSize);}else{I=Math.min(I,M.bottomConstraint);D.setYConstraint(D.leftConstraint,I,D.tickSize);M.setYConstraint(L,M.bottomConstraint,M.tickSize);}}this.minVal=E;this.maxVal=K;if(F&&!J){this.fireEvent("change",this);}},selectActiveSlider:function(H){var E=this.minSlider,D=this.maxSlider,J=E.isLocked()||!E.backgroundEnabled,G=D.isLocked()||!E.backgroundEnabled,F=YAHOO.util.Event,I;if(J||G){this.activeSlider=J?D:E;}else{if(this.isHoriz){I=F.getPageX(H)-E.thumb.initPageX-E.thumbCenterPoint.x;}else{I=F.getPageY(H)-E.thumb.initPageY-E.thumbCenterPoint.y;}this.activeSlider=I*2>D.getValue()+E.getValue()?D:E;}},_handleMouseDown:function(D){if(!D._handled){D._handled=true;this.selectActiveSlider(D);return B.Slider.prototype.onMouseDown.call(this.activeSlider,D);}else{return false;}},_handleMouseUp:function(D){B.Slider.prototype.onMouseUp.apply(this.activeSlider,arguments);},_oneTimeCallback:function(F,D,E){F.subscribe(D,function(){F.unsubscribe(D,arguments.callee);E.apply({},[].slice.apply(arguments));});},_cleanEvent:function(K,E){var J,I,D,G,H,F;if(K.__yui_events&&K.events[E]){for(I=K.__yui_events.length;I>=0;--I){if(K.__yui_events[I].type===E){J=K.__yui_events[I];break;}}if(J){H=J.subscribers;F=[];G=0;for(I=0,D=H.length;I<D;++I){if(H[I]){F[G++]=H[I];}}J.subscribers=F;}}}};YAHOO.lang.augmentProto(C,YAHOO.util.EventProvider);B.Slider.getHorizDualSlider=function(H,J,K,G,F,D){var I=new B.SliderThumb(J,H,0,G,0,0,F),E=new B.SliderThumb(K,H,0,G,0,0,F);return new C(new B.Slider(H,H,I,"horiz"),new B.Slider(H,H,E,"horiz"),G,D);};B.Slider.getVertDualSlider=function(H,J,K,G,F,D){var I=new B.SliderThumb(J,H,0,0,0,G,F),E=new B.SliderThumb(K,H,0,0,0,G,F);return new B.DualSlider(new B.Slider(H,H,I,"vert"),new B.Slider(H,H,E,"vert"),G,D);};YAHOO.widget.DualSlider=C;})();YAHOO.register("slider",YAHOO.widget.Slider,{version:"2.7.0",build:"1796"});/*
-Copyright (c) 2009, Yahoo! Inc. All rights reserved.
-Code licensed under the BSD License:
-http://developer.yahoo.net/yui/license.txt
-version: 2.7.0
-*/
-YAHOO.util.Attribute=function(B,A){if(A){this.owner=A;this.configure(B,true);}};YAHOO.util.Attribute.prototype={name:undefined,value:null,owner:null,readOnly:false,writeOnce:false,_initialConfig:null,_written:false,method:null,setter:null,getter:null,validator:null,getValue:function(){var A=this.value;if(this.getter){A=this.getter.call(this.owner,this.name);}return A;},setValue:function(F,B){var E,A=this.owner,C=this.name;var D={type:C,prevValue:this.getValue(),newValue:F};if(this.readOnly||(this.writeOnce&&this._written)){return false;}if(this.validator&&!this.validator.call(A,F)){return false;}if(!B){E=A.fireBeforeChangeEvent(D);if(E===false){return false;}}if(this.setter){F=this.setter.call(A,F,this.name);if(F===undefined){}}if(this.method){this.method.call(A,F,this.name);}this.value=F;this._written=true;D.type=C;if(!B){this.owner.fireChangeEvent(D);}return true;},configure:function(B,C){B=B||{};if(C){this._written=false;}this._initialConfig=this._initialConfig||{};for(var A in B){if(B.hasOwnProperty(A)){this[A]=B[A];if(C){this._initialConfig[A]=B[A];}}}},resetValue:function(){return this.setValue(this._initialConfig.value);},resetConfig:function(){this.configure(this._initialConfig,true);},refresh:function(A){this.setValue(this.value,A);}};(function(){var A=YAHOO.util.Lang;YAHOO.util.AttributeProvider=function(){};YAHOO.util.AttributeProvider.prototype={_configs:null,get:function(C){this._configs=this._configs||{};var B=this._configs[C];if(!B||!this._configs.hasOwnProperty(C)){return null;}return B.getValue();},set:function(D,E,B){this._configs=this._configs||{};var C=this._configs[D];if(!C){return false;}return C.setValue(E,B);},getAttributeKeys:function(){this._configs=this._configs;var C=[],B;for(B in this._configs){if(A.hasOwnProperty(this._configs,B)&&!A.isUndefined(this._configs[B])){C[C.length]=B;}}return C;},setAttributes:function(D,B){for(var C in D){if(A.hasOwnProperty(D,C)){this.set(C,D[C],B);}}},resetValue:function(C,B){this._configs=this._configs||{};if(this._configs[C]){this.set(C,this._configs[C]._initialConfig.value,B);return true;}return false;},refresh:function(E,C){this._configs=this._configs||{};var F=this._configs;E=((A.isString(E))?[E]:E)||this.getAttributeKeys();for(var D=0,B=E.length;D<B;++D){if(F.hasOwnProperty(E[D])){this._configs[E[D]].refresh(C);}}},register:function(B,C){this.setAttributeConfig(B,C);},getAttributeConfig:function(C){this._configs=this._configs||{};var B=this._configs[C]||{};var D={};for(C in B){if(A.hasOwnProperty(B,C)){D[C]=B[C];}}return D;},setAttributeConfig:function(B,C,D){this._configs=this._configs||{};C=C||{};if(!this._configs[B]){C.name=B;this._configs[B]=this.createAttribute(C);}else{this._configs[B].configure(C,D);}},configureAttribute:function(B,C,D){this.setAttributeConfig(B,C,D);},resetAttributeConfig:function(B){this._configs=this._configs||{};this._configs[B].resetConfig();},subscribe:function(B,C){this._events=this._events||{};if(!(B in this._events)){this._events[B]=this.createEvent(B);}YAHOO.util.EventProvider.prototype.subscribe.apply(this,arguments);},on:function(){this.subscribe.apply(this,arguments);},addListener:function(){this.subscribe.apply(this,arguments);},fireBeforeChangeEvent:function(C){var B="before";B+=C.type.charAt(0).toUpperCase()+C.type.substr(1)+"Change";C.type=B;return this.fireEvent(C.type,C);},fireChangeEvent:function(B){B.type+="Change";return this.fireEvent(B.type,B);},createAttribute:function(B){return new YAHOO.util.Attribute(B,this);}};YAHOO.augment(YAHOO.util.AttributeProvider,YAHOO.util.EventProvider);})();(function(){var B=YAHOO.util.Dom,C=YAHOO.util.AttributeProvider;var A=function(D,E){this.init.apply(this,arguments);};A.DOM_EVENTS={"click":true,"dblclick":true,"keydown":true,"keypress":true,"keyup":true,"mousedown":true,"mousemove":true,"mouseout":true,"mouseover":true,"mouseup":true,"focus":true,"blur":true,"submit":true,"change":true};A.prototype={DOM_EVENTS:null,DEFAULT_HTML_SETTER:function(F,D){var E=this.get("element");if(E){E[D]=F;}},DEFAULT_HTML_GETTER:function(D){var E=this.get("element"),F;if(E){F=E[D];}return F;},appendChild:function(D){D=D.get?D.get("element"):D;return this.get("element").appendChild(D);},getElementsByTagName:function(D){return this.get("element").getElementsByTagName(D);},hasChildNodes:function(){return this.get("element").hasChildNodes();},insertBefore:function(D,E){D=D.get?D.get("element"):D;E=(E&&E.get)?E.get("element"):E;return this.get("element").insertBefore(D,E);},removeChild:function(D){D=D.get?D.get("element"):D;return this.get("element").removeChild(D);},replaceChild:function(D,E){D=D.get?D.get("element"):D;E=E.get?E.get("element"):E;return this.get("element").replaceChild(D,E);},initAttributes:function(D){},addListener:function(H,G,I,F){var E=this.get("element")||this.get("id");F=F||this;var D=this;if(!this._events[H]){if(E&&this.DOM_EVENTS[H]){YAHOO.util.Event.addListener(E,H,function(J){if(J.srcElement&&!J.target){J.target=J.srcElement;}D.fireEvent(H,J);},I,F);}this.createEvent(H,this);}return YAHOO.util.EventProvider.prototype.subscribe.apply(this,arguments);},on:function(){return this.addListener.apply(this,arguments);},subscribe:function(){return this.addListener.apply(this,arguments);},removeListener:function(E,D){return this.unsubscribe.apply(this,arguments);},addClass:function(D){B.addClass(this.get("element"),D);},getElementsByClassName:function(E,D){return B.getElementsByClassName(E,D,this.get("element"));},hasClass:function(D){return B.hasClass(this.get("element"),D);},removeClass:function(D){return B.removeClass(this.get("element"),D);},replaceClass:function(E,D){return B.replaceClass(this.get("element"),E,D);},setStyle:function(E,D){return B.setStyle(this.get("element"),E,D);},getStyle:function(D){return B.getStyle(this.get("element"),D);},fireQueue:function(){var E=this._queue;for(var F=0,D=E.length;F<D;++F){this[E[F][0]].apply(this,E[F][1]);}},appendTo:function(E,F){E=(E.get)?E.get("element"):B.get(E);this.fireEvent("beforeAppendTo",{type:"beforeAppendTo",target:E});
-F=(F&&F.get)?F.get("element"):B.get(F);var D=this.get("element");if(!D){return false;}if(!E){return false;}if(D.parent!=E){if(F){E.insertBefore(D,F);}else{E.appendChild(D);}}this.fireEvent("appendTo",{type:"appendTo",target:E});return D;},get:function(D){var F=this._configs||{},E=F.element;if(E&&!F[D]&&!YAHOO.lang.isUndefined(E.value[D])){this._setHTMLAttrConfig(D);}return C.prototype.get.call(this,D);},setAttributes:function(J,G){var E={},H=this._configOrder;for(var I=0,D=H.length;I<D;++I){if(J[H[I]]!==undefined){E[H[I]]=true;this.set(H[I],J[H[I]],G);}}for(var F in J){if(J.hasOwnProperty(F)&&!E[F]){this.set(F,J[F],G);}}},set:function(E,G,D){var F=this.get("element");if(!F){this._queue[this._queue.length]=["set",arguments];if(this._configs[E]){this._configs[E].value=G;}return;}if(!this._configs[E]&&!YAHOO.lang.isUndefined(F[E])){this._setHTMLAttrConfig(E);}return C.prototype.set.apply(this,arguments);},setAttributeConfig:function(D,E,F){this._configOrder.push(D);C.prototype.setAttributeConfig.apply(this,arguments);},createEvent:function(E,D){this._events[E]=true;return C.prototype.createEvent.apply(this,arguments);},init:function(E,D){this._initElement(E,D);},destroy:function(){var D=this.get("element");YAHOO.util.Event.purgeElement(D,true);this.unsubscribeAll();if(D&&D.parentNode){D.parentNode.removeChild(D);}this._queue=[];this._events={};this._configs={};this._configOrder=[];},_initElement:function(F,E){this._queue=this._queue||[];this._events=this._events||{};this._configs=this._configs||{};this._configOrder=[];E=E||{};E.element=E.element||F||null;var H=false;var D=A.DOM_EVENTS;this.DOM_EVENTS=this.DOM_EVENTS||{};for(var G in D){if(D.hasOwnProperty(G)){this.DOM_EVENTS[G]=D[G];}}if(typeof E.element==="string"){this._setHTMLAttrConfig("id",{value:E.element});}if(B.get(E.element)){H=true;this._initHTMLElement(E);this._initContent(E);}YAHOO.util.Event.onAvailable(E.element,function(){if(!H){this._initHTMLElement(E);}this.fireEvent("available",{type:"available",target:B.get(E.element)});},this,true);YAHOO.util.Event.onContentReady(E.element,function(){if(!H){this._initContent(E);}this.fireEvent("contentReady",{type:"contentReady",target:B.get(E.element)});},this,true);},_initHTMLElement:function(D){this.setAttributeConfig("element",{value:B.get(D.element),readOnly:true});},_initContent:function(D){this.initAttributes(D);this.setAttributes(D,true);this.fireQueue();},_setHTMLAttrConfig:function(D,F){var E=this.get("element");F=F||{};F.name=D;F.setter=F.setter||this.DEFAULT_HTML_SETTER;F.getter=F.getter||this.DEFAULT_HTML_GETTER;F.value=F.value||E[D];this._configs[D]=new YAHOO.util.Attribute(F,this);}};YAHOO.augment(A,C);YAHOO.util.Element=A;})();YAHOO.register("element",YAHOO.util.Element,{version:"2.7.0",build:"1796"});/*
-Copyright (c) 2009, Yahoo! Inc. All rights reserved.
-Code licensed under the BSD License:
-http://developer.yahoo.net/yui/license.txt
-version: 2.7.0
-*/
-YAHOO.util.Color=function(){var A="0",B=YAHOO.lang.isArray,C=YAHOO.lang.isNumber;return{real2dec:function(D){return Math.min(255,Math.round(D*256));},hsv2rgb:function(H,O,M){if(B(H)){return this.hsv2rgb.call(this,H[0],H[1],H[2]);}var D,I,L,G=Math.floor((H/60)%6),J=(H/60)-G,F=M*(1-O),E=M*(1-J*O),N=M*(1-(1-J)*O),K;switch(G){case 0:D=M;I=N;L=F;break;case 1:D=E;I=M;L=F;break;case 2:D=F;I=M;L=N;break;case 3:D=F;I=E;L=M;break;case 4:D=N;I=F;L=M;break;case 5:D=M;I=F;L=E;break;}K=this.real2dec;return[K(D),K(I),K(L)];},rgb2hsv:function(D,H,I){if(B(D)){return this.rgb2hsv.apply(this,D);}D/=255;H/=255;I/=255;var G,L,E=Math.min(Math.min(D,H),I),J=Math.max(Math.max(D,H),I),K=J-E,F;switch(J){case E:G=0;break;case D:G=60*(H-I)/K;if(H<I){G+=360;}break;case H:G=(60*(I-D)/K)+120;break;case I:G=(60*(D-H)/K)+240;break;}L=(J===0)?0:1-(E/J);F=[Math.round(G),L,J];return F;},rgb2hex:function(F,E,D){if(B(F)){return this.rgb2hex.apply(this,F);}var G=this.dec2hex;return G(F)+G(E)+G(D);},dec2hex:function(D){D=parseInt(D,10)|0;D=(D>255||D<0)?0:D;return(A+D.toString(16)).slice(-2).toUpperCase();},hex2dec:function(D){return parseInt(D,16);},hex2rgb:function(D){var E=this.hex2dec;return[E(D.slice(0,2)),E(D.slice(2,4)),E(D.slice(4,6))];},websafe:function(F,E,D){if(B(F)){return this.websafe.apply(this,F);}var G=function(H){if(C(H)){H=Math.min(Math.max(0,H),255);var I,J;for(I=0;I<256;I=I+51){J=I+51;if(H>=I&&H<=J){return(H-I>25)?J:I;}}}return H;};return[G(F),G(E),G(D)];}};}();(function(){var J=0,F=YAHOO.util,C=YAHOO.lang,D=YAHOO.widget.Slider,B=F.Color,E=F.Dom,I=F.Event,A=C.substitute,H="yui-picker";function G(L,K){J=J+1;K=K||{};if(arguments.length===1&&!YAHOO.lang.isString(L)&&!L.nodeName){K=L;L=K.element||null;}if(!L&&!K.element){L=this._createHostElement(K);}G.superclass.constructor.call(this,L,K);this.initPicker();}YAHOO.extend(G,YAHOO.util.Element,{ID:{R:H+"-r",R_HEX:H+"-rhex",G:H+"-g",G_HEX:H+"-ghex",B:H+"-b",B_HEX:H+"-bhex",H:H+"-h",S:H+"-s",V:H+"-v",PICKER_BG:H+"-bg",PICKER_THUMB:H+"-thumb",HUE_BG:H+"-hue-bg",HUE_THUMB:H+"-hue-thumb",HEX:H+"-hex",SWATCH:H+"-swatch",WEBSAFE_SWATCH:H+"-websafe-swatch",CONTROLS:H+"-controls",RGB_CONTROLS:H+"-rgb-controls",HSV_CONTROLS:H+"-hsv-controls",HEX_CONTROLS:H+"-hex-controls",HEX_SUMMARY:H+"-hex-summary",CONTROLS_LABEL:H+"-controls-label"},TXT:{ILLEGAL_HEX:"Illegal hex value entered",SHOW_CONTROLS:"Show color details",HIDE_CONTROLS:"Hide color details",CURRENT_COLOR:"Currently selected color: {rgb}",CLOSEST_WEBSAFE:"Closest websafe color: {rgb}. Click to select.",R:"R",G:"G",B:"B",H:"H",S:"S",V:"V",HEX:"#",DEG:"\u00B0",PERCENT:"%"},IMAGE:{PICKER_THUMB:"../../build/colorpicker/assets/picker_thumb.png",HUE_THUMB:"../../build/colorpicker/assets/hue_thumb.png"},DEFAULT:{PICKER_SIZE:180},OPT:{HUE:"hue",SATURATION:"saturation",VALUE:"value",RED:"red",GREEN:"green",BLUE:"blue",HSV:"hsv",RGB:"rgb",WEBSAFE:"websafe",HEX:"hex",PICKER_SIZE:"pickersize",SHOW_CONTROLS:"showcontrols",SHOW_RGB_CONTROLS:"showrgbcontrols",SHOW_HSV_CONTROLS:"showhsvcontrols",SHOW_HEX_CONTROLS:"showhexcontrols",SHOW_HEX_SUMMARY:"showhexsummary",SHOW_WEBSAFE:"showwebsafe",CONTAINER:"container",IDS:"ids",ELEMENTS:"elements",TXT:"txt",IMAGES:"images",ANIMATE:"animate"},skipAnim:true,_createHostElement:function(){var K=document.createElement("div");if(this.CSS.BASE){K.className=this.CSS.BASE;}return K;},_updateHueSlider:function(){var K=this.get(this.OPT.PICKER_SIZE),L=this.get(this.OPT.HUE);L=K-Math.round(L/360*K);if(L===K){L=0;}this.hueSlider.setValue(L,this.skipAnim);},_updatePickerSlider:function(){var L=this.get(this.OPT.PICKER_SIZE),M=this.get(this.OPT.SATURATION),K=this.get(this.OPT.VALUE);M=Math.round(M*L/100);K=Math.round(L-(K*L/100));this.pickerSlider.setRegionValue(M,K,this.skipAnim);},_updateSliders:function(){this._updateHueSlider();this._updatePickerSlider();},setValue:function(L,K){K=(K)||false;this.set(this.OPT.RGB,L,K);this._updateSliders();},hueSlider:null,pickerSlider:null,_getH:function(){var K=this.get(this.OPT.PICKER_SIZE),L=(K-this.hueSlider.getValue())/K;L=Math.round(L*360);return(L===360)?0:L;},_getS:function(){return this.pickerSlider.getXValue()/this.get(this.OPT.PICKER_SIZE);},_getV:function(){var K=this.get(this.OPT.PICKER_SIZE);return(K-this.pickerSlider.getYValue())/K;},_updateSwatch:function(){var M=this.get(this.OPT.RGB),O=this.get(this.OPT.WEBSAFE),N=this.getElement(this.ID.SWATCH),L=M.join(","),K=this.get(this.OPT.TXT);E.setStyle(N,"background-color","rgb("+L+")");N.title=A(K.CURRENT_COLOR,{"rgb":"#"+this.get(this.OPT.HEX)});N=this.getElement(this.ID.WEBSAFE_SWATCH);L=O.join(",");E.setStyle(N,"background-color","rgb("+L+")");N.title=A(K.CLOSEST_WEBSAFE,{"rgb":"#"+B.rgb2hex(O)});},_getValuesFromSliders:function(){this.set(this.OPT.RGB,B.hsv2rgb(this._getH(),this._getS(),this._getV()));},_updateFormFields:function(){this.getElement(this.ID.H).value=this.get(this.OPT.HUE);this.getElement(this.ID.S).value=this.get(this.OPT.SATURATION);this.getElement(this.ID.V).value=this.get(this.OPT.VALUE);this.getElement(this.ID.R).value=this.get(this.OPT.RED);this.getElement(this.ID.R_HEX).innerHTML=B.dec2hex(this.get(this.OPT.RED));this.getElement(this.ID.G).value=this.get(this.OPT.GREEN);this.getElement(this.ID.G_HEX).innerHTML=B.dec2hex(this.get(this.OPT.GREEN));this.getElement(this.ID.B).value=this.get(this.OPT.BLUE);this.getElement(this.ID.B_HEX).innerHTML=B.dec2hex(this.get(this.OPT.BLUE));this.getElement(this.ID.HEX).value=this.get(this.OPT.HEX);},_onHueSliderChange:function(N){var L=this._getH(),K=B.hsv2rgb(L,1,1),M="rgb("+K.join(",")+")";this.set(this.OPT.HUE,L,true);E.setStyle(this.getElement(this.ID.PICKER_BG),"background-color",M);if(this.hueSlider.valueChangeSource!==D.SOURCE_SET_VALUE){this._getValuesFromSliders();}this._updateFormFields();this._updateSwatch();},_onPickerSliderChange:function(M){var L=this._getS(),K=this._getV();this.set(this.OPT.SATURATION,Math.round(L*100),true);this.set(this.OPT.VALUE,Math.round(K*100),true);if(this.pickerSlider.valueChangeSource!==D.SOURCE_SET_VALUE){this._getValuesFromSliders();
-}this._updateFormFields();this._updateSwatch();},_getCommand:function(K){var L=I.getCharCode(K);if(L===38){return 3;}else{if(L===13){return 6;}else{if(L===40){return 4;}else{if(L>=48&&L<=57){return 1;}else{if(L>=97&&L<=102){return 2;}else{if(L>=65&&L<=70){return 2;}else{if("8, 9, 13, 27, 37, 39".indexOf(L)>-1||K.ctrlKey||K.metaKey){return 5;}else{return 0;}}}}}}}},_useFieldValue:function(L,K,N){var M=K.value;if(N!==this.OPT.HEX){M=parseInt(M,10);}if(M!==this.get(N)){this.set(N,M);}},_rgbFieldKeypress:function(M,K,O){var N=this._getCommand(M),L=(M.shiftKey)?10:1;switch(N){case 6:this._useFieldValue.apply(this,arguments);break;case 3:this.set(O,Math.min(this.get(O)+L,255));this._updateFormFields();break;case 4:this.set(O,Math.max(this.get(O)-L,0));this._updateFormFields();break;default:}},_hexFieldKeypress:function(L,K,N){var M=this._getCommand(L);if(M===6){this._useFieldValue.apply(this,arguments);}},_hexOnly:function(L,K){var M=this._getCommand(L);switch(M){case 6:case 5:case 1:break;case 2:if(K!==true){break;}default:I.stopEvent(L);return false;}},_numbersOnly:function(K){return this._hexOnly(K,true);},getElement:function(K){return this.get(this.OPT.ELEMENTS)[this.get(this.OPT.IDS)[K]];},_createElements:function(){var N,M,P,O,L,K=this.get(this.OPT.IDS),Q=this.get(this.OPT.TXT),S=this.get(this.OPT.IMAGES),R=function(U,V){var W=document.createElement(U);if(V){C.augmentObject(W,V,true);}return W;},T=function(U,V){var W=C.merge({autocomplete:"off",value:"0",size:3,maxlength:3},V);W.name=W.id;return new R(U,W);};L=this.get("element");N=new R("div",{id:K[this.ID.PICKER_BG],className:"yui-picker-bg",tabIndex:-1,hideFocus:true});M=new R("div",{id:K[this.ID.PICKER_THUMB],className:"yui-picker-thumb"});P=new R("img",{src:S.PICKER_THUMB});M.appendChild(P);N.appendChild(M);L.appendChild(N);N=new R("div",{id:K[this.ID.HUE_BG],className:"yui-picker-hue-bg",tabIndex:-1,hideFocus:true});M=new R("div",{id:K[this.ID.HUE_THUMB],className:"yui-picker-hue-thumb"});P=new R("img",{src:S.HUE_THUMB});M.appendChild(P);N.appendChild(M);L.appendChild(N);N=new R("div",{id:K[this.ID.CONTROLS],className:"yui-picker-controls"});L.appendChild(N);L=N;N=new R("div",{className:"hd"});M=new R("a",{id:K[this.ID.CONTROLS_LABEL],href:"#"});N.appendChild(M);L.appendChild(N);N=new R("div",{className:"bd"});L.appendChild(N);L=N;N=new R("ul",{id:K[this.ID.RGB_CONTROLS],className:"yui-picker-rgb-controls"});M=new R("li");M.appendChild(document.createTextNode(Q.R+" "));O=new T("input",{id:K[this.ID.R],className:"yui-picker-r"});M.appendChild(O);N.appendChild(M);M=new R("li");M.appendChild(document.createTextNode(Q.G+" "));O=new T("input",{id:K[this.ID.G],className:"yui-picker-g"});M.appendChild(O);N.appendChild(M);M=new R("li");M.appendChild(document.createTextNode(Q.B+" "));O=new T("input",{id:K[this.ID.B],className:"yui-picker-b"});M.appendChild(O);N.appendChild(M);L.appendChild(N);N=new R("ul",{id:K[this.ID.HSV_CONTROLS],className:"yui-picker-hsv-controls"});M=new R("li");M.appendChild(document.createTextNode(Q.H+" "));O=new T("input",{id:K[this.ID.H],className:"yui-picker-h"});M.appendChild(O);M.appendChild(document.createTextNode(" "+Q.DEG));N.appendChild(M);M=new R("li");M.appendChild(document.createTextNode(Q.S+" "));O=new T("input",{id:K[this.ID.S],className:"yui-picker-s"});M.appendChild(O);M.appendChild(document.createTextNode(" "+Q.PERCENT));N.appendChild(M);M=new R("li");M.appendChild(document.createTextNode(Q.V+" "));O=new T("input",{id:K[this.ID.V],className:"yui-picker-v"});M.appendChild(O);M.appendChild(document.createTextNode(" "+Q.PERCENT));N.appendChild(M);L.appendChild(N);N=new R("ul",{id:K[this.ID.HEX_SUMMARY],className:"yui-picker-hex_summary"});M=new R("li",{id:K[this.ID.R_HEX]});N.appendChild(M);M=new R("li",{id:K[this.ID.G_HEX]});N.appendChild(M);M=new R("li",{id:K[this.ID.B_HEX]});N.appendChild(M);L.appendChild(N);N=new R("div",{id:K[this.ID.HEX_CONTROLS],className:"yui-picker-hex-controls"});N.appendChild(document.createTextNode(Q.HEX+" "));M=new T("input",{id:K[this.ID.HEX],className:"yui-picker-hex",size:6,maxlength:6});N.appendChild(M);L.appendChild(N);L=this.get("element");N=new R("div",{id:K[this.ID.SWATCH],className:"yui-picker-swatch"});L.appendChild(N);N=new R("div",{id:K[this.ID.WEBSAFE_SWATCH],className:"yui-picker-websafe-swatch"});L.appendChild(N);},_attachRGBHSV:function(L,K){I.on(this.getElement(L),"keydown",function(N,M){M._rgbFieldKeypress(N,this,K);},this);I.on(this.getElement(L),"keypress",this._numbersOnly,this,true);I.on(this.getElement(L),"blur",function(N,M){M._useFieldValue(N,this,K);},this);},_updateRGB:function(){var K=[this.get(this.OPT.RED),this.get(this.OPT.GREEN),this.get(this.OPT.BLUE)];this.set(this.OPT.RGB,K);this._updateSliders();},_initElements:function(){var O=this.OPT,N=this.get(O.IDS),L=this.get(O.ELEMENTS),K,M,P;for(K in this.ID){if(C.hasOwnProperty(this.ID,K)){N[this.ID[K]]=N[K];}}M=E.get(N[this.ID.PICKER_BG]);if(!M){this._createElements();}else{}for(K in N){if(C.hasOwnProperty(N,K)){M=E.get(N[K]);P=E.generateId(M);N[K]=P;N[N[K]]=P;L[P]=M;}}},initPicker:function(){this._initSliders();this._bindUI();this.syncUI(true);},_initSliders:function(){var K=this.ID,L=this.get(this.OPT.PICKER_SIZE);this.hueSlider=D.getVertSlider(this.getElement(K.HUE_BG),this.getElement(K.HUE_THUMB),0,L);this.pickerSlider=D.getSliderRegion(this.getElement(K.PICKER_BG),this.getElement(K.PICKER_THUMB),0,L,0,L);this.set(this.OPT.ANIMATE,this.get(this.OPT.ANIMATE));},_bindUI:function(){var K=this.ID,L=this.OPT;this.hueSlider.subscribe("change",this._onHueSliderChange,this,true);this.pickerSlider.subscribe("change",this._onPickerSliderChange,this,true);I.on(this.getElement(K.WEBSAFE_SWATCH),"click",function(M){this.setValue(this.get(L.WEBSAFE));},this,true);I.on(this.getElement(K.CONTROLS_LABEL),"click",function(M){this.set(L.SHOW_CONTROLS,!this.get(L.SHOW_CONTROLS));I.preventDefault(M);},this,true);this._attachRGBHSV(K.R,L.RED);this._attachRGBHSV(K.G,L.GREEN);this._attachRGBHSV(K.B,L.BLUE);this._attachRGBHSV(K.H,L.HUE);
-this._attachRGBHSV(K.S,L.SATURATION);this._attachRGBHSV(K.V,L.VALUE);I.on(this.getElement(K.HEX),"keydown",function(N,M){M._hexFieldKeypress(N,this,L.HEX);},this);I.on(this.getElement(this.ID.HEX),"keypress",this._hexOnly,this,true);I.on(this.getElement(this.ID.HEX),"blur",function(N,M){M._useFieldValue(N,this,L.HEX);},this);},syncUI:function(K){this.skipAnim=K;this._updateRGB();this.skipAnim=false;},_updateRGBFromHSV:function(){var L=[this.get(this.OPT.HUE),this.get(this.OPT.SATURATION)/100,this.get(this.OPT.VALUE)/100],K=B.hsv2rgb(L);this.set(this.OPT.RGB,K);this._updateSliders();},_updateHex:function(){var N=this.get(this.OPT.HEX),K=N.length,O,M,L;if(K===3){O=N.split("");for(M=0;M<K;M=M+1){O[M]=O[M]+O[M];}N=O.join("");}if(N.length!==6){return false;}L=B.hex2rgb(N);this.setValue(L);},_hideShowEl:function(M,K){var L=(C.isString(M)?this.getElement(M):M);E.setStyle(L,"display",(K)?"":"none");},initAttributes:function(K){K=K||{};G.superclass.initAttributes.call(this,K);this.setAttributeConfig(this.OPT.PICKER_SIZE,{value:K.size||this.DEFAULT.PICKER_SIZE});this.setAttributeConfig(this.OPT.HUE,{value:K.hue||0,validator:C.isNumber});this.setAttributeConfig(this.OPT.SATURATION,{value:K.saturation||0,validator:C.isNumber});this.setAttributeConfig(this.OPT.VALUE,{value:C.isNumber(K.value)?K.value:100,validator:C.isNumber});this.setAttributeConfig(this.OPT.RED,{value:C.isNumber(K.red)?K.red:255,validator:C.isNumber});this.setAttributeConfig(this.OPT.GREEN,{value:C.isNumber(K.green)?K.green:255,validator:C.isNumber});this.setAttributeConfig(this.OPT.BLUE,{value:C.isNumber(K.blue)?K.blue:255,validator:C.isNumber});this.setAttributeConfig(this.OPT.HEX,{value:K.hex||"FFFFFF",validator:C.isString});this.setAttributeConfig(this.OPT.RGB,{value:K.rgb||[255,255,255],method:function(O){this.set(this.OPT.RED,O[0],true);this.set(this.OPT.GREEN,O[1],true);this.set(this.OPT.BLUE,O[2],true);var Q=B.websafe(O),P=B.rgb2hex(O),N=B.rgb2hsv(O);this.set(this.OPT.WEBSAFE,Q,true);this.set(this.OPT.HEX,P,true);if(N[1]){this.set(this.OPT.HUE,N[0],true);}this.set(this.OPT.SATURATION,Math.round(N[1]*100),true);this.set(this.OPT.VALUE,Math.round(N[2]*100),true);},readonly:true});this.setAttributeConfig(this.OPT.CONTAINER,{value:null,method:function(N){if(N){N.showEvent.subscribe(function(){this.pickerSlider.focus();},this,true);}}});this.setAttributeConfig(this.OPT.WEBSAFE,{value:K.websafe||[255,255,255]});var M=K.ids||C.merge({},this.ID),L;if(!K.ids&&J>1){for(L in M){if(C.hasOwnProperty(M,L)){M[L]=M[L]+J;}}}this.setAttributeConfig(this.OPT.IDS,{value:M,writeonce:true});this.setAttributeConfig(this.OPT.TXT,{value:K.txt||this.TXT,writeonce:true});this.setAttributeConfig(this.OPT.IMAGES,{value:K.images||this.IMAGE,writeonce:true});this.setAttributeConfig(this.OPT.ELEMENTS,{value:{},readonly:true});this.setAttributeConfig(this.OPT.SHOW_CONTROLS,{value:C.isBoolean(K.showcontrols)?K.showcontrols:true,method:function(N){var O=E.getElementsByClassName("bd","div",this.getElement(this.ID.CONTROLS))[0];this._hideShowEl(O,N);this.getElement(this.ID.CONTROLS_LABEL).innerHTML=(N)?this.get(this.OPT.TXT).HIDE_CONTROLS:this.get(this.OPT.TXT).SHOW_CONTROLS;}});this.setAttributeConfig(this.OPT.SHOW_RGB_CONTROLS,{value:C.isBoolean(K.showrgbcontrols)?K.showrgbcontrols:true,method:function(N){this._hideShowEl(this.ID.RGB_CONTROLS,N);}});this.setAttributeConfig(this.OPT.SHOW_HSV_CONTROLS,{value:C.isBoolean(K.showhsvcontrols)?K.showhsvcontrols:false,method:function(N){this._hideShowEl(this.ID.HSV_CONTROLS,N);if(N&&this.get(this.OPT.SHOW_HEX_SUMMARY)){this.set(this.OPT.SHOW_HEX_SUMMARY,false);}}});this.setAttributeConfig(this.OPT.SHOW_HEX_CONTROLS,{value:C.isBoolean(K.showhexcontrols)?K.showhexcontrols:false,method:function(N){this._hideShowEl(this.ID.HEX_CONTROLS,N);}});this.setAttributeConfig(this.OPT.SHOW_WEBSAFE,{value:C.isBoolean(K.showwebsafe)?K.showwebsafe:true,method:function(N){this._hideShowEl(this.ID.WEBSAFE_SWATCH,N);}});this.setAttributeConfig(this.OPT.SHOW_HEX_SUMMARY,{value:C.isBoolean(K.showhexsummary)?K.showhexsummary:true,method:function(N){this._hideShowEl(this.ID.HEX_SUMMARY,N);if(N&&this.get(this.OPT.SHOW_HSV_CONTROLS)){this.set(this.OPT.SHOW_HSV_CONTROLS,false);}}});this.setAttributeConfig(this.OPT.ANIMATE,{value:C.isBoolean(K.animate)?K.animate:true,method:function(N){if(this.pickerSlider){this.pickerSlider.animate=N;this.hueSlider.animate=N;}}});this.on(this.OPT.HUE+"Change",this._updateRGBFromHSV,this,true);this.on(this.OPT.SATURATION+"Change",this._updateRGBFromHSV,this,true);this.on(this.OPT.VALUE+"Change",this._updateRGBFromHSV,this,true);this.on(this.OPT.RED+"Change",this._updateRGB,this,true);this.on(this.OPT.GREEN+"Change",this._updateRGB,this,true);this.on(this.OPT.BLUE+"Change",this._updateRGB,this,true);this.on(this.OPT.HEX+"Change",this._updateHex,this,true);this._initElements();}});YAHOO.widget.ColorPicker=G;})();YAHOO.register("colorpicker",YAHOO.widget.ColorPicker,{version:"2.7.0",build:"1796"});
-
-/*
-Copyright (c) 2009, Yahoo! Inc. All rights reserved.
-Code licensed under the BSD License:
-http://developer.yahoo.net/yui/license.txt
-version: 2.7.0
-*/
-(function(){var B=YAHOO.util;var A=function(D,C,E,F){if(!D){}this.init(D,C,E,F);};A.NAME="Anim";A.prototype={toString:function(){var C=this.getEl()||{};var D=C.id||C.tagName;return(this.constructor.NAME+": "+D);},patterns:{noNegatives:/width|height|opacity|padding/i,offsetAttribute:/^((width|height)|(top|left))$/,defaultUnit:/width|height|top$|bottom$|left$|right$/i,offsetUnit:/\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i},doMethod:function(C,E,D){return this.method(this.currentFrame,E,D-E,this.totalFrames);},setAttribute:function(C,F,E){var D=this.getEl();if(this.patterns.noNegatives.test(C)){F=(F>0)?F:0;}if("style" in D){B.Dom.setStyle(D,C,F+E);}else{if(C in D){D[C]=F;}}},getAttribute:function(C){var E=this.getEl();var G=B.Dom.getStyle(E,C);if(G!=="auto"&&!this.patterns.offsetUnit.test(G)){return parseFloat(G);}var D=this.patterns.offsetAttribute.exec(C)||[];var H=!!(D[3]);var F=!!(D[2]);if("style" in E){if(F||(B.Dom.getStyle(E,"position")=="absolute"&&H)){G=E["offset"+D[0].charAt(0).toUpperCase()+D[0].substr(1)];}else{G=0;}}else{if(C in E){G=E[C];}}return G;},getDefaultUnit:function(C){if(this.patterns.defaultUnit.test(C)){return"px";}return"";},setRuntimeAttribute:function(D){var I;var E;var F=this.attributes;this.runtimeAttributes[D]={};var H=function(J){return(typeof J!=="undefined");};if(!H(F[D]["to"])&&!H(F[D]["by"])){return false;}I=(H(F[D]["from"]))?F[D]["from"]:this.getAttribute(D);if(H(F[D]["to"])){E=F[D]["to"];}else{if(H(F[D]["by"])){if(I.constructor==Array){E=[];for(var G=0,C=I.length;G<C;++G){E[G]=I[G]+F[D]["by"][G]*1;}}else{E=I+F[D]["by"]*1;}}}this.runtimeAttributes[D].start=I;this.runtimeAttributes[D].end=E;this.runtimeAttributes[D].unit=(H(F[D].unit))?F[D]["unit"]:this.getDefaultUnit(D);return true;},init:function(E,J,I,C){var D=false;var F=null;var H=0;E=B.Dom.get(E);this.attributes=J||{};this.duration=!YAHOO.lang.isUndefined(I)?I:1;this.method=C||B.Easing.easeNone;this.useSeconds=true;this.currentFrame=0;this.totalFrames=B.AnimMgr.fps;this.setEl=function(M){E=B.Dom.get(M);};this.getEl=function(){return E;};this.isAnimated=function(){return D;};this.getStartTime=function(){return F;};this.runtimeAttributes={};this.animate=function(){if(this.isAnimated()){return false;}this.currentFrame=0;this.totalFrames=(this.useSeconds)?Math.ceil(B.AnimMgr.fps*this.duration):this.duration;if(this.duration===0&&this.useSeconds){this.totalFrames=1;}B.AnimMgr.registerElement(this);return true;};this.stop=function(M){if(!this.isAnimated()){return false;}if(M){this.currentFrame=this.totalFrames;this._onTween.fire();}B.AnimMgr.stop(this);};var L=function(){this.onStart.fire();this.runtimeAttributes={};for(var M in this.attributes){this.setRuntimeAttribute(M);}D=true;H=0;F=new Date();};var K=function(){var O={duration:new Date()-this.getStartTime(),currentFrame:this.currentFrame};O.toString=function(){return("duration: "+O.duration+", currentFrame: "+O.currentFrame);};this.onTween.fire(O);var N=this.runtimeAttributes;for(var M in N){this.setAttribute(M,this.doMethod(M,N[M].start,N[M].end),N[M].unit);}H+=1;};var G=function(){var M=(new Date()-F)/1000;var N={duration:M,frames:H,fps:H/M};N.toString=function(){return("duration: "+N.duration+", frames: "+N.frames+", fps: "+N.fps);};D=false;H=0;this.onComplete.fire(N);};this._onStart=new B.CustomEvent("_start",this,true);this.onStart=new B.CustomEvent("start",this);this.onTween=new B.CustomEvent("tween",this);this._onTween=new B.CustomEvent("_tween",this,true);this.onComplete=new B.CustomEvent("complete",this);this._onComplete=new B.CustomEvent("_complete",this,true);this._onStart.subscribe(L);this._onTween.subscribe(K);this._onComplete.subscribe(G);}};B.Anim=A;})();YAHOO.util.AnimMgr=new function(){var C=null;var B=[];var A=0;this.fps=1000;this.delay=1;this.registerElement=function(F){B[B.length]=F;A+=1;F._onStart.fire();this.start();};this.unRegister=function(G,F){F=F||E(G);if(!G.isAnimated()||F==-1){return false;}G._onComplete.fire();B.splice(F,1);A-=1;if(A<=0){this.stop();}return true;};this.start=function(){if(C===null){C=setInterval(this.run,this.delay);}};this.stop=function(H){if(!H){clearInterval(C);for(var G=0,F=B.length;G<F;++G){this.unRegister(B[0],0);}B=[];C=null;A=0;}else{this.unRegister(H);}};this.run=function(){for(var H=0,F=B.length;H<F;++H){var G=B[H];if(!G||!G.isAnimated()){continue;}if(G.currentFrame<G.totalFrames||G.totalFrames===null){G.currentFrame+=1;if(G.useSeconds){D(G);}G._onTween.fire();}else{YAHOO.util.AnimMgr.stop(G,H);}}};var E=function(H){for(var G=0,F=B.length;G<F;++G){if(B[G]==H){return G;}}return -1;};var D=function(G){var J=G.totalFrames;var I=G.currentFrame;var H=(G.currentFrame*G.duration*1000/G.totalFrames);var F=(new Date()-G.getStartTime());var K=0;if(F<G.duration*1000){K=Math.round((F/H-1)*G.currentFrame);}else{K=J-(I+1);}if(K>0&&isFinite(K)){if(G.currentFrame+K>=J){K=J-(I+1);}G.currentFrame+=K;}};};YAHOO.util.Bezier=new function(){this.getPosition=function(E,D){var F=E.length;var C=[];for(var B=0;B<F;++B){C[B]=[E[B][0],E[B][1]];}for(var A=1;A<F;++A){for(B=0;B<F-A;++B){C[B][0]=(1-D)*C[B][0]+D*C[parseInt(B+1,10)][0];C[B][1]=(1-D)*C[B][1]+D*C[parseInt(B+1,10)][1];}}return[C[0][0],C[0][1]];};};(function(){var A=function(F,E,G,H){A.superclass.constructor.call(this,F,E,G,H);};A.NAME="ColorAnim";A.DEFAULT_BGCOLOR="#fff";var C=YAHOO.util;YAHOO.extend(A,C.Anim);var D=A.superclass;var B=A.prototype;B.patterns.color=/color$/i;B.patterns.rgb=/^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i;B.patterns.hex=/^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i;B.patterns.hex3=/^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i;B.patterns.transparent=/^transparent|rgba\(0, 0, 0, 0\)$/;B.parseColor=function(E){if(E.length==3){return E;}var F=this.patterns.hex.exec(E);if(F&&F.length==4){return[parseInt(F[1],16),parseInt(F[2],16),parseInt(F[3],16)];}F=this.patterns.rgb.exec(E);if(F&&F.length==4){return[parseInt(F[1],10),parseInt(F[2],10),parseInt(F[3],10)];}F=this.patterns.hex3.exec(E);if(F&&F.length==4){return[parseInt(F[1]+F[1],16),parseInt(F[2]+F[2],16),parseInt(F[3]+F[3],16)];
-}return null;};B.getAttribute=function(E){var G=this.getEl();if(this.patterns.color.test(E)){var I=YAHOO.util.Dom.getStyle(G,E);var H=this;if(this.patterns.transparent.test(I)){var F=YAHOO.util.Dom.getAncestorBy(G,function(J){return !H.patterns.transparent.test(I);});if(F){I=C.Dom.getStyle(F,E);}else{I=A.DEFAULT_BGCOLOR;}}}else{I=D.getAttribute.call(this,E);}return I;};B.doMethod=function(F,J,G){var I;if(this.patterns.color.test(F)){I=[];for(var H=0,E=J.length;H<E;++H){I[H]=D.doMethod.call(this,F,J[H],G[H]);}I="rgb("+Math.floor(I[0])+","+Math.floor(I[1])+","+Math.floor(I[2])+")";}else{I=D.doMethod.call(this,F,J,G);}return I;};B.setRuntimeAttribute=function(F){D.setRuntimeAttribute.call(this,F);if(this.patterns.color.test(F)){var H=this.attributes;var J=this.parseColor(this.runtimeAttributes[F].start);var G=this.parseColor(this.runtimeAttributes[F].end);if(typeof H[F]["to"]==="undefined"&&typeof H[F]["by"]!=="undefined"){G=this.parseColor(H[F].by);for(var I=0,E=J.length;I<E;++I){G[I]=J[I]+G[I];}}this.runtimeAttributes[F].start=J;this.runtimeAttributes[F].end=G;}};C.ColorAnim=A;})();
-/*
-TERMS OF USE - EASING EQUATIONS
-Open source under the BSD License.
-Copyright 2001 Robert Penner All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
- * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-YAHOO.util.Easing={easeNone:function(B,A,D,C){return D*B/C+A;},easeIn:function(B,A,D,C){return D*(B/=C)*B+A;},easeOut:function(B,A,D,C){return -D*(B/=C)*(B-2)+A;},easeBoth:function(B,A,D,C){if((B/=C/2)<1){return D/2*B*B+A;}return -D/2*((--B)*(B-2)-1)+A;},easeInStrong:function(B,A,D,C){return D*(B/=C)*B*B*B+A;},easeOutStrong:function(B,A,D,C){return -D*((B=B/C-1)*B*B*B-1)+A;},easeBothStrong:function(B,A,D,C){if((B/=C/2)<1){return D/2*B*B*B*B+A;}return -D/2*((B-=2)*B*B*B-2)+A;},elasticIn:function(C,A,G,F,B,E){if(C==0){return A;}if((C/=F)==1){return A+G;}if(!E){E=F*0.3;}if(!B||B<Math.abs(G)){B=G;var D=E/4;}else{var D=E/(2*Math.PI)*Math.asin(G/B);}return -(B*Math.pow(2,10*(C-=1))*Math.sin((C*F-D)*(2*Math.PI)/E))+A;},elasticOut:function(C,A,G,F,B,E){if(C==0){return A;}if((C/=F)==1){return A+G;}if(!E){E=F*0.3;}if(!B||B<Math.abs(G)){B=G;var D=E/4;}else{var D=E/(2*Math.PI)*Math.asin(G/B);}return B*Math.pow(2,-10*C)*Math.sin((C*F-D)*(2*Math.PI)/E)+G+A;},elasticBoth:function(C,A,G,F,B,E){if(C==0){return A;}if((C/=F/2)==2){return A+G;}if(!E){E=F*(0.3*1.5);}if(!B||B<Math.abs(G)){B=G;var D=E/4;}else{var D=E/(2*Math.PI)*Math.asin(G/B);}if(C<1){return -0.5*(B*Math.pow(2,10*(C-=1))*Math.sin((C*F-D)*(2*Math.PI)/E))+A;}return B*Math.pow(2,-10*(C-=1))*Math.sin((C*F-D)*(2*Math.PI)/E)*0.5+G+A;},backIn:function(B,A,E,D,C){if(typeof C=="undefined"){C=1.70158;}return E*(B/=D)*B*((C+1)*B-C)+A;},backOut:function(B,A,E,D,C){if(typeof C=="undefined"){C=1.70158;}return E*((B=B/D-1)*B*((C+1)*B+C)+1)+A;},backBoth:function(B,A,E,D,C){if(typeof C=="undefined"){C=1.70158;}if((B/=D/2)<1){return E/2*(B*B*(((C*=(1.525))+1)*B-C))+A;}return E/2*((B-=2)*B*(((C*=(1.525))+1)*B+C)+2)+A;},bounceIn:function(B,A,D,C){return D-YAHOO.util.Easing.bounceOut(C-B,0,D,C)+A;},bounceOut:function(B,A,D,C){if((B/=C)<(1/2.75)){return D*(7.5625*B*B)+A;}else{if(B<(2/2.75)){return D*(7.5625*(B-=(1.5/2.75))*B+0.75)+A;}else{if(B<(2.5/2.75)){return D*(7.5625*(B-=(2.25/2.75))*B+0.9375)+A;}}}return D*(7.5625*(B-=(2.625/2.75))*B+0.984375)+A;},bounceBoth:function(B,A,D,C){if(B<C/2){return YAHOO.util.Easing.bounceIn(B*2,0,D,C)*0.5+A;}return YAHOO.util.Easing.bounceOut(B*2-C,0,D,C)*0.5+D*0.5+A;}};(function(){var A=function(H,G,I,J){if(H){A.superclass.constructor.call(this,H,G,I,J);}};A.NAME="Motion";var E=YAHOO.util;YAHOO.extend(A,E.ColorAnim);var F=A.superclass;var C=A.prototype;C.patterns.points=/^points$/i;C.setAttribute=function(G,I,H){if(this.patterns.points.test(G)){H=H||"px";F.setAttribute.call(this,"left",I[0],H);F.setAttribute.call(this,"top",I[1],H);}else{F.setAttribute.call(this,G,I,H);}};C.getAttribute=function(G){if(this.patterns.points.test(G)){var H=[F.getAttribute.call(this,"left"),F.getAttribute.call(this,"top")];}else{H=F.getAttribute.call(this,G);}return H;};C.doMethod=function(G,K,H){var J=null;if(this.patterns.points.test(G)){var I=this.method(this.currentFrame,0,100,this.totalFrames)/100;J=E.Bezier.getPosition(this.runtimeAttributes[G],I);}else{J=F.doMethod.call(this,G,K,H);}return J;};C.setRuntimeAttribute=function(P){if(this.patterns.points.test(P)){var H=this.getEl();var J=this.attributes;var G;var L=J["points"]["control"]||[];var I;var M,O;if(L.length>0&&!(L[0] instanceof Array)){L=[L];}else{var K=[];for(M=0,O=L.length;M<O;++M){K[M]=L[M];}L=K;}if(E.Dom.getStyle(H,"position")=="static"){E.Dom.setStyle(H,"position","relative");}if(D(J["points"]["from"])){E.Dom.setXY(H,J["points"]["from"]);
-}else{E.Dom.setXY(H,E.Dom.getXY(H));}G=this.getAttribute("points");if(D(J["points"]["to"])){I=B.call(this,J["points"]["to"],G);var N=E.Dom.getXY(this.getEl());for(M=0,O=L.length;M<O;++M){L[M]=B.call(this,L[M],G);}}else{if(D(J["points"]["by"])){I=[G[0]+J["points"]["by"][0],G[1]+J["points"]["by"][1]];for(M=0,O=L.length;M<O;++M){L[M]=[G[0]+L[M][0],G[1]+L[M][1]];}}}this.runtimeAttributes[P]=[G];if(L.length>0){this.runtimeAttributes[P]=this.runtimeAttributes[P].concat(L);}this.runtimeAttributes[P][this.runtimeAttributes[P].length]=I;}else{F.setRuntimeAttribute.call(this,P);}};var B=function(G,I){var H=E.Dom.getXY(this.getEl());G=[G[0]-H[0]+I[0],G[1]-H[1]+I[1]];return G;};var D=function(G){return(typeof G!=="undefined");};E.Motion=A;})();(function(){var D=function(F,E,G,H){if(F){D.superclass.constructor.call(this,F,E,G,H);}};D.NAME="Scroll";var B=YAHOO.util;YAHOO.extend(D,B.ColorAnim);var C=D.superclass;var A=D.prototype;A.doMethod=function(E,H,F){var G=null;if(E=="scroll"){G=[this.method(this.currentFrame,H[0],F[0]-H[0],this.totalFrames),this.method(this.currentFrame,H[1],F[1]-H[1],this.totalFrames)];}else{G=C.doMethod.call(this,E,H,F);}return G;};A.getAttribute=function(E){var G=null;var F=this.getEl();if(E=="scroll"){G=[F.scrollLeft,F.scrollTop];}else{G=C.getAttribute.call(this,E);}return G;};A.setAttribute=function(E,H,G){var F=this.getEl();if(E=="scroll"){F.scrollLeft=H[0];F.scrollTop=H[1];}else{C.setAttribute.call(this,E,H,G);}};B.Scroll=D;})();YAHOO.register("animation",YAHOO.util.Anim,{version:"2.7.0",build:"1799"});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+/*jsl:ignoreall*/
+/*
+Copyright (c) 2009, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.net/yui/license.txt
+version: 2.7.0
+*/
+if(typeof YAHOO=="undefined"||!YAHOO){var YAHOO={};}YAHOO.namespace=function(){var A=arguments,E=null,C,B,D;for(C=0;C<A.length;C=C+1){D=(""+A[C]).split(".");E=YAHOO;for(B=(D[0]=="YAHOO")?1:0;B<D.length;B=B+1){E[D[B]]=E[D[B]]||{};E=E[D[B]];}}return E;};YAHOO.log=function(D,A,C){var B=YAHOO.widget.Logger;if(B&&B.log){return B.log(D,A,C);}else{return false;}};YAHOO.register=function(A,E,D){var I=YAHOO.env.modules,B,H,G,F,C;if(!I[A]){I[A]={versions:[],builds:[]};}B=I[A];H=D.version;G=D.build;F=YAHOO.env.listeners;B.name=A;B.version=H;B.build=G;B.versions.push(H);B.builds.push(G);B.mainClass=E;for(C=0;C<F.length;C=C+1){F[C](B);}if(E){E.VERSION=H;E.BUILD=G;}else{YAHOO.log("mainClass is undefined for module "+A,"warn");}};YAHOO.env=YAHOO.env||{modules:[],listeners:[]};YAHOO.env.getVersion=function(A){return YAHOO.env.modules[A]||null;};YAHOO.env.ua=function(){var C={ie:0,opera:0,gecko:0,webkit:0,mobile:null,air:0,caja:0},B=navigator.userAgent,A;if((/KHTML/).test(B)){C.webkit=1;}A=B.match(/AppleWebKit\/([^\s]*)/);if(A&&A[1]){C.webkit=parseFloat(A[1]);if(/ Mobile\//.test(B)){C.mobile="Apple";}else{A=B.match(/NokiaN[^\/]*/);if(A){C.mobile=A[0];}}A=B.match(/AdobeAIR\/([^\s]*)/);if(A){C.air=A[0];}}if(!C.webkit){A=B.match(/Opera[\s\/]([^\s]*)/);if(A&&A[1]){C.opera=parseFloat(A[1]);A=B.match(/Opera Mini[^;]*/);if(A){C.mobile=A[0];}}else{A=B.match(/MSIE\s([^;]*)/);if(A&&A[1]){C.ie=parseFloat(A[1]);}else{A=B.match(/Gecko\/([^\s]*)/);if(A){C.gecko=1;A=B.match(/rv:([^\s\)]*)/);if(A&&A[1]){C.gecko=parseFloat(A[1]);}}}}}A=B.match(/Caja\/([^\s]*)/);if(A&&A[1]){C.caja=parseFloat(A[1]);}return C;}();(function(){YAHOO.namespace("util","widget","example");if("undefined"!==typeof YAHOO_config){var B=YAHOO_config.listener,A=YAHOO.env.listeners,D=true,C;if(B){for(C=0;C<A.length;C=C+1){if(A[C]==B){D=false;break;}}if(D){A.push(B);}}}})();YAHOO.lang=YAHOO.lang||{};(function(){var B=YAHOO.lang,F="[object Array]",C="[object Function]",A=Object.prototype,E=["toString","valueOf"],D={isArray:function(G){return A.toString.apply(G)===F;},isBoolean:function(G){return typeof G==="boolean";},isFunction:function(G){return A.toString.apply(G)===C;},isNull:function(G){return G===null;},isNumber:function(G){return typeof G==="number"&&isFinite(G);},isObject:function(G){return(G&&(typeof G==="object"||B.isFunction(G)))||false;},isString:function(G){return typeof G==="string";},isUndefined:function(G){return typeof G==="undefined";},_IEEnumFix:(YAHOO.env.ua.ie)?function(I,H){var G,K,J;for(G=0;G<E.length;G=G+1){K=E[G];J=H[K];if(B.isFunction(J)&&J!=A[K]){I[K]=J;}}}:function(){},extend:function(J,K,I){if(!K||!J){throw new Error("extend failed, please check that "+"all dependencies are included.");}var H=function(){},G;H.prototype=K.prototype;J.prototype=new H();J.prototype.constructor=J;J.superclass=K.prototype;if(K.prototype.constructor==A.constructor){K.prototype.constructor=K;}if(I){for(G in I){if(B.hasOwnProperty(I,G)){J.prototype[G]=I[G];}}B._IEEnumFix(J.prototype,I);}},augmentObject:function(K,J){if(!J||!K){throw new Error("Absorb failed, verify dependencies.");}var G=arguments,I,L,H=G[2];if(H&&H!==true){for(I=2;I<G.length;I=I+1){K[G[I]]=J[G[I]];}}else{for(L in J){if(H||!(L in K)){K[L]=J[L];}}B._IEEnumFix(K,J);}},augmentProto:function(J,I){if(!I||!J){throw new Error("Augment failed, verify dependencies.");}var G=[J.prototype,I.prototype],H;for(H=2;H<arguments.length;H=H+1){G.push(arguments[H]);}B.augmentObject.apply(this,G);},dump:function(G,L){var I,K,N=[],O="{...}",H="f(){...}",M=", ",J=" => ";if(!B.isObject(G)){return G+"";}else{if(G instanceof Date||("nodeType" in G&&"tagName" in G)){return G;}else{if(B.isFunction(G)){return H;}}}L=(B.isNumber(L))?L:3;if(B.isArray(G)){N.push("[");for(I=0,K=G.length;I<K;I=I+1){if(B.isObject(G[I])){N.push((L>0)?B.dump(G[I],L-1):O);}else{N.push(G[I]);}N.push(M);}if(N.length>1){N.pop();}N.push("]");}else{N.push("{");for(I in G){if(B.hasOwnProperty(G,I)){N.push(I+J);if(B.isObject(G[I])){N.push((L>0)?B.dump(G[I],L-1):O);}else{N.push(G[I]);}N.push(M);}}if(N.length>1){N.pop();}N.push("}");}return N.join("");},substitute:function(V,H,O){var L,K,J,R,S,U,Q=[],I,M="dump",P=" ",G="{",T="}",N;for(;;){L=V.lastIndexOf(G);if(L<0){break;}K=V.indexOf(T,L);if(L+1>=K){break;}I=V.substring(L+1,K);R=I;U=null;J=R.indexOf(P);if(J>-1){U=R.substring(J+1);R=R.substring(0,J);}S=H[R];if(O){S=O(R,S,U);}if(B.isObject(S)){if(B.isArray(S)){S=B.dump(S,parseInt(U,10));}else{U=U||"";N=U.indexOf(M);if(N>-1){U=U.substring(4);}if(S.toString===A.toString||N>-1){S=B.dump(S,parseInt(U,10));}else{S=S.toString();}}}else{if(!B.isString(S)&&!B.isNumber(S)){S="~-"+Q.length+"-~";Q[Q.length]=I;}}V=V.substring(0,L)+S+V.substring(K+1);}for(L=Q.length-1;L>=0;L=L-1){V=V.replace(new RegExp("~-"+L+"-~"),"{"+Q[L]+"}","g");}return V;},trim:function(G){try{return G.replace(/^\s+|\s+$/g,"");}catch(H){return G;}},merge:function(){var J={},H=arguments,G=H.length,I;for(I=0;I<G;I=I+1){B.augmentObject(J,H[I],true);}return J;},later:function(N,H,O,J,K){N=N||0;H=H||{};var I=O,M=J,L,G;if(B.isString(O)){I=H[O];}if(!I){throw new TypeError("method undefined");}if(!B.isArray(M)){M=[J];}L=function(){I.apply(H,M);};G=(K)?setInterval(L,N):setTimeout(L,N);return{interval:K,cancel:function(){if(this.interval){clearInterval(G);}else{clearTimeout(G);}}};},isValue:function(G){return(B.isObject(G)||B.isString(G)||B.isNumber(G)||B.isBoolean(G));}};B.hasOwnProperty=(A.hasOwnProperty)?function(G,H){return G&&G.hasOwnProperty(H);}:function(G,H){return !B.isUndefined(G[H])&&G.constructor.prototype[H]!==G[H];};D.augmentObject(B,D,true);YAHOO.util.Lang=B;B.augment=B.augmentProto;YAHOO.augment=B.augmentProto;YAHOO.extend=B.extend;})();YAHOO.register("yahoo",YAHOO,{version:"2.7.0",build:"1796"});(function(){YAHOO.env._id_counter=YAHOO.env._id_counter||0;var E=YAHOO.util,L=YAHOO.lang,m=YAHOO.env.ua,A=YAHOO.lang.trim,d={},h={},N=/^t(?:able|d|h)$/i,X=/color$/i,K=window.document,W=K.documentElement,e="ownerDocument",n="defaultView",v="documentElement",t="compatMode",b="offsetLeft",P="offsetTop",u="offsetParent",Z="parentNode",l="nodeType",C="tagName",O="scrollLeft",i="scrollTop",Q="getBoundingClientRect",w="getComputedStyle",a="currentStyle",M="CSS1Compat",c="BackCompat",g="class",F="className",J="",B=" ",s="(?:^|\\s)",k="(?= |$)",U="g",p="position",f="fixed",V="relative",j="left",o="top",r="medium",q="borderLeftWidth",R="borderTopWidth",D=m.opera,I=m.webkit,H=m.gecko,T=m.ie;E.Dom={CUSTOM_ATTRIBUTES:(!W.hasAttribute)?{"for":"htmlFor","class":F}:{"htmlFor":"for","className":g},get:function(y){var AA,Y,z,x,G;if(y){if(y[l]||y.item){return y;}if(typeof y==="string"){AA=y;y=K.getElementById(y);if(y&&y.id===AA){return y;}else{if(y&&K.all){y=null;Y=K.all[AA];for(x=0,G=Y.length;x<G;++x){if(Y[x].id===AA){return Y[x];}}}}return y;}if(y.DOM_EVENTS){y=y.get("element");}if("length" in y){z=[];for(x=0,G=y.length;x<G;++x){z[z.length]=E.Dom.get(y[x]);}return z;}return y;}return null;},getComputedStyle:function(G,Y){if(window[w]){return G[e][n][w](G,null)[Y];}else{if(G[a]){return E.Dom.IE_ComputedStyle.get(G,Y);}}},getStyle:function(G,Y){return E.Dom.batch(G,E.Dom._getStyle,Y);},_getStyle:function(){if(window[w]){return function(G,y){y=(y==="float")?y="cssFloat":E.Dom._toCamel(y);var x=G.style[y],Y;if(!x){Y=G[e][n][w](G,null);if(Y){x=Y[y];}}return x;};}else{if(W[a]){return function(G,y){var x;switch(y){case"opacity":x=100;try{x=G.filters["DXImageTransform.Microsoft.Alpha"].opacity;}catch(z){try{x=G.filters("alpha").opacity;}catch(Y){}}return x/100;case"float":y="styleFloat";default:y=E.Dom._toCamel(y);x=G[a]?G[a][y]:null;return(G.style[y]||x);}};}}}(),setStyle:function(G,Y,x){E.Dom.batch(G,E.Dom._setStyle,{prop:Y,val:x});},_setStyle:function(){if(T){return function(Y,G){var x=E.Dom._toCamel(G.prop),y=G.val;if(Y){switch(x){case"opacity":if(L.isString(Y.style.filter)){Y.style.filter="alpha(opacity="+y*100+")";if(!Y[a]||!Y[a].hasLayout){Y.style.zoom=1;}}break;case"float":x="styleFloat";default:Y.style[x]=y;}}else{}};}else{return function(Y,G){var x=E.Dom._toCamel(G.prop),y=G.val;if(Y){if(x=="float"){x="cssFloat";}Y.style[x]=y;}else{}};}}(),getXY:function(G){return E.Dom.batch(G,E.Dom._getXY);},_canPosition:function(G){return(E.Dom._getStyle(G,"display")!=="none"&&E.Dom._inDoc(G));},_getXY:function(){if(K[v][Q]){return function(y){var z,Y,AA,AF,AE,AD,AC,G,x,AB=Math.floor,AG=false;if(E.Dom._canPosition(y)){AA=y[Q]();AF=y[e];z=E.Dom.getDocumentScrollLeft(AF);Y=E.Dom.getDocumentScrollTop(AF);AG=[AB(AA[j]),AB(AA[o])];if(T&&m.ie<8){AE=2;AD=2;AC=AF[t];G=S(AF[v],q);x=S(AF[v],R);if(m.ie===6){if(AC!==c){AE=0;AD=0;}}if((AC==c)){if(G!==r){AE=parseInt(G,10);}if(x!==r){AD=parseInt(x,10);}}AG[0]-=AE;AG[1]-=AD;}if((Y||z)){AG[0]+=z;AG[1]+=Y;}AG[0]=AB(AG[0]);AG[1]=AB(AG[1]);}else{}return AG;};}else{return function(y){var x,Y,AA,AB,AC,z=false,G=y;if(E.Dom._canPosition(y)){z=[y[b],y[P]];x=E.Dom.getDocumentScrollLeft(y[e]);Y=E.Dom.getDocumentScrollTop(y[e]);AC=((H||m.webkit>519)?true:false);while((G=G[u])){z[0]+=G[b];z[1]+=G[P];if(AC){z=E.Dom._calcBorders(G,z);}}if(E.Dom._getStyle(y,p)!==f){G=y;while((G=G[Z])&&G[C]){AA=G[i];AB=G[O];if(H&&(E.Dom._getStyle(G,"overflow")!=="visible")){z=E.Dom._calcBorders(G,z);}if(AA||AB){z[0]-=AB;z[1]-=AA;}}z[0]+=x;z[1]+=Y;}else{if(D){z[0]-=x;z[1]-=Y;}else{if(I||H){z[0]+=x;z[1]+=Y;}}}z[0]=Math.floor(z[0]);z[1]=Math.floor(z[1]);}else{}return z;};}}(),getX:function(G){var Y=function(x){return E.Dom.getXY(x)[0];};return E.Dom.batch(G,Y,E.Dom,true);},getY:function(G){var Y=function(x){return E.Dom.getXY(x)[1];};return E.Dom.batch(G,Y,E.Dom,true);},setXY:function(G,x,Y){E.Dom.batch(G,E.Dom._setXY,{pos:x,noRetry:Y});},_setXY:function(G,z){var AA=E.Dom._getStyle(G,p),y=E.Dom.setStyle,AD=z.pos,Y=z.noRetry,AB=[parseInt(E.Dom.getComputedStyle(G,j),10),parseInt(E.Dom.getComputedStyle(G,o),10)],AC,x;if(AA=="static"){AA=V;y(G,p,AA);}AC=E.Dom._getXY(G);if(!AD||AC===false){return false;}if(isNaN(AB[0])){AB[0]=(AA==V)?0:G[b];}if(isNaN(AB[1])){AB[1]=(AA==V)?0:G[P];}if(AD[0]!==null){y(G,j,AD[0]-AC[0]+AB[0]+"px");}if(AD[1]!==null){y(G,o,AD[1]-AC[1]+AB[1]+"px");}if(!Y){x=E.Dom._getXY(G);if((AD[0]!==null&&x[0]!=AD[0])||(AD[1]!==null&&x[1]!=AD[1])){E.Dom._setXY(G,{pos:AD,noRetry:true});}}},setX:function(Y,G){E.Dom.setXY(Y,[G,null]);},setY:function(G,Y){E.Dom.setXY(G,[null,Y]);},getRegion:function(G){var Y=function(x){var y=false;if(E.Dom._canPosition(x)){y=E.Region.getRegion(x);}else{}return y;};return E.Dom.batch(G,Y,E.Dom,true);},getClientWidth:function(){return E.Dom.getViewportWidth();},getClientHeight:function(){return E.Dom.getViewportHeight();},getElementsByClassName:function(AB,AF,AC,AE,x,AD){AB=L.trim(AB);AF=AF||"*";AC=(AC)?E.Dom.get(AC):null||K;if(!AC){return[];}var Y=[],G=AC.getElementsByTagName(AF),z=E.Dom.hasClass;for(var y=0,AA=G.length;y<AA;++y){if(z(G[y],AB)){Y[Y.length]=G[y];}}if(AE){E.Dom.batch(Y,AE,x,AD);}return Y;},hasClass:function(Y,G){return E.Dom.batch(Y,E.Dom._hasClass,G);},_hasClass:function(x,Y){var G=false,y;if(x&&Y){y=E.Dom.getAttribute(x,F)||J;if(Y.exec){G=Y.test(y);}else{G=Y&&(B+y+B).indexOf(B+Y+B)>-1;}}else{}return G;},addClass:function(Y,G){return E.Dom.batch(Y,E.Dom._addClass,G);},_addClass:function(x,Y){var G=false,y;if(x&&Y){y=E.Dom.getAttribute(x,F)||J;if(!E.Dom._hasClass(x,Y)){E.Dom.setAttribute(x,F,A(y+B+Y));G=true;}}else{}return G;},removeClass:function(Y,G){return E.Dom.batch(Y,E.Dom._removeClass,G);},_removeClass:function(y,x){var Y=false,AA,z,G;if(y&&x){AA=E.Dom.getAttribute(y,F)||J;E.Dom.setAttribute(y,F,AA.replace(E.Dom._getClassRegex(x),J));z=E.Dom.getAttribute(y,F);if(AA!==z){E.Dom.setAttribute(y,F,A(z));Y=true;if(E.Dom.getAttribute(y,F)===""){G=(y.hasAttribute&&y.hasAttribute(g))?g:F;y.removeAttribute(G);}}}else{}return Y;},replaceClass:function(x,Y,G){return E.Dom.batch(x,E.Dom._replaceClass,{from:Y,to:G});
+},_replaceClass:function(y,x){var Y,AB,AA,G=false,z;if(y&&x){AB=x.from;AA=x.to;if(!AA){G=false;}else{if(!AB){G=E.Dom._addClass(y,x.to);}else{if(AB!==AA){z=E.Dom.getAttribute(y,F)||J;Y=(B+z.replace(E.Dom._getClassRegex(AB),B+AA)).split(E.Dom._getClassRegex(AA));Y.splice(1,0,B+AA);E.Dom.setAttribute(y,F,A(Y.join(J)));G=true;}}}}else{}return G;},generateId:function(G,x){x=x||"yui-gen";var Y=function(y){if(y&&y.id){return y.id;}var z=x+YAHOO.env._id_counter++;if(y){if(y[e].getElementById(z)){return E.Dom.generateId(y,z+x);}y.id=z;}return z;};return E.Dom.batch(G,Y,E.Dom,true)||Y.apply(E.Dom,arguments);},isAncestor:function(Y,x){Y=E.Dom.get(Y);x=E.Dom.get(x);var G=false;if((Y&&x)&&(Y[l]&&x[l])){if(Y.contains&&Y!==x){G=Y.contains(x);}else{if(Y.compareDocumentPosition){G=!!(Y.compareDocumentPosition(x)&16);}}}else{}return G;},inDocument:function(G,Y){return E.Dom._inDoc(E.Dom.get(G),Y);},_inDoc:function(Y,x){var G=false;if(Y&&Y[C]){x=x||Y[e];G=E.Dom.isAncestor(x[v],Y);}else{}return G;},getElementsBy:function(Y,AF,AB,AD,y,AC,AE){AF=AF||"*";AB=(AB)?E.Dom.get(AB):null||K;if(!AB){return[];}var x=[],G=AB.getElementsByTagName(AF);for(var z=0,AA=G.length;z<AA;++z){if(Y(G[z])){if(AE){x=G[z];break;}else{x[x.length]=G[z];}}}if(AD){E.Dom.batch(x,AD,y,AC);}return x;},getElementBy:function(x,G,Y){return E.Dom.getElementsBy(x,G,Y,null,null,null,true);},batch:function(x,AB,AA,z){var y=[],Y=(z)?AA:window;x=(x&&(x[C]||x.item))?x:E.Dom.get(x);if(x&&AB){if(x[C]||x.length===undefined){return AB.call(Y,x,AA);}for(var G=0;G<x.length;++G){y[y.length]=AB.call(Y,x[G],AA);}}else{return false;}return y;},getDocumentHeight:function(){var Y=(K[t]!=M||I)?K.body.scrollHeight:W.scrollHeight,G=Math.max(Y,E.Dom.getViewportHeight());return G;},getDocumentWidth:function(){var Y=(K[t]!=M||I)?K.body.scrollWidth:W.scrollWidth,G=Math.max(Y,E.Dom.getViewportWidth());return G;},getViewportHeight:function(){var G=self.innerHeight,Y=K[t];if((Y||T)&&!D){G=(Y==M)?W.clientHeight:K.body.clientHeight;}return G;},getViewportWidth:function(){var G=self.innerWidth,Y=K[t];if(Y||T){G=(Y==M)?W.clientWidth:K.body.clientWidth;}return G;},getAncestorBy:function(G,Y){while((G=G[Z])){if(E.Dom._testElement(G,Y)){return G;}}return null;},getAncestorByClassName:function(Y,G){Y=E.Dom.get(Y);if(!Y){return null;}var x=function(y){return E.Dom.hasClass(y,G);};return E.Dom.getAncestorBy(Y,x);},getAncestorByTagName:function(Y,G){Y=E.Dom.get(Y);if(!Y){return null;}var x=function(y){return y[C]&&y[C].toUpperCase()==G.toUpperCase();};return E.Dom.getAncestorBy(Y,x);},getPreviousSiblingBy:function(G,Y){while(G){G=G.previousSibling;if(E.Dom._testElement(G,Y)){return G;}}return null;},getPreviousSibling:function(G){G=E.Dom.get(G);if(!G){return null;}return E.Dom.getPreviousSiblingBy(G);},getNextSiblingBy:function(G,Y){while(G){G=G.nextSibling;if(E.Dom._testElement(G,Y)){return G;}}return null;},getNextSibling:function(G){G=E.Dom.get(G);if(!G){return null;}return E.Dom.getNextSiblingBy(G);},getFirstChildBy:function(G,x){var Y=(E.Dom._testElement(G.firstChild,x))?G.firstChild:null;return Y||E.Dom.getNextSiblingBy(G.firstChild,x);},getFirstChild:function(G,Y){G=E.Dom.get(G);if(!G){return null;}return E.Dom.getFirstChildBy(G);},getLastChildBy:function(G,x){if(!G){return null;}var Y=(E.Dom._testElement(G.lastChild,x))?G.lastChild:null;return Y||E.Dom.getPreviousSiblingBy(G.lastChild,x);},getLastChild:function(G){G=E.Dom.get(G);return E.Dom.getLastChildBy(G);},getChildrenBy:function(Y,y){var x=E.Dom.getFirstChildBy(Y,y),G=x?[x]:[];E.Dom.getNextSiblingBy(x,function(z){if(!y||y(z)){G[G.length]=z;}return false;});return G;},getChildren:function(G){G=E.Dom.get(G);if(!G){}return E.Dom.getChildrenBy(G);},getDocumentScrollLeft:function(G){G=G||K;return Math.max(G[v].scrollLeft,G.body.scrollLeft);},getDocumentScrollTop:function(G){G=G||K;return Math.max(G[v].scrollTop,G.body.scrollTop);},insertBefore:function(Y,G){Y=E.Dom.get(Y);G=E.Dom.get(G);if(!Y||!G||!G[Z]){return null;}return G[Z].insertBefore(Y,G);},insertAfter:function(Y,G){Y=E.Dom.get(Y);G=E.Dom.get(G);if(!Y||!G||!G[Z]){return null;}if(G.nextSibling){return G[Z].insertBefore(Y,G.nextSibling);}else{return G[Z].appendChild(Y);}},getClientRegion:function(){var x=E.Dom.getDocumentScrollTop(),Y=E.Dom.getDocumentScrollLeft(),y=E.Dom.getViewportWidth()+Y,G=E.Dom.getViewportHeight()+x;return new E.Region(x,y,G,Y);},setAttribute:function(Y,G,x){G=E.Dom.CUSTOM_ATTRIBUTES[G]||G;Y.setAttribute(G,x);},getAttribute:function(Y,G){G=E.Dom.CUSTOM_ATTRIBUTES[G]||G;return Y.getAttribute(G);},_toCamel:function(Y){var x=d;function G(y,z){return z.toUpperCase();}return x[Y]||(x[Y]=Y.indexOf("-")===-1?Y:Y.replace(/-([a-z])/gi,G));},_getClassRegex:function(Y){var G;if(Y!==undefined){if(Y.exec){G=Y;}else{G=h[Y];if(!G){Y=Y.replace(E.Dom._patterns.CLASS_RE_TOKENS,"\\$1");G=h[Y]=new RegExp(s+Y+k,U);}}}return G;},_patterns:{ROOT_TAG:/^body|html$/i,CLASS_RE_TOKENS:/([\.\(\)\^\$\*\+\?\|\[\]\{\}])/g},_testElement:function(G,Y){return G&&G[l]==1&&(!Y||Y(G));},_calcBorders:function(x,y){var Y=parseInt(E.Dom[w](x,R),10)||0,G=parseInt(E.Dom[w](x,q),10)||0;if(H){if(N.test(x[C])){Y=0;G=0;}}y[0]+=G;y[1]+=Y;return y;}};var S=E.Dom[w];if(m.opera){E.Dom[w]=function(Y,G){var x=S(Y,G);if(X.test(G)){x=E.Dom.Color.toRGB(x);}return x;};}if(m.webkit){E.Dom[w]=function(Y,G){var x=S(Y,G);if(x==="rgba(0, 0, 0, 0)"){x="transparent";}return x;};}})();YAHOO.util.Region=function(C,D,A,B){this.top=C;this.y=C;this[1]=C;this.right=D;this.bottom=A;this.left=B;this.x=B;this[0]=B;this.width=this.right-this.left;this.height=this.bottom-this.top;};YAHOO.util.Region.prototype.contains=function(A){return(A.left>=this.left&&A.right<=this.right&&A.top>=this.top&&A.bottom<=this.bottom);};YAHOO.util.Region.prototype.getArea=function(){return((this.bottom-this.top)*(this.right-this.left));};YAHOO.util.Region.prototype.intersect=function(E){var C=Math.max(this.top,E.top),D=Math.min(this.right,E.right),A=Math.min(this.bottom,E.bottom),B=Math.max(this.left,E.left);if(A>=C&&D>=B){return new YAHOO.util.Region(C,D,A,B);
+}else{return null;}};YAHOO.util.Region.prototype.union=function(E){var C=Math.min(this.top,E.top),D=Math.max(this.right,E.right),A=Math.max(this.bottom,E.bottom),B=Math.min(this.left,E.left);return new YAHOO.util.Region(C,D,A,B);};YAHOO.util.Region.prototype.toString=function(){return("Region {"+"top: "+this.top+", right: "+this.right+", bottom: "+this.bottom+", left: "+this.left+", height: "+this.height+", width: "+this.width+"}");};YAHOO.util.Region.getRegion=function(D){var F=YAHOO.util.Dom.getXY(D),C=F[1],E=F[0]+D.offsetWidth,A=F[1]+D.offsetHeight,B=F[0];return new YAHOO.util.Region(C,E,A,B);};YAHOO.util.Point=function(A,B){if(YAHOO.lang.isArray(A)){B=A[1];A=A[0];}YAHOO.util.Point.superclass.constructor.call(this,B,A,B,A);};YAHOO.extend(YAHOO.util.Point,YAHOO.util.Region);(function(){var B=YAHOO.util,A="clientTop",F="clientLeft",J="parentNode",K="right",W="hasLayout",I="px",U="opacity",L="auto",D="borderLeftWidth",G="borderTopWidth",P="borderRightWidth",V="borderBottomWidth",S="visible",Q="transparent",N="height",E="width",H="style",T="currentStyle",R=/^width|height$/,O=/^(\d[.\d]*)+(em|ex|px|gd|rem|vw|vh|vm|ch|mm|cm|in|pt|pc|deg|rad|ms|s|hz|khz|%){1}?/i,M={get:function(X,Z){var Y="",a=X[T][Z];if(Z===U){Y=B.Dom.getStyle(X,U);}else{if(!a||(a.indexOf&&a.indexOf(I)>-1)){Y=a;}else{if(B.Dom.IE_COMPUTED[Z]){Y=B.Dom.IE_COMPUTED[Z](X,Z);}else{if(O.test(a)){Y=B.Dom.IE.ComputedStyle.getPixel(X,Z);}else{Y=a;}}}}return Y;},getOffset:function(Z,e){var b=Z[T][e],X=e.charAt(0).toUpperCase()+e.substr(1),c="offset"+X,Y="pixel"+X,a="",d;if(b==L){d=Z[c];if(d===undefined){a=0;}a=d;if(R.test(e)){Z[H][e]=d;if(Z[c]>d){a=d-(Z[c]-d);}Z[H][e]=L;}}else{if(!Z[H][Y]&&!Z[H][e]){Z[H][e]=b;}a=Z[H][Y];}return a+I;},getBorderWidth:function(X,Z){var Y=null;if(!X[T][W]){X[H].zoom=1;}switch(Z){case G:Y=X[A];break;case V:Y=X.offsetHeight-X.clientHeight-X[A];break;case D:Y=X[F];break;case P:Y=X.offsetWidth-X.clientWidth-X[F];break;}return Y+I;},getPixel:function(Y,X){var a=null,b=Y[T][K],Z=Y[T][X];Y[H][K]=Z;a=Y[H].pixelRight;Y[H][K]=b;return a+I;},getMargin:function(Y,X){var Z;if(Y[T][X]==L){Z=0+I;}else{Z=B.Dom.IE.ComputedStyle.getPixel(Y,X);}return Z;},getVisibility:function(Y,X){var Z;while((Z=Y[T])&&Z[X]=="inherit"){Y=Y[J];}return(Z)?Z[X]:S;},getColor:function(Y,X){return B.Dom.Color.toRGB(Y[T][X])||Q;},getBorderColor:function(Y,X){var Z=Y[T],a=Z[X]||Z.color;return B.Dom.Color.toRGB(B.Dom.Color.toHex(a));}},C={};C.top=C.right=C.bottom=C.left=C[E]=C[N]=M.getOffset;C.color=M.getColor;C[G]=C[P]=C[V]=C[D]=M.getBorderWidth;C.marginTop=C.marginRight=C.marginBottom=C.marginLeft=M.getMargin;C.visibility=M.getVisibility;C.borderColor=C.borderTopColor=C.borderRightColor=C.borderBottomColor=C.borderLeftColor=M.getBorderColor;B.Dom.IE_COMPUTED=C;B.Dom.IE_ComputedStyle=M;})();(function(){var C="toString",A=parseInt,B=RegExp,D=YAHOO.util;D.Dom.Color={KEYWORDS:{black:"000",silver:"c0c0c0",gray:"808080",white:"fff",maroon:"800000",red:"f00",purple:"800080",fuchsia:"f0f",green:"008000",lime:"0f0",olive:"808000",yellow:"ff0",navy:"000080",blue:"00f",teal:"008080",aqua:"0ff"},re_RGB:/^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i,re_hex:/^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i,re_hex3:/([0-9A-F])/gi,toRGB:function(E){if(!D.Dom.Color.re_RGB.test(E)){E=D.Dom.Color.toHex(E);}if(D.Dom.Color.re_hex.exec(E)){E="rgb("+[A(B.$1,16),A(B.$2,16),A(B.$3,16)].join(", ")+")";}return E;},toHex:function(H){H=D.Dom.Color.KEYWORDS[H]||H;if(D.Dom.Color.re_RGB.exec(H)){var G=(B.$1.length===1)?"0"+B.$1:Number(B.$1),F=(B.$2.length===1)?"0"+B.$2:Number(B.$2),E=(B.$3.length===1)?"0"+B.$3:Number(B.$3);H=[G[C](16),F[C](16),E[C](16)].join("");}if(H.length<6){H=H.replace(D.Dom.Color.re_hex3,"$1$1");}if(H!=="transparent"&&H.indexOf("#")<0){H="#"+H;}return H.toLowerCase();}};}());YAHOO.register("dom",YAHOO.util.Dom,{version:"2.7.0",build:"1796"});YAHOO.util.CustomEvent=function(D,C,B,A){this.type=D;this.scope=C||window;this.silent=B;this.signature=A||YAHOO.util.CustomEvent.LIST;this.subscribers=[];if(!this.silent){}var E="_YUICEOnSubscribe";if(D!==E){this.subscribeEvent=new YAHOO.util.CustomEvent(E,this,true);}this.lastError=null;};YAHOO.util.CustomEvent.LIST=0;YAHOO.util.CustomEvent.FLAT=1;YAHOO.util.CustomEvent.prototype={subscribe:function(A,B,C){if(!A){throw new Error("Invalid callback for subscriber to '"+this.type+"'");}if(this.subscribeEvent){this.subscribeEvent.fire(A,B,C);}this.subscribers.push(new YAHOO.util.Subscriber(A,B,C));},unsubscribe:function(D,F){if(!D){return this.unsubscribeAll();}var E=false;for(var B=0,A=this.subscribers.length;B<A;++B){var C=this.subscribers[B];if(C&&C.contains(D,F)){this._delete(B);E=true;}}return E;},fire:function(){this.lastError=null;var K=[],E=this.subscribers.length;if(!E&&this.silent){return true;}var I=[].slice.call(arguments,0),G=true,D,J=false;if(!this.silent){}var C=this.subscribers.slice(),A=YAHOO.util.Event.throwErrors;for(D=0;D<E;++D){var M=C[D];if(!M){J=true;}else{if(!this.silent){}var L=M.getScope(this.scope);if(this.signature==YAHOO.util.CustomEvent.FLAT){var B=null;if(I.length>0){B=I[0];}try{G=M.fn.call(L,B,M.obj);}catch(F){this.lastError=F;if(A){throw F;}}}else{try{G=M.fn.call(L,this.type,I,M.obj);}catch(H){this.lastError=H;if(A){throw H;}}}if(false===G){if(!this.silent){}break;}}}return(G!==false);},unsubscribeAll:function(){var A=this.subscribers.length,B;for(B=A-1;B>-1;B--){this._delete(B);}this.subscribers=[];return A;},_delete:function(A){var B=this.subscribers[A];if(B){delete B.fn;delete B.obj;}this.subscribers.splice(A,1);},toString:function(){return"CustomEvent: "+"'"+this.type+"', "+"context: "+this.scope;}};YAHOO.util.Subscriber=function(A,B,C){this.fn=A;this.obj=YAHOO.lang.isUndefined(B)?null:B;this.overrideContext=C;};YAHOO.util.Subscriber.prototype.getScope=function(A){if(this.overrideContext){if(this.overrideContext===true){return this.obj;}else{return this.overrideContext;}}return A;};YAHOO.util.Subscriber.prototype.contains=function(A,B){if(B){return(this.fn==A&&this.obj==B);}else{return(this.fn==A);}};YAHOO.util.Subscriber.prototype.toString=function(){return"Subscriber { obj: "+this.obj+", overrideContext: "+(this.overrideContext||"no")+" }";};if(!YAHOO.util.Event){YAHOO.util.Event=function(){var H=false;var I=[];var J=[];var G=[];var E=[];var C=0;var F=[];var B=[];var A=0;var D={63232:38,63233:40,63234:37,63235:39,63276:33,63277:34,25:9};var K=YAHOO.env.ua.ie?"focusin":"focus";var L=YAHOO.env.ua.ie?"focusout":"blur";return{POLL_RETRYS:2000,POLL_INTERVAL:20,EL:0,TYPE:1,FN:2,WFN:3,UNLOAD_OBJ:3,ADJ_SCOPE:4,OBJ:5,OVERRIDE:6,lastError:null,isSafari:YAHOO.env.ua.webkit,webkit:YAHOO.env.ua.webkit,isIE:YAHOO.env.ua.ie,_interval:null,_dri:null,DOMReady:false,throwErrors:false,startInterval:function(){if(!this._interval){var M=this;var N=function(){M._tryPreloadAttach();};this._interval=setInterval(N,this.POLL_INTERVAL);}},onAvailable:function(S,O,Q,R,P){var M=(YAHOO.lang.isString(S))?[S]:S;for(var N=0;N<M.length;N=N+1){F.push({id:M[N],fn:O,obj:Q,overrideContext:R,checkReady:P});}C=this.POLL_RETRYS;this.startInterval();},onContentReady:function(P,M,N,O){this.onAvailable(P,M,N,O,true);},onDOMReady:function(M,N,O){if(this.DOMReady){setTimeout(function(){var P=window;if(O){if(O===true){P=N;}else{P=O;}}M.call(P,"DOMReady",[],N);},0);}else{this.DOMReadyEvent.subscribe(M,N,O);}},_addListener:function(O,M,Y,S,W,b){if(!Y||!Y.call){return false;}if(this._isValidCollection(O)){var Z=true;for(var T=0,V=O.length;T<V;++T){Z=this.on(O[T],M,Y,S,W)&&Z;}return Z;}else{if(YAHOO.lang.isString(O)){var R=this.getEl(O);if(R){O=R;}else{this.onAvailable(O,function(){YAHOO.util.Event.on(O,M,Y,S,W);});return true;}}}if(!O){return false;}if("unload"==M&&S!==this){J[J.length]=[O,M,Y,S,W];return true;}var N=O;if(W){if(W===true){N=S;}else{N=W;}}var P=function(c){return Y.call(N,YAHOO.util.Event.getEvent(c,O),S);};var a=[O,M,Y,P,N,S,W];var U=I.length;I[U]=a;if(this.useLegacyEvent(O,M)){var Q=this.getLegacyIndex(O,M);if(Q==-1||O!=G[Q][0]){Q=G.length;B[O.id+M]=Q;G[Q]=[O,M,O["on"+M]];E[Q]=[];O["on"+M]=function(c){YAHOO.util.Event.fireLegacyEvent(YAHOO.util.Event.getEvent(c),Q);};}E[Q].push(a);}else{try{this._simpleAdd(O,M,P,b);}catch(X){this.lastError=X;this.removeListener(O,M,Y);return false;}}return true;},addListener:function(N,Q,M,O,P){return this._addListener(N,Q,M,O,P,false);},addFocusListener:function(N,M,O,P){return this._addListener(N,K,M,O,P,true);},removeFocusListener:function(N,M){return this.removeListener(N,K,M);},addBlurListener:function(N,M,O,P){return this._addListener(N,L,M,O,P,true);},removeBlurListener:function(N,M){return this.removeListener(N,L,M);},fireLegacyEvent:function(R,P){var T=true,M,V,U,N,S;V=E[P].slice();for(var O=0,Q=V.length;O<Q;++O){U=V[O];if(U&&U[this.WFN]){N=U[this.ADJ_SCOPE];S=U[this.WFN].call(N,R);T=(T&&S);}}M=G[P];if(M&&M[2]){M[2](R);}return T;},getLegacyIndex:function(N,O){var M=this.generateId(N)+O;if(typeof B[M]=="undefined"){return -1;}else{return B[M];}},useLegacyEvent:function(M,N){return(this.webkit&&this.webkit<419&&("click"==N||"dblclick"==N));},removeListener:function(N,M,V){var Q,T,X;if(typeof N=="string"){N=this.getEl(N);}else{if(this._isValidCollection(N)){var W=true;for(Q=N.length-1;Q>-1;Q--){W=(this.removeListener(N[Q],M,V)&&W);}return W;}}if(!V||!V.call){return this.purgeElement(N,false,M);}if("unload"==M){for(Q=J.length-1;Q>-1;Q--){X=J[Q];if(X&&X[0]==N&&X[1]==M&&X[2]==V){J.splice(Q,1);return true;}}return false;}var R=null;var S=arguments[3];if("undefined"===typeof S){S=this._getCacheIndex(N,M,V);}if(S>=0){R=I[S];}if(!N||!R){return false;}if(this.useLegacyEvent(N,M)){var P=this.getLegacyIndex(N,M);var O=E[P];if(O){for(Q=0,T=O.length;Q<T;++Q){X=O[Q];if(X&&X[this.EL]==N&&X[this.TYPE]==M&&X[this.FN]==V){O.splice(Q,1);break;}}}}else{try{this._simpleRemove(N,M,R[this.WFN],false);}catch(U){this.lastError=U;return false;}}delete I[S][this.WFN];delete I[S][this.FN];
+I.splice(S,1);return true;},getTarget:function(O,N){var M=O.target||O.srcElement;return this.resolveTextNode(M);},resolveTextNode:function(N){try{if(N&&3==N.nodeType){return N.parentNode;}}catch(M){}return N;},getPageX:function(N){var M=N.pageX;if(!M&&0!==M){M=N.clientX||0;if(this.isIE){M+=this._getScrollLeft();}}return M;},getPageY:function(M){var N=M.pageY;if(!N&&0!==N){N=M.clientY||0;if(this.isIE){N+=this._getScrollTop();}}return N;},getXY:function(M){return[this.getPageX(M),this.getPageY(M)];},getRelatedTarget:function(N){var M=N.relatedTarget;if(!M){if(N.type=="mouseout"){M=N.toElement;}else{if(N.type=="mouseover"){M=N.fromElement;}}}return this.resolveTextNode(M);},getTime:function(O){if(!O.time){var N=new Date().getTime();try{O.time=N;}catch(M){this.lastError=M;return N;}}return O.time;},stopEvent:function(M){this.stopPropagation(M);this.preventDefault(M);},stopPropagation:function(M){if(M.stopPropagation){M.stopPropagation();}else{M.cancelBubble=true;}},preventDefault:function(M){if(M.preventDefault){M.preventDefault();}else{M.returnValue=false;}},getEvent:function(O,M){var N=O||window.event;if(!N){var P=this.getEvent.caller;while(P){N=P.arguments[0];if(N&&Event==N.constructor){break;}P=P.caller;}}return N;},getCharCode:function(N){var M=N.keyCode||N.charCode||0;if(YAHOO.env.ua.webkit&&(M in D)){M=D[M];}return M;},_getCacheIndex:function(Q,R,P){for(var O=0,N=I.length;O<N;O=O+1){var M=I[O];if(M&&M[this.FN]==P&&M[this.EL]==Q&&M[this.TYPE]==R){return O;}}return -1;},generateId:function(M){var N=M.id;if(!N){N="yuievtautoid-"+A;++A;M.id=N;}return N;},_isValidCollection:function(N){try{return(N&&typeof N!=="string"&&N.length&&!N.tagName&&!N.alert&&typeof N[0]!=="undefined");}catch(M){return false;}},elCache:{},getEl:function(M){return(typeof M==="string")?document.getElementById(M):M;},clearCache:function(){},DOMReadyEvent:new YAHOO.util.CustomEvent("DOMReady",this),_load:function(N){if(!H){H=true;var M=YAHOO.util.Event;M._ready();M._tryPreloadAttach();}},_ready:function(N){var M=YAHOO.util.Event;if(!M.DOMReady){M.DOMReady=true;M.DOMReadyEvent.fire();M._simpleRemove(document,"DOMContentLoaded",M._ready);}},_tryPreloadAttach:function(){if(F.length===0){C=0;if(this._interval){clearInterval(this._interval);this._interval=null;}return;}if(this.locked){return;}if(this.isIE){if(!this.DOMReady){this.startInterval();return;}}this.locked=true;var S=!H;if(!S){S=(C>0&&F.length>0);}var R=[];var T=function(V,W){var U=V;if(W.overrideContext){if(W.overrideContext===true){U=W.obj;}else{U=W.overrideContext;}}W.fn.call(U,W.obj);};var N,M,Q,P,O=[];for(N=0,M=F.length;N<M;N=N+1){Q=F[N];if(Q){P=this.getEl(Q.id);if(P){if(Q.checkReady){if(H||P.nextSibling||!S){O.push(Q);F[N]=null;}}else{T(P,Q);F[N]=null;}}else{R.push(Q);}}}for(N=0,M=O.length;N<M;N=N+1){Q=O[N];T(this.getEl(Q.id),Q);}C--;if(S){for(N=F.length-1;N>-1;N--){Q=F[N];if(!Q||!Q.id){F.splice(N,1);}}this.startInterval();}else{if(this._interval){clearInterval(this._interval);this._interval=null;}}this.locked=false;},purgeElement:function(Q,R,T){var O=(YAHOO.lang.isString(Q))?this.getEl(Q):Q;var S=this.getListeners(O,T),P,M;if(S){for(P=S.length-1;P>-1;P--){var N=S[P];this.removeListener(O,N.type,N.fn);}}if(R&&O&&O.childNodes){for(P=0,M=O.childNodes.length;P<M;++P){this.purgeElement(O.childNodes[P],R,T);}}},getListeners:function(O,M){var R=[],N;if(!M){N=[I,J];}else{if(M==="unload"){N=[J];}else{N=[I];}}var T=(YAHOO.lang.isString(O))?this.getEl(O):O;for(var Q=0;Q<N.length;Q=Q+1){var V=N[Q];if(V){for(var S=0,U=V.length;S<U;++S){var P=V[S];if(P&&P[this.EL]===T&&(!M||M===P[this.TYPE])){R.push({type:P[this.TYPE],fn:P[this.FN],obj:P[this.OBJ],adjust:P[this.OVERRIDE],scope:P[this.ADJ_SCOPE],index:S});}}}}return(R.length)?R:null;},_unload:function(T){var N=YAHOO.util.Event,Q,P,O,S,R,U=J.slice(),M;for(Q=0,S=J.length;Q<S;++Q){O=U[Q];if(O){M=window;if(O[N.ADJ_SCOPE]){if(O[N.ADJ_SCOPE]===true){M=O[N.UNLOAD_OBJ];}else{M=O[N.ADJ_SCOPE];}}O[N.FN].call(M,N.getEvent(T,O[N.EL]),O[N.UNLOAD_OBJ]);U[Q]=null;}}O=null;M=null;J=null;if(I){for(P=I.length-1;P>-1;P--){O=I[P];if(O){N.removeListener(O[N.EL],O[N.TYPE],O[N.FN],P);}}O=null;}G=null;N._simpleRemove(window,"unload",N._unload);},_getScrollLeft:function(){return this._getScroll()[1];},_getScrollTop:function(){return this._getScroll()[0];},_getScroll:function(){var M=document.documentElement,N=document.body;if(M&&(M.scrollTop||M.scrollLeft)){return[M.scrollTop,M.scrollLeft];}else{if(N){return[N.scrollTop,N.scrollLeft];}else{return[0,0];}}},regCE:function(){},_simpleAdd:function(){if(window.addEventListener){return function(O,P,N,M){O.addEventListener(P,N,(M));};}else{if(window.attachEvent){return function(O,P,N,M){O.attachEvent("on"+P,N);};}else{return function(){};}}}(),_simpleRemove:function(){if(window.removeEventListener){return function(O,P,N,M){O.removeEventListener(P,N,(M));};}else{if(window.detachEvent){return function(N,O,M){N.detachEvent("on"+O,M);};}else{return function(){};}}}()};}();(function(){var EU=YAHOO.util.Event;EU.on=EU.addListener;EU.onFocus=EU.addFocusListener;EU.onBlur=EU.addBlurListener;
+/* DOMReady: based on work by: Dean Edwards/John Resig/Matthias Miller */
+if(EU.isIE){YAHOO.util.Event.onDOMReady(YAHOO.util.Event._tryPreloadAttach,YAHOO.util.Event,true);var n=document.createElement("p");EU._dri=setInterval(function(){try{n.doScroll("left");clearInterval(EU._dri);EU._dri=null;EU._ready();n=null;}catch(ex){}},EU.POLL_INTERVAL);}else{if(EU.webkit&&EU.webkit<525){EU._dri=setInterval(function(){var rs=document.readyState;if("loaded"==rs||"complete"==rs){clearInterval(EU._dri);EU._dri=null;EU._ready();}},EU.POLL_INTERVAL);}else{EU._simpleAdd(document,"DOMContentLoaded",EU._ready);}}EU._simpleAdd(window,"load",EU._load);EU._simpleAdd(window,"unload",EU._unload);EU._tryPreloadAttach();})();}YAHOO.util.EventProvider=function(){};YAHOO.util.EventProvider.prototype={__yui_events:null,__yui_subscribers:null,subscribe:function(A,C,F,E){this.__yui_events=this.__yui_events||{};var D=this.__yui_events[A];if(D){D.subscribe(C,F,E);
+}else{this.__yui_subscribers=this.__yui_subscribers||{};var B=this.__yui_subscribers;if(!B[A]){B[A]=[];}B[A].push({fn:C,obj:F,overrideContext:E});}},unsubscribe:function(C,E,G){this.__yui_events=this.__yui_events||{};var A=this.__yui_events;if(C){var F=A[C];if(F){return F.unsubscribe(E,G);}}else{var B=true;for(var D in A){if(YAHOO.lang.hasOwnProperty(A,D)){B=B&&A[D].unsubscribe(E,G);}}return B;}return false;},unsubscribeAll:function(A){return this.unsubscribe(A);},createEvent:function(G,D){this.__yui_events=this.__yui_events||{};var A=D||{};var I=this.__yui_events;if(I[G]){}else{var H=A.scope||this;var E=(A.silent);var B=new YAHOO.util.CustomEvent(G,H,E,YAHOO.util.CustomEvent.FLAT);I[G]=B;if(A.onSubscribeCallback){B.subscribeEvent.subscribe(A.onSubscribeCallback);}this.__yui_subscribers=this.__yui_subscribers||{};var F=this.__yui_subscribers[G];if(F){for(var C=0;C<F.length;++C){B.subscribe(F[C].fn,F[C].obj,F[C].overrideContext);}}}return I[G];},fireEvent:function(E,D,A,C){this.__yui_events=this.__yui_events||{};var G=this.__yui_events[E];if(!G){return null;}var B=[];for(var F=1;F<arguments.length;++F){B.push(arguments[F]);}return G.fire.apply(G,B);},hasEvent:function(A){if(this.__yui_events){if(this.__yui_events[A]){return true;}}return false;}};(function(){var A=YAHOO.util.Event,C=YAHOO.lang;YAHOO.util.KeyListener=function(D,I,E,F){if(!D){}else{if(!I){}else{if(!E){}}}if(!F){F=YAHOO.util.KeyListener.KEYDOWN;}var G=new YAHOO.util.CustomEvent("keyPressed");this.enabledEvent=new YAHOO.util.CustomEvent("enabled");this.disabledEvent=new YAHOO.util.CustomEvent("disabled");if(C.isString(D)){D=document.getElementById(D);}if(C.isFunction(E)){G.subscribe(E);}else{G.subscribe(E.fn,E.scope,E.correctScope);}function H(O,N){if(!I.shift){I.shift=false;}if(!I.alt){I.alt=false;}if(!I.ctrl){I.ctrl=false;}if(O.shiftKey==I.shift&&O.altKey==I.alt&&O.ctrlKey==I.ctrl){var J,M=I.keys,L;if(YAHOO.lang.isArray(M)){for(var K=0;K<M.length;K++){J=M[K];L=A.getCharCode(O);if(J==L){G.fire(L,O);break;}}}else{L=A.getCharCode(O);if(M==L){G.fire(L,O);}}}}this.enable=function(){if(!this.enabled){A.on(D,F,H);this.enabledEvent.fire(I);}this.enabled=true;};this.disable=function(){if(this.enabled){A.removeListener(D,F,H);this.disabledEvent.fire(I);}this.enabled=false;};this.toString=function(){return"KeyListener ["+I.keys+"] "+D.tagName+(D.id?"["+D.id+"]":"");};};var B=YAHOO.util.KeyListener;B.KEYDOWN="keydown";B.KEYUP="keyup";B.KEY={ALT:18,BACK_SPACE:8,CAPS_LOCK:20,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,META:224,NUM_LOCK:144,PAGE_DOWN:34,PAGE_UP:33,PAUSE:19,PRINTSCREEN:44,RIGHT:39,SCROLL_LOCK:145,SHIFT:16,SPACE:32,TAB:9,UP:38};})();YAHOO.register("event",YAHOO.util.Event,{version:"2.7.0",build:"1796"});YAHOO.register("yahoo-dom-event", YAHOO, {version: "2.7.0", build: "1796"});
+/*
+Copyright (c) 2009, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.net/yui/license.txt
+version: 2.7.0
+*/
+if(!YAHOO.util.DragDropMgr){YAHOO.util.DragDropMgr=function(){var A=YAHOO.util.Event,B=YAHOO.util.Dom;return{useShim:false,_shimActive:false,_shimState:false,_debugShim:false,_createShim:function(){var C=document.createElement("div");C.id="yui-ddm-shim";if(document.body.firstChild){document.body.insertBefore(C,document.body.firstChild);}else{document.body.appendChild(C);}C.style.display="none";C.style.backgroundColor="red";C.style.position="absolute";C.style.zIndex="99999";B.setStyle(C,"opacity","0");this._shim=C;A.on(C,"mouseup",this.handleMouseUp,this,true);A.on(C,"mousemove",this.handleMouseMove,this,true);A.on(window,"scroll",this._sizeShim,this,true);},_sizeShim:function(){if(this._shimActive){var C=this._shim;C.style.height=B.getDocumentHeight()+"px";C.style.width=B.getDocumentWidth()+"px";C.style.top="0";C.style.left="0";}},_activateShim:function(){if(this.useShim){if(!this._shim){this._createShim();}this._shimActive=true;var C=this._shim,D="0";if(this._debugShim){D=".5";}B.setStyle(C,"opacity",D);this._sizeShim();C.style.display="block";}},_deactivateShim:function(){this._shim.style.display="none";this._shimActive=false;},_shim:null,ids:{},handleIds:{},dragCurrent:null,dragOvers:{},deltaX:0,deltaY:0,preventDefault:true,stopPropagation:true,initialized:false,locked:false,interactionInfo:null,init:function(){this.initialized=true;},POINT:0,INTERSECT:1,STRICT_INTERSECT:2,mode:0,_execOnAll:function(E,D){for(var F in this.ids){for(var C in this.ids[F]){var G=this.ids[F][C];if(!this.isTypeOfDD(G)){continue;}G[E].apply(G,D);}}},_onLoad:function(){this.init();A.on(document,"mouseup",this.handleMouseUp,this,true);A.on(document,"mousemove",this.handleMouseMove,this,true);A.on(window,"unload",this._onUnload,this,true);A.on(window,"resize",this._onResize,this,true);},_onResize:function(C){this._execOnAll("resetConstraints",[]);},lock:function(){this.locked=true;},unlock:function(){this.locked=false;},isLocked:function(){return this.locked;},locationCache:{},useCache:true,clickPixelThresh:3,clickTimeThresh:1000,dragThreshMet:false,clickTimeout:null,startX:0,startY:0,fromTimeout:false,regDragDrop:function(D,C){if(!this.initialized){this.init();}if(!this.ids[C]){this.ids[C]={};}this.ids[C][D.id]=D;},removeDDFromGroup:function(E,C){if(!this.ids[C]){this.ids[C]={};}var D=this.ids[C];if(D&&D[E.id]){delete D[E.id];}},_remove:function(E){for(var D in E.groups){if(D){var C=this.ids[D];if(C&&C[E.id]){delete C[E.id];}}}delete this.handleIds[E.id];},regHandle:function(D,C){if(!this.handleIds[D]){this.handleIds[D]={};}this.handleIds[D][C]=C;},isDragDrop:function(C){return(this.getDDById(C))?true:false;},getRelated:function(H,D){var G=[];for(var F in H.groups){for(var E in this.ids[F]){var C=this.ids[F][E];if(!this.isTypeOfDD(C)){continue;}if(!D||C.isTarget){G[G.length]=C;}}}return G;},isLegalTarget:function(G,F){var D=this.getRelated(G,true);for(var E=0,C=D.length;E<C;++E){if(D[E].id==F.id){return true;}}return false;},isTypeOfDD:function(C){return(C&&C.__ygDragDrop);},isHandle:function(D,C){return(this.handleIds[D]&&this.handleIds[D][C]);},getDDById:function(D){for(var C in this.ids){if(this.ids[C][D]){return this.ids[C][D];}}return null;},handleMouseDown:function(E,D){this.currentTarget=YAHOO.util.Event.getTarget(E);this.dragCurrent=D;var C=D.getEl();this.startX=YAHOO.util.Event.getPageX(E);this.startY=YAHOO.util.Event.getPageY(E);this.deltaX=this.startX-C.offsetLeft;this.deltaY=this.startY-C.offsetTop;this.dragThreshMet=false;this.clickTimeout=setTimeout(function(){var F=YAHOO.util.DDM;F.startDrag(F.startX,F.startY);F.fromTimeout=true;},this.clickTimeThresh);},startDrag:function(C,E){if(this.dragCurrent&&this.dragCurrent.useShim){this._shimState=this.useShim;this.useShim=true;}this._activateShim();clearTimeout(this.clickTimeout);var D=this.dragCurrent;if(D&&D.events.b4StartDrag){D.b4StartDrag(C,E);D.fireEvent("b4StartDragEvent",{x:C,y:E});}if(D&&D.events.startDrag){D.startDrag(C,E);D.fireEvent("startDragEvent",{x:C,y:E});}this.dragThreshMet=true;},handleMouseUp:function(C){if(this.dragCurrent){clearTimeout(this.clickTimeout);if(this.dragThreshMet){if(this.fromTimeout){this.fromTimeout=false;this.handleMouseMove(C);}this.fromTimeout=false;this.fireEvents(C,true);}else{}this.stopDrag(C);this.stopEvent(C);}},stopEvent:function(C){if(this.stopPropagation){YAHOO.util.Event.stopPropagation(C);}if(this.preventDefault){YAHOO.util.Event.preventDefault(C);}},stopDrag:function(E,D){var C=this.dragCurrent;if(C&&!D){if(this.dragThreshMet){if(C.events.b4EndDrag){C.b4EndDrag(E);C.fireEvent("b4EndDragEvent",{e:E});}if(C.events.endDrag){C.endDrag(E);C.fireEvent("endDragEvent",{e:E});}}if(C.events.mouseUp){C.onMouseUp(E);C.fireEvent("mouseUpEvent",{e:E});}}if(this._shimActive){this._deactivateShim();if(this.dragCurrent&&this.dragCurrent.useShim){this.useShim=this._shimState;this._shimState=false;}}this.dragCurrent=null;this.dragOvers={};},handleMouseMove:function(F){var C=this.dragCurrent;if(C){if(YAHOO.util.Event.isIE&&!F.button){this.stopEvent(F);return this.handleMouseUp(F);}else{if(F.clientX<0||F.clientY<0){}}if(!this.dragThreshMet){var E=Math.abs(this.startX-YAHOO.util.Event.getPageX(F));var D=Math.abs(this.startY-YAHOO.util.Event.getPageY(F));if(E>this.clickPixelThresh||D>this.clickPixelThresh){this.startDrag(this.startX,this.startY);}}if(this.dragThreshMet){if(C&&C.events.b4Drag){C.b4Drag(F);C.fireEvent("b4DragEvent",{e:F});}if(C&&C.events.drag){C.onDrag(F);C.fireEvent("dragEvent",{e:F});}if(C){this.fireEvents(F,false);}}this.stopEvent(F);}},fireEvents:function(V,L){var a=this.dragCurrent;if(!a||a.isLocked()||a.dragOnly){return;}var N=YAHOO.util.Event.getPageX(V),M=YAHOO.util.Event.getPageY(V),P=new YAHOO.util.Point(N,M),K=a.getTargetCoord(P.x,P.y),F=a.getDragEl(),E=["out","over","drop","enter"],U=new YAHOO.util.Region(K.y,K.x+F.offsetWidth,K.y+F.offsetHeight,K.x),I=[],D={},Q=[],c={outEvts:[],overEvts:[],dropEvts:[],enterEvts:[]};for(var S in this.dragOvers){var d=this.dragOvers[S];if(!this.isTypeOfDD(d)){continue;
+}if(!this.isOverTarget(P,d,this.mode,U)){c.outEvts.push(d);}I[S]=true;delete this.dragOvers[S];}for(var R in a.groups){if("string"!=typeof R){continue;}for(S in this.ids[R]){var G=this.ids[R][S];if(!this.isTypeOfDD(G)){continue;}if(G.isTarget&&!G.isLocked()&&G!=a){if(this.isOverTarget(P,G,this.mode,U)){D[R]=true;if(L){c.dropEvts.push(G);}else{if(!I[G.id]){c.enterEvts.push(G);}else{c.overEvts.push(G);}this.dragOvers[G.id]=G;}}}}}this.interactionInfo={out:c.outEvts,enter:c.enterEvts,over:c.overEvts,drop:c.dropEvts,point:P,draggedRegion:U,sourceRegion:this.locationCache[a.id],validDrop:L};for(var C in D){Q.push(C);}if(L&&!c.dropEvts.length){this.interactionInfo.validDrop=false;if(a.events.invalidDrop){a.onInvalidDrop(V);a.fireEvent("invalidDropEvent",{e:V});}}for(S=0;S<E.length;S++){var Y=null;if(c[E[S]+"Evts"]){Y=c[E[S]+"Evts"];}if(Y&&Y.length){var H=E[S].charAt(0).toUpperCase()+E[S].substr(1),X="onDrag"+H,J="b4Drag"+H,O="drag"+H+"Event",W="drag"+H;if(this.mode){if(a.events[J]){a[J](V,Y,Q);a.fireEvent(J+"Event",{event:V,info:Y,group:Q});}if(a.events[W]){a[X](V,Y,Q);a.fireEvent(O,{event:V,info:Y,group:Q});}}else{for(var Z=0,T=Y.length;Z<T;++Z){if(a.events[J]){a[J](V,Y[Z].id,Q[0]);a.fireEvent(J+"Event",{event:V,info:Y[Z].id,group:Q[0]});}if(a.events[W]){a[X](V,Y[Z].id,Q[0]);a.fireEvent(O,{event:V,info:Y[Z].id,group:Q[0]});}}}}}},getBestMatch:function(E){var G=null;var D=E.length;if(D==1){G=E[0];}else{for(var F=0;F<D;++F){var C=E[F];if(this.mode==this.INTERSECT&&C.cursorIsOver){G=C;break;}else{if(!G||!G.overlap||(C.overlap&&G.overlap.getArea()<C.overlap.getArea())){G=C;}}}}return G;},refreshCache:function(D){var F=D||this.ids;for(var C in F){if("string"!=typeof C){continue;}for(var E in this.ids[C]){var G=this.ids[C][E];if(this.isTypeOfDD(G)){var H=this.getLocation(G);if(H){this.locationCache[G.id]=H;}else{delete this.locationCache[G.id];}}}}},verifyEl:function(D){try{if(D){var C=D.offsetParent;if(C){return true;}}}catch(E){}return false;},getLocation:function(H){if(!this.isTypeOfDD(H)){return null;}var F=H.getEl(),K,E,D,M,L,N,C,J,G;try{K=YAHOO.util.Dom.getXY(F);}catch(I){}if(!K){return null;}E=K[0];D=E+F.offsetWidth;M=K[1];L=M+F.offsetHeight;N=M-H.padding[0];C=D+H.padding[1];J=L+H.padding[2];G=E-H.padding[3];return new YAHOO.util.Region(N,C,J,G);},isOverTarget:function(K,C,E,F){var G=this.locationCache[C.id];if(!G||!this.useCache){G=this.getLocation(C);this.locationCache[C.id]=G;}if(!G){return false;}C.cursorIsOver=G.contains(K);var J=this.dragCurrent;if(!J||(!E&&!J.constrainX&&!J.constrainY)){return C.cursorIsOver;}C.overlap=null;if(!F){var H=J.getTargetCoord(K.x,K.y);var D=J.getDragEl();F=new YAHOO.util.Region(H.y,H.x+D.offsetWidth,H.y+D.offsetHeight,H.x);}var I=F.intersect(G);if(I){C.overlap=I;return(E)?true:C.cursorIsOver;}else{return false;}},_onUnload:function(D,C){this.unregAll();},unregAll:function(){if(this.dragCurrent){this.stopDrag();this.dragCurrent=null;}this._execOnAll("unreg",[]);this.ids={};},elementCache:{},getElWrapper:function(D){var C=this.elementCache[D];if(!C||!C.el){C=this.elementCache[D]=new this.ElementWrapper(YAHOO.util.Dom.get(D));}return C;},getElement:function(C){return YAHOO.util.Dom.get(C);},getCss:function(D){var C=YAHOO.util.Dom.get(D);return(C)?C.style:null;},ElementWrapper:function(C){this.el=C||null;this.id=this.el&&C.id;this.css=this.el&&C.style;},getPosX:function(C){return YAHOO.util.Dom.getX(C);},getPosY:function(C){return YAHOO.util.Dom.getY(C);},swapNode:function(E,C){if(E.swapNode){E.swapNode(C);}else{var F=C.parentNode;var D=C.nextSibling;if(D==E){F.insertBefore(E,C);}else{if(C==E.nextSibling){F.insertBefore(C,E);}else{E.parentNode.replaceChild(C,E);F.insertBefore(E,D);}}}},getScroll:function(){var E,C,F=document.documentElement,D=document.body;if(F&&(F.scrollTop||F.scrollLeft)){E=F.scrollTop;C=F.scrollLeft;}else{if(D){E=D.scrollTop;C=D.scrollLeft;}else{}}return{top:E,left:C};},getStyle:function(D,C){return YAHOO.util.Dom.getStyle(D,C);},getScrollTop:function(){return this.getScroll().top;},getScrollLeft:function(){return this.getScroll().left;},moveToEl:function(C,E){var D=YAHOO.util.Dom.getXY(E);YAHOO.util.Dom.setXY(C,D);},getClientHeight:function(){return YAHOO.util.Dom.getViewportHeight();},getClientWidth:function(){return YAHOO.util.Dom.getViewportWidth();},numericSort:function(D,C){return(D-C);},_timeoutCount:0,_addListeners:function(){var C=YAHOO.util.DDM;if(YAHOO.util.Event&&document){C._onLoad();}else{if(C._timeoutCount>2000){}else{setTimeout(C._addListeners,10);if(document&&document.body){C._timeoutCount+=1;}}}},handleWasClicked:function(C,E){if(this.isHandle(E,C.id)){return true;}else{var D=C.parentNode;while(D){if(this.isHandle(E,D.id)){return true;}else{D=D.parentNode;}}}return false;}};}();YAHOO.util.DDM=YAHOO.util.DragDropMgr;YAHOO.util.DDM._addListeners();}(function(){var A=YAHOO.util.Event;var B=YAHOO.util.Dom;YAHOO.util.DragDrop=function(E,C,D){if(E){this.init(E,C,D);}};YAHOO.util.DragDrop.prototype={events:null,on:function(){this.subscribe.apply(this,arguments);},id:null,config:null,dragElId:null,handleElId:null,invalidHandleTypes:null,invalidHandleIds:null,invalidHandleClasses:null,startPageX:0,startPageY:0,groups:null,locked:false,lock:function(){this.locked=true;},unlock:function(){this.locked=false;},isTarget:true,padding:null,dragOnly:false,useShim:false,_domRef:null,__ygDragDrop:true,constrainX:false,constrainY:false,minX:0,maxX:0,minY:0,maxY:0,deltaX:0,deltaY:0,maintainOffset:false,xTicks:null,yTicks:null,primaryButtonOnly:true,available:false,hasOuterHandles:false,cursorIsOver:false,overlap:null,b4StartDrag:function(C,D){},startDrag:function(C,D){},b4Drag:function(C){},onDrag:function(C){},onDragEnter:function(C,D){},b4DragOver:function(C){},onDragOver:function(C,D){},b4DragOut:function(C){},onDragOut:function(C,D){},b4DragDrop:function(C){},onDragDrop:function(C,D){},onInvalidDrop:function(C){},b4EndDrag:function(C){},endDrag:function(C){},b4MouseDown:function(C){},onMouseDown:function(C){},onMouseUp:function(C){},onAvailable:function(){},getEl:function(){if(!this._domRef){this._domRef=B.get(this.id);
+}return this._domRef;},getDragEl:function(){return B.get(this.dragElId);},init:function(F,C,D){this.initTarget(F,C,D);A.on(this._domRef||this.id,"mousedown",this.handleMouseDown,this,true);for(var E in this.events){this.createEvent(E+"Event");}},initTarget:function(E,C,D){this.config=D||{};this.events={};this.DDM=YAHOO.util.DDM;this.groups={};if(typeof E!=="string"){this._domRef=E;E=B.generateId(E);}this.id=E;this.addToGroup((C)?C:"default");this.handleElId=E;A.onAvailable(E,this.handleOnAvailable,this,true);this.setDragElId(E);this.invalidHandleTypes={A:"A"};this.invalidHandleIds={};this.invalidHandleClasses=[];this.applyConfig();},applyConfig:function(){this.events={mouseDown:true,b4MouseDown:true,mouseUp:true,b4StartDrag:true,startDrag:true,b4EndDrag:true,endDrag:true,drag:true,b4Drag:true,invalidDrop:true,b4DragOut:true,dragOut:true,dragEnter:true,b4DragOver:true,dragOver:true,b4DragDrop:true,dragDrop:true};if(this.config.events){for(var C in this.config.events){if(this.config.events[C]===false){this.events[C]=false;}}}this.padding=this.config.padding||[0,0,0,0];this.isTarget=(this.config.isTarget!==false);this.maintainOffset=(this.config.maintainOffset);this.primaryButtonOnly=(this.config.primaryButtonOnly!==false);this.dragOnly=((this.config.dragOnly===true)?true:false);this.useShim=((this.config.useShim===true)?true:false);},handleOnAvailable:function(){this.available=true;this.resetConstraints();this.onAvailable();},setPadding:function(E,C,F,D){if(!C&&0!==C){this.padding=[E,E,E,E];}else{if(!F&&0!==F){this.padding=[E,C,E,C];}else{this.padding=[E,C,F,D];}}},setInitPosition:function(F,E){var G=this.getEl();if(!this.DDM.verifyEl(G)){if(G&&G.style&&(G.style.display=="none")){}else{}return;}var D=F||0;var C=E||0;var H=B.getXY(G);this.initPageX=H[0]-D;this.initPageY=H[1]-C;this.lastPageX=H[0];this.lastPageY=H[1];this.setStartPosition(H);},setStartPosition:function(D){var C=D||B.getXY(this.getEl());this.deltaSetXY=null;this.startPageX=C[0];this.startPageY=C[1];},addToGroup:function(C){this.groups[C]=true;this.DDM.regDragDrop(this,C);},removeFromGroup:function(C){if(this.groups[C]){delete this.groups[C];}this.DDM.removeDDFromGroup(this,C);},setDragElId:function(C){this.dragElId=C;},setHandleElId:function(C){if(typeof C!=="string"){C=B.generateId(C);}this.handleElId=C;this.DDM.regHandle(this.id,C);},setOuterHandleElId:function(C){if(typeof C!=="string"){C=B.generateId(C);}A.on(C,"mousedown",this.handleMouseDown,this,true);this.setHandleElId(C);this.hasOuterHandles=true;},unreg:function(){A.removeListener(this.id,"mousedown",this.handleMouseDown);this._domRef=null;this.DDM._remove(this);},isLocked:function(){return(this.DDM.isLocked()||this.locked);},handleMouseDown:function(J,I){var D=J.which||J.button;if(this.primaryButtonOnly&&D>1){return;}if(this.isLocked()){return;}var C=this.b4MouseDown(J),F=true;if(this.events.b4MouseDown){F=this.fireEvent("b4MouseDownEvent",J);}var E=this.onMouseDown(J),H=true;if(this.events.mouseDown){H=this.fireEvent("mouseDownEvent",J);}if((C===false)||(E===false)||(F===false)||(H===false)){return;}this.DDM.refreshCache(this.groups);var G=new YAHOO.util.Point(A.getPageX(J),A.getPageY(J));if(!this.hasOuterHandles&&!this.DDM.isOverTarget(G,this)){}else{if(this.clickValidator(J)){this.setStartPosition();this.DDM.handleMouseDown(J,this);this.DDM.stopEvent(J);}else{}}},clickValidator:function(D){var C=YAHOO.util.Event.getTarget(D);return(this.isValidHandleChild(C)&&(this.id==this.handleElId||this.DDM.handleWasClicked(C,this.id)));},getTargetCoord:function(E,D){var C=E-this.deltaX;var F=D-this.deltaY;if(this.constrainX){if(C<this.minX){C=this.minX;}if(C>this.maxX){C=this.maxX;}}if(this.constrainY){if(F<this.minY){F=this.minY;}if(F>this.maxY){F=this.maxY;}}C=this.getTick(C,this.xTicks);F=this.getTick(F,this.yTicks);return{x:C,y:F};},addInvalidHandleType:function(C){var D=C.toUpperCase();this.invalidHandleTypes[D]=D;},addInvalidHandleId:function(C){if(typeof C!=="string"){C=B.generateId(C);}this.invalidHandleIds[C]=C;},addInvalidHandleClass:function(C){this.invalidHandleClasses.push(C);},removeInvalidHandleType:function(C){var D=C.toUpperCase();delete this.invalidHandleTypes[D];},removeInvalidHandleId:function(C){if(typeof C!=="string"){C=B.generateId(C);}delete this.invalidHandleIds[C];},removeInvalidHandleClass:function(D){for(var E=0,C=this.invalidHandleClasses.length;E<C;++E){if(this.invalidHandleClasses[E]==D){delete this.invalidHandleClasses[E];}}},isValidHandleChild:function(F){var E=true;var H;try{H=F.nodeName.toUpperCase();}catch(G){H=F.nodeName;}E=E&&!this.invalidHandleTypes[H];E=E&&!this.invalidHandleIds[F.id];for(var D=0,C=this.invalidHandleClasses.length;E&&D<C;++D){E=!B.hasClass(F,this.invalidHandleClasses[D]);}return E;},setXTicks:function(F,C){this.xTicks=[];this.xTickSize=C;var E={};for(var D=this.initPageX;D>=this.minX;D=D-C){if(!E[D]){this.xTicks[this.xTicks.length]=D;E[D]=true;}}for(D=this.initPageX;D<=this.maxX;D=D+C){if(!E[D]){this.xTicks[this.xTicks.length]=D;E[D]=true;}}this.xTicks.sort(this.DDM.numericSort);},setYTicks:function(F,C){this.yTicks=[];this.yTickSize=C;var E={};for(var D=this.initPageY;D>=this.minY;D=D-C){if(!E[D]){this.yTicks[this.yTicks.length]=D;E[D]=true;}}for(D=this.initPageY;D<=this.maxY;D=D+C){if(!E[D]){this.yTicks[this.yTicks.length]=D;E[D]=true;}}this.yTicks.sort(this.DDM.numericSort);},setXConstraint:function(E,D,C){this.leftConstraint=parseInt(E,10);this.rightConstraint=parseInt(D,10);this.minX=this.initPageX-this.leftConstraint;this.maxX=this.initPageX+this.rightConstraint;if(C){this.setXTicks(this.initPageX,C);}this.constrainX=true;},clearConstraints:function(){this.constrainX=false;this.constrainY=false;this.clearTicks();},clearTicks:function(){this.xTicks=null;this.yTicks=null;this.xTickSize=0;this.yTickSize=0;},setYConstraint:function(C,E,D){this.topConstraint=parseInt(C,10);this.bottomConstraint=parseInt(E,10);this.minY=this.initPageY-this.topConstraint;this.maxY=this.initPageY+this.bottomConstraint;if(D){this.setYTicks(this.initPageY,D);
+}this.constrainY=true;},resetConstraints:function(){if(this.initPageX||this.initPageX===0){var D=(this.maintainOffset)?this.lastPageX-this.initPageX:0;var C=(this.maintainOffset)?this.lastPageY-this.initPageY:0;this.setInitPosition(D,C);}else{this.setInitPosition();}if(this.constrainX){this.setXConstraint(this.leftConstraint,this.rightConstraint,this.xTickSize);}if(this.constrainY){this.setYConstraint(this.topConstraint,this.bottomConstraint,this.yTickSize);}},getTick:function(I,F){if(!F){return I;}else{if(F[0]>=I){return F[0];}else{for(var D=0,C=F.length;D<C;++D){var E=D+1;if(F[E]&&F[E]>=I){var H=I-F[D];var G=F[E]-I;return(G>H)?F[D]:F[E];}}return F[F.length-1];}}},toString:function(){return("DragDrop "+this.id);}};YAHOO.augment(YAHOO.util.DragDrop,YAHOO.util.EventProvider);})();YAHOO.util.DD=function(C,A,B){if(C){this.init(C,A,B);}};YAHOO.extend(YAHOO.util.DD,YAHOO.util.DragDrop,{scroll:true,autoOffset:function(C,B){var A=C-this.startPageX;var D=B-this.startPageY;this.setDelta(A,D);},setDelta:function(B,A){this.deltaX=B;this.deltaY=A;},setDragElPos:function(C,B){var A=this.getDragEl();this.alignElWithMouse(A,C,B);},alignElWithMouse:function(C,G,F){var E=this.getTargetCoord(G,F);if(!this.deltaSetXY){var H=[E.x,E.y];YAHOO.util.Dom.setXY(C,H);var D=parseInt(YAHOO.util.Dom.getStyle(C,"left"),10);var B=parseInt(YAHOO.util.Dom.getStyle(C,"top"),10);this.deltaSetXY=[D-E.x,B-E.y];}else{YAHOO.util.Dom.setStyle(C,"left",(E.x+this.deltaSetXY[0])+"px");YAHOO.util.Dom.setStyle(C,"top",(E.y+this.deltaSetXY[1])+"px");}this.cachePosition(E.x,E.y);var A=this;setTimeout(function(){A.autoScroll.call(A,E.x,E.y,C.offsetHeight,C.offsetWidth);},0);},cachePosition:function(B,A){if(B){this.lastPageX=B;this.lastPageY=A;}else{var C=YAHOO.util.Dom.getXY(this.getEl());this.lastPageX=C[0];this.lastPageY=C[1];}},autoScroll:function(J,I,E,K){if(this.scroll){var L=this.DDM.getClientHeight();var B=this.DDM.getClientWidth();var N=this.DDM.getScrollTop();var D=this.DDM.getScrollLeft();var H=E+I;var M=K+J;var G=(L+N-I-this.deltaY);var F=(B+D-J-this.deltaX);var C=40;var A=(document.all)?80:30;if(H>L&&G<C){window.scrollTo(D,N+A);}if(I<N&&N>0&&I-N<C){window.scrollTo(D,N-A);}if(M>B&&F<C){window.scrollTo(D+A,N);}if(J<D&&D>0&&J-D<C){window.scrollTo(D-A,N);}}},applyConfig:function(){YAHOO.util.DD.superclass.applyConfig.call(this);this.scroll=(this.config.scroll!==false);},b4MouseDown:function(A){this.setStartPosition();this.autoOffset(YAHOO.util.Event.getPageX(A),YAHOO.util.Event.getPageY(A));},b4Drag:function(A){this.setDragElPos(YAHOO.util.Event.getPageX(A),YAHOO.util.Event.getPageY(A));},toString:function(){return("DD "+this.id);}});YAHOO.util.DDProxy=function(C,A,B){if(C){this.init(C,A,B);this.initFrame();}};YAHOO.util.DDProxy.dragElId="ygddfdiv";YAHOO.extend(YAHOO.util.DDProxy,YAHOO.util.DD,{resizeFrame:true,centerFrame:false,createFrame:function(){var B=this,A=document.body;if(!A||!A.firstChild){setTimeout(function(){B.createFrame();},50);return;}var F=this.getDragEl(),E=YAHOO.util.Dom;if(!F){F=document.createElement("div");F.id=this.dragElId;var D=F.style;D.position="absolute";D.visibility="hidden";D.cursor="move";D.border="2px solid #aaa";D.zIndex=999;D.height="25px";D.width="25px";var C=document.createElement("div");E.setStyle(C,"height","100%");E.setStyle(C,"width","100%");E.setStyle(C,"background-color","#ccc");E.setStyle(C,"opacity","0");F.appendChild(C);A.insertBefore(F,A.firstChild);}},initFrame:function(){this.createFrame();},applyConfig:function(){YAHOO.util.DDProxy.superclass.applyConfig.call(this);this.resizeFrame=(this.config.resizeFrame!==false);this.centerFrame=(this.config.centerFrame);this.setDragElId(this.config.dragElId||YAHOO.util.DDProxy.dragElId);},showFrame:function(E,D){var C=this.getEl();var A=this.getDragEl();var B=A.style;this._resizeProxy();if(this.centerFrame){this.setDelta(Math.round(parseInt(B.width,10)/2),Math.round(parseInt(B.height,10)/2));}this.setDragElPos(E,D);YAHOO.util.Dom.setStyle(A,"visibility","visible");},_resizeProxy:function(){if(this.resizeFrame){var H=YAHOO.util.Dom;var B=this.getEl();var C=this.getDragEl();var G=parseInt(H.getStyle(C,"borderTopWidth"),10);var I=parseInt(H.getStyle(C,"borderRightWidth"),10);var F=parseInt(H.getStyle(C,"borderBottomWidth"),10);var D=parseInt(H.getStyle(C,"borderLeftWidth"),10);if(isNaN(G)){G=0;}if(isNaN(I)){I=0;}if(isNaN(F)){F=0;}if(isNaN(D)){D=0;}var E=Math.max(0,B.offsetWidth-I-D);var A=Math.max(0,B.offsetHeight-G-F);H.setStyle(C,"width",E+"px");H.setStyle(C,"height",A+"px");}},b4MouseDown:function(B){this.setStartPosition();var A=YAHOO.util.Event.getPageX(B);var C=YAHOO.util.Event.getPageY(B);this.autoOffset(A,C);},b4StartDrag:function(A,B){this.showFrame(A,B);},b4EndDrag:function(A){YAHOO.util.Dom.setStyle(this.getDragEl(),"visibility","hidden");},endDrag:function(D){var C=YAHOO.util.Dom;var B=this.getEl();var A=this.getDragEl();C.setStyle(A,"visibility","");C.setStyle(B,"visibility","hidden");YAHOO.util.DDM.moveToEl(B,A);C.setStyle(A,"visibility","hidden");C.setStyle(B,"visibility","");},toString:function(){return("DDProxy "+this.id);}});YAHOO.util.DDTarget=function(C,A,B){if(C){this.initTarget(C,A,B);}};YAHOO.extend(YAHOO.util.DDTarget,YAHOO.util.DragDrop,{toString:function(){return("DDTarget "+this.id);}});YAHOO.register("dragdrop",YAHOO.util.DragDropMgr,{version:"2.7.0",build:"1796"});/*
+Copyright (c) 2009, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.net/yui/license.txt
+version: 2.7.0
+*/
+(function(){var B=YAHOO.util.Dom.getXY,A=YAHOO.util.Event,D=Array.prototype.slice;function C(G,E,F,H){C.ANIM_AVAIL=(!YAHOO.lang.isUndefined(YAHOO.util.Anim));if(G){this.init(G,E,true);this.initSlider(H);this.initThumb(F);}}YAHOO.lang.augmentObject(C,{getHorizSlider:function(F,G,I,H,E){return new C(F,F,new YAHOO.widget.SliderThumb(G,F,I,H,0,0,E),"horiz");},getVertSlider:function(G,H,E,I,F){return new C(G,G,new YAHOO.widget.SliderThumb(H,G,0,0,E,I,F),"vert");},getSliderRegion:function(G,H,J,I,E,K,F){return new C(G,G,new YAHOO.widget.SliderThumb(H,G,J,I,E,K,F),"region");},SOURCE_UI_EVENT:1,SOURCE_SET_VALUE:2,SOURCE_KEY_EVENT:3,ANIM_AVAIL:false},true);YAHOO.extend(C,YAHOO.util.DragDrop,{_mouseDown:false,dragOnly:true,initSlider:function(E){this.type=E;this.createEvent("change",this);this.createEvent("slideStart",this);this.createEvent("slideEnd",this);this.isTarget=false;this.animate=C.ANIM_AVAIL;this.backgroundEnabled=true;this.tickPause=40;this.enableKeys=true;this.keyIncrement=20;this.moveComplete=true;this.animationDuration=0.2;this.SOURCE_UI_EVENT=1;this.SOURCE_SET_VALUE=2;this.valueChangeSource=0;this._silent=false;this.lastOffset=[0,0];},initThumb:function(F){var E=this;this.thumb=F;F.cacheBetweenDrags=true;if(F._isHoriz&&F.xTicks&&F.xTicks.length){this.tickPause=Math.round(360/F.xTicks.length);}else{if(F.yTicks&&F.yTicks.length){this.tickPause=Math.round(360/F.yTicks.length);}}F.onAvailable=function(){return E.setStartSliderState();};F.onMouseDown=function(){E._mouseDown=true;return E.focus();};F.startDrag=function(){E._slideStart();};F.onDrag=function(){E.fireEvents(true);};F.onMouseUp=function(){E.thumbMouseUp();};},onAvailable:function(){this._bindKeyEvents();},_bindKeyEvents:function(){A.on(this.id,"keydown",this.handleKeyDown,this,true);A.on(this.id,"keypress",this.handleKeyPress,this,true);},handleKeyPress:function(F){if(this.enableKeys){var E=A.getCharCode(F);switch(E){case 37:case 38:case 39:case 40:case 36:case 35:A.preventDefault(F);break;default:}}},handleKeyDown:function(J){if(this.enableKeys){var G=A.getCharCode(J),F=this.thumb,H=this.getXValue(),E=this.getYValue(),I=true;switch(G){case 37:H-=this.keyIncrement;break;case 38:E-=this.keyIncrement;break;case 39:H+=this.keyIncrement;break;case 40:E+=this.keyIncrement;break;case 36:H=F.leftConstraint;E=F.topConstraint;break;case 35:H=F.rightConstraint;E=F.bottomConstraint;break;default:I=false;}if(I){if(F._isRegion){this._setRegionValue(C.SOURCE_KEY_EVENT,H,E,true);}else{this._setValue(C.SOURCE_KEY_EVENT,(F._isHoriz?H:E),true);}A.stopEvent(J);}}},setStartSliderState:function(){this.setThumbCenterPoint();this.baselinePos=B(this.getEl());this.thumb.startOffset=this.thumb.getOffsetFromParent(this.baselinePos);if(this.thumb._isRegion){if(this.deferredSetRegionValue){this._setRegionValue.apply(this,this.deferredSetRegionValue);this.deferredSetRegionValue=null;}else{this.setRegionValue(0,0,true,true,true);}}else{if(this.deferredSetValue){this._setValue.apply(this,this.deferredSetValue);this.deferredSetValue=null;}else{this.setValue(0,true,true,true);}}},setThumbCenterPoint:function(){var E=this.thumb.getEl();if(E){this.thumbCenterPoint={x:parseInt(E.offsetWidth/2,10),y:parseInt(E.offsetHeight/2,10)};}},lock:function(){this.thumb.lock();this.locked=true;},unlock:function(){this.thumb.unlock();this.locked=false;},thumbMouseUp:function(){this._mouseDown=false;if(!this.isLocked()&&!this.moveComplete){this.endMove();}},onMouseUp:function(){this._mouseDown=false;if(this.backgroundEnabled&&!this.isLocked()&&!this.moveComplete){this.endMove();}},getThumb:function(){return this.thumb;},focus:function(){this.valueChangeSource=C.SOURCE_UI_EVENT;var E=this.getEl();if(E.focus){try{E.focus();}catch(F){}}this.verifyOffset();return !this.isLocked();},onChange:function(E,F){},onSlideStart:function(){},onSlideEnd:function(){},getValue:function(){return this.thumb.getValue();},getXValue:function(){return this.thumb.getXValue();},getYValue:function(){return this.thumb.getYValue();},setValue:function(){var E=D.call(arguments);E.unshift(C.SOURCE_SET_VALUE);return this._setValue.apply(this,E);},_setValue:function(I,L,G,H,E){var F=this.thumb,K,J;if(!F.available){this.deferredSetValue=arguments;return false;}if(this.isLocked()&&!H){return false;}if(isNaN(L)){return false;}if(F._isRegion){return false;}this._silent=E;this.valueChangeSource=I||C.SOURCE_SET_VALUE;F.lastOffset=[L,L];this.verifyOffset(true);this._slideStart();if(F._isHoriz){K=F.initPageX+L+this.thumbCenterPoint.x;this.moveThumb(K,F.initPageY,G);}else{J=F.initPageY+L+this.thumbCenterPoint.y;this.moveThumb(F.initPageX,J,G);}return true;},setRegionValue:function(){var E=D.call(arguments);E.unshift(C.SOURCE_SET_VALUE);return this._setRegionValue.apply(this,E);},_setRegionValue:function(F,J,H,I,G,K){var L=this.thumb,E,M;if(!L.available){this.deferredSetRegionValue=arguments;return false;}if(this.isLocked()&&!G){return false;}if(isNaN(J)){return false;}if(!L._isRegion){return false;}this._silent=K;this.valueChangeSource=F||C.SOURCE_SET_VALUE;L.lastOffset=[J,H];this.verifyOffset(true);this._slideStart();E=L.initPageX+J+this.thumbCenterPoint.x;M=L.initPageY+H+this.thumbCenterPoint.y;this.moveThumb(E,M,I);return true;},verifyOffset:function(F){var G=B(this.getEl()),E=this.thumb;if(!this.thumbCenterPoint||!this.thumbCenterPoint.x){this.setThumbCenterPoint();}if(G){if(G[0]!=this.baselinePos[0]||G[1]!=this.baselinePos[1]){this.setInitPosition();this.baselinePos=G;E.initPageX=this.initPageX+E.startOffset[0];E.initPageY=this.initPageY+E.startOffset[1];E.deltaSetXY=null;this.resetThumbConstraints();return false;}}return true;},moveThumb:function(K,J,I,G){var L=this.thumb,M=this,F,E,H;if(!L.available){return;}L.setDelta(this.thumbCenterPoint.x,this.thumbCenterPoint.y);E=L.getTargetCoord(K,J);F=[Math.round(E.x),Math.round(E.y)];if(this.animate&&L._graduated&&!I){this.lock();this.curCoord=B(this.thumb.getEl());this.curCoord=[Math.round(this.curCoord[0]),Math.round(this.curCoord[1])];setTimeout(function(){M.moveOneTick(F);
+},this.tickPause);}else{if(this.animate&&C.ANIM_AVAIL&&!I){this.lock();H=new YAHOO.util.Motion(L.id,{points:{to:F}},this.animationDuration,YAHOO.util.Easing.easeOut);H.onComplete.subscribe(function(){M.unlock();if(!M._mouseDown){M.endMove();}});H.animate();}else{L.setDragElPos(K,J);if(!G&&!this._mouseDown){this.endMove();}}}},_slideStart:function(){if(!this._sliding){if(!this._silent){this.onSlideStart();this.fireEvent("slideStart");}this._sliding=true;}},_slideEnd:function(){if(this._sliding&&this.moveComplete){var E=this._silent;this._sliding=false;this._silent=false;this.moveComplete=false;if(!E){this.onSlideEnd();this.fireEvent("slideEnd");}}},moveOneTick:function(F){var H=this.thumb,G=this,I=null,E,J;if(H._isRegion){I=this._getNextX(this.curCoord,F);E=(I!==null)?I[0]:this.curCoord[0];I=this._getNextY(this.curCoord,F);J=(I!==null)?I[1]:this.curCoord[1];I=E!==this.curCoord[0]||J!==this.curCoord[1]?[E,J]:null;}else{if(H._isHoriz){I=this._getNextX(this.curCoord,F);}else{I=this._getNextY(this.curCoord,F);}}if(I){this.curCoord=I;this.thumb.alignElWithMouse(H.getEl(),I[0]+this.thumbCenterPoint.x,I[1]+this.thumbCenterPoint.y);if(!(I[0]==F[0]&&I[1]==F[1])){setTimeout(function(){G.moveOneTick(F);},this.tickPause);}else{this.unlock();if(!this._mouseDown){this.endMove();}}}else{this.unlock();if(!this._mouseDown){this.endMove();}}},_getNextX:function(E,F){var H=this.thumb,J,G=[],I=null;if(E[0]>F[0]){J=H.tickSize-this.thumbCenterPoint.x;G=H.getTargetCoord(E[0]-J,E[1]);I=[G.x,G.y];}else{if(E[0]<F[0]){J=H.tickSize+this.thumbCenterPoint.x;G=H.getTargetCoord(E[0]+J,E[1]);I=[G.x,G.y];}else{}}return I;},_getNextY:function(E,F){var H=this.thumb,J,G=[],I=null;if(E[1]>F[1]){J=H.tickSize-this.thumbCenterPoint.y;G=H.getTargetCoord(E[0],E[1]-J);I=[G.x,G.y];}else{if(E[1]<F[1]){J=H.tickSize+this.thumbCenterPoint.y;G=H.getTargetCoord(E[0],E[1]+J);I=[G.x,G.y];}else{}}return I;},b4MouseDown:function(E){if(!this.backgroundEnabled){return false;}this.thumb.autoOffset();this.resetThumbConstraints();},onMouseDown:function(F){if(!this.backgroundEnabled||this.isLocked()){return false;}this._mouseDown=true;var E=A.getPageX(F),G=A.getPageY(F);this.focus();this._slideStart();this.moveThumb(E,G);},onDrag:function(F){if(this.backgroundEnabled&&!this.isLocked()){var E=A.getPageX(F),G=A.getPageY(F);this.moveThumb(E,G,true,true);this.fireEvents();}},endMove:function(){this.unlock();this.fireEvents();this.moveComplete=true;this._slideEnd();},resetThumbConstraints:function(){var E=this.thumb;E.setXConstraint(E.leftConstraint,E.rightConstraint,E.xTickSize);E.setYConstraint(E.topConstraint,E.bottomConstraint,E.xTickSize);},fireEvents:function(G){var F=this.thumb,I,H,E;if(!G){F.cachePosition();}if(!this.isLocked()){if(F._isRegion){I=F.getXValue();H=F.getYValue();if(I!=this.previousX||H!=this.previousY){if(!this._silent){this.onChange(I,H);this.fireEvent("change",{x:I,y:H});}}this.previousX=I;this.previousY=H;}else{E=F.getValue();if(E!=this.previousVal){if(!this._silent){this.onChange(E);this.fireEvent("change",E);}}this.previousVal=E;}}},toString:function(){return("Slider ("+this.type+") "+this.id);}});YAHOO.lang.augmentProto(C,YAHOO.util.EventProvider);YAHOO.widget.Slider=C;})();YAHOO.widget.SliderThumb=function(G,B,E,D,A,F,C){if(G){YAHOO.widget.SliderThumb.superclass.constructor.call(this,G,B);this.parentElId=B;}this.isTarget=false;this.tickSize=C;this.maintainOffset=true;this.initSlider(E,D,A,F,C);this.scroll=false;};YAHOO.extend(YAHOO.widget.SliderThumb,YAHOO.util.DD,{startOffset:null,dragOnly:true,_isHoriz:false,_prevVal:0,_graduated:false,getOffsetFromParent0:function(C){var A=YAHOO.util.Dom.getXY(this.getEl()),B=C||YAHOO.util.Dom.getXY(this.parentElId);return[(A[0]-B[0]),(A[1]-B[1])];},getOffsetFromParent:function(H){var A=this.getEl(),E,I,F,B,K,D,C,J,G;if(!this.deltaOffset){I=YAHOO.util.Dom.getXY(A);F=H||YAHOO.util.Dom.getXY(this.parentElId);E=[(I[0]-F[0]),(I[1]-F[1])];B=parseInt(YAHOO.util.Dom.getStyle(A,"left"),10);K=parseInt(YAHOO.util.Dom.getStyle(A,"top"),10);D=B-E[0];C=K-E[1];if(isNaN(D)||isNaN(C)){}else{this.deltaOffset=[D,C];}}else{J=parseInt(YAHOO.util.Dom.getStyle(A,"left"),10);G=parseInt(YAHOO.util.Dom.getStyle(A,"top"),10);E=[J+this.deltaOffset[0],G+this.deltaOffset[1]];}return E;},initSlider:function(D,C,A,E,B){this.initLeft=D;this.initRight=C;this.initUp=A;this.initDown=E;this.setXConstraint(D,C,B);this.setYConstraint(A,E,B);if(B&&B>1){this._graduated=true;}this._isHoriz=(D||C);this._isVert=(A||E);this._isRegion=(this._isHoriz&&this._isVert);},clearTicks:function(){YAHOO.widget.SliderThumb.superclass.clearTicks.call(this);this.tickSize=0;this._graduated=false;},getValue:function(){return(this._isHoriz)?this.getXValue():this.getYValue();},getXValue:function(){if(!this.available){return 0;}var A=this.getOffsetFromParent();if(YAHOO.lang.isNumber(A[0])){this.lastOffset=A;return(A[0]-this.startOffset[0]);}else{return(this.lastOffset[0]-this.startOffset[0]);}},getYValue:function(){if(!this.available){return 0;}var A=this.getOffsetFromParent();if(YAHOO.lang.isNumber(A[1])){this.lastOffset=A;return(A[1]-this.startOffset[1]);}else{return(this.lastOffset[1]-this.startOffset[1]);}},toString:function(){return"SliderThumb "+this.id;},onChange:function(A,B){}});(function(){var A=YAHOO.util.Event,B=YAHOO.widget;function C(I,F,H,D){var G=this,J={min:false,max:false},E,K;this.minSlider=I;this.maxSlider=F;this.activeSlider=I;this.isHoriz=I.thumb._isHoriz;E=this.minSlider.thumb.onMouseDown;K=this.maxSlider.thumb.onMouseDown;this.minSlider.thumb.onMouseDown=function(){G.activeSlider=G.minSlider;E.apply(this,arguments);};this.maxSlider.thumb.onMouseDown=function(){G.activeSlider=G.maxSlider;K.apply(this,arguments);};this.minSlider.thumb.onAvailable=function(){I.setStartSliderState();J.min=true;if(J.max){G.fireEvent("ready",G);}};this.maxSlider.thumb.onAvailable=function(){F.setStartSliderState();J.max=true;if(J.min){G.fireEvent("ready",G);}};I.onMouseDown=F.onMouseDown=function(L){return this.backgroundEnabled&&G._handleMouseDown(L);
+};I.onDrag=F.onDrag=function(L){G._handleDrag(L);};I.onMouseUp=F.onMouseUp=function(L){G._handleMouseUp(L);};I._bindKeyEvents=function(){G._bindKeyEvents(this);};F._bindKeyEvents=function(){};I.subscribe("change",this._handleMinChange,I,this);I.subscribe("slideStart",this._handleSlideStart,I,this);I.subscribe("slideEnd",this._handleSlideEnd,I,this);F.subscribe("change",this._handleMaxChange,F,this);F.subscribe("slideStart",this._handleSlideStart,F,this);F.subscribe("slideEnd",this._handleSlideEnd,F,this);this.createEvent("ready",this);this.createEvent("change",this);this.createEvent("slideStart",this);this.createEvent("slideEnd",this);D=YAHOO.lang.isArray(D)?D:[0,H];D[0]=Math.min(Math.max(parseInt(D[0],10)|0,0),H);D[1]=Math.max(Math.min(parseInt(D[1],10)|0,H),0);if(D[0]>D[1]){D.splice(0,2,D[1],D[0]);}this.minVal=D[0];this.maxVal=D[1];this.minSlider.setValue(this.minVal,true,true,true);this.maxSlider.setValue(this.maxVal,true,true,true);}C.prototype={minVal:-1,maxVal:-1,minRange:0,_handleSlideStart:function(E,D){this.fireEvent("slideStart",D);},_handleSlideEnd:function(E,D){this.fireEvent("slideEnd",D);},_handleDrag:function(D){B.Slider.prototype.onDrag.call(this.activeSlider,D);},_handleMinChange:function(){this.activeSlider=this.minSlider;this.updateValue();},_handleMaxChange:function(){this.activeSlider=this.maxSlider;this.updateValue();},_bindKeyEvents:function(D){A.on(D.id,"keydown",this._handleKeyDown,this,true);A.on(D.id,"keypress",this._handleKeyPress,this,true);},_handleKeyDown:function(D){this.activeSlider.handleKeyDown.apply(this.activeSlider,arguments);},_handleKeyPress:function(D){this.activeSlider.handleKeyPress.apply(this.activeSlider,arguments);},setValues:function(H,K,I,E,J){var F=this.minSlider,M=this.maxSlider,D=F.thumb,L=M.thumb,N=this,G={min:false,max:false};if(D._isHoriz){D.setXConstraint(D.leftConstraint,L.rightConstraint,D.tickSize);L.setXConstraint(D.leftConstraint,L.rightConstraint,L.tickSize);}else{D.setYConstraint(D.topConstraint,L.bottomConstraint,D.tickSize);L.setYConstraint(D.topConstraint,L.bottomConstraint,L.tickSize);}this._oneTimeCallback(F,"slideEnd",function(){G.min=true;if(G.max){N.updateValue(J);setTimeout(function(){N._cleanEvent(F,"slideEnd");N._cleanEvent(M,"slideEnd");},0);}});this._oneTimeCallback(M,"slideEnd",function(){G.max=true;if(G.min){N.updateValue(J);setTimeout(function(){N._cleanEvent(F,"slideEnd");N._cleanEvent(M,"slideEnd");},0);}});F.setValue(H,I,E,false);M.setValue(K,I,E,false);},setMinValue:function(F,H,I,E){var G=this.minSlider,D=this;this.activeSlider=G;D=this;this._oneTimeCallback(G,"slideEnd",function(){D.updateValue(E);setTimeout(function(){D._cleanEvent(G,"slideEnd");},0);});G.setValue(F,H,I);},setMaxValue:function(D,H,I,F){var G=this.maxSlider,E=this;this.activeSlider=G;this._oneTimeCallback(G,"slideEnd",function(){E.updateValue(F);setTimeout(function(){E._cleanEvent(G,"slideEnd");},0);});G.setValue(D,H,I);},updateValue:function(J){var E=this.minSlider.getValue(),K=this.maxSlider.getValue(),F=false,D,M,H,I,L,G;if(E!=this.minVal||K!=this.maxVal){F=true;D=this.minSlider.thumb;M=this.maxSlider.thumb;H=this.isHoriz?"x":"y";G=this.minSlider.thumbCenterPoint[H]+this.maxSlider.thumbCenterPoint[H];I=Math.max(K-G-this.minRange,0);L=Math.min(-E-G-this.minRange,0);if(this.isHoriz){I=Math.min(I,M.rightConstraint);D.setXConstraint(D.leftConstraint,I,D.tickSize);M.setXConstraint(L,M.rightConstraint,M.tickSize);}else{I=Math.min(I,M.bottomConstraint);D.setYConstraint(D.leftConstraint,I,D.tickSize);M.setYConstraint(L,M.bottomConstraint,M.tickSize);}}this.minVal=E;this.maxVal=K;if(F&&!J){this.fireEvent("change",this);}},selectActiveSlider:function(H){var E=this.minSlider,D=this.maxSlider,J=E.isLocked()||!E.backgroundEnabled,G=D.isLocked()||!E.backgroundEnabled,F=YAHOO.util.Event,I;if(J||G){this.activeSlider=J?D:E;}else{if(this.isHoriz){I=F.getPageX(H)-E.thumb.initPageX-E.thumbCenterPoint.x;}else{I=F.getPageY(H)-E.thumb.initPageY-E.thumbCenterPoint.y;}this.activeSlider=I*2>D.getValue()+E.getValue()?D:E;}},_handleMouseDown:function(D){if(!D._handled){D._handled=true;this.selectActiveSlider(D);return B.Slider.prototype.onMouseDown.call(this.activeSlider,D);}else{return false;}},_handleMouseUp:function(D){B.Slider.prototype.onMouseUp.apply(this.activeSlider,arguments);},_oneTimeCallback:function(F,D,E){F.subscribe(D,function(){F.unsubscribe(D,arguments.callee);E.apply({},[].slice.apply(arguments));});},_cleanEvent:function(K,E){var J,I,D,G,H,F;if(K.__yui_events&&K.events[E]){for(I=K.__yui_events.length;I>=0;--I){if(K.__yui_events[I].type===E){J=K.__yui_events[I];break;}}if(J){H=J.subscribers;F=[];G=0;for(I=0,D=H.length;I<D;++I){if(H[I]){F[G++]=H[I];}}J.subscribers=F;}}}};YAHOO.lang.augmentProto(C,YAHOO.util.EventProvider);B.Slider.getHorizDualSlider=function(H,J,K,G,F,D){var I=new B.SliderThumb(J,H,0,G,0,0,F),E=new B.SliderThumb(K,H,0,G,0,0,F);return new C(new B.Slider(H,H,I,"horiz"),new B.Slider(H,H,E,"horiz"),G,D);};B.Slider.getVertDualSlider=function(H,J,K,G,F,D){var I=new B.SliderThumb(J,H,0,0,0,G,F),E=new B.SliderThumb(K,H,0,0,0,G,F);return new B.DualSlider(new B.Slider(H,H,I,"vert"),new B.Slider(H,H,E,"vert"),G,D);};YAHOO.widget.DualSlider=C;})();YAHOO.register("slider",YAHOO.widget.Slider,{version:"2.7.0",build:"1796"});/*
+Copyright (c) 2009, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.net/yui/license.txt
+version: 2.7.0
+*/
+YAHOO.util.Attribute=function(B,A){if(A){this.owner=A;this.configure(B,true);}};YAHOO.util.Attribute.prototype={name:undefined,value:null,owner:null,readOnly:false,writeOnce:false,_initialConfig:null,_written:false,method:null,setter:null,getter:null,validator:null,getValue:function(){var A=this.value;if(this.getter){A=this.getter.call(this.owner,this.name);}return A;},setValue:function(F,B){var E,A=this.owner,C=this.name;var D={type:C,prevValue:this.getValue(),newValue:F};if(this.readOnly||(this.writeOnce&&this._written)){return false;}if(this.validator&&!this.validator.call(A,F)){return false;}if(!B){E=A.fireBeforeChangeEvent(D);if(E===false){return false;}}if(this.setter){F=this.setter.call(A,F,this.name);if(F===undefined){}}if(this.method){this.method.call(A,F,this.name);}this.value=F;this._written=true;D.type=C;if(!B){this.owner.fireChangeEvent(D);}return true;},configure:function(B,C){B=B||{};if(C){this._written=false;}this._initialConfig=this._initialConfig||{};for(var A in B){if(B.hasOwnProperty(A)){this[A]=B[A];if(C){this._initialConfig[A]=B[A];}}}},resetValue:function(){return this.setValue(this._initialConfig.value);},resetConfig:function(){this.configure(this._initialConfig,true);},refresh:function(A){this.setValue(this.value,A);}};(function(){var A=YAHOO.util.Lang;YAHOO.util.AttributeProvider=function(){};YAHOO.util.AttributeProvider.prototype={_configs:null,get:function(C){this._configs=this._configs||{};var B=this._configs[C];if(!B||!this._configs.hasOwnProperty(C)){return null;}return B.getValue();},set:function(D,E,B){this._configs=this._configs||{};var C=this._configs[D];if(!C){return false;}return C.setValue(E,B);},getAttributeKeys:function(){this._configs=this._configs;var C=[],B;for(B in this._configs){if(A.hasOwnProperty(this._configs,B)&&!A.isUndefined(this._configs[B])){C[C.length]=B;}}return C;},setAttributes:function(D,B){for(var C in D){if(A.hasOwnProperty(D,C)){this.set(C,D[C],B);}}},resetValue:function(C,B){this._configs=this._configs||{};if(this._configs[C]){this.set(C,this._configs[C]._initialConfig.value,B);return true;}return false;},refresh:function(E,C){this._configs=this._configs||{};var F=this._configs;E=((A.isString(E))?[E]:E)||this.getAttributeKeys();for(var D=0,B=E.length;D<B;++D){if(F.hasOwnProperty(E[D])){this._configs[E[D]].refresh(C);}}},register:function(B,C){this.setAttributeConfig(B,C);},getAttributeConfig:function(C){this._configs=this._configs||{};var B=this._configs[C]||{};var D={};for(C in B){if(A.hasOwnProperty(B,C)){D[C]=B[C];}}return D;},setAttributeConfig:function(B,C,D){this._configs=this._configs||{};C=C||{};if(!this._configs[B]){C.name=B;this._configs[B]=this.createAttribute(C);}else{this._configs[B].configure(C,D);}},configureAttribute:function(B,C,D){this.setAttributeConfig(B,C,D);},resetAttributeConfig:function(B){this._configs=this._configs||{};this._configs[B].resetConfig();},subscribe:function(B,C){this._events=this._events||{};if(!(B in this._events)){this._events[B]=this.createEvent(B);}YAHOO.util.EventProvider.prototype.subscribe.apply(this,arguments);},on:function(){this.subscribe.apply(this,arguments);},addListener:function(){this.subscribe.apply(this,arguments);},fireBeforeChangeEvent:function(C){var B="before";B+=C.type.charAt(0).toUpperCase()+C.type.substr(1)+"Change";C.type=B;return this.fireEvent(C.type,C);},fireChangeEvent:function(B){B.type+="Change";return this.fireEvent(B.type,B);},createAttribute:function(B){return new YAHOO.util.Attribute(B,this);}};YAHOO.augment(YAHOO.util.AttributeProvider,YAHOO.util.EventProvider);})();(function(){var B=YAHOO.util.Dom,C=YAHOO.util.AttributeProvider;var A=function(D,E){this.init.apply(this,arguments);};A.DOM_EVENTS={"click":true,"dblclick":true,"keydown":true,"keypress":true,"keyup":true,"mousedown":true,"mousemove":true,"mouseout":true,"mouseover":true,"mouseup":true,"focus":true,"blur":true,"submit":true,"change":true};A.prototype={DOM_EVENTS:null,DEFAULT_HTML_SETTER:function(F,D){var E=this.get("element");if(E){E[D]=F;}},DEFAULT_HTML_GETTER:function(D){var E=this.get("element"),F;if(E){F=E[D];}return F;},appendChild:function(D){D=D.get?D.get("element"):D;return this.get("element").appendChild(D);},getElementsByTagName:function(D){return this.get("element").getElementsByTagName(D);},hasChildNodes:function(){return this.get("element").hasChildNodes();},insertBefore:function(D,E){D=D.get?D.get("element"):D;E=(E&&E.get)?E.get("element"):E;return this.get("element").insertBefore(D,E);},removeChild:function(D){D=D.get?D.get("element"):D;return this.get("element").removeChild(D);},replaceChild:function(D,E){D=D.get?D.get("element"):D;E=E.get?E.get("element"):E;return this.get("element").replaceChild(D,E);},initAttributes:function(D){},addListener:function(H,G,I,F){var E=this.get("element")||this.get("id");F=F||this;var D=this;if(!this._events[H]){if(E&&this.DOM_EVENTS[H]){YAHOO.util.Event.addListener(E,H,function(J){if(J.srcElement&&!J.target){J.target=J.srcElement;}D.fireEvent(H,J);},I,F);}this.createEvent(H,this);}return YAHOO.util.EventProvider.prototype.subscribe.apply(this,arguments);},on:function(){return this.addListener.apply(this,arguments);},subscribe:function(){return this.addListener.apply(this,arguments);},removeListener:function(E,D){return this.unsubscribe.apply(this,arguments);},addClass:function(D){B.addClass(this.get("element"),D);},getElementsByClassName:function(E,D){return B.getElementsByClassName(E,D,this.get("element"));},hasClass:function(D){return B.hasClass(this.get("element"),D);},removeClass:function(D){return B.removeClass(this.get("element"),D);},replaceClass:function(E,D){return B.replaceClass(this.get("element"),E,D);},setStyle:function(E,D){return B.setStyle(this.get("element"),E,D);},getStyle:function(D){return B.getStyle(this.get("element"),D);},fireQueue:function(){var E=this._queue;for(var F=0,D=E.length;F<D;++F){this[E[F][0]].apply(this,E[F][1]);}},appendTo:function(E,F){E=(E.get)?E.get("element"):B.get(E);this.fireEvent("beforeAppendTo",{type:"beforeAppendTo",target:E});
+F=(F&&F.get)?F.get("element"):B.get(F);var D=this.get("element");if(!D){return false;}if(!E){return false;}if(D.parent!=E){if(F){E.insertBefore(D,F);}else{E.appendChild(D);}}this.fireEvent("appendTo",{type:"appendTo",target:E});return D;},get:function(D){var F=this._configs||{},E=F.element;if(E&&!F[D]&&!YAHOO.lang.isUndefined(E.value[D])){this._setHTMLAttrConfig(D);}return C.prototype.get.call(this,D);},setAttributes:function(J,G){var E={},H=this._configOrder;for(var I=0,D=H.length;I<D;++I){if(J[H[I]]!==undefined){E[H[I]]=true;this.set(H[I],J[H[I]],G);}}for(var F in J){if(J.hasOwnProperty(F)&&!E[F]){this.set(F,J[F],G);}}},set:function(E,G,D){var F=this.get("element");if(!F){this._queue[this._queue.length]=["set",arguments];if(this._configs[E]){this._configs[E].value=G;}return;}if(!this._configs[E]&&!YAHOO.lang.isUndefined(F[E])){this._setHTMLAttrConfig(E);}return C.prototype.set.apply(this,arguments);},setAttributeConfig:function(D,E,F){this._configOrder.push(D);C.prototype.setAttributeConfig.apply(this,arguments);},createEvent:function(E,D){this._events[E]=true;return C.prototype.createEvent.apply(this,arguments);},init:function(E,D){this._initElement(E,D);},destroy:function(){var D=this.get("element");YAHOO.util.Event.purgeElement(D,true);this.unsubscribeAll();if(D&&D.parentNode){D.parentNode.removeChild(D);}this._queue=[];this._events={};this._configs={};this._configOrder=[];},_initElement:function(F,E){this._queue=this._queue||[];this._events=this._events||{};this._configs=this._configs||{};this._configOrder=[];E=E||{};E.element=E.element||F||null;var H=false;var D=A.DOM_EVENTS;this.DOM_EVENTS=this.DOM_EVENTS||{};for(var G in D){if(D.hasOwnProperty(G)){this.DOM_EVENTS[G]=D[G];}}if(typeof E.element==="string"){this._setHTMLAttrConfig("id",{value:E.element});}if(B.get(E.element)){H=true;this._initHTMLElement(E);this._initContent(E);}YAHOO.util.Event.onAvailable(E.element,function(){if(!H){this._initHTMLElement(E);}this.fireEvent("available",{type:"available",target:B.get(E.element)});},this,true);YAHOO.util.Event.onContentReady(E.element,function(){if(!H){this._initContent(E);}this.fireEvent("contentReady",{type:"contentReady",target:B.get(E.element)});},this,true);},_initHTMLElement:function(D){this.setAttributeConfig("element",{value:B.get(D.element),readOnly:true});},_initContent:function(D){this.initAttributes(D);this.setAttributes(D,true);this.fireQueue();},_setHTMLAttrConfig:function(D,F){var E=this.get("element");F=F||{};F.name=D;F.setter=F.setter||this.DEFAULT_HTML_SETTER;F.getter=F.getter||this.DEFAULT_HTML_GETTER;F.value=F.value||E[D];this._configs[D]=new YAHOO.util.Attribute(F,this);}};YAHOO.augment(A,C);YAHOO.util.Element=A;})();YAHOO.register("element",YAHOO.util.Element,{version:"2.7.0",build:"1796"});/*
+Copyright (c) 2009, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.net/yui/license.txt
+version: 2.7.0
+*/
+YAHOO.util.Color=function(){var A="0",B=YAHOO.lang.isArray,C=YAHOO.lang.isNumber;return{real2dec:function(D){return Math.min(255,Math.round(D*256));},hsv2rgb:function(H,O,M){if(B(H)){return this.hsv2rgb.call(this,H[0],H[1],H[2]);}var D,I,L,G=Math.floor((H/60)%6),J=(H/60)-G,F=M*(1-O),E=M*(1-J*O),N=M*(1-(1-J)*O),K;switch(G){case 0:D=M;I=N;L=F;break;case 1:D=E;I=M;L=F;break;case 2:D=F;I=M;L=N;break;case 3:D=F;I=E;L=M;break;case 4:D=N;I=F;L=M;break;case 5:D=M;I=F;L=E;break;}K=this.real2dec;return[K(D),K(I),K(L)];},rgb2hsv:function(D,H,I){if(B(D)){return this.rgb2hsv.apply(this,D);}D/=255;H/=255;I/=255;var G,L,E=Math.min(Math.min(D,H),I),J=Math.max(Math.max(D,H),I),K=J-E,F;switch(J){case E:G=0;break;case D:G=60*(H-I)/K;if(H<I){G+=360;}break;case H:G=(60*(I-D)/K)+120;break;case I:G=(60*(D-H)/K)+240;break;}L=(J===0)?0:1-(E/J);F=[Math.round(G),L,J];return F;},rgb2hex:function(F,E,D){if(B(F)){return this.rgb2hex.apply(this,F);}var G=this.dec2hex;return G(F)+G(E)+G(D);},dec2hex:function(D){D=parseInt(D,10)|0;D=(D>255||D<0)?0:D;return(A+D.toString(16)).slice(-2).toUpperCase();},hex2dec:function(D){return parseInt(D,16);},hex2rgb:function(D){var E=this.hex2dec;return[E(D.slice(0,2)),E(D.slice(2,4)),E(D.slice(4,6))];},websafe:function(F,E,D){if(B(F)){return this.websafe.apply(this,F);}var G=function(H){if(C(H)){H=Math.min(Math.max(0,H),255);var I,J;for(I=0;I<256;I=I+51){J=I+51;if(H>=I&&H<=J){return(H-I>25)?J:I;}}}return H;};return[G(F),G(E),G(D)];}};}();(function(){var J=0,F=YAHOO.util,C=YAHOO.lang,D=YAHOO.widget.Slider,B=F.Color,E=F.Dom,I=F.Event,A=C.substitute,H="yui-picker";function G(L,K){J=J+1;K=K||{};if(arguments.length===1&&!YAHOO.lang.isString(L)&&!L.nodeName){K=L;L=K.element||null;}if(!L&&!K.element){L=this._createHostElement(K);}G.superclass.constructor.call(this,L,K);this.initPicker();}YAHOO.extend(G,YAHOO.util.Element,{ID:{R:H+"-r",R_HEX:H+"-rhex",G:H+"-g",G_HEX:H+"-ghex",B:H+"-b",B_HEX:H+"-bhex",H:H+"-h",S:H+"-s",V:H+"-v",PICKER_BG:H+"-bg",PICKER_THUMB:H+"-thumb",HUE_BG:H+"-hue-bg",HUE_THUMB:H+"-hue-thumb",HEX:H+"-hex",SWATCH:H+"-swatch",WEBSAFE_SWATCH:H+"-websafe-swatch",CONTROLS:H+"-controls",RGB_CONTROLS:H+"-rgb-controls",HSV_CONTROLS:H+"-hsv-controls",HEX_CONTROLS:H+"-hex-controls",HEX_SUMMARY:H+"-hex-summary",CONTROLS_LABEL:H+"-controls-label"},TXT:{ILLEGAL_HEX:"Illegal hex value entered",SHOW_CONTROLS:"Show color details",HIDE_CONTROLS:"Hide color details",CURRENT_COLOR:"Currently selected color: {rgb}",CLOSEST_WEBSAFE:"Closest websafe color: {rgb}. Click to select.",R:"R",G:"G",B:"B",H:"H",S:"S",V:"V",HEX:"#",DEG:"\u00B0",PERCENT:"%"},IMAGE:{PICKER_THUMB:"../../build/colorpicker/assets/picker_thumb.png",HUE_THUMB:"../../build/colorpicker/assets/hue_thumb.png"},DEFAULT:{PICKER_SIZE:180},OPT:{HUE:"hue",SATURATION:"saturation",VALUE:"value",RED:"red",GREEN:"green",BLUE:"blue",HSV:"hsv",RGB:"rgb",WEBSAFE:"websafe",HEX:"hex",PICKER_SIZE:"pickersize",SHOW_CONTROLS:"showcontrols",SHOW_RGB_CONTROLS:"showrgbcontrols",SHOW_HSV_CONTROLS:"showhsvcontrols",SHOW_HEX_CONTROLS:"showhexcontrols",SHOW_HEX_SUMMARY:"showhexsummary",SHOW_WEBSAFE:"showwebsafe",CONTAINER:"container",IDS:"ids",ELEMENTS:"elements",TXT:"txt",IMAGES:"images",ANIMATE:"animate"},skipAnim:true,_createHostElement:function(){var K=document.createElement("div");if(this.CSS.BASE){K.className=this.CSS.BASE;}return K;},_updateHueSlider:function(){var K=this.get(this.OPT.PICKER_SIZE),L=this.get(this.OPT.HUE);L=K-Math.round(L/360*K);if(L===K){L=0;}this.hueSlider.setValue(L,this.skipAnim);},_updatePickerSlider:function(){var L=this.get(this.OPT.PICKER_SIZE),M=this.get(this.OPT.SATURATION),K=this.get(this.OPT.VALUE);M=Math.round(M*L/100);K=Math.round(L-(K*L/100));this.pickerSlider.setRegionValue(M,K,this.skipAnim);},_updateSliders:function(){this._updateHueSlider();this._updatePickerSlider();},setValue:function(L,K){K=(K)||false;this.set(this.OPT.RGB,L,K);this._updateSliders();},hueSlider:null,pickerSlider:null,_getH:function(){var K=this.get(this.OPT.PICKER_SIZE),L=(K-this.hueSlider.getValue())/K;L=Math.round(L*360);return(L===360)?0:L;},_getS:function(){return this.pickerSlider.getXValue()/this.get(this.OPT.PICKER_SIZE);},_getV:function(){var K=this.get(this.OPT.PICKER_SIZE);return(K-this.pickerSlider.getYValue())/K;},_updateSwatch:function(){var M=this.get(this.OPT.RGB),O=this.get(this.OPT.WEBSAFE),N=this.getElement(this.ID.SWATCH),L=M.join(","),K=this.get(this.OPT.TXT);E.setStyle(N,"background-color","rgb("+L+")");N.title=A(K.CURRENT_COLOR,{"rgb":"#"+this.get(this.OPT.HEX)});N=this.getElement(this.ID.WEBSAFE_SWATCH);L=O.join(",");E.setStyle(N,"background-color","rgb("+L+")");N.title=A(K.CLOSEST_WEBSAFE,{"rgb":"#"+B.rgb2hex(O)});},_getValuesFromSliders:function(){this.set(this.OPT.RGB,B.hsv2rgb(this._getH(),this._getS(),this._getV()));},_updateFormFields:function(){this.getElement(this.ID.H).value=this.get(this.OPT.HUE);this.getElement(this.ID.S).value=this.get(this.OPT.SATURATION);this.getElement(this.ID.V).value=this.get(this.OPT.VALUE);this.getElement(this.ID.R).value=this.get(this.OPT.RED);this.getElement(this.ID.R_HEX).innerHTML=B.dec2hex(this.get(this.OPT.RED));this.getElement(this.ID.G).value=this.get(this.OPT.GREEN);this.getElement(this.ID.G_HEX).innerHTML=B.dec2hex(this.get(this.OPT.GREEN));this.getElement(this.ID.B).value=this.get(this.OPT.BLUE);this.getElement(this.ID.B_HEX).innerHTML=B.dec2hex(this.get(this.OPT.BLUE));this.getElement(this.ID.HEX).value=this.get(this.OPT.HEX);},_onHueSliderChange:function(N){var L=this._getH(),K=B.hsv2rgb(L,1,1),M="rgb("+K.join(",")+")";this.set(this.OPT.HUE,L,true);E.setStyle(this.getElement(this.ID.PICKER_BG),"background-color",M);if(this.hueSlider.valueChangeSource!==D.SOURCE_SET_VALUE){this._getValuesFromSliders();}this._updateFormFields();this._updateSwatch();},_onPickerSliderChange:function(M){var L=this._getS(),K=this._getV();this.set(this.OPT.SATURATION,Math.round(L*100),true);this.set(this.OPT.VALUE,Math.round(K*100),true);if(this.pickerSlider.valueChangeSource!==D.SOURCE_SET_VALUE){this._getValuesFromSliders();
+}this._updateFormFields();this._updateSwatch();},_getCommand:function(K){var L=I.getCharCode(K);if(L===38){return 3;}else{if(L===13){return 6;}else{if(L===40){return 4;}else{if(L>=48&&L<=57){return 1;}else{if(L>=97&&L<=102){return 2;}else{if(L>=65&&L<=70){return 2;}else{if("8, 9, 13, 27, 37, 39".indexOf(L)>-1||K.ctrlKey||K.metaKey){return 5;}else{return 0;}}}}}}}},_useFieldValue:function(L,K,N){var M=K.value;if(N!==this.OPT.HEX){M=parseInt(M,10);}if(M!==this.get(N)){this.set(N,M);}},_rgbFieldKeypress:function(M,K,O){var N=this._getCommand(M),L=(M.shiftKey)?10:1;switch(N){case 6:this._useFieldValue.apply(this,arguments);break;case 3:this.set(O,Math.min(this.get(O)+L,255));this._updateFormFields();break;case 4:this.set(O,Math.max(this.get(O)-L,0));this._updateFormFields();break;default:}},_hexFieldKeypress:function(L,K,N){var M=this._getCommand(L);if(M===6){this._useFieldValue.apply(this,arguments);}},_hexOnly:function(L,K){var M=this._getCommand(L);switch(M){case 6:case 5:case 1:break;case 2:if(K!==true){break;}default:I.stopEvent(L);return false;}},_numbersOnly:function(K){return this._hexOnly(K,true);},getElement:function(K){return this.get(this.OPT.ELEMENTS)[this.get(this.OPT.IDS)[K]];},_createElements:function(){var N,M,P,O,L,K=this.get(this.OPT.IDS),Q=this.get(this.OPT.TXT),S=this.get(this.OPT.IMAGES),R=function(U,V){var W=document.createElement(U);if(V){C.augmentObject(W,V,true);}return W;},T=function(U,V){var W=C.merge({autocomplete:"off",value:"0",size:3,maxlength:3},V);W.name=W.id;return new R(U,W);};L=this.get("element");N=new R("div",{id:K[this.ID.PICKER_BG],className:"yui-picker-bg",tabIndex:-1,hideFocus:true});M=new R("div",{id:K[this.ID.PICKER_THUMB],className:"yui-picker-thumb"});P=new R("img",{src:S.PICKER_THUMB});M.appendChild(P);N.appendChild(M);L.appendChild(N);N=new R("div",{id:K[this.ID.HUE_BG],className:"yui-picker-hue-bg",tabIndex:-1,hideFocus:true});M=new R("div",{id:K[this.ID.HUE_THUMB],className:"yui-picker-hue-thumb"});P=new R("img",{src:S.HUE_THUMB});M.appendChild(P);N.appendChild(M);L.appendChild(N);N=new R("div",{id:K[this.ID.CONTROLS],className:"yui-picker-controls"});L.appendChild(N);L=N;N=new R("div",{className:"hd"});M=new R("a",{id:K[this.ID.CONTROLS_LABEL],href:"#"});N.appendChild(M);L.appendChild(N);N=new R("div",{className:"bd"});L.appendChild(N);L=N;N=new R("ul",{id:K[this.ID.RGB_CONTROLS],className:"yui-picker-rgb-controls"});M=new R("li");M.appendChild(document.createTextNode(Q.R+" "));O=new T("input",{id:K[this.ID.R],className:"yui-picker-r"});M.appendChild(O);N.appendChild(M);M=new R("li");M.appendChild(document.createTextNode(Q.G+" "));O=new T("input",{id:K[this.ID.G],className:"yui-picker-g"});M.appendChild(O);N.appendChild(M);M=new R("li");M.appendChild(document.createTextNode(Q.B+" "));O=new T("input",{id:K[this.ID.B],className:"yui-picker-b"});M.appendChild(O);N.appendChild(M);L.appendChild(N);N=new R("ul",{id:K[this.ID.HSV_CONTROLS],className:"yui-picker-hsv-controls"});M=new R("li");M.appendChild(document.createTextNode(Q.H+" "));O=new T("input",{id:K[this.ID.H],className:"yui-picker-h"});M.appendChild(O);M.appendChild(document.createTextNode(" "+Q.DEG));N.appendChild(M);M=new R("li");M.appendChild(document.createTextNode(Q.S+" "));O=new T("input",{id:K[this.ID.S],className:"yui-picker-s"});M.appendChild(O);M.appendChild(document.createTextNode(" "+Q.PERCENT));N.appendChild(M);M=new R("li");M.appendChild(document.createTextNode(Q.V+" "));O=new T("input",{id:K[this.ID.V],className:"yui-picker-v"});M.appendChild(O);M.appendChild(document.createTextNode(" "+Q.PERCENT));N.appendChild(M);L.appendChild(N);N=new R("ul",{id:K[this.ID.HEX_SUMMARY],className:"yui-picker-hex_summary"});M=new R("li",{id:K[this.ID.R_HEX]});N.appendChild(M);M=new R("li",{id:K[this.ID.G_HEX]});N.appendChild(M);M=new R("li",{id:K[this.ID.B_HEX]});N.appendChild(M);L.appendChild(N);N=new R("div",{id:K[this.ID.HEX_CONTROLS],className:"yui-picker-hex-controls"});N.appendChild(document.createTextNode(Q.HEX+" "));M=new T("input",{id:K[this.ID.HEX],className:"yui-picker-hex",size:6,maxlength:6});N.appendChild(M);L.appendChild(N);L=this.get("element");N=new R("div",{id:K[this.ID.SWATCH],className:"yui-picker-swatch"});L.appendChild(N);N=new R("div",{id:K[this.ID.WEBSAFE_SWATCH],className:"yui-picker-websafe-swatch"});L.appendChild(N);},_attachRGBHSV:function(L,K){I.on(this.getElement(L),"keydown",function(N,M){M._rgbFieldKeypress(N,this,K);},this);I.on(this.getElement(L),"keypress",this._numbersOnly,this,true);I.on(this.getElement(L),"blur",function(N,M){M._useFieldValue(N,this,K);},this);},_updateRGB:function(){var K=[this.get(this.OPT.RED),this.get(this.OPT.GREEN),this.get(this.OPT.BLUE)];this.set(this.OPT.RGB,K);this._updateSliders();},_initElements:function(){var O=this.OPT,N=this.get(O.IDS),L=this.get(O.ELEMENTS),K,M,P;for(K in this.ID){if(C.hasOwnProperty(this.ID,K)){N[this.ID[K]]=N[K];}}M=E.get(N[this.ID.PICKER_BG]);if(!M){this._createElements();}else{}for(K in N){if(C.hasOwnProperty(N,K)){M=E.get(N[K]);P=E.generateId(M);N[K]=P;N[N[K]]=P;L[P]=M;}}},initPicker:function(){this._initSliders();this._bindUI();this.syncUI(true);},_initSliders:function(){var K=this.ID,L=this.get(this.OPT.PICKER_SIZE);this.hueSlider=D.getVertSlider(this.getElement(K.HUE_BG),this.getElement(K.HUE_THUMB),0,L);this.pickerSlider=D.getSliderRegion(this.getElement(K.PICKER_BG),this.getElement(K.PICKER_THUMB),0,L,0,L);this.set(this.OPT.ANIMATE,this.get(this.OPT.ANIMATE));},_bindUI:function(){var K=this.ID,L=this.OPT;this.hueSlider.subscribe("change",this._onHueSliderChange,this,true);this.pickerSlider.subscribe("change",this._onPickerSliderChange,this,true);I.on(this.getElement(K.WEBSAFE_SWATCH),"click",function(M){this.setValue(this.get(L.WEBSAFE));},this,true);I.on(this.getElement(K.CONTROLS_LABEL),"click",function(M){this.set(L.SHOW_CONTROLS,!this.get(L.SHOW_CONTROLS));I.preventDefault(M);},this,true);this._attachRGBHSV(K.R,L.RED);this._attachRGBHSV(K.G,L.GREEN);this._attachRGBHSV(K.B,L.BLUE);this._attachRGBHSV(K.H,L.HUE);
+this._attachRGBHSV(K.S,L.SATURATION);this._attachRGBHSV(K.V,L.VALUE);I.on(this.getElement(K.HEX),"keydown",function(N,M){M._hexFieldKeypress(N,this,L.HEX);},this);I.on(this.getElement(this.ID.HEX),"keypress",this._hexOnly,this,true);I.on(this.getElement(this.ID.HEX),"blur",function(N,M){M._useFieldValue(N,this,L.HEX);},this);},syncUI:function(K){this.skipAnim=K;this._updateRGB();this.skipAnim=false;},_updateRGBFromHSV:function(){var L=[this.get(this.OPT.HUE),this.get(this.OPT.SATURATION)/100,this.get(this.OPT.VALUE)/100],K=B.hsv2rgb(L);this.set(this.OPT.RGB,K);this._updateSliders();},_updateHex:function(){var N=this.get(this.OPT.HEX),K=N.length,O,M,L;if(K===3){O=N.split("");for(M=0;M<K;M=M+1){O[M]=O[M]+O[M];}N=O.join("");}if(N.length!==6){return false;}L=B.hex2rgb(N);this.setValue(L);},_hideShowEl:function(M,K){var L=(C.isString(M)?this.getElement(M):M);E.setStyle(L,"display",(K)?"":"none");},initAttributes:function(K){K=K||{};G.superclass.initAttributes.call(this,K);this.setAttributeConfig(this.OPT.PICKER_SIZE,{value:K.size||this.DEFAULT.PICKER_SIZE});this.setAttributeConfig(this.OPT.HUE,{value:K.hue||0,validator:C.isNumber});this.setAttributeConfig(this.OPT.SATURATION,{value:K.saturation||0,validator:C.isNumber});this.setAttributeConfig(this.OPT.VALUE,{value:C.isNumber(K.value)?K.value:100,validator:C.isNumber});this.setAttributeConfig(this.OPT.RED,{value:C.isNumber(K.red)?K.red:255,validator:C.isNumber});this.setAttributeConfig(this.OPT.GREEN,{value:C.isNumber(K.green)?K.green:255,validator:C.isNumber});this.setAttributeConfig(this.OPT.BLUE,{value:C.isNumber(K.blue)?K.blue:255,validator:C.isNumber});this.setAttributeConfig(this.OPT.HEX,{value:K.hex||"FFFFFF",validator:C.isString});this.setAttributeConfig(this.OPT.RGB,{value:K.rgb||[255,255,255],method:function(O){this.set(this.OPT.RED,O[0],true);this.set(this.OPT.GREEN,O[1],true);this.set(this.OPT.BLUE,O[2],true);var Q=B.websafe(O),P=B.rgb2hex(O),N=B.rgb2hsv(O);this.set(this.OPT.WEBSAFE,Q,true);this.set(this.OPT.HEX,P,true);if(N[1]){this.set(this.OPT.HUE,N[0],true);}this.set(this.OPT.SATURATION,Math.round(N[1]*100),true);this.set(this.OPT.VALUE,Math.round(N[2]*100),true);},readonly:true});this.setAttributeConfig(this.OPT.CONTAINER,{value:null,method:function(N){if(N){N.showEvent.subscribe(function(){this.pickerSlider.focus();},this,true);}}});this.setAttributeConfig(this.OPT.WEBSAFE,{value:K.websafe||[255,255,255]});var M=K.ids||C.merge({},this.ID),L;if(!K.ids&&J>1){for(L in M){if(C.hasOwnProperty(M,L)){M[L]=M[L]+J;}}}this.setAttributeConfig(this.OPT.IDS,{value:M,writeonce:true});this.setAttributeConfig(this.OPT.TXT,{value:K.txt||this.TXT,writeonce:true});this.setAttributeConfig(this.OPT.IMAGES,{value:K.images||this.IMAGE,writeonce:true});this.setAttributeConfig(this.OPT.ELEMENTS,{value:{},readonly:true});this.setAttributeConfig(this.OPT.SHOW_CONTROLS,{value:C.isBoolean(K.showcontrols)?K.showcontrols:true,method:function(N){var O=E.getElementsByClassName("bd","div",this.getElement(this.ID.CONTROLS))[0];this._hideShowEl(O,N);this.getElement(this.ID.CONTROLS_LABEL).innerHTML=(N)?this.get(this.OPT.TXT).HIDE_CONTROLS:this.get(this.OPT.TXT).SHOW_CONTROLS;}});this.setAttributeConfig(this.OPT.SHOW_RGB_CONTROLS,{value:C.isBoolean(K.showrgbcontrols)?K.showrgbcontrols:true,method:function(N){this._hideShowEl(this.ID.RGB_CONTROLS,N);}});this.setAttributeConfig(this.OPT.SHOW_HSV_CONTROLS,{value:C.isBoolean(K.showhsvcontrols)?K.showhsvcontrols:false,method:function(N){this._hideShowEl(this.ID.HSV_CONTROLS,N);if(N&&this.get(this.OPT.SHOW_HEX_SUMMARY)){this.set(this.OPT.SHOW_HEX_SUMMARY,false);}}});this.setAttributeConfig(this.OPT.SHOW_HEX_CONTROLS,{value:C.isBoolean(K.showhexcontrols)?K.showhexcontrols:false,method:function(N){this._hideShowEl(this.ID.HEX_CONTROLS,N);}});this.setAttributeConfig(this.OPT.SHOW_WEBSAFE,{value:C.isBoolean(K.showwebsafe)?K.showwebsafe:true,method:function(N){this._hideShowEl(this.ID.WEBSAFE_SWATCH,N);}});this.setAttributeConfig(this.OPT.SHOW_HEX_SUMMARY,{value:C.isBoolean(K.showhexsummary)?K.showhexsummary:true,method:function(N){this._hideShowEl(this.ID.HEX_SUMMARY,N);if(N&&this.get(this.OPT.SHOW_HSV_CONTROLS)){this.set(this.OPT.SHOW_HSV_CONTROLS,false);}}});this.setAttributeConfig(this.OPT.ANIMATE,{value:C.isBoolean(K.animate)?K.animate:true,method:function(N){if(this.pickerSlider){this.pickerSlider.animate=N;this.hueSlider.animate=N;}}});this.on(this.OPT.HUE+"Change",this._updateRGBFromHSV,this,true);this.on(this.OPT.SATURATION+"Change",this._updateRGBFromHSV,this,true);this.on(this.OPT.VALUE+"Change",this._updateRGBFromHSV,this,true);this.on(this.OPT.RED+"Change",this._updateRGB,this,true);this.on(this.OPT.GREEN+"Change",this._updateRGB,this,true);this.on(this.OPT.BLUE+"Change",this._updateRGB,this,true);this.on(this.OPT.HEX+"Change",this._updateHex,this,true);this._initElements();}});YAHOO.widget.ColorPicker=G;})();YAHOO.register("colorpicker",YAHOO.widget.ColorPicker,{version:"2.7.0",build:"1796"});
+
+/*
+Copyright (c) 2009, Yahoo! Inc. All rights reserved.
+Code licensed under the BSD License:
+http://developer.yahoo.net/yui/license.txt
+version: 2.7.0
+*/
+(function(){var B=YAHOO.util;var A=function(D,C,E,F){if(!D){}this.init(D,C,E,F);};A.NAME="Anim";A.prototype={toString:function(){var C=this.getEl()||{};var D=C.id||C.tagName;return(this.constructor.NAME+": "+D);},patterns:{noNegatives:/width|height|opacity|padding/i,offsetAttribute:/^((width|height)|(top|left))$/,defaultUnit:/width|height|top$|bottom$|left$|right$/i,offsetUnit:/\d+(em|%|en|ex|pt|in|cm|mm|pc)$/i},doMethod:function(C,E,D){return this.method(this.currentFrame,E,D-E,this.totalFrames);},setAttribute:function(C,F,E){var D=this.getEl();if(this.patterns.noNegatives.test(C)){F=(F>0)?F:0;}if("style" in D){B.Dom.setStyle(D,C,F+E);}else{if(C in D){D[C]=F;}}},getAttribute:function(C){var E=this.getEl();var G=B.Dom.getStyle(E,C);if(G!=="auto"&&!this.patterns.offsetUnit.test(G)){return parseFloat(G);}var D=this.patterns.offsetAttribute.exec(C)||[];var H=!!(D[3]);var F=!!(D[2]);if("style" in E){if(F||(B.Dom.getStyle(E,"position")=="absolute"&&H)){G=E["offset"+D[0].charAt(0).toUpperCase()+D[0].substr(1)];}else{G=0;}}else{if(C in E){G=E[C];}}return G;},getDefaultUnit:function(C){if(this.patterns.defaultUnit.test(C)){return"px";}return"";},setRuntimeAttribute:function(D){var I;var E;var F=this.attributes;this.runtimeAttributes[D]={};var H=function(J){return(typeof J!=="undefined");};if(!H(F[D]["to"])&&!H(F[D]["by"])){return false;}I=(H(F[D]["from"]))?F[D]["from"]:this.getAttribute(D);if(H(F[D]["to"])){E=F[D]["to"];}else{if(H(F[D]["by"])){if(I.constructor==Array){E=[];for(var G=0,C=I.length;G<C;++G){E[G]=I[G]+F[D]["by"][G]*1;}}else{E=I+F[D]["by"]*1;}}}this.runtimeAttributes[D].start=I;this.runtimeAttributes[D].end=E;this.runtimeAttributes[D].unit=(H(F[D].unit))?F[D]["unit"]:this.getDefaultUnit(D);return true;},init:function(E,J,I,C){var D=false;var F=null;var H=0;E=B.Dom.get(E);this.attributes=J||{};this.duration=!YAHOO.lang.isUndefined(I)?I:1;this.method=C||B.Easing.easeNone;this.useSeconds=true;this.currentFrame=0;this.totalFrames=B.AnimMgr.fps;this.setEl=function(M){E=B.Dom.get(M);};this.getEl=function(){return E;};this.isAnimated=function(){return D;};this.getStartTime=function(){return F;};this.runtimeAttributes={};this.animate=function(){if(this.isAnimated()){return false;}this.currentFrame=0;this.totalFrames=(this.useSeconds)?Math.ceil(B.AnimMgr.fps*this.duration):this.duration;if(this.duration===0&&this.useSeconds){this.totalFrames=1;}B.AnimMgr.registerElement(this);return true;};this.stop=function(M){if(!this.isAnimated()){return false;}if(M){this.currentFrame=this.totalFrames;this._onTween.fire();}B.AnimMgr.stop(this);};var L=function(){this.onStart.fire();this.runtimeAttributes={};for(var M in this.attributes){this.setRuntimeAttribute(M);}D=true;H=0;F=new Date();};var K=function(){var O={duration:new Date()-this.getStartTime(),currentFrame:this.currentFrame};O.toString=function(){return("duration: "+O.duration+", currentFrame: "+O.currentFrame);};this.onTween.fire(O);var N=this.runtimeAttributes;for(var M in N){this.setAttribute(M,this.doMethod(M,N[M].start,N[M].end),N[M].unit);}H+=1;};var G=function(){var M=(new Date()-F)/1000;var N={duration:M,frames:H,fps:H/M};N.toString=function(){return("duration: "+N.duration+", frames: "+N.frames+", fps: "+N.fps);};D=false;H=0;this.onComplete.fire(N);};this._onStart=new B.CustomEvent("_start",this,true);this.onStart=new B.CustomEvent("start",this);this.onTween=new B.CustomEvent("tween",this);this._onTween=new B.CustomEvent("_tween",this,true);this.onComplete=new B.CustomEvent("complete",this);this._onComplete=new B.CustomEvent("_complete",this,true);this._onStart.subscribe(L);this._onTween.subscribe(K);this._onComplete.subscribe(G);}};B.Anim=A;})();YAHOO.util.AnimMgr=new function(){var C=null;var B=[];var A=0;this.fps=1000;this.delay=1;this.registerElement=function(F){B[B.length]=F;A+=1;F._onStart.fire();this.start();};this.unRegister=function(G,F){F=F||E(G);if(!G.isAnimated()||F==-1){return false;}G._onComplete.fire();B.splice(F,1);A-=1;if(A<=0){this.stop();}return true;};this.start=function(){if(C===null){C=setInterval(this.run,this.delay);}};this.stop=function(H){if(!H){clearInterval(C);for(var G=0,F=B.length;G<F;++G){this.unRegister(B[0],0);}B=[];C=null;A=0;}else{this.unRegister(H);}};this.run=function(){for(var H=0,F=B.length;H<F;++H){var G=B[H];if(!G||!G.isAnimated()){continue;}if(G.currentFrame<G.totalFrames||G.totalFrames===null){G.currentFrame+=1;if(G.useSeconds){D(G);}G._onTween.fire();}else{YAHOO.util.AnimMgr.stop(G,H);}}};var E=function(H){for(var G=0,F=B.length;G<F;++G){if(B[G]==H){return G;}}return -1;};var D=function(G){var J=G.totalFrames;var I=G.currentFrame;var H=(G.currentFrame*G.duration*1000/G.totalFrames);var F=(new Date()-G.getStartTime());var K=0;if(F<G.duration*1000){K=Math.round((F/H-1)*G.currentFrame);}else{K=J-(I+1);}if(K>0&&isFinite(K)){if(G.currentFrame+K>=J){K=J-(I+1);}G.currentFrame+=K;}};};YAHOO.util.Bezier=new function(){this.getPosition=function(E,D){var F=E.length;var C=[];for(var B=0;B<F;++B){C[B]=[E[B][0],E[B][1]];}for(var A=1;A<F;++A){for(B=0;B<F-A;++B){C[B][0]=(1-D)*C[B][0]+D*C[parseInt(B+1,10)][0];C[B][1]=(1-D)*C[B][1]+D*C[parseInt(B+1,10)][1];}}return[C[0][0],C[0][1]];};};(function(){var A=function(F,E,G,H){A.superclass.constructor.call(this,F,E,G,H);};A.NAME="ColorAnim";A.DEFAULT_BGCOLOR="#fff";var C=YAHOO.util;YAHOO.extend(A,C.Anim);var D=A.superclass;var B=A.prototype;B.patterns.color=/color$/i;B.patterns.rgb=/^rgb\(([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\)$/i;B.patterns.hex=/^#?([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i;B.patterns.hex3=/^#?([0-9A-F]{1})([0-9A-F]{1})([0-9A-F]{1})$/i;B.patterns.transparent=/^transparent|rgba\(0, 0, 0, 0\)$/;B.parseColor=function(E){if(E.length==3){return E;}var F=this.patterns.hex.exec(E);if(F&&F.length==4){return[parseInt(F[1],16),parseInt(F[2],16),parseInt(F[3],16)];}F=this.patterns.rgb.exec(E);if(F&&F.length==4){return[parseInt(F[1],10),parseInt(F[2],10),parseInt(F[3],10)];}F=this.patterns.hex3.exec(E);if(F&&F.length==4){return[parseInt(F[1]+F[1],16),parseInt(F[2]+F[2],16),parseInt(F[3]+F[3],16)];
+}return null;};B.getAttribute=function(E){var G=this.getEl();if(this.patterns.color.test(E)){var I=YAHOO.util.Dom.getStyle(G,E);var H=this;if(this.patterns.transparent.test(I)){var F=YAHOO.util.Dom.getAncestorBy(G,function(J){return !H.patterns.transparent.test(I);});if(F){I=C.Dom.getStyle(F,E);}else{I=A.DEFAULT_BGCOLOR;}}}else{I=D.getAttribute.call(this,E);}return I;};B.doMethod=function(F,J,G){var I;if(this.patterns.color.test(F)){I=[];for(var H=0,E=J.length;H<E;++H){I[H]=D.doMethod.call(this,F,J[H],G[H]);}I="rgb("+Math.floor(I[0])+","+Math.floor(I[1])+","+Math.floor(I[2])+")";}else{I=D.doMethod.call(this,F,J,G);}return I;};B.setRuntimeAttribute=function(F){D.setRuntimeAttribute.call(this,F);if(this.patterns.color.test(F)){var H=this.attributes;var J=this.parseColor(this.runtimeAttributes[F].start);var G=this.parseColor(this.runtimeAttributes[F].end);if(typeof H[F]["to"]==="undefined"&&typeof H[F]["by"]!=="undefined"){G=this.parseColor(H[F].by);for(var I=0,E=J.length;I<E;++I){G[I]=J[I]+G[I];}}this.runtimeAttributes[F].start=J;this.runtimeAttributes[F].end=G;}};C.ColorAnim=A;})();
+/*
+TERMS OF USE - EASING EQUATIONS
+Open source under the BSD License.
+Copyright 2001 Robert Penner All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * Neither the name of the author nor the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+YAHOO.util.Easing={easeNone:function(B,A,D,C){return D*B/C+A;},easeIn:function(B,A,D,C){return D*(B/=C)*B+A;},easeOut:function(B,A,D,C){return -D*(B/=C)*(B-2)+A;},easeBoth:function(B,A,D,C){if((B/=C/2)<1){return D/2*B*B+A;}return -D/2*((--B)*(B-2)-1)+A;},easeInStrong:function(B,A,D,C){return D*(B/=C)*B*B*B+A;},easeOutStrong:function(B,A,D,C){return -D*((B=B/C-1)*B*B*B-1)+A;},easeBothStrong:function(B,A,D,C){if((B/=C/2)<1){return D/2*B*B*B*B+A;}return -D/2*((B-=2)*B*B*B-2)+A;},elasticIn:function(C,A,G,F,B,E){if(C==0){return A;}if((C/=F)==1){return A+G;}if(!E){E=F*0.3;}if(!B||B<Math.abs(G)){B=G;var D=E/4;}else{var D=E/(2*Math.PI)*Math.asin(G/B);}return -(B*Math.pow(2,10*(C-=1))*Math.sin((C*F-D)*(2*Math.PI)/E))+A;},elasticOut:function(C,A,G,F,B,E){if(C==0){return A;}if((C/=F)==1){return A+G;}if(!E){E=F*0.3;}if(!B||B<Math.abs(G)){B=G;var D=E/4;}else{var D=E/(2*Math.PI)*Math.asin(G/B);}return B*Math.pow(2,-10*C)*Math.sin((C*F-D)*(2*Math.PI)/E)+G+A;},elasticBoth:function(C,A,G,F,B,E){if(C==0){return A;}if((C/=F/2)==2){return A+G;}if(!E){E=F*(0.3*1.5);}if(!B||B<Math.abs(G)){B=G;var D=E/4;}else{var D=E/(2*Math.PI)*Math.asin(G/B);}if(C<1){return -0.5*(B*Math.pow(2,10*(C-=1))*Math.sin((C*F-D)*(2*Math.PI)/E))+A;}return B*Math.pow(2,-10*(C-=1))*Math.sin((C*F-D)*(2*Math.PI)/E)*0.5+G+A;},backIn:function(B,A,E,D,C){if(typeof C=="undefined"){C=1.70158;}return E*(B/=D)*B*((C+1)*B-C)+A;},backOut:function(B,A,E,D,C){if(typeof C=="undefined"){C=1.70158;}return E*((B=B/D-1)*B*((C+1)*B+C)+1)+A;},backBoth:function(B,A,E,D,C){if(typeof C=="undefined"){C=1.70158;}if((B/=D/2)<1){return E/2*(B*B*(((C*=(1.525))+1)*B-C))+A;}return E/2*((B-=2)*B*(((C*=(1.525))+1)*B+C)+2)+A;},bounceIn:function(B,A,D,C){return D-YAHOO.util.Easing.bounceOut(C-B,0,D,C)+A;},bounceOut:function(B,A,D,C){if((B/=C)<(1/2.75)){return D*(7.5625*B*B)+A;}else{if(B<(2/2.75)){return D*(7.5625*(B-=(1.5/2.75))*B+0.75)+A;}else{if(B<(2.5/2.75)){return D*(7.5625*(B-=(2.25/2.75))*B+0.9375)+A;}}}return D*(7.5625*(B-=(2.625/2.75))*B+0.984375)+A;},bounceBoth:function(B,A,D,C){if(B<C/2){return YAHOO.util.Easing.bounceIn(B*2,0,D,C)*0.5+A;}return YAHOO.util.Easing.bounceOut(B*2-C,0,D,C)*0.5+D*0.5+A;}};(function(){var A=function(H,G,I,J){if(H){A.superclass.constructor.call(this,H,G,I,J);}};A.NAME="Motion";var E=YAHOO.util;YAHOO.extend(A,E.ColorAnim);var F=A.superclass;var C=A.prototype;C.patterns.points=/^points$/i;C.setAttribute=function(G,I,H){if(this.patterns.points.test(G)){H=H||"px";F.setAttribute.call(this,"left",I[0],H);F.setAttribute.call(this,"top",I[1],H);}else{F.setAttribute.call(this,G,I,H);}};C.getAttribute=function(G){if(this.patterns.points.test(G)){var H=[F.getAttribute.call(this,"left"),F.getAttribute.call(this,"top")];}else{H=F.getAttribute.call(this,G);}return H;};C.doMethod=function(G,K,H){var J=null;if(this.patterns.points.test(G)){var I=this.method(this.currentFrame,0,100,this.totalFrames)/100;J=E.Bezier.getPosition(this.runtimeAttributes[G],I);}else{J=F.doMethod.call(this,G,K,H);}return J;};C.setRuntimeAttribute=function(P){if(this.patterns.points.test(P)){var H=this.getEl();var J=this.attributes;var G;var L=J["points"]["control"]||[];var I;var M,O;if(L.length>0&&!(L[0] instanceof Array)){L=[L];}else{var K=[];for(M=0,O=L.length;M<O;++M){K[M]=L[M];}L=K;}if(E.Dom.getStyle(H,"position")=="static"){E.Dom.setStyle(H,"position","relative");}if(D(J["points"]["from"])){E.Dom.setXY(H,J["points"]["from"]);
+}else{E.Dom.setXY(H,E.Dom.getXY(H));}G=this.getAttribute("points");if(D(J["points"]["to"])){I=B.call(this,J["points"]["to"],G);var N=E.Dom.getXY(this.getEl());for(M=0,O=L.length;M<O;++M){L[M]=B.call(this,L[M],G);}}else{if(D(J["points"]["by"])){I=[G[0]+J["points"]["by"][0],G[1]+J["points"]["by"][1]];for(M=0,O=L.length;M<O;++M){L[M]=[G[0]+L[M][0],G[1]+L[M][1]];}}}this.runtimeAttributes[P]=[G];if(L.length>0){this.runtimeAttributes[P]=this.runtimeAttributes[P].concat(L);}this.runtimeAttributes[P][this.runtimeAttributes[P].length]=I;}else{F.setRuntimeAttribute.call(this,P);}};var B=function(G,I){var H=E.Dom.getXY(this.getEl());G=[G[0]-H[0]+I[0],G[1]-H[1]+I[1]];return G;};var D=function(G){return(typeof G!=="undefined");};E.Motion=A;})();(function(){var D=function(F,E,G,H){if(F){D.superclass.constructor.call(this,F,E,G,H);}};D.NAME="Scroll";var B=YAHOO.util;YAHOO.extend(D,B.ColorAnim);var C=D.superclass;var A=D.prototype;A.doMethod=function(E,H,F){var G=null;if(E=="scroll"){G=[this.method(this.currentFrame,H[0],F[0]-H[0],this.totalFrames),this.method(this.currentFrame,H[1],F[1]-H[1],this.totalFrames)];}else{G=C.doMethod.call(this,E,H,F);}return G;};A.getAttribute=function(E){var G=null;var F=this.getEl();if(E=="scroll"){G=[F.scrollLeft,F.scrollTop];}else{G=C.getAttribute.call(this,E);}return G;};A.setAttribute=function(E,H,G){var F=this.getEl();if(E=="scroll"){F.scrollLeft=H[0];F.scrollTop=H[1];}else{C.setAttribute.call(this,E,H,G);}};B.Scroll=D;})();YAHOO.register("animation",YAHOO.util.Anim,{version:"2.7.0",build:"1799"});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/wsc/dialogs/ciframe.html b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/wsc/dialogs/ciframe.html
index 292297d..5cc9254 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/wsc/dialogs/ciframe.html
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/wsc/dialogs/ciframe.html
@@ -1,49 +1,49 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
-<!--
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
--->
-<html>
-<head>
- <title></title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <script type="text/javascript">
-
-function gup( name )
-{
- name = name.replace( /[\[]/, '\\\[' ).replace( /[\]]/, '\\\]' ) ;
- var regexS = '[\\?&]' + name + '=([^&#]*)' ;
- var regex = new RegExp( regexS ) ;
- var results = regex.exec( window.location.href ) ;
-
- if ( results )
- return results[ 1 ] ;
- else
- return '' ;
-}
-
-var interval;
-
-function sendData2Master()
-{
- var destination = window.parent.parent ;
- try
- {
- if ( destination.XDTMaster )
- {
- var t = destination.XDTMaster.read( [ gup( 'cmd' ), gup( 'data' ) ] ) ;
- window.clearInterval( interval ) ;
- }
- }
- catch (e) {}
-}
-
-function onLoad()
-{
- interval = window.setInterval( sendData2Master, 100 );
-}
-
-</script>
-</head>
-<body onload="onLoad()"><p></p></body>
-</html>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<!--
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title></title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <script type="text/javascript">
+
+function gup( name )
+{
+ name = name.replace( /[\[]/, '\\\[' ).replace( /[\]]/, '\\\]' ) ;
+ var regexS = '[\\?&]' + name + '=([^&#]*)' ;
+ var regex = new RegExp( regexS ) ;
+ var results = regex.exec( window.location.href ) ;
+
+ if ( results )
+ return results[ 1 ] ;
+ else
+ return '' ;
+}
+
+var interval;
+
+function sendData2Master()
+{
+ var destination = window.parent.parent ;
+ try
+ {
+ if ( destination.XDTMaster )
+ {
+ var t = destination.XDTMaster.read( [ gup( 'cmd' ), gup( 'data' ) ] ) ;
+ window.clearInterval( interval ) ;
+ }
+ }
+ catch (e) {}
+}
+
+function onLoad()
+{
+ interval = window.setInterval( sendData2Master, 100 );
+}
+
+</script>
+</head>
+<body onload="onLoad()"><p></p></body>
+</html>
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/wsc/dialogs/tmpFrameset.html b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/wsc/dialogs/tmpFrameset.html
index 88e1afe..0d675f4 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/wsc/dialogs/tmpFrameset.html
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/wsc/dialogs/tmpFrameset.html
@@ -1,52 +1,52 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
-<!--
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
--->
-<html>
-<head>
- <title></title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
- <script type="text/javascript">
-
-function doLoadScript( url )
-{
- if ( !url )
- return false ;
-
- var s = document.createElement( "script" ) ;
- s.type = "text/javascript" ;
- s.src = url ;
- document.getElementsByTagName( "head" )[ 0 ].appendChild( s ) ;
-
- return true ;
-}
-
-var opener;
-function tryLoad()
-{
- opener = window.parent;
-
- // get access to global parameters
- var oParams = window.opener.oldFramesetPageParams;
-
- // make frameset rows string prepare
- var sFramesetRows = ( parseInt( oParams.firstframeh, 10 ) || '30') + ",*," + ( parseInt( oParams.thirdframeh, 10 ) || '150' ) + ',0' ;
- document.getElementById( 'itFrameset' ).rows = sFramesetRows ;
-
- // dynamic including init frames and crossdomain transport code
- // from config sproxy_js_frameset url
- var addScriptUrl = oParams.sproxy_js_frameset ;
- doLoadScript( addScriptUrl ) ;
-}
-
- </script>
-</head>
-
-<frameset id="itFrameset" onload="tryLoad();" border="0" rows="30,*,*,0">
- <frame scrolling="no" framespacing="0" frameborder="0" noresize="noresize" marginheight="0" marginwidth="2" src="" name="navbar"></frame>
- <frame scrolling="auto" framespacing="0" frameborder="0" noresize="noresize" marginheight="0" marginwidth="0" src="" name="mid"></frame>
- <frame scrolling="no" framespacing="0" frameborder="0" noresize="noresize" marginheight="1" marginwidth="1" src="" name="bot"></frame>
- <frame scrolling="no" framespacing="0" frameborder="0" noresize="noresize" marginheight="1" marginwidth="1" src="" name="spellsuggestall"></frame>
-</frameset>
-</html>
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
+<!--
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+-->
+<html>
+<head>
+ <title></title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ <script type="text/javascript">
+
+function doLoadScript( url )
+{
+ if ( !url )
+ return false ;
+
+ var s = document.createElement( "script" ) ;
+ s.type = "text/javascript" ;
+ s.src = url ;
+ document.getElementsByTagName( "head" )[ 0 ].appendChild( s ) ;
+
+ return true ;
+}
+
+var opener;
+function tryLoad()
+{
+ opener = window.parent;
+
+ // get access to global parameters
+ var oParams = window.opener.oldFramesetPageParams;
+
+ // make frameset rows string prepare
+ var sFramesetRows = ( parseInt( oParams.firstframeh, 10 ) || '30') + ",*," + ( parseInt( oParams.thirdframeh, 10 ) || '150' ) + ',0' ;
+ document.getElementById( 'itFrameset' ).rows = sFramesetRows ;
+
+ // dynamic including init frames and crossdomain transport code
+ // from config sproxy_js_frameset url
+ var addScriptUrl = oParams.sproxy_js_frameset ;
+ doLoadScript( addScriptUrl ) ;
+}
+
+ </script>
+</head>
+
+<frameset id="itFrameset" onload="tryLoad();" border="0" rows="30,*,*,0">
+ <frame scrolling="no" framespacing="0" frameborder="0" noresize="noresize" marginheight="0" marginwidth="2" src="" name="navbar"></frame>
+ <frame scrolling="auto" framespacing="0" frameborder="0" noresize="noresize" marginheight="0" marginwidth="0" src="" name="mid"></frame>
+ <frame scrolling="no" framespacing="0" frameborder="0" noresize="noresize" marginheight="1" marginwidth="1" src="" name="bot"></frame>
+ <frame scrolling="no" framespacing="0" frameborder="0" noresize="noresize" marginheight="1" marginwidth="1" src="" name="spellsuggestall"></frame>
+</frameset>
+</html>
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/wsc/dialogs/wsc.css b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/wsc/dialogs/wsc.css
index 74dd4e1..dfc326e 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/wsc/dialogs/wsc.css
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/wsc/dialogs/wsc.css
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-html,body{background-color:transparent;margin:0;padding:0;}body{padding:10px;}body,td,input,select,textarea{font-size:11px;font-family:'Microsoft Sans Serif',Arial,Helvetica,Verdana;}.midtext{padding:0;margin:10px;}.midtext p{padding:0;margin:10px;}.Button{border:#737357 1px solid;color:#3b3b1f;background-color:#c7c78f;}.PopupTabArea{color:#737357;background-color:#e3e3c7;}.PopupTitleBorder{border-bottom:#d5d59d 1px solid;}.PopupTabEmptyArea{padding-left:10px;border-bottom:#d5d59d 1px solid;}.PopupTab,.PopupTabSelected{border-right:#d5d59d 1px solid;border-top:#d5d59d 1px solid;border-left:#d5d59d 1px solid;padding:3px 5px 3px 5px;color:#737357;}.PopupTab{margin-top:1px;border-bottom:#d5d59d 1px solid;cursor:pointer;}.PopupTabSelected{font-weight:bold;cursor:default;padding-top:4px;border-bottom:#f1f1e3 1px solid;background-color:#f1f1e3;}
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+html,body{background-color:transparent;margin:0;padding:0;}body{padding:10px;}body,td,input,select,textarea{font-size:11px;font-family:'Microsoft Sans Serif',Arial,Helvetica,Verdana;}.midtext{padding:0;margin:10px;}.midtext p{padding:0;margin:10px;}.Button{border:#737357 1px solid;color:#3b3b1f;background-color:#c7c78f;}.PopupTabArea{color:#737357;background-color:#e3e3c7;}.PopupTitleBorder{border-bottom:#d5d59d 1px solid;}.PopupTabEmptyArea{padding-left:10px;border-bottom:#d5d59d 1px solid;}.PopupTab,.PopupTabSelected{border-right:#d5d59d 1px solid;border-top:#d5d59d 1px solid;border-left:#d5d59d 1px solid;padding:3px 5px 3px 5px;color:#737357;}.PopupTab{margin-top:1px;border-bottom:#d5d59d 1px solid;cursor:pointer;}.PopupTabSelected{font-weight:bold;cursor:default;padding-top:4px;border-bottom:#f1f1e3 1px solid;background-color:#f1f1e3;}
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/wsc/dialogs/wsc.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/wsc/dialogs/wsc.js
index 8ca567b..e9d7850 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/wsc/dialogs/wsc.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/wsc/dialogs/wsc.js
@@ -1,7 +1,7 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.dialog.add('checkspell',function(a){var b=CKEDITOR.tools.getNextNumber(),c='cke_frame_'+b,d='cke_data_'+b,e='cke_error_'+b,f,g=document.location.protocol||'http:',h=a.lang.spellCheck.notAvailable,i='<textarea style="display: none" id="'+d+'"'+' rows="10"'+' cols="40">'+' </textarea><div'+' id="'+e+'"'+' style="display:none;color:red;font-size:16px;font-weight:bold;padding-top:160px;text-align:center;z-index:11;">'+'</div><iframe'+' src=""'+' style="width:100%;background-color:#f1f1e3;"'+' frameborder="0"'+' name="'+c+'"'+' id="'+c+'"'+' allowtransparency="1">'+'</iframe>',j=a.config.wsc_customLoaderScript||g+'//loader.webspellchecker.net/sproxy_fck/sproxy.php'+'?plugin=fck2'+'&customerid='+a.config.wsc_customerId+'&cmd=script&doc=wsc&schema=22';if(a.config.wsc_customLoaderScript)h+='<p style="color:#000;font-size:11px;font-weight: normal;text-align:center;padding-top:10px">'+a.lang.spellCheck.errorLoading.replace(/%s/g,a.config.wsc_customLoaderScript)+'</p>';function k(m,n){var o=0;return function(){if(typeof window.doSpell=='function'){if(typeof f!='undefined')window.clearInterval(f);l(m);}else if(o++==180)window._cancelOnError(n);};};window._cancelOnError=function(m){if(typeof window.WSC_Error=='undefined'){CKEDITOR.document.getById(c).setStyle('display','none');var n=CKEDITOR.document.getById(e);n.setStyle('display','block');n.setHtml(m||a.lang.spellCheck.notAvailable);}};function l(m){var n=new window._SP_FCK_LangCompare(),o=CKEDITOR.getUrl(a.plugins.wsc.path+'dialogs/'),p=o+'tmpFrameset.html';window.gFCKPluginName='wsc';n.setDefaulLangCode(a.config.defaultLanguage);window.doSpell({ctrl:d,lang:a.config.wsc_lang||n.getSPLangCode(a.langCode),intLang:a.config.wsc_uiLang||n.getSPLangCode(a.langCode),winType:c,onCancel:function(){m.hide();},onFinish:function(q){a.focus();m.getParentEditor().setData(q.value);m.hide();},staticFrame:p,framesetPath:p,iframePath:o+'ciframe.html',schemaURI:o+'wsc.css',userDictionaryName:a.config.wsc_userDictionaryName,customDictionaryName:a.config.wsc_customDictionaryIds&&a.config.wsc_customDictionaryIds.split(','),domainName:a.config.wsc_domainName});CKEDITOR.document.getById(e).setStyle('display','none');CKEDITOR.document.getById(c).setStyle('display','block');};return{title:a.config.wsc_dialogTitle||a.lang.spellCheck.title,minWidth:485,minHeight:380,buttons:[CKEDITOR.dialog.cancelButton],onShow:function(){var m=this.getContentElement('general','content').getElement();m.setHtml(i);m.getChild(2).setStyle('height',this._.contentSize.height+'px');
-if(typeof window.doSpell!='function')CKEDITOR.document.getHead().append(CKEDITOR.document.createElement('script',{attributes:{type:'text/javascript',src:j}}));var n=a.getData();CKEDITOR.document.getById(d).setValue(n);f=window.setInterval(k(this,h),250);},onHide:function(){window.ooo=undefined;window.int_framsetLoaded=undefined;window.framesetLoaded=undefined;window.is_window_opened=false;},contents:[{id:'general',label:a.config.wsc_dialogTitle||a.lang.spellCheck.title,padding:0,elements:[{type:'html',id:'content',html:''}]}]};});CKEDITOR.dialog.on('resize',function(a){var b=a.data,c=b.dialog;if(c._.name=='checkspell'){var d=c.getContentElement('general','content').getElement(),e=d&&d.getChild(2);e&&e.setSize('height',b.height);e&&e.setSize('width',b.width);}});
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.dialog.add('checkspell',function(a){var b=CKEDITOR.tools.getNextNumber(),c='cke_frame_'+b,d='cke_data_'+b,e='cke_error_'+b,f,g=document.location.protocol||'http:',h=a.lang.spellCheck.notAvailable,i='<textarea style="display: none" id="'+d+'"'+' rows="10"'+' cols="40">'+' </textarea><div'+' id="'+e+'"'+' style="display:none;color:red;font-size:16px;font-weight:bold;padding-top:160px;text-align:center;z-index:11;">'+'</div><iframe'+' src=""'+' style="width:100%;background-color:#f1f1e3;"'+' frameborder="0"'+' name="'+c+'"'+' id="'+c+'"'+' allowtransparency="1">'+'</iframe>',j=a.config.wsc_customLoaderScript||g+'//loader.webspellchecker.net/sproxy_fck/sproxy.php'+'?plugin=fck2'+'&customerid='+a.config.wsc_customerId+'&cmd=script&doc=wsc&schema=22';if(a.config.wsc_customLoaderScript)h+='<p style="color:#000;font-size:11px;font-weight: normal;text-align:center;padding-top:10px">'+a.lang.spellCheck.errorLoading.replace(/%s/g,a.config.wsc_customLoaderScript)+'</p>';function k(m,n){var o=0;return function(){if(typeof window.doSpell=='function'){if(typeof f!='undefined')window.clearInterval(f);l(m);}else if(o++==180)window._cancelOnError(n);};};window._cancelOnError=function(m){if(typeof window.WSC_Error=='undefined'){CKEDITOR.document.getById(c).setStyle('display','none');var n=CKEDITOR.document.getById(e);n.setStyle('display','block');n.setHtml(m||a.lang.spellCheck.notAvailable);}};function l(m){var n=new window._SP_FCK_LangCompare(),o=CKEDITOR.getUrl(a.plugins.wsc.path+'dialogs/'),p=o+'tmpFrameset.html';window.gFCKPluginName='wsc';n.setDefaulLangCode(a.config.defaultLanguage);window.doSpell({ctrl:d,lang:a.config.wsc_lang||n.getSPLangCode(a.langCode),intLang:a.config.wsc_uiLang||n.getSPLangCode(a.langCode),winType:c,onCancel:function(){m.hide();},onFinish:function(q){a.focus();m.getParentEditor().setData(q.value);m.hide();},staticFrame:p,framesetPath:p,iframePath:o+'ciframe.html',schemaURI:o+'wsc.css',userDictionaryName:a.config.wsc_userDictionaryName,customDictionaryName:a.config.wsc_customDictionaryIds&&a.config.wsc_customDictionaryIds.split(','),domainName:a.config.wsc_domainName});CKEDITOR.document.getById(e).setStyle('display','none');CKEDITOR.document.getById(c).setStyle('display','block');};return{title:a.config.wsc_dialogTitle||a.lang.spellCheck.title,minWidth:485,minHeight:380,buttons:[CKEDITOR.dialog.cancelButton],onShow:function(){var m=this.getContentElement('general','content').getElement();m.setHtml(i);m.getChild(2).setStyle('height',this._.contentSize.height+'px');
+if(typeof window.doSpell!='function')CKEDITOR.document.getHead().append(CKEDITOR.document.createElement('script',{attributes:{type:'text/javascript',src:j}}));var n=a.getData();CKEDITOR.document.getById(d).setValue(n);f=window.setInterval(k(this,h),250);},onHide:function(){window.ooo=undefined;window.int_framsetLoaded=undefined;window.framesetLoaded=undefined;window.is_window_opened=false;},contents:[{id:'general',label:a.config.wsc_dialogTitle||a.lang.spellCheck.title,padding:0,elements:[{type:'html',id:'content',html:''}]}]};});CKEDITOR.dialog.on('resize',function(a){var b=a.data,c=b.dialog;if(c._.name=='checkspell'){var d=c.getContentElement('general','content').getElement(),e=d&&d.getChild(2);e&&e.setSize('height',b.height);e&&e.setSize('width',b.width);}});
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/xml/plugin.js b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/xml/plugin.js
index d1dc6a2..e27371d 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/xml/plugin.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/plugins/xml/plugin.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-(function(){CKEDITOR.plugins.add('xml',{});CKEDITOR.xml=function(a){var b=null;if(typeof a=='object')b=a;else{var c=(a||'').replace(/ /g,'\xa0');if(window.DOMParser)b=new DOMParser().parseFromString(c,'text/xml');else if(window.ActiveXObject){try{b=new ActiveXObject('MSXML2.DOMDocument');}catch(d){try{b=new ActiveXObject('Microsoft.XmlDom');}catch(d){}}if(b){b.async=false;b.resolveExternals=false;b.validateOnParse=false;b.loadXML(c);}}}this.baseXml=b;};CKEDITOR.xml.prototype={selectSingleNode:function(a,b){var c=this.baseXml;if(b||(b=c))if(CKEDITOR.env.ie||b.selectSingleNode)return b.selectSingleNode(a);else if(c.evaluate){var d=c.evaluate(a,b,null,9,null);return d&&d.singleNodeValue||null;}return null;},selectNodes:function(a,b){var c=this.baseXml,d=[];if(b||(b=c))if(CKEDITOR.env.ie||b.selectNodes)return b.selectNodes(a);else if(c.evaluate){var e=c.evaluate(a,b,null,5,null);if(e){var f;while(f=e.iterateNext())d.push(f);}}return d;},getInnerXml:function(a,b){var c=this.selectSingleNode(a,b),d=[];if(c){c=c.firstChild;while(c){if(c.xml)d.push(c.xml);else if(window.XMLSerializer)d.push(new XMLSerializer().serializeToString(c));c=c.nextSibling;}}return d.length?d.join(''):null;}};})();
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+(function(){CKEDITOR.plugins.add('xml',{});CKEDITOR.xml=function(a){var b=null;if(typeof a=='object')b=a;else{var c=(a||'').replace(/ /g,'\xa0');if(window.DOMParser)b=new DOMParser().parseFromString(c,'text/xml');else if(window.ActiveXObject){try{b=new ActiveXObject('MSXML2.DOMDocument');}catch(d){try{b=new ActiveXObject('Microsoft.XmlDom');}catch(d){}}if(b){b.async=false;b.resolveExternals=false;b.validateOnParse=false;b.loadXML(c);}}}this.baseXml=b;};CKEDITOR.xml.prototype={selectSingleNode:function(a,b){var c=this.baseXml;if(b||(b=c))if(CKEDITOR.env.ie||b.selectSingleNode)return b.selectSingleNode(a);else if(c.evaluate){var d=c.evaluate(a,b,null,9,null);return d&&d.singleNodeValue||null;}return null;},selectNodes:function(a,b){var c=this.baseXml,d=[];if(b||(b=c))if(CKEDITOR.env.ie||b.selectNodes)return b.selectNodes(a);else if(c.evaluate){var e=c.evaluate(a,b,null,5,null);if(e){var f;while(f=e.iterateNext())d.push(f);}}return d;},getInnerXml:function(a,b){var c=this.selectSingleNode(a,b),d=[];if(c){c=c.firstChild;while(c){if(c.xml)d.push(c.xml);else if(window.XMLSerializer)d.push(new XMLSerializer().serializeToString(c));c=c.nextSibling;}}return d.length?d.join(''):null;}};})();
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/skins/kama/dialog.css b/sm-shop/src/main/webapp/resources/js/ckeditor/skins/kama/dialog.css
index 0ce353e..eabc7a5 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/skins/kama/dialog.css
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/skins/kama/dialog.css
@@ -1,10 +1,10 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-body .cke_dialog{visibility:visible;}.cke_skin_kama table.cke_dialog.cke_browser_gecko{display:block;}.cke_skin_kama .cke_dialog_body{z-index:1;border:solid 1px #ddd;padding:5px;background-color:#fff;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;_position:static;}.cke_skin_kama .cke_dialog_tl,.cke_skin_kama .cke_dialog_tr,.cke_skin_kama .cke_dialog_tc,.cke_skin_kama .cke_dialog_bl,.cke_skin_kama .cke_dialog_br,.cke_skin_kama .cke_dialog_bc,.cke_skin_kama .cke_dialog_ml,.cke_skin_kama .cke_dialog_mr{display:none;}.cke_skin_kama .cke_dialog_title{font-weight:bold;font-size:14px;padding:3px 3px 8px;cursor:move;position:relative;border-bottom:1px solid #eee;}.cke_skin_kama .cke_browser_iequirks .cke_dialog_title,.cke_skin_kama .cke_browser_ie6 .cke_dialog_title,.cke_skin_kama .cke_browser_ie7 .cke_dialog_title{margin-bottom:22px;}.cke_skin_kama .cke_browser_iequirks.cke_single_page .cke_dialog_title,.cke_skin_kama .cke_browser_ie6.cke_single_page .cke_dialog_title,.cke_skin_kama .cke_browser_ie7.cke_single_page .cke_dialog_title{margin-bottom:10px;}.cke_skin_kama .cke_dialog_contents{background-color:#ebebeb;border:solid 1px #fff;border-bottom:none;overflow:auto;padding:17px 10px 5px 10px;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px;-webkit-border-top-left-radius:5px;-webkit-border-top-right-radius:5px;border-top-left-radius:5px;border-top-right-radius:5px;margin-top:22px;}.cke_skin_kama .cke_dialog_footer{text-align:right;background-color:#ebebeb;border:solid 1px #fff;border-bottom:none;-moz-border-radius-bottomleft:5px;-moz-border-radius-bottomright:5px;-webkit-border-bottom-left-radius:5px;-webkit-border-bottom-right-radius:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;}.cke_skin_kama .cke_rtl .cke_dialog_footer{text-align:left;}.cke_skin_kama .cke_dialog_footer .cke_resizer{margin-top:20px;}.cke_skin_kama .cke_browser_iequirks .cke_dialog_footer .cke_resizer,.cke_skin_kama .cke_browser_ie6 .cke_dialog_footer .cke_resizer{margin-top:27px;}.cke_skin_kama .cke_dialog_tabs{height:23px;display:inline-block;_display:block;margin-left:10px;margin-right:10px;margin-top:11px;position:absolute;z-index:2;}.cke_skin_kama .cke_browser_iequirks .cke_dialog_tabs,.cke_skin_kama .cke_browser_ie6 .cke_dialog_tabs,.cke_skin_kama .cke_browser_ie7 .cke_dialog_tabs{top:33px;}.cke_skin_kama .cke_rtl .cke_dialog_tabs{right:10px;}.cke_skin_kama a.cke_dialog_tab,.cke_skin_kama a:link.cke_dialog_tab,.cke_skin_kama a:active.cke_dialog_tab,.cke_skin_kama a:hover.cke_dialog_tab,.cke_skin_kama a:visited.cke_dialog_tab{background-image:url(images/sprites.png);background-repeat:repeat-x;background-position:0 -1323px;background-color:#ebebeb;height:14px;padding:4px 8px;display:inline-block;cursor:pointer;}.cke_skin_kama .cke_browser_gecko18 a.cke_dialog_tab,.cke_skin_kama .cke_browser_gecko18 a:link.cke_dialog_tab,.cke_skin_kama .cke_browser_gecko18 a:active.cke_dialog_tab,.cke_skin_kama .cke_browser_gecko18 a:hover.cke_dialog_tab,.cke_skin_kama .cke_browser_gecko18 a:visited.cke_dialog_tab{display:inline;position:relative;top:6px;}.cke_skin_kama a:hover.cke_dialog_tab{background-color:#f1f1e3;}.cke_skin_kama .cke_hc a:hover.cke_dialog_tab{padding:2px 6px!important;border-width:3px;}.cke_skin_kama a.cke_dialog_tab_selected,.cke_skin_kama a:link.cke_dialog_tab_selected,.cke_skin_kama a:active.cke_dialog_tab_selected,.cke_skin_kama a:hover.cke_dialog_tab_selected,.cke_skin_kama a:visited.cke_dialog_tab_selected{background-position:0 -1279px;cursor:default;}.cke_skin_kama .cke_hc a.cke_dialog_tab_selected,.cke_skin_kama .cke_hc a:link.cke_dialog_tab_selected,.cke_skin_kama .cke_hc a:active.cke_dialog_tab_selected,.cke_skin_kama .cke_hc a:hover.cke_dialog_tab_selected,.cke_skin_kama .cke_hc a:visited.cke_dialog_tab_selected{padding:2px 6px!important;border-width:3px;}.cke_skin_kama .cke_single_page .cke_dialog_tabs{display:none;}.cke_skin_kama .cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:10px;}.cke_skin_kama .cke_dialog_ui_vbox table,.cke_skin_kama .cke_dialog_ui_hbox table{margin:auto;}
-.cke_skin_kama .cke_dialog_ui_vbox_child{padding:5px 0;}.cke_skin_kama input.cke_dialog_ui_input_text,.cke_skin_kama input.cke_dialog_ui_input_password{background-color:white;border:none;padding:0;width:100%;height:14px;}.cke_skin_kama div.cke_dialog_ui_input_text,.cke_skin_kama div.cke_dialog_ui_input_password{background-color:white;border:1px solid #a0a0a0;padding:1px 0;_width:99.9%;}.cke_skin_kama .cke_browser_ie7 input.cke_dialog_ui_input_text,.cke_skin_kama .cke_browser_ie7 input.cke_dialog_ui_input_password{position:absolute;}.cke_skin_kama .cke_browser_ie7 div.cke_dialog_ui_input_text,.cke_skin_kama .cke_browser_ie7 div.cke_dialog_ui_input_password{height:14px;position:relative;}.cke_skin_kama .cke_browser_ie.cke_rtl input.cke_dialog_ui_input_text,.cke_skin_kama .cke_browser_opera.cke_rtl input.cke_dialog_ui_input_text,.cke_skin_kama .cke_browser_ie.cke_rtl input.cke_dialog_ui_input_password,.cke_skin_kama .cke_browser_opera.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px;}.cke_skin_kama .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_text,.cke_skin_kama .cke_browser_opera.cke_rtl div.cke_dialog_ui_input_text,.cke_skin_kama .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_password,.cke_skin_kama .cke_browser_opera.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px;}.cke_skin_kama .cke_browser_ie.cke_rtl .cke_dialog_ui_vbox_child,.cke_skin_kama .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_child,.cke_skin_kama .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_first,.cke_skin_kama .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important;}.cke_skin_kama .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px;}.cke_skin_kama .cke_browser_gecko.cke_hc div.cke_dialog_ui_input_text,.cke_skin_kama .cke_browser_gecko.cke_hc div.cke_dialog_ui_input_password{border-width:0;}.cke_skin_kama .cke_browser_gecko18.cke_hc div.cke_dialog_ui_input_text,.cke_skin_kama .cke_browser_gecko18.cke_hc div.cke_dialog_ui_input_password{border-width:1px;}.cke_skin_kama textarea.cke_dialog_ui_input_textarea{background-color:white;border:none;padding:0;width:100%;_width:99%;overflow:auto;resize:none;}.cke_skin_kama div.cke_dialog_ui_input_textarea{background-color:white;border:1px solid #a0a0a0;padding:1px 0;}.cke_skin_kama div.cke_disabled .cke_dialog_ui_labeled_content *{background-color:#a0a0a0;cursor:default;}.cke_skin_kama .cke_rtl .cke_dialog_ui_labeled_content{_width:95%;}.cke_skin_kama .cke_dialog_ui_hbox{width:100%;}.cke_skin_kama .cke_dialog_ui_hbox_first,.cke_skin_kama .cke_dialog_ui_hbox_child,.cke_skin_kama .cke_dialog_ui_hbox_last{vertical-align:top;}.cke_skin_kama .cke_ltr .cke_dialog_ui_hbox_first,.cke_skin_kama .cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px;}.cke_skin_kama .cke_rtl .cke_dialog_ui_hbox_first,.cke_skin_kama .cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px;}.cke_skin_kama a.cke_dialog_ui_button{border-collapse:separate;cursor:default;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:transparent url(images/sprites.png) repeat-x scroll 0 -1069px;_background:none;padding:5px 0;text-align:center;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button{padding:0;}.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button span{width:70px;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button span{width:100px;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button span{padding:5px 15px;text-align:center;color:#3b3b1f;background:#53D9F0 none;display:inline-block;cursor:default;}.cke_skin_kama .cke_browser_webkit a.cke_dialog_ui_button span.cke_dialog_ui_button{margin:0;}.cke_skin_kama .cke_browser_webkit a.cke_dialog_ui_button{display:inline-block;padding-top:3px;padding-bottom:2px;margin:2px 0;}.cke_skin_kama a.cke_dialog_ui_button_ok span,.cke_skin_kama a.cke_dialog_ui_button_cancel span{width:60px;padding-right:20px;padding-left:20px;}.cke_skin_kama a.cke_dialog_ui_button_ok{background-position:0 -1143px;}
-.cke_skin_kama a.cke_dialog_ui_button_ok span{background:transparent url(images/sprites.png) no-repeat scroll right -1219px;}.cke_skin_kama .cke_rtl a.cke_dialog_ui_button_ok span{background-position:left -1219px;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button_ok span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button_ok span{background-color:#B8E834;margin-right:0;}.cke_skin_kama a.cke_dialog_ui_button_cancel{background-position:0 -1104px;}.cke_skin_kama a.cke_dialog_ui_button_cancel span{background:transparent url(images/sprites.png) no-repeat scroll right -1245px;}.cke_skin_kama .cke_rtl a.cke_dialog_ui_button_cancel span{background-position:left -1245px;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button_cancel span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button_cancel span{background-color:#F65D20;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button_cancel span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button_cancel span,.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button_ok span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button_ok span{background-image:none;}.cke_skin_kama span.cke_dialog_ui_button{padding:2px 10px;text-align:center;color:#222;display:inline-block;cursor:default;min-width:60px;+margin:2px 0;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons span.cke_dialog_ui_button{display:block;}.cke_skin_kama a.cke_dialog_ui_button span.cke_disabled{border:#898980 1px solid;color:#5e5e55;background-color:#c5c5b3;}.cke_skin_kama a:hover.cke_dialog_ui_button,.cke_skin_kama a:focus.cke_dialog_ui_button,.cke_skin_kama a:active.cke_dialog_ui_button{background-position:0 -1180px;}.cke_skin_kama .cke_hc a:hover.cke_dialog_ui_button,.cke_skin_kama .cke_hc a:focus.cke_dialog_ui_button,.cke_skin_kama .cke_hc a:active.cke_dialog_ui_button{border-width:2px;}.cke_skin_kama .cke_browser_iequirks a:hover.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_iequirks a:focus.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_iequirks a:active.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_ie6 a:hover.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_ie6 a:focus.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_ie6 a:active.cke_dialog_ui_button span{background-image:none;background:#F7A922;}.cke_skin_kama .cke_dialog_footer_buttons{display:inline-table;margin-right:12px;margin-left:12px;width:auto;position:relative;}.cke_skin_kama .cke_browser_ie7 .cke_dialog_footer_buttons{position:static;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons{display:inline;}.cke_skin_kama .cke_dialog_footer_buttons span.cke_dialog_ui_button{margin:7px 0;text-align:center;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons a.cke_dialog_ui_button{display:block;padding:0;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons span.cke_dialog_ui_button{padding-bottom:5px;padding-top:6px;margin-bottom:0;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons .cke_dialog_ui_button_ok .cke_dialog_ui_button{background-position:right -1214px;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons .cke_dialog_ui_button_cancel .cke_dialog_ui_button{background-position:right -1242px;}.cke_skin_kama .cke_browser_ie9.cke_rtl .cke_dialog_footer_buttons td{padding-left:2px;}.cke_skin_kama strong{font-weight:bold;}.cke_skin_kama .cke_dialog .cke_dialog_body .cke_dialog_close_button{background-image:url(images/sprites.png);background-repeat:no-repeat;background-position:0 -1022px;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;_background-image:url(images/sprites_ie6.png);}.cke_skin_kama .cke_dialog_close_button span{display:none;}.cke_skin_kama .cke_dialog_close_button:hover{background-position:0 -1045px;}.cke_skin_kama .cke_ltr .cke_dialog_close_button{right:10px;}.cke_skin_kama .cke_browser_ie8.cke_rtl .cke_dialog_close_button{left:8px;}.cke_skin_kama .cke_rtl .cke_dialog_close_button{left:10px;}.cke_skin_kama .cke_browser_ie7.cke_rtl .cke_dialog_close_button{left:16px;top:0;}.cke_skin_kama .cke_browser_ie7.cke_rtl .cke_dialog_close_button{position:absolute;left:10px;top:5px;}
-.cke_skin_kama .cke_browser_ie7.cke_single_page .cke_dialog_footer{margin-top:22px;}.cke_skin_kama .cke_browser_ie6 .cke_dialog_close_button,.cke_skin_kama .cke_browser_iequirks .cke_dialog_close_button{top:7px;}.cke_skin_kama .cke_browser_ie7.cke_ltr .cke_dialog_close_button{margin-top:0;}.cke_skin_kama .cke_dialog_ui_input_select{border:1px solid #a0a0a0;background-color:white;}.cke_skin_kama .cke_dialog_ui_input_file{width:100%;height:25px;}.cke_skin_kama .cke_dialog .cke_dark_background{background-color:#eaead1;}.cke_skin_kama .cke_dialog .cke_hand{cursor:pointer;}.cke_skin_kama .cke_dialog .cke_centered{text-align:center;}.cke_skin_kama .cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px;}.cke_skin_kama .cke_rtl .cke_dialog a.cke_btn_reset{float:left;}.cke_skin_kama .cke_dialog a.cke_btn_locked,.cke_skin_kama .cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px;}.cke_skin_kama .cke_dialog a.cke_btn_locked .cke_icon{display:none;}.cke_skin_kama .cke_rtl .cke_dialog a.cke_btn_locked,.cke_skin_kama .cke_rtl .cke_dialog a.cke_btn_unlocked{float:right;}.cke_skin_kama .cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.gif);}.cke_skin_kama .cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer;}.cke_skin_kama .cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white;}.cke_skin_kama .cke_dialog .ImagePreviewBox table td{white-space:normal;}.cke_skin_kama .cke_browser_iequirks .cke_dialog_page_contents{_position:absolute;}.cke_skin_kama .cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity=90);background-color:#e4e4e4;}.cke_skin_kama .cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white;}.cke_skin_kama .cke_dialog .cke_pastetext{width:346px;height:170px;}.cke_skin_kama .cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none;}.cke_skin_kama .cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid black;}.cke_skin_kama .cke_dialog .cke_dark_background{text-align:center;background-color:#eaead1;font-size:14px;}.cke_skin_kama .cke_dialog .cke_light_background{text-align:center;background-color:#ffffbe;}.cke_skin_kama .cke_dialog .cke_hand{cursor:pointer;}.cke_skin_kama .cke_disabled{color:#a0a0a0;}.cke_skin_kama .cke_hc .cke_dialog_title,.cke_skin_kama .cke_hc .cke_dialog_tabs,.cke_skin_kama .cke_hc .cke_dialog_contents,.cke_skin_kama .cke_hc .cke_dialog_footer{border-left:1px solid;border-right:1px solid;}.cke_skin_kama .cke_hc .cke_dialog_title{border-top:1px solid;}.cke_skin_kama .cke_hc .cke_dialog_footer{border-bottom:1px solid;}.cke_skin_kama .cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px;}.cke_skin_kama .cke_dialog_body .cke_label{display:none;}.cke_skin_kama .cke_dialog_body label.cke_required{font-weight:bold;}.cke_skin_kama .cke_hc .cke_dialog_body .cke_label{display:inline;cursor:inherit;}.cke_skin_kama .cke_hc a.cke_btn_locked,.cke_skin_kama .cke_hc a.cke_btn_unlocked,.cke_skin_kama .cke_hc a.cke_btn_reset{border-style:solid;float:left;width:auto;height:auto;padding:0 2px;}.cke_skin_kama .cke_rtl.cke_hc a.cke_btn_locked,.cke_skin_kama .cke_rtl.cke_hc a.cke_btn_unlocked,.cke_skin_kama .cke_rtl.cke_hc a.cke_btn_reset{float:right;}.cke_skin_kama .cke_hc a.cke_btn_locked .cke_icon{display:inline;}.cke_skin_kama a.cke_smile img{border:2px solid #eaead1;}.cke_skin_kama a.cke_smile:focus img,.cke_skin_kama a.cke_smile:active img,.cke_skin_kama a.cke_smile:hover img{border-color:#C7C78F;}.cke_skin_kama .cke_hc .cke_dialog_tabs a,.cke_skin_kama .cke_hc .cke_dialog_footer a{opacity:1.0;filter:alpha(opacity=100);border:1px solid white;}
-.cke_skin_kama .cke_hc .ImagePreviewBox{width:260px;}.cke_skin_kama .cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px;}.cke_skin_kama .cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px;}.cke_skin_kama .cke_browser_gecko .cke_dialog_ui_checkbox_input:focus,.cke_skin_kama .cke_browser_gecko .cke_dialog_ui_radio_input:focus,.cke_skin_kama .cke_browser_opera .cke_dialog_ui_checkbox_input:focus,.cke_skin_kama .cke_browser_opera .cke_dialog_ui_radio_input:focus,.cke_skin_kama .cke_browser_gecko .cke_dialog_ui_input_select:focus,.cke_skin_kama .cke_browser_gecko .cke_btn_over,.cke_skin_kama .cke_browser_opera .cke_btn_over,.cke_skin_kama .cke_browser_ie .cke_btn_over{outline:1px dotted #696969;}.cke_skin_kama .cke_browser_ie .cke_dialog_ui_checkbox_input,.cke_skin_kama .cke_browser_ie .cke_dialog_ui_ratio_input,.cke_skin_kama .cke_browser_ie .cke_btn_reset,.cke_skin_kama .cke_browser_ie .cke_btn_locked,.cke_skin_kama .cke_browser_ie .cke_btn_unlocked{*border:1px solid transparent!important;-border:1px solid red!important;-filter:chroma(color=red);}.cke_skin_kama .cke_browser_ie .cke_dialog_ui_focused,.cke_skin_kama .cke_browser_ie .cke_btn_over{*border:1px dotted #696969!important;}.cke_skin_kama .cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity=0);width:100%;height:100%;}.cke_dialog label{display:inline;margin-bottom:auto;cursor:default;}
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+body .cke_dialog{visibility:visible;}.cke_skin_kama table.cke_dialog.cke_browser_gecko{display:block;}.cke_skin_kama .cke_dialog_body{z-index:1;border:solid 1px #ddd;padding:5px;background-color:#fff;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;_position:static;}.cke_skin_kama .cke_dialog_tl,.cke_skin_kama .cke_dialog_tr,.cke_skin_kama .cke_dialog_tc,.cke_skin_kama .cke_dialog_bl,.cke_skin_kama .cke_dialog_br,.cke_skin_kama .cke_dialog_bc,.cke_skin_kama .cke_dialog_ml,.cke_skin_kama .cke_dialog_mr{display:none;}.cke_skin_kama .cke_dialog_title{font-weight:bold;font-size:14px;padding:3px 3px 8px;cursor:move;position:relative;border-bottom:1px solid #eee;}.cke_skin_kama .cke_browser_iequirks .cke_dialog_title,.cke_skin_kama .cke_browser_ie6 .cke_dialog_title,.cke_skin_kama .cke_browser_ie7 .cke_dialog_title{margin-bottom:22px;}.cke_skin_kama .cke_browser_iequirks.cke_single_page .cke_dialog_title,.cke_skin_kama .cke_browser_ie6.cke_single_page .cke_dialog_title,.cke_skin_kama .cke_browser_ie7.cke_single_page .cke_dialog_title{margin-bottom:10px;}.cke_skin_kama .cke_dialog_contents{background-color:#ebebeb;border:solid 1px #fff;border-bottom:none;overflow:auto;padding:17px 10px 5px 10px;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px;-webkit-border-top-left-radius:5px;-webkit-border-top-right-radius:5px;border-top-left-radius:5px;border-top-right-radius:5px;margin-top:22px;}.cke_skin_kama .cke_dialog_footer{text-align:right;background-color:#ebebeb;border:solid 1px #fff;border-bottom:none;-moz-border-radius-bottomleft:5px;-moz-border-radius-bottomright:5px;-webkit-border-bottom-left-radius:5px;-webkit-border-bottom-right-radius:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px;}.cke_skin_kama .cke_rtl .cke_dialog_footer{text-align:left;}.cke_skin_kama .cke_dialog_footer .cke_resizer{margin-top:20px;}.cke_skin_kama .cke_browser_iequirks .cke_dialog_footer .cke_resizer,.cke_skin_kama .cke_browser_ie6 .cke_dialog_footer .cke_resizer{margin-top:27px;}.cke_skin_kama .cke_dialog_tabs{height:23px;display:inline-block;_display:block;margin-left:10px;margin-right:10px;margin-top:11px;position:absolute;z-index:2;}.cke_skin_kama .cke_browser_iequirks .cke_dialog_tabs,.cke_skin_kama .cke_browser_ie6 .cke_dialog_tabs,.cke_skin_kama .cke_browser_ie7 .cke_dialog_tabs{top:33px;}.cke_skin_kama .cke_rtl .cke_dialog_tabs{right:10px;}.cke_skin_kama a.cke_dialog_tab,.cke_skin_kama a:link.cke_dialog_tab,.cke_skin_kama a:active.cke_dialog_tab,.cke_skin_kama a:hover.cke_dialog_tab,.cke_skin_kama a:visited.cke_dialog_tab{background-image:url(images/sprites.png);background-repeat:repeat-x;background-position:0 -1323px;background-color:#ebebeb;height:14px;padding:4px 8px;display:inline-block;cursor:pointer;}.cke_skin_kama .cke_browser_gecko18 a.cke_dialog_tab,.cke_skin_kama .cke_browser_gecko18 a:link.cke_dialog_tab,.cke_skin_kama .cke_browser_gecko18 a:active.cke_dialog_tab,.cke_skin_kama .cke_browser_gecko18 a:hover.cke_dialog_tab,.cke_skin_kama .cke_browser_gecko18 a:visited.cke_dialog_tab{display:inline;position:relative;top:6px;}.cke_skin_kama a:hover.cke_dialog_tab{background-color:#f1f1e3;}.cke_skin_kama .cke_hc a:hover.cke_dialog_tab{padding:2px 6px!important;border-width:3px;}.cke_skin_kama a.cke_dialog_tab_selected,.cke_skin_kama a:link.cke_dialog_tab_selected,.cke_skin_kama a:active.cke_dialog_tab_selected,.cke_skin_kama a:hover.cke_dialog_tab_selected,.cke_skin_kama a:visited.cke_dialog_tab_selected{background-position:0 -1279px;cursor:default;}.cke_skin_kama .cke_hc a.cke_dialog_tab_selected,.cke_skin_kama .cke_hc a:link.cke_dialog_tab_selected,.cke_skin_kama .cke_hc a:active.cke_dialog_tab_selected,.cke_skin_kama .cke_hc a:hover.cke_dialog_tab_selected,.cke_skin_kama .cke_hc a:visited.cke_dialog_tab_selected{padding:2px 6px!important;border-width:3px;}.cke_skin_kama .cke_single_page .cke_dialog_tabs{display:none;}.cke_skin_kama .cke_single_page .cke_dialog_contents{padding-top:5px;margin-top:10px;}.cke_skin_kama .cke_dialog_ui_vbox table,.cke_skin_kama .cke_dialog_ui_hbox table{margin:auto;}
+.cke_skin_kama .cke_dialog_ui_vbox_child{padding:5px 0;}.cke_skin_kama input.cke_dialog_ui_input_text,.cke_skin_kama input.cke_dialog_ui_input_password{background-color:white;border:none;padding:0;width:100%;height:14px;}.cke_skin_kama div.cke_dialog_ui_input_text,.cke_skin_kama div.cke_dialog_ui_input_password{background-color:white;border:1px solid #a0a0a0;padding:1px 0;_width:99.9%;}.cke_skin_kama .cke_browser_ie7 input.cke_dialog_ui_input_text,.cke_skin_kama .cke_browser_ie7 input.cke_dialog_ui_input_password{position:absolute;}.cke_skin_kama .cke_browser_ie7 div.cke_dialog_ui_input_text,.cke_skin_kama .cke_browser_ie7 div.cke_dialog_ui_input_password{height:14px;position:relative;}.cke_skin_kama .cke_browser_ie.cke_rtl input.cke_dialog_ui_input_text,.cke_skin_kama .cke_browser_opera.cke_rtl input.cke_dialog_ui_input_text,.cke_skin_kama .cke_browser_ie.cke_rtl input.cke_dialog_ui_input_password,.cke_skin_kama .cke_browser_opera.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px;}.cke_skin_kama .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_text,.cke_skin_kama .cke_browser_opera.cke_rtl div.cke_dialog_ui_input_text,.cke_skin_kama .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_password,.cke_skin_kama .cke_browser_opera.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px;}.cke_skin_kama .cke_browser_ie.cke_rtl .cke_dialog_ui_vbox_child,.cke_skin_kama .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_child,.cke_skin_kama .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_first,.cke_skin_kama .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important;}.cke_skin_kama .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px;}.cke_skin_kama .cke_browser_gecko.cke_hc div.cke_dialog_ui_input_text,.cke_skin_kama .cke_browser_gecko.cke_hc div.cke_dialog_ui_input_password{border-width:0;}.cke_skin_kama .cke_browser_gecko18.cke_hc div.cke_dialog_ui_input_text,.cke_skin_kama .cke_browser_gecko18.cke_hc div.cke_dialog_ui_input_password{border-width:1px;}.cke_skin_kama textarea.cke_dialog_ui_input_textarea{background-color:white;border:none;padding:0;width:100%;_width:99%;overflow:auto;resize:none;}.cke_skin_kama div.cke_dialog_ui_input_textarea{background-color:white;border:1px solid #a0a0a0;padding:1px 0;}.cke_skin_kama div.cke_disabled .cke_dialog_ui_labeled_content *{background-color:#a0a0a0;cursor:default;}.cke_skin_kama .cke_rtl .cke_dialog_ui_labeled_content{_width:95%;}.cke_skin_kama .cke_dialog_ui_hbox{width:100%;}.cke_skin_kama .cke_dialog_ui_hbox_first,.cke_skin_kama .cke_dialog_ui_hbox_child,.cke_skin_kama .cke_dialog_ui_hbox_last{vertical-align:top;}.cke_skin_kama .cke_ltr .cke_dialog_ui_hbox_first,.cke_skin_kama .cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px;}.cke_skin_kama .cke_rtl .cke_dialog_ui_hbox_first,.cke_skin_kama .cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px;}.cke_skin_kama a.cke_dialog_ui_button{border-collapse:separate;cursor:default;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:transparent url(images/sprites.png) repeat-x scroll 0 -1069px;_background:none;padding:5px 0;text-align:center;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button{padding:0;}.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button span{width:70px;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button span{width:100px;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button span{padding:5px 15px;text-align:center;color:#3b3b1f;background:#53D9F0 none;display:inline-block;cursor:default;}.cke_skin_kama .cke_browser_webkit a.cke_dialog_ui_button span.cke_dialog_ui_button{margin:0;}.cke_skin_kama .cke_browser_webkit a.cke_dialog_ui_button{display:inline-block;padding-top:3px;padding-bottom:2px;margin:2px 0;}.cke_skin_kama a.cke_dialog_ui_button_ok span,.cke_skin_kama a.cke_dialog_ui_button_cancel span{width:60px;padding-right:20px;padding-left:20px;}.cke_skin_kama a.cke_dialog_ui_button_ok{background-position:0 -1143px;}
+.cke_skin_kama a.cke_dialog_ui_button_ok span{background:transparent url(images/sprites.png) no-repeat scroll right -1219px;}.cke_skin_kama .cke_rtl a.cke_dialog_ui_button_ok span{background-position:left -1219px;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button_ok span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button_ok span{background-color:#B8E834;margin-right:0;}.cke_skin_kama a.cke_dialog_ui_button_cancel{background-position:0 -1104px;}.cke_skin_kama a.cke_dialog_ui_button_cancel span{background:transparent url(images/sprites.png) no-repeat scroll right -1245px;}.cke_skin_kama .cke_rtl a.cke_dialog_ui_button_cancel span{background-position:left -1245px;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button_cancel span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button_cancel span{background-color:#F65D20;}.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button_cancel span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button_cancel span,.cke_skin_kama .cke_browser_iequirks a.cke_dialog_ui_button_ok span,.cke_skin_kama .cke_browser_ie6 a.cke_dialog_ui_button_ok span{background-image:none;}.cke_skin_kama span.cke_dialog_ui_button{padding:2px 10px;text-align:center;color:#222;display:inline-block;cursor:default;min-width:60px;+margin:2px 0;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons span.cke_dialog_ui_button{display:block;}.cke_skin_kama a.cke_dialog_ui_button span.cke_disabled{border:#898980 1px solid;color:#5e5e55;background-color:#c5c5b3;}.cke_skin_kama a:hover.cke_dialog_ui_button,.cke_skin_kama a:focus.cke_dialog_ui_button,.cke_skin_kama a:active.cke_dialog_ui_button{background-position:0 -1180px;}.cke_skin_kama .cke_hc a:hover.cke_dialog_ui_button,.cke_skin_kama .cke_hc a:focus.cke_dialog_ui_button,.cke_skin_kama .cke_hc a:active.cke_dialog_ui_button{border-width:2px;}.cke_skin_kama .cke_browser_iequirks a:hover.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_iequirks a:focus.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_iequirks a:active.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_ie6 a:hover.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_ie6 a:focus.cke_dialog_ui_button span,.cke_skin_kama .cke_browser_ie6 a:active.cke_dialog_ui_button span{background-image:none;background:#F7A922;}.cke_skin_kama .cke_dialog_footer_buttons{display:inline-table;margin-right:12px;margin-left:12px;width:auto;position:relative;}.cke_skin_kama .cke_browser_ie7 .cke_dialog_footer_buttons{position:static;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons{display:inline;}.cke_skin_kama .cke_dialog_footer_buttons span.cke_dialog_ui_button{margin:7px 0;text-align:center;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons a.cke_dialog_ui_button{display:block;padding:0;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons span.cke_dialog_ui_button{padding-bottom:5px;padding-top:6px;margin-bottom:0;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons .cke_dialog_ui_button_ok .cke_dialog_ui_button{background-position:right -1214px;}.cke_skin_kama .cke_browser_gecko18 .cke_dialog_footer_buttons .cke_dialog_ui_button_cancel .cke_dialog_ui_button{background-position:right -1242px;}.cke_skin_kama .cke_browser_ie9.cke_rtl .cke_dialog_footer_buttons td{padding-left:2px;}.cke_skin_kama strong{font-weight:bold;}.cke_skin_kama .cke_dialog .cke_dialog_body .cke_dialog_close_button{background-image:url(images/sprites.png);background-repeat:no-repeat;background-position:0 -1022px;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;_background-image:url(images/sprites_ie6.png);}.cke_skin_kama .cke_dialog_close_button span{display:none;}.cke_skin_kama .cke_dialog_close_button:hover{background-position:0 -1045px;}.cke_skin_kama .cke_ltr .cke_dialog_close_button{right:10px;}.cke_skin_kama .cke_browser_ie8.cke_rtl .cke_dialog_close_button{left:8px;}.cke_skin_kama .cke_rtl .cke_dialog_close_button{left:10px;}.cke_skin_kama .cke_browser_ie7.cke_rtl .cke_dialog_close_button{left:16px;top:0;}.cke_skin_kama .cke_browser_ie7.cke_rtl .cke_dialog_close_button{position:absolute;left:10px;top:5px;}
+.cke_skin_kama .cke_browser_ie7.cke_single_page .cke_dialog_footer{margin-top:22px;}.cke_skin_kama .cke_browser_ie6 .cke_dialog_close_button,.cke_skin_kama .cke_browser_iequirks .cke_dialog_close_button{top:7px;}.cke_skin_kama .cke_browser_ie7.cke_ltr .cke_dialog_close_button{margin-top:0;}.cke_skin_kama .cke_dialog_ui_input_select{border:1px solid #a0a0a0;background-color:white;}.cke_skin_kama .cke_dialog_ui_input_file{width:100%;height:25px;}.cke_skin_kama .cke_dialog .cke_dark_background{background-color:#eaead1;}.cke_skin_kama .cke_dialog .cke_hand{cursor:pointer;}.cke_skin_kama .cke_dialog .cke_centered{text-align:center;}.cke_skin_kama .cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px;}.cke_skin_kama .cke_rtl .cke_dialog a.cke_btn_reset{float:left;}.cke_skin_kama .cke_dialog a.cke_btn_locked,.cke_skin_kama .cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px;}.cke_skin_kama .cke_dialog a.cke_btn_locked .cke_icon{display:none;}.cke_skin_kama .cke_rtl .cke_dialog a.cke_btn_locked,.cke_skin_kama .cke_rtl .cke_dialog a.cke_btn_unlocked{float:right;}.cke_skin_kama .cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.gif);}.cke_skin_kama .cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer;}.cke_skin_kama .cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:200px;width:300px;padding:2px;background-color:white;}.cke_skin_kama .cke_dialog .ImagePreviewBox table td{white-space:normal;}.cke_skin_kama .cke_browser_iequirks .cke_dialog_page_contents{_position:absolute;}.cke_skin_kama .cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity=90);background-color:#e4e4e4;}.cke_skin_kama .cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white;}.cke_skin_kama .cke_dialog .cke_pastetext{width:346px;height:170px;}.cke_skin_kama .cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none;}.cke_skin_kama .cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid black;}.cke_skin_kama .cke_dialog .cke_dark_background{text-align:center;background-color:#eaead1;font-size:14px;}.cke_skin_kama .cke_dialog .cke_light_background{text-align:center;background-color:#ffffbe;}.cke_skin_kama .cke_dialog .cke_hand{cursor:pointer;}.cke_skin_kama .cke_disabled{color:#a0a0a0;}.cke_skin_kama .cke_hc .cke_dialog_title,.cke_skin_kama .cke_hc .cke_dialog_tabs,.cke_skin_kama .cke_hc .cke_dialog_contents,.cke_skin_kama .cke_hc .cke_dialog_footer{border-left:1px solid;border-right:1px solid;}.cke_skin_kama .cke_hc .cke_dialog_title{border-top:1px solid;}.cke_skin_kama .cke_hc .cke_dialog_footer{border-bottom:1px solid;}.cke_skin_kama .cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px;}.cke_skin_kama .cke_dialog_body .cke_label{display:none;}.cke_skin_kama .cke_dialog_body label.cke_required{font-weight:bold;}.cke_skin_kama .cke_hc .cke_dialog_body .cke_label{display:inline;cursor:inherit;}.cke_skin_kama .cke_hc a.cke_btn_locked,.cke_skin_kama .cke_hc a.cke_btn_unlocked,.cke_skin_kama .cke_hc a.cke_btn_reset{border-style:solid;float:left;width:auto;height:auto;padding:0 2px;}.cke_skin_kama .cke_rtl.cke_hc a.cke_btn_locked,.cke_skin_kama .cke_rtl.cke_hc a.cke_btn_unlocked,.cke_skin_kama .cke_rtl.cke_hc a.cke_btn_reset{float:right;}.cke_skin_kama .cke_hc a.cke_btn_locked .cke_icon{display:inline;}.cke_skin_kama a.cke_smile img{border:2px solid #eaead1;}.cke_skin_kama a.cke_smile:focus img,.cke_skin_kama a.cke_smile:active img,.cke_skin_kama a.cke_smile:hover img{border-color:#C7C78F;}.cke_skin_kama .cke_hc .cke_dialog_tabs a,.cke_skin_kama .cke_hc .cke_dialog_footer a{opacity:1.0;filter:alpha(opacity=100);border:1px solid white;}
+.cke_skin_kama .cke_hc .ImagePreviewBox{width:260px;}.cke_skin_kama .cke_dialog_contents a.colorChooser{display:block;margin-top:6px;margin-left:10px;width:80px;}.cke_skin_kama .cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px;}.cke_skin_kama .cke_browser_gecko .cke_dialog_ui_checkbox_input:focus,.cke_skin_kama .cke_browser_gecko .cke_dialog_ui_radio_input:focus,.cke_skin_kama .cke_browser_opera .cke_dialog_ui_checkbox_input:focus,.cke_skin_kama .cke_browser_opera .cke_dialog_ui_radio_input:focus,.cke_skin_kama .cke_browser_gecko .cke_dialog_ui_input_select:focus,.cke_skin_kama .cke_browser_gecko .cke_btn_over,.cke_skin_kama .cke_browser_opera .cke_btn_over,.cke_skin_kama .cke_browser_ie .cke_btn_over{outline:1px dotted #696969;}.cke_skin_kama .cke_browser_ie .cke_dialog_ui_checkbox_input,.cke_skin_kama .cke_browser_ie .cke_dialog_ui_ratio_input,.cke_skin_kama .cke_browser_ie .cke_btn_reset,.cke_skin_kama .cke_browser_ie .cke_btn_locked,.cke_skin_kama .cke_browser_ie .cke_btn_unlocked{*border:1px solid transparent!important;-border:1px solid red!important;-filter:chroma(color=red);}.cke_skin_kama .cke_browser_ie .cke_dialog_ui_focused,.cke_skin_kama .cke_browser_ie .cke_btn_over{*border:1px dotted #696969!important;}.cke_skin_kama .cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity=0);width:100%;height:100%;}.cke_dialog label{display:inline;margin-bottom:auto;cursor:default;}
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/skins/kama/editor.css b/sm-shop/src/main/webapp/resources/js/ckeditor/skins/kama/editor.css
index 71d3499..9580e92 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/skins/kama/editor.css
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/skins/kama/editor.css
@@ -1,13 +1,13 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-.cke_skin_kama *,.cke_skin_kama a:hover,.cke_skin_kama a:link,.cke_skin_kama a:visited,.cke_skin_kama a:active{margin:0;padding:0;border:0;background:transparent;text-decoration:none;font:normal normal normal 100% Sans-Serif;width:auto;height:auto;border-collapse:collapse;text-align:left;vertical-align:baseline;white-space:nowrap;cursor:auto;color:#000;float:none;font-size:12px;font-family:Arial,Helvetica,Tahoma,Verdana,Sans-Serif;}.cke_skin_kama .cke_rtl *,.cke_skin_kama .cke_rtl a:hover,.cke_skin_kama .cke_rtl a:link,.cke_skin_kama .cke_rtl a:visited,.cke_skin_kama .cke_rtl a:active,.cke_rtl .cke_skin_kama *,.cke_rtl .cke_skin_kama a:hover,.cke_rtl .cke_skin_kama a:link,.cke_rtl .cke_skin_kama a:visited,.cke_rtl .cke_skin_kama a:active{text-align:right;}.cke_skin_kama iframe{vertical-align:inherit;}.cke_skin_kama textarea{white-space:pre;}.cke_skin_kama .cke_browser_gecko textarea{cursor:text;}.cke_skin_kama .cke_browser_gecko textarea[disabled]{cursor:default;}.cke_skin_kama input[type="text"],.cke_skin_kama input[type="password"]{cursor:text;}.cke_skin_kama input[type="text"][disabled],.cke_skin_kama input[type="password"][disabled]{cursor:default;}.cke_skin_kama fieldset{padding:10px;border:2px groove #E0DFE3;}.cke_skin_kama{display:block;}span.cke_skin_kama{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:1px solid #D3D3D3;padding:5px;}.cke_skin_kama span.cke_browser_webkit,.cke_skin_kama span.cke_browser_gecko18{display:block;}.cke_skin_kama .cke_wrapper{-moz-border-radius:5px;-webkit-border-radius:5px;-webkit-touch-callout:none;border-radius:5px;background-color:#d3d3d3;background-image:url(images/sprites.png);background-repeat:repeat-x;background-position:0 -1950px;display:block;_display:inline-block;padding:5px;}.cke_shared .cke_skin_kama .cke_wrapper{padding-bottom:0;}.cke_skin_kama .cke_browser_ie6 .cke_wrapper,.cke_skin_kama .cke_browser_iequirks .cke_wrapper{background-image:none;}.cke_skin_kama .cke_editor{display:inline-table;width:100%;}.cke_skin_kama .cke_browser_ie .cke_editor,.cke_skin_kama .cke_browser_webkit .cke_editor{display:table;}.cke_skin_kama .ltr .cke_browser_ie iframe{margin-right:-10px;}.cke_skin_kama .rtl .cke_browser_ie iframe{margin-left:-10px;}.cke_skin_kama .cke_browser_opera .cke_editor.cke_skin_kama .cke_resizer{display:table;}.cke_skin_kama .cke_contents{margin:5px;}.cke_skin_kama .cke_hc .cke_contents{border:1px solid black;}.cke_skin_kama .cke_contents iframe{background-color:#fff;}.cke_skin_kama .cke_focus{outline:auto 5px -webkit-focus-ring-color;}.cke_skin_kama textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre;}.cke_skin_kama .cke_browser_iequirks textarea.cke_source{_white-space:normal;}.cke_skin_kama .cke_resizer{width:12px;height:12px;margin-top:9px;display:block;float:right;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -1428px;background-repeat:no-repeat;cursor:se-resize;}.cke_skin_kama .cke_browser_air .cke_resizer,.cke_skin_kama .cke_browser_air .cke_rtl .cke_resizer{cursor:move;}.cke_skin_kama .cke_resizer_rtl{cursor:sw-resize;background-position:0 -1455px;float:left;}.cke_skin_kama .cke_resizer_horizontal,.cke_skin_kama .cke_rtl .cke_resizer_horizontal{cursor:e-resize;}.cke_skin_kama .cke_resizer_vertical,.cke_skin_kama .cke_rtl .cke_resizer_vertical{cursor:n-resize;}.cke_skin_kama .cke_maximized .cke_resizer{display:none;}.cke_skin_kama .cke_browser_ie6 .cke_contents textarea,.cke_skin_kama .cke_browser_ie7 .cke_contents textarea{position:absolute;}.cke_skin_kama .cke_browser_ie.cke_browser_quirks .cke_contents iframe{position:absolute;top:0;}.cke_skin_kama .cke_browser_ie6 .cke_editor,.cke_skin_kama .cke_browser_ie7 .cke_editor{display:inline-block;}.cke_skin_kama .cke_browser_ie6 .cke_editor,.cke_shared .cke_skin_kama .cke_browser_ie7 .cke_wrapper{padding-bottom:5px;}.cke_skin_kama .cke_voice_label{display:none;}.cke_skin_kama legend.cke_voice_label{display:none;}.cke_skin_kama .cke_browser_ie legend.cke_voice_label{position:absolute;display:block;width:0;height:0;overflow:hidden;}
-.cke_skin_kama .cke_panel{border:1px solid #8f8f73;background-color:#fff;width:120px;height:100px;overflow:hidden;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.cke_skin_kama .cke_contextmenu{margin:0;}.cke_skin_kama .cke_panel iframe{width:100%;height:100%;}html.cke_skin_kama_container{overflow:auto;overflow-x:hidden;}body.cke_panel_frame{overflow:auto;}.cke_panel_frame .cke_label{display:none;}ul.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap;}li.cke_panel_listItem{margin:0;}.cke_panel_listItem a{padding:2px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;}* html .cke_panel_listItem a{width:100%;color:#000;}*:first-child+html .cke_panel_listItem a{color:#000;}.cke_panel_listItem.cke_selected a{border:1px solid #ccc;background-color:#e9f5ff;}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#316ac5;background-color:#dff1ff;}.cke_hc .cke_panel_listItem.cke_selected a,.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border-width:3px;padding:0;}.cke_panel_grouptitle{font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;font-weight:bold;white-space:nowrap;background-color:#dcdcdc;color:#000;margin:0;padding:3px;}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:3px;margin-bottom:3px;}.cke_skin_kama .cke_button_textcolor_panel,.cke_skin_kama .cke_button_bgcolor_panel{width:150px;height:135px;}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000;}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left;}.cke_rtl span.cke_colorbox{float:right;}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;}.cke_rtl a.cke_colorbox{float:right;}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#316ac5 1px solid;background-color:#dff1ff;}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer;}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#316ac5 1px solid;background-color:#dff1ff;}@media print{.cke_skin_kama .cke_toolbox{display:none;}}.cke_skin_kama .cke_browser_webkit .cke_toolbox,.cke_skin_kama .cke_browser_webkit .cke_toolbox>span{white-space:normal;}.cke_skin_kama .cke_toolbox{clear:both;padding-bottom:1px;}.cke_skin_kama a.cke_toolbox_collapser,.cke_skin_kama a:hover.cke_toolbox_collapser{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:3px -1366px;background-repeat:no-repeat;width:11px;height:11px;float:right;border:1px outset #D3D3D3;margin:11px 0 2px;cursor:pointer;}.cke_skin_kama .cke_rtl a.cke_toolbox_collapser,.cke_skin_kama .cke_rtl a:hover.cke_toolbox_collapser{float:left;}.cke_skin_kama a.cke_toolbox_collapser span{display:none;}.cke_skin_kama .cke_hc a.cke_toolbox_collapser span{font-size:10px;font-weight:bold;font-family:Arial;display:inline;}.cke_skin_kama a.cke_toolbox_collapser_min,.cke_skin_kama a:hover.cke_toolbox_collapser_min{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:4px -1387px;background-repeat:no-repeat;margin:2px 4px;}.cke_skin_kama .cke_rtl a.cke_toolbox_collapser_min,.cke_skin_kama .cke_rtl a:hover.cke_toolbox_collapser_min{background-position:4px -1408px;}.cke_skin_kama .cke_separator{display:inline-block;border-left:solid 1px #D3D3D3;margin:3px 2px 0;height:16px;vertical-align:top;}.cke_skin_kama .cke_break{font-size:0;clear:left;}.cke_skin_kama .cke_rtl .cke_break{clear:right;}.cke_skin_kama .cke_toolbar_start{display:none;}.cke_skin_kama .cke_toolgroup{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:repeat-x;background-position:0 -500px;float:left;margin-right:6px;margin-bottom:5px;padding:2px;display:inline;}
-.cke_skin_kama .cke_rtl .cke_toolgroup{float:right;margin-right:0;margin-left:6px;}.cke_skin_kama .cke_button a,.cke_skin_kama .cke_button a:hover,.cke_skin_kama .cke_button a:focus,.cke_skin_kama .cke_button a:active,.cke_skin_kama .cke_button a.cke_off{border-radius:3px;outline:none;padding:2px 4px;height:18px;display:inline-block;cursor:default;}.cke_skin_kama .cke_button a,.cke_skin_kama .cke_button a.cke_off{filter:alpha(opacity=70);opacity:.70;-moz-border-radius:3px;-webkit-border-radius:3px;}.cke_skin_kama .cke_hc .cke_button a,.cke_skin_kama .cke_hc .cke_button a.cke_off{opacity:1.0;filter:alpha(opacity=100);border:1px solid white;}.cke_skin_kama .cke_button a.cke_on{background-color:#a3d7ff;filter:alpha(opacity=100);opacity:1;padding:2px 4px;}.cke_skin_kama .cke_hc .cke_button a.cke_on{padding:0 2px!important;border-width:3px;}.cke_skin_kama .cke_button a.cke_disabled *{filter:alpha(opacity=30);opacity:.3;}.cke_skin_kama .cke_browser_ie .cke_button a.cke_disabled *,.cke_skin_kama .cke_browser_ie a:hover.cke_button .cke_disabled *{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale'), alpha(opacity=30);}.cke_skin_kama .cke_browser_ie .cke_rtl .cke_button a.cke_disabled *,.cke_skin_kama .cke_browser_ie .cke_rtl a:hover.cke_button .cke_disabled *{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale'), alpha(opacity=30);}.cke_skin_kama .cke_browser_ie6 .cke_button a.cke_disabled *,.cke_skin_kama .cke_browser_ie6 a:hover.cke_button .cke_disabled *,.cke_skin_kama .cke_browser_ie .cke_button.cke_noalphafix a.cke_disabled *{filter:alpha(opacity=30);}.cke_skin_kama .cke_hc .cke_button a.cke_disabled *,.cke_skin_kama .cke_browser_ie.cke_hc a:hover.cke_button .cke_disabled *{filter:alpha(opacity=60);opacity:.6;}.cke_skin_kama .cke_button a:hover.cke_on,.cke_skin_kama .cke_button a:focus.cke_on,.cke_skin_kama .cke_button a:active.cke_on,.cke_skin_kama .cke_button a:hover.cke_off,.cke_skin_kama .cke_button a:focus.cke_off,.cke_skin_kama .cke_button a:active.cke_off{filter:alpha(opacity=100);opacity:1;padding:2px 4px;}.cke_skin_kama .cke_button a:hover,.cke_skin_kama .cke_button a:focus,.cke_skin_kama .cke_button a:active{background-color:#dff1ff;}.cke_skin_kama .cke_button a:hover.cke_on,.cke_skin_kama .cke_button a:focus.cke_on,.cke_skin_kama .cke_button a:active.cke_on{background-color:#86caff;}.cke_skin_kama .cke_hc .cke_button a:hover,.cke_skin_kama .cke_hc .cke_button a:focus,.cke_skin_kama .cke_hc .cke_button a:active{padding:0 2px!important;border-width:3px;}.cke_skin_kama .cke_button .cke_icon{background-image:url(icons.png);background-position:100px;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;display:inline-block;cursor:default;}.cke_skin_kama .cke_rtl .cke_button .cke_icon{background-image:url(icons_rtl.png);}.cke_skin_kama .cke_browser_ie .cke_button .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_skin_kama .cke_browser_ie .cke_rtl .cke_button .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_skin_kama .cke_browser_ie6 .cke_button .cke_icon,.cke_skin_kama .cke_browser_ie6 .cke_rtl .cke_button .cke_icon,.cke_skin_kama .cke_browser_ie .cke_button.cke_noalphafix .cke_icon,.cke_skin_kama .cke_browser_ie .cke_rtl .cke_button.cke_noalphafix .cke_icon{filter:;}.cke_skin_kama .cke_button .cke_label{cursor:default;display:none;padding-left:3px;line-height:18px;vertical-align:middle;}.cke_skin_kama .cke_hc .cke_button .cke_label{padding:0;display:inline-block;}.cke_skin_kama .cke_hc .cke_button .cke_icon{display:none;}.cke_skin_kama .cke_accessibility{position:absolute;display:block;width:0;height:0;overflow:hidden;}.cke_skin_kama .cke_button .cke_buttonarrow{display:inline-block;height:17px;width:8px;background-position:2px -1469px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:no-repeat;cursor:default;}.cke_skin_kama .cke_browser_ie .cke_button .cke_buttonarrow{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}
-.cke_skin_kama .cke_browser_ie6 .cke_button .cke_buttonarrow{filter:;}.cke_skin_kama .cke_browser_gecko .cke_toolbar,.cke_skin_kama .cke_browser_gecko .cke_button a,.cke_skin_kama .cke_browser_gecko .cke_button a.cke_off,.cke_skin_kama .cke_browser_gecko .cke_button .cke_icon,.cke_skin_kama .cke_browser_gecko .cke_button .cke_buttonarrow,.cke_skin_kama .cke_browser_gecko .cke_separator,.cke_skin_kama .cke_browser_gecko .cke_toolbar_start{display:block;float:left;}.cke_skin_kama .cke_browser_gecko.cke_hc .cke_button .cke_icon{display:none;}.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_toolbar,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_button a,.cke_skin_kama .cke_browser_gecko .cke_rtl.cke_button a.cke_off,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_button .cke_icon,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_button .cke_buttonarrow,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_separator,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_toolbar_start{float:right;}.cke_skin_kama .cke_browser_gecko .cke_button .cke_label,.cke_skin_kama .cke_browser_gecko .cke_break{float:left;}.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_button .cke_label,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_break{float:right;}.cke_skin_kama .cke_browser_webkit .cke_toolbar{float:left;}.cke_skin_kama .cke_browser_webkit .cke_rtl .cke_toolbar{float:right;}.cke_skin_kama .cke_browser_ie .cke_button .cke_label{line-height:16px;}.cke_skin_kama .cke_browser_ie .cke_rcombo,.cke_skin_kama .cke_browser_ie .cke_rcombo *{cursor:default;}.cke_skin_kama .cke_browser_ie .cke_toolbox{padding-bottom:5px;_padding-bottom:6px;}.cke_shared .cke_skin_kama .cke_browser_ie .cke_toolbox{padding-bottom:0;}.cke_skin_kama .cke_contextmenu{padding:2px;}.cke_skin_kama .cke_menuitem a{display:block;}.cke_skin_kama .cke_menuitem span{cursor:default;}.cke_skin_kama .cke_menuitem a:hover,.cke_skin_kama .cke_menuitem a:focus,.cke_skin_kama .cke_menuitem a:active{background-color:#D3D3D3;display:block;}.cke_hc .cke_menuitem a:hover,.cke_hc .cke_menuitem a:focus,.cke_hc .cke_menuitem a:active{border:2px solid;}.cke_skin_kama .cke_menuitem .cke_icon{background-image:url(icons.png);background-position:100px;background-repeat:no-repeat;background-color:transparent;width:16px;height:16px;float:left;}.cke_rtl .cke_skin_kama .cke_menuitem .cke_icon{background-image:url(icons_rtl.png);}.cke_browser_ie .cke_skin_kama .cke_menuitem .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie.cke_rtl .cke_skin_kama .cke_menuitem .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie6 .cke_skin_kama .cke_menuitem .cke_icon,.cke_browser_ie .cke_skin_kama .cke_menuitem.cke_noalphafix .cke_icon{filter:;}.cke_skin_kama .cke_menuitem .cke_disabled .cke_icon{filter:alpha(opacity=70);opacity:.70;}.cke_browser_ie .cke_skin_kama .cke_menuitem .cke_disabled .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie.cke_rtl .cke_skin_kama .cke_menuitem .cke_disabled .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie6 .cke_skin_kama .cke_menuitem .cke_disabled .cke_icon,.cke_browser_ie .cke_skin_kama .cke_menuitem.cke_noalphafix .cke_disabled .cke_icon{filter:;}.cke_skin_kama .cke_menuitem .cke_icon_wrapper{background-color:#D3D3D3;border:solid 4px #D3D3D3;width:16px;height:16px;float:left;filter:alpha(opacity=70);opacity:.70;clear:both;}.cke_rtl .cke_skin_kama .cke_menuitem .cke_icon_wrapper{float:right;}.cke_skin_kama .cke_menuitem a:hover .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:focus .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:active .cke_icon_wrapper{background-color:#9d9d9d;border:solid 4px #9d9d9d;filter:alpha(opacity=70);opacity:.70;}.cke_skin_kama .cke_menuitem a:hover.cke_disabled .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:focus.cke_disabled .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:active.cke_disabled .cke_icon_wrapper{background-color:#D3D3D3;border:solid 4px #D3D3D3;}
-.cke_skin_kama .cke_menuitem .cke_label{display:block;padding-right:3px;padding-top:5px;padding-left:4px;height:19px;margin-left:24px;background-color:#fff;}.cke_skin_kama .cke_frameLoaded .cke_menuitem .cke_label{filter:alpha(opacity=70);opacity:.70;}.cke_rtl .cke_skin_kama .cke_menuitem .cke_label{padding-right:0;margin-left:0;padding-left:3px;margin-right:28px;}.cke_skin_kama .cke_menuitem a.cke_disabled .cke_label{filter:alpha(opacity=30);opacity:.30;}.cke_skin_kama .cke_menuitem a:hover .cke_label,.cke_skin_kama .cke_menuitem a:focus .cke_label,.cke_skin_kama .cke_menuitem a:active .cke_label{background-color:#D3D3D3;}.cke_skin_kama .cke_menuitem a.cke_disabled:hover .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:focus .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:active .cke_label{background-color:transparent;}.cke_skin_kama .cke_menuseparator{background-color:#D3D3D3;height:2px;filter:alpha(opacity=70);opacity:.70;_font-size:0;}.cke_skin_kama .cke_menuarrow{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -1411px;background-repeat:no-repeat;height:5px;width:3px;float:right;margin-right:2px;margin-top:3px;}.cke_rtl .cke_skin_kama .cke_menuarrow{float:left;margin-right:0;margin-left:2px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -1390px;background-repeat:no-repeat;}.cke_skin_kama .cke_menuarrow span{display:none;}.cke_hc .cke_skin_kama .cke_menuarrow{width:auto;margin-top:0;}.cke_hc .cke_skin_kama .cke_menuarrow span{display:inline;}.cke_browser_ie.cke_ltr .cke_skin_kama .cke_menuarrow{position:absolute;right:2px;}.cke_browser_ie.cke_rtl .cke_skin_kama .cke_menuarrow{position:absolute;left:2px;}.cke_skin_kama .cke_rcombo{display:inline;}.cke_skin_kama .cke_rcombopanel{border:1px solid #8F8F73;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;height:auto;_height:100px;}.cke_skin_kama .cke_rcombo a,.cke_skin_kama .cke_rcombo a:active,.cke_skin_kama .cke_rcombo a:hover{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:repeat-x;background-position:0 -100px;border-bottom:1px solid #DAD9D9;border-right:1px solid #DAD9D9;float:left;padding:2px;height:21px;margin-right:6px;margin-bottom:5px;}.cke_skin_kama .cke_rtl .cke_rcombo a,.cke_skin_kama .cke_rtl .cke_rcombo a:active,.cke_skin_kama .cke_rtl .cke_rcombo a:hover{float:right;margin-right:0;margin-left:6px;}.cke_skin_kama .cke_hc .cke_rcombo a{filter:alpha(opacity=100);opacity:1.0;}.cke_skin_kama .cke_rcombo .cke_label{display:none;line-height:26px;vertical-align:top;margin-right:5px;filter:alpha(opacity=70);opacity:.70;}.cke_skin_kama .cke_rtl .cke_rcombo .cke_label{margin-right:0;margin-left:5px;}.cke_skin_kama .cke_rcombo .cke_inline_label{line-height:21px;font-style:italic;color:#666;}.cke_skin_kama .cke_hc .cke_rcombo .cke_openbutton{vertical-align:top;}.cke_skin_kama .cke_hc .cke_rcombo .cke_label{filter:alpha(opacity=100);opacity:1.0;}.cke_skin_kama .cke_rcombo .cke_text{filter:alpha(opacity=70);opacity:.70;height:21px;line-height:21px;width:60px;text-overflow:ellipsis;overflow:hidden;display:inline-block;margin:0 2px 0 4px;cursor:default;}.cke_skin_kama .cke_rtl .cke_rcombo .cke_text{margin:0 4px 0 2px;}.cke_skin_kama .cke_rcombo .cke_openbutton{display:inline-block;}.cke_skin_kama .cke_rcombo .cke_openbutton .cke_icon{display:inline-block;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -68px;background-repeat:no-repeat;width:17px;height:19px;margin:1px 2px;}.cke_skin_kama .cke_hc .cke_rcombo .cke_openbutton .cke_icon{background:none;}.cke_skin_kama .cke_browser_iequirks .cke_rcombo .cke_openbutton{margin-bottom:0;}.cke_skin_kama .cke_rcombo .cke_off a:hover .cke_text,.cke_skin_kama .cke_rcombo .cke_off a:focus .cke_text,.cke_skin_kama .cke_rcombo .cke_off a:active .cke_text,.cke_skin_kama .cke_rcombo .cke_on .cke_text{border-color:#316ac5;filter:alpha(opacity=100);opacity:1;}
-.cke_skin_kama .cke_rcombo .cke_off a:hover .cke_openbutton,.cke_skin_kama .cke_rcombo .cke_off a:focus .cke_openbutton,.cke_skin_kama .cke_rcombo .cke_off a:active .cke_openbutton,.cke_skin_kama .cke_rcombo .cke_on .cke_openbutton{border-color:#316ac5;background-color:#dff1ff;}.cke_skin_kama .cke_rcombo .cke_on .cke_text{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;}.cke_skin_kama .cke_rcombo .cke_on .cke_openbutton{-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;}.cke_skin_kama .cke_rcombo .cke_disabled .cke_label{filter:alpha(opacity=30);opacity:.3;}.cke_skin_kama .cke_hc .cke_rcombo .cke_disabled .cke_label{filter:alpha(opacity=70);opacity:.7;}.cke_skin_kama .cke_rcombo .cke_disabled .cke_text,.cke_skin_kama .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=50);opacity:.5;}.cke_skin_kama .cke_browser_ie .cke_rcombo .cke_disabled .cke_openbutton{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale'), alpha(opacity=50);}.cke_skin_kama .cke_browser_ie6 .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=50);}.cke_skin_kama .cke_hc .cke_rcombo .cke_disabled .cke_text,.cke_skin_kama .cke_hc .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=80);opacity:.8;}.cke_skin_kama .cke_rcombo .cke_disabled .cke_text{color:#fff;}.cke_skin_kama .cke_browser_gecko .cke_rcombo .cke_text,.cke_skin_kama .cke_browser_gecko .cke_rcombo .cke_openbutton,.cke_skin_kama .cke_browser_webkit .cke_rcombo .cke_text,.cke_skin_kama .cke_browser_webkit .cke_rcombo .cke_openbutton{display:block;float:left;}.cke_skin_kama .cke_browser_gecko .cke_rcombo .cke_label,.cke_skin_kama .cke_browser_webkit .cke_rcombo .cke_label{float:left;}.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_rcombo .cke_label,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_rcombo .cke_text,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_rcombo .cke_openbutton,.cke_skin_kama .cke_browser_webkit .cke_rtl .cke_rcombo .cke_label,.cke_skin_kama .cke_browser_webkit .cke_rtl .cke_rcombo .cke_text,.cke_skin_kama .cke_browser_webkit .cke_rtl .cke_rcombo .cke_openbutton{float:right;}.cke_skin_kama .cke_browser_ie7 .cke_rcombo .cke_text{line-height:18px;}.cke_skin_kama .cke_browser_ie6 .cke_rcombo .cke_text,.cke_skin_kama .cke_browser_iequirks .cke_rcombo .cke_text{height:auto;line-height:17px;}.cke_skin_kama .cke_rtl .cke_rcombo .cke_font .cke_text,.cke_skin_kama .cke_rtl .cke_rcombo .cke_fontSize .cke_text{direction:ltr;}@media print{.cke_path{display:none;}}.cke_skin_kama .cke_path{display:inline-block;float:left;margin-top:5px;}.cke_skin_kama .cke_rtl .cke_path{float:right;}.cke_shared .cke_skin_kama .cke_path{_width:100%;margin:0 0 5px;}.cke_skin_kama .cke_path a,.cke_skin_kama .cke_path .cke_empty{display:inline-block;float:left;padding:1px 4px 0;color:#60676a;cursor:default;}.cke_skin_kama .cke_path .cke_empty{visibility:hidden;}.cke_skin_kama .cke_rtl .cke_path a,.cke_skin_kama .cke_rtl .cke_path cke_empty{float:right;}.cke_skin_kama .cke_path a:hover,.cke_skin_kama .cke_path a:focus,.cke_skin_kama .cke_path a:active{background-color:#dff1ff;padding:1px 4px 0;outline:none;color:#000;}.cke_skin_kama .cke_browser_ie .cke_rtl .cke_path a,.cke_skin_kama .cke_browser_ie .cke_rtl .cke_path .cke_empty{float:none;}.cke_skin_kama .cke_path .cke_label{display:none;}.cke_skin_kama .cke_button_source .cke_icon{background-position:0 0;}.cke_skin_kama .cke_button_docProps .cke_icon{background-position:0 -16px;}.cke_skin_kama .cke_button_newpage .cke_icon{background-position:0 -48px;}.cke_skin_kama .cke_button_preview .cke_icon{background-position:0 -64px;}.cke_skin_kama .cke_button_cut .cke_icon{background-position:0 -96px;}.cke_skin_kama .cke_button_copy .cke_icon{background-position:0 -112px;}.cke_skin_kama .cke_button_paste .cke_icon{background-position:0 -128px;}.cke_skin_kama .cke_button_pastetext .cke_icon{background-position:0 -144px;}.cke_skin_kama .cke_button_find .cke_icon{background-position:0 -240px;}.cke_skin_kama .cke_button_replace .cke_icon{background-position:0 -256px;}
-.cke_skin_kama .cke_button_selectAll .cke_icon{background-position:0 -272px;}.cke_skin_kama .cke_button_removeFormat .cke_icon{background-position:0 -288px;}.cke_skin_kama .cke_button_bold .cke_icon{background-position:0 -304px;}.cke_skin_kama .cke_button_italic .cke_icon{background-position:0 -320px;}.cke_skin_kama .cke_button_underline .cke_icon{background-position:0 -336px;}.cke_skin_kama .cke_button_strike .cke_icon{background-position:0 -352px;}.cke_skin_kama .cke_button_subscript .cke_icon{background-position:0 -368px;}.cke_skin_kama .cke_button_superscript .cke_icon{background-position:0 -384px;}.cke_skin_kama .cke_button_table .cke_icon{background-position:0 -608px;}.cke_skin_kama .cke_button_horizontalrule .cke_icon{background-position:0 -624px;}.cke_skin_kama .cke_button_smiley .cke_icon{background-position:0 -640px;}.cke_skin_kama .cke_button_link .cke_icon{background-position:0 -528px;}.cke_skin_kama .cke_button_unlink .cke_icon{background-position:0 -544px;}.cke_skin_kama .cke_button_anchor .cke_icon{background-position:0 -560px;}.cke_skin_kama .cke_button_image .cke_icon{background-position:0 -576px;}.cke_skin_kama .cke_button_flash .cke_icon{background-position:0 -592px;}.cke_skin_kama .cke_button_specialchar .cke_icon{background-position:0 -656px;}.cke_skin_kama .cke_button_pagebreak .cke_icon{background-position:0 -672px;}.cke_skin_kama .cke_button_print .cke_icon{background-position:0 -176px;}.cke_skin_kama .cke_button_checkspell .cke_icon,.cke_skin_kama .cke_button_scayt .cke_icon{background-position:0 -192px;}.cke_skin_kama .cke_button_pagebreak .cke_icon{background-position:0 -672px;}.cke_skin_kama .cke_button_textcolor .cke_icon{background-position:0 -704px;}.cke_skin_kama .cke_button_bgcolor .cke_icon{background-position:0 -720px;}.cke_skin_kama .cke_button_form .cke_icon{background-position:0 -752px;}.cke_skin_kama .cke_button_checkbox .cke_icon{background-position:0 -768px;}.cke_skin_kama .cke_button_radio .cke_icon{background-position:0 -784px;}.cke_skin_kama .cke_button_textfield .cke_icon{background-position:0 -800px;}.cke_skin_kama .cke_button_textarea .cke_icon{background-position:0 -816px;}.cke_skin_kama .cke_button_showblocks .cke_icon{background-position:0 -1136px;}.cke_skin_kama .cke_button_select .cke_icon{background-position:0 -832px;}.cke_skin_kama .cke_button_button .cke_icon{background-position:0 -848px;}.cke_skin_kama .cke_button_imagebutton .cke_icon{background-position:0 -864px;}.cke_skin_kama .cke_button_hiddenfield .cke_icon{background-position:0 -880px;}.cke_skin_kama .cke_button_undo .cke_icon{background-position:0 -208px;}.cke_skin_kama .cke_rtl .cke_button_undo .cke_icon{background-position:0 -224px;}.cke_skin_kama .cke_button_redo .cke_icon{background-position:0 -224px;}.cke_skin_kama .cke_rtl .cke_button_redo .cke_icon{background-position:0 -208px;}.cke_skin_kama .cke_button_templates .cke_icon{background-position:0 -80px;}.cke_skin_kama .cke_button_numberedlist .cke_icon{background-position:0 -400px;}.cke_skin_kama .cke_button_bulletedlist .cke_icon{background-position:0 -416px;}.cke_skin_kama .cke_mixed_dir_content .cke_button_numberedlist .cke_icon{background-position:0 -1217px;}.cke_skin_kama .cke_mixed_dir_content .cke_button_bulletedlist .cke_icon{background-position:0 -1233px;}.cke_skin_kama .cke_button_outdent .cke_icon{background-position:0 -432px;}.cke_skin_kama .cke_button_indent .cke_icon{background-position:0 -448px;}.cke_skin_kama .cke_mixed_dir_content .cke_button_indent .cke_icon{background-position:0 -1265px;}.cke_skin_kama .cke_mixed_dir_content .cke_button_outdent .cke_icon{background-position:0 -1249px;}.cke_skin_kama .cke_button_justifyleft .cke_icon{background-position:0 -464px;}.cke_skin_kama .cke_button_justifycenter .cke_icon{background-position:0 -480px;}.cke_skin_kama .cke_button_justifyright .cke_icon{background-position:0 -496px;}.cke_skin_kama .cke_button_justifyblock .cke_icon{background-position:0 -512px;}.cke_skin_kama .cke_button_blockquote .cke_icon{background-position:0 -1152px;}.cke_skin_kama .cke_button_creatediv .cke_icon{background-position:0 -1168px;}
-.cke_skin_kama .cke_button_editdiv .cke_icon{background-position:0 -1184px;}.cke_skin_kama .cke_button_removediv .cke_icon{background-position:0 -1200px;}.cke_skin_kama .cke_button_flash .cke_icon{background-position:0 -592px;}.cke_skin_kama .cke_button_pastefromword .cke_icon{background-position:0 -160px;}.cke_skin_kama .cke_button_save .cke_icon{background-position:0 -32px;}.cke_skin_kama .cke_button_about .cke_icon{background-position:0 -736px;}.cke_skin_kama .cke_button_maximize .cke_icon{background-position:0 -1040px;}.cke_skin_kama .cke_button_editdiv .cke_icon{background-position:0 -1184px;}.cke_skin_kama .cke_button_bidirtl .cke_icon{background-position:0 -1072px;}.cke_skin_kama .cke_button_bidiltr .cke_icon{background-position:0 -1056px;}.cke_skin_kama .cke_button_iframe .cke_icon{background-position:0 -1279px;}.cke_skin_kama .cke_button_source .cke_label{display:inline;}.cke_skin_kama .cke_styles_panel{width:150px;height:170px;}.cke_skin_kama .cke_format_panel{width:150px;height:170px;}.cke_skin_kama .cke_font_panel{width:150px;height:170px;}.cke_skin_kama .cke_fontSize_panel{height:170px;}.cke_skin_kama .cke_fontSize .cke_text{width:25px;}.cke_skin_kama .cke_browser_iequirks .cke_fontSize .cke_text{width:32px;}html .cke_skin_kama{visibility:inherit;}html.cke_skin_kama_container{visibility:visible;}
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+.cke_skin_kama *,.cke_skin_kama a:hover,.cke_skin_kama a:link,.cke_skin_kama a:visited,.cke_skin_kama a:active{margin:0;padding:0;border:0;background:transparent;text-decoration:none;font:normal normal normal 100% Sans-Serif;width:auto;height:auto;border-collapse:collapse;text-align:left;vertical-align:baseline;white-space:nowrap;cursor:auto;color:#000;float:none;font-size:12px;font-family:Arial,Helvetica,Tahoma,Verdana,Sans-Serif;}.cke_skin_kama .cke_rtl *,.cke_skin_kama .cke_rtl a:hover,.cke_skin_kama .cke_rtl a:link,.cke_skin_kama .cke_rtl a:visited,.cke_skin_kama .cke_rtl a:active,.cke_rtl .cke_skin_kama *,.cke_rtl .cke_skin_kama a:hover,.cke_rtl .cke_skin_kama a:link,.cke_rtl .cke_skin_kama a:visited,.cke_rtl .cke_skin_kama a:active{text-align:right;}.cke_skin_kama iframe{vertical-align:inherit;}.cke_skin_kama textarea{white-space:pre;}.cke_skin_kama .cke_browser_gecko textarea{cursor:text;}.cke_skin_kama .cke_browser_gecko textarea[disabled]{cursor:default;}.cke_skin_kama input[type="text"],.cke_skin_kama input[type="password"]{cursor:text;}.cke_skin_kama input[type="text"][disabled],.cke_skin_kama input[type="password"][disabled]{cursor:default;}.cke_skin_kama fieldset{padding:10px;border:2px groove #E0DFE3;}.cke_skin_kama{display:block;}span.cke_skin_kama{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;border:1px solid #D3D3D3;padding:5px;}.cke_skin_kama span.cke_browser_webkit,.cke_skin_kama span.cke_browser_gecko18{display:block;}.cke_skin_kama .cke_wrapper{-moz-border-radius:5px;-webkit-border-radius:5px;-webkit-touch-callout:none;border-radius:5px;background-color:#d3d3d3;background-image:url(images/sprites.png);background-repeat:repeat-x;background-position:0 -1950px;display:block;_display:inline-block;padding:5px;}.cke_shared .cke_skin_kama .cke_wrapper{padding-bottom:0;}.cke_skin_kama .cke_browser_ie6 .cke_wrapper,.cke_skin_kama .cke_browser_iequirks .cke_wrapper{background-image:none;}.cke_skin_kama .cke_editor{display:inline-table;width:100%;}.cke_skin_kama .cke_browser_ie .cke_editor,.cke_skin_kama .cke_browser_webkit .cke_editor{display:table;}.cke_skin_kama .ltr .cke_browser_ie iframe{margin-right:-10px;}.cke_skin_kama .rtl .cke_browser_ie iframe{margin-left:-10px;}.cke_skin_kama .cke_browser_opera .cke_editor.cke_skin_kama .cke_resizer{display:table;}.cke_skin_kama .cke_contents{margin:5px;}.cke_skin_kama .cke_hc .cke_contents{border:1px solid black;}.cke_skin_kama .cke_contents iframe{background-color:#fff;}.cke_skin_kama .cke_focus{outline:auto 5px -webkit-focus-ring-color;}.cke_skin_kama textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre;}.cke_skin_kama .cke_browser_iequirks textarea.cke_source{_white-space:normal;}.cke_skin_kama .cke_resizer{width:12px;height:12px;margin-top:9px;display:block;float:right;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -1428px;background-repeat:no-repeat;cursor:se-resize;}.cke_skin_kama .cke_browser_air .cke_resizer,.cke_skin_kama .cke_browser_air .cke_rtl .cke_resizer{cursor:move;}.cke_skin_kama .cke_resizer_rtl{cursor:sw-resize;background-position:0 -1455px;float:left;}.cke_skin_kama .cke_resizer_horizontal,.cke_skin_kama .cke_rtl .cke_resizer_horizontal{cursor:e-resize;}.cke_skin_kama .cke_resizer_vertical,.cke_skin_kama .cke_rtl .cke_resizer_vertical{cursor:n-resize;}.cke_skin_kama .cke_maximized .cke_resizer{display:none;}.cke_skin_kama .cke_browser_ie6 .cke_contents textarea,.cke_skin_kama .cke_browser_ie7 .cke_contents textarea{position:absolute;}.cke_skin_kama .cke_browser_ie.cke_browser_quirks .cke_contents iframe{position:absolute;top:0;}.cke_skin_kama .cke_browser_ie6 .cke_editor,.cke_skin_kama .cke_browser_ie7 .cke_editor{display:inline-block;}.cke_skin_kama .cke_browser_ie6 .cke_editor,.cke_shared .cke_skin_kama .cke_browser_ie7 .cke_wrapper{padding-bottom:5px;}.cke_skin_kama .cke_voice_label{display:none;}.cke_skin_kama legend.cke_voice_label{display:none;}.cke_skin_kama .cke_browser_ie legend.cke_voice_label{position:absolute;display:block;width:0;height:0;overflow:hidden;}
+.cke_skin_kama .cke_panel{border:1px solid #8f8f73;background-color:#fff;width:120px;height:100px;overflow:hidden;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.cke_skin_kama .cke_contextmenu{margin:0;}.cke_skin_kama .cke_panel iframe{width:100%;height:100%;}html.cke_skin_kama_container{overflow:auto;overflow-x:hidden;}body.cke_panel_frame{overflow:auto;}.cke_panel_frame .cke_label{display:none;}ul.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap;}li.cke_panel_listItem{margin:0;}.cke_panel_listItem a{padding:2px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;}* html .cke_panel_listItem a{width:100%;color:#000;}*:first-child+html .cke_panel_listItem a{color:#000;}.cke_panel_listItem.cke_selected a{border:1px solid #ccc;background-color:#e9f5ff;}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#316ac5;background-color:#dff1ff;}.cke_hc .cke_panel_listItem.cke_selected a,.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border-width:3px;padding:0;}.cke_panel_grouptitle{font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;font-weight:bold;white-space:nowrap;background-color:#dcdcdc;color:#000;margin:0;padding:3px;}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:3px;margin-bottom:3px;}.cke_skin_kama .cke_button_textcolor_panel,.cke_skin_kama .cke_button_bgcolor_panel{width:150px;height:135px;}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000;}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left;}.cke_rtl span.cke_colorbox{float:right;}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;}.cke_rtl a.cke_colorbox{float:right;}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#316ac5 1px solid;background-color:#dff1ff;}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer;}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#316ac5 1px solid;background-color:#dff1ff;}@media print{.cke_skin_kama .cke_toolbox{display:none;}}.cke_skin_kama .cke_browser_webkit .cke_toolbox,.cke_skin_kama .cke_browser_webkit .cke_toolbox>span{white-space:normal;}.cke_skin_kama .cke_toolbox{clear:both;padding-bottom:1px;}.cke_skin_kama a.cke_toolbox_collapser,.cke_skin_kama a:hover.cke_toolbox_collapser{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:3px -1366px;background-repeat:no-repeat;width:11px;height:11px;float:right;border:1px outset #D3D3D3;margin:11px 0 2px;cursor:pointer;}.cke_skin_kama .cke_rtl a.cke_toolbox_collapser,.cke_skin_kama .cke_rtl a:hover.cke_toolbox_collapser{float:left;}.cke_skin_kama a.cke_toolbox_collapser span{display:none;}.cke_skin_kama .cke_hc a.cke_toolbox_collapser span{font-size:10px;font-weight:bold;font-family:Arial;display:inline;}.cke_skin_kama a.cke_toolbox_collapser_min,.cke_skin_kama a:hover.cke_toolbox_collapser_min{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:4px -1387px;background-repeat:no-repeat;margin:2px 4px;}.cke_skin_kama .cke_rtl a.cke_toolbox_collapser_min,.cke_skin_kama .cke_rtl a:hover.cke_toolbox_collapser_min{background-position:4px -1408px;}.cke_skin_kama .cke_separator{display:inline-block;border-left:solid 1px #D3D3D3;margin:3px 2px 0;height:16px;vertical-align:top;}.cke_skin_kama .cke_break{font-size:0;clear:left;}.cke_skin_kama .cke_rtl .cke_break{clear:right;}.cke_skin_kama .cke_toolbar_start{display:none;}.cke_skin_kama .cke_toolgroup{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:repeat-x;background-position:0 -500px;float:left;margin-right:6px;margin-bottom:5px;padding:2px;display:inline;}
+.cke_skin_kama .cke_rtl .cke_toolgroup{float:right;margin-right:0;margin-left:6px;}.cke_skin_kama .cke_button a,.cke_skin_kama .cke_button a:hover,.cke_skin_kama .cke_button a:focus,.cke_skin_kama .cke_button a:active,.cke_skin_kama .cke_button a.cke_off{border-radius:3px;outline:none;padding:2px 4px;height:18px;display:inline-block;cursor:default;}.cke_skin_kama .cke_button a,.cke_skin_kama .cke_button a.cke_off{filter:alpha(opacity=70);opacity:.70;-moz-border-radius:3px;-webkit-border-radius:3px;}.cke_skin_kama .cke_hc .cke_button a,.cke_skin_kama .cke_hc .cke_button a.cke_off{opacity:1.0;filter:alpha(opacity=100);border:1px solid white;}.cke_skin_kama .cke_button a.cke_on{background-color:#a3d7ff;filter:alpha(opacity=100);opacity:1;padding:2px 4px;}.cke_skin_kama .cke_hc .cke_button a.cke_on{padding:0 2px!important;border-width:3px;}.cke_skin_kama .cke_button a.cke_disabled *{filter:alpha(opacity=30);opacity:.3;}.cke_skin_kama .cke_browser_ie .cke_button a.cke_disabled *,.cke_skin_kama .cke_browser_ie a:hover.cke_button .cke_disabled *{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale'), alpha(opacity=30);}.cke_skin_kama .cke_browser_ie .cke_rtl .cke_button a.cke_disabled *,.cke_skin_kama .cke_browser_ie .cke_rtl a:hover.cke_button .cke_disabled *{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale'), alpha(opacity=30);}.cke_skin_kama .cke_browser_ie6 .cke_button a.cke_disabled *,.cke_skin_kama .cke_browser_ie6 a:hover.cke_button .cke_disabled *,.cke_skin_kama .cke_browser_ie .cke_button.cke_noalphafix a.cke_disabled *{filter:alpha(opacity=30);}.cke_skin_kama .cke_hc .cke_button a.cke_disabled *,.cke_skin_kama .cke_browser_ie.cke_hc a:hover.cke_button .cke_disabled *{filter:alpha(opacity=60);opacity:.6;}.cke_skin_kama .cke_button a:hover.cke_on,.cke_skin_kama .cke_button a:focus.cke_on,.cke_skin_kama .cke_button a:active.cke_on,.cke_skin_kama .cke_button a:hover.cke_off,.cke_skin_kama .cke_button a:focus.cke_off,.cke_skin_kama .cke_button a:active.cke_off{filter:alpha(opacity=100);opacity:1;padding:2px 4px;}.cke_skin_kama .cke_button a:hover,.cke_skin_kama .cke_button a:focus,.cke_skin_kama .cke_button a:active{background-color:#dff1ff;}.cke_skin_kama .cke_button a:hover.cke_on,.cke_skin_kama .cke_button a:focus.cke_on,.cke_skin_kama .cke_button a:active.cke_on{background-color:#86caff;}.cke_skin_kama .cke_hc .cke_button a:hover,.cke_skin_kama .cke_hc .cke_button a:focus,.cke_skin_kama .cke_hc .cke_button a:active{padding:0 2px!important;border-width:3px;}.cke_skin_kama .cke_button .cke_icon{background-image:url(icons.png);background-position:100px;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;display:inline-block;cursor:default;}.cke_skin_kama .cke_rtl .cke_button .cke_icon{background-image:url(icons_rtl.png);}.cke_skin_kama .cke_browser_ie .cke_button .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_skin_kama .cke_browser_ie .cke_rtl .cke_button .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_skin_kama .cke_browser_ie6 .cke_button .cke_icon,.cke_skin_kama .cke_browser_ie6 .cke_rtl .cke_button .cke_icon,.cke_skin_kama .cke_browser_ie .cke_button.cke_noalphafix .cke_icon,.cke_skin_kama .cke_browser_ie .cke_rtl .cke_button.cke_noalphafix .cke_icon{filter:;}.cke_skin_kama .cke_button .cke_label{cursor:default;display:none;padding-left:3px;line-height:18px;vertical-align:middle;}.cke_skin_kama .cke_hc .cke_button .cke_label{padding:0;display:inline-block;}.cke_skin_kama .cke_hc .cke_button .cke_icon{display:none;}.cke_skin_kama .cke_accessibility{position:absolute;display:block;width:0;height:0;overflow:hidden;}.cke_skin_kama .cke_button .cke_buttonarrow{display:inline-block;height:17px;width:8px;background-position:2px -1469px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:no-repeat;cursor:default;}.cke_skin_kama .cke_browser_ie .cke_button .cke_buttonarrow{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}
+.cke_skin_kama .cke_browser_ie6 .cke_button .cke_buttonarrow{filter:;}.cke_skin_kama .cke_browser_gecko .cke_toolbar,.cke_skin_kama .cke_browser_gecko .cke_button a,.cke_skin_kama .cke_browser_gecko .cke_button a.cke_off,.cke_skin_kama .cke_browser_gecko .cke_button .cke_icon,.cke_skin_kama .cke_browser_gecko .cke_button .cke_buttonarrow,.cke_skin_kama .cke_browser_gecko .cke_separator,.cke_skin_kama .cke_browser_gecko .cke_toolbar_start{display:block;float:left;}.cke_skin_kama .cke_browser_gecko.cke_hc .cke_button .cke_icon{display:none;}.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_toolbar,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_button a,.cke_skin_kama .cke_browser_gecko .cke_rtl.cke_button a.cke_off,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_button .cke_icon,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_button .cke_buttonarrow,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_separator,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_toolbar_start{float:right;}.cke_skin_kama .cke_browser_gecko .cke_button .cke_label,.cke_skin_kama .cke_browser_gecko .cke_break{float:left;}.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_button .cke_label,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_break{float:right;}.cke_skin_kama .cke_browser_webkit .cke_toolbar{float:left;}.cke_skin_kama .cke_browser_webkit .cke_rtl .cke_toolbar{float:right;}.cke_skin_kama .cke_browser_ie .cke_button .cke_label{line-height:16px;}.cke_skin_kama .cke_browser_ie .cke_rcombo,.cke_skin_kama .cke_browser_ie .cke_rcombo *{cursor:default;}.cke_skin_kama .cke_browser_ie .cke_toolbox{padding-bottom:5px;_padding-bottom:6px;}.cke_shared .cke_skin_kama .cke_browser_ie .cke_toolbox{padding-bottom:0;}.cke_skin_kama .cke_contextmenu{padding:2px;}.cke_skin_kama .cke_menuitem a{display:block;}.cke_skin_kama .cke_menuitem span{cursor:default;}.cke_skin_kama .cke_menuitem a:hover,.cke_skin_kama .cke_menuitem a:focus,.cke_skin_kama .cke_menuitem a:active{background-color:#D3D3D3;display:block;}.cke_hc .cke_menuitem a:hover,.cke_hc .cke_menuitem a:focus,.cke_hc .cke_menuitem a:active{border:2px solid;}.cke_skin_kama .cke_menuitem .cke_icon{background-image:url(icons.png);background-position:100px;background-repeat:no-repeat;background-color:transparent;width:16px;height:16px;float:left;}.cke_rtl .cke_skin_kama .cke_menuitem .cke_icon{background-image:url(icons_rtl.png);}.cke_browser_ie .cke_skin_kama .cke_menuitem .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie.cke_rtl .cke_skin_kama .cke_menuitem .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie6 .cke_skin_kama .cke_menuitem .cke_icon,.cke_browser_ie .cke_skin_kama .cke_menuitem.cke_noalphafix .cke_icon{filter:;}.cke_skin_kama .cke_menuitem .cke_disabled .cke_icon{filter:alpha(opacity=70);opacity:.70;}.cke_browser_ie .cke_skin_kama .cke_menuitem .cke_disabled .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie.cke_rtl .cke_skin_kama .cke_menuitem .cke_disabled .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie6 .cke_skin_kama .cke_menuitem .cke_disabled .cke_icon,.cke_browser_ie .cke_skin_kama .cke_menuitem.cke_noalphafix .cke_disabled .cke_icon{filter:;}.cke_skin_kama .cke_menuitem .cke_icon_wrapper{background-color:#D3D3D3;border:solid 4px #D3D3D3;width:16px;height:16px;float:left;filter:alpha(opacity=70);opacity:.70;clear:both;}.cke_rtl .cke_skin_kama .cke_menuitem .cke_icon_wrapper{float:right;}.cke_skin_kama .cke_menuitem a:hover .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:focus .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:active .cke_icon_wrapper{background-color:#9d9d9d;border:solid 4px #9d9d9d;filter:alpha(opacity=70);opacity:.70;}.cke_skin_kama .cke_menuitem a:hover.cke_disabled .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:focus.cke_disabled .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:active.cke_disabled .cke_icon_wrapper{background-color:#D3D3D3;border:solid 4px #D3D3D3;}
+.cke_skin_kama .cke_menuitem .cke_label{display:block;padding-right:3px;padding-top:5px;padding-left:4px;height:19px;margin-left:24px;background-color:#fff;}.cke_skin_kama .cke_frameLoaded .cke_menuitem .cke_label{filter:alpha(opacity=70);opacity:.70;}.cke_rtl .cke_skin_kama .cke_menuitem .cke_label{padding-right:0;margin-left:0;padding-left:3px;margin-right:28px;}.cke_skin_kama .cke_menuitem a.cke_disabled .cke_label{filter:alpha(opacity=30);opacity:.30;}.cke_skin_kama .cke_menuitem a:hover .cke_label,.cke_skin_kama .cke_menuitem a:focus .cke_label,.cke_skin_kama .cke_menuitem a:active .cke_label{background-color:#D3D3D3;}.cke_skin_kama .cke_menuitem a.cke_disabled:hover .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:focus .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:active .cke_label{background-color:transparent;}.cke_skin_kama .cke_menuseparator{background-color:#D3D3D3;height:2px;filter:alpha(opacity=70);opacity:.70;_font-size:0;}.cke_skin_kama .cke_menuarrow{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -1411px;background-repeat:no-repeat;height:5px;width:3px;float:right;margin-right:2px;margin-top:3px;}.cke_rtl .cke_skin_kama .cke_menuarrow{float:left;margin-right:0;margin-left:2px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -1390px;background-repeat:no-repeat;}.cke_skin_kama .cke_menuarrow span{display:none;}.cke_hc .cke_skin_kama .cke_menuarrow{width:auto;margin-top:0;}.cke_hc .cke_skin_kama .cke_menuarrow span{display:inline;}.cke_browser_ie.cke_ltr .cke_skin_kama .cke_menuarrow{position:absolute;right:2px;}.cke_browser_ie.cke_rtl .cke_skin_kama .cke_menuarrow{position:absolute;left:2px;}.cke_skin_kama .cke_rcombo{display:inline;}.cke_skin_kama .cke_rcombopanel{border:1px solid #8F8F73;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;height:auto;_height:100px;}.cke_skin_kama .cke_rcombo a,.cke_skin_kama .cke_rcombo a:active,.cke_skin_kama .cke_rcombo a:hover{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:repeat-x;background-position:0 -100px;border-bottom:1px solid #DAD9D9;border-right:1px solid #DAD9D9;float:left;padding:2px;height:21px;margin-right:6px;margin-bottom:5px;}.cke_skin_kama .cke_rtl .cke_rcombo a,.cke_skin_kama .cke_rtl .cke_rcombo a:active,.cke_skin_kama .cke_rtl .cke_rcombo a:hover{float:right;margin-right:0;margin-left:6px;}.cke_skin_kama .cke_hc .cke_rcombo a{filter:alpha(opacity=100);opacity:1.0;}.cke_skin_kama .cke_rcombo .cke_label{display:none;line-height:26px;vertical-align:top;margin-right:5px;filter:alpha(opacity=70);opacity:.70;}.cke_skin_kama .cke_rtl .cke_rcombo .cke_label{margin-right:0;margin-left:5px;}.cke_skin_kama .cke_rcombo .cke_inline_label{line-height:21px;font-style:italic;color:#666;}.cke_skin_kama .cke_hc .cke_rcombo .cke_openbutton{vertical-align:top;}.cke_skin_kama .cke_hc .cke_rcombo .cke_label{filter:alpha(opacity=100);opacity:1.0;}.cke_skin_kama .cke_rcombo .cke_text{filter:alpha(opacity=70);opacity:.70;height:21px;line-height:21px;width:60px;text-overflow:ellipsis;overflow:hidden;display:inline-block;margin:0 2px 0 4px;cursor:default;}.cke_skin_kama .cke_rtl .cke_rcombo .cke_text{margin:0 4px 0 2px;}.cke_skin_kama .cke_rcombo .cke_openbutton{display:inline-block;}.cke_skin_kama .cke_rcombo .cke_openbutton .cke_icon{display:inline-block;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -68px;background-repeat:no-repeat;width:17px;height:19px;margin:1px 2px;}.cke_skin_kama .cke_hc .cke_rcombo .cke_openbutton .cke_icon{background:none;}.cke_skin_kama .cke_browser_iequirks .cke_rcombo .cke_openbutton{margin-bottom:0;}.cke_skin_kama .cke_rcombo .cke_off a:hover .cke_text,.cke_skin_kama .cke_rcombo .cke_off a:focus .cke_text,.cke_skin_kama .cke_rcombo .cke_off a:active .cke_text,.cke_skin_kama .cke_rcombo .cke_on .cke_text{border-color:#316ac5;filter:alpha(opacity=100);opacity:1;}
+.cke_skin_kama .cke_rcombo .cke_off a:hover .cke_openbutton,.cke_skin_kama .cke_rcombo .cke_off a:focus .cke_openbutton,.cke_skin_kama .cke_rcombo .cke_off a:active .cke_openbutton,.cke_skin_kama .cke_rcombo .cke_on .cke_openbutton{border-color:#316ac5;background-color:#dff1ff;}.cke_skin_kama .cke_rcombo .cke_on .cke_text{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;}.cke_skin_kama .cke_rcombo .cke_on .cke_openbutton{-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;}.cke_skin_kama .cke_rcombo .cke_disabled .cke_label{filter:alpha(opacity=30);opacity:.3;}.cke_skin_kama .cke_hc .cke_rcombo .cke_disabled .cke_label{filter:alpha(opacity=70);opacity:.7;}.cke_skin_kama .cke_rcombo .cke_disabled .cke_text,.cke_skin_kama .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=50);opacity:.5;}.cke_skin_kama .cke_browser_ie .cke_rcombo .cke_disabled .cke_openbutton{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale'), alpha(opacity=50);}.cke_skin_kama .cke_browser_ie6 .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=50);}.cke_skin_kama .cke_hc .cke_rcombo .cke_disabled .cke_text,.cke_skin_kama .cke_hc .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=80);opacity:.8;}.cke_skin_kama .cke_rcombo .cke_disabled .cke_text{color:#fff;}.cke_skin_kama .cke_browser_gecko .cke_rcombo .cke_text,.cke_skin_kama .cke_browser_gecko .cke_rcombo .cke_openbutton,.cke_skin_kama .cke_browser_webkit .cke_rcombo .cke_text,.cke_skin_kama .cke_browser_webkit .cke_rcombo .cke_openbutton{display:block;float:left;}.cke_skin_kama .cke_browser_gecko .cke_rcombo .cke_label,.cke_skin_kama .cke_browser_webkit .cke_rcombo .cke_label{float:left;}.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_rcombo .cke_label,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_rcombo .cke_text,.cke_skin_kama .cke_browser_gecko .cke_rtl .cke_rcombo .cke_openbutton,.cke_skin_kama .cke_browser_webkit .cke_rtl .cke_rcombo .cke_label,.cke_skin_kama .cke_browser_webkit .cke_rtl .cke_rcombo .cke_text,.cke_skin_kama .cke_browser_webkit .cke_rtl .cke_rcombo .cke_openbutton{float:right;}.cke_skin_kama .cke_browser_ie7 .cke_rcombo .cke_text{line-height:18px;}.cke_skin_kama .cke_browser_ie6 .cke_rcombo .cke_text,.cke_skin_kama .cke_browser_iequirks .cke_rcombo .cke_text{height:auto;line-height:17px;}.cke_skin_kama .cke_rtl .cke_rcombo .cke_font .cke_text,.cke_skin_kama .cke_rtl .cke_rcombo .cke_fontSize .cke_text{direction:ltr;}@media print{.cke_path{display:none;}}.cke_skin_kama .cke_path{display:inline-block;float:left;margin-top:5px;}.cke_skin_kama .cke_rtl .cke_path{float:right;}.cke_shared .cke_skin_kama .cke_path{_width:100%;margin:0 0 5px;}.cke_skin_kama .cke_path a,.cke_skin_kama .cke_path .cke_empty{display:inline-block;float:left;padding:1px 4px 0;color:#60676a;cursor:default;}.cke_skin_kama .cke_path .cke_empty{visibility:hidden;}.cke_skin_kama .cke_rtl .cke_path a,.cke_skin_kama .cke_rtl .cke_path cke_empty{float:right;}.cke_skin_kama .cke_path a:hover,.cke_skin_kama .cke_path a:focus,.cke_skin_kama .cke_path a:active{background-color:#dff1ff;padding:1px 4px 0;outline:none;color:#000;}.cke_skin_kama .cke_browser_ie .cke_rtl .cke_path a,.cke_skin_kama .cke_browser_ie .cke_rtl .cke_path .cke_empty{float:none;}.cke_skin_kama .cke_path .cke_label{display:none;}.cke_skin_kama .cke_button_source .cke_icon{background-position:0 0;}.cke_skin_kama .cke_button_docProps .cke_icon{background-position:0 -16px;}.cke_skin_kama .cke_button_newpage .cke_icon{background-position:0 -48px;}.cke_skin_kama .cke_button_preview .cke_icon{background-position:0 -64px;}.cke_skin_kama .cke_button_cut .cke_icon{background-position:0 -96px;}.cke_skin_kama .cke_button_copy .cke_icon{background-position:0 -112px;}.cke_skin_kama .cke_button_paste .cke_icon{background-position:0 -128px;}.cke_skin_kama .cke_button_pastetext .cke_icon{background-position:0 -144px;}.cke_skin_kama .cke_button_find .cke_icon{background-position:0 -240px;}.cke_skin_kama .cke_button_replace .cke_icon{background-position:0 -256px;}
+.cke_skin_kama .cke_button_selectAll .cke_icon{background-position:0 -272px;}.cke_skin_kama .cke_button_removeFormat .cke_icon{background-position:0 -288px;}.cke_skin_kama .cke_button_bold .cke_icon{background-position:0 -304px;}.cke_skin_kama .cke_button_italic .cke_icon{background-position:0 -320px;}.cke_skin_kama .cke_button_underline .cke_icon{background-position:0 -336px;}.cke_skin_kama .cke_button_strike .cke_icon{background-position:0 -352px;}.cke_skin_kama .cke_button_subscript .cke_icon{background-position:0 -368px;}.cke_skin_kama .cke_button_superscript .cke_icon{background-position:0 -384px;}.cke_skin_kama .cke_button_table .cke_icon{background-position:0 -608px;}.cke_skin_kama .cke_button_horizontalrule .cke_icon{background-position:0 -624px;}.cke_skin_kama .cke_button_smiley .cke_icon{background-position:0 -640px;}.cke_skin_kama .cke_button_link .cke_icon{background-position:0 -528px;}.cke_skin_kama .cke_button_unlink .cke_icon{background-position:0 -544px;}.cke_skin_kama .cke_button_anchor .cke_icon{background-position:0 -560px;}.cke_skin_kama .cke_button_image .cke_icon{background-position:0 -576px;}.cke_skin_kama .cke_button_flash .cke_icon{background-position:0 -592px;}.cke_skin_kama .cke_button_specialchar .cke_icon{background-position:0 -656px;}.cke_skin_kama .cke_button_pagebreak .cke_icon{background-position:0 -672px;}.cke_skin_kama .cke_button_print .cke_icon{background-position:0 -176px;}.cke_skin_kama .cke_button_checkspell .cke_icon,.cke_skin_kama .cke_button_scayt .cke_icon{background-position:0 -192px;}.cke_skin_kama .cke_button_pagebreak .cke_icon{background-position:0 -672px;}.cke_skin_kama .cke_button_textcolor .cke_icon{background-position:0 -704px;}.cke_skin_kama .cke_button_bgcolor .cke_icon{background-position:0 -720px;}.cke_skin_kama .cke_button_form .cke_icon{background-position:0 -752px;}.cke_skin_kama .cke_button_checkbox .cke_icon{background-position:0 -768px;}.cke_skin_kama .cke_button_radio .cke_icon{background-position:0 -784px;}.cke_skin_kama .cke_button_textfield .cke_icon{background-position:0 -800px;}.cke_skin_kama .cke_button_textarea .cke_icon{background-position:0 -816px;}.cke_skin_kama .cke_button_showblocks .cke_icon{background-position:0 -1136px;}.cke_skin_kama .cke_button_select .cke_icon{background-position:0 -832px;}.cke_skin_kama .cke_button_button .cke_icon{background-position:0 -848px;}.cke_skin_kama .cke_button_imagebutton .cke_icon{background-position:0 -864px;}.cke_skin_kama .cke_button_hiddenfield .cke_icon{background-position:0 -880px;}.cke_skin_kama .cke_button_undo .cke_icon{background-position:0 -208px;}.cke_skin_kama .cke_rtl .cke_button_undo .cke_icon{background-position:0 -224px;}.cke_skin_kama .cke_button_redo .cke_icon{background-position:0 -224px;}.cke_skin_kama .cke_rtl .cke_button_redo .cke_icon{background-position:0 -208px;}.cke_skin_kama .cke_button_templates .cke_icon{background-position:0 -80px;}.cke_skin_kama .cke_button_numberedlist .cke_icon{background-position:0 -400px;}.cke_skin_kama .cke_button_bulletedlist .cke_icon{background-position:0 -416px;}.cke_skin_kama .cke_mixed_dir_content .cke_button_numberedlist .cke_icon{background-position:0 -1217px;}.cke_skin_kama .cke_mixed_dir_content .cke_button_bulletedlist .cke_icon{background-position:0 -1233px;}.cke_skin_kama .cke_button_outdent .cke_icon{background-position:0 -432px;}.cke_skin_kama .cke_button_indent .cke_icon{background-position:0 -448px;}.cke_skin_kama .cke_mixed_dir_content .cke_button_indent .cke_icon{background-position:0 -1265px;}.cke_skin_kama .cke_mixed_dir_content .cke_button_outdent .cke_icon{background-position:0 -1249px;}.cke_skin_kama .cke_button_justifyleft .cke_icon{background-position:0 -464px;}.cke_skin_kama .cke_button_justifycenter .cke_icon{background-position:0 -480px;}.cke_skin_kama .cke_button_justifyright .cke_icon{background-position:0 -496px;}.cke_skin_kama .cke_button_justifyblock .cke_icon{background-position:0 -512px;}.cke_skin_kama .cke_button_blockquote .cke_icon{background-position:0 -1152px;}.cke_skin_kama .cke_button_creatediv .cke_icon{background-position:0 -1168px;}
+.cke_skin_kama .cke_button_editdiv .cke_icon{background-position:0 -1184px;}.cke_skin_kama .cke_button_removediv .cke_icon{background-position:0 -1200px;}.cke_skin_kama .cke_button_flash .cke_icon{background-position:0 -592px;}.cke_skin_kama .cke_button_pastefromword .cke_icon{background-position:0 -160px;}.cke_skin_kama .cke_button_save .cke_icon{background-position:0 -32px;}.cke_skin_kama .cke_button_about .cke_icon{background-position:0 -736px;}.cke_skin_kama .cke_button_maximize .cke_icon{background-position:0 -1040px;}.cke_skin_kama .cke_button_editdiv .cke_icon{background-position:0 -1184px;}.cke_skin_kama .cke_button_bidirtl .cke_icon{background-position:0 -1072px;}.cke_skin_kama .cke_button_bidiltr .cke_icon{background-position:0 -1056px;}.cke_skin_kama .cke_button_iframe .cke_icon{background-position:0 -1279px;}.cke_skin_kama .cke_button_source .cke_label{display:inline;}.cke_skin_kama .cke_styles_panel{width:150px;height:170px;}.cke_skin_kama .cke_format_panel{width:150px;height:170px;}.cke_skin_kama .cke_font_panel{width:150px;height:170px;}.cke_skin_kama .cke_fontSize_panel{height:170px;}.cke_skin_kama .cke_fontSize .cke_text{width:25px;}.cke_skin_kama .cke_browser_iequirks .cke_fontSize .cke_text{width:32px;}html .cke_skin_kama{visibility:inherit;}html.cke_skin_kama_container{visibility:visible;}
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/skins/kama/skin.js b/sm-shop/src/main/webapp/resources/js/ckeditor/skins/kama/skin.js
index b675094..d4d43cc 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/skins/kama/skin.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/skins/kama/skin.js
@@ -1,7 +1,7 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.skins.add('kama',(function(){var a='cke_ui_color';return{editor:{css:['editor.css']},dialog:{css:['dialog.css']},richcombo:{canGroup:false},templates:{css:['templates.css']},margins:[0,0,0,0],init:function(b){if(b.config.width&&!isNaN(b.config.width))b.config.width-=12;var c=[],d=/\$color/g,e='/* UI Color Support */.cke_skin_kama .cke_menuitem .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuitem a:hover .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:focus .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:active .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuitem a:hover .cke_label,.cke_skin_kama .cke_menuitem a:focus .cke_label,.cke_skin_kama .cke_menuitem a:active .cke_label{\tbackground-color: $color !important;}.cke_skin_kama .cke_menuitem a.cke_disabled:hover .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:focus .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:active .cke_label{\tbackground-color: transparent !important;}.cke_skin_kama .cke_menuitem a.cke_disabled:hover .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a.cke_disabled:focus .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a.cke_disabled:active .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuitem a.cke_disabled .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuseparator{\tbackground-color: $color !important;}.cke_skin_kama .cke_menuitem a:hover,.cke_skin_kama .cke_menuitem a:focus,.cke_skin_kama .cke_menuitem a:active{\tbackground-color: $color !important;}';if(CKEDITOR.env.webkit){e=e.split('}').slice(0,-1);for(var f=0;f<e.length;f++)e[f]=e[f].split('{');}function g(j){var k=j.getById(a);if(!k){k=j.getHead().append('style');k.setAttribute('id',a);k.setAttribute('type','text/css');}return k;};function h(j,k,l){var m,n,o;for(var p=0;p<j.length;p++){if(CKEDITOR.env.webkit)for(n=0;n<k.length;n++){o=k[n][1];for(m=0;m<l.length;m++)o=o.replace(l[m][0],l[m][1]);j[p].$.sheet.addRule(k[n][0],o);}else{o=k;for(m=0;m<l.length;m++)o=o.replace(l[m][0],l[m][1]);if(CKEDITOR.env.ie)j[p].$.styleSheet.cssText+=o;else j[p].$.innerHTML+=o;}}};var i=/\$color/g;CKEDITOR.tools.extend(b,{uiColor:null,getUiColor:function(){return this.uiColor;},setUiColor:function(j){var k,l=g(CKEDITOR.document),m='.'+b.id,n=[m+' .cke_wrapper',m+'_dialog .cke_dialog_contents',m+'_dialog a.cke_dialog_tab',m+'_dialog .cke_dialog_footer'].join(','),o='background-color: $color !important;';
-if(CKEDITOR.env.webkit)k=[[n,o]];else k=n+'{'+o+'}';return(this.setUiColor=function(p){var q=[[i,p]];b.uiColor=p;h([l],k,q);h(c,e,q);})(j);}});b.on('menuShow',function(j){var k=j.data[0],l=k.element.getElementsByTag('iframe').getItem(0).getFrameDocument();if(!l.getById('cke_ui_color')){var m=g(l);c.push(m);var n=b.getUiColor();if(n)h([m],e,[[i,n]]);}});if(b.config.uiColor)b.setUiColor(b.config.uiColor);}};})());(function(){CKEDITOR.dialog?a():CKEDITOR.on('dialogPluginReady',a);function a(){CKEDITOR.dialog.on('resize',function(b){var c=b.data,d=c.width,e=c.height,f=c.dialog,g=f.parts.contents;if(c.skin!='kama')return;g.setStyles({width:d+'px',height:e+'px'});});};})();
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.skins.add('kama',(function(){var a='cke_ui_color';return{editor:{css:['editor.css']},dialog:{css:['dialog.css']},richcombo:{canGroup:false},templates:{css:['templates.css']},margins:[0,0,0,0],init:function(b){if(b.config.width&&!isNaN(b.config.width))b.config.width-=12;var c=[],d=/\$color/g,e='/* UI Color Support */.cke_skin_kama .cke_menuitem .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuitem a:hover .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:focus .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a:active .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuitem a:hover .cke_label,.cke_skin_kama .cke_menuitem a:focus .cke_label,.cke_skin_kama .cke_menuitem a:active .cke_label{\tbackground-color: $color !important;}.cke_skin_kama .cke_menuitem a.cke_disabled:hover .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:focus .cke_label,.cke_skin_kama .cke_menuitem a.cke_disabled:active .cke_label{\tbackground-color: transparent !important;}.cke_skin_kama .cke_menuitem a.cke_disabled:hover .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a.cke_disabled:focus .cke_icon_wrapper,.cke_skin_kama .cke_menuitem a.cke_disabled:active .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuitem a.cke_disabled .cke_icon_wrapper{\tbackground-color: $color !important;\tborder-color: $color !important;}.cke_skin_kama .cke_menuseparator{\tbackground-color: $color !important;}.cke_skin_kama .cke_menuitem a:hover,.cke_skin_kama .cke_menuitem a:focus,.cke_skin_kama .cke_menuitem a:active{\tbackground-color: $color !important;}';if(CKEDITOR.env.webkit){e=e.split('}').slice(0,-1);for(var f=0;f<e.length;f++)e[f]=e[f].split('{');}function g(j){var k=j.getById(a);if(!k){k=j.getHead().append('style');k.setAttribute('id',a);k.setAttribute('type','text/css');}return k;};function h(j,k,l){var m,n,o;for(var p=0;p<j.length;p++){if(CKEDITOR.env.webkit)for(n=0;n<k.length;n++){o=k[n][1];for(m=0;m<l.length;m++)o=o.replace(l[m][0],l[m][1]);j[p].$.sheet.addRule(k[n][0],o);}else{o=k;for(m=0;m<l.length;m++)o=o.replace(l[m][0],l[m][1]);if(CKEDITOR.env.ie)j[p].$.styleSheet.cssText+=o;else j[p].$.innerHTML+=o;}}};var i=/\$color/g;CKEDITOR.tools.extend(b,{uiColor:null,getUiColor:function(){return this.uiColor;},setUiColor:function(j){var k,l=g(CKEDITOR.document),m='.'+b.id,n=[m+' .cke_wrapper',m+'_dialog .cke_dialog_contents',m+'_dialog a.cke_dialog_tab',m+'_dialog .cke_dialog_footer'].join(','),o='background-color: $color !important;';
+if(CKEDITOR.env.webkit)k=[[n,o]];else k=n+'{'+o+'}';return(this.setUiColor=function(p){var q=[[i,p]];b.uiColor=p;h([l],k,q);h(c,e,q);})(j);}});b.on('menuShow',function(j){var k=j.data[0],l=k.element.getElementsByTag('iframe').getItem(0).getFrameDocument();if(!l.getById('cke_ui_color')){var m=g(l);c.push(m);var n=b.getUiColor();if(n)h([m],e,[[i,n]]);}});if(b.config.uiColor)b.setUiColor(b.config.uiColor);}};})());(function(){CKEDITOR.dialog?a():CKEDITOR.on('dialogPluginReady',a);function a(){CKEDITOR.dialog.on('resize',function(b){var c=b.data,d=c.width,e=c.height,f=c.dialog,g=f.parts.contents;if(c.skin!='kama')return;g.setStyles({width:d+'px',height:e+'px'});});};})();
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/skins/kama/templates.css b/sm-shop/src/main/webapp/resources/js/ckeditor/skins/kama/templates.css
index e8af77b..9e6820a 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/skins/kama/templates.css
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/skins/kama/templates.css
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-.cke_skin_kama .cke_tpl_list{border:#dcdcdc 2px solid;background-color:#fff;overflow-y:auto;overflow-x:hidden;width:100%;height:220px;}.cke_skin_kama .cke_tpl_item{margin:5px;padding:7px;border:#eee 1px solid;*width:88%;}.cke_skin_kama .cke_tpl_preview{border-collapse:separate;text-indent:0;width:100%;}.cke_skin_kama .cke_tpl_preview td{padding:2px;vertical-align:middle;}.cke_skin_kama .cke_tpl_preview .cke_tpl_preview_img{width:100px;}.cke_skin_kama .cke_tpl_preview span{white-space:normal;}.cke_skin_kama .cke_tpl_title{font-weight:bold;}.cke_skin_kama .cke_tpl_list a:active .cke_tpl_item,.cke_skin_kama .cke_tpl_list a:hover .cke_tpl_item,.cke_skin_kama .cke_tpl_list a:focus .cke_tpl_item{border:#f93 1px solid;background-color:#fffacd;}.cke_skin_kama .cke_tpl_list a:active *,.cke_skin_kama .cke_tpl_list a:hover *,.cke_skin_kama .cke_tpl_list a:focus *{cursor:pointer;}.cke_skin_kama .cke_browser_ie6 .cke_tpl_list a:active,.cke_skin_kama .cke_browser_ie6 .cke_tpl_list a:hover,.cke_skin_kama .cke_browser_ie6 .cke_tpl_list a:focus{background-position:0 0;}.cke_skin_kama .cke_hc .cke_tpl_list a:active .cke_tpl_item,.cke_skin_kama .cke_hc .cke_tpl_list a:hover .cke_tpl_item,.cke_skin_kama .cke_hc .cke_tpl_list a:focus .cke_tpl_item{border-width:3px;}.cke_skin_kama .cke_tpl_empty,.cke_tpl_loading{text-align:center;padding:5px;}
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+.cke_skin_kama .cke_tpl_list{border:#dcdcdc 2px solid;background-color:#fff;overflow-y:auto;overflow-x:hidden;width:100%;height:220px;}.cke_skin_kama .cke_tpl_item{margin:5px;padding:7px;border:#eee 1px solid;*width:88%;}.cke_skin_kama .cke_tpl_preview{border-collapse:separate;text-indent:0;width:100%;}.cke_skin_kama .cke_tpl_preview td{padding:2px;vertical-align:middle;}.cke_skin_kama .cke_tpl_preview .cke_tpl_preview_img{width:100px;}.cke_skin_kama .cke_tpl_preview span{white-space:normal;}.cke_skin_kama .cke_tpl_title{font-weight:bold;}.cke_skin_kama .cke_tpl_list a:active .cke_tpl_item,.cke_skin_kama .cke_tpl_list a:hover .cke_tpl_item,.cke_skin_kama .cke_tpl_list a:focus .cke_tpl_item{border:#f93 1px solid;background-color:#fffacd;}.cke_skin_kama .cke_tpl_list a:active *,.cke_skin_kama .cke_tpl_list a:hover *,.cke_skin_kama .cke_tpl_list a:focus *{cursor:pointer;}.cke_skin_kama .cke_browser_ie6 .cke_tpl_list a:active,.cke_skin_kama .cke_browser_ie6 .cke_tpl_list a:hover,.cke_skin_kama .cke_browser_ie6 .cke_tpl_list a:focus{background-position:0 0;}.cke_skin_kama .cke_hc .cke_tpl_list a:active .cke_tpl_item,.cke_skin_kama .cke_hc .cke_tpl_list a:hover .cke_tpl_item,.cke_skin_kama .cke_hc .cke_tpl_list a:focus .cke_tpl_item{border-width:3px;}.cke_skin_kama .cke_tpl_empty,.cke_tpl_loading{text-align:center;padding:5px;}
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/skins/office2003/dialog.css b/sm-shop/src/main/webapp/resources/js/ckeditor/skins/office2003/dialog.css
index c70abb2..18546ae 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/skins/office2003/dialog.css
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/skins/office2003/dialog.css
@@ -1,10 +1,10 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-body .cke_dialog{visibility:visible;}.cke_skin_office2003 table.cke_dialog.cke_browser_gecko{display:block;}.cke_skin_office2003 .cke_dialog_body{margin-left:16px;margin-right:16px;margin-top:2px;margin-bottom:20px;z-index:1;_position:static;}.cke_skin_office2003 .cke_dialog_tl,.cke_skin_office2003 .cke_dialog_tr,.cke_skin_office2003 .cke_dialog_tc,.cke_skin_office2003 .cke_dialog_bl,.cke_skin_office2003 .cke_dialog_br,.cke_skin_office2003 .cke_dialog_bc{background-image:url(images/sprites.png);background-repeat:no-repeat;position:absolute;_background-image:url(images/sprites_ie6.png);z-index:-1;}.cke_skin_office2003 .cke_dialog_tl{background-position:-16px -16px;height:16px;width:16px;top:0;left:0;}.cke_skin_office2003 .cke_rtl .cke_dialog_tl{background-position:-16px -397px;}.cke_skin_office2003 .cke_dialog_tr{background-position:-16px -76px;height:16px;width:16px;top:0;right:0;}.cke_skin_office2003 .cke_rtl .cke_dialog_tr{background-position:-16px -457px;}.cke_skin_office2003 .cke_dialog_tc{background-position:0 -136px;background-repeat:repeat-x;height:16px;top:0;left:16px;right:16px;}.cke_skin_office2003 .cke_dialog_bl{background-position:-16px -196px;height:51px;width:30px;bottom:0;left:0;}.cke_skin_office2003 .cke_rtl .cke_dialog_bl{background-position:-16px -517px;}.cke_skin_office2003 .cke_dialog_br{background-position:-16px -263px;height:51px;width:30px;bottom:0;right:0;}.cke_skin_office2003 .cke_rtl .cke_dialog_br{background-position:-16px -584px;}.cke_skin_office2003 .cke_dialog_bc{background-position:0 -330px;background-repeat:repeat-x;height:51px;bottom:0;left:30px;right:30px;}.cke_skin_office2003 .cke_dialog_ml,.cke_skin_office2003 .cke_dialog_mr{background-image:url(images/dialog_sides.png);background-repeat:repeat-y;position:absolute;width:16px;top:16px;bottom:51px;_background-image:url(images/dialog_sides.gif);_top:auto;}.cke_skin_office2003 .cke_rtl .cke_dialog_ml,.cke_skin_office2003 .cke_rtl .cke_dialog_mr{background-image:url(images/dialog_sides_rtl.png);_background-image:url(images/dialog_sides.gif);}.cke_skin_office2003 .cke_dialog_ml{background-position:0 0;left:0;}.cke_skin_office2003 .cke_dialog_mr{background-position:-16px 0;right:0;}.cke_skin_office2003 .cke_browser_iequirks .cke_dialog_ml,.cke_skin_office2003 .cke_browser_iequirks .cke_dialog_mr{margin-top:3px;}.cke_skin_office2003 .cke_dialog_title{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -678px;background-repeat:repeat-x;font-weight:bold;font-size:14pt;color:#0E3460;background-color:#8db1ff;padding:3px 10px 26px 10px;cursor:move;position:relative;}.cke_skin_office2003 .cke_browser_ie.cke_rtl .cke_dialog_title{position:static;}.cke_skin_office2003 .cke_dialog_contents{background-color:#f7f8fd;border:#2b66c9 1px solid;overflow:auto;padding:5px 10px;}.cke_skin_office2003 .cke_dialog_footer{background-color:#8db1ff;text-align:right;}.cke_skin_office2003 .cke_rtl .cke_dialog_footer{text-align:left;}.cke_skin_office2003 .cke_dialog_footer .cke_resizer{margin-top:21px;}.cke_skin_office2003 .cke_dialog_tabs{height:23px;background-color:#8db1ff;display:inline-block;margin-left:10px;margin-right:10px;margin-top:-23px;position:absolute;z-index:2;}.cke_skin_office2003 .cke_rtl .cke_dialog_tabs{right:10px;}.cke_skin_office2003 a.cke_dialog_tab,.cke_skin_office2003 a:link.cke_dialog_tab,.cke_skin_office2003 a:active.cke_dialog_tab,.cke_skin_office2003 a:hover.cke_dialog_tab,.cke_skin_office2003 a:visited.cke_dialog_tab{color:#0E3460;border-left:1px solid #2b66c9;border-right:1px solid #2b66c9;border-top:1px solid #2b66c9;height:14px;padding:4px 5px;display:inline-block;cursor:pointer;}.cke_skin_office2003 .cke_browser_gecko18 a.cke_dialog_tab,.cke_skin_office2003 .cke_browser_gecko18 a:link.cke_dialog_tab,.cke_skin_office2003 .cke_browser_gecko18 a:active.cke_dialog_tab,.cke_skin_office2003 .cke_browser_gecko18 a:hover.cke_dialog_tab,.cke_skin_office2003 .cke_browser_gecko18 a:visited.cke_dialog_tab{display:inline;position:relative;top:6px;}.cke_skin_office2003 a:hover.cke_dialog_tab{background-color:#f7f8fd;}
-.cke_skin_office2003 .cke_hc a:hover.cke_dialog_tab{padding:2px 3px!important;border-width:3px;}.cke_skin_office2003 a.cke_dialog_tab_selected,.cke_skin_office2003 a:link.cke_dialog_tab_selected,.cke_skin_office2003 a:active.cke_dialog_tab_selected,.cke_skin_office2003 a:hover.cke_dialog_tab_selected,.cke_skin_office2003 a:visited.cke_dialog_tab_selected{border-bottom:1px solid #f7f8fd;background-color:#f7f8fd;font-weight:bold;cursor:default;}.cke_skin_office2003 .cke_hc a.cke_dialog_tab_selected,.cke_skin_office2003 .cke_hc a:link.cke_dialog_tab_selected,.cke_skin_office2003 .cke_hc a:active.cke_dialog_tab_selected,.cke_skin_office2003 .cke_hc a:hover.cke_dialog_tab_selected,.cke_skin_office2003 .cke_hc a:visited.cke_dialog_tab_selected{padding:2px 3px!important;border-width:3px;}.cke_skin_office2003 .cke_single_page .cke_dialog_tabs{display:none;}.cke_skin_office2003 .cke_hc .cke_dialog_tabs a,.cke_skin_office2003 .cke_hc .cke_dialog_footer a{opacity:1.0;filter:alpha(opacity=100);border:1px solid white;}.cke_skin_office2003 .cke_single_page .cke_dialog_title{padding-bottom:3px;}.cke_skin_office2003 .cke_dialog_ui_vbox table,.cke_skin_office2003 .cke_dialog_ui_hbox table{margin:auto;}.cke_skin_office2003 .cke_dialog_ui_vbox_child{padding:5px 0;}.cke_skin_office2003 input.cke_dialog_ui_input_text,.cke_skin_office2003 input.cke_dialog_ui_input_password{background-color:white;border:none;padding:0;width:100%;height:14px;}.cke_skin_office2003 div.cke_dialog_ui_input_text,.cke_skin_office2003 div.cke_dialog_ui_input_password{background-color:white;border:1px solid #a0a0a0;padding:1px 0;_width:99.9%;}.cke_skin_office2003 .cke_browser_ie7 input.cke_dialog_ui_input_text,.cke_skin_office2003 .cke_browser_ie7 input.cke_dialog_ui_input_password{position:absolute;}.cke_skin_office2003 .cke_browser_ie7 div.cke_dialog_ui_input_text,.cke_skin_office2003 .cke_browser_ie7 div.cke_dialog_ui_input_password{height:14px;position:relative;}.cke_skin_office2003 .cke_browser_ie.cke_rtl input.cke_dialog_ui_input_text,.cke_skin_office2003 .cke_browser_opera.cke_rtl input.cke_dialog_ui_input_text,.cke_skin_office2003 .cke_browser_ie.cke_rtl input.cke_dialog_ui_input_password,.cke_skin_office2003 .cke_browser_opera.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px;}.cke_skin_office2003 .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_text,.cke_skin_office2003 .cke_browser_opera.cke_rtl div.cke_dialog_ui_input_text,.cke_skin_office2003 .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_password,.cke_skin_office2003 .cke_browser_opera.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px;}.cke_skin_office2003 .cke_browser_ie.cke_rtl .cke_dialog_ui_vbox_child,.cke_skin_office2003 .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_child,.cke_skin_office2003 .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_first,.cke_skin_office2003 .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important;}.cke_skin_office2003 .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px;}.cke_skin_office2003 .cke_browser_gecko.cke_hc div.cke_dialog_ui_input_text,.cke_skin_office2003 .cke_browser_gecko.cke_hc div.cke_dialog_ui_input_password{border-width:0;}.cke_skin_office2003 .cke_browser_gecko18.cke_hc div.cke_dialog_ui_input_text,.cke_skin_office2003 .cke_browser_gecko18.cke_hc div.cke_dialog_ui_input_password{border-width:1px;}.cke_skin_office2003 textarea.cke_dialog_ui_input_textarea{background-color:white;border:none;padding:0;width:100%;_width:99%;overflow:auto;resize:none;}.cke_skin_office2003 div.cke_dialog_ui_input_textarea{background-color:white;border:1px solid #a0a0a0;padding:1px 0;}.cke_skin_office2003 .cke_rtl .cke_dialog_ui_labeled_content{_width:95%;}.cke_skin_office2003 div.cke_disabled .cke_dialog_ui_labeled_content *{background-color:#a0a0a0;cursor:default;}.cke_skin_office2003 .cke_dialog_ui_hbox{width:100%;}.cke_skin_office2003 .cke_dialog_ui_hbox_first,.cke_skin_office2003 .cke_dialog_ui_hbox_child,.cke_skin_office2003 .cke_dialog_ui_hbox_last{vertical-align:top;}.cke_skin_office2003 .cke_ltr .cke_dialog_ui_hbox_first,.cke_skin_office2003 .cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px;}
-.cke_skin_office2003 .cke_rtl .cke_dialog_ui_hbox_first,.cke_skin_office2003 .cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px;}.cke_skin_office2003 a.cke_dialog_ui_button{border-collapse:separate;cursor:default;}.cke_skin_office2003 a.cke_dialog_ui_button_ok span,.cke_skin_office2003 a.cke_dialog_ui_button_cancel span{width:60px;}.cke_skin_office2003 span.cke_dialog_ui_button{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -678px;background-repeat:repeat-x;border:#0E3460 1px solid;padding:2px 10px;text-align:center;color:#0E3460;background-color:#8db1ff;display:inline-block;cursor:default;}.cke_skin_office2003 .cke_browser_gecko18 .cke_dialog_footer_buttons span.cke_dialog_ui_button{display:block;}.cke_skin_office2003 a.cke_dialog_ui_button span.cke_disabled{border:#898980 1px solid;color:#5e5e55;background-color:#c5c5b3;}.cke_skin_office2003 a:focus span.cke_dialog_ui_button,.cke_skin_office2003 a:active span.cke_dialog_ui_button{background-color:#8db1ff;}.cke_skin_office2003 .cke_hc a:focus span.cke_dialog_ui_button,.cke_skin_office2003 .cke_hc a:active span.cke_dialog_ui_button{border-width:2px;}.cke_skin_office2003 .cke_dialog_footer_buttons{display:inline-table;margin-right:12px;margin-left:12px;width:auto;position:relative;}.cke_skin_office2003 .cke_browser_gecko18 .cke_dialog_footer_buttons{display:inline;}.cke_skin_office2003 .cke_dialog_footer_buttons span.cke_dialog_ui_button{margin:7px 0;}.cke_skin_office2003 .cke_browser_ie7 .cke_dialog_footer_buttons{position:static;}.cke_skin_office2003 strong{font-weight:bold;}.cke_skin_office2003 a.cke_dialog_close_button,.cke_skin_office2003 a:hover.cke_dialog_close_button,.cke_skin_office2003 .cke_browser_ie6 a.cke_dialog_close_button,.cke_skin_office2003 .cke_browser_ie6 a:hover.cke_dialog_close_button{background-image:url(images/sprites.png);background-repeat:no-repeat;background-position:-20px -655px;position:absolute;cursor:pointer;text-align:center;height:21px;width:21px;top:4px;_background-image:url(images/sprites_ie6.png);}.cke_skin_office2003 a.cke_dialog_close_button span{display:none;}.cke_skin_office2003 .cke_ltr a.cke_dialog_close_button{right:22px;}.cke_skin_office2003 .cke_rtl a.cke_dialog_close_button,.cke_skin_office2003 .cke_rtl a:hover.cke_dialog_close_button{left:16px;_top:6px;}.cke_skin_office2003 .cke_browser_ie6.cke_rtl a.cke_dialog_close_button,.cke_skin_office2003 .cke_browser_ie6.cke_rtl a:hover.cke_dialog_close_button{position:relative;float:left;margin-top:-55px;margin-left:-7px;}.cke_skin_office2003 .cke_browser_iequirks.cke_rtl.cke_single_page a.cke_dialog_close_button,.cke_skin_office2003 .cke_browser_iequirks.cke_rtl.cke_single_page a:hover.cke_dialog_close_button{margin-top:-32px;}.cke_skin_office2003 .cke_browser_iequirks.cke_ltr a.cke_dialog_close_button,.cke_skin_office2003 .cke_browser_iequirks.cke_ltr a:hover.cke_dialog_close_button{margin-top:0;}.cke_skin_office2003 .cke_dialog_ui_input_select{border:1px solid #a0a0a0;background-color:white;}.cke_skin_office2003 .cke_dialog_ui_input_file{width:100%;height:25px;}.cke_skin_office2003 .cke_dialog .cke_dark_background{background-color:#eaead1;}.cke_skin_office2003 .cke_dialog .cke_hand{cursor:pointer;}.cke_skin_office2003 .cke_dialog .cke_centered{text-align:center;}.cke_skin_office2003 .cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px;}.cke_skin_office2003 .cke_rtl .cke_dialog a.cke_btn_reset{float:left;}.cke_skin_office2003 .cke_dialog a.cke_btn_locked,.cke_skin_office2003 .cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px;}.cke_skin_office2003 .cke_dialog a.cke_btn_locked .cke_icon{display:none;}.cke_skin_office2003 .cke_rtl .cke_dialog a.cke_btn_locked,.cke_skin_office2003 .cke_rtl .cke_dialog a.cke_btn_unlocked{float:right;}.cke_skin_office2003 .cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.gif);}
-.cke_skin_office2003 .cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer;}.cke_skin_office2003 .cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:210px;width:230px;padding:2px;background-color:white;}.cke_skin_office2003 .cke_dialog .ImagePreviewBox table td{white-space:normal;}.cke_skin_office2003 .cke_browser_iequirks .cke_dialog_page_contents{_position:absolute;}.cke_skin_office2003 .cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity=90);background-color:#e4e4e4;}.cke_skin_office2003 .cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white;}.cke_skin_office2003 .cke_dialog .cke_pastetext{width:346px;height:170px;}.cke_skin_office2003 .cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none;}.cke_skin_office2003 .cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid black;}.cke_skin_office2003 .cke_dialog .cke_dark_background{text-align:center;background-color:#eaead1;font-size:14px;}.cke_skin_office2003 .cke_dialog .cke_light_background{text-align:center;background-color:#ffffbe;}.cke_skin_office2003 .cke_dialog .cke_hand{cursor:pointer;}.cke_skin_office2003 .cke_disabled{color:#a0a0a0;}.cke_skin_office2003 .cke_hc .cke_dialog_title,.cke_skin_office2003 .cke_hc .cke_dialog_tabs,.cke_skin_office2003 .cke_hc .cke_dialog_contents,.cke_skin_office2003 .cke_hc .cke_dialog_footer{border-left:1px solid;border-right:1px solid;}.cke_skin_office2003 .cke_hc .cke_dialog_title{border-top:1px solid;}.cke_skin_office2003 .cke_hc .cke_dialog_footer{border-bottom:1px solid;}.cke_skin_office2003 .cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px;}.cke_skin_office2003 .cke_dialog_body .cke_label{display:none;}.cke_skin_office2003 .cke_dialog_body label.cke_required{font-weight:bold;}.cke_skin_office2003 .cke_hc .cke_dialog_body .cke_label{display:inline;cursor:inherit;}.cke_skin_office2003 .cke_hc a.cke_btn_locked,.cke_skin_office2003 .cke_hc a.cke_btn_unlocked,.cke_skin_office2003 .cke_hc a.cke_btn_reset{border-style:solid;float:left;width:auto;height:auto;padding:0 2px;}.cke_skin_office2003 .cke_hc a.cke_btn_locked .cke_icon{display:inline;}.cke_skin_office2003 .cke_rtl.cke_hc a.cke_btn_locked,.cke_skin_office2003 .cke_rtl.cke_hc a.cke_btn_unlocked,.cke_skin_office2003 .cke_rtl.cke_hc a.cke_btn_reset{float:right;}.cke_skin_office2003 .cke_dialog_contents a.colorChooser{display:block;margin-top:12px;margin-left:10px;width:40px;}.cke_skin_office2003 .cke_dialog_contents a.colorChooser .cke_dialog_ui_button{width:100%;}.cke_skin_office2003 .cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px;}.cke_skin_office2003 .cke_browser_gecko .cke_dialog_ui_checkbox_input:focus,.cke_skin_office2003 .cke_browser_gecko .cke_dialog_ui_radio_input:focus,.cke_skin_office2003 .cke_browser_opera .cke_dialog_ui_checkbox_input:focus,.cke_skin_office2003 .cke_browser_opera .cke_dialog_ui_radio_input:focus,.cke_skin_office2003 .cke_browser_gecko .cke_dialog_ui_input_select:focus,.cke_skin_office2003 .cke_browser_gecko .cke_btn_over,.cke_skin_office2003 .cke_browser_opera .cke_btn_over,.cke_skin_office2003 .cke_browser_ie .cke_btn_over{outline:1px dotted #696969;}.cke_skin_office2003 .cke_browser_ie .cke_dialog_ui_checkbox_input,.cke_skin_office2003 .cke_browser_ie .cke_dialog_ui_ratio_input,.cke_skin_office2003 .cke_browser_ie .cke_btn_reset,.cke_skin_office2003 .cke_browser_ie .cke_btn_locked,.cke_skin_office2003 .cke_browser_ie .cke_btn_unlocked{*border:1px solid transparent!important;-border:1px solid red!important;-filter:chroma(color=red);}.cke_skin_office2003 .cke_browser_ie .cke_dialog_ui_focused,.cke_skin_office2003 .cke_browser_ie .cke_btn_over{*border:1px dotted #696969!important;}.cke_skin_office2003 .cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity=0);width:100%;height:100%;}
-.cke_dialog label{display:inline;margin-bottom:auto;cursor:default;}
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+body .cke_dialog{visibility:visible;}.cke_skin_office2003 table.cke_dialog.cke_browser_gecko{display:block;}.cke_skin_office2003 .cke_dialog_body{margin-left:16px;margin-right:16px;margin-top:2px;margin-bottom:20px;z-index:1;_position:static;}.cke_skin_office2003 .cke_dialog_tl,.cke_skin_office2003 .cke_dialog_tr,.cke_skin_office2003 .cke_dialog_tc,.cke_skin_office2003 .cke_dialog_bl,.cke_skin_office2003 .cke_dialog_br,.cke_skin_office2003 .cke_dialog_bc{background-image:url(images/sprites.png);background-repeat:no-repeat;position:absolute;_background-image:url(images/sprites_ie6.png);z-index:-1;}.cke_skin_office2003 .cke_dialog_tl{background-position:-16px -16px;height:16px;width:16px;top:0;left:0;}.cke_skin_office2003 .cke_rtl .cke_dialog_tl{background-position:-16px -397px;}.cke_skin_office2003 .cke_dialog_tr{background-position:-16px -76px;height:16px;width:16px;top:0;right:0;}.cke_skin_office2003 .cke_rtl .cke_dialog_tr{background-position:-16px -457px;}.cke_skin_office2003 .cke_dialog_tc{background-position:0 -136px;background-repeat:repeat-x;height:16px;top:0;left:16px;right:16px;}.cke_skin_office2003 .cke_dialog_bl{background-position:-16px -196px;height:51px;width:30px;bottom:0;left:0;}.cke_skin_office2003 .cke_rtl .cke_dialog_bl{background-position:-16px -517px;}.cke_skin_office2003 .cke_dialog_br{background-position:-16px -263px;height:51px;width:30px;bottom:0;right:0;}.cke_skin_office2003 .cke_rtl .cke_dialog_br{background-position:-16px -584px;}.cke_skin_office2003 .cke_dialog_bc{background-position:0 -330px;background-repeat:repeat-x;height:51px;bottom:0;left:30px;right:30px;}.cke_skin_office2003 .cke_dialog_ml,.cke_skin_office2003 .cke_dialog_mr{background-image:url(images/dialog_sides.png);background-repeat:repeat-y;position:absolute;width:16px;top:16px;bottom:51px;_background-image:url(images/dialog_sides.gif);_top:auto;}.cke_skin_office2003 .cke_rtl .cke_dialog_ml,.cke_skin_office2003 .cke_rtl .cke_dialog_mr{background-image:url(images/dialog_sides_rtl.png);_background-image:url(images/dialog_sides.gif);}.cke_skin_office2003 .cke_dialog_ml{background-position:0 0;left:0;}.cke_skin_office2003 .cke_dialog_mr{background-position:-16px 0;right:0;}.cke_skin_office2003 .cke_browser_iequirks .cke_dialog_ml,.cke_skin_office2003 .cke_browser_iequirks .cke_dialog_mr{margin-top:3px;}.cke_skin_office2003 .cke_dialog_title{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -678px;background-repeat:repeat-x;font-weight:bold;font-size:14pt;color:#0E3460;background-color:#8db1ff;padding:3px 10px 26px 10px;cursor:move;position:relative;}.cke_skin_office2003 .cke_browser_ie.cke_rtl .cke_dialog_title{position:static;}.cke_skin_office2003 .cke_dialog_contents{background-color:#f7f8fd;border:#2b66c9 1px solid;overflow:auto;padding:5px 10px;}.cke_skin_office2003 .cke_dialog_footer{background-color:#8db1ff;text-align:right;}.cke_skin_office2003 .cke_rtl .cke_dialog_footer{text-align:left;}.cke_skin_office2003 .cke_dialog_footer .cke_resizer{margin-top:21px;}.cke_skin_office2003 .cke_dialog_tabs{height:23px;background-color:#8db1ff;display:inline-block;margin-left:10px;margin-right:10px;margin-top:-23px;position:absolute;z-index:2;}.cke_skin_office2003 .cke_rtl .cke_dialog_tabs{right:10px;}.cke_skin_office2003 a.cke_dialog_tab,.cke_skin_office2003 a:link.cke_dialog_tab,.cke_skin_office2003 a:active.cke_dialog_tab,.cke_skin_office2003 a:hover.cke_dialog_tab,.cke_skin_office2003 a:visited.cke_dialog_tab{color:#0E3460;border-left:1px solid #2b66c9;border-right:1px solid #2b66c9;border-top:1px solid #2b66c9;height:14px;padding:4px 5px;display:inline-block;cursor:pointer;}.cke_skin_office2003 .cke_browser_gecko18 a.cke_dialog_tab,.cke_skin_office2003 .cke_browser_gecko18 a:link.cke_dialog_tab,.cke_skin_office2003 .cke_browser_gecko18 a:active.cke_dialog_tab,.cke_skin_office2003 .cke_browser_gecko18 a:hover.cke_dialog_tab,.cke_skin_office2003 .cke_browser_gecko18 a:visited.cke_dialog_tab{display:inline;position:relative;top:6px;}.cke_skin_office2003 a:hover.cke_dialog_tab{background-color:#f7f8fd;}
+.cke_skin_office2003 .cke_hc a:hover.cke_dialog_tab{padding:2px 3px!important;border-width:3px;}.cke_skin_office2003 a.cke_dialog_tab_selected,.cke_skin_office2003 a:link.cke_dialog_tab_selected,.cke_skin_office2003 a:active.cke_dialog_tab_selected,.cke_skin_office2003 a:hover.cke_dialog_tab_selected,.cke_skin_office2003 a:visited.cke_dialog_tab_selected{border-bottom:1px solid #f7f8fd;background-color:#f7f8fd;font-weight:bold;cursor:default;}.cke_skin_office2003 .cke_hc a.cke_dialog_tab_selected,.cke_skin_office2003 .cke_hc a:link.cke_dialog_tab_selected,.cke_skin_office2003 .cke_hc a:active.cke_dialog_tab_selected,.cke_skin_office2003 .cke_hc a:hover.cke_dialog_tab_selected,.cke_skin_office2003 .cke_hc a:visited.cke_dialog_tab_selected{padding:2px 3px!important;border-width:3px;}.cke_skin_office2003 .cke_single_page .cke_dialog_tabs{display:none;}.cke_skin_office2003 .cke_hc .cke_dialog_tabs a,.cke_skin_office2003 .cke_hc .cke_dialog_footer a{opacity:1.0;filter:alpha(opacity=100);border:1px solid white;}.cke_skin_office2003 .cke_single_page .cke_dialog_title{padding-bottom:3px;}.cke_skin_office2003 .cke_dialog_ui_vbox table,.cke_skin_office2003 .cke_dialog_ui_hbox table{margin:auto;}.cke_skin_office2003 .cke_dialog_ui_vbox_child{padding:5px 0;}.cke_skin_office2003 input.cke_dialog_ui_input_text,.cke_skin_office2003 input.cke_dialog_ui_input_password{background-color:white;border:none;padding:0;width:100%;height:14px;}.cke_skin_office2003 div.cke_dialog_ui_input_text,.cke_skin_office2003 div.cke_dialog_ui_input_password{background-color:white;border:1px solid #a0a0a0;padding:1px 0;_width:99.9%;}.cke_skin_office2003 .cke_browser_ie7 input.cke_dialog_ui_input_text,.cke_skin_office2003 .cke_browser_ie7 input.cke_dialog_ui_input_password{position:absolute;}.cke_skin_office2003 .cke_browser_ie7 div.cke_dialog_ui_input_text,.cke_skin_office2003 .cke_browser_ie7 div.cke_dialog_ui_input_password{height:14px;position:relative;}.cke_skin_office2003 .cke_browser_ie.cke_rtl input.cke_dialog_ui_input_text,.cke_skin_office2003 .cke_browser_opera.cke_rtl input.cke_dialog_ui_input_text,.cke_skin_office2003 .cke_browser_ie.cke_rtl input.cke_dialog_ui_input_password,.cke_skin_office2003 .cke_browser_opera.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px;}.cke_skin_office2003 .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_text,.cke_skin_office2003 .cke_browser_opera.cke_rtl div.cke_dialog_ui_input_text,.cke_skin_office2003 .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_password,.cke_skin_office2003 .cke_browser_opera.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px;}.cke_skin_office2003 .cke_browser_ie.cke_rtl .cke_dialog_ui_vbox_child,.cke_skin_office2003 .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_child,.cke_skin_office2003 .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_first,.cke_skin_office2003 .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important;}.cke_skin_office2003 .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px;}.cke_skin_office2003 .cke_browser_gecko.cke_hc div.cke_dialog_ui_input_text,.cke_skin_office2003 .cke_browser_gecko.cke_hc div.cke_dialog_ui_input_password{border-width:0;}.cke_skin_office2003 .cke_browser_gecko18.cke_hc div.cke_dialog_ui_input_text,.cke_skin_office2003 .cke_browser_gecko18.cke_hc div.cke_dialog_ui_input_password{border-width:1px;}.cke_skin_office2003 textarea.cke_dialog_ui_input_textarea{background-color:white;border:none;padding:0;width:100%;_width:99%;overflow:auto;resize:none;}.cke_skin_office2003 div.cke_dialog_ui_input_textarea{background-color:white;border:1px solid #a0a0a0;padding:1px 0;}.cke_skin_office2003 .cke_rtl .cke_dialog_ui_labeled_content{_width:95%;}.cke_skin_office2003 div.cke_disabled .cke_dialog_ui_labeled_content *{background-color:#a0a0a0;cursor:default;}.cke_skin_office2003 .cke_dialog_ui_hbox{width:100%;}.cke_skin_office2003 .cke_dialog_ui_hbox_first,.cke_skin_office2003 .cke_dialog_ui_hbox_child,.cke_skin_office2003 .cke_dialog_ui_hbox_last{vertical-align:top;}.cke_skin_office2003 .cke_ltr .cke_dialog_ui_hbox_first,.cke_skin_office2003 .cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px;}
+.cke_skin_office2003 .cke_rtl .cke_dialog_ui_hbox_first,.cke_skin_office2003 .cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px;}.cke_skin_office2003 a.cke_dialog_ui_button{border-collapse:separate;cursor:default;}.cke_skin_office2003 a.cke_dialog_ui_button_ok span,.cke_skin_office2003 a.cke_dialog_ui_button_cancel span{width:60px;}.cke_skin_office2003 span.cke_dialog_ui_button{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -678px;background-repeat:repeat-x;border:#0E3460 1px solid;padding:2px 10px;text-align:center;color:#0E3460;background-color:#8db1ff;display:inline-block;cursor:default;}.cke_skin_office2003 .cke_browser_gecko18 .cke_dialog_footer_buttons span.cke_dialog_ui_button{display:block;}.cke_skin_office2003 a.cke_dialog_ui_button span.cke_disabled{border:#898980 1px solid;color:#5e5e55;background-color:#c5c5b3;}.cke_skin_office2003 a:focus span.cke_dialog_ui_button,.cke_skin_office2003 a:active span.cke_dialog_ui_button{background-color:#8db1ff;}.cke_skin_office2003 .cke_hc a:focus span.cke_dialog_ui_button,.cke_skin_office2003 .cke_hc a:active span.cke_dialog_ui_button{border-width:2px;}.cke_skin_office2003 .cke_dialog_footer_buttons{display:inline-table;margin-right:12px;margin-left:12px;width:auto;position:relative;}.cke_skin_office2003 .cke_browser_gecko18 .cke_dialog_footer_buttons{display:inline;}.cke_skin_office2003 .cke_dialog_footer_buttons span.cke_dialog_ui_button{margin:7px 0;}.cke_skin_office2003 .cke_browser_ie7 .cke_dialog_footer_buttons{position:static;}.cke_skin_office2003 strong{font-weight:bold;}.cke_skin_office2003 a.cke_dialog_close_button,.cke_skin_office2003 a:hover.cke_dialog_close_button,.cke_skin_office2003 .cke_browser_ie6 a.cke_dialog_close_button,.cke_skin_office2003 .cke_browser_ie6 a:hover.cke_dialog_close_button{background-image:url(images/sprites.png);background-repeat:no-repeat;background-position:-20px -655px;position:absolute;cursor:pointer;text-align:center;height:21px;width:21px;top:4px;_background-image:url(images/sprites_ie6.png);}.cke_skin_office2003 a.cke_dialog_close_button span{display:none;}.cke_skin_office2003 .cke_ltr a.cke_dialog_close_button{right:22px;}.cke_skin_office2003 .cke_rtl a.cke_dialog_close_button,.cke_skin_office2003 .cke_rtl a:hover.cke_dialog_close_button{left:16px;_top:6px;}.cke_skin_office2003 .cke_browser_ie6.cke_rtl a.cke_dialog_close_button,.cke_skin_office2003 .cke_browser_ie6.cke_rtl a:hover.cke_dialog_close_button{position:relative;float:left;margin-top:-55px;margin-left:-7px;}.cke_skin_office2003 .cke_browser_iequirks.cke_rtl.cke_single_page a.cke_dialog_close_button,.cke_skin_office2003 .cke_browser_iequirks.cke_rtl.cke_single_page a:hover.cke_dialog_close_button{margin-top:-32px;}.cke_skin_office2003 .cke_browser_iequirks.cke_ltr a.cke_dialog_close_button,.cke_skin_office2003 .cke_browser_iequirks.cke_ltr a:hover.cke_dialog_close_button{margin-top:0;}.cke_skin_office2003 .cke_dialog_ui_input_select{border:1px solid #a0a0a0;background-color:white;}.cke_skin_office2003 .cke_dialog_ui_input_file{width:100%;height:25px;}.cke_skin_office2003 .cke_dialog .cke_dark_background{background-color:#eaead1;}.cke_skin_office2003 .cke_dialog .cke_hand{cursor:pointer;}.cke_skin_office2003 .cke_dialog .cke_centered{text-align:center;}.cke_skin_office2003 .cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px;}.cke_skin_office2003 .cke_rtl .cke_dialog a.cke_btn_reset{float:left;}.cke_skin_office2003 .cke_dialog a.cke_btn_locked,.cke_skin_office2003 .cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px;}.cke_skin_office2003 .cke_dialog a.cke_btn_locked .cke_icon{display:none;}.cke_skin_office2003 .cke_rtl .cke_dialog a.cke_btn_locked,.cke_skin_office2003 .cke_rtl .cke_dialog a.cke_btn_unlocked{float:right;}.cke_skin_office2003 .cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.gif);}
+.cke_skin_office2003 .cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer;}.cke_skin_office2003 .cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:210px;width:230px;padding:2px;background-color:white;}.cke_skin_office2003 .cke_dialog .ImagePreviewBox table td{white-space:normal;}.cke_skin_office2003 .cke_browser_iequirks .cke_dialog_page_contents{_position:absolute;}.cke_skin_office2003 .cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity=90);background-color:#e4e4e4;}.cke_skin_office2003 .cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white;}.cke_skin_office2003 .cke_dialog .cke_pastetext{width:346px;height:170px;}.cke_skin_office2003 .cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none;}.cke_skin_office2003 .cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid black;}.cke_skin_office2003 .cke_dialog .cke_dark_background{text-align:center;background-color:#eaead1;font-size:14px;}.cke_skin_office2003 .cke_dialog .cke_light_background{text-align:center;background-color:#ffffbe;}.cke_skin_office2003 .cke_dialog .cke_hand{cursor:pointer;}.cke_skin_office2003 .cke_disabled{color:#a0a0a0;}.cke_skin_office2003 .cke_hc .cke_dialog_title,.cke_skin_office2003 .cke_hc .cke_dialog_tabs,.cke_skin_office2003 .cke_hc .cke_dialog_contents,.cke_skin_office2003 .cke_hc .cke_dialog_footer{border-left:1px solid;border-right:1px solid;}.cke_skin_office2003 .cke_hc .cke_dialog_title{border-top:1px solid;}.cke_skin_office2003 .cke_hc .cke_dialog_footer{border-bottom:1px solid;}.cke_skin_office2003 .cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px;}.cke_skin_office2003 .cke_dialog_body .cke_label{display:none;}.cke_skin_office2003 .cke_dialog_body label.cke_required{font-weight:bold;}.cke_skin_office2003 .cke_hc .cke_dialog_body .cke_label{display:inline;cursor:inherit;}.cke_skin_office2003 .cke_hc a.cke_btn_locked,.cke_skin_office2003 .cke_hc a.cke_btn_unlocked,.cke_skin_office2003 .cke_hc a.cke_btn_reset{border-style:solid;float:left;width:auto;height:auto;padding:0 2px;}.cke_skin_office2003 .cke_hc a.cke_btn_locked .cke_icon{display:inline;}.cke_skin_office2003 .cke_rtl.cke_hc a.cke_btn_locked,.cke_skin_office2003 .cke_rtl.cke_hc a.cke_btn_unlocked,.cke_skin_office2003 .cke_rtl.cke_hc a.cke_btn_reset{float:right;}.cke_skin_office2003 .cke_dialog_contents a.colorChooser{display:block;margin-top:12px;margin-left:10px;width:40px;}.cke_skin_office2003 .cke_dialog_contents a.colorChooser .cke_dialog_ui_button{width:100%;}.cke_skin_office2003 .cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px;}.cke_skin_office2003 .cke_browser_gecko .cke_dialog_ui_checkbox_input:focus,.cke_skin_office2003 .cke_browser_gecko .cke_dialog_ui_radio_input:focus,.cke_skin_office2003 .cke_browser_opera .cke_dialog_ui_checkbox_input:focus,.cke_skin_office2003 .cke_browser_opera .cke_dialog_ui_radio_input:focus,.cke_skin_office2003 .cke_browser_gecko .cke_dialog_ui_input_select:focus,.cke_skin_office2003 .cke_browser_gecko .cke_btn_over,.cke_skin_office2003 .cke_browser_opera .cke_btn_over,.cke_skin_office2003 .cke_browser_ie .cke_btn_over{outline:1px dotted #696969;}.cke_skin_office2003 .cke_browser_ie .cke_dialog_ui_checkbox_input,.cke_skin_office2003 .cke_browser_ie .cke_dialog_ui_ratio_input,.cke_skin_office2003 .cke_browser_ie .cke_btn_reset,.cke_skin_office2003 .cke_browser_ie .cke_btn_locked,.cke_skin_office2003 .cke_browser_ie .cke_btn_unlocked{*border:1px solid transparent!important;-border:1px solid red!important;-filter:chroma(color=red);}.cke_skin_office2003 .cke_browser_ie .cke_dialog_ui_focused,.cke_skin_office2003 .cke_browser_ie .cke_btn_over{*border:1px dotted #696969!important;}.cke_skin_office2003 .cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity=0);width:100%;height:100%;}
+.cke_dialog label{display:inline;margin-bottom:auto;cursor:default;}
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/skins/office2003/editor.css b/sm-shop/src/main/webapp/resources/js/ckeditor/skins/office2003/editor.css
index 632191c..fcdb0a1 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/skins/office2003/editor.css
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/skins/office2003/editor.css
@@ -1,14 +1,14 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-.cke_skin_office2003 *,.cke_skin_office2003 a:hover,.cke_skin_office2003 a:link,.cke_skin_office2003 a:visited,.cke_skin_office2003 a:active{margin:0;padding:0;border:0;background:transparent;text-decoration:none;font:normal normal normal 100% Sans-Serif;width:auto;height:auto;border-collapse:collapse;text-align:left;vertical-align:baseline;white-space:nowrap;cursor:auto;color:#000;float:none;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;}.cke_skin_office2003 .cke_rtl *,.cke_skin_office2003 .cke_rtl a:hover,.cke_skin_office2003 .cke_rtl a:link,.cke_skin_office2003 .cke_rtl a:visited,.cke_skin_office2003 .cke_rtl a:active,.cke_rtl .cke_skin_office2003 *,.cke_rtl .cke_skin_office2003 a:hover,.cke_rtl .cke_skin_office2003 a:link,.cke_rtl .cke_skin_office2003 a:visited,.cke_rtl .cke_skin_office2003 a:active{text-align:right;}.cke_skin_office2003 iframe{vertical-align:inherit;}.cke_skin_office2003 textarea{white-space:pre;}.cke_skin_office2003 .cke_browser_gecko textarea{cursor:text;}.cke_skin_office2003 .cke_browser_gecko textarea[disabled]{cursor:default;}.cke_skin_office2003 input[type="text"],.cke_skin_office2003 input[type="password"]{cursor:text;}.cke_skin_office2003 input[type="text"][disabled],.cke_skin_office2003 input[type="password"][disabled]{cursor:default;}.cke_skin_office2003 fieldset{padding:10px;border:2px groove #E0DFE3;}.cke_skin_office2003 .cke_editor{display:inline-table;width:100%;}.cke_skin_office2003 .cke_browser_webkit .cke_editor{display:table;}.cke_skin_office2003 span.cke_browser_webkit,.cke_skin_office2003 span.cke_browser_gecko18{display:block;}.cke_skin_office2003,.cke_skin_office2003 .cke_wrapper{display:block;}.cke_skin_office2003 .cke_top,.cke_skin_office2003 .cke_bottom,.cke_shared .cke_skin_office2003{background-color:#f7f8fd;}.cke_skin_office2003 .cke_top{border-top:solid 1px #fafaf5;border-left:solid 1px #fafaf5;border-right:solid 1px #696969;border-bottom:solid 2px #696969;}.cke_skin_office2003 .cke_rtl .cke_top{border-left:solid 1px #696969;border-right:solid 1px #fafaf5;}.cke_skin_office2003 .cke_bottom{border-left:solid 1px #696969;border-right:solid 1px #696969;border-bottom:solid 1px #696969;}.cke_skin_office2003 .cke_contents{border:solid 1px #696969;background-color:white;}.cke_skin_office2003 .cke_focus{outline:auto 5px -webkit-focus-ring-color;}.cke_skin_office2003 textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;white-space:pre;background-color:#fff;}.cke_skin_office2003 .cke_browser_iequirks textarea.cke_source{_white-space:normal;}.cke_skin_office2003 .cke_resizer{width:12px;height:12px;margin-top:16px;display:block;float:right;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -1088px;background-repeat:no-repeat;cursor:se-resize;}.cke_skin_office2003 .cke_browser_air .cke_resizer,.cke_skin_office2003 .cke_browser_air .cke_rtl .cke_resizer{cursor:move;}.cke_skin_office2003 .cke_resizer_rtl{cursor:sw-resize;background-position:0 -1115px;float:left;}.cke_skin_office2003 .cke_resizer_horizontal,.cke_skin_office2003 .cke_rtl .cke_resizer_horizontal{cursor:e-resize;}.cke_skin_office2003 .cke_resizer_vertical,.cke_skin_office2003 .cke_rtl .cke_resizer_vertical{cursor:n-resize;}.cke_skin_office2003 .cke_maximized .cke_resizer{display:none;}.cke_skin_office2003 .cke_browser_ie6 .cke_contents textarea,.cke_skin_office2003 .cke_browser_ie7 .cke_contents textarea{position:absolute;}.cke_skin_office2003 .cke_voice_label{display:none;}.cke_skin_office2003 legend.cke_voice_label{display:none;}.cke_skin_office2003 .cke_browser_ie legend.cke_voice_label{position:absolute;display:block;width:0;height:0;overflow:hidden;}.cke_skin_office2003 .cke_panel{border:1px solid #8f8f73;background-color:#fff;width:120px;height:100px;overflow:hidden;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.cke_skin_office2003 .cke_panel iframe{width:100%;height:100%;}cke_skin_office2003 .cke_panel_frame .cke_label{display:none;}html.cke_skin_office2003_container{overflow:auto;overflow-x:hidden;}
-body.cke_panel_frame{overflow:auto;}ul.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap;}li.cke_panel_listItem{margin:0;}.cke_panel_listItem a{padding:2px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;}* html .cke_panel_listItem a{width:100%;color:#000;}*:first-child+html .cke_panel_listItem a{color:#000;}.cke_panel_listItem.cke_selected a{border:1px solid #ccc;background-color:#e9f5ff;}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#316ac5;background-color:#dff1ff;}.cke_hc .cke_panel_listItem.cke_selected a,.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border-width:3px;padding:0;}.cke_panel_grouptitle{font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;font-weight:bold;white-space:nowrap;background-color:#dcdcdc;color:#000;margin:0;padding:3px;}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:3px;margin-bottom:3px;}.cke_skin_office2003 .cke_button_textcolor_panel,.cke_skin_office2003 .cke_button_bgcolor_panel{width:150px;height:135px;}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000;}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left;}.cke_rtl span.cke_colorbox{float:right;}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;}.cke_rtl a.cke_colorbox{float:right;}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#316ac5 1px solid;background-color:#dff1ff;}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer;}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#316ac5 1px solid;background-color:#dff1ff;}@media print{.cke_skin_office2003 .cke_toolbox{display:none;}}.cke_skin_office2003 .cke_browser_webkit .cke_toolbox,.cke_skin_office2003 .cke_browser_webkit .cke_toolbox>span{white-space:normal;}.cke_skin_office2003 .cke_toolbox{clear:both;padding-bottom:1px;}.cke_skin_office2003 a.cke_toolbox_collapser,.cke_skin_office2003 a:hover.cke_toolbox_collapser{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:3px -1026px;background-repeat:no-repeat;width:11px;height:11px;float:right;border:outset 1px;margin:11px 2px 2px;cursor:pointer;}.cke_skin_office2003 .cke_rtl a.cke_toolbox_collapser,.cke_skin_office2003 .cke_rtl a:hover.cke_toolbox_collapser{float:left;}.cke_skin_office2003 a.cke_toolbox_collapser span{display:none;}.cke_skin_office2003 .cke_hc a.cke_toolbox_collapser span{font-size:10px;font-weight:bold;font-family:Arial;display:inline;}.cke_skin_office2003 a.cke_toolbox_collapser_min,.cke_skin_office2003 a:hover.cke_toolbox_collapser_min{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:4px -1047px;background-repeat:no-repeat;margin:2px;}.cke_skin_office2003 .cke_rtl a.cke_toolbox_collapser_min,.cke_skin_office2003 .cke_rtl a:hover.cke_toolbox_collapser_min{background-position:4px -1068px;}.cke_skin_office2003 .cke_toolbar{background-color:#d6dff7;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -962px;background-repeat:repeat-x;display:inline-block;float:left;!height:28px;!line-height:28px;}.cke_skin_office2003 .cke_rtl .cke_toolbar{float:right;}.cke_skin_office2003 .cke_toolgroup{display:inline-block;float:left;height:28px;}.cke_skin_office2003 .cke_browser_ie .cke_toolgroup{#float:none;#display:inline;}.cke_skin_office2003 .cke_rtl .cke_toolgroup{float:right;}.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_toolgroup{#float:none;}.cke_skin_office2003 .cke_separator{display:inline-block;float:left;border-left:solid 1px #B2CBFF;margin:6px 2px;height:16px;}
-.cke_skin_office2003 .cke_browser_ie .cke_separator{#float:none;#display:inline;}.cke_skin_office2003 .cke_rtl .cke_separator{float:right;}.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_separator{#float:none;}.cke_skin_office2003 .cke_break{clear:left;}.cke_skin_office2003 .cke_rtl .cke_break{clear:right;}.cke_skin_office2003 .cke_toolbar_start{display:inline-block;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:no-repeat;background-position:-27px -765px;width:10px;height:28px;float:left;}.cke_skin_office2003 .cke_browser_ie .cke_toolbar_start{#float:none;#display:inline;}.cke_skin_office2003 .cke_rtl .cke_toolbar_start{background-position:-27px -816px;float:right;}.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_toolbar_start{#float:none;}.cke_skin_office2003 .cke_toolbar_end{display:inline-block;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:no-repeat;background-position:-29px -861px;width:4px;height:28px;float:left;}.cke_skin_office2003 .cke_browser_ie .cke_toolbar_end{#float:none;#display:inline;}.cke_skin_office2003 .cke_rtl .cke_toolbar_end{background-position:-29px -907px;float:right;}.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_toolbar_end{#float:none;}.cke_skin_office2003 .cke_browser_ie9 .cke_rtl .cke_separator,.cke_skin_office2003 .cke_browser_ie9 .cke_rtl .cke_toolbar_start,.cke_skin_office2003 .cke_browser_ie9 .cke_rtl .cke_toolbar_end{vertical-align:middle;}.cke_skin_office2003 .cke_button a,.cke_skin_office2003 .cke_button a:hover,.cke_skin_office2003 .cke_button a:focus,.cke_skin_office2003 .cke_button a:active,.cke_skin_office2003 .cke_button a.cke_off{border:solid 1px transparent;border-radius:3px;outline:none;padding-top:2px;padding-left:4px;padding-right:4px;padding-bottom:2px;margin-top:2px;height:18px;vertical-align:top;_border:none;_margin:3px 1px 1px 1px;cursor:default;display:inline-block;}.cke_skin_office2003 .cke_button a,.cke_skin_office2003 .cke_button a.cke_off{filter:alpha(opacity=70);opacity:.70;-moz-border-radius:3px;-webkit-border-radius:3px;}.cke_skin_office2003 .cke_hc .cke_button a,.cke_skin_office2003 .cke_hc .cke_button a.cke_off{opacity:1.0;filter:alpha(opacity=100);_border:1px solid transparent;}.cke_skin_office2003 .cke_button a.cke_on{border:solid 1px #316ac5;background-color:#c1d2ee;filter:alpha(opacity=100);opacity:1;_margin:2px 0 0 0;}.cke_skin_office2003 .cke_hc .cke_button a:hover,.cke_skin_office2003 .cke_hc .cke_button a:focus,.cke_skin_office2003 .cke_hc .cke_button a:active{padding:0 2px!important;border-width:3px;}.cke_skin_office2003 .cke_button a.cke_disabled *{filter:alpha(opacity=30);opacity:.3;}.cke_skin_office2003 .cke_browser_ie .cke_button a.cke_disabled *,.cke_skin_office2003 .cke_browser_ie a:hover.cke_button .cke_disabled *{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale'), alpha(opacity=30);}.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_button a.cke_disabled *,.cke_skin_office2003 .cke_browser_ie .cke_rtl a:hover.cke_button .cke_disabled *{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale'), alpha(opacity=30);}.cke_skin_office2003 .cke_browser_ie6 .cke_button a.cke_disabled *,.cke_skin_office2003 .cke_browser_ie6 a:hover.cke_button .cke_disabled *,.cke_skin_office2003 .cke_browser_ie .cke_button.cke_noalphafix a.cke_disabled *{filter:alpha(opacity=30);}.cke_skin_office2003 .cke_hc .cke_button a.cke_disabled *,.cke_skin_office2003 .cke_browser_ie.cke_hc a:hover.cke_button .cke_disabled *{filter:alpha(opacity=60);opacity:.6;}.cke_skin_office2003 .cke_button a:hover,.cke_skin_office2003 .cke_button a:focus,.cke_skin_office2003 .cke_button a:active{border:solid 1px #316ac5;background-color:#dff1ff;filter:alpha(opacity=100);opacity:1;vertical-align:top;_margin:2px 0 0 0;padding:2px 4px;}.cke_skin_office2003 .cke_button .cke_icon{background-image:url(icons.png);background-position:100px;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;display:inline-block;cursor:default;}
-.cke_skin_office2003 .cke_rtl .cke_button .cke_icon{background-image:url(icons_rtl.png);}.cke_skin_office2003 .cke_browser_ie .cke_button .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_button .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_skin_office2003 .cke_browser_ie6 .cke_button .cke_icon,.cke_skin_office2003 .cke_browser_ie6 .cke_rtl .cke_button .cke_icon,.cke_skin_office2003 .cke_browser_ie .cke_button.cke_noalphafix .cke_icon,.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_button.cke_noalphafix .cke_icon{filter:;}.cke_skin_office2003 .cke_button .cke_label{display:none;padding-left:3px;cursor:default;vertical-align:middle;_background-image:url(images/sprites_ie6.png);_background-position:0 -970px;_background-repeat:repeat-x;}.cke_skin_office2003 .cke_button a:hover .cke_label{_background-color:#dff1ff;_background-image:none;}.cke_skin_office2003 .cke_button a.cke_on .cke_label{_background-color:#c1d2ee;_background-image:none;}.cke_skin_office2003 .cke_hc .cke_button .cke_label{padding:0;display:inline-block;}.cke_skin_office2003 .cke_hc .cke_button .cke_icon{display:none;}.cke_skin_office2003 .cke_accessibility{position:absolute;display:block;width:0;height:0;overflow:hidden;}.cke_skin_office2003 .cke_button .cke_buttonarrow{display:inline-block;height:18px;width:8px;background-position:2px -1004px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:no-repeat;cursor:default;}.cke_skin_office2003 .cke_browser_ie .cke_button .cke_buttonarrow{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_skin_office2003 .cke_browser_ie6 .cke_button .cke_buttonarrow{filter:;}.cke_skin_office2003 .cke_rtl .cke_button .cke_buttonarrow{background-position:0 -1004px;}.cke_skin_office2003 .cke_browser_gecko18 .cke_toolbar,.cke_skin_office2003 .cke_browser_gecko18 .cke_button a,.cke_skin_office2003 .cke_browser_gecko18 .cke_button a.cke_off,.cke_skin_office2003 .cke_browser_gecko18 .cke_button .cke_icon,.cke_skin_office2003 .cke_browser_gecko18 .cke_button .cke_buttonarrow,.cke_skin_office2003 .cke_browser_gecko18 .cke_separator,.cke_skin_office2003 .cke_browser_gecko18 .cke_toolbar_start,.cke_skin_office2003 .cke_browser_gecko18 .cke_toolbar_end{display:block;float:left;}.cke_skin_office2003 .cke_browser_gecko18 .cke_hc .cke_button .cke_icon{display:none;}.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_toolbar,.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_button a,.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_button a.cke_off,.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_button .cke_icon,.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_button .cke_buttonarrow,.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_separator,.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_toolbar_start,.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_toolbar_end{float:right;}.cke_skin_office2003 .cke_browser_gecko18 .cke_button .cke_label,.cke_skin_office2003 .cke_browser_gecko18 .cke_break{float:left;}.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl span.cke_inline_label{float:right;}.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_button .cke_label,.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_break{float:right;}.cke_skin_office2003 .cke_browser_gecko18 .cke_separator{margin-top:4px;}.cke_skin_office2003 .cke_browser_gecko18 .cke_button .cke_label{padding-top:3px;}.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_toolgroup,.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_separator,.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_toolbar_start,.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_toolbar_end{float:none;}.cke_skin_office2003 .cke_browser_ie8 .cke_toolbar,.cke_skin_office2003 .cke_browser_ie8 .cke_toolgroup{vertical-align:top;}.cke_skin_office2003 .cke_browser_iequirks.cke_browser_ie8 .cke_toolbar,.cke_skin_office2003 .cke_browser_iequirks.cke_browser_ie8 .cke_toolgroup{vertical-align:baseline;}
-.cke_skin_office2003 .cke_browser_iequirks .cke_separator{vertical-align:text-bottom;}.cke_skin_office2003 .cke_browser_ie .cke_rcombo,.cke_skin_office2003 .cke_browser_ie .cke_rcombo *{cursor:default;}.cke_skin_office2003 .cke_contextmenu{padding:2px;}.cke_skin_office2003 .cke_menuitem a{display:block;}.cke_skin_office2003 .cke_menuitem span{cursor:default;}.cke_skin_office2003 .cke_menuitem a:hover,.cke_skin_office2003 .cke_menuitem a:focus,.cke_skin_office2003 .cke_menuitem a:active{background-color:#8db1ff;display:block;}.cke_hc .cke_menuitem a:hover,.cke_hc .cke_menuitem a:focus,.cke_hc .cke_menuitem a:active{border:2px solid;}.cke_skin_office2003 .cke_menuitem .cke_icon{background-image:url(icons.png);background-position:100px;background-repeat:no-repeat;background-color:transparent;width:16px;height:16px;float:left;}.cke_rtl .cke_skin_office2003 .cke_menuitem .cke_icon{background-image:url(icons_rtl.png);}.cke_browser_ie .cke_skin_office2003 .cke_menuitem .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie.cke_rtl .cke_skin_office2003 .cke_menuitem .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie6 .cke_skin_office2003 .cke_menuitem .cke_icon,.cke_browser_ie .cke_skin_office2003 .cke_menuitem.cke_noalphafix .cke_icon{filter:;}.cke_skin_office2003 .cke_menuitem .cke_disabled .cke_icon{filter:alpha(opacity=70);opacity:.70;}.cke_browser_ie .cke_skin_office2003 .cke_menuitem .cke_disabled .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie.cke_rtl .cke_skin_office2003 .cke_menuitem .cke_disabled .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie6 .cke_skin_office2003 .cke_menuitem .cke_disabled .cke_icon,.cke_browser_ie .cke_skin_office2003 .cke_menuitem.cke_noalphafix .cke_disabled .cke_icon{filter:;}.cke_skin_office2003 .cke_menuitem .cke_icon_wrapper{background-color:#f7f8fd;border:solid 4px #f7f8fd;width:16px;height:16px;float:left;filter:alpha(opacity=70);opacity:.70;clear:both;}.cke_rtl .cke_skin_office2003 .cke_menuitem .cke_icon_wrapper{float:right;}.cke_skin_office2003 .cke_menuitem a:hover .cke_icon_wrapper,.cke_skin_office2003 .cke_menuitem a:focus .cke_icon_wrapper,.cke_skin_office2003 .cke_menuitem a:active .cke_icon_wrapper{background-color:#9d9d9d;border:solid 4px #9d9d9d;filter:alpha(opacity=70);opacity:.70;}.cke_skin_office2003 .cke_menuitem a:hover.cke_disabled .cke_icon_wrapper,.cke_skin_office2003 .cke_menuitem a:focus.cke_disabled .cke_icon_wrapper,.cke_skin_office2003 .cke_menuitem a:active.cke_disabled .cke_icon_wrapper{background-color:#f7f8fd;border:solid 4px #f7f8fd;}.cke_skin_office2003 .cke_menuitem .cke_label{display:block;padding-right:3px;padding-top:5px;padding-left:4px;height:19px;margin-left:24px;background-color:#fff;}.cke_skin_office2003 .cke_frameLoaded .cke_menuitem .cke_label{filter:alpha(opacity=70);opacity:.70;}.cke_rtl .cke_skin_office2003 .cke_menuitem .cke_label{padding-right:0;margin-left:0;padding-left:3px;margin-right:28px;}.cke_skin_office2003 .cke_menuitem a.cke_disabled .cke_label{filter:alpha(opacity=30);opacity:.30;}.cke_skin_office2003 .cke_menuitem a:hover .cke_label,.cke_skin_office2003 .cke_menuitem a:focus .cke_label,.cke_skin_office2003 .cke_menuitem a:active .cke_label{background-color:#8db1ff;}.cke_skin_office2003 .cke_menuitem a.cke_disabled:hover .cke_label,.cke_skin_office2003 .cke_menuitem a.cke_disabled:focus .cke_label,.cke_skin_office2003 .cke_menuitem a.cke_disabled:active .cke_label{background-color:transparent;}.cke_skin_office2003 .cke_menuseparator{background-color:#f7f8fd;height:2px;filter:alpha(opacity=70);opacity:.70;_font-size:0;}.cke_skin_office2003 .cke_menuarrow{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -1071px;background-repeat:no-repeat;height:5px;width:3px;float:right;margin-right:2px;margin-top:3px;}.cke_rtl .cke_skin_office2003 .cke_menuarrow{float:left;margin-right:0;margin-left:2px;background-position:0 -1050px;}
-.cke_skin_office2003 .cke_menuarrow span{display:none;}.cke_hc .cke_skin_office2003 .cke_menuarrow{width:auto;margin-top:0;}.cke_hc .cke_skin_office2003 .cke_menuarrow span{display:inline;}.cke_browser_ie.cke_ltr .cke_skin_office2003 .cke_menuarrow{position:absolute;right:2px;}.cke_browser_ie.cke_rtl .cke_skin_office2003 .cke_menuarrow{position:absolute;left:2px;}.cke_skin_office2003 .cke_rcombo{display:inline-block;margin-left:2px;margin-right:2px;margin-top:2px;vertical-align:top;}.cke_skin_office2003 .cke_browser_ie .cke_rcombo{#display:inline;}.cke_skin_office2003 .cke_rcombopanel{border:1px solid #316ac5;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;}.cke_skin_office2003 .cke_rcombo a{display:inline-block;float:left;filter:alpha(opacity=70);opacity:.70;}.cke_skin_office2003 .cke_rtl .cke_rcombo a{float:right;}.cke_skin_office2003 .cke_hc .cke_rcombo a{filter:alpha(opacity=100);opacity:1.0;}.cke_skin_office2003 .cke_rcombo .cke_label{display:inline-block;float:left;cursor:default;line-height:24px;height:24px;vertical-align:top;padding-left:4px;padding-right:5px;filter:alpha(opacity=70);opacity:.70;_background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);_background-position:0 -962px;_background-repeat:repeat-x;}.cke_skin_office2003 .cke_rtl .cke_rcombo .cke_label{float:right;padding-right:4px;padding-left:5px;}.cke_skin_office2003 .cke_hc .cke_rcombo .cke_label{filter:alpha(opacity=100);opacity:1.0;}.cke_skin_office2003 .cke_rcombo .cke_inline_label{color:#fff;}.cke_skin_office2003 .cke_rcombo .cke_text{border:1px solid #8f8f73;background-color:#fff;height:14px;width:60px;padding-top:4px;padding-bottom:4px;padding-left:5px;padding-right:5px;text-overflow:ellipsis;overflow:hidden;display:inline-block;vertical-align:top;cursor:default;}.cke_skin_office2003 .cke_ltr .cke_rcombo .cke_text{-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;}.cke_skin_office2003 .cke_rtl .cke_rcombo .cke_text{-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;}.cke_skin_office2003 .cke_browser_iequirks .cke_rcombo .cke_text{height:22px;}.cke_skin_office2003 .cke_rcombo .cke_openbutton{display:inline-block;border-top:1px solid #8f8f73;border-bottom:1px solid #8f8f73;}.cke_skin_office2003 .cke_rcombo .cke_openbutton .cke_icon{display:inline-block;background-position:5px -1002px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:no-repeat;width:14px;height:22px;}.cke_skin_office2003 .cke_browser_iequirks .cke_rcombo .cke_openbutton .cke_icon{height:20px;}.cke_skin_office2003 .cke_browser_ie .cke_rcombo .cke_openbutton .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_skin_office2003 .cke_browser_ie6 .cke_rcombo .cke_openbutton .cke_icon{filter:;}.cke_skin_office2003 .cke_hc .cke_rcombo .cke_openbutton .cke_icon{background:none;filter:;}.cke_skin_office2003 .cke_ltr .cke_rcombo .cke_openbutton{border-right:1px solid #8f8f73;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;}.cke_skin_office2003 .cke_rtl .cke_rcombo .cke_openbutton{border-left:1px solid #8f8f73;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;}.cke_skin_office2003 .cke_rcombo .cke_off a:hover,.cke_skin_office2003 .cke_rcombo .cke_off a:focus,.cke_skin_office2003 .cke_rcombo .cke_off a:active,.cke_skin_office2003 .cke_rcombo .cke_on a{filter:alpha(opacity=100);opacity:1;}.cke_skin_office2003 .cke_rcombo .cke_off a:hover .cke_text,.cke_skin_office2003 .cke_rcombo .cke_off a:focus .cke_text,.cke_skin_office2003 .cke_rcombo .cke_off a:active .cke_text,.cke_skin_office2003 .cke_rcombo .cke_on .cke_text{border-color:#316ac5;}
-.cke_skin_office2003 .cke_rcombo .cke_off a:hover .cke_openbutton,.cke_skin_office2003 .cke_rcombo .cke_off a:focus .cke_openbutton,.cke_skin_office2003 .cke_rcombo .cke_off a:active .cke_openbutton,.cke_skin_office2003 .cke_rcombo .cke_on .cke_openbutton{border-color:#316ac5;background-color:#dff1ff;}.cke_skin_office2003 .cke_rcombo .cke_on .cke_text{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;}.cke_skin_office2003 .cke_rcombo .cke_on .cke_openbutton{-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;}.cke_skin_office2003 .cke_rcombo .cke_disabled .cke_label{filter:alpha(opacity=30);opacity:.3;}.cke_skin_office2003 .cke_hc .cke_rcombo .cke_disabled .cke_label{filter:alpha(opacity=70);opacity:.7;}.cke_skin_office2003 .cke_rcombo .cke_disabled .cke_text,.cke_skin_office2003 .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=50);opacity:.5;}.cke_skin_office2003 .cke_browser_ie .cke_rcombo .cke_disabled .cke_openbutton{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale'), alpha(opacity=50);}.cke_skin_office2003 .cke_browser_ie6 .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=50);}.cke_skin_office2003 .cke_hc .cke_rcombo .cke_disabled .cke_text,.cke_skin_office2003 .cke_hc .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=80);opacity:.8;}.cke_skin_office2003 .cke_rcombo .cke_disabled .cke_text{color:#fff;}.cke_skin_office2003 .cke_browser_gecko18 .cke_rcombo,.cke_skin_office2003 .cke_browser_gecko18 .cke_rcombo .cke_label,.cke_skin_office2003 .cke_browser_gecko18 .cke_rcombo .cke_text,.cke_skin_office2003 .cke_browser_gecko18 .cke_rcombo .cke_openbutton,.cke_skin_office2003 .cke_browser_webkit .cke_rcombo .cke_label,.cke_skin_office2003 .cke_browser_webkit .cke_rcombo .cke_text,.cke_skin_office2003 .cke_browser_webkit .cke_rcombo .cke_openbutton{display:block;float:left;}.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_rcombo,.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_rcombo .cke_label,.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_rcombo .cke_text,.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_rcombo .cke_openbutton,.cke_skin_office2003 .cke_browser_webkit .cke_rtl .cke_rcombo .cke_label,.cke_skin_office2003 .cke_browser_webkit .cke_rtl .cke_rcombo .cke_text,.cke_skin_office2003 .cke_browser_webkit .cke_rtl .cke_rcombo .cke_openbutton{float:right;}.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_rcombo,.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_rcombo a,.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_rcombo .cke_label{float:none;}.cke_skin_office2003 .cke_rtl .cke_rcombo .cke_font .cke_text,.cke_skin_office2003 .cke_rtl .cke_rcombo .cke_fontSize .cke_text{direction:ltr;}@media print{.cke_path{display:none;}}.cke_skin_office2003 .cke_path{padding:3px 3px 0 3px;display:inline-block;float:left;}.cke_skin_office2003 .cke_rtl .cke_path{float:right;}.cke_skin_office2003 .cke_path a,.cke_skin_office2003 .cke_path .cke_empty{display:inline-block;float:left;border:solid 1px #f7f8fd;background-color:#f7f8fd;padding-top:1px;padding-bottom:1px;padding-left:4px;padding-right:4px;margin-bottom:3px;cursor:default;}.cke_skin_office2003 .cke_path .cke_empty{visibility:hidden;}.cke_skin_office2003 .cke_rtl .cke_path a,.cke_skin_office2003 .cke_rtl .cke_path cke_empty{float:right;}.cke_skin_office2003 .cke_path a:hover,.cke_skin_office2003 .cke_path a:focus,.cke_skin_office2003 .cke_path a:active{border:solid 1px #316ac5;background-color:#dff1ff;padding-top:1px;padding-bottom:1px;padding-left:4px;padding-right:4px;outline:none;}.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_path a,.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_path .cke_empty{float:none;}.cke_skin_office2003 .cke_path .cke_label{display:none;}.cke_skin_office2003 .cke_button_source .cke_icon{background-position:0 0;}.cke_skin_office2003 .cke_button_docProps .cke_icon{background-position:0 -16px;}.cke_skin_office2003 .cke_button_newpage .cke_icon{background-position:0 -48px;}
-.cke_skin_office2003 .cke_button_preview .cke_icon{background-position:0 -64px;}.cke_skin_office2003 .cke_button_cut .cke_icon{background-position:0 -96px;}.cke_skin_office2003 .cke_button_copy .cke_icon{background-position:0 -112px;}.cke_skin_office2003 .cke_button_paste .cke_icon{background-position:0 -128px;}.cke_skin_office2003 .cke_button_pastetext .cke_icon{background-position:0 -144px;}.cke_skin_office2003 .cke_button_find .cke_icon{background-position:0 -240px;}.cke_skin_office2003 .cke_button_replace .cke_icon{background-position:0 -256px;}.cke_skin_office2003 .cke_button_selectAll .cke_icon{background-position:0 -272px;}.cke_skin_office2003 .cke_button_removeFormat .cke_icon{background-position:0 -288px;}.cke_skin_office2003 .cke_button_bold .cke_icon{background-position:0 -304px;}.cke_skin_office2003 .cke_button_italic .cke_icon{background-position:0 -320px;}.cke_skin_office2003 .cke_button_underline .cke_icon{background-position:0 -336px;}.cke_skin_office2003 .cke_button_strike .cke_icon{background-position:0 -352px;}.cke_skin_office2003 .cke_button_subscript .cke_icon{background-position:0 -368px;}.cke_skin_office2003 .cke_button_superscript .cke_icon{background-position:0 -384px;}.cke_skin_office2003 .cke_button_table .cke_icon{background-position:0 -608px;}.cke_skin_office2003 .cke_button_horizontalrule .cke_icon{background-position:0 -624px;}.cke_skin_office2003 .cke_button_smiley .cke_icon{background-position:0 -640px;}.cke_skin_office2003 .cke_button_link .cke_icon{background-position:0 -528px;}.cke_skin_office2003 .cke_button_unlink .cke_icon{background-position:0 -544px;}.cke_skin_office2003 .cke_button_anchor .cke_icon{background-position:0 -560px;}.cke_skin_office2003 .cke_button_image .cke_icon{background-position:0 -576px;}.cke_skin_office2003 .cke_button_flash .cke_icon{background-position:0 -592px;}.cke_skin_office2003 .cke_button_specialchar .cke_icon{background-position:0 -656px;}.cke_skin_office2003 .cke_button_pagebreak .cke_icon{background-position:0 -672px;}.cke_skin_office2003 .cke_button_print .cke_icon{background-position:0 -176px;}.cke_skin_office2003 .cke_button_checkspell .cke_icon,.cke_skin_office2003 .cke_button_scayt .cke_icon{background-position:0 -192px;}.cke_skin_office2003 .cke_button_pagebreak .cke_icon{background-position:0 -672px;}.cke_skin_office2003 .cke_button_textcolor .cke_icon{background-position:0 -704px;}.cke_skin_office2003 .cke_button_bgcolor .cke_icon{background-position:0 -720px;}.cke_skin_office2003 .cke_button_form .cke_icon{background-position:0 -752px;}.cke_skin_office2003 .cke_button_checkbox .cke_icon{background-position:0 -768px;}.cke_skin_office2003 .cke_button_radio .cke_icon{background-position:0 -784px;}.cke_skin_office2003 .cke_button_textfield .cke_icon{background-position:0 -800px;}.cke_skin_office2003 .cke_button_textarea .cke_icon{background-position:0 -816px;}.cke_skin_office2003 .cke_button_showblocks .cke_icon{background-position:0 -1136px;}.cke_skin_office2003 .cke_button_select .cke_icon{background-position:0 -832px;}.cke_skin_office2003 .cke_button_button .cke_icon{background-position:0 -848px;}.cke_skin_office2003 .cke_button_imagebutton .cke_icon{background-position:0 -864px;}.cke_skin_office2003 .cke_button_hiddenfield .cke_icon{background-position:0 -880px;}.cke_skin_office2003 .cke_button_undo .cke_icon{background-position:0 -208px;}.cke_skin_office2003 .cke_rtl .cke_button_undo .cke_icon{background-position:0 -224px;}.cke_skin_office2003 .cke_button_redo .cke_icon{background-position:0 -224px;}.cke_skin_office2003 .cke_rtl .cke_button_redo .cke_icon{background-position:0 -208px;}.cke_skin_office2003 .cke_button_templates .cke_icon{background-position:0 -80px;}.cke_skin_office2003 .cke_button_numberedlist .cke_icon{background-position:0 -400px;}.cke_skin_office2003 .cke_button_bulletedlist .cke_icon{background-position:0 -416px;}.cke_skin_office2003 .cke_mixed_dir_content .cke_button_numberedlist .cke_icon{background-position:0 -1217px;}.cke_skin_office2003 .cke_mixed_dir_content .cke_button_bulletedlist .cke_icon{background-position:0 -1233px;}
-.cke_skin_office2003 .cke_button_outdent .cke_icon{background-position:0 -432px;}.cke_skin_office2003 .cke_button_indent .cke_icon{background-position:0 -448px;}.cke_skin_office2003 .cke_mixed_dir_content .cke_button_indent .cke_icon{background-position:0 -1265px;}.cke_skin_office2003 .cke_mixed_dir_content .cke_button_outdent .cke_icon{background-position:0 -1249px;}.cke_skin_office2003 .cke_button_justifyleft .cke_icon{background-position:0 -464px;}.cke_skin_office2003 .cke_button_justifycenter .cke_icon{background-position:0 -480px;}.cke_skin_office2003 .cke_button_justifyright .cke_icon{background-position:0 -496px;}.cke_skin_office2003 .cke_button_justifyblock .cke_icon{background-position:0 -512px;}.cke_skin_office2003 .cke_button_blockquote .cke_icon{background-position:0 -1152px;}.cke_skin_office2003 .cke_button_flash .cke_icon{background-position:0 -592px;}.cke_skin_office2003 .cke_button_pastefromword .cke_icon{background-position:0 -160px;}.cke_skin_office2003 .cke_button_save .cke_icon{background-position:0 -32px;}.cke_skin_office2003 .cke_button_about .cke_icon{background-position:0 -736px;}.cke_skin_office2003 .cke_button_maximize .cke_icon{background-position:0 -1040px;}.cke_skin_office2003 .cke_button_creatediv .cke_icon{background-position:0 -1168px;}.cke_skin_office2003 .cke_button_editdiv .cke_icon{background-position:0 -1184px;}.cke_skin_office2003 .cke_button_removediv .cke_icon{background-position:0 -1200px;}.cke_skin_office2003 .cke_button_bidirtl .cke_icon{background-position:0 -1072px;}.cke_skin_office2003 .cke_button_bidiltr .cke_icon{background-position:0 -1056px;}.cke_skin_office2003 .cke_button_iframe .cke_icon{background-position:0 -1279px;}.cke_skin_office2003 .cke_button_source .cke_label{display:inline;}.cke_skin_office2003 .cke_styles_panel{width:150px;height:170px;}.cke_skin_office2003 .cke_format_panel{width:150px;height:170px;}.cke_skin_office2003 .cke_font_panel{width:150px;height:170px;}.cke_skin_office2003 .cke_fontSize_panel{height:170px;}.cke_skin_office2003 .cke_fontSize .cke_text{width:20px;}.cke_skin_office2003 .cke_browser_iequirks .cke_fontSize .cke_text{width:32px;}html .cke_skin_office2003{visibility:inherit;}html.cke_skin_office2003_container{visibility:visible;}
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+.cke_skin_office2003 *,.cke_skin_office2003 a:hover,.cke_skin_office2003 a:link,.cke_skin_office2003 a:visited,.cke_skin_office2003 a:active{margin:0;padding:0;border:0;background:transparent;text-decoration:none;font:normal normal normal 100% Sans-Serif;width:auto;height:auto;border-collapse:collapse;text-align:left;vertical-align:baseline;white-space:nowrap;cursor:auto;color:#000;float:none;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;}.cke_skin_office2003 .cke_rtl *,.cke_skin_office2003 .cke_rtl a:hover,.cke_skin_office2003 .cke_rtl a:link,.cke_skin_office2003 .cke_rtl a:visited,.cke_skin_office2003 .cke_rtl a:active,.cke_rtl .cke_skin_office2003 *,.cke_rtl .cke_skin_office2003 a:hover,.cke_rtl .cke_skin_office2003 a:link,.cke_rtl .cke_skin_office2003 a:visited,.cke_rtl .cke_skin_office2003 a:active{text-align:right;}.cke_skin_office2003 iframe{vertical-align:inherit;}.cke_skin_office2003 textarea{white-space:pre;}.cke_skin_office2003 .cke_browser_gecko textarea{cursor:text;}.cke_skin_office2003 .cke_browser_gecko textarea[disabled]{cursor:default;}.cke_skin_office2003 input[type="text"],.cke_skin_office2003 input[type="password"]{cursor:text;}.cke_skin_office2003 input[type="text"][disabled],.cke_skin_office2003 input[type="password"][disabled]{cursor:default;}.cke_skin_office2003 fieldset{padding:10px;border:2px groove #E0DFE3;}.cke_skin_office2003 .cke_editor{display:inline-table;width:100%;}.cke_skin_office2003 .cke_browser_webkit .cke_editor{display:table;}.cke_skin_office2003 span.cke_browser_webkit,.cke_skin_office2003 span.cke_browser_gecko18{display:block;}.cke_skin_office2003,.cke_skin_office2003 .cke_wrapper{display:block;}.cke_skin_office2003 .cke_top,.cke_skin_office2003 .cke_bottom,.cke_shared .cke_skin_office2003{background-color:#f7f8fd;}.cke_skin_office2003 .cke_top{border-top:solid 1px #fafaf5;border-left:solid 1px #fafaf5;border-right:solid 1px #696969;border-bottom:solid 2px #696969;}.cke_skin_office2003 .cke_rtl .cke_top{border-left:solid 1px #696969;border-right:solid 1px #fafaf5;}.cke_skin_office2003 .cke_bottom{border-left:solid 1px #696969;border-right:solid 1px #696969;border-bottom:solid 1px #696969;}.cke_skin_office2003 .cke_contents{border:solid 1px #696969;background-color:white;}.cke_skin_office2003 .cke_focus{outline:auto 5px -webkit-focus-ring-color;}.cke_skin_office2003 textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;white-space:pre;background-color:#fff;}.cke_skin_office2003 .cke_browser_iequirks textarea.cke_source{_white-space:normal;}.cke_skin_office2003 .cke_resizer{width:12px;height:12px;margin-top:16px;display:block;float:right;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -1088px;background-repeat:no-repeat;cursor:se-resize;}.cke_skin_office2003 .cke_browser_air .cke_resizer,.cke_skin_office2003 .cke_browser_air .cke_rtl .cke_resizer{cursor:move;}.cke_skin_office2003 .cke_resizer_rtl{cursor:sw-resize;background-position:0 -1115px;float:left;}.cke_skin_office2003 .cke_resizer_horizontal,.cke_skin_office2003 .cke_rtl .cke_resizer_horizontal{cursor:e-resize;}.cke_skin_office2003 .cke_resizer_vertical,.cke_skin_office2003 .cke_rtl .cke_resizer_vertical{cursor:n-resize;}.cke_skin_office2003 .cke_maximized .cke_resizer{display:none;}.cke_skin_office2003 .cke_browser_ie6 .cke_contents textarea,.cke_skin_office2003 .cke_browser_ie7 .cke_contents textarea{position:absolute;}.cke_skin_office2003 .cke_voice_label{display:none;}.cke_skin_office2003 legend.cke_voice_label{display:none;}.cke_skin_office2003 .cke_browser_ie legend.cke_voice_label{position:absolute;display:block;width:0;height:0;overflow:hidden;}.cke_skin_office2003 .cke_panel{border:1px solid #8f8f73;background-color:#fff;width:120px;height:100px;overflow:hidden;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.cke_skin_office2003 .cke_panel iframe{width:100%;height:100%;}cke_skin_office2003 .cke_panel_frame .cke_label{display:none;}html.cke_skin_office2003_container{overflow:auto;overflow-x:hidden;}
+body.cke_panel_frame{overflow:auto;}ul.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap;}li.cke_panel_listItem{margin:0;}.cke_panel_listItem a{padding:2px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;}* html .cke_panel_listItem a{width:100%;color:#000;}*:first-child+html .cke_panel_listItem a{color:#000;}.cke_panel_listItem.cke_selected a{border:1px solid #ccc;background-color:#e9f5ff;}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#316ac5;background-color:#dff1ff;}.cke_hc .cke_panel_listItem.cke_selected a,.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border-width:3px;padding:0;}.cke_panel_grouptitle{font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;font-weight:bold;white-space:nowrap;background-color:#dcdcdc;color:#000;margin:0;padding:3px;}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:3px;margin-bottom:3px;}.cke_skin_office2003 .cke_button_textcolor_panel,.cke_skin_office2003 .cke_button_bgcolor_panel{width:150px;height:135px;}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000;}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left;}.cke_rtl span.cke_colorbox{float:right;}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;}.cke_rtl a.cke_colorbox{float:right;}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#316ac5 1px solid;background-color:#dff1ff;}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer;}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#316ac5 1px solid;background-color:#dff1ff;}@media print{.cke_skin_office2003 .cke_toolbox{display:none;}}.cke_skin_office2003 .cke_browser_webkit .cke_toolbox,.cke_skin_office2003 .cke_browser_webkit .cke_toolbox>span{white-space:normal;}.cke_skin_office2003 .cke_toolbox{clear:both;padding-bottom:1px;}.cke_skin_office2003 a.cke_toolbox_collapser,.cke_skin_office2003 a:hover.cke_toolbox_collapser{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:3px -1026px;background-repeat:no-repeat;width:11px;height:11px;float:right;border:outset 1px;margin:11px 2px 2px;cursor:pointer;}.cke_skin_office2003 .cke_rtl a.cke_toolbox_collapser,.cke_skin_office2003 .cke_rtl a:hover.cke_toolbox_collapser{float:left;}.cke_skin_office2003 a.cke_toolbox_collapser span{display:none;}.cke_skin_office2003 .cke_hc a.cke_toolbox_collapser span{font-size:10px;font-weight:bold;font-family:Arial;display:inline;}.cke_skin_office2003 a.cke_toolbox_collapser_min,.cke_skin_office2003 a:hover.cke_toolbox_collapser_min{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:4px -1047px;background-repeat:no-repeat;margin:2px;}.cke_skin_office2003 .cke_rtl a.cke_toolbox_collapser_min,.cke_skin_office2003 .cke_rtl a:hover.cke_toolbox_collapser_min{background-position:4px -1068px;}.cke_skin_office2003 .cke_toolbar{background-color:#d6dff7;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -962px;background-repeat:repeat-x;display:inline-block;float:left;!height:28px;!line-height:28px;}.cke_skin_office2003 .cke_rtl .cke_toolbar{float:right;}.cke_skin_office2003 .cke_toolgroup{display:inline-block;float:left;height:28px;}.cke_skin_office2003 .cke_browser_ie .cke_toolgroup{#float:none;#display:inline;}.cke_skin_office2003 .cke_rtl .cke_toolgroup{float:right;}.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_toolgroup{#float:none;}.cke_skin_office2003 .cke_separator{display:inline-block;float:left;border-left:solid 1px #B2CBFF;margin:6px 2px;height:16px;}
+.cke_skin_office2003 .cke_browser_ie .cke_separator{#float:none;#display:inline;}.cke_skin_office2003 .cke_rtl .cke_separator{float:right;}.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_separator{#float:none;}.cke_skin_office2003 .cke_break{clear:left;}.cke_skin_office2003 .cke_rtl .cke_break{clear:right;}.cke_skin_office2003 .cke_toolbar_start{display:inline-block;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:no-repeat;background-position:-27px -765px;width:10px;height:28px;float:left;}.cke_skin_office2003 .cke_browser_ie .cke_toolbar_start{#float:none;#display:inline;}.cke_skin_office2003 .cke_rtl .cke_toolbar_start{background-position:-27px -816px;float:right;}.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_toolbar_start{#float:none;}.cke_skin_office2003 .cke_toolbar_end{display:inline-block;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:no-repeat;background-position:-29px -861px;width:4px;height:28px;float:left;}.cke_skin_office2003 .cke_browser_ie .cke_toolbar_end{#float:none;#display:inline;}.cke_skin_office2003 .cke_rtl .cke_toolbar_end{background-position:-29px -907px;float:right;}.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_toolbar_end{#float:none;}.cke_skin_office2003 .cke_browser_ie9 .cke_rtl .cke_separator,.cke_skin_office2003 .cke_browser_ie9 .cke_rtl .cke_toolbar_start,.cke_skin_office2003 .cke_browser_ie9 .cke_rtl .cke_toolbar_end{vertical-align:middle;}.cke_skin_office2003 .cke_button a,.cke_skin_office2003 .cke_button a:hover,.cke_skin_office2003 .cke_button a:focus,.cke_skin_office2003 .cke_button a:active,.cke_skin_office2003 .cke_button a.cke_off{border:solid 1px transparent;border-radius:3px;outline:none;padding-top:2px;padding-left:4px;padding-right:4px;padding-bottom:2px;margin-top:2px;height:18px;vertical-align:top;_border:none;_margin:3px 1px 1px 1px;cursor:default;display:inline-block;}.cke_skin_office2003 .cke_button a,.cke_skin_office2003 .cke_button a.cke_off{filter:alpha(opacity=70);opacity:.70;-moz-border-radius:3px;-webkit-border-radius:3px;}.cke_skin_office2003 .cke_hc .cke_button a,.cke_skin_office2003 .cke_hc .cke_button a.cke_off{opacity:1.0;filter:alpha(opacity=100);_border:1px solid transparent;}.cke_skin_office2003 .cke_button a.cke_on{border:solid 1px #316ac5;background-color:#c1d2ee;filter:alpha(opacity=100);opacity:1;_margin:2px 0 0 0;}.cke_skin_office2003 .cke_hc .cke_button a:hover,.cke_skin_office2003 .cke_hc .cke_button a:focus,.cke_skin_office2003 .cke_hc .cke_button a:active{padding:0 2px!important;border-width:3px;}.cke_skin_office2003 .cke_button a.cke_disabled *{filter:alpha(opacity=30);opacity:.3;}.cke_skin_office2003 .cke_browser_ie .cke_button a.cke_disabled *,.cke_skin_office2003 .cke_browser_ie a:hover.cke_button .cke_disabled *{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale'), alpha(opacity=30);}.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_button a.cke_disabled *,.cke_skin_office2003 .cke_browser_ie .cke_rtl a:hover.cke_button .cke_disabled *{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale'), alpha(opacity=30);}.cke_skin_office2003 .cke_browser_ie6 .cke_button a.cke_disabled *,.cke_skin_office2003 .cke_browser_ie6 a:hover.cke_button .cke_disabled *,.cke_skin_office2003 .cke_browser_ie .cke_button.cke_noalphafix a.cke_disabled *{filter:alpha(opacity=30);}.cke_skin_office2003 .cke_hc .cke_button a.cke_disabled *,.cke_skin_office2003 .cke_browser_ie.cke_hc a:hover.cke_button .cke_disabled *{filter:alpha(opacity=60);opacity:.6;}.cke_skin_office2003 .cke_button a:hover,.cke_skin_office2003 .cke_button a:focus,.cke_skin_office2003 .cke_button a:active{border:solid 1px #316ac5;background-color:#dff1ff;filter:alpha(opacity=100);opacity:1;vertical-align:top;_margin:2px 0 0 0;padding:2px 4px;}.cke_skin_office2003 .cke_button .cke_icon{background-image:url(icons.png);background-position:100px;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;display:inline-block;cursor:default;}
+.cke_skin_office2003 .cke_rtl .cke_button .cke_icon{background-image:url(icons_rtl.png);}.cke_skin_office2003 .cke_browser_ie .cke_button .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_button .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_skin_office2003 .cke_browser_ie6 .cke_button .cke_icon,.cke_skin_office2003 .cke_browser_ie6 .cke_rtl .cke_button .cke_icon,.cke_skin_office2003 .cke_browser_ie .cke_button.cke_noalphafix .cke_icon,.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_button.cke_noalphafix .cke_icon{filter:;}.cke_skin_office2003 .cke_button .cke_label{display:none;padding-left:3px;cursor:default;vertical-align:middle;_background-image:url(images/sprites_ie6.png);_background-position:0 -970px;_background-repeat:repeat-x;}.cke_skin_office2003 .cke_button a:hover .cke_label{_background-color:#dff1ff;_background-image:none;}.cke_skin_office2003 .cke_button a.cke_on .cke_label{_background-color:#c1d2ee;_background-image:none;}.cke_skin_office2003 .cke_hc .cke_button .cke_label{padding:0;display:inline-block;}.cke_skin_office2003 .cke_hc .cke_button .cke_icon{display:none;}.cke_skin_office2003 .cke_accessibility{position:absolute;display:block;width:0;height:0;overflow:hidden;}.cke_skin_office2003 .cke_button .cke_buttonarrow{display:inline-block;height:18px;width:8px;background-position:2px -1004px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:no-repeat;cursor:default;}.cke_skin_office2003 .cke_browser_ie .cke_button .cke_buttonarrow{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_skin_office2003 .cke_browser_ie6 .cke_button .cke_buttonarrow{filter:;}.cke_skin_office2003 .cke_rtl .cke_button .cke_buttonarrow{background-position:0 -1004px;}.cke_skin_office2003 .cke_browser_gecko18 .cke_toolbar,.cke_skin_office2003 .cke_browser_gecko18 .cke_button a,.cke_skin_office2003 .cke_browser_gecko18 .cke_button a.cke_off,.cke_skin_office2003 .cke_browser_gecko18 .cke_button .cke_icon,.cke_skin_office2003 .cke_browser_gecko18 .cke_button .cke_buttonarrow,.cke_skin_office2003 .cke_browser_gecko18 .cke_separator,.cke_skin_office2003 .cke_browser_gecko18 .cke_toolbar_start,.cke_skin_office2003 .cke_browser_gecko18 .cke_toolbar_end{display:block;float:left;}.cke_skin_office2003 .cke_browser_gecko18 .cke_hc .cke_button .cke_icon{display:none;}.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_toolbar,.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_button a,.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_button a.cke_off,.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_button .cke_icon,.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_button .cke_buttonarrow,.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_separator,.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_toolbar_start,.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_toolbar_end{float:right;}.cke_skin_office2003 .cke_browser_gecko18 .cke_button .cke_label,.cke_skin_office2003 .cke_browser_gecko18 .cke_break{float:left;}.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl span.cke_inline_label{float:right;}.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_button .cke_label,.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_break{float:right;}.cke_skin_office2003 .cke_browser_gecko18 .cke_separator{margin-top:4px;}.cke_skin_office2003 .cke_browser_gecko18 .cke_button .cke_label{padding-top:3px;}.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_toolgroup,.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_separator,.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_toolbar_start,.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_toolbar_end{float:none;}.cke_skin_office2003 .cke_browser_ie8 .cke_toolbar,.cke_skin_office2003 .cke_browser_ie8 .cke_toolgroup{vertical-align:top;}.cke_skin_office2003 .cke_browser_iequirks.cke_browser_ie8 .cke_toolbar,.cke_skin_office2003 .cke_browser_iequirks.cke_browser_ie8 .cke_toolgroup{vertical-align:baseline;}
+.cke_skin_office2003 .cke_browser_iequirks .cke_separator{vertical-align:text-bottom;}.cke_skin_office2003 .cke_browser_ie .cke_rcombo,.cke_skin_office2003 .cke_browser_ie .cke_rcombo *{cursor:default;}.cke_skin_office2003 .cke_contextmenu{padding:2px;}.cke_skin_office2003 .cke_menuitem a{display:block;}.cke_skin_office2003 .cke_menuitem span{cursor:default;}.cke_skin_office2003 .cke_menuitem a:hover,.cke_skin_office2003 .cke_menuitem a:focus,.cke_skin_office2003 .cke_menuitem a:active{background-color:#8db1ff;display:block;}.cke_hc .cke_menuitem a:hover,.cke_hc .cke_menuitem a:focus,.cke_hc .cke_menuitem a:active{border:2px solid;}.cke_skin_office2003 .cke_menuitem .cke_icon{background-image:url(icons.png);background-position:100px;background-repeat:no-repeat;background-color:transparent;width:16px;height:16px;float:left;}.cke_rtl .cke_skin_office2003 .cke_menuitem .cke_icon{background-image:url(icons_rtl.png);}.cke_browser_ie .cke_skin_office2003 .cke_menuitem .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie.cke_rtl .cke_skin_office2003 .cke_menuitem .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie6 .cke_skin_office2003 .cke_menuitem .cke_icon,.cke_browser_ie .cke_skin_office2003 .cke_menuitem.cke_noalphafix .cke_icon{filter:;}.cke_skin_office2003 .cke_menuitem .cke_disabled .cke_icon{filter:alpha(opacity=70);opacity:.70;}.cke_browser_ie .cke_skin_office2003 .cke_menuitem .cke_disabled .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie.cke_rtl .cke_skin_office2003 .cke_menuitem .cke_disabled .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie6 .cke_skin_office2003 .cke_menuitem .cke_disabled .cke_icon,.cke_browser_ie .cke_skin_office2003 .cke_menuitem.cke_noalphafix .cke_disabled .cke_icon{filter:;}.cke_skin_office2003 .cke_menuitem .cke_icon_wrapper{background-color:#f7f8fd;border:solid 4px #f7f8fd;width:16px;height:16px;float:left;filter:alpha(opacity=70);opacity:.70;clear:both;}.cke_rtl .cke_skin_office2003 .cke_menuitem .cke_icon_wrapper{float:right;}.cke_skin_office2003 .cke_menuitem a:hover .cke_icon_wrapper,.cke_skin_office2003 .cke_menuitem a:focus .cke_icon_wrapper,.cke_skin_office2003 .cke_menuitem a:active .cke_icon_wrapper{background-color:#9d9d9d;border:solid 4px #9d9d9d;filter:alpha(opacity=70);opacity:.70;}.cke_skin_office2003 .cke_menuitem a:hover.cke_disabled .cke_icon_wrapper,.cke_skin_office2003 .cke_menuitem a:focus.cke_disabled .cke_icon_wrapper,.cke_skin_office2003 .cke_menuitem a:active.cke_disabled .cke_icon_wrapper{background-color:#f7f8fd;border:solid 4px #f7f8fd;}.cke_skin_office2003 .cke_menuitem .cke_label{display:block;padding-right:3px;padding-top:5px;padding-left:4px;height:19px;margin-left:24px;background-color:#fff;}.cke_skin_office2003 .cke_frameLoaded .cke_menuitem .cke_label{filter:alpha(opacity=70);opacity:.70;}.cke_rtl .cke_skin_office2003 .cke_menuitem .cke_label{padding-right:0;margin-left:0;padding-left:3px;margin-right:28px;}.cke_skin_office2003 .cke_menuitem a.cke_disabled .cke_label{filter:alpha(opacity=30);opacity:.30;}.cke_skin_office2003 .cke_menuitem a:hover .cke_label,.cke_skin_office2003 .cke_menuitem a:focus .cke_label,.cke_skin_office2003 .cke_menuitem a:active .cke_label{background-color:#8db1ff;}.cke_skin_office2003 .cke_menuitem a.cke_disabled:hover .cke_label,.cke_skin_office2003 .cke_menuitem a.cke_disabled:focus .cke_label,.cke_skin_office2003 .cke_menuitem a.cke_disabled:active .cke_label{background-color:transparent;}.cke_skin_office2003 .cke_menuseparator{background-color:#f7f8fd;height:2px;filter:alpha(opacity=70);opacity:.70;_font-size:0;}.cke_skin_office2003 .cke_menuarrow{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -1071px;background-repeat:no-repeat;height:5px;width:3px;float:right;margin-right:2px;margin-top:3px;}.cke_rtl .cke_skin_office2003 .cke_menuarrow{float:left;margin-right:0;margin-left:2px;background-position:0 -1050px;}
+.cke_skin_office2003 .cke_menuarrow span{display:none;}.cke_hc .cke_skin_office2003 .cke_menuarrow{width:auto;margin-top:0;}.cke_hc .cke_skin_office2003 .cke_menuarrow span{display:inline;}.cke_browser_ie.cke_ltr .cke_skin_office2003 .cke_menuarrow{position:absolute;right:2px;}.cke_browser_ie.cke_rtl .cke_skin_office2003 .cke_menuarrow{position:absolute;left:2px;}.cke_skin_office2003 .cke_rcombo{display:inline-block;margin-left:2px;margin-right:2px;margin-top:2px;vertical-align:top;}.cke_skin_office2003 .cke_browser_ie .cke_rcombo{#display:inline;}.cke_skin_office2003 .cke_rcombopanel{border:1px solid #316ac5;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;}.cke_skin_office2003 .cke_rcombo a{display:inline-block;float:left;filter:alpha(opacity=70);opacity:.70;}.cke_skin_office2003 .cke_rtl .cke_rcombo a{float:right;}.cke_skin_office2003 .cke_hc .cke_rcombo a{filter:alpha(opacity=100);opacity:1.0;}.cke_skin_office2003 .cke_rcombo .cke_label{display:inline-block;float:left;cursor:default;line-height:24px;height:24px;vertical-align:top;padding-left:4px;padding-right:5px;filter:alpha(opacity=70);opacity:.70;_background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);_background-position:0 -962px;_background-repeat:repeat-x;}.cke_skin_office2003 .cke_rtl .cke_rcombo .cke_label{float:right;padding-right:4px;padding-left:5px;}.cke_skin_office2003 .cke_hc .cke_rcombo .cke_label{filter:alpha(opacity=100);opacity:1.0;}.cke_skin_office2003 .cke_rcombo .cke_inline_label{color:#fff;}.cke_skin_office2003 .cke_rcombo .cke_text{border:1px solid #8f8f73;background-color:#fff;height:14px;width:60px;padding-top:4px;padding-bottom:4px;padding-left:5px;padding-right:5px;text-overflow:ellipsis;overflow:hidden;display:inline-block;vertical-align:top;cursor:default;}.cke_skin_office2003 .cke_ltr .cke_rcombo .cke_text{-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;}.cke_skin_office2003 .cke_rtl .cke_rcombo .cke_text{-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;}.cke_skin_office2003 .cke_browser_iequirks .cke_rcombo .cke_text{height:22px;}.cke_skin_office2003 .cke_rcombo .cke_openbutton{display:inline-block;border-top:1px solid #8f8f73;border-bottom:1px solid #8f8f73;}.cke_skin_office2003 .cke_rcombo .cke_openbutton .cke_icon{display:inline-block;background-position:5px -1002px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:no-repeat;width:14px;height:22px;}.cke_skin_office2003 .cke_browser_iequirks .cke_rcombo .cke_openbutton .cke_icon{height:20px;}.cke_skin_office2003 .cke_browser_ie .cke_rcombo .cke_openbutton .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_skin_office2003 .cke_browser_ie6 .cke_rcombo .cke_openbutton .cke_icon{filter:;}.cke_skin_office2003 .cke_hc .cke_rcombo .cke_openbutton .cke_icon{background:none;filter:;}.cke_skin_office2003 .cke_ltr .cke_rcombo .cke_openbutton{border-right:1px solid #8f8f73;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;}.cke_skin_office2003 .cke_rtl .cke_rcombo .cke_openbutton{border-left:1px solid #8f8f73;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;}.cke_skin_office2003 .cke_rcombo .cke_off a:hover,.cke_skin_office2003 .cke_rcombo .cke_off a:focus,.cke_skin_office2003 .cke_rcombo .cke_off a:active,.cke_skin_office2003 .cke_rcombo .cke_on a{filter:alpha(opacity=100);opacity:1;}.cke_skin_office2003 .cke_rcombo .cke_off a:hover .cke_text,.cke_skin_office2003 .cke_rcombo .cke_off a:focus .cke_text,.cke_skin_office2003 .cke_rcombo .cke_off a:active .cke_text,.cke_skin_office2003 .cke_rcombo .cke_on .cke_text{border-color:#316ac5;}
+.cke_skin_office2003 .cke_rcombo .cke_off a:hover .cke_openbutton,.cke_skin_office2003 .cke_rcombo .cke_off a:focus .cke_openbutton,.cke_skin_office2003 .cke_rcombo .cke_off a:active .cke_openbutton,.cke_skin_office2003 .cke_rcombo .cke_on .cke_openbutton{border-color:#316ac5;background-color:#dff1ff;}.cke_skin_office2003 .cke_rcombo .cke_on .cke_text{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;}.cke_skin_office2003 .cke_rcombo .cke_on .cke_openbutton{-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;}.cke_skin_office2003 .cke_rcombo .cke_disabled .cke_label{filter:alpha(opacity=30);opacity:.3;}.cke_skin_office2003 .cke_hc .cke_rcombo .cke_disabled .cke_label{filter:alpha(opacity=70);opacity:.7;}.cke_skin_office2003 .cke_rcombo .cke_disabled .cke_text,.cke_skin_office2003 .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=50);opacity:.5;}.cke_skin_office2003 .cke_browser_ie .cke_rcombo .cke_disabled .cke_openbutton{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale'), alpha(opacity=50);}.cke_skin_office2003 .cke_browser_ie6 .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=50);}.cke_skin_office2003 .cke_hc .cke_rcombo .cke_disabled .cke_text,.cke_skin_office2003 .cke_hc .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=80);opacity:.8;}.cke_skin_office2003 .cke_rcombo .cke_disabled .cke_text{color:#fff;}.cke_skin_office2003 .cke_browser_gecko18 .cke_rcombo,.cke_skin_office2003 .cke_browser_gecko18 .cke_rcombo .cke_label,.cke_skin_office2003 .cke_browser_gecko18 .cke_rcombo .cke_text,.cke_skin_office2003 .cke_browser_gecko18 .cke_rcombo .cke_openbutton,.cke_skin_office2003 .cke_browser_webkit .cke_rcombo .cke_label,.cke_skin_office2003 .cke_browser_webkit .cke_rcombo .cke_text,.cke_skin_office2003 .cke_browser_webkit .cke_rcombo .cke_openbutton{display:block;float:left;}.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_rcombo,.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_rcombo .cke_label,.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_rcombo .cke_text,.cke_skin_office2003 .cke_browser_gecko18 .cke_rtl .cke_rcombo .cke_openbutton,.cke_skin_office2003 .cke_browser_webkit .cke_rtl .cke_rcombo .cke_label,.cke_skin_office2003 .cke_browser_webkit .cke_rtl .cke_rcombo .cke_text,.cke_skin_office2003 .cke_browser_webkit .cke_rtl .cke_rcombo .cke_openbutton{float:right;}.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_rcombo,.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_rcombo a,.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_rcombo .cke_label{float:none;}.cke_skin_office2003 .cke_rtl .cke_rcombo .cke_font .cke_text,.cke_skin_office2003 .cke_rtl .cke_rcombo .cke_fontSize .cke_text{direction:ltr;}@media print{.cke_path{display:none;}}.cke_skin_office2003 .cke_path{padding:3px 3px 0 3px;display:inline-block;float:left;}.cke_skin_office2003 .cke_rtl .cke_path{float:right;}.cke_skin_office2003 .cke_path a,.cke_skin_office2003 .cke_path .cke_empty{display:inline-block;float:left;border:solid 1px #f7f8fd;background-color:#f7f8fd;padding-top:1px;padding-bottom:1px;padding-left:4px;padding-right:4px;margin-bottom:3px;cursor:default;}.cke_skin_office2003 .cke_path .cke_empty{visibility:hidden;}.cke_skin_office2003 .cke_rtl .cke_path a,.cke_skin_office2003 .cke_rtl .cke_path cke_empty{float:right;}.cke_skin_office2003 .cke_path a:hover,.cke_skin_office2003 .cke_path a:focus,.cke_skin_office2003 .cke_path a:active{border:solid 1px #316ac5;background-color:#dff1ff;padding-top:1px;padding-bottom:1px;padding-left:4px;padding-right:4px;outline:none;}.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_path a,.cke_skin_office2003 .cke_browser_ie .cke_rtl .cke_path .cke_empty{float:none;}.cke_skin_office2003 .cke_path .cke_label{display:none;}.cke_skin_office2003 .cke_button_source .cke_icon{background-position:0 0;}.cke_skin_office2003 .cke_button_docProps .cke_icon{background-position:0 -16px;}.cke_skin_office2003 .cke_button_newpage .cke_icon{background-position:0 -48px;}
+.cke_skin_office2003 .cke_button_preview .cke_icon{background-position:0 -64px;}.cke_skin_office2003 .cke_button_cut .cke_icon{background-position:0 -96px;}.cke_skin_office2003 .cke_button_copy .cke_icon{background-position:0 -112px;}.cke_skin_office2003 .cke_button_paste .cke_icon{background-position:0 -128px;}.cke_skin_office2003 .cke_button_pastetext .cke_icon{background-position:0 -144px;}.cke_skin_office2003 .cke_button_find .cke_icon{background-position:0 -240px;}.cke_skin_office2003 .cke_button_replace .cke_icon{background-position:0 -256px;}.cke_skin_office2003 .cke_button_selectAll .cke_icon{background-position:0 -272px;}.cke_skin_office2003 .cke_button_removeFormat .cke_icon{background-position:0 -288px;}.cke_skin_office2003 .cke_button_bold .cke_icon{background-position:0 -304px;}.cke_skin_office2003 .cke_button_italic .cke_icon{background-position:0 -320px;}.cke_skin_office2003 .cke_button_underline .cke_icon{background-position:0 -336px;}.cke_skin_office2003 .cke_button_strike .cke_icon{background-position:0 -352px;}.cke_skin_office2003 .cke_button_subscript .cke_icon{background-position:0 -368px;}.cke_skin_office2003 .cke_button_superscript .cke_icon{background-position:0 -384px;}.cke_skin_office2003 .cke_button_table .cke_icon{background-position:0 -608px;}.cke_skin_office2003 .cke_button_horizontalrule .cke_icon{background-position:0 -624px;}.cke_skin_office2003 .cke_button_smiley .cke_icon{background-position:0 -640px;}.cke_skin_office2003 .cke_button_link .cke_icon{background-position:0 -528px;}.cke_skin_office2003 .cke_button_unlink .cke_icon{background-position:0 -544px;}.cke_skin_office2003 .cke_button_anchor .cke_icon{background-position:0 -560px;}.cke_skin_office2003 .cke_button_image .cke_icon{background-position:0 -576px;}.cke_skin_office2003 .cke_button_flash .cke_icon{background-position:0 -592px;}.cke_skin_office2003 .cke_button_specialchar .cke_icon{background-position:0 -656px;}.cke_skin_office2003 .cke_button_pagebreak .cke_icon{background-position:0 -672px;}.cke_skin_office2003 .cke_button_print .cke_icon{background-position:0 -176px;}.cke_skin_office2003 .cke_button_checkspell .cke_icon,.cke_skin_office2003 .cke_button_scayt .cke_icon{background-position:0 -192px;}.cke_skin_office2003 .cke_button_pagebreak .cke_icon{background-position:0 -672px;}.cke_skin_office2003 .cke_button_textcolor .cke_icon{background-position:0 -704px;}.cke_skin_office2003 .cke_button_bgcolor .cke_icon{background-position:0 -720px;}.cke_skin_office2003 .cke_button_form .cke_icon{background-position:0 -752px;}.cke_skin_office2003 .cke_button_checkbox .cke_icon{background-position:0 -768px;}.cke_skin_office2003 .cke_button_radio .cke_icon{background-position:0 -784px;}.cke_skin_office2003 .cke_button_textfield .cke_icon{background-position:0 -800px;}.cke_skin_office2003 .cke_button_textarea .cke_icon{background-position:0 -816px;}.cke_skin_office2003 .cke_button_showblocks .cke_icon{background-position:0 -1136px;}.cke_skin_office2003 .cke_button_select .cke_icon{background-position:0 -832px;}.cke_skin_office2003 .cke_button_button .cke_icon{background-position:0 -848px;}.cke_skin_office2003 .cke_button_imagebutton .cke_icon{background-position:0 -864px;}.cke_skin_office2003 .cke_button_hiddenfield .cke_icon{background-position:0 -880px;}.cke_skin_office2003 .cke_button_undo .cke_icon{background-position:0 -208px;}.cke_skin_office2003 .cke_rtl .cke_button_undo .cke_icon{background-position:0 -224px;}.cke_skin_office2003 .cke_button_redo .cke_icon{background-position:0 -224px;}.cke_skin_office2003 .cke_rtl .cke_button_redo .cke_icon{background-position:0 -208px;}.cke_skin_office2003 .cke_button_templates .cke_icon{background-position:0 -80px;}.cke_skin_office2003 .cke_button_numberedlist .cke_icon{background-position:0 -400px;}.cke_skin_office2003 .cke_button_bulletedlist .cke_icon{background-position:0 -416px;}.cke_skin_office2003 .cke_mixed_dir_content .cke_button_numberedlist .cke_icon{background-position:0 -1217px;}.cke_skin_office2003 .cke_mixed_dir_content .cke_button_bulletedlist .cke_icon{background-position:0 -1233px;}
+.cke_skin_office2003 .cke_button_outdent .cke_icon{background-position:0 -432px;}.cke_skin_office2003 .cke_button_indent .cke_icon{background-position:0 -448px;}.cke_skin_office2003 .cke_mixed_dir_content .cke_button_indent .cke_icon{background-position:0 -1265px;}.cke_skin_office2003 .cke_mixed_dir_content .cke_button_outdent .cke_icon{background-position:0 -1249px;}.cke_skin_office2003 .cke_button_justifyleft .cke_icon{background-position:0 -464px;}.cke_skin_office2003 .cke_button_justifycenter .cke_icon{background-position:0 -480px;}.cke_skin_office2003 .cke_button_justifyright .cke_icon{background-position:0 -496px;}.cke_skin_office2003 .cke_button_justifyblock .cke_icon{background-position:0 -512px;}.cke_skin_office2003 .cke_button_blockquote .cke_icon{background-position:0 -1152px;}.cke_skin_office2003 .cke_button_flash .cke_icon{background-position:0 -592px;}.cke_skin_office2003 .cke_button_pastefromword .cke_icon{background-position:0 -160px;}.cke_skin_office2003 .cke_button_save .cke_icon{background-position:0 -32px;}.cke_skin_office2003 .cke_button_about .cke_icon{background-position:0 -736px;}.cke_skin_office2003 .cke_button_maximize .cke_icon{background-position:0 -1040px;}.cke_skin_office2003 .cke_button_creatediv .cke_icon{background-position:0 -1168px;}.cke_skin_office2003 .cke_button_editdiv .cke_icon{background-position:0 -1184px;}.cke_skin_office2003 .cke_button_removediv .cke_icon{background-position:0 -1200px;}.cke_skin_office2003 .cke_button_bidirtl .cke_icon{background-position:0 -1072px;}.cke_skin_office2003 .cke_button_bidiltr .cke_icon{background-position:0 -1056px;}.cke_skin_office2003 .cke_button_iframe .cke_icon{background-position:0 -1279px;}.cke_skin_office2003 .cke_button_source .cke_label{display:inline;}.cke_skin_office2003 .cke_styles_panel{width:150px;height:170px;}.cke_skin_office2003 .cke_format_panel{width:150px;height:170px;}.cke_skin_office2003 .cke_font_panel{width:150px;height:170px;}.cke_skin_office2003 .cke_fontSize_panel{height:170px;}.cke_skin_office2003 .cke_fontSize .cke_text{width:20px;}.cke_skin_office2003 .cke_browser_iequirks .cke_fontSize .cke_text{width:32px;}html .cke_skin_office2003{visibility:inherit;}html.cke_skin_office2003_container{visibility:visible;}
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/skins/office2003/skin.js b/sm-shop/src/main/webapp/resources/js/ckeditor/skins/office2003/skin.js
index 89a944d..713dcf2 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/skins/office2003/skin.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/skins/office2003/skin.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.skins.add('office2003',(function(){return{editor:{css:['editor.css']},dialog:{css:['dialog.css']},separator:{canGroup:false},templates:{css:['templates.css']},margins:[0,14,18,14]};})());(function(){CKEDITOR.dialog?a():CKEDITOR.on('dialogPluginReady',a);function a(){CKEDITOR.dialog.on('resize',function(b){var c=b.data,d=c.width,e=c.height,f=c.dialog,g=f.parts.contents;if(c.skin!='office2003')return;g.setStyles({width:d+'px',height:e+'px'});if(!CKEDITOR.env.ie||CKEDITOR.env.ie9Compat)return;var h=function(){var i=f.parts.dialog.getChild([0,0,0]),j=i.getChild(0),k=j.getSize('width');e+=j.getChild(0).getSize('height')+1;var l=i.getChild(2);l.setSize('width',k);l=i.getChild(7);l.setSize('width',k-28);l=i.getChild(4);l.setSize('height',e);l=i.getChild(5);l.setSize('height',e);};setTimeout(h,100);if(b.editor.lang.dir=='rtl')setTimeout(h,1000);});};})();
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.skins.add('office2003',(function(){return{editor:{css:['editor.css']},dialog:{css:['dialog.css']},separator:{canGroup:false},templates:{css:['templates.css']},margins:[0,14,18,14]};})());(function(){CKEDITOR.dialog?a():CKEDITOR.on('dialogPluginReady',a);function a(){CKEDITOR.dialog.on('resize',function(b){var c=b.data,d=c.width,e=c.height,f=c.dialog,g=f.parts.contents;if(c.skin!='office2003')return;g.setStyles({width:d+'px',height:e+'px'});if(!CKEDITOR.env.ie||CKEDITOR.env.ie9Compat)return;var h=function(){var i=f.parts.dialog.getChild([0,0,0]),j=i.getChild(0),k=j.getSize('width');e+=j.getChild(0).getSize('height')+1;var l=i.getChild(2);l.setSize('width',k);l=i.getChild(7);l.setSize('width',k-28);l=i.getChild(4);l.setSize('height',e);l=i.getChild(5);l.setSize('height',e);};setTimeout(h,100);if(b.editor.lang.dir=='rtl')setTimeout(h,1000);});};})();
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/skins/office2003/templates.css b/sm-shop/src/main/webapp/resources/js/ckeditor/skins/office2003/templates.css
index 34067a0..b7ed1b7 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/skins/office2003/templates.css
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/skins/office2003/templates.css
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-.cke_skin_office2003 .cke_tpl_list{border:#dcdcdc 2px solid;background-color:#fff;overflow:auto;width:100%;height:220px;}.cke_skin_office2003 .cke_tpl_item{margin:5px;padding:7px;border:#eee 1px solid;*width:88%;}.cke_skin_office2003 .cke_tpl_preview{border-collapse:separate;text-indent:0;width:100%;}.cke_skin_office2003 .cke_tpl_preview td{padding:2px;vertical-align:middle;}.cke_skin_office2003 .cke_tpl_preview .cke_tpl_preview_img{width:100px;}.cke_skin_office2003 .cke_tpl_preview span{white-space:normal;}.cke_skin_office2003 .cke_tpl_title{font-weight:bold;}.cke_skin_office2003 .cke_tpl_list a:active .cke_tpl_item,.cke_skin_office2003 .cke_tpl_list a:hover .cke_tpl_item,.cke_skin_office2003 .cke_tpl_list a:focus .cke_tpl_item{border:#f93 1px solid!important;background-color:#fffacd!important;}.cke_skin_office2003 .cke_tpl_list a:active *,.cke_skin_office2003 .cke_tpl_list a:hover *,.cke_skin_office2003 .cke_tpl_list a:focus *{cursor:pointer;}.cke_skin_office2003 .cke_browser_ie6 .cke_tpl_list a:active,.cke_skin_office2003 .cke_browser_ie6 .cke_tpl_list a:hover,.cke_skin_office2003 .cke_browser_ie6 .cke_tpl_list a:focus{background-position:0 0;}.cke_skin_office2003 .cke_tpl_list a:active .cke_tpl_item,.cke_skin_office2003 .cke_tpl_list a:hover .cke_tpl_item,.cke_skin_office2003 .cke_tpl_list a:focus .cke_tpl_item{border-width:3px;}.cke_skin_office2003 .cke_tpl_empty,.cke_tpl_loading{text-align:center;padding:5px;}
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+.cke_skin_office2003 .cke_tpl_list{border:#dcdcdc 2px solid;background-color:#fff;overflow:auto;width:100%;height:220px;}.cke_skin_office2003 .cke_tpl_item{margin:5px;padding:7px;border:#eee 1px solid;*width:88%;}.cke_skin_office2003 .cke_tpl_preview{border-collapse:separate;text-indent:0;width:100%;}.cke_skin_office2003 .cke_tpl_preview td{padding:2px;vertical-align:middle;}.cke_skin_office2003 .cke_tpl_preview .cke_tpl_preview_img{width:100px;}.cke_skin_office2003 .cke_tpl_preview span{white-space:normal;}.cke_skin_office2003 .cke_tpl_title{font-weight:bold;}.cke_skin_office2003 .cke_tpl_list a:active .cke_tpl_item,.cke_skin_office2003 .cke_tpl_list a:hover .cke_tpl_item,.cke_skin_office2003 .cke_tpl_list a:focus .cke_tpl_item{border:#f93 1px solid!important;background-color:#fffacd!important;}.cke_skin_office2003 .cke_tpl_list a:active *,.cke_skin_office2003 .cke_tpl_list a:hover *,.cke_skin_office2003 .cke_tpl_list a:focus *{cursor:pointer;}.cke_skin_office2003 .cke_browser_ie6 .cke_tpl_list a:active,.cke_skin_office2003 .cke_browser_ie6 .cke_tpl_list a:hover,.cke_skin_office2003 .cke_browser_ie6 .cke_tpl_list a:focus{background-position:0 0;}.cke_skin_office2003 .cke_tpl_list a:active .cke_tpl_item,.cke_skin_office2003 .cke_tpl_list a:hover .cke_tpl_item,.cke_skin_office2003 .cke_tpl_list a:focus .cke_tpl_item{border-width:3px;}.cke_skin_office2003 .cke_tpl_empty,.cke_tpl_loading{text-align:center;padding:5px;}
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/skins/v2/dialog.css b/sm-shop/src/main/webapp/resources/js/ckeditor/skins/v2/dialog.css
index 873d100..6acd829 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/skins/v2/dialog.css
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/skins/v2/dialog.css
@@ -1,9 +1,9 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-body .cke_dialog{visibility:visible;}.cke_skin_v2 table.cke_dialog.cke_browser_gecko{display:block;}.cke_skin_v2 .cke_dialog_body{margin-left:16px;margin-right:16px;margin-top:2px;margin-bottom:20px;z-index:1;_position:static;}.cke_skin_v2 .cke_dialog_tl,.cke_skin_v2 .cke_dialog_tr,.cke_skin_v2 .cke_dialog_tc,.cke_skin_v2 .cke_dialog_bl,.cke_skin_v2 .cke_dialog_br,.cke_skin_v2 .cke_dialog_bc{background-image:url(images/sprites.png);background-repeat:no-repeat;position:absolute;_background-image:url(images/sprites_ie6.png);z-index:-1;}.cke_skin_v2 .cke_dialog_tl{background-position:-16px -16px;height:16px;width:16px;top:0;left:0;}.cke_skin_v2 .cke_rtl .cke_dialog_tl{background-position:-16px -397px;}.cke_skin_v2 .cke_dialog_tr{background-position:-16px -76px;height:16px;width:16px;top:0;right:0;}.cke_skin_v2 .cke_rtl .cke_dialog_tr{background-position:-16px -457px;}.cke_skin_v2 .cke_dialog_tc{background-position:0 -136px;background-repeat:repeat-x;height:16px;top:0;left:16px;right:16px;}.cke_skin_v2 .cke_dialog_bl{background-position:-16px -196px;height:51px;width:30px;bottom:0;left:0;}.cke_skin_v2 .cke_rtl .cke_dialog_bl{background-position:-16px -517px;}.cke_skin_v2 .cke_dialog_br{background-position:-16px -263px;height:51px;width:30px;bottom:0;right:0;}.cke_skin_v2 .cke_rtl .cke_dialog_br{background-position:-16px -584px;}.cke_skin_v2 .cke_dialog_bc{background-position:0 -330px;background-repeat:repeat-x;height:51px;bottom:0;left:30px;right:30px;}.cke_skin_v2 .cke_dialog_ml,.cke_skin_v2 .cke_dialog_mr{background-image:url(images/dialog_sides.png);background-repeat:repeat-y;position:absolute;width:16px;top:16px;bottom:51px;_background-image:url(images/dialog_sides.gif);_top:auto;}.cke_skin_v2 .cke_rtl .cke_dialog_ml,.cke_skin_v2 .cke_rtl .cke_dialog_mr{background-image:url(images/dialog_sides_rtl.png);_background-image:url(images/dialog_sides.gif);}.cke_skin_v2 .cke_dialog_ml{background-position:0 0;left:0;}.cke_skin_v2 .cke_dialog_mr{background-position:-16px 0;right:0;}.cke_skin_v2 .cke_browser_iequirks .cke_dialog_ml,.cke_skin_v2 .cke_browser_iequirks .cke_dialog_mr{margin-top:3px;}.cke_skin_v2 .cke_dialog_title{font-weight:bold;font-size:14pt;color:#737357;background-color:#e3e3c7;padding:3px 10px 26px 10px;cursor:move;position:relative;}.cke_skin_v2 .cke_browser_ie.cke_rtl .cke_dialog_title{position:static;}.cke_skin_v2 .cke_dialog_contents{background-color:#f1f1e3;border:#d5d59d 1px solid;overflow:auto;padding:5px 10px;}.cke_skin_v2 .cke_dialog_footer{background-color:#e3e3c7;text-align:right;}.cke_skin_v2 .cke_rtl .cke_dialog_footer{text-align:left;}.cke_skin_v2 .cke_dialog_footer .cke_resizer{margin-top:21px;}.cke_skin_v2 .cke_dialog_tabs{height:23px;background-color:#e3e3c7;display:inline-block;margin-left:10px;margin-right:10px;margin-top:-23px;position:absolute;z-index:2;}.cke_skin_v2 .cke_rtl .cke_dialog_tabs{right:10px;}.cke_skin_v2 a.cke_dialog_tab,.cke_skin_v2 a:link.cke_dialog_tab,.cke_skin_v2 a:active.cke_dialog_tab,.cke_skin_v2 a:hover.cke_dialog_tab,.cke_skin_v2 a:visited.cke_dialog_tab{color:#737357;border-left:1px solid #d5d59d;border-right:1px solid #d5d59d;border-top:1px solid #d5d59d;height:14px;padding:4px 5px;display:inline-block;cursor:pointer;}.cke_skin_v2 .cke_browser_gecko18 a.cke_dialog_tab,.cke_skin_v2 .cke_browser_gecko18 a:link.cke_dialog_tab,.cke_skin_v2 .cke_browser_gecko18 a:active.cke_dialog_tab,.cke_skin_v2 .cke_browser_gecko18 a:hover.cke_dialog_tab,.cke_skin_v2 .cke_browser_gecko18 a:visited.cke_dialog_tab{display:inline;position:relative;top:6px;}.cke_skin_v2 a:hover.cke_dialog_tab{background-color:#f1f1e3;}.cke_skin_v2 .cke_hc a:hover.cke_dialog_tab{padding:2px 3px!important;border-width:3px;}.cke_skin_v2 a.cke_dialog_tab_selected,.cke_skin_v2 a:link.cke_dialog_tab_selected,.cke_skin_v2 a:active.cke_dialog_tab_selected,.cke_skin_v2 a:hover.cke_dialog_tab_selected,.cke_skin_v2 a:visited.cke_dialog_tab_selected{border-bottom:1px solid #f1f1e3;background-color:#f1f1e3;font-weight:bold;cursor:default;}.cke_skin_v2 .cke_hc a.cke_dialog_tab_selected,.cke_skin_v2 .cke_hc a:link.cke_dialog_tab_selected,.cke_skin_v2 .cke_hc a:active.cke_dialog_tab_selected,.cke_skin_v2 .cke_hc a:hover.cke_dialog_tab_selected,.cke_skin_v2 .cke_hc a:visited.cke_dialog_tab_selected{padding:2px 3px!important;border-width:3px;}
-.cke_skin_v2 .cke_hc .cke_dialog_tabs a,.cke_skin_v2 .cke_hc .cke_dialog_footer a{opacity:1.0;filter:alpha(opacity=100);border:1px solid white;}.cke_skin_v2 .cke_single_page .cke_dialog_tabs{display:none;}.cke_skin_v2 .cke_single_page .cke_dialog_title{padding-bottom:3px;}.cke_skin_v2 .cke_dialog_ui_vbox table,.cke_skin_v2 .cke_dialog_ui_hbox table{margin:auto;}.cke_skin_v2 .cke_dialog_ui_vbox_child{padding:5px 0;}.cke_skin_v2 input.cke_dialog_ui_input_text,.cke_skin_v2 input.cke_dialog_ui_input_password{background-color:white;border:none;padding:0;width:100%;height:14px;}.cke_skin_v2 .cke_browser_gecko.cke_hc div.cke_dialog_ui_input_text,.cke_skin_v2 .cke_browser_gecko.cke_hc div.cke_dialog_ui_input_password{border-width:0;}.cke_skin_v2 .cke_browser_gecko18.cke_hc div.cke_dialog_ui_input_text,.cke_skin_v2 .cke_browser_gecko18.cke_hc div.cke_dialog_ui_input_password{border-width:1px;}.cke_skin_v2 .cke_browser_ie.cke_rtl input.cke_dialog_ui_input_text,.cke_skin_v2 .cke_browser_opera.cke_rtl input.cke_dialog_ui_input_text,.cke_skin_v2 .cke_browser_ie.cke_rtl input.cke_dialog_ui_input_password,.cke_skin_v2 .cke_browser_opera.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px;}.cke_skin_v2 .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_text,.cke_skin_v2 .cke_browser_opera.cke_rtl div.cke_dialog_ui_input_text,.cke_skin_v2 .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_password,.cke_skin_v2 .cke_browser_opera.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px;}.cke_skin_v2 .cke_browser_ie.cke_rtl .cke_dialog_ui_vbox_child,.cke_skin_v2 .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_child,.cke_skin_v2 .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_first,.cke_skin_v2 .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important;}.cke_skin_v2 div.cke_dialog_ui_input_text,.cke_skin_v2 div.cke_dialog_ui_input_password{background-color:white;border:1px solid #a0a0a0;padding:1px 0;_width:99.9%;}.cke_skin_v2 .cke_browser_ie7 input.cke_dialog_ui_input_text,.cke_skin_v2 .cke_browser_ie7 input.cke_dialog_ui_input_password{position:absolute;}.cke_skin_v2 .cke_browser_ie7 div.cke_dialog_ui_input_text,.cke_skin_v2 .cke_browser_ie7 div.cke_dialog_ui_input_password{height:14px;position:relative;}.cke_skin_v2 .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px;}.cke_skin_v2 textarea.cke_dialog_ui_input_textarea{background-color:white;border:none;padding:0;width:100%;_width:99%;overflow:auto;resize:none;}.cke_skin_v2 div.cke_dialog_ui_input_textarea{background-color:white;border:1px solid #a0a0a0;padding:1px 0;}.cke_skin_v2 .cke_rtl .cke_dialog_ui_labeled_content{_width:95%;}.cke_skin_v2 div.cke_disabled .cke_dialog_ui_labeled_content *{background-color:#a0a0a0;cursor:default;}.cke_skin_v2 .cke_dialog_ui_hbox{width:100%;}.cke_skin_v2 .cke_dialog_ui_hbox_first,.cke_skin_v2 .cke_dialog_ui_hbox_child,.cke_skin_v2 .cke_dialog_ui_hbox_last{vertical-align:top;}.cke_skin_v2 .cke_ltr .cke_dialog_ui_hbox_first,.cke_skin_v2 .cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px;}.cke_skin_v2 .cke_rtl .cke_dialog_ui_hbox_first,.cke_skin_v2 .cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px;}.cke_skin_v2 a.cke_dialog_ui_button{border-collapse:separate;cursor:default;}.cke_skin_v2 a.cke_dialog_ui_button_ok span,.cke_skin_v2 a.cke_dialog_ui_button_cancel span{width:60px;}.cke_skin_v2 span.cke_dialog_ui_button{border:#737357 1px solid;padding:2px 10px;text-align:center;color:#3b3b1f;background-color:#c7c78f;display:inline-block;cursor:default;}.cke_skin_v2 .cke_browser_gecko18 .cke_dialog_footer_buttons span.cke_dialog_ui_button{display:block;}.cke_skin_v2 a.cke_dialog_ui_button span.cke_disabled{border:#898980 1px solid;color:#5e5e55;background-color:#c5c5b3;}.cke_skin_v2 a:focus span.cke_dialog_ui_button,.cke_skin_v2 a:active span.cke_dialog_ui_button{background-color:#e3e3c7;}.cke_skin_v2 .cke_hc a:focus span.cke_dialog_ui_button,.cke_skin_v2 .cke_hc a:active span.cke_dialog_ui_button{border-width:2px;}.cke_skin_v2 .cke_dialog_footer_buttons{display:inline-table;margin-right:12px;margin-left:12px;width:auto;position:relative;}
-.cke_skin_v2 .cke_browser_gecko18 .cke_dialog_footer_buttons{display:inline;}.cke_skin_v2 .cke_dialog_footer_buttons span.cke_dialog_ui_button{margin:7px 0;}.cke_skin_v2 .cke_browser_ie7 .cke_dialog_footer_buttons{position:static;}.cke_skin_v2 strong{font-weight:bold;}.cke_skin_v2 a.cke_dialog_close_button,.cke_skin_v2 a:hover.cke_dialog_close_button,.cke_skin_v2 .cke_browser_ie6 a.cke_dialog_close_button,.cke_skin_v2 .cke_browser_ie6 a:hover.cke_dialog_close_button{background-image:url(images/sprites.png);background-repeat:no-repeat;background-position:-16px -651px;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;_background-image:url(images/sprites_ie6.png);}.cke_skin_v2 a.cke_dialog_close_button span{display:none;}.cke_skin_v2 a:hover.cke_dialog_close_button{background-position:-16px -687px;}.cke_skin_v2 .cke_ltr a.cke_dialog_close_button,.cke_skin_v2 .cke_ltr a:hover.cke_dialog_close_button{right:22px;}.cke_skin_v2 .cke_rtl a.cke_dialog_close_button,.cke_skin_v2 .cke_rtl a:hover.cke_dialog_close_button{left:16px;_top:7px;}.cke_skin_v2 .cke_browser_ie6.cke_rtl a.cke_dialog_close_button,.cke_skin_v2 .cke_browser_ie6.cke_rtl a:hover.cke_dialog_close_button{position:relative;float:left;margin-top:-55px;margin-left:-7px;}.cke_skin_v2 .cke_browser_iequirks.cke_rtl.cke_single_page a.cke_dialog_close_button,.cke_skin_v2 .cke_browser_iequirks.cke_rtl.cke_single_page a:hover.cke_dialog_close_button{margin-top:-32px;}.cke_skin_v2 .cke_browser_iequirks.cke_ltr a.cke_dialog_close_button,.cke_skin_v2 .cke_browser_iequirks.cke_ltr a:hover.cke_dialog_close_button{margin-top:0;}.cke_skin_v2 .cke_dialog_ui_input_select{border:1px solid #a0a0a0;background-color:white;}.cke_skin_v2 .cke_dialog_ui_input_file{width:100%;height:25px;}.cke_skin_v2 .cke_dialog .cke_dark_background{background-color:#eaead1;}.cke_skin_v2 .cke_dialog .cke_hand{cursor:pointer;}.cke_skin_v2 .cke_dialog .cke_centered{text-align:center;}.cke_skin_v2 .cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px;}.cke_skin_v2 .cke_rtl .cke_dialog a.cke_btn_reset{float:left;}.cke_skin_v2 .cke_dialog a.cke_btn_locked,.cke_skin_v2 .cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px;}.cke_skin_v2 .cke_dialog a.cke_btn_locked .cke_icon{display:none;}.cke_skin_v2 .cke_rtl .cke_dialog a.cke_btn_locked,.cke_skin_v2 .cke_rtl .cke_dialog a.cke_btn_unlocked{float:right;}.cke_skin_v2 .cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.gif);}.cke_skin_v2 .cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer;}.cke_skin_v2 .cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:210px;width:230px;padding:2px;background-color:white;}.cke_skin_v2 .cke_dialog .ImagePreviewBox table td{white-space:normal;}.cke_skin_v2 .cke_browser_iequirks .cke_dialog_page_contents{_position:absolute;}.cke_skin_v2 .cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity=90);background-color:#e4e4e4;}.cke_skin_v2 .cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white;}.cke_skin_v2 .cke_dialog .cke_pastetext{width:346px;height:170px;}.cke_skin_v2 .cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none;}.cke_skin_v2 .cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid black;}.cke_skin_v2 .cke_dialog .cke_dark_background{text-align:center;background-color:#eaead1;font-size:14px;}.cke_skin_v2 .cke_dialog .cke_light_background{text-align:center;background-color:#ffffbe;}.cke_skin_v2 .cke_dialog .cke_hand{cursor:pointer;}.cke_skin_v2 .cke_disabled{color:#a0a0a0;}.cke_skin_v2 .cke_hc .cke_dialog_title,.cke_skin_v2 .cke_hc .cke_dialog_tabs,.cke_skin_v2 .cke_hc .cke_dialog_contents,.cke_skin_v2 .cke_hc .cke_dialog_footer{border-left:1px solid;border-right:1px solid;}
-.cke_skin_v2 .cke_hc .cke_dialog_title{border-top:1px solid;}.cke_skin_v2 .cke_hc .cke_dialog_footer{border-bottom:1px solid;}.cke_skin_v2 .cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px;}.cke_skin_v2 .cke_dialog_body .cke_label{display:none;}.cke_skin_v2 .cke_dialog_body label.cke_required{font-weight:bold;}.cke_skin_v2 .cke_hc .cke_dialog_body .cke_label{display:inline;cursor:inherit;}.cke_skin_v2 .cke_hc a.cke_btn_locked,.cke_skin_v2 .cke_hc a.cke_btn_unlocked,.cke_skin_v2 .cke_hc a.cke_btn_reset{border-style:solid;float:left;width:auto;height:auto;padding:0 2px;}.cke_skin_v2 .cke_hc a.cke_btn_locked .cke_icon{display:inline;}.cke_skin_v2 .cke_rtl.cke_hc a.cke_btn_locked,.cke_skin_v2 .cke_rtl.cke_hc a.cke_btn_unlocked,.cke_skin_v2 .cke_rtl.cke_hc a.cke_btn_reset{float:right;}.cke_skin_v2 a.cke_smile img{border:2px solid #eaead1;}.cke_skin_v2 a.cke_smile:focus img,.cke_skin_v2 a.cke_smile:active img,.cke_skin_v2 a.cke_smile:hover img{border-color:#C7C78F;}.cke_skin_v2 .cke_dialog_contents a.colorChooser{display:block;margin-top:12px;margin-left:10px;width:40px;}.cke_skin_v2 .cke_dialog_contents a.colorChooser .cke_dialog_ui_button{width:100%;}.cke_skin_v2 .cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px;}.cke_skin_v2 .cke_browser_gecko .cke_dialog_ui_checkbox_input:focus,.cke_skin_v2 .cke_browser_gecko .cke_dialog_ui_radio_input:focus,.cke_skin_v2 .cke_browser_opera .cke_dialog_ui_checkbox_input:focus,.cke_skin_v2 .cke_browser_opera .cke_dialog_ui_radio_input:focus,.cke_skin_v2 .cke_browser_gecko .cke_dialog_ui_input_select:focus,.cke_skin_v2 .cke_browser_gecko .cke_btn_over,.cke_skin_v2 .cke_browser_opera .cke_btn_over,.cke_skin_v2 .cke_browser_ie .cke_btn_over{outline:1px dotted #696969;}.cke_skin_v2 .cke_browser_ie .cke_dialog_ui_checkbox_input,.cke_skin_v2 .cke_browser_ie .cke_dialog_ui_ratio_input,.cke_skin_v2 .cke_browser_ie .cke_btn_reset,.cke_skin_v2 .cke_browser_ie .cke_btn_locked,.cke_skin_v2 .cke_browser_ie .cke_btn_unlocked{*border:1px solid transparent!important;-border:1px solid red!important;-filter:chroma(color=red);}.cke_skin_v2 .cke_browser_ie .cke_dialog_ui_focused,.cke_skin_v2 .cke_browser_ie .cke_btn_over{*border:1px dotted #696969!important;}.cke_skin_v2 .cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity=0);width:100%;height:100%;}.cke_dialog label{display:inline;margin-bottom:auto;cursor:default;}
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+body .cke_dialog{visibility:visible;}.cke_skin_v2 table.cke_dialog.cke_browser_gecko{display:block;}.cke_skin_v2 .cke_dialog_body{margin-left:16px;margin-right:16px;margin-top:2px;margin-bottom:20px;z-index:1;_position:static;}.cke_skin_v2 .cke_dialog_tl,.cke_skin_v2 .cke_dialog_tr,.cke_skin_v2 .cke_dialog_tc,.cke_skin_v2 .cke_dialog_bl,.cke_skin_v2 .cke_dialog_br,.cke_skin_v2 .cke_dialog_bc{background-image:url(images/sprites.png);background-repeat:no-repeat;position:absolute;_background-image:url(images/sprites_ie6.png);z-index:-1;}.cke_skin_v2 .cke_dialog_tl{background-position:-16px -16px;height:16px;width:16px;top:0;left:0;}.cke_skin_v2 .cke_rtl .cke_dialog_tl{background-position:-16px -397px;}.cke_skin_v2 .cke_dialog_tr{background-position:-16px -76px;height:16px;width:16px;top:0;right:0;}.cke_skin_v2 .cke_rtl .cke_dialog_tr{background-position:-16px -457px;}.cke_skin_v2 .cke_dialog_tc{background-position:0 -136px;background-repeat:repeat-x;height:16px;top:0;left:16px;right:16px;}.cke_skin_v2 .cke_dialog_bl{background-position:-16px -196px;height:51px;width:30px;bottom:0;left:0;}.cke_skin_v2 .cke_rtl .cke_dialog_bl{background-position:-16px -517px;}.cke_skin_v2 .cke_dialog_br{background-position:-16px -263px;height:51px;width:30px;bottom:0;right:0;}.cke_skin_v2 .cke_rtl .cke_dialog_br{background-position:-16px -584px;}.cke_skin_v2 .cke_dialog_bc{background-position:0 -330px;background-repeat:repeat-x;height:51px;bottom:0;left:30px;right:30px;}.cke_skin_v2 .cke_dialog_ml,.cke_skin_v2 .cke_dialog_mr{background-image:url(images/dialog_sides.png);background-repeat:repeat-y;position:absolute;width:16px;top:16px;bottom:51px;_background-image:url(images/dialog_sides.gif);_top:auto;}.cke_skin_v2 .cke_rtl .cke_dialog_ml,.cke_skin_v2 .cke_rtl .cke_dialog_mr{background-image:url(images/dialog_sides_rtl.png);_background-image:url(images/dialog_sides.gif);}.cke_skin_v2 .cke_dialog_ml{background-position:0 0;left:0;}.cke_skin_v2 .cke_dialog_mr{background-position:-16px 0;right:0;}.cke_skin_v2 .cke_browser_iequirks .cke_dialog_ml,.cke_skin_v2 .cke_browser_iequirks .cke_dialog_mr{margin-top:3px;}.cke_skin_v2 .cke_dialog_title{font-weight:bold;font-size:14pt;color:#737357;background-color:#e3e3c7;padding:3px 10px 26px 10px;cursor:move;position:relative;}.cke_skin_v2 .cke_browser_ie.cke_rtl .cke_dialog_title{position:static;}.cke_skin_v2 .cke_dialog_contents{background-color:#f1f1e3;border:#d5d59d 1px solid;overflow:auto;padding:5px 10px;}.cke_skin_v2 .cke_dialog_footer{background-color:#e3e3c7;text-align:right;}.cke_skin_v2 .cke_rtl .cke_dialog_footer{text-align:left;}.cke_skin_v2 .cke_dialog_footer .cke_resizer{margin-top:21px;}.cke_skin_v2 .cke_dialog_tabs{height:23px;background-color:#e3e3c7;display:inline-block;margin-left:10px;margin-right:10px;margin-top:-23px;position:absolute;z-index:2;}.cke_skin_v2 .cke_rtl .cke_dialog_tabs{right:10px;}.cke_skin_v2 a.cke_dialog_tab,.cke_skin_v2 a:link.cke_dialog_tab,.cke_skin_v2 a:active.cke_dialog_tab,.cke_skin_v2 a:hover.cke_dialog_tab,.cke_skin_v2 a:visited.cke_dialog_tab{color:#737357;border-left:1px solid #d5d59d;border-right:1px solid #d5d59d;border-top:1px solid #d5d59d;height:14px;padding:4px 5px;display:inline-block;cursor:pointer;}.cke_skin_v2 .cke_browser_gecko18 a.cke_dialog_tab,.cke_skin_v2 .cke_browser_gecko18 a:link.cke_dialog_tab,.cke_skin_v2 .cke_browser_gecko18 a:active.cke_dialog_tab,.cke_skin_v2 .cke_browser_gecko18 a:hover.cke_dialog_tab,.cke_skin_v2 .cke_browser_gecko18 a:visited.cke_dialog_tab{display:inline;position:relative;top:6px;}.cke_skin_v2 a:hover.cke_dialog_tab{background-color:#f1f1e3;}.cke_skin_v2 .cke_hc a:hover.cke_dialog_tab{padding:2px 3px!important;border-width:3px;}.cke_skin_v2 a.cke_dialog_tab_selected,.cke_skin_v2 a:link.cke_dialog_tab_selected,.cke_skin_v2 a:active.cke_dialog_tab_selected,.cke_skin_v2 a:hover.cke_dialog_tab_selected,.cke_skin_v2 a:visited.cke_dialog_tab_selected{border-bottom:1px solid #f1f1e3;background-color:#f1f1e3;font-weight:bold;cursor:default;}.cke_skin_v2 .cke_hc a.cke_dialog_tab_selected,.cke_skin_v2 .cke_hc a:link.cke_dialog_tab_selected,.cke_skin_v2 .cke_hc a:active.cke_dialog_tab_selected,.cke_skin_v2 .cke_hc a:hover.cke_dialog_tab_selected,.cke_skin_v2 .cke_hc a:visited.cke_dialog_tab_selected{padding:2px 3px!important;border-width:3px;}
+.cke_skin_v2 .cke_hc .cke_dialog_tabs a,.cke_skin_v2 .cke_hc .cke_dialog_footer a{opacity:1.0;filter:alpha(opacity=100);border:1px solid white;}.cke_skin_v2 .cke_single_page .cke_dialog_tabs{display:none;}.cke_skin_v2 .cke_single_page .cke_dialog_title{padding-bottom:3px;}.cke_skin_v2 .cke_dialog_ui_vbox table,.cke_skin_v2 .cke_dialog_ui_hbox table{margin:auto;}.cke_skin_v2 .cke_dialog_ui_vbox_child{padding:5px 0;}.cke_skin_v2 input.cke_dialog_ui_input_text,.cke_skin_v2 input.cke_dialog_ui_input_password{background-color:white;border:none;padding:0;width:100%;height:14px;}.cke_skin_v2 .cke_browser_gecko.cke_hc div.cke_dialog_ui_input_text,.cke_skin_v2 .cke_browser_gecko.cke_hc div.cke_dialog_ui_input_password{border-width:0;}.cke_skin_v2 .cke_browser_gecko18.cke_hc div.cke_dialog_ui_input_text,.cke_skin_v2 .cke_browser_gecko18.cke_hc div.cke_dialog_ui_input_password{border-width:1px;}.cke_skin_v2 .cke_browser_ie.cke_rtl input.cke_dialog_ui_input_text,.cke_skin_v2 .cke_browser_opera.cke_rtl input.cke_dialog_ui_input_text,.cke_skin_v2 .cke_browser_ie.cke_rtl input.cke_dialog_ui_input_password,.cke_skin_v2 .cke_browser_opera.cke_rtl input.cke_dialog_ui_input_password{padding-right:2px;}.cke_skin_v2 .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_text,.cke_skin_v2 .cke_browser_opera.cke_rtl div.cke_dialog_ui_input_text,.cke_skin_v2 .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_password,.cke_skin_v2 .cke_browser_opera.cke_rtl div.cke_dialog_ui_input_password{padding-left:2px;}.cke_skin_v2 .cke_browser_ie.cke_rtl .cke_dialog_ui_vbox_child,.cke_skin_v2 .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_child,.cke_skin_v2 .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_first,.cke_skin_v2 .cke_browser_ie.cke_rtl .cke_dialog_ui_hbox_last{padding-right:2px!important;}.cke_skin_v2 div.cke_dialog_ui_input_text,.cke_skin_v2 div.cke_dialog_ui_input_password{background-color:white;border:1px solid #a0a0a0;padding:1px 0;_width:99.9%;}.cke_skin_v2 .cke_browser_ie7 input.cke_dialog_ui_input_text,.cke_skin_v2 .cke_browser_ie7 input.cke_dialog_ui_input_password{position:absolute;}.cke_skin_v2 .cke_browser_ie7 div.cke_dialog_ui_input_text,.cke_skin_v2 .cke_browser_ie7 div.cke_dialog_ui_input_password{height:14px;position:relative;}.cke_skin_v2 .cke_browser_ie.cke_rtl div.cke_dialog_ui_input_text{padding-right:1px;}.cke_skin_v2 textarea.cke_dialog_ui_input_textarea{background-color:white;border:none;padding:0;width:100%;_width:99%;overflow:auto;resize:none;}.cke_skin_v2 div.cke_dialog_ui_input_textarea{background-color:white;border:1px solid #a0a0a0;padding:1px 0;}.cke_skin_v2 .cke_rtl .cke_dialog_ui_labeled_content{_width:95%;}.cke_skin_v2 div.cke_disabled .cke_dialog_ui_labeled_content *{background-color:#a0a0a0;cursor:default;}.cke_skin_v2 .cke_dialog_ui_hbox{width:100%;}.cke_skin_v2 .cke_dialog_ui_hbox_first,.cke_skin_v2 .cke_dialog_ui_hbox_child,.cke_skin_v2 .cke_dialog_ui_hbox_last{vertical-align:top;}.cke_skin_v2 .cke_ltr .cke_dialog_ui_hbox_first,.cke_skin_v2 .cke_ltr .cke_dialog_ui_hbox_child{padding-right:10px;}.cke_skin_v2 .cke_rtl .cke_dialog_ui_hbox_first,.cke_skin_v2 .cke_rtl .cke_dialog_ui_hbox_child{padding-left:10px;}.cke_skin_v2 a.cke_dialog_ui_button{border-collapse:separate;cursor:default;}.cke_skin_v2 a.cke_dialog_ui_button_ok span,.cke_skin_v2 a.cke_dialog_ui_button_cancel span{width:60px;}.cke_skin_v2 span.cke_dialog_ui_button{border:#737357 1px solid;padding:2px 10px;text-align:center;color:#3b3b1f;background-color:#c7c78f;display:inline-block;cursor:default;}.cke_skin_v2 .cke_browser_gecko18 .cke_dialog_footer_buttons span.cke_dialog_ui_button{display:block;}.cke_skin_v2 a.cke_dialog_ui_button span.cke_disabled{border:#898980 1px solid;color:#5e5e55;background-color:#c5c5b3;}.cke_skin_v2 a:focus span.cke_dialog_ui_button,.cke_skin_v2 a:active span.cke_dialog_ui_button{background-color:#e3e3c7;}.cke_skin_v2 .cke_hc a:focus span.cke_dialog_ui_button,.cke_skin_v2 .cke_hc a:active span.cke_dialog_ui_button{border-width:2px;}.cke_skin_v2 .cke_dialog_footer_buttons{display:inline-table;margin-right:12px;margin-left:12px;width:auto;position:relative;}
+.cke_skin_v2 .cke_browser_gecko18 .cke_dialog_footer_buttons{display:inline;}.cke_skin_v2 .cke_dialog_footer_buttons span.cke_dialog_ui_button{margin:7px 0;}.cke_skin_v2 .cke_browser_ie7 .cke_dialog_footer_buttons{position:static;}.cke_skin_v2 strong{font-weight:bold;}.cke_skin_v2 a.cke_dialog_close_button,.cke_skin_v2 a:hover.cke_dialog_close_button,.cke_skin_v2 .cke_browser_ie6 a.cke_dialog_close_button,.cke_skin_v2 .cke_browser_ie6 a:hover.cke_dialog_close_button{background-image:url(images/sprites.png);background-repeat:no-repeat;background-position:-16px -651px;position:absolute;cursor:pointer;text-align:center;height:20px;width:20px;top:5px;_background-image:url(images/sprites_ie6.png);}.cke_skin_v2 a.cke_dialog_close_button span{display:none;}.cke_skin_v2 a:hover.cke_dialog_close_button{background-position:-16px -687px;}.cke_skin_v2 .cke_ltr a.cke_dialog_close_button,.cke_skin_v2 .cke_ltr a:hover.cke_dialog_close_button{right:22px;}.cke_skin_v2 .cke_rtl a.cke_dialog_close_button,.cke_skin_v2 .cke_rtl a:hover.cke_dialog_close_button{left:16px;_top:7px;}.cke_skin_v2 .cke_browser_ie6.cke_rtl a.cke_dialog_close_button,.cke_skin_v2 .cke_browser_ie6.cke_rtl a:hover.cke_dialog_close_button{position:relative;float:left;margin-top:-55px;margin-left:-7px;}.cke_skin_v2 .cke_browser_iequirks.cke_rtl.cke_single_page a.cke_dialog_close_button,.cke_skin_v2 .cke_browser_iequirks.cke_rtl.cke_single_page a:hover.cke_dialog_close_button{margin-top:-32px;}.cke_skin_v2 .cke_browser_iequirks.cke_ltr a.cke_dialog_close_button,.cke_skin_v2 .cke_browser_iequirks.cke_ltr a:hover.cke_dialog_close_button{margin-top:0;}.cke_skin_v2 .cke_dialog_ui_input_select{border:1px solid #a0a0a0;background-color:white;}.cke_skin_v2 .cke_dialog_ui_input_file{width:100%;height:25px;}.cke_skin_v2 .cke_dialog .cke_dark_background{background-color:#eaead1;}.cke_skin_v2 .cke_dialog .cke_hand{cursor:pointer;}.cke_skin_v2 .cke_dialog .cke_centered{text-align:center;}.cke_skin_v2 .cke_dialog a.cke_btn_reset{float:right;background-position:0 -32px;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:1px none;font-size:1px;}.cke_skin_v2 .cke_rtl .cke_dialog a.cke_btn_reset{float:left;}.cke_skin_v2 .cke_dialog a.cke_btn_locked,.cke_skin_v2 .cke_dialog a.cke_btn_unlocked{float:left;background-position:0 0;background-image:url(images/mini.gif);width:16px;height:16px;background-repeat:no-repeat;border:none 1px;font-size:1px;}.cke_skin_v2 .cke_dialog a.cke_btn_locked .cke_icon{display:none;}.cke_skin_v2 .cke_rtl .cke_dialog a.cke_btn_locked,.cke_skin_v2 .cke_rtl .cke_dialog a.cke_btn_unlocked{float:right;}.cke_skin_v2 .cke_dialog a.cke_btn_unlocked{background-position:0 -16px;background-image:url(images/mini.gif);}.cke_skin_v2 .cke_dialog .cke_btn_over{border:outset 1px;cursor:pointer;}.cke_skin_v2 .cke_dialog .ImagePreviewBox{border:2px ridge black;overflow:scroll;height:210px;width:230px;padding:2px;background-color:white;}.cke_skin_v2 .cke_dialog .ImagePreviewBox table td{white-space:normal;}.cke_skin_v2 .cke_browser_iequirks .cke_dialog_page_contents{_position:absolute;}.cke_skin_v2 .cke_dialog .ImagePreviewLoader{position:absolute;white-space:normal;overflow:hidden;height:160px;width:230px;margin:2px;padding:2px;opacity:.9;filter:alpha(opacity=90);background-color:#e4e4e4;}.cke_skin_v2 .cke_dialog .FlashPreviewBox{white-space:normal;border:2px ridge black;overflow:auto;height:160px;width:390px;padding:2px;background-color:white;}.cke_skin_v2 .cke_dialog .cke_pastetext{width:346px;height:170px;}.cke_skin_v2 .cke_dialog .cke_pastetext textarea{width:340px;height:170px;resize:none;}.cke_skin_v2 .cke_dialog iframe.cke_pasteframe{width:346px;height:130px;background-color:white;border:1px solid black;}.cke_skin_v2 .cke_dialog .cke_dark_background{text-align:center;background-color:#eaead1;font-size:14px;}.cke_skin_v2 .cke_dialog .cke_light_background{text-align:center;background-color:#ffffbe;}.cke_skin_v2 .cke_dialog .cke_hand{cursor:pointer;}.cke_skin_v2 .cke_disabled{color:#a0a0a0;}.cke_skin_v2 .cke_hc .cke_dialog_title,.cke_skin_v2 .cke_hc .cke_dialog_tabs,.cke_skin_v2 .cke_hc .cke_dialog_contents,.cke_skin_v2 .cke_hc .cke_dialog_footer{border-left:1px solid;border-right:1px solid;}
+.cke_skin_v2 .cke_hc .cke_dialog_title{border-top:1px solid;}.cke_skin_v2 .cke_hc .cke_dialog_footer{border-bottom:1px solid;}.cke_skin_v2 .cke_hc .cke_dialog_close_button span{display:inline;cursor:pointer;font-weight:bold;position:relative;top:3px;}.cke_skin_v2 .cke_dialog_body .cke_label{display:none;}.cke_skin_v2 .cke_dialog_body label.cke_required{font-weight:bold;}.cke_skin_v2 .cke_hc .cke_dialog_body .cke_label{display:inline;cursor:inherit;}.cke_skin_v2 .cke_hc a.cke_btn_locked,.cke_skin_v2 .cke_hc a.cke_btn_unlocked,.cke_skin_v2 .cke_hc a.cke_btn_reset{border-style:solid;float:left;width:auto;height:auto;padding:0 2px;}.cke_skin_v2 .cke_hc a.cke_btn_locked .cke_icon{display:inline;}.cke_skin_v2 .cke_rtl.cke_hc a.cke_btn_locked,.cke_skin_v2 .cke_rtl.cke_hc a.cke_btn_unlocked,.cke_skin_v2 .cke_rtl.cke_hc a.cke_btn_reset{float:right;}.cke_skin_v2 a.cke_smile img{border:2px solid #eaead1;}.cke_skin_v2 a.cke_smile:focus img,.cke_skin_v2 a.cke_smile:active img,.cke_skin_v2 a.cke_smile:hover img{border-color:#C7C78F;}.cke_skin_v2 .cke_dialog_contents a.colorChooser{display:block;margin-top:12px;margin-left:10px;width:40px;}.cke_skin_v2 .cke_dialog_contents a.colorChooser .cke_dialog_ui_button{width:100%;}.cke_skin_v2 .cke_rtl .cke_dialog_contents a.colorChooser{margin-right:10px;}.cke_skin_v2 .cke_browser_gecko .cke_dialog_ui_checkbox_input:focus,.cke_skin_v2 .cke_browser_gecko .cke_dialog_ui_radio_input:focus,.cke_skin_v2 .cke_browser_opera .cke_dialog_ui_checkbox_input:focus,.cke_skin_v2 .cke_browser_opera .cke_dialog_ui_radio_input:focus,.cke_skin_v2 .cke_browser_gecko .cke_dialog_ui_input_select:focus,.cke_skin_v2 .cke_browser_gecko .cke_btn_over,.cke_skin_v2 .cke_browser_opera .cke_btn_over,.cke_skin_v2 .cke_browser_ie .cke_btn_over{outline:1px dotted #696969;}.cke_skin_v2 .cke_browser_ie .cke_dialog_ui_checkbox_input,.cke_skin_v2 .cke_browser_ie .cke_dialog_ui_ratio_input,.cke_skin_v2 .cke_browser_ie .cke_btn_reset,.cke_skin_v2 .cke_browser_ie .cke_btn_locked,.cke_skin_v2 .cke_browser_ie .cke_btn_unlocked{*border:1px solid transparent!important;-border:1px solid red!important;-filter:chroma(color=red);}.cke_skin_v2 .cke_browser_ie .cke_dialog_ui_focused,.cke_skin_v2 .cke_browser_ie .cke_btn_over{*border:1px dotted #696969!important;}.cke_skin_v2 .cke_iframe_shim{display:block;position:absolute;top:0;left:0;z-index:-1;filter:alpha(opacity=0);width:100%;height:100%;}.cke_dialog label{display:inline;margin-bottom:auto;cursor:default;}
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/skins/v2/editor.css b/sm-shop/src/main/webapp/resources/js/ckeditor/skins/v2/editor.css
index 9e8fda8..5ec9ddb 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/skins/v2/editor.css
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/skins/v2/editor.css
@@ -1,13 +1,13 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-.cke_skin_v2 *,.cke_skin_v2 a:hover,.cke_skin_v2 a:link,.cke_skin_v2 a:visited,.cke_skin_v2 a:active{margin:0;padding:0;border:0;background:transparent;text-decoration:none;font:normal normal normal 100% Sans-Serif;width:auto;height:auto;border-collapse:collapse;text-align:left;vertical-align:baseline;white-space:nowrap;cursor:auto;color:#000;float:none;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;}.cke_skin_v2 .cke_rtl *,.cke_skin_v2 .cke_rtl a:hover,.cke_skin_v2 .cke_rtl a:link,.cke_skin_v2 .cke_rtl a:visited,.cke_skin_v2 .cke_rtl a:active,.cke_rtl .cke_skin_v2 *,.cke_rtl .cke_skin_v2 a:hover,.cke_rtl .cke_skin_v2 a:link,.cke_rtl .cke_skin_v2 a:visited,.cke_rtl .cke_skin_v2 a:active{text-align:right;}.cke_skin_v2 iframe{vertical-align:inherit;}.cke_skin_v2 textarea{white-space:pre;}.cke_skin_v2 .cke_browser_gecko textarea{cursor:text;}.cke_skin_v2 .cke_browser_gecko textarea[disabled]{cursor:default;}.cke_skin_v2 input[type="text"],.cke_skin_v2 input[type="password"]{cursor:text;}.cke_skin_v2 input[type="text"][disabled],.cke_skin_v2 input[type="password"][disabled]{cursor:default;}.cke_skin_v2 fieldset{padding:10px;border:2px groove #E0DFE3;}.cke_skin_v2 .cke_editor{display:inline-table;width:100%;}.cke_skin_v2 .cke_browser_webkit .cke_editor{display:table;}.cke_skin_v2{display:block;}.cke_skin_v2 span.cke_browser_webkit,.cke_skin_v2 span.cke_browser_gecko18{display:block;}.cke_skin_v2 .cke_wrapper{display:block;}.cke_skin_v2 .cke_browser_opera .cke_editor{display:table;}.cke_skin_v2 .cke_top,.cke_skin_v2 .cke_bottom,.cke_shared .cke_skin_v2{background-color:#efefde;}.cke_skin_v2 .cke_top{border-top:solid 1px #fafaf5;border-left:solid 1px #fafaf5;border-right:solid 1px #696969;border-bottom:solid 2px #696969;}.cke_skin_v2 .cke_rtl .cke_top{border-left:solid 1px #696969;border-right:solid 1px #fafaf5;}.cke_skin_v2 .cke_bottom{border-left:solid 1px #696969;border-right:solid 1px #696969;border-bottom:solid 1px #696969;}.cke_skin_v2 .cke_contents{border:solid 1px #696969;background-color:white;}.cke_skin_v2 .cke_focus{outline:auto 5px -webkit-focus-ring-color;}.cke_skin_v2 textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre;}.cke_skin_v2 .cke_browser_iequirks textarea.cke_source{_white-space:normal;}.cke_skin_v2 .cke_resizer{width:12px;height:12px;margin-top:16px;display:block;float:right;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -801px;background-repeat:no-repeat;cursor:se-resize;}.cke_skin_v2 .cke_browser_air .cke_resizer,.cke_skin_v2 .cke_browser_air .cke_rtl .cke_resizer{cursor:move;}.cke_skin_v2 .cke_resizer_rtl{cursor:sw-resize;background-position:0 -828px;float:left;}.cke_skin_v2 .cke_resizer_horizontal,.cke_skin_v2 .cke_rtl .cke_resizer_horizontal{cursor:e-resize;}.cke_skin_v2 .cke_resizer_vertical,.cke_skin_v2 .cke_rtl .cke_resizer_vertical{cursor:n-resize;}.cke_skin_v2 .cke_maximized .cke_resizer{display:none;}.cke_skin_v2 .cke_browser_ie6 .cke_contents textarea,.cke_skin_v2 .cke_browser_ie7 .cke_contents textarea{position:absolute;}.cke_skin_v2 .cke_voice_label{display:none;}.cke_skin_v2 legend.cke_voice_label{display:none;}.cke_skin_v2 .cke_browser_ie legend.cke_voice_label{position:absolute;display:block;width:0;height:0;overflow:hidden;}.cke_skin_v2 .cke_panel{border:1px solid #8f8f73;background-color:#fff;width:120px;height:100px;overflow:hidden;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.cke_skin_v2 .cke_panel iframe{width:100%;height:100%;}.cke_skin_v2 .cke_panel_frame .cke_label{display:none;}html.cke_skin_v2_container{overflow:auto;overflow-x:hidden;}body.cke_panel_frame{overflow:auto;}ul.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap;}li.cke_panel_listItem{margin:0;}.cke_panel_listItem a{padding:2px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;}* html .cke_panel_listItem a{width:100%;color:#000;}*:first-child+html .cke_panel_listItem a{color:#000;}
-.cke_panel_listItem.cke_selected a{border:1px solid #ccc;background-color:#e9f5ff;}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#316ac5;background-color:#dff1ff;}.cke_hc .cke_panel_listItem.cke_selected a,.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border-width:3px;padding:0;}.cke_panel_grouptitle{font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;font-weight:bold;white-space:nowrap;background-color:#dcdcdc;color:#000;margin:0;padding:3px;}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:3px;margin-bottom:3px;}.cke_skin_v2 .cke_button_textcolor_panel,.cke_skin_v2 .cke_button_bgcolor_panel{width:150px;height:135px;}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000;}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left;}.cke_rtl span.cke_colorbox{float:right;}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;}.cke_rtl a.cke_colorbox{float:right;}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#316ac5 1px solid;background-color:#dff1ff;}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer;}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#316ac5 1px solid;background-color:#dff1ff;}@media print{.cke_skin_v2 .cke_toolbox{display:none;}}.cke_skin_v2 .cke_browser_webkit .cke_toolbox,.cke_skin_v2 .cke_browser_webkit .cke_toolbox>span{white-space:normal;}.cke_skin_v2 .cke_toolbox{clear:both;padding-bottom:1px;}.cke_skin_v2 a.cke_toolbox_collapser,.cke_skin_v2 a:hover.cke_toolbox_collapser{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:3px -739px;background-repeat:no-repeat;width:11px;height:11px;float:right;border:outset 1px;margin:11px 2px 2px;cursor:pointer;}.cke_skin_v2 a.cke_toolbox_collapser span{display:none;}.cke_skin_v2 .cke_hc a.cke_toolbox_collapser span{font-size:10px;font-weight:bold;font-family:Arial;display:inline;}.cke_skin_v2 .cke_rtl a.cke_toolbox_collapser,.cke_skin_v2 .cke_rtl a:hover.cke_toolbox_collapser{float:left;}.cke_skin_v2 a.cke_toolbox_collapser_min,.cke_skin_v2 a:hover.cke_toolbox_collapser_min{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:4px -760px;background-repeat:no-repeat;margin:2px;}.cke_skin_v2 .cke_rtl a.cke_toolbox_collapser_min,.cke_skin_v2 .cke_rtl a:hover.cke_toolbox_collapser_min{background-position:4px -781px;}.cke_skin_v2 .cke_toolbar{padding-top:1px;padding-bottom:1px;display:inline-block;float:left;}.cke_skin_v2 .cke_rtl .cke_toolbar{float:right;}.cke_skin_v2 .cke_toolgroup{display:inline-block;float:left;}.cke_skin_v2 .cke_browser_ie .cke_toolgroup{#float:none;#display:inline;}.cke_skin_v2 .cke_rtl .cke_toolgroup{float:right;}.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_toolgroup{#float:none;}.cke_skin_v2 .cke_separator{display:inline-block;float:left;border-left:solid 1px #999;margin:4px 2px;height:16px;}.cke_skin_v2 .cke_browser_ie .cke_separator{#float:none;#display:inline;}.cke_skin_v2 .cke_rtl .cke_separator{float:right;}.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_separator{#float:none;}.cke_skin_v2 .cke_break{clear:left;}.cke_skin_v2 .cke_rtl .cke_break{clear:right;}.cke_skin_v2 .cke_toolbar_start{display:inline-block;background-image:url(images/toolbar_start.gif);background-repeat:no-repeat;margin:4px 2px 0 2px;width:3px;height:20px;float:left;}.cke_skin_v2 .cke_browser_ie .cke_toolbar_start{#float:none;#display:inline;}.cke_skin_v2 .cke_rtl .cke_toolbar_start{float:right;}.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_toolbar_start{#float:none;}.cke_skin_v2 .cke_toolbar_end{display:inline-block;float:left;}
-.cke_skin_v2 .cke_browser_ie .cke_toolbar_end{#float:none;#display:inline;}.cke_skin_v2 .cke_rtl .cke_toolbar_end{float:right;}.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_toolbar_end{#float:none;}.cke_skin_v2 .cke_browser_ie9 .cke_rtl .cke_separator,.cke_skin_v2 .cke_browser_ie9 .cke_rtl .cke_toolbar_start,.cke_skin_v2 .cke_browser_ie9 .cke_rtl .cke_toolbar_end{vertical-align:middle;}.cke_skin_v2 .cke_button a,.cke_skin_v2 .cke_button a:hover,.cke_skin_v2 .cke_button a:focus,.cke_skin_v2 .cke_button a:active,.cke_skin_v2 .cke_button a.cke_off{border:solid 1px #efefde;display:inline-block;border-radius:3px;outline:none;padding-top:2px;padding-left:4px;padding-right:4px;padding-bottom:2px;height:18px;cursor:default;}.cke_skin_v2 .cke_button a,.cke_skin_v2 .cke_button a.cke_off{background-color:#efefde;filter:alpha(opacity=70);opacity:.70;-moz-border-radius:3px;-webkit-border-radius:3px;}.cke_skin_v2 .cke_hc .cke_button a,.cke_skin_v2 .cke_hc .cke_button a.cke_off{opacity:1.0;filter:alpha(opacity=100);}.cke_skin_v2 .cke_button a.cke_on{border:solid 1px #316ac5;background-color:#a3d7ff;filter:alpha(opacity=100);opacity:1;}.cke_skin_v2 .cke_button a.cke_disabled *{filter:alpha(opacity=30);opacity:.3;}.cke_skin_v2 .cke_browser_ie .cke_button a.cke_disabled *,.cke_skin_v2 .cke_browser_ie a:hover.cke_button .cke_disabled *{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale'), alpha(opacity=30);}.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_button a.cke_disabled *,.cke_skin_v2 .cke_browser_ie .cke_rtl a:hover.cke_button .cke_disabled *{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale'), alpha(opacity=30);}.cke_skin_v2 .cke_browser_ie6 .cke_button a.cke_disabled *,.cke_skin_v2 .cke_browser_ie6 a:hover.cke_button .cke_disabled *,.cke_skin_v2 .cke_browser_ie .cke_button.cke_noalphafix a.cke_disabled *{filter:alpha(opacity=30);}.cke_skin_v2 .cke_hc .cke_button a.cke_disabled *,.cke_skin_v2 .cke_browser_ie.cke_hc a:hover.cke_button .cke_disabled *{filter:alpha(opacity=60);opacity:.6;}.cke_skin_v2 .cke_button a:hover,.cke_skin_v2 .cke_button a:focus,.cke_skin_v2 .cke_button a:active{border:solid 1px #316ac5;background-color:#dff1ff;padding:2px 4px;}.cke_skin_v2 .cke_hc .cke_button a:hover,.cke_skin_v2 .cke_hc .cke_button a:focus,.cke_skin_v2 .cke_hc .cke_button a:active{padding:0 2px!important;border-width:3px;}.cke_skin_v2 .cke_button .cke_icon{background-image:url(icons.png);background-position:100px;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;display:inline-block;cursor:default;}.cke_skin_v2 .cke_rtl .cke_button .cke_icon{background-image:url(icons_rtl.png);}.cke_skin_v2 .cke_browser_ie .cke_button .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_button .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_skin_v2 .cke_browser_ie6 .cke_button .cke_icon,.cke_skin_v2 .cke_browser_ie6 .cke_rtl .cke_button .cke_icon,.cke_skin_v2 .cke_browser_ie .cke_button.cke_noalphafix .cke_icon,.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_button.cke_noalphafix .cke_icon{filter:;}.cke_skin_v2 .cke_button .cke_label{cursor:default;display:none;padding-left:3px;vertical-align:middle;}.cke_skin_v2 .cke_hc .cke_button .cke_label{padding:0;display:inline-block;}.cke_skin_v2 .cke_hc .cke_button .cke_icon{display:none;}.cke_skin_v2 .cke_accessibility{position:absolute;display:block;width:0;height:0;overflow:hidden;}.cke_skin_v2 .cke_button .cke_buttonarrow{display:inline-block;height:17px;width:8px;background-position:2px -717px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:no-repeat;cursor:default;}.cke_skin_v2 .cke_rtl .cke_button .cke_buttonarrow{background-position:0 -717px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);}.cke_skin_v2 .cke_browser_gecko18 .cke_toolbar,.cke_skin_v2 .cke_browser_gecko18 .cke_button a,.cke_skin_v2 .cke_browser_gecko18 .cke_button a.cke_off,.cke_skin_v2 .cke_browser_gecko18 .cke_button .cke_icon,.cke_skin_v2 .cke_browser_gecko18 .cke_button .cke_buttonarrow,.cke_skin_v2 .cke_browser_gecko18 .cke_separator,.cke_skin_v2 .cke_browser_gecko18 .cke_toolbar_start{display:block;float:left;}
-.cke_skin_v2 .cke_browser_gecko18 .cke_hc .cke_button .cke_icon{display:none;}.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_toolbar,.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_button a,.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_button a.cke_off,.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_button .cke_icon,.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_button .cke_buttonarrow,.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_separator,.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_toolbar_start{float:right;}.cke_skin_v2 .cke_browser_gecko18 .cke_button .cke_label,.cke_skin_v2 .cke_browser_gecko18 .cke_break{float:left;}.cke_skin_v2 .cke_browser_gecko18 .cke_rtl span.cke_inline_label{float:right;}.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_button .cke_label,.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_break{float:right;}.cke_skin_v2 .cke_browser_gecko18 .cke_separator{margin-top:4px;}.cke_skin_v2 .cke_browser_gecko18 .cke_button .cke_label{padding-top:3px;}.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_toolgroup,.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_separator,.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_toolbar_start,.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_toolbar_end{float:none;}.cke_skin_v2 .cke_browser_ie8 .cke_toolbar,.cke_skin_v2 .cke_browser_ie8 .cke_toolgroup{vertical-align:top;}.cke_skin_v2 .cke_browser_iequirks.cke_browser_ie8 .cke_toolbar,.cke_skin_v2 .cke_browser_iequirks.cke_browser_ie8 .cke_toolgroup{vertical-align:baseline;}.cke_skin_v2 .cke_browser_ie .cke_rcombo,.cke_skin_v2 .cke_browser_ie .cke_rcombo *{cursor:default;}.cke_skin_v2 .cke_contextmenu{padding:2px;}.cke_skin_v2 .cke_menuitem a{display:block;}.cke_skin_v2 .cke_menuitem span{cursor:default;}.cke_skin_v2 .cke_menuitem a:hover,.cke_skin_v2 .cke_menuitem a:focus,.cke_skin_v2 .cke_menuitem a:active{background-color:#8f8f73;display:block;}.cke_hc .cke_menuitem a:hover,.cke_hc .cke_menuitem a:focus,.cke_hc .cke_menuitem a:active{border:2px solid;}.cke_skin_v2 .cke_menuitem .cke_icon{background-image:url(icons.png);background-position:100px;background-repeat:no-repeat;background-color:transparent;width:16px;height:16px;float:left;}.cke_rtl .cke_skin_v2 .cke_menuitem .cke_icon{background-image:url(icons_rtl.png);}.cke_browser_ie .cke_skin_v2 .cke_menuitem .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie.cke_rtl .cke_skin_v2 .cke_menuitem .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie6 .cke_skin_v2 .cke_menuitem .cke_icon,.cke_browser_ie .cke_skin_v2 .cke_menuitem.cke_noalphafix .cke_icon{filter:;}.cke_skin_v2 .cke_menuitem .cke_disabled .cke_icon{filter:alpha(opacity=70);opacity:.70;}.cke_browser_ie .cke_skin_v2 .cke_menuitem .cke_disabled .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie.cke_rtl .cke_skin_v2 .cke_menuitem .cke_disabled .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie6 .cke_skin_v2 .cke_menuitem .cke_disabled .cke_icon,.cke_browser_ie .cke_skin_v2 .cke_menuitem.cke_noalphafix .cke_disabled .cke_icon{filter:;}.cke_skin_v2 .cke_menuitem .cke_icon_wrapper{background-color:#e3e3c7;border:solid 4px #e3e3c7;width:16px;height:16px;float:left;filter:alpha(opacity=70);opacity:.70;clear:both;}.cke_rtl .cke_skin_v2 .cke_menuitem .cke_icon_wrapper{float:right;}.cke_skin_v2 .cke_menuitem a:hover .cke_icon_wrapper,.cke_skin_v2 .cke_menuitem a:focus .cke_icon_wrapper,.cke_skin_v2 .cke_menuitem a:active .cke_icon_wrapper{background-color:#9d9d9d;border:solid 4px #9d9d9d;filter:alpha(opacity=70);opacity:.70;}.cke_skin_v2 .cke_menuitem a:hover.cke_disabled .cke_icon_wrapper,.cke_skin_v2 .cke_menuitem a:focus.cke_disabled .cke_icon_wrapper,.cke_skin_v2 .cke_menuitem a:active.cke_disabled .cke_icon_wrapper{background-color:#e3e3c7;border:solid 4px #e3e3c7;}.cke_skin_v2 .cke_menuitem .cke_label{display:block;padding-right:3px;padding-top:5px;padding-left:4px;height:19px;margin-left:24px;background-color:#fff;}
-.cke_skin_v2 .cke_frameLoaded .cke_menuitem .cke_label{filter:alpha(opacity=70);opacity:.70;}.cke_rtl .cke_skin_v2 .cke_menuitem .cke_label{padding-right:0;margin-left:0;padding-left:3px;margin-right:28px;}.cke_skin_v2 .cke_menuitem a.cke_disabled .cke_label{filter:alpha(opacity=30);opacity:.30;}.cke_skin_v2 .cke_menuitem a:hover .cke_label,.cke_skin_v2 .cke_menuitem a:focus .cke_label,.cke_skin_v2 .cke_menuitem a:active .cke_label{background-color:#8f8f73;color:white;}.cke_skin_v2 .cke_menuitem a.cke_disabled:hover .cke_label,.cke_skin_v2 .cke_menuitem a.cke_disabled:focus .cke_label,.cke_skin_v2 .cke_menuitem a.cke_disabled:active .cke_label{background-color:transparent;color:black;}.cke_skin_v2 .cke_menuseparator{background-color:#e3e3c7;height:2px;filter:alpha(opacity=70);opacity:.70;_font-size:0;}.cke_skin_v2 .cke_menuarrow{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -784px;background-repeat:no-repeat;height:5px;width:3px;float:right;margin-right:2px;margin-top:3px;}.cke_rtl .cke_skin_v2 .cke_menuarrow{float:left;margin-right:0;margin-left:2px;background-position:0 -763px;}.cke_skin_v2 .cke_menuarrow span{display:none;}.cke_hc .cke_skin_v2 .cke_menuarrow{width:auto;margin-top:0;}.cke_hc .cke_skin_v2 .cke_menuarrow span{display:inline;}.cke_browser_ie.cke_ltr .cke_skin_v2 .cke_menuarrow{position:absolute;right:2px;}.cke_browser_ie.cke_rtl .cke_skin_v2 .cke_menuarrow{position:absolute;left:2px;}.cke_skin_v2 .cke_rcombo{display:inline-block;margin-left:2px;margin-right:2px;margin-top:2px;vertical-align:top;}.cke_skin_v2 .cke_browser_ie .cke_rcombo{#display:inline;}.cke_skin_v2 .cke_rcombopanel{border:1px solid #316ac5;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;}.cke_skin_v2 .cke_rcombo a{display:inline-block;float:left;filter:alpha(opacity=70);opacity:.70;}.cke_skin_v2 .cke_rtl .cke_rcombo a{float:right;}.cke_skin_v2 .cke_hc .cke_rcombo a{filter:alpha(opacity=100);opacity:1.0;}.cke_skin_v2 .cke_rcombo .cke_label{float:left;line-height:20px;line-height:22px\9;height:22px;padding-left:4px;padding-right:5px;filter:alpha(opacity=70);opacity:.70;background-color:#f1f1e3;cursor:default;}.cke_skin_v2 .cke_rtl .cke_rcombo .cke_label{float:right;padding-right:4px;padding-left:5px;}.cke_skin_v2 .cke_hc .cke_rcombo .cke_label{filter:alpha(opacity=100);opacity:1.0;}.cke_skin_v2 .cke_rcombo .cke_inline_label{color:#fff;}.cke_skin_v2 .cke_rcombo .cke_text{border:1px solid #8f8f73;background-color:#fff;height:12px;width:60px;padding-top:4px;padding-bottom:4px;padding-left:5px;padding-right:5px;text-overflow:ellipsis;overflow:hidden;display:inline-block;vertical-align:top;cursor:default;}.cke_skin_v2 .cke_ltr .cke_rcombo .cke_text{-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;}.cke_skin_v2 .cke_rtl .cke_rcombo .cke_text{-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;}.cke_skin_v2 .cke_browser_iequirks .cke_rcombo .cke_text{height:22px;}.cke_skin_v2 .cke_rcombo .cke_openbutton{display:inline-block;border-top:1px solid #8f8f73;border-bottom:1px solid #8f8f73;}.cke_skin_v2 .cke_rcombo .cke_openbutton .cke_icon{display:inline-block;background-position:5px -715px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:no-repeat;width:14px;height:20px;}.cke_skin_v2 .cke_browser_ie .cke_rcombo .cke_openbutton .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_skin_v2 .cke_browser_ie6 .cke_rcombo .cke_openbutton .cke_icon{filter:;}.cke_skin_v2 .cke_hc .cke_rcombo .cke_openbutton .cke_icon{background:none;filter:;}.cke_skin_v2 .cke_ltr .cke_rcombo .cke_openbutton{border-right:1px solid #8f8f73;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;}
-.cke_skin_v2 .cke_rtl .cke_rcombo .cke_openbutton{border-left:1px solid #8f8f73;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;}.cke_skin_v2 .cke_rcombo .cke_off a:hover,.cke_skin_v2 .cke_rcombo .cke_off a:focus,.cke_skin_v2 .cke_rcombo .cke_off a:active,.cke_skin_v2 .cke_rcombo .cke_on a{filter:alpha(opacity=100);opacity:1;}.cke_skin_v2 .cke_rcombo .cke_off a:hover .cke_text,.cke_skin_v2 .cke_rcombo .cke_off a:focus .cke_text,.cke_skin_v2 .cke_rcombo .cke_off a:active .cke_text,.cke_skin_v2 .cke_rcombo .cke_on .cke_text{border-color:#316ac5;}.cke_skin_v2 .cke_rcombo .cke_off a:hover .cke_openbutton,.cke_skin_v2 .cke_rcombo .cke_off a:focus .cke_openbutton,.cke_skin_v2 .cke_rcombo .cke_off a:active .cke_openbutton,.cke_skin_v2 .cke_rcombo .cke_on .cke_openbutton{border-color:#316ac5;background-color:#dff1ff;}.cke_skin_v2 .cke_rcombo .cke_on .cke_text{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;}.cke_skin_v2 .cke_rcombo .cke_on .cke_openbutton{-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;}.cke_skin_v2 .cke_rcombo .cke_disabled .cke_label{filter:alpha(opacity=30);opacity:.3;}.cke_skin_v2 .cke_hc .cke_rcombo .cke_disabled .cke_label{filter:alpha(opacity=70);opacity:.7;}.cke_skin_v2 .cke_rcombo .cke_disabled .cke_text,.cke_skin_v2 .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=50);opacity:.5;}.cke_skin_v2 .cke_browser_ie .cke_rcombo .cke_disabled .cke_openbutton{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale'), alpha(opacity=50);}.cke_skin_v2 .cke_browser_ie6 .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=50);}.cke_skin_v2 .cke_hc .cke_rcombo .cke_disabled .cke_text,.cke_skin_v2 .cke_hc .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=80);opacity:.8;}.cke_skin_v2 .cke_rcombo .cke_disabled .cke_text{color:#fff;}.cke_skin_v2 .cke_browser_gecko18 .cke_rcombo,.cke_skin_v2 .cke_browser_gecko18 .cke_rcombo .cke_label,.cke_skin_v2 .cke_browser_gecko18 .cke_rcombo .cke_text,.cke_skin_v2 .cke_browser_gecko18 .cke_rcombo .cke_openbutton,.cke_skin_v2 .cke_browser_webkit .cke_rcombo .cke_label,.cke_skin_v2 .cke_browser_webkit .cke_rcombo .cke_text,.cke_skin_v2 .cke_browser_webkit .cke_rcombo .cke_openbutton{display:block;float:left;}.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_rcombo,.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_rcombo .cke_label,.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_rcombo .cke_text,.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_rcombo .cke_openbutton,.cke_skin_v2 .cke_browser_webkit .cke_rtl .cke_rcombo .cke_label,.cke_skin_v2 .cke_browser_webkit .cke_rtl .cke_rcombo .cke_text,.cke_skin_v2 .cke_browser_webkit .cke_rtl .cke_rcombo .cke_openbutton{float:right;}.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_rcombo,.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_rcombo a,.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_rcombo .cke_label{float:none;}.cke_skin_v2 .cke_browser_iequirks .cke_rcombo .cke_openbutton{height:22px;}.cke_skin_v2 .cke_rtl .cke_rcombo .cke_font .cke_text,.cke_skin_v2 .cke_rtl .cke_rcombo .cke_fontSize .cke_text{direction:ltr;}@media print{.cke_path{display:none;}}.cke_skin_v2 .cke_path{padding:3px 3px 0 3px;display:inline-block;float:left;}.cke_skin_v2 .cke_rtl .cke_path{float:right;}.cke_skin_v2 .cke_path a,.cke_skin_v2 .cke_path .cke_empty{display:inline-block;float:left;border:solid 1px #efefde;background-color:#efefde;padding-top:1px;padding-bottom:1px;padding-left:4px;padding-right:4px;margin-bottom:3px;cursor:default;}.cke_skin_v2 .cke_path .cke_empty{visibility:hidden;}.cke_skin_v2 .cke_rtl .cke_path a,.cke_skin_v2 .cke_rtl .cke_path cke_empty{float:right;}.cke_skin_v2 .cke_path a:hover,.cke_skin_v2 .cke_path a:focus,.cke_skin_v2 .cke_path a:active{border:solid 1px #316ac5;background-color:#dff1ff;padding-top:1px;padding-bottom:1px;padding-left:4px;padding-right:4px;outline:none;}
-.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_path a,.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_path .cke_empty{float:none;}.cke_skin_v2 .cke_path .cke_label{display:none;}.cke_skin_v2 .cke_button_source .cke_icon{background-position:0 0;}.cke_skin_v2 .cke_button_docProps .cke_icon{background-position:0 -16px;}.cke_skin_v2 .cke_button_newpage .cke_icon{background-position:0 -48px;}.cke_skin_v2 .cke_button_preview .cke_icon{background-position:0 -64px;}.cke_skin_v2 .cke_button_cut .cke_icon{background-position:0 -96px;}.cke_skin_v2 .cke_button_copy .cke_icon{background-position:0 -112px;}.cke_skin_v2 .cke_button_paste .cke_icon{background-position:0 -128px;}.cke_skin_v2 .cke_button_pastetext .cke_icon{background-position:0 -144px;}.cke_skin_v2 .cke_button_find .cke_icon{background-position:0 -240px;}.cke_skin_v2 .cke_button_replace .cke_icon{background-position:0 -256px;}.cke_skin_v2 .cke_button_selectAll .cke_icon{background-position:0 -272px;}.cke_skin_v2 .cke_button_removeFormat .cke_icon{background-position:0 -288px;}.cke_skin_v2 .cke_button_bold .cke_icon{background-position:0 -304px;}.cke_skin_v2 .cke_button_italic .cke_icon{background-position:0 -320px;}.cke_skin_v2 .cke_button_underline .cke_icon{background-position:0 -336px;}.cke_skin_v2 .cke_button_strike .cke_icon{background-position:0 -352px;}.cke_skin_v2 .cke_button_subscript .cke_icon{background-position:0 -368px;}.cke_skin_v2 .cke_button_superscript .cke_icon{background-position:0 -384px;}.cke_skin_v2 .cke_button_table .cke_icon{background-position:0 -608px;}.cke_skin_v2 .cke_button_horizontalrule .cke_icon{background-position:0 -624px;}.cke_skin_v2 .cke_button_smiley .cke_icon{background-position:0 -640px;}.cke_skin_v2 .cke_button_link .cke_icon{background-position:0 -528px;}.cke_skin_v2 .cke_button_unlink .cke_icon{background-position:0 -544px;}.cke_skin_v2 .cke_button_anchor .cke_icon{background-position:0 -560px;}.cke_skin_v2 .cke_button_image .cke_icon{background-position:0 -576px;}.cke_skin_v2 .cke_button_flash .cke_icon{background-position:0 -592px;}.cke_skin_v2 .cke_button_specialchar .cke_icon{background-position:0 -656px;}.cke_skin_v2 .cke_button_pagebreak .cke_icon{background-position:0 -672px;}.cke_skin_v2 .cke_button_print .cke_icon{background-position:0 -176px;}.cke_skin_v2 .cke_button_checkspell .cke_icon,.cke_skin_v2 .cke_button_scayt .cke_icon{background-position:0 -192px;}.cke_skin_v2 .cke_button_pagebreak .cke_icon{background-position:0 -672px;}.cke_skin_v2 .cke_button_textcolor .cke_icon{background-position:0 -704px;}.cke_skin_v2 .cke_button_bgcolor .cke_icon{background-position:0 -720px;}.cke_skin_v2 .cke_button_form .cke_icon{background-position:0 -752px;}.cke_skin_v2 .cke_button_checkbox .cke_icon{background-position:0 -768px;}.cke_skin_v2 .cke_button_radio .cke_icon{background-position:0 -784px;}.cke_skin_v2 .cke_button_textfield .cke_icon{background-position:0 -800px;}.cke_skin_v2 .cke_button_textarea .cke_icon{background-position:0 -816px;}.cke_skin_v2 .cke_button_showblocks .cke_icon{background-position:0 -1136px;}.cke_skin_v2 .cke_button_select .cke_icon{background-position:0 -832px;}.cke_skin_v2 .cke_button_button .cke_icon{background-position:0 -848px;}.cke_skin_v2 .cke_button_imagebutton .cke_icon{background-position:0 -864px;}.cke_skin_v2 .cke_button_hiddenfield .cke_icon{background-position:0 -880px;}.cke_skin_v2 .cke_button_undo .cke_icon{background-position:0 -208px;}.cke_skin_v2 .cke_rtl .cke_button_undo .cke_icon{background-position:0 -224px;}.cke_skin_v2 .cke_button_redo .cke_icon{background-position:0 -224px;}.cke_skin_v2 .cke_rtl .cke_button_redo .cke_icon{background-position:0 -208px;}.cke_skin_v2 .cke_button_templates .cke_icon{background-position:0 -80px;}.cke_skin_v2 .cke_button_numberedlist .cke_icon{background-position:0 -400px;}.cke_skin_v2 .cke_button_bulletedlist .cke_icon{background-position:0 -416px;}.cke_skin_v2 .cke_mixed_dir_content .cke_button_numberedlist .cke_icon{background-position:0 -1217px;}.cke_skin_v2 .cke_mixed_dir_content .cke_button_bulletedlist .cke_icon{background-position:0 -1233px;}.cke_skin_v2 .cke_button_outdent .cke_icon{background-position:0 -432px;}
-.cke_skin_v2 .cke_button_indent .cke_icon{background-position:0 -448px;}.cke_skin_v2 .cke_mixed_dir_content .cke_button_indent .cke_icon{background-position:0 -1265px;}.cke_skin_v2 .cke_mixed_dir_content .cke_button_outdent .cke_icon{background-position:0 -1249px;}.cke_skin_v2 .cke_button_justifyleft .cke_icon{background-position:0 -464px;}.cke_skin_v2 .cke_button_justifycenter .cke_icon{background-position:0 -480px;}.cke_skin_v2 .cke_button_justifyright .cke_icon{background-position:0 -496px;}.cke_skin_v2 .cke_button_justifyblock .cke_icon{background-position:0 -512px;}.cke_skin_v2 .cke_button_blockquote .cke_icon{background-position:0 -1152px;}.cke_skin_v2 .cke_button_flash .cke_icon{background-position:0 -592px;}.cke_skin_v2 .cke_button_pastefromword .cke_icon{background-position:0 -160px;}.cke_skin_v2 .cke_button_save .cke_icon{background-position:0 -32px;}.cke_skin_v2 .cke_button_about .cke_icon{background-position:0 -736px;}.cke_skin_v2 .cke_button_maximize .cke_icon{background-position:0 -1040px;}.cke_skin_v2 .cke_button_creatediv .cke_icon{background-position:0 -1168px;}.cke_skin_v2 .cke_button_editdiv .cke_icon{background-position:0 -1184px;}.cke_skin_v2 .cke_button_removediv .cke_icon{background-position:0 -1200px;}.cke_skin_v2 .cke_button_bidirtl .cke_icon{background-position:0 -1072px;}.cke_skin_v2 .cke_button_bidiltr .cke_icon{background-position:0 -1056px;}.cke_skin_v2 .cke_button_iframe .cke_icon{background-position:0 -1279px;}.cke_skin_v2 .cke_button_source .cke_label{display:inline;display:inline-block;}.cke_skin_v2 .cke_styles_panel{width:150px;height:170px;}.cke_skin_v2 .cke_format_panel{width:150px;height:170px;}.cke_skin_v2 .cke_font_panel{width:150px;height:170px;}.cke_skin_v2 .cke_fontSize_panel{height:170px;}.cke_skin_v2 .cke_fontSize .cke_text{width:20px;}.cke_skin_v2 .cke_browser_iequirks .cke_fontSize .cke_text{width:32px;}html .cke_skin_v2{visibility:inherit;}html.cke_skin_v2_container{visibility:visible;}
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+.cke_skin_v2 *,.cke_skin_v2 a:hover,.cke_skin_v2 a:link,.cke_skin_v2 a:visited,.cke_skin_v2 a:active{margin:0;padding:0;border:0;background:transparent;text-decoration:none;font:normal normal normal 100% Sans-Serif;width:auto;height:auto;border-collapse:collapse;text-align:left;vertical-align:baseline;white-space:nowrap;cursor:auto;color:#000;float:none;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;}.cke_skin_v2 .cke_rtl *,.cke_skin_v2 .cke_rtl a:hover,.cke_skin_v2 .cke_rtl a:link,.cke_skin_v2 .cke_rtl a:visited,.cke_skin_v2 .cke_rtl a:active,.cke_rtl .cke_skin_v2 *,.cke_rtl .cke_skin_v2 a:hover,.cke_rtl .cke_skin_v2 a:link,.cke_rtl .cke_skin_v2 a:visited,.cke_rtl .cke_skin_v2 a:active{text-align:right;}.cke_skin_v2 iframe{vertical-align:inherit;}.cke_skin_v2 textarea{white-space:pre;}.cke_skin_v2 .cke_browser_gecko textarea{cursor:text;}.cke_skin_v2 .cke_browser_gecko textarea[disabled]{cursor:default;}.cke_skin_v2 input[type="text"],.cke_skin_v2 input[type="password"]{cursor:text;}.cke_skin_v2 input[type="text"][disabled],.cke_skin_v2 input[type="password"][disabled]{cursor:default;}.cke_skin_v2 fieldset{padding:10px;border:2px groove #E0DFE3;}.cke_skin_v2 .cke_editor{display:inline-table;width:100%;}.cke_skin_v2 .cke_browser_webkit .cke_editor{display:table;}.cke_skin_v2{display:block;}.cke_skin_v2 span.cke_browser_webkit,.cke_skin_v2 span.cke_browser_gecko18{display:block;}.cke_skin_v2 .cke_wrapper{display:block;}.cke_skin_v2 .cke_browser_opera .cke_editor{display:table;}.cke_skin_v2 .cke_top,.cke_skin_v2 .cke_bottom,.cke_shared .cke_skin_v2{background-color:#efefde;}.cke_skin_v2 .cke_top{border-top:solid 1px #fafaf5;border-left:solid 1px #fafaf5;border-right:solid 1px #696969;border-bottom:solid 2px #696969;}.cke_skin_v2 .cke_rtl .cke_top{border-left:solid 1px #696969;border-right:solid 1px #fafaf5;}.cke_skin_v2 .cke_bottom{border-left:solid 1px #696969;border-right:solid 1px #696969;border-bottom:solid 1px #696969;}.cke_skin_v2 .cke_contents{border:solid 1px #696969;background-color:white;}.cke_skin_v2 .cke_focus{outline:auto 5px -webkit-focus-ring-color;}.cke_skin_v2 textarea.cke_source{font-family:'Courier New',Monospace;font-size:small;background-color:#fff;white-space:pre;}.cke_skin_v2 .cke_browser_iequirks textarea.cke_source{_white-space:normal;}.cke_skin_v2 .cke_resizer{width:12px;height:12px;margin-top:16px;display:block;float:right;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -801px;background-repeat:no-repeat;cursor:se-resize;}.cke_skin_v2 .cke_browser_air .cke_resizer,.cke_skin_v2 .cke_browser_air .cke_rtl .cke_resizer{cursor:move;}.cke_skin_v2 .cke_resizer_rtl{cursor:sw-resize;background-position:0 -828px;float:left;}.cke_skin_v2 .cke_resizer_horizontal,.cke_skin_v2 .cke_rtl .cke_resizer_horizontal{cursor:e-resize;}.cke_skin_v2 .cke_resizer_vertical,.cke_skin_v2 .cke_rtl .cke_resizer_vertical{cursor:n-resize;}.cke_skin_v2 .cke_maximized .cke_resizer{display:none;}.cke_skin_v2 .cke_browser_ie6 .cke_contents textarea,.cke_skin_v2 .cke_browser_ie7 .cke_contents textarea{position:absolute;}.cke_skin_v2 .cke_voice_label{display:none;}.cke_skin_v2 legend.cke_voice_label{display:none;}.cke_skin_v2 .cke_browser_ie legend.cke_voice_label{position:absolute;display:block;width:0;height:0;overflow:hidden;}.cke_skin_v2 .cke_panel{border:1px solid #8f8f73;background-color:#fff;width:120px;height:100px;overflow:hidden;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;}.cke_skin_v2 .cke_panel iframe{width:100%;height:100%;}.cke_skin_v2 .cke_panel_frame .cke_label{display:none;}html.cke_skin_v2_container{overflow:auto;overflow-x:hidden;}body.cke_panel_frame{overflow:auto;}ul.cke_panel_list{list-style-type:none;margin:3px;padding:0;white-space:nowrap;}li.cke_panel_listItem{margin:0;}.cke_panel_listItem a{padding:2px;display:block;border:1px solid #fff;color:inherit!important;text-decoration:none;overflow:hidden;text-overflow:ellipsis;}* html .cke_panel_listItem a{width:100%;color:#000;}*:first-child+html .cke_panel_listItem a{color:#000;}
+.cke_panel_listItem.cke_selected a{border:1px solid #ccc;background-color:#e9f5ff;}.cke_panel_listItem a:hover,.cke_panel_listItem a:focus,.cke_panel_listItem a:active{border-color:#316ac5;background-color:#dff1ff;}.cke_hc .cke_panel_listItem.cke_selected a,.cke_hc .cke_panel_listItem a:hover,.cke_hc .cke_panel_listItem a:focus,.cke_hc .cke_panel_listItem a:active{border-width:3px;padding:0;}.cke_panel_grouptitle{font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;font-weight:bold;white-space:nowrap;background-color:#dcdcdc;color:#000;margin:0;padding:3px;}.cke_panel_listItem p,.cke_panel_listItem h1,.cke_panel_listItem h2,.cke_panel_listItem h3,.cke_panel_listItem h4,.cke_panel_listItem h5,.cke_panel_listItem h6,.cke_panel_listItem pre{margin-top:3px;margin-bottom:3px;}.cke_skin_v2 .cke_button_textcolor_panel,.cke_skin_v2 .cke_button_bgcolor_panel{width:150px;height:135px;}.cke_colorblock{padding:3px;font-size:11px;font-family:'Microsoft Sans Serif',Tahoma,Arial,Verdana,Sans-Serif;}.cke_colorblock,.cke_colorblock a{text-decoration:none;color:#000;}span.cke_colorbox{width:10px;height:10px;border:#808080 1px solid;float:left;}.cke_rtl span.cke_colorbox{float:right;}a.cke_colorbox{border:#fff 1px solid;padding:2px;float:left;}.cke_rtl a.cke_colorbox{float:right;}a:hover.cke_colorbox,a:focus.cke_colorbox,a:active.cke_colorbox{border:#316ac5 1px solid;background-color:#dff1ff;}a.cke_colorauto,a.cke_colormore{border:#fff 1px solid;padding:2px;display:block;cursor:pointer;}a:hover.cke_colorauto,a:hover.cke_colormore,a:focus.cke_colorauto,a:focus.cke_colormore,a:active.cke_colorauto,a:active.cke_colormore{border:#316ac5 1px solid;background-color:#dff1ff;}@media print{.cke_skin_v2 .cke_toolbox{display:none;}}.cke_skin_v2 .cke_browser_webkit .cke_toolbox,.cke_skin_v2 .cke_browser_webkit .cke_toolbox>span{white-space:normal;}.cke_skin_v2 .cke_toolbox{clear:both;padding-bottom:1px;}.cke_skin_v2 a.cke_toolbox_collapser,.cke_skin_v2 a:hover.cke_toolbox_collapser{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:3px -739px;background-repeat:no-repeat;width:11px;height:11px;float:right;border:outset 1px;margin:11px 2px 2px;cursor:pointer;}.cke_skin_v2 a.cke_toolbox_collapser span{display:none;}.cke_skin_v2 .cke_hc a.cke_toolbox_collapser span{font-size:10px;font-weight:bold;font-family:Arial;display:inline;}.cke_skin_v2 .cke_rtl a.cke_toolbox_collapser,.cke_skin_v2 .cke_rtl a:hover.cke_toolbox_collapser{float:left;}.cke_skin_v2 a.cke_toolbox_collapser_min,.cke_skin_v2 a:hover.cke_toolbox_collapser_min{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:4px -760px;background-repeat:no-repeat;margin:2px;}.cke_skin_v2 .cke_rtl a.cke_toolbox_collapser_min,.cke_skin_v2 .cke_rtl a:hover.cke_toolbox_collapser_min{background-position:4px -781px;}.cke_skin_v2 .cke_toolbar{padding-top:1px;padding-bottom:1px;display:inline-block;float:left;}.cke_skin_v2 .cke_rtl .cke_toolbar{float:right;}.cke_skin_v2 .cke_toolgroup{display:inline-block;float:left;}.cke_skin_v2 .cke_browser_ie .cke_toolgroup{#float:none;#display:inline;}.cke_skin_v2 .cke_rtl .cke_toolgroup{float:right;}.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_toolgroup{#float:none;}.cke_skin_v2 .cke_separator{display:inline-block;float:left;border-left:solid 1px #999;margin:4px 2px;height:16px;}.cke_skin_v2 .cke_browser_ie .cke_separator{#float:none;#display:inline;}.cke_skin_v2 .cke_rtl .cke_separator{float:right;}.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_separator{#float:none;}.cke_skin_v2 .cke_break{clear:left;}.cke_skin_v2 .cke_rtl .cke_break{clear:right;}.cke_skin_v2 .cke_toolbar_start{display:inline-block;background-image:url(images/toolbar_start.gif);background-repeat:no-repeat;margin:4px 2px 0 2px;width:3px;height:20px;float:left;}.cke_skin_v2 .cke_browser_ie .cke_toolbar_start{#float:none;#display:inline;}.cke_skin_v2 .cke_rtl .cke_toolbar_start{float:right;}.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_toolbar_start{#float:none;}.cke_skin_v2 .cke_toolbar_end{display:inline-block;float:left;}
+.cke_skin_v2 .cke_browser_ie .cke_toolbar_end{#float:none;#display:inline;}.cke_skin_v2 .cke_rtl .cke_toolbar_end{float:right;}.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_toolbar_end{#float:none;}.cke_skin_v2 .cke_browser_ie9 .cke_rtl .cke_separator,.cke_skin_v2 .cke_browser_ie9 .cke_rtl .cke_toolbar_start,.cke_skin_v2 .cke_browser_ie9 .cke_rtl .cke_toolbar_end{vertical-align:middle;}.cke_skin_v2 .cke_button a,.cke_skin_v2 .cke_button a:hover,.cke_skin_v2 .cke_button a:focus,.cke_skin_v2 .cke_button a:active,.cke_skin_v2 .cke_button a.cke_off{border:solid 1px #efefde;display:inline-block;border-radius:3px;outline:none;padding-top:2px;padding-left:4px;padding-right:4px;padding-bottom:2px;height:18px;cursor:default;}.cke_skin_v2 .cke_button a,.cke_skin_v2 .cke_button a.cke_off{background-color:#efefde;filter:alpha(opacity=70);opacity:.70;-moz-border-radius:3px;-webkit-border-radius:3px;}.cke_skin_v2 .cke_hc .cke_button a,.cke_skin_v2 .cke_hc .cke_button a.cke_off{opacity:1.0;filter:alpha(opacity=100);}.cke_skin_v2 .cke_button a.cke_on{border:solid 1px #316ac5;background-color:#a3d7ff;filter:alpha(opacity=100);opacity:1;}.cke_skin_v2 .cke_button a.cke_disabled *{filter:alpha(opacity=30);opacity:.3;}.cke_skin_v2 .cke_browser_ie .cke_button a.cke_disabled *,.cke_skin_v2 .cke_browser_ie a:hover.cke_button .cke_disabled *{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale'), alpha(opacity=30);}.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_button a.cke_disabled *,.cke_skin_v2 .cke_browser_ie .cke_rtl a:hover.cke_button .cke_disabled *{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale'), alpha(opacity=30);}.cke_skin_v2 .cke_browser_ie6 .cke_button a.cke_disabled *,.cke_skin_v2 .cke_browser_ie6 a:hover.cke_button .cke_disabled *,.cke_skin_v2 .cke_browser_ie .cke_button.cke_noalphafix a.cke_disabled *{filter:alpha(opacity=30);}.cke_skin_v2 .cke_hc .cke_button a.cke_disabled *,.cke_skin_v2 .cke_browser_ie.cke_hc a:hover.cke_button .cke_disabled *{filter:alpha(opacity=60);opacity:.6;}.cke_skin_v2 .cke_button a:hover,.cke_skin_v2 .cke_button a:focus,.cke_skin_v2 .cke_button a:active{border:solid 1px #316ac5;background-color:#dff1ff;padding:2px 4px;}.cke_skin_v2 .cke_hc .cke_button a:hover,.cke_skin_v2 .cke_hc .cke_button a:focus,.cke_skin_v2 .cke_hc .cke_button a:active{padding:0 2px!important;border-width:3px;}.cke_skin_v2 .cke_button .cke_icon{background-image:url(icons.png);background-position:100px;background-repeat:no-repeat;margin-top:1px;width:16px;height:16px;display:inline-block;cursor:default;}.cke_skin_v2 .cke_rtl .cke_button .cke_icon{background-image:url(icons_rtl.png);}.cke_skin_v2 .cke_browser_ie .cke_button .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_button .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_skin_v2 .cke_browser_ie6 .cke_button .cke_icon,.cke_skin_v2 .cke_browser_ie6 .cke_rtl .cke_button .cke_icon,.cke_skin_v2 .cke_browser_ie .cke_button.cke_noalphafix .cke_icon,.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_button.cke_noalphafix .cke_icon{filter:;}.cke_skin_v2 .cke_button .cke_label{cursor:default;display:none;padding-left:3px;vertical-align:middle;}.cke_skin_v2 .cke_hc .cke_button .cke_label{padding:0;display:inline-block;}.cke_skin_v2 .cke_hc .cke_button .cke_icon{display:none;}.cke_skin_v2 .cke_accessibility{position:absolute;display:block;width:0;height:0;overflow:hidden;}.cke_skin_v2 .cke_button .cke_buttonarrow{display:inline-block;height:17px;width:8px;background-position:2px -717px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:no-repeat;cursor:default;}.cke_skin_v2 .cke_rtl .cke_button .cke_buttonarrow{background-position:0 -717px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);}.cke_skin_v2 .cke_browser_gecko18 .cke_toolbar,.cke_skin_v2 .cke_browser_gecko18 .cke_button a,.cke_skin_v2 .cke_browser_gecko18 .cke_button a.cke_off,.cke_skin_v2 .cke_browser_gecko18 .cke_button .cke_icon,.cke_skin_v2 .cke_browser_gecko18 .cke_button .cke_buttonarrow,.cke_skin_v2 .cke_browser_gecko18 .cke_separator,.cke_skin_v2 .cke_browser_gecko18 .cke_toolbar_start{display:block;float:left;}
+.cke_skin_v2 .cke_browser_gecko18 .cke_hc .cke_button .cke_icon{display:none;}.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_toolbar,.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_button a,.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_button a.cke_off,.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_button .cke_icon,.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_button .cke_buttonarrow,.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_separator,.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_toolbar_start{float:right;}.cke_skin_v2 .cke_browser_gecko18 .cke_button .cke_label,.cke_skin_v2 .cke_browser_gecko18 .cke_break{float:left;}.cke_skin_v2 .cke_browser_gecko18 .cke_rtl span.cke_inline_label{float:right;}.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_button .cke_label,.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_break{float:right;}.cke_skin_v2 .cke_browser_gecko18 .cke_separator{margin-top:4px;}.cke_skin_v2 .cke_browser_gecko18 .cke_button .cke_label{padding-top:3px;}.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_toolgroup,.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_separator,.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_toolbar_start,.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_toolbar_end{float:none;}.cke_skin_v2 .cke_browser_ie8 .cke_toolbar,.cke_skin_v2 .cke_browser_ie8 .cke_toolgroup{vertical-align:top;}.cke_skin_v2 .cke_browser_iequirks.cke_browser_ie8 .cke_toolbar,.cke_skin_v2 .cke_browser_iequirks.cke_browser_ie8 .cke_toolgroup{vertical-align:baseline;}.cke_skin_v2 .cke_browser_ie .cke_rcombo,.cke_skin_v2 .cke_browser_ie .cke_rcombo *{cursor:default;}.cke_skin_v2 .cke_contextmenu{padding:2px;}.cke_skin_v2 .cke_menuitem a{display:block;}.cke_skin_v2 .cke_menuitem span{cursor:default;}.cke_skin_v2 .cke_menuitem a:hover,.cke_skin_v2 .cke_menuitem a:focus,.cke_skin_v2 .cke_menuitem a:active{background-color:#8f8f73;display:block;}.cke_hc .cke_menuitem a:hover,.cke_hc .cke_menuitem a:focus,.cke_hc .cke_menuitem a:active{border:2px solid;}.cke_skin_v2 .cke_menuitem .cke_icon{background-image:url(icons.png);background-position:100px;background-repeat:no-repeat;background-color:transparent;width:16px;height:16px;float:left;}.cke_rtl .cke_skin_v2 .cke_menuitem .cke_icon{background-image:url(icons_rtl.png);}.cke_browser_ie .cke_skin_v2 .cke_menuitem .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie.cke_rtl .cke_skin_v2 .cke_menuitem .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie6 .cke_skin_v2 .cke_menuitem .cke_icon,.cke_browser_ie .cke_skin_v2 .cke_menuitem.cke_noalphafix .cke_icon{filter:;}.cke_skin_v2 .cke_menuitem .cke_disabled .cke_icon{filter:alpha(opacity=70);opacity:.70;}.cke_browser_ie .cke_skin_v2 .cke_menuitem .cke_disabled .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie.cke_rtl .cke_skin_v2 .cke_menuitem .cke_disabled .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_browser_ie6 .cke_skin_v2 .cke_menuitem .cke_disabled .cke_icon,.cke_browser_ie .cke_skin_v2 .cke_menuitem.cke_noalphafix .cke_disabled .cke_icon{filter:;}.cke_skin_v2 .cke_menuitem .cke_icon_wrapper{background-color:#e3e3c7;border:solid 4px #e3e3c7;width:16px;height:16px;float:left;filter:alpha(opacity=70);opacity:.70;clear:both;}.cke_rtl .cke_skin_v2 .cke_menuitem .cke_icon_wrapper{float:right;}.cke_skin_v2 .cke_menuitem a:hover .cke_icon_wrapper,.cke_skin_v2 .cke_menuitem a:focus .cke_icon_wrapper,.cke_skin_v2 .cke_menuitem a:active .cke_icon_wrapper{background-color:#9d9d9d;border:solid 4px #9d9d9d;filter:alpha(opacity=70);opacity:.70;}.cke_skin_v2 .cke_menuitem a:hover.cke_disabled .cke_icon_wrapper,.cke_skin_v2 .cke_menuitem a:focus.cke_disabled .cke_icon_wrapper,.cke_skin_v2 .cke_menuitem a:active.cke_disabled .cke_icon_wrapper{background-color:#e3e3c7;border:solid 4px #e3e3c7;}.cke_skin_v2 .cke_menuitem .cke_label{display:block;padding-right:3px;padding-top:5px;padding-left:4px;height:19px;margin-left:24px;background-color:#fff;}
+.cke_skin_v2 .cke_frameLoaded .cke_menuitem .cke_label{filter:alpha(opacity=70);opacity:.70;}.cke_rtl .cke_skin_v2 .cke_menuitem .cke_label{padding-right:0;margin-left:0;padding-left:3px;margin-right:28px;}.cke_skin_v2 .cke_menuitem a.cke_disabled .cke_label{filter:alpha(opacity=30);opacity:.30;}.cke_skin_v2 .cke_menuitem a:hover .cke_label,.cke_skin_v2 .cke_menuitem a:focus .cke_label,.cke_skin_v2 .cke_menuitem a:active .cke_label{background-color:#8f8f73;color:white;}.cke_skin_v2 .cke_menuitem a.cke_disabled:hover .cke_label,.cke_skin_v2 .cke_menuitem a.cke_disabled:focus .cke_label,.cke_skin_v2 .cke_menuitem a.cke_disabled:active .cke_label{background-color:transparent;color:black;}.cke_skin_v2 .cke_menuseparator{background-color:#e3e3c7;height:2px;filter:alpha(opacity=70);opacity:.70;_font-size:0;}.cke_skin_v2 .cke_menuarrow{background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-position:0 -784px;background-repeat:no-repeat;height:5px;width:3px;float:right;margin-right:2px;margin-top:3px;}.cke_rtl .cke_skin_v2 .cke_menuarrow{float:left;margin-right:0;margin-left:2px;background-position:0 -763px;}.cke_skin_v2 .cke_menuarrow span{display:none;}.cke_hc .cke_skin_v2 .cke_menuarrow{width:auto;margin-top:0;}.cke_hc .cke_skin_v2 .cke_menuarrow span{display:inline;}.cke_browser_ie.cke_ltr .cke_skin_v2 .cke_menuarrow{position:absolute;right:2px;}.cke_browser_ie.cke_rtl .cke_skin_v2 .cke_menuarrow{position:absolute;left:2px;}.cke_skin_v2 .cke_rcombo{display:inline-block;margin-left:2px;margin-right:2px;margin-top:2px;vertical-align:top;}.cke_skin_v2 .cke_browser_ie .cke_rcombo{#display:inline;}.cke_skin_v2 .cke_rcombopanel{border:1px solid #316ac5;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;}.cke_skin_v2 .cke_rcombo a{display:inline-block;float:left;filter:alpha(opacity=70);opacity:.70;}.cke_skin_v2 .cke_rtl .cke_rcombo a{float:right;}.cke_skin_v2 .cke_hc .cke_rcombo a{filter:alpha(opacity=100);opacity:1.0;}.cke_skin_v2 .cke_rcombo .cke_label{float:left;line-height:20px;line-height:22px\9;height:22px;padding-left:4px;padding-right:5px;filter:alpha(opacity=70);opacity:.70;background-color:#f1f1e3;cursor:default;}.cke_skin_v2 .cke_rtl .cke_rcombo .cke_label{float:right;padding-right:4px;padding-left:5px;}.cke_skin_v2 .cke_hc .cke_rcombo .cke_label{filter:alpha(opacity=100);opacity:1.0;}.cke_skin_v2 .cke_rcombo .cke_inline_label{color:#fff;}.cke_skin_v2 .cke_rcombo .cke_text{border:1px solid #8f8f73;background-color:#fff;height:12px;width:60px;padding-top:4px;padding-bottom:4px;padding-left:5px;padding-right:5px;text-overflow:ellipsis;overflow:hidden;display:inline-block;vertical-align:top;cursor:default;}.cke_skin_v2 .cke_ltr .cke_rcombo .cke_text{-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;}.cke_skin_v2 .cke_rtl .cke_rcombo .cke_text{-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;}.cke_skin_v2 .cke_browser_iequirks .cke_rcombo .cke_text{height:22px;}.cke_skin_v2 .cke_rcombo .cke_openbutton{display:inline-block;border-top:1px solid #8f8f73;border-bottom:1px solid #8f8f73;}.cke_skin_v2 .cke_rcombo .cke_openbutton .cke_icon{display:inline-block;background-position:5px -715px;background-image:url(images/sprites.png);_background-image:url(images/sprites_ie6.png);background-repeat:no-repeat;width:14px;height:20px;}.cke_skin_v2 .cke_browser_ie .cke_rcombo .cke_openbutton .cke_icon{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale');}.cke_skin_v2 .cke_browser_ie6 .cke_rcombo .cke_openbutton .cke_icon{filter:;}.cke_skin_v2 .cke_hc .cke_rcombo .cke_openbutton .cke_icon{background:none;filter:;}.cke_skin_v2 .cke_ltr .cke_rcombo .cke_openbutton{border-right:1px solid #8f8f73;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;}
+.cke_skin_v2 .cke_rtl .cke_rcombo .cke_openbutton{border-left:1px solid #8f8f73;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;}.cke_skin_v2 .cke_rcombo .cke_off a:hover,.cke_skin_v2 .cke_rcombo .cke_off a:focus,.cke_skin_v2 .cke_rcombo .cke_off a:active,.cke_skin_v2 .cke_rcombo .cke_on a{filter:alpha(opacity=100);opacity:1;}.cke_skin_v2 .cke_rcombo .cke_off a:hover .cke_text,.cke_skin_v2 .cke_rcombo .cke_off a:focus .cke_text,.cke_skin_v2 .cke_rcombo .cke_off a:active .cke_text,.cke_skin_v2 .cke_rcombo .cke_on .cke_text{border-color:#316ac5;}.cke_skin_v2 .cke_rcombo .cke_off a:hover .cke_openbutton,.cke_skin_v2 .cke_rcombo .cke_off a:focus .cke_openbutton,.cke_skin_v2 .cke_rcombo .cke_off a:active .cke_openbutton,.cke_skin_v2 .cke_rcombo .cke_on .cke_openbutton{border-color:#316ac5;background-color:#dff1ff;}.cke_skin_v2 .cke_rcombo .cke_on .cke_text{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;}.cke_skin_v2 .cke_rcombo .cke_on .cke_openbutton{-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;}.cke_skin_v2 .cke_rcombo .cke_disabled .cke_label{filter:alpha(opacity=30);opacity:.3;}.cke_skin_v2 .cke_hc .cke_rcombo .cke_disabled .cke_label{filter:alpha(opacity=70);opacity:.7;}.cke_skin_v2 .cke_rcombo .cke_disabled .cke_text,.cke_skin_v2 .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=50);opacity:.5;}.cke_skin_v2 .cke_browser_ie .cke_rcombo .cke_disabled .cke_openbutton{filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale'), alpha(opacity=50);}.cke_skin_v2 .cke_browser_ie6 .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=50);}.cke_skin_v2 .cke_hc .cke_rcombo .cke_disabled .cke_text,.cke_skin_v2 .cke_hc .cke_rcombo .cke_disabled .cke_openbutton{filter:alpha(opacity=80);opacity:.8;}.cke_skin_v2 .cke_rcombo .cke_disabled .cke_text{color:#fff;}.cke_skin_v2 .cke_browser_gecko18 .cke_rcombo,.cke_skin_v2 .cke_browser_gecko18 .cke_rcombo .cke_label,.cke_skin_v2 .cke_browser_gecko18 .cke_rcombo .cke_text,.cke_skin_v2 .cke_browser_gecko18 .cke_rcombo .cke_openbutton,.cke_skin_v2 .cke_browser_webkit .cke_rcombo .cke_label,.cke_skin_v2 .cke_browser_webkit .cke_rcombo .cke_text,.cke_skin_v2 .cke_browser_webkit .cke_rcombo .cke_openbutton{display:block;float:left;}.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_rcombo,.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_rcombo .cke_label,.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_rcombo .cke_text,.cke_skin_v2 .cke_browser_gecko18 .cke_rtl .cke_rcombo .cke_openbutton,.cke_skin_v2 .cke_browser_webkit .cke_rtl .cke_rcombo .cke_label,.cke_skin_v2 .cke_browser_webkit .cke_rtl .cke_rcombo .cke_text,.cke_skin_v2 .cke_browser_webkit .cke_rtl .cke_rcombo .cke_openbutton{float:right;}.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_rcombo,.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_rcombo a,.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_rcombo .cke_label{float:none;}.cke_skin_v2 .cke_browser_iequirks .cke_rcombo .cke_openbutton{height:22px;}.cke_skin_v2 .cke_rtl .cke_rcombo .cke_font .cke_text,.cke_skin_v2 .cke_rtl .cke_rcombo .cke_fontSize .cke_text{direction:ltr;}@media print{.cke_path{display:none;}}.cke_skin_v2 .cke_path{padding:3px 3px 0 3px;display:inline-block;float:left;}.cke_skin_v2 .cke_rtl .cke_path{float:right;}.cke_skin_v2 .cke_path a,.cke_skin_v2 .cke_path .cke_empty{display:inline-block;float:left;border:solid 1px #efefde;background-color:#efefde;padding-top:1px;padding-bottom:1px;padding-left:4px;padding-right:4px;margin-bottom:3px;cursor:default;}.cke_skin_v2 .cke_path .cke_empty{visibility:hidden;}.cke_skin_v2 .cke_rtl .cke_path a,.cke_skin_v2 .cke_rtl .cke_path cke_empty{float:right;}.cke_skin_v2 .cke_path a:hover,.cke_skin_v2 .cke_path a:focus,.cke_skin_v2 .cke_path a:active{border:solid 1px #316ac5;background-color:#dff1ff;padding-top:1px;padding-bottom:1px;padding-left:4px;padding-right:4px;outline:none;}
+.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_path a,.cke_skin_v2 .cke_browser_ie .cke_rtl .cke_path .cke_empty{float:none;}.cke_skin_v2 .cke_path .cke_label{display:none;}.cke_skin_v2 .cke_button_source .cke_icon{background-position:0 0;}.cke_skin_v2 .cke_button_docProps .cke_icon{background-position:0 -16px;}.cke_skin_v2 .cke_button_newpage .cke_icon{background-position:0 -48px;}.cke_skin_v2 .cke_button_preview .cke_icon{background-position:0 -64px;}.cke_skin_v2 .cke_button_cut .cke_icon{background-position:0 -96px;}.cke_skin_v2 .cke_button_copy .cke_icon{background-position:0 -112px;}.cke_skin_v2 .cke_button_paste .cke_icon{background-position:0 -128px;}.cke_skin_v2 .cke_button_pastetext .cke_icon{background-position:0 -144px;}.cke_skin_v2 .cke_button_find .cke_icon{background-position:0 -240px;}.cke_skin_v2 .cke_button_replace .cke_icon{background-position:0 -256px;}.cke_skin_v2 .cke_button_selectAll .cke_icon{background-position:0 -272px;}.cke_skin_v2 .cke_button_removeFormat .cke_icon{background-position:0 -288px;}.cke_skin_v2 .cke_button_bold .cke_icon{background-position:0 -304px;}.cke_skin_v2 .cke_button_italic .cke_icon{background-position:0 -320px;}.cke_skin_v2 .cke_button_underline .cke_icon{background-position:0 -336px;}.cke_skin_v2 .cke_button_strike .cke_icon{background-position:0 -352px;}.cke_skin_v2 .cke_button_subscript .cke_icon{background-position:0 -368px;}.cke_skin_v2 .cke_button_superscript .cke_icon{background-position:0 -384px;}.cke_skin_v2 .cke_button_table .cke_icon{background-position:0 -608px;}.cke_skin_v2 .cke_button_horizontalrule .cke_icon{background-position:0 -624px;}.cke_skin_v2 .cke_button_smiley .cke_icon{background-position:0 -640px;}.cke_skin_v2 .cke_button_link .cke_icon{background-position:0 -528px;}.cke_skin_v2 .cke_button_unlink .cke_icon{background-position:0 -544px;}.cke_skin_v2 .cke_button_anchor .cke_icon{background-position:0 -560px;}.cke_skin_v2 .cke_button_image .cke_icon{background-position:0 -576px;}.cke_skin_v2 .cke_button_flash .cke_icon{background-position:0 -592px;}.cke_skin_v2 .cke_button_specialchar .cke_icon{background-position:0 -656px;}.cke_skin_v2 .cke_button_pagebreak .cke_icon{background-position:0 -672px;}.cke_skin_v2 .cke_button_print .cke_icon{background-position:0 -176px;}.cke_skin_v2 .cke_button_checkspell .cke_icon,.cke_skin_v2 .cke_button_scayt .cke_icon{background-position:0 -192px;}.cke_skin_v2 .cke_button_pagebreak .cke_icon{background-position:0 -672px;}.cke_skin_v2 .cke_button_textcolor .cke_icon{background-position:0 -704px;}.cke_skin_v2 .cke_button_bgcolor .cke_icon{background-position:0 -720px;}.cke_skin_v2 .cke_button_form .cke_icon{background-position:0 -752px;}.cke_skin_v2 .cke_button_checkbox .cke_icon{background-position:0 -768px;}.cke_skin_v2 .cke_button_radio .cke_icon{background-position:0 -784px;}.cke_skin_v2 .cke_button_textfield .cke_icon{background-position:0 -800px;}.cke_skin_v2 .cke_button_textarea .cke_icon{background-position:0 -816px;}.cke_skin_v2 .cke_button_showblocks .cke_icon{background-position:0 -1136px;}.cke_skin_v2 .cke_button_select .cke_icon{background-position:0 -832px;}.cke_skin_v2 .cke_button_button .cke_icon{background-position:0 -848px;}.cke_skin_v2 .cke_button_imagebutton .cke_icon{background-position:0 -864px;}.cke_skin_v2 .cke_button_hiddenfield .cke_icon{background-position:0 -880px;}.cke_skin_v2 .cke_button_undo .cke_icon{background-position:0 -208px;}.cke_skin_v2 .cke_rtl .cke_button_undo .cke_icon{background-position:0 -224px;}.cke_skin_v2 .cke_button_redo .cke_icon{background-position:0 -224px;}.cke_skin_v2 .cke_rtl .cke_button_redo .cke_icon{background-position:0 -208px;}.cke_skin_v2 .cke_button_templates .cke_icon{background-position:0 -80px;}.cke_skin_v2 .cke_button_numberedlist .cke_icon{background-position:0 -400px;}.cke_skin_v2 .cke_button_bulletedlist .cke_icon{background-position:0 -416px;}.cke_skin_v2 .cke_mixed_dir_content .cke_button_numberedlist .cke_icon{background-position:0 -1217px;}.cke_skin_v2 .cke_mixed_dir_content .cke_button_bulletedlist .cke_icon{background-position:0 -1233px;}.cke_skin_v2 .cke_button_outdent .cke_icon{background-position:0 -432px;}
+.cke_skin_v2 .cke_button_indent .cke_icon{background-position:0 -448px;}.cke_skin_v2 .cke_mixed_dir_content .cke_button_indent .cke_icon{background-position:0 -1265px;}.cke_skin_v2 .cke_mixed_dir_content .cke_button_outdent .cke_icon{background-position:0 -1249px;}.cke_skin_v2 .cke_button_justifyleft .cke_icon{background-position:0 -464px;}.cke_skin_v2 .cke_button_justifycenter .cke_icon{background-position:0 -480px;}.cke_skin_v2 .cke_button_justifyright .cke_icon{background-position:0 -496px;}.cke_skin_v2 .cke_button_justifyblock .cke_icon{background-position:0 -512px;}.cke_skin_v2 .cke_button_blockquote .cke_icon{background-position:0 -1152px;}.cke_skin_v2 .cke_button_flash .cke_icon{background-position:0 -592px;}.cke_skin_v2 .cke_button_pastefromword .cke_icon{background-position:0 -160px;}.cke_skin_v2 .cke_button_save .cke_icon{background-position:0 -32px;}.cke_skin_v2 .cke_button_about .cke_icon{background-position:0 -736px;}.cke_skin_v2 .cke_button_maximize .cke_icon{background-position:0 -1040px;}.cke_skin_v2 .cke_button_creatediv .cke_icon{background-position:0 -1168px;}.cke_skin_v2 .cke_button_editdiv .cke_icon{background-position:0 -1184px;}.cke_skin_v2 .cke_button_removediv .cke_icon{background-position:0 -1200px;}.cke_skin_v2 .cke_button_bidirtl .cke_icon{background-position:0 -1072px;}.cke_skin_v2 .cke_button_bidiltr .cke_icon{background-position:0 -1056px;}.cke_skin_v2 .cke_button_iframe .cke_icon{background-position:0 -1279px;}.cke_skin_v2 .cke_button_source .cke_label{display:inline;display:inline-block;}.cke_skin_v2 .cke_styles_panel{width:150px;height:170px;}.cke_skin_v2 .cke_format_panel{width:150px;height:170px;}.cke_skin_v2 .cke_font_panel{width:150px;height:170px;}.cke_skin_v2 .cke_fontSize_panel{height:170px;}.cke_skin_v2 .cke_fontSize .cke_text{width:20px;}.cke_skin_v2 .cke_browser_iequirks .cke_fontSize .cke_text{width:32px;}html .cke_skin_v2{visibility:inherit;}html.cke_skin_v2_container{visibility:visible;}
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/skins/v2/skin.js b/sm-shop/src/main/webapp/resources/js/ckeditor/skins/v2/skin.js
index 9421e2f..513de77 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/skins/v2/skin.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/skins/v2/skin.js
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.skins.add('v2',(function(){return{editor:{css:['editor.css']},dialog:{css:['dialog.css']},separator:{canGroup:false},templates:{css:['templates.css']},margins:[0,14,18,14]};})());(function(){CKEDITOR.dialog?a():CKEDITOR.on('dialogPluginReady',a);function a(){CKEDITOR.dialog.on('resize',function(b){var c=b.data,d=c.width,e=c.height,f=c.dialog,g=f.parts.contents;if(c.skin!='v2')return;g.setStyles({width:d+'px',height:e+'px'});if(!CKEDITOR.env.ie||CKEDITOR.env.ie9Compat)return;setTimeout(function(){var h=f.parts.dialog.getChild([0,0,0]),i=h.getChild(0),j=i.getSize('width');e+=i.getChild(0).getSize('height')+1;var k=h.getChild(2);k.setSize('width',j);k=h.getChild(7);k.setSize('width',j-28);k=h.getChild(4);k.setSize('height',e);k=h.getChild(5);k.setSize('height',e);},100);});};})();
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.skins.add('v2',(function(){return{editor:{css:['editor.css']},dialog:{css:['dialog.css']},separator:{canGroup:false},templates:{css:['templates.css']},margins:[0,14,18,14]};})());(function(){CKEDITOR.dialog?a():CKEDITOR.on('dialogPluginReady',a);function a(){CKEDITOR.dialog.on('resize',function(b){var c=b.data,d=c.width,e=c.height,f=c.dialog,g=f.parts.contents;if(c.skin!='v2')return;g.setStyles({width:d+'px',height:e+'px'});if(!CKEDITOR.env.ie||CKEDITOR.env.ie9Compat)return;setTimeout(function(){var h=f.parts.dialog.getChild([0,0,0]),i=h.getChild(0),j=i.getSize('width');e+=i.getChild(0).getSize('height')+1;var k=h.getChild(2);k.setSize('width',j);k=h.getChild(7);k.setSize('width',j-28);k=h.getChild(4);k.setSize('height',e);k=h.getChild(5);k.setSize('height',e);},100);});};})();
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/skins/v2/templates.css b/sm-shop/src/main/webapp/resources/js/ckeditor/skins/v2/templates.css
index 2fa56c1..bd1ac4f 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/skins/v2/templates.css
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/skins/v2/templates.css
@@ -1,6 +1,6 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-.cke_skin_v2 .cke_tpl_list{border:#dcdcdc 2px solid;background-color:#fff;overflow:auto;width:100%;height:220px;}.cke_skin_v2 .cke_tpl_item{margin:5px;padding:7px;border:#eee 1px solid;*width:88%;}.cke_skin_v2 .cke_tpl_preview{border-collapse:separate;text-indent:0;width:100%;}.cke_skin_v2 .cke_tpl_preview td{padding:2px;vertical-align:middle;}.cke_skin_v2 .cke_tpl_preview .cke_tpl_preview_img{width:100px;}.cke_skin_v2 .cke_tpl_preview span{white-space:normal;}.cke_skin_v2 .cke_tpl_title{font-weight:bold;}.cke_skin_v2 .cke_tpl_list a:active .cke_tpl_item,.cke_skin_v2 .cke_tpl_list a:hover .cke_tpl_item,.cke_skin_v2 .cke_tpl_list a:focus .cke_tpl_item{border:#f93 1px solid!important;background-color:#fffacd!important;}.cke_skin_v2 .cke_tpl_list a:active *,.cke_skin_v2 .cke_tpl_list a:hover *,.cke_skin_v2 .cke_tpl_list a:focus *{cursor:pointer;}.cke_skin_v2 .cke_browser_ie6 .cke_tpl_list a:active,.cke_skin_v2 .cke_browser_ie6 .cke_tpl_list a:hover,.cke_skin_v2 .cke_browser_ie6 .cke_tpl_list a:focus{background-position:0 0;}.cke_skin_v2 .cke_tpl_list a:active .cke_tpl_item,.cke_skin_v2 .cke_tpl_list a:hover .cke_tpl_item,.cke_skin_v2 .cke_tpl_list a:focus .cke_tpl_item{border-width:3px;}.cke_skin_v2 .cke_tpl_empty,.cke_tpl_loading{text-align:center;padding:5px;}
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+.cke_skin_v2 .cke_tpl_list{border:#dcdcdc 2px solid;background-color:#fff;overflow:auto;width:100%;height:220px;}.cke_skin_v2 .cke_tpl_item{margin:5px;padding:7px;border:#eee 1px solid;*width:88%;}.cke_skin_v2 .cke_tpl_preview{border-collapse:separate;text-indent:0;width:100%;}.cke_skin_v2 .cke_tpl_preview td{padding:2px;vertical-align:middle;}.cke_skin_v2 .cke_tpl_preview .cke_tpl_preview_img{width:100px;}.cke_skin_v2 .cke_tpl_preview span{white-space:normal;}.cke_skin_v2 .cke_tpl_title{font-weight:bold;}.cke_skin_v2 .cke_tpl_list a:active .cke_tpl_item,.cke_skin_v2 .cke_tpl_list a:hover .cke_tpl_item,.cke_skin_v2 .cke_tpl_list a:focus .cke_tpl_item{border:#f93 1px solid!important;background-color:#fffacd!important;}.cke_skin_v2 .cke_tpl_list a:active *,.cke_skin_v2 .cke_tpl_list a:hover *,.cke_skin_v2 .cke_tpl_list a:focus *{cursor:pointer;}.cke_skin_v2 .cke_browser_ie6 .cke_tpl_list a:active,.cke_skin_v2 .cke_browser_ie6 .cke_tpl_list a:hover,.cke_skin_v2 .cke_browser_ie6 .cke_tpl_list a:focus{background-position:0 0;}.cke_skin_v2 .cke_tpl_list a:active .cke_tpl_item,.cke_skin_v2 .cke_tpl_list a:hover .cke_tpl_item,.cke_skin_v2 .cke_tpl_list a:focus .cke_tpl_item{border-width:3px;}.cke_skin_v2 .cke_tpl_empty,.cke_tpl_loading{text-align:center;padding:5px;}
diff --git a/sm-shop/src/main/webapp/resources/js/ckeditor/themes/default/theme.js b/sm-shop/src/main/webapp/resources/js/ckeditor/themes/default/theme.js
index e508b4c..7acc36b 100644
--- a/sm-shop/src/main/webapp/resources/js/ckeditor/themes/default/theme.js
+++ b/sm-shop/src/main/webapp/resources/js/ckeditor/themes/default/theme.js
@@ -1,8 +1,8 @@
-/*
-Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
-For licensing, see LICENSE.html or http://ckeditor.com/license
-*/
-
-CKEDITOR.themes.add('default',(function(){var a={};function b(c,d){var e,f;f=c.config.sharedSpaces;f=f&&f[d];f=f&&CKEDITOR.document.getById(f);if(f){var g='<span class="cke_shared " dir="'+c.lang.dir+'"'+'>'+'<span class="'+c.skinClass+' '+c.id+' cke_editor_'+c.name+'">'+'<span class="'+CKEDITOR.env.cssClass+'">'+'<span class="cke_wrapper cke_'+c.lang.dir+'">'+'<span class="cke_editor">'+'<div class="cke_'+d+'">'+'</div></span></span></span></span></span>',h=f.append(CKEDITOR.dom.element.createFromHtml(g,f.getDocument()));if(f.getCustomData('cke_hasshared'))h.hide();else f.setCustomData('cke_hasshared',1);e=h.getChild([0,0,0,0]);!c.sharedSpaces&&(c.sharedSpaces={});c.sharedSpaces[d]=e;c.on('focus',function(){for(var i=0,j,k=f.getChildren();j=k.getItem(i);i++){if(j.type==CKEDITOR.NODE_ELEMENT&&!j.equals(h)&&j.hasClass('cke_shared'))j.hide();}h.show();});c.on('destroy',function(){h.remove();});}return e;};return{build:function(c,d){var e=c.name,f=c.element,g=c.elementMode;if(!f||g==CKEDITOR.ELEMENT_MODE_NONE)return;if(g==CKEDITOR.ELEMENT_MODE_REPLACE)f.hide();var h=c.fire('themeSpace',{space:'top',html:''}).html,i=c.fire('themeSpace',{space:'contents',html:''}).html,j=c.fireOnce('themeSpace',{space:'bottom',html:''}).html,k=i&&c.config.height,l=c.config.tabIndex||c.element.getAttribute('tabindex')||0;if(!i)k='auto';else if(!isNaN(k))k+='px';var m='',n=c.config.width;if(n){if(!isNaN(n))n+='px';m+='width: '+n+';';}var o=h&&b(c,'top'),p=b(c,'bottom');o&&(o.setHtml(h),h='');p&&(p.setHtml(j),j='');var q='<style>.'+c.skinClass+'{visibility:hidden;}</style>';if(a[c.skinClass])q='';else a[c.skinClass]=1;var r=CKEDITOR.dom.element.createFromHtml(['<span id="cke_',e,'" class="',c.skinClass,' ',c.id,' cke_editor_',e,'" dir="',c.lang.dir,'" title="',CKEDITOR.env.gecko?' ':'','" lang="',c.langCode,'"'+(CKEDITOR.env.webkit?' tabindex="'+l+'"':'')+' role="application"'+' aria-labelledby="cke_',e,'_arialbl"'+(m?' style="'+m+'"':'')+'>'+'<span id="cke_',e,'_arialbl" class="cke_voice_label">'+c.lang.editor+'</span>'+'<span class="',CKEDITOR.env.cssClass,'" role="presentation"><span class="cke_wrapper cke_',c.lang.dir,'" role="presentation"><table class="cke_editor" border="0" cellspacing="0" cellpadding="0" role="presentation"><tbody><tr',h?'':' style="display:none"',' role="presentation"><td id="cke_top_',e,'" class="cke_top" role="presentation">',h,'</td></tr><tr',i?'':' style="display:none"',' role="presentation"><td id="cke_contents_',e,'" class="cke_contents" style="height:',k,'" role="presentation">',i,'</td></tr><tr',j?'':' style="display:none"',' role="presentation"><td id="cke_bottom_',e,'" class="cke_bottom" role="presentation">',j,'</td></tr></tbody></table>'+q+'</span>'+'</span>'+'</span>'].join(''));
-r.getChild([1,0,0,0,0]).unselectable();r.getChild([1,0,0,0,2]).unselectable();if(g==CKEDITOR.ELEMENT_MODE_REPLACE)r.insertAfter(f);else f.append(r);c.container=r;r.disableContextMenu();c.on('contentDirChanged',function(s){var t=(c.lang.dir!=s.data?'add':'remove')+'Class';r.getChild(1)[t]('cke_mixed_dir_content');var u=this.sharedSpaces&&this.sharedSpaces[this.config.toolbarLocation];u&&u.getParent().getParent()[t]('cke_mixed_dir_content');});c.fireOnce('themeLoaded');c.fireOnce('uiReady');},buildDialog:function(c){var d=CKEDITOR.tools.getNextNumber(),e=CKEDITOR.dom.element.createFromHtml(['<div class="',c.id,'_dialog cke_editor_',c.name.replace('.','\\.'),'_dialog cke_skin_',c.skinName,'" dir="',c.lang.dir,'" lang="',c.langCode,'" role="dialog" aria-labelledby="%title#"><table class="cke_dialog',' '+CKEDITOR.env.cssClass,' cke_',c.lang.dir,'" style="position:absolute" role="presentation"><tr><td role="presentation"><div class="%body" role="presentation"><div id="%title#" class="%title" role="presentation"></div><a id="%close_button#" class="%close_button" href="javascript:void(0)" title="'+c.lang.common.close+'" role="button"><span class="cke_label">X</span></a>'+'<div id="%tabs#" class="%tabs" role="tablist"></div>'+'<table class="%contents" role="presentation">'+'<tr>'+'<td id="%contents#" class="%contents" role="presentation"></td>'+'</tr>'+'<tr>'+'<td id="%footer#" class="%footer" role="presentation"></td>'+'</tr>'+'</table>'+'</div>'+'<div id="%tl#" class="%tl"></div>'+'<div id="%tc#" class="%tc"></div>'+'<div id="%tr#" class="%tr"></div>'+'<div id="%ml#" class="%ml"></div>'+'<div id="%mr#" class="%mr"></div>'+'<div id="%bl#" class="%bl"></div>'+'<div id="%bc#" class="%bc"></div>'+'<div id="%br#" class="%br"></div>'+'</td></tr>'+'</table>',CKEDITOR.env.ie?'':'<style>.cke_dialog{visibility:hidden;}</style>','</div>'].join('').replace(/#/g,'_'+d).replace(/%/g,'cke_dialog_')),f=e.getChild([0,0,0,0,0]),g=f.getChild(0),h=f.getChild(1);if(CKEDITOR.env.ie&&!CKEDITOR.env.ie6Compat){var i=CKEDITOR.env.isCustomDomain(),j='javascript:void(function(){'+encodeURIComponent('document.open();'+(i?'document.domain="'+document.domain+'";':'')+'document.close();')+'}())',k=CKEDITOR.dom.element.createFromHtml('<iframe frameBorder="0" class="cke_iframe_shim" src="'+j+'"'+' tabIndex="-1"'+'></iframe>');k.appendTo(f.getParent());}g.unselectable();h.unselectable();return{element:e,parts:{dialog:e.getChild(0),title:g,close:h,tabs:f.getChild(2),contents:f.getChild([3,0,0,0]),footer:f.getChild([3,0,1,0])}};
-},destroy:function(c){var d=c.container,e=c.element;if(d){d.clearCustomData();d.remove();}if(e){e.clearCustomData();c.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE&&e.show();delete c.element;}}};})());CKEDITOR.editor.prototype.getThemeSpace=function(a){var b='cke_'+a,c=this._[b]||(this._[b]=CKEDITOR.document.getById(b+'_'+this.name));return c;};CKEDITOR.editor.prototype.resize=function(a,b,c,d){var j=this;var e=j.container,f=CKEDITOR.document.getById('cke_contents_'+j.name),g=CKEDITOR.env.webkit&&j.document&&j.document.getWindow().$.frameElement,h=d?e.getChild(1):e;h.setSize('width',a,true);g&&(g.style.width='1%');var i=c?0:(h.$.offsetHeight||0)-(f.$.clientHeight||0);f.setStyle('height',Math.max(b-i,0)+'px');g&&(g.style.width='100%');j.fire('resize');};CKEDITOR.editor.prototype.getResizable=function(a){return a?CKEDITOR.document.getById('cke_contents_'+this.name):this.container;};
+/*
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.
+For licensing, see LICENSE.html or http://ckeditor.com/license
+*/
+
+CKEDITOR.themes.add('default',(function(){var a={};function b(c,d){var e,f;f=c.config.sharedSpaces;f=f&&f[d];f=f&&CKEDITOR.document.getById(f);if(f){var g='<span class="cke_shared " dir="'+c.lang.dir+'"'+'>'+'<span class="'+c.skinClass+' '+c.id+' cke_editor_'+c.name+'">'+'<span class="'+CKEDITOR.env.cssClass+'">'+'<span class="cke_wrapper cke_'+c.lang.dir+'">'+'<span class="cke_editor">'+'<div class="cke_'+d+'">'+'</div></span></span></span></span></span>',h=f.append(CKEDITOR.dom.element.createFromHtml(g,f.getDocument()));if(f.getCustomData('cke_hasshared'))h.hide();else f.setCustomData('cke_hasshared',1);e=h.getChild([0,0,0,0]);!c.sharedSpaces&&(c.sharedSpaces={});c.sharedSpaces[d]=e;c.on('focus',function(){for(var i=0,j,k=f.getChildren();j=k.getItem(i);i++){if(j.type==CKEDITOR.NODE_ELEMENT&&!j.equals(h)&&j.hasClass('cke_shared'))j.hide();}h.show();});c.on('destroy',function(){h.remove();});}return e;};return{build:function(c,d){var e=c.name,f=c.element,g=c.elementMode;if(!f||g==CKEDITOR.ELEMENT_MODE_NONE)return;if(g==CKEDITOR.ELEMENT_MODE_REPLACE)f.hide();var h=c.fire('themeSpace',{space:'top',html:''}).html,i=c.fire('themeSpace',{space:'contents',html:''}).html,j=c.fireOnce('themeSpace',{space:'bottom',html:''}).html,k=i&&c.config.height,l=c.config.tabIndex||c.element.getAttribute('tabindex')||0;if(!i)k='auto';else if(!isNaN(k))k+='px';var m='',n=c.config.width;if(n){if(!isNaN(n))n+='px';m+='width: '+n+';';}var o=h&&b(c,'top'),p=b(c,'bottom');o&&(o.setHtml(h),h='');p&&(p.setHtml(j),j='');var q='<style>.'+c.skinClass+'{visibility:hidden;}</style>';if(a[c.skinClass])q='';else a[c.skinClass]=1;var r=CKEDITOR.dom.element.createFromHtml(['<span id="cke_',e,'" class="',c.skinClass,' ',c.id,' cke_editor_',e,'" dir="',c.lang.dir,'" title="',CKEDITOR.env.gecko?' ':'','" lang="',c.langCode,'"'+(CKEDITOR.env.webkit?' tabindex="'+l+'"':'')+' role="application"'+' aria-labelledby="cke_',e,'_arialbl"'+(m?' style="'+m+'"':'')+'>'+'<span id="cke_',e,'_arialbl" class="cke_voice_label">'+c.lang.editor+'</span>'+'<span class="',CKEDITOR.env.cssClass,'" role="presentation"><span class="cke_wrapper cke_',c.lang.dir,'" role="presentation"><table class="cke_editor" border="0" cellspacing="0" cellpadding="0" role="presentation"><tbody><tr',h?'':' style="display:none"',' role="presentation"><td id="cke_top_',e,'" class="cke_top" role="presentation">',h,'</td></tr><tr',i?'':' style="display:none"',' role="presentation"><td id="cke_contents_',e,'" class="cke_contents" style="height:',k,'" role="presentation">',i,'</td></tr><tr',j?'':' style="display:none"',' role="presentation"><td id="cke_bottom_',e,'" class="cke_bottom" role="presentation">',j,'</td></tr></tbody></table>'+q+'</span>'+'</span>'+'</span>'].join(''));
+r.getChild([1,0,0,0,0]).unselectable();r.getChild([1,0,0,0,2]).unselectable();if(g==CKEDITOR.ELEMENT_MODE_REPLACE)r.insertAfter(f);else f.append(r);c.container=r;r.disableContextMenu();c.on('contentDirChanged',function(s){var t=(c.lang.dir!=s.data?'add':'remove')+'Class';r.getChild(1)[t]('cke_mixed_dir_content');var u=this.sharedSpaces&&this.sharedSpaces[this.config.toolbarLocation];u&&u.getParent().getParent()[t]('cke_mixed_dir_content');});c.fireOnce('themeLoaded');c.fireOnce('uiReady');},buildDialog:function(c){var d=CKEDITOR.tools.getNextNumber(),e=CKEDITOR.dom.element.createFromHtml(['<div class="',c.id,'_dialog cke_editor_',c.name.replace('.','\\.'),'_dialog cke_skin_',c.skinName,'" dir="',c.lang.dir,'" lang="',c.langCode,'" role="dialog" aria-labelledby="%title#"><table class="cke_dialog',' '+CKEDITOR.env.cssClass,' cke_',c.lang.dir,'" style="position:absolute" role="presentation"><tr><td role="presentation"><div class="%body" role="presentation"><div id="%title#" class="%title" role="presentation"></div><a id="%close_button#" class="%close_button" href="javascript:void(0)" title="'+c.lang.common.close+'" role="button"><span class="cke_label">X</span></a>'+'<div id="%tabs#" class="%tabs" role="tablist"></div>'+'<table class="%contents" role="presentation">'+'<tr>'+'<td id="%contents#" class="%contents" role="presentation"></td>'+'</tr>'+'<tr>'+'<td id="%footer#" class="%footer" role="presentation"></td>'+'</tr>'+'</table>'+'</div>'+'<div id="%tl#" class="%tl"></div>'+'<div id="%tc#" class="%tc"></div>'+'<div id="%tr#" class="%tr"></div>'+'<div id="%ml#" class="%ml"></div>'+'<div id="%mr#" class="%mr"></div>'+'<div id="%bl#" class="%bl"></div>'+'<div id="%bc#" class="%bc"></div>'+'<div id="%br#" class="%br"></div>'+'</td></tr>'+'</table>',CKEDITOR.env.ie?'':'<style>.cke_dialog{visibility:hidden;}</style>','</div>'].join('').replace(/#/g,'_'+d).replace(/%/g,'cke_dialog_')),f=e.getChild([0,0,0,0,0]),g=f.getChild(0),h=f.getChild(1);if(CKEDITOR.env.ie&&!CKEDITOR.env.ie6Compat){var i=CKEDITOR.env.isCustomDomain(),j='javascript:void(function(){'+encodeURIComponent('document.open();'+(i?'document.domain="'+document.domain+'";':'')+'document.close();')+'}())',k=CKEDITOR.dom.element.createFromHtml('<iframe frameBorder="0" class="cke_iframe_shim" src="'+j+'"'+' tabIndex="-1"'+'></iframe>');k.appendTo(f.getParent());}g.unselectable();h.unselectable();return{element:e,parts:{dialog:e.getChild(0),title:g,close:h,tabs:f.getChild(2),contents:f.getChild([3,0,0,0]),footer:f.getChild([3,0,1,0])}};
+},destroy:function(c){var d=c.container,e=c.element;if(d){d.clearCustomData();d.remove();}if(e){e.clearCustomData();c.elementMode==CKEDITOR.ELEMENT_MODE_REPLACE&&e.show();delete c.element;}}};})());CKEDITOR.editor.prototype.getThemeSpace=function(a){var b='cke_'+a,c=this._[b]||(this._[b]=CKEDITOR.document.getById(b+'_'+this.name));return c;};CKEDITOR.editor.prototype.resize=function(a,b,c,d){var j=this;var e=j.container,f=CKEDITOR.document.getById('cke_contents_'+j.name),g=CKEDITOR.env.webkit&&j.document&&j.document.getWindow().$.frameElement,h=d?e.getChild(1):e;h.setSize('width',a,true);g&&(g.style.width='1%');var i=c?0:(h.$.offsetHeight||0)-(f.$.clientHeight||0);f.setStyle('height',Math.max(b-i,0)+'px');g&&(g.style.width='100%');j.fire('resize');};CKEDITOR.editor.prototype.getResizable=function(a){return a?CKEDITOR.document.getById('cke_contents_'+this.name):this.container;};
diff --git a/sm-shop/src/main/webapp/resources/js/functions.jsp b/sm-shop/src/main/webapp/resources/js/functions.jsp
index a623e66..a42ca5f 100644
--- a/sm-shop/src/main/webapp/resources/js/functions.jsp
+++ b/sm-shop/src/main/webapp/resources/js/functions.jsp
@@ -43,6 +43,19 @@ function getItemLabel(quantity) {
return labelItem;
}
+//assign rating on a list of products
+function setProductRating(productList) {
+ jQuery.each( productList, function( i, val ) {
+ var pId = '#productRating_' + val.id;
+ $(pId).raty({
+ readOnly: true,
+ half: true,
+ path : '<c:url value="/resources/img/stars/"/>',
+ score: val.ratingCount
+ });
+ });
+}
+
function getLoginErrorLabel() {
return '<s:message code="message.username.password" text="Login Failed. Username or Password is incorrect."/>';
}
@@ -91,6 +104,7 @@ function getOrderValidationMessage(messageKey) {
//stripe messages
var invalid_number = '<s:message code="messages.error.creditcard.number" text="invalid_number"/>';
+ var error_creditcard = '<s:message code="messages.error.creditcard" text="messages.error.creditcard"/>';
var invalid_expiry_month = '<s:message code="messages.error.creditcard.dateformat" text="invalid_expiry_month"/>';
var invalid_expiry_year = '<s:message code="messages.error.creditcard.dateformat" text="invalid_expiry_year"/>';
var invalid_cvc = '<s:message code="messages.error.creditcard.cvc" text="invalid_cvc"/>';
@@ -103,6 +117,7 @@ function getOrderValidationMessage(messageKey) {
var map = new Object(); // or var map = {};
map['invalid_number'] = invalid_number;
+ map['error_creditcard'] = error_creditcard;
map['invalid_expiry_month'] = invalid_expiry_month;
map['invalid_expiry_year'] = invalid_expiry_year;
map['invalid_cvc'] = invalid_cvc;
diff --git a/sm-shop/src/main/webapp/resources/js/jquery.alphanumeric.pack.js b/sm-shop/src/main/webapp/resources/js/jquery.alphanumeric.pack.js
index 26aba80..e2addf9 100644
--- a/sm-shop/src/main/webapp/resources/js/jquery.alphanumeric.pack.js
+++ b/sm-shop/src/main/webapp/resources/js/jquery.alphanumeric.pack.js
@@ -1 +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}('(2($){$.c.f=2(p){p=$.d({g:"!@#$%^&*()+=[]\\\\\\\';,/{}|\\":<>?~`.- ",4:"",9:""},p);7 3.b(2(){5(p.G)p.4+="Q";5(p.w)p.4+="n";s=p.9.z(\'\');x(i=0;i<s.y;i++)5(p.g.h(s[i])!=-1)s[i]="\\\\"+s[i];p.9=s.O(\'|\');6 l=N M(p.9,\'E\');6 a=p.g+p.4;a=a.H(l,\'\');$(3).J(2(e){5(!e.r)k=o.q(e.K);L k=o.q(e.r);5(a.h(k)!=-1)e.j();5(e.u&&k==\'v\')e.j()});$(3).B(\'D\',2(){7 F})})};$.c.I=2(p){6 8="n";8+=8.P();p=$.d({4:8},p);7 3.b(2(){$(3).f(p)})};$.c.t=2(p){6 m="A";p=$.d({4:m},p);7 3.b(2(){$(3).f(p)})}})(C);',53,53,'||function|this|nchars|if|var|return|az|allow|ch|each|fn|extend||alphanumeric|ichars|indexOf||preventDefault||reg|nm|abcdefghijklmnopqrstuvwxyz|String||fromCharCode|charCode||alpha|ctrlKey||allcaps|for|length|split|1234567890|bind|jQuery|contextmenu|gi|false|nocaps|replace|numeric|keypress|which|else|RegExp|new|join|toUpperCase|ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('|'),0,{}));
+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}('(2($){$.c.f=2(p){p=$.d({g:"!@#$%^&*()+=[]\\\\\\\';,/{}|\\":<>?~`.- ",4:"",9:""},p);7 3.b(2(){5(p.G)p.4+="Q";5(p.w)p.4+="n";s=p.9.z(\'\');x(i=0;i<s.y;i++)5(p.g.h(s[i])!=-1)s[i]="\\\\"+s[i];p.9=s.O(\'|\');6 l=N M(p.9,\'E\');6 a=p.g+p.4;a=a.H(l,\'\');$(3).J(2(e){5(!e.r)k=o.q(e.K);L k=o.q(e.r);5(a.h(k)!=-1)e.j();5(e.u&&k==\'v\')e.j()});$(3).B(\'D\',2(){7 F})})};$.c.I=2(p){6 8="n";8+=8.P();p=$.d({4:8},p);7 3.b(2(){$(3).f(p)})};$.c.t=2(p){6 m="A";p=$.d({4:m},p);7 3.b(2(){$(3).f(p)})}})(C);',53,53,'||function|this|nchars|if|var|return|az|allow|ch|each|fn|extend||alphanumeric|ichars|indexOf||preventDefault||reg|nm|abcdefghijklmnopqrstuvwxyz|String||fromCharCode|charCode||alpha|ctrlKey||allcaps|for|length|split|1234567890|bind|jQuery|contextmenu|gi|false|nocaps|replace|numeric|keypress|which|else|RegExp|new|join|toUpperCase|ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('|'),0,{}));
diff --git a/sm-shop/src/main/webapp/resources/js/jquery.formatCurrency-1.4.0.js b/sm-shop/src/main/webapp/resources/js/jquery.formatCurrency-1.4.0.js
index 71225ee..40e5468 100644
--- a/sm-shop/src/main/webapp/resources/js/jquery.formatCurrency-1.4.0.js
+++ b/sm-shop/src/main/webapp/resources/js/jquery.formatCurrency-1.4.0.js
@@ -1,244 +1,244 @@
-// This file is part of the jQuery formatCurrency Plugin.
-//
-// The jQuery formatCurrency Plugin 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 3 of the License, or
-// (at your option) any later version.
-
-// The jQuery formatCurrency Plugin 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
-// the jQuery formatCurrency Plugin. If not, see <http://www.gnu.org/licenses/>.
-
-(function($) {
-
- $.formatCurrency = {};
-
- $.formatCurrency.regions = [];
-
- // default Region is en
- $.formatCurrency.regions[''] = {
- symbol: '$',
- positiveFormat: '%s%n',
- negativeFormat: '(%s%n)',
- decimalSymbol: '.',
- digitGroupSymbol: ',',
- groupDigits: true
- };
-
- $.fn.formatCurrency = function(destination, settings) {
-
- if (arguments.length == 1 && typeof destination !== "string") {
- settings = destination;
- destination = false;
- }
-
- // initialize defaults
- var defaults = {
- name: "formatCurrency",
- colorize: false,
- region: '',
- global: true,
- roundToDecimalPlace: 2, // roundToDecimalPlace: -1; for no rounding; 0 to round to the dollar; 1 for one digit cents; 2 for two digit cents; 3 for three digit cents; ...
- eventOnDecimalsEntered: false
- };
- // initialize default region
- defaults = $.extend(defaults, $.formatCurrency.regions['']);
- // override defaults with settings passed in
- settings = $.extend(defaults, settings);
-
- // check for region setting
- if (settings.region.length > 0) {
- settings = $.extend(settings, getRegionOrCulture(settings.region));
- }
- settings.regex = generateRegex(settings);
-
- return this.each(function() {
- $this = $(this);
-
- // get number
- var num = '0';
- num = $this[$this.is('input, select, textarea') ? 'val' : 'html']();
-
- //identify '(123)' as a negative number
- if (num.search('\\(') >= 0) {
- num = '-' + num;
- }
-
- if (num === '' || (num === '-' && settings.roundToDecimalPlace === -1)) {
- return;
- }
-
- // if the number is valid use it, otherwise clean it
- if (isNaN(num)) {
- // clean number
- num = num.replace(settings.regex, '');
-
- if (num === '' || (num === '-' && settings.roundToDecimalPlace === -1)) {
- return;
- }
-
- if (settings.decimalSymbol != '.') {
- num = num.replace(settings.decimalSymbol, '.'); // reset to US decimal for arithmetic
- }
- if (isNaN(num)) {
- num = '0';
- }
- }
-
- // evalutate number input
- var numParts = String(num).split('.');
- var isPositive = (num == Math.abs(num));
- var hasDecimals = (numParts.length > 1);
- var decimals = (hasDecimals ? numParts[1].toString() : '0');
- var originalDecimals = decimals;
-
- // format number
- num = Math.abs(numParts[0]);
- num = isNaN(num) ? 0 : num;
- if (settings.roundToDecimalPlace >= 0) {
- decimals = parseFloat('1.' + decimals); // prepend "0."; (IE does NOT round 0.50.toFixed(0) up, but (1+0.50).toFixed(0)-1
- decimals = decimals.toFixed(settings.roundToDecimalPlace); // round
- if (decimals.substring(0, 1) == '2') {
- num = Number(num) + 1;
- }
- decimals = decimals.substring(2); // remove "0."
- }
- num = String(num);
-
- if (settings.groupDigits) {
- for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++) {
- num = num.substring(0, num.length - (4 * i + 3)) + settings.digitGroupSymbol + num.substring(num.length - (4 * i + 3));
- }
- }
-
- if ((hasDecimals && settings.roundToDecimalPlace == -1) || settings.roundToDecimalPlace > 0) {
- num += settings.decimalSymbol + decimals;
- }
-
- // format symbol/negative
- var format = isPositive ? settings.positiveFormat : settings.negativeFormat;
- var money = format.replace(/%s/g, settings.symbol);
- money = money.replace(/%n/g, num);
-
- // setup destination
- var $destination = $([]);
- if (!destination) {
- $destination = $this;
- } else {
- $destination = $(destination);
- }
- // set destination
- $destination[$destination.is('input, select, textarea') ? 'val' : 'html'](money);
-
- if (
- hasDecimals &&
- settings.eventOnDecimalsEntered &&
- originalDecimals.length > settings.roundToDecimalPlace
- ) {
- $destination.trigger('decimalsEntered', originalDecimals);
- }
-
- // colorize
- if (settings.colorize) {
- $destination.css('color', isPositive ? 'black' : 'red');
- }
- });
- };
-
- // Remove all non numbers from text
- $.fn.toNumber = function(settings) {
- var defaults = $.extend({
- name: "toNumber",
- region: '',
- global: true
- }, $.formatCurrency.regions['']);
-
- settings = jQuery.extend(defaults, settings);
- if (settings.region.length > 0) {
- settings = $.extend(settings, getRegionOrCulture(settings.region));
- }
- settings.regex = generateRegex(settings);
-
- return this.each(function() {
- var method = $(this).is('input, select, textarea') ? 'val' : 'html';
- $(this)[method]($(this)[method]().replace('(', '(-').replace(settings.regex, ''));
- });
- };
-
- // returns the value from the first element as a number
- $.fn.asNumber = function(settings) {
- var defaults = $.extend({
- name: "asNumber",
- region: '',
- parse: true,
- parseType: 'Float',
- global: true
- }, $.formatCurrency.regions['']);
- settings = jQuery.extend(defaults, settings);
- if (settings.region.length > 0) {
- settings = $.extend(settings, getRegionOrCulture(settings.region));
- }
- settings.regex = generateRegex(settings);
- settings.parseType = validateParseType(settings.parseType);
-
- var method = $(this).is('input, select, textarea') ? 'val' : 'html';
- var num = $(this)[method]();
- num = num ? num : "";
- num = num.replace('(', '(-');
- num = num.replace(settings.regex, '');
- if (!settings.parse) {
- return num;
- }
-
- if (num.length == 0) {
- num = '0';
- }
-
- if (settings.decimalSymbol != '.') {
- num = num.replace(settings.decimalSymbol, '.'); // reset to US decimal for arthmetic
- }
-
- return window['parse' + settings.parseType](num);
- };
-
- function getRegionOrCulture(region) {
- var regionInfo = $.formatCurrency.regions[region];
- if (regionInfo) {
- return regionInfo;
- }
- else {
- if (/(\w+)-(\w+)/g.test(region)) {
- var culture = region.replace(/(\w+)-(\w+)/g, "$1");
- return $.formatCurrency.regions[culture];
- }
- }
- // fallback to extend(null) (i.e. nothing)
- return null;
- }
-
- function validateParseType(parseType) {
- switch (parseType.toLowerCase()) {
- case 'int':
- return 'Int';
- case 'float':
- return 'Float';
- default:
- throw 'invalid parseType';
- }
- }
-
- function generateRegex(settings) {
- if (settings.symbol === '') {
- return new RegExp("[^\\d" + settings.decimalSymbol + "-]", "g");
- }
- else {
- var symbol = settings.symbol.replace('$', '\\$').replace('.', '\\.');
- return new RegExp(symbol + "|[^\\d" + settings.decimalSymbol + "-]", "g");
- }
- }
-
+// This file is part of the jQuery formatCurrency Plugin.
+//
+// The jQuery formatCurrency Plugin 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 3 of the License, or
+// (at your option) any later version.
+
+// The jQuery formatCurrency Plugin 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
+// the jQuery formatCurrency Plugin. If not, see <http://www.gnu.org/licenses/>.
+
+(function($) {
+
+ $.formatCurrency = {};
+
+ $.formatCurrency.regions = [];
+
+ // default Region is en
+ $.formatCurrency.regions[''] = {
+ symbol: '$',
+ positiveFormat: '%s%n',
+ negativeFormat: '(%s%n)',
+ decimalSymbol: '.',
+ digitGroupSymbol: ',',
+ groupDigits: true
+ };
+
+ $.fn.formatCurrency = function(destination, settings) {
+
+ if (arguments.length == 1 && typeof destination !== "string") {
+ settings = destination;
+ destination = false;
+ }
+
+ // initialize defaults
+ var defaults = {
+ name: "formatCurrency",
+ colorize: false,
+ region: '',
+ global: true,
+ roundToDecimalPlace: 2, // roundToDecimalPlace: -1; for no rounding; 0 to round to the dollar; 1 for one digit cents; 2 for two digit cents; 3 for three digit cents; ...
+ eventOnDecimalsEntered: false
+ };
+ // initialize default region
+ defaults = $.extend(defaults, $.formatCurrency.regions['']);
+ // override defaults with settings passed in
+ settings = $.extend(defaults, settings);
+
+ // check for region setting
+ if (settings.region.length > 0) {
+ settings = $.extend(settings, getRegionOrCulture(settings.region));
+ }
+ settings.regex = generateRegex(settings);
+
+ return this.each(function() {
+ $this = $(this);
+
+ // get number
+ var num = '0';
+ num = $this[$this.is('input, select, textarea') ? 'val' : 'html']();
+
+ //identify '(123)' as a negative number
+ if (num.search('\\(') >= 0) {
+ num = '-' + num;
+ }
+
+ if (num === '' || (num === '-' && settings.roundToDecimalPlace === -1)) {
+ return;
+ }
+
+ // if the number is valid use it, otherwise clean it
+ if (isNaN(num)) {
+ // clean number
+ num = num.replace(settings.regex, '');
+
+ if (num === '' || (num === '-' && settings.roundToDecimalPlace === -1)) {
+ return;
+ }
+
+ if (settings.decimalSymbol != '.') {
+ num = num.replace(settings.decimalSymbol, '.'); // reset to US decimal for arithmetic
+ }
+ if (isNaN(num)) {
+ num = '0';
+ }
+ }
+
+ // evalutate number input
+ var numParts = String(num).split('.');
+ var isPositive = (num == Math.abs(num));
+ var hasDecimals = (numParts.length > 1);
+ var decimals = (hasDecimals ? numParts[1].toString() : '0');
+ var originalDecimals = decimals;
+
+ // format number
+ num = Math.abs(numParts[0]);
+ num = isNaN(num) ? 0 : num;
+ if (settings.roundToDecimalPlace >= 0) {
+ decimals = parseFloat('1.' + decimals); // prepend "0."; (IE does NOT round 0.50.toFixed(0) up, but (1+0.50).toFixed(0)-1
+ decimals = decimals.toFixed(settings.roundToDecimalPlace); // round
+ if (decimals.substring(0, 1) == '2') {
+ num = Number(num) + 1;
+ }
+ decimals = decimals.substring(2); // remove "0."
+ }
+ num = String(num);
+
+ if (settings.groupDigits) {
+ for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3); i++) {
+ num = num.substring(0, num.length - (4 * i + 3)) + settings.digitGroupSymbol + num.substring(num.length - (4 * i + 3));
+ }
+ }
+
+ if ((hasDecimals && settings.roundToDecimalPlace == -1) || settings.roundToDecimalPlace > 0) {
+ num += settings.decimalSymbol + decimals;
+ }
+
+ // format symbol/negative
+ var format = isPositive ? settings.positiveFormat : settings.negativeFormat;
+ var money = format.replace(/%s/g, settings.symbol);
+ money = money.replace(/%n/g, num);
+
+ // setup destination
+ var $destination = $([]);
+ if (!destination) {
+ $destination = $this;
+ } else {
+ $destination = $(destination);
+ }
+ // set destination
+ $destination[$destination.is('input, select, textarea') ? 'val' : 'html'](money);
+
+ if (
+ hasDecimals &&
+ settings.eventOnDecimalsEntered &&
+ originalDecimals.length > settings.roundToDecimalPlace
+ ) {
+ $destination.trigger('decimalsEntered', originalDecimals);
+ }
+
+ // colorize
+ if (settings.colorize) {
+ $destination.css('color', isPositive ? 'black' : 'red');
+ }
+ });
+ };
+
+ // Remove all non numbers from text
+ $.fn.toNumber = function(settings) {
+ var defaults = $.extend({
+ name: "toNumber",
+ region: '',
+ global: true
+ }, $.formatCurrency.regions['']);
+
+ settings = jQuery.extend(defaults, settings);
+ if (settings.region.length > 0) {
+ settings = $.extend(settings, getRegionOrCulture(settings.region));
+ }
+ settings.regex = generateRegex(settings);
+
+ return this.each(function() {
+ var method = $(this).is('input, select, textarea') ? 'val' : 'html';
+ $(this)[method]($(this)[method]().replace('(', '(-').replace(settings.regex, ''));
+ });
+ };
+
+ // returns the value from the first element as a number
+ $.fn.asNumber = function(settings) {
+ var defaults = $.extend({
+ name: "asNumber",
+ region: '',
+ parse: true,
+ parseType: 'Float',
+ global: true
+ }, $.formatCurrency.regions['']);
+ settings = jQuery.extend(defaults, settings);
+ if (settings.region.length > 0) {
+ settings = $.extend(settings, getRegionOrCulture(settings.region));
+ }
+ settings.regex = generateRegex(settings);
+ settings.parseType = validateParseType(settings.parseType);
+
+ var method = $(this).is('input, select, textarea') ? 'val' : 'html';
+ var num = $(this)[method]();
+ num = num ? num : "";
+ num = num.replace('(', '(-');
+ num = num.replace(settings.regex, '');
+ if (!settings.parse) {
+ return num;
+ }
+
+ if (num.length == 0) {
+ num = '0';
+ }
+
+ if (settings.decimalSymbol != '.') {
+ num = num.replace(settings.decimalSymbol, '.'); // reset to US decimal for arthmetic
+ }
+
+ return window['parse' + settings.parseType](num);
+ };
+
+ function getRegionOrCulture(region) {
+ var regionInfo = $.formatCurrency.regions[region];
+ if (regionInfo) {
+ return regionInfo;
+ }
+ else {
+ if (/(\w+)-(\w+)/g.test(region)) {
+ var culture = region.replace(/(\w+)-(\w+)/g, "$1");
+ return $.formatCurrency.regions[culture];
+ }
+ }
+ // fallback to extend(null) (i.e. nothing)
+ return null;
+ }
+
+ function validateParseType(parseType) {
+ switch (parseType.toLowerCase()) {
+ case 'int':
+ return 'Int';
+ case 'float':
+ return 'Float';
+ default:
+ throw 'invalid parseType';
+ }
+ }
+
+ function generateRegex(settings) {
+ if (settings.symbol === '') {
+ return new RegExp("[^\\d" + settings.decimalSymbol + "-]", "g");
+ }
+ else {
+ var symbol = settings.symbol.replace('$', '\\$').replace('.', '\\.');
+ return new RegExp(symbol + "|[^\\d" + settings.decimalSymbol + "-]", "g");
+ }
+ }
+
})(jQuery);
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/resources/js/jquery.showLoading.min.js b/sm-shop/src/main/webapp/resources/js/jquery.showLoading.min.js
index 703d095..a9ae602 100644
--- a/sm-shop/src/main/webapp/resources/js/jquery.showLoading.min.js
+++ b/sm-shop/src/main/webapp/resources/js/jquery.showLoading.min.js
@@ -1,34 +1,34 @@
-/*
- * jQuery showLoading plugin v1.0
- *
- * Copyright (c) 2009 Jim Keller
- * Context - http://www.contextllc.com
- *
- * Dual licensed under the MIT and GPL licenses.
- *
- */
-jQuery.fn.showLoading=function(options){var indicatorID;var settings={'addClass':'','beforeShow':'','afterShow':'','hPos':'center','vPos':'center','indicatorZIndex':5001,'overlayZIndex':5000,'parent':'','marginTop':0,'marginLeft':0,'overlayWidth':null,'overlayHeight':null};jQuery.extend(settings,options);var loadingDiv=jQuery('<div></div>');var overlayDiv=jQuery('<div></div>');if(settings.indicatorID){indicatorID=settings.indicatorID;}
-else{indicatorID=jQuery(this).attr('id');}
-jQuery(loadingDiv).attr('id','loading-indicator-'+indicatorID);jQuery(loadingDiv).addClass('loading-indicator');if(settings.addClass){jQuery(loadingDiv).addClass(settings.addClass);}
-jQuery(overlayDiv).css('display','none');jQuery(document.body).append(overlayDiv);jQuery(overlayDiv).attr('id','loading-indicator-'+indicatorID+'-overlay');jQuery(overlayDiv).addClass('loading-indicator-overlay');if(settings.addClass){jQuery(overlayDiv).addClass(settings.addClass+'-overlay');}
-var overlay_width;var overlay_height;var border_top_width=jQuery(this).css('border-top-width');var border_left_width=jQuery(this).css('border-left-width');border_top_width=isNaN(parseInt(border_top_width))?0:border_top_width;border_left_width=isNaN(parseInt(border_left_width))?0:border_left_width;var overlay_left_pos=jQuery(this).offset().left+parseInt(border_left_width);var overlay_top_pos=jQuery(this).offset().top+parseInt(border_top_width);if(settings.overlayWidth!==null){overlay_width=settings.overlayWidth;}
-else{overlay_width=parseInt(jQuery(this).width())+parseInt(jQuery(this).css('padding-right'))+parseInt(jQuery(this).css('padding-left'));}
-if(settings.overlayHeight!==null){overlay_height=settings.overlayWidth;}
-else{overlay_height=parseInt(jQuery(this).height())+parseInt(jQuery(this).css('padding-top'))+parseInt(jQuery(this).css('padding-bottom'));}
-jQuery(overlayDiv).css('width',overlay_width.toString()+'px');jQuery(overlayDiv).css('height',overlay_height.toString()+'px');jQuery(overlayDiv).css('left',overlay_left_pos.toString()+'px');jQuery(overlayDiv).css('position','absolute');jQuery(overlayDiv).css('top',overlay_top_pos.toString()+'px');jQuery(overlayDiv).css('z-index',settings.overlayZIndex);if(settings.overlayCSS){jQuery(overlayDiv).css(settings.overlayCSS);}
-jQuery(loadingDiv).css('display','none');jQuery(document.body).append(loadingDiv);jQuery(loadingDiv).css('position','absolute');jQuery(loadingDiv).css('z-index',settings.indicatorZIndex);var indicatorTop=overlay_top_pos;if(settings.marginTop){indicatorTop+=parseInt(settings.marginTop);}
-var indicatorLeft=overlay_left_pos;if(settings.marginLeft){indicatorLeft+=parseInt(settings.marginTop);}
-if(settings.hPos.toString().toLowerCase()=='center'){jQuery(loadingDiv).css('left',(indicatorLeft+((jQuery(overlayDiv).width()-parseInt(jQuery(loadingDiv).width()))/2)).toString()+'px');}
-else if(settings.hPos.toString().toLowerCase()=='left'){jQuery(loadingDiv).css('left',(indicatorLeft+parseInt(jQuery(overlayDiv).css('margin-left'))).toString()+'px');}
-else if(settings.hPos.toString().toLowerCase()=='right'){jQuery(loadingDiv).css('left',(indicatorLeft+(jQuery(overlayDiv).width()-parseInt(jQuery(loadingDiv).width()))).toString()+'px');}
-else{jQuery(loadingDiv).css('left',(indicatorLeft+parseInt(settings.hPos)).toString()+'px');}
-if(settings.vPos.toString().toLowerCase()=='center'){jQuery(loadingDiv).css('top',(indicatorTop+((jQuery(overlayDiv).height()-parseInt(jQuery(loadingDiv).height()))/2)).toString()+'px');}
-else if(settings.vPos.toString().toLowerCase()=='top'){jQuery(loadingDiv).css('top',indicatorTop.toString()+'px');}
-else if(settings.vPos.toString().toLowerCase()=='bottom'){jQuery(loadingDiv).css('top',(indicatorTop+(jQuery(overlayDiv).height()-parseInt(jQuery(loadingDiv).height()))).toString()+'px');}
-else{jQuery(loadingDiv).css('top',(indicatorTop+parseInt(settings.vPos)).toString()+'px');}
-if(settings.css){jQuery(loadingDiv).css(settings.css);}
-var callback_options={'overlay':overlayDiv,'indicator':loadingDiv,'element':this};if(typeof(settings.beforeShow)=='function'){settings.beforeShow(callback_options);}
-jQuery(overlayDiv).show();jQuery(loadingDiv).show();if(typeof(settings.afterShow)=='function'){settings.afterShow(callback_options);}
-return this;};jQuery.fn.hideLoading=function(options){var settings={};jQuery.extend(settings,options);if(settings.indicatorID){indicatorID=settings.indicatorID;}
-else{indicatorID=jQuery(this).attr('id');}
-jQuery(document.body).find('#loading-indicator-'+indicatorID).remove();jQuery(document.body).find('#loading-indicator-'+indicatorID+'-overlay').remove();return this;};
+/*
+ * jQuery showLoading plugin v1.0
+ *
+ * Copyright (c) 2009 Jim Keller
+ * Context - http://www.contextllc.com
+ *
+ * Dual licensed under the MIT and GPL licenses.
+ *
+ */
+jQuery.fn.showLoading=function(options){var indicatorID;var settings={'addClass':'','beforeShow':'','afterShow':'','hPos':'center','vPos':'center','indicatorZIndex':5001,'overlayZIndex':5000,'parent':'','marginTop':0,'marginLeft':0,'overlayWidth':null,'overlayHeight':null};jQuery.extend(settings,options);var loadingDiv=jQuery('<div></div>');var overlayDiv=jQuery('<div></div>');if(settings.indicatorID){indicatorID=settings.indicatorID;}
+else{indicatorID=jQuery(this).attr('id');}
+jQuery(loadingDiv).attr('id','loading-indicator-'+indicatorID);jQuery(loadingDiv).addClass('loading-indicator');if(settings.addClass){jQuery(loadingDiv).addClass(settings.addClass);}
+jQuery(overlayDiv).css('display','none');jQuery(document.body).append(overlayDiv);jQuery(overlayDiv).attr('id','loading-indicator-'+indicatorID+'-overlay');jQuery(overlayDiv).addClass('loading-indicator-overlay');if(settings.addClass){jQuery(overlayDiv).addClass(settings.addClass+'-overlay');}
+var overlay_width;var overlay_height;var border_top_width=jQuery(this).css('border-top-width');var border_left_width=jQuery(this).css('border-left-width');border_top_width=isNaN(parseInt(border_top_width))?0:border_top_width;border_left_width=isNaN(parseInt(border_left_width))?0:border_left_width;var overlay_left_pos=jQuery(this).offset().left+parseInt(border_left_width);var overlay_top_pos=jQuery(this).offset().top+parseInt(border_top_width);if(settings.overlayWidth!==null){overlay_width=settings.overlayWidth;}
+else{overlay_width=parseInt(jQuery(this).width())+parseInt(jQuery(this).css('padding-right'))+parseInt(jQuery(this).css('padding-left'));}
+if(settings.overlayHeight!==null){overlay_height=settings.overlayWidth;}
+else{overlay_height=parseInt(jQuery(this).height())+parseInt(jQuery(this).css('padding-top'))+parseInt(jQuery(this).css('padding-bottom'));}
+jQuery(overlayDiv).css('width',overlay_width.toString()+'px');jQuery(overlayDiv).css('height',overlay_height.toString()+'px');jQuery(overlayDiv).css('left',overlay_left_pos.toString()+'px');jQuery(overlayDiv).css('position','absolute');jQuery(overlayDiv).css('top',overlay_top_pos.toString()+'px');jQuery(overlayDiv).css('z-index',settings.overlayZIndex);if(settings.overlayCSS){jQuery(overlayDiv).css(settings.overlayCSS);}
+jQuery(loadingDiv).css('display','none');jQuery(document.body).append(loadingDiv);jQuery(loadingDiv).css('position','absolute');jQuery(loadingDiv).css('z-index',settings.indicatorZIndex);var indicatorTop=overlay_top_pos;if(settings.marginTop){indicatorTop+=parseInt(settings.marginTop);}
+var indicatorLeft=overlay_left_pos;if(settings.marginLeft){indicatorLeft+=parseInt(settings.marginTop);}
+if(settings.hPos.toString().toLowerCase()=='center'){jQuery(loadingDiv).css('left',(indicatorLeft+((jQuery(overlayDiv).width()-parseInt(jQuery(loadingDiv).width()))/2)).toString()+'px');}
+else if(settings.hPos.toString().toLowerCase()=='left'){jQuery(loadingDiv).css('left',(indicatorLeft+parseInt(jQuery(overlayDiv).css('margin-left'))).toString()+'px');}
+else if(settings.hPos.toString().toLowerCase()=='right'){jQuery(loadingDiv).css('left',(indicatorLeft+(jQuery(overlayDiv).width()-parseInt(jQuery(loadingDiv).width()))).toString()+'px');}
+else{jQuery(loadingDiv).css('left',(indicatorLeft+parseInt(settings.hPos)).toString()+'px');}
+if(settings.vPos.toString().toLowerCase()=='center'){jQuery(loadingDiv).css('top',(indicatorTop+((jQuery(overlayDiv).height()-parseInt(jQuery(loadingDiv).height()))/2)).toString()+'px');}
+else if(settings.vPos.toString().toLowerCase()=='top'){jQuery(loadingDiv).css('top',indicatorTop.toString()+'px');}
+else if(settings.vPos.toString().toLowerCase()=='bottom'){jQuery(loadingDiv).css('top',(indicatorTop+(jQuery(overlayDiv).height()-parseInt(jQuery(loadingDiv).height()))).toString()+'px');}
+else{jQuery(loadingDiv).css('top',(indicatorTop+parseInt(settings.vPos)).toString()+'px');}
+if(settings.css){jQuery(loadingDiv).css(settings.css);}
+var callback_options={'overlay':overlayDiv,'indicator':loadingDiv,'element':this};if(typeof(settings.beforeShow)=='function'){settings.beforeShow(callback_options);}
+jQuery(overlayDiv).show();jQuery(loadingDiv).show();if(typeof(settings.afterShow)=='function'){settings.afterShow(callback_options);}
+return this;};jQuery.fn.hideLoading=function(options){var settings={};jQuery.extend(settings,options);if(settings.indicatorID){indicatorID=settings.indicatorID;}
+else{indicatorID=jQuery(this).attr('id');}
+jQuery(document.body).find('#loading-indicator-'+indicatorID).remove();jQuery(document.body).find('#loading-indicator-'+indicatorID+'-overlay').remove();return this;};
diff --git a/sm-shop/src/main/webapp/resources/js/jquery-cookie.js b/sm-shop/src/main/webapp/resources/js/jquery-cookie.js
index 6739e3a..02ff620 100644
--- a/sm-shop/src/main/webapp/resources/js/jquery-cookie.js
+++ b/sm-shop/src/main/webapp/resources/js/jquery-cookie.js
@@ -1,81 +1,81 @@
-/*jslint browser: true */ /*global jQuery: true */
-/**
-* jQuery Cookie plugin
-*
-* Copyright (c) 2010 Klaus Hartl (stilbuero.de)
-* Dual licensed under the MIT and GPL licenses:
-* http://www.opensource.org/licenses/mit-license.php
-* http://www.gnu.org/licenses/gpl.html
-*
-*/
-// TODO JsDoc
-/**
-* Create a cookie with the given key and value and other optional parameters.
-*
-* @example $.cookie('the_cookie', 'the_value');
-* @desc Set the value of a cookie.
-* @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true });
-* @desc Create a cookie with all available options.
-* @example $.cookie('the_cookie', 'the_value');
-* @desc Create a session cookie.
-* @example $.cookie('the_cookie', null);
-* @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain
-* used when the cookie was set.
-*
-* @param String key The key of the cookie.
-* @param String value The value of the cookie.
-* @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
-* @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
-* If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
-* If set to null or omitted, the cookie will be a session cookie and will not be retained
-* when the the browser exits.
-* @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
-* @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
-* @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
-* require a secure protocol (like HTTPS).
-* @type undefined
-*
-* @name $.cookie
-* @cat Plugins/Cookie
-* @author Klaus Hartl/klaus.hartl@stilbuero.de
-*/
-/**
-* Get the value of a cookie with the given key.
-*
-* @example $.cookie('the_cookie');
-* @desc Get the value of a cookie.
-*
-* @param String key The key of the cookie.
-* @return The value of the cookie.
-* @type String
-*
-* @name $.cookie
-* @cat Plugins/Cookie
-* @author Klaus Hartl/klaus.hartl@stilbuero.de
-*/
-jQuery.cookie = function (key, value, options) {
-// key and at least value given, set cookie...
-if (arguments.length > 1 && String(value) !== "[object Object]") {
-options = jQuery.extend({}, options);
-if (value === null || value === undefined) {
-options.expires = -1;
-}
-if (typeof options.expires === 'number') {
-var days = options.expires, t = options.expires = new Date();
-t.setDate(t.getDate() + days);
-}
-value = String(value);
-return (document.cookie = [
-encodeURIComponent(key), '=',
-options.raw ? value : encodeURIComponent(value),
-options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
-options.path ? '; path=' + options.path : '',
-options.domain ? '; domain=' + options.domain : '',
-options.secure ? '; secure' : ''
-].join(''));
-}
-// key and possibly options given, get cookie...
-options = value || {};
-var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent;
-return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null;
-};
+/*jslint browser: true */ /*global jQuery: true */
+/**
+* jQuery Cookie plugin
+*
+* Copyright (c) 2010 Klaus Hartl (stilbuero.de)
+* Dual licensed under the MIT and GPL licenses:
+* http://www.opensource.org/licenses/mit-license.php
+* http://www.gnu.org/licenses/gpl.html
+*
+*/
+// TODO JsDoc
+/**
+* Create a cookie with the given key and value and other optional parameters.
+*
+* @example $.cookie('the_cookie', 'the_value');
+* @desc Set the value of a cookie.
+* @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true });
+* @desc Create a cookie with all available options.
+* @example $.cookie('the_cookie', 'the_value');
+* @desc Create a session cookie.
+* @example $.cookie('the_cookie', null);
+* @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain
+* used when the cookie was set.
+*
+* @param String key The key of the cookie.
+* @param String value The value of the cookie.
+* @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
+* @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
+* If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
+* If set to null or omitted, the cookie will be a session cookie and will not be retained
+* when the the browser exits.
+* @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
+* @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
+* @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
+* require a secure protocol (like HTTPS).
+* @type undefined
+*
+* @name $.cookie
+* @cat Plugins/Cookie
+* @author Klaus Hartl/klaus.hartl@stilbuero.de
+*/
+/**
+* Get the value of a cookie with the given key.
+*
+* @example $.cookie('the_cookie');
+* @desc Get the value of a cookie.
+*
+* @param String key The key of the cookie.
+* @return The value of the cookie.
+* @type String
+*
+* @name $.cookie
+* @cat Plugins/Cookie
+* @author Klaus Hartl/klaus.hartl@stilbuero.de
+*/
+jQuery.cookie = function (key, value, options) {
+// key and at least value given, set cookie...
+if (arguments.length > 1 && String(value) !== "[object Object]") {
+options = jQuery.extend({}, options);
+if (value === null || value === undefined) {
+options.expires = -1;
+}
+if (typeof options.expires === 'number') {
+var days = options.expires, t = options.expires = new Date();
+t.setDate(t.getDate() + days);
+}
+value = String(value);
+return (document.cookie = [
+encodeURIComponent(key), '=',
+options.raw ? value : encodeURIComponent(value),
+options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
+options.path ? '; path=' + options.path : '',
+options.domain ? '; domain=' + options.domain : '',
+options.secure ? '; secure' : ''
+].join(''));
+}
+// key and possibly options given, get cookie...
+options = value || {};
+var result, decode = options.raw ? function (s) { return s; } : decodeURIComponent;
+return (result = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie)) ? decode(result[1]) : null;
+};
diff --git a/sm-shop/src/main/webapp/resources/js/login.js b/sm-shop/src/main/webapp/resources/js/login.js
index c232242..88a7255 100644
--- a/sm-shop/src/main/webapp/resources/js/login.js
+++ b/sm-shop/src/main/webapp/resources/js/login.js
@@ -23,12 +23,17 @@
e.stopPropagation();
login();
});
+
+ $("#genericLogin-button").click(function(e) {
+ log('Calling genericLogin');
+ e.preventDefault();
+ e.stopPropagation();
+ genericLogin();
+ });
});
function login() {
- //$("#login").submit(function(e) {
- //e.preventDefault();//do not submit form
$("#loginError").hide();
var userName = $('#signin_userName').val();
@@ -43,6 +48,7 @@
//log('Before showLoading');
//Need to have the logon table id signinPane
+ //showSMLoading('#pageContainer');
$('#signinPane').showLoading();
//log('username ' + userName + ' password ' + password + ' storeCode ' + storeCode);
@@ -55,7 +61,8 @@
cache:false,
dataType:'json',
'success': function(response) {
- $('#signinPane').hideLoading();
+ $('#signinPane').hideLoading();
+ //hideSMLoading('#pageContainer');
//log(response);
if (response.response.status==0) {//success
//SHOPPING_CART
@@ -78,4 +85,56 @@
});
return false;
//});
- }
\ No newline at end of file
+ }
+
+ function genericLogin() {
+
+ //error message
+ $("#loginError").remove();
+ var errMessageDiv = '<div id="loginError" class="alert alert-danger" role="alert">';
+
+ var userName = $('#signin_userName').val();
+ var password = $('#signin_password').val();
+ var storeCode = $('#signin_storeCode').val();
+ log('username ' + userName + ' password ' + password + ' storeCode ' + storeCode);
+ if(userName=='' || password=='') {
+ errorMessage = errMessageDiv + getLoginErrorLabel() + '</div>';
+ $(errorMessage).prependTo('#login-form');
+ return;
+ }
+
+ //Need to have the logon table id signinPane
+ showSMLoading('#pageContainer');
+
+ $.ajax({
+ type: "POST",
+ //my version
+ url: getContextPath() + "/shop/customer/logon.html",
+ data: "userName=" + userName + "&password=" + password + "&storeCode=" + storeCode,
+ cache:false,
+ dataType:'json',
+ 'success': function(response) {
+ hideSMLoading('#pageContainer');
+ //log(response);
+ if (response.response.status==0) {//success
+ //SHOPPING_CART
+ //log(response.response.SHOPPING_CART);
+ if(response.response.SHOPPING_CART!=null && response.response.SHOPPING_CART != ""){
+ //log('saving cart ' + response.response.SHOPPING_CART);
+ /** save cart in cookie **/
+ var cartCode = buildCartCode(response.response.SHOPPING_CART);
+ $.cookie('cart',cartCode, { expires: 1024, path:'/' });
+ //cookie requires to be saved again
+
+ }
+ //redirect to the same url
+ //log('Before redirection');
+ location.href= getContextPath() + '/shop/customer/dashboard.html';
+ } else {
+ errorMessage = errMessageDiv + getLoginErrorLabel() + '</div>';
+ $(errorMessage).prependTo('#login-form');
+ }
+ }
+ });
+ return false;
+ }
\ No newline at end of file
sm-shop/src/main/webapp/resources/js/registration.js 128(+64 -64)
diff --git a/sm-shop/src/main/webapp/resources/js/registration.js b/sm-shop/src/main/webapp/resources/js/registration.js
index 3de7790..44ccc80 100644
--- a/sm-shop/src/main/webapp/resources/js/registration.js
+++ b/sm-shop/src/main/webapp/resources/js/registration.js
@@ -1,64 +1,64 @@
- /**
- * registration functionality for storefront
- */
-
-
-$.fn.addZoneItems = function(div, data, defaultValue) {
- //console.log('Populating div ' + div + ' defaultValue ' + defaultValue);
- var selector = div + ' > option';
- var defaultExist = false;
- $(selector).remove();
- return this.each(function() {
- var list = this;
- $.each(data, function(index, itemData) {
- //console.log(itemData.code + ' ' + defaultValue);
- if(itemData.code==defaultValue) {
- defaultExist = true;
- }
- var option = new Option(itemData.name, itemData.code);
- list.add(option);
- });
- if(defaultExist && (defaultValue!=null && defaultValue!='')) {
- $(div).val(defaultValue);
- }
- });
-};
-
-
-function getZones(countryCode, zoneCode){
- $("#registration_zones option").remove();
- var url=getContextPath() + '/shop/reference/provinces.html';
- var data='countryCode=' + countryCode + '&lang=' + getLanguageCode();
-
- $.ajax({
- type: 'POST',
- url: url,
- data: data,
- dataType: 'json',
- success: function(responseObj){
-
- if((responseObj.response.status == 0 || responseObj.response.status ==9999) && responseObj.response.data){
- $("#registration_zones option").remove();
- $('#registration_zones').show();
- $('#hidden_registration_zones').hide();
-
- //var zone = $('#registration_zones');
- $('#registration_zones').addZoneItems('#registration_zones', responseObj.response.data, zoneCode);
-
- } else {
- $('#registration_zones').hide();
- $('#hidden_registration_zones').show();
- }
- },
- error: function(xhr, textStatus, errorThrown) {
- alert('error ' + errorThrown);
- }
-
-
- });
-
-}
-
-
-
-
+ /**
+ * registration functionality for storefront
+ */
+
+
+$.fn.addZoneItems = function(div, data, defaultValue) {
+ //console.log('Populating div ' + div + ' defaultValue ' + defaultValue);
+ var selector = div + ' > option';
+ var defaultExist = false;
+ $(selector).remove();
+ return this.each(function() {
+ var list = this;
+ $.each(data, function(index, itemData) {
+ //console.log(itemData.code + ' ' + defaultValue);
+ if(itemData.code==defaultValue) {
+ defaultExist = true;
+ }
+ var option = new Option(itemData.name, itemData.code);
+ list.add(option);
+ });
+ if(defaultExist && (defaultValue!=null && defaultValue!='')) {
+ $(div).val(defaultValue);
+ }
+ });
+};
+
+
+function getZones(countryCode, zoneCode){
+ $("#registration_zones option").remove();
+ var url=getContextPath() + '/shop/reference/provinces.html';
+ var data='countryCode=' + countryCode + '&lang=' + getLanguageCode();
+
+ $.ajax({
+ type: 'POST',
+ url: url,
+ data: data,
+ dataType: 'json',
+ success: function(responseObj){
+
+ if((responseObj.response.status == 0 || responseObj.response.status ==9999) && responseObj.response.data){
+ $("#registration_zones option").remove();
+ $('#registration_zones').show();
+ $('#hidden_registration_zones').hide();
+
+ //var zone = $('#registration_zones');
+ $('#registration_zones').addZoneItems('#registration_zones', responseObj.response.data, zoneCode);
+
+ } else {
+ $('#registration_zones').hide();
+ $('#hidden_registration_zones').show();
+ }
+ },
+ error: function(xhr, textStatus, errorThrown) {
+ alert('error ' + errorThrown);
+ }
+
+
+ });
+
+}
+
+
+
+
sm-shop/src/main/webapp/resources/js/shop-account.js 165(+83 -82)
diff --git a/sm-shop/src/main/webapp/resources/js/shop-account.js b/sm-shop/src/main/webapp/resources/js/shop-account.js
index 4d0d08c..d9ccb8d 100644
--- a/sm-shop/src/main/webapp/resources/js/shop-account.js
+++ b/sm-shop/src/main/webapp/resources/js/shop-account.js
@@ -1,82 +1,83 @@
-
-
-
- $(function(){
- log('Check for customer account');
- if(supportsCustomerLogin()) {
- if($('#customerNotLoggedInAccountTemplate')) {
- var customerNotLoggedInTemplate = Hogan.compile(document.getElementById("customerNotLoggedInAccountTemplate").innerHTML);
- var customerNotLoggedInRendered = customerNotLoggedInTemplate.render('');
- $('#customerAccount').html('');
- $('#customerAccount').append(customerNotLoggedInRendered);
- }
- initUserAccount();
- }
-
- });
-
- function initUserAccount() {
- var userName = getUserName();
- log('userName ' + userName);
- if(userName!=null) {
- displayUserAccount(userName);
- }
- }
-
-
-
-
-function displayUserAccount(userName){
- url = getContextPath() + '/shop/customer/accountSummary.json?userName='+userName;
- $.ajax({
- type: 'GET',
- url: url,
- error: function(xhr) {
- if(xhr.status==401) {//not authenticated
- removeUserName();
- }
-
- },
- success: function(customer) {
- log('From account summary');
- if(customer!=null) {
- //display user
- //alert("Supports customer loggin " + supportsCustomerLogin());
- if($('#customerLoggedInAccountTemplate')) {
- $('#customerAccount').html('');
- var customerLoggedInTemplate = Hogan.compile(document.getElementById("customerLoggedInAccountTemplate").innerHTML);
- var customerLoggedInRendered = customerLoggedInTemplate.render(customer);
- $('#customerAccount').append(customerLoggedInRendered);
- }
- }
- }
- });
-}
-
-
-
-/** returns the user name from the cookie **/
-function getUserName() {
-
- var user = $.cookie('user'); //should be [storecode_userName]
- var code = new Array();
-
- if(user!=null) {
- code = user.split('_');
- if(code[0]==getMerchantStoreCode()) {
- return code[1];
- }
- }
-}
-
-/** removes username from cookie **/
-function removeUserName() {
- log('Removing user cookie');
- var userName = getUserName();
- if(userName!=null) {
- $.cookie('user',null, { expires: 1, path:'/' });
- }
-
-}
-
-
+
+
+
+ $(function(){
+ log('Check for customer account');
+ if(supportsCustomerLogin()) {
+ if($('#customerNotLoggedInAccountTemplate')) {
+ var customerNotLoggedInTemplate = Hogan.compile(document.getElementById("customerNotLoggedInAccountTemplate").innerHTML);
+ var customerNotLoggedInRendered = customerNotLoggedInTemplate.render('');
+ $('#customerAccount').html('');
+ $('#customerAccount').append(customerNotLoggedInRendered);
+ }
+ initUserAccount();
+ }
+
+ });
+
+ function initUserAccount() {
+ var userName = getUserName();
+ log('userName ' + userName);
+ if(userName!=null) {
+ displayUserAccount(userName);
+ }
+ }
+
+
+
+
+function displayUserAccount(userName){
+ url = getContextPath() + '/shop/customer/accountSummary.json?userName='+userName;
+ $.ajax({
+ type: 'GET',
+ url: url,
+ error: function(xhr) {
+ if(xhr.status==401) {//not authenticated
+ removeUserName();
+ }
+
+ },
+ success: function(customer) {
+ log('From account summary');
+ if(customer!=null) {
+ //display user
+ //alert("Supports customer loggin " + supportsCustomerLogin());
+ if($('#customerLoggedInAccountTemplate')) {
+ $('#customerAccount').html('');
+ var customerLoggedInTemplate = Hogan.compile(document.getElementById("customerLoggedInAccountTemplate").innerHTML);
+ var customerLoggedInRendered = customerLoggedInTemplate.render(customer);
+ $('#customerAccount').append(customerLoggedInRendered);
+ }
+ }
+ }
+ });
+}
+
+
+
+/** returns the user name from the cookie **/
+function getUserName() {
+
+ var user = $.cookie('user'); //should be [storecode_userName]
+ var code = new Array();
+
+ if(user!=null) {
+ user = user.replace(/['"]+/g, '');
+ code = user.split('_');
+ if(code[0]==getMerchantStoreCode()) {
+ return code[1];
+ }
+ }
+}
+
+/** removes username from cookie **/
+function removeUserName() {
+ log('Removing user cookie');
+ var userName = getUserName();
+ if(userName!=null) {
+ $.cookie('user',null, { expires: 1, path:'/' });
+ }
+
+}
+
+
diff --git a/sm-shop/src/main/webapp/resources/js/shop-checkout.js b/sm-shop/src/main/webapp/resources/js/shop-checkout.js
new file mode 100644
index 0000000..12f04de
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/js/shop-checkout.js
@@ -0,0 +1,423 @@
+/**
+* Javascripts for the checkout
+*
+**/
+
+//apply form masks
+function setCountrySettings(prefix, countryCode) {
+ //add masks to a country
+ //console.log('Apply mask ' + countryCode);
+
+ var phoneSelector = '.' + prefix + '-phone';
+ var postalCodeSelector = '.' + prefix + '-postalCode';
+
+ if(countryCode=='CA') {//mask for canada
+ $(phoneSelector).mask("?(999) 999-9999");
+ $(postalCodeSelector).mask("?*** ***");
+ return;
+ }
+ if(countryCode=='US') {// mask for united states
+ $(phoneSelector).mask("?(999) 999-9999");
+ $(postalCodeSelector).mask("?99999");
+ return;
+ }
+
+ $(phoneSelector).unmask();
+ $(postalCodeSelector).unmask();
+
+
+}
+
+//populate provinces drop down list
+$.fn.addItems = function(div, data, defaultValue) {
+ //console.log('Populating div ' + div + ' defaultValue ' + defaultValue);
+ var selector = div + ' > option';
+ var defaultExist = false;
+ $(selector).remove();
+ return this.each(function() {
+ var list = this;
+ $.each(data, function(index, itemData) {
+ //console.log(itemData.code + ' ' + defaultValue);
+ if(itemData.code==defaultValue) {
+ defaultExist = true;
+ }
+ var option = new Option(itemData.name, itemData.code);
+ list.add(option);
+ });
+ if(defaultExist && (defaultValue!=null && defaultValue!='')) {
+ $(div).val(defaultValue);
+ }
+ });
+};
+
+
+<!-- creates a json representation of the form -->
+$.fn.serializeObject = function()
+{
+ var o = {};
+ var a = this.serializeArray();
+ $.each(a, function() {
+ if (o[this.name]) {
+ if (!o[this.name].push) {
+ o[this.name] = [o[this.name]];
+ }
+ o[this.name].push(this.value || '');
+ } else {
+ o[this.name] = this.value || '';
+ }
+ });
+ return o;
+};
+
+//get zones
+
+/**
+ * Specify
+ * div list container
+ * text div (shown or not)
+ * selected countryCode
+ * preselected value
+ * language (en|fr...)
+ * callback to invoke
+ */
+function getZones(listDiv, textDiv, countryCode, defaultValue, lang, callBackFunction){
+ $.ajax({
+ type: 'POST',
+ url: getContextPath() + '/shop/reference/provinces.html',
+ data: 'countryCode=' + countryCode + '&lang=' + lang,
+ dataType: 'json',
+ success: function(response){
+ var status = response.response.status;
+ var data = response.response.data;
+ //console.log(status);
+ if((status==0 || status ==9999) && data) {
+
+ //console.log(data);
+ if(data && data.length>0) {
+ $(listDiv).addClass('required');
+ $(listDiv).show();
+ $(textDiv).removeClass('required');
+ $(textDiv).hide();
+ $(listDiv).addItems(listDiv, data, defaultValue);
+ } else {
+ $(listDiv).removeClass('required');
+ $(listDiv).hide();
+ $(textDiv).addClass('required');
+ $(textDiv).show();
+ if(defaultValue!=null || defaultValue !='') {
+ $(textDiv).val(defaultValue);
+ }
+ }
+ } else {
+ $(listDiv).hide();
+ $(textDiv).show();
+ }
+
+ if(callBackFunction!=null) {
+ callBackFunction();
+ }
+ },
+ error: function(xhr, textStatus, errorThrown) {
+ alert('error ' + errorThrown);
+ }
+
+ });
+}
+
+function shippingQuotes(url,useDistanceWindow){
+
+ resetErrorMessage();
+ showSMLoading('#pageContainer');
+ var data = $(checkoutFormId).serialize();
+ //log(data);
+
+ //log('Checked ? ' + $('#shipToDeliveryAddress').is(':checked'));
+ if ($('#shipToDeliveryAddress').is(':checked')) {
+ log('It is checked');
+ data.shipToBillingAdress = false;
+ log(data);
+ }
+
+ formValid = false;
+
+
+ $.ajax({
+ type: 'POST',
+ url: url,
+ data: data,
+ cache: false,
+ dataType: 'json',
+ success: function(response){
+
+ hideSMLoading('#pageContainer');
+ if(response.errorMessage!=null && response.errorMessage!='') {
+
+ showErrorMessage(response.errorMessage);
+ //reset shipping options
+ $('#shippingSection').html('');
+ $('#shippingSection').html(response.errorMessage);
+
+ $('#confirm_address').remove();
+ $("#confirmShippingAddress").hide();
+
+ return;
+ }
+
+ //log(response);
+
+ //remove subtotal
+ $('#summary-table tr.subt').remove();
+ $('#totalRow').html('');
+
+
+ var subTotalsTemplate = Hogan.compile(document.getElementById("subTotalsTemplate").innerHTML);
+ var totalTemplate = Hogan.compile(document.getElementById("totalTemplate").innerHTML);
+ var quotesTemplate = Hogan.compile(document.getElementById("shippingTemplate").innerHTML);
+ var subTotalsRendered = subTotalsTemplate.render(response);
+ var totalRendred = totalTemplate.render(response);
+
+ if(response.shippingSummary!=null) {
+
+ //create extra fields
+ summary = response.shippingSummary;
+ for(var i = 0; i< summary.shippingOptions.length; i++) {
+ if(summary.shippingOptions[i].optionId == summary.selectedShippingOption.optionId) {
+ summary.shippingOptions[i].checked = true;
+ break;
+ }
+ }
+ if(summary.handling && summary.handling>0) {
+ summary.showHandling = true;
+ }
+
+
+ //render summary
+ $('#shippingSection').html('');
+ var quotesRendered = quotesTemplate.render(response.shippingSummary);
+ //console.log(quotesRendered);
+ $('#shippingSection').html(quotesRendered);
+ bindCalculateShipping();
+ ///bindActions();//TODO NO NO NO
+
+ }
+ $('#summaryRows').append(subTotalsRendered);
+ $('#totalRow').html(totalRendred);
+ formValid = isFormValid();
+
+ //if(formValid && response.shippingSummary!=null) {
+ validateConfirmShipping(response,useDistanceWindow);
+ //}
+
+ },
+ error: function(xhr, textStatus, errorThrown) {
+ hideSMLoading('#pageContainer');
+ alert('error ' + errorThrown);
+ }
+
+ });
+
+}
+
+function validateConfirmShipping(shopOrder,useDistanceWindow) {
+
+ postalCode = null;
+ shippingDistance = null;
+ shippingMethod = null;
+
+ //console.log('vaidateConfirmShipping');
+
+ if(shopOrder!=null) {
+
+ if(shopOrder.shippingSummary.selectedShippingOption!=null) {
+ shippingMethod = shopOrder.shippingSummary.selectedShippingOption.shippingModuleCode;
+ }
+
+ //build address object
+
+ //displayConfirmShipping(shippingDistance,postalCode,shippingMethod);
+ var delivery = shopOrder.shippingSummary.delivery;
+ displayConfirmShipping(delivery,shippingMethod,useDistanceWindow);
+
+ }
+
+}
+
+function displayConfirmShipping(delivery,shippingMethod,useDistanceWindow) {
+
+ /**
+ * Requires this div in the form
+ * <div id="confirmShippingAddress" style="height:250px;"></div>
+ *
+ **/
+
+ var $form = $('#checkoutForm');
+ $('#confirm_address').remove();
+ $("#confirmShippingAddress").hide();
+ var deliveryAddress = buildMailAddress(delivery);
+ console.log('Use distance: ' + useDistanceWindow + ' lat: ' + delivery.latitude + ' lon: ' + delivery.longitude + ' postal code: ' + delivery.postalCode + ' shipping method: ' + shippingMethod);
+
+ /**
+ * quote =! storePickup
+ * postal code
+ * latitude
+ **/
+
+ /**
+ * If distance is configured and has been set in the quote
+ * confirm the shipping address on a Map
+ **/
+ if(useDistanceWindow) {
+ /**
+ * Requires a shipping quote (response.shippingSummary)
+ * and no order form validation error
+ * then display the shipping confirmation window
+ **/
+ if(delivery!=null && delivery.latitude!=null && delivery.longitude && delivery.postalCode!=null && shippingMethod!=null) {
+ if(shippingMethod!='storePickUp') {
+
+ $("#confirmShippingAddress").show();
+
+ var distanceField = '<input type="hidden" id="confirm_address" name="confirm_address" value="true" />';
+ $form.append(distanceField);
+ //longitude
+ //latitude
+ //google maps
+ var lat = Number(delivery.latitude);
+ var lon = Number(delivery.longitude);
+
+ var myLatlng = new google.maps.LatLng(lat,lon);
+ var mapOptions = {
+ zoom: 18,
+ center: myLatlng
+ }
+ var map = new google.maps.Map(document.getElementById("confirmShippingAddress"), mapOptions);
+
+ var marker = new google.maps.Marker({
+ position: myLatlng,
+ title:deliveryAddress
+ });
+
+ // To add the marker to the map, call setMap();
+ marker.setMap(map);
+
+ $("#confirmShippingAddress").show();
+ }
+ }
+ }
+}
+
+function bindCalculateShipping() {
+
+ $(".shippingOption").click(function() {
+ console.log('shipping module code ' + $(this).attr('code'));
+ $('#shippingModule').val($(this).attr('code'));
+ var useDistance = $('#useDistanceWindow').val();
+ console.log('Use distance ' + useDistance);
+ calculateTotal(calculateTotalUrl,useDistance);
+ });
+
+}
+
+function calculateTotal(url,useDistanceWindow){
+ console.log('URL' + url);
+ console.log('Distance window ' + useDistanceWindow);
+ resetErrorMessage();
+ showSMLoading('#pageContainer');
+ var data = $(checkoutFormId).serialize();
+ //console.log(data);
+ formValid = false;
+
+ $.ajax({
+ type: 'POST',
+ url: url,
+ data: data,
+ cache: false,
+ dataType: 'json',
+ success: function(response){
+
+ hideSMLoading('#pageContainer');
+ if(response.errorMessage!==null && response.errorMessage!=='') {
+ showErrorMessage(response.errorMessage);
+ return;
+ }
+
+ //console.log(response);
+
+ $('#summary-table tr.subt').remove();
+ $('#totalRow').html('');
+
+
+ var subTotalsTemplate = Hogan.compile(document.getElementById("subTotalsTemplate").innerHTML);
+ var totalTemplate = Hogan.compile(document.getElementById("totalTemplate").innerHTML);
+ var subTotalsRendered = subTotalsTemplate.render(response);
+ var totalRendred = totalTemplate.render(response);
+
+
+ //console.log(rendered);
+ $('#summaryRows').append(subTotalsRendered);
+ $('#totalRow').html(totalRendred);
+ formValid = isFormValid();
+ validateConfirmShipping(response,useDistanceWindow);
+ },
+ error: function(xhr, textStatus, errorThrown) {
+ hideSMLoading('#pageContainer');
+ console.log('error ' + errorThrown);
+ }
+
+ });
+}
+
+
+function buildMailAddress(address) {
+
+ if(address==null) {
+ return null;
+ }
+
+ var addr = '';
+
+ //civic address
+ addr = address.address + '\r\n';
+
+
+ //municipality/town state/province postal code
+ addr = addr + address.zone + ' ' + address.postalCode + '\r\n';
+
+ //country
+ addr = addr + address.country;
+
+ return addr;
+}
+
+function setPaymentModule(module) {
+ console.log('Module - ' + module);
+ $('#paymentModule').val(module);
+ var pType = module;
+
+ if(module.indexOf('paypal') >= 0) {
+ //$('#paymentMethodType').val('PAYPAL');
+ $('#paymentMethodType').attr("value", 'PAYPAL');
+ }
+ else if(module.indexOf('stripe') >= 0) {
+ $('#paymentMethodType').val('CREDITCARD');
+ $('#paymentMethodType').attr("value", 'CREDITCARD');
+ }
+ else if(module.indexOf('beanstream') >= 0) {
+ $('#paymentMethodType').val('CREDITCARD');
+ $('#paymentMethodType').attr("value", 'CREDITCARD');
+
+ }
+ else if(module.indexOf('braintree') >= 0) {
+ $('#paymentMethodType').val('CREDITCARD');
+ $('#paymentMethodType').attr("value", 'CREDITCARD');
+
+ }
+ else {
+ pType = pType.toUpperCase();
+ console.log('Other type - ' + pType);
+ $('#paymentMethodType').val(pType);
+ }
+
+ //TODO set the TAB to the payment type
+
+}
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/resources/js/shop-functions.js b/sm-shop/src/main/webapp/resources/js/shop-functions.js
index 8daf74f..e4cd78f 100644
--- a/sm-shop/src/main/webapp/resources/js/shop-functions.js
+++ b/sm-shop/src/main/webapp/resources/js/shop-functions.js
@@ -20,9 +20,25 @@ function log(value) {
}
}
-function loadProducts(url,divProductsContainer) {
- $(divProductsContainer).showLoading();
+function showSMLoading(element) {
+ if ($.isFunction(showTemplateLoading)) {
+ showTemplateLoading(element);
+ } else {
+ $(element).showLoading();
+ }
+
+}
+
+function hideSMLoading(element) {
+ if ($.isFunction(hideTemplateLoading)) {
+ hideTemplateLoading(element);
+ } else {
+ $(element).hideLoading();
+ }
+}
+function loadProducts(url,divProductsContainer) {
+ showSMLoading(divProductsContainer);
$.ajax({
type: 'POST',
dataType: "json",
@@ -35,7 +51,7 @@ function loadProducts(url,divProductsContainer) {
},
error: function(jqXHR,textStatus,errorThrown) {
- $(divProductsContainer).hideLoading();
+ hideSMLoading(divProductsContainer);
alert('Error ' + jqXHR + "-" + textStatus + "-" + errorThrown);
}
@@ -46,6 +62,7 @@ function loadProducts(url,divProductsContainer) {
}
+
function searchProducts(url,divProductsContainer,q,filter) {
//log(q);
sm-shop/src/main/webapp/resources/js/shop-minicart.js 746(+376 -370)
diff --git a/sm-shop/src/main/webapp/resources/js/shop-minicart.js b/sm-shop/src/main/webapp/resources/js/shop-minicart.js
index eb2674d..331edb6 100644
--- a/sm-shop/src/main/webapp/resources/js/shop-minicart.js
+++ b/sm-shop/src/main/webapp/resources/js/shop-minicart.js
@@ -1,370 +1,376 @@
-
-
-
- $(function(){
-
- initBindings();
- initMiniCart();
-
- });
-
- function initMiniCart() {
- var cartCode = getCartCode();
- //log('Check for cart code ' + cartCode);
- if(cartCode!=null) {
- miniCart(cartCode);
- } else {
- //display empty cart
- var emptyCart = emptyCartObject();
- miniCartSummary(emptyCart);//mini cart summary empty
- fullCart(emptyCart);//mini cart empty dropdown
- }
-
- }
-
- function removeCart() {
-
- var cartCode = getCartCode();
- if(cartCode!=null) {
- $.cookie('cart',null, { expires: 1, path:'/' });
- }
-
- }
-
- function initBindings() {
-
- /** add to cart **/
- $(".addToCart").click(function(){
- addToCart($(this).attr("productId"));
- });
-
- $("#open-cart").click(function(e) {
- //nothing required
- });
-
- }
-
- /**
- * Function used for adding a product to the Shopping Cart
- */
- function addToCart(sku) {
- $('#pageContainer').showLoading();
- var qty = '#qty-productId-'+ sku;
- var quantity = $(qty).val();
- if(!quantity || quantity==null || quantity==0) {
- quantity = 1;
- }
-
- var formId = '#input-' + sku;
- //var $inputs = $(formId);
- var $inputs = $(formId).find(':input');
-
- var values = new Array();
- if($inputs.length>0) {//check for attributes
- i = 0;
- $inputs.each(function() { //attributes
- if($(this).hasClass('attribute')) {
- //if($(this).hasClass('required') && !$(this).is(':checked')) {
- // $(this).parent().css('border', '1px solid red');
- //}
- if($(this).is(':checkbox')) {
- var checkboxSelected = $(this).is(':checked');
- if(checkboxSelected==true) {
- values[i] = $(this).val();
- //console.log('checkbox ' + values[i]);
- i++;
- }
-
- } else if ($(this).is(':radio')) {
- var radioChecked = $(this).is(':checked');
- if(radioChecked==true) {
- values[i] = $(this).val();
- //console.log('radio ' + values[i]);
- i++;
- }
- } else {
- if($(this).val()) {
- values[i] = $(this).val();
- //console.log('select ' + values[i]);
- i++;
- }
- }
- }
- });
- }
-
- var cartCode = getCartCode();
-
-
- /**
- * shopping cart code identifier is <cart>_<storeId>
- * need to check if the cookie is for the appropriate store
- */
-
- //cart item
- var prefix = "{";
- var suffix = "}";
- var shoppingCartItem = '';
-
- if(cartCode!=null && cartCode != '') {
- shoppingCartItem = '"code":' + '"' + cartCode + '"'+',';
- }
- var shoppingCartItem = shoppingCartItem + '"quantity":' + quantity + ',';
- var shoppingCartItem = shoppingCartItem + '"productId":' + sku;
-
-
- var attributes = null;
- //cart attributes
- if(values.length>0) {
- attributes = '[';
- for (var i = 0; i < values.length; i++) {
- var shoppingAttribute= prefix + '"attributeId":' + values[i] + suffix ;
- if(values.length>1 && i < values.length-1){
- shoppingAttribute = shoppingAttribute + ',';
- }
- attributes = attributes + shoppingAttribute;
- }
- attributes = attributes + ']';
- }
-
- if(attributes!=null) {
- shoppingCartItem = shoppingCartItem + ',"shoppingCartAttributes":' + attributes;
- }
-
- var scItem = prefix + shoppingCartItem + suffix;
-
- /** debug add to cart **/
- //console.log(scItem);
-
-
- $.ajax({
- type: 'POST',
- url: getContextPath() + '/shop/cart/addShoppingCartItem',
- data: scItem,
- contentType: 'application/json;charset=utf-8',
- dataType: 'json',
- cache:false,
- error: function(e) {
- log('Error while adding to cart');
- $('#pageContainer').hideLoading();
-
- },
- success: function(cart) {
-
- saveCart(cart.code);
-
- if(cart.message!=null) {
- //TODO error message
- log('Error while adding to cart ' + cart.message);
- }
-
- cleanupMiniCart();
- miniCartSummary(cart);
- fullCart(cart);
-
- $('#pageContainer').hideLoading();
- }
- });
-
- }
-
-function removeLineItem(lineItemId){
- $( "#shoppingCartRemoveLineitem_"+lineItemId).submit();
-}
-
-function updateLineItem(lineItemId,actionURL){
- $("#shoppingCartLineitem_"+lineItemId).attr('action', actionURL);
- $( "#shoppingCartLineitem_"+lineItemId).submit();
-}
-
-//update full cart
-function updateCart(cartDiv) {
- $('.alert-error').hide();
- $('.quantity').removeClass('required');
- $('#mainCartTable').showLoading();
- var inputs = $(cartDiv).find('.quantity');
- var cartCode = getCartCode();
- if(inputs !=null && cartCode!=null) {
- var items = new Array();
- for(var i = 0; i< inputs.length; i++) {
- var item = new Object();
- var qty = inputs[i].value;
- if(qty =='' || qty<1) {
- $('#' + inputs[i].id).addClass('required');
- $('#mainCartTable').hideLoading();
- return;
- }
- var id = inputs[i].id;
-
- item.id = id;
- item.quantity = qty;
- item.code=cartCode;
- items[i] = item;
- }
- //update cart
- json_data = JSON.stringify(items);
-
- $.ajax({
- type: 'POST',
- url: getContextPath() + '/shop/cart/updateShoppingCartItem.html',
- data: json_data,
- contentType: 'application/json;charset=utf-8',
- dataType: 'json',
- cache:false,
- error: function(e) {
- console.log('error ' + e);
- $('#mainCartTable').hideLoading();
- },
- success: function(response) {
- $('#mainCartTable').hideLoading();
- if(response.response.status==-1) {
- $('.alert-error').show();
- } else {
- location.href= getContextPath() + '/shop/cart/shoppingCart.html';
- }
- }
- });
-
- }
-}
-
-function miniCart(cartCode){
-
- log('Display cart content');
-
-
- $.ajax({
- type: 'GET',
- url: getContextPath() + '/shop/cart/displayMiniCartByCode?shoppingCartCode='+cartCode,
- cache:false,
- error: function(e) {
- console.log('error ' + e);
- //nothing
-
- },
- success: function(miniCart) {
- log('Success ' + miniCart.code);
-
- cleanupMiniCart();
- miniCartSummary(miniCart);
- fullCart(miniCart);
-
-
- }
- });
-}
-
-
-
- /**
- * JS function responsible for removing give line item from
- * the Cart.
- * For more details see MiniCartController.
- *
- * Controller will return JSON as response and it will be parsed to update
- * mini-cart section.
- * @param lineItemId
- */
-function removeItemFromMinicart(lineItemId){
-
- shoppingCartCode = getCartCode();
- $.ajax({
- type: 'GET',
- cache:false,
- url: getContextPath() + '/shop/cart/removeMiniShoppingCartItem?lineItemId='+lineItemId + '&shoppingCartCode=' + shoppingCartCode,
- error: function(e) {
- console.log('error ' + e);
-
- },
- success: function(miniCart) {
-
- miniCartSummary(miniCart);
- fullCart(miniCart);
-
- }
- });
-}
-
-function displayMiniCartSummary(code){
- $.ajax({
- type: 'GET',
- url: getContextPath() + '/shop/cart/displayMiniCartByCode?shoppingCartCode='+code,
- error: function(e) {
- // do nothing
- console('error while getting cart');
-
- },
- success: function(cart) {
- if(cart==null || cart=='') {
- emptyCartLabel();
- $.cookie('cart',null, { expires: 1, path:'/' });
- } else {
- displayTotals(cart);
- }
- }
- });
-}
-
-function cleanupMiniCart() {
- $('#miniCartDetails').html('');
-}
-
-function miniCartSummary(cart) {
-
- var miniCartSummaryTemplate = Hogan.compile(document.getElementById("miniCartSummaryTemplate").innerHTML);
- var miniCartSummaryRendered = miniCartSummaryTemplate.render(cart);
- $('#miniCartSummary').html(miniCartSummaryRendered);
-
-}
-
-function fullCart(cart) {
-
- var miniCartTemplate = Hogan.compile(document.getElementById("miniCartTemplate").innerHTML);
- var miniCartRendered = miniCartTemplate.render(cart);
- //log(miniCartRendered);
- $('#miniCartDetails').html(miniCartRendered);
-
-}
-
-
-
-
-
-function viewShoppingCartPage(){
- window.location.href=getContextPath() + '/shop/cart/shoppingCart.html';
-
-}
-
-
-function emptyCartObject() {
- var miniCart = new Object();
- miniCart.code=null;
- return miniCart
-}
-
-
-/** returns the cart code **/
-function getCartCode() {
-
- var cart = $.cookie('cart'); //should be [storecode_cartid]
- var code = new Array();
-
- if(cart!=null) {
- code = cart.split('_');
- if(code[0]==getMerchantStoreCode()) {
- return code[1];
- }
- }
-}
-
-function buildCartCode(code) {
- var cartCode = getMerchantStoreCode() + '_' + code;
- return cartCode;
-}
-
-function saveCart(code) {
- var cartCode = buildCartCode(code);
- $.cookie('cart',cartCode, { expires: 1024, path:'/' });
-}
-
-
+
+
+
+ $(function(){
+ initBindings();
+ initMiniCart();
+
+ });
+
+ function initMiniCart() {
+ var cartCode = getCartCode();
+ //log('Check for cart code ' + cartCode);
+ if(cartCode!=null) {
+ miniCart(cartCode);
+ } else {
+ //display empty cart
+ var emptyCart = emptyCartObject();
+ miniCartSummary(emptyCart);//mini cart summary empty
+ fullCart(emptyCart);//mini cart empty dropdown
+ }
+
+ }
+
+ function removeCart() {
+
+ var cartCode = getCartCode();
+ if(cartCode!=null) {
+ $.cookie('cart',null, { expires: 1, path:'/' });
+ }
+
+ }
+
+ function initBindings() {
+
+ /** add to cart **/
+ $(".addToCart").click(function(){
+ addToCart($(this).attr("productId"));
+ });
+
+ $("#open-cart").click(function(e) {
+ //nothing required
+ });
+
+ }
+
+ /**
+ * Function used for adding a product to the Shopping Cart
+ */
+ function addToCart(sku) {
+ showSMLoading('#pageContainer');
+ var qty = '#qty-productId-'+ sku;
+ var quantity = $(qty).val();
+ if(!quantity || quantity==null || quantity==0) {
+ quantity = 1;
+ }
+
+ var formId = '#input-' + sku;
+ //var $inputs = $(formId);
+ var $inputs = $(formId).find(':input');
+
+ var values = new Array();
+ if($inputs.length>0) {//check for attributes
+ i = 0;
+ $inputs.each(function() { //attributes
+ if($(this).hasClass('attribute')) {
+ //if($(this).hasClass('required') && !$(this).is(':checked')) {
+ // $(this).parent().css('border', '1px solid red');
+ //}
+ if($(this).is(':checkbox')) {
+ var checkboxSelected = $(this).is(':checked');
+ if(checkboxSelected==true) {
+ values[i] = $(this).val();
+ //console.log('checkbox ' + values[i]);
+ i++;
+ }
+
+ } else if ($(this).is(':radio')) {
+ var radioChecked = $(this).is(':checked');
+ if(radioChecked==true) {
+ values[i] = $(this).val();
+ //console.log('radio ' + values[i]);
+ i++;
+ }
+ } else {
+ if($(this).val()) {
+ values[i] = $(this).val();
+ //console.log('select ' + values[i]);
+ i++;
+ }
+ }
+ }
+ });
+ }
+
+ var cartCode = getCartCode();
+
+
+ /**
+ * shopping cart code identifier is <cart>_<storeId>
+ * need to check if the cookie is for the appropriate store
+ */
+
+ //cart item
+ var prefix = "{";
+ var suffix = "}";
+ var shoppingCartItem = '';
+
+ if(cartCode!=null && cartCode != '') {
+ shoppingCartItem = '"code":' + '"' + cartCode + '"'+',';
+ }
+ var shoppingCartItem = shoppingCartItem + '"quantity":' + quantity + ',';
+ var shoppingCartItem = shoppingCartItem + '"productId":' + sku;
+
+
+ var attributes = null;
+ //cart attributes
+ if(values.length>0) {
+ attributes = '[';
+ for (var i = 0; i < values.length; i++) {
+ var shoppingAttribute= prefix + '"attributeId":' + values[i] + suffix ;
+ if(values.length>1 && i < values.length-1){
+ shoppingAttribute = shoppingAttribute + ',';
+ }
+ attributes = attributes + shoppingAttribute;
+ }
+ attributes = attributes + ']';
+ }
+
+ if(attributes!=null) {
+ shoppingCartItem = shoppingCartItem + ',"shoppingCartAttributes":' + attributes;
+ }
+
+ var scItem = prefix + shoppingCartItem + suffix;
+
+ /** debug add to cart **/
+ //console.log(scItem);
+
+
+ $.ajax({
+ type: 'POST',
+ url: getContextPath() + '/shop/cart/addShoppingCartItem',
+ data: scItem,
+ contentType: 'application/json;charset=utf-8',
+ dataType: 'json',
+ cache:false,
+ error: function(e) {
+ log('Error while adding to cart');
+ //$('#pageContainer').hideLoading();
+ hideSMLoading('#pageContainer');
+
+ },
+ success: function(cart) {
+
+ saveCart(cart.code);
+
+ if(cart.message!=null) {
+ //TODO error message
+ log('Error while adding to cart ' + cart.message);
+ }
+
+ cleanupMiniCart();
+ miniCartSummary(cart);
+ fullCart(cart);
+
+ //$('#pageContainer').hideLoading();
+ hideSMLoading('#pageContainer');
+ }
+ });
+
+ }
+
+function removeLineItem(lineItemId){
+ $( "#shoppingCartRemoveLineitem_"+lineItemId).submit();
+}
+
+function updateLineItem(lineItemId,actionURL){
+ $("#shoppingCartLineitem_"+lineItemId).attr('action', actionURL);
+ $( "#shoppingCartLineitem_"+lineItemId).submit();
+}
+
+//update full cart
+function updateCart(cartDiv) {
+ $('.alert-error').hide();
+ $('.quantity').removeClass('required');
+ //$('#mainCartTable').showLoading();
+ hideSMLoading('#mainCartTable');
+ var inputs = $(cartDiv).find('.quantity');
+ var cartCode = getCartCode();
+ if(inputs !=null && cartCode!=null) {
+ var items = new Array();
+ for(var i = 0; i< inputs.length; i++) {
+ var item = new Object();
+ var qty = inputs[i].value;
+ if(qty =='' || qty<1) {
+ $('#' + inputs[i].id).addClass('required');
+ $('#mainCartTable').hideLoading();
+ return;
+ }
+ var id = inputs[i].id;
+
+ item.id = id;
+ item.quantity = qty;
+ item.code=cartCode;
+ items[i] = item;
+ }
+ //update cart
+ json_data = JSON.stringify(items);
+
+ $.ajax({
+ type: 'POST',
+ url: getContextPath() + '/shop/cart/updateShoppingCartItem.html',
+ data: json_data,
+ contentType: 'application/json;charset=utf-8',
+ dataType: 'json',
+ cache:false,
+ error: function(e) {
+ console.log('error ' + e);
+ //$('#mainCartTable').hideLoading();
+ hideSMLoading('#mainCartTable');
+ },
+ success: function(response) {
+ //$('#mainCartTable').hideLoading();
+ hideSMLoading('#mainCartTable');
+ if(response.response.status==-1) {
+ $('.alert-error').show();
+ } else {
+ location.href= getContextPath() + '/shop/cart/shoppingCart.html';
+ }
+ }
+ });
+
+ }
+}
+
+function miniCart(cartCode){
+
+ log('Display cart content');
+
+
+ $.ajax({
+ type: 'GET',
+ url: getContextPath() + '/shop/cart/displayMiniCartByCode?shoppingCartCode='+cartCode,
+ cache:false,
+ error: function(e) {
+ console.log('error ' + e);
+ //nothing
+
+ },
+ success: function(miniCart) {
+ log('Success ' + miniCart.code);
+
+ cleanupMiniCart();
+ miniCartSummary(miniCart);
+ fullCart(miniCart);
+
+
+ }
+ });
+}
+
+
+
+ /**
+ * JS function responsible for removing give line item from
+ * the Cart.
+ * For more details see MiniCartController.
+ *
+ * Controller will return JSON as response and it will be parsed to update
+ * mini-cart section.
+ * @param lineItemId
+ */
+function removeItemFromMinicart(lineItemId){
+
+ log('Removing ' + lineItemId);
+
+ shoppingCartCode = getCartCode();
+ $.ajax({
+ type: 'GET',
+ cache:false,
+ url: getContextPath() + '/shop/cart/removeMiniShoppingCartItem?lineItemId='+lineItemId + '&shoppingCartCode=' + shoppingCartCode,
+ error: function(e) {
+ console.log('error ' + e);
+
+ },
+ success: function(miniCart) {
+ log('Success remove item ' + miniCart);
+ miniCartSummary(miniCart);
+ fullCart(miniCart);
+
+ }
+ });
+}
+
+function displayMiniCartSummary(code){
+ $.ajax({
+ type: 'GET',
+ url: getContextPath() + '/shop/cart/displayMiniCartByCode?shoppingCartCode='+code,
+ error: function(e) {
+ // do nothing
+ console('error while getting cart');
+
+ },
+ success: function(cart) {
+ if(cart==null || cart=='') {
+ emptyCartLabel();
+ $.cookie('cart',null, { expires: 1, path:'/' });
+ } else {
+ displayTotals(cart);
+ }
+ }
+ });
+}
+
+function cleanupMiniCart() {
+ $('#miniCartDetails').html('');
+}
+
+function miniCartSummary(cart) {
+
+ var miniCartSummaryTemplate = Hogan.compile(document.getElementById("miniCartSummaryTemplate").innerHTML);
+ var miniCartSummaryRendered = miniCartSummaryTemplate.render(cart);
+ $('#miniCartSummary').html(miniCartSummaryRendered);
+
+}
+
+function fullCart(cart) {
+
+ var miniCartTemplate = Hogan.compile(document.getElementById("miniCartTemplate").innerHTML);
+ var miniCartRendered = miniCartTemplate.render(cart);
+ //log(miniCartRendered);
+ $('#miniCartDetails').html(miniCartRendered);
+
+}
+
+
+
+
+
+function viewShoppingCartPage(){
+ window.location.href=getContextPath() + '/shop/cart/shoppingCart.html';
+
+}
+
+
+function emptyCartObject() {
+ var miniCart = new Object();
+ miniCart.code=null;
+ return miniCart
+}
+
+
+/** returns the cart code **/
+function getCartCode() {
+
+ var cart = $.cookie('cart'); //should be [storecode_cartid]
+ var code = new Array();
+
+ if(cart!=null) {
+ code = cart.split('_');
+ if(code[0]==getMerchantStoreCode()) {
+ return code[1];
+ }
+ }
+}
+
+function buildCartCode(code) {
+ var cartCode = getMerchantStoreCode() + '_' + code;
+ return cartCode;
+}
+
+function saveCart(code) {
+ var cartCode = buildCartCode(code);
+ $.cookie('cart',cartCode, { expires: 1024, path:'/' });
+}
+
+
sm-shop/src/main/webapp/resources/js/shopping-cart.js 798(+399 -399)
diff --git a/sm-shop/src/main/webapp/resources/js/shopping-cart.js b/sm-shop/src/main/webapp/resources/js/shopping-cart.js
index f546c64..6972da2 100644
--- a/sm-shop/src/main/webapp/resources/js/shopping-cart.js
+++ b/sm-shop/src/main/webapp/resources/js/shopping-cart.js
@@ -1,399 +1,399 @@
-
-
-
- $(function(){
-
- initBindings();
- initMiniCart();
-
- });
-
- function initMiniCart() {
- var cartCode = getCartCode();
- log('Check for cart code ' + cartCode);
- if(cartCode!=null) {
- displayMiniCartSummary(cartCode);
- }
-
- }
-
- function removeCart() {
-
- var cartCode = getCartCode();
- if(cartCode!=null) {
- emptyCartLabel();
- $.cookie('cart',null, { expires: 1, path:'/' });
- }
-
- }
-
- function initBindings() {
-
- /** add to cart **/
- $(".addToCart").click(function(){
- addToCart($(this).attr("productId"));
- });
-
- $("#open-cart").click(function(e) {
- log('Open cart');
- displayMiniCart();
- });
-
- }
-
- /**
- * Function used for adding a product to the Shopping Cart
- */
- function addToCart(sku) {
- $('#pageContainer').showLoading();
- var qty = '#qty-productId-'+ sku;
- var quantity = $(qty).val();
- if(!quantity || quantity==null || quantity==0) {
- quantity = 1;
- }
-
- var formId = '#input-' + sku;
- //var $inputs = $(formId);
- var $inputs = $(formId).find(':input');
-
- var values = new Array();
- if($inputs.length>0) {//check for attributes
- i = 0;
- $inputs.each(function() { //attributes
- if($(this).hasClass('attribute')) {
- //if($(this).hasClass('required') && !$(this).is(':checked')) {
- // $(this).parent().css('border', '1px solid red');
- //}
- if($(this).is(':checkbox')) {
- var checkboxSelected = $(this).is(':checked');
- if(checkboxSelected==true) {
- values[i] = $(this).val();
- //console.log('checkbox ' + values[i]);
- i++;
- }
-
- } else if ($(this).is(':radio')) {
- var radioChecked = $(this).is(':checked');
- if(radioChecked==true) {
- values[i] = $(this).val();
- //console.log('radio ' + values[i]);
- i++;
- }
- } else {
- if($(this).val()) {
- values[i] = $(this).val();
- //console.log('select ' + values[i]);
- i++;
- }
- }
- }
- });
- }
-
- var cartCode = getCartCode();
-
-
- /**
- * shopping cart code identifier is <cart>_<storeId>
- * need to check if the cookie is for the appropriate store
- */
-
- //cart item
- var prefix = "{";
- var suffix = "}";
- var shoppingCartItem = '';
-
- if(cartCode!=null && cartCode != '') {
- shoppingCartItem = '"code":' + '"' + cartCode + '"'+',';
- }
- var shoppingCartItem = shoppingCartItem + '"quantity":' + quantity + ',';
- var shoppingCartItem = shoppingCartItem + '"productId":' + sku;
-
-
- var attributes = null;
- //cart attributes
- if(values.length>0) {
- attributes = '[';
- for (var i = 0; i < values.length; i++) {
- var shoppingAttribute= prefix + '"attributeId":' + values[i] + suffix ;
- if(values.length>1 && i < values.length-1){
- shoppingAttribute = shoppingAttribute + ',';
- }
- attributes = attributes + shoppingAttribute;
- }
- attributes = attributes + ']';
- }
-
- if(attributes!=null) {
- shoppingCartItem = shoppingCartItem + ',"shoppingCartAttributes":' + attributes;
- }
-
- var scItem = prefix + shoppingCartItem + suffix;
-
- /** debug add to cart **/
- //console.log(scItem);
-
-
- $.ajax({
- type: 'POST',
- url: getContextPath() + '/shop/cart/addShoppingCartItem',
- data: scItem,
- contentType: 'application/json;charset=utf-8',
- dataType: 'json',
- cache:false,
- error: function(e) {
- log('Error while adding to cart');
- $('#pageContainer').hideLoading();
-
- },
- success: function(cart) {
-
- saveCart(cart.code);
-
- if(cart.message!=null) {
- //TODO error message
- log('Error while adding to cart ' + cart.message);
- }
-
- displayShoppigCartItems(cart,'#shoppingcartProducts');
- displayTotals(cart);
- $('#pageContainer').hideLoading();
- }
- });
-
- }
-
-function removeLineItem(lineItemId){
- $( "#shoppingCartRemoveLineitem_"+lineItemId).submit();
-}
-
-function updateLineItem(lineItemId,actionURL){
- $("#shoppingCartLineitem_"+lineItemId).attr('action', actionURL);
- $( "#shoppingCartLineitem_"+lineItemId).submit();
-}
-
-//update full cart
-function updateCart(cartDiv) {
- $('.alert-error').hide();
- $('.quantity').removeClass('required');
- $('#mainCartTable').showLoading();
- var inputs = $(cartDiv).find('.quantity');
- var cartCode = getCartCode();
- if(inputs !=null && cartCode!=null) {
- var items = new Array();
- for(var i = 0; i< inputs.length; i++) {
- var item = new Object();
- var qty = inputs[i].value;
- if(qty =='' || qty<1) {
- $('#' + inputs[i].id).addClass('required');
- $('#mainCartTable').hideLoading();
- return;
- }
- var id = inputs[i].id;
-
- item.id = id;
- item.quantity = qty;
- item.code=cartCode;
- items[i] = item;
- }
- //update cart
- json_data = JSON.stringify(items);
-
- $.ajax({
- type: 'POST',
- url: getContextPath() + '/shop/cart/updateShoppingCartItem.html',
- data: json_data,
- contentType: 'application/json;charset=utf-8',
- dataType: 'json',
- cache:false,
- error: function(e) {
- console.log('error ' + e);
- $('#mainCartTable').hideLoading();
- },
- success: function(response) {
- $('#mainCartTable').hideLoading();
- if(response.response.status==-1) {
- $('.alert-error').show();
- } else {
- location.href= getContextPath() + '/shop/cart/shoppingCart.html';
- }
- }
- });
-
- }
-}
-
-function displayMiniCart(){
- var cartCode = getCartCode();
-
- log('Display cart content');
-
-
-
-
- $('#shoppingcartProducts').html('');
- $('#cart-box').addClass('loading-indicator-overlay');/** manage manually cart loading**/
- $('#cartShowLoading').show();
-
- $.ajax({
- type: 'GET',
- url: getContextPath() + '/shop/cart/displayMiniCartByCode?shoppingCartCode='+cartCode,
- cache:false,
- error: function(e) {
- $('#cart-box').removeClass('loading-indicator-overlay');/** manage manually cart loading**/
- $('#cartShowLoading').hide();
- console.log('error ' + e);
- //nothing
-
- },
- success: function(miniCart) {
- //if($.isEmptyObject(miniCart)){
- if(miniCart.code=null) {
- emptyCartLabel();
- }
- else{
- displayShoppigCartItems(miniCart,'#shoppingcartProducts');//cart content
- displayTotals(miniCart);//header
- }
- $('#cart-box').removeClass('loading-indicator-overlay');/** manage manually cart loading**/
- $('#cartShowLoading').hide();
- }
- });
-}
-
-
-
- /**
- * JS function responsible for removing give line item from
- * the Cart.
- * For more details see MiniCartController.
- *
- * Controller will return JSON as response and it will be parsed to update
- * mini-cart section.
- * @param lineItemId
- */
-function removeItemFromMinicart(lineItemId){
-
- shoppingCartCode = getCartCode();
- $.ajax({
- type: 'GET',
- cache:false,
- url: getContextPath() + '/shop/cart/removeMiniShoppingCartItem?lineItemId='+lineItemId + '&shoppingCartCode=' + shoppingCartCode,
- error: function(e) {
- console.log('error ' + e);
-
- },
- success: function(miniCart) {
- if(miniCart==null) {
- emptyCartLabel();
- } else {
- if(miniCart.shoppingCartItems!=null) {
- displayShoppigCartItems(miniCart,'#shoppingcartProducts');
- displayTotals(miniCart);
- } else {
- emptyCartLabel();
- }
- }
- }
- });
-}
-
-function displayMiniCartSummary(code){
- $.ajax({
- type: 'GET',
- url: getContextPath() + '/shop/cart/displayMiniCartByCode?shoppingCartCode='+code,
- error: function(e) {
- // do nothing
- console('error while getting cart');
-
- },
- success: function(cart) {
- if(cart==null || cart=='') {
- emptyCartLabel();
- $.cookie('cart',null, { expires: 1, path:'/' });
- } else {
- displayTotals(cart);
- }
- }
- });
-}
-
-
-
-
-
-function viewShoppingCartPage(){
- window.location.href=getContextPath() + '/shop/cart/shoppingCart.html';
-
-}
-
-
-function displayShoppigCartItems(cart, div) {
-
-
- //set cart contextPath
- cart.contextPath=getContextPath();
- var template = Hogan.compile(document.getElementById("miniShoppingCartTemplate").innerHTML);
-
-
- $(div).html('');
- if(cart.shoppingCartItems==null) {
- emptyCartLabel();
- return;
- }
-
- $('#cartMessage').hide();
- $('#shoppingcart').show();
-
- //call template defined in template directory
- $(div).append(template.render(cart));
-
-
-}
-
-function displayTotals(cart) {
- if(cart.quantity==0) {
- emptyCartLabel();
- } else {
- cartInfoLabel(cart);
- $('#total-box').html(cartSubTotal(cart));
- }
-
-
-}
-
-function emptyCartLabel(){
- log('Display empty cart');
- $("#cartMessage").html(getEmptyCartLabel());
- var labelItem = getItemLabel(0);
- $("#cartinfo").html('<span id="cartqty">(' + 0 + ' ' + labelItem + ')</span> <span id="cartprice"></span>');
- $('#shoppingcart').hide();
- $('#cartMessage').show();
-}
-
-
-/** returns the cart code **/
-function getCartCode() {
-
- var cart = $.cookie('cart'); //should be [storecode_cartid]
- var code = new Array();
-
- if(cart!=null) {
- code = cart.split('_');
- if(code[0]==getMerchantStoreCode()) {
- return code[1];
- }
- }
-}
-
-function buildCartCode(code) {
- var cartCode = getMerchantStoreCode() + '_' + code;
- return cartCode;
-}
-
-function saveCart(code) {
- var cartCode = buildCartCode(code);
- $.cookie('cart',cartCode, { expires: 1024, path:'/' });
-}
-
-
+
+
+
+ $(function(){
+
+ initBindings();
+ initMiniCart();
+
+ });
+
+ function initMiniCart() {
+ var cartCode = getCartCode();
+ log('Check for cart code ' + cartCode);
+ if(cartCode!=null) {
+ displayMiniCartSummary(cartCode);
+ }
+
+ }
+
+ function removeCart() {
+
+ var cartCode = getCartCode();
+ if(cartCode!=null) {
+ emptyCartLabel();
+ $.cookie('cart',null, { expires: 1, path:'/' });
+ }
+
+ }
+
+ function initBindings() {
+
+ /** add to cart **/
+ $(".addToCart").click(function(){
+ addToCart($(this).attr("productId"));
+ });
+
+ $("#open-cart").click(function(e) {
+ log('Open cart');
+ displayMiniCart();
+ });
+
+ }
+
+ /**
+ * Function used for adding a product to the Shopping Cart
+ */
+ function addToCart(sku) {
+ $('#pageContainer').showLoading();
+ var qty = '#qty-productId-'+ sku;
+ var quantity = $(qty).val();
+ if(!quantity || quantity==null || quantity==0) {
+ quantity = 1;
+ }
+
+ var formId = '#input-' + sku;
+ //var $inputs = $(formId);
+ var $inputs = $(formId).find(':input');
+
+ var values = new Array();
+ if($inputs.length>0) {//check for attributes
+ i = 0;
+ $inputs.each(function() { //attributes
+ if($(this).hasClass('attribute')) {
+ //if($(this).hasClass('required') && !$(this).is(':checked')) {
+ // $(this).parent().css('border', '1px solid red');
+ //}
+ if($(this).is(':checkbox')) {
+ var checkboxSelected = $(this).is(':checked');
+ if(checkboxSelected==true) {
+ values[i] = $(this).val();
+ //console.log('checkbox ' + values[i]);
+ i++;
+ }
+
+ } else if ($(this).is(':radio')) {
+ var radioChecked = $(this).is(':checked');
+ if(radioChecked==true) {
+ values[i] = $(this).val();
+ //console.log('radio ' + values[i]);
+ i++;
+ }
+ } else {
+ if($(this).val()) {
+ values[i] = $(this).val();
+ //console.log('select ' + values[i]);
+ i++;
+ }
+ }
+ }
+ });
+ }
+
+ var cartCode = getCartCode();
+
+
+ /**
+ * shopping cart code identifier is <cart>_<storeId>
+ * need to check if the cookie is for the appropriate store
+ */
+
+ //cart item
+ var prefix = "{";
+ var suffix = "}";
+ var shoppingCartItem = '';
+
+ if(cartCode!=null && cartCode != '') {
+ shoppingCartItem = '"code":' + '"' + cartCode + '"'+',';
+ }
+ var shoppingCartItem = shoppingCartItem + '"quantity":' + quantity + ',';
+ var shoppingCartItem = shoppingCartItem + '"productId":' + sku;
+
+
+ var attributes = null;
+ //cart attributes
+ if(values.length>0) {
+ attributes = '[';
+ for (var i = 0; i < values.length; i++) {
+ var shoppingAttribute= prefix + '"attributeId":' + values[i] + suffix ;
+ if(values.length>1 && i < values.length-1){
+ shoppingAttribute = shoppingAttribute + ',';
+ }
+ attributes = attributes + shoppingAttribute;
+ }
+ attributes = attributes + ']';
+ }
+
+ if(attributes!=null) {
+ shoppingCartItem = shoppingCartItem + ',"shoppingCartAttributes":' + attributes;
+ }
+
+ var scItem = prefix + shoppingCartItem + suffix;
+
+ /** debug add to cart **/
+ //console.log(scItem);
+
+
+ $.ajax({
+ type: 'POST',
+ url: getContextPath() + '/shop/cart/addShoppingCartItem',
+ data: scItem,
+ contentType: 'application/json;charset=utf-8',
+ dataType: 'json',
+ cache:false,
+ error: function(e) {
+ log('Error while adding to cart');
+ $('#pageContainer').hideLoading();
+
+ },
+ success: function(cart) {
+
+ saveCart(cart.code);
+
+ if(cart.message!=null) {
+ //TODO error message
+ log('Error while adding to cart ' + cart.message);
+ }
+
+ displayShoppigCartItems(cart,'#shoppingcartProducts');
+ displayTotals(cart);
+ $('#pageContainer').hideLoading();
+ }
+ });
+
+ }
+
+function removeLineItem(lineItemId){
+ $( "#shoppingCartRemoveLineitem_"+lineItemId).submit();
+}
+
+function updateLineItem(lineItemId,actionURL){
+ $("#shoppingCartLineitem_"+lineItemId).attr('action', actionURL);
+ $( "#shoppingCartLineitem_"+lineItemId).submit();
+}
+
+//update full cart
+function updateCart(cartDiv) {
+ $('.alert-error').hide();
+ $('.quantity').removeClass('required');
+ $('#mainCartTable').showLoading();
+ var inputs = $(cartDiv).find('.quantity');
+ var cartCode = getCartCode();
+ if(inputs !=null && cartCode!=null) {
+ var items = new Array();
+ for(var i = 0; i< inputs.length; i++) {
+ var item = new Object();
+ var qty = inputs[i].value;
+ if(qty =='' || qty<1) {
+ $('#' + inputs[i].id).addClass('required');
+ $('#mainCartTable').hideLoading();
+ return;
+ }
+ var id = inputs[i].id;
+
+ item.id = id;
+ item.quantity = qty;
+ item.code=cartCode;
+ items[i] = item;
+ }
+ //update cart
+ json_data = JSON.stringify(items);
+
+ $.ajax({
+ type: 'POST',
+ url: getContextPath() + '/shop/cart/updateShoppingCartItem.html',
+ data: json_data,
+ contentType: 'application/json;charset=utf-8',
+ dataType: 'json',
+ cache:false,
+ error: function(e) {
+ console.log('error ' + e);
+ $('#mainCartTable').hideLoading();
+ },
+ success: function(response) {
+ $('#mainCartTable').hideLoading();
+ if(response.response.status==-1) {
+ $('.alert-error').show();
+ } else {
+ location.href= getContextPath() + '/shop/cart/shoppingCart.html';
+ }
+ }
+ });
+
+ }
+}
+
+function displayMiniCart(){
+ var cartCode = getCartCode();
+
+ log('Display cart content');
+
+
+
+
+ $('#shoppingcartProducts').html('');
+ $('#cart-box').addClass('loading-indicator-overlay');/** manage manually cart loading**/
+ $('#cartShowLoading').show();
+
+ $.ajax({
+ type: 'GET',
+ url: getContextPath() + '/shop/cart/displayMiniCartByCode?shoppingCartCode='+cartCode,
+ cache:false,
+ error: function(e) {
+ $('#cart-box').removeClass('loading-indicator-overlay');/** manage manually cart loading**/
+ $('#cartShowLoading').hide();
+ console.log('error ' + e);
+ //nothing
+
+ },
+ success: function(miniCart) {
+ //if($.isEmptyObject(miniCart)){
+ if(miniCart.code=null) {
+ emptyCartLabel();
+ }
+ else{
+ displayShoppigCartItems(miniCart,'#shoppingcartProducts');//cart content
+ displayTotals(miniCart);//header
+ }
+ $('#cart-box').removeClass('loading-indicator-overlay');/** manage manually cart loading**/
+ $('#cartShowLoading').hide();
+ }
+ });
+}
+
+
+
+ /**
+ * JS function responsible for removing give line item from
+ * the Cart.
+ * For more details see MiniCartController.
+ *
+ * Controller will return JSON as response and it will be parsed to update
+ * mini-cart section.
+ * @param lineItemId
+ */
+function removeItemFromMinicart(lineItemId){
+
+ shoppingCartCode = getCartCode();
+ $.ajax({
+ type: 'GET',
+ cache:false,
+ url: getContextPath() + '/shop/cart/removeMiniShoppingCartItem?lineItemId='+lineItemId + '&shoppingCartCode=' + shoppingCartCode,
+ error: function(e) {
+ console.log('error ' + e);
+
+ },
+ success: function(miniCart) {
+ if(miniCart==null) {
+ emptyCartLabel();
+ } else {
+ if(miniCart.shoppingCartItems!=null) {
+ displayShoppigCartItems(miniCart,'#shoppingcartProducts');
+ displayTotals(miniCart);
+ } else {
+ emptyCartLabel();
+ }
+ }
+ }
+ });
+}
+
+function displayMiniCartSummary(code){
+ $.ajax({
+ type: 'GET',
+ url: getContextPath() + '/shop/cart/displayMiniCartByCode?shoppingCartCode='+code,
+ error: function(e) {
+ // do nothing
+ console('error while getting cart');
+
+ },
+ success: function(cart) {
+ if(cart==null || cart=='') {
+ emptyCartLabel();
+ $.cookie('cart',null, { expires: 1, path:'/' });
+ } else {
+ displayTotals(cart);
+ }
+ }
+ });
+}
+
+
+
+
+
+function viewShoppingCartPage(){
+ window.location.href=getContextPath() + '/shop/cart/shoppingCart.html';
+
+}
+
+
+function displayShoppigCartItems(cart, div) {
+
+
+ //set cart contextPath
+ cart.contextPath=getContextPath();
+ var template = Hogan.compile(document.getElementById("miniShoppingCartTemplate").innerHTML);
+
+
+ $(div).html('');
+ if(cart.shoppingCartItems==null) {
+ emptyCartLabel();
+ return;
+ }
+
+ $('#cartMessage').hide();
+ $('#shoppingcart').show();
+
+ //call template defined in template directory
+ $(div).append(template.render(cart));
+
+
+}
+
+function displayTotals(cart) {
+ if(cart.quantity==0) {
+ emptyCartLabel();
+ } else {
+ cartInfoLabel(cart);
+ $('#total-box').html(cartSubTotal(cart));
+ }
+
+
+}
+
+function emptyCartLabel(){
+ log('Display empty cart');
+ $("#cartMessage").html(getEmptyCartLabel());
+ var labelItem = getItemLabel(0);
+ $("#cartinfo").html('<span id="cartqty">(' + 0 + ' ' + labelItem + ')</span> <span id="cartprice"></span>');
+ $('#shoppingcart').hide();
+ $('#cartMessage').show();
+}
+
+
+/** returns the cart code **/
+function getCartCode() {
+
+ var cart = $.cookie('cart'); //should be [storecode_cartid]
+ var code = new Array();
+
+ if(cart!=null) {
+ code = cart.split('_');
+ if(code[0]==getMerchantStoreCode()) {
+ return code[1];
+ }
+ }
+}
+
+function buildCartCode(code) {
+ var cartCode = getMerchantStoreCode() + '_' + code;
+ return cartCode;
+}
+
+function saveCart(code) {
+ var cartCode = buildCartCode(code);
+ $.cookie('cart',cartCode, { expires: 1024, path:'/' });
+}
+
+
diff --git a/sm-shop/src/main/webapp/resources/smart-client/components/components/backButton.html b/sm-shop/src/main/webapp/resources/smart-client/components/components/backButton.html
index a3d890a..f76ba95 100644
--- a/sm-shop/src/main/webapp/resources/smart-client/components/components/backButton.html
+++ b/sm-shop/src/main/webapp/resources/smart-client/components/components/backButton.html
@@ -1,116 +1,116 @@
-<HTML><HEAD>
- <SCRIPT>var isomorphicDir="../../isomorphic/";</SCRIPT>
- <SCRIPT SRC=../../isomorphic/system/modules/ISC_History.js></SCRIPT>
- <SCRIPT SRC=../../isomorphic/system/modules/ISC_Core.js></SCRIPT>
- <SCRIPT SRC=../../isomorphic/system/modules/ISC_Foundation.js></SCRIPT>
- <SCRIPT SRC=../../isomorphic/system/modules/ISC_Containers.js></SCRIPT>
- <SCRIPT SRC=../../isomorphic/system/modules/ISC_Grids.js></SCRIPT>
- <SCRIPT SRC=../../isomorphic/system/modules/ISC_Forms.js></SCRIPT>
- <SCRIPT SRC=../../isomorphic/system/modules/ISC_DataBinding.js></SCRIPT>
- <SCRIPT SRC=../../isomorphic/skins/SmartClient/load_skin.js></SCRIPT>
-</HEAD><BODY BGCOLOR='papayawhip' MARGINHEIGHT=0 MARGINWIDTH=0 LEFTMARGIN=0 TOPMARGIN=0>
-<TABLE WIDTH=100% CELLSPACING=0 CELLPADDING=5 BORDER=0><TR><TD CLASS=pageHeader BGCOLOR=WHITE>
-
- TabSet initialization example
-
-</TD><TD CLASS=pageHeader ALIGN=RIGHT BGCOLOR=WHITE>
-
- Isomorphic SmartClient SDK
-
-</TD></TR></TABLE><TABLE WIDTH=100% CELLSPACING=0 CELLPADDING=0 BORDER=0><TR>
-<TD BGCOLOR=336666><IMG SRC=images/blank.gif WIDTH=1 HEIGHT=4></TD></TR></TABLE>
-
-
-<!--------------------------
- Example code starts here
----------------------------->
-
-<SCRIPT>
-
-DynamicForm.create({
- ID:"pane1",
- autoDraw:false,
- titleOrientation:"top",
- itemChange : function () {
- Page.setUnloadMessage("Exiting the page now will lose changes");
- },
- fields:[
- {name:"firstName", title:"First Name"},
- {name:"lastName", title:"Last Name"}
- ]
-});
-
-DynamicForm.create({
- ID:"pane2",
- autoDraw:false,
- titleOrientation:"top",
- itemChange : function () {
- Page.setUnloadMessage("Exiting the page now will lose changes");
- },
- fields:[
- {name:"officeNumber", title:"Office Number"},
- {name:"mobileNumber", title:"Mobile Number"}
- ]
-});
-
-DynamicForm.create({
- ID:"pane3",
- autoDraw:false,
- titleOrientation:"top",
- itemChange : function () {
- Page.setUnloadMessage("Exiting the page now will lose changes");
- },
- fields:[
- {name:"address", title:"Street Address"},
- {name:"city", title:"City"},
- {name:"state", title:"State"},
- {name:"zip", title:"Zip"}
- ]
-});
-
-
-// whenever history is navigated, call this callback
-isc.History.registerCallback("historyCallback(id)");
-
-// on page load, restore tabset state
-isc.Page.setEvent("load", "restoreTabSetState()");
-
-function restoreTabSetState() {
- isc.Log.logWarn("restoring state");
- // if we have history state, our callback will fire. Otherwise, we need to inspect the URL
- // to see if there's history ID in there - this is what happens when the user bookmarks one
- // of the history URLs, closes the browser, opens a new one and then navigates to the bookmark.
- if (!isc.History.haveHistoryState()) {
- tabSet.jumpToTab(isc.History.getCurrentHistoryId() || 0);
- }
-}
-
-function historyCallback(id) {
- // the id is the tabNum and null is initial state - which is the first tab.
- tabSet.jumpToTab(id == null ? 0 : id);
-}
-
-TabSet.create({
- ID:"tabSet",
- top:50,
- left:50,
- width:600,
- height:400,
- rememberHistory : true,
- jumpToTab : function (tabNum) {
- this.noHistory = true;
- // convert string to number
- this.selectTab(new Number(tabNum));
- this.noHistory = false;
- },
- tabSelected : function (tabNum) {
- if (!this.noHistory && isc.Page.isLoaded()) isc.History.addHistoryEntry(tabNum);
- },
- tabs:[{title:"red", pane:pane1, width:70},
- {title:"green", pane:pane2, width:70},
- {title:"blue", pane:pane3, width:70}]
-});
-
-</SCRIPT>
-</BODY>
-</HTML>
+<HTML><HEAD>
+ <SCRIPT>var isomorphicDir="../../isomorphic/";</SCRIPT>
+ <SCRIPT SRC=../../isomorphic/system/modules/ISC_History.js></SCRIPT>
+ <SCRIPT SRC=../../isomorphic/system/modules/ISC_Core.js></SCRIPT>
+ <SCRIPT SRC=../../isomorphic/system/modules/ISC_Foundation.js></SCRIPT>
+ <SCRIPT SRC=../../isomorphic/system/modules/ISC_Containers.js></SCRIPT>
+ <SCRIPT SRC=../../isomorphic/system/modules/ISC_Grids.js></SCRIPT>
+ <SCRIPT SRC=../../isomorphic/system/modules/ISC_Forms.js></SCRIPT>
+ <SCRIPT SRC=../../isomorphic/system/modules/ISC_DataBinding.js></SCRIPT>
+ <SCRIPT SRC=../../isomorphic/skins/SmartClient/load_skin.js></SCRIPT>
+</HEAD><BODY BGCOLOR='papayawhip' MARGINHEIGHT=0 MARGINWIDTH=0 LEFTMARGIN=0 TOPMARGIN=0>
+<TABLE WIDTH=100% CELLSPACING=0 CELLPADDING=5 BORDER=0><TR><TD CLASS=pageHeader BGCOLOR=WHITE>
+
+ TabSet initialization example
+
+</TD><TD CLASS=pageHeader ALIGN=RIGHT BGCOLOR=WHITE>
+
+ Isomorphic SmartClient SDK
+
+</TD></TR></TABLE><TABLE WIDTH=100% CELLSPACING=0 CELLPADDING=0 BORDER=0><TR>
+<TD BGCOLOR=336666><IMG SRC=images/blank.gif WIDTH=1 HEIGHT=4></TD></TR></TABLE>
+
+
+<!--------------------------
+ Example code starts here
+---------------------------->
+
+<SCRIPT>
+
+DynamicForm.create({
+ ID:"pane1",
+ autoDraw:false,
+ titleOrientation:"top",
+ itemChange : function () {
+ Page.setUnloadMessage("Exiting the page now will lose changes");
+ },
+ fields:[
+ {name:"firstName", title:"First Name"},
+ {name:"lastName", title:"Last Name"}
+ ]
+});
+
+DynamicForm.create({
+ ID:"pane2",
+ autoDraw:false,
+ titleOrientation:"top",
+ itemChange : function () {
+ Page.setUnloadMessage("Exiting the page now will lose changes");
+ },
+ fields:[
+ {name:"officeNumber", title:"Office Number"},
+ {name:"mobileNumber", title:"Mobile Number"}
+ ]
+});
+
+DynamicForm.create({
+ ID:"pane3",
+ autoDraw:false,
+ titleOrientation:"top",
+ itemChange : function () {
+ Page.setUnloadMessage("Exiting the page now will lose changes");
+ },
+ fields:[
+ {name:"address", title:"Street Address"},
+ {name:"city", title:"City"},
+ {name:"state", title:"State"},
+ {name:"zip", title:"Zip"}
+ ]
+});
+
+
+// whenever history is navigated, call this callback
+isc.History.registerCallback("historyCallback(id)");
+
+// on page load, restore tabset state
+isc.Page.setEvent("load", "restoreTabSetState()");
+
+function restoreTabSetState() {
+ isc.Log.logWarn("restoring state");
+ // if we have history state, our callback will fire. Otherwise, we need to inspect the URL
+ // to see if there's history ID in there - this is what happens when the user bookmarks one
+ // of the history URLs, closes the browser, opens a new one and then navigates to the bookmark.
+ if (!isc.History.haveHistoryState()) {
+ tabSet.jumpToTab(isc.History.getCurrentHistoryId() || 0);
+ }
+}
+
+function historyCallback(id) {
+ // the id is the tabNum and null is initial state - which is the first tab.
+ tabSet.jumpToTab(id == null ? 0 : id);
+}
+
+TabSet.create({
+ ID:"tabSet",
+ top:50,
+ left:50,
+ width:600,
+ height:400,
+ rememberHistory : true,
+ jumpToTab : function (tabNum) {
+ this.noHistory = true;
+ // convert string to number
+ this.selectTab(new Number(tabNum));
+ this.noHistory = false;
+ },
+ tabSelected : function (tabNum) {
+ if (!this.noHistory && isc.Page.isLoaded()) isc.History.addHistoryEntry(tabNum);
+ },
+ tabs:[{title:"red", pane:pane1, width:70},
+ {title:"green", pane:pane2, width:70},
+ {title:"blue", pane:pane3, width:70}]
+});
+
+</SCRIPT>
+</BODY>
+</HTML>
diff --git a/sm-shop/src/main/webapp/resources/smart-client/skins/Enterprise/load_skin.js b/sm-shop/src/main/webapp/resources/smart-client/skins/Enterprise/load_skin.js
index ffb8cab..9a4cf20 100644
--- a/sm-shop/src/main/webapp/resources/smart-client/skins/Enterprise/load_skin.js
+++ b/sm-shop/src/main/webapp/resources/smart-client/skins/Enterprise/load_skin.js
@@ -1,995 +1,995 @@
-isc.loadSkin = function (theWindow) {
-if (theWindow == null) theWindow = window;
-with (theWindow) {
-
-
-//----------------------------------------
-// Specify skin directory
-//----------------------------------------
- // must be relative to your application file or isomorphicDir
- isc.Page.setSkinDir("[ISOMORPHIC]/skins/Enterprise/")
-
-
-//----------------------------------------
-// Load skin style sheet(s)
-//----------------------------------------
- isc.Page.loadStyleSheet("[SKIN]/skin_styles.css", theWindow)
-
-
-
-//============================================================
-// Component Skinning
-//============================================================
-// 1) Scrollbars
-// 2) Buttons
-// 3) Resizebars
-// 4) Sections
-// 5) Progressbars
-// 6) TabSets
-// 7) Windows
-// 8) Dialogs
-// 9) Pickers
-// 10) Menus
-// 11) Hovers
-// 12) ListGrids
-// 13) TreeGrids
-// 14) Form controls
-// 15) Drag & Drop
-// 16) Edges
-// 17) Sliders
-// 18) TileList
-// 19) CubeGrid
-// 20) FilterBuilder
-// 21) Printing
-// 22) ToolStrip
-//============================================================
-
-
- isc.Canvas.addProperties({
- groupBorderCSS: "1px solid #A7ABB4"
- });
-
- if(isc.Browser.isIE && isc.Browser.version >= 7) {
- isc.Canvas.setAllowExternalFilters(false);
- isc.Canvas.setNeverUseFilters(true);
- if(isc.Window) {
- isc.Window.addProperties({
- modalMaskOpacity:null,
- modalMaskStyle:"normal"
- });
- isc.Window.changeDefaults("modalMaskDefaults", { src : "[SKIN]opacity.png" });
- }
- }
-
- if(isc.RPCManager) {
- isc.RPCManager.addClassProperties({ promptStyle:"cursor" });
- }
-
-//----------------------------------------
-// 1) Scrollbars
-//----------------------------------------
- isc.Canvas.addProperties({
- showCustomScrollbars:true,
- scrollbarSize:16,
- cornerSize: 16
- })
- isc.ScrollThumb.addProperties({
- capSize:2,
- vSrc:"[SKIN]vthumb.png",
- hSrc:"[SKIN]hthumb.png",
- showGrip:true,
- gripLength:10,
- gripBreadth:10,
- showRollOver: true,
- //showDown: true,
- backgroundColor:"transparent"
- })
- isc.Scrollbar.addProperties({
- btnSize:18,
- showRollOver:true,
- //showDown: true,
- thumbMinSize:20,
- thumbInset:0,
- thumbOverlap:2,
- backgroundColor:"#FFFFFF",
- vSrc:"[SKIN]vscroll.png",
- hSrc:"[SKIN]hscroll.png"
- })
-
-
-//----------------------------------------
-// 2) Buttons
-//----------------------------------------
-
- // "IButton" is the new standard button class for SmartClient applications. Application
- // code should use IButton instead of Button for all standalone buttons. Other skins may
- // map IButton directly to Button, so this single class will work everywhere. Button remains
- // for internal and advanced uses (eg if you need to mix both CSS-based and image-based
- // standalone buttons in the same application).
- isc.defineClass("IButton", "StretchImgButton").addProperties({
- src:"[SKIN]button/button.png",
- height:22,
- width:100,
- capSize:4,
- vertical:false,
- titleStyle:"buttonTitle",
- showFocused:true,
- showFocusedAsOver:true
- });
- if (isc.IButton.markAsFrameworkClass != null) isc.IButton.markAsFrameworkClass();
-
- isc.defineClass("IAutoFitButton", "IButton").addProperties({
- autoFit: true,
- autoFitDirection: isc.Canvas.HORIZONTAL
- });
- if (isc.IAutoFitButton.markAsFrameworkClass != null) isc.IAutoFitButton.markAsFrameworkClass();
-
-
- isc.ImgButton.addProperties({
- showFocused: true,
- showFocusedAsOver:true
-
- });
-
- isc.defineClass("HeaderImgButton", "ImgButton").addProperties({
- showFocused: false,
- showRollOver:false,
- showFocusedAsOver: false,
- showDown:false
- });
-
- isc.Button.addProperties({
- height:22,
- showFocused: true,
- showFocusedAsOver: false
- });
-
- isc.Label.addProperties({
- showFocused: false
- });
-
-
-
-//----------------------------------------
-// 3) Resizebars
-//----------------------------------------
- // StretchImgSplitbar class renders as resize bar with
- // end caps, body, grip
- isc.StretchImgSplitbar.addProperties({
- // modify vSrc / hSrc for custom appearance
- //vSrc:"[SKIN]vsplit.gif",
- //hSrc:"[SKIN]hsplit.gif",
- capSize:10,
- showGrip:true
- })
-
- // ImgSplitbar renders as resizebar with resize grip only
- isc.ImgSplitbar.addProperties({
- // modify these properties for custom appearance
- //vSrc:"[SKIN]vgrip.png",
- //hSrc:"[SKIN]hgrip.png",
- //showDown:true,
- //styleName:"splitbar"
- })
-
- isc.Snapbar.addProperties({
- vSrc:"[SKIN]vsplit.png",
- hSrc:"[SKIN]hsplit.png",
- baseStyle:"splitbar",
- /*items : [
- {name:"blank", width:"capSize", height:"capSize"},
- {name:"blank", width:"*", height:"*"},
- {name:"blank", width:"capSize", height:"capSize"}
- ],*/
- items : [
- {name:"bg", width:"*", height:"*"}
- ],
- showDownGrip:false,
- showClosedGrip:false,
- showRollOver:false,
- showDown:false,
- gripBreadth:3,
- gripLength:20
- //capSize:8
- })
-
- isc.Layout.addProperties({
- resizeBarSize:5,
- // Use the Snapbar as a resizeBar by default - subclass of Splitbar that
- // shows interactive (closed/open) grip images
- // Other options include the Splitbar, StretchImgSplitbar or ImgSplitbar
- resizeBarClass:"Snapbar"
- })
-
-
-//----------------------------------------
-// 4) Sections
-//----------------------------------------
- if (isc.SectionItem) {
- isc.SectionItem.addProperties({
- sectionHeaderClass:"ImgSectionHeader",
- height:26
- })
- }
- if (isc.SectionStack) {
-
- isc.SectionStack.addProperties({
- backgroundColor:null,
- sectionHeaderClass:"ImgSectionHeader",
- headerHeight:26
- })
- isc.ImgSectionHeader.changeDefaults("backgroundDefaults", {
- showRollOver:false,
- showDown:false,
- showDisabledIcon:false,
- showRollOverIcon:false,
- src:"[SKIN]SectionHeader/header.png",
- icon:"[SKIN]SectionHeader/opener.png",
- iconSize: 16,
- capSize:2,
- titleStyle:"imgSectionHeaderTitle",
- baseStyle:"imgSectionHeader",
- backgroundColor:"transparent"
- })
- isc.SectionHeader.addProperties({
- icon:"[SKIN]SectionHeader/opener.png",
- iconSize: 16
- })
- }
-
-
-//----------------------------------------
-// 5) Progressbars
-//----------------------------------------
- if (isc.Progressbar) {
- isc.Progressbar.addProperties({
- horizontalItems: [
- {name:"h_start",size:2},
- {name:"h_stretch",size:0},
- {name:"h_end",size:2},
- {name:"h_empty_start",size:2},
- {name:"h_empty_stretch",size:0},
- {name:"h_empty_end",size:2}
- ],
- verticalItems: [
- {name:"v_empty_start",size:2},
- {name:"v_empty_stretch",size:0},
- {name:"v_empty_end",size:0},
- {name:"v_start",size:2},
- {name:"v_stretch",size:0},
- {name:"v_end",size:2}
- ],
- breadth:24,
- length : 300
- })
- }
-
-
-//----------------------------------------
-// 6) TabSets
-//----------------------------------------
- if (isc.TabSet) {
- isc.TabSet.addProperties({
- tabBarThickness:24,
- scrollerButtonSize:19,
- pickerButtonSize:20,
-
- symmetricScroller:false,
- symmetricPickerButton:false,
-
- scrollerSrc:"[SKIN]scroll.png",
- pickerButtonSrc:"[SKIN]picker.png",
-
- closeTabIconSize:10,
-
- showEdges:false,
- paneContainerClassName:"tabSetContainer",
-
- paneMargin:5,
-
- showScrollerRollOver: false
- });
- isc.TabSet.changeDefaults("paneContainerDefaults", {
- showEdges:false
- })
- isc.TabBar.addProperties({
- membersMargin:1,
-
- // keep the tabs from reaching the curved edge of the pane (regardless of align)
- layoutStartMargin:5,
- layoutEndMargin:5,
-
- styleName:"tabBar",
-
- // have the baseline overlap the top edge of the TabSet, using rounded media
- baseLineConstructor:"Canvas",
- baseLineProperties : {
- backgroundColor: "#C0C3C7",
- overflow:"hidden",
- height:1
- }
-
- /*baseLineSrc:"[SKIN]baseline.png",
- baseLineThickness:3,
- baseLineCapSize:4*/
-
- })
- }
- if (isc.ImgTab) {
- isc.ImgTab.addProperties({
- src:"[SKIN]tab.png",
- capSize:6,
- showRollOver:true,
- showDown:false,
- showDisabled:true,
- showDisabledIcon:false,
- titleStyle:"tabTitle"
- })
- }
-
-
-//----------------------------------------
-// 7) Windows
-//----------------------------------------
- if (isc.Window) {
- isc.Window.addProperties({
- // rounded frame edges
- showEdges:true,
- edgeImage: "[SKINIMG]Window/window.png",
- customEdges:null,
- edgeSize:6,
- edgeTop:23,
- edgeBottom:6,
- edgeOffsetTop:2,
- edgeOffsetRight:5,
- edgeOffsetBottom:5,
- minimizeHeight:29,
- showHeaderBackground:false, // part of edges
- showHeaderIcon:true,
-
- // clear backgroundColor and style since corners are rounded
- backgroundColor:null,
- border: null,
- styleName:"normal",
- edgeCenterBackgroundColor:"#FFFFFF",
- bodyColor:"transparent",
- bodyStyle:"windowBody",
-
- layoutMargin:0,
- membersMargin:0,
-
- showFooter:false,
-
- showShadow:false,
- shadowDepth:5
- })
-
- isc.Window.changeDefaults("headerDefaults", {
- layoutMargin:0,
- height:20
- })
- isc.Window.changeDefaults("resizerDefaults", {
- src:"[SKIN]/Window/resizer.png"
- })
-
- isc.Window.changeDefaults("headerIconDefaults", {
- width:15,
- height:15,
- src:"[SKIN]/Window/headerIcon.png"
- })
- isc.Window.changeDefaults("restoreButtonDefaults", {
- src:"[SKIN]/headerIcons/cascade.png",
- showRollOver:true,
- showDown:false,
- width:15,
- height:15
- })
- isc.Window.changeDefaults("closeButtonDefaults", {
- src:"[SKIN]/headerIcons/close.png",
- showRollOver:true,
- showDown:false,
- width:15,
- height:15
- })
- isc.Window.changeDefaults("maximizeButtonDefaults", {
- src:"[SKIN]/headerIcons/maximize.png",
- showRollOver:true,
- width:15,
- height:15
- })
- isc.Window.changeDefaults("minimizeButtonDefaults", {
- src:"[SKIN]/headerIcons/minimize.png",
- showRollOver:true,
- showDown:false,
- width:15,
- height:15
- })
- isc.Window.changeDefaults("toolbarDefaults", {
- buttonConstructor: "IButton"
- })
-
-
- if (isc.ColorPicker) {
- isc.ColorPicker.addProperties({
- layoutMargin:0
- })
- }
-
-//----------------------------------------
-// 8) Dialogs
-//----------------------------------------
- if (isc.Dialog) {
- isc.Dialog.addProperties({
- bodyColor:"transparent",
- hiliteBodyColor:"transparent"
- })
- // even though Dialog inherits from Window, we need a separate changeDefaults block
- // because Dialog defines its own toolbarDefaults
- isc.Dialog.changeDefaults("toolbarDefaults", {
- buttonConstructor: "IButton",
- height:42, // 10px margins + 22px button
- membersMargin:10
- })
- if (isc.Dialog.Warn && isc.Dialog.Warn.toolbarDefaults) {
- isc.addProperties(isc.Dialog.Warn.toolbarDefaults, {
- buttonConstructor: "IButton",
- height:42,
- membersMargin:10
- })
- }
- }
-
- } // end isc.Window
-
-
-//----------------------------------------
-// 9) Pickers
-//----------------------------------------
- // add bevels and shadows to all pickers
- isc.__pickerDefaults = {
- showEdges:true,
- edgeSize:6,
- edgeImage: "[SKINIMG]Window/window.png",
- backgroundColor:"#FFFFFF",
- showShadow:false,
- shadowDepth:6,
- shadowOffset:5
- }
- if (isc.ButtonTable) {
- isc.ButtonTable.addProperties({
- backgroundColor:"#FFFFFF"
- })
- }
- if (isc.FormItem) {
- isc.FormItem.changeDefaults("pickerDefaults", isc.__pickerDefaults)
- isc.FormItem.addProperties({
- defaultIconSrc:"[SKIN]/DynamicForm/default_formItem_icon.png"
- });
- }
- if (isc.CheckboxItem) {
- isc.CheckboxItem.addProperties({
- checkedImage:"[SKINIMG]/DynamicForm/checked.png",
- uncheckedImage:"[SKINIMG]/DynamicForm/unchecked.png",
- unsetImage:"[SKINIMG]/DynamicForm/unsetcheck.png",
- partialSelectedImage:"[SKINIMG]/DynamicForm/partialcheck.png",
- valueIconWidth:13,
- valueIconHeight:13,
- showValueIconOver:false,
- showValueIconFocused:false
- })
- }
- if(isc.RelationItem) {
- isc.RelationItem.changeDefaults("removeButtonDefaults", {
- src: "[SKIN]DynamicForm/Remove_icon.png"
- });
- }
-
- if (isc.DateChooser) {
- isc.DateChooser.addProperties({
- headerStyle:"dateChooserButton",
- weekendHeaderStyle:"dateChooserWeekendButton",
- baseNavButtonStyle:"dateChooserNavButton",
- baseWeekdayStyle:"dateChooserWeekday",
- baseWeekendStyle:"dateChooserWeekend",
- baseBottomButtonStyle:"dateChooserBottomButton",
- alternateWeekStyles:false,
-
- showEdges:true,
-
- edgeImage: "[SKINIMG]Window/window.png",
- edgeSize:6,
- edgeTop:26,
- edgeBottom:5,
- edgeOffsetTop:1,
- edgeOffsetRight:5,
- edgeOffsetLeft:5,
- edgeOffsetBottom:5,
-
- todayButtonHeight:20,
-
- headerHeight:24,
-
- edgeCenterBackgroundColor:"#FFFFFF",
- backgroundColor:null,
-
- showShadow:false,
- shadowDepth:6,
- shadowOffset:5,
-
- showDoubleYearIcon:false,
- skinImgDir:"images/DateChooser/",
- prevYearIcon:"[SKIN]doubleArrow_left.png",
- prevYearIconWidth:16,
- prevYearIconHeight:16,
- nextYearIcon:"[SKIN]doubleArrow_right.png",
- nextYearIconWidth:16,
- nextYearIconHeight:16,
- prevMonthIcon:"[SKIN]arrow_left.png",
- prevMonthIconWidth:16,
- prevMonthIconHeight:16,
- nextMonthIcon:"[SKIN]arrow_right.png",
- nextMonthIconWidth:16,
- nextMonthIconHeight:16
- });
- }
- if (isc.MultiFilePicker) {
- isc.MultiFilePicker.addProperties({
- backgroundColor:"#C7C7C7"
- })
- }
- if (isc.RelationPicker) {
- isc.RelationPicker.addProperties({
- backgroundColor:"#C7C7C7"
- })
- }
-
- // Native FILE INPUT items are rendered differently in Safari from other browsers
- // Don't show standard textbox styling around them as it looks odd
- if (isc.UploadItem && isc.Browser.isSafari) {
- isc.UploadItem.addProperties({
- textBoxStyle:"normal"
- });
- }
-//----------------------------------------
-// 10) Menus
-//----------------------------------------
- if (isc.Menu) {
- isc.Menu.addProperties({
- cellHeight:22,
- fastCellUpdates:false,
- showShadow:false,
- shadowDepth:5,
- showEdges:false,
- submenuImage:{src:"[SKIN]submenu.png", height:7, width:4},
- submenuDisabledImage:{src:"[SKIN]submenu_disabled.png", height:7, width:4},
- checkmarkImage:{src:"[SKIN]check.png", width:9, height:8},
- checkmarkDisabledImage:{src:"[SKIN]check_disabled.png", width:7, height:6},
- bodyStyleName:"gridBody",
- iconBodyStyleName:"menuMain",
- bodyBackgroundColor:null
- });
- isc.addProperties(isc.Menu.ICON_FIELD, {
- width:24,
- baseStyle:"menuIconField"
- });
- isc.Menu.TITLE_FIELD.baseStyle = "menuTitleField";
- }
-
- if (isc.MenuButton) {
- isc.MenuButton.addProperties({
- baseStyle: "menuButton",
- menuButtonImage:"[SKIN]menu_button.png",
- menuButtonImageUp:"[SKIN]menu_button_up.png",
- iconWidth:7,
- iconHeight:4,
- showFocusedAsOver:true
- });
- }
- if (isc.IMenuButton) {
- isc.IMenuButton.addProperties({
-
- menuButtonImage:"[SKIN]menu_button.png",
- menuButtonImageUp:"[SKIN]menu_button_up.png",
- iconWidth:7,
- iconHeight:4,
-
- // Other properties (match IButton)
- src:"[SKIN]button/button.png",
- height:22,
- capSize:4,
- titleStyle:"buttonTitle",
- showFocused:true,
- showFocusedAsOver:true
- });
- }
-
- if (isc.SelectionTreeMenu) {
- isc.SelectionTreeMenu.addProperties({
- showIcons:false,
- showKeys:false,
- bodyStyleName:"treeMenuBody",
- bodyBackgroundColor:null
- });
- }
-
-//----------------------------------------
-// 11) Hovers
-//----------------------------------------
- if (isc.Hover) {
- isc.addProperties(isc.Hover.hoverCanvasDefaults, {
- showShadow:false,
- shadowDepth:5
- })
- }
-
-
-//----------------------------------------
-// 12) ListGrids
-//----------------------------------------
- if (isc.ListGrid) {
- isc.ListGrid.addProperties({
- alternateRecordStyles : true,
-
- editFailedCSSText:"color:FF6347;",
- errorIconSrc : "[SKINIMG]actions/exclamation.png",
- tallBaseStyle: "tallCell",
-
- headerButtonConstructor:"Button",
- sorterConstructor:"ImgButton",
-
- sortAscendingImage:{src:"[SKIN]sort_ascending.png", width:9, height:6},
- sortDescendingImage:{src:"[SKIN]sort_descending.png", width:9, height:6},
-
- backgroundColor:null, bodyBackgroundColor:null,
-
- headerHeight:23,
- summaryRowHeight:21,
- cellHeight:22,
- normalCellHeight:22,
- headerBackgroundColor:null,
- headerBaseStyle:"headerButton",
- bodyStyleName:"gridBody",
- alternateBodyStyleName:null,
-
- summaryRowStyle:"gridSummaryCell",
- groupSummaryStyle:"groupSummaryCell",
-
- showHeaderMenuButton:true,
- headerMenuButtonConstructor:"HeaderImgButton",
- headerMenuButtonWidth:17,
- headerMenuButtonSrc:"[SKIN]/ListGrid/header_menu.png",
- headerMenuButtonIcon:"[SKINIMG]/ListGrid/sort_descending.png",
- headerMenuButtonIconWidth: 9,
- headerMenuButtonIconHeight: 6,
-
- groupLeadingIndent : 1,
- groupIconPadding : 3,
- groupIcon: "[SKINIMG]/ListGrid/group.png",
-
- expansionFieldTrueImage : "[SKINIMG]/ListGrid/row_expanded.png",
- expansionFieldFalseImage: "[SKINIMG]/ListGrid/row_collapsed.png",
- expansionFieldImageWidth : 16,
- expansionFieldImageHeight : 16,
- checkboxFieldImageWidth : 13,
- checkboxFieldImageHeight : 13
- })
- isc.ListGrid.changeDefaults("sorterDefaults", {
- // baseStyle / titleStyle is auto-assigned from headerBaseStyle
- showFocused:false,
- src:"[SKIN]ListGrid/header.png",
- baseStyle:"sorterButton"
- })
- isc.ListGrid.changeDefaults("headerButtonDefaults", {
- showRollOver:true,
- showDown:false,
- showFocused:false,
- baseStyle:"headerButton"
- })
- isc.ListGrid.changeDefaults("headerMenuButtonDefaults", {
- showDown:false,
- showTitle:true,
- src:"[SKIN]ListGrid/header.png"
- })
- isc.ListGrid.changeDefaults("summaryRowDefaults", {
- bodyBackgroundColor:null,
- bodyStyleName:"summaryRowBody"
- });
- }
-
- if (isc.TreeGrid) {
- isc.TreeGrid.addProperties({
- alternateRecordStyles : false,
- tallBaseStyle: "treeTallCell",
- normalBaseStyle: "treeCell",
- openerImage:"[SKIN]opener.png",
- sortAscendingImage:{src:"[SKINIMG]ListGrid/sort_ascending.png", width:9, height:6},
- sortDescendingImage:{src:"[SKINIMG]ListGrid/sort_descending.png", width:9, height:6}
- })
- }
-
- if(isc.MultiSortPanel) {
- isc.MultiSortPanel.changeDefaults("levelUpButtonDefaults", {
- src: "[SKINIMG]TransferIcons/up.png",
- height: 22,
- width: 24
- });
- isc.MultiSortPanel.changeDefaults("levelDownButtonDefaults", {
- src: "[SKINIMG]TransferIcons/down.png",
- height: 22,
- width: 24
- });
- }
-//----------------------------------------
-// 13) TreeGrids
-//----------------------------------------
- if (isc.TreeGrid) {
- isc.TreeGrid.addProperties({
- openerIconSize: 22,
- folderIcon:"[SKIN]folder.png",
- nodeIcon:"[SKIN]file.png",
- manyItemsImage:"[SKIN]folder_file.png"
- });
- }
- if (isc.ColumnTree) {
- isc.ColumnTree.addProperties({
- folderIcon:"[SKIN]folder.png",
- nodeIcon:"[SKIN]file.png"
- });
- }
-
-
-//----------------------------------------
-// 14) Form controls
-//----------------------------------------
- if (isc.FormItem) {isc.FormItem.addProperties({
- defaultIconSrc:"[SKIN]/DynamicForm/default_formItem_icon.png",
- errorIconSrc : "[SKINIMG]actions/exclamation.png",
- iconHeight:18,
- iconWidth:18,
- iconVAlign:"middle"
-
- })}
-
- if (isc.PickTreeItem) {isc.PickTreeItem.addProperties({
- buttonDefaults: {
- height:21
- }
- })}
-
- if (isc.TextItem) {isc.TextItem.addProperties({
- height:22,
- showFocused: true
- })}
-
- if (isc.TextAreaItem) {isc.TextAreaItem.addProperties({
- showFocused: true
- })}
- if (isc.SelectItem) {isc.SelectItem.addProperties({
- pickListTallBaseStyle:"tallPickListCell",
- textBoxStyle:"selectItemText",
- showFocusedPickerIcon:false,
- pickerIconSrc:"[SKIN]/pickers/comboBoxPicker.png",
- height:22,
- pickerIconWidth:18
- })}
-
- if (isc.ComboBoxItem) {isc.ComboBoxItem.addProperties({
- pickListTallBaseStyle:"tallPickListCell",
- textBoxStyle:"selectItemText",
- pendingTextBoxStyle:"comboBoxItemPendingText",
- showFocusedPickerIcon:false,
- pickerIconSrc:"[SKIN]/pickers/comboBoxPicker.png",
- height:22,
- pickerIconWidth:18
- })}
- // used by SelectItem and ComboBoxItem for picklist
- if (isc.ScrollingMenu) {isc.ScrollingMenu.addProperties({
- showShadow:false,
- shadowDepth:5
- })}
- if (isc.DateItem) {
- isc.DateItem.addProperties({
- height:22,
- pickerIconWidth:16,
- pickerIconHeight:14,
- pickerIconSrc:"[SKIN]/DynamicForm/date_control.png"
- })
- }
- if (isc.SpinnerItem) {
- isc.SpinnerItem.addProperties({
- textBoxStyle:"selectItemText",
- height:22
- })
- isc.SpinnerItem.INCREASE_ICON = isc.addProperties(isc.SpinnerItem.INCREASE_ICON, {
- width:16,
- height:11,
- showRollOver:true,
- showFocused:true,
- showDown:true,
- imgOnly:true,
- src:"[SKIN]/DynamicForm/spinner_control_increase.png"
- })
- isc.SpinnerItem.DECREASE_ICON = isc.addProperties(isc.SpinnerItem.DECREASE_ICON, {
- width:16,
- height:11,
- showRollOver:true,
- showFocused:true,
- showDown:true,
- imgOnly:true,
- src:"[SKIN]/DynamicForm/spinner_control_decrease.png"
- })
- }
-
-
-
- if (isc.PopUpTextAreaItem) {isc.PopUpTextAreaItem.addProperties({
- popUpIconSrc: "[SKIN]/DynamicForm/text_control.gif",
- popUpIconWidth:16,
- popUpIconHeight:16
- })}
- if (isc.ButtonItem && isc.IButton) {isc.ButtonItem.addProperties({
- showFocused:true,
- showFocusAsOver:false,
- buttonConstructor:isc.IButton,
- height:22
- })}
-
- if (isc.ToolbarItem && isc.IAutoFitButton) {isc.ToolbarItem.addProperties({
- buttonConstructor:isc.IAutoFitButton,
- buttonProperties: {
- autoFitDirection: isc.Canvas.BOTH
- }
- })}
-
- if(isc.DateRangeDialog) {
- isc.DateRangeDialog.changeDefaults("headerIconProperties", {
- src: "[SKIN]/DynamicForm/date_control.png"
- });
- }
- if(isc.MiniDateRangeItem) {
- isc.MiniDateRangeItem.changeDefaults("pickerIconDefaults", {
- src: "[SKIN]/DynamicForm/date_control.png"
- });
- }
- if(isc.RelativeDateItem) {
- isc.RelativeDateItem.changeDefaults("pickerIconDefaults", {
- src: "[SKIN]/DynamicForm/date_control.png"
- });
- }
-//----------------------------------------
-// 15) Drag & Drop
-//----------------------------------------
- // drag tracker drop shadow (disabled by default because many trackers are irregular shape)
- //isc.addProperties(isc.EH.dragTrackerDefaults, {
- // showShadow:false,
- // shadowDepth:4
- //});
- // drag target shadow and opacity
- isc.EH.showTargetDragShadow = true;
- isc.EH.targetDragOpacity = 50;
-
-
-
-//----------------------------------------
-// 16) Edges
-//----------------------------------------
- // default edge style serves as a pretty component frame/border - just set showEdges:true
- if (isc.EdgedCanvas) {
- isc.EdgedCanvas.addProperties({
- edgeSize:6,
- edgeImage: "[SKINIMG]edges/edge.png"
- })
- }
-
-
-//----------------------------------------
-// 17) Sliders
-//----------------------------------------
- if (isc.Slider) {
- isc.Slider.addProperties({
- thumbThickWidth:14,
- thumbThinWidth:14,
- trackWidth:5,
- trackCapSize:2,
- thumbSrc:"thumb.png",
- trackSrc:"track.png"
- })
- }
-
-//----------------------------------------
-// 18) TileList
-//----------------------------------------
- if (isc.TileGrid) {
- isc.TileGrid.addProperties({
- valuesShowRollOver: true,
- styleName:null,
- showEdges:true
- })
- }
-
-// ----------------------------------------
-// 19) CubeGrid
-//----------------------------------------
- if (isc.CubeGrid) {
- isc.CubeGrid.addProperties({
- bodyStyleName:"cubeGridBody",
- alternateBodyStyleName:"alternateCubeGridBody"
- });
- }
-
-// ----------------------------------------
-// 20) FilterBuilder
-//----------------------------------------
- if (isc.FilterBuilder) {
- isc.FilterBuilder.changeDefaults("addButtonDefaults", {
- showFocused: false
- });
- isc.FilterBuilder.changeDefaults("removeButtonDefaults", {
- showFocused: false
- });
- }
-
-// -------------------------------------------
-// 21) Printing
-// -------------------------------------------
- if (isc.PrintWindow) {
- isc.PrintWindow.changeDefaults("printButtonDefaults", {
- height: 18
- });
- }
-
-// -------------------------------------------
-// 21) Printing
-// -------------------------------------------
- if (isc.Calendar) {
- isc.Calendar.changeDefaults("datePickerButtonDefaults", {
- showDown:false,
- showOver : false,
- src:"[SKIN]/DynamicForm/date_control.png"
- });
-
- isc.Calendar.changeDefaults("controlsBarDefaults", {
- height:10,
- layoutBottomMargin :10
- });
- isc.Calendar.changeDefaults("addEventButtonDefaults", {
- src:"[SKINIMG]actions/plus.png"
- });
-
- isc.EventWindow.changeDefaults("resizerDefaults", {
- src:"[SKIN]/Window/resizer.png"
- })
- }
-
-// -------------------------------------------
-// 22) ToolStrip
-// -------------------------------------------
- if(isc.ToolStrip) {
- isc.ToolStrip.addProperties({
- height:30,
- defaultLayoutAlign:"center",
- verticalStyleName:"toolStripVertical"
- });
-
- isc.ToolStrip.changeDefaults("formWrapperDefaults",
- {cellPadding:3}
- );
- }
-
-// -------------------------------------------
-// ExampleViewPane - used in the feature explorer
-// -------------------------------------------
- if (isc.ExampleViewPane) {
- isc.ExampleViewPane.addProperties({
- styleName:"normal"
- });
- }
-
-// specify where the browser should redirect if not supported
-isc.Page.checkBrowserAndRedirect("[SKIN]/unsupported_browser.html");
-
-} // end with()
-} // end loadSkin()
-alert('here');
-isc.loadSkin()
-
+isc.loadSkin = function (theWindow) {
+if (theWindow == null) theWindow = window;
+with (theWindow) {
+
+
+//----------------------------------------
+// Specify skin directory
+//----------------------------------------
+ // must be relative to your application file or isomorphicDir
+ isc.Page.setSkinDir("[ISOMORPHIC]/skins/Enterprise/")
+
+
+//----------------------------------------
+// Load skin style sheet(s)
+//----------------------------------------
+ isc.Page.loadStyleSheet("[SKIN]/skin_styles.css", theWindow)
+
+
+
+//============================================================
+// Component Skinning
+//============================================================
+// 1) Scrollbars
+// 2) Buttons
+// 3) Resizebars
+// 4) Sections
+// 5) Progressbars
+// 6) TabSets
+// 7) Windows
+// 8) Dialogs
+// 9) Pickers
+// 10) Menus
+// 11) Hovers
+// 12) ListGrids
+// 13) TreeGrids
+// 14) Form controls
+// 15) Drag & Drop
+// 16) Edges
+// 17) Sliders
+// 18) TileList
+// 19) CubeGrid
+// 20) FilterBuilder
+// 21) Printing
+// 22) ToolStrip
+//============================================================
+
+
+ isc.Canvas.addProperties({
+ groupBorderCSS: "1px solid #A7ABB4"
+ });
+
+ if(isc.Browser.isIE && isc.Browser.version >= 7) {
+ isc.Canvas.setAllowExternalFilters(false);
+ isc.Canvas.setNeverUseFilters(true);
+ if(isc.Window) {
+ isc.Window.addProperties({
+ modalMaskOpacity:null,
+ modalMaskStyle:"normal"
+ });
+ isc.Window.changeDefaults("modalMaskDefaults", { src : "[SKIN]opacity.png" });
+ }
+ }
+
+ if(isc.RPCManager) {
+ isc.RPCManager.addClassProperties({ promptStyle:"cursor" });
+ }
+
+//----------------------------------------
+// 1) Scrollbars
+//----------------------------------------
+ isc.Canvas.addProperties({
+ showCustomScrollbars:true,
+ scrollbarSize:16,
+ cornerSize: 16
+ })
+ isc.ScrollThumb.addProperties({
+ capSize:2,
+ vSrc:"[SKIN]vthumb.png",
+ hSrc:"[SKIN]hthumb.png",
+ showGrip:true,
+ gripLength:10,
+ gripBreadth:10,
+ showRollOver: true,
+ //showDown: true,
+ backgroundColor:"transparent"
+ })
+ isc.Scrollbar.addProperties({
+ btnSize:18,
+ showRollOver:true,
+ //showDown: true,
+ thumbMinSize:20,
+ thumbInset:0,
+ thumbOverlap:2,
+ backgroundColor:"#FFFFFF",
+ vSrc:"[SKIN]vscroll.png",
+ hSrc:"[SKIN]hscroll.png"
+ })
+
+
+//----------------------------------------
+// 2) Buttons
+//----------------------------------------
+
+ // "IButton" is the new standard button class for SmartClient applications. Application
+ // code should use IButton instead of Button for all standalone buttons. Other skins may
+ // map IButton directly to Button, so this single class will work everywhere. Button remains
+ // for internal and advanced uses (eg if you need to mix both CSS-based and image-based
+ // standalone buttons in the same application).
+ isc.defineClass("IButton", "StretchImgButton").addProperties({
+ src:"[SKIN]button/button.png",
+ height:22,
+ width:100,
+ capSize:4,
+ vertical:false,
+ titleStyle:"buttonTitle",
+ showFocused:true,
+ showFocusedAsOver:true
+ });
+ if (isc.IButton.markAsFrameworkClass != null) isc.IButton.markAsFrameworkClass();
+
+ isc.defineClass("IAutoFitButton", "IButton").addProperties({
+ autoFit: true,
+ autoFitDirection: isc.Canvas.HORIZONTAL
+ });
+ if (isc.IAutoFitButton.markAsFrameworkClass != null) isc.IAutoFitButton.markAsFrameworkClass();
+
+
+ isc.ImgButton.addProperties({
+ showFocused: true,
+ showFocusedAsOver:true
+
+ });
+
+ isc.defineClass("HeaderImgButton", "ImgButton").addProperties({
+ showFocused: false,
+ showRollOver:false,
+ showFocusedAsOver: false,
+ showDown:false
+ });
+
+ isc.Button.addProperties({
+ height:22,
+ showFocused: true,
+ showFocusedAsOver: false
+ });
+
+ isc.Label.addProperties({
+ showFocused: false
+ });
+
+
+
+//----------------------------------------
+// 3) Resizebars
+//----------------------------------------
+ // StretchImgSplitbar class renders as resize bar with
+ // end caps, body, grip
+ isc.StretchImgSplitbar.addProperties({
+ // modify vSrc / hSrc for custom appearance
+ //vSrc:"[SKIN]vsplit.gif",
+ //hSrc:"[SKIN]hsplit.gif",
+ capSize:10,
+ showGrip:true
+ })
+
+ // ImgSplitbar renders as resizebar with resize grip only
+ isc.ImgSplitbar.addProperties({
+ // modify these properties for custom appearance
+ //vSrc:"[SKIN]vgrip.png",
+ //hSrc:"[SKIN]hgrip.png",
+ //showDown:true,
+ //styleName:"splitbar"
+ })
+
+ isc.Snapbar.addProperties({
+ vSrc:"[SKIN]vsplit.png",
+ hSrc:"[SKIN]hsplit.png",
+ baseStyle:"splitbar",
+ /*items : [
+ {name:"blank", width:"capSize", height:"capSize"},
+ {name:"blank", width:"*", height:"*"},
+ {name:"blank", width:"capSize", height:"capSize"}
+ ],*/
+ items : [
+ {name:"bg", width:"*", height:"*"}
+ ],
+ showDownGrip:false,
+ showClosedGrip:false,
+ showRollOver:false,
+ showDown:false,
+ gripBreadth:3,
+ gripLength:20
+ //capSize:8
+ })
+
+ isc.Layout.addProperties({
+ resizeBarSize:5,
+ // Use the Snapbar as a resizeBar by default - subclass of Splitbar that
+ // shows interactive (closed/open) grip images
+ // Other options include the Splitbar, StretchImgSplitbar or ImgSplitbar
+ resizeBarClass:"Snapbar"
+ })
+
+
+//----------------------------------------
+// 4) Sections
+//----------------------------------------
+ if (isc.SectionItem) {
+ isc.SectionItem.addProperties({
+ sectionHeaderClass:"ImgSectionHeader",
+ height:26
+ })
+ }
+ if (isc.SectionStack) {
+
+ isc.SectionStack.addProperties({
+ backgroundColor:null,
+ sectionHeaderClass:"ImgSectionHeader",
+ headerHeight:26
+ })
+ isc.ImgSectionHeader.changeDefaults("backgroundDefaults", {
+ showRollOver:false,
+ showDown:false,
+ showDisabledIcon:false,
+ showRollOverIcon:false,
+ src:"[SKIN]SectionHeader/header.png",
+ icon:"[SKIN]SectionHeader/opener.png",
+ iconSize: 16,
+ capSize:2,
+ titleStyle:"imgSectionHeaderTitle",
+ baseStyle:"imgSectionHeader",
+ backgroundColor:"transparent"
+ })
+ isc.SectionHeader.addProperties({
+ icon:"[SKIN]SectionHeader/opener.png",
+ iconSize: 16
+ })
+ }
+
+
+//----------------------------------------
+// 5) Progressbars
+//----------------------------------------
+ if (isc.Progressbar) {
+ isc.Progressbar.addProperties({
+ horizontalItems: [
+ {name:"h_start",size:2},
+ {name:"h_stretch",size:0},
+ {name:"h_end",size:2},
+ {name:"h_empty_start",size:2},
+ {name:"h_empty_stretch",size:0},
+ {name:"h_empty_end",size:2}
+ ],
+ verticalItems: [
+ {name:"v_empty_start",size:2},
+ {name:"v_empty_stretch",size:0},
+ {name:"v_empty_end",size:0},
+ {name:"v_start",size:2},
+ {name:"v_stretch",size:0},
+ {name:"v_end",size:2}
+ ],
+ breadth:24,
+ length : 300
+ })
+ }
+
+
+//----------------------------------------
+// 6) TabSets
+//----------------------------------------
+ if (isc.TabSet) {
+ isc.TabSet.addProperties({
+ tabBarThickness:24,
+ scrollerButtonSize:19,
+ pickerButtonSize:20,
+
+ symmetricScroller:false,
+ symmetricPickerButton:false,
+
+ scrollerSrc:"[SKIN]scroll.png",
+ pickerButtonSrc:"[SKIN]picker.png",
+
+ closeTabIconSize:10,
+
+ showEdges:false,
+ paneContainerClassName:"tabSetContainer",
+
+ paneMargin:5,
+
+ showScrollerRollOver: false
+ });
+ isc.TabSet.changeDefaults("paneContainerDefaults", {
+ showEdges:false
+ })
+ isc.TabBar.addProperties({
+ membersMargin:1,
+
+ // keep the tabs from reaching the curved edge of the pane (regardless of align)
+ layoutStartMargin:5,
+ layoutEndMargin:5,
+
+ styleName:"tabBar",
+
+ // have the baseline overlap the top edge of the TabSet, using rounded media
+ baseLineConstructor:"Canvas",
+ baseLineProperties : {
+ backgroundColor: "#C0C3C7",
+ overflow:"hidden",
+ height:1
+ }
+
+ /*baseLineSrc:"[SKIN]baseline.png",
+ baseLineThickness:3,
+ baseLineCapSize:4*/
+
+ })
+ }
+ if (isc.ImgTab) {
+ isc.ImgTab.addProperties({
+ src:"[SKIN]tab.png",
+ capSize:6,
+ showRollOver:true,
+ showDown:false,
+ showDisabled:true,
+ showDisabledIcon:false,
+ titleStyle:"tabTitle"
+ })
+ }
+
+
+//----------------------------------------
+// 7) Windows
+//----------------------------------------
+ if (isc.Window) {
+ isc.Window.addProperties({
+ // rounded frame edges
+ showEdges:true,
+ edgeImage: "[SKINIMG]Window/window.png",
+ customEdges:null,
+ edgeSize:6,
+ edgeTop:23,
+ edgeBottom:6,
+ edgeOffsetTop:2,
+ edgeOffsetRight:5,
+ edgeOffsetBottom:5,
+ minimizeHeight:29,
+ showHeaderBackground:false, // part of edges
+ showHeaderIcon:true,
+
+ // clear backgroundColor and style since corners are rounded
+ backgroundColor:null,
+ border: null,
+ styleName:"normal",
+ edgeCenterBackgroundColor:"#FFFFFF",
+ bodyColor:"transparent",
+ bodyStyle:"windowBody",
+
+ layoutMargin:0,
+ membersMargin:0,
+
+ showFooter:false,
+
+ showShadow:false,
+ shadowDepth:5
+ })
+
+ isc.Window.changeDefaults("headerDefaults", {
+ layoutMargin:0,
+ height:20
+ })
+ isc.Window.changeDefaults("resizerDefaults", {
+ src:"[SKIN]/Window/resizer.png"
+ })
+
+ isc.Window.changeDefaults("headerIconDefaults", {
+ width:15,
+ height:15,
+ src:"[SKIN]/Window/headerIcon.png"
+ })
+ isc.Window.changeDefaults("restoreButtonDefaults", {
+ src:"[SKIN]/headerIcons/cascade.png",
+ showRollOver:true,
+ showDown:false,
+ width:15,
+ height:15
+ })
+ isc.Window.changeDefaults("closeButtonDefaults", {
+ src:"[SKIN]/headerIcons/close.png",
+ showRollOver:true,
+ showDown:false,
+ width:15,
+ height:15
+ })
+ isc.Window.changeDefaults("maximizeButtonDefaults", {
+ src:"[SKIN]/headerIcons/maximize.png",
+ showRollOver:true,
+ width:15,
+ height:15
+ })
+ isc.Window.changeDefaults("minimizeButtonDefaults", {
+ src:"[SKIN]/headerIcons/minimize.png",
+ showRollOver:true,
+ showDown:false,
+ width:15,
+ height:15
+ })
+ isc.Window.changeDefaults("toolbarDefaults", {
+ buttonConstructor: "IButton"
+ })
+
+
+ if (isc.ColorPicker) {
+ isc.ColorPicker.addProperties({
+ layoutMargin:0
+ })
+ }
+
+//----------------------------------------
+// 8) Dialogs
+//----------------------------------------
+ if (isc.Dialog) {
+ isc.Dialog.addProperties({
+ bodyColor:"transparent",
+ hiliteBodyColor:"transparent"
+ })
+ // even though Dialog inherits from Window, we need a separate changeDefaults block
+ // because Dialog defines its own toolbarDefaults
+ isc.Dialog.changeDefaults("toolbarDefaults", {
+ buttonConstructor: "IButton",
+ height:42, // 10px margins + 22px button
+ membersMargin:10
+ })
+ if (isc.Dialog.Warn && isc.Dialog.Warn.toolbarDefaults) {
+ isc.addProperties(isc.Dialog.Warn.toolbarDefaults, {
+ buttonConstructor: "IButton",
+ height:42,
+ membersMargin:10
+ })
+ }
+ }
+
+ } // end isc.Window
+
+
+//----------------------------------------
+// 9) Pickers
+//----------------------------------------
+ // add bevels and shadows to all pickers
+ isc.__pickerDefaults = {
+ showEdges:true,
+ edgeSize:6,
+ edgeImage: "[SKINIMG]Window/window.png",
+ backgroundColor:"#FFFFFF",
+ showShadow:false,
+ shadowDepth:6,
+ shadowOffset:5
+ }
+ if (isc.ButtonTable) {
+ isc.ButtonTable.addProperties({
+ backgroundColor:"#FFFFFF"
+ })
+ }
+ if (isc.FormItem) {
+ isc.FormItem.changeDefaults("pickerDefaults", isc.__pickerDefaults)
+ isc.FormItem.addProperties({
+ defaultIconSrc:"[SKIN]/DynamicForm/default_formItem_icon.png"
+ });
+ }
+ if (isc.CheckboxItem) {
+ isc.CheckboxItem.addProperties({
+ checkedImage:"[SKINIMG]/DynamicForm/checked.png",
+ uncheckedImage:"[SKINIMG]/DynamicForm/unchecked.png",
+ unsetImage:"[SKINIMG]/DynamicForm/unsetcheck.png",
+ partialSelectedImage:"[SKINIMG]/DynamicForm/partialcheck.png",
+ valueIconWidth:13,
+ valueIconHeight:13,
+ showValueIconOver:false,
+ showValueIconFocused:false
+ })
+ }
+ if(isc.RelationItem) {
+ isc.RelationItem.changeDefaults("removeButtonDefaults", {
+ src: "[SKIN]DynamicForm/Remove_icon.png"
+ });
+ }
+
+ if (isc.DateChooser) {
+ isc.DateChooser.addProperties({
+ headerStyle:"dateChooserButton",
+ weekendHeaderStyle:"dateChooserWeekendButton",
+ baseNavButtonStyle:"dateChooserNavButton",
+ baseWeekdayStyle:"dateChooserWeekday",
+ baseWeekendStyle:"dateChooserWeekend",
+ baseBottomButtonStyle:"dateChooserBottomButton",
+ alternateWeekStyles:false,
+
+ showEdges:true,
+
+ edgeImage: "[SKINIMG]Window/window.png",
+ edgeSize:6,
+ edgeTop:26,
+ edgeBottom:5,
+ edgeOffsetTop:1,
+ edgeOffsetRight:5,
+ edgeOffsetLeft:5,
+ edgeOffsetBottom:5,
+
+ todayButtonHeight:20,
+
+ headerHeight:24,
+
+ edgeCenterBackgroundColor:"#FFFFFF",
+ backgroundColor:null,
+
+ showShadow:false,
+ shadowDepth:6,
+ shadowOffset:5,
+
+ showDoubleYearIcon:false,
+ skinImgDir:"images/DateChooser/",
+ prevYearIcon:"[SKIN]doubleArrow_left.png",
+ prevYearIconWidth:16,
+ prevYearIconHeight:16,
+ nextYearIcon:"[SKIN]doubleArrow_right.png",
+ nextYearIconWidth:16,
+ nextYearIconHeight:16,
+ prevMonthIcon:"[SKIN]arrow_left.png",
+ prevMonthIconWidth:16,
+ prevMonthIconHeight:16,
+ nextMonthIcon:"[SKIN]arrow_right.png",
+ nextMonthIconWidth:16,
+ nextMonthIconHeight:16
+ });
+ }
+ if (isc.MultiFilePicker) {
+ isc.MultiFilePicker.addProperties({
+ backgroundColor:"#C7C7C7"
+ })
+ }
+ if (isc.RelationPicker) {
+ isc.RelationPicker.addProperties({
+ backgroundColor:"#C7C7C7"
+ })
+ }
+
+ // Native FILE INPUT items are rendered differently in Safari from other browsers
+ // Don't show standard textbox styling around them as it looks odd
+ if (isc.UploadItem && isc.Browser.isSafari) {
+ isc.UploadItem.addProperties({
+ textBoxStyle:"normal"
+ });
+ }
+//----------------------------------------
+// 10) Menus
+//----------------------------------------
+ if (isc.Menu) {
+ isc.Menu.addProperties({
+ cellHeight:22,
+ fastCellUpdates:false,
+ showShadow:false,
+ shadowDepth:5,
+ showEdges:false,
+ submenuImage:{src:"[SKIN]submenu.png", height:7, width:4},
+ submenuDisabledImage:{src:"[SKIN]submenu_disabled.png", height:7, width:4},
+ checkmarkImage:{src:"[SKIN]check.png", width:9, height:8},
+ checkmarkDisabledImage:{src:"[SKIN]check_disabled.png", width:7, height:6},
+ bodyStyleName:"gridBody",
+ iconBodyStyleName:"menuMain",
+ bodyBackgroundColor:null
+ });
+ isc.addProperties(isc.Menu.ICON_FIELD, {
+ width:24,
+ baseStyle:"menuIconField"
+ });
+ isc.Menu.TITLE_FIELD.baseStyle = "menuTitleField";
+ }
+
+ if (isc.MenuButton) {
+ isc.MenuButton.addProperties({
+ baseStyle: "menuButton",
+ menuButtonImage:"[SKIN]menu_button.png",
+ menuButtonImageUp:"[SKIN]menu_button_up.png",
+ iconWidth:7,
+ iconHeight:4,
+ showFocusedAsOver:true
+ });
+ }
+ if (isc.IMenuButton) {
+ isc.IMenuButton.addProperties({
+
+ menuButtonImage:"[SKIN]menu_button.png",
+ menuButtonImageUp:"[SKIN]menu_button_up.png",
+ iconWidth:7,
+ iconHeight:4,
+
+ // Other properties (match IButton)
+ src:"[SKIN]button/button.png",
+ height:22,
+ capSize:4,
+ titleStyle:"buttonTitle",
+ showFocused:true,
+ showFocusedAsOver:true
+ });
+ }
+
+ if (isc.SelectionTreeMenu) {
+ isc.SelectionTreeMenu.addProperties({
+ showIcons:false,
+ showKeys:false,
+ bodyStyleName:"treeMenuBody",
+ bodyBackgroundColor:null
+ });
+ }
+
+//----------------------------------------
+// 11) Hovers
+//----------------------------------------
+ if (isc.Hover) {
+ isc.addProperties(isc.Hover.hoverCanvasDefaults, {
+ showShadow:false,
+ shadowDepth:5
+ })
+ }
+
+
+//----------------------------------------
+// 12) ListGrids
+//----------------------------------------
+ if (isc.ListGrid) {
+ isc.ListGrid.addProperties({
+ alternateRecordStyles : true,
+
+ editFailedCSSText:"color:FF6347;",
+ errorIconSrc : "[SKINIMG]actions/exclamation.png",
+ tallBaseStyle: "tallCell",
+
+ headerButtonConstructor:"Button",
+ sorterConstructor:"ImgButton",
+
+ sortAscendingImage:{src:"[SKIN]sort_ascending.png", width:9, height:6},
+ sortDescendingImage:{src:"[SKIN]sort_descending.png", width:9, height:6},
+
+ backgroundColor:null, bodyBackgroundColor:null,
+
+ headerHeight:23,
+ summaryRowHeight:21,
+ cellHeight:22,
+ normalCellHeight:22,
+ headerBackgroundColor:null,
+ headerBaseStyle:"headerButton",
+ bodyStyleName:"gridBody",
+ alternateBodyStyleName:null,
+
+ summaryRowStyle:"gridSummaryCell",
+ groupSummaryStyle:"groupSummaryCell",
+
+ showHeaderMenuButton:true,
+ headerMenuButtonConstructor:"HeaderImgButton",
+ headerMenuButtonWidth:17,
+ headerMenuButtonSrc:"[SKIN]/ListGrid/header_menu.png",
+ headerMenuButtonIcon:"[SKINIMG]/ListGrid/sort_descending.png",
+ headerMenuButtonIconWidth: 9,
+ headerMenuButtonIconHeight: 6,
+
+ groupLeadingIndent : 1,
+ groupIconPadding : 3,
+ groupIcon: "[SKINIMG]/ListGrid/group.png",
+
+ expansionFieldTrueImage : "[SKINIMG]/ListGrid/row_expanded.png",
+ expansionFieldFalseImage: "[SKINIMG]/ListGrid/row_collapsed.png",
+ expansionFieldImageWidth : 16,
+ expansionFieldImageHeight : 16,
+ checkboxFieldImageWidth : 13,
+ checkboxFieldImageHeight : 13
+ })
+ isc.ListGrid.changeDefaults("sorterDefaults", {
+ // baseStyle / titleStyle is auto-assigned from headerBaseStyle
+ showFocused:false,
+ src:"[SKIN]ListGrid/header.png",
+ baseStyle:"sorterButton"
+ })
+ isc.ListGrid.changeDefaults("headerButtonDefaults", {
+ showRollOver:true,
+ showDown:false,
+ showFocused:false,
+ baseStyle:"headerButton"
+ })
+ isc.ListGrid.changeDefaults("headerMenuButtonDefaults", {
+ showDown:false,
+ showTitle:true,
+ src:"[SKIN]ListGrid/header.png"
+ })
+ isc.ListGrid.changeDefaults("summaryRowDefaults", {
+ bodyBackgroundColor:null,
+ bodyStyleName:"summaryRowBody"
+ });
+ }
+
+ if (isc.TreeGrid) {
+ isc.TreeGrid.addProperties({
+ alternateRecordStyles : false,
+ tallBaseStyle: "treeTallCell",
+ normalBaseStyle: "treeCell",
+ openerImage:"[SKIN]opener.png",
+ sortAscendingImage:{src:"[SKINIMG]ListGrid/sort_ascending.png", width:9, height:6},
+ sortDescendingImage:{src:"[SKINIMG]ListGrid/sort_descending.png", width:9, height:6}
+ })
+ }
+
+ if(isc.MultiSortPanel) {
+ isc.MultiSortPanel.changeDefaults("levelUpButtonDefaults", {
+ src: "[SKINIMG]TransferIcons/up.png",
+ height: 22,
+ width: 24
+ });
+ isc.MultiSortPanel.changeDefaults("levelDownButtonDefaults", {
+ src: "[SKINIMG]TransferIcons/down.png",
+ height: 22,
+ width: 24
+ });
+ }
+//----------------------------------------
+// 13) TreeGrids
+//----------------------------------------
+ if (isc.TreeGrid) {
+ isc.TreeGrid.addProperties({
+ openerIconSize: 22,
+ folderIcon:"[SKIN]folder.png",
+ nodeIcon:"[SKIN]file.png",
+ manyItemsImage:"[SKIN]folder_file.png"
+ });
+ }
+ if (isc.ColumnTree) {
+ isc.ColumnTree.addProperties({
+ folderIcon:"[SKIN]folder.png",
+ nodeIcon:"[SKIN]file.png"
+ });
+ }
+
+
+//----------------------------------------
+// 14) Form controls
+//----------------------------------------
+ if (isc.FormItem) {isc.FormItem.addProperties({
+ defaultIconSrc:"[SKIN]/DynamicForm/default_formItem_icon.png",
+ errorIconSrc : "[SKINIMG]actions/exclamation.png",
+ iconHeight:18,
+ iconWidth:18,
+ iconVAlign:"middle"
+
+ })}
+
+ if (isc.PickTreeItem) {isc.PickTreeItem.addProperties({
+ buttonDefaults: {
+ height:21
+ }
+ })}
+
+ if (isc.TextItem) {isc.TextItem.addProperties({
+ height:22,
+ showFocused: true
+ })}
+
+ if (isc.TextAreaItem) {isc.TextAreaItem.addProperties({
+ showFocused: true
+ })}
+ if (isc.SelectItem) {isc.SelectItem.addProperties({
+ pickListTallBaseStyle:"tallPickListCell",
+ textBoxStyle:"selectItemText",
+ showFocusedPickerIcon:false,
+ pickerIconSrc:"[SKIN]/pickers/comboBoxPicker.png",
+ height:22,
+ pickerIconWidth:18
+ })}
+
+ if (isc.ComboBoxItem) {isc.ComboBoxItem.addProperties({
+ pickListTallBaseStyle:"tallPickListCell",
+ textBoxStyle:"selectItemText",
+ pendingTextBoxStyle:"comboBoxItemPendingText",
+ showFocusedPickerIcon:false,
+ pickerIconSrc:"[SKIN]/pickers/comboBoxPicker.png",
+ height:22,
+ pickerIconWidth:18
+ })}
+ // used by SelectItem and ComboBoxItem for picklist
+ if (isc.ScrollingMenu) {isc.ScrollingMenu.addProperties({
+ showShadow:false,
+ shadowDepth:5
+ })}
+ if (isc.DateItem) {
+ isc.DateItem.addProperties({
+ height:22,
+ pickerIconWidth:16,
+ pickerIconHeight:14,
+ pickerIconSrc:"[SKIN]/DynamicForm/date_control.png"
+ })
+ }
+ if (isc.SpinnerItem) {
+ isc.SpinnerItem.addProperties({
+ textBoxStyle:"selectItemText",
+ height:22
+ })
+ isc.SpinnerItem.INCREASE_ICON = isc.addProperties(isc.SpinnerItem.INCREASE_ICON, {
+ width:16,
+ height:11,
+ showRollOver:true,
+ showFocused:true,
+ showDown:true,
+ imgOnly:true,
+ src:"[SKIN]/DynamicForm/spinner_control_increase.png"
+ })
+ isc.SpinnerItem.DECREASE_ICON = isc.addProperties(isc.SpinnerItem.DECREASE_ICON, {
+ width:16,
+ height:11,
+ showRollOver:true,
+ showFocused:true,
+ showDown:true,
+ imgOnly:true,
+ src:"[SKIN]/DynamicForm/spinner_control_decrease.png"
+ })
+ }
+
+
+
+ if (isc.PopUpTextAreaItem) {isc.PopUpTextAreaItem.addProperties({
+ popUpIconSrc: "[SKIN]/DynamicForm/text_control.gif",
+ popUpIconWidth:16,
+ popUpIconHeight:16
+ })}
+ if (isc.ButtonItem && isc.IButton) {isc.ButtonItem.addProperties({
+ showFocused:true,
+ showFocusAsOver:false,
+ buttonConstructor:isc.IButton,
+ height:22
+ })}
+
+ if (isc.ToolbarItem && isc.IAutoFitButton) {isc.ToolbarItem.addProperties({
+ buttonConstructor:isc.IAutoFitButton,
+ buttonProperties: {
+ autoFitDirection: isc.Canvas.BOTH
+ }
+ })}
+
+ if(isc.DateRangeDialog) {
+ isc.DateRangeDialog.changeDefaults("headerIconProperties", {
+ src: "[SKIN]/DynamicForm/date_control.png"
+ });
+ }
+ if(isc.MiniDateRangeItem) {
+ isc.MiniDateRangeItem.changeDefaults("pickerIconDefaults", {
+ src: "[SKIN]/DynamicForm/date_control.png"
+ });
+ }
+ if(isc.RelativeDateItem) {
+ isc.RelativeDateItem.changeDefaults("pickerIconDefaults", {
+ src: "[SKIN]/DynamicForm/date_control.png"
+ });
+ }
+//----------------------------------------
+// 15) Drag & Drop
+//----------------------------------------
+ // drag tracker drop shadow (disabled by default because many trackers are irregular shape)
+ //isc.addProperties(isc.EH.dragTrackerDefaults, {
+ // showShadow:false,
+ // shadowDepth:4
+ //});
+ // drag target shadow and opacity
+ isc.EH.showTargetDragShadow = true;
+ isc.EH.targetDragOpacity = 50;
+
+
+
+//----------------------------------------
+// 16) Edges
+//----------------------------------------
+ // default edge style serves as a pretty component frame/border - just set showEdges:true
+ if (isc.EdgedCanvas) {
+ isc.EdgedCanvas.addProperties({
+ edgeSize:6,
+ edgeImage: "[SKINIMG]edges/edge.png"
+ })
+ }
+
+
+//----------------------------------------
+// 17) Sliders
+//----------------------------------------
+ if (isc.Slider) {
+ isc.Slider.addProperties({
+ thumbThickWidth:14,
+ thumbThinWidth:14,
+ trackWidth:5,
+ trackCapSize:2,
+ thumbSrc:"thumb.png",
+ trackSrc:"track.png"
+ })
+ }
+
+//----------------------------------------
+// 18) TileList
+//----------------------------------------
+ if (isc.TileGrid) {
+ isc.TileGrid.addProperties({
+ valuesShowRollOver: true,
+ styleName:null,
+ showEdges:true
+ })
+ }
+
+// ----------------------------------------
+// 19) CubeGrid
+//----------------------------------------
+ if (isc.CubeGrid) {
+ isc.CubeGrid.addProperties({
+ bodyStyleName:"cubeGridBody",
+ alternateBodyStyleName:"alternateCubeGridBody"
+ });
+ }
+
+// ----------------------------------------
+// 20) FilterBuilder
+//----------------------------------------
+ if (isc.FilterBuilder) {
+ isc.FilterBuilder.changeDefaults("addButtonDefaults", {
+ showFocused: false
+ });
+ isc.FilterBuilder.changeDefaults("removeButtonDefaults", {
+ showFocused: false
+ });
+ }
+
+// -------------------------------------------
+// 21) Printing
+// -------------------------------------------
+ if (isc.PrintWindow) {
+ isc.PrintWindow.changeDefaults("printButtonDefaults", {
+ height: 18
+ });
+ }
+
+// -------------------------------------------
+// 21) Printing
+// -------------------------------------------
+ if (isc.Calendar) {
+ isc.Calendar.changeDefaults("datePickerButtonDefaults", {
+ showDown:false,
+ showOver : false,
+ src:"[SKIN]/DynamicForm/date_control.png"
+ });
+
+ isc.Calendar.changeDefaults("controlsBarDefaults", {
+ height:10,
+ layoutBottomMargin :10
+ });
+ isc.Calendar.changeDefaults("addEventButtonDefaults", {
+ src:"[SKINIMG]actions/plus.png"
+ });
+
+ isc.EventWindow.changeDefaults("resizerDefaults", {
+ src:"[SKIN]/Window/resizer.png"
+ })
+ }
+
+// -------------------------------------------
+// 22) ToolStrip
+// -------------------------------------------
+ if(isc.ToolStrip) {
+ isc.ToolStrip.addProperties({
+ height:30,
+ defaultLayoutAlign:"center",
+ verticalStyleName:"toolStripVertical"
+ });
+
+ isc.ToolStrip.changeDefaults("formWrapperDefaults",
+ {cellPadding:3}
+ );
+ }
+
+// -------------------------------------------
+// ExampleViewPane - used in the feature explorer
+// -------------------------------------------
+ if (isc.ExampleViewPane) {
+ isc.ExampleViewPane.addProperties({
+ styleName:"normal"
+ });
+ }
+
+// specify where the browser should redirect if not supported
+isc.Page.checkBrowserAndRedirect("[SKIN]/unsupported_browser.html");
+
+} // end with()
+} // end loadSkin()
+alert('here');
+isc.loadSkin()
+
diff --git a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Calendar.js b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Calendar.js
index 6095d16..ab68d7b 100644
--- a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Calendar.js
+++ b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Calendar.js
@@ -1,13 +1,13 @@
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
if(window.isc&&window.isc.module_Core&&!window.isc.module_Calendar){isc.module_Calendar=1;isc._moduleStart=isc._Calendar_start=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc._moduleEnd&&(!isc.Log||(isc.Log && isc.Log.logIsDebugEnabled('loadTime')))){isc._pTM={ message:'Calendar load/parse time: ' + (isc._moduleStart-isc._moduleEnd) + 'ms', category:'loadTime'};
if(isc.Log && isc.Log.logDebug)isc.Log.logDebug(isc._pTM.message,'loadTime')
@@ -448,14 +448,14 @@ var _1=this.body.getScrollLeft();var _2=_1+this.body.getVisibleWidth();var _3=th
,isc.A.getVisibleRowRange=function isc_TimelineView_getVisibleRowRange(){if(!this.renderEventsOnDemand){return[0,this.data.getLength()]}
var _1=this.bodies[1].getScrollTop();var _2=this.eventHeight;var _3=this.bodies[1].getVisibleHeight();var _4=Math.floor(_1/ _2);var _5=Math.floor((_1+_3)/_2);return[_4,_5]}
);isc.B._maxIndex=isc.C+46;isc.Calendar.registerStringMethods({getDayBodyHTML:"date,events,calendar,rowNum,colNum",getDayHeaderHTML:"date,events,calendar,rowNum,colNum",dayBodyClick:"date,events,calendar,rowNum,colNum",dayHeaderClick:"date,events,calendar,rowNum,colNum",eventClick:"event,viewName",eventChanged:"event",eventMoved:"newDate,event",eventResized:"newDate,event",backgroundClick:"startDate,endDate",backgroundMouseUp:"startDate"});isc.A=isc.DaySchedule;isc.A.$53o=[{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""},{label:"",day1:"",day2:"",day3:"",day4:"",day5:"",day6:"",day7:""}];isc.AutoTest.customizeCalendar();isc._moduleEnd=isc._Calendar_end=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc.Log&&isc.Log.logIsInfoEnabled('loadTime'))isc.Log.logInfo('Calendar module init time: ' + (isc._moduleEnd-isc._moduleStart) + 'ms','loadTime');delete isc.definingFramework;}else{if(window.isc && isc.Log && isc.Log.logWarn)isc.Log.logWarn("Duplicate load of module 'Calendar'.");}
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
diff --git a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_ClassBrowser.js b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_ClassBrowser.js
index 3671d62..144b40a 100644
--- a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_ClassBrowser.js
+++ b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_ClassBrowser.js
@@ -1,13 +1,13 @@
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
if(window.isc&&window.isc.module_Core&&!window.isc.module_ClassBrowser){isc.module_ClassBrowser=1;isc._moduleStart=isc._ClassBrowser_start=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc._moduleEnd&&(!isc.Log||(isc.Log && isc.Log.logIsDebugEnabled('loadTime')))){isc._pTM={ message:'ClassBrowser load/parse time: ' + (isc._moduleStart-isc._moduleEnd) + 'ms', category:'loadTime'};
if(isc.Log && isc.Log.logDebug)isc.Log.logDebug(isc._pTM.message,'loadTime')
@@ -51,14 +51,14 @@ isc.defineClass("JVMClassTree","TreeGrid");isc.A=isc.JVMClassTree.getPrototype()
,isc.A.showPane=function isc_ClassBrowser_showPane(_1,_2){var _3=this.rightPane.getTab(_1.ID);if(_3){this.currentPane=_3.pane;this.rightPane.selectTab(_3);return}
_3={};isc.addProperties(_3,_1,{canClose:true,pane:this.createAutoChild(_1.paneClass,{config:_2})});var _4=this.rightPane.getTab(0);if(_4&&_4.name=="welcome")this.rightPane.removeTab(0);this.rightPane.addTab(_3);this.rightPane.selectTab(_3);this.currentPane=_3.pane}
);isc.B._maxIndex=isc.C+5;isc._moduleEnd=isc._ClassBrowser_end=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc.Log&&isc.Log.logIsInfoEnabled('loadTime'))isc.Log.logInfo('ClassBrowser module init time: ' + (isc._moduleEnd-isc._moduleStart) + 'ms','loadTime');delete isc.definingFramework;}else{if(window.isc && isc.Log && isc.Log.logWarn)isc.Log.logWarn("Duplicate load of module 'ClassBrowser'.");}
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
diff --git a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Containers.js b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Containers.js
index f6bcb12..859c910 100644
--- a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Containers.js
+++ b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Containers.js
@@ -1,13 +1,13 @@
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
if(window.isc&&window.isc.module_Core&&!window.isc.module_Containers){isc.module_Containers=1;isc._moduleStart=isc._Containers_start=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc._moduleEnd&&(!isc.Log||(isc.Log && isc.Log.logIsDebugEnabled('loadTime')))){isc._pTM={ message:'Containers load/parse time: ' + (isc._moduleStart-isc._moduleEnd) + 'ms', category:'loadTime'};
if(isc.Log && isc.Log.logDebug)isc.Log.logDebug(isc._pTM.message,'loadTime')
@@ -574,14 +574,14 @@ this.invokeSuper("TabSet","clear",_1,_2,_3,_4)}
_3.selectTab(_5);_3.getTabBar().getButton(_5).focus();return false}
if(this.convertToMethod("keyPress"))return this.keyPress(_1,_2)}
);isc.B._maxIndex=isc.C+1;isc.TabSet.registerDupProperties("tabs",["pane"]);isc._moduleEnd=isc._Containers_end=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc.Log&&isc.Log.logIsInfoEnabled('loadTime'))isc.Log.logInfo('Containers module init time: ' + (isc._moduleEnd-isc._moduleStart) + 'ms','loadTime');delete isc.definingFramework;}else{if(window.isc && isc.Log && isc.Log.logWarn)isc.Log.logWarn("Duplicate load of module 'Containers'.");}
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
diff --git a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Core.js b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Core.js
index cce509e..484fa39 100644
--- a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Core.js
+++ b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Core.js
@@ -1,13 +1,13 @@
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
var isc = window.isc ? window.isc : {};if(window.isc&&!window.isc.module_Core){isc.module_Core=1;isc._moduleStart=isc._Core_start=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc._moduleEnd&&(!isc.Log||(isc.Log && isc.Log.logIsDebugEnabled('loadTime')))){isc._pTM={ message:'Core load/parse time: ' + (isc._moduleStart-isc._moduleEnd) + 'ms', category:'loadTime'};
if(isc.Log && isc.Log.logDebug)isc.Log.logDebug(isc._pTM.message,'loadTime')
@@ -4286,14 +4286,14 @@ default:var _20=parseInt(_23.index);return this.data.get(_20)}}})}
if(isc.Calendar)isc.AutoTest.customizeCalendar();if(!isc.Page.isLoaded()){isc.Page.setEvent("load","isc.ApplyAutoTestMethods()")}else{isc.ApplyAutoTestMethods()}
isc.Page.logInfo("SmartClient Core ("+isc.version+" "+isc.buildDate+") initialized: "+(isc.timeStamp()-isc.$d)+"ms");isc.Page.logInfo("document.compatMode: "+document.compatMode);if(isc.Log.hasFireBug()){isc.Log.logWarn("NOTE: Firebug is enabled. Firebug greatly slows the performance of "+"applications that make heavy use of JavaScript. Isomorphic highly recommends Firebug "+"for troubleshooting, but Firebug and other development tools should be disabled when "+"assessing the real-world performance of SmartClient applications.")}
isc._moduleEnd=isc._Core_end=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc.Log&&isc.Log.logIsInfoEnabled('loadTime'))isc.Log.logInfo('Core module init time: ' + (isc._moduleEnd-isc._moduleStart) + 'ms','loadTime');delete isc.definingFramework;}else{if(window.isc && isc.Log && isc.Log.logWarn)isc.Log.logWarn("Duplicate load of module 'Core'.");}
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
diff --git a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_DataBinding.js b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_DataBinding.js
index 176d8d9..c215a5a 100644
--- a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_DataBinding.js
+++ b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_DataBinding.js
@@ -1,13 +1,13 @@
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
if(window.isc&&window.isc.module_Core&&!window.isc.module_DataBinding){isc.module_DataBinding=1;isc._moduleStart=isc._DataBinding_start=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc._moduleEnd&&(!isc.Log||(isc.Log && isc.Log.logIsDebugEnabled('loadTime')))){isc._pTM={ message:'DataBinding load/parse time: ' + (isc._moduleStart-isc._moduleEnd) + 'ms', category:'loadTime'};
if(isc.Log && isc.Log.logDebug)isc.Log.logDebug(isc._pTM.message,'loadTime')
@@ -3506,14 +3506,14 @@ _3.add(_6)}
var _9=isc.Tree.create({modelType:"parent",childrenProperty:"fields",titleProperty:"name",idField:"id",nameProperty:"id",root:{id:0,name:"root"},data:_3});this.fieldEditor.setData(_9)}
);isc.B._maxIndex=isc.C+16}
isc._moduleEnd=isc._DataBinding_end=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc.Log&&isc.Log.logIsInfoEnabled('loadTime'))isc.Log.logInfo('DataBinding module init time: ' + (isc._moduleEnd-isc._moduleStart) + 'ms','loadTime');delete isc.definingFramework;}else{if(window.isc && isc.Log && isc.Log.logWarn)isc.Log.logWarn("Duplicate load of module 'DataBinding'.");}
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
diff --git a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Drawing.js b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Drawing.js
index 97011d3..c3609a2 100644
--- a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Drawing.js
+++ b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Drawing.js
@@ -1,13 +1,13 @@
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
if(window.isc&&window.isc.module_Core&&!window.isc.module_Drawing){isc.module_Drawing=1;isc._moduleStart=isc._Drawing_start=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc._moduleEnd&&(!isc.Log||(isc.Log && isc.Log.logIsDebugEnabled('loadTime')))){isc._pTM={ message:'Drawing load/parse time: ' + (isc._moduleStart-isc._moduleEnd) + 'ms', category:'loadTime'};
if(isc.Log && isc.Log.logDebug)isc.Log.logDebug(isc._pTM.message,'loadTime')
@@ -485,14 +485,14 @@ if(!_1)return this.Super("draw",arguments)}
,isc.A.updatePoints=function(x,y,dX,dY){}
,isc.A.clear=function isc_DrawKnob_clear(){this.Super("clear",arguments);this.knobShape.erase()}
);isc.B._maxIndex=isc.C+8;isc.DrawKnob.registerStringMethods({updatePoints:"x,y,dX,dY"});isc._moduleEnd=isc._Drawing_end=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc.Log&&isc.Log.logIsInfoEnabled('loadTime'))isc.Log.logInfo('Drawing module init time: ' + (isc._moduleEnd-isc._moduleStart) + 'ms','loadTime');delete isc.definingFramework;}else{if(window.isc && isc.Log && isc.Log.logWarn)isc.Log.logWarn("Duplicate load of module 'Drawing'.");}
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
diff --git a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_DSBrowser.js b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_DSBrowser.js
index 92e5f6e..49fbd27 100644
--- a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_DSBrowser.js
+++ b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_DSBrowser.js
@@ -1,13 +1,13 @@
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
if(window.isc&&window.isc.module_Core&&!window.isc.module_DSBrowser){isc.module_DSBrowser=1;isc._moduleStart=isc._DSBrowser_start=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc._moduleEnd&&(!isc.Log||(isc.Log && isc.Log.logIsDebugEnabled('loadTime')))){isc._pTM={ message:'DSBrowser load/parse time: ' + (isc._moduleStart-isc._moduleEnd) + 'ms', category:'loadTime'};
if(isc.Log && isc.Log.logDebug)isc.Log.logDebug(isc._pTM.message,'loadTime')
@@ -44,14 +44,14 @@ this.fieldGrid.setData(_3)}
,isc.A.xmlLoaded=function isc_DSEditor_xmlLoaded(_1){var _2=isc.DataSource.get(this.config.registry.ID);_2.updateData({pk:this.config.pk,object:_1.dsXML})}
,isc.A.buildDSConfig=function isc_DSEditor_buildDSConfig(_1){var _2={ID:_1,serverType:"sql",dbName:this.dbList.getSelectedDB(),__autoConstruct:"DataSource",operationBindings:[isc.addProperties({operationType:"fetch",skipRowCount:"true",qualifyColumnNames:false},this.fetchOperationForm.getValues())],fields:this.fieldGrid.data};return _2}
);isc.B._maxIndex=isc.C+11;isc._moduleEnd=isc._DSBrowser_end=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc.Log&&isc.Log.logIsInfoEnabled('loadTime'))isc.Log.logInfo('DSBrowser module init time: ' + (isc._moduleEnd-isc._moduleStart) + 'ms','loadTime');delete isc.definingFramework;}else{if(window.isc && isc.Log && isc.Log.logWarn)isc.Log.logWarn("Duplicate load of module 'DSBrowser'.");}
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
diff --git a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_EBay.js b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_EBay.js
index dc65165..12a82cc 100644
--- a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_EBay.js
+++ b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_EBay.js
@@ -1,13 +1,13 @@
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
if(window.isc&&window.isc.module_Core&&!window.isc.module_EBay){isc.module_EBay=1;isc._moduleStart=isc._EBay_start=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc._moduleEnd&&(!isc.Log||(isc.Log && isc.Log.logIsDebugEnabled('loadTime')))){isc._pTM={ message:'EBay load/parse time: ' + (isc._moduleStart-isc._moduleEnd) + 'ms', category:'loadTime'};
if(isc.Log && isc.Log.logDebug)isc.Log.logDebug(isc._pTM.message,'loadTime')
@@ -33,14 +33,14 @@ return _1.data}
return _1}
);isc.B._maxIndex=isc.C+2;isc.defineClass("EBaySearchItemListingsDS","EBayCategoryItemListingsDS");isc.A=isc.EBaySearchItemListingsDS.getPrototype();isc.A.wsOperation="GetSearchResults";isc.defineClass("CategoryResultTree","ResultTree");isc.A=isc.CategoryResultTree.getPrototype();isc.B=isc._allFuncs;isc.C=isc.B._maxIndex;isc.D=isc._funcClasses;isc.D[isc.C]=isc.A.Class;isc.B.push(isc.A.isFolder=function isc_CategoryResultTree_isFolder(_1){if(_1.LeafCategory)return _1.LeafCategory=="false";return this.Super("isFolder",arguments)}
);isc.B._maxIndex=isc.C+1;isc._moduleEnd=isc._EBay_end=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc.Log&&isc.Log.logIsInfoEnabled('loadTime'))isc.Log.logInfo('EBay module init time: ' + (isc._moduleEnd-isc._moduleStart) + 'ms','loadTime');delete isc.definingFramework;}else{if(window.isc && isc.Log && isc.Log.logWarn)isc.Log.logWarn("Duplicate load of module 'EBay'.");}
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
diff --git a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Forms.js b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Forms.js
index 5111f2d..bf09a52 100644
--- a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Forms.js
+++ b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Forms.js
@@ -1,13 +1,13 @@
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
if(window.isc&&window.isc.module_Core&&!window.isc.module_Forms){isc.module_Forms=1;isc._moduleStart=isc._Forms_start=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc._moduleEnd&&(!isc.Log||(isc.Log && isc.Log.logIsDebugEnabled('loadTime')))){isc._pTM={ message:'Forms load/parse time: ' + (isc._moduleStart-isc._moduleEnd) + 'ms', category:'loadTime'};
if(isc.Log && isc.Log.logDebug)isc.Log.logDebug(isc._pTM.message,'loadTime')
@@ -3700,14 +3700,14 @@ if(isc.ReportBuilder){isc.defineClass("ReportChooserItem","ComboBoxItem");isc.A=
,isc.A.reportBuilderReply=function isc_ReportChooserItem_reportBuilderReply(){this.pickList.invalidateCache();this.setValue(null)}
);isc.B._maxIndex=isc.C+4}
isc._moduleEnd=isc._Forms_end=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc.Log&&isc.Log.logIsInfoEnabled('loadTime'))isc.Log.logInfo('Forms module init time: ' + (isc._moduleEnd-isc._moduleStart) + 'ms','loadTime');delete isc.definingFramework;}else{if(window.isc && isc.Log && isc.Log.logWarn)isc.Log.logWarn("Duplicate load of module 'Forms'.");}
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
diff --git a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Foundation.js b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Foundation.js
index 707c564..9910135 100644
--- a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Foundation.js
+++ b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Foundation.js
@@ -1,13 +1,13 @@
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
if(window.isc&&window.isc.module_Core&&!window.isc.module_Foundation){isc.module_Foundation=1;isc._moduleStart=isc._Foundation_start=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc._moduleEnd&&(!isc.Log||(isc.Log && isc.Log.logIsDebugEnabled('loadTime')))){isc._pTM={ message:'Foundation load/parse time: ' + (isc._moduleStart-isc._moduleEnd) + 'ms', category:'loadTime'};
if(isc.Log && isc.Log.logDebug)isc.Log.logDebug(isc._pTM.message,'loadTime')
@@ -1268,14 +1268,14 @@ this.updateUI();if(_2&&this.paneChanged!=null)this.paneChanged(_1)}
,isc.A.navigationClick=function isc_SplitPane_navigationClick(_1){}
,isc.A.setDetailNavigationControl=function isc_SplitPane_setDetailNavigationControl(_1){this.detailNavigationControl=_1;var _2=this.currentUIConfig!="landscape"&&this.currentPane=="detail";if(_2)this.updateUI(true)}
);isc.B._maxIndex=isc.C+34;isc.SplitPane.registerStringMethods({paneChanged:"pane"});isc._moduleEnd=isc._Foundation_end=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc.Log&&isc.Log.logIsInfoEnabled('loadTime'))isc.Log.logInfo('Foundation module init time: ' + (isc._moduleEnd-isc._moduleStart) + 'ms','loadTime');delete isc.definingFramework;}else{if(window.isc && isc.Log && isc.Log.logWarn)isc.Log.logWarn("Duplicate load of module 'Foundation'.");}
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
diff --git a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Grids.js b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Grids.js
index a98010b..78c9890 100644
--- a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Grids.js
+++ b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Grids.js
@@ -1,13 +1,13 @@
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
if(window.isc&&window.isc.module_Core&&!window.isc.module_Grids){isc.module_Grids=1;isc._moduleStart=isc._Grids_start=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc._moduleEnd&&(!isc.Log||(isc.Log && isc.Log.logIsDebugEnabled('loadTime')))){isc._pTM={ message:'Grids load/parse time: ' + (isc._moduleStart-isc._moduleEnd) + 'ms', category:'loadTime'};
if(isc.Log && isc.Log.logDebug)isc.Log.logDebug(isc._pTM.message,'loadTime')
@@ -4247,14 +4247,14 @@ this.criteriaPane.setState(_1?_1.criteria:null)}
this.clearEditorData();this.reportGrid.deselectAllRecords();this.reportGrid.selectSingleRecord(_3);this.showEditor(this.reportGrid.getRecord(_3))}
,isc.A.tryIt=function isc_ReportBuilder_tryIt(){if(this.columnPane&&this.columnPane.configGrid)this.columnPane.configGrid.endEditing();this.updateFormRecord();isc.ReportBuilder.setLinkedGridState(this.editorForm.getData(),this.previewGrid)}
);isc.B._maxIndex=isc.C+17;isc._moduleEnd=isc._Grids_end=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc.Log&&isc.Log.logIsInfoEnabled('loadTime'))isc.Log.logInfo('Grids module init time: ' + (isc._moduleEnd-isc._moduleStart) + 'ms','loadTime');delete isc.definingFramework;}else{if(window.isc && isc.Log && isc.Log.logWarn)isc.Log.logWarn("Duplicate load of module 'Grids'.");}
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
diff --git a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_History.js b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_History.js
index b98f63e..48d885a 100644
--- a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_History.js
+++ b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_History.js
@@ -1,13 +1,13 @@
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
var isc = window.isc ? window.isc : {};if(window.isc&&!window.isc.module_History){isc.module_History=1;isc._moduleStart=isc._History_start=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc._moduleEnd&&(!isc.Log||(isc.Log && isc.Log.logIsDebugEnabled('loadTime')))){isc._pTM={ message:'History load/parse time: ' + (isc._moduleStart-isc._moduleEnd) + 'ms', category:'loadTime'};
if(isc.Log && isc.Log.logDebug)isc.Log.logDebug(isc._pTM.message,'loadTime')
@@ -56,14 +56,14 @@ if(isc.SA_Page.isLoaded()){this.$8(_2)}else{isc.SA_Page.onLoad(function(){this.$
this.$80a=true;if(!this.$p){this.logWarn("ready to fire history callback, but no callback registered."+"Please call isc.History.registerCallback() before pageLoad."+" If you can't register your callback before pageLoad, you"+" can call isc.History.getCurrentHistoryId() to get the ID"+" when you're ready.");return}
if(_1=="$69i")_1=null;var _2=this.$p;var _3;if(!this.haveHistoryState(_1)){if(this.$72o){this.logWarn("User navigated to URL associated with synthetic history ID:"+_1+". This ID is not associated with any synthetic history entry generated via "+"History.addHistoryEntry(). Not firing registered historyCallback as "+"callback was registered with parameter requiring a data object. "+"This can commonly occur when the user navigates to a stored history entry "+"via a bookmarked URL.");return}}else{_3=this.historyState.data[_1]}
this.$ab=_1;this.logDebug("history callback: "+_1);if(isc.Class&&this.isAString(_2)){isc.Class.fireCallback(_2,["id","data"],[_1,_3])}else{_2=isc.addProperties({},_2);_2.args=[_1,_3];this.fireSimpleCallback(_2)}}});isc.History.$z();isc._moduleEnd=isc._History_end=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc.Log&&isc.Log.logIsInfoEnabled('loadTime'))isc.Log.logInfo('History module init time: ' + (isc._moduleEnd-isc._moduleStart) + 'ms','loadTime');delete isc.definingFramework;}else{if(window.isc && isc.Log && isc.Log.logWarn)isc.Log.logWarn("Duplicate load of module 'History'.");}
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
diff --git a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Kapow.js b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Kapow.js
index 2bf5f6e..5e4eec0 100644
--- a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Kapow.js
+++ b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Kapow.js
@@ -1,13 +1,13 @@
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
if(window.isc&&window.isc.module_Core&&!window.isc.module_Kapow){isc.module_Kapow=1;isc._moduleStart=isc._Kapow_start=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc._moduleEnd&&(!isc.Log||(isc.Log && isc.Log.logIsDebugEnabled('loadTime')))){isc._pTM={ message:'Kapow load/parse time: ' + (isc._moduleStart-isc._moduleEnd) + 'ms', category:'loadTime'};
if(isc.Log && isc.Log.logDebug)isc.Log.logDebug(isc._pTM.message,'loadTime')
@@ -15,14 +15,14 @@ else if(isc._preLog)isc._preLog[isc._preLog.length]=isc._pTM
else isc._preLog=[isc._pTM]}isc.definingFramework=true;isc.defineClass("RobotServerPicker","Window");isc.A=isc.RobotServerPicker.getPrototype();isc.B=isc._allFuncs;isc.C=isc.B._maxIndex;isc.D=isc._funcClasses;isc.D[isc.C]=isc.A.Class;isc.A.autoCenter=true;isc.A.autoSize=true;isc.A.isModal=true;isc.A.title="Select Robot Server";isc.A.formConstructor="DynamicForm";isc.A.formDefaults={width:300,numCols:2,colWidths:[150,"*"],defaultItems:[{name:"robotServerURL",title:"Robot Server URL",defaultValue:"http://127.0.0.1:50080"},{name:"next",type:"button",title:"Next",click:"form.creator.nextClick()",startRow:true},{name:"cancel",type:"button",title:"Cancel",click:"form.creator.hide()",endRow:false,startRow:false}]};isc.A.myAutoChildren=["form"];isc.B.push(isc.A.initWidget=function isc_RobotServerPicker_initWidget(){this.Super("initWidget",arguments);this.form=this.createAutoChild("form");this.addItem(this.form)}
,isc.A.nextClick=function isc_RobotServerPicker_nextClick(){var _1=this.form.getValue("robotServerURL");window.robotServerURL=_1;this.hide();this.fireCallback("robotServerSelected","robotServerURL",[_1])}
);isc.B._maxIndex=isc.C+2;isc.RobotServerPicker.registerStringMethods({robotServerSelected:"robotServerURL"});isc._moduleEnd=isc._Kapow_end=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc.Log&&isc.Log.logIsInfoEnabled('loadTime'))isc.Log.logInfo('Kapow module init time: ' + (isc._moduleEnd-isc._moduleStart) + 'ms','loadTime');delete isc.definingFramework;}else{if(window.isc && isc.Log && isc.Log.logWarn)isc.Log.logWarn("Duplicate load of module 'Kapow'.");}
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
diff --git a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_PluginBridges.js b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_PluginBridges.js
index 02e223c..0ace7e1 100644
--- a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_PluginBridges.js
+++ b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_PluginBridges.js
@@ -1,13 +1,13 @@
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
if(window.isc&&window.isc.module_Core&&!window.isc.module_PluginBridges){isc.module_PluginBridges=1;isc._moduleStart=isc._PluginBridges_start=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc._moduleEnd&&(!isc.Log||(isc.Log && isc.Log.logIsDebugEnabled('loadTime')))){isc._pTM={ message:'PluginBridges load/parse time: ' + (isc._moduleStart-isc._moduleEnd) + 'ms', category:'loadTime'};
if(isc.Log && isc.Log.logDebug)isc.Log.logDebug(isc._pTM.message,'loadTime')
@@ -70,14 +70,14 @@ _1.append("</object>");return _1.toString()}
,isc.A.getPluginID=function isc_ActiveXControl_getPluginID(){if(!this.id)this.id=this.getID()+"$27a";return this.id}
,isc.A.getPluginHandle=function isc_ActiveXControl_getPluginHandle(){return window[this.getPluginID()]}
);isc.B._maxIndex=isc.C+3;isc._moduleEnd=isc._PluginBridges_end=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc.Log&&isc.Log.logIsInfoEnabled('loadTime'))isc.Log.logInfo('PluginBridges module init time: ' + (isc._moduleEnd-isc._moduleStart) + 'ms','loadTime');delete isc.definingFramework;}else{if(window.isc && isc.Log && isc.Log.logWarn)isc.Log.logWarn("Duplicate load of module 'PluginBridges'.");}
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
diff --git a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_RichTextEditor.js b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_RichTextEditor.js
index e40db75..4bf105c 100644
--- a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_RichTextEditor.js
+++ b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_RichTextEditor.js
@@ -1,13 +1,13 @@
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
if(window.isc&&window.isc.module_Core&&!window.isc.module_RichTextEditor){isc.module_RichTextEditor=1;isc._moduleStart=isc._RichTextEditor_start=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc._moduleEnd&&(!isc.Log||(isc.Log && isc.Log.logIsDebugEnabled('loadTime')))){isc._pTM={ message:'RichTextEditor load/parse time: ' + (isc._moduleStart-isc._moduleEnd) + 'ms', category:'loadTime'};
if(isc.Log && isc.Log.logDebug)isc.Log.logDebug(isc._pTM.message,'loadTime')
@@ -221,14 +221,14 @@ _2.defaultControlConstructor=this.defaultControlConstructor;this.canvas=_2;this.
,isc.A.updateValue=function isc_RichTextItem_updateValue(){if(!this.canvas)return
var _1=this.canvas.getValue();return this.$10y(_1)}
);isc.B._maxIndex=isc.C+6;isc._moduleEnd=isc._RichTextEditor_end=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc.Log&&isc.Log.logIsInfoEnabled('loadTime'))isc.Log.logInfo('RichTextEditor module init time: ' + (isc._moduleEnd-isc._moduleStart) + 'ms','loadTime');delete isc.definingFramework;}else{if(window.isc && isc.Log && isc.Log.logWarn)isc.Log.logWarn("Duplicate load of module 'RichTextEditor'.");}
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
diff --git a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_SalesForce.js b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_SalesForce.js
index 2558a6c..4b70fea 100644
--- a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_SalesForce.js
+++ b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_SalesForce.js
@@ -1,13 +1,13 @@
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
if(window.isc&&window.isc.module_Core&&!window.isc.module_SalesForce){isc.module_SalesForce=1;isc._moduleStart=isc._SalesForce_start=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc._moduleEnd&&(!isc.Log||(isc.Log && isc.Log.logIsDebugEnabled('loadTime')))){isc._pTM={ message:'SalesForce load/parse time: ' + (isc._moduleStart-isc._moduleEnd) + 'ms', category:'loadTime'};
if(isc.Log && isc.Log.logDebug)isc.Log.logDebug(isc._pTM.message,'loadTime')
@@ -4571,14 +4571,14 @@ return this.Super("fetchData",arguments)}
return _3}
);isc.B._maxIndex=isc.C+4}
isc._moduleEnd=isc._SalesForce_end=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc.Log&&isc.Log.logIsInfoEnabled('loadTime'))isc.Log.logInfo('SalesForce module init time: ' + (isc._moduleEnd-isc._moduleStart) + 'ms','loadTime');delete isc.definingFramework;}else{if(window.isc && isc.Log && isc.Log.logWarn)isc.Log.logWarn("Duplicate load of module 'SalesForce'.");}
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
diff --git a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Scheduler.js b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Scheduler.js
index 8a2da96..48870b9 100644
--- a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Scheduler.js
+++ b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Scheduler.js
@@ -1,13 +1,13 @@
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
if(window.isc&&window.isc.module_Core&&!window.isc.module_SQLBrowser){isc.module_SQLBrowser=1;isc._moduleStart=isc._SQLBrowser_start=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc._moduleEnd&&(!isc.Log||(isc.Log && isc.Log.logIsDebugEnabled('loadTime')))){isc._pTM={ message:'SQLBrowser load/parse time: ' + (isc._moduleStart-isc._moduleEnd) + 'ms', category:'loadTime'};
if(isc.Log && isc.Log.logDebug)isc.Log.logDebug(isc._pTM.message,'loadTime')
@@ -194,14 +194,14 @@ var _2=_1.getSelectedRecord();QuartzTriggers.performCustomOperation("pauseTrigge
var _2=_1.getSelectedRecord();QuartzTriggers.performCustomOperation("resumeTrigger",{group:_2.group,name:_2.name},function(_3){_1.invalidateCache();isc.say('Trigger Resumed')})}};isc.A.triggersRefreshBtnDefaults={_constructor:"ImgButton",showRollOver:false,size:16,src:"[SKIN]actions/refresh.png",prompt:"Refresh jobs",click:"this.creator.triggersGrid.invalidateCache()"};isc.A.triggersAddBtnDefaults={_constructor:"ImgButton",size:16,showRollOver:false,src:"[SKIN]actions/add.png",prompt:"Add trigger",click:function(){var _1=this.creator.jobsGrid;if(!_1.anySelected()){isc.say("Please select a job first");return}
var _2=_1.getSelectedRecord();this.creator.triggersGrid.startEditingNew({jobGroup:_2.group,jobName:_2.name})}};isc.A.triggersRemoveBtnDefaults={_constructor:"ImgButton",size:16,showRollOver:false,src:"[SKIN]actions/remove.png",prompt:"Remove job",click:function(){var _1=this;isc.ask("Are you sure you wish to remove the selected trigger?",function(_2){if(_2)_1.creator.jobsGrid.removeSelectedData(function(_3){_1.creator.triggersGrid.invalidateCache()})})}};isc.A.triggersGridDefaults={_constructor:"ListGrid",canEdit:true,autoDraw:false,dataSource:"QuartzTriggers",useAllDataSourceFields:true,selectionType:"single",remove:function(){}};isc.B.push(isc.A.initWidget=function isc_QuartzManager_initWidget(){this.Super("initWidget",arguments);this.jobsPauseBtn=this.createAutoChild("jobsPauseBtn");this.jobsResumeBtn=this.createAutoChild("jobsResumeBtn");this.jobsTriggerBtn=this.createAutoChild("jobsTriggerBtn");this.jobsRefreshBtn=this.createAutoChild("jobsRefreshBtn");this.jobsAddBtn=this.createAutoChild("jobsAddBtn");this.jobsRemoveBtn=this.createAutoChild("jobsRemoveBtn");this.jobsGrid=this.createAutoChild("jobsGrid");this.addSection({title:"Jobs",expanded:true,items:[this.jobsGrid],controls:[this.jobsPauseBtn,this.jobsResumeBtn,this.jobsTriggerBtn,this.jobsRefreshBtn,this.jobsAddBtn,this.jobsRemoveBtn]});;this.triggersPauseBtn=this.createAutoChild("triggersPauseBtn");this.triggersResumeBtn=this.createAutoChild("triggersResumeBtn");this.triggersRefreshBtn=this.createAutoChild("triggersRefreshBtn");this.triggersAddBtn=this.createAutoChild("triggersAddBtn");this.triggersRemoveBtn=this.createAutoChild("triggersRemoveBtn");this.triggersGrid=this.createAutoChild("triggersGrid");this.addSection({title:"Triggers",expanded:true,items:[this.triggersGrid],controls:[this.triggersPauseBtn,this.triggersResumeBtn,this.triggersRefreshBtn,this.triggersAddBtn,this.triggersRemoveBtn]});}
);isc.B._maxIndex=isc.C+1;isc._moduleEnd=isc._SQLBrowser_end=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc.Log&&isc.Log.logIsInfoEnabled('loadTime'))isc.Log.logInfo('SQLBrowser module init time: ' + (isc._moduleEnd-isc._moduleStart) + 'ms','loadTime');delete isc.definingFramework;}else{if(window.isc && isc.Log && isc.Log.logWarn)isc.Log.logWarn("Duplicate load of module 'SQLBrowser'.");}
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
diff --git a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_SQLBrowser.js b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_SQLBrowser.js
index d4d9e19..b490ecc 100644
--- a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_SQLBrowser.js
+++ b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_SQLBrowser.js
@@ -1,13 +1,13 @@
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
if(window.isc&&window.isc.module_Core&&!window.isc.module_SQLBrowser){isc.module_SQLBrowser=1;isc._moduleStart=isc._SQLBrowser_start=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc._moduleEnd&&(!isc.Log||(isc.Log && isc.Log.logIsDebugEnabled('loadTime')))){isc._pTM={ message:'SQLBrowser load/parse time: ' + (isc._moduleStart-isc._moduleEnd) + 'ms', category:'loadTime'};
if(isc.Log && isc.Log.logDebug)isc.Log.logDebug(isc._pTM.message,'loadTime')
@@ -175,14 +175,14 @@ this.initialCriteriaSet=false}
,isc.A.showPane=function isc_SQLBrowser_showPane(_1,_2){var _3=this.rightPane.getTab(_1.ID);if(_3){this.currentPane=_3.pane;this.rightPane.selectTab(_3);return}
_3={};isc.addProperties(_3,_1,{canClose:true,pane:this.createAutoChild(_1.paneClass,{config:_2})});var _4=this.rightPane.getTab(0);if(_4&&_4.name=="welcome")this.rightPane.removeTab(0);this.rightPane.addTab(_3);this.rightPane.selectTab(_3);this.currentPane=_3.pane}
);isc.B._maxIndex=isc.C+6;isc._moduleEnd=isc._SQLBrowser_end=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc.Log&&isc.Log.logIsInfoEnabled('loadTime'))isc.Log.logInfo('SQLBrowser module init time: ' + (isc._moduleEnd-isc._moduleStart) + 'ms','loadTime');delete isc.definingFramework;}else{if(window.isc && isc.Log && isc.Log.logWarn)isc.Log.logWarn("Duplicate load of module 'SQLBrowser'.");}
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
diff --git a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Workflow.js b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Workflow.js
index 1b911f3..f4b214b 100644
--- a/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Workflow.js
+++ b/sm-shop/src/main/webapp/resources/smart-client/system/modules/ISC_Workflow.js
@@ -1,13 +1,13 @@
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
if(window.isc&&window.isc.module_Core&&!window.isc.module_Workflow){isc.module_Workflow=1;isc._moduleStart=isc._Workflow_start=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc._moduleEnd&&(!isc.Log||(isc.Log && isc.Log.logIsDebugEnabled('loadTime')))){isc._pTM={ message:'Workflow load/parse time: ' + (isc._moduleStart-isc._moduleEnd) + 'ms', category:'loadTime'};
if(isc.Log && isc.Log.logDebug)isc.Log.logDebug(isc._pTM.message,'loadTime')
@@ -83,14 +83,14 @@ this.targetView.showRecursively();if(this.targetVM){this.targetVM.setValues(isc.
if(this.targetForm){this.targetForm.setValues(isc.clone(_1.state[this.inputField]));this.targetForm.userTask=this}
return false}
);isc.B._maxIndex=isc.C+3;isc._moduleEnd=isc._Workflow_end=(isc.timestamp?isc.timestamp():new Date().getTime());if(isc.Log&&isc.Log.logIsInfoEnabled('loadTime'))isc.Log.logInfo('Workflow module init time: ' + (isc._moduleEnd-isc._moduleStart) + 'ms','loadTime');delete isc.definingFramework;}else{if(window.isc && isc.Log && isc.Log.logWarn)isc.Log.logWarn("Duplicate load of module 'Workflow'.");}
-/*
- * Isomorphic SmartClient
- * Version v8.2p_2012-06-03 (2012-06-03)
- * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
- * "SmartClient" is a trademark of Isomorphic Software, Inc.
- *
- * licensing@smartclient.com
- *
- * http://smartclient.com/license
- */
+/*
+ * Isomorphic SmartClient
+ * Version v8.2p_2012-06-03 (2012-06-03)
+ * Copyright(c) 1998 and beyond Isomorphic Software, Inc. All rights reserved.
+ * "SmartClient" is a trademark of Isomorphic Software, Inc.
+ *
+ * licensing@smartclient.com
+ *
+ * http://smartclient.com/license
+ */
diff --git a/sm-shop/src/main/webapp/resources/templates/bootstrap/css/theme.css b/sm-shop/src/main/webapp/resources/templates/bootstrap/css/theme.css
index e32c14e..4d69b0e 100644
--- a/sm-shop/src/main/webapp/resources/templates/bootstrap/css/theme.css
+++ b/sm-shop/src/main/webapp/resources/templates/bootstrap/css/theme.css
@@ -1,582 +1,582 @@
-@charset "UTF-8";
-
-@font-face {
- font-family: 'SalarymanRegular';
- src: url('../fonts/SALARYMA-webfont.eot');
- src: url('../fonts/SALARYMA-webfont.eot?#iefix') format('embedded-opentype'),
- url('../fonts/SALARYMA-webfont.woff') format('woff'),
- url('../fonts/SALARYMA-webfont.ttf') format('truetype'),
- url('../fonts/SALARYMA-webfont.svg#SalarymanRegular') format('svg');
- font-weight: normal;
- font-style: normal;
-
-}
-
-
-body{
- font-size: 12px;
- font-family: 'Open Sans',sans-serif;
-}
-
-
-/* fixes css bootstrap row-fluid broken thumbnails */
-.row-fluid ul.thumbnails li.span12 + li { margin-left : 0px; }
-.row-fluid ul.thumbnails li.span6:nth-child(2n + 3) { margin-left : 0px; }
-.row-fluid ul.thumbnails li.span4:nth-child(3n + 4) { margin-left : 0px; }
-.row-fluid ul.thumbnails li.span3:nth-child(4n + 5) { margin-left : 0px; }
-
-.common-row {
- margin-left:0px;
-}
-
-a:link,a:visited{
- color:#666;
-}
-a:hover{
- color:#EE3C1F;
- text-decoration:none;
-}
-
-.logoImage {
- max-width:400px;
-}
-
-
-.logo > h1{
- font: 24px "SalarymanRegular", Arial, sans-serif;
- letter-spacing: 0;
- padding:0;
- margin-top:20px;
- color:#a2a1a1;
-}
-
-.lbw{
- font: 16px "SalarymanRegular", Arial, sans-serif;
- letter-spacing: 0;
- padding:0;
- color:#a2a1a1;
-}
-
-.specialPrice{
- color:#ff0000;
-}
-
-
-/* Main Menu */
-.res-menu{display: none;}
-.res-menu{
- width: 100%;
-}
-#menu a {text-shadow: 1px 1px #f4f4f4;}
-#menu ul {margin-left:9px;}
-#menu > ul{
- display: block;
- margin-left:0;
-}
-#menu > ul > li{
- list-style: none;
- float: left;
- position: relative;
-}
-#menu > ul > li.first,
-#menu > ul > li:first-child{
- margin-left: 0;
-}
-#menu > ul > li > a{
- font-size: 12px;
- font-weight: 400;
- color: #555;
- display: block;
- padding: 25px;
- margin-top: -5px;
-}
-
-#menu > ul > li > a .name {display: block; color: #4c4c4c;}
-#menu > ul > li > a .desc {display: block; color: #808080;}
-
-#menu > ul > li > a:hover,
-
-#menu > ul a:hover .name,
-#menu .current .name {color: #ff6c00 !important;}
-
-#menu ul ul{
- position: absolute;
- width: 150px;
- padding: 10px 15px;
- background: #dfdfdf;
-
- -webkit-box-shadow: 0px 3px 3px rgba(50, 50, 50, 0.5);
- -moz-box-shadow: 0px 3px 3px rgba(50, 50, 50, 0.5);
- box-shadow: 0px 3px 3px rgba(50, 50, 50, 0.5);
-
- -moz-border-radius-topleft: 0;
- -webkit-border-top-left-radius: 0;
- border-top-left-radius: 0;
- -moz-border-radius-topright: 0;
- -webkit-border-top-right-radius: 0;
- border-top-right-radius: 0;
-
- -moz-border-radius-bottomright: 3px;
- -webkit-border-bottom-right-radius: 3px;
- border-bottom-right-radius: 3px;
- -moz-border-radius-bottomleft: 3px;
- -webkit-border-bottom-left-radius: 3px;
- border-bottom-left-radius: 3px;
-
-}
-#menu ul ul ul {
- -webkit-box-shadow: 0 2px 3px rgba(50, 50, 50, 0.5);
- -moz-box-shadow: 0 2px 3px rgba(50, 50, 50, 0.5);
- box-shadow: 0 2px 3px rgba(50, 50, 50, 0.5);
-
- -moz-border-radius-topleft: 0;
- -webkit-border-top-left-radius: 0;
- border-top-left-radius: 0;
-
- -moz-border-radius-topright: 3px;
- -webkit-border-top-right-radius: 3px;
- border-top-right-radius: 3px;
- -moz-border-radius-bottomright: 3px;
- -webkit-border-bottom-right-radius: 3px;
- border-bottom-right-radius: 3px;
- -moz-border-radius-bottomleft: 3px;
- -webkit-border-bottom-left-radius: 3px;
- border-bottom-left-radius: 3px;
-}
-#menu > ul > li > ul{
- margin-left:-15px;
- margin-top:-15px;
-}
-#menu ul ul li {
- list-style: none;
- padding: 5px 0;
- position: relative;
- border-bottom: 1px solid #cfcfcf;
-}
-#menu ul ul li.last{
- border-bottom: none !important
-}
-#menu ul ul li.menu-last{border-bottom: none;}
-#menu ul ul a{
- display: block;
- padding: 5px 0;
- color: #717171;
- font-size: 12px;
-}
-#menu ul ul a:hover{color: #ff6c00;}
-#menu li:hover {visibility: inherit;}
-#menu li:hover ul,
-#menu li.sfHover ul {
- left: 25px;
- top: 90px;
- z-index: 99;
-}
-#menu li li:hover ul,
-#menu li li.sfHover ul {
- left: 156px;
- top: -2px;
-}
-
-#mainmenu{
- padding:0;
- text-transform: uppercase;
- font-size:11px;
- border-bottom:1px solid #EEE;
- z-index: 1030;
-}
-#mainmenu .active a{
- background-color:transparent;
- color:#FF6C00;
-}
-
-#mainmenu .nav{
- margin:0;
- padding:0;
-}
-#mainmenu #languages{
- position:relative;
- left:19px;
- background-color:#EEE;
-}
-
-
-
-.logo-title,#nav,#product-tab.home a,h2.title,.
-{
- text-transform: uppercase;
- font-weight:bold;
- font-size: 11px;
- height:18px;
-}
-#nav li.open a{
- text-shadow: 0 1px 0 #fff;
-}
-.nav-header{
- color:#000;
-}
-.nav-list > .active > a, .nav-list > .active > a:hover{
- background-color:#999
-}
-.nav-list.below{
- margin-top:15px;
-}
-
-.countItems{
- color:#CCC;
-}
-
-.logo-title{
- color:#8B8B8B;
-}
-.logo-title span{
- color:#000;
-}
-.logo img{
- margin:25px 0
-}
-
-.logon-box {
- list-style-type: none;
- padding-top: 8px;
- z-index:500000;
-}
-
-
-.products-title {
- background-color: #FBFBFB;
- background-image: -moz-linear-gradient(center top , #FFFFFF, #F5F5F5);
- background-repeat: repeat-x;
- /**border: 1px solid #DDDDDD;**/
- border-radius: 3px;
- box-shadow: 0 1px 0 #FFFFFF inset;
- list-style: none outside none;
- margin: 0 0 18px;
- padding: 7px 14px;
-}
-
-.products-title input, textarea, select {
- margin-bottom:0px;
-}
-
-.products-title .widget-label {
- color: #999999;
- display: block;
- font-size: 11px;
- font-weight: bold;
- line-height: 18px;
- padding: 3px 15px;
- text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-}
-
-
-#product-tab.home a,h2.title{
- font-size:16px;
-}
-#product-tab li.active a{
- color:#FF6C00;
-}
-
-
-#product-tab.home a,h2.title{
- font-size:16px;
-}
-#product-tab li.active a{
- color:#FF6C00;
-}
-
-
-#nav li.search_form{
- padding-left:20px;
-}
-
-
-/** mini shopping cart **/
-
- .minicart {
- width: 350px;
- }
-
- .total-box {
- padding: 7px 2px;
- margin: 0 0 0px;
- height: 18px;
- list-style: none;
- background-color: #fbfbfb;
- background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5);
- background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));
- background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5);
- background-image: -o-linear-gradient(top, #ffffff, #f5f5f5);
- background-image: linear-gradient(top, #ffffff, #f5f5f5);
- background-repeat: repeat-x;
- border: 1px solid #ddd;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);
- -webkit-box-shadow: inset 0 1px 0 #ffffff;
- -moz-box-shadow: inset 0 1px 0 #ffffff;
- box-shadow: inset 0 1px 0 #ffffff;
- }
-
- .total-box-label {
- font-size: 12px;
- }
-
- .total-box-price {
- color: #FF8C00;
- font-style: bold;
- }
-
- .total-box-grand-total {
- float:right;
- }
-
- .cartbox {
-
- margin:20px 20px 20px 20px;
-
-
- }
-
- #shoppingcart {
-
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-
- }
-
-
-footer {
- background: none repeat scroll 0 0 #2D3032;
- color: #FFFFFF;
- margin-bottom: 0;
- margin-top: 30px;
- padding-top: 15px;
-}
-
-
-footer h4 {
- font-size: 14px;
- font-weight:bold;
- text-transform: uppercase;
- margin: 0 0 5px 0;
-}
-footer ul{
- list-style-type:square;
- margin:0 0 0 13px;
- padding:4px;
-}
-footer div.company {
- padding-left:10px;
-}
-
-#footer-bottom {
- background: none repeat scroll 0 0 #2D3032;
- color: #FFFFFF;
- font-size: 0.9em;
- padding-left:10px;
- padding-top:10px;
- font-size: 12px;
-}
-
-
-.product-list li{
- min-height:230px;
- background-color:#fff;
-}
-.product-list li .product-box{
- min-height:270px;
- padding:0 8px;
- border:1px solid #eee;
- border-radius: 4px;
- -moz-border-radius: 4px;
- -webkit-border-radius: 4px;
- position: relative;
-}
-.product-list li .product-box img{
- display:block;
- max-height:200px;
- margin:0 auto 5px;
-}
-.product-list li .product-box:hover{
- border:1px solid #ccc;
-}
-.product-list li .product-box h4{
- font-size:12px;
- color: #808080;
- text-shadow:1px 1px #F4F4F4;
-}
-.product-list li .product-box .bottom{
- position: absolute;
- bottom:0;
- right:8px;
- color:#666;
- font-size:12px;
-}
-
-.listing-item {
- width:186px;
-}
-
-/** paragraph title **/
-.p-title {
- color: #FF8C00;
-}
-
-/** paragraph title **/
-.p-title-text {
- color: #000000;
-}
-
-/** fonts **/
-
-
-#main-content h1, h2, h3, h4, h5, h6 {
- color: #333333;
- font-weight: 300;
- margin: 0;
-}
-
-#main-content h1 {
- font-size: 36px;
- line-height: 43px;
- margin: 0 0 10px;
- padding: 0;
-}
-
-
-
-
-
-
-/*** to be revised **/
-
-
-
-#myCarousel.home .carousel-caption {
- position: absolute;
- right: 0;
- bottom: 100px;
- left: 0;
- padding: 10px;
- background: #333;
- background: rgba(0, 0, 0, 0.25);
- width:400px;
- height:103px;
-}
-#myCarousel.home .carousel-control.right {
- right: 20px;
- top:290px;
-}
-#myCarousel.home .carousel-control.left {
- left: 840px;
- top:290px;
-}
-.bg_slider{
- background: url(../img/bg_slider.png) center no-repeat;
- height:18px;
- margin:-17px 0 15px 0;
-}
-
-
-
-.manufactures img{
- text-align:center
-}
-.pagination{
- margin:0;
-}
-.pagination li.active{
- background-color:#eee;
-}
-a.thumbnail:hover{
- border:1px solid #999
-}
-.thumbnails.small{
- margin-top:10px;
-}
-.thumbnails p{
- padding-top:5px;
-}
-ul.social{padding:0;margin:0;list-style:none;}
-ul.social li{float:left;margin-right:10px;}
-.table td.center{
- text-align:center;
-}
-#myModal{width:515px;}
-
-.productMainImage {
- margin-bottom:20px;
-}
-
-/** typeahead search **/
-.tt-dropdown-menu,
-.gist {
- text-align: left;
-}
-
-.typeahead,
-.tt-query,
-.tt-hint {
- width: 250px;
- padding: 8px 12px;
- font-size: 15px;
- line-height: 30px;
- border: 2px solid #ccc;
- outline: none;
-}
-
-.twitter-typeahead {
- vertical-align:top;
-}
-
-.typeahead {
- background-color: #fff;
-}
-
-.typeahead:focus {
- border: 2px solid #0097cf;
-}
-
-.tt-query {
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-
-.tt-hint {
- color: #999
-}
-
-.tt-dropdown-menu {
- width: 276px;
- margin-top: 12px;
- padding: 8px 0;
- background-color: #fff;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, 0.2);
- -webkit-border-radius: 8px;
- -moz-border-radius: 8px;
- border-radius: 8px;
- -webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2);
- -moz-box-shadow: 0 5px 10px rgba(0,0,0,.2);
- box-shadow: 0 5px 10px rgba(0,0,0,.2);
-}
-
-.tt-suggestion {
- padding: 3px 20px;
- font-size: 18px;
- line-height: 24px;
-}
-
-.tt-suggestion.tt-is-under-cursor {
- color: #fff;
- background-color: #0097cf;
-
-}
-
-.tt-suggestion p {
- margin: 0;
+@charset "UTF-8";
+
+@font-face {
+ font-family: 'SalarymanRegular';
+ src: url('../fonts/SALARYMA-webfont.eot');
+ src: url('../fonts/SALARYMA-webfont.eot?#iefix') format('embedded-opentype'),
+ url('../fonts/SALARYMA-webfont.woff') format('woff'),
+ url('../fonts/SALARYMA-webfont.ttf') format('truetype'),
+ url('../fonts/SALARYMA-webfont.svg#SalarymanRegular') format('svg');
+ font-weight: normal;
+ font-style: normal;
+
+}
+
+
+body{
+ font-size: 12px;
+ font-family: 'Open Sans',sans-serif;
+}
+
+
+/* fixes css bootstrap row-fluid broken thumbnails */
+.row-fluid ul.thumbnails li.span12 + li { margin-left : 0px; }
+.row-fluid ul.thumbnails li.span6:nth-child(2n + 3) { margin-left : 0px; }
+.row-fluid ul.thumbnails li.span4:nth-child(3n + 4) { margin-left : 0px; }
+.row-fluid ul.thumbnails li.span3:nth-child(4n + 5) { margin-left : 0px; }
+
+.common-row {
+ margin-left:0px;
+}
+
+a:link,a:visited{
+ color:#666;
+}
+a:hover{
+ color:#EE3C1F;
+ text-decoration:none;
+}
+
+.logoImage {
+ max-width:400px;
+}
+
+
+.logo > h1{
+ font: 24px "SalarymanRegular", Arial, sans-serif;
+ letter-spacing: 0;
+ padding:0;
+ margin-top:20px;
+ color:#a2a1a1;
+}
+
+.lbw{
+ font: 16px "SalarymanRegular", Arial, sans-serif;
+ letter-spacing: 0;
+ padding:0;
+ color:#a2a1a1;
+}
+
+.specialPrice{
+ color:#ff0000;
+}
+
+
+/* Main Menu */
+.res-menu{display: none;}
+.res-menu{
+ width: 100%;
+}
+#menu a {text-shadow: 1px 1px #f4f4f4;}
+#menu ul {margin-left:9px;}
+#menu > ul{
+ display: block;
+ margin-left:0;
+}
+#menu > ul > li{
+ list-style: none;
+ float: left;
+ position: relative;
+}
+#menu > ul > li.first,
+#menu > ul > li:first-child{
+ margin-left: 0;
+}
+#menu > ul > li > a{
+ font-size: 12px;
+ font-weight: 400;
+ color: #555;
+ display: block;
+ padding: 25px;
+ margin-top: -5px;
+}
+
+#menu > ul > li > a .name {display: block; color: #4c4c4c;}
+#menu > ul > li > a .desc {display: block; color: #808080;}
+
+#menu > ul > li > a:hover,
+
+#menu > ul a:hover .name,
+#menu .current .name {color: #ff6c00 !important;}
+
+#menu ul ul{
+ position: absolute;
+ width: 150px;
+ padding: 10px 15px;
+ background: #dfdfdf;
+
+ -webkit-box-shadow: 0px 3px 3px rgba(50, 50, 50, 0.5);
+ -moz-box-shadow: 0px 3px 3px rgba(50, 50, 50, 0.5);
+ box-shadow: 0px 3px 3px rgba(50, 50, 50, 0.5);
+
+ -moz-border-radius-topleft: 0;
+ -webkit-border-top-left-radius: 0;
+ border-top-left-radius: 0;
+ -moz-border-radius-topright: 0;
+ -webkit-border-top-right-radius: 0;
+ border-top-right-radius: 0;
+
+ -moz-border-radius-bottomright: 3px;
+ -webkit-border-bottom-right-radius: 3px;
+ border-bottom-right-radius: 3px;
+ -moz-border-radius-bottomleft: 3px;
+ -webkit-border-bottom-left-radius: 3px;
+ border-bottom-left-radius: 3px;
+
+}
+#menu ul ul ul {
+ -webkit-box-shadow: 0 2px 3px rgba(50, 50, 50, 0.5);
+ -moz-box-shadow: 0 2px 3px rgba(50, 50, 50, 0.5);
+ box-shadow: 0 2px 3px rgba(50, 50, 50, 0.5);
+
+ -moz-border-radius-topleft: 0;
+ -webkit-border-top-left-radius: 0;
+ border-top-left-radius: 0;
+
+ -moz-border-radius-topright: 3px;
+ -webkit-border-top-right-radius: 3px;
+ border-top-right-radius: 3px;
+ -moz-border-radius-bottomright: 3px;
+ -webkit-border-bottom-right-radius: 3px;
+ border-bottom-right-radius: 3px;
+ -moz-border-radius-bottomleft: 3px;
+ -webkit-border-bottom-left-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+#menu > ul > li > ul{
+ margin-left:-15px;
+ margin-top:-15px;
+}
+#menu ul ul li {
+ list-style: none;
+ padding: 5px 0;
+ position: relative;
+ border-bottom: 1px solid #cfcfcf;
+}
+#menu ul ul li.last{
+ border-bottom: none !important
+}
+#menu ul ul li.menu-last{border-bottom: none;}
+#menu ul ul a{
+ display: block;
+ padding: 5px 0;
+ color: #717171;
+ font-size: 12px;
+}
+#menu ul ul a:hover{color: #ff6c00;}
+#menu li:hover {visibility: inherit;}
+#menu li:hover ul,
+#menu li.sfHover ul {
+ left: 25px;
+ top: 90px;
+ z-index: 99;
+}
+#menu li li:hover ul,
+#menu li li.sfHover ul {
+ left: 156px;
+ top: -2px;
+}
+
+#mainmenu{
+ padding:0;
+ text-transform: uppercase;
+ font-size:11px;
+ border-bottom:1px solid #EEE;
+ z-index: 1030;
+}
+#mainmenu .active a{
+ background-color:transparent;
+ color:#FF6C00;
+}
+
+#mainmenu .nav{
+ margin:0;
+ padding:0;
+}
+#mainmenu #languages{
+ position:relative;
+ left:19px;
+ background-color:#EEE;
+}
+
+
+
+.logo-title,#nav,#product-tab.home a,h2.title,.
+{
+ text-transform: uppercase;
+ font-weight:bold;
+ font-size: 11px;
+ height:18px;
+}
+#nav li.open a{
+ text-shadow: 0 1px 0 #fff;
+}
+.nav-header{
+ color:#000;
+}
+.nav-list > .active > a, .nav-list > .active > a:hover{
+ background-color:#999
+}
+.nav-list.below{
+ margin-top:15px;
+}
+
+.countItems{
+ color:#CCC;
+}
+
+.logo-title{
+ color:#8B8B8B;
+}
+.logo-title span{
+ color:#000;
+}
+.logo img{
+ margin:25px 0
+}
+
+.logon-box {
+ list-style-type: none;
+ padding-top: 8px;
+ z-index:500000;
+}
+
+
+.products-title {
+ background-color: #FBFBFB;
+ background-image: -moz-linear-gradient(center top , #FFFFFF, #F5F5F5);
+ background-repeat: repeat-x;
+ /**border: 1px solid #DDDDDD;**/
+ border-radius: 3px;
+ box-shadow: 0 1px 0 #FFFFFF inset;
+ list-style: none outside none;
+ margin: 0 0 18px;
+ padding: 7px 14px;
+}
+
+.products-title input, textarea, select {
+ margin-bottom:0px;
+}
+
+.products-title .widget-label {
+ color: #999999;
+ display: block;
+ font-size: 11px;
+ font-weight: bold;
+ line-height: 18px;
+ padding: 3px 15px;
+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
+}
+
+
+#product-tab.home a,h2.title{
+ font-size:16px;
+}
+#product-tab li.active a{
+ color:#FF6C00;
+}
+
+
+#product-tab.home a,h2.title{
+ font-size:16px;
+}
+#product-tab li.active a{
+ color:#FF6C00;
+}
+
+
+#nav li.search_form{
+ padding-left:20px;
+}
+
+
+/** mini shopping cart **/
+
+ .minicart {
+ width: 350px;
+ }
+
+ .total-box {
+ padding: 7px 2px;
+ margin: 0 0 0px;
+ height: 18px;
+ list-style: none;
+ background-color: #fbfbfb;
+ background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5);
+ background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));
+ background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5);
+ background-image: -o-linear-gradient(top, #ffffff, #f5f5f5);
+ background-image: linear-gradient(top, #ffffff, #f5f5f5);
+ background-repeat: repeat-x;
+ border: 1px solid #ddd;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+ filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);
+ -webkit-box-shadow: inset 0 1px 0 #ffffff;
+ -moz-box-shadow: inset 0 1px 0 #ffffff;
+ box-shadow: inset 0 1px 0 #ffffff;
+ }
+
+ .total-box-label {
+ font-size: 12px;
+ }
+
+ .total-box-price {
+ color: #FF8C00;
+ font-style: bold;
+ }
+
+ .total-box-grand-total {
+ float:right;
+ }
+
+ .cartbox {
+
+ margin:20px 20px 20px 20px;
+
+
+ }
+
+ #shoppingcart {
+
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+
+ }
+
+
+footer {
+ background: none repeat scroll 0 0 #2D3032;
+ color: #FFFFFF;
+ margin-bottom: 0;
+ margin-top: 30px;
+ padding-top: 15px;
+}
+
+
+footer h4 {
+ font-size: 14px;
+ font-weight:bold;
+ text-transform: uppercase;
+ margin: 0 0 5px 0;
+}
+footer ul{
+ list-style-type:square;
+ margin:0 0 0 13px;
+ padding:4px;
+}
+footer div.company {
+ padding-left:10px;
+}
+
+#footer-bottom {
+ background: none repeat scroll 0 0 #2D3032;
+ color: #FFFFFF;
+ font-size: 0.9em;
+ padding-left:10px;
+ padding-top:10px;
+ font-size: 12px;
+}
+
+
+.product-list li{
+ min-height:230px;
+ background-color:#fff;
+}
+.product-list li .product-box{
+ min-height:270px;
+ padding:0 8px;
+ border:1px solid #eee;
+ border-radius: 4px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ position: relative;
+}
+.product-list li .product-box img{
+ display:block;
+ max-height:200px;
+ margin:0 auto 5px;
+}
+.product-list li .product-box:hover{
+ border:1px solid #ccc;
+}
+.product-list li .product-box h4{
+ font-size:12px;
+ color: #808080;
+ text-shadow:1px 1px #F4F4F4;
+}
+.product-list li .product-box .bottom{
+ position: absolute;
+ bottom:0;
+ right:8px;
+ color:#666;
+ font-size:12px;
+}
+
+.listing-item {
+ width:186px;
+}
+
+/** paragraph title **/
+.p-title {
+ color: #FF8C00;
+}
+
+/** paragraph title **/
+.p-title-text {
+ color: #000000;
+}
+
+/** fonts **/
+
+
+#main-content h1, h2, h3, h4, h5, h6 {
+ color: #333333;
+ font-weight: 300;
+ margin: 0;
+}
+
+#main-content h1 {
+ font-size: 36px;
+ line-height: 43px;
+ margin: 0 0 10px;
+ padding: 0;
+}
+
+
+
+
+
+
+/*** to be revised **/
+
+
+
+#myCarousel.home .carousel-caption {
+ position: absolute;
+ right: 0;
+ bottom: 100px;
+ left: 0;
+ padding: 10px;
+ background: #333;
+ background: rgba(0, 0, 0, 0.25);
+ width:400px;
+ height:103px;
+}
+#myCarousel.home .carousel-control.right {
+ right: 20px;
+ top:290px;
+}
+#myCarousel.home .carousel-control.left {
+ left: 840px;
+ top:290px;
+}
+.bg_slider{
+ background: url(../img/bg_slider.png) center no-repeat;
+ height:18px;
+ margin:-17px 0 15px 0;
+}
+
+
+
+.manufactures img{
+ text-align:center
+}
+.pagination{
+ margin:0;
+}
+.pagination li.active{
+ background-color:#eee;
+}
+a.thumbnail:hover{
+ border:1px solid #999
+}
+.thumbnails.small{
+ margin-top:10px;
+}
+.thumbnails p{
+ padding-top:5px;
+}
+ul.social{padding:0;margin:0;list-style:none;}
+ul.social li{float:left;margin-right:10px;}
+.table td.center{
+ text-align:center;
+}
+#myModal{width:515px;}
+
+.productMainImage {
+ margin-bottom:20px;
+}
+
+/** typeahead search **/
+.tt-dropdown-menu,
+.gist {
+ text-align: left;
+}
+
+.typeahead,
+.tt-query,
+.tt-hint {
+ width: 250px;
+ padding: 8px 12px;
+ font-size: 15px;
+ line-height: 30px;
+ border: 2px solid #ccc;
+ outline: none;
+}
+
+.twitter-typeahead {
+ vertical-align:top;
+}
+
+.typeahead {
+ background-color: #fff;
+}
+
+.typeahead:focus {
+ border: 2px solid #0097cf;
+}
+
+.tt-query {
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+
+.tt-hint {
+ color: #999
+}
+
+.tt-dropdown-menu {
+ width: 276px;
+ margin-top: 12px;
+ padding: 8px 0;
+ background-color: #fff;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ -webkit-border-radius: 8px;
+ -moz-border-radius: 8px;
+ border-radius: 8px;
+ -webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2);
+ -moz-box-shadow: 0 5px 10px rgba(0,0,0,.2);
+ box-shadow: 0 5px 10px rgba(0,0,0,.2);
+}
+
+.tt-suggestion {
+ padding: 3px 20px;
+ font-size: 18px;
+ line-height: 24px;
+}
+
+.tt-suggestion.tt-is-under-cursor {
+ color: #fff;
+ background-color: #0097cf;
+
+}
+
+.tt-suggestion p {
+ margin: 0;
}
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/css/animate.css b/sm-shop/src/main/webapp/resources/templates/generic/css/animate.css
new file mode 100644
index 0000000..5709d4c
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/css/animate.css
@@ -0,0 +1,3273 @@
+@charset "UTF-8";
+
+/*!
+Animate.css - http://daneden.me/animate
+Version - 3.4.0
+Licensed under the MIT license - http://opensource.org/licenses/MIT
+
+Copyright (c) 2015 Daniel Eden
+*/
+
+.animated {
+ -webkit-animation-duration: 1s;
+ animation-duration: 1s;
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both;
+}
+
+.animated.infinite {
+ -webkit-animation-iteration-count: infinite;
+ animation-iteration-count: infinite;
+}
+
+.animated.hinge {
+ -webkit-animation-duration: 2s;
+ animation-duration: 2s;
+}
+
+.animated.bounceIn,
+.animated.bounceOut {
+ -webkit-animation-duration: .75s;
+ animation-duration: .75s;
+}
+
+.animated.flipOutX,
+.animated.flipOutY {
+ -webkit-animation-duration: .75s;
+ animation-duration: .75s;
+}
+
+@-webkit-keyframes bounce {
+ from, 20%, 53%, 80%, to {
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ -webkit-transform: translate3d(0,0,0);
+ transform: translate3d(0,0,0);
+ }
+
+ 40%, 43% {
+ -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
+ animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
+ -webkit-transform: translate3d(0, -30px, 0);
+ transform: translate3d(0, -30px, 0);
+ }
+
+ 70% {
+ -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
+ animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
+ -webkit-transform: translate3d(0, -15px, 0);
+ transform: translate3d(0, -15px, 0);
+ }
+
+ 90% {
+ -webkit-transform: translate3d(0,-4px,0);
+ transform: translate3d(0,-4px,0);
+ }
+}
+
+@keyframes bounce {
+ from, 20%, 53%, 80%, to {
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ -webkit-transform: translate3d(0,0,0);
+ transform: translate3d(0,0,0);
+ }
+
+ 40%, 43% {
+ -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
+ animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
+ -webkit-transform: translate3d(0, -30px, 0);
+ transform: translate3d(0, -30px, 0);
+ }
+
+ 70% {
+ -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
+ animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
+ -webkit-transform: translate3d(0, -15px, 0);
+ transform: translate3d(0, -15px, 0);
+ }
+
+ 90% {
+ -webkit-transform: translate3d(0,-4px,0);
+ transform: translate3d(0,-4px,0);
+ }
+}
+
+.bounce {
+ -webkit-animation-name: bounce;
+ animation-name: bounce;
+ -webkit-transform-origin: center bottom;
+ transform-origin: center bottom;
+}
+
+@-webkit-keyframes flash {
+ from, 50%, to {
+ opacity: 1;
+ }
+
+ 25%, 75% {
+ opacity: 0;
+ }
+}
+
+@keyframes flash {
+ from, 50%, to {
+ opacity: 1;
+ }
+
+ 25%, 75% {
+ opacity: 0;
+ }
+}
+
+.flash {
+ -webkit-animation-name: flash;
+ animation-name: flash;
+}
+
+/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
+
+@-webkit-keyframes pulse {
+ from {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+
+ 50% {
+ -webkit-transform: scale3d(1.05, 1.05, 1.05);
+ transform: scale3d(1.05, 1.05, 1.05);
+ }
+
+ to {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+}
+
+@keyframes pulse {
+ from {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+
+ 50% {
+ -webkit-transform: scale3d(1.05, 1.05, 1.05);
+ transform: scale3d(1.05, 1.05, 1.05);
+ }
+
+ to {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+}
+
+.pulse {
+ -webkit-animation-name: pulse;
+ animation-name: pulse;
+}
+
+@-webkit-keyframes rubberBand {
+ from {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+
+ 30% {
+ -webkit-transform: scale3d(1.25, 0.75, 1);
+ transform: scale3d(1.25, 0.75, 1);
+ }
+
+ 40% {
+ -webkit-transform: scale3d(0.75, 1.25, 1);
+ transform: scale3d(0.75, 1.25, 1);
+ }
+
+ 50% {
+ -webkit-transform: scale3d(1.15, 0.85, 1);
+ transform: scale3d(1.15, 0.85, 1);
+ }
+
+ 65% {
+ -webkit-transform: scale3d(.95, 1.05, 1);
+ transform: scale3d(.95, 1.05, 1);
+ }
+
+ 75% {
+ -webkit-transform: scale3d(1.05, .95, 1);
+ transform: scale3d(1.05, .95, 1);
+ }
+
+ to {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+}
+
+@keyframes rubberBand {
+ from {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+
+ 30% {
+ -webkit-transform: scale3d(1.25, 0.75, 1);
+ transform: scale3d(1.25, 0.75, 1);
+ }
+
+ 40% {
+ -webkit-transform: scale3d(0.75, 1.25, 1);
+ transform: scale3d(0.75, 1.25, 1);
+ }
+
+ 50% {
+ -webkit-transform: scale3d(1.15, 0.85, 1);
+ transform: scale3d(1.15, 0.85, 1);
+ }
+
+ 65% {
+ -webkit-transform: scale3d(.95, 1.05, 1);
+ transform: scale3d(.95, 1.05, 1);
+ }
+
+ 75% {
+ -webkit-transform: scale3d(1.05, .95, 1);
+ transform: scale3d(1.05, .95, 1);
+ }
+
+ to {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+}
+
+.rubberBand {
+ -webkit-animation-name: rubberBand;
+ animation-name: rubberBand;
+}
+
+@-webkit-keyframes shake {
+ from, to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ 10%, 30%, 50%, 70%, 90% {
+ -webkit-transform: translate3d(-10px, 0, 0);
+ transform: translate3d(-10px, 0, 0);
+ }
+
+ 20%, 40%, 60%, 80% {
+ -webkit-transform: translate3d(10px, 0, 0);
+ transform: translate3d(10px, 0, 0);
+ }
+}
+
+@keyframes shake {
+ from, to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ 10%, 30%, 50%, 70%, 90% {
+ -webkit-transform: translate3d(-10px, 0, 0);
+ transform: translate3d(-10px, 0, 0);
+ }
+
+ 20%, 40%, 60%, 80% {
+ -webkit-transform: translate3d(10px, 0, 0);
+ transform: translate3d(10px, 0, 0);
+ }
+}
+
+.shake {
+ -webkit-animation-name: shake;
+ animation-name: shake;
+}
+
+@-webkit-keyframes swing {
+ 20% {
+ -webkit-transform: rotate3d(0, 0, 1, 15deg);
+ transform: rotate3d(0, 0, 1, 15deg);
+ }
+
+ 40% {
+ -webkit-transform: rotate3d(0, 0, 1, -10deg);
+ transform: rotate3d(0, 0, 1, -10deg);
+ }
+
+ 60% {
+ -webkit-transform: rotate3d(0, 0, 1, 5deg);
+ transform: rotate3d(0, 0, 1, 5deg);
+ }
+
+ 80% {
+ -webkit-transform: rotate3d(0, 0, 1, -5deg);
+ transform: rotate3d(0, 0, 1, -5deg);
+ }
+
+ to {
+ -webkit-transform: rotate3d(0, 0, 1, 0deg);
+ transform: rotate3d(0, 0, 1, 0deg);
+ }
+}
+
+@keyframes swing {
+ 20% {
+ -webkit-transform: rotate3d(0, 0, 1, 15deg);
+ transform: rotate3d(0, 0, 1, 15deg);
+ }
+
+ 40% {
+ -webkit-transform: rotate3d(0, 0, 1, -10deg);
+ transform: rotate3d(0, 0, 1, -10deg);
+ }
+
+ 60% {
+ -webkit-transform: rotate3d(0, 0, 1, 5deg);
+ transform: rotate3d(0, 0, 1, 5deg);
+ }
+
+ 80% {
+ -webkit-transform: rotate3d(0, 0, 1, -5deg);
+ transform: rotate3d(0, 0, 1, -5deg);
+ }
+
+ to {
+ -webkit-transform: rotate3d(0, 0, 1, 0deg);
+ transform: rotate3d(0, 0, 1, 0deg);
+ }
+}
+
+.swing {
+ -webkit-transform-origin: top center;
+ transform-origin: top center;
+ -webkit-animation-name: swing;
+ animation-name: swing;
+}
+
+@-webkit-keyframes tada {
+ from {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+
+ 10%, 20% {
+ -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);
+ transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);
+ }
+
+ 30%, 50%, 70%, 90% {
+ -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);
+ transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);
+ }
+
+ 40%, 60%, 80% {
+ -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);
+ transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);
+ }
+
+ to {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+}
+
+@keyframes tada {
+ from {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+
+ 10%, 20% {
+ -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);
+ transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);
+ }
+
+ 30%, 50%, 70%, 90% {
+ -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);
+ transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);
+ }
+
+ 40%, 60%, 80% {
+ -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);
+ transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);
+ }
+
+ to {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+}
+
+.tada {
+ -webkit-animation-name: tada;
+ animation-name: tada;
+}
+
+/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
+
+@-webkit-keyframes wobble {
+ from {
+ -webkit-transform: none;
+ transform: none;
+ }
+
+ 15% {
+ -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
+ transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
+ }
+
+ 30% {
+ -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
+ transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
+ }
+
+ 45% {
+ -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
+ transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
+ }
+
+ 60% {
+ -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
+ transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
+ }
+
+ 75% {
+ -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
+ transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
+ }
+
+ to {
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+@keyframes wobble {
+ from {
+ -webkit-transform: none;
+ transform: none;
+ }
+
+ 15% {
+ -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
+ transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
+ }
+
+ 30% {
+ -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
+ transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
+ }
+
+ 45% {
+ -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
+ transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
+ }
+
+ 60% {
+ -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
+ transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
+ }
+
+ 75% {
+ -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
+ transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
+ }
+
+ to {
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+.wobble {
+ -webkit-animation-name: wobble;
+ animation-name: wobble;
+}
+
+@-webkit-keyframes jello {
+ from, 11.1%, to {
+ -webkit-transform: none;
+ transform: none;
+ }
+
+ 22.2% {
+ -webkit-transform: skewX(-12.5deg) skewY(-12.5deg);
+ transform: skewX(-12.5deg) skewY(-12.5deg);
+ }
+
+ 33.3% {
+ -webkit-transform: skewX(6.25deg) skewY(6.25deg);
+ transform: skewX(6.25deg) skewY(6.25deg);
+ }
+
+ 44.4% {
+ -webkit-transform: skewX(-3.125deg) skewY(-3.125deg);
+ transform: skewX(-3.125deg) skewY(-3.125deg);
+ }
+
+ 55.5% {
+ -webkit-transform: skewX(1.5625deg) skewY(1.5625deg);
+ transform: skewX(1.5625deg) skewY(1.5625deg);
+ }
+
+ 66.6% {
+ -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg);
+ transform: skewX(-0.78125deg) skewY(-0.78125deg);
+ }
+
+ 77.7% {
+ -webkit-transform: skewX(0.390625deg) skewY(0.390625deg);
+ transform: skewX(0.390625deg) skewY(0.390625deg);
+ }
+
+ 88.8% {
+ -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg);
+ transform: skewX(-0.1953125deg) skewY(-0.1953125deg);
+ }
+}
+
+@keyframes jello {
+ from, 11.1%, to {
+ -webkit-transform: none;
+ transform: none;
+ }
+
+ 22.2% {
+ -webkit-transform: skewX(-12.5deg) skewY(-12.5deg);
+ transform: skewX(-12.5deg) skewY(-12.5deg);
+ }
+
+ 33.3% {
+ -webkit-transform: skewX(6.25deg) skewY(6.25deg);
+ transform: skewX(6.25deg) skewY(6.25deg);
+ }
+
+ 44.4% {
+ -webkit-transform: skewX(-3.125deg) skewY(-3.125deg);
+ transform: skewX(-3.125deg) skewY(-3.125deg);
+ }
+
+ 55.5% {
+ -webkit-transform: skewX(1.5625deg) skewY(1.5625deg);
+ transform: skewX(1.5625deg) skewY(1.5625deg);
+ }
+
+ 66.6% {
+ -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg);
+ transform: skewX(-0.78125deg) skewY(-0.78125deg);
+ }
+
+ 77.7% {
+ -webkit-transform: skewX(0.390625deg) skewY(0.390625deg);
+ transform: skewX(0.390625deg) skewY(0.390625deg);
+ }
+
+ 88.8% {
+ -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg);
+ transform: skewX(-0.1953125deg) skewY(-0.1953125deg);
+ }
+}
+
+.jello {
+ -webkit-animation-name: jello;
+ animation-name: jello;
+ -webkit-transform-origin: center;
+ transform-origin: center;
+}
+
+@-webkit-keyframes bounceIn {
+ from, 20%, 40%, 60%, 80%, to {
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ }
+
+ 0% {
+ opacity: 0;
+ -webkit-transform: scale3d(.3, .3, .3);
+ transform: scale3d(.3, .3, .3);
+ }
+
+ 20% {
+ -webkit-transform: scale3d(1.1, 1.1, 1.1);
+ transform: scale3d(1.1, 1.1, 1.1);
+ }
+
+ 40% {
+ -webkit-transform: scale3d(.9, .9, .9);
+ transform: scale3d(.9, .9, .9);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(1.03, 1.03, 1.03);
+ transform: scale3d(1.03, 1.03, 1.03);
+ }
+
+ 80% {
+ -webkit-transform: scale3d(.97, .97, .97);
+ transform: scale3d(.97, .97, .97);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+}
+
+@keyframes bounceIn {
+ from, 20%, 40%, 60%, 80%, to {
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ }
+
+ 0% {
+ opacity: 0;
+ -webkit-transform: scale3d(.3, .3, .3);
+ transform: scale3d(.3, .3, .3);
+ }
+
+ 20% {
+ -webkit-transform: scale3d(1.1, 1.1, 1.1);
+ transform: scale3d(1.1, 1.1, 1.1);
+ }
+
+ 40% {
+ -webkit-transform: scale3d(.9, .9, .9);
+ transform: scale3d(.9, .9, .9);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(1.03, 1.03, 1.03);
+ transform: scale3d(1.03, 1.03, 1.03);
+ }
+
+ 80% {
+ -webkit-transform: scale3d(.97, .97, .97);
+ transform: scale3d(.97, .97, .97);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+}
+
+.bounceIn {
+ -webkit-animation-name: bounceIn;
+ animation-name: bounceIn;
+}
+
+@-webkit-keyframes bounceInDown {
+ from, 60%, 75%, 90%, to {
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ }
+
+ 0% {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -3000px, 0);
+ transform: translate3d(0, -3000px, 0);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 25px, 0);
+ transform: translate3d(0, 25px, 0);
+ }
+
+ 75% {
+ -webkit-transform: translate3d(0, -10px, 0);
+ transform: translate3d(0, -10px, 0);
+ }
+
+ 90% {
+ -webkit-transform: translate3d(0, 5px, 0);
+ transform: translate3d(0, 5px, 0);
+ }
+
+ to {
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+@keyframes bounceInDown {
+ from, 60%, 75%, 90%, to {
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ }
+
+ 0% {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -3000px, 0);
+ transform: translate3d(0, -3000px, 0);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 25px, 0);
+ transform: translate3d(0, 25px, 0);
+ }
+
+ 75% {
+ -webkit-transform: translate3d(0, -10px, 0);
+ transform: translate3d(0, -10px, 0);
+ }
+
+ 90% {
+ -webkit-transform: translate3d(0, 5px, 0);
+ transform: translate3d(0, 5px, 0);
+ }
+
+ to {
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+.bounceInDown {
+ -webkit-animation-name: bounceInDown;
+ animation-name: bounceInDown;
+}
+
+@-webkit-keyframes bounceInLeft {
+ from, 60%, 75%, 90%, to {
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ }
+
+ 0% {
+ opacity: 0;
+ -webkit-transform: translate3d(-3000px, 0, 0);
+ transform: translate3d(-3000px, 0, 0);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translate3d(25px, 0, 0);
+ transform: translate3d(25px, 0, 0);
+ }
+
+ 75% {
+ -webkit-transform: translate3d(-10px, 0, 0);
+ transform: translate3d(-10px, 0, 0);
+ }
+
+ 90% {
+ -webkit-transform: translate3d(5px, 0, 0);
+ transform: translate3d(5px, 0, 0);
+ }
+
+ to {
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+@keyframes bounceInLeft {
+ from, 60%, 75%, 90%, to {
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ }
+
+ 0% {
+ opacity: 0;
+ -webkit-transform: translate3d(-3000px, 0, 0);
+ transform: translate3d(-3000px, 0, 0);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translate3d(25px, 0, 0);
+ transform: translate3d(25px, 0, 0);
+ }
+
+ 75% {
+ -webkit-transform: translate3d(-10px, 0, 0);
+ transform: translate3d(-10px, 0, 0);
+ }
+
+ 90% {
+ -webkit-transform: translate3d(5px, 0, 0);
+ transform: translate3d(5px, 0, 0);
+ }
+
+ to {
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+.bounceInLeft {
+ -webkit-animation-name: bounceInLeft;
+ animation-name: bounceInLeft;
+}
+
+@-webkit-keyframes bounceInRight {
+ from, 60%, 75%, 90%, to {
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ }
+
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(3000px, 0, 0);
+ transform: translate3d(3000px, 0, 0);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translate3d(-25px, 0, 0);
+ transform: translate3d(-25px, 0, 0);
+ }
+
+ 75% {
+ -webkit-transform: translate3d(10px, 0, 0);
+ transform: translate3d(10px, 0, 0);
+ }
+
+ 90% {
+ -webkit-transform: translate3d(-5px, 0, 0);
+ transform: translate3d(-5px, 0, 0);
+ }
+
+ to {
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+@keyframes bounceInRight {
+ from, 60%, 75%, 90%, to {
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ }
+
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(3000px, 0, 0);
+ transform: translate3d(3000px, 0, 0);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translate3d(-25px, 0, 0);
+ transform: translate3d(-25px, 0, 0);
+ }
+
+ 75% {
+ -webkit-transform: translate3d(10px, 0, 0);
+ transform: translate3d(10px, 0, 0);
+ }
+
+ 90% {
+ -webkit-transform: translate3d(-5px, 0, 0);
+ transform: translate3d(-5px, 0, 0);
+ }
+
+ to {
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+.bounceInRight {
+ -webkit-animation-name: bounceInRight;
+ animation-name: bounceInRight;
+}
+
+@-webkit-keyframes bounceInUp {
+ from, 60%, 75%, 90%, to {
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ }
+
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 3000px, 0);
+ transform: translate3d(0, 3000px, 0);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translate3d(0, -20px, 0);
+ transform: translate3d(0, -20px, 0);
+ }
+
+ 75% {
+ -webkit-transform: translate3d(0, 10px, 0);
+ transform: translate3d(0, 10px, 0);
+ }
+
+ 90% {
+ -webkit-transform: translate3d(0, -5px, 0);
+ transform: translate3d(0, -5px, 0);
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+@keyframes bounceInUp {
+ from, 60%, 75%, 90%, to {
+ -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+ }
+
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 3000px, 0);
+ transform: translate3d(0, 3000px, 0);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: translate3d(0, -20px, 0);
+ transform: translate3d(0, -20px, 0);
+ }
+
+ 75% {
+ -webkit-transform: translate3d(0, 10px, 0);
+ transform: translate3d(0, 10px, 0);
+ }
+
+ 90% {
+ -webkit-transform: translate3d(0, -5px, 0);
+ transform: translate3d(0, -5px, 0);
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+.bounceInUp {
+ -webkit-animation-name: bounceInUp;
+ animation-name: bounceInUp;
+}
+
+@-webkit-keyframes bounceOut {
+ 20% {
+ -webkit-transform: scale3d(.9, .9, .9);
+ transform: scale3d(.9, .9, .9);
+ }
+
+ 50%, 55% {
+ opacity: 1;
+ -webkit-transform: scale3d(1.1, 1.1, 1.1);
+ transform: scale3d(1.1, 1.1, 1.1);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: scale3d(.3, .3, .3);
+ transform: scale3d(.3, .3, .3);
+ }
+}
+
+@keyframes bounceOut {
+ 20% {
+ -webkit-transform: scale3d(.9, .9, .9);
+ transform: scale3d(.9, .9, .9);
+ }
+
+ 50%, 55% {
+ opacity: 1;
+ -webkit-transform: scale3d(1.1, 1.1, 1.1);
+ transform: scale3d(1.1, 1.1, 1.1);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: scale3d(.3, .3, .3);
+ transform: scale3d(.3, .3, .3);
+ }
+}
+
+.bounceOut {
+ -webkit-animation-name: bounceOut;
+ animation-name: bounceOut;
+}
+
+@-webkit-keyframes bounceOutDown {
+ 20% {
+ -webkit-transform: translate3d(0, 10px, 0);
+ transform: translate3d(0, 10px, 0);
+ }
+
+ 40%, 45% {
+ opacity: 1;
+ -webkit-transform: translate3d(0, -20px, 0);
+ transform: translate3d(0, -20px, 0);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 2000px, 0);
+ transform: translate3d(0, 2000px, 0);
+ }
+}
+
+@keyframes bounceOutDown {
+ 20% {
+ -webkit-transform: translate3d(0, 10px, 0);
+ transform: translate3d(0, 10px, 0);
+ }
+
+ 40%, 45% {
+ opacity: 1;
+ -webkit-transform: translate3d(0, -20px, 0);
+ transform: translate3d(0, -20px, 0);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 2000px, 0);
+ transform: translate3d(0, 2000px, 0);
+ }
+}
+
+.bounceOutDown {
+ -webkit-animation-name: bounceOutDown;
+ animation-name: bounceOutDown;
+}
+
+@-webkit-keyframes bounceOutLeft {
+ 20% {
+ opacity: 1;
+ -webkit-transform: translate3d(20px, 0, 0);
+ transform: translate3d(20px, 0, 0);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(-2000px, 0, 0);
+ transform: translate3d(-2000px, 0, 0);
+ }
+}
+
+@keyframes bounceOutLeft {
+ 20% {
+ opacity: 1;
+ -webkit-transform: translate3d(20px, 0, 0);
+ transform: translate3d(20px, 0, 0);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(-2000px, 0, 0);
+ transform: translate3d(-2000px, 0, 0);
+ }
+}
+
+.bounceOutLeft {
+ -webkit-animation-name: bounceOutLeft;
+ animation-name: bounceOutLeft;
+}
+
+@-webkit-keyframes bounceOutRight {
+ 20% {
+ opacity: 1;
+ -webkit-transform: translate3d(-20px, 0, 0);
+ transform: translate3d(-20px, 0, 0);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(2000px, 0, 0);
+ transform: translate3d(2000px, 0, 0);
+ }
+}
+
+@keyframes bounceOutRight {
+ 20% {
+ opacity: 1;
+ -webkit-transform: translate3d(-20px, 0, 0);
+ transform: translate3d(-20px, 0, 0);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(2000px, 0, 0);
+ transform: translate3d(2000px, 0, 0);
+ }
+}
+
+.bounceOutRight {
+ -webkit-animation-name: bounceOutRight;
+ animation-name: bounceOutRight;
+}
+
+@-webkit-keyframes bounceOutUp {
+ 20% {
+ -webkit-transform: translate3d(0, -10px, 0);
+ transform: translate3d(0, -10px, 0);
+ }
+
+ 40%, 45% {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 20px, 0);
+ transform: translate3d(0, 20px, 0);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -2000px, 0);
+ transform: translate3d(0, -2000px, 0);
+ }
+}
+
+@keyframes bounceOutUp {
+ 20% {
+ -webkit-transform: translate3d(0, -10px, 0);
+ transform: translate3d(0, -10px, 0);
+ }
+
+ 40%, 45% {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 20px, 0);
+ transform: translate3d(0, 20px, 0);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -2000px, 0);
+ transform: translate3d(0, -2000px, 0);
+ }
+}
+
+.bounceOutUp {
+ -webkit-animation-name: bounceOutUp;
+ animation-name: bounceOutUp;
+}
+
+@-webkit-keyframes fadeIn {
+ from {
+ opacity: 0;
+ }
+
+ to {
+ opacity: 1;
+ }
+}
+
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ }
+
+ to {
+ opacity: 1;
+ }
+}
+
+.fadeIn {
+ -webkit-animation-name: fadeIn;
+ animation-name: fadeIn;
+}
+
+@-webkit-keyframes fadeInDown {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -100%, 0);
+ transform: translate3d(0, -100%, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+@keyframes fadeInDown {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -100%, 0);
+ transform: translate3d(0, -100%, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+.fadeInDown {
+ -webkit-animation-name: fadeInDown;
+ animation-name: fadeInDown;
+}
+
+@-webkit-keyframes fadeInDownBig {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -2000px, 0);
+ transform: translate3d(0, -2000px, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+@keyframes fadeInDownBig {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -2000px, 0);
+ transform: translate3d(0, -2000px, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+.fadeInDownBig {
+ -webkit-animation-name: fadeInDownBig;
+ animation-name: fadeInDownBig;
+}
+
+@-webkit-keyframes fadeInLeft {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+@keyframes fadeInLeft {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+.fadeInLeft {
+ -webkit-animation-name: fadeInLeft;
+ animation-name: fadeInLeft;
+}
+
+@-webkit-keyframes fadeInLeftBig {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(-2000px, 0, 0);
+ transform: translate3d(-2000px, 0, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+@keyframes fadeInLeftBig {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(-2000px, 0, 0);
+ transform: translate3d(-2000px, 0, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+.fadeInLeftBig {
+ -webkit-animation-name: fadeInLeftBig;
+ animation-name: fadeInLeftBig;
+}
+
+@-webkit-keyframes fadeInRight {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+@keyframes fadeInRight {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+.fadeInRight {
+ -webkit-animation-name: fadeInRight;
+ animation-name: fadeInRight;
+}
+
+@-webkit-keyframes fadeInRightBig {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(2000px, 0, 0);
+ transform: translate3d(2000px, 0, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+@keyframes fadeInRightBig {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(2000px, 0, 0);
+ transform: translate3d(2000px, 0, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+.fadeInRightBig {
+ -webkit-animation-name: fadeInRightBig;
+ animation-name: fadeInRightBig;
+}
+
+@-webkit-keyframes fadeInUp {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+@keyframes fadeInUp {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+.fadeInUp {
+ -webkit-animation-name: fadeInUp;
+ animation-name: fadeInUp;
+}
+
+@-webkit-keyframes fadeInUpBig {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 2000px, 0);
+ transform: translate3d(0, 2000px, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+@keyframes fadeInUpBig {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 2000px, 0);
+ transform: translate3d(0, 2000px, 0);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+.fadeInUpBig {
+ -webkit-animation-name: fadeInUpBig;
+ animation-name: fadeInUpBig;
+}
+
+@-webkit-keyframes fadeOut {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ }
+}
+
+@keyframes fadeOut {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ }
+}
+
+.fadeOut {
+ -webkit-animation-name: fadeOut;
+ animation-name: fadeOut;
+}
+
+@-webkit-keyframes fadeOutDown {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ }
+}
+
+@keyframes fadeOutDown {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ }
+}
+
+.fadeOutDown {
+ -webkit-animation-name: fadeOutDown;
+ animation-name: fadeOutDown;
+}
+
+@-webkit-keyframes fadeOutDownBig {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 2000px, 0);
+ transform: translate3d(0, 2000px, 0);
+ }
+}
+
+@keyframes fadeOutDownBig {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 2000px, 0);
+ transform: translate3d(0, 2000px, 0);
+ }
+}
+
+.fadeOutDownBig {
+ -webkit-animation-name: fadeOutDownBig;
+ animation-name: fadeOutDownBig;
+}
+
+@-webkit-keyframes fadeOutLeft {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+ }
+}
+
+@keyframes fadeOutLeft {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+ }
+}
+
+.fadeOutLeft {
+ -webkit-animation-name: fadeOutLeft;
+ animation-name: fadeOutLeft;
+}
+
+@-webkit-keyframes fadeOutLeftBig {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(-2000px, 0, 0);
+ transform: translate3d(-2000px, 0, 0);
+ }
+}
+
+@keyframes fadeOutLeftBig {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(-2000px, 0, 0);
+ transform: translate3d(-2000px, 0, 0);
+ }
+}
+
+.fadeOutLeftBig {
+ -webkit-animation-name: fadeOutLeftBig;
+ animation-name: fadeOutLeftBig;
+}
+
+@-webkit-keyframes fadeOutRight {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+ }
+}
+
+@keyframes fadeOutRight {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+ }
+}
+
+.fadeOutRight {
+ -webkit-animation-name: fadeOutRight;
+ animation-name: fadeOutRight;
+}
+
+@-webkit-keyframes fadeOutRightBig {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(2000px, 0, 0);
+ transform: translate3d(2000px, 0, 0);
+ }
+}
+
+@keyframes fadeOutRightBig {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(2000px, 0, 0);
+ transform: translate3d(2000px, 0, 0);
+ }
+}
+
+.fadeOutRightBig {
+ -webkit-animation-name: fadeOutRightBig;
+ animation-name: fadeOutRightBig;
+}
+
+@-webkit-keyframes fadeOutUp {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -100%, 0);
+ transform: translate3d(0, -100%, 0);
+ }
+}
+
+@keyframes fadeOutUp {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -100%, 0);
+ transform: translate3d(0, -100%, 0);
+ }
+}
+
+.fadeOutUp {
+ -webkit-animation-name: fadeOutUp;
+ animation-name: fadeOutUp;
+}
+
+@-webkit-keyframes fadeOutUpBig {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -2000px, 0);
+ transform: translate3d(0, -2000px, 0);
+ }
+}
+
+@keyframes fadeOutUpBig {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -2000px, 0);
+ transform: translate3d(0, -2000px, 0);
+ }
+}
+
+.fadeOutUpBig {
+ -webkit-animation-name: fadeOutUpBig;
+ animation-name: fadeOutUpBig;
+}
+
+@-webkit-keyframes flip {
+ from {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, -360deg);
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+ }
+
+ 40% {
+ -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);
+ transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+ }
+
+ 50% {
+ -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);
+ transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+
+ 80% {
+ -webkit-transform: perspective(400px) scale3d(.95, .95, .95);
+ transform: perspective(400px) scale3d(.95, .95, .95);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+
+ to {
+ -webkit-transform: perspective(400px);
+ transform: perspective(400px);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+}
+
+@keyframes flip {
+ from {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, -360deg);
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+ }
+
+ 40% {
+ -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);
+ transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+ }
+
+ 50% {
+ -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);
+ transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+
+ 80% {
+ -webkit-transform: perspective(400px) scale3d(.95, .95, .95);
+ transform: perspective(400px) scale3d(.95, .95, .95);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+
+ to {
+ -webkit-transform: perspective(400px);
+ transform: perspective(400px);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+}
+
+.animated.flip {
+ -webkit-backface-visibility: visible;
+ backface-visibility: visible;
+ -webkit-animation-name: flip;
+ animation-name: flip;
+}
+
+@-webkit-keyframes flipInX {
+ from {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+ transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ opacity: 0;
+ }
+
+ 40% {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+ transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+
+ 60% {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
+ transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
+ opacity: 1;
+ }
+
+ 80% {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
+ transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
+ }
+
+ to {
+ -webkit-transform: perspective(400px);
+ transform: perspective(400px);
+ }
+}
+
+@keyframes flipInX {
+ from {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+ transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ opacity: 0;
+ }
+
+ 40% {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+ transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+
+ 60% {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
+ transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
+ opacity: 1;
+ }
+
+ 80% {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
+ transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
+ }
+
+ to {
+ -webkit-transform: perspective(400px);
+ transform: perspective(400px);
+ }
+}
+
+.flipInX {
+ -webkit-backface-visibility: visible !important;
+ backface-visibility: visible !important;
+ -webkit-animation-name: flipInX;
+ animation-name: flipInX;
+}
+
+@-webkit-keyframes flipInY {
+ from {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ opacity: 0;
+ }
+
+ 40% {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+
+ 60% {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
+ opacity: 1;
+ }
+
+ 80% {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
+ }
+
+ to {
+ -webkit-transform: perspective(400px);
+ transform: perspective(400px);
+ }
+}
+
+@keyframes flipInY {
+ from {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ opacity: 0;
+ }
+
+ 40% {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+ }
+
+ 60% {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
+ opacity: 1;
+ }
+
+ 80% {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
+ }
+
+ to {
+ -webkit-transform: perspective(400px);
+ transform: perspective(400px);
+ }
+}
+
+.flipInY {
+ -webkit-backface-visibility: visible !important;
+ backface-visibility: visible !important;
+ -webkit-animation-name: flipInY;
+ animation-name: flipInY;
+}
+
+@-webkit-keyframes flipOutX {
+ from {
+ -webkit-transform: perspective(400px);
+ transform: perspective(400px);
+ }
+
+ 30% {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+ transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+ transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+ opacity: 0;
+ }
+}
+
+@keyframes flipOutX {
+ from {
+ -webkit-transform: perspective(400px);
+ transform: perspective(400px);
+ }
+
+ 30% {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+ transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+ transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+ opacity: 0;
+ }
+}
+
+.flipOutX {
+ -webkit-animation-name: flipOutX;
+ animation-name: flipOutX;
+ -webkit-backface-visibility: visible !important;
+ backface-visibility: visible !important;
+}
+
+@-webkit-keyframes flipOutY {
+ from {
+ -webkit-transform: perspective(400px);
+ transform: perspective(400px);
+ }
+
+ 30% {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, -15deg);
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
+ opacity: 0;
+ }
+}
+
+@keyframes flipOutY {
+ from {
+ -webkit-transform: perspective(400px);
+ transform: perspective(400px);
+ }
+
+ 30% {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, -15deg);
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
+ transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
+ opacity: 0;
+ }
+}
+
+.flipOutY {
+ -webkit-backface-visibility: visible !important;
+ backface-visibility: visible !important;
+ -webkit-animation-name: flipOutY;
+ animation-name: flipOutY;
+}
+
+@-webkit-keyframes lightSpeedIn {
+ from {
+ -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);
+ transform: translate3d(100%, 0, 0) skewX(-30deg);
+ opacity: 0;
+ }
+
+ 60% {
+ -webkit-transform: skewX(20deg);
+ transform: skewX(20deg);
+ opacity: 1;
+ }
+
+ 80% {
+ -webkit-transform: skewX(-5deg);
+ transform: skewX(-5deg);
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform: none;
+ transform: none;
+ opacity: 1;
+ }
+}
+
+@keyframes lightSpeedIn {
+ from {
+ -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);
+ transform: translate3d(100%, 0, 0) skewX(-30deg);
+ opacity: 0;
+ }
+
+ 60% {
+ -webkit-transform: skewX(20deg);
+ transform: skewX(20deg);
+ opacity: 1;
+ }
+
+ 80% {
+ -webkit-transform: skewX(-5deg);
+ transform: skewX(-5deg);
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform: none;
+ transform: none;
+ opacity: 1;
+ }
+}
+
+.lightSpeedIn {
+ -webkit-animation-name: lightSpeedIn;
+ animation-name: lightSpeedIn;
+ -webkit-animation-timing-function: ease-out;
+ animation-timing-function: ease-out;
+}
+
+@-webkit-keyframes lightSpeedOut {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);
+ transform: translate3d(100%, 0, 0) skewX(30deg);
+ opacity: 0;
+ }
+}
+
+@keyframes lightSpeedOut {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);
+ transform: translate3d(100%, 0, 0) skewX(30deg);
+ opacity: 0;
+ }
+}
+
+.lightSpeedOut {
+ -webkit-animation-name: lightSpeedOut;
+ animation-name: lightSpeedOut;
+ -webkit-animation-timing-function: ease-in;
+ animation-timing-function: ease-in;
+}
+
+@-webkit-keyframes rotateIn {
+ from {
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ -webkit-transform: rotate3d(0, 0, 1, -200deg);
+ transform: rotate3d(0, 0, 1, -200deg);
+ opacity: 0;
+ }
+
+ to {
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ -webkit-transform: none;
+ transform: none;
+ opacity: 1;
+ }
+}
+
+@keyframes rotateIn {
+ from {
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ -webkit-transform: rotate3d(0, 0, 1, -200deg);
+ transform: rotate3d(0, 0, 1, -200deg);
+ opacity: 0;
+ }
+
+ to {
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ -webkit-transform: none;
+ transform: none;
+ opacity: 1;
+ }
+}
+
+.rotateIn {
+ -webkit-animation-name: rotateIn;
+ animation-name: rotateIn;
+}
+
+@-webkit-keyframes rotateInDownLeft {
+ from {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate3d(0, 0, 1, -45deg);
+ transform: rotate3d(0, 0, 1, -45deg);
+ opacity: 0;
+ }
+
+ to {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: none;
+ transform: none;
+ opacity: 1;
+ }
+}
+
+@keyframes rotateInDownLeft {
+ from {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate3d(0, 0, 1, -45deg);
+ transform: rotate3d(0, 0, 1, -45deg);
+ opacity: 0;
+ }
+
+ to {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: none;
+ transform: none;
+ opacity: 1;
+ }
+}
+
+.rotateInDownLeft {
+ -webkit-animation-name: rotateInDownLeft;
+ animation-name: rotateInDownLeft;
+}
+
+@-webkit-keyframes rotateInDownRight {
+ from {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate3d(0, 0, 1, 45deg);
+ transform: rotate3d(0, 0, 1, 45deg);
+ opacity: 0;
+ }
+
+ to {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: none;
+ transform: none;
+ opacity: 1;
+ }
+}
+
+@keyframes rotateInDownRight {
+ from {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate3d(0, 0, 1, 45deg);
+ transform: rotate3d(0, 0, 1, 45deg);
+ opacity: 0;
+ }
+
+ to {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: none;
+ transform: none;
+ opacity: 1;
+ }
+}
+
+.rotateInDownRight {
+ -webkit-animation-name: rotateInDownRight;
+ animation-name: rotateInDownRight;
+}
+
+@-webkit-keyframes rotateInUpLeft {
+ from {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate3d(0, 0, 1, 45deg);
+ transform: rotate3d(0, 0, 1, 45deg);
+ opacity: 0;
+ }
+
+ to {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: none;
+ transform: none;
+ opacity: 1;
+ }
+}
+
+@keyframes rotateInUpLeft {
+ from {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate3d(0, 0, 1, 45deg);
+ transform: rotate3d(0, 0, 1, 45deg);
+ opacity: 0;
+ }
+
+ to {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: none;
+ transform: none;
+ opacity: 1;
+ }
+}
+
+.rotateInUpLeft {
+ -webkit-animation-name: rotateInUpLeft;
+ animation-name: rotateInUpLeft;
+}
+
+@-webkit-keyframes rotateInUpRight {
+ from {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate3d(0, 0, 1, -90deg);
+ transform: rotate3d(0, 0, 1, -90deg);
+ opacity: 0;
+ }
+
+ to {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: none;
+ transform: none;
+ opacity: 1;
+ }
+}
+
+@keyframes rotateInUpRight {
+ from {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate3d(0, 0, 1, -90deg);
+ transform: rotate3d(0, 0, 1, -90deg);
+ opacity: 0;
+ }
+
+ to {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: none;
+ transform: none;
+ opacity: 1;
+ }
+}
+
+.rotateInUpRight {
+ -webkit-animation-name: rotateInUpRight;
+ animation-name: rotateInUpRight;
+}
+
+@-webkit-keyframes rotateOut {
+ from {
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ -webkit-transform: rotate3d(0, 0, 1, 200deg);
+ transform: rotate3d(0, 0, 1, 200deg);
+ opacity: 0;
+ }
+}
+
+@keyframes rotateOut {
+ from {
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ -webkit-transform: rotate3d(0, 0, 1, 200deg);
+ transform: rotate3d(0, 0, 1, 200deg);
+ opacity: 0;
+ }
+}
+
+.rotateOut {
+ -webkit-animation-name: rotateOut;
+ animation-name: rotateOut;
+}
+
+@-webkit-keyframes rotateOutDownLeft {
+ from {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate3d(0, 0, 1, 45deg);
+ transform: rotate3d(0, 0, 1, 45deg);
+ opacity: 0;
+ }
+}
+
+@keyframes rotateOutDownLeft {
+ from {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate3d(0, 0, 1, 45deg);
+ transform: rotate3d(0, 0, 1, 45deg);
+ opacity: 0;
+ }
+}
+
+.rotateOutDownLeft {
+ -webkit-animation-name: rotateOutDownLeft;
+ animation-name: rotateOutDownLeft;
+}
+
+@-webkit-keyframes rotateOutDownRight {
+ from {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate3d(0, 0, 1, -45deg);
+ transform: rotate3d(0, 0, 1, -45deg);
+ opacity: 0;
+ }
+}
+
+@keyframes rotateOutDownRight {
+ from {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate3d(0, 0, 1, -45deg);
+ transform: rotate3d(0, 0, 1, -45deg);
+ opacity: 0;
+ }
+}
+
+.rotateOutDownRight {
+ -webkit-animation-name: rotateOutDownRight;
+ animation-name: rotateOutDownRight;
+}
+
+@-webkit-keyframes rotateOutUpLeft {
+ from {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate3d(0, 0, 1, -45deg);
+ transform: rotate3d(0, 0, 1, -45deg);
+ opacity: 0;
+ }
+}
+
+@keyframes rotateOutUpLeft {
+ from {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+ -webkit-transform: rotate3d(0, 0, 1, -45deg);
+ transform: rotate3d(0, 0, 1, -45deg);
+ opacity: 0;
+ }
+}
+
+.rotateOutUpLeft {
+ -webkit-animation-name: rotateOutUpLeft;
+ animation-name: rotateOutUpLeft;
+}
+
+@-webkit-keyframes rotateOutUpRight {
+ from {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate3d(0, 0, 1, 90deg);
+ transform: rotate3d(0, 0, 1, 90deg);
+ opacity: 0;
+ }
+}
+
+@keyframes rotateOutUpRight {
+ from {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+ -webkit-transform: rotate3d(0, 0, 1, 90deg);
+ transform: rotate3d(0, 0, 1, 90deg);
+ opacity: 0;
+ }
+}
+
+.rotateOutUpRight {
+ -webkit-animation-name: rotateOutUpRight;
+ animation-name: rotateOutUpRight;
+}
+
+@-webkit-keyframes hinge {
+ 0% {
+ -webkit-transform-origin: top left;
+ transform-origin: top left;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ }
+
+ 20%, 60% {
+ -webkit-transform: rotate3d(0, 0, 1, 80deg);
+ transform: rotate3d(0, 0, 1, 80deg);
+ -webkit-transform-origin: top left;
+ transform-origin: top left;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ }
+
+ 40%, 80% {
+ -webkit-transform: rotate3d(0, 0, 1, 60deg);
+ transform: rotate3d(0, 0, 1, 60deg);
+ -webkit-transform-origin: top left;
+ transform-origin: top left;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 700px, 0);
+ transform: translate3d(0, 700px, 0);
+ opacity: 0;
+ }
+}
+
+@keyframes hinge {
+ 0% {
+ -webkit-transform-origin: top left;
+ transform-origin: top left;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ }
+
+ 20%, 60% {
+ -webkit-transform: rotate3d(0, 0, 1, 80deg);
+ transform: rotate3d(0, 0, 1, 80deg);
+ -webkit-transform-origin: top left;
+ transform-origin: top left;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ }
+
+ 40%, 80% {
+ -webkit-transform: rotate3d(0, 0, 1, 60deg);
+ transform: rotate3d(0, 0, 1, 60deg);
+ -webkit-transform-origin: top left;
+ transform-origin: top left;
+ -webkit-animation-timing-function: ease-in-out;
+ animation-timing-function: ease-in-out;
+ opacity: 1;
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 700px, 0);
+ transform: translate3d(0, 700px, 0);
+ opacity: 0;
+ }
+}
+
+.hinge {
+ -webkit-animation-name: hinge;
+ animation-name: hinge;
+}
+
+/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
+
+@-webkit-keyframes rollIn {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);
+ transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+@keyframes rollIn {
+ from {
+ opacity: 0;
+ -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);
+ transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);
+ }
+
+ to {
+ opacity: 1;
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+.rollIn {
+ -webkit-animation-name: rollIn;
+ animation-name: rollIn;
+}
+
+/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
+
+@-webkit-keyframes rollOut {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);
+ transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);
+ }
+}
+
+@keyframes rollOut {
+ from {
+ opacity: 1;
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);
+ transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);
+ }
+}
+
+.rollOut {
+ -webkit-animation-name: rollOut;
+ animation-name: rollOut;
+}
+
+@-webkit-keyframes zoomIn {
+ from {
+ opacity: 0;
+ -webkit-transform: scale3d(.3, .3, .3);
+ transform: scale3d(.3, .3, .3);
+ }
+
+ 50% {
+ opacity: 1;
+ }
+}
+
+@keyframes zoomIn {
+ from {
+ opacity: 0;
+ -webkit-transform: scale3d(.3, .3, .3);
+ transform: scale3d(.3, .3, .3);
+ }
+
+ 50% {
+ opacity: 1;
+ }
+}
+
+.zoomIn {
+ -webkit-animation-name: zoomIn;
+ animation-name: zoomIn;
+}
+
+@-webkit-keyframes zoomInDown {
+ from {
+ opacity: 0;
+ -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);
+ transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
+ transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+ }
+}
+
+@keyframes zoomInDown {
+ from {
+ opacity: 0;
+ -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);
+ transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
+ transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+ }
+}
+
+.zoomInDown {
+ -webkit-animation-name: zoomInDown;
+ animation-name: zoomInDown;
+}
+
+@-webkit-keyframes zoomInLeft {
+ from {
+ opacity: 0;
+ -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);
+ transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);
+ transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+ }
+}
+
+@keyframes zoomInLeft {
+ from {
+ opacity: 0;
+ -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);
+ transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);
+ transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+ }
+}
+
+.zoomInLeft {
+ -webkit-animation-name: zoomInLeft;
+ animation-name: zoomInLeft;
+}
+
+@-webkit-keyframes zoomInRight {
+ from {
+ opacity: 0;
+ -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);
+ transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);
+ transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+ }
+}
+
+@keyframes zoomInRight {
+ from {
+ opacity: 0;
+ -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);
+ transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);
+ transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+ }
+}
+
+.zoomInRight {
+ -webkit-animation-name: zoomInRight;
+ animation-name: zoomInRight;
+}
+
+@-webkit-keyframes zoomInUp {
+ from {
+ opacity: 0;
+ -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);
+ transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
+ transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+ }
+}
+
+@keyframes zoomInUp {
+ from {
+ opacity: 0;
+ -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);
+ transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+ }
+
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
+ transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+ }
+}
+
+.zoomInUp {
+ -webkit-animation-name: zoomInUp;
+ animation-name: zoomInUp;
+}
+
+@-webkit-keyframes zoomOut {
+ from {
+ opacity: 1;
+ }
+
+ 50% {
+ opacity: 0;
+ -webkit-transform: scale3d(.3, .3, .3);
+ transform: scale3d(.3, .3, .3);
+ }
+
+ to {
+ opacity: 0;
+ }
+}
+
+@keyframes zoomOut {
+ from {
+ opacity: 1;
+ }
+
+ 50% {
+ opacity: 0;
+ -webkit-transform: scale3d(.3, .3, .3);
+ transform: scale3d(.3, .3, .3);
+ }
+
+ to {
+ opacity: 0;
+ }
+}
+
+.zoomOut {
+ -webkit-animation-name: zoomOut;
+ animation-name: zoomOut;
+}
+
+@-webkit-keyframes zoomOutDown {
+ 40% {
+ opacity: 1;
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
+ transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);
+ transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);
+ -webkit-transform-origin: center bottom;
+ transform-origin: center bottom;
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+ }
+}
+
+@keyframes zoomOutDown {
+ 40% {
+ opacity: 1;
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
+ transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);
+ transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);
+ -webkit-transform-origin: center bottom;
+ transform-origin: center bottom;
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+ }
+}
+
+.zoomOutDown {
+ -webkit-animation-name: zoomOutDown;
+ animation-name: zoomOutDown;
+}
+
+@-webkit-keyframes zoomOutLeft {
+ 40% {
+ opacity: 1;
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);
+ transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: scale(.1) translate3d(-2000px, 0, 0);
+ transform: scale(.1) translate3d(-2000px, 0, 0);
+ -webkit-transform-origin: left center;
+ transform-origin: left center;
+ }
+}
+
+@keyframes zoomOutLeft {
+ 40% {
+ opacity: 1;
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);
+ transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: scale(.1) translate3d(-2000px, 0, 0);
+ transform: scale(.1) translate3d(-2000px, 0, 0);
+ -webkit-transform-origin: left center;
+ transform-origin: left center;
+ }
+}
+
+.zoomOutLeft {
+ -webkit-animation-name: zoomOutLeft;
+ animation-name: zoomOutLeft;
+}
+
+@-webkit-keyframes zoomOutRight {
+ 40% {
+ opacity: 1;
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);
+ transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: scale(.1) translate3d(2000px, 0, 0);
+ transform: scale(.1) translate3d(2000px, 0, 0);
+ -webkit-transform-origin: right center;
+ transform-origin: right center;
+ }
+}
+
+@keyframes zoomOutRight {
+ 40% {
+ opacity: 1;
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);
+ transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: scale(.1) translate3d(2000px, 0, 0);
+ transform: scale(.1) translate3d(2000px, 0, 0);
+ -webkit-transform-origin: right center;
+ transform-origin: right center;
+ }
+}
+
+.zoomOutRight {
+ -webkit-animation-name: zoomOutRight;
+ animation-name: zoomOutRight;
+}
+
+@-webkit-keyframes zoomOutUp {
+ 40% {
+ opacity: 1;
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
+ transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);
+ transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);
+ -webkit-transform-origin: center bottom;
+ transform-origin: center bottom;
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+ }
+}
+
+@keyframes zoomOutUp {
+ 40% {
+ opacity: 1;
+ -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
+ transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
+ -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
+ }
+
+ to {
+ opacity: 0;
+ -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);
+ transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);
+ -webkit-transform-origin: center bottom;
+ transform-origin: center bottom;
+ -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
+ }
+}
+
+.zoomOutUp {
+ -webkit-animation-name: zoomOutUp;
+ animation-name: zoomOutUp;
+}
+
+@-webkit-keyframes slideInDown {
+ from {
+ -webkit-transform: translate3d(0, -100%, 0);
+ transform: translate3d(0, -100%, 0);
+ visibility: visible;
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+@keyframes slideInDown {
+ from {
+ -webkit-transform: translate3d(0, -100%, 0);
+ transform: translate3d(0, -100%, 0);
+ visibility: visible;
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+.slideInDown {
+ -webkit-animation-name: slideInDown;
+ animation-name: slideInDown;
+}
+
+@-webkit-keyframes slideInLeft {
+ from {
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+ visibility: visible;
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+@keyframes slideInLeft {
+ from {
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+ visibility: visible;
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+.slideInLeft {
+ -webkit-animation-name: slideInLeft;
+ animation-name: slideInLeft;
+}
+
+@-webkit-keyframes slideInRight {
+ from {
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+ visibility: visible;
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+@keyframes slideInRight {
+ from {
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+ visibility: visible;
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+.slideInRight {
+ -webkit-animation-name: slideInRight;
+ animation-name: slideInRight;
+}
+
+@-webkit-keyframes slideInUp {
+ from {
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ visibility: visible;
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+@keyframes slideInUp {
+ from {
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ visibility: visible;
+ }
+
+ to {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+
+.slideInUp {
+ -webkit-animation-name: slideInUp;
+ animation-name: slideInUp;
+}
+
+@-webkit-keyframes slideOutDown {
+ from {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ to {
+ visibility: hidden;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ }
+}
+
+@keyframes slideOutDown {
+ from {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ to {
+ visibility: hidden;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+ }
+}
+
+.slideOutDown {
+ -webkit-animation-name: slideOutDown;
+ animation-name: slideOutDown;
+}
+
+@-webkit-keyframes slideOutLeft {
+ from {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ to {
+ visibility: hidden;
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+ }
+}
+
+@keyframes slideOutLeft {
+ from {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ to {
+ visibility: hidden;
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+ }
+}
+
+.slideOutLeft {
+ -webkit-animation-name: slideOutLeft;
+ animation-name: slideOutLeft;
+}
+
+@-webkit-keyframes slideOutRight {
+ from {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ to {
+ visibility: hidden;
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+ }
+}
+
+@keyframes slideOutRight {
+ from {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ to {
+ visibility: hidden;
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+ }
+}
+
+.slideOutRight {
+ -webkit-animation-name: slideOutRight;
+ animation-name: slideOutRight;
+}
+
+@-webkit-keyframes slideOutUp {
+ from {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ to {
+ visibility: hidden;
+ -webkit-transform: translate3d(0, -100%, 0);
+ transform: translate3d(0, -100%, 0);
+ }
+}
+
+@keyframes slideOutUp {
+ from {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+
+ to {
+ visibility: hidden;
+ -webkit-transform: translate3d(0, -100%, 0);
+ transform: translate3d(0, -100%, 0);
+ }
+}
+
+.slideOutUp {
+ -webkit-animation-name: slideOutUp;
+ animation-name: slideOutUp;
+}
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/css/bootstrap.min.css b/sm-shop/src/main/webapp/resources/templates/generic/css/bootstrap.min.css
new file mode 100644
index 0000000..ababb3f
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/css/bootstrap.min.css
@@ -0,0 +1,14 @@
+/*!
+ * Bootstrap v3.3.5 (http://getbootstrap.com)
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*!
+ * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=35b072e804118cf2fd87)
+ * Config saved to config.json and https://gist.github.com/35b072e804118cf2fd87
+ *//*!
+ * Bootstrap v3.3.6 (http://getbootstrap.com)
+ * Copyright 2011-2015 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover,a.text-primary:focus{color:#286090}.text-success{color:#3c763d}a.text-success:hover,a.text-success:focus{color:#2b542c}.text-info{color:#31708f}a.text-info:hover,a.text-info:focus{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover,a.text-warning:focus{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover,a.text-danger:focus{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover,a.bg-primary:focus{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:34px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:focus,.btn-default.focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#fff;background-color:#398439;border-color:#255625}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#337ab7}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#337ab7;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:3;color:#fff;background-color:#337ab7;border-color:#337ab7;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#fff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px;padding-left:15px;padding-right:15px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eee;color:#777;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:14px;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform 0.6s ease-in-out;-o-transition:-o-transform 0.6s ease-in-out;transition:transform 0.6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);background-color:rgba(0,0,0,0)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, color-stop(0, rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, color-stop(0, rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-header:before,.modal-header:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-header:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/css/font-awesome.min.css b/sm-shop/src/main/webapp/resources/templates/generic/css/font-awesome.min.css
new file mode 100644
index 0000000..d0603cb
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/css/font-awesome.min.css
@@ -0,0 +1,4 @@
+/*!
+ * Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.5.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.5.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.5.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.5.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.5.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.5.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/css/jquery-ui.min.css b/sm-shop/src/main/webapp/resources/templates/generic/css/jquery-ui.min.css
new file mode 100644
index 0000000..9ff9657
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/css/jquery-ui.min.css
@@ -0,0 +1,7 @@
+/*! jQuery UI - v1.11.4 - 2016-03-01
+* http://jqueryui.com
+* Includes: core.css, slider.css, theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande%2CLucida%20Sans%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=5px&bgColorHeader=5c9ccc&bgTextureHeader=gloss_wave&bgImgOpacityHeader=55&borderColorHeader=4297d7&fcHeader=ffffff&iconColorHeader=d8e7f3&bgColorContent=fcfdfd&bgTextureContent=inset_hard&bgImgOpacityContent=100&borderColorContent=a6c9e2&fcContent=222222&iconColorContent=469bdd&bgColorDefault=dfeffc&bgTextureDefault=glass&bgImgOpacityDefault=85&borderColorDefault=c5dbec&fcDefault=2e6e9e&iconColorDefault=6da8d5&bgColorHover=d0e5f5&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=79b7e7&fcHover=1d5987&iconColorHover=217bc0&bgColorActive=f5f8f9&bgTextureActive=inset_hard&bgImgOpacityActive=100&borderColorActive=79b7e7&fcActive=e17009&iconColorActive=f9bd01&bgColorHighlight=fbec88&bgTextureHighlight=flat&bgImgOpacityHighlight=55&borderColorHighlight=fad42e&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width: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:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.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;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-widget{font-family:Lucida Grande,Lucida Sans,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:Lucida Grande,Lucida Sans,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #a6c9e2;background:#fcfdfd url("images/ui-bg_inset-hard_100_fcfdfd_1x100.png") 50% bottom repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #4297d7;background:#5c9ccc url("images/ui-bg_gloss-wave_55_5c9ccc_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #c5dbec;background:#dfeffc url("images/ui-bg_glass_85_dfeffc_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#2e6e9e}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#2e6e9e;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 #79b7e7;background:#d0e5f5 url("images/ui-bg_glass_75_d0e5f5_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#1d5987}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#1d5987;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #79b7e7;background:#f5f8f9 url("images/ui-bg_inset-hard_100_f5f8f9_1x100.png") 50% 50% repeat-x;font-weight:bold;color:#e17009}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#e17009;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fad42e;background:#fbec88;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_469bdd_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_d8e7f3_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_6da8d5_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_217bc0_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_f9bd01_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:5px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:5px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:5px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:5px}.ui-widget-overlay{background:#aaa;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/css/linearicons-icon-font.min.css b/sm-shop/src/main/webapp/resources/templates/generic/css/linearicons-icon-font.min.css
new file mode 100644
index 0000000..b41e814
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/css/linearicons-icon-font.min.css
@@ -0,0 +1,7 @@
+/*
+Linearicons Free v1.0.0 - https://linearicons.com/free
+By Perxis - https://perxis.com
+(c) 2014-2015 Perxis.com
+License: https://linearicons.com/free/license
+*/
+@font-face{font-family:Linearicons-Free;src:url(https://cdn.linearicons.com/free/1.0.0/Linearicons-Free.eot);src:url(https://cdn.linearicons.com/free/1.0.0/Linearicons-Free.eot?#iefix) format('embedded-opentype'),url(https://cdn.linearicons.com/free/1.0.0/Linearicons-Free.woff2) format('woff2'),url(https://cdn.linearicons.com/free/1.0.0/Linearicons-Free.ttf) format('truetype'),url(https://cdn.linearicons.com/free/1.0.0/Linearicons-Free.woff) format('woff'),url(https://cdn.linearicons.com/free/1.0.0/Linearicons-Free.svg#Linearicons-Free) format('svg');font-weight:400;font-style:normal}.lnr{font-family:Linearicons-Free;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.lnr-home:before{content:"\e800"}.lnr-apartment:before{content:"\e801"}.lnr-pencil:before{content:"\e802"}.lnr-magic-wand:before{content:"\e803"}.lnr-drop:before{content:"\e804"}.lnr-lighter:before{content:"\e805"}.lnr-poop:before{content:"\e806"}.lnr-sun:before{content:"\e807"}.lnr-moon:before{content:"\e808"}.lnr-cloud:before{content:"\e809"}.lnr-cloud-upload:before{content:"\e80a"}.lnr-cloud-download:before{content:"\e80b"}.lnr-cloud-sync:before{content:"\e80c"}.lnr-cloud-check:before{content:"\e80d"}.lnr-database:before{content:"\e80e"}.lnr-lock:before{content:"\e80f"}.lnr-cog:before{content:"\e810"}.lnr-trash:before{content:"\e811"}.lnr-dice:before{content:"\e812"}.lnr-heart:before{content:"\e813"}.lnr-star:before{content:"\e814"}.lnr-star-half:before{content:"\e815"}.lnr-star-empty:before{content:"\e816"}.lnr-flag:before{content:"\e817"}.lnr-envelope:before{content:"\e818"}.lnr-paperclip:before{content:"\e819"}.lnr-inbox:before{content:"\e81a"}.lnr-eye:before{content:"\e81b"}.lnr-printer:before{content:"\e81c"}.lnr-file-empty:before{content:"\e81d"}.lnr-file-add:before{content:"\e81e"}.lnr-enter:before{content:"\e81f"}.lnr-exit:before{content:"\e820"}.lnr-graduation-hat:before{content:"\e821"}.lnr-license:before{content:"\e822"}.lnr-music-note:before{content:"\e823"}.lnr-film-play:before{content:"\e824"}.lnr-camera-video:before{content:"\e825"}.lnr-camera:before{content:"\e826"}.lnr-picture:before{content:"\e827"}.lnr-book:before{content:"\e828"}.lnr-bookmark:before{content:"\e829"}.lnr-user:before{content:"\e82a"}.lnr-users:before{content:"\e82b"}.lnr-shirt:before{content:"\e82c"}.lnr-store:before{content:"\e82d"}.lnr-cart:before{content:"\e82e"}.lnr-tag:before{content:"\e82f"}.lnr-phone-handset:before{content:"\e830"}.lnr-phone:before{content:"\e831"}.lnr-pushpin:before{content:"\e832"}.lnr-map-marker:before{content:"\e833"}.lnr-map:before{content:"\e834"}.lnr-location:before{content:"\e835"}.lnr-calendar-full:before{content:"\e836"}.lnr-keyboard:before{content:"\e837"}.lnr-spell-check:before{content:"\e838"}.lnr-screen:before{content:"\e839"}.lnr-smartphone:before{content:"\e83a"}.lnr-tablet:before{content:"\e83b"}.lnr-laptop:before{content:"\e83c"}.lnr-laptop-phone:before{content:"\e83d"}.lnr-power-switch:before{content:"\e83e"}.lnr-bubble:before{content:"\e83f"}.lnr-heart-pulse:before{content:"\e840"}.lnr-construction:before{content:"\e841"}.lnr-pie-chart:before{content:"\e842"}.lnr-chart-bars:before{content:"\e843"}.lnr-gift:before{content:"\e844"}.lnr-diamond:before{content:"\e845"}.lnr-linearicons:before{content:"\e846"}.lnr-dinner:before{content:"\e847"}.lnr-coffee-cup:before{content:"\e848"}.lnr-leaf:before{content:"\e849"}.lnr-paw:before{content:"\e84a"}.lnr-rocket:before{content:"\e84b"}.lnr-briefcase:before{content:"\e84c"}.lnr-bus:before{content:"\e84d"}.lnr-car:before{content:"\e84e"}.lnr-train:before{content:"\e84f"}.lnr-bicycle:before{content:"\e850"}.lnr-wheelchair:before{content:"\e851"}.lnr-select:before{content:"\e852"}.lnr-earth:before{content:"\e853"}.lnr-smile:before{content:"\e854"}.lnr-sad:before{content:"\e855"}.lnr-neutral:before{content:"\e856"}.lnr-mustache:before{content:"\e857"}.lnr-alarm:before{content:"\e858"}.lnr-bullhorn:before{content:"\e859"}.lnr-volume-high:before{content:"\e85a"}.lnr-volume-medium:before{content:"\e85b"}.lnr-volume-low:before{content:"\e85c"}.lnr-volume:before{content:"\e85d"}.lnr-mic:before{content:"\e85e"}.lnr-hourglass:before{content:"\e85f"}.lnr-undo:before{content:"\e860"}.lnr-redo:before{content:"\e861"}.lnr-sync:before{content:"\e862"}.lnr-history:before{content:"\e863"}.lnr-clock:before{content:"\e864"}.lnr-download:before{content:"\e865"}.lnr-upload:before{content:"\e866"}.lnr-enter-down:before{content:"\e867"}.lnr-exit-up:before{content:"\e868"}.lnr-bug:before{content:"\e869"}.lnr-code:before{content:"\e86a"}.lnr-link:before{content:"\e86b"}.lnr-unlink:before{content:"\e86c"}.lnr-thumbs-up:before{content:"\e86d"}.lnr-thumbs-down:before{content:"\e86e"}.lnr-magnifier:before{content:"\e86f"}.lnr-cross:before{content:"\e870"}.lnr-menu:before{content:"\e871"}.lnr-list:before{content:"\e872"}.lnr-chevron-up:before{content:"\e873"}.lnr-chevron-down:before{content:"\e874"}.lnr-chevron-left:before{content:"\e875"}.lnr-chevron-right:before{content:"\e876"}.lnr-arrow-up:before{content:"\e877"}.lnr-arrow-down:before{content:"\e878"}.lnr-arrow-left:before{content:"\e879"}.lnr-arrow-right:before{content:"\e87a"}.lnr-move:before{content:"\e87b"}.lnr-warning:before{content:"\e87c"}.lnr-question-circle:before{content:"\e87d"}.lnr-menu-circle:before{content:"\e87e"}.lnr-checkmark-circle:before{content:"\e87f"}.lnr-cross-circle:before{content:"\e880"}.lnr-plus-circle:before{content:"\e881"}.lnr-circle-minus:before{content:"\e882"}.lnr-arrow-up-circle:before{content:"\e883"}.lnr-arrow-down-circle:before{content:"\e884"}.lnr-arrow-left-circle:before{content:"\e885"}.lnr-arrow-right-circle:before{content:"\e886"}.lnr-chevron-up-circle:before{content:"\e887"}.lnr-chevron-down-circle:before{content:"\e888"}.lnr-chevron-left-circle:before{content:"\e889"}.lnr-chevron-right-circle:before{content:"\e88a"}.lnr-crop:before{content:"\e88b"}.lnr-frame-expand:before{content:"\e88c"}.lnr-frame-contract:before{content:"\e88d"}.lnr-layers:before{content:"\e88e"}.lnr-funnel:before{content:"\e88f"}.lnr-text-format:before{content:"\e890"}.lnr-text-format-remove:before{content:"\e891"}.lnr-text-size:before{content:"\e892"}.lnr-bold:before{content:"\e893"}.lnr-italic:before{content:"\e894"}.lnr-underline:before{content:"\e895"}.lnr-strikethrough:before{content:"\e896"}.lnr-highlight:before{content:"\e897"}.lnr-text-align-left:before{content:"\e898"}.lnr-text-align-center:before{content:"\e899"}.lnr-text-align-right:before{content:"\e89a"}.lnr-text-align-justify:before{content:"\e89b"}.lnr-line-spacing:before{content:"\e89c"}.lnr-indent-increase:before{content:"\e89d"}.lnr-indent-decrease:before{content:"\e89e"}.lnr-pilcrow:before{content:"\e89f"}.lnr-direction-ltr:before{content:"\e8a0"}.lnr-direction-rtl:before{content:"\e8a1"}.lnr-page-break:before{content:"\e8a2"}.lnr-sort-alpha-asc:before{content:"\e8a3"}.lnr-sort-amount-asc:before{content:"\e8a4"}.lnr-hand:before{content:"\e8a5"}.lnr-pointer-up:before{content:"\e8a6"}.lnr-pointer-right:before{content:"\e8a7"}.lnr-pointer-down:before{content:"\e8a8"}.lnr-pointer-left:before{content:"\e8a9"}
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/css/magnific-popup.css b/sm-shop/src/main/webapp/resources/templates/generic/css/magnific-popup.css
new file mode 100644
index 0000000..8eab30b
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/css/magnific-popup.css
@@ -0,0 +1,351 @@
+/* Magnific Popup CSS */
+.mfp-bg {
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: 1042;
+ overflow: hidden;
+ position: fixed;
+ background: #0b0b0b;
+ opacity: 0.8; }
+
+.mfp-wrap {
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: 11111111111;
+ position: fixed;
+ outline: none !important;
+ -webkit-backface-visibility: hidden; }
+
+.mfp-container {
+ text-align: center;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ left: 0;
+ top: 0;
+ padding: 0 8px;
+ box-sizing: border-box; }
+
+.mfp-container:before {
+ content: '';
+ display: inline-block;
+ height: 100%;
+ vertical-align: middle; }
+
+.mfp-align-top .mfp-container:before {
+ display: none; }
+
+.mfp-content {
+ position: relative;
+ display: inline-block;
+ vertical-align: middle;
+ margin: 0 auto;
+ text-align: left;
+ z-index: 1045; }
+
+.mfp-inline-holder .mfp-content,
+.mfp-ajax-holder .mfp-content {
+ width: 100%;
+ cursor: auto; }
+
+.mfp-ajax-cur {
+ cursor: progress; }
+
+.mfp-zoom-out-cur, .mfp-zoom-out-cur .mfp-image-holder .mfp-close {
+ cursor: -moz-zoom-out;
+ cursor: -webkit-zoom-out;
+ cursor: zoom-out; }
+
+.mfp-zoom {
+ cursor: pointer;
+ cursor: -webkit-zoom-in;
+ cursor: -moz-zoom-in;
+ cursor: zoom-in; }
+
+.mfp-auto-cursor .mfp-content {
+ cursor: auto; }
+
+.mfp-close,
+.mfp-arrow,
+.mfp-preloader,
+.mfp-counter {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none; }
+
+.mfp-loading.mfp-figure {
+ display: none; }
+
+.mfp-hide {
+ display: none !important; }
+
+.mfp-preloader {
+ color: #CCC;
+ position: absolute;
+ top: 50%;
+ width: auto;
+ text-align: center;
+ margin-top: -0.8em;
+ left: 8px;
+ right: 8px;
+ z-index: 1044; }
+ .mfp-preloader a {
+ color: #CCC; }
+ .mfp-preloader a:hover {
+ color: #FFF; }
+
+.mfp-s-ready .mfp-preloader {
+ display: none; }
+
+.mfp-s-error .mfp-content {
+ display: none; }
+
+button.mfp-close,
+button.mfp-arrow {
+ overflow: visible;
+ cursor: pointer;
+ background: transparent;
+ border: 0;
+ -webkit-appearance: none;
+ display: block;
+ outline: none;
+ padding: 0;
+ z-index: 1046;
+ box-shadow: none;
+ touch-action: manipulation; }
+
+button::-moz-focus-inner {
+ padding: 0;
+ border: 0; }
+
+.mfp-close {
+ width: 44px;
+ height: 44px;
+ line-height: 44px;
+ position: absolute;
+ right: 0;
+ top: 0;
+ text-decoration: none;
+ text-align: center;
+ opacity: 0.65;
+ padding: 0 0 18px 10px;
+ color: #FFF;
+ font-style: normal;
+ font-size: 28px;
+ font-family: Arial, Baskerville, monospace; }
+ .mfp-close:hover,
+ .mfp-close:focus {
+ opacity: 1; }
+ .mfp-close:active {
+ top: 1px; }
+
+.mfp-close-btn-in .mfp-close {
+ color: #333; }
+
+.mfp-image-holder .mfp-close,
+.mfp-iframe-holder .mfp-close {
+ color: #FFF;
+ right: -6px;
+ text-align: right;
+ padding-right: 6px;
+ width: 100%; }
+
+.mfp-counter {
+ position: absolute;
+ top: 0;
+ right: 0;
+ color: #CCC;
+ font-size: 12px;
+ line-height: 18px;
+ white-space: nowrap; }
+
+.mfp-arrow {
+ position: absolute;
+ opacity: 0.65;
+ margin: 0;
+ top: 50%;
+ margin-top: -55px;
+ padding: 0;
+ width: 90px;
+ height: 110px;
+ -webkit-tap-highlight-color: transparent; }
+ .mfp-arrow:active {
+ margin-top: -54px; }
+ .mfp-arrow:hover,
+ .mfp-arrow:focus {
+ opacity: 1; }
+ .mfp-arrow:before,
+ .mfp-arrow:after {
+ content: '';
+ display: block;
+ width: 0;
+ height: 0;
+ position: absolute;
+ left: 0;
+ top: 0;
+ margin-top: 35px;
+ margin-left: 35px;
+ border: medium inset transparent; }
+ .mfp-arrow:after {
+ border-top-width: 13px;
+ border-bottom-width: 13px;
+ top: 8px; }
+ .mfp-arrow:before {
+ border-top-width: 21px;
+ border-bottom-width: 21px;
+ opacity: 0.7; }
+
+.mfp-arrow-left {
+ left: 0; }
+ .mfp-arrow-left:after {
+ border-right: 17px solid #FFF;
+ margin-left: 31px; }
+ .mfp-arrow-left:before {
+ margin-left: 25px;
+ border-right: 27px solid #3F3F3F; }
+
+.mfp-arrow-right {
+ right: 0; }
+ .mfp-arrow-right:after {
+ border-left: 17px solid #FFF;
+ margin-left: 39px; }
+ .mfp-arrow-right:before {
+ border-left: 27px solid #3F3F3F; }
+
+.mfp-iframe-holder {
+ padding-top: 40px;
+ padding-bottom: 40px; }
+ .mfp-iframe-holder .mfp-content {
+ line-height: 0;
+ width: 100%;
+ max-width: 900px; }
+ .mfp-iframe-holder .mfp-close {
+ top: -40px; }
+
+.mfp-iframe-scaler {
+ width: 100%;
+ height: 0;
+ overflow: hidden;
+ padding-top: 56.25%; }
+ .mfp-iframe-scaler iframe {
+ position: absolute;
+ display: block;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
+ background: #000; }
+
+/* Main image in popup */
+img.mfp-img {
+ width: auto;
+ max-width: 100%;
+ height: auto;
+ display: block;
+ line-height: 0;
+ box-sizing: border-box;
+ padding: 40px 0 40px;
+ margin: 0 auto; }
+
+/* The shadow behind the image */
+.mfp-figure {
+ line-height: 0; }
+ .mfp-figure:after {
+ content: '';
+ position: absolute;
+ left: 0;
+ top: 40px;
+ bottom: 40px;
+ display: block;
+ right: 0;
+ width: auto;
+ height: auto;
+ z-index: -1;
+ box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
+ background: #444; }
+ .mfp-figure small {
+ color: #BDBDBD;
+ display: block;
+ font-size: 12px;
+ line-height: 14px; }
+ .mfp-figure figure {
+ margin: 0; }
+
+.mfp-bottom-bar {
+ margin-top: -36px;
+ position: absolute;
+ top: 100%;
+ left: 0;
+ width: 100%;
+ cursor: auto; }
+
+.mfp-title {
+ text-align: left;
+ line-height: 18px;
+ color: #F3F3F3;
+ word-wrap: break-word;
+ padding-right: 36px; }
+
+.mfp-image-holder .mfp-content {
+ max-width: 100%; }
+
+.mfp-gallery .mfp-image-holder .mfp-figure {
+ cursor: pointer; }
+
+@media screen and (max-width: 800px) and (orientation: landscape), screen and (max-height: 300px) {
+ /**
+ * Remove all paddings around the image on small screen
+ */
+ .mfp-img-mobile .mfp-image-holder {
+ padding-left: 0;
+ padding-right: 0; }
+ .mfp-img-mobile img.mfp-img {
+ padding: 0; }
+ .mfp-img-mobile .mfp-figure:after {
+ top: 0;
+ bottom: 0; }
+ .mfp-img-mobile .mfp-figure small {
+ display: inline;
+ margin-left: 5px; }
+ .mfp-img-mobile .mfp-bottom-bar {
+ background: rgba(0, 0, 0, 0.6);
+ bottom: 0;
+ margin: 0;
+ top: auto;
+ padding: 3px 5px;
+ position: fixed;
+ box-sizing: border-box; }
+ .mfp-img-mobile .mfp-bottom-bar:empty {
+ padding: 0; }
+ .mfp-img-mobile .mfp-counter {
+ right: 5px;
+ top: 3px; }
+ .mfp-img-mobile .mfp-close {
+ top: 0;
+ right: 0;
+ width: 35px;
+ height: 35px;
+ line-height: 35px;
+ background: rgba(0, 0, 0, 0.6);
+ position: fixed;
+ text-align: center;
+ padding: 0; } }
+
+@media all and (max-width: 900px) {
+ .mfp-arrow {
+ -webkit-transform: scale(0.75);
+ transform: scale(0.75); }
+ .mfp-arrow-left {
+ -webkit-transform-origin: 0;
+ transform-origin: 0; }
+ .mfp-arrow-right {
+ -webkit-transform-origin: 100%;
+ transform-origin: 100%; }
+ .mfp-container {
+ padding-left: 6px;
+ padding-right: 6px; } }
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/css/meanmenu.min.css b/sm-shop/src/main/webapp/resources/templates/generic/css/meanmenu.min.css
new file mode 100644
index 0000000..c4864c7
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/css/meanmenu.min.css
@@ -0,0 +1,86 @@
+a.meanmenu-reveal{display:none}
+.mean-container .mean-bar {
+ background: transparent none repeat scroll 0 0;
+ float: left;
+ min-height: 42px;
+ padding: 4px 0 0;
+ position: relative;
+ width: 100%;
+ z-index: 999999;
+}
+.mean-container a.meanmenu-reveal{width:22px;height:22px;padding:13px 13px 11px;top:0;right:0;cursor:pointer;color:#fff;text-decoration:none;font-size:16px;text-indent:-9999em;line-height:22px;font-size:1px;display:block;font-family:Arial,Helvetica,sans-serif;font-weight:700;float: right;}
+.mean-container a.meanmenu-reveal span{display:block;background:#fff;height:3px;margin-top:3px}
+.mean-container .mean-nav{float:left;width:100%;background:#0c1923}
+.mean-container .mean-nav ul{padding:0;margin:0;width:100%;list-style-type:none}
+.mean-container .mean-nav ul li {
+ background: #f8f8f8 none repeat scroll 0 0;
+ float: left;
+ position: relative;
+ width: 100%;
+ border-top: 1px solid#ddd;
+}
+.mean-container .mean-nav ul li a {
+ background: #f8f8f8 none repeat scroll 0 0;
+ color: #666666;
+ display: block;
+ float: left;
+ font-size: 12px;
+ margin: 0;
+ padding: 1em 5%;
+ text-align: left;
+ text-decoration: none;
+ text-transform: uppercase;
+ width: 90%;
+ font-weight: bold;
+}
+.mobile-menu-area {
+ background: #262626;
+}
+.mean-container .mean-nav ul li li a {
+ border-top: 1px solid rgba(255, 255, 255, 0.25);
+ opacity: 0.75;
+ padding: 1em 10%;
+ text-shadow: none !important;
+ visibility: visible;
+ width: 80%;
+ font-weight: normal;
+ text-transform: capitalize;
+ color: #444;
+}
+.mean-container .mean-nav ul li.mean-last a{border-bottom:0;margin-bottom:0}
+.mean-container .mean-nav ul li li li a{width:70%;padding:1em 15%}
+.mean-container .mean-nav ul li li li li a{width:60%;padding:1em 20%}
+.mean-container .mean-nav ul li li li li li a{width:50%;padding:1em 25%}
+.mean-container .mean-nav ul li a:hover {
+ background: #f8f8f8 none repeat scroll 0 0;
+ color: #F47E1E;
+}
+.mean-container .mean-nav ul li a.mean-expand{
+ width:26px;
+ height: 15px;
+ margin-top: 1px;
+ padding: 12px !important;
+ text-align:center;
+ position:absolute;
+ right:0;top:0;
+ z-index:2;
+ font-weight:700;
+ background:rgba(255,255,255,.1);
+ border:0!important;
+ background: #F8F8F8;
+ }
+.mean-container .mean-nav ul li a.mean-expand:hover {
+ background: #f8f8f8;
+}
+.mean-container .mean-push{float:left;width:100%;padding:0;margin:0;clear:both}
+.mean-nav .wrapper{width:100%;padding:0;margin:0}
+.mean-container .mean-bar,.mean-container .mean-bar *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}
+.mean-remove{display:none!important}
+.mean-container .mean-bar::after {
+ color: #ffffff;
+ content: "MENU";
+ font-size: 21px;
+ left: 5%;
+ position: absolute;
+ top: 12px;
+}
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/css/montserrat-extralight-webfont.woff b/sm-shop/src/main/webapp/resources/templates/generic/css/montserrat-extralight-webfont.woff
new file mode 100644
index 0000000..b14014b
Binary files /dev/null and b/sm-shop/src/main/webapp/resources/templates/generic/css/montserrat-extralight-webfont.woff differ
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/css/montserrat-extralight-webfont.woff2 b/sm-shop/src/main/webapp/resources/templates/generic/css/montserrat-extralight-webfont.woff2
new file mode 100644
index 0000000..7b45a07
Binary files /dev/null and b/sm-shop/src/main/webapp/resources/templates/generic/css/montserrat-extralight-webfont.woff2 differ
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/css/nivo-slider.css b/sm-shop/src/main/webapp/resources/templates/generic/css/nivo-slider.css
new file mode 100644
index 0000000..81d5693
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/css/nivo-slider.css
@@ -0,0 +1,113 @@
+/*
+ * jQuery Nivo Slider v3.2
+ * http://nivo.dev7studios.com
+ *
+ * Copyright 2012, Dev7studios
+ * Free to use and abuse under the MIT license.
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+
+/* The Nivo Slider styles */
+.nivoSlider {
+ position:relative;
+ width:100%;
+ height:auto;
+ overflow: hidden;
+}
+.nivoSlider img {
+ position:absolute;
+ top:0px;
+ left:0px;
+ max-width: none;
+}
+.nivo-main-image {
+ display: block !important;
+ position: relative !important;
+ width: 100% !important;
+}
+
+/* If an image is wrapped in a link */
+.nivoSlider a.nivo-imageLink {
+ position:absolute;
+ top:0px;
+ left:0px;
+ width:100%;
+ height:100%;
+ border:0;
+ padding:0;
+ margin:0;
+ z-index:6;
+ display:none;
+ background:white;
+ filter:alpha(opacity=0);
+ opacity:0;
+}
+/* The slices and boxes in the Slider */
+.nivo-slice {
+ display:block;
+ position:absolute;
+ z-index:5;
+ height:100%;
+ top:0;
+}
+.nivo-box {
+ display:block;
+ position:absolute;
+ z-index:5;
+ overflow:hidden;
+}
+.nivo-box img { display:block; }
+
+/* Caption styles */
+.nivo-caption {
+ position:absolute;
+ left:0px;
+ bottom:0px;
+ background:#000;
+ color:#fff;
+ width:100%;
+ z-index:8;
+ padding: 5px 10px;
+ opacity: 0.8;
+ overflow: hidden;
+ display: none;
+ -moz-opacity: 0.8;
+ filter:alpha(opacity=8);
+ -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
+ -moz-box-sizing: border-box; /* Firefox, other Gecko */
+ box-sizing: border-box; /* Opera/IE 8+ */
+}
+.nivo-caption p {
+ padding:5px;
+ margin:0;
+}
+.nivo-caption a {
+ display:inline !important;
+}
+.nivo-html-caption {
+ display:none;
+}
+/* Direction nav styles (e.g. Next & Prev) */
+.nivo-directionNav a {
+ position:absolute;
+ top:45%;
+ z-index:9;
+ cursor:pointer;
+}
+.nivo-prevNav {
+ left:0px;
+}
+.nivo-nextNav {
+ right:0px;
+}
+/* Control nav styles (e.g. 1,2,3...) */
+.nivo-controlNav {
+ text-align:center;
+ padding: 15px 0;
+}
+.nivo-controlNav a {
+ cursor:pointer;
+}
+.nivo-controlNav a.active {
+ font-weight:bold;
+}
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/css/owl.carousel.css b/sm-shop/src/main/webapp/resources/templates/generic/css/owl.carousel.css
new file mode 100644
index 0000000..ecc8071
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/css/owl.carousel.css
@@ -0,0 +1,216 @@
+/*
+ * Owl Carousel - Animate Plugin
+ */
+.owl-carousel .animated {
+ -webkit-animation-duration: 1000ms;
+ animation-duration: 1000ms;
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both;
+}
+.owl-carousel .owl-animated-in {
+ z-index: 0;
+}
+.owl-carousel .owl-animated-out {
+ z-index: 1;
+}
+.owl-carousel .fadeOut {
+ -webkit-animation-name: fadeOut;
+ animation-name: fadeOut;
+}
+
+@-webkit-keyframes fadeOut {
+ 0% {
+ opacity: 1;
+ }
+
+ 100% {
+ opacity: 0;
+ }
+}
+@keyframes fadeOut {
+ 0% {
+ opacity: 1;
+ }
+
+ 100% {
+ opacity: 0;
+ }
+}
+
+/*
+ * Owl Carousel - Auto Height Plugin
+ */
+.owl-height {
+ -webkit-transition: height 500ms ease-in-out;
+ -moz-transition: height 500ms ease-in-out;
+ -ms-transition: height 500ms ease-in-out;
+ -o-transition: height 500ms ease-in-out;
+ transition: height 500ms ease-in-out;
+}
+
+/*
+ * Core Owl Carousel CSS File
+ */
+.owl-carousel {
+ display: none;
+ width: 100%;
+ -webkit-tap-highlight-color: transparent;
+ /* position relative and z-index fix webkit rendering fonts issue */
+ position: relative;
+ z-index: 1;
+}
+.owl-carousel .owl-stage {
+ position: relative;
+ -ms-touch-action: pan-Y;
+}
+.owl-carousel .owl-stage:after {
+ content: ".";
+ display: block;
+ clear: both;
+ visibility: hidden;
+ line-height: 0;
+ height: 0;
+}
+.owl-carousel .owl-stage-outer {
+ position: relative;
+ overflow: hidden;
+ /* fix for flashing background */
+ -webkit-transform: translate3d(0px, 0px, 0px);
+}
+.owl-carousel .owl-controls .owl-nav .owl-prev,
+.owl-carousel .owl-controls .owl-nav .owl-next,
+.owl-carousel .owl-controls .owl-dot {
+ cursor: pointer;
+ cursor: hand;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.owl-carousel.owl-loaded {
+ display: block;
+}
+.owl-carousel.owl-loading {
+ opacity: 0;
+ display: block;
+}
+.owl-carousel.owl-hidden {
+ opacity: 0;
+}
+.owl-carousel .owl-refresh .owl-item {
+ display: none;
+}
+.owl-carousel .owl-item {
+ position: relative;
+ min-height: 1px;
+ float: left;
+ -webkit-backface-visibility: hidden;
+ -webkit-tap-highlight-color: transparent;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.owl-carousel .owl-item img {
+ display: block;
+ width: 100%;
+ -webkit-transform-style: preserve-3d;
+}
+.owl-carousel.owl-text-select-on .owl-item {
+ -webkit-user-select: auto;
+ -moz-user-select: auto;
+ -ms-user-select: auto;
+ user-select: auto;
+}
+.owl-carousel .owl-grab {
+ cursor: move;
+ cursor: -webkit-grab;
+ cursor: -o-grab;
+ cursor: -ms-grab;
+ cursor: grab;
+}
+.owl-carousel.owl-rtl {
+ direction: rtl;
+}
+.owl-carousel.owl-rtl .owl-item {
+ float: right;
+}
+
+/* No Js */
+.no-js .owl-carousel {
+ display: block;
+}
+
+/*
+ * Owl Carousel - Lazy Load Plugin
+ */
+.owl-carousel .owl-item .owl-lazy {
+ opacity: 0;
+ -webkit-transition: opacity 400ms ease;
+ -moz-transition: opacity 400ms ease;
+ -ms-transition: opacity 400ms ease;
+ -o-transition: opacity 400ms ease;
+ transition: opacity 400ms ease;
+}
+.owl-carousel .owl-item img {
+ transform-style: preserve-3d;
+}
+
+/*
+ * Owl Carousel - Video Plugin
+ */
+.owl-carousel .owl-video-wrapper {
+ position: relative;
+ height: 100%;
+ background: #000;
+}
+.owl-carousel .owl-video-play-icon {
+ position: absolute;
+ height: 80px;
+ width: 80px;
+ left: 50%;
+ top: 50%;
+ margin-left: -40px;
+ margin-top: -40px;
+ background: url("owl.video.play.png") no-repeat;
+ cursor: pointer;
+ z-index: 1;
+ -webkit-backface-visibility: hidden;
+ -webkit-transition: scale 100ms ease;
+ -moz-transition: scale 100ms ease;
+ -ms-transition: scale 100ms ease;
+ -o-transition: scale 100ms ease;
+ transition: scale 100ms ease;
+}
+.owl-carousel .owl-video-play-icon:hover {
+ -webkit-transition: scale(1.3, 1.3);
+ -moz-transition: scale(1.3, 1.3);
+ -ms-transition: scale(1.3, 1.3);
+ -o-transition: scale(1.3, 1.3);
+ transition: scale(1.3, 1.3);
+}
+.owl-carousel .owl-video-playing .owl-video-tn,
+.owl-carousel .owl-video-playing .owl-video-play-icon {
+ display: none;
+}
+.owl-carousel .owl-video-tn {
+ opacity: 0;
+ height: 100%;
+ background-position: center center;
+ background-repeat: no-repeat;
+ -webkit-background-size: contain;
+ -moz-background-size: contain;
+ -o-background-size: contain;
+ background-size: contain;
+ -webkit-transition: opacity 400ms ease;
+ -moz-transition: opacity 400ms ease;
+ -ms-transition: opacity 400ms ease;
+ -o-transition: opacity 400ms ease;
+ transition: opacity 400ms ease;
+}
+.owl-carousel .owl-video-frame {
+ position: relative;
+ z-index: 1;
+}
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/css/responsive.css b/sm-shop/src/main/webapp/resources/templates/generic/css/responsive.css
new file mode 100644
index 0000000..e7f8031
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/css/responsive.css
@@ -0,0 +1,635 @@
+/* Normal desktop :992px. */
+@media (min-width: 992px) and (max-width: 1169px) {
+/*==================================
+ Home page 1
+====================================*/
+.single-header-bottom-info {
+ padding: 0 20px;
+}
+.mainmenu ul li a {
+ font-size: 13px;
+ padding: 22px 17px;
+}
+.mainmenu ul li .megamenu {
+ left: -50px;
+}
+.slide_all_1 h1, .slide_all_2 h1 {
+ font-size: 25px;
+}
+ .slide_all_1 h3, .slide_all_1 h2, .slide_all_2 h3, .slide_all_2 h2 {
+ font-size: 35px;
+}
+ .slider-btn {
+ margin-top: 25px;
+}
+.new-product-action a {
+ padding: 8px 12px;
+}
+.static-slider-text h1 {
+ font-size: 20px;
+ margin-bottom: 10px;
+}
+.static-slider-text p {
+ font-size: 13px;
+}
+a.shopnow {
+ margin-top: 25px;
+}
+/*==================================
+ Home page 2
+====================================*/
+.mainmenu-area.home-page-2 .megamenu.megamenu2.living-room-megamenu, .mainmenu-area.home-page-2 .megamenu.diningroom-megamenu {
+ left: -200px;
+}
+/*==================================
+ Home page 3
+====================================*/
+.header-top-area.header-top-3 .header-top-right ul li a {
+ margin-left: 10px;
+}
+.header-top-3 .shop-cart {
+ text-align: center;
+}
+.header-top-3 .header-top-left, .header-top-3 .header-top-right {
+ margin-top: 15px;
+}
+.new-product-area-3 .mainmenu{
+ margin-right: 70px;
+}
+.single-static-banner .single-static-text {
+ left: 7%;
+ padding: 8px 22px;
+ top: 19%;
+}
+.single-static-banner .single-static-text-2 {
+ left: 47%;
+}
+.catagory-menu ul li .megamenu {
+ left: 94%;
+}
+.product-content a h3 {
+ font-size: 14px;
+}
+/*==================================
+ Home page 4
+====================================*/
+.header-bottom-right.header-bottom-right-4:hover .shop-cart-hover {
+ left: -70px;
+}
+.serch-box-3 form button {
+ left: 22px;
+}
+.timer .cdown {
+ margin: 20px 6px 19px;
+}
+.new-product-area.dotted-5.new-product-4 .hot-deal-title::before {
+ left: 144px;
+ width: 28%;
+}
+.section-title-4::before {
+ left: 205px;
+ width: 56%;
+}
+.section-title.section-title-4.section_4::before {
+ left: 272px;
+ width: 63.5%;
+}
+.dotted-5.new-product-4 .owl-carousel .owl-controls .owl-nav div {
+ top: -50px;
+}
+.feature-product-4 .section-title::before {
+ width: 44%;
+}
+/*==================================
+ Bedroom-Page
+====================================*/
+.sort-by {
+ margin-left: 26px;
+}
+.single-new-product.category-new-product .new-product-action a {
+ padding: 9px 12px;
+}
+/*==================================
+ Shop-Page
+====================================*/
+ul.sinple-tab-menu li a {
+ width: 65px !important;
+}
+}
+
+/* Tablet desktop :768px. */
+@media (min-width: 768px) and (max-width: 991px) {
+/*==================================
+ Home page 1
+====================================*/
+.header-top-right ul li a {
+ margin-left: 15px;
+}
+.mainmenu ul li a {
+ font-size: 12px;
+ padding: 22px 9px;
+}
+.mainmenu-area .megamenu.living-megamenu {
+ left: -143px;
+ width: 730px !important;
+}
+.mainmenu-area .megamenu.dining-megamenu {
+ left: -200px;
+}
+.slide_all_2, .slide_all_1 {
+ left: 8%;
+ position: absolute;
+ top: 12%;
+}
+.slide_all_1 h1 {
+ font-size: 21px;
+ margin-bottom: 14px;
+}
+.slide_all_2 h3, .slide_all_2 h2, .slide_all_1 h3, .slide_all_1 h2 {
+ font-size:30px;
+ margin-bottom: 12px;
+}
+.slider-btn > a {
+ font-size: 12px;
+ padding: 14px 16px;
+ line-height:0;
+}
+.new-product-action a {
+ padding: 10px 13px;
+}
+.feature-action > a {
+ padding: 5px 3px;
+}
+.static-slider-text p {
+ font-size: 13px;
+ line-height: 21px;
+}
+.static-slider-text h1 {
+ font-size: 16px;
+ margin-bottom: 8px;
+}
+.static-slider-text h2 {
+ font-size: 16px;
+}
+a.shopnow {
+ font-size: 14px;
+ font-weight: 600;
+ line-height: 33px;
+ margin-top: 10px;
+ padding: 0 14px;
+}
+.mar_b-30{
+ margin-bottom:30px;
+}
+/*==================================
+ Home page 2
+====================================*/
+.mainmenu-area.home-page-2 .megamenu.bedroom-megamenu {
+ left: -142px;
+}
+.mainmenu-area.home-page-2 .megamenu.megamenu2.living-room-megamenu {
+ left: -250px;
+ width: 750px !important;
+}
+.mainmenu-area.home-page-2 .megamenu.diningroom-megamenu {
+ left: -300px;
+}
+.service-content > span {
+ font-size: 12px;
+}
+.feature-preduct-area.home-page-2.feature-area-2 .single-new-product .new-product-action a {
+ padding: 10px 13px;
+}
+/*==================================
+ Home page 3
+====================================*/
+.header-top-area.hidden-xs.header-top-3 .shop-cart {
+ text-align: center;
+}
+.header-top-3 .shop-cart-hover {
+ top: 105%;
+}
+.serch-box-3 form button {
+ left: 0px;
+}
+.slider-area.slider-area-3 .slide_all_1, .slider-area.slider-area-3 .slide_all_2 {
+ top: 25%;
+}
+.slider-area.slider-area-3 .slide_all_1 h1, .slider-area.slider-area-3 .slide_all_2 h3, .slider-area.slider-area-3 .slide_all_2 h2 {
+ font-size: 29px;
+}
+.new-product-area-3 .mainmenu {
+ margin-bottom: 20px;
+ margin-right: 0;
+ text-align: left;
+}
+.new-product-area-3 .owl-carousel .owl-controls .owl-nav div {
+ top: -106px;
+}
+.new-product-area-3 .section-title::before {
+ bottom: 20px;
+}
+.new-product-area-3 .section-title h2 {
+ margin-bottom: 30px;
+}
+.single-static-banner .single-static-text {
+ left: 12%;
+ padding: 6px 17px;
+ top: 18%;
+}
+.single-static-banner .single-static-text-2 {
+ left: 36%!important;
+}
+.single-static-text h3 {
+ font-size: 14px;
+ font-weight: 600;
+ line-height: 26px;
+}
+.single-static-text span {
+ font-size: 13px;
+ line-height: 20px;
+}
+.single-static-banner .single-static-text-2 h3 {
+ font-size: 20px;
+}
+.section-title p {
+ font-size: 13px;
+}
+.search-box-home-3 .search-3 h4, .search-3 p {
+ text-align: left;
+}
+.home-3.feature-preduct-area.dotted-style4.home-page-2 .single-new-product .new-product-action > a {
+ padding: 10px 13px;
+}
+.search-box-home-3 {
+ margin-top: 30px;
+}
+/*==================================
+ Home page 4
+====================================*/
+.new-product-area.dotted-5.new-product-4 .hot-deal-title::before {
+ left: 144px;
+ width: 70%;
+}
+.section-title-4::before {
+ width: 62%;
+}
+.section-title.section-title-4.section_4::before {
+ width: 55%;
+}
+.feature-product-4 .section-title::before {
+ width: 59%;
+}
+/*==================================
+ Bedroom-Page
+====================================*/
+.bedroom-title > h4 {
+ font-size: 15px;
+}
+.sort-by {
+ margin-left: 0px;
+}
+.sort-by label {
+ font-size: 13px;
+}
+.cust-select {
+ width: 90px;
+}
+.porduct-option-left.floatleft > span {
+ font-size: 13px;
+ margin-left: -17px;
+}
+.sort-by i {;
+ margin-right: 7px;
+}
+.single-new-product.category-new-product .new-product-action a {
+ padding: 10px 19px;
+}
+/*==================================
+ Shop-Page
+====================================*/
+.quick-add-to-cart .single_add_to_cart_button.hyper-page {
+ margin-left: 0px;
+ margin-top: 15px;
+}
+.upsell-product .single-new-product a {
+ padding: 9px 18px;
+}
+}
+
+/* small mobile :320px. */
+@media (max-width: 767px) {
+/*==================================
+ Home page 1
+====================================*/
+.container {width:300px}
+.sticky {
+ animation: 0s ease 0s normal none 1 running none;
+ position: static;
+}
+ .logo {
+ margin-top: 0px;
+ text-align: center;
+}
+.header-bottom-right {
+ margin-top: 12px;
+ text-align: center;
+}
+.slide_all_1, .slide_all_2 {
+ left: 15px;
+ top: 12%;
+}
+.slide_all_1 h1, .slide_all_2 h1{
+ display:none;
+}
+.slide_all_1 h3, .slide_all_1 h2, .slide_all_2 h3, .slide_all_2 h2 {
+ font-size: 13px;
+ margin-bottom: 10px;
+}
+.slider-btn {
+ margin-top: 15px;
+}
+.slider-btn > a {
+ font-size: 9px;
+ font-weight: 700;
+ padding: 10px 12px;
+ line-height:21px;
+}
+.new-product-action a {
+ padding: 16px 22px;
+}
+.mar_b-30{
+ margin-bottom:30px;
+}
+.dotted-style2 .owl-carousel .owl-controls .owl-nav div, .dotted-style3 .owl-carousel .owl-controls .owl-nav div {
+ display: none!important;
+}
+.copyright-img {
+ text-align: center;
+}
+.copyright > p {
+ font-size: 12px;
+ text-align: center;
+}
+/*==================================
+ Home page 2
+====================================*/
+.header-bottom-area.home-page-2 .menu-search-box {
+ margin-bottom: 20px;
+}
+/*==================================
+ Home page 3
+====================================*/
+.header-bottom-area.header-bottom-3{
+ padding: 10px 0 25px;
+}
+.header-top-3 .shop-cart-hover{
+ top: 107%;
+}
+.slider-area.slider-area-3 .slide_all_1, .slider-area.slider-area-3 .slide_all_2 {
+ top: 20%;
+}
+.slider-area-3 .nivo-controlNav {
+ left: -2px;
+}
+.slider-area.slider-area-3 .slide_all_1 h1, .slider-area.slider-area-3 .slide_all_2 h3, .slider-area.slider-area-3 .slide_all_2 h2 {
+ color: #ffffff;
+ font-size: 13px;
+ margin-bottom: 10px;
+}
+.slider-area.slider-area-3 .slide_all_1 p {
+ font-size: 12px;
+}
+.new-product-area-3 .section-title h2 {
+ font-size: 17px;
+}
+.new-product-area-3 .mainmenu {
+ margin-bottom: 30px;
+ margin-right: 0;
+ text-align: left;
+}
+.new-product-area-3 .owl-carousel .owl-controls .owl-nav div {
+ top: -155px;
+}
+.new-product-area-3 .section-title::before {
+ bottom: 9px;
+}
+.new-product-area-3 .section-title h2 {
+ margin-bottom: 20px;
+}
+.banner-static-area {
+ padding: 0 0 15px;
+}
+.single-static-banner {
+ margin-bottom: 15px;
+}
+.single-static-banner .single-static-text {
+ left: 10%;
+ padding: 3px 24px;
+ top: 14%;
+}
+.single-static-text h3 {
+ font-size: 11px;
+ font-weight: 500;
+ line-height: 13px;
+}
+.single-static-text span {
+ font-size: 10px;
+ font-weight: 400;
+}
+.single-static-banner .single-static-text-2 h3 {
+ font-size: 16px;
+}
+.single-static-text.single-static-text-2{
+ overflow: hidden;
+}
+.single-static-banner .single-static-text-2 {
+ background: rgba(0, 0, 0, 0) none repeat scroll 0 0;
+ left: 53%;
+ padding: 0;
+ top: 26%;
+}
+.single-static-banner.banner-3 .single-static-text {
+ left: 35px;
+ padding: 0;
+}
+.single-static-banner.banner-3 .single-static-text h3 {
+ font-size: 12px;
+ line-height: 5px;
+}
+.search-box-home-3 {
+ margin-top: 30px;
+}
+/*==================================
+ Home page 4
+====================================*/
+.section-title h2 {
+ font-size: 17px;
+ font-weight: 600;
+}
+.new-product-4.home-page-2 .section-title h2 {
+ font-size: 18px;
+}
+.new-product-area.dotted-5.new-product-4 .hot-deal-title::before {
+ left: 101px;
+}
+.timer .cdown {
+ margin: 20px 6px 19px;
+}
+.section-title-4::before {
+ left: 142px;
+ width: 24%;
+}
+.single-static-banner .single-static-text.single-static-text-4 {
+ top: 8%;
+}
+.section-title.section-title-4.section_4::before {
+ left: 183px;
+ width: 9.5%;
+}
+.feature-product-4 .section-title::before {
+ left: 150px;
+ width: 20%;
+}
+/*==================================
+ Bedroom-Page
+====================================*/
+.bedroom-sideber {
+ margin-bottom: 30px;
+}
+.tab_menu {
+ margin-bottom: 30px;
+ text-align: center;
+}
+.porduct-option-left > span {
+ display: block;
+ margin-bottom: 30px;
+ margin-left: 75px;
+}
+.sort-by {
+ text-align: center;
+ margin-left: 28px;
+ margin-bottom: 15px;
+}
+.single-new-product.category-new-product .new-product-action a {
+ padding: 12px 22px;
+}
+.pagination-text {
+ margin-top:0px;
+}
+.single-category-product-img {
+ width: 100%;
+}
+.single-category-product-info {
+ float: left;
+ padding-left: 0;
+ width: 100%;
+}
+/*==================================
+ Blog-Page
+====================================*/
+.post-list-img {
+ width: 100%;
+}
+.post-list-info {
+ margin-top: 15px;
+ padding-left: 0;
+ width: 100%;
+}
+/*==================================
+ Shop-Page
+====================================*/
+ul.sinple-tab-menu li a {
+ margin-left: 11px;
+}
+.product-simple-content .sinple-c-title h3 {
+ margin-top: 30px;
+ font-size:25px;
+}
+.product-info-detailed, .hyper-banner{
+ padding-top: 0;
+}
+.customer-review-form {
+ width: 100%;
+}
+.customer-review-top > h3 {
+ font-size: 30px;
+ margin-bottom: 5px;
+}
+.cus-review-left {
+ width: 100%;
+}
+p.checkout-coupon input[type="text"] {
+ margin-bottom: 20px;
+}
+}
+
+/* Large Mobile :480px. */
+@media only screen and (min-width: 480px) and (max-width: 767px) {
+.container {width:450px}
+/*==================================
+ Home page 1
+====================================*/
+.slide_all_1, .slide_all_2 {
+ left: 40px;
+ top: 27%;
+}
+.slide_all_1 h3, .slide_all_1 h2, .slide_all_2 h3, .slide_all_2 h2 {
+ font-size: 20px;
+ margin-bottom: 12px;
+}
+.shop-cart-hover {
+ right: 80px;
+}
+.new-product-action a {
+ padding: 8px 9px;
+}
+.mar_b-30{
+ margin-bottom:30px;
+}
+.single-banner img {
+ width: 100%;
+}
+/*==================================
+ Home page 3
+====================================*/
+ .new-product-area-3 .owl-carousel .owl-controls .owl-nav div {
+ top: -131px;
+}
+.single-static-banner .single-static-text {
+ padding: 10px 26px;
+ top:10px;
+}
+.single-static-text span {
+ font-size: 17px;
+}
+.single-static-text h3 {
+ font-size: 18px;
+ line-height: 30px;
+}
+/*==================================
+ Home page 4
+====================================*/
+.new-product-area.dotted-5.new-product-4 .hot-deal-title::before {
+ width: 60%;
+}
+.section-title-4::before {
+ width: 51%;
+}
+.section-title.section-title-4.section_4::before {
+ left: 190px;
+ width: 40%;
+}
+.feature-product-4 .section-title::before {
+ width: 45%;
+}
+/*==================================
+ Bedroom-Page
+====================================*/
+.sideber-ads-img img {
+ width: 100%;
+}
+.single-new-product.category-new-product .new-product-action a {
+ padding: 12px 47px;
+}
+}
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/css/slippry.css b/sm-shop/src/main/webapp/resources/templates/generic/css/slippry.css
new file mode 100644
index 0000000..d62318c
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/css/slippry.css
@@ -0,0 +1,281 @@
+/**
+ *
+ * slippry v1.4.0 - Responsive content slider for jQuery
+ * http://slippry.com
+ *
+ * Authors: Lukas Jakob Hafner - @saftsaak
+ * Thomas Hurd - @SeenNotHurd
+ *
+ * Copyright 2016, booncon oy - http://booncon.com
+ *
+ *
+ * Released under the MIT license - http://opensource.org/licenses/MIT
+ */
+/* kenBurns animations, very basic */
+@-webkit-keyframes left-right {
+ 0% {
+ -webkit-transform: translateY(-20%) translateX(-10%);
+ transform: translateY(-20%) translateX(-10%); }
+ 100% {
+ -webkit-transform: translateY(0%) translateX(10%);
+ transform: translateY(0%) translateX(10%); } }
+@-o-keyframes left-right {
+ 0% {
+ -o-transform: translateY(-20%) translateX(-10%);
+ transform: translateY(-20%) translateX(-10%); }
+ 100% {
+ -o-transform: translateY(0%) translateX(10%);
+ transform: translateY(0%) translateX(10%); } }
+@keyframes left-right {
+ 0% {
+ -webkit-transform: translateY(-20%) translateX(-10%);
+ -o-transform: translateY(-20%) translateX(-10%);
+ transform: translateY(-20%) translateX(-10%); }
+ 100% {
+ -webkit-transform: translateY(0%) translateX(10%);
+ -o-transform: translateY(0%) translateX(10%);
+ transform: translateY(0%) translateX(10%); } }
+@-webkit-keyframes right-left {
+ 0% {
+ -webkit-transform: translateY(0%) translateX(10%);
+ transform: translateY(0%) translateX(10%); }
+ 100% {
+ -webkit-transform: translateY(-20%) translateX(-10%);
+ transform: translateY(-20%) translateX(-10%); } }
+@-o-keyframes right-left {
+ 0% {
+ -o-transform: translateY(0%) translateX(10%);
+ transform: translateY(0%) translateX(10%); }
+ 100% {
+ -o-transform: translateY(-20%) translateX(-10%);
+ transform: translateY(-20%) translateX(-10%); } }
+@keyframes right-left {
+ 0% {
+ -webkit-transform: translateY(0%) translateX(10%);
+ -o-transform: translateY(0%) translateX(10%);
+ transform: translateY(0%) translateX(10%); }
+ 100% {
+ -webkit-transform: translateY(-20%) translateX(-10%);
+ -o-transform: translateY(-20%) translateX(-10%);
+ transform: translateY(-20%) translateX(-10%); } }
+/* added to the original element calling slippry */
+.sy-box.sy-loading {
+ background: url("/resources/img/loading.gif") 50% 50% no-repeat;
+ -webkit-background-size: 32px 32px;
+ background-size: 32px;
+ min-height: 40px; }
+ .sy-box.sy-loading .sy-slides-wrap, .sy-box.sy-loading .sy-pager {
+ visibility: hidden; }
+
+/* element that wraps the slides */
+.sy-slides-wrap {
+ position: relative;
+ height: 100%;
+ width: 100%; }
+ .sy-slides-wrap:hover .sy-controls {
+ display: block; }
+
+/* element that crops the visible area to the slides */
+.sy-slides-crop {
+ height: 100%;
+ width: 100%;
+ position: absolute;
+ overflow: hidden; }
+
+/* list containing the slides */
+.sy-list {
+ width: 100%;
+ height: 100%;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ position: absolute; }
+ .sy-list.horizontal {
+ -webkit-transition: left ease;
+ -o-transition: left ease;
+ transition: left ease; }
+ .sy-list.vertical {
+ -webkit-transition: top ease;
+ -o-transition: top ease;
+ transition: top ease; }
+
+/* single slide */
+.sy-slide {
+ position: absolute;
+ width: 100%;
+ z-index: 2; }
+ .sy-slide.kenburns {
+ width: 140%;
+ left: -20%; }
+ .sy-slide.kenburns.useCSS {
+ -webkit-transition-property: opacity;
+ -o-transition-property: opacity;
+ transition-property: opacity; }
+ .sy-slide.kenburns.useCSS.sy-ken:nth-child(1n) {
+ -webkit-animation-name: left-right;
+ -o-animation-name: left-right;
+ animation-name: left-right;
+ -webkit-animation-fill-mode: forwards;
+ -o-animation-fill-mode: forwards;
+ animation-fill-mode: forwards; }
+ .sy-slide.kenburns.useCSS.sy-ken:nth-child(2n) {
+ -webkit-animation-name: right-left;
+ -o-animation-name: right-left;
+ animation-name: right-left;
+ -webkit-animation-fill-mode: forwards;
+ -o-animation-fill-mode: forwards;
+ animation-fill-mode: forwards; }
+ .sy-slide.sy-active {
+ z-index: 3; }
+ .sy-slide > img {
+ margin: 0;
+ padding: 0;
+ display: block;
+ width: 100%;
+ border: 0; }
+ .sy-slide > a {
+ margin: 0;
+ padding: 0;
+ display: block;
+ width: 100%; }
+ .sy-slide > a > img {
+ margin: 0;
+ padding: 0;
+ display: block;
+ width: 100%;
+ border: 0; }
+
+/* next/ prev buttons, with arrows and clickable area a lot larger than the visible buttons */
+.sy-controls {
+ display: none;
+ list-style: none;
+ height: 100%;
+ width: 100%;
+ position: absolute;
+ padding: 0;
+ margin: 0; }
+ .sy-controls li {
+ position: absolute;
+ width: 10%;
+ min-width: 4.2em;
+ height: 100%;
+ z-index: 33; }
+ .sy-controls li.sy-prev {
+ left: 0;
+ top: 0; }
+ .sy-controls li.sy-prev a:after {
+ background-position: -5% 0; }
+ .sy-controls li.sy-next {
+ right: 0;
+ top: 0; }
+ .sy-controls li.sy-next a:after {
+ background-position: 105% 0; }
+ .sy-controls li a {
+ position: relative;
+ width: 100%;
+ height: 100%;
+ display: block;
+ text-indent: -9999px; }
+ .sy-controls li a:link, .sy-controls li a:visited {
+ opacity: 0.4; }
+ .sy-controls li a:hover, .sy-controls li a:focus {
+ opacity: 0.8;
+ outline: none; }
+ .sy-controls li a:after {
+ content: "";
+ background-image: url("/resources/img/arrows.svg");
+ background-repeat: no-repeat;
+ -webkit-background-size: cover;
+ background-size: cover;
+ text-align: center;
+ text-indent: 0;
+ line-height: 2.8em;
+ color: #111;
+ font-weight: 800;
+ position: absolute;
+ background-color: #fff;
+ width: 2.8em;
+ height: 2.8em;
+ left: 50%;
+ top: 50%;
+ margin-top: -1.4em;
+ margin-left: -1.4em;
+ border-radius: 50%; }
+ @media only screen and (max-device-width: 600px) {
+ .sy-controls {
+ display: block; }
+ .sy-controls li {
+ min-width: 2.1em; }
+ .sy-controls li a:after {
+ width: 1.4em;
+ height: 1.4em;
+ margin-top: -0.7em;
+ margin-left: -0.7em; } }
+
+/* captions, styled fo the overlay variant */
+.sy-caption-wrap {
+ position: absolute;
+ bottom: 2em;
+ z-index: 12;
+ left: 50%; }
+ .sy-caption-wrap .sy-caption {
+ position: relative;
+ left: -50%;
+ background-color: rgba(0, 0, 0, 0.54);
+ color: #fff;
+ padding: 0.4em 1em;
+ border-radius: 1.2em; }
+ .sy-caption-wrap .sy-caption a:link, .sy-caption-wrap .sy-caption a:visited {
+ color: #e24b70;
+ font-weight: 600;
+ text-decoration: none; }
+ .sy-caption-wrap .sy-caption a:hover, .sy-caption-wrap .sy-caption a:focus {
+ text-decoration: underline; }
+ @media only screen and (max-device-width: 600px), screen and (max-width: 600px) {
+ .sy-caption-wrap {
+ left: 0;
+ bottom: 0.4em; }
+ .sy-caption-wrap .sy-caption {
+ left: 0;
+ padding: 0.2em 0.4em;
+ font-size: 0.92em;
+ border-radius: 0; } }
+
+/* pager bubbles */
+.sy-pager {
+ clear: both;
+ display: block;
+ width: 100%;
+ margin: 1em 0 0;
+ padding: 0;
+ list-style: none;
+ text-align: center; }
+ .sy-pager li {
+ display: inline-block;
+ width: 1.2em;
+ height: 1.2em;
+ margin: 0 1em 0 0;
+ border-radius: 50%; }
+ .sy-pager li.sy-active a {
+ background-color: #e24b70; }
+ .sy-pager li a {
+ width: 100%;
+ height: 100%;
+ display: block;
+ background-color: #ccc;
+ text-indent: -9999px;
+ -webkit-background-size: 2em 2em;
+ background-size: 2em;
+ border-radius: 50%; }
+ .sy-pager li a:link, .sy-pager li a:visited {
+ opacity: 1.0; }
+ .sy-pager li a:hover, .sy-pager li a:focus {
+ opacity: 0.6; }
+
+/* element to "keep/ fill" the space of the content, gets intrinsic height via js */
+.sy-filler {
+ width: 100%; }
+ .sy-filler.ready {
+ -webkit-transition: padding 600ms ease;
+ -o-transition: padding 600ms ease;
+ transition: padding 600ms ease; }
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/css/style.css b/sm-shop/src/main/webapp/resources/templates/generic/css/style.css
new file mode 100644
index 0000000..c2a9abf
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/css/style.css
@@ -0,0 +1,3485 @@
+/* --------------------------------------------------
+ Template Name: Grand - eCommerce bootstrap template
+ Template URI: http://bootexperts.com
+ Description: Digital eCommerce bootstrap template
+ Author: BootExperts
+ Author URI: http://bootexperts.com
+ Version: 1.0
+ ------------------------------------------------ */
+
+/*------------------------------------------------------
+ 1.Theme Default CSS (body, link color, section etc)
+ 2. Header
+ 3.Mainmenu-Area
+ 4.Slider-Area
+ 5.Service-Area
+ 6.New-Product-Area
+ 7.Banner-Area
+ 8.Static-Slider-Area
+ 9.Feature-Preduct-Area
+ 10.Blog-Area
+ 11.Purchase-Progress-Area
+ 12.Contuct-Area
+ 13.Footer-Area
+ 14.Contuct-Us-Page
+ 15.Blog-Page-Area
+ 16.Bedroom-Page-Area
+ 17.Home-2
+ 18.Home-3
+ 19.Home-4
+ 20.Product-Details
+ 21.Login-Page
+ 22. Wishlist-Page
+ 23.Cart-Page
+ 24.Checkout-Page
+ ------------------------------------------------------------*/
+
+/* ---------1.Theme default CSS---------- */
+
+html, body {height: 100%;}
+body {
+ color: #666666;
+ font-family: 'Lato', sans-serif;
+ font-size: 15px;
+ line-height: 1.42857;
+}
+.floatleft {float:left}
+.floatright {float:right}
+.alignleft {float:left;margin-right:15px;margin-bottom: 15px}
+.alignright {float:right;margin-left:15px;margin-bottom: 15px}
+.aligncenter {display:block;margin:0 auto 15px}
+a:focus {outline:0px solid;text-decoration:none;}
+img {max-width:100%;height:auto}
+.fix {overflow:hidden}
+p {margin:0 0 15px;color:#333}
+h1, h2, h3, h4, h5, h6 {
+ color: #333333;
+ font-weight: 700;
+ line-height: 1.35;
+ margin:0px;
+}
+a {transition: all 0.3s ease 0s;text-decoration:none;color:#333}
+a:hover {
+ /**color: #C2A773;**/
+ text-decoration: none;
+}
+a:active, a:hover {
+ outline: 0 none;
+}
+ul{
+ list-style: outside none none;
+ margin: 0;
+ padding: 0
+}
+.clear{clear:both}
+body {}
+::-moz-selection {
+ background: #b3d4fc;
+ text-shadow: none;
+}
+::selection {
+ background: #b3d4fc;
+ text-shadow: none;
+}
+.browserupgrade {
+ margin: 0.2em 0;
+ background: #ccc;
+ color: #000;
+ padding: 0.2em 0;
+}
+.ptb-10{padding:10px 0}
+.ptb-25{padding:25px 0}
+.ptb-40{padding:40px 0}
+.ptb-50{padding:50px 0}
+.ptb-60{padding:60px 0}
+.ptb-70{padding:70px 0}
+.ptb-80{padding:80px 0}
+.pt-10{padding-top:10px;}
+.pt-40{padding-top:40px;}
+.pt-50{padding-top:50px;}
+.pt-80{padding-top:80px;}
+.pb-30{padding-bottom:30px;}
+.pb-40{padding-bottom:40px;}
+.pb-50{padding-bottom:50px;}
+.pb-80{padding-bottom:80px;}
+.mt-30{margin-top:30px;}
+.mt-40{margin-top:40px;}
+.mt-50{margin-top:50px;}
+.mb-30{margin-bottom:30px;}
+
+.bg-color-1{background:#2E2D25;}
+/* scrollUp-start */
+#scrollUp {
+ background: #333333 none repeat scroll 0 0;
+ border: 2px solid #ffffff;
+ border-radius: 50%;
+ bottom: 20px;
+ color: #ffffff;
+ display: flex;
+ flex-direction: column;
+ font-size: 22px;
+ height: 40px;
+ justify-content: center;
+ position: absolute;
+ right: 30px;
+ text-align: center;
+ transition: all 0.3s ease 0s;
+ width: 40px;
+}
+#scrollUp:hover{
+ background:#c2a773;
+}
+
+/* .sticky */
+.sticky {
+ left: 0;
+ position: fixed;
+ top: 0;
+ width: 100%;
+ z-index: 1111111;
+ animation:300ms ease-in-out 0s normal none 1 running fadeInDown;
+}
+/* ---------2.Header-start---------- */
+.header-top-area {
+ background: #f2f2f2 none repeat scroll 0 0;
+}
+.header-left-menu {
+ background: rgba(0, 0, 0, 0) none repeat scroll 0 0;
+ border: medium none;
+ border-radius: 0;
+ display: inline-block;
+}
+ .header-left-menu:hover{
+ color:#C2A773;
+ background:none;
+ }
+.header-left-menu ul {
+ box-shadow: 0 1px 7px -2px rgba(0, 0, 0, 0.3);
+ left: 0px;
+ padding: 0 10px;
+ top: 130%;
+ width: 210px;
+}
+.header-left-menu ul li a {
+ border-radius: 0;
+ color: #4b4b4b;
+ display: block;
+ font-size: 13px;
+ font-weight: normal;
+ height: inherit;
+ line-height: 24px;
+ min-width: 145px;
+ padding: 12px 9px;
+ text-align: left;
+ text-transform: capitalize;
+ border-bottom:1px solid#ebebeb;
+}
+.header-left-menu img {
+ margin-right: 8px;
+}
+.header-left-menu i,.header-top-left ul li a i {
+ margin-left: 5px;
+}
+.header-left-menu ul li a:hover, .header-top-left ul li a:hover, .header-top-right ul li a:hover{
+ color:#C2A773;
+ background:none;
+ transition:none;
+}
+
+.dropdown-menu {
+ border: 0px solid rgba(0, 0, 0, 0.15);
+ border-radius: 0px;
+ box-shadow: 0 0px 0px rgba(0, 0, 0, 0.176);
+ margin: 0px 0 0;
+ padding: 0px 0;
+}
+.header-top-area .btn {
+ padding: 6px 21px 6px 0;
+}
+.header-top-area .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default {
+ background-color: #F2F2F2!important;
+ border-color: #F2F2F2!important;
+ color: #333333;
+}
+/* header-top-left */
+.header-top-left {
+ display: inline-block;
+}
+.header-top-left ul {
+}
+.header-top-left ul li, .header-top-right ul li {
+ display: inline-block;
+ position:relative;
+ text-align:left
+}
+.header-top-left ul li a{
+ font-size: 13px;
+ margin-right: 20px;
+ display:block;
+ text-transform: capitalize;
+}
+.header-top-right ul li a{
+ font-size: 13px;
+ margin-right: 20px;
+ display:block;
+ text-transform: capitalize;
+}
+.header-top-left ul li ul {
+ box-shadow: 0 1px 7px -2px rgba(0, 0, 0, 0.3);
+ left: -75px;
+ margin-left: 0;
+ padding: 0 15px;
+ position: absolute;
+ top: 195%;
+ width: 210px;
+ display:none;
+ z-index:1111;
+ background:#fff;
+}
+.header-top-left ul li ul li{
+ display:block;
+}
+.header-top-left ul li ul li a {
+ padding: 12px 0px;
+ border-bottom:1px solid#ebebeb;
+ margin-right:0px;
+}
+/* header-top-right */
+.single-header-bottom-info {
+ display: inline-block;
+ padding: 0 70px 0 23px;
+ position: relative;
+ }
+.header-top-right {
+ margin-top: 5px;
+ text-align: right;
+}
+.header-top-area .header-top-right a span {
+ float: left;
+ margin-right: 7px;
+ margin-top: 4px;
+}
+.header-top-right ul li a{
+ margin-right:0;
+ margin-left:30px;
+}
+/* header-bottom-area-start */
+.header-bottom-area{
+ background:#fff;
+}
+.header-bottom-area .col-lg-7 .single-header-bottom-info:first-child {
+ border-left: medium none;
+}
+
+.logo.logo2 {
+ text-align: center;
+}
+.single-header-bottom-info {
+ border-left: 1px solid #666666;
+ display: inline-block;
+ padding: 0 40px;
+ position: relative;
+}
+.header-bottom-icon span {
+ color: #5c5c5c;
+ float: left;
+ font-size: 28px;
+ margin-top: 9px;
+}
+.header-bottom-text {
+ margin-left: 40px;
+}
+.header-bottom-text h3{
+ font-size: 15px;
+ font-weight: 700;
+ margin-bottom: 3px;
+ text-transform: uppercase;
+}
+.header-bottom-text p {
+ font-size: 14px;
+ margin-bottom: 0;
+}
+.header-bottom-right {
+ margin-top: 8px;
+ text-align: right;
+}
+
+.shop-cart {
+ position: relative;
+}
+.shop-cart span {
+ font-size: 23px;
+ top: 5px;
+ position: relative;
+ left: -7px;
+}
+.shop-cart-hover {
+ background: #ffffff none repeat scroll 0 0;
+ box-shadow: 0 1px 7px -2px rgba(0, 0, 0, 0.3);
+ right: 15px;
+ opacity: 0;
+ position: absolute;
+ /**top: 140%;**/
+ top: 120%;
+ transform: scaleY(0);
+ transform-origin: 0 0 0;
+ transition: all 0.4s ease 0s;
+ visibility: hidden;
+ width: 300px;
+ z-index: 111;
+}
+.header-bottom-right:hover .shop-cart-hover{
+ opacity:1;
+ visibility:visible;
+ transform:scaleY(1);
+ z-index:11111111111;
+}
+
+.shop-cart-hover .cart-img {
+ float: left;
+ margin-right: 10px;
+ width: 30%;
+}
+.shop-cart-hover ul li {
+ overflow: hidden;
+ padding: 20px 20px 0;
+}
+.shop-cart-hover ul li .cart-content {
+ display: inline-block;
+ float: left;
+ text-align: left;
+ width: 60%;
+}
+.header-bottom-right .shop-cart-hover ul li a i {
+ margin-left: 5px;
+}
+.shop-cart-hover ul li .cart-content span {
+ display: block;
+}
+.shop-cart-hover ul li .cart-content h4 a {
+ font-size: 15px;
+ font-weight: 600;
+ margin-bottom: 6px;
+ text-transform: uppercase;
+}
+.header-bottom-right .checkout-bg a:hover{
+ background: #C2A773;
+}
+.header-bottom-right .cart-del i:hover{
+ color:#C2A773;
+}
+.header-bottom-right.header-bottom-right-2 .checkout-bg a:hover{
+ background: #e73b49 none repeat scroll 0 0;
+}
+.header-bottom-right-2 .cart-del i:hover, .header-bottom-right.header-bottom-right-2 .cart-content h4 a:hover{
+ color: #e73b49;
+}
+.header-bottom-right.header-bottom-right-4 .checkout-bg a:hover{
+ background: #ff8a0c none repeat scroll 0 0;
+}
+.header-bottom-right-4 .cart-del i:hover, .header-bottom-right.header-bottom-right-4 .cart-content h4 a:hover{
+ color: #FF8A0C;
+}
+.header-bottom-right.header-bottom-right-4 .checkout-bg a:hover{
+ background: #FF8A0C none repeat scroll 0 0;
+}
+.cart-content span a {
+ font-size: 13px;
+ margin-bottom: 5px;
+ color:#555;
+}
+.cart-del i {
+ cursor: pointer;
+}
+.shop-cart-hover ul li.total-price {
+ border-top: 1px solid #333333;
+ padding:20px;
+ margin-bottom:20px;
+ /**font-weight: 700;**/
+ /**margin: 10px 20px 10px;
+ margin-right: 10px;
+ padding: 20px 0;**/
+}
+.shop-cart-hover .checkout-bg {
+ background: #dddddd none repeat scroll 0 0;
+ padding: 18px 30px;
+ text-align: center;
+}
+.checkout-bg > a {
+ background: #444 none repeat scroll 0 0;
+ color: #fff;
+ display: block;
+ padding: 10px 0;
+ text-transform: capitalize;
+}
+
+/* ---------3.Mainmenu-Area-Start---------- */
+.mainmenu{}
+.mainmenu ul{}
+.mainmenu ul li{
+ display:inline-block;
+ position:relative;
+}
+.mainmenu ul li:first-child a {
+ padding-left: 0;
+}
+.mainmenu ul li a{
+ color: #ffffff;
+ display: block;
+ font-size: 14px;
+ font-weight: 900;
+ line-height: 25px;
+ padding: 22px 18px;
+ position: relative;
+ text-transform: uppercase;
+ transition:all.3s;
+}
+.mainmenu ul li:hover > a,.mainmenu ul li.active > a{
+ color:#C2A773;
+}
+.mainmenu ul li ul {
+ background: #ffffff none repeat scroll 0 0;
+ left: 0;
+ padding: 15px 10px;
+ position: absolute;
+ top: 100%;
+ width: 230px;
+ z-index: 111;
+ text-align:left;
+ opacity:0;
+ transform:scaleY(0);
+ transform-origin: 0 0 0;
+ visibility:hidden;
+ transition:all .5s;
+ box-shadow: 0 1px 7px -2px rgba(0, 0, 0, 0.3);
+}
+.mainmenu ul li:hover > ul{
+ opacity:1;
+ transform:scaleY(1);
+ visibility:visible;
+}
+.mainmenu ul li > ul li{
+ display:block;
+}
+.mainmenu ul li > ul li > a {
+ color: #666666;
+ padding: 6px 0;
+ text-transform: capitalize;
+ font-weight: 500;
+}
+.mainmenu ul li > ul li > a:hover{
+ color:#C2A773;
+ transition:none;
+}
+/* megamenu */
+.mainmenu ul li .megamenu {
+ background: #ffffff none repeat scroll 0 0;
+ box-shadow: 0 1px 7px -2px rgba(0, 0, 0, 0.3);
+ padding: 15px 10px;
+ position: absolute;
+ width: 690px;
+ transition:all.5s;
+ transform:scaleY(0);
+ opacity:0;
+ visibility:hidden;
+ transform-origin:0 0 0;
+ z-index:5000;
+}
+.mainmenu ul li:hover .megamenu{
+ opacity:1;
+ transform:scaleY(1);
+ visibility:visible;
+}
+.mainmenu ul li .megamenu span{
+ width:33.3%;
+ float:left;
+ padding:0 18px;
+}
+.mainmenu ul li .megamenu span a.megatitle {
+ border-bottom: 1px solid #dddddd;
+ color: #333333;
+ font-size: 15px;
+ font-weight: 900;
+ margin-bottom: 8px;
+ text-transform: uppercase;
+}
+.mainmenu ul li .megamenu span a{
+ color: #666666;
+ font-size: 14px;
+ font-weight: 400;
+ padding: 7px 0;
+ text-transform: capitalize;
+ overflow:hidden;
+}
+.mainmenu ul li .megamenu span a:hover{
+ color:#C2A773;
+ transition:none;
+}
+.mainmenu ul li .megamenu2{
+ width:800px!important;
+ left:-30px;
+}
+.mainmenu ul li .megamenu2 span{
+ width:25%;
+}
+
+@media (max-width: 768px) {
+ .menu-search-box {
+ margin-top: 10px !important;
+ text-align: center !important;
+ }
+}
+
+/* end-megamenu */
+.menu-search-box {
+ margin-top: 0px;
+ text-align: right;
+}
+.menu-search-box form {
+ position: relative;
+}
+.menu-search-box form input {
+ background: #3e3d33 none repeat scroll 0 0;
+ border: medium none;
+ border-radius: 3px;
+ color: #fff;
+ font-size: 13px;
+ height: 40px;
+ padding-left: 9px;
+ width: 100%;
+}
+.menu-search-box.scnd-fix form input {
+ color: #555;
+}
+
+.menu-search-box form button {
+ background: rgba(0, 0, 0, 0) none repeat scroll 0 0;
+ border: medium none;
+ color: #ffffff;
+ height: 100%;
+ line-height: 47px;
+ position: absolute;
+ right: 0;
+ width: 40px;
+}
+
+/* ---------4.Slider-Area-Start---------- */
+.slider-area{
+ position:relative;
+ /**margin-top:-15px;**/
+}
+.nivo-caption {
+ background: rgba(0, 0, 0, 0) none repeat scroll 0 0;
+ bottom: 0;
+ box-sizing: border-box;
+ color: #ffffff;
+ display: none;
+ height: 100%;
+ left: 0;
+ opacity: 1;
+ overflow: hidden;
+ padding: 5px 10px;
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+ width: 100%;
+ z-index: 8;
+}
+.slide_all_1 {
+ left: 131px;
+ position: absolute;
+ top: 21%;
+}
+.slider-area.slider-area-4 .slide_all_1,.slider-area.slider-area-4 .slide_all_2 {
+ top: 31%;
+}
+.slider-area.slider-area-3 .slide_all_1, .slider-area.slider-area-3 .slide_all_2 {
+ left: 0;
+ right: 0;
+ text-align: center;
+ top: 37%;
+ width: 100%;
+}
+.slider-area.slider-area-3 .slide_all_1 h1, .slider-area.slider-area-3 .slide_all_2 h3, .slider-area.slider-area-3 .slide_all_2 h2 {
+ color: #ffffff;
+ font-size: 35px;
+ margin-bottom: 10px;
+}
+.slider-area.slider-area-4 .slide_all_2 {
+ left: 44%;
+ position: absolute;
+ width: 56%;
+ text-align:center;
+}
+.slider-area.slider-area-4 .slide_all_2 h1, .slider-area-4 .slide_all_2 h2, .slider-area-4 .slide_all_2 h3 {
+ font-weight: 500;
+}
+.slider-area.slider-area-3 .slide_all_1 p {
+ font-size: 23px;
+}
+
+.slide_all_1 h1 {
+ color: #555;
+ font-size: 24px;
+ font-weight: 900;
+ letter-spacing: 0.5px;
+ line-height: 1;
+ margin-bottom: 20px;
+ text-transform: uppercase;
+}
+.slide_all_1 h3, .slide_all_1 h2{
+ color: #2e2d25;
+ font-size: 48px;
+ font-weight: 900;
+ line-height: 1;
+ margin-bottom: 17px;
+ text-transform: uppercase;
+}
+
+.slide_all_2 {
+ left: 8%;
+ position: absolute;
+ top: 21%;
+}
+.slide_all_2.home-2 h1, .slide_all_2.home-2 h2, .slide_all_2.home-2 h3 {
+ font-weight: 500;
+}
+.slide_all_2 h1 {
+ color: #555;
+ font-size: 24px;
+ font-weight: 900;
+ letter-spacing: 0.5px;
+ line-height: 1;
+ margin-bottom: 20px;
+ text-transform: uppercase;
+}
+.slide_all_2 h3, .slide_all_2 h2{
+ color: #2e2d25;
+ font-size: 48px;
+ font-weight: 900;
+ line-height: 1;
+ margin-bottom: 17px;
+ text-transform: uppercase;
+}
+.slider-btn {
+ margin-top: 45px;
+}
+.slider-area.slider-area-4 .slider-btn > a {
+ background: #FF8A0C;
+}
+.slider-btn > a {
+ background: #c2a773 none repeat scroll 0 0;
+ color: #ffffff;
+ display: inline-block;
+ font-size: 13px;
+ font-weight: 900;
+ line-height: 42px;
+ padding: 16px 20px;
+ text-transform: uppercase;
+ vertical-align: top;
+}
+.slider-btn.home-2 > a {
+ background: #e73b49 none repeat scroll 0 0;
+}
+.nivo-control {
+ background: #ffffff none repeat scroll 0 0;
+ border-radius: 50%;
+ display: inline-block;
+ height: 12px;
+ margin: 0 5px;
+ text-indent: -99999px;
+ width: 12px;
+}
+.nivo-controlNav {
+ bottom: -12px;
+ position: absolute;
+ text-align: center;
+ width: 100%;
+ z-index: 10;
+}
+.nivo-control.active {
+ background: #e09e25 none repeat scroll 0 0;
+}
+.slider-area.slider-area-2 .nivo-control.active {
+ background: #e73b49 none repeat scroll 0 0;
+}
+.slider-area-4 .nivo-control.active {
+ background: #FF8A0C;
+}
+/* ---------5.Service-Area-Start---------- */
+.service-area.home-page-2 {
+ background: #f8f8f8 none repeat scroll 0 0;
+}
+.service-content {
+ margin-left: 37px;
+}
+.service-icon {
+ border: 1px solid #e1e1e1;
+ border-radius: 50%;
+ height: 50px;
+ line-height: 42px;
+ margin-right: 16px;
+ text-align: center;
+ width: 50px;
+ float: left;
+ position: absolute;
+}
+.service-content {
+ margin-left: 69px;
+ margin-top: 0;
+ position: relative;
+ top: 6px;
+}
+.service-content > h4 {
+ font-size: 13px;
+ font-weight: 500;
+ text-transform: capitalize;
+}
+.service-content > span {
+ font-size: 13px;
+}
+.service-area{}
+.single-service {
+ border: 2px solid #EEEEEE;
+ cursor: pointer;
+ overflow: hidden;
+ padding: 10px;
+ position: relative;
+ min-height:316px;
+}
+.service-img{
+ position:relative;
+ overflow:hidden;
+ padding:10px;
+}
+.service-img a{
+ display:block;
+}
+.single-service h3 {
+ color: #333333;
+ display: block;
+ font-size: 14px;
+ font-weight: 700;
+ margin-top: 15px;
+ text-align: center;
+ text-transform: uppercase;
+ transition:all .3s;
+}
+.single-service:hover h3 {
+ color: #c2a773;
+}
+.service-area.service-area-4 .single-service:hover h3 {
+ color: #FF8A0C;
+}
+.service-img a img {
+ backface-visibility: hidden;
+ display: block;
+ height: 100%;
+ width: 100%;
+}
+.service-img .secendary{
+ position:absolute;
+ left:0;
+ top:100%;
+ opacity:0;
+}
+.single-service:hover .secendary {
+ opacity: 1;
+ padding: 20px;
+ transform: translate3d(0px, -100%, 0px);
+}
+.single-service:hover .primary{
+ transform: translate3d(0px, -100%, 0px);
+ opacity:0;
+}
+
+/* ---------6.New-Product-Area-Start---------- */
+.single-new-product {
+ margin-bottom: 30px;
+ overflow:hidden;
+ height:300px;
+}
+.section-title{
+ position:relative;
+}
+.section-title h2{
+ display: inline-block;
+ font-size: 24px;
+ font-weight: 900;
+ line-height: 30px;
+ text-transform: uppercase;
+ margin-bottom:15px;
+}
+.section-title p{
+ font-size: 16px;
+ font-weight: 300;
+ line-height: 24px;
+ margin-bottom:0;
+ margin-bottom:40px;
+}
+.product-img > a::before {
+ background: #333 none repeat scroll 0 0;
+ content: "";
+ height: 100%;
+ left: 0;
+ opacity: 0;
+ position: absolute;
+ top: 0;
+ width: 100%;
+ z-index: 4;
+ transition:all .4s;
+}
+.single-new-product:hover a:before {
+ opacity: 0.1;
+}
+
+
+.product-img{
+ position:relative;
+}
+.product-img > a{
+ position:relative;
+ display:block;
+ transition:all .4s;
+}
+.product-img .seceond_img{
+ position:absolute;
+ left:0;
+ top:0;
+ opacity:0;
+ transition:all .4s;
+}
+.new-product-action {
+ bottom: 0;
+ position: absolute;
+ text-align: center;
+ width:100%;
+ z-index:4;
+ opacity:0;
+ transition:all.4s;
+ transform:scaleY(0);
+ transform-origin:center bottom 0;
+}
+.new-product-action a {
+ background: #e7cc98 none repeat scroll 0 0;
+ color: #ffffff;
+ display: inline-block;
+ font-size: 16px;
+ margin: -1px;
+ padding: 8px 11px;
+}
+.new-product-action a span.cart_pad {
+ margin-right: 7px;
+}
+.new-product-action a:hover{
+ background:#c2a773;
+}
+.single-new-product:hover .seceond_img{opacity:1;}
+.single-new-product:hover .new-product-action{opacity:1;z-index:11111; transform:scaleY(1)}
+.product-content{}
+.product-content a h3{
+ color: #333333;
+ display: block;
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 24px;
+ overflow: hidden;
+ text-transform: capitalize;
+ margin: 10px 0;
+}
+.product-content a h3:hover{
+ color:#c2a773;
+}
+.product-price-star i {
+ color: #c2a773;
+ font-size: 14px;
+}
+.product-content h4{
+ color: #333333;
+ font-size: 15px;
+ font-weight: 700;
+ margin-top: 7px;
+}
+span.new {
+ background: #ee5655 none repeat scroll 0 0;
+ color: #ffffff;
+ font-size: 12px;
+ padding: 4px 8px;
+ position: absolute;
+ top: 12px;
+ z-index: 111;
+}
+.price h4 {
+ display: inline-block;
+}
+h3.del-price {
+ color: #777;
+ display: inline-block;
+ font-size: 16px;
+ margin-left: 10px;
+}
+.porduct-option-left.floatleft > span {
+ color: #555;
+}
+.product-icon-wrapper {
+ position: absolute;
+ right: 22px;
+ top: 5px;
+}
+.product-icon {
+ opacity: 0;
+ position: relative;
+ right: -40px;
+ visibility: hidden;
+ transition:all.4s;
+}
+.product-icon li {
+ margin-bottom: 5px;
+}
+.product-icon a {
+ background: #ffffff none repeat scroll 0 0;
+ display: flex;
+ flex-direction: column;
+ height: 40px;
+ justify-content: center;
+ text-align: center;
+ transition: all 0.4s ease 0s;
+ width: 40px;
+ margin-bottom: 3px;
+ color:#c2a773;
+}
+.new-product-area.home-page-2 .single-new-product .product-icon ul li a:hover {
+ background: #ffffff none repeat scroll 0 0;
+ color: #e73b49;
+}
+.product-icon a:hover{
+ background:#c2a773;
+ color:#fff;
+}
+.single-new-product:hover .product-icon {
+ opacity: 1;
+ right: 9px;
+ top: 5px;
+ visibility: visible;
+ z-index: 11;
+}
+
+.dotted-style2 .owl-carousel .owl-controls .owl-nav div, .dotted-style3 .owl-carousel .owl-controls .owl-nav div {
+ background: rgba(0, 0, 0, 0.2) none repeat scroll 0 0;
+ color: #ffffff;
+ display: flex;
+ flex-direction: column;
+ font-size: 20px;
+ height: 60px;
+ justify-content: center;
+ left: 150px;
+ position: absolute;
+ text-align: center;
+ top: 50%;
+ transform: translateY(-50%);
+ width: 42px;
+ opacity:0;
+ transition:all.4s;
+ line-height:60px;
+}
+.dotted-style2 .owl-carousel:hover .owl-controls .owl-nav div{opacity:1;left:172px}
+.dotted-style2 .owl-carousel .owl-controls .owl-nav div.owl-next{
+ right:150px;
+ left:auto;
+}
+.dotted-style2 .owl-carousel:hover .owl-controls .owl-nav div.owl-next{right:172px}
+
+.dotted-style3 .owl-carousel .owl-controls .owl-nav div {
+ left: 10px;
+ top: 40%;
+}
+.dotted-style3 .owl-carousel:hover .owl-controls .owl-nav div{opacity:1;left:0px}
+.dotted-style3 .owl-carousel .owl-controls .owl-nav div.owl-next{
+ right:10px;
+ left:auto;
+}
+.dotted-style3 .owl-carousel:hover .owl-controls .owl-nav div.owl-next{right:0px}
+.dotted-style4 .owl-carousel .owl-controls .owl-nav div {
+ display: inline-block;
+ font-size: 20px;
+ height: 30px;
+ line-height: 25px;
+ position: absolute;
+ right: 16px;
+ text-align: center;
+ top: -71px;
+ width: 30px;
+}
+.dotted-style4 .owl-carousel .owl-controls .owl-nav div.owl-next{
+ right:60px;
+ left:auto;
+}
+
+/* ---------7.Banner-Area-Start---------- */
+.single-banner{
+ overflow:hidden;
+}
+.single-banner img{
+ transition:all.5s;
+}
+.single-banner img:hover{
+ transform:scale(1.1)
+}
+.banner_img_3 {
+ margin-bottom: 30px;
+}
+
+/* ---------8.Static-Slider-Area-Start---------- */
+.single-slider{
+ position:relative;
+}
+.slider-img{}
+.slider-info {
+ left: 0;
+ position: absolute;
+ top: 50%;
+ transform: translateY(-50%);
+ width: 100%;
+}
+.slider-info h3{
+ color: #808080;
+ font-size: 24px;
+ font-weight: 900;
+ letter-spacing: 0.5px;
+ line-height: 1;
+ margin-bottom: 20px;
+}
+.slider-info h1{
+ color: #2e2d25;
+ font-size: 48px;
+ font-weight: 900;
+ line-height: 1;
+ margin-bottom: 17px;
+ }
+.slider-info h2{
+ color: #2e2d25;
+ font-size: 48px;
+ font-weight: 900;
+ line-height: 1;
+ margin-bottom: 17px;
+}
+.slider-info a{
+ background: #c2a773 none repeat scroll 0 0;
+ color: #ffffff;
+ display: inline-block;
+ font-size: 13px;
+ font-weight: 900;
+ line-height: 42px;
+ margin-top: 45px;
+ padding: 0 20px;
+ vertical-align: top;
+}
+.dotted-style .owl-carousel .owl-controls .owl-dots {
+ margin-top: -30px;
+ position: relative;
+ text-align: center;
+}
+.dotted-style .owl-carousel .owl-controls .owl-dots .owl-dot {
+ background: #869791 none repeat scroll 0 0;
+ border-radius: 100%;
+ display: inline-block;
+ height: 12px;
+ margin: 0 2px;
+ width: 12px;
+}
+.dotted-style .owl-carousel .owl-controls .owl-dot.active {
+ background: #c2a773 none repeat scroll 0 0;
+}
+.static-single-slider {
+ position: relative;
+}
+.static-slider-text {
+ max-width: 600px;
+ position: absolute;
+ right: 8%;
+ text-align: center;
+ top: 50%;
+ transform: translateY(-50%);
+}
+.static-slider-text h2{
+ font-size: 18px;
+ line-height: 1;
+ margin-bottom: 20px;
+ text-transform:uppercase;
+}
+.static-slider-text h1{
+ font-size: 28px;
+ font-weight: 900;
+ line-height: 1;
+ margin-bottom: 30px;
+ text-transform:uppercase;
+}
+.static-slider-text p{
+ color: #333333;
+ font-size: 16px;
+ font-weight: 300;
+ line-height: 24px;
+ margin-bottom:0;
+}
+a.shopnow{
+ background: #c2a773 none repeat scroll 0 0;
+ color: #ffffff;
+ display: inline-block;
+ font-size: 14px;
+ font-weight: 900;
+ line-height: 40px;
+ margin-top: 45px;
+ padding: 0 20px;
+ text-transform: uppercase;
+ }
+
+/* ---------9.Feature-Preduct-Area-Start---------- */
+.feature-action a {
+ padding: 10px 20px;
+}
+.feature-preduct-area.home-page-2 .single-new-product .product-img {
+ float: left;
+ width: 40%;
+}
+.feature-preduct-area.home-page-2 .single-new-product .product-content {
+ float: left;
+ padding-left: 12px;
+ text-align: left;
+ width: 60%;
+}
+
+.feature-preduct-area.home-page-2 .product-img.product-img-home2 {
+ width: 100%;
+}
+.feature-preduct-area.home-page-2 .product-content.product-content-home2.text-center {
+ text-align: center;
+ width: 100% ;
+}
+.feature-preduct-area.dotted-style4.home-page-2 .section-title::after {
+ display: none;
+}
+.feature-preduct-area.dotted-style4.home-page-2 .single-new-product .new-product-action > a {
+ background: #f9a0ae none repeat scroll 0 0;
+}
+.feature-preduct-area.dotted-style4.home-page-2.feature-area-2 .single-new-product .new-product-action > a:hover {
+ background: #e73b49 none repeat scroll 0 0 !important;
+}
+
+/* ---------10.Blog-Area-Start---------- */
+.single-blog{
+ overflow:hidden;
+}
+.blog-img{
+ overflow:hidden;
+}
+.blog-img img{
+ transition:all .4s;
+}
+.blog-img:hover img{
+ transform: scale(1.1);
+}
+.blog-info h2{
+ display: block;
+ font-size: 18px;
+ font-weight: 700;
+ line-height: 24px;
+ margin-bottom: 12px;
+ margin-top: 21px;
+ text-transform: capitalize;
+}
+.blog-info h2:hover{
+ color:#c2a773;
+}
+.blog-info p {
+ font-size: 15px;
+ font-weight: 300;
+ line-height: 24px;
+ margin-bottom: 0;
+ padding: 0 0 18px;
+}
+.blog-info > a{
+ color: #333333;
+ font-size: 15px;
+ font-weight: 300;
+ text-transform: capitalize;
+}
+.blog-info > a:hover{
+ color:#c2a773;
+}
+.blog-info a .lnr-arrow-right {
+ margin-left: 8px;
+ margin-top: 5px;
+ position: absolute;
+}
+
+/* ---------11.Purchase-Progress-Area-Start---------- */
+.single-purchase{
+ margin-top:30px;
+}
+.purchase-info{}
+.purchase-info h3{
+ display: block;
+ font-size: 18px;
+ font-weight: 400;
+ margin-bottom: 10px;
+ margin-top: 20px;
+}
+.purchase-info p {
+ font-size: 15px;
+ font-weight: 300;
+ line-height: 24px;
+ margin-bottom: 0;
+}
+
+/* ---------12.Contuct-Area-Start---------- */
+.contact-area {
+ background: #f6f6f6 none repeat scroll 0 0;
+}
+.contuct-info h4{
+ display: block;
+ font-size: 16px;
+ font-weight: 900;
+ margin-bottom: 5px;
+ text-transform: uppercase;
+}
+.contuct-info p{
+ color: #333333;
+ display: block;
+ font-size: 15px;
+ font-weight: 400;
+ line-height: 24px;
+ margin-bottom:0;
+}
+.search-box form {
+ position: relative;
+}
+.search-box form input {
+ height: 48px;
+ width: 100%;
+ background: #ffffff none repeat scroll 0 0;
+ border: 1px solid #e6e6e6;
+ color: #909090;
+ font-weight: 300;
+ padding: 10px 65px 10px 10px;
+}
+.search-box button {
+ -moz-border-bottom-colors: none;
+ -moz-border-left-colors: none;
+ -moz-border-right-colors: none;
+ -moz-border-top-colors: none;
+ background: rgba(0, 0, 0, 0) none repeat scroll 0 0;
+ border-color: -moz-use-text-color -moz-use-text-color -moz-use-text-color #e1e1e1;
+ border-image: none;
+ border-style: none none none solid;
+ border-width: medium medium medium 1px;
+ height: 100%;
+ position: absolute;
+ right: 0;
+ width: 40px;
+}
+
+/* ---------13.Footer-Area-Start---------- */
+.footer-area{
+ background:#2E2D25;
+}
+.footer-logo {
+ display: block;
+ margin-bottom: 25px;
+}
+.footer-wrapper > p {
+ color: #fff;
+ line-height: 24px;
+ margin-bottom: 20px;
+}
+.footer-wrapper ul li{
+ color: #ffffff;
+ display: block;
+ line-height: 25px;
+ margin-bottom: 15px;
+}
+.footer-wrapper ul li a{
+ color:#fff;
+}
+.footer-wrapper ul li a:hover{
+ color:#C2A773;
+}
+.footer-wrapper > ul li span {
+ text-transform: capitalize;
+ color:#fff;
+}
+
+ul.footer-social li {
+ display: inline-block;
+}
+ul.footer-social li a {
+ color: #fff;
+ display: block;
+ height: 35px;
+ width: 35px;
+}
+.footer-wrapper ul.footer-social li {
+ margin-bottom: 0;
+}
+.footer-title{
+ position:relative;
+ margin-bottom:21px;
+}
+.footer-title::before {
+ background: #c2a773 none repeat scroll 0 0;
+ bottom: 0;
+ content: "";
+ height: 2px;
+ position: absolute;
+ width: 40px;
+}
+.footer-title a h3{
+ color: #ffffff;
+ font-size: 16px;
+ font-weight: 900;
+ line-height: 22px;
+ padding-bottom: 17px;
+ text-transform: uppercase;
+}
+ul.usefull-link li {
+ margin-bottom: 6px;
+}
+ul.usefull-link li a {
+ color: #ffffff;
+ text-transform: capitalize;
+ transition:all .3s;
+}
+ul.usefull-link li a:hover{
+ margin-left:8px;
+ color:#c2a773;
+}
+.footer-wrapper-strong > a {
+ float: left;
+}
+.wrapper-strong-span > p {
+ color: #fff;
+ float: left;
+ line-height: 25px;
+ margin-top: 21px;
+}
+.wrapper-strong-span > p {
+ float: left;
+ line-height: 25px;
+ margin-top: 21px;
+}
+.footer-wrapper-img{
+ overflow:hidden;
+}
+.footer-wrapper-img img{
+ transition:all.4s;
+}
+.footer-wrapper-img img:hover{
+ transform: scale(1.1);
+}
+.footer-wrapper-img > a {
+ float: left;
+ margin-bottom: 10px;
+ margin-right: 10px;
+ width: 29%;
+}
+.footer-wrapper-img > a {
+ overflow: hidden;
+}
+.footer-wrapper > a {
+ color: #ffffff;
+ display: inline-block;
+ font-style: italic;
+}
+.footer-wrapper > a:hover{
+ color:#c2a773;
+}
+.footer-wrapper a i {
+ float: right;
+ margin-left: 10px;
+ margin-top: 4px;
+}
+
+.copyright-area {
+ background: #25241d none repeat scroll 0 0;
+ padding: 30px 0;
+}
+.copyright.text-left > p {
+ color: #fff !important;
+ margin: 0;
+}
+.copyright-area.copyright-4 .copyright p {
+ color: #444!important;
+}
+.copyright.text-left > p a {
+ color: #ffffff;
+}
+.copyright.text-left > p a:hover{
+ color:#C2A773;
+}
+/* ---------14.Contuct-Page-Area-Start---------- */
+.page-title-wrapper {
+ background: rgba(0, 0, 0, 0) url("img/bg/contuct.jpg") no-repeat scroll center center / cover ;
+ min-height: 250px;
+ position:relative;
+}
+.page-title{
+ position:relative;
+}
+.page-title h3 {
+ color: #333333;
+ display: inline-block;
+ font-size: 24px;
+ font-weight: 900;
+ position: absolute;
+ text-transform: uppercase;
+ top: 101px;
+ vertical-align: top;
+}
+#map{
+ height:350px;
+}
+.contuct_f {
+ color: #333333;
+ margin-bottom: 30px;
+ font-weight:400;
+}
+.contuct_f > label {
+ font-weight: 400;
+ margin-bottom: 8px;
+}
+.form-control {
+ border: 1px solid #ededed;
+ border-radius: 1px;
+ box-shadow: none;
+}
+.contuct_f span {
+ color: #C2A773;
+ font-size: 15px;
+}
+.contact-btn {
+ border-radius: 0;
+ border: 1px solid#ededed;
+ padding: 8px 21px;
+ text-transform: uppercase;
+ font-weight: 700;
+ background: #ddd;
+}
+.contact-btn:hover {
+ background: #c2a773 none repeat scroll 0 0;
+ border: 1px solid #c2a773;
+ color: #ffffff;
+}
+/*---------- 15.Blog-Page-Area-Start -------------*/
+/* .breadcrumbs-start*/
+.breadcrumbs {
+ background: rgba(255, 255, 255, 0.5) none repeat scroll 0 0;
+ display: block;
+ left: 0;
+ position: absolute;
+ width: 100%;
+ z-index: 1;
+}
+ul.items li {
+ display: inline-block;
+ padding: 15px 12px;
+}
+ul.items li:first-child {
+ padding-left: 0;
+}
+ul.items li a i {
+ margin-left: 8px;
+ position: absolute;
+ top: 19px;
+}
+.items strong {
+ color: #c2a773;
+ font-weight: 400;
+}
+/*------post-list-wrapper-area-start---------- */
+.post-list-wrapper-area{}
+.single-post-list {
+ background: #f5f5f5 none repeat scroll 0 0;
+ overflow: hidden;
+ padding: 20px;
+ margin-bottom:20px;
+}
+.single-post-list:hover{
+ box-shadow: 3px 3px 4px 0 rgba(0, 0, 0, 0.1);
+}
+.post-list-img {
+ float: left;
+ width: 50%;
+}
+.post-list-info {
+ float: left;
+ padding-left: 12px;
+ width: 50%;
+}
+.post-list-info a h3 {
+ font-size: 17px;
+ margin-bottom: 10px;
+ text-transform: uppercase;
+}
+.post-list-info a h3:hover{
+ color:#C2A773;
+}
+.post-list-info span {
+ float: right;
+}
+.post-list-info > h4 {
+ color: #777777;
+ font-size: 15px;
+ margin-top: 12px;
+}
+.sideber-form {
+ margin-bottom: 30px;
+}
+.sideber-form form {
+ position: relative;
+}
+.sideber-form input {
+ border: 1px solid #e1e1e1;
+ border-radius: 3px;
+ font-size: 14px;
+ height: 40px;
+ padding-left: 10px;
+ text-transform: capitalize;
+ width: 100%;
+}
+.sideber-form button {
+ background: rgba(0, 0, 0, 0) none repeat scroll 0 0;
+ border: medium none;
+ height: 100%;
+ position: absolute;
+ right: 0;
+}
+.single-sidebar {
+ margin-bottom:30px;
+}
+.sideber-form {
+ margin-bottom: 30px;
+}
+.sidebar-title, .bedroom-title {
+ margin-bottom: 37px;
+ position: relative;
+}
+.sidebar-title > h4,.bedroom-title h4{
+ font-size: 16px;
+ font-weight: 800;
+ text-transform: uppercase;
+}
+.sidebar-title:before, .bedroom-title:before{
+ background: #333333 none repeat scroll 0 0;
+ bottom: -9px;
+ content: "";
+ height: 2px;
+ position: absolute;
+ width: 100%;
+}
+.sidebar-list a {
+ display: block;
+ padding: 4px 5px;
+}
+
+/* ----------16.Bedroom-Page-Area-Start--------------- */
+
+/* ----------price-slider--------------- */
+.ui-widget-header {
+ background: #c2a773 none repeat scroll 0 0;
+ color: #ffffff;
+ font-weight: bold;
+}
+.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr {
+ border-radius:0px;
+}
+.ui-slider.ui-slider-horizontal.ui-widget.ui-widget-content.ui-corner-all {
+ background: #eaeaea none repeat scroll 0 0;
+ border: medium none;
+ height: 5px;
+}
+.ui-slider-handle.ui-state-default.ui-corner-all {
+ background: #c2a773 none repeat scroll 0 0;
+ border: medium none;
+ height: 12px;
+ position: absolute;
+ top: -4px;
+ width: 12px;
+}
+.price-slider-area > p {
+ margin-bottom: 30px;
+ margin-top: 22px;
+}
+h3.bedroom-side-title {
+ font-size: 14px;
+ font-weight: 700;
+ margin-bottom: 39px;
+ position: relative;
+ text-transform: uppercase;
+}
+ h3.bedroom-side-title::before {
+ background: #c2a773 none repeat scroll 0 0;
+ bottom: -9px;
+ content: "";
+ height: 2px;
+ left: 0;
+ position: absolute;
+ width: 40px;
+}
+/* ---------category-start------ */
+
+.caregory li {
+ border-bottom: 1px solid #dddddd;
+}
+.caregory a {
+ display: block;
+ font-size: 14px;
+ padding: 12px 0;
+ text-transform: uppercase;
+}
+.caregory span {
+ color: #555;
+ float: right;
+}
+.caregory ul li:hover span {
+ color: #c2a773;
+ transition: none 0s ease 0s ;
+}
+/* ---------sideber-color-start ---------*/
+.sideber-color li {
+ display: inline-block;
+}
+.sideber-color li a {
+ background: #000000 none repeat scroll 0 0;
+ display: block;
+ height: 20px;
+ margin-right: 10px;
+ width: 21px;
+}
+.sideber-color ul li.bg-colo-3 a {
+ background: #ff0000;
+}
+.sideber-color ul li.bg-colo-4 a {
+ background: #ddd;
+}
+.sideber-color ul li.bg-colo-5 a {
+ background: #1857F7
+}
+.sideber-color ul li.bg-colo-6 a {
+ background: #CE64D4
+}
+.sideber-color ul li.bg-colo-7 a {
+ background: #EB6703
+}
+.sideber-color ul li.bg-colo-8 a {
+ background: #FFD500
+}
+.sideber-color ul li.bg-colo-9 a {
+ background: #945454
+}
+.sideber-ads.mt-40 {
+ overflow: hidden;
+}
+.sideber-ads-img img {
+ transition: all 0.4s ease 0s;
+}
+.sideber-ads-img img:hover {
+ transform: scale(1.1);
+}
+/* category--product-area-start */
+ul.tab_menu li {
+ display: inline-block;
+}
+ul.tab_menu li a {
+ background: #c6c6c6 none repeat scroll 0 0;
+ color: #ffffff;
+ font-size: 20px;
+ margin-right: 10px;
+ padding: 7px 11px;
+}
+ul.tab_menu li a:hover{
+ background:#C2A773;
+}
+ul.tab_menu li.active a {
+ background: #c2a773 none repeat scroll 0 0;
+}
+.single-category-product{
+ overflow: hidden;
+}
+.single-category-product-img {
+ float: left;
+ width: 30%;
+}
+.single-category-product-info {
+ float: left;
+ padding-left: 30px;
+ width: 70%;
+}
+.single-category-product-info > a h2 {
+ font-size: 17px;
+ font-weight: 500;
+ margin: 17px 0;
+}
+.single-category-product-info > a h2:hover{
+ color:#C2A773;
+}
+
+.price.category-price {
+ margin: 25px 0;
+}
+.price.category-price h4 {
+ font-weight: 500;
+}
+.single-category-product-info > p {
+ font-weight: 300;
+ margin-bottom: 30px;
+}
+.sort-by {
+ float: left;
+ margin-left: 28px;
+ position: relative;
+ top: -5px;
+}
+.sort-by label {
+ color: #000000;
+ font-size: 14px;
+ font-weight: 500;
+}
+.sort-by i {
+ margin-left: 6px;
+}
+.cust-select {
+ border: 1px solid #e1e1e1;
+ font-size: 14px;
+ margin-left: 10px;
+ padding: 6px 10px;
+ text-transform: capitalize;
+ width: 150px;
+ color: #555;
+}
+.cust-select.cust-select-2 {
+ width: 70px;
+}
+.new-product-action2.category-cart a {
+ background: #e0e0e0 none repeat scroll 0 0;
+ border: 1px solid #dddddd;
+ color: #ffffff;
+ display: inline-block;
+ font-size: 15px;
+ margin-right: 5px;
+ padding: 10px 14px;
+}
+.new-product-action2.category-cart a:hover {
+ background: #c2a773 none repeat scroll 0 0;
+ border: 1px solid #dddddd;
+ color: #ffffff;
+}
+.bg-black {
+ background: #444!important;
+}
+.new-product-action2.category-cart a.bg-black:hover {
+ background: #c2a773!important;
+}
+.new-product-action2.category-cart a.bg-black span {
+ padding-right: 6px;
+}
+.single-new-product.category-new-product .new-product-action a {
+ padding: 7px 8px;
+}
+
+/* pagination-area-start */
+.pagination-area.mt-40 {
+ border-top: 1px solid #dddddd;
+}
+.pagination-text {
+ float: left;
+}
+.pagination-text {
+ margin-top: 8px;
+}
+.bedroom-pagination {
+ display: inline-block;
+ float: right;
+}
+.pagination {
+ margin: 0;
+}
+.pagination > li > a, .pagination > li > span {
+ padding: 0 8px;
+}
+.pagination > li > a, .pagination > li > span {
+ border: medium none;
+ color: #333333;
+}
+.pagination > li > a:hover, .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus {
+ color: #C2A773;
+ background:none;
+}
+
+/* ---------17.Home-2-Start ---------*/
+.mainmenu-area.home-page-2.sticky {
+ border-bottom: 1px solid #ededed;
+}
+.header-top-area.home-page-2 {
+ background: #ffffff none repeat scroll 0 0;
+ border-bottom: 1px solid #e1e1e1;
+}
+.header-top-area.home-page-2 .header-top-left ul li.click_menu li a:hover, .header-top-area.home-page-2 .header-left-menu ul li a:hover, .header-top-area.home-page-2 .header-left-menu button:hover, .header-top-area.home-page-2 .header-top-left ul li a:hover, .header-top-area.home-page-2 .header-top-right ul li a:hover, .header-bottom-area.home-page-2 .header-bottom-right .shop-cart a:hover{
+ color: #e73b49;
+}
+.mainmenu-area.home-page-2 .mainmenu{
+ border-top:1px solid#ebebeb;
+}
+.mainmenu-area.home-page-2 {
+ background: #ffffff none repeat scroll 0 0;
+ text-align: center;
+}
+.mainmenu-area.mainmenu-area-4.sticky {
+ border-bottom: 1px solid#dedede;
+}
+.mainmenu-area.home-page-2 .mainmenu ul li a {
+ color: #444444;
+ font-weight: 500;
+}
+.mainmenu-area.home-page-2 .mainmenu ul li .megamenu {
+ text-align: left;
+}
+.mainmenu-area.home-page-2 .mainmenu ul li.active > a {
+ color: #e73b49;
+}
+.mainmenu-area.home-page-2 .mainmenu ul li a:hover{
+ color: #e73b49;
+}
+.header-bottom-area.home-page-2 .menu-search-box {
+ margin-top: 2px;
+}
+.header-bottom-area.home-page-2 .menu-search-box form input {
+ background: #f7f7f7 none repeat scroll 0 0;
+}
+.header-bottom-area.home-page-2 .menu-search-box form button {
+ color: #333;
+}
+.slider-area.home-page-2 .single-slider .slider-info h3, .slider-area.home-page-2 .single-slider .slider-info h1,.slider-area.home-page-2 .single-slider .slider-info h2 {
+ font-weight: 600;
+}
+.slider-area.home-page-2 .single-slider .slider-btn a {
+ background: #e73b49 none repeat scroll 0 0;
+}
+.home-page-2 .section-title h2 {
+ font-size: 17px;
+ margin-bottom: 45px;
+ position: relative;
+}
+.service-wrapper {
+ padding-bottom: 10px;
+}
+.home-page-2 .section-title > h2::after {
+ background: #e73b49 none repeat scroll 0 0;
+ bottom: -12px;
+ content: "";
+ height: 2px;
+ left: 0;
+ position: absolute;
+ width: 60px;
+}
+.home-page-2 .section-title::before{
+ background: #e1e1e1 none repeat scroll 0 0;
+ bottom: 33px;
+ content: "";
+ height: 1px;
+ left: 0;
+ position: absolute;
+ width: 100%;
+}
+.home-page-2 .section-title::after {
+ content: "/";
+ position: absolute;
+ right: 33px;
+ top: 7px;
+}
+.new-product-area.dotted-style4.home-page-2 .single-new-product .product-content a h3:hover, .new-product-area.home-page-2 .single-new-product .product-price-star i, .feature-preduct-area.dotted-style4.home-page-2.feature-area-2 .single-new-product .product-content a h3:hover, .feature-preduct-area.dotted-style4.home-page-2.feature-area-2 .single-new-product .product-price-star i, .blog-area.blog-area-2 .blog-info a h2:hover,.blog-area.blog-area-2 .blog-info a:hover,.footer-area.footer-area-2 ul.usefull-link li a:hover, .footer-area.footer-area-2 .wrapper-strong-span a:hover, .footer-area.footer-area-2 .footer-wrapper a:hover{
+ color: #e73b49;
+}
+.footer-area.footer-area-2 .footer-wrapper .footer-title::before {
+ background: #e73b49 none repeat scroll 0 0;
+}
+.copyright-area.copyright-area-2 .copyright.text-left a:hover {
+ color: #e73b49;
+}
+/* ---------18.Home-3-Start ---------*/
+.header-top-3 {
+ background: #ffffff none repeat scroll 0 0;
+ border-bottom: 1px solid #e1e1e1;
+}
+.header-top-3 .header-bottom-right {
+ background: #ededed none repeat scroll 0 0;
+ margin-top: 0;
+ padding: 13px 6px;
+}
+.header-top-3 .header-top-left {
+ margin-top: 11px;
+}
+.header-top-3 .header-bottom-right span {
+ margin: 0;
+}
+.header-top-3 .header-top-right ul li span {
+ float: left;
+ font-size: 16px;
+ margin-right: 9px;
+ margin-top: 2px;
+}
+.header-top-3 .header-top-right {
+ margin-top: 12px;
+}
+.header-top-3 li.click_menu2 span {
+ font-size: 19px;
+ margin-top: 1px;
+}
+.header-top-3 li.click_menu2 a {
+ font-size: 13px;
+}
+.header-bottom-3 .logo {
+ margin-top: 19px;
+}
+.header-bottom-3 .mainmenu ul {
+ text-align: right;
+}
+.header-bottom-3 .mainmenu ul li:last-child a {
+ padding-right: 0;
+}
+.header-bottom-area.header-bottom-3.ptb-40.sticky {
+ padding: 0;
+ border-bottom:1px solid#dedede;
+}
+.header-bottom-area.header-bottom-3 .mainmenu ul li.active > a, .header-bottom-area.header-bottom-3 .mainmenu ul li:hover > a {
+ color: #c2a773;
+}
+.home-3.home-page-2 .section-title > h2::after {
+ background: #c2a773 none repeat scroll 0 0;
+}
+.serch-box-3 form {
+ position: relative;
+}
+.serch-box-3 form button {
+ background: rgba(0, 0, 0, 0) none repeat scroll 0 0;
+ border: medium none;
+ float: right;
+ height: 30px;
+ left: 35px;
+ line-height: 32px;
+ margin-top: 20px;
+ position: absolute;
+ text-align: center;
+ width: 30px;
+ z-index: 11;
+ color: #333;
+}
+.search-box-3-hover input {
+ border: 1px solid #eeeeee;
+ font-size: 13px;
+ padding: 8px 0 8px 10px;
+ position: absolute;
+ right: 0;
+ text-transform: capitalize;
+ top: 16px;
+ transition: all 0.3s ease 0s;
+ width: 0px;
+ visibility:hidden;
+ opacity:0;
+}
+.serch-box-3 form:hover .search-box-3-hover input{
+ width:200px;
+ visibility:visible;
+ opacity:1;
+}
+
+.header-bottom-3 .mainmenu ul li a {
+ color: #333333;
+ font-weight:400;
+ text-align:left;
+}
+.new-product-area-3 .section-title::before {
+ background: #c2a773 none repeat scroll 0 0;
+ bottom: 44px;
+ content: "";
+ height: 2px;
+ position: absolute;
+ width: 60px;
+}
+.new-product-area-3 .section-title h2 {
+ font-size: 19px;
+ margin-bottom: 55px;
+ position: relative;
+}
+.new-product-area-3 .mainmenu {
+ margin-right: 90px;
+ text-align: right;
+}
+.new-product-area-3 .mainmenu ul li a {
+ color: #333333;
+ font-size: 13px;
+ font-weight: 500;
+ padding: 0 13px;
+}
+.new-product-area-3 .mainmenu ul li.active > a {
+ color: #c2a773;
+}
+.new-product-area-3 .mainmenu ul li:hover > a {
+ color: #c2a773;
+}
+.container-inner {
+ position: relative;
+}
+.container-inner::after {
+ content: "/";
+ position: absolute;
+ right: 31px;
+ top: 2px;
+}
+.container-inner::before {
+ background: #ededed none repeat scroll 0 0;
+ content: "";
+ height: 1px;
+ position: absolute;
+ top: 39px;
+ width: 100%;
+}
+.new-product-area-3 .owl-carousel .owl-controls .owl-nav div {
+ display: inline-block;
+ font-size: 18px;
+ height: 30px;
+ position: absolute;
+ right: 0;
+ top: -87px;
+ width: 30px;
+}
+.new-product-area-3 .owl-carousel .owl-controls .owl-nav div.owl-next {
+ left: auto;
+ right: 45px;
+}
+ /* banner-static-area-start */
+.single-static-img {
+ position: relative;
+}
+.single-static-banner .single-static-text {
+ background: rgba(0, 0, 0, 0.3) none repeat scroll 0 0;
+ left: 13%;
+ padding: 10px 30px;
+ position: absolute;
+ top: 24%;
+}
+.single-static-banner .single-static-text.single-static-text-4 {
+ background: rgba(0, 0, 0, 0) none repeat scroll 0 0;
+ left: 38%;
+ padding: 10px 30px;
+ position: absolute;
+ top: 24%;
+}
+.single-static-text h3{
+ color: #ffffff;
+ display: block;
+ font-size: 22px;
+ font-weight: 900;
+ line-height: 30px;
+}
+.single-static-text span{
+ color: #ffffff;
+ display: block;
+ font-size: 18px;
+ font-weight: 400;
+ line-height: 30px;
+}
+.single-static-img:hover img {
+ transform: scale(1.1);
+}
+.single-static-img a{
+ position:relative;
+ display:inline-block;
+ overflow: hidden;
+}
+.single-static-img a img {
+ transition: all 0.4s ease 0s;
+}
+.single-static-banner .single-static-img:hover .single-static-text h3{
+ animation: 400ms ease-in-out 0s normal none 1 running fadeInUp;
+}
+.single-static-banner .single-static-img:hover .single-static-text span{
+ animation: 600ms ease-in-out 0s normal none 1 running fadeInUp;
+}
+.single-static-banner .single-static-text-2 {
+ background: rgba(0, 0, 0, 0) none repeat scroll 0 0;
+ left: 54%;
+ padding: 10px 30px;
+ position: absolute;
+ top: 24%;
+}
+.single-static-banner .single-static-text-2 h3 {
+ color: #333333;
+ font-size: 26px;
+ font-weight: 400;
+}
+.single-static-banner .single-static-text-2 span {
+ color: #333333;
+}
+ /* banner-static-area-end */
+ /* catagory-menu-start */
+.catagory-menu-title h3{
+ background: #c2a773 none repeat scroll 0 0;
+ color: #ffffff;
+ cursor: pointer;
+ display: block;
+ font-size: 18px;
+ font-weight: 900;
+ line-height: 30px;
+ padding: 10px 10px 10px 15px;
+ position: relative;
+ text-transform: uppercase;
+}
+.catagory-menu{
+ background: #ffffff none repeat scroll 0 0;
+ border: 1px solid #c2a773;
+}
+.catagory-menu ul{}
+.catagory-menu ul li {
+ padding: 0 15px;
+}
+.catagory-menu ul li a{
+ border-bottom: 1px solid #ededed;
+ color: #333333;
+ display: block;
+ font-size: 15px;
+ font-weight: 400;
+ line-height: 24px;
+ overflow-wrap: break-word;
+ padding: 12px 0;
+ position: relative;
+ text-align: left;
+ text-decoration: none;
+ text-transform: capitalize;
+}
+.catagory-menu ul li a:hover{
+ color:#C2A773;
+}
+.catagory-menu ul li a i {
+ float: right;
+ font-size: 16px;
+ position: relative;
+ right: -3px;
+ top: 5px;
+}
+.catagory-menu ul li .megamenu {
+ background: #ffffff none repeat scroll 0 0;
+ border: 1px solid #c2a773;
+ left: 95%;
+ margin-top: -49px;
+ opacity: 0;
+ padding: 10px 0;
+ position: absolute;
+ transform: scaleY(0);
+ transform-origin: 0 0 0;
+ transition: all 0.4s ease 0s;
+ visibility: hidden;
+ width: 500px;
+ z-index: 111;
+}
+.catagory-menu ul li:hover .megamenu{
+ transform:scaleY(1);
+ opacity:1;
+ visibility:visible;
+}
+.catagory-menu ul li .megamenu span {
+ float: left;
+ padding: 0 25px 25px;
+ width: 50%;
+}
+.catagory-menu ul li .megamenu span a.megatitle {
+ border-bottom: 1px solid #e1e1e1;
+ font-size: 16px;
+ font-weight: 800;
+ text-transform: uppercase;
+}
+.catagory-menu ul li .megamenu span a {
+ border-bottom: medium none;
+ font-size: 13px;
+ padding: 3px 0;
+}
+.section-title-3{
+ position:relative;
+}
+.section-title-3::before {
+ background: #dedede none repeat scroll 0 0;
+ bottom: 0;
+ content: "";
+ height: 1px;
+ position: absolute;
+ width: 100%;
+}
+.section-title-3 h2{
+ display: inline-block;
+ font-size: 18px;
+ font-weight: 900;
+ line-height: 30px;
+ padding-bottom: 12px;
+ position: relative;
+ text-transform: uppercase;
+}
+.section-title-3 h2:after{
+ background: #c2a773 none repeat scroll 0 0;
+ bottom: -1px;
+ content: "";
+ height: 2px;
+ left: 0;
+ position: absolute;
+ width: 60px;
+}
+.section-title-3::after {
+ content: "/";
+ position: absolute;
+ right: 35px;
+ top: 4px;
+}
+.home-3.feature-preduct-area.dotted-style4.home-page-2 .single-new-product .new-product-action > a {
+ background: #e7cc98 none repeat scroll 0 0;
+}
+.feature-preduct-area.dotted-style4.home-page-2 .single-new-product .new-product-action > a:hover {
+ background: #C2A773 none repeat scroll 0 0;
+}
+.feature-product-4 .section-title::before {
+ background: #dedede none repeat scroll 0 0;
+ content: "";
+ height: 1px;
+ left: 207px;
+ position: absolute;
+ width: 49%;
+}
+.single-static-banner.banner-3 .single-static-text {
+ background:none;
+ left: 27%;
+ padding: 19px 91px;
+ position: absolute;
+ top: 20%;
+}
+.search-box-home-3 {
+ background: rgba(0, 0, 0, 0) url("img/banner/bkg_newsletter.jpg") no-repeat scroll center center / cover ;
+ padding: 45px 30px;
+}
+.search-box.search-3 input {
+ background: #eee6d6 none repeat scroll 0 0;
+ padding-right:10px;
+}
+.search-box-home-3 .search-box.search-3 button {
+ background: #ffffff none repeat scroll 0 0;
+ border: 1px solid #dddddd;
+ display: inline-block;
+ font-weight: 400;
+ margin-top: 20px;
+ padding: 11px 22px;
+ position: static;
+ text-transform: uppercase;
+ width: 130px;
+}
+.search-box-home-3 .search-box.search-3 button:hover{
+ color:#C2A773;
+}
+.contuct-info.search-3 h4{
+ color: #ffffff;
+ display: block;
+ font-size: 24px;
+ font-weight: 700;
+ line-height: 32px;
+ margin-bottom: 30px;
+ text-transform: none;
+}
+.contuct-info.search-3 p{
+ color: #ffffff;
+ display: block;
+ font-size: 18px;
+ font-weight: 300;
+ line-height: 26px;
+ margin-bottom: 40px;
+}
+.search-box-home-3 span{
+ color: #ffffff;
+ display: block;
+ font-size: 18px;
+ font-weight: 300;
+ line-height: 26px;
+ margin-bottom: 30px;
+ margin-top:30px;
+}
+
+/* ---------19.Home-4-Start ---------*/
+.header-top-area.ptb-10.hidden-xs.header-top-area-4 {
+ background: #fff;
+ border-bottom: 1px solid#ededed;
+}
+.header-top-left-4 {
+ background: rgba(0, 0, 0, 0) url("img/service/icon/header_text.png") no-repeat scroll left top;
+}
+.header-top-left-4 p {
+ color: #333333;
+ font-size: 12px;
+ margin-bottom: 0;
+ margin-top: 9px;
+ padding-left: 34px;
+ text-align: left;
+}
+.header-top-right-4 {
+ text-align: right;
+}
+.header-top-right-4 .header-left-menu ul li a:hover, .header-top-right-4 .header-top-left ul li a:hover, .header-top-right-4 .header-top-right ul li a:hover{
+ color:#FF8A0B;
+}
+.header-top-right-4 .header-top-left ul li:last-child a {
+ margin-right: 0 !important;
+}
+.header-top-right-4 .header-left-menu:hover {
+ color: #ff8a0b !important;
+}
+.header-bottom-right.header-bottom-right-4 .shop-cart span {
+ float: right;
+ margin-left: 40px;
+ display: block;
+}
+.header-bottom-right-4-inner a {
+ position: absolute;
+ right: 83px;
+ top: 14px;
+ font-size: 20px;
+}
+.header-bottom-right-4-inner a:hover {
+ color: #FF8A0C;
+}
+.shop-cart-4 a::before {
+ background: #ff8a0c none repeat scroll 0 0;
+ border-radius: 50%;
+ content: "2";
+ height: 20px;
+ position: absolute;
+ right: -4px;
+ top: -9px;
+ width: 20px;
+ color: #fff;
+ font-size: 11px;
+ text-align: center;
+}
+.header-bottom-right.header-bottom-right-4 .shop-cart a span:hover {
+ color: #ff8a0b;
+}
+.mainmenu-area.home-page-2.mainmenu-area-4 .mainmenu ul li a {
+ font-weight: 700;
+}
+.mainmenu-area.home-page-2.mainmenu-area-4 .mainmenu ul li.active > a, .mainmenu-area.home-page-2.mainmenu-area-4 .mainmenu ul li a:hover {
+ color: #ff911b;
+}
+.new-product-area.dotted-5.new-product-4 .hot-deal-title::before {
+ background: #eeeeee none repeat scroll 0 0;
+ content: "";
+ height: 1px;
+ left: 164px;
+ position: absolute;
+ top: 15px;
+ width: 37%;
+}
+.section-title-4 {
+ position: relative;
+}
+.section-title-4::before {
+ background: #eeeeee none repeat scroll 0 0;
+ content: "";
+ height: 1px;
+ left: 205px;
+ position: absolute;
+ top: 15px;
+ width: 64%;
+}
+.dotted-5.new-product-4 .owl-carousel .owl-controls .owl-nav div {
+ border: 1px solid #aaa;
+ color: #aaa;
+ height: 35px;
+ line-height: 31px;
+ position: absolute;
+ right: 19px;
+ text-align: center;
+ top: -50px;
+ width: 20px;
+}
+.dotted-5.new-product-4 .owl-carousel .owl-controls .owl-nav div.owl-next{
+ left:auto;
+ right:50px;
+}
+.hot-deal-area .single-new-product.hot-product {
+ border: 1px solid #ff9727;
+ padding-bottom: 30px;
+}
+.new-product-area.hot-deal-area.dotted-5.new-product-4 .single-new-product .product-icon-wrapper .product-icon ul li a:hover {
+ background: #ffffff none repeat scroll 0 0;
+ color: #ff8b0d;
+}
+.section-title.section-title-4.section_4::before {
+ width: 70.5%;
+ left: 264px;
+}
+.new-product-area.hot-deal-area.dotted-5.new-product-4 .single-new-product .product-content .product-price-star i{
+ color:#ff8b0d;
+}
+.new-product-area.hot-deal-area.dotted-5.new-product-4 .single-new-product .product-content a h3:hover{
+ color:#ff8b0d;
+}
+.product-cuntdown {
+ margin-top: -90px;
+ position: relative;
+ z-index: 111111111 !important;
+}
+.timer {
+ overflow: hidden;
+}
+.timer .cdown {
+ background: #ffffff none repeat scroll 0 0;
+ box-shadow: 0 -1px 7px 4px #d7d7d7;
+ color: #333333;
+ font-size: 26px;
+ margin: 20px 8px 19px;
+ padding: 7px 0;
+ text-align: center;
+ width: 20%;
+}
+.cdown {
+ float: left;
+}
+.cdown p {
+ display: none;
+}
+.static-slider-area.dotted-style.new-product-4 .static-slider-text a.shopnow {
+ background: #FF8A0C;
+}
+.static-slider-area.new-product-4.dotted-style .owl-carousel .owl-controls .owl-dot.active {
+ background: #FF8A0C;
+}
+.header-top-area.hidden-xs.header-top-3 .header-top-left ul li.click_menu a:hover, .header-top-right ul li a:hover, .header-top-left ul li{
+ color: #c2a773;
+}
+.header-top-left.header-top--left-3 ul li a:hover {
+ color: #c2a773;
+}
+ .hot-deal-area.home-page-2 .section-title::after, .new-product-4.home-page-2 .section-title > h2::after {
+ display: none;
+}
+
+.new-product-4.home-page-2 .section-title > h2 {
+ margin-bottom: 18px;
+ font-size: 25px;
+}
+.feature-preduct-area.home-page-2.dotted-5.new-product-4.hot-deal-area .single-new-product a h3:hover, .feature-preduct-area.home-page-2.dotted-5.new-product-4.hot-deal-area .product-price-star i {
+ color: #FE890C;
+}
+.footer-area.footer-area-4 {
+ background: #fff;
+}
+.footer-area.footer-area-4 .footer-wrapper .footer-title a h3, .footer-area.footer-area-4 .footer-wrapper ul.usefull-link li a, .footer-area.footer-area-4 .footer-wrapper .wrapper-strong-span, .footer-wrapper-strong a, .footer-area.footer-area-4 .footer-wrapper ul li a, .footer-area.footer-area-4 .footer-wrapper ul li, .footer-area.footer-area-4 .footer-wrapper a {
+ color: #333333;
+ margin-right: 10px;
+}
+
+.footer-area.footer-area-4 .footer-wrapper a:hover {
+ color: #fe890c;
+}
+.footer-area.footer-area-4 .footer-wrapper ul.usefull-link li a:hover {
+ color: #fe890c;
+}
+.footer-area-4 .footer-wrapper > p, .copyright.text-left > p {
+ font-weight: 300;
+ color: #444;
+}
+.copyright-area.copyright-4 .copyright p a {
+ color: #444;
+}
+.copyright-area.copyright-4 .copyright p a:hover{
+ color:#FF8A0C;
+}
+.wrapper-strong-span {
+ color: #ffffff;
+}
+.wrapper-strong-span a {
+ color: #ffffff;
+}
+.wrapper-strong-span a:hover{
+ color:#C2A773;
+}
+.footer-area.footer-area-4 .footer-wrapper .footer-title::before {
+ background: #fe890c none repeat scroll 0 0;
+}
+.copyright-area.copyright-4 {
+ background: #fff;
+ border-top: 1px solid#ddd;
+}
+.footer-area-4 .footer-wrapper p {
+ color: #444;
+}
+/* ---------20.Product-Details-Start ---------*/
+ul.sinple-tab-menu li a {
+ border: 1px solid #dedede;
+ float: left;
+ margin-left: 17px;
+ margin-top: 10px;
+ width: 82px !important;
+}
+ul.sinple-tab-menu li:first-child a{
+ margin-left: 0;
+}
+ul.sinple-tab-menu li.active a{
+ border: 1px solid #c6ac7c;
+}
+.product-simple-content .sinple-c-title h3 {
+ font-size: 30px;
+ font-weight: 900;
+ margin-bottom: 20px;
+}
+.checkbox span {
+ color: #73c437;
+ font-weight: 400;
+}
+.checkbox span i {
+ color: #73c437;
+ float: left;
+ margin-right: 10px;
+ margin-top: 5px;
+}
+.product-simple-content .product-price-star.star-2 {
+ margin-bottom: 27px;
+ margin-top: 18px;
+}
+.product-simple-content .product-price-star.star-2 span {
+ font-weight: 300;
+ margin-left: 10px;
+ color: #333;
+}
+.product-simple-content > h4 {
+ font-size: 30px;
+ font-weight: 800;
+ margin-bottom: 29px;
+}
+.product-simple-content .quick-add-to-cart {
+ overflow: hidden;
+}
+.product-simple-content .quick-add-to-cart label {
+ float: left;
+ margin-right: 10px;
+ margin-top: 8px;
+}
+.quick-add-to-cart .single_add_to_cart_button.hyper-page {
+ background: #333333 none repeat scroll 0 0;
+ border: medium none;
+ color: #ffffff;
+ display: inline-block;
+ font-size: 13px;
+ font-weight: 500;
+ margin-left: 14px;
+ padding: 10px 19px;
+ text-transform: capitalize;
+}
+.quick-add-to-cart .single_add_to_cart_button.hyper-page:hover{
+ background:#c2a773;
+}
+.product-simple-content .numbers-row > input {
+ border: 1px solid #dddddd;
+ float: left;
+ height: 40px;
+ padding: 0 5px;
+ text-align: center;
+ width: 84px;
+}
+.product-simple-content .quick-add-to-cart .single_add_to_cart_button.hyper-page span {
+ float: left;
+ font-size: 18px;
+ font-weight: 900;
+ margin-right: 10px;
+}
+.product-simple-content .action-heiper {
+ border-bottom: 1px solid #dddddd;
+ margin-bottom: 30px;
+ margin-top: 30px;
+ padding-bottom: 20px;
+}
+.product-simple-content .action-heiper a {
+ background: #aaa none repeat scroll 0 0;
+ display: inline-block;
+ font-size: 18px;
+ height: 40px;
+ line-height: 40px;
+ text-align: center;
+ width: 40px;
+ color:#fff;
+ margin-left:6px;
+}
+.product-simple-content .action-heiper a:first-child {
+ margin-left: 0;
+}
+.product-simple-content .action-heiper a:hover{
+ background:#C2A773;
+ color:#fff;
+}
+.product-simple-content > p {
+ font-size: 14px;
+ font-weight: 300;
+ line-height: 28px;
+}
+.product-info-tab-menu {
+ border-bottom: 2px solid #ededed;
+ margin-bottom: 20px;
+ padding-bottom: 12px;
+}
+ul.product-info-tab-menu li {
+ display: inline-block;
+ position: relative;
+}
+ul.product-info-tab-menu li a {
+ color: #666;
+ font-size: 20px;
+ font-weight: 600;
+ margin-right: 16px;
+ text-transform: uppercase;
+}
+ul.product-info-tab-menu li a:hover, ul.product-info-tab-menu li.active a {
+ color: #333333;
+}
+ul.product-info-tab-menu li::before {
+ background: #c2a773 none repeat scroll 0 0;
+ bottom: -14px;
+ content: "";
+ height: 2px;
+ position: absolute;
+ width: 0;
+ transition:all.5s;
+}
+ul.product-info-tab-menu li:hover::before {
+ transition: all 0.3s ease 0s;
+ width: 86%;
+}
+ul.product-info-tab-menu li.active::before{
+ transition: all 0.3s ease 0s;
+ width: 86%;
+}
+ul.product-info-tab-menu li.active:hover::before{
+ transition: all 0.5s ease 0s;
+ width: 86%;
+}
+.product-info-tab-content > p {
+ font-weight: 300;
+ line-height: 24px;
+ margin-bottom: 5px;
+}
+.product-info-tab-content li {
+ color: #333;
+ font-weight: 300;
+ line-height: 26px;
+ position: relative;
+}
+.product-info-tab-content li::before {
+ color: #333333;
+ content: "";
+ font-family: FontAwesome;
+ font-size: 6px;
+ padding: 6px;
+}
+.customer-review-top {
+ border-bottom: 1px solid #dddddd;
+ overflow: hidden;
+ padding-bottom: 24px;
+}
+.customer-review-top > h3 {
+ font-size: 45px;
+ font-weight: 300;
+ margin-bottom: 20px;
+}
+.customer-review-top > h4 {
+ display: block;
+ font-size: 30px;
+ font-weight: 300;
+ margin-bottom: 20px;
+}
+.cus-review-left {
+ float: left;
+ width: 30%;
+}
+.cus-review-left > p {
+ margin-bottom: 18px;
+}
+.single-customer-rating span {
+ color: #666666;
+ display: inline-block;
+ font-weight: 700;
+ margin-bottom: 11px;
+ margin-right: 19px;
+ text-transform: capitalize;
+}
+.customer-review-bottom {
+ margin-top: 50px;
+}
+.single-customer-rating i {
+ color: #C2A773;
+}
+.customer-review-bottom h2{
+ font-size: 32px;
+ font-weight:500;
+}
+.customer-review-bottom.fix > p {
+ margin-top: 12px;
+}
+.customer-review-bottom.fix > p span {
+ color: #fb5f06;
+ font-size: 19px;
+ margin-top:20px;
+}
+.customer-review-form {
+ margin-top: 40px;
+ overflow: hidden;
+ width: 60%;
+}
+.upsell-product {
+ margin-bottom: 30px;
+}
+.upsell-product-title {
+ margin-bottom: 30px;
+ text-align: center;
+}
+.hyper-title {
+ margin-bottom: 35px;
+ position: relative;
+}
+.hyper-title::before {
+ background: #dedede none repeat scroll 0 0;
+ bottom: -10px;
+ content: "";
+ height: 1px;
+ position: absolute;
+ width: 100%;
+}
+.hyper-title h4::before {
+ background: #c2a773 none repeat scroll 0 0;
+ bottom: -10px;
+ content: "";
+ height: 2px;
+ position: absolute;
+ width: 21%;
+}
+.hyper-title::after {
+ content: "/";
+ position: absolute;
+ right: 28px;
+ top: 3px;
+}
+.feature-preduct-area.hyperion .owl-carousel .owl-controls .owl-nav div {
+ display: inline-block;
+ font-size: 18px;
+ font-weight: 300;
+ height: 30px;
+ line-height: 24px;
+ position: absolute;
+ right: 0;
+ text-align: center;
+ top: -59px;
+ width: 30px;
+}
+.feature-preduct-area.hyperion .owl-carousel .owl-controls .owl-nav div.owl-next {
+ left: auto;
+ right: 33px;
+}
+
+/* ---------21.Login-Page-Start ---------*/
+.login-title {
+ margin-bottom: 25px;
+}
+.login-title > h3 {
+ font-size: 30px;
+ font-weight: 500;
+}
+.login-page label {
+ font-weight: 500;
+ color: #555;
+}
+.login-page label span {
+ color: #e73b49;
+ font-size: 16px;
+}
+.btn.btn-default.login-btn {
+ background: #d8d8d8 none repeat scroll 0 0;
+ border: 1px solid #d8d8d8;
+ border-radius: 0;
+ color: #333333;
+ font-size: 13px;
+ font-weight: 700;
+ padding: 9px 18px;
+ text-transform: uppercase;
+}
+.btn.btn-default.login-btn:hover {
+ background: #c2a773 none repeat scroll 0 0;
+ border: 1px solid #c2a773;
+ color: #ffffff;
+}
+a.back {
+ float: right;
+ position: relative;
+ text-transform: capitalize;
+ top: -35px;
+}
+.login-title > span {
+ border-top: 1px solid #dedede;
+ display: block;
+ margin-top: 20px;
+ padding-top: 20px;
+}
+
+/* ---------22. Wishlist-Page-Start ---------*/
+.wishlist-area{}
+.wishlist-content{}
+.wishlist-title {
+ text-transform: capitalize;
+}
+.wishlist-title h2{}
+.wishlist-table{}
+.wishlist-table table {
+ background: #fff none repeat scroll 0 0;
+ border-color: #e8e8e9;
+ border-radius: 0;
+ border-style: solid;
+ border-width: 1px 0 0 1px;
+ margin: 20px 0 50px;
+ width: 100%;
+}
+.wishlist-table table{}
+.wishlist-table table th {
+ font-weight: 600;
+}
+.wishlist-table table th, .wishlist-table table td {
+ border-bottom: 1px solid #e5e5e5;
+ border-right: 1px solid #e5e5e5;
+ font-size: 14px;
+ padding: 15px 10px;
+ text-align: center;
+}
+.wishlist-table table .product-remove {
+ padding: 0 15px;
+ width: 20px;
+}
+.wishlist-table table .product-remove > a {
+ font-size: 25px;
+}
+.wishlist-table table .product-thumbnail {
+ width: 150px;
+}
+.wishlist-table table td.product-price .amount {
+ font-weight: 700;
+}
+.wishlist-table table .wishlist-in-stock {
+ color: #C2A773;
+}
+.wishlist-table table .product-add-to-cart > a {
+ background: #000 none repeat scroll 0 0;
+ color: #fff;
+ display: block;
+ font-weight: 700;
+ padding: 10px 56px;
+ text-transform: uppercase;
+ width: 260px;
+}
+.wishlist-table table .product-add-to-cart > a:hover {
+ background: #C2A773;
+}
+.wishlist-table table .product-add-to-cart {
+ width: 240px;
+}
+.wishlist-table table
+.wishlist-table table
+.wishlist-share{}
+h3.wishlist-share-title{}
+.wishlist-share {
+ margin-bottom: 35px;
+ margin-top: 20px;
+}
+h4.wishlist-share-title {
+ margin-bottom: 10px;
+}
+.wishlist-share ul{}
+.wishlist-share ul li {
+ display: inline-block;
+ height: 21px;
+ margin-left: 0;
+ margin-right: 0;
+}
+.wishlist-share ul li a{
+ background-position: left top;
+ border: medium none;
+ display: inline-block;
+ height: 21px;
+ width: 21px;
+}
+.wishlist-share ul li a.facebook{background: url("img/icon/facebook.png") no-repeat scroll 0 0;}
+.wishlist-share ul li a.twitter{background: url("img/icon/twitter.png") no-repeat scroll 0 0;}
+.wishlist-share ul li a.pinterest{background: url("img/icon/pinterest.jpg") no-repeat scroll 0 0;}
+.wishlist-share ul li a.googleplus{background: url("img/icon/googleplus.jpg") no-repeat scroll 0 0;}
+.wishlist-share ul li a.email{background: url("img/icon/email.jpg") no-repeat scroll 0 0;}
+.wishlist-share ul li a{}
+.wishlist-share ul li a{}
+.wishlist-share ul li a:hover{background-position: left bottom;}
+
+/* ---------23.Cart-Page-Start ---------*/
+.cart-main-area {
+ margin-bottom: 100px;
+}
+.cart-title-area{
+ padding-top: 30px;
+}
+.car-header-title{}
+.car-header-title h2{
+ font-size: 20px;
+ margin: 0;
+ text-transform: uppercase;
+}
+.table-content{}
+.table-content table{
+ background: #fff none repeat scroll 0 0;
+ border-color: #e5e5e5;
+ border-radius: 0;
+ border-style: solid;
+ border-width: 1px 0 0 1px;
+ margin: 0 0 50px;
+ text-align: center;
+ width: 100%;
+}
+.table-content table{}
+.table-content table th{
+ border-top: medium none;
+ font-family: Montserrat,Arial,Helvetica,sans-serif;
+ font-weight: normal;
+ padding: 20px 10px;
+ text-align: center;
+ text-transform: uppercase;
+ vertical-align: middle;
+ white-space: nowrap;
+}
+.table-content table th,.table-content table td{
+ border-bottom: 1px solid #e5e5e5;
+ border-right: 1px solid #e5e5e5;
+}
+.table-content table td{
+ border-top: medium none;
+ padding: 20px 10px;
+ vertical-align: middle;
+ /**font-size: 13px;**/
+}
+.table-content table td input{
+ background: #e5e5e5 none repeat scroll 0 0;
+ border: medium none;
+ border-radius: 3px;
+ color: #6f6f6f;
+ font-family: Montserrat,Arial,Helvetica,sans-serif;
+ font-size: 15px;
+ font-weight: normal;
+ height: 40px;
+ padding: 0 5px 0 10px;
+ width: 60px;
+}
+.table-content table td.product-subtotal{
+ font-size: 14px;
+ font-weight: bold;
+ width: 120px;
+}
+.table-content table td.product-name a{font-size: 14px;
+ font-weight: 700;
+ margin-left: 10px;
+ color: #6f6f6f;
+}
+.table-content table td.product-name{width: 270px;}
+.table-content table td.product-thumbnail{width: 130px;}
+.table-content table td.product-remove i{
+ color: #919191;
+ display: inline-block;
+ font-size: 20px;
+ height: 40px;
+ line-height: 40px;
+ text-align: center;
+ width: 40px;
+}
+.table-content table .product-price .amount {
+ font-size: 15px;
+ font-weight: 700;
+}
+.table-content table td.product-remove i:hover{color:#C2A773}
+.table-content table td.product-quantity{width: 180px;}
+.table-content table td.product-remove{width: 150px;}
+.table-content table td.product-price{width: 130px;}
+.table-content table td.product-name a:hover,.buttons-cart a:hover{color:#C2A773}
+.buttons-cart{margin-bottom: 30px;
+overflow: hidden;}
+.buttons-cart input, .coupon input[type="submit"],.buttons-cart a,.coupon-info p.form-row input[type="submit"] {
+ background: #252525 none repeat scroll 0 0;
+ border: medium none;
+ border-radius: 0;
+ box-shadow: none;
+ color: #fff;
+ display: inline-block;
+ float: left;
+ font-family: Montserrat,Arial,Helvetica,sans-serif;
+ font-size: 12px;
+ font-weight: 700;
+ height: 40px;
+ line-height: 40px;
+ margin-right: 15px;
+ padding: 0 15px;
+ text-shadow: none;
+ text-transform: uppercase;
+ transition: all 0.3s ease 0s;
+ white-space: nowrap;
+}
+.buttons-cart input:hover,.coupon input[type=submit]:hover,.buttons-cart a:hover{
+ background:#C2A773;color:#fff
+}
+.buttons-cart a {
+ color: #fff;
+ float: left;
+ height: 40px;
+ line-height: 40px;
+}
+.coupon {
+ margin-bottom: 40px;
+ overflow: hidden;
+ padding-bottom: 20px;
+}
+.coupon h3{
+ margin: 0 0 10px;font-size: 14px;
+ text-transform: uppercase;
+}
+.coupon p{}
+.coupon input[type=text]{
+ border: 1px solid #e5e5e5;
+ float: left;
+ height: 40px;
+ margin: 0 6px 20px 0;
+ max-width: 100%;
+ padding: 0 0 0 10px;
+ width: 170px;
+}
+.coupon input[type=submit]{}
+.cart_totals{
+ float: left;
+ text-align: right;
+ width: 100%;
+}
+.cart_totals h2{
+ border-bottom: 2px solid #333;
+ display: inline-block;
+ font-size: 30px;
+ margin: 0 0 35px;
+ text-transform: uppercase;
+}
+.cart_totals table{
+ border: medium none;
+ float: right;
+ margin: 0;
+text-align: right;}
+.cart_totals table th{
+ border: medium none;
+ font-size: 14px;
+ font-weight: bold;
+ padding: 0 20px 12px 0;
+ text-align: right;
+ text-transform: uppercase;
+ vertical-align: top;
+}
+.cart_totals table td{
+ border: medium none;
+ padding: 0 0 12px;
+ vertical-align: top;
+}
+.cart_totals table{}
+.cart_totals table td .amount {
+ color: #C2A773;
+ float: right;
+ font-size: 13px;
+ font-weight: bold;
+ margin-left: 5px;
+ text-align: right;
+ text-transform: uppercase;
+}
+.cart_totals table td ul#shipping_method{
+ list-style: outside none none;
+ margin: 0;
+ padding: 0;
+}
+.cart_totals table td ul#shipping_method li{
+ float: left;
+ margin: 0 0 10px;
+ padding: 0;
+ text-indent: 0;
+ width: 100%;
+}
+.cart_totals table td ul#shipping_method li input{
+ margin: 0;
+ position: relative;
+ top: 2px;
+}
+.cart_totals table{}
+a.shipping-calculator-button{
+ font-weight: bold;color: #6f6f6f;
+}
+a.shipping-calculator-button:hover{
+ color:#83CBDC
+}
+.cart_totals table tr.order-total th,.cart_totals table tr.order-total .amount{
+ font-size: 20px;
+ text-transform: uppercase;
+ white-space: nowrap;
+}
+.cart_totals table tr.order-total .amount{}
+.wc-proceed-to-checkout a{
+ background: #C2A773 none repeat scroll 0 0;
+ color: #fff;
+ display: inline-block;
+ font-size: 14px;
+ font-weight: 700;
+ height: 50px;
+ line-height: 50px;
+ margin-top: 20px;
+ padding: 0 30px;
+ text-transform: none;
+}
+.wc-proceed-to-checkout a:hover{
+ background: #000;color:#fff;
+}
+
+/* ---------24.Checkout-Page-Start ---------*/
+.coupon-area{}
+.coupon-accordion{}
+.coupon-accordion h3 {
+ background-color: #f7f6f7;
+ border-top: 3px solid #1e85be;
+ color: #515151;
+ font-size: 14px;
+ font-weight: 500;
+ list-style: outside none none !important;
+ margin: 0 0 2em !important;
+ padding: 1em 2em 1em 3.5em !important;
+ position: relative;
+ width: auto;
+}
+.coupon-accordion h3::before {
+ color: #1e85be;
+ content: "";
+ display: inline-block;
+ font-family: fontawesome;
+ left: 1.5em;
+ position: absolute;
+ top: 1em;
+}
+.coupon-accordion span {
+ cursor: pointer;color: #555;
+}
+.coupon-accordion span:hover, p.lost-password a:hover {
+ color: #c2a773;
+}
+.coupon-content {
+ border: 1px solid #e5e5e5;
+ display: none;
+ margin-bottom: 20px;
+ padding: 20px;
+}
+.coupon-info{}
+.coupon-info p.coupon-text{
+ margin-bottom:15px
+}
+.coupon-info p{
+ margin-bottom:0;
+}
+.coupon-info p.form-row-first{}
+.coupon-info p.form-row-first label,.coupon-info p.form-row-last label{
+ display: block;
+}
+.coupon-info p.form-row-first label span.required, .coupon-info p.form-row-last label span.required {
+ color: #C2A773;
+ font-weight: 700;
+}
+.coupon-info p.form-row-first input,.coupon-info p.form-row-last input{
+ border: 1px solid #e5e5e5;
+ height: 36px;
+ margin: 0 0 14px;
+ max-width: 100%;
+ padding: 0 0 0 10px;
+ width: 370px;
+}
+.coupon-info p.form-row-last{}
+.coupon-info p.form-row input[type="submit"]:hover, p.checkout-coupon input[type="submit"]:hover {
+ background: #C2A773;
+}
+.coupon-info p.form-row input[type="checkbox"] {
+ position: relative;
+ top: 2px;
+}
+.form-row > label {
+ margin-top: 7px;
+}
+p.lost-password{
+ margin-top: 15px;
+}
+p.lost-password a{
+ color: #666;
+}
+p.checkout-coupon{}
+p.checkout-coupon input[type=text]{
+ height: 36px;
+ padding-left: 10px;
+ width: 170px;
+}
+p.checkout-coupon input[type=submit]{
+ background: #333 none repeat scroll 0 0;
+ border: medium none;
+ border-radius: 0;
+ color: #fff;
+ height: 36px;
+ margin-left: 6px;
+ padding: 5px 10px;transition: all 0.3s ease 0s;
+}
+.coupon-checkout-content {
+ margin-bottom: 30px;
+ display:none;
+}
+.checkout-area{}
+.checkbox-form{}
+.checkbox-form h3 {
+ border-bottom: 1px solid #e5e5e5;
+ font-size: 30px;
+ margin: 0 0 20px;
+ padding-bottom: 10px;
+ text-transform: uppercase;
+ width: 100%;
+}
+.country-select{
+ margin-bottom: 30px;
+ position: relative;
+}
+.country-select label,.checkout-form-list label{
+ color: #333;
+ font-family: Montserrat,Arial,Helvetica,sans-serif;
+ margin: 0 0 5px;
+ display:block;
+}
+.country-select label span.required, .checkout-form-list label span.required {
+ color: #C2A773;
+}
+.country-select select{
+ -moz-appearance: none;
+ border: 1px solid #ddd;
+ height: 32px;
+ padding-left: 10px;
+ width: 100%;
+}
+
+.zone-select select{
+ -moz-appearance: none;
+ border: 1px solid #ddd;
+ height: 32px;
+ padding-left: 10px;
+ width: 100%;
+}
+
+.checkout-form-list{margin-bottom: 30px;}
+.checkout-form-list label{color: #333;}
+.checkout-form-list label span.required{}
+.checkout-form-list input[type=text],.checkout-form-list input[type=password],.checkout-form-list input[type=email]{
+ border: 1px solid #e5e5e5;
+ border-radius: 0;
+ height: 42px;
+ width: 100%;
+ padding: 0 0 0 10px;
+ background: #fff none repeat scroll 0 0;
+}
+.checkout-form-list{}
+.checkout-form-list input[type=checkbox]{
+ display: inline-block;
+ margin-right: 10px;
+ position: relative;
+ top: 2px;
+}
+.create-acc label {
+ color: #333;
+ display: inline-block;
+}
+.checkout-form-list input[type=password]{}
+.create-account{
+ display:none
+}
+.ship-different-title{}
+.ship-different-title h3 label{
+ display: inline-block;
+ margin-right: 20px;
+}
+.ship-different-title input{}
+.order-notes{}
+.order-notes textarea{
+ height: 90px;
+ padding: 15px;width:100%
+}
+#ship-box-info{
+ display:none
+}
+.your-order{
+ background: #f2f2f2 none repeat scroll 0 0;
+ padding: 10px 20px 45px;
+}
+.your-order h3{
+ border-bottom: 1px solid #d8d8d8;
+ font-size: 30px;
+ margin: 0 0 20px;
+ padding-bottom: 10px;
+ text-transform: uppercase;
+ width: 100%;
+}
+.your-order-table table{
+ background: rgba(0, 0, 0, 0) none repeat scroll 0 0;
+ border: medium none;
+ width: 100%;
+}
+.your-order-table table th, .your-order-table table td {
+ border-bottom: 1px solid #d8d8d8;
+ border-right: medium none;
+ font-size: 14px;
+ padding: 15px 0;
+ text-align: center;
+}
+.your-order-table table th{
+ border-top: medium none;
+ font-family: Montserrat,Arial,Helvetica,sans-serif;
+ font-weight: normal;
+ text-align: center;
+ text-transform: uppercase;
+ vertical-align: middle;
+ white-space: nowrap;
+ width: 250px;
+}
+.your-order-table table .shipping ul li input{
+ position: relative;
+ top: 2px;
+}
+.your-order-table table .shipping th{
+ vertical-align: top;
+}
+.your-order-table table .order-total th{
+ border-bottom: medium none;
+ font-size: 18px;
+}
+.your-order-table table .order-total td{
+ border-bottom: medium none;
+}
+.your-order-table table tr.cart_item:hover{
+ background:#F9F9F9
+}
+.your-order-table table tr.order-total td span {
+ color: #c2a773;
+ font-size: 20px;
+}
+.your-order-table table{}
+.payment-method {
+ margin-top: 40px;
+}
+.payment-method .panel {
+ box-shadow: none;
+}
+.payment-method .panel-title > a {
+ color: #6f6f6f;
+}
+.payment-method .panel-default {
+ border: medium none;
+}
+.payment-method .panel-default > .panel-heading {
+ background-color: #F2F2F2;
+}
+.payment-method .panel-body.payment-content {
+ background: #f2f2f2 none repeat scroll 0 0;
+}
+.payment-method .panel-img img {
+ margin-left: 10px;
+ width: 50%;
+}
+.order-button-payment{}
+.order-button-payment button {
+ background: #C2A773;
+ border: medium none;
+ color: #ffffff;
+ font-size: 17px;
+ font-weight: 600;
+ height: 50px;
+ margin: 20px 0 0;
+ padding: 0;
+ text-transform: uppercase;
+ transition: all 0.3s ease 0s;
+ width: 100%;
+}
+.order-button-payment input:hover{
+ background:#000
+}
+.menu-search-box input::-webkit-input-placeholder {
+ /* Chrome */
+ color: #fff;
+ opacity: 1;
+}
+.menu-search-box input::-moz-placeholder {
+ /* Firefox 19+ */
+ color: #fff;
+ opacity: 1;
+}
+.search-box input::-webkit-input-placeholder,.sideber-form input::-webkit-input-placeholder,.checkout-form-list input::-webkit-input-placeholder,.checkout-form-list textarea::-webkit-input-placeholder,.checkout-coupon input::-webkit-input-placeholder,.menu-search-box.scnd-fix input::-webkit-input-placeholder,.search-box-3-hover input::-webkit-input-placeholder{
+ /* Chrome */
+ color: #555;
+ opacity: 1;
+}
+.search-box input::-moz-placeholder,.sideber-form input::-moz-placeholder,.checkout-form-list input::-moz-placeholder,.checkout-form-list textarea::-moz-placeholder,.checkout-coupon input::-moz-placeholder,.menu-search-box.scnd-fix input::-moz-placeholder,.search-box-3-hover input::-moz-placeholder {
+ /* Firefox 19+ */
+ color: #555;
+ opacity: 1;
+}
+.coupon input::-webkit-input-placeholder,.form-group.contuct_f input::-webkit-input-placeholder {
+ /* Chrome */
+ color: #777;
+ opacity: 1;
+}
+.coupon input::-moz-placeholder,.form-group.contuct_f input::-moz-placeholder {
+ /* Firefox 19+ */
+ color: #777;
+ opacity: 1;
+}
+.btn:focus, .btn:active:focus, .btn.active:focus, .btn.focus, .btn.focus:active, .btn.active.focus {
+ outline: medium none;
+}
+.btn:active, .btn.active {
+ box-shadow: none;
+}
+.btn-default:focus, .btn-default.focus {
+ background-color: none;
+}
+
+.no-padding-left {
+ padding-left: 0px !important;
+}
+
+.width-75 {
+ width:75% !important;
+}
+
+.margin-top-30 {
+ margin-top: 30px !important;
+}
+
+.popover-title {
+ font-size: 14px !important;
+}
+
+#formErrorMessage {
+ margin-top:10px;
+}
+
+.credit-card-box-v2 .input-group-addon {
+ padding-top: 0px !important;
+ padding-bottom: 0px !important;
+}
+
+#creditcard_card_image img {
+ max-width:none;
+}
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/css/template.css b/sm-shop/src/main/webapp/resources/templates/generic/css/template.css
new file mode 100644
index 0000000..8e6f187
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/css/template.css
@@ -0,0 +1,419 @@
+
+@font-face {
+ font-family: 'montserratextralight';
+ src: url('montserrat-extralight-webfont.woff2') format('woff2'),
+ url('montserrat-extralight-webfont.woff') format('woff');
+ font-weight: normal;
+ font-style: normal;
+
+}
+
+
+/** address **/
+
+.store-name {
+ color:#000;
+}
+
+.footer-wrapper {
+ color:#fff !important;
+}
+
+.btn.template-btn {
+ background: #d8d8d8 none repeat scroll 0 0;
+ border: 1px solid #d8d8d8;
+ border-radius: 0;
+ color: #333333;
+ font-size: 13px;
+ font-weight: 700;
+ padding: 9px 18px;
+ text-transform: uppercase;
+}
+.btn.template-btn:hover {
+ background: #c2a773 none repeat scroll 0 0;
+ border: 1px solid #c2a773;
+ color: #ffffff;
+}
+
+/** products ***/
+section.products-grid {
+ padding-top: 22px;
+ padding-bottom: 22px;
+ position: relative;
+ overflow: hidden;
+}
+
+section.products-grid .product {
+ position: relative;
+ overflow: hidden;
+ margin-bottom: 0px;
+ margin-bottom:20px;
+ height:440px;
+}
+
+section.products-grid .product .thumbnail {
+ height: 300px;
+ background-repeat: no-repeat;
+ background-position: 50% 50%;
+ background-size: cover;
+}
+
+section.products-grid .product .thumbnail img {
+ margin-top:20px;
+}
+
+.category-products {
+ margin-top:20px;
+}
+
+.listing-product-name {
+}
+
+
+.listing-product-name:hover{
+ color:#FFFFFF;
+}
+
+.width-100 {
+ width:100%;
+}
+
+.hcenter {
+ text-align:center;
+}
+
+.cart-close {
+ font-size: 21px;
+ font-weight: bold;
+ line-height: 1;
+ color: #000;
+ text-shadow: 0 1px 0 #fff;
+ opacity: .2;
+ filter: alpha(opacity=20);
+}
+
+.cart-totals-table {
+ margin-bottom: 20px;
+}
+
+.wc-proceed-to-checkout {
+ text-align:right;
+}
+
+.wc-proceed-to-checkout a {
+ text-transform: uppercase !important;
+}
+
+#main-content {
+
+ margin-top:40px;
+ margin-bottom:40px;
+
+}
+
+.cart-main-area {
+ margin-bottom: 0px !important;
+ padding-top: 0px !important;
+}
+
+/** BTNS http://codepen.io/getagain/pen/Ftien **/
+
+.transition-ano {
+ -webkit-transition: all 0.5s ease-in-out;
+ -moz-transition: all 0.5s ease-in-out;
+ -o-transition: all 0.5s ease-in-out;
+ transition: all 0.5s ease-in-out;
+}
+
+/************************************\
+Setup
+\************************************/
+
+*{
+ -webkit-box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+.specialPrice {
+ color:#ff0000;
+}
+
+
+.store-btn {
+ margin-top:10px;
+ display: block;
+ text-align: center;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.store-btn-addtocart {
+ display: inline-block;
+ line-height: 52px;
+}
+
+.store-btn-more {
+ display: inline-block;
+ line-height: 62px;
+}
+
+.store-btn .more {
+ float: left;
+ background-color: #e09e25;
+ color: white;
+ padding: 0 1.3em;
+ font-size: 1.0em;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+ line-height: 42px;
+ text-decoration: none;
+}
+
+.store-btn .addToCart {
+ float: left;
+ background-color: #555555;
+ color: white;
+ padding: 0 1.3em;
+ font-size: 1.0em;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+ line-height: 42px;
+ text-decoration: none;
+}
+
+
+
+.store-btn{
+ min-width: 2em;
+}
+
+.order-total-label {
+ text-transform:uppercase;
+}
+
+#customerAgreement {
+ margin-left:20px;
+}
+
+.single-new-product-override {
+ margin-bottom: 10px !important;
+ height:150px !important;
+}
+
+/** Laptop **/
+@media screen
+ and (min-device-width: 1200px)
+ and (max-device-width: 1600px)
+ and (-webkit-min-device-pixel-ratio: 1) {
+
+
+}
+
+@media (max-width: 940px) {
+
+ .banner-text h2 {
+ font-size:28px
+ }
+
+ .banner-text {
+ font-size:14px
+ }
+
+}
+
+@media (max-width: 650px) {
+
+ .banner-text h2 {
+ font-size:23px
+ }
+
+ .banner-text {
+ font-size:13px
+ }
+
+ .slider-button {
+ display:none;
+ }
+}
+
+@media (max-width: 460px) {
+
+ .banner-text h2 {
+ font-size:18px
+ }
+
+ .banner-text {
+ font-size:11px
+ }
+
+ .slider-button {
+ display:none;
+ }
+
+}
+
+/** large **/
+@media (min-width: 502px) {
+ #searchField {
+ width:250px;
+ }
+
+
+
+ .typeahead,
+ .tt-query,
+ .tt-hint {
+ width: 250px;
+ z-index:10000 !important;
+
+ }
+
+ .tt-dropdown-menu {
+ width: 250px;
+ }
+}
+
+/** small **/
+@media (max-width:501px) {
+
+ #searchField {
+ width:200px;
+ }
+
+ .typeahead,
+ .tt-query,
+ .tt-hint {
+ width: 180px;
+ z-index:10000 !important;
+
+ }
+
+ .tt-dropdown-menu {
+ width: 180px;
+ z-index:1000000 !important;
+ }
+
+}
+
+
+
+/** typeahead search **/
+.tt-dropdown-menu,
+.gist {
+ text-align: left;
+}
+
+.typeahead,
+.tt-query,
+.tt-hint {
+ padding: 8px 12px;
+ margin-top:4px;
+ font-size: 14px;
+ line-height: 35px;
+ outline: none;
+ }
+
+
+.twitter-typeahead {
+ vertical-align:top;
+ margin-top:-4px;
+}
+
+.typeahead {
+ background-color: #fff;
+}
+
+.tt-hint {
+ color: #999
+}
+
+.tt-dropdown-menu {
+ margin-top: 4px;
+ padding: 2px 0;
+ background-color: #fff;
+ color:#ffffff;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ z-index:10000 !important;
+}
+
+.tt-suggestion {
+ padding: 3px 20px;
+ font-size: 14px;
+ line-height: 24px;
+}
+
+.tt-suggestion.tt-cursor {
+ color: #fff;
+ background-color: #fbfbfb;
+
+}
+
+.tt-suggestion p {
+ margin: 0;
+}
+
+
+/** end twitter typeahead search **/
+
+
+.banner-slider {
+ /* Style the actual content */
+}
+.banner-text {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ background-color: rgba(0, 0, 0, 0.4);
+ padding: 1em;
+ width: 30%;
+ height: 100%;
+}
+.banner-text h2 {
+ margin: 0;
+ color:#ffffff;
+}
+.banner-text p {
+ margin: 1em 0;
+ color:#ffffff;
+}
+.banner-slider .banner-text button-link {
+ padding: 0.25em 0.5em;
+ position: absolute;
+ bottom: 1em;
+ right: 1em;
+}
+.banner-slider .image-content {
+ line-height: 0;
+}
+.banner-slider .image-content img {
+ max-width: 100%;
+}
+
+.your-order-table {
+ overflow-x:hidden !important;
+}
+
+.v-margin20 {
+ margin-top:20px;
+ margin-bottom:20px;
+}
+
+.checkbox-form {
+ padding-top:10px;
+}
+
+.payment-method-box {
+ width:100%;
+ padding:10px 10px 10px;
+}
+
+/** checkout **/
+.nav-tabs>li>a {
+ border-color: #d8d8d8;
+}
+
+.nav-tabs>li.active>a, .nav-tabs>li.active>a:hover, .nav-tabs>li.active>a:focus {
+ background-color: #F9F9F9;
+}
+
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/fonts/FontAwesome.otf b/sm-shop/src/main/webapp/resources/templates/generic/fonts/FontAwesome.otf
new file mode 100644
index 0000000..3ed7f8b
Binary files /dev/null and b/sm-shop/src/main/webapp/resources/templates/generic/fonts/FontAwesome.otf differ
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/fonts/fontawesome-webfont.eot b/sm-shop/src/main/webapp/resources/templates/generic/fonts/fontawesome-webfont.eot
new file mode 100644
index 0000000..9b6afae
Binary files /dev/null and b/sm-shop/src/main/webapp/resources/templates/generic/fonts/fontawesome-webfont.eot differ
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/fonts/fontawesome-webfont.svg b/sm-shop/src/main/webapp/resources/templates/generic/fonts/fontawesome-webfont.svg
new file mode 100644
index 0000000..d05688e
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/fonts/fontawesome-webfont.svg
@@ -0,0 +1,655 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="fontawesomeregular" horiz-adv-x="1536" >
+<font-face units-per-em="1792" ascent="1536" descent="-256" />
+<missing-glyph horiz-adv-x="448" />
+<glyph unicode=" " horiz-adv-x="448" />
+<glyph unicode="	" horiz-adv-x="448" />
+<glyph unicode=" " horiz-adv-x="448" />
+<glyph unicode="¨" horiz-adv-x="1792" />
+<glyph unicode="©" horiz-adv-x="1792" />
+<glyph unicode="®" horiz-adv-x="1792" />
+<glyph unicode="´" horiz-adv-x="1792" />
+<glyph unicode="Æ" horiz-adv-x="1792" />
+<glyph unicode="Ø" horiz-adv-x="1792" />
+<glyph unicode=" " horiz-adv-x="768" />
+<glyph unicode=" " horiz-adv-x="1537" />
+<glyph unicode=" " horiz-adv-x="768" />
+<glyph unicode=" " horiz-adv-x="1537" />
+<glyph unicode=" " horiz-adv-x="512" />
+<glyph unicode=" " horiz-adv-x="384" />
+<glyph unicode=" " horiz-adv-x="256" />
+<glyph unicode=" " horiz-adv-x="256" />
+<glyph unicode=" " horiz-adv-x="192" />
+<glyph unicode=" " horiz-adv-x="307" />
+<glyph unicode=" " horiz-adv-x="85" />
+<glyph unicode=" " horiz-adv-x="307" />
+<glyph unicode=" " horiz-adv-x="384" />
+<glyph unicode="™" horiz-adv-x="1792" />
+<glyph unicode="∞" horiz-adv-x="1792" />
+<glyph unicode="≠" horiz-adv-x="1792" />
+<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
+<glyph unicode="" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
+<glyph unicode="" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
+<glyph unicode="" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " />
+<glyph unicode="" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
+<glyph unicode="" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
+<glyph unicode="" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
+<glyph unicode="" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
+<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z " />
+<glyph unicode="" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
+<glyph unicode="" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" />
+<glyph unicode="" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
+<glyph unicode="" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" />
+<glyph unicode="" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
+<glyph unicode="" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
+<glyph unicode="" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
+<glyph unicode="" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
+<glyph unicode="" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
+<glyph unicode="" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
+<glyph unicode="" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" />
+<glyph unicode="" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
+<glyph unicode="" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
+<glyph unicode="" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57 q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -4 -0.5 -13t-0.5 -13q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5 q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z" />
+<glyph unicode="" horiz-adv-x="1408" d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142 q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5 t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68.5 -0.5t67.5 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5 t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z" />
+<glyph unicode="" horiz-adv-x="1024" d="M0 -126l17 85q6 2 81.5 21.5t111.5 37.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2 t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5 q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z" />
+<glyph unicode="" d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1 t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5 t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49 t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" />
+<glyph unicode="" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" />
+<glyph unicode="" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
+<glyph unicode="" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
+<glyph unicode="" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
+<glyph unicode="" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" />
+<glyph unicode="" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
+<glyph unicode="" horiz-adv-x="1280" d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" />
+<glyph unicode="" horiz-adv-x="1280" d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" />
+<glyph unicode="" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
+<glyph unicode="" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
+<glyph unicode="" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
+<glyph unicode="" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" />
+<glyph unicode="" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
+<glyph unicode="" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
+<glyph unicode="" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
+<glyph unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
+<glyph unicode="" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
+<glyph unicode="" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " />
+<glyph unicode="" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
+<glyph unicode="" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" />
+<glyph unicode="" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " />
+<glyph unicode="" horiz-adv-x="1664" d="M640 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1536 0q0 -52 -38 -90t-90 -38t-90 38t-38 90t38 90t90 38t90 -38t38 -90zM1664 1088v-512q0 -24 -16.5 -42.5t-40.5 -21.5l-1044 -122q13 -60 13 -70q0 -16 -24 -64h920q26 0 45 -19t19 -45 t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 11 8 31.5t16 36t21.5 40t15.5 29.5l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t19.5 -15.5t13 -24.5t8 -26t5.5 -29.5t4.5 -26h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
+<glyph unicode="" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="" horiz-adv-x="2048" d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" />
+<glyph unicode="" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-188v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-532q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960z" />
+<glyph unicode="" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
+<glyph unicode="" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
+<glyph unicode="" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
+<glyph unicode="" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" />
+<glyph unicode="" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" />
+<glyph unicode="" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
+<glyph unicode="" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
+<glyph unicode="" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
+<glyph unicode="" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
+<glyph unicode="" horiz-adv-x="1024" d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" />
+<glyph unicode="" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" />
+<glyph unicode="" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
+<glyph unicode="" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" />
+<glyph unicode="" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
+<glyph unicode="" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5 t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
+<glyph unicode="" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
+<glyph unicode="" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
+<glyph unicode="" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
+<glyph unicode="" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
+<glyph unicode="" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
+<glyph unicode="" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
+<glyph unicode="" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " />
+<glyph unicode="" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
+<glyph unicode="" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " />
+<glyph unicode="" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
+<glyph unicode="" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" />
+<glyph unicode="" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
+<glyph unicode="" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
+<glyph unicode="" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
+<glyph unicode="" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
+<glyph unicode="" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
+<glyph unicode="" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
+<glyph unicode="" d="M917 631q0 26 -6 64h-362v-132h217q-3 -24 -16.5 -50t-37.5 -53t-66.5 -44.5t-96.5 -17.5q-99 0 -169 71t-70 171t70 171t169 71q92 0 153 -59l104 101q-108 100 -257 100q-160 0 -272 -112.5t-112 -271.5t112 -271.5t272 -112.5q165 0 266.5 105t101.5 270zM1262 585 h109v110h-109v110h-110v-110h-110v-110h110v-110h110v110zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="2304" d="M1437 623q0 -208 -87 -370.5t-248 -254t-369 -91.5q-149 0 -285 58t-234 156t-156 234t-58 285t58 285t156 234t234 156t285 58q286 0 491 -192l-199 -191q-117 113 -292 113q-123 0 -227.5 -62t-165.5 -168.5t-61 -232.5t61 -232.5t165.5 -168.5t227.5 -62 q83 0 152.5 23t114.5 57.5t78.5 78.5t49 83t21.5 74h-416v252h692q12 -63 12 -122zM2304 745v-210h-209v-209h-210v209h-209v210h209v209h210v-209h209z" />
+<glyph unicode="" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
+<glyph unicode="" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
+<glyph unicode="" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
+<glyph unicode="" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
+<glyph unicode="" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
+<glyph unicode="" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" />
+<glyph unicode="" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
+<glyph unicode="" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" />
+<glyph unicode="" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5 t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
+<glyph unicode="" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
+<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704 q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z" />
+<glyph unicode="" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
+<glyph unicode="" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" />
+<glyph unicode="" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
+<glyph unicode="" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
+<glyph unicode="" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
+<glyph unicode="" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
+<glyph unicode="" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
+<glyph unicode="" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
+<glyph unicode="" horiz-adv-x="1792" d="M526 142q0 -53 -37.5 -90.5t-90.5 -37.5q-52 0 -90 38t-38 90q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 -64q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -53 -37.5 -90.5t-90.5 -37.5 t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1522 142q0 -52 -38 -90t-90 -38q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM558 1138q0 -66 -47 -113t-113 -47t-113 47t-47 113t47 113t113 47t113 -47t47 -113z M1728 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1088 1344q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1618 1138q0 -93 -66 -158.5t-158 -65.5q-93 0 -158.5 65.5t-65.5 158.5 q0 92 65.5 158t158.5 66q92 0 158 -66t66 -158z" />
+<glyph unicode="" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
+<glyph unicode="" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
+<glyph unicode="" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" />
+<glyph unicode="" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
+<glyph unicode="" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
+<glyph unicode="" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+<glyph unicode="" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
+<glyph unicode="" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
+<glyph unicode="" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" />
+<glyph unicode="" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" />
+<glyph unicode="" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
+<glyph unicode="" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
+<glyph unicode="" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
+<glyph unicode="" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" />
+<glyph unicode="" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
+<glyph unicode="" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
+<glyph unicode="" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
+<glyph unicode="" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" />
+<glyph unicode="" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
+<glyph unicode="" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
+<glyph unicode="" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
+<glyph unicode="" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
+<glyph unicode="" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
+<glyph unicode="" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" />
+<glyph unicode="" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
+<glyph unicode="" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
+<glyph unicode="" horiz-adv-x="1280" d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" />
+<glyph unicode="" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
+<glyph unicode="" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
+<glyph unicode="" d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" />
+<glyph unicode="" d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" />
+<glyph unicode="" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
+<glyph unicode="" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
+<glyph unicode="" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
+<glyph unicode="" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
+<glyph unicode="" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
+<glyph unicode="" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" />
+<glyph unicode="" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" />
+<glyph unicode="" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
+<glyph unicode="" d="M1289 -96h-1118v480h-160v-640h1438v640h-160v-480zM347 428l33 157l783 -165l-33 -156zM450 802l67 146l725 -339l-67 -145zM651 1158l102 123l614 -513l-102 -123zM1048 1536l477 -641l-128 -96l-477 641zM330 65v159h800v-159h-800z" />
+<glyph unicode="" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139v1142q0 81 58 139 t139 58h1142q81 0 139 -58t58 -139z" />
+<glyph unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
+<glyph unicode="" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
+<glyph unicode="" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1024" d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14 q78 2 134 29z" />
+<glyph unicode="" d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
+<glyph unicode="" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
+<glyph unicode="" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
+<glyph unicode="" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
+<glyph unicode="" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
+<glyph unicode="" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
+<glyph unicode="" horiz-adv-x="1280" d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 55 38 102.5t120 47.5h888q95 0 127 -53t10 -159zM1227 1324 l-158 -790q4 17 35 173.5t69.5 350t53.5 266.5z" />
+<glyph unicode="" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
+<glyph unicode="" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
+<glyph unicode="" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
+<glyph unicode="" d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" />
+<glyph unicode="" horiz-adv-x="1280" d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z " />
+<glyph unicode="" d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 16 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" />
+<glyph unicode="" d="M1292 898q10 216 -161 222q-231 8 -312 -261q44 19 82 19q85 0 74 -96q-4 -57 -74 -167t-105 -110q-43 0 -82 169q-13 54 -45 255q-30 189 -160 177q-59 -7 -164 -100l-81 -72l-81 -72l52 -67q76 52 87 52q57 0 107 -179q15 -55 45 -164.5t45 -164.5q68 -179 164 -179 q157 0 383 294q220 283 226 444zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1152" d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
+<glyph unicode="" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="2176" d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40 t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96l-93 464h29 q157 0 273 64zM352 816h-29l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9 q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102 t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8zM725 498l310 105l-105 315l-310 -107z" />
+<glyph unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69 q-46 32 -141.5 92.5t-142.5 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13 t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5 t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21 t14.5 -24t14 -23q63 -107 63 -212zM909 573l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1570 1009q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5l235 678q59 169 59 276q0 42 -6 79zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286 t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 -215q173 0 331.5 68t273 182.5t182.5 273t68 331.5t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5t68 -331.5t182.5 -273 t273 -182.5t331.5 -68z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" />
+<glyph unicode="" horiz-adv-x="2048" d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64 q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" />
+<glyph unicode="" horiz-adv-x="2304" d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433 q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" />
+<glyph unicode="" d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q43 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0 q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" />
+<glyph unicode="" d="M768 750h725q12 -67 12 -128q0 -217 -91 -387.5t-259.5 -266.5t-386.5 -96q-157 0 -299 60.5t-245 163.5t-163.5 245t-60.5 299t60.5 299t163.5 245t245 163.5t299 60.5q300 0 515 -201l-209 -201q-123 119 -306 119q-129 0 -238.5 -65t-173.5 -176.5t-64 -243.5 t64 -243.5t173.5 -176.5t238.5 -65q87 0 160 24t120 60t82 82t51.5 87t22.5 78h-436v264z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1095 369q16 -16 0 -31q-62 -62 -199 -62t-199 62q-16 15 0 31q6 6 15 6t15 -6q48 -49 169 -49q120 0 169 49q6 6 15 6t15 -6zM788 550q0 -37 -26 -63t-63 -26t-63.5 26t-26.5 63q0 38 26.5 64t63.5 26t63 -26.5t26 -63.5zM1183 550q0 -37 -26.5 -63t-63.5 -26t-63 26 t-26 63t26 63.5t63 26.5t63.5 -26t26.5 -64zM1434 670q0 49 -35 84t-85 35t-86 -36q-130 90 -311 96l63 283l200 -45q0 -37 26 -63t63 -26t63.5 26.5t26.5 63.5t-26.5 63.5t-63.5 26.5q-54 0 -80 -50l-221 49q-19 5 -25 -16l-69 -312q-180 -7 -309 -97q-35 37 -87 37 q-50 0 -85 -35t-35 -84q0 -35 18.5 -64t49.5 -44q-6 -27 -6 -56q0 -142 140 -243t337 -101q198 0 338 101t140 243q0 32 -7 57q30 15 48 43.5t18 63.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191 t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="" d="M939 407q13 -13 0 -26q-53 -53 -171 -53t-171 53q-13 13 0 26q5 6 13 6t13 -6q42 -42 145 -42t145 42q5 6 13 6t13 -6zM676 563q0 -31 -23 -54t-54 -23t-54 23t-23 54q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1014 563q0 -31 -23 -54t-54 -23t-54 23t-23 54 q0 32 22.5 54.5t54.5 22.5t54.5 -22.5t22.5 -54.5zM1229 666q0 42 -30 72t-73 30q-42 0 -73 -31q-113 78 -267 82l54 243l171 -39q1 -32 23.5 -54t53.5 -22q32 0 54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5q-48 0 -69 -43l-189 42q-17 5 -21 -13l-60 -268q-154 -6 -265 -83 q-30 32 -74 32q-43 0 -73 -30t-30 -72q0 -30 16 -55t42 -38q-5 -25 -5 -48q0 -122 120 -208.5t289 -86.5q170 0 290 86.5t120 208.5q0 25 -6 49q25 13 40.5 37.5t15.5 54.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150 v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103 t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="1920" d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328 v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" />
+<glyph unicode="" d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="2048" d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123 v-369h123z" />
+<glyph unicode="" d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101 v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="2038" d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14 q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24 q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33 q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5 t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5zM1282 842q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43 q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5 t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM822 568l48 12l109 -177l-73 -48zM1323 51q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13 t-54 -9.5t-53.5 -7.5t-32 -4.5l-7 43q21 2 60.5 8.5t72 10t60.5 3.5h14zM866 679l-96 -20l-6 17q10 1 32.5 7t34.5 6q19 0 35 -10zM1061 45h31l10 -83l-41 -12v95zM1950 1535v1v-1zM1950 1535l-1 -5l-2 -2l1 3zM1950 1535l1 1z" />
+<glyph unicode="" d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10 q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14 q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14 t55.5 63q28 41 42.5 101t14.5 106zM1536 506q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44 q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5t19.5 -177.5z" />
+<glyph unicode="" d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5 t149.5 -87.5zM1536 78q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5 q76 -11 126.5 -68.5t50.5 -134.5zM1534 1202q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126 t135.5 51q85 0 145 -60.5t60 -145.5z" />
+<glyph unicode="" d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5 q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28 q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5zM449 944q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032l-694 -233v-1031z M1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11 q73 -37 159.5 -61.5t157.5 -24.5q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5zM1536 1050v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3v1078q3 9 4 10q5 6 20 11q106 35 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5 q20 0 20 -21v-418z" />
+<glyph unicode="" horiz-adv-x="1792" d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48 l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 512v128q0 14 -9 23 t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128 q14 0 23 9t9 23zM1184 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 256v128q0 14 -9 23t-23 9h-128 q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1536 896v256h-160q-40 0 -68 28t-28 68v160h-640v-512h896z" />
+<glyph unicode="" d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9 t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 160v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM384 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 -96v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9 t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM896 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 928v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 160v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23z" />
+<glyph unicode="" horiz-adv-x="1280" d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68t68 28t68 -28l228 -228h368l228 228q28 28 68 28t68 -28t28 -68t-28 -68zM864 1152q0 -93 -65.5 -158.5 t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="" horiz-adv-x="1664" d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5 q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 86 56 191.5t139.5 192.5t187.5 146t193 59zM1071 819 q-61 0 -105 39t-63 92.5t-19 113.5q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5zM1503 923q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5q-77 0 -119 59t-42 139q0 74 35 152.5 t100.5 134t141.5 55.5z" />
+<glyph unicode="" horiz-adv-x="768" d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z " />
+<glyph unicode="" horiz-adv-x="2304" d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67 t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-5 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70 v-400l434 -186q36 -16 57 -48t21 -70z" />
+<glyph unicode="" horiz-adv-x="2048" d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658 q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204 q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611v1260z" />
+<glyph unicode="" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5 t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216q0 -135 79 -217 t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20zM1126 722q113 0 124 -122h-254q4 56 39 89t91 33zM964 988h319v-77h-319v77z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5 q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -322t-321.5 -133l-437 -319q-12 -129 -109 -218t-229 -89 q-121 0 -214 76t-118 192l-230 92v429l389 -157q79 48 173 48q13 0 35 -2l284 407q2 187 135.5 319t320.5 132q188 0 321.5 -133.5t133.5 -321.5z" />
+<glyph unicode="" d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5 q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 255.5t-255.5 105.5 q-148 0 -253 -104.5t-107 -252.5l-225 -322q-9 1 -28 1q-75 0 -137 -37l-297 119v468q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5zM1289 887q0 -100 -71 -170.5t-171 -70.5t-170.5 70.5t-70.5 170.5t70.5 171t170.5 71q101 0 171.5 -70.5t70.5 -171.5z " />
+<glyph unicode="" horiz-adv-x="1792" d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188 l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5 t36 -39.5t32 -35zM1550 1053l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436l313 195zM1407 1279l142 83l-220 -373l-419 20l151 86q-34 89 -75 166t-75.5 123.5t-64.5 80t-47 46.5l-17 13l405 -1 q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190z" />
+<glyph unicode="" horiz-adv-x="2048" d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384 q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h768q98 0 179 -63.5t104 -157.5 l105 -419h28q93 0 158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="" horiz-adv-x="2048" d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5 t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5z M1728 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47z" />
+<glyph unicode="" d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384 q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" />
+<glyph unicode="" d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64 q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37 q159 0 309.5 -34t253.5 -95q21 -12 40 -12q29 0 50.5 20.5t21.5 51.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="1024" d="M1024 1233l-303 -582l24 -31h279v-415h-507l-44 -30l-142 -273l-30 -30h-301v303l303 583l-24 30h-279v415h507l44 30l142 273l30 30h301v-303z" />
+<glyph unicode="" horiz-adv-x="2304" d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11 q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11l-21 237l21 245 q2 12 12 12q11 0 11 -12zM307 657l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13l-21 244l21 252q0 13 13 13q12 0 14 -13zM401 639l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5l-20 246l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15zM784 164zM495 785 l21 -380l-21 -246q0 -7 -5 -12.5t-12 -5.5q-16 0 -18 18l-18 246l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5zM589 871l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19l-16 244l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5zM687 911l18 -506l-18 -242 q-2 -21 -22 -21q-19 0 -21 21l-16 242l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5zM1079 169v0v0zM881 915l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18l-14 239l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18zM980 896l14 -492l-14 -236q0 -11 -8 -19 t-19 -8t-19 8t-9 19l-12 236l12 492q1 12 9 20t19 8t18.5 -8t8.5 -20zM1192 404l-14 -231v0q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114l-6 117l12 636v3q2 15 12 24q9 7 20 7q8 0 15 -5q14 -8 16 -26zM2304 423q0 -117 -83 -199.5t-200 -82.5h-786q-13 2 -22 11t-9 22v899 q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201z" />
+<glyph unicode="" d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127 t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5 t-103 128v128q0 69 103 128t280 93.5t385 34.5z" />
+<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4q52 85 107 197 q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM716 974q-15 -42 -2 -132q1 7 7 44q0 3 7 43q1 4 4 8 q-1 1 -1 2t-0.5 1.5t-0.5 1.5q-1 22 -13 36q0 -1 -1 -2v-2zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83zM1238 329q-24 24 -140 24q76 -28 124 -28q14 0 18 1q0 1 -2 3z" />
+<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4l-3 21q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5t-3.5 -21.5l-4 -21h-4l-2 21 q-2 26 -7 46l-99 438h90v107h-300z" />
+<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107 h-290v-107h68l189 -272l-194 -283h-68z" />
+<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" />
+<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" />
+<glyph unicode="" d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400 v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5q0 25 8 52q21 63 120 396v128h128v-128h79 q22 0 39 -13t23 -34zM640 128q53 0 90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45t37.5 -45t90.5 -19z" />
+<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5 q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5t23.5 -42.5q18 -15 40 -15zM826 145q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5t20 -44.5q20 -17 44 -17z" />
+<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" />
+<glyph unicode="" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21t6.5 24l182 243 l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5zM662 6q-13 2 -20.5 13t-5.5 24l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5z" />
+<glyph unicode="" d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406 q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14z" />
+<glyph unicode="" horiz-adv-x="1792" d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546 q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" />
+<glyph unicode="" horiz-adv-x="2048" d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94 q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55 t121.5 -21q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97q14 -16 29.5 -34t34.5 -40t29 -34q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5 t-85 -189.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194 q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5 t271.5 -112.5zM1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1760 640q0 -176 -68.5 -336t-184 -275.5t-275.5 -184t-336 -68.5t-336 68.5t-275.5 184t-184 275.5t-68.5 336q0 213 97 398.5t265 305.5t374 151v-228q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5 t136.5 204t51 248.5q0 230 -145.5 406t-366.5 221v228q206 -31 374 -151t265 -305.5t97 -398.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41 t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170 t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136 q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" />
+<glyph unicode="" horiz-adv-x="1792" d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251 l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162 q-67 77 -98 169l232 80q-14 42 -14 85t14 85l-233 80q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169zM874 1448v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98l-57 33 q106 172 282 275.5t385 109.5zM1705 640q0 -205 -98 -385l-57 33q27 52 49 112l-83 28q36 103 36 212q0 112 -35 212l82 28q-19 56 -49 112l57 33q98 -180 98 -385zM1585 1063l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13v66q209 -6 385 -109.5 t282 -275.5zM1748 640q0 173 -67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331t67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71 t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="" d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85 q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392 q0 -50 -3 -75zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072 q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58 q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47 q98 0 218 47zM1123 220h-222q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134zM1724 442v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6v190h96v76q0 54 -6 89h227q-6 -41 -6 -165h171 v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33zM1148 1389q0 -58 -39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5z" />
+<glyph unicode="" d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1280" d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5 t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153t-153 102t-186 38t-186 -38t-153 -102t-102 -153 t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5 q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9t-98 20 t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20q-18 -41 -54.5 -74.5 t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100q0 275 252 466z" />
+<glyph unicode="" horiz-adv-x="2048" d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25 q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5 q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5zM2048 404q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109 q-150 -37 -218 -37q-169 0 -311 70.5t-223.5 191.5t-81.5 264t81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137 l863 639l-478 -797z" />
+<glyph unicode="" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298zM896 928v-448q0 -14 -9 -23 t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23z" />
+<glyph unicode="" d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15 t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18q-15 10 -45 12t-53 2 t-41 14t-18 45q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160 q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5 q0 -26 -12 -48t-36 -22z" />
+<glyph unicode="" horiz-adv-x="1280" d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179 q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" />
+<glyph unicode="" d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256 q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" />
+<glyph unicode="" d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5 t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" />
+<glyph unicode="" d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5 t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5 t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23t9 23q10 9 23 9t23 -9l90 -91 q10 -9 10 -22.5t-10 -22.5zM1751 1129q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5t10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23zM1792 1312q0 -14 -9 -23t-23 -9h-96q-14 0 -23 9t-9 23t9 23t23 9h96q14 0 23 -9t9 -23zM1600 1504v-96q0 -14 -9 -23t-23 -9 t-23 9t-9 23v96q0 14 9 23t23 9t23 -9t9 -23zM1751 1449l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5t10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+<glyph unicode="" horiz-adv-x="1792" d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323 l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l139 298l326 40z" />
+<glyph unicode="" horiz-adv-x="1792" d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t-46 -19h-383zM1216 224v-192q0 -14 -9 -23t-23 -9h-192 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1600 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23 zM1408 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1016v-13h-514v10q0 104 -382 102q-382 -1 -382 -102v-10h-514v13q0 17 8.5 43t34 64t65.5 75.5t110.5 76t160 67.5t224 47.5t293.5 18.5t293 -18.5t224 -47.5 t160.5 -67.5t110.5 -76t65.5 -75.5t34 -64t8.5 -43zM1792 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 962v-129q0 -27 -19 -46t-46 -19h-384q-27 0 -46 19t-19 46v129h514z" />
+<glyph unicode="" horiz-adv-x="1792" d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1755 1083q37 -37 37 -90t-37 -91l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234l401 400 q38 37 91 37t90 -37z" />
+<glyph unicode="" horiz-adv-x="1792" d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5 t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1t53 1t54.5 4.5t61 8.5t62 13.5t67 19.5t67.5 27t72 34.5z M1763 621q-121 -149 -372 -252q84 -285 -23 -465q-66 -113 -183 -148q-104 -32 -182 15q-86 51 -82 164l-1 326v1q-8 2 -24.5 6t-23.5 5l-1 -338q4 -114 -83 -164q-79 -47 -183 -15q-117 36 -182 150q-105 180 -22 463q-251 103 -372 252q-25 37 -4 63t60 -1q3 -2 11 -7 t11 -8v694q0 72 47 123t114 51h1257q67 0 114 -51t47 -123v-694l21 15q39 27 60 1t-4 -63z" />
+<glyph unicode="" horiz-adv-x="1792" d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" />
+<glyph unicode="" d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36 q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q70 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 -1 119 -40q203 -66 242 -79.5 t47 -20.5q28 -22 22 -61zM778 803q5 -102 -54 -122q-58 -17 -114 71l-378 598q-8 35 19 62q41 43 207.5 89.5t224.5 31.5q40 -10 49 -45q3 -18 22 -305.5t24 -379.5zM1440 695q3 -39 -26 -59q-15 -10 -329 -86q-67 -15 -91 -23l1 2q-23 -6 -46 4t-37 32q-30 47 0 87 q1 1 75 102q125 171 150 204t34 39q28 19 65 2q48 -23 123 -133.5t81 -167.5v-3z" />
+<glyph unicode="" horiz-adv-x="2048" d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19 t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" />
+<glyph unicode="" horiz-adv-x="2048" d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121 q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73t380 -73t320 -205q10 -10 10 -22q0 -18 -75 -93t-92 -75z M1838 827q-11 0 -22 9q-179 157 -371.5 236.5t-420.5 79.5t-420.5 -79.5t-371.5 -236.5q-11 -9 -22 -9q-17 0 -92.5 75t-75.5 93q0 13 10 23q187 186 445 288t527 102t527 -102t445 -288q10 -10 10 -23q0 -18 -75.5 -93t-92.5 -75z" />
+<glyph unicode="" horiz-adv-x="1792" d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5zM384 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 768q0 53 -37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1536 0v384q0 52 -38 90t-90 38t-90 -38t-38 -90v-384q0 -52 38 -90t90 -38t90 38t38 90zM1152 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z M1536 1088v256q0 26 -19 45t-45 19h-1280q-26 0 -45 -19t-19 -45v-256q0 -26 19 -45t45 -19h1280q26 0 45 19t19 45zM1536 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1408v-1536q0 -52 -38 -90t-90 -38 h-1408q-52 0 -90 38t-38 90v1536q0 52 38 90t90 38h1408q52 0 90 -38t38 -90z" />
+<glyph unicode="" d="M1519 890q18 -84 -4 -204q-87 -444 -565 -444h-44q-25 0 -44 -16.5t-24 -42.5l-4 -19l-55 -346l-2 -15q-5 -26 -24.5 -42.5t-44.5 -16.5h-251q-21 0 -33 15t-9 36q9 56 26.5 168t26.5 168t27 167.5t27 167.5q5 37 43 37h131q133 -2 236 21q175 39 287 144q102 95 155 246 q24 70 35 133q1 6 2.5 7.5t3.5 1t6 -3.5q79 -59 98 -162zM1347 1172q0 -107 -46 -236q-80 -233 -302 -315q-113 -40 -252 -42q0 -1 -90 -1l-90 1q-100 0 -118 -96q-2 -8 -85 -530q-1 -10 -12 -10h-295q-22 0 -36.5 16.5t-11.5 38.5l232 1471q5 29 27.5 48t51.5 19h598 q34 0 97.5 -13t111.5 -32q107 -41 163.5 -123t56.5 -196z" />
+<glyph unicode="" horiz-adv-x="1792" d="M602 949q19 -61 31 -123.5t17 -141.5t-14 -159t-62 -145q-21 81 -67 157t-95.5 127t-99 90.5t-78.5 57.5t-33 19q-62 34 -81.5 100t14.5 128t101 81.5t129 -14.5q138 -83 238 -177zM927 1236q11 -25 20.5 -46t36.5 -100.5t42.5 -150.5t25.5 -179.5t0 -205.5t-47.5 -209.5 t-105.5 -208.5q-51 -72 -138 -72q-54 0 -98 31q-57 40 -69 109t28 127q60 85 81 195t13 199.5t-32 180.5t-39 128t-22 52q-31 63 -8.5 129.5t85.5 97.5q34 17 75 17q47 0 88.5 -25t63.5 -69zM1248 567q-17 -160 -72 -311q-17 131 -63 246q25 174 -5 361q-27 178 -94 342 q114 -90 212 -211q9 -37 15 -80q26 -179 7 -347zM1520 1440q9 -17 23.5 -49.5t43.5 -117.5t50.5 -178t34 -227.5t5 -269t-47 -300t-112.5 -323.5q-22 -48 -66 -75.5t-95 -27.5q-39 0 -74 16q-67 31 -92.5 100t4.5 136q58 126 90 257.5t37.5 239.5t-3.5 213.5t-26.5 180.5 t-38.5 138.5t-32.5 90t-15.5 32.5q-34 65 -11.5 135.5t87.5 104.5q37 20 81 20q49 0 91.5 -25.5t66.5 -70.5z" />
+<glyph unicode="" horiz-adv-x="2304" d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27 q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24.5 38.5t70.5 16.5q70 1 124 -24l15 -8zM2042 960h-128 q-65 0 -87 -54l-246 -588h174l35 96h212q5 -22 20 -96h154zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="" horiz-adv-x="2304" d="M671 603h-13q-47 0 -47 -32q0 -22 20 -22q17 0 28 15t12 39zM1066 639h62v3q1 4 0.5 6.5t-1 7t-2 8t-4.5 6.5t-7.5 5t-11.5 2q-28 0 -36 -38zM1606 603h-12q-48 0 -48 -32q0 -22 20 -22q17 0 28 15t12 39zM1925 629q0 41 -30 41q-19 0 -31 -20t-12 -51q0 -42 28 -42 q20 0 32.5 20t12.5 52zM480 770h87l-44 -262h-56l32 201l-71 -201h-39l-4 200l-34 -200h-53l44 262h81l2 -163zM733 663q0 -6 -4 -42q-16 -101 -17 -113h-47l1 22q-20 -26 -58 -26q-23 0 -37.5 16t-14.5 42q0 39 26 60.5t73 21.5q14 0 23 -1q0 3 0.5 5.5t1 4.5t0.5 3 q0 20 -36 20q-29 0 -59 -10q0 4 7 48q38 11 67 11q74 0 74 -62zM889 721l-8 -49q-22 3 -41 3q-27 0 -27 -17q0 -8 4.5 -12t21.5 -11q40 -19 40 -60q0 -72 -87 -71q-34 0 -58 6q0 2 7 49q29 -8 51 -8q32 0 32 19q0 7 -4.5 11.5t-21.5 12.5q-43 20 -43 59q0 72 84 72 q30 0 50 -4zM977 721h28l-7 -52h-29q-2 -17 -6.5 -40.5t-7 -38.5t-2.5 -18q0 -16 19 -16q8 0 16 2l-8 -47q-21 -7 -40 -7q-43 0 -45 47q0 12 8 56q3 20 25 146h55zM1180 648q0 -23 -7 -52h-111q-3 -22 10 -33t38 -11q30 0 58 14l-9 -54q-30 -8 -57 -8q-95 0 -95 95 q0 55 27.5 90.5t69.5 35.5q35 0 55.5 -21t20.5 -56zM1319 722q-13 -23 -22 -62q-22 2 -31 -24t-25 -128h-56l3 14q22 130 29 199h51l-3 -33q14 21 25.5 29.5t28.5 4.5zM1506 763l-9 -57q-28 14 -50 14q-31 0 -51 -27.5t-20 -70.5q0 -30 13.5 -47t38.5 -17q21 0 48 13 l-10 -59q-28 -8 -50 -8q-45 0 -71.5 30.5t-26.5 82.5q0 70 35.5 114.5t91.5 44.5q26 0 61 -13zM1668 663q0 -18 -4 -42q-13 -79 -17 -113h-46l1 22q-20 -26 -59 -26q-23 0 -37 16t-14 42q0 39 25.5 60.5t72.5 21.5q15 0 23 -1q2 7 2 13q0 20 -36 20q-29 0 -59 -10q0 4 8 48 q38 11 67 11q73 0 73 -62zM1809 722q-14 -24 -21 -62q-23 2 -31.5 -23t-25.5 -129h-56l3 14q19 104 29 199h52q0 -11 -4 -33q15 21 26.5 29.5t27.5 4.5zM1950 770h56l-43 -262h-53l3 19q-23 -23 -52 -23q-31 0 -49.5 24t-18.5 64q0 53 27.5 92t64.5 39q31 0 53 -29z M2061 640q0 148 -72.5 273t-198 198t-273.5 73q-181 0 -328 -110q127 -116 171 -284h-50q-44 150 -158 253q-114 -103 -158 -253h-50q44 168 171 284q-147 110 -328 110q-148 0 -273.5 -73t-198 -198t-72.5 -273t72.5 -273t198 -198t273.5 -73q181 0 328 110 q-120 111 -165 264h50q46 -138 152 -233q106 95 152 233h50q-45 -153 -165 -264q147 -110 328 -110q148 0 273.5 73t198 198t72.5 273zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="" horiz-adv-x="2304" d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42 q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 -71 44l-42 -40q44 -64 115 -64q51 0 83 30.5t32 79.5zM1008 604 v77q-37 -37 -78 -37q-49 0 -80.5 32.5t-31.5 82.5q0 48 31.5 81.5t77.5 33.5q43 0 81 -38v77q-40 20 -80 20q-74 0 -125.5 -50.5t-51.5 -123.5t51 -123.5t125 -50.5q42 0 81 19zM2240 0v527q-65 -40 -144.5 -84t-237.5 -117t-329.5 -137.5t-417.5 -134.5t-504 -118h1569 q26 0 45 19t19 45zM1389 757q0 75 -53 128t-128 53t-128 -53t-53 -128t53 -128t128 -53t128 53t53 128zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56h-115v74h119v57h-184v-333zM2105 593h80l-105 140q76 16 76 94q0 47 -31 73 t-87 26h-97v-333h65v133h9zM2304 1274v-1268q0 -56 -38.5 -95t-93.5 -39h-2040q-55 0 -93.5 39t-38.5 95v1268q0 56 38.5 95t93.5 39h2040q55 0 93.5 -39t38.5 -95z" />
+<glyph unicode="" horiz-adv-x="2304" d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1t-32.5 0.5t-29.5 0.5v-91h-126l-80 90l-83 -90h-256v271h260 l80 -89l82 89h207q109 0 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229q0 -55 -38.5 -94.5t-93.5 -39.5h-2040q-55 0 -93.5 39.5t-38.5 94.5v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1q10 0 10 -14v-86h279 v23q23 -12 55 -18t52.5 -6.5t63 0.5t51.5 1l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249q-69 0 -109 -22v22h-172v-22q-24 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391q0 55 38.5 94.5t93.5 39.5h2040 q55 0 93.5 -39.5t38.5 -94.5v-678h-120q-51 0 -81 -22v22h-177q-55 0 -78 -22v22h-316v-22q-31 22 -87 22h-209v-22q-23 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21q59 0 90 13v-102h174v99h8q8 0 10 -2t2 -10v-87h529q57 0 88 24v-24h168 q60 0 95 17zM1546 469q0 -23 -12 -43t-34 -29q25 -9 34 -26t9 -46v-54h-65v45q0 33 -12 43.5t-46 10.5h-69v-99h-65v271h154q48 0 77 -15t29 -58zM1269 936q0 -24 -12.5 -44t-33.5 -29q26 -9 34.5 -25.5t8.5 -46.5v-53h-65q0 9 0.5 26.5t0 25t-3 18.5t-8.5 16t-17.5 8.5 t-29.5 3.5h-70v-98h-64v271l153 -1q49 0 78 -14.5t29 -57.5zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357q0 -86 -102 -86h-126v58h126q34 0 34 25q0 16 -17 21t-41.5 5t-49.5 3.5t-42 22.5t-17 55q0 39 26 60t66 21 h130v-57h-119q-36 0 -36 -25q0 -16 17.5 -20.5t42 -4t49 -2.5t42 -21.5t17.5 -54.5zM2304 407v-101q-24 -35 -88 -35h-125v58h125q33 0 33 25q0 13 -12.5 19t-31 5.5t-40 2t-40 8t-31 24t-12.5 48.5q0 39 26.5 60t66.5 21h129v-57h-118q-36 0 -36 -25q0 -20 29 -22t68.5 -5 t56.5 -26zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75q-129 0 -129 133q0 138 133 138h63v-59q-7 0 -28 1t-28.5 0.5t-23 -2t-21.5 -6.5t-14.5 -13.5t-11.5 -23t-3 -33.5q0 -38 13.5 -58t49.5 -20h29l92 213h97l109 -256v256h99l114 -188v188h66z" />
+<glyph unicode="" horiz-adv-x="2304" d="M745 630q0 -37 -25.5 -61.5t-62.5 -24.5q-29 0 -46.5 16t-17.5 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM1530 779q0 -42 -22 -57t-66 -15l-32 -1l17 107q2 11 13 11h18q22 0 35 -2t25 -12.5t12 -30.5zM1881 630q0 -36 -25.5 -61t-61.5 -25q-29 0 -47 16 t-18 44q0 37 25 62.5t62 25.5q28 0 46.5 -16.5t18.5 -45.5zM513 801q0 59 -38.5 85.5t-100.5 26.5h-160q-19 0 -21 -19l-65 -408q-1 -6 3 -11t10 -5h76q20 0 22 19l18 110q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM822 489l41 261q1 6 -3 11t-10 5h-76 q-14 0 -17 -33q-27 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q28 0 58 12t48 32q-4 -12 -4 -21q0 -16 13 -16h69q19 0 22 19zM1269 752q0 5 -4 9.5t-9 4.5h-77q-11 0 -18 -10l-106 -156l-44 150q-5 16 -22 16h-75q-5 0 -9 -4.5t-4 -9.5q0 -2 19.5 -59 t42 -123t23.5 -70q-82 -112 -82 -120q0 -13 13 -13h77q11 0 18 10l255 368q2 2 2 7zM1649 801q0 59 -38.5 85.5t-100.5 26.5h-159q-20 0 -22 -19l-65 -408q-1 -6 3 -11t10 -5h82q12 0 16 13l18 116q1 8 7 13t15 6.5t17 1.5t19 -1t14 -1q86 0 135 48.5t49 134.5zM1958 489 l41 261q1 6 -3 11t-10 5h-76q-14 0 -17 -33q-26 40 -95 40q-72 0 -122.5 -54t-50.5 -127q0 -59 34.5 -94t92.5 -35q29 0 59 12t47 32q0 -1 -2 -9t-2 -12q0 -16 13 -16h69q19 0 22 19zM2176 898v1q0 14 -13 14h-74q-11 0 -13 -11l-65 -416l-1 -2q0 -5 4 -9.5t10 -4.5h66 q19 0 21 19zM392 764q-5 -35 -26 -46t-60 -11l-33 -1l17 107q2 11 13 11h19q40 0 58 -11.5t12 -48.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="" horiz-adv-x="2304" d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109 q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219q0 -84 44 -120q38 -30 111 -30q32 0 79 11v118 q-32 -7 -44 -7q-42 0 -42 50v197h77zM1087 724v139q-15 3 -28 3q-32 0 -55.5 -16t-33.5 -46l-10 56h-131v-471h150v306q26 31 82 31q16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638q0 122 -45 179q-40 52 -111 52q-64 0 -117 -56l-8 47h-132v-645l150 25v151 q36 -11 68 -11q83 0 134 56q61 65 61 202zM1278 986q0 33 -23 56t-56 23t-56 -23t-23 -56t23 -56.5t56 -23.5t56 23.5t23 56.5zM2176 629q0 113 -48 176q-50 64 -144 64q-96 0 -151.5 -66t-55.5 -180q0 -128 63 -188q55 -55 161 -55q101 0 160 40l-16 103q-57 -31 -128 -31 q-43 0 -63 19q-23 19 -28 66h248q2 14 2 52zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="" horiz-adv-x="2048" d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5 l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5 l418 363q10 8 23.5 7t21.5 -11z" />
+<glyph unicode="" horiz-adv-x="2048" d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128 q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161 q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5l418 363q10 8 23.5 7t21.5 -11z" />
+<glyph unicode="" horiz-adv-x="1408" d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704 q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167 q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+<glyph unicode="" d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5 t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53 q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 -39 12.5 -52t44.5 -13q28 1 57 5.5t73 24 t77 50t57 89.5t24 137q0 292 -174 466t-466 174q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51q228 0 405 144q11 9 24 8t21 -12l41 -49q8 -12 7 -24q-2 -13 -12 -22q-102 -83 -227.5 -128t-258.5 -45q-156 0 -298 61 t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q344 0 556 -212t212 -556z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10 t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5 t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11t55.5 -11t52.5 -38q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5t47 37.5 q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-35 0 -55.5 11t-52.5 38q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-31 -15t-44 -7q-35 0 -56.5 11t-51.5 38q-29 25 -47 38t-58 27 t-86 14q-45 0 -85 -14.5t-58 -27t-48 -37.5q-21 -19 -32.5 -27t-31 -15t-43.5 -7q-35 0 -56.5 11t-51.5 38q-28 24 -47 37.5t-59 27.5t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-30 -27 -51.5 -38t-56.5 -11v192q0 80 56 136t136 56h64v448h256v-448h256v448h256v-448h256v448 h256v-448h64q80 0 136 -56t56 -136zM512 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1024 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51 t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1536 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150z" />
+<glyph unicode="" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" />
+<glyph unicode="" horiz-adv-x="1792" d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9 t9 -23z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20 q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43.5 206t116 176.5t172 121.5t204.5 46q87 0 159 -19t123.5 -50 t95 -80t72.5 -99t58.5 -117t50.5 -124.5t50 -130.5t55 -127q96 -200 233 -200q81 0 138.5 48.5t57.5 128.5q0 42 -19 72t-50.5 46t-72.5 31.5t-84.5 27t-87.5 34t-81 52t-65 82t-39 122.5q-3 16 -3 33q0 110 87.5 192t198.5 78q78 -3 120.5 -14.5t90.5 -53.5h-1 q12 -11 23 -24.5t26 -36t19 -27.5l-129 -99q-26 49 -54 70v1q-23 21 -97 21q-49 0 -84 -33t-35 -83z" />
+<glyph unicode="" d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73 q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t133.5 -147.5t196 -56.5q186 0 279 110 q20 27 31 51l-60 109q-42 -80 -99 -116t-146 -36q-115 0 -191 87t-76 204q0 105 82 189t186 84q112 0 170 -53.5t104 -172.5q8 -21 25.5 -68.5t28.5 -76.5t31.5 -74.5t38.5 -74t45.5 -62.5t55.5 -53.5t66 -33t80 -13.5q107 0 183 69.5t76 174.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="2048" d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5 t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5 t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5z" />
+<glyph unicode="" horiz-adv-x="2048" d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5 t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" />
+<glyph unicode="" horiz-adv-x="2304" d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94 q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 97 39.5 183.5t109.5 149.5l-65 98l-353 -469 q-18 -26 -51 -26h-197q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q114 0 215 -55l137 183h-224q-26 0 -45 19t-19 45t19 45t45 19h384v-128h435l-85 128h-222q-26 0 -45 19t-19 45t19 45t45 19h256q33 0 53 -28l267 -400 q91 44 192 44q185 0 316.5 -131.5t131.5 -316.5z" />
+<glyph unicode="" d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5 h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5v128h-768v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128h-128v603q0 112 25 223l103 454q9 78 97.5 137t230 89t312.5 30t312.5 -30t230 -89t97.5 -137l105 -454q23 -102 23 -223z" />
+<glyph unicode="" horiz-adv-x="2048" d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327 q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 -319.5t-175.5 -263t-262.5 -176t-319.5 -65.5 q-246 0 -448.5 133t-301.5 350h-189q-36 0 -61 25t-25 61q0 35 25 60t61 25h132q-17 85 -17 170q0 167 65.5 319.5t175.5 263t262.5 176t320.5 65.5q245 0 447.5 -133t301.5 -350h188q36 0 61 -25t25 -61z" />
+<glyph unicode="" horiz-adv-x="1280" d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q18 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119 t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 152 427q0 43 -1 67t-11.5 62t-30.5 56q-56 49 -211.5 75.5 t-270.5 26.5q-37 0 -49 -11q-12 -5 -12 -35q0 -34 21.5 -60t55.5 -40t77.5 -23.5t87.5 -11.5t85 -4t70 0h23q24 0 40 -19q15 -19 19 -55q-28 -28 -96 -54q-61 -22 -93 -46q-64 -46 -108.5 -114t-44.5 -137q0 -31 18.5 -88.5t18.5 -87.5l-3 -12q-4 -12 -4 -14 q-137 10 -146 216q-8 -2 -41 -2q2 -7 2 -21q0 -53 -40.5 -89.5t-94.5 -36.5q-82 0 -166.5 78t-84.5 159q0 34 33 67q52 -64 60 -76q77 -104 133 -104q12 0 26.5 8.5t14.5 20.5q0 34 -87.5 145t-116.5 111q-43 0 -70 -44.5t-27 -90.5zM11 264q0 101 42.5 163t136.5 88 q-28 74 -28 104q0 62 61 123t122 61q29 0 70 -15q-163 462 -163 567q0 80 41 130.5t119 50.5q131 0 325 -581q6 -17 8 -23q6 16 29 79.5t43.5 118.5t54 127.5t64.5 123t70.5 86.5t76.5 36q71 0 112 -49t41 -122q0 -108 -159 -550q61 -15 100.5 -46t58.5 -78t26 -93.5 t7 -110.5q0 -150 -47 -280t-132 -225t-211 -150t-278 -55q-111 0 -223 42q-149 57 -258 191.5t-109 286.5z" />
+<glyph unicode="" horiz-adv-x="2048" d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206 q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65.5 -18q49 0 76.5 38t33.5 101zM1856 647q0 207 -15.5 307 t-60.5 161q-6 8 -13.5 14t-21.5 15t-16 11q-86 63 -697 63q-625 0 -710 -63q-5 -4 -17.5 -11.5t-21 -14t-14.5 -14.5q-45 -60 -60 -159.5t-15 -308.5q0 -208 15 -307.5t60 -160.5q6 -8 15 -15t20.5 -14t17.5 -12q44 -33 239.5 -49t470.5 -16q610 0 697 65q5 4 17 11t20.5 14 t13.5 16q46 60 61 159t15 309zM2048 1408v-1536h-2048v1536h2048z" />
+<glyph unicode="" d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5 t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
+<glyph unicode="" d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55 q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -86 -32.5t-33 -85.5v-410 q0 -21 22 -21h55q21 0 21 21v180q31 -42 94 -42h191q53 0 86 32.5t33 85.5zM1536 1176v-1072q0 -96 -68 -164t-164 -68h-1072q-96 0 -164 68t-68 164v1072q0 96 68 164t164 68h1072q96 0 164 -68t68 -164z" />
+<glyph unicode="" d="M915 450h-294l147 551zM1001 128h311l-324 1024h-440l-324 -1024h311l383 314zM1536 1120v-960q0 -118 -85 -203t-203 -85h-960q-118 0 -203 85t-85 203v960q0 118 85 203t203 85h960q118 0 203 -85t85 -203z" />
+<glyph unicode="" horiz-adv-x="2048" d="M2048 641q0 -21 -13 -36.5t-33 -19.5l-205 -356q3 -9 3 -18q0 -20 -12.5 -35.5t-32.5 -19.5l-193 -337q3 -8 3 -16q0 -23 -16.5 -40t-40.5 -17q-25 0 -41 18h-400q-17 -20 -43 -20t-43 20h-399q-17 -20 -43 -20q-23 0 -40 16.5t-17 40.5q0 8 4 20l-193 335 q-20 4 -32.5 19.5t-12.5 35.5q0 9 3 18l-206 356q-20 5 -32.5 20.5t-12.5 35.5q0 21 13.5 36.5t33.5 19.5l199 344q0 1 -0.5 3t-0.5 3q0 36 34 51l209 363q-4 10 -4 18q0 24 17 40.5t40 16.5q26 0 44 -21h396q16 21 43 21t43 -21h398q18 21 44 21q23 0 40 -16.5t17 -40.5 q0 -6 -4 -18l207 -358q23 -1 39 -17.5t16 -38.5q0 -13 -7 -27l187 -324q19 -4 31.5 -19.5t12.5 -35.5zM1063 -158h389l-342 354h-143l-342 -354h360q18 16 39 16t39 -16zM112 654q1 -4 1 -13q0 -10 -2 -15l208 -360q2 0 4.5 -1t5.5 -2.5l5 -2.5l188 199v347l-187 194 q-13 -8 -29 -10zM986 1438h-388l190 -200l554 200h-280q-16 -16 -38 -16t-38 16zM1689 226q1 6 5 11l-64 68l-17 -79h76zM1583 226l22 105l-252 266l-296 -307l63 -64h463zM1495 -142l16 28l65 310h-427l333 -343q8 4 13 5zM578 -158h5l342 354h-373v-335l4 -6q14 -5 22 -13 zM552 226h402l64 66l-309 321l-157 -166v-221zM359 226h163v189l-168 -177q4 -8 5 -12zM358 1051q0 -1 0.5 -2t0.5 -2q0 -16 -8 -29l171 -177v269zM552 1121v-311l153 -157l297 314l-223 236zM556 1425l-4 -8v-264l205 74l-191 201q-6 -2 -10 -3zM1447 1438h-16l-621 -224 l213 -225zM1023 946l-297 -315l311 -319l296 307zM688 634l-136 141v-284zM1038 270l-42 -44h85zM1374 618l238 -251l132 624l-3 5l-1 1zM1718 1018q-8 13 -8 29v2l-216 376q-5 1 -13 5l-437 -463l310 -327zM522 1142v223l-163 -282zM522 196h-163l163 -283v283zM1607 196 l-48 -227l130 227h-82zM1729 266l207 361q-2 10 -2 14q0 1 3 16l-171 296l-129 -612l77 -82q5 3 15 7z" />
+<glyph unicode="" d="M0 856q0 131 91.5 226.5t222.5 95.5h742l352 358v-1470q0 -132 -91.5 -227t-222.5 -95h-780q-131 0 -222.5 95t-91.5 227v790zM1232 102l-176 180v425q0 46 -32 79t-78 33h-484q-46 0 -78 -33t-32 -79v-492q0 -46 32.5 -79.5t77.5 -33.5h770z" />
+<glyph unicode="" d="M934 1386q-317 -121 -556 -362.5t-358 -560.5q-20 89 -20 176q0 208 102.5 384.5t278.5 279t384 102.5q82 0 169 -19zM1203 1267q93 -65 164 -155q-389 -113 -674.5 -400.5t-396.5 -676.5q-93 72 -155 162q112 386 395 671t667 399zM470 -67q115 356 379.5 622t619.5 384 q40 -92 54 -195q-292 -120 -516 -345t-343 -518q-103 14 -194 52zM1536 -125q-193 50 -367 115q-135 -84 -290 -107q109 205 274 370.5t369 275.5q-21 -152 -101 -284q65 -175 115 -370z" />
+<glyph unicode="" horiz-adv-x="2048" d="M1893 1144l155 -1272q-131 0 -257 57q-200 91 -393 91q-226 0 -374 -148q-148 148 -374 148q-193 0 -393 -91q-128 -57 -252 -57h-5l155 1272q224 127 482 127q233 0 387 -106q154 106 387 106q258 0 482 -127zM1398 157q129 0 232 -28.5t260 -93.5l-124 1021 q-171 78 -368 78q-224 0 -374 -141q-150 141 -374 141q-197 0 -368 -78l-124 -1021q105 43 165.5 65t148.5 39.5t178 17.5q202 0 374 -108q172 108 374 108zM1438 191l-55 907q-211 -4 -359 -155q-152 155 -374 155q-176 0 -336 -66l-114 -941q124 51 228.5 76t221.5 25 q209 0 374 -102q172 107 374 102z" />
+<glyph unicode="" horiz-adv-x="2048" d="M1500 165v733q0 21 -15 36t-35 15h-93q-20 0 -35 -15t-15 -36v-733q0 -20 15 -35t35 -15h93q20 0 35 15t15 35zM1216 165v531q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-531q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM924 165v429q0 20 -15 35t-35 15h-101 q-20 0 -35 -15t-15 -35v-429q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM632 165v362q0 20 -15 35t-35 15h-101q-20 0 -35 -15t-15 -35v-362q0 -20 15 -35t35 -15h101q20 0 35 15t15 35zM2048 311q0 -166 -118 -284t-284 -118h-1244q-166 0 -284 118t-118 284 q0 116 63 214.5t168 148.5q-10 34 -10 73q0 113 80.5 193.5t193.5 80.5q102 0 180 -67q45 183 194 300t338 117q149 0 275 -73.5t199.5 -199.5t73.5 -275q0 -66 -14 -122q135 -33 221 -142.5t86 -247.5z" />
+<glyph unicode="" d="M0 1536h1536v-1392l-776 -338l-760 338v1392zM1436 209v926h-1336v-926l661 -294zM1436 1235v201h-1336v-201h1336zM181 937v-115h-37v115h37zM181 789v-115h-37v115h37zM181 641v-115h-37v115h37zM181 493v-115h-37v115h37zM181 345v-115h-37v115h37zM207 202l15 34 l105 -47l-15 -33zM343 142l15 34l105 -46l-15 -34zM478 82l15 34l105 -46l-15 -34zM614 23l15 33l104 -46l-15 -34zM797 10l105 46l15 -33l-105 -47zM932 70l105 46l15 -34l-105 -46zM1068 130l105 46l15 -34l-105 -46zM1203 189l105 47l15 -34l-105 -46zM259 1389v-36h-114 v36h114zM421 1389v-36h-115v36h115zM583 1389v-36h-115v36h115zM744 1389v-36h-114v36h114zM906 1389v-36h-114v36h114zM1068 1389v-36h-115v36h115zM1230 1389v-36h-115v36h115zM1391 1389v-36h-114v36h114zM181 1049v-79h-37v115h115v-36h-78zM421 1085v-36h-115v36h115z M583 1085v-36h-115v36h115zM744 1085v-36h-114v36h114zM906 1085v-36h-114v36h114zM1068 1085v-36h-115v36h115zM1230 1085v-36h-115v36h115zM1355 970v79h-78v36h115v-115h-37zM1355 822v115h37v-115h-37zM1355 674v115h37v-115h-37zM1355 526v115h37v-115h-37zM1355 378 v115h37v-115h-37zM1355 230v115h37v-115h-37zM760 265q-129 0 -221 91.5t-92 221.5q0 129 92 221t221 92q130 0 221.5 -92t91.5 -221q0 -130 -91.5 -221.5t-221.5 -91.5zM595 646q0 -36 19.5 -56.5t49.5 -25t64 -7t64 -2t49.5 -9t19.5 -30.5q0 -49 -112 -49q-97 0 -123 51 h-3l-31 -63q67 -42 162 -42q29 0 56.5 5t55.5 16t45.5 33t17.5 53q0 46 -27.5 69.5t-67.5 27t-79.5 3t-67 5t-27.5 25.5q0 21 20.5 33t40.5 15t41 3q34 0 70.5 -11t51.5 -34h3l30 58q-3 1 -21 8.5t-22.5 9t-19.5 7t-22 7t-20 4.5t-24 4t-23 1q-29 0 -56.5 -5t-54 -16.5 t-43 -34t-16.5 -53.5z" />
+<glyph unicode="" horiz-adv-x="2048" d="M863 504q0 112 -79.5 191.5t-191.5 79.5t-191 -79.5t-79 -191.5t79 -191t191 -79t191.5 79t79.5 191zM1726 505q0 112 -79 191t-191 79t-191.5 -79t-79.5 -191q0 -113 79.5 -192t191.5 -79t191 79.5t79 191.5zM2048 1314v-1348q0 -44 -31.5 -75.5t-76.5 -31.5h-1832 q-45 0 -76.5 31.5t-31.5 75.5v1348q0 44 31.5 75.5t76.5 31.5h431q44 0 76 -31.5t32 -75.5v-161h754v161q0 44 32 75.5t76 31.5h431q45 0 76.5 -31.5t31.5 -75.5z" />
+<glyph unicode="" horiz-adv-x="2048" d="M1430 953zM1690 749q148 0 253 -98.5t105 -244.5q0 -157 -109 -261.5t-267 -104.5q-85 0 -162 27.5t-138 73.5t-118 106t-109 126.5t-103.5 132.5t-108.5 126t-117 106t-136 73.5t-159 27.5q-154 0 -251.5 -91.5t-97.5 -244.5q0 -157 104 -250t263 -93q100 0 208 37.5 t193 98.5q5 4 21 18.5t30 24t22 9.5q14 0 24.5 -10.5t10.5 -24.5q0 -24 -60 -77q-101 -88 -234.5 -142t-260.5 -54q-133 0 -245.5 58t-180 165t-67.5 241q0 205 141.5 341t347.5 136q120 0 226.5 -43.5t185.5 -113t151.5 -153t139 -167.5t133.5 -153.5t149.5 -113 t172.5 -43.5q102 0 168.5 61.5t66.5 162.5q0 95 -64.5 159t-159.5 64q-30 0 -81.5 -18.5t-68.5 -18.5q-20 0 -35.5 15t-15.5 35q0 18 8.5 57t8.5 59q0 159 -107.5 263t-266.5 104q-58 0 -111.5 -18.5t-84 -40.5t-55.5 -40.5t-33 -18.5q-15 0 -25.5 10.5t-10.5 25.5 q0 19 25 46q59 67 147 103.5t182 36.5q191 0 318 -125.5t127 -315.5q0 -37 -4 -66q57 15 115 15z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1216 832q0 26 -19 45t-45 19h-128v128q0 26 -19 45t-45 19t-45 -19t-19 -45v-128h-128q-26 0 -45 -19t-19 -45t19 -45t45 -19h128v-128q0 -26 19 -45t45 -19t45 19t19 45v128h128q26 0 45 19t19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="1664" d="M1280 832q0 26 -19 45t-45 19t-45 -19l-147 -146v293q0 26 -19 45t-45 19t-45 -19t-19 -45v-293l-147 146q-19 19 -45 19t-45 -19t-19 -45t19 -45l256 -256q19 -19 45 -19t45 19l256 256q19 19 19 45zM640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920 q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="" horiz-adv-x="2048" d="M212 768l623 -665l-300 665h-323zM1024 -4l349 772h-698zM538 896l204 384h-262l-288 -384h346zM1213 103l623 665h-323zM683 896h682l-204 384h-274zM1510 896h346l-288 384h-262zM1651 1382l384 -512q14 -18 13 -41.5t-17 -40.5l-960 -1024q-18 -20 -47 -20t-47 20 l-960 1024q-16 17 -17 40.5t13 41.5l384 512q18 26 51 26h1152q33 0 51 -26z" />
+<glyph unicode="" horiz-adv-x="2048" d="M1811 -19q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83q19 19 45 19t45 -19l83 -83l83 83 q19 19 45 19t45 -19l83 -83zM237 19q-19 -19 -45 -19t-45 19l-128 128l90 90l83 -82l83 82q19 19 45 19t45 -19l83 -82l64 64v293l-210 314q-17 26 -7 56.5t40 40.5l177 58v299h128v128h256v128h256v-128h256v-128h128v-299l177 -58q30 -10 40 -40.5t-7 -56.5l-210 -314 v-293l19 18q19 19 45 19t45 -19l83 -82l83 82q19 19 45 19t45 -19l128 -128l-90 -90l-83 83l-83 -83q-18 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83l-83 -83 q-19 -19 -45 -19t-45 19l-83 83l-83 -83q-19 -19 -45 -19t-45 19l-83 83zM640 1152v-128l384 128l384 -128v128h-128v128h-512v-128h-128z" />
+<glyph unicode="" d="M576 0l96 448l-96 128l-128 64zM832 0l128 640l-128 -64l-96 -128zM992 1010q-2 4 -4 6q-10 8 -96 8q-70 0 -167 -19q-7 -2 -21 -2t-21 2q-97 19 -167 19q-86 0 -96 -8q-2 -2 -4 -6q2 -18 4 -27q2 -3 7.5 -6.5t7.5 -10.5q2 -4 7.5 -20.5t7 -20.5t7.5 -17t8.5 -17t9 -14 t12 -13.5t14 -9.5t17.5 -8t20.5 -4t24.5 -2q36 0 59 12.5t32.5 30t14.5 34.5t11.5 29.5t17.5 12.5h12q11 0 17.5 -12.5t11.5 -29.5t14.5 -34.5t32.5 -30t59 -12.5q13 0 24.5 2t20.5 4t17.5 8t14 9.5t12 13.5t9 14t8.5 17t7.5 17t7 20.5t7.5 20.5q2 7 7.5 10.5t7.5 6.5 q2 9 4 27zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 61 4.5 118t19 125.5t37.5 123.5t63.5 103.5t93.5 74.5l-90 220h214q-22 64 -22 128q0 12 2 32q-194 40 -194 96q0 57 210 99q17 62 51.5 134t70.5 114q32 37 76 37q30 0 84 -31t84 -31t84 31 t84 31q44 0 76 -37q36 -42 70.5 -114t51.5 -134q210 -42 210 -99q0 -56 -194 -96q7 -81 -20 -160h214l-82 -225q63 -33 107.5 -96.5t65.5 -143.5t29 -151.5t8 -148.5z" />
+<glyph unicode="" horiz-adv-x="2304" d="M2301 500q12 -103 -22 -198.5t-99 -163.5t-158.5 -106t-196.5 -31q-161 11 -279.5 125t-134.5 274q-12 111 27.5 210.5t118.5 170.5l-71 107q-96 -80 -151 -194t-55 -244q0 -27 -18.5 -46.5t-45.5 -19.5h-256h-69q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5 t-131.5 316.5t131.5 316.5t316.5 131.5q76 0 152 -27l24 45q-123 110 -304 110h-64q-26 0 -45 19t-19 45t19 45t45 19h128q78 0 145 -13.5t116.5 -38.5t71.5 -39.5t51 -36.5h512h115l-85 128h-222q-30 0 -49 22.5t-14 52.5q4 23 23 38t43 15h253q33 0 53 -28l70 -105 l114 114q19 19 46 19h101q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-179l115 -172q131 63 275 36q143 -26 244 -134.5t118 -253.5zM448 128q115 0 203 72.5t111 183.5h-314q-35 0 -55 31q-18 32 -1 63l147 277q-47 13 -91 13q-132 0 -226 -94t-94 -226t94 -226 t226 -94zM1856 128q132 0 226 94t94 226t-94 226t-226 94q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94z" />
+<glyph unicode="" d="M1408 0q0 -63 -61.5 -113.5t-164 -81t-225 -46t-253.5 -15.5t-253.5 15.5t-225 46t-164 81t-61.5 113.5q0 49 33 88.5t91 66.5t118 44.5t131 29.5q26 5 48 -10.5t26 -41.5q5 -26 -10.5 -48t-41.5 -26q-58 -10 -106 -23.5t-76.5 -25.5t-48.5 -23.5t-27.5 -19.5t-8.5 -12 q3 -11 27 -26.5t73 -33t114 -32.5t160.5 -25t201.5 -10t201.5 10t160.5 25t114 33t73 33.5t27 27.5q-1 4 -8.5 11t-27.5 19t-48.5 23.5t-76.5 25t-106 23.5q-26 4 -41.5 26t-10.5 48q4 26 26 41.5t48 10.5q71 -12 131 -29.5t118 -44.5t91 -66.5t33 -88.5zM1024 896v-384 q0 -26 -19 -45t-45 -19h-64v-384q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v384h-64q-26 0 -45 19t-19 45v384q0 53 37.5 90.5t90.5 37.5h384q53 0 90.5 -37.5t37.5 -90.5zM928 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5 t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1280 512h305q-5 -6 -10 -10.5t-9 -7.5l-3 -4l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-5 2 -21 20h369q22 0 39.5 13.5t22.5 34.5l70 281l190 -667q6 -20 23 -33t39 -13q21 0 38 13t23 33l146 485l56 -112q18 -35 57 -35zM1792 940q0 -145 -103 -300h-369l-111 221 q-8 17 -25.5 27t-36.5 8q-45 -5 -56 -46l-129 -430l-196 686q-6 20 -23.5 33t-39.5 13t-39 -13.5t-22 -34.5l-116 -464h-423q-103 155 -103 300q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124 t127 -344z" />
+<glyph unicode="" horiz-adv-x="1280" d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292 q11 134 80.5 249t182 188t245.5 88q170 19 319 -54t236 -212t87 -306zM128 960q0 -185 131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5z" />
+<glyph unicode="" d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-382 -383q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5 q203 0 359 -126l382 382h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="" horiz-adv-x="1280" d="M830 1220q145 -72 233.5 -210.5t88.5 -305.5q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5 t-147.5 384.5q0 167 88.5 305.5t233.5 210.5q-165 96 -228 273q-6 16 3.5 29.5t26.5 13.5h69q21 0 29 -20q44 -106 140 -171t214 -65t214 65t140 171q8 20 37 20h61q17 0 26.5 -13.5t3.5 -29.5q-63 -177 -228 -273zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="" d="M1024 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-149 16 -270.5 103t-186.5 223.5t-53 291.5q16 204 160 353.5t347 172.5q118 14 228 -19t198 -103l255 254h-134q-14 0 -23 9t-9 23v64zM576 256q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1280 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q126 -158 126 -359q0 -221 -147.5 -384.5t-364.5 -187.5v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64 q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-217 24 -364.5 187.5t-147.5 384.5q0 201 126 359l-52 53l-101 -111q-9 -10 -22 -10.5t-23 7.5l-48 44q-10 8 -10.5 21.5t8.5 23.5l105 115l-111 112v-134q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9 t-9 23v288q0 26 19 45t45 19h288q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-133l106 -107l86 94q9 10 22 10.5t23 -7.5l48 -44q10 -8 10.5 -21.5t-8.5 -23.5l-90 -99l57 -56q158 126 359 126t359 -126l255 254h-134q-14 0 -23 9t-9 23v64zM832 256q185 0 316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1790 1007q12 -155 -52.5 -292t-186 -224t-271.5 -103v-260h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-512v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23 t23 9h224v260q-150 16 -271.5 103t-186 224t-52.5 292q17 206 164.5 356.5t352.5 169.5q206 21 377 -94q171 115 377 94q205 -19 352.5 -169.5t164.5 -356.5zM896 647q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM576 512q115 0 218 57q-154 165 -154 391 q0 224 154 391q-103 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5zM1152 128v260q-137 15 -256 94q-119 -79 -256 -94v-260h512zM1216 512q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5q-115 0 -218 -57q154 -167 154 -391 q0 -226 -154 -391q103 -57 218 -57z" />
+<glyph unicode="" horiz-adv-x="1920" d="M1536 1120q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-31 -182 -166 -312t-318 -156q-210 -29 -384.5 80t-241.5 300q-117 6 -221 57.5t-177.5 133t-113.5 192.5t-32 230 q9 135 78 252t182 191.5t248 89.5q118 14 227.5 -19t198.5 -103l255 254h-134q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q59 -74 93 -169q182 -9 328 -124l255 254h-134q-14 0 -23 9 t-9 23v64zM1024 704q0 20 -4 58q-162 -25 -271 -150t-109 -292q0 -20 4 -58q162 25 271 150t109 292zM128 704q0 -168 111 -294t276 -149q-3 29 -3 59q0 210 135 369.5t338 196.5q-53 120 -163.5 193t-245.5 73q-185 0 -316.5 -131.5t-131.5 -316.5zM1088 -128 q185 0 316.5 131.5t131.5 316.5q0 168 -111 294t-276 149q3 -29 3 -59q0 -210 -135 -369.5t-338 -196.5q53 -120 163.5 -193t245.5 -73z" />
+<glyph unicode="" horiz-adv-x="2048" d="M1664 1504q0 14 9 23t23 9h288q26 0 45 -19t19 -45v-288q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v134l-254 -255q76 -95 107.5 -214t9.5 -247q-32 -180 -164.5 -310t-313.5 -157q-223 -34 -409 90q-117 -78 -256 -93v-132h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23 t-23 -9h-96v-96q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v96h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96v132q-155 17 -279.5 109.5t-187 237.5t-39.5 307q25 187 159.5 322.5t320.5 164.5q224 34 410 -90q146 97 320 97q201 0 359 -126l255 254h-134q-14 0 -23 9 t-9 23v64zM896 391q128 131 128 313t-128 313q-128 -131 -128 -313t128 -313zM128 704q0 -185 131.5 -316.5t316.5 -131.5q117 0 218 57q-154 167 -154 391t154 391q-101 57 -218 57q-185 0 -316.5 -131.5t-131.5 -316.5zM1216 256q185 0 316.5 131.5t131.5 316.5 t-131.5 316.5t-316.5 131.5q-117 0 -218 -57q154 -167 154 -391t-154 -391q101 -57 218 -57z" />
+<glyph unicode="" d="M1472 1408q26 0 45 -19t19 -45v-416q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v262l-213 -214l140 -140q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-140 141l-78 -79q126 -156 126 -359q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5 t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123t223.5 45.5q203 0 359 -126l78 78l-172 172q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l172 -172l213 213h-261q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h416zM576 0q185 0 316.5 131.5t131.5 316.5t-131.5 316.5 t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="" horiz-adv-x="1280" d="M640 892q217 -24 364.5 -187.5t147.5 -384.5q0 -167 -87 -306t-236 -212t-319 -54q-133 15 -245.5 88t-182 188t-80.5 249q-12 155 52.5 292t186 224t271.5 103v132h-160q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h160v165l-92 -92q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22 t9 23l202 201q19 19 45 19t45 -19l202 -201q9 -10 9 -23t-9 -22l-46 -46q-9 -9 -22 -9t-23 9l-92 92v-165h160q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-160v-132zM576 -128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5 t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="" horiz-adv-x="2048" d="M1901 621q19 -19 19 -45t-19 -45l-294 -294q-9 -10 -22.5 -10t-22.5 10l-45 45q-10 9 -10 22.5t10 22.5l185 185h-294v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-132q-24 -217 -187.5 -364.5t-384.5 -147.5q-167 0 -306 87t-212 236t-54 319q15 133 88 245.5 t188 182t249 80.5q155 12 292 -52.5t224 -186t103 -271.5h132v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h294l-185 185q-10 9 -10 22.5t10 22.5l45 45q9 10 22.5 10t22.5 -10zM576 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5 t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="" horiz-adv-x="1280" d="M1152 960q0 -221 -147.5 -384.5t-364.5 -187.5v-612q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v612q-217 24 -364.5 187.5t-147.5 384.5q0 117 45.5 223.5t123 184t184 123t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5zM576 512q185 0 316.5 131.5 t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="" horiz-adv-x="1280" d="M1024 576q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1152 576q0 -117 -45.5 -223.5t-123 -184t-184 -123t-223.5 -45.5t-223.5 45.5t-184 123t-123 184t-45.5 223.5t45.5 223.5t123 184t184 123 t223.5 45.5t223.5 -45.5t184 -123t123 -184t45.5 -223.5z" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" d="M1451 1408q35 0 60 -25t25 -60v-1366q0 -35 -25 -60t-60 -25h-391v595h199l30 232h-229v148q0 56 23.5 84t91.5 28l122 1v207q-63 9 -178 9q-136 0 -217.5 -80t-81.5 -226v-171h-200v-232h200v-595h-735q-35 0 -60 25t-25 60v1366q0 35 25 60t60 25h1366z" />
+<glyph unicode="" horiz-adv-x="1280" d="M0 939q0 108 37.5 203.5t103.5 166.5t152 123t185 78t202 26q158 0 294 -66.5t221 -193.5t85 -287q0 -96 -19 -188t-60 -177t-100 -149.5t-145 -103t-189 -38.5q-68 0 -135 32t-96 88q-10 -39 -28 -112.5t-23.5 -95t-20.5 -71t-26 -71t-32 -62.5t-46 -77.5t-62 -86.5 l-14 -5l-9 10q-15 157 -15 188q0 92 21.5 206.5t66.5 287.5t52 203q-32 65 -32 169q0 83 52 156t132 73q61 0 95 -40.5t34 -102.5q0 -66 -44 -191t-44 -187q0 -63 45 -104.5t109 -41.5q55 0 102 25t78.5 68t56 95t38 110.5t20 111t6.5 99.5q0 173 -109.5 269.5t-285.5 96.5 q-200 0 -334 -129.5t-134 -328.5q0 -44 12.5 -85t27 -65t27 -45.5t12.5 -30.5q0 -28 -15 -73t-37 -45q-2 0 -17 3q-51 15 -90.5 56t-61 94.5t-32.5 108t-11 106.5z" />
+<glyph unicode="" d="M985 562q13 0 97.5 -44t89.5 -53q2 -5 2 -15q0 -33 -17 -76q-16 -39 -71 -65.5t-102 -26.5q-57 0 -190 62q-98 45 -170 118t-148 185q-72 107 -71 194v8q3 91 74 158q24 22 52 22q6 0 18 -1.5t19 -1.5q19 0 26.5 -6.5t15.5 -27.5q8 -20 33 -88t25 -75q0 -21 -34.5 -57.5 t-34.5 -46.5q0 -7 5 -15q34 -73 102 -137q56 -53 151 -101q12 -7 22 -7q15 0 54 48.5t52 48.5zM782 32q127 0 243.5 50t200.5 134t134 200.5t50 243.5t-50 243.5t-134 200.5t-200.5 134t-243.5 50t-243.5 -50t-200.5 -134t-134 -200.5t-50 -243.5q0 -203 120 -368l-79 -233 l242 77q158 -104 345 -104zM782 1414q153 0 292.5 -60t240.5 -161t161 -240.5t60 -292.5t-60 -292.5t-161 -240.5t-240.5 -161t-292.5 -60q-195 0 -365 94l-417 -134l136 405q-108 178 -108 389q0 153 60 292.5t161 240.5t240.5 161t292.5 60z" />
+<glyph unicode="" horiz-adv-x="1792" d="M128 128h1024v128h-1024v-128zM128 640h1024v128h-1024v-128zM1696 192q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM128 1152h1024v128h-1024v-128zM1696 704q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1696 1216 q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1792 384v-384h-1792v384h1792zM1792 896v-384h-1792v384h1792zM1792 1408v-384h-1792v384h1792z" />
+<glyph unicode="" horiz-adv-x="2048" d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1664 512h352q13 0 22.5 -9.5t9.5 -22.5v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-352q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5 t-9.5 22.5v352h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v352q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5v-352zM928 288q0 -52 38 -90t90 -38h256v-238q-68 -50 -171 -50h-874q-121 0 -194 69t-73 190q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q79 -61 154.5 -91.5t164.5 -30.5t164.5 30.5t154.5 91.5q20 17 39 17q132 0 217 -96h-223q-52 0 -90 -38t-38 -90v-192z" />
+<glyph unicode="" horiz-adv-x="2048" d="M704 640q-159 0 -271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5t-112.5 -271.5t-271.5 -112.5zM1781 320l249 -249q9 -9 9 -23q0 -13 -9 -22l-136 -136q-9 -9 -22 -9q-14 0 -23 9l-249 249l-249 -249q-9 -9 -23 -9q-13 0 -22 9l-136 136 q-9 9 -9 22q0 14 9 23l249 249l-249 249q-9 9 -9 23q0 13 9 22l136 136q9 9 22 9q14 0 23 -9l249 -249l249 249q9 9 23 9q13 0 22 -9l136 -136q9 -9 9 -22q0 -14 -9 -23zM1283 320l-181 -181q-37 -37 -37 -91q0 -53 37 -90l83 -83q-21 -3 -44 -3h-874q-121 0 -194 69 t-73 190q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q19 0 39 -17q154 -122 319 -122t319 122q20 17 39 17q28 0 57 -6q-28 -27 -41 -50t-13 -56q0 -54 37 -91z" />
+<glyph unicode="" horiz-adv-x="2048" d="M256 512h1728q26 0 45 -19t19 -45v-448h-256v256h-1536v-256h-256v1216q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-704zM832 832q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM2048 576v64q0 159 -112.5 271.5t-271.5 112.5h-704 q-26 0 -45 -19t-19 -45v-384h1152z" />
+<glyph unicode="" d="M1536 1536l-192 -448h192v-192h-274l-55 -128h329v-192h-411l-357 -832l-357 832h-411v192h329l-55 128h-274v192h192l-192 448h256l323 -768h378l323 768h256zM768 320l108 256h-216z" />
+<glyph unicode="" d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM768 192q80 0 136 56t56 136t-56 136t-136 56 t-136 -56t-56 -136t56 -136t136 -56zM1344 768v512h-1152v-512h1152z" />
+<glyph unicode="" d="M1088 1536q185 0 316.5 -93.5t131.5 -226.5v-896q0 -130 -125.5 -222t-305.5 -97l213 -202q16 -15 8 -35t-30 -20h-1056q-22 0 -30 20t8 35l213 202q-180 5 -305.5 97t-125.5 222v896q0 133 131.5 226.5t316.5 93.5h640zM288 224q66 0 113 47t47 113t-47 113t-113 47 t-113 -47t-47 -113t47 -113t113 -47zM704 768v512h-544v-512h544zM1248 224q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM1408 768v512h-576v-512h576z" />
+<glyph unicode="" horiz-adv-x="1792" d="M597 1115v-1173q0 -25 -12.5 -42.5t-36.5 -17.5q-17 0 -33 8l-465 233q-21 10 -35.5 33.5t-14.5 46.5v1140q0 20 10 34t29 14q14 0 44 -15l511 -256q3 -3 3 -5zM661 1014l534 -866l-534 266v600zM1792 996v-1054q0 -25 -14 -40.5t-38 -15.5t-47 13l-441 220zM1789 1116 q0 -3 -256.5 -419.5t-300.5 -487.5l-390 634l324 527q17 28 52 28q14 0 26 -6l541 -270q4 -2 4 -6z" />
+<glyph unicode="" d="M809 532l266 499h-112l-157 -312q-24 -48 -44 -92l-42 92l-155 312h-120l263 -493v-324h101v318zM1536 1408v-1536h-1536v1536h1536z" />
+<glyph unicode="" horiz-adv-x="2296" d="M478 -139q-8 -16 -27 -34.5t-37 -25.5q-25 -9 -51.5 3.5t-28.5 31.5q-1 22 40 55t68 38q23 4 34 -21.5t2 -46.5zM1819 -139q7 -16 26 -34.5t38 -25.5q25 -9 51.5 3.5t27.5 31.5q2 22 -39.5 55t-68.5 38q-22 4 -33 -21.5t-2 -46.5zM1867 -30q13 -27 56.5 -59.5t77.5 -41.5 q45 -13 82 4.5t37 50.5q0 46 -67.5 100.5t-115.5 59.5q-40 5 -63.5 -37.5t-6.5 -76.5zM428 -30q-13 -27 -56 -59.5t-77 -41.5q-45 -13 -82 4.5t-37 50.5q0 46 67.5 100.5t115.5 59.5q40 5 63 -37.5t6 -76.5zM1158 1094h1q-41 0 -76 -15q27 -8 44 -30.5t17 -49.5 q0 -35 -27 -60t-65 -25q-52 0 -80 43q-5 -23 -5 -42q0 -74 56 -126.5t135 -52.5q80 0 136 52.5t56 126.5t-56 126.5t-136 52.5zM1462 1312q-99 109 -220.5 131.5t-245.5 -44.5q27 60 82.5 96.5t118 39.5t121.5 -17t99.5 -74.5t44.5 -131.5zM2212 73q8 -11 -11 -42 q7 -23 7 -40q1 -56 -44.5 -112.5t-109.5 -91.5t-118 -37q-48 -2 -92 21.5t-66 65.5q-687 -25 -1259 0q-23 -41 -66.5 -65t-92.5 -22q-86 3 -179.5 80.5t-92.5 160.5q2 22 7 40q-19 31 -11 42q6 10 31 1q14 22 41 51q-7 29 2 38q11 10 39 -4q29 20 59 34q0 29 13 37 q23 12 51 -16q35 5 61 -2q18 -4 38 -19v73q-11 0 -18 2q-53 10 -97 44.5t-55 87.5q-9 38 0 81q15 62 93 95q2 17 19 35.5t36 23.5t33 -7.5t19 -30.5h13q46 -5 60 -23q3 -3 5 -7q10 1 30.5 3.5t30.5 3.5q-15 11 -30 17q-23 40 -91 43q0 6 1 10q-62 2 -118.5 18.5t-84.5 47.5 q-32 36 -42.5 92t-2.5 112q16 126 90 179q23 16 52 4.5t32 -40.5q0 -1 1.5 -14t2.5 -21t3 -20t5.5 -19t8.5 -10q27 -14 76 -12q48 46 98 74q-40 4 -162 -14l47 46q61 58 163 111q145 73 282 86q-20 8 -41 15.5t-47 14t-42.5 10.5t-47.5 11t-43 10q595 126 904 -139 q98 -84 158 -222q85 -10 121 9h1q5 3 8.5 10t5.5 19t3 19.5t3 21.5l1 14q3 28 32 40t52 -5q73 -52 91 -178q7 -57 -3.5 -113t-42.5 -91q-28 -32 -83.5 -48.5t-115.5 -18.5v-10q-71 -2 -95 -43q-14 -5 -31 -17q11 -1 32 -3.5t30 -3.5q1 4 5 8q16 18 60 23h13q5 18 19 30t33 8 t36 -23t19 -36q79 -32 93 -95q9 -40 1 -81q-12 -53 -56 -88t-97 -44q-10 -2 -17 -2q0 -49 -1 -73q20 15 38 19q26 7 61 2q28 28 51 16q14 -9 14 -37q33 -16 59 -34q27 13 38 4q10 -10 2 -38q28 -30 41 -51q23 8 31 -1zM1937 1025q0 -29 -9 -54q82 -32 112 -132 q4 37 -9.5 98.5t-41.5 90.5q-20 19 -36 17t-16 -20zM1859 925q35 -42 47.5 -108.5t-0.5 -124.5q67 13 97 45q13 14 18 28q-3 64 -31 114.5t-79 66.5q-15 -15 -52 -21zM1822 921q-30 0 -44 1q42 -115 53 -239q21 0 43 3q16 68 1 135t-53 100zM258 839q30 100 112 132 q-9 25 -9 54q0 18 -16.5 20t-35.5 -17q-28 -29 -41.5 -90.5t-9.5 -98.5zM294 737q29 -31 97 -45q-13 58 -0.5 124.5t47.5 108.5v0q-37 6 -52 21q-51 -16 -78.5 -66t-31.5 -115q9 -17 18 -28zM471 683q14 124 73 235q-19 -4 -55 -18l-45 -19v1q-46 -89 -20 -196q25 -3 47 -3z M1434 644q8 -38 16.5 -108.5t11.5 -89.5q3 -18 9.5 -21.5t23.5 4.5q40 20 62 85.5t23 125.5q-24 2 -146 4zM1152 1285q-116 0 -199 -82.5t-83 -198.5q0 -117 83 -199.5t199 -82.5t199 82.5t83 199.5q0 116 -83 198.5t-199 82.5zM1380 646q-106 2 -211 0v1q-1 -27 2.5 -86 t13.5 -66q29 -14 93.5 -14.5t95.5 10.5q9 3 11 39t-0.5 69.5t-4.5 46.5zM1112 447q8 4 9.5 48t-0.5 88t-4 63v1q-212 -3 -214 -3q-4 -20 -7 -62t0 -83t14 -46q34 -15 101 -16t101 10zM718 636q-16 -59 4.5 -118.5t77.5 -84.5q15 -8 24 -5t12 21q3 16 8 90t10 103 q-69 -2 -136 -6zM591 510q3 -23 -34 -36q132 -141 271.5 -240t305.5 -154q172 49 310.5 146t293.5 250q-33 13 -30 34l3 9v1v-1q-17 2 -50 5.5t-48 4.5q-26 -90 -82 -132q-51 -38 -82 1q-5 6 -9 14q-7 13 -17 62q-2 -5 -5 -9t-7.5 -7t-8 -5.5t-9.5 -4l-10 -2.5t-12 -2 l-12 -1.5t-13.5 -1t-13.5 -0.5q-106 -9 -163 11q-4 -17 -10 -26.5t-21 -15t-23 -7t-36 -3.5q-2 0 -3 -0.5t-3 -0.5h-3q-179 -17 -203 40q-2 -63 -56 -54q-47 8 -91 54q-12 13 -20 26q-17 29 -26 65q-58 -6 -87 -10q1 -2 4 -10zM507 -118q3 14 3 30q-17 71 -51 130t-73 70 q-41 12 -101.5 -14.5t-104.5 -80t-39 -107.5q35 -53 100 -93t119 -42q51 -2 94 28t53 79zM510 53q23 -63 27 -119q195 113 392 174q-98 52 -180.5 120t-179.5 165q-6 -4 -29 -13q0 -2 -1 -5t-1 -4q31 -18 22 -37q-12 -23 -56 -34q-10 -13 -29 -24h-1q-2 -83 1 -150 q19 -34 35 -73zM579 -113q532 -21 1145 0q-254 147 -428 196q-76 -35 -156 -57q-8 -3 -16 0q-65 21 -129 49q-208 -60 -416 -188h-1v-1q1 0 1 1zM1763 -67q4 54 28 120q14 38 33 71l-1 -1q3 77 3 153q-15 8 -30 25q-42 9 -56 33q-9 20 22 38q-2 4 -2 9q-16 4 -28 12 q-204 -190 -383 -284q198 -59 414 -176zM2155 -90q5 54 -39 107.5t-104 80t-102 14.5q-38 -11 -72.5 -70.5t-51.5 -129.5q0 -16 3 -30q10 -49 53 -79t94 -28q54 2 119 42t100 93z" />
+<glyph unicode="" horiz-adv-x="2304" d="M1524 -25q0 -68 -48 -116t-116 -48t-116.5 48t-48.5 116t48.5 116.5t116.5 48.5t116 -48.5t48 -116.5zM775 -25q0 -68 -48.5 -116t-116.5 -48t-116 48t-48 116t48 116.5t116 48.5t116.5 -48.5t48.5 -116.5zM0 1469q57 -60 110.5 -104.5t121 -82t136 -63t166 -45.5 t200 -31.5t250 -18.5t304 -9.5t372.5 -2.5q139 0 244.5 -5t181 -16.5t124 -27.5t71 -39.5t24 -51.5t-19.5 -64t-56.5 -76.5t-89.5 -91t-116 -104.5t-139 -119q-185 -157 -286 -247q29 51 76.5 109t94 105.5t94.5 98.5t83 91.5t54 80.5t13 70t-45.5 55.5t-116.5 41t-204 23.5 t-304 5q-168 -2 -314 6t-256 23t-204.5 41t-159.5 51.5t-122.5 62.5t-91.5 66.5t-68 71.5t-50.5 69.5t-40 68t-36.5 59.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M896 1472q-169 0 -323 -66t-265.5 -177.5t-177.5 -265.5t-66 -323t66 -323t177.5 -265.5t265.5 -177.5t323 -66t323 66t265.5 177.5t177.5 265.5t66 323t-66 323t-177.5 265.5t-265.5 177.5t-323 66zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348 t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM496 704q16 0 16 -16v-480q0 -16 -16 -16h-32q-16 0 -16 16v480q0 16 16 16h32zM896 640q53 0 90.5 -37.5t37.5 -90.5q0 -35 -17.5 -64t-46.5 -46v-114q0 -14 -9 -23 t-23 -9h-64q-14 0 -23 9t-9 23v114q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5zM896 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM544 928v-96 q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 93 65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5v-96q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v96q0 146 -103 249t-249 103t-249 -103t-103 -249zM1408 192v512q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-512 q0 -26 19 -45t45 -19h896q26 0 45 19t19 45z" />
+<glyph unicode="" horiz-adv-x="2304" d="M1920 1024v-768h-1664v768h1664zM2048 448h128v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288zM2304 832v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113 v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="" horiz-adv-x="2304" d="M256 256v768h1280v-768h-1280zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+<glyph unicode="" horiz-adv-x="2304" d="M256 256v768h896v-768h-896zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+<glyph unicode="" horiz-adv-x="2304" d="M256 256v768h512v-768h-512zM2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9 h-1856q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+<glyph unicode="" horiz-adv-x="2304" d="M2176 960q53 0 90.5 -37.5t37.5 -90.5v-384q0 -53 -37.5 -90.5t-90.5 -37.5v-160q0 -66 -47 -113t-113 -47h-1856q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1856q66 0 113 -47t47 -113v-160zM2176 448v384h-128v288q0 14 -9 23t-23 9h-1856q-14 0 -23 -9t-9 -23 v-960q0 -14 9 -23t23 -9h1856q14 0 23 9t9 23v288h128z" />
+<glyph unicode="" horiz-adv-x="1280" d="M1133 493q31 -30 14 -69q-17 -40 -59 -40h-382l201 -476q10 -25 0 -49t-34 -35l-177 -75q-25 -10 -49 0t-35 34l-191 452l-312 -312q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v1504q0 42 40 59q12 5 24 5q27 0 45 -19z" />
+<glyph unicode="" horiz-adv-x="1024" d="M832 1408q-320 0 -320 -224v-416h128v-128h-128v-544q0 -224 320 -224h64v-128h-64q-272 0 -384 146q-112 -146 -384 -146h-64v128h64q320 0 320 224v544h-128v128h128v416q0 224 -320 224h-64v128h64q272 0 384 -146q112 146 384 146h64v-128h-64z" />
+<glyph unicode="" horiz-adv-x="2048" d="M2048 1152h-128v-1024h128v-384h-384v128h-1280v-128h-384v384h128v1024h-128v384h384v-128h1280v128h384v-384zM1792 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 -128v128h-128v-128h128zM1664 0v128h128v1024h-128v128h-1280v-128h-128v-1024h128v-128 h1280zM1920 -128v128h-128v-128h128zM1280 896h384v-768h-896v256h-384v768h896v-256zM512 512h640v512h-640v-512zM1536 256v512h-256v-384h-384v-128h640z" />
+<glyph unicode="" horiz-adv-x="2304" d="M2304 768h-128v-640h128v-384h-384v128h-896v-128h-384v384h128v128h-384v-128h-384v384h128v640h-128v384h384v-128h896v128h384v-384h-128v-128h384v128h384v-384zM2048 1024v-128h128v128h-128zM1408 1408v-128h128v128h-128zM128 1408v-128h128v128h-128zM256 256 v128h-128v-128h128zM1536 384h-128v-128h128v128zM384 384h896v128h128v640h-128v128h-896v-128h-128v-640h128v-128zM896 -128v128h-128v-128h128zM2176 -128v128h-128v-128h128zM2048 128v640h-128v128h-384v-384h128v-384h-384v128h-384v-128h128v-128h896v128h128z" />
+<glyph unicode="" d="M1024 288v-416h-928q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68v-928h-416q-40 0 -68 -28t-28 -68zM1152 256h381q-15 -82 -65 -132l-184 -184q-50 -50 -132 -65v381z" />
+<glyph unicode="" d="M1400 256h-248v-248q29 10 41 22l185 185q12 12 22 41zM1120 384h288v896h-1280v-1280h896v288q0 40 28 68t68 28zM1536 1312v-1024q0 -40 -20 -88t-48 -76l-184 -184q-28 -28 -76 -48t-88 -20h-1024q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1344q40 0 68 -28t28 -68 z" />
+<glyph unicode="" horiz-adv-x="2304" d="M1951 538q0 -26 -15.5 -44.5t-38.5 -23.5q-8 -2 -18 -2h-153v140h153q10 0 18 -2q23 -5 38.5 -23.5t15.5 -44.5zM1933 751q0 -25 -15 -42t-38 -21q-3 -1 -15 -1h-139v129h139q3 0 8.5 -0.5t6.5 -0.5q23 -4 38 -21.5t15 -42.5zM728 587v308h-228v-308q0 -58 -38 -94.5 t-105 -36.5q-108 0 -229 59v-112q53 -15 121 -23t109 -9l42 -1q328 0 328 217zM1442 403v113q-99 -52 -200 -59q-108 -8 -169 41t-61 142t61 142t169 41q101 -7 200 -58v112q-48 12 -100 19.5t-80 9.5l-28 2q-127 6 -218.5 -14t-140.5 -60t-71 -88t-22 -106t22 -106t71 -88 t140.5 -60t218.5 -14q101 4 208 31zM2176 518q0 54 -43 88.5t-109 39.5v3q57 8 89 41.5t32 79.5q0 55 -41 88t-107 36q-3 0 -12 0.5t-14 0.5h-455v-510h491q74 0 121.5 36.5t47.5 96.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90 t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="" horiz-adv-x="2304" d="M858 295v693q-106 -41 -172 -135.5t-66 -211.5t66 -211.5t172 -134.5zM1362 641q0 117 -66 211.5t-172 135.5v-694q106 41 172 135.5t66 211.5zM1577 641q0 -159 -78.5 -294t-213.5 -213.5t-294 -78.5q-119 0 -227.5 46.5t-187 125t-125 187t-46.5 227.5q0 159 78.5 294 t213.5 213.5t294 78.5t294 -78.5t213.5 -213.5t78.5 -294zM1960 634q0 139 -55.5 261.5t-147.5 205.5t-213.5 131t-252.5 48h-301q-176 0 -323.5 -81t-235 -230t-87.5 -335q0 -171 87 -317.5t236 -231.5t323 -85h301q129 0 251.5 50.5t214.5 135t147.5 202.5t55.5 246z M2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1664 -96v1088q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5zM1792 992v-1088q0 -66 -47 -113t-113 -47h-1088q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113 zM1408 1376v-160h-128v160q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5v-1088q0 -13 9.5 -22.5t22.5 -9.5h160v-128h-160q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1088q66 0 113 -47t47 -113z" />
+<glyph unicode="" horiz-adv-x="2304" d="M1728 1088l-384 -704h768zM448 1088l-384 -704h768zM1269 1280q-14 -40 -45.5 -71.5t-71.5 -45.5v-1291h608q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1344q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h608v1291q-40 14 -71.5 45.5t-45.5 71.5h-491q-14 0 -23 9t-9 23v64 q0 14 9 23t23 9h491q21 57 70 92.5t111 35.5t111 -35.5t70 -92.5h491q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-491zM1088 1264q33 0 56.5 23.5t23.5 56.5t-23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5zM2176 384q0 -73 -46.5 -131t-117.5 -91 t-144.5 -49.5t-139.5 -16.5t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81zM896 384q0 -73 -46.5 -131t-117.5 -91t-144.5 -49.5t-139.5 -16.5 t-139.5 16.5t-144.5 49.5t-117.5 91t-46.5 131q0 11 35 81t92 174.5t107 195.5t102 184t56 100q18 33 56 33t56 -33q4 -7 56 -100t102 -184t107 -195.5t92 -174.5t35 -81z" />
+<glyph unicode="" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-77 -29 -149 -92.5 t-129.5 -152.5t-92.5 -210t-35 -253h1024q0 132 -35 253t-92.5 210t-129.5 152.5t-149 92.5q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" />
+<glyph unicode="" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -66 9 -128h1006q9 61 9 128zM1280 -128q0 130 -34 249.5t-90.5 208t-126.5 152t-146 94.5h-230q-76 -31 -146 -94.5t-126.5 -152t-90.5 -208t-34 -249.5h1024z" />
+<glyph unicode="" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM1280 1408h-1024q0 -206 85 -384h854q85 178 85 384zM1223 192q-54 141 -145.5 241.5t-194.5 142.5h-230q-103 -42 -194.5 -142.5t-145.5 -241.5h910z" />
+<glyph unicode="" d="M1408 1408q0 -261 -106.5 -461.5t-266.5 -306.5q160 -106 266.5 -306.5t106.5 -461.5h96q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h96q0 261 106.5 461.5t266.5 306.5q-160 106 -266.5 306.5t-106.5 461.5h-96q-14 0 -23 9 t-9 23v64q0 14 9 23t23 9h1472q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-96zM874 700q77 29 149 92.5t129.5 152.5t92.5 210t35 253h-1024q0 -132 35 -253t92.5 -210t129.5 -152.5t149 -92.5q19 -7 30.5 -23.5t11.5 -36.5t-11.5 -36.5t-30.5 -23.5q-137 -51 -244 -196 h700q-107 145 -244 196q-19 7 -30.5 23.5t-11.5 36.5t11.5 36.5t30.5 23.5z" />
+<glyph unicode="" d="M1504 -64q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472zM130 0q3 55 16 107t30 95t46 87t53.5 76t64.5 69.5t66 60t70.5 55t66.5 47.5t65 43q-43 28 -65 43t-66.5 47.5t-70.5 55t-66 60t-64.5 69.5t-53.5 76t-46 87 t-30 95t-16 107h1276q-3 -55 -16 -107t-30 -95t-46 -87t-53.5 -76t-64.5 -69.5t-66 -60t-70.5 -55t-66.5 -47.5t-65 -43q43 -28 65 -43t66.5 -47.5t70.5 -55t66 -60t64.5 -69.5t53.5 -76t46 -87t30 -95t16 -107h-1276zM1504 1536q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9 h-1472q-14 0 -23 9t-9 23v128q0 14 9 23t23 9h1472z" />
+<glyph unicode="" d="M768 1152q-53 0 -90.5 -37.5t-37.5 -90.5v-128h-32v93q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-429l-32 30v172q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-224q0 -47 35 -82l310 -296q39 -39 39 -102q0 -26 19 -45t45 -19h640q26 0 45 19t19 45v25 q0 41 10 77l108 436q10 36 10 77v246q0 48 -32 81.5t-80 33.5q-46 0 -79 -33t-33 -79v-32h-32v125q0 40 -25 72.5t-64 40.5q-14 2 -23 2q-46 0 -79 -33t-33 -79v-128h-32v122q0 51 -32.5 89.5t-82.5 43.5q-5 1 -13 1zM768 1280q84 0 149 -50q57 34 123 34q59 0 111 -27 t86 -76q27 7 59 7q100 0 170 -71.5t70 -171.5v-246q0 -51 -13 -108l-109 -436q-6 -24 -6 -71q0 -80 -56 -136t-136 -56h-640q-84 0 -138 58.5t-54 142.5l-308 296q-76 73 -76 175v224q0 99 70.5 169.5t169.5 70.5q11 0 16 -1q6 95 75.5 160t164.5 65q52 0 98 -21 q72 69 174 69z" />
+<glyph unicode="" horiz-adv-x="1792" d="M880 1408q-46 0 -79 -33t-33 -79v-656h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528v-256l-154 205q-38 51 -102 51q-53 0 -90.5 -37.5t-37.5 -90.5q0 -43 26 -77l384 -512q38 -51 102 -51h688q34 0 61 22t34 56l76 405q5 32 5 59v498q0 46 -33 79t-79 33t-79 -33 t-33 -79v-272h-32v528q0 46 -33 79t-79 33t-79 -33t-33 -79v-528h-32v656q0 46 -33 79t-79 33zM880 1536q68 0 125.5 -35.5t88.5 -96.5q19 4 42 4q99 0 169.5 -70.5t70.5 -169.5v-17q105 6 180.5 -64t75.5 -175v-498q0 -40 -8 -83l-76 -404q-14 -79 -76.5 -131t-143.5 -52 h-688q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 106 75 181t181 75q78 0 128 -34v434q0 99 70.5 169.5t169.5 70.5q23 0 42 -4q31 61 88.5 96.5t125.5 35.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1073 -128h-177q-163 0 -226 141q-23 49 -23 102v5q-62 30 -98.5 88.5t-36.5 127.5q0 38 5 48h-261q-106 0 -181 75t-75 181t75 181t181 75h113l-44 17q-74 28 -119.5 93.5t-45.5 145.5q0 106 75 181t181 75q46 0 91 -17l628 -239h401q106 0 181 -75t75 -181v-668 q0 -88 -54 -157.5t-140 -90.5l-339 -85q-92 -23 -186 -23zM1024 583l-155 -71l-163 -74q-30 -14 -48 -41.5t-18 -60.5q0 -46 33 -79t79 -33q26 0 46 10l338 154q-49 10 -80.5 50t-31.5 90v55zM1344 272q0 46 -33 79t-79 33q-26 0 -46 -10l-290 -132q-28 -13 -37 -17 t-30.5 -17t-29.5 -23.5t-16 -29t-8 -40.5q0 -50 31.5 -82t81.5 -32q20 0 38 9l352 160q30 14 48 41.5t18 60.5zM1112 1024l-650 248q-24 8 -46 8q-53 0 -90.5 -37.5t-37.5 -90.5q0 -40 22.5 -73t59.5 -47l526 -200v-64h-640q-53 0 -90.5 -37.5t-37.5 -90.5t37.5 -90.5 t90.5 -37.5h535l233 106v198q0 63 46 106l111 102h-69zM1073 0q82 0 155 19l339 85q43 11 70 45.5t27 78.5v668q0 53 -37.5 90.5t-90.5 37.5h-308l-136 -126q-36 -33 -36 -82v-296q0 -46 33 -77t79 -31t79 35t33 81v208h32v-208q0 -70 -57 -114q52 -8 86.5 -48.5t34.5 -93.5 q0 -42 -23 -78t-61 -53l-310 -141h91z" />
+<glyph unicode="" horiz-adv-x="2048" d="M1151 1536q61 0 116 -28t91 -77l572 -781q118 -159 118 -359v-355q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v177l-286 143h-546q-80 0 -136 56t-56 136v32q0 119 84.5 203.5t203.5 84.5h420l42 128h-686q-100 0 -173.5 67.5t-81.5 166.5q-65 79 -65 182v32 q0 80 56 136t136 56h959zM1920 -64v355q0 157 -93 284l-573 781q-39 52 -103 52h-959q-26 0 -45 -19t-19 -45q0 -32 1.5 -49.5t9.5 -40.5t25 -43q10 31 35.5 50t56.5 19h832v-32h-832q-26 0 -45 -19t-19 -45q0 -44 3 -58q8 -44 44 -73t81 -29h640h91q40 0 68 -28t28 -68 q0 -15 -5 -30l-64 -192q-10 -29 -35 -47.5t-56 -18.5h-443q-66 0 -113 -47t-47 -113v-32q0 -26 19 -45t45 -19h561q16 0 29 -7l317 -158q24 -13 38.5 -36t14.5 -50v-197q0 -26 19 -45t45 -19h384q26 0 45 19t19 45z" />
+<glyph unicode="" horiz-adv-x="2048" d="M816 1408q-48 0 -79.5 -34t-31.5 -82q0 -14 3 -28l150 -624h-26l-116 482q-9 38 -39.5 62t-69.5 24q-47 0 -79 -34t-32 -81q0 -11 4 -29q3 -13 39 -161t68 -282t32 -138v-227l-307 230q-34 26 -77 26q-52 0 -89.5 -36.5t-37.5 -88.5q0 -67 56 -110l507 -379 q34 -26 76 -26h694q33 0 59 20.5t34 52.5l100 401q8 30 10 88t9 86l116 478q3 12 3 26q0 46 -33 79t-80 33q-38 0 -69 -25.5t-40 -62.5l-99 -408h-26l132 547q3 14 3 28q0 47 -32 80t-80 33q-38 0 -68.5 -24t-39.5 -62l-145 -602h-127l-164 682q-9 38 -39.5 62t-68.5 24z M1461 -256h-694q-85 0 -153 51l-507 380q-50 38 -78.5 94t-28.5 118q0 105 75 179t180 74q25 0 49.5 -5.5t41.5 -11t41 -20.5t35 -23t38.5 -29.5t37.5 -28.5l-123 512q-7 35 -7 59q0 93 60 162t152 79q14 87 80.5 144.5t155.5 57.5q83 0 148 -51.5t85 -132.5l103 -428 l83 348q20 81 85 132.5t148 51.5q87 0 152.5 -54t82.5 -139q93 -10 155 -78t62 -161q0 -30 -7 -57l-116 -477q-5 -22 -5 -67q0 -51 -13 -108l-101 -401q-19 -75 -79.5 -122.5t-137.5 -47.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M640 1408q-53 0 -90.5 -37.5t-37.5 -90.5v-512v-384l-151 202q-41 54 -107 54q-52 0 -89 -38t-37 -90q0 -43 26 -77l384 -512q38 -51 102 -51h718q22 0 39.5 13.5t22.5 34.5l92 368q24 96 24 194v217q0 41 -28 71t-68 30t-68 -28t-28 -68h-32v61q0 48 -32 81.5t-80 33.5 q-46 0 -79 -33t-33 -79v-64h-32v90q0 55 -37 94.5t-91 39.5q-53 0 -90.5 -37.5t-37.5 -90.5v-96h-32v570q0 55 -37 94.5t-91 39.5zM640 1536q107 0 181.5 -77.5t74.5 -184.5v-220q22 2 32 2q99 0 173 -69q47 21 99 21q113 0 184 -87q27 7 56 7q94 0 159 -67.5t65 -161.5 v-217q0 -116 -28 -225l-92 -368q-16 -64 -68 -104.5t-118 -40.5h-718q-60 0 -114.5 27.5t-90.5 74.5l-384 512q-51 68 -51 154q0 105 74.5 180.5t179.5 75.5q71 0 130 -35v547q0 106 75 181t181 75zM768 128v384h-32v-384h32zM1024 128v384h-32v-384h32zM1280 128v384h-32 v-384h32z" />
+<glyph unicode="" d="M1288 889q60 0 107 -23q141 -63 141 -226v-177q0 -94 -23 -186l-85 -339q-21 -86 -90.5 -140t-157.5 -54h-668q-106 0 -181 75t-75 181v401l-239 628q-17 45 -17 91q0 106 75 181t181 75q80 0 145.5 -45.5t93.5 -119.5l17 -44v113q0 106 75 181t181 75t181 -75t75 -181 v-261q27 5 48 5q69 0 127.5 -36.5t88.5 -98.5zM1072 896q-33 0 -60.5 -18t-41.5 -48l-74 -163l-71 -155h55q50 0 90 -31.5t50 -80.5l154 338q10 20 10 46q0 46 -33 79t-79 33zM1293 761q-22 0 -40.5 -8t-29 -16t-23.5 -29.5t-17 -30.5t-17 -37l-132 -290q-10 -20 -10 -46 q0 -46 33 -79t79 -33q33 0 60.5 18t41.5 48l160 352q9 18 9 38q0 50 -32 81.5t-82 31.5zM128 1120q0 -22 8 -46l248 -650v-69l102 111q43 46 106 46h198l106 233v535q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5v-640h-64l-200 526q-14 37 -47 59.5t-73 22.5 q-53 0 -90.5 -37.5t-37.5 -90.5zM1180 -128q44 0 78.5 27t45.5 70l85 339q19 73 19 155v91l-141 -310q-17 -38 -53 -61t-78 -23q-53 0 -93.5 34.5t-48.5 86.5q-44 -57 -114 -57h-208v32h208q46 0 81 33t35 79t-31 79t-77 33h-296q-49 0 -82 -36l-126 -136v-308 q0 -53 37.5 -90.5t90.5 -37.5h668z" />
+<glyph unicode="" horiz-adv-x="1973" d="M857 992v-117q0 -13 -9.5 -22t-22.5 -9h-298v-812q0 -13 -9 -22.5t-22 -9.5h-135q-13 0 -22.5 9t-9.5 23v812h-297q-13 0 -22.5 9t-9.5 22v117q0 14 9 23t23 9h793q13 0 22.5 -9.5t9.5 -22.5zM1895 995l77 -961q1 -13 -8 -24q-10 -10 -23 -10h-134q-12 0 -21 8.5 t-10 20.5l-46 588l-189 -425q-8 -19 -29 -19h-120q-20 0 -29 19l-188 427l-45 -590q-1 -12 -10 -20.5t-21 -8.5h-135q-13 0 -23 10q-9 10 -9 24l78 961q1 12 10 20.5t21 8.5h142q20 0 29 -19l220 -520q10 -24 20 -51q3 7 9.5 24.5t10.5 26.5l221 520q9 19 29 19h141 q13 0 22 -8.5t10 -20.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1042 833q0 88 -60 121q-33 18 -117 18h-123v-281h162q66 0 102 37t36 105zM1094 548l205 -373q8 -17 -1 -31q-8 -16 -27 -16h-152q-20 0 -28 17l-194 365h-155v-350q0 -14 -9 -23t-23 -9h-134q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h294q128 0 190 -24q85 -31 134 -109 t49 -180q0 -92 -42.5 -165.5t-115.5 -109.5q6 -10 9 -16zM896 1376q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM1792 640 q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="" horiz-adv-x="1792" d="M605 303q153 0 257 104q14 18 3 36l-45 82q-6 13 -24 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13t-23.5 -14.5t-28.5 -13.5t-33.5 -9.5t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78 q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-148 0 -246 -96.5t-98 -240.5q0 -146 97 -241.5t247 -95.5zM1235 303q153 0 257 104q14 18 4 36l-45 82q-8 14 -25 17q-16 2 -27 -11l-4 -3q-4 -4 -11.5 -10t-17.5 -13t-23.5 -14.5t-28.5 -13.5t-33.5 -9.5 t-37.5 -3.5q-76 0 -125 50t-49 127q0 76 48 125.5t122 49.5q37 0 71.5 -14t50.5 -28l16 -14q11 -11 26 -10q16 2 24 14l53 78q13 20 -2 39q-3 4 -11 12t-30 23.5t-48.5 28t-67.5 22.5t-86 10q-147 0 -245.5 -96.5t-98.5 -240.5q0 -146 97 -241.5t247 -95.5zM896 1376 q-150 0 -286 -58.5t-234.5 -157t-157 -234.5t-58.5 -286t58.5 -286t157 -234.5t234.5 -157t286 -58.5t286 58.5t234.5 157t157 234.5t58.5 286t-58.5 286t-157 234.5t-234.5 157t-286 58.5zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191 t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71z" />
+<glyph unicode="" horiz-adv-x="2048" d="M736 736l384 -384l-384 -384l-672 672l672 672l168 -168l-96 -96l-72 72l-480 -480l480 -480l193 193l-289 287zM1312 1312l672 -672l-672 -672l-168 168l96 96l72 -72l480 480l-480 480l-193 -193l289 -287l-96 -96l-384 384z" />
+<glyph unicode="" horiz-adv-x="1792" d="M717 182l271 271l-279 279l-88 -88l192 -191l-96 -96l-279 279l279 279l40 -40l87 87l-127 128l-454 -454zM1075 190l454 454l-454 454l-271 -271l279 -279l88 88l-192 191l96 96l279 -279l-279 -279l-40 40l-87 -88zM1792 640q0 -182 -71 -348t-191 -286t-286 -191 t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="" horiz-adv-x="2304" d="M651 539q0 -39 -27.5 -66.5t-65.5 -27.5q-39 0 -66.5 27.5t-27.5 66.5q0 38 27.5 65.5t66.5 27.5q38 0 65.5 -27.5t27.5 -65.5zM1805 540q0 -39 -27.5 -66.5t-66.5 -27.5t-66.5 27.5t-27.5 66.5t27.5 66t66.5 27t66.5 -27t27.5 -66zM765 539q0 79 -56.5 136t-136.5 57 t-136.5 -56.5t-56.5 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM1918 540q0 80 -56.5 136.5t-136.5 56.5q-79 0 -136 -56.5t-57 -136.5t56.5 -136.5t136.5 -56.5t136.5 56.5t56.5 136.5zM850 539q0 -116 -81.5 -197.5t-196.5 -81.5q-116 0 -197.5 82t-81.5 197 t82 196.5t197 81.5t196.5 -81.5t81.5 -196.5zM2004 540q0 -115 -81.5 -196.5t-197.5 -81.5q-115 0 -196.5 81.5t-81.5 196.5t81.5 196.5t196.5 81.5q116 0 197.5 -81.5t81.5 -196.5zM1040 537q0 191 -135.5 326.5t-326.5 135.5q-125 0 -231 -62t-168 -168.5t-62 -231.5 t62 -231.5t168 -168.5t231 -62q191 0 326.5 135.5t135.5 326.5zM1708 1110q-254 111 -556 111q-319 0 -573 -110q117 0 223 -45.5t182.5 -122.5t122 -183t45.5 -223q0 115 43.5 219.5t118 180.5t177.5 123t217 50zM2187 537q0 191 -135 326.5t-326 135.5t-326.5 -135.5 t-135.5 -326.5t135.5 -326.5t326.5 -135.5t326 135.5t135 326.5zM1921 1103h383q-44 -51 -75 -114.5t-40 -114.5q110 -151 110 -337q0 -156 -77 -288t-209 -208.5t-287 -76.5q-133 0 -249 56t-196 155q-47 -56 -129 -179q-11 22 -53.5 82.5t-74.5 97.5 q-80 -99 -196.5 -155.5t-249.5 -56.5q-155 0 -287 76.5t-209 208.5t-77 288q0 186 110 337q-9 51 -40 114.5t-75 114.5h365q149 100 355 156.5t432 56.5q224 0 421 -56t348 -157z" />
+<glyph unicode="" horiz-adv-x="1280" d="M640 629q-188 0 -321 133t-133 320q0 188 133 321t321 133t321 -133t133 -321q0 -187 -133 -320t-321 -133zM640 1306q-92 0 -157.5 -65.5t-65.5 -158.5q0 -92 65.5 -157.5t157.5 -65.5t157.5 65.5t65.5 157.5q0 93 -65.5 158.5t-157.5 65.5zM1163 574q13 -27 15 -49.5 t-4.5 -40.5t-26.5 -38.5t-42.5 -37t-61.5 -41.5q-115 -73 -315 -94l73 -72l267 -267q30 -31 30 -74t-30 -73l-12 -13q-31 -30 -74 -30t-74 30q-67 68 -267 268l-267 -268q-31 -30 -74 -30t-73 30l-12 13q-31 30 -31 73t31 74l267 267l72 72q-203 21 -317 94 q-39 25 -61.5 41.5t-42.5 37t-26.5 38.5t-4.5 40.5t15 49.5q10 20 28 35t42 22t56 -2t65 -35q5 -4 15 -11t43 -24.5t69 -30.5t92 -24t113 -11q91 0 174 25.5t120 50.5l38 25q33 26 65 35t56 2t42 -22t28 -35z" />
+<glyph unicode="" d="M927 956q0 -66 -46.5 -112.5t-112.5 -46.5t-112.5 46.5t-46.5 112.5t46.5 112.5t112.5 46.5t112.5 -46.5t46.5 -112.5zM1141 593q-10 20 -28 32t-47.5 9.5t-60.5 -27.5q-10 -8 -29 -20t-81 -32t-127 -20t-124 18t-86 36l-27 18q-31 25 -60.5 27.5t-47.5 -9.5t-28 -32 q-22 -45 -2 -74.5t87 -73.5q83 -53 226 -67l-51 -52q-142 -142 -191 -190q-22 -22 -22 -52.5t22 -52.5l9 -9q22 -22 52.5 -22t52.5 22l191 191q114 -115 191 -191q22 -22 52.5 -22t52.5 22l9 9q22 22 22 52.5t-22 52.5l-191 190l-52 52q141 14 225 67q67 44 87 73.5t-2 74.5 zM1092 956q0 134 -95 229t-229 95t-229 -95t-95 -229t95 -229t229 -95t229 95t95 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="" horiz-adv-x="1720" d="M1565 1408q65 0 110 -45.5t45 -110.5v-519q0 -176 -68 -336t-182.5 -275t-274 -182.5t-334.5 -67.5q-176 0 -335.5 67.5t-274.5 182.5t-183 275t-68 336v519q0 64 46 110t110 46h1409zM861 344q47 0 82 33l404 388q37 35 37 85q0 49 -34.5 83.5t-83.5 34.5q-47 0 -82 -33 l-323 -310l-323 310q-35 33 -81 33q-49 0 -83.5 -34.5t-34.5 -83.5q0 -51 36 -85l405 -388q33 -33 81 -33z" />
+<glyph unicode="" horiz-adv-x="2304" d="M1494 -103l-295 695q-25 -49 -158.5 -305.5t-198.5 -389.5q-1 -1 -27.5 -0.5t-26.5 1.5q-82 193 -255.5 587t-259.5 596q-21 50 -66.5 107.5t-103.5 100.5t-102 43q0 5 -0.5 24t-0.5 27h583v-50q-39 -2 -79.5 -16t-66.5 -43t-10 -64q26 -59 216.5 -499t235.5 -540 q31 61 140 266.5t131 247.5q-19 39 -126 281t-136 295q-38 69 -201 71v50l513 -1v-47q-60 -2 -93.5 -25t-12.5 -69q33 -70 87 -189.5t86 -187.5q110 214 173 363q24 55 -10 79.5t-129 26.5q1 7 1 25v24q64 0 170.5 0.5t180 1t92.5 0.5v-49q-62 -2 -119 -33t-90 -81 l-213 -442q13 -33 127.5 -290t121.5 -274l441 1017q-14 38 -49.5 62.5t-65 31.5t-55.5 8v50l460 -4l1 -2l-1 -44q-139 -4 -201 -145q-526 -1216 -559 -1291h-49z" />
+<glyph unicode="" horiz-adv-x="1792" d="M949 643q0 -26 -16.5 -45t-41.5 -19q-26 0 -45 16.5t-19 41.5q0 26 17 45t42 19t44 -16.5t19 -41.5zM964 585l350 581q-9 -8 -67.5 -62.5t-125.5 -116.5t-136.5 -127t-117 -110.5t-50.5 -51.5l-349 -580q7 7 67 62t126 116.5t136 127t117 111t50 50.5zM1611 640 q0 -201 -104 -371q-3 2 -17 11t-26.5 16.5t-16.5 7.5q-13 0 -13 -13q0 -10 59 -44q-74 -112 -184.5 -190.5t-241.5 -110.5l-16 67q-1 10 -15 10q-5 0 -8 -5.5t-2 -9.5l16 -68q-72 -15 -146 -15q-199 0 -372 105q1 2 13 20.5t21.5 33.5t9.5 19q0 13 -13 13q-6 0 -17 -14.5 t-22.5 -34.5t-13.5 -23q-113 75 -192 187.5t-110 244.5l69 15q10 3 10 15q0 5 -5.5 8t-10.5 2l-68 -15q-14 72 -14 139q0 206 109 379q2 -1 18.5 -12t30 -19t17.5 -8q13 0 13 12q0 6 -12.5 15.5t-32.5 21.5l-20 12q77 112 189 189t244 107l15 -67q2 -10 15 -10q5 0 8 5.5 t2 10.5l-15 66q71 13 134 13q204 0 379 -109q-39 -56 -39 -65q0 -13 12 -13q11 0 48 64q111 -75 187.5 -186t107.5 -241l-56 -12q-10 -2 -10 -16q0 -5 5.5 -8t9.5 -2l57 13q14 -72 14 -140zM1696 640q0 163 -63.5 311t-170.5 255t-255 170.5t-311 63.5t-311 -63.5 t-255 -170.5t-170.5 -255t-63.5 -311t63.5 -311t170.5 -255t255 -170.5t311 -63.5t311 63.5t255 170.5t170.5 255t63.5 311zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191 t191 -286t71 -348z" />
+<glyph unicode="" horiz-adv-x="1792" d="M893 1536q240 2 451 -120q232 -134 352 -372l-742 39q-160 9 -294 -74.5t-185 -229.5l-276 424q128 159 311 245.5t383 87.5zM146 1131l337 -663q72 -143 211 -217t293 -45l-230 -451q-212 33 -385 157.5t-272.5 316t-99.5 411.5q0 267 146 491zM1732 962 q58 -150 59.5 -310.5t-48.5 -306t-153 -272t-246 -209.5q-230 -133 -498 -119l405 623q88 131 82.5 290.5t-106.5 277.5zM896 942q125 0 213.5 -88.5t88.5 -213.5t-88.5 -213.5t-213.5 -88.5t-213.5 88.5t-88.5 213.5t88.5 213.5t213.5 88.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M903 -256q-283 0 -504.5 150.5t-329.5 398.5q-58 131 -67 301t26 332.5t111 312t179 242.5l-11 -281q11 14 68 15.5t70 -15.5q42 81 160.5 138t234.5 59q-54 -45 -119.5 -148.5t-58.5 -163.5q25 -8 62.5 -13.5t63 -7.5t68 -4t50.5 -3q15 -5 9.5 -45.5t-30.5 -75.5 q-5 -7 -16.5 -18.5t-56.5 -35.5t-101 -34l15 -189l-139 67q-18 -43 -7.5 -81.5t36 -66.5t65.5 -41.5t81 -6.5q51 9 98 34.5t83.5 45t73.5 17.5q61 -4 89.5 -33t19.5 -65q-1 -2 -2.5 -5.5t-8.5 -12.5t-18 -15.5t-31.5 -10.5t-46.5 -1q-60 -95 -144.5 -135.5t-209.5 -29.5 q74 -61 162.5 -82.5t168.5 -6t154.5 52t128 87.5t80.5 104q43 91 39 192.5t-37.5 188.5t-78.5 125q87 -38 137 -79.5t77 -112.5q15 170 -57.5 343t-209.5 284q265 -77 412 -279.5t151 -517.5q2 -127 -40.5 -255t-123.5 -238t-189 -196t-247.5 -135.5t-288.5 -49.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1493 1308q-165 110 -359 110q-155 0 -293 -73t-240 -200q-75 -93 -119.5 -218t-48.5 -266v-42q4 -141 48.5 -266t119.5 -218q102 -127 240 -200t293 -73q194 0 359 110q-121 -108 -274.5 -168t-322.5 -60q-29 0 -43 1q-175 8 -333 82t-272 193t-181 281t-67 339 q0 182 71 348t191 286t286 191t348 71h3q168 -1 320.5 -60.5t273.5 -167.5zM1792 640q0 -192 -77 -362.5t-213 -296.5q-104 -63 -222 -63q-137 0 -255 84q154 56 253.5 233t99.5 405q0 227 -99 404t-253 234q119 83 254 83q119 0 226 -65q135 -125 210.5 -295t75.5 -361z " />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 599q0 -56 -7 -104h-1151q0 -146 109.5 -244.5t257.5 -98.5q99 0 185.5 46.5t136.5 130.5h423q-56 -159 -170.5 -281t-267.5 -188.5t-321 -66.5q-187 0 -356 83q-228 -116 -394 -116q-237 0 -237 263q0 115 45 275q17 60 109 229q199 360 475 606 q-184 -79 -427 -354q63 274 283.5 449.5t501.5 175.5q30 0 45 -1q255 117 433 117q64 0 116 -13t94.5 -40.5t66.5 -76.5t24 -115q0 -116 -75 -286q101 -182 101 -390zM1722 1239q0 83 -53 132t-137 49q-108 0 -254 -70q121 -47 222.5 -131.5t170.5 -195.5q51 135 51 216z M128 2q0 -86 48.5 -132.5t134.5 -46.5q115 0 266 83q-122 72 -213.5 183t-137.5 245q-98 -205 -98 -332zM632 715h728q-5 142 -113 237t-251 95q-144 0 -251.5 -95t-112.5 -237z" />
+<glyph unicode="" horiz-adv-x="2048" d="M1792 288v960q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1248v-960q0 -66 -47 -113t-113 -47h-736v-128h352q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23 v64q0 14 9 23t23 9h352v128h-736q-66 0 -113 47t-47 113v960q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="" horiz-adv-x="1792" d="M138 1408h197q-70 -64 -126 -149q-36 -56 -59 -115t-30 -125.5t-8.5 -120t10.5 -132t21 -126t28 -136.5q4 -19 6 -28q51 -238 81 -329q57 -171 152 -275h-272q-48 0 -82 34t-34 82v1304q0 48 34 82t82 34zM1346 1408h308q48 0 82 -34t34 -82v-1304q0 -48 -34 -82t-82 -34 h-178q212 210 196 565l-469 -101q-2 -45 -12 -82t-31 -72t-59.5 -59.5t-93.5 -36.5q-123 -26 -199 40q-32 27 -53 61t-51.5 129t-64.5 258q-35 163 -45.5 263t-5.5 139t23 77q20 41 62.5 73t102.5 45q45 12 83.5 6.5t67 -17t54 -35t43 -48t34.5 -56.5l468 100 q-68 175 -180 287z" />
+<glyph unicode="" d="M1401 -11l-6 -6q-113 -114 -259 -175q-154 -64 -317 -64q-165 0 -317 64q-148 63 -259 175q-113 112 -175 258q-42 103 -54 189q-4 28 48 36q51 8 56 -20q1 -1 1 -4q18 -90 46 -159q50 -124 152 -226q98 -98 226 -152q132 -56 276 -56q143 0 276 56q128 55 225 152l6 6 q10 10 25 6q12 -3 33 -22q36 -37 17 -58zM929 604l-66 -66l63 -63q21 -21 -7 -49q-17 -17 -32 -17q-10 0 -19 10l-62 61l-66 -66q-5 -5 -15 -5q-15 0 -31 16l-2 2q-18 15 -18 29q0 7 8 17l66 65l-66 66q-16 16 14 45q18 18 31 18q6 0 13 -5l65 -66l65 65q18 17 48 -13 q27 -27 11 -44zM1400 547q0 -118 -46 -228q-45 -105 -126 -186q-80 -80 -187 -126t-228 -46t-228 46t-187 126q-82 82 -125 186q-15 32 -15 40h-1q-9 27 43 44q50 16 60 -12q37 -99 97 -167h1v339v2q3 136 102 232q105 103 253 103q147 0 251 -103t104 -249 q0 -147 -104.5 -251t-250.5 -104q-58 0 -112 16q-28 11 -13 61q16 51 44 43l14 -3q14 -3 32.5 -6t30.5 -3q104 0 176 71.5t72 174.5q0 101 -72 171q-71 71 -175 71q-107 0 -178 -80q-64 -72 -64 -160v-413q110 -67 242 -67q96 0 185 36.5t156 103.5t103.5 155t36.5 183 q0 198 -141 339q-140 140 -339 140q-200 0 -340 -140q-53 -53 -77 -87l-2 -2q-8 -11 -13 -15.5t-21.5 -9.5t-38.5 3q-21 5 -36.5 16.5t-15.5 26.5v680q0 15 10.5 26.5t27.5 11.5h877q30 0 30 -55t-30 -55h-811v-483h1q40 42 102 84t108 61q109 46 231 46q121 0 228 -46 t187 -126q81 -81 126 -186q46 -112 46 -229zM1369 1128q9 -8 9 -18t-5.5 -18t-16.5 -21q-26 -26 -39 -26q-9 0 -16 7q-106 91 -207 133q-128 56 -276 56q-133 0 -262 -49q-27 -10 -45 37q-9 25 -8 38q3 16 16 20q130 57 299 57q164 0 316 -64q137 -58 235 -152z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1551 60q15 6 26 3t11 -17.5t-15 -33.5q-13 -16 -44 -43.5t-95.5 -68t-141 -74t-188 -58t-229.5 -24.5q-119 0 -238 31t-209 76.5t-172.5 104t-132.5 105t-84 87.5q-8 9 -10 16.5t1 12t8 7t11.5 2t11.5 -4.5q192 -117 300 -166q389 -176 799 -90q190 40 391 135z M1758 175q11 -16 2.5 -69.5t-28.5 -102.5q-34 -83 -85 -124q-17 -14 -26 -9t0 24q21 45 44.5 121.5t6.5 98.5q-5 7 -15.5 11.5t-27 6t-29.5 2.5t-35 0t-31.5 -2t-31 -3t-22.5 -2q-6 -1 -13 -1.5t-11 -1t-8.5 -1t-7 -0.5h-5.5h-4.5t-3 0.5t-2 1.5l-1.5 3q-6 16 47 40t103 30 q46 7 108 1t76 -24zM1364 618q0 -31 13.5 -64t32 -58t37.5 -46t33 -32l13 -11l-227 -224q-40 37 -79 75.5t-58 58.5l-19 20q-11 11 -25 33q-38 -59 -97.5 -102.5t-127.5 -63.5t-140 -23t-137.5 21t-117.5 65.5t-83 113t-31 162.5q0 84 28 154t72 116.5t106.5 83t122.5 57 t130 34.5t119.5 18.5t99.5 6.5v127q0 65 -21 97q-34 53 -121 53q-6 0 -16.5 -1t-40.5 -12t-56 -29.5t-56 -59.5t-48 -96l-294 27q0 60 22 119t67 113t108 95t151.5 65.5t190.5 24.5q100 0 181 -25t129.5 -61.5t81 -83t45 -86t12.5 -73.5v-589zM692 597q0 -86 70 -133 q66 -44 139 -22q84 25 114 123q14 45 14 101v162q-59 -2 -111 -12t-106.5 -33.5t-87 -71t-32.5 -114.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1536 1280q52 0 90 -38t38 -90v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128zM1152 1376v-288q0 -14 9 -23t23 -9 h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 1376v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM1536 -128v1024h-1408v-1024h1408zM896 448h224q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-224 v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1152 416v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576q14 0 23 -9t9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23 t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47 t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1111 151l-46 -46q-9 -9 -22 -9t-23 9l-188 189l-188 -189q-10 -9 -23 -9t-22 9l-46 46q-9 9 -9 22t9 23l189 188l-189 188q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l188 -188l188 188q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23l-188 -188l188 -188q9 -10 9 -23t-9 -22z M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1303 572l-512 -512q-10 -9 -23 -9t-23 9l-288 288q-9 10 -9 23t9 22l46 46q9 9 22 9t23 -9l220 -220l444 444q10 9 23 9t22 -9l46 -46q9 -9 9 -22t-9 -23zM128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23 t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47 t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="" horiz-adv-x="1792" d="M448 1536q26 0 45 -19t19 -45v-891l536 429q17 14 40 14q26 0 45 -19t19 -45v-379l536 429q17 14 40 14q26 0 45 -19t19 -45v-1152q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h384z" />
+<glyph unicode="" horiz-adv-x="1024" d="M512 448q66 0 128 15v-655q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v655q61 -15 128 -15zM512 1536q212 0 362 -150t150 -362t-150 -362t-362 -150t-362 150t-150 362t150 362t362 150zM512 1312q14 0 23 9t9 23t-9 23t-23 9q-146 0 -249 -103t-103 -249 q0 -14 9 -23t23 -9t23 9t9 23q0 119 84.5 203.5t203.5 84.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1745 1239q10 -10 10 -23t-10 -23l-141 -141q-28 -28 -68 -28h-1344q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h576v64q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-64h512q40 0 68 -28zM768 320h256v-512q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v512zM1600 768 q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-1344q-40 0 -68 28l-141 141q-10 10 -10 23t10 23l141 141q28 28 68 28h512v192h256v-192h576z" />
+<glyph unicode="" horiz-adv-x="2048" d="M2020 1525q28 -20 28 -53v-1408q0 -20 -11 -36t-29 -23l-640 -256q-24 -11 -48 0l-616 246l-616 -246q-10 -5 -24 -5q-19 0 -36 11q-28 20 -28 53v1408q0 20 11 36t29 23l640 256q24 11 48 0l616 -246l616 246q32 13 60 -6zM736 1390v-1270l576 -230v1270zM128 1173 v-1270l544 217v1270zM1920 107v1270l-544 -217v-1270z" />
+<glyph unicode="" horiz-adv-x="1792" d="M512 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472q0 20 17 28l480 256q7 4 15 4zM1760 1536q13 0 22.5 -9.5t9.5 -22.5v-1472q0 -20 -17 -28l-480 -256q-7 -4 -15 -4q-13 0 -22.5 9.5t-9.5 22.5v1472 q0 20 17 28l480 256q7 4 15 4zM640 1536q8 0 14 -3l512 -256q18 -10 18 -29v-1472q0 -13 -9.5 -22.5t-22.5 -9.5q-8 0 -14 3l-512 256q-18 10 -18 29v1472q0 13 9.5 22.5t22.5 9.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M640 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 640q0 53 -37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-110 0 -211 18q-173 -173 -435 -229q-52 -10 -86 -13q-12 -1 -22 6t-13 18q-4 15 20 37q5 5 23.5 21.5t25.5 23.5t23.5 25.5t24 31.5t20.5 37 t20 48t14.5 57.5t12.5 72.5q-146 90 -229.5 216.5t-83.5 269.5q0 174 120 321.5t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M640 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1024 640q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 -53 -37.5 -90.5t-90.5 -37.5 t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5 t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51 t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 130 71 248.5t191 204.5t286 136.5t348 50.5t348 -50.5t286 -136.5t191 -204.5t71 -248.5z" />
+<glyph unicode="" horiz-adv-x="1024" d="M512 345l512 295v-591l-512 -296v592zM0 640v-591l512 296zM512 1527v-591l-512 -296v591zM512 936l512 295v-591z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1709 1018q-10 -236 -332 -651q-333 -431 -562 -431q-142 0 -240 263q-44 160 -132 482q-72 262 -157 262q-18 0 -127 -76l-77 98q24 21 108 96.5t130 115.5q156 138 241 146q95 9 153 -55.5t81 -203.5q44 -287 66 -373q55 -249 120 -249q51 0 154 161q101 161 109 246 q13 139 -109 139q-57 0 -121 -26q120 393 459 382q251 -8 236 -326z" />
+<glyph unicode="" d="M0 1408h1536v-1536h-1536v1536zM1085 293l-221 631l221 297h-634l221 -297l-221 -631l317 -304z" />
+<glyph unicode="" d="M0 1408h1536v-1536h-1536v1536zM908 1088l-12 -33l75 -83l-31 -114l25 -25l107 57l107 -57l25 25l-31 114l75 83l-12 33h-95l-53 96h-32l-53 -96h-95zM641 925q32 0 44.5 -16t11.5 -63l174 21q0 55 -17.5 92.5t-50.5 56t-69 25.5t-85 7q-133 0 -199 -57.5t-66 -182.5v-72 h-96v-128h76q20 0 20 -8v-382q0 -14 -5 -20t-18 -7l-73 -7v-88h448v86l-149 14q-6 1 -8.5 1.5t-3.5 2.5t-0.5 4t1 7t0.5 10v387h191l38 128h-231q-6 0 -2 6t4 9v80q0 27 1.5 40.5t7.5 28t19.5 20t36.5 5.5zM1248 96v86l-54 9q-7 1 -9.5 2.5t-2.5 3t1 7.5t1 12v520h-275 l-23 -101l83 -22q23 -7 23 -27v-370q0 -14 -6 -18.5t-20 -6.5l-70 -9v-86h352z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1792 690q0 -58 -29.5 -105.5t-79.5 -72.5q12 -46 12 -96q0 -155 -106.5 -287t-290.5 -208.5t-400 -76.5t-399.5 76.5t-290 208.5t-106.5 287q0 47 11 94q-51 25 -82 73.5t-31 106.5q0 82 58 140.5t141 58.5q85 0 145 -63q218 152 515 162l116 521q3 13 15 21t26 5 l369 -81q18 37 54 59.5t79 22.5q62 0 106 -43.5t44 -105.5t-44 -106t-106 -44t-105.5 43.5t-43.5 105.5l-334 74l-104 -472q300 -9 519 -160q58 61 143 61q83 0 141 -58.5t58 -140.5zM418 491q0 -62 43.5 -106t105.5 -44t106 44t44 106t-44 105.5t-106 43.5q-61 0 -105 -44 t-44 -105zM1228 136q11 11 11 26t-11 26q-10 10 -25 10t-26 -10q-41 -42 -121 -62t-160 -20t-160 20t-121 62q-11 10 -26 10t-25 -10q-11 -10 -11 -25.5t11 -26.5q43 -43 118.5 -68t122.5 -29.5t91 -4.5t91 4.5t122.5 29.5t118.5 68zM1225 341q62 0 105.5 44t43.5 106 q0 61 -44 105t-105 44q-62 0 -106 -43.5t-44 -105.5t44 -106t106 -44z" />
+<glyph unicode="" horiz-adv-x="1792" d="M69 741h1q16 126 58.5 241.5t115 217t167.5 176t223.5 117.5t276.5 43q231 0 414 -105.5t294 -303.5q104 -187 104 -442v-188h-1125q1 -111 53.5 -192.5t136.5 -122.5t189.5 -57t213 -3t208 46.5t173.5 84.5v-377q-92 -55 -229.5 -92t-312.5 -38t-316 53 q-189 73 -311.5 249t-124.5 372q-3 242 111 412t325 268q-48 -60 -78 -125.5t-46 -159.5h635q8 77 -8 140t-47 101.5t-70.5 66.5t-80.5 41t-75 20.5t-56 8.5l-22 1q-135 -5 -259.5 -44.5t-223.5 -104.5t-176 -140.5t-138 -163.5z" />
+<glyph unicode="" horiz-adv-x="2304" d="M0 32v608h2304v-608q0 -66 -47 -113t-113 -47h-1984q-66 0 -113 47t-47 113zM640 256v-128h384v128h-384zM256 256v-128h256v128h-256zM2144 1408q66 0 113 -47t47 -113v-224h-2304v224q0 66 47 113t113 47h1984z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1549 857q55 0 85.5 -28.5t30.5 -83.5t-34 -82t-91 -27h-136v-177h-25v398h170zM1710 267l-4 -11l-5 -10q-113 -230 -330.5 -366t-474.5 -136q-182 0 -348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71q244 0 454.5 -124t329.5 -338l2 -4l8 -16 q-30 -15 -136.5 -68.5t-163.5 -84.5q-6 -3 -479 -268q384 -183 799 -366zM896 -234q250 0 462.5 132.5t322.5 357.5l-287 129q-72 -140 -206 -222t-292 -82q-151 0 -280 75t-204 204t-75 280t75 280t204 204t280 75t280 -73.5t204 -204.5l280 143q-116 208 -321 329 t-443 121q-119 0 -232.5 -31.5t-209 -87.5t-176.5 -137t-137 -176.5t-87.5 -209t-31.5 -232.5t31.5 -232.5t87.5 -209t137 -176.5t176.5 -137t209 -87.5t232.5 -31.5z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1427 827l-614 386l92 151h855zM405 562l-184 116v858l1183 -743zM1424 697l147 -95v-858l-532 335zM1387 718l-500 -802h-855l356 571z" />
+<glyph unicode="" horiz-adv-x="1792" d="M640 528v224q0 16 -16 16h-96q-16 0 -16 -16v-224q0 -16 16 -16h96q16 0 16 16zM1152 528v224q0 16 -16 16h-96q-16 0 -16 -16v-224q0 -16 16 -16h96q16 0 16 16zM1664 496v-752h-640v320q0 80 -56 136t-136 56t-136 -56t-56 -136v-320h-640v752q0 16 16 16h96 q16 0 16 -16v-112h128v624q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h16v393q-32 19 -32 55q0 26 19 45t45 19t45 -19t19 -45q0 -36 -32 -55v-9h272q16 0 16 -16v-224q0 -16 -16 -16h-272v-128h16q16 0 16 -16v-112h128 v112q0 16 16 16h96q16 0 16 -16v-112h128v112q0 16 16 16h96q16 0 16 -16v-624h128v112q0 16 16 16h96q16 0 16 -16z" />
+<glyph unicode="" horiz-adv-x="2304" d="M2288 731q16 -8 16 -27t-16 -27l-320 -192q-8 -5 -16 -5q-9 0 -16 4q-16 10 -16 28v128h-858q37 -58 83 -165q16 -37 24.5 -55t24 -49t27 -47t27 -34t31.5 -26t33 -8h96v96q0 14 9 23t23 9h320q14 0 23 -9t9 -23v-320q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v96h-96 q-32 0 -61 10t-51 23.5t-45 40.5t-37 46t-33.5 57t-28.5 57.5t-28 60.5q-23 53 -37 81.5t-36 65t-44.5 53.5t-46.5 17h-360q-22 -84 -91 -138t-157 -54q-106 0 -181 75t-75 181t75 181t181 75q88 0 157 -54t91 -138h104q24 0 46.5 17t44.5 53.5t36 65t37 81.5q19 41 28 60.5 t28.5 57.5t33.5 57t37 46t45 40.5t51 23.5t61 10h107q21 57 70 92.5t111 35.5q80 0 136 -56t56 -136t-56 -136t-136 -56q-62 0 -111 35.5t-70 92.5h-107q-17 0 -33 -8t-31.5 -26t-27 -34t-27 -47t-24 -49t-24.5 -55q-46 -107 -83 -165h1114v128q0 18 16 28t32 -1z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1150 774q0 -56 -39.5 -95t-95.5 -39h-253v269h253q56 0 95.5 -39.5t39.5 -95.5zM1329 774q0 130 -91.5 222t-222.5 92h-433v-896h180v269h253q130 0 222 91.5t92 221.5zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348 t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="" horiz-adv-x="2304" d="M1645 438q0 59 -34 106.5t-87 68.5q-7 -45 -23 -92q-7 -24 -27.5 -38t-44.5 -14q-12 0 -24 3q-31 10 -45 38.5t-4 58.5q23 71 23 143q0 123 -61 227.5t-166 165.5t-228 61q-134 0 -247 -73t-167 -194q108 -28 188 -106q22 -23 22 -55t-22 -54t-54 -22t-55 22 q-75 75 -180 75q-106 0 -181 -74.5t-75 -180.5t75 -180.5t181 -74.5h1046q79 0 134.5 55.5t55.5 133.5zM1798 438q0 -142 -100.5 -242t-242.5 -100h-1046q-169 0 -289 119.5t-120 288.5q0 153 100 267t249 136q62 184 221 298t354 114q235 0 408.5 -158.5t196.5 -389.5 q116 -25 192.5 -118.5t76.5 -214.5zM2048 438q0 -175 -97 -319q-23 -33 -64 -33q-24 0 -43 13q-26 17 -32 48.5t12 57.5q71 104 71 233t-71 233q-18 26 -12 57t32 49t57.5 11.5t49.5 -32.5q97 -142 97 -318zM2304 438q0 -244 -134 -443q-23 -34 -64 -34q-23 0 -42 13 q-26 18 -32.5 49t11.5 57q108 164 108 358q0 195 -108 357q-18 26 -11.5 57.5t32.5 48.5q26 18 57 12t49 -33q134 -198 134 -442z" />
+<glyph unicode="" d="M1500 -13q0 -89 -63 -152.5t-153 -63.5t-153.5 63.5t-63.5 152.5q0 90 63.5 153.5t153.5 63.5t153 -63.5t63 -153.5zM1267 268q-115 -15 -192.5 -102.5t-77.5 -205.5q0 -74 33 -138q-146 -78 -379 -78q-109 0 -201 21t-153.5 54.5t-110.5 76.5t-76 85t-44.5 83 t-23.5 66.5t-6 39.5q0 19 4.5 42.5t18.5 56t36.5 58t64 43.5t94.5 18t94 -17.5t63 -41t35.5 -53t17.5 -49t4 -33.5q0 -34 -23 -81q28 -27 82 -42t93 -17l40 -1q115 0 190 51t75 133q0 26 -9 48.5t-31.5 44.5t-49.5 41t-74 44t-93.5 47.5t-119.5 56.5q-28 13 -43 20 q-116 55 -187 100t-122.5 102t-72 125.5t-20.5 162.5q0 78 20.5 150t66 137.5t112.5 114t166.5 77t221.5 28.5q120 0 220 -26t164.5 -67t109.5 -94t64 -105.5t19 -103.5q0 -46 -15 -82.5t-36.5 -58t-48.5 -36t-49 -19.5t-39 -5h-8h-32t-39 5t-44 14t-41 28t-37 46t-24 70.5 t-10 97.5q-15 16 -59 25.5t-81 10.5l-37 1q-68 0 -117.5 -31t-70.5 -70t-21 -76q0 -24 5 -43t24 -46t53 -51t97 -53.5t150 -58.5q76 -25 138.5 -53.5t109 -55.5t83 -59t60.5 -59.5t41 -62.5t26.5 -62t14.5 -63.5t6 -62t1 -62.5z" />
+<glyph unicode="" d="M704 352v576q0 14 -9 23t-23 9h-256q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h256q14 0 23 9t9 23zM1152 352v576q0 14 -9 23t-23 9h-256q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h256q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103 t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM768 96q148 0 273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273 t73 -273t198 -198t273 -73zM864 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-192zM480 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-192z" />
+<glyph unicode="" d="M1088 352v576q0 14 -9 23t-23 9h-576q-14 0 -23 -9t-9 -23v-576q0 -14 9 -23t23 -9h576q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
+<glyph unicode="" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM768 96q148 0 273 73t198 198t73 273t-73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273 t73 -273t198 -198t273 -73zM480 320q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h576q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-576z" />
+<glyph unicode="" horiz-adv-x="1792" d="M1757 128l35 -313q3 -28 -16 -50q-19 -21 -48 -21h-1664q-29 0 -48 21q-19 22 -16 50l35 313h1722zM1664 967l86 -775h-1708l86 775q3 24 21 40.5t43 16.5h256v-128q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5v128h384v-128q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5v128h256q25 0 43 -16.5t21 -40.5zM1280 1152v-256q0 -26 -19 -45t-45 -19t-45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-256q0 -26 -19 -45t-45 -19t-45 19t-19 45v256q0 159 112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="" horiz-adv-x="2048" d="M1920 768q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5h-15l-115 -662q-8 -46 -44 -76t-82 -30h-1280q-46 0 -82 30t-44 76l-115 662h-15q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5h1792zM485 -32q26 2 43.5 22.5t15.5 46.5l-32 416q-2 26 -22.5 43.5 t-46.5 15.5t-43.5 -22.5t-15.5 -46.5l32 -416q2 -25 20.5 -42t43.5 -17h5zM896 32v416q0 26 -19 45t-45 19t-45 -19t-19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45zM1280 32v416q0 26 -19 45t-45 19t-45 -19t-19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45zM1632 27l32 416 q2 26 -15.5 46.5t-43.5 22.5t-46.5 -15.5t-22.5 -43.5l-32 -416q-2 -26 15.5 -46.5t43.5 -22.5h5q25 0 43.5 17t20.5 42zM476 1244l-93 -412h-132l101 441q19 88 89 143.5t160 55.5h167q0 26 19 45t45 19h384q26 0 45 -19t19 -45h167q90 0 160 -55.5t89 -143.5l101 -441 h-132l-93 412q-11 44 -45.5 72t-79.5 28h-167q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45h-167q-45 0 -79.5 -28t-45.5 -72z" />
+<glyph unicode="" horiz-adv-x="1792" d="M991 512l64 256h-254l-64 -256h254zM1759 1016l-56 -224q-7 -24 -31 -24h-327l-64 -256h311q15 0 25 -12q10 -14 6 -28l-56 -224q-5 -24 -31 -24h-327l-81 -328q-7 -24 -31 -24h-224q-16 0 -26 12q-9 12 -6 28l78 312h-254l-81 -328q-7 -24 -31 -24h-225q-15 0 -25 12 q-9 12 -6 28l78 312h-311q-15 0 -25 12q-9 12 -6 28l56 224q7 24 31 24h327l64 256h-311q-15 0 -25 12q-10 14 -6 28l56 224q5 24 31 24h327l81 328q7 24 32 24h224q15 0 25 -12q9 -12 6 -28l-78 -312h254l81 328q7 24 32 24h224q15 0 25 -12q9 -12 6 -28l-78 -312h311 q15 0 25 -12q9 -12 6 -28z" />
+<glyph unicode="" d="M841 483l148 -148l-149 -149zM840 1094l149 -149l-148 -148zM710 -130l464 464l-306 306l306 306l-464 464v-611l-255 255l-93 -93l320 -321l-320 -321l93 -93l255 255v-611zM1429 640q0 -209 -32 -365.5t-87.5 -257t-140.5 -162.5t-181.5 -86.5t-219.5 -24.5 t-219.5 24.5t-181.5 86.5t-140.5 162.5t-87.5 257t-32 365.5t32 365.5t87.5 257t140.5 162.5t181.5 86.5t219.5 24.5t219.5 -24.5t181.5 -86.5t140.5 -162.5t87.5 -257t32 -365.5z" />
+<glyph unicode="" horiz-adv-x="1024" d="M596 113l173 172l-173 172v-344zM596 823l173 172l-173 172v-344zM628 640l356 -356l-539 -540v711l-297 -296l-108 108l372 373l-372 373l108 108l297 -296v711l539 -540z" />
+<glyph unicode="" d="M1280 256q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM512 1024q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5 t112.5 -271.5zM1440 1344q0 -20 -13 -38l-1056 -1408q-19 -26 -51 -26h-160q-26 0 -45 19t-19 45q0 20 13 38l1056 1408q19 26 51 26h160q26 0 45 -19t19 -45zM768 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
+<glyph unicode="" horiz-adv-x="1792" />
+</font>
+</defs></svg>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/fonts/fontawesome-webfont.ttf b/sm-shop/src/main/webapp/resources/templates/generic/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000..26dea79
Binary files /dev/null and b/sm-shop/src/main/webapp/resources/templates/generic/fonts/fontawesome-webfont.ttf differ
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/fonts/fontawesome-webfont.woff b/sm-shop/src/main/webapp/resources/templates/generic/fonts/fontawesome-webfont.woff
new file mode 100644
index 0000000..dc35ce3
Binary files /dev/null and b/sm-shop/src/main/webapp/resources/templates/generic/fonts/fontawesome-webfont.woff differ
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/fonts/fontawesome-webfont.woff2 b/sm-shop/src/main/webapp/resources/templates/generic/fonts/fontawesome-webfont.woff2
new file mode 100644
index 0000000..500e517
Binary files /dev/null and b/sm-shop/src/main/webapp/resources/templates/generic/fonts/fontawesome-webfont.woff2 differ
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/img/banner-resized.jpg b/sm-shop/src/main/webapp/resources/templates/generic/img/banner-resized.jpg
new file mode 100644
index 0000000..4776714
Binary files /dev/null and b/sm-shop/src/main/webapp/resources/templates/generic/img/banner-resized.jpg differ
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/img/favicon.ico b/sm-shop/src/main/webapp/resources/templates/generic/img/favicon.ico
new file mode 100644
index 0000000..9f6ea37
Binary files /dev/null and b/sm-shop/src/main/webapp/resources/templates/generic/img/favicon.ico differ
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/js/bootstrap.min.js b/sm-shop/src/main/webapp/resources/templates/generic/js/bootstrap.min.js
new file mode 100644
index 0000000..8f2e70e
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/js/bootstrap.min.js
@@ -0,0 +1,12 @@
+/*!
+ * Bootstrap v3.3.5 (http://getbootstrap.com)
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*!
+ * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=35b072e804118cf2fd87)
+ * Config saved to config.json and https://gist.github.com/35b072e804118cf2fd87
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(t){"use strict";var e=t.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||e[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var i=t(this),n=i.data("bs.alert");n||i.data("bs.alert",n=new o(this)),"string"==typeof e&&n[e].call(i)})}var i='[data-dismiss="alert"]',o=function(e){t(e).on("click",i,this.close)};o.VERSION="3.3.6",o.TRANSITION_DURATION=150,o.prototype.close=function(e){function i(){a.detach().trigger("closed.bs.alert").remove()}var n=t(this),s=n.attr("data-target");s||(s=n.attr("href"),s=s&&s.replace(/.*(?=#[^\s]*$)/,""));var a=t(s);e&&e.preventDefault(),a.length||(a=n.closest(".alert")),a.trigger(e=t.Event("close.bs.alert")),e.isDefaultPrevented()||(a.removeClass("in"),t.support.transition&&a.hasClass("fade")?a.one("bsTransitionEnd",i).emulateTransitionEnd(o.TRANSITION_DURATION):i())};var n=t.fn.alert;t.fn.alert=e,t.fn.alert.Constructor=o,t.fn.alert.noConflict=function(){return t.fn.alert=n,this},t(document).on("click.bs.alert.data-api",i,o.prototype.close)}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),n=o.data("bs.button"),s="object"==typeof e&&e;n||o.data("bs.button",n=new i(this,s)),"toggle"==e?n.toggle():e&&n.setState(e)})}var i=function(e,o){this.$element=t(e),this.options=t.extend({},i.DEFAULTS,o),this.isLoading=!1};i.VERSION="3.3.6",i.DEFAULTS={loadingText:"loading..."},i.prototype.setState=function(e){var i="disabled",o=this.$element,n=o.is("input")?"val":"html",s=o.data();e+="Text",null==s.resetText&&o.data("resetText",o[n]()),setTimeout(t.proxy(function(){o[n](null==s[e]?this.options[e]:s[e]),"loadingText"==e?(this.isLoading=!0,o.addClass(i).attr(i,i)):this.isLoading&&(this.isLoading=!1,o.removeClass(i).removeAttr(i))},this),0)},i.prototype.toggle=function(){var t=!0,e=this.$element.closest('[data-toggle="buttons"]');if(e.length){var i=this.$element.find("input");"radio"==i.prop("type")?(i.prop("checked")&&(t=!1),e.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==i.prop("type")&&(i.prop("checked")!==this.$element.hasClass("active")&&(t=!1),this.$element.toggleClass("active")),i.prop("checked",this.$element.hasClass("active")),t&&i.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var o=t.fn.button;t.fn.button=e,t.fn.button.Constructor=i,t.fn.button.noConflict=function(){return t.fn.button=o,this},t(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(i){var o=t(i.target);o.hasClass("btn")||(o=o.closest(".btn")),e.call(o,"toggle"),t(i.target).is('input[type="radio"]')||t(i.target).is('input[type="checkbox"]')||i.preventDefault()}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(e){t(e.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(e.type))})}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),n=o.data("bs.carousel"),s=t.extend({},i.DEFAULTS,o.data(),"object"==typeof e&&e),a="string"==typeof e?e:s.slide;n||o.data("bs.carousel",n=new i(this,s)),"number"==typeof e?n.to(e):a?n[a]():s.interval&&n.pause().cycle()})}var i=function(e,i){this.$element=t(e),this.$indicators=this.$element.find(".carousel-indicators"),this.options=i,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",t.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",t.proxy(this.pause,this)).on("mouseleave.bs.carousel",t.proxy(this.cycle,this))};i.VERSION="3.3.6",i.TRANSITION_DURATION=600,i.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},i.prototype.keydown=function(t){if(!/input|textarea/i.test(t.target.tagName)){switch(t.which){case 37:this.prev();break;case 39:this.next();break;default:return}t.preventDefault()}},i.prototype.cycle=function(e){return e||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(t.proxy(this.next,this),this.options.interval)),this},i.prototype.getItemIndex=function(t){return this.$items=t.parent().children(".item"),this.$items.index(t||this.$active)},i.prototype.getItemForDirection=function(t,e){var i=this.getItemIndex(e),o="prev"==t&&0===i||"next"==t&&i==this.$items.length-1;if(o&&!this.options.wrap)return e;var n="prev"==t?-1:1,s=(i+n)%this.$items.length;return this.$items.eq(s)},i.prototype.to=function(t){var e=this,i=this.getItemIndex(this.$active=this.$element.find(".item.active"));return t>this.$items.length-1||0>t?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){e.to(t)}):i==t?this.pause().cycle():this.slide(t>i?"next":"prev",this.$items.eq(t))},i.prototype.pause=function(e){return e||(this.paused=!0),this.$element.find(".next, .prev").length&&t.support.transition&&(this.$element.trigger(t.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},i.prototype.next=function(){return this.sliding?void 0:this.slide("next")},i.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},i.prototype.slide=function(e,o){var n=this.$element.find(".item.active"),s=o||this.getItemForDirection(e,n),a=this.interval,r="next"==e?"left":"right",l=this;if(s.hasClass("active"))return this.sliding=!1;var h=s[0],d=t.Event("slide.bs.carousel",{relatedTarget:h,direction:r});if(this.$element.trigger(d),!d.isDefaultPrevented()){if(this.sliding=!0,a&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var p=t(this.$indicators.children()[this.getItemIndex(s)]);p&&p.addClass("active")}var c=t.Event("slid.bs.carousel",{relatedTarget:h,direction:r});return t.support.transition&&this.$element.hasClass("slide")?(s.addClass(e),s[0].offsetWidth,n.addClass(r),s.addClass(r),n.one("bsTransitionEnd",function(){s.removeClass([e,r].join(" ")).addClass("active"),n.removeClass(["active",r].join(" ")),l.sliding=!1,setTimeout(function(){l.$element.trigger(c)},0)}).emulateTransitionEnd(i.TRANSITION_DURATION)):(n.removeClass("active"),s.addClass("active"),this.sliding=!1,this.$element.trigger(c)),a&&this.cycle(),this}};var o=t.fn.carousel;t.fn.carousel=e,t.fn.carousel.Constructor=i,t.fn.carousel.noConflict=function(){return t.fn.carousel=o,this};var n=function(i){var o,n=t(this),s=t(n.attr("data-target")||(o=n.attr("href"))&&o.replace(/.*(?=#[^\s]+$)/,""));if(s.hasClass("carousel")){var a=t.extend({},s.data(),n.data()),r=n.attr("data-slide-to");r&&(a.interval=!1),e.call(s,a),r&&s.data("bs.carousel").to(r),i.preventDefault()}};t(document).on("click.bs.carousel.data-api","[data-slide]",n).on("click.bs.carousel.data-api","[data-slide-to]",n),t(window).on("load",function(){t('[data-ride="carousel"]').each(function(){var i=t(this);e.call(i,i.data())})})}(jQuery),+function(t){"use strict";function e(e){var i=e.attr("data-target");i||(i=e.attr("href"),i=i&&/#[A-Za-z]/.test(i)&&i.replace(/.*(?=#[^\s]*$)/,""));var o=i&&t(i);return o&&o.length?o:e.parent()}function i(i){i&&3===i.which||(t(n).remove(),t(s).each(function(){var o=t(this),n=e(o),s={relatedTarget:this};n.hasClass("open")&&(i&&"click"==i.type&&/input|textarea/i.test(i.target.tagName)&&t.contains(n[0],i.target)||(n.trigger(i=t.Event("hide.bs.dropdown",s)),i.isDefaultPrevented()||(o.attr("aria-expanded","false"),n.removeClass("open").trigger(t.Event("hidden.bs.dropdown",s)))))}))}function o(e){return this.each(function(){var i=t(this),o=i.data("bs.dropdown");o||i.data("bs.dropdown",o=new a(this)),"string"==typeof e&&o[e].call(i)})}var n=".dropdown-backdrop",s='[data-toggle="dropdown"]',a=function(e){t(e).on("click.bs.dropdown",this.toggle)};a.VERSION="3.3.6",a.prototype.toggle=function(o){var n=t(this);if(!n.is(".disabled, :disabled")){var s=e(n),a=s.hasClass("open");if(i(),!a){"ontouchstart"in document.documentElement&&!s.closest(".navbar-nav").length&&t(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(t(this)).on("click",i);var r={relatedTarget:this};if(s.trigger(o=t.Event("show.bs.dropdown",r)),o.isDefaultPrevented())return;n.trigger("focus").attr("aria-expanded","true"),s.toggleClass("open").trigger(t.Event("shown.bs.dropdown",r))}return!1}},a.prototype.keydown=function(i){if(/(38|40|27|32)/.test(i.which)&&!/input|textarea/i.test(i.target.tagName)){var o=t(this);if(i.preventDefault(),i.stopPropagation(),!o.is(".disabled, :disabled")){var n=e(o),a=n.hasClass("open");if(!a&&27!=i.which||a&&27==i.which)return 27==i.which&&n.find(s).trigger("focus"),o.trigger("click");var r=" li:not(.disabled):visible a",l=n.find(".dropdown-menu"+r);if(l.length){var h=l.index(i.target);38==i.which&&h>0&&h--,40==i.which&&h<l.length-1&&h++,~h||(h=0),l.eq(h).trigger("focus")}}}};var r=t.fn.dropdown;t.fn.dropdown=o,t.fn.dropdown.Constructor=a,t.fn.dropdown.noConflict=function(){return t.fn.dropdown=r,this},t(document).on("click.bs.dropdown.data-api",i).on("click.bs.dropdown.data-api",".dropdown form",function(t){t.stopPropagation()}).on("click.bs.dropdown.data-api",s,a.prototype.toggle).on("keydown.bs.dropdown.data-api",s,a.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",a.prototype.keydown)}(jQuery),+function(t){"use strict";function e(e,o){return this.each(function(){var n=t(this),s=n.data("bs.modal"),a=t.extend({},i.DEFAULTS,n.data(),"object"==typeof e&&e);s||n.data("bs.modal",s=new i(this,a)),"string"==typeof e?s[e](o):a.show&&s.show(o)})}var i=function(e,i){this.options=i,this.$body=t(document.body),this.$element=t(e),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,t.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};i.VERSION="3.3.6",i.TRANSITION_DURATION=300,i.BACKDROP_TRANSITION_DURATION=150,i.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},i.prototype.toggle=function(t){return this.isShown?this.hide():this.show(t)},i.prototype.show=function(e){var o=this,n=t.Event("show.bs.modal",{relatedTarget:e});this.$element.trigger(n),this.isShown||n.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',t.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){o.$element.one("mouseup.dismiss.bs.modal",function(e){t(e.target).is(o.$element)&&(o.ignoreBackdropClick=!0)})}),this.backdrop(function(){var n=t.support.transition&&o.$element.hasClass("fade");o.$element.parent().length||o.$element.appendTo(o.$body),o.$element.show().scrollTop(0),o.adjustDialog(),n&&o.$element[0].offsetWidth,o.$element.addClass("in"),o.enforceFocus();var s=t.Event("shown.bs.modal",{relatedTarget:e});n?o.$dialog.one("bsTransitionEnd",function(){o.$element.trigger("focus").trigger(s)}).emulateTransitionEnd(i.TRANSITION_DURATION):o.$element.trigger("focus").trigger(s)}))},i.prototype.hide=function(e){e&&e.preventDefault(),e=t.Event("hide.bs.modal"),this.$element.trigger(e),this.isShown&&!e.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),t(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),t.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",t.proxy(this.hideModal,this)).emulateTransitionEnd(i.TRANSITION_DURATION):this.hideModal())},i.prototype.enforceFocus=function(){t(document).off("focusin.bs.modal").on("focusin.bs.modal",t.proxy(function(t){this.$element[0]===t.target||this.$element.has(t.target).length||this.$element.trigger("focus")},this))},i.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",t.proxy(function(t){27==t.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},i.prototype.resize=function(){this.isShown?t(window).on("resize.bs.modal",t.proxy(this.handleUpdate,this)):t(window).off("resize.bs.modal")},i.prototype.hideModal=function(){var t=this;this.$element.hide(),this.backdrop(function(){t.$body.removeClass("modal-open"),t.resetAdjustments(),t.resetScrollbar(),t.$element.trigger("hidden.bs.modal")})},i.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},i.prototype.backdrop=function(e){var o=this,n=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var s=t.support.transition&&n;if(this.$backdrop=t(document.createElement("div")).addClass("modal-backdrop "+n).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",t.proxy(function(t){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(t.target===t.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),s&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!e)return;s?this.$backdrop.one("bsTransitionEnd",e).emulateTransitionEnd(i.BACKDROP_TRANSITION_DURATION):e()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var a=function(){o.removeBackdrop(),e&&e()};t.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",a).emulateTransitionEnd(i.BACKDROP_TRANSITION_DURATION):a()}else e&&e()},i.prototype.handleUpdate=function(){this.adjustDialog()},i.prototype.adjustDialog=function(){var t=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&t?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!t?this.scrollbarWidth:""})},i.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},i.prototype.checkScrollbar=function(){var t=window.innerWidth;if(!t){var e=document.documentElement.getBoundingClientRect();t=e.right-Math.abs(e.left)}this.bodyIsOverflowing=document.body.clientWidth<t,this.scrollbarWidth=this.measureScrollbar()},i.prototype.setScrollbar=function(){var t=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",t+this.scrollbarWidth)},i.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},i.prototype.measureScrollbar=function(){var t=document.createElement("div");t.className="modal-scrollbar-measure",this.$body.append(t);var e=t.offsetWidth-t.clientWidth;return this.$body[0].removeChild(t),e};var o=t.fn.modal;t.fn.modal=e,t.fn.modal.Constructor=i,t.fn.modal.noConflict=function(){return t.fn.modal=o,this},t(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(i){var o=t(this),n=o.attr("href"),s=t(o.attr("data-target")||n&&n.replace(/.*(?=#[^\s]+$)/,"")),a=s.data("bs.modal")?"toggle":t.extend({remote:!/#/.test(n)&&n},s.data(),o.data());o.is("a")&&i.preventDefault(),s.one("show.bs.modal",function(t){t.isDefaultPrevented()||s.one("hidden.bs.modal",function(){o.is(":visible")&&o.trigger("focus")})}),e.call(s,a,this)})}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),n=o.data("bs.tooltip"),s="object"==typeof e&&e;(n||!/destroy|hide/.test(e))&&(n||o.data("bs.tooltip",n=new i(this,s)),"string"==typeof e&&n[e]())})}var i=function(t,e){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",t,e)};i.VERSION="3.3.6",i.TRANSITION_DURATION=150,i.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},i.prototype.init=function(e,i,o){if(this.enabled=!0,this.type=e,this.$element=t(i),this.options=this.getOptions(o),this.$viewport=this.options.viewport&&t(t.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var n=this.options.trigger.split(" "),s=n.length;s--;){var a=n[s];if("click"==a)this.$element.on("click."+this.type,this.options.selector,t.proxy(this.toggle,this));else if("manual"!=a){var r="hover"==a?"mouseenter":"focusin",l="hover"==a?"mouseleave":"focusout";this.$element.on(r+"."+this.type,this.options.selector,t.proxy(this.enter,this)),this.$element.on(l+"."+this.type,this.options.selector,t.proxy(this.leave,this))}}this.options.selector?this._options=t.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},i.prototype.getDefaults=function(){return i.DEFAULTS},i.prototype.getOptions=function(e){return e=t.extend({},this.getDefaults(),this.$element.data(),e),e.delay&&"number"==typeof e.delay&&(e.delay={show:e.delay,hide:e.delay}),e},i.prototype.getDelegateOptions=function(){var e={},i=this.getDefaults();return this._options&&t.each(this._options,function(t,o){i[t]!=o&&(e[t]=o)}),e},i.prototype.enter=function(e){var i=e instanceof this.constructor?e:t(e.currentTarget).data("bs."+this.type);return i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,i)),e instanceof t.Event&&(i.inState["focusin"==e.type?"focus":"hover"]=!0),i.tip().hasClass("in")||"in"==i.hoverState?void(i.hoverState="in"):(clearTimeout(i.timeout),i.hoverState="in",i.options.delay&&i.options.delay.show?void(i.timeout=setTimeout(function(){"in"==i.hoverState&&i.show()},i.options.delay.show)):i.show())},i.prototype.isInStateTrue=function(){for(var t in this.inState)if(this.inState[t])return!0;return!1},i.prototype.leave=function(e){var i=e instanceof this.constructor?e:t(e.currentTarget).data("bs."+this.type);return i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,i)),e instanceof t.Event&&(i.inState["focusout"==e.type?"focus":"hover"]=!1),i.isInStateTrue()?void 0:(clearTimeout(i.timeout),i.hoverState="out",i.options.delay&&i.options.delay.hide?void(i.timeout=setTimeout(function(){"out"==i.hoverState&&i.hide()},i.options.delay.hide)):i.hide())},i.prototype.show=function(){var e=t.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(e);var o=t.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(e.isDefaultPrevented()||!o)return;var n=this,s=this.tip(),a=this.getUID(this.type);this.setContent(),s.attr("id",a),this.$element.attr("aria-describedby",a),this.options.animation&&s.addClass("fade");var r="function"==typeof this.options.placement?this.options.placement.call(this,s[0],this.$element[0]):this.options.placement,l=/\s?auto?\s?/i,h=l.test(r);h&&(r=r.replace(l,"")||"top"),s.detach().css({top:0,left:0,display:"block"}).addClass(r).data("bs."+this.type,this),this.options.container?s.appendTo(this.options.container):s.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var d=this.getPosition(),p=s[0].offsetWidth,c=s[0].offsetHeight;if(h){var f=r,u=this.getPosition(this.$viewport);r="bottom"==r&&d.bottom+c>u.bottom?"top":"top"==r&&d.top-c<u.top?"bottom":"right"==r&&d.right+p>u.width?"left":"left"==r&&d.left-p<u.left?"right":r,s.removeClass(f).addClass(r)}var g=this.getCalculatedOffset(r,d,p,c);this.applyPlacement(g,r);var v=function(){var t=n.hoverState;n.$element.trigger("shown.bs."+n.type),n.hoverState=null,"out"==t&&n.leave(n)};t.support.transition&&this.$tip.hasClass("fade")?s.one("bsTransitionEnd",v).emulateTransitionEnd(i.TRANSITION_DURATION):v()}},i.prototype.applyPlacement=function(e,i){var o=this.tip(),n=o[0].offsetWidth,s=o[0].offsetHeight,a=parseInt(o.css("margin-top"),10),r=parseInt(o.css("margin-left"),10);isNaN(a)&&(a=0),isNaN(r)&&(r=0),e.top+=a,e.left+=r,t.offset.setOffset(o[0],t.extend({using:function(t){o.css({top:Math.round(t.top),left:Math.round(t.left)})}},e),0),o.addClass("in");var l=o[0].offsetWidth,h=o[0].offsetHeight;"top"==i&&h!=s&&(e.top=e.top+s-h);var d=this.getViewportAdjustedDelta(i,e,l,h);d.left?e.left+=d.left:e.top+=d.top;var p=/top|bottom/.test(i),c=p?2*d.left-n+l:2*d.top-s+h,f=p?"offsetWidth":"offsetHeight";o.offset(e),this.replaceArrow(c,o[0][f],p)},i.prototype.replaceArrow=function(t,e,i){this.arrow().css(i?"left":"top",50*(1-t/e)+"%").css(i?"top":"left","")},i.prototype.setContent=function(){var t=this.tip(),e=this.getTitle();t.find(".tooltip-inner")[this.options.html?"html":"text"](e),t.removeClass("fade in top bottom left right")},i.prototype.hide=function(e){function o(){"in"!=n.hoverState&&s.detach(),n.$element.removeAttr("aria-describedby").trigger("hidden.bs."+n.type),e&&e()}var n=this,s=t(this.$tip),a=t.Event("hide.bs."+this.type);return this.$element.trigger(a),a.isDefaultPrevented()?void 0:(s.removeClass("in"),t.support.transition&&s.hasClass("fade")?s.one("bsTransitionEnd",o).emulateTransitionEnd(i.TRANSITION_DURATION):o(),this.hoverState=null,this)},i.prototype.fixTitle=function(){var t=this.$element;(t.attr("title")||"string"!=typeof t.attr("data-original-title"))&&t.attr("data-original-title",t.attr("title")||"").attr("title","")},i.prototype.hasContent=function(){return this.getTitle()},i.prototype.getPosition=function(e){e=e||this.$element;var i=e[0],o="BODY"==i.tagName,n=i.getBoundingClientRect();null==n.width&&(n=t.extend({},n,{width:n.right-n.left,height:n.bottom-n.top}));var s=o?{top:0,left:0}:e.offset(),a={scroll:o?document.documentElement.scrollTop||document.body.scrollTop:e.scrollTop()},r=o?{width:t(window).width(),height:t(window).height()}:null;return t.extend({},n,a,r,s)},i.prototype.getCalculatedOffset=function(t,e,i,o){return"bottom"==t?{top:e.top+e.height,left:e.left+e.width/2-i/2}:"top"==t?{top:e.top-o,left:e.left+e.width/2-i/2}:"left"==t?{top:e.top+e.height/2-o/2,left:e.left-i}:{top:e.top+e.height/2-o/2,left:e.left+e.width}},i.prototype.getViewportAdjustedDelta=function(t,e,i,o){var n={top:0,left:0};if(!this.$viewport)return n;var s=this.options.viewport&&this.options.viewport.padding||0,a=this.getPosition(this.$viewport);if(/right|left/.test(t)){var r=e.top-s-a.scroll,l=e.top+s-a.scroll+o;r<a.top?n.top=a.top-r:l>a.top+a.height&&(n.top=a.top+a.height-l)}else{var h=e.left-s,d=e.left+s+i;h<a.left?n.left=a.left-h:d>a.right&&(n.left=a.left+a.width-d)}return n},i.prototype.getTitle=function(){var t,e=this.$element,i=this.options;return t=e.attr("data-original-title")||("function"==typeof i.title?i.title.call(e[0]):i.title)},i.prototype.getUID=function(t){do t+=~~(1e6*Math.random());while(document.getElementById(t));return t},i.prototype.tip=function(){if(!this.$tip&&(this.$tip=t(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},i.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},i.prototype.enable=function(){this.enabled=!0},i.prototype.disable=function(){this.enabled=!1},i.prototype.toggleEnabled=function(){this.enabled=!this.enabled},i.prototype.toggle=function(e){var i=this;e&&(i=t(e.currentTarget).data("bs."+this.type),i||(i=new this.constructor(e.currentTarget,this.getDelegateOptions()),t(e.currentTarget).data("bs."+this.type,i))),e?(i.inState.click=!i.inState.click,i.isInStateTrue()?i.enter(i):i.leave(i)):i.tip().hasClass("in")?i.leave(i):i.enter(i)},i.prototype.destroy=function(){var t=this;clearTimeout(this.timeout),this.hide(function(){t.$element.off("."+t.type).removeData("bs."+t.type),t.$tip&&t.$tip.detach(),t.$tip=null,t.$arrow=null,t.$viewport=null})};var o=t.fn.tooltip;t.fn.tooltip=e,t.fn.tooltip.Constructor=i,t.fn.tooltip.noConflict=function(){return t.fn.tooltip=o,this}}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),n=o.data("bs.popover"),s="object"==typeof e&&e;(n||!/destroy|hide/.test(e))&&(n||o.data("bs.popover",n=new i(this,s)),"string"==typeof e&&n[e]())})}var i=function(t,e){this.init("popover",t,e)};if(!t.fn.tooltip)throw new Error("Popover requires tooltip.js");i.VERSION="3.3.6",i.DEFAULTS=t.extend({},t.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),i.prototype=t.extend({},t.fn.tooltip.Constructor.prototype),i.prototype.constructor=i,i.prototype.getDefaults=function(){return i.DEFAULTS},i.prototype.setContent=function(){var t=this.tip(),e=this.getTitle(),i=this.getContent();t.find(".popover-title")[this.options.html?"html":"text"](e),t.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof i?"html":"append":"text"](i),t.removeClass("fade top bottom left right in"),t.find(".popover-title").html()||t.find(".popover-title").hide()},i.prototype.hasContent=function(){return this.getTitle()||this.getContent()},i.prototype.getContent=function(){var t=this.$element,e=this.options;return t.attr("data-content")||("function"==typeof e.content?e.content.call(t[0]):e.content)},i.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var o=t.fn.popover;t.fn.popover=e,t.fn.popover.Constructor=i,t.fn.popover.noConflict=function(){return t.fn.popover=o,this}}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),n=o.data("bs.tab");n||o.data("bs.tab",n=new i(this)),"string"==typeof e&&n[e]()})}var i=function(e){this.element=t(e)};i.VERSION="3.3.6",i.TRANSITION_DURATION=150,i.prototype.show=function(){var e=this.element,i=e.closest("ul:not(.dropdown-menu)"),o=e.data("target");if(o||(o=e.attr("href"),o=o&&o.replace(/.*(?=#[^\s]*$)/,"")),!e.parent("li").hasClass("active")){var n=i.find(".active:last a"),s=t.Event("hide.bs.tab",{relatedTarget:e[0]}),a=t.Event("show.bs.tab",{relatedTarget:n[0]});if(n.trigger(s),e.trigger(a),!a.isDefaultPrevented()&&!s.isDefaultPrevented()){var r=t(o);this.activate(e.closest("li"),i),this.activate(r,r.parent(),function(){n.trigger({type:"hidden.bs.tab",relatedTarget:e[0]}),e.trigger({type:"shown.bs.tab",relatedTarget:n[0]})})}}},i.prototype.activate=function(e,o,n){function s(){a.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),e.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),r?(e[0].offsetWidth,e.addClass("in")):e.removeClass("fade"),e.parent(".dropdown-menu").length&&e.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),n&&n()}var a=o.find("> .active"),r=n&&t.support.transition&&(a.length&&a.hasClass("fade")||!!o.find("> .fade").length);a.length&&r?a.one("bsTransitionEnd",s).emulateTransitionEnd(i.TRANSITION_DURATION):s(),a.removeClass("in")};var o=t.fn.tab;t.fn.tab=e,t.fn.tab.Constructor=i,t.fn.tab.noConflict=function(){return t.fn.tab=o,this};var n=function(i){i.preventDefault(),e.call(t(this),"show")};t(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',n).on("click.bs.tab.data-api",'[data-toggle="pill"]',n)}(jQuery),+function(t){"use strict";function e(e){return this.each(function(){var o=t(this),n=o.data("bs.affix"),s="object"==typeof e&&e;n||o.data("bs.affix",n=new i(this,s)),"string"==typeof e&&n[e]()})}var i=function(e,o){this.options=t.extend({},i.DEFAULTS,o),this.$target=t(this.options.target).on("scroll.bs.affix.data-api",t.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",t.proxy(this.checkPositionWithEventLoop,this)),this.$element=t(e),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};i.VERSION="3.3.6",i.RESET="affix affix-top affix-bottom",i.DEFAULTS={offset:0,target:window},i.prototype.getState=function(t,e,i,o){var n=this.$target.scrollTop(),s=this.$element.offset(),a=this.$target.height();if(null!=i&&"top"==this.affixed)return i>n?"top":!1;if("bottom"==this.affixed)return null!=i?n+this.unpin<=s.top?!1:"bottom":t-o>=n+a?!1:"bottom";var r=null==this.affixed,l=r?n:s.top,h=r?a:e;return null!=i&&i>=n?"top":null!=o&&l+h>=t-o?"bottom":!1},i.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(i.RESET).addClass("affix");var t=this.$target.scrollTop(),e=this.$element.offset();return this.pinnedOffset=e.top-t},i.prototype.checkPositionWithEventLoop=function(){setTimeout(t.proxy(this.checkPosition,this),1)},i.prototype.checkPosition=function(){if(this.$element.is(":visible")){var e=this.$element.height(),o=this.options.offset,n=o.top,s=o.bottom,a=Math.max(t(document).height(),t(document.body).height());"object"!=typeof o&&(s=n=o),"function"==typeof n&&(n=o.top(this.$element)),"function"==typeof s&&(s=o.bottom(this.$element));var r=this.getState(a,e,n,s);if(this.affixed!=r){null!=this.unpin&&this.$element.css("top","");var l="affix"+(r?"-"+r:""),h=t.Event(l+".bs.affix");if(this.$element.trigger(h),h.isDefaultPrevented())return;this.affixed=r,this.unpin="bottom"==r?this.getPinnedOffset():null,this.$element.removeClass(i.RESET).addClass(l).trigger(l.replace("affix","affixed")+".bs.affix")}"bottom"==r&&this.$element.offset({top:a-e-s})}};var o=t.fn.affix;t.fn.affix=e,t.fn.affix.Constructor=i,t.fn.affix.noConflict=function(){return t.fn.affix=o,this},t(window).on("load",function(){t('[data-spy="affix"]').each(function(){var i=t(this),o=i.data();o.offset=o.offset||{},null!=o.offsetBottom&&(o.offset.bottom=o.offsetBottom),null!=o.offsetTop&&(o.offset.top=o.offsetTop),e.call(i,o)})})}(jQuery),+function(t){"use strict";function e(e){var i,o=e.attr("data-target")||(i=e.attr("href"))&&i.replace(/.*(?=#[^\s]+$)/,"");return t(o)}function i(e){return this.each(function(){var i=t(this),n=i.data("bs.collapse"),s=t.extend({},o.DEFAULTS,i.data(),"object"==typeof e&&e);!n&&s.toggle&&/show|hide/.test(e)&&(s.toggle=!1),n||i.data("bs.collapse",n=new o(this,s)),"string"==typeof e&&n[e]()})}var o=function(e,i){this.$element=t(e),this.options=t.extend({},o.DEFAULTS,i),this.$trigger=t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};o.VERSION="3.3.6",o.TRANSITION_DURATION=350,o.DEFAULTS={toggle:!0},o.prototype.dimension=function(){var t=this.$element.hasClass("width");return t?"width":"height"},o.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var e,n=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(n&&n.length&&(e=n.data("bs.collapse"),e&&e.transitioning))){var s=t.Event("show.bs.collapse");if(this.$element.trigger(s),!s.isDefaultPrevented()){n&&n.length&&(i.call(n,"hide"),e||n.data("bs.collapse",null));var a=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[a](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var r=function(){this.$element.removeClass("collapsing").addClass("collapse in")[a](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!t.support.transition)return r.call(this);var l=t.camelCase(["scroll",a].join("-"));this.$element.one("bsTransitionEnd",t.proxy(r,this)).emulateTransitionEnd(o.TRANSITION_DURATION)[a](this.$element[0][l]);
+}}}},o.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var e=t.Event("hide.bs.collapse");if(this.$element.trigger(e),!e.isDefaultPrevented()){var i=this.dimension();this.$element[i](this.$element[i]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var n=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return t.support.transition?void this.$element[i](0).one("bsTransitionEnd",t.proxy(n,this)).emulateTransitionEnd(o.TRANSITION_DURATION):n.call(this)}}},o.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},o.prototype.getParent=function(){return t(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(t.proxy(function(i,o){var n=t(o);this.addAriaAndCollapsedClass(e(n),n)},this)).end()},o.prototype.addAriaAndCollapsedClass=function(t,e){var i=t.hasClass("in");t.attr("aria-expanded",i),e.toggleClass("collapsed",!i).attr("aria-expanded",i)};var n=t.fn.collapse;t.fn.collapse=i,t.fn.collapse.Constructor=o,t.fn.collapse.noConflict=function(){return t.fn.collapse=n,this},t(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(o){var n=t(this);n.attr("data-target")||o.preventDefault();var s=e(n),a=s.data("bs.collapse"),r=a?"toggle":n.data();i.call(s,r)})}(jQuery),+function(t){"use strict";function e(i,o){this.$body=t(document.body),this.$scrollElement=t(t(i).is(document.body)?window:i),this.options=t.extend({},e.DEFAULTS,o),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",t.proxy(this.process,this)),this.refresh(),this.process()}function i(i){return this.each(function(){var o=t(this),n=o.data("bs.scrollspy"),s="object"==typeof i&&i;n||o.data("bs.scrollspy",n=new e(this,s)),"string"==typeof i&&n[i]()})}e.VERSION="3.3.6",e.DEFAULTS={offset:10},e.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},e.prototype.refresh=function(){var e=this,i="offset",o=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),t.isWindow(this.$scrollElement[0])||(i="position",o=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var e=t(this),n=e.data("target")||e.attr("href"),s=/^#./.test(n)&&t(n);return s&&s.length&&s.is(":visible")&&[[s[i]().top+o,n]]||null}).sort(function(t,e){return t[0]-e[0]}).each(function(){e.offsets.push(this[0]),e.targets.push(this[1])})},e.prototype.process=function(){var t,e=this.$scrollElement.scrollTop()+this.options.offset,i=this.getScrollHeight(),o=this.options.offset+i-this.$scrollElement.height(),n=this.offsets,s=this.targets,a=this.activeTarget;if(this.scrollHeight!=i&&this.refresh(),e>=o)return a!=(t=s[s.length-1])&&this.activate(t);if(a&&e<n[0])return this.activeTarget=null,this.clear();for(t=n.length;t--;)a!=s[t]&&e>=n[t]&&(void 0===n[t+1]||e<n[t+1])&&this.activate(s[t])},e.prototype.activate=function(e){this.activeTarget=e,this.clear();var i=this.selector+'[data-target="'+e+'"],'+this.selector+'[href="'+e+'"]',o=t(i).parents("li").addClass("active");o.parent(".dropdown-menu").length&&(o=o.closest("li.dropdown").addClass("active")),o.trigger("activate.bs.scrollspy")},e.prototype.clear=function(){t(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var o=t.fn.scrollspy;t.fn.scrollspy=i,t.fn.scrollspy.Constructor=e,t.fn.scrollspy.noConflict=function(){return t.fn.scrollspy=o,this},t(window).on("load.bs.scrollspy.data-api",function(){t('[data-spy="scroll"]').each(function(){var e=t(this);i.call(e,e.data())})})}(jQuery),+function(t){"use strict";function e(){var t=document.createElement("bootstrap"),e={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var i in e)if(void 0!==t.style[i])return{end:e[i]};return!1}t.fn.emulateTransitionEnd=function(e){var i=!1,o=this;t(this).one("bsTransitionEnd",function(){i=!0});var n=function(){i||t(o).trigger(t.support.transition.end)};return setTimeout(n,e),this},t(function(){t.support.transition=e(),t.support.transition&&(t.event.special.bsTransitionEnd={bindType:t.support.transition.end,delegateType:t.support.transition.end,handle:function(e){return t(e.target).is(this)?e.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery);
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/js/jquery.countdown.min.js b/sm-shop/src/main/webapp/resources/templates/generic/js/jquery.countdown.min.js
new file mode 100644
index 0000000..56856f8
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/js/jquery.countdown.min.js
@@ -0,0 +1 @@
+!function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery"],a):a(jQuery)}(function(a){"use strict";function b(a){if(a instanceof Date)return a;if(String(a).match(g))return String(a).match(/^[0-9]*$/)&&(a=Number(a)),String(a).match(/\-/)&&(a=String(a).replace(/\-/g,"/")),new Date(a);throw new Error("Couldn't cast `"+a+"` to a date object.")}function c(a){return function(b){var c=b.match(/%(-|!)?[A-Z]{1}(:[^;]+;)?/gi);if(c)for(var e=0,f=c.length;f>e;++e){var g=c[e].match(/%(-|!)?([a-zA-Z]{1})(:[^;]+;)?/),i=new RegExp(g[0]),j=g[1]||"",k=g[3]||"",l=null;g=g[2],h.hasOwnProperty(g)&&(l=h[g],l=Number(a[l])),null!==l&&("!"===j&&(l=d(k,l)),""===j&&10>l&&(l="0"+l.toString()),b=b.replace(i,l.toString()))}return b=b.replace(/%%/,"%")}}function d(a,b){var c="s",d="";return a&&(a=a.replace(/(:|;|\s)/gi,"").split(/\,/),1===a.length?c=a[0]:(d=a[0],c=a[1])),1===Math.abs(b)?d:c}var e=100,f=[],g=[];g.push(/^[0-9]*$/.source),g.push(/([0-9]{1,2}\/){2}[0-9]{4}( [0-9]{1,2}(:[0-9]{2}){2})?/.source),g.push(/[0-9]{4}([\/\-][0-9]{1,2}){2}( [0-9]{1,2}(:[0-9]{2}){2})?/.source),g=new RegExp(g.join("|"));var h={Y:"years",m:"months",w:"weeks",d:"days",D:"totalDays",H:"hours",M:"minutes",S:"seconds"},i=function(b,c,d){this.el=b,this.$el=a(b),this.interval=null,this.offset={},this.instanceNumber=f.length,f.push(this),this.$el.data("countdown-instance",this.instanceNumber),d&&(this.$el.on("update.countdown",d),this.$el.on("stoped.countdown",d),this.$el.on("finish.countdown",d)),this.setFinalDate(c),this.start()};a.extend(i.prototype,{start:function(){null!==this.interval&&clearInterval(this.interval);var a=this;this.update(),this.interval=setInterval(function(){a.update.call(a)},e)},stop:function(){clearInterval(this.interval),this.interval=null,this.dispatchEvent("stoped")},pause:function(){this.stop.call(this)},resume:function(){this.start.call(this)},remove:function(){this.stop(),f[this.instanceNumber]=null,delete this.$el.data().countdownInstance},setFinalDate:function(a){this.finalDate=b(a)},update:function(){return 0===this.$el.closest("html").length?void this.remove():(this.totalSecsLeft=this.finalDate.getTime()-(new Date).getTime(),this.totalSecsLeft=Math.ceil(this.totalSecsLeft/1e3),this.totalSecsLeft=this.totalSecsLeft<0?0:this.totalSecsLeft,this.offset={seconds:this.totalSecsLeft%60,minutes:Math.floor(this.totalSecsLeft/60)%60,hours:Math.floor(this.totalSecsLeft/60/60)%24,days:Math.floor(this.totalSecsLeft/60/60/24)%7,totalDays:Math.floor(this.totalSecsLeft/60/60/24),weeks:Math.floor(this.totalSecsLeft/60/60/24/7),months:Math.floor(this.totalSecsLeft/60/60/24/30),years:Math.floor(this.totalSecsLeft/60/60/24/365)},void(0===this.totalSecsLeft?(this.stop(),this.dispatchEvent("finish")):this.dispatchEvent("update")))},dispatchEvent:function(b){var d=a.Event(b+".countdown");d.finalDate=this.finalDate,d.offset=a.extend({},this.offset),d.strftime=c(this.offset),this.$el.trigger(d)}}),a.fn.countdown=function(){var b=Array.prototype.slice.call(arguments,0);return this.each(function(){var c=a(this).data("countdown-instance");if(void 0!==c){var d=f[c],e=b[0];i.prototype.hasOwnProperty(e)?d[e].apply(d,b.slice(1)):null===String(e).match(/^[$A-Z_][0-9A-Z_$]*$/i)?(d.setFinalDate.call(d,e),d.start()):a.error("Method %s does not exist on jQuery.countdown".replace(/\%s/gi,e))}else new i(this,b[0],b[1])})}});
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/js/jquery.magnific-popup.min.js b/sm-shop/src/main/webapp/resources/templates/generic/js/jquery.magnific-popup.min.js
new file mode 100644
index 0000000..6ee3a3b
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/js/jquery.magnific-popup.min.js
@@ -0,0 +1,4 @@
+/*! Magnific Popup - v1.1.0 - 2016-02-20
+* http://dimsemenov.com/plugins/magnific-popup/
+* Copyright (c) 2016 Dmitry Semenov; */
+!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):window.jQuery||window.Zepto)}(function(a){var b,c,d,e,f,g,h="Close",i="BeforeClose",j="AfterClose",k="BeforeAppend",l="MarkupParse",m="Open",n="Change",o="mfp",p="."+o,q="mfp-ready",r="mfp-removing",s="mfp-prevent-close",t=function(){},u=!!window.jQuery,v=a(window),w=function(a,c){b.ev.on(o+a+p,c)},x=function(b,c,d,e){var f=document.createElement("div");return f.className="mfp-"+b,d&&(f.innerHTML=d),e?c&&c.appendChild(f):(f=a(f),c&&f.appendTo(c)),f},y=function(c,d){b.ev.triggerHandler(o+c,d),b.st.callbacks&&(c=c.charAt(0).toLowerCase()+c.slice(1),b.st.callbacks[c]&&b.st.callbacks[c].apply(b,a.isArray(d)?d:[d]))},z=function(c){return c===g&&b.currTemplate.closeBtn||(b.currTemplate.closeBtn=a(b.st.closeMarkup.replace("%title%",b.st.tClose)),g=c),b.currTemplate.closeBtn},A=function(){a.magnificPopup.instance||(b=new t,b.init(),a.magnificPopup.instance=b)},B=function(){var a=document.createElement("p").style,b=["ms","O","Moz","Webkit"];if(void 0!==a.transition)return!0;for(;b.length;)if(b.pop()+"Transition"in a)return!0;return!1};t.prototype={constructor:t,init:function(){var c=navigator.appVersion;b.isLowIE=b.isIE8=document.all&&!document.addEventListener,b.isAndroid=/android/gi.test(c),b.isIOS=/iphone|ipad|ipod/gi.test(c),b.supportsTransition=B(),b.probablyMobile=b.isAndroid||b.isIOS||/(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent),d=a(document),b.popupsCache={}},open:function(c){var e;if(c.isObj===!1){b.items=c.items.toArray(),b.index=0;var g,h=c.items;for(e=0;e<h.length;e++)if(g=h[e],g.parsed&&(g=g.el[0]),g===c.el[0]){b.index=e;break}}else b.items=a.isArray(c.items)?c.items:[c.items],b.index=c.index||0;if(b.isOpen)return void b.updateItemHTML();b.types=[],f="",c.mainEl&&c.mainEl.length?b.ev=c.mainEl.eq(0):b.ev=d,c.key?(b.popupsCache[c.key]||(b.popupsCache[c.key]={}),b.currTemplate=b.popupsCache[c.key]):b.currTemplate={},b.st=a.extend(!0,{},a.magnificPopup.defaults,c),b.fixedContentPos="auto"===b.st.fixedContentPos?!b.probablyMobile:b.st.fixedContentPos,b.st.modal&&(b.st.closeOnContentClick=!1,b.st.closeOnBgClick=!1,b.st.showCloseBtn=!1,b.st.enableEscapeKey=!1),b.bgOverlay||(b.bgOverlay=x("bg").on("click"+p,function(){b.close()}),b.wrap=x("wrap").attr("tabindex",-1).on("click"+p,function(a){b._checkIfClose(a.target)&&b.close()}),b.container=x("container",b.wrap)),b.contentContainer=x("content"),b.st.preloader&&(b.preloader=x("preloader",b.container,b.st.tLoading));var i=a.magnificPopup.modules;for(e=0;e<i.length;e++){var j=i[e];j=j.charAt(0).toUpperCase()+j.slice(1),b["init"+j].call(b)}y("BeforeOpen"),b.st.showCloseBtn&&(b.st.closeBtnInside?(w(l,function(a,b,c,d){c.close_replaceWith=z(d.type)}),f+=" mfp-close-btn-in"):b.wrap.append(z())),b.st.alignTop&&(f+=" mfp-align-top"),b.fixedContentPos?b.wrap.css({overflow:b.st.overflowY,overflowX:"hidden",overflowY:b.st.overflowY}):b.wrap.css({top:v.scrollTop(),position:"absolute"}),(b.st.fixedBgPos===!1||"auto"===b.st.fixedBgPos&&!b.fixedContentPos)&&b.bgOverlay.css({height:d.height(),position:"absolute"}),b.st.enableEscapeKey&&d.on("keyup"+p,function(a){27===a.keyCode&&b.close()}),v.on("resize"+p,function(){b.updateSize()}),b.st.closeOnContentClick||(f+=" mfp-auto-cursor"),f&&b.wrap.addClass(f);var k=b.wH=v.height(),n={};if(b.fixedContentPos&&b._hasScrollBar(k)){var o=b._getScrollbarSize();o&&(n.marginRight=o)}b.fixedContentPos&&(b.isIE7?a("body, html").css("overflow","hidden"):n.overflow="hidden");var r=b.st.mainClass;return b.isIE7&&(r+=" mfp-ie7"),r&&b._addClassToMFP(r),b.updateItemHTML(),y("BuildControls"),a("html").css(n),b.bgOverlay.add(b.wrap).prependTo(b.st.prependTo||a(document.body)),b._lastFocusedEl=document.activeElement,setTimeout(function(){b.content?(b._addClassToMFP(q),b._setFocus()):b.bgOverlay.addClass(q),d.on("focusin"+p,b._onFocusIn)},16),b.isOpen=!0,b.updateSize(k),y(m),c},close:function(){b.isOpen&&(y(i),b.isOpen=!1,b.st.removalDelay&&!b.isLowIE&&b.supportsTransition?(b._addClassToMFP(r),setTimeout(function(){b._close()},b.st.removalDelay)):b._close())},_close:function(){y(h);var c=r+" "+q+" ";if(b.bgOverlay.detach(),b.wrap.detach(),b.container.empty(),b.st.mainClass&&(c+=b.st.mainClass+" "),b._removeClassFromMFP(c),b.fixedContentPos){var e={marginRight:""};b.isIE7?a("body, html").css("overflow",""):e.overflow="",a("html").css(e)}d.off("keyup"+p+" focusin"+p),b.ev.off(p),b.wrap.attr("class","mfp-wrap").removeAttr("style"),b.bgOverlay.attr("class","mfp-bg"),b.container.attr("class","mfp-container"),!b.st.showCloseBtn||b.st.closeBtnInside&&b.currTemplate[b.currItem.type]!==!0||b.currTemplate.closeBtn&&b.currTemplate.closeBtn.detach(),b.st.autoFocusLast&&b._lastFocusedEl&&a(b._lastFocusedEl).focus(),b.currItem=null,b.content=null,b.currTemplate=null,b.prevHeight=0,y(j)},updateSize:function(a){if(b.isIOS){var c=document.documentElement.clientWidth/window.innerWidth,d=window.innerHeight*c;b.wrap.css("height",d),b.wH=d}else b.wH=a||v.height();b.fixedContentPos||b.wrap.css("height",b.wH),y("Resize")},updateItemHTML:function(){var c=b.items[b.index];b.contentContainer.detach(),b.content&&b.content.detach(),c.parsed||(c=b.parseEl(b.index));var d=c.type;if(y("BeforeChange",[b.currItem?b.currItem.type:"",d]),b.currItem=c,!b.currTemplate[d]){var f=b.st[d]?b.st[d].markup:!1;y("FirstMarkupParse",f),f?b.currTemplate[d]=a(f):b.currTemplate[d]=!0}e&&e!==c.type&&b.container.removeClass("mfp-"+e+"-holder");var g=b["get"+d.charAt(0).toUpperCase()+d.slice(1)](c,b.currTemplate[d]);b.appendContent(g,d),c.preloaded=!0,y(n,c),e=c.type,b.container.prepend(b.contentContainer),y("AfterChange")},appendContent:function(a,c){b.content=a,a?b.st.showCloseBtn&&b.st.closeBtnInside&&b.currTemplate[c]===!0?b.content.find(".mfp-close").length||b.content.append(z()):b.content=a:b.content="",y(k),b.container.addClass("mfp-"+c+"-holder"),b.contentContainer.append(b.content)},parseEl:function(c){var d,e=b.items[c];if(e.tagName?e={el:a(e)}:(d=e.type,e={data:e,src:e.src}),e.el){for(var f=b.types,g=0;g<f.length;g++)if(e.el.hasClass("mfp-"+f[g])){d=f[g];break}e.src=e.el.attr("data-mfp-src"),e.src||(e.src=e.el.attr("href"))}return e.type=d||b.st.type||"inline",e.index=c,e.parsed=!0,b.items[c]=e,y("ElementParse",e),b.items[c]},addGroup:function(a,c){var d=function(d){d.mfpEl=this,b._openClick(d,a,c)};c||(c={});var e="click.magnificPopup";c.mainEl=a,c.items?(c.isObj=!0,a.off(e).on(e,d)):(c.isObj=!1,c.delegate?a.off(e).on(e,c.delegate,d):(c.items=a,a.off(e).on(e,d)))},_openClick:function(c,d,e){var f=void 0!==e.midClick?e.midClick:a.magnificPopup.defaults.midClick;if(f||!(2===c.which||c.ctrlKey||c.metaKey||c.altKey||c.shiftKey)){var g=void 0!==e.disableOn?e.disableOn:a.magnificPopup.defaults.disableOn;if(g)if(a.isFunction(g)){if(!g.call(b))return!0}else if(v.width()<g)return!0;c.type&&(c.preventDefault(),b.isOpen&&c.stopPropagation()),e.el=a(c.mfpEl),e.delegate&&(e.items=d.find(e.delegate)),b.open(e)}},updateStatus:function(a,d){if(b.preloader){c!==a&&b.container.removeClass("mfp-s-"+c),d||"loading"!==a||(d=b.st.tLoading);var e={status:a,text:d};y("UpdateStatus",e),a=e.status,d=e.text,b.preloader.html(d),b.preloader.find("a").on("click",function(a){a.stopImmediatePropagation()}),b.container.addClass("mfp-s-"+a),c=a}},_checkIfClose:function(c){if(!a(c).hasClass(s)){var d=b.st.closeOnContentClick,e=b.st.closeOnBgClick;if(d&&e)return!0;if(!b.content||a(c).hasClass("mfp-close")||b.preloader&&c===b.preloader[0])return!0;if(c===b.content[0]||a.contains(b.content[0],c)){if(d)return!0}else if(e&&a.contains(document,c))return!0;return!1}},_addClassToMFP:function(a){b.bgOverlay.addClass(a),b.wrap.addClass(a)},_removeClassFromMFP:function(a){this.bgOverlay.removeClass(a),b.wrap.removeClass(a)},_hasScrollBar:function(a){return(b.isIE7?d.height():document.body.scrollHeight)>(a||v.height())},_setFocus:function(){(b.st.focus?b.content.find(b.st.focus).eq(0):b.wrap).focus()},_onFocusIn:function(c){return c.target===b.wrap[0]||a.contains(b.wrap[0],c.target)?void 0:(b._setFocus(),!1)},_parseMarkup:function(b,c,d){var e;d.data&&(c=a.extend(d.data,c)),y(l,[b,c,d]),a.each(c,function(c,d){if(void 0===d||d===!1)return!0;if(e=c.split("_"),e.length>1){var f=b.find(p+"-"+e[0]);if(f.length>0){var g=e[1];"replaceWith"===g?f[0]!==d[0]&&f.replaceWith(d):"img"===g?f.is("img")?f.attr("src",d):f.replaceWith(a("<img>").attr("src",d).attr("class",f.attr("class"))):f.attr(e[1],d)}}else b.find(p+"-"+c).html(d)})},_getScrollbarSize:function(){if(void 0===b.scrollbarSize){var a=document.createElement("div");a.style.cssText="width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;",document.body.appendChild(a),b.scrollbarSize=a.offsetWidth-a.clientWidth,document.body.removeChild(a)}return b.scrollbarSize}},a.magnificPopup={instance:null,proto:t.prototype,modules:[],open:function(b,c){return A(),b=b?a.extend(!0,{},b):{},b.isObj=!0,b.index=c||0,this.instance.open(b)},close:function(){return a.magnificPopup.instance&&a.magnificPopup.instance.close()},registerModule:function(b,c){c.options&&(a.magnificPopup.defaults[b]=c.options),a.extend(this.proto,c.proto),this.modules.push(b)},defaults:{disableOn:0,key:null,midClick:!1,mainClass:"",preloader:!0,focus:"",closeOnContentClick:!1,closeOnBgClick:!0,closeBtnInside:!0,showCloseBtn:!0,enableEscapeKey:!0,modal:!1,alignTop:!1,removalDelay:0,prependTo:null,fixedContentPos:"auto",fixedBgPos:"auto",overflowY:"auto",closeMarkup:'<button title="%title%" type="button" class="mfp-close">×</button>',tClose:"Close (Esc)",tLoading:"Loading...",autoFocusLast:!0}},a.fn.magnificPopup=function(c){A();var d=a(this);if("string"==typeof c)if("open"===c){var e,f=u?d.data("magnificPopup"):d[0].magnificPopup,g=parseInt(arguments[1],10)||0;f.items?e=f.items[g]:(e=d,f.delegate&&(e=e.find(f.delegate)),e=e.eq(g)),b._openClick({mfpEl:e},d,f)}else b.isOpen&&b[c].apply(b,Array.prototype.slice.call(arguments,1));else c=a.extend(!0,{},c),u?d.data("magnificPopup",c):d[0].magnificPopup=c,b.addGroup(d,c);return d};var C,D,E,F="inline",G=function(){E&&(D.after(E.addClass(C)).detach(),E=null)};a.magnificPopup.registerModule(F,{options:{hiddenClass:"hide",markup:"",tNotFound:"Content not found"},proto:{initInline:function(){b.types.push(F),w(h+"."+F,function(){G()})},getInline:function(c,d){if(G(),c.src){var e=b.st.inline,f=a(c.src);if(f.length){var g=f[0].parentNode;g&&g.tagName&&(D||(C=e.hiddenClass,D=x(C),C="mfp-"+C),E=f.after(D).detach().removeClass(C)),b.updateStatus("ready")}else b.updateStatus("error",e.tNotFound),f=a("<div>");return c.inlineElement=f,f}return b.updateStatus("ready"),b._parseMarkup(d,{},c),d}}});var H,I="ajax",J=function(){H&&a(document.body).removeClass(H)},K=function(){J(),b.req&&b.req.abort()};a.magnificPopup.registerModule(I,{options:{settings:null,cursor:"mfp-ajax-cur",tError:'<a href="%url%">The content</a> could not be loaded.'},proto:{initAjax:function(){b.types.push(I),H=b.st.ajax.cursor,w(h+"."+I,K),w("BeforeChange."+I,K)},getAjax:function(c){H&&a(document.body).addClass(H),b.updateStatus("loading");var d=a.extend({url:c.src,success:function(d,e,f){var g={data:d,xhr:f};y("ParseAjax",g),b.appendContent(a(g.data),I),c.finished=!0,J(),b._setFocus(),setTimeout(function(){b.wrap.addClass(q)},16),b.updateStatus("ready"),y("AjaxContentAdded")},error:function(){J(),c.finished=c.loadError=!0,b.updateStatus("error",b.st.ajax.tError.replace("%url%",c.src))}},b.st.ajax.settings);return b.req=a.ajax(d),""}}});var L,M=function(c){if(c.data&&void 0!==c.data.title)return c.data.title;var d=b.st.image.titleSrc;if(d){if(a.isFunction(d))return d.call(b,c);if(c.el)return c.el.attr(d)||""}return""};a.magnificPopup.registerModule("image",{options:{markup:'<div class="mfp-figure"><div class="mfp-close"></div><figure><div class="mfp-img"></div><figcaption><div class="mfp-bottom-bar"><div class="mfp-title"></div><div class="mfp-counter"></div></div></figcaption></figure></div>',cursor:"mfp-zoom-out-cur",titleSrc:"title",verticalFit:!0,tError:'<a href="%url%">The image</a> could not be loaded.'},proto:{initImage:function(){var c=b.st.image,d=".image";b.types.push("image"),w(m+d,function(){"image"===b.currItem.type&&c.cursor&&a(document.body).addClass(c.cursor)}),w(h+d,function(){c.cursor&&a(document.body).removeClass(c.cursor),v.off("resize"+p)}),w("Resize"+d,b.resizeImage),b.isLowIE&&w("AfterChange",b.resizeImage)},resizeImage:function(){var a=b.currItem;if(a&&a.img&&b.st.image.verticalFit){var c=0;b.isLowIE&&(c=parseInt(a.img.css("padding-top"),10)+parseInt(a.img.css("padding-bottom"),10)),a.img.css("max-height",b.wH-c)}},_onImageHasSize:function(a){a.img&&(a.hasSize=!0,L&&clearInterval(L),a.isCheckingImgSize=!1,y("ImageHasSize",a),a.imgHidden&&(b.content&&b.content.removeClass("mfp-loading"),a.imgHidden=!1))},findImageSize:function(a){var c=0,d=a.img[0],e=function(f){L&&clearInterval(L),L=setInterval(function(){return d.naturalWidth>0?void b._onImageHasSize(a):(c>200&&clearInterval(L),c++,void(3===c?e(10):40===c?e(50):100===c&&e(500)))},f)};e(1)},getImage:function(c,d){var e=0,f=function(){c&&(c.img[0].complete?(c.img.off(".mfploader"),c===b.currItem&&(b._onImageHasSize(c),b.updateStatus("ready")),c.hasSize=!0,c.loaded=!0,y("ImageLoadComplete")):(e++,200>e?setTimeout(f,100):g()))},g=function(){c&&(c.img.off(".mfploader"),c===b.currItem&&(b._onImageHasSize(c),b.updateStatus("error",h.tError.replace("%url%",c.src))),c.hasSize=!0,c.loaded=!0,c.loadError=!0)},h=b.st.image,i=d.find(".mfp-img");if(i.length){var j=document.createElement("img");j.className="mfp-img",c.el&&c.el.find("img").length&&(j.alt=c.el.find("img").attr("alt")),c.img=a(j).on("load.mfploader",f).on("error.mfploader",g),j.src=c.src,i.is("img")&&(c.img=c.img.clone()),j=c.img[0],j.naturalWidth>0?c.hasSize=!0:j.width||(c.hasSize=!1)}return b._parseMarkup(d,{title:M(c),img_replaceWith:c.img},c),b.resizeImage(),c.hasSize?(L&&clearInterval(L),c.loadError?(d.addClass("mfp-loading"),b.updateStatus("error",h.tError.replace("%url%",c.src))):(d.removeClass("mfp-loading"),b.updateStatus("ready")),d):(b.updateStatus("loading"),c.loading=!0,c.hasSize||(c.imgHidden=!0,d.addClass("mfp-loading"),b.findImageSize(c)),d)}}});var N,O=function(){return void 0===N&&(N=void 0!==document.createElement("p").style.MozTransform),N};a.magnificPopup.registerModule("zoom",{options:{enabled:!1,easing:"ease-in-out",duration:300,opener:function(a){return a.is("img")?a:a.find("img")}},proto:{initZoom:function(){var a,c=b.st.zoom,d=".zoom";if(c.enabled&&b.supportsTransition){var e,f,g=c.duration,j=function(a){var b=a.clone().removeAttr("style").removeAttr("class").addClass("mfp-animated-image"),d="all "+c.duration/1e3+"s "+c.easing,e={position:"fixed",zIndex:9999,left:0,top:0,"-webkit-backface-visibility":"hidden"},f="transition";return e["-webkit-"+f]=e["-moz-"+f]=e["-o-"+f]=e[f]=d,b.css(e),b},k=function(){b.content.css("visibility","visible")};w("BuildControls"+d,function(){if(b._allowZoom()){if(clearTimeout(e),b.content.css("visibility","hidden"),a=b._getItemToZoom(),!a)return void k();f=j(a),f.css(b._getOffset()),b.wrap.append(f),e=setTimeout(function(){f.css(b._getOffset(!0)),e=setTimeout(function(){k(),setTimeout(function(){f.remove(),a=f=null,y("ZoomAnimationEnded")},16)},g)},16)}}),w(i+d,function(){if(b._allowZoom()){if(clearTimeout(e),b.st.removalDelay=g,!a){if(a=b._getItemToZoom(),!a)return;f=j(a)}f.css(b._getOffset(!0)),b.wrap.append(f),b.content.css("visibility","hidden"),setTimeout(function(){f.css(b._getOffset())},16)}}),w(h+d,function(){b._allowZoom()&&(k(),f&&f.remove(),a=null)})}},_allowZoom:function(){return"image"===b.currItem.type},_getItemToZoom:function(){return b.currItem.hasSize?b.currItem.img:!1},_getOffset:function(c){var d;d=c?b.currItem.img:b.st.zoom.opener(b.currItem.el||b.currItem);var e=d.offset(),f=parseInt(d.css("padding-top"),10),g=parseInt(d.css("padding-bottom"),10);e.top-=a(window).scrollTop()-f;var h={width:d.width(),height:(u?d.innerHeight():d[0].offsetHeight)-g-f};return O()?h["-moz-transform"]=h.transform="translate("+e.left+"px,"+e.top+"px)":(h.left=e.left,h.top=e.top),h}}});var P="iframe",Q="//about:blank",R=function(a){if(b.currTemplate[P]){var c=b.currTemplate[P].find("iframe");c.length&&(a||(c[0].src=Q),b.isIE8&&c.css("display",a?"block":"none"))}};a.magnificPopup.registerModule(P,{options:{markup:'<div class="mfp-iframe-scaler"><div class="mfp-close"></div><iframe class="mfp-iframe" src="//about:blank" frameborder="0" allowfullscreen></iframe></div>',srcAction:"iframe_src",patterns:{youtube:{index:"youtube.com",id:"v=",src:"//www.youtube.com/embed/%id%?autoplay=1"},vimeo:{index:"vimeo.com/",id:"/",src:"//player.vimeo.com/video/%id%?autoplay=1"},gmaps:{index:"//maps.google.",src:"%id%&output=embed"}}},proto:{initIframe:function(){b.types.push(P),w("BeforeChange",function(a,b,c){b!==c&&(b===P?R():c===P&&R(!0))}),w(h+"."+P,function(){R()})},getIframe:function(c,d){var e=c.src,f=b.st.iframe;a.each(f.patterns,function(){return e.indexOf(this.index)>-1?(this.id&&(e="string"==typeof this.id?e.substr(e.lastIndexOf(this.id)+this.id.length,e.length):this.id.call(this,e)),e=this.src.replace("%id%",e),!1):void 0});var g={};return f.srcAction&&(g[f.srcAction]=e),b._parseMarkup(d,g,c),b.updateStatus("ready"),d}}});var S=function(a){var c=b.items.length;return a>c-1?a-c:0>a?c+a:a},T=function(a,b,c){return a.replace(/%curr%/gi,b+1).replace(/%total%/gi,c)};a.magnificPopup.registerModule("gallery",{options:{enabled:!1,arrowMarkup:'<button title="%title%" type="button" class="mfp-arrow mfp-arrow-%dir%"></button>',preload:[0,2],navigateByImgClick:!0,arrows:!0,tPrev:"Previous (Left arrow key)",tNext:"Next (Right arrow key)",tCounter:"%curr% of %total%"},proto:{initGallery:function(){var c=b.st.gallery,e=".mfp-gallery";return b.direction=!0,c&&c.enabled?(f+=" mfp-gallery",w(m+e,function(){c.navigateByImgClick&&b.wrap.on("click"+e,".mfp-img",function(){return b.items.length>1?(b.next(),!1):void 0}),d.on("keydown"+e,function(a){37===a.keyCode?b.prev():39===a.keyCode&&b.next()})}),w("UpdateStatus"+e,function(a,c){c.text&&(c.text=T(c.text,b.currItem.index,b.items.length))}),w(l+e,function(a,d,e,f){var g=b.items.length;e.counter=g>1?T(c.tCounter,f.index,g):""}),w("BuildControls"+e,function(){if(b.items.length>1&&c.arrows&&!b.arrowLeft){var d=c.arrowMarkup,e=b.arrowLeft=a(d.replace(/%title%/gi,c.tPrev).replace(/%dir%/gi,"left")).addClass(s),f=b.arrowRight=a(d.replace(/%title%/gi,c.tNext).replace(/%dir%/gi,"right")).addClass(s);e.click(function(){b.prev()}),f.click(function(){b.next()}),b.container.append(e.add(f))}}),w(n+e,function(){b._preloadTimeout&&clearTimeout(b._preloadTimeout),b._preloadTimeout=setTimeout(function(){b.preloadNearbyImages(),b._preloadTimeout=null},16)}),void w(h+e,function(){d.off(e),b.wrap.off("click"+e),b.arrowRight=b.arrowLeft=null})):!1},next:function(){b.direction=!0,b.index=S(b.index+1),b.updateItemHTML()},prev:function(){b.direction=!1,b.index=S(b.index-1),b.updateItemHTML()},goTo:function(a){b.direction=a>=b.index,b.index=a,b.updateItemHTML()},preloadNearbyImages:function(){var a,c=b.st.gallery.preload,d=Math.min(c[0],b.items.length),e=Math.min(c[1],b.items.length);for(a=1;a<=(b.direction?e:d);a++)b._preloadItem(b.index+a);for(a=1;a<=(b.direction?d:e);a++)b._preloadItem(b.index-a)},_preloadItem:function(c){if(c=S(c),!b.items[c].preloaded){var d=b.items[c];d.parsed||(d=b.parseEl(c)),y("LazyLoad",d),"image"===d.type&&(d.img=a('<img class="mfp-img" />').on("load.mfploader",function(){d.hasSize=!0}).on("error.mfploader",function(){d.hasSize=!0,d.loadError=!0,y("LazyLoadError",d)}).attr("src",d.src)),d.preloaded=!0}}}});var U="retina";a.magnificPopup.registerModule(U,{options:{replaceSrc:function(a){return a.src.replace(/\.\w+$/,function(a){return"@2x"+a})},ratio:1},proto:{initRetina:function(){if(window.devicePixelRatio>1){var a=b.st.retina,c=a.ratio;c=isNaN(c)?c():c,c>1&&(w("ImageHasSize."+U,function(a,b){b.img.css({"max-width":b.img[0].naturalWidth/c,width:"100%"})}),w("ElementParse."+U,function(b,d){d.src=a.replaceSrc(d,c)}))}}}}),A()});
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/js/jquery.meanmenu.js b/sm-shop/src/main/webapp/resources/templates/generic/js/jquery.meanmenu.js
new file mode 100644
index 0000000..81efd1e
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/js/jquery.meanmenu.js
@@ -0,0 +1,285 @@
+/*!
+* jQuery meanMenu v2.0.8
+* @Copyright (C) 2012-2014 Chris Wharton @ MeanThemes (https://github.com/meanthemes/meanMenu)
+*
+*/
+/*
+* 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 3 of the License, or
+* (at your option) any later version.
+*
+* THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT
+* HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED,
+* INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR
+* FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE
+* OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS,
+* COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.COPYRIGHT HOLDERS WILL NOT
+* BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL
+* DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see <http://gnu.org/licenses/>.
+*
+* Find more information at http://www.meanthemes.com/plugins/meanmenu/
+*
+*/
+(function ($) {
+ "use strict";
+ $.fn.meanmenu = function (options) {
+ var defaults = {
+ meanMenuTarget: jQuery(this), // Target the current HTML markup you wish to replace
+ meanMenuContainer: '.mobile-menu-area .container', // Choose where meanmenu will be placed within the HTML
+ meanMenuClose: "X", // single character you want to represent the close menu button
+ meanMenuCloseSize: "18px", // set font size of close button
+ meanMenuOpen: "<span /><span /><span />", // text/markup you want when menu is closed
+ meanRevealPosition: "right", // left right or center positions
+ meanRevealPositionDistance: "0", // Tweak the position of the menu
+ meanRevealColour: "", // override CSS colours for the reveal background
+ meanScreenWidth: "767", // set the screen width you want meanmenu to kick in at
+ meanNavPush: "", // set a height here in px, em or % if you want to budge your layout now the navigation is missing.
+ meanShowChildren: true, // true to show children in the menu, false to hide them
+ meanExpandableChildren: true, // true to allow expand/collapse children
+ meanExpand: "+", // single character you want to represent the expand for ULs
+ meanContract: "-", // single character you want to represent the contract for ULs
+ meanRemoveAttrs: false, // true to remove classes and IDs, false to keep them
+ onePage: false, // set to true for one page sites
+ meanDisplay: "block", // override display method for table cell based layouts e.g. table-cell
+ removeElements: "" // set to hide page elements
+ };
+ options = $.extend(defaults, options);
+
+ // get browser width
+ var currentWidth = window.innerWidth || document.documentElement.clientWidth;
+
+ return this.each(function () {
+ var meanMenu = options.meanMenuTarget;
+ var meanContainer = options.meanMenuContainer;
+ var meanMenuClose = options.meanMenuClose;
+ var meanMenuCloseSize = options.meanMenuCloseSize;
+ var meanMenuOpen = options.meanMenuOpen;
+ var meanRevealPosition = options.meanRevealPosition;
+ var meanRevealPositionDistance = options.meanRevealPositionDistance;
+ var meanRevealColour = options.meanRevealColour;
+ var meanScreenWidth = options.meanScreenWidth;
+ var meanNavPush = options.meanNavPush;
+ var meanRevealClass = ".meanmenu-reveal";
+ var meanShowChildren = options.meanShowChildren;
+ var meanExpandableChildren = options.meanExpandableChildren;
+ var meanExpand = options.meanExpand;
+ var meanContract = options.meanContract;
+ var meanRemoveAttrs = options.meanRemoveAttrs;
+ var onePage = options.onePage;
+ var meanDisplay = options.meanDisplay;
+ var removeElements = options.removeElements;
+
+ //detect known mobile/tablet usage
+ var isMobile = false;
+ if ( (navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i)) || (navigator.userAgent.match(/iPad/i)) || (navigator.userAgent.match(/Android/i)) || (navigator.userAgent.match(/Blackberry/i)) || (navigator.userAgent.match(/Windows Phone/i)) ) {
+ isMobile = true;
+ }
+
+ if ( (navigator.userAgent.match(/MSIE 8/i)) || (navigator.userAgent.match(/MSIE 7/i)) ) {
+ // add scrollbar for IE7 & 8 to stop breaking resize function on small content sites
+ jQuery('html').css("overflow-y" , "scroll");
+ }
+
+ var meanRevealPos = "";
+ var meanCentered = function() {
+ if (meanRevealPosition === "center") {
+ var newWidth = window.innerWidth || document.documentElement.clientWidth;
+ var meanCenter = ( (newWidth/2)-22 )+"px";
+ meanRevealPos = "left:" + meanCenter + ";right:auto;";
+
+ if (!isMobile) {
+ jQuery('.meanmenu-reveal').css("left",meanCenter);
+ } else {
+ jQuery('.meanmenu-reveal').animate({
+ left: meanCenter
+ });
+ }
+ }
+ };
+
+ var menuOn = false;
+ var meanMenuExist = false;
+
+
+ if (meanRevealPosition === "right") {
+ meanRevealPos = "right:" + meanRevealPositionDistance + ";left:auto;";
+ }
+ if (meanRevealPosition === "left") {
+ meanRevealPos = "left:" + meanRevealPositionDistance + ";right:auto;";
+ }
+ // run center function
+ meanCentered();
+
+ // set all styles for mean-reveal
+ var $navreveal = "";
+
+ var meanInner = function() {
+ // get last class name
+ if (jQuery($navreveal).is(".meanmenu-reveal.meanclose")) {
+ $navreveal.html(meanMenuClose);
+ } else {
+ $navreveal.html(meanMenuOpen);
+ }
+ };
+
+ // re-instate original nav (and call this on window.width functions)
+ var meanOriginal = function() {
+ jQuery('.mean-bar,.mean-push').remove();
+ jQuery(meanContainer).removeClass("mean-container");
+ jQuery(meanMenu).css('display', meanDisplay);
+ menuOn = false;
+ meanMenuExist = false;
+ jQuery(removeElements).removeClass('mean-remove');
+ };
+
+ // navigation reveal
+ var showMeanMenu = function() {
+ var meanStyles = "background:"+meanRevealColour+";color:"+meanRevealColour+";"+meanRevealPos;
+ if (currentWidth <= meanScreenWidth) {
+ jQuery(removeElements).addClass('mean-remove');
+ meanMenuExist = true;
+ // add class to body so we don't need to worry about media queries here, all CSS is wrapped in '.mean-container'
+ jQuery(meanContainer).addClass("mean-container");
+ jQuery('.mean-container').prepend('<div class="mean-bar"><a href="#nav" class="meanmenu-reveal" style="'+meanStyles+'">Show Navigation</a><nav class="mean-nav"></nav></div>');
+
+ //push meanMenu navigation into .mean-nav
+ var meanMenuContents = jQuery(meanMenu).html();
+ jQuery('.mean-nav').html(meanMenuContents);
+
+ // remove all classes from EVERYTHING inside meanmenu nav
+ if(meanRemoveAttrs) {
+ jQuery('nav.mean-nav ul, nav.mean-nav ul *').each(function() {
+ // First check if this has mean-remove class
+ if (jQuery(this).is('.mean-remove')) {
+ jQuery(this).attr('class', 'mean-remove');
+ } else {
+ jQuery(this).removeAttr("class");
+ }
+ jQuery(this).removeAttr("id");
+ });
+ }
+
+ // push in a holder div (this can be used if removal of nav is causing layout issues)
+ jQuery(meanMenu).before('<div class="mean-push" />');
+ jQuery('.mean-push').css("margin-top",meanNavPush);
+
+ // hide current navigation and reveal mean nav link
+ jQuery(meanMenu).hide();
+ jQuery(".meanmenu-reveal").show();
+
+ // turn 'X' on or off
+ jQuery(meanRevealClass).html(meanMenuOpen);
+ $navreveal = jQuery(meanRevealClass);
+
+ //hide mean-nav ul
+ jQuery('.mean-nav ul').hide();
+
+ // hide sub nav
+ if(meanShowChildren) {
+ // allow expandable sub nav(s)
+ if(meanExpandableChildren){
+ jQuery('.mean-nav ul ul').each(function() {
+ if(jQuery(this).children().length){
+ jQuery(this,'li:first').parent().append('<a class="mean-expand" href="#" style="font-size: '+ meanMenuCloseSize +'">'+ meanExpand +'</a>');
+ }
+ });
+ jQuery('.mean-expand').on("click",function(e){
+ e.preventDefault();
+ if (jQuery(this).hasClass("mean-clicked")) {
+ jQuery(this).text(meanExpand);
+ jQuery(this).prev('ul').slideUp(300, function(){});
+ } else {
+ jQuery(this).text(meanContract);
+ jQuery(this).prev('ul').slideDown(300, function(){});
+ }
+ jQuery(this).toggleClass("mean-clicked");
+ });
+ } else {
+ jQuery('.mean-nav ul ul').show();
+ }
+ } else {
+ jQuery('.mean-nav ul ul').hide();
+ }
+
+ // add last class to tidy up borders
+ jQuery('.mean-nav ul li').last().addClass('mean-last');
+ $navreveal.removeClass("meanclose");
+ jQuery($navreveal).click(function(e){
+ e.preventDefault();
+ if( menuOn === false ) {
+ $navreveal.css("text-align", "center");
+ $navreveal.css("text-indent", "0");
+ $navreveal.css("font-size", meanMenuCloseSize);
+ jQuery('.mean-nav ul:first').slideDown();
+ menuOn = true;
+ } else {
+ jQuery('.mean-nav ul:first').slideUp();
+ menuOn = false;
+ }
+ $navreveal.toggleClass("meanclose");
+ meanInner();
+ jQuery(removeElements).addClass('mean-remove');
+ });
+
+ // for one page websites, reset all variables...
+ if ( onePage ) {
+ jQuery('.mean-nav ul > li > a:first-child').on( "click" , function () {
+ jQuery('.mean-nav ul:first').slideUp();
+ menuOn = false;
+ jQuery($navreveal).toggleClass("meanclose").html(meanMenuOpen);
+ });
+ }
+ } else {
+ meanOriginal();
+ }
+ };
+
+ if (!isMobile) {
+ // reset menu on resize above meanScreenWidth
+ jQuery(window).resize(function () {
+ currentWidth = window.innerWidth || document.documentElement.clientWidth;
+ if (currentWidth > meanScreenWidth) {
+ meanOriginal();
+ } else {
+ meanOriginal();
+ }
+ if (currentWidth <= meanScreenWidth) {
+ showMeanMenu();
+ meanCentered();
+ } else {
+ meanOriginal();
+ }
+ });
+ }
+
+ jQuery(window).resize(function () {
+ // get browser width
+ currentWidth = window.innerWidth || document.documentElement.clientWidth;
+
+ if (!isMobile) {
+ meanOriginal();
+ if (currentWidth <= meanScreenWidth) {
+ showMeanMenu();
+ meanCentered();
+ }
+ } else {
+ meanCentered();
+ if (currentWidth <= meanScreenWidth) {
+ if (meanMenuExist === false) {
+ showMeanMenu();
+ }
+ } else {
+ meanOriginal();
+ }
+ }
+ });
+
+ // run main menuMenu function on load
+ showMeanMenu();
+ });
+ };
+})(jQuery);
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/js/jquery.nivo.slider.js b/sm-shop/src/main/webapp/resources/templates/generic/js/jquery.nivo.slider.js
new file mode 100644
index 0000000..70a33ae
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/js/jquery.nivo.slider.js
@@ -0,0 +1,662 @@
+/*
+ * jQuery Nivo Slider v3.2
+ * http://nivo.dev7studios.com
+ *
+ * Copyright 2012, Dev7studios
+ * Free to use and abuse under the MIT license.
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+
+(function($) {
+ var NivoSlider = function(element, options){
+ // Defaults are below
+ var settings = $.extend({}, $.fn.nivoSlider.defaults, options);
+
+ // Useful variables. Play carefully.
+ var vars = {
+ currentSlide: 0,
+ currentImage: '',
+ totalSlides: 0,
+ running: false,
+ paused: false,
+ stop: false,
+ controlNavEl: false
+ };
+
+ // Get this slider
+ var slider = $(element);
+ slider.data('nivo:vars', vars).addClass('nivoSlider');
+
+ // Find our slider children
+ var kids = slider.children();
+ kids.each(function() {
+ var child = $(this);
+ var link = '';
+ if(!child.is('img')){
+ if(child.is('a')){
+ child.addClass('nivo-imageLink');
+ link = child;
+ }
+ child = child.find('img:first');
+ }
+ // Get img width & height
+ var childWidth = (childWidth === 0) ? child.attr('width') : child.width(),
+ childHeight = (childHeight === 0) ? child.attr('height') : child.height();
+
+ if(link !== ''){
+ link.css('display','none');
+ }
+ child.css('display','none');
+ vars.totalSlides++;
+ });
+
+ // If randomStart
+ if(settings.randomStart){
+ settings.startSlide = Math.floor(Math.random() * vars.totalSlides);
+ }
+
+ // Set startSlide
+ if(settings.startSlide > 0){
+ if(settings.startSlide >= vars.totalSlides) { settings.startSlide = vars.totalSlides - 1; }
+ vars.currentSlide = settings.startSlide;
+ }
+
+ // Get initial image
+ if($(kids[vars.currentSlide]).is('img')){
+ vars.currentImage = $(kids[vars.currentSlide]);
+ } else {
+ vars.currentImage = $(kids[vars.currentSlide]).find('img:first');
+ }
+
+ // Show initial link
+ if($(kids[vars.currentSlide]).is('a')){
+ $(kids[vars.currentSlide]).css('display','block');
+ }
+
+ // Set first background
+ var sliderImg = $('<img/>').addClass('nivo-main-image');
+ sliderImg.attr('src', vars.currentImage.attr('src')).show();
+ slider.append(sliderImg);
+
+ // Detect Window Resize
+ $(window).resize(function() {
+ slider.children('img').width(slider.width());
+ sliderImg.attr('src', vars.currentImage.attr('src'));
+ sliderImg.stop().height('auto');
+ $('.nivo-slice').remove();
+ $('.nivo-box').remove();
+ });
+
+ //Create caption
+ slider.append($('<div class="nivo-caption"></div>'));
+
+ // Process caption function
+ var processCaption = function(settings){
+ var nivoCaption = $('.nivo-caption', slider);
+ if(vars.currentImage.attr('title') != '' && vars.currentImage.attr('title') != undefined){
+ var title = vars.currentImage.attr('title');
+ if(title.substr(0,1) == '#') title = $(title).html();
+
+ if(nivoCaption.css('display') == 'block'){
+ setTimeout(function(){
+ nivoCaption.html(title);
+ }, settings.animSpeed);
+ } else {
+ nivoCaption.html(title);
+ nivoCaption.stop().fadeIn(settings.animSpeed);
+ }
+ } else {
+ nivoCaption.stop().fadeOut(settings.animSpeed);
+ }
+ }
+
+ //Process initial caption
+ processCaption(settings);
+
+ // In the words of Super Mario "let's a go!"
+ var timer = 0;
+ if(!settings.manualAdvance && kids.length > 1){
+ timer = setInterval(function(){ nivoRun(slider, kids, settings, false); }, settings.pauseTime);
+ }
+
+ // Add Direction nav
+ if(settings.directionNav){
+ slider.append('<div class="nivo-directionNav"><a class="nivo-prevNav">'+ settings.prevText +'</a><a class="nivo-nextNav">'+ settings.nextText +'</a></div>');
+
+ $(slider).on('click', 'a.nivo-prevNav', function(){
+ if(vars.running) { return false; }
+ clearInterval(timer);
+ timer = '';
+ vars.currentSlide -= 2;
+ nivoRun(slider, kids, settings, 'prev');
+ });
+
+ $(slider).on('click', 'a.nivo-nextNav', function(){
+ if(vars.running) { return false; }
+ clearInterval(timer);
+ timer = '';
+ nivoRun(slider, kids, settings, 'next');
+ });
+ }
+
+ // Add Control nav
+ if(settings.controlNav){
+ vars.controlNavEl = $('<div class="nivo-controlNav"></div>');
+ slider.after(vars.controlNavEl);
+ for(var i = 0; i < kids.length; i++){
+ if(settings.controlNavThumbs){
+ vars.controlNavEl.addClass('nivo-thumbs-enabled');
+ var child = kids.eq(i);
+ if(!child.is('img')){
+ child = child.find('img:first');
+ }
+ if(child.attr('data-thumb')) vars.controlNavEl.append('<a class="nivo-control" rel="'+ i +'"><img src="'+ child.attr('data-thumb') +'" alt="" /></a>');
+ } else {
+ vars.controlNavEl.append('<a class="nivo-control" rel="'+ i +'">'+ (i + 1) +'</a>');
+ }
+ }
+
+ //Set initial active link
+ $('a:eq('+ vars.currentSlide +')', vars.controlNavEl).addClass('active');
+
+ $('a', vars.controlNavEl).bind('click', function(){
+ if(vars.running) return false;
+ if($(this).hasClass('active')) return false;
+ clearInterval(timer);
+ timer = '';
+ sliderImg.attr('src', vars.currentImage.attr('src'));
+ vars.currentSlide = $(this).attr('rel') - 1;
+ nivoRun(slider, kids, settings, 'control');
+ });
+ }
+
+ //For pauseOnHover setting
+ if(settings.pauseOnHover){
+ slider.hover(function(){
+ vars.paused = true;
+ clearInterval(timer);
+ timer = '';
+ }, function(){
+ vars.paused = false;
+ // Restart the timer
+ if(timer === '' && !settings.manualAdvance){
+ timer = setInterval(function(){ nivoRun(slider, kids, settings, false); }, settings.pauseTime);
+ }
+ });
+ }
+
+ // Event when Animation finishes
+ slider.bind('nivo:animFinished', function(){
+ sliderImg.attr('src', vars.currentImage.attr('src'));
+ vars.running = false;
+ // Hide child links
+ $(kids).each(function(){
+ if($(this).is('a')){
+ $(this).css('display','none');
+ }
+ });
+ // Show current link
+ if($(kids[vars.currentSlide]).is('a')){
+ $(kids[vars.currentSlide]).css('display','block');
+ }
+ // Restart the timer
+ if(timer === '' && !vars.paused && !settings.manualAdvance){
+ timer = setInterval(function(){ nivoRun(slider, kids, settings, false); }, settings.pauseTime);
+ }
+ // Trigger the afterChange callback
+ settings.afterChange.call(this);
+ });
+
+ // Add slices for slice animations
+ var createSlices = function(slider, settings, vars) {
+ if($(vars.currentImage).parent().is('a')) $(vars.currentImage).parent().css('display','block');
+ $('img[src="'+ vars.currentImage.attr('src') +'"]', slider).not('.nivo-main-image,.nivo-control img').width(slider.width()).css('visibility', 'hidden').show();
+ var sliceHeight = ($('img[src="'+ vars.currentImage.attr('src') +'"]', slider).not('.nivo-main-image,.nivo-control img').parent().is('a')) ? $('img[src="'+ vars.currentImage.attr('src') +'"]', slider).not('.nivo-main-image,.nivo-control img').parent().height() : $('img[src="'+ vars.currentImage.attr('src') +'"]', slider).not('.nivo-main-image,.nivo-control img').height();
+
+ for(var i = 0; i < settings.slices; i++){
+ var sliceWidth = Math.round(slider.width()/settings.slices);
+
+ if(i === settings.slices-1){
+ slider.append(
+ $('<div class="nivo-slice" name="'+i+'"><img src="'+ vars.currentImage.attr('src') +'" style="position:absolute; width:'+ slider.width() +'px; height:auto; display:block !important; top:0; left:-'+ ((sliceWidth + (i * sliceWidth)) - sliceWidth) +'px;" /></div>').css({
+ left:(sliceWidth*i)+'px',
+ width:(slider.width()-(sliceWidth*i))+'px',
+ height:sliceHeight+'px',
+ opacity:'0',
+ overflow:'hidden'
+ })
+ );
+ } else {
+ slider.append(
+ $('<div class="nivo-slice" name="'+i+'"><img src="'+ vars.currentImage.attr('src') +'" style="position:absolute; width:'+ slider.width() +'px; height:auto; display:block !important; top:0; left:-'+ ((sliceWidth + (i * sliceWidth)) - sliceWidth) +'px;" /></div>').css({
+ left:(sliceWidth*i)+'px',
+ width:sliceWidth+'px',
+ height:sliceHeight+'px',
+ opacity:'0',
+ overflow:'hidden'
+ })
+ );
+ }
+ }
+
+ $('.nivo-slice', slider).height(sliceHeight);
+ sliderImg.stop().animate({
+ height: $(vars.currentImage).height()
+ }, settings.animSpeed);
+ };
+
+ // Add boxes for box animations
+ var createBoxes = function(slider, settings, vars){
+ if($(vars.currentImage).parent().is('a')) $(vars.currentImage).parent().css('display','block');
+ $('img[src="'+ vars.currentImage.attr('src') +'"]', slider).not('.nivo-main-image,.nivo-control img').width(slider.width()).css('visibility', 'hidden').show();
+ var boxWidth = Math.round(slider.width()/settings.boxCols),
+ boxHeight = Math.round($('img[src="'+ vars.currentImage.attr('src') +'"]', slider).not('.nivo-main-image,.nivo-control img').height() / settings.boxRows);
+
+
+ for(var rows = 0; rows < settings.boxRows; rows++){
+ for(var cols = 0; cols < settings.boxCols; cols++){
+ if(cols === settings.boxCols-1){
+ slider.append(
+ $('<div class="nivo-box" name="'+ cols +'" rel="'+ rows +'"><img src="'+ vars.currentImage.attr('src') +'" style="position:absolute; width:'+ slider.width() +'px; height:auto; display:block; top:-'+ (boxHeight*rows) +'px; left:-'+ (boxWidth*cols) +'px;" /></div>').css({
+ opacity:0,
+ left:(boxWidth*cols)+'px',
+ top:(boxHeight*rows)+'px',
+ width:(slider.width()-(boxWidth*cols))+'px'
+
+ })
+ );
+ $('.nivo-box[name="'+ cols +'"]', slider).height($('.nivo-box[name="'+ cols +'"] img', slider).height()+'px');
+ } else {
+ slider.append(
+ $('<div class="nivo-box" name="'+ cols +'" rel="'+ rows +'"><img src="'+ vars.currentImage.attr('src') +'" style="position:absolute; width:'+ slider.width() +'px; height:auto; display:block; top:-'+ (boxHeight*rows) +'px; left:-'+ (boxWidth*cols) +'px;" /></div>').css({
+ opacity:0,
+ left:(boxWidth*cols)+'px',
+ top:(boxHeight*rows)+'px',
+ width:boxWidth+'px'
+ })
+ );
+ $('.nivo-box[name="'+ cols +'"]', slider).height($('.nivo-box[name="'+ cols +'"] img', slider).height()+'px');
+ }
+ }
+ }
+
+ sliderImg.stop().animate({
+ height: $(vars.currentImage).height()
+ }, settings.animSpeed);
+ };
+
+ // Private run method
+ var nivoRun = function(slider, kids, settings, nudge){
+ // Get our vars
+ var vars = slider.data('nivo:vars');
+
+ // Trigger the lastSlide callback
+ if(vars && (vars.currentSlide === vars.totalSlides - 1)){
+ settings.lastSlide.call(this);
+ }
+
+ // Stop
+ if((!vars || vars.stop) && !nudge) { return false; }
+
+ // Trigger the beforeChange callback
+ settings.beforeChange.call(this);
+
+ // Set current background before change
+ if(!nudge){
+ sliderImg.attr('src', vars.currentImage.attr('src'));
+ } else {
+ if(nudge === 'prev'){
+ sliderImg.attr('src', vars.currentImage.attr('src'));
+ }
+ if(nudge === 'next'){
+ sliderImg.attr('src', vars.currentImage.attr('src'));
+ }
+ }
+
+ vars.currentSlide++;
+ // Trigger the slideshowEnd callback
+ if(vars.currentSlide === vars.totalSlides){
+ vars.currentSlide = 0;
+ settings.slideshowEnd.call(this);
+ }
+ if(vars.currentSlide < 0) { vars.currentSlide = (vars.totalSlides - 1); }
+ // Set vars.currentImage
+ if($(kids[vars.currentSlide]).is('img')){
+ vars.currentImage = $(kids[vars.currentSlide]);
+ } else {
+ vars.currentImage = $(kids[vars.currentSlide]).find('img:first');
+ }
+
+ // Set active links
+ if(settings.controlNav){
+ $('a', vars.controlNavEl).removeClass('active');
+ $('a:eq('+ vars.currentSlide +')', vars.controlNavEl).addClass('active');
+ }
+
+ // Process caption
+ processCaption(settings);
+
+ // Remove any slices from last transition
+ $('.nivo-slice', slider).remove();
+
+ // Remove any boxes from last transition
+ $('.nivo-box', slider).remove();
+
+ var currentEffect = settings.effect,
+ anims = '';
+
+ // Generate random effect
+ if(settings.effect === 'random'){
+ anims = new Array('sliceDownRight','sliceDownLeft','sliceUpRight','sliceUpLeft','sliceUpDown','sliceUpDownLeft','fold','fade',
+ 'boxRandom','boxRain','boxRainReverse','boxRainGrow','boxRainGrowReverse');
+ currentEffect = anims[Math.floor(Math.random()*(anims.length + 1))];
+ if(currentEffect === undefined) { currentEffect = 'fade'; }
+ }
+
+ // Run random effect from specified set (eg: effect:'fold,fade')
+ if(settings.effect.indexOf(',') !== -1){
+ anims = settings.effect.split(',');
+ currentEffect = anims[Math.floor(Math.random()*(anims.length))];
+ if(currentEffect === undefined) { currentEffect = 'fade'; }
+ }
+
+ // Custom transition as defined by "data-transition" attribute
+ if(vars.currentImage.attr('data-transition')){
+ currentEffect = vars.currentImage.attr('data-transition');
+ }
+
+ // Run effects
+ vars.running = true;
+ var timeBuff = 0,
+ i = 0,
+ slices = '',
+ firstSlice = '',
+ totalBoxes = '',
+ boxes = '';
+
+ if(currentEffect === 'sliceDown' || currentEffect === 'sliceDownRight' || currentEffect === 'sliceDownLeft'){
+ createSlices(slider, settings, vars);
+ timeBuff = 0;
+ i = 0;
+ slices = $('.nivo-slice', slider);
+ if(currentEffect === 'sliceDownLeft') { slices = $('.nivo-slice', slider)._reverse(); }
+
+ slices.each(function(){
+ var slice = $(this);
+ slice.css({ 'top': '0px' });
+ if(i === settings.slices-1){
+ setTimeout(function(){
+ slice.animate({opacity:'1.0' }, settings.animSpeed, '', function(){ slider.trigger('nivo:animFinished'); });
+ }, (100 + timeBuff));
+ } else {
+ setTimeout(function(){
+ slice.animate({opacity:'1.0' }, settings.animSpeed);
+ }, (100 + timeBuff));
+ }
+ timeBuff += 50;
+ i++;
+ });
+ } else if(currentEffect === 'sliceUp' || currentEffect === 'sliceUpRight' || currentEffect === 'sliceUpLeft'){
+ createSlices(slider, settings, vars);
+ timeBuff = 0;
+ i = 0;
+ slices = $('.nivo-slice', slider);
+ if(currentEffect === 'sliceUpLeft') { slices = $('.nivo-slice', slider)._reverse(); }
+
+ slices.each(function(){
+ var slice = $(this);
+ slice.css({ 'bottom': '0px' });
+ if(i === settings.slices-1){
+ setTimeout(function(){
+ slice.animate({opacity:'1.0' }, settings.animSpeed, '', function(){ slider.trigger('nivo:animFinished'); });
+ }, (100 + timeBuff));
+ } else {
+ setTimeout(function(){
+ slice.animate({opacity:'1.0' }, settings.animSpeed);
+ }, (100 + timeBuff));
+ }
+ timeBuff += 50;
+ i++;
+ });
+ } else if(currentEffect === 'sliceUpDown' || currentEffect === 'sliceUpDownRight' || currentEffect === 'sliceUpDownLeft'){
+ createSlices(slider, settings, vars);
+ timeBuff = 0;
+ i = 0;
+ var v = 0;
+ slices = $('.nivo-slice', slider);
+ if(currentEffect === 'sliceUpDownLeft') { slices = $('.nivo-slice', slider)._reverse(); }
+
+ slices.each(function(){
+ var slice = $(this);
+ if(i === 0){
+ slice.css('top','0px');
+ i++;
+ } else {
+ slice.css('bottom','0px');
+ i = 0;
+ }
+
+ if(v === settings.slices-1){
+ setTimeout(function(){
+ slice.animate({opacity:'1.0' }, settings.animSpeed, '', function(){ slider.trigger('nivo:animFinished'); });
+ }, (100 + timeBuff));
+ } else {
+ setTimeout(function(){
+ slice.animate({opacity:'1.0' }, settings.animSpeed);
+ }, (100 + timeBuff));
+ }
+ timeBuff += 50;
+ v++;
+ });
+ } else if(currentEffect === 'fold'){
+ createSlices(slider, settings, vars);
+ timeBuff = 0;
+ i = 0;
+
+ $('.nivo-slice', slider).each(function(){
+ var slice = $(this);
+ var origWidth = slice.width();
+ slice.css({ top:'0px', width:'0px' });
+ if(i === settings.slices-1){
+ setTimeout(function(){
+ slice.animate({ width:origWidth, opacity:'1.0' }, settings.animSpeed, '', function(){ slider.trigger('nivo:animFinished'); });
+ }, (100 + timeBuff));
+ } else {
+ setTimeout(function(){
+ slice.animate({ width:origWidth, opacity:'1.0' }, settings.animSpeed);
+ }, (100 + timeBuff));
+ }
+ timeBuff += 50;
+ i++;
+ });
+ } else if(currentEffect === 'fade'){
+ createSlices(slider, settings, vars);
+
+ firstSlice = $('.nivo-slice:first', slider);
+ firstSlice.css({
+ 'width': slider.width() + 'px'
+ });
+
+ firstSlice.animate({ opacity:'1.0' }, (settings.animSpeed*2), '', function(){ slider.trigger('nivo:animFinished'); });
+ } else if(currentEffect === 'slideInRight'){
+ createSlices(slider, settings, vars);
+
+ firstSlice = $('.nivo-slice:first', slider);
+ firstSlice.css({
+ 'width': '0px',
+ 'opacity': '1'
+ });
+
+ firstSlice.animate({ width: slider.width() + 'px' }, (settings.animSpeed*2), '', function(){ slider.trigger('nivo:animFinished'); });
+ } else if(currentEffect === 'slideInLeft'){
+ createSlices(slider, settings, vars);
+
+ firstSlice = $('.nivo-slice:first', slider);
+ firstSlice.css({
+ 'width': '0px',
+ 'opacity': '1',
+ 'left': '',
+ 'right': '0px'
+ });
+
+ firstSlice.animate({ width: slider.width() + 'px' }, (settings.animSpeed*2), '', function(){
+ // Reset positioning
+ firstSlice.css({
+ 'left': '0px',
+ 'right': ''
+ });
+ slider.trigger('nivo:animFinished');
+ });
+ } else if(currentEffect === 'boxRandom'){
+ createBoxes(slider, settings, vars);
+
+ totalBoxes = settings.boxCols * settings.boxRows;
+ i = 0;
+ timeBuff = 0;
+
+ boxes = shuffle($('.nivo-box', slider));
+ boxes.each(function(){
+ var box = $(this);
+ if(i === totalBoxes-1){
+ setTimeout(function(){
+ box.animate({ opacity:'1' }, settings.animSpeed, '', function(){ slider.trigger('nivo:animFinished'); });
+ }, (100 + timeBuff));
+ } else {
+ setTimeout(function(){
+ box.animate({ opacity:'1' }, settings.animSpeed);
+ }, (100 + timeBuff));
+ }
+ timeBuff += 20;
+ i++;
+ });
+ } else if(currentEffect === 'boxRain' || currentEffect === 'boxRainReverse' || currentEffect === 'boxRainGrow' || currentEffect === 'boxRainGrowReverse'){
+ createBoxes(slider, settings, vars);
+
+ totalBoxes = settings.boxCols * settings.boxRows;
+ i = 0;
+ timeBuff = 0;
+
+ // Split boxes into 2D array
+ var rowIndex = 0;
+ var colIndex = 0;
+ var box2Darr = [];
+ box2Darr[rowIndex] = [];
+ boxes = $('.nivo-box', slider);
+ if(currentEffect === 'boxRainReverse' || currentEffect === 'boxRainGrowReverse'){
+ boxes = $('.nivo-box', slider)._reverse();
+ }
+ boxes.each(function(){
+ box2Darr[rowIndex][colIndex] = $(this);
+ colIndex++;
+ if(colIndex === settings.boxCols){
+ rowIndex++;
+ colIndex = 0;
+ box2Darr[rowIndex] = [];
+ }
+ });
+
+ // Run animation
+ for(var cols = 0; cols < (settings.boxCols * 2); cols++){
+ var prevCol = cols;
+ for(var rows = 0; rows < settings.boxRows; rows++){
+ if(prevCol >= 0 && prevCol < settings.boxCols){
+ /* Due to some weird JS bug with loop vars
+ being used in setTimeout, this is wrapped
+ with an anonymous function call */
+ (function(row, col, time, i, totalBoxes) {
+ var box = $(box2Darr[row][col]);
+ var w = box.width();
+ var h = box.height();
+ if(currentEffect === 'boxRainGrow' || currentEffect === 'boxRainGrowReverse'){
+ box.width(0).height(0);
+ }
+ if(i === totalBoxes-1){
+ setTimeout(function(){
+ box.animate({ opacity:'1', width:w, height:h }, settings.animSpeed/1.3, '', function(){ slider.trigger('nivo:animFinished'); });
+ }, (100 + time));
+ } else {
+ setTimeout(function(){
+ box.animate({ opacity:'1', width:w, height:h }, settings.animSpeed/1.3);
+ }, (100 + time));
+ }
+ })(rows, prevCol, timeBuff, i, totalBoxes);
+ i++;
+ }
+ prevCol--;
+ }
+ timeBuff += 100;
+ }
+ }
+ };
+
+ // Shuffle an array
+ var shuffle = function(arr){
+ for(var j, x, i = arr.length; i; j = parseInt(Math.random() * i, 10), x = arr[--i], arr[i] = arr[j], arr[j] = x);
+ return arr;
+ };
+
+ // For debugging
+ var trace = function(msg){
+ if(this.console && typeof console.log !== 'undefined') { console.log(msg); }
+ };
+
+ // Start / Stop
+ this.stop = function(){
+ if(!$(element).data('nivo:vars').stop){
+ $(element).data('nivo:vars').stop = true;
+ trace('Stop Slider');
+ }
+ };
+
+ this.start = function(){
+ if($(element).data('nivo:vars').stop){
+ $(element).data('nivo:vars').stop = false;
+ trace('Start Slider');
+ }
+ };
+
+ // Trigger the afterLoad callback
+ settings.afterLoad.call(this);
+
+ return this;
+ };
+
+ $.fn.nivoSlider = function(options) {
+ return this.each(function(key, value){
+ var element = $(this);
+ // Return early if this element already has a plugin instance
+ if (element.data('nivoslider')) { return element.data('nivoslider'); }
+ // Pass options to plugin constructor
+ var nivoslider = new NivoSlider(this, options);
+ // Store plugin object in this element's data
+ element.data('nivoslider', nivoslider);
+ });
+ };
+
+ //Default settings
+ $.fn.nivoSlider.defaults = {
+ effect: 'random',
+ slices: 15,
+ boxCols: 8,
+ boxRows: 4,
+ animSpeed: 500,
+ pauseTime: 3000,
+ startSlide: 0,
+ directionNav: true,
+ controlNav: true,
+ controlNavThumbs: false,
+ pauseOnHover: true,
+ manualAdvance: false,
+ prevText: 'Prev',
+ nextText: 'Next',
+ randomStart: false,
+ beforeChange: function(){},
+ afterChange: function(){},
+ slideshowEnd: function(){},
+ lastSlide: function(){},
+ afterLoad: function(){}
+ };
+
+ $.fn._reverse = [].reverse;
+
+})(jQuery);
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/js/jquery.scrolly.js b/sm-shop/src/main/webapp/resources/templates/generic/js/jquery.scrolly.js
new file mode 100644
index 0000000..f6523a1
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/js/jquery.scrolly.js
@@ -0,0 +1,87 @@
+/*
+ * Project: Scrolly : parallax is easy as a matter of fact !
+ * Description: Based on jQuery boilerplate
+ * Author: Victor C. / Octave & Octave web agency
+ * Licence: MIT
+ */
+!function(root, factory) {
+ if (typeof define === 'function' && define.amd) {
+ define(['jquery'], factory);
+ } else {
+ factory(root.jQuery);
+ }
+}(this, function($) {
+ 'use strict';
+
+ // Create the defaults once
+ var pluginName = 'scrolly',
+ defaults = {
+ bgParallax: false
+ },
+ didScroll = false;
+
+ function Plugin( element, options ) {
+ this.element = element;
+ this.$element = $(this.element);
+
+ this.options = $.extend( {}, defaults, options) ;
+
+ this._defaults = defaults;
+ this._name = pluginName;
+
+ this.init();
+ }
+
+ Plugin.prototype.init = function () {
+ var self = this;
+ this.startPosition = this.$element.position().top;
+ this.offsetTop = this.$element.offset().top;
+ this.height = this.$element.outerHeight(true);
+ this.velocity = this.$element.attr('data-velocity');
+ this.bgStart = parseInt(this.$element.attr('data-fit'), 10);
+
+ $(document).scroll(function(){
+ self.didScroll = true;
+ });
+
+ setInterval(function() {
+ if (self.didScroll) {
+ self.didScroll = false;
+ self.scrolly();
+ }
+ }, 10);
+ };
+
+ Plugin.prototype.scrolly = function() {
+ var dT = $(window).scrollTop(),
+ wH = $(window).height(),
+ position = this.startPosition;
+
+ if(this.offsetTop >= (dT+wH)) {
+ this.$element.addClass('scrolly-invisible');
+ } else {
+ if(this.$element.hasClass('scrolly-invisible')){
+ position = this.startPosition + (dT + ( wH - this.offsetTop ) ) * this.velocity;
+ } else {
+ position = this.startPosition + dT * this.velocity;
+ }
+ }
+ // Fix background position
+ if(this.bgStart){ position = position + this.bgStart; }
+
+ if(this.options.bgParallax === true) {
+ this.$element.css({backgroundPosition: '50% '+position+'px'});
+ } else {
+ this.$element.css({top: position});
+ }
+ };
+
+ $.fn[pluginName] = function ( options ) {
+ return this.each(function () {
+ if (!$.data(this, 'plugin_' + pluginName)) {
+ $.data(this, 'plugin_' + pluginName, new Plugin( this, options ));
+ }
+ });
+ };
+
+});
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/js/jquery.sticky.js b/sm-shop/src/main/webapp/resources/templates/generic/js/jquery.sticky.js
new file mode 100644
index 0000000..f50486f
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/js/jquery.sticky.js
@@ -0,0 +1,287 @@
+// Sticky Plugin v1.0.4 for jQuery
+// =============
+// Author: Anthony Garand
+// Improvements by German M. Bravo (Kronuz) and Ruud Kamphuis (ruudk)
+// Improvements by Leonardo C. Daronco (daronco)
+// Created: 02/14/2011
+// Date: 07/20/2015
+// Website: http://stickyjs.com/
+// Description: Makes an element on the page stick on the screen as you scroll
+// It will only set the 'top' and 'position' of your element, you
+// might need to adjust the width in some cases.
+
+(function (factory) {
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as an anonymous module.
+ define(['jquery'], factory);
+ } else if (typeof module === 'object' && module.exports) {
+ // Node/CommonJS
+ module.exports = factory(require('jquery'));
+ } else {
+ // Browser globals
+ factory(jQuery);
+ }
+}(function ($) {
+ var slice = Array.prototype.slice; // save ref to original slice()
+ var splice = Array.prototype.splice; // save ref to original slice()
+
+ var defaults = {
+ topSpacing: 0,
+ bottomSpacing: 0,
+ className: 'is-sticky',
+ wrapperClassName: 'sticky-wrapper',
+ center: false,
+ getWidthFrom: '',
+ widthFromWrapper: true, // works only when .getWidthFrom is empty
+ responsiveWidth: false,
+ zIndex: 'auto'
+ },
+ $window = $(window),
+ $document = $(document),
+ sticked = [],
+ windowHeight = $window.height(),
+ scroller = function() {
+ var scrollTop = $window.scrollTop(),
+ documentHeight = $document.height(),
+ dwh = documentHeight - windowHeight,
+ extra = (scrollTop > dwh) ? dwh - scrollTop : 0;
+
+ for (var i = 0, l = sticked.length; i < l; i++) {
+ var s = sticked[i],
+ elementTop = s.stickyWrapper.offset().top,
+ etse = elementTop - s.topSpacing - extra;
+
+ //update height in case of dynamic content
+ s.stickyWrapper.css('height', s.stickyElement.outerHeight());
+
+ if (scrollTop <= etse) {
+ if (s.currentTop !== null) {
+ s.stickyElement
+ .css({
+ 'width': '',
+ 'position': '',
+ 'top': '',
+ 'z-index': ''
+ });
+ s.stickyElement.parent().removeClass(s.className);
+ s.stickyElement.trigger('sticky-end', [s]);
+ s.currentTop = null;
+ }
+ }
+ else {
+ var newTop = documentHeight - s.stickyElement.outerHeight()
+ - s.topSpacing - s.bottomSpacing - scrollTop - extra;
+ if (newTop < 0) {
+ newTop = newTop + s.topSpacing;
+ } else {
+ newTop = s.topSpacing;
+ }
+ if (s.currentTop !== newTop) {
+ var newWidth;
+ if (s.getWidthFrom) {
+ newWidth = $(s.getWidthFrom).width() || null;
+ } else if (s.widthFromWrapper) {
+ newWidth = s.stickyWrapper.width();
+ }
+ if (newWidth == null) {
+ newWidth = s.stickyElement.width();
+ }
+ s.stickyElement
+ .css('width', newWidth)
+ .css('position', 'fixed')
+ .css('top', newTop)
+ .css('z-index', s.zIndex);
+
+ s.stickyElement.parent().addClass(s.className);
+
+ if (s.currentTop === null) {
+ s.stickyElement.trigger('sticky-start', [s]);
+ } else {
+ // sticky is started but it have to be repositioned
+ s.stickyElement.trigger('sticky-update', [s]);
+ }
+
+ if (s.currentTop === s.topSpacing && s.currentTop > newTop || s.currentTop === null && newTop < s.topSpacing) {
+ // just reached bottom || just started to stick but bottom is already reached
+ s.stickyElement.trigger('sticky-bottom-reached', [s]);
+ } else if(s.currentTop !== null && newTop === s.topSpacing && s.currentTop < newTop) {
+ // sticky is started && sticked at topSpacing && overflowing from top just finished
+ s.stickyElement.trigger('sticky-bottom-unreached', [s]);
+ }
+
+ s.currentTop = newTop;
+ }
+
+ // Check if sticky has reached end of container and stop sticking
+ var stickyWrapperContainer = s.stickyWrapper.parent();
+ var unstick = (s.stickyElement.offset().top + s.stickyElement.outerHeight() >= stickyWrapperContainer.offset().top + stickyWrapperContainer.outerHeight()) && (s.stickyElement.offset().top <= s.topSpacing);
+
+ if( unstick ) {
+ s.stickyElement
+ .css('position', 'absolute')
+ .css('top', '')
+ .css('bottom', 0)
+ .css('z-index', '');
+ } else {
+ s.stickyElement
+ .css('position', 'fixed')
+ .css('top', newTop)
+ .css('bottom', '')
+ .css('z-index', s.zIndex);
+ }
+ }
+ }
+ },
+ resizer = function() {
+ windowHeight = $window.height();
+
+ for (var i = 0, l = sticked.length; i < l; i++) {
+ var s = sticked[i];
+ var newWidth = null;
+ if (s.getWidthFrom) {
+ if (s.responsiveWidth) {
+ newWidth = $(s.getWidthFrom).width();
+ }
+ } else if(s.widthFromWrapper) {
+ newWidth = s.stickyWrapper.width();
+ }
+ if (newWidth != null) {
+ s.stickyElement.css('width', newWidth);
+ }
+ }
+ },
+ methods = {
+ init: function(options) {
+ return this.each(function() {
+ var o = $.extend({}, defaults, options);
+ var stickyElement = $(this);
+
+ var stickyId = stickyElement.attr('id');
+ var wrapperId = stickyId ? stickyId + '-' + defaults.wrapperClassName : defaults.wrapperClassName;
+ var wrapper = $('<div></div>')
+ .attr('id', wrapperId)
+ .addClass(o.wrapperClassName);
+
+ stickyElement.wrapAll(function() {
+ if ($(this).parent("#" + wrapperId).length == 0) {
+ return wrapper;
+ }
+});
+
+ var stickyWrapper = stickyElement.parent();
+
+ if (o.center) {
+ stickyWrapper.css({width:stickyElement.outerWidth(),marginLeft:"auto",marginRight:"auto"});
+ }
+
+ if (stickyElement.css("float") === "right") {
+ stickyElement.css({"float":"none"}).parent().css({"float":"right"});
+ }
+
+ o.stickyElement = stickyElement;
+ o.stickyWrapper = stickyWrapper;
+ o.currentTop = null;
+
+ sticked.push(o);
+
+ methods.setWrapperHeight(this);
+ methods.setupChangeListeners(this);
+ });
+ },
+
+ setWrapperHeight: function(stickyElement) {
+ var element = $(stickyElement);
+ var stickyWrapper = element.parent();
+ if (stickyWrapper) {
+ stickyWrapper.css('height', element.outerHeight());
+ }
+ },
+
+ setupChangeListeners: function(stickyElement) {
+ if (window.MutationObserver) {
+ var mutationObserver = new window.MutationObserver(function(mutations) {
+ if (mutations[0].addedNodes.length || mutations[0].removedNodes.length) {
+ methods.setWrapperHeight(stickyElement);
+ }
+ });
+ mutationObserver.observe(stickyElement, {subtree: true, childList: true});
+ } else {
+ if (window.addEventListener) {
+ stickyElement.addEventListener('DOMNodeInserted', function() {
+ methods.setWrapperHeight(stickyElement);
+ }, false);
+ stickyElement.addEventListener('DOMNodeRemoved', function() {
+ methods.setWrapperHeight(stickyElement);
+ }, false);
+ } else if (window.attachEvent) {
+ stickyElement.attachEvent('onDOMNodeInserted', function() {
+ methods.setWrapperHeight(stickyElement);
+ });
+ stickyElement.attachEvent('onDOMNodeRemoved', function() {
+ methods.setWrapperHeight(stickyElement);
+ });
+ }
+ }
+ },
+ update: scroller,
+ unstick: function(options) {
+ return this.each(function() {
+ var that = this;
+ var unstickyElement = $(that);
+
+ var removeIdx = -1;
+ var i = sticked.length;
+ while (i-- > 0) {
+ if (sticked[i].stickyElement.get(0) === that) {
+ splice.call(sticked,i,1);
+ removeIdx = i;
+ }
+ }
+ if(removeIdx !== -1) {
+ unstickyElement.unwrap();
+ unstickyElement
+ .css({
+ 'width': '',
+ 'position': '',
+ 'top': '',
+ 'float': '',
+ 'z-index': ''
+ })
+ ;
+ }
+ });
+ }
+ };
+
+ // should be more efficient than using $window.scroll(scroller) and $window.resize(resizer):
+ if (window.addEventListener) {
+ window.addEventListener('scroll', scroller, false);
+ window.addEventListener('resize', resizer, false);
+ } else if (window.attachEvent) {
+ window.attachEvent('onscroll', scroller);
+ window.attachEvent('onresize', resizer);
+ }
+
+ $.fn.sticky = function(method) {
+ if (methods[method]) {
+ return methods[method].apply(this, slice.call(arguments, 1));
+ } else if (typeof method === 'object' || !method ) {
+ return methods.init.apply( this, arguments );
+ } else {
+ $.error('Method ' + method + ' does not exist on jQuery.sticky');
+ }
+ };
+
+ $.fn.unstick = function(method) {
+ if (methods[method]) {
+ return methods[method].apply(this, slice.call(arguments, 1));
+ } else if (typeof method === 'object' || !method ) {
+ return methods.unstick.apply( this, arguments );
+ } else {
+ $.error('Method ' + method + ' does not exist on jQuery.sticky');
+ }
+ };
+ $(function() {
+ setTimeout(scroller, 0);
+ });
+}));
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/js/jquery-ui.min.js b/sm-shop/src/main/webapp/resources/templates/generic/js/jquery-ui.min.js
new file mode 100644
index 0000000..ea8d882
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/js/jquery-ui.min.js
@@ -0,0 +1,6 @@
+/*! jQuery UI - v1.11.4 - 2016-03-01
+* http://jqueryui.com
+* Includes: core.js, widget.js, mouse.js, slider.js
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+(function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){function t(t,s){var n,a,o,r=t.nodeName.toLowerCase();return"area"===r?(n=t.parentNode,a=n.name,t.href&&a&&"map"===n.nodeName.toLowerCase()?(o=e("img[usemap='#"+a+"']")[0],!!o&&i(o)):!1):(/^(input|select|textarea|button|object)$/.test(r)?!t.disabled:"a"===r?t.href||s:s)&&i(t)}function i(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}e.ui=e.ui||{},e.extend(e.ui,{version:"1.11.4",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({scrollParent:function(t){var i=this.css("position"),s="absolute"===i,n=t?/(auto|scroll|hidden)/:/(auto|scroll)/,a=this.parents().filter(function(){var t=e(this);return s&&"static"===t.css("position")?!1:n.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==i&&a.length?a:e(this[0].ownerDocument||document)},uniqueId:function(){var e=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++e)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(i){return t(i,!isNaN(e.attr(i,"tabindex")))},tabbable:function(i){var s=e.attr(i,"tabindex"),n=isNaN(s);return(n||s>=0)&&t(i,!n)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(t,i){function s(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],a=i.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+i]=function(t){return void 0===t?o["inner"+i].call(this):this.each(function(){e(this).css(a,s(this,t)+"px")})},e.fn["outer"+i]=function(t,n){return"number"!=typeof t?o["outer"+i].call(this,t):this.each(function(){e(this).css(a,s(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),disableSelection:function(){var e="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.bind(e+".ui-disableSelection",function(e){e.preventDefault()})}}(),enableSelection:function(){return this.unbind(".ui-disableSelection")},zIndex:function(t){if(void 0!==t)return this.css("zIndex",t);if(this.length)for(var i,s,n=e(this[0]);n.length&&n[0]!==document;){if(i=n.css("position"),("absolute"===i||"relative"===i||"fixed"===i)&&(s=parseInt(n.css("zIndex"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0}}),e.ui.plugin={add:function(t,i,s){var n,a=e.ui[t].prototype;for(n in s)a.plugins[n]=a.plugins[n]||[],a.plugins[n].push([i,s[n]])},call:function(e,t,i,s){var n,a=e.plugins[t];if(a&&(s||e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType))for(n=0;a.length>n;n++)e.options[a[n][0]]&&a[n][1].apply(e.element,i)}};var s=0,n=Array.prototype.slice;e.cleanData=function(t){return function(i){var s,n,a;for(a=0;null!=(n=i[a]);a++)try{s=e._data(n,"events"),s&&s.remove&&e(n).triggerHandler("remove")}catch(o){}t(i)}}(e.cleanData),e.widget=function(t,i,s){var n,a,o,r,h={},l=t.split(".")[0];return t=t.split(".")[1],n=l+"-"+t,s||(s=i,i=e.Widget),e.expr[":"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[l]=e[l]||{},a=e[l][t],o=e[l][t]=function(e,t){return this._createWidget?(arguments.length&&this._createWidget(e,t),void 0):new o(e,t)},e.extend(o,a,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),r=new i,r.options=e.widget.extend({},r.options),e.each(s,function(t,s){return e.isFunction(s)?(h[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},n=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=s.apply(this,arguments),this._super=i,this._superApply=a,t}}(),void 0):(h[t]=s,void 0)}),o.prototype=e.widget.extend(r,{widgetEventPrefix:a?r.widgetEventPrefix||t:t},h,{constructor:o,namespace:l,widgetName:t,widgetFullName:n}),a?(e.each(a._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete a._childConstructors):i._childConstructors.push(o),e.widget.bridge(t,o),o},e.widget.extend=function(t){for(var i,s,a=n.call(arguments,1),o=0,r=a.length;r>o;o++)for(i in a[o])s=a[o][i],a[o].hasOwnProperty(i)&&void 0!==s&&(t[i]=e.isPlainObject(s)?e.isPlainObject(t[i])?e.widget.extend({},t[i],s):e.widget.extend({},s):s);return t},e.widget.bridge=function(t,i){var s=i.prototype.widgetFullName||t;e.fn[t]=function(a){var o="string"==typeof a,r=n.call(arguments,1),h=this;return o?this.each(function(){var i,n=e.data(this,s);return"instance"===a?(h=n,!1):n?e.isFunction(n[a])&&"_"!==a.charAt(0)?(i=n[a].apply(n,r),i!==n&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):e.error("no such method '"+a+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; "+"attempted to call method '"+a+"'")}):(r.length&&(a=e.widget.extend.apply(null,[a].concat(r))),this.each(function(){var t=e.data(this,s);t?(t.option(a||{}),t._init&&t._init()):e.data(this,s,new i(a,this))})),h}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(t,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=s++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,i){var s,n,a,o=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(o={},s=t.split("."),t=s.shift(),s.length){for(n=o[t]=e.widget.extend({},this.options[t]),a=0;s.length-1>a;a++)n[s[a]]=n[s[a]]||{},n=n[s[a]];if(t=s.pop(),1===arguments.length)return void 0===n[t]?null:n[t];n[t]=i}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=i}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!t),t&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(t,i,s){var n,a=this;"boolean"!=typeof t&&(s=i,i=t,t=!1),s?(i=n=e(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),e.each(s,function(s,o){function r(){return t||a.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?a[o]:o).apply(a,arguments):void 0}"string"!=typeof o&&(r.guid=o.guid=o.guid||r.guid||e.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+a.eventNamespace,u=h[2];u?n.delegate(u,l,r):i.bind(l,r)})},_off:function(t,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(i).undelegate(i),this.bindings=e(this.bindings.not(t).get()),this.focusable=e(this.focusable.not(t).get()),this.hoverable=e(this.hoverable.not(t).get())},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var o,r=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.widget;var a=!1;e(document).mouseup(function(){a=!1}),e.widget("ui.mouse",{version:"1.11.4",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!a){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var i=this,s=1===t.which,n="string"==typeof this.options.cancel&&t.target.nodeName?e(t.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(t)!==!1,!this._mouseStarted)?(t.preventDefault(),!0):(!0===e.data(t.target,this.widgetName+".preventClickEvent")&&e.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return i._mouseMove(e)},this._mouseUpDelegate=function(e){return i._mouseUp(e)},this.document.bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),a=!0,!0)):!0}},_mouseMove:function(t){if(this._mouseMoved){if(e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button)return this._mouseUp(t);if(!t.which)return this._mouseUp(t)}return(t.which||t.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){return this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),a=!1,!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),e.widget("ui.slider",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this._calculateNewMax(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"),this._refresh(),this._setOption("disabled",this.options.disabled),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var t,i,s=this.options,n=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),a="<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>",o=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),t=n.length;i>t;t++)o.push(a);this.handles=n.add(e(o.join("")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.each(function(t){e(this).data("ui-slider-handle-index",t)})},_createRange:function(){var t=this.options,i="";t.range?(t.range===!0&&(t.values?t.values.length&&2!==t.values.length?t.values=[t.values[0],t.values[0]]:e.isArray(t.values)&&(t.values=t.values.slice(0)):t.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?this.range.removeClass("ui-slider-range-min ui-slider-range-max").css({left:"",bottom:""}):(this.range=e("<div></div>").appendTo(this.element),i="ui-slider-range ui-widget-header ui-corner-all"),this.range.addClass(i+("min"===t.range||"max"===t.range?" ui-slider-range-"+t.range:""))):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-widget ui-widget-content ui-corner-all"),this._mouseDestroy()},_mouseCapture:function(t){var i,s,n,a,o,r,h,l,u=this,c=this.options;return c.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:t.pageX,y:t.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(t){var i=Math.abs(s-u.values(t));(n>i||n===i&&(t===u._lastChangedValue||u.values(t)===c.min))&&(n=i,a=e(this),o=t)}),r=this._start(t,o),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=o,a.addClass("ui-state-active").focus(),h=a.offset(),l=!e(t.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:t.pageX-h.left-a.width()/2,top:t.pageY-h.top-a.height()/2-(parseInt(a.css("borderTopWidth"),10)||0)-(parseInt(a.css("borderBottomWidth"),10)||0)+(parseInt(a.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(t,o,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(e){var t={x:e.pageX,y:e.pageY},i=this._normValueFromMouse(t);return this._slide(e,this._handleIndex,i),!1},_mouseStop:function(e){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(e,this._handleIndex),this._change(e,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(e){var t,i,s,n,a;return"horizontal"===this.orientation?(t=this.elementSize.width,i=e.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(t=this.elementSize.height,i=e.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/t,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),a=this._valueMin()+s*n,this._trimAlignValue(a)},_start:function(e,t){var i={handle:this.handles[t],value:this.value()};return this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("start",e,i)},_slide:function(e,t,i){var s,n,a;this.options.values&&this.options.values.length?(s=this.values(t?0:1),2===this.options.values.length&&this.options.range===!0&&(0===t&&i>s||1===t&&s>i)&&(i=s),i!==this.values(t)&&(n=this.values(),n[t]=i,a=this._trigger("slide",e,{handle:this.handles[t],value:i,values:n}),s=this.values(t?0:1),a!==!1&&this.values(t,i))):i!==this.value()&&(a=this._trigger("slide",e,{handle:this.handles[t],value:i}),a!==!1&&this.value(i))},_stop:function(e,t){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("stop",e,i)},_change:function(e,t){if(!this._keySliding&&!this._mouseSliding){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._lastChangedValue=t,this._trigger("change",e,i)}},value:function(e){return arguments.length?(this.options.value=this._trimAlignValue(e),this._refreshValue(),this._change(null,0),void 0):this._value()},values:function(t,i){var s,n,a;if(arguments.length>1)return this.options.values[t]=this._trimAlignValue(i),this._refreshValue(),this._change(null,t),void 0;if(!arguments.length)return this._values();if(!e.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(t):this.value();for(s=this.options.values,n=arguments[0],a=0;s.length>a;a+=1)s[a]=this._trimAlignValue(n[a]),this._change(null,a);this._refreshValue()},_setOption:function(t,i){var s,n=0;switch("range"===t&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),e.isArray(this.options.values)&&(n=this.options.values.length),"disabled"===t&&this.element.toggleClass("ui-state-disabled",!!i),this._super(t,i),t){case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue(),this.handles.css("horizontal"===i?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=0;n>s;s+=1)this._change(null,s);this._animateOff=!1;break;case"step":case"min":case"max":this._animateOff=!0,this._calculateNewMax(),this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_value:function(){var e=this.options.value;return e=this._trimAlignValue(e)},_values:function(e){var t,i,s;if(arguments.length)return t=this.options.values[e],t=this._trimAlignValue(t);if(this.options.values&&this.options.values.length){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(e){if(this._valueMin()>=e)return this._valueMin();if(e>=this._valueMax())return this._valueMax();var t=this.options.step>0?this.options.step:1,i=(e-this._valueMin())%t,s=e-i;return 2*Math.abs(i)>=t&&(s+=i>0?t:-t),parseFloat(s.toFixed(5))},_calculateNewMax:function(){var e=this.options.max,t=this._valueMin(),i=this.options.step,s=Math.floor(+(e-t).toFixed(this._precision())/i)*i;e=s+t,this.max=parseFloat(e.toFixed(this._precision()))},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=""+e,i=t.indexOf(".");return-1===i?0:t.length-i-1},_valueMin:function(){return this.options.min},_valueMax:function(){return this.max},_refreshValue:function(){var t,i,s,n,a,o=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,u={};this.options.values&&this.options.values.length?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),u["horizontal"===h.orientation?"left":"bottom"]=i+"%",e(this).stop(1,1)[l?"animate":"css"](u,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-t+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({height:i-t+"%"},{queue:!1,duration:r.animate}))),t=i}):(s=this.value(),n=this._valueMin(),a=this._valueMax(),i=a!==n?100*((s-n)/(a-n)):0,u["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](u,r.animate),"min"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===o&&"horizontal"===this.orientation&&this.range[l?"animate":"css"]({width:100-i+"%"},{queue:!1,duration:r.animate}),"min"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===o&&"vertical"===this.orientation&&this.range[l?"animate":"css"]({height:100-i+"%"},{queue:!1,duration:r.animate}))},_handleEvents:{keydown:function(t){var i,s,n,a,o=e(t.target).data("ui-slider-handle-index");switch(t.keyCode){case e.ui.keyCode.HOME:case e.ui.keyCode.END:case e.ui.keyCode.PAGE_UP:case e.ui.keyCode.PAGE_DOWN:case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(t.preventDefault(),!this._keySliding&&(this._keySliding=!0,e(t.target).addClass("ui-state-active"),i=this._start(t,o),i===!1))return}switch(a=this.options.step,s=n=this.options.values&&this.options.values.length?this.values(o):this.value(),t.keyCode){case e.ui.keyCode.HOME:n=this._valueMin();break;case e.ui.keyCode.END:n=this._valueMax();break;case e.ui.keyCode.PAGE_UP:n=this._trimAlignValue(s+(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(s-(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:if(s===this._valueMax())return;n=this._trimAlignValue(s+a);break;case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(s===this._valueMin())return;n=this._trimAlignValue(s-a)}this._slide(t,o,n)},keyup:function(t){var i=e(t.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(t,i),this._change(t,i),e(t.target).removeClass("ui-state-active"))}}})});
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/js/loadingoverlay.min.js b/sm-shop/src/main/webapp/resources/templates/generic/js/loadingoverlay.min.js
new file mode 100644
index 0000000..8e327b3
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/js/loadingoverlay.min.js
@@ -0,0 +1,8 @@
+/***************************************************************************************************
+LoadingOverlay - A flexible loading overlay jQuery plugin
+ Author : Gaspare Sganga
+ Version : 1.5.3
+ License : MIT
+ Documentation : http://gasparesganga.com/labs/jquery-loading-overlay/
+****************************************************************************************************/
+!function(A,B){function C(C,g){C=A(C);var E=C.is("body"),I=C.data("LoadingOverlayCount");if(I===B&&(I=0),0==I){var o=A("<div>",{class:"loadingoverlay",css:{"background-color":g.color,position:"relative",display:"flex","flex-direction":"column","align-items":"center","justify-content":"center"}});if(g.zIndex!==B&&o.css("z-index",g.zIndex),g.image&&o.css({"background-image":"url("+g.image+")","background-position":g.imagePosition,"background-repeat":"no-repeat"}),g.fontawesome&&A("<div>",{class:"loadingoverlay_fontawesome "+g.fontawesome}).appendTo(o),g.custom&&A(g.custom).appendTo(o),E?o.css({position:"fixed",top:0,left:0,width:"100%",height:"100%"}):o.css("position","fixed"==C.css("position")?"fixed":"absolute"),Q(C,o,g,E),g.resizeInterval>0){var w=setInterval(function(){Q(C,o,g,E)},g.resizeInterval);C.data("LoadingOverlayResizeIntervalId",w)}g.fade?g.fade===!0?g.fade=[400,200]:"string"!=typeof g.fade&&"number"!=typeof g.fade||(g.fade=[g.fade,g.fade]):g.fade=[0,0],C.data({LoadingOverlay:o,LoadingOverlayFadeOutDuration:g.fade[1]}),o.hide().appendTo("body").fadeIn(g.fade[0])}I++,C.data("LoadingOverlayCount",I)}function g(C,g){C=A(C);var Q=C.data("LoadingOverlayCount");if(Q!==B)if(Q--,g||Q<=0){var E=C.data("LoadingOverlayResizeIntervalId");E&&clearInterval(E),C.data("LoadingOverlay").fadeOut(C.data("LoadingOverlayFadeOutDuration"),function(){A(this).remove()}),C.removeData(["LoadingOverlay","LoadingOverlayCount","LoadingOverlayFadeOutDuration","LoadingOverlayResizeIntervalId"])}else C.data("LoadingOverlayCount",Q)}function Q(B,C,g,Q){if(!Q){var E="fixed"==B.css("position")?B.position():B.offset();C.css({top:E.top+parseInt(B.css("border-top-width"),10),left:E.left+parseInt(B.css("border-left-width"),10),width:B.innerWidth(),height:B.innerHeight()})}var I=Q?A(window):B,o="auto";g.size&&"auto"!=g.size&&(o=Math.min(I.innerWidth(),I.innerHeight())*parseFloat(g.size)/100,g.maxSize&&o>parseInt(g.maxSize,10)&&(o=parseInt(g.maxSize,10)+"px"),g.minSize&&o<parseInt(g.minSize,10)&&(o=parseInt(g.minSize,10)+"px")),C.css("background-size",o),C.children(".loadingoverlay_fontawesome").css("font-size",o)}var E={color:"rgba(255, 255, 255, 0.8)",custom:"",fade:!0,fontawesome:"",image:"data:image/gif;base64,R0lGODlhZABkAKUAADQyNJyanGRmZMzOzExOTLS2tISChOzq7ERCRKyqrHR2dNze3FxaXMTCxIyOjPT29Dw6PKSipGxubNTW1FRWVLy+vIyKjPTy9ExKTLSytHx+fOTm5GRiZMzKzJSWlPz+/DQ2NJyenGxqbNTS1FRSVLy6vISGhOzu7ERGRKyurHx6fOTi5FxeXMTGxJSSlPz6/Dw+PKSmpHRydNza3P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJBQA0ACwAAAAAZABkAAAG/kCacEgsGo/IJO1SEEBAosJFSa1ar9jswQQBeAEgyyFLLpvNL893DXC9zvC4XDggsb+EwXzPtyZAd14gCX2FhkQRgIEAIYeOSAMWIgoxY1UpioEpj5xCFx6ZACQVH1QjFIt5nY8PIV1sKCtUaYsOpVcfb6tWM6iBJlUnJqEAJidYKxYaFbq7SSXEXxQPVQ8VEjBQFVNXDypeKCPOSR8ZiwAox50rLF8Z40kV0V7Tqw8WXgQT8EgzDIvAdm1I4WFAM35EPqSAcYeAul25ECZ5EYPAGgH7JGo08mFACAcOChy4tbHkkA8PDppcybKly5cwY8rc8+HEiBYDRs509qKF/goCCAhIaEBy56MBFtcQaGCU04ukbFgsaErlQAQFETZgGbAIRAmqEx0oskDNirlFMcAieWDHCwtZVkqce6fWyAMBXyQ8pHKCYcOMdROOEIBBQIssAQI5KBs44YEWcLGcELvGWONCHyZ40OBhQtHLoEOLHk26tOnTqFOrXs26tevXEj+0MCFDBTPYSi64QPAFhgFLrl8c2HCC5IsUvNeAiMB49YsCFBCwICrkgIRABICvboEBz1QaC7oHmuEa1JdBQhZAZfOdtXlBdE8oCERBa+tTX94KeZ58TYjPqfWkAAsaiDPEcX6B4UFzrV1wAoNCbBCCCSG0h9uFGGao4YYc/nbo4YcghijiiCW9sMEMG6i04QsjKKCICICJ9sACE6wAoRILcMAGBRZe9kIIDKDAQALcWBGCYgDWVcIrACBQQpJHtHOHAHs1dt0aGhRJhZRR2QeaCGwooKUSBgSiwY1qRcBGDCpCkqAgh4l2wpUAKOBlFS9UQIEiBFRQ2gsDFKAHGR8skEAIKSwAJYmMNuroo5BGSkSbHa6wmQEljNnJBzOMUGVJMxCgCAwWfOrIARpggAIFBSw6zgl4sZGAq3uc8M0ag5bUAApT0jrHAG8CoMFKBfQnDZp9tDDlSh3wyoYEvsoxgrNfOLDSA2Uq5ycuKzQAGaVHnOBCJrGwtEKsUwDAEAOyRbyQgQAoIMBBAeAasUEMArBgQq4rndCCB4myWwSwa8DAbzXDPRBtU/M9++E/O35I5xcCfNgAMdt2+EACe4JAAZsgvrBABRUsUK+knAQBACH5BAkFADQALAAAAABkAGQAAAb+QJpwSCwaj8gk7bNKaVSx2UtJrVqv2CytwgJ4AZTCVEsum7ED0veLaJzfcPhDsV4LTvG83jpR170oLXuDhEQdBH9eMBVXHwcHF4VnLwMJGQtXfYkAKB1VlBoMFAIekZJYLxMUXiAQBitVc5sseEovATB1LBMfp1Yjq3UyD1UtKH8gBVUNIIkSsL5KDxabjFQfBYhfMCljSQ8Cm8m90UgzXYkaVi8LMSoKIVJVExibACbE5Ucj2n8CvsbsScinr8gCBpvUnaJnTwPBgkMeGNhUwtcDdIlSkINI5NyfgdE6NPt4gOORCQJycbKwodyHEMfszDCJ5ESDFClGPLTYwgT+i1EhWtIcKu3AhhMbiSpdyrSp06dQoya5sOKEN6kcTyRQIEBGgFpYC14woRIACAklw+oLkMjATrVJUhWQ16jfGgoT4Fb50AIRCmtWLoysE0gvlRfUvGi4agtCok6GbYX44iApFTr+hEau6YKFAc1WOsT8Mm6zLataXlQIZrYEY9N6PjwYkKLFBcuwc+vezbu379/AgwsfTry48ePIk1950CFFA1PKr6GEQJ1ChdfIcS/gUAdDC9zFHzTI0ILgiwiDv6iAjjxFLgQJhpzQkIhAWuQXEHohkO8C/T8UgGbcA/qBkc956SnG3nHuAcANESuEs0Yg4BH3QgsFlEfEBzP+CNAMCAR8F91eM1QwwVsjpqjiiiy26OKLMMYo44w01gjXBy/kWCGLFxQgAgEsxADWbw9AosUDISCwhgUowvbBBBYoYMEA2CExgZJrwFCRb/l9wcJMV0SQiAm/ZVBHDDsWMdkfGqRpWAJ1hFClEQ0kEsJvE5S1CBYbSFAHAQLq9kIMx4AQQ5NIrKABCiDAIAAmwX1wVBkPTFBBBwvaqOmmnHbq6aegKiHpADrR+EIIBCCAggILuKnHCw1IwIADgQ71QQx1iABNNC806AUFmdJ0QoFfaFTOASLUkUJTE9jlRWXlLMDas01tQKwXIbgKxwEy1KFMUx78mRcWJ0wwwgFZ2grxQQn9CIBoVgqMRIAYjUxgAAkkKNDBnEY80JMGMdRK1AW0FbABv0WcgBEABOy63APpGlbAHx7IKGYdZMZY55kynuDnFwHOeIAHLLDgAKQzvnDCwaEqFQQAIfkECQUANAAsAAAAAGQAZAAABv5AmnBILBqPyKTwMqtUZheldEqtWq/ClQMDAMBMC6x4TMZeZKCuWnAou9/wGERN93zg+Dz1JaHTWSd6goNEJwJ+ahQrhIxJLxuBVQ8iiF0sG1QPJSYqHhONZh4YIBAsJQ9UEWmIJlQTHH4BkaBSJxZ+MCl3tYd+BItSGwyIICGotEoFMIgos0ozGnQCA1QhlQAUn8hIDwbXBVUnAyEhLSe7Si8s1wAF6NuFMtceoBcE7DEv8EYP0ZUpoD6s+7bPyIcEq+iAaAPKwzUUIwry8+ZHF60TFCqF0CexyAMHLFCgkFDhGK0BAhKC8BClo8EFA0Y4o/VhRQoLCjw04Oiy5/6RDw8u8PRJtKjRo0iTKh304cWDB++W7jtQwoUBFyU2RFXyYUIICwFabJX6TMGyLiAUaJvyogSFOQBQxCBb5YCChGpYmFQyAAGuDHSlvFA1j8otRApaBj5yQt41FoqTwELEIsziIxsGVvo1hRJlTJeNHNCMiABoJTHwdnEwNPQSE+wktD5yoA8dCpZdE/nQAsW1FlRqmlglIbduIg9CqAbA2grQE0+PI+FNAQYIGCwK7JWe58GEFiMicx9Pvrz58+jTq1/Pvr379/B9PtoeX8oFUTAQmFgxtj6RC7BJA4x/MPFHRAtcKJTAbO3NwAEGHMwwxAcxVKIBfe05oIYDRP5UiMiF/mm42oEJ0pECg+zNEJIAEg5xwWFrnFZfgVFdEAMB1zmglX/BncPjj0AGKeSQRBZp5JFIJqnkktx90B+RLyxQQAAVGHjkCw0M0wWL6b2wQgvGUZGZH7KdxxsLBHDQwBUNIALDWuRNEqMVKbgJnHkPZGRJmHyphsKA5L0QQBogOIAhEhf4syGKx52QggYxiDfFfQSgQIAHhwr5wQIj7Mjkp6CGKuqopJZqxQMrMKRkBwJggIEBgNLkaAAdZCrRAmd1IYGqtKiIlgtIueAHCHfS8oIHKvHqk2N0ZPBkHon6USxRDilEDTLJKTRTTyvco4YG23J1gY9XLHCXF08hJNWCCRRQ4IGMU5yQgAIyhKDsFDal0IKtEn1wwQYb8OtRAHCBYICkQq6QaxfXGjkDIhUguYFvaoDAp5AvxHDWSgL790IFJmignakk7xMEACH5BAkFADQALAAAAABkAGQAAAb+QJpwSCwaj8ik8HVaLU4vpXRKrVqvy4KKRFBkHtiweBxOoABoACxEbrvftMU5jYaN4Pj8NAKipy16gYJDJn5pEoOJeR6GaBpWJy0VM1GKVi8jFiwCMRsfVCMIhiANVCcBcyAsE5WWSh8Vc2giM1UOfXQarUkvFrhpJAOuUjMMhrpUFzEUaCghB1QTv7kXw0kxEKMnVS8bCxMbYFQBjQAEE9ZIjI3oihrlMB3pRzHTaduKDuUEd/NFEwQMsfikaEA5Afj8DfmQIVuac65evPODooXCIxUUsGDhYIG1Aw5kUahwEcmDDQd2uXowIEaMAh5LypxJs6bNmzhz6tzJM8/+hwUNSlRYoHLKiwElOlTrWeVBBhYw1LCIsZTKCg0EYKAQsYLplA8JRNGBwIbKAQl+KGzwqqRDwEbCpjQYFYEtkhchygFwQCXvMYJ2iVwoVA7RnkaPAhd5oK9wtKh0QJBUTORDCntp6k55EAIyGhPiKA9ZIaARCmjJCghAMTWhaCEfOshCA2FylQ8vHrwA/HrhBhMEUBDQsIB3bzgXNrg+zry58+fQo0ufTr269evYsy+ZUCJBgRnGtRtRxgAGBBgMElR90cGABBNEs58wYA+EhW0vEnjGUKGo9AKYAQBCATRMwAwdAqx1XWnliEBDBvbAYJF1L4jVCAw0pOBQGhL+XveCZ4ZgOAAJfrAQk3UMNiIADZz9AkIG/kWXgl4pCPFABQIQIMEAoVl3ggKNKLCceENsYIEsCDigIJFHsBSDByEMEB6TVFZp5ZVYZqnlllx26eWXrlwwQQcjDHnlBi6cAYMGSzrHxJRK4LUhACZAB5IA911xQIrNtNkbXn2A4AKcR6xwIIe1NNdLGirEeMQFKqTVY2+wqEmgFZWmAcKEzj0wQgEjTErFAhpQoICUYKaq6qqsturqq7CyekIMMijQgqOC4KYbTi/IkAYEMeCax1EahWDmRQbRwUJXwyzAILA3zUgHDO240gIGh9zUQYknWrIAC2mUVdMLaKEBQgpXwuLxQQkicHTsRRuEoIAGBVRFxQcTRBDCCOka0YSoND1wwgWEHhEbBRCAQEADBYt3QrloMPAukQccqgZqWV7gaxosTCzewSAoXEHDRC6QQAzFxaqyJUEAACH5BAkFADQALAAAAABkAGQAAAb+QJpwSCwaj8jk8HW5vJTQqHRKrQ4/q5jBEFt8rOCwGDzjgAAAEGsybrvftJcETQdwHvC8PjqA1dEgLXuDhEMlZ38gKYWMeg0Qf2gFVl+NYActIQkzeFInFJEoJ1IvAyowICQhF5ZTKxKIKKtTJSh1IJNRHw0EfxajrUovGn8wJZVQLxUKKCgKFZ1QD6CJGcFKAxiREk9SHxcbGyfIUB2RaAqs10cFCJEE3Ywp5wACG+tHLbZ/LPGFDfQkAMNH5AKHSCHIETrhJ5IHfwSFzOhFx8RARh8yNKQj4GLEIQs8KNBQIJqlBxkEwIBBQMW9jzCPfNjQocIEkzFz6tzJs6f+z59AgwodKuXBggkrcE45sAAiUSgzTHCgwMHCBIVKTgSgQIJDCqxPjUxg8YfBjCkXVPyJADaskAMizlFwemQAIjoEDrhF0mBfpAFS5hUDvNeI4HMxpBSIBINN4SIZ6AHIBWUFRTrcHhcZcPnPAlIFLlNwrHnIAwvnNFB5MSGEgxReShfZoOCPgBWUPrQt/SCFAgoSSsoeTry48ePIkytfzry58+fQoxN8sWDECrrSxWpgQIKFhs8FWySoMC76iwLa6pCoUIk2xxHRZ6T/QwH3C9R1FHhcHkFyAhorHFQHAfA9Vxs9qi1A1oCEOSeDZKo9YIJtej3ngWQhSLQgACj+tLDbcX2c05gQM8VgggcbYJfcCyHcBUgKKkp3ngAowIACBxXEmB0NGwxQwQD77SjkkEQWaeSRSCap5JJMjvHCDAM0teQHHQhAAAoYSNCCjkV8cMAKG3zo1gMxQLKWmEtUIAMLEmTAJVEdzFcHBA2WcxkMHRB3AX6poXnaHxIQt8GGkVBQoRIXEFMHC4JScw4BLwkTwh8OEAeXZBQodcQCAuAVaWksSlbpFA8U8FqQj73yqKY7jjBHHQKQduQGKWgggQYphDnlAxc8gGaTwAYr7LDEXkNdASVc8KseH7yJTwJmroHPASkEMICzrVzgFwAOsDrICw6gQYKsOS3wh35d16ywoTU8XWAmGiZ4u8cDagEAQ4E8hdAQC3W2soIJCpQgL0EXVOBBCFeB8QK2XQ4Mk25goMQCC24y2YI7HAqi5AcJ1JHAstA10BAMGiv5QAIEUJCAw0I2W+zLOgUBACH5BAkFADQALAAAAABkAGQAAAb+QJpwSCwaj8ikcslsOp/Q5WOQSAwe0ax2q724SAAQyYPlms9oWggEaIdj6bi8+cC43YTyfM+nLWB3bRAbfYVyB4CBMCeGjUMXAxUtBy9PKoEAGk4fBykqEh4TH45NByqJAh2VTQssdyyErDJsbSgNo6RJLw6BHCubCyEaGjELuEsvFrRuDAu5SQtggQXHTB8XJ9VLF4l3IHDPRx0omCHaewuYbQ7hRxvSdxWOJ8t3Ie1Gu4Gwjh8imDAG4DPywAQMEDAkiCI1gUKgGOcGflhRYYKefhNMUKAgIcXAj0pebFhwISLIkyhTqlzJsqXLlzBjSrlwUaajBxkMqDBQ4UL+lA0BNIQ4YJOOgW4IPPhs8qEFATcIJhQN6aBem3tNTly6I2HVVCMzXGEiYLLICjt3UBD9aqQFWkyMmKx4mjYuWyId6GKqieSBhUCa7hbZ8A8TiyczFNCS8EswkQ8prIKQt2lDixgtNpT9+iDGMhAp+FpznOTDhhgOUmQjzbq169ewY8ueTbu27du4c+vG9+KE193bEkgQoCDFbxovDmygtPvDBAnLIGhYS6OzHRQR7N4+IUOdgzIlusHwmLuD1TYEnL3Y6kbB0tsR1LXpgFxBIAnaaweQD4CyZ3vH0VaBfDBIRcMJVbVhQiy4bSBWIO4N8cAMFYlGW1N6tcHCDMD+KTGDRgRQ4ACDHSaxwgQHbFbiiiy26OKLMMYo44w01mgjEheEIAAFAiSQXxMvPBCgYx8M4NArBjoRjAUhzKCiTSsUFogAFhqxwixtCPCeYy8kcF4bLTAV2R0FtHaBAfyZAGR8d0TQmlb8KeBEBQjcIRBrD/AinwdOeEELGa19UEE3gYwAxQYVaPbaAy6cxyeMJ3hATi1KyThFAh6kYFGNHzx546egXvjAAQesZmkHDgyngY8xfhBBhiAY0FhKQb7gKRoNQKCOCVt+dEAIDCgwwK1cXPCgIregFAEtAsxayACTquPBkOF0Vwt9jRRQp3wmVJmLB26w4EwjLWzrHbVTz2xgAgsCVEDsFiccG4i7KT2wAHWOpCCfBCSyNoMLHoxLhwljLeRaK1n2q8QDFQhAAAoiesvWOOgZCsUDG8xQkmwIA9AsjR+MoIEJBodq8skDBQEAIfkECQUANAAsAAAAAGQAZAAABv5AmnBILBqPyKRyyWw6n9Dla1IqLV7RrHarfUQoMASrhOWaz2haAQJoA2CTtHzuZLndGrp+X8Tc2wJ8gnoCfwB5g4lDHxcbB2VOFWxuMAtPDxMpEQMnik8NKhwiKReXKSwwMAIVkEsXAShtICoHnkwTfm0wEQ9PLwstLRutSh8ZMH8mxLZFGn8EM4oPhX8o0cxHL3Z/A4ovsX8wDdhHHzLhcYkvFIYoI+RHDX8KnYkfAYYCvfBFHykEMFBo2GDrgAYQbggQ5HfkxABL2E4U0KDAw0KGGDNq3Mixo8ePIEOKHEmypMkPExIESLEiy4cBBWYsM3mkAAEIICBwaPHhyf6Kc20UlKKZpASyOyjSMXkRAKGbFESRXFBgCIADJyck/JER9ciCbX8CNTlB9Q6irkRWUAvr5MUxNyBaoC3ywETVGE9OhABDIcbMriMI/GFxscmDBRNW7JtL5MMIsBJm9GQ85/CEYZQza97MubPnz6BDix5NurTp06gZTghgIUZhIYxODD19wgUCWRgKtBqggoWKAZNJvwgxyQ0GnkJWsGvD4hrpDSSqahgaozgIvKVHVAVAYWEIpwBAhDDdYTsFiCNyAXBnegG4PxLqvSjAAAYFVqYfuDAEokLwDydscEJwpa2gAHggBLBYakY8UIACAmggF4MUVmjhhRhmqOGGHP526OGHIG7xwgABmBDBCgReeIBdlHgwmxMrDHBAinNdYAF4skQARQMCECCBUpR1oB5SCyqhlhsy/EXTBzFsB0A3TczAgBssFNnVcE5WgJUBsoSg5EkZ4HgHkEtsEIICMdST2QzLPUMjgwW810ZSGn5QgQAogICCAgN8idoHBwzQwgRqhmjooYiW9sIDfqb2wQoFeOBBAu/U2YEAxZGQQaO2fPDCm3xsIFg1BYCKzQsteJBBoYJ8wGVVArSk0QC5BMCpGSdEVxUME2bUZBscsLrHDEP+UcJGLUyiTF4ZCIAAAjJU8CISom4X10YPZKCAA68pcUBZcFkwrREfqLAdC1QQYWtqgw6IGV4Efk5w1B9+BTmqIectYYycAHhgZVQROAlCAU2YKQALJkBJ2T0CJ3BhwNYSbGEL9z5DZmp1bRfAuqVtAK4bJoxL4QYpCBCQBNJqFAQAIfkECQUANAAsAAAAAGQAZAAABv5AmnBILBqPyKRyyWw6n1Dma3P6RK/YrHZhEYhCB614TB4eOCAAAGS6lN9wZ0RNBwzi+HxRU1cn9IB4Ln0AFYGHRS8XD1EzKHUUJ09TJSUDjIhOKxEaLgMvkxUCKCgKE1ZNLwUUajAumJlKDyJpABQtqE0fGy0Dkk8TJH0xsUsZfQq/gR8hhJHFSSZ9LCuILxaEBAvQSDF9EsqAH97TbtxGJwx0MCm5gQssfSnnSCsmBBK4sR8zIjAwKEKAokcQyYMBAza4K8iwocOHECNKnEixosWLGDPSu9ChxISBUR6E0dhkgQAMMEiYGOnkQgQYAAhkAEnSyAJhdZI5+VABwf66DTWPfPBQiw6IO6k89CkQ1MgDFYQAEEsVoI+hpkReQCU0z8kAdWoomMM6JEXRVtt2ttAgwcQpskROGKgDIgQsJydO3IUr5EAICigEFNjLV8yHDw8OF17MuLHjx5AjS55MubLly5gza05ysMGChZuHvKhAAQYEGAqqEXnQosCnyx8aYPjGkkYEnxhKXD6xlW4GVBcI0OFAU/KG2YRMYApOh0XxyBseJR8bAgIAGEwtn1AQNUauCyVitHge+UUJmHVYACWiOLMq4WoEfA595ESBFANA09/Pv7///wAGKOCABBZo4GMfXDBAATO8oN9mDxTgkxocjBfFCyeQ19QLGf5MSAcBE0CxggYCBBAOWSsIEJUGk0izxm+FNSBdHzA8aMQF3KnhgYYkVYAeIYQh8UEGMBHQgY0aDYBTHwRA8cAIDAYZFI5RheBfin208d8GDgjAggQpnMjfBwcsIOaBaKap5hgYHrCBlKGtEIIMLIjgCY9xKFhABi2cec4IEpxFQAJIlrGBBSRAAAIGMqRV0AqBEgLDCIc8IMNZAHCgGj0vmBUVABLgOcYxUZkgKiAX8PEpCuvpIcOnAmzKzQUifAoACkjpwUpUFIS4kapRoSCrQRMEoIABMSxwKg0SfKoeQZ1iSocAhT4Qg4cAkFBCoTQU8KkDcCJi0qctMEEkIWsYULrECSoyOQNDHyhJSAiFbsDBpxpwu0COaoDILSInOEABAQSokB8TFczYBwWOKvHBBDHE0EG43Hxwwga1LVHAj0yqG5qMn2qzn72fKrCsZOf2gYKv+z2QAHxhXdXfCxN4IIECMazwbyBBAAAh+QQJBQA0ACwAAAAAZABkAAAG/kCacEgsGo/IpHLJbDqf0Kh0Sq1CLxmNpfWyer/fiwkGAKBSXbB63RyAymXCgU2vFzNw+MbOp7fyADBzfYRhCm8AICFpTg8HGxcfhU8XLSkle1ArHgIKKSdPHwsuHCwmI5NOLiiBGitRLyegUAcKeRSDqUkLEHAgMZKFDYhwEbpKFYAmD4UfEYAAGsdJM4CLk8nW00gfJnACC6kbAnkoudtFDxUeFSfBzSsKKCgS4ej3ShsbzPj9/v8AAwocSLCgwYMIEyr092LFiFcLC71wQQEDhQCznhyIoCJBxohHXnjLY+LCkxMm3oCIwAhkkQms8oCY8WQCg2/8XBYpQQZQ/oUnKzjAUdBSp5AWPfO0CFWCBQoBE4wauSACEItzTEQN2PBO6pABLOBQaNHVqxVRBTwUWFDW7JcPbd3KnUu3rt27ePPq3cu3r9+/gAMXeXGgqGAiHzaYQACDRIqcQkR1gOh3BjlfASAP4IBBAOW9D0IQizOAiAE4AfxesAUIRAYiGuB4UM1a5ushI5x69hsaGoHSQ7Rmqhw2jwPIh2l8WKEBBogzyJMPcWRYuvXr2LNr3869u/fvgU+MqDAhevIHGRigQNC5Q1ydLy4cePA+5Mg8EBKYj/hhgoReCLjAVRMFQEOaWSPc5IsKHyFBlYFleLBfQg+c1loBTMxAAIQA/gjQYEQzFAeIAkxMsCGEAmAVkU0GSsDEARRwqMGHC50ggYEOMCEShynUh9AHMYwWSFRMnBAjNDOa9UIAMQFAQAM+EjGAAKO5ItcHLXhgQghshbJBASZo4EAFJmn3wQsPvBAleGy22WYs9G2njgcGOJDBgJMkNsAAK1S3zQkuIAAHBBIQSQgWIpBAAAcB+KnLAy70YlWZfDiTVCIWTDjJABhAGAMhKwgZSAn4vBADhwIQkgCEJqxpxwsecEgAIS5AqICmfZiKahMfHNBBBAlMEEkTpxpogqOFDNAkIJ8y0YJQZUCggT1LrHBpGSD8hM8FDohKAI0vHZmHBJQm8UEAWEIu488JDgDCACpL7AgNCCk08UAKR8IQQrn9DOCABBqUgKsQCygIjQKuCqFPwghNQAKKyO61gsEjMmyXvNBgaN0KIg41MF8DHBKtCcNZ98EJA6RA3seEBAEAIfkECQUANAAsAAAAAGQAZAAABv5AmnBILBqPyKRyyWw6n9CodEqtQj+TSGZl7Xq/rwIBAmGNvuj080QCuAGah3pOL67ebtapzp8fMHgKF32EYCkEICAUA1EfFycvhVEXK3tRLwMhMQsfUCcZKioRB5JOByYcEg2lNA8RMG4gGqxMDm8CXJIzbXgTtEoCbwSMkiMQeAAFv0kBIG4CpJILFMi+y0cbLhQKI52SD81vCt7XRi8PD+TfFQoSKZbl8fLz9PX29/j5+vv8/f7/AAMKpPJhgAEOFhZIeTCiwAw5A498SICHQAd1Sz5kgGURY0QaB3i9MQCPyQUFbzxE+khkAAJkLKI1eWHiTQqPEWegQCahJP6TFRoEeBjEksgLFXhAxFj55MUFpkWHLFDgDIUHn1GtnBjQYgLErGDDih1LtqzZs2jTql3Ltq1bGi86RNA0AupbIgc8IAKgKALWtweoIgNggmjaBx0EEBDRYmWEwW+UpX0RA5YbGAnkMIDsRoLaCZvxUJhBwxlnFGorHMMDowSN1ZAJpLb8pjUNFpwByFC7gAMyCgpT5K6gNgxtEAU6ndAA2cRXtC8mBNUwgNwJB3sBEAhh+K7RASliFJiA07v58+jTq1/Pvr379+wvbHie/sMMAxQIMHDw9+OHFwCWh0QBO4lGXlYHRMACARJU0J0SKwAymAQbRLUcHgjEQB8SHv5wBoFkLCUAmxsYKLTEC8FwphJLR0GWARMv+MaZAxsC9ABKg8XQBHOcxSBgPx90OBgxS7TAGQFnFLUAAcgo0J8RDpj2BggvZjUBCyiAgIIJFTpxQQgUmMZCAXaxdEEL4/14xAsLVFBACyuoCd+cdNZp551CzFBAAimMUGMfJ6xQZjkfFMDAaiRcJQkWLsjAgQYd0PNBCRJO6cKgagwQ2mUVyNnHBiJwZiIfD2wqzKjXdFDgYCEQsoCUtaUgj2ozEtIBZ63GM0ClyOjYxAMbzLDCAZgasQBkyMlzgAScdbnEBgGQkAgLCTyIxAfMwuTsNR+0sGpKcl6AFB4QBODEAFi41RbpPJgwGYtfTWQwohsooJrEBwt4wAIFDhxYzwMDvPmnER/gOFgE6D0QKmQeoPcBjzmm1wCs9G7r3QcO0AYADMSp90AGChBAgQaNsffCCRtscIKnhAQBACH5BAkFADQALAAAAABkAGQAAAb+QJpwSCwaj8ikcslsOp/QqHRKrUofL6t2yxVeQiRKKtstm5efAgwAQHTO8PjwFWGzM/K8+VOCsFFveoJbDzEULAVkUC+Kg08vH1SQUi8jMREtD45NDwUqDhubNC0sbBgJoksdCGwmjXknBnYAMK+pRDF2HCeOKwKzAKG3RwMEbB62cReydijJwy8dHgW8jh8DFGwgBcNJH5OiHycFBQuR3ejp6uvs7e7v8PHy7y8PFw/n84MfKykmMhYyCNOnZ4AAP9oUzCAIKxswAAoOMFxyIoGHFs+MfLDw0E6MfBOLzMBgR8JAJQcYdGSjoFrIIhpmgYiRccgMYytZnHxJ4wP+CWAmLjBZ4bCjgJ08f83yoGnJCwUrAThoynNIHzsEBjhpAaIjCq1VibyIIYCCAoxOPnjoOCZskQ8HFpwAyeRFBQEwYCAQMICuWy0PFgxYUfOv4cOIEytezLix48eQI0sOe2JAgwEuJyt50UAEARQkZKDVjITOmlkIEhRG/GJFAAspJAoZgMLrwsgfKuAEIGCFkABRQ0hewQGYgywyoiqQ3KL2LAESoa7UILmDczsCeOVamULyBgnAPES66dU37gGl2Gio9qLA9T8VVh+GWyAG5iITFFAgQEDDbdJK8DPBCn4BaOCBCCao4IIMNujggxBG6MgFJajAggbxLfZNgUr+LCACMAZk5tYHMyTgQAwLyEfDUw+BwNRhIxTFQAUc4tfVQxRMYNgFStnBgmxL1NERCBUYtspDLTQhZIvc/FXBabM0uUQDKwFi2AokyaQjEw/sNosEIvKkFjAaULVEMcBQsABiHxiCAgUehOnNCCbsR4EJSP11glxTBDbBBipKKOighBZqqBEXjFBBBwfUKIejt6ygHwIYSJDhIONooEEEeUbaIxsIFADpFgdocBoIDHS6yQsO3DgLAWbC8QFwwEgQayrfrbSlHC8UZQcGuw6zQHEdFZnHA1DaAUMD6RyQXEfBBnjBBgdcMKoQL6T36n/DtOmqj/I9UCEJDJjQgXxkH6TwLQAmXJtHqcCgkGQTGbyXlRMneAClBECmk69zCowg3wZessGCig9MEEMILciZzq1LqNviCAxGsC4AIDC7YAkXg7Dmghf4yoYE7kKGzSw6OfjCBCEooEEMG5QsmTgXBJpHEAAh+QQJBQA0ACwAAAAAZABkAAAG/kCacEgsGo/IpHLJbDqf0Kh0Sq1ar9is9TMwmUYfrXjcXHAAAMGKzG5+LpPNK9pBoAmjth55cbBIFAoND08rLGgCG3uLQlwMaJAgLoROMx4ea4yLGyKQngAFmjQfKxMXokofGRCfkCyniy8FAgwWiqhHDxatkCh5iwOPaDG4RxcKvGgwLYwVKJAaxUa6yQAwE4wLhwAgKdJFHwUgyQKUey8dEhQhsN9DJyrJzJofLw9h7kULyJ4wKfj5Ah6IoYAFCwcD5gRcSOPFiQMnzDGcSLGixYsYxdQDmBHVgxEFQmRI2FHUCRcEIBEI0K6kHgvjPEEIoNClkhcLKhyA0iIZ/ooKNpU8MDAORAiJSnYl81AzaJEGnjDMYyKhmgakToU4+ESsSbxkDrBmjeEJRKgmKar9y2rkwDYAGm4xuUCBVyK2Rj5YMpFiAZQBdT2RwIb3yAexTA6EYEGABbvCkCNLnky5suXLmDNr3sy5s+d8HzZMyPS5yQoLLBiwsEC6tOERb9EwGMCR84URFWaYO8Dvk4ATn1doQAPCA6UBrHgN8PzCRUxrJYQUqNaV84FOnqLRmJ7MW+cDVT2ZEDLBDi/CnD9EeA6jg5ALBngpaLn5RAgYAAisFbJCwfM0C9S22QsbbHBCU6OkoIAACiQAnGtMHCYghBRWaOGFGGao4YYc/nbo4YeofHBACgGkcMCEkaEoVATmcZMCYlmF1kACLez0RAb49RPdZDOIMA4EGrR2U2CfSGAjZC/0xo1xTWzwn0roFbZASp6wIJcSKyRDwHKRLfCMJxRcmcQDX35ipWQPnJEdfUl4wIsHKgbVQo750ebECSb8Z0KcTi3ggAIhiDlXARpIoEEBMFr4wAWJgujoo5BGKukSH5ywwAoIZvhBAjKwIIADM+DywAAVYDrRCwEkhwYLfjHywQgiIIAACi5kKo0zrShg6xjafBICn4t84AIvEDR6hSqtUHDkNy+YkMyybHzg5icoRPmNB09aY+wQb1ywq2FpfRLmQiMQCYkDZ8COskACBpiQwArp0rCAuQB4wJAsdAKggKBIzKAmNyLwe8QLDbylwYMLceGAABKkcEK8SqIxnhOhVVDABAhLdkC+ymzL2QwcWwNthReU2Uu8nE3rSXUZ9vElCkxyOGoMMQzg8aRtBAEAOw==",imagePosition:"center center",maxSize:"100px",minSize:"20px",resizeInterval:50,size:"50%",zIndex:9999};A.LoadingOverlaySetup=function(B){A.extend(!0,E,B)},A.LoadingOverlay=function(B,Q){switch(B.toLowerCase()){case"show":var I=A.extend(!0,{},E,Q);C("body",I);break;case"hide":g("body",Q)}},A.fn.LoadingOverlay=function(B,Q){switch(B.toLowerCase()){case"show":var I=A.extend(!0,{},E,Q);return this.each(function(){C(this,I)});case"hide":return this.each(function(){g(this,Q)})}}}(jQuery);
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/js/main.js b/sm-shop/src/main/webapp/resources/templates/generic/js/main.js
new file mode 100644
index 0000000..9d882aa
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/js/main.js
@@ -0,0 +1,547 @@
+(function($) {
+ "use strict";
+
+ $(".click_menu").on('click', function() {
+ $(".click_menu_show").slideToggle(400)
+ });
+
+ $(".click_menu2").on('click', function() {
+ $(".click_menu_show2").slideToggle(400)
+ });
+
+ /*----------------------------
+ Sticky Header
+ ------------------------------ */
+ var win = $(window);
+ win.on('scroll', function() {
+ var scroll = win.scrollTop();
+ if (scroll < 200) {
+ $("#main_h").removeClass("sticky");
+ } else {
+ $("#main_h").addClass("sticky");
+ }
+ });
+ /*----------------------------
+ MagnificPopup
+ ------------------------------ */
+
+ $('.image-link').magnificPopup({
+ type: 'image',
+ gallery: {
+ enabled: true
+ }
+ });
+ /*----------------------------
+ Slippry
+ ------------------------------ */
+ jQuery('#home-banner').slippry({
+ // general elements & wrapper
+ slippryWrapper: '<div class="sy-box banner-slider" />', // wrapper to wrap everything, including pager
+ elements: 'article', // elments cointaining slide content
+
+ // options
+ adaptiveHeight: false, // height of the sliders adapts to current
+ captions: false,
+
+ pager: false,
+
+ // pager
+ //pagerClass: 'banner-pager',
+
+ // transitions
+ transition: 'horizontal', // fade, horizontal, kenburns, false
+ speed: 1200,
+ pause: 8000,
+
+ // slideshow
+ autoDirection: 'prev'
+ });
+
+
+ /*----------------------------
+ jQuery MeanMenu
+ ------------------------------ */
+ $('#mobile-menu').meanmenu();
+
+ /*----------------------------
+ wow js active
+ ------------------------------ */
+ new WOW().init();
+ /*----------------------------
+ slider-active
+ ------------------------------ */
+ $('.slider-active').owlCarousel({
+ loop: true,
+ autoplay: false,
+ responsive: {
+ 0: {
+ items: 1
+ },
+ 600: {
+ items: 1
+ },
+ 1000: {
+ items: 1
+ }
+ }
+ })
+ /*----------------------------
+ Service-active
+ ------------------------------ */
+ $('.service-active').owlCarousel({
+ loop: true,
+ autoplay: true,
+ responsive: {
+ 0: {
+ items: 1
+ },
+ 480: {
+ items: 2
+ },
+ 768: {
+ items: 4
+ },
+ 1000: {
+ items: 4
+ },
+ 1200: {
+ items: 4
+ }
+ }
+ })
+ /*----------------------------
+ Product-carousel-active
+ ------------------------------ */
+ $('.product-carousel-active').owlCarousel({
+ loop: true,
+ autoplay: false,
+ responsive: {
+ 0: {
+ items: 1
+ },
+ 480: {
+ items: 2
+ },
+ 768: {
+ items: 3
+ },
+ 1000: {
+ items: 4
+ },
+ 1200: {
+ items: 5
+ }
+ }
+ })
+ /*----------------------------
+ Top-interesting-active
+ ------------------------------ */
+ $('.top-interesting-active').owlCarousel({
+ loop: true,
+ autoplay: false,
+ nav: true,
+ navText: ["<i class='fa fa-angle-left'></i>", "<i class='fa fa-angle-right'></i>"],
+ responsive: {
+ 0: {
+ items: 1
+ },
+ 480: {
+ items: 2
+ },
+ 768: {
+ items: 3
+ },
+ 1000: {
+ items: 4
+ },
+ 1200: {
+ items: 6
+ }
+ }
+ })
+ /*----------------------------
+ New-product-home-2-active
+ ------------------------------ */
+ $('.new-product-home-2-active').owlCarousel({
+ loop: true,
+ autoplay: false,
+ nav: true,
+ navText: ["<i class='fa fa-angle-right'></i>", "<i class='fa fa-angle-left'></i>"],
+ responsive: {
+ 0: {
+ items: 1
+ },
+ 480: {
+ items: 2
+ },
+ 768: {
+ items: 3
+ },
+ 1000: {
+ items: 4
+ },
+ 1200: {
+ items: 5
+ }
+ }
+ })
+ /*----------------------------
+ New-product-item-3-active
+ ------------------------------ */
+ $('.new-product-item-3-active').owlCarousel({
+ loop: true,
+ autoplay: false,
+ nav: true,
+ navText: ["<i class='fa fa-angle-right'></i>", "<i class='fa fa-angle-left'></i>"],
+ responsive: {
+ 0: {
+ items: 1
+ },
+ 480: {
+ items: 2
+ },
+ 768: {
+ items: 3
+ },
+ 1000: {
+ items: 3
+ },
+ 1200: {
+ items: 4
+ }
+ }
+ })
+ /*----------------------------
+ New-product-home-2-slider-active
+ ------------------------------ */
+ $('.new-product-home-2-slider-active').owlCarousel({
+ loop: true,
+ autoplay: false,
+ nav: true,
+ navText: ["<i class='fa fa-angle-right'></i>", "<i class='fa fa-angle-left'></i>"],
+ responsive: {
+ 0: {
+ items: 1
+ },
+ 480: {
+ items: 2
+ },
+ 768: {
+ items: 3
+ },
+ 1000: {
+ items: 2
+ },
+ 1200: {
+ items: 2
+ }
+ }
+ })
+ /*----------------------------
+ New-product-home-4-active
+ ------------------------------ */
+ $('.new-product-home-4-active').owlCarousel({
+ loop: true,
+ autoplay: false,
+ nav: true,
+ navText: ["<i class='fa fa-angle-right'></i>", "<i class='fa fa-angle-left'></i>"],
+ responsive: {
+ 0: {
+ items: 1
+ },
+ 480: {
+ items: 2
+ },
+ 768: {
+ items: 2
+ },
+ 1000: {
+ items: 3
+ },
+ 1200: {
+ items: 3
+ }
+ }
+ })
+ /*----------------------------
+ Hot-deal-active
+ ------------------------------ */
+ $('.hot-deal-active').owlCarousel({
+ loop: true,
+ autoplay: false,
+ nav: true,
+ navText: ["<i class='fa fa-angle-right'></i>", "<i class='fa fa-angle-left'></i>"],
+ responsive: {
+ 0: {
+ items: 1
+ },
+ 480: {
+ items: 1
+ },
+ 768: {
+ items: 2
+ },
+ 1000: {
+ items: 1
+ },
+ 1200: {
+ items: 1
+ }
+ }
+ })
+ /*----------------------------
+ Feature-home-4-active
+ ------------------------------ */
+ $('.feature-home-4-active').owlCarousel({
+ loop: true,
+ autoplay: false,
+ nav: true,
+ navText: ["<i class='fa fa-angle-right'></i>", "<i class='fa fa-angle-left'></i>"],
+ responsive: {
+ 0: {
+ items: 1
+ },
+ 480: {
+ items: 1
+ },
+ 768: {
+ items: 2
+ },
+ 1000: {
+ items: 2
+ },
+ 1200: {
+ items: 3
+ }
+ }
+ })
+ /*---------------------
+ countdown
+--------------------- */
+ $('[data-countdown]').each(function() {
+ var $this = $(this),
+ finalDate = $(this).data('countdown');
+ $this.countdown(finalDate, function(event) {
+ $this.html(event.strftime('<span class="cdown days"><span class="time-count">%-D</span> <p>Days</p></span> <span class="cdown hour"><span class="time-count">%-H</span> <p>Hour</p></span> <span class="cdown minutes"><span class="time-count">%M</span> <p>Min</p></span> <span class="cdown second"> <span><span class="time-count">%S</span> <p>Sec</p></span>'));
+ });
+ });
+ /*----------------------------
+ Feature-home-2-active
+ ------------------------------ */
+ $('.feature-home-2-active').owlCarousel({
+ loop: true,
+ autoplay: false,
+ nav: true,
+ navText: ["<i class='fa fa-angle-right'></i>", "<i class='fa fa-angle-left'></i>"],
+ responsive: {
+ 0: {
+ items: 1
+ },
+ 480: {
+ items: 1
+ },
+ 768: {
+ items: 2
+ },
+ 1000: {
+ items: 1
+ },
+ 1200: {
+ items: 1
+ }
+ }
+ })
+ /*----------------------------
+ Shop-sideber-active
+ ------------------------------ */
+ $('.shop-sideber-active').owlCarousel({
+ loop: true,
+ autoplay: false,
+ nav: true,
+ navText: ["<i class='fa fa-angle-right'></i>", "<i class='fa fa-angle-left'></i>"],
+ responsive: {
+ 0: {
+ items: 1
+ },
+ 480: {
+ items: 1
+ },
+ 768: {
+ items: 1
+ },
+ 1000: {
+ items: 1
+ },
+ 1200: {
+ items: 1
+ }
+ }
+ })
+ /*----------------------------
+ Static-slider-active
+ ------------------------------ */
+ $('.static-slider-active').owlCarousel({
+ loop: true,
+ autoplay: false,
+ responsive: {
+ 0: {
+ items: 1
+ },
+ 600: {
+ items: 1
+ },
+ 1000: {
+ items: 1
+ }
+ }
+ })
+ /*----------------------------
+ Feature-preduct-active
+ ------------------------------ */
+ $('.feature-preduct-active').owlCarousel({
+ loop: true,
+ nav: true,
+ navText: ["<i class='fa fa-angle-left'></i>", "<i class='fa fa-angle-right'></i>"],
+ autoplay: false,
+ responsive: {
+ 0: {
+ items: 1
+ },
+ 480: {
+ items: 2
+ },
+ 768: {
+ items: 2
+ },
+ 1000: {
+ items: 2
+ }
+ }
+ })
+ /*----------------------------
+ Upsell-product-active
+ ------------------------------ */
+ $('.upsell-product-active').owlCarousel({
+ loop: true,
+ nav: true,
+ navText: ["<i class='fa fa-angle-left'></i>", "<i class='fa fa-angle-right'></i>"],
+ autoplay: false,
+ responsive: {
+ 0: {
+ items: 1
+ },
+ 480: {
+ items: 2
+ },
+ 768: {
+ items: 2
+ },
+ 1000: {
+ items: 3
+ }
+ }
+ })
+ /*----------------------------
+ Blog-carousel-active
+------------------------------ */
+ $('.blog-carousel-active').owlCarousel({
+ loop: true,
+ nav: true,
+ navText: ["<i class='fa fa-angle-right'></i>", "<i class='fa fa-angle-left'></i>"],
+ autoplay: false,
+ responsive: {
+ 0: {
+ items: 1
+ },
+ 600: {
+ items: 1
+ },
+ 768: {
+ items: 2
+ },
+ 1000: {
+ items: 3
+ }
+ }
+ })
+ /*----------------------------
+ Blog-carousel-active2
+------------------------------ */
+ $('.blog-carousel-active2').owlCarousel({
+ loop: true,
+ nav: true,
+ navText: ["<i class='fa fa-angle-right'></i>", "<i class='fa fa-angle-left'></i>"],
+ autoplay: false,
+ responsive: {
+ 0: {
+ items: 1
+ },
+ 600: {
+ items: 1
+ },
+ 768: {
+ items: 2
+ },
+ 1000: {
+ items: 2
+ }
+ }
+ })
+
+ /*-------------------------
+ showlogin toggle function
+ --------------------------*/
+ $('#showlogin').on('click', function() {
+ $('#checkout-login').slideToggle(900);
+ });
+
+ /*-------------------------
+ showcoupon toggle function
+ --------------------------*/
+ $('#showcoupon').on('click', function() {
+ $('#checkout_coupon').slideToggle(900);
+ });
+
+ /*-------------------------
+ Create an account toggle function
+ --------------------------*/
+ $('#cbox').on('click', function() {
+ $('#cbox_info').slideToggle(900);
+ });
+
+ /*-------------------------
+ Create an account toggle function
+ --------------------------*/
+ //$('#ship-box').on('click', function() {
+ // console.log('ship-box clicked');
+ // $('#ship-box-info').slideToggle(1000);
+ //});
+
+ /*----------------------------
+ price-slider active
+ ------------------------------ */
+ var ammout = $("#amount");
+ var sliderRange = $("#slider-range");
+ sliderRange.slider({
+ range: true,
+ min: 40,
+ max: 600,
+ values: [60, 570],
+ slide: function(event, ui) {
+ ammout.val("$" + ui.values[0] + " - $" + ui.values[1]);
+ }
+ });
+ ammout.val("$" + sliderRange.slider("values", 0) +
+ " - $" + sliderRange.slider("values", 1));
+
+ /*--------------------------
+ scrollUp
+ ---------------------------- */
+ $.scrollUp({
+ scrollText: '<i class="fa fa-angle-up"></i>',
+ easingType: 'linear',
+ scrollSpeed: 900,
+ animation: 'fade'
+ });
+
+})(jQuery);
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/js/owl.carousel.min.js b/sm-shop/src/main/webapp/resources/templates/generic/js/owl.carousel.min.js
new file mode 100644
index 0000000..f2a15f6
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/js/owl.carousel.min.js
@@ -0,0 +1,2 @@
+!function(a,b,c,d){function e(b,c){this.settings=null,this.options=a.extend({},e.Defaults,c),this.$element=a(b),this.drag=a.extend({},m),this.state=a.extend({},n),this.e=a.extend({},o),this._plugins={},this._supress={},this._current=null,this._speed=null,this._coordinates=[],this._breakpoint=null,this._width=null,this._items=[],this._clones=[],this._mergers=[],this._invalidated={},this._pipe=[],a.each(e.Plugins,a.proxy(function(a,b){this._plugins[a[0].toLowerCase()+a.slice(1)]=new b(this)},this)),a.each(e.Pipe,a.proxy(function(b,c){this._pipe.push({filter:c.filter,run:a.proxy(c.run,this)})},this)),this.setup(),this.initialize()}function f(a){if(a.touches!==d)return{x:a.touches[0].pageX,y:a.touches[0].pageY};if(a.touches===d){if(a.pageX!==d)return{x:a.pageX,y:a.pageY};if(a.pageX===d)return{x:a.clientX,y:a.clientY}}}function g(a){var b,d,e=c.createElement("div"),f=a;for(b in f)if(d=f[b],"undefined"!=typeof e.style[d])return e=null,[d,b];return[!1]}function h(){return g(["transition","WebkitTransition","MozTransition","OTransition"])[1]}function i(){return g(["transform","WebkitTransform","MozTransform","OTransform","msTransform"])[0]}function j(){return g(["perspective","webkitPerspective","MozPerspective","OPerspective","MsPerspective"])[0]}function k(){return"ontouchstart"in b||!!navigator.msMaxTouchPoints}function l(){return b.navigator.msPointerEnabled}var m,n,o;m={start:0,startX:0,startY:0,current:0,currentX:0,currentY:0,offsetX:0,offsetY:0,distance:null,startTime:0,endTime:0,updatedX:0,targetEl:null},n={isTouch:!1,isScrolling:!1,isSwiping:!1,direction:!1,inMotion:!1},o={_onDragStart:null,_onDragMove:null,_onDragEnd:null,_transitionEnd:null,_resizer:null,_responsiveCall:null,_goToLoop:null,_checkVisibile:null},e.Defaults={items:3,loop:!1,center:!1,mouseDrag:!0,touchDrag:!0,pullDrag:!0,freeDrag:!1,margin:0,stagePadding:0,merge:!1,mergeFit:!0,autoWidth:!1,startPosition:0,rtl:!1,smartSpeed:250,fluidSpeed:!1,dragEndSpeed:!1,responsive:{},responsiveRefreshRate:200,responsiveBaseElement:b,responsiveClass:!1,fallbackEasing:"swing",info:!1,nestedItemSelector:!1,itemElement:"div",stageElement:"div",themeClass:"owl-theme",baseClass:"owl-carousel",itemClass:"owl-item",centerClass:"center",activeClass:"active"},e.Width={Default:"default",Inner:"inner",Outer:"outer"},e.Plugins={},e.Pipe=[{filter:["width","items","settings"],run:function(a){a.current=this._items&&this._items[this.relative(this._current)]}},{filter:["items","settings"],run:function(){var a=this._clones,b=this.$stage.children(".cloned");(b.length!==a.length||!this.settings.loop&&a.length>0)&&(this.$stage.children(".cloned").remove(),this._clones=[])}},{filter:["items","settings"],run:function(){var a,b,c=this._clones,d=this._items,e=this.settings.loop?c.length-Math.max(2*this.settings.items,4):0;for(a=0,b=Math.abs(e/2);b>a;a++)e>0?(this.$stage.children().eq(d.length+c.length-1).remove(),c.pop(),this.$stage.children().eq(0).remove(),c.pop()):(c.push(c.length/2),this.$stage.append(d[c[c.length-1]].clone().addClass("cloned")),c.push(d.length-1-(c.length-1)/2),this.$stage.prepend(d[c[c.length-1]].clone().addClass("cloned")))}},{filter:["width","items","settings"],run:function(){var a,b,c,d=this.settings.rtl?1:-1,e=(this.width()/this.settings.items).toFixed(3),f=0;for(this._coordinates=[],b=0,c=this._clones.length+this._items.length;c>b;b++)a=this._mergers[this.relative(b)],a=this.settings.mergeFit&&Math.min(a,this.settings.items)||a,f+=(this.settings.autoWidth?this._items[this.relative(b)].width()+this.settings.margin:e*a)*d,this._coordinates.push(f)}},{filter:["width","items","settings"],run:function(){var b,c,d=(this.width()/this.settings.items).toFixed(3),e={width:Math.abs(this._coordinates[this._coordinates.length-1])+2*this.settings.stagePadding,"padding-left":this.settings.stagePadding||"","padding-right":this.settings.stagePadding||""};if(this.$stage.css(e),e={width:this.settings.autoWidth?"auto":d-this.settings.margin},e[this.settings.rtl?"margin-left":"margin-right"]=this.settings.margin,!this.settings.autoWidth&&a.grep(this._mergers,function(a){return a>1}).length>0)for(b=0,c=this._coordinates.length;c>b;b++)e.width=Math.abs(this._coordinates[b])-Math.abs(this._coordinates[b-1]||0)-this.settings.margin,this.$stage.children().eq(b).css(e);else this.$stage.children().css(e)}},{filter:["width","items","settings"],run:function(a){a.current&&this.reset(this.$stage.children().index(a.current))}},{filter:["position"],run:function(){this.animate(this.coordinates(this._current))}},{filter:["width","position","items","settings"],run:function(){var a,b,c,d,e=this.settings.rtl?1:-1,f=2*this.settings.stagePadding,g=this.coordinates(this.current())+f,h=g+this.width()*e,i=[];for(c=0,d=this._coordinates.length;d>c;c++)a=this._coordinates[c-1]||0,b=Math.abs(this._coordinates[c])+f*e,(this.op(a,"<=",g)&&this.op(a,">",h)||this.op(b,"<",g)&&this.op(b,">",h))&&i.push(c);this.$stage.children("."+this.settings.activeClass).removeClass(this.settings.activeClass),this.$stage.children(":eq("+i.join("), :eq(")+")").addClass(this.settings.activeClass),this.settings.center&&(this.$stage.children("."+this.settings.centerClass).removeClass(this.settings.centerClass),this.$stage.children().eq(this.current()).addClass(this.settings.centerClass))}}],e.prototype.initialize=function(){if(this.trigger("initialize"),this.$element.addClass(this.settings.baseClass).addClass(this.settings.themeClass).toggleClass("owl-rtl",this.settings.rtl),this.browserSupport(),this.settings.autoWidth&&this.state.imagesLoaded!==!0){var b,c,e;if(b=this.$element.find("img"),c=this.settings.nestedItemSelector?"."+this.settings.nestedItemSelector:d,e=this.$element.children(c).width(),b.length&&0>=e)return this.preloadAutoWidthImages(b),!1}this.$element.addClass("owl-loading"),this.$stage=a("<"+this.settings.stageElement+' class="owl-stage"/>').wrap('<div class="owl-stage-outer">'),this.$element.append(this.$stage.parent()),this.replace(this.$element.children().not(this.$stage.parent())),this._width=this.$element.width(),this.refresh(),this.$element.removeClass("owl-loading").addClass("owl-loaded"),this.eventsCall(),this.internalEvents(),this.addTriggerableEvents(),this.trigger("initialized")},e.prototype.setup=function(){var b=this.viewport(),c=this.options.responsive,d=-1,e=null;c?(a.each(c,function(a){b>=a&&a>d&&(d=Number(a))}),e=a.extend({},this.options,c[d]),delete e.responsive,e.responsiveClass&&this.$element.attr("class",function(a,b){return b.replace(/\b owl-responsive-\S+/g,"")}).addClass("owl-responsive-"+d)):e=a.extend({},this.options),(null===this.settings||this._breakpoint!==d)&&(this.trigger("change",{property:{name:"settings",value:e}}),this._breakpoint=d,this.settings=e,this.invalidate("settings"),this.trigger("changed",{property:{name:"settings",value:this.settings}}))},e.prototype.optionsLogic=function(){this.$element.toggleClass("owl-center",this.settings.center),this.settings.loop&&this._items.length<this.settings.items&&(this.settings.loop=!1),this.settings.autoWidth&&(this.settings.stagePadding=!1,this.settings.merge=!1)},e.prototype.prepare=function(b){var c=this.trigger("prepare",{content:b});return c.data||(c.data=a("<"+this.settings.itemElement+"/>").addClass(this.settings.itemClass).append(b)),this.trigger("prepared",{content:c.data}),c.data},e.prototype.update=function(){for(var b=0,c=this._pipe.length,d=a.proxy(function(a){return this[a]},this._invalidated),e={};c>b;)(this._invalidated.all||a.grep(this._pipe[b].filter,d).length>0)&&this._pipe[b].run(e),b++;this._invalidated={}},e.prototype.width=function(a){switch(a=a||e.Width.Default){case e.Width.Inner:case e.Width.Outer:return this._width;default:return this._width-2*this.settings.stagePadding+this.settings.margin}},e.prototype.refresh=function(){if(0===this._items.length)return!1;(new Date).getTime();this.trigger("refresh"),this.setup(),this.optionsLogic(),this.$stage.addClass("owl-refresh"),this.update(),this.$stage.removeClass("owl-refresh"),this.state.orientation=b.orientation,this.watchVisibility(),this.trigger("refreshed")},e.prototype.eventsCall=function(){this.e._onDragStart=a.proxy(function(a){this.onDragStart(a)},this),this.e._onDragMove=a.proxy(function(a){this.onDragMove(a)},this),this.e._onDragEnd=a.proxy(function(a){this.onDragEnd(a)},this),this.e._onResize=a.proxy(function(a){this.onResize(a)},this),this.e._transitionEnd=a.proxy(function(a){this.transitionEnd(a)},this),this.e._preventClick=a.proxy(function(a){this.preventClick(a)},this)},e.prototype.onThrottledResize=function(){b.clearTimeout(this.resizeTimer),this.resizeTimer=b.setTimeout(this.e._onResize,this.settings.responsiveRefreshRate)},e.prototype.onResize=function(){return this._items.length?this._width===this.$element.width()?!1:this.trigger("resize").isDefaultPrevented()?!1:(this._width=this.$element.width(),this.invalidate("width"),this.refresh(),void this.trigger("resized")):!1},e.prototype.eventsRouter=function(a){var b=a.type;"mousedown"===b||"touchstart"===b?this.onDragStart(a):"mousemove"===b||"touchmove"===b?this.onDragMove(a):"mouseup"===b||"touchend"===b?this.onDragEnd(a):"touchcancel"===b&&this.onDragEnd(a)},e.prototype.internalEvents=function(){var c=(k(),l());this.settings.mouseDrag?(this.$stage.on("mousedown",a.proxy(function(a){this.eventsRouter(a)},this)),this.$stage.on("dragstart",function(){return!1}),this.$stage.get(0).onselectstart=function(){return!1}):this.$element.addClass("owl-text-select-on"),this.settings.touchDrag&&!c&&this.$stage.on("touchstart touchcancel",a.proxy(function(a){this.eventsRouter(a)},this)),this.transitionEndVendor&&this.on(this.$stage.get(0),this.transitionEndVendor,this.e._transitionEnd,!1),this.settings.responsive!==!1&&this.on(b,"resize",a.proxy(this.onThrottledResize,this))},e.prototype.onDragStart=function(d){var e,g,h,i;if(e=d.originalEvent||d||b.event,3===e.which||this.state.isTouch)return!1;if("mousedown"===e.type&&this.$stage.addClass("owl-grab"),this.trigger("drag"),this.drag.startTime=(new Date).getTime(),this.speed(0),this.state.isTouch=!0,this.state.isScrolling=!1,this.state.isSwiping=!1,this.drag.distance=0,g=f(e).x,h=f(e).y,this.drag.offsetX=this.$stage.position().left,this.drag.offsetY=this.$stage.position().top,this.settings.rtl&&(this.drag.offsetX=this.$stage.position().left+this.$stage.width()-this.width()+this.settings.margin),this.state.inMotion&&this.support3d)i=this.getTransformProperty(),this.drag.offsetX=i,this.animate(i),this.state.inMotion=!0;else if(this.state.inMotion&&!this.support3d)return this.state.inMotion=!1,!1;this.drag.startX=g-this.drag.offsetX,this.drag.startY=h-this.drag.offsetY,this.drag.start=g-this.drag.startX,this.drag.targetEl=e.target||e.srcElement,this.drag.updatedX=this.drag.start,("IMG"===this.drag.targetEl.tagName||"A"===this.drag.targetEl.tagName)&&(this.drag.targetEl.draggable=!1),a(c).on("mousemove.owl.dragEvents mouseup.owl.dragEvents touchmove.owl.dragEvents touchend.owl.dragEvents",a.proxy(function(a){this.eventsRouter(a)},this))},e.prototype.onDragMove=function(a){var c,e,g,h,i,j;this.state.isTouch&&(this.state.isScrolling||(c=a.originalEvent||a||b.event,e=f(c).x,g=f(c).y,this.drag.currentX=e-this.drag.startX,this.drag.currentY=g-this.drag.startY,this.drag.distance=this.drag.currentX-this.drag.offsetX,this.drag.distance<0?this.state.direction=this.settings.rtl?"right":"left":this.drag.distance>0&&(this.state.direction=this.settings.rtl?"left":"right"),this.settings.loop?this.op(this.drag.currentX,">",this.coordinates(this.minimum()))&&"right"===this.state.direction?this.drag.currentX-=(this.settings.center&&this.coordinates(0))-this.coordinates(this._items.length):this.op(this.drag.currentX,"<",this.coordinates(this.maximum()))&&"left"===this.state.direction&&(this.drag.currentX+=(this.settings.center&&this.coordinates(0))-this.coordinates(this._items.length)):(h=this.coordinates(this.settings.rtl?this.maximum():this.minimum()),i=this.coordinates(this.settings.rtl?this.minimum():this.maximum()),j=this.settings.pullDrag?this.drag.distance/5:0,this.drag.currentX=Math.max(Math.min(this.drag.currentX,h+j),i+j)),(this.drag.distance>8||this.drag.distance<-8)&&(c.preventDefault!==d?c.preventDefault():c.returnValue=!1,this.state.isSwiping=!0),this.drag.updatedX=this.drag.currentX,(this.drag.currentY>16||this.drag.currentY<-16)&&this.state.isSwiping===!1&&(this.state.isScrolling=!0,this.drag.updatedX=this.drag.start),this.animate(this.drag.updatedX)))},e.prototype.onDragEnd=function(b){var d,e,f;if(this.state.isTouch){if("mouseup"===b.type&&this.$stage.removeClass("owl-grab"),this.trigger("dragged"),this.drag.targetEl.removeAttribute("draggable"),this.state.isTouch=!1,this.state.isScrolling=!1,this.state.isSwiping=!1,0===this.drag.distance&&this.state.inMotion!==!0)return this.state.inMotion=!1,!1;this.drag.endTime=(new Date).getTime(),d=this.drag.endTime-this.drag.startTime,e=Math.abs(this.drag.distance),(e>3||d>300)&&this.removeClick(this.drag.targetEl),f=this.closest(this.drag.updatedX),this.speed(this.settings.dragEndSpeed||this.settings.smartSpeed),this.current(f),this.invalidate("position"),this.update(),this.settings.pullDrag||this.drag.updatedX!==this.coordinates(f)||this.transitionEnd(),this.drag.distance=0,a(c).off(".owl.dragEvents")}},e.prototype.removeClick=function(c){this.drag.targetEl=c,a(c).on("click.preventClick",this.e._preventClick),b.setTimeout(function(){a(c).off("click.preventClick")},300)},e.prototype.preventClick=function(b){b.preventDefault?b.preventDefault():b.returnValue=!1,b.stopPropagation&&b.stopPropagation(),a(b.target).off("click.preventClick")},e.prototype.getTransformProperty=function(){var a,c;return a=b.getComputedStyle(this.$stage.get(0),null).getPropertyValue(this.vendorName+"transform"),a=a.replace(/matrix(3d)?\(|\)/g,"").split(","),c=16===a.length,c!==!0?a[4]:a[12]},e.prototype.closest=function(b){var c=-1,d=30,e=this.width(),f=this.coordinates();return this.settings.freeDrag||a.each(f,a.proxy(function(a,g){return b>g-d&&g+d>b?c=a:this.op(b,"<",g)&&this.op(b,">",f[a+1]||g-e)&&(c="left"===this.state.direction?a+1:a),-1===c},this)),this.settings.loop||(this.op(b,">",f[this.minimum()])?c=b=this.minimum():this.op(b,"<",f[this.maximum()])&&(c=b=this.maximum())),c},e.prototype.animate=function(b){this.trigger("translate"),this.state.inMotion=this.speed()>0,this.support3d?this.$stage.css({transform:"translate3d("+b+"px,0px, 0px)",transition:this.speed()/1e3+"s"}):this.state.isTouch?this.$stage.css({left:b+"px"}):this.$stage.animate({left:b},this.speed()/1e3,this.settings.fallbackEasing,a.proxy(function(){this.state.inMotion&&this.transitionEnd()},this))},e.prototype.current=function(a){if(a===d)return this._current;if(0===this._items.length)return d;if(a=this.normalize(a),this._current!==a){var b=this.trigger("change",{property:{name:"position",value:a}});b.data!==d&&(a=this.normalize(b.data)),this._current=a,this.invalidate("position"),this.trigger("changed",{property:{name:"position",value:this._current}})}return this._current},e.prototype.invalidate=function(a){this._invalidated[a]=!0},e.prototype.reset=function(a){a=this.normalize(a),a!==d&&(this._speed=0,this._current=a,this.suppress(["translate","translated"]),this.animate(this.coordinates(a)),this.release(["translate","translated"]))},e.prototype.normalize=function(b,c){var e=c?this._items.length:this._items.length+this._clones.length;return!a.isNumeric(b)||1>e?d:b=this._clones.length?(b%e+e)%e:Math.max(this.minimum(c),Math.min(this.maximum(c),b))},e.prototype.relative=function(a){return a=this.normalize(a),a-=this._clones.length/2,this.normalize(a,!0)},e.prototype.maximum=function(a){var b,c,d,e=0,f=this.settings;if(a)return this._items.length-1;if(!f.loop&&f.center)b=this._items.length-1;else if(f.loop||f.center)if(f.loop||f.center)b=this._items.length+f.items;else{if(!f.autoWidth&&!f.merge)throw"Can not detect maximum absolute position.";for(revert=f.rtl?1:-1,c=this.$stage.width()-this.$element.width();(d=this.coordinates(e))&&!(d*revert>=c);)b=++e}else b=this._items.length-f.items;return b},e.prototype.minimum=function(a){return a?0:this._clones.length/2},e.prototype.items=function(a){return a===d?this._items.slice():(a=this.normalize(a,!0),this._items[a])},e.prototype.mergers=function(a){return a===d?this._mergers.slice():(a=this.normalize(a,!0),this._mergers[a])},e.prototype.clones=function(b){var c=this._clones.length/2,e=c+this._items.length,f=function(a){return a%2===0?e+a/2:c-(a+1)/2};return b===d?a.map(this._clones,function(a,b){return f(b)}):a.map(this._clones,function(a,c){return a===b?f(c):null})},e.prototype.speed=function(a){return a!==d&&(this._speed=a),this._speed},e.prototype.coordinates=function(b){var c=null;return b===d?a.map(this._coordinates,a.proxy(function(a,b){return this.coordinates(b)},this)):(this.settings.center?(c=this._coordinates[b],c+=(this.width()-c+(this._coordinates[b-1]||0))/2*(this.settings.rtl?-1:1)):c=this._coordinates[b-1]||0,c)},e.prototype.duration=function(a,b,c){return Math.min(Math.max(Math.abs(b-a),1),6)*Math.abs(c||this.settings.smartSpeed)},e.prototype.to=function(c,d){if(this.settings.loop){var e=c-this.relative(this.current()),f=this.current(),g=this.current(),h=this.current()+e,i=0>g-h?!0:!1,j=this._clones.length+this._items.length;h<this.settings.items&&i===!1?(f=g+this._items.length,this.reset(f)):h>=j-this.settings.items&&i===!0&&(f=g-this._items.length,this.reset(f)),b.clearTimeout(this.e._goToLoop),this.e._goToLoop=b.setTimeout(a.proxy(function(){this.speed(this.duration(this.current(),f+e,d)),this.current(f+e),this.update()},this),30)}else this.speed(this.duration(this.current(),c,d)),this.current(c),this.update()},e.prototype.next=function(a){a=a||!1,this.to(this.relative(this.current())+1,a)},e.prototype.prev=function(a){a=a||!1,this.to(this.relative(this.current())-1,a)},e.prototype.transitionEnd=function(a){return a!==d&&(a.stopPropagation(),(a.target||a.srcElement||a.originalTarget)!==this.$stage.get(0))?!1:(this.state.inMotion=!1,void this.trigger("translated"))},e.prototype.viewport=function(){var d;if(this.options.responsiveBaseElement!==b)d=a(this.options.responsiveBaseElement).width();else if(b.innerWidth)d=b.innerWidth;else{if(!c.documentElement||!c.documentElement.clientWidth)throw"Can not detect viewport width.";d=c.documentElement.clientWidth}return d},e.prototype.replace=function(b){this.$stage.empty(),this._items=[],b&&(b=b instanceof jQuery?b:a(b)),this.settings.nestedItemSelector&&(b=b.find("."+this.settings.nestedItemSelector)),b.filter(function(){return 1===this.nodeType}).each(a.proxy(function(a,b){b=this.prepare(b),this.$stage.append(b),this._items.push(b),this._mergers.push(1*b.find("[data-merge]").andSelf("[data-merge]").attr("data-merge")||1)},this)),this.reset(a.isNumeric(this.settings.startPosition)?this.settings.startPosition:0),this.invalidate("items")},e.prototype.add=function(a,b){b=b===d?this._items.length:this.normalize(b,!0),this.trigger("add",{content:a,position:b}),0===this._items.length||b===this._items.length?(this.$stage.append(a),this._items.push(a),this._mergers.push(1*a.find("[data-merge]").andSelf("[data-merge]").attr("data-merge")||1)):(this._items[b].before(a),this._items.splice(b,0,a),this._mergers.splice(b,0,1*a.find("[data-merge]").andSelf("[data-merge]").attr("data-merge")||1)),this.invalidate("items"),this.trigger("added",{content:a,position:b})},e.prototype.remove=function(a){a=this.normalize(a,!0),a!==d&&(this.trigger("remove",{content:this._items[a],position:a}),this._items[a].remove(),this._items.splice(a,1),this._mergers.splice(a,1),this.invalidate("items"),this.trigger("removed",{content:null,position:a}))},e.prototype.addTriggerableEvents=function(){var b=a.proxy(function(b,c){return a.proxy(function(a){a.relatedTarget!==this&&(this.suppress([c]),b.apply(this,[].slice.call(arguments,1)),this.release([c]))},this)},this);a.each({next:this.next,prev:this.prev,to:this.to,destroy:this.destroy,refresh:this.refresh,replace:this.replace,add:this.add,remove:this.remove},a.proxy(function(a,c){this.$element.on(a+".owl.carousel",b(c,a+".owl.carousel"))},this))},e.prototype.watchVisibility=function(){function c(a){return a.offsetWidth>0&&a.offsetHeight>0}function d(){c(this.$element.get(0))&&(this.$element.removeClass("owl-hidden"),this.refresh(),b.clearInterval(this.e._checkVisibile))}c(this.$element.get(0))||(this.$element.addClass("owl-hidden"),b.clearInterval(this.e._checkVisibile),this.e._checkVisibile=b.setInterval(a.proxy(d,this),500))},e.prototype.preloadAutoWidthImages=function(b){var c,d,e,f;c=0,d=this,b.each(function(g,h){e=a(h),f=new Image,f.onload=function(){c++,e.attr("src",f.src),e.css("opacity",1),c>=b.length&&(d.state.imagesLoaded=!0,d.initialize())},f.src=e.attr("src")||e.attr("data-src")||e.attr("data-src-retina")})},e.prototype.destroy=function(){this.$element.hasClass(this.settings.themeClass)&&this.$element.removeClass(this.settings.themeClass),this.settings.responsive!==!1&&a(b).off("resize.owl.carousel"),this.transitionEndVendor&&this.off(this.$stage.get(0),this.transitionEndVendor,this.e._transitionEnd);for(var d in this._plugins)this._plugins[d].destroy();(this.settings.mouseDrag||this.settings.touchDrag)&&(this.$stage.off("mousedown touchstart touchcancel"),a(c).off(".owl.dragEvents"),this.$stage.get(0).onselectstart=function(){},this.$stage.off("dragstart",function(){return!1})),this.$element.off(".owl"),this.$stage.children(".cloned").remove(),this.e=null,this.$element.removeData("owlCarousel"),this.$stage.children().contents().unwrap(),this.$stage.children().unwrap(),this.$stage.unwrap()},e.prototype.op=function(a,b,c){var d=this.settings.rtl;switch(b){case"<":return d?a>c:c>a;case">":return d?c>a:a>c;case">=":return d?c>=a:a>=c;case"<=":return d?a>=c:c>=a}},e.prototype.on=function(a,b,c,d){a.addEventListener?a.addEventListener(b,c,d):a.attachEvent&&a.attachEvent("on"+b,c)},e.prototype.off=function(a,b,c,d){a.removeEventListener?a.removeEventListener(b,c,d):a.detachEvent&&a.detachEvent("on"+b,c)},e.prototype.trigger=function(b,c,d){var e={item:{count:this._items.length,index:this.current()}},f=a.camelCase(a.grep(["on",b,d],function(a){return a}).join("-").toLowerCase()),g=a.Event([b,"owl",d||"carousel"].join(".").toLowerCase(),a.extend({relatedTarget:this},e,c));return this._supress[b]||(a.each(this._plugins,function(a,b){b.onTrigger&&b.onTrigger(g)}),this.$element.trigger(g),this.settings&&"function"==typeof this.settings[f]&&this.settings[f].apply(this,g)),g},e.prototype.suppress=function(b){a.each(b,a.proxy(function(a,b){this._supress[b]=!0},this))},e.prototype.release=function(b){a.each(b,a.proxy(function(a,b){delete this._supress[b]},this))},e.prototype.browserSupport=function(){if(this.support3d=j(),this.support3d){this.transformVendor=i();var a=["transitionend","webkitTransitionEnd","transitionend","oTransitionEnd"];this.transitionEndVendor=a[h()],this.vendorName=this.transformVendor.replace(/Transform/i,""),this.vendorName=""!==this.vendorName?"-"+this.vendorName.toLowerCase()+"-":""}this.state.orientation=b.orientation},a.fn.owlCarousel=function(b){return this.each(function(){a(this).data("owlCarousel")||a(this).data("owlCarousel",new e(this,b))})},a.fn.owlCarousel.Constructor=e}(window.Zepto||window.jQuery,window,document),function(a,b){var c=function(b){this._core=b,this._loaded=[],this._handlers={"initialized.owl.carousel change.owl.carousel":a.proxy(function(b){if(b.namespace&&this._core.settings&&this._core.settings.lazyLoad&&(b.property&&"position"==b.property.name||"initialized"==b.type))for(var c=this._core.settings,d=c.center&&Math.ceil(c.items/2)||c.items,e=c.center&&-1*d||0,f=(b.property&&b.property.value||this._core.current())+e,g=this._core.clones().length,h=a.proxy(function(a,b){this.load(b)},this);e++<d;)this.load(g/2+this._core.relative(f)),g&&a.each(this._core.clones(this._core.relative(f++)),h)},this)},this._core.options=a.extend({},c.Defaults,this._core.options),this._core.$element.on(this._handlers)};c.Defaults={lazyLoad:!1},c.prototype.load=function(c){var d=this._core.$stage.children().eq(c),e=d&&d.find(".owl-lazy");!e||a.inArray(d.get(0),this._loaded)>-1||(e.each(a.proxy(function(c,d){var e,f=a(d),g=b.devicePixelRatio>1&&f.attr("data-src-retina")||f.attr("data-src");this._core.trigger("load",{element:f,url:g},"lazy"),f.is("img")?f.one("load.owl.lazy",a.proxy(function(){f.css("opacity",1),this._core.trigger("loaded",{element:f,url:g},"lazy")},this)).attr("src",g):(e=new Image,e.onload=a.proxy(function(){f.css({"background-image":"url("+g+")",opacity:"1"}),this._core.trigger("loaded",{element:f,url:g},"lazy")},this),e.src=g)},this)),this._loaded.push(d.get(0)))},c.prototype.destroy=function(){var a,b;for(a in this.handlers)this._core.$element.off(a,this.handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Lazy=c}(window.Zepto||window.jQuery,window,document),function(a){var b=function(c){this._core=c,this._handlers={"initialized.owl.carousel":a.proxy(function(){this._core.settings.autoHeight&&this.update()},this),"changed.owl.carousel":a.proxy(function(a){this._core.settings.autoHeight&&"position"==a.property.name&&this.update()},this),"loaded.owl.lazy":a.proxy(function(a){this._core.settings.autoHeight&&a.element.closest("."+this._core.settings.itemClass)===this._core.$stage.children().eq(this._core.current())&&this.update()},this)},this._core.options=a.extend({},b.Defaults,this._core.options),this._core.$element.on(this._handlers)};b.Defaults={autoHeight:!1,autoHeightClass:"owl-height"},b.prototype.update=function(){this._core.$stage.parent().height(this._core.$stage.children().eq(this._core.current()).height()).addClass(this._core.settings.autoHeightClass)},b.prototype.destroy=function(){var a,b;for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.AutoHeight=b}(window.Zepto||window.jQuery,window,document),function(a,b,c){var d=function(b){this._core=b,this._videos={},this._playing=null,this._fullscreen=!1,this._handlers={"resize.owl.carousel":a.proxy(function(a){this._core.settings.video&&!this.isInFullScreen()&&a.preventDefault()},this),"refresh.owl.carousel changed.owl.carousel":a.proxy(function(){this._playing&&this.stop()},this),"prepared.owl.carousel":a.proxy(function(b){var c=a(b.content).find(".owl-video");c.length&&(c.css("display","none"),this.fetch(c,a(b.content)))},this)},this._core.options=a.extend({},d.Defaults,this._core.options),this._core.$element.on(this._handlers),this._core.$element.on("click.owl.video",".owl-video-play-icon",a.proxy(function(a){this.play(a)},this))};d.Defaults={video:!1,videoHeight:!1,videoWidth:!1},d.prototype.fetch=function(a,b){var c=a.attr("data-vimeo-id")?"vimeo":"youtube",d=a.attr("data-vimeo-id")||a.attr("data-youtube-id"),e=a.attr("data-width")||this._core.settings.videoWidth,f=a.attr("data-height")||this._core.settings.videoHeight,g=a.attr("href");if(!g)throw new Error("Missing video URL.");if(d=g.match(/(http:|https:|)\/\/(player.|www.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com))\/(video\/|embed\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/),d[3].indexOf("youtu")>-1)c="youtube";else{if(!(d[3].indexOf("vimeo")>-1))throw new Error("Video URL not supported.");c="vimeo"}d=d[6],this._videos[g]={type:c,id:d,width:e,height:f},b.attr("data-video",g),this.thumbnail(a,this._videos[g])},d.prototype.thumbnail=function(b,c){var d,e,f,g=c.width&&c.height?'style="width:'+c.width+"px;height:"+c.height+'px;"':"",h=b.find("img"),i="src",j="",k=this._core.settings,l=function(a){e='<div class="owl-video-play-icon"></div>',d=k.lazyLoad?'<div class="owl-video-tn '+j+'" '+i+'="'+a+'"></div>':'<div class="owl-video-tn" style="opacity:1;background-image:url('+a+')"></div>',b.after(d),b.after(e)};return b.wrap('<div class="owl-video-wrapper"'+g+"></div>"),this._core.settings.lazyLoad&&(i="data-src",j="owl-lazy"),h.length?(l(h.attr(i)),h.remove(),!1):void("youtube"===c.type?(f="http://img.youtube.com/vi/"+c.id+"/hqdefault.jpg",l(f)):"vimeo"===c.type&&a.ajax({type:"GET",url:"http://vimeo.com/api/v2/video/"+c.id+".json",jsonp:"callback",dataType:"jsonp",success:function(a){f=a[0].thumbnail_large,l(f)}}))},d.prototype.stop=function(){this._core.trigger("stop",null,"video"),this._playing.find(".owl-video-frame").remove(),this._playing.removeClass("owl-video-playing"),this._playing=null},d.prototype.play=function(b){this._core.trigger("play",null,"video"),this._playing&&this.stop();var c,d,e=a(b.target||b.srcElement),f=e.closest("."+this._core.settings.itemClass),g=this._videos[f.attr("data-video")],h=g.width||"100%",i=g.height||this._core.$stage.height();"youtube"===g.type?c='<iframe width="'+h+'" height="'+i+'" src="http://www.youtube.com/embed/'+g.id+"?autoplay=1&v="+g.id+'" frameborder="0" allowfullscreen></iframe>':"vimeo"===g.type&&(c='<iframe src="http://player.vimeo.com/video/'+g.id+'?autoplay=1" width="'+h+'" height="'+i+'" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>'),f.addClass("owl-video-playing"),this._playing=f,d=a('<div style="height:'+i+"px; width:"+h+'px" class="owl-video-frame">'+c+"</div>"),e.after(d)},d.prototype.isInFullScreen=function(){var d=c.fullscreenElement||c.mozFullScreenElement||c.webkitFullscreenElement;return d&&a(d).parent().hasClass("owl-video-frame")&&(this._core.speed(0),this._fullscreen=!0),d&&this._fullscreen&&this._playing?!1:this._fullscreen?(this._fullscreen=!1,!1):this._playing&&this._core.state.orientation!==b.orientation?(this._core.state.orientation=b.orientation,!1):!0},d.prototype.destroy=function(){var a,b;this._core.$element.off("click.owl.video");for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Video=d}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this.core=b,this.core.options=a.extend({},e.Defaults,this.core.options),this.swapping=!0,this.previous=d,this.next=d,this.handlers={"change.owl.carousel":a.proxy(function(a){"position"==a.property.name&&(this.previous=this.core.current(),this.next=a.property.value)},this),"drag.owl.carousel dragged.owl.carousel translated.owl.carousel":a.proxy(function(a){this.swapping="translated"==a.type},this),"translate.owl.carousel":a.proxy(function(){this.swapping&&(this.core.options.animateOut||this.core.options.animateIn)&&this.swap()},this)},this.core.$element.on(this.handlers)};e.Defaults={animateOut:!1,animateIn:!1},e.prototype.swap=function(){if(1===this.core.settings.items&&this.core.support3d){this.core.speed(0);var b,c=a.proxy(this.clear,this),d=this.core.$stage.children().eq(this.previous),e=this.core.$stage.children().eq(this.next),f=this.core.settings.animateIn,g=this.core.settings.animateOut;this.core.current()!==this.previous&&(g&&(b=this.core.coordinates(this.previous)-this.core.coordinates(this.next),d.css({left:b+"px"}).addClass("animated owl-animated-out").addClass(g).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",c)),f&&e.addClass("animated owl-animated-in").addClass(f).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",c))}},e.prototype.clear=function(b){a(b.target).css({left:""}).removeClass("animated owl-animated-out owl-animated-in").removeClass(this.core.settings.animateIn).removeClass(this.core.settings.animateOut),this.core.transitionEnd()},e.prototype.destroy=function(){var a,b;for(a in this.handlers)this.core.$element.off(a,this.handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Animate=e}(window.Zepto||window.jQuery,window,document),function(a,b,c){var d=function(b){this.core=b,this.core.options=a.extend({},d.Defaults,this.core.options),this.handlers={"translated.owl.carousel refreshed.owl.carousel":a.proxy(function(){this.autoplay()
+},this),"play.owl.autoplay":a.proxy(function(a,b,c){this.play(b,c)},this),"stop.owl.autoplay":a.proxy(function(){this.stop()},this),"mouseover.owl.autoplay":a.proxy(function(){this.core.settings.autoplayHoverPause&&this.pause()},this),"mouseleave.owl.autoplay":a.proxy(function(){this.core.settings.autoplayHoverPause&&this.autoplay()},this)},this.core.$element.on(this.handlers)};d.Defaults={autoplay:!1,autoplayTimeout:5e3,autoplayHoverPause:!1,autoplaySpeed:!1},d.prototype.autoplay=function(){this.core.settings.autoplay&&!this.core.state.videoPlay?(b.clearInterval(this.interval),this.interval=b.setInterval(a.proxy(function(){this.play()},this),this.core.settings.autoplayTimeout)):b.clearInterval(this.interval)},d.prototype.play=function(){return c.hidden===!0||this.core.state.isTouch||this.core.state.isScrolling||this.core.state.isSwiping||this.core.state.inMotion?void 0:this.core.settings.autoplay===!1?void b.clearInterval(this.interval):void this.core.next(this.core.settings.autoplaySpeed)},d.prototype.stop=function(){b.clearInterval(this.interval)},d.prototype.pause=function(){b.clearInterval(this.interval)},d.prototype.destroy=function(){var a,c;b.clearInterval(this.interval);for(a in this.handlers)this.core.$element.off(a,this.handlers[a]);for(c in Object.getOwnPropertyNames(this))"function"!=typeof this[c]&&(this[c]=null)},a.fn.owlCarousel.Constructor.Plugins.autoplay=d}(window.Zepto||window.jQuery,window,document),function(a){"use strict";var b=function(c){this._core=c,this._initialized=!1,this._pages=[],this._controls={},this._templates=[],this.$element=this._core.$element,this._overrides={next:this._core.next,prev:this._core.prev,to:this._core.to},this._handlers={"prepared.owl.carousel":a.proxy(function(b){this._core.settings.dotsData&&this._templates.push(a(b.content).find("[data-dot]").andSelf("[data-dot]").attr("data-dot"))},this),"add.owl.carousel":a.proxy(function(b){this._core.settings.dotsData&&this._templates.splice(b.position,0,a(b.content).find("[data-dot]").andSelf("[data-dot]").attr("data-dot"))},this),"remove.owl.carousel prepared.owl.carousel":a.proxy(function(a){this._core.settings.dotsData&&this._templates.splice(a.position,1)},this),"change.owl.carousel":a.proxy(function(a){if("position"==a.property.name&&!this._core.state.revert&&!this._core.settings.loop&&this._core.settings.navRewind){var b=this._core.current(),c=this._core.maximum(),d=this._core.minimum();a.data=a.property.value>c?b>=c?d:c:a.property.value<d?c:a.property.value}},this),"changed.owl.carousel":a.proxy(function(a){"position"==a.property.name&&this.draw()},this),"refreshed.owl.carousel":a.proxy(function(){this._initialized||(this.initialize(),this._initialized=!0),this._core.trigger("refresh",null,"navigation"),this.update(),this.draw(),this._core.trigger("refreshed",null,"navigation")},this)},this._core.options=a.extend({},b.Defaults,this._core.options),this.$element.on(this._handlers)};b.Defaults={nav:!1,navRewind:!0,navText:["prev","next"],navSpeed:!1,navElement:"div",navContainer:!1,navContainerClass:"owl-nav",navClass:["owl-prev","owl-next"],slideBy:1,dotClass:"owl-dot",dotsClass:"owl-dots",dots:!0,dotsEach:!1,dotData:!1,dotsSpeed:!1,dotsContainer:!1,controlsClass:"owl-controls"},b.prototype.initialize=function(){var b,c,d=this._core.settings;d.dotsData||(this._templates=[a("<div>").addClass(d.dotClass).append(a("<span>")).prop("outerHTML")]),d.navContainer&&d.dotsContainer||(this._controls.$container=a("<div>").addClass(d.controlsClass).appendTo(this.$element)),this._controls.$indicators=d.dotsContainer?a(d.dotsContainer):a("<div>").hide().addClass(d.dotsClass).appendTo(this._controls.$container),this._controls.$indicators.on("click","div",a.proxy(function(b){var c=a(b.target).parent().is(this._controls.$indicators)?a(b.target).index():a(b.target).parent().index();b.preventDefault(),this.to(c,d.dotsSpeed)},this)),b=d.navContainer?a(d.navContainer):a("<div>").addClass(d.navContainerClass).prependTo(this._controls.$container),this._controls.$next=a("<"+d.navElement+">"),this._controls.$previous=this._controls.$next.clone(),this._controls.$previous.addClass(d.navClass[0]).html(d.navText[0]).hide().prependTo(b).on("click",a.proxy(function(){this.prev(d.navSpeed)},this)),this._controls.$next.addClass(d.navClass[1]).html(d.navText[1]).hide().appendTo(b).on("click",a.proxy(function(){this.next(d.navSpeed)},this));for(c in this._overrides)this._core[c]=a.proxy(this[c],this)},b.prototype.destroy=function(){var a,b,c,d;for(a in this._handlers)this.$element.off(a,this._handlers[a]);for(b in this._controls)this._controls[b].remove();for(d in this.overides)this._core[d]=this._overrides[d];for(c in Object.getOwnPropertyNames(this))"function"!=typeof this[c]&&(this[c]=null)},b.prototype.update=function(){var a,b,c,d=this._core.settings,e=this._core.clones().length/2,f=e+this._core.items().length,g=d.center||d.autoWidth||d.dotData?1:d.dotsEach||d.items;if("page"!==d.slideBy&&(d.slideBy=Math.min(d.slideBy,d.items)),d.dots||"page"==d.slideBy)for(this._pages=[],a=e,b=0,c=0;f>a;a++)(b>=g||0===b)&&(this._pages.push({start:a-e,end:a-e+g-1}),b=0,++c),b+=this._core.mergers(this._core.relative(a))},b.prototype.draw=function(){var b,c,d="",e=this._core.settings,f=(this._core.$stage.children(),this._core.relative(this._core.current()));if(!e.nav||e.loop||e.navRewind||(this._controls.$previous.toggleClass("disabled",0>=f),this._controls.$next.toggleClass("disabled",f>=this._core.maximum())),this._controls.$previous.toggle(e.nav),this._controls.$next.toggle(e.nav),e.dots){if(b=this._pages.length-this._controls.$indicators.children().length,e.dotData&&0!==b){for(c=0;c<this._controls.$indicators.children().length;c++)d+=this._templates[this._core.relative(c)];this._controls.$indicators.html(d)}else b>0?(d=new Array(b+1).join(this._templates[0]),this._controls.$indicators.append(d)):0>b&&this._controls.$indicators.children().slice(b).remove();this._controls.$indicators.find(".active").removeClass("active"),this._controls.$indicators.children().eq(a.inArray(this.current(),this._pages)).addClass("active")}this._controls.$indicators.toggle(e.dots)},b.prototype.onTrigger=function(b){var c=this._core.settings;b.page={index:a.inArray(this.current(),this._pages),count:this._pages.length,size:c&&(c.center||c.autoWidth||c.dotData?1:c.dotsEach||c.items)}},b.prototype.current=function(){var b=this._core.relative(this._core.current());return a.grep(this._pages,function(a){return a.start<=b&&a.end>=b}).pop()},b.prototype.getPosition=function(b){var c,d,e=this._core.settings;return"page"==e.slideBy?(c=a.inArray(this.current(),this._pages),d=this._pages.length,b?++c:--c,c=this._pages[(c%d+d)%d].start):(c=this._core.relative(this._core.current()),d=this._core.items().length,b?c+=e.slideBy:c-=e.slideBy),c},b.prototype.next=function(b){a.proxy(this._overrides.to,this._core)(this.getPosition(!0),b)},b.prototype.prev=function(b){a.proxy(this._overrides.to,this._core)(this.getPosition(!1),b)},b.prototype.to=function(b,c,d){var e;d?a.proxy(this._overrides.to,this._core)(b,c):(e=this._pages.length,a.proxy(this._overrides.to,this._core)(this._pages[(b%e+e)%e].start,c))},a.fn.owlCarousel.Constructor.Plugins.Navigation=b}(window.Zepto||window.jQuery,window,document),function(a,b){"use strict";var c=function(d){this._core=d,this._hashes={},this.$element=this._core.$element,this._handlers={"initialized.owl.carousel":a.proxy(function(){"URLHash"==this._core.settings.startPosition&&a(b).trigger("hashchange.owl.navigation")},this),"prepared.owl.carousel":a.proxy(function(b){var c=a(b.content).find("[data-hash]").andSelf("[data-hash]").attr("data-hash");this._hashes[c]=b.content},this)},this._core.options=a.extend({},c.Defaults,this._core.options),this.$element.on(this._handlers),a(b).on("hashchange.owl.navigation",a.proxy(function(){var a=b.location.hash.substring(1),c=this._core.$stage.children(),d=this._hashes[a]&&c.index(this._hashes[a])||0;return a?void this._core.to(d,!1,!0):!1},this))};c.Defaults={URLhashListener:!1},c.prototype.destroy=function(){var c,d;a(b).off("hashchange.owl.navigation");for(c in this._handlers)this._core.$element.off(c,this._handlers[c]);for(d in Object.getOwnPropertyNames(this))"function"!=typeof this[d]&&(this[d]=null)},a.fn.owlCarousel.Constructor.Plugins.Hash=c}(window.Zepto||window.jQuery,window,document);
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/js/plugins.js b/sm-shop/src/main/webapp/resources/templates/generic/js/plugins.js
new file mode 100644
index 0000000..badfef2
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/js/plugins.js
@@ -0,0 +1,38 @@
+// Avoid `console` errors in browsers that lack a console.
+(function() {
+ var method;
+ var noop = function () {};
+ var methods = [
+ 'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error',
+ 'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log',
+ 'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd',
+ 'timeline', 'timelineEnd', 'timeStamp', 'trace', 'warn'
+ ];
+ var length = methods.length;
+ var console = (window.console = window.console || {});
+
+ while (length--) {
+ method = methods[length];
+
+ // Only stub undefined methods.
+ if (!console[method]) {
+ console[method] = noop;
+ }
+ }
+}());
+
+// Place any jQuery/helper plugins in here.
+
+/*!
+ * scrollup v2.4.1
+ * Url: http://markgoodyear.com/labs/scrollup/
+ * Copyright (c) Mark Goodyear — @markgdyr — http://markgoodyear.com
+ * License: MIT
+ */
+!function(l,o,e){"use strict";l.fn.scrollUp=function(o){l.data(e.body,"scrollUp")||(l.data(e.body,"scrollUp",!0),l.fn.scrollUp.init(o))},l.fn.scrollUp.init=function(r){var s,t,c,i,n,a,d,p=l.fn.scrollUp.settings=l.extend({},l.fn.scrollUp.defaults,r),f=!1;switch(d=p.scrollTrigger?l(p.scrollTrigger):l("<a/>",{id:p.scrollName,href:"#top"}),p.scrollTitle&&d.attr("title",p.scrollTitle),d.appendTo("body"),p.scrollImg||p.scrollTrigger||d.html(p.scrollText),d.css({display:"none",position:"fixed",zIndex:p.zIndex}),p.activeOverlay&&l("<div/>",{id:p.scrollName+"-active"}).css({position:"absolute",top:p.scrollDistance+"px",width:"100%",borderTop:"1px dotted"+p.activeOverlay,zIndex:p.zIndex}).appendTo("body"),p.animation){case"fade":s="fadeIn",t="fadeOut",c=p.animationSpeed;break;case"slide":s="slideDown",t="slideUp",c=p.animationSpeed;break;default:s="show",t="hide",c=0}i="top"===p.scrollFrom?p.scrollDistance:l(e).height()-l(o).height()-p.scrollDistance,n=l(o).scroll(function(){l(o).scrollTop()>i?f||(d[s](c),f=!0):f&&(d[t](c),f=!1)}),p.scrollTarget?"number"==typeof p.scrollTarget?a=p.scrollTarget:"string"==typeof p.scrollTarget&&(a=Math.floor(l(p.scrollTarget).offset().top)):a=0,d.click(function(o){o.preventDefault(),l("html, body").animate({scrollTop:a},p.scrollSpeed,p.easingType)})},l.fn.scrollUp.defaults={scrollName:"scrollUp",scrollDistance:300,scrollFrom:"top",scrollSpeed:300,easingType:"linear",animation:"fade",animationSpeed:200,scrollTrigger:!1,scrollTarget:!1,scrollText:"Scroll to top",scrollTitle:!1,scrollImg:!1,activeOverlay:!1,zIndex:2147483647},l.fn.scrollUp.destroy=function(r){l.removeData(e.body,"scrollUp"),l("#"+l.fn.scrollUp.settings.scrollName).remove(),l("#"+l.fn.scrollUp.settings.scrollName+"-active").remove(),l.fn.jquery.split(".")[1]>=7?l(o).off("scroll",r):l(o).unbind("scroll",r)},l.scrollUp=l.fn.scrollUp}(jQuery,window,document);
+
+
+
+
+
+
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/js/slippry.min.js b/sm-shop/src/main/webapp/resources/templates/generic/js/slippry.min.js
new file mode 100644
index 0000000..c21a556
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/js/slippry.min.js
@@ -0,0 +1,14 @@
+/** @preserve
+ *
+ * slippry v1.4.0 - Responsive content slider for jQuery
+ * http://slippry.com
+ *
+ * Authors: Lukas Jakob Hafner - @saftsaak
+ * Thomas Hurd - @SeenNotHurd
+ *
+ * Copyright 2016, booncon oy - http://booncon.com
+ *
+ *
+ * Released under the MIT license - http://opensource.org/licenses/MIT
+ */
+!function(a){"use strict";var b;b={slippryWrapper:'<div class="sy-box" />',slideWrapper:'<div class="sy-slides-wrap" />',slideCrop:'<div class="sy-slides-crop" />',boxClass:"sy-list",elements:"li",activeClass:"sy-active",fillerClass:"sy-filler",loadingClass:"sy-loading",adaptiveHeight:!0,start:1,loop:!0,captionsSrc:"img",captions:"overlay",captionsEl:".sy-caption",initSingle:!0,responsive:!0,preload:"visible",pager:!0,pagerClass:"sy-pager",controls:!0,controlClass:"sy-controls",prevClass:"sy-prev",prevText:"Previous",nextClass:"sy-next",nextText:"Next",hideOnEnd:!0,transition:"fade",kenZoom:120,slideMargin:0,transClass:"transition",speed:800,easing:"swing",continuous:!0,useCSS:!0,auto:!0,autoDirection:"next",autoHover:!0,autoHoverDelay:100,autoDelay:500,pause:4e3,onSliderLoad:function(){return this},onSlideBefore:function(){return this},onSlideAfter:function(){return this}},a.fn.slippry=function(c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A;return e=this,0===e.length?this:e.length>1?(e.each(function(){a(this).slippry(c)}),this):(d={},d.vars={},n=function(){var a,b,c;b=document.createElement("div"),c={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",MSTransition:"msTransitionEnd",OTransition:"oTransitionEnd",transition:"transitionEnd transitionend"};for(a in c)if(void 0!==b.style[a])return c[a]},w=function(){var a=document.createElement("div"),b=["Khtml","Ms","O","Moz","Webkit"],c=b.length;return function(d){if(d in a.style)return!0;for(d=d.replace(/^[a-z]/,function(a){return a.toUpperCase()});c--;)if(b[c]+d in a.style)return!0;return!1}}(),z=function(b,c){var d,e,f,g;return d=c.split("."),e=a(b),f="",g="",a.each(d,function(a,b){b.indexOf("#")>=0?f+=b.replace(/^#/,""):g+=b+" "}),f.length&&e.attr("id",f),g.length&&e.attr("class",a.trim(g)),e},A=function(){var a,b,c,e;c={},e={},a=100-d.settings.kenZoom,e.width=d.settings.kenZoom+"%",d.vars.active.index()%2===0?(e.left=a+"%",e.top=a+"%",c.left="0%",c.top="0%"):(e.left="0%",e.top="0%",c.left=a+"%",c.top=a+"%"),b=d.settings.pause+2*d.settings.speed,d.vars.active.css(e),d.vars.active.animate(c,{duration:b,easing:d.settings.easing,queue:!1})},l=function(){d.vars.fresh?(d.vars.slippryWrapper.removeClass(d.settings.loadingClass),d.vars.fresh=!1,d.settings.auto&&e.startAuto(),d.settings.useCSS||"kenburns"!==d.settings.transition||A(),d.settings.onSliderLoad.call(void 0,d.vars.active.index())):a("."+d.settings.fillerClass,d.vars.slideWrapper).addClass("ready")},q=function(b,c){var e,f,g;e=b/c,f=1/e*100+"%",g=a("."+d.settings.fillerClass,d.vars.slideWrapper),g.css({paddingTop:f}),l()},g=function(b){var c,d;void 0!==a("img",b).attr("src")?a("<img />").on("load",function(){c=b.width(),d=b.height(),q(c,d)}).attr("src",a("img",b).attr("src")):(c=b.width(),d=b.height(),q(c,d))},f=function(){if(0===a("."+d.settings.fillerClass,d.vars.slideWrapper).length&&d.vars.slideWrapper.append(a('<div class="'+d.settings.fillerClass+'" />')),d.settings.adaptiveHeight===!0)g(a("."+d.settings.activeClass,e));else{var b,c,f;c=0,f=0,a(d.vars.slides).each(function(){a(this).height()>c&&(b=a(this),c=b.height()),f+=1,f===d.vars.count&&(void 0===b&&(b=a(a(d.vars.slides)[0])),g(b))})}},p=function(){d.settings.pager&&(a("."+d.settings.pagerClass+" li",d.vars.slippryWrapper).removeClass(d.settings.activeClass),a(a("."+d.settings.pagerClass+" li",d.vars.slippryWrapper)[d.vars.active.index()]).addClass(d.settings.activeClass))},u=function(){!d.settings.loop&&d.settings.hideOnEnd&&(a("."+d.settings.prevClass,d.vars.slippryWrapper)[d.vars.first?"hide":"show"](),a("."+d.settings.nextClass,d.vars.slippryWrapper)[d.vars.last?"hide":"show"]())},i=function(){var b,c;d.settings.captions!==!1&&(b="img"!==d.settings.captionsSrc?d.vars.active.attr("title"):void 0!==a("img",d.vars.active).attr("title")?a("img",d.vars.active).attr("title"):a("img",d.vars.active).attr("alt"),c="custom"!==d.settings.captions?a(d.settings.captionsEl,d.vars.slippryWrapper):a(d.settings.captionsEl),void 0!==b&&""!==b?c.html(b).show():c.hide())},e.startAuto=function(){void 0===d.vars.timer&&void 0===d.vars.delay&&(d.vars.delay=window.setTimeout(function(){d.vars.autodelay=!1,d.vars.timer=window.setInterval(function(){d.vars.trigger="auto",t(d.settings.autoDirection)},d.settings.pause)},d.vars.autodelay?d.settings.autoHoverDelay:d.settings.autoDelay),d.settings.autoHover&&d.vars.slideWrapper.unbind("mouseenter").unbind("mouseleave").bind("mouseenter",function(){void 0!==d.vars.timer?(d.vars.hoverStop=!0,e.stopAuto()):d.vars.hoverStop=!1}).bind("mouseleave",function(){d.vars.hoverStop&&(d.vars.autodelay=!0,e.startAuto())}))},e.stopAuto=function(){window.clearInterval(d.vars.timer),d.vars.timer=void 0,window.clearTimeout(d.vars.delay),d.vars.delay=void 0},e.refresh=function(){d.vars.slides.removeClass(d.settings.activeClass),d.vars.active.addClass(d.settings.activeClass),d.settings.responsive?f():l(),u(),p(),i()},s=function(){e.refresh()},m=function(){d.vars.moving=!1,d.vars.active.removeClass(d.settings.transClass),d.vars.fresh||d.vars.old.removeClass("sy-ken"),d.vars.old.removeClass(d.settings.transClass),d.settings.onSlideAfter.call(void 0,d.vars.active,d.vars.old.index(),d.vars.active.index()),d.settings.auto&&(d.vars.hoverStop&&void 0!==d.vars.hoverStop||e.startAuto())},r=function(){var b,c,f,g,h,i,j;d.settings.onSlideBefore.call(void 0,d.vars.active,d.vars.old.index(),d.vars.active.index()),d.settings.transition!==!1?(d.vars.moving=!0,"fade"===d.settings.transition||"kenburns"===d.settings.transition?(d.vars.fresh?(d.settings.useCSS?d.vars.slides.css({transitionDuration:d.settings.speed+"ms",opacity:0}):d.vars.slides.css({opacity:0}),d.vars.active.css("opacity",1),"kenburns"===d.settings.transition&&d.settings.useCSS&&(h=d.settings.pause+2*d.settings.speed,d.vars.slides.css({animationDuration:h+"ms"}),d.vars.active.addClass("sy-ken")),m()):d.settings.useCSS?(d.vars.old.addClass(d.settings.transClass).css("opacity",0),d.vars.active.addClass(d.settings.transClass).css("opacity",1),"kenburns"===d.settings.transition&&d.vars.active.addClass("sy-ken"),a(window).off("focus").on("focus",function(){d.vars.moving&&d.vars.old.trigger(d.vars.transition)}),d.vars.old.one(d.vars.transition,function(){return m(),this})):("kenburns"===d.settings.transition&&A(),d.vars.old.addClass(d.settings.transClass).animate({opacity:0},d.settings.speed,d.settings.easing,function(){m()}),d.vars.active.addClass(d.settings.transClass).css("opacity",0).animate({opacity:1},d.settings.speed,d.settings.easing)),s()):("horizontal"===d.settings.transition||"vertical"===d.settings.transition)&&(i="horizontal"===d.settings.transition?"left":"top",b="-"+d.vars.active.index()*(100+d.settings.slideMargin)+"%",d.vars.fresh?(e.css(i,b),m()):(j={},d.settings.continuous&&(!d.vars.jump||"controls"!==d.vars.trigger&&"auto"!==d.vars.trigger||(c=!0,g=b,d.vars.first?(f=0,d.vars.active.css(i,d.vars.count*(100+d.settings.slideMargin)+"%"),b="-"+d.vars.count*(100+d.settings.slideMargin)+"%"):(f=(d.vars.count-1)*(100+d.settings.slideMargin)+"%",d.vars.active.css(i,-(100+d.settings.slideMargin)+"%"),b=100+d.settings.slideMargin+"%"))),d.vars.active.addClass(d.settings.transClass),d.settings.useCSS?(j[i]=b,j.transitionDuration=d.settings.speed+"ms",e.addClass(d.settings.transition),e.css(j),a(window).off("focus").on("focus",function(){d.vars.moving&&e.trigger(d.vars.transition)}),e.one(d.vars.transition,function(){return e.removeClass(d.settings.transition),c&&(d.vars.active.css(i,f),j[i]=g,j.transitionDuration="0ms",e.css(j)),m(),this})):(j[i]=b,e.stop().animate(j,d.settings.speed,d.settings.easing,function(){return c&&(d.vars.active.css(i,f),e.css(i,g)),m(),this}))),s())):(s(),m())},v=function(a){d.vars.first=d.vars.last=!1,"prev"===a||0===a?d.vars.first=!0:("next"===a||a===d.vars.count-1)&&(d.vars.last=!0)},t=function(b){var c,f;d.vars.moving||("auto"!==d.vars.trigger&&e.stopAuto(),c=d.vars.active.index(),"prev"===b?(f=b,c>0?b=c-1:d.settings.loop&&(b=d.vars.count-1)):"next"===b?(f=b,c<d.vars.count-1?b=c+1:d.settings.loop&&(b=0)):(b-=1,f=c>b?"prev":"next"),d.vars.jump=!1,"prev"===b||"next"===b||b===c&&!d.vars.fresh||(v(b),d.vars.old=d.vars.active,d.vars.active=a(d.vars.slides[b]),(0===c&&"prev"===f||c===d.vars.count-1&&"next"===f)&&(d.vars.jump=!0),r()))},e.goToSlide=function(a){d.vars.trigger="external",t(a)},e.goToNextSlide=function(){d.vars.trigger="external",t("next")},e.goToPrevSlide=function(){d.vars.trigger="external",t("prev")},j=function(){if(d.settings.pager&&d.vars.count>1){var b,c,e;for(b=d.vars.slides.length,e=a('<ul class="'+d.settings.pagerClass+'" />'),c=1;b+1>c;c+=1)e.append(a("<li />").append(a('<a href="#'+c+'">'+c+"</a>")));d.vars.slippryWrapper.append(e),a("."+d.settings.pagerClass+" a",d.vars.slippryWrapper).click(function(){return d.vars.trigger="pager",t(parseInt(this.hash.split("#")[1],10)),!1}),p()}},k=function(){d.settings.controls&&d.vars.count>1&&(d.vars.slideWrapper.append(a('<ul class="'+d.settings.controlClass+'" />').append('<li class="'+d.settings.prevClass+'"><a href="#prev">'+d.settings.prevText+"</a></li>").append('<li class="'+d.settings.nextClass+'"><a href="#next">'+d.settings.nextText+"</a></li>")),a("."+d.settings.controlClass+" a",d.vars.slippryWrapper).click(function(){return d.vars.trigger="controls",t(this.hash.split("#")[1]),!1}),u())},o=function(){d.settings.captions!==!1&&("overlay"===d.settings.captions?d.vars.slideWrapper.append(a('<div class="sy-caption-wrap" />').html(z("<div />",d.settings.captionsEl))):"below"===d.settings.captions&&d.vars.slippryWrapper.append(a('<div class="sy-caption-wrap" />').html(z("<div />",d.settings.captionsEl))))},y=function(){t(d.vars.active.index()+1)},x=function(b){var c,e,f,g;return g="all"===d.settings.preload?b:d.vars.active,f=a("img, iframe",g),c=f.length,0===c?void y():(e=0,void f.each(function(){a(this).one("load error",function(){++e===c&&y()}).each(function(){this.complete&&a(this).trigger("load")})}))},e.getCurrentSlide=function(){return d.vars.active},e.getSlideCount=function(){return d.vars.count},e.destroySlider=function(){d.vars.fresh===!1&&(e.stopAuto(),d.vars.moving=!1,d.vars.slides.each(function(){void 0!==a(this).data("sy-cssBckup")?a(this).attr("style",a(this).data("sy-cssBckup")):a(this).removeAttr("style"),void 0!==a(this).data("sy-classBckup")?a(this).attr("class",a(this).data("sy-classBckup")):a(this).removeAttr("class")}),void 0!==e.data("sy-cssBckup")?e.attr("style",e.data("sy-cssBckup")):e.removeAttr("style"),void 0!==e.data("sy-classBckup")?e.attr("class",e.data("sy-classBckup")):e.removeAttr("class"),d.vars.slippryWrapper.before(e),d.vars.slippryWrapper.remove(),d.vars.fresh=void 0)},e.reloadSlider=function(){e.destroySlider(),h()},h=function(){var f;return d.settings=a.extend({},b,c),d.vars.slides=a(d.settings.elements,e),d.vars.count=d.vars.slides.length,d.settings.useCSS&&(w("transition")||(d.settings.useCSS=!1),d.vars.transition=n()),e.data("sy-cssBckup",e.attr("style")),e.data("sy-classBackup",e.attr("class")),e.addClass(d.settings.boxClass).wrap(d.settings.slippryWrapper).wrap(d.settings.slideWrapper).wrap(d.settings.slideCrop),d.vars.slideWrapper=e.parent().parent(),d.vars.slippryWrapper=d.vars.slideWrapper.parent().addClass(d.settings.loadingClass),d.vars.fresh=!0,d.vars.slides.each(function(){a(this).addClass("sy-slide "+d.settings.transition),d.settings.useCSS&&a(this).addClass("useCSS"),"horizontal"===d.settings.transition?a(this).css("left",a(this).index()*(100+d.settings.slideMargin)+"%"):"vertical"===d.settings.transition&&a(this).css("top",a(this).index()*(100+d.settings.slideMargin)+"%")}),d.vars.count>1||d.settings.initSingle?(-1===a("."+d.settings.activeClass,e).index()?(f="random"===d.settings.start?Math.round(Math.random()*(d.vars.count-1)):d.settings.start>0&&d.settings.start<=d.vars.count?d.settings.start-1:0,d.vars.active=a(d.vars.slides[f]).addClass(d.settings.activeClass)):d.vars.active=a("."+d.settings.activeClass,e),k(),j(),o(),x(d.vars.slides),void 0):this},h(),this)}}(jQuery);
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/js/vendor/jquery-1.12.0.min.js b/sm-shop/src/main/webapp/resources/templates/generic/js/vendor/jquery-1.12.0.min.js
new file mode 100644
index 0000000..6c60672
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/js/vendor/jquery-1.12.0.min.js
@@ -0,0 +1,5 @@
+/*! jQuery v1.12.0 | (c) jQuery Foundation | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=la(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=ma(b);function pa(){}pa.prototype=d.filters=d.pseudos,d.setFilters=new pa,g=fa.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=R.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=S.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(Q," ")}),h=h.slice(c.length));for(g in d.filter)!(e=W[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fa.error(a):z(a,i).slice(0)};function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){n.each(b,function(b,c){n.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==n.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return n.each(arguments,function(a,b){var c;while((c=n.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;
+return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=n._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}}),function(){var a;l.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,e;return c=d.getElementsByTagName("body")[0],c&&c.style?(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(d.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(e),a):void 0}}();var T=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,U=new RegExp("^(?:([+-])=|)("+T+")([a-z%]*)$","i"),V=["Top","Right","Bottom","Left"],W=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)};function X(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNumber[b]||"px"!==j&&+i)&&U.exec(n.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,n.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var Y=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)Y(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav></:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:l.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/<tbody/i;function ia(a){Z.test(a.type)&&(a.defaultChecked=a.checked)}function ja(a,b,c,d,e){for(var f,g,h,i,j,k,m,o=a.length,p=ca(b),q=[],r=0;o>r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?"<table>"!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.rnamespace||a.rnamespace.test(g.namespace))&&(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[n.expando])return a;var b,c,e,f=a.type,g=a,h=this.fixHooks[f];h||(this.fixHooks[f]=h=ma.test(f)?this.mouseHooks:la.test(f)?this.keyHooks:{}),e=h.props?this.props.concat(h.props):this.props,a=new n.Event(g),b=e.length;while(b--)c=e[b],a[c]=g[c];return a.target||(a.target=g.srcElement||d),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,h.filter?h.filter(a,g):a},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,e,f,g=b.button,h=b.fromElement;return null==a.pageX&&null!=b.clientX&&(e=a.target.ownerDocument||d,f=e.documentElement,c=e.body,a.pageX=b.clientX+(f&&f.scrollLeft||c&&c.scrollLeft||0)-(f&&f.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(f&&f.scrollTop||c&&c.scrollTop||0)-(f&&f.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&h&&(a.relatedTarget=h===a.target?b.toElement:h),a.which||void 0===g||(a.which=1&g?1:2&g?3:4&g?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ra()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ra()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return n.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c){var d=n.extend(new n.Event,c,{type:a,isSimulated:!0});n.event.trigger(d,null,b),d.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=d.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)}:function(a,b,c){var d="on"+b;a.detachEvent&&("undefined"==typeof a[d]&&(a[d]=null),a.detachEvent(d,c))},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?pa:qa):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={constructor:n.Event,isDefaultPrevented:qa,isPropagationStopped:qa,isImmediatePropagationStopped:qa,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=pa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=pa,a&&!this.isSimulated&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=pa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!n.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),l.submit||(n.event.special.submit={setup:function(){return n.nodeName(this,"form")?!1:void n.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=n.nodeName(b,"input")||n.nodeName(b,"button")?n.prop(b,"form"):void 0;c&&!n._data(c,"submit")&&(n.event.add(c,"submit._submit",function(a){a._submitBubble=!0}),n._data(c,"submit",!0))})},postDispatch:function(a){a._submitBubble&&(delete a._submitBubble,this.parentNode&&!a.isTrigger&&n.event.simulate("submit",this.parentNode,a))},teardown:function(){return n.nodeName(this,"form")?!1:void n.event.remove(this,"._submit")}}),l.change||(n.event.special.change={setup:function(){return ka.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(n.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._justChanged=!0)}),n.event.add(this,"click._change",function(a){this._justChanged&&!a.isTrigger&&(this._justChanged=!1),n.event.simulate("change",this,a)})),!1):void n.event.add(this,"beforeactivate._change",function(a){var b=a.target;ka.test(b.nodeName)&&!n._data(b,"change")&&(n.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||n.event.simulate("change",this.parentNode,a)}),n._data(b,"change",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return n.event.remove(this,"._change"),!ka.test(this.nodeName)}}),l.focusin||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a))};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=n._data(d,b);e||d.addEventListener(a,c,!0),n._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=n._data(d,b)-1;e?n._data(d,b,e):(d.removeEventListener(a,c,!0),n._removeData(d,b))}}}),n.fn.extend({on:function(a,b,c,d){return sa(this,a,b,c,d)},one:function(a,b,c,d){return sa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=qa),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var ta=/ jQuery\d+="(?:null|\d+)"/g,ua=new RegExp("<(?:"+ba+")[\\s/>]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/<script|<style|<link/i,xa=/checked\s*(?:[^=]|=\s*.checked.)/i,ya=/^true\/(.*)/,za=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ja[0].contentWindow||Ja[0].contentDocument).document,b.write(),b.close(),c=La(a,b),Ja.detach()),Ka[a]=c),c}var Na=/^margin/,Oa=new RegExp("^("+T+")(?!px)[a-z%]+$","i"),Pa=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e},Qa=d.documentElement;!function(){var b,c,e,f,g,h,i=d.createElement("div"),j=d.createElement("div");if(j.style){j.style.cssText="float:left;opacity:.5",l.opacity="0.5"===j.style.opacity,l.cssFloat=!!j.style.cssFloat,j.style.backgroundClip="content-box",j.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===j.style.backgroundClip,i=d.createElement("div"),i.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",j.innerHTML="",i.appendChild(j),l.boxSizing=""===j.style.boxSizing||""===j.style.MozBoxSizing||""===j.style.WebkitBoxSizing,n.extend(l,{reliableHiddenOffsets:function(){return null==b&&k(),f},boxSizingReliable:function(){return null==b&&k(),e},pixelMarginRight:function(){return null==b&&k(),c},pixelPosition:function(){return null==b&&k(),b},reliableMarginRight:function(){return null==b&&k(),g},reliableMarginLeft:function(){return null==b&&k(),h}});function k(){var k,l,m=d.documentElement;m.appendChild(i),j.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",b=e=h=!1,c=g=!0,a.getComputedStyle&&(l=a.getComputedStyle(j),b="1%"!==(l||{}).top,h="2px"===(l||{}).marginLeft,e="4px"===(l||{width:"4px"}).width,j.style.marginRight="50%",c="4px"===(l||{marginRight:"4px"}).marginRight,k=j.appendChild(d.createElement("div")),k.style.cssText=j.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",k.style.marginRight=k.style.width="0",j.style.width="1px",g=!parseFloat((a.getComputedStyle(k)||{}).marginRight),j.removeChild(k)),j.style.display="none",f=0===j.getClientRects().length,f&&(j.style.display="",j.innerHTML="<table><tr><td></td><td>t</td></tr></table>",k=j.getElementsByTagName("td"),k[0].style.cssText="margin:0;border:0;padding:0;display:none",f=0===k[0].offsetHeight,f&&(k[0].style.display="",k[1].style.display="none",f=0===k[0].offsetHeight)),m.removeChild(i)}}}();var Ra,Sa,Ta=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ra=function(b){var c=b.ownerDocument.defaultView;return c.opener||(c=a),c.getComputedStyle(b)},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),!l.pixelMarginRight()&&Oa.test(g)&&Na.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):Qa.currentStyle&&(Ra=function(a){return a.currentStyle},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Oa.test(g)&&!Ta.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Ua(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Va=/alpha\([^)]*\)/i,Wa=/opacity\s*=\s*([^)]*)/i,Xa=/^(none|table(?!-c[ea]).+)/,Ya=new RegExp("^("+T+")(.*)$","i"),Za={position:"absolute",visibility:"hidden",display:"block"},$a={letterSpacing:"0",fontWeight:"400"},_a=["Webkit","O","Moz","ms"],ab=d.createElement("div").style;function bb(a){if(a in ab)return a;var b=a.charAt(0).toUpperCase()+a.slice(1),c=_a.length;while(c--)if(a=_a[c]+b,a in ab)return a}function cb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=n._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&W(d)&&(f[g]=n._data(d,"olddisplay",Ma(d.nodeName)))):(e=W(d),(c&&"none"!==c||!e)&&n._data(d,"olddisplay",e?c:n.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function db(a,b,c){var d=Ya.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function eb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=n.css(a,c+V[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+V[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+V[f]+"Width",!0,e))):(g+=n.css(a,"padding"+V[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+V[f]+"Width",!0,e)));return g}function fb(b,c,e){var f=!0,g="width"===c?b.offsetWidth:b.offsetHeight,h=Ra(b),i=l.boxSizing&&"border-box"===n.css(b,"boxSizing",!1,h);if(d.msFullscreenElement&&a.top!==a&&b.getClientRects().length&&(g=Math.round(100*b.getBoundingClientRect()[c])),0>=g||null==g){if(g=Sa(b,c,h),(0>g||null==g)&&(g=b.style[c]),Oa.test(g))return g;f=i&&(l.boxSizingReliable()||g===b.style[c]),g=parseFloat(g)||0}return g+eb(b,c,e||(i?"border":"content"),f,h)+"px"}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Sa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":l.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;if(b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=U.exec(c))&&e[1]&&(c=X(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(n.cssNumber[h]?"":"px")),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Sa(a,b,d)),"normal"===f&&b in $a&&(f=$a[b]),""===c||c?(e=parseFloat(f),c===!0||isFinite(e)?e||0:f):f}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?Xa.test(n.css(a,"display"))&&0===a.offsetWidth?Pa(a,Za,function(){return fb(a,b,d)}):fb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ra(a);return db(a,c,d?eb(a,b,d,l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),l.opacity||(n.cssHooks.opacity={get:function(a,b){return Wa.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=n.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===n.trim(f.replace(Va,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Va.test(f)?f.replace(Va,e):f+" "+e)}}),n.cssHooks.marginRight=Ua(l.reliableMarginRight,function(a,b){return b?Pa(a,{display:"inline-block"},Sa,[a,"marginRight"]):void 0}),n.cssHooks.marginLeft=Ua(l.reliableMarginLeft,function(a,b){return b?(parseFloat(Sa(a,"marginLeft"))||(n.contains(a.ownerDocument,a)?a.getBoundingClientRect().left-Pa(a,{
+marginLeft:0},function(){return a.getBoundingClientRect().left}):0))+"px":void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+V[d]+b]=f[d]||f[d-2]||f[0];return e}},Na.test(a)||(n.cssHooks[a+b].set=db)}),n.fn.extend({css:function(a,b){return Y(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Ra(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return cb(this,!0)},hide:function(){return cb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){W(this)?n(this).show():n(this).hide()})}});function gb(a,b,c,d,e){return new gb.prototype.init(a,b,c,d,e)}n.Tween=gb,gb.prototype={constructor:gb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=gb.propHooks[this.prop];return a&&a.get?a.get(this):gb.propHooks._default.get(this)},run:function(a){var b,c=gb.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):gb.propHooks._default.set(this),this}},gb.prototype.init.prototype=gb.prototype,gb.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},gb.propHooks.scrollTop=gb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=gb.prototype.init,n.fx.step={};var hb,ib,jb=/^(?:toggle|show|hide)$/,kb=/queueHooks$/;function lb(){return a.setTimeout(function(){hb=void 0}),hb=n.now()}function mb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=V[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function nb(a,b,c){for(var d,e=(qb.tweeners[b]||[]).concat(qb.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ob(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeType&&W(a),r=n._data(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,m.always(function(){m.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=n.css(a,"display"),k="none"===j?n._data(a,"olddisplay")||Ma(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(l.inlineBlockNeedsLayout&&"inline"!==Ma(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",l.shrinkWrapBlocks()||m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],jb.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(o))"inline"===("none"===j?Ma(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=n._data(a,"fxshow",{}),f&&(r.hidden=!q),q?n(a).show():m.done(function(){n(a).hide()}),m.done(function(){var b;n._removeData(a,"fxshow");for(b in o)n.style(a,b,o[b])});for(d in o)g=nb(q?r[d]:0,d,m),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function pb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function qb(a,b,c){var d,e,f=0,g=qb.prefilters.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=hb||lb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:n.extend({},b),opts:n.extend(!0,{specialEasing:{},easing:n.easing._default},c),originalProperties:b,originalOptions:c,startTime:hb||lb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(pb(k,j.opts.specialEasing);g>f;f++)if(d=qb.prefilters[f].call(j,a,k,j.opts))return n.isFunction(d.stop)&&(n._queueHooks(j.elem,j.opts.queue).stop=n.proxy(d.stop,d)),d;return n.map(k,nb,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}n.Animation=n.extend(qb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return X(c.elem,a,U.exec(b),c),c}]},tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.match(G);for(var c,d=0,e=a.length;e>d;d++)c=a[d],qb.tweeners[c]=qb.tweeners[c]||[],qb.tweeners[c].unshift(b)},prefilters:[ob],prefilter:function(a,b){b?qb.prefilters.unshift(a):qb.prefilters.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.fn.extend({fadeTo:function(a,b,c,d){return this.filter(W).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=qb(this,n.extend({},a),f);(e||n._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=n._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&kb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=n._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(mb(b,!0),a,d,e)}}),n.each({slideDown:mb("show"),slideUp:mb("hide"),slideToggle:mb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=n.timers,c=0;for(hb=n.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||n.fx.stop(),hb=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){ib||(ib=a.setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){a.clearInterval(ib),ib=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(b,c){return b=n.fx?n.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a,b=d.createElement("input"),c=d.createElement("div"),e=d.createElement("select"),f=e.appendChild(d.createElement("option"));c=d.createElement("div"),c.setAttribute("className","t"),c.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=c.getElementsByTagName("a")[0],b.setAttribute("type","checkbox"),c.appendChild(b),a=c.getElementsByTagName("a")[0],a.style.cssText="top:1px",l.getSetAttribute="t"!==c.className,l.style=/top/.test(a.getAttribute("style")),l.hrefNormalized="/a"===a.getAttribute("href"),l.checkOn=!!b.value,l.optSelected=f.selected,l.enctype=!!d.createElement("form").enctype,e.disabled=!0,l.optDisabled=!f.disabled,b=d.createElement("input"),b.setAttribute("value",""),l.input=""===b.getAttribute("value"),b.value="t",b.setAttribute("type","radio"),l.radioValue="t"===b.value}();var rb=/\r/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&(l.optDisabled?!c.disabled:null===c.getAttribute("disabled"))&&(!c.parentNode.disabled||!n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)if(d=e[g],n.inArray(n.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>-1:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb,tb,ub=n.expr.attrHandle,vb=/^(?:checked|selected)$/i,wb=l.getSetAttribute,xb=l.input;n.fn.extend({attr:function(a,b){return Y(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),e=n.attrHooks[b]||(n.expr.match.bool.test(b)?tb:sb)),void 0!==c?null===c?void n.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=n.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(G);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)?xb&&wb||!vb.test(c)?a[d]=!1:a[n.camelCase("default-"+c)]=a[d]=!1:n.attr(a,c,""),a.removeAttribute(wb?c:d)}}),tb={set:function(a,b,c){return b===!1?n.removeAttr(a,c):xb&&wb||!vb.test(c)?a.setAttribute(!wb&&n.propFix[c]||c,c):a[n.camelCase("default-"+c)]=a[c]=!0,c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=ub[b]||n.find.attr;xb&&wb||!vb.test(b)?ub[b]=function(a,b,d){var e,f;return d||(f=ub[b],ub[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,ub[b]=f),e}:ub[b]=function(a,b,c){return c?void 0:a[n.camelCase("default-"+b)]?b.toLowerCase():null}}),xb&&wb||(n.attrHooks.value={set:function(a,b,c){return n.nodeName(a,"input")?void(a.defaultValue=b):sb&&sb.set(a,b,c)}}),wb||(sb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},ub.id=ub.name=ub.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},n.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:sb.set},n.attrHooks.contenteditable={set:function(a,b,c){sb.set(a,""===b?!1:b,c)}},n.each(["width","height"],function(a,b){n.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),l.style||(n.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var yb=/^(?:input|select|textarea|button|object)$/i,zb=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return Y(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return a=n.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),n.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&n.isXMLDoc(a)||(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):yb.test(a.nodeName)||zb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),l.hrefNormalized||n.each(["href","src"],function(a,b){n.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this}),l.enctype||(n.propFix.enctype="encoding");var Ab=/[\t\r\n\f]/g;function Bb(a){return n.attr(a,"class")||""}n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,Bb(this)))});if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Bb(c),d=1===c.nodeType&&(" "+e+" ").replace(Ab," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,Bb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Bb(c),d=1===c.nodeType&&(" "+e+" ").replace(Ab," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):n.isFunction(a)?this.each(function(c){n(this).toggleClass(a.call(this,c,Bb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=n(this),f=a.match(G)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(void 0===a||"boolean"===c)&&(b=Bb(this),b&&n._data(this,"__className__",b),n.attr(this,"class",b||a===!1?"":n._data(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+Bb(c)+" ").replace(Ab," ").indexOf(b)>-1)return!0;return!1}}),n.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 contextmenu".split(" "),function(a,b){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Cb=a.location,Db=n.now(),Eb=/\?/,Fb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;n.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=n.trim(b+"");return e&&!n.trim(e.replace(Fb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():n.error("Invalid JSON: "+b)},n.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new a.DOMParser,c=d.parseFromString(b,"text/xml")):(c=new a.ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var Gb=/#.*$/,Hb=/([?&])_=[^&]*/,Ib=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Jb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Kb=/^(?:GET|HEAD)$/,Lb=/^\/\//,Mb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Nb={},Ob={},Pb="*/".concat("*"),Qb=Cb.href,Rb=Mb.exec(Qb.toLowerCase())||[];function Sb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(G)||[];if(n.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Tb(a,b,c,d){var e={},f=a===Ob;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ub(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&n.extend(!0,a,c),a}function Vb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Wb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Qb,type:"GET",isLocal:Jb.test(Rb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Pb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ub(Ub(a,n.ajaxSettings),b):Ub(n.ajaxSettings,a)},ajaxPrefilter:Sb(Nb),ajaxTransport:Sb(Ob),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var d,e,f,g,h,i,j,k,l=n.ajaxSetup({},c),m=l.context||l,o=l.context&&(m.nodeType||m.jquery)?n(m):n.event,p=n.Deferred(),q=n.Callbacks("once memory"),r=l.statusCode||{},s={},t={},u=0,v="canceled",w={readyState:0,getResponseHeader:function(a){var b;if(2===u){if(!k){k={};while(b=Ib.exec(g))k[b[1].toLowerCase()]=b[2]}b=k[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===u?g:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return u||(a=t[c]=t[c]||a,s[a]=b),this},overrideMimeType:function(a){return u||(l.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>u)for(b in a)r[b]=[r[b],a[b]];else w.always(a[w.status]);return this},abort:function(a){var b=a||v;return j&&j.abort(b),y(0,b),this}};if(p.promise(w).complete=q.add,w.success=w.done,w.error=w.fail,l.url=((b||l.url||Qb)+"").replace(Gb,"").replace(Lb,Rb[1]+"//"),l.type=c.method||c.type||l.method||l.type,l.dataTypes=n.trim(l.dataType||"*").toLowerCase().match(G)||[""],null==l.crossDomain&&(d=Mb.exec(l.url.toLowerCase()),l.crossDomain=!(!d||d[1]===Rb[1]&&d[2]===Rb[2]&&(d[3]||("http:"===d[1]?"80":"443"))===(Rb[3]||("http:"===Rb[1]?"80":"443")))),l.data&&l.processData&&"string"!=typeof l.data&&(l.data=n.param(l.data,l.traditional)),Tb(Nb,l,c,w),2===u)return w;i=n.event&&l.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!Kb.test(l.type),f=l.url,l.hasContent||(l.data&&(f=l.url+=(Eb.test(f)?"&":"?")+l.data,delete l.data),l.cache===!1&&(l.url=Hb.test(f)?f.replace(Hb,"$1_="+Db++):f+(Eb.test(f)?"&":"?")+"_="+Db++)),l.ifModified&&(n.lastModified[f]&&w.setRequestHeader("If-Modified-Since",n.lastModified[f]),n.etag[f]&&w.setRequestHeader("If-None-Match",n.etag[f])),(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&w.setRequestHeader("Content-Type",l.contentType),w.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+("*"!==l.dataTypes[0]?", "+Pb+"; q=0.01":""):l.accepts["*"]);for(e in l.headers)w.setRequestHeader(e,l.headers[e]);if(l.beforeSend&&(l.beforeSend.call(m,w,l)===!1||2===u))return w.abort();v="abort";for(e in{success:1,error:1,complete:1})w[e](l[e]);if(j=Tb(Ob,l,c,w)){if(w.readyState=1,i&&o.trigger("ajaxSend",[w,l]),2===u)return w;l.async&&l.timeout>0&&(h=a.setTimeout(function(){w.abort("timeout")},l.timeout));try{u=1,j.send(s,y)}catch(x){if(!(2>u))throw x;y(-1,x)}}else y(-1,"No Transport");function y(b,c,d,e){var k,s,t,v,x,y=c;2!==u&&(u=2,h&&a.clearTimeout(h),j=void 0,g=e||"",w.readyState=b>0?4:0,k=b>=200&&300>b||304===b,d&&(v=Vb(l,w,d)),v=Wb(l,v,w,k),k?(l.ifModified&&(x=w.getResponseHeader("Last-Modified"),x&&(n.lastModified[f]=x),x=w.getResponseHeader("etag"),x&&(n.etag[f]=x)),204===b||"HEAD"===l.type?y="nocontent":304===b?y="notmodified":(y=v.state,s=v.data,t=v.error,k=!t)):(t=y,(b||!y)&&(y="error",0>b&&(b=0))),w.status=b,w.statusText=(c||y)+"",k?p.resolveWith(m,[s,y,w]):p.rejectWith(m,[w,y,t]),w.statusCode(r),r=void 0,i&&o.trigger(k?"ajaxSuccess":"ajaxError",[w,l,k?s:t]),q.fireWith(m,[w,y]),i&&(o.trigger("ajaxComplete",[w,l]),--n.active||n.event.trigger("ajaxStop")))}return w},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax(n.extend({url:a,type:b,dataType:e,data:c,success:d},n.isPlainObject(a)&&a))}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){if(n.isFunction(a))return this.each(function(b){n(this).wrapAll(a.call(this,b))});if(this[0]){var b=n(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return n.isFunction(a)?this.each(function(b){n(this).wrapInner(a.call(this,b))}):this.each(function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}});function Xb(a){return a.style&&a.style.display||n.css(a,"display")}function Yb(a){while(a&&1===a.nodeType){if("none"===Xb(a)||"hidden"===a.type)return!0;a=a.parentNode}return!1}n.expr.filters.hidden=function(a){return l.reliableHiddenOffsets()?a.offsetWidth<=0&&a.offsetHeight<=0&&!a.getClientRects().length:Yb(a)},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var Zb=/%20/g,$b=/\[\]$/,_b=/\r?\n/g,ac=/^(?:submit|button|image|reset|file)$/i,bc=/^(?:input|select|textarea|keygen)/i;function cc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||$b.test(a)?d(a,e):cc(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)cc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)cc(c,a[c],b,e);return d.join("&").replace(Zb,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&bc.test(this.nodeName)&&!ac.test(a)&&(this.checked||!Z.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(_b,"\r\n")}}):{name:b.name,value:c.replace(_b,"\r\n")}}).get()}}),n.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return this.isLocal?hc():d.documentMode>8?gc():/^(get|post|head|put|delete|options)$/i.test(this.type)&&gc()||hc()}:gc;var dc=0,ec={},fc=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in ec)ec[a](void 0,!0)}),l.cors=!!fc&&"withCredentials"in fc,fc=l.ajax=!!fc,fc&&n.ajaxTransport(function(b){if(!b.crossDomain||l.cors){var c;return{send:function(d,e){var f,g=b.xhr(),h=++dc;if(g.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(f in b.xhrFields)g[f]=b.xhrFields[f];b.mimeType&&g.overrideMimeType&&g.overrideMimeType(b.mimeType),b.crossDomain||d["X-Requested-With"]||(d["X-Requested-With"]="XMLHttpRequest");for(f in d)void 0!==d[f]&&g.setRequestHeader(f,d[f]+"");g.send(b.hasContent&&b.data||null),c=function(a,d){var f,i,j;if(c&&(d||4===g.readyState))if(delete ec[h],c=void 0,g.onreadystatechange=n.noop,d)4!==g.readyState&&g.abort();else{j={},f=g.status,"string"==typeof g.responseText&&(j.text=g.responseText);try{i=g.statusText}catch(k){i=""}f||!b.isLocal||b.crossDomain?1223===f&&(f=204):f=j.text?200:404}j&&e(f,i,j,g.getAllResponseHeaders())},b.async?4===g.readyState?a.setTimeout(c):g.onreadystatechange=ec[h]=c:c()},abort:function(){c&&c(void 0,!0)}}}});function gc(){try{return new a.XMLHttpRequest}catch(b){}}function hc(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}n.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=d.head||n("head")[0]||d.documentElement;return{send:function(e,f){b=d.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||f(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var ic=[],jc=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=ic.pop()||n.expando+"_"+Db++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(jc.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&jc.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(jc,"$1"+e):b.jsonp!==!1&&(b.url+=(Eb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?n(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,ic.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),l.createHTMLDocument=function(){if(!d.implementation.createHTMLDocument)return!1;var a=d.implementation.createHTMLDocument("");return a.body.innerHTML="<form></form><form></form>",2===a.body.childNodes.length}(),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||(l.createHTMLDocument?d.implementation.createHTMLDocument(""):d);var e=x.exec(a),f=!c&&[];return e?[b.createElement(e[1])]:(e=ja([a],b,f),f&&f.length&&n(f).remove(),n.merge([],e.childNodes))};var kc=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&kc)return kc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=n.trim(a.slice(h,a.length)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(g,f||[a.responseText,b,a])})}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};function lc(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&n.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,n.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,n.contains(b,e)?("undefined"!=typeof e.getBoundingClientRect&&(d=e.getBoundingClientRect()),c=lc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===n.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(c=a.offset()),c.top+=n.css(a[0],"borderTopWidth",!0)-a.scrollTop(),c.left+=n.css(a[0],"borderLeftWidth",!0)-a.scrollLeft()),{top:b.top-c.top-n.css(d,"marginTop",!0),left:b.left-c.left-n.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Qa})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);n.fn[a]=function(d){return Y(this,function(a,d,e){var f=lc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?n(f).scrollLeft():e,c?e:n(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),n.each(["top","left"],function(a,b){
+n.cssHooks[b]=Ua(l.pixelPosition,function(a,c){return c?(c=Sa(a,b),Oa.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return Y(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var mc=a.jQuery,nc=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=nc),b&&a.jQuery===n&&(a.jQuery=mc),n},b||(a.jQuery=a.$=n),n});
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/js/vendor/modernizr-2.8.3.min.js b/sm-shop/src/main/webapp/resources/templates/generic/js/vendor/modernizr-2.8.3.min.js
new file mode 100644
index 0000000..81aafb7
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/js/vendor/modernizr-2.8.3.min.js
@@ -0,0 +1,4 @@
+/* Modernizr 2.8.3 (Custom Build) | MIT & BSD
+ * Build: http://modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-geolocation-inlinesvg-smil-svg-svgclippaths-touch-webgl-shiv-mq-cssclasses-addtest-prefixed-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-load
+ */
+;window.Modernizr=function(a,b,c){function D(a){j.cssText=a}function E(a,b){return D(n.join(a+";")+(b||""))}function F(a,b){return typeof a===b}function G(a,b){return!!~(""+a).indexOf(b)}function H(a,b){for(var d in a){var e=a[d];if(!G(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function I(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:F(f,"function")?f.bind(d||b):f}return!1}function J(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+p.join(d+" ")+d).split(" ");return F(b,"string")||F(b,"undefined")?H(e,b):(e=(a+" "+q.join(d+" ")+d).split(" "),I(e,b,c))}function K(){e.input=function(c){for(var d=0,e=c.length;d<e;d++)u[c[d]]=c[d]in k;return u.list&&(u.list=!!b.createElement("datalist")&&!!a.HTMLDataListElement),u}("autocomplete autofocus list placeholder max min multiple pattern required step".split(" ")),e.inputtypes=function(a){for(var d=0,e,f,h,i=a.length;d<i;d++)k.setAttribute("type",f=a[d]),e=k.type!=="text",e&&(k.value=l,k.style.cssText="position:absolute;visibility:hidden;",/^range$/.test(f)&&k.style.WebkitAppearance!==c?(g.appendChild(k),h=b.defaultView,e=h.getComputedStyle&&h.getComputedStyle(k,null).WebkitAppearance!=="textfield"&&k.offsetHeight!==0,g.removeChild(k)):/^(search|tel)$/.test(f)||(/^(url|email)$/.test(f)?e=k.checkValidity&&k.checkValidity()===!1:e=k.value!=l)),t[a[d]]=!!e;return t}("search tel url email datetime date month week time datetime-local number range color".split(" "))}var d="2.8.3",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k=b.createElement("input"),l=":)",m={}.toString,n=" -webkit- -moz- -o- -ms- ".split(" "),o="Webkit Moz O ms",p=o.split(" "),q=o.toLowerCase().split(" "),r={svg:"http://www.w3.org/2000/svg"},s={},t={},u={},v=[],w=v.slice,x,y=function(a,c,d,e){var f,i,j,k,l=b.createElement("div"),m=b.body,n=m||b.createElement("body");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:h+(d+1),l.appendChild(j);return f=["­",'<style id="s',h,'">',a,"</style>"].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},z=function(b){var c=a.matchMedia||a.msMatchMedia;if(c)return c(b)&&c(b).matches||!1;var d;return y("@media "+b+" { #"+h+" { position: absolute; } }",function(b){d=(a.getComputedStyle?getComputedStyle(b,null):b.currentStyle)["position"]=="absolute"}),d},A=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;return f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=F(e[d],"function"),F(e[d],"undefined")||(e[d]=c),e.removeAttribute(d))),e=null,f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),B={}.hasOwnProperty,C;!F(B,"undefined")&&!F(B.call,"undefined")?C=function(a,b){return B.call(a,b)}:C=function(a,b){return b in a&&F(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=w.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(w.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(w.call(arguments)))};return e}),s.flexbox=function(){return J("flexWrap")},s.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},s.canvastext=function(){return!!e.canvas&&!!F(b.createElement("canvas").getContext("2d").fillText,"function")},s.webgl=function(){return!!a.WebGLRenderingContext},s.touch=function(){var c;return"ontouchstart"in a||a.DocumentTouch&&b instanceof DocumentTouch?c=!0:y(["@media (",n.join("touch-enabled),("),h,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(a){c=a.offsetTop===9}),c},s.geolocation=function(){return"geolocation"in navigator},s.postmessage=function(){return!!a.postMessage},s.websqldatabase=function(){return!!a.openDatabase},s.indexedDB=function(){return!!J("indexedDB",a)},s.hashchange=function(){return A("hashchange",a)&&(b.documentMode===c||b.documentMode>7)},s.history=function(){return!!a.history&&!!history.pushState},s.draganddrop=function(){var a=b.createElement("div");return"draggable"in a||"ondragstart"in a&&"ondrop"in a},s.websockets=function(){return"WebSocket"in a||"MozWebSocket"in a},s.rgba=function(){return D("background-color:rgba(150,255,150,.5)"),G(j.backgroundColor,"rgba")},s.hsla=function(){return D("background-color:hsla(120,40%,100%,.5)"),G(j.backgroundColor,"rgba")||G(j.backgroundColor,"hsla")},s.multiplebgs=function(){return D("background:url(https://),url(https://),red url(https://)"),/(url\s*\(.*?){3}/.test(j.background)},s.backgroundsize=function(){return J("backgroundSize")},s.borderimage=function(){return J("borderImage")},s.borderradius=function(){return J("borderRadius")},s.boxshadow=function(){return J("boxShadow")},s.textshadow=function(){return b.createElement("div").style.textShadow===""},s.opacity=function(){return E("opacity:.55"),/^0.55$/.test(j.opacity)},s.cssanimations=function(){return J("animationName")},s.csscolumns=function(){return J("columnCount")},s.cssgradients=function(){var a="background-image:",b="gradient(linear,left top,right bottom,from(#9f9),to(white));",c="linear-gradient(left top,#9f9, white);";return D((a+"-webkit- ".split(" ").join(b+a)+n.join(c+a)).slice(0,-a.length)),G(j.backgroundImage,"gradient")},s.cssreflections=function(){return J("boxReflect")},s.csstransforms=function(){return!!J("transform")},s.csstransforms3d=function(){var a=!!J("perspective");return a&&"webkitPerspective"in g.style&&y("@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}",function(b,c){a=b.offsetLeft===9&&b.offsetHeight===3}),a},s.csstransitions=function(){return J("transition")},s.fontface=function(){var a;return y('@font-face {font-family:"font";src:url("https://")}',function(c,d){var e=b.getElementById("smodernizr"),f=e.sheet||e.styleSheet,g=f?f.cssRules&&f.cssRules[0]?f.cssRules[0].cssText:f.cssText||"":"";a=/src/i.test(g)&&g.indexOf(d.split(" ")[0])===0}),a},s.generatedcontent=function(){var a;return y(["#",h,"{font:0/0 a}#",h,':after{content:"',l,'";visibility:hidden;font:3px/1 a}'].join(""),function(b){a=b.offsetHeight>=3}),a},s.video=function(){var a=b.createElement("video"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('video/ogg; codecs="theora"').replace(/^no$/,""),c.h264=a.canPlayType('video/mp4; codecs="avc1.42E01E"').replace(/^no$/,""),c.webm=a.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,"")}catch(d){}return c},s.audio=function(){var a=b.createElement("audio"),c=!1;try{if(c=!!a.canPlayType)c=new Boolean(c),c.ogg=a.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),c.mp3=a.canPlayType("audio/mpeg;").replace(/^no$/,""),c.wav=a.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),c.m4a=(a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;")).replace(/^no$/,"")}catch(d){}return c},s.localstorage=function(){try{return localStorage.setItem(h,h),localStorage.removeItem(h),!0}catch(a){return!1}},s.sessionstorage=function(){try{return sessionStorage.setItem(h,h),sessionStorage.removeItem(h),!0}catch(a){return!1}},s.webworkers=function(){return!!a.Worker},s.applicationcache=function(){return!!a.applicationCache},s.svg=function(){return!!b.createElementNS&&!!b.createElementNS(r.svg,"svg").createSVGRect},s.inlinesvg=function(){var a=b.createElement("div");return a.innerHTML="<svg/>",(a.firstChild&&a.firstChild.namespaceURI)==r.svg},s.smil=function(){return!!b.createElementNS&&/SVGAnimate/.test(m.call(b.createElementNS(r.svg,"animate")))},s.svgclippaths=function(){return!!b.createElementNS&&/SVGClipPath/.test(m.call(b.createElementNS(r.svg,"clipPath")))};for(var L in s)C(s,L)&&(x=L.toLowerCase(),e[x]=s[L](),v.push((e[x]?"":"no-")+x));return e.input||K(),e.addTest=function(a,b){if(typeof a=="object")for(var d in a)C(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},D(""),i=k=null,function(a,b){function l(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function m(){var a=s.elements;return typeof a=="string"?a.split(" "):a}function n(a){var b=j[a[h]];return b||(b={},i++,a[h]=i,j[i]=b),b}function o(a,c,d){c||(c=b);if(k)return c.createElement(a);d||(d=n(c));var g;return d.cache[a]?g=d.cache[a].cloneNode():f.test(a)?g=(d.cache[a]=d.createElem(a)).cloneNode():g=d.createElem(a),g.canHaveChildren&&!e.test(a)&&!g.tagUrn?d.frag.appendChild(g):g}function p(a,c){a||(a=b);if(k)return a.createDocumentFragment();c=c||n(a);var d=c.frag.cloneNode(),e=0,f=m(),g=f.length;for(;e<g;e++)d.createElement(f[e]);return d}function q(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return s.shivMethods?o(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/[\w\-]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(s,b.frag)}function r(a){a||(a=b);var c=n(a);return s.shivCSS&&!g&&!c.hasCSS&&(c.hasCSS=!!l(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),k||q(a,c),a}var c="3.7.0",d=a.html5||{},e=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,f=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,g,h="_html5shiv",i=0,j={},k;(function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",g="hidden"in a,k=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){g=!0,k=!0}})();var s={elements:d.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:c,shivCSS:d.shivCSS!==!1,supportsUnknownElements:k,shivMethods:d.shivMethods!==!1,type:"default",shivDocument:r,createElement:o,createDocumentFragment:p};a.html5=s,r(b)}(this,b),e._version=d,e._prefixes=n,e._domPrefixes=q,e._cssomPrefixes=p,e.mq=z,e.hasEvent=A,e.testProp=function(a){return H([a])},e.testAllProps=J,e.testStyles=y,e.prefixed=function(a,b,c){return b?J(a,b,c):J(a,"pfx")},g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+v.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f<d;f++)g=a[f].split("="),(e=z[g.shift()])&&(c=e(c,g));for(f=0;f<b;f++)c=x[f](c);return c}function g(a,e,f,g,h){var i=b(a),j=i.autoCallback;i.url.split(".").pop().split("?").shift(),i.bypass||(e&&(e=d(e)?e:e[a]||e[g]||e[a.split("/").pop().split("?")[0]]),i.instead?i.instead(a,e,f,g,h):(y[i.url]?i.noexec=!0:y[i.url]=1,f.load(i.url,i.forceCSS||!i.forceJS&&"css"==i.url.split(".").pop().split("?").shift()?"c":c,i.noexec,i.attrs,i.timeout),(d(e)||d(j))&&f.load(function(){k(),e&&e(i.origUrl,h,g),j&&j(i.origUrl,h,g),y[i.url]=2})))}function h(a,b){function c(a,c){if(a){if(e(a))c||(j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}),g(a,j,b,0,h);else if(Object(a)===a)for(n in m=function(){var b=0,c;for(c in a)a.hasOwnProperty(c)&&b++;return b}(),a)a.hasOwnProperty(n)&&(!c&&!--m&&(d(j)?j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}:j[n]=function(a){return function(){var b=[].slice.call(arguments);a&&a.apply(this,b),l()}}(k[n])),g(a[n],j,b,n,h))}else!c&&l()}var h=!!a.test,i=a.load||a.both,j=a.callback||f,k=j,l=a.complete||f,m,n;c(h?a.yep:a.nope,!!i),i&&c(i)}var i,j,l=this.yepnope.loader;if(e(a))g(a,0,l,0);else if(w(a))for(i=0;i<a.length;i++)j=a[i],e(j)?g(j,0,l,0):w(j)?B(j):Object(j)===j&&h(j,l);else Object(a)===a&&h(a,l)},B.addPrefix=function(a,b){z[a]=b},B.addFilter=function(a){x.push(a)},B.errorTimeout=1e4,null==b.readyState&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",A=function(){b.removeEventListener("DOMContentLoaded",A,0),b.readyState="complete"},0)),a.yepnope=k(),a.yepnope.executeStack=h,a.yepnope.injectJs=function(a,c,d,e,i,j){var k=b.createElement("script"),l,o,e=e||B.errorTimeout;k.src=a;for(o in d)k.setAttribute(o,d[o]);c=j?h:c||f,k.onreadystatechange=k.onload=function(){!l&&g(k.readyState)&&(l=1,c(),k.onload=k.onreadystatechange=null)},m(function(){l||(l=1,c(1))},e),i?k.onload():n.parentNode.insertBefore(k,n)},a.yepnope.injectCss=function(a,c,d,e,g,i){var e=b.createElement("link"),j,c=i?h:c||f;e.href=a,e.rel="stylesheet",e.type="text/css";for(j in d)e.setAttribute(j,d[j]);g||(n.parentNode.insertBefore(e,n),m(c,0))}}(this,document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))};
diff --git a/sm-shop/src/main/webapp/resources/templates/generic/js/wow.min.js b/sm-shop/src/main/webapp/resources/templates/generic/js/wow.min.js
new file mode 100644
index 0000000..25609b8
--- /dev/null
+++ b/sm-shop/src/main/webapp/resources/templates/generic/js/wow.min.js
@@ -0,0 +1,2 @@
+/*! WOW - v1.1.2 - 2015-08-19
+* Copyright (c) 2015 Matthieu Aussaguel; Licensed MIT */(function(){var a,b,c,d,e,f=function(a,b){return function(){return a.apply(b,arguments)}},g=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};b=function(){function a(){}return a.prototype.extend=function(a,b){var c,d;for(c in b)d=b[c],null==a[c]&&(a[c]=d);return a},a.prototype.isMobile=function(a){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(a)},a.prototype.createEvent=function(a,b,c,d){var e;return null==b&&(b=!1),null==c&&(c=!1),null==d&&(d=null),null!=document.createEvent?(e=document.createEvent("CustomEvent"),e.initCustomEvent(a,b,c,d)):null!=document.createEventObject?(e=document.createEventObject(),e.eventType=a):e.eventName=a,e},a.prototype.emitEvent=function(a,b){return null!=a.dispatchEvent?a.dispatchEvent(b):b in(null!=a)?a[b]():"on"+b in(null!=a)?a["on"+b]():void 0},a.prototype.addEvent=function(a,b,c){return null!=a.addEventListener?a.addEventListener(b,c,!1):null!=a.attachEvent?a.attachEvent("on"+b,c):a[b]=c},a.prototype.removeEvent=function(a,b,c){return null!=a.removeEventListener?a.removeEventListener(b,c,!1):null!=a.detachEvent?a.detachEvent("on"+b,c):delete a[b]},a.prototype.innerHeight=function(){return"innerHeight"in window?window.innerHeight:document.documentElement.clientHeight},a}(),c=this.WeakMap||this.MozWeakMap||(c=function(){function a(){this.keys=[],this.values=[]}return a.prototype.get=function(a){var b,c,d,e,f;for(f=this.keys,b=d=0,e=f.length;e>d;b=++d)if(c=f[b],c===a)return this.values[b]},a.prototype.set=function(a,b){var c,d,e,f,g;for(g=this.keys,c=e=0,f=g.length;f>e;c=++e)if(d=g[c],d===a)return void(this.values[c]=b);return this.keys.push(a),this.values.push(b)},a}()),a=this.MutationObserver||this.WebkitMutationObserver||this.MozMutationObserver||(a=function(){function a(){"undefined"!=typeof console&&null!==console&&console.warn("MutationObserver is not supported by your browser."),"undefined"!=typeof console&&null!==console&&console.warn("WOW.js cannot detect dom mutations, please call .sync() after loading new content.")}return a.notSupported=!0,a.prototype.observe=function(){},a}()),d=this.getComputedStyle||function(a){return this.getPropertyValue=function(b){var c;return"float"===b&&(b="styleFloat"),e.test(b)&&b.replace(e,function(a,b){return b.toUpperCase()}),(null!=(c=a.currentStyle)?c[b]:void 0)||null},this},e=/(\-([a-z]){1})/g,this.WOW=function(){function e(a){null==a&&(a={}),this.scrollCallback=f(this.scrollCallback,this),this.scrollHandler=f(this.scrollHandler,this),this.resetAnimation=f(this.resetAnimation,this),this.start=f(this.start,this),this.scrolled=!0,this.config=this.util().extend(a,this.defaults),null!=a.scrollContainer&&(this.config.scrollContainer=document.querySelector(a.scrollContainer)),this.animationNameCache=new c,this.wowEvent=this.util().createEvent(this.config.boxClass)}return e.prototype.defaults={boxClass:"wow",animateClass:"animated",offset:0,mobile:!0,live:!0,callback:null,scrollContainer:null},e.prototype.init=function(){var a;return this.element=window.document.documentElement,"interactive"===(a=document.readyState)||"complete"===a?this.start():this.util().addEvent(document,"DOMContentLoaded",this.start),this.finished=[]},e.prototype.start=function(){var b,c,d,e;if(this.stopped=!1,this.boxes=function(){var a,c,d,e;for(d=this.element.querySelectorAll("."+this.config.boxClass),e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(b);return e}.call(this),this.all=function(){var a,c,d,e;for(d=this.boxes,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(b);return e}.call(this),this.boxes.length)if(this.disabled())this.resetStyle();else for(e=this.boxes,c=0,d=e.length;d>c;c++)b=e[c],this.applyStyle(b,!0);return this.disabled()||(this.util().addEvent(this.config.scrollContainer||window,"scroll",this.scrollHandler),this.util().addEvent(window,"resize",this.scrollHandler),this.interval=setInterval(this.scrollCallback,50)),this.config.live?new a(function(a){return function(b){var c,d,e,f,g;for(g=[],c=0,d=b.length;d>c;c++)f=b[c],g.push(function(){var a,b,c,d;for(c=f.addedNodes||[],d=[],a=0,b=c.length;b>a;a++)e=c[a],d.push(this.doSync(e));return d}.call(a));return g}}(this)).observe(document.body,{childList:!0,subtree:!0}):void 0},e.prototype.stop=function(){return this.stopped=!0,this.util().removeEvent(this.config.scrollContainer||window,"scroll",this.scrollHandler),this.util().removeEvent(window,"resize",this.scrollHandler),null!=this.interval?clearInterval(this.interval):void 0},e.prototype.sync=function(){return a.notSupported?this.doSync(this.element):void 0},e.prototype.doSync=function(a){var b,c,d,e,f;if(null==a&&(a=this.element),1===a.nodeType){for(a=a.parentNode||a,e=a.querySelectorAll("."+this.config.boxClass),f=[],c=0,d=e.length;d>c;c++)b=e[c],g.call(this.all,b)<0?(this.boxes.push(b),this.all.push(b),this.stopped||this.disabled()?this.resetStyle():this.applyStyle(b,!0),f.push(this.scrolled=!0)):f.push(void 0);return f}},e.prototype.show=function(a){return this.applyStyle(a),a.className=a.className+" "+this.config.animateClass,null!=this.config.callback&&this.config.callback(a),this.util().emitEvent(a,this.wowEvent),this.util().addEvent(a,"animationend",this.resetAnimation),this.util().addEvent(a,"oanimationend",this.resetAnimation),this.util().addEvent(a,"webkitAnimationEnd",this.resetAnimation),this.util().addEvent(a,"MSAnimationEnd",this.resetAnimation),a},e.prototype.applyStyle=function(a,b){var c,d,e;return d=a.getAttribute("data-wow-duration"),c=a.getAttribute("data-wow-delay"),e=a.getAttribute("data-wow-iteration"),this.animate(function(f){return function(){return f.customStyle(a,b,d,c,e)}}(this))},e.prototype.animate=function(){return"requestAnimationFrame"in window?function(a){return window.requestAnimationFrame(a)}:function(a){return a()}}(),e.prototype.resetStyle=function(){var a,b,c,d,e;for(d=this.boxes,e=[],b=0,c=d.length;c>b;b++)a=d[b],e.push(a.style.visibility="visible");return e},e.prototype.resetAnimation=function(a){var b;return a.type.toLowerCase().indexOf("animationend")>=0?(b=a.target||a.srcElement,b.className=b.className.replace(this.config.animateClass,"").trim()):void 0},e.prototype.customStyle=function(a,b,c,d,e){return b&&this.cacheAnimationName(a),a.style.visibility=b?"hidden":"visible",c&&this.vendorSet(a.style,{animationDuration:c}),d&&this.vendorSet(a.style,{animationDelay:d}),e&&this.vendorSet(a.style,{animationIterationCount:e}),this.vendorSet(a.style,{animationName:b?"none":this.cachedAnimationName(a)}),a},e.prototype.vendors=["moz","webkit"],e.prototype.vendorSet=function(a,b){var c,d,e,f;d=[];for(c in b)e=b[c],a[""+c]=e,d.push(function(){var b,d,g,h;for(g=this.vendors,h=[],b=0,d=g.length;d>b;b++)f=g[b],h.push(a[""+f+c.charAt(0).toUpperCase()+c.substr(1)]=e);return h}.call(this));return d},e.prototype.vendorCSS=function(a,b){var c,e,f,g,h,i;for(h=d(a),g=h.getPropertyCSSValue(b),f=this.vendors,c=0,e=f.length;e>c;c++)i=f[c],g=g||h.getPropertyCSSValue("-"+i+"-"+b);return g},e.prototype.animationName=function(a){var b;try{b=this.vendorCSS(a,"animation-name").cssText}catch(c){b=d(a).getPropertyValue("animation-name")}return"none"===b?"":b},e.prototype.cacheAnimationName=function(a){return this.animationNameCache.set(a,this.animationName(a))},e.prototype.cachedAnimationName=function(a){return this.animationNameCache.get(a)},e.prototype.scrollHandler=function(){return this.scrolled=!0},e.prototype.scrollCallback=function(){var a;return!this.scrolled||(this.scrolled=!1,this.boxes=function(){var b,c,d,e;for(d=this.boxes,e=[],b=0,c=d.length;c>b;b++)a=d[b],a&&(this.isVisible(a)?this.show(a):e.push(a));return e}.call(this),this.boxes.length||this.config.live)?void 0:this.stop()},e.prototype.offsetTop=function(a){for(var b;void 0===a.offsetTop;)a=a.parentNode;for(b=a.offsetTop;a=a.offsetParent;)b+=a.offsetTop;return b},e.prototype.isVisible=function(a){var b,c,d,e,f;return c=a.getAttribute("data-wow-offset")||this.config.offset,f=this.config.scrollContainer&&this.config.scrollContainer.scrollTop||window.pageYOffset,e=f+Math.min(this.element.clientHeight,this.util().innerHeight())-c,d=this.offsetTop(a),b=d+a.clientHeight,e>=d&&b>=f},e.prototype.util=function(){return null!=this._util?this._util:this._util=new b},e.prototype.disabled=function(){return!this.config.mobile&&this.util().isMobile(navigator.userAgent)},e}()}).call(this);
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/WEB-INF/shopizer-functions.tld b/sm-shop/src/main/webapp/WEB-INF/shopizer-functions.tld
index a109954..0c3a844 100644
--- a/sm-shop/src/main/webapp/WEB-INF/shopizer-functions.tld
+++ b/sm-shop/src/main/webapp/WEB-INF/shopizer-functions.tld
@@ -1,17 +1,17 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
- <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
- <description><![CDATA["Shopizer functions"]]></description>
- <display-name>"Shopizer Functions"</display-name>
- <tlib-version>2.2</tlib-version>
- <short-name>functions</short-name>
- <uri>/shopizer-functions</uri>
-
-
-
-
-
-
-</taglib>
-
-
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+
+ <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
+ <description><![CDATA["Shopizer functions"]]></description>
+ <display-name>"Shopizer Functions"</display-name>
+ <tlib-version>2.2</tlib-version>
+ <short-name>functions</short-name>
+ <uri>/shopizer-functions</uri>
+
+
+
+
+
+
+</taglib>
+
+
sm-shop/src/main/webapp/WEB-INF/shopizer-tags.tld 648(+324 -324)
diff --git a/sm-shop/src/main/webapp/WEB-INF/shopizer-tags.tld b/sm-shop/src/main/webapp/WEB-INF/shopizer-tags.tld
index cb53dc7..eefa317 100644
--- a/sm-shop/src/main/webapp/WEB-INF/shopizer-tags.tld
+++ b/sm-shop/src/main/webapp/WEB-INF/shopizer-tags.tld
@@ -1,324 +1,324 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-
- <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
- <description><![CDATA["Shopizer tag libs"]]></description>
- <display-name>"Shopizer Tags"</display-name>
- <tlib-version>2.2</tlib-version>
- <short-name>sm</short-name>
- <uri>/shopizer-tags</uri>
-
-<tag>
- <!-- Builds the image URL (in admin section only)-->
- <name>contentImage</name>
- <tag-class>com.salesmanager.shop.tags.ContentImageUrlTag</tag-class>
- <body-content>scriptless</body-content>
-
-
- <attribute>
- <name>imageName</name>
- <required>false</required>
- <rtexprvalue>true</rtexprvalue>
- <type>java.lang.String</type>
- </attribute>
-
- <attribute>
- <name>merchantStore</name>
- <required>false</required>
- <rtexprvalue>true</rtexprvalue>
- <type>com.salesmanager.core.business.merchant.model.MerchantStore</type>
- </attribute>
-
- <attribute>
- <name>imageType</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- <type>java.lang.String</type>
- </attribute>
-</tag>
-
-
-<tag>
- <!-- Builds a content block -->
- <name>pageContent</name>
- <tag-class>com.salesmanager.shop.tags.PageContentTag</tag-class>
- <body-content>scriptless</body-content>
-
-
- <attribute>
- <name>contentCode</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- <type>java.lang.String</type>
- </attribute>
-
-</tag>
-
-
-<tag>
- <!-- Core configuration -->
- <name>config</name>
- <tag-class>com.salesmanager.shop.tags.ConfigurationTag</tag-class>
- <body-content>scriptless</body-content>
-
-
- <attribute>
- <name>configurationCode</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- <type>java.lang.String</type>
- </attribute>
-
-</tag>
-
-
-<tag>
- <!-- Builds the manufacturer image URL -->
- <name>manufacturerImage</name>
- <tag-class>com.salesmanager.shop.tags.ManufacturerImageUrlTag</tag-class>
- <body-content>scriptless</body-content>
-
-
- <attribute>
- <name>imageName</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- <type>java.lang.String</type>
- </attribute>
-
- <attribute>
- <name>manufacturer</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- <type>com.salesmanager.core.business.catalog.product.model.manufacturer.Manufacturer</type>
- </attribute>
-
-</tag>
-
-
-<tag>
- <!-- Builds the product image URL -->
- <name>productImage</name>
- <tag-class>com.salesmanager.shop.tags.ProductImageUrlTag</tag-class>
- <body-content>scriptless</body-content>
-
-
- <attribute>
- <name>imageName</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- <type>java.lang.String</type>
- </attribute>
-
- <attribute>
- <name>product</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- <type>com.salesmanager.core.business.catalog.product.model.Product</type>
- </attribute>
-
-
-</tag>
-
-
-<tag>
- <!-- Builds the product image URL -->
- <name>shopProductImage</name>
- <tag-class>com.salesmanager.shop.tags.ShopProductImageUrlTag</tag-class>
- <body-content>scriptless</body-content>
-
-
- <attribute>
- <name>imageName</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- <type>java.lang.String</type>
- </attribute>
-
- <attribute>
- <name>sku</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- <type>java.lang.String</type>
- </attribute>
-
- <attribute>
- <name>size</name>
- <required>false</required>
- <type>java.lang.String</type>
- </attribute>
-
-
-</tag>
-
-
-<tag>
- <!-- Builds the product image URL -->
- <name>shopProductGroup</name>
- <tag-class>com.salesmanager.shop.tags.ShopProductRelationshipTag</tag-class>
- <body-content>scriptless</body-content>
-
-
- <attribute>
- <name>groupName</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- <type>java.lang.String</type>
- </attribute>
-
-
-
-
-</tag>
-
-<tag>
- <!-- Product price utility -->
- <name>monetary</name>
- <tag-class>com.salesmanager.shop.tags.ShopProductPriceFormatTag</tag-class>
- <body-content>scriptless</body-content>
-
-
- <attribute>
- <name>value</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- <type>java.math.BigDecimal</type>
- </attribute>
-
- <attribute>
- <name>currency</name>
- <required>false</required>
- <rtexprvalue>true</rtexprvalue>
- <type>com.salesmanager.core.business.reference.currency.model.Currency</type>
- </attribute>
-
-
-</tag>
-
-<tag>
- <!-- Builds the admin product download URL -->
- <name>adminProductDownload</name>
- <tag-class>com.salesmanager.shop.tags.AdminProductDownloadUrlTag</tag-class>
- <body-content>scriptless</body-content>
-
- <attribute>
- <name>digitalProduct</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- <type>com.salesmanager.core.business.catalog.product.model.file.DigitalProduct</type>
- </attribute>
-
-
-</tag>
-
-<tag>
- <!-- Builds the order product download URL -->
- <name>orderProductDownload</name>
- <tag-class>com.salesmanager.shop.tags.OrderProductDownloadUrlTag</tag-class>
- <body-content>scriptless</body-content>
-
- <attribute>
- <name>productDownload</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- <type>com.salesmanager.web.entity.order.ReadableOrderProductDownload</type>
- </attribute>
- <attribute>
- <name>orderId</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- <type>java.lang.Long</type>
- </attribute>
-
-
-</tag>
-
-
-<tag>
- <!-- Builds the store logo URL -->
- <name>storeLogo</name>
- <tag-class>com.salesmanager.shop.tags.StoreLogoUrlTag</tag-class>
- <body-content>scriptless</body-content>
-
-</tag>
-
-<tag>
- <!-- Builds breadcrumb parameter -->
- <name>breadcrumbParam</name>
- <tag-class>com.salesmanager.shop.tags.StoreBreadcrumbsTag</tag-class>
- <body-content>scriptless</body-content>
- <attribute>
- <name>categoryId</name>
- <required>false</required>
- <rtexprvalue>true</rtexprvalue>
- <type>java.lang.Long</type>
- </attribute>
- <attribute>
- <name>productId</name>
- <required>false</required>
- <rtexprvalue>true</rtexprvalue>
- <type>java.lang.Long</type>
- </attribute>
-
-</tag>
-
-<tag>
- <!-- Builds the copyright -->
- <name>storeCopy</name>
- <tag-class>com.salesmanager.shop.tags.StoreFooterlTag</tag-class>
- <body-content>scriptless</body-content>
-
-</tag>
-
-
-<tag>
- <!-- Builds the product URL -->
- <name>productUrl</name>
- <tag-class>com.salesmanager.shop.tags.ProductDescriptionUrlTag</tag-class>
- <body-content>scriptless</body-content>
-
-
-
- <attribute>
- <name>productDescription</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- <type>com.salesmanager.core.business.catalog.product.model.description.ProductDescription</type>
- </attribute>
-
-
-</tag>
-
-<tag>
- <!-- Decides if the link anlalyzed has to be handled as the active link -->
- <name>activeLink</name>
- <tag-class>com.salesmanager.shop.tags.ActiveLinkTag</tag-class>
- <body-content>scriptless</body-content>
-
- <attribute>
- <name>linkCode</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- <type>java.lang.String</type>
- </attribute>
- <attribute>
- <name>activeReturnCode</name>
- <required>false</required>
- <rtexprvalue>false</rtexprvalue>
- <type>java.lang.String</type>
- </attribute>
- <attribute>
- <name>inactiveReturnCode</name>
- <required>false</required>
- <rtexprvalue>false</rtexprvalue>
- <type>java.lang.String</type>
- </attribute>
-
-
-</tag>
-
-
-
-
-</taglib>
-
-
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+
+ <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
+ <description><![CDATA["Shopizer tag libs"]]></description>
+ <display-name>"Shopizer Tags"</display-name>
+ <tlib-version>2.2</tlib-version>
+ <short-name>sm</short-name>
+ <uri>/shopizer-tags</uri>
+
+<tag>
+ <!-- Builds the image URL (in admin section only)-->
+ <name>contentImage</name>
+ <tag-class>com.salesmanager.shop.tags.ContentImageUrlTag</tag-class>
+ <body-content>scriptless</body-content>
+
+
+ <attribute>
+ <name>imageName</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+ <attribute>
+ <name>merchantStore</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>com.salesmanager.core.business.merchant.model.MerchantStore</type>
+ </attribute>
+
+ <attribute>
+ <name>imageType</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+</tag>
+
+
+<tag>
+ <!-- Builds a content block -->
+ <name>pageContent</name>
+ <tag-class>com.salesmanager.shop.tags.PageContentTag</tag-class>
+ <body-content>scriptless</body-content>
+
+
+ <attribute>
+ <name>contentCode</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+</tag>
+
+
+<tag>
+ <!-- Core configuration -->
+ <name>config</name>
+ <tag-class>com.salesmanager.shop.tags.ConfigurationTag</tag-class>
+ <body-content>scriptless</body-content>
+
+
+ <attribute>
+ <name>configurationCode</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+</tag>
+
+
+<tag>
+ <!-- Builds the manufacturer image URL -->
+ <name>manufacturerImage</name>
+ <tag-class>com.salesmanager.shop.tags.ManufacturerImageUrlTag</tag-class>
+ <body-content>scriptless</body-content>
+
+
+ <attribute>
+ <name>imageName</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+ <attribute>
+ <name>manufacturer</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>com.salesmanager.core.business.catalog.product.model.manufacturer.Manufacturer</type>
+ </attribute>
+
+</tag>
+
+
+<tag>
+ <!-- Builds the product image URL -->
+ <name>productImage</name>
+ <tag-class>com.salesmanager.shop.tags.ProductImageUrlTag</tag-class>
+ <body-content>scriptless</body-content>
+
+
+ <attribute>
+ <name>imageName</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+ <attribute>
+ <name>product</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>com.salesmanager.core.business.catalog.product.model.Product</type>
+ </attribute>
+
+
+</tag>
+
+
+<tag>
+ <!-- Builds the product image URL -->
+ <name>shopProductImage</name>
+ <tag-class>com.salesmanager.shop.tags.ShopProductImageUrlTag</tag-class>
+ <body-content>scriptless</body-content>
+
+
+ <attribute>
+ <name>imageName</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+ <attribute>
+ <name>sku</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+ <attribute>
+ <name>size</name>
+ <required>false</required>
+ <type>java.lang.String</type>
+ </attribute>
+
+
+</tag>
+
+
+<tag>
+ <!-- Builds the product image URL -->
+ <name>shopProductGroup</name>
+ <tag-class>com.salesmanager.shop.tags.ShopProductRelationshipTag</tag-class>
+ <body-content>scriptless</body-content>
+
+
+ <attribute>
+ <name>groupName</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+
+
+
+</tag>
+
+<tag>
+ <!-- Product price utility -->
+ <name>monetary</name>
+ <tag-class>com.salesmanager.shop.tags.ShopProductPriceFormatTag</tag-class>
+ <body-content>scriptless</body-content>
+
+
+ <attribute>
+ <name>value</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>java.math.BigDecimal</type>
+ </attribute>
+
+ <attribute>
+ <name>currency</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>com.salesmanager.core.business.reference.currency.model.Currency</type>
+ </attribute>
+
+
+</tag>
+
+<tag>
+ <!-- Builds the admin product download URL -->
+ <name>adminProductDownload</name>
+ <tag-class>com.salesmanager.shop.tags.AdminProductDownloadUrlTag</tag-class>
+ <body-content>scriptless</body-content>
+
+ <attribute>
+ <name>digitalProduct</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>com.salesmanager.core.business.catalog.product.model.file.DigitalProduct</type>
+ </attribute>
+
+
+</tag>
+
+<tag>
+ <!-- Builds the order product download URL -->
+ <name>orderProductDownload</name>
+ <tag-class>com.salesmanager.shop.tags.OrderProductDownloadUrlTag</tag-class>
+ <body-content>scriptless</body-content>
+
+ <attribute>
+ <name>productDownload</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>com.salesmanager.web.entity.order.ReadableOrderProductDownload</type>
+ </attribute>
+ <attribute>
+ <name>orderId</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>java.lang.Long</type>
+ </attribute>
+
+
+</tag>
+
+
+<tag>
+ <!-- Builds the store logo URL -->
+ <name>storeLogo</name>
+ <tag-class>com.salesmanager.shop.tags.StoreLogoUrlTag</tag-class>
+ <body-content>scriptless</body-content>
+
+</tag>
+
+<tag>
+ <!-- Builds breadcrumb parameter -->
+ <name>breadcrumbParam</name>
+ <tag-class>com.salesmanager.shop.tags.StoreBreadcrumbsTag</tag-class>
+ <body-content>scriptless</body-content>
+ <attribute>
+ <name>categoryId</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>java.lang.Long</type>
+ </attribute>
+ <attribute>
+ <name>productId</name>
+ <required>false</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>java.lang.Long</type>
+ </attribute>
+
+</tag>
+
+<tag>
+ <!-- Builds the copyright -->
+ <name>storeCopy</name>
+ <tag-class>com.salesmanager.shop.tags.StoreFooterlTag</tag-class>
+ <body-content>scriptless</body-content>
+
+</tag>
+
+
+<tag>
+ <!-- Builds the product URL -->
+ <name>productUrl</name>
+ <tag-class>com.salesmanager.shop.tags.ProductDescriptionUrlTag</tag-class>
+ <body-content>scriptless</body-content>
+
+
+
+ <attribute>
+ <name>productDescription</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>com.salesmanager.core.business.catalog.product.model.description.ProductDescription</type>
+ </attribute>
+
+
+</tag>
+
+<tag>
+ <!-- Decides if the link anlalyzed has to be handled as the active link -->
+ <name>activeLink</name>
+ <tag-class>com.salesmanager.shop.tags.ActiveLinkTag</tag-class>
+ <body-content>scriptless</body-content>
+
+ <attribute>
+ <name>linkCode</name>
+ <required>true</required>
+ <rtexprvalue>true</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <name>activeReturnCode</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+ <attribute>
+ <name>inactiveReturnCode</name>
+ <required>false</required>
+ <rtexprvalue>false</rtexprvalue>
+ <type>java.lang.String</type>
+ </attribute>
+
+
+</tag>
+
+
+
+
+</taglib>
+
+
sm-shop/src/main/webapp/WEB-INF/tiles/tiles-admin.xml 598(+301 -297)
diff --git a/sm-shop/src/main/webapp/WEB-INF/tiles/tiles-admin.xml b/sm-shop/src/main/webapp/WEB-INF/tiles/tiles-admin.xml
index 51d85af..a523730 100644
--- a/sm-shop/src/main/webapp/WEB-INF/tiles/tiles-admin.xml
+++ b/sm-shop/src/main/webapp/WEB-INF/tiles/tiles-admin.xml
@@ -1,298 +1,302 @@
-<?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE tiles-definitions PUBLIC
- "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
- "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
-
-<tiles-definitions>
- <definition name="admin-dashboard" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/home.jsp" />
- </definition>
- <definition name="admin-store" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/merchant/merchant.jsp" />
- </definition>
-
- <definition name="admin-stores" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/merchant/stores.jsp" />
- </definition>
-
- <definition name="admin-store-branding" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/merchant/branding.jsp" />
- </definition>
-
- <definition name="admin-store-landing" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/merchant/storeLanding.jsp" />
- </definition>
-
- <definition name="admin-customers" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/customers/customers.jsp" />
- </definition>
-
- <definition name="admin-customer" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/customers/customer.jsp" />
- </definition>
-
- <definition name="admin-customer-options-values-list" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/customers/optionsValues.jsp" />
- </definition>
-
- <definition name="admin-customer-options-values-details" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/customers/optionValue.jsp" />
- </definition>
-
- <definition name="admin-customer-options-list" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/customers/options.jsp" />
- </definition>
-
- <definition name="admin-customer-options-details" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/customers/option.jsp" />
- </definition>
-
- <definition name="admin-customer-options-set" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/customers/optionsset.jsp" />
- </definition>
-
- <definition name="admin-products" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/products/products.jsp" />
- </definition>
-
- <definition name="admin-catalogue-featured" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/products/featured.jsp" />
- </definition>
-
- <definition name="admin-products-groups" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/products/customProductGroup.jsp" />
- </definition>
-
- <definition name="admin-products-groups-details" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/products/customProductGroupDetails.jsp" />
- </definition>
-
- <definition name="admin-products-edit" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/products/product.jsp" />
- </definition>
-
- <definition name="admin-products-attributes" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/products/attributes.jsp" />
- </definition>
-
- <definition name="admin-products-attribute-details" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/products/attribute.jsp" />
- </definition>
-
- <definition name="admin-products-related" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/products/related.jsp" />
- </definition>
-
- <definition name="admin-products-bundles" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/products/bundles.jsp" />
- </definition>
-
- <definition name="admin-products-prices" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/products/prices.jsp" />
- </definition>
-
- <definition name="admin-products-price" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/products/price.jsp" />
- </definition>
-
- <definition name="admin-products-digital" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/products/digitalProduct.jsp" />
- </definition>
-
- <definition name="admin-products-keywords" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/products/keywords.jsp" />
- </definition>
-
- <definition name="admin-products-images" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/products/productImages.jsp" />
- </definition>
-
- <definition name="admin-products-images-url" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/products/productImagesUrl.jsp" />
- </definition>
-
- <definition name="admin-products-manufacturer" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/products/manufacturers.jsp" />
- </definition>
-
- <definition name="admin-products-manufacturer-details" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/products/manufacturer.jsp" />
- </definition>
-
- <definition name="catalogue-products-categories" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/products/productsCategories.jsp" />
- </definition>
-
- <definition name="catalogue-product-categories" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/products/productsCategories.jsp" />
- </definition>
-
- <definition name="catalogue-product-reviews" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/products/reviews.jsp" />
- </definition>
-
-
- <definition name="admin-shipping-custom" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/shipping/customShippingDetails.jsp" />
- </definition>
-
- <definition name="catalogue-categories" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/categories/categories.jsp" />
- </definition>
-
- <definition name="catalogue-categories-category" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/categories/category.jsp" />
- </definition>
-
- <definition name="catalogue-categories-hierarchy" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/categories/hierarchy.jsp" />
- </definition>
-
- <definition name="catalogue-options-list" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/products/options.jsp" />
- </definition>
-
- <definition name="catalogue-options-details" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/products/option.jsp" />
- </definition>
-
- <definition name="catalogue-optionsvalues-list" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/products/optionsValues.jsp" />
- </definition>
-
- <definition name="catalogue-optionsvalues-details" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/products/optionValue.jsp" />
- </definition>
-
- <definition name="admin-user-profile" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/profile/profile.jsp" />
- </definition>
-
- <definition name="admin-user-password" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/profile/password.jsp" />
- </definition>
-
- <definition name="admin-user-permissions" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/profile/permissions.jsp" />
- </definition>
- <definition name="admin-user-permission" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/profile/permission.jsp" />
- </definition>
-
- <definition name="admin-user-groups" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/profile/groups.jsp" />
- </definition>
-
- <definition name="admin-users" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/profile/users.jsp" />
- </definition>
-
- <definition name="shipping-configs" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/shipping/shippingConfig.jsp" />
- </definition>
-
- <definition name="shipping-methods" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/shipping/shippingMethods.jsp" />
- </definition>
-
- <definition name="shipping-method" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/shipping/shippingMethod.jsp" />
- </definition>
-
- <definition name="shipping-origin" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/shipping/shippingOrigin.jsp" />
- </definition>
-
- <definition name="payment-methods" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/payment/paymentMethods.jsp" />
- </definition>
-
- <definition name="payment-method" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/payment/paymentMethod.jsp" />
- </definition>
-
- <definition name="shipping-options" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/shipping/shippingOptions.jsp" />
- </definition>
-
- <definition name="shipping-packaging" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/shipping/packaging.jsp" />
- </definition>
-
- <definition name="admin-orders" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/orders/orders.jsp" />
- </definition>
-
- <definition name="admin-content-images" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/content/contentImages.jsp" />
- </definition>
-
- <definition name="admin-contentImages-add" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/content/addContentImages.jsp" />
- </definition>
-
- <definition name="admin-content-files" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/content/contentFiles.jsp" />
- </definition>
-
- <definition name="admin-content-pages" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/content/contentPages.jsp" />
- </definition>
-
- <definition name="admin-content-pages-details" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/content/contentPagesDetails.jsp" />
- </definition>
-
-
-
- <definition name="config-accounts" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/configuration/accounts.jsp" />
- </definition>
-
- <definition name="config-email" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/configuration/email.jsp" />
- </definition>
-
- <definition name="config-system" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/configuration/system.jsp" />
- </definition>
-
- <definition name="admin-content-filebrowser" template="/layout/admin/noSkinLayout.jsp">
- <put-attribute name="body" value="/pages/admin/components/fileBrowser.jsp" />
- </definition>
-
- <definition name="admin-orders-edit" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/orders/order.jsp" />
- </definition>
-
- <definition name="admin-orders-transactions" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/orders/transactions.jsp" />
- </definition>
-
- <definition name="tax-classes" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/tax/taxClass.jsp" />
- </definition>
-
-
- <definition name="tax-class" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/tax/taxClassDetails.jsp" />
- </definition>
-
- <definition name="tax-configuration" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/tax/taxConfiguration.jsp" />
- </definition>
-
- <definition name="tax-rates" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/tax/taxRates.jsp" />
- </definition>
-
- <definition name="tax-rate" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/tax/taxRateDetails.jsp" />
- </definition>
-
- <definition name="admin-cache" template="/layout/admin/layout.jsp">
- <put-attribute name="body" value="/pages/admin/configuration/cacheManagement.jsp" />
- </definition>
-
-
+<?xml version="1.0" encoding="UTF-8"?>
+ <!DOCTYPE tiles-definitions PUBLIC
+ "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
+ "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
+
+<tiles-definitions>
+ <definition name="admin-dashboard" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/home.jsp" />
+ </definition>
+ <definition name="admin-store" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/merchant/merchant.jsp" />
+ </definition>
+
+ <definition name="admin-stores" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/merchant/stores.jsp" />
+ </definition>
+
+ <definition name="admin-store-branding" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/merchant/branding.jsp" />
+ </definition>
+
+ <definition name="admin-store-landing" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/merchant/storeLanding.jsp" />
+ </definition>
+
+ <definition name="admin-customers" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/customers/customers.jsp" />
+ </definition>
+
+ <definition name="admin-customer" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/customers/customer.jsp" />
+ </definition>
+
+ <definition name="admin-customer-options-values-list" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/customers/optionsValues.jsp" />
+ </definition>
+
+ <definition name="admin-customer-options-values-details" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/customers/optionValue.jsp" />
+ </definition>
+
+ <definition name="admin-customer-options-list" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/customers/options.jsp" />
+ </definition>
+
+ <definition name="admin-customer-options-details" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/customers/option.jsp" />
+ </definition>
+
+ <definition name="admin-customer-options-set" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/customers/optionsset.jsp" />
+ </definition>
+
+ <definition name="admin-products" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/products/products.jsp" />
+ </definition>
+
+ <definition name="admin-catalogue-featured" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/products/featured.jsp" />
+ </definition>
+
+ <definition name="admin-products-groups" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/products/customProductGroup.jsp" />
+ </definition>
+
+ <definition name="admin-products-groups-details" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/products/customProductGroupDetails.jsp" />
+ </definition>
+
+ <definition name="admin-products-edit" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/products/product.jsp" />
+ </definition>
+
+ <definition name="admin-products-attributes" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/products/attributes.jsp" />
+ </definition>
+
+ <definition name="admin-products-attribute-details" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/products/attribute.jsp" />
+ </definition>
+
+ <definition name="admin-products-related" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/products/related.jsp" />
+ </definition>
+
+ <definition name="admin-products-bundles" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/products/bundles.jsp" />
+ </definition>
+
+ <definition name="admin-products-prices" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/products/prices.jsp" />
+ </definition>
+
+ <definition name="admin-products-price" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/products/price.jsp" />
+ </definition>
+
+ <definition name="admin-products-digital" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/products/digitalProduct.jsp" />
+ </definition>
+
+ <definition name="admin-products-keywords" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/products/keywords.jsp" />
+ </definition>
+
+ <definition name="admin-products-images" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/products/productImages.jsp" />
+ </definition>
+
+ <definition name="admin-products-images-url" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/products/productImagesUrl.jsp" />
+ </definition>
+
+ <definition name="admin-products-manufacturer" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/products/manufacturers.jsp" />
+ </definition>
+
+ <definition name="admin-products-manufacturer-details" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/products/manufacturer.jsp" />
+ </definition>
+
+ <definition name="catalogue-products-categories" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/products/productsCategories.jsp" />
+ </definition>
+
+ <definition name="catalogue-product-categories" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/products/productsCategories.jsp" />
+ </definition>
+
+ <definition name="catalogue-product-reviews" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/products/reviews.jsp" />
+ </definition>
+
+
+ <definition name="admin-shipping-custom" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/shipping/customShippingDetails.jsp" />
+ </definition>
+
+ <definition name="catalogue-categories" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/categories/categories.jsp" />
+ </definition>
+
+ <definition name="catalogue-categories-category" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/categories/category.jsp" />
+ </definition>
+
+ <definition name="catalogue-categories-hierarchy" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/categories/hierarchy.jsp" />
+ </definition>
+
+ <definition name="catalogue-options-list" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/products/options.jsp" />
+ </definition>
+
+ <definition name="catalogue-options-details" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/products/option.jsp" />
+ </definition>
+
+ <definition name="catalogue-optionsvalues-list" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/products/optionsValues.jsp" />
+ </definition>
+
+ <definition name="catalogue-optionsvalues-details" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/products/optionValue.jsp" />
+ </definition>
+
+ <definition name="admin-user-profile" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/profile/profile.jsp" />
+ </definition>
+
+ <definition name="admin-user-password" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/profile/password.jsp" />
+ </definition>
+
+ <definition name="admin-user-permissions" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/profile/permissions.jsp" />
+ </definition>
+ <definition name="admin-user-permission" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/profile/permission.jsp" />
+ </definition>
+
+ <definition name="admin-user-groups" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/profile/groups.jsp" />
+ </definition>
+
+ <definition name="admin-user-group" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/profile/group.jsp" />
+ </definition>
+
+ <definition name="admin-users" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/profile/users.jsp" />
+ </definition>
+
+ <definition name="shipping-configs" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/shipping/shippingConfig.jsp" />
+ </definition>
+
+ <definition name="shipping-methods" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/shipping/shippingMethods.jsp" />
+ </definition>
+
+ <definition name="shipping-method" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/shipping/shippingMethod.jsp" />
+ </definition>
+
+ <definition name="shipping-origin" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/shipping/shippingOrigin.jsp" />
+ </definition>
+
+ <definition name="payment-methods" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/payment/paymentMethods.jsp" />
+ </definition>
+
+ <definition name="payment-method" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/payment/paymentMethod.jsp" />
+ </definition>
+
+ <definition name="shipping-options" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/shipping/shippingOptions.jsp" />
+ </definition>
+
+ <definition name="shipping-packaging" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/shipping/packaging.jsp" />
+ </definition>
+
+ <definition name="admin-orders" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/orders/orders.jsp" />
+ </definition>
+
+ <definition name="admin-content-images" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/content/contentImages.jsp" />
+ </definition>
+
+ <definition name="admin-contentImages-add" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/content/addContentImages.jsp" />
+ </definition>
+
+ <definition name="admin-content-files" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/content/contentFiles.jsp" />
+ </definition>
+
+ <definition name="admin-content-pages" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/content/contentPages.jsp" />
+ </definition>
+
+ <definition name="admin-content-pages-details" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/content/contentPagesDetails.jsp" />
+ </definition>
+
+
+
+ <definition name="config-accounts" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/configuration/accounts.jsp" />
+ </definition>
+
+ <definition name="config-email" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/configuration/email.jsp" />
+ </definition>
+
+ <definition name="config-system" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/configuration/system.jsp" />
+ </definition>
+
+ <definition name="admin-content-filebrowser" template="/layout/admin/noSkinLayout.jsp">
+ <put-attribute name="body" value="/pages/admin/components/fileBrowser.jsp" />
+ </definition>
+
+ <definition name="admin-orders-edit" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/orders/order.jsp" />
+ </definition>
+
+ <definition name="admin-orders-transactions" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/orders/transactions.jsp" />
+ </definition>
+
+ <definition name="tax-classes" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/tax/taxClass.jsp" />
+ </definition>
+
+
+ <definition name="tax-class" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/tax/taxClassDetails.jsp" />
+ </definition>
+
+ <definition name="tax-configuration" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/tax/taxConfiguration.jsp" />
+ </definition>
+
+ <definition name="tax-rates" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/tax/taxRates.jsp" />
+ </definition>
+
+ <definition name="tax-rate" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/tax/taxRateDetails.jsp" />
+ </definition>
+
+ <definition name="admin-cache" template="/layout/admin/layout.jsp">
+ <put-attribute name="body" value="/pages/admin/configuration/cacheManagement.jsp" />
+ </definition>
+
+
</tiles-definitions>
\ No newline at end of file
sm-shop/src/main/webapp/WEB-INF/tiles/tiles-shop.xml 438(+235 -203)
diff --git a/sm-shop/src/main/webapp/WEB-INF/tiles/tiles-shop.xml b/sm-shop/src/main/webapp/WEB-INF/tiles/tiles-shop.xml
index 1f6ff6e..dc60524 100644
--- a/sm-shop/src/main/webapp/WEB-INF/tiles/tiles-shop.xml
+++ b/sm-shop/src/main/webapp/WEB-INF/tiles/tiles-shop.xml
@@ -1,204 +1,236 @@
-<?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE tiles-definitions PUBLIC
- "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
- "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
-
-<tiles-definitions>
-
- <definition name="landing.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/pages/shop/templates/{1}/pages/landing.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
- <definition name="category.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/pages/shop/templates/{1}/pages/category.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
-
- <definition name="items.manufacturer.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/pages/shop/templates/{1}/pages/items.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
- <definition name="product.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/pages/shop/templates/{1}/pages/product.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
- <definition name="review.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/pages/shop/common/catalog/review.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
- <definition name="search.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/pages/shop/templates/{1}/pages/search.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
- <definition name="customer.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/pages/shop/templates/{1}/pages/customer.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
- <definition name="content.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/pages/shop/templates/{1}/pages/content.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
-
- <!-- Shopping cart TO ADD HEADER, NAV, FOOTER-->
- <definition name="maincart.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/pages/shop/common/cart/cart.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
- <!-- Contact us -->
- <definition name="contactus.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/pages/shop/common/merchant/contactus.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
- <!-- Rate product -->
- <definition name="rating.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/pages/shop/common/catalog/rateProduct.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
- <!-- Customer registration - account - orders -->
- <definition name="register.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/pages/shop/common/customer/register.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
- <definition name="customerAccount.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/pages/shop/common/customer/profile.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
- <definition name="customerPassword.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/pages/shop/common/customer/changePassword.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
- <definition name="customerAddress.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/pages/shop/common/customer/address.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
- <definition name="editCustomerAddress.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/pages/shop/common/customer/editAddress.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
- <definition name="customerOrders.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/pages/shop/common/customer/orders.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
- <definition name="customerOrder.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/pages/shop/common/customer/order.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
- <definition name="customerLogon.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/pages/shop/common/customer/logon.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
- <!-- One page checkout -->
- <definition name="checkout.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/pages/shop/common/checkout/checkout.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
- <definition name="confirmation.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/pages/shop/common/checkout/confirmation.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
-
- <!-- page not found -->
- <definition name="404.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/pages/shop/common/notFound.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
- <!-- timeout -->
- <definition name="timeout.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/pages/shop/common/timeout.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
- <!-- access denied -->
- <definition name="accessDenied.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/WEB-INF/views/error/access_denied.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
- <definition name="accessDenied.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="body" value="/WEB-INF/views/error/access_denied.jsp" />
- </definition>
-
- <!-- generic error -->
- <definition name="error.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
- <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
- <put-attribute name="body" value="/WEB-INF/views/error/generic_error.jsp" />
- <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
- </definition>
-
- <definition name="accessDenied.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
- <put-attribute name="body" value="/WEB-INF/views/error/generic_error.jsp" />
- </definition>
-
-
+<?xml version="1.0" encoding="UTF-8"?>
+ <!DOCTYPE tiles-definitions PUBLIC
+ "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
+ "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
+
+<tiles-definitions>
+
+ <definition name="landing.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/templates/{1}/pages/landing.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+ <definition name="category.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/templates/{1}/pages/category.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+
+ <definition name="items.manufacturer.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/templates/{1}/pages/items.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+ <definition name="product.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/templates/{1}/pages/product.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+ <definition name="review.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/common/catalog/review.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+ <definition name="search.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/templates/{1}/pages/search.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+ <definition name="customer.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/templates/{1}/pages/customer.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+ <definition name="content.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/templates/{1}/pages/content.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+
+ <!-- Shopping cart TO ADD HEADER, NAV, FOOTER-->
+ <definition name="maincart.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/common/cart/cart.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+ <!-- generic temlate cart -->
+ <definition name="maincart.generic" template="/pages/shop/templates/generic/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/generic/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/generic/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/templates/generic/pages/cart.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/generic/sections/footer.jsp" />
+ </definition>
+
+ <!-- Contact us -->
+ <definition name="contactus.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/common/merchant/contactus.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+ <!-- Rate product -->
+ <definition name="rating.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/common/catalog/rateProduct.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+ <!-- Customer registration - account - orders -->
+ <definition name="register.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/common/customer/register.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+ <definition name="register.generic" template="/pages/shop/templates/generic/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/generic/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/generic/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/templates/generic/pages/register.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/generic/sections/footer.jsp" />
+ </definition>
+
+ <definition name="customerAccount.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/common/customer/profile.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+ <definition name="customerPassword.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/common/customer/changePassword.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+ <definition name="customerAddress.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/common/customer/address.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+ <definition name="editCustomerAddress.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/common/customer/editAddress.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+ <definition name="customerOrders.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/common/customer/orders.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+ <definition name="customerOrder.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/common/customer/order.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+
+ <definition name="customerLogon.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/common/customer/logon.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+ <!-- logon page specific to generic template -->
+ <definition name="customerLogon.generic" template="/pages/shop/templates/generic/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/generic/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/generic/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/templates/generic/pages/logon.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/generic/sections/footer.jsp" />
+ </definition>
+
+ <!-- One page checkout -->
+ <definition name="checkout.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/common/checkout/checkout.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+ <!-- Checkout for generic template -->
+ <definition name="checkout.generic" template="/pages/shop/templates/generic/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/generic/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/generic/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/templates/generic/pages/checkout.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/generic/sections/footer.jsp" />
+ </definition>
+
+ <definition name="confirmation.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/common/checkout/confirmation.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+
+ <!-- page not found -->
+ <definition name="404.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/common/notFound.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+ <!-- timeout -->
+ <definition name="timeout.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/pages/shop/common/timeout.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+ <!-- access denied -->
+ <definition name="accessDenied.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/WEB-INF/views/error/access_denied.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+ <definition name="accessDenied.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="body" value="/WEB-INF/views/error/access_denied.jsp" />
+ </definition>
+
+ <!-- generic error -->
+ <definition name="error.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="header" value="/pages/shop/templates/{1}/sections/header.jsp" />
+ <put-attribute name="navbar" value="/pages/shop/templates/{1}/sections/navbar.jsp" />
+ <put-attribute name="body" value="/WEB-INF/views/error/generic_error.jsp" />
+ <put-attribute name="footer" value="/pages/shop/templates/{1}/sections/footer.jsp" />
+ </definition>
+
+ <definition name="accessDenied.*" template="/pages/shop/templates/{1}/catalogLayout.jsp">
+ <put-attribute name="body" value="/WEB-INF/views/error/generic_error.jsp" />
+ </definition>
+
+
</tiles-definitions>
\ No newline at end of file
sm-shop/src/main/webapp/WEB-INF/views/admin/logon.jsp 1062(+531 -531)
diff --git a/sm-shop/src/main/webapp/WEB-INF/views/admin/logon.jsp b/sm-shop/src/main/webapp/WEB-INF/views/admin/logon.jsp
index 72aafba..31c159a 100644
--- a/sm-shop/src/main/webapp/WEB-INF/views/admin/logon.jsp
+++ b/sm-shop/src/main/webapp/WEB-INF/views/admin/logon.jsp
@@ -1,532 +1,532 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html>
-
- <%
- response.setCharacterEncoding("UTF-8");
- response.setHeader("Cache-Control", "no-cache");
- response.setHeader("Pragma", "no-cache");
- response.setDateHeader("Expires", -1);
- %>
-
- <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
- <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
- <%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
- <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
-
- <%@page contentType="text/html"%>
- <%@page pageEncoding="UTF-8"%>
-
-
-
-
-
- <head>
- <meta http-equiv="Pragma" content="no-cache">
- <meta http-equiv="expires" content="0">
- <title><s:message code="label.storeadministration"
- text="Store administration" />
- </title>
-
-
-
-
-<style type=text/css>
-#logon {
- margin: 0px auto;
- width: 550px
-}
-
-#login-box {
- width: 333px;
- height: 352px;
- padding: 58px 76px 0 76px;
- color: #ebebeb;
- font: 12px Arial, Helvetica, sans-serif;
- background: url('<c:url value="/resources/img/admin/login-box-backg.png" />') no-repeat left top;
-}
-
-#login-box h2 {
- padding: 0;
- margin: 0;
- color: #ebebeb;
- font: bold 36px "Calibri", Arial;
- border-bottom: 2px solid;
- padding-bottom: 0px;
-}
-
-#login-box {
- margin-left: 30px;
-}
-
-#controls {
- margin-left: -50px;
- margin-top: 30px;
-}
-
-
-
-
-</style>
-
-
-
-
- <link
- href="<c:url value="/resources/css/bootstrap/css/sm-bootstrap.css" />"
- rel="stylesheet" />
- <link href="<c:url value="/resources/css/shopizer-admin.css" />"
- rel="stylesheet" />
-
-
- <style type=text/css>
-.sm label {
- color: #EBEBEB;
- font-size: 16px;
-}
-
-.sm a {
- color: #EBEBEB;
- font-size: 16px;
-}
-
-
-
-
-
-</style>
-
- <script src="<c:url value="/resources/js/bootstrap/jquery.js" />"></script>
- <script type="text/javascript" src="<c:url value="/resources/js/jquery-cookie.js"/>"></script>
- <script src="<c:url value="/resources/js/bootstrap/bootstrap-modal.js" />"></script>
-
-
-
-
- <script language="javascript">
-
- function getUserInformation() {
- // get the form values
- $('#securityQtn1Select').empty();
- $('#securityQtn2Select').empty();
- $('#securityQtn3Select').empty();
- $('#answer1').val('');
- $('#answer2').val('');
- $('#answer3').val('');
- var userName = $('#username').val();
- if(!userName){
- alert("<s:message code="message.username.required" text="User name is required" />");
- }else{
- $.ajax({
- type: 'POST',
- dataType: "json",
- url: "<c:url value="/admin/users/resetPassword.html" />",
- data: "username="+ userName ,
- success: function(response) {
- var msg = isc.XMLTools.selectObjects(response, "/response/statusMessage");
- var status = isc.XMLTools.selectObjects(response, "/response/status");
- if(status==0 || status ==9999) {
- $("#getPassword").modal('hide'),
- $('#getSecurityQtn').modal({
- backdrop: true
- })
-
- var data = isc.XMLTools.selectObjects(response, "/response/data");
- if(data && data.length>0) {
-
- $('#question1').text(data[0].question1);
- $('#question2').text(data[0].question2);
- $('#question3').text(data[0].question3);
-
- }
- } else {
- if(msg!=null && msg !='') {
- alert(msg);
- }
- }
-
- },
- error: function(jqXHR,textStatus,errorThrown) {
- alert('Error ' + jqXHR + "-" + textStatus + "-" + errorThrown);
- }
-
- });
- }
- }
-
-
- function doSecurityQtnSubmit() {
-
- var answer1 = $('#answer1').val();
- var answer2 = $('#answer2').val();
- var answer3 = $('#answer3').val();
-
- if(!answer1){
- alert("<s:message code="security.answer.question1.message" text="Please answer to security question 1"/>");
-
- }else if(!answer2){
- alert("<s:message code="security.answer.question2.message" text="Please answer to security question 2"/>");
-
- }else if(!answer3){
- alert("<s:message code="security.answer.question3.message" text="Please answer to security question 3"/>");
-
- }else{
-
- $.ajax({
- type: 'POST',
- dataType: "json",
- url: "<c:url value="/admin/users/resetPasswordSecurityQtn.html" />",
- data: "answer1="+ answer1+"&answer2="+ answer2+"&answer3="+ answer3,
- success: function(response) {
- //console.log("responcesajid "+response);
- //console.log(response);
- var msg = isc.XMLTools.selectObjects(response, "/response/statusMessage");
- var status = isc.XMLTools.selectObjects(response, "/response/status");
- if(status==0 || status ==9999) {
- $("#getSecurityQtn").modal('hide')
- $('#finalWindow').modal({
- backdrop: true
- })
- $("#finaltext").val (msg);
- var div = document.getElementById('finaltext1');
- div.innerHTML = msg;
- var data = isc.XMLTools.selectObjects(response, "/response/data");
- } else {
- if(msg!=null && msg !='') {
- $("#getSecurityQtn").modal('hide')
- $('#finalWindow').modal({
- backdrop: true
- })
- $("#finaltext").val (msg);
- var div = document.getElementById('finaltext1');
- div.innerHTML = msg;
- }
- }
-
- }
- });
-
- }
- }
-
- $(document)
- .ready(
- function() {
-
- $('#changePassword').click(function() {
- //$('#getPassword').show();
- $('#username').val('');
- $('#getPassword').modal({
- backdrop: true
- })
- })
-
-
- var username = $.cookie('usernamecookie');
- if (username != null && username != '') {
- $('#username').val(username);
- $('#remember').attr('checked', true);
- }
-
-
- $("#formSubmitButton")
- .click(
- function() {
-
-
-
- var hasError = false;
- $('#username_help').html("");
- $('#password_help').html("");
-
-
- if ($('#remember').attr('checked')) {
- $.cookie('usernamecookie', $(
- '#username').val(), {
- expires : 1024,
- path : '/'
- });
- } else {
- $.cookie('usernamecookie',
- null, {
- expires : 1024,
- path : '/'
- });
- }
- if ($.trim($('#username').val()) == '') {
- hasError = true;
- $('#username_help')
- .html(
- "<font color='red' size='4'><strong>*</strong></font>");
- }
-
- if ($.trim($('#password').val()) == '') {
- hasError = true;
- $('#password_help')
- .html(
- "<font color='red' size='4'><strong>*</strong></font>");
- }
-
- if (!hasError) {
- $("#logonForm").submit();
- }
-
- });
-
- });
-</script>
- </head>
-
- <body>
-
- <div id="tabbable" class="sm">
-
- <br />
- <br />
-
- <div id=logon>
-
-
-
-
-
-
-
-
-
- <div class="row">
- <c:if test="${not empty param.login_error}">
- <div class="alert alert-error">
- <s:message code="errors.invalidcredentials"
- text="Invalid username or password" />
- </div>
- </c:if>
- </div>
-
-
-
- <div id="login-box">
-
-
- <div class="row">
- <div style="float: left; width: 180px;">
- <p class="lead">
- <s:message code="button.label.logon" text="Logon" />
- </p>
- </div>
- <div style="float: right;">
- <img alt="go to www.shopizer.com"
- src="<c:url value="/resources/img/shopizer_small.png" />">
- </div>
- </div>
-
- <div class="row">
- <div id="controls">
-
- <form method="post" id="logonForm" class="form-horizontal" action="<c:url value="/login"/>">
- <div class="control-group">
- <label class="control-label" for="inputUser">
- <s:message code="label.username" text="Username" />
- </label>
- <div class="controls">
- <input type="text" id="username" name="username"
- placeholder="<s:message code="label.username" text="Username"/>">
- <span id="username_help" class="help-inline"></span>
- </div>
- </div>
- <div class="control-group">
- <label class="control-label" for="inputPassword">
- <s:message code="label.password" text="Password" />
- </label>
-
- <div class="controls">
- <input type="password" id="password" name="password"
- placeholder="<s:message code="label.password" text="Password"/>">
- <span id="password_help" class="help-inline"></span>
- </div>
- </div>
- <div class="control-group">
- <div class="controls">
- <label class="checkbox">
- <input type="checkbox" id="remember">
- <s:message code="label.logonform.rememberusername"
- text="Remember my user name" />
- <br/>
- <a href="#" id="changePassword"><s:message code="label.logonform.forgotpassword" text="Forgot Password"/>?</a>
- </label>
- <a href="#" class="btn" id="formSubmitButton"> <s:message
- code="button.label.logon" text="button.label.submit2" /> </a>
- </div>
- </div>
- </form>
- </div>
- </div>
-
-
-
- <!-- code for reset password-username prompt sajid shajahan -->
- <div aria-hidden="true" aria-labelledby="myModalLabel" role="dialog" tabindex="-1" class="modal hide fade" id="getPassword" style="display: none;">
- <div class="modal-header">
- <button type="button" class="close" data-dismiss="modal"
- aria-hidden="true">
- ×
- </button>
- <h3 id="myModalLabel" style="color:#333333;">
- <s:message code="label.logonform.resetpassword" text="Password reset"/>
- </h3>
- </div>
- <form method="post" id="resetPasswordForm" class="form-horizontal"
- action="#">
- <div class="modal-body">
- <p>
-
- <div class="control-group">
- <label class="control-label" for="inputUser" style="color:#333333;">
- <s:message code="label.username" text="Username" />
- </label>
- <div class="controls">
- <input type="text" id="username" name="username"
- placeholder="<s:message code="label.username" text="Username"/>">
-
-
- <span id="username_help" class="help-inline"></span>
- </div>
- </div>
-
-
- </form>
- </p>
- </div>
- <div class="modal-footer">
- <div class="controls">
- <input type="button" value="<s:message code="label.generic.next" text="Next" />" onclick="getUserInformation()" class="btn" >
- </div>
- </div>
- </div>
- </form>
- </div>
-
-
-
-
- <!-- code for reset password-security question prompt sajid shajahan -->
- <div aria-hidden="true" aria-labelledby="myModalLabel" role="dialog" tabindex="-1" class="modal hide fade" id="getSecurityQtn" style="display: none;">
- <div class="modal-header">
- <button type="button" class="close" data-dismiss="modal"
- aria-hidden="true">
- ×
- </button>
- <h3 id="myModalLabel" style="color:#333333;">
- <s:message code="label.logonform.securityquestion" text="Password reset"/>
- </h3>
- </div>
- <form method="post" id="resetPasswordForm" class="form-horizontal"
- action="#">
- <div class="modal-body">
- <p>
-
- <div class="control-group">
-
- <label class="control-label" for="inputUser" style="color:#333333;" id="question1">
- <s:message code="security.question1" text="" />
- </label>
- <div class="controls">
- <input type="text" id="answer1" name="answer1"
- placeholder="<s:message code="security.answer.question1.message" text="answer1"/>">
-
-
- </div>
-
-
- </div>
-
- <div class="control-group">
- <label class="control-label" for="inputUser" style="color:#333333;" id="question2">
- <s:message code="security.question2" text="" />
- </label>
- <div class="controls">
- <input type="text" id="answer2" name="answer2"
- placeholder="<s:message code="security.answer.question2.message" text="answer2"/>">
-
-
- </div>
- </div>
-
- <div class="control-group">
- <label class="control-label" for="inputUser" style="color:#333333;" id="question3">
- <s:message code="security.question3" text="" />
- </label>
- <div class="controls">
- <input type="text" id="answer3" name="answer3"
- placeholder="<s:message code="security.answer.question3.message" text="answer3"/>">
-
-
-
- </div>
- </div>
-
- </form>
- </p>
- </div>
- <div class="modal-footer">
- <div class="controls">
- <!-- <a href="#" class="btn" id="passwordResetSubmitButton">
- <s:message code="button.label.submit2" text="Submit" /> </a> -->
- <input type="button" value="Submit" onclick="doSecurityQtnSubmit()" class="btn" >
- </div>
- </div>
- </div>
- </form>
- </div>
-
-
-
- <!-- code for reset password-final window sajid shajahan -->
- <div aria-hidden="true" aria-labelledby="myModalLabel" role="dialog" tabindex="-1" class="modal hide fade" id="finalWindow" style="display: none;">
- <!--<div class="modal" id="getPassword" tabindex="-1" role="dialog" class="modal hide fade" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">-->
- <div class="modal-header">
- <button type="button" class="close" data-dismiss="modal"
- aria-hidden="true">
- ×
- </button>
- <h3 id="myModalLabel" style="color:#333333;">
- <s:message code="" text="Shopizer"/>
- </h3>
- </div>
- <form method="post" id="resetPasswordForm" class="form-horizontal"
- action="#">
- <div class="modal-body">
- <p>
- <h3><center><div id="finaltext1"></div></center></h3>
- <!-- <div class="control-group">
-
- <label class="control-label" for="inputUser" style="color:#333333;">
- <h3><div id="finaltext1"></div></h3>
- </label>
- <div class="controls">
-
- </div>
-
-
- </div>
- -->
-
- </form>
- </p>
- </div>
- <div class="modal-footer">
- <div class="controls">
- <button data-dismiss="modal" class="btn">Close</button>
- </div>
- </div>
- </div>
- </form>
- </div>
-
-
-
-
-
- </div>
- </body>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html>
+
+ <%
+ response.setCharacterEncoding("UTF-8");
+ response.setHeader("Cache-Control", "no-cache");
+ response.setHeader("Pragma", "no-cache");
+ response.setDateHeader("Expires", -1);
+ %>
+
+ <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+ <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
+ <%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
+ <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
+
+ <%@page contentType="text/html"%>
+ <%@page pageEncoding="UTF-8"%>
+
+
+
+
+
+ <head>
+ <meta http-equiv="Pragma" content="no-cache">
+ <meta http-equiv="expires" content="0">
+ <title><s:message code="label.storeadministration"
+ text="Store administration" />
+ </title>
+
+
+
+
+<style type=text/css>
+#logon {
+ margin: 0px auto;
+ width: 550px
+}
+
+#login-box {
+ width: 333px;
+ height: 352px;
+ padding: 58px 76px 0 76px;
+ color: #ebebeb;
+ font: 12px Arial, Helvetica, sans-serif;
+ background: url('<c:url value="/resources/img/admin/login-box-backg.png" />') no-repeat left top;
+}
+
+#login-box h2 {
+ padding: 0;
+ margin: 0;
+ color: #ebebeb;
+ font: bold 36px "Calibri", Arial;
+ border-bottom: 2px solid;
+ padding-bottom: 0px;
+}
+
+#login-box {
+ margin-left: 30px;
+}
+
+#controls {
+ margin-left: -50px;
+ margin-top: 30px;
+}
+
+
+
+
+</style>
+
+
+
+
+ <link
+ href="<c:url value="/resources/css/bootstrap/css/sm-bootstrap.css" />"
+ rel="stylesheet" />
+ <link href="<c:url value="/resources/css/shopizer-admin.css" />"
+ rel="stylesheet" />
+
+
+ <style type=text/css>
+.sm label {
+ color: #EBEBEB;
+ font-size: 16px;
+}
+
+.sm a {
+ color: #EBEBEB;
+ font-size: 16px;
+}
+
+
+
+
+
+</style>
+
+ <script src="<c:url value="/resources/js/bootstrap/jquery.js" />"></script>
+ <script type="text/javascript" src="<c:url value="/resources/js/jquery-cookie.js"/>"></script>
+ <script src="<c:url value="/resources/js/bootstrap/bootstrap-modal.js" />"></script>
+
+
+
+
+ <script language="javascript">
+
+ function getUserInformation() {
+ // get the form values
+ $('#securityQtn1Select').empty();
+ $('#securityQtn2Select').empty();
+ $('#securityQtn3Select').empty();
+ $('#answer1').val('');
+ $('#answer2').val('');
+ $('#answer3').val('');
+ var userName = $('#username').val();
+ if(!userName){
+ alert("<s:message code="message.username.required" text="User name is required" />");
+ }else{
+ $.ajax({
+ type: 'POST',
+ dataType: "json",
+ url: "<c:url value="/admin/users/resetPassword.html" />",
+ data: "username="+ userName ,
+ success: function(response) {
+ var msg = isc.XMLTools.selectObjects(response, "/response/statusMessage");
+ var status = isc.XMLTools.selectObjects(response, "/response/status");
+ if(status==0 || status ==9999) {
+ $("#getPassword").modal('hide'),
+ $('#getSecurityQtn').modal({
+ backdrop: true
+ })
+
+ var data = isc.XMLTools.selectObjects(response, "/response/data");
+ if(data && data.length>0) {
+
+ $('#question1').text(data[0].question1);
+ $('#question2').text(data[0].question2);
+ $('#question3').text(data[0].question3);
+
+ }
+ } else {
+ if(msg!=null && msg !='') {
+ alert(msg);
+ }
+ }
+
+ },
+ error: function(jqXHR,textStatus,errorThrown) {
+ alert('Error ' + jqXHR + "-" + textStatus + "-" + errorThrown);
+ }
+
+ });
+ }
+ }
+
+
+ function doSecurityQtnSubmit() {
+
+ var answer1 = $('#answer1').val();
+ var answer2 = $('#answer2').val();
+ var answer3 = $('#answer3').val();
+
+ if(!answer1){
+ alert("<s:message code="security.answer.question1.message" text="Please answer to security question 1"/>");
+
+ }else if(!answer2){
+ alert("<s:message code="security.answer.question2.message" text="Please answer to security question 2"/>");
+
+ }else if(!answer3){
+ alert("<s:message code="security.answer.question3.message" text="Please answer to security question 3"/>");
+
+ }else{
+
+ $.ajax({
+ type: 'POST',
+ dataType: "json",
+ url: "<c:url value="/admin/users/resetPasswordSecurityQtn.html" />",
+ data: "answer1="+ answer1+"&answer2="+ answer2+"&answer3="+ answer3,
+ success: function(response) {
+ //console.log("responcesajid "+response);
+ //console.log(response);
+ var msg = isc.XMLTools.selectObjects(response, "/response/statusMessage");
+ var status = isc.XMLTools.selectObjects(response, "/response/status");
+ if(status==0 || status ==9999) {
+ $("#getSecurityQtn").modal('hide')
+ $('#finalWindow').modal({
+ backdrop: true
+ })
+ $("#finaltext").val (msg);
+ var div = document.getElementById('finaltext1');
+ div.innerHTML = msg;
+ var data = isc.XMLTools.selectObjects(response, "/response/data");
+ } else {
+ if(msg!=null && msg !='') {
+ $("#getSecurityQtn").modal('hide')
+ $('#finalWindow').modal({
+ backdrop: true
+ })
+ $("#finaltext").val (msg);
+ var div = document.getElementById('finaltext1');
+ div.innerHTML = msg;
+ }
+ }
+
+ }
+ });
+
+ }
+ }
+
+ $(document)
+ .ready(
+ function() {
+
+ $('#changePassword').click(function() {
+ //$('#getPassword').show();
+ $('#username').val('');
+ $('#getPassword').modal({
+ backdrop: true
+ })
+ })
+
+
+ var username = $.cookie('usernamecookie');
+ if (username != null && username != '') {
+ $('#username').val(username);
+ $('#remember').attr('checked', true);
+ }
+
+
+ $("#formSubmitButton")
+ .click(
+ function() {
+
+
+
+ var hasError = false;
+ $('#username_help').html("");
+ $('#password_help').html("");
+
+
+ if ($('#remember').attr('checked')) {
+ $.cookie('usernamecookie', $(
+ '#username').val(), {
+ expires : 1024,
+ path : '/'
+ });
+ } else {
+ $.cookie('usernamecookie',
+ null, {
+ expires : 1024,
+ path : '/'
+ });
+ }
+ if ($.trim($('#username').val()) == '') {
+ hasError = true;
+ $('#username_help')
+ .html(
+ "<font color='red' size='4'><strong>*</strong></font>");
+ }
+
+ if ($.trim($('#password').val()) == '') {
+ hasError = true;
+ $('#password_help')
+ .html(
+ "<font color='red' size='4'><strong>*</strong></font>");
+ }
+
+ if (!hasError) {
+ $("#logonForm").submit();
+ }
+
+ });
+
+ });
+</script>
+ </head>
+
+ <body>
+
+ <div id="tabbable" class="sm">
+
+ <br />
+ <br />
+
+ <div id=logon>
+
+
+
+
+
+
+
+
+
+ <div class="row">
+ <c:if test="${not empty param.login_error}">
+ <div class="alert alert-error">
+ <s:message code="errors.invalidcredentials"
+ text="Invalid username or password" />
+ </div>
+ </c:if>
+ </div>
+
+
+
+ <div id="login-box">
+
+
+ <div class="row">
+ <div style="float: left; width: 180px;">
+ <p class="lead">
+ <s:message code="button.label.logon" text="Logon" />
+ </p>
+ </div>
+ <div style="float: right;">
+ <img alt="go to www.shopizer.com"
+ src="<c:url value="/resources/img/shopizer_small.png" />">
+ </div>
+ </div>
+
+ <div class="row">
+ <div id="controls">
+
+ <form method="post" id="logonForm" class="form-horizontal" action="<c:url value="/login"/>">
+ <div class="control-group">
+ <label class="control-label" for="inputUser">
+ <s:message code="label.username" text="Username" />
+ </label>
+ <div class="controls">
+ <input type="text" id="username" name="username"
+ placeholder="<s:message code="label.username" text="Username"/>">
+ <span id="username_help" class="help-inline"></span>
+ </div>
+ </div>
+ <div class="control-group">
+ <label class="control-label" for="inputPassword">
+ <s:message code="label.password" text="Password" />
+ </label>
+
+ <div class="controls">
+ <input type="password" id="password" name="password"
+ placeholder="<s:message code="label.password" text="Password"/>">
+ <span id="password_help" class="help-inline"></span>
+ </div>
+ </div>
+ <div class="control-group">
+ <div class="controls">
+ <label class="checkbox">
+ <input type="checkbox" id="remember">
+ <s:message code="label.logonform.rememberusername"
+ text="Remember my user name" />
+ <br/>
+ <a href="#" id="changePassword"><s:message code="label.logonform.forgotpassword" text="Forgot Password"/>?</a>
+ </label>
+ <a href="#" class="btn" id="formSubmitButton"> <s:message
+ code="button.label.logon" text="button.label.submit2" /> </a>
+ </div>
+ </div>
+ </form>
+ </div>
+ </div>
+
+
+
+ <!-- code for reset password-username prompt sajid shajahan -->
+ <div aria-hidden="true" aria-labelledby="myModalLabel" role="dialog" tabindex="-1" class="modal hide fade" id="getPassword" style="display: none;">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal"
+ aria-hidden="true">
+ ×
+ </button>
+ <h3 id="myModalLabel" style="color:#333333;">
+ <s:message code="label.logonform.resetpassword" text="Password reset"/>
+ </h3>
+ </div>
+ <form method="post" id="resetPasswordForm" class="form-horizontal"
+ action="#">
+ <div class="modal-body">
+ <p>
+
+ <div class="control-group">
+ <label class="control-label" for="inputUser" style="color:#333333;">
+ <s:message code="label.username" text="Username" />
+ </label>
+ <div class="controls">
+ <input type="text" id="username" name="username"
+ placeholder="<s:message code="label.username" text="Username"/>">
+
+
+ <span id="username_help" class="help-inline"></span>
+ </div>
+ </div>
+
+
+ </form>
+ </p>
+ </div>
+ <div class="modal-footer">
+ <div class="controls">
+ <input type="button" value="<s:message code="label.generic.next" text="Next" />" onclick="getUserInformation()" class="btn" >
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
+
+
+
+
+ <!-- code for reset password-security question prompt sajid shajahan -->
+ <div aria-hidden="true" aria-labelledby="myModalLabel" role="dialog" tabindex="-1" class="modal hide fade" id="getSecurityQtn" style="display: none;">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal"
+ aria-hidden="true">
+ ×
+ </button>
+ <h3 id="myModalLabel" style="color:#333333;">
+ <s:message code="label.logonform.securityquestion" text="Password reset"/>
+ </h3>
+ </div>
+ <form method="post" id="resetPasswordForm" class="form-horizontal"
+ action="#">
+ <div class="modal-body">
+ <p>
+
+ <div class="control-group">
+
+ <label class="control-label" for="inputUser" style="color:#333333;" id="question1">
+ <s:message code="security.question1" text="" />
+ </label>
+ <div class="controls">
+ <input type="text" id="answer1" name="answer1"
+ placeholder="<s:message code="security.answer.question1.message" text="answer1"/>">
+
+
+ </div>
+
+
+ </div>
+
+ <div class="control-group">
+ <label class="control-label" for="inputUser" style="color:#333333;" id="question2">
+ <s:message code="security.question2" text="" />
+ </label>
+ <div class="controls">
+ <input type="text" id="answer2" name="answer2"
+ placeholder="<s:message code="security.answer.question2.message" text="answer2"/>">
+
+
+ </div>
+ </div>
+
+ <div class="control-group">
+ <label class="control-label" for="inputUser" style="color:#333333;" id="question3">
+ <s:message code="security.question3" text="" />
+ </label>
+ <div class="controls">
+ <input type="text" id="answer3" name="answer3"
+ placeholder="<s:message code="security.answer.question3.message" text="answer3"/>">
+
+
+
+ </div>
+ </div>
+
+ </form>
+ </p>
+ </div>
+ <div class="modal-footer">
+ <div class="controls">
+ <!-- <a href="#" class="btn" id="passwordResetSubmitButton">
+ <s:message code="button.label.submit2" text="Submit" /> </a> -->
+ <input type="button" value="Submit" onclick="doSecurityQtnSubmit()" class="btn" >
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
+
+
+
+ <!-- code for reset password-final window sajid shajahan -->
+ <div aria-hidden="true" aria-labelledby="myModalLabel" role="dialog" tabindex="-1" class="modal hide fade" id="finalWindow" style="display: none;">
+ <!--<div class="modal" id="getPassword" tabindex="-1" role="dialog" class="modal hide fade" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">-->
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal"
+ aria-hidden="true">
+ ×
+ </button>
+ <h3 id="myModalLabel" style="color:#333333;">
+ <s:message code="" text="Shopizer"/>
+ </h3>
+ </div>
+ <form method="post" id="resetPasswordForm" class="form-horizontal"
+ action="#">
+ <div class="modal-body">
+ <p>
+ <h3><center><div id="finaltext1"></div></center></h3>
+ <!-- <div class="control-group">
+
+ <label class="control-label" for="inputUser" style="color:#333333;">
+ <h3><div id="finaltext1"></div></h3>
+ </label>
+ <div class="controls">
+
+ </div>
+
+
+ </div>
+ -->
+
+ </form>
+ </p>
+ </div>
+ <div class="modal-footer">
+ <div class="controls">
+ <button data-dismiss="modal" class="btn">Close</button>
+ </div>
+ </div>
+ </div>
+ </form>
+ </div>
+
+
+
+
+
+ </div>
+ </body>
</html>
\ No newline at end of file
sm-shop/src/main/webapp/WEB-INF/views/admin/unauthorized.jsp 206(+103 -103)
diff --git a/sm-shop/src/main/webapp/WEB-INF/views/admin/unauthorized.jsp b/sm-shop/src/main/webapp/WEB-INF/views/admin/unauthorized.jsp
index 8e0f510..6ae6c50 100644
--- a/sm-shop/src/main/webapp/WEB-INF/views/admin/unauthorized.jsp
+++ b/sm-shop/src/main/webapp/WEB-INF/views/admin/unauthorized.jsp
@@ -1,104 +1,104 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-<html>
-
- <%
- response.setCharacterEncoding("UTF-8");
- response.setHeader("Cache-Control", "no-cache");
- response.setHeader("Pragma", "no-cache");
- response.setDateHeader("Expires", -1);
- %>
-
- <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
- <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
- <%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
- <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
- <%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
-
- <%@page contentType="text/html"%>
- <%@page pageEncoding="UTF-8"%>
-
-
-
-
-
- <head>
- <meta http-equiv="Pragma" content="no-cache">
- <meta http-equiv="expires" content="0">
- <title><s:message code="label.storeadministration"
- text="Store administration" />
- </title>
-
-
-
-
-<style type=text/css>
-#logon {
- margin: 0px auto;
- width: 550px
-}
-
-
-#controls {
- margin-left: -50px;
- margin-top: 30px;
-}
-
-
-
-
-</style>
-
-
-
-
- <link
- href="<c:url value="/resources/css/bootstrap/css/sm-bootstrap.css" />"
- rel="stylesheet" />
- <link
- href="<c:url value="/resources/css/sm-bootstrap-responsive.css" />"
- rel="stylesheet" />
- <link href="<c:url value="/resources/css/shopizer.css" />"
- rel="stylesheet" />
-
-
- <style type=text/css>
-.sm label {
- color: #EBEBEB;
- font-size: 16px;
-}
-
-.sm a {
- color: #EBEBEB;
- font-size: 16px;
-}
-
-
-
-
-
-</style>
-
-
- </head>
-
- <body>
-
- <div id="tabbable" class="sm">
-
- <br />
- <br />
-
- <div id=logon>
-
- <div class="row">
- <h3>
- <s:message code="message.login.duallogin" text="Dual login not authorized on the same browser"/>
-
- </h3>
- </div>
-
- </div>
- </div>
- </body>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+
+<html>
+
+ <%
+ response.setCharacterEncoding("UTF-8");
+ response.setHeader("Cache-Control", "no-cache");
+ response.setHeader("Pragma", "no-cache");
+ response.setDateHeader("Expires", -1);
+ %>
+
+ <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
+ <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
+ <%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
+ <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
+ <%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>
+
+ <%@page contentType="text/html"%>
+ <%@page pageEncoding="UTF-8"%>
+
+
+
+
+
+ <head>
+ <meta http-equiv="Pragma" content="no-cache">
+ <meta http-equiv="expires" content="0">
+ <title><s:message code="label.storeadministration"
+ text="Store administration" />
+ </title>
+
+
+
+
+<style type=text/css>
+#logon {
+ margin: 0px auto;
+ width: 550px
+}
+
+
+#controls {
+ margin-left: -50px;
+ margin-top: 30px;
+}
+
+
+
+
+</style>
+
+
+
+
+ <link
+ href="<c:url value="/resources/css/bootstrap/css/sm-bootstrap.css" />"
+ rel="stylesheet" />
+ <link
+ href="<c:url value="/resources/css/sm-bootstrap-responsive.css" />"
+ rel="stylesheet" />
+ <link href="<c:url value="/resources/css/shopizer.css" />"
+ rel="stylesheet" />
+
+
+ <style type=text/css>
+.sm label {
+ color: #EBEBEB;
+ font-size: 16px;
+}
+
+.sm a {
+ color: #EBEBEB;
+ font-size: 16px;
+}
+
+
+
+
+
+</style>
+
+
+ </head>
+
+ <body>
+
+ <div id="tabbable" class="sm">
+
+ <br />
+ <br />
+
+ <div id=logon>
+
+ <div class="row">
+ <h3>
+ <s:message code="message.login.duallogin" text="Dual login not authorized on the same browser"/>
+
+ </h3>
+ </div>
+
+ </div>
+ </div>
+ </body>
</html>
\ No newline at end of file
diff --git a/sm-shop/src/main/webapp/WEB-INF/web.xml b/sm-shop/src/main/webapp/WEB-INF/web.xml
index 102afe8..64df35f 100644
--- a/sm-shop/src/main/webapp/WEB-INF/web.xml
+++ b/sm-shop/src/main/webapp/WEB-INF/web.xml
@@ -27,8 +27,8 @@
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>
- org.springframework.web.filter.DelegatingFilterProxy
- </filter-class>
+ org.springframework.web.filter.DelegatingFilterProxy
+ </filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
@@ -39,7 +39,5 @@
-
-
</web-app>
\ No newline at end of file
diff --git a/sm-shop/src/test/java/com/salesmanager/test/shop/controller/category/rest/CategoryManagementAPITest.java b/sm-shop/src/test/java/com/salesmanager/test/shop/controller/category/rest/CategoryManagementAPITest.java
index e60fb50..a95f6d3 100644
--- a/sm-shop/src/test/java/com/salesmanager/test/shop/controller/category/rest/CategoryManagementAPITest.java
+++ b/sm-shop/src/test/java/com/salesmanager/test/shop/controller/category/rest/CategoryManagementAPITest.java
@@ -1,284 +1,284 @@
-package com.salesmanager.test.shop.controller.category.rest;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.ObjectWriter;
-import com.salesmanager.shop.model.catalog.category.Category;
-import com.salesmanager.shop.model.catalog.category.CategoryDescription;
-import com.salesmanager.shop.model.catalog.category.PersistableCategory;
-import com.salesmanager.shop.model.catalog.category.ReadableCategory;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.springframework.http.*;
-import org.springframework.security.crypto.codec.Base64;
-import org.springframework.web.client.RestTemplate;
-
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.List;
-
-@Ignore
-public class CategoryManagementAPITest {
-
- private RestTemplate restTemplate;
-
-
- private HttpHeaders getHeader(){
- HttpHeaders headers = new HttpHeaders();
- MediaType mediaType = new MediaType("application", "json", Charset.forName("UTF-8"));
- //MediaType.APPLICATION_JSON //for application/json
- headers.setContentType(mediaType);
- //Basic Authentication
- String authorisation = "admin" + ":" + "password";
- byte[] encodedAuthorisation = Base64.encode(authorisation.getBytes());
- headers.add("Authorization", "Basic " + new String(encodedAuthorisation));
- return headers;
- }
-
- /**
- * Read - GET a category by id
- * @throws Exception
- */
- @Test
- @Ignore
- public void getCategory() throws Exception {
- restTemplate = new RestTemplate();
-
- HttpEntity<String> httpEntity = new HttpEntity<String>(getHeader());
-
- ResponseEntity<ReadableCategory> response = restTemplate.exchange("http://localhost:8080/sm-shop/services/public/DEFAULT/category/100?lang=en", HttpMethod.GET, httpEntity, ReadableCategory.class);
-
- if(response.getStatusCode() != HttpStatus.OK){
- throw new Exception();
- }else{
- System.out.println(response.getBody() + " Category record found.");
- }
- }
-
-
-
- /**
- * Creates - POST a category for a given store
- * @throws Exception
- */
- @Test
- @Ignore
- public void postCategory() throws Exception {
- restTemplate = new RestTemplate();
-
- PersistableCategory newCategory = new PersistableCategory();
- newCategory.setCode("javascript");
- newCategory.setSortOrder(1);
- newCategory.setVisible(true);
-
- Category parent = new Category();
- parent.setId(4L);
-
- newCategory.setParent(parent);
-
- CategoryDescription description = new CategoryDescription();
- description.setLanguage("en");
- description.setName("Javascript");
- description.setFriendlyUrl("javascript");
- description.setTitle("Javascript");
-
- List<CategoryDescription> descriptions = new ArrayList<CategoryDescription>();
- descriptions.add(description);
-
- newCategory.setDescriptions(descriptions);
-
- ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
- String json = writer.writeValueAsString(newCategory);
-
- System.out.println(json);
-
-
- HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
-
- ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/sm-shop/services/private/DEFAULT/category", entity, PersistableCategory.class);
-
- PersistableCategory cat = (PersistableCategory) response.getBody();
- System.out.println("New Category ID : " + cat.getId());
- }
-
-
- @Test
- @Ignore
- public void postComplexCategory() throws Exception {
- restTemplate = new RestTemplate();
-
-
- /** Dining room **/
- PersistableCategory dining = new PersistableCategory();
- dining.setCode("dining room");
- dining.setSortOrder(0);
- dining.setVisible(true);
-
-
- CategoryDescription endescription = new CategoryDescription();
- endescription.setLanguage("en");
- endescription.setName("Dining room");
- endescription.setFriendlyUrl("dining-room");
- endescription.setTitle("Dining room");
-
-
- CategoryDescription frdescription = new CategoryDescription();
- frdescription.setLanguage("fr");
- frdescription.setName("Salle à manger");
- frdescription.setFriendlyUrl("salle-a-manger");
- frdescription.setTitle("Salle à manger");
-
- List<CategoryDescription> descriptions = new ArrayList<CategoryDescription>();
- descriptions.add(endescription);
- descriptions.add(frdescription);
-
- dining.setDescriptions(descriptions);
-
-
- Category diningParent = new Category();
- diningParent.setCode(dining.getCode());
-
- /** armoire **/
- PersistableCategory armoire = new PersistableCategory();
- armoire.setCode("armoire");
- armoire.setSortOrder(1);
- armoire.setVisible(true);
-
-
-
- armoire.setParent(diningParent);
-
- endescription = new CategoryDescription();
- endescription.setLanguage("en");
- endescription.setName("Armoires");
- endescription.setFriendlyUrl("armoires");
- endescription.setTitle("Armoires");
-
- frdescription = new CategoryDescription();
- frdescription.setLanguage("fr");
- frdescription.setName("Armoire");
- frdescription.setFriendlyUrl("armoires");
- frdescription.setTitle("Armoires");
-
- descriptions = new ArrayList<CategoryDescription>();
- descriptions.add(endescription);
- descriptions.add(frdescription);
-
- armoire.setDescriptions(descriptions);
- dining.getChildren().add(armoire);
-
-
- /** benches **/
- PersistableCategory bench = new PersistableCategory();
- bench.setCode("bench");
- bench.setSortOrder(4);
- bench.setVisible(true);
-
-
- bench.setParent(diningParent);
-
- endescription = new CategoryDescription();
- endescription.setLanguage("en");
- endescription.setName("Benches");
- endescription.setFriendlyUrl("benches");
- endescription.setTitle("Benches");
-
- frdescription = new CategoryDescription();
- frdescription.setLanguage("fr");
- frdescription.setName("Bancs");
- frdescription.setFriendlyUrl("bancs");
- frdescription.setTitle("Bancs");
-
- descriptions = new ArrayList<CategoryDescription>();
- descriptions.add(endescription);
- descriptions.add(frdescription);
-
- bench.setDescriptions(descriptions);
- dining.getChildren().add(bench);
-
-
-
- /** Living room **/
- PersistableCategory living = new PersistableCategory();
- living.setCode("livingroom");
- living.setSortOrder(2);
- living.setVisible(true);
-
-
- endescription = new CategoryDescription();
- endescription.setLanguage("en");
- endescription.setName("Living room");
- endescription.setFriendlyUrl("living-room");
- endescription.setTitle("Living room");
-
-
- frdescription = new CategoryDescription();
- frdescription.setLanguage("fr");
- frdescription.setName("Salon");
- frdescription.setFriendlyUrl("salon");
- frdescription.setTitle("Salon");
-
- descriptions = new ArrayList<CategoryDescription>();
- descriptions.add(endescription);
- descriptions.add(frdescription);
-
- living.setDescriptions(descriptions);
-
- /** lounge **/
-
- PersistableCategory lounge = new PersistableCategory();
- lounge.setCode("lounge");
- lounge.setSortOrder(3);
- lounge.setVisible(true);
-
- Category livingParent = (Category)living;
- lounge.setParent(livingParent);
-
- endescription = new CategoryDescription();
- endescription.setLanguage("en");
- endescription.setName("Lounge");
- endescription.setFriendlyUrl("lounge");
- endescription.setTitle("Lounge");
-
- frdescription = new CategoryDescription();
- frdescription.setLanguage("fr");
- frdescription.setName("Divan");
- frdescription.setFriendlyUrl("divan");
- frdescription.setTitle("Divan");
-
- descriptions = new ArrayList<CategoryDescription>();
- descriptions.add(endescription);
- descriptions.add(frdescription);
-
- lounge.setDescriptions(descriptions);
- living.getChildren().add(lounge);
-
-
-
- ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
- String json = writer.writeValueAsString(dining);
-
- System.out.println(json);
-
-
- HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
-
- ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/sm-shop/services/private/DEFAULT/category", entity, PersistableCategory.class);
-
- PersistableCategory cat = (PersistableCategory) response.getBody();
- System.out.println("New Category ID : " + cat.getId());
- }
-
-
- @Test
- @Ignore
- public void deleteCategory() throws Exception {
- restTemplate = new RestTemplate();
-
- HttpEntity<String> httpEntity = new HttpEntity<String>(getHeader());
-
- restTemplate.exchange("http://localhost:8080/sm-shop/services/DEFAULT/category/100", HttpMethod.DELETE, httpEntity, Category.class);
- System.out.println("Category id 100 Deleted.");
- }
-
-
-}
+package com.salesmanager.test.shop.controller.category.rest;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectWriter;
+import com.salesmanager.shop.model.catalog.category.Category;
+import com.salesmanager.shop.model.catalog.category.CategoryDescription;
+import com.salesmanager.shop.model.catalog.category.PersistableCategory;
+import com.salesmanager.shop.model.catalog.category.ReadableCategory;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.springframework.http.*;
+import org.springframework.security.crypto.codec.Base64;
+import org.springframework.web.client.RestTemplate;
+
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.List;
+
+@Ignore
+public class CategoryManagementAPITest {
+
+ private RestTemplate restTemplate;
+
+
+ private HttpHeaders getHeader(){
+ HttpHeaders headers = new HttpHeaders();
+ MediaType mediaType = new MediaType("application", "json", Charset.forName("UTF-8"));
+ //MediaType.APPLICATION_JSON //for application/json
+ headers.setContentType(mediaType);
+ //Basic Authentication
+ String authorisation = "admin" + ":" + "password";
+ byte[] encodedAuthorisation = Base64.encode(authorisation.getBytes());
+ headers.add("Authorization", "Basic " + new String(encodedAuthorisation));
+ return headers;
+ }
+
+ /**
+ * Read - GET a category by id
+ * @throws Exception
+ */
+ @Test
+ @Ignore
+ public void getCategory() throws Exception {
+ restTemplate = new RestTemplate();
+
+ HttpEntity<String> httpEntity = new HttpEntity<String>(getHeader());
+
+ ResponseEntity<ReadableCategory> response = restTemplate.exchange("http://localhost:8080/sm-shop/services/public/DEFAULT/category/100?lang=en", HttpMethod.GET, httpEntity, ReadableCategory.class);
+
+ if(response.getStatusCode() != HttpStatus.OK){
+ throw new Exception();
+ }else{
+ System.out.println(response.getBody() + " Category record found.");
+ }
+ }
+
+
+
+ /**
+ * Creates - POST a category for a given store
+ * @throws Exception
+ */
+ @Test
+ @Ignore
+ public void postCategory() throws Exception {
+ restTemplate = new RestTemplate();
+
+ PersistableCategory newCategory = new PersistableCategory();
+ newCategory.setCode("javascript");
+ newCategory.setSortOrder(1);
+ newCategory.setVisible(true);
+
+ Category parent = new Category();
+ parent.setId(4L);
+
+ newCategory.setParent(parent);
+
+ CategoryDescription description = new CategoryDescription();
+ description.setLanguage("en");
+ description.setName("Javascript");
+ description.setFriendlyUrl("javascript");
+ description.setTitle("Javascript");
+
+ List<CategoryDescription> descriptions = new ArrayList<CategoryDescription>();
+ descriptions.add(description);
+
+ newCategory.setDescriptions(descriptions);
+
+ ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
+ String json = writer.writeValueAsString(newCategory);
+
+ System.out.println(json);
+
+
+ HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
+
+ ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/sm-shop/services/private/DEFAULT/category", entity, PersistableCategory.class);
+
+ PersistableCategory cat = (PersistableCategory) response.getBody();
+ System.out.println("New Category ID : " + cat.getId());
+ }
+
+
+ @Test
+ @Ignore
+ public void postComplexCategory() throws Exception {
+ restTemplate = new RestTemplate();
+
+
+ /** Dining room **/
+ PersistableCategory dining = new PersistableCategory();
+ dining.setCode("dining room");
+ dining.setSortOrder(0);
+ dining.setVisible(true);
+
+
+ CategoryDescription endescription = new CategoryDescription();
+ endescription.setLanguage("en");
+ endescription.setName("Dining room");
+ endescription.setFriendlyUrl("dining-room");
+ endescription.setTitle("Dining room");
+
+
+ CategoryDescription frdescription = new CategoryDescription();
+ frdescription.setLanguage("fr");
+ frdescription.setName("Salle à manger");
+ frdescription.setFriendlyUrl("salle-a-manger");
+ frdescription.setTitle("Salle à manger");
+
+ List<CategoryDescription> descriptions = new ArrayList<CategoryDescription>();
+ descriptions.add(endescription);
+ descriptions.add(frdescription);
+
+ dining.setDescriptions(descriptions);
+
+
+ Category diningParent = new Category();
+ diningParent.setCode(dining.getCode());
+
+ /** armoire **/
+ PersistableCategory armoire = new PersistableCategory();
+ armoire.setCode("armoire");
+ armoire.setSortOrder(1);
+ armoire.setVisible(true);
+
+
+
+ armoire.setParent(diningParent);
+
+ endescription = new CategoryDescription();
+ endescription.setLanguage("en");
+ endescription.setName("Armoires");
+ endescription.setFriendlyUrl("armoires");
+ endescription.setTitle("Armoires");
+
+ frdescription = new CategoryDescription();
+ frdescription.setLanguage("fr");
+ frdescription.setName("Armoire");
+ frdescription.setFriendlyUrl("armoires");
+ frdescription.setTitle("Armoires");
+
+ descriptions = new ArrayList<CategoryDescription>();
+ descriptions.add(endescription);
+ descriptions.add(frdescription);
+
+ armoire.setDescriptions(descriptions);
+ dining.getChildren().add(armoire);
+
+
+ /** benches **/
+ PersistableCategory bench = new PersistableCategory();
+ bench.setCode("bench");
+ bench.setSortOrder(4);
+ bench.setVisible(true);
+
+
+ bench.setParent(diningParent);
+
+ endescription = new CategoryDescription();
+ endescription.setLanguage("en");
+ endescription.setName("Benches");
+ endescription.setFriendlyUrl("benches");
+ endescription.setTitle("Benches");
+
+ frdescription = new CategoryDescription();
+ frdescription.setLanguage("fr");
+ frdescription.setName("Bancs");
+ frdescription.setFriendlyUrl("bancs");
+ frdescription.setTitle("Bancs");
+
+ descriptions = new ArrayList<CategoryDescription>();
+ descriptions.add(endescription);
+ descriptions.add(frdescription);
+
+ bench.setDescriptions(descriptions);
+ dining.getChildren().add(bench);
+
+
+
+ /** Living room **/
+ PersistableCategory living = new PersistableCategory();
+ living.setCode("livingroom");
+ living.setSortOrder(2);
+ living.setVisible(true);
+
+
+ endescription = new CategoryDescription();
+ endescription.setLanguage("en");
+ endescription.setName("Living room");
+ endescription.setFriendlyUrl("living-room");
+ endescription.setTitle("Living room");
+
+
+ frdescription = new CategoryDescription();
+ frdescription.setLanguage("fr");
+ frdescription.setName("Salon");
+ frdescription.setFriendlyUrl("salon");
+ frdescription.setTitle("Salon");
+
+ descriptions = new ArrayList<CategoryDescription>();
+ descriptions.add(endescription);
+ descriptions.add(frdescription);
+
+ living.setDescriptions(descriptions);
+
+ /** lounge **/
+
+ PersistableCategory lounge = new PersistableCategory();
+ lounge.setCode("lounge");
+ lounge.setSortOrder(3);
+ lounge.setVisible(true);
+
+ Category livingParent = (Category)living;
+ lounge.setParent(livingParent);
+
+ endescription = new CategoryDescription();
+ endescription.setLanguage("en");
+ endescription.setName("Lounge");
+ endescription.setFriendlyUrl("lounge");
+ endescription.setTitle("Lounge");
+
+ frdescription = new CategoryDescription();
+ frdescription.setLanguage("fr");
+ frdescription.setName("Divan");
+ frdescription.setFriendlyUrl("divan");
+ frdescription.setTitle("Divan");
+
+ descriptions = new ArrayList<CategoryDescription>();
+ descriptions.add(endescription);
+ descriptions.add(frdescription);
+
+ lounge.setDescriptions(descriptions);
+ living.getChildren().add(lounge);
+
+
+
+ ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
+ String json = writer.writeValueAsString(dining);
+
+ System.out.println(json);
+
+
+ HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
+
+ ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/sm-shop/services/private/DEFAULT/category", entity, PersistableCategory.class);
+
+ PersistableCategory cat = (PersistableCategory) response.getBody();
+ System.out.println("New Category ID : " + cat.getId());
+ }
+
+
+ @Test
+ @Ignore
+ public void deleteCategory() throws Exception {
+ restTemplate = new RestTemplate();
+
+ HttpEntity<String> httpEntity = new HttpEntity<String>(getHeader());
+
+ restTemplate.exchange("http://localhost:8080/sm-shop/services/DEFAULT/category/100", HttpMethod.DELETE, httpEntity, Category.class);
+ System.out.println("Category id 100 Deleted.");
+ }
+
+
+}
diff --git a/sm-shop/src/test/java/com/salesmanager/test/shop/controller/customer/rest/CustomerRESTControllerTest.java b/sm-shop/src/test/java/com/salesmanager/test/shop/controller/customer/rest/CustomerRESTControllerTest.java
index 3e31873..6746a26 100644
--- a/sm-shop/src/test/java/com/salesmanager/test/shop/controller/customer/rest/CustomerRESTControllerTest.java
+++ b/sm-shop/src/test/java/com/salesmanager/test/shop/controller/customer/rest/CustomerRESTControllerTest.java
@@ -1,178 +1,179 @@
-package com.salesmanager.test.shop.controller.customer.rest;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.ObjectWriter;
-import com.salesmanager.shop.model.customer.Address;
-import com.salesmanager.shop.model.customer.Customer;
-import com.salesmanager.shop.model.customer.PersistableCustomer;
-import com.salesmanager.shop.model.customer.ReadableCustomer;
-import com.salesmanager.shop.model.customer.attribute.CustomerOptionDescription;
-import com.salesmanager.shop.model.customer.attribute.CustomerOptionValueDescription;
-import com.salesmanager.shop.model.customer.attribute.PersistableCustomerOption;
-import com.salesmanager.shop.model.customer.attribute.PersistableCustomerOptionValue;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.springframework.http.*;
-import org.springframework.security.crypto.codec.Base64;
-import org.springframework.web.client.RestTemplate;
-
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.List;
-
-@Ignore
-public class CustomerRESTControllerTest {
-
- private RestTemplate restTemplate;
-
- private Long testCustmerID;
-
-
-
- public HttpHeaders getHeader(){
- HttpHeaders headers = new HttpHeaders();
- //headers.setContentType(MediaType.APPLICATION_JSON);
- MediaType mediaType = new MediaType("application", "json", Charset.forName("UTF-8"));
- headers.setContentType(mediaType);
- //Basic Authentication
- String authorisation = "admin" + ":" + "password";
- byte[] encodedAuthorisation = Base64.encode(authorisation.getBytes());
- headers.add("Authorization", "Basic " + new String(encodedAuthorisation));
- return headers;
- }
-
- @Test
- @Ignore
- public void postCustomerOptionValue() throws Exception {
- restTemplate = new RestTemplate();
-
- PersistableCustomerOptionValue optionValue = new PersistableCustomerOptionValue();
- optionValue.setCode("yes");
- optionValue.setOrder(0);
-
- CustomerOptionValueDescription description = new CustomerOptionValueDescription();
- description.setLanguage("en");
- description.setName("Yes");
-
- List<CustomerOptionValueDescription> descriptions = new ArrayList<CustomerOptionValueDescription>();
- descriptions.add(description);
-
- optionValue.setDescriptions(descriptions);
-
- ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
- String json = writer.writeValueAsString(optionValue);
-
- System.out.println(json);
-
-
- HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
-
- ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/sm-shop/services/private/DEFAULT/customer/optionValue", entity, PersistableCustomerOptionValue.class);
-
- PersistableCustomerOptionValue optVal = (PersistableCustomerOptionValue) response.getBody();
- System.out.println("New Option value ID : " + optVal .getId());
-
- }
-
- @Test
- @Ignore
- public void postCustomerOption() throws Exception {
- restTemplate = new RestTemplate();
-
- PersistableCustomerOption option = new PersistableCustomerOption();
- option.setCode("subscribetonewsletter");
- option.setOrder(0);
-
-
- CustomerOptionDescription description = new CustomerOptionDescription();
- description.setLanguage("en");
- description.setName("Subscribe to newsletter?");
-
- List<CustomerOptionDescription> descriptions = new ArrayList<CustomerOptionDescription>();
- descriptions.add(description);
-
- option.setDescriptions(descriptions);
-
- ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
- String json = writer.writeValueAsString(option);
-
- System.out.println(json);
-
-
- HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
-
- ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/sm-shop/services/private/DEFAULT/customer/option", entity, PersistableCustomerOption.class);
-
- PersistableCustomerOption opt = (PersistableCustomerOption) response.getBody();
- System.out.println("New Option ID : " + opt .getId());
-
- }
-
-
- @Test
- @Ignore
- public void getCustomers() throws Exception {
-
-
- //get customers
- restTemplate = new RestTemplate();
-
- HttpEntity<String> httpEntity = new HttpEntity<String>(getHeader());
-
- ResponseEntity<ReadableCustomer[]> response = restTemplate.exchange("http://localhost:8080/sm-shop/services/private/DEFAULT/customer", HttpMethod.GET, httpEntity, ReadableCustomer[].class);
-
- if(response.getStatusCode() != HttpStatus.OK){
- throw new Exception();
- }else{
- System.out.println(response.getBody().length + " Customer records found.");
- }
- }
-
- @Test
- @Ignore
- public void postCustomer() throws Exception {
- restTemplate = new RestTemplate();
-
-
- PersistableCustomer customer = new PersistableCustomer();
- customer.setEmailAddress("carl@csticonsulting.com");
- customer.setGender("M");
- customer.setLanguage("en");
- customer.setEncodedPassword("5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8");
- customer.setUserName("testuser2");
-
- Address address = new Address();
- address.setAddress("123 my street");
- address.setCity("Boucherville");
- address.setPostalCode("H2H 2H2");
- address.setFirstName("Johny");
- address.setLastName("BGood");
- address.setCountry("CA");
- address.setZone("QC");
-
- customer.setBilling(address);
-
- ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
- String json = writer.writeValueAsString(customer);
-
- HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
-
- ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/sm-shop/services/private/DEFAULT/customer", entity, PersistableCustomer.class);
-
- Customer cust = (Customer) response.getBody();
- System.out.println("New Customer ID : " + cust.getId());
- testCustmerID = cust.getId();
- }
-
- @Test
- @Ignore
- public void deleteCustomer() throws Exception {
- restTemplate = new RestTemplate();
-
- HttpEntity<String> httpEntity = new HttpEntity<String>(getHeader());
-
- restTemplate.exchange("http://localhost:8080/sm-shop/services/private/DEFAULT/customer/"+testCustmerID, HttpMethod.DELETE, httpEntity, Customer.class);
- System.out.println("Customer "+testCustmerID+" Deleted.");
- }
-
-}
+package com.salesmanager.test.shop.controller.customer.rest;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectWriter;
+import com.salesmanager.shop.model.customer.Address;
+import com.salesmanager.shop.model.customer.Customer;
+import com.salesmanager.shop.model.customer.PersistableCustomer;
+import com.salesmanager.shop.model.customer.ReadableCustomer;
+import com.salesmanager.shop.model.customer.attribute.CustomerOptionDescription;
+import com.salesmanager.shop.model.customer.attribute.CustomerOptionValueDescription;
+import com.salesmanager.shop.model.customer.attribute.PersistableCustomerOption;
+import com.salesmanager.shop.model.customer.attribute.PersistableCustomerOptionValue;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.springframework.http.*;
+import org.springframework.security.crypto.codec.Base64;
+import org.springframework.web.client.RestTemplate;
+
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.List;
+
+@Ignore
+public class CustomerRESTControllerTest {
+
+ private RestTemplate restTemplate;
+
+ private Long testCustmerID;
+
+
+
+ public HttpHeaders getHeader(){
+ HttpHeaders headers = new HttpHeaders();
+ //headers.setContentType(MediaType.APPLICATION_JSON);
+ MediaType mediaType = new MediaType("application", "json", Charset.forName("UTF-8"));
+ headers.setContentType(mediaType);
+ //Basic Authentication
+ String authorisation = "admin" + ":" + "password";
+ byte[] encodedAuthorisation = Base64.encode(authorisation.getBytes());
+ headers.add("Authorization", "Basic " + new String(encodedAuthorisation));
+ return headers;
+ }
+
+ @Test
+ @Ignore
+ public void postCustomerOptionValue() throws Exception {
+ restTemplate = new RestTemplate();
+
+ PersistableCustomerOptionValue optionValue = new PersistableCustomerOptionValue();
+ optionValue.setCode("yes");
+ optionValue.setOrder(0);
+
+ CustomerOptionValueDescription description = new CustomerOptionValueDescription();
+ description.setLanguage("en");
+ description.setName("Yes");
+
+ List<CustomerOptionValueDescription> descriptions = new ArrayList<CustomerOptionValueDescription>();
+ descriptions.add(description);
+
+ optionValue.setDescriptions(descriptions);
+
+ ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
+ String json = writer.writeValueAsString(optionValue);
+
+ System.out.println(json);
+
+
+ HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
+
+ ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/sm-shop/services/private/DEFAULT/customer/optionValue", entity, PersistableCustomerOptionValue.class);
+
+ PersistableCustomerOptionValue optVal = (PersistableCustomerOptionValue) response.getBody();
+ System.out.println("New Option value ID : " + optVal .getId());
+
+ }
+
+ @Test
+ @Ignore
+ public void postCustomerOption() throws Exception {
+ restTemplate = new RestTemplate();
+
+ PersistableCustomerOption option = new PersistableCustomerOption();
+ option.setCode("subscribetonewsletter");
+ option.setOrder(0);
+
+
+ CustomerOptionDescription description = new CustomerOptionDescription();
+ description.setLanguage("en");
+ description.setName("Subscribe to newsletter?");
+
+ List<CustomerOptionDescription> descriptions = new ArrayList<CustomerOptionDescription>();
+ descriptions.add(description);
+
+ option.setDescriptions(descriptions);
+
+ ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
+ String json = writer.writeValueAsString(option);
+
+ System.out.println(json);
+
+
+ HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
+
+ ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/sm-shop/services/private/DEFAULT/customer/option", entity, PersistableCustomerOption.class);
+
+ PersistableCustomerOption opt = (PersistableCustomerOption) response.getBody();
+ System.out.println("New Option ID : " + opt .getId());
+
+ }
+
+
+ @Test
+ @Ignore
+ public void getCustomers() throws Exception {
+
+
+ //get customers
+ restTemplate = new RestTemplate();
+
+ HttpEntity<String> httpEntity = new HttpEntity<String>(getHeader());
+
+ ResponseEntity<ReadableCustomer[]> response = restTemplate.exchange("http://localhost:8080/sm-shop/services/private/DEFAULT/customer", HttpMethod.GET, httpEntity, ReadableCustomer[].class);
+
+ if(response.getStatusCode() != HttpStatus.OK){
+ throw new Exception();
+ }else{
+ System.out.println(response.getBody().length + " Customer records found.");
+ }
+ }
+
+ @Test
+ @Ignore
+ public void postCustomer() throws Exception {
+ restTemplate = new RestTemplate();
+
+
+ PersistableCustomer customer = new PersistableCustomer();
+ customer.setEmailAddress("carl@csticonsulting.com");
+ customer.setGender("M");
+ customer.setLanguage("en");
+ //customer.setEncodedPassword("5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8");
+ customer.setClearPassword("password");
+ customer.setUserName("testuser");
+
+ Address address = new Address();
+ address.setAddress("123 my street");
+ address.setCity("Boucherville");
+ address.setPostalCode("H2H 2H2");
+ address.setFirstName("Johny");
+ address.setLastName("BGood");
+ address.setCountry("CA");
+ address.setZone("QC");
+
+ customer.setBilling(address);
+
+ ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
+ String json = writer.writeValueAsString(customer);
+
+ HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
+
+ ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/sm-shop/services/private/DEFAULT/customer", entity, PersistableCustomer.class);
+
+ Customer cust = (Customer) response.getBody();
+ System.out.println("New Customer ID : " + cust.getId());
+ testCustmerID = cust.getId();
+ }
+
+ @Test
+ @Ignore
+ public void deleteCustomer() throws Exception {
+ restTemplate = new RestTemplate();
+
+ HttpEntity<String> httpEntity = new HttpEntity<String>(getHeader());
+
+ restTemplate.exchange("http://localhost:8080/sm-shop/services/private/DEFAULT/customer/"+testCustmerID, HttpMethod.DELETE, httpEntity, Customer.class);
+ System.out.println("Customer "+testCustmerID+" Deleted.");
+ }
+
+}
diff --git a/sm-shop/src/test/java/com/salesmanager/test/shop/controller/product/rest/ProductManagementAPITest.java b/sm-shop/src/test/java/com/salesmanager/test/shop/controller/product/rest/ProductManagementAPITest.java
index 1d531c0..98f68cf 100644
--- a/sm-shop/src/test/java/com/salesmanager/test/shop/controller/product/rest/ProductManagementAPITest.java
+++ b/sm-shop/src/test/java/com/salesmanager/test/shop/controller/product/rest/ProductManagementAPITest.java
@@ -1,453 +1,459 @@
-package com.salesmanager.test.shop.controller.product.rest;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.ObjectWriter;
-import com.salesmanager.core.model.catalog.product.attribute.ProductOptionType;
-import com.salesmanager.shop.model.catalog.category.Category;
-import com.salesmanager.shop.model.catalog.manufacturer.Manufacturer;
-import com.salesmanager.shop.model.catalog.manufacturer.ManufacturerDescription;
-import com.salesmanager.shop.model.catalog.manufacturer.PersistableManufacturer;
-import com.salesmanager.shop.model.catalog.product.*;
-import com.salesmanager.shop.model.catalog.product.attribute.PersistableProductOption;
-import com.salesmanager.shop.model.catalog.product.attribute.PersistableProductOptionValue;
-import com.salesmanager.shop.model.catalog.product.attribute.ProductOptionDescription;
-import com.salesmanager.shop.model.catalog.product.attribute.ProductOptionValueDescription;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.springframework.http.*;
-import org.springframework.security.crypto.codec.Base64;
-import org.springframework.web.client.RestTemplate;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.math.BigDecimal;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.List;
-
-
-@Ignore
-public class ProductManagementAPITest {
-
- private RestTemplate restTemplate;
-
- private Long testCategoryID;
-
- private Long testProductID;
-
-
- public HttpHeaders getHeader(){
- HttpHeaders headers = new HttpHeaders();
- MediaType mediaType = new MediaType("application", "json", Charset.forName("UTF-8"));
- //MediaType.APPLICATION_JSON //for application/json
- headers.setContentType(mediaType);
- //Basic Authentication
- String authorisation = "admin" + ":" + "password";
- byte[] encodedAuthorisation = Base64.encode(authorisation.getBytes());
- headers.add("Authorization", "Basic " + new String(encodedAuthorisation));
- return headers;
- }
-
- /**
- * Creates a Manufacturer reference object that can be used when creating
- * a product
- * @throws Exception
- */
- @Test
- @Ignore
- public void createManufacturer() throws Exception {
-
- ManufacturerDescription description = new ManufacturerDescription();
- description.setLanguage("en");
- description.setName("Tag Heuer");
- description.setFriendlyUrl("tag-watches");
- description.setTitle("Tag Heuer");
-
- List<ManufacturerDescription> descriptions = new ArrayList<ManufacturerDescription>();
- descriptions.add(description);
-
- PersistableManufacturer manufacturer = new PersistableManufacturer();
- manufacturer.setOrder(1);
- manufacturer.setDescriptions(descriptions);
-
-
- ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
- String json = writer.writeValueAsString(manufacturer);
-
- System.out.println(json);
-
-/* {
- "descriptions" : [ {
- "name" : "Tag Heuer",
- "description" : null,
- "friendlyUrl" : "tag-watches",
- "keyWords" : null,
- "highlights" : null,
- "metaDescription" : null,
- "title" : "Tag Heuer",
- "language" : "en",
- "id" : 0
- } ],
- "order" : 1,
- "id" : 0
- }*/
-
- restTemplate = new RestTemplate();
-
-
- HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
-
- ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/sm-shop/services/private/DEFAULT/manufacturer", entity, PersistableManufacturer.class);
-
- PersistableManufacturer manuf = (PersistableManufacturer) response.getBody();
- System.out.println("New Manufacturer ID : " + manuf.getId());
-
-
- }
-
- /**
- * Creates a ProductReview
- * requires an existing Customer and an existing Product
- * @throws Exception
- */
- @Test
- @Ignore
- public void createProductReview() throws Exception {
-
- //requires an existing product
- //requires an existing customer
- PersistableProductReview review = new PersistableProductReview();
- review.setCustomerId(1L);
- review.setProductId(1L);
- review.setLanguage("en");
- review.setRating(2D);//rating is on 5
- review.setDescription("Not as good as expected. From what i understood that was supposed to be premium quality but unfortunately i had to return the item after one week... Verry disapointed !");
- review.setDate("2013-06-06");
-
- ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
- String json = writer.writeValueAsString(review);
-
- System.out.println(json);
-
- /**
- * {
- "description" : "Excellent product !",
- "productId" : 1,
- "rating" : 4.5,
- "customerId" : 1,
- "date" : "2013-06-06",
- "language" : "en"
- }
- */
-
-
- restTemplate = new RestTemplate();
-
-
- HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
-
- ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/sm-shop/services/private/DEFAULT/product/review", entity, PersistableProductReview.class);
-
- PersistableProductReview rev = (PersistableProductReview) response.getBody();
- System.out.println("New ProductReview ID : " + rev.getId());
-
-
- }
-
- /**
- * Creates a product option value that can be used to create a product attribute
- * when creating a new product
- * @throws Exception
- */
- @Test
- @Ignore
- public void createOptionValue() throws Exception {
-
- ProductOptionValueDescription description = new ProductOptionValueDescription();
- description.setLanguage("en");
- description.setName("Red");
-
- List<ProductOptionValueDescription> descriptions = new ArrayList<ProductOptionValueDescription>();
- descriptions.add(description);
-
- PersistableProductOptionValue optionValue = new PersistableProductOptionValue();
- optionValue.setOrder(1);
- optionValue.setCode("colorred");
- optionValue.setDescriptions(descriptions);
-
-
- ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
- String json = writer.writeValueAsString(optionValue);
-
- System.out.println(json);
-
- /**
- * {
- "descriptions" : [ {
- "name" : "Red",
- "description" : null,
- "friendlyUrl" : null,
- "keyWords" : null,
- "highlights" : null,
- "metaDescription" : null,
- "title" : null,
- "language" : "en",
- "id" : 0
- } ],
- "order" : 1,
- "code" : "color-red",
- "id" : 0
- }
- */
-
- restTemplate = new RestTemplate();
-
- HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
-
- ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/sm-shop/services/private/DEFAULT/product/optionValue", entity, PersistableProductOptionValue.class);
-
- PersistableProductOptionValue opt = (PersistableProductOptionValue) response.getBody();
- System.out.println("New optionValue ID : " + opt.getId());
-
- }
-
- /**
- * Creates a new ProductOption
- * @throws Exception
- */
- @Test
- @Ignore
- public void createOption() throws Exception {
-
- ProductOptionDescription description = new ProductOptionDescription();
- description.setLanguage("en");
- description.setName("Color");
-
- List<ProductOptionDescription> descriptions = new ArrayList<ProductOptionDescription>();
- descriptions.add(description);
-
- PersistableProductOption option = new PersistableProductOption();
- option.setOrder(1);
- option.setCode("color");
- option.setType(ProductOptionType.Select.name());
- option.setDescriptions(descriptions);
-
-
- ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
- String json = writer.writeValueAsString(option);
-
- System.out.println(json);
-
- /**
- * {
- "descriptions" : [ {
- "name" : "Color",
- "description" : null,
- "friendlyUrl" : null,
- "keyWords" : null,
- "highlights" : null,
- "metaDescription" : null,
- "title" : null,
- "language" : "en",
- "id" : 0
- } ],
- "type" : SELECT,
- "order" : 1,
- "code" : "color",
- "id" : 0
- }
- */
-
- restTemplate = new RestTemplate();
-
- HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
-
- ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/sm-shop/services/private/DEFAULT/product/option", entity, PersistableProductOption.class);
-
- PersistableProductOption opt = (PersistableProductOption) response.getBody();
- System.out.println("New option ID : " + opt.getId());
-
- }
-
-
- @Test
- @Ignore
- public void getProducts() throws Exception {
- restTemplate = new RestTemplate();
-
- HttpEntity<String> httpEntity = new HttpEntity<String>(getHeader());
-
- ResponseEntity<ReadableProduct[]> response = restTemplate.exchange("http://localhost:8080/sm-shop/services/rest/products/DEFAULT/en/"+testCategoryID, HttpMethod.GET, httpEntity, ReadableProduct[].class);
-
- if(response.getStatusCode() != HttpStatus.OK){
- throw new Exception();
- }else{
- System.out.println(response.getBody().length + " Product records found.");
- }
- }
-
- @Test
- @Ignore
- public void putProduct() throws Exception {
- restTemplate = new RestTemplate();
-
- //TODO: Put Product
-
- }
-
- @Test
- @Ignore
- public void postProduct() throws Exception {
- restTemplate = new RestTemplate();
-
-
-
- String code = "abcdef";
-
-
- String categoryCode = "statue";
-
-
-
- Category category = new Category();
- category.setCode(categoryCode);
- List<Category> categories = new ArrayList<Category>();
- categories.add(category);
-
-
- String manufacturer = "temple";
- Manufacturer collection = new Manufacturer();
- collection.setCode(manufacturer);
-
- //core properties
- PersistableProduct product = new PersistableProduct();
- product.setSku(code);
- product.setManufacturer(collection);
- product.setCategories(categories);
-
- product.setSortOrder(0);//set iterator as sort order
- product.setAvailable(true);//force availability
- product.setProductVirtual(false);//force tangible good
- product.setQuantityOrderMinimum(1);//force to 1 minimum when ordering
- product.setProductShipeable(true);//all items are shipeable
-
- /** images **/
- String image = "/Users/carlsamson/Documents/csti/mobilia-exotika/pictures-600-resize/buddha1.jpg";
-
- File imgPath = new File(image);
-
- PersistableImage persistableImage = new PersistableImage();
-
-
- persistableImage.setBytes(this.extractBytes(imgPath));
- persistableImage.setImageName(imgPath.getName());
-
- List<PersistableImage> images = new ArrayList<PersistableImage>();
- images.add(persistableImage);
-
- product.setImages(images);
-
-
-
- product.setProductHeight(new BigDecimal(20));
- product.setProductLength(new BigDecimal(20));
- product.setProductWeight(new BigDecimal(20));
- product.setProductWidth(new BigDecimal(20));
- product.setQuantity(5);
- product.setQuantityOrderMaximum(2);
-
-
- PersistableProductPrice productPrice = new PersistableProductPrice();
- productPrice.setDefaultPrice(true);
-
- productPrice.setOriginalPrice(new BigDecimal(250));
- productPrice.setDiscountedPrice(new BigDecimal(125));
-
- List<PersistableProductPrice> productPriceList = new ArrayList<PersistableProductPrice>();
- productPriceList.add(productPrice);
-
- product.setProductPrices(productPriceList);
-
- //product.setSortOrder(Integer.parseInt(record.get("position")));
-
- List<ProductDescription> descriptions = new ArrayList<ProductDescription>();
-
- //add english description
- ProductDescription description = new ProductDescription();
- description.setLanguage("en");
- description.setTitle("Buddha Head");
- description.setName("Buddha Head");
- description.setDescription("Buddha Head");
- description.setFriendlyUrl("buddha-head");
-
-
- //description.setHighlights(record.get("highlights_en"));
-
- descriptions.add(description);
-
- //add french description
- description = new ProductDescription();
- description.setLanguage("fr");
- description.setTitle("Tête de Buddha");
- description.setName("Tête de Buddha");
- description.setDescription(description.getName());
- description.setFriendlyUrl("tete-de-buddha");
- //
-
- descriptions.add(description);
-
- product.setDescriptions(descriptions);
-
-
- ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
- String json = writer.writeValueAsString(product);
-
- System.out.println(json);
-
-
- HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
-
- //post to create category web service
- ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/sm-shop/services/private/DEFAULT/product", entity, PersistableProduct.class);
-
- PersistableProduct prod = (PersistableProduct) response.getBody();
-
-
-
- System.out.println("---------------------");
-
-
-
-
-
-
- }
-
- @Test
- @Ignore
- public void deleteProduct() throws Exception {
- restTemplate = new RestTemplate();
-
- HttpEntity<String> httpEntity = new HttpEntity<String>(getHeader());
-
- restTemplate.exchange("http://localhost:8080/sm-shop/services/rest/products/DEFAULT/en/"+testCategoryID+"/"+testProductID, HttpMethod.DELETE, httpEntity, ReadableProduct.class);
- System.out.println("Product "+testProductID+" Deleted.");
- }
-
- /** private helper methods **/
- public byte[] extractBytes (File imgPath) throws Exception {
-
- FileInputStream fis = new FileInputStream(imgPath);
-
- BufferedInputStream inputStream = new BufferedInputStream(fis);
- byte[] fileBytes = new byte[(int) imgPath.length()];
- inputStream.read(fileBytes);
- inputStream.close();
-
- return fileBytes;
-
-
- }
-
-}
+package com.salesmanager.test.shop.controller.product.rest;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectWriter;
+import com.salesmanager.core.model.catalog.product.attribute.ProductOptionType;
+import com.salesmanager.shop.model.catalog.category.Category;
+import com.salesmanager.shop.model.catalog.manufacturer.Manufacturer;
+import com.salesmanager.shop.model.catalog.manufacturer.ManufacturerDescription;
+import com.salesmanager.shop.model.catalog.manufacturer.PersistableManufacturer;
+import com.salesmanager.shop.model.catalog.product.*;
+import com.salesmanager.shop.model.catalog.product.attribute.PersistableProductOption;
+import com.salesmanager.shop.model.catalog.product.attribute.PersistableProductOptionValue;
+import com.salesmanager.shop.model.catalog.product.attribute.ProductOptionDescription;
+import com.salesmanager.shop.model.catalog.product.attribute.ProductOptionValueDescription;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.springframework.http.*;
+import org.springframework.security.crypto.codec.Base64;
+import org.springframework.web.client.RestTemplate;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.math.BigDecimal;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.List;
+
+
+@Ignore
+public class ProductManagementAPITest {
+
+ private RestTemplate restTemplate;
+
+ private Long testCategoryID;
+
+ private Long testProductID;
+
+
+ public HttpHeaders getHeader(){
+ HttpHeaders headers = new HttpHeaders();
+ MediaType mediaType = new MediaType("application", "json", Charset.forName("UTF-8"));
+ //MediaType.APPLICATION_JSON //for application/json
+ headers.setContentType(mediaType);
+ //Basic Authentication
+ String authorisation = "admin" + ":" + "password";
+ byte[] encodedAuthorisation = Base64.encode(authorisation.getBytes());
+ headers.add("Authorization", "Basic " + new String(encodedAuthorisation));
+ return headers;
+ }
+
+ /**
+ * Creates a Manufacturer reference object that can be used when creating
+ * a product
+ * @throws Exception
+ */
+ @Test
+ @Ignore
+ public void createManufacturer() throws Exception {
+
+ ManufacturerDescription description = new ManufacturerDescription();
+ description.setLanguage("en");
+ description.setName("Tag Heuer");
+ description.setFriendlyUrl("tag-watches");
+ description.setTitle("Tag Heuer");
+
+ List<ManufacturerDescription> descriptions = new ArrayList<ManufacturerDescription>();
+ descriptions.add(description);
+
+ PersistableManufacturer manufacturer = new PersistableManufacturer();
+ manufacturer.setOrder(1);
+ manufacturer.setDescriptions(descriptions);
+
+
+ ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
+ String json = writer.writeValueAsString(manufacturer);
+
+ System.out.println(json);
+
+/* {
+ "descriptions" : [ {
+ "name" : "Tag Heuer",
+ "description" : null,
+ "friendlyUrl" : "tag-watches",
+ "keyWords" : null,
+ "highlights" : null,
+ "metaDescription" : null,
+ "title" : "Tag Heuer",
+ "language" : "en",
+ "id" : 0
+ } ],
+ "order" : 1,
+ "id" : 0
+ }*/
+
+ restTemplate = new RestTemplate();
+
+
+ HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
+
+ ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/sm-shop/services/private/DEFAULT/manufacturer", entity, PersistableManufacturer.class);
+
+ PersistableManufacturer manuf = (PersistableManufacturer) response.getBody();
+ System.out.println("New Manufacturer ID : " + manuf.getId());
+
+
+ }
+
+ /**
+ * Creates a ProductReview
+ * requires an existing Customer and an existing Product
+ * @throws Exception
+ */
+ @Test
+ @Ignore
+ public void createProductReview() throws Exception {
+
+ //requires an existing product
+ //requires an existing customer
+ PersistableProductReview review = new PersistableProductReview();
+ review.setCustomerId(1L);
+ review.setProductId(1L);
+ review.setLanguage("en");
+ review.setRating(2D);//rating is on 5
+ review.setDescription("Not as good as expected. From what i understood that was supposed to be premium quality but unfortunately i had to return the item after one week... Verry disapointed !");
+ review.setDate("2013-06-06");
+
+ ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
+ String json = writer.writeValueAsString(review);
+
+ System.out.println(json);
+
+ /**
+ * {
+ "description" : "Excellent product !",
+ "productId" : 1,
+ "rating" : 4.5,
+ "customerId" : 1,
+ "date" : "2013-06-06",
+ "language" : "en"
+ }
+ */
+
+
+ restTemplate = new RestTemplate();
+
+
+ HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
+
+ ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/sm-shop/services/private/DEFAULT/product/review", entity, PersistableProductReview.class);
+
+ PersistableProductReview rev = (PersistableProductReview) response.getBody();
+ System.out.println("New ProductReview ID : " + rev.getId());
+
+
+ }
+
+ /**
+ * Creates a product option value that can be used to create a product attribute
+ * when creating a new product
+ * @throws Exception
+ */
+ @Test
+ @Ignore
+ public void createOptionValue() throws Exception {
+
+ ProductOptionValueDescription description = new ProductOptionValueDescription();
+ description.setLanguage("en");
+ description.setName("Red");
+
+ List<ProductOptionValueDescription> descriptions = new ArrayList<ProductOptionValueDescription>();
+ descriptions.add(description);
+
+ PersistableProductOptionValue optionValue = new PersistableProductOptionValue();
+ optionValue.setOrder(1);
+ optionValue.setCode("colorred");
+ optionValue.setDescriptions(descriptions);
+
+
+ ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
+ String json = writer.writeValueAsString(optionValue);
+
+ System.out.println(json);
+
+ /**
+ * {
+ "descriptions" : [ {
+ "name" : "Red",
+ "description" : null,
+ "friendlyUrl" : null,
+ "keyWords" : null,
+ "highlights" : null,
+ "metaDescription" : null,
+ "title" : null,
+ "language" : "en",
+ "id" : 0
+ } ],
+ "order" : 1,
+ "code" : "color-red",
+ "id" : 0
+ }
+ */
+
+ restTemplate = new RestTemplate();
+
+ HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
+
+ ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/sm-shop/services/private/DEFAULT/product/optionValue", entity, PersistableProductOptionValue.class);
+
+ PersistableProductOptionValue opt = (PersistableProductOptionValue) response.getBody();
+ System.out.println("New optionValue ID : " + opt.getId());
+
+ }
+
+ /**
+ * Creates a new ProductOption
+ * @throws Exception
+ */
+ @Test
+ @Ignore
+ public void createOption() throws Exception {
+
+ ProductOptionDescription description = new ProductOptionDescription();
+ description.setLanguage("en");
+ description.setName("Color");
+
+ List<ProductOptionDescription> descriptions = new ArrayList<ProductOptionDescription>();
+ descriptions.add(description);
+
+ PersistableProductOption option = new PersistableProductOption();
+ option.setOrder(1);
+ option.setCode("color");
+ option.setType(ProductOptionType.Select.name());
+ option.setDescriptions(descriptions);
+
+
+ ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
+ String json = writer.writeValueAsString(option);
+
+ System.out.println(json);
+
+ /**
+ * {
+ "descriptions" : [ {
+ "name" : "Color",
+ "description" : null,
+ "friendlyUrl" : null,
+ "keyWords" : null,
+ "highlights" : null,
+ "metaDescription" : null,
+ "title" : null,
+ "language" : "en",
+ "id" : 0
+ } ],
+ "type" : SELECT,
+ "order" : 1,
+ "code" : "color",
+ "id" : 0
+ }
+ */
+
+ restTemplate = new RestTemplate();
+
+ HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
+
+ ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/sm-shop/services/private/DEFAULT/product/option", entity, PersistableProductOption.class);
+
+ PersistableProductOption opt = (PersistableProductOption) response.getBody();
+ System.out.println("New option ID : " + opt.getId());
+
+ }
+
+
+ @Test
+ @Ignore
+ public void getProducts() throws Exception {
+ restTemplate = new RestTemplate();
+
+ HttpEntity<String> httpEntity = new HttpEntity<String>(getHeader());
+
+ ResponseEntity<ReadableProduct[]> response = restTemplate.exchange("http://localhost:8080/sm-shop/services/rest/products/DEFAULT/en/"+testCategoryID, HttpMethod.GET, httpEntity, ReadableProduct[].class);
+
+ if(response.getStatusCode() != HttpStatus.OK){
+ throw new Exception();
+ }else{
+ System.out.println(response.getBody().length + " Product records found.");
+ }
+ }
+
+ @Test
+ @Ignore
+ public void putProduct() throws Exception {
+ restTemplate = new RestTemplate();
+
+ //TODO: Put Product
+
+ }
+
+ @Test
+ @Ignore
+ public void postProduct() throws Exception {
+ restTemplate = new RestTemplate();
+
+ PersistableProduct product = new PersistableProduct();
+
+ String code = "abcdef";
+
+
+ String categoryCode = "ROOT";//root category
+
+
+
+ Category category = new Category();
+ category.setCode(categoryCode);
+ List<Category> categories = new ArrayList<Category>();
+ categories.add(category);
+
+
+ String manufacturer = "temple";
+ Manufacturer collection = new Manufacturer();
+ collection.setCode(manufacturer);
+
+ //core properties
+
+ product.setSku(code);
+
+ //product.setManufacturer(collection); //no manufacturer assigned for now
+ //product.setCategories(categories); //no category assigned for now
+
+ product.setSortOrder(0);//set iterator as sort order
+ product.setAvailable(true);//force availability
+ product.setProductVirtual(false);//force tangible good
+ product.setQuantityOrderMinimum(1);//force to 1 minimum when ordering
+ product.setProductShipeable(true);//all items are shipeable
+
+ /** images **/
+ String image = "/Users/carlsamson/Documents/csti/IMG_4626.jpg";
+ //String image = "C:/personal/em/pictures-misc/IMG_2675.JPG";
+
+ File imgPath = new File(image);
+
+ //PersistableImage persistableImage = new PersistableImage();
+
+
+ //persistableImage.setBytes(this.extractBytes(imgPath));
+ //persistableImage.setImageName(imgPath.getName());
+
+ //List<PersistableImage> images = new ArrayList<PersistableImage>();
+ //images.add(persistableImage);
+
+ //product.setImages(images);
+
+
+
+ product.setProductHeight(new BigDecimal(20));
+ product.setProductLength(new BigDecimal(20));
+ product.setProductWeight(new BigDecimal(20));
+ product.setProductWidth(new BigDecimal(20));
+ product.setQuantity(5);
+ product.setQuantityOrderMaximum(2);
+
+
+ PersistableProductPrice productPrice = new PersistableProductPrice();
+ productPrice.setDefaultPrice(true);
+
+ productPrice.setOriginalPrice(new BigDecimal(250));
+ productPrice.setDiscountedPrice(new BigDecimal(125));
+
+ List<PersistableProductPrice> productPriceList = new ArrayList<PersistableProductPrice>();
+ productPriceList.add(productPrice);
+
+ product.setProductPrices(productPriceList);
+
+ List<ProductDescription> descriptions = new ArrayList<ProductDescription>();
+
+ //add english description
+ ProductDescription description = new ProductDescription();
+ description.setLanguage("en");
+ description.setTitle("Buddha Head");
+ description.setName("Buddha Head");
+ description.setDescription("Buddha Head");
+ description.setFriendlyUrl("buddha-head");
+
+
+ //description.setHighlights(record.get("highlights_en"));
+
+ descriptions.add(description);
+
+ //add french description
+ description = new ProductDescription();
+ description.setLanguage("fr");
+ description.setTitle("Tête de Buddha");
+ description.setName("Tête de Buddha");
+ description.setDescription(description.getName());
+ description.setFriendlyUrl("tete-de-buddha");
+ //
+
+ descriptions.add(description);
+
+ product.setDescriptions(descriptions);
+
+ //RENTAL
+ RentalOwner owner = new RentalOwner();
+ //need to create a customer first
+ owner.setId(1L);
+ product.setOwner(owner);
+
+
+ ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
+ String json = writer.writeValueAsString(product);
+
+ System.out.println(json);
+
+
+ HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
+
+ //post to create category web service
+ ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/api/v1/product", entity, PersistableProduct.class);
+
+ PersistableProduct prod = (PersistableProduct) response.getBody();
+
+
+
+ System.out.println("---------------------");
+
+
+
+
+
+
+ }
+
+ @Test
+ @Ignore
+ public void deleteProduct() throws Exception {
+ restTemplate = new RestTemplate();
+
+ HttpEntity<String> httpEntity = new HttpEntity<String>(getHeader());
+
+ restTemplate.exchange("http://localhost:8080/sm-shop/services/rest/products/DEFAULT/en/"+testCategoryID+"/"+testProductID, HttpMethod.DELETE, httpEntity, ReadableProduct.class);
+ System.out.println("Product "+testProductID+" Deleted.");
+ }
+
+ /** private helper methods **/
+ public byte[] extractBytes (File imgPath) throws Exception {
+
+ FileInputStream fis = new FileInputStream(imgPath);
+
+ BufferedInputStream inputStream = new BufferedInputStream(fis);
+ byte[] fileBytes = new byte[(int) imgPath.length()];
+ inputStream.read(fileBytes);
+ inputStream.close();
+
+ return fileBytes;
+
+
+ }
+
+}
diff --git a/sm-shop/src/test/java/com/salesmanager/test/shop/controller/product/rest/SearchProductAPITest.java b/sm-shop/src/test/java/com/salesmanager/test/shop/controller/product/rest/SearchProductAPITest.java
new file mode 100644
index 0000000..dd5acc5
--- /dev/null
+++ b/sm-shop/src/test/java/com/salesmanager/test/shop/controller/product/rest/SearchProductAPITest.java
@@ -0,0 +1,62 @@
+package com.salesmanager.test.shop.controller.product.rest;
+
+import java.nio.charset.Charset;
+
+import org.junit.Ignore;
+import org.junit.Test;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.crypto.codec.Base64;
+import org.springframework.web.client.RestTemplate;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectWriter;
+import com.salesmanager.shop.model.catalog.SearchProductList;
+import com.salesmanager.shop.model.catalog.SearchProductRequest;
+import com.salesmanager.shop.model.catalog.manufacturer.PersistableManufacturer;
+
+public class SearchProductAPITest {
+
+ private RestTemplate restTemplate;
+
+ public HttpHeaders getHeader(){
+ HttpHeaders headers = new HttpHeaders();
+ MediaType mediaType = new MediaType("application", "json", Charset.forName("UTF-8"));
+ //MediaType.APPLICATION_JSON //for application/json
+ headers.setContentType(mediaType);
+ //Basic Authentication
+ String authorisation = "admin" + ":" + "password";
+ byte[] encodedAuthorisation = Base64.encode(authorisation.getBytes());
+ headers.add("Authorization", "Basic " + new String(encodedAuthorisation));
+ return headers;
+ }
+
+
+ //@Test
+ @Ignore
+ public void testSearch() throws Exception {
+
+ SearchProductRequest searchRequest = new SearchProductRequest();
+ searchRequest.setCount(15);
+ searchRequest.setStart(0);
+ searchRequest.setQuery("test");
+
+ ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
+ String json = writer.writeValueAsString(searchRequest);
+
+ System.out.println(json);
+
+ HttpEntity<String> entity = new HttpEntity<String>(json, getHeader());
+
+ restTemplate = new RestTemplate();
+
+ ResponseEntity response = restTemplate.postForEntity("http://localhost:8080/api/v1/search", entity, SearchProductList.class);
+
+ SearchProductList search = (SearchProductList) response.getBody();
+ System.out.println("Search count : " + search.getProductCount());
+
+ }
+
+}
diff --git a/sm-shop/src/test/java/com/salesmanager/test/shop/controller/store/rest/ContactAPITest.java b/sm-shop/src/test/java/com/salesmanager/test/shop/controller/store/rest/ContactAPITest.java
index c78d128..7468d9c 100644
--- a/sm-shop/src/test/java/com/salesmanager/test/shop/controller/store/rest/ContactAPITest.java
+++ b/sm-shop/src/test/java/com/salesmanager/test/shop/controller/store/rest/ContactAPITest.java
@@ -1,61 +1,61 @@
-package com.salesmanager.test.shop.controller.store.rest;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.ObjectWriter;
-import com.salesmanager.core.business.utils.ajax.AjaxResponse;
-import com.salesmanager.shop.model.shop.ContactForm;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.springframework.http.*;
-import org.springframework.web.client.RestTemplate;
-
-import java.nio.charset.Charset;
-
-@Ignore
-public class ContactAPITest {
-
- private RestTemplate restTemplate;
-
-
- private HttpHeaders getHeader(){
- HttpHeaders headers = new HttpHeaders();
- MediaType mediaType = new MediaType("application", "json", Charset.forName("UTF-8"));
- //MediaType.APPLICATION_JSON //for application/json
- headers.setContentType(mediaType);
- return headers;
- }
-
- /**
- * Contact us email
- * @throws Exception
- */
- @Test
- @Ignore
- public void contactUs() throws Exception {
- restTemplate = new RestTemplate();
-
-
- ContactForm contact = new ContactForm();
- contact.setComment("A few good words for you!");
- contact.setEmail("me@test.com");
- contact.setName("Johny Depp");
- contact.setSubject("Hello ny friend");
-
- ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
- String json = writer.writeValueAsString(contact);
-
- System.out.println(json);
-
- HttpEntity<String> httpEntity = new HttpEntity<String>(json, getHeader());
-
- ResponseEntity<AjaxResponse> response = restTemplate.exchange("http://localhost:8080/sm-shop/services/public/DEFAULT/contact", HttpMethod.POST, httpEntity, AjaxResponse.class);
-
- if(response.getStatusCode() != HttpStatus.OK){
- throw new Exception();
- }else{
- System.out.println(response.getBody() + " Success sending contact");
- }
- }
-
-
-}
+package com.salesmanager.test.shop.controller.store.rest;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectWriter;
+import com.salesmanager.core.business.utils.ajax.AjaxResponse;
+import com.salesmanager.shop.model.shop.ContactForm;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.springframework.http.*;
+import org.springframework.web.client.RestTemplate;
+
+import java.nio.charset.Charset;
+
+@Ignore
+public class ContactAPITest {
+
+ private RestTemplate restTemplate;
+
+
+ private HttpHeaders getHeader(){
+ HttpHeaders headers = new HttpHeaders();
+ MediaType mediaType = new MediaType("application", "json", Charset.forName("UTF-8"));
+ //MediaType.APPLICATION_JSON //for application/json
+ headers.setContentType(mediaType);
+ return headers;
+ }
+
+ /**
+ * Contact us email
+ * @throws Exception
+ */
+ @Test
+ @Ignore
+ public void contactUs() throws Exception {
+ restTemplate = new RestTemplate();
+
+
+ ContactForm contact = new ContactForm();
+ contact.setComment("A few good words for you!");
+ contact.setEmail("me@test.com");
+ contact.setName("Johny Depp");
+ contact.setSubject("Hello ny friend");
+
+ ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
+ String json = writer.writeValueAsString(contact);
+
+ System.out.println(json);
+
+ HttpEntity<String> httpEntity = new HttpEntity<String>(json, getHeader());
+
+ ResponseEntity<AjaxResponse> response = restTemplate.exchange("http://localhost:8080/sm-shop/services/public/DEFAULT/contact", HttpMethod.POST, httpEntity, AjaxResponse.class);
+
+ if(response.getStatusCode() != HttpStatus.OK){
+ throw new Exception();
+ }else{
+ System.out.println(response.getBody() + " Success sending contact");
+ }
+ }
+
+
+}
diff --git a/sm-shop/src/test/java/com/salesmanager/test/shop/controller/system/rest/SystemAPITest.java b/sm-shop/src/test/java/com/salesmanager/test/shop/controller/system/rest/SystemAPITest.java
index 16e1695..d83ddc6 100644
--- a/sm-shop/src/test/java/com/salesmanager/test/shop/controller/system/rest/SystemAPITest.java
+++ b/sm-shop/src/test/java/com/salesmanager/test/shop/controller/system/rest/SystemAPITest.java
@@ -1,75 +1,90 @@
-package com.salesmanager.test.shop.controller.system.rest;
-
-import com.salesmanager.core.business.utils.ajax.AjaxResponse;
-import org.junit.Ignore;
-import org.springframework.http.*;
-import org.springframework.security.crypto.codec.Base64;
-import org.springframework.web.client.RestTemplate;
-
-import java.nio.charset.Charset;
-
-@Ignore
-public class SystemAPITest {
-
- private RestTemplate restTemplate;
-
-
- private HttpHeaders getHeader(){
- HttpHeaders headers = new HttpHeaders();
- MediaType mediaType = new MediaType("application", "json", Charset.forName("UTF-8"));
- //MediaType.APPLICATION_JSON //for application/json
- headers.setContentType(mediaType);
- //Basic Authentication
- String authorisation = "admin" + ":" + "password";
- byte[] encodedAuthorisation = Base64.encode(authorisation.getBytes());
- headers.add("Authorization", "Basic " + new String(encodedAuthorisation));
- return headers;
- }
-
- /**
- * Contact us email
- * @throws Exception
- */
- //@Test
- @Ignore
- public void createIntegrationModule() throws Exception {
- restTemplate = new RestTemplate();
-
- String json =
- /**
- "{"
- + "\"module\":\"PAYMENT\","
- + "\"code\":\"stripe\","
- + "\"type\":\"stripe\","
- + "\"version\":\"1.0\","
- + "\"regions\":[\"US\",\"CA\",\"GB\",\"AU\",\"FI\",\"DK\",\"IE\",\"NO\",\"SE\"],"
- + "\"image\":\"stripe.png\","
- + "\"configuration\":[{\"env\":\"TEST\",\"scheme\":\"https\",\"host\":\"www.stripe.com\",\"port\":\"443\",\"uri\":\"/\"},{\"env\":\"PROD\",\"scheme\":\"https\",\"host\":\"www.stripe.com\",\"port\":\"443\",\"uri\":\"/\"}]"
- +"}";
- **/
-
-
- "{"
- + "\"module\":\"SHIPPING\","
- + "\"code\":\"priceByDistance\","
- + "\"version\":\"1.0\","
- + "\"regions\":[\"*\"]"
- +"}";
-
-
-
- System.out.println(json);
-
- HttpEntity<String> httpEntity = new HttpEntity<String>(json, getHeader());
-
- ResponseEntity<AjaxResponse> response = restTemplate.exchange("http://localhost:8080/sm-shop/services/private/system/module", HttpMethod.POST, httpEntity, AjaxResponse.class);
-
- if(response.getStatusCode() != HttpStatus.OK){
- throw new Exception();
- }else{
- System.out.println(response.getBody() + " Success creating module");
- }
- }
-
-
-}
+package com.salesmanager.test.shop.controller.system.rest;
+
+import com.salesmanager.core.business.utils.ajax.AjaxResponse;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.springframework.http.*;
+import org.springframework.http.converter.FormHttpMessageConverter;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.StringHttpMessageConverter;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.security.crypto.codec.Base64;
+import org.springframework.web.client.RestTemplate;
+
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.List;
+
+@Ignore
+public class SystemAPITest {
+
+ private RestTemplate restTemplate;
+
+
+ private HttpHeaders getHeader(){
+ HttpHeaders headers = new HttpHeaders();
+ headers.setContentType(MediaType.APPLICATION_JSON);//IMPORTANT TO HAVE THIS
+ MediaType mediaType = new MediaType("application", "json", Charset.forName("UTF-8"));
+ //MediaType.APPLICATION_JSON //for application/json
+ headers.setContentType(mediaType);
+ //Basic Authentication
+ String authorisation = "admin" + ":" + "password";
+ byte[] encodedAuthorisation = Base64.encode(authorisation.getBytes());
+ headers.add("Authorization", "Basic " + new String(encodedAuthorisation));
+ return headers;
+ }
+
+ /**
+ * Contact us email
+ * @throws Exception
+ */
+ //@Test
+ @Ignore
+ public void createIntegrationModule() throws Exception {
+ restTemplate = new RestTemplate();
+
+ String json =
+
+ "{"
+ + "\"module\":\"PAYMENT\","
+ + "\"code\":\"braintree\","
+ + "\"type\":\"creditcard\","
+ + "\"version\":\"1.0\","
+ + "\"regions\":[\"US\",\"CA\",\"GB\",\"AU\",\"FI\",\"DK\",\"IE\",\"NO\",\"SE\",\"AL\",\"AD\",\"AT\",\"BY\",\"BE\",\"BG\",\"HY\",\"CY\",\"CZ\",\"FR\",\"GR\",\"IS\",\"IE\",\"IM\",\"IT\",\"PL\",\"LU\",\"CH\",\"RS\",\"SG\",\"MY\",\"HK\",\"NZ\"],"
+ + "\"image\":\"braintree.jpg\","
+ + "\"configuration\":[{\"env\":\"TEST\",\"scheme\":\"https\",\"host\":\"NOT_REQUIRED\",\"port\":\"NOT_REQUIRED\",\"uri\":\"/\"},{\"env\":\"PROD\",\"scheme\":\"https\",\"host\":\"NOT_REQUIRED\",\"port\":\"NOT_REQUIRED\",\"uri\":\"/\"}]"
+ +"}";
+
+
+ /**
+ "{"
+ + "\"module\":\"SHIPPING\","
+ + "\"code\":\"priceByDistance\","
+ + "\"version\":\"1.0\","
+ + "\"regions\":[\"*\"]"
+ +"}";
+ **/
+
+
+ System.out.println(json);
+
+ List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
+ //messageConverters.add(new FormHttpMessageConverter());
+ //messageConverters.add(new StringHttpMessageConverter());
+ messageConverters.add(new MappingJackson2HttpMessageConverter());
+
+ restTemplate.setMessageConverters(messageConverters);
+
+ HttpEntity<String> httpEntity = new HttpEntity<String>(json, getHeader());
+
+ ResponseEntity<AjaxResponse> response = restTemplate.exchange("http://localhost:8080/services/private/system/module", HttpMethod.POST, httpEntity, AjaxResponse.class);
+
+ if(response.getStatusCode() != HttpStatus.OK){
+ throw new Exception();
+ }else{
+ System.out.println(response.getBody() + " Success creating module");
+ }
+ }
+
+
+}